Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2013-04-30

Intersect or not Disjoint

Продолжаю работать над Mapfeatureserver.

В PostGIS есть интересный оператор «&&», вот его описание:

A && B
The "&&" operator is the "overlaps" operator. If A's bounding box overlaps B's bounding box the operator returns true.

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

Вот пример вычисления ответа на REST запрос к featureserver ArcGIS:
запрос http://vags101.algis.com/arcgis/rest/services/seisprofiles/FeatureServer/1/query?returnGeometry=true&geometryType=esriGeometryEnvelope&geometry={"xmin":6593024.93074,"ymin":10538006.4152,"xmax":6641944.62884,"ymax":10569039.8487,"spatialReference":{"wkid":102100}}&inSR=102100&spatialRel=esriSpatialRelIntersects&outSR=102100&outFields=*&f=pjson

говорит нам о том, что есть прямоугольник для которого надо найти все пересекающиеся сейсмопрофили. Эталонный ответ содержит 16 записей.

Запрос к PostGIS с оператором «&&» вернет 20 записей
select *, st_asgeojson(1, st_transform(geom::geometry, 3857)) shape
from seisprof
where geom::geometry && ST_transform(
        ST_GeomFromText(
            'POLYGON((6593024.93074 10538006.4152, 6641944.62884 10538006.4152, 6641944.62884 10569039.8487, 6593024.93074 10569039.8487, 6593024.93074 10538006.4152))'
            , 3857)
        , st_srid(geom::geometry) );
то есть найдет дополнительно 4 записи, боксы которых перекрывают заданный бокс, но сами сейсмопрофили находятся снаружи заданного прямоугольника. Зато очень быстро.

Правильный (зато более тормозной) запрос к PostGIS, возвращающий нужные 16 записей выглядит так
select *, st_asgeojson(1, st_transform(geom::geometry, 3857)) shape
from seisprof
where not st_disjoint(
    geom::geometry
    ,ST_transform(
        ST_GeomFromText(
            'POLYGON((6593024.93074 10538006.4152, 6641944.62884 10538006.4152, 6641944.62884 10569039.8487, 6593024.93074 10569039.8487, 6593024.93074 10538006.4152))'
            , 3857)
        , st_srid(geom::geometry) ) );
причем «not st_disjoint» можно заменить на «st_intersects», что одно и то же
Конечно, нельзя не упомянуть тот факт, что разница в быстродействии будет заметна только в том случае, если правильному запросу придется отсекать гораздо больше лишних записей, нежели 4.

Чуть не забыл, оператор PostGIS «&&» более всего похож на «esriSpatialRelEnvelopeIntersects» в ArcGIS.

original post http://vasnake.blogspot.com/2013/04/intersect-or-not-disjoint.html

2013-04-29

Python Decimal & json.dumps/loads

В ходе работы над Mapfeatureserver наступил на грабли. Не работает сериализация в JSON, говорит, типа
File "c:\d\Python27\lib\json\encoder.py", line 178, in default
TypeError: Decimal('0E-11') is not JSON serializable

После разборок выяснилось, что проблем аж две: стандартная библиотека json не умеет работать с типом данных decimal.Decimal; в тестовой БД поля типа numeric (из которых и появляется питонячий Decimal) содержат «0.0» вместо NULL.
Еще неизвестно, какая проблема тяжелее. Замена null-ов на 0 произошла где-то в цепочке загрузки данных Esri gdb → shp → PostGIS. Скорее всего при выгрузке в шейп. Это означает, что в перспективе надо писать загрузчик данных напрямую из Esri gdb сразу в PostGIS. Узелок на память.

Проблема с сериализацией Decimal в JSON тоже не из легких.
Есть модуль simplejson, который понимает Decimal и ловко с ним работает.
Например так:
    data = {'a': 'b', 'c': decimal.Decimal(3.14), 'd': decimal.Decimal('0E-11')}
    text = simplejson.dumps(data, ensure_ascii=False, sort_keys=True, indent=2, use_decimal=True)
    print text.encode(CP)
что дает такой результат :
{
  "a": "b",
  "c": 3.140000000000000124344978758017532527446746826171875,
  "d": 0E-11
}
Или так:
    data = {'a': 'b', 'c': decimal.Decimal(3.14), 'd': decimal.Decimal('0E-11')}
    def jsonify(obj):
        if isinstance(obj, decimal.Decimal):
            return float(obj)
        raise TypeError(repr(obj) + " is not JSON serializable")
    text = simplejson.dumps(data, ensure_ascii=False, sort_keys=True, indent=2, default=jsonify, use_decimal=False)
    print text.encode(CP)
что дает несколько другой результат:
{
  "a": "b",
  "c": 3.14,
  "d": 0.0
}

В принципе работает, а вот в кожухе фигня получается. Почему? Потому, что это выходит не сериализация, в том смысле, что она необратима. При применении опции «use_decimal=True» все числа с плавающей точкой будут загружены (функция simplejson.loads) как Decimal. Если же «use_decimal=False», есть шанс, что некоторые числа вообще не загрузятся а если загрузятся, то с потерей точности и их тип будет НЕ Decimal. А если сделать свой сериализатор для типа Decimal, то на выходе dumps будет не совсем JSON. А все почему? Потому что числа с плавающей точкой представлены двумя типами, в то время как их запись текстом одна и та же: «xyz.abc».

Что же делать? Зависит от конкретного применения. Лично меня устроил вариант с приведением всех Decimal к float.

original post http://vasnake.blogspot.com/2013/04/python-decimal-jsondumpsloads.html

2013-04-26

Перенести вычисления к данным

На Хабре видел статью
Называется «StateController. Событийная модель в разработке интерфейсов».
Автор фреймворка решает проблемы слабой связности модулей методом переноса кода обработки данных в узлы хранения данных. А поскольку речь идет о HTML, то это веб-формы, специальные атрибуты для элементов HTML и микро-обработчики этих элементов, написанные на Javascript.
Работает это так: внутри нужных тегов записываются специальные атрибуты, в которых указаны события, на которые надо реагировать и обработчики для этих событий. Где-то на странице возникает событие, контроллер находит все HTML элементы подписанные на это событие, вызывает обработчик события для каждого найденного элемента.
Хороший способ справится с динамической структурой веб-страницы суть приложения. В том смысле, если изготавливаемое приложение задумано как произвольный набор блоков а не фиксированная структура.

Я одного не понял — при чем тут «StateController». Контроллер состояний, это ведь несколько про другое. Это про конечные автоматы, нет?

Вполне приличная работа, можно брать на вооружение, хотя лично мне претит изготавливать очередной «Ёксель». В том смысле, что подход, предлагаемый автором, хорошо себя проявляет в приложениях, где пользователю дают некий «эксплорер» а дальше он продирается через заросли типовых таблиц и кнопок к решению своей частной задачи. Типа, надо тебе что-то посчитать, ну вот тебе Ёксель, вот данные, сиди и считай.

original post http://vasnake.blogspot.com/2013/04/blog-post_26.html

2013-04-25

Выравнивание

Есть такая холиварная тема — code indentation. Особое значение отступы приобретают в языках типа Python. Что нам говорит руководящий документ:

For new projects, spaces-only are strongly recommended over tabs. Most editors have features that make this easy to do.

Есть статья, в которой перечисляются проблемы, возникающие при использовании табуляции вместо пробелов

Поскольку использование табуляции (код ASCII 9) обычно вызывает всякие проблемы с кодом, используйте хорошее правило:
1) Никогда не используйте табуляцию

Reasons not to use hard tabs
* Due to legacy, different text editors treat hard tabs different. UNIX text editors prefer hard tab is 8 spaces, Windows text editors and IDEs (Eclipse) prefer that a hard tab is 4 spaces.
* The hard tab length agreement between different text editors cannot be reached
* The hard tab length agreement between people cannot be reached
* Thus, hard tabs may break source code readability and editability if there is more than a single person editing the file. They will open the file in an editor with different tab settings, edit it and next time you open the file it is ruined and all indentations are wrong.
* This is even worse on white space sensitive languages (Python, CoffeeScript) as this might actually cause syntax errors or programming logic errors


Лично я не считаю перечисленные проблемы серьезными или заслуживающими внимания. Все они решаются довольно легко настройками редактора или пре/пост конвертацией файлов.

Зато у меня есть ровно две причины, по которым я хочу использовать табуляцию вместо пробелов для выравнивания кода:
1. идейная причина — концептуально именно табуляция предназначена для «отбивки» и выравнивания;
2. практическая причина — когда я использую пробелы для выравнивания и случайно удаляю один из четырех (обычно) пробелов отступа, меня крайне раздражает необходимость искать микроскопический сдвиг (ширина пробела это сколько пикселов?) и вбивать недостающий пробел.

Когда я использую табуляцию, случайное удаление одного символа приводит к очень заметному сдвигу строки, что исправляется тычком в кнопку «Tab», как и положено. С пробелами так не выходит.

Но как человек законопослушный, я буду выполнять рекомендации PEP-0008 и использовать пробелы для отступов в Python. Может быть, со временем привыкну и перестану раздражаться неуместностью и неудобностью пробелов в отступах.

original post http://vasnake.blogspot.com/2013/04/blog-post_25.html

2013-04-24

Crate.io

Есть прекрасный репозиторий PyPI (Python Package Index), откуда очень удобно ставить пакеты с помощью pip
pip install yolk
Не все знают, но у PyPI есть не менее замечательное зеркало Crate.io и с него тоже можно ставить пакеты

Here's how to use pip with crate.io (in case pypi.python.org goes down):
$ pip install --index-url=https://simple.crate.io yolk 
Or with logging to see what's happening:
$ pip install --log=my-pip-debug.log --index-url=https://simple.crate.io yolk 



