Beautiful Firenze - Feb 16, 2008 - pictured by takus
Beautiful Firenze - Feb 16, 2008 - pictured by takusSSHでポートフォワーディング
->
研究室内においてあるLinuxサーバへ自宅から接続したかったのだが、そのサーバはローカルネットワークからの接続しか許可されていないため、
自宅PC(PC) → 認証サーバ(authorize.example.com) → 目的のサーバ(192.168.0.1)
という風に、いったん目的のサーバと同じネットワークにあるコンピュータにログインし、内部ネットワークからの通信としてサーバに接続を行う必要があるため、SSHのポートフォワーディング機能でこれを実現した。
ポートフォワーディングって?
特定のポートに送られてきたデータを、SSHで暗号化した上で、任意のホスト、ポートに対して転送する機能である。この機能は、基本的には外部ホストからLAN内にアクセスしたいが、外部から直接アクセスは危険な場合に使用するのに使われる。具体的には、外部ホストから、- LAN内のみからアクセスできるサーバに接続
- 自宅WindowsPCに外部ホストからリモートデスクトップ接続
手順
目的のサーバ(192.168.1.0)を起動して、認証サーバからSSHできることを確認しておく。PCのターミナル(puttyなども可能)から認証サーバに接続し、目的のサーバのローカルIP(192.168.0.1)に向けてトンネルを掘る。ちなみに、ここではPCのローカルポート1234を目的のサーバ(192.168.0.1)の22にフォワードしている。
$ ssh -L 1234:192.168.0.1:22 user@authorize.example.com # SSH -L <ローカルポート番号>:<転送先ホスト>:<転送先ポート番号> <リモートホスト>
ここまでやっておけば、後はターミナルから、
$ ssh -p 1234 user@localhost
とすれば、目的のサーバへSSHが可能になる。
と、ちょっと回りくどいやり方ではあるが一応できるようになった。
ただ毎回やるのは面倒なのでもっと効率的な方法がないか模索していく予定。
Vim上でプログラムを実行できるプラグインquickrun.vimで開発効率アップ
quickrun.vimでできること

