やわらかテック

興味のあること。業務を通して得られた発見。個人的に試してみたことをアウトプットしています🍵

Elixir

Elixirでシンプルなロードバランサーを実装してみた

先日、Twitterを見ていると面白そうな記事が紹介されていました。 少し古い記事ですが、シンプルなロードバランサーをRustで実装してみたとのこと。凄いですね...。 qiita.com ロードバランサーと聞くと何やら難しそうなイメージがありますが、記事内で実装…

日本(Asia/Tokyo)の今日の日付をelixirで取得する

何回も書く機会があるので、まとめておこうと思います。 何も外部ライブラリをインストールしていない状態ではEtc/UTC以外のタイムゾーンを使用することができません。自分のようにAsia/Tokyoを使いたい人はTzdataやTimexといった外部ライブラリをインストー…

卒論の時に作ったアプリケーションのアーキテクチャを考え直してみた

僕は卒論でVB.netを使って「センサーで計測したひずみ値を描画・記録するアプリケーションの作成」を行いました。学部では土木・建築を専攻しましたが、先生が「プログラミングを極めたい」という僕の気持ちを汲んでくれたことを今でも感謝しています。目的…

「RubyでつくるRuby」を読んだら簡単なRubyインタプリタが作れた

「RubyでつくるRuby ゼロから学ぶなおすプログラミング言語入門」を読了しました。 非常にチャレンジングな本で、なんとRuby初心者の方に向けてRubyを動かすプログラム、つまりRubyインタプリタを作ってみようという本です。「え、そんなのプログラミング初…

【Elixirで実装】関数型言語でカプセル化をする方法

この記事の概要 関数型言語の多くでは値は束縛されるため、不変である 値を再束縛(≒再代入)することが出来ないため、値を更新する際には新たなデータを作る必要がある 更新の度に新たなデータを作ることで、関数型言語でもカプセル化をすることが可能になる …

数学全然わからないけどElixirでEitherを作ってみる

概要 Haskellではエラーが発生した際に対応するためにEitherというモナドを使う EitherはLeft(エラー時)とRight(正常時)の2つの値を持ち、それぞれ別の型の値を受け取ることが可能(Either = Left a | Right b) LeftにはStringがよく用いられ、エラーメッセー…

数学全然わからないけどElixirでMonadを作ってみる

前回までのあらすじ 「入門Haskellプログラミング」を読み進めながら、理解を深めるためにElixirを使ってHaskellのFunctorとApplicativeを再現してみました。 www.okb-shelf.work www.okb-shelf.work Functorは上手く再現出来ましたが、Applicativeはデフォ…

数学全然わからないけどElixirでApplicativeを作ってみる

前回のあらすじ www.okb-shelf.work 「入門Haskellプログラミング」という書籍を読み続けながら、理解を深めるために自分でFunctorを実装してみました。今回は、Functorに引き続き、Applicativeに挑戦してみます。 先に結論ですが、ElixirでApplicativeを作…

ElixirのEnumモジュールがどのように作られているのか調べてみた

こちらは僕が主催している清流elixir - connpassで扱った内容の備忘録になります。 現在は1ヶ月に一度を目処にオンラインで活動をしています。 今回は愛用してやまないElixirのパワフルなEnumモジュールについて、果たしてどのように作られているのか、すな…

【コピペでOK】はてなブログでソースコードをエディタ風に表示するCSS

デフォルトのデザインが何ともいえない...🤔 こちらがはてなブログにソースコードを<pre>タグで表示した時に表示されるデフォルトのソースコードです。 自分はMarkdown記法を使用していまして、バッククオート3つで囲うことでソースコードを記述しています。 良くも</pre>…

数学全然わからないけどElixirでFunctorを作ってみる

きっかけ 最近、「入門Haskellプログラミング」という書籍を読み進めています。 入門Haskellプログラミング作者:Will Kurt翔泳社Amazon 毎日1章ずつと非常にスローペースではありますが、第27章のFunctorまで辿り着きました。このFunctorというものが非常に…

【感想・まとめ】「関数型プログラミングなんもわからん。を考えよう」に参加してきました。

「関数型プログラミングなんもわからん。を考えよう」とは connpass.com ABAB↑↓BA (@ababupdownba) | Twitterさんが主催された関数型プログラミングの疑問や質問について、ひたすら有識者の方々が丁寧に回答をしてくれる・ディスカッションする会です。わか…

動的型付け言語(Ruby)でも関数の戻り値の型は可能な限り統一した方が良い

出会いは突然に いつものように眠い目を擦りながらコードレビューをしていると以下のようなコードに遭遇しました。 (※部分的に書き換えてあるので、実際には動作していないコードです) def fetch_companies(setting_id) setting = Setting.find_by(id: setti…

ターミナルのパイプの中にElixirの処理を挟む方法を思いついた

きっかけは突然に 弊社のインフラエンジニアの方がデプロイ作業の中でこんなようなperlの処理系をコマンドの中にパイプで渡しているのを発見しました👀 ls | tail -1 | perl -ne 'if (/release command failed/){print 1}else{print 0}' 処理の内容はともかく…

【Elixir】無名関数で気軽に再帰的にメッセージの送受信を実装する

Elixirでの並行処理 Elixirでは並行処理を行うためにアクターモデルに従ってプロセス間同士でメッセージを送受(メッセージパッシング)し合います。 アクターモデルとは並行処理を効率よく実装するための手法の一つです。Elixirにおいては、アクター(軽量プロ…

JavaScriptでのスマートな再帰関数の書き方【ECMAscript2015以降対応】

仕事でJavaScriptを書くことが多くなりました。以前より学んできた多くの関数型言語で一般的に使用されている再帰関数をJavaScriptでもスマートに書けないものかなと模索してみました。 「普通にforや、mapを使えば良いのでは?」という問いかけに対する答え…

クリスマスプレゼントの交換会にElixirで備える

今年で24歳になりましたが、いつになってもクリスマスってのはワクワクしますね。山下達郎さんのクリスマスイブを耳にすると「もう12月かぁ〜」と胸が苦しくなります。 そんなこんなで友人とクリスマスプレゼントの交換会をすることになりました(唐突)。 誰…

Elixirでモジュール内の関数を動的に呼び出す

パイセンの実装に感動 僕が感動したのはElixirでの実装ではありませんが、Rubyで特定のディレクトリ以下に_____.rbというファイルを作成し、命名規則に従ったモジュールとinterfaceを満たす関数を実装すると、自動でモジュール内の関数が読み込まれて動的に…

Oauthを簡単なプロセス通信でそれっぽく再現して覚える

ワイ認証が全然分かっていない 認証部分は自分が実装する前にパイセンエンジニアが既におおむね、下地を作った状態で、「これ使ってね〜」状態になっている事が多く、初期の開発に参加出来なかったりする。過去に趣味開発でOauthなりを使用したことはあるが…

ElixirでListMonadを作ってみる

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

【作って学ぶフロントエンド】ReactのuseStateの仕組みについて

Hooksについて Reactのバージョン16.8に導入されたHooksという機能によって、class componentを使用せずとも、functional component(以降: FCと記述)にstateを用意することが可能になりました。 FCにstateを用意するのは非常に簡単で以下の構文を記述するの…

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

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

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

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

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

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

【Elixir/supervisor入門】通常のモジュールに対してsupervisorを定義する

なぜ書いたのか Elixirにおいてプロセスの死活管理に用いるsupervisorについて学習を進めていたが、どれもGenServer、すなわちElixirのbehaviorを用いたサンプルばかりだった。また、そのプロジェクトはmix new --sup project_nameとして生成されるもので、…

【goroutineによる並行処理】サンプルを作りながら学ぶgoroutine入門

golangを学ぶ上での壁goroutine golangを業務で使い始めてから約半年になりました。業務ではgolangを使ってWebsocketを使ったチャットサーバーを作っています。golangの文法は非常にシンプルで分かりやすくシンプルなので、可読性が非常に良いです。普通にgo…

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

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

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

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

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

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

【第17回清流elixir勉強会】Elixirを用いた並行和アルゴリズムの実装

トピック あけましておめでとうございます。1月2月は色々と忙しくて、全く清流elixirにて勉強会を開催できず... 2ヶ月ぶりの開催となりましたが常連の方、新規の方、リモートでの接続、多くの方に参加して頂けました。ありがとうございました。ハッピーター…