суббота, 21 ноября 2015 г.

В коллекцию идиотизмов

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

Цитирую (вдруг прочитают мой пост и сотрут от греха подальше свой перл на хабре):

Вот пример такой задачки, который может быть использован в ходе телефонного интервью или беседы с эйчаром на первом уровне. 
Напишите функцию merge, которая обрабатывает два сортированных списка и выдает сортированный список объединений элементов двух списков. 
К примеру:
merge ([1, 7, 11, 17], [3, 5, 13]) //=> [1, 3, 5, 7, 11, 13, 17]...
Если использовать язык с удобной семантикой для работы со списками и особенно не задумываться об использовании памяти и общей производительности, то код решения будет простым:
function merge (originalA, originalB) { const merged = [], tempA = originalA.slice(0), tempB = originalB.slice(0); while (tempA.length > 0 && tempB.length > 0) { merged.push( tempA[0] < tempB[0] ? tempA.shift() : tempB.shift() ); } return merged.concat(tempA).concat(tempB);}

Признаться, задачу я не понял - что такое список объединений? Видимо это что-то посложнее, чем просто список, наверное, вложенный список... но в качестве эталонного результата показан простой список. Мда.. Ну раз нам предложен эталонный код - тот еще код, ну да простим, то мы его опробуем на удовлетворяющих условию задачи двух сортированных массивах:

merge ([1, 7, 11, 17], [13, 5, 3])
// => [1, 7, 11, 13, 5, 3, 17]

Что мы видим? На выходе получаем не сортированный массив! То есть с таким пафосом предложенное решение не работает. Получается, что если кто решит правильно - в этой конторе не нанимают. Иначе специалист по найму персонала обидится... Да, статья переводная, но в корпоративном блоге размещена, значит, соответствует политике компании. А вы хотите стать клиентом такой конторы? Лично я - не хочу.

P.S. Да, к статье уже куча комментариев, половина комментаторов сразу себя как экспертов позиционируют и умные слова говорят, но при этом даже не видят, что король-то голый... то есть код не работает. Наверное, им стоит отправиться на собеседование в ту контору, которая разместила этот пост ;)

суббота, 2 февраля 2013 г.

Быдлокод? Быдлоинтернет от ДОМРУ!

Мало того, что у замечательной компании "ДОМ.RU В НИЖНЕМ НОВГОРОДЕ" постоянные проблемы с интернетом, а DNS сервера постоянно отваливаются. Они еще и считать не умеют и назойливо выдают страницу следующего содержания:

Мы благодарны Вам за то, что остаетесь с нами!

На сегодняшний день у Вас сформировалась задолженность, в результате которой, мы были вынуждены снизить Вам скорость доступа к услуге Интернет.
Ваш комфорт очень важен для нас, для того, чтобы пользоваться услугой с прежней скоростью, предлагаем Вам оплатить задолженность.
Ваша задолженность за услуги связи составляет 0,00 рублей.
Ага, наш комфорт им очень важен, потому просто так обрезают скорость доступа в инет, предъявляют претензии и разве что в рояль не насрали. При этом ежемесячная оплата увеличилась - в этом месяце счет за то же самое "комплексное предложение" заметно поболее, чем в предыдущие. При просмотре номера договора и баланса капча: "ebonite". Это они про себя, наверное?

P.S. Вчера через форму обратной связи на сайте отправил ДОМРУ жалобу. Как вы думаете, какой ответ? Правильно, никакого, видимо, некогда им абонентами заниматься, пиариться некогда будет.

P.P.S. Попробовал воспользоваться на сайте ДОМРУ их услугой "Онлайн консультант". Открылось эдакое окошко чата, в котором кроме меня никого нет... оказывается, по мнению компании отвечать вовсе не обязательно... пусть абоненты пишут что хотят, душу отводят. Нет, серьезно, они там сдурели поголовно?

Upd. Сегодня, 6 февраля, меня снова порадовали этим же сообщением. Интересно, это уже можно квалифицировать как вымогательство?

среда, 23 января 2013 г.

Представляете? Да!

Делал заказ на http://www.technopark.ru и при оформлении заказа увидел в "Редактировании персональных данных" потрясающую опцию: "Я представляю юр. лицо". Если честно -  я, хотя и являюсь _представителем_ юр. лица, скорее, _представляю_ себе море-океан, пальмы и песчаный пляж :D Если уж представлять что-то, то только лучшее! Интересно, русский язык в России совсем уже знать необязательно?!

среда, 4 июля 2012 г.

Unsupported Hardware watermark

Вылезло вдруг эдакое чудо - в правом нижнем углу экрана квадратик с сообщением "AMD Unsupported Hardware". Оказалось, дело в дровах для видеокарты, и решилось с помощью скрипта отсюда: Unsupported Hardware watermark

понедельник, 4 июня 2012 г.

Анонс: открытое ПО GeoMed3D для построения 3D модели недр

Выложил часть своих наработок, связанных с восстановлением 3D модели недр по космоснимкам. Софт написан на ANSI C под OC linux (32 и 64 разрядные). Source-пакет и бинарная сборка под 32 бит linux Deian прилагаются. http://mobigroup.ru/debian/pool-squeeze/main/g/geomed3d-bin/ Документацию пока не выкладывал, равно как и примеры снимков. Ежели у кого есть снимки, которые можно опубликовать и по которым получаются интересные результаты - выкладывайте здесь ссылки, с описанием, что на снимке, кому он принадлежит и под какой лицензией публикуется. Скрипт для построения вертикального разреза приведен ниже:
#!/bin/sh
# скрипт построения вертикального разреза
# глубина в метрах = 0.7*R*(разрешение исходного изображения)
# для работы скрипта нужен установленный ImageMagick и пакет geomed3d
set -e

# исходное изображение
IMAGE=sample.tif
# размер исходного изображения, пикселов
WIDTH=3217
HEIGHT=2782
# глубина построения разреза, шагов
R=300

# удалить файлы предыдущего запуска
rm -f v_min.grad.tif v_mode.grad.tif

# преобразуем исходное изображение в RAW массив
convert -depth 8 "$IMAGE" gray:in.raw
# строим маску
geomed3d_mask $WIDTH $HEIGHT 0 0.5 1 0.5 > v_mask
# размер маски в пикселях (каждому пикселу соответствует отдельная строка в файле маски)
LENGTH=$(cat v_mask | wc -l)
# построить вертикальное сечение (фокальная статистика)
cat v_mask | geomed3d $WIDTH 0 $R in.raw v_min.raw v_mode.raw
# определим размерности полученного массива
W=$LENGTH
H=$((R+1))
# посчитать градиент
geomed3d_grad $LENGTH v_min.raw        v_min.grad.raw
geomed3d_grad $LENGTH v_mode.raw       v_mode.grad.raw
# для просмотра
convert -size ${W}x${H} -depth 8 gray:v_min.grad.raw  v_min.grad.tif
convert -size ${W}x${H} -depth 8 gray:v_mode.grad.raw v_mode.grad.tif

# удалить временные файлы
rm -f in.raw v_mask v_min.raw v_mode.raw v_min.grad.raw v_mode.grad.raw

