2009年9月 6日 (日)

PL/SQL で Python Challenge Level 18 - 完

ということで、Python Challenge Level18の最終回。
前回報告した通り level 18 はPL/SQLだけで解けます。今回は問題の元ネタの抽出と回答を抽出した後の確認はOSに付属している機能を使ったが大切なのは問題の元ネタから解答を抽出する所なので。

SQL*Plusから実行したストアドプロシージャで問題を解いたところ....例によってヒントになりそうな部分はもやもやさせてます。 :)


Level18_exec

ヒントになりまくりの答えのスナップショット。(これ以外にも私のブログにヒントになる記事もあるのだが・・・・・それは書きませんよ。。。。)

ちなみに絵を見れば分かると思いますが、MacOS XからX11のX forwordingを使って今回利用したLinuxのDesktopを表示/操作しています。X11のxtermからssh -Y user@hostで接続してgnome-sessionを実行しているだけ。


Level18_eureka

Python Challenge Level19へつづく!(?)

| | | コメント (0) | トラックバック (0)

2009年9月 2日 (水)

PL/SQL で Python Challenge Level 18 解けた

一年以上間が空いてしまったが・・・Python Challenge Level18はPL/SQLだけで解けますよん。ヒントになるようなならないようなモヤモヤした記事は明日にでも。。

| | | コメント (2) | トラックバック (0)

2008年5月 7日 (水)

PL/SQL で Python Challenge Level 18 う〜〜〜ん。

やることは分かったのだがPL/SQLでは重要な部分(pythonなら一発だけど)を手作りしないとならない。。。とりあえず適当に作ってはみたもののまだ思うような結果にはなっていない。。だが、そこさえクリアできればlevel18はPL/SQLだけで解けるはず。。。。。ということで暇を見て実装中。といってもその暇がなかなか取れなくなりそうな予感も。。。まあ、今回のネタはおもしろそうなので、少しづつでも進めて行きますよ。。。w

| | | コメント (0) | トラックバック (0)

2008年4月26日 (土)

PL/SQL で Python Challenge Level 18 わかちゃったかも・・

Level18は以外と簡単かも〜〜、Pythonならば。と。
当然だよね。Python ChallengeなんだからPythonを使って解くことを前提に作られてるのは。。。。

しかし、今回はもしかするとPL/SQLだけで全部解けちゃうかもしれない・・・久々だ〜。一部はかなり苦労してガリガリ作り込まなければならないと思われるのだが・・・その方法で上手く解けるという自信は70%。チャレンジしてみますよ〜〜。連休中にロジックを考えとく。。。

次回へつづく。;)

| | | コメント (0) | トラックバック (0)

2008年4月22日 (火)

PL/SQL で Python Challenge Level 17 - 完

さて、少々間があいてしまったが、Python Challenge Level17の最終回。

前回、つまらないところでモタモタしてしまったが、Oracle Application Express 3.0.xを使わず、単純に mod_plsqlを使えばいいじゃんと言うことで。。。。

Level17は、以前にも書いたがWeb Applicationを書いたことのある人なら簡単に解けると思います。
今回は一部を除き、約90%がPL/SQL、残りをJava stored procedureで処理した。;)

ということで答えを導きだしたスクリーンショット。(答えはぼかしてますよ!)

Python_level17

次回、Python Challenge Level 18はこれまた気が向いたときにても。。。Enjoy Python Challenge!

| | | コメント (0) | トラックバック (0)

2008年4月13日 (日)

PL/SQL で Python Challenge Level 17 #2 - 解けた!

さて、前回、解き方は見えたような気がすると書いたがいろいろな罠?に見事に引っかかったが解けました。はい。
今、Level18の問題が見えたのだが、また画像問題なのかな?

Level17は、Web Applicationを作った経験のある方ならLevel17の質問の画像自体がヒント。
なんですが、2重、3重の仕掛けがあるのでイライラするよ。ですが、基本的にはいままでの問題を解いてきたテクニックやコードを再利用すれば十分なので特に新しいことが必要でもない。。。

ということで、次回のPL/SQL で Python ChallengeはLevel17のヒントにならないヒント。でLevel17を締めくくろう。


以下のスクリーンショットは、最後の仕掛けを通り抜ける為のヒントを取り出す事に成功した場面。Level18のURLを導きだした時のスクリーンショットではありません。:)
Level17_no2

| | | コメント (0) | トラックバック (0)

2008年3月26日 (水)

PL/SQL で Python Challenge Level 17

さて、ココログのデータベースのデフラグ?作業でログインできなかったので今書いてますが。
Level 17、少々ハマったが解き方は見えた(ような気がする)ので次回はその経過でも。

Level 17は、Web Applicationを作った経験のあるかたなら案外すんなり解けるかもしれない。
問題の画像にそのすべてのヒントが!


Enjoy! Python Challenge!
(Python じゃなくても楽しめるのだ!)

| | | コメント (0) | トラックバック (0)

2008年3月24日 (月)

PL/SQL で Python Challenge Level 16完

前回の続きです

さて、Level 16のページには、"let me get this straight" というタイトルが付けられている。これ自体が大きなヒント。なのでこれ以上は何も言うまい。

問題の解くjavaアプリケーションの内容は、以前、Level 11の処理の流れを書いていたが、その3、4以外の部分は同じ。
但し、Level7で利用した Level7.getBfile()とLevel9で作成したLevel9.writeImageFile()というファンクションとプロシージャを以下のPL/SQLパッケージに纏めた。

CREATE OR REPLACE PACKAGE PYTHONCHALLENGE_UTL AS

FUNCTION getBfile
(
i_dir_name IN VARCHAR2,
i_file_name IN vARCHAR2
) RETURN BFILE;

PROCEDURE writeImageFile(
directoryName IN VARCHAR2,
fileName IN VARCHAR2,
srcImage IN OUT NOCOPY BLOB
);

END PYTHONCHALLENGE_UTL;

CREATE OR REPLACE PACKAGE BODY PYTHONCHALLENGE_UTL AS

FUNCTION getBfile
(
i_dir_name IN VARCHAR2,
i_file_name IN VARCHAR2
) RETURN bfile AS
v_file BFILE;
BEGIN
v_file := BFILENAME(UPPER(i_dir_name),i_file_name);
RETURN v_file;
END getBfile;

PROCEDURE writeImageFile(
directoryName IN VARCHAR2,
fileName IN VARCHAR2,
srcImage IN OUT NOCOPY BLOB
) IS
file utl_file.file_type;
BEGIN
file := UTL_FILE.FOPEN(UPPER(directoryName), fileName, 'w', 32767);
DBMS_LOB.OPEN(srcImage, DBMS_LOB.LOB_READONLY);

DECLARE
v_raw RAW(32767);
amount INTEGER;
offset INTEGER;
BEGIN
offset := 1;
LOOP
amount := 32767;
DBMS_LOB.READ(srcImage, amount, offset, v_raw);
UTL_FILE.PUT_RAW(file, v_raw, true);
offset := offset + amount;
END LOOP;
EXCEPTION
WHEN no_data_found THEN
NULL;
WHEN OTHERS THEN
UTL_FILE.FCLOSE(file);
DBMS_LOB.CLOSE(srcImage);
RAISE_APPLICATION_ERROR(-20001, sqlerrm());
END;

UTL_FILE.FCLOSE(file);
DBMS_LOB.CLOSE(srcImage);
END writeImageFile;

END PYTHONCHALLENGE_UTL;
/

上記のパッケージをJava Stored Procedureから利用するわけです。javaのソースコードは載せませんよ。ネタバレになっちゃいますから。

次に、デプロイしたjava classは以下のようにしてJava Stored Procedureとして定義します。

CREATE OR REPLACE PACKAGE LEVEL16 AS
FUNCTION getResult RETURN NUMBER AS
LANGUAGE JAVA NAME 'jp.macdeoracle.Level16.getResult() return java.lang.boolean';
END LEVEL16;

