Hatena::ブログ(Diary)

hogeなlog

プロフィール

hogelog

hogelog

小室 直(こむろ すなお)。電気通信大学2003年入学。2010年修士卒業。プログラミングとかしてます。

カレンダー
1984 | 01 |
2006 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 |
2010 | 01 | 06 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 05 | 08 | 09 | 10 | 12 |
2012 | 01 | 04 | 06 |

April 27(Fri), 2007 引っ越し前にちゃんと準備しないとネット環境が

[]

引っ越し前にちゃんと手続きしてればラグも無かろうが、全くしてなかったのでしばらくねっと環境が無い。大学の計算機で大概の用は、済むといえば済むんだが。自宅 PC にネット環境が無いというのは、割と悪くない。ネットがあるとどうしても色々と時間を食う。たとえばこんな類の日記を mixi に書きまくったり。

いつものとおりに、kterm で screen したら、

Screen version 4.00.02 (FAU) 5-Dec-03

Copyright (c) 1993-2002 Juergen Weigert, Michael Schroeder
Copyright (c) 1987 Oliver Laumann

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either version 2, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program (see the file COPYING); if
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

Send bugreports, fixes, enhancements, t-shirts, money, beer & pizza to screen@uni-erlangen.de

「Tシャツとか金とかビールやピザとかこのメアドまで送れ」とか書いてあることに気づいた。最近のメールプロトコルはピザとか送れるらしい。Plagger もビックリ。

トラックバック - http://d.hatena.ne.jp/hogelog/20070427

April 20(Fri), 2007

[][][] なめらかラインを描画するのに、何が必要だろう

補間法とか調べて適当に使えばいけそうかなーと思った。このへん。

というか、手元にあった数値計算の教科書にたくさん書いてあった。ラグランジュ補完とかで十分いけそう。

追加

顔ですら知らないけど、実は大学の後輩サークルの後輩でもある人が管理するサイトにもあった。

http://wiki.osdev.info/index.php?%A5%A2%A5%EB%A5%B4%A5%EA%A5%BA%A5%E0%2F%CA%E4%B4%B0

サークルの方は、俺は一瞬在籍しただけなんだけど。っつーか俺留年してるから後輩かっつーのも微妙だけど。

April 19(Thu), 2007 なんとなく論文読み

[大学] ほげほげ

微妙に講義始まるより早くついたから、なんとなく学部の図書室で適当に本を眺めていた。学生の修論とかがたくさんあった。ちょっと手にとって見てみたら、あれだな。おもしろい。よく見てないんであるかわからんが、卒論とかだったらもっと面白い気がする。

自分が卒論書くときの参考云々とか全く関係無く、単純におもしろいので色々読んでみよう。

時間空いたときに眺めてたら、卒論は置いてなかった。数が膨大になるからか、人目に晒すのが恥ずかしいかのどっちかなんかな。

[][] ほげ

Java でなんとなーく適当なプログラム書いてるんだが、

class public HogeApp{
  private Figure hogeFigure;
  public HogeApp(){
     // なんか色々
  }
  public Figure getFigure(){
    return hogeFigure;
  }
  public void setFigure(Figure figure){
    hogeFigure = figure;
  }
}

こんな類のメソッド定義しまくってた。これはあれだろ。意味が無い。こんなメソッドで hogeFigure を制御するなら最初っから public にすればいい。と思う。

トラックバック - http://d.hatena.ne.jp/hogelog/20070419

April 14(Sat), 2007 なんかPrologについて書こうかと思っている

いま SWI-Prolog インストールしたとこまで。

