2011年6月アーカイブ

会社のMacBookにSnow Leopardが入ったので、自宅マシンと同様に環境設定していく。
まずはMacPortsを入れようと思ったが、いきなり最初のrsyncができなくてはまる。
"macports proxy"で検索すると、プロキシ経由でMacPortsを使用するには — LyX HowToと言うページを発見したのでその通りにやってみる。
  1. /opt/local/etc/macports/sources.conf に以下の行を加え、rsync:// で始まる行をコメントアウトする。
    file:///opt/local/var/macports/sources/dports/ [default]
    
  2. svnがproxyを超えるようにする(参考サイトでは、環境変数http_proxyを設定していたが、私の環境のsvnはhttp_proxyをみてくれないようだ)ために、~/.subversion/serversのglobalセクションを以下のようにする。
    [global]
    http-proxy-exceptions = proxyを使わないホスト名 *.example.comとか
    http-proxy-host = proxyホスト名
    http-proxy-port = proxyポート番号
    
  3. dportsの取得
    $ cd /opt/local/var/macports/sources
    $ sudo svn co http://svn.macports.org/repository/macports/trunk/dports
    
  4. ソースツリーの更新
    $ sudo port -d sync
    
  5. port自身の更新
    $ sudo port -f install macports
    
んで、さっそくemacsを入れようと思って sudo port install emacs-app-devel すると、CVS でソースが取って来れない的なエラーが出て失敗する。
cvsのproxy越えについて調べたところ、cvs のバージョン1.12.7以降であればproxyが使えるようだ。(see info cvs)
そこで、/opt/local/var/macports/sources/dports/aqua/emacs-app-devel/Portfileの cvs.root の行を以下のように変更。
cvs.root        "\":pserver;proxy=proxyホスト名;proxyport=proxyポート番号:anonymous@cvs.savannah.gnu.org:/sources/emacs\""
portfileはtclで書かれているので、tclに途中の;を解釈されないように外側の""が必要で、その後cvsの呼び出し時にシェルに;が解釈されないように内側の\"\"が必要だ。
これで行けるかと思ったら、やっぱりエラーになる。ログをみると
:info:fetch cvs [export aborted]: proxy server proxyホスト名:proxyポート番号 does not support http tunnelling
と出ているので、うまくproxyが超えられていないらしい。

ここで挫折して、自宅マシンで port mdmg emacs-app-develで作成したdmgファイルからインストールして逃げた。

ここまでで、svnのproxy越えとcvsのproxy越え(成功してないけど)を取り上げたので、ついでにgitのproxy越えも取り上げておく。
proxy内のmac(に限らないけど)からgithubのgit@github.com:のURLにアクセスするには、sshがproxyを越えれば良い。
既にmacのsshの鍵はgithubに登録されているとして、~/.ssh/configに以下を追加する。
Host github.com
ProxyCommand $HOME/bin/connect -S proxyホスト %h %p
あ、ここで指定するproxyホストは http proxy じゃなくて socks proxyである必要がある。
これを動かすためには $HOME/bin/connectが必要なので、この辺から持ってきて、
$ mkdir ~/bin
$ gcc -o ~/bin/connect connect.c -lresolv
とかやって使えるようにしておく。(macportsにはproxytunnelと言うのが入っているので、こちらも使えるかもしれない)
これで、git clone git@github.com:・・・リポジトリ.git とかやれば成功するはず。

追記(2011/6/6)
git@github.com: みたいにsshを使う場合は上記で良いんだけど、git:とかhttps:を使う場合はsshの設定ではなくgitの設定を使う。ちょっと調べた感じだとcokescrewを使うケースが多いみたいだけど、うちのHTTP ProxyはCONNECTメソッドを許可していないし、socks proxyがある場合はちょうどssh用に入れた connect が使えるので、以下のようにする。
  1. 以下の内容でgit-proxyコマンドを作る
    #!/bin/sh
    $HOME/bin/connect -S proxyホスト $1 $2
    
  2. git config でgithub.comに対するproxyコマンドを設定する
    $ git config --global core.gitproxy '"git-proxy" for github.com'
    
