Translate

2009年8月23日日曜日

読書。

読書の夏ですね。
というわけで、『はじめてのAIプログラミング』を読んでるわけなんですが
n-gramによるテキスト処理の説明があったのでコードを書いてみた。

Ngram.pm
package Ngram;
use strict;
use warnings;
use utf8;
use base qw(Class::Accessor::Fast);
__PACKAGE__->mk_accessors(qw(n str));
our $VERSION = '0.01';
use Encode;
sub d{decode('utf8', shift)};
sub e{encode('utf8', shift)};

sub make{
my $self = shift;
my @error;
$self->{n} = $self->{n} || 3;
$self->{str} = $self->{str} || push @error, "文字列を与えてください。";
push @error, "数字を指定して下さい。" if($self->{n} !~ m/^\d+$/);
die join("\n", @error) if(@error);


$self->{str} =~ s/\n//g;
$self->{str} =~ s/\s//g;
my @list = split(//, $self->{str});

die e("文字数が足りません!\n".
$self->{n}. "文字以上でお願いします") if($self->{n} > @list);
my $keyword = '$list[$i]';
if($self->{n} > 1){
for (1..$self->{n}-1){$keyword .= '.$list[$i+'. $_. ']'};
}

for my $i (0..@list-$self->{n}){
$self->{analyze}{eval($keyword)}++;
}
}

sub say{
my $self = shift;
for my $key (sort { $self->{analyze}{$b} <=> $self->{analyze}{$a} } keys %{$self->{analyze}}){
print e($key), ":", $self->{analyze}{$key}, "\n";
}
}

1;



#!/usr/bin/perl;                                                                                                 
use strict;
use warnings;
use utf8;
use lib qw(./lib);
use Ngram;

my $ngram = Ngram->new({
n=>2,
str=>"abcbacbcbabcabcabbcabcbabcabacbabcbcabcabbcabcabacb"
});
$ngram->make;
$ngram->say;



n=1なら
b:21
c:15
a:15

n=2なら
ab:12
bc:12
ca:8
cb:7
ba:6
ac:3
bb:2

n=3なら
bca:8
abc:8
cab:8
cba:4
bcb:4
bab:3
acb:3
bac:3
abb:2
bbc:2
aba:2
cbc:2

まずはここまで。。

hashのソート。

めもめも。
ハッシュのkeyでソートする場合とvalueでソートする場合。

・keyでソートする場合
#/!us/bin/perl                                                                                                  
use strict;
use warnings;
use utf8;

#適当な値を用意しておく
my %hash = (
bri => 48, sdu => 57, mff => 96,
egt => 61, nem => 3, vik => 65,
mrq => 22, mph => 54, wbj => 44,
mgl => 27,
);

print "key sort\n";
for my $key (sort keys %hash){
print $key, ":", $hash{$key}, "\n";
}

実行結果
key sort
bri:48
egt:61
mff:96
mgl:27
mph:54
mrq:22
nem:3
sdu:57
vik:65
wbj:44

・valueでソートする場合
#/!us/bin/perl                                                                                                  
use strict;
use warnings;
use utf8;

#適当な値を用意しておく
my %hash = (
bri => 48, sdu => 57, mff => 96,
egt => 61, nem => 3, vik => 65,
mrq => 22, mph => 54, wbj => 44,
mgl => 27,
);
print "value sort\n";
for my $key (sort{$hash{$a} <=> $hash{$b}} keys %hash){
print $key, ":", $hash{$key}, "\n";
}

実行結果
value sort
nem:3
mrq:22
mgl:27
wbj:44
bri:48
mph:54
sdu:57
egt:61
vik:65
mff:96

2009年8月14日金曜日

こんにちはこんにちは

javaにちょっとだけ、入門してみる。

public class Hello {
public static void main(String[] args){
System.out.println("こんにちはこんにちは!!");
}
}


Hello.java で保存。
javac Hello.javaでコンパイル。
java Hello で実行っと。

文字化けするなら
jjavac -J-Dfile.encoding=UTF-8 Hello.java
java -Dfile.encoding=UTF-8 Hello
のようにするとよい。



1行目:public class Hello{
・Helloというクラスの宣言
・class名の前にpublicと書いた場合そのclass名+.javaになる
・上記のことより、publicと書かれたclass名は1つのファイルに一つのみ。
・class名の大文字小文字の区別はされるのでファイル名と統一すること。
おkおk。


2行目:public static void main(String[] args){
・mainメソッドが開始位置。
おkおk。


3行目:System.out.println("こんにちはこんにちは!!");
・printlnは最後に改行を挟む。
・標準出力をする。
おkおk。


なお、1行目・2行目に出てきたアクセス修飾子(ここではpublic)は、
private、指定なし、protected、publicの4つがあり

private指定なしprotectedpublic
同じクラス
同じパッケージ内のサブクラス×
同じパッケージ内の非サブクラス××
他のパッケージのサブクラス××
他のパッケージ内の非サブクラス×××

※サブクラスは継承先のクラス。

◇クラスの定義は
[アクセス修飾子] class [クラス名] extends [継承元クラス名]{
クラスの中身(メソッドがずらずらと並ぶ)
}


◇メソッドの定義は、
[アクセス修飾子] [戻り値の型] [メソッド名] ([引数の型1] [引数の名前1], …){
処理
return 戻り値
}

ちなみに、
おはよう。
こんにちわ。
こんばんわ。
の3行を表示させるなら

改行(¥n)をつかって。
public class Hello {
public static void main(String[] args){
System.out.println("おはよう。¥nこんにちわ。¥nこんばんわ。");
}
}

となるっと。

■型(よく使うもの)
long (数字L)
int
double
boolean
char(1文字、シングルクォーテーションで囲う)
String(ダブルクォーテーションで囲う。大文字であることに注意)

■配列
型[] 変数 = new 型[要素数]
型[] 変数 = new 型[]{値1, 値2, 値3}
型[] 変数 = {値1, 値2, 値3}

■多次元配列
型[][] 変数 = new 型[行数][列数]
型[][] 変数 = {{値1, 値2, 値3}, {値4, 値5, 値6}, {値7, 値8, 値9}};

■拡張for文
for(型 変数名 : 配列変数){}


■名前空間(package)
Classa.java

package hogehoge;
import barfoo.Class2;

public class Class1{
public static void main(String[] args){
Class2.funk2();
}
}

Class2.java
public class Class2{
public static void funk2(){

}
}

■標準入力からデータを受け取る
BufferedReader 変数名1 = new BufferedReader(new InputStreamReader(System.in));
String 変数名2 = 変数名1.readLine();

2009年8月12日水曜日

SQLのメモ

◇テーブルへデータを登録 その1
INSERT INTO [table_name] VALUES (val1, val2, …);
・最初の列から順に登録。値は省略できない。
・途中の列で登録したいデータがない時はNullを指定。


◇テーブルへデータを登録 その2
INSERT INTO [table_name] (col1, col2, …) VALUES ( val1, val2, …);
・必要な列と値だけ登録する。


◇テーブルへデータを登録 その3
INSERT INTO [table_name] SET col1 = valu1, col2 = valu2, …;


◇データを更新
UPDATE [table_name] SET col1=val1, col2=val2, … WHERE 条件;
・例えば、掲示板とかブログで条件にIDでひっかけて内容を更新とか。
・条件については、後述。


◇データを削除
DELETE FROM [table_name] WHERE 条件;
・条件については、後述。


◇検索
SELECT col1, col2, … FROM [table_name] 条件;
・重複排除(DISTINCT)
 SELECT DISTINCT col1, col2, … FROM [table_name] 条件;

・並び替え(ORDER BY)
 SELECT col1, col2, … FROM [table_name] ORDER BY [ソートの基準となる列] [ASC/DESC];
  ASC-昇順 / DESC-降順
  ・ORDER BY RAND()でランダムに並び替えを行う。


◇条件
WHERE 列名 演算子 値
・演算子
  a=b aとbが等しい
  a<>b aとbが等しくない
  a<b aがbより小さい
  a>b aがbより大きい
  a<=b aがb以下
  a>=b aがb以上

WHERE 列名 LIKE 条件;
・部分一致
  _ 任意の1文字
  % 任意の文字列(0文字を含む)
  
  (例)WHERE program LIKE 'java%';
   これでjavaもjavascriptもひっかかるわけですね。
   参考⇒文字列の比較 likeとワイルドカード

プレースホルダー確認めも。

◇doメソッドの場合
$dbh->do("SQL文", undef, 値);

◇prepareメソッドの場合
my $sth = $dbh->prepare("SQL文");
$sth->execute(値);

それぞれのSQL文で使用したプレースホルダに該当する数の
値をdoメソッドなら第3引数以降に。executeなら第1引数に。

という感じか?

SQLインジェクション

プレースホルダって、SQL文を何度も発行するのを省く為の物
って認識があったけど、クォート文字、バックスラッシュ、
nullバイトのような特殊文字のエスケープをしてくれるのね。
つまり、SQLインジェクション対策にもなっていると。
だから、どんなに簡単な命令でも使っておけってわけか。
なるへそ。

2009年8月11日火曜日

MySQLの設定ファイル検索順(5.0/5.1)のメモ

1./etc/my.cnf
  (/etc/mysql/my.cnf 5.1.15-beta以上で有効??)
2.$MYSQL_HOME環境変数に指定されたディレクトリ/my.cnf
3.--defaults-extra-fileオプションに指定されたファイル
4.$HOME/my.cnf
5.DEFAULT_SYSCONFDIR/my.cnf
(./configure --sysconfdir= 
で指定されたディレクトリ。5.0.21以上で有効らしい。)


その他のめも。
my.cnf の記述ルール。
マイナス(-)をアンダースコア(_)にしても認識可。
#・・・コメント行
;・・・コメント行
[group]・・・次のグループ宣言までこのグループのオプション扱い。
!include・・・追加で読込むファイルを指定
!includedir・・指定したディレクトリ以下のファイルを追加設定ファイルとして読込む