понедельник, 7 декабря 2009 г.

Установка индивидуальных deb пакетов с автоматическим удовлетворением зависимостей

Ситуация:
Из источников, близких к сомнительных, нам достался deb пакет (например Skype, Opera, MySQL Workbench ...). Возникает желание поставить его быстро, а не заниматься удовлетворением зависимостей.

Как выяснилось, все очень просто:

dpkg -i имя_пакета.deb || apt-get -f install

или с sudo:

sudo dpkg -i имя_пакета.deb || sudo apt-get -f install

Теперь о том, что здесь происходит.
Оказывается dpkg -i сначала распаковывает пакет и регистрирует его в системе, и лишь потом проверяет удовлетворены ли все зависимости этого пакета. Получается, что пакет уже как бы установлен но в состоянии "not fully installed or removed" как отзывается о нем apt-get.

Ключ -f для apt-get говорит о том, что apt-get'у надо поправить все несуразности в базе пакетов т.е. установит все, что недоустановлено и удалить то, что недоудалено.

P.S. А самое удивительное во всей этой истории то, что до этого метода я додумался только сейчас!

понедельник, 2 ноября 2009 г.

Навигация по видео презентации

Недавно понадобилось представить свою разработку (и немного попиарить Linux). Захотелось произвести впечатление, поэтому нарисовал презенташку в Blender на выходе, разумеется получился видео ролик. Встал интересный вопрос о переходах между логическими частями фильма (читать слайдами). Ниже привожу один из способов.

В моем распоряжении был ноутбук с KDE4, последним я и воспользовался точнее многогранным плазмоидом Folder View.

Я хотел получить следующее:
Миниатюры слайдов расположенные в порядке следования.
При нажатии на миниатюру плеер переходит на соответствующее место.
Возможность вызвать список миниатюр не нарушая работы плеера.

Для простоты добавим еще один активити, а по центру разместим плазмоид Folder View. В настройках Folder View укажем для показа папку ~/presentation/control/ (имя не важно, но я назвал ее так) в ней будут находится desktop файлы, управляющие плеером. В еще одной папке ~/presentation/pic/ позже поместим кадры из ролика, соответствующие разделам.

Должно получится следующее:

#Папка с desktop файлами для Folder View
~/presentation/control/

#Папка с иконками для desktop файлов
~/presentation/pic/

#Скрипт для управления плеером
~/presentation/setslide

#Собственно презентация
~/presentation/presentation.avi

Код скрипта (~/presentation/setslide) для управления плеером:

#! /bin/bash

#Плеер я выбрал dragon потому, что им можно управлять через dbus
#но постоянного адреса на dbus у него нет поэтому здесь получаю текущий
DRAGON=`qdbus | grep dragonplayer`


#Прошлая инструкция сработает только в случае если плеер уже был запущен
#запускаем его если прошлый шаг не удался и снова пробуем получит адрес
if [ -z $DRAGON ]
then
dragon ~/presentation/presentation.avi &
sleep 2
DRAGON=`qdbus | grep dragonplayer`
fi

#Перематываеи видео в плеере до нужного момента
#позицию передаем как аргумент
qdbus $DRAGON /Player org.freedesktop.MediaPlayer.PositionSet $1

#после перемотки плеер автоматически становится на паузу
#если мы хотим продолжение воспроизведения нужно раскомментировать строчку ниже
## qdbus $DRAGON /Player org.freedesktop.MediaPlayer.Play

#Разворачиваем плеер на полный экран
qdbus $DRAGON /dragonplayer/MainWindow_1/actions/fullscreen com.trolltech.Qt.QAction.setOn true



Заполним Folder View слайдами.
В папке ~/presentation/control/ нужно создать desktop файлы в количестве "слайдов" презентации.

Содержимое desktop файла:

[Desktop Entry]
Exec=~/presentation/setslide XXXXXXXX
Icon=/home/user/presentation/pic/X.png
Type=Application
StartupNotify=false



Где XXXXXXXX - это позиция на которую нужно перевести плеер. Что бы узнать это число нужно перейти в dragon на нужную позицию, поставить его на паузу и выполнить команду в консоли:

qdbus `qdbus | grep org.mpris.dragon` /Player org.freedesktop.MediaPlayer.PositionGet


Имена desktop файлов должны соответствовать именам разделов, в моем случае получилось так:

~/presentation/control/Linux
~/presentation/control/Виртуализация
~/presentation/control/Вредоносное ПО
~/presentation/control/Вредоносное ПО в Linux
~/presentation/control/Все равнозначны
~/presentation/control/Начало
~/presentation/control/Не все приложения под Linux
~/presentation/control/Отвлекающие приложения
~/presentation/control/Отсутствие центрального управления
~/presentation/control/Режим киоска
~/presentation/control/Упрощенная оболочка
~/presentation/control/Централизованное управление

Теперь назначим иконки desktop файлам.
Иконки могут быть любыми. Я сделал скриншоты основных моментов каждой части, изменил их размер до 256x256 (это не обязательно) и сохранил в папку ~/presentation/pic/ под номерами в последовательности следования слайдов т.е. 1.png, 2.png, ... 12.png. В соответствующем desktop файле нужно установить значение Icon на соответсвующий файл картинки.
Здесь поджидает неприятность. Иконки в Folder View не будут обновляться. Правится это удалением файлов:

~/.kde/cache-spider/kpc/kde-icon-cache.data
~/.kde/cache-spider/kpc/kde-icon-cache.index

Они отвечают за кеширование иконок в KDE4, эти файлы пересоздадутся автоматически, поэтому удалять их следует после того как будет закончено изменение всех иконок в desktop файлах.

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


Правильная последовательность настраивается методом перетаскивания иконок в Folder View на нужные места. Нужно заблокировать позиции иконок в настройках Folder View иначе они будут перемешиваться при обновлении и изменении размера плазмоида.

Что бы "красиво" переключать "слайды" во время презентации нужно назначить горячую клавишу для вызова "Show dashboard" в настройках горячих клавиш Plasma. Это значит, что все плазмоиды будут временно показаны поверх всех окон, в данном случае поверх плеера.

Выглядит это так:


Ну и на последок вот презентация, которую я показывал:

Presentation of Linux (and some custom made software) for classrooms from dik123 on Vimeo.


На странице vimeo размер картинки побольше.

И для владельцев смартфонов, которые обычно умеют играть исключитьно YouTube, тоже самое в доступном виде:

или на странице YouTube.

среда, 25 марта 2009 г.

Как скачивать/сохранять Flash видео при помощи KDE4

Для новых версий Flash можно воспользоваться методом описанным здесь:
http://dik123.blogspot.com/2011/11/youtube-vimeo-flash.html



К сожалению все описанное ниже не работает с новыми версиями Flash!


Идея не моя, оригинал здесь
http://jarlesdraw-log.blogspot.com/2009/03/save-flash-videos-in-kde-42.html
Но прочитать ниже изложенное стоит!

Для тех кто не любит ходить по ссылкам рассказываю в двух словах.
Adobe Flash плеер последних версий кеширует (читать сохраняет) просматриваемые видео файлы в директорию /tmp.
Вывод: для того, что бы сохранить ролик нужно просто скопировать его из директории /tmp куда-нибудь в /home/... .
Теперь про KDE. Плазмоид "Folder View" умеет фильтровать отображаемые файлы по типу. По ссылке предлагается поставить много галочек на типах видео файлов в настройках плазмоида, и этот метод работает, например для youtube, но не для большинства других подобных сервисов, например vimeo.
Что бы способ заработал для ЛЮБЫХ видео проигрывающихся во Flash в настройках плазмоида на вкладке "Filter" нужно выбрать все типы фалов (кнопка Select All) и в поле "File name pattern" вписать "Flash*" без кавычек. Этот метод работает, потому что все имена файлов видео роликов, которые кеширует Flash, начинаются с "Flash*", возможно это поведение изменится в одной из будущих версий, но пока работает отлично!

Метод из статьи работает избирательно, потому что Flash плеер способен проигрывать много форматов видео, к сожалению больше чем знает KDE, а поток сохраняется, конечно же оригинальный.

