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

2014-08-29

PEP 8, Introduction

Изучаем PEP 8 по частям. Часть 1, Introduction.
Тут говорится о том, что:

документ (PEP 8) содержит соглашения по оформлению кода на Python, включая стандартную библиотеку. Также есть ссылка на PEP 7, в котором определено как писать C-код в реализации Python-а.
Документ, вместе с PEP 257 (оформление docstrings), изначально вышел из эссе, написанного Гвидо, Python Style Guide, с некоторыми дополнениями из руководства от Barry.
Документ живет и изменяется вместе с языком.
Многие проекты подчиняются собственным стилевым правилам, которые для этих проектов имеют преимущество при обнаружении конфликтов.


Ничего особенного, кроме отсылок к PEP 7 и PEP 257.




original post http://vasnake.blogspot.com/2014/08/pep-8-introduction.html

2014-08-28

PEP 8

Интересно было бы посмотреть на раскладку в процентах:
из всех, кто пишет на Python (100%), сколько видели документ PEP 8?
А сколько хотя бы долистали его до конца?
А сколько внимательно изучили сверху донизу?

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

Короткие разделы:

Длинные, объемные разъяснения:

Вот, по одной главе за раз, можно за неделю наизусть выучить весь PEP 8.





original post http://vasnake.blogspot.com/2014/08/pep-8.html

2014-08-27

NTFS

Одна маленькая деталь, связанная с особенностями поддержки файловой системы NTFS в Linux.
В Debian 7 (wheezy) из коробки можно монтировать тома с NTFS только на чтение. Запись становится доступна только если установлен пакет ntfs-3g.

mkdir -p /mnt/ntfsvolume/data/t
# mkdir: cannot create directory Operation not permitted
aptitude install ntfs-3g
# remount /mnt/ntfsvolume
mkdir -p /mnt/ntfsvolume/data/t
# OK

Не забывайте об этом.




original post http://vasnake.blogspot.com/2014/08/ntfs.html

2014-08-26

Apache2 setup in Debian

Очередной раз запускал httpd Apache под Debian 7 (wheezy). Оставлю здесь краткое содержание телодвижений, в качестве шпаргалки.

su -l
aptitude install apache2-mpm-itk apache2 openssl
a2dissite default
cp /etc/apache2/sites-available/default-ssl /etc/apache2/sites-available/rover-ssl.conf
a2ensite rover-ssl.conf
service apache2 restart
curl -k https://localhost/
openssl s_client -connect 192.168.1.9:443 -state -debug
mkdir -p /etc/ssl/localcerts
openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/localcerts/apache.pem -keyout /etc/ssl/localcerts/apache.key
ls -la /etc/ssl/localcerts/
chmod 600 /etc/ssl/localcerts/apache*
a2enmod ssl
nano /etc/apache2/sites-available/rover-ssl.conf
nano /etc/apache2/ports.conf
netstat -tnlpua|grep apache2

nano /etc/apache2/sites-available/rover-ssl.conf
<IfModule mod_ssl.c>
    NameVirtualHost *:443
    <VirtualHost *:443>
            SSLEngine On
            SSLCertificateFile /etc/ssl/localcerts/apache.pem
            SSLCertificateKeyFile /etc/ssl/localcerts/apache.key
    AssignUserId valik root
    DocumentRoot /home/valik/www/
    <Directory /home/valik/www/>
            AuthType Basic
            AuthUserFile /home/valik/.htpasswd
            AuthName "Alwaysglum restricted services"
            Require valid-user
    </Directory>
    Alias "/torr/" "/mnt/sams640/data/"
    <Directory /mnt/sams640/data/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride None
            Order allow,deny
            allow from all
            AuthType Basic
            AuthUserFile /home/valik/.htpasswd
            AuthName "Alwaysglum restricted services"
            Require valid-user
    </Directory>
    </VirtualHost>
</IfModule>

nano /etc/apache2/ports.conf
# NameVirtualHost *:80
# Listen 80
<IfModule mod_ssl.c>
    Listen 443
</IfModule>
<IfModule mod_gnutls.c>
    Listen 443
</IfModule>

su -l valik
htpasswd -c ~/.htpasswd guest
htpasswd ~/.htpasswd valik

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




original post http://vasnake.blogspot.com/2014/08/apache2-setup-in-debian.html

2014-08-25

Samba & Win Explorer

Сегодня я наблюдал загадочное поведение MS Windows Explorer. Он ни в какую не хотел показывать содержимое Samba ресурса с моей торрентокачалки. Сообщает: доступ запрещен, ничего не знаю.

Возюкался я с разными опциями довольно долго, пока не решил попробовать доступ к шаре через командную строку (cmd.exe). Попробовал и изрядно удивился — в консоли доступ к ресурсу есть и ничего не застревает.

Для закрепления успеха я запустил Total Commander и в его командной строке задал:
cd \\rover\torr\data
Кто бы мог подумать, тут тоже никаких проблем не было.

В итоге я сделал вывод, что Win Explorer это отстой никуда не годный и опираться на его мнение нельзя. Тем более, что на всех машинах с MS Windows я всегда насаждаю Total Commander в качестве шелла. Samba ресурс настроен нормально, доступ к нему есть, тема закрыта.

Есть, правда, один нюанс. Доступ я настраивал не к простой папке а к заковыристой. На Linux box (с Самбой который) в домашней папке есть каталог torrent, в этом каталоге лежит symlink на папку /mnt/sams640, в который при загрузке компа монтируется внешний диск. И не просто монтируется а через truecrypt. Что сильно влияет на параметры доступа к файлам из этого ресурса.
Очевидно, виндовый эксплорер хочет каких-то атрибутов от расшаренной папки, но этого ему не дают, то ли из-за симлинка, то ли из-за трукрипта. И он обламывается. А консоль и Тотальный Командир попроще, им, кроме стандартных атрибутов, ничего не надо.

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

root@rover:~# diff -u /etc/samba/smb.conf.orig /etc/samba/smb.conf
--- /etc/samba/smb.conf.orig 2014-08-08 16:20:28.951020194 +0400
+++ /etc/samba/smb.conf 2014-08-08 18:00:35.458898060 +0400
@@ -35,7 +35,7 @@
 ## Browsing/Identification ###

 # Change this to the workgroup/NT-domain name your Samba server will part of
-   workgroup = WORKGROUP
+   workgroup = NHOME

 # server string is the equivalent of the NT Description field
    server string = %h server
@@ -100,6 +100,11 @@
 # /usr/share/doc/samba-doc/htmldocs/Samba3-HOWTO/ServerType.html
 # in the samba-doc package for details.
 #   security = user
+security = user
+guest account = valik
+follow symlinks = yes
+wide links = yes
+unix extensions = no

 # You may wish to use password encryption.  See the section on
 # 'encrypt passwords' in the smb.conf(5) manpage before enabling.
@@ -331,3 +336,26 @@
 ;   preexec = /bin/mount /cdrom
 ;   postexec = /bin/umount /cdrom

+[www]
+comment = www files
+path = /home/valik/www
+guest ok = yes
+read only = no
+browseable = yes
+create mask = 0666
+directory mask = 0777
+public = yes
+force user = valik
+force group = valik
+
+[torr]
+comment = torrents folder
+path = /home/valik/torrent
+guest ok = yes
+read only = yes
+browseable = yes
+create mask = 0666
+directory mask = 0777
+public = yes
+force user = valik
+force group = valik

Тысячестраничный документ по Samba 3

Он же в более удобном виде

(Samba) Warning: security=share is deprecated

Samba, Symlinks and unix extensions

Как рекурсивно установить разный доступ к папкам и файлам
# To recursively give directories read&execute privileges:
find /path/to/base/dir -type d -exec chmod 755 {} +
# To recursively give files read privileges:
find /path/to/base/dir -type f -exec chmod 644 {} +




original post http://vasnake.blogspot.com/2014/08/samba-win-explorer.html

2014-08-22

MS SQL stored procedures

* How can I use the result set from one stored procedure in another, also expressed as How can I use the result set from a stored procedure in a SELECT statement?
* How can I pass a table data in a parameter from one stored procedure to another?

Наверняка каждый(*) хоть раз да сталкивался с ситуацией, когда удобно было бы написать что-то вроде
select * from (exec mydb.myschema.uspMyStoredProc @param1 = N'value 1', @param2 = N'value 2')

* - каждый это в смысле каждый из множества тех, кто относительно плотно работал с MS SQL Server.

И вот ведь незадача, так писАть нельзя. А как можно? Вот на этот вопрос и отвечает очень подробная и развернутая статья:

How to Share Data between Stored Procedures

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




original post http://vasnake.blogspot.com/2014/08/ms-sql-stored-procedures.html

2014-08-21

In Fu Wo

Как-то Сисадмин спросил:

Учитель, не желаете ли красивую картинку для вашего десктопа? У меня есть коллекция "обоев для рабочего стола" со звёздным небом и моральным законом.

Почему ты думаешь, что мой нынешний "wallpaper" хуже? – спросил в ответ Инь Фу Во.

Я не знаю, какая у вас картинка сейчас. Я никогда не видел вашего десктопа. У вас всегда открыто множество окон.

Я тоже его никогда не видел, – сказал почтенный Инь. – Я работаю.


Мне кажется, в этом блоге уже проскакивало что-то из изречений Инь Фу Во. Чтобы сказать с уверенностью надо поискать, но лень. Палюбому, подобная мудрость вполне достойна повторения.


Мне почему нравится конкретно эта притча? Потому как я сам практически никогда не вижу «обоев» на своих десктопах. Открытые окна загораживают.



original post http://vasnake.blogspot.com/2014/08/in-fu-wo.html

2014-08-20

Площадка

Опять про контору с именем Автошкола-онлайн.

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

Мне понравилось. Машина новая, Фольксваген Поло в базовой комплектации. Едет на холостых оборотах и не глохнет, если сцепление не бросать. Не скрипит и не чихает. Инструктор измучен жарой, тупой работой и не менее тупыми студнями, но держится, учит из последних сил :)

Что не понравилось — на площадке нет эстакады! Чтобы разучить упражнение «старт в горку», надо ехать куда-то в город, тратить время по пробкам. Это беда. Как будем выкручиваться, я не знаю.

Вот она, площадка вождения «на Речном вокзале» она же «на Водном стадионе»:

рядом с адресом: Ленинградское шоссе, 51а. Некоторые считают, что это площадка ОСТО МАИ, но это не так, пруф.




original post http://vasnake.blogspot.com/2014/08/blog-post_20.html

2014-08-19

translitbot

Постепенно навожу порядок в своих открытых прожектах. Вот и до XMPP (Jabber) бота руки дошли. Это тот бот, который транслитерацию делает, по любой из 13 таблиц.
Оформил код в пакет Python, поправил всякое по мелочи. Заодно понял, что надо бы его перевести с библиотеки xmpppy на sleekxmpp. Попробую не растягивать на еще один год :)




original post http://vasnake.blogspot.com/2014/08/translitbot.html

2014-08-18

libtorrent-rasterbar 0.15/0.16

Более полугода назад я написал заметку про нашего мальчика то, как подружить торрент качалку Deluge с трекером rutracker.org. Сегодня у меня готово небольшое дополнение к той заметке.

Случилось так, что на машинке-торрентокачалке я переустановил систему. Был Debian jessie, стал Debian wheezy (debian_version 7.6). Как результат, версия библиотеки libtorrent сменилась с 0.16 на 0.15, так мантейнеры пакетов порешали. И вроде бы ничего не поломалось, Deluge ставится и собирается, патч налепливается, причем без разницы, Deluge 1.3.6 или Deluge 1.3.7. Даже запускается. Но вот потом начинаются чудеса — в консоль сыпятся Python traceback-и, намекающие на невозможность загрузить ранее сохраненные состояния, создать сессию и пр. Работать отказывается, короче. Если убрать патч — работает, но конфликтует с рутрекером, понятное дело.

Не буду утомлять вас перечислением моих танцев с бубнами, сразу перейду к решению проблемы.
Проблема была в том, что код патча не совместим с библиотекой libtorrent версии 0.15. Следовательно, решение в том, чтобы удалить из системы пакет с версией 0.15 и установить из сырцов библиотеку 0.16

