среда, 9 октября 2013 г.

Дал тут товарищ ссылку на интересную видяшку.
http://vimeo.com/75781782
Посмотрел я ее - ну видяшка как видяшка, из разряда "что нас ждёт в будущем"
Но в самом её начале стоит цитата Марка Твена.
"For the majority of us, the past is a regret, the future an experiment."
Я как бы не поклонник цитат, но тут стало интересно, а что же сказал человек?
Попытка прямого перевода выдала только частично осмысленную фразу:
"Для большинства из нас, прошлое - это сожаление, а будущее - эксперимент."
Хм, погодите... Какой такой "эксперимент". Человек явно хотел сказать что-то другое.
Но все англо-русские словари упорно мне твердили: experiment - эксперимент.
Тогда я подумал... А в какое время была произнесена эта фраза?
Конец 19-го века, эпоха открытий. А что делали все учёные?
Это теперь мы скажем "ставили эксперименты".
А в 19-м веке они ставили опыты, и проводили испытания... ИСПЫТАНИЯ!
Вот оно, то слово!
И если новоязное "эксперимент" заменить на "испытание", то фраза обретёт смысл.
"Для большинства из нас, прошлое - это сожаление, а будущее - испытание."

Кстати... Раньше макеты ракет испытывали. Макеты двигателей к ракетам - испытывали. Всё - испытывали. Потому и ракеты - летали. А теперь, сука, экспериментируют. Потому факелы и тухнут.

суббота, 28 сентября 2013 г.

Смотрим IP-камеру DLink на iPhone и Android

http://www.pvsm.ru/ios/16350/print/


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

