ネットサービスとかGoogleとか豆知識とか。

ドラマ
2014年08月27日 15:01
Hulu: スティーブン・キング原作の「アンダー・ザ・ドーム」が面白い

スポンサード リンク

» Under the Dome - First Look - YouTube

Huluで配信されてる「アンダー・ザ・ドーム」という海外ドラマ、人気のテレビ番組の上位に出ていたものの海外ドラマは見始めたら長いしなぁと思って見て見ぬふりをしていたのですが、このドラマの原作がスティーブン・キングというのを知ったのをきっかけに見始めたら一気にシーズン1の全13話とシーズン2の最新エピソードまで視聴完了。

どういうストーリーかというと、アメリカの田舎町が突然巨大な透明のドームに覆われて外界から遮断されてしまい住民は軽くパニック、何か大いなる力によって選ばれたと感じた数名がドーム誕生の原因を探りつつ、町ではいかにも悪そうな町内会長が偽善行為で名声を得ようと画策、それを信じきっちゃう住民を見てるとイラッとするのですが、SFかつミステリーな内容でとても面白いです。第1話におけるドームの出現シーンが結構衝撃的でした。

今はシーズン2の途中で、アメリカでの放送後1ヶ月以内に最新ストーリーが追加されていってます。シーズン1は一気に見れたけど今は1週間たたないと続きが見れないので最新エピソードの追加が待ち遠しい。

第1話の長めの予告編も貼っておきます。

» Under the Dome - Exclusive Preview - YouTube

余談ですがシーズン2から登場する Grace Victoria Cox がかわいいです。

アンダー・ザ・ドーム DVD-BOX
アンダー・ザ・ドーム DVD-BOX (パラマウント ホーム エンタテインメント ジャパン)

アンダー・ザ・ドーム 上
アンダー・ザ・ドーム 上 (スティーヴン・キング)

イベント
2014年08月21日 23:12
かき氷コレクション@テレ朝夏祭り

スポンサード リンク

六本木ヒルズのテレ朝夏祭りで開催されているかき氷コレクションでかき氷を食べてきました。

roppongi-kakigoori-02.jpg

↑ こんな風に5店舗くらい並んでるので、食券を買って注文します。

椛屋 (もみじや)というお店のかき氷だけ21日から24日のみの期間限定だったせいか超絶人気で行列になっていました。自分は並ぶのめんどくさかったので、これまでかき氷コレクションに毎回参戦してるというどこでもドアの人にすすめられて「たい焼きなみへい」にしてみました。椛屋の次に人気っぽくて10分くらい待ちましたが、

roppongi-kakigoori-01.jpg

↑ 生いちご!美味い!

イチゴのシロップはシロップというよりいちごジャムという感じで濃厚。氷もサクサク。やっぱり猛暑にかき氷はピッタリです。猛暑いやだけど。

テレ朝夏祭りやかき氷コレクションは8月24日までなのでお早めに。

roppongi-kakigoori-03.jpg

ついでに66体のドラえもんが見られるのも24日までみたいです。

人気店に教わる 極上かき氷 (ei cooking)
人気店に教わる 極上かき氷 (ei cooking) (エイ出版社)

iPhoneアプリ開発
2014年08月18日 20:35
Swift: AWS SDK for iOS 2.0を使ってS3にファイルをアップロード

AWS SDK for iOS 2.0 (まだ Developer Preview だが) を使って Amazon S3 にファイルをアップロードする処理を書いていたのだがなかなかうまくいかなくて、もしやと思ってバケットのリージョンを US Standard (US East 1) にしてみたら成功した。1時間以上ハマってしまった。

AWS SDK for iOS 2.0 のドキュメントでは Amazon Cognito というモバイル向けのID管理システムのようなものとあわせて利用することが推奨されていてその通りにコードを書いていたのだが、どうやら Amazon Cognito の Identity Pool がまだ US East 1 のリージョン上でしか作成できないがゆえに、 AWS SDK から提供されている AWSS3TransferManager とあわせて使うときにはリージョンを合わせないといけない。(ということだろうか?)

以下、与えられたファイルパスのファイルを S3 にアップロードするサンプルコード。言語は Swift。

※ 事前に Set Up the SDK for iOS - AWS SDK for iOS 2.0 にあるセットアップをおこなっておくこと。