su -l
aptitude purge libtorrent-rasterbar6 libtorrent14
aptitude install libboost-all-dev
su -l valik
pushd /opt/deluge
wget http://downloads.sourceforge.net/project/libtorrent/libtorrent/libtorrent-rasterbar-0.16.16.tar.gz
tar xvzf libtorrent-rasterbar-0.16.16.tar.gz
pushd /opt/deluge/libtorrent-rasterbar-0.16.16
./configure --enable-python-binding
make
sudo checkinstall -D
python -c "import libtorrent as lt; print lt.version"
    0.16.16.0
sudo ldconfig

Процедура сборки не быстрая, генерируется более полугигабайта объектного кода. Но после обновления библиотеки, Deluge забыл все капризы и начал работать как положено
pushd /opt/deluge/deluge-1.3.7
source env/bin/activate
deluge -v
    deluge: 1.3.7
    libtorrent: 0.16.16.0


Полезные материалы:




original post http://vasnake.blogspot.com/2014/08/libtorrent-rasterbar-015016.html

2014-08-15

Оргсобрание

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

Свежие впечатления.

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

И вот, я несколько расслаблен, повторяю ПДД и прохожу билеты (в надцатый раз), мирно жду шестого августа — первого занятия по вождению. Как вдруг, внезапно, 4 августа мне приходит СМС-ка с приглашением посетить 6-го августа некое «организационное собрание». В принципе, я был готов, про это собрание есть запись в зачетке — вам, типа, сообщат, непременно приходите, это очень важно.
Но вот ведь зараза — оргсобрание пересекается с первым уроком по вождению — я либо на урок не попадаю, либо на оргсобрание. Что делать? Кто виноват? Зачем им в компьютере календарь, если они им пользоваться не умеют?
Приблизительно такие вопросы я задавал небу, в процессе дозвона на вечно занятый телефон автошколы.

Через полчаса прозвонился, спросил у девочки, типа и чего теперь делать? На оргсобрание забить или на урок вождения?
А мне отвечают — забей на оргсобрание, его всегда можно посмотреть на нашем сайте http://webinar.auto-online.ru/schedule
там, где в расписании дата 3 марта http://webinar.auto-online.ru/events/201
Формат флешового видеоролика.

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

А оргсобрание, которое, кстати, должно было быть пару недель назад, вообще ни о чем. Говорящие головы под убогую muzak рассказывают то, что я уже и так знаю — как сдавать внутрениие экзамены и на чем обычно ученики сыпятся в ГИБДД. Процедурные вопросы обозревают на протяжении 32 минут. Очень хорошо, что я на это собрание не поеду — чисто потеря времени.

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

Еще кстати, вот, нашел еще автошколу на севере Москвы: ОСТО МАИ http://www.osto-mai.ru/services/cat_b/
Сервиса у них не так много, зато и цены пониже. И, возможно, вранья поменьше.
Хорошо бы развернутый отчет вменяемого студня почитать.




original post http://vasnake.blogspot.com/2014/08/blog-post_15.html

2014-08-14

portal_view_customizations

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

Давайте поглядим на примере категорий (ака keywords, tags, categories), присваиваемых страницам, как можно поменять их вывод на страницу.
Допустим, у нас есть страница с тегами. Тогда при рендеринге этой страницы, внизу, вы увидите нечто вроде
Filed under: category
Как быть, если надо убрать текст «Filed under» и оставить только теги?

Первым делом попробуем посмотреть на раскладку страницы по въювлетам (viewlets), для чего к URL допишем /@@manage-viewlets, например так:
http://localhost:8080/cms/news/prognoz/@@manage-viewlets
Картина интересная.

Самое главное, видно, что тег находится внутри рамочки с заголовком
Viewlet: plone.belowcontenttitle.keywords
которая, в свою очередь, внутри
ViewletManager: plone.belowcontent (plone.app.layout.viewlets.interfaces.IBelowContent)
Это дает нам очень важную информацию — названия интерфейсов и компонент.

Теперь заглянем в реестр
и найдем там известные нам компоненты
plone.belowcontenttitle.keywords (zope.publisher.interfaces.browser.IDefaultBrowserLayer)

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

