Category: it

Category was added automatically. Read all entries about "it".

2014-04

рубимайн, после выходных

Очень интересно всё с рубимайном получается, конечно. Совсем не так, как я ожидал.

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

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

Поэтому - всё, кто-то нашёл, написал в твиттер, потом перетвитил Боб Мартин, потом DHH, такие новости, сякие новости, и пошло-поехало. Поиск по твиттеру уже внимательно читать не успеваю, на реддите 44 воута и 34 коммента (и это не мы туда новость засабмитили!), количество даунлоадов мне из дома не посмотреть, но тоже наверняка дофига. И проблема уже становится совершенно другой: надо не текстмейтом притворяться, а совсем наоборот, быстро цеплять народ интеллектуальными киллер-фичами, чтобы они сказали "вау!". (А киллер-фич пока что не так много, и они не то чтобы выпячены.) А то народ в среднем реагирует примерно так, что "я уверен, что потом всё будет круто, но пока как-то ничего особенного".

И я уже начинаю жалеть, что мы не выложили public preview на месяц-другой позже (хотя если бы мы этот месяц-другой сидели и боялись, как нас никто не будет любить, тоже бы на пользу не пошло). И слава богу, что первый билд по крайней мере запускается, не падает, не виснет и даже не очень сильно глючит. :)

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

В общем - что выпущено, то выпущено. Следующим шансом на большую волну информации будет релиз 1.0, так что с ним уже надо не торопиться и сделать-таки конфетку.
2014-04

Meet RubyMine

В этот прекрасный субботний ночер у нас случилось аж два знаменательных события. Во-первых, вышел первый релиз-кандидат IntelliJ IDEA 8.0.

А во-вторых, что для меня существенно более знаменательно, мы наконец-то выпустили первый public preview билд нашего нового продукта - RubyMine, standalone IDE для Ruby и Rails. И это, собственно, и было моим главным развлечением за последний год.

Спасибо Олегу, Роме и Денису, Ане и Жене, а также всем прочим причастным к этому коллегам. Ура! :)
2014-04

JetBrains Day in Moscow

Завтра мы с olegstepanov будем рассказывать, соответственно, про IDEA и ReSharper на JUG в Москве. Встреча будет в офисе Яндекса на Самокатной в 16:00.

Какое-то количество свободного времени у меня будет, так что принимаются предложения встретиться и/или развиртуализироваться. :)
2014-04

продолжаем искать народ

Компания JetBrains ищет специалистов по тестированию ПО.

Проекты и требования к кандидатам.
Нам нужны тестировщики для работы над IntelliJ IDEA, при возможном участии в тестировании IDE для Ruby и Python, а также в проекте TeamCity.

Типичные задачи тестировщика в наших проектах:
  • Работа в паре с программистом: тест новой или изменённой функциональности, поиск дефектов, запись требований в багтрекер, regression test по мере внесения исправлений.

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

  • Воспроизведение дефектов, описанных пользователями, вопросы и ответы пользователям.

Collapse )
2014-04

ICFP Postmortem: Team ryba, part 4

(начало здесь, здесь и здесь)

Итак, что же мы имели по состоянию на начало следующего рабочего дня, позднее воскресное утро? В минусе были несломанный алгоритм шифрования, непонятно куда применимые адаптации, не всегда работающий активатор и загадочный ген hitWithTheClueStick, в котором явно было что-то очень полезное, только вот вытащить это было никак. Зато в плюсе были дизассемблер, таблица генов и некоторое понимание того, как эта штука работает.

А работает она, кстати, крайне красиво. Очень сжато это объясняется в хелпе, только фиг это поймёшь с первого раза. :) В отличие от обычного компьютера, который передвигает instruction pointer по памяти фиксированного размера, в интерпретаторе DNA instruction pointer всегда указывает в начало, зато размер памяти переменный, и код постоянно копируется туда-сюда. То есть, например, вызов функции (гена) - это копирование в начало DNA (в красную зону, если пользоваться терминологией из хелпа) тела функции из фиксированной области (зелёной зоны) и генерация кусочка кода, который потом вернёт управление обратно. Условный переход - это поиск в памяти значения true или false по определённому offset'у и пропуск определённого количества байт, если оно там нашлось.

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

Подробно рассказывать, что именно и как нам удалось пропатчить, я не буду, поскольку организаторы просили-таки не разглашать результаты до их окончательного объявления, а список пропатченных областей практически эквивалентен этому самому результату. :) Так или иначе, времени на эксперименты с разными вариантами патчей ушло довольно много. Занятие это было изрядно ностальгическим - доводилось мне в своё время менять 74 на EB в коде проверки регистрации всяких разных досовых софтинок. :) Здесь дело осложнялось, во-первых, тем, что не было простого способа кодировать переходы назад (вперёд-то просто - инструкции пропустить, а назад - нужно как-то хитро оригинальный код копировать), и во-вторых, тем, что значения true и false в закодированном виде занимали разное количество acid'ов. Так что обходились в основном пропуском кусков методов (в частности, переходов) и изменением числовых параметров, передаваемых в функции.

Интереснее было с битыми генами. Нам намекали, что некоторые гены могут быть повреждены и их как-то можно восстановить, но хитрость была в том, что каждый ген надо было восстанавливать по-своему. Нам удалось восстановить три из них. Для одного из них имелись коды Хэмминга, упоминавшиеся в одной из страничек документации. Вызывать встроенную функцию коррекции мы не научились, поэтому я просто вбил таблицу кодов из википедии (брутфорс - наше всё) и сделал генератор нужного патча на Java. Для другого гена нашлась просто его копия задом наперёд, на которую намекала страничка про палиндромы. С третьим оказалось совсем смешно - он был заражён вирусом. :) С вирусом разбирались Майк с Лёшей, поэтому рассказ о том, в чём там была фишка, я оставлю им.

По дороге Майк с Лёшей ещё больше ускорили нашу рендерилку, и к концу она справлялась с отрисовкой картинки уже всего за полторы минуты.

Последние префиксы, которые мы пытались отсылать на сервер уже в начале шестого утра, почему-то результата совершенно не давали, но мы решили, что утро вечера мудренее, и пошли по домам спать. :)

Ну и в понедельник, за последние два с половиной часа контеста, мы с Лёшей подчистили хвосты, починили некоторые из патчей, которые не заработали в воскресенье, и получили в итоге вполне весомое улучшение итогового результата. Насколько он в итоге хорош - узнаем в октябре. :)

Суммарное время, потраченное на работу, получается примерно таким: 16 часов в пятницу, 14 в субботу, 14 в воскресенье и 2 в понедельник. Итого 46 из 72. При этом я не могу сказать, что у нас было много больших продолбов или хождения по ложным следам - основная часть времени была потрачена вполне по делу. Поэтому очень интересно, получился ли осмысленный результат хотя бы у кого-нибудь из lightning division, в котором результат надо было сдать через 24 часа.

Ну и ещё немного цифр для статистики: примерно 4К итоговый префикс, 165К кода на Java, 306 коммитов в Subversion.

Вроде как всё, отчёт окончен. :)
2014-04

ICFP Postmortem: Team ryba

Итак, обещанный отчёт. :)

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

Обсуждения по поводу языков и технологий у нас особенного не было. Дождавшись 14:00, скачав и по диагонали прочитав PDF'ку с заданием, я подошёл к Майку спросить, собирается ли он участвовать, и услышал в ответ "я уже педалю" и увидел открытую на его маке идею с зачатками структур для DNA. Так что обсуждать было нечего - я сказал, что берусь делать интерпретатор RNA, и пошёл его кодить.

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

Процесс выполнения DNA, по сути своей, представляет последовательность поисков и замен регулярных выражений в этой самой DNA. По ходу её выполнения она также может выдавать RNA - это простые векторные графические команды, посредством которых, собственно, и рисуется картинка.)

