FreeBSD 7.1 の正式版がリリースされたので試してみる

たまたま、FreeBSD を入れようとしていたら、7.1 の正式版が今日リリースされていた。 http://www.freebsd.org/ 日本語サイトではまだトップが更新されていない(2009/01/05 13:44 現在)。 VMWare Server にインストールしてみた 手順はちょうど GIGAZINE でとりあげていたので参考にしてみた。 Yahoo!やライブドア、2ちゃんねるなどの大規模サイトで採用されている「FreeBSD」をインストールしてみた - GIGAZINE 但し、自分は 31番目の「SSH でのログイン」は許可に変えた。 SSH でターミナルからログイン インストール時に作成した一般ユーザで早速、SSH クライアントからログインしようとしてみた。しかし、前述の手順だけではログインできなかった。 コンソールから root でログインして、sshd_config を変更してみる。 # vi /etc/ssh/sshd_config 下記のようにパスワード認証を許可にする。 # Change to yes to enable built-in password authentication. #PasswordAuthentication no PasswordAuthentication yes PermitEmptyPasswords no 設定をロードしてみる # /etc/rc.d/sshd reload SSH クライアントからログインできるようになった。 su で root になる 色々設定するためには、root になる必要がある。 \> su su : Sorry なれなかった。コンソールには「freebsd su: BAD SU tosshi to root on /dev/ttyp1」とログが出ている。 再び、コンソールから root でログインする。 # vi /etc/group wheel グループにユーザーを追加してみる。 ...

2009年1月5日 · Toshimitsu Takahashi

はてなアンテナの変わった使い道

昔は、はてなアンテナをよく利用していたのだが、LDR -> Fastladder で RSS 購読をするようになってから全く使わなくなってしまった。 でも、別の使い方を見つけたので、ひっそりと使っている。 それは、Web サービスの Daily Cron としての使い道だ。 アンテナは定期的に登録 URL を確認しに行く。だから、その URL にサービスの cron 用スクリプトを指定しておけば、cron のような使い方ができるのだ。具体的な時間の指定はできないが、「だいたい最低一日一回実行しておきたい」ことには適している。 レンタルサーバで cron が使えない場合、自宅サーバの cron から定期的に叩きにいくようなことをしているときは、この方法をお勧めしたい。

2009年1月4日 · Toshimitsu Takahashi

jQuery の Manipulation(DOM 操作)で優先的に使うべきメソッドのまとめ

jQuery 1.2.6 のソースコードを見ると、appendTo, prependTo, insertBefore, insertAfter, replaceAll の定義は下記のように、内部で append, prepend, before, after, replaceWith を呼び出し元、引数の対象を逆にして呼び出すようになっていることがわかる。 jQuery.each({ appendTo: “append”, prependTo: “prepend”, insertBefore: “before”, insertAfter: “after”, replaceAll: “replaceWith” }, function(name, original){ jQuery.fn[ name ] = function() { var args = arguments; return this.each(function(){ for ( var i = 0, length = args.length; i < length; i++ ) jQuery( args[ i ] )[ original ]( this ); }); }; }); あくまでも append, prepend, before, after, replaceWith がオリジナルのメソッドなのだ。 処理のステップを少なくするには、appendTo, prependTo, insertBefore, insertAfter, replaceAll はメソッドチェーン的に書きやすいか、引数となる対象が jQuery オブジェクトではない場合に限った方がよいだろう。 A.appendTo(B) とも B.append(A) とも変数 A, B がどちらも jQuery オブジェクトであるなら、後者を選んだ方がよい。 DOM 操作をするときは(replaceWith は除くが)append, prepend, before, after とメソッド名が短い方を選ぶと覚えておこう。

2008年12月25日 · Toshimitsu Takahashi

圧縮パスワード付き ZIP ファイルを生成できる DotNetZip ライブラリを C# で試してみた

