valid,invalid

関心を持てる事柄について

JavaScript や CSS を読み込む時の type 属性はもはや不要

kechol 氏からレビューを受けて知ったのでメモ。

https://google.github.io/styleguide/htmlcssguide.html#type_Attributes によると CSSJavaScript を読み込むときのタグに type attribute は HTML5 では不要、というか非推奨とのこと。

引用

Omit type attributes for style sheets and scripts.

Do not use type attributes for style sheets (unless not using CSS) and scripts (unless not using JavaScript).

Specifying type attributes in these contexts is not necessary as HTML5 implies text/css and text/javascript as defaults. This can be safely done even for older browsers.

<!-- Not recommended -->
<link rel="stylesheet" href="https://www.google.com/css/maia.css"
  type="text/css">
<!-- Recommended -->
<link rel="stylesheet" href="https://www.google.com/css/maia.css">
<!-- Not recommended -->
<script src="https://www.google.com/js/gweb/analytics/autotrack.js"
  type="text/javascript"></script>
<!-- Recommended -->
<script src="https://www.google.com/js/gweb/analytics/autotrack.js"></script>

こういうの、手癖で何も考えず書いたりしてしまう割に頻繁に情報アップデートしてもいないので Google HTML/CSS Style Guide を一通り読んでおいたほうが良さそうだ。

改行をレスポンシブにコントロールする

スマートフォンで閲覧する時は改行してほしい。PC では改行してほしくない。

みたいなデザインを実装している時に、同僚の @kechol 氏にレビューで教えていただいたのでメモ

See the Pen Responsive Line Break by Masato Ohba (@ohbarye) on CodePen.

CSS のメディアクエリで改行タグの display スタイルを操作すればよい

Clojure で初めての unless マクロを書く

7つの言語 7つの世界』を読みつつ Clojure 入門している。その中でマクロに関する記述があったが LISP のマクロに馴染みがないので、コードを見ても何が起きているのか瞬時にわからなかった。

正解のコードを少しずついじりながら、なぜそう書かないといけないのか、なぜそう書くと動くのかを確かめてみた。

ちなみに例は unlessで、これはマクロ入門でおなじみらしい。

失敗例

まずは挙げられているダメな例から。

(defn unless [test body] (if (not test) body))
#'user/unless

(unless true (println "Lose Yourself"))
Lose Yourself
nil

body が評価されてしまっている。testfalse のとき以外は評価してほしくない。なのでこれがダメなのはわかりやすい。

正規順序でなく作用的順序で評価してしまうと無限ループが発生してしまう例が SICP にもあった(気がする)。

正しい unless

以下のようになるようだ。

(defmacro unless [test body]
  (list 'if (list 'not test) body))

これをいじってみる。

if を即時評価していないのはなぜ

'if の部分は以下のように書けるのではないだろうか?

