![]() | Вы читаете журнал Вход Создать аккаунт в ЖЖ Подробности |
![]() | |
|
happy birthday!
Сегодня у |
|
![]() | |
|
xmonad
Роман Чепляка выложил в HTML нашу статью о xmonad, весьма хорошем оконном менеджере, написанном на haskell. Ранее она публиковалась в журнале Open Source, выпуски 27, 28, 29. Можно смело сказать, что статья является самой подробной из всего написанного про xmonad на русском :) |
|
![]() | |
|
On CS articles
Хотите написать умную статью, но не знаете о чём? Вам поможет это! О правильном использовании написано в разделе Examples :) P.S. Спасибо за наводку замечательному блогу http://www.defmacro.org, не перестаю получать удовольствие от тонкого юмора в статьях автора :) P.P.S. А в материалах конференции WMSCI 2005 такие статьи даже печатают! Подробнее обо всей этой истории здесь. |
|
![]() | |
|
Турция
Примерно неделю назад мы с Мариной ( Маршрут был такой: Киев - Одесса - (1.5 дня на теплоходе) - Стамбул - Изник - Ассос - Эгейское море - Измир - Гюмюльдюр - Сельчук - Эфес - Конья - Гёреме (Каппадокия) - Невшехир - Стамбул - (1.5 дня на теплоходе) - Севастополь - Киев. Карта:
В процессе путешествия удалось немного изучить турецкий язык :) Слов 70, которые часто нам были нужны, типа числительных, местоимений и т.д. Ещё я читал, что у него весьма логичная грамматика, и благодарен Ататюрку за введение латиницы вместо арабской вязи, ибо надписи на дорожных знаках так читать несравненно легче. Несмотря на то, что во время путешествия я записывал некоторые впечатления в блокнот, я всё никак не соберусь упорядочить их и привести в какой-то художественный вид. В отличие от меня, Марина - молодец, выкладывает фотографии и пишет отличные отчёты, ссылки на которые я сейчас и приведу. Вступление UPD: |
|
![]() | |
|
О букве Ё
В последнее время я начал проверять орфографию с помощью программы aspell и обнаружил, что в виндовой её поставке нет русского словаря с буквой "ё". Соответственно, при проверке aspell ругается на слова типа "поёт", "смеётся" и т.д., что мне совершенно не нравится. Оказалось, что такая проблема со словарями есть далеко не только у aspell-а, и довольно часто отдельно выпускаются словари с буквой "ё" и без неё. Более того, опросив пару человек в аське, я удивился тому, что многие из них не употребляют в наборе букву "ё", так как "она неудобно расположена на клавиатуре", "и так понятно где она, а где е" и т.д. Немного поисследововав этот вопрос, можно узнать следующие факты:
И что мне кажется более важным: появляются разногласия при написании слов типа "маневр", "желчь", "блеклый", "издевка" и т.д. Таким образом, когда мы видим букву "е" - мы должны задумываться о том как правильно прочесть это слово: с "е" или с "ё". Если бы "ё" было обязательным в этих случаях, разногласий бы не возникло. Действующие правила орфографии не требуют написания буквы "ё", однако рекомендуют её написание в неоднозначных словах. Однако, задумываетесь ли вы например при написании очередного поста в ЖЖ, что слово "все" может быть прочитано как "всё"? Уверен, что нет. Увидев такое слово в неоднозначном предложении, приходится возвращаться к нему и переосмысливать прочитанное, что не менее важно, чем то, что взгляд "спотыкается о букву Ё", что например является одним из главных аргументов "против" в статье Лебедева про Ё из его книги "Ководство". Для того, чтобы исследовать какой процент фрэндов моего ЖЖ использует букву "ё" в своих постах, я написал небольшой скрипт - ёметер :) Он извлекает список друзей, затем последние 25 постов каждого пользователя и проводит простой анализ. Для каждого пользователя затем выдаётся "yo-ratio" (отношение постов с "ё" ко всем постам), так же отношение фрэндов хотя бы раз употребивших "ё" ко всем фрэндам. У меня этот результат таков: total users = 106, significant users = 100, yo users = 64, ratio = 0.64Таким образом 36 процентов моих фрэндов ни разу не употребило "ё" за последние 25 постов! К вам, собственно, и обращён этот мой пост :) Ссылки: - исходный код yometer.py (для использования необходим python и доступ в интернет) UPD: Для поднятия насущности вопроса публикую под катом список фрэндов, не употребляющих "ё" :) (отредактирован после работы скрипта - вычеркнуты англоязычные и украиноязычные юзеры) |
|
![]() | |||||
|
Вторая встреча SpbHUG
Сегодняшняя встреча SpB Haskell user group прошла просто замечательно - услышал много нового и интересного, да и сам что-то хорошее рассказал :) В программе было три доклада:
Я получил свой первый опыт чтения докладов широкой (да ещё и весьма интеллектуальной) публике, получив при этом массу fun-a. Смею надеяться - первый блин не вышел комом :) Остальные доклады тоже весьма порадовали - и интересные результаты, получающиеся в результате вывода этих самых "халявных" теорем, и полезные и интересные техники, описанные Женей, вместе с его замечательными иллюстрациями :) и последующая мини-лекция о realtime-вычислениях и проблемах, с этим связанных, рассказанная Иваном Тарасовым ( Что же, с нетерпением жду следующих встреч! :)
|
|||||
![]() | |||||
|
SPJ "The implementation of functional programming languages"
Сегодня, просматривая свою коллекцию книжек и paper-ов по функциональному программированию, решил посмотреть, что там пишет Simon L. Peyton Jones в своей книге "The implementation of functional programming languages". И был приятно удивлён - как же классно он пишет! Хотел всего лишь прочесть вступление и зачитался! :) Меньше чем за 30 первых страниц книги получаем чёткое, сжатое, понятное и хорошо иллюстрированное описание таких тем:
Конечно, почти все эти темы и ЛИ в общем являются классикой, так сказать ядром функционального программирования, и я про них неоднократно читал раньше в разных источниках. Но столь хорошее описание встречаю, наверное, впервые.
|
|||||
![]() | |||
|
Неисповедимы пути википедии
Весёлая, однако, штука - википедия! Читал статью про метасинтаксические переменные, а буквально через два-три перехода по ссылкам внутри статей - уже попал на статью про куннилингус! :) При этом узнал, что и до него, и после нежелательно чистить зубы и есть чипсы и сухарики :) А в дополнение выпуск xkcd на эту же тему:
|
|||
![]() | |||
|
QuickCheck
Вчера, с подачи Классический пример: есть функция reverse для обращения списков. Тогда можно придумать такие достаточно ярко её характеризующие свойства: propReverseUnit x = reverse [x] == [x] -- (то есть, обращая список из одного элемента - получаем тот же список) propReverseAppend xs ys = reverse (xs++ys) == reverse ys ++ reverse xs -- (обращая конкатенацию списков, получаем конкатенацию обращений частей -- в обратном порядке) propReverseReverse xs = reverse (reverse xs) == xs -- (обращая обращение списка - получаем тот же список) Теперь из-под ghci запускаем QuickCheck: Main> quickCkeck propReverseReverse OK, 100 tests passed и - вот он, момент истины! - QuickCheck сгенерил 100 случайных списков, на которых проверил данное свойство и поскольку оно всегда выполнилось - выдал OK. При этом свойства могут быть и посложнее нежели описанные выше - в них могут присутствовать необходимые для выполнения свойства условия, генерируемые данные могут быть определённым образом классифицированы, кроме этого можно создавать свои генераторы значений, в том числе для рекурсивных типов (легко!) и даже генераторы случайных функций! Для того, чтобы дополнительно управлять случайными значениями, которые генерятся и направлять эти значения в нужное русло - существуют понятие "генератор", которые можно (и иногда нужно) описывать для своих и стандартных типов данных, а также некоторый небольшой фрэймворк, который позволяет эти генераторы комбинировать с помощью стандартных, довольно удобных и отлично продуманных комбинаторов - получая при этом новые необходимые генераторы. На предстоящей встрече Spb Haskell User Group , как раз ожидается доклад по QuickCheck от Дмитрия Тимофеева ( В общем, весьма любопытная штука и немного необычный (по крайней мере для меня) подход к тестированию, который отлично работает в условиях отсутствия побочных эффектов и превращает процесс тестирования в весьма увлекательный процесс размышления над свойствами своей программы. Изначально QuickCheck был написан для Haskell и активно там используется, но поиск в гугле выдал и порт для Erlang .
|
|||
![]() | |||
|
Котята в Киеве :)
У меня вот родились котята с месяц назад (мама - наша Маська, папа - некий сторонний перс), теперь ищем им хозяев. На эту тему сделал здесь пост: Там есть и фотки, и небольшое описание, и контакты. Был бы очень благодарен за помощь в раздаче, ибо в воскресенье утром (29.07) возвращаюсь в Петербург, и было бы весьма неплохо их к тому времени раздать. Котята весьма позитивные, игривые и пока неизбалованные, так что рекомендую :)
|
|||
![]() | |||
|
Киев - СПб
Вчера благополучно переехали в Санкт-Петербург, буду теперь некоторое время здесь жить :) Старый номер телефона можете смело удалять, теперь контакты такие: +7 921 3782469. У нас тут есть чукотские сказки, шахматы, автомобильная сирена по утрам и новый нескрипящий диван! Кроме того, примерно 15 июля ещё вернусь на несколько дней в Киев.
|
|||
![]() | |||
|
Пример изоморфизма
Наткнулся на прикольный пример изоморфизма. Есть игра для двух игроков: каждый по очереди называет число от 1 до 9. Повторяться нельзя. Выигрывает тот игрок, который первым назовёт числа, сумма которых равна 15. Спрашивается: какой известной игре эта игра изоморфна? Комментарии пока скрываются :). P.S. Изоморфизм - это по сути взаимно-однозначное соответствие между двумя множествами, которое сохраняет структуру этих множеств - то есть какой-то набор правил (аксиом), соответствующий множеству, будет выполняться в обеих множествах. UPDATE (ответ) 2 7 6 9 5 1 4 3 8 При этом я немного некорректно поставил условие: действительно, как справедливо отметили некоторые из отвечавших, следует ограничить условия победы тем, что суммировать можно три и только три числа из названных игроком (что соответствует победе тремя крестиками или ноликами, поставленными в ряд). Спасибо всем за ответы, было интересно!
|
|||
![]() | |||
|
Белорусский арабский алфавит
Захотел я почитать в Википедии статью про DSL (domain specific languages) и не пожалел :) Набрал не в той раскладке "dsl", и по запросу "выд" английская Википедия достаточно неожиданно выдала мне с релевантностью 9,9% интересную статью про белорусский арабский алфавит. Поначалу я подумал, что это очередной википедийный вандализм (а-ля недавняя байка про МГУ), но нет. Как оказалось, белорусский язык записывался в XVI-м веке арабскими буквами местными татарами, которые почти в абсолютном большинстве забыли родной язык, но не хотели терять свою религию и нашли такое решение: пересказать Коран на белорусском и записать его с помощью арабской письменности. Возникли проблемы с некоторыми звуками, которых изначально не было в арабском ("ж", "ч", "п", "дз", "ц", а также "у краткое"), но они были решены введением новых символов. Таким образом, возникли "китабы" (kitabs) - целые книги, записанные подобным образом - преимущественно религиозные и фольклорные. Сейчас китабы хранятся в библиотеках АН Беларуси, АН Литвы, Вильнюсского, Петербургского и Казанского университетов, а также в частных коллекциях. Ссылки по теме: Статья на русской Википедии Более подробная статья о кетабах (англ.)
|
|||
![]() | |
|
Haskell: комбинаторные парсеры Parsec.
Что же, в прошлый раз мы вспомнили формы записи операторов и рассмотрели написание простого вычислителя постфиксных выражений на Haskell. Следующим шагом является создание транслятора выражений из инфиксной формы - в префиксную. Однако, перед этим нам необходимо улучшить разбор выражения на токены, поэтому в данной статье мы рассмотрим монадические комбинаторные парсеры на примере модуля Parsec, а также использование их на практике. ( Haskell postfix: часть вторая. Комбинаторные парсеры Parsec. ) |
|
![]() | |||||
|
Exaile и opensource
В очередной раз убеждаюсь, что хорошая штука opensource :) Я пользуюсь Linux Ubuntu и недавно сменил основной аудио-проигрыватель с Amarok на Exaile, поскольку Amarok, будучи KDE-приложением, несколько тормозил при запуске в моём Gnome. Exaile - является некоторым подобием Amarok под Gnome, вполне приятный плэйер, в котором есть интеграция с last.fm, неплохой менеджер артворков, нотификации, работа с мультимедийными клавишами out of the box, приятный внешний вид и т.д. После перехода я обнаружил, что некоторых мелочей мне не хватает и решил сделать их сам. svn co svn://exaile.org/usr/local/svn/exaile/trunk trunkи вперёд! :) Заодно познакомлюсь с Python и GTK. Захожу на канал #exaile в IRC, знакомлюсь с одним из двух разработчиков Exaile - sjohannes, пытаюсь задавать какие-то вопросы. В принципе ребята на вопросы отвечают, но помогать в разборе кода особенно не хотят. Что ж, посмотрю сам. Поначалу я реализовал простенькую фичу. Заключалась она в добавлении возможности "Load", которая параллельно очищала плэйлист и добавляла в него выбранный трек или альбом: добавил menu item "Load" в контекстное меню, навесил на него обработчик. В итоге всё вылилось в такой вот ticket с патчем. Вторая же возможность, которую я добавил, была навеяна похожей функциональностью Eclipse IDE и сразу понравилась разработчикам. Я говорю о возможности "Show in collection", которая может быть полезна при желании быстро перейти от трека в плэйлисте к соответствующему треку в коллекции (это важно при прослушивании случайных треков, при этом иногда хочется послушать полностью ту группу, которая только что играла и, как следствие, нужно искать её в коллекции, что возможность делает автоматически). В Eclipse этой возможности соответствует переход от текущего редактируемого файла к его ноде в дереве проекта. В итоге, я сделал ещё один патч. Эта идея и её реализация уже гораздо больше впечатлила sjohannes, и он сказал, что непременно включит её в следующий релиз (см. UPDATE). Что ж, буду рад :) Хочется отметить, что Python, как и обещалось многими, оказался действительно интуитивно понятным языком, с хорошим синтаксисом. Практически все вещи, что я делал почти наобум - работали именно так, как полагалось. Мне кажется, что это весьма важное качество языка - works as expected. Насчёт GTK и биндингов под Python - pyGTK, тоже ничего плохого сказать не могу, хорошая документация, поработал с деревом и его моделью без особенных проблем. Хотя здесь, конечно, моё мнение весьма поверхностно и сравнивать мне не с чем, ибо я никогда не занимался разработкой GUI под Linux. Резюмируя, можно сказать, что теперь я на собственном опыте прочувствовал один из плюсов открытых исходных текстов - при определённой квалификации и желании можно достаточно просто реализовать нужные и вполне полезные вещи и, возможно, донести их другим, что не может не радовать. UPDATE: Функциональность "Show in collection" добавили в Exaile в ревизии 2358 ("svn log -r 2358").
|
|||||
![]() | |
|
Haskell Postfix: часть первая. Операторы. Вычислитель постфиксных выражений на Haskell.
Недавно я встретил упоминание ещё об одном сайте, предлагающем разные математические и программистские задачи. Это Sphere Online Judge (http://spoj.pl). От популярного нынче "Проекта Эйлера" (http://projecteuler.net) отличается тем, что вводятся не ответы на задачи, а на сервер загружается сам код, который там компилируется и запускается на тестовых примерах. Решение одной из задач этого контеста привело к довольно интересным для меня результатам, о которых я решил написать небольшой цикл статей. Некоторое время думал для кого писать эти статьи и какова их цель. Наверное, их будет интересно прочитать людям, желающим познакомиться с функциональным языком программирования Haskell без особого углубления в теорию, а также тем, кто просто интересуется математикой, языками программирования, всякого рода парсингом и прочими околоакадемическими вещами. Уровень изложения материала - весьма доступный, надеюсь многое будет понятно людям, не особенно знакомым с функциональными языками программирования. Содержание статей будет примерно таким: Тех, кому интересно - прошу к прочтению первой части :) ( Haskell Postfix: часть первая. Операторы. Вычислитель постфиксных выражений на Haskell. ) |
|
![]() | |||
|
Равны ли 0,(9) и 1? Периодические дроби.
Отвечавшим на мою анкету и думавшим над вопросом про 0,(9) посвящается :)
Как-то сидели мы с Равны ли числа 0,(9) и 1? Вопрос этот, наверное, несколько странный и многих, особенно нематематиков, может удивить и ответа на него не будет. Как мы знаем, число - это одно из основополагающих понятий математики, мир чисел постоянно пополнялся на протяжении развития человечества. В первом классе мы изучали самые первые числа: 1, 2, 3... Эти числа называются натуральными, и их множество обозначается буквой N. В рамках этих чисел можно отлично выполнять операции сложения и умножения. Если же мы захотим применять вычитание, то из подсознания выплывает фраза вроде "Из 2 яблок нельзя вычесть 4" или что-то в этом духе. Таким образом, мы получаем какие-то ограничения, которые расширяются введением отрицательных чисел. Множество всех отрицательных и положительных чисел называется множеством целых чисел и обозначается буквой Z. В рамках этих чисел отрицание уже выполняется без всяких проблем (2 - 4 = -2). ( Читать дальше )
|
|||
![]() | |||
|
Hello, space dog
Грядущему дню космонавтики посвящается. Узнал такие вот факты о собаках-космонавтах.
Первым живым существом с Земли, попавшим на Земную орбиту была собака Лайка. Её нашли, бродившей по улицам Москвы, затем она прошла конкурсный отбор среди трёх других собак. ( читать далее )
|
|||
![]() | |||
|
Geek-анкета
Вдохновившись начинаниями Итак, вашему вниманию предлагается небольшой окологикерский опросник. Я надеюсь, что ответы на вопросы принесут вам несколько минут радости и подтолкнут к интересным размышлениям :) Отвечать желательно на большинство вопросов, однако если вопросы вызывают затруднение или непонимание - пропускайте без проблем. Кроме этого очень welcome предложения по поводу улучшения структуры и содержания анкеты, например внесения в неё интересных элементов - рекурсий, замыканий и т.д. и т.п. :) 1. Кто вы? (можно писать несколько своих алиасов :))
|
|||
![]() | |||||
|
Ванная, комбинаторы и волосы на лобке
Лёжа в ванной, думал о том, что ванная, в сущности, не очень удобное место для отдыха - здесь нельзя разместить ноутбук и нельзя даже взять с собой книгу (разве что ту, что совсем не жаль). Здесь, конечно, доступны некоторые развлечения (обычно свойственные новорожденным), но лучше таки использовать её как надо - для расслабления :) Да, ещё там удалось попить джин-тоника из банки! :) А, ещё задался там вопросом - зачем, интересно, волосы на лобке? Наверное можно занести куда-то в раздел "детские вопросы" :) Ответы и предположения - можно в комменты. Ещё сегодня открыл для себя исчисление комбинаторов - вещь, которую мы совсем не изучали по дискретной математике, вполне интересно. Получается, что исчисление комбинаторов - это такое себе полупрограммистское исчисление без переменных. И комбинатор, по сути, представляет собой некий объект, который просто комбинирует свои входы (то есть те объекты, к которым он применён). А входы представляют собой те же объекты или комбинаторы. Они обычно обозначаются латинскими буквами и имеют названия а-ля "канцеллятор", "дупликатор" и т.д. В этом исчислении существует единственная операция - применение комбинатора. В общем, кому интересно - можно почитать здесь: http://en.wikipedia.org/wiki/Combin
|
|||||
