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

プログラミング初心者がちょっとしたコードを即座に試したい毎日に使えるワザ

ちょっと試したいコードを確認するために、そのつど「foo.pl」なんてファイルを作って、そのつどターミナル上でそのファイルの場所まで移動してそのファイル名を打ち込んで、

$ perl foo.pl

とかやるのは、まあ最初のうちはそれでも良いかもしれないが、その後何千何万と同じような「これ実行したらどうなるんだろ?」ということをやるたびに繰り返すのではつらい。

というか、つらくて面倒になっていずれやらなくなってしまう、という方が「何千何万と繰り返す」よりも先にくる方が自然である。

ぼくは数ヶ月前にふと、自分がそういう「ちょっと試してみたいコードを書く」ということがこれからも数えきれないほどあるのではないかと気がついて、その後は改良を重ねながらこんな風に対処してみている。というのを以下に書きます。

ひとつのファイルでやる

まず決めることは、場所はどこでもいいので、それ用のファイルをひとつ作ってしまうということ。

初心者の人だったら、ターミナルで「cd」と打てば常に必ずそこに行ける「ホームディレクトリ」に作ってしまうのが手っ取り早いと思う。

僕の場合はホームディレクトリではないけれど、日常的に頻用するファイルを集めたフォルダというのがあって(作業日誌とかタスク集とかいろいろ入ってる)、そこに「perl.pl」というファイルを作っている。
まあ、そのファイル名はどうなのかと自分でも思わなくもないが、誤解の余地がないのでそうしている。(少なくともRubyのコードが入っていないことは明らかだし、Rubyのコードは「ruby.rb」に入れている)

一発で開けるようにする

その上で、これは興味のある人だけでもいいかもしれないが、ぼくはMacのランチャーアプリでQuicksilverというのを2007年ぐらいから使っているんだけど(僕にMacを教えてくれた人が使っていた)、いまだにこれが最高の常用ツールで、といっても使っている機能はその中のほとんど一つだけで、triggerというところに開きたいアプリケーションやファイルと、それに紐付いたショートカットキーを設定することができる。
具体的には、僕の場合は上記の「perl.pl」を開きたいな、と思ったら「コントロール+コマンド+P」を押したらポンとそれがエディタとともに立ち上がる。
この間、誇張でなく1秒未満。

Finderでそのフォルダを探す必要もなく、ただ頭の中で「そのファイル開きたい・・」と思うかどうか、ぐらいの段階で両手がそのキーを押したらもうその瞬間に出てくる。
ランチャーツールはほかにもいろいろあるようだけど、とりあえずショートカットキーで瞬時にそれが出てくる、というのはとくに繰り返し系の作業においては大変良いのでお勧めしたい。

Quicksilverのサイトはこれかな。
http://qsapp.com/

上書きせずに__END__を使う

上記のショートカット設定は必ずしも必須ではないけれど(おいおいやってみる、とかでもいいのかも)、次のこれは最初からほとんど必須のTipsである。

最初にも書いたように、この「ちょっとしたコード試すフロー」における大原則は「ひとつのファイルに書き続ける」なので、普通は「ええ、だったら前にせっかく書いた内容を消さなきゃいけないの・・? いかにちょっとしたコードだって言っても、初心者のときほどそれ、書くの大変だし、もったいないから消したくないな・・」とか思うのが人情である。

そしてそういうときに人はどういう行動に出るかというと、たとえば「hello.pl」を書いた後に、「ちょっとだけそれに手を入れたコード」とかを書く時にも「別名で保存」をして、「hello2.pl」とか「hello-new.pl」とか「hello-new2.pl」とかをつい量産してしまうわけだけど(どうせ使い捨て、と考えればそれはそれで正しいが)、量産してしまった使い捨てファイルというのはその後の掃除の手間を同時に生んでしまうので、短い人生を過ごす上で良い選択肢とは言えないのも事実である。

そこで使えるのがコメントアウトで、といっても「#」による行単位のそれだとかなり大変なので「__END__」を使う。

