urllib2.quote()ってアリなんだ

そりゃそうだよなあ、と気がついてみれば当たり前だけれど。

#urllib2.pyより抜粋
from urllib import (unwrap, unquote, splittype, splithost, quote,
addinfourl, splitport, splitgophertype, splitquery,
splitattr, ftpwrapper, noheaders, splituser, splitpasswd, splitvalue)
# support for FileHandler, proxies via environment variables
from urllib import localhost, url2pathname, getproxies

マニュアルにはかいてないから*1、urllib2を使っていても、いつも別途urllibをimportして、urllib.quote()と書いていた。

まあurllib2の無い環境でも動かそうとか考えると作法としてはいいんだろうけど、そもそもurllib2使っているんなら関係ないし。

標準モジュールもよく使うものはソースに目を通しておくのがいいんだな。勉強になるし。

*1http://docs.python.org/lib/module-urllib2.htmlの"The urllib2 module defines the following functions:"以下に無いから勝手に無いと思っていた。他にもたくさんこんな思い込みがありそう。

アーサー・C・クラーク死去

読んだ本メモには書かなかったけれど、「幼年期の終わり (光文社古典新訳文庫)」は暮れに(今年だっけか)読んだ。当然再読。

正直言うと高校生の頃に読んだようには、感動しなかったけれど、やっぱり、なんというかな、いいもんだな、と思ったんだった。

決定版 2001年宇宙の旅 (ハヤカワ文庫SF)」は大学1年の春に、駒込の狭いアパートで、ベッドに寝転んで読みはじめてそのまま読み終わったのを、よーく覚えている。

オカルトにはまったり、後で反省してみたりもしたようで(何で読んだんだったか?)、テレビを作ってみたり、映画もやったり、偉大な先駆者だな。英国的な知性という感じもする。

cx_Oracleが見つけるOracleクライアントライブラリを変えたい

C:\Python25\python.exeを起動すると、C:\oracle9i\bin\oci.dllがシステムで最初に見つかるけれど、cx_Oracleの想定するバージョン(10.2)と違うのでシンボルが見つからなくて例外が起きる。

Python 2.5を使うときは常に10.2のOracleクライアントを使う(が見つかる)ようにしたい。でも他のアプリケーションには影響がないようにしたい。

以下のファイルを作成することで解決。

#C:\Python25\Lib\site-packages\sitecustomize.py
import  os
ORA_PATH=Z:\instantclient_10_2
#環境変数のPATHを書き換える
os.environ['PATH'] = "%s%s" % (ORA_PATH, os.environ['PATH'])
#print os.environ['PATH']

ちなみに、今回初めて、Oracle Instant Clientを使ってみたけど、これは楽でいいね。Oracle8用のも欲しいがなあ。

月末はcalendarモジュール

先日のエントリにいただいたトラックバックが勉強になった。

id:bonlife:20080313:1205408129

dateutilは僕もちょっと見たんですが、ちょこっと使うには標準ライブラリでもないし重すぎるなあと思って、作ってしまいました。

それよりも、このdateutilの中でのcalendarモジュールの使い方の解説が勉強になりました。これはいいですね。

近いうちにcalendarモジュールを使って書き直そうと思います。

ありがとうございました。

3月14日追記

書き直しid:bonlifeさんに感謝。

OracleでFIRST_DAY

先輩に聞く前に、

  • まずよく考えみて、
  • わからなければ調べて、
  • それでもダメなら聞く、

という癖をつけないとなあ。厳しいぞ。

/* Oracle PL/SQLで日付からその月の1日を求める*/

/* to_date、to_charを使えるなら、考えればできる */
create or replace function first_day(thedate date) return date is
begin
    return to_date(to_char(thedate,'YYYY-MM')||'-01','YYYY-MM-DD');
end;

/* 調べてみれば、こっちがスマートだとわかる */
create or replace function first_day(thedate date) return date is
begin
    return trunc(thedate,'MONTH');
end;

/***** ついでに *****/

/* 年の最初の日 1月1日 */
create or replace function first_day2(thedate date) return date is
begin
    return trunc(thedate,'YEAR');
end;

/* 週の始まり日曜日(※NLSの設定次第) */
create or replace function first_day3(thedate date) return date is
begin
    return trunc(thedate,'DAY');
end;

最後に問題。月の日数を求めるにはどうする?