Архив за ‘Кодинг’ категория

Как же правильно рисовать иероглифы?

Март 19th, 2011

Я решил следовать современным тенденциям HTML5 и прикрутил к сайту http://kanji.xskernel.org/ возможность рисовать иероглифы.
Вернее, рисовать-то могу их только я, а вот остальные могут посмотреть, как правильно следует соблюдать порядок черт при изображении конкретного символа.
Конечно, сейчас выглядит всё достаточно схематически, но уже заметный прогресс налицо. Тем не менее, это на порядок лучше, чем рисовать к каждому иероглифу GIF-файл. В среднем, на аккуратную отрисовку одного подобного иероглифа уходит где-то от двух до пяти минут.

Итак, знакомимся. Перед вами один из иероглифов, обладающий достаточно большим количеством черт, который я специально подобрал для демонстрации.
Иероглиф записывается как 電, имеет только одно онное чтение デン [den], кунных чтений не имеет. При использовании в качестве корня слова означает молнию, электричество. Ключом к этому иероглифу служит другой иероглиф 雨, означающий дождь. Собственно, по нему его и можно найти в словаре иероглифов на сайте.

Ну а черты рисуются в следующем порядке (ЖЖ не позволяет вставлять iframe):

Что же касается браузеров, то Google Chrome, Konqueror, Mozilla Firefox и Opera, вроде, грамотно отрисовывают всё. Насчёт Internet Explorer — не знаю, у меня на trial-венде в виртуалке стоит только восьмая версия (и обновляться пока нельзя), а восьмёрка тег <canvas> не умеетЪ. Microsoft, как всегда, «идёт в ногу с технологиями», ну да ладно, хрен с ними. Если вы фанат Internet Explorer и не обновились до девятой версии — то, видать, не судьба.

Продолжаю развивать проектик.

Май 22nd, 2010

Собственно, как и было сказано ранее, я для упрощения изучения японского языка сделал такой вот сайтец — http://kanji.xskernel.org/. И обещал обновить его структуру. Сегодня залил свежий движок на пропатченную базу. Теперь осталось выпилить из базы лишние таблицы, которые уже не играют никакой роли. Наконец-то заработал словарь, который по мере изучения мною языка потихоньку пополняется новыми словами. Идею, предложенную товарищем stalkerg я постарался воплотить по-максимуму. А именно: сделал возможным поиск слова не только по кандзи, но и по фонетической составляющей (то есть, можно вписать слово каной либо ромадзи, при этом добавлена ещё одна фича: если вы не знаете, является гласный звук долгим или коротким, то словарь выдаст вам оба результата, если все гласные звуки будут введены как короткие).
Соответственно, раньше движок задумывался как запоминалка канзди, теперь же он всё больше и больше становится полноценным словарём, поэтому возможна трансляция как из японского в русский, так и из русского в японский. Единственное, что меня пока смущает, — это дополнения к слову. Их, скорее, следует переделать (вернее группировать), и я уже примерно представляю как. Но это позже. Сейчас меня больше беспокоит отсутствие админки, ввиду чего данные мне приходится пока по-прежнему вбивать специально написанными консольными скриптами.
Также в самом движке добавил задел на поддержку не только СУБД MySQL, но и СУБД Firebird. Если будет время — обязательно продолжу развитие движка в этом направлении. В общем, планов море, а времени и сил — чуть.
Опять же, если есть какие замечания/пожелания по поводу сайта, прошу писать отзывы.
И, напоследок. В процессе написания движка сайта (а пишется он на PERL), мне пришлось решить ряд задач, о которых могут выйти вполне интересные статьи. Если аудитории интересно — то я могу потихоньку выкладывать тут упрощённые кусочки движка с объяснением, как это работает. Заодно и блог оживёт, пожалуй.

五十音:片仮名、平仮名、ローマ字

Март 30th, 2010

Написал небольшую игрушку для интерактивного выучивания таблицы годзю:он (五十音) на JavaScript.

Сама по себе она напоминает игрушку на память: собирать пары совпадающих ячеек до тех пор, пока все пары не будут собраны. Идея состоит в том, что в качестве пары выступают слоги из разных слоговых азбук. Вернее, в разном представлении. Доступны следующие ассоциации пар:

  • катакана — хирагана (片仮名 — 平仮名);
  • катакана — ромадзи (片仮名 — ローマ字);
  • хирагана — ромадзи (平仮名 — ローマ字)
  • катакана — поливанов (片仮名 — キリル文字)
  • хирагана — поливанов (平仮名 — キリル文字)

То есть, например, для пары «катакана-хирагана» слоги «a, i, u, e, o» будут иметь ассоциации «ア <-> あ», «イ — い», «ウ — う», «エ — え», «オ — お».
Играть можно как в простом режиме (easy), так и в сложном (hard). В первом случае все ячейки со слогами открыты. Во втором случае — скрыты, то есть если слоги в ячейках не будут совпадать, содержимое ячеек будет скрываться, а открытыми будут оставаться только уже найденные пары.
Также можно выбирать перечень разучиваемых слогов (ставить галочки напротив определённого слогового ряда). Если много галочек ставить лень — можно воспользоваться предустановками, среди которых есть:

  • выбор всех доступных слогов;
  • сброс всех доступных слогов;
  • выбор только слогов таблицы годзю:он;
  • выбор только слогов, которы были получены путём озвончения — нигори (濁り) — или оглушения — ханнигори (半に濁り ?).

Ссылка на игрушку здесь (распространяется по лицензии GPLv2):
http://kanji.xskernel.org/?target=gojuon.

Приятного времяпрепровождения! Если есть замечания, исправления, предложения или пожелания — пишите :) .

Типа соцопрос :)

Март 10th, 2010

Интересно, с какой вероятностью вы можете с первого раза определить местоположение и характер косяка в коде :) ? По моему опыту получается где-то больше 70% в своём коде, больше 40% в чужом.

VSFTPD — такой ли секьюрный?

Январь 26th, 2010

Сегодня разочаровался в моём любимом Very Secure FTP Daemon.
Произошло это, когда мне нужно было реализовать что-то вроде RandomAccessFile, работающего по FTP. И когда я дошёл до seek-операций, обнаружил, что vsftpd некорректно отрабатывает пару команд REST + STOR. А именно, открывает файл всегда в режиме O_APPEND, о чём с горестью сообщает manpage:
» Читать дальше: VSFTPD — такой ли секьюрный?

For fun.

Ноябрь 20th, 2009

Совсем недавно приходилось решать интересную задачу по Unix:
Фактически нужно было разработать демон simple-telnetd на языке Perl, позволяющий удалённо запускать некоторое ограниченное подмножество команд и выводить пользователю результат их выполнения.

  • simple-telnetd может запускать только разрешенные программы, которые перечислены в файле /etc/simple-telnetd.conf. Демон должен перечитывать этот файл и обновлять список разрешенных программ после поступления сигнала SIGHUP;
  • Запускаемые программы могут иметь параметры командной строки, но simple-telnetd не должен поддерживать интерактивного взаимодействия пользователя с запускаемыми программами;
  • Демон не обязан обрабатывать спец символы: ^C, ^D, и т.д.
  • В качестве параметра командной строки simple-telnetd может передаваться параметр timeout — максимальное время выполнения одной команды;
  • Желательно чтобы демон мог прослушивать не только tcp сокеты, но и локальные (например /tmp/simple-telnetd);

В конце-концов, скрипт всё же не пригодился, поэтому, чтобы компенсировать потраченное на него время, выкладываю его тут — вдруг, кому пригодится. Забрать его можно по этой ссылке.
simple-telnetd.tar.gz
Если кому-то помогло, пишите, не стесняйтесь, буду рад :) .

