ふぁんくしょん -3ページ目

amebloのシステムについて考える。

このblogシステムいろいろ不具合があるみたいなので、いろいろ気になって空想してみました。amebloの発表によるとランキングシステムが過負荷で1月は中止だとのことですが、ランキングは算出方法が分からないと負荷について語れないのでその他の面について書きます。

以下、勝手な妄想ですが書いてみます。
もしあっているなら雇ってください(笑)。


各記事のページが.htmlになっているけど動的に生成しているよね?
tDiaryというBlogシステムには同様の仕組みがあるのでそれをまねていると思います。下で触れますが、お気に入りの更新順が個別記事の.htmlページでも正確なので動的生成にしないと上手くいかないですよね?
.htmlとなっているファイルの方が検索エンジンに高く評価されるという迷信(?)があるのでそれに従っているのだと思います。


お気に入りに入れたページを更新順に並べて表示する仕組みは、上手く作らないと非常にコストがかかる
他の日記サイトではこの機能を導入してすぐにサーバーダウンが頻発したことがあります。もし、ページを動的に生成しているならその生成のたびに並び替えにnlognかかります。ランク上位のブログの人はこれでもかというほどお気に入りに登録していて(しかも、それなりにアクセスがある)ので結構大変です。もし静的だったとしても、誰かが記事を投げた瞬間その人をお気に入りに入れている人のすべての記事の該当部分を書き換える必要がありそうです。動的+キャッシュ等の技を駆使していないと難しいかも。


検索エンジンのロボット対策をすると良いかも
googleのやつとかはたいしたこと無いのですが、ある検索エンジンのロボットはほぼ同じ瞬間にあるサイトのすべてのページをに対してアクセスをかけます。これはページを取得してリンクを見てすぐにそこに飛んでいく(もしくは巡回先のリストをサイトのアドレス順に持っているため同一サイトのページは同じタイミングでリクエストされる)ためです。blogのようなサイトはページ数が他の種類のサイトと比べて異常な数になります。行儀の悪いロボットが何十万(?)というページへのリクエストをほぼ同時に出すのですからたまったものではありません。
そんなロボットからのリクエストには適当なページを返すようにするのはどうでしょうか?(もうやってるかな)

以上、第二回があるかどうか分からないですが、第一回でした。

J2SE5.0の新機能(9)Scanner

Formatted Input

以前は標準入力から値をとるのは大変でした。

BufferedReader
InputStreamReader
StringTokenizer
Integer.parseInt()

などなどを駆使して行う必要がありましたがJ2SE5.0でScannerクラスが追加されました。

Scanner s= new Scanner(System.in);
String param= s.next();
int value=s.nextInt();
s.close();

驚くほどきれいになりました。今までのあの苦労はなんだったんだ?という感じです。それでもC++の
cin >> param >> value;
には(コード量では)勝てませんが。

J2SE5.0の新機能(8)printf

Formatted Output

今までは文法の拡張の話ばかりでしたが、クラスライブラリ関連も扱って行きたいと思います。今回はprintfです。
C言語でおなじみのprintfがJavaのライブラリにも仲間入りしました。

System.out.printf("name count%n");
System.out.printf("%s %5d%n", user,total);

printfのAPIドキュメントを見ていただければ分かると思いますが、printfはformatというメソッドの別名です。C言語使いの人に分かりやすいように付けたのだと思われます。また、可変長な部分の引数がObject型になっていますがAutoboxingのおかげでintやdoubleも書けるというのも見逃せない点です(もともとC言語を使っていた人からすれば当然ですが)。2つの文法の拡張があってはじめてprintfが実現したんですね。

eclipseとCDTでC++を書く

eclipseと言えばJavaですが、eclipseではJavaしか書けない訳ではありません。

今日紹介するのはC++を書くためのプラグインCDTです。

http://download.eclipse.org/tools/cdt/releases/new/

ここでひとつ注意しておきたいのは、世の中でeclipseが支持されているのはeclipseのJava開発環境の完成度が高いためだと思います。他の言語を書くためのプラグインではそれらの便利な機能が実装されているとは限らないので、Javaを書くときほどeclipseが便利だと感じないかもしれません。それでも、CDTはフリーで入手できる開発環境としては良いものだと思います。

以前のバージョンのCDTはmakefileを自力で書く必要があったそうですが、最近のバージョンでは管理Makeプロジェクトというmakefileを書かなくても良いような方法が提供されています。

C++コンパイラ,make,gdbが必要ですのでWindowsならCygwinかMingwを使う必要がありそうです。自分はCygwinのものを使っています。

J2SE5.0の新機能(7)Static Import

Static Import

Staticなメソッドやフィールドを省略して書けるようになる。



Before

double val = Math.sin(10) + Math.cos(Math.PI);


