Windowsのサービスが起動しない+マウントした仮想ドライブ上のファイルを読めない

Windowsの制約として、仮想ドライブ上のファイルをServiceとして登録する事は出来ない。
実際には登録出来るのだけど、実行出来ない

また、Service内部からも仮想ドライブにマウントしたファイルを扱う事は出来ないので注意が必要。

理由は簡単で、WindowsのServiceは「Local Service」「System」「Network Service」という名前のユ
ーザーとして実行されるが「仮想ドライブをマウントする」と言う行為は、それを実行したユーザーでのみ有効なため、Serviceを実行しているユーザーからは見えない。

MongoImportでCSVデータを取り込む

    • headerlineを付けるとCSVの最初の1行目が、フィールド名として認識される。
mongoimport --db データベース名 --collection コレクション名 --type csv --headerline --file CSVファイル名

例えば

name,addr,tel
mataro,tokyo,090-1111-1111
hogehoge,kyoto,090-2222-2222
hugahuga,tokyo,090-1234-5678

と言うデータがあった場合

{
  "name" : "mataro",
  "addr" : "tokyo",
  "tel" : "090-1111-1111"
},
{
  "name" : "hogehoge",
  "addr" : "kyoto",
  "tel" : "090-2222-2222"
},
{
  "name" : "hugahuga",
  "addr" : "tokyo",
  "tel" : "090-1234-5678"
}

と言う風に取り込まれる。

Python覚書

ソースファイルのエンコード指定

# coding:UTF-8

エントリーポイントの書き出し

if __name__ == "__main__":
	print "Hello Entry Point."

ディレクトリの列挙

import os

def getdirs(path):
	dirs=[]
	for item in os.listdir(path):
		if os.path.isdir(os.path.join(path,item)):
			dirs.append(item)
	return dirs

コマンドラインパーサー

from optparse import OptionParser

usage = "usage: %prog [options] keyword"
parser = OptionParser(usage)

parser.add_option(
  "-ショート名", "--ロング名",
  dest="プロパティ名",
  type="型(stringとか)",
  default="デフォルト値(省略化)",
  help="説明"
)
parser.add_option(
  "-n", "--long",
  dest="prop",
  default=True,
  action="store_false", #オプションが指定された時にdestにfalseを設定する
  help="説明"
)

(options, args) = parser.parse_args()

# エラー処理
if len(args) > 0:
    # 処理できないargsが有ったので、エラーメッセージを表示しプログラムを終了
    parser.error("requires keyword. Try [-h] option to see help.")

#使い方
print options.プロパティ名

参考
http://docs.python.jp/2/library/optparse.html

ProtocolBuffer <=> Dictionary

https://github.com/Livefyre/protobuf-to-dict

環境変数の取得

#type 1
val = os.environ.get("ENV_VARIABLE") 
if val != None
    print val

#type 2
val = os.environ.get("ENV_VARIABLE", "DefaultVal") 

#type 3
val = os.environ["ENV_VARIABLE"]

#Dictionary的にアクセス
for k, v in os.environ.items():
    print("{key} : {value}".format(key=k, value=v))

Stringのフォーマット

"Hello {0}".format("World")

"Hello {what}".format(what="World")

参考
http://docs.python.jp/2/library/stdtypes.html?highlight=format#str.format

外部プロセスの呼び出し

import subprocess
cmd_with_args = "notepad.exe target.txt"
try:
  subprocess.call( cmd_with_args, shell=True )
except:
  print "cmd error %s" % cmd_with_args

その他参考
http://doloopwhile.hatenablog.com/entry/20100614/1276489378

Pythonで1Kとか1Gとかを数値にする(with regexのサンプルにもなるかなー)

http://mataro777.hateblo.jp/entry/2014/02/26/115853

ディレクトリをZip化

基本的には一気に出来ないので、ループで回して処理。

http://coreygoldberg.blogspot.jp/2009/07/python-zip-directories-recursively.html

ファイルパスの正規化と、環境に合わせたパスの取得

realpathはWindows+Cygwinの場合「c:\hogehgoe」を「/cygdrive/c/hogehoge」とかに変換する。

os.path.normpath( os.path.realpath(path) )

WebサーバーからHttpでファイルのダウンロード

import urllib
urllib.urlretrieve ("http://パス", "セーブするファイル名.txt")

参考
http://stackoverflow.com/questions/22676/how-do-i-download-a-file-over-http-using-python

Iniファイルの任意のセクションのパラメータを書き換える

# coding:UTF-8

import re
import sys
import fileinput

if __name__ == "__main__":

	trgFile = sys.argv[1]
	trgSection = sys.argv[2]
	trgParam = sys.argv[3]
	newValue = sys.argv[4]

	rSection = "^\s*(?P<section>\[\S*\])\s*(?P<comment>;.*$)?"
	rParameter = "^\s*(?P<param>{0})\s*=\s*(?P<value>\S*)\s*(?P<comment>;.*$)?".format(trgParam)

	rSec = re.compile( rSection )
	rPrm = re.compile( rParameter )

	inSection = False
	for line in open(trgFile):
		line = line.strip()
		if line != "":
			secRes = rSec.search(line)
			if secRes != None:
				if secRes.group("section") == trgSection:
					inSection = True
				else:
					inSection = False
				print line
				continue

			if inSection == True:
				res = rPrm.search(line)
				if res != None:
					if res.group("value") != newValue:
						print ";---Modified by tool---"
						print ";{0}".format(line)
						print u"{0} = {1} {2}".format(res.group("param"), newValue, res.group("comment") if res.group("comment") != None else "")
					else:
						print line
				else:
					print line
			else:
				print line
		else:
			print line

便利なsshfsでネットワーク先のストレージをマウント

 sshfs user@servername:<src_path> <mnt_path>

SSHで接続可能なサーバーのストレージを、Localにマウント。

マウント先のファイルにapacheとかがアクセスする必要があるときは「-o allow_other」オプションを付けてあげることで、アクセス出来るようになる。

sedでPATHの区切り文字をエスケープ

SRC_PATHに「c:\windows\hogehoge」とかが入っているとする。
DEST_PATHに結果が格納される。

#[\]を[\\]にエスケープ
DEST_PATH=$(echo $SRC_PATH | sed -e "s#\\\\#\\\\\\\#g")

#[\]を[\/]にエスケープ
DEST_PATH=$(echo $SRC_PATH | sed -e "s#\\\\#\\/#g")

#[/]を[\/]にエスケープ
DEST_PATH=$(echo $SRC_PATH | sed -e "s#/#\\/#g")

#[/]を[\\]にエスケープ
DEST_PATH=$(echo $SRC_PATH | sed -e "s#/#\\\\\\\#g")

socket.ioをnpmでインストールする時に、msbuildで失敗する

socket.ioををインストールする際、Windowsの場合はVisualStudioを用いてライブラリをビルドする必要がある。
その際にMSBUILDのエラーが発生してしまい、インストールに失敗してしまうことがある。

その場合は「--msvs_vesion=2013」のオプションを設定してインストールします。

npm install socket.io --msvs_version=2013