yury_finkel: (манул)
Итак, объясняю, как под виндой поймать переключение языка ввода любого (в том числе и консольного) окна.

Ставится глобальный хук на события WH_SHELL (а раз он глобальный, то это необходимо делать в dll). Когда код события равен HSHELL_LANGUAGE, это значит, произошло переключение языка в окне, при этом в lParam содержится код языка (а в wParam — дескриптор окна, но он нам не нужен). Чтобы передать эту информацию нашему приложению (напомню, что переключение языка происходит в другом приложении, поэтому никакие глобальные переменные не помогут), можно просто послать широковещательное сообщение с wParam и lParam в качестве параметров, а наше приложение должно будет поймать это сообщение и предпринять необходимые действия (например, отобразить флаг, соответствующий языку, в трее).

Привожу полностью код dll на Delphi (компилируется также Lazarus'ом). Можно и на C написать, но мне удобнее так.

hooksh.dpr )

В скрипте на AutoHotKey это событие можно обработать, например, так (в начале идёт инициализация dll):

фрагмент cxswitch.ahk )

Полностью исходный код моей самопальной переключалки клавиатуры можно скачать здесь, а работающие скомпилированные бинарники (для 32- и 64-разрядной винды) — здесь. Переключалка клавиатуры работает не по циклическому принципу, а по принципу «одна клавиша — один язык». У меня, например, на левый Shift назначен английский, а на правый — русский. (Кстати, срабатывает только короткое нажатие — я специально так сделал во избежание ошибочных нажатий). Флаги языков и звуки переключения можно добавлять самому, просто назвав соответствующие файлы по коду языка (например, enu.ico, enu.wav и rus.ico, rus.wav). Настройки — в файле cxswitch.ini. Кроме того, в переключалку встроен ввод эсперантских букв с диакритиками (включается и выключается по Alt+Ctrl+Space), ввод кавычек-лапок по RAlt+< / RAlt+> и длинного тире по RAlt+-, а также ввод некоторых европейских диакритик, например, «a RAlt+'» даёт «á» (если включен режим «Диакритика», см. меню в трее).

В целом, всё сделано так, как удобно лично мне, если кому-то что-то не нравится — исходники открыты.
yury_finkel: (манул)
К дню программиста. Уже вторую (если не третью) неделю у меня идефикс написать переключалку клавиатуры моей мечты (для виндов, т.к. под ними я живу). Пишу на AHK (AutoHotKey). И вот есть один затык, который лично для меня не важен. но заради универсальности... Короче, никак не удаётся под Windows 10 определить текущую раскладку клавиатуры для _консольного_ приложения. Нашёл было способ, но он базируется на недокументированной функции WinAPI GetConsoleKeyboardLayoutName, которая работала в Windows 7, а в Windows 8 и тем более 10 уже не работает. И главное, гугленье (многодневное!) ничего не даёт - все только жалуются, что, мол, никак, и никто не знает ответа. А те кто знает, ЧСХ, молчат. А то, что есть те, кто знает - без сомнения, т.к. всякие там Punto Switcher'ы нормально определяют раскладку и у консольных окон.

И ведь не то чтоб мне это было сильно нужно - я использую FAR с ConEmu, а он сам эмулирует консоль и там можно использовать обычный способ для обычных гуёвых окон. Но заело меня, хочу разобраться. Маньячу вот потихоньку, чуть ли не всё свободное время... Сам знаю, что дурью маюсь, но заело.
yury_finkel: (манул)
1. Новый Firefox 48 с включённой многопроцессностью (для этого нужно подшаманить в about:config) оказался чрезвычайно приятен в использовании - сильно повысилась отзывчивость интерфейса, даже на медленных компьютерах. Прямо не нарадуюсь.

2. Windows 10, несмотря на моё предубеждение, оказалась довольно удобной с новой кнопкой Пуск (в отличие от Windows 8 и Windows 8.1, где обязательный переход по этой кнопке в полноэкранный режим вынуждал ставить Classic Shell). И бегает пошустрее даже, чем Windows XP (правда, за счёт повышенного потребления памяти, но не так чтобы уж сильно намного больше жрёт).

3. PHP постепенно превращается в приличный язык. Правда, к моменту, когда на хостингах PHP 7 вытеснит PHP 5, пройдёт, наверное, года два, не меньше (на моём сайте, например, до сих пор стоит древний 5.2). Хотя одним из главных недостатков PHP я считаю неявное объявление локальной переменной (стоит лишь опечататься в одной букве, и долгий поиск совершенно не отображаемой ошибки обеспечен), а этот недостаток вряд ли когда-нибудь будет исправлен из-за совместимости.
yury_finkel: (манул)
Это гениально, я считаю :) Хотя поймут далеко не все.

Оригинал взят у [livejournal.com profile] slobin в Стратегическое
Haskell ещё не захватил мир только потому, что этот результат ему пока не понадобился.

(оригинал у [livejournal.com profile] andrzejn, я слегка подсократил)

... A source package should not be confused with a package source ...


yury_finkel: (манул)
Понадобилось мне сделать многошаговую форму (multistep form) aka wizard в Symfony2. Оказывается, это не так просто, как кажется.

Во-первых, стандартных средств для работы с формами недостаточно. В Symfony всё слишком заабстрагировано, так что непосредственно управлять действиями, которые ты хочешь совершить, нельзя. Когда пытаюсь из первой формы передать управление контроллеру второй формы, Symfony считает, что форма _уже_ завершена, т.к. я нажал кнопку submit (судя по всему, она скрыто передаёт какое-то поле с этим признаком) - и вторая форма не отображается, а сразу отрабатывается, как завершённая.

Далее, пришлось искать расширение для этой цели. Нашёл некий Craue Formflow Bundle, установил. Вроде бы работает, но наткнулся на другую засаду. Во второй форме мне нужно показывать набор единообразных полей в количестве, заданном в первой форме. Набор единообразных полей в Symfony реализуется типом поля collection. Пробую - не работает, зараза. Говорит, что это поле лишнее (мол, в классе данных такого поля нет), и выдаёт его значение = null.

Вчера весь день провёл в чтении нараспев священных текстов документации и шаманских плясках с бубном - ничего не помогло. Сегодня с утра на свежую голову сделал ещё одно шаманское па: зарезервировал заранее в этом поле массив размером 100, а потом его обрезал до нужного размера. Помогло! Эта зараза (craue formflow bundle) _запоминает_ размер поля, заданный при инициализации, и выставляет его именно такого размера, несмотря на то, что в процессе перехода от первой формы ко второй этот размер поменялся. Ну а поскольку раньше я инициализировал это поле массивом нулевого размера, она и резала его до нуля. Причём теперь мне необходимо обрезать этот массив до нужного мне размера два раза: в первый раз при переходе ко второй форме (иначе вторая форма выведет мне 100 полей, а мне столько не нужно), а во второй раз - после завершения второй формы (иначе craue formflow bundle расширяет обрезанный массив опять до размера 100).

И самое главное: в документации об этом - ни слова.

P.S. Ненавижу свою работу.
yury_finkel: (манул)
Натуральный stack overflow в моём мозгу. Основной по работе проект на Java EE, готовый процентов на 90, заброшен ("отложен") полгода назад для того, чтобы сделать сайт на PHP и Symfony. Сайт на Symfony отложен месяц назад для того, чтобы сделать ещё одну задачу (тоже на PHP и Symfony). Эта самая задача с сегодняшнего дня откладывается, чтобы сделать супер-пупер-срочную задачу на PHP (привязанную к старой, но работающей версии проекта на Java и SmartGWT). Это не говоря уже о том, что почти каждодневно возникают "прерывания" для срочных заплаток к старой и очень старой версиям проекта. Всё это написано на разных языках (Java, Groovy, PHP) и на разных фреймворках...

Stack overflooooooow... :(
yury_finkel: (манул)
Вот что я, спрашивается, делаю в отпуске? Программирую, чёрт возьми!

Который день уже сижу над этим скриптом преобразования "Энциклопедии марксизма" в набор статических файлов. Вот только сейчас добил последнюю проблему, и теперь скрипт таки запускает функцию из самого движка pmwiki (добился этого путём хитрых манипуляций с глобальными переменными). Это, помимо повышения производительности (полторы минуты против пяти на моём компе), открывает путь к тому, чтобы сделать полностью автоматический режим - выдача архива статических файлов по запросу. На днях попробую реализовать.

Вообще-то я не собирался программировать в отпуске - я от этого занятия ужасно устал на работе. Но вот заело меня, уже просто из спортивного интереса. Маньяк. (это я про себя).
yury_finkel: (манул)

К предыдущему. В конечном счёте вырисовался такой cmd-файл для того, что мне нужно (причём удалось-таки обойтись без использования встроенного скриптового языка, только ключами командной строки):

@ECHO OFF
SET avidemux="C:\Program Files\Avidemux 2.6 - 64 bits\avidemux.exe"
SET audioCodec="Lame"
SET audioOutputFormat="MP3"
SET videoCodec="Copy"
SET videoOutputFormat="MKV"
IF NOT EXIST !\NUL MD !
FOR %%F IN (%1) DO %avidemux% --force-alt-h264 --load %%F ^
  --audio-process --audio-codec %audioCodec% --output-format %audioOutputFormat% ^
  --video-process --video-codec %videoCodec% --output-format %videoOutputFormat% ^
  --save !\%%F --quit

Сразу говорю: mencoder не пошёл - не смог он просто скопировать видеопоток, несмотря на явное указание - стал перекодировать его, а это мне не нужно (время!). Так что мой выбор avidemux, видимо, правильный. (Во второй строке можно avidemux.exe заменить на avidemux_cli.exe, если нужен именно консольный процесс).

Так что мы, виндузятники, тоже умеем решать проблемы :P. Просто мы не любим, когда они вообще возникают на ровном месте. У линуксоидов вырабатывается рефлекс обходить свои баги, даже не замечая того. У нас, виндузятников, в принципе то же самое. Но я лично не вижу смысла менять шило на мыло. Я вполне счастлив с Виндой (на работе - даже XP) и менять её на ничуть не менее глючную (я на этом категорически настаиваю!) систему не намерен, тем более что глюки там другие и другая идеология отношения к пользователю (которая, как я уже писал, просачивается и в Винду - моя возня с упомянутой программой тому пример).

А проблемы с данной програмой - в пользовательском интерфейсе. Казалось бы, чего проще: сделать окошко, в которое drag-n-drop'ом можно накидать файлов, выбрать для них всех один и тот же набор параметров, задать подкаталог для вывода и нажать ОДНУ кнопку "сделай мне хорошо". Ведь все составляющие для этого уже есть (и drag-n-drop программа уже понимает), и работы там всей от силы на два дня (я, когда программировал на Дельфи, за два дня такое бы точно сваял), но нет, надо огород городить, встраивать скриптовый язык и прочее... Эх вы, юниксоиды, никогда вы не отучитесь мыслить только командной строкой, а GUI воспринимать только как обёртку к командной строке...

yury_finkel: (манул)
Точнее, не сам по себе Unix, а подход к программному обеспечению, стиль, сложившийся вокруг него, который вполне себе проявляется и во многих программах под Windows (чаще - перенесённых с линукса, но не только).

Вот понадобилась мне программа, перекодирующая видео (для дома, для семьи, а отнюдь не для работы). Нашёл я программу, которая удовлетворяет моим требованиям - avidemux. Всё, казалось бы, замечательно, но хочется режима пакетной обработки (перекодировать сразу пачку видео - для сериалов, например). Хотя бы чтобы из командной строки задать, чтобы батник написать. И вроде бы всё в документации про это написано, делаю в точности как написано - не работает. Это уже напрягает, ибо я в отпуске и компьютерные дела такого рода мне осточертели на работе (где они занимают процентов 50 рабочего времени). Ладно, концентрирую расслабленный мозг и лезу на форум программы (англоязычный, естественно). И что я вижу? Оказывается, документация, которую я читал, касается старой версии программы (2011 год). И в старой версии программы скриптовым языком, с помощью которого задавались все параметры пакетной работы, был js (javascript). А теперь, оказывается, они заменили его на Питон!!! При этом полностью выкосив поддержку старого языка, и это при полном отсутствии документации к новой версии программы! И старая версия программы на официальном сайте отсутствует!

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

Вот это и есть unix-подход: программы пишутся для тех, кто может в них разобраться после прочтения кучи мануалов и/или многочасовых проб и ошибок. Да, я, чёрт возьми, программист с 30-летним стажем, да, я могу в этом разобраться (и разобрался в конце концов). Но мне жалко своего времени! Я не красноглазый линуксоид, получающий удовлетворение от секса с gentoo. Я хочу ткнуть кнопку и получить результат, не задумываясь. Я на работе думаю, уже все мозги себе проел. Я просто хочу дома видео посмотреть!

И вот так у них (unix) всё.
yury_finkel: (Default)
Чувствую себя выжатым лимоном. В последний месяц я работал очень напряжённо, а в последние дни вообще на пределе сил, чтобы успеть до отпуска реализовать главные фичи в проекте. Сейчас будто остановился на полном скаку. И только сейчас понял, насколько вымотался...


Запись сделана с помощью m.livejournal.com.

yury_finkel: (манул)
У меня на домашнем компьютере стоит копия моего сайта. До недавнего времени я пользовался пакетом Denwer для PHP и mySQL, но этот пакет был устаревшим и меня заколебал. Поэтому недавно я сделал всё по науке: поставил apache (2.4.12) и mySQL как виндовые сервисы, ещё кое-что похимичил с PHP и т.д. Всё вроде бы работает как надо. НО!

Сегодня совершенно случайно я заметил, что на локальной копии "Энциклопедии марксизма" наблюдается глюк при переходе на ссылку "О произведениях" — передаётся неверный адрес и страница не открывается. Сразу скажу, что на рабочем сервере всё совершенно нормально, глюк вылез именно на локальной машине.

В общем, меня как программиста это заело, и я полдня сегодня просидел у домашнего компьютера, пытаясь выяснить, в чём дело. Как это зачастую в нашей профессии бывает, глюк я исправил (обошёл), но так и не понял окончательной причины. Суть вот в чём: там подключён модуль mod_rewrite, который преобразует удобочитаемые url-и в вызов главного скрипта pmwiki.php с параметрами. В .htaccess написано такое правило:

RewriteRule ^([A-Z0-9\xa0-\xff].*)$ pmwiki.php?n=$1 [QSA,L]

Вроде по логике всё правильно (начальный префикс регулярного выражения тут по специальным причинам, но дело не в нём). Но когда в url присутствует русская буква "х", она съедается! А точнее, съедается второй её байт из юникодного кода. Только и именно с этой буквой. Почему, я так и не понял, гугление не помогло. Съедается именно при подстановке в $1.

Ну, я это дело исправил, тупо добавив перед этим правилом правило

RewriteRule ^([A-Z0-9\xa0-\xff].*)х$ pmwiki.php?n=$1х [QSA,L] #fix a bug on windows

(русская "х" там в utf-8). Т.е. если явно эту букву написать как в поиске, так и в замене, всё работает нормально. Но при подстановке найденного образца почему-то происходит вот такая фигня.

Что это было, Бэрримор? O_o
yury_finkel: (Default)
Перед сном пришла гениальная идея по работе (сегодня всю голову сломал, придумывая). Правда, мелкий своими капризами не дал додумать. Завтра скорее всего окажется, что фигня. Но хоть спать сегодня буду спокойно...


Запись сделана с помощью m.livejournal.com.

yury_finkel: (манул)
Фреймворк Symfony рулит. Просто-таки немеряно рулит. Там даже ORM есть (эдакая Java EE "для бедных"). И шаблонизатор Twig вместе с маршрутизатором позволяют творить чудеса. Особенно в сочетании с jQuery с клиентской стороны.

В общем, месяц, потраченный на изучение, не пропал зря.
yury_finkel: (манул)
Таки jQuery рулит. Приобщаюсь сейчас.
yury_finkel: (Default)
До сегодняшнего дня я в счастливом неведении не знал, что такое аннуитетный платёж. Не скажу, что я знаю это и сейчас, но программу для расчёта этой хрени я должен переработать. Ненавижу всё, что связано с деньгами и бухгалтерией, на этих вещах у меня отключаются мозги...


Запись сделана с помощью m.livejournal.com.

yury_finkel: (манул)
По работе потребовалось склепать примитивное распознавание символов (номера телефонов в графике, сгенерированные без особого изврата). Вспомнил понятие корреляции, сбацал скрипт на groovy. Сегодня, после двух дней экспериментов, наконец-то заработало. Офигеть, действительно распознаёт! (Ясное дело, что это не OCR, там всё гораздо сложнее, но мне достаточно и этого).

Всё-таки знания, полученные на радиофаке, иногда пригождаются. Хоть и основательно забытые — как-никак я закончил институт 28 лет назад и с тех пор почти не работал по специальности: лет 5 после института работал программистом, ещё как-то связанным с обработкой сигналов (тогда, кстати, корреляция тоже пригодилась), а потом уже просто программистом, без всякой связи с радиотехникой (по большей части базы данных).
yury_finkel: (манул)
Такого жутчайшего бардака с представлением даты и времени, как в Java, я больше нигде не видел. Это просто вредительство какое-то. Вчера это прямо вывело меня из себя.

Мало того, что в классе java.util.Date почти все методы объявлены deprecate (я обычно на это плюю и использую их, ибо удобно), мало того, что рядом с Date есть ещё извращённый класс GregorianCalendar (это при том, что не грегорианских календарей всё равно там нет), который обычно рекомендуется использовать (хотя использовать его неудобно). Так ещё и при попытке использовать тип date в базе данных (PostgreSQL) через JPA этот тип на серверной стороне отображается в java.util.Date, а на клиентской какого-то рожна - в третий класс XMLGregorianCalendar, который не совместим ни с одним из вышеперечисленных, чтобы выдрать из него информацию, нужно извращаться, а вот записать мне вообще так и не удалось. То есть с некоторым извратом на клиентской стороне я помещаю в него нужную дату, но на серверную сторону эта сволочь в любом случае передаёт null. То ли там какое-то из полей не дописано, то ли надо было мудрить с аннотациями, чтобы дата отображалась на нужный мне тип...

В общем, плюнул я на это и переделал таблицу в БД на использование unix time (секунды после 1.1.1970, int8, отображающееся на long). Правда, приходится делить/умножать на 1000, т.к. явский Date внутри себя имеет миллисекунды, но это уже мелочь по сравнению с вышеперечисленным.

Я возмущён: какие индусы писали эту часть API? И главное, всем, кажется, по фиг, хотя это широко известная проблема (судя по гуглу). Видимо, все так же, как и я, используют unix time.

Короче, вывод: при работе с Явой нужно в базе данных избегать типов date, time, timestamp и т.п. любой ценой.
yury_finkel: (манул)
Завтра — в отпуск.

А сегодня доделываю последние (ну или предпоследние) штрихи к программе, над которой корплю уже два с половиной года (вот мой пост от 4 февраля 2012 — это самое начало работы). Если быть точным, это третье поколение системы, над которой я работаю уже лет 8. Первое поколение было написано на PHP и MySQL, второе — на Java + SmartGWT и MySQL и работало через веб-интерфейс (но этот путь показал себя тупиковым), а вот теперь третье, написанное на Java EE + Swing + NetBeans Platform и PostgreSQL. Естественно, каждое поколение было написано с нуля, но с учётом опыта предыдущих. Причём первое и второе поколения до сих пор работают (у них несколько разная область применения), а нынешнее, третье, сейчас пойдёт в тестирование и опытную эксплуатацию, и после доработки и исправлений ошибок (где-то через полгода) заменит второе поколение.

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

Вот, например, неполный список сущностей (и соответственно, таблиц базы данных), с которыми работает программа: задачи, события, объекты недвижимости, агенты, фирмы, контрагенты — физические лица, контрагенты — юридические лица, сообщения, услуги, этапы... Всё это взаимосвязано между собой достаточно хитрым образом. Например, задачи могут иметь подзадачи (любого уровня вложенности), т. е. организованы древовидно. К ним могут прикрепляться объекты (не более одного), события, агенты, контрагенты, сообщения... К любой сущности (т. е. к задаче, объекту, агенту и т. д.) могут быть прикреплены вложения (фото, видео, документ, вообще любой файл), а также метки (или тэги), по которым производится быстрая фильтрация. Сообщения (фактически внутренняя электронная почта) тоже организованы древовидно (с ответами), они могут ссылаться на задачи или объекты. И т. д. и т. п.

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

Клиент: 83 класса (*.java), 1.4 Мб исходного текста, примерно 32000 строк.
Сервер: 82 класса (*.java), 550 Кб исходного текста, примерно 17000 строк.
Всё вместе: 165 классов, почти 2 Мб исходников, около 50000 строк.

Это не считая некоторого количества скриптов на groovy, обслуживающих программу.

Может быть, два с половиной года для такой программы — слишком долго, но писал её я практически один (мой непосредственный начальник, он же сисадмин, он же постановщик задач, непосредственно в кодировании участия не принимал, хотя руководил разработкой и генерировал идеи), к тому же с перерывами на другие задачи. К тому же в процессе работы я изучал Swing, Java EE и EJB, с которыми ранее дела не имел.

В общем, хотя с одной стороны я эту работу в гробу видал и жду — не дождусь выйти на пенсию (ещё 10 лет осталось), но с другой стороны — есть некоторое законное удовлетворение от завершения большого дела. Ну как сказать, завершения... Конечно, ещё как минимум полгода, а то и год, придётся программу дорабатывать напильником — в процессе эксплуатации полезут баги и пожелания пользователей. Но основное сделано.
yury_finkel: (манул)
Картинку тут на работе подкинули. Хотя я знаю, что картинка несправедливая (судя по тому, что я читал, Haskell красивый и компактный язык), но всё равно смешно.
yury_finkel: (злой манул)
Не о политике.

Сегодня на работе с утра полдня потратили, чтобы понять, почему при переходе на новую версию PHP (5.5) отвалилось почти всё, но как-то местами. Выяснилось следующее (цитирую документацию на функцию htmlspecialchars): «[параметр] encoding: Определяет кодировку, используемую для преобразования. Если не указано, то кодировкой по умолчанию является ISO-8859-1 для PHP до версии 5.4.0, и UTF-8 начиная с версии 5.4.0». И далее в разделе «Возвращаемые значения»: «Если входная строка string содержит неверную последовательность символов в указанной кодировке encoding, то будет возвращаться пустая строка в случае, если флаги ENT_IGNORE или ENT_SUBSTITUTE не установлены».

Верхний комментарий к документации: «Unfortunately, as far as I can tell, the PHP devs did not provide ANY way to set the default encoding used by htmlspecialchars() or htmlentities(), even though they changed the default encoding in PHP 5.4 (*golf clap for PHP devs*)».

Т.е. если раньше использовался вызов htmlspecialchars($s) (второй и третий параметры опускались и использовалось значение по умолчанию), и всё работало прекрасно, то теперь нужно перелопатить весь код (включая сторонние библиотеки!) и заменить это на htmlspecialchars($s,ENT_COMPAT|ENT_HTML401,"koi8-r"). Иначе такой вызов даёт всегда пустую строку. А функция, между тем, используется довольно часто.

Руки-ноги бы поотрывать за такое «улучшение»! Совместимость? Нет, не слышали!
yury_finkel: (Пин: компрессия!)
Поскольку я постоянно пользуюсь FAR'ом, то и небольшие файлы и скрипты редактирую непосредственно в нём. В редакторе FAR'а есть очень полезный плагин Colorer (в последних версиях он даже стал поставляться в дистрибутиве), который раскрашивает исходные тексты программ на разных языках. По работе мне в последнее время понадобилось работать с языком Groovy, и я с удивлением обнаружил, что поддержки Groovy в Colorer нет (хотя есть огромная куча языков, даже экзотических, от Кобола до Ска́лы, от PL/1 до Эрланга).

Когда-то я разбирался с настройками и прочими потрохами Colorer'а (в пору работы над моим UniRed'ом, который его использует), но за прошедшие 10 лет основательно подзабыл, да и Colorer с тех пор несколько изменился.

В общем, вот результат нескольких дней проб и ошибок, забирайте, если кому надо:

https://www.dropbox.com/s/l49xvayoeroqqoj/groovy-hrc.zip

(Для тех, кто, как и я, будет пытаться продраться через невнятную документацию Colorer'а на ломаном английском и тучу запутанных hrc-файлов для других языков, сформулирую очень кратко основной принцип: в правиле <block> атрибут region описывает, как по умолчанию нужно раскрашивать заданную область, а атрибут scheme указывает, где нужно брать дальнейшие правила для раскраски внутри заданной области).
yury_finkel: (я в рамке)
Единственный первоапрельский розыгрыш, на который я почти попался, это вот этот:

http://blog.jetbrains.com/kotlin/2013/04/the-dot-operator/

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

А вообще не люблю я первое апреля и розыгрыши в любом виде.
yury_finkel: (Default)
Все уже видели, наверное, но всё равно не могу не поделиться:
xxx: Заходит джавист в столовую и говорит «Паблик статик файнал Борщ борщ нью Борщ, пожалуйста."
yyy: балбес он, в таком случае борщ будет доступен для всех, нужно private


А в Scala и Kotlin можно сказать просто вал борщ Борщ :)

P.S. Непрограммисты, не пугайтесь, это программисты так шутят :)

0x100

12/09/2012 10:55
yury_finkel: (Карыч: староват я стал для таких полётов)
Коллег — с праздником, хотя, честно говоря, у меня это программирование уже вот где...
yury_finkel: (Default)
Вчера на работе мысленно сплясал лезгинку на радостях: после 3 месяцев чтения талмудов, биения головой об стенку и криков «ничего не понимаю!» заработал даже не прототип, а зародыш новой программы: 3-уровневое (3-tier) приложение на NetBeans Platform + Java Enterprise Beans, веб-сервисы, Glassfish, все дела... К тому же на клиентской стороне — таблица с пэйджингом (подкачкой по необходимости) данных с сервера, да ещё с lazy loading (т. е. пока данные не подкачались, в соответствующих строках пишется «загрузка...», приложение не затормаживается, а по приходе данных эти строки заменяются данными).

Конечно, там ещё год надо писать функционал, но главное, есть основа, на которой можно строить.

В общем, три месяца долбёжки книжек на английском не пропали зря. А то были моменты, когда я думал уже бросить это всё...
yury_finkel: (Default)
После долгих исканий и метаний (например, пытались смотреть OpenSwing), всё-таки решили остановиться на «классике»: NetBeans Platform. Пришло осознание, что систему нужно полностью переписать, причём не изобретать велосипед, а сделать так, как люди делают. Поэтому поставил себе NetBeans IDE (кстати, потыкавшись и пообвыкшись, понял, что оно не многим хуже Eclipse и даже IDEA, зато в него интегрировано многое) и пытаюсь разобраться с фреймворком. Пока не очень понятно (но что-то начинает проясняться), и ещё пока не ясно, как организовать 3-tier-архитектуру (не знаю даже, как это сказать по-русски: трёхъярусную архитектуру?) — а она нам очень нужна. Судя по всему, надо будет использовать что-то вроде Hibernate на серверной стороне (ещё и с ним придётся разбираться).

Минус во всём этом один: приходится изучать большой материал, совершенно новый для меня (я даже термины-то не все понимаю), да ещё и по-английски. А с возрастом я чувствую, что способность к обучению у меня всё ниже и ниже. Ей-богу, мне проще что-то самому кодить, чем разбираться в том, что понапридумывали другие... На работе меня утешают, что, мол, изучение нового — это тренировка мозгов против маразма :) Но башка всё-таки пухнет. :(
yury_finkel: (Default)
Сейчас сижу, зубрю Swing (оконная библиотека для Java) — я хоть и писал последние три года на Яве, но сразу начал со SmartGWT (приложение было под веб), а теперь вот пришла пора ознакомиться с родной явской библиотекой. В принципе от Delphi не сильно отличается, но я и Delphi уже подзабыл. Поэтому вот, зевая, сижу и доблю 700-страничную книжку Шилдта — до нового года буду долбить.

Параллельно посматриваю в сторону Groovy (планируется включить его в новый проект в качестве скриптового языка). Кажется, неплохой язычок. А когда допилят статическую компиляцию (а уже пилят), он, пожалуй, будет иметь больше шансов стать Java++, чем Scala. Ибо, хоть Scala и крута неимоверно, но её надо серьёзно изучать — она сильно отличается от Java и имеет в себе сразу несколько принципиально новых концепций. В то время как Groovy — фактически расширение Java (за исключением пары синтаксических мелочей) и «въезжать» в него значительно легче. Кроме того, в Scala, по-моему, переборщили с перегрузкой операций: увлёкшись, очень легко написать практически нечитабельный код. И то, что в Groovy для перегрузки операций меньше возможностей, даже хорошо: негде «разгуляться», так сказать :)
yury_finkel: (Default)
Выкладываю исходник написанного мной файла xlpage-windows-1251.php для адаптации движка PmWiki под кодировку windows-1251. Наконец-то он у меня стабилизировался, я реализовал в нём всё, что мне было нужно. По хорошему надо бы послать на сайт pmwiki.org, но лень писать по-английски (активный английский у меня никакой), да и вообще посылать лень. Поэтому выкладываю здесь, может, какой-нибудь такой же страдалец, как и я, нагуглит, и будет ему счастье :)

