пятница, 11 июля 2014 г.

Mobile Orders - анонс


Минувший понедельник стал важным днем для меня и для еще для нескольких человек - мы запустили открытую регистрацию в проекте “MobileOrders". За полтора года мы проделали уйму работы: придумали фирменный стиль и дизайн всех частей целого, переписали с нуля мобильный движок конструктора приложений для iOS и Android, сделали новый DIY-сайт с дейтингом и геолокацией (шутка), развернули небольшую ферму-билдер приложений на Mac Mini , сделали новый красивый публичный сайт-визитку и связали все это вместе.

Отладка, исправление багов, перфекционист - арт-директор (я просил 600 пикселей по ширине, а вы тут наверстали 598), споры до глубокой ночи о минимально необходимой для старта функциональности. Споры о том, “вертикалка" или не "вертикалка”, споры еще о тысяче разных вещей. Выкат блоков новой функциональности для ключевых клиентов, снова ловля багов и неувязок, еще выкат, и еще… И наконец - финальная неделя перед релизом, программист в пять утра пишет какие-то вопросы, в девять утра звонит наш коммерческий директор и рассказывает, как он ка-а-ак всех клиентов на следующей неделе обзвонит и сколько одновременно можно отправить приложений на публикацию и еще он вспомнил “одну маленькую вещь” и еще час обсуждаем эту маленькую вещь.

http://www.mobileorders.ru/



Если ваш бизнес связан с доставкой постоянным клиентам еды, воды, другой продукции - вы сможете за пару дней выпустить свое собственное мобильное приложение. А для клиентов одного доставочного клуба  у нас есть специальное предложение...

Ждем, с некоторой опаской, фидбека пользователей - а вдруг им не понравится?
И уже есть сотни идей - как улучшить, что добавить, что не очень нужное убрать. И список срочных доработок, отсортированный по убыванию срочно-срочности 
И есть роадмап на ближайший год как минимум. Он - этот год, обещает стать очень интересным.

пятница, 14 февраля 2014 г.

Архитектура Open Source приложений

Всем уважаемым IT-шникам советую, хотя бы по-диагонали, почитать данный труд. Подробно разобраны высокоуровневые архитеткуры, подходы и принципы работы нескольких десятков известных проектов с открытым исходным кодом - Eclipse, Asterisk, ngnix, git и других.


искренне рекомендую для расширения кругозора.

http://rus-linux.net/MyLDP/BOOKS/Architecture-Open-Source-Applications/index.html

воскресенье, 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