| @Mac/iPhone

旅行や街歩きに出かけたとき、移動軌跡が地図上に表示されるとその時何をしていたのかが思い出せて便利になると思う。例えば知らない街に旅行に行った数日後にこんな状況になったことはないだろうか。「昼飯を食ったあとに食器屋に行って良い皿を見たんだけど迷って買わなかったんだよなぁ、あれはなんて店なんだろう、ネット通販やってるかな🤔」。自分はよくある。こういうときに位置情報付きの行動ログが残ってれば店名を探り当てやすくなるし、目当ての商品にたどり着ける可能性が高まる。

自分は今のところ Twitter 、 Instagram への投稿と Swarm へのチェックインを IFTTT 経由で Day One に自動投稿しているので、それらの情報が手がかりにならないでもないが、それでもそのときの自分が Twitter なり Instagram なり Swarm なりに何らかの情報を投稿していないと Day One には何も残らない。やはり何らかの行動ログ的なものが記録されている方がいい。

とはいえ旅行や町歩きのときに意識的に行動ログの取得を開始するのは難しいと思う。旅行中、街を散策する前に iPhone を取り出して何らかのアプリケーションを起動し「開始」ボタンを押したりできるだろうか? 気がついたときには随分行動してしまったあとで「今から記録をとってもね😔」という感じになるのが現実だろう。この手のツールはバックグラウンドで勝手にログをとっといてくれるのが重要だと思う。

何か良いアプリはないものかと App Store で調べてみたところ、 SilentLog というやつが見つかった。評価は良かったがバッテリーの減りが速いとある。インストールしてみたところ確かにバッテリーの減りが速くなる。よくよく考えたら Google Maps のタイムラインや Day One でもバックグラウンドでの位置情報の取得はやってるので似たようなことを複数のアプリでやるのは効率が悪い。

とはいえ移動したログを一番かっちょよく見られるのは SilentLog だった。こんな風に一日のタイムラインを手軽に振り返ることができる。朝家を出て電車に乗り、9時から18時まで職場で仕事をしてなどがすぐわかる。休みの日に出かけた場所も意識せずに記録されていく。その日 iPhone で撮った写真も表示される。

SilentLog

特に良いのが1日の行動ログをほかのアプリやサービスに書き出せること。 Google Maps のタイムラインはエクスポート機能がないし、 Day One の Activity Feed は一定期間たつと消えてしまうので残しておきたいなら意識して記事を作成しないといけない上に、記事にしたとしても位置情報の履歴は残らない。

Google Maps and Day One.png

その点、 SilentLog は行動ログが地図上に表示された画像を手軽に書き出せる。とても便利なのだが、この機能を使うには App 内課金で有料チケットを購入する必要があるようだった。 240円/30日で年払いだと 1900 円とのこと。

位置情報の収集や書き出し、気持ち悪いと感じる人には気持ち悪いこと極まりないだろう。またもし個人を特定できるかたちで流出して誰かに見られてしまったら非常にまずい(浮気中の人など)。加えて SilentLog を作っている会社 はユーザーの位置情報データを売っているようである。おそらく「年収 XXX 万円くらいの 30-40 代の男性が毎週何曜の何時に新宿駅に何人くらいいる」みたいなデータをデパートとかに売ったりするのだろう。 DMP の位置情報版といったところか。個人を特定できないようにはなってると思うがあまりよい気持ちはしない。

とはいえ自分でも忘れるような行動の履歴をスマートフォンアプリが取っておいてくれてあとで振り返られるというのは絶対に便利だと思う。日記は書いておくと便利だけど書くのが非常に面倒くさい。行動のログから自動で簡易的な日記にしてくれてバッテリーの消耗が穏やかなアプリがあったらうれしいなぁ。(結構個人のプライバシーを尊重する) Apple がそういうのつくってくれないかな。

| @旅行/散歩

DSC_3608

子どもがてっちゃんなので春の山口に引き続き SL を見る&撮るという目的で人吉に行った。自分が子どもの頃に阿蘇を走っていた SLあそBOY が老朽化のため立野の急勾配を上れなくなり、熊本と人吉の間を走る人吉号として余生を過ごしているのだった。

