Python + pipes

Monday, 18 April 2011 03:29
skiminok: (xkcd)
Вот что значит гибкий язык.

Чтобы добавить в питон пайплайны, достаточно определить элементарный декоратор над iterables, переопределив в нем оператор "|". Взамен получаем просто-таки F#:
[1,2,3,4] | where(lambda x: x<=2) | as_list


При этом исходный код этого катастрофически сложного нововведения занимает 7 строчек. Не считая библиотеки стандартных комбинаторов.
class Pipe:
    def __init__(self, function):
        self.function = function

    def __ror__(self, other):
        return self.function(other)

    def __call__(self, *args, **kwargs):
        return Pipe(lambda x: self.function(x, *args, **kwargs))


Вообще, если бы в питоне была статическая типизация, я бы из него до конца жизни не вылезал.
skiminok: (Default)
Читать тут

Мой очередной ночной труд. К сожалению, из-за того что на Хабре чертово драконовское ограничение на объем статьи, полностью осветить вопрос не получилось, пришлось пожертвовать парочкой параграфов (делить на несколько статей уж сильно не хотелось).

Но все равно, как по мне, получилось неплохо. Конечно, в первую очередь inspired by [livejournal.com profile] antilamer :)
skiminok: (Default)
Тут один умный человек ещё раз рассосал по косточкам свои объективные претензии к C++. Причем на этот раз я с ним в каждом слове целиком и полностью согласен. Лично я бы добавил ещё парочку пунктов, кроме изложенных, но это уже не суть важно. Читайте.

Кстати, забавно получилось с грамматикой. В комментариях изрядно удивленный народ в шоке обсуждает «как же это так, контекстно-зависимый язык, как они там вообще компилятор-то написали, какая же это каша в нем творится?» У них в голове не укладывается :) Что же, вполне справедливо.
skiminok: (!int)
Феерический пиздец, кровавый угар, содомия и червие
Не ходите, дети, в Африку гулять, по желтопрессным материалам искать, как реализованы регекспы. На козлобарана вроде этого наткнетесь.
Лучше годные книжки читайте.
P.S. Трындец капустный, его еще и в топ выводят. Моя бы воля, стопиццот минусов поставил.

UPD: «Автор переместил топик в черновики.» Вот и славно.
skiminok: (Compas)
За последние несколько месяцев у меня набралось несколько планов на статьи, которых сильно не хватает хабра-аудитории. В целом они делятся на три больших класса: ФП, Computer Science и ACM-алгоритмистика.

Это - список, себе на память, чтобы брать из очереди, как время появится.

  • FParsec - "утереть нос" товарищу Дмитрию mezastel Нестеруку :)

  • Списочные гомоморфизмы. Свертка. Сканирующие пробеги. Короче, основы Vector Models for Data-Parallel Computing, и немного про MapReduce с математической стороны вопроса.

  • Структура данных Rope, на основании уже существующего моего цикла про декартово дерево.

  • В рамках той же темы "Основы Computer Science: ликбез для птушников" - λ-исчисление, порядок редукций, теорема Черча-Россера, и как отсюда логически выходят потоки и ленивые вычисления. Ссылки на SICP и ПФП.

  • (?) Что-то про теорему Райса и теоретически вычислимые алгоритмы. Можно и классы сложности упомянуть.

  • Дерево отрезков.

  • (?) Дерево Фенвика.

  • Суффиксный массив, его применения. Возможно - суффиксный автомат и дерево. Уже почти год хочу рассказать, офигенная вещь ведь.


To be continued...
skiminok: (xkcd)
Тут сегодня некто решил перевести на Хабре скучный пост с перечислением фич нового контейнера SortedSet<T> из .NET 4.0. Увидел я его только к вечеру, поскольку весь день мотался по городу. Пролистнул, ничего особенного вроде не обнаружил (в конце концов, что я не знаю про их дерево и его внешний интерфейс?), хотел было уже закрывать, как тут глаз зацепился за название метода GetViewBetween.

Видимо, когда я сразу после выхода .NET 4 просматривал спеки MSDN, я его как-то картинно и красиво прое не заметил. Полез в документацию. Совершенно не в стиле MSDN: капитанское описание цели метода (спасибо, я это и так уже знаю!), пример кода и ни слова о сложности алгоритма. Ладно, будем действовать самостоятельно.

