モダンプログラマまで何光年?

Webアプリ制作周辺を漂っています。はやくHackerになりたい・・・

Encode.pmのfrom_toは破壊的メソッド

 タイトルの通りですw
 $filenameに文字コード変換後の文字列が入ることを期待して↓みたいなコード書いたら$filenameに数字が入っていて、あれ〜?ってなった。

$filename = from_to( $filename, 'UTF-8', 'shiftjis' );

 CPANのドキュメント(from_to)読んでみたら、

  [$length =] from_to($octets, FROM_ENC, TO_ENC [, CHECK])

 となっている。
 from_toメソッドを呼べば、引数に与えた文字列は文字コード変換がされ、返り値には変換後の文字数が入る。
 そうかそうか、破壊的なメソッドだったか〜というそれだけのお話。まぁドキュメント嫁ってことなんですが・・・


 :蛇足
 引数そのものを変換している処理がどうやってなされているのかが気になったのでソースを見てみた。
 (Encode.pm Version: 2.48

sub from_to($$$;$) {
    my ( $string, $from, $to, $check ) = @_;
    return undef unless defined $string;
    $check ||= 0;
    my $f = find_encoding($from);
    unless ( defined $f ) {
        require Carp;
        Carp::croak("Unknown encoding '$from'");
    }
    my $t = find_encoding($to);
    unless ( defined $t ) {
        require Carp;
        Carp::croak("Unknown encoding '$to'");
    }
    my $uni = $f->decode($string);
    $_[0] = $string = $t->encode( $uni, $check );
    return undef if ( $check && length($uni) );
    return defined( $_[0] ) ? length($string) : undef;
}

 下から4行目が肝心の処理。なるほど、$_[0]をいじることで、呼び出し元の値を変更してしまっているのね。
 うーん、若干気持ち悪い挙動な気もする・・^^

Perl製WAF MENTA ファイルのアップロードでハマったら

 最近MENTAというPerl製WAFを使っていて、ちょっと躓いた点など。

 MENTAはCGIでも高速に動作することがウリのWAF。
 公式ページはここ→MENTA
 Githubのリポジトリはここ→tokuhirom/menta · GitHub

 あと、このブログの記事がよくまとまっていて、大変助かった→Perl 軽量Webフレームワーク MENTA を使ってみたよ - 八発白中

 で、これらに載っていなくてちょっとハマった点を書こうと思う。

 ファイルのアップロード

<form name="file_upload" method="post" action="<?= uri_for('upload/index') ?>" enctype="multipart/form-data">
  <fieldset>
    <legend>ファイルアップロード</legend>
    <input type="file" name="upfile" value="" required="true" /><br />
    <input type="submit" value="送信" />
  </fieldset>
</form>

 例えば↑のようなフォームを使ってアップロードしたファイルを、CGI側で受け取る処理を書く際、menta.cgi内に↓の記述を追加する必要がある。
 MENTAは内部でCGI::Simpleを利用してHTTPリクエストを処理している。
 そして$CGI::Simple::DISABLE_UPLOADSがファイルのアップロードを受け付けるかどうかのスイッチになっているが、デフォルトでは受け付ない設定らしい。

$CGI::Simple::DISABLE_UPLOADS = 0;

 と設定することで、コントローラでupload()関数が有効になる。

# アップロードされたファイルのファイルハンドルを返す
my $fh = upload('upfile');

 そして、アップロードできるファイルの容量は以下で設定できる。

# 10MBまでのファイルを受け付ける
$CGI::Simple::POST_MAX = 1024 * 1000 * 10;

 一応この記述がなくても小さな容量なら受け付けられるが、正確に何バイトまでのファイルがOKはわからない。

#!/usr/bin/perl
BEGIN {
    unshift @INC, 'lib', 'cgi-extlib-perl/extlib';
};
use MENTA;
$CGI::Simple::DISABLE_UPLOADS = 0;
$CGI::Simple::POST_MAX = 1024 * 1000 * 10;
MENTA->run_menta(do 'config.pl');

 このように記述すれば良いみたい。

 というわけでMENTAでファイルアップロードを使う際のメモでした。


 後はドキュメントに載っていた気もするけど、見落としがちな点。
 plugins/以下にプラグインファイルを書く時、関数名の頭をプラグインファイルと同じにしないと、アプリから呼び出す時にエラーになる。

# こうかけば良い
package MENTA::Plugin::Mail;
use MENTA::Plugin;
use Carp;
use Email::Send;

sub mail_send {
    my $message = shift;
    my $sender = Email::Send->new( { mailer => 'SMTP' } );
    $sender->mailer_args( [ Host => config->{smtp_host} ] );
    $sender->send($message);
}
1;

# これは呼び出すとエラー
sub send_mail {
    my $message = shift;
    my $sender = Email::Send->new( { mailer => 'SMTP' } );
    $sender->mailer_args( [ Host => config->{smtp_host} ] );
    $sender->send($message);
}

 要はプラグイン内では関数名に"package_hoge"(まずパッケージ名(小文字)、アンダースコアで区切って他の単語)という命名規則があるのですね。これも少しハマった。
 内部でのみ利用する関数はこの限りではないです。

 WAFはみんなそうかも知れないけど、MENTAも慣れればとても使いやすいフレームワークだと思う。
 rootの取れないようなレンタルサーバ環境なんかで、一からCGI組むのはだるいよねっていう時に重宝しそうです。(ちょっとドキュメントが少ないけど)

さくらVPS 設定メモ2

debianに最初からあるPerlは5.10.1とかなので、最近のPerlインストールするとこまで。
perlbrewでインストールしようとしたらテストがコケて、うまく入らず、plenvはうまくいった。
@HIROCASTERさんのブログが大変参考になりました。

$ sudo aptitude install curl
$ curl -kL http://install.perlbrew.pl | bash
$ echo 'source ~/perl5/perlbrew/etc/bashrc' >> ~/.bashrc 
$ source ~/.bashrc 

perlbrewにパスが通ればおk
$ perlbrew available
  perl-5.17.9
  perl-5.16.2
  perl-5.14.3
  perl-5.12.5
  perl-5.10.1
  perl-5.8.9
  perl-5.6.2
  perl5.005_04
  perl5.004_05
  perl5.003_07
沢山ありますね。。
Perlはバージョン数の2桁目というか小数点第2位というかが偶数の奴が安定版らしいです
よって5.16.2をインストール。


$ perlbrew install perl-5.16.2
Fetching perl 5.16.2 as /home/takumi/perl5/perlbrew/dists/perl-5.16.2.tar.bz2
tar (child): bzip2: Cannot exec: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
Failed to extract /home/takumi/perl5/perlbrew/dists/perl-5.16.2.tar.bz2 at /loader/0x256d5a8/App/perlbrew.pm line 14.

おぅ、なんかbzip2がないって怒られてます
$ sudo aptitude install bzip2 
$ perlbrew install perl-5.16.2

Installing /home/takumi/perl5/perlbrew/build/perl-5.16.2 into ~/perl5/perlbrew/perls/perl-5.16.2

This could take a while. You can run the following command on another shell to track the status:

  tail -f ~/perl5/perlbrew/build.perl-5.16.2.log

Installation process failed. To spot any issues, check

  /home/takumi/perl5/perlbrew/build.perl-5.16.2.log

If some perl tests failed and you still want install this distribution anyway,
do:

  (cd /home/takumi/perl5/perlbrew/build/perl-5.16.2; make install)

You might also want to try upgrading patchperl before trying again:

  perlbrew install-patchperl

Generally, if you need to install a perl distribution known to have minor test
failures, do one of these command to avoid seeing this message

  perlbrew --notest install perl-5.16.2
  perlbrew --force install perl-5.16.2

うーん、うまくいかんかったらしい、ログ見て原因チェックしてね、無理やりいれたければこのコマンドで〜的な

$   tail -f ~/perl5/perlbrew/build.perl-5.16.2.log

I don't see nm out there, either.
nroff is in /usr/bin/nroff.
perl is in /usr/bin/perl.
pg is in /usr/bin/pg.
test is in /usr/bin/test.
uname is in /bin/uname.
I don't see zip out there, either.
Substituting less -R for less.
I can't find make or gmake, and my life depends on it.
Go find a public domain implementation or fix your PATH setting!

うーんと、makeかgmakeが欲しいらしい

$ sudo aptitude install make

再びダメ、再度ログを見る
Use which C compiler? [cc]  
./trygcc: 67: cc: not found
Uh-oh, the C compiler 'cc' doesn't seem to be working.
./trygcc: 67: gcc: Permission denied
./checkcc: 26: cc: not found
Uh-oh, the C compiler 'cc' doesn't seem to be working.
You need to find a working C compiler.
Either (purchase and) install the C compiler supplied by your OS vendor,
or for a free C compiler try http://gcc.gnu.org/
I cannot continue any further, aborting.

ccがないのが原因か・・gcc

$ sudo aptitude install gcc

$ perlbrew install perl-5.16.2
三度トライ

今度はエラー的なメッセージは出ず
Installing /home/takumi/perl5/perlbrew/build/perl-5.16.2 into ~/perl5/perlbrew/perls/perl-5.16.2

This could take a while. You can run the following command on another shell to track the status:

  tail -f ~/perl5/perlbrew/build.perl-5.16.2.log

ログを見ながらゆっくりしていってね!(意訳)

失敗、、テストがコケてる〜?
ここで、先日@HIROCASTERさんのブログで読んだplenvというものがあることを思い出す。
そっちでいけるならそれでいいやってことで〜

$ sudo aptitude install git 
$ git clone git://github.com/tokuhirom/plenv.git ~/.plenv

.bashrcなどにパスを通す
export PATH="$HOME/.plenv/bin:$PATH"
eval "$(plenv init -)"

plenv available

perl-5.17.9
perl-5.16.2
perl-5.14.3
perl-5.12.5
perl-5.10.1
perl-5.8.9
perl-5.6.2
perl5.005_04
perl5.004_05
perl5.003_07

$ plenv install 5.16.2 -Dusethreads
スレッドモードで5.16.2をインストール

$ plenv global 5.16.2
$ perl -v
無事5.16.2環境になりました :)

