2011年12月15日木曜日

Vimスクリプトの学習法 [Vim Advent Calendar 2011]【15日目】

この記事はVim Advent Calendar 2011の15日目の記事です.

Vimテクニックバイブルが出版され,様々な便利機能を知った人は多いと思います.しかし,これを自分で作れるか,作ろうと思い至れるか,と自問自答すると,作れない,思いつかない,という人もいると思います.

何故作れないのか,何故思いつけないのか,という疑問に対する自分なりの答えを2つほど考えてみました.
  1. Vimの機能を把握していない
  2. Vimスクリプトで問題を解くことに慣れていない
Vimの機能を知るほど,これってVimでやると楽なんだけどな,という作業が増えていきます.例えば,Vimのマクロ機能を知らない人は,100回同じ作業をしてしまうかもしれません.マクロ機能を知っている人は,これだけの作業をマクロにして,後は99回実行させれば良いな,と考えるでしょう.Vimの機能を知らないからこそ,Vimでやってみようという発想に至らないのだと思います.Vimの機能が把握できていないという問題は,Vimのドキュメントを読むことで解決できます.実際,一通り読んでいくと気づいていなかったり忘れていた機能に出会うことがあります.有志によるドキュメントの日本語訳も充実しているので,以前に比べてドキュメントを読むのは格段に楽になったと思います.

また,Vimスクリプトに用いる言語は少々癖があるので,慣れていないと上手く動かなくて途中で放り投げてしまったりするかもしれません.慣れるには何かを自分で作ってみたり,既存のスクリプトを弄ってみたりすれば良いのですが,特に作りたい物が無かったり,手頃な弄れそうなスクリプトが見つからない人もいるでしょう.そういう人にお勧めするのが,既存のプログラミング言語の問題集をVimスクリプトで解いてみる,ということです.
以下は,Higher-Order Perlの例題から,ハノイの塔をVimスクリプトに書き換えたものです.

let s:position = ['', 'A', 'A', 'A']

function! s:check_move(disk, start, end)
  let l:length = len(s:position) - 1
  if(a:disk < 1 || a:disk > l:length)
    echo "Bad disk number "  . a:disk . ". Should be 1.." . l:length . "."
  endif
  if(s:position[a:disk] != a:start)
    echo "Tried to move disk " . a:disk . " from " . a:start . 
          \ ", but it is on peg " . s:position[a:disk] . "."
  endif

  for i in range(0, a:disk - 1)
    if(s:position[i] == a:start)
      echo "Can't move disk " . a:disk . " from " . a:start .
            \ " because " . i . " is on top of it."
    elseif(s:position[i] == a:end)
      echo "Can't move disk " . a:disk . " to " . a:end .
            \ " because " . i . " is already there."
    endif
  endfor

  echo "Moving disk " . a:disk . " from " . a:start . " to " . a:end . "."
  let s:position[a:disk] = a:end
endfunction

function! s:hanoi(n, start, end, extra, move_disk)
  if a:n == 1
    call a:move_disk(1, a:start, a:end)
  else
    call s:hanoi(a:n - 1, a:start, a:extra, a:end, a:move_disk)
    call a:move_disk(a:n, a:start, a:end)
    call s:hanoi(a:n - 1, a:extra, a:end, a:start, a:move_disk)
  endif
endfunction

call s:hanoi(3, 'A', 'C', 'B', function('s:check_move'))

既存の問題集を利用する方法の利点は,どういう機能があればその問題が解けそうか,ということが分かっているため,ドキュメントを調べるのが楽だということです.

一流のVim使いというのは,Emacsを監視し,面白そうな機能があれば

「それVimでもできるよ」

と言うために移植を試みているようです.同じように,プログラミング言語も監視して

「それVimスクリプトでも書けるよ」

と言うために,各種プログラミング言語の問題集をVimスクリプトで書いてみることで,Vimスクリプトを学んでみてはいかがでしょうか? (実はこれを言いたかっただけという説もあったり無かったり)

以上

明日は,@yuzuemonさんです.

2011年12月13日火曜日

無償で手に入る電子書籍5

A Quick and Gentle Guide to Constraint Logic Programming via ECLiPSe
ECLiPSeという実行環境があって,それを利用して制約論理プログラミングに入門してみましょうという本,なのかな.

TeX by Topic
その名の通りの本.TeX関連の本はCTANで探せば他にも色々ありそうな気がしてきた.

TeX for the Impatient
日本語で言うと忙しい人のためのTeXかな.

2011年12月4日日曜日

