-
Подготовка файлов. Создаём каталоги
resиocr, разбираем PDF на страницы:pdftoppm -png file.pdf res/out -
Подготовка страниц; нужно увеличить разрешение, подкорректировать яркость и контрастность для лучшего распознавания:
cd res FILES=`ls *.png` cd .. for f in $FILES; do convert -geometry 1000x -modulate 90 -gamma 0.9 -contrast -fx G res/$f ocr/$f.tif done -
Распознавание
cuneiform out-014-g.tif -o out-014-g.tif.txt
Примечания¶
- без корректировки яркости и контрастности результат распознавания был ужасным;
- вывод в PNG почему-то вызывал сегфолт у
cuneiform.
У гугла есть отличный поисковик по исходным кодам различных проектов. Фигово только, что в результаты поиска выводятся порциями по десять элементов. Фиксим это при помощи юзерскрипта для оперы.
// ==UserScript==
// @name google codesearch improvements
// @include http://*.google.com/codesearch
// @include http://google.com/codesearch
// ==/UserScript==
(function(){
var e = document.createElement('INPUT');
e.type = 'hidden';
e.name = 'num';
e.value = '100';
document.forms[0].appendChild(e);
})();
Максимальное количество элементов на странице — сто.
Памяти много, hibernate делается в swap-раздел, в прочее время swap не нужен. sysctl -w vm.swappiness=1 в /etc/rc.local не помогает, поэтому настраиваем pm-utils. Все команды с правами суперпользователя.
Программа Assistant из Qt4 сделана довольно небрежно, например, даже при небольшом количестве открытых табов переключаться между ними очень неудобно. Поэтому фиксим это.
- В файле
centralwidget.hисправляем параметры строки табов. Нам не нужны табы по ширине всего заголовка, обойдёмся скрыванием части заголовка за многоточием, этот параметр классаQTabBarназываетсяelideMode, для нас подойдёт значениеQt::ElideMiddle. Теперь табы будут при необходимости «сжиматься» и исчезнет дико неудобная кнопка прокрутки табов. - Также можно добавить кнопку закрытия на каждый таб.
Печатаем, что играет амарок. Скрипт очень простой (считаем, что локаль процесса, откуда вызывается скрипт, юникодная):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Это древний текст, он уже неактуален и вряд ли кому понадобится, но пусть хранится для истории.
Схема базы амарока, там же рядом лежит исходник схемы.
В одном посте свёл разнообразную мелочёвку о настройке клиента. В первую очередь для себя, но, может, ещё кому-нибудь пригодится.
Наконец-то дошли руки допилить код и таки включить полноценный OpenId провайдер в движке блога, теперь могу логиниться от имени блога (и сайта) regolit.com.
Заодно пофиксил несколько древних багов, до которых никак не доходили руки, и поменял цветовую схему сайта.
На очереди борьба с блогоспамерами, нужно что-то придумывать, чтобы гарантированно отсекать роботов. Капчу очень не хочется.
В замечательной книге Игоря Ашманова «Жизнь внутри пузыря» много интересного рассказано про историю Рамблера начала «нулевых», вот только все реальные имена и названия скрыты за псевдонимами. Иногда псевдонимы легко раскрываются, иногда не очень. Поэтому решил собрать в одном месте таблицу соответствий, кто был кто.
Update
Подсказали ссылку, где все псевдонимы раскрываются.
Полезная функция для печати значения переменной. Понимает и по-разному отображает различные типы.
function valueToString(v)
{
var res = "";
if (v === undefined) {
res = "undefined";
} else if (v === null) {
res = "null";
} else if (v.constructor === Array) {
var a = [];
for (var i=0; i<v.length; i++) {
a.push(valueToString(v[i]));
}
res = "[ " + a.join(", ") + " ]";
} else if (typeof v === "string" || v.constructor === String) {
v = v.replace("\\", "\\\\").replace('"', '\\"').replace("\n", "\\n");
res = '"' + v + '"';
} else if (typeof v === "object") {
res = "Object";
} else {
res = v.toString();
}
return res;
}