страшные программистские кракозябры )
yury_finkel: (Default)
Давно меня достало название для пустой ссылки (или неопределённого значения), употребляемое во многих языках программирования и в базах данных: null. Достало потому, что в устном разговоре с коллегами трудно различить фразы «эта переменная (или поле в таблице базы данных) равна нулю (т. е. 0)» и «эта переменная равна null».

Дело в том, что в английском (и французском, кстати) такой проблемы не возникает, т.к. там 0 — это zero. А вот в русском и немецком 0 — это нуль (Null).

Отсюда возникает гипотеза: видимо, те языки программирования, в которых пустая ссылка (или неопределённое значение) называется как-то по-другому, разрабатывали не англоязычные люди. Действительно: Паскаль (nil) разрабатывал Вирт (швейцарский немец), Алгол-68 (nil) — международный комитет (и кажется, рулил им голландец ван Вейнгаарден), Симула-67 (none) — норвежская разработка. В Аде (которую разрабатывали, кажется, французы), правда, есть null, но у французов, как я упомянул выше, также нет таких проблем с нулём.

Правда, не знаю, как быть с Лиспом, откуда, собственно, пошёл nil. Его создал американский математик, но, вероятно, он был несколько грамотнее, чем более поздние компьютерщики (было это в 1958 г.), и, возможно, владел иностранными языками ;)
yury_finkel: (Default)
[eo]
Laŭ peto de [livejournal.com profile] slobin:
3.9 (26-maj-2010):
- Ek nun ignoras regoklavojn (kiel sagoklavoj, PgUp/PgDn ktp) por ke en la reĝimo «rapida tajpado» ne okazu bremsado de ludoj (kiel «Dua Vivo»).

[ru]
По просьбе [livejournal.com profile] slobin:
3.9 (26-мая-2010):
- Ek теперь игнорирует управляющие клавиши (стрелки, PgUp/PgDn и т.п.) чтобы в режиме «быстрая печать» не было тормозов в играх (типа «Second Life»).

http://www.esperanto.mv.ru/Ek/index.html
yury_finkel: (Default)
(Если, конечно, тогда ещё будет пенсия...)

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

Обидно ещё, что никак не могу добраться до электронных книг (на первой очереди — 5 томов Плеханова). Я и так-то лишь с трудом могу читать книги с экрана, а принимая во внимание вышесказанное — вообще никак. Заказал себе было на озоне e-ink-читалку, так ведь облом: после почти месяца ожидания прислали сообщение, что поставщик не прислал девайс, деньги вернут и т.п. Так, видимо, и придётся оставаться чукчей-писателем :(

Ну, а под катом — несколько скриншотов моей многострадальной программы (суммарный размер картинок небольшой — где-то 300 Кб).

Серверная часть написана на Java с использованием фреймворка mina, плюс несколько небольших скриптов на php в качестве прокси (если будут тормозить, перепишу на C под fast-cgi, но пока проблем они не вызывают). База данных — MySQL (но в будущем планируется переход на PostgreSQL).

Клиентская часть (работающая в браузере) написана на Java с использованием smartGWT (GWT — Google Web Toolkit — это, проще говоря, компилятор с Java на JavaScript; smartGWT — это к GWT добавили smartClient — мощную javascript-овскую библиотеку виджетов).

Скриншоты... )
yury_finkel: (Default)
Сабж:
3.8 (23-nov-2009):
- La nova reĝimo de unikoda enmeto iĝis malŝaltebla ("Rapida tajpado"), kvankam ŝaltita defaŭlte. Ĝi estas malŝaltinda okaze de konfliktoj kun programoj, samkiel Ek, interkaptantaj klavaran enmeton, ekzemple, Punto Switcher.

3.8 (23-ноя-2009):
- Новый режим юникодного ввода стал отключаемым (опция «Быстрая печать»), хотя и включённым по умолчанию. Его желательно отключать в случае конфликтов с программами, так же как Ek, перехватывающими клавиатурный ввод, например, Punto Switcher.

Добавлю ещё, что существуют неплохие альтернативы Punto Switcher, с которыми Ek не конфликтует: Key Switcher и Orfo Switcher. Рекомендую использовать их и не компостировать мне мозги ;)
yury_finkel: (Default)
Поправил кое-что в в Ek!, а именно:
  • Korektita: okazadis prokrastoj de enmeto de ĉapelitaj literoj dum rapida tajpado (do ili aperadis en malĝusta ordo). Por eviti tion mi mem en unikoda reĝimo transsendas ĉiujn literojn, ne nur ĉapelitajn, en la enmetan vicon. Tiel konserviĝas ĝusta ordo.
Или по-русски:
  • Исправлено: происходили задержки ввода букв с диакритиками при быстрой печати (так что они появлялись в неправильном порядке). Чтобы избежать этого, я в юникодном режиме сам пересылаю все буквы, не только с диакритиками, в очередь ввода. Таким образом сохраняется правильный порядок.
Качать здесь.

А я приболел. Надеюсь, не свиной грипп :)
yury_finkel: (Default)
Сейчас у меня какой-то затык в делах, всё почти остановилось (кроме работы). Но зато появились кое-какие идеи. В общем, напишу планы на ближайший год (главным образом, для себя, чтобы не забыть). Через год посмотрю, сколько из этого удалось реализовать.

Библиотечка марксизма:

1. Индекс ПСС Ленина. (Уже в работе, надеюсь завершить до нового года).
2. Расширенный индекс Собрания сочинений Маркса и Энгельса (до 40-х томов).
3. Несколько самых важных работ Ленина («Империализм как высшая стадия капитализма», «Государство и революция», «Материализм и эмпириокритицизм», может быть, ещё кое-что).
4. «Теории прибавочной стоимости» (4-й том «Капитала») Маркса.

Этого, думаю, на следующий год хватит :) Дальше будет видно.

Переводы на эсперанто:

1. Закончить «Блистающий мир» (ориентировочно весной — в начале или в конце весны, жизнь покажет).
2. «Дорога никуда».

Программирование:

1. Выпустить ещё одну версию Ek! (есть один глючок, плюс хочу реализовать одну дополнительную фичу).
2. Сделать пару плагинов к FAR 2 (хочу добавить к юникодному редактору FAR'а возможности, реализованные у меня в UniRed'е).
3. Переписать UniRed на движке SynEdit — исчезнет сразу куча проблем (правда, больше не будет работать под Win9x — ну и плевать). И, возможно, спортировать его под Lazarus.

(Долгое время, лет 5, я не мог без отвращения думать о программировании «для души» (т.е. не по работе) — до такой степени мне осточертело программирование собственно на работе. Но неожиданно в последний месяц у меня прорезалось какое-то вдохновение в этой области. Не знаю, долго ли оно продержится... Но выше я указал идеи, которые у меня сейчас вертятся в голове. Может быть, удастся их реализовать).
yury_finkel: (Default)

Решил тряхнуть стариной: обновил (после почти 5-летней паузы) свою широко известную в узких кругах программу Ek! — эсперантизатор виндовой клавиатуры.

Нового там собственно вот что:
3.6 (3-nov-2009): Ŝanĝita la meĥanismo de sendo de unikoda signo; nun ĝi uzas SendInput anstataŭ PostMessageW. Pro tio EK korekte funkcias kun unikodaj konzolaj programoj (kiel FAR 2.0). Probable malaperos aliaj problemoj (pri kiuj oni de tempo al tempo raportas, sed mi ne povas ilin reprodukti), sed verŝajne EK ne plu funkcios sub Vindozo 9x/ME.

Или на общепонятном ;) языке:
3.6 (3-ноя-2009): Изменён механизм посылки юникодного символа; теперь он использует SendInput вместо PostMessageW. Благодаря этому EK корректно работает с юникодными консольными программами (как FAR 2.0). Вероятно исчезнут также другие проблемы (о которых мне время от времени сообщают, но я не могу их воспроизвести), но скорее всего EK больше не будет работать под Windows 9x/ME.

Качать отсюда. Исходники там же.

UPD. Как выяснилось, с FAR 2.0 Ek 3.6 работает только при использовании ConEmu (это такой эмулятор консоли). Ну и ладно. А раньше-то вообще не работал :)

UPD 2. Подправил кое-что, версия 3.6.1 лежит там же. И (вы таки будете смеяться) под Win98 она тоже работает :)
yury_finkel: (Default)
Наконец-то я в отпуске. Чувствую себя выжатым лимоном. Похоже, ещё и погода влияет — как-то мне нехорошо; но и поработал под конец очень напряжённо. В последний день в проекте вылезли серьёзнейшие глюки в самом ядре (в серверной части), причём глюки очень трудноотлавливаемые, связанные с параллельной обработкой. Как только начинаешь ходить в отладчике, или даже вставляешь запись в лог — всё начинает нормально работать (потому что отладчик или вывод в лог отрубают всю параллельность), а в штатном режиме — полный глюконат :( Провозился всю пятницу, так ничего и не нашёл. Ну и плевать. После отпуска разберусь.

К слову, о программировании. Недавно случайно набрёл на очень интересный язык: Scala. См. также здесь. Ей-богу, он мне нравится. Надо будет поизучать. Может, даже попробую на нём что-нибудь сделать. Но, конечно, после отпуска. (Кстати, о пользе моего хобби — выдумывания языков программирования: кое-что из того, что я сам напридумывал (и отчасти отказался, т.к. не смог довести до конца), в этом языке есть. Уже не в первый раз я с таким сталкиваюсь. Так что моё хобби помогает мне быстро понять новые концепции программирования, т.к. я их отчасти уже сам придумал, или, по крайней мере, обдумывал возможные пути решения соответствующих проблем. Так, например, было с замыканиями).

И о переводе. В переводе «Золотой цепи» осталось вычитать (третьим чтением) несколько глав. В принципе работа на два-три дня, но — см. выше — я сейчас, как выжатый лимон. Так что возможно с публикацией немного задержусь.
yury_finkel: (Default)
Напишу сразу обо всём, чтобы не плодить несколько тематических записей.

1. Сегодня отпраздновали 2 года Гоше. Может быть, позже выложу пару фотографий, если будет время.

2. Неделю назад после более полугода активного программирования на Яве открыл в ней фичу, о которой совершенно не знал, а именно: блок инициализации в классе. В обычных классах он особо не нужен, т.к. есть конструкторы (вероятно поэтому некоторые учебники о нём умалчивают, в частности у Шилдта я этого не нашёл), но они очень полезны в анонимных классах. Т.е. можно написать вместо
final FormItem fieldName = new TextItem();
fieldName.setShowDisabled(false);
fieldName.setWidth("*");
fieldName.setName("name");
fieldName.setTitle(«Фирма»);
fieldName.setHeight(26);
вот так:
final FormItem fieldName = new TextItem() {{
    setShowDisabled(false);
    setWidth("*");
    setName("name");
    setTitle(«Фирма»);
    setHeight(26);
}};
т.е. избежать муторного многократного повторения имени объекта. Вот ведь блин, а я-то полгода мучался и плевался на то, что у Явы нет оператора with! Как говорится, век живи — век учись — и дураком помрёшь :)

3. Работаю над библиотечкой. Близка к завершению работа над «Анти-Дюрингом». Осталось самое муторное — предметный указатель. И хочу ещё на его основе сделать «Развитие социализма от утопии к науке» в виде отдельной «книжки». В общем, работы ещё недели на две.

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

5. Был неприятно удивлён обсуждением у [livejournal.com profile] lex_kravetski специальной теории относительности: здесь, здесь и здесь. Я почему-то думал, что он более в курсе. Я в детстве и юности (советской) очень интересовался СТО (и квантовой механикой, к слову, но не про это речь), прочёл массу популярных книжек и пару учебников на эти темы. Конечно, формулы и многие детали я начисто забыл за ненадобностью, поэтому и не встревал в дискуссию. Но дилетантство мне видно невооружённым глазом, причём ладно дилетантство само по себе, но вот когда на этом уровне начинают критиковать общепринятую теорию...