これはべつにどの本や資料に書いてあった、とかではないのだけど、Perl入学式でレクチャーを見ていたら、校長のpapixさんのライブコーディングでこれが使われていて、papixさんにしても「これが便利でねえ〜」とかそこで説明していたわけではないんだけど、見ているとどうも、「__END__」の下に置かれたコードは実行時に無視されているらしい、というのがわかって、真似したらそうなったのでそれで覚えた。

それってコメントアウトの一形態なんだな、と思ったのはもっと後で、たんに「__END__」の下に置けばとりあえず以前に書いたコードをわざわざ消してしまわなくても同じファイルの中でどんどん新しいコードを試せる、ということがわかったので、それを使うようになった。
だからこの「perl.pl」でも僕はひたすら、以前に書いたコードはその「__END__」の下に押し込んでいる。

「以前に書いたコードはその「__END__」の下に押し込んでいる」と今書いたけど、それは一個だけ書いた「__END__」の下に使い終わったコードを毎回コピペして移動しているということではなく、新しいお試しコードを書くたびに、そのすぐ下に「__END__」を書いているだけである。(具体例は下の方で出てきます)

ちなみに、僕の現在の「perl.pl」は2250行だけど、その中に書かれた「__END__」は170個だった。つまり少なくとも170回、そのファイルの中にお試しコードを書いているということになる。頑張ってるな!

さらにちなみに、この「__END__」は勝手に知ったものだけど、やはり資料や本で学んだわけではないTipsとして、ターミナル上でメッセージがわらわらと画面を覆ったときに「コントロール+L」とやると一気に行が押し上げられて綺麗になる。
で、これは去年のYAPC内のPerl入学式でサポーターさんに教えてもらった。ぼくが「ちょっとわからないんですが・・」と質問したときに「ああ・・その前にちょっとこれだと見たい部分がわかりづらいので、一旦ターミナル綺麗にしましょうか」といってそのワザを教えてくれた。
これまじでほんとに役立っているし今も毎日に近く使っている。

ターミナルで実行する

使うファイルをひとつに決めて、場所も決まって、「__END__」を使って以前のコードを消さずに溜め続けることもわかったら、とりあえず何か実行してみよう。

たとえばおなじみのこれでよい。「perl.pl」という名前で、ホームディレクトリに保存しよう。

#!/usr/bin/env perl
use strict;
use warnings;

print "Hello, world!\n";

なにしろこのファイルにおける最初のコードだから「__END__」はまだ不要である。(まあ入れたかったら入れてもいいですが・・)

で、ターミナルを立ち上げる。もしすでにターミナルが上がっていて、あなたが別のディレクトリにいるなら「cd」でホームに戻ろう。

$ cd

どこかの記事にも書いたが「$」は「これ、ターミナルでの話ですから」ということをアピールしているに過ぎないのであなたは「cd」を打ってエンターを押したらそれでよい。

そこまでやったら今あなたはターミナル上でホームディレクトリにいるから、あらためておもむろに上記の「perl.pl」のコードを実行しよう。

$ perl perl.pl

こんな風にでるはずだ。

Hello, world!

ってまあ、そうなるように書いてるわけだが・・

ちなみに上記の実行文、「perl perl.pl」ってなんだか混乱を誘う書き方なのでやっぱりファイル名失敗しているだろうか。まあ「test.pl」でも「sample.pl」でもなんでもいいんですけど。
でもぼくは「perl.pl」ですし、それでとくに困っていません!

閑話休題。じゃあせっかくなので「__END__」も使ってみよう。
そうだな・・じゃあ変数を試しましょう。

my $hello = 'Hello!';
print "$hello Goodbye!\n";

__END__

上記の内容を、さっき書いた「print "Hello, world!\n";」の上に入れてみよう。
全体はこうなるはずだ。

#!/usr/bin/env perl
use strict;
use warnings;

my $hello = 'Hello!';
print "$hello Goodbye!\n";

__END__
print "Hello, world!\n";

はい。ではあらためて、さっきと同じターミナルでさっきと同じコマンドを打ち込もう。

$ perl perl.pl

