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

2015-06-17

Об ML

Взрывной рост IT в последние десятилетия принес в нашу жизнь много разных чудес. Мы их не замечаем, поскольку успеваем привыкнуть к ним за то время, что требуется индустрии на создание масспоп продукта. Но чудеса от этого не становятся менее чудесатыми.
А дальше – больше. Количество непременно перерастает в качество. Никакой фантазии не хватает на то, чтобы представить, как изменится обстановка вокруг нас лет через 50. Если не будет войны, конечно.

Возьмем, к примеру, обработку данных и аналитику. Казалось бы, ерунда какая, сто лет в обед. Но количество принесло новое качество. Шустрые каналы связи, огромные вычислительные мощности, океан уже накопленных и продолжающих поступать с ускорением данных – получаем онлайн аналитику и разнообразные предсказатели. Data Mining & Machine Learning вышли из лабораторий и идут в народ.

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

Bringing Deep Learning to the Grocery Store
...
when we go to the grocery store, it can be difficult to really know exactly what we're purchasing and where it comes from.

Inspired by this problem, a few of us decided to build an application that provides information on a packaged food product based on an image taken with a smartphone. In a future blog post, we will share what we built and how we built it. In this notebook, however, we delve deeper into the actual implementation.

This notebook is divided into 5 main parts:

Data Acquisition - Downloading the data and deduplicating it with the deduplication toolkit.
Finding Similar Foods - Pre-computation which identifies similar foods within the datset. This is useful in similar item recommendations
Image Feature Extraction - Finding a vector representation of images in the dataset using a Deep Learning model
Building the Nearest Neighbor Model/Querying the catalog - Building a model with which you can match a new photo to one in the dataset.
Building a Predictive Service - Turning all our hard work into a hosted service, which later is queried by our phone app!
...



А что там под капотом? Нивапрос, народ интересуется, мы отвечаем:

Top 10 data mining algorithms in plain English
Today, I’m going to explain in plain English the top 10 most influential data mining algorithms
1. C4.5
2. k-means
3. Support vector machines
4. Apriori
5. EM
6. PageRank
7. AdaBoost
8. kNN
9. Naive Bayes
10. CART


И даже можно подробно разжевать – как построить свою собственную нейросеть, с блекджеком и шлюхами, на Python:

How to implement a neural network
These tutorials focus on the implementation and the mathematical background behind the implementations. Most of the time, we will first derive the formula and then implement it in Python.

The tutorials are generated from IPython Notebook files, which will be linked to at the end of each chapter so that you can adapt and run the examples yourself. The neural networks themselves are implemented using the Python NumPy library which offers efficient implementations of linear algebra functions such as vector and matrix multiplications


Поглубже копнуть специфические свойства рекуррентных нейросетей:

The Unreasonable Effectiveness of Recurrent Neural Networks
There's something magical about Recurrent Neural Networks (RNNs). I still remember when I trained my first recurrent network for Image Captioning. Within a few dozen minutes of training my first baby model (with rather arbitrarily-chosen hyperparameters) started to generate very nice looking descriptions of images that were on the edge of making sense. Sometimes the ratio of how simple your model is to the quality of the results you get out of it blows past your expectations, and this was one of those times. What made this result so shocking at the time was that the common wisdom was that RNNs were supposed to be difficult to train (with more experience I've in fact reached the opposite conclusion). Fast forward about a year: I'm training RNNs all the time and I've witnessed their power and robustness many times, and yet their magical outputs still find ways of amusing me. This post is about sharing some of that magic with you.

We'll train RNNs to generate text character by character and ponder the question "how is that even possible?"
...


Ну и всяких прочих источников вдохновения:

Materials for Learning Machine Learning






original post http://vasnake.blogspot.com/2015/06/ml.html

2015-06-15

torrent

Сто лет назад, году эдак в 2003, контора купила мне laptop. Экран 15 дюймов, Pentium-M, 512 мегабайт оперативки, вайфай и все такое. Русско-китайский Ровер.
Он успешно переваривал рабочие задачи, пока в моду не вошла виртуализация. На это его ресурсов уже никак не хватало.
Я его забрал домой и приспособил, со временем, под домашний серверок, работающий 24/365. Веб-аппликухи, торренты и прочая херня. Работает до сих пор, ТТТ.

