четверг, 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 должно быть все ОК.

понедельник, 3 августа 2009 г.

Vkontakte Music Thief

Вот и вышла наконецто первая бета плагина для rhythmbox. Теперь можно слушать музыку прямо с сайта vkontakte.ru, не скачивая на компьютер, хотя эту фичу в будущем обязательно приделаю.
Доступны все полезности от ритмбокса, можно рандомно слушать список, смотреть тексты песен, через плагин lyrics, обложки альбома, в будущем также постораюсь сделать поиск поп песням вконтакта. чтоб так же с плеера была возможность добавить их в онлайн либо скачать на компутер.


скачать можно от сюда

вторник, 30 июня 2009 г.

Ubuntu PAE (8Gb памяти на 32битах)

ДЛя начала, как уже подметили в коментах если у вас 9.10 или выше, то эта инструкция не для вас, готовое ядро уже имеется в репазитории (linux-generic-pae - Complete Generic Linux kernel), если только вы не решили набраться практики в сборке ядра :)

итак.. для того чтоб заработала 32х битная убунту с 8ю гигами оперативки надобно пересобрать ядро
не будем изобретать велосипед, а возьмем хорошеньки мануал в руки типа этого
Первоначально, ну или в конце, нужно включить эту опцию (PAE или AHCI или может memory remapping) в биосе. далее топаем в терминал, переключаемся на рута и начинаем

sudo su


cтавим необходимые пакеты

apt-get install kernel-package libncurses5-dev fakeroot wget bzip2


далее идем в /usr/src/ качаем исходники ядра ot сюда и разархивируем

cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.tar.bz2
tar xjf linux-2.6.30.tar.bz2
ln -s linux-2.6.30 linux
cd linux


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

cp /boot/config-`uname -r` ./.config


Ну и запустим прогу для конфигурирования

make menuconfig


получаем такую красоту

Жимкаем на Load...blablabla - говорим что хотим загрузить файл

нажимаем OK и идем дальше
если быть точнее в меню "Processor type and фичас" жимкаем на выделенное меню с памятью

и выбираем 64Gb

получается вот такая красота с PAE bla-bla-bla вобщем то что нужно

далее жмем на Exit пока не предложит сохранить, жмем на Yes и выходим

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

make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers


и проинсталлировать его, идем на уровень выше и смотрим что же у нас тут такое

cd /usr/src
ls -l


у меня появилось 2 пакета linux-headers-2.6.30-custom_2.6.30-custom-10.00.Custom_i386.deb и
linux-image-2.6.30-custom_2.6.30-custom-10.00.Custom_i386.deb вот их то и поставим

dpkg -i linux-headers-2.6.30-custom_2.6.30-custom-10.00.Custom_i386.deb
dpkg -i linux-image-2.6.30-custom_2.6.30-custom-10.00.Custom_i386.deb


осталось внести маленький штрих (посмотреть наш загрузчик)

gedit /boot/grub/menu.lst


у меня появилась вот такая вот чтука под новое ядро.. что и требовалось (если нет, то надо руками добавить)
title Ubuntu 8.10, kernel 2.6.30-custom
root (hd0,5)
kernel /boot/vmlinuz-2.6.30-custom root=UUID=43094c34-8fe5-41f3-8f8b-d741338311e1 ro quiet splash
initrd /boot/initrd.img-2.6.30-custom
quiet

title Ubuntu 8.10, kernel 2.6.30-custom (recovery mode)
root (hd0,5)
kernel /boot/vmlinuz-2.6.30-custom root=UUID=43094c34-8fe5-41f3-8f8b-d741338311e1 ro single
initrd /boot/initrd.img-2.6.30-custom