SSH ポートフォワーディングによるトンネリング、2例

また、自分用のメモです。

以下のような環境があるとします。

  • ネットワーク外部からの SSH アクセスをうけつけるサーバがある。
    • ホスト名は miku (仮名) とします。
  • ネットワーク内部のみからアクセスできるサーバがある。
    • SSH ログインと HTTP アクセスを受け付けます。
    • ホスト名は luka (仮名) とします。
  • 外部からは negitoro.dyndns.example.com (仮名) で miku にアクセスできるとします。

以下は、外部の Mac OS X から miku の SSH を経由して luka にアクセスする操作の例のメモです。Linux でも同様になると思います。Windows は知らん。

HTTP のフォワーディング

Terminal.app で以下のようにオプションをつけて ssh ログインします。

Mac $ ssh -L 8080:luka:80 negitoro.dyndns.example.com
Last login: Fri Apr 22 19:32:44 JST 2011 from roadroller.example.co.jp on pts/1
miku $

ログインしている間は、Maclocalhost 8080 番ポートへのアクセスが、miku を経由して luka の 80番ポートにフォワーディングされます。

luka にあるファイルを Mac から Emacs の Tramp で編集する

Mac の ~/.ssh/config ファイルに以下の内容を追記します。

Host forwarding
HostName localhost
Port 22222

以下のようにオプションをつけて ssh ログインします。

Mac $ ssh -L 22222:luka:22 negitoro.dyndns.example.com
Last login: Fri Apr 22 19:32:44 JST 2011 from roadroller.example.co.jp on pts/1
miku $

ログインしている間は、Maclocalhost 22222 番ポートへのアクセスが miku 経由で luka の 22番ポートにフォワーディングされます。また、localhost:22222 には forwarding という別名で SSH アクセスできるようなります。

こうすると、Mac で動いている Emacs でファイルを開くときに /forwarding: というプレフィクスをつけることで、luka のファイルにアクセスできるようになります。

Mac OS X 10.6 Snow Leopard 使用開始メモ

そろそろ Lion が出ようか、って時に何をいまさら、という話ですが。

この手のセットアップ手順のメモは、いつかちゃんと作ろうといつも思ってるんですが、一度もちゃんと作れたことがないです (中途半端で終わった例)。先日つい注文してしまった MacBook Air が届いたので、今度こそちゃんとメモしながらセットアップしようかと。

この記事は、随時更新していくつもり。

概要

  • セットアップ対象のハードウェアは MacBook Air 11-inch。最小構成からメインメモリだけ 4GB に増やしたもの。(MBAir 11.6/4GB/64Flash/JPN、Model No: A1370 と外箱下面のラベルにある。)
  • プリインストールされている Max OS X 10.6 Snow Leopard をそのまま使う
  • 現在、メインで使っている MacBook のデータは引き継がない
  • Boot Camp などによる Windows インストールは、この Mac にはしない

利用目的

インストールするソフトウェアや、その他、使用可能にしたいもの、こと。

Mac OS X セットアップ

Mac の初回起動時、自動的に Mac OS X のセットアップが走る。これは指示通りに必要な情報を入力して行くだけ。

  • 別の Mac から情報を移行するか聞かれるが、今回はしない。
  • この時点で、自宅の無線 LAN については設定が済む。

セットアップが終了したら、とりあえずソフトウェア・アップデートを行う。

細かい操作の設定

  • トラックパッドのタップを有効にする
  • Spaces を有効にする
  • 画面のコーナーへの機能割り当て
    • 右上をデスクトップ
    • 右下を Spaces
  • Spotlight の起動キーを Ctrl+Shift+Space に変更する (Emacs の set-mark-command とかぶらないように)
  • Dock に登録されてるアプリケーションは全部消す (アプリケーションの起動は Spotlight から行う)
  • Dock を隠す
  • 日付を表示する

Google Chrome のインストール

…は、特に書くことないか。

Xcode のインストール

MacPorts, Haskell Platform のインストールに必要。

Sign In - Apple からダウンロードしてきて (登録が必要)、インストーラを実行するだけ。