ソースを編集中に \ + r を入力するだけで
インストール
thinca’s vim-quickrun at master – GitHubから最新版を取得してきてVimプラグインフォルダに放り込むだけ。
ちなみにこんなインストール方法もあるらしい
→C/C++のお勉強のためquickrun.vim入れたら学習速度が倍になった(かもしれない)
操作方法や設定
実行方法
上にも書いたが、 \ + r で実行できる。ちなみに、自動で保存はされないとのこと。バッファに変更があった場合、一時ファイルを作成して保存し、そちらを実行する。自動保存は、以下のコマンドで可能。(追記:2010/07/31)
:update | QuickRunキーバインドの変更
キーバインドを変更したい場合は.vimrcに以下のように記述するといいらしい。silent! nmap <unique> 好きなキー <Plug>(quickrun)
プログラムにコマンドライン引数を渡す
以下のように実行するとコマンドライン引数を渡すことが出来る。:QuickRun -args hogefugaまとめ
エディタを閉じる→実行→エディタという操作がなくなって開発効率アップは間違いなさそう。主なプログラミング言語には対応しているようなので、今後も様々な場所で活用したい。
参考サイト
quickrun.vimインストール | blog.paz-para.comC/C++のお勉強のためquickrun.vim入れたら学習速度が倍になった(かもしれない) – 今日もスミマセン。
編集中のスクリプトを直ぐに実行できるquickrun.vim – 理想未来はどうなった?
NoSQL Cassandraを使ってみる ~Rubyでアクセス編~
NoSQL Cassandraを使ってみる ~インストール編~
においてインストールから、コマンドラインでの値の取得について説明した。今回はその続きとして、RubyからCassandraにアクセスして値を取得してみる。
Rubyでアクセスするためのライブラリをインストール
なお、CassandraはThriftという言語バインダ用のライブラリを介してアクセス用のライブラリを提供しおり、ほとんどの言語からアクセス可能である。Rubyの場合は、これをRubygemsからインストールできる。
$ su $ gem install cassandra
Rubyでアクセスしてみる
前回保存した値を取得して、標準出力に出力するコードは以下のようになる。
#!/usr/bin/ruby require 'rubygems' require 'cassandra' include Cassandra::Constants keyspace1 = Cassandra.new('Keyspace1') keyspace1.get(:Standard1, 'jsmith') .each do | column, value | puts "#{column} = #{value}" end
保存したら実行してみる。
$ ./ruby_access.rb age = 42 first = John last = Smith
思ったより簡単に値を取得できた。しかし、まだアプリケーションを作る際に具体的にどのようなデータ構造にするのがいいのか想像がついていない。
NoSQL Cassandraを使ってみる ~インストール編~
こんな記事が上がっていて、Cassandraにも興味が出てきたので触ってみた。
Cassandraって?
Cassandraは最近流行りのNoSQLの一つ。Facebookで大規模データ処理のために開発されて、現在はオープンソースとなって、Apache Software Foundationのプロジェクトとして開発が進んでいる。イマイチ理解はしきれていないが、多次元のデータが保持できるKey-Valueストアという認識をしている。ちなみに、SQLの用語と比較するとデータベース → キースペース テーブル → カラムファミリー 主キー → key カラム → カラムと対応づけられるようである。参考:みてわかるクラウドマガジンvol.1 (日経BPパソコンベストムック)
インストール
CassandraはJavaで実装されているのでプラットフォームには非依存。(Ver.は1.6以上が推奨)今回はFedora12 x86_64にインストールしてみた。
$ which java /usr/bin/java $ java -version java version "1.6.0_18" OpenJDK Runtime Environment (IcedTea6 1.8) (fedora-39.b18.fc12-x86_64) OpenJDK 64-Bit Server VM (build 14.0-b16, mixed mode) $ su $ cd /usr/local/src $ wget "http://www.meisei-u.ac.jp/mirror/apache/dist/cassandra/0.6.2/apache-cassandra-0.6.2-bin.tar.gz" $ tar -zxvf apache-cassandra-0.6.2-bin.tar.gz
バイナリで配布されているので解凍したら特にコンパイルする必要もない。
実行
早速、実行してみる。
$ cd apache-cassandra-0.6.2 $ ./bin/cassandra -f
メッセージがいくつか表示されて起動した。クライアントも容易されているので接続してみる。デフォルトではKeyspace1というキースペースとその中に4つのカラムファミリーがあり、外部から接続するポートは9160に設定されている。ちなみにこれらの設定は、conf/storage-conf.xmlに記述されている。
$ /usr/local/src/cassandra/bin/cassandra-cli --host localhost --port 9160 Connected to: "Test Cluster" on localhost/9160 Welcome to cassandra CLI. Type 'help' or '?' for help. Type 'quit' or 'exit' to quit. cassandra> set Keyspace1.Standard1['jsmith']['first'] = 'John' Value inserted. cassandra> set Keyspace1.Standard1['jsmith']['last'] = 'Smith' Value inserted. cassandra> set Keyspace1.Standard1['jsmith']['age'] = '42' Value inserted. cassandra> get Keyspace1.Standard1['jsmith'] => (column=6c617374, value=Smith, timestamp=1280391013700000) => (column=6669727374, value=John, timestamp=1280390971929000) => (column=616765, value=42, timestamp=1280391004923000) Returned 3 results.
setでデータを保存し、getでデータを取得することに成功。せっかくなのでこれでちょっとしたアプリケーションを作ってみたいと思っている。
参考サイト
本日のクラウド関連のニュース&記事 2010/07/29
「Webスケールとインターネットクラウド」開催
第2回「Webスケールとインターネットクラウド」|情報処理学会 連続セミナー2010
7月26日に東京電機大学で丸山先生や首藤先生によるクラウド関連のセミナーがあったらしい。
丸山先生による「クラウドの成立過程と、その技術的特徴について」の講演資料を
http://maruyama.cloud-market.com/download/IPS2010.pdf
で見ることができる。
内容はこれまでに出てきてる話のまとめ。
クラウド全体を俯瞰するにはいい資料だと感じた。
「Googleクラウドの核心」 発売決定
Googleが語るデータセンター「The Datacenter as a Computer」の翻訳版「Googleクラウドの核心」が発売 | P2P today ダブルスラッシュ
ということで、The Datacenter as a Computerの日本語版が出版されるとのこと。
Googleクラウドの核心
なお、英語版であれば
で読むことができるので、こっちを読んだ方が正しい情報が得られる可能性は高そう。
Cassandra入門
Cassandra入門と、さらに詳しく知るためのリソース集 ? Publickey
というCassandraのまとめ記事。
様々な資料を見ることができる点がGood。
興味はあるものの今まで触ったことはないので、夏休み中に少し触ってみる予定。
CassandraをJavaやRubyで使ってみたというコチラの記事も参考になりそう。
Vimでautocomplpopを使って快適にリアルタイム補完
Vimで補完というと、[Ctrl + n]が一般的ですが、今回紹介するautocomplpopを使うとより快適に補完ができるので紹介。
スクリーンショット
このように補完が可能。
導入方法
AutoComplPopからvim-autocomplpop.zipをダウンロード解凍してVimディレクトリにコピー。(Fedora12では、/usr/share/vim/vimfiles/)
機能
- テキストを打っていると自動で補完候補が表示されるので選択するだけ。
- たまにうっとうしいときもあるので注意
参考サイト
Fedora12でGitの初期設定
インストール
$ yum install git-coreyumからインストールできる。
初期設定
$ git config --global user.name "takuss" $ git config --global user.email takus@example.com" $ git config --global color.ui auto
ユーザ名とメールアドレスを登録しておく。color.uiはコマンドからの出力が見やすくなる。
これらの設定は $HOME/.gitconfig に記述され、ホスト上で作る全てのリポジトリに適用される。
Rubyでアルゴリズム 第02回 ~クイックソート編~
前回の Rubyでアルゴリズム 第01回 ~バブルソート編~ に続いて、今回はクイックソートに取り組んでいく。
クイックソートって?
例のごとくWikipediaを見てみると、
クイックソートは、1960年にアントニー・ホーアが開発したソートのアルゴリズム。分割統治法の一種。
最良計算量および平均計算量はO(n log(n))>である。他のソート法と比べて、一般的に最も高速だといわれているが対象のデータの並びやデータの数によっては必ずしも速いわけではなく、最悪の計算量はO(n^2)である。また数々の変種がある。 安定ソートではない。
どういう風にソートを行うのかはこれだけでは分かりにくいが、安定ソートでないといった特徴を把握した上で活用すれば役立ちそうだと推測できる。
具体的なソートの方法は?
簡単に説明すると、
- 要素の中から軸(ピポット)を1つ決める
- その軸より小さい値と大きい値のグループに分ける
- それぞれのグループで1.2を実行する
- それ以上は分割できない状態になればソーティング終了
という方法によりソーティングが可能である。
ちなみに軸の選び方は
(1)完全にランダムに選ぶ
(2)適当な3つの値の中央値を選ぶ
といった様々な変形パターンが存在する。
実装
今回の実装は様々な戦略のうち、軸をランダムに選ぶ方法で実装を行った。
class Array def sort quickSort(self, 0, self.length-1) end def quickSort array, left, right if left > right then pi = partition(array, left, right) quickSort(array, left, pi-1) quickSort(array, pi+1, right) end end def partition array, left, right p = left + rand(right - left) self[p], self[right] = self[right], self[p] store = left (left..right-1).each do |i| if array[i] <= array[right] then self[i], self[store] = self[store], self[i] store += 1 end end self[store], self[right] = self[right], self[store] return store end end
まとめ
- 最良時、平均時には O(n log(n)) でソートが可能。
- 軸を選択するときに常に左端、または右端を選んでしまうと最悪時になり、O(n^2)の計算時間がかかる
- 軸の選択方法、要素が少なくなると挿入ソートに切り替える等の亜種が存在する
追記 2010/07/28
よく考えるとquicksortとpartitionの引数arrayは必要なさそう...。
そのうちもう一度考える。
Javaでスタックトレースを表示する (メソッドの呼び出し元を特定する)
デバッグしていて、あるメソッドが複数の場所から呼ばれることがある場合、どこからメソッドが呼ばれているのか特定したいときがある。そんな時にはスタックトレースを表示するのが便利。
Javaでは、以下のように記述すれば、呼び出し元のクラス名、メソッド名を出力できる。
StackTraceElement[] e = new Exception().getStackTrace(); for (StackTraceElement element : e) System.out.println(element.getClassName() + "," + element.getMethodName());
参考サイト
Rubyでアルゴリズム 第01回 ~バブルソート編~
Rubyを学びつつアルゴリズムも復習し直そうということで、1日1記事を目標にやっていけたらと思っている。記念すべき初回である今回はバブルソートを実装。
バブルソートって??
Wikipediaにはこんな風に書いてある。
バブルソート(bubble sort)は、ソートのアルゴリズムの一つ。隣り合う要素の大小を比較しながら整列させること。最悪計算時間がO(n^2)と遅いが、アルゴリズムが単純で実装が容易なため、また並列処理との親和性が高いことから、しばしば用いられる。安定な内部ソート。基本交換法、隣接交換法ともいう。
簡単に言うと、隣り合う要素を順々に比較して要素の順序を入れ替えるという操作を全ての要素に行うことで整列を行うといったとこだろうか。
実装
Arrayクラスのsortメソッドをオーバーライドしてみた。
class Array def sort unsorted_length = self.length-2 begin unsorted = false (0..unsorted_length).each do |i| if(self[i] > self[i+1]) unsorted = true self[i], self[i+1] = self[i+1], self[i] end end unsorted_length -= 1 end while (unsorted) end end
素直に実装するとこんな感じになりそう。
今回Rubyを書いていて、
self[i], self[i+1] = self[i+1], self[i]
こういう書き方ができることを初めて知る。
Cだと、一時変数なんかを使って、
tmp = self[i] self[i] = self[i+1] self[i+1] = tmp
とか書きそうなとこ。
この辺が、Rubyが直感的に理解しやすいコードが書けると言われている所以なのかと想像。
バブルソートのまとめ
少し脇道に反れたが、最後にまとめ。
- アルゴリズムが簡単で、実装も楽
- 最悪時は計算時間がO(n^2)かかってしまう

