Личный пост Евгения Дорохина

Дорохин Евгений (51.60КиБ)

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

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

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

В общем, последнее я вкратце изложил этому типчику.

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

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

22 комментария

Itertools для PHP

Внимание! Библиотеку я модифицировал, описанные ограничения уже не соответствуют действительности!

В прошлом, программируя на «Пайтоне» я не раз восторгался модулем itertools и тем как «Пайтон» легко позволяет обращаться с генераторами — есть несколько способов, хорошее разнообразие.

В ПХП недавно генераторы тоже появились, в версии 5.5 есть ключевое слово yield, позволяющее их создавать. Вчера у меня появилась мысль познакомиться с ними поближе и я решил переписать библиотеку itertools на PHP. В интернете я уже встречал несколько таких попыток, но ни одна из этих реализаций не использовала генераторы.

Пример использования ниже (для запуска примера и работы библиотеки требуется ПХП 5.6 и выше):

require 'itertools.php';

use function itertools\islice, itertools\cycle, itertools\iter;

foreach (islice(cycle(iter("ABC")), 10) as $el) {
    echo $el;
}

От оригинальной библиотеки несколько отличий.

Во-первых, все функции принимают на вход в соответствующих параметрах только что-то итерируемое. В «Пайтоне» проще — там, например, строки и массивы — итерируемые, ну а в ПХП — нет. Поэтому передаваемые на итерацию примитивные типы придётся оборачивать в специальный вызов iter. Можно было бы делать это внутри функций, но в таком случае перестало бы работать указание типа, мне не хотелось бы на это идти.

Во-вторых, в «пакет» добавлены несколько полезных функций, которые входят в ядро «Пайтона» — iter, slice, enumerate и xrange, работают они так же, как и в «Пайтоне».

В-третьих, поскольку у ПХП нет возможности именовать параметры при вызове, у фунций product и izip_longest изменён порядок аргументов. От этого тоже можно было бы избавиться, потерей указаний типов в прототипе, но я, опять же, не стал этого делать.

Если не заброшу библиотеку, то, возможно, всё-таки откажусь от указания типов и приведу всё к более совместимому виду.

19 комментариев

Upsert в PostgreSQL

Ура, появился коммит, добавляющий к оператору INSERT «Постгреса» конструкцию, которая позволяет использовать его как upsert (в «Оракле» это конструкция MERGE, в «Майэскуэеле» — INSERT… ON DUPLICATE KEY UPDATE):

-- Обновить, если не удалась вставка
INSERT INTO distributors AS d (did, dname) VALUES (8, 'Anvil Distribution')
ON CONFLICT (did) DO UPDATE
SET dname = EXCLUDED.dname || ' (formerly ' || d.dname || ')'
WHERE d.zipcode != '21201';

-- Если не удалась вставка, ничего не делать
INSERT INTO distributors (did, dname) VALUES (10, 'Conrad International')
ON CONFLICT (did) WHERE is_active DO NOTHING;

Счастье-то какое!

5 комментариев

Itertools для PHP: продолжение

Библиотеку itertools для ПХП я всё же переписал: теперь на вход всем функциям можно передавать что угодно итерируемое. Из ограничений осталось только два: функция iter в моём варианте принимает только один аргумент, а у функций product и izip_longest последний аргумент является обязательным.

Вот, кстати, как переписывается программка итерстрип, написанная мной семь лет назад на «Пайтоне», теперь её можно повторить на ПХП почти один-в-один:

require 'itertools.php';
use function itertools\groupby, itertools\xrange, itertools\chain, itertools\repeat;

function ntrim($letter, $n=3, $replby=1)
{
    $shrink_groups = function($letter, $n) {
        foreach (groupby(chain(repeat('', $n), $letter, repeat('', $n))) as list($item, $grp)) {
            $grp = iterator_to_array($grp);

            yield $item || sizeof($grp) < $n ? $grp : '';
        }
    };

    return array_slice(iterator_to_array(chain(...$shrink_groups($letter, $n))), $replby, -$replby);
}

