パティスリー・ジョルジュマルソー

クリスマスが終わって、男一人でもケーキを買いやすくなったので、渡辺通にある『パティスリー・ジョルジュマルソー』に行ってみた。ジョルジュマルソーといったら、大手門にあるフレンチの有名店。その店がプロデュースしたパティスリー店がここ。

会社帰りに寄ったので、ケーキは残り少なかったけど、なんとか2個買えた。

苺のショートケーキは、スポンジがふわっとしていて、見た目以上にボリュームを感じた。 オーソドックスで期待通りの美味しさ。 ただ、周りの生クリームが自分にはちょっと多かったかな。これは好みの問題だけど。

苺のタルトは見た目が色鮮やか。冬だというのに、苺は一粒一粒がしっかり甘い。 よくこれだけ甘い苺を揃えたもんだ。 中のカスタードクリームは主張し過ぎずにそっと苺を支えてくれている。 美味かった。

関連ランキング:ケーキ | 渡辺通駅天神南駅西鉄福岡駅(天神)

2017 年の抱負

毎年抱負を書いてはいるものの、達成できたためしはない。でも続けることが重要。性懲りも無く、2017 年も抱負を書きたいと思う。

2017 年は OSS に注力したい。それも、有名 OSS にコントリビュートするのではなくて、自らツールやライブラリを書いて公開したい。言語は去年に引き続き C#。.NET Core と Xamarin がメインで、余力があれば Unity も。

というのも最近、エンジニアとしての生存戦略を考えなければと思うようになった。この先生きのこるために実績を作りたい。本業でやったことは公開できそうにないので、プライベートプロジェクトでやるしかない。

1日のうち30分〜1時間は時間を確保できるようになったので、MacBook Proを新調した今年ならできるはず。ネットやマンガといった誘惑に負けないことが前提だけど。

2016 年ふりかえり

今年は 30 分でもいいから毎日コードを書くことを目標にしていたが、 ぜんぜん達成できなかった。

後半の方では時間を確保できる日が増えてきたので、 挽回できるかと思いきや、 肝心の MacBook Proカーネルパニックを頻繁に起こすようになり、 とてもコードを書ける状況じゃなくなった。 大誤算。

あと、家のネット環境が変わったのも影響が大きかった。 今まで使っていた au 光の回線を節約のために解約し、 マンションで提供されている回線を使うようにしたら、 これが遅いのなんの。 夜はネットを見るのがせいぜいで、大きめのファイルのダウンロードはまったく出来なかった。 いやはや、ここまで遅いとはね。

Feedly電子書籍で最低限のインプットはできているので、引き続き課題はアウトプットだな。 ブログはなんとか更新できているけど、プロダクトは今年もリリースできなかった。 新しい MacBook Pro を購入して、マシンスペックが上がったので、 来年こそはバリバリコードを書いていきたい。

それにしても、毎年目標を立ててはいるものの、達成できたためしが無いな。 とても自己採点なんてできない。

『アンサー』を買った

BUMP OF CHICKEN の新曲『アンサー』が iTunes Store で配信されていたので購入。

アンサー

アンサー

新曲が出ると数日は1曲リピートで聞き続けるんだけど、 今回も言うに及ばずリピートし続けている。

特に響いたのが

失くしたくないものを 見つけたんだって気づいたら こんなに嬉しくなって こんなに怖くなるなんて

という歌詞。 この2~3年は、子供が生まれたり、身内が立て続けに亡くなったりと、 生と死を身近に感じることが多かったから、 臆病になってしまった。 今の自分はまさにこの歌詞ような心情だ。

ちなみに、この曲はアニメ『3月のライオン』のオープニング曲だったらしい。 アニメは見てないけど、PV は公式の YouTube で見た。 そして、この曲がオープニング曲だった時のエンディング曲は『ファイター』。 両方同じアーティストというのはかなり珍しいんじゃないだろうか。

認証に xAuth を使う Web API を Python で呼び出すメモ

requests と標準ライブラリだけを使って書いてみた。 パラメータの指定、特に oauth_signature の作成がシンドイ。 Authorization の指定も。

# -*- coding: utf-8 -*-
from random import getrandbits
from time import time
import hmac
import hashlib 
import urllib
import urlparse
import requests

CONSUMER_KEY = "your consumer_key"
CONSUMER_SECRET = "your consumer_secret"
ACCESS_TOKEN_URL = "access token url"
WEB_API_URL = "web api url"
USERNAME = "your user name"
PASSWORD = "your password"

