Записване на онлайн радио

April 3rd, 2014

От известно време слушам Eurodance канала на Digitally Imported. Отвреме навреме пускат уникални миксове, които не могат да бъдат намерени никъде из нета. За това се захванах и написах едно кратко скриптче за да ги рипна.

Радиото излъчва ICY таг, който съдържа името на песента. По този таг може да се разделят песните в общия стрийм, като единствения кусур е че идва с няколко секунди закъснение или предварение.

Използвах -dumpstream опцията на mplayer за записване на потока. Паралелно с това върви още един mplayer процес, който наблюдава за пристигането на ICY таг и пуска ново записване в нов файл. Скрипта създава нова директория за всеки ден, като песните които запазва са с префикс на времето в което са излъчени.

  1. #!/bin/bash
  2.  
  3. # задаваме някой директории и файлове
  4. FIFO=/tmp/mplayer_recording
  5. OUT_DIR=/home/ivanatora/di.fm
  6.  
  7. LAST_PID=0
  8. LAST_SONG=""
  9.  
  10. if [ ! -e "$FIFO" ]
  11. then
  12.     mkfifo $FIFO
  13. fi
  14.  
  15. # това е процесът, който следи таговете с имената на песните и ги изпраща в едно FIFO
  16. nohup mplayer -ao null http://pub3.di.fm:80/di_eurodance | stdbuf -o L grep ICY > /tmp/mplayer_recording &
  17.  
  18. # тук четем от FIFO-то и пускаме нов записващ процес при получаване на ICY таг
  19.  
  20. while read LINE < $FIFO; do
  21.     DATE=`date +%F`
  22.     if [ ! -d "$OUT_DIR/$DATE" ]
  23.     then
  24.         mkdir "$OUT_DIR/$DATE"
  25.     fi
  26.  
  27.     echo "-----"
  28.     echo $LINE
  29.     # името на песента е заградена в единични кавички
  30.     # @TODO: понякога в самото име има единични кавички - да се обмисли този случай
  31.     SONG=`echo $LINE | cut -d\' -f2 | sed -e 's/ /_/g'`
  32.    echo "Last: $LAST_SONG"
  33.    echo "Current: $SONG"
  34.    # тук имам един бъг някъде - получавам таговете по два пъти. Това е workaround, който дава да се продължи само ако тагът който идва е различен от предния.
  35.    if [ "$SONG" != "$LAST_SONG" ]
  36.    then
  37.        TIME=`date +%T`
  38.        echo "##### $TIME"
  39.  
  40.        # ако вече имаме записващ процес - време е да го спрем и да пуснем нов
  41.  
  42.        if [ $LAST_PID -ne 0 ]
  43.        then
  44.            kill $LAST_PID
  45.        fi
  46.  
  47.        nohup mplayer http://pub3.di.fm:80/di_eurodance -dumpstream -dumpfile "$OUT_DIR/$DATE/$TIME"_"$SONG".mp3 &
  48.        LAST_PID=$!
  49.        LAST_SONG="$SONG"
  50.    fi
  51. done

Тук имам следние проблеми:
1) Таговете ми идват по два пъти.
2) Закъснението на таговете, което не е константа, която може да бъде уловена и компенсирана. На практика няколко секунди от началото на песента се записват в предния файл.
3) Предполагам че може да бъде оптимизирано и направено само с 1 mplayer процес.
4) Ако ми умре нета за секунда, mplayer-ите се прекратяват, което минава през фифото и цикъла `while read` заминава.

Някой bash-майстор може да се произнесе с идеи :)

Alpine mass delete messages

March 7th, 2014

You have new mail.

Почти не използвам локалната пощенска кутия. Всъщност единственото за което я ползвам е да следя за грешки по кроновете които работят на системата. Принципно целия STDOUT+STDERR бива изпращан по мейл на текущия потребител. STDOUT не ми трябва, понеже често си оставям някакви дебъгващи принтове тук-таме по скриптовете. За това си описвам задачите с >/dev/null. По този начин STDOUT се филтрира, и остава само STDERR. Ако искам да махна абсолютно целия изход от изпълнението правя >/dev/null 2>&1.