MacPorts のインストール

http://osx.miko.org/index.php/Beginning_OS_X_10.6/%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E6%95%B4%E5%82%99%E7%B7%A8 を参考に

MacPorts のインストール
  1. ソースを入手
    • さすがに svn co まではしない。tar 玉をダウンロードすればおk。
  2. 適当なところにソースを展開し、./configure && make
  3. sudo make install
  4. 一時的にパスをとおす。export PATH=/opt/local/bin:$PATH
  5. sudo port selfupdate
各種プログラムのインストール
$ sudo port install git-core +svn +bash_completion
$ sudo port install lv

Emacs.app のインストール

これも MacPorts でインストール

$ sudo port install emacs-app

各種設定ファイルの編集

~/.bash_profile

とりあえず、これだけ。

INPUTRC=~/.inputrc
PS1='\n\[\033[32m\]\u@\H:\w\[\033[0m\]\n$ '

PATH=/usr/bin:/bin:/usr/sbin:/sbin
PATH=${PATH}:/usr/X11/bin
PATH=/opt/local/bin:${PATH}
PATH=/usr/local/bin:${PATH}
PATH=${HOME}/Library/Haskell/bin:${PATH}

export PATH

export PAGER=lv

alias ls='ls -GF'
~/.inputrc
set completion-ignore-case On
~/.MacOSX/environment.plist

まだ

~/.emacs.d/init.el

https://gist.github.com/176797 にメモってある内容から必要な部分をコピペ。

あと、gist にはメモってないけど、MacEmacs でふつうにバックスラッシュを入力するのに以下の設定が必要。(参考: MacなEmacsでバックスラッシュを簡単に入力したい - Watsonのメモ)

(define-key global-map [?\] [?\\])

Haskell Platform

Download Haskell Platform から pkg ファイルをダウンロードしてきて、あとはインストーラに指示通りに。

darcs

いや、使わないんだけど。

haskell-mode の入手先が見つからないので、Emacs - HaskellWiki に従って開発版を引っ張ってくることにする、のに、darcs が必要。darcs は Haskell Platform 同梱の cabal でインストールできる。

$ cabal update
$ cabal install darcs
haskellmode-emacs

以下のような感じで。

$ mkdir ~/.emacs.d/lisp
$ cd ~/.emacs.d/lisp
$ darcs get http://code.haskell.org/haskellmode-emacs
$ cd haskellmode-emacs
$ make EMACS=/Applications/MacPorts/Emacs.app/Contents/MacOS/Emacs compile

あとは、init.el に以下の記述を追加

(load "~/.emacs.d/lisp/haskellmode-emacs/haskell-site-file.el")

SSH の鍵ペアの作成と設定

  1. ターミナルを起動し、ssh-keygen コマンドを実行する。
  2. ファイル名とパスフレーズを聞かれるので設定する。
  3. デフォルトでは ~/.ssh/ ディレクトリに id_rsa (秘密鍵) と id_rsa.pub (公開鍵) が作られる。
会社の SSH サーバにログインできるようにする
  1. 作成した公開鍵を、すでにログインできるようになっている MacBook から、会社のサーバに scp でコピーする。
  2. すでにログインできるようになっている MacBook から、会社のサーバにログインし、先ほどコピーした公開鍵を ~/.ssh/authorized_keys に追記する。

会社の sshd では X のポートフォワーディングを有効にしているので、Mac OS X 標準の X を起動しておけば、gtkwave とかも使える。このときは -Y オプションをつけて ssh コマンドを実行する。(-X オプションではなんかだめだった)

githubリポジトリにアクセスできるようにする

github にログインしたら、「アカウントの設定」→「SSH 公開鍵」のページに行って、フォームに公開鍵 (~/.ssh/id_rsa.pub の中身) を入力するだけ。

あと、ついでに http://help.github.com/git-email-settings/ に従って、git に名前とメールアドレスを設定しておく。

$ git clone git@github.com:h-hirai/wavegen.git

などとして、アクセスできることを確認。

麻婆豆腐のレシピ

