четверг, 9 декабря 2010 г.

NetworkManager сломался после апдейта

Вобщем сломался у меня networkManager, не мог нажать на "Enable Networking" вайфай не работает, по проводам смог подцепится только прописав настройки в /etc/network/interfaces
в логе примерно такое
Dec  9 09:03:34 xps NetworkManager: <info>  Found wlan radio killswitch rfkill1 (at /sys/devices/virtual/rfkill/rfkill1) (driver <unknown>)
Dec  9 09:03:34 xps NetworkManager: <info>  WiFi enabled by radio killswitch; enabled by state file
Dec  9 09:03:34 xps NetworkManager: <info>  WWAN enabled by radio killswitch; enabled by state file
Dec  9 09:03:34 xps NetworkManager: <info>  (eth0): carrier is ON
Dec  9 09:03:34 xps NetworkManager: <info>  (eth0): new Ethernet device (driver: 'sky2')
Dec  9 09:03:34 xps NetworkManager: <info>  (eth0): exported as /org/freedesktop/NetworkManager/Devices/0
Dec  9 09:03:34 xps NetworkManager: <info>  (eth1): driver supports SSID scans (scan_capa 0x01).
Dec  9 09:03:34 xps NetworkManager: <info>  (eth1): new 802.11 WiFi device (driver: 'wl')
Dec  9 09:03:34 xps NetworkManager: <info>  (eth1): exported as /org/freedesktop/NetworkManager/Devices/1
Dec  9 09:03:34 xps NetworkManager: <WARN>  device_creator(): /sys/devices/virtual/net/pan0: couldn't determine device driver; ignoring...
Dec  9 09:04:05 xps NetworkManager: <WARN>  nm_signal_handler(): Caught signal 15, shutting down normally.


Для починки не помогало ни переустановка его самомго ни wpasuplicant ни чего то другого.

а помогло вот это

sudo service network-manager stop
sudo rm /var/lib/NetworkManager/NetworkManager.state
sudo service network-manager start

суббота, 4 декабря 2010 г.

Ubuntu удаляем ненужные ядра.

Накопилось у меня целая толпа разных ядер.
$ dpkg -l |grep ii|grep -E 'linux-headers|linux-image'          
ii  linux-headers-2.6.32-21              2.6.32-21.32                                          Header files related to Linux kernel version 2.6.32
ii  linux-headers-2.6.32-21-generic      2.6.32-21.32                                          Linux kernel headers for version 2.6.32 on x86/x86_64
ii  linux-headers-2.6.32-24              2.6.32-24.43                                          Header files related to Linux kernel version 2.6.32
ii  linux-headers-2.6.32-24-generic      2.6.32-24.43                                          Linux kernel headers for version 2.6.32 on x86/x86_64
ii  linux-headers-2.6.32-25              2.6.32-25.45                                          Header files related to Linux kernel version 2.6.32
ii  linux-headers-2.6.32-25-generic      2.6.32-25.45                                          Linux kernel headers for version 2.6.32 on x86/x86_64
ii  linux-headers-2.6.32-26              2.6.32-26.48                                          Header files related to Linux kernel version 2.6.32
ii  linux-headers-2.6.32-26-generic      2.6.32-26.48                                          Linux kernel headers for version 2.6.32 on x86/x86_64
ii  linux-headers-generic                2.6.32.26.28                                          Generic Linux kernel headers
ii  linux-image-2.6.32-21-generic        2.6.32-21.32                                          Linux kernel image for version 2.6.32 on x86/x86_64
ii  linux-image-2.6.32-24-generic        2.6.32-24.43                                          Linux kernel image for version 2.6.32 on x86/x86_64
ii  linux-image-2.6.32-25-generic        2.6.32-25.45                                          Linux kernel image for version 2.6.32 on x86/x86_64
ii  linux-image-2.6.32-26-generic        2.6.32-26.48                                          Linux kernel image for version 2.6.32 on x86/x86_64
ii  linux-image-generic                  2.6.32.26.28                                          Generic Linux kernel image
И решил я их подчистить, тоесть удалить все кроме текущего
$ uname -r                                                                                                                                                     
2.6.32-26-generic
можно конечно руками в synaptic или каждый копипастить, но "мы не ищем простых путей - нам лень"(c) поэтому вот небольшой скрипт, который можно скопировать в командную строку и выполнить, на каждую операцию удаления спросит подтверждения
$ VERSION=$(uname -r|sed -r "s|-[^-]*$||;s|-|.|"); PACKAGES=$(dpkg -l |grep ii|grep -E 'linux-headers|linux-image' |grep -rv "$VERSION" | awk '{print $2}'); for i in  $PACKAGES;do sudo apt-get remove $i;done

Если у кого есть более красивый вариант, предлагайте :), буду рад.

суббота, 27 ноября 2010 г.

Anki English phrases

Вот думал я думал подправить деку с нерегулярными глаголами, и передумал.. А тут еще и такой шикарный сайт подвернулся Содержащий Английские фразы с русским переводом и самое главное с произношением!!!, получилась офигенная дека, после ее изучения, теперь можно знать не только What time is it now и т.д. и т.п. =)

Скачать и установить можно ее из интерфейса программы называется она "English-Russian phrases (eng. pronunciation)"


Собирал все скриптом написаном на python, скачать можно здесь

Так что Welcome =).

среда, 10 ноября 2010 г.

Новая дека (2000 часто используемых слов)

