write ahead log

ロールフォワード用

gitのfirst commitをビルドする

興味わいたのでやってみたけど意外とうまくいかなかったのでメモ.

ソース自体はgithubにミラーがあって, ここから手に入る.

ubuntu trustyの64bit環境でやった.

そのまま素直にビルドしようとすると以下のエラーが出た.

vagrant@vagrant-ubuntu-trusty-64:~/repo/git$ make
gcc -g   -c -o update-cache.o update-cache.c
In file included from update-cache.c:1:0:
cache.h:13:25: fatal error: openssl/sha.h: No such file or directory
 #include <openssl/sha.h>
                         ^
compilation terminated.
make: *** [update-cache.o] Error 1

libssl-devが入ってなくて怒られているっぽいので入れる.

vagrant@vagrant-ubuntu-trusty-64:~/repo/git$ sudo apt-get install libssl-dev

それでも怒られたのでMakefileを編集.

-lcryptoが無いとopenssl関連のビルドが通らず, -lzが無いとzlib関連が通らなかった.

LIBS= -lssl -lcrypto -lz

これでmakeすると(warnningがいっぱい出るが)ビルドできた.

vim-goを使う

vim-go, 使い方がよくわかっていないのでチュートリアルをやってみた.
(gocodeのコード補完だけでも便利だけど)

チュートリアルは作者さんのを見るのが一番だろうけど, ありがたいことにhnakamurさんが日本語訳してくれている.

読んでみると, とても多機能で凄すぎなんだけど, 全部は使いこなせないのでよく使いたくなりそうなものだけメモしとく.

テスト

GoCoverageはマジで感動した.

コマンド 機能
:GoTest テストを実行
:GoTestFunc カーソル下の関数のテストだけ実行
:GoCoverage テストカバレッジに合わせてコードを色付け
:GoCoverageClear 色付けを解除
:GoCoverageToggle CoverageとClearをトグル

テキスト編集

if はinner function, af は a functionかな?

コマンド 機能
dif 関数内削除
vif 関数内選択
daf 関数全体削除
vaf 関数全体選択

定義ジャンプ

コマンド 機能
:GoDef 識別子の定義へ移動
gd :GoDefのノーマルモードでのエイリアス
Ctrl + ] 同上
:GoReferrers 識別子の参照をFixリストへ
:GoCallees 関数の呼び出される側の一覧をFixリストへ
:GoCallers 関数の呼び出し元一覧をFixリストへ
ctrl + t 移動から戻る(標準のctrl + oより賢い)

リファクタリング

コマンド 機能
:GoRename 識別子をリネームする

コード生成

コマンド 機能
:GoGenerate go generateを実行
:GoImpl カーソル上の識別子に対するインターフェース実装のテンプレートを実装

まだまだ機能があり全然使いこなせませんが, ほんと, 便利です.

テキストでER図を作る記法と処理系を作った

作りました.

実装は正規表現ゴリゴリでアレですが, とりあえず動きます.

github.com

サンプル

こんなのを書いて.

system.erdot

// estimate print system

# Tables

// master

customers (顧客)
    id (ID) INTEGER PRIMARY KEY
    name (顧客名) VARCHAR(100) NOT NULL

offices (自社事業所)
    id (ID) INTEGER PRIMARY KEY
    name (事業所名) VARCHAR(100) NOT NULL
    address1 (住所1) VARCHAR(100) NOT NULL
    address2 (住所2) VARCHAR(100) NOT NULL
    tel (電話番号) VARCHAR(30) NOT NULL

products (商品)
    id (ID) INTEGER PRIMARY KEY
    name (品名) VARCHAR(100) NOT NULL
    price (単価) DECIMAL(8) NOT NULL

employees (従業員)
    id (ID) INTEGER PRIMARY KEY
    last_name (姓) VARCHAR(30) NOT NULL
    first_name (姓) VARCHAR(30) NOT NULL
    belong_office_id (所属事業所ID) INTEGER NOT NULL

// transaction

estimates (見積)
    id (ID) INTEGER PRIMARY KEY
    title (件名) VARCHAR(100) NOT NULL UNIQUE
    customer_id (顧客ID) INTEGER NOT NULL
    pic_employees_id (担当従業員ID) INTEGER NOT NULL
    issued_date (発行日) DATE 
    due_date (納期) DATE NOT NULL
    delivery_location (納入場所) VARCHAR(50) NOT NULL
    payment_term (支払条件) VARCHAR(50) NOT NULL
    effective_date (見積有効期限) VARCHAR(50) NOT NULL
    remarks (摘要) VARCHAR(1000) NOT NULL