print_r(ntrim(['', 1, 2, 3, '', '', '', '', 4, '', '']));

Увы, на ПХП всё ещё не так компактно (из-за отсутствия генераторных выражений), но уже очень близко.

4 комментария

Электроника МК85

Рабочий стол с ноутбуком, оранжевым мультиметром, советским микрокалькулятором «Электроника МК 85» с надписью «Подорож А.Н.», инструментами, паяльником и деталями.
Электроника МК-85

Был в гостях у братишки, нашёл свой старый микрокомпьютер «Электроника МК85» 1992 года выпуска. Когда-то я на нём довольно бодро программировал (внутри встроен некий странноватый диалект «Бейсика») и даже зарабатывал.

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

Блок питания, к сожалению, потерян, но сохранились чехол (на фото слева) и само устройство. От батареек для лазерной указки микрокомпьютер не заработал (несмотря на уверения анонимов из интернета), зато заработал от УСБ-порта «Мака», правда на пределе яркости. На фото результат выполнения недокументированной команды «WHO» (выводит «Программу разработал Подоров А. Н.»).

Внешний вид «МК85» был полностью скопирован с калькулятора фирмы «Касио», но внутренности сильно различались. Например, в «каське» стоял четырёхразрядный процессор, а в «МК85» — шестнадцатиразрядный Т36ВМ1-2 (он же — КА1013ВМ2). Для тех лет это был настоящий прорыв.

Насколько я понял из информации в интернете, максимальная частота процессора внутри этого микрокомпьютера — 2МГц (два мегагерца), видимо это в режиме «турбо», который включался нажатием кнопки «плюс» при включении. Но и в этом режиме, насколько я помню, быстродействие было невысоким, что, правда, не омрачало моей радости от обладания одним из первых КПК.

Попробую завтра попрограммировать, если все кнопки там ещё работают.

4 комментария

99 бутылок пива на «Электронике МК85»

«Электроника МК85» и «99 бутылок пива» (86.34КиБ)

56. БЭЙСИК «Электроники МК85». Как я уже сказал, Бейсик (в руководстве он называется «БЭЙСИК») на «МК85» отличается странностями. Например, там фиксированное количество переменных с определёнными (только однобуквенными именами), причём только одна строковая переменная может содержать не более 30 символов (её имя — символ доллара), остальные могут содержать не более семи символов.

Или запись массивов — все числовые переменные, по сути, являют собой один массив. Индекс «один» массива с именем «А» совпадает с переменной «B», а индекс «два» переменной «B» — это переменная «D» и так далее. Так что вы можете использовать что-то одно — либо массив полностью, либо переменные.

Другая неприятная особенность — небольшой максимальный размер строки и программы и весьма ограниченный её размер. Из-за этого принято лепить программу как можно более компактно (что я и сделал).

В общем, представляю вашему вниманию программу «99 бутылок пива на стене», написанную на БЭЙСИКе микрокомпьютера «Электроника МК-85», я запускал, работает:

10FOR B=99 TO 1 STEP -1
20A=B:GOSUB90:PRINT" of beer on the wall, ";:GOSUB90:PRINT"."
30PRINT"Take one down and pass it around, ";:A=B-1:GOSUB90
40PRINT" of beer on the wall."
50NEXT B
60PRINT"No more bottles of beer on the wall, no more bottles of beer."
70PRINT"Go to the store and buy some more, 99 bottles of beer on the wall."
80END
90GOTO100*(SGN(A-1)+2)
100PRINT"no bottles";:RETURN
200PRINT"1 bottle";:RETURN
300PRINT A;" bottles";:RETURN

Микрокомпьютер имеет интересную особенность — длинные строки, не помещающиеся на экране, он автоматически прокручивает, а чтобы человек успел прочитать, после каждой строки происходит остановка интерпретатора, для продолжения надо нажать клавишу «EXE». Точка с запятой после оператора «PRINT» говорит интерпретатору, что строка не кончилась, что позволяет печатать длинные строки несколькими операторами.

