Posts Tagged ‘howto’

Скрол

Tuesday, May 31st, 2011

Повечето съвременни мишки имат два допълнителни бутона на колелцето на скрола, които се активират респективно при натискане колелото наляво и надясно. Не се виждат и в повечето случаи дори не знаете че са там, освен ако не си четете упътването на мишката :)
Logitech B110
Много лесно можем да вкараме тези екстри в употреба. xev ги разпознава като Mouse6 и Mouse7, така че веднага можем да ги сложим в .fluxbox/keys:

None Mouse6 : PrevWorkspace
None Mouse7 : NextWorkspace

Естествено функцията им може да е съвсем различна от смяна на работния десктоп, но това ми се струва най-правилно :)

scp resume

Wednesday, May 18th, 2011

scp е много удобен инструмент за прехвърляне на файлове между различни машини. Може да работи както за ъплоуд, така за даунлоуд, та даже и директно да мести от втора на трета машина. Използва демона на SSH и не се налага да стартирам допълнителни услуги.

Примерна употреба:

scp -P220 192.168.2.1:/extra/ivanatora/snimki/2011_05_18_plovdiv/ .

Взима рекурсивно папката 2011_05_18_plovdiv/ от домашното ми PC и я копира на текущата машина (лаптопа). Освен това -P опцията ще рече че SSH слуша на порт, различен от дефаултния. Ако искам да направя трансфер в обратната посока само трябва да разменя source и destination.

Та така днес рекох да си олекотя малко харда на лаптопа и да прехвърля всички файлове на таймлапсовете от предните постове на домашното PC. Това са доста файлове - 20 хиляди е добро предположение. Общия размер е към 2-3GB, което не е много и в случая това което натоварва са операциите за отваряне и затваряне на файлове. А да - и имах неблагоразумието да пусна всичко това да върви през един wifi рутер, който забива като се погледне накриво. Всичко си вървя към един-два часа, когато трансфера спря и scp умря с "Connection closed: broken pipe".
Опцията беше да го пусна на ново, да чакам час-два и пак да забие. scp няма resume. Освен това не копира файловете в някакъв ред, а хаотично. Не мога да видя до къде е стигнало (коя папка от петте, кой пореден файл) и да продължа ръчно от там.

Тук на помощ идва rsync. Какво е и как се ползва - който иска да чете man-страницата.

Това което ми свърши работа - довърши копирането без да презаписва вече качените файлове:

rsync -r --partial --progress timelapse_* --rsh='ssh -p220' 192.168.2.1:/extra/ivanatora/snimki/

Аргументите:

  • -r - рекурсивно пълзи по директорията-източниик
  • --partial - запазва файловете, които вече ги има в целта
  • --progress - показва колко файла остават и до къде е стигнало
  • timelapse_* - папките-източник; * се експандва от шела до timelapse_11_04_2011, timelapse_sky_09_04_2011 и т.н.
  • --rsh='ssh -p220' - използва алтернативна команда за пренасяне на файловете. Може да е SSH, но има и други варианти
  • 192.168.2.1:/extra/ivanatora/snimki/ - директорията-цел

Автоматично прекратяване на интерактивна sudo сесия

Thursday, April 28th, 2011

Сценарият е следния: Ubuntu машина, стандартен потребител (ivanatora), който има нужда да свърши няколко неща изискващи root достъп. Вместо потребителя да пише sudo преди всяка команда, той си съкращава писането с:

$ sudo -i
[sudo] password for ivanatora:
#

И минава в интерактивен root-ски логин. От този логин той излиза с `exit` или CTRL+D. До тук всичко е ясно.

Проблем: root логинът се захвърля на някоя конзола измежду всички останали и се забравя там. На повечето системи, които съм виждал този логин би останал отворен вечно, докато не се затвори ръчно.

Решение: следното се добавя в /root/.profile

if [ $SUDO_USER ]; then
        export TMOUT=1200
fi

Обяснение: Опцията "-i" симулира първоначален логин, като се изпълняват и съответните файлове ~/.profile, ~/.bash_profile и т.н. на новия акаунт. TMOUT е променлива на средата, която казва колко секунди след последния вход ще се прекрати процеса. Ако се сложи TMOUT=0 автоматичното прекратяване ще се забрани. SUDO_USER е променлива на средата показваща кой е потребителят изпълнил sudo. На някои системи тази променлива не съществува и там трябва да се ползва "who am i" (с интервалите).

Thinkpad и индикация за батерия

Monday, April 18th, 2011

