OZの部屋

なんでも日記です

このブログの編集ツール 改

2006-11-03 15:28:32 | プログラム
先日 このブログを編集していたら
  HTMLタグを記述しようとしたら< >を入力したとき、うまくいかなかったので、ツールを作ってみました。
ところが、けさ、編集していたら、先頭スペースが無視されることが分かりました。
それで、今度のは、
先頭スペースがあったら、 に書き換えるようしました。
また、タブも2このスペースに変換するようにしました。
(先頭からの場合のみ)
それで
  <html>
    <head>
    xxxxx
    </head>
    <body>
      <a href="xxxx">aaaa</a>
    </body>
  </html>

なんてのも楽にできるようになりました。

Gooブログ編集ツール OhMyGoo.zip

↑をダウンロード 217Kb 

今度はDelphi Indy を使ってみる

2006-11-03 07:46:28 | プログラム
delphi でHTTPを使うには
Indyが楽、以前会社のシステムで少し使ったことがある。
使っているDelphiは ちと古くなったけれど Delpi7

そこで、小手調べ。

新規アプリケーションを作成して
フォームにMemoをひとつ、Indy Clientsの中にあるIdHTTPをひとつ、
それと、Buttonをひとつ
以上3個のコンポをフォームに置く。
なまえはデフォルトで使う。

ボタンをダブルクリックして、ちょっとコードをかく
procedure TForm1.Button1Click(Sender: TObject);
const
  url='http://www.google.co.jp/';
begin
  Memo1.Lines.Text:=IdHttp1.Get(url);
end;

これでRun ちゃんとGetできているみたい。
ちょー簡単だ。
ちなみに、MemoのScrollBarsはssBothにしておいたほうがよさそう。

さて、こんどはURLをGooのトップページにしてみる

const
  url='http://www.google.co.jp/';

これだけ変えて、Runすると、
一応とってきてはいるが、日本語が化けている。
GooはUTF-8のコーデックだ。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">


それでは、

procedure TForm1.Button1Click(Sender: TObject);
const
  url='http://www.goo.ne.jp';
begin
  Memo1.Lines.Text:=UTF8Decode(IdHttp1.Get(url));
end;


でOK でもさきほどのURLでUTF8Decode()してしまうと
まったく表示されなくなってしまう。
HTMLヘッダ内のMetaタグでhttp-equiv属性にcharsetを設定しているところを調べてけっていしなければならない。
正規表現だ。
が、delphiには正規表現はない。

でも世の中には必要に応じて用意してくれる人がいるんですね。

BRegExp この話は次回につづく。

それと、いまこの文章書いてて気がついたんですが、
先頭スペースは無視されるんですね。convmetaを直さなくちゃ。

ここのブログ編集ツール

2006-10-31 22:49:15 | プログラム
ここのブログを編集していて< >が入ったものは非常に使いにくい。-- 当たり前なんですが。
そこで、delphiでちょっとしたツールを作ってみました。
チョコチョコとつくったので、かなりいい加減ですが、そこそこにつかえるみたいです。


Goo編集ツール <======これをクリックしてダウンロード
221Kbytes

LZH解凍すると実行ファイルを含む4個のファイルがあります。
delphiソースとコンパイル済みの実行EXE、
delphiでいじってみたい方は 新しいフォルダを作りconvmeta.dpr,unit1.pas,unit1dfm この3個のをいれて、convmeta.dprをダブルクリックすれば開いて、リソース再構築後いじれるようになるはずです。

perl LWP アップロード Basicn認証 つづき

2006-10-31 22:01:17 | プログラム
アップロード時のBasic認証で昨日は
$ua->credentials( $site, $realm, $user => $pass);
としたが、大きなファイルをアップするとき、
LWPのcredentials ではデータレングスを0にしない。
当たり前か。
送った後で、サーバー側から認証しなさい。とメッセージが帰ってきて、
ユーザー名とパスワードのセットをBase64でエンコードしたものを
Authorizationで付けてやって再送しているようでした。
つまり、認証があるのは分かっているわけなので、
ヘッダーに付けてやればよかったのでした。
そうすると、Basic認証の「領域名」などというのも必要なくなるのでした。
ちなみに、添付ファイルがテキストだと自動的に text/plain になって
.lzh とかだとapplication/octet-streamにしてくれていました。

use HTTP::Request::Common;
use LWP::UserAgent;
use MIME::Base64;

#アップロードするファイル
$upfile='abc.txt';
#ファイル名入力欄のオブジェクト名
$fileform='file1';
#アップロードページのサブミットactionページ
$target='http://www.xxxx.jp/cgi-bin/upload.cgi';
#Basic認証ユーザー名
$user='user1';
#パスワード
$pass='xyzxyz';
####### ここまで変数をしてする ########
# これ以降は変更不要 ###

$target=~m#http(s?)://([^/]+)/.*#;
$site="$2:".($1 eq 's'?443:80);

$ua = LWP::UserAgent->new;
$auth_value = "Basic " . MIME::Base64::encode("$user:$pass", "");

$res=$ua->request(POST $target,
Authorization => $auth_value,
Content_Type => 'form-data',
Content => [$fileform => [$upfile],]);
print $res->as_string;

perl LWP アップロード Basicn認証

2006-10-30 23:45:19 | プログラム
サーバー側でディレクトリに対してBasic認証をかけている場合の
LWPの使い方
IEで対象ページにアクセスしたとき出てくる認証画面の表示名がrealmになる。
以下の$upfile,$target,$user,$pass,$realmを設定して
perl upload.pl
と実行する。

# upload.pl Basic認証付のページにファイルをアップロードする
use HTTP::Request::Common;
use LWP::UserAgent;

#アップロードするファイル
$upfile='abc.txt';
#ファイル名入力欄のオブジェクト名
$fileform='file1';
#アップロードページのサブミットactionページ
$target='http://www.xxx.jp/cgi-bin/upload.cgi';
#Basic認証ユーザー名
$user='user1';
#パスワード
$pass='xyzxyz';
#Basic認証の領域名
$realm='Input your password';
####### ここまで変数をしてする ########
# これ以降は変更不要 ###

$target=~m#http(s?)://([^/]+)/.*#;
$site="$2:".($1 eq 's'?443:80);

$ua = LWP::UserAgent->new;
$ua->credentials( $site, $realm, $user => $pass);

$res=$ua->request(POST $target,
Content_Type => 'form-data',
Content => [ $fileform => [$upfile],
]);
print $res->as_string;



HTTP Analyzer で実行を見てみると
送信Streamは
POST /cgi-bin/upload.cgi HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Host: www.xxxx.jp
User-Agent: libwww-perl/5.805
Content-Length: 173
Content-Type: multipart/form-data; boundary=xYzZY

--xYzZY
Content-Disposition: form-data; name="file1"; filename="abc.txt"
Content-Type: text/plain

123
111
44
--xYzZY--


Responsは
HTTP/1.1 401 Authorization Required
Date: Mon, 30 Oct 2006 15:01:30 GMT
Server: Apache/1.3.33 (Unix) mod_ssl/2.8.23 OpenSSL/0.9.7a
WWW-Authenticate: Basic realm="Input your password"
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1

1d9
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>401 Authorization Required</TITLE>
</HEAD><BODY>
<H1>Authorization Required</H1>
This server could not verify that you
are authorized to access the document
requested. Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.<P>
<HR>
<ADDRESS>Apache/1.3.33 Server at ns.xxxx.jp Port 80</ADDRESS>
</BODY></HTML>


認証後の動作までHTTP Analyzerが追えていないようですが、
実際にちゃんとアップロードされていました。