[iPhone] ✩やわらかいでしょ✩ 丸字フォントでツイートする方法

Photo 2014-01-09 0 54 30

なんと、フォントが丸字体に…?!

どうやるかと言うと、上画像のように、任意の文字列を星マークで囲むだけ!!
ただし、MacのPCではならず、iPhoneのみで確認できました。
アプリは、Twitterの公式アプリとTweetbotで確認しました。
Androidでなるかは不明。
あなたも、下の文字をコピーしてつぶやいてみよう!

「✩やわらかいでしょ✩」

解説すると、「✩」は通常の「☆」とは異なる文字コードのものです。
#10025の特殊なユニコードの文字で、「STRESS OUTLINED WHITE STAR」と呼ばれているようです。
でも、なんでこの文字で囲んだ文字列が丸字になるのかは不明です。
誰か教えて!!

よく使うgitのリポジトリ操作メモ

git

順番は特に意味ありません。ただのメモです!

コメント付きで全ての変更をコミット

#!bash
$ git commit -a -m "コメント"

変好内容を全て破棄

#!bash
$ git checkout -f

ブランチを作成して同時にチェックアウト

#!bash
$ git checkout -b hoge

ローカルのブランチを削除

#!bash
$ git branch -d hoge

リモートのブランチを削除

#!bash
$ git push origin :hoge

コミット履歴

#!bash
$ git log

特定のファイルのコミット履歴を表示

#!bash
$ git log file

自分専用の.gitignoreを設定する。各リポジトリのルートディレクトリに置かれた.gitignoreファイルと併せて適用される。
.bashrcなどに記述しておくといい。

#!bash
$ git config --global core.excludesfile ~/.gitignore

これも参考になります:

[Objective-C] 任意のクラスのサブクラスをランタイムで列挙する方法

objective-c

プラグイン的なアーキテクチャでファクトリ部が肥大化する問題

複数種類のファイルを取り扱うようなアプリを思い浮かべてみて下さい。
対応するファイル形式を柔軟に増やせるようなアーキテクチャを、Objective-Cではどう構築するのが良いでしょう?
各形式を取り扱うモジュールがあって、それらは定型化された仕様に則って振る舞うような一般的なsubclassingモデルと、ファクトリパターンが良さそうです。

しかし、取り扱える種類が増えると、モジュールを統括する部分(ファクトリ部)の実装が肥大化する問題が発生します。
例えば、指定した拡張子に対応するクラスのインスタンスを返す関数とか。
更に、新しい形式を追加した時に、ファクトリ部への追加実装の手間も後々に負担となったり、実装漏れが生ずる可能性があります。

モジュールをランタイムで列挙してスッキリさせる

ファクトリ部をスッキリさせるには、通常のsubclassingモデルよりももう少し粗結合な実装方法を検討してみると解決するかもしれません!
それは、基底クラスのサブクラスの列挙部をハードコーディングするのではなく、ランタイムで列挙する方法です。
サブクラスに、ファクトリ部で取り扱いが必要な情報を提供するGetterメソッドやプロパティを持たせます。

これなら、新モジュールの登録忘れや一貫性を崩す心配を軽減できます!

ランタイムAPIを使って実現

NSObjectに対してメソッドを追加するカテゴリを紹介します。
追加されるメソッドの+ classNamesForSubclasses を、あるクラスをレシーバにして呼び出すと、その子クラスの名前がNSArrayで返ります。
チョー簡単ですね!

ヘッダファイル(NSObject+AutomaticFactory.h):

#!objectivec
#import <Foundation/Foundation.h>

@interface NSObject (AutomaticFactory)

+ (NSArray*) classNamesForSubclasses;

@end

ソースファイル(NSObject+AutomaticFactory.m):

#!objectivec

#import "NSObject+AutomaticFactory.h"
#import <objc/runtime.h>

@implementation NSObject (AutomaticFactory)

+ (NSArray*) classNamesForSubclasses;
{

    int numClasses = 0, newNumClasses = objc_getClassList(NULL, 0);
    Class *classList = NULL;

    while (numClasses < newNumClasses) {
        numClasses = newNumClasses;
        classList = (Class*)realloc(classList, sizeof(Class) * numClasses);
        newNumClasses = objc_getClassList(classList, numClasses);
    }

    NSMutableArray *classesArray = [NSMutableArray array];

    for (int i = 0; i < numClasses; i++) {
        Class superClass = classList[i];
        do {
            // recursively walk the inheritance hierarchy
            superClass = class_getSuperclass(superClass);
            if (superClass == [self class]) {
                [classesArray addObject:NSStringFromClass(classList[i])];
                break;
            }
        } while (superClass);
    }

    free(classList);

    return classesArray;
}
@end

