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';
    }
}

ここでの、<> は , eof は eof ARGV の省略形。たぶん。

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++