Archive for April, 2011

Автоматично прекратяване на интерактивна 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 🙂

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