Crate is a PyPI Mirror/Python Package Index that was written to make it easy to discover packages, evaluate them for usefulness, and then install them. Additionally it also focuses on presenting an extremely stable interface to PyPI compatible applications (e.g. Pip)....
Crate.io is built on top of Python using the Django framework. It uses Celery to process its shared tasks, PostgreSQL to store its data, and Redis as its caching layer.


Хозяйке на заметку.

original post http://vasnake.blogspot.com/2013/04/crateio.html

2013-04-23

CIA BigData

Как вы думаете, БигДата это сколько терабайт? Для ЦРУ это все телефонные разговоры + СМС + посты в Твиттер + посты в Фейсбук + данные сенсоров (в первую очередь с каждого мобильника). Это экзабайты данных в год. А еще есть камеры наблюдения, что дает еще столько же.

Айра Гас Хант (Ira Gus Hunt), действующий Директор по технологиям ЦРУ, рассказывает о своем видении Big Data на службе ЦРУ

Это всё нужно, чтобы у нас была уверенность в том, что мы жизнеспособная и конкурентная организация, устремлённая в будущее.

Это достаточно простые вещи и они вам хорошо известны, но безопасная мобильность для нас – это тема огромной важности. Мобильные технологии не безопасны. Повторите за мной: Мобильные технологии не безопасны. И это действительно так. Каким образом мы собираемся сделать их безопасными в нашем окружении, так чтобы мы могли получить из них пользу? Это серьезная задача.

Вторая вещь, приведенная здесь – то, что мы называем продвинутой аналитикой. На самом деле мы рассматриваем аналитику как сервис. Под этим мы понимаем всё, что нам потребуется делать с Большими Данными – выполнять работу, необходимую для поддержания безопасности нашей нации.

Третье, что у нас есть – виджеты и сервисы. Мы подошли к этому, используя такую вещь как Ozone Framework. Ozone – это фреймворк, который разведывательное сообщество разработало на базе фреймворка Google. Основная причина, по которой мы им пользуемся, совпадает с причинами по которым вы пользуетесь своими смартфонами, iPad-ами и прочими штуковинами. Вы можете их персонализовать и поместить на них всякие разные штучки, необходимые для вашей деловой или личной жизни. Нам необходимо создать окружение, где наши аналитики и операторы и прочие сотрудники могут разместить необходимый для них функционал и персонализовать свой мир. Мы можем назвать её WebTop, или девайс-топ или как-то ещё, как пожелаете.

Четвертое – что, кстати, на слайде идёт под номером три, и я не очень хочу объяснять странности такой системы исчисления – это длинная история. Так вот, четвёртое; безопасность – это сервис. Мы не хотим, чтобы вам приходилось отстраивать систему безопасности сверху вниз каждый раз, когда вы поставляете нам или создаете для нас новую систему. Нам понадобиться иметь набор сервисов, и лучшие практики из мира архитектуры старых сервисов – все помнят тот мир? Готов поспорить, что я помню. Это сервисы безопасности, над которыми на верхнем уровне есть виджеты, аналитика, общающиеся с сервисами безопасности в середине, которые взаимодействуют с инфраструктурой для вычислений и прочими низкоуровневыми вещами. Так вот — сервисы безопасности и прочее имеют много общего между собой, и мы хотим быть в них уверены, что они постоянны на всем своем протяжении для любого лица, имеющего доступ к любому элементу данных, доступного через любую аналитическую систему. И эти меры также должны обеспечиваться через один из сервисов безопасности.

Пятое – данные. Я собираюсь поговорить об этом подробнее, сразу же вспоминается «это данные, дурачок». У нас есть концепция использования данных как сервиса и такое понятие, которые мы назвали ‘бухта данных’. Бухта данных не совсем четко очерченное место, но мы планируем там собрать мощные расчетные движки, подобные тем, которые вы видели в выставочном зале. Мы обнаружили (или, по крайней мере, считаем что это так), что вся аналитика выше некоторого уровня, часто пользуется общими наборами больших, высокопроизводительных расчетных инфраструктур, скрываемых внутри.

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



Из бюджета миллиарды денег в год только на техническое обеспечение тотальной слежки. И нет никаких гарантий, что к собранным данным и результатам анализа не смогут получить доступ нехорошие люди. «Мы позаботимся о вас».

Enemy of the State (1998) http://www.imdb.com/title/tt0120660/

original post http://vasnake.blogspot.com/2013/04/cia-bigdata.html

2013-04-22

Internet Census 2012

Как-то нас уже приучили к идее, что ботнеты и их владельцы — это зло. А тут хорошие люди сделали хороший ботнет и сделали хорошее дело. Нехорошими средствами, правда, но чего не сделаешь ради демократии победа все спишет науки.
Когда анимированная гифка прогрузится, на ней видно, как включаются и выключаются хосты по ходу солнца.