ところでしかし、同じコマンドなんだからわざわざもう一度打たなくたっていい。こんなときには、矢印キーの「↑」を一回叩けば同じのがでてくる。便利だ。

※この矢印キーのワザについては以前に書いた以下の記事中の「ターミナルで矢印の上下キー」という節に書いている。
http://note103.hateblo.jp/entry/2014/07/27/174624

で、実行すると、こんなのが出るはずだ。

Hello! Goodbye!

おつかれさまでした。

おまけ: Vimmer(または未来のVimmer)用のQuickrun.vim活用法

ということで、以上でひと通り、本題の最低限のエッセンスは書いたのだけど、ここからは若干ハードルが高いというか面倒というか興味や体力の持続する人向けのものとして、じつは僕の場合はこの程度の実行結果を見るときには、上記のようなターミナルは使っていなくて、ではどうするのかというと、Vimプラグインである「Quickrun.vim」を使っているので以下ではそれをラフに説明します。

Quickrun.vimに関する本家のドキュメントはこちら。
https://github.com/thinca/vim-quickrun/blob/master/doc/quickrun.jax

こちらの紹介記事もわかりやすいかも。
http://d.hatena.ne.jp/osyo-manga/20130311/1363012363

僕も以前にちょっと近い話題でこういうのを書きました。
http://note103.hateblo.jp/entry/2014/02/11/005326

まあとにかく、この辺のはどれもこれも便利でライフチェインジングすぎるのだけど、とはいえサクッと説明するには導入の仕方がちょっと説明しづらすぎる感じなので(踏まえる情報が多すぎるというか)、とりあえず上記のリンク見て気になったらどうぞ、というぐらいなのだけど、それだけというのもなんなので、一応ひと手間かけて僕が上のサンプルコードとかをどうしてるのか、という様子を撮った動画GIFをアップしておきます。

f:id:note103:20140817010902g:plain
拡大リンク

これって何をやってるのかというと、まずコードを「perl.pl」にペタってコピペまたは手で書いた後に、「コントロール+K」を押したらその瞬間に画面が上下に分割されて下の方に実行結果が出る、と。

これが超ラクで、大体「このコードって・・実行したらどうなるんだろ」みたいのを見つけるたびにこれで結果を見ています。

ただまあ、これで無限ループとかつい間違ってやってしまうと(かなりやる。いまだに)エディタがフリーズして結構つらい感じになるのでそこは注意です。(というかまだwhile文をちゃんと理解してないので・・)

ちなみに、Quickrunの画面分割は上下だけでなく左右もできて、その辺のドタバタは以下に書きました。
http://note103.hateblo.jp/entry/2014/02/11/124745

まあ、結果的にはその後、「ああ左右より上下の方が見やすいか?」と思って今は上下にしているのですが。

一つ前の連載記事にも少し書きましたが、とにかく初心者のうちほどできるときには遠慮なく繰り返し、繰り返し、また繰り返し。これしかない、と今日ふと思いました(なぜそう思ったか、何がきっかけだったかは不明)。
それで、ああ結局、努力と成果は比例するな、と。その努力はいわゆる「間違った努力」すら含んでいるかもしれないけれど、いずれにせよ「どれだけそれを強く求めるのか」に比例するんだな、みたいなことを思って。

たぶんそれはスポーツとか芸能とおんなじで、ひたすら地道な努力を積み重ねてまずベースになる体を作る、というのが結局一番の近道であり最初の一歩だと思われるので、そのための適切な練習環境やメニューを構築しとく、というのはたぶん上達を目指すうえではかなり助けになるのでは、と思います。

ようは毎回練習のたびにセッティングだけでくたびれてしまう、とかではなくて「このコード実行したらどんな顔するんだろ?」と思うたびにすぐ試して、「え、全然予想と違うけど・・(しばらく見入る)ああ、ここのせいか?ちょっと変えてみよう・・(実行)うわ違った。じゃあこれか?・・(実行)そうなんだ・・」とかってのを繰り返すのがなんか、たんに楽しいです。(唐突に終わり)