asを打ち間違えると屋形船が走るコマンドを作ってみた


この記事は[Asakusa Framework Advent Calendar 2015](http://www.adventar.org/calendars/1166)の23日目です。

入門記事はひしだまさんが大量に書いているので、たまには全く関係ない記事を書いてみようと思います。

## YASL(Yet Another sl command) の一大ムーブメント

まずはこちらをご覧頂きたい。

「本物の golang を... 本物の Gopher を、お見せしますよ。」
http://qiita.com/mattn/items/b7889e3c036b408ae8bd

素晴らしい！！

D言語くんといいGopherといい、なんだか愛嬌があっていい。マスコットキャラクターはこうあるべき！！
ここまでリッチなものでなくとも、自分のよく使う言語・フレームワークのマスコットを動かしたくなるというのは人情というものですね。はい、ここから本編です。


## そしてAsakusaですよ

![asakusaframework](http://www.asakusafw.com/wp/wp-content/themes/asakusa/img/common/logo.gif)

なぜ屋形船...浅草なら雷門じゃないのかな...

これを動かしたら愛着湧くんだろうか。半ば義務感にかられる形で作業にとりかかることにします。
AsakusaなのでJavaで作りたかったのですが、調べるの面倒だったのでRubyで作ります。

## 完成

コマンドは、ほとんどすべての人が日常的に使うであろう(?)`as`コマンドに似せて、`asa`としました。

こちらが、実際に動作させたスクリーンショットです。

![tty.gif](https://qiita-image-store.s3.amazonaws.com/0/12495/8c1c42c1-01d6-dbbe-bbe5-4e67f62021f6.gif "tty.gif")

## ソースコード
Cursesを使っているので、 `gem install curses` してから動かしてください。

```ruby:asa.rb
#!/usr/bin/env ruby

require 'curses'
include Curses

ASAKUSA = [
'
       ------------------------------------      
      //   \\   \  \  \  \  \  \  \  \  \  \     
     //     \\   \  \  \  \  \  \  \  \  \  \    
    //-+---+-\\------------------------------\   
    |--|---|--|  ◉  ◉  ◉  ◉  ◉  ◉  ◉  ◉  ◉  |    
    |--|---|--|-----------------------------|    
    |--|---|--|▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤ |    
\\--+--+---+--+-----------------------------+\   
 \\  ○  ○  ○  ○  ○  ○  ○  ○  ○  ○  ○  ○  ○  ○ )  
  \\==========================================)  
   \\                                        /   
    \\~~~~  ~~~~   ~~~~~  ~~~~  ~~~~  ~~~~  ~~~~ 
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~',
'
       ------------------------------------      
      //   \\   \  \  \  \  \  \  \  \  \  \     
     //     \\   \  \  \  \  \  \  \  \  \  \    
    //-+---+-\\------------------------------\   
    |--|---|--|  ◌  ◌  ◌  ◌  ◌  ◌  ◌  ◌  ◌  |    
    |--|---|--|-----------------------------|    
    |--|---|--|▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤ |    
\\--+--+---+--+-----------------------------+\   
 \\  ○  ○  ○  ○  ○  ○  ○  ○  ○  ○  ○  ○  ○  ○ )  
  \\==========================================)  
   \\                                        /   
   ~~~  ~~~~  ~~~~   ~~~~~  ~~~~  ~~~~  ~~~~/ ~~~
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~']

def print_ship(n,scr,x,y)
    lines = ASAKUSA[n].split("\n")
    for i in 0...lines.size
       scr.setpos(y+i,x)
       scr.addstr(lines[i])
    end
    scr.refresh
end

init_screen
noecho
curs_set(0)
scr = stdscr
maxx = scr.maxx
maxy = scr.maxy

begin
    for x in 30..(maxx / 2) do 
        print_ship(x % 2,scr,maxx - x*2,maxy / 2)
        sleep(0.1)
        scr.clear
    end
    scr.setpos(scr.maxy - 5, 0)
    scr.addstr("Push Any Key...")
    getch                                              
ensure
    close_screen
end

```

ちなみにAsakusa FrameworkはYAESSでキックするので、asaを間違って叩くことはないのですが、ターミナル起動時に動かしたりとか、gradleでビルドをしている間に流したりとか、いろいろな楽しみ方があります! ぜひ、ご活用ください。

あとなんか愛着湧きましたw

## 使ったツールなど

* [monodraw](http://monodraw.helftone.com/) 超高機能AA作成アプリケーション。屋形船はこれなくして作れなかったでしょう。
* [ttygif](https://github.com/sugyan/ttygif) ターミナル操作からgifアニメーションを作ってくれる神コマンド。