27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6

ここは Web や Android アプリのプログラマでありチェスやバイク、株式投資を趣味とするコジオンこと Hideyuki Kojima の日記です。 毎日何かしら欠かさず書いています。 この Blog の他に Qiita にもいくつか技術系の記事を投稿しています。 YouTube のチェス実況チャンネル に毎日 lichessChess.com の 10 分レート戦の実況動画を投稿しています。 連絡はメールでお願いします。kojionilk あっとまーく gmail どっと com です。

家でダラダラとしていた。 しかし、本当にダラダラし続けるのは良くないと思った。少しは外に出て体を動かさないと体調が悪くなる。

これでこの日記は 1 ヶ月続いた。この調子でいこう。

雪が降るかもしれないとの事だったが降らなかった。まぁ降らないほうが有り難いが、レインシューズ買ったのにまだ 1 回も使っていない。

PC ゲームやろうかと思ったら歳を実感して悲しくなった話

昔は PC ゲームで英雄伝説とか信長の野望とかやるのが凄く楽しかったのだが、 今の英雄伝説は既に PC 版が販売されていない。恐らく販売数が少なすぎて採算が取れないのだろう。 PC ゲームには独特の良さがあると思うのだが、実に残念なものだ。

だが信長の野望や三国志は依然として PC 版も健在だ。 但しコンシューマ機のものより値段がかなり高くて気軽に買えたものではない。 信長の野望・天道に関しては体験版が置いてあったので早速 VMWare Fusion 上でプレイしてみた。

素直な感想として、ルールが覚えられない。 というか、覚えようとすると「勉強」になってしまって疲れる。 ただでさえ仕事で勉強しているのにこんな遊びでも勉強しなければならないのはキツすぎる。 信長の野望ってこんなに複雑なゲームだったんだな、と改めて思った。 これでも昔は何となく試行錯誤を繰り返して遊んでたのだが、と思ったら自分の歳を感じて悲しくなった。

かといってコンシューマゲーム機もあまり食指が伸びない。 「マリオテニス ウルトラスマッシュ」は良いかと思ったのだがネット上の評価によると物凄い駄作らしい。 ロールプレイングゲームを買っても据え置きだと途中で面倒くさくなって到底最後まで続かないと想像できてしまう。

スマホ版でロマサガ 2 のリメイク版がそろそろ出るらしいのでそれは期待している。 ただ、それは昔遊んだことがあるので、ルールを覚えるコストがほぼかからずに遊べるから素直に飛びつけるだけだったりする。 なので、冒険をするゲームはやっていても、自分自身はゲームに対して冒険が出来ていない。

出るかもしれない MacBook と iPad Air 3 に注目している

去年末の iPad mini 4 と iPad Pro の発売時に iPad Air 3 がお預けになってしまっている件で、そろそろ発表があるのではないかという噂で注目している。 自分は特に欲しくはないのだが、妻が iPad Air を使用しているのでそろそろ買い替えを検討する頃というわけだ。 MVNO SIM も安くなってきたので若干値が張るが Cellular 版のほうがいい気もする。 値が張るといっても売却するときも高く売れるので単純に考えてはいけない。

あと MacBook もちょっと気になっている。 現在発売されているモデルだとあまりにもスペックが低い割に値段が高くて敬遠してしまうが、 そろそろ初登場時のボッタクリ価格は避けてくるのではないだろうか、と想像している。 今私は iMac 21.5 を使用しているので、サブ機としては割といいのではないかと思う。

楽天のお買い物マラソンはやらないのか

最近は楽天がお買い物マラソン (10 店舗買いまわりでポイント 10 倍になるセール) をやらないように見える。 バレンタイン前にやるのだろうか。ノンアルコールビールが無くなってきたので補充したいのだが。 とりあえずヴェリタスブロイが無くなってしまうとその辺のスーパーで補充するのが不可能なので仕方なく Amazon で注文した。 といっても、かなり安い。今 Amazon で 48 本セットで 3,708 円。ということは一本 77.25 円。 もうジュース感覚で気軽に飲めるレベルだ。しかも結構侮れない美味さだ。

本日で渋谷とサヨナラするので思い残していたマッドバーガー再訪を果たした。 12 時過ぎに来たので店内は前来た時よりは人が入っていた。やはり周りで働いている会社員が多いのか。

ランチメニューのベーコンチーズバーガー。1,400 円。 今回はチーズがちゃんとチェダーであることを確認した。

食べてみたが、ベーコンは流石に値段がそれなりにするだけあって分厚くて美味しいベーコンなのだが、 やはり全体的な印象としてマッドバーガー行田店のものとはかなり異なる印象を持ってしまった。 特にバンズ。パティも多分違う。同じなのは食べた後にバーガー袋に残る肉汁とソースのみ。

やはりこれだと個人的には Reg-On Diner のアボカドチーズを食べに行ってしまう。 なんか印象に残らないバーガーというか、そこまでの質の高さを感じない。少なくともこの内容で 1,400 円は高い気がする。

初めて知った時は「あの味がまさか渋谷で食べられるとは」とウキウキしたが、 食べた結果、正直な印象としてがっかりしてしまった。

1 月も明日で終わりとなった。やっと残業ともおさらばだ。渋谷ともおさらばだ。

最後の夕食はとろろ蕎麦で決めた。私の青春はとろろ蕎麦に込められていると言っても過言ではない。 一人暮らしを始める前は自由にとろろを摺ることができなかった。 とろろを食べたいと思った時に食べるにはコンビニのとろろ蕎麦を買い求めるしかなかったからだ。

今は自由にとろろを摺れるので、麦とろご飯を定期的に食べている。美味しくて栄養もあるとろろは最早人生から切り離せない位置にいる。

今出向している会社も明後日で終わりということになったので、 まぁ最終日は残業はないだろうということで明日頑張れば O.K. ということになった。

いや、今日も頑張った。

結局海苔弁は食えなかった

いつも行ってるコンビニに海苔弁が置いてなかったので結局おにぎりとサンドイッチを仕事中に齧ることになってしまった。ちょっと悲しい。 いや、勿論普通の弁当は置いてあったのだが、それじゃ駄目だ。いかにもな古臭いスタイルの海苔弁じゃなくっちゃ。

割と星が見える

ベランダに水道が付いているのでたまに加湿器の水を汲むためにベランダから外に出るのだが、 埼玉県の東京寄りに住んでいるから星なんて全然見えない、といつも思っていたが真冬なら夜空を見上げると結構見えた。 星空を見ていると子供の頃を思い出すもので、それは悪くない心持だ。

残業続きでもう 1 日中仕事しているので、日記に書くことがない。

強いて言えば、昼に久々にマックに行った。というか本当はウーピーゴールドバーガーに行くはずがやってなかったので仕方なくマックになった。 クーポン券を使っても高くなった気がする。正直もう好んで行きたくはないチェーン店になった。 もうちょっとお金出してケンタッキー行ってチキンでも齧っていたほうがいい。

久々に海苔弁を食べたくなったので、明日の夕食は海苔弁にしよう。仕事しながら食べるわけだが……。

朝の通勤時、10 数メートル先で横断歩道の信号が変わろうとしていた。 私はこの位置では相当ダッシュしないと間に合わないから次の信号まで待つことを選択した。 しかし隣の学生は猛ダッシュで走っていった。その瞬間ポケットから裸の iPhone が転げ落ちアスファルトにダイブしていた。 学生は 2, 3 秒固まっていたが iPhone を拾い上げそのまま再度猛ダッシュしていった。 タクシーが右折してきていたが、止まってくれて結果渡り切ることができた。

目先の損得に囚われていないか

  • 危険だが猛ダッシュして渡り切り 3 分ほど現地に早く到着する
  • 落ち着いて待つ

「猛ダッシュして渡り切る」方に 1 / 300 の確率で車と衝突するなどの何らかのトラブルが発生するとするとどうか。 合計 15 時間ほど得をするがその代わり怪我をしたり代わりの時間やお金を失ったりする。 どちらが得だろうか。

