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

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

2018-01-01から1年間の記事一覧

Markdown から EPUB を作る

Markdown から EPUB を生成する方法の備忘録です。 Markdown から EPUB に変換するなら、md2review + Re:VIEW という強力な組み合わせがあります。 Re:VIEW - Digital Publishing System for Books and eBooks takahashim/md2review: a converter from Markd…

偽クフ語解読器をPrologで書く。

偽クフ語とはなにか。 「白と黒のとびら」第11章をご参照ください。 本当はコード上も●と○の列で表現したかったのですが、あつかいがめんどうだったので●を 1 に○を 0 に置き換えてコードしています。 処理系はいつものように GNU-Prolog です 解読器 % 偽ク…

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の構造体をJSON形式でシリアライズしたりデシリアライズしたりする

Programming Elixir でも紹介されている JSON を扱うパッケージ poison を利用して、構造体を文字列にシリアライズしたり、文字列からでシリアライズしたりします。 poison | Hex プロジェクトを用意する mix new でプロジェクトを作成します。 $ mix new bo…

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 が用意されていたので、そ…

Elixir の Logger の custom backend を書く

Elixir にはログ出力の機能を提供する Logger モジュールがあります。が、標準ではログはコンソールに出力されます。 これをファイルに出力する方法を調べたのでまとめておきます。 Logger モジュールのドキュメントはこちら。 Logger ここで書いたコードは …

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…

FizzBuzz in Elixir

Elixir で簡単に FizzBuzz を実現するパッケージができてしまったのでブログに書いています。 mattsan/word_game: FizzBuzz in Elixir mix new コマンドでプロジェクトを作成したら、mix.exs を編集してパッケージを追加します。 def deps do [ {:word_game,…

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…

標準入力、標準出力、標準エラーをコードでリダイレクトする

C++

cstdio と iostream が混ざっているのが少々座りが悪いのですが。iostream からファイルディスクリプタを取得できればよいのですが仕様上は仕組みが用意されていないようなので、cstdio を利用しています。 #ifndef REDIRECT_H__ #define REDIRECT_H__ #incl…

式を式のまま受け取り左辺と右辺を別々に評価する

Elixir のテストの assert は引数が一つで、一つの式を与えるのですが、左辺と右辺のそれぞれの値を把握しています。 例えば。 適当なプロジェクトを作り、 $ mix new foo $ cd foo テストをこんな風に書いて、 # test/foo_test.exs defmodule FooTest do us…