OM A XYM

Namdak Tonpa

OM A XYM
обширное пространство сердечной сущности

ВсіДрузіБіографіяАрхівОстаннєНаписати


Scala 2PC DTC XA
29 Sep 2014|10:09pm
package org.example

import akka.actor._
import scala.reflect._
import akka.pattern._
import Helper._

abstract class Coordinator[T, TA: ClassTag] extends Actor {
  import context.dispatcher
  private def transactor(id: String) = context.child(id) getOrElse context.actorOf(Props(classTag[TA].runtimeClass), id)
  final def receive = {
    case rs: ReqSeq[T] => import rs.askTimeout
      transactor(rs.tid) ? Process(rs) pipeTo sender
  }
}

abstract class Transactor[T, P 
      scheduleTimeouts(parent == null, p.rs.merging(acc, votes))
      transact = p.rs; parent = sender; acc ++= p.rs.data
      for (r <- p.rs.data) process(Req(tid, r))
    case v: Vote[T] =>
      stat += sender -> v
      for (newVote <- transact.merging(acc, votes).apply; (actor, vote) <- stat) actor ! newVote(vote.req)
    case a: Ack[T] =>
      stat -= sender
      if (stat.isEmpty) a.vote.isCommit toOption commit getOrElse rollback
    case "Timeout" =>
      if (stat.nonEmpty) { for ((actor, vote) <- stat) actor ! Rollback(vote.req); rollback }
      context stop self
  }
}

trait Processor[T] extends ProcessorLike[T] {
  import context.dispatcher
  final def receive = {
    case r: Req[T] =>  process(r) pipeTo sender
    case o: Commit[T] => complete(o.req) map (_ => Ack(o)) pipeTo sender; context stop self
    case o: Rollback[T] => rollback(o.req) map (_ => Ack(o)) pipeTo sender; context stop self
  }
}

_______
[1]. https://github.com/dk14/xa (Scala one)
[2]. https://github.com/spawnproc/xa (Erlang one)
6 +


UPL Derivatives
23 Sep 2014|10:36am
Решил проверить свой язык на деривативах, вот что получилось:

instrument 'Stub_Amort_Swap'
parties name DB id PARTYAUS33 trade DB-0001
        name Barclays id BARCGB2L trade SW2000

stream pay Barclays rate 'EUR-LIBOR-BBA' monthly 6 of
       notional range 06/14/1995 50000000
                      12/14/1995 40000000
                      12/14/1996 30000000
                      12/14/1997 20000000
                      12/14/1998 10000000
       from 01/16/1995 to 12/14/1999 adjust NONE, MODFOLLOWING
       starting 06/14/1995
       recalculate monthly 6 roll 14
       reset 2 business days before monthly 6 adjust MODFOLLOWING
       initial stub interpolate rate from 4 months to 5 months
       fraction 'ACT/360'
       calendar GBLO

stream pay DB rate 6% annual of
       notional range 06/14/1995 50000000
                      12/14/1995 40000000
                      12/14/1996 30000000
                      12/14/1997 20000000
                      12/14/1998 10000000
       starting 12/14/1995
       recalculate annual roll 14
       calendar DEFR
       fraction '30E/360'


Сравните пожалуйста с тем как сейчас представляется амортизационный стаб своп в современных информационных системах:
http://www.fpml.org/spec/fpml-5-0-8-rec-1/html/confirmation/xml/products/interest-rate-derivatives/ird-ex02-stub-amort-swap.xml А это вы еще текстового SDOS не видели :-) Проблема FpML не только в том, что это XML, но еще и в том, что там множество дублирований и избыточной информации. Работать с этим просто невыносимо. Кроме того пакаджи которые есть в Haskell просто копируют пространство тегов FpML, а это полная лажа.

У меня идея создать бибилиотеку конвертации FpML<->UPL и продавать ее частично по продуктам и направлению конвертации. Сработает?
2 +


Financial Language
22 Sep 2014|05:10pm
Вообщем почитал я что люди умные делают. В принципе я на очень правильном пути и язык мой ничуть не уступает тому, что уже в этой области сделано и какие пути намечены. Вцелом общество движется к универсальному финансовому языку на пересечении таких банковских областей как:

1. Управление рисками
2. Операционная деятельность (моя сфера)
3. Управление деривативными продуктами (предыдущее место работы)
4. Экстрактинг паралельных алгоритмов

Довольно известная в этом смысле иллюстрация в интернете на эту тему, где почему-то показано, что DSL не вписываются в системы высокочастотного трейдинга. Но мы то знаем.



Периодически делаются доклады на тему финансовых языковых расширений по управления банковскими продуктами. Практически все они берут свое начало из статьи SPJ, Jean-Marc Eber, Julian Seward. Жан-Марк Ебер это представитель компании LexiFi, которая продвигает свой OCaml based продукт.
MLFi: http://www.lexifi.com/product/technology/contract-description-language
White Paper: http://lexifi.com/files/resources/MLFiWhitePaper.pdf
Presentation: http://www.lexifi.com/files/resources/MLFiPresentation.ppt

