マッチングアプリで彼女ができるまで【Omiai・pairs】

マッチングアプリで仲良くなった女性に先日告白して、OKの返事をもらって無事に交際をスタートしました。

マッチングアプリ、普通に出会えます。

交際に至るまでのあれこれや、マッチングアプリにまつわる雑感を書いておきます。

目次

  • きっかけ
  • スケジュール
  • 私について
  • いいね数やマッチング数など諸データ
  • アプリ比較
    • Omiai
    • pairs
  • プロフィール戦略
  • 彼女に聞いてみたこと
  • 効率良く探すために
  • 雑感
  • 活動にかかった金額
  • 最後に

きっかけ

3年半付き合った彼女と紆余曲折あり、年末に別れました。 数ヶ月して、そろそろどこかで出会いを探したい気持ちになったのですが

  • 社内恋愛は個人的ポリシーでナシ
  • 合コン苦手
  • 結婚相談所に入会するほどではない
  • 最近は趣味のバンドから離れつつあり、音楽仲間ともちょっと疎遠に

ということで、いつの間にか出会う機会がすっかり失われていました。 そんな時、会社の同期女子がTinderというマッチングアプリを使って何人かの男性と会ってる、という話を聞いて

「もしかしてマッチングアプリなら出会えるのでは…?」

という思いに至り、アプリに登録しました。

スケジュール

  • 3月下旬 pairs開始・有料会員登録(3ヶ月プラン)
  • 4月下旬 Omiai開始・有料会員登録(3ヶ月プラン)
  • 5月中旬 居酒屋で飲み(1回目)
  • 6月上旬 ランチ(2回目)
  • 6月中旬 デート(3回目) → 告白

私について

  • 28歳
  • 理系院卒
  • 正社員
  • システムエンジニア
  • 東京 or 神奈川在住
  • 身長160cm代後半、体重50kg代
  • イケメンに生まれたかった

いいね数やマッチング数など諸データ

Omiaiを主力にしてからはpairsはほとんど使わなくなってしまったので、ほぼOmiaiでのデータです。

  • いいねされた数: 148
    • いいねされた年齢層: 19歳〜36歳
    • いいねありがとうを返した数: 12
  • いいねした数: 130
    • いいねした年齢層: 23歳〜30歳
    • いいねありがとうが返ってきた数: 14
  • マッチングした数: 26人
  • 1回会った女性: 6/26人
  • 2回会った女性: 3/6人
  • 3回会った女性: 1/3人

アプリ比較

私はOmiaiとpairsを利用しました。
withを使っていた時期もありましたが、あまり相性が良くなかったので3日で辞めました。こればかりは本当に相性だと思うので、pairs/Omiai/with/ゼクシィ恋結びあたりから2,3個やってみるのが良いかと思います。

Omiai

f:id:entropiajp:20170621090741p:plain

Good

  • 女性のいいね数がインフレしにくい
    • Omiaiでは、本人の人気度などに応じて男性がいいねするために必要な消費いいね数が1,3,5,10と変わっていく
    • 人気会員は消費いいね数が多いため、男性が慎重にいいねするようになって結果的にインフレしにくい
  • 「相手が獲得しているいいね数」で検索できる
    • pairsのように大量にいいねを獲得していてどうせいいねしても無視されそうな会員をあらかじめ検索から除外できる
    • 人気そうなステータスや属性を持っているのにもかかわらずいいね数が少ない「ブルーオーシャンな女性」を見つけやすい
  • 名前のせいか、比較的女性の真剣度が高い?
    • pairsよりメッセージをきちんと返してくれる女性が多かった

Bad

  • 誤いいねしやすい
    • 確認ダイアログが無く、ワンタップでいいねができるので間違えていいねしやすい
  • メッセージ付きいいねをするために課金が必要
    • pairsではログインボーナスでポイントを貯めて、そのポイントでメッセージ付きいいねができる。しかしOmiaiは無料でポイントを手に入れる方法がないので課金するしかない
    • ※まれにメンテナンスお詫びなどで無料でポイントが配布されるようです
  • Apple IDで支払いしていると 契約中のプランの有効期限が切れるまでOmiaiを退会することができない
    • 交際開始とともに交際相手と一緒にOmiaiを退会しようとしている場合は要注意
    • 自分の場合、せーので退会しようと思ったのに「あれ、退会できない…?」と微妙な空気になった😆
  • 年収の設定幅が微妙
    • 「500万〜800万」はややざっくりしている。pairsみたいに200万円刻みがいいのでは

pairs

pairs

