вторник, 10 февраля 2009 г.

Массовые переименования файлов

Я всегда использовал shell-скрипты чтобы переименовывать кучи файлов. Однако, есть более простые средства для этого. Недавно я узнал про rename. Это стандартная утилита и она делает наиболее простую и часто используемую вещь — заменяет подстроку в именах.

Другая полезная программка — convmv. Она не только умеет конвертировать кодировку имён, но и также преобразовывать между нижним и верхим регистром.

Также mmv заслуживает упоминания. Она умеет делать замены по некоторому шаблону.

пятница, 6 февраля 2009 г.

Интерпретация старых картин

Пьер Каррье-Беллез. Площадь Пигаль в Париже. 1880.

Я не частый посетитель музеев, однако был недавно в Галерее Импрессионистов Пушкинского музея. И это интересно, как старые картины могут быть проинтерпретированы.

Например, это картина. Она ясно видится мне как картинка из какой-то псевдо-3D изометрической компьютерной игрушки — у неё ломаная перспектива близкая к из изометрической; есть даже уровень детализации (LOD) — только у ближних люди выписаны детали лица; даже расположение какое-то спрайтовой — кареты и люди двигаются параллельно краям улицы.

Гм… что-то я слишком засиделся за компом. Надо пойти погулять… :)

пятница, 30 января 2009 г.

Настройка lm_sensors для Asus P5E3

Стандартная конфигурация lm_sensors с помощью sensors-detect нашла правильные модули для мониторинга и они показывали нормальные данные кроме вольтажа, который отличался на ±10% от номинала. И это слегка надоедало мне.

Наконец, после прочтения статьи из вики lm_sensors Asus article, я смог найти правильные формулы для вольтажа которые совпадали бы со значениями в BIOS’е.

Сначала, надо было декомпилировать таблицы ACPI (пакет iasl должен быть установлен):
# cat /proc/acpi/dsdt > dsdt.bin
# iasl -d dsdt.bin

Расшифровывание всей этой ACPI магии которая запишется в dsdt.dsl — не очень простая задача. Я искал функцию RVLT которая даёт формулу для вольтажа:
Method (RVLT, 1, NotSerialized)
{
    And (Arg0, 0xFFFF, Local0)
    Store (VGET (Local0), Local1)
    Store (DerefOf (Index (DerefOf (Index (VPAR, Local0)), Zero)),
        Local2)
    Store (DerefOf (Index (DerefOf (Index (VPAR, Local0)), One)),
        Local3)
    Store (DerefOf (Index (DerefOf (Index (VPAR, Local0)), 0x02)),
        Local4)
    Multiply (Local1, Add (Local2, Local3), Local5)
    Divide (Local5, Local3, , Local5)
    Add (Local5, Local4, Local5)
    Return (Local5)
} 

Переводя на нормальный язык она делает примерно следующее:
Local1 = VGET(Local0);
Local2 = VPAR[Local0][0];
Local3 = VPAR[Local0][1];
Local4 = VPAR[Local0][2];
return Local1 * (Local2 + Local3) / Local3 + Local4;

Чтобы найти параметры Local для каждого из сенсоров, пришлось найти определение VPAR:
Name (VPAR, Package (0x04)
{
    Package (0x03)
    {
        Zero,
        One,
        Zero
    },

    Package (0x03)
    {
        0x22,
        0x22,
        Zero
    },

    Package (0x03)
    {
        0x14,
        0x0A,
        Zero
    },

    Package (0x03)
    {
        0x3C,
        0x0A,
        Zero
    }
})

Сравнивая это с порядком данных в других местах таблицы (VCore, +3.3V, +12V, +5V) можно высмотреть, что правильные коэффициенты для +12V — это 60/10, а для +5V — это 20/10.

Получившийся конфиг тут.

воскресенье, 11 января 2009 г.

Последний подарок GSoC

Наконец-то, ко мне приехала майка GSoC. Её приезд оказался полной неожиданностью, так как никакого обещанного номера от FedEx я не получал. Так что, Summer of Code 2008 официально закончился. Начался 2009! :)