$ plenv install-cpanm
cpanm導入に専用コマンドがあるらしい

$ plenv exec cpanm carton
みたいに使うらしい(ショートカット作ると楽かも

とりあえずここまで。

さくらVPS 初期設定メモ

ずっと放ったらかしてたさくらVPSをいじってみる。
Debian6.0 amd環境の設定備忘録。

とりあえずsshに鍵でログイン(パスワードは禁止)とiptablesの設定まで。

ssh周り

〜以下ローカル〜
$ ssh-keygen
$ scp id_rsa.pub name@sakura.vps:
↑末尾にコロンが必要!
$ ssh name@sakura.vps

〜以下リモート〜
$ mkdir .ssh
$ touch authorized_keys
$ cat id_rsa.pub >> .ssh/authorized_keys
$ rm id_rsa.pub

・sudoインストール

$ su
# aptitude update
# aptitude upgrade
# aptitude install sudo
# visudo
takumi ALL=(ALL) ALL
↑を追記

ssh

$ sudo vi /etc/ssh/sshd_config
Port 22222
↑適当な番号に変更
PasswordAuthentication no
↑パスワードログイン禁止
で保存

$ sudo /etc/init.d/ssh restart


iptables

$ sudo aptitude install iptables iptables-persistent

iptables初期化用のスクリプトを作る
〜ここから〜
vi iptables-init.sh
#!/bin/sh

iptables -F
iptables -X

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

iptables -A INPUT -s 10.0.0.0/8 -j DROP
iptables -A INPUT -s 172.16.0.0/12 -j DROP
iptables -A INPUT -s 192.168.0.0/16 -j DROP

iptables -A INPUT -p tcp --dport 22222 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
〜ここまで〜

実行
$ sudo sh iptables-init.sh

reboot時に再設定されるように現在の設定をセーブ(suでrootにならないとできない)
# iptables-save > /etc/iptables/rules

再起動
# /etc/init.d/iptables-persistent restart

LT祭りでした! YAPC::Asia2012に参加してきた

前回エントリから半年以上経ってる(汗

さて、去年参加して最高に楽しかったので、ぜひ来年も!と思ったYAPC::Asia、今回はボランティアスタッフ枠で参加してきました。

:前夜祭
気づいたら翌日からYAPCで慌てる、金土日だと思ったら木金土だった・・
本郷三丁目駅で降り、赤門を目印に会場に到着。ちなみにこの東大赤門って有名らしいですよくわかんないけど*1

15時~ノベルティをひたすら詰める作業、、今後こういうものもらうときは詰めた人達のことを思いながらいただこうと思いますw
そしてその後の懇親会!飲食は椿山荘(有名なレストランだそうです)の仕出しで、食べ物めっちゃおいしかったです。
主に受付付近にいて、Reject Conは残念ながらよく聞き取れなかったのですが、盛り上がっていました。そして人、人、人・・・

:1日目
LarryによるPerl6の発表、Perl5のコードをPerl6に書き換える実演をしているようだが、なにやらよくわからない、TLでPerlMongerの人達のつぶやきを見てなんとなく把握。
今回メインの発表と並行して行われたLTthonは終始面白かった!
Hachioji.pmページ内の「拍手」ボタンを押すと会場にSEが鳴るというギミック付きwww
@M_ishikawaさんの発表「おせっかい駆動開発のススメ」超おもしろかった!スタバ+Macbook=ドヤリング開発の説明に場内爆笑。
ターミナル上でGIFアニメ、flvを描画するモジュールを発表したダメ人間さんもおもしろかった!

本会場LTも、@__kanさん途中で電源切れそうで動画できないというアクシデントに見まわれつつ発表、去年も場内を沸かせた@mayumineさんの発表「Perlと人生」超おもしろい、do ~ whileでずっとたかしのターン!!!*2

懇親会、@maka2_donzokoさんから「Acme大全2012」入手。ジャケ買い余裕でしたw
f:id:takumi_aki:20121002231510j:plain

あとそれと、立ち話中「あ、TwitterID教えてください、フォロします」「XXXです」「あれ?あ、いつもお世話になってます」的な出会い?も・・ちょっとオフ会っぽくておもしろい。

:2日目
@yusukebeさんの「「新しい」を生み出すためのWebアプリ開発とその周辺
」、サービスを作るときの思考の流れやWAF等パーツの選定などなど大変参考になりました(前半エロかったけどw)。
→ベストトーク賞1位!おめでとうございます!

@maka2_donzokoさんの発表「YAPC::Asiaきたつもり同人ボードゲーム「やっぱしぃYAPC」の考案と実践」ボドゲ早く発売しないかな〜楽しみです。

LTthon:各地pmの紹介
Chiba.pmができるらしい、胸アツ!
Kokusaitenjijoumae.pm(Komike.pm)もできるらしいw胸アツ?

個人的ベストLT大賞は@moznionさんの「好き好き大好きWhitespace」
「印刷してもトナーが減らない、大事なソースが外部に流出したときも安心!」
豊崎愛生さん」「僕は」「もう…」の3単語で記述するプログラミング言語
なんだこの禍々しいオーラは・・(失礼)

そして最後にメイン会場のLT大会で幕を閉じたYAPCでした。
Perl?それPHPでできるよ」
「Pull Request数に応じてサスペンダーが伸びる!」(これも@moznionさん)
その他諸々!最高に楽しかったです!

:ボランティアスタッフが気になった方へ
作業は当日の諸雑務中心です。ノベルティの袋詰めや、各会場で発表の残り時間をはかってベルを鳴らしたりします。
(自分の見たいコマは前もって言っておくことで割りと見に行けます)
わからないことがあってもまわりのベテランスタッフに聞けるし、Perlスキルがなくても大丈夫!
長丁場ですが、スタッフ同士の交流が熱かったりするので、ぜひ来年ボランティアスタッフに応募してみるといいと思います。

:最後に写真を少し載せます*3
f:id:takumi_aki:20121002235021j:plain
なんとLarry Wallにサインしてもらえた!英語がカタコト過ぎて「this is my treasure」としか言えなかったけど嬉しかったです。

f:id:takumi_aki:20121002235035j:plain
@sasata299さん(右)と@itopoidさん(左)にもらったシール。アイコンシールは何かと便利げ、私も作りたいです。
他にもノベルティ等いろんなものをもらいました。
で・・↓

f:id:takumi_aki:20121002235040j:plain
いろいろ貼ってみましたの図。あ、UbuntuシールはYAPCとは関係ないです。

中央部にはこの後miyagawaデカールが貼られる予定ですw

そんな感じで非常に濃い3日間でした!みなさんお疲れ様でした!

*1:私の東大のイメージは「ラブひな」です

*2:まさかこんな無限ループがあるとはw

*3:(解像度悪い)ガラケしか持ってなかった私ですが、YAPC終わった次の日に秋葉原でiPhone購入してきました。1週間早く買っていればこのエントリも賑やかになったのにね・・OTL

Ruby合宿2012春に参加してきた!

4泊5日のRuby合宿に行ってきました。

楽しかったことは

  • Gitでソース管理できた
  • チーム作業楽しかった

今後の課題としては

  • もっとGitを覚えたい!

初日

Matzの講演後、合宿所に移動。
以下講演で気になった点メモ

  • バブルはじけて仕事減ってサポートしかできなくて、暇だったので作ったのがRuby
  • 気分の良いプログラミング=簡潔・万能感
  • 万能感こそがプログラミングのもてる力だし、プログラミングの素晴らしいところ。社会を変える最後の最後はソフトウェアを書ける人

アイデアも持っていれば更に強い!

  • ソフトウェアを書くことで社会を変えることができる


とりあえず初日は各自「たのしいRuby」読みながら自習ということに。
あと、ソースコードの管理どーしよ?って話が出て、(運営側でSVNは建ててくれるらしい)
いくつか選択肢はあったけどずっと使ってみたかったGitを採用
私のGithubアカウントでリポジトリを作成し、全員commitできるように・・・
これが結構大変だった!

用意された環境がWindowsだったので、「msysgit」をインストール。
GUIコマンドから鍵の生成ができるので、これを利用したわけだが、なぜか接続エラー発生。
付属の「Gitbash」というCUIアプリから普通に
$ ssh-keygen
するとうまくいきました。
これを全員の端末で作業していったんだけど、後から思えばチーム用の鍵を一組用意すればよかったですね。
(公開鍵をGithub側で登録し、秘密鍵をUSBメモリとかで共有する)

そんなこんなで初日はGitの環境を整えることに大半の時間を使っちゃったのがちょっともったいなかった感じ。
次はもっとうまくやれるかなーと。

2日目

この日は朝からRuby講習。
実質講習はこの日だけという過密スケジュール。
午前中3時間でざっくりRubyでのプログラムの書き方とオブジェクト指向について。
午後4時間でDXRubyライブラリを使ったゲームプログラミングのチュートリアルを受けました。
ほんでもってホワイトボードを前にして各自がアイデアを出しながらどんなゲーム作るかネタ出し。
だんだんと方向性が決まっていって、さらにそれを具体的にしていく。
我々5班はデスマーチで失った記憶を取り戻すために「R」「U」「B」「Y」の4文字(記憶のカケラ)を集めるシューティングゲームを作ることに決定。
(この辺のアイデア出しから方向性が決まっていく過程が一番おもしろかった!)
f:id:takumi_aki:20120223152416j:plain
講師のNaCLの方から「全員がPCに向かっていると、誰が何をやっていて、どのくらい進んでいるかがわからなくなる」
「いかにみんなで共有するかが大事」ということを教わりました。
(すごーく重要)

3日目、4日目

後はひたすらイメージをコードにしていく作業。
ホワイトボードに自分達のゲームは「何ができるか」「○○したらどうなる」といった動きを付箋として貼り、
f:id:takumi_aki:20120224083033j:plain

「Doing(やってる)」「Done(終わった)」「やらないこと(時間が余ったらやる)」に分けて管理してました。
f:id:takumi_aki:20120223152350j:plain

みんなそれぞれスキルも違うので、何をどう割り振るかも結構難しいと感じました。
もっと積極的に他の人の作業に首を突っ込んでいっても良かったかな〜と。
あと、ついつい自分の作業に閉じこもりがちなところがあるのを気をつけたいと思いました。
もっと「今こういうコード書いてて、ここで困ってるんだよね〜」みたいなこととか。

5日目

発表当日!
直前までソースコード掃除してましたw
(コメント消したり、不要なファイル消したり・・)

私達の作ったゲームはGithub上で公開しています。
Windows環境にRubyを入れて、DXRubyを入れれば動くはず〜
takumi-aki/rubycamp5 - GitHub

みんなゲームのレベルがとても高く、この短い期間でよくぞ・・
いろいろとびっくりでした。
ソースコード公開しないのかしら チラッ)|ω・`)

まとめ

相当詰め込み気味の合宿でしたが、それがかえって合宿!という感じで良かったのではないでしょうか。
スキルがバラバラの5人でひとつのものを作る上での試行錯誤やあれこれが一番の醍醐味かも。
自分のしたいことを簡潔にコードで表現できるとすごく楽しいですね。もっとRuby勉強したいなぁ・・・

一緒に参加したみんな、運営の方々、講師のNaCLの方々、ありがとうございました!

Vim初級者への道

Vimmerとまではいかないけれど、エディタはVim使ってます程度になるまでのメモ。

0. Open Vim

http://www.openvim.com/index.html
ここの"Tutorial"はなかなか良いです。
光っているキーを押すと、ブラウザ上でカーソルが動いたりして愉快。
(英語苦手で何言ってるのかいまいちわかんないけど・・)
インストール不要なので、とりあえずVimがどんなもんか触れてみるにはいいかも。

1. vimtutor

大体の環境でvimは入っていると思うので、端末を開いて

$ vimtutor

でおkです。
30分くらいのVimチュートリアルです。
最低限の操作は説明されているので、これやっておくとネットでVimに関する記事漁るときに戸惑わないですむような気がします。
Windows環境の場合はVim入れるとこからやんなきゃだめですが、いっそこの機会にLinux環境も作ってはいかがでしょうかw

1.5. NetHack

http://jnethack.sourceforge.jp/
最初はカーソルを移動するときの独特のキーバインドに戸惑うかも知れません。
「漠然と素振り続けるのつらい」という人もいるかもしれません。
そんな人には〜
f:id:takumi_aki:20120216221923p:plain
「このゲームはHJKLバインドを使用します」
というわけで、イェンダーの魔除けを探しているうちに自然とVim風バインドが覚えられるスグレモノです。
まずはゲームとかで慣れ親しむといいのかなと。(いわゆる死にゲーなので別の難があるかもですがw)

2.ブログ読む

基本がわかればネットの記事なんかも理解しやすいと思います。
私は↓ら辺の記事を読みました。

Vimのメモ - メモのメモ

文字コード変えるときどうするんだっけ?」
Rubyのコードだからタブ幅2に変えたいんだよね」
とかとか、あの操作なんだっけ?というときに見返すと幸せになれるかも・・


株式会社シャノン技術ブログ: vim で実践! コードリファクタリング

実際にリファクタリングしながらよく使うコマンドを説明していて非常にわかりやすかったです。
コマンドをざっと見てもいまいちどう使っていいのかピンと来ていなかった頃に読んで、ああ、こうするのか、と。


vimで複数行をコピペしたときにインデントがくっついてきてなんかスパイラルしてる感じになって超ウザイときは:a!または:i!でコマンドラインにペーストして&lt;Esc&gt;または . だけの行を入力してEnter押すと上手くいく - 馬鹿と天才は紙一重

タイトルのとおりですw
よくブログ記事とかコピペして、Vimで開いているファイルに貼りつけようとするのですが、インデントが階段状になって「むきいいいいいいいいい!!!!!!」ってなっているときに見つけた記事。ブクマ余裕でしたw

3. .vimrcをいじってみる

といっても何もすごいことする必要はなくて、ネットですごい人の.vimrcをコピペさせてもらうだけです。
後は自分好みにちょっとずつ変更(するために調べて)していけば、よりVimに愛着が湧くのではないでしょうか。

私が参考にしたのはこの方たちです↓

Perl Casual #02でVimについてお話しさせて頂きました - iDeaList::Writing

スライドが素晴らしいです。
初歩的なことをさらっと説明した後、.vimrcに手を加えていってますね。
Perl+notepad++で開発していた頃に読んで、F4キーからPerlチェッカ走らせて、F5キーで実行して結果を表示するバインドに感動した記憶があります。
私は多分この記事読んで、あ、Vim楽しそうだな〜と思い始めたのではないかと・・・


vimを使うべき8つの理由 - (゚∀゚)o彡 sasata299's blog

④ insertモードからnormalモードに戻るのは、Ctrl + j、改行は Ctrl + k でマッピング。あと、括弧を入力したら自動的に閉じ括弧を入力したりとか。
↑がすごく便利!ノーマルモードに戻るときにいちいちescキーまで手を伸ばさなくてもよくなります。



あと、Githubに設定ファイルを上げておくのオススメです。
UNIX系であれば)環境引っ越しても設定引き継げますし。この辺の手順はいずれまとめたいです。

一応私の.vimrcのリンクも貼っておきます。
https://github.com/takumi-aki/dotfiles/blob/master/.vimrc

まとめ

というわけで、Vimを習得するに当たって私がやってきたことや見てきた記事なんかを書いてみました。

私の場合、職場でLinuxサーバの設定をすることになって、confを書き換えるときにviを使ったのがファーストコンタクトだった気がします。
最初はえらく使いにくいエディタだなくらいに思いました。
(矢印キーで移動して、文字を削除するためにxキーを連打してたのは内緒w)
その当時はWindows環境では"notepad++"、Linuxでは"gedit"を使っていました。
しかし、Hackerな人達のブログなどを読むにつけ、段々とCUIエディタに対する憧れが募り、何度か挫折しながらようやく使えはじめているところです。

ぶっちゃけ一本道でぽんぽーんと習得できたわけでなく(そもそもまだ途上ですし)、何度も”Vim練習→挫折→距離を取る”を繰り返しました。
なので、この記事が私と同じような”Vim使いになりたいけど、最初の一歩で挫折している人”の肥しになれば幸いです。