DD-WRTにsshで接続できた
どっかに設定ないのかなー、と思ってぼけーっと設定項目を見ていたら、ssh関連の設定項目を発見。
ネットワーク -> サーバ/サービス -> Secure Shell
- SSH サービス: 有効
- SSH TCP Forwarding: 無効
- Login時にパスワードを使用する: 無効
- ポート: お好きなポートに(デフォルトでは22)
- Authorized Keys: $HOME/.ssh/identity.pubや$HOME/.ssh/id_rsa.pubなどの中身をコピペ
基本はSSH サービスを有効にしてAuthorized Keysを埋めておくだけでOKっぽいです。TCPフォワーディングをしたければSSH TCP Forwardingを有効にするといいと思うのですが、試していません。
管理 -> 管理 -> リモートアクセス
これは恐らく外部からアクセスする際の設定だと思う。基本全部切りにしておいた方が無難だと思うけど、必要があればここを有効にすれば良いっぽい。リモートでSSHを使う際はせめてパスワード不使用、ポート変更ぐらいはしてから利用したほうがいいと思います。
下のキャプチャはSSHのみ有効にした状態。前回の日記ではこれだけしか見つけられずに、「こいつをどうにか有効化できれば......」とか書いていました。現在はどっちも無効にしています。
ssh接続したところ
Buffalo WHR-HP-G54をDD-WRT化
ついかっとなってやった。今でも後悔していない。
前準備
ファームの準備
dd-wrt.v24_std_generic.bin 辺りをダウンロードしておく。megaだと容量足りずに失敗する。
3番目のポートにLAN接続
おまじない的なものかもしれないけど、Buffalo側の3番目のポートでtftpを受け付けているとかいう話がどこかに載っていた気がする。ソースは忘れた。
ルーターの再起動
電源引っこ抜いて再起動する。大体5〜10秒辺りがチャンスっぽい。
tftpコマンドでファームの転送
tftp -i 192.168.11.1 PUT dd-wrt.v24_std_generic.bin
ErrorとかTimeoutとか出なければいい。しばらくルーター側で赤いランプが点滅するけど、それが止まれば終了。
ルーターパスワードの変更
初期状態では
- ID: root
- Password: admin
となっている。さすがにDD-WRT化しようと思うような人にデフォルトパスワードでルーターを運用しようとか考える人はいないと信じたいけど、ちゃんと変更しておく。
言語設定
Language SelectionのLanguageをjapaneseにすればGUIが日本語化します。
はてなフォトライフにpostするgyazoを書いた on Mac OSX
はてなフォトライフAtomAPIの扱い方が分かったので、早速gyazoを使ってはてなフォトライフにpostするスクリプトを書いてみた。gyazo自体はRubyで書かれているので、書き換えるだけでOK......なんだけど、RubygemsのロードパスはMacに標準で入っているRubygemsのものになるので注意。おいらは別途MacPortsで入れているんだけど、動かなくて原因が分かるのに結構悩んでしまった。
前準備
atomutilをインストール。
sudo /usr/bin/gem install atomutil
これでMacPortsを使ったり、別途他のところにソースからインストールしている人でも標準のRubygemsにatomutilがインストールされる。
patch
*** /Applications/gyazo.app/Contents/Resources/script 2007-09-05 14:20:13.000000000 +0900 --- /Applications/gyazo.app/Contents/Resources/script 2008-09-14 14:27:16.000000000 +0900 *************** *** 1,6 **** #!/usr/bin/env ruby ! require 'net/http' program = ARGV[0] idfile = File.dirname(program) + "/gyazo.app/Contents/Resources/id" --- 1,7 ---- #!/usr/bin/env ruby ! require 'rubygems' ! require 'atomutil' program = ARGV[0] idfile = File.dirname(program) + "/gyazo.app/Contents/Resources/id" *************** *** 25,56 **** imagedata = File.read(tmpfile) File.delete(tmpfile) ! boundary = '----BOUNDARYBOUNDARY----' ! HOST = 'gyazo.com' ! CGI = '/upload.cgi' ! data = <<EOF ! --#{boundary}\r ! content-disposition: form-data; name="id"\r ! \r ! #{id}\r ! --#{boundary}\r ! content-disposition: form-data; name="imagedata"\r ! \r ! #{imagedata}\r ! \r ! --#{boundary}--\r ! EOF ! ! header ={ ! 'Content-Length' => data.length.to_s, ! 'Content-type' => "multipart/form-data; boundary=#{boundary}" ! } ! ! Net::HTTP.start(HOST,80){|http| ! res = http.post(CGI,data,header) ! url = res.response.to_ary[1] ! system "echo #{url} | pbcopy" ! system "open #{url}" ! } --- 26,46 ---- imagedata = File.read(tmpfile) File.delete(tmpfile) ! post_uri = 'http://f.hatena.ne.jp/atom/post' ! userid = '******' ! pass = '******' ! ! entry = Atom::Entry.new({ ! :title => 'post by gyazo', ! :updated => Time.now, ! :content => Atom::Content.new { |c| ! c.body = [imagedata].pack('m') ! c.type = "image/jpeg" ! c.set_attr(:mode, "base64") ! }, ! }) ! auth = Atompub::Auth::Wsse.new :username => userid, :password => pass ! client = Atompub::Client.new :auth => auth ! client.create_entry(post_uri, entry, "post bv gyazo")
中のuseridとpassにはてなアカウント、パスワードを書いてください。別途設定ファイルを準備してもよかったんだけど面倒だったので直接書くことにした。
はてなフォトライフのAtomAPIをRubyでほげほげしてみた
はてなフォトライフAtomAPIについてははてダキーワードを参照の事。
その1: net/httpで叩いてみる
WSSE認証用のライブラリがあるので導入する。
sudo gem install wsee
で、コードは以下。
require 'socket' require 'net/http' require 'rubygems' require 'wsse' #config uri = 'f.hatena.ne.jp' id = 'id' pass = 'pass' #wsse auth http = Net::HTTP.start(uri,80) res = http.get('/atom/feed',{'X-WSSE' => WSSE::header(id,pass)})
ここで指定してる /atom/feed は投稿された写真のうち最近のエントリをAtomフィードで取得するためのエンドポイント。はてなでフィードしているatomフィードと同じものが返ってくるらしい。res.bodyにStringクラスで入っているので、Xml-Simpleなどを使ってハッシュなんかにすると扱いやすいんじゃないかな。
ただ、これの場合postするときがクソ面倒そう...。
その2: atomutilを使ってみる。
atom/atompubを扱うライブラリがあるので導入する。
sudo gem install atomutil
で、コードは以下。
require 'rubygems' require 'atomutil' #config feed_uri = 'http://f.hatena.ne.jp/atom/feed' id = 'id' pass = 'pass' #create client auth = Atompub::Auth::Wsse.new :username => id, :password => pass client = Atompub::Client.new :auth => auth #get feed feed = client.get_feed(feed_uri)
動作自体はその1とほぼ同じだけど、返ってきたものは feed.elem に REXML::Element クラスで入っている。
atomutil使う利点はpost時。リクエスト用のXMLを書くのが楽。
require "rubygems" require "atomutil" require "pathname" #create post xml image = Pathname.new("hogehoge.jpg") entry = Atom::Entry.new({ :title => image.basename.to_s, :updated => Time.now, :content => Atom::Content.new do |c| c.body = [image.read].pack('m') c.type = "image/jpeg" c.set_attr(:mode, "base64") end, }) #config post_uri = 'http://f.hatena.ne.jp/atom/post' id = 'id' pass = 'pass' #create client auth = Atompub::Auth::Wsse.new :username => id, :password => pass client = Atompub::Client.new :auth => auth #post data client.create_entry(post_uri, entry)
Apache 2 + mod_dav_svnでsvnレポジトリをサブドメインで運用する
何気に結構ハマってしまったのでメモる。使用したOSはCentOS 5.1。
名前ベースのバーチャルホストを使う
今回は同一サーバで動かすので、名前ベースで利用する。
# # Use name-based virtual hosting. # #NameVirtualHost *:80
とコメントアウトされているのを外す。
# # Use name-based virtual hosting. # NameVirtualHost *:80
mod_dav_svn用のバーチャルホスト設定
おいらは下記のように /opt/svn/repos 以下にプロジェクトごとにレポジトリを作るやり方をいつもしている。
- opt
- svn
- repos
- project1
- project2
- project3
- repos
- svn
このとき、プロジェクトごとに設定を増やすのがめんどいので /opt/svn/repos以下を一気に設定できるようにしてみた。
<VirtualHost *:80>
ServerName svn.sample.com
<Location />
DAV svn
SVNListParentPath on
SVNParentPath /opt/svn/repos
AuthType Basic
AuthName "Authorization Realm"
AuthUserFile /opt/svn/repos/.htpasswd
Require valid-user
</Location>
</VirtualHost>
Locationディレクティブの部分を '/' で終わらせてSVNListParentPathをonにすると、SVNParentPath以下のsvnレポジトリを svn.sample.com にアクセスすることで /opt/svn/repos 以下のレポジトリ一覧を出力してくれるっぽい。そして svn.sample.com/project1, svn.sample.com/project2, svn.sample.com/project3 はそれぞれのレポジトリにアクセスできる。
おいらはVirtualHostの設定は全部 /etc/httpd/conf/sites 以下に入れているので、それを読みにいくように httpd.confの最終行にでも書き加える。
Include conf/sites/*.conf
別に指定の仕方は conf/sites/* でも構わないけど、一時的に使用不可にするのに *.conf.disable とかやるので、こういう感じの書き方で。