2008/04/30

[oracle]column(カラム)の削除

前回追加したカラムが必要でないと先輩社員から宣告されてしまったため、ORACLE 9i Silverを読みながら、column(カラム)の削除をすることに。

ALTER TABLE 表名
  DROP COLUMN 列名
;

via:オラクルマスター教科書Silver

で、実際に、

ALTER TABLE hoge
  DROP COLUMN test1
;

で実行すると削除できました。

しかしまぁー、つい数日前に追加したカラムを、後から「必要ないからー」といわれて削除するのも、ちょい寂しい気分です。

2008/04/29

[google apps]参加しました!!

ロハだったので、google appsに参加しました。

全然、使い方がわからないんだけど。。。

2008/04/28

[iGoogle]sand boxを試す

少し前に、iGoogle sandboxが登場して、試してみたいなーと思っていたのですが、全然、どうやって参加していいのかわからず、しばらくじっとしていたら、Google-Gadgets-API-Japanに参加方法の投稿がありました。

入り方がわかりました!
以下のページでサインアップした後、
http://www.google.com/ig/sandbox
以下のように "?hl=en" を付けて英語版の iGoogle を表示させれば OK です。
http://www.google.com/ig?hl=en
以降、この英語版 iGoogle が常に OpenSocial サポートになるようです。
元に戻すには左のメニューの上のほうにある「Leave the sandbox」をクリックです。
www.google.co.jp のドメインではダメなので、ご注意を。
まだ右も左もわかりませんが、ガジェットの枠が丸角になって、ちょっと新鮮。
それでは皆さん、 enjoy!

via:iGoogle が OpenSocial に対応するようですね。 オプション

さっそく試してみました。

sand box sign up画面で情報を入力

Photobucket

「sign up」ボタンを押した後、hl=en(URL変数)の追加をする。

すると画面が切り替わります。

Photobucket

Oh-これが、新しいiGoogleページかぁ~~~。
何ができるか全然わからないけど、ワクワクするなー♪

2008/04/27

[oracle]column(カラム)は最後に追加

前回、[oracle]column(カラム)の追加で、T.satoさんから、

確かALTER TABLEでカラムの追加をすると
全部ケツに追加されるんだっけ?

via:T.satoさんのコメント

とあったのですが、確か追加したとき、TABLEの一番後ろに追加されたような気がします。

カラムの途中で追加することってできるのか!?

2008/04/26

デベロッパー交流会に参加しました!!

木曜日にデベロッパー交流会に参加しました!!

Androidを使って開発を行ったことがないので、すごく新鮮でした。

Javaを使ってAndroid OSの上で走るアプリを開発できることは知っていたのですが、実際に、どんなアプリができるのか、サンプルアプリをいくつか見たので、今後、開発の参考にしたいなーと思いました。

Android OSって、Linux Kernelでできていたんですね。

しかも、受講者の人たちもほとんどの人たちが、Mac OSを持っていて、すっげーうらやましいなぁーと思ってしまいました。

ほしいなぁー

タイムテーブル
■ 第一部:基調講演
  タイトル: Androidでのアプリケーション作成
  講師: ジェイソン チェン(Googleデベロッパーアドボケイト)
■ 第二部:パネルディスカッション
  パネリスト: 安生 真
    西島 栄太郎
    丸山 不二夫
    ジェイソン チェン(Googleデベロッパーアドボケイト)
    鄭 隆幸(Google ソフトウェアエンジニア)
    岩狭 建(Google ソフトウェアエンジニア)
  モデレーター:石原 直樹(Google ビジネス プロダクト マネージャー)

2008/04/25

[oracle]column(カラム)の追加

またまた、仕事で、元々あるテーブルにcolumn(カラム)を追加する機会があったので、その方法について書きたいと思います。

ORACLE 9i Silverを参考にすると、

ALTER TABLE 表名
 ADD(列名 データ型 [列制約構文...]
  [列名 データ型 [列制約構文...]]...
)

via:オラクルマスター教科書Silver

と書かれていたので、さっそく試してみることに。

ALTER TABLE hoge(
  column_01 VARCHAR2(1)
  , MONSHIN_FLG VARCHAR2(1)
)
;

で実行してみると、確かにカラムが追加されました。

2008/04/24

[oracle]commnet(コメント)の登録

仕事でtableのcolumnにコメントを登録することがあったので、方法を書きたいと思います。

ORACLE 9i Silverを参考にすると、

