суббота, 17 августа 2013 г.

Испанская клавиатура в windows.

    Для тех, кто начал изучать испанский язык, либо тех, кто им пользуется для переписки/работы, нужна возможность ввода особых символов, среди которых есть как гласные с акцентом (á, é, í , ó, ú),  так и другие специфические (ü, ñ, ¡, ¿, Ñ). Нетрудно увидеть, что подавляющее большинство элементов испанского алфавита сходно с элементами английского. Поэтому я написал небольшую утилиту, эмулирующую испанскую раскладку.
    Почему бы не воспользоваться системной? У этого подхода, с моей точки зрения, есть несколько недостатков.
    Во-первых, не все умеют устанавливать раскладки, и для человека, не очень знакомого с компьютерами, это довольно непростая задача. Во-вторых, если компьютеров, за которыми приходится работать, много, то просто нет желания на каждом из них добавлять раскладку. В-третьих (и для меня это главная причина), просто неудобно постоянно переключаться между тремя раскладками (русской, английской и испанской), а это приходится делать довольно часто. В моём же случае, достаточно просто закрыть утилиту двумя кликами мыши и раскладки по-прежнему будет две. 
     Принцип работы прост, утилита запускается двойным кликом мыши и в системном трее (рядом с часами) появляется её значок, который имеет контекстное меню (которое можно вызвать по правому клику мышью на значке). Через это меню программа и закрывается.


    Принцип набора схож с раскладкой в системной Windows. Основная часть клавиш не отличается от английской раскладки, для того, чтобы ввести гласную с акцентом сначала нажимаем без удерживания ' (в русской версии э) и потом гласную.
 ' + a = á
 ' + e = é
 ' + u = ú
 ' + o = ó
 ' + i = í
    Заглавные буквы вводятся по такому же принципу, то есть к примеру, чтобы набрать Á, сначала нажимаем апостроф, потом SHIFT+A:  ' + A = Á.

    С другими символами интереснее, дело в том, что в английской и испанской раскладках ввод некоторых знаков пунктуации различается, например, в испанской обычный вопросительный знак вводится комбинацией Shift + "=", а в английской Shift+"?". Поскольку привык я к английской раскладке, то решил оставить минимум изменений, поэтому лишь символы ü, ñ, ¡, ¿, Ñ вводятся немного иначе. Символ ñ соответствует ";" или "ж", Ñ - комбинации Ctrl+";" (Ctrl + "ж"), ¡ - Ctrl + "-", ¿ - Ctrl + "=", ü - Ctrl + u. Символ же точки с запятой можно набрать комбинацией Ctrl + 0. Отмечу, что здесь Ctrl удерживается перед нажатием последующей клавиши.
ñ = ;
Ñ = Ctrl + ;
¡ = Ctrl + "-",
¿ = Ctrl + "="
ü = Ctrl + "u"

    Лично для меня такая система оказалась гораздо удобнее, чем стандартная раскладка.
    Для тех, кому это интересно, написана утилита на скриптовом AutoIt, установки никакой не требуется, поскольку интерпретатор встроен в исполняемый файл. Проверено в Windows XP и Windows 7 Professional.

вторник, 2 июля 2013 г.

Подсчёт количества строк кода

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

Как известно, помимо пустых и непустых строк, следует разделять физические строки кода и логические (первые могут быть комментарием, вторые отражают количество операторов). Для этой задачи хорошо подходит утилита cloc ("Cout lines of code"), которую кстати можно найти и в портах FreeBSD. Комментарии не учитываются, как и пустые строки, имеется возможность не учитывать копии файлов. Утилита умеет обрабатывать файлы, директории и архивы. Установки никакой не требует и состоит из одного файла, поддерживает большое количество систем и языков. Конкретно под Windows использование заключается в запуске утилиты из командной строки с определенными параметрами.

