Архив

Архив раздела ‘Программирование’

2 место на конкурсе Pri-matrix Factorization

26 декабря 2017 Нет комментариев

В этот раз пришлось раскладывать по полочкам 1 ТБ видеофайлов. Из которых 200К тренировочные, 80К тестовые и 160К неразмеченные. Сортировка велась по 24 классам. Из которых 23 класса различные животные и 1 класс на кадры без животных. Точность у моделей крайне высокая.

Описание конкурса | Таблица результатов

И традиционно небольшое видео по мотивам конкурса:

2 место в конкурсе «N+1 fish, N+2 fish»

31 октября 2017 2 комментария

Закончился конкурс от DrivenData: N+1 fish, N+2 fish. Удалось взять второе место.

Небольшое видео с результатами работы алгоритма

Как отладить нестандартную loss-функцию на Keras?

Основная проблема с Loss функцией — это проблема с выводом значений переменных внутри неё, она компилируется и затем выполняется на GPU, где никакой print не работает. Методика для отладки может быть следующая.

1) Создаем 2 numpy-массива, содаржащие TRUE и PREDICTED значения. Например:

2) Делаем стандартную Python функцию которая вычисляет на основе этих переменных Loss. Убеждаемся что она работает верно.

3) Пишем функцию для Keras с использованием бекенда и которая затем будет передваться как loss-функция в метод compile.

4) Вызываем numpy функцию и keras функции:

Убеждаемся что результат одинаков. Если нет правим ошибки.

Как я собирал комп для Deep Learning (год 2017)

21 апреля 2017 1 комментарий

Выиграв конкурс и получив призовые, встал вопрос о втором компе, который будет играть роль сервера для расчёта нейронных сеток. На своём 980 Ti с 6 GB памяти мне стало тесновато. И например на 3Д свёртках в задаче с раком лёгких я утыкался в лимиты. Да и при запуске расчётов работать за компом становилось не комфортно из-за тормозов интерфейса, да и Youtube особо не посмотришь.

Итак после небольшого изучения рынка и опыта товарищей по цеху, было принято решение собирать компьютер из 4 GPU. Для этого было выбрано 4 видео карты, 2 свежие NVIDIA 1080 Ti 11 GB + 1080 8 GB + 1070 8 GB. Две последние из-за относительной дешевизны. За это решение, впрочем, меня критиковали.

Сразу оговорюсь, что компы я собираю редко и не люблю тратить на это время. Плюс я не знаю много тонкостей в сочетании разных комплектующих. Поэтому я заказывал все комплектующие в одном месте вместе со сборкой. Артур (n01z3) мне посоветовал Регард. Я и до этого там покупал что-то из комплектующих, но не знал что они занимаются и сборкой, которая кстати бесплатная. К тому же у них шикарный конфигуратор: http://www.regard.ru/cfg  Там правда возможно выбрать только 2 видеокарты, но ещё 2 можно написать в комменте к заказу (что я и сделал).

Тонкости
1) Крайне мало материнских плат поддерживают 4 видеокарты, прежде всего из-за их размеров. Топовые видеокарты занимают сразу два слота.
2) Соответственно из-за больших размеров комплектующих лучше заказать корпус максимального размера. Я ориентировался на XL-ATX
3) В пике каждая видеокарта может потреблять более 250W, соответственно 4 это уже 1000W. Не забываем что энергию едят и другие устройства. Поэтому блок питания нужен минимум на 1200 W. Я взял с запасом на 1500 W.
4) Ожидаемо, что при таких потреблениях энергии всё это хозяйство будет сильно греться. Дополнительно в корпус я запихнул 4 вентилятора.
5) Для того что бы комп не вырубался при перепадах энергии я заказал UPS, который держит 1500W, мой стандартный начинал жалобно пищать от перегруза во время работы всех 4 карточек.
6) Изначально я решил не тратиться сильно на процессор, из-за того что одна и та же серия при небольшой казалось бы разнице в производительности может различаться по стоимости в разы. Однако для поддержки 4 видеокарт надо брать процессор с 40 линиями PCI, первый который я выбрал был только на 28.
7) У процессоров есть ограничение на количество поддерживаемой памяти. В моём ограничение было 64 GB (это я выяснил уже постфактум на этапе сборки), однако каким то чудом видно все заказанные 128 GB и я проверил их скриптом, что всё записывается и читается. Вообще я не уверен что для DL нужно 128 ГБ, потому-что я уже давно перешёл от модели зачитки всех изображений в память к работе с отдельными батчами, а там обычно много оперативной памяти не требуется. Batch Generator наше всё.

Читать далее…

Как запустить программу в Linux которая будет работать после выхода

1) Запустить программу «myprogram»
2) Нажать Ctrl+Z
~~~ [1]+ Stopped myprogram
3) Ввести команду (после процента номер который указан выше [1])
~~~ disown -h %1
4) Ввести (тот же номер):
~~~ bg 1
5) На экране появится [1]+ myprogram &

После выполненных действий можно смело выходить и программа продолжит работать.

Второй метод:
1) Создать новый screen и запустить программу там:
screen -S anyname

word2vec — бинарники под Windows x64

13 ноября 2015 Нет комментариев

Пришлось тут собрать себе word2vec под Windows на 64-х битную платформу. Столкнулся с рядом проблем, поскольку код писался под Linux. Было пару функций POSIX которые пришлось добавлять и Pthreads под Windows искать. Так что если кто-то не хочет мучиться бинарники под Windows (64 бит) в архиве (~350KB).

Количество подписчиков канала на YouTube

19 октября 2013 Нет комментариев

https://gdata.youtube.com/feeds/api/users/НАЗВАНИЕ_КАНАЛА?alt=json-in-script&callback=getYoutubeChannelSubscribers&v=2

НАЗВАНИЕ_КАНАЛА — название канала где требуется посмотреть число подписчиков.

Например:
https://gdata.youtube.com/feeds/api/users/wwwamvnewsru?alt=json-in-script&callback=getYoutubeChannelSubscribers&v=2

Данные приходят в формате JSON. Соответственно на jQuery это можно написать как-то так:

Получить количество пользователей группы Вконтакте через API

17 октября 2013 Нет комментариев

http://api.vk.com/method/groups.getById?gid=ID&fields=members_count

ID — уникальный номер группы. Можно посмотреть его в УРЛ на странице статистики.

Например:
http://api.vk.com/method/groups.getById?gid=44396061&fields=members_count

Тоже самое, но с вызовом CallBack функции «getMemberCount»:
http://api.vk.com/method/groups.getById?gid=44396061&fields=members_count&callback=getMemberCount

На jQuery это можно написать как-то так:

Забавный SEO-случай

2 октября 2013 Нет комментариев

Есть у меня сайтик один развлекательный, с посещалкой около 1000 хостов в день. В один прекрасный день его взломал какой-то «хакер», все по науке залил Shell, короче получил доступ к всему содержимому сайта. Узнал я об этом спустя примерно месяц, когда мне пришло письмо от Гугла, что на моем сайте обнаружены подозрительные страницы. В письме были примеры страничек. Все ссылки содержали в себе папку, которая в общем-то является папкой для ссылочных бирж и контента там заведомо нет. Начал смотреть в чем дело. Оказывается этот умник сгенернил несколько десятков тысяч HTML страниц с содержанием вида «секс шлюхи в Москве» с кучей различных ключевиков и генеренным контентом. Разместил это все в ту самую папочку и каким-то образом направил туда поисковики. Яндекс естессно это все съел, у меня на сайте появилось +20К новых страниц, которые Яндекс просто нещадно полюбил. Весь траффик с этих страниц сливался злоумышленником на какую-то доропартнерку. Я почистил дырки и шеллы и сделал редирект с этой папки на свой сайт (страничку с рейтингами). Траффик вырос с 1000 до 3000 человек в день и держится уже пару недель. ) Так хакер, сам того не подозревая, помог мне накрутить посещалку сайта. Жаль только что посещалка упадет, как только Яндекс осознает свою ошибку и выкинет все эти странички из индекса. Что, впрочем, может занять несколько месяцев.