SQL  >   COMMENT ON TABLE 表名||COLUMN 表名.列名 IS 'コメント';


via:オラクルマスター教科書Silver

と書かれていて、下のような感じで実行をかけると確かに、コメントが登録されました。

表のコメント追加

COMMENT ON TABLE hoge IS 'ほげ';

カラムのコメント追加

COMMENT ON COLUMN hoge.hage IS 'テスト';

表のタイトルの登録に関しては、前回、viewで書いたコメントの変更の仕方と同じですね。

2008/04/23

[Google イベント]Google Developer Day 2008 Japan 開催が決定

今年も来ました!!
Google Japan Blog: Google Developer Day 2008 Japan 開催決定より

昨年、世界10都市で同時開催された Google Developer Day が今年は13都市に増え、日本では6月10日に横浜での開催されることが決定いたしました。

via:Google Japan Blog: Google Developer Day 2008 Japan 開催決定

実は、去年も参加してめちゃくちゃおもしろかったんですよ~~♪(* ̄ー ̄)v

また、来年も開催してくれないかなーって思っていたのですが、今年も、開催するなんて、マジ興奮です。

なんとか予約することができました。

去年は、GoogleMapsとそれ以外の、セッションの二つに分かれてプログラムが進んでいましたが、今年は、GoogleGearsや、GoogleAppsEngineなど、去年、なかったプログラムもあって、超ワクワク。

開催日は、6月10日なのですが、早くこないかな~~~

詳しい情報は、こちらで見ることができますよ。

登録は、こちらから。

ただし、登録に先立って、GoogleGroupsに参加する必要があるので注意してくださいね。

2008/04/22

[oracle]SELECT文でNLS_LANGを取得

環境変数でもあるNLS_LANGをSELECT文で確認したい場合
Olacle 文字コードによると、

SELECT VALUE
  FROM NLS_DATABASE_PARAMETERS
 WHERE PARAMETER='NLS_CHARACTERSET'
;

via:Olacle 文字コード

で取得できるようです。

いや~~~これで環境変数を調べる手間が省けるぞー。

2008/04/21

[oracle]spool offも書かないと!!

spoolを、onにしたならば、後で、offもしないと、メモリーに記録が溜まっていくような気がするのですが。。。

SearchMan:Sqlのメッセージをファイルに出力する

SQL*Plusを実行したメッセージなどを
ファイルに出力する方法です。

SQL>spool /home/oracle/xxxx.log

こんな感じです。

via:Sqlのメッセージをファイルに出力する
ちなみに、spoolをoffにするコマンドは、

SQL>spool off

こんな感じです。

2008/04/20

[oracle]日付に関するあれこれ

今日もgoogle gearsの使い方を書こうと思ったのですが、最近、仕事で、oracleで日付をいろいろな形で表示しなければならない機会があったので、それらの方法について書きたいと思います。

1.YYYY年MM月DD日と表示する。(年、日、月を、日本語で表示)

ORACLE 9iのSilverを参考にすると、

SELECT TO_CHAR(SYSDATE,'YYYY"年"MONTH DD"日"')
  FROM DUAL
;

via:オラクルマスター教科書Silver

と書かれていて、実際に実行してみると下のように表示されました。

2008年4月 17日

微妙に月と日の間に半角スペースが入ってしまっているので、REPLACEをかけて半角スペースを削除します。

SELECT REPLACE(TO_CHAR(SYSDATE,'YYYY"年"MONTH DD"日"'),' ')
  FROM DUAL;

実行をかけると、下のように表示されました。

2008年4月17日

これで半角スペースを除いて表示することができました。

ただ、問題点も残っていて、文字列が、20070401などの場合、2007年4月01日と返してしまい、日にちに0がついてしまうんですよね。

2007年4月1日と表示したい場合、どうすればいいのかまだわかっていません(ノ◇≦。)

2.曜日の表示。

曜日を表示するSQL文は、ORACLE小技箱によると、

select to_char(sysdate,'D') from dual;
-- 日曜を1,月曜を2とした数字

select to_char(sysdate,'DY') from dual;
-- 略式の曜日 AMERICAN_AMERICAで'WED'、JAPANESE_JAPANで'水'

select to_char(sysdate,'DAY') from dual;
-- 長い表記の曜日 'Wednesday'、'水曜日'

via:曜日を求める-ORACLE小技箱

と確かに実行すると、上のようにレスポンスが返ってきました。

3.日付にn時間を加算・減算。