Ако нещо по кроновете видимо не работи, отварям пощата и чета. Обикновено я преглеждам през няколко седмици за да изтрия старите логове от крона. За това използвам alpine, понеже не ми се занимава с никакви тежки и сериозни GUI изпълнения като Thunderbird. Удобно е да се логна в ssh от където и да е и да изтараша пощенската кутия.

Днес alpine се стартира малко по-бавно и какво да гледам в пощенската кутия - 12 136 писма. Оказа се че съм написал доста тъпо един от кроновете:


*/5 * * * * cd /home/ivanatora/rilski_ezera; wget "http://www.rilskiezera.bg/meteo/rilskiezerahut.jpg" -O img_`date +\%Y-\%m-\%d_\%R`.jpg >/dev/null

Това сваля снимка от х. Рилски Езера на всеки 5 минути и по-късно си правя таймлапс със свалените изображения. Въпросът е защо така злобно ми е нафлудил пощата, при условие че STDOUT е филтриран?

Защото съм забравил че `wget` не принти съобщенията си в STDOUT, а вместо това в STDERR (факт)...

Както и да е - оправих крона, но сега проблема беше как да изчистя пощенската кутия с alpine. Обикновено трия пощата по следния начин - отивам върху първото писмо и задържам D. Това го маркира за изтриване (което ще се случи след затваряне на клиента) и преминава към следващото. Това минава през съобщенията едно след друго и нормално за няколко секунди изчиствам цялата кутия. Само че в случая с 12 хиляди писма това би ми отнело към 20 минути набиране върху D-то.

Поблъсках се малко и намерих процедурата за изтриване на всички съобщения:

1. В INBOX се натиска `;` за Select messages
2. Натиска се A за Select all.
3. Натиска се A за Apply command
4. Натиска се D за Delete

След това се излиза нормално от клиента с ^X и писмата се изтриват.

Джобна печка

January 16th, 2014

Взех си джобна печка. Гори бензин за запалки, развива доста голяма температура, но няма открит пламък и не е по-огнеопасна от GSM-а ви, примерно.

Реакцията на повечето ми приятели като им я показвам обикновено е "WTF е това", а когато им я дам да се потоплят и изцъклят очите :) И аз не знаех че съществуват такива неща, докато не прочетох в някакъв форум обява за продаване. Оказва се че тези грейки са доста популярни сред ловци и туристи и въобще хора, които прекарват време навън по студовете. По-възрастните, които са били войници преди години я познават под името "каталитична грейка" и е била стандартен артикул по руско време. Топлината не е достатъчно за да те стопли целия, но определено е две идеи повече от това да ти тракат зъбите. Печката има и други приложения. Слагаш си я на врата преди лягане и по тялото ти се разлива една приятна топлина като от горещ душ. Сецнах си кръста и топлината от печката на болното място беше голямо облекчение докато се оправи.

Само един бъг съм забелязал до сега. По документация (и по думите на десетки хора, които ползват такива неща), с едно зареждане трябва да гори поне 24 часа. Моята не караше и 3 часа. Вариантите бяха три - кофти печка (има имитации, които не са много успешни), повредена каталитична дюза или кофти бензин. Първия вариант го отписах, понеже си взех точно от този модел, който се препоръчваше по всички места. Втория вариант също бих го отписал - вярно че дюзата трябва да се гледа внимателно, но моята си беше практически нова и съм я ползвал само по инструкции. Взех си друг бензин, малко по скъп, за да тествам и третия вариант. И о, чудо - температурата се вдигна с много и времетраенето на горенето се увеличи над 12 часа. Не можах да повярвам че печицата е способна на такива неща и рекох да направя малко по-обективно сравнение между двете горива. Сложих ги при еднакви условия, свалих температурната крива във времето и статистиката потвърди това което усетих.

Тествах три вида гориво:
* бензин ZIPPO купуван от магазин "Всичко за левче" - цена 2 лв
* бензин ZIPPO купуван от магазин за цигари "Premium" от старозагорския мол - цена 6 лв
* бензин STAR купуван от магазин "Метал мания" в старозагорския универмаг - цена 4 лв

Поглед отпред

Поглед отзад

