ソフトウェアとハードウェアの境界

ホビー開発に関する誰得情報満載☆

vimでプロジェクト管理風味 NERDTreeを使って

なんかシンプルにプロジェクト管理したい

僕はその昔、仕事で出会った「PeggyPro」という非常に非常に使いやすいテキストエディタを、vimに隠れながら愛用していた。僕はsubversionは使ったことがないので、その機能は使わなかったが、そんなことは抜きにしてPeggyProは偉大であった。
非常に見やすく操作しやすいプロジェクト管理、検索置換もお手の物、TAGSを作れば定義へジャンプしてくれるし、痒いところに手が届くASCIIコード表も搭載、プロジェクト内の.batもコンテキストメニューから実行できて、makeの出力はoutputペインに表示され、もちろんコンパイルエラー部へのジャンプも可能。
IDEとしてではなく、テキストエディタとして、シンプルで非常に使いやすかった。
残念ながらPeggyProは、株式会社エスコアハーツのソフトウェア事業の縮小に伴い、2014-05-30を持って、提供を停止してしまった。

しかし、悲しんでばかりはいられない。
僕達は、前に進むべきなんだ。
(そう、ここはそういうジョークだ。)

ということで、gvimでもそんなことができないかと思い、いろいろと試行錯誤してみた。

NERDTreeというPlugin

vimでプロジェクト管理ができる有名なPluginとして、「project.vim」が挙げられる。
しかし、あえてこれは使用しない。
実際使用してみたのだが、なんかしっくりこない…。 もっとシンプルに軽ぅーい気持ちでプロジェクト管理っぽいことをする方法がないかと調べてみた。

そこでNERDTreeに出会った。

「NERDTree」vimファイルシステムを検索して、ファイルやディレクトリを開くことができるPluginだ。
vimは標準でnetrwというファイルエクスプローラが含まれているようだが、それよりも高機能なものだと思われる。
neobundleでPluginを追加する方法もあるようだが、僕は上記のページからzipをダウンロードして解凍してruntimepathを通している。

プロジェクトファイルっぽいファイルから指定ディレクトリを開く

こんなスクリプトを.vimrcに書いてみよう。

let s:NerdtProject = "close"
let g:NerdtPrjPath = "."

" Nerdtreeを使用したプロジェクトのパスを変更
function! ProjectPathSet(path)
    let g:NerdtPrjPath = a:path
    exec ":set tags=./tags,tags," . g:NerdtPrjPath . "/tags"
endfunction

" プロジェクトパスを指すNERDTreeペインのトグル
function! ToggleNerdtPrj()
if has('win32')
    if "open" ==? s:NerdtProject
        let s:NerdtProject = "close"
        exe ":wincmd h"
        exe ":bd"
    else
        let s:NerdtProject = "open"
        exe ":cd " . strpart(g:NerdtPrjPath, 0, 3)
        exe ":NERDTree " . expand(g:NerdtPrjPath)
    endif
else
    if "open" ==? s:NerdtProject
        let s:NerdtProject = "close"
        exe ":bd"
    else
        let s:NerdtProject = "open"
        exe ":NERDTree " . expand(g:NerdtPrjPath)
    endif
endif
endfunction

" make
function! MakeFunc(dir)
    if(a:dir != "")
        exec ":cd " . a:dir
    endif

    pwd
    let target=input("input target: ")
    if(target != "")
        execute ":make " . target
    else
        make
    endif
endfunction


" プロジェクトパス表示
function! ShowPrjPathFunc()
    echo g:NerdtPrjPath
endfunction

" プロジェクトファイルをオープン
function! PrjOpen()
    let g:NerdtPrjPath=getline(1)
    call ToggleNerdtPrj()
endfunction

" NERDTreeのトグル
nmap  <silent>  <C-r> :call ToggleNerdtPrj()<CR>
imap  <silent>  <C-r> :call ToggleNerdtPrj()<CR>

" .vimpjファイルを開いた時のautocommand
au BufRead *.vimpj       call PrjOpen()

" 上記の関数をコマンドから呼ぶ
command! -nargs=+ PrjPathSet call ProjectPathSet(<f-args>)
command! PrjMake  call MakeFunc(g:NerdtPrjPath)
command! PrjPathShow  call ShowPrjPathFunc()

こんなテキストファイルを用意して、vimで開いてみる。