日付に日にちを加算/減算する場合、日付型のまま、例えば、sysdate +/- nで表示することができるのですが、1時間加えたい、減らしたいという表現の仕方を知らなかったので、今回、調べました。

SAK Streetsの■時間の演算(時間加算、時間減算)によると、

・date 型、小数部で時間を管理している。
  jcdt date;

  jcdt := jcdt + 1 / 24; -- 1 時間加算
  jcdt := jcdt - 1 / 24; -- 1 時間減算

  select sysdate + 1 / 24 from dual;

  select to_char(
    sysdate + 1 / 24,
    'yyyy.mm.dd hh24:mi:ss'
    )
    from dual
  ;

via:■時間の演算(時間加算、時間減算)

ちなみに、分の加算/減算場合は、

・date 型、小数部で時間を管理しているので、24 * 60 = 1440 が分の単位となる。

  jcdt date;

  jcdt := jcdt + 1 / 1440; -- 1 分加算
  jcdt := jcdt - 1 / 1440; -- 1 分減算

  select sysdate + 1 / 1440 from dual;

  select to_char(
    sysdate + 1 / 1440,
    'yyyy.mm.dd hh24:mi:ss'
    )
    from dual
  ;

via:■分の演算(分加算、分減算)

というわけで、日付に1時間30分追加したい場合、下のように記述します。

SELECT sysdate + 90/1440
  FROM dual;

これだと、2008-04-17と表示されてしまい、時刻がきちんと表示されてないので、TO_CHARを使います。

SELECT to_char(sysdate + 90/1440,'yyyy/mm/dd/hh24:mi')
  FROM dual;

と書くことによって、2008/04/17/23:38という形で表示されます。

2008/04/19

[google Gears]カラム名の取得

昨日、fieldCountメソッドの紹介をしました。

今日は、カラム名の取得方法について。

Google Gears APIによると、fieldName(int Index)で取得することができます。

var rs = db.execute('select * from hoge');
//カラム数をn個とする。
while (rs.isValidRow()) {
  for(var k;k<rs.fieldCount();k++){
    alert(rs.fieldName(k));
  }
rs.next();
}
rs.close();


fieldNameメソッドは画面にカラム名を表示させたり、デバッグ表を作るのに便利なメソッドです。

2008/04/18

[Google Gears]fieldCount()メソッドでカラム数をGet

前々回の記事で、SELECT文を実行して、結果を表示する方法について書きました。

ですが、前に紹介したのは、カラム数分、fieldメソッドを書かなければならず、使いやすいとは言い難いものでした。

そこで、今日は、もっと簡略した方法について紹介したいと思います。

カラム数がたくさんあるとき、または、カラム数がわかっていない場合、DataBase APIによると、fieldCountメソッドを使って、簡略化することができます。

前回は、

var rs = db.execute('select * from hoge');
//カラム数をn個とする。
while (rs.isValidRow()) {
  alert(rs.field(0) + rs.field(1) + rs.field(2) + ・・・ + rs.field(n));
 rs.next();
}
rs.close();

と書いたのですが、fieldCountを使うと、

var rs = db.execute('select * from hoge');
//カラム数をn個とする。
while (rs.isValidRow()) {
  for(var k;k<rs.fieldCount();k++){
    alert(rs.field(k));
  }
rs.next();
}
rs.close();

と書き換えることができます。

一回、一回、Indexを書かなくていいので、大変役に立っているメソッドです。

2008/04/17

[Android]Google デベロッパー交流会に参加しまーす。

今日も、Google Gearsについての内容を書こうと思っていたら、メールボックスにとってもうれしいメールがo(*^▽^*)o~♪

Google Japan Blogの「Google Japan Blog: デベロッパー交流会(第 6 回)開催のお知らせ、今回のテーマは「 Android SDK 」です」で4月24日にセミナーが開催されることを知って、どーしても行きたくなって、申し込みをしたら、参加OKメールが到着したのです。

ヤタ!!超うれしい、楽しみです。午後休とって、勉強しにいこぉーっと♪(* ̄ー ̄)v

2008/04/16

[google gears]SELECT文の結果をFetchする。

今日も、google gearsの使い方について。

tableのデータを取り出す方法について書きたいと思います。

すでに、tableにデータが入っていた場合、

var rs = db.execute('select * from hoge');
//カラム数をn個とする。
while (rs.isValidRow()) {
  alert(rs.field(0) + rs.field(1) + rs.field(2) + ・・・ + rs.field(n));
  rs.next();
}
rs.close();