полное сканирование портов для всех IPv4-адресов в сети Интернет. Сканирование осуществлялось с марта по декабрь 2012 года с использование ботнета, построенного на базе незащищённых маршрутизаторов. В результате удалось собрать самую полную в истории статистику по активности хостов и распределению сетевых портов в сети Интернет.
...
Для загрузки доступен полный архив со всеми собранными данными (565 Гб при использовании сжатия ZPAQ, архив gzip занимает 1.5 Тб), подборка отчётов с общей статистикой по распределению сервисов и набор изображений с наглядным представлением распределения адресов по странам и подсетям. Особенно интересна визуализация изменения доступности IP в зависимости от времени суток и интерактивная карта, позволяющая использовать типовые фильтры и допускающая масштабирования для увеличения детализации вплоть до выделенных провайдерам подсетей.
...
Предпосылкой к проведению полного сканирования всего диапазона IPv4-адресов послужили ранее проводимые эксперименты по автоматизации сканирования портов с использование пакета Nmap и доступного в нём движка NSE (Nmap Scripting Engine), позволяющего автоматизировать выполнение любых действий по сканированию и накоплению результатов. В итоге ранних экспериментов было выявлено, что Сеть просто изобилует незащищёнными встраиваемыми устройствами, многие из которых оснащены стандартным Linux-окружением с BusyBox и открыты для доступа под заданным производителем паролем или вообще не защищены (пустой или тривиальный пароль, вида root:root и admin:admin ).

Всего было выявлено около 420 тысяч подобных незащищённый устройств, на основе которых был создан ботнет, выполнявший в течение 10 месяцев задачи по распределённому сканированию сетевых портов.
...
Были получены ping-ответы от 420 млн IP-адресов, плюс дополнительно 39 млн адресов отвечали по типовым портам, но были недоступны через ping. 141 млн хостов были прикрыты межсетевыми экранами и потенциально являются активными; ещё 729 млн IP, не фигурирующих в вышеотмеченных списках, имеют обратную запись в DNS. В итоге, общий размер активных адресов оценивается примерно в 1.3 миллиарда. Для 2.3 миллиарда адресов следов использования не обнаружено;
165 млн IP имеют один или более открытых портов из списка 150 наиболее часто используемых портов;
141 млн IP имеют только закрытые или сбрасываемые порты и не отвечают на ping, т.е. вероятно используются, но защищены извне межсетевым экраном;
...
14.16 млн IP отвечают по SSH, 34.38 млн - telnet, 4.11 млн - upnp, 6.7 млн - Windows RPC, 6.18 млн - imap, 5.9 млн - pop3, 13.57 млн - smtp, 15 млн - DNS, 27.26 млн - snmp.



original post http://vasnake.blogspot.com/2013/04/internet-census-2012.html

2013-04-19

Python и анализ данных

Казалось бы, ну что можно сделать десятком-другим строк кода на Python?

Можно найти автобус, в котором вы забыли свой портфель.
Можно найти улицу и квартал с наибольшим количеством выбоин на дороге.
Можно определить — в каких закусочных вас могут отравить.
Много чего можно.

David Beazley знакомит нас с возможностями Python по обработке данных и заодно с наборами данных (CSV, XML), публикуемых властями Чикаго.
Даже не знаю, что мне больше понравилось — лаконичность решений задач или количество доступной о городе информации.
Что мне точно не понравилось — это получасовые куски фильма, в которых ничего не происходит — народ решает задачи, Дэвид смотрит, кто как справляется. Если эти куски вырезать, никто не пострадает а кино станет заметно смотрибельнее.

Python & data statistics and analysis - collections, itertools, panda

original post http://vasnake.blogspot.com/2013/04/python.html

2013-04-18

Flask & DB connections

Всем известно, что веб-приложение может отрабатывать сотни запросов в секунду. Известно, также, что приличное веб-приложение обращается к базе данных при ответах на запрос. Очевидно, что для такого веб-приложения было бы разумно установить соединение с БД один раз, при запуске, к примеру, и пользоваться этим коннектом во всех запросах.

Однако, архитекторы Flask так не думают. Упирая на многопоточность веб-приложения как на ключевую характеристику Flask, они предлагают нам открывать соединение с БД при входе в «контекст» приложения. При этом, к тому же, происходит подмена понятий. Во Flask контекст приложения, не смотря на название, создается для отработки текущего запроса, после чего уничтожается. Соответственно, открытие/закрытие коннекта к БД происходит, возможно, сотни раз в секунду. Дикость. Недовольным рекомендуют обращаться к расширению Flask-SqlAlchemy, которое поддерживает пулы соединений с БД.

Я не хочу в своем микроприложении использовать макрофреймворк типа SQLAlchemy. Но и открывать/закрывать коннекты к БД на каждый чих мне религия не позволяет. Поэтому я почитал код Flask-sqlalchemy и выдрал оттуда механизм хранения.
Получился Flask extension или плагин, называйте как хотите
Позволяет сохранять данные, коннект к БД, например, на протяжении жизни всего приложения, суть головного процесса.