無償で手に入る電子書籍4

Learn Python The Hard Way
苦しんで覚えるCのPython版って感じかな? 無償で見られるのはHTML版だけで,
PDFとePubのみなら併せて$5なので,安いかなぁと.ハードカバーだと$60ですが.

The Boost C++ Libraries
こちらもPDFとePubは有料でHTMLなら無料という.

The Craft of Text Editing or A Cookbook for an Emacs
Emacsの本のようで,絶版?だからかePub版もPDF版も無償で提供してくれているみたい.

Fast Fourier Transforms
高速フーリエ変換に関する本.connexionsの発祥大学の先生の書籍だし,ダウンロード可能にしてある,と考えて大丈夫だよね?

Natural Language Processing for the Working Programmer
自然言語処理をHaskellで解説している.まだ書きかけみたい.

そろそろ量も増えてきたので,ジャンルごとにリストを整理する必要があるかも.

2011年12月1日木曜日

無償で手に入る電子書籍3

Linux標準教科書系
LPI-JAPANが提供するLinuxに関する教科書.日本語(<- ここ重要).

The Scheme Programming Language, 4th Edition
オンラインで読むこと前提なので,電子書籍として読むにはちょっと面倒.

Leran You a Haskell for Great Good!
こちらもオンライン前提.ところで,a Haskellってことは他にもHaskellが
あるという感覚なんだろうか?

The Art of Assembly Language Programming
第一版の方が良いという評価を聞いたことがあるのだけれど,どうなんだろう?

Assembler and Loaders
ちょっと古いか?

もうちょっと日本語でも公開されている電子書籍があっても良いのじゃないか,と思うのだけれどどこかにまとまってたりするんだろうか?

2011年11月28日月曜日

Gentoo Prefix on Mac

Gentoo Prefix Bootstrap Process for Mac OS X
を参考に,Gentoo Prefixをインストールしてみて,色々ひっかかったのでメモ.

@naota344 さんに色々と手助けしてもらい感謝.

まず,最初にひっかかったのが,1.11 の emerge portarge.
どうもPythonのビルドが上手くいかない.最初に

USE=-aqua

と付けておくと上手くいく.

次にひっかかったのが,1.16.1.15でmake.confを設定したものの,
-marchが上手く認識されないので外した.更に,mpfr-3.1.0の
インストールが上手くいかない.どうも見てみると,ドキュメントの
フォルダがmpfrという名前で生成されているのに,mpfr-3.1.0という
ドキュメントのフォルダを探しに行っている.

$EPREFIX/usr/portage/dev-libs/mpfr/mpfr-3.1.0.ebuild

の66行目のpushdの${PF}をmpfrに書き換えてやって,

$ ebuild $EPREFIX/usr/portage/dev-libs/mpfr/mpfr-3.1.0.ebuild digest

とやってから,1.16を再開するとmpfrは抜けられる.
がしかし,またもやPythonでひっかかったので,USE=-aquaを付けて
やり直す.

これで無事Gentoo Prefix on Macがインストールできた.
けど入れてみたはいいけど,はっきり言って使い道を知らなかったりする.
今度使っている人に聞いてみるか.

2011年11月24日木曜日

Mac + Jenkins + C++

MacにJenkinsを入れて,C++で書いたコードを自動的にビルドして色々チェックしてくれる環境を構築してみた.で,色々引っかかったりしたことをメモ.もっと簡単にする方法があるのかもしれない.

インストールそのものはこちら

1. JAVA_HOMEが上手く設定されない
とりあえずシェルスクリプトを実行させようとすると,JAVA_HOMEが上手く設定されていなくて,上手く動かなかったりしたので,シェルスクリプトで無理矢理設定した.
ここで,MacでJAVA_HOMEを設定する場合,どうも特殊な方法があるようで.

export JAVA_HOME=`/usr/libexec/java_home`

バッククォートってことは何かを実行しているのかな.

2. PATHが上手く設定されない
仕方ないのでPATHもシェルスクリプト内でexportすることに.

で,取りあえず入れてみたプラグインが,cppcheck(スタイルチェック),cppncss(サイクロマチック数計測),xUnit (cppunitなどのxUnitの結果をまとめてくれる),doxygen.ここでもまた問題が・・・

3. cppcheckがメモリが確保できない,と文句を言う
Lionを使っているんですが,どうもLLVMベースのgccでビルドすると上手く動かないようで.とりあえず,MacPortsでインストールされてしまった通常版のgccを使ってビルドし直すと上手く動いた.
/opt/local/bin/gcc-apple-4.2 を指定してビルド.

