みんPy(改訂版) 読書メモ Chapter 4

Chapter 4 関数

キーワード引数

引数名を指定して関数を呼び出すことが可能。

def add(first, second):
    return first+second
    
add(second=1, first=3)

引数のデフォルト値

関数定義時にデフォルト値を設定することができ、呼び出し時に不要であれば省略することができる。 デフォルト値を設定する引数は、必ずすべてのデフォルト値なし引数の後に書かれる必要がある。

def add(first, second=1):
    return first+second

add(3)    # => 4

lambda式

lambda式の書式は以下のとおり

# lambda 引数のリスト : 式
lambda x,y : x+y  # x+yを返す関数の定義

みんPy(改訂版) 読書メモ Chapter 3

Chapter 3 条件分岐とループ

if文

Python は if-elif-else

比較演算子

  • 「等しくない」には <> も使える。(みんPyでは != 推奨)
  • シーケンスに含まれているかどうかを in で確認できる (x in y でシーケンスyにxが含まれているかを確認できる)。
  • シーケンスの==比較は、すべての要素が等しい場合にTrueとなる。

論理演算子

  • 否定は not
  • 論理積and論理和or (ショートサーキット演算。 &&||はない。)

forループ

Pythonforは、for-eachしかない。回数を指定する場合range()関数を使用する。

for i in range(10):
    # 0〜9の10回繰り返し
    :
    :

whileループ

Pythonにはdo-whileはない。breakcontinueはある。

ループ文のelse

ループの条件に値が一致しなくなってループを抜けた場合にのみ実施される。for にも while にも使える。 breakで抜けた場合は実施されない。

for i in range(3) :
    pass
else:
    print 'end loop without break'

#=> 出力される



for i in range(3) :
    break
else:
    print 'end loop without break'

#=> 出力されない    

空ブロック

何も処理を行わないブロックを定義する場合、何も書かないとエラーになる。そのようなブロックには pass 文を書く。

みんPy(改訂版) 読書メモ Chapter 2

Chapter 2 変数と組み込み型

算術演算

Python 3ではint同士の演算でも、結果が小数値ならば、小数値が返る。

1/2 => 0   # Python 2系
1/2 => 0.5 # Python 3系

累乗は ^ ではなく ** // で小数点以下切り捨ての割り算ができる。

文字列型

"A string" # ASCII文字列
'Another string' # ASCII文字列
u"A Unicode string" #ユニコード文字列
r"A raw string" #Raw文字列。¥エスケープされない。
"""Multiple line string
second line
third line"""    #複数行にわたる文字列。複数行コメントの代わりに使用されるときもある。

ASCII文字列でも、日本語文字列を8ビットデータとして持てる(その場合、ソースコード文字コードで記載される) 連結は+。*で繰り返しも可能。

型変換は組み込み関数int()やfloat()、数値から文字列へはstr()などを使う。 長さは組み込み関数len()をつかう。

インデックスを指定して文字の取り出しも可能。スライスもできる。

s = "ABCDE"
s[2] => "C"
s[2:4] => "CD"

文字から文字コードへは、組み込み関数ord()、その逆はchr()を使う。 ユニコード文字列はencode()メソッドで、特定の文字コードの文字列に変換できる。

リスト

li = [1,2,3,4,5]     # リストの定義
li[1] => 2           # 要素の取り出し(0オリジン)
li[-1] => 5          # 負の値も指定可能(後ろから数える)
li[1:3] => [2,3]     # スライス
li[:3] => [1,2,3]    # 片方の省略可
li[3:100] => [4,5]   # 範囲外でもエラーにはならない

リストとリストの足し算は、リストのマージ。 リストのかけ算は、同じ要素を持つリストを繰り返しマージしたものになる。 要素の削除は del 文

del li[1] => [1,3,4,5]

組み込み関数min(),max()で最大値、最小値とれる。

辞書

要素の削除は del 文 (キーを指定する)

タプル

タプルは辞書のキーにできる。

型変換のビルトイン関数

  • list() : シーケンス型をリストに変換
  • tuple() : シーケンス型をタプルに変換
  • str() : オブジェクトを文字列表現に変換

emacsをゆるーく使う (主にWindowsで) - インストール編

自分の知識の整理と環境構築ログとして整理してみたいと思ったので、イチから書いてみます。

gnupack版emacsをつかう

Windowsemacsを使う場合、ちょっと前まではMeadowが良かったようですが、最近はあまり更新されていないようなのでgnupack版emacsを使用します。
emacs for gnupack
オリジナルのemacsだと、日本語入力がインラインにならないという問題がありますが、gnupack版はその点パッチされて解消しているので基本こちらを使います。更新も速い。

環境変数HOMEは設定しておく