Вобщем посмотрел я посмотрел свои деки, и провел работу над ошибками, результат - дека English-Russian most used (можно скачать из анки из меню shared decks)
были устранены недостатки
  • Теперь все качается с google.com/dictionary (а не translate.google.com)
  • В деках присутствует транскрипция
  • Если у слова 2 произношения, то качаются оба и склеиваются в один файл
  • Качается полный перевод(все значения что показывает гугл), забавно было, когда бралась только первая часть :), только из за этого и переписал скрипт, как вам дека только с первой частью перевода словa queen от гугла :) ? какой перевод расскажет ученик у доски фразы "queen Victoria"?
  • Главный перевод, - тот что первая строчка оборота карточки, состоит из первых слов перевода для глагола, существительного и т.п. этого слова
  • Теперь в деке присутствует модель. Раньше было всего лишь 2 поля(слово - перевод) теперь же 5 полей, и при желании можно отключать ненужные вещи
  • Убраны картинки, те что качались с гугла, все равно мельтешили, и никакой нагрузки не несли
  • Ну и хоть я и не эксперт в питоне, но переписал скрипт именно под него, и теперь при желании можно запускать скрипт под виндой (хотя я это не пробовал, но шансов на положительный успех больше)

из недостатков кода, к сожалению все захардкожено
  • нужно создавать руками папку media в папке с скриптом
  • никаких входных параметров, поэтому входной файл "input" (с которого берутся слова)
  • обработка ошибок тоже так себе, - если чтонибудь не получилось, то слово игнорируется (так что смотрим лог, на предмет слова fail

скрипт тута

поступила информация, что с сайта anki у некоторых скачивается с ошибкой, поэтому можно скачать эксорт деки от сюда

вторник, 26 октября 2010 г.

Anki English Irregular verbs + Russian translate

Дошли наконец руки до важной части английского языка - неправильных глаголов.
Изменил немного старый скрипт и собрал деку.
Собирается примерно как в этой статье, за исключением что все делает скрипт, плюс качает перевод и произношение (правда есть небольшой косяк, в некоторых карточка для одно неправильного глагола есть несколько прошлых времен и т.п., - для них произношение не качается)

Работает следующим образом.
создаем в папке 3 файла v1,v2,v3 соответственно Infinitive, Simple Past, Past Participle. (в том же порядке, тоесть слову из n-й строчки соответствуют слова из n-й строчки 2го и 3го файла)
далее выкачиваем скрипт в эту же папку

$ wget https://sites.google.com/site/nicloaynidvoray/filelist/ivdeckgen

даем права на выполнение

$ chmod a+x ivdeckgen

запускаем

$ ./ivdeckgen

по завершению импортируем result/anki_deck в анки
копируем все из папки result/sound в ~/.anki/decks/DECK_NAME.media (где DECK_NAME имя которое дали деке)
Запускаем checkDB в анки. (tools->advanced->check media database) и все

вот так это выглядит



Скачать готовую деу можно жимкнув на
вот эту подчеркнуют надпись :)

понедельник, 18 октября 2010 г.

Anki. Читаем текст без словаря

Хочу сразу огорчить, волшебного вмешательства высших сил через TCP/IP не будет :).

А произойдет вот что.
  1. Возьмем текст который хотим прочитать без словаря
  2. Сохраним его в файл
  3. Приведем его к виду, когда в каждой строчке будет по одному слову, и удалим все знаки препинания и цыфры
  4. сохраним его дважды, и в одном файле удалим все слова которые незнаем, оставив лишь те которые знаем и предлоги. типа "a" "to" и прочие ништяки
  5. скачаем волшебный скрипт, который сделает нам из этих 2х файлов (слова из текста и слова которые мы знаем) деку, с произношением переводом и картинками
  6. Симпортируем результат в Anki.
  7. Ну а тут уже все зависит от вас, как долго вы эту деку будете мусолить в anki =)
также скрипт будет полезен тем кто хочет например скачать произношения из консоли с сайта, скачать перевод с консоли или скачать и трансформировать несколько изображений с гугла и собрать гифку.
Внизу данной статьй есть видео, как это все в конечном итоге будет выглядеть.

Ну чтож. начнем.
  1. Установим необходимые пакеты (curl, imagemagick)
    $ sudo apt-get install curl imagemagick
    
  2. создадим папку в которой будем работать и проследуем в нее
    $ mkdir ankideck&&cd ankideck
    
  3. выкачаем скрипты (один который работает с поисковиком гугл по картинкам и 2й основной который и создаст деку)
    $ wget https://sites.google.com/site/nicloaynidvoray/filelist/google_collector && wget https://sites.google.com/site/nicloaynidvoray/filelist/deckgen
    
    и дадим им права на выполнение
    $ chmod a+x deckgen&& chmod a+x google_collector 
    
  4. Выберем текст, я же возьму слова из предыдущей статьи про phrasal verbs c данного сайта
    • Обычным копипастом (чтоб не мучатся с тегами ) копируем это в новый файл и сохраняем в папку которую создали например с именем src
    • получилось что то типа этого (показывает несколько первых строчек)
      $ head src     
      Phrasal Verbs - Ordered List by Verbs
      
       
      
      Phrasal Verb
      
      Meaning
      
      Examples
      
      
    • ничего страшного что есть куча пустых строчек и т.п., это все уберется далее
  5. Если хотите составить список слов которые вы знаете вручную, то формат прост (новая строка отдельное слово), я же покажу как взять текущие слова вывести список уникальных и убрать все лишнее
    • выводим список слов в файл known.words
      $ cat src|tr '1234567890!@#$%^&*()-=+_?/}{[]—£"' ' '|sed 's|  *| |g;s| |\n|g'|sed "s|^'||g;s|'$||g; s|^.$||g"|tr "[:upper:]" "[:lower:]"|sort|uniq >known.words
      
    • посмотрим сколько тут слов
      $ cat known.words|wc -l                                                                                                                
      2271
      
      мда... не утешительно.. всю ноч придется учить.. как бы не полярную :)
      ну да ладно..
    • открываем файл known.words в любом редакторе и удаляем от туда все незнакомые слова
      у меня получилось около 10 слов.
  6. Вобщем то все. Вот что у нас лежит в папке: 2 скрипта и 2 файла
    ls
    deckgen  google_collector  known.words    src
    
    все что нужно, запускаем
    $ ./deckgen -i src -k known.words
    
    
    
    и идем пить, чай, потом смотрим что все это будет не быстро :) и идем спать. :)
  7. После импорта гегенируется файл anki_deck в папке result вот его то и нужно указать когда нажмете на import в anki. и Все бы хорошо.. но линки на медиаресурсы не совсем правильные инужно нажать на
    tools->advanced->Check Media Database и жимкнуть на Tag Cards

