思い切りいいな、Amazon

まあ、ちゃんと情報をフォローしていなかった僕が悪いんだけれど、某システムでこんなのが出た。対策に結構時間がかかってしまった。

We’re Sorry – Service Gone

Amazon Ecommerce Web Service 3.0 has been deprecated after many years of useful service on March 31st 2008. Please upgrade to the Amazon Associates Web Service 4.0 as detailed in the migration guide. Please visit Amazon Associates Web Service Developer Forum for more information. If you came to this page from an RSS feed, visit Amazon’s Product RSS Feeds page for an upgrade.

最初は、“Migrating from Amazon ECS 3.0”を読みながら、4.0に直接対応するか、3.0と4.0のゲートウエイを作るかどうか悩んだ。
でもまあ結局は4.0対応に修正することに。

pyamazonpyawsに置き換えて、文書構造もタグ名も変っているからXML取得後の処理も修正。

4.0は3.0に比べてかなり仕様が整理されて良くなったのは確か。

サーバは14,000円(+60,000円ぐらい)。

8年ほど24時間稼働しっ放しのサーバ機でもう結構ヤバいのが何台かある。

その分野が趣味のヒトに相談すると、このサーバ機をベースとして買って、CPUとかメモリとかハードディスクを別に買ってきて作るという。その筋の人たちの間では結構有名らしい。

まあ仮想化とかクラスタリングで機械としてのサーバ機は、あんまりサービスの信頼性とリンクしなくなってきてるし、いいか。

でかいけど。

しかし安い。

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:"以下に無いから勝手に無いと思っていた。他にもたくさんこんな思い込みがありそう。

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;

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