yurikhan: (Default)

В языках программирования категорически не хватает типов id32_t и id64_t. Внутреннее представление — целое соответствующей битности, набор операций — только сравнение на равенство и неравенство. Ну, может, ещё линейный порядок, для использования в качестве ключей в упорядоченных контейнерах. Но точно без арифметики.

Навеяно очередным ворнингом о неявном преобразовании из знакового в беззнаковое или обратно.

yurikhan: (Default)

Раздаточный материал: Описание протокола WialonRetranslator 1.0 (PDF, 156K, 3 не очень плотных страницы)

Задача 1: Перечислите ошибки, допущенные при документировании этого протокола.

Задача 2*: Перечислите ошибки, допущенные при проектировании этого протокола.

Комменты не скринятся. Ответы выложу через пару-тройку дней.

Upd: [livejournal.com profile] kgeorgiy нашёл практически все ошибки документирования.

Ответы )

Вот с такой фигнёй иногда приходится работать.

yurikhan: (Default)

Итак, с января я работаю на новом месте. А это значит — новая зарплатная карта.

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

2011-02-28 (полтора месяца, блин!). Карточка приехала. На ней написано, разумеется, YURIY KHAN. Отказываюсь получать, отправляю на перевыпуск.

2011-03-16 или что-то около того. Отдел кадров говорит, что ВТБ-24 не признаёт ошибку и отказывается перевыпускать.

Иду в банк, обрисовываю проблему. Принимают заявление.

2011-03-31. Карта готова. Забираю. Заодно подключаю интернет-банк. Закидываю денег на счёт, потому что зарплату пока носят наличкой, а надо кой-чего заказать с Интернета.

Однако же выясняется, что карточки ВТБ-24 не работают с PayPal[информация устаревшая и сейчас может не соответствовать действительности]. Узнаю об этом только дома, заказываю себе отдельную карту для интернет-платежей.

Также обнаруживается, что у ВТБ-24 нет интеграции с системой «Город». Вместо этого есть некий слаборелевантный для новосибирского Академгородка список коммунальных услуг, за которые можно платить без комиссии, и возможность создать шаблоны операций, по которым потом производить оплату всего, чего захочется.

Гляжу на эти шаблоны. Чтобы создать шаблон, нужно заполнить реквизиты получателя (со всеми этими многозначными номерами и кодами) и указать свой номер лицевого счёта. Для каждого отдельного поставщика услуг. Да, а ещё, когда создаёшь шаблон, он сразу не начинает работать, а его сначала ещё проверит Специально Обученный Органический Оператор. @#$%#. Похожу пока в отделение зелёно-белого банка, благо оно как раз по пути на работу.

В очередной визит в зелёно-белый обнаруживается, что они больше не принимают в кассе оплату за городской телефон. Зато у них стоит терминал самообслуживания, который принимает. Рядом с автоматом стоит Специально Обученный Органический Оператор, которая напоминает посетителям о существовании автомата, призывает им пользоваться и объясняет, какие кнопочки нажимать. Нет, автомат сдачу не выдаёт. Да вы не волнуйтесь, зачислите на счёт, оно не пропадёт, ну будет переплата, что такого? Ну или сходите в кассу, разменяйте. @#$%#. В следующий раз иду в другую кассу приёма платежей, там за телефон продолжают принимать нормально.

2011-05-26. Интересуюсь у отдела кадров, почему мне до сих пор носят зарплату наличкой, хотя я карту получил 2011-03-31 и заявление в бухгалтерию написал. 2011-05-27: «всё выясню и вам напишу!» Оооок. Следующая зарплата приходит на карту.

2011-06-17. Тем временем на работе …хм… некие структурные изменения, в связи с чем мы будем менять банк. В корпоративной рассылке на эту тему говорится, что рассмотрели пять кандидатов и выбрали, тадададам, Райффайзен. И дальше восемь аргументов, почему нам должен нравиться Райффайзенбанк, в том числе — «бесплатное зачисление зарплаты», «бесплатное снятие налички», «удобный интернет-банк» и «35 банкоматов по городу». (Однако поиск по 2ГИСу показывает, что, кхм, банкомат Райффайзена в Академгородке ровно один. Я его даже помню, он стоит в ТЦ, в переходе возле платного сортира. Ближайший офис — в Бердске, работает в рабочее время и по утрам суббот.) Тут у меня срабатывает bullshit detector, я совершенно случайно по злому умыслу нажимаю reply all и высказываю всё, что думаю о Райффайзенбанке, о людях, которые умудрились из этих пяти кандидатур выбрать именно его, и о том, что я лично считаю «удобным интернет-банком».

А «удобным» я считаю такой интернет-банк, который обладает тремя желательными свойствами:

  1. Интеграция с системой «Город». У полноценной интеграции, в свою очередь, две стороны:
    • Я могу ввести свой адрес и получить список всех поставщиков услуг, которым я мог бы хотеть платить.
    • В каждый момент времени я с точностью до копейки знаю, сколько денег я должен каждому поставщику.
  2. Работает во всех браузерах под всеми операционными системами. Ну, в разумных пределах. Но комбинация Firefox/GNU/Linux в эти пределы должна входить.
  3. Если мне понадобится делать переводы через этот интернет-банк, то они должны работать, не требуя проприетарных плагинов типа Java или Flash.

