Category: it

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

glider

Композиции вычислений в функциональном стиле

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

Интуитивно я чувствую, что все вышеназванное можно как-то загнать в некоторую онтологию, но как именно - не знаю.

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

Подборка статей и книжек по программированию

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

Некоторые креативы в подборке меня впечатлили до состояния просветления по определенным вопросам. Из самых любимых хочу отметить "Оптимизирующие парсер-комбинаторы", "Delimited Continuations" и "Type Classes as Objects and Implicits". Ну и, конечно, как же я мог забыть про "Lightweight Modular Staging: A Pragmatic Approach to Runtime Code Generation and Compiled DSLs"!

Давайте делиться!

upd. К сожалению, анонимусам дропбокс позволяет скачивать только файлы, но не папки целиком. Чтобы обойти проблему, я запаковал снапшоты технических разделов библиотеки и положил их в корень публичной папки Library (см. http://dl.dropbox.com/u/10497693/Library/index.html). Постараюсь регулярно обновлять архивы с учетом новых поступлений.
glider

wetware v0.90

В этом посте речь пойдет о моей текущей версии wetware - ментального фреймворка организации сознательной деятельности. Предыдущие креативы на эту тему можно почитать по соответствующему тегу: http://xeno-by.livejournal.com/tag/wetware.

Тактика

Любые идеи, любая поступающая информация обрабатывается на месте: если срочно - действовать, если нет - записать на бумажку, в RTM или Evernote (несколько секунд) и продолжить заниматься текущим делом. Таким образом, убирается стресс от многозадачности.

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

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

Предыдущий пункт невозможно реализовать на 100%. Дело в том, что в список попадают лягушки. Они же - дела, которые делать очень влом. Например, позвонить неприятному человеку или выстоять очередь в поликлинике. Они обычно вытесняются другими делами и могут висеть в списке веками, но при этом регулярно всплывают в моске и генерируют стресс. Способ борьбы прост, но требует дисциплины. Лягушек надо регулярно поедать живьем.

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

Стратегия

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

Пару раз в день (в зависимости от загрузки, конечно) просматриваются отложенные странички/документы, френдлента и RSS. Интересные вещи - если есть настроение, читаются, иначе откладываются (клик на кнопочку "save to instapaper" в браузере). Неинтересные - выкидываются. Таким образом, повышается вероятность узнать о топиках, которые потом помогут понять совершенно неожиданные вещи. Кроме того, устраняется стресс выпадания из коллективного разума.

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

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

Философия

За последние пару лет мой главный прогресс в организации сознательной деятельности был связан с устранением стрессов. Больше делать я стал исключительно благодаря тому, что меньше парюсь.

Самым важным усовершенствованием было отделение планирование от действования. Программирование самого себя удивительным образом сокращает количество трэшевых мыслей => освобождает моск для полезных дел. Повторюсь, роботы не парятся. Это надо использовать. Реализация этого императива нетривиальна, ибо требует ревизии всего wetware и поддержки со стороны техники, но результаты поражают воображение.

С течением времени все сложные вещи в моем wetware умерли: wysiwyg-форматирование в onenote, развесистые списки дел в rtm, онтологии в базе знаний, да и сама база знаний вместе с ними. В процессе эволюции они отвалились и были заменены ленивыми, короткими, плейн-текстовыми, плоскими альтернативами. K.I.S.S.
glider

Рассуждения о шеллах

В контексте этого поста, под словом "шелл" будет подразумеваться программа, которая: 1) хранит набор переменных, 2) имеет средства для работы с переменными, 3) умеет вызывать программы/апплеты, передавая на им вход константы и/или переменные, 4) умеет сохранять результаты вызванных программ в переменных, 5) предоставляет язык, на котором можно программировать предыдущие пункты.

Переменные в шелле могут быть как исключительно текстовыми, так и объектными (PowerShell, Object-oriented shell for *nix). С одной стороны, текст - удобный медиум общения между программами, к тому же доступный для восприятия человеку, к тому же имеющий универсальный набор подпиливающих тулов. С другой стороны, объектная ориентация дает больше возможностей, что, в теории, может оказаться практичным.

Впрочем, пост не об этом. Наибольший интерес для меня сейчас представляет вопрос совмещения башевского удобства пунктов 1-4 (а именно: интерполяцию строк, `` ака $(), пайпы и редиректы) с высокоуровневым языком программирования для пункта 5.

