Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article?

Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? どうもこんにちは. fukuoka.exという技術コミュティにて, **ElixirをIoTボードで動かしたらどうなんの??**というIoT芸を披露しております. fukuoka.exでの登壇内容をQiita記事に起こして連載しているのですが,自分でも投稿内容が把握しきれなくなってきたので,ナンバリングも変えつつの目次を作ることにしました. なお,目次追加(更新)の際には変更通知を送るようにしますので,本記事をストックしていただけると,更新情報の通知を受け取ることができます. ElixirでIoT#1:IoTボード上でのElixir/P
最近、ElixirのPhoenixを使う機会が増えて来ました。そんなPhoenixですが内部的にErlangのHTTPサーバであるCowboyが使われています。内部的に使われてるので一度、Cowboyを使ってみたいと思い、Erlangで簡単なサンプルを実装してみましたのでその時のメモを書いていきます。 さらっとCowboyの特徴 モダンなHTTPサーバになります。モダンと言ってるだけあってHTTP/2とWebSocketを対応しているようです。遅延とメモリ消費量が少なくコード量自体も少ないHTTPサーバになります。なので簡単なAPIサーバを実装するときにPhoenixでは重過ぎる場合とかに使えるかなぁと思います。 実行した環境 Erlang/OTP 21 rebar3 3.6.1 Cowboy 2.4.0 実装 環境準備 Erlangとrebar3 まずは環境から。そもそものErlangの
CowboyでCookieの使い方を学んだので備忘録的に残しておきます。 はじめに ErlangやCowboyの環境構築や設定は以下の記事にまとめてるので気になる人はやってみてください。 CowboyでHello Worldのサンプルを動かしてみる ハンドラーの準備 まずはCowboyで呼び出すハンドラーの準備をします。パスに応じてハンドラーを呼び分けたりしますが今回は全てのリクエストは一つのハンドラーが受けるようにします。 start(_StartType, _StartArgs) -> Dispatch = cowboy_router:compile([ {'_', [ {'_', toppage_handler, []} ]} ]), {ok, _} = cowboy:start_clear(http, [{port, 8010}], #{ env => #{dispatch =>
$ mix phx.server =SUPERVISOR REPORT==== 21-Aug-2018::09:37:27.995612 === supervisor: {local,'Elixir.Logger.Supervisor'} errorContext: start_error reason: noproc offender: [{pid,undefined}, {id,'Elixir.Logger.ErrorHandler'}, {mfargs, {'Elixir.Logger.Watcher',start_link, [{error_logger,'Elixir.Logger.ErrorHandler', {true,false,500}}]}}, {restart_type,permanent}, {shutdown,5000}, {child_type,worker}]
Elixir(エリクサー)って何? Elixirは並行処理の機能や関数型といった特徴を持つ、Erlangの仮想マシン (BEAM) 上で動作するコンピュータプログラミング言語 by Wiki ググれば色々と詳しく出てくるので、ザックリとメリットを述べると 関数型言語のメリットを享受できる一方でスクリプト言語のようなシンプルな言語仕様 「膨大なデータやアクセスの高速処理」と「高い開発効率」を両立できる Railsの開発者が作ったWebフレームワークPhoenix(フェニックス)が優秀 ハードウェアの性能に比例した高速化が実現できる! Discordなどの大規模サービスでも実際に使われているとか! もうちょっと専門的に知りたい人はこちらとかオススメ Elixir for Rubyists | カヤックエンジニアブログ なんで興味を持ったか 1. これから台頭しそう 2020年以降SI案件が激減
すごいErlangゆかいに学ぼう! Erlang の勉強のため写経したりメモ書きしたものです。 とても分かりやすく良い本なので、Erlangに興味ある人は購入されることをオススメします。 第1章 アトム アトムはアトム表で参照されていてガベージコレクションの対象にならない。4byte(32bit sys) or 8byte(64bit sys) のメモリを消費するので、動的にアトムを生成するのはメモリ枯渇の原因になるので、やらないこと。また、アトムの最大個数は 1048577個、これは設定で変更可能。 Erlang では なんでも比較できる 言語設計思想。 true , false は単にそういうアトムであるだけだが、言語実装と深く結びついてるのでOK true < 1 は false , なぜなら、上述の通りなんでも比較可能だから。 タプル 最初の要素がアトムなタプルを タグ付きタプル
上の表から(期待通り)ppgの方が、ノード数が増えた場合でもメンバ追加の性能劣化度合いが少ない、ことが見てとれる。 ※ 理屈上は、クラスタサイズに依存せずに定数コストでのノード追加・削除が可能なはず。 ※ 今回の測定でノード数が増えるに従って、微妙に処理時間が長くなっているのは、全ノードを同一マシン上で起動しているためだと思われる (ノード数が増えるほどマシン自体に掛かる負荷が増える) 反対に、pg2はノード数に比例する形で処理時間が伸びているように見える。 また、pg2は並行的にメンバを追加した場合に(逐次的に行った場合に比べて)性能が劣化しているのに対して、ppgでは逆に並行版の方が性能が向上しているのも面白い。 なお、一応公平を期すために書いておくと、グループ構成の変更(メンバ追加・削除)の場合とは反対に、メンバへのメッセージのブロードキャスト時のコストに関しては、pg2の方が基本的
この記事は Theorem Prover Advent Calendar 2014 の5日目の記事です。 昨日は notogawa さんの ブラウザ上でAgdaを試せるサイトを作ってみた でした。Try Agda、前に見せていただいたときよりかなり綺麗になっててビビりました。自分の ProveEverywhere はやるやる言いながら放置なので、ダメですね… Verlang と Coq の Extraction について さて、本題ですが、Coq には Extraction という、Coq のコードを別の言語に変換する機能があり、この機能によってコードを検証済みの部品として実際のプログラムに使えるようになっています。標準では OCaml, Haskell, Scheme への変換が可能になっています。 この記事では、Verlang という、Coq の Extraction 対象に Erla
このAdvent Calendarで度々話題になって(して)いる、Riak Source Code Reading。 Erlang/OTPを全く知らない人にとっては、Erlangの文法はもちろん、ファイルやディレクトリ構成など未知のことだらけだと思う。 「Erlang/OTP何それ美味しいの」状態から脱却し、Riakのコードを楽しく読むために必要な知識を書いていこう。 用語について RiakはErlang/OTPで作成されている。 Erlangとは、エリクソン社が開発したプログラミング言語。 OTPとは、システムを作るフレームワークみたいなものだ。 RubyとRuby on Railsの関係を想像する人もいるかもしれないが、Erlang/OTPはそれより相互が依存している。 故に、正式にはErlang/OTPみたいに”ひとつ”として呼ばれることが多い。 そのOTPとは何なのか。 正式にはO
gproc のはなしをします。 背景 Erlang ではプロセスを作りプロセスに名前を与えることにより、プロセスIDを引き回すことなくそのプロセスとやりとりする、といったパターンがよくあります。Erlang はそういったパターンのために erlang:register(Name, Pid) という関数を用意しており、これを用いてプロセスに名前をつけることができます。しかしこの公式に用意されている "process registry" にはかなり制限があります。 Name にはアトムしか使えない。 プロセスはただ一つの名前しか持てないし、ある名前はただ一つのプロセスにしかつけることができない。 ローカルとグローバルのAPI、セマンティクスが異なる。 など。 これには色々問題があって、例えば、 ユーザのセッションごとにプロセスを生成するようなネットワークアプリケーションで、あるユーザの現在の状
「Erlang でシダを描画する」をしました。 ですが、Erlang でのグラフィクス処理がよくわからず、プロットは Ruby(RMagick)で行いました。 Ruby 側からコマンドとして Erlang 側を呼び出しています。受け渡しデータ形式は YAML にしました。 実行は Linux で行いました。 (プログラムで描画した 'shida.png') Erlang のプログラムです。 Erlang は全然分かりません。これだけ書くだけでも、四苦八苦しました。 (Erlang っぽい書き方をもっと知りたいです...) -module(shida). -export([fern/0]). main(_) -> fern(). % Warning がでる. w1x(X, Y) -> 0.836 * X + 0.044 * Y. w1y(X, Y) -> -0.044 * X + 0.836
読み込み(検索)処理の方が圧倒的に多いと予想されるようなKVS的なプロセスを、Erlang/OTPでどうやって効率的に(スケールアップするように)実装するか。 少し前にlocalという、名前のスコープを限定可能なプロセス名管理用ライブラリを実装した時に採用した方法のメモ。 結論 結論を先に書いてしまうと名前付きのETSを使うのが良い。 ETSを名前付き(and access=protected)にしておくことで、テーブルの所有プロセスを経由せずに読み込み処理を行うことが可能となる。 そのため、複数クライアントプロセスから同時に要求が来た場合でも、それらが(メッセージパッシングを通して)直列化されることなく、並列的に処理されることが期待できる。 実際に、今回測定した範囲では、ETSを使うことで読み込み処理はコア数に対してほぼ線形にスケールしていた。 実装例と性能比較 以降は、実際にETSを使
この場を借りて、以下の条件に合致する自作ライブラリ群の紹介をさせて貰います。 Erlangで記述されている 一年以内に更新があった ある程度汎用性が高い ある程度(最低限)ステーブル rebarの構成に準拠 ※ 諸事情で準備時間があまりとれなかったため、今回は本当に軽い紹介だけで、あまり有益な情報はないです... hash_ring https://github.com/sile/hash_ring コンシテントハッシュ法の実装ライブラリ 現状備えている機能 ノードの追加・削除 特定のキーに対するプライマリノードの検索や優先順位に基づくノードの畳み込み 各ノードの重み付け ハッシュアルゴリズムや仮想ノード数の指定 実装上の特徴 Pure-Erlang and No-ETS 副作用なし 仮想ノード群を保持するためにタプルを使っている ノード数が100で、個々の仮想ノード数が256なら、約2.
ErlangでHaskell風の Maybeモナド と do記法 を使う方法。エラーチェックなどを繰り返し行うコードが簡潔に記述できる。RabbitMQの開発者が公開した [erlando] (https://github.com/rabbitmq/erlando) で実現する。 erlandoにはListモナドやStateモナドなども含まれており、もちろん自分で新たにモナドを書くこともできる。また一部のモナドではMonadPlus型も実装されており guard/2 関数などが使える。さらに、関数の部分適用を読みやすく記述できる「cut」や、関数のインポート時に関数名を変更することで名前の衝突を避ける「import as」という機能もある。 maybe(A) 型 Erlang/OTPでは処理が失敗するかもしれない関数は、失敗したことを「例外」ではなく、「戻り値」で表現する。例えば list
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く