M.Hiroiさんの文書( http://www.geocities.jp/m_hiroi/prolog/ ) とか参考にあそぼうと思う。

[][] Prolog に触る(1)

とりあえず like.pro として以下のようなファイルを作って、SWI-Prolog に読み込ませてみる。

like(taro, coffee).
like(taro, hanako).
like(hanako, hanako).
like(sizuka, isamu).
like(isamu, sizuka).
like(coffee, human).
human(taro).
human(hanako).
human(sizuka).
human(isamu).

で、インタプリタで色々質問。

1 ?- like(taro, hanako).

Yes
2 ?- like(hanako, taro).

No
3 ?- human(taro).

Yes

Yes/No の 1bit の返事をしてくれた喜ぼう。

4 ?- like(taro, X).

X = coffee ;

X = hanako ;

No

こういうことですね。

< taro が like な X はなんですか。
> coffee じゃないですか?
< いや違う(「;」の入力)
> hanako じゃないですか?
< いや違う
> じゃあもう知らねえよ馬鹿
6 ?- like(X, hanako).

X = taro 

Yes
7 ?- like(Foo, Bar).

Foo = taro,
Bar = coffee ;

Foo = taro,
Bar = hanako ;

Yes
8 ?- human(X).

X = taro 

Yes
9 ?- like(X, X).

X = hanako 

Yes

自由変数(X, Y みたいな大文字で始まる識別子)はどこにでも指定できるよ、と。うん、これは述語論理そのまんまじゃなかろうか。あとここまでしかやったことない俺がほざくのもなんだが、Prologって簡単じゃね? 噂に聞いた評判では、むずいむずいと評判だったけど、それは Prolog でプログラム書くのが難しいのであって、Prolog が難しいわけじゃないのではないか。

まだわからんけど。

12 ?- like(X, Y), like(Y,X).

X = hanako,
Y = hanako ;

X = sizuka,
Y = isamu 

Yes
13 ?- like(X, Y), human(Y).

X = taro,
Y = hanako ;

X = hanako,
Y = hanako ;

X = sizuka,
Y = isamu ;

X = isamu,
Y = sizuka ;

No

こんなんもできた。X, Y のような自由変数は、それ以降で束縛されてるとか。

えーと例えば上の 13 はこんな論理式に相当するだろうか。¥exists{(X,Y)}, L_{XY} & H_{Y} (L:Like, H:Human という述語で)

とりあえず、論理学の講義は受けといてよかったなあと思った。

sage(嘘)sage(嘘) 2013/10/29 21:22 :- op(1000,xfx,ha).
:- op(900,xfx,ga).
:- op(1100,xf,desu).
:- op(1200,xf,ka).
:- op(1200,xf,yone).

taro ha coffee ga suki.

%こんなことすると楽しいですよ
%完璧に日本語を解析することが目的です


taro ha coffee ga suki desu ka.
taro ha coffee ga suki desu yone.
%ちゃんとした日本語で質問するための一時しのぎ

?- taro ha coffee ga suki desu yone.
Yes.

?- taro ha Nani ga suki desu ka.
Nani = coffee.

トラックバック - http://d.hatena.ne.jp/hogelog/20070414

April 12(Thu), 2007 Javaの実験講義を受けているので

[][] cygwin で gcj 動かしてみよう

Java という言葉は、おおよそ二つの意味合いがある。C言語、C++、Pascalとかと同様の、(オブジェクト指向が云々、みたいな話の)言語としてのJava。そして環境としてのJavaである。JVMがアレでバイトコードのポータビリティがほげでJavaコンパイラがよよよとか語られる「Javaプラットフォーム」のこと。

Java の入門者に甘言を囁く人は、だいたい Java のバイトコードは JVM があればどこでも動くのだよふふふ、みたいなことを言う。そんなことを言われると、たしかにそうなのかもなあと思いつつも、どこか釈然としない気持ちを抱く。その釈然としない気持ちがなんなのかというと、たいてい先の段落で述べたような、言語としての Java と、環境としての Java の違いを認識できてないゆえのものだ。Java 玄人の面々は、素人の我々を煙に撒くために、意図的に言語としての Java と環境としての Java をマゼコゼにして、OOPの利点とかも教えるのめんどくさいから、わかりやすい環境としての良さだけ語ってるのに違いない! 玄人は言語としての Java の素晴らしさを独占しているのだ!

という前置きで、あえて環境としての Java を無視して、gcj で Java に触れてみようという思い付き。まずcygwinにインストール。setup.exeから gcj、libiconv あたりを入れる。

% cat hello.java
class HelloWorld{
  public static void main(String argv[]){
    System.out.println("Hello, World!");
  }
}
% gcj hello.java --main=HelloWorld -o hello
% ./hello.exe
Hello, World!

できたできた。--main を指定しないと

% gcj hello.java -o hello
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libcygwin.a(libcmain.o):(.text+0xab): undefined reference to `_WinMain@16'
collect2: ld はステータス 1 で終了しました

こんなこと言われるので注意。でもちょっとびっくりするのが

% ll
合計 6213
-rwxr-xr-x 1 Gekko なし 6359834 Apr 12 08:04 hello.exe*
-rw-r--r-- 1 Gekko なし     107 Apr 12 08:04 hello.java
% strip -s hello.exe
% ll
合計 385
-rwxr-xr-x 1 Gekko なし 2157568 Apr 12 08:19 hello.exe*
-rw-r--r-- 1 Gekko なし     107 Apr 12 08:04 hello.java
% upx --best hello.exe
                       Ultimate Packer for eXecutables
    Copyright (C) 1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006
UPX 2.91 beta   Markus Oberhumer, Laszlo Molnar & John Reiser   Nov 29th 2006

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
   2157568 ->    654848   30.35%    win32/pe     hello.exe

Packed 1 file.

すっげー。HelloWorldで6MB、strip で削って upx で縮めてやっとこ 600KB。やっとこ 600KB っていうか、削れすぎておもしろいけど。

つか、サイズよりも速度が。

% time javac hello.java
javac hello.java  0.15s user 0.14s system 15% cpu 1.811 total
% time java HelloWorld
Hello, World!
java HelloWorld  0.18s user 0.15s system 44% cpu 0.749 total
% time gcj hello.java --main=HelloWorld -o hello
gcj hello.java --main=HelloWorld -o hello  2.02s user 1.68s system 80% cpu 4.601 total
% time ./hello.exe
Hello, World!
./hello.exe  0.06s user 0.17s system 14% cpu 1.631 total

gcjはコンパイル速度がダンチに遅い。cygwin の gcj ですしね。

んで、俺はこんなことするより、大学の Java の課題をやった方がいいだろ、と。

[][] Cygwin から Windows の JDK を使う

ほぼ CygwinでJavaを快適に使う どおりに。ただ、俺の場合 JDK を「D:\Program Files\Java\jdk1.5.0_11」なんて位置にインストールしてたからちょっと問題が。「Program Files」の空白がですね。いつもいつも困らせてくれますね。

よくわからないけど、上のサイトの java_wrapper に適当に手を加える。

java_wrapper.patch

--- java_wrapper        2007-02-18 03:44:48.000000000 +0900
+++ java_wrapper        2007-04-12 08:52:54.046875000 +0900
@@ -50,12 +50,12 @@
 #
 # スクリプトのmain処理部
 #
-if [ -z $JAVA_HOME ]; then
+if [ -z "$JAVA_HOME" ]; then
     echo "JAVA_HOME not defined."
     exit 1;
 fi

-WIN32JDKDIR=`cygpath $JAVA_HOME`
+WIN32JDKDIR=`cygpath "$JAVA_HOME"`
 CMD=`basename $0 .exe`
 PROGRAM=$WIN32JDKDIR/bin/$CMD

@@ -67,12 +67,12 @@
     exit 0;
 fi

-if [ ! -e $PROGRAM ]; then
+if [ ! -e "$PROGRAM" ]; then
     echo "$PROGRAM not found."
     exit 1;
 fi

-if [ -n $CLASSPATH ]; then
+if [ -n "$CLASSPATH" ]; then
     CLASSPATH=`cygpath -p -w "$CLASSPATH"`
 fi

@@ -93,4 +93,4 @@
 esac

 echo CLASSPATH=$CLASSPATH CMD=$CMD PROGRMA=$PROGRAM ARGS=$ARGS
-exec $PROGRAM $ARGS
+exec "$PROGRAM" $ARGS

問題になりそうな箇所をダブルクオーテーションでくくっただけですね。java_wrapper と同ディレクトリに java_wrapper.patch として置いて「patch <java_wrapper.patch」で。っていうか、Java を「Program Files」にインストールしないほうがいいんじゃないかな。

追記

cygwin だと、gcj の吐くバイナリは標準ライブラリを全部静的にリンクしているらしい。

$ time gcj -c hello.java
gcj -c hello.java  0.17s user 0.23s system 63% cpu 0.631 total
$ time gcj --main=HelloWorld hello.o -o hello
gcj --main=HelloWorld hello.o -o hello  1.96s user 1.50s system 66% cpu 5.162 total
$ ll
合計 6290
-rwxr-xr-x 1 Gekko なし     422 Apr 12 09:05 HelloWorld.class*
-rwxr-xr-x 1 Gekko なし 6359834 Apr 12 20:24 hello.exe*
-rw-r--r-- 1 Gekko なし     107 Apr 12 08:04 hello.java
-rw-r--r-- 1 Gekko なし    5796 Apr 12 20:24 hello.o

コンパイルにかかる時間はたいしたことなく、オブジェクトファイルも大きくはない。リンクにとても時間がかかり、実行ファイルが超でかい。どうやらそういうことだそうで。

うすぼんやりと 2chのgcjスレ を眺めるに、UNIX系ならデフォルトで動的リンクの設定でコンパイルされるらしい。Cygwin でも静的リンクをやめて、動的リンクの方法もあるらしいけど、めんどうなのでしていない。

俺なんかはつい「ネイティブコードなんだから速いんじゃね?」と思ったりもするけども、そんな単純な話でもないらしいです。あろはさんも語ってましたけど、JVMさんもけっこうがんばりやさんらしいです。

http://www.shudo.net/article/Fedora-Core-Expert-200507-GCJ/

この辺の GCJ の記事を見るに、どっちかっていうと速度とかの面でも JDK には基本的には下から起っかけてる雰囲気なのかも。

h_sakuraih_sakurai 2007/04/12 12:46 gcjっておそいんだぁ。

hogeloghogelog 2007/04/12 20:50 自分でやってちょっとおどろきました。JVMってけっこうすごいらしいぞという噂こそ聞いてましたが、内心「所詮あのJVMでしょ?」と馬鹿にしてたのかもしれません。自分でやってみないと認識とはなかなか変わらんもんですね。

h_sakuraih_sakurai 2007/04/12 23:29 VMというかRuntimeライブラリがでかいんでしょうね。

hogeloghogelog 2007/04/14 02:59 HelloWorldのプログラムにランタイム全部ぶっこむのはナンセンスに思えますけど、実際に配布するような実用のプログラムとか考えるのなら、その方が良いのでしょうね。

トラックバック - http://d.hatena.ne.jp/hogelog/20070412

April 11(Wed), 2007 たぶんもうあるんだろうなどっかに

[][] なんか Javascript との対話環境でもつくってみようかと思った

http://konbu.s13.xrea.com/lib/js/terminal.html

たぶん俺以外のちゃんとした人が、ちゃんとしたの作ってるだろうなあと思いつつ勉強がてら、Javascriptとの対話環境づくりをしてみた。全然できてないできてない。

IMEとかを切らないとまったくピクリとも動かなかったりする。あとIEだとまったく動かない。べつにFirefoxでだって使えやしないけど。

もうね、event.keyCode の挙動がががががというかんじ。onkeydown だと取れて onkeypress だと取れなくて、onkeyup だけで取れる keyCode があったりなかったりで。keyCode が取れたと思ったら、いったいそれはどこの国のキーボード配列だみたいな文字を読み取ってくれたりして、なんでだろうなあ。別に 101-us でもない。

おとなしく textarea にスクリプト書いて、なんかボタンおすか、適当な組み合せのキーを押せば実行、とかの形態にすれば簡単なんだけど。あー、うんそっちが簡単だな。そうしよう。ていうかじゃないと無理だ。

以下適当なソース

続きを読む

トラックバック - http://d.hatena.ne.jp/hogelog/20070411

April 08(Sun), 2007 阿呆なCGIはほどほどに。

[][][][] ほげノート(5)

はて前回の更新部分、コメントで気付いたんですが .htaccess とか好きにできちゃう。

http://d.hatena.ne.jp/hogelog/comment?date=20070404#c

とりあえずは .htaccess のパーミッションを 404 にして対処しました。

さらに問題はそれだけでもなかった。page.cgiに直接アクセスすれば、「hoge<>」みたいな、普通にはアクセスできないファイルもつくれたり。

ここまできて「.htaccessにアクセスされたら困るからパーミッション変えておく」とか「変なファイル名がなあ」とかにいちいち対処するのではなく、そもそもデータファイルのファイル名を(encodeURI()でエスケープされない範囲では)利用者が好きに決められる仕組みがそもそも間違ってたのだ、と考えた。

タイトルの全部をエスケープすりゃいいかな、と思いそうしてみた。

http://konbu.s13.xrea.com/lib/ajax/page4/page.html

今回の更新にあたり、高度な JavaScript 技集の、UTF-8 , UTF16 変換ライブラリを参考にさせていただきました。

続きを読む

[][][] 全部の文字をUTF-8にエスケープする関数

charCodeAtはUTF-16BEを返すっぽい。ブラウザのURL欄に

javascript:alert("あ".charCodeAt(0).toString(16))

と入れてエンターを押すと、「3042」という数字が出ると思う。(Firefox2.0.0.3, IE6で確認しました)

ASCII文字だろうがなんだろうが、全部UTF-8にエスケープする関数を作ろうと思った。文字列を分割して、charCodeAtで変換すればいいだけかと思ったら、charCodeAtがUTF-16BEのコードを返すのでちょっと手を入れなければいけなかった。

function escapeUTF8(page_name){
	var escaped_name = String(), c;
	for(i=0;i<page_name.length;++i){
		c = page_name.charCodeAt(i);
		if ((c >= 0x0001) && (c <= 0x007F)) {
			escaped_name += "%"+c.toString(16);
		} else if (c > 0x07FF){
			escaped_name += "%"+(0xE0 | ((c >> 12) & 0x0F)).toString(16);
			escaped_name += "%"+(0x80 | ((c >> 6) & 0x3F)).toString(16);
			escaped_name += "%"+(0x80 | ((c >> 0) & 0x3F)).toString(16);
		} else {
			escaped_name += "%"+(0xC0 | ((c >> 6) & 0x1F)).toString(16);
			escaped_name += "%"+(0x80 | ((c >> 0) & 0x3F)).toString(16);
		}
	}
	return escaped_name;
}

ちなみに escapeUTF8 ではアルファベットは小文字。大文字にしたいのなら toUpperCase() にかければよい。

高度な JavaScript 技集UTF-8 , UTF16 変換ライブラリを参考にさせていただきました。多謝。

ちなみにデコードは decodeURI や decodeURIComponent で行なえる。ただしdecodeURIでは一部文字列(「&」、「,」、「/」など)がデコードされないのを確認済み。decodeURIComponentではASCII文字コード内の文字も全てデコードできた。

トラックバック - http://d.hatena.ne.jp/hogelog/20070408

April 06(Fri), 2007 つかいまわし

[][][] Javascriptでコネコネ

http://konbu.s13.xrea.com/lib/js/bf/bf.html

何回Brainをf*ckすれば気が済むのですかといったかんじですけど、またBrainfuckインタプリタつくってみた。俺の中では、HelloWorld!の次につくるものとインプットされてるのかもしれない。

なんか、DynamicHTMLでつくる、ブラウザ内で動く偽ウィンドウシステム的なものを妄想していて、でもアプリケーションがエディタだけじゃつまらんな、と。そんで、そういやJavascriptで作ってなかったな、と。とりあえずは動けばいいやと、ちょっと便利なC言語的な書き方した。もっとJavascriptらしく、オブジェクトオブジェクトした書き方もしてみよかなと思っている。

続きを読む

[][][] Stringオブジェクト

"hogehoge"[0]

が Firefox2.0.0.3 だと"h"、IE6 だと undefined だった。

"hogehoge".charAt(0)

ならどっちも"h"。

トラックバック - http://d.hatena.ne.jp/hogelog/20070406

April 04(Wed), 2007 Ajaxなオンラインメモ帳を作る

[][][] ほげほげノート(4)

http://konbu.s13.xrea.com/lib/ajax/page4/page.html

前進したかどうか怪しいけど。jQueryを使ってみた。

追加した機能はウィンドウ移動とウィンドウの最小化機能。この機能に意味は無い。

jQueryを使ったせいかなんなのか、Firefoxで非アクティブのタブで開いたとき、ページが読み込まれない問題は発生しなくなった。よくわからない。

参考ページはこのへん。

続きを読む

[][] 脆弱性あった。

風呂に入ってて、ふと気付いた。

#!/usr/bin/perl -w

use strict;
use CGI;

my $cgi = new CGI;

print $cgi->header(-type=>'text/plain', -charset=>'utf-8');
my $datadir = $cgi->param('datadir');
my $mode = $cgi->param('mode');
my $page_name = $cgi->param('page_name');
my $txtdata = $cgi->param('txtdata');

mkdir $datadir if(!(-e $datadir));
chdir $datadir;

if($mode eq 'save' && defined $page_name && defined $txtdata){
	open PAGE, ">$page_name";
	print PAGE $txtdata;
	close PAGE;
	print "saved.";
}
elsif($mode eq 'index'){
	opendir DIR, ".";
	for(readdir DIR){
		print "$_\n" if(-T $_ && $_ ne ".htaccess");
	}
	closedir DIR;
}

訪問者にサーバ開放しちゃうぞー、ってか。

Firebugを使って三分ハッキング。

f:id:hogelog:20070405011904p:image

いっけー、「Run」をクリック。

f:id:hogelog:20070405011902p:image

できました。なんとなく page.html から Firebug でやったけど、そうじゃなくとも

http://konbu.s13.xrea.com/lib/ajax/page4/page.cgi?mode=save&datadir=hoge&page_name=foo&txtdata=hogehoge

とかするだけでも、中身「hogehoge」のテキストを書ける。自明のことながら、例えばサイト全体を「米国政府は宇宙人に牛耳られている」とかいう主張をするサイトに書きかえることだってできる。気をつけましょう。

my $datadir = $cgi->param('datadir');

これはよくないですね。もうこうしちゃいましょう。

my $datadir = "data";

それだけじゃ駄目ですね。

my $page_name = $cgi->param('page_name');

この中身が "../../../../index.html"とかだったら困るんですから。

my $page_name = $cgi->param('page_name');
if(defined $page_name && (index $page_name, "/") >= 0){
	print "Boo.";
	exit;
}

ああ、あと一つ。僕思うわけですが、

print $cgi->header(-type=>'text/plain', -charset=>'utf-8');

より

print "Content-Type: text/plain; charset=utf-8\n\n";

のがわかりやすくないかなって。なので、修正版のpage.cgiは以下のように。

#!/usr/bin/perl -w

use strict;
use CGI;

my $cgi = new CGI;

print "Content-Type: text/plain; charset=utf-8\n\n";

my $datadir = "data";
my $mode = $cgi->param('mode');
my $page_name = $cgi->param('page_name');
if(defined $page_name && (index $page_name, "/") >= 0){
	print "Boo.";
	exit;
}
my $txtdata = $cgi->param('txtdata');

mkdir $datadir if(!(-e $datadir));
chdir $datadir;

if(!defined $mode){
	print "Bye.";
}
elsif($mode eq 'save' && defined $page_name && defined $txtdata){
	open PAGE, ">$page_name";
	print PAGE $txtdata;
	close PAGE;
	print "saved.";
}
elsif($mode eq 'index'){
	opendir DIR, ".";
	for(readdir DIR){
		print "$_\n" if(-T $_ && ($_ ne ".htaccess" and $_ ne ".htpasswd") != 0);
	}
	closedir DIR;
}

データディレクトリの中にphpファイルとか作られて遊ばれても困るね。.htaccessで。

Header set Pragma no-cache
Header set Cache-Control no-cache
SetHandler text/plain

として、全部プレーンテキストとして読まれるように。

他にも問題あるかもしれないけれども。本当、すさまじく間抜け。でもきっと、似たよなことやってる人は世の中けっこう多いんじゃないかなあとも思う。

この日記ページのプログラムはほぼ、 「恥ずかしいソースコードをアップロードしておくことで生産性アップ」*1手法でとりくんでる。でもCGIとかになると、他人に迷惑をかけかねないチキンレースじみたものになってこわいなあと思う。

kou21058kou21058 2007/04/07 09:17 .htaccessに書き込めちゃう気がします。

hogeloghogelog 2007/04/07 23:07 うわー、パーミッション変更するの忘れてました。
試したところ、確かに書き込めました。ありがとうございます。
あとアクセスできねーファイルもけっこう作れますね。
文字のエスケープもCGI側でやらにゃ意味無いですね。
「サニタイズ言うなキャンペーン」(http://takagi-hiromitsu.jp/diary/20051227.html#p02)
まわりの情報でも読み漁ってきま。

hogeloghogelog 2007/04/07 23:27 > パーミッション変更
「dataディレクトリ内に、パーミッション404 の .htaccess を設置」です。
あと.htpasswdも。

あと、xreaではCGIがnobodyではなく、各ユーザ権限で動くようす。
なので危なっかしいCGIを設置すると、とても危ないかも。

トラックバック - http://d.hatena.ne.jp/hogelog/20070404

April 03(Tue), 2007 まだメモ帳。

[][][] ほげほげノート(3)

http://konbu.s13.xrea.com/lib/ajax/page3/page.html

一歩前進。複数ページを扱えるようになった。textareaがちゃんと更新されないことがあった問題を解決。

IEとFirefoxの改行コードの違いで挙動が違ったのが、ふと気付けば同じ挙動になってた。理由がよくわからない。

続きを読む

hogeloghogelog 2007/04/05 02:29 脆弱性あり。
http://d.hatena.ne.jp/hogelog/20070404/p2
参照のこと

トラックバック - http://d.hatena.ne.jp/hogelog/20070403

April 02(Mon), 2007 めもちょうつづく。

[][][] ほげほげノート(2)

ちょいちょい改良(?)

http://konbu.s13.xrea.com/lib/ajax/tpage/page2.html

POSTデータのうけわたしをちゃんとするようにした。あとステータス表示部分追加。の後、なんか遊びで表示をメモ帳っぽくしてみた。

最初 XMLHttpRequest のPOSTデータが CGI.pm で受け取れなかった。「CGI.pm XMLHttpRequest」でぐぐったら、最初に出てきたページ(http://www.perlmonks.org/?node_id=588174)で、

xmlhttp.setRequestHeader(
    'Content-Type', 
    'application/x-www-form-urlencoded'
);

してみって書いてあったのでそうしたらちゃんと CGI.pm の param で、XMLHttpRequest のデータを受け取れた。「404 Not Found」あたりも参照。

page2.html

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="page2.css" media="screen" />
<title>
page
</title>
<script type="text/javascript"><!--
function HttpRequest(){
  if(window.ActiveXObject){
    try {
      return new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        return new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e2) {
        return null;
      }
    }
  } else if(window.XMLHttpRequest){
    return new XMLHttpRequest();
  } else {
    return null;
  }
}
function loadpage(){
  var page = "data2.txt";
  http = new HttpRequest();
  http.onreadystatechange = function(){
    if(http.readyState == 4){
      print("page", http.responseText);
      print_flush("status", "loaded.");
    } else {
      print("status", "Wait...");
    }
  };
  if(http){
    http.open("GET", page, true);
    http.send("");
  }
}
function savepage(page){
  var txtdata = document.getElementById("page").value;
  http = new HttpRequest();
  http.onreadystatechange = function(){
    if(http.readyState == 4){
      print_flush("status", "saved.");
    } else {
      print("status", "Wait...");
    }
  };
  if(http){
    http.open("POST", "savepage2.cgi", true);
    http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
    http.send("txtdata="+encodeURI(txtdata));
  }
}
function print(id, str){
  document.getElementById(id).innerHTML = str;
}
function print_flush(id, str){
  document.getElementById(id).innerHTML = str;
  window.setTimeout('document.getElementById("'+id+'").innerHTML = ""', 2000);
}
function editevent(event, tid){
  print("status", "text edited...");
  clearTimeout(tid);
  return window.setTimeout("savepage()",2000);
}
// -->
</script>
</head>
<body>
<table class="note">
<tr class="note_title">
<td>
<span class="title_title">
data2.txt - メモ帳
</span>
<span class="title_button">
<input type="submit" value="_">
<input type="submit" value="□">
<input type="submit" value="×">
</span>
</td>
</tr>
<tr class="note_menu"><td>
<span class="menu_item">ファイル(<u>F</u>)</span>
<span class="menu_item">編集(<u>E</u>)</span>
<span class="menu_item">検索(<u>S</u>)</span>
<span class="menu_item">表示(<u>V</u>)</span>
</td></tr>
<tr class="note_txt"><td>
<textarea id="page" rows="15" cols="80" onkeypress="tid=editevent(event, tid);"></textarea>
</td></tr>
<tr class="note_status"><td><span id="status"></span></td></tr>
</table>

<script type="text/javascript"><!--
var tid;
loadpage();
// -->
</script>
</body>
</html>

デザインのため変更は含むけど、それ意外だと変更部分はJavascriptのみ。

savepage2.cgi

#!/usr/bin/perl -w

use strict;
use CGI;

my $cgi = new CGI;

print $cgi->header(-type=>'text/plain', -charset=>'utf-8');

my $txtdata = $cgi->param('txtdata');

open PAGE, ">data2.txt";
print PAGE $txtdata;
close PAGE;
print "saved.";

hogeloghogelog 2007/04/05 02:35 脆弱性あり。
http://d.hatena.ne.jp/hogelog/20070404/p2
参照のこと

トラックバック - http://d.hatena.ne.jp/hogelog/20070402

April 01(Sun), 2007 めもちょう。

[][][] ほげほげノート

JavaScriptの参考になりそなサイト

「保存」キーとか無いノート http://konbu.s13.xrea.com/lib/ajax/tpage/page.html

Firefox、IEで確認。意外とそんなに難しくなかった。まず適当にいじってみんべ、との気持ちからprototype.jsみたいのは使わずにやった。

page.html

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="hoge.css" media="screen" />
<title>
page
</title>
<script type="text/javascript"><!--
function HttpRequest(){
  if(window.ActiveXObject){
    try {
      return new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        return new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e2) {
        return null;
      }
    }
  } else if(window.XMLHttpRequest){
    return new XMLHttpRequest();
  } else {
    return null;
  }
}
function loadpage(){
  var page = "data.txt";
  http = new HttpRequest();
  http.onreadystatechange = display("page");
  if(http){
    http.open("GET", page, true);
    http.send("");
  }
}
function savepage(page){
  var txt = document.getElementById("page").value;
  http = new HttpRequest();
  http.onreadystatechange = display("status");
  if(http){
    http.open("POST", "savepage.cgi", true);
    http.send(txt);
  }
  return true;
}
function display(id){
  return function(){
    if(http.readyState == 4){
      print(id, http.responseText);
    }
  }
}
function print(id, str){
  document.getElementById(id).innerHTML = str;
}
function save(event, tid){
  print("status", "Wait...");
  clearTimeout(tid);
  return window.setTimeout("savepage()",2000);
}
// -->
</script>
</head>
<body>
<script type="text/javascript"><!--
loadpage();
var tid;
// -->
</script>

<textarea id="page" rows="15" cols="80" onkeypress="tid=save(event, tid);"></textarea>
<p id="status"></p>
</body>
</html>

displayっていらない子かもしれないと思た。

savepage.cgi

#!/usr/bin/perl -w

use strict;

print "Content-Type: text/plain\n\n";
open PAGE, ">data.txt";
print PAGE $_ while(<>);
close PAGE;
print "saved.";

なにがまずい。そう、POST文字列のうけわたしが適当。エスケープってなにそれおいしいの? という。

そのへんかな、たぶん。

[][] JavascriptデバッガFirebug

Javascriptによるプログラムのデバッグというのは、なんというか霧の中を手探りで進むような感じがある。「なんかちゃんと動いてないけど、どこでエラーが発生してるのかもよわからん」ということが多い。

その状況を改善してくれるのがFirebug。これけっこうすごい。

XMLHttpRequestの通信内容もわかる。表示してるページのJavascript、HTML、CSSを編集して結果を即時見ることができる。

http://www.getfirebug.com/

console.log関数でFirebugコンソールにログ表示 http://www.h2o-ajax.com/article393.html

hogeloghogelog 2007/04/05 02:35 脆弱性あり。
http://d.hatena.ne.jp/hogelog/20070404/p2
参照のこと

トラックバック - http://d.hatena.ne.jp/hogelog/20070401
最近のコメント