С одной стороны, есть точка зрения "Everywhere my colleagues used to use bash scripts I use Python. I have never run into any issues, and have achieved more seamless integration with the operational products I maintain". Звучит хорошо, особенно из уст Гвидо, но писать двадцать строчек для рекурсивного удаления папок ".svn" вместо одной строчки "find ./ -type d -name .svn -exec rm -rf {} \;" - рука не подымается.

С другой стороны, есть гибридные шеллы вроде IPython, которые, во-первых, являются drop-in заменой для интерпретатора некоторого языка, а, во-вторых, предоставляют возможность выполнять команды баша (например, приписывая к ним слева восклицательный знак). Для айпайтона существует даже специальный режим pysh, в котором вводимые команды сразу передаются системному шеллу, без танцев с бубном вокруг восклицательного знака. Впрочем, и здесь не без проблем - например, внутри цикла баш-команду мне выполнить не удалось.

В честь этого вопрос: знаете ли вы шелл, который бы программировался на ЯВУ, но предоставлял бы возможность дословного исполнения баш-команд наряду с интерполяцией строк? В идеале это было бы нечто, что умеет по началу строки распознавать баш-код, а также парсить конструкции вида $(). Также интересует метавопрос на тему того, имеет ли смысл предыдущий вопрос.

upd. В тему поста я недавно нашел пост на stackoverflow и его обсуждение на реддите: Why are scripting languages (e.g. Perl, Python, Ruby) not suitable as shell languages? - Stack Overflow.
glider

ищу книжку про юникс/линукс

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

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

Пока что практически все, что я нагуглил, делится на две категории: 1) чисто прикладные произведения, где исчерпывающе рассказывается, к примеру, про кучу команд и их ключи, 2) хардкор о программировании кернела. Первое читать скучновато и в голове мало чего остается. Второе совсем непонятно.

Большой удачей мне было наткнуться на книжку The UNIX-HATERS Handbook. Там много негатива, но прочитал я ее залпом. Исторические экскурсы, тривия - все это было увлекательно на уровне хорошего триллера и очень полезно. Если бы найти что-то похожее, но посовременнее (хейтерсам уже 17 лет) и на позитиве - было бы просто супер!

upd. Также очень понравилась статья Fixing Unix/Linux/POSIX Filenames: Control Characters (such as Newline), Leading Dashes, and Other Problems. Рассматривая проблемы с разрешенными символами в именах файлов, автор попутно затрагивает очень много конвенций и идиосинкразий юниксовой экосистемы. Маст рид.

upd. Весьма просветила статейка Мигеля де Икасы Learning Unix. Благодаря ней я, наконец, понял, что тотал коммандер не нужен. Подробности в посте про файловые менеджеры.
glider

ugh

Очень повеселила история Джейми Завинского про то, как он игрался с find (The UNIX-HATERS Handbook, глава восьмая). Наверняка, рассказ является бояном, поэтому не буду углубляться в детали, а остановлюсь на понравившемся моменте:

I was happy. I thought it was over. But then in the shower this morning I thought of a way to do it. I couldn’t stop myself. I tried and tried, but the perversity of the task had pulled me in, preying on my morbid fascination.

Ага, это оно! "Morbid fascination". Хорошо помню, как недавно собирал XML-файлы в шелл-скрипте. Вроде и понимаешь, что это бред, но остановиться невозможно.
glider

Вопрос насчет make

Решил обновить дрова к сетевой карте, скачал с сайта вендора, распаковал и сделал make. Бац - ошибка "/bin/sh: Syntax error: "(" unexpected". Ясно, блин - забыли заквотить PWD. Смотрю makefile, а там:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD)/src modules
Попробовал обернуть SUBDIRS в двойные и одинарные кавычки - ничего не получилось, попробовал эскейпить в $(PWD) специальные символы с помощью string substitution баша - ничего не получилось. Погуглил на тему "make whitespace in paths". Самый лучший ответ, который я нашел: "thanks all on your help but i have decided not to go on with this cause it is normal thing on linux not to make spaces in paths, folder names".

Что делать, как жить дальше?
glider

убунта, часть 4: интероп с виндой

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

Главным вопросом для меня в плане интеропа была организация партишена, общего и для убунты, и для винды. Есть три вида файловых систем, которые хорошо поддерживаются на обеих платформах: FAT, NTFS и ext. Первый вариант отпадает сразу ибо он не журналируется, остаются два.

Вначале я решил использовать NTFS, тем более, что существующие данные уже лежали на виндовом партишене. Немного погуглил и выяснил, что драйвер ntfs-3g под убунту считается довольно стабильным. В файловом менеджере убунты мой NTFS-диск подмаунтился без всяких проблем, поэтому я решил не париться и оставить все как есть. В процессе тестовой эксплуатации выяснилось следующее:
1) Скорость работы с NTFS через убунту примерно в полтора раза хуже скорости через винду.
2) Если с помощью виндового партишен-менеджера делать динамические NTFS-партишены, то есть неплохой шанс, что ntfs-3g откажется их хавать. Возможно, у этой проблемы есть цивилизованные решения, но мне пришлось форматировать диск.

