Category: наука

Category was added automatically. Read all entries about "наука".

glider

про ООП - 2

Я вот сейчас с ребе sorhed обсуждал и выяснил, что мне больше всего нравится в Скале. Ее система модулей основанная на объектах и миксинах. Объектно-ориентированная система.

Читал на днях недавнюю паперу First-Class Modules for Haskell, где рассказывается про то, как SPJ с товарищем добавляют Scala-like (ну, или ML-like, как кому приятнее) систему модулей в Хаскелл. Вслед за авторами сравнивал этот подход с Nested Types - основополагающей паперой Одерского.

Как я понял, все решают одну и ту же проблему. Как сделать так, чтобы: 1) был модуль Set с функциями empty, add и asList, 2) внутреннее представление множества (структуры данных, возвращаемой empty, и манипулируемой остальными функциями) было скрыто, 3) можно было писать s.add 1 s.empty и все тайпчекалось.

Это вполне можно сделать без объектов - как показывает практика ML и схема, описанная в папере про Хаскелл. Внутреннее представление скрывается за экзистенциальным типом (абстрактный тип в ML или экзистенциальный тип в расширенном Хаскелле), в язык добавляется конструкция, которая говорит, что у s.add и s.empty совместимые типы (manifest types в ML или open в расширенном Хаскелле) - все, готово, можно юзать.

Здорово то, как это сделано в Скале. Модули (они же objects ака singleton types) + абстрактные типы (они же abstract type members) + self-types или явные type refinements. Под капотом там тот же самый матан с экзистенциальными типами (чтобы убедиться, можно почитать вышеслинкованную паперу Nested Types), но выглядит это все как кейк паттерн на всем привычном.

Из ООП взята инкапсуляция как понимание того, что есть первоклассная сущность - модуль, он же объект - внутри которого находятся штучки (в данном случае, типы и термы). Взято наследование (ака subtyping) в плане того, что для абстрактных типов можно задавать upper bounds и в плане того, что сущности можно смешивать вместе при помощи миксин-композиции. Про полиморфизм можно много чего подогнать. Например то, что неважно, что именно под капотом абстрактного типа - главное, что все, кому надо, умеют с ним работать (через функции модуля или через функции из upper bound), поэтому подкапотное содержимое можно удобно заменять.

В итоге: ФП-шный матан теории типов скрестили с идеями из ООП - получилась Скала. Матан остался только под капотом, а фасад оказался "объектно-ориентированный", в результате чего получилась гибкая (наппример, на кейке без привлечения дополнительных языковых средств можно сделать виртуальные классы), но простая для восприятия система. upd. Хорошая иллюстрация к посту есть вот тут: http://maxim.livejournal.com/393915.html.
glider

имплициты

Недавно прошаривался в скале и нашел несколько интересных статей про имлициты:
* Can someone explain me implicit conversions in Scala? (материал для начального ознакомления с имплицитами)
* Where does Scala looks for implicits? (исчерпывающий материал по поводу видов имплицитов в скале и правил их поиска компилятором)
* Context and view bounds again (использование имплицитов для ограничения генерик-параметров - эмуляция тайпклассов Хаскелла. два подхода, каждый со своими плюсами и минусами)
* Implicit Parameters: Dynamic Scoping with Static Types (научная работа 2000 года, в ней Эрик Мейер с коллегами добавили неявные параметры в Хаскелл. интересно сравнить научное исследование и практическую реализацию, по сути, одной и той же идеи)

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

Во-первых, оператор пайплайна из F# (оригинальный пост):

implicit def toPipeLink[X](v: X): PipeLink[X] = new PipeLink[X](v)
class PipeLink[X](value: X) {
  def |>[Y](func: X => Y): Y = func(value)
}
Во-вторых, автоматическое каррирование (stackoverflow):

implicit def curryImplicitly[A,B,C](f: (A, B) => C) =
  (a: A) => (b: B) => f(a, b)
