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

Следите за границей

Несколько дней не мог найти блуждающую багу в программе на python: файл базы pdb (Pilot Database) при определённых условиях сохранялся неправильно. Везде, где только можно, вставил отладочные сообщений и assert'ы,- вроде всё правильно,- но не работает. Пришлось вооружаться HEX-редактором:

Система визуализации статистики Graphite: Общие сведения

Организовать сбор статистики,- это не просто, а очень просто. Надо только сначала определиться,- нужна ли именно статистика, или душа мечтает о волшебном аналитическом инструменте уровня Business Intelligence. Различия систем таких классов следующие: статистика,- это сбор, хранение и отображение значений заранее известных метрик заранее определённым способом, а BI,- это скорее поиск и извлечение значений и зависимостей из необработанных наборов данных по заранее неизвестным критериям.

Всё придумано до нас: Варлок 9000



Группа исследователей из Джорджии (Tielei Wang, Kangjie Lu, Long Lu, Simon Chung и Wenke Lee) предложила подход, позволяющий обойти предварительную проверку, которую проходят программы перед размещением в AppStore. Идея заключается в разбрасывании по коду программы так называемых "кодовых гаджетов", которые сами по себе выглядят вполне невинно, что позволяет приложению пройти в основном статический анализ, проводящийся в Apple. А уже после установки ничего не подозревающим пользователем приложение получает кодовый сигнал, позволяющий собрать зловреда из внешне невинных компонентов.

В качестве демонстрации работоспособности подхода авторы честно разместили в AppStore приложение с "говорящим" именем Jekyll, которое после активации стало способно красть пользовательскую информацию, делать фотографии, отправлять почту/SMS и т.п.
А вообще такую балалайку Лукьяненко описал уже достаточно много лет назад в Лабиринте Отражений

Графитовые графики в консоли


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


А ещё волшебным образом можно показать статистику из Graphite, например так:

$ curl -s "https://graphite/render/?target=metric.foo&from=-30min&format=json" | \
python -mjson.tool | grep ',' | grep -v '\]' | spark
▂▅▇▃▆▆▅▇▂▁▂▁▂▁▁▅▇▃▃▃▂▂▂▁▂▂▃▁▂▃▁▁▁▂▃▅▂▁▂▂▃▃▃▂▆▃

Про Graphite написал отдельно, а ещё на сладкое аглоязычная годная серия статей про работу с Graphite, пример вывода в spark подсмотрел там.

Страсти по CSV


В приступе очередного скриптописания столнулся с адскими проблемами при работе с CSV. Входные данные просты до безобразия: взять данные из Excel, заметьте,- простые данные, 4 столбца безо всяких извращений вроде переводов строки внутри значений или внутренних кавычек,- переложить это в CSV, прочесть скриптом на python, преобразовать по алгоритму. Компот и второе (т.е. прочесть и преобразовать),- оказалось меньшим из зол, а вот CSV...

sh: имя и расширение файла

Просто на память: получить в скрипте имя файла и расширение:

filename=$(basename "$filepath")
extension="${filename##*.}"
filename="${filename%.*}"

Python: string.reverse()?

Самый короткий способ получить реверс строки (строка задом наперёд) в Python:

'hello world'[::-1]=='dlrow olleh'

Надо учить матчасть: Extended Slices

MacOSX: виртуальный диск в пямяти (RAM drive)


Иногда требуется очень быстрый диск размера (например для работы с временными файлами в каком-либо требовательном к быстродействию приложении или для базы данных). Для этого в Mac OS X, как и во многих других системах, есть возможность создать диск в оперативной памяти (in-memory drive). Такой диск будет не просто быстрым, а очень быстрым, поскольку данные физически хранятся в системной памяти (RAM) и для чтения-записи подсистема и механика жёсткого диска не используется в принципе. Для создания диска можно выбрать один из способов:
По порядку про каждый из способов:


Бесплатное приложение:

Для совсем ленивых бесплатное приложение Make RAM Disk. Скачать, распаковать, перенести в "Программы", кликнуть 2 раза, получить диск в памяти размером 64M. Кликнуть с зажатым Alt(Option), задать размер перед созданием. Быстро, легко и скучно. :-)


Однострочник:

Для начала надо определиться с размером диска, его надо задавать не в [мега-|гига-]байтах, а количеством блоков (секторов) размером по 512 байт: (сектор = 512 байт = 0.5 Kилобайт). Например, если нужен диск размером 100 Мб, надо взять 200000 секторов (это примерное число, если нужен точный размер,- надо считать в степенях двойки, а не в десятичном округлении). $ diskutil erasevolume HFS+ "ramdisk" `hdiutil attach -nomount ram://200000`. Быстро, легко и в консоли. Но есть шансы забыть :-)


Трёхходовка в консоли с музыкальными инструментами:

  1. Создать неформатированный диск необходимого размера, получить <путь к устройству>:
    hdiutil attach -nomount ram://количество секторов
  2. Форматировать диск:
    newfs_hfs -v <имя диска> <путь к устройству>
    Если нужны какие-то дополнительные опции файловой системы man newfs_hfs. Для других файловых систем man newfs_msdos (для FAT12, FAT16, or FAT32) или man newfs_udf, например.
  3. Примонтировать диск:
    diskutil mount <путь к устройству>. Диск будет примонтирован в точке /Volumes/<имя диска>.

Call Flow - Диаграммы сигнального обмена

Несколько раз приходилось наспех рисовать диаграммы обмена (Call Flow). Поскольку под руками не всегда есть MS Visio или OmniGraffle (замена Visio для Mac OS), на помощь приходят онлайн сервисы или другие полезняшки. Все утилиты позволяют задавать содержание в текстовом виде, утилита создаёт графические файлы автоматически. Пробовал онлайновый WebSequenceDiagrams: веб-сервис. Есть несколько шаблонов с циклами, условиями и другими вариантами блоков. Быстро нарисовать что-либо несложное,- практически идеально. Если использовать в качестве встраиваемого кода в интранет,- хотят денег. Если надо встраиваемый вариант или плагин:
  • MSCGen (Message Sequence Chart),- написан на ANSI-C, использует GD. На сайте есть готовые сборки для WIN и исходники для всех остальных. Лицензия GPLv2.
  • Выбор редакции :-) PlantUML,- сделано на Java, распространяется в виде единственного JAR-файла, готового к работе из коробки (сразу после скачивания). Позволяет рисовать почти всё, что приходит в голову, вплоть до интерфейсов. Есть возможность менять настройки отображения прямо в тексте, задающем диаграмму. Лицензия GPL (или LGPL для особо упёртых, с меньшими возможностями,- но есть). Может работать в пакетном режиме. Умеет сохранять исходники диаграммы в метаданных получившегося графического файла. 

PyObjC: разработка на Python для Mac OS X

Разработка графических приложений для MacOSX на Python возможна: для желающих странного существует проект PyObjC, целью которого является предоставить мост между языками Python и Objective-C. Реализация моста должна быть полностью двухсторонней, что позволит программистам на Python использовать всю мощь различных тулкитов Objective-C и наоборот,- программистам на Objective-C использовать функционал, реализованный на Python. Самое главное,- что эта библиотека позволяет писать Cocoa GUI приложения для Mac OS X на чистом Python Python. На сайте проекта выложены примеры взаимодействия с компонентами Mac OS X, например с адресной книгой.

Это был маркетинг, а теперь грустная реальность:
  • крайняя версия датируется 2009 годом
  • часть API не реализована в принципе (например AddressBook Plugin API)
  • в части API реализованы не все методы
В остальном,- надо тестировать.

Учебник GIT

Логотип Git
Вот вам сразу ссылка: Учебник GIT.

Впервые столкнулся по работе с git (это такая распределённая SCM ака система контроля версий. Из тех, что доводилось использовать раньше,- похоже на Mercurial). Википедия говорит, что git придумал Линус Торвальдс, чего-то ему не хватало в имеющихся на тот момент (в 2005 году) системах контроля версий при разработке ядра linux:

Проект был создан Линусом Торвальдсом для управления разработкой ядра Linux, первая версия выпущена 7 апреля 2005 года.

Та-же википедия говорит, что git затачивали под использование в скриптах, поэтому якобы система команд и ключей продумана и оптимизирована под скритпы. После Hg переучиваться тяжело, у git (как и у всех других SCM) своя волшебная философия,- мнемоника отдельная от всего и совершенно своя. Как с этим бороться,- понятно: мануалы почитать :-) Собственно, сайт проекта git содержит всё необходимое,- дистрибутивы для разных ОС, исходники и книжки на нескольких языках, в том числе на русском. Перевод весьма достойный, читается легко и всё понятно. Вообщем,- рекомендую.

.Gadget again: Разные мелочи

Микрософт в своём стиле: при обновлении
не показывается версия установленного гаджета
Продолжаю ковыряться с гаджетами Windows Sidebar.

Обновление гаджета:
Как выясняется, встроенного механизма для обновления гаджета нет. Есть возможность установить новую версию поверх старой, но и здесь не всё гладко, - при установке новой версии поверх в русифицированной версии но отображается информация о старой версии,- только название гаджета, и то в виде имени файла в файлововй системе, а не то название, которое задано в gadget.xml. Такие мелкие и мягкие баги убивают всё впечатление от операционной системы.

Разаботка и дебаг:
Микрософт рекомендовал разрабатывать и дебажить в Visual Studio. По опыту получается, что львиную долю разработки можно сделать в альтернативной системе (я использовал Mac OS X 10.7.5), если говорить о логике изменения UI и получения/обработки данных. Всё что касается работы с настройками,- дело плохо. Данные настроек для гаджетов Windows Sidebar записываются и читаются с помощью javascript-объекта System.Gadget.Settings. Нигде, кроме сайдбара, этого объекта попросту не существует в объектной модели javascript. Реализаций System.Gadget.Settings в виде бибилиотеки для отладки в произвольном браузере (да даже в IE),- попросту не существует и уже не будет существовать.

Кроссплатформенность
В Mac OS X тоже есть гаджеты (ака виджеты). Несмотря на похожесть этих двух представителей ПО,- готовить их нужно по разному. Кроме того, есть ещё расширения для Chrome, которые тоже все из себя HTML, но тоже другие. Готовых инструментов для адаптации одного к другому или изначально кроссплатформенной разработки,- не нашёл, хотя не исключаю, что они могут существовать или кем-то разрабатываются в настоящий момент.

Разделение строки на части в Excel

Кнопка "Текст по столбцам" в Excel
Случайно обнаружил, что в MS Excel нет формулы для разделения строки на части с использованием символа или подстроки в качестве разделителя. Нет вообще, как таковой. В любом нормальном языке программирования есть, а в Excel нет. Для случаев, когда строка представляет из себя число с дробной частью,- там на помощь приходит деление, умножение и остаток, знакомые со школы, хотя для неопытного пользователя и эта задача может оказаться непосильной. А если разделить нужно именно текст? Формула для сращивания строк,- есть, а для разделения,- нет. Гуглинг по вопросу даёт совершенно дикие варианты, типа вот такого:


Формула (стиль A1):
=ЕСЛИ(ЕОШ(НАЙТИ(",";A1));A1;ПСТР(A1;1;НАЙТИ(",";A1)-1))

Формула (стиль R1C1):
=ЕСЛИ(ЕОШ(НАЙТИ(",";RC[-1]));RC[-1];ПСТР(RC[-1];1;НАЙТИ(",";RC[-1])-1))


К счастью, такая задача нечасто возникает, поскольку в большинстве случаев исходные данные можно сохранить как файл и прогнать через импорт, что вообщем-то решает задачу. К тому-же, если разделение строк нужно разово, а не в виде формулы для динамического пересчёта, то всё не так плохо:
в последних версия Excel есть волшебная кнопочка "Текст по столбцам" (у меня находится именно в виде кнопки в разделе "Данные"). Собственно делает практически тоже самое, что и импорт файлов в формате типа CSV,- предлагает выбрать разделитель, даёит возможность настроить формат получившихся столбцов и всё такое.

Но для решения этой простейшей задачи я потратил не меньше получаса. 

Компиляторы Python


Для сборки кода на python в исполняемый файл можно воспользоваться одним из комиляторов:

PyInstaller(cross-platform), py2exe (Windows), cx_Freeze(cross-platform), py2app (Mac).

Эти утилиты собирают все модули и файлы данных в один исполняемый (для данной операционной системы) файл, который может запускаться на любом компьютере без установленного Python'а.