Так как для используемого каждый день хранилища данных эти проблемы уж слишком жестокие, было принято решение мигрировать на ext. На текущий момент есть два драйвера, которые дружат винду с ext: ext2fsd и ext2ifs. Первый достаточно оживленно разрабатывается (последний релиз был в феврале этого года), поэтому сразу поставил я именно его. Однако в процессе использования проявились неприятные моменты. Во-первых, параметры маунтинга ext-разделов не сохраняются между ребутами (автор так и написал в релиз нотах: "это не баг, просто не было времени прикрутить"). Во-вторых, дефолтный режим маунтинга - только на чтение, поэтому после каждой перезагрузки приходилось переподключать диск, что неприятно. В-третьих, даже в режиме r/w я ловил глюки с записью: например, в папках, созданных под убунтой я мог создавать новые файлы, но не мог редактировать старые.

В итоге, пришлось остановиться на ext2ifs. Почему пришлось? Да потому, что последний релиз этой софтины случился почти 3 года назад, и, кроме того, она не поддерживает ext4. Также выяснилось, что софтина не поддерживает размеры inode, большие, чем 128 байт. Юмор ситуации заключается в том, что по умолчанию убунта форматирует ext с ключом -I 256, а поменять размер айнода можно, только пересоздав файловую систему. Ладно, ок - заново забэкапил данные и отформатировал партишен под ext3 -I 128. После этого меня ждал последний бастион: ext2ifs не умеет автомаунтить диск при загрузке системы (или умеет, но эта фича не работает в семерке). Впрочем, это починилось через написание автозагрузочного bat-файлика, который юзает mountvol. Дальше все заработало как часы.

Пару слов про симлинки. ntfs-3g умеет читать симлинки NTFS, но зато не умеет их создавать. Вернее, умеет, но создает их в линуксовом формате, который не распознается виндой. Кроме того, симлинки между NTFS-партишенами у меня не заработали (ессно, я пытался их заюзать, когда оба партишена были подмаунчены). У ext2ifs та же проблема. Читать он умеет, а создавать нет - когда я попробовал заюзать виндовый mklink, он мне написал, что сабжевая файловая система не поддерживает симлинки. Впрочем, симлинки с ext на NTFS, равно как и симлинки с NTFS на ext - работают на ура.

Чтобы два раза не вставать, упомяну еще и самбу. Без проблем получилось расшарить папку из-под убунты и заюзать ее из винды, а также наоборот. Впрочем, и здесь случилась одна загадочная ситуация, причем я пока что не смог ее разрулить. Дано: на десктопе убунта, на ноуте убунта. Если копировать файлы на ноут, то скорость 9-10 MB/s. Если копировать в обратном направлении, то всего лишь 4 MB/s. Вначале я думал, что это из-за того, что ноут пускает данные по wi-fi, но, даже после отключения wi-fi, остались все те же четыре метра в секунду. Загадки во тьме.

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

Trace Windows 7 boot/shutdown/hibernate/standby/resume issues

Наткнулся на интересный пост с форума MSFN. Оказывается, в Windows SDK есть Windows Performance Toolkit, который позволяет запрофайлить процессы загрузки, шатдауна и саспенда/хибернейта.

Профайлинг происходит следующим образом:
1) Скачиваем тулкит (до семерки его можно скачать с сайта MS, для семерки он есть только на дисках с SDK).
2) Запускаем xbootmgr -trace <what> -traceFlags <flags> -resultPath <folder>.
3) После того, как профилируемый процесс завершится, в папке, указанной в resultPath, появится бинарный лог.
4) Специальной командой этот лог можно преобразовать в XML, который описывает высокоуровневые шаги процесса и их тайминг.
5) По результирующему XML можно проанализировать слабые места системы. В сабжевом посте достаточно детально объяснены этапы стартапа и шатдауна - может быть полезно для понимания происходящего.

Лично я, даже не вдаваясь в матан, смог разобраться почему так долго вырубается операционка. Дело было в том, что сервис TeamViewer выгружался больше пяти секунд. Винда даже успевала показать окошко "программа тормозит загрузку: выкосить или подождать еще?". Но, так как проблема была в сервисе, окошко было пустое, поэтому без профайлинга я бы ни в жизни не догадался.