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

2014-01-31

ArcMap – Hadoop

Немного кода на Java и — опля, можно прямо из ArcMap выполнить задачу пространственного анализа на кластере Hadoop, показав результаты обратно в ArcMap.

In the previous post we launched a CDH cluster on EC2 in under 5 minutes. In this post, we will use that cluster to perform geo spatial analytics in the form of MapReduce and visualize the result in ArcMap. See, ArcMap is one of the desktop tools that a GeoData Scientist will use when working and visualizing spatial data.  The use case in my mind is something like the following:  Point data is streamed through, for example GeoEventProcessor into Amazon S3. The user has a set polygons in ArcGIS that needs to be spatially joined with that big data point content. The result of the big data join is linked back to the polygon set for symbol classification and visualization.



Мансур показывает нам, как работать со spatial BigData.


original post http://vasnake.blogspot.com/2014/01/arcmap-hadoop.html

2014-01-30

Проблема демократии

Аристотель — это голова, ему палец в рот не клади.

...
Аристотель в своей «Политике» признавал ту же самую проблему демократии еще задолго до Мэдисона.
Анализируя самые разные политические системы, он пришел к выводу, что демократия это наилучшая или, пожалуй, наименее худшая форма государственного правления. Но он признавал имеющийся у нее недостаток: составляющие большинство массы бедноты могут использовать свое право голоса для отнятия собственности у богатых, что было бы несправедливо.
Мэдисон и Аристотель сделали прямо противоположные выводы. Аристотель рекомендовал сокращать неравенство, что в нашем понимании является комплексом мер государства всеобщего благоденствия. А Мэдисон полагал, что решение состоит в урезании демократии.
В последние годы жизни Томас Джефферсон, составивший Декларацию независимости США, уловил жизненно важный характер данного конфликта, которому еще далеко до завершения. Он испытывал серьезную обеспокоенность по поводу качества и будущего демократического эксперимента. И он проводил различие между «аристократами и демократами».
Аристократы – это те, кто «опасается народа и не доверяет ему, желая отнять у него всякую власть и передать ее в руки более высоким классам».
Демократы же «отождествляют себя с народом, доверяют ему, питают к нему теплые чувства и считают его честным и безопасным, хотя и не самым мудрым кладезем общественного интереса».

Полностью тут http://www.oilru.com/news/393064/

Я так понимаю, что «аристократы» и «демократы» это, фактически, нынче республиканцы и демократы — две партии США. Лично мне больше нравится название «аристократы», нежели «республиканцы», как более точное. Название «республиканцы», оно вообще ни о чем.

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

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



original post http://vasnake.blogspot.com/2014/01/blog-post_12.html

2014-01-29

Package

Есть мнение, что если ты пишешь на Python программу длиннее 100 строк, то следует оформить ее как пакет (package).

