2017/05/19


今日、LAN ケーブルを抜いた直後に msys2 の cat コマンドを実行したらハングする事に気付いた。

これはまずい。なんかに感染してる。cat コマンドと言いながらどこかインターネットにアクセスしてるんや!

と思って色々調べた。が実は cat コマンド君悪くなかった。すいませんすいません。

一部の記事では /cygdrive/ のアクセスがあるから hosts に cygdrive を足せば良いといった物もあったが、デマっぽかった。以下、調査した最終結果を書いていく。Cygwin や msys2 のコマンドは所有者や権限情報を取得する為に LDAP 経由でアクティブディレクトリに問い合わせを行う。例えば cat foo.txt と実行した場合であってもファイルの権限を UNIX エミュレーションする為に必要となる。で、このアクティブディレクトリへの問い合わせが LAN が抜けてるとタイムアウト待ちになって遅い。とにかく遅い。

解決策はここに書いてあった。

windows - Startup is really slow for all cygwin applications - Stack Overflow

Eventually I found what causes this issue, but I'm still not sure why. Cygwin works for other people...

http://stackoverflow.com/questions/28410852/startup-is-really-slow-for-all-cygwin-applications

以下はその PC が自分専用である事が前提となる。なぜかというと Cygwin や msys2 上で /etc/passwd/etc/group を生成して SID をローカルにキャッシュさせるため。なので PC に新しいユーザが追加され、その人が作ったファイルをローカルに持ってきた際に本来ならばこれらのファイルを再生成する必要がある。そういった問題点を理解した上で以下を読んで頂きたい。

まず mintty 等のターミナルを開き、以下を実行する。

$ mkpasswd -c -l > /etc/passwd
$ mkgroup -c -l > /etc/group

これにより SID に対する名前やグループ情報が書きだされる。次にネットワークの問い合わせ方法を変更する為に /etc/nsswitch.conf を修正する。

変更前

# Begin /etc/nsswitch.conf

passwd: files db
group: files db

db_enum: cache builtin

db_home: cygwin desc
db_shell: cygwin desc
db_gecos: cygwin desc

# End /etc/nsswitch.conf

変更後

# Begin /etc/nsswitch.conf

passwd: files # db
group: files # db

db_enum: cache builtin

db_home: cygwin desc
db_shell: cygwin desc
db_gecos: cygwin desc

# End /etc/nsswitch.conf

db をコメントアウトした。これでファイルの権限や所有者を検査するのにアクティブディレクトリに問い合わせしなくなる。よって LAN が抜けても遅くならない。前述の通り、新しいユーザが作ったファイルをローカルにコピーする様な事があるならば /etc/passwd/etc/group を再生成する必要がある。その必要がないのであれば、この設定を行う事で全てのコマンドが少しだけ速くなる。


2017/05/10


おなじみC/C++から使えるJSONライブラリを紹介するコーナー。まずは過去のまとめ。

結構前からあった様だけど気付いて無かった。

GitHub - DaveGamble/cJSON: Ultralightweight JSON parser in ANSI C

README.md cJSON Ultralightweight JSON parser in ANSI C. Table of contents License Usage Welcome to c...

https://github.com/DaveGamble/cJSON

特徴は以下の通り。

  • 分かりやすい API
  • MIT ライセンス
  • スレッドセーフ
  • ANSI C (もしくは C89, C90) で書かれている

Not C++ で使える JSON パーサとしては分かりやすい API で良いと思います。参照カウンタを持っているのでメモリの解放もルートオブジェクトの破棄だけで行えます。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"

int
main(int argc, char* argv[]) {
  cJSON *root = cJSON_CreateObject(), *arr, *item; 

  cJSON_AddNumberToObject(root, "count"1);
  cJSON_AddItemToObject(root, "items", arr = cJSON_CreateArray());
  cJSON_AddItemToArray(arr, cJSON_CreateString("こんにちわ世界"));
  cJSON_AddItemToArray(arr, cJSON_CreateFalse());
  cJSON_AddItemToArray(arr, cJSON_CreateNull());
  puts(cJSON_PrintUnformatted(root));
  cJSON_free(root);
  
  root = cJSON_Parse("{\"count\":1, \"items\":[\"こんにちわ世界\",false,null]}");
  arr = cJSON_GetObjectItem(root, "items");
  cJSON_ReplaceItemInArray(arr, 0, cJSON_CreateString("こんにちわ日本"));
  cJSON_ArrayForEach(item, arr) {
    puts(cJSON_Print(item));
  }
  cJSON_free(root);
  return 0;
}

欲を言うとシリアライズ時にメモリを確保しない API が欲しいです。


2017/04/09


最近、我が家にドルチェグストがやってきた。

コーヒーは良く飲むけど、自分で入れるし別に要らんわー。と思ってたんだけど、届いてみるとこれがなかなか。安定した味が毎回出せるので気付いたらこれで入れたコーヒーばかり飲んでる。同じ物ばかり飲んでたら飽きるかもと思ったので楽天で6種類セットを買った。

  • ティーラテ
  • カフェオレカフェインレス
  • カフェオレ
  • ラテマキアート
  • レギュラーブレンド
  • インテンソ

気を付けた方がいいなと思ったのは、カプセルの種類の中にはコーヒーとミルクの2個を一度に使う物があり、気付かずミルクだけで入れてしまうと「なんだよドルチェグストってこういう物なの?」って気分になってしまう。(僕がそうだ)

原稿書いたりするときに、ネタで頭いっぱいになっててコーヒー入れるのも面倒になってしまう事もあるけど、これ水入れて30秒で熱湯が出る様になってるので1分あれば美味しいコーヒーが入れられる。あと洗い物が出ない。これ大事。嫁が買うって言い出した物だけど、僕の方が飲んでる。思ってたより良かった。