うっかりエンジニアのメモ

未来の自分に宛てたメモ

Spring Socialについて自分用メモ

概要

SpringアプリケーションからTwitterFacebookなどのSNSサービスを手軽に利用するためのライブラリ。

Spring Socialを使うメリット

  • SNSのユーザ認証が手軽に実装できる(OAuth, OpenID Connectの詳細を知らなくてもOK)
  • Twitter, Facebook, LinkedIn, Githubなど大手SNSなら、それらのREST APIのラッパーSDKが利用できる
  • Spring Securityと連携したユーザ認証機構を手軽に実装できる

おことわり

この記事では、接続するSNSとしてTwitterを例として話します。
Spring Socialのreferenceをもとに話します。
Spring Social Reference

build.gradle

compile("org.springframework.boot:spring-boot-starter-social-twitter")

SNSアカウントでアプリにログインする機能がほしい場合はさらにspring-social-securityが必要。 compile("org.springframework.social:spring-social-security:1.1.0.RELEASE")

用語説明

provider

OAuth認可フローにおける、tokenの発行者。

consumer

OAuth認可フローにおける、tokenの受取者。

つまりSNSを利用するアプリがconsumerで、利用するSNSがproviderとなる。

SNSAPIを呼び出す単純なアプリ(connecting to providers)

SNSとのOAuth認証部分が全てspring-social側で実装されているので、開発者が書くコードは驚くほど少ない。

ConnectController

org.springframework.social.connect.web内で実装されているController
下記エンドポイントが自動的に利用できるようになる。

GET /connect

すべてのproviderについて、アカウント接続状況を一覧で表示する

GET /connect/{providerId}

指定したproviderのアカウント接続状況を表示する。

POST /connect/{providerId}

指定したproviderへの接続処理を開始する。

GET /connect/{providerId}?oauth_token={request token}&oauth_verifier={verifier}

Receives the authorization callback from the provider, accepting a verification code. Exchanges this verification code along with the request token for an access token and completes the connection. The oauth_verifier parameter is optional and is only used for providers implementing OAuth 1.0a. (※リファレンス引用)

DELETE /connect/{providerId}

指定したproviderへの接続情報を削除する。

DELETE /connect/{providerId}/{providerUserId}

ユーザのproviderUserIdに基づいて、指定したproviderへの特定の接続のみ削除する。

{providerId}TwitterであればtwitterFacebookならfacebookのような文字列。

viewはデフォルトで未定義なので、別途用意する必要がある。 サンプルアプリではtemplates.connectフォルダ以下にthymeleafのテンプレートファイルが作られている。

  • twitterConnect.html Twitterに未接続の場合表示されるview
  • twitterConnected.html Twitterに接続済みの場合表示されるview

SNS接続済みかをチェックする

connectionRepository.findPrimaryConnection(Twitter.class)で判別できる。
すでに認証できていれば Connection<Twitter> クラスのコネクションが返ってくるし、未接続ならnullが返る。

Connection<A>はspring-socialの根幹をなすinterface。

public interface Connection<A> extends Serializable {

    ConnectionKey getKey();

    String getDisplayName();

    String getProfileUrl();

    String getImageUrl();

    void sync();

    boolean test();

    boolean hasExpired();

    void refresh();

    UserProfile fetchUserProfile();

    void updateStatus(String message);

    A getApi();

    ConnectionData createData();

}

認証情報の永続化

OAuth認証に必要な情報は以下の4つ。

  • アプリのconsumer ID
  • アプリのconsumer secret
  • ユーザのaccess token
  • ユーザのaccess token secret

上2つはSNSでアプリ登録するとアプリ1つにつき1つ付与されるので、それをPropertiesファイルなどに記載すればよい。 下2つはユーザごとに異なるので、ユーザごとにconnectionから取得し、DBなどに永続化することになる。

access tokenとaccess token secretはそれぞれconnectionから以下のメソッドで取得できる。

  • connection.createData().getAccessToken()
  • connection.createData().getSecret()

providerのAPIコール

REST APIコールをラップするクラスが用意されている。
ConnectionインタフェースのgetApi()メソッドでラッパーのインスタンスを取得できる。型はprovider名と同じ。(TwitterならTwitterクラス)

@Controller
@RequestMapping("/")
public class HelloController {

    private Twitter twitter;

    private ConnectionRepository connectionRepository;

    @Inject
    public HelloController(Twitter twitter, ConnectionRepository connectionRepository) {
        this.twitter = twitter;
        this.connectionRepository = connectionRepository;
    }

