2010/04/29

[Google App Engine]Djangoでのif文

どうやらSREngine: Sein blog: 【Python】 Djangoテンプレートのfor文とかif文とかを拝見すると、if文そのものはわかりやすかったのですが、==や!=がサポートされていない感じだ。

なので、変数に 0 or 1を代入し、判断していくのが基本となるのかな?

テンプレートエンジンだから、確かに、そこまで厳密にifで比較する必要がないのでいいっかなーっと。

ちなみに、Djangoのifの解説は、こちら

2010/04/28

[Google App Engine]Djangoでの変数展開

Google App Engine上でDjangoを使う場合の、変数展開ですが、

The Django template language: For template authors

に書かれていますが、{{ 変数名 }}でいけるようです。

実際に試してみたところ、きちんと変数が展開されました。

他にも{% %}などを使った方法がありますが、今の段階ではまだ必要がないので、大丈夫なのかなと。

後、コメントは、pythonと似ていますが「# #」でオッケーのようです。

2010/04/27

[Google App Engine]ブラウザ判定

今、簡単なアプリケーションを作成しているのですが、ブラウザを判定したい場合の方法を調べました。

■[Python]Google App EngineでUserAgentを取得する
を参考にさせていただくと、「self.request.user_agent」と取得できると書いてあったので、これを使ってgf_getBrowser関数を考えてみます。

"""-------------------------------------------------------
ブラウザの判定
1:Internet Explore
2:chrome
3:firefox
4:iPad
5:iPod touch、iPhone
6:safari
7:その他ブラウザ
-------------------------------------------------------"""
def gf_getBrowser(auser_agent):

#小文字に変換
lv_user_agent = auser_agent.lower()

#Internet Exploreの場合
ln_ret = lv_user_agent.find("msie")
if ln_ret != -1:
return 1
#chromeの場合
ln_ret = lv_user_agent.find("chrome")
if ln_ret != -1:
return 2
#firefoxの場合
ln_ret = lv_user_agent.find("firefox")
if ln_ret != -1:
return 3
#ipadの場合
ln_ret = lv_user_agent.find("ipad")
if ln_ret != -1:
return 4
#ipod touch iPhoneの場合
ln_ret = lv_user_agent.find("iphone")
if ln_ret != -1:
return 5
#safariの場合
ln_ret = lv_user_agent.find("safari")
if ln_ret != -1:
return 6
#その他ブラウザの場合
return 7

class MainPage(webapp.RequestHandler):
def get(self):
#ブラウザの種類を取得
self.response.out.write(
gf_getBrowser(self.request.user_agent)
)

application = webapp.WSGIApplication(
[('/', MainPage)]
, debug=True
)

def main():
run_wsgi_app(application)

if __name__ == "__main__":
main()

で実行してみると、確かに、数値を得ることができました。
(IE、firefox、chromeで確認)

ただこのファンクションでどうしても気に入らないのが、引数を使っちゃっている点。

self.request.user_agentを引数にしないと、判定ができないかつ、if文の分岐よりも、self.request.user_agent自体が重要なのであって、関数内部でこれを生成したいなーっと。

そうしないと関数の独立性が保てないので致命傷。

もっといいやり方はないものだろうか??

他の参考
3.6.1 文字列メソッド

2010/04/26

[Python]複数行コメント

Pythonでは、一般的に、「#」で単一行コメントを行いますが、複数行コメントはどうすればいいのかなーっと調べていたところ、

しかし、インデントさえ揃っていれば、文字列だけの文が存在しても構文上はエラーとはならないことを利用して、ダブルクォーテーション(またはシングルクォーテーション)3つで文を囲んで、コメントのように扱うことができます。

via:[Python] コメント

これを利用して下記のプログラムを作ってみました。
def hoge():
"""
print "NG?"
"""
print "OK?"

hoge() #OK?と表示される

確かに、「OK?」と表示されました。

この技便利だなー。

2010/04/25

[JavaScript]typeof演算一覧

が昔のメモに書きとめてあったので、公開します。

typeof(123)
・・・number
typeof("ABC")
・・・string
typeof("encodeURI")
・・・function
typeof(true)
・・・boolean
typeof(document):
・・・object
typeof(aaaaa):
・・・undefined

2010/04/24

[life hack]httpで500エラーが発生した時

以前、IEでネットを見ていたときに、http:500エラーが頻繁に発生することがありましたので、その時の解決方法を書きます。
(IE only)

ツール→インターネットオプション→詳細設定→ブラウズの「httpエラーメッセージを簡易表示にする」

のチェックをはずす

2010/04/23

[lifehack]投資本を読む時の注意点

やはり、起こるべくして起こった、この現象。

カツマさんの本を信じた人が暴落で大損した、という話。実は僕も同時期に大損している。

via:リストラなう!その20 Twitter風にテキトー更新なんだよ

実際これだけ読んでも、どれが該当する本なのか、わからないのでエントリー終了後のコメントを確認してみると、

カツマ現象をしつこく「まだ言うか!」と思われるでしょうが、まだ言います。
ここからが一番言いたかった本質です。

あの「お金は銀行に預けるな」の編集の人は、金融関係のことを良く知らず、
元マッキンゼー、公認会計士という肩書の人がいうのだから間違いないだろう、と
カツマさんを全面信用して書かせたのだと思います。

via:リストラなう!その20 Twitter風にテキトー更新なんだよの読者Aさんからのコメント

前回、[本]お金は銀行に預けるなを書いた際に、

「本を書いた著者は、実際にこの方法に乗っ取って投資をしたのですかー??」

と書いたのですが、投資の本を読むときは、やはりきちんと著者がその通りに投資をしているのが疑った方がいいというのが確信しました。

確かに、たぬきちさんのおっしゃっているように、カツマさんの責任ではないと思うのですが。。。

あそこまで社会的に影響力のある方の方針に従った結果となると。。。。

よくわからなくなってきました。

2010/04/22

[JavaScript]applyについて

そうかーそういうことだったのかー。
ちょっと前に、applyについて触れる機会があったので、ちょっと掘り下げてみようかと。

まずは、■[WEB] JavaScriptでのthisと applyの関係とはで紹介されているプログラムを記載します。

function aContructor() {
this.aVal1 = 1;
this.aVal2 = 2;
this.aFun1 = function() {alert(this.aVal1);}
this.aFun2 = function() {alert(this.aVal2);}
}

function bContructor() {
aContructor.apply(this);
this.bVal = 3;
this.bFun = function() {alert(this.bVal);}
}

var x = new bContructor();
alert(x.aVal1);
alert(x.aVal2);
alert(x.bVal);
x.aFun1();
x.aFun2();
x.bFun();

via:■[WEB] JavaScriptでのthisと applyの関係とは

当初、これを読んだ時に、prototypeを使えば、いけんじゃーないのかーっと思ったのですが、できませんでした。

何が違うのかなーっと思っていたら、

aContructor.apply(this);

に相当する処理は、オブジェクト指向でいうところの、「継承」に相当するものではないのかという結果にたどり着きました。

hoge.prototype.method_001 = function()・・・

みたいな書き方は、メソッドの登録であって、

hoge_instance = new hoge()

はインスタンス変数の宣言に相当し、確かに、継承する方法を今まで考えていなかったなーっと思いをめぐらしました。

そこで、継承のようなものを実現するために、applyが使われていると思えば、上記のプログラムに納得することができました。

しかし、つくづく思うのが、JavaScriptって奥が深いなーっと。

html version5になったらますます進化していくんだろうなー。

2010/04/21

[JavaScript]iframeについて

昔メモした内容を掘り起こしてたら、下記のことが書いてありました。

※iframeは、document.CreateElement("iframe")ができない
ただし、firefoxはできる。
なのでinnerHTMLで対応

だそうです。

2010/04/20

[PHP]ファイル入力処理

あるtest.txtファイルを読み込んで一行ずつ取り出す処理について調査

参考サイトはPHP:テキストの読み込み

//ファイルを開く
$fp = fopen ( "test.txt", "r" )

//ファイルの読み込みと出力
while (! feof ($fp)) {
$load = fgets ($fp) ;
print($load);
}

//ファイルを閉じる
fclose ($fp);

この変は、pythonと処理が似ている感じがしました。

スクリプト系の言語は、同じような感じなんだなーっとしみじみ。

先ほど紹介したサイトとちょこっと違うのは、fgetsの第二引数がないこと。

どうやら、PHP4.2.0以降はオプションのようで、今回、使ったバージョンは5なので、省略しました。

これで難なくファイルのreadができるぞと。

2010/04/19

[JavaScript]正規表現について

まだ、[本]詳解 正規表現 第3版を読了する前に、google docsでまとめたものなので、未熟な部分があるかもしれませんが、JavaScriptの正規表現について書いていきたいと思います。
(突っ込み満載だと思うので、思う存分つっこんでください。)


エスケープ文字はバックスラッシュ「\」で表され、キャレットやドルマークの手前に付加することでエスケープが行われます。
例:「search」という語が文字列として単独で現れた場合にマッチする例

^search$
^は、キャレットは文字列の始まりを指定するために利用されるもの
$は、ドルマークは文字列の終わりを指定するために利用されるもの

※もし検索文字列の中にキャレットやドルマークを含めたい場合には、エスケープシーケンスを使用しなければならない。

エスケープ文字は、「$」で表すことができる。

キャレットは$^で、$マークは、$$で表現する。
数の範囲を検索したい場合「12345」 or「1-5」
match()
-- 文字列に対して正規表現でマッチを行うために用いられる。マッチした箇所が1つ以上あった場合は、すべてのマッチが配列として返され、配列のそれぞれの要素にはマッチした文字列のコピーが含められる。一方、マッチがなかった場合は、nullが返される。
replace()
-- 文字列に対して正規表現でマッチを行い、マッチした文字列を新たな文字列で置換するために用いられる。第1引数には正規表現を、第2引数には置換先の文字列を指定する。
search()
-- 正規表現と指定した文字列とのマッチ箇所を検索するために用いられる。マッチした場合は、正規表現がマッチした部分に当たる文字列のインデックスが返される。一方、マッチしなかった場合は-1が返される。
test()
-- 正規表現が文字列にマッチするかどうかをテストし、マッチした場合はtrueを、マッチしなかった場合はfalseを返す。文字列リテラルに対しても文字列変数に対しても用いることが可能であり、基本的には、文字列の値に対して正規表現を適用するために用いられる。

・コンストラクタを用いるアプローチでRegExpオブジェクトを作成し、大文字と小文字を区別せずに文字列を検索する例。
testRegExp = new RegExp("^search$","I")

・同様のオブジェクトを、リテラルのテキスト書式を用いると(スラッシュでくくって)次のように書き換えることもできる。
testRegExp = /^search$/i

<html>
<head>
<title>RegExp test</title>
</head>
<body>
<script language="javascript">
testRegExp = /search/i;
if (testRegExp.test("this is a search string")) {
alert("The string was found.");
} else {
alert("No match found.");
}
</script>
</body>
</html>

上の例では、searchという文字を大文字小文字区別なく、メソッドの引数の文字列から検索をかける。

引数がthis is a search stringと書かれているので、3文字目にsearchがありtrueが返ってくる。

2010/04/18

[本]突っ込み満載の「他人を見下す若者たち」

こちらもすぐに読了


第1章 感情が変わった
第2章 やる気が低下する若者たち
第3章 他者を軽視する人々
第4章 自己肯定感を求めて
第5章 人々の心に潜む仮想的有能感
第6章 自分に満足できない人・できる人
第7章 日本人の心はどうなるか

via:目次

本書を読んでいくつか突っ込みたい点があったので、書いてみます。

まず若者の気持ちの変遷について、映画と歌詞で使われている気持ちや感情で移り変わりを見ているのですが、これってそもともどうなの?と思うところがありました。
というのも、映画とか歌の歌詞って、一種のプロパガンダ的なこともあり、確かに潜在意識下に若者が感情(怒りや悲しみや欲望など)を持っているかもしれないが、それって若者だけではなくて誰しももっていると思うし、これで判断するのはいかがなものかなと思ってしまいました。

で、昔の人と比べて怒らなくなったと書いてあったが、そりゃーそうだー。
怒ったりいかったりしたりするもんなら、ソッコーで警察行きになってしまうし、将来に傷がついてしまうことを直感的に理解していると思うので、いからないと思うし、怒ったところで何も変わらないと思っている。
現に何か怒ったり反抗したことで、変わったことってありますでしょうか?
と著者にお尋ねしたくなりました。
しかも、昔と比べて規制だらけだしね。
インターネットをとってみても昔は薬を販売することができましたが、今は規制的に止められています。
(改正薬事法が施行、医薬品ネット販売規制への対応は)

他の業界を見ても、1000円カットの床屋が訴えられようとしています。
(参考:「低額カット店に洗髪義務付け」の是非)

だからそんなストレスがたまりにたまって変な方向に走ってしまう人がいるのでは、ないのかなーっと考えました。

なぜこのように規制がドンドンできてしまうのか?この構図の流れとして一環した狙いがあるのですが、それ書くと大変なことになりそうなので、別の機会に。

後、仮想的有能感が高くなってしまう理由をp141から4つの原因で書いてあるのですが、これって著者の主観的な主張かなーっとすっげー思った。
電子機器が普及し、使いこなせるからって、自分が有能とは思わないし、あらゆる情報にアクセスできるとしても一概に偉そうになるとも思えないし、お笑い番組を増やして人をバカにしたような風潮になっているのもそもそもその番組を作っているのは誰だよ?という冷静に突っ込みざるを得ない。

かといってこれは若者ばかりではなく、大人でもおこりうると書いてあったので、まー少しは納得できる部分はあるのかなーっと。

弾さんのブログにもレビューがありました。
他人を見下す(バ|ワ)カ者たち

2010/04/17

[JavaScript]readyStateの確認

ajaxを使う時に、readyStateがどこからどのこまで値が変化し、各値がどのような意味を持っているのか気になったので、調べてみることにしました。

参考サイトはこちらです。
作って理解するAjax --- No.2
インクリメンタル検索を実現 [クライアント編]


/***********************************************************
状態が変化した時に発生する関数
====================================
readyStateプロパティーの状態一覧
・0:UNINITIALIZED (未初期化)
・1:LOADING (サーバーとの通信開始中)
・2:LOADED (サーバーからの応答待ち)
・3:INTERACTIVE (サーバーからの応答を処理中)
・4:COMPLETED (処理完了)
====================================

基本的には、4しか使ってないので、他の値はシカトしていたんだけど、こうしてみると、各値に遷移した時に、何か処理を組み込みたい場合には、重要になってくるのかなーっと思ってみたり。

2010/04/16

[Java]windows上でjavaの設定を

行う方法は、設定⇒コントロールパネル⇒Java Plug INで

設定できる。

2010/04/15

[JavaScript]JSONのアクセスについて

まずは、JSONのキーのアクセスについて。

var hoge = {
"Sample1":"1"
, "Sample2":"2"
};
for(i in hoge){
alert(i);
}

実行結果は、Sample1、Sample2と順に表示されます。

では次にアクセス方法について、
var hoge = {
"Sample1":"1"
, "Sample2":"2"
};
for(i in hoge){
alert(hoge[i]);
}

実行結果は、1、2と順に表示されます。

理由はわからないのですが、なぜ、hoge.lengthで長さを取得することができないのか?

hoge.lengthを表示すると、undefinedが返されます。

valueが配列の場合は、当然、lengthを取得することができるんだけど。

var hoge2 = {
"Sample3" :["apple","orange"]
};

//「2」が返ってくる
alert(hoge2["Sample3"].length);

var hoge3 = hoge2["Sample3"];

for(var i=0;i<hoge3.length;i++){
alert(hoge3[i]);
}

var hoge2 = {
"Sample3" :[
{"title":"apple","img":"orange"}
, {"title":"lemon","img":"banana"}
]
};

var hoge3 = hoge2["Sample3"];
for(var i=0;i<hoge3.length;i++){
//2回ループが回り、一度目は、「apple」が表示され、
//二度目は、「lemon」が表示される。
alert(hoge3[i]["title"]);
}

うーん、なぞ。

2010/04/14

[python]ロング整数について

今、昼休み中にこちらを読んでいます。(といっても初版)


その中で、ある程度桁をもった演算を行いたい場合に、整数の末尾に「L」をつけないとおかしくなるという記述があり、その実行結果も書かれていたのですが、いざ、コマンドプロンプトで実行してみると特にエラーも発生せずに実行できてしまったのだが。。。


>>> 99999999+1
100000000L
>>> 200L+1
201L

まーできること自体便利でいいからいんだけど、原因がちょっと気になる。

考え付くこととして、pythonのバージョンが当時と比較してあがったので、それだけ演算ができるということになったのだろうと考察しています。

2010/04/13

[本]御社の営業がダメな理由

ものすごく後押しされました。



第1章 「スーパー営業マン」誕生という幻想
(あるダメ会社の光景嘘の報告をする部下 ほか)
第2章 二‐六‐二の法則で会社を考える
(働き蟻の法則中小企業に最優秀者は来ない ほか)
第3章 「営業センス」は伸ばせない
(標準社員に注目する第三の方程式の意味 ほか)
第4章 営業日報が元凶だった
(疑惑の営業日報嘘は見破れない ほか)
第5章 営業を「因数分解」する
(「追い込み」に意味があるかトップセールスマンはアベレージヒッター ほか)

via:目次

本書は、どうして会社の営業が伸びないのかその原因について解明しています。

本編に書いてあるとおりに、「トップセールスマンがいないから」、「若手社員が育たないから」、「中途採用をすれば問題が解決する。」といった一般的に考えられている原因を真っ向から否定し、別の原因を述べています。
(その原因、真実を明らかにしたい方は、是非、本書を。)

で、その突き止めた原因に対して対策もきちんと書かれているのですが、その方法がこれまで体験してきたことと同じでなんだかうれしかったです。

何も特別な方法でもなく、かと言って、徹夜まで働けといっているわけでもありません。

さらに、営業セミナーに通いまくれと推奨もしていないし、巷にあふれている営業本も買えとも推奨していません。

あくまでも誰でもできる方法で、売上を伸ばす方法が書かれています。

さきほどうれしいと書いた理由ですが、思い当たることがあって、本職が営業ではないのですが、当時、大学生だった時、超内気だったので、その内気さを克服するために、友達同士で2グループ作って某K大学の学園祭に赴き女性に声をかけまくったことがあります。
(本当は、2回、このイベントを開催する予定だったのですが、今の家内と付き合ってしまったため、一回しか実現ならず。。。)

次から次に声をかけてもシカト、無視されるばかりなのですが、不思議なことに何人かの内、一人は話をしてくれるんですね。

当然、うれしくなってくるので、ますます声をかけまくります。

で、さらに声をかけまくると番号を交換することもできました。

この時に思ったのは、質もさることながら量がものすごく重要なんだということを学んだわけですが、それを裏付けるように、もう片方のグループは全然、女性に声をかけていなかったので、番号を交換することができませんでした。

というわけで、この出来事を教訓に生きてきたのですが、著者の藤本篤志さんは、USENの元取締役、スタッフサービス・ホールディングスの元取締役でもあり、現在、グランド・デザインズの代表取締役でもあり、本書での考えと一致していたのでなんだかうれしかったなーっと。

もっと面の厚さを硬くして空回りしない程度にがんばろうと思いました。

2010/04/12

[oracle]マテリアライズド・ビューの作成

実は、oracleには、viewではなく、マテリアライズド・ビューというものが存在します。

それについてちょっと引用させていただきます。

Oracleには、マテリアライズド・ビュー(略してマテビュー)というものがある。
単純に言って、テーブルのように実体を持ったビューのこと。

単なるビューは元となるテーブルを結合してみたり演算してみたりするものだが、使うたびに計算し直すのでパフォーマンス的に不利。
マテリアライズドビューは その計算結果を保持しておき、いちいち計算し直さない。
使う側からすれば、ただ単に「高速なビュー」という感じになる(更新頻度が少なく、参照頻度が高いデータの場合)。

via:マテリアライズド・ビュー

で、作成方法は、下記のようになります。

create materialized view 任意の名前
as
select *
from 対象となるテーブル名

今、このエントリーを書いていて思ったんだけど、from句には、viewやsynonymなどでも可能なのだろうか?

2010/04/11

[oralce]一定件数を返す

最近、ちょっとさぼり気味ですみません。

ちょっとリア充で。
中々きちんと更新できていない状況です。

前に、[oracle]行番号の表示で行番号の取得方法を書いたのですが、それとは別の方法を今日は書きたいと思います。

SELECT *
FROM (
SELECT ROWNUM AS SEQ_NO
, テーブル名.*
FROM テーブル名
)
WHERE SEQ_NO between γ AND β

こんな感じで取得できると思います。

2010/04/10

[oracle]ホスト名を取得するのは

下記のsql文を実行すれば取得することができます。

select host_name from v$instance ;

2010/04/09

[oracle]DB名を取得

はこちらのsqlで取得することができます。


select SYS_CONTEXT('userenv','DB_NAME')
from dual
;

2010/04/08

[oracle]文字コードの確認

は下記のsqlをたたけば取得できます。

SELECT VALUE
FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER='NLS_CHARACTERSET'

2010/04/07

[python]標準入力からの入力

ちょっと私用で必要だったので調べてみました。

#!/bin/python
import sys
for line in stdin:
print line,

via:標準入力(stdin)から一行ずつ、最後まで読む

または、

#!/bin/python
name = raw_input('Enter name: ')
print name

via:対話形式で一行ずつ端末から読む

ファイルを開いて表示する方法は↓に書いてあったので省略

2010/04/06

[oracle]テーブルの制約を取得する

あるテーブルの制約を参照するsqlは↓を実行します。

select A.*
, B.*
from user_constraints A
, user_cons_columns B
where A.table_name = B.table_name(+)
and A.constraint_name = B.constraint_name(+)
and A.table_name = 'テーブル名を入力'
;