Bitbucket の iOS クライアントは CodeBucket で決まり

Bitbucket の iOS クライアント『CodeBucket』がいつの間にか無料になっていた。

codebucket.dillonbuchanan.com

Bitbucket の iOS クライアントといえば、自分でもイシューに特化した『Bitissues』を作って使っていたけど、無料と知って即 CodeBucket に乗り換えた。

Bitissues を作った理由は、イシューに特化したシンプルなアプリが欲しかったから。でも実は、無料で使える完成度の高い iOS クライアントが無かったから、ってのもある。開発当時すでに CodeBucket が無料だったら、作ってなかった。

懐事情が苦しくて Apple Developer Program 更新してないし、CodeBucket で満足しちゃったから、Bitissues の開発続けるモチベーション無くなったな。他に作りたいものはあるし、そもそも iOS アプリを開発する時間を捻出することも難しい。ソースコード整理して、Github に公開するかな。それすらいつになるかわからないけど。

CodeBucket は Xamarin で作られているのも興味深い。ソースコードはなんと Github に公開されているから、Xamarin で iOS アプリを作るときの良い手本になりそうだ。

github.com

ASP.NET Identity でカスタムクレームを使う

マルチテナントな Web サービスを作っていて、 どのテナントかの判断を現在ログインしているユーザーが持っているテナント ID で判断している。

そのため、HttpContext.User.Identity.GetUserId() で取得したユーザー ID を使って、 データベースからユーザーを取得してテナント ID を取り出していた。

でも最近、テナント ID をカスタムクレームに追加すればいいことに気付いた。

public static class CustomClaimTypes
{
    public const string TenantId = "http://example.org/claims/tenantid";
}

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);

        // カスタムクレームを追加する
        userIdentity.AddClaim(new Claim(CustomClaimTypes.TenantId, this.TenantId.ToString()));

        return userIdentity;
    }
    
    public int TenantId { get; set; }
}

public static class IdentityExtensions
{
    public static int? GetTenantId(this IIdentity identity)
    {
        var claimsIdentity = identity as ClaimsIdentity;
        if (claimsIdentity != null)
        {
            var claim = claimsIdentity.Claims.FirstOrDefault(c => c.Type == CustomClaimTypes.TenantId);
            if (claim != null)
            {
                int tenantId;
                if (int.TryParse(claim.Value, out tenantId))
                {
                    return tenantId;
                }
            }
        }
        return null;
    }
}

コントローラーからは HttpContext からたどって取得できる。

this.HttpContext.User.Identity.GetTenantId();

テナントごとに違うサブドメインにできたら、サブドメインでテナントを判別できて一番いいんだけどね。 大人の事情でそれはやらないことになったから、仕方ない。

味のかつえだ

会社帰り、帰宅ルートから遠いけど、 平尾にあるトンカツ専門店『味のかつえだ』に行ってみた。

ここは当然トンカツが人気。それなのに、トンカツ同じかそれ以上にちゃんぽんが人気みたい。 メンチカツも美味そうだったので迷ったけど、 寒かったのでちゃんぽんを注文してみた。

食べる前は、トンカツ屋のちゃんぽんだと侮っていた。 食べて人気なのも納得。 とにかくスープが美味い。 第一印象はあっさりスープと思いきや、意外に濃い口で甘みも感じる。 魚介がベースなんだろうか。 良いスープが出ている。

良い意味で期待を裏切られた。 また食べたいと思えるちゃんぽんだった。 トンカツのお店なので、次はトンカツかメンチカツを注文したいところ。 でも、ついまたちゃんぽんを注文してしまいそうだ。

関連ランキング:ちゃんぽん | 西鉄平尾駅薬院駅薬院大通駅

ジャック岩田屋店

天神での買い物帰りに岩田屋に寄って、『ジャック』でケーキを買った。 そういえば、大名にあった店舗が閉店して、代わりに岩田屋本館地下2Fに出店してからだいぶ経つな。

今回のお目当ては『ガトーシャンティ』。 生クリームは甘さ控えめで好みのタイプだ。 イチゴは良い意味で主張し過ぎない甘さだった。 調和が取れていて上品な味だと思う。 さすがの完成度。

