Добро пожаловать!

Я Дож, программирование — моё хобби. По мере того, как я осваиваю что-то новое, стараюсь об этом написать пост.
На текущий момент в блоге затронуты следующие темы: vim, free pascal, lisp, forth, m4
Занимаюсь разработкой своего языка под названием DEmbro, подбробней: wiki и svn
Для постов, не связанных с программированием, у меня есть отдельное жж.

декабря 11, 2011

Устанавливаем на планшет Asus Eee Transformer tf101 в дополнение линукс

Недавно я стал счастливым обладателем планшета ASUS Eee Transformer tf101 16gb с док-станцией в комплекте и Android в качестве операционной системы. Мне, как программисту, хочется использовать девайс не только для чтения книг и интернета, но и для программирования. Поэтому я решил установить в дополнение к андроиду линукс.

Первое, что нужно сделать -- получить root-доступ на усройстве. Следует отметить, что это считается взломом, и из-за него может быть отказано в гарантийном обслуживании.

На нижней стороне устройства находится его серийный номер. Если он начинается на B60 или меньше, то в инете можно найти кучу способов для получения root-доступа. Мне же досталась серия B80, для нее единственный известный способ -- использование программы Razorclaw. Программу нужно скачать, установить, запустить, и нажать на единственную в ней кнопку, после чего рут-доступ получен. Возможно, что перед этим потребуется обновить андроид до последней версии (это можно сделать в настройках).

Ок, после того, как рут-доступ получен, можно приступить к установке линукса. Для этого качаем с маркета программу Linux Installer, документацию для нее смотрите здесь. Авторы предупреждают, что неправильное использование программы может привести к порче устройства (если система будет достаточно серьезно повреждена, то восстановить ее не получится, и устройство можно будет выбрасывать).

Итак, запускаем Linux Installer, открываем в меню Setup. Нужно поменять только один параметр: путь к loop-файлу, я его установил в "/data/Linux.loop". На значение по умолчанию выдавался варнинг о том, что путь вроде как находится на съемном диске (несмотря на то, что это не так). По вкусу я еще поменял hostname и domainname на более короткие и приятные.

Возвращаемся из Setup, далее действуем по инструкции, которая выводится вверху экрана рядом с пингвином. А именно: жмем create target loop, format target loop, далее идем в Setup, ставим галку около "Allow write to /sys", возвращаемся, жмем mount loop, жмем install distribution in loop. Начались закачивание и установка линукса, нужно подождать какое-то время. Как только это закончилось, жмем Udpate launcher script, теперь для безопасности жмем Stop env loop, заходим в Setup, снимаем галку у "Allow write to /sys", возвращаемся и жмем mount loop. Ок, линукс готов к использованию.

Теперь нужно установить программу-консоль. У меня клавиатура внешняя (на док-станции) и сильно отличается от того, что обычно бывает на смартфонах, поэтому стандартный ConnectBot не подходит. Зато есть специальный ConnectBot для именно моего планшета. Устанавливаем, запускаем. В левом нижнем углу выбираем тип соединения local, вводим какое-нибудь название для сессии (doj, например), жмем Enter. Сейчас мы находимся в псевдолинукс системе самого андроида, в нем мы мало что можем делать. Набираем linuxchroot, должен запуститься установленный ранее линукс с bash в качестве оболочки.

Устанавливем базовый комплект для программирования, для этого набираем:
apt-get install vim
apt-get install make
apt-get install gcc
apt-get install g++

Ок, теперь у нас есть vim (версии 7.2, т.е. со всеми основными вкусностями вима) и компилятор g++. Можем приступить непосредственно к программированию:
mkdir /root/hello
cd /root/hello
vim hello.cpp

Отмечу на счет вима вот что: на клавиатуре нет клавиши Esc, вместо нее нужно использовать комбинацию Ctrl+C. Набираем минимальную прогу
#include <stdio.h>

int main(int argc, char* argv[]) {
  printf("Hello from Android!\n");
  return 0;
}