Щелкаем по записи в реестре, нажимаем «customize» и вносим нужные поправки. В частности, убираем текст «Filed under» заменив
<tal:filedunder i18n:translate="label_filed_under">Filed under:</tal:filedunder>
на
<!-- tal:filedunder i18n:translate="label_filed_under">Filed under:</tal:filedunder -->

Сохраняем шаблон, проверяем вид страницы (может понадобится жесткий reload — Ctrl-R, Ctrl-F5). Надпись исчезла, что и требовалось.

В общих чертах как-то так и выглядит кастомизация страниц Plone, та, которую нельзя (или трудно) сделать через Diazo theming.

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

И, гораздо более подробно (thanks to Martin Aspeli), тут:




original post http://vasnake.blogspot.com/2014/08/portalviewcustomizations.html

2014-08-13

Plone sticky news

Недавно мне пришлось порешать одну проблему, связанную с коллекцией новостей (News Collection) в Plone.
Интересное дело, каждый второй пользователь хочет управлять порядком вывода новостей (News Item) в ленте (коллекции) и, соответственно, в портлете. В нашем случае надо, чтобы всегда верхней новостью болтался прогноз погоды. Другие пользователи хотят видеть сверху featured news. Почти как рекламные баннеры.

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

Если подумать, то универсальное решение проблемы может быть таким. Поскольку агрегатор новостей это просто коллекция, почему бы не сделать составные коллекции? Берем две традиционные коллекции, где в одной собраны/отфильтрованы featured новости а в другой все остальные, склеиваем их в одну, составную коллекцию. И, что важно, эту составную коллекцию не сортируем! Вуаля, используем составную коллекцию как агрегатор (ленту) новостей.

Я же решил проблему в лоб. Как уже сказано, агрегатор новостей это просто коллекция (это хорошо видно, если перейти на вкладку «содержание» раздела новостей). После поиска новостей в каталоге по заданным критериям, полученный список сортируется по заданному полю. Обычно это «эффективная» дата. Я же выбрал сортировку по полю тегов (категорий).
После чего достаточно в публикуемых новостях прописывать тег типа «2014-07-30». Тогда новость с таким тегом окажется между «2014-07-29» и «2014-07-31». А sticky/featured news надо пометить тегом типа «горячее, как пирожки» и сортировка их поставит вверху списка.
Потенциальных проблем две: если у новости не указать тег, в ленте ее видно не будет; со временем тегов наберется много или очень много, что может тормозить UI и вредить UX.

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

Выходит, в мой todo список попала еще одна задача: сделать аддон – составные/комбинированные коллекции для Plone.

Кстати, нашел интересный аддон http://plone.org/products/contentwellportlets/
позволяет портлеты поместить в любое место страницы.

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


UPD.
Только что нашел интересный текст:

Related items aren't as normal criterion results. Related items are added to the resultset of the Collection, but:
They are not sorted using the choosen sorting criteria
They are not mixed with normal results
They are always returned first
So related items are always used first, then other results are displayed. This can be good (because you can use this feature to put an high important news as first item of your Collection) but not simple to understand. However this is not a bug... mix related items and other results sorting them all can be complex and expensive for Plone.


Это выходит так, что можно добавить related объекты к результату выдаваемому коллекцией, и эти объекты будут выведены первыми? Так именно этого нам и надо!
Проверю.




original post http://vasnake.blogspot.com/2014/08/plone-sticky-news.html

2014-08-12

Языки программирования

Занятное чтиво на хабре нашлось – «Какой язык программирования больше всего любят в Яндексе? И всегда ли любовь взаимна».
Опытных программеров Яндекса попросили рассказать о используемых и любимых ЯП. Поучительно.

Мне особенно понравилось такое:

Мой любимый язык — Erlang, поэтому я здесь на нём и пишу. Когда я думал о том, как я хочу программировать, я подумал-подумал и что-то придумал. И когда я начал рассказывать об этом своим друзьям, они сказали, что я придумал Erlang. Поэтому я просто взял его и стал на нем писать

И вот эдакое:

Например, есть у нас люди (и некоторые из них даже сидят со мной в одной комнате), которые любят писать большие программы на языке Shell. Это ужасно. Зачем они это делают, я не знаю, но они их пишут. И мне их приходится читать. Это неприятно

И еще вот это:

Мой любимый язык программирования не для работы, а для души, это, конечно, Haskell. По крайней мере, когда я о нём узнал, он произвел на меня самое большое впечатление. Все, что было до этого, померкло. Я представить себе не мог, что могут быть языки программирования настолько стройные математически. Какие там замечательные системы типов, какие там замечательные ленивые вычисления, как там можно удобно и компактно формулировать мысли. Но я прекрасно понимаю, что для работы он более-менее не применим. На нём удобно писать статьи, когда ты хочешь рассказать о каком-то алгоритме так, чтобы его очень хорошо все поняли, а твой рассказ при этом был очень коротким. Вот в таких случаях код лучше всего написать на Haskell. Кому надо, те поймут

И вот это:

У меня нет любимого языка программирования, потому что язык программирования — это инструмент, то, чем ты сейчас пользуешься. Есть языки, на которых мне нравится писать больше и на которых мне нравится писать меньше, но нет любимых. Я достаточно консервативен в выборе. То есть у каждого программиста есть коробочка с языками, которые он использует. Я хочу, чтобы моя коробочка была маленькой, и на текущий момент времени я выбрал для себя C++ и Python. Собственно эти языки и использую. Но они не любимые, а просто инструмент.
Начиная с какого-то времени, хороший программист может за неделю-две войти в курс дела и начать писать на любом языке — это совершенно не вопрос


Согласен на 146%

Правда, насчет «неделю-две … на любом языке» есть нюанс. Если программист профи в императивном программировании (узкий специалист), вряд ли он за неделю-две начнет писать что-то вменяемое на декларативном языке (Лисп, к примеру). С другой стороны, хороший программист обычно знает и умеет писать в разных парадигмах, поэтому освоить новый язык можно действительно за неделю-две. А потом всасывать бест практис и библиотеки — еще несколько месяцев.


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

2014-08-11

Внутренний экзамен

Дополнение к заметке про экзамены в автошколе-онлайн.
Как я и предполагал, чтобы получить отметку о сдаче внутреннего экзамена по теории (ПДД), достаточно прорешать все задачки (билеты) с ихнего DVD, после чего программулина засылает в контору некий «сертификат». Остается посетить девочку на ресепшене, на Волгоградке, и попросить ее поставить отметку в карточку. Процедура точно такая, как и с другими внутренними зачетами по теории – «первая помощь», «устройство автомобиля» и «основы безопасности».
Удобно совместить простановку всех отметок в одно посещение конторы, незачем туда лишний раз ездить.

Кстати, мне совершенно непонятно, о чем думают владельцы этой конторы, наблюдая безумную загрузку отдела «назначения практических занятий», кабинет №4.
Просидеть час в очереди в этот кабинет — обычное дело. А прозвониться туда по телефону вообще нереально. А ведь все, что делают в этом кабинете девочки-хохотушки, это расставляют по календарю часы практических занятий. При этом ни поиска у них нет, ни распечатки расписания (это ваще пиздей, девочка втыкает в ноутбук, предлагает варианты — день, час, а ты ручкой на бумажке себе записываешь — смотри не ошибись!).

Если бы зарплату этих трех девочек отдать толковому программисту и поставить ему задачу грамотно, можно было бы и денег сэкономить и от очередей избавиться и хороший PR сделать, позволив людям работать со своим расписанием через Интернет. Тем более, автошкола явно стремится внедрять автоматизацию в процессы обучения.
А так только недовольные рожи можно наблюдать — кому же нравится за свои деньги (немалые весьма) в очередях сидеть и по любому чиху ездить на кудыкину гору в офис на Волгоградке.




original post http://vasnake.blogspot.com/2014/08/blog-post_11.html

2014-08-08

Толковый мужик

Вацлав Клаус — молодец!
Хотите почитать что-нибудь толковое про политику, почитайте Клауса.





original post http://vasnake.blogspot.com/2014/08/blog-post_8.html

2014-08-07

one hundred twenty-three million four hundred fifty-six thousand seven hundred eighty-nine

Внезапно, всемогущий гугель подсказывает как проговорить то или иное число словами:

=
one hundred twenty-three million four hundred fifty-six thousand seven hundred eighty-nine

Подробнее можно почитать тут: https://support.google.com/websearch/topic/4386094




