Показаны сообщения с ярлыком knowledge. Показать все сообщения
Показаны сообщения с ярлыком knowledge. Показать все сообщения

воскресенье, 2 февраля 2014 г.

Гадости мира юникода - акценты и нормализация

Есть проблема:

на диске лежит файл "андрей.png"
Мы пытаемся открыть этот файл (код на пайтоне, f = open("андрей.png",'r'))

пример отлично отрабатывает на Mac OSX, однако если перенести файл и скрипт на Linux (Ubuntu) то файл не открывается, пишет что не найден. Здорово?

Здорово. Я раньше думал, с юникодом все просто. Ан нет. "и краткое" может быть закодировано в utf-8 двумя различными способами - с акцентом или без. Остальные диакритические символы с галочками, крыжиками и умляутами - тоже.

при этом, "по умолчанию" разные операционные системы используют разные пути нормализации юникодных имен файлов - Linux, Windows и другие системы используют NFC (нормальная форма С, символ с акцентом - один знак), MacOS - NFD (нормальная форма D, акценты отдельно от символа). один и тот же символ Й, закодированный в разных нормальных формах - это два разных набора бит (на примере UTF-8)


  • NFC: "\xd0\xb9"
  • NFD: "\xd0\xb8\xcc\x86"


И как следствие, файл не находится, если он записан например в NFC, а в open() передана строка в NFD. Такая вот гадость на ровном практически месте.

Есть несколько способов решить проблему. мне нравится способ отказаться от юникода в именах файлов вообще (pip install unidecode и пользуйся на здоровье).

Либо для кросс-платформенности использовать unicodedata и делать две попытки открыть файл - один с normalize(NFC) а другой - с normalize(NFD)

по второму варианту - вот такая простая функция

 # check for unicode  
 # it supports unicode normal forms NFC and NFD  
 # see here: http://yuryskaletskiy.blogspot.ru/2014/02/blog-post.html  
 # returns properly normalized filename if file exists, otherwise None  
 def unicode_filename_check(name):  
      name_u = name  
      if not isinstance(name, unicode):  
           name_u = name.decode('utf-8')  
      if os.path.isfile(name_u):  
           return name_u  
      #try with NFC  
      name_u = normalize('NFC', name_u)  
      if os.path.isfile(name_u):  
           return name_u  
      #try with NFD  
      name_u = normalize('NFD', name_u)  
      if os.path.isfile(name_u):  
           return name_u  
      return None  

ссылки по теме

- википедия http://en.wikipedia.org/wiki/Unicode_normalization
- статейка http://vemod.net/filenames-and-unicode-normalization-forms
- про эти же грабли http://nedbatchelder.com/blog/201106/filenames_with_accents.html


среда, 10 марта 2010 г.

Как в .cmd файлах узнать SITE IDENTITY зная имя сайта (IIS 6)

How to recognize IIS 6 site ID by its name in command line (.cmd)
***
Стояла задача: написать .cmd скрипт для Win2003/IIS6, который создавал бы сайт и настраивал его параметры

Сайт создается через утилиту iisweb /create. Параметры настраиваются через adsutil.vbs

Проблема в том, что adsutil требует на вход site identity, которую явно из iisweb не получить.
В результате написал простенький скрипт (который, правда, требует sed for windows)

Скрипт, зная имя сайта, получает в переменную окружения его id. Может, кому-нибудь пригодится...


set SITE_NAME=MySite 
set SED=utils\sed.exe
iisweb /query %SITE_NAME% | %SED% "$!d" > c_siteid.tmp
%SED% -i "s/.*(W3SVC\/\([0-9]*\)).*/\1/g" c_siteid.tmp 
set /p SITE_ID=<c_siteid.tmp
echo id=%SITE_ID%
del c_siteid.tmp
del sed*.
Бонус: команды sed

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

RUB и RUR

Век живи, век учись:

Оказывается, международный код (по ISO 4217) рубля - это RUB а не RUR. Код RUR использовался для означения рубля до деноминации 1998 года.

таким образом, "по правильному" 1 RUB эквивалентен 1000 RUR.

"The ISO 4217 code is RUB; the former code, RUR, refers to the Russian ruble prior to the 1998 denomination (1 RUB = 1000 RUR)."

Источники:

вторник, 6 октября 2009 г.

Рабочее место Юры Скалецкого

