yurikhan: (Default)

Microsoft закрывает MSN Messenger, поэтому надо успеть.

У MSN Messenger’а были ужасные коды смайликов. Особенно вот эти меня бесили: Girl (X), Guy (Z), Thumb up (Y) и Thumb down (N). Потому что с ними любая математика с функциями и аргументами внезапно превращается в непонятно что.

А пересечься с смайликами MSN’а мне довелось, когда я пользовался одним из первых мультипротокольных instant messenger’ов — Trillian. Там смайлики задавались темой оформления, и многие темы были совместимы с MSN’ом.

yurikhan: (Default)

Что-то я не понимаю.

Мне звонят с незнакомого номера, обращаются по имени-отчеству. Представляются какой-нибудь организацией, с которой я когда-либо имел дело — банком, в котором у меня кредит, или кадровым агентством, которое устраивало меня на мою текущую работу. И дальше начинают что-нибудь предлагать или спрашивать.

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

Модель угроз пока не вижу (ну, кроме «назовите ваше кодовое слово»), но что-то тут не так.

yurikhan: (Default)

Есть ровно один канонический интерфейс парсера. На вход подаётся строка или поток символов, на выходе — одно из трёх:

  • распарсенный объект и остаток входной строки;
  • распарсенный объект и пустая строка, если ничего лишнего не осталось;
  • объект ошибки с указанием места во входной строке.

Если вы парсер и ваш интерфейс не позволяет различить первые две ситуации, то эти лучи поноса — вашему разработчику.

#ненависть #mongo #jsoncpp #wellknown

yurikhan: (Default)

В вебфорумостроительстве есть типичная холиварная тема: Плоские темы vs Древовидные темы. У того и другого подходов есть свои плюсы и минусы, мы их здесь обсуждать не будем.

Почти все почтовые клиенты сходятся в том, что email относится к Древовидным. (Единственное известное мне исключение — Gmail, который считает, что к Плоским.)

Далее, почти все клиенты, умеющие группировать письма, отображают их в виде, натурально, леса. Где сообщения — вершины, а рёбра выражают тот факт, что одно сообщение является ответом на другое (в терминах заголовка In-Reply-To).

Внимание, вопрос! Что не так на этой картинке?

Read more... )
yurikhan: (Default)

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

Вот, например, «Эгея» Ильи Бирмана форматирует рассылаемые сообщения так:

Subject: имя комментирует топик
From: blog@ilyabirman.ru

Казалось бы, максимум информации в сабжекте, хорошо. Но к чему это ведёт?

А ведёт это к тому, что в почтовом клиенте комменты к одному посту группируются в треды по ключу (автор, топик). Когда разные комментаторы начинают друг другу отвечать, то следить за дискуссией становится невозможно.

В ЖЖ/DW письмо выглядит так:

From: ник - LJ Comment <lj_notify@livejournal.com>
Subject: Reply to (your entry|(your|a)comment in) "топик"
In-Reply-To: comment-#######-######@livejournal.com>
References: <entry-#######-#####@livejournal.com> <comment-#######-######@livejournal.com>
Message-Id: <comment-#######-######@livejournal.com>
  • Что хорошо: ник комментатора унесён в From, где ему логически и следует быть. И иерархия сообщений явно прописана.
  • Что недостаточно хорошо: вариация сабжектов в пределах одного топика мешает GMail’у поддерживать эту иерархию.
  • Что плохо: к сабжекту добавляется большой хвост в начале.

Как надо делать:

  1. Все комменты в один топик должны иметь по умолчанию один сабжект. (Допустимо, но, вероятно, нежелательно отражать в сабжекте оповещений изменение сабжектов комментов, если движок это позволяет.)
  2. Этот сабжект должен быть насколько возможно коротким и при этом однозначно связываться с постом. Например: «Re: топик». (Если движок допускает неозаглавленные посты, заглавием считать первое предложение.)
  3. Если движок реализует линейные комментарии, то следующий комментарий должен становиться In-Reply-To: к предыдущему. Если древовидные, то дочерний комментарий должен становиться In-Reply-To: к родительскому. (Для этого движок должен сам раздавать Message-Id’ы, а не полагаться на систему доставки почты.)
  4. Текст того, на что отвечают, не должен автоматически цитироваться в оповещении. (Rationale: длинный пост в ЖЖ.)
  5. Ссылки на исходный пост, коммент, родительский коммент, отписаться, отмодерировать — должны быть в «подвале»/подписи. Или, если получатель предпочитает HTML mail, то ссылками в шапке: ник replied to (your|a) comment to “название поста”.
yurikhan: (Default)

В последнее время развелось много разных веб-фреймворков, которые везде пихают гарнитуру Helvetica Neue. Пожалуйста, перестаньте!

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

Навязывать пользователю незнакомый шрифт для основного текста — это неуважение к нему. У всех уже есть любимый шрифт с засечками, любимый шрифт без засечек и любимый моноширинный шрифт; для body text нужно использовать их.

Эмбедить шрифт только для заголовков — в принципе можно, но жалко.

А фолбек ещё нужно правильно написать. В лучшем случае там пишут запасными Arial, Helvetica, sans. В худшем — Helvetica, sans. Знаете, что подставляется на Ubuntu при указании Helvetica? Nimbus Sans L. А у него для кириллицы ужасные формы и чудовищный кернинг.

Если уж вы решили использовать лучшую гельветику из тех, что установлены у пользователя — воткните Liberation Sans перед Arial’ом.

yurikhan: (Default)

На недельку до второго Я уеду в Комарово, В синем море тонут лодки И большие корабли. Я на море буду разом Кораблем и водолазом, На морской песок роняя Золотые сундуки, Золотые сундуки.

На недельку До второго Я уеду В Комарово, На морской Песок роняя Золотые Сундуки.

Корабли лежат разбиты, Сундуки стоят раскрыты, Где качается на дюнах Шереметьевский баркас. Если хочешь быть богатым, Если хочешь быть счастливым, Если только захотите, Будет личный водолаз.

На недельку до второго Я уеду в Комарово, Пусть, захлёбываясь в пене, В море тонут корабли. Водолазы ищут клады, Только кладов мне не надо, И тогда твоими станут Золотые сундуки, Золотые сундуки…

На недельку До второго Я уеду В Комарово, И тогда Твоими станут Золотые Сундуки!

yurikhan: (Default)

Прошу совета у опытных людей.

Вот есть аккаунт на корпоративном IMAP-сервере. В него сыплются письма по разным проектам, иногда много. Если за этим не следить, то скоро они перемешиваются и хрен что найдёшь. Даже с message threading’ом.

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

  1. Письмо, имеющее в сабжекте имя проекта, относится к этому проекту. (Это идеальный, но недостижимый случай — реальные люди не пишут точное машиночитаемое имя проекта в сабже.)
  2. Письмо, которое я пометил руками, относится к проекту. (Это видится как необходимый и достаточный ручной труд.)
  3. Ответ на письмо, относящееся к проекту, также относится к проекту. (Вот это хочется энфорсить автоматически.)

Механизм сознательно не фиксирую. Это могут быть IMAP-серверные папки, IMAP keyword’ы, клиент-сайд-тэги и т.п. Допускаю переезд с Thunderbird’а на другой клиент, работающий под X11/GNU/Linux.

Хм, нашёл похожую на нужную функциональность в Evolution’е, хоть он монструозен и гномообразен. Держим всё в Inbox’е, создаём лейблы для всех проектов, создаём поисковые фолдеры с условиями «Include threads: All related», «Label is имя проекта» и «Search Folder Sources: Specific folders: Inbox».

yurikhan: (Default)

Шёл отряд по берегу,
шёл издалека,
весь покрытый зеленью
командир полка.
Голова обвязана,
кровь на рукаве,
след кровавый стелется
абсолютно весь.

«Чьи вы, хлопцы, будете,
люди-дикари,
кто под красным знаменем
раненый идёт?»
«Мы сыны батрацкие,
добрые внутри,
Щорс идёт под знаменем,
красный командир.

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

Тишина у берега,
смолкли голоса,
на проклятом острове
падает роса.
Крокодил не ловится,
слышен стук копыт,
знамя Щорса красное
на ветру шумит.

yurikhan: (Default)

Наконец-то на горизонте начали появляться мониторы, которые имеет смысл хотеть и ждать. Первая ласточка — Dell UP2414Q, 3840×2160, 23.8″, 0.137мм, или 185ppi.

Хотя лучше б 16:10, конечно.

yurikhan: (Default)

Вынесено из комментов к посту [personal profile] vitus_wagner’а про pump.io.

Из опыта работы с MongoDB получается, что её писали вредители. Абсолютно весь API и дизайн заточен под то, чтобы как можно сильнее оградить клиентский код от возможности делать полезные запросы к базе и увеличить вероятность непреднамеренного уничтожения данных.

Типичный симптом при использовании Mongo — приложение работает, пока объём или количество документов в базе не превышает некоторого эпсилона, достаточно большого, чтобы проблемы не возникали в тестировании.

Обоснование )
yurikhan: (Default)

Преамбула

Пытаюсь купить билеты на поезд через сайт РЖД. На шаге подтверждения транзакции через схему Verified by VISA, вместо формы ввода кода из SMS, получаю сообщение: «Ошибка аутентификации».

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

Сегодня утром мне не звонят. В обед я пробую ещё раз, снова звоню в поддержку, узнаю, что телефон прописали утром, но все базы прососутся (у них это называется словом «прогрузятся») только к 14:00 Москвы (а было около 14:00 Новосибирска).

Ставлю напоминалку на 17:15, успешно покупаю билеты.

А теперь собственно амбула.

В 18:23 местного времени звонит мне некто с номера +74957219100, и человеческим голосом, похожим на ту оператора поддержки, которую я вчера просил перезвонить, спрашивает: «Юрий Владимирович?» — «Да.» — «Вам удобно сейчас говорить?» — «Да.» — «Это Райффайзенбанк, скажите, пожалуйста, ваше кодовое слово, чтобы мы могли вам сообщить важную информацию.»

Тут у меня срабатывает булщит-детектор, и я говорю: «А как я могу быть уверен, что вы действительно Райффайзен-банк? Вы звоните с неизвестного номера.» — «Этот номер написан у вас на обороте карточки.» — «Минутку, я проверю… Нет, ваш номер не совпал ни с одним из написанных на карточке.»

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

(В принципе, 2ГИС знает, что +74957219100 — это Райффайзенбанк в Москве, на Марксистском переулке, дом 3. И будь у меня андроидофон и 2GIS Dialer, я бы даже смог их вовремя опознать. Но я жду телефонов с GNU/Linux, а не Dalvik/Linux, внутри.)

yurikhan: (Default)

Поскольку скоро о Winamp’е можно будет говорить либо хорошо, либо ничего, то нужно успеть сейчас.

Именно Winamp виновен в двух преступлениях против человечества:

  1. Зоопарк кодировок в ID3-тэгах. По спецификации в ID3v2 допустимы ISO 8859-1 и три вида юникода. А он туда писал текущую ANSI-кодировку винды, маркируя её как ISO 8859-1.
  2. Популяризация скинованных интерфейсов. Именно после Winamp’а разработчики стали массово нарушать гайдлайны UI, оправдываясь тем, что «это работает».
yurikhan: (Default)

Если взять историю заказов на italianopizza.ru, скопипейстить её в LibreOffice Calc и построить график номера заказа от даты, то получается довольно неплохая линейная регрессия с коэффициентом около 12 заказов в день и нулём примерно в 2013-05-21.

И нет, это не рекламы псто.

yurikhan: (Default)

Что заставляет водителей маршруток вешать амулет с иероглифом «удача, богатство» вверх ногами?

yurikhan: (Default)

Вводная: У меня на работе два монитора и Linux с X’ами (хотя все дальнейшие размышления одинаково справедливы и для других систем). Для простоты предположим один workspace (виртуальный стол).

У типичного переключателя окон (скажем, Static Application Switcher в Compiz’е) есть две клавиши (скажем, Alt+Tab и Alt+Shift+Tab), которые показывают список всех окон, позволяют выбрать из них одно, выносят его наверх (в z-порядке) и переключают на него фокус.

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

  • На каком мониторе отображается список? А на каком мониторе он должен отображаться?
  • В списке отображаются окна какого монитора? А должны?

Ответ на левую половину первого вопроса мне неясен. То ли на том, где было активное окно, то ли на том, где мышь. В любом случае, в половине случаев оно вылазит не там, где я ожидаю. Представляется, что в идеале список окон должен отображаться на том мониторе, куда я смотрю. А смотрю я, скорее всего, на тот монитор, где находится то окно, в которое я собираюсь переключиться.

