うな(。・ε・。)

Android, iOS, AppEngine まわりのめもめも

JPEGのヘッダーを探訪する

JPEGのバイナリフォーマットは案外シンプルで、けっこう簡単に分解することができます。 JPEGはKey-Valueデータの羅列です。 0xFFで始まる2バイトはマーカといい、一まとまりの値が格納されていることの印となっています。 例えば0xFF 0xDBの2バイトはDQTマ…

iCloudのユーザIDを使って、端末を移行したユーザをセキュアに紐付ける

iOS

アプリのデータを新しいiPhoneに移行したい!というのはよくあるニーズだと思います。 単純にはiCloud Documentsを使ってアプリを作っていれば良いのですが、デバッグのしやすさなどの兼ね合いから自社サーバを使っているところが大半だと思います。 データ…

ASImageNodeのすゝめ

ASImageNodeは、Facebookのオープンソース非同期UIライブラリAsyncDisplayKitに含まれるUIImageView相当のコンポーネントです。 このコンポーネントを使用することで、かんたんに画像表示のパフォーマンスを改善できることをご紹介します。 UIImageView の問…

Background Fetch が起きたあと、アプリを起動しても didFinishLaunching を通らない

iOS

Background Fetch を使うと、アプリのライクサイクルイベントが少し変わってくるのでメモ書きをします。 通常のアプリ起動時のライフサイクルイベント - application:didFinishLaunchingWithOptions: - applicationDidBecomeActive: こののち、「アプリを閉…

アカウント移行用に、iCloud アカウントに紐付いた一意の ID を取得する

複数の iOS 端末でのアカウント共有をしてもらうため、iCloud アカウントの ID を利用することを考えます。 様々な方法がありますが、CloudKit を使うのが一番簡単で考えることも少なくラクだと思います。 事前準備 iCloud Capability を ON にします。あわ…

「リアクティブ」ほんとに要る?

リアクティブは値の変化に対して、対応した処理を動かせることができる。これは直感的にはとても合理的であり、キレイな対応となっている。 実際、リアクティブに書くと処理が重複しにくかったり、値の変化に対して起こる動作がわかりやすく整理される、とい…

Medium方式のプログレッシブ画像読み込みの予備調査

Medium は 30x30pixel の画像を表示しておいてから、原寸画像を表示しているらしい。 そこで、30x30pixel というのがどの程度のクオリティ、サイズなのかを調査してみた。 iPhone 5S で撮った写真を題材にします。 原寸 2448 × 3264, 1.8MB 30x30 画像 30 × …

かんたんな変調・復調を実装してみる

超音波通信を実装してみたくて、もっともカンタンに実装できる方法を調査してみました。 もっとも単純な方法で、ノイズがのってもいいような伝達手段を考えます。 変調・復調 波形(音波)に情報を載せることを変調、波形から情報を取り出すことを復調といい…

Effective 意識低くコードを書く

あまり多くのことをしたくない、あまり多くのことを覚えたくない、でもちゃんと動くソフトウェアが欲しい。 そんな人がなにを意識してコードを書くべきか、ということを挙げてみました。 変えないのが一番 人は一度に多くの物事を変化させられません / 変化…

時間ないけどスプラトゥーンで S+ になる

仕事しながらスプラトゥーンで S+ になるための戦術とか語ります。 ちなみにゲームは好きですがそんなに得意ではありません。FPS は本格的にやったことがありませんし、スプラトゥーンの開発陣が影響を受けたであろうゲーム「ボーダーブレイク」の最高ランク…

JWT で CRSF 対策を実装する

Rails などのフレームワークの CSRF 対策の実装を使わず、自前で CSRF 対策を行ってみる。 そもそも CSRF とは? リクエストが「なぜ起こったか?」に関わらず、ブラウザが自動的に Cookie などのセッション情報を送信することを利用した攻撃方法。 例えば、…

Google の AMP に対応した HTML を書く

kaiinui.hatenablog.com 先日の記事では、AMP のさわりについて書きましたが、今回は具体的に AMP がどのようなフォーマットとなっているかを追うため実際に AMP HTML を書いてみます。 まず、AMP は HTML を拡張したフォーマットになっています。また、AMP …

Google の高速ページ表示フォーマット AMP (Accelerated Mobile Page) をちょっと紐解く

www.suzukikenichi.com Google と Twitter が共同で AMP というフォーマットを制定しました。このフォーマットは、Facebook の Instant Articles のように高速なページ表示を実現するためのものです。 近年、広告や重度の JavaScript, 多すぎる/大きすぎる画…

iOS, Android 対応のディープリンクサービス HOKO

HOKO いいですね。Product Hunt でもいい感じだったらしいです。 HOKO: Mobile Deeplinking made easyhokolinks.com できることは デバイス毎の遷移先振り分け(iOS, Android, PC) アプリインストール済みかどうかで振り分け アプリで開く(URL Scheme) ア…

MagicalRecord で非同期クエリを行う

MagicalRecord の + MR_findAll などの同期メソッドは非常に便利なのですが、UI を非常にブロックしやすい性質があります。大量のオブジェクトが保存されうる場合に特に注意が必要です。 めやすとしては、1000 件以上のデータは同期メソッドでは顕著になりま…

App Store Views / App Units は「インストール率」ではありません

iTunes Connect Analytics で以下のようなハマりどころがあったので共有します(*´ω`*) まず、iOS8 以降の端末での情報のみがカウントされます。iOS7 以下の情報を含まないので正確な数字ではありません。 App Store Views / App Units = インストール率 …

デバッグ用に、ログと CoreData のダンプを送信する

さいきん、デバッグ用に、ログと CoreData のダンプを送信出来る機能を実装しました。 デバッグ情報の送信機能を実装することで、クラッシュレポートでは検知出来ないようなロジックのバグやデータの不整合、その他様々な不具合のデバッグをサポートする事が…

Google Cloud Monitoring を使って障害のアラートを受け取る(*´ω`*)

App Engine でサービスを作っていると、ログは確かにいつでも見られて安心ですが、何かが起こった時にすぐに知れないのが辛いですね。 そんな時には Google Cloud Monitoring です。 下の図のようにアラートを設定し、メール, Slack, SMS, 電話など様々な手…

ソーシャル共有の数を一括で取得して JSONP で返す API

何に使うわけでもありませんがつくってみた GET https://socialcountapi.appspot.com/count?callback=jsonp&url=https://facebook.com/ jsonp({"twitter":31135,"facebook":234483"pocket":503041}); kaiinui/SocialCountAPIgithub.com ページを速く表示する…

ActivityLifecycleCallbacks で view イベントを自動でログる

ActivityLifecycleCallbacks は Activity のライフサイクルを監視して、処理を挟み込める機構です。 使い方は至って単純で、Application.ActivityLifecycleCallbacks を implement し、Application のインスタンスメソッド registerActivityLifecycleCallbac…

Internet.org は参加しないと表示されないよ(。・ε・。)

Internet.org は Facebook 社が主導する、途上国向けのインターネットプロバイダーです。 利用者は無料もしくは格安でインターネットを利用する事が出来ます。 途上国向けに低コストでインターネットを提供するため、Internet.org はアクセス出来るサイトを…

Facebook の高速ページ表示を支える BigPipe

BigPipe: Pipelining web pages for high performance 非常に面白い内容だと思うので、メモついでに紹介します。 一言でいうと ページの枠組みと、付随するページフラグメント郡を一つのリクエストでまとめて要求・非同期受信する技術です。 具体的には、ト…

HTTP/2 (SPDY) とパフォーマンスのめも

主にパフォーマンス関連でじぶんようのメモです HTTP/2 によって解決した問題は、「同時リクエスト制限」によるものが殆どです。 HTTP/1.1 では「一本のコネクションで同時に一つのリクエストしか出来ない」だったものが、HTTP/2 では「一本のコネクションで…

「正しい」技術

