RealBasic University

このコラムはStone Table Softwareのオーナーであり、またREALbasic Developerの編集者でもあるMarc Zeedar氏により書かれたものを、著者の許可を得て翻訳したものです。この翻訳はHREM Researchにより提供されています。この日本語版へのご意見はRBU-Jまでご連絡下さい。

URL: http://www.applelinks.com/rbu/050/
INDEXに戻る

SpamBlocker: パート I

今週は、シンプルですがとても役に立つユーティリティを紹介します。ウェブページを作成する人たちは、電子メールのリンクをウェブサイトに載せると、遅かれ早かれ卑屈な人物がそのアドレスを手に入れて、欲しくもない電子メールを送りつけてくることに気づくでしょう。要するに、スパムメールを受け取ることになります。

もちろん、スパマー(スパムメールを送りつける人)は実際にあなたのウェブサイトを個人的に訪れるわけではありません。彼らは何百万ものメールアドレスを集める必要があります。 だから彼らは、愚かにもウェブサイトにアドレスを掲載している人々を狙ってソフトウェアロボットを送りつけます。

もちろん、メールアドレスを公表しなければ、あなたに連絡を取りたい人たち(顧客のような)に不自由を与えることになります。それでは、どうしたら良いでしょうか?

ある人たちは、marcREMOVEME@rbu.comのようにメールアドレスに余計な部分をつけてスパムを防ごうとします。このメールアドレスは"REMOVEME"を取り除くまで機能しません。また他の人はmarcatrbudotcomというようにメールアドレスをすべてローマ字で表記します。

しかしながら、それらは良い方法ではありません。あなたにどのようにメールを送ればよいのか、私はママが思い悩まないかどうか心配です。このようなシステムを試みるならば、あなたは確実に顧客を失うことになるでしょう。

Javaスクリプトのような複雑な解決方法もありますが、スパムロボットから逃れることのできるよりシンプルな方法を見ていくことにしましょう。

一部の賢いHTMLのエキスパートたちは、ウェブブラウザーはHTMLの処理を始める前に、ある特殊な文字を先に変換するように設計されていることに気がつきました。したがって、あなたがメールのリンク先をHTMLの特殊な文字に符号化すれば、"mailto:"を参照して探しにやってくるスパムロボットは、リンク先を探し出すことができなくなるでしょう。

HTMLの基礎

普段はWYSIWYGのHTMLエディターを使っていて、生のHTMLコードを扱うのが厄介だという人たちのために、ひとつだけ復習しておきましょう。

簡潔に言うと、メールのリンクをウェブサイトに載せるためには、あなたのメールアドレスを指し示すようにhref(ハイパーリンクレファレンス)のアンカータグでリンク先のテキストを囲みます。それは次のようになります。

 <a href="mailto:marc@rbu.com">Click here to send me mail.</a> 

私たちがやりたいことは、HTML文字実体として上の引用符内を符号化することにより、この部分を不明瞭にすることです。HTML文字実体は、文字の ASCIIナンバーか、あるいは特殊な記号群で囲まれた文字名です。

例えば、コピーライト(著作権)の記号は次のどちらかで表すことができます。

 &#169; or &copy; 

HTML文字実体は、常にアンパサンド(&)で始まり、セミコロン(;)で終わります。ASCIIナンバーで文字を指定する場合は、ナンバー記号(#)が先にきます。

だから、すべての"mailto:"のテキストを訳の分からないアンパサンド(&)やセミコロン(;)で置き換えれば、 スパムロボットはメールのリンク先がウェブページに隠されていることに気づかないでしょう!しかし、ウェブブラウザーはリンク先を認識することができるし、読者の立場からすれば、何の違いもありません。

SpamBlockerの設計

上に記されたようなシステムを使ったメールアドレスをコンバートするフリーのプログラムやウェブページはたくさんあります。これらの使用方法の大半は、メールアドレスをタイプすると訳の分からないHTMLコードに変換してくれるので、あとはあなたのHTMLファイルにそれをコピー&ペーストするだけです。

それはとても素晴らしいのですが、もしいくつものメールアドレスや数ページにわたって変換する必要がある場合、たくさんコピー&ペーストすることになって大変です。

これは私がREALbasic Developerのウェブサイトを構築していたときの状況でした。たくさんの異なったメールアドレス(雑誌の違った部署や人々に当たる)や数多くのページがありました。そのHTMLをすべてコピー&ペーストしていくのは、考えただけで気の滅入ることでした。

すぐさま、私はREALbasicについて考えました。私に代わってその仕事をしてくれるRBプログラムを作るのはそれほど大変なことでしょうか?さらに良いことに、私はより効率的にプログラムが動くようにしました。つまり、HTMLファイルをドラッグ&ドロップするだけで、すぐにファイルの中のすべての"mailto"を変換してくれるのです!

私はREALbasicを立ち上げて10分もかからずに、SpamBlockerを作りました。残りの数分で仕上げとバグフィックスをしたあと、私はこの小さなプログラムを実際の仕事で使用していました!

私がREALbasicを愛しているのに、なにか疑いの余地がありますか?

インターフェース

これはSpamBlockerの素晴らしい、直感的なインターフェースです。明らかに、これよりかなりかっこよくすることもできるでしょうが、私はこれを10分で作ったということを忘れないでください。 ;-)

これを作るために、私は新しいプロジェクトを立ち上げ、Window1の上にstaticTextをドラッグしました。そして属性ウィンドウの"multiline"オプションにチェックを入れ、いくつかの説明文を加えました。(これはこのようにシンプルな"インターフェースレス"のアプリケーションではとりわけ重要です。もし説明文がなければあなたが6ヵ月後に立ち上げたとき,どのように使ったらいいか戸惑うでしょう。

単にファイルのドラッグを受け入れるだけなので、これがSpamBlockに必要なインターフェースのすべてです。

コード

まず始めに行うことは、Window1にファイルドラッグを受け入れるように伝えることです。よってWindow1のOpenイベントに行き、次の文を入力します。

 me.acceptFileDrop("text") 

まだ"text"のファイルタイプを定義していないので、忘れる前にまず定義しておきましょう。Editメニューに行き、"File Types..."を選択します。そしてダイアログボックスの"Add..."をクリックし、下の図のように入力します。

これは何をしているのでしょうか?それはただREALbasicにどんな種類の"text"ファイルであるかを知らせるだけです。すでにWindow1にはどのタイプのファイルを受け入れるか定義しているので、ユーザはグラフィックやアプリケーション、ワード文書をwindowの上にドロップすることはできません。

(もしすべての種類のファイルを受け入れるならば、あなたは手動でファイルタイプをチェックし、不正なファイルのためのエラーダイアログを提示しなければなりません。これにより、ユーザが不正なファイルをドラッグしようとしたときには、それはただ"はね返る"だけです。)

それでは、windowの上にいくつかのファイルがドロップされたら何が起こるでしょうか?そう、それらのファイルはDropObjectイベントに送られます。ではそこへ行って、それらのファイルをどうすればよいかいくつかのコードを付け加えましょう。

 
   while obj.FolderItemAvailable 
parseFile(obj.folderItem)
if not obj.nextItem then
exit
end if
wend

beep
msgBox "All done!"

簡単でしょう?objオブジェクトはDragItemです。DragItemは(いくつかのfolderItemsのように)一つ以上のものを含むことができますが、それらに自由にはアクセスすることはできません。基本的に、objは一番目の項目を最初に指します。obj.nextItemを呼び出すとき、さらに項目があるかどうかによって、trueまたはfalseを返します。さらに項目がある場合、objは次の項目の内容に設定されます。

したがって、いくつかの項目を処理するためには、順に各項目を記憶するか、あるいはそれを直ちに処理していかなければなりません。私たちのケースでは、後者の方法で処理しています。

まず始めに、(obj.FolderItemAvailableをチェックすることによって)利用可能なfolderItemがあるかどうか確かめます。 もしあるならば、while-wendループに入ります。ループはobj.FolderItemAvailabletrueの間繰り返されるので、objの中にfolderItemsがなくなるまで繰り返されることになります。

次に、DragItemオブジェクトがfolderItemを含んでいることが判ったので、それを処理することが出来ます。しかしプログラムコードをここに含めるよりはむしろ、実際の仕事をするために別のメソッド(Method)を作成します。今のところはただ先に進んで、メソッドの名前を入力し、それをfolderItemに送ります。メソッドの名前をparseFileとして、parseFile(obj.folderItem)として使用します。

ファイルを処理した後、別のファイルがあるかどうかを確かめるためにobj.nextItemをチェックします。もし存在しない場合はexitを呼び出し、while-wendから抜け出します。(別のファイルがある場合、ループは次のファイルをただ繰り返し処理します。)

ループを抜け出したらもう処理は終わりです。そこでビープ音を鳴らし、結果に対するメッセージを示します。

私が言ったように簡単でしたね。

まだあまりコードがないので、今週はソースファイルはありません。次週にはコードを仕上げて、完全なREALbasicのプロジェクトファイルを提供しましょう。

次週

SpamBlockerを仕上げます。

ニュース: REAL Softwareのキュービー賞

REAL Softwareは昨年のように、再びREALbasicの大きな業績に対するキュービー賞を募集しています。受賞者はフリーのREALbasicのアップグレードおよび他の賞を受け取ります。

コンテストは2002年4月26日に終了しますので、皆さんはその日までに各カテゴリーの中から気に入っているREALbasicのソフトウェアを推薦する必要があります。人物やある製品を推薦するためには、nominations@realsoftware.comまでメールを送ってください。自薦でも構わないので恥ずかしがらずにどうぞ!(これは投票ではないということを心に留めておいてください。投票箱をいっぱいにする必要はありませんので。)

製品はREALbasicで作成されていて、またMade with REALbasicプログラムの協力者である必要があります。作品は品質、適合性(楽しいゲームか?役に立つユーティリティか?)、洗練されているか、活気や迫力があるかで判断されます。

9つのカテゴリー(今年の唱道者、クロス・プラットフォーム、デベロッパー・ツール、ゲーム、インターネット、Mac OS X、ユーティリティ、総合、ビジネス)の各受賞者に賞が送られます。

カテゴリー:

Mac OS X:Mac OS Xのための最良のアプリケーション。それはある特別のカテゴリーに分類される必要はなく、以前のMac OSにも対応します(そしてまた例のWindowsにも…)。

ビジネス:従来のビジネスアプリケーションやユーザーに利益をもたらす素材を作成するためのツール等のような、ある種の商用活動を行うための最良のツール。

ゲーム:ベストゲーム。純粋なエンターテイメント、アクション、ロールプレイ、教育、とにかく何でもOKです。

インターネット:インターネットのためのベストツール。 これはサーバーツールから、デコーダ、プレーヤ、テストツールまでやや広い分野で役に立つもの何でもです。それはIP(またはそれに関するもの)やある既存のプロトコルやフォーマットもそこに含まれます!

クロス・プラットフォーム:Mac OSおよびWindowsの両方で動作するベストなアプリケーション。

ユーティリティ:とにかく役立つベストアプリケーション。これもまた意図的に広範なものを含んでいます!それは役に立つものすべてを次から次へと世に送り出さねばならないからです。

REALbasic開発ツール:プラグ・イン、クラス、モジュール、フレームワーク、前後処理などを含む、REALbasic開発者が仕事をする上で助けになるもの。

総合:我々が受け取った中でまさにベストなREALbasicアプリケーション。それは二重受賞かもしれないし、あるいは我々の予想を超えるような上記に含まれないカテゴリーの一つかもしれません。

今年の唱道者:最後に、今年のREALbasic支持者たちのための特別なカテゴリーがあります。コミュニティーのために最も尽力した人、そして本当に素晴らしいツールとしてREALbasicをあらゆる場所に知らしめた人たちのための賞です。

Letters

今週はSteenさんがRBU 023に関する質問を書いてくれました。

こんにちは

私はあなたの素晴らしいリアルベーシックのコラムを読みました。とくに23番目のコラムについてです。

数字に対してのLittleArrowの使い方が書かれていたのでとても嬉しかったです。

ところで文字に関してはどのようにすればよいのでしょうか?

数時間ほど考えましたが、あきらめて質問せざるを得ませんでした。そしてこのメールを書く前に、インターネットでそのことについていくらか調べてみましが、あまり役に立つ情報はありませんでした。

私の質問は単純なのですが、LittleArrowの例で数字を文字に置き換える(一度に一文字だけ)にはどうしたらよいでしょうか?

お返事楽しみにしています。

どうぞよろしくお願いします。

Steen Horjenより

まだあなたがこれでどういうことをしたいのかはっきり分からないのですが、文字についても原則は数字とまったく同じです。実際、コンピュータにとって文字は数字ですよね。

数字の変わりに文字を増加/減少させるときのLittleArrowsコントロールのいちばんの違いは、文字は有限だということです。だからある範囲内から外に出ないようにチェックを加える必要があります。

2番目の違いは、テキストを数字に変換するのにもはやval()は使わないということです。そのかわり、文字のASCIIナンバーを返すasc()を使います。(これは文字列でなく、一文字だけに働くので注意してください。)

ここにLittleArrowsコントロールのDownイベントのための改訂されたコードを掲載します。(これはテキストとしてAからZの単文字のstaticTextがすでにあるとしています。)

   dim n as integer  

n = asc(staticText1.text)

if keyboard.optionKey then
n = n + 10
else
n = n + 1
end if

if n < asc("A") then
n = asc("Z")
end if
if n > asc("Z") then
n = asc("A")
end if

staticText1.text = chr(n)
staticText1.refresh

一度現在の文字のASCIIナンバーを手に入れてしまえば、あとは適当にそれを増加あるいは減少させることができます。それから範囲内に収まっているかチェックするだけです(私は例として勝手に大文字のAからZまでに制限しましたが、実際はあなたの好きなように制限してください)。またこれはAの上に行くとZ、Zの下に行くとAというように「周回」させていることに注意してください。ユーザとして、Zを表示させるのに26回も下へクリックするよりはショートカットがあるほうがいいですよね。

Upイベントも、足し算の代わりに引き算をするだけで、ちょうどこれと同じようなものです。

Steenさん、これが役に立つと嬉しいです!


RBU-Jの通知サービス!コラムが発表されるたびに日本語版REALbasic Universityのお知らせの emailがあなたに届きます。登録・削除は ここ から。

INDEXに戻る