unix系OSで言うところの /home/<ユーザID> にあたるものを設定しておきます。お好みで。設定ファイルやelispemacs内で~/でアクセスできるフォルダがHOMEになります。

あとは使うだけ

最初使うときは戸惑いますよねー。次回メモ帳に勝てるようになるまでを書きたいと思います。

xkeymacsとの共存

Windowsで、emacs意外のアプリケーションでもemacsキーバインドを実現するためのソフトウェアとして、xkeymacsというものがあります。emacsを使い始めると、こいつがどうしてもほしくなると思いますが、emacs自身を除外する設定としても上手くオフにならない事象があります。
どうもemacs自身のバグのようです (チケット #23955: NTemacsにて、xkeymacsを無効に設定しても無効にならない - XKeymacs - OSDN)が、手元のgnupack emacs 24.1.1 でも特に直ってないようです。
ですがIMEのxkeymacsを無効にすれば特に問題なく使えます(変換中にxkeymacsのバインドが使えませんが、あまり困らないですよね?)。

expressのconfigure()は、なにをしているのか。

GUIDEを読んでもよくわからなかったので、ソースコードにあたってみました。
今現在、masterは2.x系の次のバージョンになっているらしく、2.x系とは構成も結構変わっているみたいですが、configureに関しては変更が入っていないようですので、2.xブランチの最新から該当箇所を見てみます。

2.x系ではhttp.jsに当該コードが入っています。
コピーすると

app.configure = function(env, fn){
  var envs = 'all'
    , args = toArray(arguments);
  fn = args.pop();
  if (args.length) envs = args;
  if ('all' == envs || ~envs.indexOf(this.settings.env)) fn.call(this);
  return this;
};

つまり、this.settings.env(環境変数NODE_ENVからセットされる。NODE_ENVが定義されていなければdevelopmentとなる)と同じ文字列が、第一引数に指定されているかをチェックして、同じだったら第二引数の関数を呼び出すというシンプルな処理です。

ここで不思議なのが、GUIDEの When configure() is called without an environment name it will be run in every environment prior to the environment specific callback. という記述。 prior to the environment specific callback は嘘なんじゃないのということ。「各環境固有のコールバックが呼ばれる前に、全環境共通のconfigureが実施される」ように読めるんだけど、その場で即コールバックを読んでいるので、そんな前後関係は考慮していない様に見える。

実際にコードを実行してみる。

var express = require('express');

var app = express.createServer(express.logger());

console.log(process.env.NODE_ENV);

app.configure('development', function() {
	console.log('configure for development');
});

app.configure('production', function() {
	console.log('configure for production');
});

app.configure(function() {
	console.log('configure for all');
});


app.listen(3000);

これでそのまま、NODE_ENV=development node server.js 等すると、出力は

configure for development
configure for all

となるので、やっぱりprior toしてない気がする。prior toが時間の前後関係を表しているのではなく、他の意味合いがあるのでしょうか。

結局のところ

configureは、環境ごとに切り替える必要のある処理を、簡単にかけるっていうものと理解していいのかな。どうやら特に特別なタイミングでコールバックされるわけでもなさそうなので、あくまで簡易なユーティリティ関数とでも思っておこう。

JoyentのNode.jsホスティングサービス no.de の利用規約の注意点

クラウドサービスを展開し、Node.jsのスポンサーであるJoyentが、無料のNode.jsホスティングサービスhttp://no.deを提供しています。正式名称はNode.js Development SmartMachineというようです。
基本的に無料なのですが、Developmentと名が付いているように、開発用に公開環境を貸してあげるよというスタンスのようで、Terms of Serviceを読んでいたら、二三点気になったので上げてみます。

  • 30日ごとに、git pushするかsshでログインする必要がある。
  • 30日間使用されていない(つまり、git pushとかsshログインのことか?)と返還されてしまう。
  • 1ユーザあたり1マシーン(なので、一個のhttp://***.no.de/しか使えない)。
  • 原則1年間の提供。1年後にはJoyent Cloud(有料)を使うよう推奨(encourage)される。

これらの制約を考えると、サービス作って放置するのは厳しそう。ただ、作るという意味では制約がとても少ない(sshで接続して自分でDBインストールできたり、Nodeのバージョンを上げたり)ので、使いやすいと思います。ただ有料のJoyent Cloudは一番安くて月$62.05(今日現在:http://www.joyentcloud.com/products/pricing/appliances/)なので、個人で持つにはちょっと高いなー。

作って放置だとHerokuhttp://www.heroku.com/になるのかなー。無料でやろうとすると、データストアが小さいので、そこがネックですけど*1

*1:いまちょっと見たらMongoDBの無料プランが240MBあるので、MongoDBつかえば結構行けるかも