    @RequestMapping(method=RequestMethod.GET)
    public String helloTwitter(Model model) {
        if (connectionRepository.findPrimaryConnection(Twitter.class) == null) {
            return "redirect:/connect/twitter";
        }

        model.addAttribute(twitter.userOperations().getUserProfile());
        CursoredList<TwitterProfile> friends = twitter.friendOperations().getFriends();
        model.addAttribute("friends", friends);
        return "hello";
    }

}

上記のコードでは、OAuth認証後にはtwitterインスタンスを用いてTwitterの各種API呼び出しができるようになっている。
例えばtwitter.friendOperations().getFriends()でログインユーザのフォローしている人の情報を取得できる。

SNSアカウントでログインするアプリ(signing in with provider account)

いわゆるソーシャルログイン。

利用例

単純なアプリ例との違い

  • ユーザが同じブラウザでTwitterにログイン中で
  • そのアプリのアクセスをすでに許可している

と、認証を要求されずスムーズにログインできる。 (authorizeせず、authenticateだけ行われる)

先ほどの単純なアプリの場合、上記条件を満たしていても、いちいち「(アプリ名)があなたのアカウントを利用することを許可しますか?」というTwitterの画面にリダイレクトされる。

  • 単純なアプリでエンドポイントを提供するConnectControler
  • SNSアカウントでログインするアプリでエンドポイントを提供するProviderSignInController

どちらのControllerにも定義されているConnectSupportクラスのフィールドにboolean useAuthenticateUrlという値があり、これがいちいちSNSのアプリ認証画面を出すかどうか左右している。

実装方法は2種類ある

SocialAuthenticationFilterを使う方法と ProviderSignInControllerを使う方法がある。

どのように両者を使い分けるかはSpring Social Referenceに記載があり

Although both options will work with Spring Security, we recommend using SocialAuthenticationFilter in applications where Spring Security is in play.

とあるように、Spring Securityを利用しているアプリケーションでは、SocialAuthenticationFilterを使う方法が推奨される。

一方で、

ProviderSignInController, on the other hand, is agnostic to the security mechanism your application employs and can be used in applications that aren’t using Spring Security.

とあるように、ProviderSignInControllerはSpring Securityと独立して(agnostic to security mechanism)動作するので、Spring Securityを利用しないアプリケーションでもProviderSingInControllerを使えば、ソーシャルログイン機能を実装することが可能になる。

SocialAuthenticationFilter

Spring Securityのconfigurationに.apply(new SpringSocialConfigurer())を追加する。

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .formLogin()
            .loginPage("/signin")
            .loginProcessingUrl("/signin/authenticate")
            .failureUrl("/signin?param.error=bad_credentials")
        .and()
            .logout()
                .logoutUrl("/signout")
                .deleteCookies("JSESSIONID")
        .and()
            .authorizeRequests()
                .antMatchers("/admin/**", "/favicon.ico", ...).permitAll()
                .antMatchers("/**").authenticated()
        .and()
            .rememberMe()
        .and()
            .apply(new SpringSocialConfigurer());
}

ProviderSignInController

SNSのアカウントによるログイン機能をSpringアプリに追加するにはProviderSignInControllerをbeanとして設定する。

@Bean
public ProviderSignInController providerSignInController(
            ConnectionFactoryLocator connectionFactoryLocator,
            UsersConnectionRepository usersConnectionRepository) {
    return new ProviderSignInController(
        connectionFactoryLocator,
        usersConnectionRepository,
        new SimpleSignInAdapter(new HttpSessionRequestCache()));
}

参考情報

ニュー・シネマ・パラダイス

※2012年の日記をサルベージ。

高校の頃付き合ってた彼女は,映画監督を目指していた.
頭も良くて,本も沢山読んでいた.当時図書委員だった僕なんかより,ずっと沢山.吹奏楽部でOb.を吹いていたのもあってか,音楽の大切さもわかっていて,そしてちょっと人付き合いが不器用だった.
もう数年会っていないし,メールのやり取りもない.まったくの音信不通である.
彼女は結局,映画監督になったのだろうか??

そんな彼女がこよなく愛していたのが,この映画だった.
当時,この作品は必ず観てほしいと何度も勧められていたが,あらすじだけ聞いた感じだと自分にはピンと来るものが無く,エンニオ・モリコーネ氏の音楽だけ気に入って何度も聞いていた.

そうやって,僕のiPhoneには6年前からこの題名のアルバムが入っている.

