s o m e t h i n g a b o u t m e

files renaming

How to add some string to all file names in current dictionary?

traut@traut-laptop:~/test$ ls
filename1.txt  filename2.wav  filename3.odt
traut@traut-laptop:~/test$ ls -1 | while read filename; \
> do \
> NAME=${filename%.*}; EXT=${filename#*.}; mv ${NAME}.${EXT} ${NAME}_mark.${EXT}; \
> done
traut@traut-laptop:~/test$ ls
filename1_mark.txt  filename2_mark.wav  filename3_mark.odt
traut@traut-laptop:~/test$


in linux we trust

My Book World

пару недель назад был куплен WD My Book World Edition. Основным импульсом к покупке было желание сохранить все то хорошее, что смотрится/слушается ежедневно для будущего использования. Например, мое хранилище flac- (джаз, классика. считаю глупым, при сегодняшней стоимости Гб места, хранить это в mp3), ape-, mp3-музыки уже начало занимать на старом сторадже в 300Гб непозволительно много места. Про фильмы совсем нечего говорить. DVD-R не нравятся идейно — пыльная коробка с дисками жутко непрактичная, собирает пыль и обладает порогом “влом-доставать”. итого, что мы имеем:

  • ARM926 processor + 32Mb RAM
  • Integrated Gigabit Ethernet MAC
  • Integrated SATA core and PHY
  • Integrated USB host controllers and PHYs
  • High speed AES-128 encryption core
  • PCI interface supporting system expansion
  • Open standard Linux OS

+ ~1Tb свободного места на диске.

Т.е. это — минирабочая станция с громадным диском и маленькой системкой. Изначально, WD предоставляет какой-то свой софт доступа и расшаривания диска в сети. Это не наш путь :) все внутри сделано умно людьми с прямыми руками, а потому хачится просто и красиво: очень легко поднимается ssh, убивается родной WDшный расшаривательный софт (написанный, кстати, на java) и начинаем накатывать то, что нужно нам.

[traut@traut-box ~]$ uname -a
Linux traut-box 2.6.17.14 #1 PREEMPT Mon Mar 26 12:36:33 BST 2007 armv5tejl GNU/Linux

Я собрал и поставил midnight commander, screen, rtorrent, Firefly (трасляция audio-архива по сети). Samba/FTP я поубивал, т.к. не пользуюсь — при поднятии сети, ноутбук пытается примаунтить сторадж по sshfs как локальную папку.

Т.к. изначально веб-интерфейс системы сделан на Lighttpd + FastCGI + Perl, достаточно легко хачится и подключается через FCGI нужный язык — PHP, Python, etc. Легким движением делается маленький веб-сервак :) Резюмируя, можно сказать, что система тихая, функциональная, достаточно шустрая (только опреативки я бы добавил), и, что главное, очень гибкая. На этот девайс есть даже рецепт по накатыванию Debian. По плану, такую систему удобно поставить в чулан, подкючить к wifi-точке и забыть о ней.

Девайс радует также маленькими фишечками, как то: радиаторная решетка в виде кода Морзе, комментарии с именами комментаторов в скриптах загрузки :), закомментированный и невключенный по-умолчанию функционал (encrypted FS).

Как обычно - еще одна игрушка с Linux внутри :)


PNG chunks removing with Python

# working on pyips

I’ve already have the post about chunk removing in Java. But how to remove chunk from PNG file data stream in python?


maxs:/usr/local/www/eth0less.com/pyips>cat ./pngutils.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

'''
 PyIPS - Python image processing server/script

 author: Sergey Polzunov aka Traut
 email: traut.box[at]gmail.com
 blog: http://out.com.ua/blog

 Version 0.1
'''

import string

chunk_min_length = 4 + 4 + 4 # data_length, chunk_name, crc

main_chunks = ["IHDR", "PLTE", "IDAT", "IEND"]
other_chunks = ["tRNS",                                 # transparency
                "cHRM", "gAMA", "iCCP", "sBIT", "sRGB", # colorspace
                "iTXt", "tEXt", "zTXt", "bKGD",         # textual info
                "hIST", "pHYs", "sPLT",                 # miscellaneous things
                "tIME"]                                 # time stamp

def compute_chunk_length(data, i):
    return (ord(data[i]) << 3) | (ord(data[i + 1]) << 2) | (ord(data[i + 2]) << 1) | ord(data[i + 3])

def remove_chunk(data, chunk_name):
    for i in range(0, len(data) - chunk_min_length + 1):
        j = i + 4
        maybe_chunk = data[j] + data[j + 1] + data[j + 2] + data[j + 3]
        if maybe_chunk == chunk_name and (main_chunks + other_chunks).count(maybe_chunk) == 1:
            chunk_data_length = compute_chunk_length(data, i);

            #print "removing %d blocks" % (chunk_min_length + chunk_data_length)

            return data[:i] + data[i + chunk_min_length + chunk_data_length:]
    print "Cannot find chunk with name", chunk_name

def browse_chunks(data):
    found_chunks = []
    for i in range(0, len(data) - chunk_min_length + 1):
        j = i + 4
        maybe_chunk = data[j] + data[j + 1] + data[j + 2] + data[j + 3]
        if (main_chunks + other_chunks).count(maybe_chunk) == 1:
            chunk_data_length = compute_chunk_length(data, i);
            found_chunks.append((maybe_chunk, chunk_data_length))
            i += chunk_data_length + chunk_min_length

    #return found_chunks

    for chunk_name, chunk_length in found_chunks:
       print "Chunk %s founded. Data length is %d" % (chunk_name, chunk_length)

