スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
ひさしぶりに
ひさしぶりに、ペアプログラミングしたい。
スポンサーサイト
この胸いっぱいの愛を
この胸いっぱいの愛をJavaに捧げよう
やっぱ
土日はホームシックだ・・・

どうも 物悲しい。
EclipseじゃなくてJDT
今までEclipseの機能だと思ってたのはJDTの機能だったのかorz

Eclipseを使ったJavaプログラミング
JDT - EclipseWiki
Eclipse3.2.0を使っています。 - 人力検索
Help - Eclipse SDK

私が求めていたのは、まさに最後のページだ!!
コンストラクタ
コンストラクタがクラスと同じ名前というのが、どうもしっくりこない・・・ というか嫌だ。

今月はずっとソースを読んでいる。

クラス名って長くなる傾向にあるように思える。
名前が長いだけで、名前を読む気がうせる。
ま、名前だし処理には関係ないか とか思って読みだすとどれがコンストラクタかわからんしまつ。

さらにめちゃめちゃクラスあるんだから、クラス名を瞬時に覚えているわけもなく、それと同名がコンストラクタと言われても・・・

さらに、クラス名と同名なので、
コンストラクタからクラスが始まってると思って読み出し、

「なんだこのクラス代入ばっかから始まってるんだが・・・」

とか思ったらコンストラクタで、うお、クラスの開始はもっと上か! とかトンマなことをやらかしてしまう・・・

ちゃんと名前の前に class が記載されてるか確認してから読み出す必要がある・・・

そもそもクラスだったら引数を受け取らないから読み間違える方が、おかしいくらいか・・・




しっかし
http://d.hatena.ne.jp/Mazin/20070709
こんだけ、コンストラクタで処理をさせれるのを知ったよw
時間との勝負だとこれもありなのか。。
Oracle Master Bronze 合格
Oracle Master Bronze 合格しました。

マスターと呼んで下さい(笑) 銅メダルだけど。


ヒヤヒヤものでした。
タイムゾーン
ASCII.jp - アスキー デジタル用語辞典 - タイムゾーン
日付/時刻のサポート
@IT:SQLクリニック(4) Page 2/3


残念なことに、頭がよくないのでタイムゾーンを理解できてなかった。

日本でAM 9:00は、イギリスではAM 0:00 である。

どの場所で何時か示す必要がある。

どっか一箇所を基点に決めたら、そこから時差がどれだけあるか示してあれば、場所を指定する必要はなくなる。さらに、基点の時間にもすぐになおせる。

日本は、基点であるGMTよりも9時間先行してるので +9:00 と表記できる。

05-05-17 04:26 +09:00

なら、

+9:00のタイムゾーンで2005年5月17日4時26分と読める。
GMTになおすと、2005年5月16日19時26分となる。

日本時間 +09:00 と読めたわけであるが、

現地時間 タイムゾーン

という記法がタイムゾーンの記法のようだ。
Oracleの暗黙の型変換
Oracleは実は、暗黙に型変換を行っている。

だから、WHERE句で、

DATE型の列 = '07-08-05'

なんてしても、エラーにならず結果が返ってくる。

'  ' で囲まれたのってのは「文字列リテラル」のはずであって、文字列であってDATEではないはず。そこでDATE型の列にTO_CHAR(列名,'YY-MM-DD')みたいな処理が暗黙的にかかって結果が返される。


びっくりしたのが、

CREATE TABLE T3 (
C NUMBER(5,1)
);

でつくったテーブルT3に

INSERT INTO T3 (C) VALUES ('2.22');
でも
INSERT INTO T3 (C) VALUES (2.22);
でも インサートできたこと(小数点以下1桁なので、2.2となり1桁分捨てられた)。

だから、'  'で囲まれたのって文字じゃないのかーーーー。
俺の理解が間違っているのかーーーーー。

暗黙の型変換がインサートのときも起こっているのだろうか・・・・
エラーじゃないのそこは・・・・・ orz


