[Linux] FUSEでデータ生成

データ生成

[Linux] FUSEを使ってみようではFUSEを使って、ファイルシステムとしてマウントする例を見たけど、今度はFUSEを使ってデータを生成するファイルを作ってみよう。

開発用のヘッダファイルとかが必要になるので、https://github.com/libfuseからライブラリを入手するか、fuse-developパッケージをインストールしよう。
今回はfuse 2.9.3を使用した。

[Linux] FUSEを使ってみよう

fusermount

Linuxでユーザ側のアプリケーションレイヤーでファイルシステムを実現する仕組みとして、FUSE(Filesystem in Userspace)がある。
これを使うと、いろんなものをファイルシステムとして扱うことができる。

https://github.com/libfuse

まず必要なのはfusermountなので、ディストリビューションでパッケージとして用意されている場合は、パッケージでインストールしてしまおう。
fusermountコマンドは単独で使うというより、後述のコマンドでマウントしたファイルシステムをアンマウントするときに使う。

$ fusermount -u /path/to/mounted

[Java] スレッド開始前後の共有変数

[Java][C]JavaのvolatileとCのvolatileでJavaのvolatileについて書いた。

けど、以下のようなコードでエンクロージングクラスからキャプチャされたローカル変数が起動された側のスレッドから見えることや、起動されたスレッドが設定した変数がスレッド終了を待機した側のスレッドから見えることが保証されているのか、実はあまりよくわかっていなかった。
        Counter counter = new Counter();
        
        IntStream.rangeClosed(1, 100).parallel()
            .forEach(x -> counter.increment());
            
        System.out.println(counter.getCount());

[C] 対話型コマンドでユーザ入力サポート

bashやsqlite3のような対話形式のコマンドでは上下の矢印キーでコマンドの履歴をたどれたり、tabキーでファイル名を補完できたりする。
自分で作った対話型コマンドでも、こんな機能が使えたらいいよね。

readline

こんな時は GNU readline を使うことが多いかもしれない。

https://cnswww.cns.cwru.edu/php/chet/readline/rltop.html

でも、GNU readlineはライセンスがLGPLではなく、GPLなので、ライブラリとしてリンクしてしまうと使用しているアプリケーション側もGPLにしないと、配布できなくなってしまう。

[sqlite] SQLiteでの日付型の扱い その2

前回はSQLiteでの日付の表し方だったけど、今度は日付を用いた計算をしてみよう。

日付の足し引き

1年以上前のデータを削除するような場面では現在から1年前の日付が必要になる。
sqlite> select date('now', 'localtime');
2017-07-09
sqlite> select date('now', 'localtime', '-1 year');
2016-07-09

オプション引数は何個でもつけることができるので、3ヶ月先の月の末日を求めたい場合は以下のようになる。

[sqlite] SQLiteでの日付型の扱い その1

日付型がない

SQLiteは型として日付(Date)型を持っていない。
なので、どうするかというと以下の3つのパターンがある。
  • ISO-8601形式 : TEXT
    ISO-8601の文字列形式で日時を保持する。
  • ユリウス通日 : REAL
    紀元前4713年1月1日の正午からの日数を実数型で保持する。整数部分が日数で小数部分が時刻を表す。
  • Unix時間 : INTEGER
    19070年1月1日真夜中(午前0時0分0秒)からの秒数を整数型で保持する。

[SQLite] SQLiteで実行計画を見てみよう その3

explain

[SQLite] SQLiteで実行計画を見てみよう その2ではテーブル結合の実行計画を取得して、nested loopの様子を見たけど、SQLiteではさらに詳細に内部の実行手順を見ることができる。

今度はexplain query planではなく、explainを使う。

The SQLite Bytecode Engine

[SQLite] SQLiteで実行計画を見てみよう その2で実行したSQLにexplainをつけて、見てみよう。