К сожалению деку всю выложить не получится, получилась около 500 метров, пока нет идей как ее можно пошарить.

А выглядит это все вот так:

воскресенье, 17 октября 2010 г.

Anki phrasal verbs

И так, кто не в курсе что это за "phrasal verbs", это важная часть английского языка, так как народ у них там ленивый, они используют как можно меньше слов в своей речи и различные комбинации часто употребляемых слов и есть "phrasal verbs" что то типа нашего "дать по тыкве".

Началось все как обычно с гугления списка этих глаголов. Сначала мне казалось что придется мержить списки с нескольких сайтов. но вот попался http://www.cad.ntu-kpi.kiev.ua/~demch/friends/esl4rus/pvlist.html список из целых 450 phrasal verbs, думаю этого с головой для обычного смертного вроде меня.

Вот и прорисовалась наша миссия, импортировать эту таблицу в anki


1. Можно конечно было бы распарсить html, но мы пойдем более простым путем, скопируем таблицу в OoO Calc. и каждую колонку сохраним в отдельный файлы verbs1, verbs2, verbs3

2. Ну вот.. самая сложная часть работы позади :) осталось взять по каждой строчке из файла и в нужном порядке положить в файл. Для этого выполним серию комманд, прямо из терминала
$ COUNT=$(cat verbs1|wc -l);for i in $(seq 1 $COUNT);do \
echo -e $(cat verbs1|sed -n $i'p') \
"\t"$(cat verbs2|sed -n $i'p') \
"<br /><br /><span style='font-style:italic;'>" \
$(cat verbs3|sed -n $i'p')"</span>" >>anki_deck; \
echo -e $(cat verbs2|sed -n $i'p') \
"\t"$(cat verbs1|sed -n $i'p') \
"<br /><br /><span style='font-style:italic;'>" \
$(cat verbs3|sed -n $i'p')"</span>" >>anki_deck; \
done

3. В итоге мы получили файл anki_deck, который мы должны импортировать в anki. в процессе импорта, получил несколько ошибок.

Importing complete. 895 facts imported from anki_deck.
Log of import:
Fact is missing field 'Front': , hand over <br /><br /><span style='font-style:italic;'> </span>
Fact has duplicate 'Front': review / study thoroughly for a short time , brush up on (inseparable) <br /><br /><span style='font-style:italic;'> If you're going to travel to Peru, you'd better brush up on your Spanish.</span>
Fact has duplicate 'Front': distribute , pass out (2. separable) <br /><br /><span style='font-style:italic;'> Everyone in the room needs one of these information sheets. Who will help me pass them out?</span>
Fact has duplicate 'Front': return something to the proper place , put back (separable) <br /><br /><span style='font-style:italic;'> I've finished with these books. Do you want me to put them back on the shelves?</span>
Fact has duplicate 'Front': return something to the proper place , put up (1. separable) <br /><br /><span style='font-style:italic;'> Your toys are all over the floor, Timmy. Please put them up.</span>
Fact has duplicate 'Front': discard; put in the garbage , throw out (1. separable) <br /><br /><span style='font-style:italic;'> This food smells bad. You'd better throw it out.</span>
Fact has duplicate 'Front': turn out , come to a meeting or to form a crowd <br /><br /><span style='font-style:italic;'> Thousands of fans turned out to welcome the team.</span>

что говорит 'duplicate' вроде понятно., идем в файлы (verbs1,verbs2,verbs3), ищем там дубликаты строчки и добавляем им индексы (1) (2) и т.п., так же видим что "hand over" остался сиротой, без описания и примера., восполним это результатом из переводчика

4. Так как мы получили ошибки, и подправили файлы. удаляем файл anki_deck, и переходим к пункту 2, получаем красивый результат
Importing complete. 900 facts imported from anki_deck.
что говорит что все ок. жимкаем Ctrl-S (выбираем куда сохранить) и вуаля.. - дека готова

выглядит очень красиво :).
а главное полезно :).

для ленивых товарищей, готовую деку можно скачать жмакнув сюда, либо посмотреть shared deck в интерфейсе анки

понедельник, 4 октября 2010 г.

Gnome tile windows. Или наводим порядок из окошек.

Вот наконецто я получил монитор, и первым делом вспомнил свою давнюю проблему, упорядочивание окошек. Ставить Compiz или подобное не совсем хотелось из за проблем совместимости с моими горячими кнопками, производительностью системы и лагами в java. Но проблема была серьезная и выход был найден.
Гугл нам выдал утилиту для управления окнами wmctrl простенький интерфейс, ничего лишнего. но забегая вперед скажу что есть недостатки
1. Через эту утилиту так и не смог добится стабильности в свертывании окон
2. В списке не видно минимального и максимального размера окна.
Из этого вытекли 2 проблемы (когда я считаю окошки, то в расчет идут свернутые) Когда я делаю ресайз, то такие приложения как например evolution, имеют минимальный размер окошка, поэтому результат не всегда красивый.