DSC_3525

朝早起きして福岡の家を出て 9 時半頃に熊本駅に到着し、駐車場に車を止めて熊本駅から SL に乗った。熊本駅では写真撮影コーナーがあって、乗務員の人にシャッターを押してもらって家族写真を撮ったりできる。カツアゲに怯えながら熊本駅近くの塾に通っていた中学生の頃が懐かしかった。

DSC_3502

SL 人吉号は SL やまぐち号よりも内装がしゃれてて綺麗だった。やまぐち号の車内は何となくすすけていて、乗車後に鼻をかむと黒い鼻くそが出てきたりしたけど、人吉号の車内は清潔かつモダンで冷房も効いており快適そのものだった。鼻くそが黒くなることもなかった。しかし人吉号は車内販売が充実しておらず、ちょっと何か食べたいと思っても飲み物と甘い物くらいしかなくてその点は不満だった。やまぐち号は乗務員の人が回ってきてスナック菓子や酒のつまみっぽいやつなど割と豊富に食べ物があった。

DSC_3504

熊本県出身ながら熊本駅以南に列車で出かけたことはほとんどなかったので、宇城や八代の平野部を走る列車の車窓は新鮮だった。緑の絨毯を SL で進む感じだった。

DSC_3513

人吉に着くまではよかったけど、人吉駅に着いて駅前の定食屋で適当に昼飯を食べ、予約しておいたレンタカー屋に駅まで迎えに来てもらってから雲行きが怪しくなってきた。レンタカー屋が宿から遠い、借りたレンタカーに USB ポートが付いていない、シガーソケットに付ける USB 充電器を忘れてきた、 Anker のモバイルバッテリーがすっからかん状態だったため iPhone の順電ができないことを嫁さんにとがめられ大げんかになり、撮影に行く途中で車を降りて別行動をとった。

DSC_3565

結局自分の iPhone も充電切れになりそうだったので、猛暑の中荷物とカメラを抱えて 2km くらい歩いてたどり着いたナフコで 2000 円もする怪しい USB 充電器を買って充電できそうなスポットを探し、近くのマクドナルドに入店してコンセントを確保し狂ったように充電しまくった。ゴミみたいな 3 時間だった。会社から課題図書として指定されていた『顧客が熱狂するネット靴店 ザッポス伝説』を読んでいた。わお。

SL 撮影から戻ってきた家族と合流し、レンタカーを返して宿に向かった。三連休でどこも混んでいるなか、三人で 1 万円ちょいで泊まれる格安の宿だった。いつか自分も元同僚の taketin さんのように一泊 2000 円の宿なのに 34000 円使うような豪遊をしてみたい。

この宿は場所はよいけど温泉は付いておらず、かわりに近隣の温泉の入浴券がもらえた。近くの球磨川沿いのあゆの里というホテルの温泉に入らせてもらうことにした。ここがすごく眺めがよくて、しかも 19 時までに入れば脱衣所で生ビールが無料で飲めるという謎のサービスも付いていた。最高すぎてここに泊まりたいと値段を調べてみたら一泊 30000 円くらいして到底庶民が泊まれるような宿ではなかった。

IMG_3419IMG_3415


人吉温泉 清流山水花 あゆの里

風呂から上がってから夕食をとる店を探したがなかなかよい店が見つからず、思い切って入った店は味はよかったが少々お高い店でげんなりした気持ちで宿に帰った。

翌朝、朝食付きプランにしていたので食堂に朝食を食べに行ったが食堂は狭くまたテーブルもセッティングされておらず少々待った。うまいのかまずいのかよく分からないまま食事を終えてデザートにスイカを食べたようとしたところ異臭がする。悪くなっていたようだった。つらい。

海の日の三連休で異常に暑かったが人吉まで来て観光しないわけにはいかないので街を歩いて回った。とても寂れた感じがしたが、なかなか味わいのある街並みだった。少し前までストリップ劇場があったらしいスカイビルというビルが何とも言えない雰囲気を放っていた。

