bit

ジョギング音楽

(2014/5/9) 新しく2014年バージョンを公開。→こちら

私がジョギングのときにiPodで聴いている曲を紹介。BPM 160前後の洋楽が中心。

曲名 アーティスト名 BPM リンク
Crawling Back To You Daughtry 151 iTunes / Youtube
Feelin' Way Too Damn Good Nickelback 156 iTunes
Over You Daughtry 156 iTunes / Youtube
Duca Chara 156
変わらないもの 奥華子 157 iTunes
Blurry Puddle of Mudd 157 iTunes / Youtube
Holding On to Heaven Nickelback 158 iTunes
Keep Holding On Avril Lavigne 161 iTunes
Some Say Sum 41 162 iTunes / Youtube
Keep It Together Puddle of Mudd 162 iTunes
What About Now Daughtry 162 iTunes
We Don't Have To Look Back Now Puddle of Mudd 163 Youtube
Some Day Nickelback 163 iTunes / Youtube
Don't Ever Let It End Nickelback 168 iTunes
Losing My Mind Daughtry 168 iTunes / Youtube

ついでに、ジョギングに向いているかはともかくBPM 160前後の曲の紹介。

曲名 アーティスト名 BPM リンク
ふでペン〜ボールペン 放課後ティータイム 153
働く男 ユニコーン 160
Woman Like You Lee Brice 160 Youtube
iYiY Cody Simpson 160 iTunes / Youtube
Sense Amanda Mair 165 Youtube
Got Me Good Cody Simpson 168 Youtube

このBPMは、BPM計測サービスで手動で測ってみたのだが、ちょっと感覚と違う。Blurry と Keep It Together は同じくらいだと思うんだけど。
まあいいや。参考まで。

(追記 2012/4/7) Nickelback のアルバムをiTunesで購入したので、二曲追加。
(追記 2012/4/14) iTunesへのリンクを追加 (別にアフィリエイトではない)。
(追記 2012/6/16) Cody SimpsonはBPM160前後の曲が多く探しやすいけど、中学生なんだよな、こいつ...。

ネットワークインタフェイス一覧

Linuxのネットワークインタフェイス一覧を取得する話。
ifconfig コマンドの出力がパースしにくい*1ので、もう少し簡単に取得できないかと調べた。ifconfig のソースコード*2読んだだけだが、役に立つ人もいるかもしれないので書いておく。
先にオチを言っておくと、パースするほうが簡単だった…。

ifconfig は、/proc/net/dev から読み取ったインタフェイス一覧*3と、ioctl(2) の SIOCGIFCONF リクエストで取り出した情報*4をマージしている。前者には IP エイリアス情報が含まれず、後者にはアクティブなインタフェイスしか含まれないからである。
話を元に戻すと、簡単に一覧を取得するには /proc/net/dev のほうはともかく、ioctl が厄介。ifconf 構造体を ioctl 関数に渡せばよいのだが、こいつが ifreq 構造体へのポインタを持っている。

struct ifconf
  {
    int ifc_len;                        /* Size of buffer.  */
    union
      {
        __caddr_t ifcu_buf;
        struct ifreq *ifcu_req;
      } ifc_ifcu;
  };

知らない人のために書いておくと、ioctl 関数は、(領域を割り当てた)構造体のポインタを渡すと、その構造体にリクエストしたデバイス情報を埋め込んで返してくれる。
Perl の ioctl 関数もまったく同じ。つまり、Perlでバッファ確保とそのポインタを渡す必要がある…。

*1:CPANにいろいろ転がっているのは知っている。

