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

2013-03-29

WKID 102100 = EPSG 3857

Не все SRID одинаково полезны.

Поскольку страна у нас большая, многие предпочитают хранить свои геоданные в системе координат WGS84. А это градусы широты и долготы, WKID 4326.
Но чтобы эти данные вывести на карту, их надо спроецировать на плоскость. В случае с Esri клиент хочет СК идентифицируемую как WKID 102100. И тут есть одна проблема. В PostGIS нет такого SRID. Даже упоминаний о нем нет — я искал. Как быть?

Гугление предлагает следующие варианты:

из которых более всего по параметрам подходит SRID 3857
select * from spatial_ref_sys where srid = 3857;

EPSG:3857 is a Spherical Mercator projection coordinate system popularized by web services such as Google and later OpenStreetMap.
...
ESRI:102113 - First used by ESRI, but then replaced by 102100 (equivalent, deprecated)
ESRI:102100 - Built differently, but equivalent to 102113 (equivalent, deprecated)
...
EPSG:3857 - EPSG replaced EPSG:3785 with this, and ESRI replaced ESRI:102100 with this (current)


Не знаю о каком-таком deprecated тут говорят, сервера Esri по сей день оперируют WKID 102100.

Короче, при использовании PostGIS в качестве бэкенда для веб-карт Esri (MapFeatureServer), при запросе wkid 102100 надо использовать srid 3857. Без колебаний.

original post http://vasnake.blogspot.com/2013/03/wkid-102100-epsg-3857.html

2013-03-28

Строка меню для сайта, по быстрому

Инструмент называется просто и скромно — Menu Generator. Он пригодится таким веб-мастерам как я, ненавидящим верстку. Ибо пошмыгав мышкой в программе конструкторе мы быстро получим яваскрипт для встраивания в сайт. А больше делать ничего не надо

После того, как вы создали меню в редакторе, его можно скачать в виде ZIP архива. Архив содержит всего одну директорию. В ней лежат изображения и Script.JS файл. Структура меню и CSS стиль находятся внутри JS файла.
Чтобы разместить меню на странице, сначала извлекаем директорию из ZIP архива и кладем её в свой WEB проект. Затем добавляем ссылку на Script.JS файл в хедере страницы и помещаем DIV со специальным ID в то место, где должно отображаться ваше меню. Готово.


Есть разные шаблоны, меню может быть вертикальным или горизонтальным. Для быстрого решения — очень даже неплохо.

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

2013-03-27

Ruby on Rails

Каждый раз как мне в голову приходит мысль освоить RoR, я открываю учебные материалы, гляжу на разнообразные закорючки в синтаксисе Ruby и мысль об освоении куда-то уходит. Может быть, потом, когда-нибудь.

А тем, кого странный синтаксис не беспокоит и хочется изучть RoR, могу рекомендовать блог с напыщенным названием «рубиклаб»

Тама человек над собой ставит эксперимент — изучает Ruby и RoR, ставя себе задачи и выполняя их. Попутно публикует свои экзерсисы.
Чтобы не утонуть в море учебного материала по RoR, можно начать с этого блога. А дальше само пойдет.

original post http://vasnake.blogspot.com/2013/03/ruby-on-rails.html

2013-03-26

OpenStack

Компания IBM объявила о намерении перевести все свои облачные сервисы и облачные продукты на открытую архитектуру, основанную на использовании свободной платформы OpenStack.


И не просто переводит свои сервисы, а изрядно вкладывается в разработку платформы

the new software, called IBM SmartCloud Orchestrator, gives clients greater flexibility by removing the need to develop specific interfaces for different cloud services. With the new software, companies can quickly combine and deploy various cloud services onto the cloud infrastructure by lining up the compute, storage and network resources with an easy-to-use graphical interface
In addition, IBM also announced new versions of software that use open standards to help companies better monitor and control their enterprise cloud deployments. For example, IBM SmartCloud Monitoring Application Insight helps businesses monitor the real-time performance and availability of applications hosted on a cloud and being delivered via the Web, hosted on public cloud platforms and IBM SmartCloud
IBM is applying its experience in supporting and validating open standards from Linux, Eclipse and Apache to cloud computing. Working with the IT community, IBM is helping to drive the open cloud world by:

Creating a 400-member strong Cloud Standards Customer Council that grew from about 50 members at launch;
Sponsoring OpenStack Foundation as a platinum and founding member and as one of the top code and design contributors to all OpenStack projects;
Driving related cloud standards, such as Open Service for Lifecycle Collaboration, Linked Data in the W3C and TOSCA in OASIS, to enhance cloud application portability;
Dedicating more than 500 developers on the open cloud projects and;
Working closely with the OpenStack Foundation, along with its 8,200+ members from 109 countries and 1,000 organizations.