На примере моего рабочего проекта (программа для мониторинга и прослушивания icecast радиостанций на C#), получилось следующее:

c:\Users\admin\Downloads>cloc-1.58.exe "C:\Users\admin\Docu
ments\Visual Studio 2010\Projects\RegionsMonitoring\RegionsMonitoring"
      28 text files.
      25 unique files.
      24 files ignored.

http://cloc.sourceforge.net v 1.58  T=1.0 s (13.0 files/s, 17430.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
XML                              2             15              0          13979
C#                              10            148            436           2741
MSBuild scripts                  1              0              7            104
-------------------------------------------------------------------------------
SUM:                            13            163            443          16824
-------------------------------------------------------------------------------


Можно обрабатывать только файлы с определённым расширением:

c:\Users\admin\Downloads>cloc-1.58.exe --match-f="\.cs$" "C:\Users\admin\Documen
ts\Visual Studio 2010\Projects\RegionsMonitoring\RegionsMonitoring"
      10 text files.
      10 unique files.
       0 files ignored.

http://cloc.sourceforge.net v 1.58  T=0.5 s (20.0 files/s, 6650.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C#                              10            148            436           2741
-------------------------------------------------------------------------------
SUM:                            10            148            436           2741
-------------------------------------------------------------------------------

Здесь, разумеется, часть кода является сгенерированной самой IDE, для более точного анализа можно исключить из анализа Program.cs:
c:\Users\admin\Downloads>cloc-1.58.exe --match-f="\.cs$" --not-match-f="Program"
 "C:\Users\admin\Documents\Visual Studio 2010\Projects\RegionsMonitoring\Regions
Monitoring"
       9 text files.
       9 unique files.
       0 files ignored.

http://cloc.sourceforge.net v 1.58  T=0.5 s (18.0 files/s, 6606.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C#                               9            147            433           2723
-------------------------------------------------------------------------------
SUM:                             9            147            433           2723
-------------------------------------------------------------------------------

Вот таким образом можно приблизительно оценить объём кода, или выполнить какие-то более сложные манипуляции (обрезать все комментарии, сравнить две версии одного и того же исходника и т.д.)

суббота, 20 апреля 2013 г.

Испанские субтитры и юникод




Для тех, кто изучает испанский язык по фильмам и сериалам, наверное знакома ситуация, когда субтитры доступны в формате ANSI, при этом на системе с русским языком они отображаются некорректно:


Попробовал найти штатный перекодировщик в SubtitleWorkshop и еще нескольких подобных программах, но в итоге решил перевести в нормальный вид самостоятельно, используя только Python. В итоге все прилично:



Собственно, код:

# -*- coding: utf-8 -*-
import os
import codecs
import re

path = os.getcwd()
dirs = os.listdir(path)

srclist = ['ї','б','н','й','Ў','у','ъ']
replist = ['¿','á','í','é','¡','ó','ú']
repldict = dict(zip(srclist,replist))

map(lambda x: unicode(x,'utf-8').encode('utf-8'), replist)

for sfile in dirs:
    if not '.srt' in sfile:
        continue
    with codecs.open(sfile, 'r', 'windows-1251') as f:
        newarray = []
        for line in f:
            newline = line.encode('utf-8')
            for sym in srclist:
                sym = sym.decode('utf-8').encode('utf-8')
                if sym in line.encode('utf-8'):
                    newline = re.sub(sym,replist[srclist.index(sym)].decode('utf-8').encode('utf-8'),newline)
            newarray.append(newline.decode('utf-8'))
        f.close()
    with codecs.open(sfile + '.srt', 'w', 'utf-8') as l:
        l.writelines(newarray)
        l.close()

raw_input("Press Enter to exit"
            
В список srclist добавляются все литералы, требующие замены, а в replist соответствующие им заменяющие литералы. Скрипт ищет в текущей с ним директории все файлы *.srt и обрабатывает их, потом создает новый файл рядом со старым в формате UTF-8. Вот такой велосипед.

вторник, 5 февраля 2013 г.

Обнаружение утечек памяти в Visual C++


На днях обнаружил очень простой и полезный инструмент для обнаружения утечек памяти под windows. Для тех кто работает в Visual Studio будет весьма полезно. Называется система Visual Leak Detector for Visual C++ 2008/2010/2012. Взять можно здесь. Установка простая, после распаковки нужно добавить в студию пути к include и lib директориям софтины. 


После чего в самом исходнике в любом файле (кроме предварительно скомпилированного stdafx.h) нужно сделать инклуд #include <vld.h> и готово. Компилируем debug версию программы, запускаем на отладку и по завершении сеанса отладки прямо в консоли вывода будет примерно следующая информация:



Как видно здесь приводится полный стек вызовов для обнаруженной утечки.