| @技術/プログラミング

関連記事に画像を表示するようにして喜んでいたが、先月の AWS の請求額を見てビックリ。普段の 15 倍くらいの金額になっていた。デイリーの利用料金を見ると関連記事に画像を表示するようになった日から高くなっている。

CloudFront 転送量

このブログの画像は S3 に置いてあって CloudFront から配信している。これまでたくさん写真を掲載しても特にコストは高くなかった( Route 53 の費用など含めても $3 くらい、転送量だけだと $1.5 くらいだった)のが、転送量だけで $30 オーバーになっていた。ブログのサーバー代は Adsense 広告と Amazon アフィリエイトでまかなうつもりでやっているので、これでは完全に赤字になってしまう。

なぜ高くなったのかというと関連記事にサムネイル画像を表示することで、 imageproxy から CloudFront へのアクセスが発生するようになったからのようだった。こんな感じ。

image-data-transfer-infrastructure-1.png

imageproxy にもキャッシュの仕組みはあるが、 CloudFront が返す Cache Control ヘッダーの内容を理解せず決め打ちの時間でキャッシュを Expire させるので効率が悪い。

恐らく以下のように画像関連のインフラは AWS に寄せるのが一番効率的だと思う。Amazon の優秀なエンジニアが作ってる CDN が一番前段に出てブラウザーからのリクエストに答えるのがもっとも効率的に画像を配信できると思う。

image-data-transfer-infrastructure-2.png

ただ個人のブログレベルでここまでやるのは割に合わない感じがしたのでとりあえずは以下のような構成にした。

image-data-transfer-infrastructure-3.png

Nginx の proxy cache を使う。

キャッシュ時間は長めにとって 30d にしておいた。

あわせてキャッシュの HIT 率を計測するようにした。ログに $upstream_cache_status を書き出すようにして、 awk で定期的に集計するようにした。こんな感じ。

cat log/access.log \
  | grep 'cache_hit:' | grep -v 'cache_hit:-' | cut -f16 | sort | uniq -c \
  | awk '{
      if ($2 ~ /HIT/) {
        hit = $1
      };
      if ($2 ~ /EXPIRED/) {
        expire = $1
      };
      if ($2 ~ /MISS/) {
        miss = $1
      };
      sum += $1
    } END {
      hit_rate = hit/sum*100;
      expired_rate = expire/sum*100;
      miss_rate = miss/sum*100;
      print "HIT\t"hit_rate"%\nEXPIRE\t"expired_rate"%\nMISS\t"miss_rate"%"
    }'

こいつを Lokka の Dashboard に表示させる。

キャッシュヒット率

加えて、 Google の以下の記事を参考に、画像の遅延読み込みを行うようにした。

とりあえずはこれで様子を見たい。いまのところ、ちょびっとずつ転送量は下がってきているような感じがする。もうちょい下げたいところ。

しかし、画像の配信で毎月 $30 もかかるようであれば自前で画像をホストするのは諦めて Flickr に金払って PRO プランを継続した方が安いなと思い始めてしまった…。 Google Photos でも良いが、 Exif がわからなくなるのと埋め込み用の画像を取得する作業(公開用のアルバムを作ってそこに埋め込みたい写真を入れていく必要がある)が面倒くさいので移行に踏み切れない。

| @WWW

五円

以前書いた Typinator 、 Version 8 が出ていたが有償アップグレードだったのでケチって Version 7 を使っていた。

Version 7 でも全く問題がなかったのだが、出来心で macOS を Catalina にしたところ起動しなくなってしまった。どうも 32bit アプリケーションだったみたいだ。 Version 8.2 以降は Catalina 対応しているみたいなので 1,500 円払って新バージョンにアップグレードした。

最近、いろんなソフトウェアがサブスクリプション形式になってきている。開発者としてはサブスクリプションにすることで財務が安定するのだろうけど、継続的にお金を払わないといけないのはソフトウェアを利用開始するにあたって結構なストレスになる。

最近、クリス・アンダーソンの『 Free 』を読んだけど、その中でマイクロペイメントはうまく行かないと書いてある。お金を払うに値するかどうかの判断自体がストレスで、そこに心理的なコストが発生してしまうからだ。だったらフリーにしてしまって、別の方法でお金を得た方が良いというのが筆者の主張。

サブスクリプションは買い切ると高いものを数百円から 1,000 円におさまる程度の月額利用料で使えるようにしたという意味で、買うかどうかの判断のストレスを軽減させたとは思うが、サブスクリプションが増えていくと毎月 1,000 円のサービスにすでに二つくらいは加入していて、その上でさらに払うべきかという問題になってくる。こうなると判断のコストは高くなってくる。やっぱり買い切りがいいなと個人的には思ってしまう。

PayPal で購入手続きを済ませると、開発元の Ergonis Software からライセンスキーが送られてきた。これでまた 2 年間くらいは月額利用料のことを気にせず安心してソフトウェアを利用できるという安心感と、自分がこのシリアルキーを購入することでインディーデベロッパーの懐にいくらかのお金が入ったんだという晴れ晴れとした気持ち。 20 年以上前から続くこのシェアウェア購入とアクティベーションのフローは体験として悪くない

| @WWW

飾り瓦

