Мысли по мотивам PyCamp Kyiv

Первое впечатление

Сразу вспомнился анекдот:

— Чем отличается программист-интраверт от программиста-экстраверта?
— Во время разговора программист-интраверт смотрит на свои ботинки, а программист-экстраверт смотрит на ботинки собеседника.

Видел Капитана Очевидность

Длинный первый доклад «Почему Python — тормоз и как заставить его меньше тормозить» был о том, что добавление уровней абстракции снижает производительность, а отказ от деструктивного присваивания сильно упрощает жизнь компилятору, интерпретатору и разработчику.

Докладчик не читал “Coders at Work”. Иначе воспользовался бы шуткой про “5 = 6”.

О взаимоотношениях

Привлек внимание доклад Дмитрия Кожевина «”Программирование на нервах” — короткий разговор об управлении проектом».

Мой коллега (Юра Сафроненко) является тренером НЛП и (совершенно бесплатно) ставит над нами опыты и делится своими тайными знаниями.

В своем докладе Дмитрий Кожевин только царапнул поверхность проблемы личностного взаимодействия между менеджером и разработчиком. В НЛП эти вещи проработаны вдоль и поперек. Не знаю, хорошо или плохо, что у ПМ-ов нет такого инструмента. Упоминание концепций “положительной” и “отрицательной” мотивации показывает, что в целом в этом направлении движение идет.

Об инструментарии

Доклад Андрея Светлова «Безопасная разработка ПО. Результат длинного пути и множества набитых шишек.» — ода отрицательной мотивации. “Не напишете тесты — проект не соберется”, “не запустите тесты — заказчик зарежет”, “не сделаете еще что-то — Земля налетит на небесную ось”.

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

Отрицательная мотивация в данном случае ведет к затратам времени со стороны разработчиков и денег со стороны заказчиков.

Ужас

Показанные в рамках доклада «Расширение и встраивание Python» фрагменты кода порадовали равномерной плотностью верстки. Как в хорошей книге, на всю ширину экрана сверху донизу.

Последние разы такой “бизнес-бизнес” я видел, разглядвая реализованный на C web-интерфейс сетевого хранилища данных и код motion-detect в в проекте ZoneMinder.

Если вывод команды ifconfig вам нужно посмотреть два раза за время жизни программы, не парьтесь с подключением библиотек на С, породите шелл и запустите ifconfig из него.

Велосипед

Индустрия велосипедостроения никуда не делась. Сначала велосипеду делают квадратные колеса (чтобы не было похоже на соседский). Потом формируют специальный профиль дорожного покрытия. После уговоров коллег по цеху колеса меняются на круглые, а выравнивание дороги выставляется очередным шагом на пути прогресса.

Чай с бутербродами

В беседе с Юревичем (резок, как ситро, доклад про декораторы прочитал за 15 минут) высказал мысль, что тесты, методологии, жилетка/пряник/кнут ПМ-а — приспособления, позволяющие среднему человеку почти сразу играть на пианино так, как это делают выпускники консерватории. Сразу не получается, но на безрыбье и жопа — соловей. Посадить за пианино выпускника консерватории нельзя. Играть надо “Мурку” в прокуренных кабаках, а профессиональные пианисты хотят играть Рахманинова.

Возня инженеров под столом математиков смешит.

О прекрасном

Девушка-оператор радовала глаз. Надо организовать фан-клуб.

31

Принимаю

Just in case

From Buildroot mailing list:

Doh! I trield make kernel-menuconfig and several other variations. For future reference, is there somewhere that’s documented?

In docs/README:

Depending on your configuration, there are some targets you can use to use menuconfig of certain packages. This includes:

$ make HOSTCC=gcc-4.3 linux26-menuconfig
$ make HOSTCC=gcc-4.3 uclibc-menuconfig
$ make HOSTCC=gcc-4.3 busybox-menuconfig

Поздравляем с Днем Рождения

Поздравляем с Днем Рождения Михаила Гусарова (он же, dottedmag).

Если кто не в курсе, то это его мозг суперзубра выступил в роли локомотива для проекта OpenInkpot, результаты работы которого можно щупать в виде официальной прошивки к электронной книжкеAzbooka N516.

Огнемет на предплечье

Человек собрал огнемет (проект “Прометей”), монтирующийся на предплечье и плечо в районе локтя.

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

Тут можно посмотреть на сканы тетради с дизайном, трехмерные эскизы и фотографии: Everett.Bradford. Prometheus