DSC_3567

IMG_3436

DSC_3606

DSC_3604

城下町の鍛冶屋町というところを歩いているとファイナルファンタジーとかに出てきそうな包丁屋があり嫁さんが包丁を買った。恐ろしくよく切れる包丁で「あぁ俺は多分この包丁で刺されて死ぬんだろうな」と思った。その先にはみそ・しょうゆ蔵があり、味噌と醤油も買った。中の方まで自由に見学できる蔵で真夏なのに中は涼しく不思議な感じがした。お茶と漬け物を出してもらって小休止した。

DSC_3580

DSC_3588

DSC_3596

その後タクシーで駅前まで移動して青井阿蘇神社にお参りし、 SL がターンテーブルで回転するところを見物しようとしたが時間をミスってそのシーンを見逃してしまう。これでまたアホみたいに怒られた。

DSC_3624

DSC_3637

DSC_3643

慌ただしくお土産を買い、弁当を買って再び熊本に戻る SL 人吉に乗ろうとするが、なんと時間が中途半端過ぎて駅弁が売り切れ状態であり、いなり寿司を二パックしか買えなかった。往路同様、人吉号の車内販売はしょぼしょぼなので結局家族全員ひもじい状態で熊本駅まで二時間堪えなければならなかった。途中の停車駅でサバ寿司の駅売りがありこれを買って食べたが 800 円もするのにちょびっとの量でひもじさに拍車がかかった。

DSC_3646

帰りも記念写真を撮ったり景色を眺めているうちに熊本駅に到着し、車に乗り換えて熊本ラーメン(黒亭)を食べてから福岡へ帰った。初めて金峰山の西側、有明海沿いを運転したが夕日がものすごく綺麗だった。道は狭いところがあるものの、迫力のある景色が見られてなかなかよいドライブコースだと思う。

DSC_3658

KPT

Keep

  • 出身県でも地元から遠い地方にはなかなか行かないので足を伸ばすことができてよかった。
  • 熊本は阿蘇以外にもいっぱいいい温泉地ある。

Problem

  • 予定がぐだぐだ
    前回の山口旅行のときは家庭内 Kibela を活用して綿密にスケジュールを組でいたが、前回とは違って転職したばかりで慣れないこともあり事前に十分な計画を練ることができなかった。若かったり子どもがいなかったりなら場当たり的な旅行でも面白いかもしれないけど、子連れだとそれなりに事前調査してから行かないとばたばたになってしまう。

  • 酒が飲めない
    途中まで車で行って列車に乗るタイプの旅行は運転をしないといけないので列車の中で酒が飲めないのがつらい。山口のときも今回も、嫁さんだけ列車の中でうまそうにビールを飲んでいて気が狂いそうになった。

Try

  • 旅行前はきちんと計画を練る。
  • Anker のモバイルバッテリーは前日寝る前に確実に充電しておく。
  • レンタカーに乗るときはシガーソケットから充電するやつを忘れない。

このどうしようもないチラシの裏のような日記は旅行 Advent Calendar 2017 - Adventar 8 日目の記事( 1 日遅れで書いています、すみません)でした。 9 日目は nayo74 さんです。

| @Mac/iPhone

Mac の Day One を 2.1.8 にしたら日本語の文章を入力できなくなってしまった。正確には入力出来なくなるわけではないが、日本語を入力して変換したあと確定すると変換した文字列が選択済みの状態になり、続けて文字を入力しようとする消えてしまうというもの。こんな感じ。

なんか文章を書きたいと思っても入力できなくなるのきつい。最近は iPhone でも Mac でも読んだり書いたりできるのが便利で Vim を使わず Day One に直接文章を書くことが多くなっていた。書けないとなると結構ストレス溜まる。はよ直して欲しい。

追記(2017/05/08)

2017/05/04 に修正版リリースされてたっぽい。試してみたところ直ってた。

スクリーンショット 2017-05-08 10.41.46.png

| @写真

