読者です 読者をやめる 読者になる 読者になる

write ahead log

ロールフォワード用

ubuntu16.04でキーボード設定がおかしくなる(日本語が入力できない)

Ubuntuに久々に戻したところ,キーボード入力がおかしくて1hほど無駄にしてしまった。

ちょっとググると以下のコマンドで対処可能という情報がよく流れてくる.

sudo dpkg-reconfigure keyboard-configuration

実際, 上記でもきちんと入力できるようになる.が,私の環境の場合(Let's Note CF-N9)ログアウトして 再度ログインするとまたキーマップがおかしくなる.

結局下記で対応した. Ibus(mozc)使ってる状況だからだったのかもしれない.

sudo vi /usr/share/ibus/component/mozc.xml

上記の15行目と18行目あたりにlayoutが定義される箇所があるので, ここをjaからjpに変更した.

今のところ問題も特にない.

余談だが,Let's NoteとThink Padは中古で安く出回っているし,性能も良いしでLinux入れれば超快適なので貧乏人には本当におすすめである. そういえば, 学生時代から1度のMBAへの浮気以外は結局ずっと安い中古PC.....。

何度か挫折しつつ不純lispインタプリタを作った

作りました.

github.com

詳細はgithubのREADMEをどうぞ.(酷い英語ですが)

当初は純lispを作ろうと思ったのでpureという名前ですが, tak関数を動かしたいなど欲が出てきたので 純粋でも何でもなくなってます.

GCはありますが, マクロはありません.
(私がマクロをちゃんと理解してないので)

作成時の参考文献は一番下に記載するので興味のある方はご覧ください.

以下は駄文です.

作り始めたきっかけ

以前から何か言語処理系を作ってみたいなと思っていました.
Brainf*ckはともかく, 作ったことがなかったので.

それとは全く別に私は今27才で, 25,27,32というのは個人的に特別な節目になる年齢じゃないかと感じていました.

SIerにいると年齢と共にプログラミングする機会が減っていくのでなんとなく腕試ししたくなる事がよくあります.

プログラマを名乗るならここら辺で小さくてバグだらけでも良いので言語処理系を作っておきたいな」という事で着手してみました.

何から始めたものか

とはいえ何から始めたらよいのかという事でとりあえずググって色々調べてみました.
が, イマイチピンときません.

ここら辺で割と心が折れます.

本やOSSのコードを写経する事を試みる

とりあえず何かを真似したいという事でOSSkindleストアにあるコードの載っている本を買って写経する事を試みました.

lispとかなら割とサンプルも多かったので調べるといくつか出てきます.

が, これもまたイマイチピンときません.

作ってる感がないというか, あんまり頭に入ってこなかったんですよね.

わかったよーな, わからんよーな.

rebuildを聞く

弱ったなーという事で気分転換にrebuild.fmを聞く事にしました. この時まで聞いたことなかったんですが, 以前Cコンパイラ作る記事を見たことがあるruiさんが出るという事でタイミング的にもいいし聞いてみようかなと.

この回だったかな?

(そういえばこの後Matzさんも出てますね.たまたまですが時期がよかった)

トークの中で東大のCPU実験の話がありましたが,その文脈でruiさんから出た
「やってみればいいじゃないですか?」的な一言がとても心に残りました.

細かい文脈などは忘れてしまったんですが,それだけが心に残っています.

やってみる

「まぁ,そりゃそうだな」という事で参考文献ばかり漁らずにやってみることにしました.
とりあえず小さく始めることがベストという事で極小のlisp定義を漁ります.

するとwikipediaで以下を見つけました.

純LISP

「あぁ,こいつならなんとかなるかも」という事でターゲットをこれに絞ります.

1st try

Lispならまぁ大体

  • Readで読んでS式にして
  • Evalで実行し
  • Printで実行結果のS式を文字列にする

という3工程だろうと考えました.

あとはデータ構造ですが,これはLispなら大変わかりやすいので(アトムとペアしかない)何となくこの2つを作ればうまくいくだろうということで着手します.

これで8末くらいから初めて9月末くらいでReadして何かしらEvalしてPrintというところまでこぎつけました.(car, cdrとかは動いた)

が,変数スコープなどを足そうとすると一気に難しくなります.

このあたりで既存コードで作り続けるのは辛いなという事で一度挫折しました.

2nd try

ならもう作り直せばいいわ.という事でゼロからもう一度作り始める事にしました.

1度作ってるだけあってリトライは割とうまくいき, 9月末から始めて10月中頃には終える事が出来ました.日数だと8日かな.

実装を終えて

勉強になったというよりはかなり面白かったというのが正直なところです.
勉強がどうとかいうと聞こえはいいですが,結局面白いのが一番だというのが個人的な結論でしょうか. あとはちょっとでもやり続ける事も割と大事でした. 子供もいるのでなかなか時間が作れないのですが, 仕事の休憩中とか5分でも,その5分で1機能作れたりしましたし.

  • やってみればいい
  • 面白ければ何とかなる
  • 1日5分でいいので続ける

あとはあのタイミングでrebuild.fmを聞かなければおそらく挫折していたと思います. ruiさんとmiyagawaさんにはここでひっそりと感謝を.

参考文献

参考サイトが多すぎるので最早覚えてないのですがブラウザのブックマークに残っているものを並べておきます.

純LISP - wikipedia

  • 間違えなく一番参照回数が多い
  • この記事を見なかったらたぶん作ってない
  • あんまり助かったので初めてwikipediaに寄付しました

rui314/minilisp

  • ruiさんによるlisp実装
  • 機能おおすぎ凄い(macroまであるっぽい)
  • コードきれいだしすごい
  • 困って頭抱えた時に参照した.
  • なので似たコードがちょいちょいあると思う(evalListとか名前一緒)

MiSPLi

  • jsで実装されているlisp
  • かなり良く出来ていてカッコイイ
  • たまにlispの一般的な挙動を確認したいときに使いました

やさしいLispの作り方

  • 作り始める前に読んでました
  • ここから得た事も結構あったんだと思う(具体的にどうとはうまく言えないけど)

Common Lisp で作る micro Scheme

  • 作り方というよりLISP自体に関する解説がわかりやすかった

ガベージコレクションの実装法と評価

  • どこかの大学の資料(どこなんだろ?確認してないですすんません)
  • GC作る時に役立った

Rubyソースコード完全解説 - 第5章 ガ-ベージコレクション

  • GC作る時にとても役立った
  • 実は以前に一度読んでいたので読みやすかった
  • ありがとう, ありがとう

竹内関数 - wikipedia

  • これを動かせるようにしないと終わらない(気がした)

Windowsのコマンドラインでクリップボードにコピーする

パソコン初心者みたいだけど、知らなかったのでメモっとく.

Windowsコマンドプロンプトではclipコマンドというものがあって、クリップボードにコマンド結果などをコピーできる.

date /T | clip

貼り付け結果:

2016/10/15 

echoでちょっとしたものを出したり.

echo "hello" | clip

貼り付け結果:

"hello" 

テキストファイルの内容もコピペが簡単

clip < sample.txt

貼り付け結果:

テキストの中身だよ

こりゃ地味に便利

xlsxファイルをコマンドラインで操作するツールを作った

golangで作った.用途はわかる人にはわかる.

github.com

これは何?

行指向のxlsxファイルの編集ツールです.
シェルと合わせて使ってます.

インストール

go getでどうぞ.

go get github.com/twinbird/xl

使い方

まずはサンプルのファイルを

$ cat test.txt
5501 5039 3720 980 339 384 78 3117 2935 2296 381 258 140 42
5542 5120 3715 1063 342 351 71 3128 2962 2292 411 259 128 38
5587 5172 3751 1078 343 346 69 3135 2970 2296 415 258 128 38

テキストをxlsxのセルに配置する

$ cat test.txt | ./xl.exe -out xxx.xlsx

こんな感じになります.

f:id:twinbird_htn:20160804235830p:plain

xlsxの各セルをテキストに起こす

$ ./xl.exe -in xxx.xlsx
5501 5039 3720 980 339 384 78 3117 2935 2296 381 258 140 42
5542 5120 3715 1063 342 351 71 3128 2962 2292 411 259 128 38
5587 5172 3751 1078 343 346 69 3135 2970 2296 415 258 128 38

区切り文字を指定する

入力でも出力でも使えます.

$ cat test.csv | ./xl.exe -out xxx.xlsx -s ,
$ ./xl.exe -in xxx.xlsx -s ,
5501,5039,3720,980,339,384,78,3117,2935,2296,381,258,140,42
5542,5120,3715,1063,342,351,71,3128,2962,2292,411,259,128,38
5587,5172,3751,1078,343,346,69,3135,2970,2296,415,258,128,38

開始位置を指定する

処理するセルの開始位置を指定できます. 入力・出力両方使えます.

$ ./xl.exe -in xxx.xlsx -b b,2
5120 3715 1063 342 351 71 3128 2962 2292 411 259 128 38
5172 3751 1078 343 346 69 3135 2970 2296 415 258 128 38

シートを指定する

処理するシートを指定できます. 入力・出力両方使えます.

$ cat test.txt | ./xl.exe -out xxx.xlsx -S Sheet2

結論

tealeg/xlsxはすごい.
ありがとうtealegさん.

windows10でgit cloneが失敗する

ずっとUbuntuだったのをWindows10に変えたのでファイアウォールではまってしまった.

msys2のgitでgithubからcloneを行うと以下のメッセージが出た.

fatal: unable to access 'https://github.com/twinbird/xl.git/': Couldn't resolve host 'github.com'

なんぞ.ネットワークおかしくなったか?と思ったんだけどファイアウォールが原因だった.

ということでファイアウォールにgitは問題ないアプリだと追加してやる.

追加手順

まず、コントロールパネルからwindowsファイアウォールを開く.

左上の「windowsファイアウォールを介したアプリまたは機能を許可」をクリック

f:id:twinbird_htn:20160804233045p:plain

右下の「別のアプリの許可」をクリック

f:id:twinbird_htn:20160804233047p:plain

ここの「参照」で

f:id:twinbird_htn:20160804233049p:plain

C:\msys64\usr\bin\git.exe

を追加してやればちゃんと動きました.

golangでRedmineの情報をExcelにするコマンドラインクライアントを作った


[追記]

id:mattnさんのgodmineがあるので, xlsxをコマンドラインから扱うツールを作りました.
たぶん組み合わせて使ったほうが使い勝手いいです.たぶんね.


golangRedmineの情報をExcelにするコマンドラインクライアントを作りました.

github.com

使い方

準備

RedmineのRESTful APIを利用するので設定が必要です.設定は以下のリンクを参考に.

REST API - Redmine

インストールはgoが入っていれば下記で大丈夫なはずです.

$ go get golang.org/x/text/encoding/japanese
$ go get github.com/twinbird/rdm

起動するとRedmineのURLとAPI Keyが求められるので入力してください.
(ホームに.rdmファイルを作って記録されます)

機能

プロジェクトの一覧を標準出力へ

$ rdm

指定プロジェクトID(上記コマンドでわかります)のチケットの一覧を標準出力へ

$ rdm -i [project id]

プロジェクトの一覧をExcelファイルへ

$ rdm -E

指定プロジェクトID(上記コマンドでわかります)のチケットの一覧をExcelファイルへ

$ rdm -i [project id] -E

Excelファイル出力は-f [filename]で出力ファイル名を指定できます.

なんで作ったのか

SIerに所属している方ならわかると思いますが(あんまりわかって欲しくもないですが),体質の古い会社だとRedmineを使っていても「Excel表がない」と文句を言われたりします.

面倒なのが「プロジェクト一覧表がない」とか「課題管理表がない」とか「バグ一覧表がない」とか....etcです.

実装担当者はRedmineを使う運用で問題なかったりするのですが,役職持ちの方から「Redmineはわからないから」とか「移動中にExcelで見たいから」などと言われると断れないのがサラリーマンの辛いところです.

あとは受託だとユーザとか元請にRedmineを強要できないので結局Excelになったりします.(しません?)

余談

現在の機能が完成した段階でチケットの投稿とかもできるようにして, コマンドライン生活に役立てようかと考えたのですが, id:mattnさんがすごいの作ってたのでやめました.

mattn.kaoriya.net

名前もやばい.

golangでビデオアルバムアプリを作った

golangで小さいツールはいろいろ書いてみたけどWebアプリも書いてみようということで作ってみた.

github.com

正直途中から飽きてきて,やっつけで作った感が否めない.

ある程度機能作って書き直していこうと思っていたけど,ある程度の機能さえ作っていない.

何ができるアプリか

ビデオを登録して, 見れます. 説明もつけれます.

それだけです.

(ログインとかヘルプとかリンクつけてみましたが,ハッタリです)

f:id:twinbird_htn:20160717035918p:plain

テスト動画にはNHKのクリエイティブライブラリを使わせてもらいました.

ライブラリとか

今回は自分に縛りを課していて, サーバサイドは標準ライブラリのみで実装している. (SQLのDriverだけはmattn/go-sqlite3を利用.twtyといいid:mattnさんには感謝.)

アプリ自体もSPAとかじゃなくてベーシックなWebアプリ.
golangだとWebAPI実装とかによく使われるんだと思うけど,とにかくベーシックなものを作ってみたかった.

golangは基礎ライブラリの上に小さいラッパーかけてくスタイルが多い気がする(というか個人的にもこのスタイルが好き)ので,
まずは標準だけで作ってみた.

bootstrapも実は初めて使ったんだけど,簡単にそれっぽく作れていい感じだなーと思った.

どうでもいいこと

そういえばデーモン化してない.

仕事ではOffice弄りと電話ばかりで最近プログラミングしないので,なんだか楽しかった.
その代償として眠くなった.