prj.vimpj
/home/USERNAME/Document/Project/

これで、NERDTreeに上記のディレクトリが開かれた状態でvimがスタートする。 あくまでも「プロジェクト風味」である。
「風」でもない。
「っぽい感じみたいな」くらいに考えてもらえるとありがたい。
NERDTreeというPluginはどういうものか理解できている読者は声を揃えて、「指定したディレクトリ開いてるだけじゃん」と言うことはわかっているのだが、ファイルマネージャから直接一発で開きたいディレクトリをNERDTreeが開いてくれるということをしたかっただけです、すみません。
とりあえず、プロジェクトフォルダみたいなものを設定し、それを起点にしてNERDTreeを開くことがとりあえずできた。 もちろん、今後、このプロジェクト管理っぽい機能を対象に検索や置換、右クリックメニュー(コンテキストメニュー)なども追加していく所存である。

NERTreeペインのディレクトリ/ファイルパスの取得方法

以下のようにすると、NERDTreeペインに表示されているディレクトリやファイルのパスを取得できる。

function! PathGetNerdtree()
    let treenode = g:NERDTreeFileNode.GetSelected()
    let nerdtfilepath = treenode.path.str({'escape': 1})
    echo nerdtfilepath
endfunction

" コンテキストメニュー(右クリックメニュー)から実行
nnoremenu 1.10 PopUp.実行(exe,bat)  :call PathGetNerdtree()<CR>

これを利用することで、スクリプトを実行したり、選択ファイル内で検索したり、いろいろできるはず。

ちなみにLinuxでデフォルト状態のgvimの問題点

LinuxBean14.04でgvimをインストールすると、標準状態では以下の困った点があった。

  • 右クリックでメニューが表示されない。
  • Fcitx-Mozcで、インサート入力されない(文字入力中、未確定文字が、エディタ上に挿入されない)。

マウスの問題は以下を.vimrcで設定。

" 右クリックメニュー(コンテキストメニュー)を有効にする
set mousemodel=popup_setpos

Fcitx-Mozcは、このページのmattnさん達の会話を読ませて頂いて、gvimの起動を「vim -gf」にて行うようにした。
LinuxBean利用者なら、[スタートメニュー]→[アクセサリ]→[メニューエディタ]なんかでgvimの起動コマンドを変更するといい。

01-01 KOZOS開発環境の構築 (自己流編)

KOZOSは素晴らしい

「12ステップで作る 組込みOS自作入門」は本当に素晴らしい書籍だった。 AND回路、OR回路、XOR回路の話から、演算器の話、アセンブリももちろんのこと、ハードウェアリソースの扱いとか物理アドレスとかメモリマップドIOとかリンカとか、エンベデッドに必要っぽい話題をたくさん紹介してくれていた。 あくまでもOSを作成する上で必要な内容がほとんどだったが、様々な技術に触れる手引きの書としても読むことができると思う。

さて、実際僕もこのOSをコーディングしたのだが、書籍に記載されている内容をただ書き写す、はたまたウェブサイトからソースコードをダウンロードする、なんてことをしてしまうと、ただ動作させるだけで満足してしまいそうな気がする。 そこで僕は、初心に還り、ソースコードに関数ヘッダやファイルヘッダ、各種冗長すぎるコメントを加え、更に命名規則を与えプレフィックスを加え、更に更にディレクトリ構成も直してローダとOSで同じソースを共有するようにcommonディレクトリに置いたり、などなど、自分流にアレンジしてみた。 自分の思うままに、楽しく、気持ち良く、をモットーにいじりまくった。

動作確認を終え、ある程度ソースコードが(自分的に)綺麗に整理されると、今度は既存の組込みOS、TOPPERS/JSP(uITRON)とかHOSとかも動作させたくなってきた。 いろいろ調べてみると、MONIXというローダに行き着き、こちらを使用させていただこうと思い至る。

この辺を踏まえて、自己流で開発環境を整えたいと思う。

h8300-elf-gcc

