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

fall

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

хочется программировать. потому тематика диплома, хочется чтоб, касалась — внутренности VM (java/python), реализация чего-то хитренького (concurrent optimizations, lock-free implementation, etc), speech recognition (acoustic models training, speech2text).

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

думаю


and what they do to you

Отсюда чудесное:

Однажды Фроу Кэтч спросил Гоу Ту:
- Учитель! насколько тщательно должен отделывать свой код программист, стремящийся к просветлению?

Мастер Гоу Ту задумчиво отхлебнул чая и отошёл к холодильнику за лимоном. Достав свежий лимон, он положил его на блюдечко и откромсал самый краешек лимонного копчика. Затем мастер отрезал тонкий жёлтый ломтик и опустил его в свой горячий ароматный чай из пакетика. Чай у мастера всегда получался ароматным, даже если в офисе оставался исключительно Липтон.

- Мы все умрём, - наконец ответил мастер Гоу Ту своему ученику.

Фроу Кэтч поперхнулся чаем.

Мастер медленно отхлёбывал кипящий напиток, Фроу Кэтч молчал в недоумении. Пирожные кончились ещё вчера. Чашка мастера опустела наполовину, и только тогда учитель Гоу Ту рассказал подобающую коану.

- Один совершенномудрый программист, - неторопливо начал мастер, - однажды понял, что когда-нибудь он умрёт. Поэтому он перестал пользоваться венгерской нотацией и смарт-пойнтерами; он проверял код на утечки памяти, только если все два гигабайта оперативки улетали за двадцать минут; и даже отступы он ставил как попало. Потом этот программист действительно умер.

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

- Другой совершенномудрый программист тоже однажды понял, что когда-нибудь он умрёт. Поэтому он стал необычайно внимательным и аккуратным; он долго выверял интерфейсы; его код не нуждался в комментариях; все его дефайны имели длинные, интуитивно понятные имена; коллеги горевали, если приходилось заменять его функцию на чью-нибудь ещё.

- И что же с ним стало? - не выдержал Фроу Кэтч.

- Он тоже умер.


ICFPC is coming

“Каждый год проводится международная конференция ICFP - International Conference on Functional Programming. К этой конференции приурочен програмерский contest под названием ICFPC. Несмотря на название конференции, участвовать в контесте может любой желающий, и пользоваться можно любыми языками, не только функциональными, кроме того - участники могут объединяться в команды произвольного размера. Contest отличается от соревнований типа ACM и topcoder тем, что он менее “заточен” под какие-то конкретные языки или наборы навыков, а задачи в нем прикольные и позволяют получить удовольствие не только от победы, но и от участия.”

В этом году пройдет 11-14 июля

описание _adept_-ом конкурсов предыдущих годов  — 2007 и 2006

Размер команды — произвольный, языки программирования — произвольные,
способы решения задачи — любые. Важен результат.

Последние 2 года задания были очень интересными.

Официальный сайт
.
Общая информация

Предлагаю собрать команду, подготовить базу (сервера, репозитории, т.д.)
и хорошенько поразминать мозги в течении 3х дней :)

кто заинтересован — пишите.


applied dharma

написал программу, сделал ее опен-сорсной — > улучшил карму


onlinebrary

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

хочется сделать смесь shelfari/goodreads с множеством онлайн-библиотек (либ.ру и прочие).
Что хотелось бы видеть (нужный мне минимум :)) - разного рода списки, теги, рейтенгирование, механизм хранения цитат, к описанию книги прилагаются прямые ссылки на скачку, механизм конвертирования (это для ебуководов)

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

писать все планируется на питоне (pylons) и получать от этого необыкновенный fun :)


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 внутри :)


things have happened

сегодня кофе вызвало приятную бодрящую щекотку, которую когда-то вызывали сигареты. был удивлен и озадачен :)

программирование представляется возней с кусочками конструктора, собиранием из них разных штук. В таком контексте web-дев - собирание красивых, иногда очень дорогих, игрушек, не несущих в себе какого-либо функционального значения по работе с общим потоком данных. Другие типы программирования - core, low level, etc. - это сборка самих деталей конструктора или сборка из этих деталей полезных тузовин (молотка, микроскопа :) ), которые имеют уже прямое назначение в обработке данных. Такая деятельность сейчас видятся мне наиболее реальным и интересным занятием (в сравнении с деланьем ярких игрушек).

Но о данных тут несколько другой, более широкий разговор - количество данных преобразует игрушки в сложные системы, которые вызывают уважение - amazon, ebay, facebook. Но большинство игрушек так и остаются игрушками (занимающими свою нишу, да, но банально известными и простыми внутри).


delicious

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

Когда-то была поделка на Air, но она работало только под оффтопом. Гугление не выручало - толковых и продуманных программ организации небыло.

