あんま変わってませんが。
リキッドスタイルにしてみました。
画面の横幅に合わせて伸びるページスタイルです。
広い画面なら、長いソースも読みやすいかも。
2008年10月27日月曜日
2008年10月22日水曜日
VC++.NETでCFileFindを利用したファイル検索
未だにWin32 APIをごりごり使っている古い人向けTips。
だって軽いし便利なんだよぅ…。
CFileFindを使用してファイル検索をする方法です。
ソース。
カレントフォルダと親フォルダまで検索に引っかかるのが謎だけど。
まあ、除外すれば良いので。
だって軽いし便利なんだよぅ…。
CFileFindを使用してファイル検索をする方法です。
ソース。
- CFileFind fileFind;
- BOOL bFlg = TRUE;
- if( fileFind.FindFile( "C:\\*.*" ) ) // C:\直下のすべての拡張子付きファイル
- {
- do {
- bFlg = fileFind.FindNextFile();
- // カレント、パレントフォルダは除外
- if( fileFind.GetFileName().Left(1).Compare(".") != 0 ) // .と..の事です
- {
- AfxMessageBox( fileFind.GetFilePath() ); // メッセージボックスで表示
- }
- } while( bFlg );
- }
CFileFind fileFind;
BOOL bFlg = TRUE;
if( fileFind.FindFile( "C:\\*.*" ) ) // C:\直下のすべての拡張子付きファイル
{
do {
bFlg = fileFind.FindNextFile();
// カレント、パレントフォルダは除外
if( fileFind.GetFileName().Left(1).Compare(".") != 0 ) // .と..の事です
{
AfxMessageBox( fileFind.GetFilePath() ); // メッセージボックスで表示
}
} while( bFlg );
}
カレントフォルダと親フォルダまで検索に引っかかるのが謎だけど。
まあ、除外すれば良いので。
2008年10月21日火曜日
PythonならCGIの動くWebサーバが3行で書ける!?
インターネットの向こう側にある「ホームページ」を提供するサーバ。
実はサーバの中では「Webサーバ」というプログラムが動作しています。
このプログラム、IEとかのメッセージを受け取って、対応するページの情報を送ってくれたりする役割を担っているのですが。
実はPythonには、このWebサーバ機能がライブラリとして備わっています。
以上。
これで、このスクリプトを例えば「server.py」とかのファイル名でUTF-8エンコードで保存して、コマンドラインから
とか実行すると、8080ポートでこのサーバが起動するんですよ。
このライブラリと同じフォルダに「index.html」とか置いておいて、ブラウザに
って実行すると、index.htmlがサイトとして表示されます。
ファイル、たとえば「hoge.html」とかを増やして、ブラウザで
とかってやると、そのファイルが表示されます。おー。
しかもこいつ、CGI機能もついてます。
Python CGIを置けるフォルダははいくつかデフォルトで指定されているらしく、「htbin」と「cgi-bin」。
なので、サーバ起動スクリプトのあるフォルダに新しく「htbin」フォルダを作って、
とか書いた新しいファイル、例えば「cgitest.py」を置いて、ブラウザから
とかアクセスすると、上の文章が表示されます。おー。
やるなPython。
出典(3行サーバスクリプト):http://python.g.hatena.ne.jp/faerie/20061114/p1
実はサーバの中では「Webサーバ」というプログラムが動作しています。
このプログラム、IEとかのメッセージを受け取って、対応するページの情報を送ってくれたりする役割を担っているのですが。
実はPythonには、このWebサーバ機能がライブラリとして備わっています。
- import cgi
- import BaseHTTPServer,CGIHTTPServer
- BaseHTTPServer.HTTPServer(( '127.0.0.1', 8080 ), CGIHTTPServer.CGIHTTPRequestHandler ).serve_forever()
import cgi
import BaseHTTPServer,CGIHTTPServer
BaseHTTPServer.HTTPServer(( '127.0.0.1', 8080 ), CGIHTTPServer.CGIHTTPRequestHandler ).serve_forever()
以上。
これで、このスクリプトを例えば「server.py」とかのファイル名でUTF-8エンコードで保存して、コマンドラインから
python server.py
とか実行すると、8080ポートでこのサーバが起動するんですよ。
このライブラリと同じフォルダに「index.html」とか置いておいて、ブラウザに
http://localhost:8080/
って実行すると、index.htmlがサイトとして表示されます。
ファイル、たとえば「hoge.html」とかを増やして、ブラウザで
http://localhost:8080/hoge.html
とかってやると、そのファイルが表示されます。おー。
しかもこいつ、CGI機能もついてます。
Python CGIを置けるフォルダははいくつかデフォルトで指定されているらしく、「htbin」と「cgi-bin」。
なので、サーバ起動スクリプトのあるフォルダに新しく「htbin」フォルダを作って、
- # -*- coding: utf-8 -*-
- print """
- HTTP Server(CGI) now serving.
- """
# -*- coding: utf-8 -*-
print """
HTTP Server(CGI) now serving.
"""
とか書いた新しいファイル、例えば「cgitest.py」を置いて、ブラウザから
http://localhost:8080/htbin/cgitest.py
とかアクセスすると、上の文章が表示されます。おー。
やるなPython。
出典(3行サーバスクリプト):http://python.g.hatena.ne.jp/faerie/20061114/p1
Windows環境にPython&DjangoフレームワークのCGI環境を作成する
えーと。私がやりたかったので。
Django(ジャンゴ)は強力なテンプレート機能を持つWebシステムフレームワークです。
なんだか調べてみたらDjangoには簡単なWebサーバ機能が付いているらしいので、どうやらPythonとDjangoだけ入れれば開発環境が作れそうです。
まずPythonを入れます。インストール済みなら飛ばしてください。
http://www.python.jp/
画面左側のダウンロードページから、「Python標準リリース」を選択します。
今回はWindows用インストーラの「python-2.5.2.msi」をダウンロードしました。
最新版が出ていたら、そっちにしてくださいね。
ダウンロードしたmsiをダブルクリックして起動すると、インストーラが起動します。
とりあえず「Yes」連発してインストールしてください。
これでCドライブの直下にPythonがインストールされます。
次に、Djangoをインストールします。
http://www.djangoproject.com/download/
「Get the latest official version」にあるダウンロードリンクからダウンロードします。
私の場合はバージョン1.0でした。
「Django-1.0.tar.gz.gz」というファイルが作成されたので、解凍します。
あ、これtar.gzをもう一回圧縮してるみたいですね。2回解凍が必要かもしれません。
思ったより解凍時間がかかって、「Django-1.0」というフォルダができます。
こいつの中を見ると、「setup.py」というファイルがあります。
コマンドプロンプトで解凍されたフォルダをたどり、
んだーーーーーっとログが流れるのでしばらく静観。
完了すると、Pythonのインストールフォルダ内にDjangoがインストールされます。
ということで。
コマンドプロンプトでプロジェクトを作りたいフォルダに移動して、私の場合、
これはPythonフォルダにインストールされた「django-admin.py」というスクリプトを使って、startproject(プロジェクト生成)コマンドを実行しています。
ちなみにmysiteというのはプロジェクトの名前です。お好きな名前を設定してください。
あ、ただしPythonとかDjangoのクラス名をプロジェクト名に使うと面倒なのでやめてくださいとかどっかに書いてありました。
startprojectコマンドは一瞬で完了します。
プロジェクトフォルダをエクスプローラで開くと、
という4つのファイルが生成されています。これで準備は完了です。
プロジェクトフォルダをカレントフォルダにして、
と入力して実行してみてください。
これで無事Python+Djangoフレームワークの環境が動作しています。
思ったよりサクッといきますねぇ。
もちろんリファレンスにもある通り、この環境はあくまで開発環境です。
PHPやPerlで言うXAMPPとおんなじ感覚と思ってください。
リファレンスにも、絶対に本番運用には使用しないで下さい!と書いてありました。
セキュリティとか色々面倒なんでしょうね。
とはいえ実際に運用する前に手軽に環境を構築できますし、しかも実際の運用環境と併用できるので、かなり便利です。
次回からは、この環境上でDjangoを利用した簡単なサイトの構築を行なってみます。
Django(ジャンゴ)は強力なテンプレート機能を持つWebシステムフレームワークです。
なんだか調べてみたらDjangoには簡単なWebサーバ機能が付いているらしいので、どうやらPythonとDjangoだけ入れれば開発環境が作れそうです。
まずPythonを入れます。インストール済みなら飛ばしてください。
Pythonのインストール
まずPythonユーザ会のサイトへ行って、Pythonをダウンロードします。http://www.python.jp/
画面左側のダウンロードページから、「Python標準リリース」を選択します。
今回はWindows用インストーラの「python-2.5.2.msi」をダウンロードしました。
最新版が出ていたら、そっちにしてくださいね。
ダウンロードしたmsiをダブルクリックして起動すると、インストーラが起動します。
とりあえず「Yes」連発してインストールしてください。
これでCドライブの直下にPythonがインストールされます。
次に、Djangoをインストールします。
Djangoのインストール
こちらがDjangoのダウンロードページです。http://www.djangoproject.com/download/
「Get the latest official version」にあるダウンロードリンクからダウンロードします。
私の場合はバージョン1.0でした。
「Django-1.0.tar.gz.gz」というファイルが作成されたので、解凍します。
あ、これtar.gzをもう一回圧縮してるみたいですね。2回解凍が必要かもしれません。
思ったより解凍時間がかかって、「Django-1.0」というフォルダができます。
こいつの中を見ると、「setup.py」というファイルがあります。
コマンドプロンプトで解凍されたフォルダをたどり、
python setup.pyでセットアップを実行します。
んだーーーーーっとログが流れるのでしばらく静観。
完了すると、Pythonのインストールフォルダ内にDjangoがインストールされます。
実行してみる
Ruby on Railsと同じくDjangoも、コマンドでサイトの雛形を自動で生成する仕組みのようです。ということで。
コマンドプロンプトでプロジェクトを作りたいフォルダに移動して、私の場合、
python C:\Python25\Scripts\django-admin.py startproject mysiteを実行しました。
これはPythonフォルダにインストールされた「django-admin.py」というスクリプトを使って、startproject(プロジェクト生成)コマンドを実行しています。
ちなみにmysiteというのはプロジェクトの名前です。お好きな名前を設定してください。
あ、ただしPythonとかDjangoのクラス名をプロジェクト名に使うと面倒なのでやめてくださいとかどっかに書いてありました。
startprojectコマンドは一瞬で完了します。
プロジェクトフォルダをエクスプローラで開くと、
- __init__.py
- manage.py
- settings.py
- urls.py
という4つのファイルが生成されています。これで準備は完了です。
サイトを実行してみる
早速実行してみましょう。プロジェクトフォルダをカレントフォルダにして、
D:\django1\mysite>python manage.py runserverと入力して実行します。
Validating models...と出れば成功です。running at http://127.0.0.1:8000/と書かれているので、ブラウザを立ち上げてから、アドレスバーに、
0 errors found
Django version 1.0-final-SVN-unknown, using settings 'mysite.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
http://localhost:8000/
と入力して実行してみてください。
It worked!と祝福してもらえたら、成功です。ふー。
Congratulations on your first Django-powered page.
これで無事Python+Djangoフレームワークの環境が動作しています。
思ったよりサクッといきますねぇ。
もちろんリファレンスにもある通り、この環境はあくまで開発環境です。
PHPやPerlで言うXAMPPとおんなじ感覚と思ってください。
リファレンスにも、絶対に本番運用には使用しないで下さい!と書いてありました。
セキュリティとか色々面倒なんでしょうね。
とはいえ実際に運用する前に手軽に環境を構築できますし、しかも実際の運用環境と併用できるので、かなり便利です。
次回からは、この環境上でDjangoを利用した簡単なサイトの構築を行なってみます。
2008年10月18日土曜日
ubuntu 8.04にVMware Playerをインストールする
ubuntu8.04にVMware Playerを導入する方法です。
こちらを参考にしました。
Install VMWare Server in Ubuntu 8.04(英語)
上はVMware Serverの導入方法なので、ここではVMware Playerを。
仮想マシンの実行環境としては、Playerの方が使い勝手が良いんですよね。
Serverの方は、まあ気が向いたら導入するのでその時また。
レシピ。
以下を入力して実行。
「sudo」を忘れずに。自分のログインパスワードを聞かれますので答えてあげましょう。
このコマンドは、必要な関連ソフト最新一覧をインターネットから自動で(内部的に)取得するコマンドです。
次に以下の入力をして実行。
さっき取得した最新ソフトの情報を元に、関連する必要ソフトを自動で導入ししてくれます。
途中で「続行しますか [Y/n]?」とか聞いてきたら「y」を入力してEnterを押下して下さい。
以下を入力。
ログインユーザのユーザディレクトリ配下にフォルダが作成されます。
これはsudoはいりません。
次に、VMware Playerダウンロードページから、最新のVMware Playerの「tar.gz」版をダウンロードします。
私のダウンロードしたファイルは「VMware Player 2.0.4 for Linux (.tar)」というものでした。rpm版は使いません。
ちなみにダウンロードには、E-Mailアドレスなどアンケートに答える必要があります。
ダウンロードしたファイルを「~/src/VMWare」に移動します。
画面の上にあるメニューからだと、「場所」→「ホームフォルダ」に「src」→「VMWare」があるはずです。
ファイルブラウザ上からマウスで放り込んでもOKですよ。
私は以下を入力しました。
文字が緑色の部分には、ダウンロードしたファイルの名前を入力してください。
ちなみにコマンド入力の途中で「Tab」キーを押すと、自動で補完されますので便利ですよ。
うまくいけば、コンソール上は何も言わずに終了します。
解凍されたフォルダが「~/src/VMWare/vmware-player-distrib」として完成していればOKです。
解凍したフォルダの中にある、インストールスクリプトを実行します。
以下のコマンドを実行します。
「sudo」を忘れずに。忘れると入力し直しです。
実行すると、インストールスクリプトが起動します。
英語の文章がずらずらと並びますが、元々一般的な設定が選択されているので、ずっと「Enter」を押し続けて下さい。
が、まだ起動してはいけません。喜ぶのは早い。
以下のコマンドを実行しておきます。
はい。これで画面の上のメニューに「システム」という項目が増えているはずです。
この中に、「VMware Player」があります。
お疲れ様でした。
実行の度にソフトウェア利用許諾書が英語で表示されますが、その後の動作は Windowsと同じですよ。
こちらを参考にしました。
Install VMWare Server in Ubuntu 8.04(英語)
上はVMware Serverの導入方法なので、ここではVMware Playerを。
仮想マシンの実行環境としては、Playerの方が使い勝手が良いんですよね。
Serverの方は、まあ気が向いたら導入するのでその時また。
レシピ。
1.必須ソフトウェアの導入
まず、画面の上にあるメニューから「アプリケーション」→「アクセサリ」→「端末」を起動します。以下を入力して実行。
sudo apt-get update
「sudo」を忘れずに。自分のログインパスワードを聞かれますので答えてあげましょう。
このコマンドは、必要な関連ソフト最新一覧をインターネットから自動で(内部的に)取得するコマンドです。
次に以下の入力をして実行。
sudo apt-get install build-essential linux-headers-`uname -r` xinetd
さっき取得した最新ソフトの情報を元に、関連する必要ソフトを自動で導入ししてくれます。
途中で「続行しますか [Y/n]?」とか聞いてきたら「y」を入力してEnterを押下して下さい。
2.ディレクトリ(フォルダ)の準備とPlayerダウンロード
フォルダを準備して、PlayerをVMwareサイトからダウンロードします。以下を入力。
mkdir -p ~/src/VMWare
ログインユーザのユーザディレクトリ配下にフォルダが作成されます。
これはsudoはいりません。
次に、VMware Playerダウンロードページから、最新のVMware Playerの「tar.gz」版をダウンロードします。
私のダウンロードしたファイルは「VMware Player 2.0.4 for Linux (.tar)」というものでした。rpm版は使いません。
ちなみにダウンロードには、E-Mailアドレスなどアンケートに答える必要があります。
ダウンロードしたファイルを「~/src/VMWare」に移動します。
画面の上にあるメニューからだと、「場所」→「ホームフォルダ」に「src」→「VMWare」があるはずです。
ファイルブラウザ上からマウスで放り込んでもOKですよ。
3.ファイルの解凍と展開
ダウンロードしたファイルは圧縮されているので、解凍します。私は以下を入力しました。
tar xzf ~/src/VMWare/VMware-player-2.0.4-93057.i386.tar.gz
文字が緑色の部分には、ダウンロードしたファイルの名前を入力してください。
ちなみにコマンド入力の途中で「Tab」キーを押すと、自動で補完されますので便利ですよ。
うまくいけば、コンソール上は何も言わずに終了します。
解凍されたフォルダが「~/src/VMWare/vmware-player-distrib」として完成していればOKです。
4.インストール
これで準備はできました。解凍したフォルダの中にある、インストールスクリプトを実行します。
以下のコマンドを実行します。
sudo ~/src/VMWare/vmware-player-distrib/vmware-install.pl
「sudo」を忘れずに。忘れると入力し直しです。
実行すると、インストールスクリプトが起動します。
英語の文章がずらずらと並びますが、元々一般的な設定が選択されているので、ずっと「Enter」を押し続けて下さい。
You can now run VMware Player by invoking the following command:と表示されたら設定完了です。
"/usr/bin/vmplayer".
Enjoy,
--the VMware team
が、まだ起動してはいけません。喜ぶのは早い。
以下のコマンドを実行しておきます。
sudo cp /lib/libgcc_s.so.1 /usr/lib/vmware/lib/libgcc_s.so.1これで設定をコピーしておきます。
sudo cp /usr/lib/libpng12.so.0 /usr/lib/vmware/lib/libpng12.so.0
はい。これで画面の上のメニューに「システム」という項目が増えているはずです。
この中に、「VMware Player」があります。
お疲れ様でした。
実行の度にソフトウェア利用許諾書が英語で表示されますが、その後の動作は Windowsと同じですよ。
eclipseでJavaプログラムをダブルクリックで実行できるようにする(Jarファイル化)
eclipseで作ったソフトをjarファイルとして配布したい、と思った場合の手順。
MacOS Xでも、WindowsではJRE がインストールされた状態なら、jarファイルをダブルクリックするだけでそのまま実行できるので便利になります。
現状Javaプログラムを配布するには一番いい方法ですね。
今回Mac版eclipse使ってますが、Windows版でも方法は全く同じです。
レシピ。
まず、プロジェクトエクスプローラから、該当するプロジェクトを右クリックして「Export」(エクスポート)を選択します。
「Java」の「JAR file」を選択して「NEXT」を選択。
次に、出力したいプロジェクト(プログラム)を選択し、「Browse」をクリックします。
出力先のパス(どこの、どんな名前でもOK)を入力して「Save」を選択。
画面が元に戻ったら、出力先Jarファイル名が設定されていることを確認し、「Next」を選択します。
あまり気にせず「NEXT」を選択します。
ここがミソです。
「Select the class of the application entry point」の「Main class」で「Browse」を選択します。
これはアプリケーションのメインクラスを選択する項目です。
Javaでは各クラスそれぞれにMain関数を作れるので、どれがメインクラスか指定しないといけません。
クラスの一覧が出るので、最初に実行したいクラスとmain関数を選択して「OK」を選択します。
Main classに入力されたクラスを確認して「Finish」を選択します。
普通は数個の Warningがあるのでこんな完了メッセージが出ますが、私は放っておいてます。
指定したパスに、XXXX.jarファイルが出力されます。
こんな感じで。
MacOS Xでも、WindowsではJRE がインストールされた状態なら、jarファイルをダブルクリックするだけでそのまま実行できるので便利になります。
現状Javaプログラムを配布するには一番いい方法ですね。
今回Mac版eclipse使ってますが、Windows版でも方法は全く同じです。
レシピ。




