SOCKS プロキシを使って学内 (社内) 限定ページに接続する

学内ネットワークに接続している場合にだけ閲覧可能な、学内限定ページというものが世の中には存在します。大学に限らず、民間企業でもそういうものが存在するでしょう。名古屋大学の場合は全学の事務連絡や給与明細の閲覧がこれに該当し、自宅で仕事しているとき、出張中のときに非常に不便です。また学外からだと論文の閲覧もできません。

解決方法は以下のようにいくつか存在しますが、今回は SOCKS プロキシを使う方法をまとめておきます。知っている人には当たり前の情報かもしれませんが、複数の同業者がこれを知りませんでした。

  1. VPN を使う。ただし、名古屋大学は全学の VPN を用意してくれていないので駄目。
  2. SSH で学内のサーバに接続し、Firefox などを X で飛ばす。ただし、海外出張中の場合 (=遅延時間が長い) や回線が細い場合には X を飛ばすのは速度面から現実的ではない。
  3. VNC で画面を飛ばす。海外出張中の場合は、X を飛ばすよりは体感速度が圧倒的に優れるが、それでもまだ遅く、firewall の設定等も必要。
  4. VNC と同様だけど、Mac の場合は Back to My Mac (どこでも My Mac) を使って学内の Mac に接続して画面を飛ばす。Firewall の設定を気にしなくて良い場合が多いものの、Back to My Mac を使えない外部環境があったり (例えばレスター大学の eduroam)、接続先が反応しない場合がある。
  5. SOCKS プロキシを使う。簡単で早い。

用意するもの。

  • OS X の動いている Mac (別に Windows でも Linux でも同様にやれるので、"SOCKS Linux" などでググってください)
  • 学内に存在する SSH サーバ

さて、やることは簡単で、学内サーバに外から SSH で入れるものに接続します。ただし、-D という option をつけてやることで、SOCKS を使った port forwarding が可能になります。

$ ssh -D 1080 MY_ACCOUNT@foo.bar.ac.jp

  このあと、Mac の System Preferences から Network → Advanced… → Proxies で SOCKS Proxy を入にし、SOCKS Proxy Server の欄を 127.0.0.1:1080 にしておきましょう。

以上の作業で、SSH の接続している間は学内からネット接続をしているように見えるはずです。

ただし、SSH の接続が切れたのに SOCKS Proxy が動作したままだと、ネット接続ができなくなります。また GlimmerBlocker を使って広告ブロックをしている場合は Web Proxy (HTTP) が入になっているため、SOCKS とぶつかってしまうようです。そのため、SOCKS Proxy を入にするときは Web Proxy (HTTP) を切に、またその逆のときは入にという作業を手でやらなくてはいけないため面倒です。

そこで、OS X の networksetup コマンド使って shell から操作しましょう。

Automatic SOCKS proxy setup through SSH connection ...

自分の場合は Web Proxy (HTTP) の切り替えも自動でやりたいので、少し改造した script を使っています。

gist16c55d8b451b431848c0

この networksetup コマンドは /usr/sbin にあって、sudo じゃないと走りません。いちいちパスワードを聞かれるのも面倒なので、必要な場合は visudo で /usr/sbin/networksetup に実行権限を与えておきましょう。

$ sudo visudo 

として、

# For SOCKS proxy

YOUR_ACCOUNT ALL=(root) NOPASSWD: /usr/sbin/networksetup

とでも追加しておきましょう。

Eclipse CDT から clang-format を使って書式整形をしよう

そろそろ物理屋さんも vim とか Emacs でソフト開発するのやめませんか? Eclipse とかにしませんか? ということで、ソフトをバリバリ書いてる人は Eclipse CDT (宇宙・素粒子系の物理屋Java 使わない) をご使用中のことと思います。

LLVM/Clang実践活用ハンドブック

LLVM/Clang実践活用ハンドブック

Eclipse4.4 完全攻略 (完全攻略シリーズ)

Eclipse4.4 完全攻略 (完全攻略シリーズ)

さて、Eclipse CDT など IDE の便利な機能にコードの自動整形 (formatter) があります。自分も最近は複数人でソフトの共同開発をすることが多くなってきたので、Google の coding style で統一しようという話になったのですが、意図的に特殊な整形を自分でしていた箇所まで整形し直してくれちゃうものだから、これは不便でしょうがない。

例えば、以下のコードは意図的にスペースを多用しています。

CI[ 5] = D[13] ^ D[12] ^ D[11] ^ D[ 9] ^ D[ 8] ^ D[ 5] ^ D[ 4] ^ D[ 0] ^
         C[ 0] ^ C[ 4] ^ C[ 5] ^ C[ 8] ^ C[ 9] ^ C[11] ^ C[12] ^ C[13];