github以外にもproxy経由でアクセスしたいホストがあれば、同じように for xxx のxxxの部分にホストを指定すれば追加できる。
自宅macに入れたはずなんだけど、そのときの手順をメモしていなかったので会社macに入れながらメモ。
emacs lispを入れるときには、*.elファイルを*.elcファイルにbyte compileするのだけれど、/usr/bin/emacs (emacs22)と Emacs.app (emacs23) で同じ elc になるか自信がなかったので、Emacs.app でbyte compileする手順。(emacs22でbyte compileしたファイルはemacs23でも読めると思うけど)
参考サイトはauto-install.elでEmacsLispパッケージを自動インストール→anything.el関連を一括インストール - (rubikitch loves (Emacs Ruby CUI Books))
  1. rootになる(環境変数絡みがあるので、コマンド毎にsudoするのではなく一度rootのシェルになる)
    $ sudo su -
    #
    
  2. 環境変数PATHにwgetがある場所を追加する。
    # export PATH=/opt/local/bin:$PATH
    
  3. 環境変数http_proxyを設定する(必要な場合のみ)
    # export http_proxy=http://proxyホスト名:proxyポート/
    
  4. emacs-lispを置くディレクトリを作成する。
    # mkdir -p /opt/local/share/emacs/site-lisp
    
  5. auto-install.elを持ってくる
    # cd /opt/local/share/emacs/site-lisp
    # wget http://www.emacswiki.org/emacs/download/auto-install.el
    
  6. ~root/.emacsに以下を追加する
    (require 'auto-install)
    (setq auto-install-directory "/opt/local/share/emacs/site-lisp")
    (auto-install-update-emacswiki-package-name t)
    (auto-install-compatibility-setup)             ; 互換性確保
    
  7. rootでEmacs.appを起動する
    # /Applications/MacPorts/Emacs.app/Contents/MacOS/Emacs
    
  8. anything.elをインストールする。
    emacs上で、M-x auto-install-batch[ENTER]anything[ENTER]
    しばらく待つとダウンロードが終わるので、バッファ毎に C-c C-c を押す。
  9. auto-complete.elをインストールする。
    Auto Complete Mode - GNU Emacsのための最も賢い自動補完機能からauto-complete-1.3.1.tar.bz2を持ってきて展開し、以下を実行
    $ /Applications/MacPorts/Emacs.app/Contents/MacOS/Emacs -Q -L . -batch -f batch-byte-compile *.el
    $ sudo cp *.el* /opt/local/share/emacs/site-lisp/
    
auto-complete.elは、auto-installでauto-complete development versionを指定してインストールしたり、install-elisp-from-emacswiki で auto-complete.elを指定してインストールしたりもしてみたのだけれど、ファイルはあるのに (require 'auto-complete-config)でエラーになるので、結局アーカイブを持ってきて入れた。
(macの)Ojbective-Cの勉強メモ。
自分用なので他の人が見ても役に立たないかも。
  • クラス宣言
    @interface クラス名 : スーパークラス名 <プロトコル名> {
        型 変数名; // インスタンス変数
        IBOutlet 型 変数名; // アウトレット
    }
    
    + (返値の型)メソッド名; // +で始まるとクラスメソッド
    - (返値の型)メソッド名; // - で始まるとインスタンスメソッド
    - (返値の型)メソッド名:(引数の型)仮引数名; // 1引数のメソッド
    - (返値の型)メソッド名:(引数1の型)仮引数名1 ラベル2:(引数2の型)仮引数名2; // 2引数以上のメソッド
    - (IBAction) メソッド名:(id) 仮引数名; // アクション
    @end
    
    <プロトコル名>は省略可能。多重継承はできない。プロトコルは複数実装できる。(,区切りで並べる)
    疑問: 省略可能引数は?
    →できなさそう。ただし、...とva_*マクロは使える。
  • クラスの実装
    @implementation クラス名
    - (返値の型)メソッド名:(引数の型)仮引数名 {
        // メソッドの実装
    }
    @end
    
  • 宣言は*.hに、実装は*.mに書く。#includeの代わりに#importを使う。
  • メソッドの呼びだし
        [オブジェクト メソッド名]; // 引数なしのメソッドの呼びだし
        [オブジェクト メソッド名:実引数]; // 引数1個のメソッドの呼びだし
        [オブジェクト メソッド名:実引数1 ラベル2:実引数2]; // 引数2個以上のメソッドの呼びだし
    
    オブジェクトの所にクラス名を書くとクラスメソッドの呼びだし。
    疑問: ラベルの順番は宣言の通りでないといけないの?
  • idはNSObject *のエイリアスだと思っておいて良い
    →まずいらしい。
  • インスタンスの生成
        id object = [[クラス名 alloc] init];
        // allocはNSObjectのクラスメソッド、initはNSObjectのインスタンス
        // メソッド両方とも返値の型はid。この段階で参照カウンタは1。
        object = [object autorelease]; // 自動解放のマーク。
    
    initには引数付きのいろいろなバリエーションが存在し得る。また、allocとinitとautoreleaseをセットでやってくれるようなクラスメソッドも提供されている場合がある。
  • インスタンスの解放
    インスタンスは、releaseの呼びだしによって参照カウンタが0になると解放される。このとき、deallocと言うメソッドをオーバーライドしてあれば、それが呼ばれる。オーバーライドしたら[super dealloc]を呼ぶ。
  • releaseの反対はretainで、参照カウンタを1増やす。NSArrayなどのコンテナに入れた場合はそこでretainされるので、あまり自分でretainを呼ぶ機会はないか?
    →インスタンス変数がオブジェクトなんかの場合に、setterでコピーしない場合はretainする。
  • autoreleaseの呼び出しは、インスタンスのNSAutoreleasePoolへの登録。NSAutoreleasePoolは、Cocoaのイベントループ毎に再生成されるので、autoreleaseしたオブジェクトの寿命はイベントハンドラの実行が終わるまで。
  • 文字列
    NSStringは変更不可能な文字列、NSMutableStringは変更可能な文字列。内部エンコーディングはUTF-8?
  • 文字列リテラル(NSString)
        NSString *string = @"hogehoge";
    
    ※ 参考にした本では、@""の中には日本語が書けないと書いてあったが、Xcode4でUTF-8のソースであれば日本語を書いても普通に通った。
  • カテゴリの宣言
    @interface 既存クラス名 (カテゴリ名)
        //メソッドの宣言
    @end
    
    カテゴリは、既存のクラスにメソッドを追加する。
  • カテゴリの実装
    @implementation 既存クラス名 (カテゴリ名)
        //メソッドの実装
    @end
    
  • プロトコル
    @protocol プロトコル名 <スーパープロトコル>
        //必須メソッドの宣言
    @optional
        //オプションメソッドの宣言
    @required
        //必須メソッドの宣言
    @end
    
    Javaのinterfaceのようなもの。多重継承可。継承が必要ない場合でもクラスは必ずNSObject(Ojbect)のサブクラスにするが、プロトコルは継承元がなくても良い。
  • プロトコルの利用
    プロトコルは、クラスの宣言時にそのクラスがそのプロトコルを実装していることを表す他に、変数の型やメソッドの引数/返値の型に使える。
        id  hoge; // プロトコルHogeを実装したクラスのインスタンスを入れられる変数 hoge
        - (void)setHoge:(id )hoge; // Hogeを実装したクラスのインスタンスのsetter
    
    これらはコンパイル時に静的な型チェックが行われる。
        hoge = @"hoge"; // NSStringはHogeを実装していないのでエラー
        [obj setHoge: @"hoge"]; // 同上
    
  • 言語としての@protocolではなく、NSObjectのカテゴリとして宣言したものを、非形式プロトコルと呼ぶ。
    非形式プロトコルはコンパイル時の型チェックが行われない。
    Cocoaのdelegateなどで利用されている。これは、Objective-C 2.0より前のバージョンでは、@protocolに@optionalがなかったため、全てのプロトコルのメソッドを実装しなくても良いものとして使われていたらしい。
  • 宣言プロパティ
    @interface クラス名 {
        型 プロパティ名;
    }
    @property (属性) 型 プロパティ名;
    @end
    
    @implementation クラス名
    @synthesize プロパティ名;
    @end
    
    • @propertyはクラスがプロパティ名で示されるプロパティを持つことの宣言であり、メンバ変数として持っている必要はない。
    • 属性には、以下が設定できる
      • getter=ゲッタ名: getterメソッドの名前を変えるとき
      • setter=セッタ名: setterメソッドの名前を変えるとき
      • readonly: getterのみ
      • readwrite: getterとsetter(デフォルト)
      • assign: 単なる代入をするsetter(デフォルト)
      • retain: retainするsetter
      • copy: copyするsetter
      • nonatomic: スレッドセーフにしないとき
    • 実装部分に@synthesizeを書くと、自動でgetterとsetterが生成される。@synthesizeを書かずに自分で実装しても良い。自動生成する場合は、プロパティと対応するメンバ変数が必要。
    • メンバ変数名とプロパティ名を変えたい場合は、
      @synthesize プロパティ名 = メンバ名;
      
      のように書く
    • 宣言プロパティは、以下のように二つの方法でアクセス可能
          [obj setXxx:value]; // setterメソッドの呼びだし
          obj.xxx = value; // .演算子によるアクセス
          value = [obj xxx]; // getter メソッドの呼びだし
          value = obj.xxx; // .演算子によるアクセス
      
    • オブジェクト型のプロパティの場合で、assign又はcopyを指定したときは、releaseの責任を持つことになるので、deallocをオーバーライドしてreleaseしてやらないとリークする
このblogはMovableTypeと言うシステムを使って書いている。
MovableTypeがバージョンアップすると、フルセットのzipファイルで提供されるのだが、今まではバージョンアップするたびに以下の手順を踏んでいた。
  1. 既存のmtディレクトリをリネーム
  2. 新しいzipを展開
  3. mt-config.cgiを古いディレクトリからコピー
  4. 追加していたpluginを古いディレクトリからコピー
  5. 追加していたtemplateを古いディレクトリからコピー
  6. 追加していたalt-tmplを古いディレクトリからコピー
  7. 自分用にカスタマイズするパッチをソースにあてる
この手順を全て手動でやっていたので、毎回何かしら忘れたりして後からコピーしたりしていた。
せっかく、gitみたいなバージョンコントロールのシステムがあるのだから、なるべく手でやる手順は減らしてみることにする。
# ここまでやるなら、MTOSにして直接リポジトリとやるようにしたらもっと楽になると思うけど、今のところ個人無償ライセンスで製品版を使う。

今回は、MT-5_1-ja.zip(5.1)をベースにローカルな修正を加え、それをMT-5_11-ja.zip(5.11)に上げる手順をやってみる。
  1. リポジトリを作る
    % mkdir mt
    % cd mt
    % git init
    
  2. リポジトリにMT-5.1をコピーして追加する。
    % cd ..
    % unzip MT-5_1-ja.zip
    % cp -r MT-5.1-ja/* mt/
    % cd mt
    % git add *
    % git commit -m "import 5.1"
    % git tag MT-5.1 ←tagでわかりやすい名前を付けておく
    
  3. ローカルの変更用のbranchを作成して、ローカルの変更を加える。
    % git checkout -b local
    ... ローカルの変更を加える
    % git commit -a -m "local changes"
    % git tag MT-5.1l
    
ここまでが、5.1の時点でやっておくべきこと。
ここからは、5.11のzipを持ってきてからやること。
  1. masterブランチに5.11をコピーする。
    % git checkout master ←カレントディレクトリはmt
    % rm -rf * ←バージョンアップで削除されたファイルがある場合に対応するため
    % cd ..
    % unzip MT-5_11-ja.zip
    % cp -r MT-5.11-ja/* mt/
    % cd mt
    % git status ←これをやると、何が追加/削除/変更されたかわかる
    % git commit -a -m "import 5.11"
    % git tag MT-5.11
    
ここまでで、masterブランチに5.11を持ってこれた。後は、5.11にローカルの変更を加えたバージョンを作れば良いんだけど、やり方として git merge を使うやり方と、git rebase を使うやり方があるらしい。
今回は、おそらくこう言う場合のためにあるであろうrebaseを使ってみる。
  1. rebase
    % git checkout local
    % git rebase master
    .... conflictせずに成功したら
    % git tag MT-5.11l
    
え~っと、終わりです。
masterの修正内容と、localブランチの修正内容がぶつかる場合は Conflict が検出されて、自分で直して git rebase --continue とかやらないといけないらしいですが、今回は何のエラーも出ずに終わってしまいました。
git log --all --graph とか見ると、元のbranchとは別に新しくMT-5.11をベースにbranchが作られていることがわかる。

追記
なんとなく、rebaseよりもmergeの方が良いような気もしたので、mergeの手順も書いておく。最後のrebaseの所を以下のように変えるとmergeになる。
  1. merge
    % git checkout local
    % git merge MT-5.11 ←masterでも良いけどtagを指定した方がmergeのlogがわかりやすいと思う
    .... conflictせずに成功したら
    % git tag MT-5.11l
    
今まで、うちの回線はNTTの「Bフレッツ ハイパーファミリータイプ」と言う奴だったのだが、「フレッツ 光ネクスト ファミリーハイスピードタイプ」に変更した。
これは、フレッツ光 ネクストが 「フレッツ 光ネクスト」におけるインターネット(IPv6 PPPoE)接続の提供開始およびIPv6アドレスによるインターネットサービスへの対応について でIPv6のpppoeに対応したから。(もっとも、現時点では使用しているプロバイダはv6サービスを提供していないし、工事費をかけて急いでやるメリットはあまりないかも)
# 実は、5月中に申しこめば工事費5千円+通信費2ヶ月無料と勘違いして申し込んだんだが、それが適用されるのはニューファミリータイプだった。
5/28にwebから申し込んで、5/31に確認の電話があり、11日の15時に工事をすることに決まった。局側だけでなく宅内工事も必要だそうだ。てっきりONUは同じものが使えるのだと思っていた。
光を引き込んでいるところはPCのラックが置いてあり、大量のケーブルが這う人外魔境と化していたので、泣きながら掃除をしてPCをどかしたりしたが、それでもまだ工事がやりにくそうな状態だった。
しかしラックは簡単に動きそうになかったので、これでやってもらうしかない。
当日は、15時30分頃に「後20分で着きます」と言う電話があり、工事の人がやってきた。まずはONUとルータの電源を切り、次に電柱の上の工事があると言って外に出て行った。
しばらくして戻ってくると、ONUを新しいものに交換した。そしてPCでなにやらVBっぽい画面で工事の指示を出し、やがて光電話が開通したことを確認すると、終わりましたと言って紙を渡して、別の紙にサインさせて帰っていった。
工事費は税込で12,810円だった。(光電話もあるので、フレッツ光ネクストだけよりも少し高い)
初回の工事の時はIPネットワークの確認もしたんだけど、今回の工事では大丈夫なはずってことかな?
面白かったのは、持ってきていたノートPCがPanasonicのTough Bookだったんだけど、画面がタッチパネルらしく、タッチで操作していた。Windows XP で画面タッチってあるんだな。

早速確認したら普通にプロバイダ経由でIPv4にはアクセスできているようだ。
フレッツにはフレッツ・スクウェアと言う「ブロードバンド体感コンテンツなど、フレッツを更に楽しくお使いいただくためのコンテンツが満載のサイト」があったはずで、Bフレッツの時はpppoeのマルチセッションでプロバイダとは別にフレッツスクウェアに接続していた。そして、DNSサーバの設定で "flets" と言うドメイン宛のDNS問い合わせはフレッツスクウェア側に飛ばすようにしていた。
これが、フレッツ光ネクストになると、pppoeじゃなくてルータのIPv6ブリッジを使って直接フレッツ・スクウェア ネクストと言うサイトに繋ぐらしい。
そして、フレッツ・スクウェア ネクストのページには『「フレッツ・スクウェア ネクスト」は2011年6月1日より「サービス情報サイト」に名称が変更になりました。』との記述があり、どうも移行の途中らしく、サイトのあちこちにおかしい記述があって、非常にわかりにくくなっている。
このページにはこんなことが書いてあって、こうおかしいって言うのを抜き出して行こうかと思ったんだけど、ページ間のリンクもわかりにくくて、一度見たページになかなか辿りつけなくて非常にストレスフルなので、一切の嘘は無視して、現時点での正しい(と思われる)情報だけを抜き出しておこう。
うちの場合、squidでhttpのproxyをしているのだが、使用しているバージョン2.7系ではIPv6に対応していないので、そのままではv6のフレッツ情報サイトが見られない。proxyを使わない設定に、flets-east.jpを追加してやる必要がある。
かつ、DNSも直接プロバイダのを見ているのではなくて、家庭内向けにコンテンツ&キャッシュサーバが動いているので、flets-east.jp ドメインの問い合わせをforwardしてやる必要がある。
しかし、申し込みなどは普通にInternet側からアクセスできるフレッツ光メンバーズクラブで対応できそうなので、もうフレッツスクウェアを見ることはないだろう。

しかし、将来的にプロバイダがIPv6対応になった場合には、セキュリティ的に不安が増大するなあ。
光ルータのパケットフィルタを見直すか、再度FreeBSDを間に挟んでipfとかでフィルタするか。FreeBSDを挟む場合はIPv4がNATでIPv6がルータみたいな形になると思うので、もっとv6のことを勉強しないと何がなんだかわからないな。
emacs23に上げてから、puttyなどの端末エミュレータ上でカーソルキーを使うと、実際のカーソル位置とカーソルが表示される位置がずれてしまう問題があった。
何がいけないのかずっとわからなかったんだけど、今回 Emacs 23.2.1 でのカーソルキー動作不良 - doda の日記 と言うページを発見した。
そこで、FreeBSDのportsで入るemacsに適用しようと思ったんだけど、現時点の最新であるemacs23.3にはそのまま適用できないようなので、emacs23.3用に修正してみた。(どうも、2箇所あるpatchのうち、後者だけ取り込まれているようだ)

このファイルを、/usr/ports/editors/emacs/files に patch-src_coding.c と言う名前で置いて、emacsをインストールし直せば、puttyやteraterm上でカーソルキーを使っても位置がずれなくなった。
2011年6月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

このアーカイブについて

このページには、2011年6月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2011年5月です。

次のアーカイブは2011年7月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.1.1