古い MacBook Pro の SSD がいっぱいになり写真が取り込めなくなっていたので外付け HDD を購入して写真は外付けに退避させた。母艦 Mac の SSD の空きが少なくなってきてるせいで写真を撮ることを控えるようになってしまっていたが、 3TB の外付けにライブラリを移したので本体側の空き容量を気にせず写真をばしばし撮れるようになった。これをきっかけに、いくつかのブログで目にしていた Google Photos を試してみたけど確かにこれは便利だった。Apple の写真( Photos.app )と比較しながら思ったことを書いてみます。

Google Photos への写真のアップロード

Google Photos を使うためにはまず Google Photos に画像をアップロードしないといけない。ブラウザーからちまちまアップロードする方法もあるが、 アップロード用のソフト が用意されているのでそれを利用した。名目上はバックアップということになるらしい。 20000 枚近い画像をアップロードするのに二日くらいかかった。アップロードに失敗することもあるけど、失敗したアップロードがあったときには通知してくれてリトライもできるのでおそらくすべての画像をアップロード出来たのではないかと思っている。楽ちん。

写真の内容を文字列で検索できる

こんな感じで「肉」と入力すると肉っぽい写真が表示される。画像認識処理をしてあって、個々の画像に対してタグ付け的なことがしてあるのだろう。

Google Photos で「肉」と検索

試しに Photos.app の方でも「肉」で検索したら肉の写真が表示されるようになってた。なんと Photos.app の方でも画像認識処理を行っているようだった。全然話題になってない気がする…。ドーナツの写真がヒットしているのはご愛敬。

Mac Photos.app で「肉」と検索

Google Photos では「ギリシャ」で検索するとギリシャの位置情報が付与されている写真に加え、どう考えてもギリシャにしかない建築物(アテネのパルテノン神殿など)が写ってる写真を検索結果に含めてくれる。賢い。

Google Photos で「ギリシャ」と検索

さすがにこのような機能は Apple の Photos.app の方にはないみたい。「ギリシャ」で検索しても、ギリシャに行ったときに iPhone で撮影した位置情報付きの写真しかヒットしない。キーワードと写真の関連性の判定アルゴリズムは検索エンジンをやってる Google の方にアドバンテージがあるみたいだ。

写真のグルーピング

Google Photos には「アシスタント」というタブがあって、勝手に過去の写真を漁ってグループにしてくれたり音楽付きのスライドショーにしてくれて、「金曜日の夕方」や「土曜日の午後」みたいなエモーショナルなタイトルをつけて煽ってくる。

Google Photos の「おすすめ」

機械がやってくれてる割には良くできてるとは思うけど、人間が選んだアルバムに比べたら素っ頓狂なセレクションが多いし、頻繁に Push 通知が来てちょっとうざい。「阿蘇旅行」みたいなアルバム作って通知してくるけど「旅行じゃないし、阿蘇に住んでたし」という気持ちになる。写ってるものの内容からアルバム名を考えて付けてくるのは賢いけど、わかりやすいものが写ってないとだめで、たとえばこのアルバムは大分の温泉とかいろんなところに行ったけど、最後にちょっと立ち寄った熊本城の写真がわかりやすいので「週末、熊本市にて」というアルバム名になってしまっている。このように Google Photos にはやり過ぎ感がある。

1156-irrelevant-album-name.jpg

※更新: この機能は「おすすめ」という名前に変わったようだ。 https://photos.google.com/foryou で表示される。プッシュ通知も送られてこなくなった。

Apple の Photos.app の方にも「メモリー」というメニューがあって似たような機能はあった。ただこちらは勝手に音付きのスライドショーを作ったり Push 通知したりはしてこない。控えめな印象。一年前の今日なにやってたかとか、直近の一ヶ月でどんな写真撮ったかだけが表示される。

Mac Photos.app の「メモリー」

Apple の Photos.app の方にあって Google Photos にない優れた機能としては、 GPS 情報が付与されていない写真(一眼レフで撮った写真)も大体どの辺で撮ったのか判定してグルーピングしてくれる機能がある。おそらく位置情報付きの写真の GPS 情報を参照して近い時間に撮影されたものはきっとこのあたりにいたに違いない、という感じでまとめてくれてるんだと思う。こんな感じ。