Сегодня, по мотивам, нашел то, что искал (и пох, что это для реальных книг, думаю, только пока. и пох, что маковский продукт) -

Delicious Library

Delicious Library - Get your Mac, a webcam, and Delicious Library and rediscover your home library. Just point any FireWire digital video camera, like an Apple iSight®, at the barcode on the back of any book, movie, music, or video game. Delicious Library does the rest. The barcode is scanned and within seconds the item’s cover appears on your digital shelves filled with tons of in-depth information downloaded from one of six different web sources from around the world.

восторг. конечно, там есть интеграция с амазоном, конечно не нужно все вбивать руками - есть сканнер штрих-кодов, конечно люди уже зарабатывают на амазоновских рекомендациях.

это еще один продукт в корзину к примерам того, как нужно писать софт. просто, понятно и элегантно.


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.


Solr problems identification

Here you can find a quick-recognize list that can help you to identify Solr error that hiding behind your application business logic.

Symptoms and possible causes.

There is a few symptoms that can help you to identify a problem:

  • Searching is fine, indexing is not working. When you change your data and no change appears in index and you cannot search by the new data.
    Possible causes:

    • Your application don’t add’n’commit data into Solr. Solr need to commit changes to see changed data in index.
      Check errors/exceptions in your application server log files
    • Solr index deadlocks.
      Try to push info to Solr index manually using magic command. If no result appears after command execution and execution just freezes — it is a lock. You have to check sudo kill -3 SOLRPID to be sure.
  • Searching returns wrong (maybe not unique) results.
    There can be a few possible causes:

    • Wrong search query.
      You have to check your query. Is it created right?
    • Wrong index data.
      You have to check an appropriate indexer to clarify index data constructing process. If there are no errors you can try to push some entry data into Solr index. Use magic command to add data into index (sometimes it is useful to specify all document fields in command to check if there are any problem with specific field).
    • Solr startup exception
      If search returns an empty result it can be caused by Solr startup error. You have to check Solr log files to identify it.
    • Index corruption.
      After searching query identification you have to try to search the query in Solr admin console. If wrong results appears — it is index corruption. You have to fire index rebuild (old index deletion is not necessary but preferable).
  • Search don’t work.
    • Exception during searching.
      Check log files for exceptions and errors. Connection refused (Solr master/backup server is down)? Are there any exceptions in your application during index data gathering?
    • Solr startup exception
      If search returns an empty result or returns an error it can be caused by Solr startup error. You have to check Solr log files to identify it.

Magic command

SolrJ client version 1.2 cannot show errors returned from server during indexing process. So we need to manually execute index add/commit operations to see server return message.

user@server$ curl http://solrserver.com/update -H "Content-Type: text/xml" --data-binary '<add><doc><field name="id">999999</field></doc></add>'
user@server$ curl http://solrserver.com/update -H "Content-Type: text/xml" --data-binary '<commit/>'

a good response is:

<result status="0"></result>

There can be any other errors and if you cannot identify some with this quick-recognizing list you need to keep digging inside your log files and stack traces :)


Qt4.3 + CSS -> PyQT

8-) нет слов!


self.frame.setStyleSheet(QtGui.QApplication.translate("MainWindow", "border-radius: 6px;\n"
        "border: 2px solid #8f8f91;\n"
        "background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
                                                       stop: 0 #f6f7fa, stop: 1 #dadbde);",
                                  None, QtGui.QApplication.UnicodeUTF8))

накопал в процессе написания маленького кастомного таймера. все-таки сел писать, устав забывать на плите то кофе, то молоко :) пишу на PyQT4


PyIPS aka Python Image Processing Server/Script

PyIPS (Python Image Processing Server/Script) - standalone server/script behind lighttpd/apache server that provides image processing service (PIL, Imagemagick as engines). The server caches results on file system (local, mogilefs, etc). PyIPS uses file storage specified by home directory property.

Project is in the early stage of development.

example urls:

http://eth0less.com/pyips/main.py/process?name=pic1.jpg&width=200&height=200&crop_type=top
http://eth0less.com/pyips/main.py/process?name=pic1.jpg&width=200&height=200&crop_type=center
http://eth0less.com/pyips/main.py/process?name=pic2.jpg&width=500&height=400
http://eth0less.com/pyips/main.py/process?name=pic2.jpg&width=600&height=600&scale_up_allowed=true
http://eth0less.com/pyips/main.py/process?name=pic3.jpg&width=500&height=400&crop_type=center

Soon I’ll add cache function (with ability to refresh/clean image cache), ImageMagick engine (currently PyIPS works only with PIL engine) and maybe mogilefs filestorage manager.

There are some additional files in repository - main.py and main.fcgi - these are for apache+mod_python and for lighttpd+FastCGI correspondingly.


PVM и MPI

краткое сравнение возможностей PVM и MPI можно найти тут


Next Page »