どんな理由だったか忘れたけど、「12ステップで作る 組込みOS自作入門」で紹介されているgcc-3.4.6だと、JSPかHOSかMONIXのどれかのコンパイル中に致命的なエラーが生じた。調べてみるとコンパイラのバグだみたいなことがどっか異国のサイトで書いてあったので、このバージョンのgccを使うことを諦めた(こういうバグとかエラーこそちゃんとメモっとくべきだった…)。
gcc-4系のソースコードをダウンロードしてコンパイルすれば良かったのだが、それも単純ではないらしい。
普通に書籍とおんなじ方法でやろうとしてコンパイルエラーが出まくって全然うまく行かなかったので、泣く泣く諦めた。
そこで「KPIT」gccコンパイラを使用することにした。
本ソフトウェアを入手するには、無料ではあるがアカウントの作成が必要となる。
アカウント登録をし、「Free Downloads」の「All Downloads」に「GNUH8 v12.02 Linux Tool Chain (ELF Format)」的なパッケージがあるはずなのでダウンロード。
このパッケージは.rpmパッケージである。
僕の開発環境はLinuxBean14.04、つまりはUbuntu系なので、.rpmパッケージはインストールできない(rpmRedHat系)。
そこで以下を実行。

% sudo apt-get install alien
% alien gnuh8300_v12.02_elf-1-1.i386.rpm

すると、.debパッケージが作成される。
これをインストール。
ちなみに、binutilsGNUプロジェクトアーカイブスgnu/binutils/から新しそうなソースコードをダウンロードしてきて、書籍と同様にコンパイルして使用する。
h8300-elf-gccのバージョンはこんな感じだ。

% h8300-elf-gcc --version  
h8300-elf-gcc (GCC) 4.7-GNUH8_v12.02  
Copyright (C) 2012 Free Software Foundation, Inc.  
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

このコンパイラだと、c++コンパイラもついてくるので、c++でオブジェクト作りたい方なんかもいいかもしんない。

現在、自分のソースコードがそれほど綺麗な状態ではないので、「01-02」くらいにライセンスの話も踏まえて公開できればいいなと思う。

00-01 もう一度、課題検討

今後の活動方針を再確認

Facebookページにて一度書いている内容なんだが、ページ移設に伴ってもう一度確認しよう、ということで、書き直してみる。

1. 坂井弘亮氏作 KOZOSの拡張

「12ステップで作る 組込みOS自作入門」を見ながら、組込みOSを自作してみた。これはOSのカーネルに当たる部分を作っている。 本OSは、aki-h8/3069f ネット対応マイコンLANボード(完成品)上で動作させることを想定して作成しているが、僕はaki-h8/3069f USBホストボードキット(完成品)上で動作するようにした。 当初はネット対応マイコンLANボードを使用していたのだが、DRAMの挙動がおかしく使えなかった。 資料を見てみると、LANボードのDRAMはおまけ程度につけていて、動作しない可能性もある、と記載されていた。 しかし、USBホストボードでは動作することが保証されているような文言もあり、USBも面白そうだなと思ったこともあって、こちらを購入することに決めた。
また、今の自分の環境では、KOZOSのブートローダMONIXを使用させて頂いている。 このブートローダを使用している理由は、TOPPERS/JSPカーネル(uITRON)HOSを起動することができたからである。 以下に、拡張する機能を記載する。

  • USBマスストレージからOS起動
  • FAT32ファイルシステム機能を追加
  • タイマを使用した各種センサーの値の取得、LED等の点灯

2. xv6のH8移植

xv6UNIX v6のx86への再実装版らしい。初めてのOSコードリーディングを読んでいたのだが、どうしても当時のC言語とかが読みにくかったので、何か他にUNIX v6を勉強する方法はないかと調べていた。それで見つけたのがxv6の存在。x86への再実装でなおかつANSI Cで書かれているので、読みやすくなっていることだろうと思った。更に調べてみると、こんなページもあった。
"xv6ソースコードリーディング"
いやぁ、なんと素晴らしきGoogle先生。潜れば潜るほどいろんな宝物が出てくる。 上記を見ながら、自分流にコメントや命名規則をつけてソースコードを改変模写、並びに、H8への移植していき、動作させたい。

3. Raspberry Pi(以下RPi)とH8ボードとの接続

