コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

「テスト書かないと怖くてプログラム書けない」がだんだんわかってきた

現在過去あまりやったことがない感じでTDDライクな開発をしているんですが、すごい不安材料の消しやすさが楽。

いままでは

  • 実装する
  • その機能を実際に動かしてみる
  • 止まったりしたらデバッグログ仕込んで直す
  • 何度か動かして解決
  • デバッグログを消す

みたいな流れが基本だったんで、大きい機能とかになると壊れている場所の把握がめっちゃ大変だったんですが、テストを書くことによって小さい粒度でテストを書くのですごい楽。なんとなくテスト書く人たちが言う「テスト書かないと怖くてプログラム書けない」ってのはこういう感覚なのかなって感じです。

お休みの日なのでたまにはこんな感じの記事も。現場からは以上です。

MySQLの出力結果を効率良くExcel(もしくはスプレッドシート)に貼るテクニック

MySQLの出力結果を非エンジニアに渡すときなどはExcelなどにはると思うのですがそういうときの話。

意外と知らない人は知らないのでメモがてら。

結論

MySQLの出力結果をテキストエディタなどに貼り付けて |\t (タブ文字)に変換する。

原理解説

Excel(もしくはスプレッドシート)は以下の性質を持っている

  • tabで区切られたものを貼り付けるとtabごとに隣接する列のセルにデータが貼り付けられる
  • 改行すると次の行に貼り付けられる

この性質があるため、列の区切りをタブに変換するとすんなり貼れる。

users テーブルの最新10件の作成日と更新日をスプレッドシートで欲しい』みたいなとき

mysql> SELECT id,created_at,updated_at FROM users order by ID DESC LIMIT 10;
+-----+---------------------+---------------------+
| id  | created_at          | updated_at          |
+-----+---------------------+---------------------+
| 233 | 2017-12-18 03:19:23 | 2017-12-18 03:19:23 |
| 232 | 2017-12-18 03:18:45 | 2017-12-18 03:19:05 |
| 231 | 2017-12-18 02:01:15 | 2017-12-18 02:01:49 |
| 230 | 2017-11-29 08:38:25 | 2017-11-29 08:42:56 |
| 229 | 2017-10-06 05:52:32 | 2018-04-24 12:37:47 |
| 228 | 2017-10-03 03:56:23 | 2017-10-03 03:58:22 |
| 227 | 2017-10-03 03:52:20 | 2017-10-03 03:52:20 |
| 226 | 2017-10-02 04:02:05 | 2017-10-03 04:04:57 |
| 225 | 2017-09-28 09:24:02 | 2017-09-28 09:24:48 |
| 224 | 2017-09-25 23:06:23 | 2017-09-25 23:09:28 |
+-----+---------------------+---------------------+
10 rows in set (0.00 sec)

こんなデータがあるとしたときに、|\t に変換する

  233     2017-12-18 03:19:23     2017-12-18 03:19:23    
     232     2017-12-18 03:18:45     2017-12-18 03:19:05    
     231     2017-12-18 02:01:15     2017-12-18 02:01:49    
     230     2017-11-29 08:38:25     2017-11-29 08:42:56    
     229     2017-10-06 05:52:32     2018-04-24 12:37:47    
     228     2017-10-03 03:56:23     2017-10-03 03:58:22    
     227     2017-10-03 03:52:20     2017-10-03 03:52:20    
     226     2017-10-02 04:02:05     2017-10-03 04:04:57    
     225     2017-09-28 09:24:02     2017-09-28 09:24:48    
     224     2017-09-25 23:06:23     2017-09-25 23:09:28    

これを貼り付けるといい感じに並んでくれる f:id:shinkufencer:20180519231757p:plain

あとは体裁を整えて完成

f:id:shinkufencer:20180519231801p:plain

RailsでTimecopを使わず現在時間をずらすRSpecを書く

実はTimecopはいらなくなったという話題の実践編

環境

rails (5.1.5)
rspec (3.7.0)

やり方

helperに追記

rails_helper.rbのお好みのところに追加

RSpec.configure do |config|
  # 中略
  config.include ActiveSupport::Testing::TimeHelpers

end

使い方

travel_to で囲む

context "現在時刻かどうかは" do
  it "こんな感じでテストをかく" do
    travel_to('2018-3-10 8:00'.to_time) do
      expect(Time.zone.now).to eq(Time.new(2018, 3, 10, 8, 0, 0))
    end
  end
end

around をつかうと、複数のitにも対応できるのでそちらも便利。

context "現在時刻かどうか確認" do
  around do |e|
    travel_to('2018-3-10 8:00'.to_time) {e.run}
  end
  it "日付が同じ" do
    expect(Time.zone.now).to eq(Time.new(2018, 3, 10, 8, 0, 0))
  end
  it "異なる日付である" do
    expect(Time.zone.now).not_to eq(Time.new(2018, 4, 10, 8, 0, 0))
  end
end

参考サイト

InteliJ系のIDEでGithub上にすでにあるものをプロジェクトとして始める

新規作成の説明はたくさんあるのに、既存を開く場合は割とググっても出てこないのでスクショを混ぜて紹介

サンプルに使ったIDE

  • RubyMine 2017.3

やりかた

Githubのアカウントを設定する

f:id:shinkufencer:20180517224612p:plain

落としてきたいリポジトリを選択する

VCS > Checkout from Version Control > Github を選択 f:id:shinkufencer:20180518091907p:plain

欲しい対象を聞かれるので選択、ディレクトリも選ぶ f:id:shinkufencer:20180517224950p:plain

バージョンコントロールするか聞かれるのでYes

f:id:shinkufencer:20180517225032p:plain

これでプロジェクトができあがるので後はお好きに。

Rubyで継承を強制するためにNotImplementedErrorを活用する

絶対継承後のクラスは実装しろ!!!いいな!!! みたいなJavaでいうところのInterfaceみたいなものを実装したいとき

やりたいこと

  • 子クラスで必ず実装させる義務が発生するメソッドを作りたい。

やりかた

  • 親クラスで引き継がせたいメソッドで NotImplementedError をraiseする

▼親クラス

class Oya
  def say
    NotImplementedError 
  end
  
  def has_a_method
    # 共通で使うメソッドはそのまま実装
    return "共通で使うメソッドだよ"
  end
end

▼子クラス

class Ko < Oya
  def say
    p "私は" + has_a_method
  end
end

参考サイト

FactoryBotでそのモデルの持つメソッドを生成後に実行する

Sorcery とか使っていると 『アクティベーションのユーザ』 みたいなオブジェクトが欲しくなるのでそういうのの書き方

環境

rails (5.1.5)
factory_bot (4.8.2)
factory_bot_rails (4.8.2)

やり方

after(:create) のコールバックを活用する

Sorceryを交えた例

factory :user do
  # なんかuserのデフォルト定義
  
  # アクティベーション済
  factory :user_with_activated do
    after(:create) do |user|
      # Userのインスタンスメソッドである activate! を実行
      user.activate!
    end
  end
end

参考サイト

docker / docker-compose build で 引数を複数渡す

やり方が全然書かれていない、いやシェル界ではよくある話なのかもしれないが…

環境

$ docker --version
Docker version 18.03.1-ce, build 9ee9f40
$ docker-compose --version
docker-compose version 1.21.1, build 5a3f1a3

コマンド

2回指定するだけ。

docker-compose build --build-arg {{引数名その1}}={{引数値その1}} --build-arg {{引数名その2}}={{引数値その2}}