4. プラグインはあくまでも結果をまとめるだけ
どのプラグインにも共通して言えるのは,あくまでも結果をまとめるだけ,ということ.まとめるための結果を出力する部分はこちらでやる必要がある.最初勝手に実行してくれるものと思って何故エラーになる,とか思ってた.

5. 一部の設定は入力が必須
どうも一部の設定は入力していないとエラーになるようで.プラグインの作りがデフォルト値が無かった場合例外投げて無理矢理終わってしまうものがあるらしい.とりあえず適当に値を設定したら動いた.

とりあえずここまで来たら,後は適当にコードを書いていくだけかな.

追記
gitとかも,システムの設定で直接パスを指定しておいて,それを使うようにしておかないと上手く動かなかったり.この辺自動的に設定できないんだろうか.多分,daemonにホームディレクトリを設定して,そこに.bashrcとか持たせたら上手くいくような気がしないでも無い.

2011年11月21日月曜日

無償で手に入る電子書籍2

On Lisp 日本語版草稿
翻訳した上に草稿とは言え公開するなんて凄いですね.

Lexical Analysis and Parsing Using C++
著者のサイトからダウンロード可能なようなので,著作権的に問題無いはず.
面白そうなので読んでみよう.他にも面白そうなのがある.

Parallel Programming with Microsoft Visual C++
電子書籍そのものというよりも,電子書籍のウェブ版が無償で見れる.
これ保存してしまえばePub作れそうな気がしてしまうが,良いのだろうか?

The Function Pointer Tutorials
一応PDFもダウンロードできるよう.面白そうなので後で読もう.

Data Structures and Algorithm Analysis
C++版とJava版があって,教育目的のためならということで配布している.素晴らしい.
後で読もう.

こうして積読が増えていく・・・今日は疲れたからこれくらいにしておこう.

2011年11月20日日曜日

MacでJenkinsをインストール

Jenkins実践入門を購入したので,MacにJenkinsをインストールしたのは良いのだけれど,上手く起動しない,ということで調べてたら,どうもJenkinsのMac用インストーラは所有権を適切に設定してくれないらしい.

sudo chown -R daemon /Users/Shared/Jenkins

とJenkinsがインストールされるフォルダ以下の所有権をdaemon (Jenkinsがインストールされるときに設定されているユーザ名)にしてやれば良い.

そして,後はJenkinsを再起動してやればいいわけだが・・・えっ,GUIが無い? Windowsだとサービスとして動いているのを制御できるGUIがあるんだが.まぁ,CUI好きの自分としては気にならないけれど,まずはコマンドを調べないといけない.どうもlaunchctlというコマンドで行けるらしい.

sudo launchctl stop org.jenkins-ci
sudo launchctl start org.jenkins-ci

おそらくこれで動くようになる.上手くいかない場合,

sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist

と設定を再読み込みさせればいいらしい.

で,ふとlaunchctlのヘルプを表示させようとコマンド名のみを入力したら,インタラクティブモードに入ったのでちょっとびっくり.どうもCPANやportのようにlaunchctlを通して行う作業をインタラクティブに繰り返し行えるよう.でも,なんで再起動のコマンドが無いんだろう.

とりあえず,これで起動することはできた.

2011年11月18日金曜日

JScriptのCopy-Fileではまった

今日はJScriptを触ってました.でまたはまった.

Copy-File 送り元 送り先

の順序だったとは.逆だと思ってました.しかし,それだけでは終わらない.
送り先をファイル名にしておかないと,ファイルがコピーされない.
どうもWindows 7から変わったようなのだけれど,本当にそうなっているのかが分からない.
MSDNのドキュメントでも送り先にフォルダを指定しているのに・・・

2011年11月17日木曜日

PowerShellのリダイレクトではまった

今日もPowerShellと戯れていたわけですが,またはまった.

Get-Content hoge -Encoding UTF8 > foo

という感じで書いていたわけですが,どうもこうすると文字コードがUnicodeにされてしまうらしく,UTF-8で保存されないらしい.そのせいでファイルフォーマットがおかしいって文句言われたよ・・・

Get-Content hoge -Encoding UTF8 | Set-Content foo -Encoding UTF8

とパイプを使ってエンコーディングを指定できる形で保存するとうまくいった.まさかリダイレクトが単純にそのままはき出すのではなく文字コード変換をかけてくるとは思いもよらなかった.

2011年11月15日火曜日