Поскольку я писал этот демон с особым энтузиазмом, не обошлось без фич, которых нет в исходном задании: написал init.d-скрипт для службы, который успешно был протестирован в openSUSE Linux, оформил perldoc и manpages, сделал возможность интерактивной авторизации, ну и другая мелочёвка (уже даже и не помню какая) вдовесок.

Вопрос по OpenOffice.org

Ноябрь 15th, 2009

Кто-нибудь знает, есть ли в OpenOffice.org Base что-нибудь вроде «Мастера подстановок» из MS Access?
Ибо фича удобная, и воспользоваться ей очень хотелось бы.
Я смог решить пока проблему через формы, но хотелось бы обойтись без них.
Есть идеи?

Об опасности исключений

Ноябрь 12th, 2009

Об опасностях, таящихся в мороженом корме коде, генерирующем исключения.
Исключения в C++ достаточно опасны, именно поэтому я стараюсь их не использовать.
Давайте разберёмся вот с этим кодом:
» Читать дальше: Об опасности исключений

Вопрос знатокам СУБД Firebird.

Октябрь 29th, 2009

Есть СУБД FireBird версии 2.0.x.
Есть таблица, в которой одним из полей хранится битовая карта дней недели.
Задача: проверить, входит ли день недели (номер 1-7) в битовую карту.
Я понимаю, что в СУБД FireBird 2.1.x были введены операции BIT_xx, но использовать пока приходится только FireBird 2.0.x.
Вот моё решение (отмечу, что MATCH=NULL тождественно всем дням недели, установленным в 1):

SET TERM ^ ;
 
-- Validate week day match
--   param:   _MASK - week day mask
--   param:   _VALUE - day of month (1-7)
--   return:  _RESULT - match result: match type or NULL if no match
CREATE OR ALTER PROCEDURE FN_SCHEDULED_WEEKDAY_MATCH (
    "_MASK" INTEGER,
    "_VALUE" INTEGER
)
RETURNS (
    "_RESULT" INTEGER )
AS
    DECLARE VARIABLE "_TEST" INTEGER;
BEGIN
    IF ("_MASK" IS NOT NULL) THEN
        BEGIN
            -- Binary functions are available only in FB 2.1, need to make workaround
            "_MASK" = "_MASK" + 128; -- For comparisons
 
            IF (("_VALUE" = 1) AND ((("_MASK"-1)/2) = ("_MASK"/2))) THEN -- Monday
                "_RESULT" = 1;
            ELSE IF (("_VALUE" = 2) AND ((("_MASK"-2)/4) = ("_MASK"/4))) THEN -- Tuesday
                "_RESULT" = 1;
            ELSE IF (("_VALUE" = 3) AND ((("_MASK"-4)/8) = ("_MASK"/8))) THEN -- Wednesday
                "_RESULT" = 1;
            ELSE IF (("_VALUE" = 4) AND ((("_MASK"-8)/16) = ("_MASK"/16))) THEN -- Thursday
                "_RESULT" = 1;
            ELSE IF (("_VALUE" = 5) AND ((("_MASK"-16)/32) = ("_MASK"/32))) THEN -- Friday
                "_RESULT" = 1;
            ELSE IF (("_VALUE" = 6) AND ((("_MASK"-32)/64) = ("_MASK"/64))) THEN -- Saturday
                "_RESULT" = 1;
            ELSE IF (("_VALUE" = 7) AND ((("_MASK"-64)/128) = ("_MASK"/128))) THEN -- Sunday
                "_RESULT" = 1;
        END
    ELSE
        "_RESULT" = 0;
 
    -- Suspend for select
    SUSPEND;
END^
 
SET TERM ; ^

Есть предложения лучше?

Буэээээ…

Октябрь 1st, 2009

Что вы можете сказать об этом сайте?
Сайт «Замени Гудок» от Мегафона

Дополнительный вопрос: вам когда-нибудь приходилось пользоваться этим чудо-сайтом?

Я не поленился и специально стянул вот такую плашку:
» Читать дальше: Буэээээ…