Ну ничего страшного, основное для чего делалось - это куча терминалов (c другими окошками будет работать тоже!) (тут кстати тоже небольшой косяк, но размер окошка считается не правильно. -при ресайзе gnome-terminal добавляет к размеру высоту контекстного меню
вобщем что было и что стало видно на правых скриншотах

как все это чудо заставить работать
1. Качаем wmctrl
$ sudo apt-get install wmctrl

2. Качаем скрипт
$ wget -O walign https://sites.google.com/site/nicloaynidvoray/filelist/walign?attredirects=0&d=1

3. Смотрим (на всякий случай :) ) на эту красоту, а то веть сейчас будем копировать с правами sudo.
$ cat walign

4. Если никакого криминала, то идем дальше (если хотите чтоб эта фича была доступна для всех юзеров, то логично положить скрипт в /usr/local/bin если же нет, то можно оставить в текущей папке
двигаем скрипт в /usr/local/bin
$ sudo mv walign /usr/local/bin/

5 Даем права на выполнение
$ sudo chmod a+x /usr/local/bin/walign

6 В этот момент нетерпеливый юзер уже тычет в кнопки и запускает walign в терминале и с радостью замечает как окошки оживают начинают красивый танец по монитору, выстраиваясь в стройные ряды.
Остальные же читают дальше и узнают самое главное! как это прикрутить к горячей клавише

идем в шоткаты.

7 Жмем кнопку Add

и добавляем запуск нашего скрипта (если всетаки вас мучают паронаидальные настроения и вы не решились двигать этот скрипт в /usr/local/bin то тут нужно будет вместо walign прописать полный путь к скрипту)

8 Ну и осталось самое простое- нажать напротив команды кнопку и выжать горячую комбинацию клавиш (я себе сделал ctrl-alt-A)


И вуаля!, вот оно :) по нажатию ctrl-alt-A у нас теперь окошки выстраиваются в различные комбинации :), единственное что могу сказать - на монитора с не традиционной ориентацие (portrait) данный скрипт загнется. если сильно будет нужно - починю, сейчас пока в лом.

четверг, 30 сентября 2010 г.



пробую gnom-blog

Вот решил найти какойнибудь оффлайн клиент для блога. судя по всему gnome-blog это не то что мне нужно

хочется чтоб можно было вставлять форматированный текст. идеал с подсветкой, если это java, python, bash, etc..

здсесь же совсем ничего интересного

ну ладно хоть вставка изображений через drug-n-drop работает =)



аххх шЫт фот и нфига.. вставится вставилось, но на момент upload-а выругался :)

TNS-01150: The address of the specified listener name is incorrect и все все все

Иш ты жесть какая с ораклом приключилась. поставил Оракл все путем, но листнер стартовать не хочет пишет вот такую ошибку

Started with pid=5629
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
TNS-01150: The address of the specified listener name is incorrect
TNS-01153: Failed to process string: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xps)(PORT=null)))
No longer listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))


в администрировании оракла я не силен и как устроен листнер не совсем знаю :) вобщем погуглил, и нашел статью что должны быть настроены отступления

вот это не правильно
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = xps)(PORT = null))
)
)


а вот это правильно
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = xps)(PORT = null))
)
)


В моем же случае все оказалось проще :), (PORT = null) вот это дело не давало мне покоя.. - нужно было поменять на (PORT = 1524), ибо слушанье на нулевом порту это жесть.

Так что наводите красоту и будьте бдительны :)

в догонку
если получили вот такую ошибку
Failed to auto-start Oracle Net Listener using /ade/vikrkuma_new/oracle/bin/tnslsnr

то дело в том что ORACLE_HOME_LISTNER захардкожен в скрипте запуска dbstart
поменять на это
ORACLE_HOME_LISTNER=$ORACLE_HOME

и наступит счастье :)

ну а если счастье не наступило, как у меня, и появилась вот такая ошибка
OC4J Configuration issue. /u01/app/oracle/product/10.2.0/db_1/oc4j/j2ee/OC4J_DBConsole_xps_orcl not found.

то как советует интернет, нужно проверить ORACLE_SID, но опять же не мой случай. :) у меня в папке $ORACLE_HOME/j2ee/ действительно небыло файла OC4J_DBConsole_xps_orcl. И тут на помощь пришла утилита
$ORACLE_HOME/bin/dbca

которая отконфигурит вашу датабазу и вот уж тогда и засияют помидоры.

суббота, 25 сентября 2010 г.

Install flashplayer debugger to firefox

wget http://download.macromedia.com/pub/flashplayer/updaters/10/flash_player_10_linux_dev.tar.gz
tar -xzvf flash_player_10_linux_dev.tar.gz
cd flash_player_10_linux_dev/
tar -zxvf plugin/debugger/libflashplayer.so.tar.gz
sudo mv libflashplayer.so /usr/lib/flashplugin-installer/

воскресенье, 19 сентября 2010 г.

Google images + stardict sound + anki

И так не сказать что все прошло гладко :) ОДнаждый меня забанил гугл, после того как я в 26 потоков началу него выпрашивать картинки, поэтому пришлось немного переписать скрипт.
Работает следующим образом. У меня 14 тыщ звуковых файлов. я их смотрю и отправляю запрос вида
http://www.google.com/images?....

Ну и после этого мне возвращается несколько картинок, я беру всего 3, их склеиваю в одно изображение и приписываю перевод который мне дает stardict (тоже узкое место, из за того что куча словарей и иногда получается билеберда)
и на выходе получаем следующее
например на заброс backbone получается такая вот карточка

ball

call