DotNetZip Library - Home DotNetZip は Microsoft Public License の ZIP ライブラリ プロジェクト。 試しに C# からコマンドラインでパスワード付きZIPを作成するサンプルプログラムを書いてみた。 using System; using System.IO; using Ionic.Utils.Zip; namespace AppTest { class Program { static void Main(string[] args) { string filePath = null; string zipfile = null; string password = null; for (int i = 0; i < args.Length; i++) { if (args[i] == “-p”) { password = args[++i]; } else if (filePath == null) { filePath = args[i]; } else { zipfile = args[i]; } } if (filePath == null || zipfile == null || !File.Exists(filePath)) { if (args.Length != 2) { Console.WriteLine(“Usage WhiteMole.exe [-p password] file zipfile”); } return; } try { zipAtEncrypt(filePath, zipfile, password); } catch (ZipException) { Console.WriteLine(“Failed to compress " + filePath); } } private static void zipAtEncrypt(string filePath, string zipfile, string password) { using (ZipFile zip = new ZipFile(zipfile)) { if (password != null) zip.Password = password; zip.AddFile(filePath); zip.Save(); } } } } ...

2008年12月23日 · Toshimitsu Takahashi

手軽に QR コードの画像ファイルを生成できる Ruby ライブラリ rqr を試す

「ruby qrcode」でググると Y.Swetake さんの QRコードクラスライブラリ for Ruby - QRcode encode class library for Ruby が真っ先にヒットする。だが、単に php 版から移植したと説明されているのと beta 版ということもあって躊躇っていた。 RubyForge にないのかと探していたところ rqr - http://rqr.rubyforge.org/ が見つかった。 バイナリ出力をするのではなくファイルに書き出すだけの簡単な仕様になっている。また、libjpeg, libpng, libtiff を使用しているので予めインストールしておく必要がある。 yum で依存ライブラリをインストール # yum install libjpeg.i386 # yum install libpng.i386 # yum install libtiff.i386 rubygems でインストール # gem install rqr CGI を作ってみる パラメータのテキストを QRコード で返す CGI を作成してみる。 #!/usr/bin/env ruby require “rubygems” require “rqr” require “cgi” # QRcode を PNG 形式のバイナリで返す def get_qrcode_bytes(text) filepath = “/tmp/qrcode” + $$.to_s + “.png” RQR::QRCode.create do |qr| qr.save(text, filepath) end bytes = File.read(filepath) File.delete(filepath) return bytes end cgi = CGI.new text = cgi[“text”] cgi.out(“image/png”) { get_qrcode_bytes(text) } ...

2008年12月16日 · Toshimitsu Takahashi

Ruby で PHP の base_convert() のような基数変換を簡単に実装してみる

基数変換は、ハッシュやキーなどの処理で必要になることがある。php では base_convert 関数があるので簡単だ。 Ruby にはないのかと思っていたら String, Integer クラスの to_i, to_s にはそれぞれ基数を引数に渡せることがわかった。よって、この二つを組み合わせれば簡単に実装可能だ。 base_convert.rb 2 から 36 進数まで対応できる。 def base_convert(strnum, from, to) return strnum.to_i(from).to_s(to) end irb で試す irb(main):001:0> require “base_convert” => true irb(main):002:0> base_convert(“1111”, 2, 16) => “f” irb(main):003:0> base_convert(“11111111”, 2, 16) => “ff” irb(main):004:0> base_convert(“FF”, 16, 2) => “11111111” irb(main):005:0> base_convert(“f”, 16, 2) => “1111” irb(main):006:0> base_convert(“ffff”, 16, 36) => “1ekf” irb(main):007:0> base_convert(“1ekf”, 36, 10) => “65535”

2008年12月15日 · Toshimitsu Takahashi

HTTP サーバのレスポンスヘッダは Firefox の Live HTTP headers よりも wget -S の方が詳しく取れる

#!/usr/bin/ruby print “Content-Type:application/xhtml+xml\r\n” print “Content-Type:text/plain\r\n\r\n” print «EOF Test for How to deal Content-Type EOF たとえば上記のようにわざと Content-Type を二重に出力してしまうと、Apache はバリデートで後者のみがクライアントに返されるが、lighttpd はそのまま二重定義で返してしまう。 これを確認するために、Firefox の Live HTTP headers を使ってレスポンスヘッダを見ても、下記のように Content-Type はどちらも1つしかない。lighttpd の前記の動作を確認することはできない。 Firefox Live HTTP headers Apache HTTP/1.x 200 OK Date: Fri, 12 Dec 2008 15:23:14 GMT Server: Apache/2.2.3 (CentOS) Content-Length: 34 Connection: close Content-Type: text/plain; charset=UTF-8 lighttpd HTTP/1.x 200 OK Transfer-Encoding: chunked Content-Type: text/plain Date: Fri, 12 Dec 2008 15:23:55 GMT Server: lighttpd/1.4.20 wget -S 今度は wget -S オプションで server response を見るようにしてみると、lighttpd の方は Content-Type がそのまま二重に出力されていることが確認できた。 ...

