カテゴリー: Computer

  • .mobiドメイン承認

    何度か「もう新しいドメインは必要ない」とこのブログに書いていますが、ICANNはモバイル用に.mobiを承認したようです。

    EU用の.euドメインは、EUが最終的には統一国家のような体制を目指しているので必要かとおもいますが、アダルトサイト用.xxxやモバイル用.mobiはドメイン名のレジストラとごく一部の利用者(ドメインを必要とするもの)を除いて不必要なドメインです。管理上、地域別にドメイン名を付けるのは理解できます。しかし、サイトの種類に応じてドメイン名を付ける、と言うアイデアは破綻している事が証明されてから久しいです。トップレベルのドメイン名がどんどん増えていますが、レジストラのみ儲ける仕組みですね。
    # 会社名.xxx等をアダルトサイト運営者に取得されないように
    # するためだけに企業が.xxxドメインを取得するのは目に見え
    # ています。.xxxドメインの半数以上は普通の企業のドメイン
    # となると思います。(アダルトビジネスを甘く見すぎ?)

    ところでアフリカ連合が統一国家的な体制になった場合、ドメイン名をどうするか問題になりますね。.auは既に使用済みです。この心配が現実になるとしても少なくとも50年以上先の話とは思いますが。

  • 不必要なIT化?!

    裁判で電子投票の無効が確定したそうです。

    前から思っていたのですがタッチパネルだけで投票する事がそんなに便利なのでしょうか?自宅にいながらインターネット経由で投票できるならまだしも、投票所に行かなければならないのにタッチパネルで投票する事の意義は無いと考えています。物理的に投票者が投票所に行くのですからもっとセキュアな仕組み(検証可能であることも含む)にするべきだと思います。
    # 私が知っている電子投票システムはタッチパネルの物ですが
    # 岐阜県可児市議選のシステムも同じかどうかは知りません。

    私がシステムを設計するのであれば、マークシートとシートリーダを用意して投票と同時にマークシートを読み取らせる様にします。集計結果は投票時間が終了するまで誰も見れない仕組みにすればよいでしょう。万が一、集計データがなくなったり、今回の裁判の様に機器が使えなくなってもも後でマークシートを読めばよいだけです。選挙結果に異議がある場合もマークシートを読み直せばよいだけです。最悪の場合、アメリカの大統領選の様に人間がマークシートを一枚一枚確認する事態になるかも知れませんが、それでもタッチパネルだけの投票より遥かに容易に結果を再検証可能です。完全な電子投票では結果の検証手段が無いという致命的な欠陥があります。

    利便性向上も目的の一つですが、電子投票にしたために投票をやり直すようでは経費もそうですが、利便性は低下するばかりです。

    将来はネットワーク経由で投票を行えるようにするための実験として紙などを利用しない投票形式にしているのかも知れませんが、個人的には10年後でもネットワーク経由での電子投票には反対すると思います。安全性への疑問が拭いきれないからです。投票所に行かずに投票を行うことは不可能である事を前提とすると、今の電子投票システムは無用の長物としか思えません。電子投票システムの実験をしたいなら別途行って欲しい物です。

    経費節減が電子投票推進の理由の一つになっていますが、投票用紙をマークシートにするだけも十分費用削減効果があるのではないでしょうか?そしてマークシート式投票用紙を使用した方が安全性など含め優れた点が多いのではないでしょうか?

    さらに各自治体がいろいろな電子投票システムを作っていると思いますが、この状況は改善したのでしょうか?ばらばらに作っていたのでは税金の無駄遣いです。かと言ってシステムを統一すると不正が発生するリスクが大きくなってしまいます。

    今の電子投票システムは不必要なIT化の代表例でしょう。

    # 子供の安全性確保のためにRFIDを持たせる、というアイデア
    # と同じくらい不必要かつ無駄なことだと思います。

  • ウィルコム、PHS無線部分をモジュール化、情報機器への組み込みを可能に

    以前からPHSは組み込み用にモジュール化すれば結構売れるのではないか、と思っていたのですが遂にモジュール化するそうです。多くの企業が協賛するようです。WILLCOMになってしがらみが無くなった分ビジネスが広がった、という事なのでしょうか?

    /.Jにタレこみがあるかも、と思い覘いて見るとやはりありました。

    http://slashdot.jp/mobile/05/07/07/1118221.shtml?topic=97

    CNet Japanはこれ

    http://japan.cnet.com/news/com/story/0,2000047668,20085134,00.htm

  • QRコードを短冊に

    メモ。QRコードに関するblog。本文もQRコードならコメントもQRコードです(気付くのが遅すぎ?

    とろこでトップページの「QRコード読み取りのコツ」に

    ■QRコードの真正面から撮影

    とありますが、真正面から読まないとQRコードが読み取れないリーダ(携帯)があるのですね。と、書いている自分も正面から読み取るようにしていますが、QRコードは印刷面が平たければ、ななめから読み取っても読み取れる設計になっています。QRコードの仕様を知らない方も多いと思うので簡単な説明を付けておきます。隅の大きめの■が斜めからも読み取れるようにするための役割を持っています。全ての隅に大きめの■が無いのは読み取り開始位置を判別できるようにするためです。カメラの解像度やQRコードが写されている領域の影響もあるので正面から撮らないと読み取りに失敗する確立は高くはなると思います。エラー補正情報をQRコード内にたくさん入れていれば読み取りに成功する確立は高くなりますが、QRコードが大きくなります。微妙ですね。

  • 予想どおりのコメント

    Amazonの「はじめてのPHP言語プログラミング入門」にやっと予想どおりのコメントが出てきました。

    はじめての、というタイトルに惹かれ購入したのですが、ちょっと難しすぎるというのが正直な感想です。サンプルプログラムに説明のない単語があったり、解説文に聞きなれない専門用語があったり。他の言語や、別の本でPHPを学んでいれば問題ないのでしょうが、それだったら「はじめての」とか「入門」という言葉をタイトルに入れないほうがいいんじゃないかな、と思います。

    著者が、博学なのはよく分かるのですが、書き手としては癖があります。掲載されているプログラム自体は簡単なのですが、解説が細かい事まで書きすぎてあり、読んでいて辛くなります。難しげな専門用語もサラリと出てきたりします。結果的に、初心者が読むには向いてないような気がします。PHP初心者には、細かい事を気にせず、ガンガン書いていくタイプの本をお薦めします。

    ここで言い訳しておきます :)

    この本を書いている時点で「基本は説明したので、とにかく書いてみよう、作ってみよう」と言うPHP入門書(ほとんどはWebサイト構築入門書の体裁)はいくらでもありました。多くのPHP入門書籍はWebサイトを構築する為のツールのような位置づけとしてPHPを説明していました。同じような本を書いてもつまらないので、あらたにPHPを言語として習得されたいプログラマ向け、というコンセプトで書いています。

    「はじめての」を付けない方が良いのでは? と指摘されていますが、その通りかも知れません。「はじめての」と付いているのは、この本は当初、技術評論社の「はじめての」シリーズ用に書きはじめた為、「はじめての」と付いています。ページ数等の関係でシリーズ本としなかったのですが名前に残ったという経緯があります。言われてみると「PHP言語プログラミング入門」の方が良かったかもしれませんね。供給側の考えとしては「はじめて」PHPを「言語」としてとらえた入門書、という意図があったので「はじめて」と付いています。

    まえがきでも多少ふれていますが、PHPをプログラミング言語としてある程度体系的に習得したい方向けに、プログラミング入門書ではなく言語の入門書として書いたつもりです。このため、本当に初めてプログラミングをPHPで習得したい方、とにかくPHPを使ってWebサイトを作ってみたい方、には不向きな書籍であるという評価は正しい評価です。ターゲットとしている読者は「他の言語は知っているから、PHPでプログラミングする場合に必要な知識や注意点を知りたい方」「とにかく作ってみようタイプの書籍でPHPを習得したが、PHPを言語としてある程度体系的に知りたい」方を想定しています。

    出版社/著者からの内容紹介
     Webアプリケーション構築ツールとしてPHPを取り上げた書籍は数多くありますが、言語の解説・入門書としての書籍はあまりありません。
     本書は、プログラミング言語としてのPHPを解説することに最も重点を置いた入門書です。本書を通じて本格的なアプリケーション構築に必要な基礎知識を習得することができます。

    出版社からのコメント
    ■こんな方におすすめ
    ・PHPプログラミングに興味のある方
    ・PHPをきちんと学びなおしたい方

    と購入者の方に配慮しているつもりですが、Amazonで購入する場合は立ち読みをしてから買う事ができないのでタイトルのみで購入すると期待外れになってしまう場合があります。しかし、amazon.co.jpでもスキャナでスキャンしOCRでテキスト化したデータを検索できる「サーチ・インサイド・ブック」サービスがはじまるようです。「はじめてのPHP言語プログラミング」もこのサービスで立ち読みできるようデータベース化を許諾しています。しばらくすると立ち読みできるようになるのでタイトルから期待していた内容と違った、と言うことは少なくなるのではないかと期待しています。

    ところで、書き手としては言語要素をさらっと解説してアプリの作り方を説明する方がかなり楽です。このような書き方の本の方が売れるようですが中身がある本の方が価値が高くなると信じてこのような内容になっています。Webシステム構築入門書としては適していないかも知れませんが、業務としてPHPを使う方には役に立つ内容と思っています。(と言うより業務でPHPを使う方には知っておいて欲しい知識を記載しています)ご意見/感想などはAmazonのコメント、Wikiメール、お好みの方法でお願いします!

  • JPUG広報担当blog

    メモ。JPUG広報用のブログ。IE等で見るとレイアウトが崩れたりしますが、そのうち修正される予定です。

  • SATAとPATAの混在環境

    最近のマザーボートはSATAとPATA、両方のインターフェースが当り前のように着いてきます。しかし、LinuxでPATA、SATAのHDD両方が接続されている場合は簡単に構成できない場合が多いかも知れません。

    Althon64のPCを組む為にASUS A8V Deluxeを購入しました。AthlonXP 2500+に接続していた80GBのHDD(/dev/hda – WindowsXPのみインストールされている)と200GB HDD(/dev/hdb – 各種Linuxのビルド・テスト環境がインストールされている)を
    200GB (/dev/hda – 古い80GBのWindowsXPのパーティションのコピーとLinux)と250GB(/dev/sda – 古い200GBの各種Linuxビルド・テスト環境)に移行しました。

    WindowXPのパーティションの移動はddコマンドで簡単に移動できます。今のHDDはLBAが当たり前でシリンダ数さえ合っていればddでデバイスからデバイスへコピーするだけで移動できます。CPUとマザーボードが変わりましたがXPからはWindows2000やNT様に苦労する事はありません。

    苦労したのはLinuxのシステムイメージの移行です。PATAとSATAの混在環境にしたのですがブートに色々な問題が発生します。Linuxのブートプロセスはある程度知っているので、ほとんどは既に知っている問題だったのですがBIOSの設定とgrubの動作に手惑いました。

    ご存知の通りLinuxはHDDの認識にBIOSを使いません。このため最初にgrubを起動したときとブート後のデバイスの順序が異なっていました。BIOSの設定とLinuxが認識するHDDのデバイスの順序が異なっていると混乱してしまいます。BIOSの設定をLinuxの認識順序と合わせる事ができるBIOSであれば、同じにすると問題を回避できると思います。Wikiには多少詳しく(?)記述しています。

  • allow_url_fopen

    追記:
    現在のPHPではリモートファイル読み込みを制御するphp.ini設定としてallow_url_fopen(URL等のファイルとして読み込むフラグ)とallow_url_include(URLなどをPHPスクリプトとして読み込むフラグ)があります。php://input(標準入力用のURL。Webアプリの場合、POSTリクエストなどが読み込める)もallow_url_include=Offでは利用できません。このためallow_url_include=Offの場合、リモートスクリプトからの読み込みを防止できます。

    基本的には

    • allow_url_includeは常に無効(JSONなどでなくPHPスクリプトとしてリモートデータを読む、などの場合は局所的に有効化)
    • allow_url_fopenは全く必要ないなら無効

    とすると良いでしょう。

    PHPを使っている方はHTTP/FTP/SSH等のプロトコルでリモートサーバ上のファイルをローカルファイルの様に読み書きできる事をご存知と思います。この機能はphp.ini設定のallow_url_fopenディレクティブで有効/無効を設定できるようになっています。PHP 4.3.4より前のPHPではこの機能のスクリプト中からも無効/有効に設定を変更する事ができました。(INI_ALLの設定項目であった)

    驚いたことにPHP 4.3.4からphp.iniからしかこの設定を変更できなくなってしまいました。(INI_SYSTEMの設定項目になった)誰かがセキュリティ強化を目的として変更したのだとは思いますが、セキュリティも強化できず、有用なリモートファイルアクセス機能も使えなくする非常に拙い変更です。

    例えば、phpBB(BBSアプリケーション)ではinclude/require文に不適切に処理されたユーザ入力が利用されている為、リモートスクリプトを読み込み実行できてしまう非常に深刻なセキュリティ上の問題がまた最近見つかりました。phpBBはallow_url_fopen機能が無効であっても動作するので

    allow_url_fopen = Off

    と設定するか必ず読み込まれる設定ファイルで

    ini_set(‘allow_url_fopen’, 0);

    とすると、phpBBのようなアプリケーションでも比較的安全に運用することができました。

    しかし、allow_url_fopenがINI_SYSTEMの設定項目になった為、前者の方法を取ると他のアプリケーションで、場合によっては非常に有用な、allow_url_fopen機能を使えなくなってしまいました。後者の方法は、特定のアプリケーションのみの設定を変更するのに有効ですが、INI_SYSTEM設定項目であるため実際には無効に設定できなくなってしまいました。

    セキュリティ上の意味は容易に理解できるであろうと、internals@list.php.net にallow_url_fopenの設定を

    デフォルトOFF
    INI_ALLへ変更

    するように提案して見たところ議論が結構荒れています…
    この設定が安全かつ不必要な機能制限が無く、最も良い設定と思うのですが…

    # allow_url_fopen_includeのようにinclude/require文用の設定
    # を追加するのも良いですが、デフォルトOFF、INI_ALLであるべき
    # と思います。

  • php-rast

    Rastとはネットワーク応用通信研究所が開発している全文検索システムです。

    本ソフトウェアは,あらかじめ対象となる文書群から検索に必要な情報を格納するデータベースを作成しておき,それに対して検索を行う全文検索システムです.

    検索方式は N-gram 方式や分かち書き方式から選べます.また,必要に応じて文字列処理モジュールを差し替えることができます.

    なお,本ソフトウェアは IPA の平成16年度オープンソフトウェア活用基盤整備事業の委託を受けて開発を行っています.

    このRast用のPHPモジュールを冨田冨田隆三さんが公開されています。

    名古屋市立大学の冨田です

    以前、全文検索エンジンRast のモジュールを公開したところ、ここでライセンス違反の可能性を指摘されて公開を止めていましたが、Rast-0.2.0 で BSD ライクな緩いライセンスに変更されたようなのでまた公開してみます。

    ダウンロードはこちらからどうぞ。
    http://a157.debian.co.jp/php_rast/

    冨田

    サンプルの動作は良い感じです。サンプルコードもざっと見てみましたが使いやすそうです。

  • Momonga LinuxとFedora Coreパッケージの比較

    前にMomongaLinuxとFedoraCoreのパッケージの比較を行うスクリプトを作っていたのですが更新対象をFedoraCore 3からFedoraCore 4に変更しました。

    http://www.momonga-linux.org/~yohgaki/compare_distribution_srpm.php?type=src_only

    ついでにMomongaLinux 2とMomongaLinuxのtrunk(開発版)との違いも比較できるURLも用意しました。

    http://www.momonga-linux.org/~yohgaki/compare_ml2_vs_devel.php?type=src_only

    この比較リストの作成は時間がかかるのでキャッシュを使っています。確かキャッシュの有効期限は6時間くらいに設定していたと思います。最後に更新されてから6時間以上経過するとリストを再作成するので運が悪いとページの表示に時間がかかります。

  • _php_stream_passthru

    php-usersのMLに投稿した内容の補足です。コードはPHP 4.4の開発ブランチのソースです。

    main/stream.cに_php_stream_passthru関数が定義されています。reafile関数(ファイルの中身を全て出力)、fpassthru関数(ファイルリソースの中身を全て出力)に利用されています。

    PHPAPI size_t _php_stream_passthru(php_stream * stream STREAMS_DC TSRMLS_DC)
    {
        size_t bcount = 0;
        int ready = 0;
        char buf[8192];
    #ifdef HAVE_MMAP
        int fd;
    #endif
    
    #ifdef HAVE_MMAP
        if (!php_stream_is(stream, PHP_STREAM_IS_SOCKET)
                && stream->filterhead == NULL
                && php_stream_tell(stream) == 0
                && SUCCESS == php_stream_cast(stream, PHP_STREAM_AS_FD, (void*)&fd, 0))
        {
            struct stat sbuf;
            off_t off;
            void *p;
            size_t len;
    
            fstat(fd, &sbuf);
    
            if (sbuf.st_size > sizeof(buf)) {
                off = php_stream_tell(stream);
                len = sbuf.st_size - off;
                p = mmap(0, len, PROT_READ, MAP_SHARED, fd, off);
                if (p != (void *) MAP_FAILED) {
                    BG(mmap_file) = p;
                    BG(mmap_len) = len;
                    PHPWRITE(p, len);
                    BG(mmap_file) = NULL;
                    munmap(p, len);
                    bcount += len;
                    ready = 1;
                }
            }
        }
    #endif
        if(!ready) {
            int b;
    
            while ((b = php_stream_read(stream, buf, sizeof(buf))) > 0) {
                PHPWRITE(buf, b);
                bcount += b;
            }
        }
        return bcount;
    }
    

    注目すべきは以下です。

                if (p != (void *) MAP_FAILED) {
                    BG(mmap_file) = p;
                    BG(mmap_len) = len;
                    PHPWRITE(p, len);
                    BG(mmap_file) = NULL;
                    munmap(p, len);
                    bcount += len;
                    ready = 1;
                }
    

    PHPWRITEマクロは最終的に出力バッファに書き出します。PHPからの出力は最終的にWebサーバにバッファされる場合があります。つまり、一度に大量のデータを出力するとメモリを大量に必要とする可能性があります。

    Momoery Mapped I/Oの利点がバッファ無しでデータを読める事は分りますが、大きなファイルを送信するには不適切な事は明らかです。データを適切なチャンクサイズに区切ってPHPWRITEに書き込むよう変更しなければならないですね…

  • DokuWiki

    久しぶりにmadwifiの設定をしようとmadwifiのページを見てみると見慣れないWikiを使っていたのでどんなWikiかさらっと見てみました。インストールやソースを読んでいないので見てみた感想です。

    基本的なWiki機能はそろっているようです。ページの場所 “top>a page>another page”の様に表示されるのも便利です。ログインユーザ登録もサポートしているようで、Eメールアドレスを登録してから編集を許可する、という運用ができるのはSPAM対策やセキュリティ対策に役立つと思います。

    次のような機能を持っているようです。

    DokuWiki Features here

    * works on plain text files, no database needed
    * simple syntax and easy editing with quickbuttons and accesskeys
    * Section Editing allows you to edit small parts of a page
    * automatic generation of content tables
    * unlimited page revisions
    * colored side by side diff support
    * support for read only pages
    * syndication of recent changes as RSS Feed
    * namespaces
    * Interwiki Links
    * uploading and embedding images
    * image caching and resizing
    * easy navigation through breadcrumbs
    * Customizing with templates and plugins
    * Multilanguage Support
    * Spam blacklist
    * custom text replacements
    * pagecaching
    * locking to avoid edit conflicts
    * full UTF-8 support
    * and more

    Wiki機能の比較は見るだけでも興味深いと思います。

    Tipsのページを見てみると色々な機能が追加できる事が分かります。SVGをPNGやGIFに変換、ページをPostscriptに変換、HTMLからDokuWiki形式への変換方法が記載されています。

    面白かったのはNanoWebをサポートするWebサーバとして記載されている所です。NanoWebはPHPで記述されたWebサーバで

    Nanoweb’s main features are :

    – HTTP/1.1 compliance
    – Powerful and easy configuration
    – Modular architecture
    – FastCGI, CGI and Server side includes support
    – Name and port based virtual hosts
    – Access control lists
    – htpasswd, MySQL, PostgreSQL and LDAP authentication support
    – Themes for server generated content
    – Apache compatible log format, MySQL logging
    – Directory browsing
    – inetd support and SSL via external helpers
    – Denial of Service protection
    – Proxy Server extension
    – Filters and gzip support
    – RBL support (mail-abuse.org)
    – Extension Protocols (request methods) support
    – … and a lot more

    と色々盛り沢山です。

    コマンドラインのPHPさえインストールされていれば自分でWebサーバを立てる事ができます。NanoWebのソースは以前に読んだ事があるので多少は分かります。pluginの作成は簡単そうでした。速度的にも普通(?)のリクエスト数であれば十分処理できるパフォーマンスでした。(思ったより速くて驚いたと思います)

  • とばっちり?

    CNet Japanでも「米で史上空前の情報流出–4000万件のクレジットカードに影響か」と報道されているように日本で影響があったクレジットカード発行会社としてNICOSがあります。

    私もNICOS郵貯VISAカードを持っています。支払日が近いのですが明細書が届いていなかったのでWebから確認しようと思い、NICOSのWebサイトに行くと重くて使えませんでした。サーバが混雑していたのはMASTERカードの情報漏えいの影響ではないかと推測しています。

    前から気になっていたのですがNICOSのサイトはSSLが不必要なページでもSSLが使われていたりします。一時的に経営危機があったとは言えそれなりの作りになっていて高負荷時でも問題無く動作するように作られている、と思っていたのですがそうでは無かったようです。
    # 備考:SSLを使った通信と普通の通信を比べると、SSLを使った
    # 通信の方が大きな負荷がサーバにかかります。

    ところで、アメリカでは無差別攻撃的なフィッシングはもう古い手口になっています。今回のMASTERカードから漏洩した情報には社会保障番号は含まれていないようですが、住所、氏名、電話番号、勤務先、社会保障番号などの個人情報を含んだメールを送信し信用させ更に重要な情報を取得する詐欺が多発しています。中にはこのような手間をかけずに盗んだ個人情報で勝手にクレジットカードを作り使用する犯罪も横行しています。

    カードの不正利用は保障されるので過剰反応する必要はありませんが、利用明細は必ず確認した方がよいでしょう。大学いた頃の話なので随分昔の事ですが、経営学の教授は毎月のように使った覚えのない航空券の請求がくる、と言っていました。幸いまだ私はこのような不正利用による請求はありませんでしたがクレジットカード利用者であればありえるリスクです。
    # 不正利用は保障されますが暗証番号を伴う取引は保障されない可能性が
    # 高いです。店頭などで暗証番号は入力しない方がよいと思います。

  • PHP4でpublic

    PHP本家の開発ML internals@lists.php.net ではPHP4でpublic宣言を行えるようにするかどうかで盛り上がっています。

    PHP5を使っている方はご存知の通り、PHP5からオブジェクトのプロパティはpublic, protected, privateにアクセスレベルを限定できるようになりました。それと同時に古いプロパティ宣言であるvar宣言は使わないよう推奨されています。

    初めの頃のPHP5のリリースではPHP5で追加されたE_STRICTエラーを表示する為の記述に間違いがありました。E_ALLではE_STRICTエラーでは表示されず、E_ALL | E_STRICTにしなければなりません。E_STRICTエラーにはvar宣言についてもvarではなくpublic, private, protectedを使用する旨のエラーが発生します。E_STRICTエラーを表示する設定方法に間違いがあったため、E_STRICTエラーには気が付きづらかったと思います。E_STRICTレベルエラーを有効にしてエラーの数に驚いた方も多いかも知れません。

    しかし、var宣言エラーの問題さえクリアすればほとんどE_STRICTレベルのエラーを回避し、PHP4とPHP5の両方で実行できるコードを書くことも可能になります。現状ではPHP4ではクラス定義の際、プロパティは必ずvar宣言しなければならないのでクラスを使えばE_STRICTエラーは必ず発生します。

    class foo {
    public $var;
    }

    をPHP4でも使えるようにするメリットはあります。PHP4用のコードと言いつつPHP4.4より古いPHP4では実行できなくなるのも困るというのも分かります。

    私はPHP4の文法は拡張せず最初に読み込むアプリケーションの設定ファイルなどで


    error_reporting(E_ALL);

    を実行する方がよいのではないかと思っています。
    この方法には最初に読み込まれるファイルが在ること、そのファイルにクラス定義が含まれないと前提条件もありますがこれでも十分ではないかと思います。

    # 最悪、auto_prependでerror_reporing設定を変える方法も使えます。