Но у [livejournal.com profile] lex_kravetski ещё терпимо, а вот помню лет 5 назад, когда я ещё тусовался на форуме КПРФ, вылезло несколько «кефирщиков» (приверженцев теории эфира) с бешеной критикой СТО, причём самое отвратное, что один критиковал её, как он думал, с точки зрения диамата. Якобы СТО — воплощение махизма, идеализма, релятивизма (в философском смысле) и ещё чёрт знает чего. Причём было видно, что СТО он не понимает совершенно. Другой вообще на дух не переносил Эйнштейна, потому что он был еврей (ну, тут вообще был клинический случай, но и первый не намного лучше).

Грустно это всё. Нет, я понимаю, что критика в науке необходима. Но за 100 лет в СТО так никто и не нашёл внутренних противоречий (все кажущиеся противоречия — всего лишь результат непонимания), а также противоречий с экспериментами. Это вовсе не означает, что СТО — единственно возможный способ объяснения явлений природы, но пока что никто не придумал другого способа, который объяснял бы их лучше (несмотря на заявления кефирщиков). До тех пор СТО остаётся рабочей теорией, хоть вы разбейте себе башку об стену. И тот факт, что кое-какие положения СТО нельзя непосредственно проверить экспериментом, ничуть не опровергает теорию. Главное, что следствия её проверяемы. Стоимость вон тоже в чистом виде измерить затруднительно... Я уж не говорю о пси-функции в квантовой механике (наблюдаем только её квадрат, а она сама — комплексное число)... И идеализм в этом могут видеть только твердолобые вульгарные материалисты-реакционеры. Для материалистов-диалектиков критика СТО не с позиций физики как таковой, а с позиций «философии» — позор и возрождение метафизики самого дурного пошиба. Я так думаю.

P.S. Пока писал всё это, забыл, что поставил вариться рыбу для кота, вода выкипела, и рыба сгорела. Вспомнил, только когда почувствовал запах горелого. Вот же ж блин, склероз... Бедный кот, останется завтра без завтрака :( Хотя может удастся наковырять жареные кусочки :)
yury_finkel: (Default)
Поскольку я сейчас нездоров, серьёзными делами заниматься нет сил, то опубликую всё-таки мои наброски "языка программирования моей мечты", о котором я уже упоминал. Это именно наброски, конспект — скорее для себя самого, чтобы не забыть. Я не стал оформлять в БНФ, думаю, опытным программистам достаточно неформального описания. Ну и, конечно, далеко не все вопросы проработаны, есть кое-какие вещи, которые ещё не устоялись (да и вообще этот "проект" регулярно подвергается реформам — надо же мне чем-то заниматься, когда стою в очередях ;))

Да, и не стоит ждать никаких откровений: все использованные мной идеи придуманы давным-давно, я просто соединил их вместе.

UPD: Добавил много забытого.

только для программистов )
yury_finkel: (Default)
Поскольку писать мне пока особо не о чем, и к тому же я нахожусь в некотором отупении от (заканчивающейся) простуды, то пост будет программистский.

Недавно в комментах у [livejournal.com profile] rexy_craxy я упомянул о знаменитой ошибке в программе на FORTRAN IV, из-за которой не то НАСА потеряло спутник, не то американские военные — ракету (не помню точно). Расскажу поподробнее.

Вот кусок программы на Фортране:
        DO 20 I=1,5
        ... какие-то операторы ...
20      CONTINUE

Это цикл с переменной-счётчиком I, принимающей значения от 1 до 5 (а 20 — это метка последнего оператора тела цикла, в данном случае пустого оператора CONTINUE). Тут всё нормально.

Но вспомним, что запятая и точка на клавиатуре расположены рядом. И вот однажды программист опечатывается и вместо запятой вводит точку:

        DO 20 I=1.5
        ... какие-то операторы ...
20      CONTINUE

Как ни покажется странным, этот кусок нормально проходит компиляцию. Почему? Да потому, что 1) в Фортране пробелы внутри идентификаторов ничего не значат, 2) переменные в Фортране можно не объявлять (их тип определяется по первой букве идентификатора). В результате первая строка теперь означает присваивание числа 1.5 переменной DO20I (типа FLOAT).

В результате происходит следующее: присваивание числа некоей далее не используемой переменой, выполнение операторов один раз (к тому же переменной I, вероятно, уже было выше присвоено какое-то значение, так что ошибки не происходит) и... всё. Т. е. вместо цикла получаем однократное выполнение тела цикла со "случайным" значением переменной-счётчика.

Компилятор на такую ошибку не ругается. Ошибок времени выполнения тоже не происходит. Представьте, насколько трудно отловить такую ошибку, особенно при тогдашней (60-х годов) технике отладки программ (а если это всё было на перфокартах?!)

Вот так вот ошибка, допущенная при разработке синтаксиса языка, провоцирует трудноотлавливаемые ошибки при программировании. И программиста, допустившего такую ошибку, просто грех ругать чайником и т.п. Ему только посочувствовать можно. Я считаю, что в таком случае не программист виноват, а язык программирования (точнее, его разработчики). (Кстати, чтобы смягчить эффект, ЕМНИП, в FORTRAN-77 разрешили писать запятую перед переменной-счётчиком: DO 20, I=1,5; если запятую не писать, то компилятор выдавал предупреждение).

То же самое происходит и в C/C++. Но об этом я умолчу, т. к. фанаты C воспринимают наезд на своего кумира весьма болезненно :)

Практический вывод для меня такой: никогда не пренебрегать предупреждениями (warning'ами) компилятора. Современные компиляторы пытаются исправить такие ошибки в синтаксисе языка тем, что сомнительные (но допустимые с точки зрения синтаксиса) места пропускают, но помечают предупреждением. Так вот, я всегда стремлюсь не оставлять ни одного warning'а в своих программах — на любом языке. Даже если это всего лишь предупреждение о неиспользуемой переменной. Что и рекомендую всем.

September 2017

M T W T F S S
     123
45678910
11121314151617
18 19 2021222324
252627282930 

Синдикация

RSS Atom

Развернуть каты

No cut tags