Темы выпуска: автоматическая генерация функции UPSERT в PostgreSQL, почему при работе с деньгами нужно использовать рациональные числа, настройка всплывающих сообщений в Claws Mail и не только. Предыдущие выпуски мини заметок: пятнадцатый , четырнадцатый , тринадцатый , двенадцатый .
1. Русская раскладка в Microsoft Windows 2000
В честь попыток вспомнить WinAPI я тут игрался под VirtualBox c Windows 2000. Оказывается, чтобы под Win2k включить русскую раскладку, нужно зайти в Control Panel, открыть Regional Options, в списке Language settings for the system поставить галочку Cyrillic. Винда запросит установочный диск. После выполнения этих шагов в настройках клавиатуры можно будет выбрать русскую раскладку.
2. Сборка минимального exe-шника с помощью MinGW
Тут основная проблема состоит в том, что при компиляции кода на Си добавляется вызов процедуры __main и, похоже, нет флага, позволяющего отключить это поведение. В результате приходится делать как-то так:
$ $MINGW/cc1 -DUNICODE test.c -o /tmp/test0.s
$ cat /tmp/test0.s | grep -v ___main > /tmp/test.s
$ /usr/i586-mingw32msvc/bin/as /tmp/test.s -o /tmp/test.o
$ $MINGW/collect2 /tmp/test.o -luser32 -lkernel32 -s -o test.exe
Транслируем код на Си в ассемблерный код, grep-ом выпиливаем вызов ___main, затем компилируем ассемблерный код и линкуем все хозяйство в исполняемый файл.
3. Как декомпилировать beam в код на Erlang?
Знаете ли вы, что если эрланговый модуль был собран с флагом debug_info, то можно полностью восстановить его исходный код за исключением разве что комментариев?
Рассмотрим такой модуль:
— export ( [ test_func / 1 ] ) .
% test comment
test_func ( Name ) ->
«Hello, » ++ Name ++ «!» .
Скомпилируем его с флагом debug_info:
А теперь получим AST кода , используя только beam:
{ok,{test,[{abstract_code,{raw_abstract_v1,[{attribute,1,file,{«test.erl»,1}},{attribute,1,module,test},{attribute,3,export,[{test_func,1}]},{function,6,test_func,1,[{clause,6,[{var,6,’Name’}],[],[{op,7,’++’,{string,7,»Hello, «},{op,7,’++’,{var,7,’Name’},{string,7,»!»}}}]}]},{eof,8}]}}]}}
При желании не представляет большого труда написать программу, получающую исходный код из этого AST. Но, к счастью, за нас уже все написано:
2> beam_lib:chunks(«test.beam», [abstract_code]), ok.
ok
3> Src = erl_prettypr:format(erl_syntax:form_list(Abs)).
«-module(test).nn-export([test_func/1]).nntest_func(Name) -> «Hello»» ++ Name ++ «»!»».nn»»
4> file:write_file(«»test_src.erl»»Src).
ok
Если теперь посмотреть test_src.erlвы обнаружите