Create a file with newline symbol in Linux

If for some reasons one needs to create a file with UTF symbols in filename, the following command helps:

touch new$'\n'file.txt

20140721_155556

Or you can simply rename existing file:

mv goodfile.txt bad$'\n'file.txt
mv goodfile.txt $'bad\nfile.txt'

20140721_155921

Hope this helps 🙂

Размещение фотографий по дате съёмки с помощью Imagemagick и Bash

#!/bin/bash
# Goes through all jpeg files in current directory, grabs date from each
# and sorts them into subdirectories according to the date
# Creates subdirectories corresponding to the dates as necessary.
# Moves mov files by file creation date.

# sudo apt-get install imagemagick
for fil in *.JPG
do
    datepath="$(identify -verbose $fil | grep DateTimeOri | awk '{print $2 }' | sed s%:%%g)"
    if ! test -e "$datepath"; then
        mkdir -pv "$datepath"
    fi

    mv -v $fil $datepath
done

for mov in *.MOV
do
    datepath="$(stat $mov | grep Modify | awk '{print $2}' | sed s%-%%g)"
    if ! test -e "$datepath"; then
        mkdir -pv "$datepath"
    fi

    mv -v $mov $datepath
done

Credits: linuxjournal

Узнай, кто из друзей Вконтакте пользуется Twitter

Решил на досуге проверить, кто из друзей Вконтакте пользуется Twitter.

Вконтакте очень не любят, когда пользователи уходят покидают их сайт, поэтому не особо любят постинг статусов из других сервисов (частенько прикрывают пути постинга статусов twitter->vk), зато в обратную сторону – пожалуйста, пользуйтесь на здоровье.

Предположение: пользователь забрасывает вконтактик, пишет себе в профиль линк на свой акк в Twitter и уходит туда с головой. Статусы во вконтактике больше не пишет.

Задача: проверить, кто из друзей вконакте указал у себя в профиле линк на Twitter.

Реализация.
Вконтакте очень гордятся своей русскоязычной капчей, обычным wget-ом слить странички друзей и распарсить не получилось, пошёл в обход таким способом:

  1. получить список друзей;
  2. сгенерить тесты Selenium, открывающие страницы друзей и ищущих слово “Twitter”;
  3. пройтись по тестам.

Итак,

  1. Список друзей я получаю через userapi с помощью самопального приложения – жму кнопку “Войти в контакте” и потом сохраняю в текстовый файл friends.
  2. Далее с помощью bash-скрипта (лёгкий sed и while по друзьям) генерирую Selenium-тесты.
  3. #!/bin/bash
    while read vkfile; do
            out=`echo $vkfile | sed -e "s/http:\/\/vkontakte.ru\///g"`;
            export abc="
    <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n<head profile=\"http://selenium-ide.openqa.org/profiles/test-case\">\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n<link rel=\"selenium.base\" href=\"localhost\" />\n<title>$out</title>\n</head>\n<body>\n<table cellpadding=\"1\" cellspacing=\"1\" border=\"1\">\n<thead>\n<tr><td rowspan=\"1\" colspan=\"3\">$out</td></tr>\n</thead><tbody>\n<tr>\n        <td>open</td>\n        <td>$vkfile</td>\n        <td></td>\n</tr>\n<tr>\n        <td>click</td>\n        <td>link=показать подробную информацию</td>\n        <td></td>\n</tr>\n<tr>\n        <td>verifyTextPresent</td>\n        <td>twitter</td>\n        <td></td>\n</tr>\n</tbody></table>\n</body>\n</html>\n";
            echo $abc > $out;
    done < friends
    

    Для тех пользователей, которые установили у себя в профиле “не скрывать подробную информацию” тесты почти такие же:

    #!/bin/bash
    while read vkfile; do
            out=`echo $vkfile | sed -e "s/http:\/\/vkontakte.ru\///g"`;
            export abc="
    <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n<head profile=\"http://selenium-ide.openqa.org/profiles/test-case\">\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n<link rel=\"selenium.base\" href=\"localhost\" />\n<title>$out</title>\n</head>\n<body>\n<table cellpadding=\"1\" cellspacing=\"1\" border=\"1\">\n<thead>\n<tr><td rowspan=\"1\" colspan=\"3\">$out</td></tr>\n</thead><tbody>\n<tr>\n        <td>open</td>\n        <td>$vkfile</td>\n        <td></td>\n</tr>\n<tr>\n        <td>verifyTextPresent</td>\n        <td>twitter</td>\n        <td></td>\n</tr>\n</tbody></table>\n</body>\n</html>\n";
            echo $abc > $out;
    done < friends
    
  4. Прохожу 2 раза этими тестами (для пользователей у которых надо нажимать на кнопку “Показать подробную информацию” и для тех, у кого не надо).
  5. Добавляю все сгенерированные тесты в testSuite и жму кнопку “Play entire test suite”. Скорость ставлю низкую, чтоб не забанили и не было проблем с капчей. Картинки в Firefox отключаю.

    Получаю в окошке Selenium подсвеченные зелёным цветом строчки тех юзеров, кто обмолвился словечком “Twitter” у себя в профиле.