Выходим, выполняем
g++ hello.cpp -o hello
./hello

Видим, что прога работает.


Читать дальше......

ноября 23, 2011

Меняем шрифты в vim'е

Недавно по рекомендации Darthman'а решил сменить используемый шрифт. Всегда раньше использовал FixedSys, но попробовать другие стало интересно. В посте я попытался описать как настраивать шрифты в виме.

Если vim запущен в консольном режиме, то отображаемый шрифт полностью зависит от программы-оболочки, реализующей консоль. Поэтому всё, что написано ниже, имеет отношение к gVim'у.

Опция gVim'а, настраивающая шрифт, называется guifont. Если в качестве параметра ей передать звёздочку, то появится диалоговое окошко (проверено под Windows, в других ОС не гарантируется)
:set guifont=*


Этот способ запуска полезен для перебора разных вариантов, но неудобен для настроек (не поместить в vimrc файл, например). Вместо звёздочки можно передать название шрифта с дополнительными опциями. Вот что написано в хелпе о формате дополнительных опций под windows:
        For the Win32 GUI                                       *E244* *E245*
        - takes these options in the font name:
                hXX - height is XX (points, can be floating-point)
                wXX - width is XX (points, can be floating-point)
                b   - bold
                i   - italic
                u   - underline
                s   - strikeout
                cXX - character set XX.  Valid charsets are: ANSI, ARABIC,
                      BALTIC, CHINESEBIG5, DEFAULT, EASTEUROPE, GB2312, GREEK,
                      HANGEUL, HEBREW, JOHAB, MAC, OEM, RUSSIAN, SHIFTJIS,
                      SYMBOL, THAI, TURKISH, VIETNAMESE ANSI and BALTIC.
                      Normally you would use "cDEFAULT".

          Use a ':' to separate the options.
        - A '_' can be used in the place of a space, so you don't need to use
          backslashes to escape the spaces.
        - Examples: >
            :set guifont=courier_new:h12:w5:b:cRUSSIAN
            :set guifont=Andale_Mono:h7.5:w4.5


Вот несколько моих примеров со скриншотами:
set guifont=consolas:h11:cRUSSIAN


set guifont=DejaVu_Sans_Mono:h11:cRUSSIAN


Некий обзор шрифтов для программирования можно почитать в этой статье.

Если не передавать опцию cRUSSIAN, то могут начаться проблемы с отображением русских букв в разных ситуациях. Если же всё же нет возможности передать такую опцию, то ИМХО самым простым способом решения проблемы является изменение кодировки ввода и языка сообщений:
set guifont=consolas:h11
set encoding=utf-8
lan mes en


Читать дальше......

ноября 03, 2011

Vim'у сегодня исполняется ровно 20 лет!

А мы с ним одногодки, оказывается :)


Читать дальше......

октября 25, 2011

Язык разметок на DEmbro

Я пытаюсь написать свой универсальный язык разметок. Использование M4 сопровождается множеством неудоств, в частности, долгой отладкой. Из-за этого прогресс с языком разметок немного встал.

Единый язык разметок удобен тем, что можно писать один текст, и из него генерировать много текстов в различных форматах (html, tex, wiki, simple). В частности, такая возможность мне очень необходима при написании файлов помощи DEmbro — как минимум планируется документация на вики и в REPL режиме.

Недавно я придумал, как этот язык разметок можно организовать на DEmbro. В качестве основы я взял свои идеи по созданию аналога функции printf в DEmbro, и... реализовал всё самое главное в течении нескольких минут (единственная большая функция занимает 8 строк: она тут). Осталось только написать нужный набор команд, но это не составит труда (пример того, что уже начато для googlecode wiki тут).