суббота, 21 февраля 2009 г.

Из HTML в PDF

Относительно недавно мне понадобилось сгенерировать PDF с большим количеством страниц. Генерировать нужно было из формата основанного на XML с небольшими вкраплениями обычных HTML тегов.
Первая мысль была перевести все файлы в один большой HTML и распечатать в PDF из браузера. Идея показалась мне простой и быстрой в исполнении. Перевод в HTML прошел относительно легко, не большой, быстро написанный скрипт на Python (и отточенные временем модули для работы с "форматом") спокойно cправились с задачей. На выходе 15 мегабайт HTML кода, плюс несколько сотен картинок "подключенных" через тег <img>. FireFox, нормально открыл эту страницу, а вот с печатью не задалось, просто завис. Konqueror - схожий результат.
Первая идея провалилась, вернее вторая ее часть связанная с печатью из браузера. В итоге я остался с большим HTML, который нужно было перевести в PDF.
Идея номер два заключалась в использовании программы, которая получит на вход мою большую HTML и выдаст мне PDF. Требования к кандитату: открыта, бесплатна, поддерживает CSS, поддерживает русский язык, умеет работать с большими файлами, генерирует содержание (если бы вариант с брузером сработал, то выходной файл был бы без содержания, что не хорошо). Поиски были долгими и неутешительными, я уже начал поглядывать в сторону FOP или ReportLab, когда случайно на форуме, на который попал с третей страницы google увидел ссылку на (внимание!) www.htmltopdf.org :)
Предвкушая увидеть очередной web сервис, перешел по ссылке. И меня ждал приятный сюрприз. Нет web сервис там все таки есть, но только как демонстрация возможностей модуля python под названием Pisa. Прямо на главной странице сайта написано, что это то что мне нужно, и мои поиски окончены, осталась мелочь, попытаться воспользоваться. В моем распоряжении была Ubuntu не первой свежести, поэтому внимательно ознакомившись с отсутствием пакетов в репозитарии, было принято естественное решение, скачать и собрать все что нужно. Сборка подробно описана к каждому модулю от которого зависит Pisa и в моем случае прошла гладко. Еще один приятный сюрприз, в комплект Pisa входит консольная программа xhtml2pdf. Воспользоваться ей можно следующим образом:

xhtml2pdf -w -d --encoding utf8 -s document.html

-w -d — Это предупреждения (warnings) и отладочная информация (debug) соответственно, если есть уверенность что HTML идеально сверстан для Pisa, можно эти параметры опустить, в противном случае очень полезно их оставить.

--encoding utf8 — В этой кодировке должен быть HTML. Из документации я понял, что это не обязательный параметр, но как выяснилось, не в моем случае.

-s document.html — Собственно документ для трансформации в PDF.

В качестве результата работы, будет создан файл document.pdf.

На этом, как мне казалось, предел мечтаний достигнут, нужно, лишь скормить выше упомянутой программе выше описанный HTML файл. Но, как я часто замечаю, вокруг многие пишут и читают по русски, а главное, что к этому окружению относятся люди, которым предназначен этот документ. В общем приключения не закончились. Дело в том, что тестовый документ (небольшой фрагмент оригинального файла) благополучно перевелся в PDF, но за место русских букв присутствовали лишь черные прямоугольники. Выход из ситуации, подключить шрифты с русскими буквами. В Pisa настройки документа задаются через CSS. Для встраивания шрифтов нужно прописать в начало документа конструкцию:

<style>
@font-face {
font-family: Verdana;
src: url(verdana.ttf);
}

html {
font-family: Verdana;
font-size: 11pt;
}
</style>


Здесь несколько замечаний.
Во первых, путь до файла шрифта должен быть задан относительно текущего пути. В данном случае файл verdana.ttf находится в той же директории, что и document.html. Возможно задание полного пути так же разрешено, я не проверял. Если файл не найден появится сообщение (если был запущен с аргументом -w ). Для тех кто не знает, в большинстве дистрибутивов Linux файлы шрифтов находятся в каталоге /usr/share/fonts/.
Во вторых, для шрифтов с разным начертанием (жирный, курсив) нужны разные файлы и отдельные описания. Это выглядит так:

/*Обычный шрифт*/
@font-face {
font-family: Verdana;
src: url(verdana.ttf);
}

/*Жирный шрифт*/
@font-face {
font-family: Verdana;
src: url(verdana_bold.ttf);
font-weight: bold;
}


Теперь, если в HTML текст помечен жирным через CSS он будет отображен как жирный. Если font-face c параметром font-weight: bold и указанием корректного файла шрифта не описывать, текст помечен не будет, а выведется обычным шрифтом. То же относится и к курсиву.
В третьих, мне не удалось вставить в документ шрифт FreeSerif, точнее трансформация прошла гладко и выходной документ замечательно отобразился в Okular. Однако при переносе на другую систему и просмотре при помощи Adobe Reader, на месте FreeSerif оказались невразумительный крякозябры.

После разрешения всех недоразумений с русским языком и шрифтами, была предпринята попытка конвертировать весь документ, но после нескольких минут работы программы выдала ошибку и остановилась. Точный текст сообщение сейчас не воспроизведу, но в нем говорилось что-то наподобие "не могу вычислить размер картинки". Эта проблема решилась добавлением в конец СSS строчк.

img {
font-family: Sans
}


Видимо, что-то пошло не так при подключении сторонних шрифтов, а начертание Sans в моем документе нигде не прописано, поэтому к картинкам параметры шрифтов применялись встроенные. Возможно эта ошибка исправлена в новой версии.
Ниже приведу пример HTML документа целиком:

<html>
<head>
<style>

@page {
size: a4;
margin: 1.5cm;
}

@font-face {
font-family: Verdana;
src: url(verdana.ttf);
}

@font-face {
font-family: Verdana;
src: url(verdana_bold.ttf);
font-weight: bold;
}

html {
font-family: Verdana;
font-size: 11pt;
}

img {
font-family: Sans;
}
</style>
</head>
<body>
<h1>
Заголовок, который будет показан в содержании</h1>
<div>
Обычный текст</div>
<div style="font-weight: bold">
Жирный текст</div>
</body>
</html>


Вновь вернувшись к экспериментам с маленькими документами, заметил еще одну неприятность. Картинки в формате JPEG смотрелись более-менее сносно, но те, что были в GIF, мягко говоря, выглядели ужасно. Линии толщиной в один — два пикселя в большинстве случаев просто исчезли, буквы и цифры угадывались с трудом, Фон многих GIFов стал черными или розовыми.
Для начало займемся лечением фона GIFов. Проблема в том, что Pisa не обрабатывает прозрачность картинок, выход - изменить цвет прозрачности всех GIF на белый. Для этого воспользуемся программой convert из состава ImageMagick.

convert -background white -transparent-color white file.gif file.gif

-background white - Изменяет цвет фона на белый (возможно этот параметр вообще не нужен в данном случае)

-transparent-color white - Изменяет цвеи прозрачности на белый.

file.gif file.gif - Файл для преобразования и файл в который будет записан результат. Здесь это один и тот же файл.

Теперь по поводу исчезновения тонких линий. В JPEG такой проблемы не наблюдается, значит нужно перевести все GIF в JPEG. Делается это все той же командой convert.

convert file.gif file.jpg

Так как файлов GIF много, воспользуемся следующим скриптом:

for i in `find . -name *.gif`;
do
echo "Convert image:" $i
convert -background white -transparent-color white $i $i
convert $i $i.jpg
done


Запускать его нужно в том каталоге где хранятся картинки. По окончанию работы к каждому файлу с расширением ".gif" будет создан файл в формате JPEG c расширением ".gif.jpg".
Теперь нужно исправить ссылки на картинки в HTML документе.