Good

  • コミュニティがあるので趣味や嗜好でマッチングしやすい
    • コミュニティはマイナーな趣味でも割りと存在している
  • 結婚したい時期、子供がほしいかを選ぶプロフィール欄がある
    • 「2,3年で結婚したい」「いい人がいれば結婚したい」で検索してた
    • 子供欲しくない人とマッチングしたくなかったので役立った

Bad

  • 女性のいいね数がインフレしやすい
    • 単純にアクティブ男性ユーザ数が多いので、いいなと思う女性はあっという間にいいね数が数百〜4桁に到達する
    • 人気女性に対しても、1いいねの消費でいいねできるのでインフレしてしまう。Omiaiのように人気によって消費いいね数に重み付けがあるとよい
  • プレミアムオプションの利用料金が高い(月額2980円)

プロフィール戦略

  • メイン写真が超重要
    • 相手の検索結果画面には「メイン写真、年齢、居住地、職業」しか表示されない
      • しかも見るのはせいぜい1秒
    • パッと見でメイン写真をクリックしてもらえないことには、熟考したプロフを読んですらもらえない
    • 良い写真がなければ、こういうサービスで「自然な笑顔」をプロに撮ってもらうのは悪くないと思います
    • いわゆる「お見合い用の写真」は堅すぎてマッチングアプリでのウケは悪いと思います
  • プロフィールサブ画像
    • 趣味を楽しむ写真、仕事してる写真(スーツとか)、普段の服装コーデ
    • 趣味の写真はいい表情であることが多いので積極的に使う
    • 普段の服装コーデを載せるのは「デートでこの人が隣に歩いていても恥ずかしくないな」と思ってもらうため
    • 仕事してる写真はオンオフのギャップを表現するため
      • 真面目そうな表情でも良いと思うし、同僚と談笑しているような場面でも良いと思う
      • 「ちゃんと仕事してる感」が大事
  • プロフィール文章
    • あいさつ、仕事は何をしているか、オフの時何をしているか(趣味)、女性のタイプを端的に書く
    • 万人受けする文面は目指さない
      • 自分が会いたい人、自分と合いそうな人に刺さるような文面
      • 万人受けして意味があるのはイケメンだけ(というか、イケメンは「よろしく」だけでもいいねがガンガン来る)
      • 真剣な出会いを目的とする場合、自分と合わない人とマッチングしても意味がない
    • 仕事に打ち込んでいる人に悪い印象を抱く人はいない
      • 仕事人間ではないことも表現する
    • 女性のタイプがあれば明示して、合わない人とのマッチングを防ぐ
    • 最後は読んでいただきありがとうございましたで〆
    • 大抵なアプリは他の人気会員のプロフを参考に見れるので、ざっくり参考にする
  • 各設定項目
    • 身長:
      • 少なくない女性が170cm以上で検索しているので、悩ましいところ
      • 会えば一発でバレるので、正直に書くのがオススメ
    • 年収: 400万以上なら正直に記入
    • 居住形態: 一人暮らし or 実家暮らし は正直に記入
      • 実家暮らしがネガティブなのは自立心が無いor過干渉な親がいるのでは…と敬遠されがちなため
      • たとえば「半年以内に一人暮らしを始める予定です」とかプロフに書いておく

彼女に聞いてみたこと

「なんでいいねしてくれたの?」

  • 性格の欄で「穏やか、落ち着いている、誠実、聞き上手」とあるのが良かった
  • 登山の写真から「自然が好きそう」というのが伝わってきたから
  • 社交性の欄で「大人数が好き」「すぐ仲良くなる」とかパリピ要素があったらいいねしてなかった

内面をわかりやすく、正直に書くのがいいっぽいです。

効率良く探すために

  • 短期間で終わらせる
    • 就活と似ていて、長期戦になればなるほど消耗して成功率が下がる
    • 1日3件のデートを入れていたこともありました
    • 「もっといい人がいるかもしれない…」は青い鳥症候群といいます
  • 複数のアプリを並行利用する
    • 短期間で終わらせるための方法の一つ
    • 女性側は基本的には1つのアプリだけ登録している
      • プロフは流用できるので、手間を掛けずにチャンスを広げる
    • アプリによって女性の姿勢が微妙に異なり、相性がある
      • 個人的にはOmiaiはとても相性が良かった
      • pairsはやや気軽。タップルはもっとお手軽らしい
  • 選別した写真、推敲を重ねたプロフィールを用意してから登録する
    • マッチングアプリ特有の新規会員ブーストを最大限に活用する
      • おおむね登録から1週間以内だと検索結果の上位に表示されやすい
    • 登録してからのんびりプロフィールを改善するとせっかくのブースト効果を利用できない
  • 5日間メッセージの返信のない人は縁がなかったとみなして無視する
    • 相手が並行してやり取りしている男性の中で自分の優先順位が低いので