Как получить значение цифр с кнопок социальных сетей?

15 августа 2013 Нет комментариев

В данной заметке я расскажу как получить цифры с кнопок 6 популярных социальных сетей: Вконтакте, Facebook, Twitter, Google+, Мой мир (Mail.ru) и Одноклассники. Всё ниже написанное действительно на август 2013 года. Под катом приведен пример кода на PHP для получения данных в виде цифры.

Допустим у вас есть URL-странички, для которой вы хотите получить количество «лайков» в соц. сетях.
Для примера будем использовать URL: http://amvnews.ru/index.php?go=Files&in=view&id=3248
Так же вам понадобится закодированное значение Encoded URL: http%3A%2F%2Famvnews.ru%2Findex.php%3Fgo%3DFiles%26in%3Dview%26id%3D3248 — в PHP для его получения используется функция urlencode($url);

Список URL по которым можно получить лайки для заданных соцсетей

1) Вконтакте (vk.com)
URL: http://vk.com/share.php?act=count&index=1&url=[Encoded URL]
Пример: http://vk.com/share.php?act=count&index=1&url=http%3A%2F%2Famvnews.ru%2Findex.php%3Fgo%3DFiles%26in%3Dview%26id%3D3248
Требуемое значение: второй параметр у функции VK.Share.count(1, [нужная циферка]);

2) Facebook
URL: http://graph.facebook.com/?ids=[Encoded URL]
Пример: http://graph.facebook.com/?ids=http%3A%2F%2Famvnews.ru%2Findex.php%3Fgo%3DFiles%26in%3Dview%26id%3D3248
Требуемое значение: цифра напротив «shares»

3) Twitter
URL: http://urls.api.twitter.com/1/urls/count.json?url=[Encoded URL]
Пример: http://urls.api.twitter.com/1/urls/count.json?url=http%3A%2F%2Famvnews.ru%2Findex.php%3Fgo%3DFiles%26in%3Dview%26id%3D3248
Требуемое значение: цифра напротив «count»

4) Google+
URL: https://plusone.google.com/_/+1/fastbutton?url=[Encoded URL]
Пример: https://plusone.google.com/_/+1/fastbutton?url=http%3A%2F%2Famvnews.ru%2Findex.php%3Fgo%3DFiles%26in%3Dview%26id%3D3248
Требуемое значение: у Google все немного сложнее, так как у него нет готово API для получения цифры. Значение ищите в области кода
<script type="text/javascript">window.__SSR = {c: [нужная циферка] ,a:'bubble' .

5) Мой мир (Mail.ru)
URL: http://connect.mail.ru/share_count?func=mrc__shareInit&url_list=[Encoded URL]
Пример: http://connect.mail.ru/share_count?func=mrc__shareInit&url_list=http%3A%2F%2Famvnews.ru%2Findex.php%3Fgo%3DFiles%26in%3Dview%26id%3D3248
Требуемое значение: цифра напротив «shares»

6) Одноклассники
URL: http://www.odnoklassniki.ru/dk?st.cmd=extOneClickLike&uid=odklocs0&ref=[Encoded URL]
Пример: http://www.odnoklassniki.ru/dk?st.cmd=extOneClickLike&uid=odklocs0&ref=http%3A%2F%2Famvnews.ru%2Findex.php%3Fgo%3DFiles%26in%3Dview%26id%3D3248
Требуемое значение: второй параметр функции ODKL.updateCountOC('odklocs0','[нужная циферка]','0','0');
Читать далее…

Выбрать каждую N-ую запись из таблицы в MySQL

Все что в квадратных скобках заменяете своими данными

Список баз данных с размером