PowerShellでXMLを弄っていてはまった

PowerShellでXMLを弄っていて,ImportNodeが非破壊だと知らなくてはまった.

$A = [xml](Get-Content ファイルパスA)
$B = [xml](Get-Content ファイルパスB)

$node = $A.hoge
$B.ImportNode($node, $true)
$B.AppendChild($node) # 別ドキュメントだと文句言われる
実際には次のようにしないといけなかったらしい.
$node = $B.ImportNode($A.hoge, $true)
$B.AppendChild($node)
その辺のウェブサイトじゃなく,ドキュメントをちゃんと読んだら確かに非破壊だって書いてあるよ. 困ったらまずはドキュメント確認しないと駄目だなぁ.

2011年11月13日日曜日

Vim勉強会#10 に行ってきました.

午前中だけという短い時間でしたが,色々と面白い話が聞けて良かったです.
個人的に,EmacsのEvilというVimをシミュレートするelispの話が面白かったです.

一流のVim使いはEmacsを監視して虎視眈々と面白そうな機能を見つけてはVimに移植し,
それVimでもできるよ,という機会を狙っているようです.(逆もまた然り?)

しかし,このために買ったといっても良いMacbook Air よりもiPadの方が活躍したって
どうよw

Vimに興味を持っている後輩も来ていたようで,うちの大学もまだまだ捨てたもんじゃ
ないな,とちょっと嬉しくなったりして.

2011年11月11日金曜日

Higher-Order Vim

家に帰ったらC#やるぞっ,と思っていたのに何を思ったか,Higher-Order Perlという本に出てくる例題をVim Scriptで書いてみるか,となった.

function! Binary(n)
  if a:n == 0 || a:n == 1
    return "" + a:n
  endif
  let l:k = float2nr(a:n / 2)
  let l:b = "" + (a:n % 2)
  let l:e = Binary(k)
  return l:e . l:b
endfunction

とりあえずこんな感じ. 自然数を二進数表現の文字列に変換する関数.ちなみに,負数を与えると大変なことに.

後は単体テストとかの書き方を覚えると良いかな.

2011年11月9日水曜日

無償で手に入る電子書籍

何かMathJaxのフォントの読み込みが重いようなので切ってみた.

Web上には絶版などの理由から無償で手に入るようになっている電子書籍が存在する.
たまに探すのだけれど,ダウンロードし終わったものは後から入手しようとして名前すら忘れていることもあるので,メモっておこう.

なお,読んでない本多数.

Higher-Order Perl
Perlで関数型言語のような高階関数とかをやろうという本.

The Scientist and Engineer's Guide to Digital Signal Processing
デジタル信号処理について幅広く扱っている.

Graphics Programming Black Book
アセンブリで画像処理という本?

Practical Common Lisp
On Lisp

PostScript Language Reference, third edition (赤本)
PostScript Language Tutorial and Cookbook (青本,zip)
PostScritp Language Programming Design (緑本,zip)
PostScriptはプログラミング言語なんです.

Invent Your Own Computer Games With Python

追記
FreeComputerBooks.com
こんなのがあるらしいけど,権利的に問題が無い本ばかりなのかな?

2011年11月8日火曜日

Windowsでnpmのインストール

Windowsにnpmをインストールしようとして,何故か上手くいかないなぁ,と思っていたらドキュメントをちゃんと読んでいなかっただけ,というオチだった.

git clone git://github.com/issaacs/npm.git

じゃなく

git clone --recursive git://github.com/issacs/npm.git

と再帰的に取ってくる必要があった.
そして,インストールするぞ,と思ったら今度はnodeの置いてある場所に問題が.
パスに空白が含まれていると動かない様子.
とりあえず,node.exeをパスに空白が含まれない場所に移動して,再度npmを
インストールしたら上手くいった.

cd npm
node cli.js install npm -gf

2011年11月7日月曜日

WindowsでCoffeeScript

いちいちVMを起動するのが面倒になってきた今日この頃.
色々な環境をWindowsでも動くようにしつつある.

で,CoffeeScriptをWindowsで動くようにしようとしたところ,
npmのインストールでつまずいた.が,どうもnpmがなくても
CoffeeScriptはインストールできるみたい.

gitでcloneしてきたソースコードの場所をCOFFEE_SCRIPT_SRC_PATHとして,
git clone git://github.com/jashkenas/coffee-script.git
以下のような内容のcoffee.cmdというバッチファイルをパスが通っている場所に設置する.