Всяко измерване извърших по един и същ начин - грейката се напълва с един дозатор (до второто деление), запалва се и се оставя легнала на масата. За нея се прикрепя температурния сензор, пъха се във фабричното калъфче и повече не се пипа. Температурния сензор е DS18B20 - цифров, фабрично калибриран, с грешка от 0.5 C. Чете го Arduino Uno, свързано към компютъра, който записва показанията на всеки 15 секунди. Температурата на околната среда е 23 C. Замерванията са от момента на запалване на грейката, до момента в който температурата и се връща обратно до 23 С след изгасването ѝ.

Общ вид на опитната постановка

Близък изглед на грейката

Грейката във финална конфигурация с калъфче

Суров Excel с резултатите: readings_benzini_v2

Обобщена графика

На графиката се набива че синята линия почва малко по-горе от червената. Това се получи така, понеже изпуснах първите няколко измервания от евтиния бензин. Иначе и трите опита се извършиха при еднаква стайна температура.
* Евтиния гори малко, с ниска температура, достига пика рязко. Имам чувството че съотношението пари-въздух не му е както трябва. Вижда се че накрая когато парите намаляват температурата рязко се покачва.
* Скъпия определено гори най-много време, най-стабилно и с по-висока температура. Плавно достига максимума.
* STAR бензина гори с най-висока температура - рекордьор е със 70 градуса. Изгасва около 2 часа преди скъпия и като че ли не гори толкова равномерно.

Моята равносметка за 2013-та

December 27th, 2013

Остават 4 дни до края на годината и може би още е малко рано да ѝ тегля чертата, но да взема да направя една равносметка до тук.

2013-та не беше от най-добрите години. И в здравословен план, и в емоционален план, и в кой ли още не. Но да се абстрахираме от негативното и да гледаме от хубавата страна на нещата. Годината беше богата на събития.

ЯНУАРИ
Read the rest of this entry »

Secure. Contain. Protect.

December 24th, 2013

SCP е уики с кратки научнофантастични произведения завъртяни около свръхестествени събития. Пишат се във формата на псевдо-реалистични доклади, лабораторни изследвания и протоколи. Стила и съдържанието напомнят на някаква кръстоска между Twilight Zone, X-Files и Outer Limits.

Всяко произведение се върти около определен паранормален предмет, който е представен с номер SCP-XXXX. Обикновено присъстват следните секции: класификация за степента на опасност, протокол за съхранение на обекта и описание. Евентуално могат да присъстват интервюта, извадки от научни експерименти, аудио и видео логове и т.н.

Фондацията е общ елемент в канона на SCP. Това е организация от изследователи, агенти и военни звена, целящи да каталогизират свръхестественото във вселената и да предпазят човечеството от възможните ефекти. Въпреки че на пръв поглед Фондацията е филантропска, методите ѝ въобще не са такива. За опасни опити които често завършват летално се използват осъдени престъпници (Class-D personel). Ръководството не се бои да използва смъртоносна сила, дори и върху собствения си персонал, в случай на компроментиране или зараза. Мотото е нещо като "всички са заменими". Ако цивилни попаднат под влиянието на SCP елемент, амнезиачни наркотици се раздават с голямата кофа. SCP обектите се съхраняват в неизвестен брой архиви-лаборатории (Sites), всяка от които е снабдена с атомно устройство за саморазрушение в случай на "най-лошото". Някои от обектите имат потенциал да предизвикат края на света.

Макар и в написани общ стил, статиите пробуждат различни чувства. Някои са типичните лъвкрафтски истории за пипални чудовища и светеща слуз, които ти влизат под кожата и те отказват да спиш. Някои ти захващат въображението и се усещаш че мислено си разиграваш алтернативни сценарии. Някои здраво те разсмиват и те връщат на земята. Част от статиите имат суфикс -J за "jokes" и са точно това.

Някои от SCP обектите които ми направиха впечатление (ще ги описвам съвсем накратко, без spoilers):

SCP-087 - безкрайното стълбище

SCP-093 - портал към алтернативна реалност, дълго е, историята е добре развита

SCP-426 - една потенциална -J история, но работата е сериозна

SCP-914 - предметен трансфигуратор

SCP-231 - момиче, което всеки ден бива подложено на толкова ужасни неща, че се налага персонала сам да взима амнезиачни наркотици