では、SQL*Plusから実行してみましょう!

Last login: Sun Mar 23 20:29:41 on ttyp2
Welcome to Darwin!
G5Server:˜ discus$ ssh oracle@corydoras
oracle@corydoras's password:
Last login: Sun Mar 23 20:31:49 2008 from 192.168.1.19
[oracle@corydoras ˜]$ cd python_challenge
[oracle@corydoras python_challenge]$ ll
合計 264
-rw-r--r-- 1 oracle oinstall 254006 3月 23 16:26 level16.gif

[oracle@corydoras python_challenge]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on 日 3月 23 20:58:34 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.

> conn scott/tiger
接続されました。
SCOTT> l
1 select
2 case
3 when level16.getResult() = 1 then '成功!'
4 else '失敗!'
5 end as "Level16"
6* from dual
SCOTT> /

Level16
---------
成功!

SCOTT> !ls -l
合計 504
-rw-r--r-- 1 oracle oinstall 254006 3月 23 16:26 level16.gif
-rw-r--r-- 1 oracle oinstall 239515 3月 23 21:02 level16_result.png

SCOTT>

これだけでもかなりのヒントになっているような気もしますが。。。
MacOSXのChicken of the VNC(MacOSX向けのVNC Client)経由でLinux(CentOS5)にある結果を確認!


Level16_res1

Level16_res2


ということで、Python Challenge Level 16完。 Level 17は気が向いたら載せると思います。 
Enjoy Python Challenge!

| | | コメント (0) | トラックバック (0)

2008年3月23日 (日)

PL/SQL で Python Challenge Level 16 - 2年5ヶ月ぶり

そう、あれは、このブログをはじめたころ、Oracle10g R1 for MacOSX ServerとPL/SQL(画像処理関係はjava stored procedure)を利用し、Python Challengeに PL/SQLでチャレンジしていたっけ〜〜。遠い目。

アクセスログを見ていたら最近、またPython Challengeのキーワード検索が多くヒットしているのにびっくり!。
前述のエントリを書いていたのが約2年半前になるわけですから! ということで、久々にちょっとだけ再開してみようかと。。Level 16を見てみる。


Level 16の問題の画像を見ると、いかにもわざとらしい柄というか模様が目につく!。

で、Level 16のページタイトルもいつものようにヒントになっている。

画像にある模様を眺めつつ、ページタイトルの英文(簡単な英文です)を読み試しにJavaだけで作ってみると、考え方はいいと思うのだが全然答えにはなっていない。。。

こうか? ん、、、、それとも、こうか? でも違う。 あ、横にしてたよ。。。あはは。。(^^;;
と独り言を言いつつ何とか答えを見つけました。。は〜〜っ。暫くぶりだと疲れるわ。

次回は答えは書きませんが、Level 16の結果をぼかしたスナップショットを載せる予定。

ちなみに、今回の環境は以下。
Database Server : Oracle11g R1 EE for Linux x86

開発用クライアント:
JDeveloper10g 10.1.3 for MacOSX
Oracle SQL Developer 1.1.3 for MacOSX
(Java Stored Procedure、PL/SQL package、Java関連で利用した)

準備が整ったらMacOSXからsshでLinuxのOracle11gへ接続して実行!
結果確認は、MacOSXのVNCからLinuxへ接続して確認するという面倒なことまでしてMacを絡めている。
(Mac de Oracle ですから! 笑)

尚、以前のように、なるべくPL/SQLやSQLレベルで問題を解いて行くがPL/SQLやSQLでは不可能な処理はJava stored procedureで行う。Level 16もLevel14と同じような処理になっている。

| | | コメント (0) | トラックバック (0)

2005年10月 7日 (金)

PL/SQL で Python Challenge 16 え、また画像ですかい。

Level16 ざっと眺めたら、また、画像ですか! (ちょいとやる気を無くす)
画像扱う問題だと以前に解いた問題と同じ流れになりがちで興味が薄れてきた。

先月中頃に、HTMLDB2.0 が Oracle10g R1 for MacOSX Serverのダウンロードページに追加されていたのでそちらのほうが面白そうだな。Oracle AS Portalのデータベースポートレットのような感じだが。。。

| | | コメント (0) | トラックバック (0)

2005年10月 4日 (火)

PL/SQL で Python Challenge 15 やっぱり書いておこう

「UTL_HTTPパッケージと正規表現で終わりそうだった」というのはLevel 15を解いた結果がどうなるか見えてしまったから、その先を(URLを求めるプログラム)プログラミングしてしまおうかなと考えていたためだったのだが、URLを直接求めるプログラミングを要求しているわけではないので、やはり Level 15のURLを探るために必要な答えを導きだす方法は書いておくべきだな。と考え直した。
(私はプログラミングなしで判ってしまったが、一般的にそれに気付く方は少ないよな〜と思ったためである。)

なので、Level 15 をちゃんと解くことにした。
ヒントとしては、Oracleの日付関連の関数を活用すればいい。
ここまで書けば答えを書いているようなものだが。。


今回は特別にLevel 15のHTMLにあるコメント(ヒント)を載せておく。
タイトルは、whom?
コメント(ヒント1):he ain't the youngest, he is the second
コメント(ヒント2):todo: buy flowers for tomorrow


(注意)
日本人にはヒント2がヒントにならないかもしれない。その日のために、花を買うような習慣のある方は少ないだろうから。でも私はすぐにピンときてしまったのだ。)



今回は、ストアドファンクションにした、javaも不要なので、MacOSX 10.4.2 Tigerに作成したOracle10g for MacOSX Serverで行える。
create or replace function level15
return varchar2
is
type date_tbl_typ is table of date index by binary_integer;
days date_tbl_typ;
y pls_integer := 1006;
ctr pls_integer := 0;
mmdd constant char(4) := '0126';
begin
while y<=1996 loop
if to_char(to_date(to_char(y)||mmdd, 'yyyymmdd'),'d') = 2 then
ctr := ctr + 1;
days(ctr) := to_date(to_char(y)||mmdd, 'yyyymmdd');
end if;
y := y + 10;
end loop;
return to_char(days(days.last-2), 'YYYY/MM/DD DAY');
end;
/


/Users/oracle> @level15

ファンクションが作成されました。

/Users/oracle> select level15() from dual;

LEVEL15()
--------------------------------------------------------------------------
1756/01/26 月曜日

/Users/oracle>

この結果が本当の答えではない。ヒント2に関するロジックを、あえてプログラミングしていない。
上記の結果を、ヒント2を元に調整する必要がある。(簡単でしょ!)調整した日付がURLを完成させるための「鍵」になるのだ。

今回は完全にネタバレですね。でもね。この問題プログラミングしなくても判る方は判るし、別な方はググるだけでも解けてしまうくらい単純なのであえてネタバレにしてみました。m(__)m

今度こそ本当に、Level 16へつづく。

| | | コメント (0) | トラックバック (0)

2005年10月 3日 (月)

PL/SQL で Python Challenge 15 いきなり完結編

Level 15 は、なんとプログラミングするまでもなく答えが判ってしまった。いきなり、Level 16のページが見えてしまった。(プログラミングもUTL_HTTPと正規表現程度で終わってしまいそうだったのでプログラミングする気も起きず) プログラミングもせずに、Level 15 は終了することにした。 だれの? というタイトルと、HTMLコメントを見れば、すぐに解決できる。簡単すぎて引っ掛けかと思ったほどだった。(実は深読みさせて迷路に誘い込むつもりだったのかもしれないが。。。。)


Level 16 へつづく。

| | | コメント (0) | トラックバック (0)

2005年10月 1日 (土)

PL/SQL で Python Challenge 14 完結編

さて、バグっていたプログラムを修正して完結!

