Showing posts with label perl. Show all posts
Showing posts with label perl. Show all posts

Профилактика в вашем QuickTime Player


Не так давно обнаружил интересное "шоу" на канале "Россия", под названием "Профилактика". Жаль что трансляция идет поздно (0:45). Но можно же посетить портал канала "Россия" и насмотреться всеми выпусками. Вот только использовать Flash в броузере увольте.



Но есть выход:
curl --user-agent 'Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3' \
http://russia.tv/video/show/brand_id/5200 | \
perl -ne 'm/("http[^"]+showZoomBtn[^"]+")/ and print $1' | \
xargs curl --user-agent 'Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3' | \
perl -ne 'm/("http[^"]+\.mp4[^"]+")/ and $_=$1 and s#\\##g and print' | \
xargs open -a 'quicktime player'
"Засовываем" это в Automator, и все ОК :).



Зачем такие трудности? У меня, к сожалению не 12-ти ядерный Xeon. И очень жалко 50-80% одного из двух ядер на Flash видео. Для сравнения: QuickTime Player "отъедает" на том же "контенте" всего 8-10%.

UPDATE:

Больше можно не париться, ребят выгнали с телика и у них теперь нормальный сайт :), а видео в youtube.com

http://profilaktica.tv 

"Виджеты" для GeekTool/NerdTool.

GeekTool/NerdTool: "It let you display on your desktop different kind of informations..."
Другими словами, упомянутые проекты занимаются отображением разного рода информации прямо на рабочем столе. Это можнет быть текстовый файл, картинка и результат выполнения команды. Последнее волнует меня больше всего :).
Ниже хочу привести маленькие shell скриптики, которыми пользуюсь я:
  • Время (мировое):
echo " \033[01;30m--------- Time ---------\033[00m "
date +"Moscow: %l:%M %p on %d %B"
TZ=England/GMT date +"London: %l:%M %p on %d %B"
TZ=Boston/GMT+5 date +"Boston: %l:%M %p on %d %B"
  • Процессы (прожорливые приложения):
echo " \033[01;30m---------- Top ---------\033[00m "
top -l2 -F -n 10 -u -R -S -stats pid,ppid,command,cpu,time,th,pstate|tail -23| \
sed -e '/^MemRegions:/d' -e '/^SharedLibs:/d' \
    -e '/^VM:/d' -e '/^Networks:/d' -e '/^Purgeable:/d'
  • Состояние дискового пространства:
echo " \033[01;30m---------- DU ----------\033[00m "
df -H -l
  • Сетевые интерфейсы (IP адреса):
echo " \033[01;30m-------- Network -------\033[00m "
ifconfig en0 | grep inet|grep -v inet6|sed -e 's/.*inet/Ethernet IP:/g'
ifconfig en1 | grep inet|grep -v inet6|sed -e 's/.*inet/ Airport IP:/g'
echo External IP: `curl -s http://checkip.dyndns.org/ | sed 's/[a-zA-Z<>/ :]//g'`
  • Календарь:
echo " \033[01;30m------- Calendar -------\033[00m "
RVR=`tput smso`        # reverse
END_RVR=`tput rmso`        # end reverse
BLNK=`tput blink`    # blink
UNDER=`tput smul`        # underline
END_UNDER=`tput rmul`      # underline
CLEAR=`tput clear`    # clear screen
BELL=`tput bel`        # bell sound
BOLD=`tput bold`    # bold    
DIM=`tput dim`        # dim    
INVIS=`tput invis`    # invisible
END=`tput sgr0`        # turn off dim, blink, bold, dim, invisible
DATE=`date +%d | sed "s/^0/ /g"`
cal | head -1
cal | tail -7 |\
sed "s/ ${DATE}/ ${UNDER}${BOLD}${DATE}${END}/g" | \
sed "s/${DATE} /${UNDER}${BOLD}${DATE}${END} /g"
  • Дела/Задачи (icalBuddy должен быть установлен):
