Minstrel

Ruby, JavaScript, Haskell, Math, Music, Design

JavaScriptのDateをそのまま比較するとfalseがでるよ

ある日の出来事

new Date('2018/09/01 10:00') == new Date('2018/09/01 10:00')
false

ファッッッッッッッッッッ?!!!!!


こうすると取れる模様

new Date('2018/09/01 10:00').getTime() == new Date('2018/09/01 10:00').getTime()
true

ちなみにgetTime()は1970 年1月1 日00:00:00からの経過ミリ秒を取得している模様。

Microsoftが解説してくれていた

JavaScript の日付を比較するときに、演算子の両側の日付が同じオブジェクトを参照している場合にだけ == 演算子が true を返すことを念頭に置く必要があります。 したがって、2 つの別々の Date オブジェクトが同じ日付に設定されている場合、date1 == date2 は false を返します。 また、時刻なしで日付だけで設定された Date オブジェクトは、その日付の午前 0 時に初期化されます。 したがって、たとえば時間を指定せずに設定された 1 つの Date を Date.now と比較する場合、最初の Date は午前 0 時に設定され、Date.now は設定されないことに注意してください。

結論

一言でいうと、J「avaScriptのDateの仕様ですよ」

二言でいうと、JavaScriptの仕様でDateに対して、等価演算子(==) or 厳密等価演算子(===)を使うと、「同じオブジェクトであるかどうか」をチェックしてしまう。(誰得なのだろうか?)

HTTPヘッダーまとめ

HTTPリクエストを観る方法いろいろ

1. ChromeDevToolsのNetwork

ほぼみなさん使ってると思いますが、個々で見れます。 Image from Gyazo

2. curlコマンド

curl --head https://twitter.com →レスポンスヘッダーだけぱっと見れる

curl -v https://twitter.com -v は verbose(意味: 冗長)の略。 リクエストヘッダ、レスポンスヘッダ、httpsのhandshake、要は全部表示してくれる。 ほんとにめちゃくちゃ冗長なのでヘッダだけ見たいときは curl -v https://twitter.com 1> /dev/null がおすすめ。 qiita.com

以下、重要そう・業務で使いそうなヘッダーのみ抽出してまとめる。

ジェネラルヘッダー

1. Cache-Control

ここはいまいち深く理解できていないので、以下の記事やMDNを参照に別途まとめる。 qiita.com

リクエストヘッダー

1. Referrer

訪れてきたサイト

2. Authorization

Basic認証に使用する

3. User-Agent

クライアントのブラウザのタイプ・verを示す

4. Cookie

ブラウザに保存されている情報。ログイン状態とかここでもっている。

レスポンスヘッダー

Age

キャッシュデータの経過時間

エンティティヘッダー: bodyの付加情報として使われるヘッダーフィールド

Allow

指定したURIで指定可能なメソッド

Content-Length

エンティティの長さをbyte数で示す

Content-Type

コンテントの形式(MIMETypeつまり html/text/json/xmlなど)

Expires

コンテントの有効期限

Last-Modified

コンテンツが最後に更新された日時

文系ガリレオvol.02 平方完成

文系ガリレオとは

文系Webエンジニアmorisが、理工系出身エンジニアへのコンプレックスを払拭するべく、高校時代に挫折をした数学を学び直し再起を図る、戰いの物語である。

出典図書

(ふたたびの高校数学/永野裕之)http://amzn.asia/fFPGWVn

今日のテーマ

平方完成

平方完成

乗法公式より

(x + p)2 = x2 + 2px + p2

これを変形して

x2 + 2px = (x + p)2 - p2

この式変形の根拠は以下の図である(出典: ふたたびの高校数学/永野裕之) Image from Gyazo

例)
x2 + 3x
= x2 + 2 *  \frac{3}{2}
= (x +  \frac{3}{2})2 - ( \frac{3}{2})2
= (x +  \frac{3}{2})2 -  \frac{9}{4}

x2 + 8x
= x2 + 2 * 4x = (x + 4)* - 16

まとめ

著者の永野さん曰く、平方完成は高校数学の中でもっとも重要な式変形の1つらしいです。 次回は、この平方完成を用いて、中学校時代に学んでよくわからなかった、解の公式をやっていきます。

curlコマンド備忘録

Postman便利すぎてcurlの使いかた忘れてしまうので備忘録。

# application/jsonでのPOSTリクエスト
curl -X POST -H ''Content-Type: applicaion/json" http://localhost:8081/register -d '{"email": "mori@hoge.com"}'

# application/x-www-form-urlencodedでのPOSTリクエスト
curl -X POST http://localhost:8081/register -d email=mori@hoge.com

文系ガリレオvol.01 対偶

文系ガリレオとは

文系Webエンジニアmorisが、理工系出身エンジニアへのコンプレックスを払拭するべく、高校時代に挫折をした数学を学び直し再起を図る、戰いの物語である。