SCP-1171 - Каспър, расисткия призрак

SCP-294 - вендинг машина, която продава всякакви течности

SCP-682 - интелигентно, много агресивно влечуго, което мрази всички хора

SCP-5308-J - колекция от няколко предмета, които тормозят и най-добрите умове във Фондацията

SCP-993 - телевизионно предаване с Боби Клоуна, който подсъзнателно подтиква зрителя към криминални прояви

SCP-006-J - колекция от насекомоидни организми, заради които се събира отряд "Съпрузи" и се въоръжават с Четирикратни Екстравагантни Хипер Лимбатични Икстерминатори (още известни като ЧЕХЛИ)

SCP-1370 - безвреден робот, който има душата на Минг Безпощадния и иска да пороби целия свят. Самоосакатява се при опит да нападне цвете в саксия. Историята плаче за -JJJJJ

SCP-1867 - разумен и телепатичен морски охлюв, който се представя за британски естествоизпитател

SCP-085 - двуизмерно момиче, живеещо като рисунка на лист хартия

SCP-1048 - разумно плюшено мече, с патологични наклонности и способност да се самовъзпроизвежда

SCP-1437 - бездънна дупка в земята, портал към алтернативни вселени

SCP-1322 - малка пространствено-времева аномалия, която свързва нашата с друга вселена. Обмян на знания, мирно сътрудничество, чума.

SCP-354 - кърваво езеро, което създава разнообразни чудовища

SCP-028 - изоставен двор, който дарява човек който влезе в него с ултимативното знание по случайна тема

SCP-504 - салатни домати които убиват при проява на тъпо чувство за хумор

SCP-342 - билет за обществен транспорт, който отвлича човека, който го ползва извън нашата реалност

SCP-871 - самовъзпроизвеждащ се кекс, който ако не бъде изяждан, може да напълни цялата планета с кексове

SCP-1440 - възрастен мъж, който въздейства неагивно на човешкото население около себе си до степен, в която всички умират.

SCP-1470 - разумен паяк скачач, способен на телепатия

SCP-1342 - копие на Вояджър 1, изпратен към Земята от извънземна цивилизация

SCP-1958 - VW бус, изстрелян в космоса преди 60 години

SCP-348 - порцеланова купа, която се пълни сама със супа

SCP-1193 - сондажна дупка с неизвестна дълбочина, в която живее огромна ръка. На повърхността на земята има телефонна будка, която свързва човек с неизвестното същество

SCP-439 - паразитно насекомо, което живее в човешки гостоприемник, като вкаменява мускулната му маса, изяжда вътрешните му органи и го използва като структура за кошер

SCP-015 - маса от тръби, клапи, бойлери и друга водопроводна апаратура, която се саморазраства и възпроизвежда

SCP-1545 - карнавален костюм на лама, който влияе на съзнанието на облеклите го и те почват да се възприемат като лама

SCP-1006 - група интелигентни паяци, възприели политическа система и самоизлъчили марксистко правителство

SCP-1845 - разнородна група разумни животни, възприели феодални порядки, водени от лисица, която се възприема за средновековен среден владетел от католическа Франция

SCP-453 - нощно заведение, което подчинява посетителите да участват в един от няколко известни сценарии като театрални постановки, но на живо

SCP-4357-J - адски демон, който се присмива на хората и без да иска ги учи как да го затворят

SCP-882 - конструкция от зъбни колела, кабели, ремъци и други механизми, събрани на случаен принцип. Движи се от неизвестна сила и има способността да подчинява съзнанията на близките хора. Те го възприемат като железния бог и му носят метал, който механизма абсорбира и използва за да нараства.

SCP-804 - устройство, което ако е активирано влияе на всякакви изработени от човешка дейност предмети като ускорява процеса на стареене. Подобен ефект има и върху човешки същества.

SCP-789-J - кенефния призрак

SCP-423 - обектът няма физическа форма. Представлява фиктивен персонаж (Фред), който се самодобавя в дадено литературно произведение. Може да се движи от книга в книга, ако се намират на разстояние до 1 метър. Разумен и е и може да бъде осъществена комуникация с него.

SCP-1529 - хуманоидно същество, живеещо на склона на Хималаите. Хипнотизира и убива планинари.