*2:[https://developer.berlios.de/projects/net-tools/:title=net-tools]

*3:lib/interface.c の if_readlist_proc関数を参照

*4:lib/interface.c の if_readconf関数を参照

続きを読む

ローマ字っぽいアルファベット表記を見つけるための正規表現

アルファベットの並びがローマ字っぽいものを見つけるための正規表現
人名がずらっと並んでいるときに、日本人名を見つけたかったので。

if (/^(\s*(((([bdghjkmnpstrz])\5?)?y?([ei]|[aou]h?))|ss?h[aiuo]|cc?h[aio]|tt?su|wa|fu|n)+){1,2}\s*$/i) {
  chomp;
  print $_, "\n";
}

gha(ぎゃ) とか wwa(っわ) とかは、ないだろと思って外しているので、意図するものが引っかからない可能性はある。逆に、Gianni とか、Hiseman とかもひっかかってしまうが、それは仕方ない。

Windows7 で VMwareの NAT 接続ができないとき

Windows7VMWare Server を乗っけてNAT接続するのに、少し苦労したのでメモ。
といっても、他のブログにたくさんやり方が載っているので、詳細は割愛。結局こういうことに違いない。↓

(1) ICS設定は、インターネットに出ていく「ローカルエリアネットワーク接続」に対し設定する。プルダウンメニューで選ぶ許可先が「VMnet8」。この設定はWindowsの管理者権限が必要。言わずもがなだが、図の192.168.0.2は環境によって異なる。
(2) Virtual Network EditorでのNAT設定について、VMnet8のサブネットは「192.168.137.0/24」、「Gateway IP address」は「192.168.137.1」でほぼ固定。
(3) ゲストOS側ネットワークの設定の要点は、(2)の設定の反映を忘れないということだけ。忘れると、ゲストOSのデフォルトゲートウェイ設定が、(2)の値とずれてしまい通信できなくなる。とはいっても、VMnet8 が DHCP サーバも兼ねているので、ゲストOS 側でアドレスをもらい直すだけでOK。Linuxなら、ネットワークの再起動が簡単。

# service network restart
# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.137.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
0.0.0.0         192.168.137.1   0.0.0.0         UG    0      0        0 eth0

これで、ゲストOSからインターネットに接続できるし、ホストOSからならゲストOSへもTCP/IPで接続できる。ゲストOS側のファイアウォール設定(Linux なら iptables)に注意。
Wireshark などのパケットキャプチャツールで、ホストOSのNICとVMnet8 をそれぞれキャプチャすると、どのようなNAT変換が行われているかがよくわかる。

glibc regex.h

普段Perlを使ってたせいか、C言語で設定ファイルを読み込ませる処理を書いたとき意外と面倒だったので、その使い方をメモ。設定ファイルごときにPCREは大袈裟と思って、glibcregex にしたせいか。いずれにせよ、ウェブ上の情報が少ない…。

まずは、読み込む部分。

static int _read_config_file(const char * conf_filepath) {
    assert(conf_filepath != NULL);

    int rc;
    FILE * in_file = NULL;
    char line_buff[LINE_BUFF_SIZE];
    regex_t re_kvline;

    regcomp(&re_kvline, REGEXP_KVLINE, REG_EXTENDED | REG_NEWLINE);

    in_file = fopen(conf_filepath, "r");
    if (in_file == NULL) {
        perror("fopen");
        rc = -1;
        goto FINALLY;
    }

    while(fgets(line_buff, LINE_BUFF_SIZE, in_file) != NULL) {
        regmatch_t matched[NB_MATCHES];

        if (line_buff[0] == '#' || line_buff[0] == '\n') { // skip comments
            continue;
        }

        if (regexec(&re_kvline, line_buff, NB_MATCHES, matched, 0) == REG_NOMATCH) {
            fprintf(stderr, "not match:%s\n", line_buff);
            continue;
        }

        line_buff[matched[1].rm_eo] = '\0';
        line_buff[matched[2].rm_eo] = '\0';
        _set_config(line_buff + matched[1].rm_so, line_buff + matched[2].rm_so);
    }

    rc = 0;

FINALLY:

    if (in_file != NULL) {
        rc = fclose(in_file);
        if (rc != 0) {
            perror("fclose");
        }
    }

    regfree(&re_kvline);

    return(rc);
}

regcomp() にエラーチェックがないのは、単体試験で正しい正規表現になっているはずっていう横着。括弧でマッチした部分を抽出するために、REG_EXTENDEDフラグはたぶん必須。_set_config() の中身は適当に。

さて、REGEXP_KVLINEの値をいろいろ変えてみる。

#define REGEXP_KVLINE "^([[:alpha:]])=(.*)$"

とりあえずなら、これでもよい。
でも、イコール(=)の周りに空白を許容したいとか、キーに数字を入れたいとか、でもキーの先頭が数字はやだよねとか色気を出し始める。

#define REGEXP_KVLINE "^([[:alpha:]][[:alnum:]]*)[[:blank:]]*=[[:blank:]]*(.*)$"

これで↓とか、ピコピコ読み込める。

datadir = /var/tmp

さらに、キーにも空白入れたいなとか考える。

#define REGEXP_KVLINE "^([[:alpha:]]([[:alnum:] ]*[[:alnum:]])?)[[:blank:]]*=[[:blank:]]*(.*)$"

読み込む括弧位置が変わってくるので、プログラムの以下の部分も修正。Perl の (?: …) が使いたい。

        line_buff[matched[1].rm_eo] = '\0';
        line_buff[matched[3].rm_eo] = '\0';
        _set_config(line_buff + matched[1].rm_so, line_buff + matched[3].rm_so);

これで

special key 01 = (^o^)

としても読み込めてしまうようになる。