IBM is one of the world’s largest private cloud vendors with more than 5,000 private cloud customers in 2012, which increased 100 percent year-over-year. IBM’s cloud portfolio, called SmartCloud, is based on a common code of interoperability, allowing clients to move between IBM’s private, hybrid and public cloud services.

IBM Orchestrator is expected to be available later this year. IBM SmartCloud Monitoring Application Insight is expected to be available in the second quarter of the year. The analytics beta programs are expected to be available by the end of March.


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

original post http://vasnake.blogspot.com/2013/03/openstack.html

2013-03-25

PostgreSQL Geography

Намедни загружал я шейп-файлы в БД PostgreSQL. По ходу узнал много нового :)
Например, в PostGIS есть тип данных Geography, помимо Geometry

The geography type provides native support for spatial features represented on "geographic" coordinates (sometimes called "geodetic" coordinates, or "lat/lon", or "lon/lat"). Geographic coordinates are spherical coordinates expressed in angular units (degrees).

The basis for the PostGIS geometry type is a plane. The shortest path between two points on the plane is a straight line. That means calculations on geometries (areas, distances, lengths, intersections, etc) can be calculated using cartesian mathematics and straight line vectors.

The basis for the PostGIS geographic type is a sphere. The shortest path between two points on the sphere is a great circle arc. That means that calculations on geographies (areas, distances, lengths, intersections, etc) must be calculated on the sphere, using more complicated mathematics. For more accurate measurements, the calculations must take the actual spheroidal shape of the world into account, and the mathematics becomes very complicated indeed.


The conclusion?

If your data is geographically compact (contained within a state, county or city), use the geometry type with a cartesian projection that makes sense with your data. See the http://spatialreference.org site and type in the name of your region for a selection of possible reference systems.

If, on the other hand, you need to measure distance with a dataset that is geographically dispersed (covering much of the world), use the geography type. The application complexity you save by working in geography will offset any performance issues. And, casting to geometry can offset most functionality limitations.


В двух словах: для огромных территорий, где кривизна глобуса начинает значительно влиять на точность измерений, лучше применять Geography тип данных, ибо система координат исходит из сфероида. Для малых территорий, где погрешность вычислений из-за кривизны глобуса невелика, можно применять планарные СК, тип двнных Geometry.

Кроме того, заявлено, что стандартный тип Geometry автоматом приводится к типу Geography если SRID=4326.

Интересно, когда уже дистанцию начнут считать по эллипсоиду?

Сниппет — как загрузить шейпы в БД PostGIS (updated 2013-04-01)
set path=%path%;c:\Program Files\PostgreSQL\9.0\bin
pushd c:\t\p
chcp 1251

psql -e postgisdb postgres

CREATE ROLE giswriter NOSUPERUSER NOCREATEDB NOCREATEROLE;
CREATE USER mfs WITH password '12345678' IN ROLE giswriter;
CREATE SCHEMA mfsdata AUTHORIZATION mfs;
GRANT ALL ON SCHEMA mfsdata TO mfs;
ALTER USER mfs SET search_path TO mfsdata,public;

revoke mfs from giswriter;
grant giswriter to mfs;
GRANT SELECT ON geometry_columns TO giswriter;
GRANT SELECT ON geography_columns TO giswriter;
GRANT SELECT ON spatial_ref_sys TO giswriter;
commit;
\q

shp2pgsql.exe -c -I -G -W cp1251 patching.shp mfsdata.patching > patching.dump.sql
psql -f patching.dump.sql -e postgisdb mfs

И сцылки по теме

original post http://vasnake.blogspot.com/2013/03/postgresql-geography.html

2013-03-22

Zero Install

Каждому, кто пытается распространять дистрибутивы своих (или чужих :) программ, следует знать про Zero Install