ちなみに、
INSERT INTO T3 (C) VALUES (to_char('3.22'));
でもインサート成功しました。

うーん、うーん どうなっているんだ・・・・・・


参考資料:
リテラル - oracle tips and tricks
固定小数点 と 浮動小数点
固定小数点と浮動小数点が正直、個人的に履修漏れ。

固定小数点数 - Wikipedia
浮動小数点数 - Wikipedia
固定小数点数とは 【fixed point number】 - 意味・解説 : IT用語辞典
浮動小数点数とは 【floating point number】 - 意味・解説 : IT用語辞典
白兎の実験部屋 コンピュータ入門
コンピュータにおける「データ表現」の基礎(第3回):ITpro



固定小数点と浮動小数点の話はむずかしい。
いや、「固定小数点」と「浮動小数点」の考え方自体はむずかしくない。


そもそも、「固定小数点」と「浮動小数点」とはなんなのだろうか。

OracleのNUMBER型を例に出すと一番わかりやすい。
テーブルの列に代入される値にも型を決める必要がる(C言語の変数の型を決めるのと同じ発想)。OracleのNUMBER型の場合、全部の桁数と小数点以下の桁数を指定する必要ある。

NUMBER(5.1) なら 全部で5桁で小数点以下は1桁
例:1234.5

つまり、NUMBER(5.1)は、
小数点(.)の後ろには1つしか数字をとってはいけいという型を定義している。小数点(.)の後ろにとる数字の個数が固定なので、固定小数点型。


このNUMBERに桁数を教えないで、
単に NUMBER なら 全部で36桁で、小数点(.)の後ろに36(35?)個までなら好きなだけ数字を取れる型を宣言したことになる。
例: 12.3, 123456.7, 12345.67, 123.45678

つまり、小数点の位置が、固定ではなくふらふら浮いたように見えるので浮動小数点と呼ばれる。


この小数点の位置を固定する、つまり、小数点の後ろの数字の個数を固定にするものを「固定小数点」と呼び、小数点の位置を浮動にする、つまり、小数点の後ろに任意個の数字を置けるようにするのを「浮動小数点」と呼ぶということだけである。

# 浮動(ふどう)と不動(ふどう)が同じ発音なので、
# 超混乱するのは俺だけ??


で、じゃあ どうして「固定小数点」と「浮動小数点」の話が超むずかしく感じるのかというと、コンピュータの内部的には小数点を扱うのは、かなりやっかいな仕事のようである。ということで浮動小数点(な型)を実装するのに色んな方式がでてきて(IEEE方式、IBM方式など)、われわれは煙に巻かれる・・・


浮動小数点の議論では、丸め誤差といった話が出てくるのだが、プログラム言語を扱う立場としてはまず、「固定小数点」と「浮動小数点」を以上で述べた意味で理解しておけばよいと思う。

つまり、C言語のdouble型は「浮動小数点」なので、12.3を代入してもよいし、123.567を代入してもよい。さらにその両者を足してもコンパイラに怒られることはない。もし、doubleが「固定小数点」なら 12.3 と 123.567 の足し算はコンパイラーにエラーをはかれるといった解釈でよいと思う。

# まずはの理解としてということなので、
# もっと深くもぐっていく必要はあると思う
どうも うなされて目覚める・・・
最近、うなされて目覚める。

学ぶ必要があることがいっぱいあるせいか。

1週間ずっと、非手続き型言語をさわり続けたせいか。
(非手続き型言語をさわればさわるほど、手続き型言語をさわりたくなる)

寝不足のせいか。

学びたいことがいっぱいあるせいか。
リファレンス実装
Java関連を勉強しているとしょっちゅう出てくる言葉「リファレンス実装」


以下の参考資料にあたってみた。

リファレンスコードとは 【reference code】 - 意味・解説 : IT用語辞典
実装とは 【インプリメント】 ─ 意味・解説 : IT用語辞典 e-Words
PC用語メモ
JBlend[nano] - 製品情報 - 株式会社アプリックス
Reference implementation (computing) - Wikipedia, the free encyclopedia
Java Solution FAQ:J2EE RIとは何でしょうか?
リファレンス実装 - Wikipedia


わかったような。わからんような。
仕様書じゃわかりにくい。実装だ。
実装の方見てみんなまねするんだ!ってこと??
記事に貼ったソースを引っ込めたり出したり
最近、ブログにソースコードを貼ることが増えてきた。
そこで、クリックひとつで、ソースコードを出したり、引っ込めたりしてみよう(引っ込めるのは未実装)

以下のようになる。
<div onmousedown="showMyId('unique_source')" style="cursor: hand;">↓(クリック)</div>
<div class="source" id="unique_source" style="display: none">ソース</div>

単にJavaScriptを書けばよいというわけではなく、
divタグに、なにをどのように書けばよいのか示す必要性があるので、まずタグの方から示してある。

「↓(クリック)」のところがみっともないが、画像を使ってボタンらしくすると、それなりになるであろう。なお、unique_sorceとなっている部分は、ユニークな値になるように毎回、自分で書き換える必要性がある。

JavaScriptの方はこんな感じ
function showMyId(showMyId_id){
document.getElementById(showMyId_id).style.display = 'block';
}



実演するとこんな感じ。
↓(クリック)

JavaScriptで窓を出してみる div だけどね

>>>ここを、クリックしていただければ巨大な、偽窓登場!


上の>>>で始まる文字列をクリックしていただきたい。
バックが黒色の窓が出るはずである。
出た偽窓をクリックすると窓は消えます。
(ちなみに、絶対値指定で上の方にしてあるので、偽窓が現れない方は画面をスクロールして上の方を見てみてください)






でたでた窓だ!







でたでた窓だ!


ソースはこんな感じになってます。
↓(クリック)




# それにしてもなんだ
# 業務と一切関係ないこの土日プログラミングはw
ココ!!クリック!!!
記事のタイトルをクリックしていただくと、
記事が引っ込んだり、出てきたりします。

右のメニューには、この機能を付けず、
記事のみという驚異っぷり。
記事を折りたたむ機能を追加しようかと・・・
とりあえず、今のところ Ctrl + ↑キー。

ご賞味あれ。

とりあえず、だからといって特に意味はない。


訂正:
記事のタイトルをクリックに変更いたしました。
SQLだけでデータを操作するときの戦略
グループ関数などを使って、テーブルのデータを扱いるとき、「うおー、変数にいったん代入したい!」という衝動に駆られることが多い。

SQLで、このような衝動に駆られたときの解決策として、次の2つのパターンがあるように思える。(なお、雰囲気勝負の見た目だけ載せる)

パターン1
SELECT
*
FROM
(SELECT
カラム1, COUNT(カラム1)
FROM
A
)
SELECT したものをから、SELECT でさらに絞り込むような感じ。


パターン2
同じテーブル(ここではAとする)に何度も、グループ関数を施し、
多くのカラムとの関連性が見たいときのパターン。
小さくした自分自身(A)と、別の条件で小さくした自分自身(A)を連結しまくる。
SELECT
*
FROM
(SELECT
カラム1, MAX(カラム2)
FROM
A
) miniA
JOIN
(SELECT
カラム1, カラム3, カラム4
FROM
A
) other_miniA
ON ( miniA.カラム1 = other_miniA.カラム1 )

なお、同じテーブルを小さくしたものの連結となるので、NATURAL JOINで結合できることがしばしばである。
オート,ダイナミック,レキシカル(スタティック)
変数のスコープorライフタイムには、

オート,ダイナミック,レキシカル(スタティック)

の3種類があります。

と、deq君にありがたいお言葉を頂いたので調べてみた。

静的スコープ - Wikipedia
動的スコープ - Wikipedia
スコープ(Perl) - プログラミング講座 - fuku研究所
結城浩の『Perlクイズ』[まぐまぐ!]
my 宣言とレキシカル (lexical) 変数
グローバル変数・ローカル変数・レキシカル変数
C言語-変数の有効範囲
変数の有効範囲


言語によって、「ローカル」や「静的」といった単語が別の用途で使用されているので注意が必要である。

C言語では「ローカル」とは、その関数の中だけという意味で使われているが(ローカル変数)、Perlで「local」と宣言すれば、そいつはダイナミックな変数だ。

ちなみにC言語の「ローカル変数」は、実は「オート」にあたるものであるし、「static int a」などと宣言された変数は「静的変数」と呼ばれるが、レキシカルな意味を込めた「静的」とは意味が違っている。

あくまでレキシカルとはスコープの範囲に使われる単語であって、次に同じ関数が呼ばれたときに、変数の値を覚えている(静的変数)という意味では使われない。なぜ、「静的」の話が出たかというとレキシカルスコープ(構文スコープ)は、静的スコープ(static scope)とも呼ばれるからである。



私が、今回の結論に達したソースと出力結果を以下に載せておく。
最後に、もう一度、考え直したことについての記載もある。


C言語 「静的変数」
#include <stdio.h>

void hoge(void){
static int a = 1;
printf("%d\n", a);
a++;
}

int main(void){
hoge();
hoge();
return 0;
}
1
2



C言語 「オート」
#include <stdio.h>

void hoge(void){
auto int a = 1; // int a = 1; と同じ
printf("%d\n", a);
a++;
}

int main(void){
hoge();
hoge();
return 0;
}
コンパイル時に警告
警告 W8004 'a' に代入した値は使われていない(関数 hoge )
1
1



Perl 「レキシカルスコープ(C言語の静的変数の意味はない)」
use strict;
use warnings;

sub hoge {
my $a = 1;
print "$a" . "\n";
$a++;
}

hoge();
hoge();
1
1



Perl 「ダイナミックスコープ (local宣言でもC言語の静的変数の役割はない)」
use strict;
use warnings;

sub hoge {
local $a = 1;
print "$a" . "\n";
$a++;
}

hoge();
hoge();
1
1



Perl 「ダイナミックスコープ (なのに宣言は local)」
use strict;
use warnings;

sub hoge {
local $a = 1;
foo();
print "$a" . "\n";
}

sub foo {
$a++;
}

hoge();
2



Perl 「レキシカルスープ」
use strict;
use warnings;

sub hoge {
my $a = 1;
foo();
print "$a" . "\n";
}

sub foo {
$a++;
}

hoge();
Name "main::a" used only once: possible typo
1



# ありゃ、オートとレキシカルの違いがわからん・・・



いや、ちょっと待てよ。
C言語の「静的変数」は ライフタイム の話であって、あまりスコープの話とは関係ない気がする。

ライフタイムは いつ死ぬか。
スコープは どこまで見えるか。

ということで、さらなる考察(実験)が必要か。

Perl には our なんてのもあるようだし・・・


ちょっと追記:
C言語学習塾 第11回C言語講座

auto ←→ static

C言語
auto int i ←→ static int i
の違い。

「auto(オート)」は自動で死ぬけど、「static」は死なない。
ちなみに、どちらも有効範囲(スコープ)はレキシカルである( { から } まで)。




【今のところの結論】
auto と static は、ライフタイムについての話である。
レキシカル と ダイナミックは スコープに関する話である。

auto int i;
は、スコープをレキシカル( { から }まで )とし、閉じ括弧で死ぬ。

static int i;
は、スコープをレキシカル( { から }まで )とし、閉じ括弧後もよそのスコープから見えないところで生きている。


ダイナミックスコープは、自分自身を包む括弧({ })の外の括弧の変数を見に行く。

レキシカルスコープは、自分自身を包む括弧({ })の変数を見に行く。

レキシカルスコープは、構文スコープや静的スコープと呼ばれる。この理由は、構文を見ただけ、つまりソースを見ただけで、容易に変数のスコープを予想できることにあると思う。

ダイナミックスコープは構文を見ただけでは容易に変数のスコープを予想できず、プログラムを動かして(ダイナミック(動的))始めて、どの変数を見に行ってるかわかる。


なにやら、ダイナミック(動的)スコープとスタティック(静的もしくはレキシカル)スコープの「動」と「静」は、型の議論のときのそれと同じ意味のような気がする。


特に、レキシカルスコープは、構文スコープ、静的スコープなど表記にゆれが生じまくりなので、この議論を進めるには、用語を統一してから始める必要があるのかもしれない。
JavaScriptのthisについてちょっとだけ考える
JavaScriptのthisは、Javaのthisと違うようなので、挙動を探ってみた。
便利なRhinoを使って実験してみよう。

js> var a = 0;
js> (function hoge(){
var a = 1;
(function foo(){
print(this.a);
})();
})();
0
関数の中の関数で this.a を呼び出しているにもかかわらず、
a は 0 と評価されてしまった。


ちなみに、
js> (function hoge(){
(function foo(){
print(this);
})();
})();
[object global]
この通り、thisはグローバルとのことだ。


newをつかってみようと思う。
js> var i = 0;
js> function Hoge(){
this.i = 1;
}
js> var hoge = new Hoge();
js> hoge.i;
1
thisをこんな風に使って new すると、
i は Hoge に強く結び付いたようで(表現あってるかな・・・)、
0 ではなく 1 と評価してくれる。


new Hoge( ) によって、
Javaで言うところのインスタンスを作れたので、
メソッドも実装したいところである。
js> var f=0;
js> function Foo(){
this.f = 1;
this.say = function() { print("I'm Foo!"); };
}
js> var foo = new Foo();
js> foo.f;
1
js> foo.say();
I'm Foo!
foo.f は 1 と評価された。
ちゃんとFooのメンバと見なされている証拠だ。
foo.say( ) もFooのメソッドしてちゃんと呼び出されている。


さて、
ここで同名のメソッド say( ) を実装してみよう。
js> function say(){
print("I'm Global");
}
js> say();
I'm Global
ここで、もう一度 foo.say( ) を呼んでみよう。
I'm Foo! と出力されることを切に願う。

js> foo.say();
I'm Foo!
よかった!ちゃんと I'm Foo! と出力された。
完全にFooのメソッドと解釈してくれている。


ところで、
こんなソースを書いてみた。
js> var b = 0;
js> function Bar(){
var b = 1;
}
js> Bar();
js> b;
0
b はもちろん変更されていない。


だが、
js> var b = 0;
js> function Bar(){
b = 1;
}
js> Bar();
js> b;
1
var が抜けると、グローバルな方の b を見に行っているので b の値が更新される。
このあたりはC言語のグローバル変数と挙動は同じかな・・・


で、疑問が残る次のソースを載せてこの記事を終了したいと思う。
js> var ba = 0;
js> function Bar(){
var ba = 1;
}
js> var bar = new Bar();
js> bar.ba;
js>
bar.ba なんてないと言われる。これで動いてくれてもいいと思うのは私だけなのだろうか・・・・
thisの魔法をかけてやれねばならないようだ。


【結論】
this は new しないと、あんまり使いものにならない。

new すると名前空間が変わる(表現が正しいかは不明)。
new しないといつまでたっても Global。



追記:
しかし、つぎのソースの this は、
Javaの this と超似ている。
というか同じ!?
js> function A(){
this.name = "A!";
this.hoge = function(){
new B().say(this);
}
}
js> function B(){
this.say = function(t){
print(t.name);
}
}
js> new A().hoge();
A!



続きまして、
js> function A(){
this.name = "A!";
this.hoge = function(){
new B().say(this);
}
}
js> function B(){
this.say = function(t){
t.name = "B!";
}
}
js> var a = new A();
js> a.hoge();
js> a.name;
B!