По второму вопросу — отображаются все окна, независимо от расположения на том или ином мониторе. Хотя, по всей видимости, если бы была возможность программно определить, какой именно монитор мне нужен, имело бы смысл показывать только его окна.

Поскольку устройства типа «хрустальный шар» ещё относительно ненадёжны и дороги, а камеры для eye tracking’а тоже ещё та головная боль, есть мысль завести два набора переключающих клавиш. Скажем, LAlt+Tab LAlt+LShift+Tab на левой руке для левого монитора, а RAlt+Enter RAlt+RShift+Enter — на правой руке для правого. Каждый набор показывает список на своём мониторе и отображает окна только своего монитора. Если нажимается переключатель того же монитора, на котором (большей частью) находится активное до этого окно, то сразу выбираем следующее окно; если же другого монитора — то сначала выбираем верхнее окно на нём.

Может показаться, что эта схема требует от пользователя помнить, где у него какие окна. По этому поводу гипотеза состоит в том, что он и так это помнит, причём подсознательно. Кроме того, некоторые панели задач (в частности, панель xfce4) умеют показывать кнопки только своего монитора.

Внимание, вопрос. Что не так в этих рассуждениях? Если всё так, то почему нет никаких наработок по этой теме?

yurikhan: (Default)

Нужно похакать XKB, чтобы символы ~!@#$%|QWFPGARSTDZXCVB набирались только с правым шифтом, а ^&*()+JLUY:{}HNEIOKM<>? — только с правымлевым. А то замечаю за собой вредную привычку нажимать преимущественно левый Shift.

yurikhan: (Default)

За пару недель по вечерам и две недели отпуска:

  • вспомнил детство, восьмибитные игрушки процессоры;
  • дизассемблировал/декомпилировал прошивку своей клавиатуры;
  • нашёл в ней недокументированную фичу (программируемые макросы) и баг в её реализации;
  • поверхностно познакомился со спецификациями USB и HID;
  • переделал обработку медиаклавиш, Num Lock’а и клавиши Fn на схему, более подходящую для кастомизации раскладок;
  • написал веб-приложение для кастомизации;
  • собрал, прошил и протестировал;
  • выложил всё на GitHub.

По мере прогресса описывал свои находки на форуме GeekHack (тут и далее в теме), в результате чего мне (в личку) написали разработчики Truly Ergonomic и предложили для них портировать прошивку ErgoDox (с Teensy на китайскую проприетарщину Megawin). (Я не взялся, под предлогом того, что прошивка ErgoDox по своей природе предполагает, что пользователь будет её дорабатывать, перекомпилировать и прошивать, а у них прошивающая программа только для Windows, что дискриминирует пользователей остальных систем. Но, кажется, они удовлетворятся уже сделанным.)

HTML+CSS+Javascript отлично подошли для написания конфигуратора. JSFiddle — отличная штука. Прошивать USB-устройства оказалось вполне возможно из Windows, работающей внутри VirtualBox’а — полной версии из оракловских репозиториев, с поддержкой USB.

yurikhan: (Default)

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

Как правило, за этим идёт ещё один логичный ход. Цифры 7, 8 и 9 остаются на своих местах, остальные подсовываются под них.

  7   8   9   0   -   =
  7   8   9       -   +

   U   I   O   P
   4   5   6   /

 H   J   K   L   ;
     1   2   3   *

  N   M   ,<  .>
      0       .

А теперь внимание, вопрос. Что не так на этой картинке?

Не так то, что при стандартном расположении рук на клавиатуре в базовую позицию попадают цифры 1 2 3; 4 5 6 набираются с верхнего ряда, а за 7 8 9 приходится тянуться в цифровой. Тогда как при использовании настоящей цифровой секции рука лежит на 4 5 6, 7 8 9 в верхнем ряду, 1 2 3 в нижнем.

Поэтому правильная картинка должна быть, возможно, примерно такой:

  7   8   9   0
      /   *   -

   U   I   O   P
   7   8   9   +

 H   J   K   L   ;:  '"
     4   5   6   0   ↵

  N   M   ,<  .>  /?
      1   2   3   .

(Ноль, может быть, стоит даже выносить на пробел, для полной точности ощущений.)

Profile

yurikhan: (Default)
Yuri Khan

August 2018

S M T W T F S
   1234
567891011
12131415161718
19202122232425
26 2728293031 

Links

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated 2025-07-12 12:29
Powered by Dreamwidth Studios