На следующий день получаю небольшой нагоняй за reply all, однако конструктив: со всех собрали вопросы/мнения/пожелания и передали финдиректору. Он, правда, особо париться не стал и отфорвардил их как есть в банк.

2011-06-22. Банк, видимо, почувствовал, что может остаться без корпоративного клиента, и прислал ответы. В основном всякая хрень, но рядом с нашим офисом поставят Ещё Один банкомат, а ещё все переводы в другие банки будут идти без комиссии. «Города» нет, но к концу года обещают сделать. И ещё обещают в случае необходимости отправлять в наш офис своих людей, чтобы сотрудникам не приходилось ездить в офис.

2011-07-13. Поставили банкомат. Однако, одно дело, когда банкомат стоит в «Золотой роще», где я почти ежедневно закупаюсь, и совсем другое дело, когда за деньгами нужно куда-то ходить. Присматриваюсь к другим банкам, где бы можно было завести счёт, всю зарплату переводить туда, ну и чтобы интернет-банк с системой «Город».

2011-07-18. Иду на сайт МДМ-банка, которым пользовался на прошлой работе. Вижу объявление, что они отказываются от Фактуры-Лайт и запилили свой собственный интернет-банк с блэкджеком и ш. Задаю вопрос в онлайн-форму, работает ли он под Firefox под Linux’ом, и не отвалился ли «Город».

2011-07-19. Система МДМ Online разработана для работы в Интернет-браузере Microsoft Internet Explorer версии 7.0 и выше. Система «ГОРОД» в рамках МДМ Online не предусмотрена. @#$%$.

2011-08-10. Приносят карточки Райффайзена. На моей написано угадайте что. Не угадали. KHAN YURIY. Пишу заявление на перевыпуск, попутно объясняю сотруднику банка, что мы не в Японии и имя нужно писать впереди фамилии.

2011-08-13. Открываю счёт в Альфа-банке.

2011-08-22. Забираю карточку Альфа-банка. Обнаруживается, что у Альфа-банка интеграция с «Городом» хоть и есть, но неполноценная: если вводишь адрес, то суммы задолженностей не показываются. В мануале написано, что можно ввести номер карты «Город», и суммы будет видно. Но карты «Город» у меня нет.

2011-08-31. Разбираюсь с переводами из Райффайзена. Выясняется, что там всё по последнему слову криптографии; чтобы сделать перевод, нужно подписать заявку приватным ключом. Генерация ключей и подписывание делается при помощи Java-апплета. (Это в веке, когда уже даже Microsoft заявляет о поддержке HTML5.) Апплет, что характерно, не работает в IcedTea, а только под Oracle’овской Java-машиной, которую теперь нельзя ставить deb-пакетом из репозитория, а только качать с официального сайта.

2011-09-16. Звоню в «Город», спрашиваю, как получить карту. Выясняется, что просто так их не дают, а только при открытии счёта в одном из банков-партнёров. ВТБ-24, Райффайзен и Альфа — не партнёры. @#$%#.

2011-09-26. Приедут опять из Райффайзена, привезут исправленную карточку.


Вот какого, спрашивается, хрена? Мне что теперь, идти открывать ещё один счёт, на этот раз в банке, дающем карту «Город»? А если я его закрою сразу, как получу карту, она будет продолжать работать, или тоже сдохнет? И почему было не сделать Просто Форму оплаты с Vis’ы на сайте Города?

yurikhan: (Default)
Рабочий стол программиста должен быть глубиной не менее 80 см. И ещё он должен быть достаточно тяжёлый/устойчивый и с тумбочкой.
yurikhan: (Default)

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

Ну, казалось бы, в номере 6­–8 символов. Грубо 50% времени уходит на их нахождение, остальные 50% — на распознавание. Запустим распознавание символов параллельно, получим довольно дёшево 20­–40% прироста производительности.

Щаззз. 5–10% выигрыша есть, но профилировщик показывает, что общее использование процессора (в процессор⋅секундах) увеличилось. Разбиваем по функциям — тормозит нахождение скелета символа. Ну то есть как тормозит: за один запуск на тестовом наборе в 600 картинок параллельная версия проводит там на две секунды больше, чем последовательная.

Разбиваем её подробнее, до уровня вызовов функций библиотеки IPP. Собираем статистику ещё раз. В топе — вызов ippFilter.

Алгоритм скелетизации построен на анализе окрестностей 3×3 каждого пиксела. Если окрестность имеет определённый вид, то точка является краевой и её можно погасить. Когда на очередном шаге гасить нечего, то, что осталось — это и есть скелет.

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