func uploadToS3(filePath: String!) {
    let credentialsProvider = AWSCognitoCredentialsProvider.credentialsWithRegionType(
        .USEast1,
        accountId: "your account id",
        identityPoolId: "your identity pool id",
        unauthRoleArn: "unauth role arn",
        authRoleArn: "auth role arn"
    )

    let configuration = AWSServiceConfiguration(region: .USEast1, credentialsProvider: credentialsProvider)

    AWSServiceManager.defaultServiceManager().setDefaultServiceConfiguration(configuration)

    credentialsProvider.getIdentityId()

    /* ↑ この辺までは Identity Pool 作成後に画面に表示される Objective-C のコードを Swift に書き換えた */

    let transferManager = AWSS3TransferManager(s3: AWSS3(configuration: configuration))

    var uploadRequest = AWSS3TransferManagerUploadRequest()

    uploadRequest.bucket = "your bucket name"
    uploadRequest.key = "your file name"
    uploadRequest.body = NSURL.fileURLWithPath(filePath)
    uploadRequest.ACL = .PublicRead

    transferManager.upload(uploadRequest).continueWithExecutor(
        BFExecutor.mainThreadExecutor(),
        withBlock: { (task: BFTask!) in
            if task.error() == nil {
                // アップロード成功時の処理
            } else {
                // エラー時の処理
            }
            return nil
        }
    )
}

なお Amazon Cognito で Identity Pool を作成する際に専用の IAM Role を作ることになるので、IAM のコンソール画面からそのロールに対して S3 へのフルアクセス権限を与えておく必要がある。

» How to Upload Files from Your App to the Cloud - AWS SDK for iOS 2.0
» Version 2 of the AWS SDK for iOS Developer Preview - AWS Developer Blog - Mobile

MySQL
2014年08月13日 05:29
MySQLに絵文字を格納するにはutf8mb4を使う必要があった

一体何年前の話をしてるんだと思われそうですが、スマートフォンなどで入力できる絵文字を MySQL にきちんと格納するには UTF-8 ではなく utf8mb4 という文字コードを使う必要があります。この文字コードは MySQL 5.5.3 以降で使えます。

» MySQL :: MySQL 5.5 Reference Manual :: 10.1.10.6 The utf8mb4 Character Set (4-Byte UTF-8 Unicode Encoding)

自分がほとんど絵文字を使わないのでまったく考慮してなかったのですが、「#グラドル自画撮り部 の部室」で Twitter から取り込んだツイートデータを見てみると、ツイートの文章が途中で切れてしまっているものが結構たくさんありました。

mysql-utf8mb4-01.jpg

↑ ほんとは最後にハッシュタグや画像の URL がついているはず。

調べてみると絵文字のところで文字列が切れてデータベースに保存されてました。

既存の UTF-8 のデータベースを utf8mb4 に変更するには、

  • my.cnf で utf8 を指定している箇所を utf8mb4 に変更し、MySQLを再起動
  • 「alter database データベース名 default character set utf8mb4;」でデータベースの文字コードを変更
  • 「alter table テーブル名 default character set utf8mb4;」でテーブルの文字コードを変更
  • 「alter table テーブル名 modify カラム名 ... character set utf8mb4 ...」でカラムの文字コードを変更

といった変更をおこなえば OK です。

mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

リファレンスに「For a BMP character, utf8 and utf8mb4 have identical storage characteristics: same code values, same encoding, same length.」とあるように、UTF-8 で扱える文字は utf8mb4 でも同一の文字コードなので、UTF-8 から utf8mb4 に文字コードを変更しても文字化けしません。

が、途中で切れてしまったデータは存在しないので #グラドル自画撮り部 の部室では文字コードを変更して改めてツイートデータを取得し直しました。

mysql-utf8mb4-02.jpg

ちなみにPC版の Google Chrome は今のところ絵文字に対応していません。しかし Twitter の Web 版では絵文字がきちんと表示されます。どうやら Twitter が独自に絵文字の部分を画像に置き換えているためのようです。なお「Chromoji」という拡張機能を使うと Chrome でも絵文字が表示されるようになります。

» 【レビュー】「Google Chrome」でMac/iOSの“絵文字”を表示できるようにする拡張機能「Chromoji」 - 窓の杜

MySQL徹底入門 第3版 ~5.5新機能対応~
MySQL徹底入門 第3版 ~5.5新機能対応~

iPhoneアプリ開発
2014年08月08日 19:21
Swift: GitHubのOAuthログインをiOSアプリからやってみた

iOS アプリから GitHub のアカウントで OAuth ログインするというのをやってみた。環境は Xcode 6 beta 4 と Swift。

参考にしたサイトはこちら。

» iOSアプリでGithubにOAuthする - yaakaito.org

それから公式ドキュメント。

» OAuth | GitHub API

最初に GitHub の Applications にてアプリケーション登録をして Client ID と Client Secret を取得。Authorization callback URL にはカスタムURLスキームを設定する必要がある。

ちなみにカスタムURLスキームのスキーム部分にピリオドが入っているとエラーになるので、 com.fkoji.someapp:// のような Bundle ID を元にしたURLスキームは使えない。someapp:// のような形式にしておくこと。

ios-oauth-github-01.jpg

↑ Authorization callback URL の設定例。

次に OAuth ログインの実装。Twitter や Facebook と違って iOS 標準の SDK がないので まずは Safari ないしは UIWebView でログイン画面を開いてログインしてもらい、callback URL でアプリへ戻ってくるという流れになる。

let clientId = "your client id"
let url = NSString(
    format: "https://github.com/login/oauth/authorize?client_id=%@",
    clientId
)

