2012年2月29日水曜日

Windows 7(vista) の機能 拡張子を表示させる


①任意のフォルダーを開く

②左上にある 整理 をクリック




③フォルダーオプションと検索のオプションをクリック


④フォルダーオプションダイアログボックスが表示される


⑤表示タブをクリック


⑥詳細設定下部の”登録されている拡張子は表示しない”のチェックをはずす





情報処理 再チャレンジ ブログ ホーム へ

2012年2月28日火曜日

やり直し Java Servlet ( 基礎からのサーブレット/JSP[改訂版] )その1

(p22) Webアプリケーションのディレクトリ構造
JSP、HTML、画像、TEXTファイルなどはコンテキスト名(entry)の直下に
配置するとの事で、

①”hello.txt” をテキストどおりに作成して配置する。
②tomcat7/bi/Tomcat7w を右クリックで管理者として実行(A)...
③ブラウザのアドレスに ”http://localhost:8080/entry/hello.txt と入力

するも期待通りに表示されない。
”わかりやすい!” と薦められて買ったテキストの、出だしの一番簡単な
箇所で つまづいていては、”サーブレットを諦めろと” 言われているような
もので、一気にテンションが下がってしまった。

これって、よくあるミスなのではないかと思うが、
 webappsフォルダ内に右クリックで entryフォルダを作成し、
entry フォルダ内でまた右クリックして、”hello.txt” を作成していたのである。
その後にメモ帳で hello.txt を編集して上書き保存し、”hello.txt” が完成
したものと思い込んでいた。
このやり方では、”hello.txt.txt” が作成されてしまうのである。

ファイルの拡張子を最初から表示させておけば陥らないミスであった。


(p37) JAVAファイルの作成
ここでサーブレットコードが出ていて、問題なく動作はしたが、
doGet()メソッド のメカニズムがわからず、先へ進めなくなった。
細かい概念はもう少し慣れてきてからとの考えだったのでしょうが、
サーブレットコンテナについてもう少し情報が欲しかった。
doGet()メソッドは2つの引数を持っています。
1つ目の request インスタンスは、なんとなく クライアントからの
リクエストを元に、この第1引数に収まるのはイメージできるが、
2つ目の response インスタンスの response は、
『サーブレットが処理をした後にクライアントに返すもの』 という
イメージから、
・メソッドは引数にインスタンスが入らないと起動しない。
・第2引数はメソッドが処理をした後に出来上がる。
これまでの学習から、どちらも正しいと思うが、そうだとしたら
矛盾が生じる。

を解消する情報が見つけられなくて、実は3ヶ月くらい学習が停止した。

乱暴なイメージだが、
①クライアント → httpサーバ → コンテナ → doGet()メソッド等


②doGet()メソッド等 → コンテナ → httpサーバ → クライアント

で、データが流れるが、①でコンテナが、リクエスト情報を元に doGet()に
渡す2つのインスタンスを生成し doGet()に渡している。
この際、response インスタンスに関しては、せいぜいクライアントが指定して
いるサーブレットが存在するか?しないか?で、200 とか 404 とか の情報を
持つ、その他は空のインスタンスが生成され doGet()メソッドに渡す。



(p44) コンパイル用バッチファイルの作成
JAVAの開発は eclipse を基本とするため、あまり重要ではないとも思ったが、
基本を確実にしたくてテキスト通り compaile.bat を作成する事にした。

@set CLASSPATH=C:\servletbook\apache-tomcat\common\lib\servlet-api.jar
javac -sourcepath src -d classes src/%1

上記2行をバッチファイルとして WEB-INF フォルダーに配置することで、

javac コマンド発行時に 楽してコンパイルできるというもの、

テキストを読んでいて、そう難しくはない記述なのだったが、実行結果が期待通りにならない。
だいぶ悩んだ挙句、”CLASSPATH"を小文字にしていた事が良くなかったようだ。

表記の通り大文字で書き換えたら解決した。


情報処理 再チャレンジ ブログ ホーム へ

2012年2月27日月曜日

MySQL ぜひ覚えたい 関数 式 句 などの覚書(p181~)

『基礎からのMySQL』 西沢夢路著 (ソフトバンククリエイティブ) 
から得たぜひ覚えたい個所を列挙した。 Part3




(p182) 複数の抽出結果を合わせて表示する。
 ①select * from tb1 ; ②select * from tb2 ; の結果を
一度に表示させることを union で実現している。

select * from tb1 union seleect * from tb2 ;


これを見やすくする為、


(select * from tb1) union (select * from tb2) ;


なんて事もできる。



(p184) 3つ以上のテーブルから「union」で集める。

       (select * from tb where bang = 'A102')
union
       (select * from tb where bang = 'A103'
union   
       (select * from tb where bang = 'A104'
union
       (select * from tb where bang = 'A107') ;


と発行する事で、bang で抽出された4つの結果をまとめて
表示させる事ができる。


グループ化して表示させているように見える。


また、


select * from tb where bang not in ('A101') ;


というSQL文も紹介されている。 これは

テーブル内の bang が A101 以外を表示するもの。



select * from tb where in ('A101','A103',104'A','A107') ;

は、見慣れない SQL文 で戸惑ったが、

()内にあるものをグループとみなして、

そのグループに属するレコードの中から抽出するもの

ですね。





(p185) 条件を付けて複数の抽出結果を合わせて表示する。
 
 ① tb から uria が200以上のレコード持つ bang を抽出
 ② tb1 から tosi が35以上のレコード持つ bang を抽出


(select bang from tb where uria >= 200)
union
(select bang from tb1 where tosi >= 35) ;



結果は A101 , A102 , A105 の3件が抽出される。


2つのSQL文の結果を union はつなげて表示させている。


注意したいのが、

①の抽出結果は、A101 , A102 の2件であり、
②の抽出結果は、A101 , A105 の2件である。
合計 4件 が表示されるかと思いきや、
自動的に重複表示を制限しているのである。



重複表示を許す場合(純粋な OR 抽出?)は、

(select bang from tb where uria >= 200)
union all
(select bang from tb1 where tosi >= 35) ;



と、union に続けて all とすれば良い。



大量のデータを処理する場合は、union(重複を省く)では、

処理時間が長くなり、 union all(重複を許す)とすると、


処理時間が短くなる。らしい。




(p188) 複数のテーブルを結合して表示する(内部結合)。

 いよいよリレーショナルデータベース(以降RDB)らしい
内容になってきます。RDB = 複数テーブルを関連づける
という概念ですが、直前の union のところでも、2つのテーブル
(tb と tb1)を使って結果を表示していました。
ちょっと立ち止まり概念を整理したのですが、
union のところでは、2つのテーブルからの抽出結果を
ただ単に連続表示していただけでした。

内部結合 join 句 (※ INNER を指定すると、内部結合を「明示的」に指定できる。)は、
複数テーブルが共通に持つフィールドの値でテーブルを関連
づけ、実在するテーブル(tb , tb1)が持つ情報を、非実在の
テーブル(仮想テーブル)を作成し、それを表示している。

テキストでは、
select * 
    from tb 
join tb1
    on tb.bang = tb1.bang ;  

これは、 テーブル tb の bang と テーブル tb1 の bang が
同一であった場合に、それぞれのテーブルからレコードを
抽出し、全フィールドを結合して一件のレコードとして表示
するというものですね。
 
うまい表現ではないような気もしますが、
1レコード6フィールドの ハードディスクには実在しない
テーブル(仮想テーブル)を画面上に表示します。


内部結合 という事は、 外部結合 もある訳で、その違いを
把握しておきたいところですが、

テーブル tb には bang が A101、A102、A103、A104、A107 
の5種類、計10件のレコードが存在していて、
テーブル tb1 には bang が A101、A102、A103、A104、A105 
の5種類、計5件のレコードが存在している。


先の内部結合のSQL文では、9件のレコードが表示されたが、
bang が A107(tbだけにある) と A105(tb1だけにある) の
レコードは表示されなかった。 内部結合は、片方にしかない
情報は排除し、仮想テーブルには含めないのです。

それに対して、外部結合は片方にしかない情報も
仮想テーブルに 加えます。


    左のテーブル          右のテーブル
  bang   uria  tuki     bang   nama   tosi
  A103  101  4  |   A101   佐藤    40
  A102   54 54  |   A102   高橋    28
  A104  181  4  |   A103   中川    20
  A101  184  4  |   A104   渡辺    23
  A103   17  5  |   A105   西沢    35
  A101  300  5  |
  A102  205  6  |
  A104   93  5  |
  A103   12  6  |
  A107   87  6  |


左外部結合(left join) と 右外部結合(right join)。
inner join の inner を、left または right  に置き換えると、
左(右)外部結合の結果が得られます。

左外部結合とは、左のテーブル(tb)に 右(tb1)にはない
フィールド が存在する場合、そのデータも仮想テーブルに
加えてしまいます。違う言い方をすると、
左外部結合の結果は左テーブルのレコード総てを
仮想テーブルに加えて、右テーブルからは特定のキーに
よって一致するレコードを抽出し仮想テーブルに加える。
という事ですね。


(p194) using を使って on ~ の部分を見やすくする。
 テーブルを関係づけるために、
on tb.bang = tb1.bang (bang)というフィールドの内容が
同一かを判定させる。ここでは たまたま 2つのテーブルで
bang というフィールド名でしたが、
tb では、bang、 tb1 では bangou というフィールド名で
A101 やら A107 というデータを保持させていた場合、
「 on tb.bang = tb1.bangou 」 とすれば、テーブルどうしを
結合させられる。
using 句は、仮に2つのテーブルで、A101 やら A107 の
データを同じフィールド名で管理している場合、
join tb1 on tb.bang = tb1.bang を 
join tb1 using (bang) と簡単に記述できるというもの。




(p195)  
結合したテーブルから「where」で設定した条件で抽出する。
 結合した仮想テーブルから where 条件でレコードを抽出
する際は where句の条件では フィールド名だけではダメ。
必ずテーブル名を指定して MySQL に示してやる必要が
ある。

select tb . bang , tb1 . nama , tb . uria 
         from tb
join tb1
         using(bang)
where tb . uria >= 100




(p 197) たくさんのテーブルのデータを使って抽出する。
 テーブルの結合は2つ以上可能で仮に3つのテーブルを
結合する場合は、

select
       tb.bang,tb.uria,tb1.nama,tb3.ken
from
       tb
join
       tb1
using(bang)
join
       tb3
using(bang)
;
とする。




(p200) 
複数のテーブルの総てのレコードを表示する(外部結合)。
 内部結合(p188)後半の記述を参照。




MySQL ぜひ覚えたい 関数 式 句 などの覚書(Part1)へ

MySQL ぜひ覚えたい 関数 式 句 などの覚書(Part4)へ






情報処理再チャレンジブログ ホーム

2012年2月26日日曜日

MySQL ぜひ覚えたい 関数 式 句 などの覚書(p164~)

『基礎からのMySQL』 西沢夢路著 (ソフトバンククリエイティブ) 
から得たぜひ覚えたい個所を列挙した。 Part2




(p164) UPDATEコマンド
 テーブルの特定のカラムを指定した値に変更する。書式は、
update テーブル名 set カラム名 = 設定する値 ; で、
一瞬にしてカラムの値が変更される。通常 
where句 と共に使用される為、全レコードの特定カラムを
一気に変更することは少ないらしい。

テキストでは、 tb という既存のテーブルに、
①新しく 「bikou」 というカラムを追加して、
そのカラムに②「特記なし」という文字列を設定している。

① alter table tb add bikou varchar(100) ;
② update tb set bikou = '特記なし' ;





(p167) 条件に一致したレコードだけを修正
 書式は、
update テーブル名 set カラム名 = 設定する値 where 条件 ;
テキストでは、 tb テーブルの uria が 100 以上のレコードの
bikou に 「優秀」 という文字列を設定している。
update tb set bikou = '優秀' whrer uria >= 100 ;



(p169) 売上下位3件の bikou フィールドに 「ガンバレ!」を設定
 uria フィールドの値で、下位3件を抽出はどうする?
① uria フィールドを 「order by」で並べ替える。
  ここでは小さい値から大きい値へ並べ替えられる(内部的に)。
② limit3 で最初の3件を抽出する(下位3件)。

 update tb set bikou = 'ガンバレ!' order by uria limit 3 ;



小生の感覚では、where句 で抽出したくなり、当該コマンドは
しっくりこない。経験を積むことで自然と理解が深まり、違和感が
解消されることを期待し先に進む事とする。


(p171) 特定のフィールドを削除する。
 テキストでは、tb テーブルの bikou フィールドを削除している。
書式は、 alter table テーブル名 drop フィールド名 ;
alter table tb drop bikou ; というコマンドを発行している。



(p171) 条件に一致したレコードをコピーする。
 ①条件に一致したレコードを抽出し、新しくテーブルを作成。
   create table tb_A101 select * from tb 
        where bang like 'A101' ;

 ②条件に一致したレコードを抽出し、既存のテーブルに追加。 
     insert into 既存テーブル名 select * from tb 
                 where bang like 'A101' ;

(p173) レコードを順番に並べてコピーする。
 テキストでは、
① tb テーブルのレコードを uria フィールドの値を基準にして
   降順に並べ替え(order by uria desc)、
②上位4件を抽出している(limit 4)。
③さらに、最上位のレコードを省いて、その代わりに
  uria フィールドが 5番目に大きい レコードを上位4件に
  加えている(offset 1 … 最上位レコードを1つ下のレコード
  とする)。
④手順③までで抽出したレコードを新しいテーブルとして作成。
  create table tb_2to5 select * from tb
                    order by uria desc limit 4 offset 1 ;



(p175) 全レコードを削除する(テーブルは残す)。
 「削除」 といえば DELETE! と閃いた次の瞬間、DROP でも
良いのかなぁ? と 少し ”もやもや” している事に気付く。


テキストにも書いてある通り、DROPテーブルを削除し、
DELETEレコード全部を消去しても、空のテーブルは残る。

※updateコマンドよりも慎重に発行する事が求められる。

さて、特定のレコードを削除する場合の書式は、
delete from テーブル名 where 条件 ; で、
テキストでは、
delete from tb1k where tosi < 30 ; を発行している。
(tb1 と全く同じ tb1k というテーブルをあらかじめ作成しておく)

結果は、tb1kテーブル にレコードは 2件が残る。
(tosi が 30 未満のレコードは削除される)

(p177) テーブルをソートしてから、特定のレコードを削除する。
 テキストでは、テーブル tb 同一内容のテーブル tb_copy が存在している事を前提にしているので、あらかじめ作成しておく。

以下の手順①,②で作成される 【仮想テーブル】 の内容を、
【実テーブル】である tb_copy から削除する。


① テーブル tb_copy の uria フィールドの値を基準に降順に
   ソートする。
② limit 4 で 上位4件のレコードを抽出する。


結果は、6件のレコードだけが tb_copy に残る。


(p179) 期間でレコードを抽出する。
 ここでは、【 now() - interval 5 year 】で、
現在より5年前を表している。 

now() 関数を使わずに interval の使い方を試すことにした。
 条件を 【 '2012' - interval 5 year】 としたら、エラーにはならず、Mysql は 「 Empty ○○○ 」 と返してくる。文法は正しいものと
思い、いろいろ試すも思うような結果が得られない。

結局 '2012'  を 'current_timestamp' とする事で、期待通りの
結果が得られた。

それから、「~ interval 5 years 」 とするとこれはエラーに
なってしまう。英語に精通している小生としては(うそ)。
違和感を覚える。




MySQL ぜひ覚えたい 関数 式 句 などの覚書(Part1)へ

MySQL ぜひ覚えたい 関数 式 句 などの覚書(Part3)へ




情報処理再チャレンジブログ ホーム