N[x,y] =  8 A[x-1,y+1] +  4 A[x,y+1] +  2 A[x+1,y+1]
       + 16 A[x-1,y]                 +    A[x+1,y]
       + 32 A[x-1,y-1] + 64 A[x,y-1] +128 A[x+1,y-1]

Вот чего проще, вроде бы: бери свёртку A с ядром

842
1601
3264128

и это будет то, что надо.

Оно, конечно, то, что надо. Но вот выходит, что быстрее сделать вот так:

N[0:w-2, 0:h-1]  = A[1:w-1, 0:h-1]
A <<= 1
N[0:w-2, 0:h-2] |= A[1:w-1, 1:h-1]
A <<= 1
N[0:w-1, 0:h-2] |= A[0:w-1, 1:h-1]
A <<= 1
N[1:w-1, 0:h-2] |= A[0:w-2, 1:h-1]
A <<= 1
N[1:w-1, 0:h-1] |= A[0:w-2, 0:h-1]
A <<= 1
N[1:w-1, 1:h-1] |= A[0:w-2, 0:h-2]
A <<= 1
N[0:w-1, 1:h-1] |= A[0:w-1, 0:h-2]
A <<= 1
N[0:w-2, 1:h-1] |= A[1:w-1, 0:h-2]
A >>= 7

И в параллельной версии, что характерно, время тоже перестаёт теряться.

Так что это мне напомнило? А вот была во времена 386’х такая техника: вместо y*320 брать y<<8 + y<<6. Сдвиги и сложение работали быстрее, чем операция умножения произвольных целых чисел (внутри процессора реализованная через те же сдвиги и сложения). Так и сейчас — быстрее сделать 8 сдвигов (уже целой матрицы поэлементно) и 8 побитовых or’ов (двух матриц поэлементно), чем свернуть матрицу с заданным ядром (которое, в общем случае, может быть произвольного размера и с произвольными весами).

yurikhan: (Default)

Сегодня было мне просветление.

Когда вышла Visual Studio .NET, все страшно тащились от фичи code outlining. Это когда по левому краю идёт такая полосочка, и везде, где открывается блок, на этой полосочке возникает [-]. Который можно ткнуть, и он превратится в [+], а внутренность блока свернётся.

Так вот, этот самый outlining есть зло. Потому что позволяет, сворачивая постепенно части кода, написать такую функцию, которая не поместится нормальному человеку в голову. (Эмпирическое правило 1: длина функции в строках не должна превышать IQ maintainer’а. Эмпирическое правило 2: длина распечатки функции шрифтом разумного кегля не должна превышать рост разработчика.)

yurikhan: (Default)

(Ранее по теме: 1, 2, 3, 4)

У Intel’а есть замечательная библиотека Performance Primitives, в которой реализована куча всяких интересных функций работы с одномерными и двумерными массивами. За одномерные массивы отвечает подбиблиотека Signal Processing Library, а за двумерные — Image Processing Library.

Бо́льшую часть времени эти функции работают как описано. Но когда оно не работает, это жопа.

Read more... )
yurikhan: (Default)

У нас на работе предусмотрено 20 люминесцентных лампочек. Из них:

  • 4 вывернуты и лежат на столе;
  • 12 не работают вовсе;
  • 3 мерцают с разными неприятными периодами от 25 до 2 герц и поэтому обычно выключены;
  • и наконец, одна пока ещё горит нормально.

Ругаюсь, что в сортире светлее, чем у меня на рабочем месте.

yurikhan: (Default)

Когда в проекте находишь формулу E = ∑pS d(p, L),
где p — точка (x, y) на плоскости, L — прямая {(x, y) : Ax + By + C = 0}, а d(p, L) — расстояние между точкой и прямой, равное (Ax + By + C) / √(A2 + B2),
которая вычисляется каждый кадр для ≈8 разных S по ≈1000 точек в каждой и для ≈15 различных L на каждую S,
и оптимизируешь её до E = (Ax + By + Cn) / √(A2 + B2),
причём весь числитель дроби считаешь в целочисленной арифметике,
то производительность этого конкретного куска программы возрастает в 7 раз.




Кто уловил физический смысл E — тому плюс балл :)

yurikhan: (Default)

HeapAlloc само по себе и HeapAlloc в программе под дебаггером — это две большие разницы.

Под дебаггером оно забивает выделенную память значением 0xBAADF00D, а без дебаггера — стесняется. Будь билд хоть трижды дебажный.

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

yurikhan: (Default)
Когда обрабатываешь картинку и эта обработка включает в себя множественные геометрические трансформации (shift, resize, rotate, affine warp, perspective warp), очень хочется привязать к каждой переменной, содержащей координаты, некий ярлычок, чтобы попытка использовать координаты в чужой системе координат сразу приводила к ошибке времени компиляции.

Profile

yurikhan: (Default)
Yuri Khan

June 2017

S M T W T F S
    123
45678910
1112 1314151617
18192021222324
252627282930 

Links

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated 2017-09-19 22:31
Powered by Dreamwidth Studios