estimates_detail (見積明細)
    estimate_id (見積ID) INTEGER PRIMARY KEY
    display_no (表示NO) INTEGER PRIMARY KEY
    product_id (商品ID) INTEGER NOT NULL
    quantity (数量) DECIMAL(5) NOT NULL

# Relations

employees.belong_office_id *-1 offices.id
estimates.pic_employees_id *-1 employees.id
estimates.customer_id *-1 customers.id
estimates_detail.estimate_id *-1 estimates.id
estimates_detail.product_id *-1 products.id

こんな感じでコマンドを入れると.

$ erdot system.erdot | dot -Tpng -o output.png

こんなのが出ます.

f:id:twinbird_htn:20171109004509p:plain

  • 主キーは区切り線より上です
  • 外部キーは斜体で[FK]がつきます.
  • ユニーク制約付きのカラムは下線がつきます
  • NULL許可項目は赤字になります

この辺, 割と雑に決めたのでそのうち変更した方がいいのかも.
(意見とかPRほしい...)

作った経緯

ER図の作成は業務ではいつもA5SQL-M2を使っています.

これは本当に素晴らしいツールで, 大抵のDBMSに対して大抵の事が出来てしまいます.
(これでフリーなんだから頭が下がります)

しかしまぁ, 私は自宅ではメインLinuxですし(A5SQL-M2もWineで動く様ですが)プレーンテキストでER図を起こしたいという欲は常々ありました.

調べてみると色々ツールはあるみたいですが, 面白そうなので自分で作ってみました.

重視したのは以下です.

  • インストールを楽に
  • テーブルやカラムに論理名を付けたい
  • 日本語に対応
  • dotファイルを生成してくれればそれでいい

インストールは非常に重要です.
面倒なのです.

論理名や日本語対応は私の英語力がしょぼいのでほぼ必須でした.

最後のdotさえ生成すればよいというのは, ほとんどのツールが最終的にはGraphvizを利用しているように見えたからです.

であれば最初からdotファイルへのトランスレータとして作れば十分だろうと思いました.
Graphvizの呼び出しまでやるのは私の感覚としてはやりすぎです.
(レイアウトのアルゴリズムを変えられますし, GraphvizはほとんどのOSで動きます)

参考

minttyのロケールを設定する

msys2を入れてフォントや透過度を変えて満足して使っていたが, svnをコマンドで使うとロケールがおかしいと怒られた.

$ svn update
svn: warning: cannot set LC_CTYPE locale
svn: warning: environment variable LANG is ja
svn: warning: please check that your locale name is correct

あー, そういや気にした事なかったわー.

と思いつつ設定した.

LANGの設定

まず, ~/.bash_profileへ以下を追記.

LANG=ja_JP.utf8

minttyの設定

~/.minttyrcへLocaleとCharset設定を追加する.

BoldAsFont=no
Transparency=high
CursorType=block
Font=Ricty Diminished Discord
FontHeight=11
Locale=ja_JP     #ここ
Charset=UTF-8    #ここ

これでminttyを再起動すればいい感じに動いた.

両方合わせる必要があるのがポイントっぽい.

SVNで証明書を使う

今更SVNを使う事になったので.

証明書ファイルのパスは絶対パスじゃないと動作しなかった. typoなのか, msys2環境だからなのかはよーわからん.

~/.subversion/serversを以下の通り編集.

ssl-client-cert-file = [証明書ファイルのパス]
ssl-client-cert-password = [証明書ファイルのパスワード]

ubuntuでタイムゾーンの変更

ちょっと古いけど, バージョンは以下でやった.

vagrant@vagrant-ubuntu-trusty-64:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.5 LTS"

現在のタイムゾーンを確認する.

$ timedatectl

設定できるタイムゾーンを調べる.

$ timedatectl list-timezones
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Bamako
Africa/Bangui
Africa/Banjul
...

設定.何となくニューヨークへ.

$ sudo timedatectl set-timezone America/New_York

Apple Musicへのリクエスト方法

技術ネタじゃないけど.

Apple Musicを使ってるんだけど, 欲しい曲が無い時にリクエストの出し先がわからなくて困ってた.

やっと見つけたので.

iTunes Store Requests

どんどん曲数増えればいいなぁ.