コード日進月歩

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

getと接頭辞のつくメソッドは計算の必要がない値の返却が望ましいという話

休業日なのでコラム的なヤツです。

発想の発端

すえなみさんの以下のツイートから

経験値より

自分自身もココには思うところがあって

  • getなんちゃらというものは値を取得するものだから計算やDBアクセスは伴わない
  • 処理が重くなるようなものはgetとつけるとミスリードが多いからやらない

というのが潜在意識にある。

この意識付けの源流

この意識付けを生んだのはゲームプログラミングを行っているときで、基本的にゲームはゲームループの処理を以下に軽くして処理落ちをさせないかが肝になるので、getHogeHogeのようなメソッドでめちゃくちゃ思い処理をされると読み違えの種になる。

そのため、重い処理や計算処理にはふさわしい名前をつけるべきという考えを埋め込まれた、という流れである。

この話を紐解いていくと、やはり、「getという名のつくものはメンバ変数を参照することが期待値としてあるので、それを外れるものは容易すべきではない」ということだとは思う。

追記

ちょっと自分でもわかりにくい文章書いちゃったなと思い、下記ご指摘を頂きました

そこに対するアンサーとしても書いたのですが

という感じで、あくまでも「getXXXはgetterの文脈から軽い処理であることが期待されがちだし、そこの期待値を離れると大概よくないことになりがち」という気持ちから来ているお話でした。

参考リンク

Railsの5.2系からブロックなしのtravel_toに対してtravel_backを明示的に書かなくてもよくなった

travel_backってどこで使うんだ…?と使い所に関して挙動を確認してたらたどり着いたメモ。

環境

$ bin/rails -v
Rails 5.2.2

理由と解説

travel_back というリアル時刻に戻す機能があるのだが、一昔の前のブログをさがすと「ブロックなしの travel_to をしたら必ずやってね!」という文章がたくさんでてくる

しかし5.2系にてこれを修正するPRが出され、マージされている

TimeHelpers moduleでafter_teardownメソッドを定義し、テスト終了時に自動でtravel_backを呼び出すよう修正しています。 これにより、block無しのtravelやtravel_toを使用した場合に、明示的にtravel_backを呼ぶ必要は無くなります。 Remove automatic removal of Date/Time stubs after each test caseで一度同様の対応が削除された事があったのですが、自動でtravel_backした方が便利だろう、という事で再度入ったようです。 - rails commit log流し読み(2017/07/24) - なるようになるブログ

そのため、いままでは

context "travel_test" do
  before do
    travel_to( "2018-10-10 10:00:00".in_time_zone )
  end

  it "ためしに時刻表示" do
    pp Time.zone.now
  end

  after do
    travel_back
  end
end

とかく必要があったが、afterが不要になり

context "travel_test" do
  before do
    travel_to( "2018-10-10 10:00:00".in_time_zone )
  end

  it "ためしに時刻表示" do
    pp Time.zone.now
  end
end

だけでよくなった

参考リンク

「直交する概念」という際に使われる直交とはどういうことかをざっくりまとめる

ググってもわからない、かつ「議論が平行線をたどる」の派生かと思ったのでめちゃくちゃ混乱したのでメモ

解説

元は英語の「orthogonal」の直訳。

数学用語から派生して下記のように表現することがある

A is orthogonal to B は「A と B は別問題だ」と訳してあげるといいケースがあります. - 英語表現のメモ:"A is orthogonal to B"=「A と B は別問題だ」 - left over junk

なぜ別概念かというのは上記のブログに丁寧な説明があって

中学校の代数幾何を思い浮かべていただくと,タテ軸とヨコ軸は直角に交わります.これはいちばん基本的な orthogonal の関係と言えるでしょう.タテとヨコはべつべつの次元で,たとえばタテの位置はそのままにヨコの位置だけを変えることができます.  こういう場合,「直交する」ということは「次元がちがう」ということでもあります.  ここから「直角に交わる」という意味をとりさって「次元がちがう」という意味だけを残すと,上記のような用法がでてきます.つまり,(A)キャラクターの関係と (B)話題-焦点の選択はたがいに異なる次元 (dimension) ですから,これを orthogonal と表現するわけです.- 英語表現のメモ:"A is orthogonal to B"=「A と B は別問題だ」 - left over junk

そのため、「直交する概念」などは「別次元の概念」となり、転じて「別の問題の概念、因果関係のない概念」となる。

シンプルな解説

とりすーぷさんのTweetがキレイにまとまっていたので引用

参考リンク

JSのwindow.closeはwindow.openで開いたwindowでないと反応しない

そういう仕様ということを知らなかったのでメモ

出典

思いの外わかりやすく書いてある

このメソッドが許可されるのは、window.open() メソッドを用いたスクリプトにより開かれたウィンドウに対する呼び出しのみです。 - window.close - Web API | MDN

なぜ認識違いが起きていたのか

この仕様、IE11だとしっかりと準拠していないらしく、openで開いていないものに関してもcloseができるという仕様だったので、ワンセットで扱うという認識があまり浸透していない様子

参考リンク

並行と並列の違いをざっくりまとめる

使うときに戸惑っていたのでメモ

それぞれの意味

並行(concurrent)

複数のタスクを1人が処理するイメージ。シングルコアのCPUが複数のことがらを動かすことなどがあげられる。タイムスライスなどの考え方もこれ。

並列(parallel)

同時に複数のタスクをこなすこと、並行とは違うのは複数人などで本当に同時に行われることを指す。そのため「並行かつ並列」という状態はありうる。

参考リンク

HTMLでaタグのhrefに#を指定するとページ上部に遷移するのは、HTMLの仕様として記述がある

HTMLの動作の穴をついた妙技系かと思ったらちゃんとした仕様があった。

出典

シャープの後に記述する文字列を色々なところでアンカーと称する事が多く、そのアンカー名は別名フラグメント識別子といい、その解説に

メモ: href="#top" または空のフラグメント href="#" を現在のページの最上部へのリンクとして使用できます。この動作は HTML 仕様書で定義されています。 - <a>: アンカー要素 - HTML: HyperText Markup Language | MDN

と記述があり

リンク先の文を見ると

If the indicated part of the document is the top of the document, then: Set the Document's target element to null. Scroll to the beginning of the document for the Document.

If fragment is the empty string, then the indicated part of the document is the top of the document; return.

と書かれており

  • topを指定するとドキュメントの先頭までスクロールする
  • フラグメントが空の文字列の場合はtopである

のような記述が読み解け、仕様として定義されていることがわかる

余談

ちなみに移動しないリンクなどで

<a href="#!">どこにも移動しないリンク</a>

のような書き方もできるが、これは idセレクタには!が使用できないからどこにも移動しない という挙動を利用したものの様子

参考リンク

emojiを検索したいときに便利なサイト『Emojipedia』

ざっくばらんに一覧みたいなーとか、どういうのがあるんだっけか、みたいのを探すときに

紹介サイト

📙 Emojipedia — 😃 Home of Emoji Meanings 💁👌🎍😍

便利ポイント

あれ、この絵文字ってなんて打つんだっけ?っていうときのカテゴリー検索はもちろん、機種ごとの表示形式を表示してくれるので便利。

たとえば 🍱(弁当) は以下のように並ぶ。

f:id:shinkufencer:20190918092205p:plain
さまざまな :bento:

AppleGoogle以外にもdocomoauなども見れるので幅広く使える

参考リンク

ちなみにMacはパレットのショートカットがある