2008/06/30

[javascript]半角数字を全角数字に変換

ちょーど、仕事で、必要なったので、こちらを参考にしながら、半角数字を全角数字に変換するファンクションを作成しました。

/* 半角から全角に変換するファンクション */
var Zenkaku = "0123456789";
var Hankaku = "0123456789";

function gf_ConvertToNumFnt(aVal){
var str = "";
var ind = "";
aVal = aVal.toString(10);

for(var i=0; i<aVal.length; i++){
ind = aVal.charAt(i);
ind= Hankaku.indexOf(ind,0);
str = str + Zenkaku.charAt(ind);
}

return str;
}

これで引数に半角数字をぶっこめば、全角数字で返してくれるのですが、もっとスマートな方法ないかなー。

2008/06/29

[scheme]うーん、慣れが必要かも

今、本を読んでいる最中なのですが、確実に、schemeを使ってプログラミングを全然していないので、はやりなれずに苦戦しちゃってます。

飲み込みがとても悪いので、数をこなしたいと思うのですが、いっぱい、ソースが書かれているschemeの本とかないかなー。

[scheme]lambdaを試しに作成!!

試しに、引数に2を足すlambdaを作成

Photobucket

そして、結果は、こちら

Photobucket

プロシージャーの名前を決めなくても、プロシージャーを実行できるところが、はやりすごいと思う。

2008/06/28

[scheme]lambdaすげー

schemeでは、ラムダという概念が出てくると聞いてたのですが、先ほど、初めて登場しました。

まだ使い方をきちんと把握していないのですが、プロシージャーの名前を宣言せずに、プロシージャーの内容を宣言し、引数を割り当てて実行することができるみたいです。

今まで、pl/sqlにしろ、JavaScript(個人的には、無名関数として使ったことはあるのですが、業務ではないのです。)にしろ、ファンクション名、プロシージャー名を宣言せずに、実行したことがないので、ものすごく興奮してしまい思わずエントリーを書きました。

きっと、JavaScriptの無名関数もこの辺からきているのかなーと思うと、半端なく興奮してきます。

先が楽しみぃー

2008/06/27

[ポーカー]ポーカーガジェットを公開

先輩社員が、過去に作ったhtmlとjavascriptだけで作られたポーカーを見て、どうやって作るんだろうーと疑問に思いながらソースを組んでいたら、プロトタイプができたので、ガジェットとして公開しました。

Photobucket

使い方を後で、ガジェット内部に埋め込む予定ですが、はじめに、「Bet」ボタンを押して、賭けるコインの枚数を設定します。

Photobucket

この時点で何枚でもかけることができて、もし、枚数を減らしたい場合は、右の「Cancel」ボタンを押せば、賭けた枚数を少なくすることができます。

で、オッケーな場合、左下にある「Start」ボタンを押すとプレイが開始されます。

Photobucket

ここからは、他のポーカーと同じで、残したいカードがある場合、下にある「Hold」のボタンを押します。

カードの下に「Hold」という文字が表示されれば、交換されずに保持されます。

Photobucket

Holdが完了したら、「Change」ボタンを押します。

Photobucket

今回は、負けてしまいましたが、勝った場合、ダブルと支払いをすることができます。

ちなみに、今後の予定としては、hetemlでサーバーを借りたので、mysqlを通して、最高枚数を表示したり、ランキング機能がついたサイトを作りたいと思っております。

ポーカーを作った先輩社員に見せたところ、なんと、「3カード」は、実は、「3 of a kind」で、「4 カード」は、「4 of a kind」だとのこと。(公開前に見せればよかったー。。。 orz)

後、オリジナリティを出したいと思い、ガジェットのUserPrefタグのhidden属性を使用して、コインの枚数を保持できるようにしました。(ちなみに、先輩社員は、cookieを使って実装しようと試みたそうです。)

さらに、若干、トランプのレイアウトも変更しました。

下のボタンから追加することができます。是非、どうぞ。

Add to Google

※後日、ガジェットのurlを変更する予定でいます。urlが変更され次第、また追って、新しいurlの場所を書きたいと思います。

2008/06/26

[電卓]リニューアルしました。

前々から気になっていたボタンの小ささと、文字の小ささから、画面をリニューアルしました。

Photobucket

前よりはよくなったんじゃーないのかなと。

リニューアル時に、前回読んだ、ハイパフォーマンスWebサイトに書かれている項目を取り入れました。

具体的な項目は、

1章 ルール1:HTTPリクエストを減らす
5章 ルール5:スタイルシートは先頭に置く
6章 ルール6:スクリプトは最後に置く
7章 ルール7:CSS expressionの使用を控える
12章 ルール12:スクリプトを重複させない

の部分を使いました。ルールが14で展開されていたので、14項目中5項目使ったことになります。

残りの部分は、また今後作るガジェットに取り入れようと思います。



ガジェットの追加はこちらからできます。

Add to Google

2008/06/25

[scheme]正確には、modulo != remainder

前回、Bugle Diary: [scheme]modulo=remainderで、moduloとremainderは同じ挙動をするという記事を書いたのですが、その後、コメントを頂きまして、実は、違うということを教えていただきました。
(コメントありがとうございます(* ̄∇ ̄*))

コメントいただいたときに、リンクが紹介されていたので、そちらを参考に、再度、検証しました。

前回と同様に、下の場合は、同じ評価結果を表示します。

Photobucket

問題は、次です。

実は、下の場合は、違う結果を返します。

Photobucket

上の式は、

-5 = -1 * 4 -1

と評価されていて、下の式は、

-5 = -2 * 4 +3

と返しています。

確かに実行結果が違う!!

教えていただいたこちらのサイトでは、remainderは、引数の両方が正の場合、戻り値が正確になり、符号が違う場合、余りは第一引数と同じになるようです。

一方、moduloも引数が、両方正の場合、戻り値が正確になり、符合が違う場合、第二引数の符号と同じ符号を余りが返すようです。

プロシージャーで使う場合、評価の仕方が変わるので、注意したいですね。

2008/06/24

[本]The Art of UNIX Programming

通勤中に読んでいたハイパフォーマンスWebサイトが読み終わったので(この本で得た知識を元に開発したプログラムの紹介はまた後日)、ヨドバシカメラのポイントを使ってThe Art of UNIX Programmingという本をゲットしました。



目次
序章
第1章 思想:大切なのは思想だ
第2章 歴史:2つの文化の物語
第3章 対比:Unix思想と他のOS
第4章 モジュール化:簡潔に、単純に
第5章 テキスト形式:優れたプロトコルが優れた実践を生む
第6章 透明性:光あれ
第7章 マルチプログラミング:プロセスを機能別に分割する
第8章 ミニ言語:歌いだす記法を探す
第9章 コード生成:高い水準で規定する
第10章 設定:気持ちよくスタートしよう
第11章 ユーザーインターフェイス:Unix環境におけるユーザーインターフェイス設計
第12章 最適化
第13章 複雑さ:できる限り単純に、それよりも単純でなく
第14章 言語:CすべきかCせざるべきか?
第15章 ツール:開発の戦略
第16章 再利用:やり直しを避けること
第17章 移植性:ソフトウェアの移植性と標準の維持
第18章 ドキュメント:Web中心の世界でコードの説明をする
第19章 オープンソース:新しいUnixコミュニティでのプログラミング
第20章 未来:危険と可能性
略語集
参考文献
寄稿者紹介
無根的根:不宇先生のUnix公案

via:The Art of UNIX Programming

この本は、小飼さんの書評 - The Art of Unix Programming (邦訳版)で紹介されていたのを見て、読んでみたいなと思い、買いました。
(正確にいうと交換なんだけど)

他のプログラムの本と大きく異なるのは、「どーしてOSにunixを選択したのか(why to)」に注目して書かれている点。

mac osが欲しくてたまらない気持ちにさらに勢いをかけてしまうような一作です。

2008/06/23

