| 登録日時▼ 更新日時 |
内容 | |
|---|---|---|
| 詳細編集 | 2012/5/18 0:00 | Perl + C + JavaScriptで動作するリアルタイムWebチャット構想数年、着手約3ヶ月、やっとベータ版が完成しました。リアルタイムWebチャットサービスの "ChatPrompt" です。 まだ一部機能(Ajaxエラー発生時の再送等)が未実装ですが、C言語での作成部分が開発環境ではテストしきれないので、実環境にアップしてしまいました。 ChatPrompt
http://www.chatprompt.com/ さくっと個別のチャットを作れて、ユーザ登録等の面倒な手続きも不要なので、ぜひ使ってみてください。 とても質素なWebサイトにも関わらず、これでもだいぶん時間がかかってしまいました。作業時間があまり取れなかった事もありますが、けっこうこだわってじっくり作った自己満足の固まりです。 以前、シェル風のWebインターフェース(LFshell)とCometを使った簡易なWebチャット(LFchat)を作った後に、これらをミックスしたシンプルで高速なリアルタイムチャットを作りたいなぁ、とずっと思っていました。 以下、その自己満足さ加減がよく分かる説明を自己満足満載にしているので、ぜひ読んでください。 Comet処理をC言語で実装&カーネルイベントの使用で効率化リアルタイムチャットを実現するためにロングポーリングのCometを使用しています。CGIベースのレンタルサーバでこれを実現しているので、利用中のユーザ数分のプロセスがWebサーバ側で動作する事になります。共用のレンタルサーバなので使用リソースを最小限にするために、Comet処理を担当するCGIはC言語で作成しています。また、メッセージの書き込みをカーネルイベントで取得しているので、待機中の負荷も最低限に抑えています。プロセス数を抑えるために、同時セッション数が一定以上になった場合は間欠ポーリングになります。 リクエストをキュー処理してセッション数を削減高速なインターフェースを実現するためにAjaxを使っていますが、ユーザの入力の度にAjaxリクエストを行うとサーバが混んでいる等でレスポンスが遅い場合にセッションが重複してしまいます。ChatPromptでは送受信それぞれ1セッションまでに制限するようキュー処理を行っています。1回のAjax処理中にユーザの入力があっても、それらをキューに退避し、Ajax処理完了後、次のAjax処理でワーカーがまとめてリクエストします。 CSSとJavaScriptの縮小化データ転送量を削減するために、CSSとJavaScriptを縮小化しています。これらコード自体を動的に変更しているので、縮小化もオンザフライで行っています。 各種ブラウザに対応なんと今さらInternet Explorer 6にも対応。Firefox、Safari、Chrome(あ、Opera忘れてた。。)の他、iOSのMobile Safari、アンドロイドにも対応させています。これらスマホ系のブラウザで実装されているViewportにも対応しており、画面の拡大縮小に合わせてコンテンツの幅を自動調整します。 新たなにPerlのWebアプリケーションフレームワークを作成これまで数年間Waftを使ってきましたが、Waftは上位互換と拡張性を意識しすぎてコードが複雑になりOOも活かしきれていませんでした。これを機に関数ベースでWaftの便利機能のみを切り出していくつかの新機能を追加し、Oneという小さなフレームワークモジュールを作りました。デフォルトでContent-Lengthの出力に対応してたり、CGIクエリの展開変数にtieを使ってわざわざundef確認しないでもよくなったり、けっこういい感じのモジュールなんですよ。 まだまだ書き足りない。。 |
| 詳細編集 | 2012/4/19 18:56 | GALAXY NEXUS SC-04Dの電池消費量の比較データ通信のみのMVNOのSIMカードをAndroidスマートフォンで使用した場合に、セルスタンバイが電池を大量に消費するという事象があり、程度は機種に依るようです。 手元にあるGALAXY NEXUS SC-04DとIIJmio高速モバイル/DのSIMカードを使って、電池消費量を確認しています。 電池消費量の平均値IIJmio (昼間): 9.95%/12時間
IIJmio (夜間): 5.57%/12時間 音声のみ(夜間): 4.68%/12時間 SIM無し : 2.94%/12時間 「IIJmio」がIIJmio高速モバイル/DのSIMカード、「音声のみ」はiモード契約のないケータイのFOMAカード、「SIM無し」はSIMカードを挿していない状態での電池消費量です。 「夜間」はすぐ近くに基地局がある場所での静止時で、「昼間」は徒歩や電車・バスでの移動を含んでいます。 いずれも、電池の状況を見るための操作時以外は(使いたいのを我慢して、、)常にスリープにしています。Wi-FiとBluetoothはOFF、アカウントと同期の設定とGPSもOFFです。その他設定もほぼ初期のままですが、これらは相対的な値として参考にしてください。本来、最も一般的な音声通話とデータ通信契約のSIMカードによる値が必要なところですが、パケホ契約が無いので試せていません。。 実測値IIJmio SIM無し 音声のみ SIM無し IIJmio |
| 詳細編集 | 2011/12/30 17:10 | EncodeMIMEHeader - 全ての文字を1行76バイト以内にMIMEヘッダエンコードする.mailfilterに続きNTTドコモの「メール使いホーダイ」ネタ第3弾。 ケータイからFacebookに投稿したいけど、Facebookの投稿用メールアドレス宛に送信しても反映されるのはメールの件名に書いた分だけで、メール本文は無効なのです。ぼくのケータイは件名が30バイトまでしか対応していない古いタイプなので、これでは短い文章しか投稿できない! なので本文を件名に埋めて投稿用メールアドレス宛に再送信するプログラムを作ったのですが、Encode::MIME::Headerでエンコードした文字列がFacebook側でうまくデコードされなかったのです。どうやら$especialsで定義されている文字が含まれているとうまくいかない。 いろいろ考えた結果、RFCを満たさんけどもう全部エンコードしてしまおうと、でも守れるところは守ろうと1行は76バイト以内に収めるエンコードモジュールを作りました。 概要use EncodeMIMEHeader qw( encode_MIME_header );Subject: =?UTF-8?B?6aOf5Y2T44Gu6Zu754Gv44CB6Zu755CD44GM5YiH44KM44Gf44Gu?=
=?UTF-8?B?44GnIExFRCDjgavlpInjgYjjgb7jgZfjgZ/vvIFBbWF6b24g44GnIDEsNzQ1?= =?UTF-8?B?IOWGhiB4IDMg54Gv44CB54ax44GP44Gq44GP44Gm5piO44KL44GV44KC5Y2B?= =?UTF-8?B?5YiG44CC6Imv44GE44Gn44GZ77yB?= ソース |
| 詳細編集 | 2011/7/9 11:20 | Waftで304 Not Modifiedを出力するコード最近いろいろなプログラムで使い回している、Waftで304 Not Modifiedを出力するためのコード。本体に組み込もうかなぁ。 sub Waft::not_modified_since {使い方は以下のとおり。directメソッド等の中で呼び出して、戻り値が真なら処理を終了させます。引数にコンテンツの更新日時をUNIX time(time関数で得られる形式)で指定してください。 sub __default__direct { |
| 詳細編集 | 2011/7/3 0:18 | .mailfilterでケータイへの転送メールを一部制限(さくらのレンタルサーバを使用)NTTドコモの「メール使いホーダイ」を契約したので、メールだけはパケット代を気にせずケータイで送受信できるようになりました。PCで使っているメールもケータイに転送設定しておくと便利♪ではありますが、メールアドレスをWebにさらしているために迷惑メールがハンパない訳で、これが全部ケータイに転送されるととっても困ります。 メールサーバ内でSpamAssassinが動いてくれているので、これを使ってケータイへの転送を振り分けてみます。SpamAssassinが迷惑メールの程度をX-Spam-Levelで示してくれる(「*」が多いほど迷惑メールである可能性が高い)ので、まずその程度を決めてみました。 .mailfilterに以下を設定。 if ( ! ( /^X-Spam-Level: \*{3,}/ ) )これでめでたく迷惑メールでないメールだけがケータイに転送されるようになりました。 の、はずだったのですが、それでも次々に転送されてくる迷惑メール。どのメールも、件名に「=?koi8-r?B?~」とケータイでデコードされないMIME。koi8-rってどこ?(ロシア、でした。)このメールだけはX-Spam-Levelが3以上にならないので、仕方なく個別に転送を拒否します。 if ( ! ( /^X-Spam-Level: \*{3,}/ || /^Subject: =\?koi8-r\?B\?/ ) )ひとまずこれに落ち着きました。 しばらく経って、少し変更。 なので、メールを転送する時にenvelope sender、いわゆる送信元(Envelope-FromやSenderとも)を変更する事にしました。 if ( ! ( /^X-Spam-Level: \*{3,}/ || /^Subject: =\?koi8-r\?B\?/ ) )直接ケータイのメールアドレスを指定して転送させるのではなく、メールをsendmailに渡してケータイに送信させます。その際にsendmailの-fオプションで送信元のメールアドレス、つまりエラーメールの送信先とするメールアドレスを指定します。 これで、配送エラーが発生した場合のエラーメールは、元の送信者に送信される事なく、指定した送信元メールアドレス宛に届くようになりました。(指定するケータイのメールアドレスを存在しないメールアドレスに変えて試してみると確認できます。)メールのループが発生しないよう、送信元メールアドレスには転送設定をしない別のメールアドレスを指定しましょう。 |
| 詳細編集 | 2011/6/10 10:18 | メールをトリガーに任意のPerlスクリプトを実行する(さくらのレンタルサーバを使用)ケータイのパケット定額サービスの料金は数千円とまだまだ高く契約を躊躇してしまいます。でも外出中にネットにつなげられるとやっぱり便利ですよね。 ひとまず、メールを受信してPerlスクリプトを実行するところまでをざーっと作ってみました。 1. スクリプトファイルをサーバに置く末尾のスクリプトをサーバに置いてください。これ以降、以下の条件で記載するので適宜読みかえてくださいね。 アカウント名 : ACCOUNT
スクリプトファイルを置く場所: /home/ACCOUNT/www/bin/ スクリプトのファイル名 : run.pl メールアドレス : run 安全のため、http経由では実行できないよう、スクリプトファイルを置く場所には以下のよう設定しましょう。.htaccessでアクセス制限しておくとより安心です。 % chmod 700 /home/ACCOUNT/www/bin run.plには実行フラグを付与します。 % chmod +x /home/ACCOUNT/www/bin/run.pl 2. run()の中に任意の処理を書くrun.pl先頭部のrunサブルーチンの中に、実行したい処理を書いてください。第1引数にメールの件名、第2引数にメールの本文が渡されます。 3. メールアドレスを作成するサーバコントロールパネルでrunというメールアドレスを作成してください。 4. .mailfilterを作成する作成したメールアドレスに.mailfilterを設定します。 % vi /home/ACCOUNT/MailBox/run/.mailfilter 以下の内容を記述してください。 if ( (1) )if文で囲んだのは、サーバコントロールパネルからメールの設定変更をしても内容が上書きされないようにするためです。それをしないのであれば、toの行だけでも良いと思います。 あと、ファイルモードを600にしないといけません。 % chmod 600 /home/ACCOUNT/MailBox/run/.mailfilter ※この.mailfilterの設定が重要なのですが、公式な機能では無いと思いますので、行う場合は自己責任の下でお願いします。設定方法は「さくらのレンタルサーバ非公式FAQ」を参考にしました。感謝です! メール < Wiki | さくらのレンタルサーバ非公式FAQ
http://faq.sakuratan.com/wiki/wiki.cgi?%a5%e1%a1%bc%a5%eb#i37 ※でも、カスタマーセンターから.mailfiterに関する回答の引用があったり、あと実際に公式のFAQにも.mailfilterの記載があったり、と実は公式な機能なのかもしれません。 5. 完了!これで、run宛にメールを送信したらrun.plが実行されます。 スクリプト#!/usr/bin/perl |
| 詳細編集 | 2011/6/9 5:35 | 正規表現の先読みと後読みを使いこなすPerlにはルックアラウンドアサーション(lookaround assertion)という4つの正規表現拡張があります。肯定の先読み・否定の先読み・肯定の後読み・否定の後読みの4つです。 (?=...) : 肯定の先読み
(?!...) : 否定の先読み (?<=...): 肯定の後読み (?<!...): 否定の後読み これらの使い方を紹介します。 例えば、HTMLのタグとタグの間の空白文字をs///演算子で全て取り除きます。 $html =~ s/>\s+</></g; # ルックアラウンドを使わないと書けます。少し読みにくくなるので、Perlベストプラクティスで書きます。 $html =~ s{ > \s+ < }{><}gxms; # ルックアラウンドを使わない。Perlベストプラクティスの書き方となります。 ですが、置き換える必要のない山カッコまで置き換えるのはスマートではないですよね? 直前に左山カッコが現れる位置を肯定の後読みでマッチさせて、直後に右山カッコが現れる位置を肯定の先読みでマッチさせる事で、山カッコを置き換えず、空白文字だけを置き換える(ここでは取り除く)対象にできます。 $html =~ s{ (?<= > ) \s+ (?= < ) }{}gxms; # ルックアラウンドを使うただ、これではファイル先頭もしくは末尾に空白文字がある場合にそれを取り除く事ができません。 $html =~ s{ (?: \A | (?<= > ) ) \s+ (?: (?= < ) | \z ) }{}gxms;と長くなってしまいます。 否定の後読みおよび否定の先読みと文字クラスの否定を使うと、以下のようにもっとシンプルに表現できます。 $html =~ s{ (?<! [^>] ) \s+ (?! [^<] ) }{}gxms;これは、 (?<![^>]): 直前に右山カッコ以外の文字は現れない
(?![^<]) : 直後に左山カッコ以外の文字は現れない という表現になり、つまり、 (?<![^>]): 直前に右山カッコが現れる、もしくは文字が無い
(?![^<]) : 直後に左山カッコが現れる、もしくは文字が無い という意味になるためです。おもしろいですね! |
| 詳細編集 | 2010/9/29 11:02 | Synergyが動作しない場合はVisual C++のランタイムをインストールする素のWindows XP SP3にSynergyをインストールしても動作せず。Visual C++のランタイムをインストールしたら動作するようになりました。 ダウンロードの詳細 : Visual C++ 2008 SP1 再頒布可能パッケージ (x86)
http://www.microsoft.com/downloads/details.aspx?familyid=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2&displaylang=ja |
| 詳細編集 | 2010/8/29 7:03 | Windows 7 でユーザーのプロファイルを初期化する 1. 再起動 2. 対象ユーザー以外のユーザーでログイン 3. C:\Users\<対象ユーザー> を削除 4. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\<対象ユーザーの SID> を削除 |
| 詳細編集 | 2010/6/6 14:30 | Tokyo Cabinet + Starmanで住所検索高速なKVSであるTokyo Cabinetと高速なWebサーバStarmanを試してみたいなぁ、と思い、Ajaxを使った簡単な住所検索アプリを作ってみました。 ※wataさんが、Tokyo Cabinetの後継のKyoto Cabinetを紹介されています。 Kyoto Cabinet + Starmanで住所検索 ...を試してみた - ワタブログ
http://wata-jp.ldblog.jp/archives/1652876.html 1. PlackとStarmanをインストールCPANでPlackとStarmanをインストールします。 % sudo cpan Plack % sudo cpan Starman 2. Tokyo CabinetとPerl用APIをインストールソースパッケージとPerl用APIをダウンロードします。 データベースマネージャ Tokyo Cabinet
http://1978th.net/tokyocabinet/ tokyocabinet-1.4.45.tar.gz
perlpkg/tokyocabinet-perl-1.33.tar.gz まずはTokyo Cabinetのインストール。私の環境(Ubuntu 9.10)ではbzlib.hが不足してたので、先にlibbz2-devをインストールしておきました。 % tar xzvf tokyocabinet-1.4.45.tar.gz % cd tokyocabinet-1.4.45 % ./configure --prefix=/usr/local/tokyocabinet % make % sudo make install 次にPerl用APIをインストールします。 % tar xzvf tokyocabinet-perl-1.33.tar.gz % cd tokyocabinet-perl-1.33 % PATH=$PATH:/usr/local/tokyocabinet/bin perl Makefile.PL % make % make test % sudo make install 3. KEN_ALL.tchを作成住所検索の情報となる郵便番号データを日本郵便のサイトからダウンロードします。“読み仮名データの促音・拗音を小書きで表記しないもの”の“全国一括”のken_all.lzhです。 郵便番号データダウンロード - 日本郵便
http://www.post.japanpost.jp/zipcode/download.html これを展開したKEN_ALL.CSVから、以下のスクリプトを使ってTokyo Cabinetのハッシュデーベースファイルを作ります。今回作る住所検索アプリでは郵便番号を1桁入力した時点から候補を表示するようにしたいので、1桁~7桁のパターン毎に10個までの候補を記録しておきます。テーブルデータベースを使うともっとスマートに構成できそう? #!/usr/bin/perl4. PSGIを作成住所検索アプリとなるプログラムをPSGI仕様で作成します。こちらもtieを使いました。 5. PSGIを起動してブラウザでアクセス作成したPSGIをStarmanで起動します。デフォルトのポート5000でWebサーバとして動作します。これで準備完了です。 % starman ken_all.psgi ブラウザからWebサーバにアクセスします。ローカルホストであればURLはhttp://localhost:5000/です。テキスト入力欄に数値を入力すると、その下に瞬時に住所が表示されます。速い! |
玉城 勇二 気ままにでもなるべく正確に、人に迷惑をかけないよう心がけて書いています。ご意見・ご感想は管理者のページからメッセージ送信してください。お待ちしています。