「システムエラーのメモリ ダンプファイル」がデカすぎる件

ハードディスクの残量が少ないのでちょいちょいディスク クリーンアップしてるんですが、「システムエラーのメモリ ダンプファイル」が10GBを超えててギョっとしたので保存しない方法を探してみた。

http://www.jyoukyoutools.com/?p=899
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10108328705

自分の環境はWin7で「システムの詳細設定の表示→詳細設定タブ→起動と回復の設定ボタン→デバッグ情報の書き込みのカーネルメモリダンプをなしに変更」にした。

もうディスククリーンする日常とはさよならしたい。

getoptの戻り値をグループ化

こういうのが欲しい。

# hoge.py
import sys
import getopt
import itertools

opts, argv = getopt.getopt(sys.argv[1:], 'x:y:z:')

keyfunc = lambda item: item[0]
opts = sorted(opts, key=keyfunc)
opts = itertools.groupby(opts, key=keyfunc)
opts = [(k, list(vv for _, vv in v)) for k, v in opts]
opts = dict(opts)

import pprint
pprint.pprint(dict(opts=opts, argv=argv))
$ python hoge.py -x5 -y6 -x7 -y8 -z9 -x0 foo bar baz
{'argv': ['foo', 'bar', 'baz'],
 'opts': {'-x': ['5', '7', '0'], '-y': ['6', '8'], '-z': ['9']}}

optsの合成がもっとスマートに出来ないものか。

Python3.4(win64)用の_curses.pydをビルド

https://github.com/shive/python_curses_for_windows

ちゃんと日本語が使える _curses.pyd が欲しかったんですが、ネット上に見つけられなかったので自分でビルドしてみた。

これで tui 作り放題ですね!

昔のN88BASICを叩いてたころが懐かしくなってきたのでテキストベースのゲームが作りたい衝動にかられる。。

git gcの限度設定

リポジトリが太ってくると git gc --aggressive をやるんですがそうすると.packがかなり大きくなるので設定を入れてみた。

http://stackoverflow.com/questions/3095737/is-there-a-way-to-limit-the-amount-of-memory-that-git-gc-uses

$ git config --global pack.windowMemory 1g
$ git config --global pack.packSizeLimit 1g

この状態でgit gcやってみる。

$ du -sh .git; find .git -type f | wc -l
2.9G .git
77858

$ git gc --aggressive --prune=now
... (コーヒーブレイクしながら待つ) ...

$ du -sh .git; find .git -type f | wc -l
2.0G .git
15

$ find .git -type f | xargs ls -lh | fgrep .pack
-rw-rw-rw- 1 *** ***  916M 76 **:** .git/objects/pack/pack-6430d4f13f444f3b1e001169af98fccaf7f02154.pack
-rw-rw-rw- 1 *** *** 1022M 76 **:** .git/objects/pack/pack-f05baf59a54e65675a29e58b675dc63cf2e551b9.pack

小分けにされました。

gnupack-13.00に更新したときのメモ

gnupackが更新されたので追従してみた。いつもありがとうございます。
http://d.hatena.ne.jp/ksugita0510/20150502/p1

gnupack-13.00の準備

いつものようにcygwinpythonを削除。普段はwindowspythonを使っている。

$ apt-cyg remove python

curl,git-svnがデフォルトだと入っていないのでinstall

$ apt-cyg install curl git-svn
elpy導入

事前にpythonにelpy,jedi,rope-py3kを導入。emacsにelpyパッケージをインストール。
init.elに下記を追記。

    (setq elpy-modules
          '(elpy-module-company
            elpy-module-eldoc
            elpy-module-pyvenv
            elpy-module-yasnippet
            elpy-module-sane-defaults))
    (setq elpy-rpc-backend "jedi")
    (setq elpy-rpc-python-command "/home/bin/python") ;; 俺のpython.exe

    (elpy-enable)

elpy-modulesはflymakeとhighlight-indentationは別のを使ってるのでそれ以外に絞る。
elpy-rpc-backendは明示的に"jedi"にした。デフォルトでもjediになってるような気がした。
elpy入れたらpython-modeあんまり意味無いように思えたので前まで使っていたpython-modeは削除。

python-modeでinternal-shellが起動してしまうとディレクトリが開けなくなる

謎。そもそもデフォルトのpython.elだけだとinternal-shellは起動されないので調べていくと、
semanticをrequireしただけで自動的にsetupで混入される模様。setupを無効な関数に置き換え。

(defun wisent-python-default-setup () nil)
相変わらずauto-revert-modeを有効にすると起動後1回だけ異常に待たされる。

1分近く完全に固まる。emacs24.5でも同じでした。前のgnupack-12.03はemacs24.4。これはローカルの問題なのだろうか…。

追記 cygwin/emacswindows-python/elpy はパス形式が違うため正常に動作しない

site-packages/elpy-1.8.0-py3.4.egg/elpy/rpc.pyを下記のように書き換え。

@@ -10,6 +10,7 @@
 import json
 import sys
 import traceback
+import subprocess
 
 
 class JSONRPCServer(object):
@@ -77,6 +78,14 @@
         self.stdout.write(json.dumps(kwargs) + "\n")
         self.stdout.flush()
 
+    # >>> for cygwin >>>
+    @classmethod
+    def convert_filename(cls, filename):
+        if filename.startswith('/') and ('\n' not in filename):
+            filename = subprocess.getoutput(['cygpath', '-wa', filename])
+        return filename
+    # <<< for cygwin <<<
+
     def handle_request(self):
         """Handle a single JSON-RPC request.
 
@@ -94,6 +103,23 @@
         method_name = request['method']
         request_id = request.get('id', None)
         params = request.get('params') or []
+
+        # >>> for cygwin >>>
+        for pos, value in enumerate(params):
+            if isinstance(value, dict):
+                if 'filename' in value:
+                    value['filename'] = self.convert_filename(value['filename'])
+                if 'project_root' in value:
+                    value['project_root'] = self.convert_filename(value['project_root'])
+            elif isinstance(value, str):
+                params[pos] = self.convert_filename(value)
+        # <<< for cygwin <<<
+
         try:
             method = getattr(self, "rpc_" + method_name, None)
             if method is not None:

かなり適当ですが、これでelpy-refactorも呼べる。
前からemacs側でwindows-path.elを導入してあるので、もしかしたらどこかでそれも必要かも?
http://www.emacswiki.org/emacs/windows-path.el

WindowsでOpenEXR-2.2.0をビルド

cmake-3.2.2
VisualStudio2013

# Makefile
DEST_DIR := $(shell cygpath -ma libs)
DEVENV := "$(shell cygpath -ua "$(VS120COMNTOOLS)/../IDE/devenv.exe")"
CMAKE := "$(shell cygpath -ua "$(PROGRAMFILES)/CMake/bin/cmake.exe")"
CMAKE_TARGET := 'Visual Studio 12 Win64'

all:
	$(MAKE) zlib
	$(MAKE) ilmbase
	$(MAKE) openexr

download:
	curl -L \
		-O http://zlib.net/zlib-1.2.8.tar.gz \
		-O http://download.savannah.nongnu.org/releases/openexr/ilmbase-2.2.0.tar.gz \
		-O http://download.savannah.nongnu.org/releases/openexr/openexr-2.2.0.tar.gz

clean:
	$(RM) -fr */

zlib:
	$(RM) -fr zlib-1.2.8/
	/bin/tar xvf zlib-1.2.8.tar.gz
	/bin/mkdir -p build
	$(RM) -f build/CMakeCache.txt
	cd build; $(CMAKE) -G $(CMAKE_TARGET) '-DCMAKE_INSTALL_PREFIX=$(DEST_DIR)' ../zlib-1.2.8
	$(DEVENV) build/zlib.sln /out build/zlib_build.log /build "Release" /project "INSTALL"

ilmbase:
	$(RM) -fr ilmbase-2.2.0/
	/bin/tar xvf ilmbase-2.2.0.tar.gz
	/bin/mkdir -p build
	$(RM) -f build/CMakeCache.txt
	cd build; $(CMAKE) -G $(CMAKE_TARGET) '-DCMAKE_INSTALL_PREFIX=$(DEST_DIR)' ../ilmbase-2.2.0
	$(DEVENV) build/ilmbase.sln /out build/ilmbase_build.log /build "Release" /project "INSTALL"
	/bin/cp -f $(DEST_DIR)/lib/*.dll $(DEST_DIR)/bin/

openexr:
	$(RM) -fr openexr-2.2.0/
	/bin/tar xvf openexr-2.2.0.tar.gz
	/bin/mkdir -p build
	$(RM) -f build/CMakeCache.txt
	cd build; $(CMAKE) -G $(CMAKE_TARGET) '-DCMAKE_INSTALL_PREFIX=$(DEST_DIR)' \
		'-DZLIB_ROOT=$(DEST_DIR)' '-DILMBASE_PACKAGE_PREFIX=$(DEST_DIR)' \
		../openexr-2.2.0
	PATH="$$(cygpath -ua libs/bin):$$PATH" \
		$(DEVENV) build/openexr.sln /out build/openexr_build.log /build "Release" /project "INSTALL"
	/bin/cp -f $(DEST_DIR)/lib/*.dll $(DEST_DIR)/bin/
$ make download
$ make

これでmakeすればlibsフォルダ以下にzlib/ilmbase/openexrが出来上がる。

Windowsの資格マネージャからパスワードを拾う

以下のコードで取れた。あとはTargetNameでマッチングしてやれば目的のパスワードが拾えそう。

# Python3.4.2(x64)
import sys
from ctypes import *

class CREDENTIAL(Structure):
    _fields_ = [('Flags',              c_uint),
                ('Type',               c_uint),
                ('TargetName',         c_wchar_p),
                ('Comment',            c_wchar_p),
                ('LastWritten',        c_ulonglong),
                ('CredentialBlobSize', c_uint),
                ('CredentialBlob',     c_wchar_p),
                ('Persist',            c_uint),
                ('AttributeCount',     c_uint),
                ('Attributes',         c_void_p),
                ('TargetAlias',        c_wchar_p),
                ('UserName',           c_wchar_p)]

count = c_uint()
creds = POINTER(POINTER(CREDENTIAL))()
if not windll.advapi32.CredEnumerateW(None, 0, byref(count), byref(creds)):
    sys.exit(-1)

for Li in range(count.value):
    cred = creds[Li].contents
    print('CREDENTIAL[{}]:'.format(Li))
    print('  TargetName:', cred.TargetName)
    print('  Comment:', cred.Comment)
    print('  UserName:', cred.UserName)
    print('  Password:', cred.CredentialBlob)

windll.advapi32.CredFree(creds)