image
Наконец собрался рассказать о том, как устроено мое рабочее место. Относительно недавно – с полгода назад – я, как мне сейчас кажется, пришел наконец к идеалу.
Я настроил мое рабочее место так, что мне все в нем нравится.
Самое главное, чего мне удалось достичь – я теперь могу быстро выполнять рутинные задачи. Я быстро могу запустить нужную мне программу, быстро открыть плейер, быстро включить или выключить музыку, изменить громкость звука, залезть на какой-нибудь сайт. Больше компьютер в повседневных задачах меня не тормозит.
При выборе часто используемых программах я отказался от мегакрасивости и суперуниверсальности в сторону минимального размера в памяти и быстрого старта. Это сильно улучшило мое настроение.

Ноутбук

Все мое рабочее место умещается в одном Lenovo ThinkPad T-61. До этого я жил на ASUS-ах, но после перехода на IBM/Lenovo я понял, что ASUS ноутбуки делать не умеет. А IBM вот умел и Lenovo не разучилась еще, к счастью.
Самое прекрасно в Lenovo – правильный предустановленный софт. В нем практически все правильно:

вторник, 5 августа 2008 г.

iPhone: This accessory is not made to work with iphone

Однажды, совершенно неожиданно, мой iPhone начал в случайные моменты времени выдавать вот такое сообщение:

"This accessory is not made to work with iphone."

и начал просить перевести его в Airplane mode. Перестал играться звук из iPod и YouTube через встроенный динамик.

Перепрошивать и ресторить, к счастью, не пришлось. Положение спасла бумажка, смоченная в водке, которой я протер основной разьем телефона. Когда вся пыль была выскреблена и выдута, телефонка перестала ругаться и стала работать, как раньше.

Мораль: иногда надо работать руками ;)

понедельник, 26 ноября 2007 г.

How to change a _page_ (not entire document) orientation in Microsoft Word 2007

1. Click on "Page Layout tab"
2. Select some text on a page
3. Click Margins->Custom->Orientation and set "aplly to" as "selected text"
4. Click on "OK"

воскресенье, 29 июля 2007 г.

Вложенные web.config-и

Искал-искал, как сделать аналог include в app/web .config - и наконец нашел. Начиная с .Net 2.0 у конфигурационных тегов есть малоизвестный атрибут configSource.

Вот что о нем написано на MSDN: http://msdn2.microsoft.com/en-us/library/ms228167(VS.80).aspx

понедельник, 9 июля 2007 г.

Как подключиться к MS SQL Server Embedded Edition

Век живи, век учись...

Оказывается, во всем утилитах для MS SQLServer 2005 при подключении к серверу БД можно вместо Server Name вводить имя named pipe. Например, это помогает подключиться к SQL Server Embedded Edition, в котором по умолчанию для standalone установки хранят свои базы SharePoint Services.

Для этого всего лишь надо в поле server name ввести "\\.\pipe\mssql$microsoft##ssee\sql\query"

В противном случае - пришлось бы ставить SQL Server Management Studio Express

Найдено тут: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=949426&SiteID=1

четверг, 5 июля 2007 г.

"квотирование атрибутов в XML" или "век живи, век учись"

Вот уж действительно - век живи, век учись. Оказывается, согласно Стандарту XML квотировать атрибуты можно как одинарными, так и двойными кавычками. Это значит, что xml вида



Вполне себе валидный. Вот что говорит стандарт:

Literals
[9]
EntityValue ::= ' " ' ([^%&"] PEReference Reference)* ' " ' " ' " ([^%&'] PEReference Reference)* " ' "
[10]
AttValue ::= ' " ' ([^<&"] Reference)* ' " ' " ' " ([^<&'] Reference)* " ' "

Такие дела. Я, когда xml с одинарными кавычками увидел, был на 100 процентов уверен, что он не валидный.

PS: А MS IE например, его открывает нормально, но показывает уже с двойными кавычками.

четверг, 26 апреля 2007 г.

Лучший способ определить предметную область (domain) проекта

Недавно обнаружил отличные способ при запуске проекта определить его предметную область - то есть термины, ключевые сущности, их атрибуты и зависимости.

Предметную область надо обсуждать с юристами заказчика. Они часто разбираются в терминах гораздо лучше самого заказчика (и - главное - непротиворечиво!)