Zero Install, многоплатформенной децентрализованной системы распространения и установки приложений. Zero Install позволяет разработчикам приложений организовать их распространение непосредственно со своих web-сайтов, предоставляя при этом такие возможности как автоматическая установка обновлений, использование единого набора разделяемых библиотек, обработку зависимостей и верификацию источника пакетов по цифровым подписям. В настоящее время с использованием Zero Install уже подготовлено более тысячи пакетов, которые обобщены в едином каталоге-зеркале. Код системы написан на языке Python и распространяется под лицензией LGPL.
Пакеты могут формироваться и распространяться для различных операционных систем, включая дистрибутивы Linux, FreeBSD, Solaris, Mac OS X и Windows. При этом Zero Install не ставит перед собой цели заменить уже используемые в системе средства управления пакетами, а лишь дополняет их и не пересекается с ними в работе. Zero Install не определяет новый формат пакетов, а манипулирует обычными tar.gz- или zip-архивами, поставляемыми в сочетании с мета-данными в формате XML
В Zero Install поддерживается ряд возможностей, не свойственных обычным локальным системам управления пакетами. Например, поддерживается одновременная установка разных версий одной программы. Для работы не требуются привилегии суперпользователя (приложения устанавливаются в домашнюю директорию пользователя). Каждая программа устанавливается в свою поддиректорию, что упрощает организацию различных chroot-окружений и изолированных контейнеров. При этом данные каталоги рассматриваются как кэш и могут быть легко удалены после того как в программе больше нет необходимости.
Поддерживается быстрая установка ещё не вышедших экспериментальных версий программ, например, можно установить приложение на основании среза Git-репозитория, без какой-либо правки созданных для релиза метаданных. Для контроля целостности и проверки валидности источника приложения используется система цифровых подписей.
Из добавленных в новой версии новшеств отмечаются возможность использования штатных пакетных менеджеров для доустановки необходимых зависимостей. Если для пакета требуется доустановить зависимости, то они будут установлены в первую очередь из основного репозитория дистрибутива


Достойная вещь. В мемориз. Жаль, чувствуется сильная заточка на Linux, виндопользователям доступно не так много пакетов.


original post http://vasnake.blogspot.com/2013/03/zero-install.html

2013-03-21

Крабе

Как раб на галерах.

кластерной СУБД MariaDB Galera, базирующейся на кодовой базе MariaDB и технологиях синхронной multi-master репликации Galera.
...
продукт расширяет возможности СУБД MariaDB, ... средствами для организации синхронной репликации данных между несколькими узлами (применяется топология active-active multi-master, допускающая чтение и запись для любого узла). При синхронной репликации все узлы всегда содержат актуальные данные, т.е. гарантируется отсутствие потерянных транзакций, так как транзакция фиксируется только после распространения данных по всем узлам. При этом, в рамках транзакции операции выполняются сразу, задержка из-за ожидания подтверждения возникает только при выполнении операции "commit". На разных узлах транзакции могут выполняться в параллельном режиме. При выполнении транзакции обеспечивается гарантированная неизменность состояния кластера в целом, независимо от других выполняемых в данный момент транзакций.
...
Управление принадлежностью узлов кластеру выполняется автоматически, сбойные узлы сразу исключаются из кластера без участия администратора, новые узлы при необходимости можно подключить на лету без дополнительной переконфигурации. Кластер может быть территориально распределён на несколько дата-центров, при этом для клиента обеспечивается минимальная задержка - при размещении узлов в непосредственной близости от клиента, все операции чтения и записи будут выполняться с максимальной скоростью, задержка будет ощущаться только при выполнении коммитов транзакции.


Отказоустойчивый территориально распределенный кластер БД, опенсорц. Только успевай узлы заменять и добавлять. Прямо сказка какая-то. Интересно будет почитать про ограничения — ну там индексы не всякие, типы данных только такие-то, хранимые процедуры низзя может быть?
Очень достойное решение, судя по пресс-релизу.

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


2013-03-20

Big data

В этом году Пасха приходится на 31 марта для «западных» церквей и на 5 мая для ортодоксальных — греческой и русской.
Если верить Википедии

древнейший христианский праздник; главный праздник богослужебного года. Установлен в честь воскресения Иисуса Христа. В настоящее время его дата в каждый конкретный год исчисляется по лунно-солнечному календарю
Общее правило для расчёта даты Пасхи: «Пасха празднуется в первое воскресенье после весеннего полнолуния». Весеннее полнолуние — первое полнолуние, наступившее после дня весеннего равноденствия
Расхождение между датами православной Пасхи и католической вызвано различием в дате церковных полнолуний, и разницей между солнечными календарями (13 дней в XXI веке). Католическая Пасха в 30% случаев совпадает с православной, в 45% случаев опережает ее на неделю, в 5% — на 4 недели, и в 20% — на 5 недель. Разницы в 2 и в 3 недели не бывает


Бедлам, как еще выразить наличие двух календарных дат Пасхи при основополагающем постулате «первое воскресенье после первого, после весеннего равноденствия, полнолуния».
Ох уж эти верующие, ох уж эти догматики. Кстати, есть прекрасный фильм на эту тему, так и называется - «Догма» - Dogma (1999). Причем в одной из ролей снялся небезызвестный хулитель George Carlin.

В Linux есть специальная команда, показывающая даты Пасхи
ncal -e; ncal -o