プラグイン的な実装をしている場合は、検討してみてはいかがでしょうか?

参考ページ: Automagic Factories in Objective-C

XCConfigを複数ファイル構成にする方法

xcode-configsettings_Icon

XCConfigは、XCodeのConfiguration Settings Fileの事で、DebugやReleaseで異なるプロジェクト設定を適用する事が出来る優れモノです。
下記のように、ファイルの新規作成画面の項目として出てくるやつですね。

Screen Shot 2014-01-07 at 3.25.50 AM

CocoaPodsとか使っていると、自動生成されたXCConfigに手を加えたい時があります。
でも、pod installする度に書き換えるのは面倒ですよね。
実は、XCConfigには#includeディレクティブが用意されているので、この悩みを簡単に解決できます。
includeディレクティブはC言語と全く同じ構文です。

#!c
#include "別のxcconfigへのファイルパス"

これを使って、以下のような構成にすれば、万事うまく行きます!

XCConfig composition example

[iOS] 動的なレイアウトを超手軽に実装する方法

autolayout

概要

AutoLayoutが超手軽に使える、Masonryをご紹介します!

AutoLayoutで動的レイアウト、しかし…

不特定なサイズの画像や長さのテキストを取り扱う時、どうしても固定サイズのViewレイアウトでは限界があります。
コンテンツのサイズに合わせて、動的にレイアウトを調整する必要があります。
また、単にText ViewやImage Viewのサイズを変えればいいのではなく、周辺のViewも調整が必要なので結構大変です。

そんな動的レイアウトの要件に対しては、AutoLayoutがよく使用されます。
AutoLayoutは、親Viewのサイズ変更があった時に子View同士の間隔やサイズを自動で調節してくれる技術です。
そのレイアウト方法は、Constraint(制約)と呼ばれるものをViewに与える事で定義します。
AutoLayoutを使うと有効な時とその利点は以下の2つです:

  1. Interface Builderを使って、動的なサイズや配置のViewヒエラルキーを組む時
    • 親Viewのサイズ変更に合わせてレイアウトしなおす処理を追加で書く必要が無くなる
    • 例: 不特定サイズの画像を表示するTable view cell内のViewのレイアウト
  2. Interface Builderを使わないでViewを組む時
    • 位置とサイズベースではなく、制約ベースでレイアウトを定義できる
    • 例: 「親Viewに対して上下左右に10pxのマージンを設けた子Viewを配置」というセマンティクスで定義できる

2つめは、異なるスタイルで記述できるという事なんですが、利点となるには苦しい理由があります。
僕の場合はInterface Builderを使わないので、2番が利点にならなければ使う意味はほぼありません。

超めんどくさいAutoLayoutの記述

コードベースでのUI実装において、AutoLayoutが利点となるには苦しいその理由は、AutoLayoutをコードで記述すると超冗長になるという点です。
つまり、全然簡単じゃない!楽じゃない!

「親Viewに対して上下左右に10pxのマージンを設けた子Viewを配置」を実際にコードで記述した場合、以下のようになります。

#!objectivec
UIView *superview = self;

UIView *view1 = [[UIView alloc] init];
view1.translatesAutoresizingMaskIntoConstraints = NO;
view1.backgroundColor = [UIColor greenColor];
[superview addSubview:view1];

UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);

[superview addConstraints:@[

    //view1 constraints
    [NSLayoutConstraint constraintWithItem:view1
                                 attribute:NSLayoutAttributeTop
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:superview
                                 attribute:NSLayoutAttributeTop
                                multiplier:1.0
                                  constant:padding.top],

    [NSLayoutConstraint constraintWithItem:view1
                                 attribute:NSLayoutAttributeLeft
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:superview
                                 attribute:NSLayoutAttributeLeft
                                multiplier:1.0
                                  constant:padding.left],   

    [NSLayoutConstraint constraintWithItem:view1
                                 attribute:NSLayoutAttributeBottom
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:superview
                                 attribute:NSLayoutAttributeBottom
                                multiplier:1.0
                                  constant:-padding.bottom],

    [NSLayoutConstraint constraintWithItem:view1
                                 attribute:NSLayoutAttributeRight
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:superview
                                 attribute:NSLayoutAttributeRight
                                multiplier:1
                                  constant:-padding.right],

 ]];

はい、やってられないですね!

Masonryでお手軽AutoLayout

AutoLayoutは便利だけど、NSLayoutConstraintによる記述は前述の通り冗長で面倒です。
それが原因で、利点を感じられず個人的に今まで全く使ってきませんでした。

