エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

めも

Phoenix.LiveView 事始め(subscribeとbroadcast)

前回の続きです。 前回、「バージョン 0.1 が公開され…」と書いたばかりなのに、今回の記事を書くまでの十日足らずの間にバージョン 0.2 が公開されてしまいました。 それはそれとして。 今回は Phoenix.LiveView の app で subscribe と broadcast を使って…

Phoenix.LiveView 事始め

先月末にバージョン 0.1 が公開され、Hex からインストールできるようになりました。 これを機に Phoenix.LiveView に挑戦です。 Phoenix.LiveView この記事では、app 作成から LiveView で表示を動かすまでの作業を、ただ淡々と書いてゆきます。 準備 適当…

Elixir でビット列を展開する覚書

例えば右のように 11001010(2) = CA(16) を 1111000011001100(2) = F0CC(16) に Elixir で展開するための覚書です。 Elixir の内包表記は for Elixir にも内包表記があります。他の関数型言語とくらべて内包表記っぽくない表記と感じましたが、意味するとろ…

Timex.format のフォーマットの書式覚書

Elixir で日時を便利に操作する定番のパッケージ timex 。 timex | Hex そこで定義されている Timex.format/2 をいつも忘れてしまいます。 ~N[2019-08-09 01:02:03.456789] |> Timex.to_datetime("Asia/Tokyo") |> Timex.format("{YYYY}/{0M}/{0D} {h24}:{m}…

ローマ数字を Elixir でパースする

Erlang/Elixir はバイナリのパースが得意ということで。 ローマ数字で書かれた数をパースする関数を書いてみました。 defmodule RomanNumerals do @moduledoc """ Documentation for RomanNumerals. """ def parse(roman) when is_binary(roman), do: parse(…

Elixirのプロセスの起動順について

Elixir で GenServer, Supervisor, mix deps.get で取得したパッケージの Application の起動順について調べたのでそのまとめ。 GenServer GenServer.start_link/3 のドキュメントに次のように記述されています。 To ensure a synchronized start-up procedu…

Elm で mouse のイベントを取得する覚書

Elm のイベント用の関数は onClick など主だったものはライブラリで用意されていますが、それ以外のイベントは on 関数を利用して自分で合成する必要があります。 on - Html.Events - html 1.0.0 以下、合成方法の覚書です。 mousemove イベントをハンドリン…

外部で生成したデータをActive Storageでattachしたいとき

つまりこうゆうことです。 探した範囲でははっきりとした情報が見つからなかったので、めも。 このようなモデルがあるばあい、 class Article < ApplicationRecord has_one_attached :image end たとえばこのようにすることで storage にデータを格納できま…

Elm の JSON のパースの覚え書き

Elm に手を出しました。 mousemove のイベントハンドラを使うのに MouseEvent の JSON をパースする必要があって四苦八苦したので、明日の自分のために JSON のパースの仕方をメモっておきます。 後日イベントハンドラについても書く予定。 パーサを書く Som…

Ectoを使ってデータベースを操作する (v2.2)

最初に。 昨年 2018 年 6 月に Ecto の使い方について書いていたのですが、書きかけのまま放置しているうちにメジャーバージョンが上がってしまい、最新の 3.0 ではここに書いてある内容が当てはまらなくなるという事態になりました。なにより sqlite_ecto2 …

gen_event でイベントを通知する/イベントをハンドリングする

Logger の backend を書いたときに利用した gen_event について調べたので、その覚書。 Elixir の Logger の custom backend を書く gen_event とは Erlang が標準で提供しているモジュールです。 イベントをハンドリングする仕組みを提供してくれます。 Erl…

組合わせ論の順列

もうちょっと簡単に書けるんじゃないかという気がするのですが、とりあえず忘れないうちに。 defmodule Combinatorics do def permutation(list), do: permutation(list, Enum.count(list)) def permutation(_, 0), do: [[]] def permutation(list, n) do li…

Elixir の Plug の使い方の覚書

Elixir の Plug を使って HTTP サーバのモックを作る覚書です。 ドキュメントに詳しく書かれていますので、詳しい話はこちらを参照してください。 Plug – Plug v1.6.2 プロジェクトを用意する 新しいプロジェクトを作ります。 起動時に自動で Plug のアプリ…

互いに依存しない同じ処理を複数実行するには Task.Supervisor.async_stream が便利だという覚書

複数のデータに対して、同じ処理を適用する場合、Task.Supervisor.async_stream を利用すると、個々の処理を並列で実行してくれます。CPU を存分に酷使してくれます。 Task.Supervisor.async_stream/4 Task.Supervisor.async_stream/6 defmodule Sample do r…

Queue in Elixir

Q Elixir でキューを利用したいときは? A Erlang に queue モジュールが用意されているので、それが使えます。 1..10 |> Enum.reduce( :queue.new(), # 初期値として空のキューを用意 fn i, q -> :queue.in(i, q) end) # キューに値を追加する |> Stream.un…

Elixir で each_cons を書く

Elixir でコードを書いていて、Ruby の Enumerable#each_cons に相当する関数が欲しかったのですが、ライブラリに見当たらなかったので自前で書いて見ました。 結論として、Elixir の Stream モジュールに展開関数 Stream.unfold/2 が用意されていたので、そ…

grep --line-buffered

出力中のログを grep するときは --line-buffered オプションを使う。 $ tail -f foo.log | grep --line-buffered error man コマンドによる説明: $ man grep --line-buffered Force output to be line buffered. By default, output is line buffered when…

Hound を使った Phoenix app の integration test

For browser automation and writing integration tests in Elixir. hound | Hex ドキュメント GitHub Hound を使って Phoenix app の integration test を書きました。 ここで書いたコードは GitHub に push してあります。 mattsan/phoenix_integration_te…

Mix で管理する Elixir プロジェクトでコンパイル対象のパスを追加する

Phoenix のプロジェクトの mix.exs を見れば一目瞭然なのですが、project/0 が返すキーワードリストに、:elixirc_paths をキーにコンパイル対象のパスのリストを値にして追加すると、それらのパスがコンパイル対象になります。 # mix.exs def project do [ a…

Phoenix で Bootstrap の JavaScript を使う

最近、個人的には Elixir ばかり書いています。特に現在は Ruby on Rails Tutorial を Phoenix でなぞるということをやっています。 とはいえ。やはり勝手が違うので思わぬところでつまずいたり。 例えば Phoenixframework では標準で Bootstrap のスタイル…

Mock パッケージを使った Elixir のテスト

Mock を使ったテストを覚えたので、そのメモです。 全容は GitHub に置いてあります。 https://github.com/mattsan/test_with_mocks_ex リポジトリ名は test_with_mocks_ex ですが、中の Elixir のプロジェクト名 は fizz_buzz になってます。気をつけて。 …

Elixir で Gettext を使う

由緒正し I18n の仕組みということを、 Phoenix を触るようになって初めて知りました。 gettext - Wikipedia Phoenix ではプロジェクトを作成すると自動的にパッケージが追加されますが、通常の Elixir プロジェクトで利用する手順を調べました。 くわしくは…

整数値でも浮動小数点数値でもパースしたい

Elixir で文字列から数値に変換するときに String.to_integer/1 や String.to_float/1 を使いますが、前者は浮動小数点数値の文字列を与えると、後者は整数値の文字列を与えると例外を投げてしまいます。 iex(1)> String.to_integer("123") 123 iex(2)> Stri…

Duck Typing 〜 Elixirの多態

# 鶩 defmodule Duck do defstruct name: nil end # 犬 defmodule Dog do defstruct name: nil end # 猫 defmodule Cat do defstruct name: nil end # 鳴くプロトタイプ defprotocol Sound do def sound(_) end # 鶩が鳴く実装 defimpl Sound, for: Duck do …

複数のテキストファイルの内容を横に並べて出力する

複数のテキストファイルの各行を横に並べて表示したいとき、たとえば次のような abc.txt と 123.txt というファイルがあったとき、 abc.txt: A B C 123.txt 1 2 3 次のようにファイルディスクリプタを指定してリダイレクトすると同時に読み込めるので、あと…

前日の日付を取得する

#!/bin/bash # 時刻を引数で指定されなかった場合に、現在時刻から前日の日付と今日の日付を取得する # # 日付を取得するのであれば `date` コマンドを使うのがよいのだけれど、 # オプションに差があるので使い慣れた Ruby に逃げた。 # # | 系統 | コマン…

C++で整数値を返したり文字列を返したりする

#include <string> #include <iostream> template<int N, bool is_string> struct this_is_a_int_or_string; template<int N> struct this_is_a_int_or_string<N, false> { typedef int value_type; static const value_type value = N; }; template<int N> struct this_is_a_int_or_string<N, true> { typedef std::string…</n,></int></n,></int></int></iostream></string>

gzip と標準入出力

標準入力の内容を圧縮ファイルに保存したい。 $ cat foo.txt | gzip -c > foo.txt.gz 圧縮ファイルを展開したイメージを標準出力に出力したい。 $ gzip -dc foo.txt.gz もっとよい方法があるかもしれない。勉強します。

備忘録:aws-sdk gem を使って AWS S3 にファイルをアップロードする

require 'aws-sdk' client = Aws::S3::Client.new( access_key_id: 'your-aws-access-key-id', secret_access_key: 'your-aws-secret-access-key', region: 'your-region') client.put_object( bucket: 'target-backet-name', key: 'sample.txt', body: File…

Elixir の OptionParser.parse はハイフンをアンダスコアに置き換える

OptionParser.parse(["--show-all"], [switches: [show_all: :boolean]]) # => {[show_all: true], [], []} OptionParser.parse(["--show_all"], [switches: [show_all: :boolean]]) # => {[], [], [{"--show_all", nil}]} Elixir converts switches to unde…