def test():
    image_file = open("test.png", "rb")
    image_raw_data = image_file.read()
    browse_chunks(image_raw_data)
    chunk = "gAMA"
    print "Removing", chunk
    new_image_data = remove_chunk(image_raw_data, chunk)
    new_image_file = open("test2.png", "wb")
    new_image_file.write(new_image_data)

    image_file.close()
    new_image_file.close()
    print "Edited file:"
    image_file = open("test2.png", "rb")
    image_raw_data = image_file.read()
    browse_chunks(image_raw_data)
    image_file.close()

if __name__ == "__main__":
    test()


extremely easy one-command backup on ubuntu

example of my easy-one-command backup script:

traut@traut-laptop:~$ cat ./make-backup.sh
rdiff-backup --force -v4 --print-statistics /home/traut /media/storage/_backup
traut@traut-laptop:~$ ./make-backup.sh
Using rdiff-backup version 1.1.14
...
[skip]
...
--------------[ Session statistics ]--------------
StartTime 1204299600.00 (Fri Feb 29 17:40:00 2008)
EndTime 1204300856.80 (Fri Feb 29 18:00:56 2008)
ElapsedTime 1256.80 (20 minutes 56.80 seconds)
SourceFiles 179336
SourceFileSize 45282340567 (42.2 GB)
MirrorFiles 179080
MirrorFileSize 45899848891 (42.7 GB)
NewFiles 3248
NewFileSize 977380475 (932 MB)
DeletedFiles 2992
DeletedFileSize 1596537521 (1.49 GB)
ChangedFiles 324
ChangedSourceSize 572043066 (546 MB)
ChangedMirrorSize 570394344 (544 MB)
IncrementFiles 6564
IncrementFileSize 1528496310 (1.42 GB)
TotalDestinationSizeChange 910987986 (869 MB)
Errors 0
--------------------------------------------------
traut@traut-laptop:~$

it’s extremely simple and maybe I should add some versions support. You can easily fire this backup task every-night/every-week/every-month with cron.


externar monitor config aka dual-headed

ха. удалось все-таки оживить монитор от старого десктопа — вот тут отличный ман.

что делал я.

  1. добавил
    Virtual 2560 2048

    Стало:

    Section "Screen"
            Identifier      "Default Screen"
            Device          "Intel Corporation Mobile 945GM/GMS, 943/940GML Express Integrated Graphics Controller"
            Monitor         "Generic Monitor"
            DefaultDepth    24
            SubSection "Display"
                    Depth           24
                    #Modes          "1280x800"
                    Virtual         2560 2048
            EndSubSection
    EndSection

    Рестарт иксов.

  2. traut@traut-laptop:~$ xrandr -q
    Screen 0: minimum 320 x 200, current 2560 x 1024, maximum 2560 x 2048
    VGA connected 1280x1024+1280+0 (normal left inverted right) 338mm x 270mm
       1280x1024      60.0*+   75.0     59.9
       1152x864       75.0
       1024x768       75.1     70.1     60.0
       832x624        74.6
       800x600        72.2     75.0     60.3     56.2
       640x480        75.0     72.8     66.7     60.0
       720x400        70.1
    LVDS connected 1280x800+0+0 (normal left inverted right) 331mm x 207mm
       1280x800       60.0*+   60.0
       1280x768       60.0
       1024x768       60.0
       800x600        60.3
       640x480        59.9
  3. traut@traut-laptop:~$ xrandr  --output LVDS --auto
    traut@traut-laptop:~$ xrandr  --output VGA --mode 1280x1024 --pos 1280x0

але-оп! :)
Dual Headed


using katapult

помню, был удивлен, что для ускорения процесса выбора приложений люди используют google desktop search — вызвав окно поиска, просто вбивают в строку пару первых букв приложения — и получают ссылку на экзешник — кликают/запускают. быстро и без лишнего ползания по “быстрому запуску”/меню пуск. но, т.к. на ноутбуке у меня не винда, и т.к. с google desktop я как-то сдружился — я отбросил этот подход как не реализуемый для себя.

но!

давно терзался я, что есть Katapult — окошко с лого, появляющееся на дисплее на нажатие Alt+Space и ждущее чего-то, потом так же тихо пропадающее :) оказалось — отличный способ быстрого запуска приложения/исполнения файла/быстрого вычисления выражения. мега. принцип такой же — хот-кей на запуск Katapult и пару первых букв файла/приложения или мат. выражение.

скриншоты:



ну не красота ли?

traut@traut-laptop:~$ katapult --help
Usage: katapult [Qt-options] [KDE-options]

A plugin-driven utility that can launch applications, bookmarks, or anything else that you can find a plugin for.

даешь эффективное использование рабочих сил :)


rising of the mighty mouse scroll down

ха! я думал, это у меня руки кривые, что не могу заставить работать после перестановки систему scroll down у wireless mighty mouse. а вот и нет. быстрое гугление показало, что проблема-то старая — возникает, когда мышка становится уж очень грязной (да-да, руки нужно мыть перед тем, как садишься за машину) и фикс к ней единственный — помучать scrollball, протереть спиртом края, поковырять иголкой щели — авось очухается. ведь мышку-то хрен разберешь.

Поковырял, протер, потыкал острой проволочкой. очухалась и появился скролл вниз :) если повторится — потащу в гарантийку, нефиг.