Level14 はそのページにある画像が問題になっているのでLevel 11の時とやり方はほぼ同じ。違いは、サイズが、### × ### のファイルを新規に作成することだけ。できあがった画像を元に該当するURLをブラウザで開くと、意地悪ともクイズとも言えないようなページが開く。これも簡単なのですぐに Level 15 が見つかる。すぐに謎は解けると思うのでこれ以上は解説はしない。

定番になってしまった JDeveloper10g for Macでjava をdeploy
jdev

そして、java stored functionとしてラップして実行。(パッケージ化しているが管理しやすくするためである。パッケージ化しなくても問題はない) ユーザ定義関数として利用できるのでSQL文から直接利用できる。(でもディレクトリオブジェクトぐらいは引数で渡すようにしたほうがよかったかも。。)
result


ただ、正解の画像にある赤いドットが気になったので遊んでみた。(画像は小さいので拡大してみないと判りずらいと思う)このURLを叩けばその絵は間違っているとわざわざ教えてくれるのだが、こんな引っかけに引っかかるるのかな?〜(引っかかっている間もなく答えが判ってしまったのに。)




Level 15へつづく。

| | | コメント (0) | トラックバック (0)

2005年9月30日 (金)

PL/SQL で Python Challenge 14 Eureka!

Eureka!
Level 14 は、ヒントを見て仕掛けが判ってしまうほど簡単なのだが、プログラムがバグっていて答えがきれいに描画できていない。ただ、それが何かは判るような状態なのでURLを叩くと、正解! でした。 
完結編へつづく。(プログラムを修正してからだが。。)

| | | コメント (0) | トラックバック (0)

2005年9月25日 (日)

PL/SQL で Python Challenge 14 準備完了

Cubeをサテライトオフィスに移動させてしまったのでJava Stored Proedureが使える環境(MacOSX Panther 10.3.9)のOracle10g がなくなってしまった。Tiger 版の Oracle10g R2がいつリリースされるか不明なので外付けFIreWire DISKにMacOSX Panther(10.3.9)をインストールし、Oracle10g R1 for MacOSX Server環境を再構築した。今回は、PowerBook G4 1Ghz 1GB-ramにつないだ。これでPowerBookは MacOSX 10.4 Tiger と 10.3.9 Panther が起動できる環境になった。 さて、Level 14 再開しますか。。

| | | コメント (0) | トラックバック (0)

2005年9月11日 (日)

PL/SQL で Python Challenge 14 またグラフィック系か!

Level 14は、また画像処理系の問題みたいだ。なんとなく答えが見えたのだが。。。どうしよう、Oracle10g R1 for MacOSX Serverを無理矢理インストールしたTigerの環境では、java stored procedureが動作しない。Oracle10g R2もリリースされたが、今のところLinux X86, AIX, Solaris, HP-UX, Windowsがリリースされたが、MacOSXはまだだ。。。R2がリリースされるまで待つか。。。。。

| | | コメント (0) | トラックバック (0)

2005年9月10日 (土)

PL/SQL で Python Challenge 13 完結編

Level 13 は Level11Level 12の画像系問題ではなかったのでちょいと面白い。
簡単だしね。Level12 でセサミストリートまで辿り着いていればの話だが。。

Level 13 は、Level 12の解決には余分な情報が”伏線”となっている。

その伏線を Level 12で見ていれば Level 13 は 70%くらいまで解決しているのだ!。
そして、Level 13ではちょいといじわるな?! 罠がある。私は問題がバグっているのか、サイトがトラブルでも起こしているのかと思い、その翌日に再度アクセスしてみたくらいであった。
しかし、そのエラーメッセージこそが最大のヒントなのである。それに気づけばあとはプログラミングあるのみ! なのである。


前回も書いたがこの問題はPL/SQLだけで解ける。簡単に書くつもりだったが作っているうちにちょっとだけ凝ることにした。そのため全体では40行程度のファンクションとなった。



そのファンクションはSQL文から実行するようにした。4回発行だけで解けるので見かけ上は、Python を利用して4行で解くのとあまり変わらない(ソースコードの量は随分違うが。。。笑。)

プログラムは簡単なのでコードの欠片も載せないが、UTL_HTTPパッケージと、___type型を使う(伏せ文字のところはこの問題でどんなプログラミングをすればよいか見えた方ならすぐ判るはず!。)

level13

Pythonで解くと。。。
python13




今回は、これだけでは終わらない。最後の最後まで”いじわる”な問題である。(面白いけどね)

PL/SQL で Python Challenge 14 へつづく。



Python Challengeの問題の意地悪で思い出したが、その昔、ログインのバナーにクラッシュダンプようなバナーを表示するようにして、ログインした方を慌てさせるというおバカなことやっていたことを思い出した。

| | | コメント (0) | トラックバック (0)

2005年9月 9日 (金)

PL/SQL で Python Challenge 13 謎は解けた!

Python Challenge Level 13  
画像系の問題が連続していたが今回は違うね。Oracleさんも力を入れている分野だけどJavaを使わなくてもPL/SQLのパッケージだけで出来るな。凝ればかっこ良くつくれるが一番単純なプグラミングでやっつけようと思っている。恐らくPL/SQLでも10行程度でできるでと思う。(ちなみに、Python なら Global Module Index にあるモジュールをimportすれば4行で答えが得られる。)

次回、 Level 13 完結編につづく。

| | | コメント (0) | トラックバック (0)

2005年9月 7日 (水)

PL/SQL で Python Challenge 12 完結編

この問題、プログラミングは簡単なんだがそこに辿り着くまでが大変だった。

Level 12のページには画像が1つあるだけ。ページのタイトルも、ヒントなのか、そうではないのか意味不明。


Level 11 と同じなのか?(Level 11と同じな訳ないのだが。。)と感じさせるような画像なのである。しかし、なんのことはない、普通のjpgファイルだったのである。

一体どうすればいいのか?

どこに答えが隠れているのか???? ーー> 一週間悩んだ。


ちょっとしたことから仕掛けに気がついたのだが、これが、問題作成者の狙い通り!? という罠にハマり、セサミストリートまで行くことになる。(さらに、3日悩み続けた。。。)


セサミストリートまで行っちゃうと行き過ぎみたいなのだが、それはそれで何かの伏線なのか? と思える実に怪しいページになっている。それは置いといて。。

そこに辿り着くまでにいくつかのアイテムを拾い集めていた、そのアイテムの一つに、”ほんとうの問題”があったのだ。

それをPL/SQLで解いた所。PL/SQLのどのような機能を利用したかは前回の記事を見てもらうとして。。。


l12


あとはご自分で、といっても感のいい方は答えに気付いてしまうかもしれない。

尚、今回は、PowerBook G4, MacOS X Tigerに構築した Oracle10g R1 EEを利用している。
Level 13 へつづく。

| | | コメント (0) | トラックバック (0)

2005年9月 5日 (月)

PL/SQL で Python Challenge 12 やっぱり謎は解けた!

前回、謎は解けた! かもしれないと書いたが、実は.....。

謎を解いている私の横で奥さんがそれを検証し始めたのだ。 その結果、私の推測は間違っていると指摘されてしまった! (><)。      
ということで、今日のランチタイムに弁当を食べながら問題と睨めっこしていた。そして見えました〜〜答えが!。 自分なりに検証したところPL/SQLだけで解けたのであった。ちょっとだけ解説しておくと、 DBMS_LOBパッケージ、UTL_RAWパッケージ、UTL_FILEパッケージ及びBILEといつものディレクトリオブジェクトなどを利用するのみで全体で40行〜50行程度になっただろうか。

今回の問題は、いろいろな”いじわる”がたっぷり盛り込まれている。 答えが判れば、Level 12のページにある画像を見て、なるほどね〜〜。という気になってくるから不思議である。
次回、PL/SQL で Python Challenge 12 完結編につづく。

| | | コメント (0) | トラックバック (0)

2005年9月 4日 (日)

PL/SQL で Python Challenge 12 謎は解けた! かもしれない。

PL/SQL で Python Challenge Level 12


実は先週末から本格的にやり始めたのだが、これが私には難解で、難解で、、、記事のネタにもならないのと、仕事の納期が迫っていたため投稿は控えていた。 でも、先ほどから始まった雷の閃光とともに、謎はとけた! 。。。と思う。(ちょいと不安だが。。。。)

おそらく、PL/SQLだけで解けるのではないかと思っている。(私の推測が間違っていなければ。。。)  

次回へつづく。(話は変わるが、外はすごい雨になっているね〜。)

| | | コメント (0) | トラックバック (0)

2005年8月28日 (日)

PL/SQL で Python Challenge 12 その前に

休暇中に、MacOSX Panther をインストールしてあるPowerMac G4 Cube をサテライトオフィス(実家なんだけどね。帰省中でも事務的なこととかできるし、あると便利なので、いままでおいてあったG3と交換)へ持っていってしまった。 ということで、「PL/SQL で Python Challenge」 を 行う環境がなくなってしまった。 G5 Serverの環境整備と平行して、どうするか検討中。

DBマガジン 10月号に、 「話題のMacOS X によるWeb-DBサーバ構築」という特集がくまれている。DBマガジンに Mac関連の特集が組まれたのは私の知るかぎり初めてかもしれない(記憶違だったらごめんなさい)。標準で組み込まれている MySQL、それにApache と PHPを組み合わせるものだが、どれも標準で組み込まれているだけに簡単に構築できてしまうのが便利なところですね。

| | | コメント (0) | トラックバック (0)

2005年8月18日 (木)

PL/SQL で Python Challenge 11 完結編

Level11は、 Level7及び、Level9で作成したパッケージを再利用したことと、、Level7で作成したjavaのコードを多少手直ししただけなので書き直したコードは15行程度だった。(全体では、Level7程度のコード量だが。。)

javaのコードの概要は以下のようになる。

    1.問題の画像を、オラクルのDirectoryオブジェクトに置く。

    2.PL/SQL で Python Challenge Level7で作成した、PL/SQLパッケージを再利用。Level7.getBfile()を利用して、1.説明した画像ファイルを外部LOBファイルとして取り込む。

    3.javax.ImageIO をクラス利用して、外部LOBとして読み込んだ画像の複製を作る。(複製した画像は、背景色を黒にしておく)

    4.3.で複製した画像(BLOB)に、2.で取り込んだ画像(外部LOB)から取り出した答えを描画。

    5.答えを描画した画像(BLOB)を一時LOBとしてデータベースへ書き出す。 dbms_lob.createTemporary() を利用する。

    6.一時LOBを PL/SQL で Python Challenge Level9 で作成した Level9.writeImageFile() プロシージャを利用して、オラクルのDirectoryオブジェクト以下に、level11.jpg というファイル名で書き出す。

    7.前述のjavaクラスをデータベースへ配布する。(JDeveloper又は、loadjava コマンドを利用する。)


jdev_deploy


    8.SQL*Plusより、Java Stored Procedureとして呼び出せるようにして実行!。Oracleは、MacOSX 10.3.9 Pahtnerに作成した、Oracle10g である。

cube: oracle$ sqlplus scott/tiger

SQL*Plus: Release 10.1.0.3.0 - Production on 水 8月 17 00:00:20 2005

Copyright (c) 1982, 2004, Oracle. All rights reserved.



Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
に接続されました。
SQL> !cat level11.sql
-- level11
create or replace package level11 as
function getAnswer return number;
end level11;
/
show error

create or replace package body level11 as
function getAnswer return number
is
language java
name 'jp.discus.Level11.getAnswer() return java.lang.Intger';

end level11;
/
show errors

SQL> @level11

パッケージが作成されました。

エラーはありません。

パッケージ本体が作成されました。

エラーはありません。

SQL> set timi on
SQL> select
2 case
3 when level11.getanswer() = 1 then
4 '成功'
5 else
6 '失敗'
7 end as "結果"
8 from
9 dual;

結果
----
成功

経過: 00:00:05.68
SQL>


実行後、directoryオブジェクトに対応するフォルダには Level11.jpg が作成される。

dir

    9.うまくいったようなので結果を見てみよう! (内容はいつものように隠してある)

level11_copy


Level12 へつづく

| | | コメント (0) | トラックバック (0)

2005年8月15日 (月)

PL/SQL で Python Challenge 11 謎は解けた。

前回の予想通り、画像の中に答えがあった。Level11 の ページタイトルがヒントになっている簡単な問題でしたねこれも。(Level11はJavaだけで答えが見えてしまうのだが、、、Level7を解いたときと同じ方法で、PL/SQL から呼び出す形にする。) 次回、完結編へつづく。



何年ぶりだろう!? 東京湾大華火祭を見たのは・・・・・。 

Oracle, PL/SQL, Mac, Java, PL/SQL で Python Challenge | | | コメント (0) | トラックバック (0)

2005年8月11日 (木)

PL/SQL で Python Challenge 11

ここのところ忙しくて脳の体操してなかったが久々に再開?!、Python Challenge Level11。
こいつはまた画像に答えが埋め込まれてますね〜おそらく。。。となんとなく思っただけ。。で、疲れてやる気でず。。。

| | | コメント (0) | トラックバック (0)

2005年7月29日 (金)

PL/SQL で Python Challenge 10 完結編

Level10は、前回の通りPL/SQLパッケージだけで解けた。珈琲ブレイクの間にコーディングしたのだが、すんなりコンパイルも通りLEVEL10クリア。。

いつものようにコードは載せないが、コレクションの一つであるVARRAY、正規表現関数(REGEXP_SUBSTR()とREGEXP_REPLACE())、あとは昔からある、SUBSTR()関数や、LENGTH()関数を利用したプログラミングで十分。

結果の画像を見てもらうと判るがパッケージの本体は35行である。Level5以降キツい問題が続いたが、このくらいだとPL/SQLで解くのもランチタイムや珈琲ブレイクの間で終わるので十分楽しめる。


level10_source

level10_res



Level11へつづく。。。のだが、Tiger Server De Oracle10g は? と突っ込まれたこともあり、次回はMac De Oracleらしく、Tiger Server De Oracle10gにする予定。

| | | コメント (0) | トラックバック (0)

2005年7月28日 (木)

PL/SQL で Python Challenge 10 謎は解けた

Level10は、こんな感じの適性試験があったような記憶が蘇るクイズだな。。。。

Level10では、Level9の答えに出てくる”やつ”が問題のページにあるのだ。。htmlソースをみると、、お〜、 clickable mapじゃないか! またなんか嫌らしい問題にしてんのかな〜。
早速、”やつ”をクリックすると基本認証が設定してある。おや〜〜これは以前解いた問題と同じだな。。。ということで、やっと問題にたどり着く。入手したテキストファイルが意味不明だったが、眺めているとあるパターンがあることに気づく。あ、、、、なるほど。。。謎は解けた!  Level10のページには答えを導きだすためのヒントがあるので、あとはその通りにやればいいはずだ。(最後にひねりが何段かある可能性はあるが。。)
あとは、PL/SQLでどうプログラミングするかだな。Level10は、久々に、PL/SQLだけで解けそうな感じがする。 
 Level 10 完結編につづく。


軽井沢に行きたくなってきた。。。暑い、寝苦しい〜。

| | | コメント (0) | トラックバック (0)

2005年7月27日 (水)

PL/SQL で Python Challenge 9 完結編

Python Challenge Level9 を画像処理(Java Stored Procedure)、その他(PL/SQL stored procedure)とOracle10gの機能で解いた。


方法の概略は昨日の記事を見てもらいたい。

Oracleのdirectory オブジェクトに対応づけられたOS上のフォルダ(ディレクトリ)には、以下のスナップショットのようにlevel9.jpg というLevel9の答えが作成されている。(このlevel9.jpg は、最初からあるわけでなく、Level9を解いた結果作成された画像である) 

(この機能自体がサポートされたのはかなり前なのだが、create directoy文だけでOS上のディレクトリにアクセスできるようになったのは、Oracle9i R2以降である)
result_dir


level9 という PL/SQL パッケージを作成したのだが、今回はpackageの仕様部だけをネタバレになりそうな関数名などをHogeなどと置換して公開しておこう。


最初の create type文で、ユーザ定義型のコレクションを2つ定義している。見ればわかると思うが、hogehoge_typ型は2次元のコレクションになっている。また、hoge_typ型が、2つのintegerを要素とするコレクションであることも判ると思う。感のよい方はこれを見ただけでもLevel9の答えが判ってしまったかもしれない。。(前日の記事で、「答えを画像ファイルに出力する必要ない。」と書いた理由はこれである) 

ではpackage仕様部の解説に移ろう。
最初の2つは、定数なので解説は省略する。getHoge()関数は、単純に2次元のnest tableコレクションを返してくるものである。画像ファイルに答えを描画しないのであればここまでできれば十分である。

私は答えをjpegファイルに出力するので、メモリ上で作成した画像をjpegとして一時LOBとしてOracle10gデータベースの一時記憶域に書き出し、その一時LOBを directoryオブジェクト以下に level9.jpg というファイルとして書き出す処理を作成した。

writeImageFile()プロシージャは、PL/SQLだけで記述してある。プロシージャ名からもある程度想像できると思うが、一時LOBを、指定した directoryオブジェクト以下に指定したファイル名(level9.jpg)で書き出すプロシージャである。(コード量は20行程度) 残りの getAnswer()関数はLevel9を解くためのメイン処理になっおり java stored procedure である。java では画像処理だけを行いそれ以外の処理は、PL/SQLを利用している。(javaのコード量は、jdbcを利用していることもありコメント以外の行は100行程度)
$ cat level9.sql
-- Level9 package
create or replace type hoge_typ is varray(2) of integer;
/
create or replace type hogehoge_typ is table of hoge_typ;
/
create or replace package level9 as
c_first constant varchar2(16) := 'first.txt';
c_second constant varchar2(16) := 'second.txt';
function gethoge(which in varchar2) return hogehoge_typ;
procedure writeimagefile(
directoryname in varchar2,
filename in varchar2,
srcimage in out nocopy blob
);
function getanswer() return boolean;
end level9;
/
show error


コーディング後のloadjavaは、JDeveloper10g for MacOSX Developer Previewを利用している。

jdev10g_loadjava

SQL*Plusを起動し、level9のパッケージや型を作成後、getAnswer()の実行!
level9_exec

注)いつもの通りネタバレになるので答えそのものは載せていないのであしからず!(そうだと思った〜っ。という声が聞こえてきそうだが。。)
level9_result
画像を開くとなるほど〜〜〜と思う結果になるのだが、日本人だと50%は間違かもしれない。特に日本語では通常、”それ”を区別していないからだ。(画像をよ〜〜〜く見ると区別できる”もの”があるのだが・・) でも心配しなくてよい。間違っている方の xxx.htmlを入力すると正しいURLへのヒントのページが表示される。(いつの間にか、英語の勉強にもなっている気がする Python Challenge )


Level10 へつづく!

尚、nest tableやVARRAY又は、結合配列(むかしのPL/SQL表相当)を関数の戻り値として返すサンプルやBLOBをdirectoryオブジェクト以下に書き出すPL/SQLの簡単なサンプルは別途掲載するかもしれない。

20050727001台風一過、波は高いが気持ちのいい湘南にて。。

| | | コメント (0) | トラックバック (0)

2005年7月26日 (火)

PL/SQL で Python Challenge 9 簡単でした

Level9。 最初はそのページにある画像に疑いを持っていたのだが、htmlソースと、ページタイトルで謎は解けた。 Pythonだと、画像処理用のモジュールをimportすれば20行も必要ないだろう。 PL/SQL+Java(Java Stored Procedure) + Oracle10g では、PL/SQLのコードとJavaのコードを合わせて、100行で収まるかな?といったところ。 今回も、MacOS X Panther 10.3.9に構築した、Oracle10gデータベースと、JDeveloper10g for MacOSX Developer Preview Releaseそして、J2SE 1.4を利用して解いてみる。ただ、この問題では解答をjpegファイルで出力することにした。(ちなみに、画像ファイルにしなくても問題ないと思う)

さて、処理方法は、

Level9のhtmlソースをファイルに保存後、答えを導きだすためのデータ群(2つある)をそれぞれテキストファイル(以下、テキストファイル1、テキストファイル2と呼ぶことにする)にして、Oracle の directory オブジェクトに対応する OS上のフォルダに保存する。さらに、Level9 のページに表示されている画像( good.jpg ) も同じ場所に保存する。
ちなみに、directory オブジェクトには、書き込み権限と読み込み権限が付与されていること。


最初に、VARRAYまたは、NEST TABLEをを利用した2次元のユーザ定義型を create type文で作成する。私は1次元目のコレクションは、NEST TABLE、2次元目のコレクションには、VARRAYを利用した。

テキストファイル1と2をutl_fileパッケージを利用して読み込み必要な形に変換する関数を作成する。この関数はPL/SQLだけで記述する。正規表現関数と前述の2次元コレクションも利用する。

good.jpgファイルをBFILEとして返す関数を作成(ただし、Level7で作成したものをそのまま再利用)。これもPL/SQLだけである。utl_fileパッケージを利用している。なぜ、good.jpgを読み込むのかといえば、答えを描画する画像のサイズを good.jpgと同じにしたいということが理由である。答えとなる画像は、黒背景に白で答えを描画する。

次のプロシージャが大事なのだが、BLOB を directory オブジェクト に書き出すプロシージャを作成する。このプロシージャは、DBMS_LOBパッケージ及び、UTLFILEパッケージを利用する。PL/SQLだけで記述する。このプロシージャで答えを描画したjpegファイルを Oracle管理下の directory オブジェクトに書き出すという仕掛けである。

最後に、java stored procedureなのだが、このプロシージャに対応する java classでは

前述したPL/SQL関数を使って、問題のデータ(テキストファイル1と2及び、 good.jpgファイル)を読み込み、”答えをjpegファイル(BLOB)として作成する。


作成したjpegファイル(BLOB)を前述したPL/SQLのプロシージャを利用して、directoryオブジェクト以下に書き出す。(DBMS_LOBパッケージを利用し、一時LOBにjpegを仮作成。仮作成した一時LOBをjpegファイルとして書き出すという方法をとる)

思いついた方法を書いただけなのだが、これでうまく解けると思う。(画像処理については、PL/SQLだけでは無理なので、その部分を Javaで行う)

Level9 完結編へつづく。。。

 あ、そういえば、 PowerMac G5 Dual 2.7Ghzが到着して、 MacOS X Server Tiger 10.4.2 はセットアップできたので、 そろそろ  Tiger Server De Oracle10g ( Oracle10g が Tiger未対応なので無理矢理構築するのだが。。。) をやりますか。。。。

| | | コメント (0) | トラックバック (0)

2005年7月25日 (月)

PL/SQL で Python Challenge 8完結編

