Sunday, March 22, 2009

Настройка удобного переключения раскладки клавиатуры для трёх и более языков

Многие пользователи ПК пользуются всего двумя раскладками клавиатуры - для родного и для английского языка. Если Вы привыкли к использованию двух раскладок, то переход на использование трёх или более раскладок может быть очень болезненным: Вы будете случайно попадать не на ту раскладку, писать белиберду и страшно ругаться. Для того, чтобы облегчить себе жизнь с тремя и более раскладками(у меня английская, русская и украинская), я настроил такую схему переключения раскладок: левый Shift + левый Ctrl переключает между первой и второй раскладкой, а правый Shift + правый Ctrl переключает циклически все раскладки. Так как обычно я переключал раскладку левой рукой, то привычная комбинация введением новых раскладок нарушена не была, при этом сохранилась возможность перейти на любую добавленную раскладку.
Основным источником информации для меня стал вот этот сайт. Ниже руководство для нетерпеливых :)
Итак, первым делом скажу, что я не захотел полностью следовать советам с указанного выше сайта, так как предложенный там способ задания конфигурационных файлов предполагал редактирование xorg.conf, а также добавление собственных конфигурационных файлов в папки настроек Xorg. Таким образом, я пошел по пути наименьшего сопротивления и моё решение - "fast and dirty".
В данном руководстве я предполагаю, что переключение раскладок по Shift + Ctrl уже настроено, все раскладки уже добавлены. Начнём с того, что получим текущую настройки XKB:

xkbcomp :0
, где :0 - id вашего X Display (скорее всего он у вас :0). Эта команда создаст файлик server-N.xkb , где N - указанный Вами id. Откройте этот файлик и найдите там описание символов ISO_Next_Group, ISO_Prev_Group, ISO_First_Group и ISO_Last_Group. У меня описания выглядят примерно так:
    interpret ISO_Next_Group+AnyOfOrNone(all) {
virtualModifier= AltGr;
useModMapMods=level1;
action= LockGroup(group=+1);
};
interpret ISO_Prev_Group+AnyOfOrNone(all) {
virtualModifier= AltGr;
useModMapMods=level1;
action= LockGroup(group=-1);
};
interpret ISO_First_Group+AnyOfOrNone(all) {
action= LockGroup(group=1);
};
interpret ISO_Last_Group+AnyOfOrNone(all) {
action= LockGroup(group=2);
};
ISO_Next_Group, ISO_Prev_Group, ISO_First_Group и ISO_Last_Group - это специальные символы, которые как раз и отвечают за переключение раскладок. В варианте указанном выше ISO_Next_Group переключает на следующую раскладку, ISO_Prev_Group - на предыдущую, ISO_First_Group - на первую, а ISO_Last_Group - на вторую. Осталось переназначить клавиши, чтобы они указывали на другие символы. Дифф для трёх раскладок (для четырёх и более - добавятся новые группы):
     key  {         [          Return ] };
- key { [ Control_L, ISO_Prev_Group ] };
+ key {
+ symbols[Group1]= [ Control_L, ISO_Last_Group ],
+ symbols[Group2]= [ Control_L, ISO_First_Group ],
+ symbols[Group3]= [ Control_L, ISO_First_Group ] };
key {
type= "ALPHABETIC",
symbols[Group1]= [ a, A ],
@@ -1262,7 +1265,9 @@ xkb_symbols "pc+us+ru(winkeys):2+ua(wink
};
key {
type= "PC_CONTROL_LEVEL2",
- symbols[Group1]= [ Shift_L, ISO_Prev_Group ]
+ symbols[Group1]= [ Shift_L, ISO_Last_Group ],
+ symbols[Group2]= [ Shift_L, ISO_First_Group ],
+ symbols[Group3]= [ Shift_L, ISO_First_Group ]
};
Т.е, заменим для комбинации клавиши LFSH + LCTL символ ISO_Prev_Group на ISO_First_Group и ISO_Last_Group в зависимости от раскладки.
После того, как Вы отредактировали файл, осталось залить настройки. Делается это так:
xkbcomp file.xkb :0
, где file.xkb - ваш сохранённый файл, а :0 - display id.
Хочу отметить, что при перезагрузке иксов все ваши настройки сбросятся. Т.е., для того, чтобы настройки загружались при старте, их надо добавить в автозагрузку. Минус такого подхода в том, что если обновить X Server, то настройки могут стать несовместимыми и иксы могут зависать. Поэтому я просто добавил шорткат для применения настроек и запускаю его тогда, когда мне нужно.
Еще один важный момент: xkbcomp перезаписывает все настройки. Т.о., если Вы переназначите какие-нибудь клавиши через xmodmap, то Вам нужно будет заново создавать файл настроек, иначе при применении настроек сделанные через xmodmap переназначения пропадут. Удачи с настройкой!