しかし、Masonryというライブラリがこの悩みを一気に解決してくれました。
このライブラリは、AutoLayoutの学習コストを最小限に押さえつつ、少ない記述量で使用できるようにしてくれるものです。
これは嬉しい!

前述の例「親Viewに対して上下左右に10pxのマージンを設けた子Viewを配置」をMasonryで記述すると:

#!objectivec
UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);

[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.edges.equalTo(superview).with.insets(padding);
}];

とっっっっっても簡単ですね!!
制約ベースでの記述は、HTMLとCSSのような感覚で書けるので、とても重宝しそうです。

[XCode] 見づらいコードをショートカットキー一発で綺麗に整形する方法

xcode

コードの整形は手間がかかる

代入文って10行とか20行とかになると、一気に見づらくなりますよね。
特に、Interface Builder使わないでコードでUIを組み立てたりしてると、プロパティの設定処理で平気で100行になります。
例えばこんなコード・・

#!objectivec
cell.backgroundView.layer.shadowColor = [UIColor blackColor].CGColor;
cell.backgroundView.layer.shadowOffset = CGSizeMake(0, 4);
cell.backgroundView.layer.shadowOpacity = 0.8;
cell.backgroundView.layer.shadowRadius = 10;
cell.backgroundView.layer.masksToBounds = NO;
cell.backgroundView.layer.shouldRasterize = YES;
cell.backgroundView.layer.rasterizationScale = [UIScreen mainScreen].scale;
cell.backgroundView.layer.contentsScale = [[UIScreen mainScreen] scale];
cell.selectedBackgroundView.layer.shadowColor = [UIColor blackColor].CGColor;
cell.selectedBackgroundView.layer.shadowOffset = CGSizeMake(0, 4);
cell.selectedBackgroundView.layer.shadowOpacity = 0.8;
cell.selectedBackgroundView.layer.shadowRadius = 10;
cell.selectedBackgroundView.layer.masksToBounds = NO;
cell.selectedBackgroundView.layer.shouldRasterize = YES;
cell.selectedBackgroundView.layer.rasterizationScale = [UIScreen mainScreen].scale;
cell.selectedBackgroundView.layer.contentsScale = [[UIScreen mainScreen] scale];

はい、とっても汚いですね。理想は・・

#!objectivec
cell.backgroundView.layer.shadowColor                = [UIColor blackColor].CGColor;
cell.backgroundView.layer.shadowOffset               = CGSizeMake(0, 4);
cell.backgroundView.layer.shadowOpacity              = 0.8;
cell.backgroundView.layer.shadowRadius               = 10;
cell.backgroundView.layer.masksToBounds              = NO;
cell.backgroundView.layer.shouldRasterize            = YES;
cell.backgroundView.layer.rasterizationScale         = [UIScreen mainScreen].scale;
cell.backgroundView.layer.contentsScale              = [[UIScreen mainScreen] scale];
cell.selectedBackgroundView.layer.shadowColor        = [UIColor blackColor].CGColor;
cell.selectedBackgroundView.layer.shadowOffset       = CGSizeMake(0, 4);
cell.selectedBackgroundView.layer.shadowOpacity      = 0.8;
cell.selectedBackgroundView.layer.shadowRadius       = 10;
cell.selectedBackgroundView.layer.masksToBounds      = NO;
cell.selectedBackgroundView.layer.shouldRasterize    = YES;
cell.selectedBackgroundView.layer.rasterizationScale = [UIScreen mainScreen].scale;
cell.selectedBackgroundView.layer.contentsScale      = [[UIScreen mainScreen] scale];

非常に綺麗です。
でも、スペース打つの面倒くさい。。

そこで、上記のようなコードの整形をショートカットキー一発で出来るXCodeプラグインをご紹介します!

XCodeプラグイン「XAlign」が便利

XAlignは、文字通りAligningを手伝ってくれるプラグインです。

インストール方法

コマンド一発で即完了。

#!bash
$ curl github.so/XAlign/build/install.sh | sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   896  100   896    0     0   1805      0 --:--:-- --:--:-- --:--:--  1851
Password:
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 34311  100 34311    0     0  52104      0 --:--:-- --:--:-- --:--:-- 52543

XAlign is installed. Please Restart Your Xcode.

More info: https://github.com/qfish/XAlign/

To uninstall XAlign, `curl github.so/XAlign/build/uninstall.sh | sh`
.

XCodeを再起動しましょう。

整形の実行

以下のデモンストレーションのように、「シフト+?+X」で自動整形を実行します。

XAlign

すごいですねww 今までの苦労は一体ww
#defineプリプロセッサ文や、@property構文などにも有効なようです。

みなさんもぜひ試してみてください!