пʼятниця, 23 квітня 2010 р.

Eclipse + Vim = eclim

З тих пір як перейшов на розробку для Linux, перестав користуватися інтегрованими середовищами розробки. Основними інструментами стали vim, git, grep, BBv2, зрідка gdb. Це все чудово, але іноді відчувалася нестача контекстної підказки під час кодування. Спробував було взяти eclipse, так він не дуже зручний для роботи в chroot-пісочниці, та й велика частина проекту — це скрипти оболонки.

Проте щойно надибав дуже цікавий проект eclim. Назва підказує, що йдеться про поєднання середовища eclipse із текстовим редактором vim. Багатообіцяюче, чи не так? Вони пропонують встановити додаток до vim, запустити спеціальну службу eclimd,… Profit!

Відверто, не обманули. І хоч з’явилися кілька набридливих дрібниць у vim, результат перевершив сподівання.

середа, 21 квітня 2010 р.

Про велосипеди

Мова піде про винахід колеса для кожного окремого воза. Вкотре знадобилася функція, яка б виконувала mkdir -p, тобто рекурсивно створювала директорії по заданому шляху. mkdir(2) справляється тільки тоді, коли всі батьківські директорії вже існують, а нам саме треба створити бракуючі.

Найдоступніші замінники:

  • system ("mkdir -p a/b/c/d")

    Для простої операції створює процес оболонки, а та ще один для mkdir — зажирно.

  • boost::filesystem::create_directories ("a/b/c/d")

    Цей тягне за собою не потрібну ні для чого іншого бібліотеку, жаба душить. Крім того, немає можливості задати права доступу до нових каталогів.

Ретельніший пошук показав, що у світі Unix кожен сам собі пише потрібну приблуду. А раз так, то й я не хотів зостатися осторонь. Нічого в ній особливого немає, тому прошу смакувати (C++):

        
//
// Mkdir.cc
//
//     Created: 21.04.2010
//      Author: A. Sakhnik
//

#include "Mkdir.hh"

#include <fcntl.h>
#include <errno.h>
#include <string>
#include <syslog.h>

using namespace std;

static int mkdir_if_missing (char const* path, mode_t mode)
{
    struct stat buf;
    if (-1 != ::lstat (path, &buf))
    {
        if (S_ISDIR (buf.st_mode))
            return 0;               // The path is a directory, OK
        errno = ENOTDIR;
        return -1;                  // The path exists, and isn't a directory
    }
    if (errno != ENOENT)
        return -1;                  // Something bad happened
    if (-1 == ::mkdir (path, mode))
        return -1;                  // Wasn't able to create the directory
    return 0;                       // We were lucky enough indeed
}

// Create directory recursively
int mkdir_p (char const* path, mode_t mode)
{
    string parents;                 // Partial paths a, a/b, a/b/c etc

    for (const char *next = strchr (path, '/'), *prev = path;
         next;
         prev = next, next = strchr (next + 1, '/'))
    {
        parents.insert (parents.end(), prev, next); // Consider next component
        if (parents.empty())
            continue;    // Omit root directory for absolute path
        if (-1 == mkdir_if_missing (parents.c_str(), mode))
            return -1;
    }
    return mkdir_if_missing (path, mode); // Create final component
}

// vim: set et ts=4 sw=4:

      

пʼятниця, 9 квітня 2010 р.

Годинник-1.0

Нарешті стартовий годинник готовий. Досягнута головна мета — познайомитися з мікроконтролерною технікою, пригадати електроніку. Впаявши деталі на плату, виявив, що схематичних помилок немає, все запрацювало відразу. Але трохи схибив при монтажі, бо деякі деталі мають більший розмір, ніж їх підошва. Довелося “ретельно обробити терпугом”.

До цих пір я ще не пробував виготовити друковану плату самостійно, то дві третіх вартості приладу складає саме вона. Сподіваюся скоро виправити цей технологічний недолік.

Програмування — це найлегша частина проекту. Місця на кристалі багато, то крім обов’язкової частини додав бонус: при увімкненні на дисплеї показується біжучий рядок із надписом “Зелеста”, наскільки це можливо на семисегментному індикаторі. Правда, заставку можна вимкнути в режимі налаштування.

Технічні характеристики приладу:

Напруга живлення6 В
Споживаний струм~200 мА (точно не рахував)
Висота знаків38 мм (1,5")
Кількість знаків5
Точність годинника15 ppm (~1 с/добу)
Стартовий сигналЧерез кожні 30, 60, 120 секунд
Клавіші керуванняДві: “Режим” та “Старт/Вибір”

Корпусу поки немає (а моїми руками й не буде), то розміри рахувати не буду.

А поки прилад готується до можливого завтрашнього бойового хрещення на київському спринті, поділюся намірами. Закортіло зібрати портативну радіостанцію, бо є практична потреба. Але першим кроком стане простий FM передавач. Хочеться мати безпровідні аудіо колонки, щоб можна було повзати по квартирі з лаптопом, не тягаючи за собою дріт.

Наостанок порада для господарів (самого нещодавно осяяло). Якщо треба чекати на завершення тривалої операції, наприклад, компіляції чи збірки пакунку, можна поставити звукове сповіщення:

[~]$ make; canberra-gtk-play --id=complete

Дзенькне так, що не пропустиш (перевірено у Fedora 12). Очевидно, довге заклинання можна перетворити в коротку команду, призначивши alias чи створивши скрипт у ~/bin.

пʼятниця, 19 березня 2010 р.

З поверненням, Fedora

Років зо два тому почали на роботі використовувати Ubuntu, то весь цей час вона була основною оперційною системою на домашньому лаптопі. Зручна, надійна, з багатою бібліотекою прикладних програм. Але тільки побачив Fedora, мене здолала заздрість: пакунки поновлюються частіше, і всі ходові програми на один випуск новіші.

Поставив, і вже два тижні користуюся Fedora 12. Для порівняння ось два зображення одного шматка схеми USBasp в Ubuntu та новій системі:

Нарешті, надійшла пора випускати у світ спроектований стартовий годинник. Вже тиждень потію над схемою та друкованою платою. Це вже четверта плата на моєму рахунку, і цього разу вдалося щось нове: жодного перехідного отвору! Ще треба дещо додати, двічі перевірити, прогнати через DRC (перевірку правил проектування), і можна буде замовляти.

неділя, 10 січня 2010 р.

Синтаксичний розбір із Spirit2

Мабуть, із самого початку для синтаксичного розбору на C++ я використовував boost::spirit. Вірою і правдою він служив аж п’ять років, і от вийшла цілком нова його версія під гордим номером 2. Старий код, звісно, продовжує працювати, якщо трохи підпиляти оголошення простору імен. А от мене здолала цікавість, що ж такого особливого нагородили в новій.

Відверто, відкриття перевершило всі сподівання. Новинка дозволяє писати вражаюче лаконічний код. Тобто, задум автора видно навіть при поверхневому перегляді. Важче вже збагнути, як ця магія працює, і треба бути готовим танцювати навколо із бубном, якщо щось не вдається відразу.

Для прикладу візьмімо клапоть коду розроблюваної версії IPMP2. Треба розібрати отримані із запиту HTTP GET аргументи та заповнювати вектор пар “ключ-значення”. Spirit2 підходить для цього, як лікар прописав. Ось опис граматики:

        
namespace qi = boost::spirit::qi;

// Магічне оголошення граматики
template <typename IterT, typename ParamsT>
struct CgiGram : qi::grammar<IterT, ParamsT()>
{
    // В конструкторі описуємо цю граматику
    // Крім того зазначаємо початкове правило
    CgiGram () : CgiGram::base_type (start)
    {
        using namespace qi;

        start %= parm % '&';  // Починаємо зі списку параметрів,
                              // розділених символом '&'

        parm %=  *chr         // Параметр — це пара ключ-значення,
             >>  '='          // а між ними '='
             >>  *chr
             ;

        chr %= char_('+') [_val = ' ']       // Або це '+' → ' '
            |  '%' >> attr_cast<char>(xchar) // Або символ з ASCII коду
            |  (char_ - char_("=&"))         // Або будь-що, окрім =,&
            ;
    }

    qi::uint_parser<unsigned, 16, 2, 2> xchar;
    qi::rule<IterT, ParamsT()> start;              // Стартове правило
    qi::rule<IterT,                                // Правило для параметра
             typename ParamsT::value_type()> parm;
    qi::rule<IterT, char()> chr;                   // Правило для символа
};

      

Отже, сокира є. А як наварити з неї борщу — це домашнє завдання для допитливих.

четвер, 31 грудня 2009 р.

Підсумок-2009

Дві тисячі дев’ятий спливає, то пора підбити якісь підсумки. Всього, звісно, й не згадаєш:

  • Навчився працювати з ACE та TAO. Власне, останні робочі дні року витратив, щоб перенести сервер SIA нової платформи на ACE. Краще все-таки стояти на чиїхсь плечах, ніж намагатися дотягнутися самотужки.
  • Почав у розробці використовувати автоматизовані тестові сценарії. Ніж самому все перевіряти руками, краще доручу роботу тупому роботу (скрипту) від гріха подалі. І таки справляється! Гора з плечей, коли заходить мова про переробку…
  • Став колупатися в мікроелектроніці. Розпочавши із PIC14, перейшов на AVR, поближче до Atmel та GCC. Хочу взяти курс на ARM9 та навчитися заселяти пінгвінів на нього.
  • Повністю перейшов на VCS git, який підкупив своєю високою швидкістю, зручністю роботи, гнучкістю. Незамінна штука!

Відверто, детальних планів на наступний рік немає. Звісно, якщо не враховувати:

  • Влитися у проект GNOME (необмеженого інтернету у мене до цих пір немає).
  • Побудувати свій пристрій з Андроїдом на борту.

Ну, якось так. До зустрічі в дві тисячі десятому!

четвер, 24 грудня 2009 р.

Стягування файлів через telnet

Пригадався епізод із університетських часів. Дуже хотілося знайти собі якісь хороші п’єски для гітари (MIDI), а доступ з мережі університету був обмежений навчальними сайтами. Крім того, коли я був на молодших курсах, до інтернету була підключена тільки станція HP, на яку можна було зайти через текстовий термінал. Ото справжня Unix!

Так, знайомий ще зі школи старшокурсник підказав дуже цікавий спосіб. Треба було зайти на яку-небудь більш відкриту систему по telnet, знайти й стягнути потрібний файл у ній, закодувати його у ASCII інструментом uuencode і роздрукувати його у термінал командою cat. Таким чином, якщо записати сеанс у якийсь файл, то вже локально можна розкодувати файл інструментом uudecode.

Сеанс мав приблизно такий вигляд:

[~]$ telnet grex.org | tee grex.log
[grex.org:~]$ wget http://cool.site/file.mid
[grex.org:~]$ uuencode file.mid file.mid.uue
begin xxx file.mid.uue
...
end
[grex.org:~]$ logout
[~]$ uudecode grex.log -o file.mid

Процес повільний, клопіткий, але дуже цікавий. “Голь на выдумки хитра”!