電車などでも同様の光景をよく目にする。ドアが閉まりそうな電車に向かって猛ダッシュ。 心というか時間に余裕が無い現代人が多すぎると思う。

Effective Python の発売日だった

自宅に Effective Python がやってきた。233 ページしか無いのに 3,200 円もするという技術本。 まぁ技術本なんてこのような値段設定は珍しくないが、やっぱり高い。

オライリーの書籍は O'Reilly Ebook で電子書籍としても購入することができるが、こちらは PDF フォーマットな上に若干出版にタイムラグがある。いつもだったら Ebook を待つのだがちょっと今回はすぐ読んでみたいのとたまには物理的な紙の媒体で読んでみたいというので前もって楽天で予約しておいたというわけだ。

折角高いお金を出して買ったので、ちょっと一人読書会でもやってみよう、というお話。 Blog や Qiita などで不特定多数に向けて何かを書くことを心掛けると、いい加減なことを書けないのでちゃんと理解しようという縛りを自分に設けることができる。

Effective Python の目次は O'Reilly の書籍紹介ページにある。 各項目に対して自分なりの考察若しくは感想文を書こうというわけだ。というわけで、以下 1 章 Python 流思考 (Pythonic Thinking) に関する一人読書会を実行する。

項目 1: 使っている Python のバージョンを知っておく

Python には 2.x 系と 3.x 系があり双方には互換性が無い。処理系にも CPython, Jython, IronPython, PyPy などあるよ、という話。 OS X や CentOS 等に最初からインストールされている Python は未だ 2.x 系である。Ubuntu は 16.04 LTS から Python 3.5 がデフォルトになるようだ。

これから新規 Python プロジェクトを立ち上げる場合は特に理由がない場合は 3.x 系を使用すること。 とはいえ、仕事としてやっているとどうしても 2.x の方を相手せざるを得ないのも事実。

項目 2: PEP 8 スタイルガイドに従う

Python プログラマの従うべき最も有名なコーディング規約として PEP 8 がある。 PyCharm などの IDE であれば最初から PEP 8 のチェックが入るし Vim や Emacs のようなエディタでもチェックする方法がある。

書籍には PEP 8 の中でも特筆すべき項目について列挙されている。筆者が気になったものを以下に引用する。

各行は、長さが 79 文字かそれ以下とする。

PEP 8 のこれはかなり有名なのだが、何故 79 文字以下なのだろうか。80 文字では駄目だったのだろうか。

またコードが短めの Python ならまだこれも守れないこともないが Java で 80 文字制限などしたら悲惨なことになるし、 今のディスプレイは高精細なので割と横に多く表示できるので 120 文字くらいでもいい気はしないでもないが、まぁこういう規約なので守っておく。

長さを使って空値かどうかをチェックしない。空値が暗黙に False と評価されることを使う。

暗黙型変換を使うのは危ないのでは?長さを使ったほうが安全では?と思ってしまった。 特に PHP では if ($hoge) と書くと if ($hoge == true) の意味 (緩やかな比較) となり PHP では割と変な値まで true, false になってしまうというのがあるので strlen($hoge) と書くのは結構よくやるので Python もアリではないかと思っていたが、暗黙型変換を用いた方が構文がシンプルになって良いということだろうか。

# 冗長な書き方
if len(somelist) == 0:
    ...

# 好ましい書き方
if not some list:

項目 3: bytes, str, unicode の違いを知っておく

Python 2 では文字列は str で Unicode 文字列を扱うのに unicode を使わなければならなかった。 英語圏の人は全く困らない仕様だが、我々の使用しているような非 ASCII 文字を使用している言語の場合 u'日本語' などと頭に u を付けて Unicode 文字列であることを明示しなければならなかった。

しかし Python 3 ではこれば str に一本化され単純に '日本語' と表現できるようになった。つまり Python 2 の unicode が Python 3 の str になったという話。

一時期 Unicode と UTF-8 がごっちゃになっていた時があったのだが UTF-8 はあくまで Unicode の効率的なエンコード方式であり別物である。 Unicode についてがすごく分かりやすかった。

Unicode 文字をバイナリ (生の 8 ビット値) で表すには多くの手法があります。一番多いのは UTF-8 符号化です。 重要なのは Python 3 の str インスタンスと Python 2 の unicode インスタンスがバイナリ符号化を伴っていないことです。 Unicode 文字をバイナリデータに変換するには、メソッド encode を使わなければなりません。

つまりファイルから読み込んだ場合などで bytes 型になっている時はエンコードされている状態 (多くは UTF-8) なのでそれを decode しなければならない。

項目 4: 複雑な式の代わりにヘルパー関数を書く

複雑な式を 1 行に詰め込むなとか部分的に共通化できるならヘルパー関数を書けという話。 Python は気軽に関数内関数が書けるので、このあたりは積極的に使っていきたいところ。

項目 5: シーケンスをどのようにスライスするか知っておく

Python は文字列もシーケンス型なので配列のようなスライスが簡単に使えるのが便利で美しい。

リストの先頭からスライスするときには、添字のゼロは省いて、見た目をスッキリさせましょう。

assert a[:5] == a[0:5]

0 ... つけてしまっていたかもしれない。

末尾までスライスするときには、末尾の添字は冗長なので省きましょう。

assert a[5:] == a[5:len(a)]

これはちゃんとできていた。Java 等の substring が第二引数を付けないと末尾までスライスするという意味なので類推しやすかったように思う。

一箇所、パット見よくわからなかった箇所が以下:

添字 start も end もないスライスに代入を行うと、(新しいリストが作成されるのではなくて) リストの内容全体が右辺のリストが参照している要素に置き換わります。

a = []
b = a
print('Before', a)  # []
a[:] = [101, 102, 103]
assert a is b  # True
print('After ', a)  # [101, 102, 103]

なるほど単純に a = [101, 102, 103] とやってしまうと a is not b になってしまう。リストの参照を変えずにリストの内容全体を書き換えたい時に使うわけだ。

項目 6: 1 つのスライスでは start, end, stride を使わない

start, end, stride とは somelist[start:end:stride] みたいなものの事で stride でリストの取得間隔を指定できるが、 これが読みにくいのでなるべく避けましょうという事だった。 それ以前にあまり使うことが無いわけだが……。

項目 7: map や filter の代わりにリスト内包表記を使う

これはもうその通りとしか言いようが無い。リスト内包表記は便利すぎる。他の言語にも欲しいくらいだ。

項目 8: リスト内包表記には 3 つ以上の式を避ける

リスト内包表記は for 文をネストできるが、当然だがやり過ぎると読みにくいので普通に for 文を使うほうが良い。

項目 9: 大きな内包表記にはジェネレータ式を考える

これもその通りとしか言いようがない。Python はリスト内包表記を少し書き換えるだけでジェネレータ式になるので便利だ。

項目 10: range よりは enumerate にする

恥ずかしながら私も range() で書きがちだったのでこれは肝に命じることにする。

for i in range(len(flavor_list)):
    flavor = flavor_list[i]
    ...

よりも

for i, flavor in enumerate(flavor_list):
    ...

の方がずっと簡潔だという話。PHP の foreach, Java の拡張 for 文にあたるものは Python では enumerate として用意されていると覚える。

項目 11: イテレータを並列に処理するには zip を使う

これも Python の便利なところで、他の言語でも zip() が欲しいと思い自分で実装してしまったケースもあるくらいだ。

項目 12: for と while ループの後の else ブロックは使うのを避ける

恥ずかしながら私はこの else が通る場合の条件を理解していなかった:

for i in range(3):
    ...
else:
    ...  # for 分が break されなかった場合に呼ばれる (!!)

Python での else, except, finally のすべての用法から、初めてのプログラマは for/else の else 部分は「ループが完了しなかったらこれをしなさい」という意味だと思い込むものです。

for 文が実行されなかった時 (対象のリストが 0 件だった時) だと思っていた。全然違った。 というわけで、確かに混乱の元なので使わないほうがいいだろう。わかりやすさを好む Python でこんな分かりにくいパーツがあるのが驚いた。

