Expertus metuit
Sergey Stolyarov | 2009-12-01 в 23:56
  1. Подготовка файлов. Создаём каталоги res и ocr, разбираем PDF на страницы:

    pdftoppm -png file.pdf res/out
    
  2. Подготовка страниц; нужно увеличить разрешение, подкорректировать яркость и контрастность для лучшего распознавания:

    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
    
  3. Распознавание

    cuneiform out-014-g.tif -o out-014-g.tif.txt
    
Примечания
  • без корректировки яркости и контрастности результат распознавания был ужасным;
  • вывод в PNG почему-то вызывал сегфолт у cuneiform.
Sergey Stolyarov | 2009-10-26 в 22:15

У гугла есть отличный поисковик по исходным кодам различных проектов. Фигово только, что в результаты поиска выводятся порциями по десять элементов. Фиксим это при помощи юзерскрипта для оперы.

// ==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);
})();

Максимальное количество элементов на странице — сто.

Sergey Stolyarov | 2009-10-26 в 02:06

Памяти много, hibernate делается в swap-раздел, в прочее время swap не нужен. sysctl -w vm.swappiness=1 в /etc/rc.local не помогает, поэтому настраиваем pm-utils. Все команды с правами суперпользователя.

Sergey Stolyarov | 2009-10-24 в 20:08

Программа Assistant из Qt4 сделана довольно небрежно, например, даже при небольшом количестве открытых табов переключаться между ними очень неудобно. Поэтому фиксим это.

  1. В файле centralwidget.h исправляем параметры строки табов. Нам не нужны табы по ширине всего заголовка, обойдёмся скрыванием части заголовка за многоточием, этот параметр класса QTabBar называется elideMode, для нас подойдёт значение Qt::ElideMiddle. Теперь табы будут при необходимости «сжиматься» и исчезнет дико неудобная кнопка прокрутки табов.
  2. Также можно добавить кнопку закрытия на каждый таб.
Sergey Stolyarov | 2009-10-23 в 22:26

Печатаем, что играет амарок. Скрипт очень простой (считаем, что локаль процесса, откуда вызывается скрипт, юникодная):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python2.5
# -*- coding: utf-8 -*-

import dbus
bus = dbus.SessionBus()

proxy = bus.get_object('org.kde.amarok', '/Player')
player = dbus.Interface(proxy, "org.freedesktop.MediaPlayer")
metadata = player.GetMetadata()

# access metadata using operator []:

np = u"/me now listening to %(artist)s — %(t)s (album: %(album)s)" % {
    't': metadata['title'],
    'artist': metadata['artist'],
    'album': metadata['album']
    }

print np.encode("utf-8")
Sergey Stolyarov | 2009-10-21 в 20:53

Это древний текст, он уже неактуален и вряд ли кому понадобится, но пусть хранится для истории.

Схема базы амарока, там же рядом лежит исходник схемы.

Sergey Stolyarov | 2009-10-19 в 22:49

В одном посте свёл разнообразную мелочёвку о настройке клиента. В первую очередь для себя, но, может, ещё кому-нибудь пригодится.

Sergey Stolyarov | 2009-09-30 в 01:29

Наконец-то дошли руки допилить код и таки включить полноценный OpenId провайдер в движке блога, теперь могу логиниться от имени блога (и сайта) regolit.com.

Заодно пофиксил несколько древних багов, до которых никак не доходили руки, и поменял цветовую схему сайта.

На очереди борьба с блогоспамерами, нужно что-то придумывать, чтобы гарантированно отсекать роботов. Капчу очень не хочется.

Sergey Stolyarov | 2009-09-16 в 12:09

В замечательной книге Игоря Ашманова «Жизнь внутри пузыря» много интересного рассказано про историю Рамблера начала «нулевых», вот только все реальные имена и названия скрыты за псевдонимами. Иногда псевдонимы легко раскрываются, иногда не очень. Поэтому решил собрать в одном месте таблицу соответствий, кто был кто.

Update

Подсказали ссылку, где все псевдонимы раскрываются.

Sergey Stolyarov | 2009-06-24 в 16:06

Полезная функция для печати значения переменной. Понимает и по-разному отображает различные типы.

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;
}
© 2006—2026 Sergey Stolyarov | Работает на pyrengine