original post http://vasnake.blogspot.com/2014/08/one-hundred-twenty-three-million-four.html

2014-08-06

Итоги


Что ж, давайте поглядим, сколько материала в этом блоге получилось по итогам курса Machine Learning.

Linear Regression

Logistic Regression

Neural Networks, forward/back propagation

Advice for Applying Machine Learning: algorithm evaluation, metrics, high bias/high variance — суть underfitting/overfitting, learning curves

Support Vector Machines (SVMs), Large Margin Classificators, Kernels

Clustering (K-Means)

Dimensionality Reduction, Principal Component Analysis (PCA)

Anomaly Detection, Multivariate Gaussian Distribution

Recommender Systems, Content-based recommender systems, Collaborative filtering

Large-scale Machine Learning, Stochastic Gradient Descent, Mini-batch Gradient Descent; Online Learning

Map-Reduce and data parallelizm

Photo OCR example application, pipeline, sliding window

Getting lots of data; Ceiling Analysis

И ведь это только начало. Поверхностный взгляд показывает огромное количество неохваченного курсом материала.



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

2014-08-05

Getting Lots of Data and Artificial Data


Получилось так, что мое изложение материала последней, 10-ой недели обучения Machine Learning (тема «Large-scale Machine Learning») растянулось аж на четыре статьи. Stochastic Gradient Descent, Map-Reduce, Photo OCR app Example и эта, Getting Lots of Data and Artificial Data + Ceiling Analysis.

Сделав оговорку, что нам не всегда нужны огромные датасеты, можно сказать, что
low biased learning algorithm + masive training set может привести к успеху предприятия.

Есть два подхода к получению больших датасетов:
* генерация данных в дополнение к сбору (расширяя собранные данные);
* генерация данных с нуля.

Допустим, у нас есть датасет для распознавателя букв. Чтобы увеличить этот датасет, мы можем взять пачку шрифтов, напечатать буквы из них на разных подложках и использовать это как синтетические данные для трен.сета.
Это был пример по созданию данных с нуля.

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

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

Часто оказывается, что даже вручную собирая/обрабатывая данные, нужно потратить всего несколько дней для получения набора в 10 раз большего чем уже есть. Данные можно собирать вручную, можно построить автоматический генератор — попробуйте оценить, сколько на это уйдет времени.


Ceiling Analysis: What Part of the Pipeline to Work on Next
Самый ценный ресурс — это наше разработческое время. тратить его надо только на то, что принесет явную пользу. Очень плохо, когда мы тратим недели, месяцы на разработку направления, которое по итогам не даст серьезного улучшения в решении задачи.
Профессор Эндрю знает историю, когда два инженера работали полтора года над удалением фона с картинок (задача была – распознавание лиц или вроде того), сделали офигенную работу и опубликовали научный труд. Но для их задачи этот модуль был не важен, как оказалось. Увы.

Вопрос можно поставить так: на чем сконцентрироваться? Какая часть pipeline, в случае ее улучшения, даст максимальный эффект?
Тут появляется методика Ceiling Analysis.

Для начала нам нужна числовая метрика (например accuracy) для всей системы.
Теперь мы по очереди, один за одним имитируем достижение 100% точности каждого блока pipeline. И замеряем точность всей системы. Какой блок дает наибольший вклад в увеличение точности всей системы, тот блок и надо совершенствовать в первую очередь.


That's all Folks!


original post http://vasnake.blogspot.com/2014/08/getting-lots-of-data-and-artificial-data.html

2014-08-04

Machine Learning Example Application

