プロフィール

島田圭二

Author:島田圭二
Follow shimanp on Twitter

カレンダー
06 | 2017/07 | 08
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
読断と変見内検索
訪問ありがとうございます
最近のコメント
最近のトラックバック
関連リンク
カテゴリー
月別アーカイブ


スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


スポンサー広告 | 【--------(--) --:--:--】 | Trackback(-) | Comments(-)
右のテーブルの行を左のテーブルにコピーする - javascript
javascriptで右のテーブルの行のデータをコピーして左のテーブルにコピーするのを
やってみた。たいして難しいことはしてないけど忘れるのでメモ。

とりあえずサンプル
firefox3.X、IE6では動くはず。
ちなみに動かすとわかるけど、同じカナのものはひとつしか追加できないよう
重複チェックしてる。

ソース

<html>
<head><title>scrolltest</title>
<style>
</style>
<script language="javascript">
function addRow() {
var rTable= document.getElementById('rightTable');
var lBody= document.getElementById('leftBody');
var rChecks = document.getElementsByName('example');
var chkCnt = rChecks.length;
for(var i = 0; i < chkCnt; i++){
chk = rChecks[i];
if(chk.checked){
var wamei = rTable.rows[i].cells[1];
if(chkUniqueLeftTable(wamei.innerHTML)){
var lang = rTable.rows[i].cells[2];
var tr = document.createElement('tr');
var delTd = document.createElement('td');
var delBtn = document.createElement('input');
delBtn.type="button";
delBtn.value="削除";
delBtn.onclick=function(){return delRow(this)};
delTd.appendChild(delBtn);
delTd.style.width = 50;
tr.appendChild(delTd);

var waTd = document.createElement('td');
waTd.style.width = 150;
waTd.innerHTML = wamei.innerHTML;
waTd.name = "wamei";
tr.appendChild(waTd);

var langTd = document.createElement('td');
langTd.style.width = 100;
langTd.innerHTML = lang.innerHTML;
tr.appendChild(langTd);

lBody.appendChild(tr);

}
}
}
}

function delRow(e){
var tr = e.parentNode.parentNode;
var tbod = tr.parentNode;
tbod.deleteRow(tr.sectionRowIndex);
}

function chkUniqueLeftTable(wamei){
var lTable= document.getElementById('leftTable');
var tcnt = lTable.rows.length;
for(var j = 0; j < tcnt; j++){
var waTd = lTable.rows[j].cells[1];
var wa = waTd.innerHTML;
if(wamei == wa){
return false;
}
}
return true;
}
</script>
</head>
<body>
<table>
<tr>
<td>
<table border="1" cellpadding="4" cellspacing="0" style="border-bottom-width:0px">
<th width="50"> </th>
<th width="150" align="center">カナ</th>
<th width="100" align="center">英語</th>
</table>
<div style="width:350px;height:158px;overflow-x:hidden;overflow-y:scroll;">
<table id="leftTable" border="1" cellpadding="4" cellspacing="0">
<tbody id="leftBody">
</tbody>
</table>
</div>
</td>
<td>
<input type="button" value="<<追加" onclick="addRow()"><br>
</td>
<td>
<table border="1" cellpadding="4" cellspacing="0" style="border-bottom-width:0px">
<th width="30"> </th>
<th width="150" align="center">カナ</th>
<th width="100" align="center">英語</th>
</table>
<div style="width:330px;height:158px;overflow-x:hidden;overflow-y:scroll;">
<table id="rightTable" border="1" cellpadding="4" cellspacing="0">
<tbody id="rightBody">
<tr>
<td width="30"><input type="checkbox" name="example" ></td>
<td width="150">ゼロ</td>
;<td width="100">zero</td>
</tr>
<tr>
<td><input type="checkbox" name="example" ></td>
<td>イチ</td>
<td>one</td>
</tr>
<tr>
<td><input type="checkbox" name="example" ></td>
<td>二</td>
<td>two</td>
</tr>
<tr>
<td><input type="checkbox" name="example" ></td>
<td>サン</td>
<td>three</td>
</tr>
<tr>
<td><input type="checkbox" name="example" ></td>
<td>シ</td>
<td>four</td>
</tr>
<tr>
<td><input type="checkbox" name="example" ></td>
<td>ゴ</td>
<td>five</td>
</tr>
<tr>
<td><input type="checkbox" name="example" ></td>
<td>ロク</td>
<td>six</td>
</tr>
<tr>
<td><input type="checkbox" name="example" ></td>
<td>ナナ</td>
<td>seven</td>
</tr>
<tr>
<td><input type="checkbox" name="example" ></td>
<td>ハチ</td>
<td>eight</td>
</tr>
<tr>
<td><input type="checkbox" name="example" ></td>
<td>キュウ</td>
<td>nine</td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
</table>
</body>
</html>



javascript | 【2009-07-28(Tue) 23:25:08】 | Trackback:(0) | Comments:(0)
設定メモ - Apache2.2とPerl5.10でCGI - WindowsXP

Apacheインストール


