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

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

めも

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…

備忘録:ファイルの存在確認

#!/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で書いたときのテストを簡単にする

Elixir でコールバックってどうやって実装しているのだろうと調べてみたら、マクロで実現されていました。なるほど。 その昔 C 言語でマクロを使ってコードを生成していたのを思い出した。 そんなわけで。マクロを使って「どう書く」のテストを実行するモジ…

矩形の中の矩形

オフラインリアルタイムどう書くE14 の中で、@yancya さんが書かれたターゲットとなる矩形(配列の配列)を取り出すコードがスマートだったので、Prolog で書いてみました。 https://gist.github.com/yancya/cfdafda3a7c80866f25e17887e0c8ca1#file-main-rb-…

Redis Pub/Sub in Elixir 覚書

Exredis を使っています。 GitHub - artemeff/exredis: Redis client for Elixir defmodule Subscribe do def sub(channel) do {:ok ,client_sub} = Exredis.Sub.start_link pid = Kernel.self Exredis.Sub.subscribe(client_sub, channel, fn msg -> send(p…

RPN in Elixir

# Rpn.eval "3 1 - 2.1 +" # => 4.1 defmodule Rpn do def eval(expression) do eval(tokenize(expression), []) end defp eval([], [result]), do: result defp eval(["+"|tokens], [rhs, lhs|stack]), do: eval(tokens, [lhs + rhs | stack]) defp eval(["…

span

練習。 % span.pro :- module(span, [span/2]). span(From, From, [From]) :- !. span(From, To, [From|Span]) :- From < To, From1 is From + 1, span(From1, To, Span), !. % span-test.pro :- include(span). main :- span(1, 10, S), format("~p~n", [S]…

Prolog で特殊文字をリテラルに書く

\x で始まり \ で終えます。末尾があることに注意。例:バックスペース(0x08)を出力しています。 $ gprolog | ?- format("~s\x08\~s~n", ["ABc", "CDE"]). ABCDE

Prolog だって Key-Value を扱いたい

不思議な記述を見つけました。 An object in JSON is presented as a bunch of keys and values within curly braces, in Prolog I have used a function and a KV list like so: obj([key1-value1, key2-value2, ...]). Present your terms like that and e…

Retriable gem の使い方のめも

GitHub - kamui/retriable: Retriable is an simple DSL to retry failed code blocks with randomized exponential backoff. インストール $ gem install retriable 実装例 require 'retriable' class SampleError < RuntimeError end puts <<~EOS | except…

抵抗器のカラーコードは虹の色

会社で「抵抗器のカラーコードは虹の順番だよ」という話をしたら。 「いや、そもそも虹の色の順番覚えてないから」と返されてしまいました。 そんなわけなので、Ruby の gem にしてみました。 gem は書き慣れていないので、雑です。 GitHub - mattsan/color_…

Ruby/RSVG と Cairo を使って SVG から PDF を生成しためも

前回 は C++ で書いたのですが、調べたら Ruby でも同じように書くことができることがわかりました。今回は libRSVG を Ruby から利用する Ruby/RSVG (rsvg2 gem) を利用。 ruby-gnome2/rsvg2 at master · ruby-gnome2/ruby-gnome2 · GitHub require 'rsvg2'…

Ruby で Haml を HTML にコンパイルする

使うべきは Haml::Engine#to_haml でした。 $ pry [1] pry(main)> require 'haml' => true [2] pry(main)> Haml::Engine.new('.hoge HOGE').to_html => "<div class='hoge'>HOGE</div>\n"

libRSVG と Cairo を使って SVG から PDF を生成しためも

それぞれのサイト。 Projects/LibRsvg - GNOME Wiki! cairographics.org 今回参照したドキュメント。 Cairo: A Vector Graphics Library: cairo_t Cairo: A Vector Graphics Library: PDF Surfaces RsvgHandle: RSVG Libary Reference Manual Error Reportin…

SVG から PDF

PDF を生成する prawn と、Prawn で SVG を解釈する prawn-svg を使って、haml で書いた SVG を PDF にした時のメモ。prawn-svg の利用例として書かれているコード を haml で書き直したものです。 require 'prawn-svg' require 'haml' Prawn::Document.gene…

QRコードを生成したときのめも

QRencode で QR コードを生成し、Magick++(ImageMagick の C++ API)で画像ファイルに保存してみた、ときのめも。 QRencode: Main Page Magick++, C++ API @ ImageMagick この二つのライブラリは、Mac の場合、 Homebrew でインストールできます。 ソースコ…

かっこで括られたトークンを取り出す

これ とか これ の入力になっている (A)(BC)(DEF)のような文字列から括弧の中にある文字列を取り出したい、というのが動機。 まわせ! Bouwkamp!! 横へな2016.2.6 問題 ESM オフラインリアルタイムどう書く 拡大版 · GitHub Ruby def tokenize(s, left, right…

diff を清書する、加えて gem にする

気がつけば。diff を実装してから7年も経っていました。 diffをつくる(3) -後編 - エンジニアのソフトウェア的愛情 案の定、考え方がかなり頭から抜けて行ってしまっているのですが、当時 diff について詳しい記事を書かれていた方がいらっしゃって、加えて…

Config

GitHub - railsconfig/config: Easiest way to add multi-environment yaml settings to Rails, Sinatra, Pandrino and other Ruby projects. Gemfile gem 'config' install $ be rails g config:install create config/initializers/config.rb create confi…

SettingsLogic

GitHub - binarylogic/settingslogic: A simple and straightforward settings solution that uses an ERB enabled YAML file and a singleton design pattern. Gemfile に追加する。 gem 'settingslogic' config/initializers/settings.rb ファイルを追加す…