write ahead log

ロールフォワード用

vimのnetrwを使う

vimには標準プラグインとしてnetrwというファイラが付属している.

あんまり触ってなかったんだけど,ふと思い立って使い方を調べてみた.

起動

コマンド 機能
:Ex カレントバッファでnetrwを開く
:Tex タブを開いてnetrwを開く

ディレクトリ移動

操作 機能
Enter 選択中のディレクトリを開く
o バッファを水平分割して開く
v バッファを垂直分割して開く
t 新しいタブで開く
- 1つ上の階層へ戻る
u 以前にいたディレクトリへ戻る
U uで戻る前にいたディレクトリへ戻る
c 開いているバッファのカレントをvimのカレントに変更

CRUD操作

操作 機能
Enter 選択中のファイルを開く
% 新規ファイルを作成
d ディレクトリを作成
D カーソル下orマークしたファイル/ディレクトリを削除
R ファイル/ディレクトリをリネーム

もうちょい複雑な操作

操作 機能
mf ファイルのマーク/アンマーク
mu 全てのアンマーク
mr ファイル名指定でのマーク(*でのワイルドカード可)
mt コピー/移動先にカーソル下のディレクトリを設定
mc マークしたファイルをコピー
mm マークしたファイルを移動
md マークしたファイルを差分を見る
mz マークしたファイルを圧縮/展開

複雑な操作の手順

複雑な操作は手順がややこしいのでメモっておく.

  1. mtで移動/コピー先を指定(カーソル下でmtを入力)
  2. mfなどで移動/コピーするファイルをマーク
  3. mc/mmなどでコピーや移動を実行

その他

操作 機能
i 表示を切り替え
s 表示をソート

シェルスクリプトで外部コマンドを組み立てて実行結果を得る

何度も調べたり考えたりしている気がする...

他にももっといい方法があるのかもしれない.

問題

シェルスクリプト内で引数をsha256化した結果を使いまわしたかった.

コマンドラインで素直に書くとこんな感じ.

echo -n 'pass'| shasum -a 256 | tr -d ' *-'

これをスクリプト内で実行して, 結果を変数に設定したい.

解決したスクリプト

こんな感じになった.

password='pass'
hashingCommand="echo -n "$password" | shasum -a 256 | tr -d ' *-'"
sha256Password=$(eval $hashingCommand)

echo $sha256Password  # デバッグ表示
  1. まずpasswordという変数に文字列を設定
  2. 次に変数展開してコマンドを構成
  3. 2を展開してevalで実行
  4. $()の外部コマンド実行で結果をsha256Passwordへ設定

感想

これでいいの?

gitで日本語ファイル名が文字化けする

なんだこれと思いつつ放置していたけど, いい加減不便なので解消した.

メモらないとどうせまた忘れる.

対処

現在のリポジトリのみの場合.

$ git config --local core.quotepath false

ずっと適用したいとき.

$ git config --global core.quotepath false

なんでこんなことになんのよ

どうもgitはデフォルトではUTF-8の文字は処理しないらしい.

この業界は英語圏で回っているのだ.

Source Tree Support

Lubuntuを入れたときにやったこと

古いマシンにLubuntuをいれたのでメモ. 快適だし, メインマシンいらないんじゃないだろうか....

1. lubuntuを入れる

Lubuntu 17.0.4をディスクへ焼いてインストール.

English設定で入れた.

2. パッケージを更新

$ apt-get update
$ apt-get upgrade

3. 日本語入力環境を構築

$ sudo apt-get install ibus-anthy
$ sudo apt-get install scim-anthy
$ sudo apt-get install fcitx-anthy

これだけだとだめかも.

menu -> preference -> language support でIME指定されているか確認.

4. Google Chromeをインストール

公式からダウンロードして入れるだけ.

5. CtrlとCapsLockを入れ替える

これないと不便でしょうがない.

$ sudo vi /etc/default/keyboard

下記を書き換え.

XKBOPTIONS=""  # <= これを
XKBOPTIONS="ctrl:swapcaps" # <= こうする

rebootする.

6. いつも使うツールを一式入れる

$ sudo apt-get -y install vim
$ sudo apt-get -y install tmux
$ sudo apt-get -y install w3m
$ sudo apt-get -y install gcc
$ sudo apt-get -y install curl
$ sudo apt-get -y install git
$ sudo apt-get -y install tree

go

$ cd ~
$ wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
$ sudo tar -C /usr/local -xzf go1.8.3.linux-amd64.tar.gz
$ rm go1.8.3.linux-amd64.tar.gz

vimrc

$ cd ~
$ wget https://gist.githubusercontent.com/twinbird/adcec8abec12ad3398d0/raw/2b5a95e601d5110b81017d869154e3283f8f48f6/.vimrc

tmux.conf

$ cd ~
$ wget https://gist.githubusercontent.com/twinbird/040b298673e5c813a29962d3e5b858c6/raw/556e17c7dd89f54e4fd2f2d237a1534d08994ec5/.tmux.conf

Vundle

$ cd ~
$ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

vimプラグイン

vimを開いて:BundleInstall.

7. パス通す

.bash_profileないなと思っていたら, .profileを編集するらしい.

知らなかった.(ubuntu独自なの?)

vi .profile

なんかそれっぽく追加.

GOPATH="/home/twinbird/gopath"
export GOPATH
PATH="$PATH:/usr/local/go/bin:/home/twinbird/gopath/bin"
export PATH

再度ログイン.

8. Dropboxを入れる

これなしではやっていけないくらい依存しているので.

ubuntu版があるのでこれをダウンロードしてダブルクリックしてやるとソフトウェアセンターがうまいことやってくれる.

あとはスタートメニュー的なところから起動してやればいい.

9. 自作ツール入れる

