AdHoc тестирование - легко и просто

Открылся замечательный бесплатный сервис TestFlight для легкой и быстрой работы с тестерами. Все проходит примерно так:

  1. Регистрируемся на сайте

  2. Создаем Team (их может быть много)

  3. Приглашаем людей в Team (или рекрутируем, об этом дальше)

  4. Каждый, получивший приглашение, должен зайти со своего устройства на сайт

  5. При первом заходе появится кнопочка “Register”, которая потребует установки дополнительных профилей

  6. После установки надо зайти на сайт с устройства снова и UDID устройства будет зарегистрирован (Иногда это не проходит с первого раза, у меня получилось с 3-го, у некоторых при использовании jailbreak'а не получается вообще)

  7. Разработчик может добавлять новые билды

  8. Собственно это все – следующий заход на сайт с тестеровского девайса будет отображать доступные для установки новые версии приложения(ий) с краткими комментариями, для установки достаточно будет перейти по ссылке

О каждой версии приходят почтовые уведомления. Тестеров можно группировать и распространять соответственно по группам. Кроме того, при публикации билда автоматически показываются все устройства из группы, которые не входят в provisioning profile.

Для широкого охвата существует рекрутирование – Вы публикуете ссылку с комментарием в публичных источниках (твиттер, фейсбук, блог) и каждый желающий может изъявить желание присоединиться к бета тестированию.

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

[Перевод] Шифрование SQLite с помощью SQLCipher (iOS/Mac)

Оригинал на английском (disclaimer: перевод вольный)

SQLite является самым распространенным средством  для хранения данных на iPhone со стабильным API и хорошей документацией. Очевидно, что не хотелось бы мешать код приложения с собственно шифрованием, а делать это как можно прозрачней.

Такую функциональность предоставляют SQLCipher и OpenSSL. Оба проекта замечательны своим открытым исходным кодом, а также поддержкой Mac/Windows/Linux.

Итак, что нам потребуется…

Старые баги

Выкладывая расширение, столкнулся со странной проблемой: несмотря на то, что был прописан правильный Content-Type, Safari открывал файл в текстовом виде. Что конечно же было не комильфо.

В процессе отладки выяснилось, что это все происходило из-за того, что по счастливой случайности переход строки в заголовках попадал на 256-ой или 257-ой баг. И сервер в этом случае добавлял дополнительный заголовок “X-Pad: avoid browser bug”.

Оказалось, что сервер обходил баг Netscape с версии 2.0 и до 4.0b2. И сей фикс со стороны сервера существует с 21 апреля 1997 года.

Каким образом этот невинный заголовок портил жизнь Safari я не знаю, но сама ситуация позабавила – современный браузер некорректно работал с файлом из-за серверного фикса бага в другом браузере 13 лет назад :)

Победить не удалось, пришлось обходить стороной – менять размер заголовков переименовыванием файла :)

Английская версия истории бага

Adium & iTerm 64 Bit

В рамках постепенного переползания на 64 бита самодельные билды: iTerm Adium 1.5

PIL (Python Imaging) в Snow Leopard

После перехода на Snow Leopard в Django перестали работать ImageField'ы. Причина оказалась в неработоспособном PIL'е, а точней в его привязке к libjpeg. (типичное сообщение об ошибке:

ImportError: dlopen(/Library/Python/2.6/site-packages/PIL/_imaging.so, 2): Symbol not found: _jpeg_resync_to_restart

Решение проблемы частично описано здесь (english) качаем отсюда:

tar zxvf jpegsrc.v6b.tar.gz
cd jpeg-6b
cp /usr/share/libtool/config/config.sub .
cp /usr/share/libtool/config/config.guess .
./configure --enable-shared --enable-static
make
sudo make install

Однако мне “повезло” и я оказался в числе тех, у кого это сразу не заработало – причина была в “зоопарке” установленных libjpeg'ов.

Итак, делаем следующее:

Смотрим все зависимости _imaging:

otool -L /Library/Python/2.6/site-packages/PIL/_imaging.so

Получаем что-то вроде:

/Library/Python/2.6/site-packages/PIL/_imaging.so: /sw/lib/libjpeg.62.dylib (compatibility version 63.0.0, current version 63.0.0)

Дальше можно решить двумя способами: а) удалить “зоопарковую” библиотеку (в моем случае – из /sw/lib и пересобрать все заново) б) если удалять – не вариант, то можно перелинковать питоновский _imaging на правильную, свежесобраную библиотеку:

install_name_tool -change /sw/lib/libjpeg.62.dylib /usr/local/lib/libjpeg.62.dylib _imaging.so

После этого все должно работать :)

Python и полнотекстовый поиск (FTS) в Sqlite

Задача: получить поиск по всему тексту в питоне.

Качаем последний sqlite-amalgamation (основное отличие – вся библиотека в одном файле)

curl -O http://www.sqlite.org/sqlite-amalgamation-3.6.17.tar.gz

Распаковываем:

tar xzf sqlite-amalgamation-3.6.17.tar.gz

Переходим в sqlite-3.6.17: Конфигурируем с включенным FTS3:

CFLAGS="-Os -DSQLITE_ENABLE_FTS3=1" ./configure

Билдим и устанавливаем

make
sudo make install

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

Решение: используем свою собственную библиотеку только для питона:

Переходим в папку питона:

cd /System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-dynload/

Изменяем линки в загрузочной библиотеке:

install_name_tool -change /usr/lib/libsqlite3.0.dylib /usr/local/lib/libsqlite3.dylib _sqlite3.so

Запускаем питон и проверяем:

python
Python 2.5.1 (r251:54863, Feb  6 2009, 19:02:12)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.6.17'