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

2013-07-31

mr.developer

Как мы все знаем, Plone собирается через buildout из десятков или даже сотен (не считал, но их реально много) пакетов. Большая часть этих пакетов доступна на PyPI, но что делать, если надо включить собственный пакет, из Github?

К примеру, я хочу включить в сборку Plone свой пакет локализации.

Есть, как минимум, два способа поучаствовать в buildout для пакетов с Github. Первый — с использованием «mr.developer». Вот так выглядит файл buildout.cfg с включенным кастомным пакетом из гитхаба:
[buildout]
...
eggs =
...
    customplone.app.locales
…
zcml =
    customplone.app.locales
…
extensions = mr.developer 
auto-checkout = customplone.app.locales
always-checkout = true
[sources] 
customplone.app.locales = git git://github.com/vasnake/customplone.app.locales branch=clubwindsurf
…
[instance]
...
environment-vars = zope_i18n_compile_mo_files true

Второй способ, как мне кажется, несколько проще, ибо не требует никаких mr.developer-ов. Заключается он в правильном задании параметра find-links:
[buildout]
…
find-links += 
    http://dist.plone.org/release/4.3.1 
    https://github.com/vasnake/customplone.app.locales/tarball/clubwindsurf/customplone.app.locales-4.3.2.dev1.tar.gz 
...
eggs =
...
    customplone.app.locales
…
zcml =
    customplone.app.locales
…
[instance]
...
environment-vars = zope_i18n_compile_mo_files true
…
[versions] 
...
customplone.app.locales = 4.3.2.dev1 
Подробности см.в


original post http://vasnake.blogspot.com/2013/07/mrdeveloper.html

2013-07-30

Глиссирование

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

По инструкции Джема Холла — лучше один раз увидеть чем 10 раз прочитать:
http://www.4wind.su/kak-vstat-v-petli.html


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

2013-07-29

attributes = collections.OrderedDict()

Сейчас я вам открою тайну: в ArcGis Viewer for Silverlight есть глупая бага. При выводе табличных данных в grid нельзя допускать пустых значений в первой колонке.

Сколько я времени убил на эту багу — ужас. В эталонном примере окно фильтра данных работает — показывает атрибутивные данные слоя, а для слоя из Mapfeatureserver окно фильтра крутит песочные часы вместо вывода таблички. Чего я только не перепробовал, какие только гипотезы не проверял, все бестолку. А оказалось — примитив, если в первой колонке данных попадаются значения «null», то табличка не выводится. В эталонных примерах первой колонкой всегда идет OBJECTID, который по определению не может быть пустым. Поэтому проблема вывода атрибутики в табличку никогда не проявляется.
Вот так выглядит нормальное окно, grid заполнен данными.

В Mapfeatureserver я использую словари Python из которых генерируется текст JSON. Использование словарей означает произвольный порядок вывода ключей, если не применять сортировку. Казалось бы, порядок следования ключей в словаре не имеет значения. Во всяком случае, в спецификации это никак не оговорено. Ан нет. значение есть и весомое.

Короче, от сортировки ключей пришлось отказаться, а для обьекта attributes я теперь использую collections.OrderedDict. Это позволяет выводить ключи в JSON в том порядке, в каком они добавлялись в словарь. Что позволяет управлять очередностью полей в выдаче путем формирования запроса SQL, где поля перечислены в нужном порядке.

Пример:
        attributes = collections.OrderedDict()
        geometry = {}
        for colnum, col in columns(cur.description):
            fldname = unicode(col.name).lower()
            if fldname == u'shape':  # geometry
                shape = simplejson.loads(rec[colnum])
                geometryType, geometry = esri.geoJson2agJson(shape)
                continue

            if fldname == lyrinfo.geomfield:
                continue
            if fldname not in lyrinfo.fields:  # unknown field
                ufields[fldname] = ''
                continue

            attributes[lyrinfo.fields[fldname]['name']] = rec[colnum]