CI[ 6] = D[14] ^ D[13] ^ D[12] ^ D[10] ^ D[ 9] ^ D[ 6] ^ D[ 5] ^ D[ 1] ^
         C[ 1] ^ C[ 5] ^ C[ 6] ^ C[ 9] ^ C[10] ^ C[12] ^ C[13] ^ C[14];
if (asic == 0) {
  WriteRegisterPartially(0x4D, channel,      channel,      enable ? 0x1 : 0x0);
} else if (asic == 1) {
  WriteRegisterPartially(0x4D, channel + 16, channel + 16, enable ? 0x1 : 0x0);
} else if (asic == 2) {
  WriteRegisterPartially(0x4E, channel,      channel,      enable ? 0x1 : 0x0);
} else if (asic == 3) {
  WriteRegisterPartially(0x4E, channel + 16, channel + 16, enable ? 0x1 : 0x0);
}

これに Eclipse CDT で自動整形をかけるとどうなるかというと、Google スタイルの場合はそれぞれ次のようになります。読めやしませんね。

CI[5] = D[13] ^ D[12] ^ D[11] ^ D[9] ^ D[8] ^ D[5] ^ D[4] ^ D[0] ^ C[0]
    ^ C[4] ^ C[5] ^ C[8] ^ C[9] ^ C[11] ^ C[12] ^ C[13];
CI[6] = D[14] ^ D[13] ^ D[12] ^ D[10] ^ D[9] ^ D[6] ^ D[5] ^ D[1] ^ C[1]
    ^ C[5] ^ C[6] ^ C[9] ^ C[10] ^ C[12] ^ C[13] ^ C[14];
if (asic == 0) {
  WriteRegisterPartially(0x4D, channel, channel, enable ? 0x1 : 0x0);
} else if (asic == 1) {
  WriteRegisterPartially(0x4D, channel + 16, channel + 16,
      enable ? 0x1 : 0x0);
} else if (asic == 2) {
  WriteRegisterPartially(0x4E, channel, channel, enable ? 0x1 : 0x0);
} else if (asic == 3) {
  WriteRegisterPartially(0x4E, channel + 16, channel + 16,
      enable ? 0x1 : 0x0);
}

実は EclipseJava を書く場合には次の記法でコードを「保護」することができます。off/on で囲まれた箇所は、自動整形が無視されます。

// @formatter:off
System.out.println("Hello World!");
// @formatter:on

しかし Eclipse CDT ではこの機能が実装されていないため (Java に比べて色々と貧弱)、Eclipse の標準機能だけでは C++ のコードに自動整形をかけると悲しいことになります。さて、じゃあどうやって自分の手動整形を保護するかというと、外部の formatter と Eclipse plugin を使って解決します。

clang-format を入れる

clang-format とは、その名の通り Clang に付属する formatter です。コマンドラインから動作し、C/C++/ObjC のファイルを整形することができます。ただし、OS XXcode を入れても付属してきません。以下の方法で自分で build します。ここでは、ver 3.7 以降 (近日公開される予定) を入れます (ここらへん参照)。バイナリの配布されている 3.5 では、以下の説明の機能は動作しません。

$ svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
$ cd llvm/tools
$ svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
$ cd ../..
$ cd llvm/projects
$ svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
$ cd ../..
$ ./configure  --enable-optimized
$ make -j 8
$ sudo mv Release+Asserts/bin/clang-format /usr/local/bin/

これで、/usr/local/bin に clang-format が入ります。他のものは一切必要ありません。OS X に入っている標準の Clang が 3.5 でも、clang-format は単体で動作するので、Clang 自体を汚す危険もありません。

CppStyle を入れる

次に、clang-format を Eclipse で使うための plugin を導入します。https://github.com/wangzw/cppstyle の説明の通りですが、以下のようにします。

$ sudo curl -L "http://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py" -o /usr/local/bin/cpplint.py
$ sudo chmod a+x /usr/bin/cpplint.py

次に http://wangzw.github.io/CppStyle/updateEclipse の Help → Install New Software で追加したあと Eclipse を再起動し、Preference → C/C++ → Code Style → Formatter から Code Formatter を CppStyle (clang-format) にします。そのままにしておくと、Google スタイルが適用されます。

さて、clang-format では手動で整形した箇所を保護する機能があります。以下のようなコメントを追加することで、off/on の間に挟まれた領域は,clang-format の整形が適用されません。めでたしめでたし。繰り返しますが、Clang 3.5 の clang-format では動作しません。

if (asic == 0) {  // clang-format off
  WriteRegisterPartially(0x4D, channel,      channel,      enable ? 0x1 : 0x0);
} else if (asic == 1) {
  WriteRegisterPartially(0x4D, channel + 16, channel + 16, enable ? 0x1 : 0x0);
} else if (asic == 2) {
  WriteRegisterPartially(0x4E, channel,      channel,      enable ? 0x1 : 0x0);
} else if (asic == 3) {
  WriteRegisterPartially(0x4E, channel + 16, channel + 16, enable ? 0x1 : 0x0);
} else { // clang-format on