def escape(s):
    if not isinstance(s, bytes):
        s = s.encode("utf-8")
    return urllib.quote(s, safe="~")

# xAuth に必要なパラメーターを作成
payload = {
    "oauth_consumer_key": CONSUMER_KEY,
    "oauth_signature_method": "HMAC-SHA1",
    "oauth_timestamp": str(int(time())),
    "oauth_nonce": str(getrandbits(64)),
    "oauth_version": "1.0",
    "x_auth_mode": "client_auth",
    "x_auth_username": USERNAME,
    "x_auth_password": PASSWORD,
}
payload["oauth_signature"] = hmac.new(
  "%s&%s" % (CONSUMER_SECRET, ""),
  "&".join([
      "POST",
      escape(ACCESS_TOKEN_URL),
      escape("&".join(["%s=%s" % (escape(x), escape(payload[x]))
          for x in sorted(payload)]))
  ]),
  hashlib.sha1).digest().encode("base64").strip()

# xAuth のアクセストークンを取得
r = requests.post(ACCESS_TOKEN_URL, params=payload)
print r.text
token = urlparse.parse_qs(r.text)
oauth_token = token["oauth_token"][0]
oauth_token_secret = token["oauth_token_secret"][0]

# Web API を呼び出すためのパラメータを作成
payload = {
    "oauth_consumer_key": CONSUMER_KEY,
    "oauth_signature_method": "HMAC-SHA1",
    "oauth_timestamp": str(int(time())),
    "oauth_nonce": str(getrandbits(64)),
    "oauth_version": "1.0",
    "oauth_token": oauth_token,
}
payload["oauth_signature"] = hmac.new(
    "%s&%s" % (CONSUMER_SECRET, oauth_token_secret),
    "&".join([
      "GET",
      escape(WEB_API_URL),
      escape("&".join(["%s=%s" % (escape(x), escape(payload[x]))
          for x in sorted(payload)]))
    ]),
    hashlib.sha1).digest().encode("base64").strip()

# Web API 呼び出し
headers = {
    "Authorization": "OAuth %s" % escape(",".join(
        ['%s="%s"' % (escape(x), escape(payload[x])) for x in payload]))
}
r = requests.get(WEB_API_URL, params=payload, headers=headers)
print r.text

新型 MacBook Pro を買った

家で使っている MacBook Proカーネルパニックを頻繁するようになり、開発どころかネットを見ることですら支障をきたすようになった。一度、初期状態に戻してみたけど、改善しない。これは寿命が来たのだろうか。購入してから 4年以上は立つからなぁ。

Apple Care はとっくの昔に切れたし、ちょうど新型 MacBook Pro も発売されたので、思い切って買い替えることにした。

購入したのは新型 MacBook Pro 13インチ TouchBar モデル。SSD が 512GB のやつをカスタマイズして、メモリを 16GB に増やした。それで予算オーバーになったので CPU は据え置き。

www.apple.com

注文してから待つこと2週間。ようやく届いた。

開封の儀。

まず最初に、本体の薄さと軽さに驚いた。前の MacBook Pro は 13 インチとは言え、とても持って歩きたいとは思えない重量だったのに対し、新しい MacBook Pro は鞄に入れて毎日通勤しても問題無いレベル。実際にはやらないけど。

次に Retina ディスプレイの解像度の高さにビビった。じつは初 Retina。 良さはさんざん聞かされたけど、ここまで美麗だったなんて。 そんな Retina ディスプレイになって嬉しいのは、もう iOS シミュレーターのサイズを半分に設定しなくて済むことだったりするのだけども。

SSD かつ、メモリを 16GB に増量したおかげで、なにもかもが爆速に感じる。そういえば SSD も初体験。2016 年も終わりになってようやくとは、エンジニアの端くれとして情けない気もするが、だって金ないねん…。Safari がキビキビ動くのは当然として、前のマシンでは動作が非常にもっさりしていた SoureTree でさえも、まるで違うアプリのようにサクサク動く。これが金の弾丸か!動作が重いアプリの代表格である IDE はまだインストールできていないが、Visual Studio for Mac なんかは前のマシンの時とは比べ物にならないくらい機敏な動作になるのではと期待している。

