среда, 3 ноября 2010 г.

Моя самая первая встреча с Mercurial

Довелось мне встретится с системой контроля версий Mercurial. Причиной встречи стал мой интерес к языку Google Go. Пошел, значит, к мануалу, как же его поставить на мою Ubuntu. Ну, как водится, поставил prerequisities, потом мне предложили стащить самую свежую версию из репозитория. Этот самый репозиторий, как вы уже догадались, находится на гуглокоде под управлением mercurial. Команда клонирования репозитория выглядит так:
$ hg clone -r release https://go.googlecode.com/hg/ go
При клонировании заметил одну очень недружелюбную для пользователя фичу, как отстутсвие любой нотификации о процессе загрузки изменений по файлам (раньше работал с svn и git, и там такой проблемы не возникало). При небольшом размере репозитария, да еще при хорошей полосе Интернета проблему, наверное, и нельзя заметить. Но мой 2Гбит на этом проекте очень надолго задумался =(.

Вот такое какое-то нехорошее первое впечатление.

понедельник, 1 ноября 2010 г.

Проблемы с локализацией кнопок диалогового окна wx.MessageDialog

Э-э-х, где же ты, кросс-платформенность?

Класс wx.MessageDialog имеет разную реализацию на разных операционных системах. Собственно на операционных системах GNU/Linux этой проблемы вовсе нет, так как это диалоговое окно реализовано средствами wxWidgets, и перевод кнопок осуществляется через стандартный механизм интернационализации wxPython. Совсем по другому обстоят дела на ОС семейства Windows.

wx.MessageDialog на ОС Windows

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

Свет в конце тоннеля

Да, он есть. Выход заключается в написании собственного диалога на базе wx.Dialog. Пример можно посмотреть в wxDemo. Хорошо то, что при замене старого диалога новым не приходится переписывать программный код взаимодействия с ним. Вы также можете использовать методы Show() и ShowModal(), а также идентификаторы кнопок, такие как wx.ID_OK, wx.ID_NO, и т.д.

Совет на будущее (в том числе и себе)

Так, что если ваша программа будет нуждаться в локализации, о wx.MessageDialog советую забыть вообще, и делать свои диалоги на базе wx.Dialog.

Python: как программно переключить раскладку клавиатуры в Windows

Исследовав данный вопрос, я обнаружил, что Python не имеет средств из коробки для решения этой задачи. Соответственно, задача должна решаться для каждой ОС своим путем. Данное решение было найдено мной для ОС Windows XP +.

Панацея - Win API
Для того, чтобы выполнить задачу необходимо установить дополнительную библиотеку pywin32, которая предоставляет доступ к функциям Windows API из Python. Из этой библиотечки нам понадобится модуль win32api.
>>> import win32api
Исследовав его содержимое можно увидеть, что для работы с раскладкой клавиатуры есть несколько функций и одно системное сообщение Windows - WM_INPUTLANGCHANGE:
  • GetKeyboardLayout
  • GetKeyboardLayoutList
  • LoadKeyboardLayout
В данном случае для нас важна именно последняя функция - LoadKeyboardLayout. Данная функция загружает новую раскладку (если она еще не загружена) и предпринимает после этого еще какие-то действия; принимает в качестве аргументов два параметра:
  1. строка с идентификатором раскладки.
  2. действие
Более подробно о их возможных значениях можно почитать в MSDN. Итак, нам важны две вещи:
  1. Получить идентификатор раскладки.
  2. Вторым параметром передать действие переключения на загруженную раскладку.
Первый параметр мы можем с легкостью получить из реестра по пути: HKEY_CURRENT_USER/Keyboard Layout/Preload. Итак, выберем переключение на русский язык. В реестре видим примерно следующее:

Значение записи реестра как раз и будет нужным идентификатором раскладки.
Итак, все, что надо сделать:
>>> import win32api
>>> win32api.LoadKeyboardLayout("00000419",1)

В этом гаджете обнаружена ошибка