# готово! смотреть файлы v_min.grad.tif и v_mode.grad.tif
Также анонсировал здесь: http://gis-lab.info/forum/viewtopic.php?f=20&t=10754
Для интересующихся на форуме выкладываю "Использование фотополимеризующихся композиций для записи и восстановления распределения интенсивности" (http://zalil.ru/33382501), где я и начинал заниматься вопросами рассеяния на различных неоднородностях. Смотрите 2-ю главу "Спектры рассеяния на собственных неоднородностях ФПК" и главу 3 "Восстановление изображения с транспарантов, записанных на ФПК". Фотополимеризующаяся композиция (ФПК) - двухкомпонентная среда (мономер и полимер, при конверсии мономера образуется полимер), для которой можно и матмодель сделать, и проверить результат в лаборатории. Далее, выкладываю проведенную по гранту компании LG работу "Получение коллимированных пучков после прохождения сферического волнового фронта через фазовую зонную пластинку" (http://zalil.ru/33382544), где изучается и моделируется уже дифракция. Как видим, то, что в геологии называется "малые кольцевые структуры" хорошо изучено и часто встречается. Далее открывайте Фивенского (благо здесь уже и скан выложен, спасибо!). После чего смотрите результаты, полученные специалистами ООО "ГеоКосмоМониторинг". И наконец, можете изучить исходники и запустить анонсированную в топике программу.

Upd. Сборка под виндоус анонсированных утилит: http://zalil.ru/33381973 Для поддержки функций memory mapping использован проект mman-win32.

Upd. Сделал краткое объяснение моего представления о физ. механизме образования кольцевых неоднородностей, раз на форуме так хотят его услышать:

Я полагаю, регистрируемую картинку подземных неоднородностей на поверхности дают значительно более мощные относительно среднего фона сейсмоволны при землетрясениях, нежели чем картинка проявляется как результат накопления изменений от воздействия среднего фона. За несколько десятилетий, которые называет Фивенский минимальным сроком "проявления" малых кольцевых структур, землетрясения амплитудой 8 баллов и выше происходят практически везде (из вики: "За год на Земле происходит примерно: 1 землетрясение с магнитудой 8,0 и выше;10 — с магнитудой 7,0—7,9;100 — с магнитудой 6,0—6,9; 1000 — с магнитудой 5,0—5,9."), что соответствует амплитуде вертикальных колебаний поверхности уже не микроны, а сантиметры, метры и даже десятки метров, причем одна мощная волна с рассеянием на подземных неоднородностях даст интерференционную картину аналогично когерентному источнику (тогда как при среднем сейсмическом фоне когерентности нет). Такой механизм образования кольцевых структур мне представляется намного более вероятным, и дает ответ на вопрос, откуда же берется когерентность сейсмоволн - я вообще не встречал нигде попытки объяснить эту самую когерентность, про которую все упоминают, так как без нее ничего не получается. Итак, землетрясение - это процесс записи на поверхности Земли интерферограммы ее внутреннего строения. Спектры рассеивания (или, что эквивалентно, угловое распределение энергии рассеянной волны) продуцируют образование кольцевых структур на поверхности, причем изотропные неоднородности продуцируют кольца, анизотропные - "полумесяцы", как можно увидеть в моей работе по спектрам рассеивания. Соответственно, картина геологического строения может производиться путем восстановления записанной на поверхности интерферограммы. Технически это реализуется путем поиска кольцевых структур и дальнейшего анализа их характеристик.

пятница, 1 июня 2012 г.

geomed3d-tclshp package for Shapefile creation from Tcl scripts

Понадобилось мне создавать шейпфайлы, попробовал делать это через gdal (типы полей в DBF, похоже, всегда строковые, не подходит, да и не понравилось - нужно создавать XML файл, в котором прописывать имена файлов, и проч. непотребства совершать) и Spatialite (типы полей могут быть и числовые, но все равно не устраивает - сложно и не быстро). Опробовав два вышеназванных пути, сделал свой пакет GeoMed3dSHP для языка Tcl (получается вдвое быстрее, чем делать то же через Spatialite). Пример использования:
rm -f test.* && tclsh8.5
package require GeoMed3dSHP
set id [SHPCreateFiles test]
SHPWritePoint $id 374868.671871 2828378.81973 100.0 777
SHPWritePoint $id 374868.671871 2828378.81973 100.0 888
SHPCloseFiles $id
exit
Ну и заодно расширение GeoMed3dDBF для создания только DBF файлов:
rm -f test.* && tclsh8.5
lappend auto_path .
package require GeoMed3dDBF
set id [DBFCreateFile test]
DBFWrite $id 374868.671871 2828378.81973 100.0 777
DBFWrite $id 374868.671871 2828378.81973 100.0 888
DBFCloseFile $id
exit
Типы полей в DBF фиксированы, ибо мне так надо :) При необходимости поправить тип/количество полей в DBF в исходнике сложностей не вызывает.