Mac Photos.app は同時間帯の位置情報入りの写真の情報を利用して位置情報の入っていない写真も同じ場所で撮られたと判定

↑の写真で 9 枚は一眼レフで撮影していて GPS 情報がないけど、同じ時間帯に iPhone で撮った写真は位置情報が付与されているのできっと長崎で撮ったのだろう、ということでまとめてくれている。この機能は旅行のときの写真を見るときに地味に便利。 Google Photos にもこの機能はついて欲しい。

写真をグルーピングすることに関しては、 Google Photos はアグレッシブ、 Apple Photos.app は控えめ、という印象を持った。というか Google Photos は攻めすぎな印象。アルバムのタイトルがエモ過ぎるので嫌いな人は見なくなりそう。

過去の写真の閲覧しやすさ

何より Google Photos が Apple Photos.app より優れているのは全ての写真をネットに繋がる限り無料で閲覧できることだと思った。 iCloud で同じことやると年間数万円お金払わないといけない。最近は仕事以外でパソコンを使う頻度どんどん下がって行ってて(自分だけじゃなく世の中のみんながそういう傾向にあると思う)、携帯電話を使う時間がどんどん長くなってきてる。過去の写真を見るのにいちいちパソコンを開かないといけないのはしんどい。手元にある携帯でいつでも過去の写真が見られる Google Photos の方が圧倒的に優れていると感じた。 Apple TV にミラーリングすれば家族全員で写真を見ることもできる。 Photos.app の iCloud フォトストリームではお金を払わない限り 1000 枚までしか共有されないので Apple TV 単体で写真を見ると最近の写真しか閲覧できない。 Google Photos を知る前はそれでも楽しかったんだけど、平日の夜の何気ないタイミングで携帯を眺めていて 2 年前の旅行の写真が目に入り、テレビに映して旅行の思い出に浸る会を緊急開催みたいなことが Google Photos では可能になる。これは本当にすごいし、写真を撮りたいと思うようになった。閲覧・整理環境に課題があると「どうせ撮っても見ないし…」という気持ちになる。

Apple はなぜ先にこのような体験をユーザーに提供できなかったんだろう。ユーザーの画像を預かる、という点では iCloud で Google よりも先行していたはずなのに。

Apple に期待すること

総じて Google Photos が勝っていると思う。一度 Google Photos を使ってしまうと、 Apple の Photos.app で写真を見るという気持ちにはならないだろう。

Apple Photos.app はローカルで動くソフトウェアの強みを活かして、写真の編集方面で強くなって欲しい。 Google Photos の写真編集機能は貧弱だし、一度アップロードした写真を手元にダウンロードして編集して再度アップロードするのもだるい。何も Photos.app 本体の編集機能を強力にしろと言ってるわけではない。画像を外部の編集ソフトと受け渡しできるだけで良い( iPhoto から Photos.app になったタイミングで外部のソフトを編集・現像ソフトに指定できなくなったり、ドラッグアンドドロップで画像を書き出せなくなったが、そっち方面の機能を充実させて欲しかった)。

画像認識だとか機械学習みたいなのは、ユーザー自身の Mac の中でちびちびやってもサーバーサイドでいっぱいコンピューターを並べて並列処理でだーっと実行してるだろう Google には勝てない。そういうので Google とやりあうのは良策ではない。

そして欲を言えば Aperture の開発を継続して欲しかった。 Lightroom のために Adobe に毎年 12000 円払える人は限られている。お金以外にも Apple が作ってる現像ソフトという安心感が Aperture にはあったんだよなぁ。 Adobe のソフトのジャバジャバした感じは好きになれない。

| @写真

moon

iPhone 7 にしたら結構カメラの画質良くなって割と満足してる。フィルターかけることの喜び知ってしまって VSCO で遊んでる。フィルターかけるとオリジナルとフィルター済みの2パターンの画像ファイルできてしまう。 SNS にアップロードするときはフィルターかけたやつを上げたいけど記録用に自分のフォトライブラリに残すやつはフィルターかかってないやつがよい。そういう運用してるとフィルターかかってるやつとかかってないやつの両方がごちゃごちゃにフォトライブラリに残ったりして管理をどうするかで悩んでる。

一眼レフは相変わらず D90 使ってる。結構ボロボロになってきてて買い換えたいのだけど先立つものがなく買い換えられていない。グリップのラバーゴムを交換したり、キットレンズの VR 18-200 の修理をしたりしながら何とか使ってる。やっぱり iPhone のカメラとは別格の写真が撮れる。特に Nikon 純正の単焦点を付けて撮ったときは良いのが撮れる。フルサイズ機への買い換えを考えたこともあるけど、最近はぶっ壊れるまでとことん D90 を使おうかなと思ってる。ただ D90 は動画がよくない。音声はモノラルで解像度低いしフレームレートも低くオートフォーカスもなし。動画の画質は iPhone 5 くらいの頃から iPhone に負けている。 Apple TV でテレビに映して再生すると一昔前の YouTube みたいな画質になる。

一眼レフには Mac 側のストレージを圧迫するという問題点がある。いま使ってる MacBook Pro は 2009 年モデルでかなり古い。初期搭載の HDD から 512GB の SSD に変えているけど RAW がストレージを使いまくってて残り 20 GB 程度しか空きがなく Xcode のアップデートも行えないような状態。そもそも RAW 撮りやめてしまっても良いのではと思い始めた。 RAW 現像する暇ないし Aperture の開発は停止されて RAW 現像できるソフトがそもそも手元にない。実はカメラの撮って出し JPEG でも十分満足できている。結構良い画質で撮れてそれを Keenai (旧 Eye-Fi )でさっとスマートフォンに取り込んで SNS に上げたり iCloud 共有したりすることの方が自分のカメラの使い方としてプライオリティ高い。

プロでもハイアマチュアでもない普通の個人はどういうフォーマットで写真を撮って保存するのがベストなのだろうか。 RAW で撮っとけば後々後悔することはあるまいと思っていたけど、ストレージの値段が劇的に安くなってきてるわけでもない(ローカルストレージは安くなったが、クラウドストレージに同期しながら使おうとすると結局コスト高い)し、デバイス間の転送速度の問題もある。 2017 年のベストな写真管理方法知りたい。

| @Mac/iPhone

JR東日本エリア在住ではないのだけど iPhone 7 を買って Suica の設定をしたので試してみたくなり iPhone 7 で電車に乗ってみた。JR九州の改札も福岡市地下鉄の改札もちゃんと通れた(当たり前)。ただ IC カードに比べて反応が少し遅くて「もしや使えないのでは?」と挙動不審になってしまった。もう少し右往左往してたら駅員に声かけされたと思う。買い物するときみたいにダブルタップして Wallet を呼び出してから通過したけど改札通過時にはそれをする必要はなくてただかざせばよいっぽい。

改札を通過するとすぐに iPhone に通知が来て残額がいくらかわかる。また移動中は「現在乗車中です」みたいな表示が出る。こういう通知はコンビニとかで買い物をしたときも来るけどめっちゃ便利。 一度 iPhone の Suica で金を払う体験をしてしまうと、レシートを見たり券売機で照会をしないと残高がいくらかわからない旧来型の IC カードには戻れなくなってしまう。カパカパ式ケースに iPhone と電子マネーを挟むのとは圧倒的にユーザー体験が違っていて、残高のリアルタイム通知が来て、乗車ステータスの確認ができ、残高が不足している場合はその場でチャージすることができる。

おサイフケータイ使ってた人たちは 10 年前にすでにこういう便利な体験してたのだろうか。自分は携帯は Motorola や Ericsson 、 NOKIA などの洋物携帯ばかり使ってたので今さらながら携帯電話に決済機能がくっつくことの便利さを実感した。これは本当に便利な機能だと思う。

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