http://httpd.apache.org/download.cgi
上記よりダウンロードして、インストール。基本次へ連打。

Perlインストール


http://strawberryperl.com/
上記よりダウンロードしてインストール。基本次へ連打。
これでインストールすると、Perlだけでなく、gccの環境やdmakeも入るらしい。

CGIの設定


はじめ、Apacheのmod_perlを使おうと思っていたのだが、Perl5.10は対応していないようなので、
CGIにした。

1.一番簡単な方法
httpd.confを開いて
ScriptAlias /cgi-bin/ "C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/"
とCGIのディレクトリを指定すれば、
「C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/」に置かれたファイルは、
CGIと認識され実行される。
ブラウザからは
http://localhost/cgi-bin/ファイル名
で実行できる。

2.任意のフォルダでCGIを実行する場合
1)UserDirのモジュールを読み込む
httpd.confを開いて、
LoadModule userdir_module modules/mod_userdir.so
のコメントをはずす
Include conf/extra/httpd-userdir.conf
のコメントをはずす

2)UserDirの設定
Apacheホーム/conf/extra/httpd-userdir.confを開いて、
UserDir "C:/src/perl/*/web"

<Directory "C:/src/perl/*/web">
AllowOverride All
Options ExecCGI Indexes FollowSymLinks
Order allow,deny
Allow from all
</Directory>
と設定する。
この設定をした後、C:/src/perl/fooとディレクトリを作成して、
さらにC:/src/perl/foo/webを作成すれば、
ブラウザからhttp://localhost/~fooでアクセスすると、C:/src/perl/foo/web以下が参照される。

3)CGIの拡張子の設定
どのファイルの場合CGIとして実行するのかの設定を行う
httpd.confを開いて、
AddHandler cgi-script .cgi
のコメントをはずす。
拡張子を増やしたい場合は以下のように半角スペースを空けて指定する
AddHandler cgi-script .cgi .pl


終わり

apache | 【2009-06-14(Sun) 13:18:39】 | Trackback:(0) | Comments:(0)
書評 - 600万人の女性に支持されるクックパッドというビジネス
600万人の女性に支持されるクックパッドというビジネス (角川SSC新書)僕は今のインターネットビジネスの一番のポイントは、
いかにリアルと結びつけることができるかだと思っている。
結局今の人間はリアルでしか生きることはできないので、
ネットはリアルを充実させるための手段でしかない。
この手段を徹底的に利用し、リアルを充実させようとしているのが、
クックパッドである。

クックパッドは、ユーザが料理のレシピを載せることができ、
そのレシピを検索できるっていう単純サイトだけど、
個人的にクックパッドほどネットとリアルを結び付けてるサイトはないのではないかと思う。

最近読んだビジネス書では一番面白かった。
WEBでビジネスをやりたいと思っている人にはオススメの一冊。

cookpad.logo


書評 | 【2009-06-04(Thu) 01:30:39】 | Trackback:(0) | Comments:(0)
php5.2インストールメモ - windowsXP
ハードディスクを変えてOSを入れ替えたので再度PHPをインストールする。
以下設定メモ。

PHPをダウンロード


http://www.php.net/downloads.phpを開く
Image5.jpg
Windows BinariesのPHP 5.2.9-2 zip packageをクリックすると以下が開く
Image4.jpg
jp.php.netをクリックしてダウンロード

PHPをインストール


ダウンロードしたZIPを入れたいディレクトリに解凍しておしまい。

ApacheにPHPのモジュールを追加


ApacheにPHPを実行させるためにhttpd.confにPHPのモジュールを設定する。

1.httpd.confを開く
Apacheをインストールしたディレクトリのconfのhttpd.conを開く

2.LoadModuleの最後にPHPのモジュールを追加
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need
# to be loaded here.
#
# Example:
# LoadModule foo_module modules/mod_foo.so
#
LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
LoadModule asis_module modules/mod_asis.so
LoadModule auth_basic_module modules/mod_auth_basic.so

上記のような記述があるので、最後あたりに以下を追加
LoadModule php5_module c:/bin/php/php5apache2_2.dll

「c:/bin/php」の部分はPHPをインストールしたディレクトリを指定する。
またApacheのバージョンが2.0の場合は「php5apache2.dll」を指定する。

ApacheにPHPファイルを認識させるために拡張子を登録する


Apacheにこの拡張子はPHPのファイルですよ、と認識させるために拡張子を登録する
1.httpd.confを開く

2.AddTypeの最後にPHPの拡張子を追加
# AddType allows you to add to or override the MIME configuration
# file specified in TypesConfig for specific file types.
#
#AddType application/x-gzip .tgz
#
# AddEncoding allows you to have certain browsers uncompress
# information on the fly. Note: Not all browsers support this.
#
#AddEncoding x-compress .Z
#AddEncoding x-gzip .gz .tgz
#
# If the AddEncoding directives above are commented-out, then you
# probably should define those extensions to indicate media types:
#
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz

AddTypeで検索すると上記のような部分があるので以下を追加
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