вторник, 24 января 2012 г.

Сканер CanoScan LiDE 210 в debian


Взял себе на днях CanoScan LiDE 210 взамен CanoScan LiDE 90, для которого поддержку так и не сделали в линуксе, а танцы с бубном мне надоели. Итак, подключил CanoScan LiDE 210, запустил xsane - все работает. Не настраивал вообще ничего, только установил xsane. Сканер шустрый и достаточно тихий. С поддержкой кнопок (в терминологии разработчиков sane - sensors) все хреново, как обычно, но есть финт ушами:
$ scanimage -d "genesys:`sane-find-scanner|grep CanoScan|cut -d' ' -f 10`" -A|grep '\[hardware\]'|grep "\[yes\]"|wc -l
0
а теперь нажимаем любую кнопку:
$ scanimage -d "genesys:`sane-find-scanner|grep CanoScan|cut -d' ' -f 10`" -A|grep '\[hardware\]'|grep "\[yes\]"|wc -l
1
Одна из кнопок сканера не вызывает никакой реакции, остальные работают (хотя их названия в выводе scanimage -A перепутаны). Так что несложно сделать скрипт для пакетного сканирования, реагирующий на кнопки:
scan.sh
#!/bin/bash

SCANNER=`sane-find-scanner|grep CanoScan|cut -d' ' -f 10`
if [ -z $SCANNER ]
then
    echo "Scanner not found!"
    exit 1
fi
SCANNER="genesys:$SCANNER"

counter=1
while true
do
    BUTTON=`scanimage -d "$SCANNER" -A | grep '\[hardware\]' | grep "\[yes\]" | wc -l`
    if [ $BUTTON == 1 ]
    then
        echo -n "Start scan image $counter ..."
        scanimage -d "$SCANNER" --resolution 75 --mode Color --depth 16 --format png > $counter.png.tmp
        mv $counter.png.tmp $counter.png
        echo " complete"
        counter=$(($counter+1))
    fi
done
Собственно, запускаем вышеуказанный скрипт и жмем любую кнопку на сканере после помещения в него очередного документа.

суббота, 17 декабря 2011 г.

Открытый софт для научных расчетов

Задачки у меня бывают разные, кратенькое описание того, что может потребоваться я приводил здесь:

Дело происходит в Linux Debian, соответственно, интересует софт, который устанавливается из стандартного репозитория (что подразумевает опенсорсность). 

Для начала я протестировал двумерное Фурье преобразование (прямое и обратное) на широко известном тестовом изображении Lenna. Заодно в процессе поиска нужных функций увидел заметки об истории этого изображения Просто Лена и Обработка изображений: кто такая Лена

Выбор софта для такой типичной задачки вполне себе наличествует:
На практике же оказалось не так радужно, как хотелось бы. Из того, что есть в дебиане, работает "из коробки" только пакет octave. Зато для него можно установить множество расширений - например, необходимый мне пакет octave-image. Если же расширения нет в дебиан, можно установить из репозитория octave. Например, если мы хотим поставить последнюю версию разширения для работы с изображениями, качаем архив image-1.0.15.tar.gz: и далее в текущей директории выполняем:

aptitude install octave3.2-headers 
sudo octave
pkg install image-1.0.15.tar.gz
exit

Как видим, впечатление octave производит самое приятное. К сожалению, не умеет задействовать несколько ядер процессора, это досадно.