Так вот, поскольку внутри у машинки HDD, по нынешним меркам, смешной, гигов 40, что-ли, под торренты был приспособлен внешний диск. USB.
Сначала это был самсунговский коробанчик 2.5 дюйма, 600 с чем-то гигабайт. Через года три он сдох от такой тяжелой жизни (24/365).
Тогда я взял списанный трехдюймовый SATA WD, воткнул его в док типа такого:
HDD 2.5"+3.5" SATA AgeStar SUBT

Проработал он полгода, после чего док сдох. Скорее всего, блок питания.
Тогда я купил за 700 рублей коробок-переходник SATA-USB типа такого:
HDD 3.5" SATA AgeStar SUB302

Неделя прошла, пока работает. Конструктивный недостаток у коробайки один: не предусмотрена вентиляция для платы контроллера HDD. От слова «вообще». Так что диск может перегреться.

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

Представляю скрипт на Python, размером в 200 строк, написанный за один день (даже меньше, что как-бы подтверждает миф про норматив 200 строк кода в день). В скрипте используются только модули os, re. При этом он парсит torrent файлы, находит там имена файлов данных и синхронизирует два списка файлов – из торрентов и найденных на диске.





original post http://vasnake.blogspot.com/2015/06/torrent.html

2015-06-10

Паспорт

Ходил сегодня сдавать паспорт на замену. Сдал успешно, на всю операцию потратил часа два времени.
Что приятно, уже не надо ехать к чиновникам по месту регистрации, можно зайти в любое отделение ФМС и провернуть операцию. Правда, если НЕ по месту регистрации, новый паспорт будут делать не две недели а два месяца. Но мне торопиться вроде некуда. А вот тратить только на дорогу в один конец (к месту регистрации) два часа времени мне совсем незачем. Тем более, что за эти два часа я и пошлину в сбербанке оплатил, и фотки сделал и документы в ФМС сдал.

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

Как программист и автоматизатор, я не мог не заметить, что у тетки на руках была распечатанная анкета, построенная из данных, засланных мною через форму на портал. Заполнял я бумажную анкету явно приспособленную для автоматической обработки. То есть, я ввел данные в БД, из нее распечатали бумажную анкету, потом исправленную руками бумагу будут засовывать обратно в БД. Я уже не говорю о том, что электронную форму проверили и приняли, но это ничего не значит для государевой бабы в кабинете.
Где логика, где смысл?

А фотографии? На загранпаспорт (в соседнем кабинете) фотки делают на месте – щелк-и-готово. На драйверскую лицензию аналогично. А вот на внутренний паспорт ты должен принести свои, бумажные фотки. Причем очень жестко ограничены параметры: 30-32 мм лицо в высоту, фотка 35х45 мм.
Что забавно, парень, который делал мне фотки, чуть было не убедил меня в том, что это враки, лицо надо делать больше и фотку больше, а чиновник сам обрежет. Типа, люди делали фотки и возвращались переделывать. Но я не сдался и заставил его сделать фотки по спецификации ФМС. О чем жалеть не пришлось.

И еще про автоматизацию. В сбербанке я встал в очередь к оператору. Тут же ко мне подошел «менеджер» и предложил не ждать, а воспользоваться терминалом для такой простой операции, как оплата пошлины. Ха! Сравните: я даю оператору распечатанную (бланк нарыт в тырнетах) квитанцию и денежку, жду одну-две минуты и дело сделано. А с терминалом надо полчаса тыкать в тупящий сенсорный экран, вписывая охулиарды цифр и букв в экранные формы. Я выходил из сбербанка, а две тетки все продолжали общаться с терминалом, хотя начали они это богопротивное дело еще до моего прибытия в сбербанк.

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

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

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




original post http://vasnake.blogspot.com/2015/06/blog-post_10.html

2015-06-08

Winners of the 7th Underhanded C Contest

Winners of the 7th Underhanded C Contest are now online.
Every year, we will propose a challenge to coders to solve a simple data processing problem, but with covert malicious behavior. Examples include miscounting votes, shaving money from financial transactions, or leaking information to an eavesdropper. The main goal, however, is to write source code that easily passes visual inspection by other programmers.

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

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

