catpad, posts by tag: программирование - LiveJournal (original) (raw)

Итак, монады. Я решил поделиться с читателями своим просветлением. Далее следует самое краткое объяснение монад, которое когда-либо существовало. Оно не совсем программистское, а больше философское, но по-моему, именно так и нужно понимать монады.

( Read more...Collapse )

Предпринял сто пятидесятую попытку изучить Haskell. Обнаружились два прекрасных ресурса:

  1. Learn You a Haskell! - полный учебник онлайн (он же продаётся на Амазоне), очень хороший - и по отзывам, и по опыту чтения.
  2. Yet Another Monad Tutorial - на этот раз прямо в ЖЖ, и кажется, самое понятное объяснение монад, из всех, попадавшихся в интернете.

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

Seven Languages in Seven Weeks - практически книга мечты.
Объясняются Ruby, Io, Prolog, Scala, Erlang, Clojure, Haskell. Из них я кое-как знаю Prolog, совсем чуть-чуть Erlang и ещё меньше Haskell.
Очень интересно будет почитать, чего и всем желаю.

мне нравится вот это замечание:

"ps. A famous one line APL program (Conway's game of life), see http://catpad.net/michael/apl"
(отсюда).

Famous! Вот как.

И вот ещё хорошо, отсюда:

"As soon as you're using conditionals (which, granted, [http://catpad.net/michael/apl/ isn't always the case]) multiple returns will probably be useful."

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

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

gianthare приводит отличную цитату из книги Фреда Брука "Мифический человеко-месяц".
По-моему, это самое лучшее и исчерпывающее объяснение того, почему интересно заниматься программированием.

Очень советую почитать людям, никакого отношения к программированию не имеющим.

Да, вот ещё напишу, пока не забыл.
Раз уж всё сейчас online, то и программировать нужно тоже начинать online.
А именно, идёшь на сайт Online Java IDE или Online C++ IDE или что угодно ещё, создаешь там проект и начинаешь добавлять файлы, то есть страницы. Естественно, редактор поддерживает syntax highlighting, code completion и все остальные удобные вещи. Можно указать, какие именно библиотеки нужны для линковки, если что-то недоступно - загружаешь сам. Там же кнопочка "скомпилировать". Что делать дальше, пока ясно не совсем. Скорее всего, должно выделяться некоторое место на виртуальном диске, с которым можно работать как со своим собственным. Если это консольная программа, то тут всё просто. Если же это GUI или ещё что-то очень сложное, то тут можно просто загрузить себе на компьютер получившийся executable.
Зачем это нужно ? Очень просто: во-первых, проекты никогда не будут теряться. Тут же и source control, конечно, чтобы несколько человек могли работать над одним проектом, и сохранение версий. Во-вторых, проект можно объявить public, сделав его, таким образом, open source, так, чтобы над ним тут же (не сходя с этой страницы) могли работать другие люди.
В-третьих, часто бывает, что какая-то среда не установлена на компьютере, или устанавливать её не хочется ради какого-то одного небольшого проекта. Или вот, скажем, я хочу попробовать написать программу на Haskell'e или на ещё на чём-то для пробы, а устанавливать компилятор не хочу. Вообще, как известно, одно из больших препятствий, когда начинаешь программировать на новом языке - это установка среды и попытки разобраться с компилятором. А тут волшебный сайт будет сам всё за тебя делать - только знай, пиши программы.
Или кто-то находится дома, а ему нужно срочно внести изменения в проект - тоже вариант.

Кроме этого, к таким проектам можно тут же приделать все современные веб-штуки: дискуссии, комментарии, вики-страницы, notes, links - что угодно. Как было бы здорово, чтобы прямо на странице с кодом были бы комментарии и обсуждения, советы, ссылки на какие-нибудь статьи и книги и т.п. И конечно же, чтобы работал обычный гипертекст - чтобы, например, нажав на вызов функции, можно было перейти к её определению и всё остальное, что обычно работает в таких случаях.
Вот, вот чем нужно заниматься стартапам!

Понял, чего мне не хватает. Мне нужен source editor, в котором я могу поверх кода рисовать стрелочки, обводить важные места, подчёркивать, выделять другим цветом, зачёркивать что-то, что нужно будет изменить, рисовать на полях схемы (например, иерархию классов или какой-то протокол - сейчас я это делаю с помощью символов ASCII в комментариях, что ужасно неудобно). Причём, чтобы это делалось послойно, как в Фотошопе: на одном слое стрелочки, на другом картинки, на третьем чьё-то code review. Вот это был бы редактор!

Долго думал и, наконец, решил изучить два языка программирования - Haskell и Erlang.
( Read more...Collapse )

Я уже очень давно написал совсем маленькую библиотеку на Java, которая называется InfoBus и позволяет множеству threads (здесь я их называю service threads) асинхронно посылать друг другу сообщения.
Звучит просто, даже слишком, но библиотека эта оказалась настолько полезной и универсальной, что я таскаю её за собой из проекта в проект и с одной работы на другую уже много лет (постепенно изменяя по ходу дела), и вообще не представляю, как можно какую-либо multithreading-программу написать на Java без неё. В общем, я наконец-то собрался сделать для неё документацию и примеры и выложил на сайт.

Конечно же, подобные библиотеки наверняка существуют, но эта моя собственная, и она мне очень нравится. Я использовал её уже в четырёх проектах - двух GUI, одном сервере, который работает с китайской биржей и одном proxy-сервере, который нужен мне для программы визуализации, о которой я как-то уже писал.

Библиотека основана на трёх основных принципах:

  1. Service threads никогда не блокируют друг друга;
  2. Они всегда спят, когда нет работы;
  3. Работа появляется, когда один из сервисов посылает другому communication queue item. Этот-то item и заключает в себе логику программы, которая должна выполняться в контексте того service thread, которому послано сообщение.
    Таким образом, сами service threads "ничего не знают" о той работе, которую они выполняют - они просто просыпаются, когда обнаруживают очередной item в своей очереди, вызывают его метод execute и засыпают дальше.
    (И ещё у service thread работает failover: если один из сервисов вдруг упал, он будет тут же запущен снова).

Всё это и в самом деле ужасно просто, но тем-то оно и сильно! Призываю всех, кто пишет на Java, попробовать. Подробное описание, API и download здесь.
Там же есть и простые примеры. Вчера я сделал пример "обедающих философов" и прокрутил для 1000 философов (то есть 1000 service threads). Работает всё очень хорошо.

Напишите мне, если кто-то будет пользоваться!