以前、 OGP を読み込んでキャッシュする仕組みを作ってたけど、こいつをアップデートして iframe として静的な HTML を読み込むバージョンに作り直した。 URL をクエリパラメーターとして渡すと相手方のサイトにアクセスして OGP を読みに行き、プレビュー用の HTML を生成してキャッシュする。いまは Lokka Plugin として作ってるけどこいつはブログアプリケーションと密結合する必要はないので独立した Web アプリケーションにしてもよいかもしれない。

ブログにリンクを張ると OGP を展開する仕組み、いろんなサイトやサービスで独自実装されててもったいないと思う。 Facebook が OGP の仕様を作ったけど利用するかどうかはリンク元次第だし、 Twitter は Twitter Card という独自の仕組みを作ってる。この辺はいい感じに一本化して欲しさがあるが、大人の事情で多分できないだろう。

ということでグローバルな OGP 君があったら良いだろうと思う。 OGP 君は一枚噛ませるだけで OGP 関連の面倒なこと(リンク先サイトのOGP タグ読み込み、 OGP によるプレビュー生成、生成したパーシャル HTML のキャッシュ)などをやってくれる。様々なサイトでキャッシュが共有されるのでインターネット資源が有効活用される。OGP 君運営者は様々なサイトに script タグなり iframe タグなり1を埋め込めるので、そこでサイトの利用状況などを副産物としてゲットすることができる。 Google あたりだったらこの辺の情報を金にできそう。

ちなみに同じようなことを考えた人はすでにいて Embedly というサービスがあるようだが、これはリンクを張る側からお金を取る仕組みのようでいまいちイケてないと感じる。見栄えの良いリンクにしたいのはリンクする側ではなくどちらかというとされる側なはずなので、リンクされる側からお金をもらうような仕組みの方が良いはず。


  1. iframe はセキュリティ上、異なるドメインのものを埋め込むのはまずかった。やるなら script タグで動的に DOM を生成するタイプのものだろうなぁ。 

| @ブログ

関連記事

各記事の一枚目の画像をカバー画像とみなすようにして、関連記事にサムネイルを表示するようにしてみた。画像があるだけで記事をクリックしてみたい感が高まると思う(残念ながら Google Analytics で見る限り直帰率は改善してない)。人間は、文字だけを読むよりもイラストや画像など視覚的な情報を一緒に見ることで物事の理解度が高まると本で読んだ。自分で過去記事を読み直していても画像があると関連記事をクリックしてみたくなるし、満足感のある改修だった。

なおカバー画像の判定処理は記事本文を読み込んだ上で正規表現で調べているので多分重い(ベンチマークを取ったらタイトルを表示する処理に比べて二倍くらい遅かった)のだけど、関連記事表示部分はキャッシュしてるのでそんなに体感速度は悪化してないはず。

| @料理/食事

TKG やりましたので報告です。

卵黄

Continue reading...

| @料理/食事

DSC_3658.jpg

2018 年から 2019 年にかけてよく挽肉料理を作って食べた。最初はキーマカレーから入って餃子になり、最終的にはラザニアに落ち着いた。ラザニアを作るようになってからはラザニアしか作ってなかったが、餃子アドベントカレンダーというものを発見して久々に餃子を作ってみたくなったので餃子を焼いた。低所得ゆえ餃子の名店食べ歩記などではありません。一般人の普通の餃子に関する考察です。

Continue reading...

| @雑談

清澄み

会社の飲み会とかであれば参加するけど、基本的に外で酒を飲むのをやめた。厳密には 3 ヶ月に一度くらいは行ってるかもしれないけど、以前月 2 回くらいのペースで飲みに行ってたのをやめた。主に理由は二つあって、金がもったいないと感じるようになったのと、はちゃめちゃに飲んで二日酔いになり、翌日半日くらい使い物にならないのがもったいないと思うようになった。おっさんになると酒の飲み方が尋常じゃなくなって、自分はそんなに飲まなくても一緒に飲みに行くおっさんたちがめちゃくちゃ酒飲みだとこちらもつられて飲んでしまって、二日酔いにはなるし金はなくなるしで全くいいことなかった。飲んでるときは楽しくてわーわー騒いだり愚痴を言ったりしてすごく生産的な時間を過ごしているような気がするんだけどそれは全て幻想で、翌日は寝不足でズキズキと頭が痛み、仕事の日だろうが休みの日だろうが半日くらいは頭が使い物にならず無為に時間を過ごしてしまう。老い先短いのだから時間は有効活用しなければならないと思って、飲みに行くのをやめた。

とは言っても家では普通に缶ビール一本程度を飲むし、何なら仕事の帰りに缶ビールを買って電車待つ間に飲んだり、仕事帰りに海岸に行って飲んだりしてる(クズっぽい)。ただ一晩で何千円も飲み代に使うような酒の飲み方をやめた。

かわりといってはなんだけど、最近は昼ご飯を会社の人たちと食べに行くようになった。毎日外に食べに行くと飲みに行くのと同じくらいお金がかかってしまうけれど、一回 600 円とか 700 円くらいの外食を週に一、二度やるくらいだったら一月で 5000 円くらいにしかならないし、それで親交を深められたら安いものだと思う。二日酔いにもならないし。

というわけで今年やってよかったのはむやみやたらに酒を飲みに行くのをやめたことでした。

この記事は 今年やってよかったこと Advent Calendar 2019 2 日目の記事でした。