2行目のx-httpd-php-sourceの設定はphpのソースとしてブラウザに表示するための設定。
上記の場合だと拡張子がphpsのファイルの場合は中身がそのままブラウザに表示される。
表示する必要がない場合は設定する必要はない。

PHPの設定ファイル、php.iniを作成


PHPをインストールしたホームディレクトリ直下に、「php.ini-dist」というファイルがあるので、
これを「php.ini」に名前を変更する。終わり。

PHPのiniファイルをApacheに認識させる


PHPの設定ファイルphp.iniファイルをApacheに認識させる設定を行う。

httpd.confを開いて、先ほど追加したLoadModuleの後あたりに以下を追加
PHPIniDir "c:/bin/php"

c:/bin/phpの部分はPHPをインストールしたディレクトリ

とりあえず、ここまでの設定で一応ApacheからPHPを実行することができる
以下からは個別設定

php.iniの設定変更


1.グローバル変数の自動生成をオフにする
register_globalsを探ししてオフになっていなければ
register_globals = Off
にする
オンになっているとフォームの値を、$フォーム名で取得できるため楽だけど、セキュリティ的に
よくないらしいのでオフにする

2.フォームの値の自動変換をオフにする
magic_quotes_gpcを探しオンになっていたら、
magic_quotes_gpc = Off
にする
オンになっているとフォームから取得したデータに「'」「"」などがあると
勝手に「\'」「\"」に変換してしまう

3.拡張モジュールの追加
文字列を扱う関数のモジュールを使用するため拡張モジュールを追加する
まず、拡張するモジュールがおいてあるディレクトリを指定する
extension_dir = "./"
extension_dir = "C:/bin/php/ext"
に変更する
:extension=php_mbstring.dll
のコメントアウトをはずすして
extension=php_mbstring.dll
に変更する。

PEARライブラリインストール


PHPの定番的なライブラリPEARをインストールする。
1.go-pear.batを実行する
PHPホーム直下にあるgo-pear.batをEnterで実行する
pear_install_1.jpg
何も入力せずEnter
pear_install_2.jpg
何も入力せずEnter
pear_install_3.jpg
PEARを使用できるように、php.iniを自動で書き換えていいかどうかなので、Yを入力しEnter
pear_install_4.jpg
何も入力せずEnter
pear_install_5.jpg
何も入力せずEnter

2.PEARを環境変数に登録
PHPホーム直下に作成された「PEAR_ENV.reg」をダブルクリックして実行する

以上でPHPのインストール完了
以下動作確認

ApacheからPHPを実行できるか確認


以下のファイルを作成
<html>
<head<>title>PHP TEST</title<>/head>
<body>
<?php phpinfo(); ?>
</body>
</html>

ファイル名はphpinfo.phpとかにしてApacheのドキュメントルートに置く
で「http://localhost/phpinfo.php」をブラウザから開く。
以下が表示されれば成功
php_comfirm.jpg

PEARがインストールされているか確認


1.PEARの情報を表示するライブラリをインストール
デフォルトでphpinfoみたいなものがインストールされていないので別途インストール
コマンドプロンプトを起動して、PHPのホームディレクトリにカレントを移動する。
pear install pear_info
と入力してEnter。
エラーが出た場合は環境変数の設定がおかしいと思われるのでPEARの環境変数を修正する

2.ブラウザからPEAR情報を確認
以下のファイルを作成
<?php
require_once "PEAR/Info.php";

$info =& new PEAR_Info();
$info->show();
?>

ファイル名はpearinfo.phpとかにしてApacheのドキュメントルートに置く
で「http://localhost/pearinfo.php」をブラウザから開く。
以下が表示されれば成功
pear_info.jpg

以上で動作確認終了

php | 【2009-05-04(Mon) 16:42:30】 | Trackback:(0) | Comments:(1)
アルゴリズム - クイックソート - 再帰編
数字などを並び替えするアルゴリズムにクイックソートがある。
とても効率的でソートアルゴリズムの中でもトップクラスに早いらしいけど、
完全に理解していなかったので、wikiを見ながら勉強してみた。

とりあえず、wiki通りにJAVAで書いてみた

public class QuickSort {

public static void main(String[] args) {
int[] a = {8,4,3,7,6,5,2,1};
QuickSort q = new QuickSort();
q.sort(a, 0, a.length - 1);
for (int k = 0, len = a.length; k < len; k++) {
System.out.print(k == 0 ? a[k] : "," + a[k]);
}
}

public void sort(int a[], int left, int right) {
if (left < right) {
int p = a[(left+right)/2]; //中央を軸とする
int l = left - 1;
int r = right + 1;
int t;
while (true) {
while (a[++l] < p); //軸より大きい値を左から探す
while (a[--r] > p); //軸より小さい値を右から探す
if (l >= r)break;
t = a[l]; //左と右の値を入れ替える。
a[l] = a[r];
a[r] = t;
}
sort(a, left, l - 1);
sort(a, r + 1, right);
}
}
}

wikiにも説明があるけど、自分なりに説明してみる。