After

import static java.lang.Math.*; // 冒頭(普段Import書くところ)で宣言。

double val = sin(10) + cos(PI);


java.lang.Mathクラスにはsinやlogなどの関数があります。以前はMath.sin(1.0)などと記述する必要がありましたが、Static Importを使えばStaticなメンバにクラス名を省略してアクセス出来るようになります。

J2SE5.0の新機能(6)拡張for文

Enhanced for Loop

一言で言えば、foreachです。
C#のforeachをforに換えてinを:に換えるだけです。

Before

ArrayList<Integer> list = new ArrayList<Integer>();
for (Iterator i = list.iterator(); i.hasNext();)
{
Integer value=(Integer)i.next();
...
}


After

ArrayList<Integer> list = new ArrayList<Integer>();
for (Integer i : list)
{
...
}

sunのページより引用。

これが無ければコードが書けなくなるわけではないですが、コードをシンプルに分かりやすく表現できるようになります。すべての要素にアクセスするときはこの拡張for文を使うのがお勧めです。

J2SE5.0の新機能(5)Generics

Generic Types
J2SE5.0の新機能の本命(?)のGenericsです。C++のテンプレートに相当する機能です。C#にも同様の機能が次期バージョンから搭載予定。

Before

ArrayList list = new ArrayList();
list.add(0, new Integer(42));
int total = ((Integer)list.get(0)).intValue();

After

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, new Integer(42));
int total = list.get(0).intValue();

(sunのページより引用。Autoboxingを使えばnew Integer(42)は単に42と書ける)

従来javaの標準ライブラリのコンテナは要素としてObject型の変数を取っていました。これだと、Integerしか入れないにもかかわらず、コンテナから取り出すときにキャストする必要がありました。これを解消するためにInteger専用のコンテナを作ろうとすると、扱いたい型が増えるたびにいくつも作らなければいけません。

良く考えれば、ArrayListにしろHashtableにしろアルゴリズムはデータの型に依存するものではないので、型を特定しない形でアルゴリズムだけ書いて色々な型で使いまわすのが賢い選択です。それを現状のObject型という形でなく実現するのがGenericsです。

J2SE5.0ではArrayListなど主要コンテナはGenericsを使って書かれているので、上の例のような書き方が可能になっています。上の例はGenericsで書かれたクラスを使う例ですが、Genericsを使ってクラスを設計する場合については別に書くかもしれません。これ以外にGenericなメソッドというのもあります。詳しくは以下を参照してください(英語)。

http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

[カブロボ]上手く動かず

少し前の話ですが練習ラウンドがありました。

現在何日目かという情報を元に処理を切り替える予定だったのですが、予期した通りに動作しませんでした。手元では動いていたので困りました。なんとか締め切りに間に合わせたいです。

追記[2004-12-17 07:42]
売買の履歴を見て切り替えるように変更しました。これで多分動くと思われます。というわけで、後は結果待ちということになります。結果が出るのが2月末なのでしばらくかかります。個人的にはその前に卒業論文が忙しいです。

フリーソフトリンク集

研究室の新しいWindowsマシンをセットアップする機会があったので、ついでに主要ソフトへのリンクを張る事にします。セットアップ時のメモを含みます。個別バージョンのページをはると内容が古くなるかもしれないので、JavaならJ2SE5.0のダウンロードページではなくsun.java.comみたいな方針で行きます。

アクセス前に
Firewallの確認をしてまずWindows Update。

普通に使うもの
Acrobat Reader
MSN Messenger
Lhaca
Terapad

Terapadはインストール後、ショートカットをC:Documents and Settingsユーザー名SendToに置くと右クリックの「送る」に出てくる。このときついでに、フォルダ表示関連(拡張子表示、隠しファイル表示)の設定もしておく。

プログラミング系
Java
Eclipse
.NET FrameworkはWindows Update時に入れておく。

論文を書く
TeX

パスワード管理
ID Manager

今後、セットアップが進むにつれてこのページは更新されていく見込みです。

J2SE5.0の新機能(4)可変長引数

Varargs(可変長引数)
	static void test1(String ... args)
	{
		for(int i = 0;i < args.length;i++)
		{
			System.out.println(args[i]);
		}
	}

	public static void main(String[] args)
	{
		test1("test","abcde","asdf");
	}

J2SE5.0では可変長引数がサポートされました。これまたC,C++,C#にはあってJavaには無かったものです。可変長引数は最後の引数として記述するする必要があるようです。これを利用してC言語ではおなじみのprintf(書式付出力)が標準ライブラリに追加されました。これについては別の機会に書きます。

JavaはC,C++から不要なものを取り去るというコンセプトでしたが、ここに来て機能を削りすぎたのを認めている感じですね。