システム・PC

注文したVAIOが届いた

VAIO TYPE-E

Windows8初体験(正確にはプレリリース以来というべきか?)

タッチパネルは結構気に入ったけど、結局タッチパネルだけで完結してないから、あんまり意味ないよーな。普通にデスクトップに入ると細かすぎて誤爆するし。

で、予想以上に設定とかやり方が分からないという。ググりながら悪戦苦闘中。

VAIO購入

基本はMac使ってるんですが、やはりたまに使わざるを得ないんですよねぇ。 で、買うとなると英語配列にしたいので自ずと選択肢はしぼられるというか・・・まぁ悩まなくてよいのは楽ですが。 今会社で使ってるやつは2006年に購入したもののようなので、7年間使ったことになるようです。

折角なんでOffice2013も買いました。極稀に必要なんですねぇ・・さすがにOffice2000では辛いというか。極稀のために数万出すのもなんだかなぁという感じですけど。

FreeBSDで pf で NATを使って jailを運用するメモ

最近さくらのVPSとか安価でFreeBSDを使えるサイトが出てきました。 こういったサービスでもjailを使いたいのですが、 悩ましいのが安いサービスはIPアドレスが1つしかもらえないこと。 もちろん適当なプライベートなIPアドレスをIFにaliasで振ってjailを作っちゃえばいいんですが、これだとjail内部から外部へ通信ができないという問題があります。

そこでpfを使ってNATを構築してみました。jailをプライベートIPで外へ出ていくパケットをNATでグローバルIPに変換してやろうという考え方です。

いろいろ試行錯誤してみましたが、結論からいうともう1つIFを作るのが手っ取り早いようです。とりあえずlo1を作ります。

# ifconfig lo1 create
# ifconfig lo1 up

で、アドレスを振る。ここでは 10.0.0.1にしてみました。

# ifconfig lo1 10.0.0.1 netmask 255.255.255.255

/etc/pf.confに次のように書きます。

ext_if="em0"
int_if="lo1"
table <private> const {10.0.0/24}
nat on $ext_if inet from ($int_if) to ! <private> -> ($ext_if)

これで jailを10.0.0.1で起動すれば、lo1(すなわちjail)から外に出るパケットはpfでext_ifのアドレスに書き換えられます。 (em0は適当に環境に合わせて書き換えてください)

/etc/rc.confで起動時に自動的に実行させるには以下の行を追加します。

ifconfig_lo1="inet 10.2.2.1 netmask 255.255.255.255"
cloned_interfaces="lo1"
pf_enable="YES"
pf_rules="/etc/pf.conf"

いずれもFreeBSD-9.1で確認しました。

avaを使用すると、驚くべきJavaコンテンツの世界に安全かつセキュアにアクセスできるようになるらしい

ava

セキュアにアクセスとかドヤ顔で言われても、"J"一文字抜かしてるだけで、胡散臭くてインストールを躊躇するというか。いやこれが本当にマルウェアだったら笑うしかないところですが。

FacebookのLikeボタンとmixiのイイネボタンを設置してみた。

具体的にどうやって設置するのかを調査を兼ねて設置してみました。

各社ともHTMLコード生成のページとか用意しているから、導入は簡単か?と思ってたんですが、これが細かいことにこだわると結構面倒だということが判明。例えばFacebookのイイネボタンを押した回数は消せない等々・・・

こんなん超人気サイトでも無い、こんなゴミみたいなブログじゃ限り限りなく0じゃん。とか思いつつ、ああこれはブログは書かないでFacebookのほうに全部書けよという作戦なんだな!と思ったところで納得しました。

そのあたりも含めて、好き放題やるなら、ちゃんとAPIとやりとりしてやらんといかんのだろうなぁ。で肝心の設置方法ですが、FacebookはこちらのURLからポチポチと情報を打ち込んでいけばOKです。

https://developers.facebook.com/docs/plugins/

mixiはこちらあたりから、

http://developer.mixi.co.jp/connect/mixi_plugin/

Facebookはアプリを登録しておかないといけません。 mixiは開発者登録が必須。 この辺が面倒なところなんですよね。

このサイトにIPv6のアドレスを振ってみた

4/5くらいにAAAAレコード書いてみたけど、まだ4件くらいしかアクセスないという。 ま、IPv6でつないでも何もいいことないですけどね。

それにつけても、Google等のクローラーボットのアクセスの多いことよ。

Rails3.2でデフォルトのログの場所を変更する方法

検索しても情報が錯綜しているようですが、ソースを見るかぎりproduction.rbあたりに、このように書くのが作者の意図に沿っていると思われます。
 config.paths['log'] = ["/var/log/rails/production.log"]
もちろん自前や別のLoggerを使うという手もあります。例えば、
 config.logger = Logger.new(/"/var/log/rails/production.log")
