Hatena::ブログ(Diary)

motieの日記 RSSフィード

2010-01-22 仕事ばっかで書くことないな、、、

tabの変わりにスペースを入れたい

| 10:11 |

tabの変わりにスペースを入れたいことなんてザラにあるとおもう。でも「tabキーが押されたら全部スペースにする」みたいにしてしまうと、tabが欲しいときに入れられなくなっちゃう。

そこでちょっと調べ物をしていたらいい方法*1。を発見。「タブの気持ちで半角スペース」tab分の半角スペースを入れてくれる。

せっかくなのでShift+Tabとかにバインドさせてみようと思ったらこれが思い通りに行かないらしく、また調べてたらいい方法*2が紹介されていた。これはShift+TabをF20が押されたことにして、F20をglobal-set-keyで指定して処理してやるという方法。

;;; タブの気持ちで半角スペース改
(set-extended-key-translate-table exkey-S-tab #\F20)
(defun insert-space-like-tab ()
(interactive)
(let ((tab (tab-columns (selected-buffer))))
(insert " " (- tab (mod (current-column) tab)))))
(global-set-key #\F20 'insert-space-like-tab)

2009-12-07

ひさしぶりにapacheの設定とか

| 02:04 |

apache2のMPM(multi processing module)について少々。

http://httpd.apache.org/docs/2.2/mpm.html

worker threadはスケーラビリティ、preforkは安定性・互換性って書いてある。若い世代の僕にとっては、java=thread、c=fork、って覚えるのが簡単。

preforkのほうは読んで字のごとく、接続が来る前にあらかじめforkしておいて、待ち受けポートへの接続がきたらそのforkされた子プロセスに通信を引き継ぐかんじ。手元のgentooさんがお釈迦ったので確認できないけど、おそらくconfigure時に指定しなければLinuxではpreforkが標準で選ばれると思われる。

安定性・互換性を求めるならprefork、っていうのは、つまり、

プロセス間にて意図しないリソースの共有(javaでいうクラス変数)を発生させなくて済む

ってことじゃないかしら。ほら、同一リクエストの中では複数回の同一クラス参照で同じ値を読み書きしたい、ってことがあるでしょ、多分。でもそれってちゃんと実装してないと別リクエストに影響及ぼす(及ぼされる)わけですから。

スレッドセーフなモジュール以外を使わないようにするか、あるいはこのような問題があると分かってworker使う以外はprefork使ったほうがハマらなくて無難なんでしょうね。

ドキュメントによると、以下のポイントは抑えておいたほうがよさげ。

  • MaxClientsのデフォ値は256*1
  • MaxClients個以上のアクセスは受け付けない。が、ListenBackLog個までキューイングする。ListenBackLogはDoS攻撃、多分synflood系の対策時に設定変更したりする値だったと記憶。
  • ふやしすぎるとスラッシングの問題があるかも(swap in/outの繰り返しによるI/Oオーバヘッドの過多、それに伴う性能低下)
  • パフォチューについてはここを見たまえだそうだ。

workerは一つの子プロセスに複数スレッド走らせることで処理効率を上げる、そんなところでしょうか。forkにせよインスタンス生成にせよ、重複するようなデータ分のメモリを確保し展開するには容量食うし時間も食うから。変更される予定のない値は一度メモリ上に読み込まれたらあとはシェアすればいいじゃん、ってことなのかしら。


今日はこの辺で寝る。

*1:要出自

2009-07-17 最近暑い

python3xを試す

| 02:43 |

python3(いわゆるpython3000)が正式リリースされたのはけっこう前だったと思うけど、ここのところ慣れないネットワーク機器との格闘でまったく触る時間が取れなかった。いまではだいぶ落ち着いてきたので、そろそろ手をだそうかな、と思い、Windows XPVista Businessにいれてみた。gentooはパッケージが無いので先送り。

モジュールについて使い方が分かったらメモしていこうと思ってたけど、せっかくなので3系のチュートリアル読みをやることにしよう。

基本的には下記URLチュートリアルをさらっていきます。

http://docs.python.org/3.1/tutorial/index.html


でも初回はインストールから。セットアップは簡単。公式サイトのダウンロードページからWindows x86 MSI Installerをダウンロードしてダブルクリックするだけ。途中いろいろと聞かれるけど気にせずOKOK言ってればよい。

お手軽に使いたかったらpathを通しましょう。

  • スタート
  • ファイル名を指定して実行(R)
  • sysdm.cplと入力してOK
  • システムのプロパティの詳細設定タブ
  • 環境変数
  • hogehogeのユーザ環境変数(U)の中からPATHを選んで編集
  • 変数値の一番最後に下記を追記*1

;C:\Python31;

コマンドプロンプトやらcygwinやらでpythonと打てばインタラクティブシェルが起動します。

抜け出すには下記をタイプ(exit()だけでもよいかも)。

import sys
sys.exit()

続きはまたこんど。

*1:バージョンに従って最後2桁を適宜修正のこと。

2009-06-15 (←click here)いまさらなpythonのメモ

いまさらなpythonのメモ

| 07:38 |

仕事と関係ないことをしていないということは、仕事以外していないということと同じである。そんな人生はいやだ。というわけで、ルータやスイッチから離れてpython書いてるときなどは「motieはIT屋でありかつ仕事中でない」が成り立つ貴重な瞬間。

まえに大学のサーバに上げていたwikiのメモ書きを書き直して上げていこう*1

続きを読む

*1:いろいろとやってたら各記事が個別のタイトルになってしまった。リンクで飛ぶにはまず日付リンクを踏まなきゃいけない仕様に。wikiの代わりにするのはなかなか難しい。

2009-04-06

osモジュールについて

| 22:11 |

最近、ファイルの移動(リネーム)や移動後の確認などをpythonでやることが多く、そのためosモジュールにはお世話になりっぱなし。せっかくなんでちょっとメモを書いてみます。


os.listdir(path)

osモジュールでの処理は、必ずunicodeになるようにした上で処理を行う。さもなくばファイル名が誤認識されたり、renameの場合では最悪ファイルが消えたりするかも(重複ファイル名で上書きされて消えたり)。

下記の例では、pathをハードコーディングしています。codingをcp932に指定したうえでu"ほげほげ"のリテラルを使っています。さらにwindowsの場合pathの区切り文字がバックスラッシュ"\"なので、r"ほげほげ"を指定してraw文字列リテラルとしてやります*1。結果、ur"ほげほげ"としました。

# coding: cp932
import os
print u"urで文字指定" , "*"*20

path=ur".\日本語のフォルダ\新しすぎるフォルダ"
for each in os.listdir(path):
    print each.encode("cp932"), type(each)

print文のencode("cp932")は、cmd.exe標準出力にだす場合には不要かもしれませんが、リダイレクトでファイルに吐こうとするとUnicodeDecodeErrorを出すので書いたほうがいいです。

実行すると下記のように出ます。

urで文字指定 ********************

やや意味のあるファイル.txt <type 'unicode'>

意味のないファイル.txt <type 'unicode'>

unicodepath処理したから、見つかったファイル名もunicode扱い、ってことですかね。

ちなみに入力pathunicode型にしないでos.listdir()にかけると

# coding: cp932
import os
print "rで文字指定" , "*"*20
path2=r".\日本語のフォルダ\新しすぎるフォルダ"
for each in os.listdir(path2):
    print each, type(each)

上のようなコードになりますが、結果は

rで文字指定 ********************

やや意味のあるファイル.txt <type 'str'>

意味のないファイル.txt <type 'str'>

str型になりました。

型を間違えたまま処理を続けるとpath文字列がおかしくなった状態で処理されてしまう可能性があるので、いつもと同じく入力時にdecode、出力時にencodeを心がけたほうが無難かと。


os.path.join(path1, path2, ...)とos.walk(path)

os.walk()とos.path.join()の組み合わせは王道じゃないでしょうか。

os.walk()は、詳細は知りませんが、要するにディレクトリ再帰的に移動してあるディレクトリへの相対パス(root)、含まれるディレクトリのリスト(dirs)、含まれるファイルのリスト(files)を返します。つまり現在のワークディレクトリからはroot + "\" + dirsでアクセスできます。ただしこのように\で繋ぐとwindows環境依存となるため、パスを繋げる目的でos.path.join()を使います。

#coding: cp932
import os
path=ur".\日本語のフォルダ"

for root,dirs,files in os.walk(path):
    print type(root), root
    for eachfile in files:
        print u"\t", type(eachfile), eachfile ,
        fullpath = os.path.join(root,eachfile)
        print os.access(fullpath,os.F_OK)

参考までに、os.access(path, os.F_OK)はpathの有無を調べてTrueあるいはFalseを返します。

os.renames(src,dst)

じつはこいつがまだよく分かっていない。

src,dstの型はunicodeで大丈夫なのか、あるいは環境に合わせる(今回はcp932)なのか。

そのうち調べる、、、

*1「"r" および "R" 接頭文字を "u" や "U" と合わせて使った場合、\uXXXXおよび \UXXXXXXXX エスケープシーケンスは処理されますが、 その他のバックスラッシュはすべて文字列中に残されます 。」と文字リテラルの説明にあるので注意が必要。ほか、r"あいうえお\"のように\がリテラルの最後にくるケースもマズい。