あと、自分はファンクションキーをほとんど使わない人間だったので、1日触ったぐらいでは TouchBar に変わったことによる影響は感じられなかった。ただ、タッチタイピングしていると、ほとんど TouchBar を見ないような。視界の下で表示がなんか切り替わっているな、というのは認識しているけど、わざわざ視線を下に移動しないな。自分の場合は。

超単純な 3 層ニューラルネットワークを実装

C# でゼロから Deep Learnig を実装する挑戦の続き。 今回は超単純な 3 層ニューラルネットワークを実装してみた。 といっても、『ゼロから作る Deep Learnig』の 3 章の写経みたいなもの。

C# + Math.NET Numerics で試行錯誤しながら書いたコードは次の通り。

using MathNet.Numerics.LinearAlgebra;
using System;

namespace ThreeLayerNeuralNetworkSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var network = new ThreeLayerNeuralNetwork();
            var x = Vector<double>.Build.DenseOfArray(new double[] { 1.0, 0.5 });
            var y = network.Forward(x);
            Console.WriteLine(y);
            Console.ReadLine();
        }
    }

    /// <summary>
    /// 3 層ニューラルネットワークを表します。
    /// </summary>
    public class ThreeLayerNeuralNetwork
    {
        /// <summary>
        /// 第 1 層の重み
        /// </summary>
        readonly Matrix<double> W1;

        /// <summary>
        /// 第 1 層のバイアス
        /// </summary>
        readonly Vector<double> B1;

        /// <summary>
        /// 第 2 層の重み
        /// </summary>
        readonly Matrix<double> W2;

        /// <summary>
        /// 第 2 層のバイアス
        /// </summary>
        readonly Vector<double> B2;

        /// <summary>
        /// 第 3 層の重み
        /// </summary>
        readonly Matrix<double> W3;

        /// <summary>
        /// 第 3 層のバイアス
        /// </summary>
        readonly Vector<double> B3;

        /// <summary>
        /// <see cref="ThreeLayerNeuralNetwork"/>
        /// クラスの新しいインスタンスを初期化します。
        /// </summary>
        public ThreeLayerNeuralNetwork()
        {
            W1 = Matrix<double>.Build.DenseOfArray(new double[,]
            {
                { 0.1, 0.3, 0.5 },
                { 0.2, 0.4, 0.6 }
            });
            B1 = Vector<double>.Build.DenseOfArray(new double[] {
                0.1, 0.2, 0.3
            });
            W2 = Matrix<double>.Build.DenseOfArray(new double[,]
            {
                { 0.1, 0.4 },
                { 0.2, 0.5 },
                { 0.3, 0.6 }
            });
            B2 = Vector<double>.Build.DenseOfArray(new double[] {
                0.1, 0.2
            });
            W3 = Matrix<double>.Build.DenseOfArray(new double[,]
            {
                { 0.1, 0.3 },
                { 0.2, 0.4 }
            });
            B3 = Vector<double>.Build.DenseOfArray(new double[] {
                0.1, 0.2
            });
        }

        public Vector<double> Forward(Vector<double> x)
        {
            // ベクトルと行列の内積は * で計算できる
            // 活性化関数にはシグモイド関数を使う
            var a1 = x * W1 + B1;
            var z1 = Sigmoid(a1);

            var a2 = z1 * W2 + B2;
            var z2 = Sigmoid(a2);

            // 第 3 層では活性化関数ではなく恒等関数を使う
            // つまり、そのまま出力層に渡す
            var a3 = z2 * W3 + B3;
            var y = IdentityFunction(a3);

            return y;
        }

        /// <summary>
        /// シグモイド関数
        /// </summary>
        /// <param name="a">ベクトル</param>
        /// <returns>活性化後のベクトル</returns>
        private Vector<double> Sigmoid(Vector<double> a)
        {
            return a.Map(x => 1 / (1 + Math.Exp(-x)));
        }

        /// <summary>
        /// 恒等関数
        /// </summary>
        /// <param name="a">ベクトル</param>
        /// <returns><paramref name="a"/> をそのまま返します</returns>
        private Vector<double> IdentityFunction(Vector<double> a)
        {
            return a;
        }
    }
}

実行結果がこちら。

『ゼロから作る Deep Learnig』と同じ結果が出力できている。

Vector<T>Matrix<T>演算子オーバーロードしてくれているおかげで、 ベクトルと行列の内積を良い感じで記述できた。 Math.NET Numerics なかなかやるな。