…えと、「MBA欲しい」だけじゃあんまりなので。

こないだ川崎の自宅で、飲み友達でもあるところの前の会社の先輩と飲んだときに、麻婆豆腐を作って食べてもらったら案外と好評で、「レシピ、ブログに書いといてよ」と。まぁ、せっかくなので。

写真とかは、ないです。

  1. フライパンを温めてごま油をしく
  2. 弱火で豆板醤、味噌、ハチミツ、ネギのみじん切りを炒める
    • 味噌とハチミツは甜麺醤の代わり
    • 分量は適当。こないだのは、豆板醤、味噌、ハチミツ各ティースプーン一杯分くらい
  3. 豆板醤の香りがたってきたら、火力を調節して、豚バラ肉のみじん切りを炒める
  4. 肉に火が通って来たら、さいの目に切った豆腐を入れて、和える
  5. 十分まざったな? と思ったら水を適量入れて、煮立たせる
  6. 鶏ガラスープで味をつける。あと、醤油、塩で味をととのえる
  7. よく沸騰させて、水溶き片栗粉でとろみをつける
  8. ここで、またネギのみじん切りを入れる
  9. 黒胡椒を入れる

こんなかんじ。

甜麺醤の代わりに味噌とハチミツ、花椒の代わりに黒胡椒というのは、どっかの病院の待合室で読んだ料理雑誌に載ってました。レタスクラブだったかな? 違うかも。

あと、水溶き片栗粉のコツ、みたいなの。水溶き片栗粉は先に作っておいて、水になじませておきます。もちろん入れる寸前にもよく混ぜます。あとは、入れた後によく沸騰させること。…と、いうようなことを、前に飲んだときに弟 (調理師免許持ち) が言ってたような気がする (うろ覚え)。

小学生の頃、父に教わったレシピだとたしか、最初の香り付けに炒めるのはおろし生姜とおろしニンニクだったんだよな。


……と、これまでプログラミングのことか、読んだ本のことしか書いてなかったのに、唐突に簡単お料理のお話でした。

2/5 にこんなイベントに参加する予定です。

第0回 Haskellでプログラムを書く勉強会 : ATND

なにかできたら、久しぶりにこのブログでプログラミングのお話を書けるかな、とか思ってます。

連番を表示する elisp

ときどき連番を含むファイルとか書くときがあるんだけど、ある程度以上の行数になるとめんどくさいな、と。そんなわけで、下記関数を実行して *scratch* バッファからコピペする。

Emacs Lisp 的に綺麗な書き方とか知らない。

(defun numbers (from &optional to)
  (when (null to)
    (setq to from)
    (setq from 0))
  (while (< from to)
    (insert (format "%d\n" from))
    (setq from (+ from 1))))

あれ? スーパーpre記法って elisp に対応してないんだっけ?

電球を取り替えるのに何人の Ruby ハッカーが必要か

おもしろかったので、http://yugui.jp/articles/853をおおざっぱに翻訳してみました。しかし、日本人のブログを日本語訳してみました、つーのもなんか変だな。

英語は苦手だし、Ruby の開発に詳しいわけでもないので、おかしいところがあると思います。ご指摘をお願いします。

電球を取り替えるのに何人の Ruby ハッカーが必要か

50人。

  • 電球が切れたと redmine に issue 登録するのに1人
  • パッチを書くのに1人
  • 新しい電球の名前が良くないとそのパッチに反対するのに1人
  • より良い名前を提案するのに3人
  • それらの名前について議論するのに5人、しかし合意には達しない
  • 3ヶ月経っても電球が切れたままであると指摘するのに1人
  • また別の名前を ruby-dev *1 に提案するのに1人
  • ruby-dev で名前について議論するのに10人
  • 議論を英語に翻訳するのに1人
  • いくつかの名前が英語として不自然であると指摘するのに1人
  • 今度は ruby-core *2 で議論をするのに12人
  • 議論について #ruby@WIDE:*.jp *3 でコメントするのに3人
  • コミットするのに1人
  • コミットされたパッチが Ruby on win32 に不具合を起こすと訴えるのに1人
  • win32 での問題を直すのに1人
  • redmine でメールが見落とされて issue が自動クローズされていないと報告するのに1人
  • issue をクローズするのに1人
  • そのうち redmine を直したいなぁ、と呟くのに1人
  • 開発中の各ブランチにパッチをバックポートするのに4人
  • rdoc を書く人はいない