Алгоритмы для интерпретации RNA в задании были прописаны чётко, поэтому реализовать их на Java было делом техники, и уже к четырём часам как-то работающая версия лежала в репозитории. Примерно в это же время Майк выложил как-то работающую версию интерпретатора DNA.

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

Следующие часа три ушли на багфиксинг, а также на написание интерпретатора, который рисует картинку сразу по мере генерации. (Multicore friendly, кстати: один тред обсчитывает DNA, а другой рисует картинку.) Пока мы запускали DNA с префиксом self check, мы увидели, что перед основной картинкой он рисует на экране ещё какие-то буковки, подозрительно похожие на префикс DNA, которые потом стирает. К сожалению, засамбитить его на сервер и получить оттуда картинку мы не могли - картинку мы получаем только в том случае, если у нового префикса риск меньше, чем у того, который мы сабмитили в прошлый раз.

Рабочий день, тем не менее, ещё не закончился, и нам всем приходилось отвлекаться на дела, связанные с работой. Разобравшись с выпуском очередного EAP-билда, я порывался сесть и начать писать векторизатор результирующей картинки (чтобы не обводить полигоны руками), однако по счастливой случайности изучение её в Photoshop я начал с рассматривания вагончика в самой середине картинки. Заливка вагончика оказалась не однотонной, а с некоторым dithering'ом, а оценка результата не зависит от того, насколько я ошибся с цветом пиксела - засчитывается только точное совпадение. Поэтому я решил, что кодировать картинку всё равно придётся попиксельно и время на векторизатор можно не тратить (и, как потом выяснилось, это было крайне справедливо).

Тем временем, наш интерпретатор заработал достаточно хорошо для того, чтобы мы смогли отрендерить с его помощью префикс, вытащенный из self check. Результат оказался очень интересным, и мы поняли, что тут всё куда круче, чем казалось на первый взгляд...
to be continued...
2014-04

structorian reborn

Новый сервис от Google появился как нельзя вовремя для того, чтобы я мог выложить туда свою новую развлекуху. Точнее, реинкарнацию одной старой развлекухи, переписанную с Delphi на C# 2.0 без левых зависимостей на "библиотечки с позапрошлой работы" и выпущенную в open-source.

Чем можно похвастаться:
  • формат скриптов будет полностью обратно-совместимым, несмотря на то, что внутреннее устройство движка существенно изменилось;
  • движок пишется полностью test-first;
  • писать я начал в прошлый вторник - то есть, те 100 с хвостом килобайт кода (считая тесты), которые я выложил сегодня, написаны в нерабочее время (по утрам и вечерам) меньше, чем за две недели.

Хоть я всегда и считал, что писать что-то, что ещё не было написано, намного интереснее, чем писать второй раз что-то уже существующее - тем не менее, я получаю от затеи массу удовольствия. Во-первых, хотелось наконец поюзать новый C#, framework и ReSharper. С WinForms возиться мне ещё предстоит, а вот новые фичи языка вовсю юзаю уже сейчас. Во-вторых, внутри теперь всё сделано куда прямее, и писать код внутри хорошей архитектуры приятно само по себе. В-третьих, то, как была устроена старая версия на Delphi, в принципе не позволяло нормально сделать интерактивное редактирование описаний форматов - одну из потенциально наиболее кайфовых фич. В новой версии этого пока тоже нету (top priority - полная реализация фич старого движка), но сделать проблемы не составит.
2014-04

страшная сказка на ночь: ICQ, MacOS X и русские буковки

Хотите, я расскажу вам сказку? Да-да, именно про то, что в сабжекте написано. Сказка будет содержать много технических деталей, так что может полноправно считаться страшной - но и счастливый конец в ней, как и полагается, присутствует. По ходу сказки также будет затронута тема модульности/монолитности и её отношения к maintainability.

Одна из промежуточных глав этой сказки в моём журнале уже появлялась - а именно, в этом посте.

Итак, Collapse )