Обратите
внимание — рассматриваются охватывающие
боксы фигур. Это очень удобный оператор
в плане быстродействия, для поиска
задействуется пространственный индекс
и более ничего. Но в плане корректности
результата это уже не так хорошо.
Вот пример
вычисления ответа на REST запрос к
featureserver ArcGIS:
то есть найдет дополнительно 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.
В ходе работы над
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)
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 posthttp://vasnake.blogspot.com/2013/04/python-decimal-jsondumpsloads.html
Называется
«StateController. Событийная модель в разработке
интерфейсов».
Автор фреймворка
решает проблемы слабой связности модулей
методом переноса кода обработки данных
в узлы хранения данных. А поскольку речь
идет о HTML, то это веб-формы, специальные
атрибуты для элементов HTML и микро-обработчики
этих элементов, написанные на Javascript.
Работает это
так: внутри нужных тегов записываются
специальные атрибуты, в которых указаны
события, на которые надо реагировать и
обработчики для этих событий. Где-то на
странице возникает событие, контроллер
находит все HTML элементы подписанные на
это событие, вызывает обработчик события
для каждого найденного элемента.
Хороший способ
справится с динамической структурой
веб-страницы суть приложения. В том
смысле, если изготавливаемое приложение
задумано как произвольный набор блоков
а не фиксированная структура.
Я одного не
понял — при чем тут «StateController». Контроллер
состояний, это ведь несколько про другое.
Это про
конечные автоматы, нет?
Вполне приличная
работа, можно брать на вооружение, хотя
лично мне претит изготавливать очередной
«Ёксель». В том смысле, что подход,
предлагаемый автором, хорошо себя
проявляет в приложениях, где пользователю
дают некий «эксплорер» а дальше он
продирается через заросли типовых
таблиц и кнопок к решению своей частной
задачи. Типа, надо тебе что-то посчитать,
ну вот тебе Ёксель, вот данные, сиди и
считай.
original posthttp://vasnake.blogspot.com/2013/04/blog-post_26.html
Есть статья, в которой
перечисляются проблемы, возникающие
при использовании табуляции вместо
пробелов
Поскольку использование
табуляции (код 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 posthttp://vasnake.blogspot.com/2013/04/blog-post_25.html
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.
Как
вы думаете, БигДата это сколько терабайт?
Для ЦРУ это все телефонные разговоры +
СМС + посты в Твиттер + посты в Фейсбук
+ данные сенсоров (в первую
очередь с каждого мобильника).
Это экзабайты данных в год. А
еще есть камеры наблюдения, что дает
еще столько же.
Айра Гас Хант
(Ira Gus Hunt), действующий Директор по
технологиям ЦРУ, рассказывает о своем
видении Big Data на службе ЦРУ
Это всё нужно,
чтобы у нас была уверенность в том, что
мы жизнеспособная и конкурентная
организация, устремлённая в будущее.
Это достаточно
простые вещи и они вам хорошо известны,
но безопасная мобильность для нас –
это тема огромной важности. Мобильные
технологии не безопасны. Повторите за
мной: Мобильные технологии не безопасны.
И это действительно так. Каким образом
мы собираемся сделать их безопасными
в нашем окружении, так чтобы мы могли
получить из них пользу? Это серьезная
задача.
Вторая вещь,
приведенная здесь – то, что мы называем
продвинутой аналитикой. На самом деле
мы рассматриваем аналитику как сервис.
Под этим мы понимаем всё, что нам
потребуется делать с Большими Данными
– выполнять работу, необходимую для
поддержания безопасности нашей нации.
Третье, что
у нас есть – виджеты и сервисы. Мы подошли
к этому, используя такую вещь как Ozone
Framework. Ozone – это фреймворк, который
разведывательное сообщество разработало
на базе фреймворка Google. Основная причина,
по которой мы им пользуемся, совпадает
с причинами по которым вы пользуетесь
своими смартфонами, iPad-ами и прочими
штуковинами. Вы можете их персонализовать
и поместить на них всякие разные штучки,
необходимые для вашей деловой или личной
жизни. Нам необходимо создать окружение,
где наши аналитики и операторы и прочие
сотрудники могут разместить необходимый
для них функционал и персонализовать
свой мир. Мы можем назвать её WebTop, или
девайс-топ или как-то ещё, как пожелаете.
Четвертое –
что, кстати, на слайде идёт под номером
три, и я не очень хочу объяснять странности
такой системы исчисления – это длинная
история. Так вот, четвёртое; безопасность
– это сервис. Мы не хотим, чтобы вам
приходилось отстраивать систему
безопасности сверху вниз каждый раз,
когда вы поставляете нам или создаете
для нас новую систему. Нам понадобиться
иметь набор сервисов, и лучшие практики
из мира архитектуры старых сервисов –
все помнят тот мир? Готов поспорить, что
я помню. Это сервисы безопасности, над
которыми на верхнем уровне есть виджеты,
аналитика, общающиеся с сервисами
безопасности в середине, которые
взаимодействуют с инфраструктурой для
вычислений и прочими низкоуровневыми
вещами. Так вот — сервисы безопасности
и прочее имеют много общего между собой,
и мы хотим быть в них уверены, что они
постоянны на всем своем протяжении для
любого лица, имеющего доступ к любому
элементу данных, доступного через любую
аналитическую систему. И эти меры также
должны обеспечиваться через один из
сервисов безопасности.
Пятое –
данные. Я собираюсь поговорить об этом
подробнее, сразу же вспоминается «это
данные, дурачок». У нас есть концепция
использования данных как сервиса и
такое понятие, которые мы назвали ‘бухта
данных’. Бухта данных не совсем четко
очерченное место, но мы планируем там
собрать мощные расчетные движки, подобные
тем, которые вы видели в выставочном
зале. Мы обнаружили (или, по крайней
мере, считаем что это так), что вся
аналитика выше некоторого уровня, часто
пользуется общими наборами больших,
высокопроизводительных расчетных
инфраструктур, скрываемых внутри.
Мы хотим
создать окружение, в котором будут
присутствовать все наши данные и
массивные вычислительные инфраструктуры,
так чтобы для нас было легко отрабатывать
новые идеи или наши новые навыки на
верхнем уровне, приводя в движение то,
что у нас есть внизу. Чтобы делать все
эти вещи, необходимы большие мощности
для вычислений и эта маленькая забавная
штучка называется Облако.
Из бюджета
миллиарды денег в год только на техническое
обеспечение тотальной слежки. И нет
никаких гарантий, что к собранным данным
и результатам анализа не смогут получить
доступ нехорошие люди. «Мы позаботимся
о вас».
Как-то нас уже приучили
к идее, что ботнеты и их владельцы — это
зло. А тут хорошие люди сделали хороший
ботнет и сделали хорошее дело. Нехорошими
средствами, правда, но чего не сделаешь
ради демократии победа все спишет
науки.
Когда анимированная
гифка прогрузится, на ней видно, как
включаются и выключаются хосты по ходу
солнца.
полное сканирование
портов для всех 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.
Казалось бы,
ну что можно сделать десятком-другим
строк кода на Python?
Можно найти
автобус, в котором вы забыли свой
портфель.
Можно найти
улицу и квартал с наибольшим количеством
выбоин на дороге.
Можно определить
— в каких закусочных вас могут отравить.
Много чего
можно.
David Beazley знакомит
нас с возможностями Python по обработке
данных и заодно с наборами данных (CSV,
XML), публикуемых властями Чикаго.
Даже не знаю,
что мне больше понравилось — лаконичность
решений задач или количество доступной
о городе информации.
Что мне точно
не понравилось — это получасовые куски
фильма, в которых
ничего не происходит — народ решает
задачи, Дэвид смотрит, кто как справляется.
Если эти куски вырезать, никто не
пострадает а кино станет заметно
смотрибельнее.
Python & data
statistics and analysis - collections, itertools, panda
Всем известно,
что веб-приложение может отрабатывать
сотни запросов в секунду. Известно,
также, что приличное веб-приложение
обращается к базе данных при ответах
на запрос. Очевидно, что для такого
веб-приложения было бы разумно установить
соединение с БД один раз, при запуске,
к примеру, и пользоваться этим коннектом
во всех запросах.
Однако,
архитекторы Flask так не думают. Упирая
на многопоточность веб-приложения как
на ключевую характеристику Flask, они
предлагают нам открывать соединение с
БД при входе в «контекст» приложения.
При этом, к тому же, происходит подмена
понятий. Во Flask контекст приложения, не
смотря на название, создается для
отработки текущего запроса, после чего
уничтожается. Соответственно,
открытие/закрытие коннекта к БД
происходит, возможно, сотни раз в секунду.
Дикость. Недовольным рекомендуют
обращаться к расширению Flask-SqlAlchemy,
которое поддерживает пулы соединений
с БД.
Я не хочу в
своем микроприложении использовать
макрофреймворк типа SQLAlchemy. Но и
открывать/закрывать коннекты к БД на
каждый чих мне религия не позволяет.
Поэтому я почитал код Flask-sqlalchemy и выдрал
оттуда механизм хранения.
Получился
Flask extension или плагин, называйте как хотите
Позволяет
сохранять данные, коннект к БД, например,
на протяжении жизни всего приложения,
суть головного процесса.
Вполне возможно
я что-то упустил. Но на текущий момент
практика показывает, что модуль работает
нормально. Разве что не надо забывать,
что хранить в таком хранилище стоит
только thread-safe данные.
Вместо того,
чтобы работать что-нибудь полезное,
пишу очередной пост про прикручивание
функции автосохранения и функции
подсветки одинаковых слов (autosave; word
search with highlighting) для очередного текстового
редактора. Сегодня это Eclipse.
В смысле текстовый редактор внутри
Клипсы.
Как говорится,
«из коробки» обе эти функции работают
немного не так, как мне удобно. Мне
удобно, чтобы все открытые файлы
сохранялись при переключении на другое
окно (потеря фокуса); мне удобно, чтобы
при выделении слова все совпадения были
подсвечены.
Чтобы оно
работало именно так, добрые люди написали
плагины к Клипсе.
Где-то
тут у меня пробегало высказывание о
том, что до
сих пор я не нашел такой среды разработки
на 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 начинают работать
подсказки.
Какой я занятой человек,
оказывается. Пять месяцев прошло с того
дня, как я решил превратить заготовку
чат-бота в нечто более завершённое. Пять
месяцев ушло на вколачивание в код 13
таблиц транслитерации и переписывание
160 строк кода самого бота. Просто образец
быстрой работы, хаха.
Разумеется, в
действительности времени было потрачено
всего несколько часов, пять месяцев
проект смирно ждал своей очереди в
недлинном но постоянно пополняемом
стеке моих повседневных дел.
Короче, тадам: представляю
финальную (не планирую ничего менять и
добавлять) версию чат бота
«translit.bot@gmail.com».
Написан на Python, умеет только одно:
переводить кириллицу в латиницу по
13-ти таблицам транслитерации:
Небольшое
добавление к вчерашней статье про Komodo
Edit. Вчера я показал, как включить
подсветку всех вхождений выделенного
слова, сегодня я покажу, как включить
автосохранение редактируемых файлов
при переключении на другое окно.
Редактор Komodo
Editхорош, причем настолько, что
его скорее можно отнести к классу IDE,
нежели к классу редакторов.
Кроссплатформный, бесплатный, гибко
настраиваемый, расширяемый плагинами,
скриптами и макросами, и т.д.
Но есть одно «но».
Несмотря на некоторые заявления, редактор
не умеет подсвечивать все вхождения
выделенного слова в тексте. Комодо умеет
подсвечивать только те слова, которые
«переменные», и то криво. А я к хорошей
подсветке так привык в своем любимом
SciTE, что сильно тоскую,
если приходится писать код в редакторе
не обладающем такой функцией.
Разумеется, решение
есть. Тем и отличается хороший
программерский редактор от нехорошего,
что хороший можно дотачивать под себя
конфигами и скриптами.
Итак, как научить Komodo
Edit подсвечивать все вхождения
выделенного слова.
Я уже неоднократно
упоминал, что мой любимый текстовый
редактор — 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, содержащих обработчики
некоторых событий и возможности
имитировать в скриптах вызовы пунктов
меню редактора.
Для избежания
повторений ознакомьтесь с предыдущей
статьей
Добавьте в
папку со скриптами обработчик события
открытия файла
#/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)
Это два. Кстати,
полный список команд меню можно глянуть
тут
Удивительное
дело, но в этот раз посылка из Британии
была доставлена менее чем за месяц. Если
точнее, то за три недели. Неужто и правда
Урфин настучал своим деревянным солдатам
по котелкам и они зашевелились?
В почтовом
отделении стало чуть меньше народу,
теперь почта не принимает коммунальные
платежи. Правда, по словам почтаря,
«работать некому» - одно окно закрыто,
в другом сидит какая-то торговка и
постоянно повторяет - «я не почтовый
работник». Всего окон четыре.
Но ничего,
минут за 15-20 я добрался до окошка и
получил два своих пакета.
Всем нравится Github,
но не все знают, что можно сделать
свой личный гитхабчик с блекджеком и
т.д.
Представлен релиз
платформы для организации совместной
работы с Git-репозиториями GitLab 5.0. По своим
возможностям GitLab напоминает GitHub, но не
привязана к конкретному сервису,
распространяется в исходных текстах
под свободной лицензией и позволяет
развернуть web-сервис управления проектом
на своём подконтрольном сервере.
...
GitLab поддерживает
создание отдельных проектов, отслеживание
ошибок, обработку запросов на добавление
кода (рабочий процесс основан на обработке
merge-запросов), навигацию по веткам и
тегам, контроль за изменениями,
рецензирование кода, многоуровневое
управление доступом, Wiki, обмен небольшими
кусками кода, наглядный анализ различий
между версиями кода, средства визуализации
ветвления репозитория и многое другое.
...
Параллельно развивается
свободный сервер непрерывной интеграции
GitLab CI, который можно использовать
совместно с GitLab для автоматизации
тестирования и постоянного контроля
за качеством кодовой базы, в том числе
обеспечивая проверку пересборкой для
каждого вносимого изменения.
Конфиг портов
открывали только для посмотреть. Менять
там ничего не пришлось.
Сайт типа такой
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.
Как быть, если надо,
чтобы веб-сервер 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.
Именно такой
я подарил Наташке а заодно и себе. 61
клавиша (можно играть двумя руками) с
чувствительностью к скорости удара
(можно управлять громкостью и
продолжительностью звука), 400 встроенных
тембров (хочешь — оргАн, хочешь —
электрогитара, ...), функции обучения —
сказка а не клавиатура.
Стоит, правда,
неслабо — 9 тыщ рублей. Зато весит менее
4 килограмм. Клавиши имитирующие реальное
пианино стоят от 20 тыщ рублей и весят
гораздо больше. Да и место отнимают
изрядно.
Неприятность
ровно одна — с выключением питания
память клавы обнуляется и все настройки,
сделанные во время сесии, сбрасываются.
Лично мне очень
нравится фунция обучения. Выбираешь
одно из произведений, зашитых в память,
выбираешь руку (или обе) для обучения,
и давишь клавиши, следуя подсказкам на
экране. Азарт подстегивается баллами,
которые тебе выдают за ловкость и
точность игры.
Я за час выучил
первую фразу песенки Twinkle.
Что характерно,
нотную грамоту знать не обязательно.
original posthttp://vasnake.blogspot.com/2013/04/ctk-3200.html
Помню, рубился
я в 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 posthttp://vasnake.blogspot.com/2013/04/duke-nukem.html
Фундамент так просто
не обновишь. Казалось бы, сколько надо
времени, чтобы переписать такой, в
общем-то несложный, сервис как named?
спустя 13 лет
с момента выпуска BIND 9 представил первый
стабильный релиз DNS-сервера BIND 10,
отличающегося кардинальной переработкой
внутренней архитектуры. В отличие от
ранее практикуемой модели реализации
всей доступной функциональности в одном
серверном процессе, в BIND 10 осуществлён
переход к разделению функций по отдельным
взаимосвязанным процессам, каждый из
которых реализует свой сервис. Разделение
по разным процессам позволило рационально
использовать ресурсы многоядерных
систем, расширило возможности
масштабирования, обеспечило изоляцию
отдельных функций и повысило надёжность
Список нововведений и
разных фишек впечатляет. Там и очереди
сообщений, и удаленное управление, и
API для управления и контроля, и
кластеризация, и сборка из модулей
только необходимой функциональности,
и т.д. и т.п.
BIND 10 с
нами еще лет на 15?
original posthttp://vasnake.blogspot.com/2013/04/bind-10.html