[javascript]document.allとdocument.getElementByIDの実行速度の違い

開発をしていてずっと気になっていたのですが、document.all("")とdocument.getElementByIdのアクセス速度って違うのでしょうか?

前者は、documentにあるすべてのタグを見に行くのに対して、後者は、ピンポイントで指定しているから、ひょっとしたら後者の方が早い気がするのですが。。。

論より証拠ということで、ソースを作って実行してみたらところ、アクセス速度に違いはありませんでした。

以下、ソースです。


<CFOUTPUT>
<script type="text/javascript">
function lf_kakunin(num){
var note;
dateObj = new Date();
note = "開始時刻は" + dateObj.toLocaleTimeString() + ":"+
dateObj.getMilliseconds() + "です";
document.getElementById("TimeStamp1").innerText = note;
for(i=1; i<=1500; i++){
if(document.all["hoge_"+i].value == num){
note = "見つかった時刻は" + dateObj.toLocaleTimeString() + ":"+
dateObj.getMilliseconds() + "です";
document.getElementById("TimeStamp2").innerText = note;
break;
}
}

note = "開始時刻は" + dateObj.toLocaleTimeString() + ":"
+ dateObj.getMilliseconds() + "です";
document.getElementById("TimeStamp3").innerText = note;
for(i=1; i<=1500; i++){
if(document.getElementById("id_"+i).value == num){
note = "見つかった時刻は" + dateObj.toLocaleTimeString() + ":"
+ dateObj.getMilliseconds() + "です";
document.getElementById("TimeStamp4").innerText = note;
break;
}
}
}
</script>

<div id="TimeStamp1"></div>
<div id="TimeStamp2"></div>
<div id="TimeStamp3"></div>
<div id="TimeStamp4"></div>

<form name="FRM_MAIN" action="" method="post">
<CFLOOP index="i" FROM="1" TO="1500">
<input type="text" value="#i#" name="hoge_#i#" id="id_#i#"> 
<input type="button" value="Run" onClick="lf_kakunin(#i#);">
<br>
</CFLOOP>
</form>
</CFOUTPUT>


アクセス速度に違いがないのですから、あまり意識せずに開発をしてもいいのかもしれませんね。

2008/06/22

[javascript]IE = innerText || firefox = textContent

前回、Bugle Diary: [javascript]<td>内の値を取得する。で、t.satoさんから、firefoxでは、innerTextが使えなくて、代わりにtextContentを使えばオッケーというコメントをもらいました。

実際にソースを作ったところ、ちゃんとtrueを返したよ。
(thanks fot your advice!!)

以下、firefoxで実行されます。

<div id="hoge"></div>
<script type="text/javascript">
document.getElementById("hoge").textContent = "foo";
</script>

2008/06/21

[scheme]modulo=remainder

前回、Bugle Diary: [scheme]remainderってmodのことかいな!!で、「modulo」でも、modを求めることができるというコメントを頂いたので、検証しました。

Photobucket
確かに、modが算出されています。

SICPの1章後半なのですが、moduloの式はまだでてきていないのですが、文章には書かれています。

remainderしか式は登場していないのですが、これから先、登場するのでしょうか??

う~~~ん、楽しみ♪(* ̄ー ̄)v

2008/06/20

[javascript]isNaN(null) = false

isNaNの引数がnullだった場合、trueではなくfalseを返すので、開発時に気をつけたいところです。

まとめると下のような感じになるのかな。

//false
alert(isNaN(''));

//false
alert(isNaN(5));

//true
alert(isNaN('hoge'));

2008/06/19

[javascript]onloadで無名関数を呼び出す

他の人が作ったプログラムを見ていたところ、onloadに、onload = "javascript:・・・"と書かれていて、onload以下を無名関数に変更できないかなと試しに作ってみました。

まずは、scriptタグで下のソースを実行する。

//「test」と表示される。
var hoge = function(){
alert("test");
}();


これは、前回、[Javascript]var 変数名=function(){}で書いたように、変数に無名関数をセットした書き方で、前回と違うのはその場で実行をかけたい時に、関数名{}();と関数名のすぐ後に「()」を追加したこと。

