Perl でフォームデータから UTF-8 日本語文字をとりだす方法
UTF-8 のフォームによっておくられたデータのなかから日本語文字をとりだすことは,日本の Perl CGI プログラマならたいてい必要になることである. ところが,その方法は意外に確立されていないようにみえる. ここでは私が試行錯誤したうえ確立した方法を書く.
UTF-8 のフォームによっておくられたデータのなかから日本語文字をとりだすことは,日本の Perl CGI プログラマならたいてい必要になることである. ところが,その方法は意外に確立されていないようにみえる. ここでは私が試行錯誤したうえ確立した方法を書く.
ストリーム・データ処理は通常はデータベースの処理と同様にインタプリタ的に実行される. しかし,ここではクエリの実行のしくみをみるために,あえてそれを Perl のプログラム (“コンパイル・コード”) でシミュレートしてみる. とりあげる例題は STREAM (Stanford Stream Data Manager) や ATLaS (Aggregate & Table Language and System) でも使用されているオンライン・オークションである. なお,このページでは構造的な Perl に翻訳するやりかたをしめす. 「ストリーム・データ処理によるオンライン・オークションのシミュレーション (非構造化版)」 においては goto 文をつかった非構造的な版のプログラムをしめす.
ストリーム・データ処理は通常はデータベースの処理と同様にインタプリタ的に実行される. しかし,ここではクエリの実行のしくみをみるために,あえてそれを Perl のプログラム (“コンパイル・コード”) でシミュレートしてみる. とりあげる例題は STREAM (Stanford Stream Data Manager) や ATLaS (Aggregate & Table Language and System) でも使用されているオンライン・オークションである. なお,このページでは非構造的な Perl に翻訳するやりかたをしめす. 「ストリーム・データ処理によるオンライン・オークションのシミュレーション (構造化版)」 において,構造化されたプログラムをしめす.
データストリーム管理システム (DSMS) の例題として,STREAM (Stanford Stream Data Manager) や ATLaS (Aggregate & Table Language and System) などにおいて,オンライン・オークションに関するものがとりあげられている. オークションの例題のひとつとして,「現在開催されているオークションをもとめる」 というものがある. STREAM,ATLaS の両方でとりあげられているが,どちらの記述も問題がおおいとおもわれる. この例題について,かんがえてみる.
関係データベースがひろくつかわれるようになっているが,SQL によって記述したクエリがどのように実行されているかは不透明である. クエリは通常,DBMS の内部でインタプリタ的に実行される. 機械語にコンパイルせずに実行されるおもな理由は,クエリの対象であるテーブルの性質をみて実行時にクエリを最適化することが重要だからである. しかし,ここではクエリの実行のしくみをみるために,あえてそれを Perl のプログラム (“コンパイル・コード”) でシミュレートしてみる.
ちょっとした必要があって JavaScript をつかったタイマーをつくった. プログラムをみるにはこのページをひらいて,Web ブラウザのメニューバーから 「表示 > ページのソース」 を選択して,みてもらう必要がある.
Perl には tie() というくみこみのサブルーティンがあって,ハッシュに設定した値を自動的に外部ファイルにかきこむことができる. ただし,このハッシュにはどんな値でもかきこめるというわけではなく,構造データをいれることができない. したがって,Perl の内部であつかう複雑なデータ構造をファイルにかきこむには,他のおおくの言語におけるのと同様に,データ構造を線形化 (serialize,シリアライズ) してやる必要がある. ここでは線形化 (serialization,シリアライゼーション) と逆線形化 (deserialization,デシリアライゼーション) の方法について書く.
SSIP コミュニケータは GUI ベースでチャットができる,みじかい Java のプログラムである. プロトコルと通信プログラムの学習のためにつかうことを意図している. まずプログラムをうごかしてみてください. そして興味があれば,なかをのぞいてみてください. ここでは SSIP というプロトコルと SSIP コミュニケータの 使用法,構造などについて説明する. また,SSIP の問題点とその可能な解決策などについてもふれる.
私がもっともふるくから公開しているプログラムとして,JavaScript をつかって書いた単純な電卓がある. プログラムをみるにはこのページをひらいて,Web ブラウザのメニューバーから 「表示 > ページのソース」 を選択して,みてもらう必要がある.
RTP (Real-time Transport Protocol) による 2 チャンネル (ステレオ) の音声 (VoIP, Voice over IP) を受信してオーディオ再生するプログラムをしめす. 音声は 16 bit 線形を基本とするが,u-Law (G.711) などもあつかえるようにしてある. 受信のためのポート番号はこのプログラムのなかで指定されている ($IN_PORT_RTP). とりあえず,こまかい説明ははぶくが,あとで必要に応じて説明をくわえることにしたい.
ファイルにふくまれる音声 (VoIP, Voice over IP) を RTP (Real-time Transport Protocol) によって送信する Perl プログラムをしめす. 音声は線形 16 bit を基本とするが,u-Law (G.711) などもあつかえるようにしてある. 送信・受信のためのポート番号と受信者の IP アドレスはこのプログラムのなかで指定されている ($REMOTE_PORT_RTP, $LOCAL_PORT_RTP, $ip など). RTCP (Real-Time Control Protocol) もあつかっているが,RTCP によって特別の制御をしようとしているわけではない.
つぎつぎと入力されてくるデータを固定長の配列をつかってバッファリングするとき,たとえば VoIP (Voice over IP) の音声を入力するプログラムにおいて,リングバッファというデータ構造がよくつかわれる. リングバッファをきちんとつくるのがめんどうだったので,Perl をつかって,常にあたらしい要素を配列の末尾に追加する “疑似リングバッファ” による VoIP のプログラムをつくった. これでリアルタイムにちゃんと動作するのかどうか不安だったが,「Perl によるリアルタイム音声処理 ― voiscape 3D 化プログラムの奇跡」 にも書いたようにうまく動作したので,ここではこの “疑似リングバッファ” について書いてみる.
Linux 上でイーサネットのハブのようなふるまいをするプログラムをつくろうとすると,ソケットを promiscuous mode (プロミスキャス・モード) で動作させる必要がある. きちんとハブとして動作させようとするとやや複雑なプログラムを書く必要があるが,ここではもっとさぼって,ハブにちかいがもうすこしいいかげんに動作するプログラムをしめす.
音声にしろ動画にしろ,おおくのコーデックの処理は複雑で,ライブラリのお世話にならなければならない. しかし,電話などでつかわれる G.711 という ITU-T 標準のコーデックは非常にかんたんであり,ほとんどテーブル引きだけで実現することができる. ここでは Perl による G.711 の変換・逆変換のプログラムをしめす. もちろん,Perl の特殊機能はつかっていないので,他の言語に容易にかきかえることができる.
複数のコンピュータをネットワークを介してつなぎ,それらにのせられたアプリケーションのあいだで相互に通信させる実験をするとき,実験を起動するのに,最初に通信をおこなうアプリケーションのポートをたたくようにするのが便利である. この目的で内容のない UDP (User Datagram Protocol) メッセージをおくるプログラムを書いてみた (UDP を TCP にかえるのは容易であるが,受信プログラムはやや複雑になる).
ただしい XML インタフェースをつくるには XML の API をつかう必要があるが,かんたんに XML (もどき) のインタフェースをつくるには,Perl のパターンマッチ機能をつかうのが便利である. 本来の XML は 1 行にいくつタグがあってもよいし,タグでかこまれる内容が複数行にまたがってもかまわないが,それに制限をくわえればかんたんに処理することができる. こんなインチキな XML 処理は奨励されないかもしれないが,ちょっとしたプロトタイプをつくるには便利である.