(defmacro unless [test body]
  (if (list 'not test) body))

(unless true (println "Nothing to tell."))
Nothing to tell. ;; 評価されてしまっている
nil

(unless false (println "This is it."))
This is it.
nil

はい、body が評価されてしまっているダメ。

(macroexpand '(unless cond body))
body

上記の unless をマクロ展開してみると body を実行するだけのマクロになってしまっていることがわかる。

not を即時評価していないのはなぜ

では、'not の部分は以下のように書けるのではないだろうか?

(defmacro unless [test body]
  (list 'if (not test) body))

(unless true (println "Nothing to tell."))
nil

(unless false (println "This is it."))
This is it.
nil

一見成功しているように見える…!

だがそれが命取り…!実は駄目…!

上記の unless をマクロ展開してみると条件部が既に評価されてしまっていることがわかる。

(macroexpand '(unless condition body))
(if false body)

;; 条件は false になるのに println が実行されない
(unless (= 1 2) (println "This is it."))
nil

正しい unless をマクロ展開すると条件部がまだ評価されていないことがわかる。

(macroexpand '(unless cond body))
(if (not cond) body)

;; ちゃんと unless 呼び出し時に評価されている
(unless (= 1 2) (println "This is it."))
This is it.
nil

defn で書いたらどうなる?

(defn unless [test body]
  (list 'if (list 'not test) body))

(unless true (println "Nothing to tell."))
Nothing to tell.
(if (not true) nil)

(unless false (println "This is it."))
This is it.
(if (not false) nil)

(class (unless false (println "This is it.")))
This is it.
clojure.lang.PersistentList

(list 'if (list 'not test) body) が評価されてしまった後のリストが返ってくる。body も評価されてしまっているので println が実行されている。

関連する関数などの知識

quote

評価してほしくないフォームに quote 関数を適用すると評価を抑制できる。

ダメなマクロの例を成り立たせるために body' で遅延評価させられる。もちろん呼び出し側でコントロールしているのでよくない。

(defn unless [test body] (if (not test) body))
#'user/unless

(unless true (quote (println "Lose Yourself")))
nil

;; ' 記号でも書ける
(unless true '(println "Lose Yourself"))
nil

defmacro

defmacrodefn のように関数を定義するが、その戻り値は実行時にコンパイラにマクロとして解釈されるようになる。

(doc defmacro)
-------------------------
clojure.core/defmacro
([name doc-string? attr-map? [params*] body] [name doc-string? attr-map? ([params*] body) + attr-map?])
Macro
  Like defn, but the resulting function name is declared as a
  macro and will be used as a macro by the compiler when it is
  called.
nil

;; 確かに Macro と解釈されているようす
(doc unless)
-------------------------
user/unless
([test body])
Macro
  nil
nil

7つの言語 7つの世界

7つの言語 7つの世界

『グランドイリュージョン』(原題: Now You See Me)観た

あらすじ

ダニエル・アトラスら4人の男女で構成されたマジシャンチーム“フォー・ホースメン”がラスベガスでショーを行うのと同時にパリの銀行から金を盗み出すという大技を行う。FBI特別捜査官のディラン・ローズとインターポールが彼らの犯罪を阻止しようとするが、失敗して途方に暮れ、マジックの種明かしの名手サディアス・ブラッドリーに助けを求める。 グランド・イリュージョン (映画) - Wikipedia

良かったところ

映像美もあるし題材ならではの謎解き感もあるし、何よりクライムサスペンスなので全体的にスカッとして良かった。テンポもよい。

4人組のキャラクターもそれぞれ魅力的だし俳優陣も良い。特にゾンビランドのコロンバスとタラハシのコンビの再演は熱い。

惜しいところ

原題

マジシャンの常套句を使っている原題の方がどう考えても格好良いと思う。

というか “Now you see me” (見えますね) を使わないと作品の中の “Now you don’t!” (はい消えた!) が通じなくなるというか、軽くなってしまうような…。

CG過剰

「いやぁーそれは無理でしょ」と突っ込みたくなるようなショーマジックを観ていると「うーん、映画だなぁ」と一歩引いてしまう。実際のマジックも「いやぁー無理でしょ」というものなんだろうけど、ライブ感ゆえにそこに注意はいかない("近づくほど見えなくなる"から)。

映像の面白さとしては"有り"だし、必然性があってそう描かざるを得ない"映画的な嘘"については物凄く好きなのだが、一歩惜しかった印象。

5月は短期集中して賃貸物件探しを終わらせた

年初に 2017年の目標 -1年の目標を立てるのをやめる- - valid,invalid で書いたように今年は30日ずつ何かを頑張ることにしており、5月は主に物件探しに打ち込んだ。

物件探しは妥協したくないのだが仕事の片手間にやるのもなかなか大変だ。物件検索サイトをずっとウォッチしているのもストレスになるし、探す期間に終わりが見えないと辛い。というわけで5月にもろもろ片付ける勢いで頑張った。

目標

  • 満足のいく賃貸物件を見つける

結果

以下の記事にまとめた通り、条件に見合う良い物件が見つかった。

ohbarye.hatenablog.jp

条件には書かなかったが「光回線インターネット無料」「ミストサウナ付きバスルーム」など予想の斜め上の特典も付いてきて嬉しい。

感想

ブコメにも「賃貸物件探しによくそんなにリソース割いたな」とあったけど、自分でもそう思う。1ヶ月で集中して終わらせるという気持ちを最初から持って臨んだおかげでなんとかなったと思う。

バズったこと

1100強ブクマであわせて22000PV、このブログ1年分のアクセスだ…。

f:id:ohbarye:20170612220504p:plain

純粋に嬉しい。

が、今日職場でプロダクトマネージャーと卓球しながら雑談していたら「あんな内容でバズるんですね?」と煽られた。彼もまた引越しのベテランのようなのでそのうち知見を公開して欲しい(見積書みたいなのを作って業者に埋めさせるとか言ってた)。

その他

ちょっと楽器を弾きたくなったので Victor Wooten の “Sometimes I Laugh” を頑張ってコピーした。

スタジオ版だとベースが何本も重なっているが、1本で弾けるようアレンジしているベーシストが Youtube で何人か見つかる。その中で最もかっこよかったこの人のアレンジをコピった。

途中で不可能ぽい運指があると思ったら12フレットのハーモニクスで音を繋いでいる箇所(0:49)があってけっこう感動した。

満足度の高い引越しのためにやったこと

いろいろあり引っ越すことにした。

学生時代も含めるとこれが4回目の賃貸物件探しだ。過去の引越しも、その時々で良い物件を見つけられたと思っているのだが…どの体験もあまり満足度が高くなくて若干トラウマ感があった。

今回物件を探すにあたってこうした過去を乗り越えることにした。

はてブが集まっている人気記事などを読んでみると、どうやら引越しや賃貸物件探しの満足度が低い原因は「ネットで物件探しを済ませようとする」「良い不動産屋を探していない」ことなどにあるらしい。

特に

今回は良い物件を探すのではなく、良い不動産屋を探すという方向に考えを変えることができたのが良かった。 部屋探しは面倒、suumoやhomesで探しててもよく分からない、自分より物件探しのプロの不動産屋の方が物件探しは得意なんだからそこに任せたほうが結果的に良いだろう、なら任せられる人を探そうという感じ。 良い物件ではなく良い不動産屋を探した - $shibayu36->blog;

この考えに強く共感した。

早速まねする形で良い物件、もとい良い不動産屋探しを始めた。

参考

今回の物件探しにおいて参考にしたサイトは以下です。大変助かりました、ありがとうございます。

効率的な賃貸物件の探し方 | nanapi [ナナピ]

良い物件ではなく良い不動産屋を探した - $shibayu36->blog;

満足できる物件を探すために僕がした事 - 文字っぽいの。

物件探し確認事項 - ポクポク

ゆきらん: 大家目線で教える賃貸マンションの賢い探し方

http://www.swatz.net/entry/2014/01/16/211550

やったこと(時系列順)

一部アレンジしているが、だいたいは上記サイトに書いてある通りに進めた。

ネットで探して即内覧とか、無策でとりあえず不動産屋に行ってみるといったアンチパターンを避けて、念入りに不動産屋を選んだ。

  • 連絡専用のGmailアドレスを作る
  • 条件を決める
  • 問い合わせ文面を書き起こす
  • 不動産屋の候補リストを作る
  • まとめて問い合わせる
  • 回答から良い業者か判断する
  • ついに業者を選ぶ
  • 覚悟してお店に行く
  • 油断せず内覧する
  • その後のフォロー
  • 他の業者にお断りの連絡

連絡専用のGmailアドレスを作る

これはどっちでも良いと思うが、万一悪徳な不動産屋に情報を流されたりするといやだなと思って作成した。

プライベートアカウントに来るメールもそこそこ多いので、それらに混ざって不動産屋からの連絡を見落とさずにすんで良かった。

条件を決める

家庭で話し合って決めた。夢が広がってめっちゃ細かい要望とかも出てくるので Must 条件と Want 条件に分けた。

分け方は人それぞれだが 、油断すると全部 Must になってしまうので Must は5個まで、それ以外は Want、みたいな線を引くとよい。

問い合わせ文面を書き起こす

決めた条件でテンプレートを作る。上記記事にもあるように「電話してほしくない」感を全面に出す。

実際、オンだろうがオフだろうが電話してほしくないし、なぜか不動産屋は留守電も残さず切ることが過去に多くてむかついていたので強調した。

また、この段階でもし理想に近い物件をネットで見つけられていたら参考までに付け加えておくとよい。後述するが、初回の回答でこの候補物件が空いているかどうかを見てくれる業者もいる。

送信したあとに何件かの業者から質問があったので以下の情報も足しておくと良さそう。

  • 入居時期
  • 入居者同士の関係(夫婦)
  • 個人契約 or 法人契約(これはほとんど聞かれなかったが)

ちなみにドラム式洗濯機が置けるかどうかは管理会社も知らないし図面でも読み取れないことが多い。日当たりとか、こういう内覧しないとわからないような情報は書かなくても良さそうだ。

不動産屋の候補リストを作る

HOMESなどのサイトに、エリア別の不動産業者一覧がある。評価の高い順にソートし、評価の高い不動産屋リストを作る。

効率的な賃貸物件の探し方 | nanapi [ナナピ]では30社とあるが流石に多すぎて管理しきれないと思って10社にした。

まとめて問い合わせる

テンプレートでまとめて問い合わせる。

不動産屋のホームページにはだいたい問い合せフォームがあるのでそこから問い合せる。ここで電話番号が必須になっている業者は候補から外す。問い合せフォームもメールアドレスの記載もない業者も外す。

問い合わせフォームがある場合は問い合わせをシステムで一元管理したいと思っているはずなので、記載されているからといってメールアドレスに送るのはやめよう。

余談だが、どの会社も問い合わせフォームが相似していて、不動産業向けの大手の ASP がいるんだなぁなどと思ったりした。

回答から良い業者か判断する

一番早いところだと5分で回答が来たが、いまだに回答が来ない会社もある。(それが悪いというわけではないおそらく別経路での流入・獲得に力を入れているのだと思う)

ただ、早さだけでは良い業者かどうかは測れない。挨拶程度のみの回答に「電話でなら…」とか「直接来店いただければ…」と付け加えてくることもある。コミュニケーションの期待値がずれているので早めに断る。

問い合わせ時に書いた「理想に近い物件」の空室状況をシュッと調べてくれるとか、初回の回答で候補物件を提示してくれる業者もいて、彼/彼女らには良い意味で期待を裏切られた。

10社と並列にやり取りしていると訳がわからなくなる。そのあたりの印象を忘れないために Google Spreadsheet を作ったりもした。自分で言うのもなんだが返信順でランク付けしたりしてるのはちょっと病的ぽい。

f:id:ohbarye:20170610200011p:plain

また、やり取りを途中からメールではなくノマドクラウド社の提供するサービスに切り替えてきた業者も幾つかいた。自分専用のマイページがパーマリンクで用意されていて、チャットUIでコミュニケーションできる。不動産屋も進化してないと言われつつ進歩しているんだなぁと思いつつ、こういうITツールを使いこなせるリテラシーの高さを持つ業者には信頼が増す。

ついに業者を選ぶ

だいたい2~4往復ぐらいやり取りすると信頼できそうな不動産業者が見えてきた。とにかく来店させようとする業者、だんだん雑 or 機械的になる業者(こんな面倒な客、そりゃそうだと)、いろいろ紹介してくれるけどいまいちな物件が多い業者…。

そういうのをサクッとお断りし、良さそうな物件を紹介してくれてなおかつ対応も非常に真摯だった2社から、一方を選んでようやく来店予約をした。何度も足を運びたくないので来店のタイミングでなるべく多く内覧させてほしいと伝えた。

もしこの時点で1社も候補に上がらなかったら問い合わせからやり直していたと思う。

覚悟してお店に行く

出会って初めてようやく自分のやってきた「良い不動産屋探し」が正解だったのかわかる。メールでは丁寧だがヤバいやつが出てきた時の対応も覚悟して訪れた。出てきたのは、不動産屋らしき押しの強さもなく、説明も丁寧で必要十分、そして速水もこみち風のイケメン。

不動産業者の経験年数にこだわる必要はないと思う。説明能力や家賃交渉力などは年次が高い人の方が優れているのかもしれないが、とにかく押せる営業マンが勝ってきた不動産業界に染まったおじさんが多いのもたぶん事実。前々回の引越しではすごく押しの強いオッサンがこちらを明らかにナメた感じで話してきたのできつかった。

良い気持ちで取引したいならそこそこ能力のあり、かつ誠実さがありそうな若手社員の方が個人的には相性がよい。

油断せず内覧する

内覧のコツについては物件探し確認事項 - ポクポクに全てが書かれている。メジャーを持っていってドラム式洗濯機が置けるかどうかを見たり、室内外の写真や動画を撮ったりした。

図面や事前に見た写真は良くても共用部が汚かったりゴミ捨て場が荒れていたり住民が不穏な感じだったりするので難しい。

一通り内覧が終わった後に「気に入った物件があれば申し込みしておいたほうが良いかと思いますが…」というセールストークが来るのはわかっていて、これをかわす術も考えていたのだが、紹介してくれた中に良い物件があったのでお願いした。

これまでの経験だと「では一度弊社に戻りまして…」となっていたのだが、「では必要書類をお持ちしているので手狭ではありますが車内で(ニコッ」となったのにはキュンとした。移動時間も短縮できてよいし、確かに営業所に戻る意味ないよな…。これが今のスタンダードなのだろうか。

その場で車を降りて去ろうとしたら「今日はお暑いですからご自宅までお送りいたします(ニコッ」となってまたキュンとした。

その後のフォロー

一度契約が決まってしまえば対応が雑になるということもなく、審査など諸々のフォローもしっかりしてくれた。

提携している引越し業者を紹介してくれる & 紹介なので少し安くなるというので見積もりをお願いした。結果、35,000円程度で前回の引越しより2万円近く安くなってびっくりしたので即決した。

引越し業者選びも不動産仲介業者選びと同じかそれ以上に面倒なのでこれもサクッと済んでよかった。相見積もりとったり、日程調整で値段変動させたり、疲れる。

他の業者にお断りの連絡

放置し続ければそのうち連絡が来なくなるかもしれないが、真摯に探してくれた業者には申し訳ないのでお礼とお断りの連絡をしておく。

物件をお探し頂いているなか大変申し訳ありませんが、
今回は他仲介業者経由で契約する運びとなりました。

またお力が必要になった際にはご連絡いたします。
ご尽力ありがとうございました。

ちなみに対応が悪かった時の断りは「引越し時期を見直すので連絡は結構です」という主旨の別パターンを用意していた。

まとめ

最初は余計な手間がかかるんじゃないかと思いつつも結果として良い不動産屋に出会えたし、自分たちでは見つけられなかった良い物件を紹介してもらえた。満足度が高い。

特に、会う前にコミュニケーションすることで良い不動産屋に出会えるだけでなく、裏を返せば態度がよくなさそうだったり紹介する物件が微妙な業者に出会うリスクがガクッと減ったと思う。

改めて感じたが引越しの一連の流れは本当に大変で、引越しの余計なストレスをなるべく減らしたいからこそ感じが良く信頼できる不動産屋を選ぶのは大事

感想

自分が不動産業者だったらこんな客は相手にしたくないかもしれない。

正直不動産(1) (ビッグコミックス)
小学館 (2018-01-12)
売り上げランキング: 1,778

Clojure で分数を扱う Ratio 型

Clojure では分数を扱う Ratio 型がある。

とりあえず見てみる

user=> (/ 22 7)
22/7

user=> (class (/ 22 7))
clojure.lang.Ratio

型変換

Integer や Float にいつでも変換できる。

user=> (int (/ 22 7))
3

user=> (float (/ 22 7))
3.142857

有理数

rationalize は面白い。引数を有理数に変換するのだが、返り値は様々。

user=> (rationalize 1.5)
3/2

user=> (class (rationalize 1.5))
clojure.lang.Ratio

user=> (rationalize 1N)
1N

user=> (class (rationalize 1N))
clojure.lang.BigInt

user=> (rationalize 1.00)
1N

user=> (class (rationalize 1.00))
clojure.lang.BigInt

user=> (rationalize 1)
1

user=> (class (rationalize 1))
java.lang.Long

user=> (rationalize 4/2)
2

user=> (class (rationalize 4/2))
java.lang.Long

test

test する関数は ratio?rational? がある。

user=> (doc ratio?)
-------------------------
clojure.core/ratio?
([n])
  Returns true if n is a Ratio ;; 型が Ratio のときのみ true

user=> (ratio? 4/3) ;; Ratio
true

user=> (ratio? 4/2) ;; これは Long
false

user=> (ratio? 2) ;; Long
false

user=> (ratio? 2.0) ;; Double
false
user=> (doc rational?)
-------------------------
clojure.core/rational?
([n])
  Returns true if n is a rational number ;; 有理数であれば true なので整数(Long)にも true を返す

user=> (rational? 4/3)
true

user=> (rational? 4/2)
true

user=> (rational? 2)
true

user=> (rational? 2.0)
false