という流れで取り出すことができます。

まず、isValidRowメソッドで行を取り出すことができるかどうかの確認を行い、レコード(行)が存在するまでwhileでループします。

そして、while文の中では、fieldメソッドを使ってフィールドの値を取り出し、nextメソッドを使って、次のレコードに進んでいきます。

ここで、重要なのは、nextメソッドを使わないと、無限ループが発生し、ループが終了しません。

(ObjectBrowserを作っているときに、これに気づかなくて、ずっと無限ループにはまってました(ノ◇≦。))

while文の終了後も重要なことがあって、closeメソッドを使う必要があるようです。

closeさせる理由がよくわかっていないのですが、Google Gears Apiで推奨されていました。

Releases the state associated with this result set
You are required to call close() when you are finished with any result set.

via:Database Module API

PL/SQLだと、カーソルのopenをして、次にFetchして、最後にcloseするのですが、closeをする理由は、再度カーソルを使いたい場合、closeしないと再openできないという理由からcloseをするのですが、同じ理由なのかな( ̄ー ̄?)

ちなみに、上のwhile文で、fieldメソッドに直接数字を記入して使っているのですが、一般にこの方法は、カラム数がたくさんある場合や、何個あるかわからない場合、あまり便利な方法とは言えません。

次回は、直接Indexを書かずにfieldメソッドを使う方法について書きたいと思います。

2008/04/15

[google gears]SQLは、openしてexecuteで実行

前々回、google gearsで、SQL文を実行する前に、Objectの設定をする必要性を書きました。
そこで、今回は、SQL文の実行をしてみたいと思います。

Database Module APIを参考にすると、google.gears.factory.create('beta.database')を作成後、database名でopenします。

流れとしては、こんな感じ。

var db = google.gears.factory.create('beta.database');
db.open('database-test');

via:Database Module API

database名は、書かずに、

db.open();

と書いても、エラーは発生しません。

話は飛んでしまいますが、2行目のdb.open('database-test');は、「database-testというdatabase命をオープンしてください。」という意味ですが、オープンする前に、該当する名前のdatabaseを作成する必要があるのでしょうか?

答えは、Noで、open文を書いた瞬間に、自動的にdatabase名でdbを作ってくれるんですね。
しかも、一回作った後、再度、openメソッドを使うと、すでに作成されているdatabase名をopenしてくれます。

database fileは各OSによって、作成される場所が違ってくるようです。

Windows Vista - Internet Explorer
Location: {FOLDERID_LocalAppDataLow}\Google\Google Gears for Internet Explorer
Example: C:\Users\Bob\AppData\LocalLow\Google\Google Gears for Internet Explorer

Windows XP - Internet Explorer
Location: C:\Documents and Settings\\Local Settings\Application Data\Google\Google Gears for Internet Explorer
Example: C:\Documents and Settings\Bob\Local Settings\Application Data\Google\Google Gears for Internet Explorer

Windows XP - Firefox
Location: C:\Documents and Settings\\Local Settings\Application Data\Mozilla\Firefox\Profiles\{profile}\Google Gears for Firefox
Example: C:\Documents and Settings\Bob\Local Settings\Application Data\Mozilla\Firefox\Profiles\uelib44s.default\Google Gears for Firefox

via:Location of Database File(一部抜粋)

ここでミソなのは、firefox、IEとブラウザによって変わってしまうこと。
同じにすればいいのにーと思ってしまうのですが。。。

後、open時に引数を入力せずに、実行した場合も、上のディレクトリにdatabaseが作成されます。

作成されるファイル名ですが、「入力したdatabase名#database」で作成されるようです。
なので、引数がない場合は、「#database」で作成されます。

で、話が横にそれましたが、dbをopenした後、いよいよsqlの実行です。

SQL文は、executeメソッドを実行することで、発行することができます。

var db = google.gears.factory.create('beta.database');
db.open('database-test');
/* テーブルを作成する */
db.execute('create table if not exists Test' + ' (Phrase text, Timestamp int)');
/* insertでデータを登録 */
db.execute('insert into Test values (?, ?)', ['Monkey!', new Date().getTime()]);
/* selectでデータを取得 */
var rs = db.execute('select * from Test order by Timestamp desc');

via:Database Module API

rsには、実行結果であるResultSetがセットされます。