①軸を決める
配列の中から、一つ適当に軸となる値を選ぶ。
プログラムで言うと
int p = a[(left+right)/2];

*軸は配列内の中央に位置しているものがベスト

②左から順に軸より大きい値を探す
プログラムで言うと
while (a[++l] < p);

の箇所whileで左から順に軸より大きい数を探し、あったら、ループ終了。

③右から順に軸より小さい値を探す
プログラムで言うと
while (a[--r] > p);

の箇所whileで右から順に軸より小さい数を探し、あったら、ループ終了。

④値入れ替え
②で見つけた値と③で見つけた値の位置を入れ替える。
プログラムで言うと
t = a[l];      
a[l] = a[r];
a[r] = t;

この入れ替えを繰り返すことで、左側は軸より小さい値となり
右側は軸より大きい値となる。

ただし、lの値がrの値以上となるとループを抜ける
プログラムで言うと
if (l >= r)break;


⑤左側の部分を再帰的にソート
軸より小さな左側の部分を再帰的にソートする
プログラムで言うと
sort(a, left, l - 1);


⑥右側の部分を再帰的にソート
軸より大きな右側の部分を再帰的にソートする
プログラムで言うと
sort(a, r + 1, right);


具体的な流れ


初期データ:{8,4,3,7,6,5,2,1}
1.軸を決める
一番始めの軸は、(0+7)/2=3.5→intなので3
で配列は0から始まるので、3の要素は「7」となる。
よって軸は「7」となる
8,4,3,7,6,5,2,1


2.左から順に軸より大きい値を探す
   8,4,3,7,6,5,2,1
→ l

8が軸の7より大きい

3.右から順に軸より小さい値を探す
  8,4,3,7,6,5,2,1
r ←

1が7より小さい

4.値入れ替え
lの値(0)はrの値(7)より小さいので、
2で見つけた8と3で見つけた1を入れ替える
1,4,3,7,6,5,2,8


5.再度左右から値を探し、入れ替え・・・を繰り返す。
lの値がrの値より小さいので、再度左から軸より大きい値、
右から軸より小さい値を探す。
  1,4,3,7,6,5,2,8
→ l
r ←

左から探した大きい値は7(軸と同じ)、
右から探した小さい値は2となる。

7と2を入れ替える
1,4,3,2,6,5,7,8


まだlの値がrの値より小さいので、再度左から軸より大きい値、
右から軸より小さい値を探す。
  1,4,3,2,6,5,7,8
→ l
r ←

左から探した大きい値は7(軸と同じ)、
右から探した小さい値は5となる。
しかし、lの値がrの値以上となってしまったため、ループは終了。

6.左側の部分を再帰的にクイックソート
左側の部分は[1,4,3,2,6,5]となる
プログラムで言うとleftからl-1ということになる。
leftは0でl-1は5となるので、0~5の配列要素が対象となる。

  左側部分  | 右側部分
1,4,3,2,6,5 | 7,8


で、左側の部分をまた1.に戻って、ソートを行う。

7.右側の部分を再帰的にクイックソート
右側の部分は[7,8]となる
プログラムで言うとr+1からrightということになる。
r+1は6でrightは7となるので、7~8の配列要素が対象となる。

  左側部分  | 右側部分
1,4,3,2,6,5 | 7,8


で、右側の部分をまた1.に戻って、ソートを行う。

以上説明終了。
てかクイックソートは説明が難しいな・・・


アルゴリズム | 【2009-03-08(Sun) 15:59:32】 | Trackback:(0) | Comments:(0)
プログラマーとしての僕をレベルアップさせた一言
時として、ある一言が人を変えてしまうことがある。
少し大げさだけど、プログラマーとしての僕を1段レベルアップさせた言葉がある。

あれは確か3年前の夏ころだった。
プログラマ2年目であまりプログラムをさせてもらえずテストばかりさせられていた。
あるとき凄腕プログラマーの方が作ったプログラムをテストしていた。
その方に「僕にはこれを作れる気がしないっすよ」と言ったら、
その方がこうおっしゃった。

「ようはデータ構造なんですよ」

これを聞いたとき頭を真上から打ち抜かれたような衝撃が走った。
たぶん他の人が聞いても「あたりまえじゃね?」程度だと思うが
言葉というのは、内容もさることながら、タイミングも重要だ。
僕の場合、これしかないというタイミングでこの言葉を言われた。

結局プログラムでやることはデータを受け取って(入力)、そのデータを処理して(処理)、
処理結果のデータを出力する(出力)、の3つだ。
そう全てのプログラムの目的はデータなのだ。
あるデータが欲しいから人はせこせこと体を壊してまでプログラムを作る。
そしてデータはデータ構造によって、保持、管理される。
つまり、「ようはデータ構造」なのである。

開発 | 【2009-02-16(Mon) 00:53:15】 | Trackback:(0) | Comments:(0)
書評 - 人類は「宗教」に勝てるか
人類は「宗教」に勝てるか―一神教文明の終焉 (NHKブックス)長年宗教に関わってきた著者の、宗教に対する憂えが
とても伝わってきたが、個人的には期待はずれの一冊。