если все ок, то звуковой файл кладется рядышком, и переход на следующую итерацию, если вдруг гугл нас банит - то ни одно изображение до нас не доходит и программа завершается.
скрипт для запуска
#!/bin/bashls
TERM=xterm
export TERM
THREADS=3
TIMEOUT=5s

for FOLDER in /usr/share/stardict/sounds/Sound_En/*;
do
bash ../ganki.sh "$FOLDER" &
while [ "`jobs -p|wc -l`" -ge $THREADS ];
do
sleep $TIMEOUT
done
done



все чем он занимается это запускает основной в несколько потоков (тут можно настроить timeout с которым он опрашивает сколько потоков в текущий момент крутится и количество тредов), также обратите внимание что он запускает (это 2й основной скрипт) и по чему идет цикл (это рутовая директория аудиофайлов в которой 26 дирикторий с английскими буковками, внутри которых аудиофайлы с словами на эту букву)


#!/bin/bash
# Great thanks image download function creator http://www.krazyworks.com/wget-google-image-collector/
TMP_FILE=g.src.tmp
IMAGE_COUNT=3
SIZE="large"


FONT="/usr/share/fonts/truetype/ttf-dejavu/DejaVuSerif.ttf"

ROOT_FOLDER=$1;
OUT_DIR=$(echo $ROOT_FOLDER|sed "s/.*\///g")

if [ ! -d "$OUT_DIR" ]
then
mkdir $OUT_DIR
fi

for SOUND_FILE in $ROOT_FOLDER/*;
do
cp $SOUND_FILE $OUT_DIR;
KEYWORD=`echo ${SOUND_FILE/*\//}|sed "s/.ogg//g"`;
echo $OUT_DIR:$KEYWORD;
CAPTION=$(sdcv -n $KEYWORD|grep -A 10 Ru|egrep '^ *[1-3]\)'|head -n 2|sed "s/^ *[0-9].//g"|tr "\n" ", ")
if [ -z "$CAPTION" ];
then
CAPTION=$(sdcv -u 'LingvoUniversal (En-Ru)' $KEYWORD|tail -n 2|tr "\n" ", ")
fi
CAPTION=$(echo $CAPTION|sed 's/[\,]* *$//g');





# download images from google
i=0
URL="http://images.google.com/images?q=${KEYWORD}&svnum=100&hl=en&lr=&safe=off&sa=G&imgsz=${SIZE}"
wget -q -U Mozilla -O "${OUT_DIR}/results_${i}.txt" "$URL" -e robots=off

cat "${OUT_DIR}/results_${i}.txt" | sed 's/href/\n/g' | grep imgurl | grep imgrefurl | sed 's/imgurl=/@/g' | sed 's/&imgrefurl/@/g' | awk -F'@' '{print $2}' > "${OUT_DIR}/image_urls.txt"
results=$(cat "${OUT_DIR}/results_${i}.txt" | sed 's/border/\n/g' | fgrep '&start=' | fgrep -v '&start=0' | uniq | fgrep '
' | wc -l | awk '{print $1}')

i=1
while [ $i -lt $results ]
do
(( START = i * 20 ))
URL="http://images.google.com/images?q=${KEYWORD}&svnum=100&hl=en&lr=&safe=off&sa=G&imgsz=${SIZE}&start=${START}"
wget -q -U Mozilla -O "${OUT_DIR}/results_${i}.txt" "$URL" -e robots=off
cat "${OUT_DIR}/results_${i}.txt" | sed 's/href/\n/g' | grep imgurl | grep imgrefurl | sed 's/imgurl=/@/g' | sed 's/&imgrefurl/@/g' | awk -F'@' '{print $2}' >> "${OUT_DIR}/image_urls.txt"
(( i = i + 1 ))
done


find "$OUT_DIR" -type f -name "results_*.txt" -exec rm {} \;
cat "${OUT_DIR}/image_urls.txt" | fgrep '.jpg' | head -n ${IMAGE_COUNT} > /tmp/google_image_collector_${KEYWORD}.tmp
mv /tmp/google_image_collector_${KEYWORD}.tmp "${OUT_DIR}/image_urls.txt"

if [ -f "${OUT_DIR}/image_urls.txt" ]
then
clear
COUNT=$(cat "${OUT_DIR}/image_urls.txt" | wc -l | awk '{print $1}')
#echo "Found $COUNT images matching $KEYWORD"
if [ $COUNT -eq 0 ];
then
echo $OUT_DIR:"gooogle probably block me"
exit 0;
fi
j=1
cat "${OUT_DIR}/image_urls.txt" | while read LINE
do
wget -q -U Mozilla -nd -t 1 -T 5 -O "${OUT_DIR}/${KEYWORD}_${j}.jpg" "$LINE" -e robots=off

convert -resize '200x200' "${OUT_DIR}/${KEYWORD}_${j}.jpg" "${OUT_DIR}/${KEYWORD}_${j}.jpg"
(( j = j + 1 ))

done
fi


convert -size 640x260 gradient: "${OUT_DIR}/grad.jpg"
for ii in `seq 1 3`;
do
composite -compose Copy -geometry +$((10*(ii)+200*(ii-1)))+10 "${OUT_DIR}/${KEYWORD}_$ii.jpg" "${OUT_DIR}/grad.jpg" "${OUT_DIR}/grad.jpg"
rm "${OUT_DIR}/${KEYWORD}_$ii.jpg"
done

convert -background none -fill white -font $FONT -pointsize 18 -size 620x80 -gravity South caption:"$CAPTION" "${OUT_DIR}/caption.gif"
composite -gravity South "${OUT_DIR}/caption.gif" "${OUT_DIR}/grad.jpg" "${OUT_DIR}/$KEYWORD.jpg"
rm "${OUT_DIR}/grad.jpg"
rm "${OUT_DIR}/caption.gif"

done

exit 0


работает это следующим образом - создаете эти 2 скрипта в одной дириктории, у меня это ganki_root.sh и ganki.sh а также дирикторию (у меня это ganki)
далее
cd ganki
chmod a+x ../ganki_root.sh
../ganki_root.sh


ну а потом, уже когда карточки будут готовы, или гугл пошлет :), можно воспользоватся вот этой инструкцией
Медиа дека для Anki и создать деку для ганки (по аналогии)
хотя наверно даже большого скрипта писать не надо и достаточно из консоли написать один for и создать нужный файл (если вдруг понадобится, то напишу как :)
Вобще наверно логичнее не писать перевод в карточку, а добавлять текстом в деку.. (это так.. для разнообразия и практики с imagemagic)


большой респект человеку написавшим сей скрипт и сэкономившему мне кучу времени с работой google.com/images

четверг, 16 сентября 2010 г.

Медиа дека для Anki

этот мануал гораздо лучше, скрипт более гибкий и лаконичный
Итак .. немного вводная.
Anki программа для запоминания, Это Обычные карточки, но которые показываются по определенному алгоритму, и те карты которые сложно запомнить показываются чаще, которые легко реже.

Создавать деки можно самому, так и брать готовые с сайта.
Тема же сегоднешнего заняти, натырить картинок с тырнета и сделать из них красивую деку(набор карточек).
итак поехали
1. выберем жертв, в моем случае стали 2 сайта http://www.my-english-dictionary.com и www.pdictionary.com скачаем их через wget
$mkdir sites && cd sites
$wget -pdrc http://www.my-english-dictionary.com
$wget -pdrc www.pdictionary.com

2. Исследуем скачаные дириктории
2.1 в случае с pdictionary все просто , картинки лежат в папке images и носят названия того что на них изображено
$ls www.pdictionary.com/images/
a  b  c  d  e  f  g  h  i  j  k  l  m  misc  n  o  p  q  r  s  t  u  v  w  x  y  z
$ls www.pdictionary.com/images/z
zebra.gif  zero.gif  zigzag.gif  zipper.gif

2.2. c my-english-dictionary все гораздо интереснее
$ ls |head
eng100.htm
eng100.jpg
eng101.htm
eng101.jpg
eng102.htm
eng102.jpg
eng103.htm

тоесть на каждую картинку по отдельной страничке и с именем eng???.htm с картинкой eng???.jpg
слазив внутрь заметим что название картинок лежит в теге img с сылкой на наше изображение а имя картинки в атрибуте alt
$cat eng100.htm |grep 100.jpg
<img src = "eng100.jpg" alt= "drawer" border = 0>

Ну так как видно что все идет строго попарядку можно в цикле пройти по всем htm страничкам и переименовать файлы в вид name.jpg и положим их в папки result и result_small (кто его знает может thumbnail-ы тоже кому пригодятся)
$mkdir result&&mkdir result_small
$for i in `seq 1 408`;do NAME=`cat eng$i.htm|grep eng$i.jpg|sed 's|.*alt= "||g;s|".*||g'`;echo $NAME;cp eng$i.jpg result/$NAME.jpg;cp s-eng$i.jpg result_small/$NAME.jpg; done

итак.. мы получили картинки, но о боже.. большие картинки с большими черными подсказками :)

что же делать... "Доктор, нужно резать!"... да.. будем резать.. и резалку мы возьмем imagemagic, и резултат трудов положим еще в одну поддирикторию result
$mkdir result
$for i in *;do convert $i -crop 400x265+0+0 result/$i;done

можно посмотреть результат наших трудов - что все ок. ну и двинем дальше.
Насколько помнится мы загрузили изображения еще со 2го сайта, и внимательный телепат наверняка разглядел что изображения то там не jpg а gif - ну не будем портить всю малину через тот же image magic сконвертим их в jpg и двинем в текующую фотку где у нас уже есть изображения(перейдем в тот сайт и из дириктории image вфполним следующее
$cp */*.gif ../../www.my-english-dictionary.com/result/result/

