【関数】Erlang Part 2【エリクソン】
■ このスレッドは過去ログ倉庫に格納されています
■前スレ 【関数】Erlang【エリクソン】 ttp://pc12.2ch.net/test/read.cgi/tech/1176479959/ ■関連URL ttp://www.erlang.org/ ttp://www.erlang.org/download/erlang-book-part1.pdf ttp://ja.wikipedia.org/wiki/Erlang ttp://www.planeterlang.org/ ttp://cean.process-one.net/ ttp://www32.atwiki.jp/erlang/ ttp://jijixi.azito.com/cgi-bin/diary/index.rb?category=Erlang ttp://www.kmonos.net/alang/etc/erlang.php ttp://quasiquote.org/log2/Erlang ttp://www.youtube.com/watch?v=uKfKtXYLG78 ttp://video.google.com/videoplay?docid=-5830318882717959520 ttp://erlide.sourceforge.net/ ttp://rucila.s43.xrea.com/memo/?date=0304 PythonとかRubyとか使ったけどやっぱりErlangのバイナリ処理とパターンマッチは最強だわ。 文字列の処理が楽だから、プログラムの翻訳機がかなり作りやすい。 で、他にもっと使いやすい言語ある? 鯖移転記念 ttp://www.atmarkit.co.jp/news/200704/27/erlang.html How To Become A Hacker http://cruel.org/freeware/hacker.html もしコンピュータ言語をなにも知らないなら、まず Python から始めることを おすすめします。設計がきれいだし、ドキュメントもしっかりしているし、 初心者にもそこそことっつきやすくできています。でも入門言語として最適でも、 おもちゃではありません。強力で柔軟で、大きなプロジェクトにもじゅうぶん 対応しています。 Java もプログラミングを学ぶにはよい言語です。 Python よりはむずかしい ですが、できるコードは Python より高速です。二番目の言語としてはとても すぐれていると思います。 本気でプログラミングをするなら、C を勉強するしかありません。これはUnix の 中核となる言語です。C++ は C と密接な関係にあります。片方を知っていれば、 もう片方を学ぶのはそんなにむずかしくありません。が、どっちも真っ先に 勉強しようとするのには向いた代物ではありません。 C++でプログラム書くのを覚えるとCでプログラム書くのは無理 Cを読むくらいならできるけど、Cで書くなんてバカらしくてやってらんない >>123 それCommonLispで以下略とか Erlangで以下略とか なんでもよくね? Cの良いところって組み込みで使ってもリソース食わないとか ハードウェアに密接する処理書いてもOKとかそのくらいしかわからん(ここはC++でもいいんだが) Erlangプログラミングを70ページ読んでやって「これ->を:-にすればPrologじゃん」と気付いた Prologみたいな双方向のユニフィケーションとか、同じ変数名を使ったパターンとか、あるの? Erlangもっと流行ってほしいなぁ。 ほかの言語やってるとやっぱりErlangのパターンマッチが最強過ぎていやになるわ。 初心者にとっつきやすいようにprint分を簡単にして、 プリコンパイラを簡単にして関数を全部publicアクセスにして、 レコードをクラスっぽい使い方できるようにすれば ちょっとはとっつきやすくなるんじゃないかな。 標準入出力よりも数値計算が充実してくれれば 行列で検索してもキューの話ばっかり出てきて困る C言語とかで関数の頭で引数の検査でassert使うけど、それをパターンマッチングでできるので楽 f({a,X}, {b,X}) -> みたいに引数の同値の検査を省略できるのはたしかに楽 いくらググってもemacsモードのファイルがヒットしないのでしばらくあきらめてたら、配布物の中に入ってた Erlang入門という中古書籍片手にErlangの勉強を始めましたが、 本に書いてある通り、 c(モジュール名). とコマンドを実行しても、 モジュール名.bea#: error writing file とエラーが出てコンパイルできません。 http://blog.overlasting.net/2007-05-09-1.html のサイトを見て、c(sample).を実行しても sample.bea#: error writing fileと表示されます。 Erlangはマイナー過ぎてググっても分かりません。 誰か助けてください…。 ようは、対話型のコマンドは実行できるが、コンパイルできないんです。 Windows7の64版を使っているのは関係ないだろうし、途方に暮れています。 もちろん作業フォルダにファイルは置いています。 >>136 sample.erlのあるディレクトリに書き込み権限持ってる? >error writing file 英語はマイナーすぎてわからないということだな さすが初心者は半端ないぜ 福沢諭吉「脱亜論」 1885年3月16日 時事新報 日本の不幸は中国と朝鮮だ。 この二国の人々も日本人と同じく漢字文化圏に属し、同じ古典を共有しているが、 もともと人種的に異なるのか、教育に差があるのか、 日本との精神的隔たりはあまりにも大きい。 地球規模で情報が行き来する時代にあって、近代文明や国際法について知りながら、 過去に拘り続ける中国・朝鮮の精神は千年前と違わない。 国際的な紛争の場面でも「悪いのはお前の方だ」と開き直って恥じることもない。 もはや、この二国が国際的な常識を身につけることを期待してはならない。 「東アジア共同体」の一員として その繁栄に与ってくれるなどという幻想は捨てるべきである。 日本は、大陸や半島との関係を絶ち、 欧米と共に進まなければならない。 ただ隣国だからという理由だけで特別な感情を持って接してはならない。 この二国に対しても、国際的な常識に従い、国際法に則って接すればよい。 悪友の悪事を見逃す者は、共に悪名を逃れ得ない。 私は気持ちにおいては「東アジア」の悪友と絶交するものである。 _,,,,,,__ __,,,__ ィjj)))))))))!!!!!彡ヽ, /ミ/ ,}彡ヘ |ミ{ -‐ ‐ ‐ ‐- {三=| El==; ゚ ''==. |ミミ,| `レfォ、,〉 :rfォ.、, !iル┤ . { `¨ i ・、¨ ´ `{ゞ'} 支那、朝鮮とは . | '`!!^'ヽ .「´ 付き合うなと忠告しておいたのに。。。 ! ,-ニ'¬-、 ,!|,_ . \´?` / ∧ヘ、 __/〉`ー ' ´ / 〉 \ _, ィ´「∧ / / 」¬ー- 、_ -‐ ´ / / ヽ、/ / iヾ ヽ 返信遅れてすみません。 >>138 それが原因でした。恥ずかしいです。 ありがとうございました。 Learn You Some Erlang for Great Good! ttp://shop.oreilly.com/product/9781593274351.do haskell本みたいに流行るかな http://itpro.nikkeibp.co.jp/article/NC/20120920/424107/ 日経コンピュータ9/27号の関数型言語の記事で、誰も校閲してくれなかったのか (erlangを参考にアクター押しのscalaと違い) erlangが並列実行に向いてないことになってて泣けた。 何故か記事にされてないclojureよりも残念な気がしてくる。 Scala押しありきの記事みたいだから(出てくる名前からして)気にしても仕方ないよ 進藤 智則さんって、Erlangを使ったことがあるのだろうか? >>145 好意的に解釈すると、 Erlangは「並列(pallarel)」ではなくて「並行(concurrent)」に向いてる言語だ、 といいたんじゃね? あと、ErlangのSMPサポートは2006年(R11B)からなので、マルチコアを 活かせるようになったのは結構最近。 > あと、ErlangのSMPサポートは2006年(R11B)からなので、マルチコアを > 活かせるようになったのは結構最近。 そーだったのか、知らなかった。>>148 は詳しいな。 マルチコアでerlangの時代が来ましたよ!っぽい売り出し方してたから、 昔からそういうつくりなのかと思ってた。 あと、erlangのプロセスって、カーネルスレッドともユーザレベルスレッドとも違って erlangのランタイムで実現されているという説明をよく目にするんだけど、これってどゆこと? erlangのランタイムはOSのスレッドを利用しないで、並列(parallel)な処理を実現しているということ? そうだとすると、たとえば、C言語でもカーネルスレッドを使わずに並列(parallel)な処理を実現できる方法があるの? // / / バカッ //⌒)∩__∩ /.| .| ノ ヽ / | | ● ● | / | 彡 ( _●_) ミ 馬鹿には無理 / | ヽ |∪| /_ // │ ヽノ \/ " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ >>145 メッセージパッシング中心だから、並列実行の実効には向いているがプログラミングが難しい その代わり分散処理に向いている 久しぶりに触ったけどどうしても変数名を小文字で書いてしまって困る ElixirとかあるけどどうせならReiaに流行ってほしかったなあ Parallella and Erlang: An Introduction ttp://www.parallella.org/2013/02/04/parallella-and-erlang-an-introduction/ なんか面白そう Erlangを勉強したいのですが2つ知りたいことがありまして ・Erlangプログラミング(動物)とプログラミングErlang(飛行機)のどちらがお勧めですか ・マシンにCPUコアがたくさんあったら、あるだけ使ってくれるのでしょうか? 暇だったら教えてください >>155 他の言語でもオライリー派だったせいか、オライリーの方が分かりやすかった ただ、最初から応用が頭にある場合は飛行機の方がいいかもしれない ErlangのVMが用意するスケジューラの数はマシンについてるコア数と同じだけど、その割り当てが1対1でマシンについてるコアを使うとは限らない >>157 せっかくなので飛行機の方を買ってみようと思います ErlangとしてはCPUを使うように努力してくれるみたいで安心しました 教えていただきありがとうございます >>158 その本達は両方持ってて飛行機の方を先に読んでいたんですけど、動物本は文章が例によって長くて途中で投げましたw 結構昔の話なのでもう忘れてしまって印象だけなんですけど、多分そっちで正解です。 まあ気が乗ってくれば、入門だけ本に助けてもらって後はいくらでもネットで調べられますからね。 ところでErlangでキラーアプリてなんかないんですか? 特徴いかしたソフトあればもっと流行ると思いんだけど HBase/HadoopやCassandraの中身をみてうんざりして 分散システムの構築に特化していると聞いて RiakやHibariとかに密かに期待してるんですが、 これらってちゃんときちんと作られてます? pythonの本読んでたらcouchDBの宣伝してた >>164 (Cassandraはちらっと見た程度だけど) 大局的には凡人には及びも付かないロジックなんだろうけど 道具レベル的にJavaに対する理解が稚拙、特にマルチスレッド関係 バグにバグを重ねていてもはや修正不可能。なんで動いているように見えるのか不思議 JIRAの手ごたえだと、中の人に分かってない人が混じっていて、今後もバグを積み重ねていくものと思われ なんで地盤の部分をちゃんと勉強しないんだろ。まさに砂上の楼閣 >>166 そっか。うちなんかはあまり考えずにCDHのHBaseをインストールして運用しているだけの ユーザーだから、あまり実装の稚拙さとかは考えたことが無かった。 ただRiak等が良いのですぐに乗り換えられるかと問われれば、うちの用途から考えると無理 だなとは思う。Javaで書かれた分析処理の並列実行が一番の用途でレンジスキャンが主なので やはりHBaseが一番はまるんだよね。 データモデルも違うし、結局のところ用途から選ぶのが最初じゃないのかな。 http://hypertable.com/why_hypertable/hypertable_vs_hbase_2/ BigTableクローンとしては、HbaseのほかにHyperTableってのもあるけど、 C++で実装されているしAPIに互換性があるわけではなかったと思う。 Erlang/OTP使うと並列プロセスやプロセス監視などの仕組みが整ってるし ディスクアクセスもETSに集中させれば管理し易いので、実装レベルを保証しやすいと思う。 http://www.erlang.org/doc/man/ets.html http://www.aosabook.org/en/riak.html Programming Erlangも第2版が出るってJoeが言ってたよ 第二版でるのは嬉しいけど初版出てから仕様に大きな変化が何かあったっけ? joearms.github.com/2013/04/05/programming-erlang-2nd-edition.html どうやら最近の流れに反映させるのが主な目的なのかな これは初学者がステップアップしやすくなりそうだし 初版を持ってる人も最近の動向が掴めていいかもしれないね escriptでプログラム動かすときmain/1のアリティを使う場合、main([Arg])な感じに書かないと 思ったように動かなかったんだけどアリティを[]で囲むのってescriptで動かす場合だけなの? >>174 > escriptでプログラム動かすときmain/1のアリティを使う場合、main([Arg])な感じに書かないと > 思ったように動かなかったんだけどアリティを[]で囲むのってescriptで動かす場合だけなの? まず、argumentとarityを取り違えてる。 コマンドラインで与えた引数がStringのリストとしてmain/1に渡されるので、 main([Arg])としたら、引数が1個の時だけマッチして、かつその引数がArgに入る。 参考: ttp://erlang.org/doc/man/escript.html >>175 なんとなく分かった気がしました。 参考URLありがとうございました 公式のドキュメントや飛行機本にでてるリスト内包表記でサンプルに ピタゴラスの定理が使われてるけど pyth(N) -> [ {A,B,C} || A <- lists:seq(1,N), B <- lists:seq(1,N), C <- lists:seq(1,N), A+B+C =< N, A*A+B*B == C*C ]. の条件の最期の2行がなんでこんな条件書くだけで プログラムが動作するのかが納得がいかないのは自分だけ? >>177 過去、自分も納得いかんかったw で、リスト内包表記で書かれたリスト処理をmap/filter/concatで書き直すことが可能な事は、 以下の書籍で明解に解説されているので、書店などで立ち読みするなりを薦める 関数プログラミング, R.バード/P.ワドラー共著, 武市正人訳 http://www.amazon.co.jp/dp/4764901811/ リスト内包表記の書き直しは節「3.4 リストの写像と濾過(mapとfilter)」内の p66-68を ちなみにこの本、最近出版された第2版で全面的にHaskellへ書き換えられた(改悪された?)が、 上記のリスト内包表記の書き直しを含むいくつかの基礎的な事柄が削られているので注意要 バックトラックなの? A, B, C それぞれについて、1 から N の全組み合わせだと思ってたけど。 >>181 いくつかの規則に従って、内包表記をmap/filter/concatから構成される一般的な式へ 書き換える(変換する/翻訳する)手法だから、Prologのバックトラックとはまったく違う 詳しくは>>180 の書籍を参照 Erlangのオリジナルは論理型言語から出発しているが、 その言語とは(Concurrent PrologやGHCといった)並列論理型言語のことであり、 (いわゆるPrologと呼ばれる)逐次論理型言語が持つバックトラック機能は失われている だから、逐次Prologに関する知識の多くはErlangでは役に立たないと考えた方がいい >>180 最初の3行で1からNまでのリスト3つ作って勝手に総当りでもやってんのかと 思ってましたけどそんな機能あったんですね。 とりあえずバックトラックについてはググって 本は図書館に初版あればいいけどとりあえず探してみます。 リスト内包表記について、関数型言語の実装技法を解説した以下の書籍に(>>180 より詳しい)説明あり "The Implementation of Functional Programming Languages", Simon Peyton Jones, 1987 http://research.microsoft.com/en-us/um/people/simonpj/papers/slpj-book-1987/ リスト内包表記については、Chapter 7 List Comprehensions を参照 リンク先のページでは、この書籍の全文がPDFとして無償公開(タダ!!)されているので、一読をば >>185 Erlangでもバックトラックのアルゴリズムは記述できるけど、 Erlangの計算モデルでバックトラックが使われているという話を(自分は)見たことも聞いたことも無い また、Erlangはパターンマッチングが使えるけれど、これもPrologの単一化(unification)とは別物 >>183 で書いたように、Erlangと類似性があるのは(バックトラックを捨てた)並列Prologだ Erlangの外観が逐次Prolog(いわゆるフツーのPROLOG)と似ているからといって、惑わされてはいけない >>186 基本的な考え方は総当たりだね、いわゆる generator&filter パターンと呼ばれる手法 で、リスト内包表記をg&fパターンへ書き換える技法を解説したのが>>180 や上記の書籍になる 難しい用語はすっ飛ばして、総当りとやってる事は何か違うの?見かけ上じゃなくて実質的に >>188 総当たりでも、深さ優先か幅優先かで停止性が異なる >>188 意味(=実質)は同じで構文(=見かけ)が違うだけ、いわゆる構文糖(syntax sugar) joe armstrongのプログラミングerlangの8.11の練習問題で質問です。 一番目の問題の「spawn(Fun)をAnAtomとして登録する関数start(AnAtom, Fun)を書くという問題で、 2つのプロセスがstart/2を呼び出した場合もプログラムが正しく動作するようにすること。」と言う問題で以下のコードを書きました。 start(AnAtom, Fun) -> undefined = whereis(AnAtom), %% ここのコードはまずい? register(AnAtom, spawn(Fun)). erlangの並行処理のモデルがよくわかっていないのですが、 上のコードのコメントが書かれているところででプロセスAがwhereis(AnAtom)をundefinedに評価した後に別のプロセスBに切り替わってwhereis(AnAtom)をまた undefinedに評価することはありえるのでしょうか?それともノンプリエンティブマルチタスクに似た並行処理モデルなのでしょうか? こういうことに気にしないようにregisterを呼び出すプロセスを作って、 そのプロセスにregisterを呼び出すようにメッセージを送ったほうが良いのでしょうか? \ / \ / \ / \ / \ / \∧∧∧∧/ < 俺 > < 予 し > < か > ─────────< 感 い >────────── < な > < !!! い > /∨∨∨∨\ / \ / ∧_∧ \ / ( ・ω・) \ / _(__つ/ ̄ ̄ ̄/ \ / \/ / \ (ここに一人いるんですが長いこと触ってないので答えられないんです) >>192 CPU(core)が複数あると、完全に同時並行で動くと思う。 問題は 2つのプロセスが同時に呼んだ場合も正しく動くこと。 そのような場合、片方のプロセスは成功、もう一方は失敗を保証すること で、spawnされたプロセスをどうするか書かれていないし、 true = register(AnAtom,spawn(Fun)). で良いような気がする。 2版出たのかな? Erlang学習してて詰んでる人は、「コンピュータプログラミングの概念・技法・モデル」(略称CTMCP)を読むと変化が起きると思う。 >>195 そういう解釈でいいんですかね? >>2 版出たのかな? 部屋から発掘した1版1刷を読んでます。 >>197 spawnされたほうの始末を考えないといけないことに気付かせる問題と思った。 完全同時並行で動くので、少なくとも8章までの内容だと、プロセスが2つ起動されてしまうのは 回避できないように思う。流し読んだだけなので違ったらごめん。 現実的にはregister成功したらメッセージを投げて、spawnされたほうはそのメッセージを待って 仕事をするのかな? >>198 トンチンカンな事を言ってたらゴメン。 UNIXのプロセス生成とごっちゃにしてない? process_flag(priority)の説明に preemptive scheduling と書かれていて、erlang(beam)仮想機械の 命令数で切り替えを行うのだったと思う。 2つのプロセスでほぼ同時に register(atom,spawn(fun)) を実行するとして、先のプロセスの spawn(fun) から戻ったところでプロセス切り替えが起きて後のプロセスが動くと、spawnされて registerしていないプロセスが2つ存在する状況を回避できない。 registerできるのは1つだけなので、どちらかのプロセスを始末しないといけない。 と書いていて気付いたけど、>>192 のFunを直接spawnするのをやめて、spawnされたらself()を registerして、Funを呼ぶようにすれば良いのかな? 「完全同時並行」は話をメンドクサくしてしまったかもしれない。ごめん。 register自体は排他制御されているだろうから、このコードでどうでしょうかね? start(AnAtom, Fun) -> Pid = spawn( fun() -> receive run -> Fun(); die -> void end end), M = case register(AnAtom, Pid) of true -> run; _ -> die end, Pid ! M. 200さんが言ってるのはこういうコードですか? start2(AnAtom, Fun) -> spawn(fun() -> %% AnAtomが登録済みの場合例外が発生して %% プロセス内で例外をキャッチしないのでプロセスが死ぬ register(AnAtom, self()), Fun() end), true. start(AnAtom, Fun) -> Pid = spawn( fun() -> receive run -> Fun(); die -> void end end), try register(AnAtom, Pid), Pid ! run, true catch error:badarg -> Pid ! die, error(badarg) end. >>202 そんな感じ。 set_lock()で排他制御してしまうという案もあると思う。 元々の設問が中途半端なので、後は好みの問題かな? erlangにcpanっぽいサイトやツールってありませんか? ありがとうございます。 ライブラリのインストールはrebarでできそうです。 ライブラリを探す場合は皆さんgoogleやなんかで"erlang hogehoge"のような感じで探してるんでしょうか? あるけどサイト見たらサポートプラットフォームがR15Bまでだった erlangって他の言語を呼び出せる? 例えばCのライブラリとか。 あと、erlangでCのプログラムを起動してアクセスできる? 具体的には Cで書いた状態ありのモジュールを起動して、 erlangがそのモジュールにデータ書き込んだり読み出したりするなんてこと をしたいんだけど。 >>211 サンキュ どうやるの? ポインタ教えてもらえると助かる ttps://www.google.co.jp/search?q=erlang+%E5%A4%96%E9%83%A8%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9 サンキュ erlangからポートで接続してデータのやりとりすれば いいわけね。 Dave Thomas が本出すとかで今後の火種になるかもしれないあの Elixir ですか(カンペガン見) ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる