2010-01-24
風呂桶一杯の水道水の脱塩素に必要なビタミンCの量
計算
日本国の法律で決まっている最低限の塩素濃度すなわち次亜塩素酸ナトリウム濃度は、0.1ppmとあり、200Lの水で考えると、次亜塩素酸ナトリウムの比重を気にしないで計算すれば、0.02g また、次亜塩素酸ナトリウムの式量は77.44
ビタミンCすなわちL-アスコルビン酸ナトリウムの式量は、198.11で、1分子で電子3個分還元できるとのことなので、必要なビタミンCの質量は、(0.02 / 77.44) / 3 * 198.11 = 0.017g
考察
高度浄水処理施設のない給水地域は夏場には結構塩素濃度を上げるみたいですが、ビタミンC粉末は意外と安いので、水200LあたりビタミンCを1グラムほど入れておけば、6ppmくらいまで対応出来るようで一安心です。比重が水に近い普通の粉末1グラムは、小さじ1/5杯です。
備考
ビタミンC粉末はあまり地上のお店ではお手頃な価格で売られていない様ですが、楽天市場などで探したら売っています。
また、お湯を張る前に湯船の底にまいておいた方が、湯張中に蒸気になって鼻がつんとするのを防げます。
2010-01-22
TwitterのStreaming APIにおける日時表現の解析について
目的
DateTimeが便利なので、DateTime::Format::*で、Streaming APIで流れてくる、こういう表記 "Fri Jan 22 13:52:17 +0000 2010" を上手くパースしたい。
この表記方法は、古き良き時代を感じさせるctime()に由来するものであるとのこと。日付の表記に関するノート
現状
DateTime::Format::HTTP, DateTime::Format::Mail は失敗。
ただし、+0000をUTCとかGMTに置換すればDateTime::Format::HTTPでOK
DateTime::Format::DateParse は成功。これを使うべき。
DateTime::Format::Strptime で自作しても可(DIY派専用)
コード片
use DateTime::Format::DateParse;
my $dt = DateTime::Format::DateParse->parse_datetime('Fri Jan 22 13:52:17 +0000 2010');
use DateTime::Format::Strptime;
my $formatter = DateTime::Format::Strptime->new(
pattern => '%a %b %d %T %z %Y',
locale => 'en_US',
);
my $dt = $formatter->parse_datetime('Fri Jan 22 13:52:17 +0000 2010');
2010-01-16
[PHP] 1年後まで有効とするExpiresヘッダを出力
説明
コピペで世の中に出回っているコードはあまり格好良くないので、改良してみました。パフォーマンス的にはイマイチでも、見た目重視ということにしました。
このようなヘッダは、クライアントにコンテンツを積極的にキャッシュさせるため、期限切れまで全く確認のリクエストなしで使われます。自分が何をしているのか意味をわかって使うべきものです。
コード
header('Expires: ' . gmdate('D, d M Y H:i:s T', strtotime('+1 year')));
出力例
Expires: Sat, 15 Jan 2011 15:02:20 GMT
2010-01-15
jQuery 1.4 の互換性について
この記事について
jQueryチームのみなさん、リリースおめでとうございます。毎日とても役に立っています。
公式サイトを見に行くと、パフォーマンス改善が素晴らしいとありますが、あまりパフォーマンスで困っている人はいないと思うので、一番欲しい情報はversion 1.3から乗り換える際の互換性についてではないでしょうか。
後方互換性を失う変更の一部
$.ajaxで、複数の値を持つパラメータ(data:{a:[1,2,3]} など)のシリアライズ方法の変更。
$() (引数なし) を$(document)と解釈するのを止めた。
addは単なるaddではなく、同じものが複数入らないように、mergeするようになった。
$.ajaxで、dataType無指定の時の自動判断に、Content-Typeを尊重するコードが追加された。
自分が困ったこと
jQuery.ajaxで、dataType無指定の自動判断のまま1.3.2までなんとか動いていたところが、Content-Type: text/javascriptのJSONを受け取っていたため、1.4からIE8でセミコロンがありませんという変なエラーが出るようになった。
対策:dataType: "json"とする。また、Content-Type: application/jsonで吐き出すようにする。詳しくは、ソースコードを"httpData:"で検索
リンク
Backwards-Incompatible Changes
Version 1.4 - jQuery API 新機能と変更点についての公式ドキュメント
14 Days of jQuery リリース記念ブログ。
AnyEvent::Handleの怪
概要
AnyEvent::Handleを使っていて困ったことについて。
本文
on_readやpush_readしていない場合など、read watcher が止まっている時は、クライアント切断時にon_errorやon_eofが即座には呼ばれず、push_writeした時になる。さらに、push_writeしなければ、ずっとエラーを検出できない。対策:手動でstart_readしておく。
独自のwbuf(write buffer), rbuf(read buffer)を持っているので、いったん使い始めたら、途中で使うのをやめる時には注意が必要。
push_shutdownはon_drainを上書きする。on_readとpush_readは別々に存在できたのに困る。内部にwrite queueが存在しないのが原因。
2010-01-10
Windows付属のnslookupをもっと活用する
Windowsに付属している唯一のDNSトラブルシューティングツールnslookup.exeは、ドキュメントが不足しているせいで、本来あるべき姿に比べてあまりにも活用されていない状況です。
この記事では、いちいちうざったい対話的インターフェースじゃなくて、コマンドラインインターフェイスの方について使用例を書きます。
基本編
8.8.8.8はGoogleの提供するDNSサーバーなので、必要に応じてISPのDNSサーバーや、DNSコンテンツサーバー(権威サーバー)などに読み替えてください。
- nslookup example.com
- サーバーを指定しなければ、既定のDNSサーバーに問い合わせをする。
- nslookup example.com 8.8.8.8
- DNSサーバーをGoogle Public DNS: 8.8.8.8に指定する。デフォルトではAレコードを取得。
- nslookup -type=ns example.com 8.8.8.8
- 必要に応じて-typeで指定する。
- nslookup -type=mx example.com 8.8.8.8
- MXレコードを確認してメールの配信先を確認する。
- nslookup -type=soa example.com 8.8.8.8
- SOAシリアルできちんと最新版になっているかを確認する。
- nslookup -type=txt example.com 8.8.8.8
- TXTレコードを引いて迷惑メール対策用のSPF認証レコードなどを調べる。
応用編
- nslookup -debug example.com 8.8.8.8
- -debugを付けると詳細情報を表示。TTLなどが分かる。一つ目のGot answerは関係のない逆引きクエリについてなので注意。
- nslookup -timeout=10 -type=txt porttest.dns-oarc.net
- DNS-OARCのソースポートのランダム性チェックは標準のタイムアウト2秒だと間に合わないので少し延長する。
- nslookup -type=ns example.com a.root-servers.net
nslookup -type=ns example.com a.gtld-servers.net - Rootサーバーから手動で再帰的問い合わせをして、委譲状況を確認する。
- nslookup -type=txt twitter.wp.dg.cx
- WikipediaのDNSインターフェース(笑)で、"twitter" について調べる。
備考
-typeは-qでもOK