画面が元に戻ったら、出力先Jarファイル名が設定されていることを確認し、「Next」を選択します。


「Select the class of the application entry point」の「Main class」で「Browse」を選択します。
これはアプリケーションのメインクラスを選択する項目です。
Javaでは各クラスそれぞれにMain関数を作れるので、どれがメインクラスか指定しないといけません。

Main classに入力されたクラスを確認して「Finish」を選択します。


こんな感じで。
トラックバック仕様まとめ
トラックバックについては他にも資料はあると思うのですが。
前のサイトに実装する時に色々調べたので、トラックバック自体の仕様もまとめておきます。
まあ誰かの役に立つかもしれないので。
トラックバックとは、「各ポスト(投稿)同士をつなぎ合わせる」機能を提供するものです。
例えば、自分が新しい記事を投稿するとき、他のサイトに関連した記事があれば、「トラックバック」を送信して、相手のサイトに自分の記事へのリンクを提供できます。
また、自分の書いた記事にトラックバック受信機能があれば、誰かが自分で書いた補足情報へのリンクを送信してきてくれたりするのです。
まあトラックバックスパムとか最近増えててあれですけどね。
それでもとても有用なブログ連携技術なのは確かです。
下に仕様を。
ブログなどでは通常、各記事ごとにトラックバック受付用のURL(トラックバック Ping URL)を設けます。
通常「http://hogehogehogeee.com/trackback/3」とかいうURLになります。
特に規定は無いようですが、トラックバックであることが分かるURLの後ろに記事IDが付くことが多いようです。
なにやら難しそうなこと言ってますが、要は普通のHTTPリクエストで動作しますよ、ってことです。
ブラウザにURL入力して実行するのもREST、Webフォームに入力して送信ボタンを押してもREST。普通のネットサーフィンはほとんどRESTアーキテクチャです。
このままですね。普通のHTMLの<FORM>タグで作るWebフォームと同じような形式ってことです。
つまり、
で送信されたと同じデータが飛んできます。
普通の掲示板とかと全く同じです。テストしやすいですね。
ちなみに一般的なブラウザのFORMでのコンテントタイプ(enctype)は特別指定しない限り元々これ(つまりデフォルト)なので、enctype="application/x-www-form-urlencoded"は省略しても動きますよ。付けるに越したことはないですが。
ちなみに昔はリクエストメソッド「GET」、つまりURLアドレスに内容も含めて送信する形式だったそうなのですが、5年前くらいに廃止されたそうです。
現在のほとんどのサイトはPOSTリクエストにしか対応していません。
これから増えるかもしれませんけどね。Pingなんかは活発に議論されてるとか。
とはいえ増えても受信側は無視する(というか気づかない)だけなので、開発者的には今から怖がる必要は無いかと。気が向いたら対応すればOKです。
内容です。
いちいち送信側サイトの、と書いているので気づいたかもしれませんが、この情報には、トラックバックを送信する「うちの記事関連してるから載せてくれ!」って言ってきた側の情報しか載ってません。
つまり受信者側(開発側)は、受け取ったトラックバックがどの記事に対して送られたかをちゃんと把握して、的確な記事と一緒に表示させてあげる必要がある、と言うことです。
基本的にトラックバックURLは記事ごとに作ることになっているので、URLからどの記事かを判断する必要がありますね。
ちなみにMovable Typeなどもそうですが、これら4つすべてのパラメータを要求するサイトは少ないようです。
私はMovable Typeと同じく、urlのみ必須にしています。
こんなところで。以上。
前のサイトに実装する時に色々調べたので、トラックバック自体の仕様もまとめておきます。
まあ誰かの役に立つかもしれないので。
トラックバック概要
トラックバックとは、「各ポスト(投稿)同士をつなぎ合わせる」機能を提供するものです。
例えば、自分が新しい記事を投稿するとき、他のサイトに関連した記事があれば、「トラックバック」を送信して、相手のサイトに自分の記事へのリンクを提供できます。
また、自分の書いた記事にトラックバック受信機能があれば、誰かが自分で書いた補足情報へのリンクを送信してきてくれたりするのです。
まあトラックバックスパムとか最近増えててあれですけどね。
それでもとても有用なブログ連携技術なのは確かです。
下に仕様を。
トラックバックには受付専用のURLを設ける事。
ブログなどでは通常、各記事ごとにトラックバック受付用のURL(トラックバック Ping URL)を設けます。
通常「http://hogehogehogeee.com/trackback/3」とかいうURLになります。
特に規定は無いようですが、トラックバックであることが分かるURLの後ろに記事IDが付くことが多いようです。
トラックバックPing(トラックバック)はREST アーキテクチャで動作する。
なにやら難しそうなこと言ってますが、要は普通のHTTPリクエストで動作しますよ、ってことです。
ブラウザにURL入力して実行するのもREST、Webフォームに入力して送信ボタンを押してもREST。普通のネットサーフィンはほとんどRESTアーキテクチャです。
リクエストメソッドはPOST。コンテントタイプは「application/x-www-form-urlencoded」とする。
このままですね。普通のHTMLの<FORM>タグで作るWebフォームと同じような形式ってことです。
つまり、
<form action="http://hogehogehogeee.com/trackback/3" method="post" enctype="application/x-www-form-urlencoded">
...
</form>
で送信されたと同じデータが飛んできます。
普通の掲示板とかと全く同じです。テストしやすいですね。
ちなみに一般的なブラウザのFORMでのコンテントタイプ(enctype)は特別指定しない限り元々これ(つまりデフォルト)なので、enctype="application/x-www-form-urlencoded"は省略しても動きますよ。付けるに越したことはないですが。
ちなみに昔はリクエストメソッド「GET」、つまりURLアドレスに内容も含めて送信する形式だったそうなのですが、5年前くらいに廃止されたそうです。
現在のほとんどのサイトはPOSTリクエストにしか対応していません。
受信パラメータは4つ。
これから増えるかもしれませんけどね。Pingなんかは活発に議論されてるとか。
とはいえ増えても受信側は無視する(というか気づかない)だけなので、開発者的には今から怖がる必要は無いかと。気が向いたら対応すればOKです。
内容です。
- title (送信側サイトの記事タイトル)
- excerpt (送信側サイトの記事概要。普通は最初の500文字程度)
- url (送信側サイトの記事URL。サイトのトップページとかはダメです)
- blog_name (送信側サイトの名前)
いちいち送信側サイトの、と書いているので気づいたかもしれませんが、この情報には、トラックバックを送信する「うちの記事関連してるから載せてくれ!」って言ってきた側の情報しか載ってません。
つまり受信者側(開発側)は、受け取ったトラックバックがどの記事に対して送られたかをちゃんと把握して、的確な記事と一緒に表示させてあげる必要がある、と言うことです。
基本的にトラックバックURLは記事ごとに作ることになっているので、URLからどの記事かを判断する必要がありますね。
ちなみにMovable Typeなどもそうですが、これら4つすべてのパラメータを要求するサイトは少ないようです。
私はMovable Typeと同じく、urlのみ必須にしています。
こんなところで。以上。
JavascriptでIEを判定する方法
1行でIE(インターネットエクスプローラ)かどうか判定する方法を聞きつけたので。
ソース。
超簡単!
ただしMac用IEは判定できないそうで。
ま、今でもIE使っているMacユーザはかなり少ないと思うけど。
ソース。
- if(/*@cc_on!@*/false){
- ...IE用の処理
- }
if(/*@cc_on!@*/false){
...IE用の処理
}
超簡単!
ただしMac用IEは判定できないそうで。
ま、今でもIE使っているMacユーザはかなり少ないと思うけど。
ラベル:Firefox,IE,Java,Javascript