元ネタ: How many FreeBSD hackers does it take to change a lightbulb?

*1:開発者向けメーリングリスト、日本語で議論が行われる

*2:開発者向けメーリングリスト、英語で議論が行われる

*3:IRCチャネル

RWH 読書会 2010-01

また、参加させてもらいました。

Real World Haskell―実戦で学ぶ関数型言語プログラミング

Real World Haskell―実戦で学ぶ関数型言語プログラミング

とりあえず、メモだけ貼付けます。

  • 5分ほど遅れていったら cut-sea さんしかいないお
  • 1時間くらいして nobsun 登場
  • どこまでやったっけ? でしばらく悩むw
    • 多分、10月やったのが最後
    • とりあえず、9章から始めてみる

9章 入出力事例研究: ファイルシステム検索ライブラリ

  • Unix の find コマンドをいくつかの方法で作りましょう、という章
  • find って Unix ぽくないよね by cut-seaさん
9.2 ディレクトリの再帰的リストアップ
  • forM :: (Monad m) => [a] -> (a -> m b) -> m [b]
    • mapM の引数を逆にしたもの
  • 9.2.2 なぜ mapM と forM の両方が用意されているのか
    • 処理のほうが長いかリストの方が長いか
9.3 素朴な検索関数
  • を実装してみせてから、問題点を列挙して、あとにつづける
    • 「sinpleFind は正格」ってどういうこと?
      • unsafeInterleaveIO でいいよね by shelarcy さん
9.4 述語: 純粋性を保ちつつ、貧弱な機能から充実した機能へ
  • ファイル名しか見ていない問題
  • System.Directory モジュール
  • filterM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]
  • 純粋な述語 p を入出力をうけもつ check でラップして、filterM でフィルタする
9.5 ファイルサイズを安全に決める
  • hFileSize をラップ
  • handle って前に出てたっけ?
  • 例外を投げられると hClose が呼ばれない問題
  • 9.5.1 獲得-使用-解放サイクル
    • bracket :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
9.6 述語用の特定問題領域言語 (DSL)
  • うまく、まとめられない…
  • 9.6.1 持ち上げを使ってボイラープレートを回避する
    • 持ち上げ?

(>) のような関数をとって、その関数を別の文脈で作用する関数 (ここでは greaterP) に変換することを、その文脈持ち上げると言います。

liftP  q f k w x y z = f w x y z `q` k
liftP2 q f g w x y z = f w x y z `q` g w x y z
liftP' q f k w x y z = f w x y z `q` (constP k) w x y z
  • 9.6.3 新しい演算子を定義して使う
9.7 走査方法の制御
  • 書いてある通り「いままでない濃い関数定義」
  • ><
  • 急に難易度が上がったなぁ…。by nobsun
9.8 密度、可読性、学習プロセス
  • この節のコードを 9.7 のと比べてみればいいんだな
9.9 走査の別の見方
  • 畳み込みとしてみる
  • walk が末尾再帰てのは本当か?
    • walk が呼んでる fold は walk を呼んでるよね
    • ??
    • 私見としては、末尾再帰と呼んでいいんじゃないかなぁ?
    • と思ったけど、違うみたい
      • 終わらせたいところで終わらせられてないよね、と
9.10
  • 特になし
  • 9.10.1 よく使われるレイアウトスタイル
    • やっぱりこういう話題はもりあがるw

番外編: nobsun の fold

ありゃ、コードめもってないや。foldl と foldr をいっぺんに行う fold.

どーしてこんなの思いつけるんだろう?

追記

2010-01-18

懇親会、その他

  • tantanmenbot を紹介した。
  • shelarcy さんの連載、もう少しがんばって読みます…。