echo " \033[01;30m-------- Events --------\033[00m "
/usr/local/bin/icalBuddy -eep notes -sc eventsToday | \
sed -e "s/------------------------/^^^^^^^^^^^^^^^^^^^^^^/g"

echo " \033[01;30m--------- ToDo ---------\033[00m "
/usr/local/bin/icalBuddy -stda -nc uncompletedTasks | \
perl -ne '
my $flag=0;
m/^\S+/ and chomp and print and $flag=1;
m/^\s{4}due:\s+(.+)$/ and print " ($1)" and $flag=1;
print "\n" if ( $flag );
'
  • Погода (код города надо заменить на свой, здесь RSXX0063 = Москва):
echo " \033[01;30m------- Weather -------\033[00m "
curl --silent "http://xml.weather.yahoo.com/forecastrss?p=RSXX0063&u=c">tmp.xml
grep "<title>Conditions" tmp.xml | sed -e 's/<\/*title>//g'
grep -A 4 "Current Conditions" tmp.xml | sed -e's/<\/*[bB][rR]* *\/*>//g'
rm tmp.xml
#!/bin/sh
print_currency_info() {
    perl -ne '
    print "$1 " if (m#<from>(\S+)</from>#);
    print "--> $1\n" if (m#<rate>(\d+\.\d*)</rate>#);
    '
}

# USD
curl --silent "http://finance.rambler.ru/ajax/currency_converter.xml?count=1&from=2210&to=2211&date=`date +%d.%m.%Y`&rand=52908"| \
print_currency_info;

# EUR
curl --silent "http://finance.rambler.ru/ajax/currency_converter.xml?count=1&from=2209&to=2211&date=`date +%d.%m.%Y`&rand=87715"| \
print_currency_info;

# GBP
curl --silent "http://finance.rambler.ru/ajax/currency_converter.xml?count=1&from=2303&to=2211&date=`date +%d.%m.%Y`&rand=91799"| \
print_currency_info;

echo "(finance.rambler.ru)"
Надеюсь кому нибудь пригодится.

Anki, транскрипция и произношение.

Сейчас многие занимаются изучением иностранных языков.
Я тоже не исключение. Для расширения словарного запаса мне помогает Anki (прекрасное кросс-платформенное приложение).
Все прекрасно в этом творении софтверной мысли :).
Но вот так называемые Deck'и редко содержать что-то больше чем слово и его самый распатроненный перевод. Не густо. Хочется видеть как минимум транскрипцию, да и звуковое сопровождение (от носителя языка) тоже не плохо. Благо Anki это может.

Транскрипцию я предпочитаю брать из словарей Lingvo, звук из словарей Google.
Делая это "руками" и броузером теряем слишком много времени и бесценное внимание (концентрацию на задаче).

Соответственно...

Вот мой скриптик который помогает делать следующие:
  • получить mp3 файл с произношением
  • получить транскрипцию (копируется в буфер)
  • ну и можно как словарь консольный пользовать :)
#!/usr/bin/ksh
#

if [[ "x$1" = "x" ]]; then
    echo "Specify word!"
    exit 1
fi

echo "=-=-=-=-=-=-=-= General =-=-=-=-=-=-=-="
s_word=$*
echo "word => ${s_word}"

s_url=$(
        curl --silent "http://www.google.ru/dictionary?langpair=en%7Cru&q=${s_word}" | \
        perl -ne "m#${s_word}.+?mp3#i and print" | \
        perl -ne 'm#(http://.+?\.mp3)# and print $1 and exit' 
       )

echo "URL => ${s_url}"
curl --silent -O ${s_url} &

for l_word in ${s_word}
do
    s_regex=${l_word}'(<[^>]+>)+\[(<[^>]+>)+([^<]+)(<[^>]+>)+\]'
    s_trans=$(
        curl --silent "http://lingvo.yandex.ru/en?text=${s_word}&lang=en&search_type=lingvo&st_translate=on" | \
        perl -ne "m/${s_regex}/ and print '[' . \$3 . ']' "
    )
    echo -n ${s_trans} | pbcopy
    echo "transcription => ${s_trans}"
    echo
done
echo

