標準入力の内容を圧縮ファイルに保存したい。
$ cat foo.txt | gzip -c > foo.txt.gz
圧縮ファイルを展開したイメージを標準出力に出力したい。
$ gzip -dc foo.txt.gz
もっとよい方法があるかもしれない。勉強します。
標準入力の内容を圧縮ファイルに保存したい。
$ cat foo.txt | gzip -c > foo.txt.gz
圧縮ファイルを展開したイメージを標準出力に出力したい。
$ gzip -dc foo.txt.gz
もっとよい方法があるかもしれない。勉強します。
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.read('path/to/local/sample.txt'))
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 underscored atoms, so
--source-path
becomes:source_path
.
#!/bin/bash for f in $*; do if [ -f $f ]; then echo "file '$f' IS EXISTS" elif [ -d $f ]; then echo "'$f' IS DIRECTORY" else echo "'$f' IS NOT EXISTS" fi done
Elixir でコールバックってどうやって実装しているのだろうと調べてみたら、マクロで実現されていました。なるほど。 その昔 C 言語でマクロを使ってコードを生成していたのを思い出した。
そんなわけで。マクロを使って「どう書く」のテストを実行するモジュールを書いてみた。
Elixir のドキュメントにテストの説明があったので、だいたいそのまま。
結果判定をする通常の関数 judge
、use
されたときに実行される __using__
マクロ、個々のテストを定義する test
マクロ、コンパイル時に実行される __before_compile__
マクロからなっています。
__before_compile__
が実行されるようにするには、@before_compile
で指定する必要があるようです。
defmodule Doukaku.TestRunner do def judge(_, expected, expected) do IO.puts "\x1b[32mpassed\x1b[0m" end def judge(input, expected, actual) do IO.puts "\x1b[31mfailed input: #{input}, expected: #{expected}, actual: #{actual}\x1b[0m" end defmacro __using__(_) do quote do import Doukaku.TestRunner @tests [] @before_compile Doukaku.TestRunner end end defmacro test(input, expected) do quote do @tests [{unquote(input), unquote(expected)}|@tests] end end defmacro __before_compile__(_) do quote do def run do @tests |> Enum.reverse() |> Enum.each(fn {input, expected} -> judge(input, expected, solve(input)) end) end end end end
英字の小文字だったばあいに大文字に変換するとかそういうの。
テストを定義する部分は CapitarlTest
などに分離するのがきれいなのかもしれません。
defmodule Capitarl do use Doukaku.TestRunner def to_capital(c) do c - 32 end def solve(input) do input |> String.to_charlist |> Enum.map(&to_capital/1) |> List.to_string end test("a", "A") test("ab", "AB") test("Ab", "AB") end Capitarl.run
本当はパッケージにまとめておくのが正解の気がしますが、今回はファイル 2 つだけですまそうと。
テストランナをコンパイルします。
$ elixirc doukaku/test_runner.ex
どう書いたコードを実行します。
$ elixir capital.exs passed passed failed input: Ab, expected: AB, actual: !B
懐かしいとはちょっとちがう、どこかで聞いた気がする、という感じが集まった一冊。
一番にそれを感じたのが最後の防火水槽のくだり。
なお、「今日の早川さん」の第 4 集が控えているらしい。
早川書房の打ち合わせは早川さん4巻だよ。お待たせしすぎたのでもう言っちゃえ。
— coco@『里山奇談』発売中 (@coco_n) 2017年4月21日
「はてなダイアリー」が役目を終えつつあるということで重い腰を上げて移転作業をしています。
わたしのブログは「ダイアリー」に書いているにもかかわらず、にポストする記事は月一回ペースの事実上「マンスリー」になっていて、看板に偽りあり状態だったのでちょうどよい機会なのかもしれません。
実はブログ移転はこれで 2 度め。2007/05/18 にココログから移転しています。それからほぼ 10 年。
あたらしい記事を書く場所は 新ブログ に移転しますが 旧ブログ もしばらくそのままにしておこうと思います。
ディストピア小説フェアに乗っかってます。半年ぐらいずれてる気もしますが。
オフラインリアルタイムどう書くE14 の中で、@yancya さんが書かれたターゲットとなる矩形(配列の配列)を取り出すコードがスマートだったので、Prolog で書いてみました。
今回の問題の特徴から解くために向きは影響しないため、解答のコードでは transpose
は 1 回ですが、下記の例では向きを元に戻すため再度 transpose
しています。
rect = %w(12345 23456 34567 45678).map(&:chars).map {|row| row.map(&:to_i) } # => [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8]] rect.each_cons(3).map {|rows| rows.transpose.each_cons(3).map(&:transpose) }.flatten(1) # => [[[1, 2, 3], [2, 3, 4], [3, 4, 5]], # [[2, 3, 4], [3, 4, 5], [4, 5, 6]], # [[3, 4, 5], [4, 5, 6], [5, 6, 7]], # [[2, 3, 4], [3, 4, 5], [4, 5, 6]], # [[3, 4, 5], [4, 5, 6], [5, 6, 7]], # [[4, 5, 6], [5, 6, 7], [6, 7, 8]]]
extract(Offset, Length, List, Extract) :- append(Left, ExtractRight, List), append(Extract, _Right, ExtractRight), length(Left, Offset), length(Extract, Length). subrectangle(Width, Height, Rectangle, SubRectangle) :- extract(_, Height, Rectangle, Rows), maplist(extract(_, Width), Rows, SubRectangle).
subrectangle.prolog
という名前で保存して、gprolog
コマンドで GNU Prolog を起動します。
| ?- ['subrectangle.prolog']. | ?- findall(S, subrectangle(3, 3, [[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7],[4,5,6,7,8]], S), SS). SS = [[[1,2,3],[2,3,4],[3,4,5]],[[2,3,4],[3,4,5],[4,5,6]],[[3,4,5],[4,5,6],[5,6,7]],[[2,3,4],[3,4,5],[4,5,6]],[[3,4,5],[4,5,6],[5,6,7]],[[4,5,6],[5,6,7],[6,7,8]]]
例えば、3 x 3 のリストのリストの要素の合計を表す述語を用意しておくと、
sum3x3([[A11, A12, A13], [A21, A22, A23], [A31, A32, A33]], Sum) :- Sum is A11 + A12 + A13 + A21 + A22 + A23 + A31 + A32 + A33.
それを満たす組み合わせを得ることができます。
| ?- subrectangle(3, 3, [[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7],[4,5,6,7,8]], S), sum3x3(S, 45), !. S = [[3,4,5],[4,5,6],[5,6,7]]
次回はどう書くの問題を解くコードを Prolog で書きます。つづく。
始祖鳥・ロンドン標本が来ています(2017/06/11 まで)。
かはくは一度入ると3、4時間でてこられなくなるので危険です。