Ценная строчка в документации указала, что класс хранится в сборке System.dll. Лезем в папку с фреймворком, открываем сборку Рефлектором, прокручиваем до нужного класса и нужного метода. Далее - серия code snippet`ов: как я в поисках истинной реализации прыгал от метода к методу:

public virtual SortedSet<T> GetViewBetween(T lowerValue, T upperValue)
{
    if (this.Comparer.Compare(lowerValue, upperValue) > 0)
    {
        throw new ArgumentException("lowerBound is greater than upperBound");
    }
    return new TreeSubSet<T>((SortedSet<T>) this, lowerValue, upperValue, true, true);
}


public TreeSubSet(SortedSet<T> Underlying, T Min, T Max, bool lowerBoundActive, bool upperBoundActive) : base(Underlying.Comparer)
{
    this.underlying = Underlying;
    this.min = Min;
    this.max = Max;
    this.lBoundActive = lowerBoundActive;
    this.uBoundActive = upperBoundActive;
    base.root = this.underlying.FindRange(this.min, this.max, this.lBoundActive, this.uBoundActive);
    base.count = 0;
    base.version = -1;
    this.VersionCheckImpl();
}


internal Node<T> FindRange(T from, T to, bool lowerBoundActive, bool upperBoundActive)
{
    Node<T> root = this.root;
    while (root != null)
    {
        if (lowerBoundActive && (this.comparer.Compare(from, root.Item) > 0))
        {
            root = root.Right;
        }
        else
        {
            if (upperBoundActive && (this.comparer.Compare(to, root.Item) < 0))
            {
                root = root.Left;
                continue;
            }
            return root;
        }
    }
    return null;
}
 


Все, приехали. Очевидный проход по дереву за O(H). Поскольку дерево у них там внутри сбалансированное (красно-черное, если конкретнее) - за O(log N).

Подводя итоги: неужели я таки дожил до этого священного дня, когда в стандартной библиотеке .NET появился lower_bound на set`ах? Учитывая, что BigInteger там тоже уже имеется, остается только пожелать для полного счастья next_permutation. Ну и какой-нибудь там nth_element на закуску.

Только вот ведь блин, нет этого .NET 4 нигде. Ни на одном контесте :(
skiminok: (Default)
А я тут продолжаю отортовывать Хабр и выносить помаленьку мозг всем его читателям :)
Декартово дерево: Часть 2. Ценная информация в дереве и множественные операции с ней.
skiminok: (Default)
Я вернулся с Севастопольской ЛКШ. Скажу пока только, что там было офигенно, полный отчет сейчас делать нет сил.

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

Надеюсь, всем будет интересно почитать ;)
skiminok: (xkcd)
Если кто еще не видел, то вчера добрый человек выложил на Хабрахабр статью по разработке (на самом деле 4 статьи, они идут друг за дружкой по цепочке) потрясающей значимости и отличнейшего контента.
Всем френдам настоятельно рекомендую. Очень рекомендую.
skiminok: (Compas)
За последнюю неделю ваш покорный слуга успел побывать на семинаре Тимошенко "Введение в специальность", на вводной встречей OSUM для ИПСА, на тусовке IT-JAM и, наконец, на очередном Microsoft Developer's Day, на этот раз посвященном PDC2009. Говоря по-хорошему, о каждом из этих ивентов стоило бы рассказать поподробнее, а принимая во внимание их масштаб и количество интересной информации, как минимум тройка интересных записей из этого дела и получилась бы.

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

А пока этого поста в блоге не видится, Ским, продолжающий терзать глубины функционального программирования, отыскал на просторах Хабрахабра статью про катаморфизм в F#.

Черт возьми, это же так красиво. И действительно так просто:

let FoldTree treeF leafV tree =
    let rec loop tree cont =
        match tree with
        | Node (val, left, right) -> loop left (fun lacc ->
                           loop right (fun racc ->
                           cont (treeF val lacc racc)))
        | Leaf -> cont leafV
    loop tree (fun x -> x)
skiminok: (Default)
Немного про L-грамматики. Это потрясающе.
(мотороллер не мой)
skiminok: (Default)
Привет всему честному люду. Давайте я дам вам краткую подборочку событий за тот месяц, пока я был слишком занят, чтобы писать в свой ЖЖ.

Через неделю выходит на свет божий RAD Studio 2010. Я не знаю, буду ли я делать её полный обзор, как год назад, но если буду — то как минимум после того как загружу, установлю на свою машину и опробую все своими руками. А также почитаю справку.
По крайней мере, если судить по delphifeeds.com, то количество удобных возможностей опять впечатляет и опять дает робкую надежду на долгую и безоблачную жизнь прекрасному языку программирования.
Как минимум у нас есть RTTI уровня дотнетовского отражения, атрибуты, кастинг интерфейсов в объекты, улучшенная во много раз IDE, дебаг-визуалиаторы, поддержка естественного ввода (тачей и жестов) в VCL, Firebird, SOAP 1.2, JSON и множество разных мелочей.

Наша дружная квиповская команда совместными усилиями родила долгожданную статью на Хабрахабр: QIP: точки над "i". Целью было наконец-то объяснить всем негодующим, что творится за кулисами Инфиума, ситуацию, сложившуюся вокруг проекта, развенчать несколько оригинальных мифов и помочь тем, кто проект ненавидит. Знаете, получилось. Мы собрали такой холивар и собрание вопросов в комментариях, какой встречается на ресурсе не так уж часто. И, судя по всему, все-таки обратили мнение о программе к лучшему не у одного человека. Приятно это, когда правду можно говорить открыто, и эта правда помогает любимому проекту...
На очереди, наверное, мануал по плагонаписанию. Я давно думал что-нибудь подобное вкратце рассказать для населения.