это мы так скопировали, а теперь их переделаем в jpg (вернемся в ..../result/result и выполним вот это колдовство
$for i in *.gif;do convert $i ${i/gif/jpg};done

ну и избавимся от наших гифок

$rm *.gif

3. Самое интересное.. файлы у нас есть все называются как надо - осталось их загнать в деку анки. ну и конечно руками мы это делать не будем. что нам в конце концов - делать чтоль нечего
топаем на страничку http://ichi2.net/anki/wiki/FileImport которая нам рассказывает как можно создать файл вида
caption [tab] x-ray <img src="x-ray.jpg">[sound:x-ray.ogg]

левая часть это одна сторона карточки, а правая "Сюрприз!!!!" не только изображение но еще и произношение.
Я вспомнил про когда то скачаные словари для stardict с произношением, и подумал что вот он!, тот шанс :)... но на этом не остановился когда узнал что слов многих нету и на помощь пришел сайт http://www.answers.com который любезно согласился предоставить отсутствующие звуки.
упуская подробности (одной строкой выполнять все эти операции было тяжело) и я наваял небольшой скрптик, правда не отладил но главное работает
#!/bin/bash

DIRECTORY=/home/nikolay/sites/www.my-english-dictionary.com/result/result
EXTENSION=jpg
SOUND_EXTENSION="ogg mp3 wma wav"
SOUND_DIRS="(stardict|$DIRECTORY)"
SITE='http://www.answers.com'
OUT_MEDIA_DIR=$DIRECTORY/media
OUT_FILE=import

rm $OUT_FILE
if [ -d "$OUT_MEDIA_DIR" ];
then
rm -Rf "$OUT_MEDIA_DIR"
fi