とかやってもいいわけですが(多くはこれがヒットする)、これだとログのデバッグレベルが既定のデフォルト(つまりDEBUG)になり、かなりログが賑やかです。

ソースを読むと分かるのですが、config.loggerにLoggerが設定されていると、config.log_levelを見に行きそうで行かないので、config.log_levelは効きません。

しかるにLoggerクラスはインスタンスを生成するときに、log_levelを変更できないので、newした後設定してやればOKなんですが、path変えるだけならちょっと煩わしいかなと。例えば次のようにすればよいようです。
 config.logger = Logger.new("/var/log/rails/production.log")
 config.logger.level = Logger::INFO
rails3.2.12で確認。 ソースは

railties-3.2.12/lib/rails/application/bootstrap.rb

あたり

このサイトを passenger + nginx に置き換えた

apache22だったのを置き換え。
特に問題なく動いている模様。

gem関連はportsで管理をしないというポリシーなんで、アプデート管理がちょっと面倒そうだなぁ。

Vistaと7のUDFドライバはちょっとおかしい?

という結論に達しました。 XPで読めてもVistaや7で読めないものがあるようです。

具体的にはパケットライトでUDF2.01で書いたもの。技術的にはVirtual Partition Mapというのを使います。これは上書きできないDVD-Rなどのwrite onceのメディアにあたかも上書きされているかのように記録していくという複雑なファイルシステムです。

で、弊社には(自作の)UDFのツールがいくつかあるので、ディスクの全データを調べてみました。ファイナライズしてないと普通には吸い出せないのでATAPIコマンド発行でセコセコ吸いだし。

データ自体にはどこにも問題があるように思えません。念のため Philipsが出してるチェッカにかけてもちゃんと読めるし、問題は無い模様。

しかし、このOSはとても普及しているので、一応それなりにちゃんと調べないといけません。エラーログとかないので、一体どこが気に入らなくて読めないのかWindowsの気持ちになって調べることに。

こういうのは、読めるデータから読めないデータにちょっとづつ近づけていくのが早い。

そこで、Vista, 7で読めるデータを作成(具体的にはVistaで作る)。それをツールを使ってセコセコと崩していってみました。CRCとかcheck sumとか手動で計算してられないんで、こういうのはツールが大活躍。

で、その結果、ディレクトリのデータがVirtual Partition Map 上にあると読めないようです。これをVirtualじゃない方(普通のpartition Map)に配置すると読めます。

これはバグじゃないかなぁ?ディレクトリのデータはどっちに置いてもいい(と思われる)ので、Virtual Partition Map上あっても読めるようにしてほしかった。実際XPやMacOSでは実際読めます。というか、XPで読めてたのに、Vistaで読めなくなるって・・・

ちなみにXPにSonic UDF Readerというのを入れると同じ挙動をしめすから、どっかのやつを買ってきてVista以降に入れてるのかな?

Node.jsで 80番ポートをListenするWebサーバを作る

簡単にWebサーバが作れますとかいって、よく、以下のようなコードが紹介されています。(余談ながら、私個人としてはコードが短いことがどうしていいことなのかは理解に苦しみます。ある特定の、かつ、まったく現実的に役に立たないコードが短いことにどんな利点があるのでしょうか???)
var http = require('http');
http.createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello World\n');
}).listen(3000, '127.0.0.1');
これを実行したあと、ブラウザで

http://127.0.0.1:3000

を開くとHello Worldというページが見れます。3000番ポートをhttp標準の80番ポートにして動かそうと単純に以下のようにすると
var http = require('http');
http.createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello World\n');
}).listen(80, '127.0.0.1');
と修正すると
node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: listen EACCES
    at errnoException (net.js:640:11)
    at Array.0 (net.js:726:28)
    at EventEmitter._tickCallback (node.js:192:40)
みたいな例外が発生して動きません。1023番までは一般ユーザではlistenできないからです。rootでなら動きますが、それじゃprocessがrootで動いちゃいます。なんかあったときに(セキュリティの問題とか)全部システムがのっとられてしまうかもしれない。

これは、以下のようにsetuidでlistenしたあとに、プロセスのオーナを変更するのが「よい実装」でしょう。一度でも listenしちゃえばプロセスのオーナを誰に変えても問題ないのです(この例では80番にしている)

listenのコールバックに置いておくのは listenを読んだ直後にsetuidをすると、listenが完了する前にsetuidをしてしまう可能性があるから。このあたりイベント駆動型の言語はめんどくさいよなぁ。
var http = require('http');
http.createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello World\n');
}).listen(80, '0.0.0.0', function(){process.setuid(80)});


このあたり、昔のUNIXの人には常識なんだろうけど、rootで動かせばいいじゃんみたいなページが沢山あるので老婆心ながらブログに書いておきます。ま、Apacheとかを前段に置いて、reverse proxyというのが、さらなる正解なのかもですが。