「2.」でUNIX OSの内容を知りたかったのは、そもそも、Linuxの基本的なシステムコール(fork,exec,ioctl,特にpipe)などの考え方を理解したかったからである。またリアルタイムOSばかりではなく、汎用OSも少しは勉強しようかなぁと思ったからだ。xv6でUnixの基本的な考え方を理解した上で、現代のLinuxまたはUnixライクOS上で動作するプログラムを作成する。これもやりたいことの一つである。
Raspberry PiはARMアーキテクチャのCPUを搭載した超小型PCである。SDカードにRaspbianというRaspberry Pi用にチューニングしたDebianを書き込んで、SDカードから起動するようになっている(もちろん、他のOSも起動することができる、T-Kernelとか)。RPiの種々のインターフェースを用いてaki-h8/3069fと接続してデータを取得すれば、面白いシステムになると思う。RPiにUSBの小型無線LANをつけて、LANに接続しているので、外出先でも(自宅の)気温や(自宅の)照度、位置センサーの値を取得できる。そう、馬鹿げたシステムである。でも、勉強するのには持って来いだと思うので、ぜひとも実装したいものだ。
また、RPi上のプログラムを作成する場合は、できればプログラミング言語C++を使用したい。オブジェクトオリエンテッドな言語の考え方も勉強するようにしたい。

LinuxBeanでキーバインドの設定 xdotool & obkey

LinuxAutohotkeyを実現したかっただけなのに…

皆さんはどんなキーバインド、キーコンビネーションがお好みだろうか?

僕が今までUbuntuDebianその他Linuxディストリビューションをメインマシンとして使用しなかったのは、自分が好きなキーバインド、キーコンビネーションの設定ができなかったのが大きな理由だ。

もちろん他にも理由はあるが、これが結構な割合を占めてた。

僕はWindowsを使用している場合はAutohotkeyを使ってCtrl+[?]の組み合わせでvimライクな操作を実現していた。

Ctrl+hjklで方向キーを入力できないなんて嫌だ。

それなのに、何故かLinux環境ではなんか設定が難しい、というか理解しにくい。

できるにはできそうなんだが、紋切り型の方法で設定するのではなく、Google先生方もみんなそれぞれ違った記事を書いている。

xkb?

xdotool?

xbindkeys?

rc.xml?

様々な方法が書いてあったが、どれも僕のイメージに沿わない。

あくまでもキー入力は最終的に、ウィンドウマネージャが受け取り、処理したのち、アプリケーションへ送信する、というのが僕のイメージだった。

LinuxBeanを使用している僕としては、できることならばOpenBoxのキーボード・ショートカット設定ツールObkeyから設定したかった。

Ctrl+[?]によるキーコンビネーションの設定は技術的に難しいらしい、ということが、このあたりに書いてあったと思う。

しかし、最低でもAlt+[?]の形で設定したかった。

それがやっと実現できたので記述しようと思う。

 

 キーを送信するスクリプトを作成

この方の記事がわかりやすかった。

このページの"emu_keystroke.sh"をありがたく使わせていただいた。

このスクリプトシンボリックリンクを下記の名前で作成する。

 

$ cd ~/bin
$ ln -s emu_keystroke.sh emu_Up.sh
$ ln -s emu_keystroke.sh emu_Down.sh
$ ln -s emu_keystroke.sh emu_Left.sh
$ ln -s emu_keystroke.sh emu_Right.sh

 

あとはObkeyでこれらのスクリプトを設定するだけ。

 

 Obkeyでの設定

 まずは起動。

f:id:tokixy56:20150519225534p:plain

設定方法は以下。

1. 水色の□と+が縦に並んでいるボタンをクリックすると「Key」部分に新たな項目が追加される。

2. 新たに追加されたを選択し、画面右下「Actions」下のプラスをクリックする。

3. 「Actions」に新たに「Focus」が追加される。

4. 「Focus」をクリックすると、選択肢が表示されるので「Execute」を選択する。

5. 画面右上に出てくる「command」右のテキストボックスに、先ほど作成したスクリプトのパスを記入。

6. 「Key」部分を選択した状態で、もう一度クリックすると、「新たなアクセラレータ…」と表示されるので、[Alt+h]などと設定する。

以上で完了。

 

やっぱり好きだなLinux

 

 

iPhoneでメモを取る URLスキームとLaunch Center ProとTouch Icon Creatorと…

とっさのメモはどのようにして取る?

僕は長らくこの事について真剣に悩んでいるが、皆さんはどのようにしているだろうか?

普段、手帳やノート、メモを持ち歩いてる方はおそらくそれに書き込んでいるのだろう。