本書では宗教の実情などを紹介している。
確かに著者にしか書けないことが満載で面白かったが、
僕が期待していたのは、もっと宗教の核心に迫るようなことだ。
例えば「なぜ人は宗教を信仰するのか?」などについて、
著者の考えを聞きたかった。
というかそこを知らずして「宗教」に勝てないのでは?と思うのだが。

本書は僕のような無宗教の日本人が読むより、
宗教を信仰している人にこそ読んで欲しいが、
信仰している人は読まないだろうな。。。



書評 | 【2009-02-15(Sun) 12:20:31】 | Trackback:(0) | Comments:(0)
vi設定メモ
たいした設定してないけど、忘れるのでメモ
vimrc
" 行番号表示
set nu
"バックアップとらない
set nobk
"クリップボード
set clipboard=unnamed
"タブ数
set tabstop=4
"タブをスペースにする
set expandtab
"自動インデント時の空白の数
set shiftwidth=4
"tabキーを押したときの空白の数
set softtabstop=0
"改行時に自動インデントを行う
set smartindent
"インクリメントサーチを行う
set incsearch

gvimrc
"背景 カラー設定:
colorscheme darkblue
"横スクロール
set guioptions+=b
"ラップしない
set nowrap


vi | 【2009-02-10(Tue) 12:00:29】 | Trackback:(0) | Comments:(0)
ソフトウェア工学の属人性の排除は間違っているのか?
従来のソフトウェア工学が決定的に間違っている点 - kwatchの日記
従来のソフトウェア工学は、属人性を排除して開発者の能力を均一化しようとしている。この点に置いて、従来のソフトウェア工学は決定的に間違っている。

僕の考えの結論を始めに言っておく。


ずばり、属人性の排除は間違っていない、である。

なんで間違ってない?


そもそも、学問というのは、ある目的を達成するために、知識を体系化していって、
誰が見ても分かるようにしていく、ものだと僕は考えている。
つまり、前提条件からして属人性排除が備わっているのだ。
例えば、1+1は3進以上は2である。これをある人は3である人が100と言い出したら
学問は成り立たない。誰が見ても1+1は2なのである。
ソフトウェア工学も同じである。ソフトウェア工学はソフトウェアを開発するために、
開発の手順や、運用の方法、人事の配置・・・などなどを体系化していくものだ。
属人性を排除し、体系化することにより、誰が見ても同じという共通認識が持て、
開発効率がよくなるのである。

ここで一つ言っておきたいことがある。
属人性を排除するからといって、能力は均一化しない
これはイコールではない。むしろ、属人性を排除して体系化することにより、
お互いの知識を共有することができ、お互いの能力は上がると僕は思っている。

確かにプログラマーは作業効率に差がつきやすい職業ではある。
でも差がつくところの多くは技術力ではなく、作業の進め方やモチベーション管理であることのほうが
多いと思う。確かに高度の技術になればなるほど、技術差と作業効率の関連性は強くなる。
しかし、実際高度な技術を用したシステムというのはそれほど多くないと思う。
特にソフトウェア開発では高度でない仕事は自動化しやすいので、自動化できないような高度な仕事しか残りにくい。
確かに、自動化できることはあるし、これからさらに自動化できることは増えていくだろう。
しかし、人間にとって高度でないからといって、システムで自動化できるわけではない。
今のコンピュータで自動化できるのは入力された情報をあらかじめ決められた処理をして、
出力するのが限界だ。
なので、現段階では高度な技術を持っていない、プログラマーであってもやることはある。
ソフトウェア工学では、高度な技術ではないけど、システムで自動化できないところを、
体系化して誰がやっても同じようにしていくものではないだろうか。


開発 | 【2009-02-07(Sat) 10:28:43】 | Trackback:(0) | Comments:(0)
べき乗アルゴリズム - 下位桁編
アルゴリズム - 同じ文字列のn回繰り返しをlog n回で作る方法 - 404 Blog Not Found
function (str, n){
var result = '';
for(n *= 1; n > 0; n >>>= 1, str += str) if (n & 1) result += str;
return result;
}

通常、べき乗の計算はべき乗の数だけ掛け合わせて計算を行う。
例えば24の場合、2×2×2×2となり、2を4つ掛け合わせる。
この計算の仕方だとべき乗の数が増えれば増えただけ掛け合わせることになる。
しかし、冒頭のアルゴリズムを使用するとlog n回で済み、処理が早くなるようだ。
でもwikiのべき乗アルゴリズムを見てもいまいち、何をやっているのかよくわからない。。。
とりあえず、wiki通りにjavaで書いてみた。
public long beki(long p, int n) {
long v = 1;
for(; n > 0; n >>>= 1){
if((n & 1)==1){
v*=p;
}
p*=p;
}
return v;
}

一応正常に動作するようだが、まだよくわかっていない、、、がなんとか説明してみることにする。

プログラムはとりあえず置いておいて、べき乗の性質から


