brew doectorして知ったんですが、Mac OS Xデフォってcase-insensitiveだったんですね・・・。どうもAdobeとかSteamのゲームとかインストール時に文句言われるなあとかおもってたんですが・・・。

formatするときにcase-sensitiveにするかcase-insensitiveにするか聞かれたら前者選んじゃうのが人情ってもんじゃないですかあ。

% brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry and just ignore them. Thanks!

Warning: The filesystem on / appears to be case-sensitive.
The default OS X filesystem is case-insensitive. Please report any apparent problems.

じゃけん再クリーンインストールしましょうねぇ〜・・・

例えばコメント投稿のテスト。

# test/integration/post_comment_to_comic_test.rb:
require 'test_helper'

class PostCommentToComicTest < ActionDispatch::IntegrationTest
  test 'Post a comment' do
    visit comic_path comics(:comic)
    within('#new_comment') do
      fill_in 'comment[body]', with: 'コメントのテスト'
    end
    click_button '規約に同意してコメントする'
    assert has_selector? '.content-comment__body-text',
      text: 'コメントのテスト'
  end
end

よくあるこういうのを実行したら下記のエラーが。

% ruby -Itest test/integration/post_comment_to_comic_test.rb -n PostCommentToComicTest#test_Post_a_comment
Run options: -n PostCommentToComicTest#test_Post_a_comment --seed 29141

# Running:

E

Finished in 5.497046s, 0.1819 runs/s, 0.0000 assertions/s.

  1) Error:
PostCommentToComicTest#test_Post_a_comment:
Capybara::Webkit::ClickFailed: Failed to click element /html/body/div[@id='content']/div[@id='comments']/div/div[1]/form[@id='new_comment']/div[@id='comment_action']/input because of overlapping element /html/body/div[@id='content']/nav/div/ul/li[2]/a/span at position 831, 1025; 
A screenshot of the page at the time of the failure has been written to /var/folders/nb/5jp6psyd7h19my68chb0svvh0000gn/T/click_failed_W60479.png
    test/integration/post_comment_to_comic_test.rb:23:in `block in '

1 runs, 0 assertions, 0 failures, 1 errors, 0 skips

クリックできなかったElementのxpathを表示してくれる。そして何故クリックできなかったのか、overlapしているElementのpositionとxpathも表示してくれる。更にscreenshotここに撮っておいたからってどこまで至れり尽くせりだよ。

この場合、要はこんな感じになっててコメントボタンがクリックできない。

こんな方法でいいのかどうかわかりませんが、テスト前にexecute_scriptでoverlapしてるメニューをhideして対処。

# test/integration/post_comment_to_comic_test.rb:
require 'test_helper'

class PostCommentToComicTest < ActionDispatch::IntegrationTest
  test 'Post a comment' do
    visit comic_path comics(:comic)
    execute_script("$('nav.other-pages-nav').hide()") # It's workaround.
    within('#new_comment') do
      fill_in 'comment[body]', with: 'コメントのテスト'
    end
    click_button '規約に同意してコメントする'
    assert has_selector? '.content-comment__body-text',
      text: 'コメントのテスト'
  end
end

更に背景と同色の文字問題とかもサポートしてくれたら手動QA不要とはいわないけどもっと自動テスト化できますね。

ツバから採取したDNAから病気の発症リスクなどを教えてくれるMYCODEを(会社の経費で)使ってみました。

MYCODE(マイコード) | これから先の健康のために自宅でできる遺伝子検査を

日本人平均と比べてかかりやすい病気とその対策を教えてくれます。

僕が申し込んだのはオールインワン280+ってやつです。280項目と言われてもそんなに見きれませんが。

Webサイトから購入するとこういう昔のAdobeのパッケージみたいなので検査キットが届きます。

DNAを採取するのにツバってのは確かに便利かもなあという感じ。

「唾液を出しやすくするために、ご覧ください。」

と、こういうカードが入ってるのが面白い。

郵送で送り返してからWebサイトで結果が見れるようになるまで二週間ぐらいかかった気がします。

その間に体や生活習慣に関するアンケートが大量にあって、その回答も結果に影響してくるようです。

こういう非IT系のITサービス(?)のWebサイトはクッソ使い辛いのが常ですが、大量のアンケートもサクサク答えられるような使いやすいUIになってるのはさすがDeNAという感じ。

検査結果

検査結果が出たとのメールが来てアクセスしてみると個人情報についての注意書きが。

DNAは親兄弟・子供の情報も含むことになるので個人情報を超えた一族情報とでも言うべきものなのでクッソ注意しろとのこと。自己責任どころじゃ済まない情報の扱いにちとビビる。

日本人平均と比べて一番なりやすいのが円形脱毛症だってさ!

注視したいのは日本人平均に比べてかかりやすい病気と予防法。僕の場合は極端に倍率の高い深刻な病気はなかったので一安心ですが、他の人の見せてもらったら全然違ったので寿命に関わる場合もあるんじゃないでしょうか。

感想としては、僕の場合、アンケート結果が「うつ病」って感じなので、アドバイスが「時々ハイキングに行け」とかなのはDNAっぽくなくて残念。

また、現時点で予防法が無いものが多いので「って言われてもな・・・」となることが多い点。

あとは、日本人平均1倍だとしてももっと注意すべき危険な病気(いろんな癌とか)がたくさんあるので、そっちが知りたいなとかです。

サービスへの感想

郵送されてきたものにツバ入れて返すだけなので苦痛とかゼロですし人間ドックや健康診断と違って会社を半休したりしなくて済むのが働いてる人的には嬉しいです。

統計とったらちゃんと病気にかかる確率が減ってるんじゃないでしょうか。それで病気が減るなら検査にかかるサービス提供側の手間も少なそうだし、保険が効けば更にみんな使って国の医療費も減るんじゃないの?やっちゃいなよ!って感じでした。

医者の代わりにはならないですが、とにかく手間が無いのがありがたいです。こういう試みはどんどん進んでいって欲しいです。

sass-railsの5.0から、foo.css.sassfoo.sassに変えよというWARNINGが出るようになってました。(エラーが出たらとりあえずGoogle検索欄に放り込む人=俺用のエントリータイトル)
DEPRECATION WARNING: Extra .css in SASS file is unnecessary. Rename /Users/komagata/code/kowabana/app/assets/stylesheets/blocks/footer/_footer-pages-nav.css.sass to /Users/komagata/code/kowabana/app/assets/stylesheets/blocks/footer/_footer-pages-nav.sass
...
...
...

デザイナーの作業とコンフリクトする予感!

% ls app/assets/stylesheets/**/*.css.sass | wc -l
     107

すげーたくさんあってやんなりますよぉ~

% zmv app/assets/stylesheets/**/*.css.sass app/assets/stylesheets/**/*.sass
% zmv app/assets/stylesheets/*.css.sass app/assets/stylesheets/*.sass
% git add 'app/assets/stylesheets/**/*.sass'
% git add 'app/assets/stylesheets/*.sass'
% git rm 'app/assets/stylesheets/**/*.css.sass'
% git rm 'app/assets/stylesheets/*.css.sass'

zmv使うとちょっと楽。

参照:zsh の zmv を使って簡単に複数ファイルを一括リネームする - mollifier delta blog

こちらの記事の解決編です。

ActiveRecord::RecordNotFoundのエラーは放置すべきか? - komagata

@hiroshi3110さんからズバリな答えをいただきました。

怖話で実装

# lib/record_not_found_by_trustless_param.rb:
class RecordNotFoundByTrustlessParam < StandardError; end
# app/controllers/comics_controller.rb:
class ComicsController < ApplicationController
  before_action :set_comic, only: :show
  
  def show
  end

  private
  def set_comic
    unless @comic = Comic.find_by(id: params[:id])
      raise RecordNotFoundByTrustlessParam                                                                                                                                                                  
    end
  end
end
# app/controllers/application_controller.rb:
class ApplicationController < ActionController::Base
  rescue_from RecordNotFoundByTrustlessParam, with: :not_found
  
  private
  def not_found
    render file: "#{Rails.root}/public/404.html", layout: false, status: 404
  end
end

@hiroshi3110さんの言うとおり、信頼出来ない外部からのidを元にしたfindで見つからない場合はRecordNotFoundByTrustlessParamにし、rescue_fromで拾って404を出すようにしました。(404を動的テンプレートで出すのは良くないと思うのでpublic以下の静的ファイルを読む)

自分の中のベストプラクティスにしようと思いました。

Rollbarとかのエラー管理サービス使ってるとActiveRecord::RecordNotFound がWARNINGレベルのエラーでたくさん残るので気になる。

idに適当な数字入れれば必ず出るんだから。rollbarの無料プランは月のエラー数に上限があるのでもったいない。

しかし、特定の存在しないidが何度もアクセスされるのは問題の兆候だったりするから完全にmuteするのも気が引ける。皆さんどうしてるんでしょう?

追記:

ActiveRecord::RecordNotFoundエラーを防ぐ - komagata

wootheeを見習って他reposからgit submoduleしやすいように祝日データをrubyからyamlにしました。(organization化と言語非依存にrepos化はちょっとしたholiday_jpのようなライブラリではやり過ぎかなと思ってやってません。submodule使えば祝日データの一元管理という要は足りるしね。)

komagata/holiday_jp

僕がgemを作る時ってすごく画期的なアイデアが見つかったとかあんまりないので、ほとんどが仕事上で必要だけど既存のgemが存在しない=日本語やi18n関係ばっかりになっちゃうんですよね。

昔に使ったので我ながら設計が変ですが、テストが合ったのでテストに変更が無いように実装を変えただけです。あとはテストにshoulda-contextとか今日び使わないのでtest-unit3に変えたぐらい。

最近gem作る時ちょっと便利だなと思うのはgemspecとか自動生成系ファイルをコーディング規約に合わせるために手作業しなくても$ rubocop -aでほとんどいけちゃうところ。

弊社ではGithub IssuesのWrapperであるHuboardをタスク管理に使っているんですが、ちょっと便利な機能が増えました。

それは複数のreposのissueを一つのカンバンに出せる機能です。

何が嬉しいのかというと、弊社サービス怖話で言えばgithubのreposは

  • fjordllc/kowabana
  • fjordllc/kowabana-ios
  • fjordllc/kowabana-android

というようにweb, ios, androidに分かれてるのですが、それぞれ専属の人がいるわけじゃないのでまとめて見れたほうが都合がいいのです。(そもそもwebviewメインなのでios, androidの方はそんなにissueがない)

(Workingにある「怖話1.5をリリース」ってのはkowabana-iosのissue)

ちょいと高価いですがいい感じの代替サービスが見つかるまでは使い続けそうです。

gemとか作る時の普段使いのtestライブラリ(ファッション誌風)をminitestからtest-unit3にしてみた。

kowabana-parser/test_kowabana_parser.rb at master · fjordllc/kowabana-parser

test runnerの読み込みが要らないところがちょっといい。

minitest:

require 'minitest/autorun'
require 'minitest/unit'
require_relative '../lib/time_compact'

class TestTimeCompact < MiniTest::Test
  ...
end

test-unit:

require 'test/unit'
require_relative '../lib/kowabana/parser'

class TestKowabanaParser < Test::Unit::TestCase
  ...
end

power-assertもblock渡せば使える。

EngineYard日本支社クローズにともなって怖話さくらクラウドに移行しました。

sunziでサーバー作ってcapistranoでデプロイしてるんですが、sunziのshell scriptでちょっとわからない点があります。

debianでLANGとかLC_ALLの設定無しでapt-get installとかやると下記のようなお決まりのWARNINGが出まくります。

$ sudo apt-get install foo
...
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

僕の中では下記のエントリーで一応対応方法は決着していたんですが、sunziなどを使う場合はreboot無しで反映されないと気持ち悪い。

Setting locale failedを防ぐ - komagata

現状のrecipeは下記で、これはreboot必要なんですよね。みなさんどうやってるんでしょうか?(en_US.UTF-8でもかまわない)

sunzi-recipes/locale-jp.sh at master · fjordllc/sunzi-recipes

if ! grep -Fq "LC_ALL" /etc/environment; then
  sed -i 's/.*ja_JP.UTF-8 UTF-8.*/ja_JP.UTF-8 UTF-8/' /etc/locale.gen
  locale-gen
  cat < /etc/environment
LANG=ja_JP.UTF-8
LC_ALL=ja_JP.UTF-8
EOF
  source /etc/environment
fi