rubyで世界のナベアツさんのネタを実装してテストを書く

qiitaにも書いたのですが、どちらのほうがよく見てもらえるか試したくて、全く同じ内容をブログにも書いときます。

rubyで世界のナベアツさんのネタを実装してテストを書く - Qiita

PHPで世界のナベアツさんのネタを実装する - Qiita

qiitaには書かなかった感想

  • 仕事でPHPばかり書いているとrubyのifに()をつけたりして、慣れなくて戸惑う。
  • 少し書いてたらruby書きやすくてとてもいいなとなる。
  • PHPで書いてみたら記述量がやっぱり多いなと感じた。

なぜやろうと思ったか

  • rspec単体テストを書いてみたかった
  • 単純なプログラムがよかった
  • 世界のナベアツさんのネタがシンプルかつ無駄がなく面白いから
  • 思いついたから
  • やりたかったから

仕様

  • 最初に「これから面白いことつまりオモローなことをします」という
  • 1から40まで数を数える
  • 3がつく数字のときアホになる
  • 3の倍数のときアホになる
  • 5の倍数のとき犬になる(3と5の倍数なら犬になる)
  • 最後に「オモロー」という

まず、実装

TSUJO_KAO_MOJI = "( ・`ω・´)" # 通常
AHO_KAO_MOJI = "ʅ( ՞ਊ՞)ʃ≡" # アホのつもり
DOG_KAO_MOJI = "∪・ω・∪" # イッヌのつもり

puts 'これから面白いことつまりオモローなことをします'

(1..40).each do |figure|
  sleep 0.5
  
  if figure % 5 == 0
    puts figure.to_s + DOG_KAO_MOJI
    next
  end

  if figure % 3 == 0
    puts figure.to_s + AHO_KAO_MOJI
    next
  end

  if /3/ =~ figure.to_s
    puts figure.to_s + AHO_KAO_MOJI
    next
  end
  
  puts figure.to_s + TSUJO_KAO_MOJI
end

puts 'オモロー'

ruby omoro.rbで実行

1( ・`ω・´)
2( ・`ω・´)
3ʅ( ՞ਊ՞)ʃ≡
4( ・`ω・´)
5∪・ω・∪
6ʅ( ՞ਊ՞)ʃ≡
7( ・`ω・´)
8( ・`ω・´)
9ʅ( ՞ਊ՞)ʃ≡
10∪・ω・∪
11( ・`ω・´)
12ʅ( ՞ਊ՞)ʃ≡
13ʅ( ՞ਊ՞)ʃ≡
14( ・`ω・´)
15∪・ω・∪
16( ・`ω・´)
17( ・`ω・´)
18ʅ( ՞ਊ՞)ʃ≡
19( ・`ω・´)
20∪・ω・∪
21ʅ( ՞ਊ՞)ʃ≡
22( ・`ω・´)
23ʅ( ՞ਊ՞)ʃ≡
24ʅ( ՞ਊ՞)ʃ≡
25∪・ω・∪
26( ・`ω・´)
27ʅ( ՞ਊ՞)ʃ≡
28( ・`ω・´)
29( ・`ω・´)
30∪・ω・∪
31ʅ( ՞ਊ՞)ʃ≡
32ʅ( ՞ਊ՞)ʃ≡
33ʅ( ՞ਊ՞)ʃ≡
34ʅ( ՞ਊ՞)ʃ≡
35∪・ω・∪
36ʅ( ՞ਊ՞)ʃ≡
37ʅ( ՞ਊ՞)ʃ≡
38ʅ( ՞ਊ՞)ʃ≡
39ʅ( ՞ਊ՞)ʃ≡
40∪・ω・∪
オモロー

できた。 ただこれだとメソッドがなく全部の処理が一緒で単体テストが書けない。 メソッドを責務ごとに分けた。

class Omoro
  TSUKAMI = "これから面白いことつまりオモローなことをします"
  OCHI = "オモロー"
  TSUJO_KAO_MOJI = "( ・`ω・´)"
  AHO_KAO_MOJI = "ʅ( ՞ਊ՞)ʃ≡"
  DOG_KAO_MOJI = "∪・ω・∪"
  
  # ネタ
  def main(max_kazu = 40)
    speak(TSUKAMI)
    
    (1..max_kazu).each do |figure|
      sleep 1
      kao_moji = verification(figure)
      serif = make_serif(figure, kao_moji)
      speak(serif)
    end
    
    speak(OCHI)
  end
  
  # セリフを作る
  def make_serif(figure, kao_moji)
    figure.to_s + kao_moji
  end
  
  # 判断する
  def verification(figure)
    if figure % 5 == 0
      return DOG_KAO_MOJI
    end
    
    if figure % 3 == 0 || /3/ =~ figure.to_s
      return AHO_KAO_MOJI
    end
    TSUJO_KAO_MOJI
  end
  
  # 話す
  def speak(serif)
    puts serif
  end