雑感

  • 女性からのいいねで始まるといつFOされるのかというプレッシャーがないので楽
    • よほどのことがない限り初回面接まではいける
    • ただし会ってからはフラットな関係になる
  • 男性の課金を促す運営側の施策がある
    • 有料会員の期限切れ間近に急にいいねが増えはじめる
      • 個人的にはサクラがいる訳ではなく、期限切れ直前に 検索結果の上の方に表示させる アルゴリズムがあるのでは
    • 3ヶ月プランや6ヶ月プランは一見お得だが、上の施策の旨味を受けられないという意味で損なので、単月プランを毎月更新が最善と思われる
    • とはいえ、複数月プランの割引率は高いのとpairsでは「平均4ヶ月で交際に発展している」とのことなので、お好みで
  • 就活と似ている部分が多い
    • 写真・プロフィール文=エントリーシート、デート=面接、告白=オファー
    • 違うのは お互いに 最後は一人を選ばなければならない(企業は大量採用できるけど)
    • 男女ともに沢山のいいねを貰う人が少数いる一方で、ほとんどいいねを貰えない人が沢山いる
    • 就活と同じノウハウが横展開できる
      • 話してみたい、と思わせる写真とプロフィール文が大事
      • お祈り(メッセージ来なくなったり、ドタキャン)されても、気にせずに次の人を探す
        • お祈りされていちいちメンタル病んでると、負のスパイラルに入り込むので要注意(就活うつ≒婚活うつ)
      • 自分はどんな女性とおつきあいしたいのかを登録前にはっきりさせておく
        • ブレると「この人は付き合えれば誰でもいいんだ」感が不思議と伝わる
        • 就活でダメな例: 各業界の大手企業だけ応募する
    • 結局、自分自身を売りこむ営業ということか
  • 各フェーズの目的
    • マッチング前: 「この人とメッセージしたら楽しいかも…」と思ってもらう
      • 「この人と会って何話すんだろ…?」と思ってしまうような人から「会いましょう」って言われても気乗りしない
    • メッセージ: 「この人と会って話したら楽しいだろうな…」と思ってもらう
      • 女性側も基本的には長期間のメッセやり取りはダルい
      • 女友達いわく「3日位やりとりしたら誘っていいんじゃない?」
    • 面接: 「この人と一緒にいると楽しいな…」と思ってもらう
    • この目的を丁寧にひとつひとつの行動に落とし込む

活動にかかった金額

23万円くらいかかりました。

内訳

  • アプリ利用料金:
    • Omiai 3ヶ月プラン(プレミアムオプションは無料): 13800円
    • pairs 3ヶ月プラン+プレミアムオプション2ヶ月: 7440円+2980円*2=13400円
  • 服飾費: 13.5万円
    • ここ最近いい感じの私服を買っていなかったため
    • 靴や時計も含む
    • 普段から揃えている人は特にかからない費用だと思います
  • デート代: 7万円
    • 1回あたりの費用は2000円〜1.2万円までまちまち

最後に

マッチングアプリでいいなと思ったのは「お互いのことを少し知った上で出会える」ところです。

彼女とはよく「なんか随分前から知り合いだった感じするよね」と言い合っているのですが、初めて会う前から相手のプロフィールを把握して、ゆっくりメッセージをやり取りして相手の趣味嗜好や価値観がちょっと分かった上でスタートする出会いって、他にはなかなかないと思います(それこそガチのお見合いくらいでは)

誰もが合コンや街コン、お見合いパーティ、ナンパなどの出会いに慣れているわけではありません。各種アンケートを見ても、また自分の肌感覚でも、マッチングアプリによる出会いが徐々に普通の出来事になってきている、まさにその只中なんだと思います。

同じような人の参考になればと思い、書きました。良いご縁がありますよう。

こやさんが2016年買ってよかったもの、後悔したもの、活動まとめ

社会人になると1年があっという間に過ぎていきます。

  • 買ってよかったもの
  • 買って後悔したもの
  • 活動まとめ
    • WHITE-LIPS「誓いの言葉」をピアノで演奏してみた
    • Zektbach「The Sealer ~ア・ミリアとミリアの民~」をピアノで演奏してみた
    • 28歳SEが星野源『恋』(TV size) をピアノで演奏してみた
  • 最後に

例によってAmazonで買えるものはアフィリエイトを貼っています。気になったら是非。

Predawn Absence

