hotoolong's blog

プログラムのことやエンジニアリングに関することを記事にしています。

誤って git reset --hard HEAD^ してしまったので取り消したい

表題通り

git reset --hard HEAD^ 

を取り消したくなったので調べてみました。

以下のreflogコマンドで実行履歴を確認できます。

git reflog -n 5

戻したい場所を確認して、以下のコマンドで指定します。

HEAD@{1}に戻す場合は以下の通り

 git reset --hard "HEAD@{1}"

git reset --soft HEAD^ で良かったものを--hardしてしまってローカルから消えてしまったのでかなり焦ってしまいました。 気をつけないと。

qiita.com

qiita.com

今更ながら「20年目のRubyの真実」を読んだ

2015年の話なんですね。 ちょっと長いですが楽しく読めました。 個人的に以下が面白かったです。

  • 驚き最小の法則が逆にめんどくさい
  • 次の言語来てほしいけど誰も載ってこない
  • RailsRubygemsなどのコミュニティが果たす影響はすごく大きい
  • プロモーションが大事
  • 「あなたは10年前に、Rubyの開発に参加してなかったから発言権はありませんって言われたら、それはフェアじゃないよね。そういうのは嫌なのよね。僕がそう言われたくないからだけど」という感性
  • ここまで未来になってもメモリがボトルネックになっている

興味のある方は読んでみて下さい。

情報処理2015年12月号特集記事「20年目のRubyの真実」インタビュー-情報処理学会

CIでbundle install するときには --clean をつけると無駄にキャッシュされない

タイトルどおりなのですが、 目からウロコだったので、メモとして残しておきます。

Circle CI 2.0 でstore_cache、 restore_cache を使って、Bundler の gem をキャッシュしていたので、 とても参考になります。

ローカル環境でも --clean を付けてもいいのかもしれないですが、 ブランチの切り替え時に毎回インストールしないといけなかったりが多発するようであれば 時々claenしてあげるのがいいのではないでしょうか。

blog.yuyat.jp

MySQLのgroup_concatをつかって複数の項目を1行に並べる

1対多のテーブル構成を多になっているテーブルの情報をgroup_concatを使って表示したくなるケースがあったのですが、 単純に1カラムのデータだけを表示する場合はそのまま使えばいいのですが、 複数を一気に選択することができず、副問合せして取得しました。

usersテーブル、user_optionsテーブルがあるとして 普通にgroup_concatを使ってオプションの名前を登録順に取得するケースは以下になります。

select
 users.id,
 group_concat(distinct user_options.name order by user_options.created_at separator ', ')
from
 users
left outer join user_options on user_options.user_id = users.id

これに対してuser_optionsの複数の項目(nameと登録日)を追加したい場合は joinしてるテーブルを副問合せしてしまって以下のようにしました。

select
 users.id,
 group_concat(distinct user_options.name_created_at order by user_options.created_at separator ', ')
from
 users
left outer join (
  select
   id,
   concat(id, '(', date_format(convert_tz(created_at, '+0:00','+9:00'), '%Y-%m-%d'), ')') as name_created_at,
   created_at
  from
   user_options
)
user_options on user_options.user_id = users.id

このようにすることで,区切りで名称(登録日)の情報が1行で表示されるようになります。 力技なのであまり参考にならないかもしれないですが、表示させるのに困ったときには使ってみて下さい。

Capybaraでselect時に同じ名称のvalueがありエラーになってしまう

RSpecでCapybaraのテストをしてたのですが、

select '東京都', from: '都道府県'

と記載している箇所で

Capybara::Ambiguous:
   Ambiguous match, found 2 elements matching visible option "東京都" within #<Capybara::Node::Element tag="select" path="/html/body/div/div/div[3]/div[2]/div/div/form/div[8]/select">

のようなエラーが出てしまいました。

FactoryBotの記載方法が悪かったようで、同じ東京都が2つできてしまったのですが、 改善方法としてはいくつかあります。

1点目としては
特に同じ名称でどちらも使っても問題ない場合

select '東京都', from: '都道府県', match: :first

とspecを修正することで免れることができます。 これはシンプルですね。

2点目としては FactoryBotで同じ名称を作りたく無いケース

FactoryBot.define do
    factory :prefecture do
      id 13
      sequence(:name) { |n| "東京都-#{n}" }

とsequenceを利用するとnにインクリメントされた数値が代入されまwす。 このように記載すると上手く行きますね。

本質的な問題として rails_spec.rb に固定させるデータを beforeで作ってしまうというのもいいのかもしれませんが、 今回はそれ以外の対処方法を考えてみました。

imagemagickのエラーでRSpecが落ちる

RSpecに画像アップロードのテストが含まれているのですが、 軒並みバリデーションエラーになってました。

        ActiveRecord::RecordInvalid: バリデーションに失敗しました。 プロフィール画像MiniMagickがファイルを処理できませんでした。画像を確認してください。エラメッセー...279.
        identify: no decode delegate for this image format `JPEG' @ error/constitute.c/ReadImage/509.

あまり見に覚えがなかったのですが、最近brewで痛い目に合ってるので、Updated Formulaeの巻き添えを食ったのかとおもい

brew upgrade imagemagick

しておきました。

brew info imagemagick
imagemagick: stable 7.0.7-28 (bottled), HEAD
Tools and libraries to manipulate images in many formats
https://www.imagemagick.org/
/usr/local/Cellar/imagemagick/7.0.5-4 (1,522 files, 22.6MB)
  Poured from bottle on 2017-04-03 at 12:58:14
/usr/local/Cellar/imagemagick/7.0.7-28 (1,526 files, 23.2MB) *
  Poured from bottle on 2018-03-30 at 20:43:27
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/imagemagick.rb

再度 spec を実行するとうまくいきました。怖いですね。。