mkdir "$OUT_MEDIA_DIR"


cd $DIRECTORY
for i in *$EXTENSION;
do
FULL_NAME=$i;
NAME="${i/.jpg/}";

SOUND_FILE_NAME=$(ls $NAME.*|egrep '(ogg|mp3|wma|wav)')
if [ -z "$SOUND_FILE_NAME" ];
then
for i in $SOUND_EXTENSION;
do
SOUND_FILE_PATH=$(locate "/$NAME.$i"|egrep "$SOUND_DIRS")

if [ -n "$SOUND_FILE_PATH" ];
then
SOUND_FILE_NAME=$NAME.$i
cp "$SOUND_FILE_PATH" "$SOUND_FILE_NAME"

break
fi
done
if [ -z "$SOUND_FILE_NAME" ];
then
#truing download from answer.com                            loca
wget -q $SITE/$NAME --output-document $NAME.tmp
SERVER_FILE_PATH=$(cat $NAME.tmp |grep playIt|grep wav|sed "s/.*playIt('//g;s/'.*//g"|sed q)
if [ -n "$SERVER_FILE_PATH" ];
then
wget -q $SERVER_FILE_PATH --output-document $NAME.wav
SOUND_FILE_NAME="$NAME.wav"
fi
rm $NAME.tmp
fi
fi
STRING="$NAME$(echo -e '\t')<img src=\"$FULL_NAME\">"
cp "$FULL_NAME" "$OUT_MEDIA_DIR/"
if [ -n "$SOUND_FILE_NAME" ];
then
STRING="$STRING[sound:$SOUND_FILE_NAME]"
cp "$SOUND_FILE_NAME" "$OUT_MEDIA_DIR"
fi
echo $STRING>>$OUT_FILE    
done;


эхх шит фокус с echo -e "\t" не удался.. придется подправить .. заменить все пробелы на таб
$ sed -i 's| |\t|' import


смысл в том что нужно поменять значение переменной DIRECTORY на то куда вы выложили файлы, SOUND_DIRS - это то где скрипт ищет произношение (не бязательно полный путь, так как идет все через grep)
ну и результат получаем файл import и папку media

открываем anki
жмем на create (name=mediadeck)
file->import выбираем наш файл "import"
saveas (mediadeck)
теперь нужно зайти в :~/.anki/decks
и создать там дирикторию mediadeck.media
$mkdir ~/.anki/decks/mediadeck.media