wikiにもあるがべき乗には、
(ax)2 = a2x
という性質がある。この性質が重要。
具体的な数字を当てはめると、
(22)2 = 22*2
となる。つまりこれは(22)2 = 24ということである。
この考えで行くと
28 は ((22)2)2となる。
実はこの時点で計算が大分減っていることに気づくと思う。
普通に計算すると28は2×2×2×2×2×2×2×2と2を7回掛ける必要がある。
しかし、((22)2)2とすると、まず、22の計算をして4になり次に、4×4の計算をして16になり、
最後に16×16の計算をして256となり、3回の計算で済む。
なんと7回の計算が3回に減るのである。このアルゴリズムではこの特性を大いに利用する。

でこの性質をどうやって利用するの?


とりあえず、単純なべき乗の計算の効率化はできた。
しかし、この計算を行うには、べき乗の値に4乗が含まれているか?
8乗が含まれているか?と分析しなければならない。
どういうことかというと、wikiと同じ、a43について考えてみる。
a43 = a32+8+2+1 = a32×a8×a2×a1
と、43乗には32乗、8乗、2乗、1乗が含まれていることになる。
これをどうやって知るの?ということである。

ここで2進数登場


べき乗を分析するのには2進数を使う。
wikiにもあるけど、とりあえず、1,2,4,8,16,32を2進数にしてみる。
10進→2進
1    →1
2    →10
4    →100
8    →1000
16   →10000
32   →100000
で、43を2進数にしてみる
43 → 101011
43の2進数の値をよく見ると、1,2,8,32が含まれていることが分かる。
まず、101011の一桁目が1、を表す、で二桁目が2を表す、で三桁目が4を表すが0であるので、
43には4は含まれていないことになる。で同様に、四桁目が8で、5桁目が16で0なので含まれず、
最後の五桁目が32にとなる。
そうつまり、2進数にすると、何が含まれているのかが分かるのである。
何が含まれているのかが分かれば効率的な計算方法を利用することができる。

でようやくここからプログラムの説明に戻る


public long beki(long p, int n) {
long v = 1;
for(; n > 0; n >>>= 1){
if((n & 1)==1){
v*=p;
}
p*=p;
}
return v;
}
まず、for文の説明から。
for(; n > 0; n >>>= 1){
これはべき乗nを右にシフトしていってnが0以下になるまで回り続けろということである。
例えば、べき乗が43の場合、2進数は101011となる。
この101011を右に1シフトすると、10101となる。さらにシフトすると、1010となり、次に101、10、1、そして最後に0となりfor文は終了する。
なぜ、このようなfor文にするかというと、先ほどのべき乗の分析が関係してくる。
べき乗の分析は2進数にして、ある桁が1かどうかで含まれているかどうかを判断している。
なのでfor文で一つずつ右にシフトし、一桁目が1かどうか、次のifで判断しているのである。
で1の場合は、べき乗の元の値を結果値に掛ける。
v*=p;
ただし、元の値pは元の値のままでなく、for文が回る度にべき乗となる。
p*=p
例えば、元の値が2で1回まわったら2×2で4になり、2回まわったら4×4で16になる。
何でこんなことをしているかというと、べき乗の性質と効率的計算を思い出して欲しい。
(ax)2 = a2x
である。
つまり、べき乗を2進数にして一桁目から分析していって、1だったら、その桁にふさわしい値を
結果に掛けていってるのである。
例えば元の値が2で3桁目が1の場合、3桁目にはfor文は2回まわっているので、
2×2で4、4×4で16となり、結果値に16を掛けるのである。

以上、最後らへんはちょっと無理やりだったけど、眠いのでこれで終了。
てか、たったこれだけのプログラムを理解してまとめるのに半日もかかっちまったぜ。。。ふっ。

アルゴリズム | 【2009-02-02(Mon) 02:53:12】 | Trackback:(0) | Comments:(0)
javascriptってこんな書き方できるんだ。すげぇ。
IT戦士:for 文と無名関数のイディオム
for (var i = 0, len = list.length; i < len; i++) (function(node, i) {
var text = node.textContent;
node.onclick = function() { alert(text) };
})(list[i], i)
はじめ見たとき何だコレって思った。
この記事ではパフォーマンスがどうとかいう話をしているけど、
こんな書き方できるってことにビックリした。

で自分なりにこれどういう意味なのか説明してみる。

まずFor文


for (var i = 0, len = list.length; i < len; i++)
当たり前だけど、ここまでがFor文でiをlist内の要素の数だけ回す。

で、回しながらどんな処理するの?


それは無名関数でこの部分
(function(node, i) {
var text = node.textContent;
node.onclick = function() { alert(text) };
})(list[i], i)

最後についてる
(list[i], i)
は無名関数に渡す引数

以上短いながら説明終わり。
javascriptっておもしろい。とても柔軟な言語なんだな。

javascript | 【2009-01-20(Tue) 00:18:31】 | Trackback:(0) | Comments:(0)
phpの正規表現 - HTMLタグを消去するメモ

やりたいこと


PHPで取得したHTMLのタグを全て消して、文章のみ取得したかった。

でどうやる?


正規表現を使ってやるのがよさそうだ。

やってみた


preg_replace('/<("[^"]*"|\'[^\']*\'|[^\'">])*>/','',$html);

いろいろググったり試したりしてみたらこれが良さげだ。
ちなみにPHPには正規表現で置換する関数が二つあり、ereg_replaceとpreg_replaceがあるようだ。
ereg_replaceはPHP本来のものでpreg_replaceはperl互換のものらしい。
で、preg_replaceのほうがperlの強力な正規表現が使えなおかつ、高速らしい。

でこの正規表現どういう意味?


/<("[^"]*"|\'[^\']*\'|[^\'">])*>/

