2016年8月22日月曜日

[C]オペークポインタ

「いくつかの言語でフィボナッチ数生成」を考える。ではハンドルに配列そのものを使っていたけど、CのAPIでハンドルを使う場合はオペークポインタにすることが多いよ。

「いくつかの言語でフィボナッチ数生成」を考える。の結果をオペークポインタを使ったものに変えてみよう。
まずは呼び出し側を見てみよう。

main.c
#include <stdio.h>
#include "fib.h"

int main(void) {
    hSequence fib = fibonacci_new();

    for (int i = 0; i < 10; i++) {
        printf("%d\n", fibonacci_next(fib));
    }

    fibonacci_delete(fib);

    return 0;
}

2016年8月15日月曜日

[Java]Mapのループ

JavaでMapをループする時に、なんとなしにkeySetを使ったりしていた。

MapIterate1.java
import java.util.HashMap;
import java.util.Map;

class MapIterate1 {
    public static void main(String ... args) {
        Map<String, String> map = new HashMap<>();
        map.put("banana", "yellow");
        map.put("apple", "red");
        map.put("orange", "orange");

        for (String key : map.keySet()) {
            System.out.println(key + ":" + map.get(key));
        }
    }
}

けれど、パフォーマスを考慮するとentrySetを使ってループしたほうがいいみたい。

2016年8月8日月曜日

[bash]キャリッジリターンの使いどころ

Unixの改行コードはLFでWindowsの改行コードはCRLFだ、なんていう話はよく出てくる。

CR(carriage return)というのは本来、現在位置を行の先頭に戻すだけで次の行には進まない。
LF(line feed)は逆に行中の位置は変えずに現在位置を次の行に進める。

じゃあ、CRのみを使うのはどういった場面があるだろうか。
例えば、コマンドラインで進捗状況を表示することを考えよう。

count.sh
#!/bin/sh

for i in $( seq 10 )
do
  # \rで行の先頭に戻ってから出力、改行はしない。
  printf "\r%2s/10" $i
  sleep 1
done
echo ''

2016年8月1日月曜日

[C]「いくつかの言語でフィボナッチ数生成」を考える。

[awk,Ruby,C#,Java]いくつかの言語でフィボナッチ数生成はいくつかの言語でフィボナッチ数を生成したけど、なんだか必要以上に複雑になってしまった。
こんなんじゃダメなんだろうか?

2016年7月25日月曜日

[awk,Ruby,C#,Java]いくつかの言語でフィボナッチ数生成

[SQL] SQLの共通表式ではSQLでフィボナッチ数を生成した。
[python] ジェネレータとイテレータでフィボナッチではMizu A.さんにPythonでフィボナッチ数を生成してもらった。
調子に乗って、いくつかの言語の特徴的な機能を使ってフィボナッチ数を生成してみよう。

[awk]
awkは入力データの加工に適しているから自分でループするのではなく、seqの結果を使ってしまおう。

2016年7月18日月曜日

[bash]Bashでステップ実行

シェルスクリプトでステップ実行できたら、と思ったことないですか。
僕はあるよ。

と思っていたら、ここで素晴らしい説明をしてくれていた。
Shellスクリプトをデバッグ(ステップ実行)する

DEBUG擬似シグナルをtrapして、readで待てばいいんだね。

2016年7月11日月曜日

[Java][C]JavaのvolatileとCのvolatile

Javaでvolatileを使う場面は限られてくるけど、マルチスレッドの処理でパフォーマンスが問題になってくるようなときに使う。
通常のロックでは処理が重くなってしまうような場合だね。

VolatileSample.java
import java.util.stream.IntStream;

class VolatileSample {

    static class Counter {
        private volatile int count = 0;

        int getCount() {
            return count;
        }

        synchronized int increment() {
            return count++;
        }
    }

    public static void main(String ... args) {
        Counter counter = new Counter();

        IntStream.rangeClosed(1, 100).parallel()
            .forEach(x -> counter.increment());

        System.out.println(counter.getCount());
    }
}