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)

git filter-branch

履歴からファイルを消してリポジトリを軽量化する。

まず関係者全員にpushしてローカルのリポジトリを削除してもらう。

$ git filter-branch -f --prune-empty --index-filter 'git rm -fr --ignore-unmatch data/backup/' -- 51ee5a93ac..HEAD
$ git show-ref
(orignalなんたらってrefが出来ているはず)
$ git update-ref -d original/なんたら
$ git push -f origin master

後は全員でリポジトリをクローンしなおす。
そうしないとpullでマージされてpushしたら折角消したものが復活してしまう。

cygwinでwincred

http://d.hatena.ne.jp/shive/20141024/1414112031

最近gitをcygwin版に変更しました。そしたらwincredが使えなくなってしまった。

msysgitからlibexec/git-core/git-credential-wincred.exeをcygwin側の同じところにコピーしたら使えました。

快適 git-2.1 生活。msysgit-1.9よりcygwinの方が速いような気がする。
先日TortoiseGITも試験的にcygwin/git対応を始めたようです。
https://tortoisegit.org/docs/tortoisegit/tgit-dug-settings.html

概ね良好ですが、うっかりmsysgitでgit stするとインデクスが書き換わる?ようで全ファイル変更行なしなのに変更扱いになってしまうので、やるなら完全移行が必要かもしれません。
cygwin→msysの問題なのかgit-1.9→git-2.1の問題なのかわかりませんが…。

追記

TortoiseGIT、ブランチ一覧を取るのに失敗する…。ログウィンドウからブランチが切り替えられない。