「this.変数名」

「引数に与えるthis」
で、意味がちょっと違ってくるということかな・・・
(いや、考えようによっては、いっしょな気もする)

ん~ ということは、
この記事で一番始めにかいたソースは、
ちょっと悪例すぎたかのかな・・・

と、思って
始めのソースとは、やや異なるが(中に関数を入れてない)
次のソースを書いてみた。
js> var a = 0;
js> function hoge(){
var a = 1;
print(this.a);
}
js> hoge();
0
やっぱり、この場合は、
グローバルな方の a を見にいってるね。
こりゃ、まいった。こういう仕組みなのかJavaScriptは。


ちなみに、
以下 2つの実験ソースを書いてみた。
js> var a = 0;
js> function hoge(){
this.a = 1;
print(this.a);
}
js> hoge();
1
js> a;
1


js> var a = 0;
js> function hoge(){
this.a = 1;
print(this.a);
}
js> var h = new hoge();
1
js> a;
0
js> h.a;
1
js> a;
0


new するかどうかで

this の挙動が変わると見た!!!


new しないと this はグローバルで。
new すると、オブジェクトに束縛(?)されるんだと思う。


# 読み返すと、上で出した【結論】と
# あんまり変わってない気がする
# 言い換えただけかな


つまり、
this.a = 1; の this は、自分自身。
代入のない this.a は グローバル。
関数の引数に与える this は、自分自身(インスタンス?)。
ということか。。。。
\G  Oracleにはないの!!??
Oracle には、ないのか!!??
どこなんだ??

Oracleというか、どちらかというと SQL*Plus か。
そもそも SQL と Plus の間の * がなにかわからん。


mysql のメタコマンド『\G』 : おまえのログ

mysql> select * from a;
+--------+------+------+
| c | hoge | b |
+--------+------+------+
| 123abc | NULL | NULL |
+--------+------+------+
1 row in set (0.00 sec)


mysql> select * from a\G
*************************** 1. row ***************************
c: 123abc
hoge: NULL
b: NULL
1 row in set (0.00 sec)



意外に便利なのにぃ


両方対応しました
参考資料:
http://q.hatena.ne.jp/1165813136

Ctrl + ←キー、 Ctrl + →キー

IEでもFirefoxでも両方対応しました。

追記:
Ctrl と 矢印キーに なおしました。
いろいろ駄目な点があったので、、、、
しかし、いちいち 矢印キーがちょっとだけ反応して
画面が動くのはうざい。
Emacsライクにしてもいいんだが。。。。うーん。

<script type="text/javascript" defer="defer">
//<![CDATA[
var ctrl = 0;
function preAndForword(evt){
evt = (evt) ? evt : ((event) ? event : null);

// 現在のURL取得
var nowUrl = location.href;

// 正規表現で \d.htmlとなっている \dを取得
nowUrl.search(/(\d+)\D*$/);
var number = RegExp.$1;



if (evt.keyCode == 17) {
ctrl = 1;
}

if( nowUrl == "http://bingobingobingo.blog49.fc2.com/" && ctrl &&
(event.keyCode == 37 || event.keyCode == 39)){
location.href = "http://bingobingobingo.blog49.fc2.com/blog-entry-1.html";
return;
}

if ((evt.keyCode == 37) && ctrl) {
number--;
location.href = nowUrl.replace(/(\d+)\D*$/, number + '.html');
return;
}
if ((evt.keyCode == 39) && ctrl) {
number++;
location.href = nowUrl.replace(/(\d+)\D*$/, number + '.html');
return;
}
}

window.document.onkeydown = preAndForword;
//]]>
</script>
ブログ検索

プロフィール

ビンゴ中西
Perlが好きである。
プログラミング言語のほとんどは独学。独学の過程で多くのプログラム仲間にも色々教わりました。

FC2カウンター

カレンダー

07 | 2007/08 | 09
- - - 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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。