echo "=-=-=-=-=-=-= Translation =-=-=-=-=-=-="
curl --silent "http://lingvo.yandex.ru/en?text=${s_word}&lang=en&search_type=lingvo&st_translate=on" | \
grep  'p class="L1"' | \
perl -pe '
s/(<p[^>]*>)|(<br[^>]*>)/\n/gi; 
s/(<[^>]+>)+//gi; 
s/[\t ]+/ /g; 
s/Syn:/\nSyn:/gi;
s/«[^»]+» в других словарях.*//gi;
s/\n+/\n/sg
' | head -40 #remove this if you want to see full translation

[[ -x $( which mpg123 ) ]] && \
[[ -f "${s_word}.mp3"   ]] && mpg123 ${s_word}.mp3 2>/dev/null &

Может кому поможет ;)
Всем спасибо, Все свободны.

UPDATE: к сожалению данный скрипт уже не работает (интернет штука динамическая). Времени написать свежую версию нет :(

Свободные словари (часть 2)

Продолжая «публикацию» о свободных словарях, перенесем военные действия в визуальную среду (а точнее в Dictionary.app).
После некоторых поисков на тему как же заставить работать DictUnifier, было найдено пару патчей. Прежде всего спасибо David’s logbook. Пролистав комментарии можно обнаружить что там есть ссылка на патчик.
Патченная версия работает лучше. Но вот с форматированием проблема. Словарные статьи не как не форматированы, текст идет в одну или несколько длинных строк. К тому же вся словарная статья заключена в тег pre. И мы видем что-то вроде этого:

Это мало мне нравилось. И я подправил (слегка) build_dict.sh. Данный скрипт отвечает за всю логику работы приложения. Добавил я не много. А точнее блок 'butifier'. И вот что получилось:
.
Пропатченный DictUnifier можно скачать с rapidshare.
Прошу заметить что данная версия DictUnifier`а создает файлы в диретрии ~/.sdconv_back.

Зачем?

Все просто: в эту директория копируются исходники для создания словаря (как до butifier так и после). Имея эти файлы можно подправить, то что скрипт не смог.

Удачи.

Свободные словари (часть 1)

Пролог

Я с нетерпением ждал нового Show Leopard. Как только долгожданный диск стал доступен, тут же был приобретен за кровные 990р :). С приобретением нового лицензионного продукта, решил окончательно покончить с остатками вареза на своем маке. Началась война за чистоту содержимого давно. В этот раз дошел до последнего рубежа (надеюсь все остальное уже «чисто»): словари Lingvo. О словарях речь и пойдет.

Попытка номер раз

Большая часть простых пользователей для начала попытается найти готовое (и красивое решение). Выбор программы: Сама реализация от Apple меня очень даже устраивает. Но есть один нюанс … готовые словари. К сожалению родной Dictionary.app согласен работать только с одним форматом словарей, а именно *.dictionary. Выбор словарей: Жаль но готовых русско-английский/англо-русский словарей я не нашел (возможно не дано). Адаптация словарей: Если нет готовых (и «родных») словарей надо найти конвертер. Как мне кажется самая большая коллекция свободных (и к тому же довольно объемных) словарей расположена на xdxf.revdanica.com. Портал может предложить 2 вида словарей: XDXF и StarDict. Значит надо найти конвертер для этих форматов. И о чудо есть прекрасный проект, где можно найти DictUnifier который позволит нам превратить StarDict словарь в Apple Dictionary словарь. К сожалению проект скорее мертв чем жив (последние обновления в приложение датированы Мартом 31, 2008). И полученный словарь не всегда работает в Dictionary.app.

Попытка номер два

Альтернативные программные продукты (бесплатные конечно). Что мы имеем из готового? Как оказалось, не много :(. В основном это старые малопригодные к работе приложения. Приводить их список особого смысла думаю нет.

Попытка номер три

А почему мы обошли стороной StarDict (скомпилированный под Mac), так любезно предоставленный разработчиками StarDict. Ответ прост. Таким продуктом пользоваться не хочется: Выглядит оно может и хорошо (все в мире относительно). screen-shot-2009-10-01-at-6.18.48-pm.png Но вот интеграции с ОС просто нет. Пример: попробуем свернуть окошко (cmd + h), и о «чудо» мы его теперь не «вернем» (закрываем, и открываем заново).

Попытка номер ...

Наверное пора сдаваться. Готовых решений нет. Но постойте ведь мы же пользуемся UNIX системой! Конечно! Надо найти что-то из MacPorts. Увы ничего… Ничего страшного! Ведь мы же не безрукие (хочется верить), «адаптируем» сами. И тут какраз нашелся консольный вариант StarDict: sdcv. Ура!!! Осталось только собрать это чуда для себя :). Качаем, распаковываем, открываем терминал, и…: pkgconfig и glib2 никто (из Apple) установить в систему не «успел» %). Я пошел простым путем: зачем делать самому, можно взять готовое. Устанавливаем всем известный (надеюсь это так %) ) MacPorts и вперед:
$ port deps glib2
Full Name: glib2 @2.20.5+darwin
Build Dependencies:   pkgconfig
Library Dependencies: gettext, libiconv, perl5, python_select
$ sudo port install glib2
Затем «собираем» sdcv:
$ cd sdcv-0.4.2
$ ./configure --prefix=/opt/local
$ make
$ make check
$ sudo make install
$ make clean
Но не все так просто, нас ждет две трудности (для шага make)
  1. Ошибочка в lib.cpp
    lib.cpp: In member function ‘const gchar* offset_index::read_first_on_page_key(glong)’: 
    lib.cpp:516: error: no matching function for call to ‘min(long unsigned int, guint32&)’ 
    К счастью решается просто: в форему написано что в svn уже поправили (берем новую версию файла). Вот кстати можно взять патчик отдельно.
  2. getopt.h содержит «не правильное» для «нас» определение функции getopt().
    In file included from sdcv.cpp:33: 
    ./getopt.h:146: 
    error: declaration of C function ‘int getopt()’ conflicts with /usr/include/unistd.h:458: 
    error: previous declaration ‘int getopt(int, char* const*, const char*)’ here 
    Решение еще проще: Меняем стоку «extern int getopt ();» на «extern int getopt (int __argc, char *const *__argv, const char *__shortopts);» в вышу указанном файле. Вот diff -u для оригинала и измененного:
    --- getopt.h_orig    2005-01-12 00:11:10.000000000 +0300
    +++ getopt.h    2009-10-01 20:38:22.000000000 +0400
    @@ -143,7 +143,8 @@
        errors, only prototype getopt for the GNU C library.  */
     extern int getopt (int __argc, char *const *__argv, const char *__shortopts);
     # else /* not __GNU_LIBRARY__ */
    -extern int getopt ();
    +extern int getopt (int __argc, char *const *__argv, const char *__shortopts);
     # endif /* __GNU_LIBRARY__ */
     
     # ifndef __need_getopt
После этого все «соберется». Складываем словари (предварительно скаченные с xdxf.revdanica.com) в ~/.stardict/dic и вуаля.

Немного вольностей

Но вот беда. Вывод sdcv не очень красочный:
screen-shot-2009-10-01-at-8.48.03-pm.png
Но как это и полагается, мы пойдем своим путем. А именно: напишем скрипт-оболочку (скорее помятую обертку). И получим что-то вроде этого:
screen-shot-2009-10-01-at-8.48.17-pm.png
Помоему уже не плохо. Скрипт можно взять здесь. Сильно прошу не судить (написан был быстро и без особых претензий).

Эпилог

Так как проект sdcv тоже больше похож на мертвеца, думаю что следующий шаг будет в написании чего-то самому. Жаль только что из всех языков программирования сейчас пользуюсь только perl/ksh. Другие позабыл уже давно. Поэтому волонтеры заинтересованные в написании альтернативы Dictionary.app и представленного здесь «Костылъ.арр», могут обращаться. В данный момент начил осваивать GUI в Xcode. Надеюсь на продолжение истории…