Category: россия

Category was added automatically. Read all entries about "россия".

glider

emacs + latex

Кто чем пользуется для работы с латеком? Я юзаю стандартный латек-мод из 23й версии, не auctex - он мне показался слишком сложным, а бонусов для повседневной работы я не нашел (пожалуйста, разубедите меня, если я не прав). Плюс, я на коленке слабал надстройку над docview, которая параллельно с tex-файлом держит открытым буфер с результирующей pdf-кой и автоматически ревертит его после билда, сохраняя настройки вьюпорта (страница, горизонтальная, вертикальная прокрутка). Впрочем, обо всем по порядку.

Стоковый латек-мод меня устраивает. Особенно умиляет то, как он показывает фрагменты типа \emph{} или _{}. В первом случае текст внутри фрагмента будет отрендерен италиком, а во втором - подстрочным шрифтом. Возможно, можно, чтобы было еще полезнее, но на первый взгляд мне от латек-мода больше ничего и не надо. Видел возможность инлайн-превью в auctex, но и в винде, и в линухе это смотрится настолько ужасно, что ну его нафиг.



Главный вопрос у меня с превьювером получившегося результата. Так как в латеке я еще нуб, мне важно регулярно превьювать свои креативы. Причем желательно, чтобы не надо было после каждого ребилда переоткрывать результирующую pdf-ку. С акробатом мы не подружились - он, собака, лочит файл на запись, поэтому перед каждым ребилдом надо его закрывать. Но, к счастью, вместе с miktex поставилась полезнейшая аппликуха texworks, которая умеет сама определять, что файло изменилось и на лету его перерендеривать (о, боги, спасибо авторам сего тула!).



Это все, конечно, круто, но хочется интеграции в емакс. После гугления я выяснил, что из коробки никто такое не умеет. Впрочем, есть линукс-онли скрипт, который магическим образом взаимодействует с неким dvi-вьювером и делает то же самое, что texworks, но это все равно внешний тул. Поэтому я взял docview и чуть-чуть его подпилил:



Но тут возникает куча проблем. Docview работает следующим образом: 1) конвертирует pdf-ку в картинки, 2) работает как слайдшоу. Причем, функциональность просмотра в нем реально тупая: тормозит, временами отваливается, нет зума, не может на одном экране показать половину одной страницы + половину другой страницы, не запоминает положение в документе и так далее - короче, сплошной жупел. С таким положением дел возникает вопрос - нафига козе баян, если texworks умеет все то же самое, причем без костылей?

Отдельный вопрос любителям почитать pdf-ки из емакса. Кстати, выходите из сумрака. Я знаю, что вы есть - читал про вас в инете. Только не говорите, что вы читаете документы при помощи docview. Или я пропустил что-то очень очевидное?
glider

онсайт собеседование с гуглом, часть вторая

Первая часть

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

1. За обедом у нас зашла речь об энвайронменте разработки. Поддерживая разговор о средах разработки, моя компаньонка сказала, что вообще не использует IDE. К этому я был готов и с надеждой спросил: "Неужели Emacs?". После недавного опыта с емаксом у меня есть желание разобраться, но я не знаю с чего начать, поэтому особенно ценной была бы возможность пообщаться с живым адептом этого таинственного тула.

Здесь меня постигло разочарование и удивление одновременно - моя собеседница сказала, что использует всего лишь какую-то несложную тулу для редактирования текста (нет, не vi), а больше ей ничего и не надо. Поиск и навигация по коду в ее воркфлове отделены от редактирования и осуществляются в некоем веб-туле аля Google Code Search. Здесь у меня три вопроса:
* Насколько близки возможности этого тула к публичному code search? Вот, я открыл случайный C#-проект в code search. Панелька навигации отображает структуру проекта и даже выделяет семантические элементы внутри файла. Это хорошо, но где гиперлинки в стиле "go to definition"?
* Можно ли поставить этот или аналогичный тул локально и индексировать свои личные проекты?
* Народ, ну как вы обходитесь без интегрированных в редактор кода рефакторингов?!

2. Я не смог удержаться и спросил одного из интервьюеров, а также и девушку за обедом про то, как народ использует 20% времени, которые политикой гугла отводятся на личные проекты. По рассказам (которые также коррелируют и с тем, что мне рассказала Дженни) получается, что можно замутить что-нибудь интересное, представить это что-то широкое публике и при успехе презентации ожидать приток свежих сил на мини-проектик. При особой пользе личного проекта для Мирового Разума, может предоставиться возможность заниматься им фулл-тайм (здесь мне рассказали историю некоего Кости, который сгенерил тул, умеющий в полуавтоматическом режиме искать data races; сейчас, при написании поста я нагуглил немного больше деталей). Звучит отлично, поэтому очень интересно было бы узнать детали.

3. Стала неожиданностью позиция народа относительно альтернативных языков программирования. Как я понял, в гугле есть четыре языка, на которых пишут большинство кода в продакшен - Java, C++, Python и Go. Мои вчерашние собеседники пишут исключительно на Java/C++ и иногда мелкие скрипты на питоне. Go считается мистической экзотикой, которую никто из них не пробовал, но, по слухам, это что-то классное. На провокационные вопросы типа: "а никогда не хотелось заюзать какой-нибудь другой ЯП?" или "согласись, приятно покодить в функциональном стиле?" никто не поддался. А самый первый мой интервьюер даже не слышал, что такое Scala. Отражает ли эта выборка мнений общую картину?

На пока что все. В следующем посте я попробую описать тематику вопросов (вчера было пять собеседований, по 1-3 задачки в каждом) и выскажу соображения по поводу подготовки на основе полученного опыта. К сожалению, тексты задачек я привести не смогу (NDA я не подписывал, но явно высказанной просьбе отказывать не хочу), но, надеюсь, будет интересно.
glider

#ADD2010

На днях съездил с докладом на конфу Application Developer Days, которая проходила в Ярославле. Причем ни с чем-то, а с первой демонстрябельной версией Конфлакса. Мой доклад и детали по нему будут выложены отдельным потсом, а здесь поток сознания.

1. На 90% ехал для того, чтобы девиртуализироваться и пообщаться с жж-шными френдами. Это удалось на все 900%. Народ перечисляю в порядке знакомства. Олега zamotivator я узнал за пару секунд - когда они стояли и курили с Кириллом (catap.ru). Такие же поток сознания и жоская движуха, как и в ЖЖ. Кирилл оказался челом медитативного плана, который по жизни на позитиве, но знает он реально дохрена - его совместный доклад на тему SQL vs NoSQL было жутко любопытно послушать. Женя antilamer и Юля grrrl - мегаприятные и душевные в общении люди, заодно еще профессиональные и совсем не фрики, а эти качества вместе случаются очень редко =)

2. Перемещение тела обошлось в чуть более, чем сто баксов туда-обратно (Минск - Москва - Ярославль - Москва - Минск). С проживанием удалось разрулить вообще на ура - за 1300 р. в сутки снял квартиру, правда горячую воду отрубили в день моего проезда, но это настоящая квартира, где никого нет рядом, тихо и просторно. Я фшоке. И это в то время, когда нормальные отели в Ярославле (в честь его недавнего тысячелетия) начинаются с 4000 в сутки.

3. По докладам (см. расписание вот тут: http://it-conf.ru/ru/content/331.htm; при клике на доклад можно почитать его тезисы и информацию об авторе).

3а) SQL vs NoSQL, наверное, задумывался более как справочник - из полуторачасовой беседы у меня в голове осталось два пунктика: 1) в распределенности все сложно, 2) см. презентацию - там все детали по 100500 хранилищам данных. Здорово повеселил аудиторию Кирилл, постоянно повторяя, что "счастья нет" =)

3б) Дальше был срач по поводу систем контроля версий. Жесть, прямо как в каментах у Олега - жуткий поток сознания, из которого вылавливаешь полезное для себя. Я выловил git rebase (интересно, как такое сделать автоматом в меркуриале, не прибегая к mq) и то, что svn, оказывается, неожиданно полезная, ибо уже есть работающий svn merge --reintegrate. Насчет последнего еще рассказывал Стас Фомин в докладе "Золотая середина. Открытые системы поддержки разработки". Жаль тока в том докладе время закончилось раньше, чем началось самое интересное.

3в) После этого выступал я (об этом в отдельном потсе), а после своего доклада пошел гулять по городу. Было жалко пропускать рассказ про статический анализ доменной модели в C#, но меня так захватил Ярославль (я приехал на день раньше конфы и успел уже прогуляться), что пришлось чем-то жертвовать. Если у кого-нибудь есть ссылка на слайды доклада - расскажите мне, пожалуйста.

3г) На следующий день я успешно проспал презентацию windows phone 7 и начал день с фтыкания в хадуп. Походу, это есть опен-сорс реализация нашумевших в свое время концептов гугла про мап-редьюс, биг тейбл и распределенную fs. Докладчик, который по долгу службы работает с хадупом, ввел нас в курс дела, после чего я забился в уголок погуглить на тему того, как переводить всякие, например, джоины в мап-редьюс, окуклился и протащился. Потом пришел Катап и сказал, что хадуп любить падать и уносить за собой в могилу данные. Фак. Всю идиллию разрушил.

3д) Круглый стол SQL vs NoSQL прошел гораздо более организованно, чем предыдущий круглый срач про VCS. Чтобы не было так, что кто-то на букву "О" перекрикивает оппонентов, поставили микрофоны. Но не каждому, а через 3-4 человека. Хорошо поглумились =) а если по сути, то благодаря майевтике Андрея Аксенова я, как неспециалист, понял одно - пока что нет автоматического решения, которое бы позволило мне воткнуть в два раза больше компов и получить в два раза больше перфоманс. Как это объяснил после доклада Олег, здесь есть две проблемы: 1) невозможно автоматическое партицирование в общем случае, 2) очень долго перепартицировать данные после ввода в систему нового кластера - ну в самом деле, даешь перекачать пару терабайт по сети. Еще услышал кейворд Riak. А вот еще. Стас Фомин сидел и (не лень же ему) конспектировал дискуссию в майндмап. Так я познакомился с Freeplane, который, по тому, что вытворял Стас, удобнее MindManager, который я юзаю сейчас.

3е) Дальше был доклад, который из всех на конфе мне понравился больше всего. Выступал Женя Кирпичев (antilamer) с рассказом про параллельное программирование. Тем было затронуто очень много, некоторое время я прокемарил, но стратегии организации общения нодов в распределенной системе меня впечатлили до глубины души. Например, системы с обратной связью. Вдаваться в детали не буду - скоро Женя сам выложит доклад в ЖЖ. Впрочем, здесь тоже масса неразрешимых проблем - например, непреодолимая сложность асинхронных систем. Не только синтаксически мусорная call1(function(result1) { call2(result1.foo, function(result2) ... (ее можно убрать монадами), но просто логическая. Блин, и здесь элегантно легкого решения.

3д) Под занавес доклада зал порвали Яков Сироткин и Андрей Аксенов рассказами о том, как перестать бояться и полюбить бомбу. Технических деталей минус ноль, но зато весело и приятно о психологических факторах разработки как работы и как хобби. Было здорово - технические детали есть и в инете, а вот живого общения в инете не наблюдается.
glider

Автоматическая синхронизация версии проекта с ревизией SVN

Я давно знал, что, указав для версии сборки атрибут [assembly: AssemblyVersion("1.0.*")] (или любую другую версию кроме 1.0), в 2008й студии мы получаем автогенерацию третьей и четвертой позиций версии - то есть номера билда (устанавливается в количество дней, прошедших на момент билда с 31.12.1999) и номера ревизии (устанавливается в количество секунд, прошедших на момент билда с начала суток, разделенное на 2 - если на два не делить, то получится overflow ибо у нас только 16 бит, а секунд в сутках 86400). Этот подход хорош тем, что при обычном процессе разработки практически невозможно выпустить две разных сборки с одной и той же версией (для этого придется успеть что-то поменять и после того еще и перекомпилировать проект в пределах двух секунд). Но на этом достоинства подхода заканчиваются, ибо из автогенерированной версии мы ничего полезного, кроме времени билда, узнать не можем.

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

К сожалению, непосредственно в студию такая функциональность не встроена и плагинов, ее обеспечивающих, не существует. Приходится выбирать из пачки не очень удобных вариантов - http://stackoverflow.com/questions/12176/svn-revision-version-in-net-assembly-w-out-cc-net. Написание кастомных тасков для MSBuild требует их последующей установки в систему, макросы SVN для автогенерации AssemblyInfo напрямую не подходят, руками делать тоже не хочется - везде есть какие-то недостатки.

На днях я наткнулся на наименее напряжный, с моей точки зрения, вариант и не поленился реализовать его во всех своих open-source проектах. Вот та самая статья: Using Subversion Revision as the AssemblyVersion - Revisited, а вот воркфлоу моими словами (он опускает некоторые детали, за которыми прошу обратиться к первоисточнику):
1) Используем тул SubWCRev.exe из TortoiseSVN, который умеет заменять макросы SVN на текущие значения,
2) Файлики AssemblyInfo.cs выкидываем из-под сорс контроля и для верности еще и игнорируем, чтобы не было постоянных промптов их добавить обратно,
3) Рядом с файлом AssemblyInfo.cs кладем файл AssemblyInfo.template, в котором заменяем номер билда в версии на макрос $WCREV$ (важно не забыть добавить этот файл в проект, чтобы помнить о его существовании, если надо будет что-нибудь поменять в AssemblyInfo, например, мажорную версию),
4) В пре-билд ивент проекта (конфигурация находится в свойствах проекта на закладке Build Events) записываем вызов тулзы из пункта 1, которая преобразует темплейт в AssemblyInfo.cs, после чего запускается билд,
5) Профит!

В итоге - исходная задача выполнена, и к тому же: 1) париться с настройкой надо всего лишь один раз, причем все необходимые настройки выполняются в файловом менеджере и GUI студии, 2) проект компилируется где угодно, 3) AssemblyInfo.cs заигнорен, поэтому каждый раз не будет мозолить глаза иконкой измененного контента и просьбой закоммитить.

P.S. Конечно же, если проект управляется системой continuous integration, то можно сделать все гораздо проще - плагином или кастомным билд-скриптом. Но, с другой стороны, для небольших проектов развертывание CI - это неоправданная затрата времени + требует надежного хостинга, поэтому такой подход целесообразен не всегда.

P.P.S. Насколько я знаю, ревизия в Git представляет собой непрозрачный длинный токен, который не поместится в 8 байт, отведенных на версию в PE формате. Это осложняет дело. Можно, например, вешать на сборку кастомный атрибут со значением этого токена, но кастомные атрибуты не показываются в меню винды File > Properties - неудобно. Можно также хранить токен в строковых метаданных PE-модуля при помощи атрибутов AssemblyTitle или AssemblyDescription - вроде бы неплохой вариант. Впрочем, сам не пробовал - не знаю, так что это просто догадки.