説明する自信が実はない・・・がとりあえずやってみる。
1.スラッシュで囲んでるけど何?
まず、始めと最後を/で囲まれているのは、Perlの正規表現の決まりごと。
/で囲まれたパターンに一致するものを置換する。
ちなみに後ろの/の後にオプションをつけることもできる。がここでは語らない。

2.スラッシュの後に<がくるけど?そして最後も>だけど?
HTMLのタグは<>で囲まれたところなので、<で始まり>で終わるようにしている

3.("[^"]*"|\'[^\']*\'|[^\'">])って括弧で囲まれているが何?
まず()で囲まれている部分はグループになる。
()内の文字列で一つのパターンをあらわす。()の後に*がついているが、
これは()内のパターンにマッチした文字列を0回以上という意味になる。

4.括弧内はどんな意味?
まずよく見ると文字列内に「|」がいくつかある。
これはOR(または)の意味で、前のパターンまたは後ろのパターンという感じになる。
なのでとりあえず「|」で区切ってみると、
"[^"]*"

\'[^\']*\'

[^\'">]

の3つのパターンがあることがわかる。
これらのどれかにあてはまれば()内のグループパターンはマッチすることになる。
では上から順にどういう意味か見ていく
"[^"]*"

これは"で始まり、"で終わるというパターンをあらわしている。
""の間に入る文字列は"以外であればOKである。[^"]というのは"以外という意味。
で*があるので"以外の文字列が1文字以上ということになる。


\'[^\']*\'

これも上の"のパターンを'に置き換えただけ。シングルクォーテーションの前に\があるのは、
'をエスケープするため。

最後
[^\'">]

'、"、>の3つ以外の文字列をあらわす

以上説明おしまい。

補足
てかPHPにはHTMLタグを除去する関数がすでにある。。。
それはstrip_tagsという関数である。

さらに補足
scriptタグだけうまく消えなかったので、このタグだけ別の正規表現で消して見た。
/).|\n)*<\/script>/

どういう意味かは面倒なので省く

さらにさらに補足
PHPの正規表現のチェックをしてくれる便利なサイト↓
PHP正規表現チェッカー

php | 【2009-01-18(Sun) 16:39:12】 | Trackback:(0) | Comments:(0)
意味のあるないはいつも自分が決める
「宇宙の消滅」と「生きる意味」を関連付けるのは自分次第なのでは?

100億年すれば、宇宙は消滅する。だから、生きていることに意味はない。
人生に、目的だとか、意味だとか、そんなものはないと思う。

何かの対象に意味があるないを決めるのは主観的なことで、
ある人にとって意味があることであっても、別の人から見れば意味がないことは多々ある。

なので、「宇宙が消滅するから生きる意味がない」というのはこの人にとってはそうであるかもしれないが、他の人にとって必ずしもそうであるとは限らない。

つまり、宇宙が消滅するしない関係なしに生きる意味を与えるのは自分自身なのである。

雑記 | 【2009-01-17(Sat) 18:40:11】 | Trackback:(0) | Comments:(0)
Eclipse3.4でPHP - 設定手順
前提条件として、Apache2、PHP5、Eclipse3.4PHP用(PDT)がインストールされていること。

デバッガーの指定


PHPをデバッグするための設定
php.iniに以下を追加。追加する場所はAdded by go-pearの上あたりか一番最後でいいと思う。
僕はAdded by go-pearの真上に追加した
[Zend]
zend_extension_ts="C:\php\ZendDebugger.dll"
zend_debugger.allow_hosts=127.0.0.1
zend_debugger.expose_remotely=always

zend_extension_tsにはZendDebugger.dllのパスを指定する
ZendDebugger.dllはpleiades-all-in-one-phpでダウンロードした場合は、
その直下にZendDebuggerフォルダがある。
このフォルダの中に5_2_x_compみたいなフォルダがあるから、自分のPHPのバージョンの
フォルダを探して開く。例えばPHPのバージョンが5.1.2だと5_1_x_compを開く。
中にZendDebugger.dllが入っているから、ここのパスを指定する。
もしくはこのdllをどこか別のフォルダにもっていってそのパスを指定してもいい。
ZendDebugger.dllが見つからない場合はhttp://downloads.zend.com/pdt/server-debugger/より
ZendDebugger-5.2.14-cygwin_nt-i386.zipをダウンロードする。

