Category: общество

Category was added automatically. Read all entries about "общество".

glider

Прогресс по макросам

Сегодня снова замечательно пообщался с народом по поводу макросов в Скале: https://raw.github.com/xeno-by/kepler/master/papers/2011-10-18-WhatsUp.pdf. На этот раз все было гораздо более приземленно - презентация была о том, как воплотить идеи, изложенные в несколько недель назад, в конкретные расширения для Скалы.

За прошедшее с предыдущего аннаунсмента время я получил несколько очень ценных отзывов. Скажем, Крису и Штефану интересно поэкспериментировать с поддержкой LINQ. Не вопрос - подумали и придумали, как это выразить макросами. Нада и Грег воюют с необходимостью обрабатывать все стопицот типов FunctionN и TupleN в кросскомпиляторе со Скалы в жабаскрипт. Не вопрос - теперь у нас есть макро пэкиджи (или, если не удастся уломать Мартина, макро пэкидж обжекты).

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

вычисления на типах

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

Вычисления на типах, вероятно, являются кульминацией трюков с типами. Литералы Черча, рекурсивные типы, вложенные типы, которыми эмулируются функции... Народ, расскажите, пожалуйста о киллер юзкейсах вычислений на типах потому, что я не могу представить ради чего можно писать ТАКОЕ:

scala> trait TF {
     |   type Apply[A]
     | }
defined trait TF

scala> type Curried2[F[_, _]] = TF {
     |   type Apply[X] = TF {
     |     type Apply[Y] = F[X, Y]
     |   }
     | }
defined type alias Curried2

scala> "a".pure[Curried2[State]#Apply[Int]#Apply]
res7: scalaz.State[Int,java.lang.String] = scalaz.States$$anon$1@1dc1d18
Также крайне интересно было бы узнать об альтернативах вычислениям на типах - вещах более читаемых и обладающих похожей полезностью. Окей, есть макросы, и в Скале мы туда обязательно доберемся, но какие могут быть еще полезные подходы?
glider

Зависимые типы

Уважаемые читатели, приведите, пожалуйста, практичный пример использования зависимых типов (кроме сортировок, плиз).

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

upd. Материалы по теме:
* А про зависимые типы - это примерно так
* Зависимые типы и метапрограммирование
* Решительно непонятно, как можно программировать без dependent types
glider

Лайфхак по прокачке дропбокса

Основным способом увеличить размер бесплатного аккаунта на дропбоксе является привлечение реферралов. За каждого, кто зарегался по совету некоторого пользователя (т.е. пройдя по уникальной ссылке, которую этому пользователю выдал дропбокс), добавляют дополнительное место. Максимальное количество реферралов - 32, потом бонусная программа работать перестает.

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

Впрочем, сегодня я не об этом. Кроме полулегальных приемов генерации реферралов, я встретил прикольную и, как оказалось, крайне эффективную схему прокачки своего аккаунта. Идея заключается в том, чтобы свою реферральную ссылку разместить в google adwords. Вот, в принципе и все, а детали (например, конкретный текст рекламки, если лень думать) можно посмотреть в слинкованном посте.

Пост был бы неполон без моего отчета о применении идеи на практике. Так как на все про все автор слинкованного поста затратил 400 рублей, я забросил на счет adwords 15$. Так же, как и советуется в посте, я создал рекламную кампанию на ключевое слово dropbox продолжительностью три дня. В качестве целевой аудитории выбрал Россию и русский язык (гугл предлагал еще показывать рекламу тем, у кого язык интерфейса английский, но я решил, что у таких челов уже давно есть дропбокс или что покруче).

И вот что случилось. Первые несколько часов вообще не было результатов, но за время вечерней прогулки по моей ссылке зарегались 8 человек. Пока я спал - еще 8. Пока завтракал - еще 2. Пока писал пост - еще 3. Плюс, 5 человек зарегистрировались в дропбоксе, но не поставили себе его клиента (т.е. за них мне дополнительное место еще не дают). На текущий момент, за 16 часов по моей ссылке кликнули 62 раза (из 332 показов). За все это гугл забиллил меня на 2.84$.
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

Обратная сторона творчества

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

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

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

***

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

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

Загон №2. "Целый день потратил на ремонт квартиры, а делом так и не занялся...". Грустно, что быт и здоровье вытягивают силы, которые можно было бы направить на творчество. Мне это очень знакомо - недавно я сломал себе руки и половину августа, а также весь сентябрь, не смог делать то, что мне нравится. Мало того - даже маленьких мыслишек в голове не было, ибо походу организм настолько усердно восстанавливался. Впрочем, после этих полутора месяцев я снова вернулся к творчеству и начал очень яркий проект.

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

Загон №3. "То, что я делаю - слишком примитивно и никому не нужно...". Обычно у меня такое возникает как следствие загонов №1 и №2. Когда моск осознает проблему, то начинает искать какую-то причину. Почему-то обязательно первая мысль - обвинить себя.

Способ борьбы. Этот загон исчезает вместе с загонами, его породившими. Ну, а, как только начинаешь снова творить, мысли о своей никчемности обычно не возникают - не до этого становится =)

***

Из внешней литературки хочу посоветовать потсы из одного программерского блога. Что удивительно - инфа там подходит для всех творческих людей: Taming Doubt, Taming Perfectionism. А для вдохновения рекомендую почитать книгу Джека Лондона "Мартин Иден". Upd. Еще вот написал пост про acceptance: http://xeno-by.livejournal.com/8538.html.