2008年12月12日 · Toshimitsu Takahashi

jQuery の ID で対象ノードを取得する処理を高速にしたい

てっく煮ブログさんのエントリー jQuery を高速に使う CSS セレクタの書き方 - てっく煮ブログ をみてて、jQuery の $("#xxxx") を速くしたいと考えていたことを思いだした。それについて書く。 jQuery の $("#xxxx") について セレクタをどう処理しているのか jquery-1.2.6.js で確認してみよう。 まず下記の init が $() に相当する。Handle HTML stringsのところで引数が string だと quickExpr.exec が走る。これは正規表現でのセレクタ解析処理である。 その後、HANDLE: $("#id")のところでマッチして取得した ID を使って、var elem = document.getElementById 使い、それを return jQuery(elem) として再び init が呼び出される。 jQuery.fn = jQuery.prototype = { init: function( selector, context ) { // Make sure that a selection was provided selector = selector || document; // Handle $(DOMElement) if ( selector.nodeType ) { this[0] = selector; this.length = 1; return this; } // Handle HTML strings if ( typeof selector == “string” ) { // Are we dealing with HTML string or an ID? var match = quickExpr.exec( selector ); // Verify a match, and that no context was specified for #id if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array) if ( match[1] ) selector = jQuery.clean( [ match[1] ], context ); // HANDLE: $("#id") else { var elem = document.getElementById( match[3] ); // Make sure an element was located if ( elem ){ // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id != match[3] ) return jQuery().find( selector ); // Otherwise, we inject the element directly into the jQuery object return jQuery( elem ); } selector = []; } // HANDLE: $(expr, [context]) // (which is just equivalent to: $(content).find(expr) } else return jQuery( context ).find( selector ); // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) return jQuery( document )[ jQuery.fn.ready ? “ready” : “load” ]( selector ); return this.setArray(jQuery.makeArray(selector)); }, ...

2008年12月11日 · Toshimitsu Takahashi

.NET / WebBrowser コントロールで Java アプレットを起動するとデータ実行防止(DEP)で落ちるとき

Windows Vista や Windows XP SP2 で DEP がオンになっているとき、Javaアプレットをカスタム WebBrowser で実行すると AccessViolationException で落ちてしまう。実行時にはデータ実行防止(DEP)が働いたといわれる。 そんなときは、Visual Studio 2008 でプロジェクトのプロパティ⇒「ビルド イベント」⇒「ビルド後に実行するコマンド ライン」に call “C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat” editbin.exe /NXCOMPAT:NO “$(TargetPath)” を定義しておくと、「データ実行防止との互換性」が無いことになり、DEP が発生しなくなる。(ちなみに Release でビルドして、そのまま Visual Studio から実行すると vhost.exe の方で落ちてしまう。) 参照) http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3818241&SiteID=1 http://msdn.microsoft.com/ja-jp/library/ms235442.aspx

2008年12月9日 · Toshimitsu Takahashi

lighttpd で FastCGI を index-file.names として指定しても Not Found になってしまう

index-file.names = ( “index.fcgi” ) fastcgi.server = ( “/index.fcgi” => ( “portal” => ( “socket” => “/var/lib/lighttpd/fastcgi/index.fcgi.socket”, “bin-path” => “/www/portal.cgi”, “check-local” => “disable”, “min-procs” => 1, “max-procs” => 1, “max-load-per-proc” => 50 ) ) ) 上記のように / を index.fcgi で受けようと設定したが、Not Found 404 になってしまった。ここでダミーのファイル index.fcgi を置くと動くようになる。 つまり、index-file が存在するかの確認は fastcgi.server のマッチングを判定しておらず、実際のファイルを見にいってしまう。bin-path とマッチが同じになっていれば気づかない。 Apache から lighttpd に乗り換え中だが結構いろいろ引っかかってくる。

2008年12月8日 · Toshimitsu Takahashi