MInor CoNtrol

プログラミング・ソフトウェアエンジニアリング・テック・ギークネタ

golangでCLIツール作成 事始め

TL;DR

aa

ベース作り

標準のflagパッケージを使っても良いが、今回はサードパーティurfave/cliを使った。
公式のREADME.mdを読んだだけで簡単に作れるのは素晴らしい。

一部抜粋・省略だが、こんな感じ。オプションは取らず、サブコマンドを利用する構成にしてみた。

補完

gifにもあるが、zsh環境下でサブコマンドの補完が効くようにした。gifの表示は.zshrcの設定で見やすくフォーマットしてある。

ディレクトリ構成

サブディレクトリとしては、サブコマンドパッケージのcmdCLIツール実行・設定などのためのcli、補完ファイル用のcompletionとした。

.
├── LICENSE
├── README.md
├── cli
│   └── run.go
├── cmd
│   ├── detective.go
│   ├── pig.go
│   ├── root.go
│   └── wktk.go
├── completion
│   └── zsh
│       └── _aa
└── main.go

最後に

golangでもCLIツール作成は

みんなのGo言語【現場で使える実践テクニック】

みんなのGo言語【現場で使える実践テクニック】

にも書いてあったとおり、非常にお手軽だった。
また、README.mdにも書いてあるが、mattn/memob4b4r07/gistは非常に参考になった。
今回は全く非実用的なものを作ったが、これから実用的なツールを作るのには勉強になった。

参考

Dropbox Paperが想像以上に良かった話

f:id:micnncim:20170421110743j:plain

TL;DR

  • Dropbox Paperの概要は色々記事があるのでそちらを見てください
  • markdownで編集→タブレットで閲覧がシームレスに出来る
  • Dropbox Paperを使えばmarkdown→PDFの変換が特別なセットアップ無しに出来る


採用理由 (Evernote等との差別化)

Dropbox Paper、リリースしてから17ヶ月経っていますが今更ながら使用し始めました。

敬遠していた理由は、メモアプリとしてはEvernoteを愛用していて、なるべくクラウドストレージアプリは分散したくないと考えていたからです。

もちろんGoogle DriveDropboxのアカウントは持っていましたが、Evernoteは画像やPDFなどのドキュメントも保存・閲覧できるためメインとしては使用していませんでした。

しかし、Evernoteの(僕にとって)唯一の欠点はクライアントアプリが貧弱なことと、markdownに(ほぼ)未対応であることです。普段からmarkdownを使う者にとって、markdownを使わず、GUIでフォントサイズを変更したりテーブルを作ったりリストを作ったり(Evernotemarkdownのリストにはやや特殊な形で対応しています)するのはかなりストレスです。

このような記事もあって、様々な方法でEvernoteからの乗り換えを検討してきましたがどれもしっくり来ませんでした。

そして先日、Dropbox Paperを利用して、「これだ!」と思いました。その理由は以下のポイントに依ります。

  • markdownが利用可能なクラウドドキュメント編集アプリ
  • ネイティブアプリをリリースしている (タブレットで閲覧可能)
  • docx(PDF)に容易に変換可能

結果的にはEvernoteからの移行ではなく併用という形になりましたが、概ね満足しています。


markdownが利用可能なクラウドドキュメント編集アプリとして

markdownは便利ですが、何を書くときも使うかというと、そうではありません。「ドキュメント」レベルになると体系的に書きたいとかテーブルを使いたいとかで使いますが、「メモ」レベルではほぼ使いません(リストが欲しいときはありますがハイフンやEvernoteGUIリストで我慢できます)。

ここでのドキュメントは、他人に見せるための資料とか議事録とか仕事でのノートとか講義ノートとかで、README.mdとかは除きます。

したがって、従来Evernoteでメモ+ドキュメントを編集・管理していたのが、Evernoteでメモ・Dropbox Paperでドキュメントという風に住み分けられます。ドキュメントを書くことはメモに比べて遥かに少ないので併用はそれほど苦になりません。

f:id:micnncim:20170420200850j:plain

markdownエディタ(Kobito)でのテキスト


f:id:micnncim:20170420200901j:plain

Dropbox Paperでのテキスト


ネイティブアプリをリリースしている (タブレットで閲覧可能)

これまでは「markdownで編集したは良いが、Macのローカルディレクトリにあるから結局殆ど閲覧しない…」ということがありました。閲覧に関してはタブレットとかで見たいです。一時期は閲覧したいドキュメントをGistに上げて、ブラウザで見たりしていましたが、スマートではありません。

Dropbox PaperはiOSアプリAndroidアプリで利用できます。これによりmarkdownドキュメントをタブレットで快適に閲覧できます。

もちろんブラウザでも閲覧できますが、スマホタブレットだとネイティブアプリを使用する方が個人的には快適です。Editモードにしなければ、テキストをタップしても文字入力モードにならないのも、Evernoteでの煩わしさを解消してくれます。


docx(PDF)に容易に変換可能

僕はMicrosoft Wordが嫌いあまり好きではありません。したがって、docxやPDFでドキュメントを作成する機会があったときはmarkdownで書いてからPandocでそれらに変換していました(LaTexはもっと面倒くさい)。

しかしPandocにも欠点があり、

  • セットアップにHaskell Platformが必要
  • PDFに変換したあとは微調整が効かない
  • したがってdocxに変換してから微調整をしてWordなどで変換する必要がある
  • この手順を経てもパイプテーブルなどは上手く変換されない

などで使用にギリギリ耐えられません(使っていましたが)。

Dropbox Paperは作成したドキュメントをmarkdownまたはdocx形式でエクスポートできます。

更に生成したdocxとそれから変換されるPDFはmarkdownマークアップを綺麗に反映し、docx、PDFバッククォートによる引用が適応されていませんが、パイプテーブルも美しく表示されます(どの記法・どの方言に対応しているかは確認できていません)。

個人的にはブログやQiita以外で引用を使うことは殆ど無いので問題ありません。

f:id:micnncim:20170420200905j:plain

docxでのテキスト


f:id:micnncim:20170420200910j:plain

PDFでのテキスト


最後に

僕の主な使い方は、PCでmarkdownを書く→タブレットで閲覧です。かなり快適です。詳しくは書きませんが、各行にコメントを付けられる機能やプレゼンモード、バージョン管理機能も素晴らしいです。

f:id:micnncim:20170420200913j:plain

まだ試していませんが、共同編集機能もあるみたいなので個人だけでなくグループでの使用も期待できそうです。
それでは。

『初めてのRuby』を読んだ

Ruby未経験ながらRuby on Rails Tutorialを進めていたのですが、流石にRubyの知識が無いと辛いときが多くなってきてRubyの勉強をしました。
先ずCodecademyRubyチュートリアルの1〜11を全て終えたあと、Yugui氏著のオライリー本『初めてのRuby』を読みました。

初めてのRuby

初めてのRuby

本書はオライリー本ですが、翻訳本ではなく、RubyコミッターのYugui氏が書き下ろしたものです。時折オライリー的翻訳っぽい表現が見かけられましたが、それも含めて非常に平易でわかりやすく、2日ほどで読み終えました。

今までオブジェクト指向言語としてはJavaPythonを扱ってきましたが、Rubyの"Pure OOP"は少し取り扱いが異なりました。その辺りはCodecademyのチュートリアルでは完全には理解していなかったのですが、『初めてのRuby』読後はよく理解できたと思います。特に特異クラスや特異メソッドの解説がわかりやすいです。単に文法を紹介するだけでなく、「これはあまり使われない」とか「筆者はこの2つではこちらを好む」など、現役のエンジニアの視点が見られたのも良かったです。

注意したいのは、前書きやAmazonレビューなどでも触れられていますが、対象読者は「初めてプログラミングをRubyで勉強したい人」ではなく、「既にある程度他の言語を学習していて、初めてRubyを勉強する人」であることです。事前にWebのチュートリアルで軽く文法を押さえておくと更にわかりやすいと思います。Codecademyは全て英語ですが、ブラウザで実行環境が揃うのもあり良かったです。

というわけで、『初めてのRuby』おすすめです。それでは。

RDD(README駆動開発)をストレスフリーに加速させるauto-readmeを作りました

TL;DR

auto-readmeというものを作りました。
README.mdのテンプレート作成・編集をシームレスに行えるシェルスクリプトです。

RDDって?

RDD(Readme Driven Development)、通称README駆動開発とは、「先にREADME書いてからコーディングする」という、先に仕様書書くのは当たり前先進的な開発方針です。

RDDに欲しいもの

README駆動というからにはREADMEのフォーマットや書く内容をテンプレート化したいものです。おそらく殆どのRDD実践者の方は、自身にあったテンプレートをお持ちだと思います。僕もあります。 しかし、そのテンプレートを適当なディレクトリに置き、新しくREADMEを作成する際にコピペするのは面倒です。

そこでauto-readmeというシェルスクリプトを作成しました。詳しくはここREADME.mdを見てもらえれば良いのですが、簡単に言うと、readmeのコマンドだけで、

  • カレントディレクトリにREADMEが無ければテンプレートから作成する
  • あればそのまま(Vimで)編集する

中身自体は実質7行の小学生でも書けるスクリプトなのですが、コピペの手間を省けるのと、READMEの確認にlsしなくても良いので個人的には助かっています。

でも探せば上位互換のもっと便利なものがある気がする。ちなみに自分は下記の@b4b4r07さんのテンプレートを参考にしたものを使っています。感謝。
それでは。

参考

初投稿です

Who am I?

はじめまして、@micnncim(twitter)、micnncim(GitHub)です。
コンピュータサイエンスを学ぶ大学生です。
「エンジニアはブログを書くなどして情報発信していかなければならない」とか言っているおじさんが居たので(定説なのは知っています)、 拙劣ながらこれからプログラミングを中心に、以下について書こうと思います。

よく使う言語

C、Javaも書けますがあまり好きではありません。シェルスクリプトもたまに書きます。
今興味があるのはC++(競技プログラミング)、Haskellです。

よく使うツール

ちなみにはてなブログを選んだ理由は、技術ブログが多い(らしい)のと、markdownが使えるからです。まともな選定はしていません。
情報収集としては、RSSで技術ブログ読んだり、twitterでエンジニアをフォローしたり、Rebuild.fmを見るのが中心なので、ブログをきっかけにまた色々な情報が得られると嬉しいです。
それでは。