最近,そういえばこれは映画音楽だったと思い出し,DVDを買ってきた.
今日やっと本編を観ることができた.

…なんで僕は,今までずっと観てこなかったのだろう.
ラストの,つなぎあわせたフィルムを主人公が試写室でひとり観るシーンは,ひたすらに切なかった.

舞台は映画館のある小さな村.幼少を映画技師の男アルフレードと過ごした少年トトが初恋,徴兵,挫折を経てやがて大人になり,村を捨てて一人前の映画監督として巣立つ.しかし,ある晩に電話で映画技師の死を知る.彼は葬式へ参列するため,30年振りに故郷に戻ることとなる.

お話としては,こういうことだし,映画の最初から最後まではたった1日の話.
しかしほとんどを占める主人公の回想シーンで,アルフレードがトトに語りかける台詞が素晴らしい.

「自分のすることを愛せ。子供の時、映写室を愛したように」

「人生は、お前が見た映画とはちがう。人生は、もっと困難なものだ」

当時,トトは青年に成長していた.しかし徴兵がきっかけで初恋の相手エレナと音信不通となる.失意のどん底にあるトトに,アルフレードが投げかけたのが上の台詞.

アルフレードは年齢が離れているが,トトの良き理解者だった.トトをなぐさめ,エレナとの恋路を応援する選択肢もあっただろう.しかし,アルフレードはトトと接する中で,トトの映画監督としての素養と映画に対する並々ならぬ愛を感じていた.だからこそ,アルフレードはトトに,夢を目指してほしかった.”郷愁に惑わされ”村に留まって映画技師を続けた自分の様な人生を,彼には歩んでほしくなかった.…愛するトトだからこそ.彼の愛はいつだって不器用で,そして深かった.それは最後のシーンでトトが観る,アルフレッドが遺したフィルムにも表れている.

この映画の良さに6年前に気付いていた彼女は,今いったいどんな感性を持っているんだろうと,ふとぼんやり考えてしまった.トトが恋と郷愁を捨てて,将来の夢のために知らない土地を目指していったように,彼女もまた,僕との恋を捨てて夢のために歩く決意をしたのなら,ほんとうに彼女はかっこいい人間だと思う.

ジュゼッペ・トルナトーレという名監督を教えてくれた点も,感謝したい.

ほんとうに,いい映画だった.

AdobeCCはデジハリで買うと最安。しかも即利用開始できる

趣味で同人誌や動画の制作をしているので前からAdobe CS4を使ってきたのだけど、さすがに古すぎて動作が厳しくなってきた。 そこでAdobeCCが必要になった、が、まともに買うと年6万円。合法的に安く調達する方法を調べた。

まとめ

デジハリで「Adobeマスター講座[ソフト付属]」を契約すると、AdobeCCを29800円(税込)で12ヶ月間利用できる。 AdobeCCシリアルコードは申込完了後、メールアドレス宛に即時発行されるので、すぐに利用開始できる。

Adobe Creative Cloud 基礎講座 | Web、CG、映像、アプリ、造形はデジハリの通信講座

なぜデジハリなのか

この記事を読んでいる人なら、デジハリ/ヒューマンアカデミー/アドバン あたりを比較検討中だと思う。 価格差からアドバンがまず候補から外れて、デジハリヒューマンアカデミーになる。 デジハリは最近Adobe講座の仕組みをリニューアルして、AdobeCCのシリアルコードを即時発行できるようになった。

f:id:entropiajp:20180116164051p:plain

僕の場合、30日の試用期間が切れていた and すぐに使い始めたかったので、デジハリの即時発行は大変素晴らしかった。 実際、申込みボタン押して30秒でシリアルコードが届いた。

FAQ

商用利用OKなのか?

OK

卒業後(受講期間終了後)も利用できるのか?

できる。が、12ヶ月経過後も利用するなら再びAdobeCCライセンス付きの講座を受講するか、あるいはAdobeCC通常版を別途契約する必要がある

アカデミック版ではなく通常版のセールでこのくらい安くならないか?

ならないっぽい。直近だと2017年7月頃にAmazon Prime Dayで44%OFFの33432円まで実績*1があるようだけど、それでも29800円には到達しない。

マッチングアプリで彼女ができるまで【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

参考

2015年まとめ

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

今年勉強したもの

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

resultoon

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

entropiajp/resultoon · GitHub

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

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

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

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

f:id:entropiajp:20151231233855p:plain

抱負

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

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