Победитель соревнования очень ловко закопал багу в коде аудита, насыщенном макросами. Хотя, опытный глаз, я думаю, без особых проблем обнаружил бы подозрительное место:
#define AUDIT(value)                                    \
({                                                      \
  if (check_clock_skew())                               \
    fprintf(stderr, "ERROR: Clock skew detected! Times reported will be incorrect.\n"); \
  else                                                  \
  {                                                     \
    memcpy(audit_ptr, (char*)&value, sizeof(value));    \
    audit_ptr += sizeof(value);                         \
  }                                                     \
  value;                                                \
})

Занятно и поучительно






original post http://vasnake.blogspot.com/2015/06/winners-of-7th-underhanded-c-contest.html

Upload files by chunks

Грузите апельсины бочками.

Есть у меня демка, загрузка файлов чанками на сервер. Суть в том, что раз чанками, то файлы могут быть любого размера, лишь бы место на диске было.
Вообще-то этих поделок у меня уже порядком накопилось, но тут я про одну конкретную расскажу:
HTML5 FileAPI + Node.js + Socket.io

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

Достал аппликуху с чердака, отряхнул от пыли, засадил за reverse proxy, отягощенный HTTPS и, какая неожиданность, ничего не работает.

Забегая вперед, скажу, что проблем была целая пачка: начиная с нежелания вебсокетов работать через https прокси и заканчивая некоторыми изменениями в реализации FileAPI в разных браузерах.

Проблема первая. Надо заставить вебсокеты работать позади https reverse proxy.
Прокси типа такого:
# /etc/apache2/sites-available/rover-ssl.conf
...
<Location /node/vcu/>
        Order allow,deny
        allow from all
        AuthType Basic
        AuthUserFile /home/valik/.htpasswd
        AuthName "Alwaysglum restricted services"
        Require valid-user
    ProxyPass http://localhost:8080/
</Location>
...

Код в app.js, который прекрасно работает в тепличных лабораторных условиях:
io = require('socket.io').listen(app)
требуется заменить на более изощренный:
io = require('socket.io').listen(app, {'transports': ['polling']})
Почему так и никак иначе, сами догадайтесь.

Теперь второй файл (вся аппликуха состоит из двух файлов), index.html.
Подключение скрипта, меняем вот это:
<script src="/socket.io/socket.io.js"></script>
на более другое:
<script src="socket.io/socket.io.js"></script>
Абсолютные пути для лохов.

И меняем код создания сокета с примитивного
var socket = io.connect();
на более специфичное:
var socket = io.connect(
    'https://alwaysgloom.sytes.net',
    {path: '/node/vcu/socket.io'});

Теперь вебсокеты работать будут.
Осталось решить проблемы совместимости FileAPI в разных браузера.

Если вкратце, то раньше чтение файла браузером с диска было
fileReader.readAsBinaryString(blob);
а стало
fileReader.readAsArrayBuffer(blob);