В консоли на сервере (из под root) набираете: mysql, а там:

SELECT table_schema "Data Base Name", sum( data_length + index_length) / 1024 / 1024 "Data Base Size in MB" FROM information_schema.TABLES GROUP BY table_schema;

Выведется табличка со всеми базами данными с их размером такого вида:

Google и https

Сегодня словил интересный глюк. Сначала небольшое замечание: в последних Plesk галочка SSL для доменов стоит по дефолту, независимо от того есть для него сертификат или нет. В итоге сайт по дефолту доступен по http:// и по защищенному https:// Я никогда не придавал этому значения, ну доступен и доступен.

А теперь сама ситуация: На одном из посещаемых сайтов один из пользователей посетовал, что при заходе с поисковиков ему выдаются сообщения о недействительных сертификатах на сайте и.т.д. Начав разбираться я выяснил что (!!!) Google проиндексировал две версии сайта с http:// и https:// и очень часто стал выдавать в поиске именно https:// версию. К чему это привело можно догадаться, попав на страницу с сообщением об ошибке и страшными словами о безопасности пользователь тупо решал не ходить на сайт. Так что будте бдительны! )

Firewall (полезное)

5 февраля 2013 Нет комментариев

Проверить IP на наличие в черном списке
csf -g IP_ADDRESS
Удалить адрес из временного списка
csf -tr IP_ADDRESS
Удалить адрес из постоянного списка
csf -dr IP_ADDRESS

Для тех кто столкнулся с вирусом km0ae9gr6m

Если у вас есть сайт и вы обнаружили, что кто-то непостижимым образом дописывает в конец файлов JS или PHP кусок javascript’а с тегами /*km0ae9gr6m*/…/*qhk6sa6g1c*/, то источник вашей проблемы это уязвимость в Plesk-панели! Злоумышленник меняет файлы через FileManager встроенный в Плеск. Вы можете убедиться в этом посмотрев ActionLog, где будет много разных заходов в Plesk с разных IP. У меня это выглядело как-то так:

85.221.166.199 user [2012-06-21 17:32:34] 'CP User Login' ('Contact Name': '' => 'name')
188.134.45.0 user [2012-06-22 20:41:18] 'CP User Login' ('Contact Name': '' => 'name')
85.117.53.120 user [2012-06-24 02:53:27] 'CP User Login' ('Contact Name': '' => 'name')
203.179.95.45 user [2012-06-27 05:36:37] 'CP User Login' ('Contact Name': '' => 'name')
46.121.12.88 user [2012-06-27 12:20:59] 'CP User Login' ('Contact Name': '' => 'name')
188.134.45.0 user [2012-06-28 03:10:12] 'CP User Login' ('Contact Name': '' => 'name')
58.186.192.176 user [2012-06-30 15:00:53] 'CP User Login' ('Contact Name': '' => 'name')
182.186.199.223 user [2012-06-30 15:00:53] 'CP User Login' ('Contact Name': '' => 'name')
119.155.16.97 user [2012-06-30 15:00:53] 'CP User Login' ('Contact Name': '' => 'name')
111.95.140.224 user [2012-06-30 15:00:53] 'CP User Login' ('Contact Name': '' => 'name')

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

Что делать?
1) Обновить панель до последней версии включая все апдейты.
2) Поменять все пароли для всех пользователей панели включая админа.
3) Найти все зараженные файлы:
cd /var/www/vhosts
grep -rl --include=*.{php,js,html,htm} "km0ae9gr6m" *

4) Пофиксить их
5) Можно также проверить файлы которые менялись за последние несколько суток:
find ./ -name '*.*' -mtime -7 -print

На всякий случай некоторое время после, следить кто именно заходит через Plesk на ваш сайт. Полезные ссылки (на инглише):
http://blog.unmaskparasites.com/2012/06/22/runforestrun-and-pseudo-random-domains/#comment-19257
http://forum.parallels.com/showthread.php?p=630300#post630300