ブログ記述用. go入れた後じゃないと面倒だし.

$ go get github.com/twinbird/hbp

~/.hbpを編集.

感想

anthyで凄い手間取った.

他はそんなにはまりどころも無いし, とてもよいと思う.

なによりターミナルが軽い....

メインマシン使う機会なくなりそう....

[追記]ターミナルを透過させる

Lubuntuでターミナルを透過させる


[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Linuxをマスターしたい人のための実践Ubuntu [ 水野源 ]
価格:3,960円(税込、送料無料) (2023/7/31時点)


w3mを使ってみる

テキストブラウザって意外と便利ですね.

使ったことなかったけど.

vim, emacsのバインドである程度動くのでそれほど抵抗なく使えると思います.

インストール

こんなものを使う人はとっくに調べて入れているでしょうが...

msys2環境では以下で入れました.

$ pacman -S w3m

起動

$ w3m [URL]

キー操作

よく使うのだけメモしておく.

カーソル移動

キー 動作
j 下へ
k 上へ
h 左へ
l 右へ
space 1ページ送る
b 1ページ戻す

ページ移動

キー 動作
B 戻る
(リンク上で) Enter リンク先へ移動
U URL指定エリア表示(その後Enterで移動)
R リロード

タブ

キー 動作
T 新しいタブを作成
C-q 現在のタブを閉じる
{ 左のタブへ移動
} 右のタブへ移動

ブックマーク

キー 動作
ESC + a 現在のページをブックマーク
ESC + b ブックマークリストを表示

終了

キー 動作
q 終了
Q 終了 (確認無し)

その他

キー 動作
C-c 現在の操作をキャンセル
u 現在のページのURLを表示

vim-table-modeを使う

markdown-vimを使ってみたけど, 高機能すぎたのでもうちょっとシンプルなものが欲しいなぁと.

つまるところGFMのテーブルを書くのさえ楽になればmarkdown書くこと自体はそんなに苦痛じゃない.
(っていうか, そういうシンプルな記法のはずだし)

良いのないかなぁと思っていたらvim-table-modeというのがちょこちょこお勧めされていた.

これがかなりいい.

インストール

Vundle使いました.

vimrcを変更.

" Plugin設定
" vundle.vimを使う
set rtp+=~/.vim/bundle/Vundle.vim/
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'

Plugin 'dhruvasagar/vim-table-mode'  " <= ここ
let g:table_mode_corner="|"          " <= ここ

call vundle#end()

全部見たい方は僕のvimrcはここにあります.

vimを開いて以下を実行.

:BundleInstall

使い方

例えば以下の様な文書を書いているときに

| col1 | col2 | col3 |
|--|--|--|
|retsu| col2 | col3 |

ノーマルモードで

\tm

とすると.(table modeの略ですよね.たぶん)

| col1  | col2 | col3 |
|-------|------|------|
| retsu | col2 | col3 |

こんな感じできれいになります.

もう一度\tmとすれば通常の編集に戻りますし, かなりいいです.

これは末永く使わせてもらいそうです.

golangでzipを作る

archive/zipパッケージなるものがあります.

The Go Programming Language - Package zip

使い方

zipアーカイブは複数のファイルが入るので, 1つのio.Writerから複数ファイルのwriterを作成する構成をとっているようです.

  • zipWriter(io.Writerから作成)
    • writer(zipWriterから作成)
    • writer(zipWriterから作成)
    • writer(zipWriterから作成)

なので手順としては

  1. zip.NewWriterへio.Writerを渡してzipWriterを作る
  2. zipWriterから各ファイルのwriterを作る
  3. 作ったwriterへファイルの内容を書き込む

となります.

サンプルコード

先に動作を.

こんなフォルダを.

test/
├── bar.txt
├── foo.txt
└── test.txt

こんな感じで圧縮できます.

$ ./sample.exe test.zip test/*

コードは以下の通り.

package main

import (
    "archive/zip"
    "fmt"
    "io"
    "os"
)

func main() {
    if len(os.Args) < 3 {
        fmt.Println("Usage: %s [zipname] [src] [src2] ...")
        return
    }

    dest, err := os.Create(os.Args[1])
    if err != nil {
        panic(err)
    }

    zipWriter := zip.NewWriter(dest)
    defer zipWriter.Close()

    for _, s := range os.Args[2:] {
        if err := addToZip(s, zipWriter); err != nil {
            panic(err)
        }
    }
}

func addToZip(filename string, zipWriter *zip.Writer) error {
    src, err := os.Open(filename)
    if err != nil {
        return err
    }
    defer src.Close()

    writer, err := zipWriter.Create(filename)
    if err != nil {
        return err
    }

    _, err = io.Copy(writer, src)
    if err != nil {
        return err
    }

    return nil
}

感想

たった50行程度でいつも使っているzipができるというのはなかなか感慨深いものがありました.

今度はzipの構成とか調べてみようかな.

余談

io.Writer使ってるんで当たり前ですが, http経由で渡すとか, そんなのも割と簡単に書けます.

package main

import (
    "archive/zip"
    "io"
    "net/http"
    "os"
)

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

func handler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/zip")
    w.Header().Set("Content-Disposition", "attachment; filename=test.zip")

    zipWriter := zip.NewWriter(w)
    defer zipWriter.Close()

    for _, s := range os.Args[1:] {
        if err := addToZip(s, zipWriter); err != nil {
            panic(err)
        }
    }
}

func addToZip(filename string, zipWriter *zip.Writer) error {
    src, err := os.Open(filename)
    if err != nil {
        return err
    }
    defer src.Close()

    writer, err := zipWriter.Create(filename)
    if err != nil {
        return err
    }

    _, err = io.Copy(writer, src)
    if err != nil {
        return err
    }

    return nil
}
$ ./sample.exe test/*