Ни больше ни меньше, а прошла целая эпоха. Сегодня я отказался от браузера Opera в пользу Google Chrome. Здесь я остановлюсь, чтобы все смогли осознать сказанное.
Продолжим.
дальше
С выходом iPad'а и 4-го iPhone нам приходится ломать голову над тем, как продлить жизнь наших старых проектов и на этих устройствах. Apple ставит своих разработчиков перед проблемой, от которой ранее их (нас) оберегала — это неоднородная среда выполнения. Если раньше было целых 3 модели телефонов, которые принципиально мало чем отличались друг от друга с точки зрения возможностей, предоставляемых разработчику. Даже разрешение экранов у них совпадало до пиксела. Теперь это совсем не так: iPad — это вообще устройство несколько другого рода, открывающее новые возможности. На 4-м iPhone тоже увеличили разрешение.
Всё это ведёт к тому, что приходиться в той или иной степени адаптировать программу под разные устройства. В хорошо спроектированной программе на UIKit, где святое триединство Model-View-Controller чётко соблюдено, переделать придётся только слой View и вероятно не обойдётся без изменений Controller'а. Но на самом деле это может затронуть и модель, например, если там, условно говоря, «хранятся» изображения, размер которых связан с разрешением экрана (так у нас в одном проекте). А если речь идёт об игровой программе, коих в аппсторе, мягко говоря, немало, то всё становится ещё сложнее: под каждое разрешение, скорее всего, есть отдельный немалый набор графических ресурсов. В связи с этим всем возникает два важных вопроса:
На Новый год подарил Таньке Pocketbook 360, читалку книг на e-ink от отечественных производителей. Как фаната опенсорс меня в ней в первую очередь привлекла открытая (якобы) прошивка и доступный SDK. Затем поучаствовал в конкурсе по написанию игр под эту читалку. Выбрал игру «Балда». Игры в слова как-то очень логично смотрятся на устройстве для чтения книг, не так ли? Да и для динамичных игр с анимацией экран на «электронных чернилах» не слишком приспособлен. Вмешалась работа, не всё удалось реализовать, но кое-какую версию я всё же предоставил и даже за неё полагался приз в виде скидки на тот же самый Pocketbook, при чём при доработке программы обещали его увеличить. Приз мне так и не достался, пусть это будет на совести организаторов. На форуме другие участники писали, что надо было очень постоянно напоминать организаторам об обещанном, и приз-таки можно было выбить, но в моей личной идеальной картине мира подобные дела так не делаются.
А программу я таки доработал и теперь выкладываю версию 1.0.2. Надеюсь, владельцам Pocketbook будет полезна. Собственно, она позволяет играть в Балду. Играть можно против компьютера (3 уровня сложности) и друг против друга. Поддерживаются (теоретически) все модели Pocketbook с прошивкой начиная с версии 14. Модели 302 с сенсорным экраном у меня нет, поэтому проверить работоспособность не могу. Для этой модели реализовано отдельная модель управления (с учётом того, что там собственно тачскрин, а не кнопки), но опробована только на симуляторе.
Потребовалось в баш-скрипте получить объём виртуальной памяти, выделенной процессом. Получилось так (через ps aux):
MEMORY_USED=`ps aux | awk -v pid="$PID" '{ if ($2 == pid) print $5 }'`
Где PID — идентификатор процесса.
Не вся реклама одинаково вредна. У меня есть два примера рекламы, которая оказалась, напротив, полезна.
Во-первых, это реклама в выдаче Интернет-поисковика. Например, Google Adwords. Не раз, и не два именно в рекламных ссылках я находил полезную информацию для себя, релевантную тому, что я искал. Такая реклама обычно что-то продаёт, но ведь и я не против купить то, что мне нужно. Рекламные ссылки находятся в сторонке от выдачи, чуть подсвечены, чтобы формально обращать на себя внимание. Но это же выделение и подсказывает пользователю, что ссылки рекламные, а значит к их содержимому нужно отнестись соответственно. Не в том смысле, что оно не достойно внимания, а в том, что оно может с большей вероятностью оказаться не тем, что нужно.
Во-вторых, более конкретный пример. О ноутбуках ASUS серии UL я узнал на Хабре, популярном айтишном ресурсе. Не из дебильноватого флеш-баннера, как можно было подумать, а из интересного и полезного обзора. Автор этого обзора — сотрудник самой компании ASUS. Сильно ли он приврал насчёт продукта своей компании? Вопрос ирреллевантен. Обзор нейтрален и избегает давать оценки, приводя в основном факты. Ноутбук мне сейчас не нужен, однако эту модель я бы купил себе и посоветовал другим.
Что объединяет эти два случая? В первую очередь то, что рекламу я получил именно тогда, когда захотел, и именно о том, о чём захотел. Реклама не лезла мне в глаза и уши, не совала в руки какие-то совершенно ненужные вещи (женские прокладки, ага). Во-вторых, реклама была к месту. Обзор ноутбука находился на айтишном ресурсе, самое подходящее место, чтобы, собственно, опубликовать обзор ноутбука. Поисковик предложил мне рекламу, когда я собственно попросил его для меня что-то найти, и реклама эта опять же была связана с тем, что я искал.
То есть в обоих случаях это была контекстная реклама. Именно за такой рекламой будущее, а билборды, уродующие и без того не идеальный внешний вид моего города, флеш-баннеры, грузящие процессор, и обклеенные рекламными обоями станции метро должны умереть.
А у вас есть другие примеры полезной рекламы?
Делаю много iPhone девелопмента, брозерс. Из-за чего плотно сел на Мак ОС. Только что дошли руки починить тамошний Терминал. По умолчанию клавиши Home, End, Page Up и Page Down работают там совсем неправильно. Загуглить всё легко, но отчего-то я долгое время просто терпел. Вот здесь нашёл решение. Правда оно не очень крутое, Home и End всё равно фейлят. Но в первом комменте приводится 100% работающий вариант, что даже в vim всё работает как надо.
Короче, в настройках терминала для текущей тему выбираем вкладку “Keyboard”. В списке находим все нужные клавиши и меняем текущие значения на “send string to terminal:” с такими строками:
| Home | \033[7~ |
| End | \033[4~ |
| Page Up | \033[5~ |
| Page Down | \033[6~ |
Внезапно, всё работает.
А текущем проекте возникла необходимость работать с MySQL базой данных из C++. Кроме базового API на «чистом» C, разработчики MySQL (кому она там сейчас принадлежит?) предоставляют надстройки для различных языков программирования, называя их connector'ами. В их числе имеется и красивая высокоуровневая обвязка для C++. Хорошая альтернатива слабо предназначенному для непосредственного использования libmysqlclient, казалось бы.
Вскоре начались проблемы. Случайные вылеты, причинами которых были баги самого мерзкого характера: какая-то дрянь портила чужие области памяти. Потратив предварительно несколько часов, я так и не сумел сходу решить проблему. Уже тогда я подошёл вплотную к MySQL коннектору, но решил что столь явной проблемы (на максимально простом тест-кейсе) в официальной библиотеке быть просто не может, а значит проблема где-то раньше в моём коде. Потому решено было временно отложить решение (вылеты были регулярными, но не столь частыми) и сначала дописать функционал до определённого уровня, что и было проделано.
Пришло время второго захода. В ход пошли хитроизощрённые отладочные техники с hardware watchpoint'ами и утилитами для отслеживания выделения памяти. Снова несколько часов и снова вижу проблему в connector'е. Тут-то я наконец сосредоточенно погуглил и нагуглил письмо в mailing list MySQL, где описывалась похожая проблема. Автор письма потрудился залезть в исходники коннектора (что я уже было собирался делать) и обнаружил там серьёзные проблемы. Кому интересно, подробно могут почитать по ссылке, но суть в том, что там просто элементарная ошибка (и не одна) с освобождением памяти, которая приводит к самым неприятным последствиям.
В итоге, код работы с базой (благо, ещё не разросшийся) был переориентирован на использование сишной libmysqlclient и счастье наступило.
Мораль:
Если вам когда-нибудь, как мне вчера, понадобиться разобрать клавиатуру Logitech Deluxe 250 PS/2, то знайте, что помимо огромного количества шурупов, которые видны с задней стороны клавиатуры, имеются ещё 4: два — под резиновыми ножками снизу (ножки нужно аккуратно сковырнуть, а потом при обратной сборке придётся клеить обратно), а ещё два — в районе клавиш Caps Lock и «+» на дополнительной клавиатуре (крышечки клавиш надо снять).
На других клавиатурах, возможно, также подобное встречается. У меня, на то, чтобы понять, как эту чёртову клавиатуру раскрутить ушёл хренов час. И интернеты мне не помогли.
UPD. Благодарные читатели сообщают, что модель 350 разбирается похоже. Только не надо снимать резиновые ножки (под ними пусто). Есть только 2 скрытых винта под кнопками (там же где и к 250-й).
Конкурс прошел. Организаторы бухают, GlobalLogic подсчитывает сэкономленные деньги, а мы, простые программисты из команды «Яволидио», радуемся, что девятичасовая гонка наконец закончилась.
Анализирую произошедшее, прежде всего хочется отметить некоторую двойственность всего происходившего на конкурсе: с одной стороны как бы надо было спешить спешить, бегать, с другой — высокое место по времени не означает ровным счётом ничего. С одной стороны задачи были из серии так называемого «спортивного программирования», с другой — надо было как бы писать красиво и документировано, с третьей — всё это надо было делать ещё и очень быстро. Были сложные задания, на которые отводилось очень мало времени, были совсем лёгкие задачи (определить лежать ли три точки на одной прямой, lol), на которые времени выделялось слишком много. В итоге вышла полная неясность что, как и зачем.
В начале игры, пришло понимание, что C++ при всём своём величии — не самый лучший выбор для решения подобных задач. С другой стороны, написали на нём почти всё, наловчившись под конец. Только пару задач наш штатный вебдевелопер проделал на PHP, дав нам отдохнуть. Опыта олимпиад и вообще подобных конкурсов у нашей команды почти не было.
В середине игры возникло упорное желание бросить всё и пойти смотреть безнадёжный, как тогда казалось, слив сборной Украины в Днепропетровске. Игру продолжили только благодаря врождённой упорности нашего капитана.
В итоге, по времени, мы пришли четвёртыми, хотя реально и того быстрее, просто организаторы затупили в конце. В «поле» наблюдались многочисленные нарушения. Квест же пешеходный, если в команде достаточно человек можно разделиться: одни снимают текущий код, другие — садятся на хвост более успешной команде. Вот и получалось, что некоторые умудрялись пробежать полцентра города за 15 секунд. Организаторы пообещали раздать штрафов (бойтесь, heratoz ;)).
Доигрывал, одним глазом смотря футбол. На вопросе про ГКЧП я как раз сокрушался по поводу не забитого Шевой пенальти, за что был удостоен звания виновного в нефинишировании вторыми.
Бойтесь конкуренты: три ноутбука Леново и три внешних винчестера (экстраполируем призы за 2-е и 3-е места) будут нашими.
Новый сайт Металлиста не стал лучше. Снова добавили бестолковой вебдванольности. Страшный флеш-ролик на пол экрана с последними новостями. Мокрый пол везде, пёстро и бесполезно. В ущерб самому важному — удобству получения информации. Спрашивается, зачем было уменьшать турнирную таблицу на главной? Места что ли не хватало? Разве этот огрызок может быть кому-то полезным?

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