アコースティックギター、時にテレキャスターを担ぐ女性シンガーソングライターです。 ほとんどの曲が英詞なんですが、彼女の楽曲の世界観と魅力的なヴォイスには、やはり英詞がよく合います。 品川のグローリアチャペルという教会であったライブが本当に神懸かりだったので、とにかく一聴していただきたく。

年の瀬にレコ発ライブも行けたし、今後も応援していきたいです。

KOKIA moment

何年かぶりに「音楽を聴いて泣く」という体験をしたCDという意味で、このアルバムとの、そしてKOKIAとの出会いは2016年の特筆すべき出来事です。 リードトラックの「moment 〜私は生きる〜」の、心に迫る感じはそう簡単に味わえるものじゃないと思います。

辛かったことは忘れればいいと言うけど 未来は全てを抱きしめてゆくことで 輝きを増すこと 私は知ってる 失ってものがあるなら それにも増す愛で生きよう

この強さ。このしたたかさ。これからもライブに行きたいです。

四月は君の嘘

奔放なヴァイオリニストである宮園かをり。周りを振り回しつつ、圧倒的なセンスと才能で黙らせる… ヒロインと主人公との距離感の変化も楽しかったけど、奔放そうに見えて実は繊細なgiftedが大好物な自分には最高でした。年末年始で最終巻まで読むぞ!

SONY ワイヤレスノイズキャンセリングステレオヘッドセット MDR-EX31BN

遮音性が気に入ってもともとetymotic researchのイヤホンを使っていたのだけど、年末にフリンジが耳に残って取れなくなって耳鼻科行くという恐怖体験(大げさ)をして、フリンジが入り過ぎずそれでいて周りの音はある程度カットしてくれるイヤホンを探してました。 これはいいですね。移動中だったり仕事中に聞くんで音質なんかこだわっても仕方ないしでbluetoothイヤホンにしたけど、bluetoothイヤホンの意外なまでの取り回しの良さに気づけたし、いい出会いでした。カラーバリエーションに赤があるのもイイね。

TSdrena 覗き見防止プライバシーフィルター

MacBook Pro Late2013 - Late2015で覗き見防止フィルターはこれが決定版では。シール不要で、ディスプレイの縁に安定して置けるので綺麗に使えます。

MIDWEC ケーブル付き モバイルバッテリー 10000mAh

なぜかモバイルバッテリーって分厚いのが多いですよね。うっすいモバイルバッテリーを探してました。これは最高です。2.0A出力の口もあり、充電のスピードも問題ないです。

君が望む永遠

もう2001年のゲームか…。名作でした。紹介してくれた友人ありがとう。
私は遥推しです。

救命センター当直日誌

現役の救急救命センターの医師によるエッセイ。フィクションの体ですが、筆者の実務経験に裏打ちされた臨場感ある筆致で、サクサク読めます。
救急救命センターの出来事なので、人の生死も当然ありうる場のですが、そういった場だからこそ、患者の家族をはじめとした周りの人たちの人間性がよく出るんですね。
主人公の医師が措置の終わった後、一息ついている時に研修医とやりとりをする場面があります。そこで交わされる会話から筆者の人間へのまなざしが垣間見える所に、この本の良さがあります。

MOTHERHOUSE バッグ Antique Slim Business

shop.mother-house.jp

同じブランドの麻のバッグを使っていて、汚れが目立ってメンテに出すことになり代わりに買ったバッグ。これが本当にいいブラウンの色合いで… 中のポケット類もスマホや小物を入れるためによく考えられた設計になっていて、長くメンテしながら使っていきたいなぁと思っています。

三千櫻

michizakura.jp

甘めの日本酒が好きで、と近所の酒屋に相談したらこれをお勧めされて、以来、宅飲みではこれを買って行くようにしてます。 岐阜県中津川市の小さな酒造が作っているとても美味しいお酒です。

買って後悔したモノ

Playstation VR

とにかく酔った。VRの面白さに辿り着く前に、生理的なストレスに圧倒されて終了。 来年出るエースコンバット7のVRコンテンツまで寝かせておきます。

スプラトゥーン(買ったの2015年だけど)

めちゃくちゃプレイした。したけど。 正直、後半の方イライラした記憶しかなくて、総プレイ時間のうち1000時間くらいは無駄としか言いようがなかった。 長時間プレイしたけど、それはゲームの面白さから来るものではなくて、このゲーム(のガチマッチ)が本質的に持つ"ギャンブル性"によるものだと、自分は理解しています。

Splatoonスプラトゥーン)』は当社の開発チームの若い力を集結してできたもの

2015年10月29日(木) 経営方針説明会 / 2016年3月期 第2四半期決算説明会 - 質疑応答