ここで、上の文の一番最後に、drop tableを実行したとしてもdatabaseが削除されるわけではなく、テーブルが削除されるだけです。

databaseまるごと削除は、ディレクトリからたどって直接削除する方法があります。

また、上のinsert文で、valueの後が?になって、その後ろに配列が書かれていますが、?をエスケープして、?と同じ順番に配列の値を対応させているようです。

これは、Securityで書かれていましたが、SQLインジェクションを避けるためにとった方法らしいです。

でも、どうして、

db.execute('insert into Test values (' + '"Monkey!"' + ',' + new Date().getTime() +')');

とは、書かずに、

db.execute('insert into Test values (?, ?)', ['Monkey!', new Date().getTime()]);

と書くのでしょうか??

こう書くことによって、SQLインジェクションの直接の原因となる要素を取り除くことができるんだと思うんですけど、それが何かはわからないっす。

というわけで、パラメータがn個の場合、

db.execute('insert into Tablename values (?1, ?2,・・・,?n)', [p1, p2,・・・,pn]);

と書くようです。

select文の結果は、fetchすれば値が取れるのですが、それについては次回書きたいと思います。

2008/04/14

[blogger]blog上にgoogle talkウィジットを装備

そうそう、ちょっと前に、TechCrunchのGoogle Talk、ブログやサイトでチャットが楽しめるChatbackウィジェット公開という記事で、Blog上で、Google Talkにログインしているかどうか確認できるツールが紹介されていて、さっそく装備しました。



ログインしていると、緑色に点灯します。

普段、仕事をしているので、なかなか、ログインできないのですが、ブログやサイト上で、著者のログイン状態の確認ができて、しかも、コミュニケーションとることができるなんて、すごいなと改めて記事を書いて思いました。

2008/04/13

[Google Gears]Databaseは、beta.databaseをcreateしてからスタート

昨日に引き続き、今日もGoogle Gearsネタ!!

いろいろな機能があるんだけど、まずは、Databaseセクションを中心に書きたいと思います。

使い方を書く前に、まず、OracleやWindows SQL Serverと明らかに違う特徴だなーと思ったのは、JavaScriptでDBを操作することができる点です。

Oracleなどは、一回、サーバーサイドの言語(asp、coldfusionなどなど)で処理を行わなければならないのですが、Google Gearsの場合は、クライアントで処理できる点が実に魅力的♪(* ̄ー ̄)vだと思いました。

というわけで、どんな風に使うのか、気になったので、APIを調べました。

Google Gearsは、sqliteをベースとした、Databaseシステムなので、SQLiteに準拠する実行文を書けば基本的には、OKだと思います。
(SQLiteがサポートしているSQLコマンドは、こちら)
(あと、例外に関するサポートに違いあり!!)

で、SQL文の書き方を把握することができたのですが、一体、どうやってJavaScript上で実行するのか??

それには、まず、実行する前に、Objectを作る必要がありそうです。


var db = google.gears.factory.create('beta.database');


上のPGは、Exampleを参考にしたのですが、どうやら、JavaScriptの変数を一個用意して、databaseの操作を行うObjectの設定を行う必要がありそうです。

下が、参考にしたExampleです。

<script type="text/javascript" src="gears_init.js"></script>
<script type="text/javascript">
var db = google.gears.factory.create('beta.database');
db.open('database-test');
db.execute('create table if not exists Test' + ' (Phrase text, Timestamp int)');
db.execute('insert into Test values (?, ?)', ['Monkey!', new Date().getTime()]);
var rs = db.execute('select * from Test order by Timestamp desc');
while (rs.isValidRow()) {
  alert(rs.field(0) + '@' + rs.field(1));
  rs.next();
}
rs.close();
</script>

via:Database Module API

JavaScriptで実行する場合、何よりもまず必要なのは、Objectを作ること。
それから、dbをopenして、SQLを実行して、Fetchして、最後にクローズしていく流れになっていくと思うのですが、具体的な書き方に関して、次回以降に書きたいと思います。

2008/04/12

[Google Gears]インストールされているかどうかの確認

GoogleGearsに対応したObjectBrwoserをそろそろ公開しようと思ったので、Google Gears APIで学んだことを書いていきたいと思います。

Google Gearsを使うこと際に重要になってくるのは、ブラウザーがすでにGearsをインストールをしているかどうかです。

サイトを訪問している人が、すでにGearsをインストールをしているかの確認は、Getting Startedを読んでみると、下のソースで確認することができます。