Продолжим.
Две предыдущие статьи (раз, два) содержат начало и продолжение рассказа о 10-ой неделе обучения (https://www.coursera.org/course/ml), тема «Large-scale Machine Learning». Были рассмотрены темы: Stochastic Gradient Descent, Mini-batch Gradient Descen, Online Learning, Map-Reduce and Data Parallelism.

Завершилась 10-я неделя обучения (и курс в целом) рассказом о построении комплексного приложения, использующего техники Machine Learning.
Приложение «Photo OCR» должно находить на фотографиях надписи и превращать их в текст.

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

Чтобы построить такое приложение, надо решить целый ряд задач.
Задача первая — нормализация изображений, что означает приведение к общему знаменателю цветности, контрастности, яркости, ориентации в пространстве и тому подобное.

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

В нашем Photo OCR пайплайн будет такой: Image → Text Detection → Character Segmentation → Character Recognition.

Задача Text Detection может быть решена применением техники известной как Sliding window classifier.

В целом, классификатор по скользящему окну работает так (на примере пешеходов): сперва мы готовим тренировочный датасет с картинками пешеходов и всего остального, что попадает в объектив фотокамеры; мы тренируем нейросеть на распознавание пешеходов на картинках из трен.сета.

Имея классификатор (нейросеть), обученный отличать пешеходов от всего остального, мы можем подавать ему на вход куски (patch) интересующей нас картинки, получая ответ — пешеход или нет.

Фишка в том, как готовить эти патчи — техника скользящего окна. Для начала надо выбрать некий исходный размер этого окна и перемещать его по всей картинке, чтобы пошагово в рамку/окно попали все детали изображения. Потом размер окна увеличивается и цикл повторяется. И так столько раз, сколько надо, чтобы покрыть все возможные варианты фигур пешеходов на картинке.

Так вот, с текстом практически также, только вместо пешеходов — буквы.

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

На такую картинку мы натравливаем Expansion Operator. Этот оператор работает так: для каждого пикселя он смотрит, нет ли в его окрестности белого пикселя, если есть, данный пиксель тоже окрашивается белым. Так мы получаем эффект размытия, что дает нам вместо отдельных букв границы надписей. Мы находим регионы с белым цветом и находим для них рамки/боксы. Далее убираем боксы с неправильным aspect ratio — обычно текст ширше чем выше. В результате получаем боксы/рамки для скармливания распознавателю текста.

Следующий этап в pipeline — это character segmentation.
Задача этого этапа: получив на вход изображения надписей (полученный на предыдущем шаге), найти пробелы между буквами. Лично я не очень понял, почему поиск пробелов между буквами проще/легче чем поиск самих букв.

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

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

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

Осталось заключение: как добывать данные для датасетов, что можно сделать, чтобы увеличить/улучшить датасет, что делать для повышения качества продукта — во что вложиться для более точной классификации/предсказания/...
Продолжение следует


original post http://vasnake.blogspot.com/2014/08/machine-learning-example-application.html

2014-08-01

Large-Scale Machine Learning & Example

Продолжим.
В предыдущей статье я начал рассказ о 10-ой неделе обучения, тема «Large-scale Machine Learning». Были рассмотрены темы: Stochastic Gradient Descent, Mini-batch Gradient Descen, Online Learning.

Как рассказывал профессор, есть два основных подхода к перевариванию больших датасетов:
Stochastic Gradient Descent и
Map Reduce (data parallelizm)

Посмотрим на Map Reduce and Data Parallelism.

В отличие от Stochastic Gradient Descent, который способен обрабатывать большие датасеты на одном вычислительном узле, техника Map-Reduce дает возможность задействовать много вычислителей. Данные делятся на порции, эти порции обрабатываются параллельно на разных процессорах/узлах и результаты обработки консолидируются.

Предположим, у нас есть четыре машины и мы хотим, используя Batch Gradient Descent, найти оптимальные значения параметров модели. Допустим, датасет у нас состоит из 400 записей. Тогда первая машина будет считать сумму для записей 1-100, вторая 101-200, третья 201-300 и четвертая 301-400. Все эти суммы высчитываются параллельно. Схема понятна, так можно раскидать любое количество записей на любое количество узлов. Этот шаг называется «Map».
Финальный результат получается складыванием четырех значений, полученных с четырех вычислительных узлов. И этот шаг называется «Reduce». Просто, не правда ли.

Очень многие алгоритмы Machine Learning сводятся к вычислению сумм по набору данных — датасету. Если датасет огромен, вычисление сумм можно параллелить в технике Map-Reduce.

Кстати, используя многоядерные процессоры, можно получать выгоду от Map-reduce даже на одной машине.

Вот, собственно, и все, что нам рассказал профессор о Big Data применительно к Machine Learning.





original post http://vasnake.blogspot.com/2014/08/large-scale-machine-learning-example.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)