done is better than perfect

自分が学んだことや、作成したプログラムの記事を書きます。すべての記載は他に定める場合を除き個人的なものです。

Go言語でコマンドラインAA表示

Go言語で予め用意しておいたAAをランダムに表示するプログラム書いてみました。

はっきり言って実用性は皆無です。text/templateを使ってみたかっただけです。

プログラムとテンプレート

// aacreator.go
package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "os"
    "path/filepath"
    "strings"
    "text/template"
)

const AARoot = "./aa"

type AATemplate struct {
    AAs []string
}

func main() {
    AAFiles, err := ioutil.ReadDir(AARoot)
    if err != nil {
        log.Fatal(err)
    }
    tpl := template.Must(template.ParseFiles("./aa.tpl"))
    aas := make([]string, 0)
    for _, AAFile := range AAFiles {
        aaBytes, err := ioutil.ReadFile(filepath.Join(AARoot, AAFile.Name()))
        if err != nil {
            log.Fatal(err)
        }
        aaString := strings.Replace(string(aaBytes), "`", "`+\"+`+\"+`", -1) 
        aas = append(aas, aaString)
    }
    aatemplate := AATemplate{aas}
    aaGoSource, err := os.OpenFile("./aa.go", os.O_WRONLY|os.O_CREATE, 0666)
    if err != nil {
        log.Fatal(err)
    }
    if err := tpl.Execute(aaGoSource, aatemplate); err != nil {
        log.Fatal(err)
    }
    fmt.Println("Success!")
}
// aa.tpl
package main

import (
    "fmt"
    "math/rand"
    "time"
)

var aas = []string{
    {{range $AA := .AAs}}
`
{{$AA}}
`,{{end}}
}

func main() {
    rand.Seed(time.Now().UnixNano())
    fmt.Println(aas[rand.Intn(len(aas))])
}

用意するもの

適当なディレクトリにaaという名のディレクトリを作成し、その直下に表示したいAAを一つ1ファイルで保存しておく。

実行

  1. aacreator.goaa.tplを先ほど用意したディレクトリに置く
  2. go run aacreator.goと打つ
  3. aa.goというプログラムができていることを確認したら、go run aa.goと打つ

実行イメージ

$ go run aa.go


     / ̄ ̄\ 
   / ._ノ  ヽ、\ 
   |  (●)(●) |   ぼくは ただ きみに 
   |  (__人__)  |   
.   |   ` ⌒´  }      
    |         } 
    ヽ      /       / ̄ ̄ ̄\  
    __ヽ    ノ__      / ─    ─ \   さよならを言う練習をする 
  /         .ヽ   /  (●)  (●)  \  
  ||        || . |    (__人__)    |    
  ||  ・    ・ ||   \    ` ⌒´    / 
  ||        ||  /            | 
  ||        || (_ )   ・    ・  || 
(⌒.l⌒ヽ     ._ノ |   l⌒ヽ        _ノ | 
  ̄|  r +`+(;;;U;;;)  )__) .  |  r +`+ (;;;U;;)   )__)        15 
  (_ノ  ̄  / /    (_ノ  ̄  / /  
        ( _)           ( _)            BEGINNING OF THE OF TOMORROW __            
  (´(     ,r―――‐-y .,--,   r----y r----, ,-----、 ,r-ァ ,r-y     ) ヽ 
  ヽ、`ヽ __ 一7 /'7  } / /  / / ̄  .//l  l´ / / 7 // /_/ / _  ,r´,r´ 
   ,/ / l (  /   ̄ <´/ /  / └‐ァ //_l  l / / '--' / _. / )ヽ ヽ ヽ、 
  / (  ) ヽ, / /'7 / / /  ./ / ̄ //~~l .l / /./ ̄// / / ./ ノ (  )  ). 
./l ヽ-、`''´ /___ー'_,ノ /__'--ァ/___'--ァ/_/  l_-'_'-'__ノ/__ノ/___'--y__ `~ ,--' lヽ 
.l ヽ_ノ   .7∠ニニニニニニ フ--y〃/ / _ _┬∠ニニニニニニニフ/  ヽ,_ノ/ 
 ヽ,__,,,,,,7∠ニニニニニニフ  /   /    / ̄∠ニニニニニニフ /,,___,ノ    
        ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 

勿論実行する度結果は変わります。適当にビルドしてPATHの通った場所にバイナリ放り込めばどこでも癒やされることでしょう。

参考


raw stringの中でバッククオートをエスケープできないのかな…