<script src="gears_init.js"></script>
<script>
  if (!window.google || !google.gears) {
    location.href = "http://gears.google.com/?action=install&message=<your welcome message>" + "&return=<your website url>";
  }
</script>

via:Nuts and Bolts: Detecting and Installing Google Gears

<your welcome message>の部分は、任意の文字列を記入し、
<your website url>は、インストールを行った後、リダイレクトするURLを記入します。

もしインストールされていない場合、下のような画面に遷移すると思います。

Gears_NO001

2008/04/11

[online powerpoint template]新しいシート追加

会社で資料を作る機会があったので、どうせならと思い、エクセルではなくhtmlで作成。

そして、ただのhtmlではなく、プレゼン用として使えないかと思い、プレゼンシート用のテンプレートを作り、google codeにアップロードしました。

こちらから参照することができます。

ちなみにシートですが、下のようなデザインにしました。

templateNo002

クリックするとフルスクリーンでみることができます。

2008/04/10

[JavaScript]スクロールを移動させる。

前回、JavaScriptでスクロールの移動をさせる日記を書きました。

後になって気が付いたのですが、肝心の位置が取得ができたとしても、取得した値までスクロールさせたい場合どうするんだろうーと。

そこで、ちょっと調べたら@ITのJava Solution 会議室に答えがありました。

<div id="hoge">
      ...
</div>
というのがあるとしまして、
    document.getElementById("hoge").scrollTop = 100;
みたいなイメージです。

via:Javascriptでスクロールバーのスクロール位置を決められますか?

で、試しに実行してみると確かにスクロールが移動しました。

たぶん、firefoxだと動かないんだろうなー(/_<)

2008/04/09

SeeqPodガジェットが外人に叩かれていた!!

google ガジェットを公開しているとコメント欄にご要望を頂くことがあります。
今回、とても驚いたことがありました。
それは、なんと、なんと、SeeqPodガジェットのコメント欄に外人のコメントがあったのです。

SeeqPod_claim

こちらで確認することができるのですが、いや~~~、びっくりしたー。

やはり、海外で展開されているサービスをガジェットにすると、コメント欄も外国の方にしていただけるんだなーということを冷静に学びました。

で、肝心の内容ですが、

the Other SeeqPod gadget is better
The other SeeqPod gadget is the real thing, embedded in your iGoogle page. It's by Derrick Sakima. This one just takes your search and launches SeeqPod.com in another window.

Play without opening new window?
seeqpod is a nice app for streaming tunes...it finds most anything i can think of. is there a way the gadget could be expanded to play on my igoogle screen instead of opening a new window?


via:コメント欄


と書かれていて、まず、下の方からいくと、「他のウィンドウを開かずにiGoogle上で検索することができないか?」ということに関してで、上の方が、それに対する回答みたいな感じで、「Derrick Sakimaという方が作ったgadgetは、他のページを開かずに検索結果を表示できるよ。」みたいな感じで書いておりました。(他のガジェットを推薦していたのにもかかわらず、星3つつけていただいてました。あざ~~~す♪)

2つのコメントから予想するに、他のウィンドウで検索結果を表示するよりも、同一画面内で、表示された方が、便利だと感じるじゃーないかと思いました。

これって日本だとあまり気にされる方が少ないように思えます。

というのも、同じ検索系のgoo辞書は、検索結果を他のウィンドウに表示するようにしているのですが、iGoogle上で開いてほしいというコメントが一つもなかいからです。

細かい点かもしれませんが、国によっても何が便利で不便かというのが違うじゃーないかなーと思い、興味深く感じました。

ちなみに、今回のコメントに関する実現に関してですが、おそらくSeeqPodのAPIを利用すれば、できるのではないかと。

2008/04/08

[ORCLE]CASE式には、書式が2つあった

SQLで、CASE式を使う機会があったので、まとめてみたいと思います。
まず、ORACLE 9i Silverを参考にすると

SELECT  名前
          ,  受験科目
          ,  CASE  点数  WHEN  80  THEN  '合格'
                  WHEN  50  THEN  '追試'
                  ELSE  '不合格'
              END
    FROM  テスト
  WHERE  学籍番号  =  200608

というような感じで書かれていました。

上の文は、単純CASE式と呼ばれているらしく、他に、検索CASE式という書き方もあるようです。

--検索CASE式
          CASE WHEN sex = '1' THEN '男'
                    WHEN sex = '2' THEN '女'
          ELSE 'その他' END