項目 13: try/except/else/finally の各ブロックを活用する

こちらでは前章と違い else も活用せよ と書いてある。しかし、こちらも誤解を呼ぶ (正直パット見分からない) から使わないほうが良いのではないかと思うが……。

予定通りレインシューズ購入

休日なのでレイクタウンに出張り予定通りレインシューズを購入。大して有名でないメーカーの 6,000 円のものにした。 リーガルのとか見えたけど高すぎる。15,000 円だし。

これで再度雪でも安心……でもない。お願いだから降らないで欲しい。もう電車辛い。

喫煙室に子供を連れ込むのはナシじゃないか?

レイクタウンには幾つか Smoking Room (喫煙室) があると思うが、 子連れのママの多くが子供と一緒に普通に喫煙室に入っていくのを見て驚いた。 子供の健康に悪いから控えておこうとか考えないのだろうか、と。 しかしよく考えたら煙草を吸っているのだから自宅では子供の隣で平気で吸っているんだろうなと想像できる。 子供が親を選べないのと同様に、健康的な生活も選べないわけだ。

飛賀屋とか

飛賀屋 うにいくら丼

まぁ仕事頑張ったので飛賀屋でちょっといいものを頂いた。 ただ、ビールがスーパードライしか置いていなかったので普段飲まない日本酒を頼んでみた。

海鮮丼、これはうにいくら丼だけど実に美味い。けどまぁ、レイクタウンは美味しい店いっぱい入っているので普段は行かないかな。

夕食は豚汁にした

いつも楽天で豚肉(バラ)を大量買いしているので、それを使って豚汁を作った。 豚汁を作る際は出汁を入れないのが基本で、水の状態から野菜と豚を投入して煮込んで作ると美味い。 子供達にも効率よく野菜を採ってもらえるのが良い。

残業続きで疲れてしまった。一日中仕事をしていたので、特に書くことがない。 明日も雪が降るらしい。どうなるかな。

残業続きで疲れてしまった

いろいろと忙しい。残業続きで疲れてしまった。

久々に黒ラベルを買ってみた

帰りに寄ったスーパーで珍しく黒ラベルの瓶が売っていたので買ってみた。 確かにアルコールの味がするが、昨日日記に書いたビットブルガードライブの方が美味い。 やっぱり、ビールはアルコールが入ってるかどうかは美味さにそんなに関係ない。 みんなノンアルが不味いと思っているのは日本のノンアルが不味いせいだ。

なんとなく瓶なので惹かれたが、なんでこんなビールを買ってしまったんだ……。 隣に置いてあったエビスにしておけば良かったかもしれない。

瓶に入っているノンアルコールビール。ノンアルにしてはちょっと値段が高い。 が、美味い。全くアルコールが入っていない事を感じさせない美味さ。むしろ「アルコールが入っているんじゃないか」と錯覚するレベルと言える。 アルコールが入ってないので流石にビールと全く同じ味とは言えないが、ノンアルコールビールのイメージを覆してくれた。

以前飲んだヴェリタスブロイも美味しかったが、それを超えている。 ただ、値段はヴェリタスブロイよりかなり高め。コストパフォーマンスを考えたらヴェリタスブロイが最強か。

ヴェリタスブロイもそうだが一般のスーパーで見かけることはほぼ無いだろう。興味がある方は Amazon か楽天で試しに購入してみては如何だろうか。

昨日は雪が降った

昨日は雪が降り首都圏の電車はストップし Twitter やら 2 ちゃんまとめやらで各路線の惨状が紹介されていたのは記憶に新しい。 雪が降っているにも関わらず普通の靴で出かけてしまい、溶解した雪で足が水浸しになり宜しくない状態で仕事をする羽目となった。

たまにしか使わないからといつも購入を先送りにしていたビジネス用レインブーツの購入を週末に検討しようと思った。 たまにしか使わないから何年も持つ雨の日に普通の靴を履いて劣化する分が防げると考えると却って節約になるのかもしれない。

今日は路面凍結

さて、前日の想像通り今日は雪が溶けて路面凍結。都内の職場周辺は人の通りが多いのでとっくに溶け落ちているが自宅から駅までのルートの凍結がひどい。 そのせいでまた出社が遅くなり遅刻寸前になってしまった...。

スパロボ Z など引っ張りだして遊び中

放置していた PS3 を起動して、同じくタンスの底に眠っていたスパロボ Z などを引っ張りだして遊んでみた。なかなか面白い。 30 を過ぎてからというものコンシューマゲーム機からすっかり遠ざかってしまっていた。 特に 3DS や PS Vita などの携帯ゲーム機をプレイすると目が疲れるので仕事に支障が出て辛いのでやらないようにしている。

ただ WiiU だけは子供がよく遊んでいる。マリオは凄いね。今は YouTube のゲーム実況があるので、それを見せるだけで良い感じになるし。

写真を効率的にバックアップするのはどうすればよいのか

私は写真を撮るのがそんなに頻繁ではないのだが、写真を撮った後 PC に送ったりする時にどうするのがベストなのかいつも悩んでいた。 この話をすると何故か多くの人が SD カード を使用する事を選択しているように思う。 SD カードで移す話を聞くと、昔 CF (コンパクトフラッシュ) カードに記録するタイプのデジカメを使用していて、それのデータを PC に移す時の事を思い出す。 物理デバイスを差し替えるというのは 1 回 1 回は大した手間ではないのだが、毎回それを行うのはやはり手間に感じるものだ。

iPhone は Lightning ケーブルを Mac に繋いで iTunes で自動なのは知っているが、以下 Android での話。

世の中で Android が使われるようになって Android 端末を microUSB ケーブルで PC と繋いでファイルをやり取りするというのは定着したと思う。 OS X だと Android File Transfer だろう。 Android の良い所は Linux ディレクトリ構造がちゃんと表示されるのでパーミッションが許される場所ならば置きたいところに好きなファイルを置けることだ。 これで写真や音楽やら簡単にやり取りすることができる。が、やはりベストではない。

ケーブルを繋ぐのも面倒なので、いつもカメラで撮影後 Google ドライブにアップロードするという方法を取っていた。 しかし、手動でアップロードするのも面倒だ。カメラアプリで写真を撮った瞬間に勝手にクラウドストレージにバックアップして欲しい。 Dropbox だと昔からこのサービス (写真の自動アップロード) があって凄く便利だった。が、筆者は Dropbox を使っておらず Google ドライブを愛用している。

Google フォトのバックアップ

いつだったか、とはいえ最近だと思うが Android の Google フォトアプリが更新されバックアップの機能が追加された。 Android で Google フォトアプリを開き「設定」->「バックアップと同期」を押下。 するとバックアップの設定が出てくるのでこれを ON にする。 そうすると Android のカメラアプリで撮影すると自分の Google ドライブの「Google フォト」フォルダに自動的にバックアップしてくれるようになる。

一つ、「アップロードサイズ」の設定があり、「高画質」の方だと写真が無制限でバックアップできるというのがある。 これは写真を撮りまくる人には非常に便利なのではないか。 もう一つの設定「元のサイズ (一切圧縮されない)」だともともとの Google ドライブの容量 (2016/01 現在無料枠で 15G) が適用される。 私の場合は写真をあまり撮らないのでこれで十分かもしれない。

しかも Android だけではなく iOS 版もあるし、なんと Windows 版と OS X 版もある。 PC 側で収集した画像も自動で Google ドライブの同一フォルダにバックアップしてくれるわけだ。

タブレットをお勧めする場合はどれを選ぶか

家族や知人に「タブレット端末はどれが良いか」と聞かれてお勧めするのはどれを選ぶか。 これは間違いなく iPad (Air or mini) だ。 デザインが格好良く、誰でも直感的に使え、綺麗に使用していれば売却する時でも値崩れは殆ど無い。 値崩れが殆ど無いということは、例え購入価格が高かったとしても売却時にある程度取り返せるので、値段が高いという事が思ったほどのデメリットにはならない。