sed -i -r s/.gif\([\"\']\)/.gif.jpg\\1/g document.html

Вот и казалось бы все. Выполняем:

xhtml2pdf -w -d --encoding utf8 -s document.html

И ... ждем, ждем ... ждем ... ждем. Напомню, HTML файл получился около 15 мегабайт, Pisa, как это сейчас модно, загружает все в оперативную память, а Python никогда не отличался экономией, мои 2 гигабайта исчерпались довольно быстро и в дело пошел swap. Компьютер проработал всю ночь, но так и не закончил. Пришлось менять стратегию, я переписал свой скрипт так, что вместо одного большого HTML файла он генерирует много маленьких. Это дало крайне положительный эффект, через десять минут в моем распоряжении было множество PDF файлов. И опять осталась мелочь, объединить все файлы в один. Первое, что я попробовал - pdftk, он довольно шустро объединил все в один документ, но при этом не сохранил содержание, которое Pisa генерирует из тегов <h1> - <h6>, а так как в PDF документе получилось около 5800 страниц, без содержания он смотрелся грустно. Выход из ситуации, воспользоваться программой JoinPDF, она написана на Java, очень проста в использовании, работает на удивление быстро, а главное объединяет содержание всех входных PDF файлов. Воспользоваться ей можно так:

joinpdf result.pdf *.pdf

Выходной файл задается первым. Для того, что бы конструкция работала корректно именовать PDF файлы нужно так: doc001.pdf, doc002.pdf, doc003.pdf ... doc100.pdf Здесь важны последние цифры, если файлов меньше 100 то достаточно два знака в номере: doc01.pdf, doc02.pdf, doc03.pdf ... doc99.pdf. Нули перед цифрой важны, иначе файлы объединятся в порядке отличном от ожидаемого. Вместо doc может быть все что угодно. Если файлов не очень много можно выполнить команду так:

joinpdf result.pdf first.pdf second.pdf third.pdf

P.S. Pisa и ImageMagick могут работать и под Linux и под Windows, но без нормального shell на последней, выполнять описанные действия менее удобно. Хотя и медленный cygwin никто не отменял.

P.P.S Прочитав комментарии (спасибо за комментарии!) и перечитав написанное выше, я понял, что плохо раскрыл уровень поддержки CSS в Pisa (xhtml2pdf), лишь вскользь упомянул что: "если есть уверенность, что HTML идеально сверстан для Pisa". А дело в том, что Pisa - это не современный браузер и даже не очень старый браузер ... это вообще не браузер и PDF на выходе может радикально отличаться от того, что показывает те же FireFox, Opera, IE и т.д. Нужно проверять насколько корректно переводится Ваш HTML документ в PDF. Последний раз я пользовался xhtml2pdf примерно в то время, которым датирована эта заметка, в связи с этим, не знаю насколько продвинулись разработчики в поддержке стандартов.

суббота, 17 января 2009 г.

Как скачать репозитарий Ubuntu или Debian

Если в кратце, то так:


#Качаем небольшой скрипт getdebrepo
wget http://sites.google.com/site/dik123/getdebrepo -O getdebrepo
#Делаем его исполняемым
chmod +x getdebrepo
#Создаем папку для репозитария
mkdir repository
#Делаем созданную папку текущей
cd repository
#Запускаем скрипт. Для примера, скачивается последний, релиз Ubuntu
../getdebrepo maverick -all binary-i386 http://archive.ubuntu.com/ubuntu/
#Собственно скачиваем пакеты
wget -x -i part0


Копируем эти строки в терминал и идем пить чай, гулять или уезжаем на несколько недель, в зависимости от скорости канала.
Продвинутые дебианщики подумают: "что за getdebrepo, первый раз слышу! debmirror знаю, а это нет". А зря! Неплохая штука, должен сказать, тем более, что сам написал :)

Этот "велосипед" преследует ряд задач:

  1. Скачивать указанные части репозитария.

  2. Независимость от Debian (я писал и тестировал этот скрипт на Gentoo).

  3. Быть намного проще чем debmirror (жертвуя функционалом).

  4. Масштабируемость т.е. распределять закачку репозитария между друзьями и знакомыми.

  5. Показывать информацию о зеркале репозитария.

  6. Позволить людям с Ubuntu, но медленным и/или дорогим интернетом, попросить людей без ubuntu, но с быстрым и дешевым интернетом проявить чудеса убунтизма, не сильно напрягая последних.



И как же этим пользоваться?
Распишу последовательность действий.

  1. Cначало нужно найти зеркало репозитария.
    Список для Debian можно посмотреть здесь http://www.debian.org/mirror/list
    Для Ubuntu здесь https://wiki.ubuntu.com/Mirrors.
    Но лучше уточнить у своего провайдера, нет ли у него зеркала в вашем городе, это будет быстрее и скорее всего значительно дешевле.
    Внимание! все ниже следующие операции рекомендуется выполнять в пустой директории (в принципе не обязательно, но крайне желательно, т.к. могут быть перезаписаны существующие файлы)

  2. Следующим шагом надо выяснить, что доступно на зеркале. Делаем это командой:

    ../getdebrepo -l http://archive.ubuntu.com/ubuntu/

    Вместо http://archive.ubuntu.com/ubuntu/ можно вписать свое зеркало. Если адрес введен правильно (а это должен быть тот же адрес, что помещают в source.list) программы выдаст список имен релизов, доступных на сервере.

  3. Предположим на прошлом шаге было выбрано имя maverick. Теперь нужно определиться для каких архитектур будем брать пакеты, и какие репозитарии нужны. Запускаем команду:

    ../getdebrepo maverick -l -l http://archive.ubuntu.com/ubuntu/

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

    #Подготовить список файлов для скачивания репозитария Ubuntu maverick (10.10) все части
    #репозитария (main, universe, и т.д.) для архитектуры i386
    ../getdebrepo maverick -all binary-i386 http://archive.ubuntu.com/ubuntu/

    -all - как можно догадаться, значит все.

    Или другой пример:

    #Подготовить список файлов для скачивания репозитария Ubuntu maverick (10.10)
    #только части репозитария main и universe для архитектур i386 и ia64
    ../getdebrepo maverick main,universe binary-i386,binary-ia64 http://archive.ubuntu.com/ubuntu/

    Обратите внимание, что ни до ни после запятых нет пробелов, это важно!

  4. В результате работы последней команды будет создан текстовый файл part0, каждая строка которого - ссылка на deb пакет c указанного сервера.

  5. Осталось скачать все перечисленные пакеты. Для этого я использую wget, от части, потому, что это хорошая программа, которой я умею пользоваться, а так же из-за наличия у нее ключа -x, указывающего создавать иерархию папок для ссылки, что в данном случае важно, ведь каждый пакет должен быть помещен в определенную директорию. Конечно можно скачать около 3000 файлов в одну директорию, а потом написать скрипт для раскидывания по нужным местам, но зачем, ведь можно все сделать сразу.
    И так, скачиваем!

    wget -x -i part0



Думаю, что после этого перечисления осталось несколько вопросов.
Зачем 0 после part?
part'ов может быть много.

Где же здесь масштабируемость и распределенное скачивание?
Если вызвать программку с ключем -h (или вообще без ключей) можно заметить, что URL'ов зеркал с репозитариями может быть несколько т.е. можно вызвать программу с такими аргументами:

../getdebrepo maverick -all binary-i386 http://archive.ubuntu.com/ubuntu/ ftp://ftp.iinet.net.au/pub/ubuntu/

Будет создано два файла: part0 и part1, количество ссылок в них будет примерно одинаковое, но размеры пакетов не учитываются. Ссылки в part0 будут указывать на http://archive.ubuntu.com/ubuntu/, а в part1 на ftp://ftp.iinet.net.au/pub/ubuntu/. Если нужно несколько файлов, указывающие на один и тот же сервер, то программе в качестве аргументов достаточно указать сервер несколько раз, вот так:

../getdebrepo maverick -all binary-i386 http://archive.ubuntu.com/ubuntu/ http://archive.ubuntu.com/ubuntu/ http://archive.ubuntu.com/ubuntu/


Почему в скрипте сразу не вызывается wget?
Подразумевается, что файл будет использоваться на другой машине.

Если возможность скачать репозитарий есть только на MS Windows, то специально для таких случаев wget собрали под эту платформу. Скачать его можно здесь: http://gnuwin32.sourceforge.net/

Известные особенности getdebrepo:

  • Не скачивает исходные коды.

  • Не удаляет уже скаченные файлы.