MacPortsのバイナリダウンロードはビルドした時と違うファイルになる場合があるっぽい

MacPortsで入れたgroongaに依存するnodeのnroongaを入れようとしてはまっています。その中でMacPortsのバイナリダウンロードにちょっと問題点がある気がしたのでメモです。

バイナリをダウンロードするとリンクされないライブラリがあるっぽい

バイナリダウンロードport install -b groonga*1
$ otool -L /opt/local/bin/groonga
/opt/local/bin/groonga:
	/opt/local/lib/libgroonga.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	/opt/local/lib/libmsgpack.3.dylib (compatibility version 4.0.0, current version 4.0.0)
	/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
ソースダウンロード & ビルドport install -s groonga
$ otool -L /opt/local/bin/groonga
/opt/local/bin/groonga:
	/opt/local/lib/libgroonga.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	/opt/local/lib/libedit.0.dylib (compatibility version 1.0.0, current version 1.41.0)
	/opt/local/lib/libncurses.5.dylib (compatibility version 5.0.0, current version 5.0.0)
	/opt/local/lib/libmsgpack.3.dylib (compatibility version 4.0.0, current version 4.0.0)
	/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)

試行錯誤の最中だったので、色々とライブラリの有無はあったけど、ある時点においてライブラリ等の環境が同じ状態で、バイナリダウンロードとソースダウンロードで、リンクするライブラリに違いが出ました。

詳細な状況や疑問点など

MacPortsの仕組みのあまり詳しくないので、色々と推測の域を出ない部分が多いです。

$ port info groonga
groonga @2.0.8 (databases)
Variants:             universal

[Snip]

Build Dependencies:   pkgconfig
Library Dependencies: glib2, mecab-utf8, libevent, zmq22, msgpack
[Snip]

まず、インストールしようとしているportはgroongaです。groongaはBuild DependenciesとLibrary Dependenciesの2種類の依存関係を持っています。

groongaを入れても依存しているpkgconfigが入ってなかった。

Requirements:

  • groonga built with MessagePack support
  • pkg-config
GitHub - nroonga/nroonga: A library for building Groonga powered nodes

nroongaではまっているうちに、nroongaのRequirementsにpkg-configがある事に気がつきました。でも、MacPortsでも入れてないし、pkg-configコマンドが無かったので、別の方法ででも入ってなかったみたい。MacPortsのgroongaは、前述の通りBuild Dependenciesでpkgconfigに依存しているのに、入っていません。

以下はあるとよいツールです:

  • pkg-config (ライブラリを検出するため)
  • sudo (ビルドしたgroongaをインストールするため)

追加のライブラリを使いたい場合はこれらのツールを用意しておかなければいけません。

http://groonga.org/ja/docs/install/others.html#dependencies

groongaのドキュメントにはこの様に書いてあって、どうやら必須という訳じゃない様子。だとすると、pkgconfigが依存解決でインストールされないのは、動作としては間違ってない事になります。ただ、MacPortsの依存関係が、こういう形を許すものなのかどうか、あまり詳しくない事もあって疑問が残ります。

ちなみに、Build DependenciesとLibrary Dependenciesは、MacPortsのドキュメントにこんな説明がありました。

  • Build Dependencies

The list of dependencies to check before phases configure, build, destroot, install, and package. Build dependencies are needed when software is being built, but not needed at all once it is installed.

5.4. Dependencies
  • Library Dependencies

The list of dependencies to check before phases configure, build, destroot, install, and package. Library dependencies are needed both at build time (for headers and libraries to link against) and at run time.

5.4. Dependencies
バイナリダウンロードとソースダウンロード

もし依存関係が必須のものしかないなら、ビルド済みのものをダウンロードしても問題はなさそうです。でも、上で確認した様に、どうも依存関係はインストールしてあれば使うけど無ければ使わないし依存解決で入れたりもしないというのも、あり得る様子。そうすると、ライブラリのインストール状況によって、生成されるべきバイナリは違うものになるはず。

$ man port
[Snip]
     -s       source-only mode (build and install from source, do not attempt to fetch binary archives)

     -b       binary-only mode (build and install from binary archives, ignore source, abort if no archive available)
[Snip]

何度アンインストールとインストールを繰り返してもバイナリダウンロードになるので、試しに-sオプションで、ソースダウンロードを強制してみたところ、冒頭の通り同じライブラリのインストール状況で違うバイナリが生成されました。MacPortsのバイナリダウンロードという仕組みが良くないのか、groongaの必須ではなくあれば使うという依存関係が特殊なせいなのか、どちらなのか分からないけど、はまりそうな動きなので注意が必要です。