Меня смущает малый радиус действия (5 метров было бы в самый раз).

В целом, прикольно.

Об уважении

Назвал человек админов красноглазыми, а они возьми и обидься. И посоветуй ему в sources.list вставить ссылки на Debian experimental.

Будет плакать и жалеть, что никто не предупредил. А будет поздно.

Update: говорил же, что будет плакать

Дело Вагнера живет

Идеи распределенного блога, публикуемые Виктором Вагнером (кстати, у него сейчас ДР), оказались близки не только ему.

Параллельно созданная концепция распределенной социальной сети с примером реализации.

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

Первый пошел

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

Местные специалисты сделали экспертизу и по результатам “програмні засоби були визнані шкідливими для користувачів (программные средства были признаны вредными для пользователей)”.

Я всегда выступал за административную ответственность владельцев за рассылку вирусов-троянов с зараженных компьютеров с формулировкой “нанесение вреда/убытков по неосторожности”.

Converting scanned pages from PDF to DJVU

Last week I got PDF file with jpeg images for pages. As images were quite large (2095x2995) my lBook V3 had some trouble flipping them (15 second a page).

After some considerations I decided to transform PDF to DJVU format.

What can be easier?

  1. Extract JPEG pages from PDF
  2. Transform JPEG to PBM
  3. Transform PBM to DJVU
  4. Compile individual DJVU files in one book

The JPEGs were extracted without problem.

pdfimages -j source.pdf output

which gives a set of output-nnn.jpg files in a current directory.

And here comes the trouble.

Each JPEG contained a scanned color (RGB) or grayscale bookpage and had resolution like 2100x3000. Each image contained not only the front of the page but the back too as sheets of paper were quite thin and transparent on a scanner. It looked like this:

Original image

Once I tried to scan a paper book to read it on my lBook reader. That time I just told XSane to scan in “black&white mode” so there will be only letters on the front of the page and clean white background without contents from the back of the page.

After several minutes of search I found a name of the function to reduce colors of image — Posterize.

I checked the function in the GIMP and was quite pleased with the result. As there were hundreds of images to convert I needed more automagic solution. “What can be easier?” I asked myself again and run man convert (convert is a part of the ImageMagick suite). Quick search of the manual revealed -posterize function and all JPEGs were quickly converted by a shell for loop.

Alas the result was quite different from the one produced by GIMP.

Image By GIMP:
Image by GIMP

Image By Convert:
Image By convert

convert utility reduced the number of colors but emulated underlying images with dithering (to add insult to injury cjb2 utility from djvulibre suite wasn’t able to tell the difference between letters and background — result was a mess).

I must admit that I can’t cook utilities from the ImageMagick suite properly.

So I tried to make GIMP convert images automagically. That cost me several hours of debugging and cursing.

Beware of the snakes there.

Note to the brave: don’t always trust the tutorials and reference. Functions that return TRUE or FALSE by the reference in fact return (1) or (0) — a list containing one element — both are considered TRUE. Hence the (if (= 1 (car (function ...))) syntax.

First run GIMP in batch mode:

$ gimp -b —

Paste the script there:

(define (batch-jpeg-pbm filemask)
  (let* ((filelist (cadr (file-glob filemask 1))))
    (while (not (null? filelist))
      (let* ((filename (car filelist))
             (image (car (gimp-file-load RUN-NONINTERACTIVE
                                         filename filename)))
             (drawable (car (gimp-image-get-active-layer image))))
        (if (= 1 (car (gimp-drawable-is-rgb drawable))) 
          (gimp-image-convert-grayscale image))
        (gimp-posterize drawable 2)
        (plug-in-autocrop RUN-NONINTERACTIVE image drawable)
        (let ((newfilename (string-append (substring filename 0
                            (- (string-length filename) 4)) ".pbm")))
          (file-pgm-save RUN-NONINTERACTIVE image drawable
                         newfilename newfilename 1))
        (gimp-image-delete image))
      (set! filelist (cdr filelist)))))

And run it like this:

> (batch-jpeg-pbm "/path/to/your/images/*.jpg")

After several minutes for each JPEG there will be a .pbm bitonal file which can be converted to DJVU by cjb2 utility like this:

$ for i in *.pbm; do cjb2 $i $i.djvu; done

Next command will compile all DJVU files into one book:

$ djvm -c book.djvu *.djvu

Read more about Script-Fu

Wanted: инвайт на Хабр

Господа, а поделитесь инвайтом на хабр.