• Монады с точки зрения теории категорий

    • Translation

    Введение

    Кажется, монады в программировании стали загадкой века. И для этого есть две причины:
    • недостаточное знание теории категорий;
    • многие авторы стараюстся не упоминать категории вообще.
    Это как говорить об электричестве не используя мат. анализ. Достаточно для замены предохранителя, не хватит, чтобы спроектировать усилитель.

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

    Я уверен, что монады с точки зрения категорий почти элементарны.

    Содержание

    1. Категория
    2. Функтор
    3. Естественное преобразование
    4. Монада
    5. Монады исключения и состояния
    6. Монады в программировании
    7. Ссылки
    Читать дальше →
  • Просто о Хиндли-Милнере

    • Translation

    Введение


    Robert MilnerЕсли вы когда-нибудь интересовались не слишком популярными языками, то должно быть слышали о «Хиндли-Милнере». Этот алгоритм вывода типов используются в F# и Haskell и OCaml, как и в их предшественнике ML. Некоторые исследователи даже пытаются использовать ХМ для оптимизации динамических языков вроде Ruby, JavaScript и Clojure.

    И не смотря на его распространенность, до сих пор не было простого и понятного объяснения, что же это такое. Как же эта магия работает? Всегда ли выводимые типы будут верными? Или чем Хиндли-Милнер лучше, скажем, Java? И пока те, кто действительно знает что такое ХМ будут восстанавливаться от очередного умственного перенапряжения, мы попробуем разобраться в этом сами.
    Читать дальше →
  • Pathogen. Организуем плагины

      Проблема


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

      Решение


      Pathogen позволяет устанавливать плагины в отдельные директории совершенно прозрачно для вима, причем плагины размещенные «по-старому» продолжат работать (например коллекция цветовых схем).

      Пример директорий на рабочей машине:
      $ ls ~/.vim/bundle/
      eclim          nerdtree             vim-align     vim-haml      vim-ruby           vim-vividchalk
      gist           PreciseJump          VimCalc       vim-markdown  vim-ruby-debugger  wombat256mod
      IndexedSearch  snipmate.vim         vim-cucumber  vim-rails     vim-shoulda
      jquery         SuperTab-continued.  vim-fugitive  vim-repeat    vim-surround
      matchit.zip    textile.vim          vim-git       Vim-R-plugin  vim-tcomment
      

      Читать дальше →
    • Вкладки

        Открываем


        VIM Tabs
        Открыть вкладку можно тремя разными способами, самый простой и интуитивный :tabnew в нормальном режиме, он откроет новую вкладку с пустым буфером. Можно сразу открыть вкладку с файлом, передав его имя как параметр

        :tabnew futuri.co

        Вкладки можно также открыть сразу после запуска, если добавить ключ -p перед списком имен файлов — для каждого откроется своя вкладка.

        vim -p habra.sh habr.py
        Читать дальше →
      • Масштабируемость реляционных БД

        • Translation

        Q:


        В Facebook используют MySQL зная, что он плохо масштабируется (или здесь какая-то особая магия?). Я хотел спросить, из каких соображений они выбрали MySQL? Используют ли JOIN'ы? И не планируют ли перейти на другую БД?


        A:


        Отвечает Adam D'Angelo, бывший CTO Facebook, сейчас он развивает свой стартап Quora:
        1. Если разбивать данные по разным серверам на уровне приложения, то масштабируемость MySQL не такая уж и большая проблема. На 2008 год, в Facebook [1] у нас было 1800 MySQL серверов для которых требовалось всего два администратора. Конечно, вы не сможете сделать JOIN с данными с разных серверов, но NoSQL-базы вам тоже этого не позволят. Нет никаких данных о том, что в Facebook используют Cassandr'у как основное хранилище, и, кажется, что единственное, для чего она там нужна — это поиск по входящим сообщениям. [2]

        Читать дальше →
      • Пишем свой XML-парсер

          Предыстория


          Решив запустить небольшой сервис на подаренном мне хостинге, оказалось, что там нету ни одного xml-парсера: ни SimpleXML, ни DOMXML, а только libxml и xml-rpc. Недолго думая, я решил написать свой. Мне требовался разбор не сложных rss-лент, поэтому хватило достаточно просто класса xml => array.[1]

          Но для интересной статьи этого было явно не достаточно, поэтому сейчас мы напишем свою замену для SimpleXML. А заодно пробежимся по многим интересным возможностям PHP 5.

          Постановка задачи


          Доступ к элементам у нас будет осуществляться как доступ к свойствам класса, например $xml->element, а доступ к атрибутам элемента, как к массиву, те $xml->element['attr'], также реализуем проверку на существование атрибута при помощи isset() и итерацию по элементам при помощи foreach. И так, начнем.
          Читать дальше →
        • Самый недооцененный язык в мире

          • Translation
          JavaScript logo
          JavaScript, также известный как Mocha, или LiveScript, или JScript или ECMAScript один из самых популярных языков программирования. Фактически каждый персональный компьютер имеет его интерпретатор и активно им пользуется. JavaScript всецело обязан своей популярностью тому, что он стал основным скриптовым языком для веба.

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

          Читать дальше →
        • Глючные комментарии

            При ответе на комментарий, иногда он добавляется как ответ к топику, а когда комментишь еще раз — добавляется именно к тому комментарию, на который хотел ответить в первый раз.
            Судя по-всему такая ошибка не только у меня.
            [XP SP2, Firefox 2.0.0.12]