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を開いてみると下のような感じ f:id:hironei:20160818165401p:plain

My Page の方も別ページでちゃんと作成されている

感想

思った以上にあっさりとMarkdownページが作れている 色々カスタマイズすれば気になることも出てくると思うので、その辺はまた別の機会に

お手軽暗号化

pythonGUIを書いていて、パスワードを生値で保存したくないなぁって思ったので、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()

キーカスタマイズソフト

この業界に入って10年強。キーカスタマイズソフトを入れないとまともにキータイプすらできない私。。

muleが使えなければ人に非ずみたいなPJに突っ込まれたが最後、日々mule(emacs)との戦い。
気づけばemacsキーバインドでないとまともにキータイプが出来ない体に。。。

xkeymacs → 窓使いの憂鬱 → keyhac と使ってきましたが、最近気になるのがZeniSynth。。
Luaで拡張に惹かれまくりです。

keyhacも特に困っているわけではないのですが、Luaを覚える口実のためにZeniSynthに移行するか悩み中。