Эта рубрика объединяет посты, которые попадают на Планету разработчиков.
С выходом 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 с сенсорным экраном у меня нет, поэтому проверить работоспособность не могу. Для этой модели реализовано отдельная модель управления (с учётом того, что там собственно тачскрин, а не кнопки), но опробована только на симуляторе.
Делаю много 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 и счастье наступило.
Мораль:
Конкурс прошел. Организаторы бухают, GlobalLogic подсчитывает сэкономленные деньги, а мы, простые программисты из команды «Яволидио», радуемся, что девятичасовая гонка наконец закончилась.
Анализирую произошедшее, прежде всего хочется отметить некоторую двойственность всего происходившего на конкурсе: с одной стороны как бы надо было спешить спешить, бегать, с другой — высокое место по времени не означает ровным счётом ничего. С одной стороны задачи были из серии так называемого «спортивного программирования», с другой — надо было как бы писать красиво и документировано, с третьей — всё это надо было делать ещё и очень быстро. Были сложные задания, на которые отводилось очень мало времени, были совсем лёгкие задачи (определить лежать ли три точки на одной прямой, lol), на которые времени выделялось слишком много. В итоге вышла полная неясность что, как и зачем.
В начале игры, пришло понимание, что C++ при всём своём величии — не самый лучший выбор для решения подобных задач. С другой стороны, написали на нём почти всё, наловчившись под конец. Только пару задач наш штатный вебдевелопер проделал на PHP, дав нам отдохнуть. Опыта олимпиад и вообще подобных конкурсов у нашей команды почти не было.
В середине игры возникло упорное желание бросить всё и пойти смотреть безнадёжный, как тогда казалось, слив сборной Украины в Днепропетровске. Игру продолжили только благодаря врождённой упорности нашего капитана.
В итоге, по времени, мы пришли четвёртыми, хотя реально и того быстрее, просто организаторы затупили в конце. В «поле» наблюдались многочисленные нарушения. Квест же пешеходный, если в команде достаточно человек можно разделиться: одни снимают текущий код, другие — садятся на хвост более успешной команде. Вот и получалось, что некоторые умудрялись пробежать полцентра города за 15 секунд. Организаторы пообещали раздать штрафов (бойтесь, heratoz ;)).
Доигрывал, одним глазом смотря футбол. На вопросе про ГКЧП я как раз сокрушался по поводу не забитого Шевой пенальти, за что был удостоен звания виновного в нефинишировании вторыми.
Бойтесь конкуренты: три ноутбука Леново и три внешних винчестера (экстраполируем призы за 2-е и 3-е места) будут нашими.
Ты понимаешь, что родился по неправильную сторону капитализма, когда... На самом деле, с завидной регулярностью. Ну вот, например, я хочу себе купить ноутбук. Мои основные требования к нему предельно просты: я хочу хорошую видеокарту и не хочу большой экран. Почему-то производители уверены, что если, блин, я плачу за видеокарту, то почему бы мне и не заплатить за 17-тидюймовую поебень. Уважаемые производители, я не знаю какие фокус-группы вы там собирали и маркетинговые исследования проводили, но мне нужен именно такой ноутбук. По простой причине: 90% времени я работаю с подключенным внешним монитором. Просто мне нравится, когда у меня всё с собой. Утром я встаю, кладу ноутбук в рюкзак и еду в офис, а вечером забираю его обратно домой. Мне никогда и в голову не придёт играть в игры на экране ноутбука (вы же ведь пытаетесь всучить мне 17-ку именно для этих целей, не так ли?). Я уже молчу о том, что хорошая видеокарта меня интересует в первую очередь не игр ради, а для комфортной работы, так уж вышло, что она связана с компьютерной графикой. Есть ещё ряд специфичных требований: например, видеокарта мне нужна nVidia, так как ATI/AMD не способна родить адекватные драйвера для Линукса, да и вообще всячески сосёт, хоть и открывает спецификации (а куда им деваться-то?).
И вот я нахожу внезапно ноутбук, который меня бы устроил. И что же? Купить его в Украине (за адекватные деньги) — задача непосильная. Купить его да ещё и выбрать подходящие опции — непосильная вдвойне. Я прошерстил все украинские онлайн и оффлайн магазины и максимум, что я нашёл, это модель G50V с худшей видеокартой, зато двумя жёсткими дисками (всего 640 гигабайт) за невменяемую цену в почти 2200 долларов, в то время как в российских онлайн-магазинах модель Vt с теми же 640 гигабайтами стоит порядка 1500 у.е. (!).
В этой чёртовой стране миллионы людей только тем и занимаются, что кому-то что-то перепродают. У нас экономика такая: всё что мы производим — это металлопрокат на старых советских металлургических комбинатах, жратву (чернозём же, хуле) и программное обеспечение руками специалистов, выученных на обломках старых советских технических вузов. Так продайте же мне нормальный ноутбук, чёрт возьми. Нет, я не хочу договариваться со знакомыми, которые «привезут мне из Штатов» палёное говно без гарантии, не хочу покупать такое же палёное говно на ебэях. Я просто хочу нормальный магазин, который продаст мне нормальный ноутбук за нормальные деньги.
К слову. Информация к размышлению: iPhone официально продаётся в осмеянной полунищей Молдове (пруфлинк), а ещё в таких развитых странах, как, например, Камерун и Гвинея (полный список). Попробуйте найти среди стран Украину.
P.S. Видимо куплю через знакомых в России. Украинские бизнесмены убейте себя.
Оказавшись в данный период времени у руководства не большой, но стремительно растущей, IT-компании, я начинаю понимать зачем вообще нужны менеджеры проектов. Пока что я только в начале этого понимания, но могу точно сказать, какие менеджеры проектов не нужны.
Во всех компаниях, где мне приходилось работать, эти самые менеджеры были абсолютно бесполезной прослойкой между заказчиками, начальством и командой. Они только усложняли жизнь разработчика. Будучи абсолютно неспособны разобраться в сути процессов, которыми они «управляли», они были вынуждены как-то оправдывать своё существование (и зарплату), вмешиваясь в рабочий процесс там, где от него следовало держаться подальше (подсказывать программисту, как ему починить баг, sic!), или просто регулярно отвлекая разработчика необходимостью предоставлять абсолютно бессмысленные отчёты (не всякие отчёты одинаково бессмысленные, я знаю).
Эта информация для Вас, если:
Суть: один мой знакомый организует осенью (сентябрь—октябрь) футбольный турнир для харьковских IT'шников. Собственно, вся информация есть на официальном сайте. Хочу только добавить следующее.
Во-первых, я участвую :-)
Во-вторых, поучаствовать можете и вы. Если вы работаете в более-менее крупной харьковской IT-компании, то с большой вероятностью её руководство получило официальное приглашение от организаторов на электронную почту. Требуйте информации у начальства :-) Если ничего никто не получал или вы, скажем, фрилансер или, к примеру, работаете IT-специалистом, но не в IT-компании, то вам нужно собрать команду (до 15-ти человек, разумный минимум — человек 8) и сделать предварительную заявку, написав организаторам (почта partorg@itleague.kharkov.ua). Если команду вам никак не собрать, но участвовать хочется, всё равно напишите организаторам, возможно, таких как вы желающих наберётся на целую команду.
В-третьих, мероприятие действительно того стоит. Соревноваться Вы будете не с затесавшимися в команды профессионалами из ПФЛ, а с такими же как Вы, программерами, сисадминами, дизайнерами и проджект-менеджерами. Организаторы обещают за этим уследить. Дух соревнования, все дела. Играть будем на ОСК «Металлист» (на комплексе мини-футбольных полей Детской академии). Судить будут профессиональные судьи, лечить профессиональные медики, играть профессиональные футболисты не будут. Цена вопроса: две с половиной штуки с команды смотрите на сайте.
Завершающее напутственное слово: иногда стоит вылезать из-за компьютера. Это я себе :-)
Некоторое время назад в Интернетах обсуждали забавные часы, где на циферблате вместо цифр были оригинальные подписи из области математики, физики и компьютерных наук. Вчера я в рамках любви к KDE 4, написал эмулирующих их плазмоид. «Написал» сказано громко, так как писать пришлось мало (взял код обычных часов :)), больше рисовать. В общем, все интересующиеся могут посетить страничку проекта или страничку на kde-look. С пакетами для разных дистрибутивов пока что плохо (пытаюсь подружиться с openSUSE Build Service), есть только PKGBUILD для моего любимого Arch Linux.
Исходники само собой прилагаются, собрать не так уж и трудно (если, конечно, у вас имеется cmake и devel-пакеты для KDE 4 ). Делается примерно так (в директории, куда предварительно распакованы исходники):
cmake -DCMAKE_INSTALL_PREFIX=`kde4-config --prefix` make sudo make install
UITableView можно настроить так, чтобы пользователь имел возможность менять элементы таблицы местами, перетаскивая их. Естественно, на эти перемещения программа должна реагировать, внося соответствующие изменения в структуры данных, отображаемых в таблице.
Как использовать этот функционал достаточно внятно описано в документации, но есть небольшой нюанс. Если просто задать:
cell.showsReorderControl = YES;
для каждой UITableViewCell (и предварительно выставить для таблицы свойство editing в YES), то ничего не измениться. Для того, чтобы у ячеек таблицы действительно появился контрол, позволяющий перетаскивание, необходимо у UITableViewDataSource определить следующие методы:
- (BOOL)tableView:(UITableView *)tableview canMoveRowAtIndexPath:(NSIndexPath *)indexPath { return YES; } - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { }
Они в любом случае понадобятся для обработки перемещений, но подводный камень тут в том, что если их не будет, то ничего не заработает, что может вызвать трудности, если вы используете эту фичу впервые. В документации этот факт явно не указан.