Архив

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

Как запустить программу в 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

Использование NeroAAC для кодирования под Linux

26 февраля 2012 Нет комментариев

Те, кто сталкивался с кодированием видео для он-лайна на своих серверах под Linux наверняка в курсе, что средства FFMPEG для кодирования звука в AAC, а именно библиотека libfaac дает ужасное качество на низких битрейтах. Работа над ней была заброшена несколько лет назад и она не поддерживает профиль HE. Ища выход из сложившейся ситуации оказалось, что все не так плохо и для этих целей можно использовать neroAAC (само собой только для личных целей, читайте лицензию ^_^), который дает потрясающие результаты даже для битрейтов вроде 32кбпс.

1) Качаем последнюю версию отсюда: http://www.nero.com/eng/release-notes-nerodigital-nero-aac-codec.html
2) Находим в архиве linux/neroAacEnc и копируем на сервер
3) Устанавливаем: install –D –m755 linux/neroAacEnc /usr/bin/

Предположим раньше мы кодировали так:
/usr/bin/ffmpeg -i "input.mp4" -pass 1 -vcodec libx264 –vpre hq -f mp4 -b 400k -bt 400k -an "tmp.mp4"
/usr/bin/ffmpeg -i "input.mp4" -pass 2 -vcodec libx264 –vpre hq -f mp4 -b 400k -bt 400k -acodec libfaac -ab 128k -ac 2 -async 1 "tmp2.mp4"
/usr/bin/qt-faststart "tmp2.mp4" "out.mp4"

Теперь это будет выглядеть так:
/usr/bin/ffmpeg -i "input.mp4" -pass 1 -vcodec libx264 –vpre hq -f mp4 -b 400k -bt 400k -an "tmp.mp4"
/usr/bin/ffmpeg -i "input.mp4" -pass 2 -vcodec libx264 –vpre hq -f mp4 -b 400k -bt 400k -an "tmp2.mp4"
/usr/bin/ffmpeg -i "input.mp4" -acodec pcm_s16le -vn "audio1.wav"
/usr/bin/neroAacEnc -br 65536 -2pass -if "audio1.wav" -of "audio1.aac"
/usr/bin/ffmpeg -i "input.mp4" -i "audio1.aac" -acodec copy -vcodec copy -f mp4 "tmp3.mp4"
/usr/bin/qt-faststart "tmp3.mp4" "out.mp4"

Пояснения построчно:
1) Первый проход кодирования видео (без звука)

2) Второй проход кодирования видео (без звука)

3) Вытаскиваем звуковую дорожку из видео в несжатом виде

4) Кодируем звуковую дорожку в AAC-формат

5) Собираем звук и видео в единый файл без перекодирования

6) Переносим метаданные в начало файла

Profit!

Решение проблемы в MediaWiki с большими категориями (Large Categories)

15 февраля 2011 Нет комментариев

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

Пришлось искать решение, но в открытых источниках оно так и не было найдено, так что я посмотрел, как это было сделано в старых версиях движка. Итак, критическое место:
Читать далее…

Оптимизация форума PHPBB2 под большую нагрузку (Highload)

6 января 2011 4 комментария

Достался на поруки большой форум, построенный на базе PHPBB2. Я в курсе, что двигло старое и надо бы заменить, но предыдущий админ предупредил, что они уже пытались переехать на phpBB3 и это привело к диким тормозам и им пришлось съехать обратно. В довесок на самом форуме навешано много всяких МОДов, часть функционала которых отсутствует в 3 версии. Поэтому пока сидим на старом движке. И поскольку он больше не поддерживается и обновлений не предвидится, то я ручками ковыряюсь в исходниках.

Итак, форум, посещаемость около 30000 хостов в день и около 200К просмотров в день. В базе данных около 5 миллионов записей. БД весит около 3.5 Гбайт. Самая большая таблица с записями 3 Гбайта (не в последнюю очередь из-за индекса). В он-лайне постоянно от 300 до 700 человек. На форуме уже был установлен МОД Extreme Styles (и насколько я понял он серьезно снижает нагрузку), который кэширует шаблоны. Дополнительно на сервере были установлены ускорители eAccelerator и ZEND для PHP. Все эти действия привели к тому, что сам PHP и Apache не съедают много ресурсов. В данный момент главное узкое место – жесткие диски (обычные SATA), часть операций из-за размера БД неизбежно выполняется с использованием винчестера. В данный момент рассматриваем возможность переезда на другой сервер с SAS дисками. Текущий выделенный сервер, в общем, справляется с нагрузкой, но иногда в моменты пиковых нагрузок таблицы переходят в состояние «locked» и другие пользователи вынуждены подолгу ждать своей очереди, а то и вовсе получают сообщение об ошибке. Форум постоянно растет (за пол года +10К хостов в день) и вопрос переезда становится все актуальнее. А пока было время, я занимался оптимизацией.

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

Ошибка с комментарием к другому посту в WordPress

12 апреля 2010 Нет комментариев

Словил забавный баг в WordPress. При комментировании любого поста, коммент оставлялся к рандомному посту на сайте. Исследование пациента показало, что код для генерации комментариев содержит использование глобальной переменной $id. Естественно во время правки кода шаблонов и не зная, об этой особенности, я неоднократно использовал переменную с таким же именем.

Кому пришло в голову использовать в качестве глобальной, такую часто встречаемую переменную ума не приложу. =)