end
  
omoro = Omoro.new
omoro.main(40)

オモロークラスができました。 余談ですが、mainメソッドに任意の数を渡すことで数えるマックスの数字を動的に変えられます。 400と入れると300-399までアホか犬になります。 人力だと大変ですが、プログラムで書くと簡単です。

テストを書きます。 勉強中です。 letがよくわからないので使っていません。 もし、優しいマサカリをお持ちの方は、コメントでexampleを書いてください。

require 'rspec'
require_relative '../omoro_class'

RSpec.describe Omoro do
    TSUJO_KAO_MOJI = "( ・`ω・´)"
    AHO_KAO_MOJI = "ʅ( ՞ਊ՞)ʃ≡"
    DOG_KAO_MOJI = "∪・ω・∪"

  it '数字(1)+顔文字(( ・`ω・´))のセリフを生成すること' do
    expect(Omoro.new.make_serif(1, TSUJO_KAO_MOJI)).to eq '1( ・`ω・´)'
  end

  it '数字(3)+顔文字(3ʅ( ՞ਊ՞)ʃ≡)のセリフを生成すること' do
    expect(Omoro.new.make_serif(3, AHO_KAO_MOJI)).to eq '3ʅ( ՞ਊ՞)ʃ≡'
  end

  it 'イッヌ' do
    expect(Omoro.new.make_serif(5, DOG_KAO_MOJI)).to eq '5∪・ω・∪'
  end

  it '3がつく' do
    expect(Omoro.new.make_serif(33, 'ʅ( ՞ਊ՞)ʃ≡')).to eq '33ʅ( ՞ਊ՞)ʃ≡'
  end

  it 'verification' do
    omoro = Omoro.new
    (1..40).each do |figure|
      if figure % 5 == 0
        expect(omoro.verification(figure)).to eq DOG_KAO_MOJI
      elsif figure % 3 == 0 || /3/ =~ figure.to_s
        expect(omoro.verification(figure)).to eq AHO_KAO_MOJI
      else
        expect(omoro.verification(figure)).to eq TSUJO_KAO_MOJI
      end
    end
  end

  it 'main' do
    omoro = Omoro.new
    expect { omoro.main(5) }.to output(
      "これから面白いことつまりオモローなことをします\n1( ・`ω・´)\n2( ・`ω・´)\n3ʅ( ՞ਊ՞)ʃ≡\n4( ・`ω・´)\n5∪・ω・∪\nオモロー\n").to_stdout
  end
end

個人的にverificationメソッドとmainメソッドは改良できそうな気がしますが、やり方がわかりませんでした。

参考文献

桂三度 - Wikipedia

[Ruby] Rspecで始めるユニットテスト(単体テスト) | qs Developers

Rspecで標準出力をテストする - Qiita

これを書いたあとPHPでも書きたくなりやってみました。 テストは書いてません。 実行したらrubyでやったものと同じように出力できたのでよしとします。

<?php
class Omoro
{
  const TSUKAMI = "これから面白いことつまりオモローなことをします";
  const OCHI = "オモロー";
  const TSUJO_KAO_MOJI = "( ・`ω・´)";
  const AHO_KAO_MOJI = "ʅ( ՞ਊ՞)ʃ≡";
  const DOG_KAO_MOJI = "∪・ω・∪";

  // ネタ
  public function main($max_kazu = 40)
  {
    $this->speak(self::TSUKAMI);

    for ($figure = 1; $figure <= $max_kazu; $figure++) {
      sleep(1);
      $kao_moji = $this->verification($figure);
      $serif = $this->make_serif($figure, $kao_moji);
      $this->speak($serif);
    }

    $this->speak(self::OCHI);
  }

  // セリフを作る
  public function make_serif($figure, $kao_moji)
  {
    return $figure . $kao_moji;
  }

  // 判断する
  private function verification($figure)
  {
    if ($figure % 5 == 0) {
      return self::DOG_KAO_MOJI;
    }

    if ($figure % 3 == 0 || strpos($figure, '3') !== false) {
      return self::AHO_KAO_MOJI;
    }

    return self::TSUJO_KAO_MOJI;
  }

  // 話す
  private function speak($serif)
  {
    echo $serif . "\n";
  }
}

$omoro = new Omoro();
$omoro->main(40);

AWSとCirclCIにようやく触る

最近、AWSとCirclCIにようやく触ることができました。 こちらの本を参考にさせてもらってやりました。

www.shuwasystem.co.jp

これまでAWSの本を何冊か読んでいたのですが、アカウント作って1年間だけ無料ということで、いつやろうかと思って、まとまった時間があったらやろうとずっと放置していました。

