пʼятницю, 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.