とのことだけど、小学生から任天堂のゲームをやってきて、こんなにイライラしたことはなかったので(※よくイライラすると言われるスマブラはあまりやったことない)、このようなイライラするデザインのゲームが今後も出されるなら、自分と今後の任天堂のゲームはもう相性悪いんだろうだなという結論。

Apple Watch Series 2

www.apple.com

Genius Barの店員は商品知識がないなら正直に「わかりません」と言おう
顧客に嘘を吐くのはやめて。以上。

活動まとめ

2016年はピアノアレンジ動画を3作アップできました。

WHITE-LIPS「誓いの言葉」をピアノで演奏してみた

2000年代のエロゲの曲です。近未来SF×サン・テグジュペリという奇特な世界観を持ち、絵本のような穏やかな雰囲気の中、後半は怒涛のSFが展開されます。そのED曲がこの「誓いの言葉」なんですが、私は初回プレイ時、ボロ泣きでこのEDを迎えました。全く個人的な思い出として、大学生の頃、山形に免許合宿に行く時にノートPCを持っていってこのゲームを毎晩プレイしていたので、この旋律を聞くと懐かしさでむずがゆくなります。

Zektbach「The Sealer ~ア・ミリアとミリアの民~」をピアノで演奏してみた

soundcloudの自分のアカウント見返していたら、なんとこのプレビュー版が2012年にアップロードされていました。。

真面目に耳コピしてアレンジして熱心に練習したのに、面倒くさがって動画に残さずにいたらいつのまにかアレンジ忘れてる…みたいな悲しいことが去年何回かあったので、ちゃんと動画にしよう!と意気込んでアップロードしたのがこのア・ミリアでした。 ニコニコ動画のコメにあった「こやさんのおかげでゼクトが好きなりました」というコメが本当に嬉しかったです。そうやって好きの幅を広げてくれる出会いって実はあまりないんで、きっかけになれて嬉しいです。サンホラ好きは、ゼクト好きになる素質があると思います!

28歳SEが星野源『恋』(TV size) をピアノで演奏してみた

プロの独身なんで。
年末でクッソ忙しい時期だったんですが、毎週逃げ恥見ていて、本当にいい曲だったので弾きました。実際アレンジしようとすると、POPなだけでなくおしゃれで楽しい曲でした。
それにしても星野源、マルチだなぁ…

最後に

今年は、長年付き合いがあった人から不意打ちで瘴気の篭った言葉を当てられることが多く、なかなか気が滅入りがちでしたが、その一方でより深まった縁もあって救われる場面が印象的な年でした。モノに関しては、なかなかいい出会いが多かったように思えます。
来年も良いご縁と恵まれますように。あと音楽面でも新しい方向に踏み出してみようかと思っています。

良いお年を!

Ubuntu 14.04 + Apache 2.4 + Python 3.5.1 で Flask動作環境を構築する

OSインストール直後の状態からflaskの動作確認まで。

環境

コマンド実行

# use japan mirror server
sudo sed -i'~' -E "s@http://(..\.)?(archive|security)\.ubuntu\.com/ubuntu@http://ftp.jaist.ac.jp/pub/Linux/ubuntu@g" /etc/apt/sources.list

# update installed package
sudo apt upgrade
sudo apt update

# install apache2
sudo apt install apache2

# install python 3.5.1
sudo apt install -y build-essential
sudo apt-get -y build-dep python3.4
mkdir downloads
cd downloads
wget https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
tar -zxvf Python-3.5.1.tgz
cd Python-3.5.1
./configure --enable-shared --prefix=/opt/python-3.5.1
make
sudo make install
echo "/opt/python-3.5.1/lib" | sudo tee /etc/ld.so.conf
sudo /sbin/ldconfig

# create virtualenv & install mod_wsgi
cd ~
/opt/python-3.5.1/bin/python3 -m venv example-env
. example-env/bin/activate
pip install -U pip
pip install mod_wsgi-httpd
pip install mod_wsgi

# install flask
pip install flask

ファイル作成

/etc/apache2/mods-available/wsgi_express.conf

WSGIPythonHome /home/vagrant/example-env
WSGISocketPrefix /var/run/wsgi

/etc/apache2/mods-available/wsgi_express.load

LoadModule wsgi_module /home/vagrant/example-env/lib/python3.5/site-packages/mod_wsgi_packages/httpd/modules/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so

/etc/apache2/sites-available/example-site.conf

<VirtualHost *:80>

    WSGIDaemonProcess example-site user=www-data group=www-data threads=5 python-path=/home/vagrant/example-env/lib/python3.5/site-packages
    WSGIScriptAlias / /var/www/example-site/app.wsgi
    WSGIScriptReloading On

    <Directory /var/www/example-site>
        WSGIProcessGroup example-site
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