Barclays работают тоже в основном на рынке деривативов, есть ихнии презентации, но они там в основном рассказывают про категорную семантику контрактов, комбинаторы, функторы, катаморфизмы. И очень мало собственно про финансовый язык (http://arbitrary.name/papers/fpf.pdf):
http://www.infoq.com/presentations/haskell-barclays

Если у вас есть дополнительная публичная информация по этим языкам, кидайте в каменты.

Регулярно проводятся воркшопы по финансовым DSL, называется DSLFIN Workshop, где вы можете посмотреть на все соврменные (F#/OCaml/Haskell) контракт-фреймворки. Полный список таких систем вы найдет тут:
http://www.dslfin.org/resources.html
В ихнем программном комитете чуваки из SAP, LexiFi, SWIFT, UBS, American Express, PayPal.

Что касается вида имплементации DSL, то здесь обычно доминируют внутренние DSL на OCaml/Haskell. Я решил имплементировать свой язык как внешнего инсрумент (Erlang). Эрланг был выбран в основном из-за тесной связи leex/yecc инструментов с результирующим AST и дальнейшего кодогенерации в Erlang. Сама спецификация DSL на Haskell. Возможно имеет смысл рассмотреть генерации back-end в Java.

Интересные попадаются также презентации, где в реальном режиме показывается работа с биржевыми продуктами (написано на F#, очень прикольная презентаха):
https://skillsmatter.com/skillscasts/3213-fsharp-finance

Кто вообще непонимает зачем DSL, и почему не написать три хранимых SQL процедуры в PostgreSQL, тем возможно имеет смысл почитать вводные тексты:
[1]. http://www.martinfowler.com/articles/languageWorkbench.html
[2]. http://www.rose-hulman.edu/Users/faculty/young/CS-Classes/csse490-mbse/Readings/DSL-Survey-WhenHow.pdf


____________
[1]. Maxim Sokhatsky. UPL: Universal Processing Language
+


Card Processing DSL
12 Sep 2014|04:01pm
Чуваки а скажи есть какой DSL, типа COBOL на котором можно записывать карточные банковские продукты для процессинговых систем, типа такого:

program [ name ]
grace-period [ days | formula ]
late-fee [ days | formula ]
turn-off [ limit [ days | formula ] ] [ message ]
cash-back [ beneficiary | type | invoice ]
rate [ formula ]
fee [ transaction | month | annual ]
bonus [ formula ]


Вот например как я вижу описание продукта

card M-PLA-CB UAH
    limit unknown
    grace-period first 100 days then 60 days
    penalty daily 100
            month add-rate 5%
    currency convert 1%
    rate month 4.9% of credit
    fee month 12 once on initial-payment
        month 3% of debt limit min 50 max debt
        month 1.2% of debt
        month 24
        status disabled 10
        transaction cashin  0
                    cashout pos ATMOSPHERA 0
                    cashout contry UA 5 + 1.5%
                                    _ 30 + 1%
                    wire target local 0
                    wire 0.5% of amount limit min 5 max 500
    accounts fee     M-100001
             rate    M-100002
             penalty M-100003


Накидал за ночь: https://github.com/5HT/cards
5 +


Паттерн матчинг revised
12 Sep 2014|12:13am
Все вы знаете, что некоторое время назад я вернулся из Турции и начал принимать участие в новом проекте Cloudozer, написание Statically typed LLVM-based modern functional language compiler with concurrency and gc for Xen applications and raw hardware. К сожалению у меня нет много времени сейчас, так как нужно делать ремонт и вообще говоря опять искать работу и новые проекты. Поэтому время на компилятор остается все меньше и меньше, и я решил описать немного текущее состояние дел. Возможно это меня вдохновит на еще один подход к этой задаче.

Что бы не ходить вокруг да около, вот например что этот алгоритм должен матчить. Он используется в case конструкциях и multihead функциях, которые впервые появились в HOPE. Обычно мультихед функции сразу представляют собой матрицу M x N, но в case нужно еще разделять эти вхождения. Все это делается на шагах компилятора еще до стадии унификации типов. Вообще говоря задача patter maching compilation тесно связана с унификацией типов, так как внутри приходится полагаться на информацию о типе для построения эффективного дерева решения, а унификации типов нужно выводить тип cases паттернов как сумму типов.

case x of
    [1,2|tail] -> tail;
    [2,y] -> 2;
    [x,1,y|tail] -> 3;
    {{1,{_,2}},x,y} -> 4;
    {_,x,1,y} -> 5;
    {_,_} -> 6 * x + y;
    [{1,2,_},{x,y}] -> 7;
    _ -> :ok end.


Построение оптимального дерева решений таблицы правил является NP полной задачей. Поэтому в компиляторах используются различные эвристики. Построение этого дерева очень напоминает другой алгоритм: RETE алгоритм и его современный модификации. Эта минимакс-задача построения самого компактного дерева сравнений для данной матрицы правил за минимальное время.

Существует вот такой набор эвристик:

* Relevance (Baudined, MacQueen, 1985)
* Arity Factor (Baudinet, MacQueen, 1985)
* Small Defaults (Baudinet, MacQueen, 1985)
* Fewer Child Rules (Maranget, 1992, Ramsey, Fernandez, 1995)
* Left to Right (Sestoft, 1996, Moscow ML, OCaml, MLKit)
* Small Branching Factor (SML/NJ)
* Large Branching Factor (Cardelli, 1984)
* Leaf Edges
* Artificial Rule
* Right to Left Top-down

Их обычно различают на те которые проверяют значения всех ячеек нормальнизированной M x N матрицы правил хотябы раз (эффективные) и те которые этого не делают. В этом смысле алгоритмы MacQueen (1985), Laville (1991), Maranget (1992), Sestoft (1996) -- эффективные, а алгоритмы Augustsson (1985), Wadler (1987), Maranget (1994) -- нет. Вадлер это автор 6 или 7-й главы из книги SPJ как писать миранды и хаскели.

Обычно эти эвристики работают с колонкой на каждом шаге и классифицируют ячейки этой колонки по тиким категориям:

Heuristic         | Occurance in Column
----------------------------------------
Constructors      | N
Constants         | N or OccuranceMap
Vars              | -N
Wildcards         | -N


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

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

Инструкции: SWITCH,ELEMENT,TAG,BIND. Элемент просто формирует адрес извлекаемого значения для сравнения. Инструкция SWITCH которая скомпилируется а аналогичную инструкцию LLVM, будет сравнивать эти значения, TAG будет узнавать индекс типа члена суммы, а BIND ложить в стек для вызова результирующей выбраной функции,

Простейший пример:

case l of
    {1,2,3} -> 1
    {1,x,4} -> 2
    {1,x,5} -> 3,
         x  -> 4


switch(element(1,L),
        {4,[bind(x,L)]},
        [{1,switch(element(2,L),
            {4,[bind(x,L)]},
            [{3,switch(element(3,L),
                {4,[bind(x,L)]},
                [{2,{1,[]}}])},
             {4,{2,[bind(x,element(2,L))]}},
             {5,{2,[bind(x,element(2,L))]}}])}]).


При построении этого дерева использовалась простейшая стратегия обхода столбиков слева направо, которая написана у Вадлера.

caser x y ->
    case x of
        [1,2|tail] -> tail;
        [1,4]      -> 11;
        [2,3]   -> 20;
        [x,y,2] -> 21;
        [x,a,3|tail]    -> 31;
        [_,_,3,a,b,c,5] -> 32;
        [_,_,3,x,b,t,6] -> 33 end.


{switch,
    {tag,{var,x}},
    {fail},
    [{{cons,2},
      {switch,
          {shift,1},
          {switch,
              {shift,3},
              {fail},
              [{{int,3},
                {switch,
                    {shift,7},
                    {fail},
                    [{{int,6},
                      {ret,
                          {int,9,33},
                          {binds,[{t,{read,7}},{b,{read,6}},{x,{read,5}}]}}},
                     {{int,5},
                      {ret,
                          {int,8,32},
                          {binds,
                              [{c,{read,7}},{b,{read,6}},{a,{read,5}}]}}}]}},
               {{int,2},
                {ret,{int,6,21},{binds,[{y,{read,3}},{x,{read,1}}]}}}]},
          [{{int,2},{ret,{int,5,20},{binds,[]}}},
           {{int,1},
            {switch,
                {shift,2},
                {fail},
                [{{int,2},{ret,{var,3,tail},{binds,[]}}},
                 {{int,4},{ret,{int,4,11},{binds,[]}}}]}}]}}]}


Алгоритм находится сейчас вот в таком состоянии:

% List -- rows
% Exp -- Match Expression
% ColumnsOrder -- heuristic columns history
% DeepTrace -- history in tuples hierarchy

compile([],_,_,_,_) -> [];
compile(List,H,Exp,ColumnsOrder,DeepTrace) ->
    Column = heuristic(fun most_consts/1,List),
    io:format("Heuristic: ~p~n",[Column]),
    Fold = folda(Column,List),
%    io:format("~p Fold: ~p~n",[Column, Fold]),
    case [ group({Name},Fold) || Name <- [ctor,cvar] ] of
         [[],   Cvars] -> compile(binds(Cvars,Column,DeepTrace),H,Exp,ColumnsOrder,DeepTrace);
         [Ctors,Cvars] ->
              switch({read,[Column|DeepTrace]},
                [ compile_ctor(C,Rows,Column,H,Exp,ColumnsOrder,DeepTrace) || {C,Rows} <- Ctors ],
                  compile_vars(Cvars,Column,H,Exp,ColumnsOrder,DeepTrace)) end.


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

Матчинг Кортежей с именоваными компонентами и Бинарный матчинг

Еще хочется сказать о паттерн матчинге то, что не одними произведениями будешь доволен нужно уметь матчить и произведения с именоваными компонентами:

case NamedTuple of
    {n=7,a=5} -> 1;
    {a=5,s=0} -> 2;
    {s=0,n=1} -> 3 end.


Совершенно другой алгоритм применяется для патчинга бинарей, которым так славится Эрланг. Например вот такие конструкции:

case Binary of
    <42:8, X1>         -> 1;
      -> 2;
      -> 3 end.


Тут нужно всталять инструкции READ,SIZE,SCAN.

Паперы:
______________
[1] Peter Se stoft. ML patter n match compilation and partial evaluation. 1996
[2] Luc Maranget. Compiling Pattern Matching to good Decision Trees. 2008
[3] David MacQueen. Tree Pattern Matching for ML. 1958.
[4] Maxim Sokhatsky. L Pattern Matching Compilation. 2014.
[5]. Kevin Scott and Norman Ramsey. When Do Match-Compilation Heuristics Matter? 2000
27 +


Нашел в Твиттере
10 Sep 2014|08:07pm
13 +


Анонимный комментарий с LOR
27 Aug 2014|04:57pm
https://www.linux.org.ru/news/opensource/10794635?lastmod=1409106706108#comment-10798546

Шесть месяцев назад я нашёл в Интернете книжку «Introducing Erlang». Странная книжка, толстая, да ещё на не русском языке. Усердно прочитал её, методично и вдумываясь, но таки ничего и не понял. Но что-то не отпускало меня - я пошёл на erlang.org и стал изучать стандартную библиотеку, старательно, скурпулёзно, от корки до корки. Гугля примеры кода, я наткнулся на пост в блоге одного гуру, где было написано про OTP. То, что рассказывал этот умудрённый опытом кодер, настолько впечатлило меня, что я словно в припадке безумия бросился зубрить эту открытую телеком платформу. У меня тряслись руки, по телу прокатывали волны возбуждения, я, можно сказать, бился в экстазе всё это время - и теперь могу процитировать наизусть любой пункт, даже если меня разбудить посреди глубокой ночи.

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

Я плавно двигался вперёд, наращивая функционал. И знаете что? Я упёрся в недостаток производительности. Ну, так мне показалось. Я делал замеры, устранял места с тяжёлым кодом. Тысячи раз запускал канпуктер, но так и не сумел перейти порог в 30000 запросов в секунду. Я как-то ожидал большего и был немного разочарован.

Гугл, снова гугл. Десятки статей и тем на форуме... Довольно быстро я заметил, что люди часто пишут про какой-то «N2O фреймворк». Часто встречались названия Cowboy и Nitrogen. Я прочитал про них подробнее - и был просто ошеломлён. Как мне это раньше не приходило в голову?! Это же, это просто гениально, чёрт меня побери!

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

Пятьдесят тысяч. Я получил производительность в пятьдесят тысяч запросов в секунду. В ту ночь я так и не смог заснуть.

Наиувлекательнейший мир хай-лоада открылся передо мной. Позже я изучил ещё много классных вещей типа сверхбыстрых QLC запросов, или, например, такого необычного подхода к обработке данных, как list-comprehension.

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

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

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


Эрланг Курсы Киев ОСЕНЬ 2014
22 Aug 2014|03:21pm
Друзья! UPDATE

Как вы знаете Synrc Research Center традиционно проводит Эрланг Курсы в Киеве каждый год. В этом году Третья и Четвертая Сессии пройдут вначале осень. Первые две были в прошлом году. Однако это не значит, что вы что-то пропустили. Все сесии абсолютно автономные. Вы можете пропустить любую.

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

В этом году мы представляем то как мы используем Эрланг для наших проектов: для Веба и Хранения данных. Мы покажем вам насколько просто создавать Эрланг веб приложения, и вы сами сможете оценить мощность этих подходов, сравнить их с технологиями, которые вы уже используете у себя сегодня на Python, Java и других языках.



ПРОГРАММА КУРСОВ:

Основы Эрланг и N2O


Теория:
Основы Эрланга
Основы N2O

Практика:
Шаблоны
SPA
Синхронизация воркеров
PubSub
Создание чат приложения

Основы KV хранилищ и KVS

Теория:
Mnesia
Riak
CAP теорема
Консистентность данных
Почему вам не нужен SQL

Практика:
Создание переносимых схем баз данных
Нюансы использования KV хранилищ

Спешите:
Контакты:
Мария erlang@synrc.com +380 98 499 03 43
Максим maxim@synrc.com +380 67 663 18 70


РЕГИСТРАЦИОННАЯ ФОРМА

Как это было прошлый раз (Первая и Вторая сессии):

https://www.facebook.com/media/set/?set=a.480574085348366.1073741832.122008231204955&type=1
14 +


MAD Erlang Build Tool
16 Aug 2014|02:56am
Какие бы крутые библиотеки не были у платформы, удобство работы с ними в основном определяется утилитами, которые используются для разработки. Все началось когда Vladimir Kirillov решил переписать нитрогеновский sync Расти, который использовал filesystem polling на более экономичную схему использованя асинхронных нативный листенеров файловой системы SYNRC/FS. Как известно sync мог только перегружать отдельные эрланг модули, у нас же в N2O нужно иногда компилировать не только эрланг модули, но и DTL темплейты и даже LESS/SASS, поэтому нужно, что бы листенер дергал пересборку всего проекта.

Как известно де-факто стандарт в эрланг мире это rebar. Нам очень нравится интерфейс ребара, но сам ребар слишком большой и неэффективно реализован. Кроме того он очень медленный, особенно, что касается холостой, горячей перекомпиляции. Кроме того, что бы распространять библиотеку SYNRC/ACTIVE (асинхронный аналог нитрогеновского SYNC), нужно было включать rebar как зависимость, а его размер фактически перекрывает весь объем Synrc App Stack. Нужно было сделать, что-то минималистичное, быстрое и прекрасное. Кроме того хотелось учесть опыт других билд тулов, таких как lein, sbt и других. Можно также отметить неудачные попытки создания эрланг билд утилит, таких как sinan и ebt.

Мои идею подхватил в твиттере Sina Samavati, и реализовар первый прототип, дав название этой утилите MAD. Изначально MAD мог компилировать dtl (нужно для N2O), escript (используется например в gproc), а также yrl файлы (нужные для dtl и всяких компиляторов). Также прототип MAD умел поддерживать кеширование с сайд-эффектами.

Через месяц я подхватил эстафету, заметно ускорив горячую компиляцию N2O Sample (основной кейс использования active):

                               Cold       Hot
rebar get-deps compile         53.156s    4.714s
mad deps compile               54.097s    0.899s


Естественно добавив компиляцию C портов, а также расширив систему команд.

Start/Stop/Console. Теперь MAD умеет не только собирать, но и запускать приложения и определять порядок в котором нужно запускать приложения, использую для этого reltool server. Фактически наша структура осталась совместимая с релизами OTP, и поддается сборке rebar generate, а также через relx.

Bundling. Согласно нашей концепции мы видим дистрибюцию наших приложений как single-file escript файлов, который можно запутстить на любой операционной системе: Windows, Linux, Mac. К сожалению до этого момента это было невозможно. Нужно запаковывать priv директории, а также стартовать приложения из .app файлов, а также использовать конфиги, кроме того необходимо было поддержать работу ACTIVE для этих бандлов + новый статический сервер статики для ковбоя, который понимает нашу зипованую файловую систему в ETS. Мы сделали так что любой файл внутри бандла можно переопределить, создав на файловой системе другой файл с таким же оносительным путем.

Deploy. Также предполагается использовать эту утилиту для деплоя на основные PaaS провайдеры, кроме LXC/Xen, такие как Heroku и Voxoz. Благодаря single-file дистрибюции это становится просто.

Templates. Нас просили про шаблоны, что бы можно было создавать базовые N2O приложения и OTP библиотеки в нашем стиле. Теперь вы можете попробовать N2O исользуя только один лишь mad:

$ mad app sample
$ cd sample
$ mad deps compile plan bundle web_app


После чего вы можете взять файл web_app скопировать его куда угодно, где есть эрланг и запустить его (http://localhost:8000/):

C:\> escript web_app
Applications: [kernel,stdlib,crypto,cowlib,ranch,cowboy,compiler,syntax_tools,
               erlydtl,gproc,xmerl,n2o,n2o_sample,fs,active,mad,sh]
Configuration: [{n2o,[{port,8000},{route,routes}]},
                {kvs,[{dba,store_mnesia},
                      {schema,[kvs_user,kvs_acl,kvs_feed,kvs_subscription]}]}]
Erlang/OTP 17 [erts-6.0] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V6.0  (abort with ^G)
1>


Размер SYNRC/MAD должен доставить немного радости:

                 Sources    Binary
MAD              527 LOC    36 KB   
REBAR            7717 LOC   181 KB 


VXZ MAD Build Tool version 1.0
BNF:
    invoke := mad params
    params := [] | run params
       run := command [ help | options ]
       cmd := app | lib | deps | compile | bundle
              run | stop | attach | repl
3 +


Задача по программированию
12 Jun 2014|11:09pm
Привет, Котаны!

В одной очень знамениторй турецкой игре Окей еще ее называют Руми есть всего несколько выиграшных комбинаций. Вы должны собрать тройки/четверки/пятерки в определенных комбинация либо 7 пар. Из 14 карт.

Вот комбинации:

-- 3 тройки и 1 пятерка
-- 2 тройки и 2 четверки
-- 2 пятерки и 1 четверка
-- 7 пар



Всего в колоде две пачки карт четырех мастей и джокеры (максимум 4).
Колода генерируется так:

    Jokers ++ [{C,V} || C<-[1,2,3,4], V<-lists:seq(1,13), _ <-[1,2]]].


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

Исключение: В последовательностях одна единица может циклически доставлятся в конец:

   {12,13,1} -- пример выиграшной комбинации
   {12,13,1,2} -- проиграшная, циклы не работаю больше чем с одной картой.


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

ЗАДАЧА

Написать на языке программирования функцию check_reveal/1, которая получает на вход неупорядоченный массив карт и проверяет является ли комбинация выиграшной.

Пример

1> check_reveal([{4,4},{4,3},{4,6},{4,7},okey,
                 {3,10},{3,11},{3,12},{3,13},okey,
                 {2,6},{3,6},{1,6},okey]).

true
26 +


N2O and SVG
10 Jun 2014|09:23pm
Друзья. Все вы знаете что последний год я непокладая сил трудился, что бы сделать для Erlang вменяемый веб фреймворк на котором было бы быстро и удобно нам и нашим друзьям гавнокодить и хуйякать в продакшин наши веб конфетки, и что бы при этом нас не нужно было никуда забирать.

После неверного пути, когда мы решили вкинуться в сайты на бутстрепе и HTML/CSS лейауты и контролы я сказа себе стоп. Неужеле в расцвете сил в возрасте Иисуса Христа ты хочешь закончить как миллионы нищих нищебродов натаскивая очередной криво сверстаный PSD на свою LESS систему.

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

Мы первые решили использовать исключительно WebSocket бинарный стриминг в своих приложениях, наши сайты уже доступны по SDPY протоколу, мы поддерживаем все механизмы защиты, наш фреймворк поддерживает AES/CBC пиклинг, мы являемся полноценным веб стеком со своим Pub/Sub интерфейсом, интерфейсом для данных представимых в виде двухсвязных списков (фиды), хранящиеся в любой DHT, у нас есть все социальные логины и системы пейментов. Фактически для каждого проекта Sping у нас есть свой аналог:

SpringSynrcDescription
Spring SocialAVZСоциальные системы
Spring FrameworkN2OФул стек Веб фрейморк
Spring BootOTP.MKУправление приложениями
Spring DataKVSДоступ к данным
Spring AMQPMQSДоступ к очередям


Но кроме этого у нас есть другие штуки, например если вы разрабатываете JavaScript протоклы мы генерируем JavaScript протокол из Erlang c помощью обычного компалятора Erlang используя нашу JavaScript парс-трансформацию. Благодаря тому, что парс трансформ работает на уровне AST, этот JavaScript поддерживает все Erlang языки: Erlang, Joxa, Elixir.

Кроме того у нас есть другие штуки, типа генератор REST из Elrang рекордов, своя системы автоматической пересборки active, которая в отличии от sync, полагается на нативные листенеры файловой системы, что бы не использовать пулинг на продакшине, для всех систем Windows, Mac, Linux.

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

Все вы знаете что N2O проект родился из поддержки Турецкого социального игрового проекта. По сути финансирование турецкой социальной сети в размере нескольких сотен тысяч долларов в основном было направлено на Synrc Application Stack и N2O. Так, что можно сказать что кроме растущего числа пользователей, за N2O стоят реальные бизнес интересы.

Поэтому мы с турками посидели и решили, что вкидывать деньги в развитие игрушек на Flash не имеет никакого смысла. На данные момент у нас уже был близкий к соверешенству игровой сервер с поддержкой турниров. Кроме того у нас не так много средств, что бы позволить заниматься сразу несколькими платформами iOS, Android, Web.

Поэтому я решил попробовать написать HTML5 SVG приложение и посмотреть как оно будет работать на тачевых устройствах. Мы взяли несколько десятков тысяч долларов и поехали в Одессу искать аутсорсеров-профессионалов, которые бы меня поучили JavaScript. Хотя начинали мы довольно вяло, все же под конец сдачи у меня уже был построен процесс SVG, в котором напрочь отсутствовала позиция верстальщика. От дизайнеров до программисто один шаг. Sketch -> Save As -> SVG. Немного патчим SVG, вешаем события по id на элементы SVG DOM и вперед.

Я несколько модифицировал для этих целей N2O и N2O в версии 1.5 уже поддерживает разные виды подпротоколов: JSON/BERT/RAWBINARY, последний для аплоада и сервер-пуша картинок или другого окнтекнта по веб сокет каналу. Кроме того я было хотел уже включить поддержку MessagePack, как тут Лоик объявил на стокгольмской Эрланг конференции 2014, что будет наша эрланговская версия MessagePack, которая называется BED, которая поддерживает кодирование строк и еще компактнее чем MessagePack, разрабывается специально для Cowboy и Erlang.

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

Фирменной фишкой нашей самой крутой в мире имплементацией Rumi(Okey) игры
является драг-н-дроп карт (который пока не работает в IE11 из-за отсуствия SVG MSIL аниманий, мы работаем на этим) на тачевых (и других) устройствах.

Я хотел дождаться пока мы запусимся на Рамазан, но не могу молчать, потому что вижу, что все опасения по поводу SVG, WebSockets, отзывчивости приложения, тачевости, и кросусстройственности не оправдались. Получилось действительно хорошо, есть чем похвастаться.



Игра глючи и полностью нерабочая пока в IE11, так что жмите рефреш если че.

В проекте использовано только:

-- Erlang
-- JavaScript
-- SVG
-- BERT
-- WebSockets

В нем вы не найдете:

-- XHR
-- REST
-- HTML/CSS
-- Flash
-- Java

И да, мы хайрим.

Стейджинг: http://synrc.com:8080/static/app/index.htm
Исходники Проекта: https://github.com/synrc/games
Ошибки Проекта (ПОЖАЛУЙСТА) записывайте сюда: https://github.com/synrc/games/issues

Максим
20 +


Erlang on Xen
02 May 2014|01:38pm
Сегодня Erlang on Xen зарелизился в open source: https://github.com/cloudozer/ling
15 +


JavaScript FRP вакансия
30 Apr 2014|05:03pm
ребята
кто хочешь поднятуть скилы и написать FRP основу для наших игрушек, драга и т.д.
скиньте мне свои контакты на maxim@synrc.com
ваши рейты и то как вы видите это и нашу работу
напоминаю видео драга http://dev.intersog.com/kakaranet/kakaranet1.avi
http://srv5.kakaranet.com:8080/static/KakaranetOriginalDrag.mov
мы пишем полностью новую SVG игру без использования каких либо библиотек
если интересно то на сервер Erlang общение с клиентом через BERT
в идеале нужен микро FRP core
для похожих позиционных настольных 2D игрушек
чистый джаваскрипт
анальная фиксация на размере
исходный материал и лог разработки: http://srv5.kakaranet.com:8080/static/doc/svg.htm

Приблизительно как это должно выглядеть (Это беконовский интерфейс, но мы пишем свой FRP core):

 
    var startDrag = block.asEventStream('mousedown')
    var endDrag = block.asEventStream('mouseup')
            
    var draggingDeltas = startDrag.flatMap(function() {
        return html.asEventStream('mousemove')
            .map(xyFromEvent)
            .slidingWindow(2,2)
            .map(getDelta)
            .takeUntil(endDrag)
    })
    
    var blockPosition = draggingDeltas.scan({x: 0, y: 0}, add);
    
    blockPosition.onValue(function(pos) {
        block.css({
            top  : pos.y + "px",
            left : pos.x + "px"
        });
    });



Остальсь только в этот стрим включить правила для раскидывания соседних карт.

FRP Core.

rx.lite.min.js 51KB
bacon.min.js 35KB

Очевидно что эту всю фигню нужно резать, если использовать ее.
Но думаю придется писать что-то свое. Например за основу взять это:

https://github.com/chrisdickinson/dom-event-stream

Это просто API:

events(DOMElement, eventName, eventStreamOptions={}) -> EventStream

Которое превращает события DOM элемента в ивент стрим.
А на базе этой сущности уже строить декларативный драг.

Ивент-стриминг ДОМ элементов естественным образом восходит к понятию стрима. Поэтому нам понадобится также простенький стрим, например stream.js (а не как нодовский в dom-event-stream):

https://github.com/synrc/n2o_scripts/blob/master/n2o/stream.js

__________________________
Литература:
[1]. Рабочий пример на Беконе http://jsfiddle.net/TFPge/1/
[2]. Рабочий пример на RxJS http://theburningmonk.com/2011/03/drag-and-drop-using-reactive-extensions-for-javascript/
[3]. Elm, RxJS, bacon, желательно иметь представление как это сделано у других
[4]. Почему FRP? http://en.wikipedia.org/wiki/Functional_reactive_programming
23 +


Темник
31 Mar 2014|09:25pm
Чому б українським ЗМІ не придумати якусь меметичну інформаційно-вірусну систему у боротьбі з російськими загарбниками. Скажімо вираз "самооборона" Криму" виглядає недоречним, адже читаємо та сприймаємо ми цей вираз без лапок. Доречним та рекомендованим вважається використання виразу "озброєні загони захистників російського безкореневого населення зі східних поневолених далеких республік російської імперії". Або замість "Росія підтримала анексію Криму" -- "З метою натхнення, Україна передала Крим, як символ надії і квітучого життя, спраглим до боротьби за кращу долю народам бувшого радянського союзу".

Свободолюбивий та надчуттєвий до справедливості братній російский народ щиро, урочисто і шанобливо вітає щедрий дар України, Крим. Цей дарунок приурочений до великих соціально-економічних перемог Росії аби завершити величну духовну корону добра і милосердя під покровом яких ми бачимо справжній розквіт російської імперії.

Нехай ця перлина доповнить і завершить той світлий букет, завдяки якому орнамент споконвічно російських племен півночі та далекого сходу мирно живуть та процвітають на теренах безмежної та квітучої Росії.
5 +


Удивительное
18 Mar 2014|08:43pm
Чисто для прикола решил поискать что такое Фашизм. Сам-то я думал что это уже давно в прошлом. Нашел вот такое определение, данное самим Муссолини:
Фаши́зм — форма правления и радикальная авторитарная империалистическая националистическая идеология, характерными признаками которой является сильный культ личности, милитаризм, тоталитаризм, империализм, а также идея постоянной войны и господства.
Хоть бы в чем-то одном не было соответствия. Уважаемые россияне, я вас поздравляю. Вы родили свою национальную идею. И не надо мне рассказывать, что вы где-то в одном месте, а Путин где-то далеко в кремле от вас. Это все результат коллективной русской медитации.
110 +


1975
15 Mar 2014|04:04pm
1 +


Два Влада
09 Mar 2014|12:07pm
7 +


Небесна Сотня
25 Feb 2014|10:17am
Пливе кача по Тисині,
Ой, пливе кача по Тисині.
Мамко моя, не лай мені,
Мамко моя, не лай мені.

Залаєш ми в злу годину,
Ой, залаєш ми в злу годину.
Сам не знаю, де погину,
Сам не знаю, де погину.

Погину я в чужім краю,
Погину я в чужім краю.
Хто ж ми буде брати яму?
Хто ж ми буде брати яму?

Виберут мі чужі люде,
Ой виберут мі чужі люде,
Ци не жаль ти, мамко, буде?
Ой, ци не жаль ти, мамко, буде?

Ой як ж мені, синку, не жаль?
Як же мені, синку, не жаль?
Ти на моїм серцю лежав,
Ти на моїм серцю лежав.

Пливе кача по Тисині,
Ой, пливе кача по Тисині.
Мамко моя, не лай мені,
Мамко моя, не лай мені.



1. Павло Мазуренко
2. Юрій Вербицький
3. Сергій Нігоян
4. Михайло Жизневський
5. Роман Сеник
6. Богдан Калиняк
7. Сергій Синенко
8. Сергій Дідич
9. Володимир Кіщук
10. Сергій Шаповал
11. Ігор Сердюк
12. Зураб Хурція
13. Антоніна Дворянець
14. В'ячеслав Веремій
15. Валерій Брезденюк
16. Андрій Корчак
17. Володимир Наумов
18. Олександр Капінос
19. Олександр Плеханов
20. Яків Зайко
21. Володимир Кульчицький
22. Андрій Черненко
23. Юрій Пасхалін
24. Віталій Васильцов
25. Роман Варениця
26. Іван Пантєлєєв
27. Роман Точин
28. Віктор Чміленко
29. Олег Ушневич
30. Ігор Ткачук
31. Олександр Царьок
32. Устим Голоднюк
33. Олександр Щербанюк
34. Ігор Костенко
35. Йосип Шилінг
36. Юрій Паращук
37. Микола Дзявульський
38. Богдан Сольчаник
39. Сергій Бондарчук
40. Володимир Захаров
41. Віктор Сміленко
42. Василь Мойсей
43. Сергій Байдовський
44. Георгій Арутюнян
45. Назар Войтович
46. Едуард Гриневич
47. Анатолій Жаловага
48. Володимир Жеребний
49. Сергій Кемський
50. Андрій Мовчан
51. Віталій Смоленський
52. Віктор Чернець
53. Дмитро Пагор
54. Андрій Дигдалович
55. Богдан Байда
56. Давід Кіпіані
57. Сергій Бондарєв
58. Роман Гурик
59. Ігор Дмитрів
60. Анатолій Корнеєв
61. Віталій Коцюба
62. Валерій Опанасюк
63. Володимир Павлюк
64. Микола Паньків
65. Олександр Храпаченко
66. Максим Шимко
67. Іван Бльок
68. Іван Тарасюк
69. Леонід Полянський
70. Андрій Саєнко
71. Євген Котляр
72. Людмила Шеремета
73. Дмитро Максимов
74. Віктор Швець
75. Андрій Цепун
76. Максим Машков
77. Максим Горошишин
78. Олег
79. Богдан Ільків


Архитектурное образование
24 Feb 2014|09:52pm
Я посмотрел на Межигорье Януковича с ониксовыми статуэтками и кермикой от Вилероя, и кроме этого специально еще сходил на выставку итальянской мебели, которая проходит сейчас в выставочном центре на левом берегу. К сожалению итальянская мебель в Украине не представляет вообще итальянский дизайн. Я бы это назвал циганским направлением Енакиевского Ампира. Фотки специально приводить не буду.

Я себе сразу представил на месте украинского диктатора, и подумал над тем, какой был бы мой дом, если бы у меня была неограниченная власть украинской диктатуры. Скажем, дом с видом на реку, где то там причалы с яхтами, и на соседнем участке поле для гольфа. К сожалению дома Тимошенко, Турчинова и других оппозиционеров еще более унылые чем Межигорье. И вот что у меня есть предложить для новых украинских диктаторов.

Дом доктора Эдит Фарнворт



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



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

Теперь же, для нового амплуа человека в розыске, придется предложить Виктору Януковичу что-то в стиле японского минимализма, Дом в Токио:



Вот например как себя ведут украинские олигархи, Дом в Киеве. Вроде и по богатому и культурно, но в обычном доме посреди Киева в пентхаузе.
10 +


Cвобода
19 Feb 2014|09:20am
Как можно быть равнодушным когда ты видишь как умирают люди с которыми ты живешь в одной стране. Конечно вся интеллигенция очень умная и всегда пытается оправдать или объяснить себе любые феномены. Если происходит война, значит кому-то надо значит заслужили. То, что все феномены всеблагие не означает, что радоваться нужно как ребенок. Ветра мудрости и благая карма -- как единение блаженства и потенциальной пустотности не похожи на истерический смех. Большое знание -- большая скорбь. Мастера, которые прошли через китайский террор никогда бы не проигронировали гибель людей которая происходит рядом с ними. В этом и заключается великая сострадательная мудрость, что бы расплакаться от вида страдания.

События в мой стране делают меня лучше с каждым мгновением. Раньше я смотрел на новости по телевизору, как на площадях на востоке и в африке умирают люди и я был далек от этого. Я думал это преты и существа адов расплачиваются за свою карму прошлых жизней. Когда мои друзья в Беларуси полностью сдались, а в России стало понятно что ничего не будет, я думал что нас уж точно это не касается. Когда на площади Таксим умирали люди, я рядом пил кофе в кафе и я был далек от этого всего. Но как можно игнорировать тот факт, что твои друзья, люди с которыми ты живешь в одной стране погибают за тебя, оскверненные совершенно грязными методами. Я никогда больше не буду игнорировать ни единую смерть которую я увижу по ютубу. Это не только про драгоценность человеческой жизнь, это про способность сопереживать, даже тогда когда это не касается твоего ребенка или матери.

Я благодарен всем Украинцам, которые смогли показать мне, что я был недостаточно хорош. Как можно разговаривать о геополитике и о кознях гьялпо, когда рядом с тобой страдает реальный человек. Я не понимаю как можно говорить о буддийских добродетелях, о неприятии протестов, когда рядом страдают совершенно реальные люди, возможно люди с которыми ты встречался. И хотя буддисты никогда не поддерживают протесты и тем более кровавые противостония, я хочу сказать, пускай меня отчислять из рядов буддистов. Я хочу быть вместе с гражданами своей страны, я хочу открыто поддержать их. Если надо спуститься в Ад, я спущусь в ад. Я нарушу данные мной обеты прибежища, и допущу это негативное мышление. Я хочу что бы моя позиция была недвойственно, четкой и понятной. Я поддерживаю реальный людей с реальными сердцами и желанием свободы.

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

Пока эта свобода кажется уродливой, прозябшей в мировой глобалистической закулисной коррупции и неискренности, но это все равно то самое проявление изначальной свободы в этом уродливом самсарном мире. Другой свободы у нас на этом плане бытия нет.
9 +


Навігація