出典図書

ふたたびの高校数学 / 永野裕之 

対偶

今日は上記の図書、第一章 幾何学を学んだ。 項目は 数Ⅰ 命題と証明。アルゴリズムの構築にも直接役立つ知識である。

PならばQ の対偶は QでないならばPでない

命題が正しければ必ず、その対偶も正しい。

問題

自然数a, bについて、 a2 + b2 が奇数であるとき、abが必ず偶数になることを証明せよ。

証明

対偶を証明する。当設問の命題は

  • P: a2 + b2 が奇数ならば
  • Q: ab は偶数である

この対偶は

  • \overline{Q}: abが奇数ならば
  • \overline{P}: a2 + b2 が偶数である

ab = 2n + 1とする。
abが奇数であることから、aとbが奇数であることは自明であるため、

  • a = 2k + 1
  • b = 2m + 1

と置く。(k, mは自然数)

これより

  • a2 + b2 = (2k + 1)2 + (2m + 1)2  ... ①

と表すことができる

①を展開すると

a2 + b2 = (2k + 1)2 + (2m + 1)2

= 4k2 + 4k + 1 + 4m2 + 4m + 1

= 2(2k2 + 2k + 2m2 + 2m) + 1

k, mは自然数であることより

= 2A + 1 と表すことができる。(Aは自然数)

したがって、abが偶数であるとき、a2 + b2 は奇数であることが証明される。そしてその対偶である、a2 + b2が偶数であるとき、abが奇数であることも証明される。

あとがき

永野さんの章末コラムがとてもおもしろい。

人を説得する2つの方法

パスカル「説得術について」より

人を説得する方法

    1. 人の気に入るものの言い方をする
    1. 厳密な論理を積み重ねる

2の方法を深掘りしていくと以下のようになる。

  • 自明な事柄を除くすべての言葉を明白に定義する
  • 議論の出発点として認めるべき公理(前提)を確認する
  • 自明でないすべての命題は定義、公理、すでに証明された命題(定理)のいずれかのみを用いて証明する。

まさにMTGの原則と一緒だと思った

メンバーと目的意識、問題意識などの前提を確認・合意し、 すでに合意した事項にもとづいてのみ、仮説立て、アクション決定を行う。 自分が体験してきたビジネスに於ける議論において重要なことと 寸分の違いもなかった。 (同じ議論であり、自分より数百倍賢いパスカルがやってるんだから当たり前である。)

読んでくださりありがとうござまいます

文系ガリレオシリーズはこんな感じで、簡単な高校数学の演習から初めていきます。 自分の備忘録・アウトプット学習が主目的ではありますが、これから数学を学ぶ文系エンジニアの誰かのためになるように書いていければとも思っています。次回も乞うご期待。

ウォーレン・バフェット「最も重要なのは、自分の能力の輪をどれだけ大きくするかではなく、その輪の境界をどこまで厳密に決められるかです」

ウォーレン・バフェット「最も重要なのは、自分の能力の輪をどれだけ大きくするかではなく、その輪の境界をどこまで厳密に決められるかです」

この言葉、自分に刺さった。 自分の武器を身に着けようとたくさん勉強するのは良いこと。

でも、もっと大事なのは 何を自分の武器とし 何を自分の武器としないか。

これを明確に決められると以下のメリットがある。 - 自分の時間を決めたものに集中投下することができる - 自分の武器でないものは、自分で努力しようとせず人に頼るということが即断できる。

ActiveRecord#update_allでtimestampが記録されない

社内のマーケターに、「このレコードの更新日おかしくないですか?」と相談され、表題の事件が発覚。

ActiveRecord#update_allでtimestampが記録されない

更新されまくっているレコードなのに、created_atとupdated_atが一致していておかしいと思い、ActiveRecordのソースを見に行った。 以下、わかったこと。

事実①

callbacksが呼ばれないメソッドがある。 これはRailsGuideにものっていたが改めてまとめる。

callback呼ばれないメソッド達

decrement
decrement_counter
delete
delete_all
increment
increment_counter
toggle
touch
update_column
update_columns
update_all
update_counters

callbackをスキップするというのは、モデルの一貫性を一瞬でぶち壊すので これらのメソッドの使用は原則禁止にするのが良さそうです。。

callback呼ばれるメソッド達

create
create!
destroy
destroy!
destroy_all
save
save!
save(validate: false)
toggle!
update_attribute
update
update!
valid?

事実②

timestampsはcallbackによって呼び出される。 ActiveRecordさんのメタプロ力が強すぎて、完璧には理解できなかったがどうやらafter_create, after_update, after_commitあたりで呼ばれていそう。

これによって update_allを使用 -> callbackが呼ばれない -> timestampが記録されない という掲題の事象が起きていた。