Но, вообще-то, Big data — это не про Пасху. Про календарную дату навеяло словом «data».

Big data — это нынче у нас про Hadoop, MapReduce и ArcGIS. Анализ и расчет геоданных используя математику из ArcGIS реализованную на Java в технике MapReduce, и хранилище Hadoop:

The storage of BigData has been democratized by Hadoop. And with that, rather than bringing the data to the program for analysis, we send the program to the data. That twist comes with a challenge to take existing serial algorithms and parallelizing them. This post is about such a process. I want to perform a Kernel Density analysis on billions of records loaded into HDFS


Очень познавательно.
Предыдущая заметка на тему


original post http://vasnake.blogspot.com/2013/03/big-data.html

2013-03-19

PostgreSQL

Говорят, что Instagram использует DBMS PostgreSQL. И не просто использует, а в хвост и гриву. В связи с этим очень любопытно ознакомиться с опытом инженеров Instagram:

Частичные индексы (Partial Indexes)
Если вы часто используете в ваших запросах фильтры по конкретной характеристике, и эта характеристика представлена в меньшей части строк вашей базы, частичные индексы могут вам серьезно помочь.
...
Функциональные индексы (Functional Indexes)
Для некоторых из наших таблиц, нам нужно индексировать строки (например, 64-символьные base64 токены), довольно длинные, для того, чтобы создавать по ним индекс — это выльется в дублирование большого количества информации. В этом случае очень полезны могут быть функциональные индексы Postgres'а:
CREATE INDEX CONCURRENTLY on tokens (substr(token, 0, 8))
...
pg_reorg для сжатия
По прошествии какого-то времени, таблицы Postgres могут быть фрагментированы на диске (из-за конкурентной модели MVCC Postgres'а, например). Также, чаще всего, вставка строк осуществляется не в том порядке, в котором вы хотите их получать. Например, если вы часто запрашиваете все лайки, созданные одним пользователем, было бы неплохо, если бы эти лайки были записаны на диске непрерывно, чтобы минимизировать поиски по диску.
...
WAL-E для архивации и бекапов WAL
Мы используем и вносим свой вклад в разработку WAL-E, набор инструментов платформы Heroku для непрерывной архивации WAL (Write-Ahead Log) файлов Postgres.
...
Режим автокоммита и асинхронный режим в psycopg2
Через какое-то время мы начали использовать более продвинутые возможности psycopg2, Python-драйвера для Postgres.
Первая — это режим автокоммита (autocommit mode). В этом режиме psycopg2 не требует BEGIN/COMMIT ни для каких запросов, вместо этого каждый запрос запускается в отдельной транзакции. Это в особенности полезно для запросов выборки из базы, для которых использование транзакций не имеет смысла.
...
Другая полезная возможность в psycopg2 — это возможность регистрировать wait_callback для вызова подпрограмм. Ее использование позволяет делать параллельные запросы по нескольким соединениям единовременно, что полезно для запросов, затрагивающих множество нод
...
В общем и целом, мы очень удовлетворены производительностью и надежностью Postgres'а.



Не менее интересная статья, хотя и без перевода:
Чтобы знать, как мы горизонтально масштабируем Postgres, смотрите наш пост Sharding and IDs at Instagram

PostgreSQL рулит реально.

original post http://vasnake.blogspot.com/2013/03/postgresql.html

2013-03-18

64 vs 32

Страшная история

Кто бы мог подумать, что настроить совместную работу ArcGIS 10.1 с БД PostgreSQL будет так непросто. Времени ушло несколько часов, почти весь рабочий день.
Не так давно я уже рассказывал про грабли, разложенные на пути тех, кто хочет связку ArcGIS 10 + PostgreSQL, но то были цветочки. Теперь ESRI продает новую версию АркГИС — 10.1, в ней очень много изменений, даже по сравнению с 10.

Короче, ближе к телу. Мне понадобился ArcGIS Server 10.1 и БД обеспечивающая функциональность Feature Service. В качестве БД я выбрал PostgreSQL.
ArcGIS Server нынче существует только в версии x64, поэтому связка получилась такая
MS Windows 2008 x64; PostgreSQL 9.0.12 x64; ArcGIS Server 10.1 x64 + Web Adapter + SP1.
Все 64-битные.
Поставил эту троицу, читаю инструкцию по установке SDE. Там написано:

Before you install
You must install a database and create a geodatabase in it before you set up an ArcSDE service. Use the Create Enterprise Geodatabase geoprocessing tool, the Enable Enterprise Geodatabase geoprocessing tool, or a Python script to create a geodatabase before installing the application server and setting up a service. See the ArcGIS for Server or ArcGIS for Desktop documentation for instructions on creating a geodatabase.

Я это понял так, что перед установкой SDE мне надо «создать геодатабазу» внутри PostgreSQL. Для этого нужен либо ArcGIS Desktop либо некий скрипт Python. Поскольку мне понадобится потом ArcCatalog по любому, я решил, что следующий шаг будет — установка ArcGIS for Desktop.

ОК, установил ArcGIS Desktop, запустил ArcCatalog, нашел Toolbox tool «Create Enterprise Geodatabase».
Запускаю...
облом с сообщением типа:

Executing: CreateEnterpriseGeodatabase PostgreSQL localhost postgisdb DATABASE_AUTH postgres ***** SDE_SCHEMA sde ***** sdetabspace C:\ags101.ecp
error: Cannot connect to database because the database client software failed to load. Be sure the database client software is installed and configured correctly.
Failed to execute (CreateEnterpriseGeodatabase).

ArcCatalog не хватает библиотек для работы с PostgreSQL. Недолгое гугление выдало следующие статьи

Требования к базе данных PostgreSQL для ArcGIS 10.1 http://resources.arcgis.com/ru/help/system-requirements/10.1/index.html#//015100000075000000
Где написано, где искать эти библиотеки:

You can obtain DBMS client installations from the DBMS vendor or download them from the Esri Customer Care portal.

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


The files are libeay32.dll, libintl.dll, libpq.dll, and ssleay32.dll

Эти файлы нашлись в папке bin внутри установленного PostgreSQL. Ну, думаю, дело в шляпе. Скопировал их куда надо — в папку bin внутре установленного ArcGIS Desktop, запускаю опять тулбокс...
Тот же облом — не находит клиентские либы.

На этом этапе я потерял очень много времени из-за ошибочного постулата by default. Я пихал в ArcGIS Desktop библиотеки из 64-битной версии PostgreSQL, предполагая по умолчанию, что раз уж у меня всё 64-битное, то и ArcGIS Desktop тоже 64-битный. Авотфиг. ArcGIS Desktop вполне себе 32-битный и библиотеки ему надо тоже 32-битные.

Пришлось на другой машине скачать PostgreSQL 9.0.12 уже 32-битный, поставить его и найти в нем файлы libeay32.dll, libintl.dll, libpq.dll, and ssleay32.dll
Нашел, скопировал, разместил в bin ArcGIS Desktop, запускаю тулбокс...
Опять облом. Вот тут я разозлился. Думаю, матьвашузаногу, чего еще вам, уродам из ESRI надо?
Короче, хоть я очень давно уже не сталкивался с проблемами dll hell, но вспомнил — есть прекрасная тулза - Dependency Walker http://www.dependencywalker.com/
С ее помощью я выяснил, от каких библиотек зависит 32-битная либа libpq.dll. Это оказались
libpq.dll
ssleay32.dll
libeay32.dll
libintl-8.dll
libiconv-2.dll

Видно разницу, да? 5 файлов а не 4, как сказано в документации. На этот раз, после докладывания недостающего файла, тулбокс сработал как положено.

Итак, совет — при установке ArcGIS Desktop 10.1 + PostgreSQL найдите в подходящем дистрибутиве (http://www.enterprisedb.com/products-services-training/pgdownload#windows) PostgreSQL x32 библиотеку libpq.dll и с помощью Dependency Walker найдите все ее зависимости.

Фух, пол дела сделано. Далее в инструкции (http://resources.arcgis.com/en/help/main/10.1/index.html#//002p00000001000000) написано:

Copy the st_geometry library to the PostgreSQL installation directory.
The st_geometry.dll file for use with PostgreSQL 9.0 can be found in the DatabaseSupport directory of your ArcGIS client installation directory. Move the st_geometry.dll file from the ArcGIS client to the PostgreSQL lib directory on your PostgreSQL server.

То есть, взять либу
c:\Program Files (x86)\ArcGIS\Desktop10.1\DatabaseSupport\PostgreSQL\Windows64\st_geometry.dll
и положить ее в папку
c:\Program Files\PostgreSQL\9.0\lib\
Тут, пока свежа память о поиске недостающих dll, я сразу применил Dependency Walker. Оказалось — не зря. Эта либа требует еще пачку:
msvcp90.dll
msvcr90.dll
msvcm90.dll
Microsoft.VC90.CRT.manifest

Благо, они нашлись где-то внутре системы и не пришлось их добывать из интернету.
Этот пакет я закинул, на всякий случай, не только в папку lib, но и в bin внутри PostgreSQL.

Далее, после того как создана геодатабаза, я сделал коннект к БД в ArcCatalog. Как описано тут:

Попытался скопировать данные слоя из файловой GDB в PostgreSQL, используя этот коннект... Обратно облом. Но на этот раз все оказалось проще. В контекстном меню ArcCatalog для этого коннекта нашелся пункт, забыл точное название, что-то вроде «Enable geodatabase» или вроде того. После его применения геобаза в PostgreSQL стала доступна для ArcCatalog и я смог скопировать в БД нужные слои.

На этом у меня кончился рабочий день и начались водопроводные работы. Кран у меня на кухне сломался, я его менял. Тоже не без приключений.
Так что, про ArcGIS 10.1 и PostgreSQL пока всё. Остальное, если будет нетривиально, напишу позже.

original post http://vasnake.blogspot.com/2013/03/64-vs-32.html

2013-03-14

AOP

Аспектно ориентированное программирование.
Хорошая статья на хабре, доступно и достаточно подробно обьясняющая «зачем это надо» и «как это делается».

В реальной жизни есть очень много нюансов во взаимодействии объектов, которые трудно представить в ООП: очередность выполнения взаимосвязанных действий у разных объектов, временная логика явлений, необходимость выполнять дополнительные действия при выполнении конкретного действия с объектом. В жизни это описывается в виде советов и рекомендаций: «мойте руки перед едой», «чистите зубы после еды», «перед выходом из дома — отключите свет» и других. Эти действия непросто описать с помощью методов: нужно использовать различные декораторы для классов, либо явно вносить логику взаимодействия в сам метод объекта. И в том, и в другом случае эти правила нельзя удобно формализовать в виде кода с помощью стандартных средств — и это приводит к усложнению системы и к более тесному связыванию компонентов.

Как можно решить данную проблему?
Решение этой проблемы было изобретено давно — дополнить существующую модель ООП некоторым расширением, которое позволит описывать такие взаимодействия формально. Было проведено исследование группой инженеров Xerox PARC, в результате которого они предложили новую парадигму - аспектно-ориентированное программирование. Суть идеи проста — позволить программе взглянуть на себя «со стороны» с помощью механизма рефлексии и при надобности — провести изменение конечного кода. Имея возможность изменять конечный код, АОП получает неограниченный доступ к созданию хуков в любом месте кода и к расширению этого кода с помощью советов.


В качестве ликбеза — статья обязательна к прочтению.

original post http://vasnake.blogspot.com/2013/03/aop.html

2013-03-13

MapFeatureServer

К сегодняшнему дню уже сформировался каркас для сервера фичалейеров. Возник вопрос, а какое название дать проекту?
После непродолжительного гугления стало ясно, что слово «mapfeatureserver» в интернетах не встречается. Поэтому, отныне станешь стеклянный проект будет называться «mapfeatureserver» aka «MapFeatureServer» aka «Map Feature Server». На русском языке название придумывать не хочу.

Этот пост будет доказательством моего приоритетного права на название «mapfeatureserver» и его вариаций.

Концепция проекта Mapfeatureserver заключается в том, чтобы, создав специальную серверную программу, дать возможность пользователям разных вьюверов, типа Картобонус (Cartobonus), добавлять в свои карты слои данных (Feature Layer) из любых источников, не только с серверов ArcGIS.
Для реализации задуманного, mapfeatureserver должен реализовать спецификации
одним из примеров реализации которых является «родной» сервер ArcGIS, к примеру

Оставайтесь с нами, будем посмотреть, как оно пойдет.

original post http://vasnake.blogspot.com/2013/03/mapfeatureserver.html

2013-03-12

ОЗПП

В продолжение истории про деньги, украденные ОАО Альфа-банк.
К сегодняшнему дню уже должен был появиться ответ на нашу претензию к банку, по поводу 1239 рублей, жульнически забранных банком с моего счета в уплату услуг за 2013-2014 год. И я пошел разузнать, что-как.

Напоминаю, для тех, кто не хочет читать предыдущую серию. 28 февраля 2012 года я подписал с банком договор на год обслуживания и заплатил причитающуюся комиссию. Тут банк, в лице менеджера, поимел меня первый раз, но сейчас не об этом. 28 февраля 2013 года я разорвал отношения с банком, закрыв все счета. Но это не помешало банку взять плату за второй год обслуживания. На возврат этих денег мы, я и служащий банка, составили претензию с целью вернуть неправедно отобранные деньги. И вот, пришел срок расплаты.

Если кратко, ОАО Альфа-банк, в лице неизвестного (пока) менеджера, поимел меня еще раз, отказавшись вернуть деньги. Напоминаю, деньги взятые за услуги, оказать которые банк мне не в состоянии по определению – контракт разорван.

Сотрудники банка, с которыми я разговаривал, очень этому факту удивились, позвали старшего смены. Старший вынес вердикт – претензия была составлена неправильно. Надо составить правильно, с упором на 28 февраля. Ладно, составили правильно. Теперь еще пару недель ждем решения по новой претензии.

Я вот думаю, не натравить ли на этих жуликов ОЗПП. По статье типа «оплата услуг заведомо не оказуемых», как-то так.

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

2013-03-11

Hacking Plone

Вот, допустим, сделали вы когда-то content type в Plone. И, так уж вышло, не предусмотрели в нем поведения контейнера. А потом вдруг понадобилось добавить это поведение в этот тип.

В статье приводится хакерский (в хорошем смысле) способ обновления типа данных в Плоне

A workaround that seems working to me is to detach the object from the ZODB, switch the class and put the object back in place, like shown in here:
(pdb) obj = portal['example-1']
(pdb) del portal['example-1']
(pdb) obj
<Item at /Plone/example-1>
(pdb) from plone.dexterity.content import Container
(pdb) obj.__class__ = Container
(pdb) portal['example-1'] = obj
This is unorthodox for sure, but for the time being it proved to be a working solution without side effects.
...
The techniques described in this post are for sure interesting and powerful, but I would not rely on such low level tricks for routine operations, i.e. they are useful for doing migration or management scripts but definitely not suited for a browser view!


Статья рекомендована тем разработчикам, кто нацелен на глубинное понимание происходящего в Plone/Zope.

original post http://vasnake.blogspot.com/2013/03/hacking-plone.html

2013-03-07

Size charts

Намедни покупал на eBay трапеции — windsurfing waist harness.
Оказалось, что угадать с размером очень не просто. В основном потому, что в описаниях товара нет таблички с размерами в сантиметрах или дюймах. Можно выбрать трапецию S/M/L/XL, но сколько это в дюймах — тайна покрытая мраком.
Пришлось довольно долго гуглить. В процессе выяснилось, что у разных производителей разная раскладка обозначений S/M/L/XL по дюймам/сантиметрам.

Ладно, не буду больше томить, вот нужный мне size chart для разных windsurfing waist harness
Brand
Size 32/34 inch
Size 36/38 inch
M
XL
L
XL
M
XL
Может, кому еще пригодится.

А, еще отдельная непонятка была в выборе — если у меня пузо 89-91 см, что дает 35-36 дюймов, то мне нужен размер 36/38 или 34/36? Когда катался, брал 36/38 и было вроде нормально.

original post http://vasnake.blogspot.com/2013/03/size-charts.html


2013-03-06

Meteor runs on Node.js

Node.js продолжает набирать популярность. Нас, гиков, хлебом не корми а дай новую необычную игрушку попробовать. А уж если она многообещающая, то можно не только хлеба не давать а и водой не поить :)

Meteor is a very powerful Javascript framework: this short article demonstrate how to install, configure and create your first application using "Meteor"
Meteor uses MongoDB, through Javascript API called "collection"
Basically, file are structured in three folders:
client
server
public.
All files in client directory are served only to clients (server doesn't know about them), files in public are resources most of the time, i.e. images. Server directory serves data to server. Everything outside those folders is shared between clients and server (it would be a good place to put scripts or templates to run on both, server and client


Очень заманчивый набор фич у Метеора:
прозрачный обмен данными с БД и обновление страниц; компенсация задержек в канале связи; доставка в браузеры новых версий кода и проч.

По теме

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


original post http://vasnake.blogspot.com/2013/03/meteor-runs-on-nodejs.html

2013-03-05

Лишние люди

Интересный взгляд на то, почему любое дело сталкивается с мильёном препятствий и рогаток:
С одной стороны рекламщики и маркетологи самоотверженно трудятся чтобы создать потребность в новомодных гаджетах, с другой стороны кто-то их производит, с третей — в поте лица зарабатывают деньги на их приобретение.
То же самое происходит с государственными организациями. Государство нанимает чертову прорву чиновников, единственная цель существования которых — создать трудности населению и бизнесу и заставить их нанимать более-менее выскооплачиваемых специалистов чтобы эти трудности преодолевать.

Это потому, что у нас слишком много лишних людей:

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

И ладно бы, если бы мы умели пристраивать этих лишних. Но мы не умеем

Причина данного вывиха в устройстве общества, заключается в том, что это общество не умеет социализировать бездельников. Человек, который получает деньги ни за что, очень скоро становится в позицию «мне все должны». Человек, который делает работу, пусть даже не то что ненужную, а объективно вредную, как рекламщик или сотрудник Госнаркоконтроля, оказывается связан с обществом миллионом нитей и оказывается лояльным членом этого общества.


Да уж. Слишком хорошо живем, на еду хватает всем и еще остается. Расплодились.
Можно только добавить, что ситуация не уникальна. Человечество никогда не использовало свои возможности эффективно. Человеческий социум развивается используя эволюционные механизмы, а они далеко не так эффективны, как нам бы хотелось. КПД очень низкий. А те, кто пытается эволюцию поправить, подняв эффективность, приходят к войне в том или ином виде.

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

2013-03-04

Кому нужна свобода, если есть сила?

В конце шестидесятых прошлого столетия в одной из школ был произведен прелюбопытнейший социальный эксперимент

К концу дня в организацию было принято более двухсот учеников. Многие отнеслись к своему участию в Третьей Волне с полной серьезностью. Они требовали от других учеников строгого соблюдения правил и запугивали тех, кто не принимал эксперимент всерьез.
...
... Джонс говорил о том, что такое гордость. "Гордость - это нечто большее, чем знамена и салюты. Гордость - это то, чего у вас никто не может отнять. Быть гордым - значит знать, что ты лучший... Это чувство нельзя уничтожить..." Он объяснил ученикам, что они — часть общенациональной молодёжной программы, чьей задачей являются политические преобразования на благо народа. "Все, что мы до сих пор делали, было подготовкой к настоящему делу. По всей стране преподаватели набирают и тренируют молодежные отряды, которые с помощью дисциплины, общности, гордости и действий могли бы показать нации, что общество может стать лучше. Если мы сможем изменить порядки в этой школе, то мы сможем изменить порядки на фабриках, магазинах, в университетах и во всех других организациях. Вы - избранная группа молодых людей, которые помогут этому делу.

В пятницу 200 учеников набились в кабинет. Не было ни одного свободного места. Всюду висели знамена Третьей Волны. Ровно в двенадцать часов Джонс закрыл двери и выставил у каждой по часовому. Друзья Джонса изображали фотографов, кружа по аудитории. "Перед тем, как включить национальную пресс-конференцию, которая начнется через пять минут, я хочу продемонстрировать прессе, как мы подготовлены". С этими словами учитель отдал салют. В ответ сразу же автоматически взметнулось двести рук. Тогда он произнес девиз "Сила в дисциплине". Его повторил многоголосый хор. Девиз произносили снова и снова. С каждым разом отклик толпы становился все громче


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

Из Википедии

The psychology involved has been extensively studied in terms of youth gang behaviour and peer pressure, of which this experiment was a variant. There have been many analogies to youth terrorist organisations in Africa and the Middle East, organised by similar methods, in addition to the original Hitler Youth movement (on which the experiment was modeled).



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

2013-03-01

Кролики — это не только ценный мех

Кролики
Кроли это не только ценный мех, но и шерсть, когти и молоко!

Другая цитата

Redis не только супер быстрое key-value storage! (хотя этого у него не отберешь). Встроенные типы данных дают возможность решать с помощью Redis-а те задачи, с которыми очень трудно справиться при использоваии других хранилищ (а иногда и тех задач, которые классически выполняются совсем не хранилищами данных). В этой заметке описано несколько ситуаций из реальной практики разработки, когда Redis неожиданно становился просто-таки спасением


Заманчиво, конечно, воспользоваться такими легкодоступными фишками.

Генерирование уникального ID
Рейтинг...
* Какие 100 игроков имеют максимальное количество очков? (а первые 1000? а с 100 по 200 для пейджинга?)
* На каком месте в рейтинге сейчас находится конкретный игрок?
* Какие 100 игроков имеют максимальное количество очков за вчерашний день?
Скажу сразу, на все эти вопросы может ответить и MySQL. Реально может. В первом случае это ORDER BY + LIMIT, во втором - COUNT(id) + WHERE score > ( SELECT score WHERE id = id ). Но. Это все тяжелые и медленные запросы
Операции, связанные с анализом временных промежутков
* при получении новой точки, смотрим текущий маршрут
* достаем из этого маршрута последнюю точку
*десериализируем, вычисляем разницу по времени
* если времени прошло меньше, чем нужно - добавляем, больше - новый маршрут
И эта схема вполне себе будет работать. Но можно ее значительно упростить и ускорить, передав ответственность за вычисление разницы по времени на Redis! Как? Обычным Expire. Установим время жизни ключа текущего маршрута в 300 секунд, а потом просто будем "спрашивать" у Redis-а: существует или нет текущий маршрут


Вполне заковыристую логику можно реализовать, пользуясь фишками Redis.

original post http://vasnake.blogspot.com/2013/03/blog-post.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)