次のようにソースを変更し、試してみました。

//エラーになりました。
function(){
alert("test");
}();


変数名を宣言せずに、その場で実行をかけたいと思い、変数名だけ取り除いたら、エラーが発生しました。

う~~~~~~ん、なぜじゃ~~~~~~。

ちょっと考え、下のように変えると、無事にエラーを抜けました。

//「test」と表示される。
(function(){
alert("test");
})();


その場で実行をかけたい場合は、関数名の前後に「()」でくくる必要があるんですね。

というわけで、これをonloadにもっていくと、onload="(function(){・・・})();"と表現することができます。

さっき、実行してみたら、無事にロード後、ファンクションが実行されました。

2008/06/18

[css]css expression

ハイパフォーマンスWebサイトを読んでいて知ったのですが、CSSを動的に変更する技として、css expressionという方法があるということを知りました。

cssにjavascriptを埋め込んで動的に変更するのですが、すぐに固まったり、不必要に動作してしまう可能性があるそうです。

javascriptからfunction経由で、変更すればいいんじゃーねぇーと思ってしまうのだが。


2008/06/17

[scheme]remainderってmodのことかいな!!

テキストに説明がなくて、結構、テンパってしまったのですが、remainderってmodのことだったんだー。

Photobucket

ここの説明はほしかったなー。。。

2008/06/16

[javascript]<td>内の値を取得する。

今、ガジェットを作っているんですけど、<td>の中を取得するのに、方法がわからなかったので、ちょっとぐぐってみたら、typeCS POTATO topsMさんのページに回答が書いてありました。

基本的には、document.getElementById('<td>のId').innerTextで取得できるよう。

当初の予想では、nodeを使って取得するのかなーと思っていたのですが、もっと簡単に取得できたんですね。

2008/06/15

電卓ガジェットのヘッダーを削除しました

去年、電卓ガジェットを作ったのですが、使っていくうちに、ヘッダーがうざいなーと思い、削除しました。

Photobucket

前のバージョンと比べてタイトになりました。

2008/06/14

[oracle]カーソルに引数をぶっこみたいとき

webだけでなく、sqlや○○○の時にも、何かと
ぶち込みたいときがあります。(たまには、シ~モ~ネ~タで)

oracleのpl/sqlでカーソルの宣言を行い、内部のsqlに変数を使いたい場合は、カーソルに引数を持たせることができます。

ここのサイトを参考にすると以下のように記述することができます。

DECLARE
CURSOR hoge(aParam1 型, aParam1 型) IS
SELECT sysdate
FROM dual
;
BEGIN
・・・
END;/


ここで重要なのは、引数の型を書くときに、大きさは書かなくてもOKということ。
(むしろ書いたらコンパイルエラーor実行エラーが起きるかも)

開発時に結構、やっちまいそうなので、気をつけたいところ。

2008/06/12

[javascript]トリムをかける。その2

先日、Sato君から、while文を使わずに、トリムをかける方法を教えてもらったので、再度、取り上げたいと思います。(Sato君、サンクスです!!)

教えてもらった方法はこちらの通り。

var target;

//LTRIM
target.replace(/^[  ]*/gim, "");

//RTRIM
target.replace(/[  ]*$/gim, "");


確かに、試したらトリムをかけることができました。

こうすれば、一回、一回、while文を実行しなくても、トリムをかけることができるので、処理速度が劇的に速くなるのかなと。

しかし、正規表現は奥が深いです。。。

フクロウ本を買おうかなー♪

2008/06/11

google developer day 2008に参加しました

今年も参加しました。google developer day 2008

規模がデカかった。

Photobucket

Photobucket
↑基調講演

去年は、google maps apiとそれ以外って感じだったけど、今年は、gearsやgwt、open socialと幅広くセッションがありました。

open socialは、今まで、薄っすらとしか理解していなかったけど、より具体的なイメージを持つことができました。

充実した一日でした。