implicit def uncurryImplicitly[A,B,C](f: A => B => C) =
  (a: A, b: B) => f(a)(b)
В-третьих, вот способ попросить компилятор искать по всему графу неявных преобразований между типами, а не останавливаться на типах, непосредственно достижимых из текущего (тоже stackoverflow).

implicit def aToB(a: A): B = ... // will convert A to B
implicit def aToB[A1 <% A](a: A1): B = ... // will convert anything, that can be converted to A, to B
glider

убунта, часть 1: первый взгляд

часть 1: первый взгляд
часть 2: установка
часть 3: софт
часть 4: интероп с виндой
часть 5: обратно на винду

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

Заметки по миграции:
1) Работают симлинки на NTFS (здесь особенно приятно то, что дропбокс на убунте с успехом хавает симлинк на виндовую папку дропбокса).
2) Опера абсолютно аналогична виндовой, причем запалили симлинки на конфиг-файлы оперы из винды; остальное синхронизировал через опера-линк.
3) Большая проблема в прошлогоднем экспириенсе с убунтой заключалась в отсутствии тотал коммандера. На текущий момент двухпанельный файл-менеджер с табами, который поддерживает инлайн чтение/запись архивов - это маст для моей продуктивности. Пробовал krusader, пробовал tuxcmd, пробовал mc - в итоге ни один из них не подошел. На этот раз посчастливилось найти double commander. Версия 0.4.5 оказалась столетней давности и даже не запустилась, но потом я случайно набрел на форум, на котором народ вовсю юзает найтли-билды 0.4.6, которые, на удивление, работают и поддерживают большую часть функционала тотала.
4) Для того, чтобы на каждом мониторе был свой таскбар, а также для быстрого переноса окон между мониторами, на винде я использую Ultramon. Под гномом первая часть получилась бесплатно (гномовский апплет window list, который можно вбросить на панельку сверху/снизу монитора, автоматом показывает лишь те окна, которые находятся на текущем мониторе). Вторую часть я реализовал несложным скриптом.
5) Эверноута для линукса нет и не планируется, но зато есть Nevernote. Он весьма медленно стартует + его интерфейс оставляет желать лучшего, но он работает, причем понимает не только плейн текст, но и рюшечки вроде чекбоксов.
6) На винде я часто пользуюсь мобипокетом для компиляции электронных книжек, которые потом читаю на телефоне с помощью fbreader или на компе тем же мобипокетом. К сожалению, мобипокета для линукса нет, но я нашел calibre (пока не протестировал как следует).
7) Для чатиков я заюзал прилаги, которые нашел в прошлом году - pidgin и skype. Тексты пишутся, звонки звонятся, нотификации можно настроить так, чтобы не лезли под руки (т.е. без попапов), но чтобы были заметными (отображались в трее убунты).
8) Порадовали средства для работы с картинками и документами. Evince поддерживает pdf, ps и djvu, причем не тормозит и рендерит ps-файлы шрифтами, которые можно читать без содрогания. Стандартный убунтовский просмотрщик картинок легковесный и удобный, вполне заменил мне irfanview.
9) Наконец, для просмотра видосов мне понравился smplayer. Поддерживается ускорение декодирования на CUDA (через libvdpau), можно настроить хоткеи аля kmplayer. Единственное, что расстроило - PgUp/PgDn открывают файлы только в пределах плейлиста, но не работают для навигации по файлам внутри папки (читай: для навигации по сериям).

Вопросы:
1) Нужна читалка для электронных книжек, которая поддерживает рендеринг текста в несколько колонок. Пробовал calibre, пробовал fbreader, пробовал coolreader - не умеют, к сожалению. Запускал mobipocket под вайном, но у него все шрифты получаются перекошенными.
2) Посоветуйте, пожалуйста, изящную прилагу для ведения заметок. Нужна поддержка (виртуальных или реальных) папок и рич-текста. Синхронизация с клаудом необязательна, ибо есть дропбокс. Клиент для андроида желателен.
3) Куда правильно ставить прилаги, которых нет в репозиториях (например, последние версии ЯП)? Я пока что ставлю в /usr/local, ибо это первая рекомендация, которую я увидел в инете. Есть еще опция ставить в /usr/share, /usr/lib и вбрасывать симлинки в /usr/bin. Также можно тупо ставить в /home/username. Непонятно, что выбрать.
glider

EPFL vs Google

С февраля я пытаюсь усидеть на двух стульях - параллельно подавать документы и в EPFL, и в Google.

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

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

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

Уважаемые френды, что бы посоветовали вы?
glider

Организация творческих активностей

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

По поводу процесса:
   1. Гипотеза про параллелизм мозга действительно работает. По следующей схеме: 1) на свежую голову загружается в моск что-то непонятное, 2) моск возвращается к обычным таскам, 3) на днях в свободное время это что-то почитывается и/или обсуждается, 4) ???, 5) профит. Наверное, это самое большое для меня удивление за последние месяцы.
   2. Ресурсов хватает только на 2- или, максимум, 3-way параллелизм, но это, судя по всему, есть естественное ограничение мозга хуманов. Сейчас меня это уже не парит так сильно как раньше, ибо толку себя насиловать - впереди еще целая жизнь, такчт я лучше сэкономлю моск на всю ее длительность и оставлю силы для будущей семьи, нежели буду разгружать вагон здоровья здесь и сейчас (линкую потс не для того, чтобы постебаться над Олегом, а потому, что текст весьма характерен - сам через такое прошел и больше мне такого не надо). Впрочем, здесь я еще не обрел полного согласия с самим собой.
   3. Бложек это точно здорово, ибо пока пишешь о чем-то стоящем, успеваешь это лишний раз обдумать и разобраться (собсна, поэтому у меня в основном весьма длинные посты). Кроме этой причины есть и другие. Конечно, с бложеком есть непонятки: 1) по некоторым топикам лучше помолчать, даже если есть что сказать, чтобы зря не тратить моск, 2) паблик контент - это совершенно новый уровень ответственности за свои слова, который (лично для меня) вынуждает выверять текст, отвечать на каменты, объяснять точку зрения и так далее.
   4. Пока что не найдена серебряная пуля среди электронных помощников. ВанНоут хорош для организации knowledge base, но для записи своих (или переработанных чужих) мыслей мне больше нравится бложек. На синхронизаторы я забил вообще, ибо для кодярника подходит любой онлайн-хостинг кода, очередь прочтения у меня умещается в скайдрайве, а больше, по факту, мне ничего и не нужно. Прилаги для ведения таск-листов и планирования у меня заменяются майнд-мапом глобальной картины + обычной бумагой для тасков в пределах дня. Если нужно заперсистить таску на несколько дней-недель, я тупо кидаю ее в гмыло или на телефон - не очень удобно, но пока ничего лучшего не придумал. На нетбук забил - никак не могу представить, как я буду его таскать с собой все время.

По поводу инета:
   5. Полемика (отличаем от дискуссии) даже в реальной жизни имеет немного смысла, а в инете дык вообще бесполезна. Может, я что-то не так делаю, но для меня такие вещи в глобальной перспективе только зря тратят время. Истина не рождается, творческие ресурсы тратятся, да и здоровье-то не железное.
   6. Не факт, что даже дискуссии в инете имеют смысл, оправдывающий потраченное время. Более-менее полно сформулировать и обосновать свое мнение в бложеке - это да, почитать и обдумывать целостные мнения других - тоже да. А вот что-то большее... Обмениваться ответами в реалтайм режиме - отнимает много сил и зафлуживает дискашен настолько, что потом концов не соберешь (но irl работает весьма неплохо, походу потому что в инете слишком много накладных расходов на передачу мыслей). Сидеть и ждать обстоятельных каментов скучно и тупо. Каждый раз переключать контексты между дискашеном в инете и текущей активностью это тоже не фонтан. А отвечать мессагой в несколько строк раз в пару часов - как-то странно. Кароче, одни противоречия - надо еще подумать.
   7. Еще дальше - не факт, что вообще имеет смысл RSS. Фильтровать фиды по критерию интересности не прокатывает, ибо такой информации все равно слишком много. Поэтому сейчас я читаю только очень интересное и то, что бросается в глаза (10-30 минут в день), а остальное без зазрения совести выбрасываю (mark as read в Opera). Главное при этом не париться. Выкинуть rss-мессагу и не прочитать какой-то интересный пост где-то в недрах инета, о котором ты даже не знаешь - по факту это одно и то же, зато в первом случае появляется чувство того, что больше ничего не тяготит.
   8. Экспериментальным путем был получен факт того, что сидеть в инете (фиды, ЖЖ, форумы) с самого раннего утра или прямо перед сном (даже 15-20 минут) - это реальное убийство. Если отказаться от первого, то можно на свежайшую голову поделать что-нибудь клевое - настолько клевое, что иногда за целый день такого не сделаешь. Если отказаться от второго, то гораздо лучше засыпается и спится.
   9. Ессно, я не утверждаю, что инет - это фуфло, просто я все больше прихожу к мысли поменять отношение к модели его потребления. Вот неполная, но характерная аналогия. Погуглить по одному из ста рабочих вопросов (модель pull) - это незаменимая вещь. А пользоваться асинхронными нотификациями (модель push) - с каждым днем мне это нравится меньше и меньше.

По поводу самообразования:
   10. Вначале была идея выносить поиск и усвоение новой информации на специальные дни несколько раз в месяц. Получился облом, ибо это, во-первых, распыляет внимание в специальные дни, а, во-вторых, не задействует параллелизм мозга.
   11. Дальше была идея новую информацию получать постоянно, потом отсекать большую часть и сбрасывать контент на десктоп, чтобы иногда почитывать в перерывах. Идея оказалась несостоятельной, ибо куча всего на рабочем столе, хоть и смотрится экстравагантно для случайных прохожих, но постоянно парит моск тем, что "ой скока мне еще почитать". На днях нафиг удалил все с рабочего стола, кроме пары ярлыков на программы типо Оперы и Гтолка. Сразу полегчало. Сейчас тупо храню очередь прочтения в клауде.
   12. Вообще, с самообразованием есть реальный трабл. В 90-95% случаев после официальной работы и Конфлакса (+ есть еще и аспирантура) моск некисло перегружен и читать об аппликативных функторах или стрелках он не желает. Приходится заниматься активностями, не связанными с программированием.

tl;dr
Параллелизм моска существует и его надо использовать. В этом деле не стоит перегибать. Излагать мысли в паблике (например, в блоге) весьма полезно. Есть неслабый смысл ограничить потребление инета до самого минимума (гугл по вопросам работы, блог для шлифовки важных мыслей, справочные сайты для irl-активностей - и все). С утра и перед сном лучше вообще отказаться от инета. Неясно, как найти время на самообразование.
glider

Параллелизм мозга

Из литературы или из ad-hoc опыта широко известен факт о том, что human task switches are considered harmful. В моем понимании он является следствием двух вещей: 1) сознание не способно сконцентрироваться на более, чем одной задаче одновременно, 2) переключение сознания между задачами до уровня хорошей эффективности занимает значительное время - у меня на это уходит полчаса или даже больше.

Но опять же из опыта следует то, что если долгое время (неделя и больше) углубленно заниматься одной и той же таской, но суммарный результат получится хуже, чем если то же время разбить на достаточно большие части и посвящать каждую из частей разным таскам. Например, писать основной проект + читать книжки + следить за новостями почти наверняка будет большим продвижением на пути к Мировому Разуму, нежели просто все время сидеть и лабать проект.

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

***

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

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

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

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

***

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

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

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

***

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

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