Skip to content

Instantly share code, notes, and snippets.

View ykst's full-sized avatar

YUKISHITA Yohsuke ykst

  • Mount Fuji, Japan
View GitHub Profile
@ykst
ykst / gist:5cf7caee75a087255865
Created January 28, 2015 14:15
CocoaPodsでNo architectures to compile for.. が出た時の対処法

CocoaPodsでNo architectures to compile for.. が出た時の対処法

No architectures to compile for..

Xcodeで実機デバッグを行う際に、

No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7s, VALID_ARCHS=armv7).

↑このようなエラーが出てビルドが失敗するケースがあります。

@ykst
ykst / gist:ad59cac8a911c80df77c
Created January 28, 2015 14:14
iOSでスピンロック

iOSでスピンロック

何も考えずに@synchronizedを使っていると次第に心が蝕まれていくので、 時にはスピンロックを使いたくなる事があると思います。 幸いな事に自作しなくてもiOSがAPIを提供してくれているので、それを使いましょう。

OSAtomic.hでスピンロック

基本的な使い方を以下のサンプルコードで示します。 ヘッダ名が如何にもリジェクトされそうな雰囲気を醸し出していますが、大丈夫だそうです

@ykst
ykst / gist:04abb7e4a4ae95fce81e
Created January 28, 2015 14:13
[iOS] 逆引きCorePlot

[iOS] 逆引きCorePlot

CorePlotを使う上でのTipsをまとめていきます。随時更新。

データソース

###データを更新する

- (void) reloadGraphData:(CPTGraph*)graph
{
    // データ取得の各種delegateが実行される。
 // graphに加えた表示上の変更はこれを実行しなくても即座に反映される。
@ykst
ykst / gist:4a37222a44ec57a58059
Created January 28, 2015 14:12
Bundle IDからアプリのアイコンを取得する

Bundle IDからアプリのアイコンを取得する

例えばインストールされているアプリをリストアップする機能を作りたいとします。

インストールされているアプリのアイコンそのものを取得するにはmobile.installation.plistからディレクトリを掘って直接ファイルを拾ってくれば良いのですが、サンドボックス環境を破る必要があるので若干面倒です。

もし仮に知りたいアプリのBundle IDが判明していれば、そこでiTunes Search APIを使うとBundle IDから一意にアプリを検索出来るので、これを使ってAppStoreに公開されているアイコンを取得する事が出来ます。

サンプルコード

@interface BundleHelper : NSObject
@ykst
ykst / gist:bd167415f397478f7181
Created January 28, 2015 14:11
実行時間を計測する簡易マクロ

実行時間を計測する簡易マクロ

コードブロックの実行時間をなるべく非侵入的に計測したい場合に、for制御構文を流用するやり方です。 for文の初期化節で開始時刻を記録し、一回だけループを回して終了条件節でダンプを行います。 C++のスタックにオブジェクトを作ってデストラクタを走らせるパターンがよくありますが、Cでも同じような事は出来ます。 色々応用出来ると思います。

static inline bool ____benchmark_check_time(char const * const comment, uint64_t const start, uint64_t const tick)
{
    if (!tick) return true;
@ykst
ykst / gist:8557e2ce9280111c41b6
Created January 28, 2015 14:11
glsl-optimizerでGLSLのオフライン最適化を行う

glsl-optimizerでGLSLのオフライン最適化を行う

OpenGLにコンパイルしてもらう時点でシェーダにはある程度最適化が行われるようですが、 モバイルデバイスではあまりコストの掛かる最適化は行われないだろうという事で、 オフラインでGLSLの最適化をしてくれるフレームワークとしてglsl-optimizerがあります。 サポートされているGLSLバージョンはES2.0とES3.0もカバーしていますが、未対応の拡張もあります。

元々はUnityが機械生成した冗長なGLSLを最適化するために作られたようですが、 一応手書きのシェーダの最適化に使うこともできます。 ただし、組み込みを前提としているようでコマンドラインからキックするバイナリは提供されていません。

@ykst
ykst / gist:6932a5712cf0a6c361a2
Created January 28, 2015 14:10
iOSクラッシュレポートのバックトレースに屈しない

iOSクラッシュレポートのバックトレースに屈しない

アプリを実機のランニングテストで回していて運良くクラッシュを引き当てた時に、

Last Exception Backtrace:
0   CoreFoundation                	0x321d629e __exceptionPreprocess + 158
1   libobjc.A.dylib               	0x39e3297a objc_exception_throw + 26
2   CoreFoundation                	0x321208d4 -[__NSArrayM insertObject:atIndex:] + 764
3   YourApp                			0x0002fbf0 0x20000 + 64496
4 YourApp 0x0015e2c8 0x20000 + 1303240
@ykst
ykst / gist:b6d00c5fb2cc3df5c8a3
Created January 28, 2015 14:09
TemplateHaskellによる文字列生成埋め込みDSL

TemplateHaskellによる文字列生成埋め込みDSL

型安全な汎用文字列生成マクロをquasi quoteで実装してみます。 機能として次のような物を持たせます。

  • 変数を取れる
  • 内部でHaskell式を実行出来る

ソース

{-# LANGUAGE TemplateHaskell, DeriveDataTypeable #-}
@ykst
ykst / gist:e7e16c5a604e9ccc0c5b
Created January 28, 2015 14:09
内部不整合と外部不整合

内部不整合と外部不整合

世の中には様々な設計原則が有りますが、 質の良いプログラムであるかどうかについて個人的に一番分かりやすいと思っている尺度は題の内部不整合と外部不整合の取り扱いです。 といっても難しい事はなく、原則は次のように要約されます。

内部不整合は最も早い段階でプログラムを停止し、外部不整合では決してプログラムを停止してはならない。

内部不整合 とは、プログラム自身のバグに起因する問題であり、通常はassertionによってハンドルされます。 最も早い段階で検出するというのは、平たく言うと 全ての失敗する可能性がある処理にチェックを入れる という事です。

@ykst
ykst / gist:d76add675fb6c417aede
Created January 28, 2015 14:07
method_missingと内部DSL

method_missingと内部DSL

Rubyの魅力の一つとして一見外部DSLのような内部DSLを書けてしまうというものがありますが、 method_missingを効果的に使うことで更に外部言語っぽい記述を可能にするという芸が有ります。 (という事を以前とある忍者に教えて貰い、別件で改めて使ってみてその効果を実感したので共有してみます。)

例えばこんなDSL

まず平凡なDSLとして、次のようなものを考えてみます。