Cmder + nyagos + nvim で外部からファイルを開く設定
cmder /single -- -run nvim [ファイル名]
Gaidenインストール
今更ながらGaidenをインストールしてみましたので、その備考録。
参考にしたのは以下のサイト yamkazu.hatenablog.com
ただ、情報が古いのと環境が違うため焼き直し
環境: Windows7 64bit msys2
SDKのインストール
参考サイトではgvmとなってましたが、今はsdkだそうです
curl -s get.sdkman.io | bash
インストールが出来たら環境変数に反映
source "$HOME/.sdkman/bin/sdkman-init.sh"
SDKのインストールは以下を参考にしました
[Grails] sdk を使って簡単に、grails や groovy を入れる | ぷすぅ~ぷすぅ~
Gaidenのインストール
先ほどインストールしたSDKを使ってGaidenをインストール
sdk install gaiden
プロジェクト作成
お約束のようなサンプルプロジェクトの作成
$ gaiden create-project mydoc Created Gaiden project at xxxxx\gaiden\mydoc
中身の確認
$ tree . └── mydoc ├── config.groovy ├── gaidenw ├── gaidenw.bat ├── pages.groovy ├── README.md └── wrapper ├── gaiden-wrapper.jar └── gaiden-wrapper.properties 2 directories, 7 files
参考サイトと大分構成が違う(汗
ちなみに、sdk list groovy / sdk list gaiden で確認したカレントバージョンは以下でした groovy: 2.4.7 gaiden: 1.1
ページの作成
空のページを作って
$ cd mydoc $ touch my-page.md
エディタで以下のように編集
# My Page - サンプルページ
中身の確認
$ cat README.md # Hello Gaiden! $ cat my-page.md # My Page - サンプルページ
pages.groovy をエディタで開いて my-page.md を追記
$ cat pages.groovy "README.md" "my-page.md"
ビルドしてみる
$ gaiden build Built document at xxxxxxx/mydoc/build/index.html
上記のindex.htmlを開いてみると下のような感じ
My Page の方も別ページでちゃんと作成されている
感想
思った以上にあっさりとMarkdownページが作れている 色々カスタマイズすれば気になることも出てくると思うので、その辺はまた別の機会に
お手軽暗号化
pythonでGUIを書いていて、パスワードを生値で保存したくないなぁって思ったので、AESとかで仰々しいものを作った。 作ってからもっとお手軽でいいかなと思い直して調べた結果を残しておく
_data = "TestData123456"
import codecs
enc = codecs.encode(_data, "rot_13")
print(enc)
print(codecs.decode(enc, "rot_13"))
要件を満たさないんで結局書きなおした。。。
import base64 import hashlib from Crypto import Random from Crypto.Cipher import AES class CryptAES: def __init__(self, key): self.block_size = AES.block_size self.secret_key = self._create_key(key) def _padding(self, text): if not text: return text else: odd = self.block_size - len(text) % self.block_size odd_char = odd * chr(odd) return text + odd_char def _unpadding(self, text): if not text: return text else: return text[:-ord(text[len(text) - 1:])] def _normalize_key(self, local_key): if len(local_key) >= self.block_size: new_key = local_key[:self.block_size] else: new_key = self._padding(local_key) return new_key def _create_key(self, local_key): local_key = self._normalize_key(local_key) secret_key = hashlib.sha256(local_key.encode()).digest() return secret_key def _create_iv(self): iv = Random.new().read(self.block_size) return iv class EncryptAES(CryptAES): def cipher(self, data): iv = self._create_iv() raw_data = self._padding(data) aes = AES.new(self.secret_key, AES.MODE_CBC, iv) encrypt_data = aes.encrypt(raw_data) return base64.b64encode(iv + b"<?>" + encrypt_data).decode("unicode_escape") class DecryptAES(CryptAES): def cipher(self, data): data = base64.b64decode(data.encode("unicode_escape")) iv, encrypt_data = data.split(b"<?>") aes = AES.new(self.secret_key, AES.MODE_CBC, iv) raw_data = aes.decrypt(encrypt_data) return self._unpadding(raw_data).decode("unicode_escape") if __name__ == '__main__': _key = "AES sample key" _data = "TestData123456" enc = EncryptAES(_key) enc_data = enc.cipher(_data) print(enc_data) dec = DecryptAES(_key) dec_data = dec.cipher(enc_data) print(dec_data)
clangでAST変換
AST変換して解析をしているのだが上手くいかない。 関数の引数で渡している DATA_MAX の値が Cursor等のオブジェクトのどの情報を見ても入ってない。 コマンドラインでは入っているので解析されてないわけでは無さそう。。。
# -*- coding:sjis -*- import unittest from pprint import pprint from clang.cindex import * def get_diag_info(diag): return {'severity': diag.severity, 'location': diag.location, 'spelling': diag.spelling, 'ranges': diag.ranges, 'fixits': diag.fixits } def get_cursor_id(cursor, cursor_list=[]): if cursor is None: return None # FIXME: This is really slow. It would be nice if the index API exposed # something that let us hash cursors. for i, c in enumerate(cursor_list): if cursor == c: return i cursor_list.append(cursor) return len(cursor_list) - 1 def get_token(node): LITERAL_KIND = \ ( CursorKind.INTEGER_LITERAL, CursorKind.IMAGINARY_LITERAL, CursorKind.FLOATING_LITERAL, CursorKind.STRING_LITERAL, CursorKind.CHARACTER_LITERAL, ) if node.kind in LITERAL_KIND: tokens = list(node.get_tokens()) result = [x.spelling for x in tokens] else: result = [] return ','.join(result) def get_info(node, depth=0): children = [get_info(c, depth + 1) for c in node.get_children()] return {'id': get_cursor_id(node), 'kind': node.kind, 'usr': node.get_usr(), 'spelling': node.spelling, 'location': node.location, 'extent.start': node.extent.start, 'extent.end': node.extent.end, 'is_definition': node.is_definition(), 'definition id': get_cursor_id(node.get_definition()), 'children': children, 'token': get_token(node), } class Test(unittest.TestCase): def testTest1(self): data = \ """ #define DATA_MAX 0x1234 int calc(unsigned size) { return size % 100; } int main(void) { int p; p = calc( DATA_MAX*sizeof(int) ); return 0; } """ index = Index.create() tu = index.parse("test.c", unsaved_files=[("test.c", data)]) self.assertIsNotNone(tu) pprint(('diags', map(get_diag_info, tu.diagnostics))) pprint(('nodes', get_info(tu.cursor))) if __name__ == "__main__": # import sys;sys.argv = ['', 'Test.testTest1'] unittest.main()
XYZZYでカレントバッファのみのgrep
C-u M-x grep
RCPアプリケーションでPlug-in Spyを使いたい
Dependenciesにorg.eclipse.pde.runtimeを追加するだけ。
他人が書いたアプリケーションを追うには必須です。