Неправильно:
"features": [
    {
      "attributes": {
        "descr": null,
        "gid": 1,
        "ptchlenght": 3,
        "pthcdeptht": 5,
        "regdaterec": "2012.07.23",
        "regdaterep": null,
        "roadcarpet": "Асфальт",
        "testtimestamp": null
      },
      "geometry": {
        "x": 36.49966537,
        "y": 52.88048986900003
      }
    },

Правильно:
"features": [
    {
      "attributes": {
        "gid": 1,
        "descr": null,
        "ptchlenght": 3,
        "pthcdeptht": 5,
        "regdaterec": "2012.07.23",
        "regdaterep": null,
        "roadcarpet": "Асфальт",
        "testtimestamp": null
      },
      "geometry": {
        "x": 36.49966537,
        "y": 52.88048986900003
      }
    },


original post http://vasnake.blogspot.com/2013/07/attributes-collectionsordereddict.html

2013-07-25

Docker

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

был анонсирован новый интересный Open Source-проект в области легковесной виртуализации для операционной системы GNU/Linux — Docker.
...
Продукт позиционируется как фундамент для создания автоматизированных распределённых систем, таких как масштабируемые инсталляции с веб-инфраструктурой, кластерные инсталляции баз данных или частные PaaS-решения. Исходный код Docker написан на языке программирования Go, распространяется на условиях свободной лицензии Apache License v2 и опубликован на GitHub.


Docker is an open-source engine which automates the deployment of applications as highly portable, self-sufficient containers.
...
Docker is an open-source implementation of the deployment engine which powers dotCloud, a popular Platform-as-a-Service.


Docker is an open-source project to easily create lightweight, portable, self-sufficient containers from any application. The same container that a developer builds and tests on a laptop can run at scale, in production, on VMs, bare metal, OpenStack clusters, public clouds and more.


Контейнерная виртуализация противопоставляется виртуальным машинам — контейнерам наглухо изолированным от хоста и тяжелым. Но и тут есть интересные компромиссы

Для начала расскажу, для чего нужна SmartOS. Если коротко, её предназначение – быть хост-системой для виртуальных машин. Она часто используется как основа для публичных и частных облаков, например, облачных служб Joyent и MITAC. Службой Joyent пользуется LinkedIn: вся его мобильная серверная часть сделана на Node.js, который запущен в облаке Joyent....
Типичные случаи применения SmartOS – системы для ЦОДов, системы для разработки и эксплуатации нагруженного веб-приложения, платформа для создания приватного или публичного облака.
...
В этой статье я рассматриваю только вариант с гостевыми системами под управлением SmartOS. В них реализуется легковесная виртуализация (то же самое, что зоны в Solaris и нечто похожее на клетки во FreeBSD), и, стало быть, для их работы не требуется KVM, который поддерживается только на физических компьютерах.



Даешь контейнеров виртуализации, хороших и разных. И побольше, побольше.

original post http://vasnake.blogspot.com/2013/07/docker.html

2013-07-24

Plone 4.3 on CentOS 6.4

Сегодня я покажу как установить Plone 4.3 на оп.систему CentOS 6.4.
В Сети есть достаточно материалов на эту тему, но, как обычно, на текущий момент эти материалы несколько потеряли актуальность.

Почему CentOS? Ну, например, потому, что провайдеры хостинга VPS очень любят эту ОС. Или потому, что в ней firewall включен изначально. Или потому, что для Debian было бы проще, но мы трудностей не боимся.

Поехали.

Делай раз: установим CentOS в Virtualbox.

Скачиваем исошник системы куда-нибудь на хост, да хоть в папку Desktop:

Создаем вирмашину с 512 мегабайт оперативки, 2 ядра, диск 80 Гб. Сетевой интерфейс «bridged». Стартуем виртмашину с загрузкой из вышеупомянутого исошника, ставим систему.
По ходу выбираем «Installation Method: URL» и вписываем

После установки, свежую систему надо доточить напильником.
su -l
yum check-update
yum update
yum install nano
nano /etc/hostname
 deploy # для моего случая имя машины было «deploy.nhome.net»

nano /etc/hosts
 127.0.0.1 localhost deploy deploy.nhome.net

nano /etc/sysconfig/network
 HOSTNAME=deploy.nhome.net

# адрес брался из DHCP
nano /etc/sysconfig/network-scripts/ifcfg-eth0
 DHCP_HOSTNAME=”deploy”

service network restart

# непривилегированный пользователь, для одного из вариантов установки Plone и пр.
useradd valik
passwd valik

yum install dkms gcc make kernel-devel
mount /dev/cdrom /mnt 
pushd /mnt 
bash VBoxLinuxAdditions.run

# видно, что ssh доступен а более нет ничего
netstat -tulnpv

Система поставлена, обновлена, сеть настроена, Virtualbox GuestAdditions установлены, можно подключаться по ssh.

Чтобы упростить/защитить подключение по ssh, надо завязаться на ключи.
На своем хосте (_не_ в гостевой машине!) настраиваю ключи:
su -l valik
ssh-copy-id valik@deploy
nano ~/.ssh/config
    NoHostAuthenticationForLocalhost yes
    PubkeyAuthentication yes
    GSSAPIAuthentication no
    AddressFamily inet
# в качестве проверки замонтируем папочку
sshfs -o idmap=user -o follow_symlinks valik@deploy:/home/valik /home/valik/t
# и законнектимся
ssh -v valik@deploy
Беспарольный коннект по ssh работает.

На этом первичная настройка ОС закончена.

Делай два: поставим Plone.

возьмем свежайший дистр. Сейчас это 4.3.1
Заходим на гостевую машину (deploy) и заклинаем:
su -l
yum check-update
yum update
yum install wget

su -l valik
pushd /tmp
wget https://launchpad.net/plone/4.3/4.3.1/+download/Plone-4.3.1r1-UnifiedInstaller.tgz
tar zxf Plone-4.3.1r1-UnifiedInstaller.tgz
cd Plone-4.3.1r1-UnifiedInstaller
less README.TXT
Внимательно читаем README.TXT

Помимо разных деталей, из ридми нам понятно:
1 — какие библиотеки нужно установить перед установкой Plone;
2 — установить Плон можно «от рута» или «от нерута», на что это влияет;
3 — установить Плон можно standalone или ZEO, на что это влияет.
Ну, ZEO вариант мы сегодня ставить не будем, как нибудь потом. А рут/не рут разберем сегодня.

Сборка Plone от имени нерута — пользователя valik:
su -l valik
pushd /tmp/Plone-4.3.1r1-UnifiedInstaller
./install.sh --password=12345678 --build-python --static-lxml=yes standalone
Кто бы мог подумать — поначалу сборка обрывается с сообщениями об ошибках, ибо не хватает библиотек и пакетов :)

Поставим недостающие пакеты:
su -l
yum groupinstall "Development tools"
yum install gcc-c++ patch openssl-devel libjpeg-devel libxslt-devel readline-devel make which
Любопытно, dev tools требуют 222 Mb в распакованном виде.

Из ридми мы знаем, что
> Optional wv, poppler-utils May be installed after Plone install
для индексации файлов *.doc, *.pdf. Однако, они не совсем опциональны. Их отсутствие вызывает ошибки при работе сайта Plone. Поэтому, поставим их сразу.
Изучив текст по адресу http://repoforge.org/use/
заклинаю:
su -l
yum install poppler-utils
wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.i686.rpm
rpm -ivh rpmforge-release-0.5.3-1.el6.rf.i686.rpm
yum install --enablerepo=rpmforge-extras wv

Вот теперь можно повторить сборку Plone и, на этот раз, она пройдет без сучка и задоринки.

Делай три: запускай сайт Plone.

su -l valik
pushd ~/Plone/zinstance/ 
bin/plonectl start
 или
bin/instance fg
Что за нафиг, в браузере сайта не видать ни по каким адресам:

А это потому, что файрволл в CentOS по умолчанию разрешает только SSH

Открываем порт tcp 8080 путем использования управлятора файрволлом:
su -l
yum install system-config-firewall-tui
system-config-firewall-tui
service iptables restart
iptables -L
после чего сайт открылся. Кнопка «создать сайт Плон» работает, ZMI работает, все хорошо.

Вся система занимает сейчас 2.5 гигабайта. Значит, установка Плона потребовала 1 гигабайт диска, ибо свежеустановленная CentOS весила 1.5 гигабайта.

Для закрепления материала установим Plone от рута, как и положено в production:
su -l valik
rm -rf ~/Plone

su -l
pushd /tmp/Plone-4.3.1r1-UnifiedInstaller
./install.sh --password=12345678 --build-python --static-lxml=yes standalone

# запуск
sudo -u plone_daemon /usr/local/Plone/zinstance/bin/instance fg
# или
sudo -u plone_daemon /usr/local/Plone/zinstance/bin/plonectl start
Обновление билдаута требует правильной текущей директории:
su -l
pushd /usr/local/Plone/zinstance 
sudo -u plone_buildout /usr/local/Plone/zinstance/bin/buildout -nv 
Обратите внимание, запуск службы делается от имени «plone_daemon» а запуск билдаута от имени «plone_buildout» – и никак иначе.

В этой статье мы показали, какие действия надо предпринять, чтобы на «голую» CentOS 6.4 установить Plone 4.3.

В следующий раз, если захочется, поглядим как сделать production сервер на этой основе — как и какой frontend поставить, как сделать балансировку с использованием ZEO, как настроить автозапуск служб, ротацию логов, резервное копирование, etc.

original post http://vasnake.blogspot.com/2013/07/plone-43-on-centos-64.html

2013-07-23

Pixmap, pixbuf

У меня на домашнем десктопе трудится Debian jessie (testing). И, поскольку это тестинг а не стабильная ветка, иногда происходят разные чудеса. Например, неделю (или две?) назад испортилось оформление элементов интерфейса Gtk. Кнопочки, окошки и прочие чекбоксы стали похожи на древний Motif.

Некоторое время я с этим мирился, думая, что как поломалось (после очередного обновления системы), так и починится. Нет, само не починилось.
Короче, вчера у меня нашлось время на изыскания и я нашел решение.

Есть такой файл
~/.xsession-errors
в котором, как оказалось, во множестве рассыпаны (были) записи
Gtk-WARNING **: Unable to locate theme engine in module_path: "pixmap"
Что какбэ намекает, да?

Недолгое гугление выводит на такой рецепт
su -l
aptitude install gtk2-engines-pixbuf
gdk-pixbuf-query-loaders --update-cache

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

original post http://vasnake.blogspot.com/2013/07/pixmap-pixbuf.html

2013-07-22

Displaying Wildfires

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

Marionette Maps” is an on-going series on building a loosely coupled, configuration driven map viewer using Marionette.js. Read Part 1Part 2Part 3Part 4 and Part 5.
...
Lessons Learned

I learned a couple conceptual level things along the way which I’ll be sure to plan for moving forward. Here they are in no particular order…

Make a List of Events

This app is right at the edge of something that you can keep in your head easily. Moving forward, I’ll be keeping a list of the events and a description of what they are supposed to do in the project.

Plan your Routes

Plan ahead for how you are going to handle the router, and holding the context of the map in the url. When I first added the router, I just stored the center of the map and the zoom level, which was easy to tie into things as the map is all cleanly separated, and it’s easy to raise events from the map and use that to update the url. Adding in the “Year” was troublesome in that the value of the year is set as a result of selecting a historical year to view. Ok, not too bad for updating the url via Router.navigate, but parsing out the values and correctly restoring the map state was more complex than I’d have liked.

Data Consistency

This also came up at the end. I had planned to show another “window” with details about a wildfire, which would be relatively simple – EXCEPT – the attributes for the current fires layer are DIFFERENT from those on the historical fire layers, which borked things up royally as all the rest of the code assumes that all the wildfire layers are the same. This certainly could be worked around, but since no one is paying for this app, I let it ride with a mouse-over that shows the fire name. I have some ideas about how to harvest all the data into a consistent format, hosted on ArcGIS Server 10.1 and then use some of the new Stats options to show interesting info about the data, but that will have to wait for a while.


Если тема интересна, лучше всего начать с предисловия
разъясняющего тему «нафига козе боян зачем нам Backbone.Marionette»



original post http://vasnake.blogspot.com/2013/07/displaying-wildfires.html

2013-07-18

Minecraft

Есть такая игрушка — Minecraft. Несмотря на кажущийся примитив графики, игра пользуется значительной популярностью.

Посмотрите, как можно использовать геоданные из ArcGIS для построения мира в Minecraft:

So, I setup my own server, and started programming my own plugin to build my GIS based Minecraft worlds.
Since Minecraft is based on blocks, I needed to convert the world vector features into "block" . The raster format fits that requirement. Using ArcMap's built-in conversion tools, I can convert features to raster, where the raster values are based on the features attribute values.  The idea in the usage of the attribute values is to create worlds with heights that are proportional to the attribute values. To enable the plugin to read these raster values, I converted the raster to float values.
To know where I am in these generated worlds, I need sign posts. In GIS parlance, a sign post is a symbol to render point features. So I used the built-in data management feature to point tool, followed by the execution of a Python based GeoProcessing task (thanks@pheede) to convert the point feature class to a CSV file that can be read by the plugin to create sign post block types. The text on the sign post is based on a feature attribute value.




Какой простор для фантазии открывается.

original post http://vasnake.blogspot.com/2013/07/minecraft.html

2013-07-16

Ebay

Вчера я забрал у Почты России посылочку из Великобритании, заказ с Ebay. Как и предыдущая посылка, на доставку почте потребовалось три недели, две из которых посылка провалялась на складах таможни и потом почты. Картонная коробка была изрядно замята с одного угла, видимо, что-то тяжелое сверху положили/уронили. Хорошо, что внутри ничего хрупкого не было.

Купить я хотел одну штуку — натягивалку веревочек Clamcleat CL262 Power Grip 2.

Незаменимая вещь, если надо вытянуть короткий шкотик.
Стоит эта натягивалка девять фунтов. И девять фунтов стоит пересылка. Поэтому я решил заодно прикупить еще всякой мелочевки, чтобы за пересылку выходило не более 10% от стоимости посылки.

Короче, заказал еще, помимо прочего, багажные/увязочные ремни — Tie Down Strap/Roof Rack Straps, для привязки виндсерфинга к багажнику автомОбиля. Всего предметов получилось семь штук.
И, по причине такого невероятно большого количества, видимо, отправители не справились с ситуацией. Багажных ремней в посылке не оказалось.

Но сначала я подумал, что Почта России (или таможня) польстилась на копеечные ремешки. Потом, рассмотрев коробку внимательно, пришел к выводу, что ее не открывали. Следовательно, ремни в коробку просто не положили. Ведь известно, что семь — предельное число сущностей, одновременно удерживаемых в оперативной памяти человека.

Что делать, сел сочинять письмо продавцу. Родилось эдакое:

Hi.
Today my parcel was delivered, this is a good news.
I'm afraid I have bad news too. In that parcel I can't find Roof Rack Straps (Body Glove Tie Down Strap / Roof Rack Straps Long 25mm x 3.5m canoe kayak & surf (380629573542)
Quantity: 2
Sale date: 06/25/13
http://www.ebay.com/itm/380629573542).
Probably I should blame Russian Post/Custom service, but I can't find any evidence that box was opened by anybody but myself.
Maybe you just forget to send this items to me?
I will be tremendously grateful if you will send this items to me and take shipment charge on your account.
Regards.
Valentin.

Я почти не сомневался, что продавец не будет портить себе карму из-за 30-ти фунтов (столько он потерял бы, если бы ремни были отправлены но исчезли по дороге, иначе потеря продавца — 9 фунтов за отправку второй посылки) и отправит мне ремни «еще раз».

Так и вышло:

Hi Valentin, Thank you for your message. We are very sorry that your straps did not arrive, sounds like we made a mistake packing the parcel. I will put another two straps in the post to you today so that they get to youn asap. Apologies for any inconvenience caused. Kind Regards, Chris.

Приятно иметь дело с хорошо воспитанными людьми, не правда ли?

Вот интересно, накосячит Крис еще раз или нет — одна упаковка это два ремня. Я заказывал две упаковки. А он написал, что «I will put another two straps», что можно перевести как «я опять вышлю два ремня». Два ремня или две упаковки?

Посмотрим.

original post http://vasnake.blogspot.com/2013/07/ebay.html

2013-07-15

Хеликоптер нихт

Если выполнять Helicopter (виндсерфинг) без пауз, то получается очень эффектное зрелище. Всего можно насчитать четыре этапа выполнения Геликоптера: 1 — парус на корму, привестись к ветру; 2 — парус на нос, бэквинд, доворот до галфвинда; 3 — поменяться местами с парусом, выйти шкотовым углом вперед; 4 — перехлопнуть парус в нормальное положение.
Я вырезал шестиминутный кусок про Helicopter из обучающей фильмы

Будем разучивать, пусть народ изумляется.

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

2013-07-12

Чехол

Для перевозки Парохода нужен чехол. Удобно, если в такой чехол помещается не только доска, но и парус-мачта-гик. Еще лучше, если такой чехол предусматривает крепление к багажнику автомОбиля такое, чтобы парус не перетягивать.
Микроисследование рынка показало, что типичная цена на чехол «влезет всё» выше 10000 руб. Два чехла — один на доску, другой (типа session bag) для верхушки — обойдутся также, дороже 10000 руб.

А вот вчера попался уникум, всего за 5900 руб:

Чехол для виндсерфинга GS SPORT
Чехол состоит из двух частей. Изготовлен из прочного материала, двухслойный, с мягкой подушкой между слоями. Подходит для транспортировки доски с парусом, мачтой, гиком и мы даже мелочёвку туда же складываем. Сначала надевается нижняя часть (есть прорезь под плавник, для транспортировки с плавником), затем вернюю часть. На длинных липучках подстраивается под высоту доски - Ваша влезет точно, затем открывается молния на "носу" доски и через молнию уже докладывается парус, гик, потом боковыми ремнями утягивается по ширине.
Чехлы изготавливаем сами, выбрали самый удачный на Наш взгляд чехол французской фирмы и уменьшили его себестоимость за счёт изготовления в России, экономим на транспортировке


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

Оплачивая банковской картой, обратил внимание на любопытную платежную систему:

Удобно, быстро и, может быть, надежно. Среди более чем дюжины модулей для подключения к CMS не нашлось модуля для Plone. Есть куда руки приложить.

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

2013-07-11

Ищейка

Bloodhound – ищейка, Track – следить. Достаточно прозрачно.

Организация Apache Software Foundation объявила о придании проекту Apache Bloodhound статуса первичного проекта Apache...
Apache Bloodhound представляет собой платформу для управления совместной разработкой программных проектов и контроля за исправлением ошибок, основанную на коде системы Trac. Проект Bloodhound был основан в ответ на невозможность интеграции в Trac ряда принципиально новых возможностей...
Код написан на языке Python с использованием JavaScript-фреймворка ​Bootstrap. В качестве СУБД можно использовать MySQL, PostgreSQL и SQLite....
Из отличительных черт Apache Bloodhound называется поддержка управления несколькими проектами, современный и простой для восприятия интерфейс пользователя, интегрированный Wiki, средства полнотекстового поиска, удобный режим просмотра исходных текстов, упрощённая система установки, расширенные средства отслеживания ошибок и решения проблем пользователей. Система поддерживает подключение плагинов, написанных для Trac, и может использоваться совместно с репозиториями Subversion и Git.


Типа, Trac но лучше.

Я пользуюсь Trac-ом, мне нравится. Надо будет заценить Bloodhound. Несколько проектов, полнотекстовый поиск, интерфейс на Бутстрапе — заманчиво.

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

2013-07-10

Geoprocessing bigdata

И еще один пример того, как, оказывается, несложно, даже легко, использовать распределенные вычисления (кластеры) для анализа и визуализации в ГИС.

At this year's DevSummit, we announced the GIS Tools for Hadoop project. Included in that project is a low level geometry java API which enables spatial operations in MapReduce jobs or the construction of higher level functions such as Hive User Defined Functions. However, this geometry library is not restricted to Hadoop MapReduce. It is used in Geo Event Processor, and can be used in Storm bolts or other parallel workflows. One such parallel workflow processing engine is Pervasive DataRush that I demoed at the DevSummit. Using the KNIME visual workflow, I was able to process 90 million records (BTW, small in the BigData world) in Hadoop File System, for heatmap visualization in ArcMap.


So to recap, you can store data into HDFS, or use the new GeoProcessing tools for Hadoop. Compose DataRush workflows with spatial operators that you export to be executed on a cluster from ArcMap, whose result is consumed back by ArcMap for further local GeoProcessing or visualization.
This is very cool!



Все просто — написать немножко кода на Java, реализующего промежуточные вычисления; в визуальном конструкторе составить workflow; купить кластер и наслаждаться скоростью.

original post http://vasnake.blogspot.com/2013/07/geoprocessing-bigdata.html

2013-07-09

Как стать миллионером

Почему USA называют «страна возможностей»? Арнольд в своих мемуарах пишет, что метод, которым он из доллара делал два, был очень прост:

Допустим, есть дом, оцененный в $1000000. Покупаете его, платите (первый взнос) $100000. Через год этот дом оценивается уже в $1000200. Продаете его. В итоге за год $100000 превращаются в $200000. Из доллара выходит два.

Я не знаю как это называется — в рассрочку, трастовые сделки, долговые обязательства или еще как-то, но не имея миллиона купить дом стоимостью миллион — это реальная возможность. Повезет — умножишь капитал, не повезет — потеряешь $100000.

Деньги крутятся, ВВП растет, движуха.

Про качество перевода «Total Recall: My Unbelievably True Life Story»:


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

2013-07-08

Новости

Поделюсь своим решением проблемы «Google Reader закрыли».
Лично мне понравился https://inoreader.com/

1. Работает в браузере и не требует установки всяких аппликух.
2. Для создания учетки достаточно подтвердить доступ через Oauth2 к данным гуглоридера — быстро и просто.
3. Легко и просто импортируются все подписки, сохраненные GTakeout-ом.


А что еще надо?

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

2013-07-05

Погода

После перехода на Gnome 3, я до вчерашнего дня ощущал легкий дискомфорт. Проблема была в том, что раньше у меня в верхней панели Gnome сидел погодный виджет, который радовал меня точностью, простотой и наглядностью. А вот для Gnome 3 я такого виджета найти не смог, тогда, после переезда на новый Гном. До вчерашнего дня использовал плагин для Gkrellm.

Вчера я нашел погодный виджет для Gnome 3. Встречайте, та-да!

Только не перепутайте его с https://github.com/canek-pelaez/gnome-shell-extension-weather, который не работает.

Инструкция по установке достаточно проста.
От рута выполнить заклятия:
    aptitude install dconf gettext pkg-config seed git glib2 gnome-common autoconf automake intltool gnome-tweak-tool libglib2.0-dev checkinstall
    whereis checkinstall
    visudo
    mkdir -p /usr/local/share/gnome-shell/extensions
    mkdir -p /usr/local/share/glib-2.0/schemas

А под своей учеткой заклинать так:
    cd ~/t && git clone git://github.com/Neroth/gnome-shell-extension-weather.git
    cd gnome-shell-extension-weather
    bash autogen.sh
    make
    sudo checkinstall -D
    gnome-shell-extension-prefs
    gnome-tweak-tool
После учтановки необходимо перезапустить Gnome shell - ALT-F2, r, Enter.
Учтите, при создании пакета (checkinstall) необходимо задать версию пакета по правилам — цифрами. Имя пакета тоже лучше задать свое, чтобы потом не отыскивать его среди тыщ стандартных.


Всё, очередной гештальт закрыт.

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

2013-07-04

Декларативная навигация

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

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

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


Сделано на Java.

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

Понаделал видов, контроллеров и связал их воедино через декларацию переходов.

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

2013-07-03

MVC, модель — как много в этом слове

MVC это Модель, Вид, Контроллер, если кто не знает. По сути, МВК это паттерн/шаблон построения программ, позволяющий отделить овец от козлищ блоки кода друг от друга, получая относительно слабосвязанные, пригодные к повторному использованию библиотеки кода.

К сожалению, нынче развелось много фреймворков, которые в погоне за удобством искажают смысл MVC. Есть довольно древняя статья на эту тему:

На самом деле ни один веб-фреймворк не предлагает нам полноценную модель (по причинам, которые я объясню чуть позже). И ни в одном из них не дается внятного объяснения этому обстоятельству. Вместо этого они последовательно связывают понятие модели с родственным, но не идентичным понятием доступа к данным, что изрядно всех запутывает
Модели можно описать по-разному. На самом деле только об этом можно написать целую книгу, многие именно так и поступали! Как правило описываются две роли модели:
1. Модель отвечает за сохранения состояния между HTTP-запросами
2. Модель включает в себя все правила и ограничения, управляет поведением и использованием данной информации.
Все станет предельно ясно, как только вы задумаетесь над смыслом слова «модель». В климатологии есть модели климата, описывающие данные, процессы, предполагаемое поведение и позволяющие рассчитать возможные результаты. М в MVC называется моделью не просто так. Модель представляет не только данные, она представляет всю систему, в которой полезны эти данные.
Многие считают модель красивым словом для обозначения доступа к базе данных, другие приравнивают ее к разным шаблонам для доступа к базе данных, вроде Active Record, Data Mapper и Table Data Gateway. Фреймворки очень часто продвигают это заблуждение, ненамеренно, я уверен, но энергично. Не полностью понимая, что такое модель, почему это столь великолепная идея, и как ее надо разрабатывать и развертывать, разработчики непреднамеренно вступают на темный путь, ведущий к таким методикам разработки, которые иначе чем убогими и не назовешь.
Небольшое мысленное упражнение даст вам почву для размышлений. Представьте, что вы только что написали самое замечательное в мире веб-приложение с использованием Zend Framework. Клиент поражен, его восторги (и деньги) крайне приятны. К несчастью они забыли упомянуть, что их новый технический директор требует использовать Symfony во всех новых приложениях и предлагает крайне интересную сумму за преобразование вашего приложения. Вопрос: насколько это будет просто? Задумайтесь об этом на секунду…

Если логика вашего приложения завязана на модель — вы на коне! Symfony, подобно многим (но не всем) фреймворкам, принимает модели вне зависимости от того, поверх чего они написаны. Вы можете перенести вашу модель, ее юнит-тесты и вспомогательные классы на Symfony ничего или почти ничего не меняя. Если вы связали все это с контроллерами, у вас проблемы. Вы действительно считаете, что Symfony сможет использовать контроллеры Zend Framework? Что каким-то волшебным образом заработают функциональные тесты, использующие PHPUnit-расширение Zend Framework? Оба-на. Вот почему контроллеры не способны заменить модели. Их практически невозможно использовать повторно.
Так как разработчики очень часто занижают роль модели, ограничивая ее доступом к базе данных, как это по умолчанию делается в 99,9% фреймворков, нет ничего удивительного, что их не впечатляют связанные с ней теоретические идеалы. Сосредотачиваясь на доступе к данным разработчики полностью пускают один очень важный момент: классы моделей не связаны с текущим фреймворком. Им не требуется сложная установка, вы просто создаете и используете их объекты.
Так как разработчики почти ничего не знали о моделях, они изобрели новое понятие: толстые тупые уродливые контроллеры (ТТУК). Столь яркое определение я придумал не просто так, оно кажется очень забавным в 10 вечера, после нескольких кружек пива. И все равно вежливее того, что я о них на самом деле думаю. (Fat Stupid Ugly Controllers — FSUC — FUC). Их изобрели потому, что модели были непривычными, чуждыми и похожими на террористов сущностями, которым никто не решался доверить хоть что-то выходящее за пределы доступа к данным.

Типичный ТТУК читает данные с базы (используя уровень абстракции данных, который разработчики называют моделью), обрабатывает их, проверяет, пишет и передает в представление для вывода на экран. Он невероятно популярен. Я бы сказал, что большинство пользователей фреймворков создают их так же естественно, как раньше создавали контроллеры страницы (Page Controllers). Они популярны, потому что разработчики осознали, что они могут обращаться с контроллерами почти так же, как с контроллерами страницы — это практически не отличается от древней методики использования отдельных php-файлов для каждой «страницы» приложения.

К сожалению, оригинальная статья не открывается.


Статья содержит еще много пламенных призывов и понятных разьяснений. Наслаждайтесь.

original post http://vasnake.blogspot.com/2013/07/mvc.html

2013-07-02

Стимуляция экономики

А кто вам обещал, что вы будете жить вечно, мерзавцы? (с) полководца Какеготам.

Наступил июль, прекратил существование Google Reader. Типа, гугловодам он пользы не приносит. Теперь, чтобы почитать свежие тексты на сон грядущий, надо что-то придумывать. То ли в браузере спецпапку с закладками организовывать, то ли другой RSS ридер искать и настраивать. Неудобняк.


Зимой и еще весной банки предлагали чуть не 10% годовых по вкладам. Сегодня пришел в банк, поинтересоваться, какой процент теперь по моему вкладу, открытому в 2011 году, который очередной раз продлили на прошлой неделе. Оказалось — 5.55% годовых. А было 6.25%. Спрашиваю, какие варианты? Отвечают, что для моих условий могут мне предложить аж 5.8% годовых. Процентные ставки по вкладам упали почти вдвое с зимы. Вероятно, Хозяин решил стимулировать экономику — деньги должны обращаться а не в банках лежать, типа. А мне опять неудобняк. Пойти, что ли золота купить? Благо цены на него тоже упали.

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

Дует? Дует

И таки подуло. Практически два дня, 30 июня и 1 июля, после дооолгой недели штиля дуло 4-5-6 м/с и до 8. Как же было упустить такое событие? Конечно, пошли кататься. Накатались на неделю вперед, я надеюсь.

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


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


original post http://vasnake.blogspot.com/2013/07/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) Java (22) humor (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) 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) Klaipeda (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) купи/продай (9) Photo (8) 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) 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) serialization (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)