正しいものが良いものであるとは限らないし、利用ケースに沿うとは限りません。 正しいものは「もっともらしい」ので、無視する事が非常に気持ちが悪いです。 これは極めて宗教的な圧力です。 しかし、この気持ち悪さを我慢したほうがいいです。YAGNI を我慢…

Azure が未来過ぎたので色々調べてみた

登場当時は 「AWS でいいじゃん(笑)」と無視してしまっていたけれど、今見るとめちゃくちゃ気合いを入れてサービスを拡張していた。 AWS と比較して優れていると感じるのは、非常にモジュラー指向なところ。 AWS も SQS や SNS など「モジュール」といえる…

AppEngine らいぶらり書いてる

最近ちょっとライブラリ作るのに凝りだしてしまって、AppEngine/Java の commons ライブラリを書いている。 第一弾は Counter. kaiinui/appengine-commonsgithub.com Datastore 上でカウンターを単純に実装すると、遅いし Write オペレーションで高くついて…

Android で雑に GCM するやつ

前書いたので RegistrationIdSender (registrationId: String をサーバに送るメソッドだけ) を実装して渡すことでよしなにやる Helper です。 gist.github.com

Amazon の「注文を表示」のように、Gmail のメールにアクションを表示する

表題通りの事を調査しました。せっかくなので貼っておきます。 gist.github.com

App Engine + Java 覚書

Spring 載せない方が良い DI が遅いのでスピンアップが死ぬほど遅くなる Spring MVC だけにして、Component Scan は使わず xml 直接 Bean を指定する たいてい Slim3 Controller だけで済むし、API は Google Cloud Endpoints を使った方が良い jsp でなく F…

PubSub なもうそう

Entity の変更を通知したいことが多々ある。たとえば、「メッセージを受信しました」は、recipient_id が自分の Message オブジェクトの追加を検知して、通知を行なっていると言える。 このハンドラーは例えば Rails であれば Model の after_create などで…

Riot.js を試食する

いろいろ雑いコードで動きます。jQuery 以上 Vue.js 未満くらいで考えるといいです。 Rails + HTML テンプレートで大部分が動いてて、ちょっとだけ JS を入れちゃうときに使うカンジです。 SPA には向きません。 eval とかも使われていなく、<script> に書いたものが…

Chrome Push Notification でメッセージに本文を載せる方法

2015/04/28 現在、Chrome (M42) では Push Notification にてメッセージの本文を変える事が出来ません。 これは、現在の仕様では GCM からの payload に任意のデータを載せる事が出来ないためです。したがって、毎回同じメッセージを表示する事になってしま…

クローラー開発の知見

鍵は「リンク先を辿るか辿らないか」の処理。 この処理が甘ければ甘いほど、同一サイトのクロールが遅くなります。同じ URL を踏まないようにするため、以前辿った URL を除外したり、パラメータをイイ感じに省いて正規化してあげる必要があります。 (鍵は…

開発のおとしあなリスト

言語リプレースは絶対にしない 書き直しは絶対にしない 絶対に VPS を使わない 特殊な言語 / FW を使わない 歴史の浅いライブラリを使わない スキーマをなるべく変えない 必ずログを見られるようにしておく。可能ならば BigQuery に入れておく リリース時に…

リリース後のデバッグのために、ログと DB のダンプを送る機能を付ける

アプリはリリースするととにかくデバッグしにくいです。 Crashlytics を入れておくのは当然としても、これだけでは対応しにくいケースが沢山あります。 たとえば、データの不整合が出たり、予期せずデータが消えてしまったりするケース。 これらのケースは例…

Object の JSON Representation に JSON-LD 形式の schema.org を付けたかった

schema.org 付けたいときに HTML テンプレートにマークアップ責務を持たせるのか Object 自身にマークアップをお願いするかどちらか Object に JSON-LD 付いてればすごくセマンティックで良いけど別に今の所うれしいことないからいいや やりたかったのは下み…

hateblo

hateblo そこそこお手軽にかけるっぽいしこっちにしようとおもった console.log("hogehoge");