@echo off
node %COFFEE_SCRIPT_SRC_PATH%/bin/coffee %*
あとは,coffeeと実行するだけでOK.

2011年11月6日日曜日

ヒアドキュメントチートシート

ヒアドキュメントって便利なんだけど,複数の言語を使っているとどれがどの構文だったか忘れそうなので, まとめておこう.

Perl

変数展開無し (<<'シンボル'; からシンボルまで)
<<'EOT';
$HOME
EOT
変数展開有り (<<シンボル; からシンボルまで)
<<EOT;
$HOME
EOT

Perlでヒアドキュメントを書く場合,たまにヒアドキュメントのシンボルの後にセミコロンを忘れて失敗することがある. それと,終了を示すシンボルは行頭に無いと駄目だったはず.

あと,バッククォート ( ` ) でシンボルを囲むとコマンドの実行結果を得られるというのもあるらしい.

PowerShell

変数展開無し (@' から '@ まで)

@'
$HOME
'@

変数展開有り (@" から "@ まで)

@"
$HOME
"@

Python

シングルクォート3つで囲むか,ダブルクォート3つで囲む. 違いは無いみたい?

変数展開はできない?
'''
here
'''
"""
document
"""
formatメソッドを使えば変数展開はできるみたい.
'''
{message}
'''.format(message="hello world")
"""
{message}
""".format(message="hello world")
気が向いたら追加するかも.

PowerShellでのヘルプの見方

最近PowerShellを使うようになってきた.今までは,Windowsってバッチ作るの面倒だから嫌だわ,と思ってたけれど,PowerShell使い始めたら,もうこれ無しでは無理だわ,と思えるくらいに.

で,新しい言語に触る際にはヘルプの見方を覚えるのが重要だと思っているので,よく使うヘルプの見方というかキーワードの見つけ方をメモっておく.PowerShellではコマンドではなくコマンドレットって言うらしい.


  •  Get-Help コマンドレット
    • helpとかmanみたいなもの
  • コマンドレット | Get-Member
    • PowerShellでコマンドレットが返してくるオブジェクトがどういうメンバ変数とかメンバメソッドを持っているかを確認する.
とりあえず,ヘルプが見れて,返されるオブジェクトがどんなメンバとか持っているのかが分かれば,後は必要っぽいのがあるかどうか探してGoogleで検索すれば良いかな,とか思ってる.

LLVM2JavaScript Compiler

LLVMのビットコードからJavaScriptに変換するコンパイラらしい. 面白そうなので,後で見るためにアドレスだけメモっておこう. Emscripten

MathJaxの導入

MathJaxも導入してみた.以下の内容をテンプレートの<head>内に記入するだけ. とりあえずテスト. $e^{i\pi} = -1$ これで,$\TeX$形式で記入して数式が出せる.

2011年11月5日土曜日

Twitterとブクログのウィジェット追加

Twitterとブクログのウィジェットを追加してみた.

Twitterは簡単でここの指示に従って設定していけば,Bloggerへの追加ボタンが出るので,押すだけ.

ブクログは,ここで表示されるスクリプトを,デザインタブから基本ガジェットのHTML/JavaScriptを使って追加すればOK.

他にも色々カスタマイズする項目はあるようだけれど,さてどうしたものか.

SyntaxHighlighterの導入

とりあえずブログを作って最初にやったのが,構文強調機能を追加すること.

SyntaxHighlighter

これを導入してみた.あちこちで参照されている How To Add Syntax Highlighter(V3) To Blogger Blogs にあるフォームを利用しても良かったのだけれど,手作業でインストールしてみることに.

ここに最新版にアクセスする方法が書いてあるので,参照しつつテンプレートに導入してみた.

Bloggerの投稿などのタブからデザイン > HTMLの編集を選び,テンプレートをダウンロードし,ダウンロードしたテンプレートの</head>の直前に以下の内容を追加して,アップロードする.








HTMLを構文強調する際に問題になったのが,<pre>を使うとBloggerが自動的に追加しているタグ(アドレスを自動的にリンクに変更するなど)が見えてしまう,ということ.それを避けるために,インストール方法の一番下を参考に,<pre>ではなく<script>を使った構文強調に置き換えたら上手くいった.

とりあえず,C++でhello worldでも書いて構文強調のテストをしておこう.
#include <iostream>

int main()
{
    std::cout << "hello world" << std::endl;

    return 0;
}
追記

新しいインターフェースだと,テンプレートは左側のメニューからテンプレートを選んで,ブログで使用中,の下のHTMLの編集を選んで,タグを追加すると良いようです.