その他のタブレットを選択するのはどういう時なのだろうか。

私のタブレット遍歴

私は数年前から 9 ~ 10 インチクラスのタブレットを愛用している。その遍歴は以下の通りである:

  1. iPad (第 3 世代): 初 Retina iPad だが若干動作がカクついていたのは事実
  2. ICONIA TAB A700: 今考えると当時の iPad より動作がかなり緩慢で不満だらけだった
  3. Nexus 10: 2560 * 1600 pixel で当時としてはかなりよく出来ていた
  4. Nexus 7 (2013): 画面小さくてタッチ感度もイマイチで正直使いにくかったので譲った
  5. iPad Air: もう全く以って最強だが後述の理由で妻に譲った
  6. Bungbungame KALOS: 凄く期待されていたが正直 Nexus 10 以下な気がした……
  7. Nexus 9 LTE: 今回の話。初 LTE

最初に iPad が出て画面をジェスチャしてなぞり書きしたり読書している様を見て「これで何でもできる」「新しい仕事の仕方、遊び方ができる」と主に意識高い系の人がこぞって購入したのではないだろうか。 私も第 3 世代 iPad を購入した時そんな気持ちがあったのではないかと思う。 その時 Mac で使用していた Apple Wireless Keyboard を持ち歩いてノート PC 代わりに使用しようとしたり、 スタイラスを購入して手書きのノートとして使おうとしたりした。 しかし、暫く使ってみて「タブレット端末はキーボードを持ち歩いて使ってもノート PC ほど快適ではないし、スタイラスを使っても普通の紙に書くフィーリングにはとても敵わない」と気付いてしまった。 そう、タブレット端末だけで何でもしようとするとかなり工夫しなければならず、その工夫が面倒になる。 道具というのはその都度熟考して使うのではなく、あくまで手に馴染んだ道具として体の一部のように使えなければ長続きしないと思う。

そんなわけで若干失望した為 iPad (第 3 世代) は処分してしまった。 ただ、筆者は Android アプリ開発者であり、「タブレットで見た時にどういう操作感になるのか知りたい」というのもあった。 そこで ICONIA TAB A700 というのを購入したのだが、そこで何故か割と気に入ってしまった。 期待した iPad で失敗したところで、タブレット端末とのいい付き合い方がある程度わかってきたのだと思う。

7 インチクラスのタブレットは自分のフィーリングに合わなかった

Nexus 7 (2013) が出た時に興味本位で買い換えてしまったのだがすぐに後悔した。 自分のタブレットの用途には合わないサイズだと分かったからだ。自分は以下のようにタブレットを使用している:

  • Kindle で読書
  • Acrobat Reader でやはり読書 (PDF で販売されている技術書)
  • MJ モバイルで麻雀
  • たまに他のゲーム
  • 2 ちゃん
  • ニュース

この中でも特に読書が重要で Kindle の書籍であってもモノによっては 7 インチクラスでも若干小さいと感じるものがあったりするし、 PDF に至っては画面サイズに最適化できないので最低 9 インチ以上無いと困る。

私が iPad でなく Nexus 9 を使用している理由

Nexus 9 LTE

その後何度か買い換えてきて現在 Nexus 9 に落ち着いている。 Nexus 9 は iPad Air 2 と同時期に発売されたと思うが、レビューサイトでは散々 iPad Air 2 よりスペックが劣っているのに値段がそんなに変わらないと叩かれていた。 なのに iPad Air でなく Nexus 9 を選択した理由は以下となる:

  • スマホが Android なので購入したアプリがタブレット側で使えない
  • Android アプリの動作確認をたまに行いたい

Kindle の購入だけ共有したいのであればスマホが Android で iPad でも問題ないが Google Play で購入したゲームが困る。 Android で購入し iPad でも購入し……とやっていくとどちらかでしか遊べないのがかなり不便に感じる。

やはり Nexus は安心

思えば Nexus 10 が出た時も「デュアルコアで性能が云々」と叩かれていた気がする。 しかし自分はそんな事は全く気にならずかなり気に入って使っていた。 Nexus シリーズは常に最新の OS が使用できるし、余計なソフトが一切入っていないのが素晴らしい。 というかそれが普通であってほしい。BungBungame とかひどかった。

スペックがどうのとかでなくあくまで自分の使用用途に合致しているかどうかが重要だと思う。 Nexus 9 で初 SIM フリー端末 (LTE) だったが、今は格安 SIM で月 1,000 以下で 3G ほど通信できるものがあるので昔のようにスマホでテザリングしたりモバイル Wi-Fi ルータを起動して...などという面倒なことが一切なくなり、電車内で使用するのに非常に快適になった。 しかも、今値段を見ると Nexus 9 LTE 32G が 50,000 円を切る価格で販売されている。これは結構狙い目なのではないか。

私が次買い換えるとしたら Nexus 9 の後継が出た時だろう。それくらい気に入っているし生活に欠かせないもので、毎日通勤電車内で使用している。

Stream API を割と使っている

今参画しているプロジェクトでは Java8 を使用しているのもあって遠慮無く Lambda Expression や Stream API を使用している。 特に Stream API は以前だと簡単な絞り込みをしたい場合でも for ループを回して面倒くさい書き方をしなければいけなかったのがシンプルに書けるようになっていて素晴らしいと思う。思うがやはり Scala なんかと比べると冗長に感じて仕方がないところはある……。

特に以下の collect(Collectors.toList()) は長い。もうすこし何とかならなかったのだろうかと感じる:

public static void main(String[] args) {
    // 途中で List<E> にするのに boxing する必要があるのも地味に辛い
    final List<Integer> list = IntStream.range(1, 11).map(x -> x * x).boxed().collect(Collectors.toList());
}

Scala だと以下で凄くシンプルで羨ましい:

val seq = 1.to(10).map(x => x * x).toSeq

まぁ無い物ねだりをしても仕方がない。Java で飯を食っている以上 Java の枠組みの中でなるべく綺麗なコードを書くように気をつけるしかない。

他の言語でよくやるメソッド内関数が簡単に書けるようになったけどやっぱり辛いという話

例えば PHP や Python などだと lambda 構文もあるし関数内で関数を定義する事も簡単なのでよく使う:

# f(x) 内でしか使用しないが何度も出てくるような関数を f(x) 内で g(y) として定義する事で影響範囲がわかりやすい
def f(x):
    def g(y):
        return y ** 2
    return g(g(x) + 1)

これが Java でやろうとすると Java8 以前だと無名クラスを使用しなければならなくてこれがもうとんでもなく面倒くさかった、というかやろうとも思わなかった:

public static void main(String[] args) {
    final Func<Integer, Integer> f = new Func<Integer, Integer>() {
        @Override
        public Integer apply(Integer x) {
            return x * x;
        }
    };
    System.out.println(f.apply(f.apply(1) + 1));
}

public static interface Func<X, R> {
    R apply(X x);
}

Java8 からは Lambda Expression を用いて以下で書ける:

public static void main(String[] args) {
    final Func<Integer, Integer> f = x -> x * x;
    System.out.println(f.apply(f.apply(1) + 1));
}

public static interface Func<X, R> {
    R apply(X x);
}

更にこのような 1 つの引数を受け取り 1 つの結果を返すような Interface は java.util.function パッケージに用意されているのでわざわざ自分で Interface を定義しなくてもよい:

public static void main(String[] args) {
    final IntUnaryOperator f = x -> x * x;
    System.out.println(f.applyAsInt(f.applyAsInt(1) + 1));
}

OK. これはシンプル。素晴らしい。……とは言い難い。IntUnaryOperator とはなにか?

FunctionalInterface 群の型が覚えられない...

Scala だと全部型推論できるので左辺は val と書けば良い。つまり右辺がどうなっていようが関係ない:

val f = (_: Int) * (_: Int)
val g = (x: Int) => x * x
val h = () => print("Hello")
val i = (x: String) => print(s"Hello $x")