Далее я занялся тем, для чего, собственно, и подбирал софт. А именно, построением 3D модели земных недр по космоснимкам высокого разрешения. Несколько ссылок из предметной области:


На 32-бит хосте обработка космоснимка порядка 60 Мб размером требует около 1 Гб ОЗУ. Если же выполнять передискретизацию (скажем, уменьшить матрицу значений в 3 или 5 раз), то и намного меньше. Для Landsat 7 панхроматический снимок будет имеет вдвое большее разрешение и примерно вчетверо больший размер, так что 60 Мб снимок видимого и ИК диапазонов  соответствует примерно 250 Мб панхроматическому. Значит,  8 Гб ОЗУ на 64 бит хосте должно хватить и на обработку панхромата без передискретизации. Интересно, удастся ли это сделать на 32 бит хосте. Скоро проверю и это, как отлажу расчет на ближнем ИК диапазоне. Update. На 32-бит хосте панхроматический снимок прочитать не удалось - octave сообщает, что невозможно выделить требуемый объем памяти.

Статьи и документация по Octave плюс еще некоторые полезные ссылки:

среда, 14 декабря 2011 г.

MS Excel XML to CSV

XSLT file excel2csv.xsl
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:mso="urn:schemas-microsoft-com:office:spreadsheet" version="1.0">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/">
   <xsl:for-each select="mso:Workbook/mso:Worksheet/mso:Table/mso:Row">
        <xsl:for-each select="mso:Cell">
                <xsl:value-of select="mso:Data"/>
                        <xsl:if test="position()!=last()">
                        <xsl:text>      </xsl:text>
                        </xsl:if>
        </xsl:for-each>
        <xsl:text>&#10;</xsl:text>
   </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Important: you may replace 4 spaces in "<xsl:text>      </xsl:text>" to single tabulation (or any other delimiter)!

Use as
cat file.xls | xsltproc excel2csv.xsl - > file.csv

пятница, 25 ноября 2011 г.

Lossless музыка: ape+cue и flac+cue

Как мне недавно имели честь сообщить, аз есмь ретроград - не слушаю Vinil RIP :) В самом деле, по старинке обхожусь mp3. Собственно, когда-то проблемы были с воспроизведением lossless форматов, а разницы с mp3 не заметил. Но вот сегодня доступно много всякого разного именно в виде рипов виниловых пластинок, из того что я давно хотел отыскать - так что разбираемся.

1. Если у нас есть flac+cue - достаточно привести к юникодной кодировку (текстового) файла cue:
cat *.cue | iconv -f cp1251 -t utf8 > .cue
Впрочем, необходимо это только тогда, когда имя файла flac содержит не-латинские символы - в ином случае все можно прослушать и без перекодировки.

2. Когда у нас наличествует набор файлов ape + cue, ставим пакеты pacpl, flac и monkeys-audio (для установки последнего нужно подключить репозиторий http://www.debian-multimedia.org/) и далее перекодируем (здесь команда рекурсивно пройдет все подкаталоги в поисках файлов ape и создаст файлы flac):
pacpl -t flac -o ape -r .
Как и выше, перекодируем файлы cue в юникод и меняем в них имя_файла.ape на имя_файла.flac

Прослушать файлы cue умеет audacious ( в нем можно настроить определение кодировки CP1251 для файла cue и проч.) и qmmp (работает в однобитной кодировке, так что кириллические названия в нем увидеть не удастся, но прослушать трэки - можно). Из прочих популярных плееров _не справились_ с задачей amarok, rhythmbox, juk и smplayer.

Ссылки:
Работа с flac+cue и ape+cue в Debian
Converting Monkey’s Audio (ape) to flac in Ubuntu
Split lossless audio (ape, flac, wv, wav) by cue file in Ubuntu

(C) Alexey Pechnikov aka MBG, mobigroup.ru