田舎で並行処理の夢を見る

試したこと、需要がないかもしれないけど細々とアウトプットしてます

Algorithm

ElixirでListMonadを作ってみる

Monad(モナド)の魅力 関数型言語に触れていれば少なからず「Monad(モナド)」という言葉を耳にする。残念ながら私の愛するElixirではMonad(モナド)を大々的に取り扱うことはない(知らないだけなのかも)はないが、純粋関数型言語として有名なHaskellではMonad(…

並行・並列と並行処理・並列処理の違いについてまとめた

毎回調べているのでまとめた 何気なく「並行処理にすると....」だとか「ここは並列処理にして...」という会話をすることが普段多いが、「並行と並列って何が違うのよ?」と前からよく思っていた。その度に、ググっては「あー。そういうことね」と理解するも…

【Elixirのサンプルコード有り】条件に一致した時に再帰を停止する方法4つを書き比べてみた

なんでbreak_reduceみたいなのはないんだろう 配列(リスト)に対して、各要素を精査する際に、特定の条件にマッチする要素が見つかった時点で処理を停止して、Elixirであれば{:exist, value}のような値を返す関数をよく作成することがある。頻出の処理パター…

【実装コード有り】銀行家のアルゴリズムの実装と検証

今更作った理由 たまたまgoogle scholarで並行処理に関する資料を眺めていたらダイクストラ法で有名なエドガー・ダイクストラさんの名前を見かけた。自分の中では数学者という認識をしていたが、実は分散コンピューティングの分野で、どのようにシステムの信…

【golangのサンプル有り】クロージャ(closure)完全に理解した人のためのクロージャを使った便利サンプル集

クロージャ完全に理解した...で何に使うの? 実は使いこなせると結構便利。特定の値に対する操作を共通化することが出来て、想定しているもの、言い方を変えれば作者の作成しているもの以外の操作を制限することも出来る。あと、かっこいい。 クロージャのユ…

【モジュールとの比較】Elixirで無名関数を使って再帰処理を記述する方法

無名関数では再帰処理が難しい Elixirで再帰関数を記述しようと思った際には、defmodule Fooと定義して、そのモジュール内部にdef barのように関数を定義して、パターンマッチもしくは、分岐処理によって再帰関数を処理するのが一般的。 defmodule Sample do…

【並行処理vs逐次処理】プロセスを事前に立ち上げることによって高速化されるのか【めちゃ速】

前回の話 「並行コンピューティング技法」を読み進める中で「並行和」の実装をElixirを用いて行なった。何とか実装が完了した並行和の処理を複数プロセスを立ち上げてチャンクを分割して実行する並行処理(parallel)と、チャンクを分割せずにメインの1つのプ…

【並行処理vs逐次処理】Elixirで実装した並行和と逐次和をベンチマーク測定をして比較した結果【完全敗北】

前回までのお話 「並行コンピューティング技法」という書籍を読み進める中で「並行和」という並行処理にてデータの要素の合計値を求めるアルゴリズムをElixirを用いて実装してみた。何とか動くところまで作れたものの、実行速度がどれだけ逐次処理と異なるか…

【並行コンピューティング技法】第3章のまとめ

前回までのあらすじ 実際に並行処理を記述する際にどのように手法を決めて実装していくのかという話が第2章のメインであった。 並行処理の方針を決める手法は以下の2通りで、第2章ではそれぞれの特徴やマナー、サンプルに触れながら内容が進んでいく。 タス…

【並行コンピューティング技法】第2章のまとめ

前回までのあらすじ 以前から気になっていた「並行コンピューティング技法」を衝動買い。全体の構造を読み解き、どんな知識がこの本から得られるかを考察した。合わせて、第1章を読み、内容を簡潔にまとめた。第1章は大きく以下のような内容を扱っている 並…

【並行コンピューティング技法】全体の構成と得られる知識 & 第1章のまとめ

今回の購入物 前から買おうとは思っていたが、読む時間ないなぁと手を出さずにいた「並行コンピューティング技法」をたまたま立ち寄った本屋にて発見し、思い切って購入。最近、学習に対するモチベーションが下がっているので気持ち新たにスタートするために…

数値をASCIIを用いてaからzまで(半角英字)の文字列に変換

何をしたいのか 業務で書いたコードなのだが、作成する元になったアイディアがボツになったため、お蔵入り。需要は無いだろうけど、せっかくなので当時、ググっても出てこなかったので公開しておこうと思う。1から始まる任意の数字をASCIIで定義されている数…

【サンプルコード有り】golangで複数条件のソートを無名関数を使っていい感じに実装してみた

何をしようとしているのか struct(以降、構造体と表記)を要素に持つ、配列をソートする必要がある場面に出くわした。通常というか一般的な数値や文字列のソートと異なり、構造体のAフィールドの値が大きい順番かつ、Bフィールドの値が小さい順かつ...のよう…

【レポート】第12回清流elixir勉強会を開催しました【elixirでミニCodeReTreatやろうぜ!!】

トピック 今回で第12回目の勉強会を開催致しました。いつのまに12回も... elixir-sr.connpass.com 以前よりずっと個人的にやりたいなーって思っていたCodeReTreatを開催しました 名古屋でも開催されているのをちらちらと見たことがありますが、中々参加でき…

【OTP入門】ElixirとOTPを使ってスタックサーバーを実装するまで

そもそもOTPとは 一言で言えば、Erlangで用意された便利なライブラリなどの集合体で便利ツールをまとめたものという認識をしている OTPとはopen telecom platoformの略で当初は堅牢性が重要な電話交換機を開発するために使用されていた 今になってはElixirで…

【実装コード有り】Elixirで近しいデータを予想するためにk近傍法を実装した

k近傍法とは ざっと説明するとAというデータとBというデータが どれだけ近しいかを予測するためのアルゴリズム 仕組みは超簡単で以下のようなデータがあったとする size(大きさ)は1~5の5段階 is_red(見た目)は1~5の5段階 has_seed(種があるかないか)は0or1 a…

【実装コード有り】Elixirでタイポ発見器を最長共通部分列を使って作る

プログラムでタイプミスを修正する難しさ 以下のような変数があったとする user_input_textは自身で入力したテキストで"apple"と入力したつもりが 間違えて"anpple"と入力してしまっている user_input_text = "anpple" answer_text = "apple" 他にもタイプミ…

【実装コード有り】ElixirのMapSet(集合)の使い方と集合カバー問題を解くまで

Setは非推奨 元々、Elixirに実装されていたSetという集合のモジュールは現在、非推奨となっており MapSetを使ってくれよなと公式が言っている なのでよほどの理由がない限りはMapSetを使えばいいんじゃないかなと MapSetの使い方 MapSetモジュールを使うこと…

Elixirでダイクストラ法を実装して最短経路を求めるまで

グラフと最短経路 こんなグラフのネットワークがあったとする Start, A, B, Goalをそれぞれノードといい 6,2,3...のような数字をエッジの重み(ここでは距離)という StartからGoalへの最短経路は見て分かるように Start -> B -> A -> Goal になるかと思う こ…

Elixirでqueue使って幅優先探索を実装する

Elixirにqueueがなかった件 しかし、Erlangには用意されていた Erlangの公式ドキュメントにばっちしqueueについて記述されている Elixirで解決できない時はErlangのドキュメントを見るというのは本当ですね Elixirからのqueueの使い方 新規のqueue作成 2つの…

【実装コード有り】アルゴリズム初心者がセレクトソートとクイックソートをElixirで実装する

ソートの必要性について www.okb-shelf.work 前回の記事で実装した二分探索は対象のリストがソートされていることが前提であり、つまりはリストをソートしてくれるアルゴリズムが必要になるということ え?もうEnum.sort()あるけど?とは言わない約束 一度自…

【実装コード有り】アルゴリズム初心者がElixirで二分探索のコードを実装するまで

二分探索の生まれた背景 昇順ソート済みのリスト(配列)から特定の値のindex番号を取得したいとする #8のindex番号はいくつ?(7が知りたい) item = 8 lst = [1,2,3,4,5,6,7,8,9,10] これを単純に配列の頭から探索していくと index番号の0から初めて7番目、すな…