/var/www/example-site/app.py

# -*- coding:utf-8 -*-
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'completed!'

if __name__ == '__main__':
    app.run()

/var/www/example-site/app.wsgi

import sys, os
sys.path.append('/var/www/example-site')

from app import app as application

コマンド実行

sudo a2enmod wsgi_express
sudo a2dissite 000-default
sudo a2ensite example-site
sudo service apache2 reload

テスト

ブラウザに completed! と表示されればOK

参考

スプラトゥーン不満

他にも思い出したら随時更新する。

クソマッチングアルゴリズム

どんなに自分が懸命なプレイを心がけても不自然に負けが続く、いわゆる「クソマッチング」。約4500試合の自分のデータに基づくと、私のガチマッチの勝率はだいたい66.2%。さらに、実際に試合してみると5連敗くらいはざらで、7連敗も経験してます。
5連続負ける確率は (1-0.662)5 = 0.44%

0.44%ってけっこう起こるんですね~

ブキ編成の極端な偏り

モンガラで短射程*4とか、全員チャージャーとか。試合開始前からプレイヤーを萎えさせてどうする。

味方通信切断時に負けた時のウデマエポイント

途中から相当不利な3vs4の戦いを強いられて負けたにもかかわらず、ウデマエポイントは通常の減少幅。

ナイス、カモン以外のボタン割り当て

ナイスとカモンではバトルに必要なコミュニケーションを到底満たせないということを言いたい。たとえば「あぶない!」などが追加できれば嬉しい。

「次のバトルから合流します」

ナワバリorガチバトルを選んで「よしバトルすっぞ」と部屋にはいると「次のバトルから合流します」
プレイヤーは当然、ロビーへ行ったん戻って部屋を選び直したいのだが、Bボタンによるキャンセルもできない。

任意のキャンセルができない

  • 一旦部屋に入ってしまうと、Bボタンでキャンセルできない(マリオカート8ならできる)
  • ガチバトルをプレイしようとして間違えてガチバトルのルール説明ページを開いてしまうと、すべて聞かなければならない。Bボタンでキャンセルできない

ブキ編集から戻ったときにナワバリが選択されている

ガチバトル→ちょっとブキ変更しようかな→ロビー戻る→なぜかナワバリが選択されている→Aボタン連打→ナワバリ→\(^o^)/

ラグ外人

瞬間移動、自陣のインクをイカ移動など、ジャパニーズニンジャ顔負けの超常現象がよく起こるので国内海外プレイヤーのマッチングを分離してほしい。(マリオカート8では実施)

ブロックが事実上意味なし

煽りイカされたり萎え落ちされたり、それなりの理由で二度と一緒にプレイしたくないという意思表示としてプレイヤーをブロックしているというのに、なぜかまたチームに混ざることがある。

4時間に一度の無駄なテレビ

ロビーで現在のステージはわかるので不要かと。それでもテレビをやるというのなら、ガチマッチの種別をアナウンスしたらどうでしょう。

2015年まとめ

社会人になってからは毎年あっという間に過ぎていますが、やはり今年もせわしく一年が過ぎ去ってしまいました。 入社して3年近くが過ぎ、ブログのタイトルにある技術支援部署も、来月から異動で離れることになりました。 諸先輩方、大変お世話になりました。新卒で最初に配属された部署が、技術的に尖った先輩がいる環境で良かったです。 (この会社でそういう環境に居られたのは、なかなか運が良かったと思います)

今年勉強したもの

その割に記事が全然書けてませんね…反省します。

resultoon

ひそかにGitHubで10 starsを獲得する目標があり、9月頃に公開したアプリケーションで達成することができて良かったです。

entropiajp/resultoon · GitHub

任天堂のゲームソフト「スプラトゥーン」の戦績を記録するアプリです。HDMIキャプチャの入力を元に画像認識で各種情報を読み取るので、ユーザ入力0でプレイしてるだけで勝手に記録されて便利です。ちょうどエンジニア界隈でスプラトゥーンが流行っていたこともあり、多くの人に知ってもらうことができました。

学生時代の私のネット上の活動といえば、耳コピして演奏した動画を投稿したり、ピアノアレンジの楽譜を起こしたりすることでした。

趣味のアプリではありますが、こうしてエンジニアの人々の目に留まったことで「ピアノを弾く人」から「エンジニア」に一歩衣替えできた気分になり、とても嬉しいのです。

ただし、あまりにスプラトゥーンにはまりすぎて、resultoonを作れたことは良かったのですが、正直、学習はおろそかになってしまいました。。 費やした時間を考えると暗澹たる気持ちになりますが、行けるところまで行ったのでもう悔いはありません。

f:id:entropiajp:20151231233855p:plain

抱負

来年はいよいよ現場で仕事することになります。
今まで培ったことも下地にしつつ、いい意味でまた新入社員のような緊張感を持って、現場の仕事に馴染んでいきたいと思います。
年末年始はこたつでAWSの勉強するぞーー

それでは皆さま良いお年を。

MonsterTV X3A(SK-MVX3A)でSplatoon録画環境を構築する

スプラトゥーンにガチハマリしているので、対戦の様子を録画したくなってきました。 デスクトップのWinマシンでWii Uの映像を録画(キャプチャ)する環境を構築する手順をまとめておきます。所要時間は30分位。

PCI-express接続のキャプチャボードを使用するので、ノートPCでは実現できません。あしからず。

流れ

  • 各種ハードウェア購入
  • 設置
  • Wii U画面解像度設定
  • ドライバ・動作確認用アプリインストール
  • (最低限の)動作確認
  • アマレコTVインストール

マシン環境

項目 内容
MB ASUS P8h77?
CPU Intel Haswell Core i7
memory 16GB
storage システム: SSD データ: HDD
OS Windows 7 64bit

各種ハードウェア購入

合わせて1万円くらいです。

設置・配線

MonsterTV X3AをPCI Expressのレーンに差し込みます。
WiiUから分配器に入力し、2つの出力端子をテレビとMonster X3Aに接続します。

※我が家ではもともとテレビでプレイしていたので、そうでない場合は読み替えてください。

Wii U画面解像度設定

Wii Uの画面解像度を 720p に変更します。
これに気づかなくて1時間消えました。皆様お気をつけ下さい。

ドライバ・動作確認用アプリインストール

ダウンロード|地デジチューナーやビデオキャプチャなどパソコン周辺機器の製造・販売ならエスケイネット

キャプチャボード開発元の上記ページからMonster X3A用のアプリとドライバをそれぞれダウンロードして適宜readmeにしたがってインストールします。

(最低限の)動作確認

開発元提供の視聴録画アプリで、Wii Uの画面をキャプチャできるかどうか確認します。

ただし、このアプリはあくまで動作確認用に留めます。私の環境では15分に1度程度、画面の横方向に乱れが発生する場合があり、ゲームプレイに支障をきたすためです。実際のプレイ・録画には後述の「アマレコTV」というアプリを使います。 (あと開発元提供アプリは起動時にWindows Aeroがいちいち無効化されるのも煩わしいです)

アマレコTVインストール

アマレコTV公式ホームページ から アマレコTVをダウンロード・インストールします。

Ctrl+Sでスクリーンショット、Ctrl+Zで録画開始できます。これらのショートカットは他のアプリをアクティブにしている状態でも効くので、とっさに画像をキャプチャするのがとても楽です。

イカ、よろしく~

Timezone情報の有無によるJackson Deserializerの挙動変化でハマる

timezoneに想いを馳せる1日となりました。

環境

REST APIサーバ + JavaScript MVWフレームワーク構成のWebアプリです。

サーバサイド

クライアントサイド

  • AngularJS 1.3.14

状況

ユーザがアプリの画面で入力した日時を、json形式でAPIサーバに送信するような状況です。

前置き: Date and Time API(JSR310)とは

Java SE 8から導入された日付・時刻を扱うAPIです。

アプリが動作するのがJava8ということもあり、ここではJava8以前からある java.util.Date は使いたくないので、日付・時刻はすべてこのJSR310で定義されたクラスのオブジェクトとして扱うことにします。

ということで、ユーザが入力した日時はサーバサイドで以下のいずれかのクラスにマッピングされることになります。

JacksonでJSR310のクラスにデシリアライズするには

サーバサイドはJavaなので、JavaJSONパーサライブラリが必要です。上で書いたとおり、ここでは定番のjacksonを使うことにしました。

サーバサイド

依存関係に com.fasterxml.jackson.datatype:jackson-datatype-jsr310 を追加します。jacksonのcoreライブラリにはJSR310のクラスのパーサは実装されていないため、この追加モジュールを加える必要があります。

Jackson support for Java 8 Date & Time API data types is automatically registered when Java 8 is used and jackson-datatype-jsr310 is on the classpath. Joda-Time support is registered as well when jackson-datatype-joda is part of your project dependencies.

引用: Latest Jackson integration improvements in Spring

私はビルドシステムとしてGradleを使っているので、以下の記述をbuild.gradleのdependenciesに追加します。

compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.5.1")

日付情報を受け取るクラスを決める

先に書いたとおり、JSR310には日時を表現する3つのクラスがあります。

  • java.time.LocalDateTime
  • java.time.ZonedDateTime
  • java.time.OffsetDateTime

今回

  • DB(MySQL)に datetime 型で日付を格納している
  • ORマッパー(Doma)がデフォルトで、MySQLdatetime 型のカラムを LocalDateTimeマッピングする

ということで、 LocalDateTime クラスとしてユーザの入力した日時を受け取ることにします。

問題発生

ユーザが入力した日時データをPOSTすると、サーバ側のアプリ上で例外が発生してアプリが停止しました。

原因

jacksonの LocalDateTimeDeserializer ではデシリアライズできないフォーマットでjsonが送られてきたことが原因でした。

何が起きていたのか

たとえば「2015年1月1日0時0分0秒」という日時データをjsonで送るとき、サーバ側には

{date: "2015-01-01T00:00:00.000Z"}

のようなフォーマットの文字列で送られていました。
このTやらZやらが謎です。ということでぐぐると、ISO-8601形式を知りました。

ISO-8601形式

詳しくはWikipedia先生をどうぞ。

ISO 8601 - Wikipedia

中ほどを見ていくとありました

  • 日付と時刻の間にTを挟んで表記する
  • 時刻の末尾にZを加える事で協定標準時(UTC)を表現できる

さらに調べると、JavaScriptにはまんま toISOString() 関数がありました。

Date.prototype.toISOString() - JavaScript | MDN

toISOString(new Date()) みたいなことをすると、確かにISO-8601形式で日時が表示されました。

Jackson Deserializerでデシリアライズ可能なフォーマット

JacksonでjsonをLocalDateTimeにマッピングする時に使われるDeserializerは LocalDateTimeDeserializerクラス です。このクラスがデシリアライズ可能なフォーマットがわかれば良いと思い、とりあえずソースコードを見ていたら、ありました。

jackson-datatype-jsr310/LocalDateTimeDeserializer.java at master · FasterXML/jackson-datatype-jsr310

    private LocalDateTimeDeserializer() {
        this(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
    }

コンストラクタの引数 DateTimeFormatter.ISO_LOCAL_DATE_TIME がめちゃくちゃ怪しいですね。

この時点でうすうす原因に気づいた感じがしてきましたが DateTimeFormatter.ISO_LOCAL_DATE_TIME はJSR310のクラスなのでリファレンスを読んでみると

フォーマッタ 説明
ISO_LOCAL_DATE_TIME ISOローカル日付および時間 '2011-12-03T10:15:30'

DateTimeFormatter (Java Platform SE 8 )より引用

Zがない

LocalDateTimeDeserializerは文字通りローカルな時刻(=タイムゾーンを持たない時刻)を扱うので、ケツZなぞ知らん、というわけです。

例外発生までの流れ

ユーザが日付を入力する
-> Dateオブジェクトが作られる
-> DateオブジェクトをPOSTする時、Angular内部で toISOString() 関数によりISO-8601形式に変換される(たぶん)
-> ケツZがついたフォーマットでPOSTされる
-> LocalDateTimeDeserializerからみたらデシリアライズできないケツZ
-> \(^o^)/

解決策の前に前提条件

  • JavaScriptのDateオブジェクトをAngularJSで送信しようとすると、ISO-8601形式で送信される
  • jacksonの LocalDateTimeDeserializer ではISO-8601形式の文字列をデシリアライズできない

解決策

クライアントかサーバか、どちらかで頑張るということになります。。。

解決策1: clientで日時のフォーマットを整形してから送信する

AngularJSなら、dateフィルタに処理させる。

$filter('date')(new Date(), "yyyy-MM-dd'T'HH:mm:ss")

これでDateオブジェクトのケツZが除かれた状態で送信されるので、何の問題もなくLocalDateTimeDeserializerでデシリアライズできます。ただし、この対処はタイムゾーンなしデータへの変換作業をclient側に寄せています。この方法ではすべての箇所で変換してから送らないといけないのでだるいです。

解決策2: serverでZonedDateTime型にデシリアライズする

ZonedDateTimeに対応したDeserializerである InstantDeserializerタイムゾーン情報付きのISO-8601形式のフォーマットをデシリアライズすることができます。 なので、ユーザの入力を一旦ZonedDateTime型で受け取り、内部でLocalDateTime型に変換します。 DBに格納する前にZonedDateTime型のオブジェクトをLocalDateTime型のオブジェクトに変換すればOKです。 幸い、それ用のAPIが用意されていました。( ZonedDateTime#toLocalDateTime() )

まとめ

解決策2を採用して、めでたく日時情報をやりとりできるようになりました。おしまい。

参考