Покажу на примере (https://github.com/vasnake/transbot) как это сделать. Операционная система – Linux, инструмент – консоль.

Делай раз: подбери для пакета имя.
На https://pypi.python.org/pypi с помощью поиска я определил, что имя «translitbot» пока не занято. ОК, теперь занято.

Делай два: папка для файлов проекта.
mkdir ~/projects/translit.bot; pushd ~/projects/translit.bot

Делай три: изолированная песочница – virtualenv.
virtualenv --no-site-packages env
source env/bin/activate

Делай четыре: минимальная документация по проекту. Создал (пока пустые) файлы
CHANGELOG
COPYING
README.rst
в папке проекта (~/projects/translit.bot).

Делай пять: папка пакета – это просто папка
mkdir translitbot

Делай шесть: папка превращается в пакет. Для этого необходимо добавить файл (можно пустой)
translitbot/__init__.py
На этом можно было бы и остановится, ибо пакет уже готов.
Но лучше добавить еще файл
translitbot/__main__.py
Который позволяет вызывать пакет как программу, набрав в папке проекта команду
python -m translitbot
Чтобы это работало, в файл __main__.py я поместил такой код:
#!/usr/bin/env python
# -*- mode: python; coding: utf-8 -*-
from translitbot.translit_xmpp_bot import main
main()
Очевидно, у меня в пакете есть модуль (файл) translit_xmpp_bot.py в котором есть функция main, пусть это останется за скобками.

Вот и все, что необходимо для построения пакета Python. Теперь в него можно добавлять модули и подпакеты по необходимости.

Как из пакета сделать дистрибутив (distribution), как поместить пакет в PyPI для публикации и использования в других проектах – я расскажу в следующий раз.

Сцылки по теме:



original post http://vasnake.blogspot.com/2014/01/package.html

2014-01-28

Норматив

Некогда я читал про норму выработки программиста: 200 отлаженных строк кода в день. Давайте поглядим на пример, когда за день работы получается пять строк кода и при этом никак нельзя сказать, что программист бездельничал.

I needed to gzip some data in memory that would eventually end up saved to disk as a .gz file. I thought, That's easy, just use Python's built in gzip module.
However, I needed to pass the data to pycurl as a file-like object. I didn't want to write the data to disk and then read it again just to pass to pycurl. I thought, That's easy also-- just use Python's cStringIO module.
The solution did end up being simple, but figuring out the solution was a lot harder than I thought. Below is my roundabout process of finding the simple solution ...


В итоге, финальный вариант кода выглядит как-то так:
fgz = cStringIO.StringIO()
with gzip.GzipFile(filename=FILENAME, mode='wb', fileobj=fgz) as gzip_obj:
    gzip_obj.write(STUFF_TO_GZIP)
filesize = pycurl_simulator(fgz)
print filesize


Ночь на дворе, пять строк написано — день прошел не зря.


original post http://vasnake.blogspot.com/2014/01/blog-post_6225.html

2014-01-27

Hangouts

Сначала hangout, потом hangover.

Прошлой весной (15 мая 2013) сообщали:

Nikhyl Singhal, директор Google по технологиям коммуникации ... сообщил о трудном решении по прекращению поддержки XMPP как "открытого" стандарта. В качестве новой платформы для организации мгновенного обмена сообщениями, которая идёт на смену Google Talk, позиционируется ... Hangouts, которая объединит Google Talk, сервис видеовстреч Google+ и Google+ Messenger.
... Изменения коснутся поддержки взаимодействия с другими системами, что приведёт к ограждению сервиса обмена сообщениями Google от других сетей на базе XMPP. Если раньше пользователи других XMPP-сетей могли без проблем отправлять сообщения пользователям Google Talk, то в Hangouts данная практика будет прекращена. В качестве причины введения блокировки называется борьба со спамом.


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


Но, на всякий случай, учетка в Скайпе тоже имеется.

original post http://vasnake.blogspot.com/2014/01/hangouts.html

2014-01-24

Интригующий заголовок

Как из личностей сделать биомассу — правда, интригующий заголовок?
и продолжение: Личность против Системы, две стратегии

Готовясь к публичной лекции по психологии личности, я просматривал выдержки из книги психоаналитика Бруно Беттельгейма «Просвещенное сердце». В ней он описывает свой опыт узника концлагерей Дахау и Бухенвальда, в которых он был в 1938-1939 годах, а также опыт других людей, столкнувшихся с системой уничтожения человеческого достоинства позднее, когда нацисты «раскрылись» на полную мощь. Делал пометки, выписки, и в итоге получилась эта статья.

Меня интересовал психологический аспект того, что творилось в концентрационных лагерях. Как нацистская система ломала личности, как личности противостояли системе и чудовищно деструктивному психологическому полю, какие стратегии использовали и как они деформировались . В конце концов, личность – это и есть наши стратегии адаптации к существующему вокруг миру, и от того, какой он, этот мир, во многом (но не во всем) зависит то, какие мы.

Нацистская система в 1938-1939 годах – времени пребывания Беттельхейма в Дахау и Бухенвальде – еще не была нацелена на тотальное истребление, хотя с жизнями тогда тоже не считались. Она была ориентирована на «воспитание» рабской силы: идеальной и послушной, не помышляющей ни о чем, кроме милости от хозяина, которую не жалко пустить в расход. Соответственно, необходимо было из сопротивляющейся взрослой личности сделать испуганного ребенка, силой инфантилизировать человека, добиться его регресса – до ребенка или вовсе до животного, живой биомассы без личности, воли и чувств. Биомассой легко управлять, она не вызывает сочувствия, ее легче презирать и она послушно пойдет на убой. То есть она удобна для хозяев.

Илья Латыпов

Удивительно, но факт, есть вполне небольшой набор методик, применяя которые можно превращать людей в деревянных солдат Урфина Джюса:

Правило 1. Заставь человека заниматься бессмысленной работой.
Правило 2. Введи взаимоисключающие правила, нарушения которых неизбежны.
Правило 3. Введи коллективную ответственность.
Правило 4. Заставь людей поверить в то, что от них ничего не зависит.
Правило 5. Заставь людей делать вид, что они ничего не видят и не слышат.
Правило 6. Заставь людей переступить последнюю внутреннюю черту.

Ничего не напоминает? Если нет — вам можно позавидовать. А ведь (ну, разве, кроме 5 и 6) так мы жили при совке. Еще ярче это работало в Советской Армии. Да и нынешнее государство Российское живет по этим правилам.

Что же делать тем, кто не хочет стать зомби?
Читайте часть 2 http://tumbalele.livejournal.com/57075.html



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

2014-01-23

Crunch

Crunch — грызть с хрустом.

The Apache Crunch Java library provides a framework for writing, testing, and running MapReduce pipelines.
Running on top of Hadoop MapReduce, the Apache Crunch™ library is a simple Java API for tasks like joining and data aggregation that are tedious to implement on plain MapReduce.

Прототип проекта (очень хорошо документированный), демонстрирующий параллельное выполнение ГИС-задачи «сколько точек попало в полигон»:

Here is a proof-of-concept project that spatially enables a crunch pipeline with a Point-In-Polygon function from a very large set of static point data with a small set of dynamic polygons.
Crunch has simplified so much so the process, that is came down to a one line syntax:
final PTable<Long, Long> counts = pipeline.
        readTextFile(args[0]).
        parallelDo(new PointInPolygon(), Writables.longs()).
        count();
The spatial operation is performed using the Esri Geomerty API for Java. The result of the spatial join is a count of points per polygon.



Мансур продолжает нас радовать экспериментами по обработке BigData, причем это не просто данные, а пространственные, что для ГИС гиков — бальзам на сердце.


original post http://vasnake.blogspot.com/2014/01/crunch.html

2014-01-22

backup

collective.recipe.backup — это обвязка вокруг bin/repozo, так говорит документация (http://plone.org/products/collective.recipe.backup).

This recipe is mostly a wrapper around the bin/repozo script in your Zope buildout. It requires that this script is already made available. If this is not the case, you will get an error like this when you run one of the scripts: bin/repozo: No such file or directory. You should be fine when you are on Plone 3 or when you are on Plone 4 and are using plone.recipe.zeoserver. If this is not the case, the easiest way of getting a bin/repozo script is to add a new section in your buildout.cfg (do not forget to add it in the parts directive):

[repozo]
recipe = zc.recipe.egg
eggs = ZODB3
scripts = repozo

bin/repozo is a Zope script to make backups of your Data.fs. Looking up the settings can be a chore. And you have to pick a directory where to put the backups. This recipe provides sensible defaults for your common backup tasks. Making backups a piece of cake is important!

  • bin/backup makes an incremental backup.
  • bin/fullbackup always makes a full backup.
  • bin/restore restores the latest backup.
  • bin/snapshotbackup makes a full backup, separate from the regular backups. Handy for copying the current production database to your laptop or right before a big change in the site.


Незаменимая вещь, делает сохранение и восстановление БД Plone/Zope не просто легким а очень легким.


Musthave.


original post http://vasnake.blogspot.com/2014/01/backup.html

2014-01-21

Числа

Намедни мне на глаза попались красивые числа. Смотрите сами, две цитаты.
Раз:

Когда Путин пришел к власти, от продажи нефти Россия получала всего 41 миллиард долларов. В прошлом году ее доход от продажи нефти составил примерно 415 миллиардов долларов.

Два:

бюджет России ...
2013 Доходы — 12 865, 9 млрд руб. Расходы — 13 387,3 млрд руб.

Если кто плохо (как я) считает в уме, то возьмите калькулятор:
если 415 миллиардов долл. умножить на 33, то получится... тадам... 13695 млрд. рублей.

Красиво, правда?

Да, я знаю, что доход и прибыль — это разные вещи.
Да, я знаю, что числа надо проверять — вам охота, вы и проверяйте.

Кстати, вот вам картинка в тему, из моего старого поста (http://vasnake.blogspot.ru/2012/05/blog-post_22.html)



original post http://vasnake.blogspot.com/2014/01/blog-post_6.html

2014-01-20

Total Trainer

Было дело (http://vasnake.blogspot.ru/2012/11/blog-post_26.html), прикупил я домой тренажер. Еще путаница с названием случилась — поначалу он назывался Total Trainer а потом, внезапно, Body Sculpture. Хороший тренажер, годный.

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

Total Trainer / Body Sculpture home gym (machine) instructions from original DVD


Звук почему-то французский, но это абсолютно не важно, поверьте.

original post http://vasnake.blogspot.com/2014/01/total-trainer.html

2014-01-17

One reason why law in Russia is incoherent

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

This was written by Professor Zorkin, the most highly placed judge in Russia, Chairman of the Constitutional Court.
Is it any wonder that law in Russia is meaningless, if the most senior judge cannot write in a way
which the ordinarily intelligent reader can understand?


Это Ян Митчел вот об этом пассаже:

The methodological aspect of the realization of the principle of the rule of law in contemporary conditions is connected with the historicity of today's wold and the fact that it is impossible to use cliched approaches to the realization of the most important ideas of constitutionalism, among other ideas.

Мои мысли — мои скакуны, не иначе. Что хотел сказать — неясно. Если человек не может четко изложить свои мысли, наверняка эти мысли у него смешанны и туманны. Зачем нам такой судья?

А затем Ян приводит другой текст

from the late Lord Denning, once one of England's most distinguished judges.
This is the beginning of the first chapter of his book entitled "The Discipline of Law".

Четко, лаконично, понятно. И по теме:
"Obscurity in thought inevitably leads to obscurity in language."



original post http://vasnake.blogspot.com/2014/01/one-reason-why-law-in-russia-is.html

2014-01-16

За свободу надо бороться

А если за свободу не бороться, то она уходит. Или её ужодят.


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



Вообще, для нас, постсоветских россиян, ситуация больше похожа на фантастическую зарисовку. Ну как это, человек идет по улице мегаполиса, на поясе у него заряженный пистолет. Полиция останавливает чела и пытается проверить — кто такой, почему с оружием. А человек отказывается называть свое имя, отказывается предоставлять документы и, до кучи, настаивает на том, чтобы его отпустили или уже предьявили обвинение в преступлении. А поскольку у полиции нет на этого чела ориентировки, его отпускают — без проверки документов и с оружием! Почему? Потому, что по закону, он имеет право на ношение оружия и имеет право свободно перемещаться. Соответственно, полиция НЕ имеет права его задерживать, если он ничего не нарушил. А еще потому, что судебная власть реально отделена от исполнительной. Полиция задержит такого гражданина, а потом будет выплачивать штраф немаленький по решению суда — оно им надо?

Можно только порадоваться, что не все еще полимеры просрали достижения отцов-основателей USA похерили. Есть пример для подражания.

На всякий случай я ролик скопипиздил http://youtu.be/szhB4hj91mQ

original post http://vasnake.blogspot.com/2014/01/blog-post_4.html

2014-01-15

Коллбеки императивны

Callbacks are imperative, promises are functional: Node’s biggest missed opportunity

Функциональное программирование, JavaScript, Node.JS, callbacks, promises и всё такое. Статья для промывания мозгов:

Если вы когда-либо слышали фразу "программируемая точка с запятой", то вы понимаете, о чём я говорю.
И в лучшем проявлении, функциональное программирование декларативно. В императивном программировании, мы пишем последовательности инструкций, которые сообщают машине, как сделать то, что мы хотим. В функциональом программировании мы описываем зависимости между значениями, которые сообщают машине, что мы хотим вычислить, и машина предлагает последовательности команд, необходимых для этого вычисления.
Имея такое определение, я хочу пояснить, что, по моему мнению, является основной ошибкой дизайна, внесённой Node.JS: решение, сделаное в самом начале его развития: решение использовать API на основе коллбеков, вместо "обещаний" (promises).
Я надеюсь развеять недопонимание, будто "обещания" это что то, что даёт более аккуратный синтаксис для основанной на коллбеках асинхронной работы. На самом деле, "обещания" позволяют моделировать вашу проблему фундаментально иным способом; они глубже, чем синтаксис, и влияют на то, как вы решаете проблемы на уровне семантики.
Эти null-значения, возвращаемые функциями, использующими коллбеки и есть причина того, что программирование с коллбеками сложное: такие функции ничего не возвращают, из за чего их сложно объединять. Функция, которая ничего не возвращает, вызывается только ради её сайд-эффекта, т.к. функция без сайд-эффекта и без возвращаемого значения - это просто чёрная дыра. Так что, программирование с коллбеками императивно по своей сути, речь идёт об упорядочивании выполнения полных сайд-эффектов процедур, вместо отображения входящих данных в выходящие посредством применения функций

Остальное тут:

Кто-то может спросить: зачем это вообще нужно? Обещания какие-то...
Ответ, по моему, достаточно очевиден: продемонстрированные в статье преимущества функционального подхода позволяют писать более лаконичный и простой для понимания код. Следовательно, программист может кодировать решения более сложных проблем с меньшим количеством ошибок.
Эффективность повышается, если использовать «еще более лучшие» инструменты.



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

2014-01-14

Побочные эффекты

Небольшое введение в тему тестирования производительности, на примере тестирования PostgreSQL на скорость выполнения запросов.

A test plan is a document detailing a systematic approach to testing the performance of a system. The most obvious part of the plan defines test cases which can be expressed as simply as SQL statements.
Another part of the plan defines the environment requirements which usually consist of the hardware and software used for testing. However, this should also attempt to define potential side effects on the server side which might impact performance, such as processes running periodically or the state of the buffer cache:
# CREATE TABLE foo (id SERIAL NOT NULL PRIMARY KEY, value INTEGER NOT NULL);
# INSERT INTO foo (value) SELECT i FROM generate_series(1, 1000000) i;
# \timing
# SELECT * FROM foo WHERE value = 1;
Time: 124.278 ms
# \! sudo sync
# \! echo 3 | sudo tee -a /proc/sys/vm/drop_caches
# SELECT * FROM foo WHERE value = 1;
Time: 265.871 ms
In order to mitigate the impact of the environment on performance, the test execution part of the plan should make the necessary provisions for running multiple times. So, in the final result analysis part, it could then be possible to produce mean or median values of the performance.





На примерах показано, как влияют на результаты тестирования разные побочные эффекты. Рассказано, что следует предпринять, чтобы свести их к минимуму.

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

2014-01-13

Агрессор

Психология бывает полезной.

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

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

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


Очень важно — не терять самоконтроля и самоосознания. Тогда ситуацию можно анализировать и делать выводы, применять вышеописанные приемы и тактики.

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



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

2014-01-10

О космонавтике

Намедни открыл замечательный ресурс, просто кладезь информации о космонавтике: http://12apr.su/books/index.shtml

В частности, там есть книга «С. Г. Александров, Р. Е. Федоров - Советские спутники и космические корабли» Второе издание, дополненное и переработанное, ИЗДАТЕЛЬСТВО АКАДЕМИИ НАУК СССР, Москва 1961.

Значения радиусов сфер действия планет солнечной системы приведены в табл. 3. Радиус сферы действия Луны по отношению к Земле составляет около 66 тыс. км.
Таблица 3. Радиусы сфер действия планет
Планета
Радиус, млн. км
Меркурий
0,11
Венера
0,62
Земля
0,93
Марс
0,58
Юпитер
48,5
Сатурн
54,4
Уран
52,0
Нептун
87,5
В пределах сферы действия планеты характер движения космического аппарата определяется в основном полем ее тяготения. Поля тяготения других небесных тел, в том числе и Солнца, создают малые возмущения этого основного движения космического аппарата и в первом приближении могут не учитываться.
Соответственно вне сфер действия планет характер движения космического аппарата определяется в основном полем тяготения Солнца. Поля тяготения планет в этом случае создают малые возмущения гелиоцентрического движения космического аппарата. Таким образом, при изучении законов движения космических аппаратов следует в первую очередь рассмотреть задачу о движении их в поле тяготения одного небесного тела - в центральном поле тяготения.
Если начальная скорость космического аппарата V0 < V пар, то движение его происходит по эллиптической орбите, если V0 = Vпар - по параболической, а если V0 > Vпар - по гиперболической орбите. Значение параболической скорости зависит исключительно от массы центрального тела М (так как К = fМ) и от расстояния до центра тяготения r0.
Для Земли на уровне ее поверхности параболическая скорость равна Vпар = 11,19 км/сек. С увеличением высоты значение параболической скорости уменьшается (табл. 4). Значения параболической скорости для других планет солнечной системы приведены в табл. 5.
Таблица 4. Значение параболической скорости в зависимости от высоты над поверхностью Земли
Высота, км
Параболическая скорость, км/сек
0
11,19
500
10,77
1000
10,40
2000
9,76
5000
8,37
10000
6,98
Таблица 5. Значение параболической скорости на поверхности планет и Луны
Планета
Параболическая скорость, км/сек
Меркурий
4,15
Венера
10,25
Земля
11,19
Луна
2,36
Марс
5,09
Юпитер
60,2
Сатурн
36,2
Уран
21,4
Нептун
23,4
При скорости, равной параболической, космический аппарат приобретает кинетическую энергию, достаточную для удаления его в бесконечность, по отношению к центральному телу.


Просто пестня — небесная механика, орбиты, траектории, формулы и расчеты.

Отличная библиотека.



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

2014-01-09

Пошлина

Удивительно созвучно «пОшлина» и «пошлИ на». В контексте нижеследующего второй вариант мне нравится всё больше.

Лафа с покупками за границей заканчивается

Решение о снижении необлагаемой налогами суммы зарубежных интернет-покупок в месяц с 1 тыс. евро до 150 евро будет вынесено уже в начале 2014г., сообщил журналистам заместитель министра экономического развития РФ Алексей Лихачев.

"Решение будет вынесено в начале следующего года стопроцентно", - сказал он.

По словам замглавы МЭР РФ, одновременно с уменьшением порога беспошлинного ввоза интернет-посылок размер самой пошлины в 30% останется неизменным. (Отсюда.)

В общем, лафа с покупками в онлайне за границей - заканчивается. При пошлине в 30%, судя по всему, выгоднее и быстрее будет покупать в России у представителей и посредников. А вот что делать с теми товарами, которые в Россию не поставляются?.. Платить 30% пошлины, вот что делать.


Минимум, что можно сделать, это выразить свое отношение тут https://www.roi.ru/6536/

А чтобы иметь представление о нашей таможне, почитайте тут http://habrahabr.ru/post/205038/



original post http://vasnake.blogspot.com/2014/01/blog-post_8960.html

2014-01-08

CoffeeScript

Веб разработчики знают, что такое CoffeeScript, а другим достаточно такого объяснения: это JavaScript с изрядным количеством синтаксического сахара. Многие яваскриптовые конструкции пишутся и, что важнее, читаются легче на кофескрипт. Кто хочет знать больше — велкам http://jashkenas.github.io/coffee-script/

Я же хочу поделиться практическим опытом применения CoffeeScript, на примере переписывания одного из модулей одного из проектов. Проект завязан на dojo, поэтому модуль — суть модуль dojo, что доставляет (одни только скобочки типа «)}))» после блока в сотню строк стоят отдельной песни).

