ARGV memo
ARGVの挙動をいつも忘れちゃうので、メモ。
多量(ってほど多く無かったけど)のファイルの改行コードがCR, LFか、LFかを判別する必要があったんで、適当に書いた。ARGV便利。
$.の所の条件が逆だったので修正 (´・ω・`)
#!/usr/local/bin/perl use strict; use warnings; my $ff = 'unix'; while (<>) { $ff = 'dos' if /\0x0D\0x0A/; if ($. > 10 || eof) { print "$ARGV:$ff\n"; close ARGV; $ff = 'unix'; } }
ここでの、<> は
FreeBSD 8.1-RELEASE にアップデートしたメモ
今回は、何事もなく終了。(前回: FreeBSD 8.0-RELEASE にアップデートした時に、zfs 絡みでハマったのでメモ - ◆F99a.q8oVEの日記)
eagle% uname -a FreeBSD eagle 8.0-RELEASE-p4 FreeBSD 8.0-RELEASE-p4 #0: Mon Jul 12 20:55:11 UTC 2010 root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC amd64 eagle% sudo freebsd-update upgrade -r 8.1-RELEASE eagle% sudo freebsd-update install eagle% sudo shutdown -r now
で、再起動。
eagle% sudo freebsd-update install eagle% sudo zpool upgrade <pool name> eagle% uname -a FreeBSD eagle 8.1-RELEASE FreeBSD 8.1-RELEASE #0: Mon Jul 19 02:36:49 UTC 2010 root@mason.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64
zfs pool もバージョンアップして…完了。
eagle% sudo portupgrade -farR
portも一応再build.
Objective-C でリフレクション
Objective-C をちょこちょこ使ったりしています。
ということで、勉強メモ。
#import <Cocoa/Cocoa.h> #import <stdio.h> @interface Hoge : NSObject { NSString *str; } @property (retain) NSString *str; @end @implementation Hoge @synthesize str; - (id)init { if (self = [super init]) { str = @"init"; } return self; } @end int main(void) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; Class clazz = NSClassFromString(@"Hoge"); id hoge = [[clazz alloc] init]; printf("%s\n", [[hoge str] UTF8String]); [hoge setStr:@"hogehoge"]; printf("%s\n", [[hoge str] UTF8String]); [pool release]; return 0; }
実行してみる。
lightning% gcc test.m -framework Cocoa && ./a.out init hogehoge
ついったら〜人気者ランキング
Twitter ユーザーをリプライでランキングしてみた。
簡単な紹介
ランク付けは、google pagerank インスパイアで、リプライを多くもらってる人が上位に入る仕組みです。
もちろん、ランクが高い人からリプライをもらうと自分のランクも上るけど、いっぱいリプライを飛すと1リプライのランクが薄まって…。まぁ、pagerank そのまんまですね……。
実装
AnyEvent::Twitter::Stream で日本語っぽい tweet をせっせと収集してます。
日本っぽい tweet 判定には、以下を使ってます。
- timezone が Tokyo
- location に、次を含むか /japan|tokyo|osaka|日本|[あ-んア-ン]/i
- つぶやきに次を含むかw /[あ-んア-ン]/
これから reply を抜き出して、map reduce してランキングを作ってます。ランキングを作るのは一日一回で、後は10分毎に何かをちょこちょこ更新してます。
FreeBSD 8.0-RELEASE にアップデートした時に、zfs 絡みでハマったのでメモ
基本的には、以下の手順に従ってアップデートすれば OK なんだけど、初めの再起動が落し穴。
FreeBSD 8.0-RELEASE Announcement
zfs のディレクトリ達を /, /usr とかに切り分けていたのですが、一番初めの再起動の時に / を残してマウントに失敗してしまい、「/usr/libexec/... とかが無いよ!」などとおっしゃりました。
解決方法は、以下。
シングルユーザーモードで上げると、/ が ro でマウントされているので、以下コマンドで必要なディレクトリをマウントして、
$ mount -o rw -t zfs tank/root / $ mount -t zfs tank/usr /usr # 必要なディレクトリ分繰り返す
必要なディレクトリがマウント出来たら、
$ freebsd-update install
これで、次に再起動した時は正常に起動してくるはず。
んで、アップデート完了後はこうなりました。
% uname -a FreeBSD eagle 8.0-RELEASE FreeBSD 8.0-RELEASE #0: Sat Nov 21 15:02:08 UTC 2009 root@mason.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64
sftp サーバを立ててみる - sshd で chroot
環境は、
FreeBSD eagle 7.2-RELEASE-p2 FreeBSD 7.2-RELEASE-p2 #0: Wed Jun 24 00:14:35 UTC 2009 root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC amd64
まずは、sftp でログインさせる用のアカウントを作成。group は sftponly に。
通常のログインはさせたくないので、
shell nologin
にしておく。
/etc/ssh/sshd_config に以下を追加。
Subsystem sftp internal-sftp # さっきの sftponly にマッチさせるルールを書く Match Group sftponly # あんまりやりたくないけど、クライアントの関係でパスワード認証をしぶしぶ有効に PasswordAuthentication yes AllowAgentForwarding no AllowTcpForwarding no X11Forwarding no # 通常はこっちですが、 # ChrootDirectory /home/%u # root になるディレクトリ。owner:group は root:wheel である必要がある。 # ついでに言うと、ディレクトリのパーミッションによっては弾かれるので、エラーになったらログを見てね。 ChrootDirectory /export/tank # これやっちゃうと nologin にした意味が無い気もするけど ForceCommand internal-sftp
これで完了! 簡単すぎるぐらい簡単だった。
ディレクトリを高速に上る
Life changing な設定のご紹介。結構な期間 常用してますが、便利で仕方がないです。
引用します。
rationalise-dot() {
if $LBUFFER = *.. ; then
LBUFFER+=/..
else
LBUFFER+=.
fi
}
zle -N rationalise-dot
bindkey . rationalise-dot
これを ~/.zshrc に書きこんで―― "." を入力してみます。
"." を 1 個
"." を 2 個
"." を 3 個!
"." を 4 個!!
"." を 5 個!!!
"." を 3 個以上書き込むと、"加速" します。
つまり、
- "." (2 個) で 1 個 上のディレクトリ
- "." (3 個) で 2 個 上のディレクトリ
- "." (n 個) で n-1 個 上のディレクトリ
に移動できます。mqt++