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:f8f24f1ed313cacf9c86
Created January 28, 2015 14:02
UXを損なわないUIについて個人的に気をつけていること

UXを損なわないUIについて個人的に気をつけていること

仕様外のUXの改善は開発サイドが攻めなければ放置される

大枠としてのUXは画面上の表現に留まらずビジネスデザインと直結するものであるため、UIがUXの全てであるという認識は完全に間違っていますが、一方で目的のUXを極力妨げないようにUIを詰める作業に関しては両者は狭い問題領域で密結合しています。

特にデザインとコーディングが分業している場合、そうした細部の詰めを全て仕様として言語化するのは無理があります。ここで開発サイドが主体的に働きかけずに仕様を満たす事だけに専念してしまうと、結果そこが空白地帯になってしまい、全体としては雑な印象の残念なプロダクトになってしまいかねません。

というわけで、とりあえずここの辺りの一種の職人的な領域について、個人的に気をつけていることをメモっておきます。全体的にモバイルアプリ/ハイブリッドWeb寄りで、多くは既に言われていることの焼き直しかもしれませんが、自分の言葉でも書いてみます。

基本的な方針は3つです。

@ykst
ykst / gist:4930d8fef81edfee8349
Created January 28, 2015 14:04
いつものASSERTマクロ

いつものASSERTマクロ

gccな環境でいつも使ってるASSERTマクロ。printfが頼みの組み込みな環境で特に威力を発揮します。

#ifndef unlikely
# ifdef __builtin_expect
# define unlikely(x) __builtin_expect((x), 0)
# else
# define unlikely(x) (x)
# endif
@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:ad59cac8a911c80df77c
Created January 28, 2015 14:14
iOSでスピンロック

iOSでスピンロック

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

OSAtomic.hでスピンロック

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

@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:64969c1b06678ee12eef
Created January 28, 2015 14:16
ログに出すモジュール名の定義をMakefileで自動化する

ログに出すモジュール名の定義をMakefileで自動化する

ログツール等で__FILE____BASE_FILE__を渡してソース位置を表示する事をよくやると思いますが、 モジュールのようにもう少し大きい括りを渡してフィルタを楽にしたい時が有ります。

#ifndef MODULE_NAME
#   define MODULE_NAME "FOO"
#endif

#define ERR(fmt, ...) printf("ERR %s %s %d %s (" fmt ")\n", MODULE_NAME, __FILE__, __LINE__, __FUNC__, ##__VA_ARGS__)
@ykst
ykst / Cps.swift
Created June 23, 2015 12:32
Continuation Passing Style in Swift
// Poorman's continuation passing style library
struct Cps {
static func seqByIdx<E, U>(list: [(U, (E?, U) -> ()) -> ()], idx: UInt, value: U, next: (U) -> (), fail: (E) -> ()) {
if idx >= UInt(list.count) {
next(value)
} else {
list[Int(idx)](value, { (errorp: E?, result: U) -> () in
if let error = errorp {
fail(error)
} else {
@ykst
ykst / gist:e7e16c5a604e9ccc0c5b
Created January 28, 2015 14:09
内部不整合と外部不整合

内部不整合と外部不整合

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

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

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

@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:d76add675fb6c417aede
Created January 28, 2015 14:07
method_missingと内部DSL

method_missingと内部DSL

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

例えばこんなDSL

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