Ещё одна особенность — программируемый символ. Один символ, имеющий специальный код можно нарисовать попиксельно. Завтра попробую побаловаться.

4 комментария

Подарок от бывших коллег

250ГБ в подарок (22.37КиБ)

«Яндекс.Диск» сделал подарок — всем бывшим коллегам подарили по 250ГБ места. Очень приятно, спасибо!

Правда сообщение ещё не успели поправить — раньше дополнительные 250 давали пока работаешь в «Яндексе».

4 комментария

JBIG2

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

Пока мы такие документы помещаем в ПДФ сканами в хорошем качестве в формате ДжПЕГ. Увы, это довольно расточительно. К счастью, ПДФ поддерживает не один, а целых три формата графики — ДжПЕГ, ДжПЕГ 2000 и ДжБИГ2. На последний я возлагал большие надежды.

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

Ошибки JBIG2 (34.98КиБ)

К сожалению, у формата есть серьёзный недостаток, на который я тут же и наткнулся.

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

Посмотрите, у меня на скриншоте выше — оригинальный ПДФ (слева) и ПДФ, где графика перекодирована в ДжБИГ2. Как видно при кодировании были перепутаны «п» и «и», «п» и «н». Для слов в документах может это ещё и не смертельно, но для цифр в суммах — беда.

Мне неясно можно ли что-то сделать в этом месте, возможно можно подредактировать кодек так, чтобы он реагировал только на 100% совпадение, но тогда, скорее всего, пропадёт всякий смысл использовать ДжБИГ2.

Остаётся ещё вариант с ДжПЕГом 2000, но с ним возможно, выигрыш будет столь незначительным, что затраты на конвертацию просто не окупятся.

18 комментариев

Опции просмотрщика PDF в Chrome

Многие, наверное, знают что у плагина Эдоуби для просмотра ПДФ есть специальные параметры, которые передаются фрагментом в урле. Эдоуби публиковала эти параметры в разных документах, а теперь они собраны в специальном ЭрЭфСи под номером 3778.

Я для интереса попробовал эти параметры в «Хроме» (там собственный просмотрщик, поэтому я не удивился бы, если бы они не сработали) и оказалось, что три из них всё же работают:

# увеличение на 50%
http://example.org/sample.pdf#zoom=50
# переход к странице №2
http://example.org/sample.pdf#page=2
# переход к главе «Chapter»
http://example.org/sample.pdf#nameddest=Chapter

Подробнее можно прочитать ЭрЭфСи (в частности, в «zoom» можно указать ещё два параметра). Так же параметры можно комбинировать, это тоже работает — если указать их через амперсанд.

4 комментария

100км

100 км на велике (576.82КиБ)

Достиг поставленной цели — проехал 100 км на велосипеде. Ноги довольно ощутимо болят.

8 комментариев

Радио-86РК

Винтажный советский компьютер «Агат» с клавиатурой, функциональными клавишами и синим разъёмом на кремовом корпусе, лежащий на деревянном полу.
Радио-86РК

На снимке — «Радио-86РК», ровно тот самый на котором в 1989 году я научился программировать. Сначала на каком-то «Бейсике», потом на ассемблере. Сегодня родители привезли его из Лениногорска — все эти годы он где-то пылился у дяди, который его и собрал когда-то (компьютер промышленно не производился, предназначался для самостоятельной сборки).

В понедельник отдам в музейчик ИТИС — это высшая школа при КФУ. Её директор и мой хороший знакомый Айрат Хасьянов собирает для студентов небольшую экспозицию старой компьютерной техники.

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

На борту «Радио-86РК» — 2КБ ПЗУ, 16 или 32КБ ОЗУ и процессор — функциональный аналог i8080A. Экран — чёрно-белый, с алфавитно-цифровым режимом отображения. Загрузка программ производилась с магнитофона (в те времена — с бобинного, у нас с братишкой была персональная бобина с нашими программами, кажется даже не одна).

Кстати, в сети есть эмулятор этого компьютера на ДжаваСкрипте, можно посмотреть в какие игры мы тогда играли.

12 комментариев

← сюда туда →