пятница, 24 декабря 2010 г.

Установка, удаление службы Windows из кода .NET приложения

В приложении нужно определить public классы, унаследованные от System.ServiceProcess.ServiceBase и System.Configuration.Install.Installer. Для наследника ServiceInstaller нужно указать атрибут [RunInstaller(true)]. Эти классы описывают службу. Установка и удаление выполняется статическими методами класса System.Configuration.Install.ManagedInstallerClass. О ManagedInstallerClass в MSDN написано только то, что это класс для внутренних нужно .NET Framework и он не предназначен для непосредственного вызова из кода пользователя. Пример использования этого класса можно найти в реализации утилит, которые поставляются вместе с .NET Framework.

Полный пример кода:

суббота, 18 декабря 2010 г.

Создание тестового SSL сертификата, настройка HttpListener

Основан на How To: Walkthrough Using HttpListener as an SSL Simple Server

Я раньше не работал с SSL. И когда в одном проекте возникла необходимость использовать  SSL, я обнаружил, что нет простого объяснения того, как можно создать SSL сертификат. Результатом поиска стала эта статья. Она основана на англоязычном варианте и расширена информацией полученной из собственного опыта.

среда, 27 октября 2010 г.

Сравнение кириллицы в SQLite без учета регистра

У SQLite есть одна особенность. Сравнение строк без учета регистра, функции изменения регистра работают только для ASCII-символов. Это особенность может принести немало хлопот, если нужно строить запросы с использованием, например, кириллицы.

Например, если в колонке str сохранены значения “VaLuE”, “value”, то запрос SELECT * FROM tab WHERE str LIKE “value” вернет две строки. LIKE по-умолчанию не чувствителен к регистру. Если в базе данных сохранены значения “ЗнАчЕнИе” и “значение”, то такой же запрос вернет только одну строку.

Для решения подобных задач SQLite предоставляет механизм переопределения встроенных функций и правил сравнения в пользовательском коде. Ниже пример кода на Python, который выполняет переопределение:

среда, 20 октября 2010 г.

Изменился формат вывода bytea в PostgreSQL 9.0

После перехода на PostgreSQL 9, в одном из приложений, в разработке которого я учавствую, начала возникать ошибка при получении и десериализации данных, которые хранятся в базе данных в поле типа byte. В приложении используется библиотека Npgsql.

Причиной возникновения ошибки стало изменение формата вывода данных типа bytea. До версии PostgreSQL 9 форматом вывода по умолчанию был escape. Начиная с версии PostgreSQL 9 форматом вывода по умолчанию стал hex. Библиотека Npgsql этих изменений еще не учитывает.

Я нашел два способа решения этой проблемы. Первый, это изменение параметра bytea_output в конфигурационном файле postgresql.conf. Нужно убрать комментарий и установить значение escape. Второй способ, это в клиентском коде преобразовать массив из hex-формата в обычный массив байт. Что из себя представляет hex-формат можно прочитать здесь. Вот быстро набросанный код, который получает исходный массив байт:


  1. using (var reader = command.ExecuteReader())
  2. {
  3.   reader.Read();
  4.   data2 = (byte[])reader[0];
  5.  
  6.   byte[] data3 = new byte[(data2.Length - 1) / 2];
  7.   for (int i = 0; i < data3.Length; ++i)
  8.   {
  9.     var hi = byte.Parse(((char)data2[(i + 1) * 2 - 1]).ToString(), NumberStyles.AllowHexSpecifier);
  10.     var lo = byte.Parse(((char)data2[(i + 1) * 2]).ToString(), NumberStyles.AllowHexSpecifier);
  11.     data3[i] = (byte)((hi << 4) | (lo & 0x0F));
  12.   }
  13. }

Скорее всего есть более цивилизованные способы, но я их пока не нашел. :)

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

Ресурс с статьями и примерами исходных кодов