Python в микроконтроллере: p14p

На просторах интернета наткнулся на проект python-on-a-chip,- энтузиасты разрабатывают урезанную виртуальную машину (Virtual Machine, VM) Python с кодовым названием PyMite, которая сможет выполнять код Python на микроконтроллерах без участия какой-либо операционной системы.

Apple Autoingestion.class и прокси. Загрузка отчёта с помощью curl

Собираю статистику по загрузкам своих приложений из Apple AppStore. Яблочники не так давно выпустили утилиту для загрузки отчётов, да вот беда,- не работает эта утилита через прокси, а у моего сервера другого доступа, кроме как через корпоративный прокси-сервер и нет. Пробовал устанавливать переменные окружения HTTP_PROXY и FTP_PROXY,- не помогает.

Как позвонить на Марс

Внезапно выяснилось, что международная нумерация на +0 зарезервирована для абонентов на Луне, Венере и Марсе.

Правда, современные стандарты типа E.164 об этом умалчивают. Это я так разбирался со статистикой звонков. Встречал разное, даже в Сье́рра-Лео́не люди звонят, хотя это фрод наверняка. А межпланетных звонков на нашем софтсвиче пока не выявлено.

Dropbox и html

Пару недель назад попробовал было зарегистрировать себе Dropbox, и с удивлением узнал, что я там уже зарегистрирован очень давно. Восстановил старый пароль, начал пользоваться. Порадовало наличие клиентов под разные операционные системы (у меня в работе используются и MacOSX, и Android и Windows7), порадовали функции и вообще всё хорошо... пока я не попробовал расшарить html-файл. 

То есть я подумал,- если сервис позволяет расшаривать файлы, и вообще есть папка Public, в которой все файлы по умолчанию доступны,- почему бы не положить туда простенький сайт без движка, чиcтый HTML+CSS+JavaScript? Ан нет, не работает. Не знаю по каким причинам, но html-файлы или не отдаются вообще (ошибка 404), или отдаются, но путь к файлу совсем не такой, как хочется предполагать.

Т.е. хостинг сайта из DropBox'а сделать не получится, а жаль.

Colspan=100%

Много раз сталкивался с ситуацией, когда надо сделать ячейку таблицы, объединяющую все столбцы (например для подзаголовка группы строк или как footer для всей таблицы). Если наперёд знаешь сколько столбцов,- не проблема, есть стандартный атрибут colspan, указываешь количество объединяемых ячеек, например colspan="2", всё работает.

А если страница выводится скриптом и количество столбцов наперёд неизвестно? И нет возможности посчитать в шаблонизаторе? В последний раз такая задача возникла при использовании Django, там шаблоны очень удобные, но с математикой там туго, а писать собственный template tag или filter казалось излишеством. Выкручивался либо изменением шаблона (чтобы такое объединение ячеек вообще не было нужно) либо городил в коде дополнительный подсчёт количества столбцов, пока не надоело. А когда надоело,- полез гуглить.

Оказалось, что не я один "хочу странного", куча народу уже сталкивалась с такой-же проблемой. Пробуют добавлять в свойства таблицы colspan="all" или colspan="0", - не во всех браузерах работает. На stackoverflow нашлось решение,- рекомендуют писать colspan="100%".

Попробовал на доступных браузерах,- работает везде.

Yealink VP-2009 Keyboard Test and Factory Reset

На забугорных форумах нашёл информацию о том, что в телефоне при наборе *#5702000# включается режим Keyboard Test (ну это проверка клавиатуры по-нашему). Проверил, - действительно запускается. Такой текстово-гравический экранчик с крупными буквами, просит нажимать последовательно F1, F2 и т.д. Каждая кнопка нажимается по 2 раза, после этого переходим к следующей кнопке. Дошёл до кнопки Ok, нажал два раза,- телефон ушёл в ребут. Правильно, ведь на этом забугорном форуме было написано, что для Factory Reset'а надо дважды нажать Ok в режиме тестирования клавиатуры :-). Вот только как проверить оставшиеся клавиши после Ok? Правильно, второй раз нажимать другую клавишу :-)

Собственно сброс забытого администраторского пароля так и происходит.