// Safari が開く場合
UIApplication.sharedApplication().openURL(NSURL.URLWithString(url))

GitHub にログインしアプリケーションの連携を許可すると、指定したカスタムURLスキームに「?code=hogehoge」がついて戻ってくる。カスタムURLスキームは UIApplicationDelegate の application:openURL:sourceApplication:annotation: 内で解析。以下 AppDelegate.swift から抜粋。

func application(application: UIApplication!, openURL url: NSURL!, sourceApplication: String!, annotation: AnyObject!) -> Bool {

    // callback URL に someapp://oauth/github と指定した場合、
    // someapp://oauth/github?code=hogehoge のようなURLで戻ってくる
    if url.scheme == "someapp" {
        if url.host == "oauth" && url.lastPathComponent == "github" {
            let kv = url.query.componentsSeparatedByString("=")
            if kv[0] != "code" {
                return false
            }

            let code = kv[1]

            // サインイン (独自のクラスで定義)
            let github = MyGitHubLogin()
            github.getAccessToken(code)

            return true
        }
        return false
    }

    return true
}

サインイン部分は独自のクラスに実装してみた。書き方は色々。ここでは AFNetworking を使ってアクセストークンの取得をおこなっている。

class MyGitHubLogin {
    var code: String!
    var clientId: String!
    var clientSecret: String!
    var accessToken: String!

    init() {
        // 上記の宣言時に let でセットしててもよい
        self.clientId = "your client id"
        self.clientSecret = "your client secret"
    }

    func getAccessToken(code: String!) {
        self.code = code

        let manager: AFHTTPRequestOperationManager = AFHTTPRequestOperationManager()

        // GitHub の OAuth で JSON フォーマットのレスポンスを受け取るには Accept ヘッダーが必要
        let requestSerializer = AFHTTPRequestSerializer()
        requestSerializer.setValue("application/json", forHTTPHeaderField: "Accept")
        manager.requestSerializer = requestSerializer

        manager.POST(
            "https://github.com/login/oauth/access_token",
            parameters: [
                "client_id": self.clientId,
                "client_secret": self.clientSecret,
                "code": self.code
            ],
            success: { (operation, responseObject) in
                if let response = responseObject as NSDictionary! {
                    self.accessToken = response["access_token"] as String!

                    // あとはお好みで…
                }
            },
            failure: { (operation, error) in
                // エラー時のアラート処理などはここに
            }
        )
    }
}

アクセストークンが取得できれば、さらにそれを元に「https://api.github.com/user?access_token=...」をリクエストすることでプロフィール情報を取得できる。今回は取得したアクセストークンをサーバーサイドに投げてそっちでログイン処理をおこなう必要があったのでここでは割愛。

(修正履歴: 2014-08-15) MyGitHubLogin の login を getAccessToken に変更

Twitter(ツイッター)
2014年08月08日 17:27
電車遅延なう調べ、2014年7月の遅延路線ランキング

日付を見るともう8月も1週間が過ぎていました。いつの間に。。とりあえず今月も電車遅延なう調べによる2014年7月の遅延路線ランキングをお届けします。

※ 電車遅延なうは Twitter に投稿される電車の遅延っぽいツイートを集め、遅延しているであろう路線を抽出し、ついでに @traindelay という bot アカウントにて遅延路線をお知らせしているサービスです。独自のアルゴリズムによる推論ですので100%の正確性は保証しておりません。

2014年7月の遅延路線ランキング

順位路線名遅延指数
1位 (1位) 中央線 357 (-96)
2位 (2位) 小田急線 219 (-75)
3位 (3位) 総武線 213 (-15)
4位 (3位) 山手線 198 (-30)
5位 (5位) 埼京線 162 (-54)
6位 (-) 京王線 159 (-)
7位 (6位) 京浜東北線 135 (-63)
8位 (7位) 常磐線 120 (-45)
9位 (10位) 東武東上線 99 (-9)
10位 (-) 宇都宮線 96 (-)

カッコ内の順位は前回の順位で、遅延指数のカッコ内は前回からの増減を表します。

7ヶ月連続で今月も中央線が1位となっておりますが、全体的に6月より遅延指数が下がっていますが、それほど少ないというわけでもありません。

ちなみに集計をして気づいてしまったのですが、実は「神戸線」の遅延指数が 111 もありました。これだけを見ると 9 位にランクインする数値なのですが、どうやら7月3日に「阪急神戸線」で人身事故が、7月22日に今度は「JR神戸線」で人身事故が発生していて、どちらも「神戸線」として扱われてしまっていたようです。

» 【現場 画像集】阪急神戸線 塚口駅付近の踏切で人身事故 7月3日 - NAVER まとめ
» 【画像集】JR神戸線 尼崎駅で人身事故 現地の様子 7月22日 - NAVER まとめ

どちらの神戸線なのか判定できるようにプログラムを修正しなければ。。