Python challenge Level8 を解いてみた。 PL/SQLJavaOracleを使って解くと結構大変なことも多々あるなぁ。。。それを承知でやっているのではあるが。。。(^^;;;

Python challenge Level8のヒントは前回の通り、「ブンブン蜂が飛ぶ。その音」(もちろん英語で)。

Python Global Module Indexにあるどのモジュールを利用するのかがわかれば簡単で、Pythonでは3行で解けてしまった。
しかし、PL/SQL+Java+Oracle10g では手こずった。プログラミング以前に、PL/SQLJava(J2SE)にもPythonのモジュールに該当するものがないのである。
検索したところ、Apache Antプロジェクトに同じ機能を持つpackageがあることを発見した。(Ant全体ではなく該当部分だけが jar として公開されていたのでそれを利用することにした。)
そのページのNOTE部分には大事なことが書いてある。それを読まないで該当packageを利用するとハマるので注意。(私はまる一日ハマってしまった)ネタバレになるので、そのページのURLは書かない。自分で探してもらいたい。

今回は、以下のように level8 というPL/SQLパッケージを作成した。(Level7と同様に、MacOS X Panther 10.3.9にインストールしたOracle10g 10.1.0.3 を利用している

SQL> desc level8
FUNCTION GETANSWER RETURNS VARCHAR2
FUNCTION GETPS RETURNS VARCHAR2
FUNCTION GETBLOBSOURCE RETURNS BLOB
引数名 タイプ In/Out Default?
------------------------------ ----------------------- ------ --------
SOURCE VARCHAR2 IN
FUNCTION GETUN RETURNS VARCHAR2

SQL>

PL/SQLのコードはネタバレになるのでいつもの通り非公開だが、作成手順やネタバレにならない程度の概要は書いておく。

getUn() 関数と getPs() 関数は、Level8の問題そのものを取得するPL/SQLだけで記述した関数である。長い文字列なので入力の手間を省く為にPL/SQL package中のプライベート定数としてあり、その文字列を取得するだけの関数である。。
コード量は、それぞれ数行程度だった。


getBlobSource() 関数は、getUn()関数、getPs()関数の戻り値を入力して、加工後、BLOBとして返す。これもPL/SQLだけで記述した関数である。どんな加工を行ったのか詳細は書かないが
エスケープシーケンスを含む文字列を処理したとだけ書いておく。Oracleでは特定の関数などで
エスケープシーケンスを利用するものがあるが、それ以外では通常の文字列として扱われるのでこの処理がポイントになるのではないかと思う。Oracle10g新機能である正規表現関数はすべて利用した。
コード量は、20行程度だった。


getAnswer() 関数は、getBlobSource()関数を呼び出し、戻り値から解答を取り出だすjava stored function としてある。この関数はラップされている method内で、Apache ant
に含まれているあるpackage ( jar ファイルは該当package分だけ入手可能 )を利用している。
javaのコード量は、60行〜70行程度だった。


手順も書いておく。
  • 1.入手したjarファイル(Apache antの該当packageだけの jar)を loadjava コマンドを利用して、Oracleにロードする。 

  • 例) jarファイル名などは隠してあります。(それを見せたらネタバレなので)
    cube: oracle$ loadjava -v -user scott/tiger xxxxx.jar
    arguments: '-v' '-user' 'scott/tiger' 'xxxxx.jar'
    identical: META-INF/MANIFEST.MF
    identical: org/apache/xxxxxxxxxxxxxxxxxxxxxxxxxxxx
    identical: org/apache/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    identical: org/apache/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    identical: org/apache/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    identical: org/apache/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    identical: org/apache/xxxxxxxxxxxxxxxxx
    identical: META-INF/LICENSE.txt
    cube: oracle$

  • 2.getUn()、getPs()、getBlobSource()までをPL/SQLだけで実する。

  • 3.getAnswer()でラップする java classを実装及びテストする。

  •  1のjarファイルはライブラリとして必要。(このclassで、getBlobSource()を jdbcを利用して実行する)。 

  • 4.3で作成した classを loadjavaまたは、JDeveloper10g Developer Preview for MacOSXで、データベースにロードする。
  • level8_jdev

    以下、実行結果のスナップショット(いつものように答えは隠してある)。
     level8




    Level9へつづく。

    | | | コメント (0) | トラックバック (0)

    2005年7月20日 (水)

    PL/SQL で Python Challenge 8

    Level8は、非常に簡単! Pythonでは!

    Pythonなら3行程度で終わりそうな問題だ。しかし、PL/SQL+Javaでやるにはちょいと面倒かもしれない。いくつかポイントはあるのだが、escapeシーケンスと”ブンブンブン”蜂が飛ぶ〜〜がヒントになるpython global moduleだ。javaのJ2SEにはそのようなパッケージはないし、もちろん、PL/SQLやオラクルにはない。javaだと、apache ant に ”それ” に相当するパッケージがあるのだが使えるのかな?  調べるしかない・・・。

    | | | コメント (0) | トラックバック (0)

    2005年7月19日 (火)

    PL/SQL で Python Challenge 7 再チャレンジ!

    前回、「PL/SQL で Python Challenge 7 残念!」 でPL/SQL+Oracle10gで解くことを断念するつもりだった。しかし、Python Challengeの問題自体の面白さに、再開することにしたのだ!。
    再開するにあたり、PL/SQLでは面倒な部分(例えば、画像処理とか)だけを、Java (Java stored procedure)で解くことにした。(場合によっては、Javaで解く部分がクイズの核心だったりするが・・・)




    java stored procedureを利用したことで、Level7は簡単に解けた。それなりにひねりの効いた問題だったが、java stored procedureを利用した箇所以外は、Level7以前の問題を解く中で利用してきた機能や関数で十分解ける問題だった。

    Level7でもいままで通り答えをそのまま書くつもりはなく、PL/SQL と Java そして Oracle10g をどのように利用して解いたのかという所だけをヒントとして書いておく。
    Level7は画像自体に答えが隠されている。(Level7のページに行けば、なんとも怪しい画像にお目にかかるので感のよい方はすぐに気づくと思う)。そこで問題になるのは、PL/SQL や Oracle10g で提供されているパッケージや機能では画像データをピクセル単位で扱うことは今のところできないということなのである。その問題を解決する手段として Java を利用することにした。

    注)2005/07/17時点では、MacOSX Tiger 10.4.1において、無理矢理動作するようにしたOracle10gではエラーが発生する。以下はすべて、MacOSX Panther 10.3.9のOracle10gで行った結果である。

    1.問題の画像をOracle10g の directoryオブジェクト以下に配置し、BFILE として扱う。

    (BFILEは、外部LOBと呼ばれ、Oracleデータベース内には格納されないLOBである。)
    BFILEへの参照(ロケータ)を取得するのは、PL/SQLだけで可能である。
    Level7では、directoryオブジェクトへの読み込み権限さえあれば問題ないが今後のために書き込み権限を付与している。(実行ログの書き出しに利用する場合を考えている)
    SQL> conn scott/tiger
    SQL> select table_name as "directory",privilege from user_tab_privs;

    directory PRIVILEGE
    ------------------------------ ----------------------------------------
    PYTHON_CHALLENGE_DIR WRITE
    PYTHON_CHALLENGE_DIR READ

    2.1で取得した BFILE から画像データとして読み込み怪しい部分の画像情報から答えの元になる情報を取り出す。

    (なぜ元になる情報なのか?。”ひねりの効いたクイズ”なので一筋縄では答えは導きだせないだけ!)
    ここで、Java (実際には Java stored procedure にするのだが)を利用する。


    Java stored procedure といっても通常の java プログラムとほとんど同じなのだが、Java stored procedureとして利用する場合にはいくつかの作法が必要でなのだ。methodは、staticにする必要がある点と、利用するJDBCドライバは通常は、Server-side thin ドライバを利用する点である。
    このドライバは、 thinドライバと同じ機能を持っているが接続先データベースがjava stored procedureが格納されているデータベースになる点が異なる。
    Java stored procedure が格納されているデータベース以外のデータベースに接続する必要がある場合には、通常のthinドライバを利用することになる。
    今回は、Java stored procedureの格納されているデータベースだけにしかアクセスしないのでServer-side thin ドライバを利用する。(単体テストの時は、thinドライバを利用し、テスト完了後に Server-side thinドライバへ切り替えた)
    尚、Java stored procedureの詳細は、OTNのオンラインマニュアルなどを参照してもらいたい。

    3.2で取得した”答えの元になる情報”から答えを取り出す。これは PL/SQL だけで可能である。

    以下に、上記1〜3の処理をそれぞれ関数として作成した PL/SQL パッケージ(level7パッケージ)のapiを示す。
  • getBFile() が、BFILEへのロケータを返す関数である。
  • getAnswer() が、java stored procedureである。画像データを読み込み”答えの元ネタ”を返す関数である。
  • getNextLevelUrl() が、Level8へのURLを返す関数である。
  • 注)本来であれば、getNextLevelUrl()だけを公開すればよいのであるがデバッグのために全関数を公開してある。
    SQL> 
    SQL> desc level7
    FUNCTION GETANSWER RETURNS VARCHAR2
    引数名    タイプ In/Out Default?
    ------------------------------ ----------------------- ------ --------
    DIRECTORYNAME VARCHAR2 IN
    FILENAME VARCHAR2 IN
    FUNCTION GETBFILE RETURNS BINARY FILE LOB
    引数名    タイプ In/Out Default?
    ------------------------------ ----------------------- ------ --------
    DIRECTORYNAME VARCHAR2 IN
    FILENAME VARCHAR2 IN
    FUNCTION GETNEXTLEVELURL RETURNS VARCHAR2
    引数名    タイプ In/Out Default?
    ------------------------------ ----------------------- ------ --------
    DIRECTORYNAME VARCHAR2 IN
    FILENAME VARCHAR2 IN

    後は作成した stored procedure を実行するだけである。今回は関数(スカラ関数)にしてあるので SQL から呼び出して実行している。また、java stored procedure に不慣れな方の為に手順も載せておく。

    1)OS上で、適当な位置にディレクトリを作成する。

    この時、oracle所有者が、ディレクリに対する書き込みおよび、読み込みパーミッションを持っているか確認すること。また、画像ファイルも配置しておく。尚、外部LOBや、directory オブジェクトにマッピングされるOS上のディレクトリが実在するかどうかは
    Oracle側では検証されない。利用する側で適切な関数などを呼び出してチェックする必要がある。

    2)SQL*Plus を起動し、1)で作成したOS上のパスを対象とする directory オブジェクトを作成する。

    3)2)で作成したdirectory オブジェクトへの read権限、 write権限を付与する。

    例)SQL> grant read, write on directory python_challenge_dir to scott;

    4)level7.getBfile() だけを作成しておく。

    5)level7.getAnswer() に対応づける Java program を作成する。

    java program の作成には、JDeveloper10g for MacOSX Preview Releaseを利用した。
    jev10gicon jdev10gpre1

    6)5)で作成した Java programを Oracle10g の scottスキーマへ配布する。

    loadjava コマンドを利用するか、JDeveloperを利用する。
    配布にも、JDeveloper10g for MacOSX Preview Releaseを利用した。
    jdev10gpre2

    7)level7パッケージを作成する。


    getAnswer()  の実装。6)で配布したclassを利用する java stored functionにする。

    getNextLevelUrl()  の実装。ここでは、これまでの問題でも利用したOracle10g新機能(Pythonなら re で判るはず!)を利用するのである。

    8)実行。 スカラ関数として利用できるようにしておいたのでSQLから実行した!

    ネタバレになるので、いつものように画像はぼかしてあります。 m(_ _)m
    level7_answer

    ということで、再開した PL/SQL で Python Challenge。  Level8 へつづく。

    海の日。梅雨も開けた湘南にて (どこでしょう?)

     

    CIMG3851
    CIMG3856

    | | | コメント (0) | トラックバック (0)

    2005年7月15日 (金)

    PL/SQL で Python Challenge 7 残念!

    ついに、その時がきたか〜。Level7の謎はそのページにある画像自体にある。PL/SQLでは無理そうだな〜。Pythonだと、20行以内で書けそうなのだが・・・。(クイズ自体は割と簡単なだと思う)ということで、PL/SQLではLevel6までということにしておこう。 (Pythonではやるかもしれない・・・・。)

    | | | コメント (0) | トラックバック (0)

    2005年7月14日 (木)

    PL/SQL で Python Challenge 6

    Level5で格闘したおかげで、Level6は簡単に解けてしまった。

    Python Challengeを解く鍵になる最初のヒントは、問題になっているhtmlのページ自体に隠されている。大抵の場合、htmlソースコードや画像などにあるのだが、それなりにひねってある。とうしても判らない場合は、Forumのヒントを見てみるといいだろう。Level6はその必要は全くないと思うが・・・
    Python用に考えられたプログラミングクイズなので、PL/SQLで解くには難しい場面や、アプローチを変える必要が出てくる。Level6は、ある形式のファイルから答えを導きださなければならないのだが、PL/SQLではそれを直接操作するパッケージなどは存在しない(作ればできると思うが、すごく大変でしょうね)。しかし、そのファイルの中身をそのままの形で見れば扱えなくもないということに気づくと思う。
    今回利用したパッケージは、UTL_FILEパッケージ、正規表現関数(Oracle10g新機能)、DBMS_OUTPUTパッケージ(結果の表示に利用)、連想配列(日本語のマニュアルでは結合配列とか書いてあるが、英文マニュアルを直訳すると”連想配列”となっている。結合配列より連想配列のほうが判りやすいと思うのだが・・・・)だけである。書き方によると思うが約80行程度だった。
    さて、Level 7 はPL/SQLで解けるだろうか? Levelが進むとPL/SQLにはキツくなるね〜やはり・・・・。頭の体操にはいいかもしれないけど・・・。
    Level5の時と同じように大事なところは隠している実行結果のスナップショット。。。見せないんだから載せなくてもいいのだが・・・・。
    level6

    | | | コメント (0) | トラックバック (0)

    2005年7月13日 (水)

    PL/SQL で Python Challenge 5 完結編

    ついにPL/SQLで、Python Chellenge Level5を 解いた!  PL/SQLで解くためのヒント(ヒントより解答に近いかもしれないが。。)

    謎は解けたが、PL/SQLでは、1つ問題になることがある。PL/SQLがオブジェクト指向的な拡張はされているが、オブジェクト指向言語ではないからだ。一時はあきらめかけたのだが、Pythonを使って解いてみると、オブジェクト指向言語でなくても解けそうな問題であることに気づく。

    そこで、Pythonのソースコードや、仕様を決めているPEPを見始める。(PEPは、javaでいえば、JSRみたいなもの)

    大きなヒントになってしまうが、PEP307のソースコードを探し始めたのである。その中で、RubyでPython Chellengeを解いている方のページを発見した。RubyでPEP307の一部(Level5を解くためだけに必要な部分)を実装したコードを発見したのだ。おおお〜〜〜。これをPL/SQLで実装すればいいじゃん!



    PL/SQLで解くためのヒントは、上記のコードを解析してPL/SQLで書き上げろ。しかない! 

    ポイントは、ANYDATA型及び、VARCHAR2型をネスト表を利用してユーザ定義型を作成する(ようするに、ANYDATA型とVARCHAR2型のコレクション型を定義するとうこと)。それらを、Rubyのコードにある@stackや@memoの代用として利用する。ANYDATA型のコレクションは、コレクションの各要素がANYDATA型になるのでどんな型でも格納できるのである。しがたって、ANYDATA型コレクションの要素にANYDATA型コレクションを格納し、さらに、その要素に。。。を繰り返すという操作が可能になる。最終的には、VARCHAR2型コレクションを格納してやれば今回の問題の80%はクリアできるはず。残りの部分は、UTL_FILEパッケージを利用してファイルを読み込む。結果もUTL_FILEで書き出せるが、SQL*Plusで確認したい方は、DBMS_OUTPUTパッケージを利用して表示させてもよい。(私はDBMS_OUTPUTパッケージを利用した。)その場合、set serveroutput on size xxxx に続けて、スペース表示を抑止しないオプションを付加することをお忘れなく!(あえて、オプションが何かは書きません! SQL*Plusのマニュアルを読んでくださいね)

    ちなみに、この問題、PL/SQLでは、stackなどのロジックを書く必要があるため、PythonやRubyのように10行から20行程度のコードでは解決できない。かなりベタに書いてしまったこともあり、stackおよび、PEP307の一部対応で180行程度、全体で200行程度になった。そこまでして、PL/SQLで解きたいか〜という声が聞こえてきそうだが、ANYDATA型の利用方法が見えてきたのは収穫だった。(^^

    以下のスナップショットではぼかしを入れてます。これを見せちゃったらつまらないからね〜。
    finished


    Python Challenge Level 6につづく。(PL/SQLだけでできるのかな?〜)

    | | | コメント (0) | トラックバック (0)

    2005年7月 5日 (火)

    PL/SQL で Python Challenge 5 謎は解けたが。 迷走。

    Level 5 謎は解けたものの、PL/SQLの新機能などや、Oracle8i以降で追加されたおオブジェクト指向拡張(ネスト表くらいしかまだ利用したことがない)を再度、読み返してみると、anydata型などが気になり始めた。最初は、単純にPL/SQL表でもいけるかと思っていたが、ネスト表やオブジェクト型などを利用したほうがいいのかもしれないと思い始める。。。ただいま、迷走中!
    どうせ、Oracle10gのPL/SQLでやるのなら、PL/SQLのオブジェクト指向機能機能拡張部分でも利用してみますか・・・・。

    | | | コメント (0) | トラックバック (0)

    2005年6月29日 (水)

    PL/SQL で  Python Challenge 5 謎は解けた!

    Python Challenge Level5をPL/SQLで解けるのか?。。。。とりあえずPythonでやってみたら、5〜7行程度だ!。 PL/SQLでは、該当する関数もパッケージも無いのだが、なんとかできそうなので意地でもPL/SQLで解いてやる〜〜〜。しかし10〜20行くらいではコーディングできないのは間違いない。

    Level 5を解く鍵になるモジュールと同じ機能を持たせれば、オブジェクト指向ではない言語でもなんとかできる問題になっていた。PL/SQLでこれを解くには、やはり、UTL_FILEパッケージ+Level 5を解くための鍵になるモジュール相当の自作パッケージ+DBMS_OUTPUTパッケージこれらを合わせればできると思う。。。では、結果にご期待ください。

    | | | コメント (0) | トラックバック (0)

    2005年6月28日 (火)

    PL/SQL で Python Challenge 5

    う〜〜〜ん。Python Challenge Level5 で、ついに終了か! (Python なら簡単。でも、PL/SQLではきついな〜〜)。 でも、もうちょい調べてみよう。

    | | | コメント (0) | トラックバック (0)

    PL/SQL で Python Challenge 4 その2

    Python Challenge Level4 を PL/SQLで解くためのヒント。

    前回、level4を解く前に、Python向けに書かれたクイズをPL/SQLでどう解くか考えていたが、やはり、utl_httpパッケージが利用できた。それと、Oracle10gから新たにサポートされた正規表現を扱う関数だ。

    Level4は、utl_httpパッケージとOracle10gからサポートされた正規表現を扱う関数(なにを使うかはご自分で考えてください)を利用すると解くことができますよ。書き方にもよると思いますが、20〜30行程度でプログラミングできると思います。

    (尚dbms_outputパッケージも少しは利用しますが、それを利用しない場合は、utl_fileパッケージでログ出力というのは、どのLevelのクイズでも利用すると思います。)



    次は、level5。(次のクイズもPL/SQLだけで解けるでしょうか?。。。。。)

    | | | コメント (0) | トラックバック (0)

    2005年6月25日 (土)

    PL/SQL で Python Challenge 4

    Python Challengeは、Pythonでプログラミングをして問題を解いていくことを前提として問題が用意されているわけで、PL/SQLではプログラミングが困難な問題があるかもしれない。(とりあえず、PL/SQL以外の言語を利用しなくても解けるようなら続けてみようと思う。) 

    Level3 も、 Oracle10g の PL/SQLなら簡単プログラミングできるが、Oracle9i ではかなり大変。 そして、Level4 も、 答えが見えてきが、PL/SQLでできるのか? と思ったわけである。そして、マニュアルを眺めていたら、 utl_httpパッケージ、 utl_urlパッケージ、場合によっては、 utl_tcpパッケージ(使わないと思うが)というパッケージを利用すれば、プログラミングできそうな感じがしてきた。(まだ、試してないが。。)  結果をお楽しみに。

    | | | コメント (0) | トラックバック (0)

    2005年6月24日 (金)

    PL/SQL で Python Challenge 3

    PL/SQL で Python Challenge Level3 を解くためのヒント。

    そういえば、Oracle JDeveloperが無償になるらしい。

    この問題を解くには、Oracle10gのPL/SQLを使え!。 (それ以前のリリースなら、Java Stored か、 Cなどを利用するべし。でもできることなら Oracle10g がいいよ。楽だから。)  Oracle10g で新機能として提供されている関数と、substr()関数。 それと、やはり、utl_fileパッケージと directoryオブジェクトを利用すると幸せになれるよ。(^^

    ちなみに、Oracle10g の PL/SQLなら 20行以内でコーディングできますよ。

    (睡魔に勝てず、Java Storedとか、PL/SQLから Cとか書いてしまったが、PL/SQL で Python Challengeなので、Oracle10g より前のPL/SQLでやるなら、20行以内ではすまないですけど、その気になれば書けなくもないので PL/SQLだけで解いてみてください。 (^^;;

    | | | コメント (0) | トラックバック (0)

    2005年6月22日 (水)

    PL/SQL で Python Challenge 2

    Python Challenge  level 2を PL/SQLで解くためのヒント。

    これも単純といえば単純なのだが、PL/SQLで 解くには、utl_fileパッケージと、translate() や replace() 関数などを駆使すると数十行で解けます。Oracle9i R2から、utl_fileパッケージでは、directory オブジェクトの利用が推奨されているので この際、directory オブジェクトの利用方法なども調べておくといいでしょうね。ちなみに、 Tigerにインストールして稼働中の Oracle10g でも問題なく解けます。

    雨のなかの、湘南(20050622どこでしょう?) より。
    私も購読してますが、なんか、こんな終わり方するメールマガジンありますね〜。ちょいとパクってしまいました。 m(_ _)m

    | | | コメント (0) | トラックバック (0)

    2005年6月 3日 (金)

    PL/SQL で Python Challenge

    先日、Zopeをやっている友人から、The Python Challenge というサイトがあるのを聞いた。Python 使って、クイズを解くと、次のクイズができるという構成になっているサイトだ。(ちなみに、友人はPython を使って解く という部分のコメントを読み飛ばしていたらしく、ExcelVBA でやっていたらしい。)。 ということで、Mac De Oracle のタイトルに相応しく?! PL/SQL でやり始めた次第である。。。。(MacOS X なので、Python は、デフォルトで利用できるのだが。。。。PL/SQLでやるのであった。。。)

    ここでは、答えを書くことはできないが、いやはや、やり始めると、これが意外に面白い。(PL/SQL Challengeってサイト があってもいいかもしれない。 ヒントなども PL/SQL向けにアレンジして。。。)

    ちょっとだけ、ヒントになりそうなことを。。。

    level0 簡単過ぎる! が最初だからね〜。 なので何も書かない

    level1 これも、案外簡単だし、プログラミングしなくても、根性で解いてしまう方がいるかもしれない。(笑) PL/SQLなら、translate() って関数を使うといいよね。

    と、これくらいにしておきましょう。興味のある方は、ご自分で解いて、プログラミングを楽しんでください。

    先日、インストールした、Oracle10g for Mac OS Xの PL/SQL を利用して解いている。 で現在、Level3.

    | | | コメント (0) | トラックバック (0)