1個だけじゃ物足りないので『ジャック』も買ってみた。 前回はあまり味わえなかったからね。 洋梨のムースをキャラメルのムースがはさんでいる。 洋梨の甘さだけでなく、キャラメルのほろ苦さもあって、 記憶よりも大人な味に感じた。

ガトーシャンティをようやく食べることができて満足。 ただ、ケーキの値段が高いなぁ。 こんな高かったっけ。 ケーキ2個で1000 円弱は財布に結構なダメージがあるよ。

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

パンフリット

大名にある揚げパン専門店『パンフリット』に行ってみた。 一度、12時過ぎに行ったんだけど、お目当てのカレーパンが売り切れていて断念したので、 日を変えて挑戦。 開店時間すぐ後に行ってみた。

一番人気の『蜂の家カレー』。 佐世保の人気店『蜂の家』のカレールーを使った贅沢な一品。 パンは米粉を使っているため、表面はカリッとしていても、中はかなりモチモチ。 カレーは甘口で、これが米粉のパンに合って美味い。 カレーが米に合わないわけがないか。

もう1つ、二番人気の『トロッとチーズのカルツォーネ』も注文してみた。 具はチーズとトマトソース。 トマトソースの旨みとわずかに残る酸味、それにチーズが合わさって、これまた美味。 トマトとチーズの相性はマルゲリータで証明されているもんな。

場所がほとんど赤坂なので頻繁には行けないが、 カレーパンが期待通りに美味かったので、また買いに行きたい。 クリームパンも気になったので、今度はそっちも食べてみたいところ。

関連ランキング:カフェ | 赤坂駅薬院大通駅西鉄福岡駅(天神)

Heroku で最小の ASP.NET 5 アプリを動かす

Heroku が .NET サポートを予定しているのか知らないけど、 Github には heroku/dotnet-buildpack という ASP.NET 5 用のビルドパックがある。

github.com

これを使えば ASP.NET 5 アプリを Heroku で動かせると思いきや、 Mac OSX で作成したプロジェクトをデプロイすると、 コンパイル時に「アーキテクチャx64x86 にしろゴルァ」ってエラー発生。

このエラーに関しては、既にプルリクエストが存在するので、 問題無ければさっさとマージしてほしいところ。 プルリクエストを送っている側の dotnet-buildpack を使うと上手くいった。

github.com

手順は次の通り。

# DNVM を入れてなければインストール
brew tap aspnet/dnx
brew update
brew install dnvm

# dotnet-buildpack は Mono なので
# 最新の DNX for Mono をインストールする
dnvm upgrade -r mono

# Node を入れてなければインストール
brew install node

# yo と ASP.NET 5 のジェネレーターをインストール
npm install -g yo generator-aspnet

# ASP.NET 5 のプロジェクトを作成
# タイプは Empty Application を選択
# 名前は HerokuAspNet にでもしておく
yo aspnet

# 依存パッケージをインストール
cd HerokuAspNet
dnu restore

# 最小の ASP.NET 5 アプリを動かすのでそのまま Git でコミット
git init .
git add .
git commit -m "Initial commit"

# Heroku Toolbelt を入れてなければインストール
brew install heroku-toolbelt

# Heroku にアプリを作成してデプロイ
# ビルドパックは ASP.NET 5 用のものを使う
heroku create --buildpack https://github.com/jincod/dotnet-buildpack.git
git push heroku master

# ブラウザで表示
heroku open

Heroku で ASP.NET 5 アプリが動いているぞ!

f:id:griefworker:20160105200803p:plain

データベースは使っていないけど、Entity Framework 7 や Dapper に Npgsql を組み合わせれば、 Heroku Postgres も使えるはず。

2016 年の抱負

新年最初のエントリは、毎年恒例、新年の抱負。 毎年「プロダクトを作る」って目標立てているけど、 達成できたためしがない。 そこで今年は趣向を変えてみる。

2016 年の抱負、それは『毎日コードを書く』。 それだけ。

具体的には、jQuery の開発者 John Resig が投稿して話題になった 『Write Code Every Day』を実践したい。 Rebuild で話題に上がったのは記憶に新しいね。

John Resig - Write Code Every Day

1 日 30 分でもいいから毎日コードを書くことで、 どれだけの成果が出るのか試してみたい。