VC++で文字列のトークンを手作業で取得する(Token/Tokenize)
VC++6.0ってCStringにTokenizeという関数がないんです。
トークンというのは、指定した文字で区切られた文字列を順に取得するもの。CSVファイルの解析とかで使います。7.0以上にはあるんだけど。
ってことで、できるだけ短い処理でトークンを取得してみます。
ソース。
はてしなく美しくないですが。
ただ、VC++7.0以上のTokenize関数も、連続した区切り文字(たとえば",,")を1つの区切りとして扱ってしまうので、.NETを使っていても上のような独自関数を作らないといけないことがあります。
まあ、C標準関数のstrtok(トークン取得関数)も、VC++と同じ挙動なので仕方ないのですが。
うーん。
トークンというのは、指定した文字で区切られた文字列を順に取得するもの。CSVファイルの解析とかで使います。7.0以上にはあるんだけど。
ってことで、できるだけ短い処理でトークンを取得してみます。
ソース。
- int idx = 0, idxOld = 0;
- CString strLine = "ABC,DEF,GHI";
- // 最後の1つ以外
- while( ( idx = strLine.Find( ",", idxOld ) ) != -1 )
- {
- MessageBox( strLine.Mid( idxOld, ( idx - idxOld ) ) ) );
- idxOld = idx + 1;
- }
- // 最後の一つ
- strLine.Mid( strLine.ReverseFind( ',' ) + 1 ) );
int idx = 0, idxOld = 0;
CString strLine = "ABC,DEF,GHI";
// 最後の1つ以外
while( ( idx = strLine.Find( ",", idxOld ) ) != -1 )
{
MessageBox( strLine.Mid( idxOld, ( idx - idxOld ) ) ) );
idxOld = idx + 1;
}
// 最後の一つ
strLine.Mid( strLine.ReverseFind( ',' ) + 1 ) );
はてしなく美しくないですが。
ただ、VC++7.0以上のTokenize関数も、連続した区切り文字(たとえば",,")を1つの区切りとして扱ってしまうので、.NETを使っていても上のような独自関数を作らないといけないことがあります。
まあ、C標準関数のstrtok(トークン取得関数)も、VC++と同じ挙動なので仕方ないのですが。
うーん。
VB/VBAで指定ディレクトリ内のファイルを検索する
VBAで指定したディレクトリ内のファイルを検索する方法です。
下の例はExcel用。
Excelファイルと同じフォルダにあるファイル名を並べるサンプルです。
ソース。
ファイルの検索にはDirコマンドというのを使います。
はじめの1回目はファイル名とパスを指定して、2回目以降は指定せずに回します。
vbNormalというのはディレクトリ(フォルダ)以外のファイル。
他に以下の指定が可能です。詳細はヘルプに乗ってますよ。
ま、全部使ってみたわけではないのですが。
下の例はExcel用。
Excelファイルと同じフォルダにあるファイル名を並べるサンプルです。
ソース。
- Private Sub CommandButton1_Click()
- Dim fileName As String
- Dim index As Integer
- fileName = Dir(ThisWorkbook.Path + "\\*", vbNormal)
- index = 1
- Do While (fileName <> "")
- ThisWorkbook.Worksheets(1).Cells(index, 1).Value = fileName
- fileName = Dir()
- index = index + 1
- Loop
- End Sub
Private Sub CommandButton1_Click()
Dim fileName As String
Dim index As Integer
fileName = Dir(ThisWorkbook.Path + "\\*", vbNormal)
index = 1
Do While (fileName <> "")
ThisWorkbook.Worksheets(1).Cells(index, 1).Value = fileName
fileName = Dir()
index = index + 1
Loop
End Sub
ファイルの検索にはDirコマンドというのを使います。
はじめの1回目はファイル名とパスを指定して、2回目以降は指定せずに回します。
vbNormalというのはディレクトリ(フォルダ)以外のファイル。
他に以下の指定が可能です。詳細はヘルプに乗ってますよ。
- 「vbReadOnly」読み取り専用ファイル 。
- 「vbHidden」隠しファイル 。
- 「vbSystem」システム ファイル。Windowsのみ。
- 「vbVolume」システムファイルも含めたすべてのファイル。Windowsのみ。
- 「vbDirectory」フォルダ 。
- 「vbAlias」エイリアス ファイル。Macintoshのみ。
ま、全部使ってみたわけではないのですが。
Javaでファイルのドラッグアンドドロップを受け付ける
備忘録。
Javaでファイルのドラッグアンドドロップを受け付けるプログラムです。
珍しくサンプルプログラムまで作りました。
eclipseで作ってましたが、下を適当な名前.javaとかにしてコンパイルすれば動くと思います。
こんな感じで。
Javaでファイルのドラッグアンドドロップを受け付けるプログラムです。
珍しくサンプルプログラムまで作りました。
eclipseで作ってましたが、下を適当な名前.javaとかにしてコンパイルすれば動くと思います。
- import java.awt.*;
- import java.awt.datatransfer.*;
- import java.awt.dnd.*;
- import java.awt.event.*;
- import java.io.File;
- /**
- * DandDクラス
- * ドラッグアンドドロップテストプログラム
- * @author Sakito Yumitsuka
- */
- public class DandD extends Frame
- {
- TextField tf1 = new TextField("ここにドラッグアンドドロップ",30);
- /**
- * ドラッグアンドドロップウィンドウの設定
- */
- public DandD()
- {
- // ウィンドウ上の設定
- this.setTitle("Drag and drop");
- this.setSize(350, 90);
- // ウィンドウ終了時の動作を指定
- this.addWindowListener( new WindowAdapter(){
- public void windowClosing(WindowEvent evt) {
- System.exit(0);
- }});
- // 無名クラスでドロップ時の動作を指定
- new DropTarget(tf1, new DropTargetAdapter(){
- public void drop( DropTargetDropEvent e ) {
- try {
- Transferable transfer = e.getTransferable();
- if ( transfer.isDataFlavorSupported( DataFlavor.javaFileListFlavor ) ) {
- e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
- java.util.List fileList = (java.util.List)( transfer.getTransferData( DataFlavor.javaFileListFlavor ) );
- tf1.setText( ( (File)fileList.get(0) ).getAbsolutePath() );
- }
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- }
- });
- setLayout( new FlowLayout() );
- add(tf1);
- setVisible( true );
- }
- /**
- * @param args
- */
- public static void main(String[] args)
- {
- new DandD();
- }
- }
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.awt.event.*;
import java.io.File;
/**
* DandDクラス
* ドラッグアンドドロップテストプログラム
* @author Sakito Yumitsuka
*/
public class DandD extends Frame
{
TextField tf1 = new TextField("ここにドラッグアンドドロップ",30);
/**
* ドラッグアンドドロップウィンドウの設定
*/
public DandD()
{
// ウィンドウ上の設定
this.setTitle("Drag and drop");
this.setSize(350, 90);
// ウィンドウ終了時の動作を指定
this.addWindowListener( new WindowAdapter(){
public void windowClosing(WindowEvent evt) {
System.exit(0);
}});
// 無名クラスでドロップ時の動作を指定
new DropTarget(tf1, new DropTargetAdapter(){
public void drop( DropTargetDropEvent e ) {
try {
Transferable transfer = e.getTransferable();
if ( transfer.isDataFlavorSupported( DataFlavor.javaFileListFlavor ) ) {
e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
java.util.List fileList = (java.util.List)( transfer.getTransferData( DataFlavor.javaFileListFlavor ) );
tf1.setText( ( (File)fileList.get(0) ).getAbsolutePath() );
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
setLayout( new FlowLayout() );
add(tf1);
setVisible( true );
}
/**
* @param args
*/
public static void main(String[] args)
{
new DandD();
}
}
こんな感じで。
ラベル:Java,ドラッグアンドドロップ

Access VBAでテーブル(クエリ)を検索する
テーブルを検索するような親切な関数はAccessにはありません。(らしいです)
んが、テーブルとクエリそれぞれのオブジェクトリストがあるので、こいつをぐるぐる回して名前検索ができます。
確認環境はAccess2003だけど、たぶんAccess97以上なら使えると思います。
下は「テーブル名」というテーブルを探すコードです。
こんな感じ。
上のdb.TableDefsをdb.QueryDefsに置き換えると、クエリの検索ができますよ。
んが、テーブルとクエリそれぞれのオブジェクトリストがあるので、こいつをぐるぐる回して名前検索ができます。
確認環境はAccess2003だけど、たぶんAccess97以上なら使えると思います。
下は「テーブル名」というテーブルを探すコードです。
- '#### 支度 ####
- Dim db As dao.Database
- '#### DBオープン ####
- Set db = CurrentDb
- '#### 検索 ####
- For Each tble In db.TableDefs
- If tble.name = "テーブル名" Then
- MsgBox "発見!"
- Exit For
- End If
- Next
- '#### 片付 ####
- db.Close
- Set db = Nothing
'#### 支度 ####
Dim db As dao.Database
'#### DBオープン ####
Set db = CurrentDb
'#### 検索 ####
For Each tble In db.TableDefs
If tble.name = "テーブル名" Then
MsgBox "発見!"
Exit For
End If
Next
'#### 片付 ####
db.Close
Set db = Nothing
こんな感じ。
上のdb.TableDefsをdb.QueryDefsに置き換えると、クエリの検索ができますよ。
Access VBAでテーブルを生成、削除する
AccessのVBAには、SQLを実行できるADODB.Connectionなるものがあります。
んが、なぜかこいつ、SQLからのCREATE TABLE(テーブル作成)とかDROP TABLE(テーブル削除)とかができません。
ちゃんとしたDBではない、ってことか…。
テーブルの生成方法は何種類かありますが、一番簡単な方法で。
削除は簡単。1行ですみます。
全部SQLでできればわかりやすいんですけどね。
まあ、そういうものということで。
んが、なぜかこいつ、SQLからのCREATE TABLE(テーブル作成)とかDROP TABLE(テーブル削除)とかができません。
ちゃんとしたDBではない、ってことか…。
テーブルの生成方法は何種類かありますが、一番簡単な方法で。
- '#### 支度 ####
- Dim db As dao.Database
- Dim def As TableDef
- '#### 接続 ####
- Set db = CurrentDb
- '#### テーブル情報作成 ####
- Set def = db.CreateTableDef("テーブル名")
- Call def.Fields.Append(def.CreateField("列1", dbInteger))
- Call def.Fields.Append(def.CreateField("列2", dbText, 255))
- '#### テーブル生成 ####
- Call db.TableDefs.Append(def)
- '#### 片付け ####
- db.Close
- Set db = Nothing
'#### 支度 ####
Dim db As dao.Database
Dim def As TableDef
'#### 接続 ####
Set db = CurrentDb
'#### テーブル情報作成 ####
Set def = db.CreateTableDef("テーブル名")
Call def.Fields.Append(def.CreateField("列1", dbInteger))
Call def.Fields.Append(def.CreateField("列2", dbText, 255))
'#### テーブル生成 ####
Call db.TableDefs.Append(def)
'#### 片付け ####
db.Close
Set db = Nothing
削除は簡単。1行ですみます。
- '#### 支度はいらない ####
- Call DoCmd.DeleteObject(acTable, "テーブル名")
'#### 支度はいらない ####
Call DoCmd.DeleteObject(acTable, "テーブル名")
全部SQLでできればわかりやすいんですけどね。
まあ、そういうものということで。
Access VBAでSQLを実行する
AccessのVBAで、好きなSQLを実行する方法。
でもCREATE TABLEみたいにテーブルを追加したり削除したりはできないっぽい。
主にSELECTとUPDATE、INSERTみたいな運用系(?)SQL専用だな。
こんな感じ。
でもCREATE TABLEみたいにテーブルを追加したり削除したりはできないっぽい。
主にSELECTとUPDATE、INSERTみたいな運用系(?)SQL専用だな。
- '#### 支度 ####
- Dim con As ADODB.Connection
- Dim rs As ADODB.Recordset
- '#### DBを開く ####
- Set con = Application.CurrentProject.Connection
- '#### SQL実行 ####
- Set rs = con.Execute("SELECT * FROM テーブル WHERE ID = ""DXERW""")
- '#### 後片付け ####
- con.Close
- Set con = Nothing
'#### 支度 ####
Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
'#### DBを開く ####
Set con = Application.CurrentProject.Connection
'#### SQL実行 ####
Set rs = con.Execute("SELECT * FROM テーブル WHERE ID = ""DXERW""")
'#### 後片付け ####
con.Close
Set con = Nothing
こんな感じ。
2008年10月14日火曜日
JAVAでフォルダ内のファイル名を一覧取得
指定したフォルダ内のファイルとフォルダ名を一覧で取得する方法です。
「C:\hogehoge」フォルダ内の全ファイル、フォルダ名を取得してみます。
これでfileList[]にファイル名のリストが保存されます。
ちなみにこいつは取得時にファイル名で絞込みができます。
例として、下ではPDFファイルのみを抽出します。
「C:\hogehoge」フォルダ内の全ファイル、フォルダ名を取得してみます。
- File dir = new File("C:\hogehoge");
- String[] fileList = dir.list();
File dir = new File("C:\hogehoge");
String[] fileList = dir.list();
これでfileList[]にファイル名のリストが保存されます。
ちなみにこいつは取得時にファイル名で絞込みができます。
例として、下ではPDFファイルのみを抽出します。
- File dir = new File("C:\hogehoge");
- String[] fileList = dir.list(new FilenameFilter() {
- public boolean accept(File dir, String name) {
- return name.toLowerCase().endsWith(".pdf");
- }
- });
File dir = new File("C:\hogehoge");案外単純。
String[] fileList = dir.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".pdf");
}
});
VC++/VC++.NETでウィンドウのドラッグを禁止する
備忘録。
Visual Stuido.NETで表示されたウィンドウのドラッグ自体を禁止する方法。
nIDは下位4BitがSystemで使用されるため常にマスクしないといけないようです。
この比較ではSC_MOVE(ウィンドウ移動)を使用しています。
他にも、以下のパラメータが使用できます。
どうやらそれぞれの処理をする直前に呼ばれるようです。
Visual Stuido.NETで表示されたウィンドウのドラッグ自体を禁止する方法。
- // イベントを追加。(WM_SYSCOMMAND)
- ON_WM_SYSCOMMAND()
- // 対応する関数に、以下の処理を作成
- void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
- {
- if((nID & 0xFFF0) != SC_MOVE)
- {
- CMainFrame::OnSysCommand(nID, lParam);
- }
- }
// イベントを追加。(WM_SYSCOMMAND)
ON_WM_SYSCOMMAND()
// 対応する関数に、以下の処理を作成
void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
if((nID & 0xFFF0) != SC_MOVE)
{
CMainFrame::OnSysCommand(nID, lParam);
}
}
nIDは下位4BitがSystemで使用されるため常にマスクしないといけないようです。
この比較ではSC_MOVE(ウィンドウ移動)を使用しています。
他にも、以下のパラメータが使用できます。
- SC_CLOSE:ウィンドウをクローズ
- SC_HOTKEY:ホットキーに対応したオブジェクトをアクティブにする時呼ばれます。lParam の下位ワードでアクティブになるオブジェクトのHWNDを識別します。
- SC_HSCROLL:水平スクロールする時
- SC_VSCROLL:垂直スクロールする時
- SC_MAXIMIZE (または SC_ZOOM):最大化する時
- SC_MINIMIZE (または SC_ICON):最小化するとき
- SC_KEYMENU:キーボードからメニューを呼び出した時
- SC_MOUSEMENU:マウスクリックでメニューを呼び出した時
- SC_MOVE:ウィンドウの移動時(ドラッグも)
- SC_NEXTWINDOW:次のウィンドウに移動する時
- SC_PREVWINDOW:直前のウィンドウに移動する時
- SC_RESTORE:通常の位置とサイズにウィンドウを戻す時
- SC_SCREENSAVE:スクリーンセーバーを実行する時
- SC_SIZE:ウィンドウのサイズ変更
- SC_TASKLIST:タスクマネージャのアプリケーションを実行する時
どうやらそれぞれの処理をする直前に呼ばれるようです。
Blogger Syntax Highliter
ええと。便利なものがあるんですねここ。
主に開発屋なので、ソースコード載せたい時もあるじゃないですか。
でもそのまま載せると、全部黒い文字になってしまって、読みづらいんですよね。
やっぱり似たこと考える人多いみたいで。
ソースのハイライト表示をやってくれるBlogger用のガジェットがありました。
「Blogger Syntax Highliter」。ここです。
http://fazibear.googlepages.com/blogger.html
怪しげな画面が出ますが、ちゃんとしたインストールページです。
「+add to Blogger」というボタンを押すだけで、設定が開始できます。
ちなみに前のサイトで導入してたのと同じ。
設定でスタイルシートもいじれるので、表示や色分けもいじれます。便利便利。
前の感覚でそのまま導入したら、Bloggerが自動的に追加してしまう文字列が悪さをして困ってたんです。
Syntax Highliter自体のソースをいじろうと思ってたんですけど、思いついて検索したら即発見。即導入。
いや便利便利。
主に開発屋なので、ソースコード載せたい時もあるじゃないですか。
でもそのまま載せると、全部黒い文字になってしまって、読みづらいんですよね。
やっぱり似たこと考える人多いみたいで。
ソースのハイライト表示をやってくれるBlogger用のガジェットがありました。
「Blogger Syntax Highliter」。ここです。
http://fazibear.googlepages.com/blogger.html
怪しげな画面が出ますが、ちゃんとしたインストールページです。
「+add to Blogger」というボタンを押すだけで、設定が開始できます。
ちなみに前のサイトで導入してたのと同じ。
設定でスタイルシートもいじれるので、表示や色分けもいじれます。便利便利。
前の感覚でそのまま導入したら、Bloggerが自動的に追加してしまう文字列が悪さをして困ってたんです。
Syntax Highliter自体のソースをいじろうと思ってたんですけど、思いついて検索したら即発見。即導入。
いや便利便利。
ラベル:雑記

2008年10月10日金曜日
[ VC++ ] VC++でフォルダ丸をごとコピーする方法
Windows用のプログラムです。
C++でのフォルダ丸ごとコピーの方法。
私は以下のような関数を作って、fromに元のパス名、toにコピー先のパス名を入力するようにしています。
WindowsAPIを使っているので、CString部分をTCHARとかで書き換えればVC以外でも動くはず。
ソース。
こんな感じで。
C++でのフォルダ丸ごとコピーの方法。
私は以下のような関数を作って、fromに元のパス名、toにコピー先のパス名を入力するようにしています。
WindowsAPIを使っているので、CString部分をTCHARとかで書き換えればVC以外でも動くはず。
ソース。
- int folderCopy( CString from, CString to )
- {
- SHFILEOPSTRUCT tSHFile;
- tSHFile.hwnd = ::GetDesktopWindow();
- tSHFile.wFunc = FO_COPY;
- tSHFile.fFlags = FOF_SILENT | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI;
- tSHFile.fAnyOperationsAborted = TRUE;
- tSHFile.hNameMappings = NULL;
- tSHFile.lpszProgressTitle = "";
- // パス名のCStringの末尾に\0をつけて設定
- from += "0";
- to += "0";
- from.SetAt( from.GetLength()-1, NULL );
- to.SetAt( to.GetLength()-1, NULL );
- tSHFile.pFrom = from;
- tSHFile.pTo = to;
- return SHFileOperation( &tSHFile ); // 実行
- }
int folderCopy( CString from, CString to )
{
SHFILEOPSTRUCT tSHFile;
tSHFile.hwnd = ::GetDesktopWindow();
tSHFile.wFunc = FO_COPY;
tSHFile.fFlags = FOF_SILENT | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI;
tSHFile.fAnyOperationsAborted = TRUE;
tSHFile.hNameMappings = NULL;
tSHFile.lpszProgressTitle = "";
// パス名のCStringの末尾に\0をつけて設定
from += "0";
to += "0";
from.SetAt( from.GetLength()-1, NULL );
to.SetAt( to.GetLength()-1, NULL );
tSHFile.pFrom = from;
tSHFile.pTo = to;
return SHFileOperation( &tSHFile ); // 実行
}
こんな感じで。
2008年10月2日木曜日
スパム検出ボット
なんか公開した直後にいきなり引っかかったらしく。
おいおい。まだなんも書いてないんですけど。
非公開になったあげく、20日以内に自分で申請出さないと勝手に削除されるらしい。
まあ自動的に検出するならそういうこともあるんでしょうね。
何で引っかかったのかよく分からないけど。
おいおい。まだなんも書いてないんですけど。
非公開になったあげく、20日以内に自分で申請出さないと勝手に削除されるらしい。
まあ自動的に検出するならそういうこともあるんでしょうね。
何で引っかかったのかよく分からないけど。
ラベル:雑記

登録:
投稿 (Atom)