Взех си евтина китайска батерия от eBay, която държи 3 пъти повече от оригиналната. Естествено електрониката въобще не се разбира с лаптопа и единствената информация, която може да бъде извлечена е процента на заряд. Брой презареждания, температури, напрежение на елементите, тоци - абсурд. Такъв абсурд, че даже и светодиодът за батерия не работи - има само едно - зелено състояние. По принцип с оригиналната батерия като падне под 30% зеленото се сменя с оранжево, а като падне под 20% оранжеовото почва да мига. Ама те и процентите на новата са едни проценти... на 20% гасне лаптопа.
Липсата на някаква осезаема индикация за батерията ми бърка в здравето. За това си написах едно просто скриптче, което взима процента на батерията и при ниски или критични нива примигва осветителния светодиод и издава звук. Скриптът е Thinkpad специфичен и няма да работи на други машини.

  1.  
  2. #!/usr/bin/php
  3. <?php
  4. $sLedFile = "/sys/devices/platform/thinkpad_acpi/leds/tpacpi::thinklight/brightness";
  5. $sBatteryFile = "/sys/devices/platform/smapi/BAT0/remaining_percent";
  6. $sStateFile = "/sys/devices/platform/smapi/BAT0/state";
  7.  
  8. $iPercentLow = 40;
  9. $iPercentCritical = 30;
  10.  
  11. $iNumBlinksCritical = 5;
  12. $iNumBlinksLow = 3;
  13.  
  14. /* **************************************** */
  15. $sState = trim(file_get_contents($sStateFile));
  16. if ($sState != 'discharging'){
  17.     exit(0);
  18. }
  19.  
  20. $iPercentCurrent = trim(file_get_contents($sBatteryFile));
  21. if ($iPercentCurrent < $iPercentCritical){
  22.     for ($i = 0; $i < $iNumBlinksCritical; $i++){
  23.         blink_critical($sLedFile);
  24.     }
  25. }
  26. else if ($iPercentCurrent < $iPercentLow){
  27.     for ($i = 0; $i < $iNumBlinksLow; $i++){
  28.         blink_low($sLedFile);
  29.     }
  30. }
  31.  
  32. function blink_critical($sLedFile){
  33.     `echo 1 > $sLedFile`;
  34.     usleep(100000);
  35.     `echo 0 > $sLedFile`;
  36.     //usleep(100000);
  37.     `beep -f 2000 -l 100`;
  38. }
  39.  
  40. function blink_low($sLedFile){
  41.     `echo 1 > $sLedFile`;
  42.     usleep(1000000);
  43.     `echo 0 > $sLedFile`;
  44.     usleep(1000000);
  45. }
  46.  
  47. ?>
  48.  

Това го слагам на crontab да се изпълнява всяка минута и проблемът е решен:

*/1 * * * * /root/bin/check_battery.php

HDR timelapse

Saturday, April 9th, 2011

Става много бързо и лесно.
Използван хардуер:
- Canon SX120IS (става всеки CHDK-съвместим фотоапарат)
Използван софтуер:
- CHDK
- intervalometer script - без значение точно кой
- enfuse - за сливане на различните експозиции и получаване на HDR
- PHP - долу ще намерите бърз скрипт за сливане на много на брой кадри
- mencoder - за сливане на HDR-ите във финално клипче

Какво е timelapse?
Това е кинематографска техника при която честотата на заснемане на кадрите е по-малка от честотата на възпроизвеждането им. Примерно ако една сцена се снима всяка секунда и после клипа се пусне на 30 fps резултатът ще бъде увеличаване на скоростта 30 пъти.

Какво е HDR?
Ако се абстрахираме от математиката и засуканите термини, можем разговорно да кажем че това е техника за получаване на равномерно осветен кадър (с изчистени преекспонирани и недоекспонирани области). Технологията стандартно използва три кадъра с различна експозиция (-2, 0, +2), които слива в един - изчистен.

Какво става като комбинираме HDR с timelapse?
Красиви клипчета :)

Как се прави HDR timelapse с CHDK?
CHDK не прави HDR - това се прави после от софтуера, който слива трите снимки на сцената. CHDK прави "bracketing" - автоматичното заснемане на трите кадъра с различна експозиция. Следвайте следните стъпки:
1. В менюто на CHDK изберете "Extra Photo Operations" -> "Bracketing in Continuous Mode". Там изберете "Tv bracketing" = 2EV, "Av bracketing" = OFF, "Bracketing type" = "+/-"
2. В менюто на фотоапарата изберете режим "Continuous Mode".
3. В менюто за самоснимачка изберете "Custom mode" със следните параметри: "Delay" = 0s, "Shots" = 3
От тук нататък пуснете кой да е intervalometer скрипт с параметри по избор. Какво ще се случи когато скриптът даде команда за снимане? Ще се задейства самоснимачката, която ще направи 3 последователни снимки с различна експозиция.

В края на сесията след няколко минути/часа ще имате X броя сцени с Х*3 броя изображения. Прехвърляте ги на компютъра и със следния скрипт получавате HDR-ите:

  1.  
  2. <?php
  3. $rDir = opendir(".");
  4. $aFileList = array();
  5. while( ($sFileName = readdir($rDir)) !== false){
  6.     if (!strstr($sFileName, "IMG")) continue;
  7.     $aFileList[] = $sFileName;
  8. }
  9. sort($aFileList);
  10. $aFileList = array_chunk($aFileList, 3);
  11. foreach ($aFileList as $iShotKey => $aFileGroup){
  12.     $sGroupList = join(" ", $aFileGroup);
  13.     $iShotKey = sprintf("%03d", $iShotKey);
  14.     print "Enfuse shot #$iShotKey...";
  15.     `enfuse $sGroupList -o hdr_shot_$iShotKey.jpg`;
  16.     print " done!\n";
  17. }
  18. print_r($aFileList);
  19. ?>
  20.  

От тук нататък имате всяка сцена на HDR с име от типа hdr_shot_001.jpg. От тези трябва да се получи клипче.
Това става с mencoder:
mencoder mf://*.jpg -mf w=640:h=480:fps=15:type=jpg -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell -oac copy -o output.avi
Тук 640 и 480 са размерите на снимките ви. Може да си поиграете с параметъра fps за да получите по-бързи или по-бавни клипчета.

Настоящата статия не претендира за изчерпаемост на темата, нито за професионализъм. Но пък претендира за най-лесния и бърз начин за създаване на HDR timelapse :)

И накрая резултата от едно пробно снимане: