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

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