Этот безумный, безумный        Erlang
Структуры данных● lists (proplists)● sets● dict● gb_trees● queue● orddicts● ordsets● digraph● array
OTP● gen_server● supervisor● gen_fsm● gen_event
gen_server-module(mygenserv).%-behaviour(gen_server).-export([start_link/0]).-export([init/1, handle_call/3, handle_cast/2...
supervisor-module(myapp_sup).-behaviour(supervisor).-export([start_link/0]).-export([init/1]).start_link() ->   supervisor...
Хранилища и БД из коробки● ETS – in-memory хранилище● DETS – дисковое хранилище● Mnesia – распределенная база данных на ба...
rebar# git clone https://github.com/basho/rebar# cd rebar# make# cp rebar ~/src/myproject# cd ~/src/myproject
rebar.config{deps,   [     {mochiweb, "v1.1",        {git, "https://github.com/mochi/mochiweb", {branch, "master"}}   ]}.{...
# ./rebar create-app appid=myapp# ./rebar get-deps# ./rebar compile# erl -pa ebin1> application:start(myapp).
# rebar -cclean                        Cleancompile                       Compile sourcescreate     template= [var=foo,......
Mochiweb      git clone https://github.com/mochi/mochiweb● Легкий высокопроизводительный HTTP-сервер● mochijson, mochijson...
mochiweb_httpmochiweb_http:start([    {port, 8080},    {ip, "0.0.0.0"},    {loop, fun handle_request/1}]).handle_request(R...
mochijson2Props = [   {age, 10},   {name, <<"Snoopy">>},   {talents, [<<"jumping">>, <<"barking">>, <<"sleeping">>]}],Obj ...
reloader# erl -pa ebin -s reloader                             # vi src/myapp.erl                             ...         ...
Другие веб-сервера● YAWS● misultin (очень похож на mochiweb, но полегче и попроще)● cowboy (похож на mochiweb и misultin, ...
Riak          git clone https://github.com/basho/riak● riak_core – фреймворк для создания распределенных систем● riak_erro...
lagerlager:error("oh no!")lager:warning("~s, ~s and ~s, oh my!", [lions, tigers, bears])2011-07-19 18:02:02 [error] <0.31....
RabbitMQ ● Используется для взаимодействия узлов   распределенных систем ● Persistent messaging ● Полная поддержка протоко...
Agnerhttp://erlagner.orgНа сегодняшний день 131 пакет
Upcoming SlideShare
Loading in …5
×

Erlang tasty & useful stuff

1,572 views

Published on

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,572
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Erlang tasty & useful stuff

  1. 1. Этот безумный, безумный Erlang
  2. 2. Структуры данных● lists (proplists)● sets● dict● gb_trees● queue● orddicts● ordsets● digraph● array
  3. 3. OTP● gen_server● supervisor● gen_fsm● gen_event
  4. 4. gen_server-module(mygenserv).%-behaviour(gen_server).-export([start_link/0]).-export([init/1, handle_call/3, handle_cast/2]).-export([sync_incr/0, async_incr/0, get_value/0]).start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, 0, []).sync_incr() -> gen_server:call(?MODULE, incr).async_incr() -> gen_server:cast(?MODULE, incr).get_value() -> gen_server:call(?MODULE, get_value).init(I) -> State = I, {ok, State}.handle_call(get_value, _From, State) -> {reply, State, State}.handle_call(incr, _From, State) -> {reply, State, State + 1}.handle_cast(incr, State) -> {noreply, State + 1}.
  5. 5. supervisor-module(myapp_sup).-behaviour(supervisor).-export([start_link/0]).-export([init/1]).start_link() -> supervisor:start_link({local, ?MODULE}, ?MODULE, []).init(_) -> MyGenServSpec = { mygenserv, {mygenserv, start_link, []}, permanent, 5000, worker, [mygenserv] }, ChildSpecs = [MyGenServSpec] {ok, {one_for_one, 100, 1}, ChildSpecs}.
  6. 6. Хранилища и БД из коробки● ETS – in-memory хранилище● DETS – дисковое хранилище● Mnesia – распределенная база данных на базе ETS&DETS
  7. 7. rebar# git clone https://github.com/basho/rebar# cd rebar# make# cp rebar ~/src/myproject# cd ~/src/myproject
  8. 8. rebar.config{deps, [ {mochiweb, "v1.1", {git, "https://github.com/mochi/mochiweb", {branch, "master"}} ]}.{erl_opts, [debug_info]}.
  9. 9. # ./rebar create-app appid=myapp# ./rebar get-deps# ./rebar compile# erl -pa ebin1> application:start(myapp).
  10. 10. # rebar -cclean Cleancompile Compile sourcescreate template= [var=foo,...] Create skel based on template and varscreate-app [appid=myapp] Create simple app skelcreate-node [nodeid=mynode] Create simple node skellist-templates List available templatesdoc Generate Erlang program documentationcheck-deps Display to be fetched dependenciesget-deps Fetch dependenciesupdate-deps Update fetched dependenciesdelete-deps Delete fetched dependencieslist-deps List dependenciesgenerate [dump_spec=0/1] Build release with reltoolgenerate-upgrade previous_release=path Build an upgrade packagegenerate-appups previous_release=path Generate appup fileseunit [suite=foo] Run eunit [test/foo_tests.erl] testsct [suite=] [case=] Run common_test suites in ./testxref Run cross reference analysishelp Show the program optionsversion Show version information
  11. 11. Mochiweb git clone https://github.com/mochi/mochiweb● Легкий высокопроизводительный HTTP-сервер● mochijson, mochijson2 – Erlang terms в JSON и обратно● mochiglobal – эмуляция глобальных переменных● reloader● Мелкие полезные утилиты (mochinum, mochilists, etc)● Есть форк с поддержкой websockets
  12. 12. mochiweb_httpmochiweb_http:start([ {port, 8080}, {ip, "0.0.0.0"}, {loop, fun handle_request/1}]).handle_request(Req) -> Method = Req:get(method), Path = Req:get(path), GETParams = Req:parse_qs(), POSTParams = Req:parse_post(), Req:ok({"text/html", "ok"}).
  13. 13. mochijson2Props = [ {age, 10}, {name, <<"Snoopy">>}, {talents, [<<"jumping">>, <<"barking">>, <<"sleeping">>]}],Obj = {struct, Props},JSON = mochijson2:encode(Obj),Req:ok({"application/json", JSON})....1> mochijson2:decode(<<"{"a": "test"}">>).{struct, [{<<"a">>,<<"test">>}] }
  14. 14. reloader# erl -pa ebin -s reloader # vi src/myapp.erl ... # ./rebar compileReloading myapp ... ok.
  15. 15. Другие веб-сервера● YAWS● misultin (очень похож на mochiweb, но полегче и попроще)● cowboy (похож на mochiweb и misultin, но использует не parametrized modules, а callbacks)
  16. 16. Riak git clone https://github.com/basho/riak● riak_core – фреймворк для создания распределенных систем● riak_error – ограничение размера error reports● lager – фрймворк для логирования● basho_bench – утилита для измерения производительности● rebar
  17. 17. lagerlager:error("oh no!")lager:warning("~s, ~s and ~s, oh my!", [lions, tigers, bears])2011-07-19 18:02:02 [error] <0.31.0>@test2:start:8 oh no! 2011-07-19 18:02:02[warning] <0.31.0>@test2:start:9 lions, tigers and bears, oh my!2011-07-19 17:51:21 [error] <0.60.0> gen_server crash terminated with reason: no matchof right hand value {} in crash:handle_call/32011-07-19 17:51:22 [error] <0.60.0> CRASH REPORT Process crash with 0 neighbourscrashed with reason: no match of right hand value {} in crash:handle_call/3
  18. 18. RabbitMQ ● Используется для взаимодействия узлов распределенных систем ● Persistent messaging ● Полная поддержка протокола AMQP ● Кроссплатформенный ● Клиенты на всех популярных языках ● Используется в продакшне сотнями компаний (включая Echo и Mochi Media)gen_bunny – библиотека для удобной работы с RabbitMQ вэрланге
  19. 19. Agnerhttp://erlagner.orgНа сегодняшний день 131 пакет

×