ちなみに、それぞれ何処からダウンロードされるかというと
$ sudo port install groonga
--->  Computing dependencies for groonga
--->  Fetching archive for groonga
--->  Attempting to fetch groonga-2.0.8_0.darwin_11.x86_64.tbz2 from http://packages.macports.org/groonga
--->  Attempting to fetch groonga-2.0.8_0.darwin_11.x86_64.tbz2.rmd160 from http://packages.macports.org/groonga
[Snip]

バイナリダウンロードの場合。

$ sudo port install -s groonga
--->  Computing dependencies for groonga
--->  Fetching distfiles for groonga
--->  Attempting to fetch groonga-2.0.8.tar.gz from http://packages.groonga.org/source/groonga/
[Snip]

ソースダウンロードの場合。

環境

Mac Mac OS X 10.5.8(Leopard
MacPorts 2.1.2
groonga 2.0.8

*1:自分の場合-bオプション無しでバイナリダウンロードした

yum upgradeとyum updateの違いについて勘違いしてた

yum updateは、よく使うしよく知っているパッケージを最新にアップデートするコマンドだけど、それとよく似たyum upgradeというコマンドがあります。たぶんどこかで読んだんだと思うけど、yum upgradeはメジャーバージョンを上げるコマンドだと、勘違いしていました。yum upgradeについて、調べなおしたので書いておきます。

結論

  • yum upgradeはメジャーバージョンアップ以外にも使う。
  • そもそもyum upgradeyum update --obsoletesと同じコマンド。
  • CentOSのデフォルトでは、設定ファイルにobsoletes=1が書いてあるので--obsoletesは付けなくても付けた扱いになる。
  • --obsoletesをつけると、というかCentOSのデフォルトでは、廃止対象のパッケージがあり、廃止処理される。
  • 廃止処理は、他の新しいパッケージで置き換えられるという形。
    • fooというパッケージが、単にbarという名前に変わった場合、barパッケージがfooを廃止するという情報を持っているので、barをインストールするタイミングでfooが削除される。

補足

yum upgradeをmanから調べる

まず、改めてmanpageを見てみました。

upgrade
Is the same as the update command with the --obsoletes flag set. See update for more details.

yum upgradeyum update --obsoletesと同じみたいです。

update
[snip]
If the main obsoletes configure option is true (default) or the --obsoletes flag is present yum will include package obsoletes in its calculations - this makes it better for distro-version changes, for example: upgrading from somelinux 8.0 to somelinux 9.

If the main obsoletes configure option is true (default) obsoletes configure optionはデフォルト値がtrueなので、常に--obsoletes付いてる扱いになる。
the --obsoletes flag is present yum will include package in its calculations 直訳すると「yumは廃止されたパッケージを計算に含める」と読めるんだけど、具体的にどうなるのかいまいち分からない。
this makes it better for distro-version changes, for example: upgrading from somelinux 8.0 to somelinux 9. ここは分かりやすく、メジャーバージョンを上げるときに良い的な事が書いてあります。

manpageだと結局--obsoletesが具体的に何をするオプションなのか、いまひとつ分からないけど、yum updateyum upgradeは実質同じ動きをするであろう事は分かりました。

検索して見つけた補強情報

そこで、yum の man を見てみたら、upgrade は update + obsoletes フラグ。

If the --obsoletes flag is present yum will include package obsoletes in its calculations - this makes it better for distro-version changes, for example: upgrading from somelinux 8.0 to somelinux 9.

http://linux.die.net/man/8/yum

で、/etc/yum.conf で obsoletes=1 と指定されているので、この二つは同じ機能になってたというわけでした。

http://pub.ne.jp/tkita/?entry_id=1496257

obsoletes configure optionは、どうやら/etc/yum.confobsoletes=1みたい。自分の環境で/etc/yum.confは全然いじってないし、確かにtrueになっている。

いつ効果を発揮するのか

CentOS 5.2 がリリースされてた。

アナウンスによると

Note that the command required is 'upgrade' and not the usual 'update'. Refer to the yum man page for details on how those two differ in operation.

[CentOS-announce] Release for CentOS-5.2 i386 and x86_64

と、バージョンが変わる場合は yum upgrade らしい。

http://pub.ne.jp/tkita/?entry_id=1496257

さっきと同じエントリーだけど、CentOS 5.2リリースのアナウンスで、CentOS 5.0 5.1から移行する場合は、yum upgradeを使うよう指示があるのを見つけていました。つまり--obsoletesを使えって事になる。
このアナウンスから、yum upgrade, --obsoletesはマイナーバージョンアップの際でも使う場合がある事が分かります。

リリースノートには書いてない

Manuals/ReleaseNotes/CentOS5.2/Japanese - CentOS Wiki

余談だけど、メーリングリストのアナウンスには書いてあったupgradeの件、リリースノートには書いてないみたい。

5.5 より前の CentOS からアップグレードする場合、次の手順が勧められています:

yum clean all
yum update glibc\*
yum update yum\* rpm\* pyth\*
yum clean all
yum update mkinitrd nash
yum update selinux\*
yum update
shutdown -r now
Manuals/ReleaseNotes/CentOS5.6/Japanese - CentOS Wiki

CentOS 5.6のリリースノートには、アップグレード手順が書いてあるので、ちょっとなんでだろうという疑問が残る。

結局--obsoletesは何をするのか

obsoletes
This option only has affect during an update. It enables yum’s obsoletes processing logic. Useful when doing distribution level upgrades. See also the yum upgrade command documentation for more details (yum(8)). Default is ‘true’.
Command-line option: --obsoletes

/etc/yum.confのmanpageを見てみると、obsoletes processing logicを有効化するとある。ただ、詳細は要領を得なかったman yumを見ろって書いてある・・・。

1 — Enable yum's obsoletes processing logic when performing updates. When one package declares in its spec file that it obsoletes another package, the latter package will be replaced by the former package when the former package is installed. Obsoletes are declared, for example, when a package is renamed. obsoletes=1 the default.

8.4. Configuring Yum and Yum Repositories - Red Hat Customer Portal

obsoletes processing logicで検索するとRedHatのドキュメントで、やっとそれっぽい解説を発見。どうやら、パッケージが、他のパッケージを廃止して自分が置き換わるというメタ情報を持っていて、obsoletes処理が有効ならそのメタ情報を元に、実際にその置き換えをするという事らしい。で、ありがちなのが、単にパッケージ名が変わった場合という例が書いてあります。

マイナーバージョン・メジャーバージョンが上がった時のリポジトリ
$ yum check-update centos-release
Loaded plugins: fastestmirror, security
Skipping security plugin, no data

centos-release.x86_64                                  10:5-8.el5.centos                                   base

CentOSがマイナーバージョンアップして5.8がリリースされた時、5.7の環境ではcentos-releaseというパッケージが更新対象になります。

$ yumdownloader centos-release
$ rpm -qlp centos-release-5-8.el5.centos.x86_64.rpm 
/etc/issue
/etc/issue.net
/etc/pki/rpm-gpg
/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
/etc/pki/rpm-gpg/RPM-GPG-KEY-beta
/etc/redhat-release
/etc/sysconfig/rhn
/etc/sysconfig/rhn/sources
/etc/yum.repos.d
/etc/yum.repos.d/CentOS-Base.repo
/etc/yum.repos.d/CentOS-Debuginfo.repo
/etc/yum.repos.d/CentOS-Media.repo
/etc/yum.repos.d/CentOS-Vault.repo
/usr/share/doc/centos-release-5
/usr/share/doc/centos-release-5/EULA
/usr/share/doc/centos-release-5/GPL
/usr/share/doc/centos-release-5/autorun-template
/usr/share/eula/eula.en_US
/usr/share/firstboot/modules/eula.py
/usr/share/firstboot/modules/eula.pyc
/usr/share/firstboot/modules/eula.pyo

centos-releaseの内容を見てみると、/etc/yum.repos.d/*、つまりyumリポジトリの設定が更新されます。

  1. centos-releaseが5.8系に更新される。
  2. リポジトリの設定も5.8系になる。
  3. 以後5.8系のパッケージが取得できるようになり、他のパッケージを廃止して置き換わるパッケージが含まれている場合、それをインストールする時にobsoletes処理が走る。

実際に確認してないから多分だけど、こういう流れになるんじゃないかなと思っています。

We need to go ahead and setup the centos-release package as follows:

rpm -Uhv centos-release-*.rpm
http://www.admon.org/update-centos-4-to-centos-5-remotely/

CentOS4からCentOS5への移行を解説するエントリーでは、centos-releaseyumじゃなくrpmを使って手動で更新しています。これによってCentOS5系のリポジトリに切り替わり、yumで更新すると、obsoletes処理も走ってCentOS4時代のパッケージは消え、すべてCentOS5のパッケージになる、ということなのかな。

ただ、このエントリーではかなり色々と下準備をしています。やはりメジャーバージョンアップは、centos-releaseを更新してyumで一発というわけには行かないみたい。多分理想はそうだけど、違いがありすぎてうまくいかないって事なのかな。

廃止されるパッケージを一覧にする
$ yum list obsoletes

実際にobsoletes処理の対象となるパッケージは、これで確認できるっぽい。

環境

サーバー Serversman@VPS Entry
Linux CentOS 5.7

書いた日

2012-08-16
例によって下書きのまま放置してた

Gow+NYAOS+Console2でWindowsにUNIXライクなコンソール環境を入れてみた。

なるべくWindowsでコマンドを扱わないようにしてるけど、ちょっと使う必要が出てきちゃったので、前から耳にしていたNYAOSとかをちょいと入れてみました。コマンドプロンプトで我慢して、作業をやっつけちゃってもいいけど、入れておけば今後もストレスなくコマンド操作が出来るかもしれないですし。

Gow

Home · bmatzelle/gow Wiki · GitHub

Gnu On Windowsを略してGowという名前です。軽量なCygwinと謳っていて、100個を超える open source UNIX applicationsWindowsで使えるようにしてくれます。コマンドプロンプトも使いにくいけど、それよりもdirとか打ちたくないので、とりあえず入れておけば便利かなと思ってます。

$ whereis bash
C:\Program Files (x86)\Gow\bin\bash.exe

bashも使えるようになるみたいだけど、今回はNAOSを使います。

インストール

インストーラーが提供されています。Githubなのにgit cloneしないで使うのがちょっと変な感じ。
特に自分でPATHとか設定しなくても、Gow提供のコマンドは使えるようになりました。

NYAOS

NYAOS.ORG - NYAOS 3000

NYAOS 3000はNihongo Yet Another Open Shell 3.0のコードネームで、いわゆる再帰的頭字語ってやつ。今回初めて入れるので良く知らないけど、3000は付けて書かなくてもいいよね?
UNIXライクなシェルで、日本語の扱いが得意というのが特徴で、他にもメリットあるかもしれないけど、とりあえず入れておけば便利になります。

NYAOS --- Nihongo Yet Another Open Shell は、
32bit系Windows,OS/2 で動作するコマンドラインシェルです。
 
特徴として次のようなものがあります。
 
    - tcsh ライクな編集機能(Ctrl-F/B/A/E等)
        Ctrl-F,B,A,E,P,N など tcsh で慣れた操作で、編集することが
        できます。カスタマイズすることも可能です。
    - 強力なファイル名補完機能
        基本的に tcsh 準拠な補完ですが、普通の UNIX系シェルとは違い
            - 大文字・小文字を区別しない
            - 空白を含むファイル名には引用符を補う
            - 補完するパス区切り記号(¥or/)を自動判断
            - コマンド名補完の場合は、実行可能ファイル名のみを候補とする
        といった Windows 固有のファイルシステムの特徴にあった補完を
        提供します。
            例:「cd /prog」→「cd "/Program Files/"」
              「cd \prog」→「cd "\Program Files\"」
    - 内蔵カラー ls
    - ヒストリ機能(Ctrl-P)
        tcsh ライクな行単位のヒストリや、Vzライクな単語単位のヒストリを
        持っています。また、「!」によるヒストリ参照も「option +history
        で有効になります。
    - エイリアス機能(alias命令)
        コマンドに別名をつけることができます。
        (例: alias rm rm -i)
    - キーカスタマイズ機能(bindkey命令)
    - 逆クォートによる、外部コマンド出力の引用機能
    - クリップボードとのアクセスも可能(Ctrl-K,Ctrl-Y)
    - Lua 5.1.4 による動作のカスタマイズ
 
NYAOSレジストリの類を利用しませんので、アンインストールはファイルを
消すだけとなります。

http://www.nyaos.org/nyaos_ja.txt
インストール

ZIPをダウンロードして好きな場所に配置。付属のドキュメント(nyaos_ja.txt)には「NYAOS.EXE を PATH の通ったディレクトリにおいて、実行してください」とあったけど、Console2から使う分にはPATH通さなくても大丈夫っぽい?

Console2

Console download | SourceForge.net

ターミナルエミュレーターコマンドプロンプトじゃストレスが溜まるし、シェルにNYAOSを指定する方法も分かりやすかったので入れました。タブ機能があり、タブ毎にシェルを指定できるらしいです。

Edit > Settings...を開いてShell:nyaos.exeのパスを指定すればNYAOSをシェルとして動作します。マウスでの選択、コピーが好みじゃなかったので、同じくSettingsのHotkeys > Mouseで変更しました。

インストール

ZIPをダウンロードして好きな場所に配置。

http://sourceforge.net/projects/console/files/ではconsole-develとconsole-releasesがあります。console-releasesの方は2005年から動いてなくバージョンも1系です。console-develの方には2系があるけど、ZIPのファイル名にはBetaの文字が入ってます。Betaのまま6年もきてるみたいなので、区切りを付けてStableを出す開発スタイルじゃなくなったってことなのかな。

環境

OS Windows7 Professional 64bit
Gow Gow-0.7.0
NYAOS nyaos-3.2.0_7-win.zip
Console2 Console-2.00b148-Beta_64bit.zip

Windows7のXPモードにサーバーを立てて別PCからアクセスする

XPモードのほうにちょっとサーバー的なものを立ち上げて、隣にあるMacBookからアクセスしたいって事があって、色々と試行錯誤しました。簡単にやる方法も見つかってたけど、途中から手段が目的になって、色々調べたのでまとめておきます。

前提

XPモードはWindows VirtualPCによる仮想マシンなので、VirtualBoxVMwareなどと同じように、ホスト(Windows7)とゲスト(XPモード)という関係になります。Windows VirtualPCが微妙な事に、ネットワークをNATにした場合に、*1ポートフォワード機能を持ってません。ネットワークアドレスは変換するけど、ポートは見てないわけです。
他の手段として調べてみたけどWindows7でもiptablesのFORWARDみたいな事がしたくってやってみたら出来なくなってた - kanonjiの日記で、ホスト側の転送機能はWindows7から使えなくなっている事が分かりました。

ネットワークをブリッジすればそもそも簡単

一番簡単な方法です。デフォルトでは共有ネットワーク(NAT)になっているネットワークの設定をブリッジに変更するだけです。ホストと同じネットワークに参加し、同じネットワークから普通にアクセス出来ます。

ブロードバンドルーター(ゲートウェイ) 192.168.1.1
ホスト 192.168.1.2
MacBook 192.168.1.3
XPモード 192.168.1.4

まぁこんな感じで、ホストからXPモードも、MacBookからXPモードも、その逆も通信可能です。

なんとかNATのままでやる方法

ブリッジ使うと終わってしまうのだけど、IPアドレスが管理されててブリッジにしてホストと同じネットワークのIPを取得するには許可が必要だとか、ホストがノートPCで、公衆無線LANとか使うからブリッジはしたくないとか、そういう場合になんとかNATのまま、XPモードと通信する方法を調べました。

NATの場合の前提

Interactive shell for nwdiag

VirtualPC NAT Routerと実物のRouterが繋がっちゃってるあたりが、ちょっとおかしいけど*2、概ねこんな感じのネットワークになります。VirtualPC NAT Routerは実際には存在しない仮想のルーターで、Main LANネットワーク側のIPは持ってません。
なので、ホスト側からVirtualPC NAT Routerにアクセスしたり、VirtualPC NAT Routerを介してXPモードにアクセスする経路がありません。あと、RouterからもVirtualPC NAT Routerは検知出来ないので、本当はつなげちゃうとちょっとおかしな事に。ネットワーク図で表せない形でVirtualPCがうまいこと変換してるんだと思います。

XPモード 192.168.131.65
ゲートウェイ 192.168.131.254
DHCP 192.168.131.254
DNS 192.168.1.1

XPモード側のネットワークの設定は、すべてDHCP*3任せとなっていて、こんな設定になります。
ここでおかしいのがDNSで、なぜかMain LANネットワークにあるブロードバンドルーターを指定しています。前述の通り、ネットワーク図的にはつなげられない経路で、実際にXPモードからping 192.168.1.1しても応答ありません。

詳しくは後で補足に書くけど、ブラウザからいろんなところにアクセスする分には、DNS設定がこのままでも何故か問題ありません。が、色々考えてこれはバグなんじゃないかと思っています。

準備

Windows VirtualPCのNATだと、ポートフォワード機能がないどころか、どうやらホストからはアクセス出来ないネットワークになっている様子。VirtualPCの場合、どうやらブリッジにしないとホストとゲスト間の通信が出来ないようで、とはいえ前述の通りそのままブリッジを使うのは避けるのが目的です。
そこでMicrosoft Loopback Adapterを使います。Windows7Microsoft Loopback Adapterを追加し、VirtualPCの設定でXPモードにNICを追加して、NATとMicrosoft Loopback Adapterのブリッジの2つのNICを設定することで、ゲストからインターネットへはNAT、ホストとゲスト間はMicrosoft Loopback Adapterブリッジで通信する方法です。

  1. [スタート] ボタンをクリックし、[設定] をポイントします。次に [コントロール パネル] をクリックし、[ハードウェアの追加と削除] をダブルクリックします。
  2. [デバイスの追加/トラブルシューティング] をクリックし、[次へ] をクリックします。
  3. [新しいデバイスの追加] をクリックし、[次へ] をクリックします。
  4. [いいえ、一覧からハードウェアを選択します] をクリックし、[次へ] をクリックします。
  5. [ネットワーク アダプタ] をクリックし、[次へ] をクリックします。
  6. [製造元] ボックスの一覧で、[Microsoft] をクリックします。
  7. [ネットワーク アダプタ] ボックスの一覧で、[Microsoft Loopback Adapter] をクリックし、[次へ] をクリックします。
  8. [完了] をクリックします。

Microsoft Loopback Adapterのインストールはこんな手順。

  1. XPモードの設定のネットワークで、ネットワークアダプタの数を2に設定。
  2. アダプター1は「共有ネットワーク(NAT)」のまま。
  3. アダプター2に「Microsoft Loopback Adapter」を選択*4
IP 192.168.200.1
サブネットマスク 255.255.255.0
ゲートウェイ 192.168.200.2

ホスト側でMicrosoft Loopback AdapterにIPアドレスを静的に設定。

IP 192.168.200.2
サブネットマスク 255.255.255.0
ゲートウェイ 設定するとインターネットへ出る通信がNATではなく、このブリッジの方を通ってしまう可能性がある

ゲスト側にもMicrosoft Loopback AdapterにIPアドレスを静的に設定。
これでホスト/ゲスト間の通信経路は確保できて準備完了です。

Interactive shell for nwdiag

Microsoft Loopback Adapterを使ってブリッジを組むと、ネットワーク図はこんな感じなります。これでホストや図でMain LANとなっている同じネットワーク上のPCからの経路が出来ました。

方法1) sshポートフォワード

Linuxであればよく使う手段でsshポートフォワードがあります。ただ、Windowsだとsshクライアントはいくつか選択肢があるけど、sshdに関しては正直微妙。オープンソースではないfreeSSHdか、cygwin.dllを同梱したOpenSSH for Windows、あとはCygwinを入れるくらい。

$ ssh -L 14444:192.168.200.2(XP-mode):4444 192.168.1.2(Win7)

ローカルフォワード。MacBookからWindows7sshコネクションを張り、MacBookのポート14444をWindows7を介してXPモードのポート4444に転送します。

$ ssh -R 14444:192.168.200.2(XP-mode):4444 192.168.1.3(MacBook)

Windowssshdを立てるのが割りと面倒なので、逆にリモートフォワードという手があります。上記と同じようにMacBookのポート14444をXPモードの4444に転送する目的は同じだけど、sshコネクションはWindows7からMacBook上のsshdに張ります。別PCもWindowsだと、どちらにせよsshdを立てないとだけど、Macならsshdは組み込まれてるので簡単です。

方法2) stone

アプリケーションレベルのTCP/UDPリピーターのstoneを使う方法です。stoneは存在は知ってたけど今まで使う機会も無かったので、試しに使ってみることにしました。

C:\path\to\stone.exe 192.168.200.2:4444 14444
Aug 26 12:09:19.075000 7076 start (2.3e) [4368]
Aug 26 12:09:24.208000 7076 stone 124: 192.168.200.2:4444 <- 0.0.0.0:14444

ホストであるWindows7でstoneを起動すると、ホストの1444ポートへの通信をXPモードの4444ポートに転送できます。ホスト側で何か用意するなら、stoneはコンパクトでシンプルなのでsshdを立てるよりもstoneの方が気軽かも。udpだけとかsslとか、起動オプションの指定次第で色々出来る。

方法3) ルーティングテーブル書き換え

ここまでくると、やってみたいからという手段が目的化してるんだけど、ルーティングテーブルの書き換えもやってみました。MacBookは持ち歩いて使うから、この設定は常用しないけど。

$ sudo route add -net 192.168.200.0/24 192.168.1.11
add net 192.168.200.0: gateway 192.168.1.11

MacBookのルーティングテーブルに、XPモードが居るブリッジネットワークへ、Windows7を経由する経路を設定。

C:\Documents and Settings\XPMUser>route add 192.168.1.0 mask 255.255.255.0 192.168.200.1

逆にXPモードからMacBookに応答するための経路も、同様にWindows7を経由する経路を設定。

$ traceroute -I 192.168.200.2
traceroute to 192.168.200.2 (192.168.200.2), 64 hops max, 60 byte packets
 1  192.168.1.11 (192.168.1.11)  1.887 ms *  0.413 ms
 2  192.168.200.2 (192.168.200.2)  1.387 ms  1.009 ms  0.731 ms

これだけで、MacBookからXPモードに、転送的なこと無しで通信出来るようになります。-IオプションはICMPを使うようにするオプション。どうやらデフォルトだとtracerouteはUDPを使うようで、どっかのファイアウォールUDPが止まってて、tracerouteで経路が確認出来なかったので。

$ netstat -rn -f inet

MacIPv4に限定してルーティングテーブルを確認するコマンド。

>route PRINT

WindowsXPでルーティングテーブルを確認するコマンド。

補足

VirtualPCとXPモードのデフォルト設定は不可解
C:\Documents and Settings\XPMUser>nslookup www.google.co.jp
DNS request timed out.
    timeout was 2 seconds.
*** Can't find server name for address 192.168.1.1: Timed out
*** Default servers are not available
Server:  UnKnown
Address:  192.168.1.1

DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
*** Request to UnKnown timed-out

デフォルト設定だと、ゲートウェイDHCPVirtualPCの仮想ルーターなのに、DNSだけ実ルーターに設定されます。そこは通信出来ないはずで、その通りnslookupでルックアップ出来ません。

C:\Documents and Settings\XPMUser>ping www.google.co.jp

Pinging www-cctld.l.google.com [74.125.235.151] with 32 bytes of data:

Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 74.125.235.151:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

なのに、pingコマンドにドメイン渡すとIPが引けて、ブラウザからドメイン入力しても普通にアクセスできます。

C:\Documents and Settings\XPMUser>nslookup www.google.co.jp
DNS request timed out.
    timeout was 2 seconds.
*** Can't find server name for address 192.168.131.254: Timed out
*** Default servers are not available
Server:  UnKnown
Address:  192.168.131.254

Non-authoritative answer:
Name:    www-cctld.l.google.com
Addresses:  74.125.235.183, 74.125.235.191, 74.125.235.184
Aliases:  www.google.co.jp

ゲートウェイ/DHCPが192.168.131.254なんだから、ほんとはDNSも192.168.131.254なんじゃないかと思って設定してみたけどダメでした。ただ、別のサーバーが応答してくれたようです。仕組みは謎。あと、ブラウザで2秒のルックアップのタイムアウトを感じなかった。

C:\Documents and Settings\XPMUser>nslookup www.google.co.jp
Server:  google-public-dns-a.google.com
Address:  8.8.8.8

Non-authoritative answer:
Name:    www-cctld.l.google.com
Addresses:  74.125.235.95, 74.125.235.87, 74.125.235.88
Aliases:  www.google.co.jp

よく分からないので、とりあずGoogle Public DNSを設定してお茶を濁してみました。

環境

OS Windows7 Professional 64bit

書いた日

2012-08-11
例によって下書きのまま放置してた

*1:VirtualBoxなどの他の仮想化は当たり前に出来る

*2:こうとしか書きようが無いし

*3:VirtualPC NAT Router

*4:VirtualPCでは、ブリッジとは書いてなく、NICを選択するとそのNICを使ったブリッジになる。

.soや.dylibや.aファイル、共有ライブラリなどについて調べてみた

MacPortsでswftools@0.9.2を入れようとしたら失敗した - kanonjiの日記MacPortsで入れる代わりに自前でビルドしたライブラリを使ってswftoolsをビルドしてみた - kanonjiの日記で、ビルドする時のライブラリについての知識が足りず困ったので、ちょっと調べてみました。基本的にLinuxについて調べてて、Macについても分かったところがあるって感じです。
ちゃんとまとめるほど理解出来てるわけじゃないので、分かった事を並べる感じで書きます。勘違いしてたり、ちょっと用語がおかしかったりするかもしれません。

LinuxMacでは仕組みが違う

LinuxではELF(Executable and Linking Format)という実行ファイルフォーマットがあって、この辺を調べていくとよくELFという単語を見かけます。
Macはというと、Mach-Oという実行ファイルフォーマットが採用されています。
別にUnix(Mac)とLinuxで分かれているわけじゃなく、ELFはBSD系の一部とかSolarisでも使われているんだとか。

Linuxのライブラリの分類

Interactive shell for blockdiag

Linux 動的ライブラリーの徹底調査にあった画像を元に、調べた補足も加えつつ図を描きなおしました。後でリンク切れになってもやだし。

  • .aファイルはStaticライブラリ
  • .soはShared Objectで、Sharedライブラリ。
  • 厳密には共有ライブラリって言葉はSharedライブラリの事だと思うけど、Dynamic Linking(動的リンク)して使う方を指す事が多い。
  • Dynamic Loadingも*1共有ライブラリの一種。
  • Dynamic Loadingはダイナミックライブラリと呼ばれる事もある。

共有ライブラリのDynamic LinkingとDynamic Loadingについて

図の参考にしたIBMの記事が英語だったから、そのまま書いてるけど、Dynamic Linkingとは動的リンクして使う共有ライブラリって事だと思う。逆にDynamic Loadingは動的ローディングして使う共有ライブラリだと思います。

共有ライブラリは、プログラムの実行時にロードされます。マシンによっては、 その共有ライブラリがなかったり、バージョンが違ったりして、動作しないことがあります。 .so と .sa で終わるファイルです。.sa は、古い a.out 形式で使われた共有ライブラリです。
ダイナミックライブラリは、共有ライブラリの1種です。実行時に 関数を使って ロードしたり、アンロードしたりできます。

ƒ‰ƒCƒuƒ‰ƒŠ‚ÌŠî‘b’mŽ¯

ただ、Dynamic Loadingを共有ライブラリと呼んで、Dynamic Loadingをダイナミックライブラリと呼んで分けている記事もありました。

MacMach-Oでは

Mach-0 の仕様の一つで,多くの人を驚かせるものとして, 共有ライブラリ と 動的ローダブル・モジュールを厳密に区別する点があります. ELF システムでは両者は同質で,共有コードのどの部分でも,ライブラリとしても動的ローディングにも使うことができます.

Mach-O 共有ライブラリ のファイルタイプは MH_DYLIB で,拡張子は .dylib となります. これは通常の静的リンカフラグ,例えば libfoo.dylib の場合は -lfoo でリンクすることができます. しかし,モジュールとしてロードすることはできません.

Fink - 移植 - 共有コード

まず、Dynamic Loadingの事を動的ローダブル・モジュールと、モジュールと呼んでます。なので、この記事では、共有ライブラリ=Dynamic Linkingになるっぽい。

  • LinuxではDynamic LinkingもDynamic Loadingも同じ物で、使い方の問題として、Dynamic LinkingとDynamic Loadingがある。
  • Dynamic Loadingで使う場合、ライブラリとしてというより、モジュールとしてという捉え方が正しいのかもしれない。
  • MacではDynamic LinkingとDynamic Loadingは厳密に区別されている。

ローダブル・モジュールは Mach-O の用語では"バンドル"と言われ,ファイルタイプは MH_BUNDLE です. これを用いるコンポーネントは拡張子を気にしないので,拡張子は何でも構いません. .bundle という拡張子が Apple の推奨ですが,移植されたソフトウェアのほとんどは,互換性のため .so を使っています. バンドルは dyld API を用いて動的にロード/アンロードされることができますし,この API の上に dlopen() をエミュレートするラッパもあります. バンドルを 共有ライブラリ のようにリンクすることはできませんが,バンドルを 共有ライブラリ にリンクさせることは可能です. この場合,バンドルがロードされた際に両者ともロードされます.

Fink - 移植 - 共有コード

同じ記事の続き。

  • Dynamic Loadingに当たるものは、Mac側ではバンドルと呼ばれる。
  • Dynamic Linkingな共有ライブラリは.soではなく.dylibファイル。
  • Dynamic Loadingの方は.bundleが推奨されるが、Linuxからの移植の場合、拡張子は.soのままな事が多い。

余談

よく知らない分野の事で、同じことを指す言葉が色々あって、とりあえず最初に見かけたのを軸にしてみたけど、すっごい分かりにくいね。Dynamic LinkingとDynamic Loadingじゃ無くて別の言葉を軸にすればよかったかも。この2つ、どう呼ぶのが多くの人に分かりやすいんだろう?

書いた日

2012-08-11
例によって下書きのまま放置してた

*1:前述の通り共有ライブラリといえばDynamic Linkingの事を指す事が多いけど

Firefoxをまた使い始めたのでアドオンを整理

Firefoxをまた使っていくことにしたので、アドオンを整理しました。稀に環境を作り直すはめになったり、新しいPCをセットアップして使うことになったり、しないとも限らないので、そういう時のために書いておきます。

Firefoxは、もう長いことFirebugを中心に、開発・制作ツールとしてだけ使ってました。正直、これに関してはChromeデベロッパーコンソールよりも、Firebugの方がかなり使いやすい。なので、開発用と普段使い用でプロファイルを分けて、両方起動出来る様にしました。それぞれ入れるアドオンも分けています。

普段使い用

兼用

書いた日

2012-07-23
例によって下書きのまま放置してた

古いMacであるLeopardでFirefoxのプロファイルマネージャーを起動する方法

$ /Applications/Firefox.app/Contents/MacOS/firefox-bin -p
dyld: unknown required load command 0x80000022
Trace/BPT trap

Firefoxのプロファイルを作りたくて、プロファイルマネージャーを開こうとしたら、こんなエラーが出ました。-pオプションを外したり、--helpとかにしても、同じエラーが出ます。

解決策

$ arch -i386 /Applications/Firefox.app/Contents/MacOS/firefox-bin -p

あまり細かい事は理解してないですがarch -i386を付けることで、プロファイルマネージャーが起動するようになりました。

Here's an Explanation. Basically you need to add "arch -i386 " at the beginning of the command because 10.5 is 32-bit only and more recent versions of Firefox default to 64-bit.

http://support.mozilla.org/sv-SE/questions/838031#answer-206598

詳細は引用にあるリンク先で解説されてると思いますが*1、どうやらFirefoxが64bitベースになった事で、32bitのLeopardだと、アーキテクチャの指定が必要になるという事みたい。
でも、Windows7に入れたFirefoxC:\Program Files (x86)\Mozilla Firefoxに入るから32bitだと思うけど、MacFirefoxは64bitになったって事なんだろうか?

補足

プロファイルマネージャーを使用して、Firefox のプロファイルを作成または削除する | Firefox ヘルプ

プロファイルマネージャーについての、Mozilla公式のヘルプページ。WindowsでアクセスするとWindowsの、MacでアクセスするとMacの解説が表示されます。右下に、OSやFirefoxのバージョンを切り替えるリンクがあります。

環境

Mac Mac OS X 10.5.8(Leopard
Firefox 14.0.1

書いた日

2012-08-08
例によって下書きのまま放置してた

*1:読んでません。