Опишу идею и её реализацию. Размеченный текст представляет из себя просто обычный текст, в котором иногда встречаются специальные команды, влияющие на отображение этого текста. Почему бы мне не написать команду на DEmbro, которая читает размеченный текст, обычную составляющую просто выводит, а специальные фрагменты выделяет и выполняет их так, как будто это код на DEmbro? Сразу придумался синтаксис: фигурные скобки выделяют в тексте специальные фрагменты. Получается следующее
variable *doing?
: \page *doing? off ;
: {page}
    *doing? on
    begin *doing? @ while
      " {" source-cut str.
      " }" source-cut evaluate
    repeat ;





Команда {page} выделяет в цикле фрагменты исходника, зажатые между фигурными скобками, и выполняет их. Команда \page обрывает этот цикл. Как этим пользоваться: допустим, мы хотим добавить в язык разметок команду b для генерации жирного шрифта в формате HTML. Тогда пишем следующее:
: b " <b>" str. ;
: \b " </b>" str. ;


(Разница слешей в последней команде нелепа, но в DEmbro я больше привык закрывающие команды писать именно с таким наклоном, потому что другой «занят» под деление.)

Теперь можно смело использовать:
{page}
  Это просто текст.
  {b}А это уже жирный текст{\b}
{\page}

(Это программа на DEmbro, которая выведет текст, преобразованный в html-форматированный.)

Если есть желание использовать вместо фигурных скобок другие, легко написать другую page-команду, например:
: [page]
    *doing? on
    begin *doing? @ while
      " [" source-cut str.
      " ]" source-cut evaluate
    repeat ;


При этом каким-либо образом переопределять команды \page, b, \b и другие не нужно: можно смело писать
[page]
  Это просто текст.
  [b]А это уже жирный текст[\b]
[\page]


В зависимости от удобства можно дописать вариант page с любыми ограничителями (не обязательно даже односимвольными).

Между фигурными/квадратными скобками не обязательно писать лишь одну команду, можно сразу несколько. Например,
: i " <i>" str. ;
: \i " </i>" str. ;
: u " <u>" str. ;
: \u " </u>" str. ;
[page]
  Это просто текст.
  [b i u]А это уже жирный курсивный подчёркнутый текст[\u \i \b]
  [b i][u] И это тоже, несмотря на непарность конструкций[\u \i \b]
[\page]


Более того, т.к. в управляющем коде допустимо писать любой DEmbro-код, можно прямо в нём объявлять команды, переменные, вычислять время и т.д.
{page}
  {: _ "  " ; ( Тут мы объявили команду, печатающую пробел)
   : int int->str DOC-GENERATOR << ^ ; ( Тут мы объявили команду int, которая печатает число)}
  Значение таймера на момент генерации страницы:  {timer int}
  Числа от {8 dup int} до {0 dup int}: {
      :noname  swap begin 2dup <= while dup int _ 1- repeat ; execute
  }
{\page}


Последний пример (объявление noname-функции) наталкивает меня на идею компилируемых размеченных текстов. Т.е. сейчас это всё работает только в режиме интерпретации, но, возможно, было бы удобно создавать команды, в которые вкомпилированы генераторы размеченных страниц, зависящие от переданных параметров и окружения.

В итоге я осознал, что больше не буду использовать M4 в своих разработках (по крайней мере в качестве языка разметок), а буду дальше развивать свой язык разметок (или даже макропроцессор) на DEmbro.

Пара слов по поводу кода, который находится сейчас среди модулей DEmbro (ссылки были выше). В нём используется та же идея, что описана тут, только слова разложены по пространствам имён, и сделана возможность сменить команду вывода на свою. В будущем конвертирование из моего формата в необходимый будет происходить как-то так:
HTML " sample.dep" evaluate-file ^
TEX " sample.dep" evaluate-file ^
GOOGLECODE " sample.dep" evaluate-file ^
SIMPLE " sample.dep" evaluate-file ^


Текущий пример для googlecode можно посмотреть тут
sample.dep -> test.wiki -> так это выглядит в итоге


Читать дальше......

октября 16, 2011

Вставка кода с подсветкой в блог при помощи вима

