пʼятниця, 14 грудня 2012 р.

The show must go on

Давненько не писав, пора виправити. Знадобилося підняти інтернет-магазин, але у веб-технологіях, як виявилося, я чайник. Добре, брат порадив узяти Wordpress, причепити до нього Jigoshop, і десь розмістити. Принагідно поновив український переклад.

Словом, вийшла сяка-така цяцька, яку ще допилювати й допилювати. Зустрічайте магазин кондитерської сировини http://iryska.com.ua. Якщо потекла слинка, познайомлю зі своєю дружиною!

середа, 18 серпня 2010 р.

Кубик Рубика у терміналі

Відірвався від літа на кілька годин щоб побавитися компілятором поза роботою. Ціль — емулятор кубика Рубика у терміналі. Чому в терміналі? Тому що для любителів графіки вже є готовий gnubik.

Отже, тягнемо репозитарій:

$ git clone http://github.com/sakhnik/rubik.git
Cloning into rubik...
remote: Counting objects: 134, done.
remote: Compressing objects: 100% (44/44), done.
remote: Total 134 (delta 89), reused 127 (delta 86)
Receiving objects: 100% (134/134), 20.77 KiB, done.
Resolving deltas: 100% (89/89), done.

Збираємо бінарник і маємо улюблену головоломку:

$ cd rubik
$ ./autogen.sh
$ make
$ ./src/rubik

Підтримуються такі команди (див. main.cc):

КомандаДія
qВийти
#Змішати
#NЗмішати, виконавши N поворотів
uПовернути попередній хід
uNПовернути N попередніх ходів
fПовернути передню грань за годинниковою стрілкою
FПовернути передню грань проти годинникової стрілки
fNПовернути N передню грань за годинниковою стрілкою. N=1 — передня, N=−1 — задня.
FNПовернути N передню грань проти годинникової стрілки
sNПовернути N бічну грань за годинниковою стрілкою. N=1 — ліва, N=−1 — права.
SNПовернути N бічну грань проти годинникової стрілки
tNПовернути N верхню грань за годинниковою стрілкою. N=1 — верхня, N=−1 — нижня.
TNПовернути N верхню грань проти годинникової стрілки
x,y чи zГлянути на куб з іншої сторони

Гм, треба буде цю таблицю включити в саму програму.

пʼятниця, 9 липня 2010 р.

Motorola Milestone

Проба пера

Published with Blogger-droid v1.4.4

пʼятниця, 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 (перевірку правил проектування), і можна буде замовляти.