まとまった時間ができたので触ってみました。

AWS

Railsのアプリをデプロイしました。 ツールは使わず、SSHで入って、各種ソフトをインストールして、githubからソースをpullしてデプロイしました。 やることたくさんあるのでデプロイツールを使うといいなと思いました。

nginxやunicornのconfなどほぼ書いたことなかったので苦戦しました。

CircleCI

自動テストをやってみました。 circleci/config.ymlの書き方が難しくていろいろ見てやりました。 ずっとテストが失敗して、テストの時に使うDBの設定が漏れているだけでした。

感想

一回やるとなんとなく全体像が見えたので、これからはネットで関連する記事を見つけても興味を持って見れると思います。

転職先として、自動テスト・自動デプロイ・AWSなどを使っているところがいいなを思っていたのですが、自分でもがんばればできそうな気がするので、転職してから自分で自動化などやっていければいいんじゃないかと思いました。

ObjectOrientedConferenceに行ってきました

ooc.dev

概念投影によるオブジェクト指向設計の考え方とその方法 by hirodragon | トーク | Object-Oriented Conference #ooc_2020 - fortee.jp

お話がとても聞きやすく引き込まれました。 家事をしながら、youtubeでの過去の勉強会も拝聴しています。 2時間くらい聞きたいぐらいの内容でした。



オブジェクト指向プログラミングの現在・過去・未来 by 増田 亨 | トーク | Object-Oriented Conference #ooc_2020 - fortee.jp

型の重要性をとても認識しました。 長年やられていらっしゃる方の知見を聴けるのはとても贅沢な体験でした。

設計の大切さ

設計のお話が多いので、自分の中で考え方に影響が出るくらい大切さを認識しました。

視野の広がり

今までコードを書いてるだけでしたが、設計領域もやっていこうと思うきっかけになりました。

スタッフさんありがとう

雨の中大変なコンディションでしたが、とても快適に楽しめました。 ありがとうございます。

影で支えてくれたスタッフ

公式ページ下部にスタッフの方々のアイコンがありますが、こちらに出ていらっしゃらない方もいて、意図してなのかわかりませんが、スタッフやってもめだつことなく裏方に徹していただいた方もいらっしゃって素敵なことだなと思いました。

某勉強会の方々が中心となってスタートしたと思ったので、陰ながら支えていらっしゃったんだろうなと勝手に思っておりました。

以上、レポートでした。

PHPerKaigi 2020に行ってきました

phperkaigi.jp

ぼっちからはじめるレガシーカルチャー改善ガイド 〜はじめの一歩編〜

心に残った言葉。

「すきなハンバーグがさわやかのハンバーグです」

「おまえ初めの一歩なにしたんですか?」

「自己研鑽をすること」

「信頼貯金を貯めること」

「世間とのdiffをとる」

「まず目の前のタスクをやりとげる」

「一人目の改善仲間をみつける」

とても、エモい話です。 会場の前のほうにコアのファンの方がいてとてもよい雰囲気でした。

fortee.jp

PHPの現場 公開収録

僕は、家から最寄り駅までとても遠くバスで通っているのですが、たまに歩く時があり、そんなときにいつもphpgenbaを聞きながら歩いています。

いつも音声だけなのですが、パーソナリティの方の表情とか想像するしかないのですが、公開収録で前列付近なので、表情が見れてとてもよかったとなと思います。

php-genba.shin1x1.com

トレーディングカード

交換するのが楽しくて、たくさん交換させていただきました。 お話中に、待ちきれなくて、少し割り込んでしまったりしたので、少し反省しています。

話しかけるきっかけになりとてもよかったです。

初対面のときに話しかけるのも大変ですが、2回目も話題が大変なのでその点でもよかったなと思います。

スタッフの方々

去年当日1日だけスタッフをさせていただいたのですが、大半の方が前回と同じメンバーだったので、すごく安心しました。 すごく楽しい時間を過ごせました。 ありがとうございました。

以上、短いですが、レポートでした。

Railsの実務経験を積み出した結果

ポエム的なものです。

10月からRailsの実務経験を積み出した結果です。

目的

  • RailsRubyが好きなので、仕事で使いたかった(LaravelとPHPも好きです)
  • 自社サービスの会社さんへ転職したかった

結果1

  • Rubyの公式ドキュメントの読み方や、Railsの公式の読み方が分かりました
  • RailsRubyも手に馴染み、自走できるようなりました

結果2

  • 来月からの常駐先はいろいろあってPHPになりました
  • 転職先はまだ決まってません

感想