via:CASE式のススメ

単純CASE文は、ただカラムの値によって、条件を分岐している(DECODEに近い)のに対して、検索CASE式は、より細かい式の評価もしてくれると解釈したのですが、間違っているかなー。

ちょっと自信ないっす(・_・?)

2008/04/07

音楽ランキングtop5終了!!

だいぶ前に、iGoogle上で、音楽のランキングを確認したいと思い、音楽ランキングtop5を作ったのですが、毎回、毎回、iGoogleを立ち上げる度に、会社のアクセス制御に引っかかってしまって、ちょっとうざいなーと思ったので、今回、削除することにしました。

すごく勝手な理由ですが、今まで使って下さった方、ご利用いただきましてありがとうございました♪(* ̄ー ̄)v

2008/04/06

[ORACLE]初めて出た、ORA-00001

昨日、初めて、ORA-00001エラーが発生しました。

ORA-00001: unique constraint (スキーマー名.制約名) violated

ぐぐってみると、一意制約違反とのことです。

orz

2008/04/05

[ORACLE]あったじゃん。FOR IN LOOP

昨日、T.SATOさんから、

PL/SQLにもforやwhileループあるはずだよ!

via:T.SATOさん

とアドバイスをもらって、リンク先を見たらリアルにあった。

あったのかよ!!
というわけで、さっそくFOR LOOP文作りました。

DECLARE
  BEGIN
    FOR ln_Count IN 0..9 LOOP
      DBMS_OUTPUT.PUT_LINE(ln_Count);
    END LOOP;
END;

実行結果は、下のようになりました。

0 
1 
2 
3 
4 
5 
6 
7 
8 
9 

FORの隣にある変数は、DECLAREで宣言しなくてもLOOPの中で機能することができるようです。
(機能しなかったら逆にやばいんだけど。)

試しに、DECALRE文で変数宣言しても使うことができました。

DECLARE
    ln_Count NUMBER;
  BEGIN
    FOR ln_Count IN 0..9 LOOP
      DBMS_OUTPUT.PUT_LINE(ln_Count);
    END LOOP;
END;

実行結果は、もちろん、さっきと同じになりました。

さらに変数をNUMBER型からVARCHAR2型に変換しても実行することができました。

DECLARE
    ln_Count VARCHAR2(1);
  BEGIN
    FOR ln_Count IN 0..9 LOOP
      DBMS_OUTPUT.PUT_LINE(ln_Count);
    END LOOP;
END;

ここで、気になったのですが、LOOPを抜けた後の変数の値はどうなってしまうのでしょうか?
最初、9になるんじゃーないのかなと思って、下のように実装して実行しました。

DECLARE
    ln_Count NUMBER;
  BEGIN
    FOR ln_Count IN 0..9 LOOP
      DBMS_OUTPUT.PUT_LINE(ln_Count);
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('hoge1');
    DBMS_OUTPUT.PUT_LINE(ln_Count);
    DBMS_OUTPUT.PUT_LINE('hoge2');
END;


するとどうでしょう。

0
1
2
3
4
5
6
7
8
9
hoge1
hoge2

変数が初期化されてnullになっちゃってるよ。

ループを抜けた後、変数の値を保持していると思って、そのまま実装していく可能性があるので、気をつけないとヤバイっす。

大事なのは、実行してみることですね(* ̄∇ ̄*)

2008/04/04

[ORACLE]JavaScriptのFOR文を実装する

ORACLEのPL/SQLでJavaScriptのFor文にあたる実装ができないものかと考えてみました。

例えば、JavaScriptで

//nは定数
for(var i=0; i<=n;i++){
 処理・・・;
}

と書かれていた場合、同じ処理をPL/SQLで表現するには、

DECLARE
 ln_Count NUMBER ;
BEGIN
 ln_Count := 0;
 --nは定数
 LOOP
  EXIT WHEN ln_Count >= n;
  処理・・・;
  ln_Count := ln_Count + 1;
 END LOOP;
END;
/

と書かねばならず、同じことを違う言語で表現するにしても手間が全然違って、PL/SQLの場合、for文を表現すには、メンドクセ~なーと思ってしまう今日この頃。

2008/04/03

[ORACLE]SELECTしてINSERT

今日初めてSELECT-INSERT文を使いました。

あるTABLEから一定量のデータを登録したい場合、本来ならば、