Вполне возможно я что-то упустил. Но на текущий момент практика показывает, что модуль работает нормально. Разве что не надо забывать, что хранить в таком хранилище стоит только thread-safe данные.

Что почитать по теме


original post http://vasnake.blogspot.com/2013/04/flask-db-connections.html

2013-04-17

Eclipse autosave & word highlighting

Чем бы ни заниматься, лишь бы ничего не делать.
Вместо того, чтобы работать что-нибудь полезное, пишу очередной пост про прикручивание функции автосохранения и функции подсветки одинаковых слов (autosave; word search with highlighting) для очередного текстового редактора. Сегодня это Eclipse. В смысле текстовый редактор внутри Клипсы.

Для Komodo Edit тема уже раскрыта:
а вот теперь посмотрим, что есть у Eclipse.

Как говорится, «из коробки» обе эти функции работают немного не так, как мне удобно. Мне удобно, чтобы все открытые файлы сохранялись при переключении на другое окно (потеря фокуса); мне удобно, чтобы при выделении слова все совпадения были подсвечены.
Чтобы оно работало именно так, добрые люди написали плагины к Клипсе.

Плагин «eclatosa» занимается автосохранением

Плагин «Glance» занимается поиском и подсветкой

Установить плагины в Eclipse очень легко: Help — Eclipse Marketplace... дальше и блондинка разберется.

А еще есть плагин Eclipse Color Theme. Хороший.

original post http://vasnake.blogspot.com/2013/04/eclipse-autosave-word-highlighting.html

2013-04-16

Autocomplete, calltips for Python

Где-то тут у меня пробегало высказывание о том, что до сих пор я не нашел такой среды разработки на Python, где бы в полном объеме работали подсказки и автодополнение (calltips, autocomplete for indirectly created objects). В том смысле, что почти все IDE умеют давать подсказки о методах класса, если объект класса создан в текущем namespace. Но нет такой IDE, которая могла бы дать такие подсказки, если объект пришел в виде параметра функции, к примеру. Для Javascript и PHP есть способы разъяснить тип переменной в теле комментария к функции. Для Python нету такой возможности, в каком стиле не пиши docstring.

Однако, не все так плохо. Для пытливых умов нет ничего невозможного :)
Рассказываю, как научить autocomplete & calltips понимать типы обьектов, созданных бог знает где.

Для Komodo Edit можно использовать такой грязный хак
def testFunc(lyrconf):
    if 0: lyrconf = layermeta.LayerInfo()
после чего для lyrconf начинают работать подсказки.

Для PyDev работает гораздо более приемлемый хак
def testFunc(lyrconf):
    assert isinstance(lyrconf, layermeta.LayerInfo)
Заодно и проверка на корректность параметра.


Информация нагуглилась по запросам типа
«pydev|komodo autocomplete object type tips in comments»


original post http://vasnake.blogspot.com/2013/04/autocomplete-calltips-for-python.html

2013-04-15

XMPP bot for rus transliteration

Какой я занятой человек, оказывается. Пять месяцев прошло с того дня, как я решил превратить заготовку чат-бота в нечто более завершённое. Пять месяцев ушло на вколачивание в код 13 таблиц транслитерации и переписывание 160 строк кода самого бота. Просто образец быстрой работы, хаха.
Разумеется, в действительности времени было потрачено всего несколько часов, пять месяцев проект смирно ждал своей очереди в недлинном но постоянно пополняемом стеке моих повседневных дел.

Короче, тадам: представляю финальную (не планирую ничего менять и добавлять) версию чат бота «translit.bot@gmail.com». Написан на Python, умеет только одно: переводить кириллицу в латиницу по 13-ти таблицам транслитерации:
  • ALA-LC
  • BGN/PCGN (1944)
  • ISO 9:1995, ГОСТ 7.79-2000 система А
  • ISO 9:1995, ГОСТ 7.79-2000 система Б
  • ISO/R 9 (1968), ГОСТ 16876-71, СТ СЭВ 1362-78, ООН (1987) таблица 1
  • ISO/R 9 (1968), ГОСТ 16876-71, СТ СЭВ 1362-78, ООН (1987) таблица 2
  • Британский стандарт (1958)
  • Водительское удостоверение (2000)
  • ГОСТ Р 52535.1-2006
  • Загранпаспорт (1997—2010)
  • Международные телеграммы
  • Научная
Все таблицы взяты отсюда
кроме модуля trans, содержащего свою собственную таблицу.

Кому хочется извращений — велкам в ГитХаб

Архив можно взять на складе:

original post http://vasnake.blogspot.com/2013/04/xmpp-bot-for-rus-transliteration.html

2013-04-12

Komodo Edit & autosave

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

Вся хитрость заключается в трех строчках кода
window.addEventListener("blur", function() {
    ko.commands.doCommand("cmd_saveAll");
}, false);

Этот код надо превратить в макрос Комода, точно таким способом, что я указал вчера:

Берем скрипт;
Открываем Komodo Edit, открываем Toolbox, ПКМ, выбираем Add, New Macro;
В окно нового макроса копипастим скачанный скрипт, на вкладке Triggers выбираем «Run on start-up»;
После перезапуска Комода функция автосейва должна работать.

original post http://vasnake.blogspot.com/2013/04/komodo-edit-autosave.html

2013-04-11

Komodo Edit & word highlighting

Редактор Komodo Edit хорош, причем настолько, что его скорее можно отнести к классу IDE, нежели к классу редакторов. Кроссплатформный, бесплатный, гибко настраиваемый, расширяемый плагинами, скриптами и макросами, и т.д.

Но есть одно «но». Несмотря на некоторые заявления, редактор не умеет подсвечивать все вхождения выделенного слова в тексте. Комодо умеет подсвечивать только те слова, которые «переменные», и то криво. А я к хорошей подсветке так привык в своем любимом SciTE, что сильно тоскую, если приходится писать код в редакторе не обладающем такой функцией.

Разумеется, решение есть. Тем и отличается хороший программерский редактор от нехорошего, что хороший можно дотачивать под себя конфигами и скриптами.
Итак, как научить Komodo Edit подсвечивать все вхождения выделенного слова.

Это раз.

Открываем Komodo Edit, открываем Toolbox, ПКМ, выбираем Add, New Macro.
Это два.

В окно нового макроса копипастим скачанный скрипт, на вкладке Triggers выбираем «Run on start-up».
Это три.

После перезапуска Комода функция подсветки должна работать. Даблклик на слове подсвечивает все вхождения этого слова в текст.

Использована информация из
highlight selected word in Komodo http://community.activestate.com/node/7119


original post http://vasnake.blogspot.com/2013/04/komodo-edit-word-highlighting.html

2013-04-10

SciTE and UTF-8

Я уже неоднократно упоминал, что мой любимый текстовый редактор — SciTE. В нем есть всё, что мне нужно, а если чего нет, то это не слишком сложно добавить.

Сегодня расскажу, как правильно установить стартовую кодировку файла — UTF-8 by default, ибо современные реалии таковы, что подавляющее большинство файлов вокруг — в кодировке UTF-8. Но сначала небольшое пояснение.

Есть у SciTE багофича — редактор предполагает, что по умолчанию все открываемые файлы содержат текст в кодировке «Code Page Property», конкретная кодовая страница задается в настройках редактора (конечно, редактор содержит механизмы автоопределения кодировок, но они не все файлы могут корректно автоопределить). При желании, можно через меню редактора кодировку поменять на UTF-8, к примеру. Почему авторы не захотели сделать наоборот — по умолчанию выбирать UTF-8 а по желанию настраиваемую Code Page, лично мне не ясно. Наверняка были уважительные причины.


В интернетах много рекомендаций, как включить в SciTE кодировку UTF-8 по умолчанию:
но все эти рекомендации скорее вредны, чем полезны. Ибо предполагают установку Code Page Property в unicode, что, конечно, дает желаемый эффект — все файлы по умолчанию считаются в кодировке UTF-8. Но при этом пропадает возможность использовать какую-либо другую кодировку, например CP-1251, столь популярную до сих пор у нас.

Вот, только теперь, после такого многословного вступления в тему, я дарю вам хороший, годный рецепт установки умолчальной кодировки в UTF-8 в SciTE.

Рецепт основан на использовании событий в редакторе, скриптах Lua, содержащих обработчики некоторых событий и возможности имитировать в скриптах вызовы пунктов меню редактора.

Для избежания повторений ознакомьтесь с предыдущей статьей
и скачайте используемые мною скрипты
Теперь:
Подключите к SciTE суперскрипт scite-extman
#/home/valik/.SciTEUser.properties
ext.lua.directory=$(SciteUserHome)/lua/scite_lua
ext.lua.startup.script=$(SciteUserHome)/lua/extman.lua
Это раз.

Добавьте в папку со скриптами обработчик события открытия файла
#/home/valik/lua/scite_lua/valik_cmd.lua
function ToggleEncoding()
 if buffer and not buffer["MadeUTF8"] then
  scite.MenuCommand(IDM_ENCODING_UCOOKIE)
  buffer["MadeUTF8"] = true
 end
 return false
end
scite_OnOpen(ToggleEncoding)
Это два. Кстати, полный список команд меню можно глянуть тут

Перезапустите редактор. Это три.

Теперь, не потеряв возможности использовать кодировку CP1251, у нас редактор открывает файлы в кодировке UTF-8 по умолчанию.

original post http://vasnake.blogspot.com/2013/04/scite-and-utf-8.html

2013-04-09

Слоупочта ускоряется

Удивительное дело, но в этот раз посылка из Британии была доставлена менее чем за месяц. Если точнее, то за три недели. Неужто и правда Урфин настучал своим деревянным солдатам по котелкам и они зашевелились?

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

Но ничего, минут за 15-20 я добрался до окошка и получил два своих пакета.

Трапеции Prolimit, теперь в собственности.
Ухъ, покатаемсо!

original post http://vasnake.blogspot.com/2013/04/blog-post.html

2013-04-08

Github on premises

Всем нравится Github, но не все знают, что можно сделать свой личный гитхабчик с блекджеком и т.д.

Представлен релиз платформы для организации совместной работы с Git-репозиториями GitLab 5.0. По своим возможностям GitLab напоминает GitHub, но не привязана к конкретному сервису, распространяется в исходных текстах под свободной лицензией и позволяет развернуть web-сервис управления проектом на своём подконтрольном сервере.
...
GitLab поддерживает создание отдельных проектов, отслеживание ошибок, обработку запросов на добавление кода (рабочий процесс основан на обработке merge-запросов), навигацию по веткам и тегам, контроль за изменениями, рецензирование кода, многоуровневое управление доступом, Wiki, обмен небольшими кусками кода, наглядный анализ различий между версиями кода, средства визуализации ветвления репозитория и многое другое.
...
Параллельно развивается свободный сервер непрерывной интеграции GitLab CI, который можно использовать совместно с GitLab для автоматизации тестирования и постоянного контроля за качеством кодовой базы, в том числе обеспечивая проверку пересборкой для каждого вносимого изменения.


Да, Gitlab исполнен на RoR, Distributed under the MIT License.

original post http://vasnake.blogspot.com/2013/04/github-on-premises.html

2013-04-05

a2enmod ssl

И еще одна шпаргалка по прикручиванию SSL к Apache HTTPD по-быстрому.

Сделано таких шпаргалок немало, но, почему-то, какую ни возьми, результат применения без доработки напильником неприемлем.

Поэтому, вот еще одна, с блекджеком и шлюхами.

Установка SSL на apache2 в Debian
aptitude install openssl
mkdir -p /etc/ssl/localcerts
openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/localcerts/apache.pem -keyout /etc/ssl/localcerts/apache.key
ls -la /etc/ssl/localcerts/
chmod 600 /etc/ssl/localcerts/apache*
a2enmod ssl
nano /etc/apache2/ports.conf
nano /etc/apache2/sites-available/alwaysglum
/etc/init.d/apache2 restart
Конфиг портов открывали только для посмотреть. Менять там ничего не пришлось.

Сайт типа такой
cat /etc/apache2/sites-available/alwaysglum
NameVirtualHost *:443
<VirtualHost *:443>
 SSLEngine On
 SSLCertificateFile /etc/ssl/localcerts/apache.pem
 SSLCertificateKeyFile /etc/ssl/localcerts/apache.key

Alias "/torr/" "/mnt/sams640/data/"
<Directory /mnt/sams640/data/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
        AuthType Basic
        AuthUserFile /home/valik/.htpasswd
        AuthName "Alwaysglum restricted services"
        Require valid-user
</Directory>
</VirtualHost>
Этого достаточно, чтобы Apache HTTPD начал отдавать файло по HTTPS. Браузер, конечно, ругаться будет на корявый сертификат, но это можно пережить, вспоминая о том, сколько стоит 1 год аренды подписи CA.

Источник информации

original post http://vasnake.blogspot.com/2013/04/a2enmod-ssl.html

2013-04-04

apache2-mpm-itk

Как быть, если надо, чтобы веб-сервер Apache разные запросы отрабатывал от имени разных учетных записей? Эдакий Apache HTTPD sudo.

Вот, к примеру, у меня есть древний лаптоп, он работает торрентокачалкой и заодно, раз уж круглосуточно подключен к Интернет, хостит разные веб-службы. Apache HTTPD одна из них. Вопрос, почему бы не дать доступ к торрент хламу через HTTP? Делов-то, добавить в конфиг веб-сервера алиас и конфиг для папки. А не работает. Нет доступа, ибо файлы в папке доступны только для учетки «valik» а Apache работает то ли под рутом, то ли под «www-data».

Первая мысль — переписать права доступа на папку и файлы. Не выходит, ибо папка монтируется truecrypt-ом и система безопасности truecrypt-а не позволяет открыть доступ посторонним. Только владельцу. Надо как-то научить Apache прикидываться valik-ом.

И тут выходит на сцену
apache2-mpm-itk (just mpm-itk for short) is an MPM (Multi-Processing Module) for the Apache web server

mpm-itk allows you to run each of your vhost under a separate uid and gid—in short, the scripts and configuration files for one vhost no longer have to be readable for all the other vhosts.
mpm-itk is based on the traditional prefork MPM, which means it's non-threaded; in short, this means you can run non-thread-aware code (like many PHP extensions) without problems. On the other hand, you lose out to any performance benefit you'd get with threads, of course; you'd have to decide for yourself if that's worth it or not. You will also take an additional performance hit over prefork, since there's an extra fork per request.


Чтобы запросы к виртуалхосту Apache отрабатывались от имени «valik» надо сделать так
nano /etc/apache2/sites-available/alwaysglum
<VirtualHost *:80>
 AssignUserId valik root