Первое решение этой задачи было весьма незамысловатым: web-камера и скайп, который сам поднимал трубку при звонке от директора. Решение прожило не долго. То камера “упадёт” глазом вниз, то комп “забудут” включить. И в те редкие счастливые случаи, когда позвонить всё таки удавалось, почему-то все работали.
Директор попросил другое решение задачи, на которое сотрудники не смогут повлият. Предложил wi-fi камеру, отключить которую можно только отключив питание у камеры или точки доступа или всего кабинета. Розетка камеры на потолке, по-быстрому не отключишь. Отключение точки доступа или кабинета чревато неработой всех компьютеров. Решение было поддержано и оплачено. Приступаем.
Выбор камеры как-то сразу ограничился наличием на полках магазина. Это D-Link DCP-2130. Монтаж и настройка камеры просты: монтаж — электрик, камера — ip-адрес и пароль. Камера умеет по http отдать изображение в mjpeg, но без звука. Умеет отдать звук+видео по rtsp (rtsp://ipcamera/video1.sdp)
Почему-то не все плееры дружат с rtsp. VLC оказался молодцом и победил других коллег.
Ярлычок “vlc rtsp://ipcamera/video1.sdp” на рабочий стол директора и просмотр в офисе на десктопе готов.
А вот дальше пришлось достать бубен, ибо хочется посмотреть кино с весёлыми человечками откуда угодно.
Путь первый: пробросить rtsp на шлюзе с внешнего ip на камеру. Fail. И вот почему:
1. rtsp не имеет никакой защиты в виде аутентификации смотрящего и наружу на шару выпустить это кино запрещено. Хотел было переименовать video1.sdp в mohqu3iep8Ohh.sdp, но такое не запомнить, и см п.2
2. Сильно не копал, но успел понять, что rtsp тяжко или совсем нельзя просмотреть на iOS, и далеко не каждый плеер на Android осилит.
И так, проброс порта снаружи на камеру отпал.
Путь второй: html5 или flash. Успех, но не весь.
я не смог найти ни одного flash плеера, который бы поддерживал rtsp. HTML5 video вообще не поддерживает потокового вещания. Но! VLC прекрасно читает имеющийся поток, VLC умеет декодировать видео на лету, VLC умеет отдавать по HTTP, да ещё и с аутентификацией. И у нас есть компьютер-шлюз. Совмещаем шлюз и умения VLC воедино командой на шлюзе
vlc.exe -I dummy rtsp://192.168.0.333:554/live1.sdp --http-reconnect --repeat --rtsp-caching=4600 --loop --sout=#transcode{width=320,vcodec=h264,vb=384,fps=15,venc=x264{aud,profile=baseline,level=30,keyint=30,ref=1},acodec=mp4a,ab=64,channels=1,samplerate=22050,audio-sync}:http{user=camuser,pwd=campass,dst=:8080/st.flv} --no-sout-rtp-sap --no-sout-standard-sap --ttl=1 --sout-keep
где 192.168.0.333 — это IP камеры, а rtsp://192.168.0.333/live1.sdp — это, соответственно, живой поток с камеры.
В итоге получаем, что по http://camuser:campass@gate:8080/st.flv идёт преобразованный видеопоток, уже годный для flash плеера. Кстати, открывается многими плеерами на Android, что не может не радовать.
Открываем порт 8080 на шлюзе и к потоку появляется доступ снаружи, и, как вы уже, возможно, заметили, имеющий хоть какую-то аутентификацию. Теперь flash плееру в качестве источника можно подсунуть наш поток в виде
http://camuser:campass@camera.my-org.ru:8080/st.flv
По совету друзей выбор пал на JW Player. Его простота и работоспособность полностью удовлетворили.
Накидал html страничку с аутентификацией и flash плеером, проверил, работает с компьютеров и с указанного в начале статьи планшета. Теперь директор с компьютера или с планшета заходит на
http://camera.my-org.ru, вводит имяпароль и смотрит, как его орлы работают, а кто на просто чай залетел.
Если тот же поток подсунуть html5 плееру, то ничего не выйдет, html5 никак не хочет понимать потоковое видео. Долгая игра с форматами видео/звука результата не дала. Но хочется смотреть кино ещё и на телефоне от одной фруктовой компании, а как известно, эта самая фруктовая компания ваши флеши на html вертела, поэтому меня ждал
Путь третий: Откусить яблоко и не умереть от счастья. Успех.
Гугление в яндексе долго не давало никаких результатов. Вообще никаких. Я уж начал сомневаться в своих умениях спрашивать у поисковиков. Я точно знал, что раз презентации Apple можно в прямом эфире смотреть на Apple же устройствах без дополнительных танцев, то это возможно. Примерно на третьем наскоке найти решение, я заметил часто повторяющуюся комбинацию слов, а именно HTTP Live Streaming. Я был восхищён решением Apple. Как известно, html5 умеет проигрывать только имеющийся файл. Вот и чудненько, подумали в Apple, и сказали: “а давайте представим, что живой поток — это кусочки по 10 секунд, нужно всего лишь, закончив играть текущий кусочек, сразу начать играть следующий” Супер! Это настолько гениально, насколько просто. Каждый занят своим делом. HTML5 video показывает файлы, он это умеет. Http-server файлы отдаёт и занимается всякой нагрузкой, авторизауией и пр. Он для этого и сделан. Остаётся лишь эти 10секундные кусочки вовремя подсовывать. И решение есть, и вновь VLC победил. VLC, как и остальные члены этой связки, занят исключительно своим делом — кодирует видео. Запускаем
vlc.exe -I dummy --mms-caching 0 rtsp://192.168.0.333:554/live1.sdp vlc://quit --sout="#transcode{width=320,height=180,fps=15,vcodec=h264,vb=384,venc=x264{aud,profile=baseline,level=30,keyint=30,ref=1},acodec=mp3,ab=64,channels=1}:std{access=livehttp{seglen=10,delsegs=true,numsegs=5,index=c:wwwcam01istream.m3u8,index-url=http://camera.my-org.ru/cam01/cam01-########.ts},mux=ts{use-key-frames},dst=c:wwwcam01cam01-########.ts}"
Вот что получаем: VLC складывает в папку c:wwwcam01 файлы cam01-########.ts и постоянно обновляющийся плейлист istream.m3u8, содержащий ссылки на эти файлы. Хранит 5 свежих кусочков видео, старые удаляет.
Собственно этот плейлист и отдаём HTML5 видео плееру на iDevice в качестве источника. Смотрим и наслаждаемся потоковым видео. Вот насколько просто выглядит HTML-файл:
<body>
<center>
<video width=320 height=180 controls="controls" src=/cam01/istream.m3u8 />
</center>
</body></html>
http://www.pvsm.ru/ios/16350
http://www.pvsm.ru/ios/16350
Помним только, что у Apache в .htaccess или конфигах нужно дописать новые типы файлов
AddType application/x-mpegURL m3u8
AddType video/MP2T ts
К сожалению, подсунуть такой плейлист в качестве источника для HTML5 видео можно только iDevice’ам. Жаль, что пропадает такое великолепное решение.
После почёсывания ЧСВ от проделанной работы немного обновил html страничку. Теперь директор заходит на сайт, логинится, и смотрит хоть с десктопа, хоть с Android, хоть c iOS.
хак: под андроид есть Puffin Web Browser который умеет показывать флешь, даже если флешь не установлен.
Добавляем запуск VLC в автозапуск и, пожалуй, готово.
Наблюдения за месяц полёта:
1. Тот VLC, который кодирует кусочки для iOS, работает стабильно неделями.
2. VLC, который гонит поток для флэша, любит падать через 1-2 дня непрерывной работы. Решение — перезапуск каждые два часа.
3. VLC, который гонит поток для флеша иногда теряет видео, оставляя только звук на фотне чёрного прямоугольника не Малевича. Решение не найдено, поэтому-то перезапуск каждые два часа, а не раз в сутки.
4. шлюз, на котором запущены VLC — это какой-то ранний P4 с 1G оперативной памяти, Win2K3. VLC потребляет немного оперативки и 50-60% процессора.
Автор: Nem427

вторник, 27 августа 2013 г.

Подключаем MAG-250 по Wi-Fi

STB приставка MAG-250 поддерживает следующие Wi-Fi адаптеры: 

МодельЧипсетПримечания
DLink DWA-125Ralink RT3072
Ralink RT5370
ревизия B1 не поддерживается
ASUS USB-N13Ralink RT3072ревизия B1 не поддерживается
Edimax EW-7711UANRalink RT3072
Tenda W311MIRalink RT5370
TPLINK TL-WN727NRalink RT3070
Dune HD AirRalink RT3070

DLink DWA-125 - 2001:3C19
DLink DWA-140 - 2001:3C15


понедельник, 26 августа 2013 г.

Наркоманы охренели вконец!

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


четверг, 22 августа 2013 г.

Как заставить mysql5 использовать нужный вам default-character и collation

Взято отсюда: http://broderix.blogspot.ru/2009/06/mysql5-default-character-collation.html

Для начала посмотрите что у вас есть

SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       | 
| character_set_connection | utf8                       | 
| character_set_database   | latin1                     | 
| character_set_filesystem | binary                     | 
| character_set_results    | utf8                       | 
| character_set_server     | latin1                     | 
| character_set_system     | utf8                       | 
| character_sets_dir       | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+
8 rows in set (0.00 sec)


По умолчанию Value=latin1

Теперь вы хотите чтобы все клиенты mysql сразу использовали нужную ва кодировку:
utf8,cp1251 или koi8r

Нужно добавить в файл my.cnf
/etc/mysql/my.cnf

Следующие переменные:


[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8
init-connect='SET NAMES utf8;'
collation-server=utf8_general_ci
[mysql]
default-character-set=utf8


После изменений перезагружайте сервер.
/etc/init.d/mysql restart

Если не работает еще раз проверьте что у вас происходит:


SHOW VARIABLES LIKE 'character_set%';


проверьте кодировку базы данных:


mysql> show create database yourdatabase;
+-------------+----------------------------------------------------------------------+
| Database    | Create Database                                                      |
+-------------+----------------------------------------------------------------------+
| yourdatabase | CREATE DATABASE `yourdatabase` /*!40100 DEFAULT CHARACTER SET utf8 */ | 
+-------------+----------------------------------------------------------------------+
1 row in set (0.00 sec)


Кодировка по умолчанию для создания таблиц наследуется.
Можно еще проще для ubuntu (10.04): создать файл, например /etc/mysql/conf.d/mysqld_charset.cnf с текстом:

[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8
init-connect='SET NAMES utf8;'
collation-server=utf8_general_ci
[mysql]
default-character-set=utf8
и перезапустить mysql

Опс! Whoopsie!

А вы в курсе, что Ubuntu 12.04 и новее отсылают тайком логи падений ваших систем прямиком разработчикам Ubuntu? Весело, не правда ли?
А все благодаря сервису whoopsie.
Но мы ведь не хотим, чтобы кто-то, кроме нас, знал об крахе нашей системы, и уж тем более - чтобы логи передавались куда-либо.
Поэтому варианта два.
1. Изменить конфигурацию файла /etc/default/whoopsie , поменяв report_crashes=true на report_crashes=false и перезапустить сервис командой service whoopsie restart
2. Удалить whoopsie из системы командой apt-get purge whoopsie
Whoops!

четверг, 1 августа 2013 г.

Проблемы с ettercap

При внедрении столкнулся с проблемой, что ettercap внезапно вылетал с сообщением
libnet_write 2704 (-1): libnet_write_raw_ipv4(): -1 bytes written (Message too long)

Немного напряг гугл, и вот он - ответ. Нужно просто подтюнинговать сетевушки командой:
ethtool -K eth0 tso off gso off gro off lro off

среда, 24 июля 2013 г.

Проверка режима работы Мультифона


#!/bin/bash
multifon_login="login@multifon.ru"
multifon_password="password"
OUTPUT=`curl --silent "https://sm.megafon.ru/sm/client/routing/?login=$multifon_login&password=$multifon_password"`
echo $OUTPUT|sed -n 's|.*<routing>\(.*\)<\/routing>.*|\1|p'

Возвращаемые значения
0 - звонки идут только на телефон
1 - звонки идут только на Мультифон
2 - звонки идут в оба места

четверг, 14 марта 2013 г.

среда, 13 февраля 2013 г.

Настройка туннеля в Linux Ubuntu

Для настройки сети необходимо добавить в файл /etc/network/interfaces следующие строки:
auto tun1
iface tun1 inet static
    # Адрес машины внутри туннелся. Соединения точка-точка, по этому маска из одних единиц
    address 192.168.0.1
    netmask 255.255.255.255
    # Адрес внутренний адрес машины, с которой установлен тунель
    pointopoint 192.168.0.2
    # Размер MTU
    mtu 1480
    # Перед поднятием интерфейса нужно создать тунель, что мы тут и делаем
    pre-up iptunnel add tun1 mode ipip local 89.123.1.234 remote 89.123.2.234 ttl 255
    up ifconfig tun1 multicast
    # Весь трафик в соседнюю сеть надо завернуть в тунель
    up route add -net 192.168.2.0/24 gw 192.168.0.2 dev tun1
    # Удаляем туннель после удаления интерфейса
    post-down iptunnel del tun1
В примере используется имя интерфейса tun1, но, в принципе, его можно назвать как угодно.
Размер MTU может быть различным. Для его вычисления надо взять минимальный MTU от интерфейсов, смотрящих в интернет (это можно сделать командой ifconfig), и вычесть из него заголовок пакета ipip, которые равен 20 байтам.
Основная борьба под Linux начитается с фаерволом. У меня она свелась к добавлению следующих правил в файл /var/lib/ufw/user.rules (но это сильно зависит от конкретного случая):
-A ufw-user-input   -p ipencap -i ppp0 -j ACCEPT
-A ufw-user-input   -i tun1 -j ACCEPT
-A ufw-user-forward -i tun1 -j ACCEPT
Для того, чтобы предыдущие изменения вступили в силу, необходимо выполнить команды:
sudo ifup tun1
sudo /etc/init.d/ufw restart
Для диагностики могу посоветовать следующий порядок действий:
  1. Проверить наличие туннеля:
    ~$ ip tunnel show
    tunl0: ip/ip  remote any  local any  ttl inherit  nopmtudisc
    tun1: ip/ip  remote 83.123.1.234  local 83.123.2.234  ttl 255
  2. Проверить, поднялся ли интерфейс:
    ~$ ifconfig tun1
    tun1      Link encap:IPIP Tunnel  HWaddr
     inet addr:192.168.0.1  P-t-P:192.168.0.2  Mask:255.255.255.255
     UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1480  Metric:1
     RX packets:0 errors:0 dropped:0 overruns:0 frame:0
     TX packets:81 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:0
     RX bytes:0 (0.0 B)  TX bytes:6478 (6.4 KB)
    Здесь надо отметить, что кол-во RX-пакетов должно расти при пинговании той стороны даже в том случае, если маршрутизатор на той стороне выключен.
    То есть если идет попытка пинговать адрес 192.168.0.2 или 192.168.2.100, то RX должен увеличиваться. В противном случае надо искать проблему в фаерволе.
  3. Проверить, проходят ли пакеты через нужные правила iptables.
    Для этого можно воспользоваться ключем -v. Он показывает сколько пакетов и байт прошло через указанное правило.
  4. Проверить, уходят ли пакеты во внешний интерфейс:
    sudo ~$ tcpdump -i ppp0 -n proto ipencap

вторник, 12 февраля 2013 г.

Нарушители 12.02.2013

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

Для начала - утро, торопыга слева решил не пропускать пешеходов. До этого упорно пытался подрезать. Ну ничего, разговор с инспектором и штраф - лучшая награда за такое поведение на дороге.




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

четверг, 10 января 2013 г.

Asterisk и UTF-8

Как хорошо живется американцам и англичанам! Никаких проблем с раскладками клавиатуры, кодировками и т.п. А вот в условиях России борьба с кодировками - это просто вид спорта какой-то. Вчерась встал на очередные грабли при попытке писать логи астериска (cdr) в MySQL. Проблема выплывала спонтанно, и вместо русских букв в поле clid начинали появляться крокозяблы. Отладка запросов к MySQL вывела на то, что Asterisk сам менял кодировку запросов. Это, в принципе, логично - то, что не определено явно, устанавливается "по дефолту", т.е. по прихоти разработчика, а разработчику нравится кодировка latin1. Это зашито в исходниках, а вот чтобы поменять всё на UTF-8 - надо внести нужную строчку в cdr_mysql.conf:
[global]
...
charset=utf8

После перезапуска астериска все пришло в норму.

Но вот еще одна напасть - часть записей-то осталась крокозяблами! И как теперь их вернуть в нормальный читаемый вид? Ведь есть записи и с нормальной кодировкой, и их перекодировать не надо. Гугление и курение мануалов привело к рождению вот такого запроса, который одним махом приводит всё в нормальное состояние:

update cdr set clid=unhex(hex(convert(clid using latin1))) where instr(unhex(hex(convert(clid using latin1))),"?") = 0;

Причем, если по счастливой случайности строки были закодированы дважды (а у меня и такое было после экспериментов с настройками) - то повторный запуск раскодирует и их