今はスマートフォンで本当にいつでもメモを取れるようになったので、それを活用している方も多数いるのではないだろうか。

 

僕は以前モレスキンポケット・ハードカバー・プレーンをずっと持ち歩き、事ある毎にメモを取り、思いを綴っていた。また日記も自分でフォーマットを考えてB6サイズの用紙に印刷し、書いてはスキャンし、PDFで管理するということを繰り返した。

しかし、PCとスマートフォンをヘビーユーズした生活を送っていたある日、多忙な日々で「自分の記録のとり方」を考えなおそうと思い立った時、メモも日記も家計簿も取ることを止めてしまった。

それから数カ月が経って、ようやくブログなどを初めてまた、文章を書くことの大切さを思い出し、長年の「記録のとり方草案」にケリをつけようと思った。

 

やっぱりいつも持っているのは携帯電話、スマートフォンiPhone

常に肌身離さず携えているのはやはりiPhone

これを使わない手はないと、もちろん何度も考えた。

しかし、操作が手書きのメモに比べて直感的でなく、スマートフォンでの文字入力は手書きのそれの数倍嫌いであった。

好きな記録の仕方は以下のようになっている。

キーボード>ペン手書き>写真、動画撮影>スマホのスクリーンキーボード>ボイスレコーダ

できるならば、ペン手書きと写真、動画撮影の間くらいには食い込む記録方法を考えたい。

種々の方法を考えた結果、以下の方法がベストだと思い至った。

  1. Launch Center ProでURLスキームを作成。
  2. 手書きメモ系のアプリなどで「メモ」とか「出費」とか書いた写真を保存。
  3. Touch Icon CreatorでURLを選択し、「1.」で作ったURLスキームをコピー。その際、「1.」で保存した写真を選択。

ホーム画面にそれらのアイコンがあれば、iPhoneのロックを解くと直感的にメモに辿り着く。

「どのアプリでメモ取ってたっけ? タイトル何にしよう? テンプレがあればいいのに… リストから選べたらいいのに… 数字キーボードが出てくれたらいいのに…」などの不満が一気に解決すること間違いなしである。

Launch Center Proの使い方詳細は他のページに譲る。

というかこの方がほとんど言いたいこと書いてくれてる!!汗

samulife.com

Lauhch Center Proのポップアップ(prompt)入力とか、リストを自由に作って選択できる感じがかなり自分には合っていた。

注意点として、Touch Icon CreaterでLaunch Center ProのURLスキームを使用する際は「{{」と「}}」の二重ブレースを削除しておくことである。

 

Touch Icon Creator

Touch Icon Creator

  • Makoto Setoh
  • ユーティリティ
  • ¥120

 

Launch Center Pro

Launch Center Pro

  • Contrast
  • 仕事効率化
  • ¥600

 

pdfclop PDF余白カット ついでにtexlive

USB3.1仕様書やFAT32ファイルシステム仕様書、その他CPUの仕様書、データシート、などなど、PDFのドキュメントを読みたい機会が多々ある。

そういうのをいつでも読みやすくするために画面の大きいiPhone6 plusを手に入れた。

しかし、思いの外読みにくい。。。

原因は画面サイズではなく、ドキュメントの余白にあると思う。

その余白カットをpdfcropにて行うことにした。

まずはインストール。

pdfcrop

$ sudo apt-get install texlive-extra-utils

以下のように実行すれば余計な余白をいい具合にカットしてくれる。

$ pdfcrop --clip input.pdf output.pdf

 

 PDFの編集関係を検索していたら、texliveなるものを発見。

ドキュメントを書くにはうってつけの組版環境らしいです。

Texてそういうもんなんだと今更知りました。

まだまだ勉強していかなければなりますまい。

Facebookページから移設

Facebookページに自分のページを解説してから2週間ほど。

早くも移設。

このブログに色々と書いていこうと思います。

はてなブログやその他のブログサービス、そのサービス上に様々なありがたい情報を掲載してくださっている技術者及びそれに関連する方々、それを検索するとすぐに表示してくれるGoogle先生

全てに感謝し、自分が得た知識や実際に経験したことも、少しでも誰かの役に立てばと思い、ブログという形で記録に残していこうと思います。

 

次回以降、自分の今後の計画や実際に行った詳細な記事を書いていこうと思います。

よろしくお願いします。