一方、これを Java8 で書こうとすると以下になる:

public static void main(String[] args) {
    final IntBinaryOperator f = (x, y) -> x * y;
    final IntUnaryOperator g = x -> x * x;
    final Runnable h = () -> System.out.println("Hello");
    final Consumer<String> i = x -> System.out.println(String.format("Hello %s", x));
    i.accept("Baka");
}

この BinaryOperator だとか Consumer だとかを覚えないと書けない。 とりあえずひしだまさんの Functional Interface Memo を見て確認すると、以下の 5 つに大別されるのがわかる:

クラス名 概要
Supplier 引数はなく 1 つの結果を返す。供給する (supply) と覚える。
Consumer 1 つの引数を受け取り何も返さない。消費する (consume) と覚える。2 つ受け取って何も返さない BiConsumer というのもある。
Predicate 1 つの引数を受け取りその判定結果 (boolean) を返す。2 つの引数を受け取り判定する BiPredicate というのもある。Stream API の filter() に渡す際によく使う。
Operator 引数の型と同じ型の戻り値を返す。引数の個数により UnaryOperator, BinaryOperator と用意されている。
Function 引数の型と別の型の戻り値を返す。引数の個数により Function, BiFunction と用意されている。

番外で引数も戻り値もない、ただ単に決まった処理をしたいといったものは Runnable を使う。まぁこれはいいだろう。

上記 5 つの大別の中で更に Java には int, long, double, boolean 等のプリミティブ型があるので、その組み合わせぶん全て用意されている。 そこが便利ではあるが分かりにくくしている。例えば DoubleToLongFunction とか IntBinaryOperator とか、そういうものだ……。 しかし、定義しようとしている関数のシグネチャを考えて、上の表に当てはめてみれば多少は考えやすくなるのではないだろうか。つまり、

  1. 引数はあるか? -> 無いなら Supplier
  2. 戻り値はあるか? -> 無いなら Consumer
  3. 戻り値は boolean か (何らかの判定をしたいのか) ? -> そうなら Predicate
  4. 引数と戻り値の型が一緒か? -> そうなら Operator, そうでないなら Function

このチャートで適切なものが選択できるはずだ。

SHAKE SHACK (シェイクシャック) といえばニューヨーク発のグルメバーガーチェーン店で外苑前に日本初上陸した店である。 開店が去年の 11 月 13 日だそうで、やっと 2 ヶ月たったところ。 滅茶苦茶混んでいるらしかったので、一回行ってみたかったけれどもどうも並ぶのが嫌でずっと機会を伺っていた。

そして今日、たまたま出向先の意向により早上がりすることができたので、帰りに寄ってみた、という話である。

平日 15:00 にもかかわらず滅茶苦茶混んでいた

行ったのは今日の 15:00 頃。にも関わらずレジ待ちしている人が 30 人ほど。 グルメバーガーの店は数多く行ったが、こんな時間帯にこんなに並んだのは初だ。 並んでいるうちに店員からメニューを手渡され、以下のものをチョイスした:

  • SHACK BURGER DOUBLE (ダブルシャックバーガー): 980 YEN
  • FRIES SMALL (フライドポテト小): 280 YEN
  • SHACK MEISTER ALE DRAUGHT 18 OZ (シャックマイスターエールドラフト): 830 YEN

ダブルパティのチーズバーガーが 980 円か!安いな!……と思っていたら、実は全て税抜き価格で実際は1,060 円ほどだった。それでも安いが。 グルメバーガーの店はなぜかクレジットカード決済ができない店が多いが、この店はカードで決済できた。

肉肉しくて美味い、美味いが

SHAKE SHACK ダブルシャックバーガー

客席も平日 15:00 だというのにすべて埋まっており、わずかに空いているかもしれない席を探すのが面倒くさくなり入り口近くの立ち食い用のカウンターを使用。 ビールがカップに入っているが並々と零れそうなくらいに入っているので運ぶのにちょっと気を遣った。

ハンバーガーはバンズがかなり小さめでパティがかなり大きめな感じでバンズからはみ出している。 かぶりつくとゴロゴロとした肉の固まりを食べている感じがする。 美味い。確かに美味いし、しっかりと個性も出ている気がする。 もう野菜とかバンズとのハーモニーがどうのというよりも肉を食うためのハンバーガーだと思った。 若干肉が脂っぽいというか、バーガー袋にも油が染み付いている。こういうのはジャンクっぽいテイストだが個人的には嫌いではない。

ギザギザポテトも歯ごたえが気持ちよくて美味しかった。 ビールはシェイクシャック向けにカスタマイズされている?ようだが、普通のブルックリンラガーの味のように思えた。

ただやっぱり難点は店の混み具合だったり、若干客層が若年向けになっているところだろう。 大学生がかなり多いように見受けられたし、マナーがあまり良いとは言えない外国人も多い。 いい年した大人が落ち着いて食べるところかと聞かれるとちょっと辛い気がする。 どちらにしても混みすぎる。多分グルメバーガーを普段食べない層 (マックやモスに行く層) も来ており、その美味しさに感激して何度も来ているのだろう。勝手な想像だが。

これで休日やランチタイムに行ったらどれだけ大混雑しているのか。 ちょっと興味があるが、少なくとも他の店舗が出来て暫く経ってほとぼりが冷めてからでないと好んでは行きたくないお店という事になった。 今回仕方なく並んだが、私は並ぶのが大嫌いだからだ。

やっと冬らしい寒さになってきた気がする。外に出たら顔が冷たいと感じる。 寒くて朝着替えるのが辛いと感じるようになった。

しかし、今が寒さのピークだと思うのでもう少ししたら冬終わりか。早いな。

書くことが特に無いのだが会社と家を往復する日々。面白いかつまらないかと聞かれたらつまらないということになる。 会社、特に出向先で書くようなプログラムは「なんだこれ?」と思うようなものが大半で正直「面白くない」という事になるが、 趣味で書くのとそれで飯を食っていくのは別で、汚くてくだらないコードを書いたりメンテするのも仕事だ……。

まぁこれは多分この業界だけに限らず大抵の仕事は面倒くさくつまらないものだと思うので、 好きでもないことを仕事にしてしまった人は不幸といえる。

Reg-On Diner ABC バーガー

なんか立て続けにグルメバーガーで散財しているようだが、 今渋谷に出向中なので丁度そこそこ近くて食べにこれる状態なので来てみた。

Reg-On Diner はグルメバーガーファンなら誰でも知っているほどの有名店で BROZERS' 系列らしい。 駅から結構遠いのが難点で、ランチ時間帯であってもそこそこお客さんは入っているが並んで待つような事になったことはない。

写真は ABC バーガー。Reg-On Diner 看板メニューだがランチメニューには載っていない。注文はできる。 Reg-On のハンバーガーは味付けが控えめなのでトッピングを追加すればするほど味わいがゴージャスになる。 ABC バーガーなどその恩恵を多分に受けているハンバーガーだろう。

勿論チリソースを使ったハンバーガーや、種類によってはバーベキューソースを使用していたりするのでそちらも楽しめる。 バーベキューソースといっても割と控えめな感じで好みが分かれる気もするが。個人的には控えめのほうが良いと思う。

総括して、これといってものすごい特徴があるわけでもないのだが全体的に完成度が高いハンバーガーという印象。

今年初雪らしいが

3 連休明けの仕事は憂鬱だ。しかも風邪がなかなか治らないときている。

東京都心で初雪らしい。雨かと思ったが雪だったのか。 そこまでものすごく寒い気もしなかったが、これは歳のせいで寒さに鈍くなってしまったのだろうか。

クアアイナ 厚切りチェダーチーズバーガー

クアアイナ 厚切りチェダーチーズバーガー

写真はクアアイナの限定商品である厚切りチェダーチーズバーガー。 列に並んでいると注文するお客さんが結構多い。 普通のチーズバーガーと値段があまり変わらないのにチーズが目に見えて増量されるのがポイントなのだろう。