Что самое удивительное, на сервере в Node.js данные приходят в виде объекта Buffer в обоих случаях! Хотя, казалось бы, очевидно, что должен приходить ArrayBuffer, если клиент засылает ArrayBuffer. Я на этой очевидности потерял пару вечеров, пробуя разные варианты преобразований ArrayBuffer → Buffer.
В итоге, по неясной причине, серверный код править пришлось только в части вызова функций fs.write. Там тоже что-то поломалось.
Конечный вариант использования fs.write выглядит как-то так:
//fs.write(fd, buffer, offset, length[, position], callback)
fs.write(fObj.fHandle, fObj.bytesBuf, 0, fObj.bytesBuf.length, null,
 function(err, written, buffer) { ...

Полностью все тонкости можно рассмотреть тут





original post http://vasnake.blogspot.com/2015/06/upload-files-by-chunks.html

2015-06-04

MongoDB, Django, Docker и прочая фигня

Подборка интересного.

Шпаргалка по mongodb
Довольно объемный пост с примерами запросов, индексов, случаев из жизни e-commerce. Вполне приличное руководство.

Django Development With Docker Compose and Machine
Очень сжатое изложение процесса использования Docker для разработки аппликухи в пяти изолированных контейнерах (Django, Nginx, Postgres, Redis, data). С последующим деплоем в «продакшн».
Сам проект и конфиги тут https://github.com/realpython/dockerizing-django

В предыдущем примере деплой был на Digital Ocean. Поэтому очень органично будет смотреться следущий пост:
Digital Ocean для Continuous Integration! Gitlab + Jenkins [tutorial]
Очень кратко про организацию платформы разработки = репозиторий кода + сервис непрерывной интеграции.

Цепочка продолжается. Только что был упомянут GitLab. И это все о нем:
Представлен релиз платформы для организации совместной работы с Git-репозиториями GitLab 7.11, которая по своим возможностям напоминает GitHub, но не привязана к конкретному сервису, распространяется в исходных текстах под свободной лицензией и позволяет развернуть web-сервис управления проектом на своём подконтрольном сервере. Одновременно доступен релиз развиваемого проектом сервера непрерывной интеграции GitLab CI 7.11, который можно использовать совместно с GitLab для автоматизации тестирования и постоянного контроля за качеством кодовой базы...
Код проекта написан на языке Ruby с использованием фреймворка Ruby on Rails и распространяется под свободной лицензией Expat (вариант лицензии MIT). Для хранения данных поддерживается связка Redis с MySQL или PostgreSQL





original post http://vasnake.blogspot.com/2015/06/mongodb-django-docker.html

Машину просто любить надо

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

mr-pif – Самоучитель - как завести машину в мороз (автомобилистам)

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

Все. Это занимает 1 час. За три осенних месяца время для этого выкроить можно. Масло - всесезонное VISCO 3000 10W40 круглый год. Меняю его каждые 10000 км.

В январе при -30 градусов:
1. Жму пару раз на педаль газа, чтобы пошел бензин. Он замерзает при -60, поэтому по-любому испаряться будет.
2. Включаю зажигание и дальний свет на 10 секунд, чтобы пнуть аккумулятор. Если сразу начнете заводить - аккумулятор загубите.
3. Ставлю нейтралку и обязательно выжимаю сцепление.
4. Начинаю крутить стартер. Если с первого раза не завелся, секунд через 10 бросаю. Со второго раза обычно заводится при любом минусе за бортом.
5. Никогда не жоплюсь заправляться на НОРМАЛЬНЫХ заправках и никогда не выезжаю полностью бак. Если в бензине есть вода - она останется снизу и тогда при пустом баке — каюк.






original post http://vasnake.blogspot.com/2015/06/blog-post.html

Functional

Прекрасная подборка материала для функциональщиков, спасибо ivan-gandhi



Начиная с лекции про то, как применять функциональщину при создании десктопных/мобильных приложений, отягощенных развесистым UI

Продолжая демонстрацией разницы в решении expression problem между объектно-ориентированным подходом и функциональным

И заканчивая достаточно объемным трудом по теме верификации и сертификации программного кода

Очень много интересного и познавательного. Вот только где столько времени взять на усвоение.





original post http://vasnake.blogspot.com/2015/06/functional.html

Архив блога

Ярлыки

linux (241) python (191) citation (185) web-develop (170) gov.ru (157) video (123) бытовуха (112) sysadm (100) GIS (97) Zope(Plone) (88) Book (81) programming (81) бурчалки (81) грабли (77) development (73) Fun (72) windsurfing (72) Microsoft (64) hiload (62) opensource (58) internet provider (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) language (45) hardware (44) JS (41) curse (40) driving (40) money (40) DBMS (38) bigdata (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (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) tourism (19) Apache (16) Manager (15) web-browser (15) Никонов (15) happiness (14) music (14) todo (14) PHP (13) weapon (13) HTTP. Apache (12) SSH (12) course (12) frameworks (12) functional programming (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) crypto (11) game (11) map (11) scala (10) HTTPD (9) ODF (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) Photo (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) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) display (4) holywar (4) nginx (4) pistol (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) USA (3) holiday (3) mount (3) spark (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) font (2) ftp (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) Palanga (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) krusader (1) license (1) mindmap (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)

Google+ Followers