Monday, March 2, 2009

Reia - скриптовый язык для виртуальной машины Erlang`а

Лично я считаю Erlang одним из самых простых яызков программирования, а среди знакомых мне функциональных языков - самым простым. К тому же на Erlang благодаря его направленности на создание конкурентных приложений написано уже множество проектов, таких как Yaws, CouchDB, ejabberd, которые являются для него наилучшей рекламой.
Таким образом, Erlang - функциональный язык с простым и понятным синтаксисом, который нашёл свою нишу, и если вы интересуетесь созданием масштабируемых конкурентных систем - вам стоит выучить его. Однако из-за того, что Erlang - функциональный, его синтаксис и стиль понятен не всем - он слишком отличается от императивных языков(таких как С и подобные) и даже от Ruby/Python, которые включают в себя частицы функционального подхода.
Если Вы столкнулись с такой проблемой - обратите внимание на Reia - скриптовый Ruby/Python like язык для виртуальной машины BEAM(эта виртуальная машина используется также и в Erlang). Язык Reia совместим с Erlang и может использоваться для создания конкурентых приложений, однако используя при этом скриптовый синтаксис. Вот простейший пример:

module Foo
def bar
receive
when msg
["Received ",msg].join().puts()
bar()
pid = Process.spawn(fun {Foo.bar()})
pid ! "Hello"
pid ! "World"
Результат:
Received Hello
Received World
В язык заложено очень много возможностей(как по мне - слишком много :) ): отсылка сообщений процессам и объектам, встроенные регулярные выражения, pattern matching, асинхронные вызовы функции, лямбда функции, а также многое-многое другое. Многое из этого не реализовано(например, циклы), но часть функциональности уже существует и работает, как можно увидеть из примера.

Выводы

  1. Reia - многообещающий ЯП, которому, однако, не хватает разработчиков. Возможно, если реализации будет уделяться больше времени, то этот ЯП станет мостиком, по которому толпы приверженцев императивного подхода ринутся в страну Erlang
  2. Как по мне, синтаксис Reia перегружен. Этот вывод только подкрепляет моё убеждение, что Erlang - отлично спроектирован и очень элегантен

Wednesday, February 25, 2009

app-engine-patch 1.0 is out!

Не далее как 24-го февраля сего года увидела свет новая версия одной незаменимой вещи для разработки под Google AppEngine, а именно app-engine-patch.

Кажется, ничего особенного на этом скриншоте нет - всего лишь Django admin интерфейс. Однако, я не зря запостил этот скриншот - это админка Django запущенная под app-engine-patch! Теперь и под GAE можно получить эту "killer" feature Django. Об остальных нововведениях можно прочитать здесь. Меня особенно радует, что портировано django.contrib.sites, однако пока я не могу заставить django.contrib.sitemaps работать.

P.S. Еще два поинта, на которые я хотел бы указать. Во-первых, планы на будущее - "Native Django support (including Model class)."(с). Во-вторых, появилась некая тулза, которая пытается проверять импорты на правильность(кто сталкивался со страшными ошибками при случайных рекурсивных импортах - поймёт, насколько это хорошо :) )

Tuesday, February 24, 2009

TDD's revenge

Попробовал себя в "рисовании" комиксов. То, что получилось - ниже:

А теперь о серьёзном. Я сейчас собираюсь перевести RSS на feedburner.google.com. Надеюсь, проблем не возникнет и все подписчики просто ничего не почувствуют. Однако, если вы за своим RSS-агрегатором замечали проблемы с обработкой редиректов или неперевариванием feedburner - пишите, будем разбираться :)

Tuesday, February 10, 2009

Знакомьтесь: Geany!

Введение

Я уже писал, что мне очень нравится редактор SciTE и поэтому я его постоянно использую, например, при программировании на Python. Однако в GTK версии есть несколько недостатков:
  • Открытие большого числа вкладок невозможно - не работает прокрутка и multiline
  • Глюки с юникодом - если написать \что-то при редактировании TeX документа, получим несуразные символы. Эти же несуразные неудаляемые символы также иногда появляются в строке поиска
  • Нет нормальной интеграции с shell. В итоге для простейшей проверки конструкции в ipython приходится переключаться на терминал
Естественно, можно было бы подправить это в самом SciTE, но зачем, если всё уже сделано? Представляю вам Geany - простейший редактор с замашками IDE(которые, в принципе, не мешают :) ) основанный на том же движке, что и SciTE - на Scintilla.

На этом скриншоте он уже немного подконфигурирован для моего удобства. Возможности Geany:
  • Подсветка, фолдинг - аналогично SciTE
  • Нормальные табы
  • Поддержка VTE
  • Symbol explorer
  • Плагины(в числе встроенных FileBrowser, SplitWindow и т.д.)
  • Автодополнение по символам(неплохое, но для Python хотелось бы лучше. Geany - Open Source, так что возможно это желание будет реализовано)
  • Автозакрытие тегов
  • Сессии
Более подробно хотелось бы остановится на поддержке VTE. Благодаря ей в Geany есть полноценный терминал! Насколько это удобно можно понять, прочитав следующий раздел.

Конфигурирование

В этом разделе я хочу дать описание моего рабочего окружения в Geany. Оно не блещет уникальностью, но весьма удобно. Конечный внешний вид - на скриншоте выше. По пунктам:
  1. Ставим. Я просто выполнил "emerge -av geany". Думаю, в остальных Linux дистрибутивах его можно поставить сходным же образом. Для Windows пользователей - есть инсталляторы
  2. Убираем Sidebar, дабы сэкономить площадь
  3. Задаем комбинации клавиш для удобного перемещения по табам
  4. Настраиваем терминал - самая интересная часть. Я выбрал себе темную темку и запустил внутри screen - в итоге я могу переключаться между логами сервера, ipython и дополнительными консолями. Для меня терминал в Geany - самый важный инструмент. В нём я работаю с git и hg, в нём я отлаживаю приложение, в нём же я и лажу по файлам("geany file_name" открывает файл в новой вкладке). Таким образом, терминал мне заменяет File Browser, Debugger и VCS Inegration
  5. Настраиваем шрифт, остальные комбинации клавиш и интерфейс по вкусу
У меня в screen не заработала клавиша Backspace, пришлось биндить. Ниже - кусок конфигурационного файла screen (.screenrc), который делает screen юзабльным:
bindkey -d ^@ stuff ^? # пофикс backspace
hardstatus on
hardstatus alwayslastline
hardstatus string "%{Gk}| %-w%{+u}%n %t%{-}%+w |%=(%l) %d/%m %c"
До сих пор нормально не работает скролл на мышке, прокрутка вверх генерит "^[[A". Если у кого-то есть уже решение - поделитесь :) Если разберусь сам - проапдейчу.

Выводы

Geany - отличный редактор, полностью покрывающий мои запросы. На данный момент я использую его для Python разработки и редактирования TeX файлов. Для С++ же я предпочитаю IDE Anjuta, хоть Geany можно использовать и здесь.