--1回目のINSERT文
INSERT INTO hoge(column) VALUES(data1);
--2回目のINSERT文
INSERT INTO hoge(column) VALUES(data2);
--3回目のINSERT文
INSERT INTO hoge(column) VALUES(data3);



--n回目
INSERT INTO hoge(column) VALUES(datan);
COMMIT;

と書かなくちゃーいけなくて、これだと、ものすごく手間がかかってしまいます(ノ◇≦。)

そこで、SELECTしたデータをINSERTすることによって何回も書く手間を省くことができます。

INSERT INTO hoge(column) VALUES(
  SELECT data
    FROM hoge2
);

INSERT INTO hoge(column)
  SELECT data
    FROM hoge2
;
COMMIT;

さらに上の方法を用いて、特定のカラムに定数を登録したい場合。

INSERT INTO hoge(column1,column2) VALUES(
  SELECT data
         , 'Constant_Value' --定数
    FROM hoge2
);

INSERT INTO hoge(column1,column2)
  SELECT data
         , 'Constant_Value' --定数
    FROM hoge2
;
COMMIT;

と書くことによって、定数(上の場合、column2に定数Constant_Valueが登録)を登録することができますヾ(=^▽^=)ノ

2008/04/02

[JavaScript]スクロール位置の取得

昨日、スタイルシートの「表示モード」とJavaScriptを使って表示モードを取得する方法について書きました。

で、どーしてこれが必要なのかというと、scrollTop、scrollHeight、scrollWidthなどを使いたい場合、表示モードによって、実装の仕方が変わってくるので、取得する必要があるのです。

IE6では標準モードの場合、「document.body」の属性取得で不適切な値が返されることがあります。
document.body.clientWidth/clientHeight/scrollWidth/scrollHeight などなど。

via:スクロール位置取得:kl_slx/y()

というわけで、スクロールの位置を取得したい場合、

/* IEの場合 */
var hoge;
//標準モードの場合
if(document.compatMode == "CSS1Compat"){
  hoge = document.documentElement.scrollTop;
//互換モードの場合
}else{
  hoge = document.body.scrollTop;
}

と書かないと、取得できない場合もあるようです。

firefoxの場合は、どうやって実装するんだろー(??)

時間があったら、後で検証してみたいと思います。

[google Weblogs]google版 twitterか??

さっき、buzz bloggerを読んでいて、ものすごいことを発見しちゃいました。

google版twitterが、2008年後半にリリースされるかもしれないという記事が書いてあったのです。
Blogger Buzz: Announcing Google Weblogs (beta)という記事なのですが、
そこには、

Today we’d like to offer you a sneak peek at an exciting new product we’ve been working on: Google Weblogs.


via:Announcing Google Weblogs (beta)

と書かれていて、イメージも掲載されていました。



さらに記事には、いくつかの機能も紹介されていました。

1.新しいポストが一番上に掲載
2.ページランクを気にすることなくサーチ結果に直接投稿
3.indexのページからポストされたものの中から関連性のある記事をセレクト

などなど、実際に使ったわけではないので、間違っている点もあるかもしれませんが、楽しみです。

早くリリースされないかなー|* ̄ー ̄|

2008/04/01

[JavaScript]CSSの表示モードの確認

スタイルシートに「表示モード」というのがあることを知りました。
TAG indexの「表示モードの違い」によると、

一般的なブラウザ(古いバージョンを除く)には、「標準モード」と「互換モード」という2つの表示モードが備わっています。
(DOCTYPE宣言の記述にURLを含めるかどうかにより、ブラウザ側の表示モードが自動的に切り替わる仕組みになっています。)

via:表示モードの違い

と書いてあって、モードの違いにより、スタイルシートの解釈にも影響を及ぼしてまうようです。

そこで、JavaScriptで、表示モードの確認ができないかと思い、ぐぐった結果、下の方法で取得できることがわかりました。

document.compatMode

ブログ内で実行できるように実装しました。

CSSの表示モード:


IE、firefoxでは、標準モード(Standard)のCSS1Compat、または、互換モード(Quirks)のBackCompatを返します。

また、DOCTYPE宣言方法ですが、とみぞーノートさんのブラウザのレンダリングモードより、

・Standardモードが選択されるケース
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
・Quirksモードが選択されるケース
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

via:ブラウザのレンダリングモード

をhtmlより前に宣言することで、モードを決めることができるようです。

で、これが何に役にたつかというと、ちょい別のテーマになってしまうので、明日の記事に書きたいと思います。