2018/10/30

読書:いかにして問題をとくか

118p 帰諺法と間接証明 4.不都合な点 まで

SECCON 2018 Online CTF

解いた問題のWriteupを書いた。SECCON 2018 Online CTF

.rebar/erlcinfoに由来するfile version is incompatible error

rebar2の実行後に.rebar/erlcinfoが生成されるが、このファイルにより再度rebar2実行時に .rebar/erlcinfo file version is incompatible. expected: 1 got: 2 errorが発生する場合がある。erlcinfoというバイナリが何に使われているかは不明だが、これを削除し再度実行すると動く。

Getting Started with Erlang

コードは https://github.com/unigiriunini/Getting-Started-with-Erlang に置いている。2.2 Modules and Functions から 2.6 Maps まで。

2.5 Lists

The Erlang shell is “clever” and guesses what list you mean and outputs it in what it thinks is the most appropriate form, for example:

30> [97,98,99].
"abc"

この挙動はいかがなものか。単純に数字のlistとして[97,98,99]を出力したい場合にこの想定外の挙動は困らないだろうか。

2.6 Maps

Maps are a set of key to value associations. These associations are encapsulated with “#{” and “}”. To create an association from “key” to value 42:

> #{ "key" => 42 }.
#{"key" => 42}

このmapの指定方法を見るのは初めてだ。

First a macro is_channel is defined to help with the guard tests. This is only here for convenience and to reduce syntax cluttering. For more information about macros, see The Preprocessor.

-define(is_channel(V), (is_float(V) andalso V >= 0.0 andalso V =< 1.0)).

マクロを使用可能。

new(R,G,B,A) when ?is_channel(R), ?is_channel(G),
                  ?is_channel(B), ?is_channel(A) ->
    #{red => R, green => G, blue => B, alpha => A}.

argumentsに条件を指定可能。

The value associated with key alpha is fetched for both arguments using the := operator. The other keys in the map are ignored, only the key alpha is required and checked for.

new(R,G,B,A) when ?is_channel(R), ?is_channel(G), ?is_channel(B), ?is_channel(A) ->
    #{red => R, green => G, blue => B, alpha => A}.

alpha(#{alpha := SA}, #{alpha := DA}) ->
    SA + DA*(1.0 - SA).

無視したいkeyまで列挙する必要がないため便利そうだ。ただ、代入の際にも:=を使うためalpha = valueの意味かと勘違いした。