Из 369 моих друзей на 8 страницах было найдено слово “Twitter”, из этих восьми 5 человек (1,35% от всех друзей) – указали свои профили, остальные три – профили в подписках. Предположение, можно считать верным 🙂

Все исходники в одном zip.

Словари для переводчика Android ColorDict


Warning: Trying to access array offset on value of type bool in /var/www/sandalov.org/blog/wp-content/themes/mantra/includes/theme-loop.php on line 249

Статья рассказывает, как сделать словари для переводчика Android ColorDict.

ColorDict

ColorDict

В целом, необходимо:

  1. Получить словарь в декомпилированном виде (DSL)
  2. Преобразовать DSL в формат Stardict
  3. Положить его на SD-карту в папку /sdcard/dictdata/

DSL словарь можно получить, скачав его прямо в таком виде, либо конвертировать из LSD. Под Windows можно воспользоваться программой DslComp (уже пропатчена как надо); под Linux существует makedict в составе проекта XDXF. (Идём на сайт XDXF – XML Dictionary Exchange Format, скачиваем makedict-***.tar.bz2, распаковываем, configure, make и в подкаталоге src получаем исполняемый файл makedict. Предварительно потребуется установить компилятор gcc-c++ со всеми необходимыми зависимостями). В репозиториях Ubuntu makedict найти не удалось, исходники компилятся с кучей ошибок. Намучавшись с ошибками скачал нашёл пакет в RPM и с помощью alien сконвертировал его в deb. Запускаем makedict:

Windows: Запускаем DslComp, выбираем LSD, и ставим переключатель в “DSL (Исходные тексты)”.

Linux:

makedict -i dsl -o stardict *.dsl
for f in ./*/*; do mv $f ./; done

На выходе получаем три файла:
dictionary_name.dict – собственно, словарь.
dictionary_name.idx – индекс.
dictionary_name.ifo – описание.

Словарь можно сжать утилитой dictzip, чтобы уменьшить размер словаря. В результате получим файл с расширением .dict.dz.
Индекс тоже можно сжать обычным gzip’ом.

В просторах Инета можно найти и такой bash-script:

#!/bin/bash
PATH_DSL=$1
PATH_CUR=`pwd`
mkdir $PATH_CUR/stardict
mkdir -p $PATH_CUR/tmp/tmp
for i in $(ls $PATH_DSL | grep dsl$); do \
cp $1/*.ann ./tmp && \
iconv -f utf16 -t utf8 $PATH_DSL/$i | sed -r 's/\[s\].+\.wav\[\/s\]//' >$PATH_CUR/tmp/$i.utf8 && \
iconv -f utf8 -t utf16 $PATH_CUR/tmp/$i.utf8 > $PATH_CUR/tmp/$i && \
rm -f $PATH_CUR/tmp/$i.utf8 && \
makedict -i dsl -o stardict $PATH_CUR/tmp/$i -d ./tmp/tmp; done
find $PATH_CUR/tmp/tmp -iname "*.*" \! -type d -exec mv \{\} $PATH_CUR/stardict/ \;
for i in $(ls $PATH_CUR/stardict | grep dict$); do dictzip $PATH_CUR/stardict/$i; done
for i in $(ls $PATH_CUR/stardict | grep idx$); do gzip -9  $PATH_CUR/stardict/$i; done
rm -R $PATH_CUR/tmp
echo "Done"

Если у нас файл от лингво, то срезаем начальные строки служебной инфы. Должно начинаться с тела самого словаря.

Выкладываю сюда Русско-Финские (FiRuFi) словари для ColorDict преобразованные из DSL в формат StarDict:
Маленький, но хороший – тут [878K]
Большой, но корявый – тут [21M]

Скачивание песен vkontakte на Linux


Warning: Trying to access array offset on value of type bool in /var/www/sandalov.org/blog/wp-content/themes/mantra/includes/theme-loop.php on line 249

С помощью regexp можно просто скачнуть все песни: сохраняете страничку audio в текстовый файл и проходитесь по нему:

cat vk | grep -P -o  "http://cs.+?\.mp3" | xargs -tl -I _ wget _

Иногда бывает так, что песня в контакте называется правильно, а вот тег совершенно неправильный. Выход один – брать названия у Дурова.

Для этого написал на досуге маленький bash-скриптик script.sh упрощающий массовое скачивание песен из контакта.

script.sh:

#!/bin/bash
cat audio.html | egrep "mp3|title_wrap" > rename.sh
chmod 777 rename.sh
vim -s vk.sh
wget -i download.lst
sh rename.sh
rm rename.sh
rm download.lst

Рядом со скриптом лежит скрипт vk.sh для текстового редактора vim, который парсит страницу, получая названия песен и ссылки на них.

vk.sh:

:e ++enc=cp1251 rename.sh
:%s/\.mp3,.*/\.mp3/g
:%norm jdd
:%s/.*"\ value="//g
:norm Gdd
:w! download.lst
:norm uuu
:%s/^.*audio\///g
:%s/\ <\/span><span\ class="user">.*//g
:%s/^.*');\ return\ false">//g
:%s/<\/a><\/b>\ -\ <span\ class="title">/\ -\ /g
:%s/<a href=""\ onclick="Audio.showLyrics('.*;">//g
:%s/<\/a>//g
:%s/"/'/g
:%s/\//\ /g
:%s/?/\ /g
:%s/</\ /g
:%s/>/\ /g
:%s/\\/\ /g
:%s/\:/\ /g
:%s/*/\ /g
:%s/|/\ /g
:%s/mp3.*\n/mp3\ "/g
:%s/^/mv\ /g
:%s/\n/\.mp3"\r/g
:%s/\ -\ $//
:%s/&amp;/\&/g
:%s/"\ /"/g
:%s/"\ /"/g
:%s/\ .mp3"/.mp3"/g
:%s/\ .mp3"/.mp3"/g
:%s/\ \ -/\ -/g
:%s/\ \ -/\ -/g
:%s/-\ \ /-\ /g
:%s/-\ \ /-\ /g
:norm Gdddddd
:w! ++enc=utf-8 rename.sh
:q!

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

Ubuntu:

sudo aptitude install vim

Процедура скачивания:

  1. Сначала необходимо зайти через браузер на страницу с нужными песнями (к примеру сюда: http://vkontakte.ru/audio.php) и сохранить её как html-файлик: audio.php.html
  2. Положить рядом с audio.php.html файл script.sh и vk.sh
  3. Запустить скрипт
    $ sh script.sh
    

UPD: Скачал файл audio.php.html с утра, вечером хотел запустить скрипт на скачку. Ссылки оказались недействительными. Видимо контакт меняет ссылки на файлы через какие-то промежутки времени. Т.о. скрипт стоит запускать сразу же после скачивания audio.php.html, чтоб не было ошибок 404.

UPD2: Скрипт подправил: теперь правильно отображается “&”, подчистил пробелы, а также – да(!), UNIX/WIN не любят “/” в названиях файлов/папок :).

Также, юзеры вконтакте взрослеют и уже освоили копипаст Unicode символов, по типу:

♥♡♥♡♥ Дима Билан ♥♡♥♡♥ - ♥♡♥♡♥ Ты, только ты ♥♡♥♡♥
☭☭☭ Гражданская оборона ☮☮☮ -  У войны не женское лицо

Такую штуку придётся вычищать руками. 🙂 (Всю таблицу как-то неохота в vim скрипт кидать)

20110812: Поправил в связи с новыми поправками Vk.