正直、経験年数に差はありますが、PHP3年でもRuby3ヶ月でも僕のアウトプットはそんなに変わらないと思っています。
ただ、SESなので年数しか見られませんね(泣) 面談がなかなか組まれず、時間がなくなってきてPHP案件になりました。

laravelを久しぶりに触るとRailsだとすぐにできたことができず、元に戻すには時間がかかりそうです。

ただ、Rubyを触って、PHPの良いところもより見えてきたし、よい経験だったと思いたいです。

Laravelをやっていたころは、当たり前だと思っていて疑問に思わなかったことがいったん、Rails触ったら疑問に思うようなことが出てきました。
PHPは最初に学んだ言語なので、深く考えず組めるのですが、Rubyを勉強することで無意識だったものが意識的になったりするようなことがおきました。

見方が変わったかんじですね。

蛇足

rspecは難しかったです。 実務ではやる機会がなかったですが、家では触っていてました。

10月度進捗

10月はまだ残りの日付がありますが、おそらく忙しくて振り返る時間なさそうなのでこのタイミングで振り返っておきます。

転職活動

9月から今日(2019/10/19)までで5社カジュアル面談や一次面接をやらせてもらっているのですが、転職活動としては停滞気味です。 現場が変わり忙しくなってきたというのが主な原因です。

自社サービス志望について

カジュアル面談をたくさん受けてみて、自社サービスの会社さんに対する印象も変わってきました。

自分が成長できて、働きやすいところであれば自社サービスであるとか受託であるとかはどちらでもいいと思ってきました。

ただ、SESは僕は個人的には距離をおいていきたいという感じです。

Railsの実務経験を積み出しました

10月から新しい現場でRailsのキャッチアップが結構大変です。 Railsの経験が豊富にある方が現場にいるわけではなくて自分で調べながらやっています。

学習について

先週と今週は、rspecというphpunit的なものを家でほんの少しだけ触っています。

laravelのときも思っていたのですが、テストコードを1からオリジナルに書くときにどうしたらいいかぐぐってもベストが分からない感じです。

YYPHP最終回参加レポート

yyphp.connpass.com

日付がたってしまいましたが、YYPHP最終回に参加してきました。

仕事帰りに行ったので途中から参加しました。 僕は、最終回なのでPHPに関するエモい話が聞きたいなということで次のものを雑談したいなと思いました。

  • PHPとの馴れ初めを聞きたい

僕はこのコミュニティーがとても好きです。 雑談でとても話しやすい雰囲気です。

suinさんが書かれた内容のまとめのqiitaはこちらです。

qiita.com

YYPHPは、日本におけるPHPユーザーを増やしたと思うし、またPHPのを好きにさせてくれたコミュニティーだと思います。

僕は、PHPは研修時、やって現場でずっと使っていてビジネス上の付き合いだったのですが、YYPHPに参加してPHPの奥深さと設計の概念についてすっかりPHPのファンになってしまいました。

ビジネスだけでなく趣味でも好きになった感じです。

$やセミコロンめんどいというのは思いますが、それを差し引いても好きな言語ですね。

今回は、最終回だったのですが、僕が初めて参加した回はどうだったかというとこの回でした。

参加メンバーが僕の中では豪華です。 のちに何度もご一緒する方もいらっしゃいました。

はじめは、suinさんと湊川さん以外存じ上げていないかんじでした。

suinさんにはqiitaを見ていて存じてました。

湊川さんは、gitの本で存じてました。

yyphp.connpass.com

主催されていらっしゃるクラフトマンソフトウェアの方々にはとても感謝してます。

ぬーぺっとさんの優しいホスピタリティあふれる司会進行。 話の流れ的にちょっとつらい展開があったりするときに何回も助けていただいた気がします。

suinさんの面白い返しやコメントが印象的です。 ライブコーディングのスピードもすごいです。

reoringさんの本質を的確にいうアドバイス、オールジャンルなんでも答えていらっしゃってすごいなと思います。

印象的なだった言葉は、

reoring「一行でも読みたいところがあったら本を買う」や suin「qiitaは一行でも書く」、「(phpstorm立ち上げ時)まだphpstormが温まっていない」です。

記憶だけなので違ってたらすみません。

最終回という告知があっとき、寂しさも感じましたが、「毎週これをやってくれていただけですごくありがたいことだし、すごいことだし、今までありがとうという気持ち」でした。

エンジニアを続けていれば、またどこかで会えるだろうと思っていましたが、なんと次のコミュニティとして

yyts.connpass.com

が、始まっています。 僕は、TypeScriptは書いたこともなく、仕事でも使ってはいないのですが、概念に触れるだけ、本を一冊読むだけでもいいからやりたいなと思っています。

JSで、型を勘違いして、ハマった経験が何度もあるのでその辺が解消できるならいいなと思います。

過去記事 yoshinyan99.hatenablog.com