Начну с начала. Основное рабочее место — MS Windows 2003 (да, у меня есть планы переползти на один из юниксов, но пока руки не доходят, не все сразу). Поэтому мне нужен Node.js такой: http://nodejs.org/dist/v0.10.24/node-v0.10.24-x86.msi
Собственно, его и предлагает по умолчанию страница http://nodejs.org/
Качаю, ставлю — easy-peasy. При установке выбрал папку d:\node

Внутри этой папки запускаю cmd.exe, получаю типа консоль.
В консоли запускаю установку кофескрипта
npm install -g coffee-script
Тоже не рокет сайенс.

Внутри рабочего проекта создаю файл build.coffee.cmd с содержимым:
set wd=%~dp0
pushd "%wd%"
coffee -w -c -o c:\mapedit\javascript\vs\obj\ c:\mapedit\javascript\vs\
Его задача — запустить вечный цикл, в котором проверяется состояние файлов *.coffee в папке c:\mapedit\javascript\vs\ и как только любой из них изменился, компилять его, создавая одноименный файл (но с расширением js) в папке c:\mapedit\javascript\vs\obj\
В качестве бонуса компиляции получаю проверку кода на предмет ошибок. Удобно — сохраняешь файл и тут же в окошке рядом видно — ОК или облом.

Остается немного, заменить в коде (другие файлы проекта) подключение модуля с
require("vs/meapp"], function(meapp) {
    try {vsapp.log('try vsapp');} catch(ex) {vsapp = new meapp();}
    vsapp.log(" vsapp ready");
на
require(["vs/obj/meapp"], function(meapp) {
    try {vsapp.log('try vsapp');} catch(ex) {vsapp = new meapp();}
    vsapp.log(" vsapp ready");
и переписать файл vs\meapp.js на аналогичный vs\meapp.coffee

Сейчас вы увидите, чем конкретно coffeescript код лучше кода javascript.

Было (vs\meapp.js):

Стало (vs\meapp.coffee):

А это код JS на выходе компилятора coffee:

Ниже тройной гист с кодом:


Как видно, кроме небольшой экономии на количестве строк, изрядно улучшается читаемость кода за счет применения Python-подобных (Python — the best!) методов — использование отступов вместо скобок (хотя можно продолжать использовать скобки — либерализм), расширенного набора операторов для циклов и условий, и … читайте http://jashkenas.github.io/coffee-script/ там все очень подробно и понятно нарисовано.
А я свою задачу выполнил — показал на примере, как можно переписать dojo-завязанный код на CoffeScript.
Мне понравилось.

Осталось упомянуть про удобство редактирования кода. Тут все не так радужно.
К сожалению, плагин для Eclipse, которому положено ублажать лень разработчика, не рабочий. От слова «совсем». Может быть, когда-нибудь он заработает. Для SciTE поддержки CoffeeScript тоже пока не наблюдается. На сегодня самый удобный способ (под MS Windows) редактирования кофескриптов — это использование Notepad++ с подключенным https://github.com/blakmatrix/CoffeeScript_notepad_UDL
Подключается он проще пареной свеклы: меню Language — Define your language — Import - https://github.com/blakmatrix/CoffeeScript_notepad_UDL/raw/master/CoffeeScript.xml
закрыть окно, перезапустить Нотепад++.


Дополнительно:


original post http://vasnake.blogspot.com/2013/12/coffeescript.html

2014-01-07

Semantic MediaWiki

Все кто хоть раз заходил на сайт Википедии, имеет представление о том, что такое MediaWiki — программный проект, на котором все и крутится.
Оказывается, если дополнить MediaWiki плагинами Semantic Mediawiki и Semantic Forms, то можно сделать не банальный набор текстовых статей, а целую структурированную базу данных, информационную систему, в которую легко вносить данные (через формы), в которой легко искать эти данные и анализировать их. Некая золотая середина между жесткой структурой реляционных БД и абсолютно произвольной структурой текстовых статей.

Посмотрим на примере:

Итак, требуется очень-очень быстро сделать сайт, где каждый пользователь может легко и просто разместить информацию определенной структуры. И чтобы эту информацию можно было бы легко обрабатывать — показатели всякие считать, списки-таблички строить. Поиск, само собой, нужен, да не просто текстовый, а с учётом структуры этой самой информации.
Например, описание формы заполнения информации о сотруднике находится на странице Form:Сотрудник и в первом приближении выглядит так:
<noinclude>Этот текст будет показан при просмотре страницы.
Обычно он содержит описание формы.
Само определение формы находится внутри тега includeonly.</noinclude>
<includeonly>
{{{for template|Сотрудник}}}
Должность: {{{field|Должность}}}

Отдел: {{{field|Отдел}}}
{{{end template}}}
</includeonly>


Теперь на какую-нибудь страницу надо вставить специальный вызов функции:
Введите Фамилию Имя Отчество сотрудника чтобы создать или редактировать его страницу:

{{#forminput:form=Сотрудник}}

Результатом будет поле ввода названия новой/редактируемой страницы и кнопка:

Как и ожидается, по нажатию на кнопку откроется страница с формой:
расширение Semantic Forms вывело меня на Semantic MediaWiki. Это расширение позволяет явным образом определять семантические аннотации. Для простоты понимания программисты могут считать wiki-страницы объектами, а семантические аннотации — именованными свойствами этих объектов. Я тоже в дальнейшем буду говорить о свойствах. Синтаксис определения свойств похож на синтаксис определения категорий (принадлежность категории можно считать свойством объекта):
[[Отдел::особый]]

В нашем шаблоне Должность и Отдел — естественные кандидаты на роль свойств. Зафиксируем это в шаблоне:
Должность: [[Должность::{{{Должность}}}]]

Отдел: [[Отдел::{{{Отдел}}}]]

[[Category:Сотрудник]]

Визуально практически ничего не изменилось — вместо определения свойства выводится его значение, то есть значение параметра шаблона
Осталось разобраться с обработкой данных. Категории и свойства можно использовать в запросах, результаты запросов включать в текст страниц. Вместо Hello, world! выведем таблицу сотрудников:
{{#ask: [[Category:Сотрудник]] 
|?Должность
|?Отдел
|format=table}}

Сначала пара слов для общего понимания синтаксиса:
{{#f: ... }} — это вызов функции с именем f. Функции определяются в расширениях, я не пробовал определять их. Вертикальные палки разделяют параметры функции. То есть, мы имеем вызов функции ask с четырьмя параметрами.

Этот запрос состоит их двух частей. Первая часть (первый параметр функции ask) выбирает страницы, удовлетворяющие определённому правилу. В данном случае — принадлежащие категории
Сотрудник. Вторая часть (остальные параметры) определяет способ вывода результатов. В данном случае это будет таблица с тремя столбцами:
  1. Имя страницы. Столбец выводится по умолчанию, но это можно подавить при необходимости параметром mainlabel=-.
  2. Должность. Этот уже мы задали.
  3. Отдел. И этот тоже мы.
...

И так далее http://habrahabr.ru/post/177615/

Дополнительно:



original post http://vasnake.blogspot.com/2013/12/semantic-mediawiki.html

2014-01-06

Евангелист

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

Ну слышал, ну и что? А дело в том, что на днях я закончил (не то чтобы закончил, но, во всяком случае, то что должно работать — работает) вот такое допиливание, а если точнее — почти полную переделку проекта feature-service-editor-js, накаляканного вот таким вот специалистом. Познакомься, Алиса, это Пудинг Andy Gup (https://github.com/andygup). Та версия, что он опубликовал в репозитории Esri просто не работает. После третьего клика по функциональным кнопкам начинаются чудеса, обычные для программы полной багов. Чтобы от этих багов избавиться, пришлось процентов 30 кода переписать заново, потратив более трех недель времени на отладку. К сожалению, ключевую концепцию дизайна программы (ошибочную и даже вредную) так просто не переделаешь. И этот Энди работает «Developer Evangelist for Esri»! Упаси бог от таких евангелистов.

Короче, если вам вдруг нужно приделать к карте таблицу, в которой можно еще и редактировать данные Feature Layer, то берите таблицу у меня (https://github.com/vasnake/feature-service-editor-js) или делайте сами, благо это не так трудно как кажется.
Но ни в коем разе не пытайтесь использовать это угробище: https://github.com/Esri/feature-service-editor-js

Собственно, пост этот я хотел посвятить немного другому, но увлекся нытьем, простите грешного.
Я хотел показать, ибо народ часто спрашивает а ответа не находит, как обновлять/reload/reset/rebuild/recreate таблицу dojo/dgrid.
Обычно советуют сбросить коллекцию полей и подключить новый storage. Это все сложно. Показываю как проще (три куска кода из рабочего проекта):
    // destroy grid
// освободить хандлеры событий
    if(featureEditor.dgridRowClickListener != null) featureEditor.dgridRowClickListener.remove();
    if(featureEditor.dgridCellDblClickListener != null) featureEditor.dgridCellDblClickListener.remove();
    featureEditor.dgridRowClickListener = null;
    featureEditor.dgridCellDblClickListener = null;

// грохнуть грид. Пичалька, но тут пропадает DOM элемент, поэтому приходится его пересоздавать
    if(featureEditor.grid) {
        featureEditor.loadingIcon.destroy();
        featureEditor.grid.revert();
        featureEditor.grid.destroy();
        featureEditor.grid = null;
        dojo.place('<div id="grid" class="grid1"></div>', 'grid-legend-parent', 'before');
    }
...

// когда надо, создаем грид
    featureEditor.store = new Memory({
        data:       [],
        idProperty: fields[0].field // OBJECTID probably
    });

    // Dojo's dGrid
    var DataGrid = declare([OnDemandGrid, Selection, CellSelection, Keyboard]);
    featureEditor.grid = new DataGrid({
        store:          featureEditor.store,
        columns:        fields,
        selectionMode:  'single'    /*, noDataMessage:'Nothing found.' */
    }, 'grid');
    featureEditor.grid.startup();
    featureEditor.utils._setListeners();
...
// и когда надо, обновляем данные в гриде
    featureEditor.grid.set("store", featureEditor.store);
    featureEditor.grid.refresh();
Этот фокус прекрасно работает в моем варианте https://github.com/vasnake/feature-service-editor-js

Вот как-то так.



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