Eclipse - PHP実行可能ファイル指定


eclipseを開いて、ウィンドウの設定を開く
eclipse_php1

PHPのPHP実行可能ファイルを選択
eclipse_php2
上記の画面で追加ボタンでPHPの実行可能ファイルを追加する

eclipse_php3
名前は任意。PHPのバージョン名などわかりやすいものがいい。
実行可能ファイル・パスに、インストールしたPHPのphp.exeのパスを指定する。
PHP iniファイル(オプション)にphp.iniファイルを指定する。
(上記画像では指定していないが指定しておいたほうがいい)
PHPデバッガーはZendデバッガーでOK。これはPHPをデバッグするときに使用するデバッガー。

Eclipse - PHPサーバーの設定


PHPのPHPサーバーを開く。
eclipse_php_sv1
Default PHP web Sever・・・をダブルクリック、もしくは選択して編集。

eclipse_php_sv2
サーバーを示すURLを「http://localhost/eclipse」としてOK。

これでeclipse側の設定終了

Apacheエイリアス設定


ApacheがEclipse上で作成したPHPファイルを認識するよう設定。
Apacheのホームディレクトリにあるconfフォルダを開く。
この中に、httpd.confがある。
http.confの中に以下の内容がある
<IfModule alias_module>
#
# Redirect: Allows you to tell clients about documents that used to
# exist in your server's namespace, but do not anymore. The client
# will make a new request for the document at its new location.
# Example:
# Redirect permanent /foo http://localhost/bar

#
# Alias: Maps web paths into filesystem paths and is used to
# access content that does not live under the DocumentRoot.
# Example:
# Alias /webpath /full/filesystem/path
#
# If you include a trailing / on /webpath then the server will
# require it to be present in the URL. You will also likely
# need to provide a section to allow access to
# the filesystem path.

#
# ScriptAlias: This controls which directories contain server scripts.
# ScriptAliases are essentially the same as Aliases, except that
# documents in the target directory are treated as applications and
# run by the server when requested rather than as documents sent to the
# client. The same rules about trailing "/" apply to ScriptAlias
# directives as to Alias.
#
ScriptAlias /cgi-bin/ "D:/Apache Group/Apache2.2/cgi-bin/"

</IfModule>
この内容の「# the filesystem path.」の下辺りに以下を追加する
Alias /eclipse "C:/workspace/"
<Directory "C:/workspace/">
Options Indexes Multiviews ExecCGI
AllowOverride None
Order allow,deny
Allow from all
</Directory>

「C:/workspac」の部分はEclipseで作成したプロジェクトのworkspaceのパスを指定する

これで設定は完了

php | 【2008-12-08(Mon) 01:10:45】 | Trackback:(0) | Comments:(0)
mysql5.1.30 - windows用インストールメモ

ダウロード


http://dev.mysql.com/downloads/mysql/5.1.html よりダウンロード

インストール


ダウンロードしたsetupを実行する
mysql_setup1
Nextを押下

mysql_setup2
セットアップのモードを選択。
標準の「Typical」を指定する。インストールするフォルダなどを変えたい場合は「Custom」を選択。

mysql_setup3
インストール確認。間違いなければNext。
インストール中の画面が表示され終了後、以下が表示される。

mysql_setup4
Nextを押下。

mysql_setup5
Nextを押下。

mysql_setup6
Nextを押下。

mysql_setup7
Nextを押下。

mysql_setup8
設定方法を指定する。「Detailed Configuration」を指定。

mysql_setup9
インストールするサーバータイプの指定。クライアントで開発用なので、「Developer Machine」を指定。

mysql_setup10
データベースの使用方法を指定。「Multifunctional Database」を選択。
トランザクション処理がメインで更新処理が多い場合は「Transactional Database Only」を選択。
検索処理のみで更新処理がない場合は「Non-Transactional Database Only 」を選択

mysql_setup11
データ格納場所指定。変えたければ変える。今回はデフォルトのまま。

mysql_setup12
Mysqlサーバーに対する接続数を指定。開発用なので「20」もあれば十分なので、
「Decision Support(DSS)/OLAP」のままでOK。

mysql_setup13
ネットワーク設定。TCP/IPで接続。ポートもデフォルトの「3306」でOK。
他にMysqlなどのサービスが入っていて、「3306」ポートを使用している場合は変更する。

mysql_setup14
データベース内の文字コードの指定。
UTF-8にするので、「Manual Selected Default Character Set / Collation 」を選択して
UTF-8を選択する。

mysql_setup16
「Install windows servies」にチェックすると、windowsのサービスに登録される。
「Launch the MySQL Server Automatically」にチェックを入れるとMySqlのサービスが
Windows起動時に自動で起動する。はずすと手動起動になる。

mysql_setup17
管理者ユーザのパスワード設定。

mysql_setup18
executeで実行。

mysql_setup19
Finishで終了。

mysql | 【2008-12-07(Sun) 22:50:58】 | Trackback:(0) | Comments:(0)
前のページ 次のページ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。