Pinboard にブックマークしたらはてなブックマークに同期するやつを作った。

なんで Pinboard を使うのか、どうしてはてブに一本化しないのかというと、洋物のサービスを使うときに Pinboard の方が使いやすいから。 IFTTT に Pinboard 連携機能はあってもはてブ連携機能はないし、 Delibar や Reeder や ReadKit も Pinboard には対応しているけどはてブには対応してない。あと Pinboard は広告出ないしホッテントリ的なものもないので気がついたら Amazon で買い物してたとかホッテントリの海に溺れてた、ということも起こらない。とはいえはてブのコメントでキャッキャッウフフはしたい。なのでブックマークするときは両方にしたい。パソコンの Chrome からブックマークするときは Taberareloo でクロスポストできるのだけど、最近 iPhone からブックマークすることが増えて(iPhone 進化し過ぎて仕事するときしかパホコン使わなくなった) Pinboard とはてブにそれぞれブックマークするのがだるかった。そういうわけで Pinboard をメインにしつつはてブに同期を試みた。

はてなスタッフの aereal さんが作ってるはてブ API 用の gem (aereal/hatena-bookmark-restful: A client library for Hatena::Bookmark RESTful API)あって使わせてもらったのだけど、これはそのままだと使えない。タグが複数あるケースに対応してない& User-Agent を送らないので API 側から 401 Unauthorized が返ってくる。なので雑にモンキーパッチした。

はてなブックマークの API は tag を 10 個まで設定できるけど、以下のように Request Body が Encode されるのを期待しているっぽい。

"comment=&tags=ruby&tags=http&url=https%3A%2F%2Fgithub.com%2Flostisland%2Ffaraday"

この様な Request パラメーターを Ruby で表現すると以下のような Hash になると思う。

params = {
  comment: '',
  tags: ['ruby', 'http'],
  url: 'https://github.com/lostisland/faraday'
}

Hash は当然のことながら同じキーを複数持つことはできないから、 tags は配列として表現される。これをこのまま Faraday (Ruby の HTTP クライアント。上述の gem でも使われてる)に渡して Request Body を生成するとエラーになってしまうのだった。

最近の Faraday には encode option が追加されて FlatParamsEncoder というのを選べるようになってた。こいつを使うと配列を value に持つ Hash をシリアライズしたときに tags=foo&tags=bar みたいな形式にしてくれる。加えて User-Agent も載せるようにもした。こんな感じ。

class Hatena::Bookmark::Restful::V1
  def create_bookmark(bookmark_params)
    res = connection.post("/#{api_version}/my/bookmark") {|req|
      req.params = bookmark_params
    }
    attrs = JSON.parse(res.body)
    bookmark = Bookmark.new_from_response(attrs)
  end

  private

  def connection
    @connection ||= Faraday.new(url: 'http://api.b.hatena.ne.jp/') do |conn|
      conn.request :url_encoded
      conn.options.params_encoder = Faraday::FlatParamsEncoder
      conn.request     :oauth, {
        consumer_key:    @credentials.consumer_key,
        consumer_secret: @credentials.consumer_secret,
        token:           @credentials.access_token,
        token_secret:    @credentials.access_token_secret
      }
      conn.headers['User-Agent'] = 'Hatena::Bookmark::Restful Client'
      conn.adapter Faraday.default_adapter
    end
  end
end

なおはてブの API はリクエストパラメーターが不正なとき 400 Bad Request を返すのではなく 401 Unauthorized を返す。のみならず User-Agent なしのリクエストに対しても 401 を返す。一方で OAuth ヘッダーが不正なときは 400 を返す。原因の切り分けがむずかしくなるので、リクエストパラメータが不正なときは 400 を返して欲しいし認証できないときは 401 を返して欲しい。

追記 2017-05-22 18:34:38

作者の aereal さんに気づいてもらってパッチを取り込んでもらったんだけど、なんかやっぱりタグありの記事をブックマークしようとするとエラーになるっぽい。相変わらず 401 Unauthorized が返ってくる…。