и копируем
$cp media/* /home/nikolay/.anki/decks/mediadeck.media/

после этого в анки нужно выполнить Tools>Advanced>Check Media DB (tag cards)

ну вот вобщем то и все.
Я понимаю что инструкция тяпляп. :) - поэтому если это действительно кому то еще понадобится - пишите письма :). постораюсь ответить (главная тут проблема что я не указывал из какой дириктории что делал, так что кофейная гущя вам в помощ)
а вот скриншот того что получилось (картинка и значек проигрывателя который произносит слово)


ну а это готовая дека, которая получилась, распаковать зип и импортировать shared.anki

воскресенье, 23 мая 2010 г.

Херотень с mdadm

Блин - ubuntu опять захавала мой неокрепший мозг.
как зодать soft raid можно лего найти - да и делать там особо нечего через cfdisk создать разделы. после этого
sudo mdadm --create /dev/md4 --chunk=64 --level=1 --raid-devices=2 /dev/sdc1 /dev/sdd1
ну и потом создать файловую систему
mkfs.ext4 /dev/md4

но вот засада что после ребута получаем красивую картину типа такой

init: ureadahead-other main process (1515) terminated with status 4
init: ureadahead-other main process (1538) terminated with status 4

ну и решение находится вот тут http://en.wikipedia.org/wiki/Mdadm
после создания нового архива, нужно добавить инфу в cat /etc/mdadm/mdadm.conf хотя в ней так красиво и написано

# This file was auto-generated on Tue, 18 May 2010 13:04:23 +0400
# by mkconf $Id$

короче для перманентных настроек сами херачим (простите за мою лирику, как глаза станут не такими красными, подправлю)

mdadm -Es | grep md4 >>/etc/mdadm/mdadm.conf

щас ребутнусь и посмотрю.

четверг, 20 мая 2010 г.

KVM ошибка сети

Вобщем появилась проблема, после установки машины, на машину коекак зайти можно по ssh, но вот с машины практически не пингуется не один адрес например на виндоусе это так

C:\Documents and Settings\Owner>ping -t 192.168.11.1

Pinging 192.168.11.1 with 32 bytes of data:

Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Reply from 192.168.11.1: bytes=32 time=738ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64
Reply from 192.168.11.1: bytes=32 time<1ms TTL=64

Ping statistics for 192.168.11.1:
Packets: Sent = 98, Received = 33, Lost = 65 (66% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 738ms, Average = 22ms
Control-C


тоесть ответы появляются - но когда то потом и не стабильно, с линуксом еще хуже

user@host:~> ping 192.168.11.1
PING 192.168.11.1 (192.168.11.1) 56(84) bytes of data.
From 192.168.11.172: icmp_seq=2 Destination Host Unreachable
From 192.168.11.172 icmp_seq=2 Destination Host Unreachable
From 192.168.11.172 icmp_seq=3 Destination Host Unreachable
From 192.168.11.172 icmp_seq=4 Destination Host Unreachable
From 192.168.11.172 icmp_seq=6 Destination Host Unreachable
From 192.168.11.172 icmp_seq=7 Destination Host Unreachable
From 192.168.11.172 icmp_seq=8 Destination Host Unreachable
^C
--- 192.168.11.1 ping statistics ---
8 packets transmitted, 0 received, +7 errors, 100% packet loss, time 7000ms
, pipe 3
user@host:~> sudo route -n
root's password:
sudo: route: command not found
user@host:~> sudo su
host:/home/user # route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.11.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 192.168.11.1 0.0.0.0 UG 0 0 0 eth0


как видно в таблице роутинга вроде все ок.

даже в ifconfig никакого криминала.
дело оказалось в дефолтном драйвере сети которы rtl8139 по умолчанию. И какого было мое удивление когда все залетало, после того как я поменял драйвер на pcnet

все по стандарту
sudo virsh

далее
edit machine_name

и правим секцию interface
    <interface type='bridge'>
      <mac address='52:54:00:54:f4:ba'/>
      <source bridge='br0'/>
      <target dev='vnet1'/>
      <model type='pcnet'/>
    </interface>

среда, 19 мая 2010 г.

После того как машина установлена по средствам virt-install например так

sudo virt-install -n neptune -r 4096 --disk path=/dev/disk/by-id/scsi-SATA_WDC_WD5002ABYS-_WD-WCASYC023333,bus=scsi -c /home/user/distr/openSUSE-11.2-DVD-x86_64.iso –accelerate –os-type=linux –os-variant=generic26 -v –vnc --vncport=59000 -w bridge:br0

случилось страшное :), намудрил с vnc, а также с cdrom, поэтому пришлось править все руками
после непродолжения гугления выяснилось что все очень просто
заходим в virsh
$ sudo virsh
внутри консоли virsh нам понадобятся следующие команды
dumpxml просмотр конфигурации домена (нашего бокса)
edit редактирование (происходит в текстовом редакторе vi)
destroy выключить бокс
start включить
Так как редактирование происходит в vim, то скажу и пару слов про него (сам привык к emacs или nano так что сам в нем не очень разбираюсь) но следующих команд должно хватить. Так же напомню что в режиме текстового редактора есть 2 режима 1- режим редактирования, когда все что мы вводим печатается в файл, и режим команд в котором мы вводим команды (например :q -выйти (доветочие и q - при вводте должно отобразится в нижнем левом углу). выход из режима ввода текста в режим команд - ^ (Esc)
h l k j - навигация по файлу (left right, line up, line down)
:q! - выход без сохранения
u - отмена (Undo)
:x - сохранить и выйти
i - режим вставки (ввод симоволов, как раз тот самый режим редактирования текста из которого выход по Esc)
o - вставить пустую строку под куросором и начать редактирование

Итак. у нас есть машина, к которой мы не можем получить доступ из за отсутствия VNC первое что мы делаем это смотрим нашу конфигурацию

virsh # dumpxml neptune
<domain type='kvm' id='9'>
  <name>neptune</name>
  <uuid>ef0e7de1-da7a-00d3-ab16-a8e054d2d779</uuid>
  <memory>4194304</memory>
  <currentMemory>4194304</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type arch='x86_64' machine='pc-0.12'>hvm</type>
    <boot dev='cdrom'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    <disk type='block' device='disk'>
      <driver name='qemu'/>
      <source dev='/dev/disk/by-id/scsi-SATA_WDC_WD5002ABYS-_WD-WCASYC049770'/>
      <target dev='sda' bus='scsi'/>
    </disk>
    <disk type='file' device='cdrom'>
      <source file='/home/user/distr/openSUSE-11.2-DVD-x86_64.iso'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
    </disk>
    <interface type='bridge'>
      <mac address='52:54:00:54:f4:ba'/>
      <source bridge='br0'/>
      <target dev='vnet0'/>
    </interface>
    <console type='pty' tty='/dev/pts/1'>
      <source path='/dev/pts/1'/>
      <target port='0'/>
    </console>
    <console type='pty' tty='/dev/pts/1'>
      <source path='/dev/pts/1'/>
      <target port='0'/>
    </console>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='5910' autoport='no'/>
    <video>
      <model type='cirrus' vram='9216' heads='1'/>
    </video>
  </devices>
  <seclabel type='dynamic' model='apparmor'>
    <label>libvirt-ef0e7de1-da7a-00d3-ab16-a8e054d2d779</label>
    <imagelabel>libvirt-ef0e7de1-da7a-00d3-ab16-a8e054d2d779</imagelabel>
  </seclabel>
</domain>



в данном случае, то что выделено жирным шрифтом. скорее всего либо отсутствует, либо с другими значениями, если привести к такому виду, то у нас запустится vnc на порту 5910 и примаунтится CD-Rom и будет по умолчанию грузится с CD-Rom а не с жесткого диска

после того как сделали все изменения, остается только перезапустить машину (destroy, start) и создать тунель :) (потому как если дело обстаит на локальной машине, то наверняка на ней есть иксы, и легче использовать virt-manager и в графической оболочке сделать все тоже самое, если не быстрее то как минимум с той же скоростью :)

ssh user@server_adress -L 5910:localhost:5901

после этого можно конектится на локальной машине к 5901 и получить доступ к удаленному vnc на 5910-м порту

вторник, 18 мая 2010 г.

Ubuntu softraid initramfs fail

3 дня я трахался с этим soft raid сначала с fakeraid intel (убунту его не смогла увидеть) но так как винду я пользовать не буду, так что в моем случае softraid - это тоже самое :).
Но проблема была в том, что после инстала меня выкидывала в initramfs с ошибкой типа
mounting /dev on /root/dev failed
или
mount: mounting /dev/disk/by-uuid/ on /root/ failed: Invalid argument
после долгого гугления наконецто нашел решение, заключается в том что нужно осставить неразмеченой области >3 Gb и проблема встречается только с винтами в 500Gb, с 250 и 750 должно быть все ОК.