На stackoverflow.com нашел ссылку на интересный ресурс Programming tutorials and source code examples. Наверное, у каждого программиста есть набор собственных шаблонов, готовых решений. На java2s.com собрано большое количество примеров на разных языках программирования. Начиная c примеров работы с памятью в C и заканчивая шаблонами HTML+CSS.

пятница, 30 июля 2010 г.

Python. Масштабирование изображений

С целью изучения Python-а слелал поделку для изменения размеров фотографий в пакетном режиме.

Для работы с изображениями я использовал библиотеку PIL. В Ubuntu эта библиотека предустановлена. В Windows нужно устанавливать самостоятельно. Я использую Python версии 2.7 под Windows. PIL для работы с Python 2.7 можно скачать с effbot.org.

Вот код сценария:

# Resize image

# Command line:
# python imgresize.py -d <directory> -p <percentage>

import os, sys
from PIL import Image

directory_ = sys.argv[sys.argv.index("-d") + 1]
percentage_ = int(sys.argv[sys.argv.index("-p") + 1])

filenames_ = os.listdir(directory_)

for filename_ in filenames_[:]:
    path_ = directory_ + "\\" + filename_
    if not os.path.isfile(path_):
        continue
    try:
        image_ = Image.open(path_)
        size_ = (image_.size[0] * percentage_ / 100, image_.size[1] * percentage_ / 100)
        if percentage_ < 100:
            image_ = image_.resize(size_, Image.ANTIALIAS)
        else:
            image_ = image_.resize(size_, Image.NEAREST)
        image_.save(directory_ + "\\r_" + filename_)
        print path_, "=>", "r_" + filename_, " OK "
    except:
        print path_, "\n", sys.exc_info()
    
print "Finish" 

Параметры командной строки описаны в начале сценария. Сценарий принимает два обязательных параметра: -d – путь, -p – новый размер изображения в процентах. Пример вызова:

python imgresize.py –d «C:\Photos» –p 50

В результате выполнения сценария в каталоге «C:\Photos» будут созданы файлы с именами начинающимися на «r_» и размером в два раза меньше исходных.

среда, 7 июля 2010 г.

Ошибка UnicodeDecodeError в демонстрационном проекте Django

Буквально на днях начал осваивать web-программирование. Начать решил с Python 2.7 + Django 1.1. После прочтения введений восхищению не было предела (оно есть до сих пор). 


Трудность появилась при попытке реализовать пример, приведенный в введении в Django. Трудность заключалась в том, что при попытке загрузить войти в административную часть новосозданного сайта, все отображалось не так как в примерах, а без стилей. При этом в журналах отладочного сервера выдавалось следующее сообщение:

Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 280, in run
    self.result = application(self.environ, self.start_response)
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 709, in __call__
    mime_type = mimetypes.guess_type(file_path)[0]
  File "C:\Python27\lib\mimetypes.py", line 295, in guess_type
    init()
  File "C:\Python27\lib\mimetypes.py", line 356, in init
    db.read_windows_registry()
  File "C:\Python27\lib\mimetypes.py", line 261, in read_windows_registry
    for ctype in enum_types(mimedb):
  File "C:\Python27\lib\mimetypes.py", line 251, in enum_types
    ctype = ctype.encode(default_encoding) # omit in 3.x!
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128)


Наличие исходников стандартной библиотеки Python-а позволило найти проблему довольно быстро. Я использую Windows XP. В моем случае проблема заключалась в том, что в реестре в разделе [HKEY_CLASSES_ROOT\CLSID\{4063BE15-3B08-470D-A0D5-B37161CFFD69}\EnableFullPage\MIME] содержались подразделы содержащие в названии кириллицу. При удалении этих разделов они автоматически пересоздавались. Поэтому помогло переименование, просто заменил кириллицу латиницей.

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

--

Mihail 2 ноября 2012 г., 22:06

Для тех у кого в registry Windows 7 нет русских ключей, но проблема осталась - переименуйте сетевое имя компьютера с русского на английский языки.

--


Casufi5 декабря 2012 г., 19:06

Решение исправлением библиотеки: http://softwaremaniacs.org/forum/django/31707/