...
valik — это имя пользователя, root — это имя группы.

Чтобы сработала директива AssignUserId, надо включить модуль apache2-mpm-itk
aptitude install apache2-mpm-itk

Вот так все просто.

Использованные материалы

Листинг конфига сайта
cat /etc/apache2/sites-available/alwaysglum
<VirtualHost *:80>
 ServerAdmin webmaster@localhost
 ServerName alwaysgloom.sytes.net
 ServerAlias alwaysgloom.sytes.net
 AssignUserId valik root
 DocumentRoot /var/www/
 <Directory />
  Options None
  AllowOverride None
  Order allow,deny
 </Directory>
 <Directory /var/www/>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride None
  Order allow,deny
  allow from all
 </Directory>
 <Directory /var/www/files/>
  Options FollowSymLinks
  AuthType Basic
  AuthUserFile /home/valik/.htpasswd
  AuthName "Alwaysglum restricted services"
  Require valid-user
 </Directory>
 Alias "/torr/" "/mnt/sams640/data/"
 <Directory /mnt/sams640/data/>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride None
  Order allow,deny
  allow from all
  AuthType Basic
  AuthUserFile /home/valik/.htpasswd
  AuthName "Alwaysglum restricted services"
  Require valid-user
 </Directory>
 ErrorLog ${APACHE_LOG_DIR}/error.log
 LogLevel warn
 CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

original post http://vasnake.blogspot.com/2013/04/apache2-mpm-itk.html

2013-04-03

CTK-3200

CASIO CTK-3200 это «синтезатор базового уровня»
Именно такой я подарил Наташке а заодно и себе. 61 клавиша (можно играть двумя руками) с чувствительностью к скорости удара (можно управлять громкостью и продолжительностью звука), 400 встроенных тембров (хочешь — оргАн, хочешь — электрогитара, ...), функции обучения — сказка а не клавиатура.

Стоит, правда, неслабо — 9 тыщ рублей. Зато весит менее 4 килограмм. Клавиши имитирующие реальное пианино стоят от 20 тыщ рублей и весят гораздо больше. Да и место отнимают изрядно.

Неприятность ровно одна — с выключением питания память клавы обнуляется и все настройки, сделанные во время сесии, сбрасываются.

Лично мне очень нравится фунция обучения. Выбираешь одно из произведений, зашитых в память, выбираешь руку (или обе) для обучения, и давишь клавиши, следуя подсказкам на экране. Азарт подстегивается баллами, которые тебе выдают за ловкость и точность игры.
Я за час выучил первую фразу песенки Twinkle.

Что характерно, нотную грамоту знать не обязательно.

original post http://vasnake.blogspot.com/2013/04/ctk-3200.html

2013-04-02

Duke Nukem

Помню, рубился я в Duke Nukem часто и подолгу. По сравнению с Doom, Дюк был «еще более» трехмерный. Тогда это было в новинку и завораживало.

Fabien Sanglard подготовил подробный обзор внутреннего устройства игры Duke Nukem 3D, код которой был открыт около 10 лет назад под лицензией GPLv2 (игровые ресурсы остаются под проприетарной лицензией). Представленный обзор можно использовать как путеводитель по коду, дающий возможность начать использование технологий Duke Nukem 3D в свободных игровых проектах, без необходимости проведения многомесячного предварительного разбора кода. Материал также является хорошим руководством для людей интересующихся дизайном архитектуры игр.


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

The engine delivered great value and ranked high in terms of speed, stability and memory consumption but my enthousiasm met a source code controversial in terms of organization, best practices and comments/documentation. This reading session taught me a lot about code legacy and what helps a software live long.


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

original post http://vasnake.blogspot.com/2013/04/duke-nukem.html

2013-04-01

BIND 10

Фундамент так просто не обновишь. Казалось бы, сколько надо времени, чтобы переписать такой, в общем-то несложный, сервис как named?

спустя 13 лет с момента выпуска BIND 9 представил первый стабильный релиз DNS-сервера BIND 10, отличающегося кардинальной переработкой внутренней архитектуры. В отличие от ранее практикуемой модели реализации всей доступной функциональности в одном серверном процессе, в BIND 10 осуществлён переход к разделению функций по отдельным взаимосвязанным процессам, каждый из которых реализует свой сервис. Разделение по разным процессам позволило рационально использовать ресурсы многоядерных систем, расширило возможности масштабирования, обеспечило изоляцию отдельных функций и повысило надёжность


Список нововведений и разных фишек впечатляет. Там и очереди сообщений, и удаленное управление, и API для управления и контроля, и кластеризация, и сборка из модулей только необходимой функциональности, и т.д. и т.п.
BIND 10 с нами еще лет на 15?

original post http://vasnake.blogspot.com/2013/04/bind-10.html

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Klaipeda (15) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) Baltic (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) seaside (1) serialization (1) shore (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)