Уже не первый год я вставляю сюда фрагменты кода. Для того, чтобы сгенерировать код с подсветкой, я использую команду :TOhtml вима, которая генерирует html-код с подсветкой текущего файла или выделенного фрагмента. Код html появляется в отдельном окне, содержит теги head и body, содержит теги br, которые здесь в блоггере не нужны, содержит кучу лишних переносов строк.

Поэтому создание кода с подсветкой занимало у меня некоторое время: сгенерировать, выполнить команду для удаления тегов br, удалить ненужные переносы строк, выделить фрагмент html-кода без тегов head, body, скопировать, закрыть окно, и, наконец, вставить html в нужное место.

Сегодня мне это окончательно надоело, и я автоматизировал этот процесс, сведя всё к одной кнопке.




Читать дальше......

Пространства имён в DEmbro

Недавно в DEmbro появилась конструкция, которую я называл «короткое пространство имён», и я решил написать о пространствах имён в DEmbro и словарях вообще.


Читать дальше......

октября 13, 2011

Условные переходы

Сессия сдана, пришло время продолжить разработки.

Как я уже писал раньше, я пишу транслятор ассемблера. Только что пройден исторический этап: транслятор начал поддерживать инструкции условных переходов. Ура!

Вот пример цикла:


:asm-noname PREFIX
  *auto-integers? on
    mov eax 555
    mov ebx 111
  @> LOOP
    sub eax 2
    sub ebx 1
    jnz @@ LOOP
    mov d[ *out disp ] eax
    ret
  all-resolve
\PREFIX asm-noname; execute


Технические детали: при помощи :asm-noname ... asm-noname; execute код на асме транслируется и сразу запускается. Блок PREFIX ... \PREFIX указывает на то, что мы будем использовать префиксную запись инструкций (т.е. инструкции перед операндами). Вызов *auto-integers? on делает так, что целые числа автоматически считаются операндами команд. (Без этой опции после чисел 555, 111, 2, 1 нужно бы было просто вызывать команду imm. Это полезный режим, если мы хотим операнды вычислять, например, в этом режиме можно писать  mov eax 64 1024 * imm, если не хочется в уме перемножать 64 и 1024. Кроме того, код может зависеть от чего-нибудь внешнего: например, тут mov eax timer imm заносится состояние таймера в момент трансляции, операнд в явном виде не указан.)

Теперь по коду. Сперва в соответствующие регистры кладётся 555 и 111. Далее, создаётся метка с именем LOOP. После этого в цикле из eax вычитается 2, из ebx вычитается 1 до тех пор, пока ebx не обнулится. То, что останется от eax, переносится в *out — глобальную переменную DEmbro, которую нужно определить выше, например, так:

variable *out


Но так делать вовсе необязательно, вместо *out может быть любой указатель. Как нетрудно догадаться, в *out будет занесено 333, далее с переменной можно работать из кода на DEmbro, или из следующей ассемблерной вставки. Таким образом ассемблер может обмениваться данными с DEmbro. Планируется более детальный механизм взаимодействия: из ассемблера можно будет получать доступ к стекам и другим структурам DEmbro-машины.

Команда all-resolve разрешает все метки. Дело в том, что на метку могут быть ссылки выше метки, ниже метки, или одновременно и так, и так. Нет возможности сразу это предугадать, поэтому метки и ссылки собираются в две таблицы, а в конце кода командой all-resolve ссылкам ставятся в соответствие метки и нужные адреса проставляются. Из-за этой муторности условные переходы и были написаны самыми последними среди прочих инструкций. Теперь, я надеюсь, мне осталось только перебить таблицы из документации к ia-32 в свой транслятор.

Сейчас транслятор поддерживает уже 84 инструкции. Подробнее о том, как я делал этот транслятор и о том, как сделать свой транслятор, напоминаю, планируется большой цикл статей.


Читать дальше......

Постоянные читатели

Обо мне

Моя фотография
Мой e-mail: vitek_03(at)mail(dot)ru