クアアイナの特徴はこのパサついたバンズとパティで、初めて食べた時はそんなに美味いとも思わなかったが やはりグルメバーガーを名乗るだけのクオリティと品格を備えていると感じた。 チェーン店で気軽に食べられるのはやはりいい。コナビールも置いてあるし。

以前紹介したヴェリタスブロイブローリーを試した。

ヴェリタスブロイの方は完全なノンアルコールビール。ブローリーの方はアルコールが 0.9% 未満含まれているローアルコールビール。 個人的にはヴェリタスブロイの方が味わいに奥行きがあるように感じた。特に後味がハッキリと違う。ブローリーの方は後味が薄い。 ブローリーの方の多少含まれているアルコール分は優位性を全く感じなかった。 それにブローリーの方はショ糖が含まれているせいか気持ち甘い気がする。

とはいえ、どちらも国産のノンアルコールビールと比べると遥かにビールっぽい味わいがする。 アルコールが含まれていないのでどうしてもビールや発泡酒と同等とはいかないが、 個人的にはこれで禁酒が出来る気がするレベルの完成度のものだった。 健康診断で肝臓の数値に悩んでいる方に是非お薦めといえる。

ただ難点は発泡酒と同等の値段の上、アルコールが入っていないので飲もうと思えば幾らでも飲めてしまうのでそんなにお金の節約にもならないところか。

最近ヤフオクでの発送方法にはこ BOON mini というのが追加された。 ファミマ店舗で配られている専用の袋に詰めて発送、受け取る側もファミマの店舗を予め指定して受け取る仕組みだ。 関東から見ると日本のそれなりの範囲が 500 円で発送できる。場所によっては 600 円かそれ以上するが。 重さは 10 kg まで OK で袋に入りさえすればよい。

これ、早速ヤフオクで発送に使ってみたのだが、すべての手順がヤフオクとシームレスに連携している:

  • ヤフオクで配送先入力完了した時
  • 店舗で発送完了した時
  • 受取店舗に商品が届いた時
  • 落札者が店舗で受取完了した時

上記の時に自動でヤフオクのステータスが切り替わり、出品者と落札者双方に通知される。 普通の発送方法だと出品者、落札者が自分でステータスを切り替える必要があった。 これは画期的だと思った。最初は。

しかし、落札者の方から「荷物が届かないので追跡番号を教えてほしい」と連絡が来た。 追跡番号?確かに、発送完了メールには荷物番号のようなものが書かれているが、これでは追跡できない。 そう、はこ BOON mini は発送店舗から受取店舗までの道筋を一切追跡できない。

しかも、今回の発送は首都圏から首都圏への発送だ。定形外郵便なら次の日かその次の日には確実に届いているだろう……。 そこではこ BOON の日数表を見て驚愕した。首都圏から首都圏への発送は 4 〜 9 日かかると書いてある。 おいおい、今時シンガポールから日本に送ってきても 4 日で届くぞ……。 これでは「荷物は確かに輸送されているのか (忘れられていないか?)」心配になるのも無理はない。

クリスマスの繁忙期というのもあったのかもしれないが、それにしても遅すぎる。 仕方がないのではこ BOON mini のお問い合わせに「なんとかしてくれ」と連絡し、何とか連絡した次の日に届いた。 しかし発送してから 7 日が経過していた。遅い、遅すぎる。

ハッキリ言って配送が遅いというのは特に落札者にとって強烈なデメリットで、正直今後これを使ってクレームを回避する自信がない。 使うなら多くの配送手段の選択肢の一つとして用意し到着が遅いので了解の上選択くださいとでもデカデカと書かないとダメだろう。

普通のはこ BOON は裏でヤマト運輸が行っているサービスなので配送は迅速。名前は似てるが全く別物だ。

風邪で寝込んでいたのでほぼ日記に書くことはない。

「加古隆 「パリは燃えているか」 太平洋戦争」を思い出して聴いた。名曲だと思う。 映像の世紀は高校時代にリアルタイムで観たが、凄く興味深く観た記憶がある。

風邪が治らないので流石に風邪薬を買いに行くことにした。 ドラッグストアの薬剤師さんに「せき・鼻水・のどの痛みがひどい」と相談し以下をお勧めされたので購入:

  • ペアコール顆粒
  • ハイスミン内服薬

ペアコールというのは風邪薬だがハイスミンというのは栄養ドリンクのようだ。しかし、高い……。 まぁ、こういうのは専門家の言うことを聞いておくのがいいだろうという事で指示通りに購入した。 「売上を上げるために栄養ドリンクも付けた」のかもしれないが、それは自分では判断できないので。

夕方からは会社の新年会があるが、風邪がひどくてなかなかきつい。

最近の記事が日記とはかけ離れたものばかりになってしまっていたので、今日は日記。

毎年恒例の風邪を引いてしまった

去年、一昨年とこの時期に会社の健康診断を入れていたのだが、 何故か毎回その時に風邪を引いてしまい、 リスケするのも面倒なのでそのまま健康診断に臨み「要精密検査」などという結果を受け取ってしまっていた。 「要精密検査」になると後日病院に行かなければならなくなってすごく面倒くさい。

今年はそれは避けたいと思い 2 月に健康診断を予約したのだが、 案の定このとおり同時期に風邪を引いてしまった。 風邪の症状も毎年同じで、熱は出ないが鼻水と咳と喉の痛みがひどい。

しかし、私は社畜なので、これでも普通に仕事するわけだ。 もう休みたいのだが、出向中の身なので気軽に休めない。

コンビニのティッシュが高い

風邪なのでティッシュをよく使う。 会社で箱ティッシュをいつも置いているが、すぐなくなるのでコンビニで補充するのだがやはり高い。 都内だと安いスーパーやドラッグストアが少ないから困る。

セブンの箱ティッシュ一箱 130 円を利用していたが、 箱 5 個セットで売ってるのも見つけたので「3 箱以上使うのを考えたら得だろう」と思い購入。 300 円オーバーだが仕方ない。

昔行ったマッドバーガー本店の ABC バーガー

マッドバーガーとは埼玉県行田市に存在するグルメバーガー店の中でもちょっと値段が高めだが、値段に見合った質のバーガーを提供する店という印象だった。右の写真がそのマッドバーガーに行った時の写真。 ABC バーガー 1,600 円。値段は高めだがアボカドはたっぷり入っておりパティは肉肉しく、バンズは特徴的なもの。とっても美味しかった。

なんと、その支店が渋谷駅近くにあるらしいとネットで出てきた。なので早速行ってみたという話を書く。 後述するが、本店と同じものを出しているわけではないようなので参考画像として右の写真を載せておく。

マッドバーガーはフランチャイズ店を募集しているらしく、その第一号店という事なのだろうか。 個人的にはチェーンになると味が落ちるので宜しくない……とどうしても思ってしまうが。

グルメバーガー店の平日ランチ

ラーメン屋などと違い、グルメバーガー店はかなり有名な店であっても、 平日ランチだと店内に入れなくて並ぶなどというケースがあまりない (知るかぎりだと Fellows に関しては平日ランチであってもかなり並ぶ)。 このマッドバーガー渋谷店も並ばずに入ることができた。むしろ店内は結構広いにもかかわらずガラガラだった (念の為書いておくが、来訪したのは 12 時台の忙しい時間帯)。

マッドバーガー本店はいかにもな田舎の小洒落たカフェ風だが、 こちらの店舗はナチュラル系な木を基調とした小綺麗な感じにまとまっていた。 店内は近くにある Reg-On Diner やウーピーゴールドバーガーなどと比べるとかなり広い。

ランチメニューを眺めてみると、プレーンなハンバーガーが 1,080 円なのに対しチーズバーガーが 1,200 円、 アボカドチーズバーガーが 1,300 円とトッピングした分がかなり安く設定されている。 右下の方に単体のトッピングの値段が書いてあるが、それはかなり高めに設定されている。

ランチだけなのかわからないが、付け合わせがポテトかサラダが選べる。 サラダはコブドレッシングかシーザーかが選べる。

とりあえずアボカドチーズバーガー (サラダ) を頼んでみた。

印象

マッドバーガー

写真左のハンバーガーの食べ方を示す札はマッドバーガー本店にもあるもので、 肉汁がバーガー袋に貯まるほどジューシーなバーガーというのがマッドバーガー本店からの印象であった。

食べてみた。ん?チーズの味が……?と思ったら、チェダーでなくモッツァレラだった。 好みの問題かもしれないが、やはりハンバーガーに合わせるチーズといえばチェダーを想像するので、 クアアイナみたいに「アボカドモッツァレラチーズバーガー」などと料理名に加えないのであればチェダーになっているのが良い気がする。 それかチェダーかモッツァレラが選択できるのが良い。

あと、ランチメニューだからなのかもしれないがアボカドがちょっと少なくてアボカドの風味があまり感じられなかった。 これも残念だった。

マッドバーガー行田本店は胡椒の風味が強いバーガー (しかもそれが心地よい) ように感じたが、 こちらは味付けがちょっと塩気が強いように感じた。 バンズが香ばしくて悪くないが本店のものと明らかに違って割と普通なタイプなのも気になる。 正直な感想として「本店よりは落ちるし近くに Reg-On Diner やウーピーゴールドバーガーがあるので辛いのでは」といったところ。 しかも本店よろしくランチメニューでないと値段が高い。

「食べ終わる頃にはバーガー袋に肉汁が貯まるほどジューシー」というのはちゃんと踏襲されていた。 まぁこれがなかったら看板に偽りありということになるが。 しかし個人的にはこれはあまり重要視していない。袋に残った肉汁を啜るといった行為があまり上品と思えないからだが。

アボカドチーズのチーズがモッツァレラチーズという誤算があったので単純に選択ミスかもしれない。後日また来訪する。

早いもので年末年始の休みも終わり、今日から仕事ということになってしまった。社会人は辛い。

実家でノンアルコールビールを貰った

正月に実家に帰った時に父に「俺は飲まないから」と以下のノンアルコールビールを貰った:

  • キリン フリー
  • アサヒ ドライゼロ
  • サントリー オールフリー

ノンアルコールビールは以前も飲んだことがあったのだが、正直「運転などするので仕方なく飲むもの」という印象が強く、 飲んでもあまり美味しいとは思えず「自分からは買わない」という結論に達したことがあった。 しかし今回ノンアルコールビールが冷蔵庫に眠っている状態だと 1 本目のビールを飲んでさぁ 2 本目を……という時に健康の為に止めて代わりにノンアルコールビールを飲んでおくというのも悪くないように感じた。

ネットで美味いノンアルコールビールを調べてみた

そうは言っても上記の 3 つはやはり水っぽくてあまり美味しいとは思えない。 どうも国産のノンアルコールビールは水あめやら甘味料やら混ぜて味を作っているらしく、正直ビールとは程遠いものになっている気がする。 アルコールは入ってないかほとんど入ってないがビールにそれなりに近いテイストのものはないだろうか、と思い探してみたら以下のものが気になった:

コンビニを廻ってみたが

コンビニに上記の「サッポロ プレミアムアルコールフリー」くらいはあるのではないか、と思いセブン、ローソン、ファミマを廻ってみたが全く無く、 あるのは一番の売れ筋の「サントリー オールフリー」とキリンやアサヒなどのビールテイストとは程遠いノンアルコール飲料ばかりであった。

仕方なく「サントリー オールフリー」を購入し自宅で改めて味を確かめてみた。 やはり、ノンアルコールビール特有の味がして若干甘ったるく、薄い。悪くはないがこれを毎日飲むのはキツイと思う。 アサヒ ドライゼロのほうが若干味は上のような気がしたが、どちらにしても五十歩百歩のレベルだろう。

しかし、今の時期会社の健康診断などもあり肝臓の数値が気になるところで、健康の為にノンアルコールビールを入れておくのにも興味が出てきた。 今後、上記に挙げた「ノンアルコールだがビールに近いテイストらしい飲料」を試していこうと思う。

昨日今日と妻が子供たちとママ友の所にお泊まりに行っているので、若干風邪気味なのも相まって自宅に引き篭もってプログラミングを行っていた。 いずれ必要になるので Blog にコメント機能を付加していた。

コメント機能を追加するにはスパム対策が必須

自前の Blog にコメント機能を追加する場合に考慮しなければならない最重要の問題はスパム対策だ。 何も対策をしない場合、手塩にかけて作った Blog が奇妙な URL やメールアドレス、英語などに汚染されたコメントで荒らされてしまう。

日本人のみ投稿できればいいのであれば、投稿する際に日本人しか回答不能な質問を付加して答えさせるのが有効だ。 例えば「十三たす四=」などといった感じだ。この場合 17 が飛んでくればコメントの投稿を許すこととなる。 まぁこれでもいいのだが、折角 Google が提供している画像認証用のライブラリを見つけたのでそれを使ってみた。 reCAPTCHA という。

reCAPTCHA で認証後に Ajax で送る場合

この記事の右下に「コメント投稿」というボタンがあると思うのでそれを押してみてほしい (ただボタンを押しただけではコメントは投稿されないので安心して欲しい)。 そうするとダイアログが開くが、画面左下に「私はロボットではありません」などというチェックボックスが表示される。 これをチェックすると時にはそのままで「人間であることの証明」が終わり、時には追加の証明手段として画像認証が表示される。 どういうロジックになっているのか分からないがすごい。

これの実装の仕方はこの解説サイトがものすごく分かり易かったので興味があればそちらを参照して頂きたい。 あと reCAPTCHA 公式を見るのもいい。

要するに JavaScript のライブラリを読み込んで指定された HTML タグを書くとそこに認証用のビューが表示される。 そこで認証を行うとフォームに g-recaptcha-response という ID, クラスの HTML 要素に認証済を示すトークンが埋め込まれるので、それをそのまま POST するなり Ajax で送るなりすれば良い。そんなに難しくはなかった。つまり jQuery だと以下で認証済トークンが取れる:

var gRecaptchaResponse = $('#g-recaptcha-response').val();

注意点として、この認証済トークンを POST (Ajax) した先でこのトークンが有効なものかの検査 (https://www.google.com/recaptcha/api/siteverify?secret={Secret key}&response={認証コード} に対し GET リクエストを送り戻りの JSON を見る) を行うが、 この g-recaptcha-response は使い捨てなので 1 回チェックを行ってしまうと次からは不正を示す {success: false} が返却されてしまう。 なのでこの検査はバリデーションチェック等がすべて終わりこれさえ通れば正常終了という箇所で行うのが良い。

CsrfViewMiddleware

Django 1.9 の場合最初に manage.py startproject した際に既に settings.py に以下のように CSRF 対策用のミドルウェアが組み込まれた状態となる:

MIDDLEWARE_CLASSES = [
    ....
    'django.middleware.csrf.CsrfViewMiddleware',
    ....
]

これを使う場合は以下のように form タグの中に CSRF 対策用トークンを埋め込む記述を行う:

<form action="." method="post">{% csrf_token %}

正しい CSRF トークンを付与していなかった場合 403 Forbidden が返却される。

jQuery で CSRF トークンを付与したい

最近よくあるのが POST する際に Ajax 通信にして JSON で結果を受け取りエラーだったらそのまま画面にエラーを表示し成功だったら画面遷移を行うといったものだ。 これを Django で使用しようとすると上記 CSRF トークンが邪魔になる。

不要な場合は CSRF ミドルウェアを除去する

他のライブラリを使用したトークンチェック等行っている場合は組み込みの CSRF チェックは必要ないので settings.py の 'django.middleware.csrf.CsrfViewMiddleware', の記述を削除する。

XMLHTTPRequest のヘッダに CSRF トークンを付与する

幸いこのあたりは Django 公式ドキュメントに書いてある。

// using jQuery
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie != '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) == (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie('csrftoken');

のように CSRF トークンが取得できるので以下のように Ajax 時に付与する:

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

昼からジンギスカン

ジンギスカン

近くのジンギスカン屋でジンギスカンを食べた。昼からビールも飲んでしまった。 冬休み中は割と贅沢三昧をしてしまったようだ。体重の増加が気になる……。

本当はインド料理屋にしたかったのだが閉まっていた。近くの定食屋も閉まっていた。 やはり 3 が日はお休みする店が多いようだ。

WiMAX と格安 SIM について

妻の弟が自宅に光回線を引くという事で少し相談に乗っていた。 彼は現状 iPhone で頑張っているが YouTube やビデオ電話など使うので月の容量が足りないとの事。

しかし、昔 (ADSL が生きていた頃) は光回線が引けるのなら光回線一択だった気がするが、 今は WiMAX やら格安 SIM やら出てきたので、特に一人暮らしで家の電話が不要の場合は光回線にするのは得策ではない気がする。

参考までに我が家の現状の使用料金は以下のようになっている:

  • au ひかりの基本料金 5,200 円 / 月 (税抜)
  • au ひかり電話サービス 500 円 / 月 (税抜)
  • au ひかり無線 LAN 親機レンタル使用料 500 円 / 月 (税抜)

なので結局 (5,200 + 500 + 500) * 1.08 = 6,696 円 / 月 である。今考えるとかなり高い。 だが、我が家の場合は家の電話が必要なので au ひかり電話サービス (IP 電話) の契約を余儀なくされている。 そのシガラミが無ければ WiMAX や格安 SIM を検討した方がいいと言える。

WiMAX 2+

月々 4,300 円程度で使い放題。但し 3 GB / 3 日を超えると速度制限がかかるようだ。 つなが〜るネットの情報が秀逸だった。 WiMAX は UQ WiMAX 公式から頼むよりプロバイダ経由で頼んだほうがキャッシュバックなどが付くのでお得。 GMO が一番お得だがトータルバランスを考えると BIGLOBE か。口座振替が出来るというのがポイント。

WiMAX 2+ は 15 日間無料でお試しで使用することができる。 本契約したけど実は自宅では使用できなかったというトラブルを回避するために有効なのではないだろうか。

格安 SIM

まぁこれが選択できるなら今の時代はこれが最強だろう。 U-mobile が良さそうに見える。LTE 使い放題で 2,480 円 / 月。音声通話付きでも 2,730 円 / 月。安すぎる……。

MVNO SIM を使う場合は当然 SIM フリースマホを入手しなければならないのでそれがネックではある。 Android ならば安い端末もあるが SIM フリーな iPhone などかなり高い。 とはいえ iPhone ならば入手さえしてしまえばかなり高く売れるので暫く使ってから次のに買い換える場合でも下取りに出せばそれほどロスはない。

気になるのは速度だが実効速度でも 1Mbps 程度は出ているらしい: 格安SIMとスマホ比較

こういう格安 SIM も MNP できるので DoCoMo / Softbank / au から電話番号そのままで乗り換え可能。私は au から乗り換えた。

私は今 Nexus 5X で BIGLOBE SIM を挿しているが BIGLOBE 光も契約しているので 200 円引きになって 1,400 円 / 月 (税抜) で運用出来ている。 Nexus 9 の方にも SIM を挿しているがそちらは 700 円 / 月 (税抜) だ。3G までだがゲームと Kindle 読書ぐらいしかしないので全然足りている。

新年あけましておめでとうございます。今年もよろしくお願い致します。

実家に帰って初詣をした

正月のおみくじ

東京勤めの私が今住んでいる所は東京寄りの埼玉県内なのだが、昨年祖父が亡くなったのもあって前よりも頻度を上げて帰省するようにはしている。 そして、本日は元旦の為実家に帰り父と近くの神社に参拝を行った。

珍しく子供を除く皆さんでおみくじを引いてみた。私と妻の弟は大吉を引いた。正直こんなものは眉唾なのだが、いい結果を引くとそこそこいい気分になってしまう辺りが論理性を欠いている (或いは人間らしさを残している) と言える。写真は私と妻のおみくじである。

故郷にある寿司屋で昼食をしたのだが、元旦でもやっている飲食店が結構あるのに驚いた。 やはり昨今ではおせち料理だったり雑煮、おはぎやお汁粉などを食べずに普通のものを元旦から食べたいという若い人が多いのだろう。 かくいう私も、正月にそういった正月料理を何年と食べていない……。

毎日書く日記を昨年末からこまめに作成していた

また自分で Blog システムを作ったので本日 2016-01-01 から日記を開始する。今回は以下の構成となる:

  • CentOS 7.1
  • Python 3.4
  • Django 1.9

昨今では Markdown で記事を書くのが増えているので、こちらの Blog システムも本文は Markdown で書けるようにしてみた。 markdown2 ライブラリを使用している。

昔学生の時は個人ホームページで毎日日記を書くことが出来ていたのを思い出して、それを出来るだけ再現してみた。

  1. 画面最上部にカレンダーを配置し、書いた日時には色が付けられる。書いてない日があるとすぐわかる
  2. ページング単位を年月単位とした。つまり一度にその月の日記がすべて表示される。デフォルトでは最終記述年月の日記がすべて表示される

しかし今の Web 開発は使いようによってはかなり省力化できるようになっていると感じる。まず Bootstrap を使っているのでレスポンシブデザインに対応している。つまりスマホでもタブレットでも PC で見ても画面サイズに合わせた適切なレイアウトで表示するようになっている (PC のブラウザで意図的に幅を狭めれば確認できる)。また Retina.jsSwipebox を使用して高解像度環境でも綺麗に画像をサムネイルやスライドショーで見せられるようになっているし、記事や画像の投稿は Django の admin サイトを使用しているので自分ではほぼ実装せずともフレームワークが勝手に作ってくれる。個人 Blog を作るような要件だと最高だ。

文章にその人となりと精神年齢が出る

仕事をしていて良くあることだが、口で喋ると案外まともなのにメールや Slack 等で文章でやり取りすると誤字脱字や支離滅裂で理解不能な文章を書く人が結構いる。 つまり普通に喋るだけより文章を書かせた方がその人の本質を見破る助けになる気がする。

文章を書く力をもっと鍛えたい。日記はその為の格好の練習材料と言える。 人が何かを続けるにはモチベーションが不可欠だが、今は Web があるので以下の点で有利だ:

  • 知り合い以外にも偶然 Google で検索したりとか SNS から飛んできたりとかで読者が自動的に増えていく
  • 自分好みの Blog システム (普通は WordPress だろうが私は自作している) が使用できる
  • このサイトではやっていないが広告を埋め込むことで小遣い稼ぎにもなる

私はインターネット黎明期の 1999 年 6 月から日記を書いており、その後数年間は毎日日記を欠かさず書いていた。 その後残念ながら個人ホームページが廃れてきてしまった頃に Blog に移行し、 更に mixi や Twitter の台頭によりそちらにシフトした為最近までは本当の意味での日記 (毎日継続して書くもの) が書けていなかった。

2000 年あたりの日記のログが残っているので恥ずかしいが 1 件貼ってみる:

今日は飲み会に参加。飲んでる途中は至って普通でしたが、
最近飲んでないのと寝不足なせいか、悪酔いしました
持ってきてよかった、頭痛薬!!

その後、友人宅でサンマを打つ事に。
何故か毎回倍満(しかもドラ7ばかり)をキメられ、敗北路線を突き進みました。
私も満貫手でチクチク攻めるのですが、そんなので敵うはずがありません。
今日はついてね~。って叫びたいけど、言えない。所詮は負け犬の遠吠えなのさ。

こんな感じだ。これが 2000 年 10 月 27 日の日記。当時大学生。これでも恥ずかしいので内容がまともな方の日記を貼っている。 頭の回転自体はこの時より鈍っているに違いないが、この後いろいろありすぎた。学生と社会人の壁は厚い。