[JavaScript][PHP] Setのないプログラミング言語でハッシユをSetとして使う

Setがない。

PHPやJavaScriptではデータ構造として、Set(集合)がない。
少なくとも、PythonのようなSetは存在しない。
※ちなみにSPLでもSetはないみたい。

[unix] 複数キーでjoinしたい

unixでRDBのテーブル結合のように複数のファイルを共通のフィールドで結合する場合はjoinコマンドを使う。

簡単な例

$ cat items
1001 2017-10-08 バナナ 100
1001 2017-10-09 バナナ 90
1002 2017-10-08 りんご 150
1002 2017-10-09 りんご 200
1003 2017-10-08 みかん 80
$ cat shops
1001 2017-10-08 蒲田
1001 2017-10-09 蒲田
1002 2017-10-08 横浜
1002 2017-10-09 横浜
1003 2017-10-08 品川
$ join -11 -21 items shops
1001 2017-10-08 バナナ 100 2017-10-08 蒲田
1001 2017-10-08 バナナ 100 2017-10-09 蒲田
1001 2017-10-09 バナナ 90 2017-10-08 蒲田
1001 2017-10-09 バナナ 90 2017-10-09 蒲田
1002 2017-10-08 りんご 150 2017-10-08 横浜
1002 2017-10-08 りんご 150 2017-10-09 横浜
1002 2017-10-09 りんご 200 2017-10-08 横浜
1002 2017-10-09 りんご 200 2017-10-09 横浜
1003 2017-10-08 みかん 80 2017-10-08 品川

[C] ヘッダファイルで、関数マクロではなくstatic inline関数を使う

Cでの関数名の競合

Cでは小さなユーティリティ関数を関数マクロで実現する場合も多いけど、関数マクロだとコンパイラによる型チェック等の恩恵を受けられなくなってしまう。
※わざと、型に関係なく汎用的な処理をさせたいために関数マクロを使うことも多いと思うけど。

また、Cの場合は名前空間がないために、関数名の競合を避けるために外部に見える関数は関数名にプリフィックスをつけて区別するようにすることも多い。
こうすると、ちょっとしたユーティリティ関数を呼ぶためにプログラム中に長い関数名が登場することになってしまう。

[bash] Linuxでリダイレクトがよくわからなくなったときの確認

標準出力と標準エラー出力のリダイレクト

Linuxで標準出力や標準エラー出力をファイルに保存するのにリダイレクトさせたり、ファイル保存しつつ、端末表示するときにteeコマンドを使ったりするのは日常的にあるだろう。
でも、bashで複雑なリダイレクトをしていると、どのように動作しているのかよくわからなくなってくるときがある。
こんなときは /proc/self/fd を表示させて、確認しよう。

例えば、標準出力と標準エラー出力をそれぞれ、別のファイル(out.log, err.log)に出力しつつ、端末表示させたい場合は次のような書き方ができる。
$ { { somecommand | tee out.log 1>&3; } 2>&1 | tee err.log; } 3>&1

[Java] ジェネリックメソッドの戻り値でワイルドカードを使うと

Collections.addAllとArrays.asList

ジェネリックメソッドで可変長引数を使うと警告が出るでSetにデータを詰めるのに Collections.addAll を使ったんだけど、この手のもので、変数宣言と同時に使われる記法としては Arrays.asList を使うアイデアがある。
    private static final Set<String> fruits = new HashSet<>(Arrays.asList("1", "2", "3"));

Collections.addAllとArrays.asListのインターフェースは以下のようになっている。

public static <T> boolean addAll(Collection<? super T> c, T... elements)
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Collections.html#addAll-java.util.Collection-T...-

public static <T> List<T> asList(T... a)
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Arrays.html#asList-T...-

[Java] ジェネリックメソッドで可変長引数を使うと警告が出る

ヒープ汚染

Javaで定数のSetを作ろうとして、以下のようにしたら、コンパイル時に警告が出てしまった。
    private static final Set<String> fruits = readOnlySet("apple", "banana", "orange");

    private static <T> Set<T> readOnlySet(T ... a) {
        Set<T> set = new HashSet<>(a.length);
        Collections.addAll(set, a);
        return Collections.unmodifiableSet(set);
    }
警告: [unchecked] パラメータ化された可変引数型Tからのヒープ汚染の可能性があります
    private static  Set readOnlySet(T ... a) {
                                                ^
  Tが型変数の場合:
    メソッド readOnlySet(T...)で宣言されているTはObjectを拡張します

[シェルスクリプト] [ -a ][ -o ]が POSIX では Obsolescent になっていた?

[ -a ]

シェルスクリプトで変数の値が0と100の間にあるかどうか、確認するときはこんなふうに書いたりする。

$ i=100
$ if [ $i -ge 0 -a $i -le 100 ] ;then echo "$i"; fi
100

testコマンドの条件の間に -a を入れることによって前後の条件式を and で結んでいる。

ところが。だ。