Вообще я продолжаю увлекаться Хабрахабром. Да, конечно, Хабр уже не торт, но он продолжает оставаться:
  • ценнейшим ресурсом IT-новостей
  • отличным сборником пользовательского мнения
  • хорошей коллекцией познавательных статей по программированию
  • неплохим местом для заведения полезных и хороших знакомых

Так что будем продолжать писать. Это полезно, где бы то ни было.

Вот, к примеру, именно с Хабра я узнал о Киевском Coffee'n'Code. Думал пойти еще на первый, но его темы в итоге скатились в полный Веб и обсуждение вебдевовских фреймворков, к которым я не имею никакого отношения. Зато вот второй, судя по всему, очень даже заинтересует. Главное — чтобы никакая гадость (вроде вуза) не перебила поездку.

Работаю над PluginUpdater`ом. Сказать, что он сырой — не сказать ничего. Он икает, дергается, иногда выставляет претензии, многое не умеет, часть умеет, но не так, как надо, а часть вообще умеет, а все желают, чтобы не умел =) Короче говоря, это совершенно не то состояние, в котором должен находиться софт подобного уровня. Поэтому я работаю судорожно, август заканчивается, а по опыту знаю: как только начнется вузовский семестр, моё свободное время начнёт улетучиваться просто с поразительной скоростью. И пока оно еще есть, надо много сделать. Итогом этого "много" и форумских споров стало то, что сегодня мне совершенно не хочется ничем заниматься, хотя туду разросся до галактических масштабов. Вот, поэтому сижу, пишу в блог...

Кстати, о блоге. Потратил полчаса, прошел по нему до самого зарождения и залочил самые экстравагантные записи, сделанные в период юного и беззаботного детства. Всего маразматичных, личных и смешных постов оказалось штук 20, остальные ещё можно показывать людям :) Когда читал некоторые — ржал до безумия, но таких меньшинство, в основном это те, которые просто не соответствуют тематике блога. Знания изменились, кардинально. А вот взгляды, что интересно, с тех пор остались практически те же.

Исполнил древнее желание — купил комбинацию APC-шных стабилизатора и ИБП. Потому что за всё лето, по-моему, так ни разу и не выключал компьютер самостоятельно: постоянно это было по вечерам из-за перебоев в электричестве. Спасибо тебе, наше дорогое Киевэнерго.
Зато теперь я по крайней мере могу не бояться, что однажды в солнечный и приятный вечер у меня полетит к чертям собачьим дневная работа.
А вообще, бекапы — наше всё.

У меня сейчас есть аккаунт на самых популярных сайтах по инвайтам: Хабрахабр, Дару~Дар, Демоноид, 0дей, Новафильм. Хорошие друзья, хорошая репутация и хорошие места дислокации многое решают. Проблема только в том, что на некоторых из них я не могу похвастаться активностью: всё-таки Волевские тарифы дают о себе знать. Ну нет в моём районе достойных домашних сетей, нет. А есть всем ненавистные Воля, ОГО, Билайн и дорогущие беспроводники. Придется пока что так и сидеть. Тем более что волевцы хитрые, они бонусами заманивают, скоростью, акционными временными анлимами, бесплатными ресурсами на своём DC. Ну что же, придется пока сидеть так.
По крайней мере Хабр и ДаруДар я облюбовал по полной программе)

Практически полностью перешёл на C#. На Делфи кодю плагины для Инфиума (человеческий перевод .NET SDK, который я пытался организовать, лежит пока в сторонке недописанным, к сожалению) и редкие просьбы друзей о мелких утилитах. Последние, кстати, тоже скоро буду делать на дотНете.
А уж Google Code Jam 2009 и подавно писать надо будет на шарпе. Только для него надо бы ещё какой-нибудь мелкий подручный скриптовый язык для быстрых задач. Пока изучаю потихоньку PowerShell, со всем остальным стаффом этого класса я как-то не дружу. В общем, посмотрим.

TopCoder. Четко осознал свою позицию: синий. То есть уровень — выше среднего участника, однако среди таких высших — худший. Что ж, я так и подозревал с самого начала.
До жёлтого я поднимусь, судя по всему, не раньше чем через полгода. А уж о красном можно только мечтать.
Потому что, как я однажды писал в статусе, «из этого человека никогда не выйдет хорошего олимпийца. Он умеет хорошо думать. Он умеет красиво писать. Теперь только научите его делать это БЫСТРО!»

Старый комп надо будет вытащить на свет божий из шкафа и приспособить к какому-то полезному делу. *Ага, в однокомнатной квартире...* Потому что считать себя особой, имеющей отношение к IT, и не разбираться должным образом в администрировании — бред собачий.

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

Profile

skiminok: (Default)
skiminok

Most Popular Tags

July 2011

S M T W T F S
     12
3456789
10111213141516
17181920212223
242526272829 30
31      

Syndicate

RSS Atom