ALSのアイスバケツチャレンジ

ALSのアイスバケツチャレンジが佐分利さんより回ってきました。 世間では賛否両論がありますが、せっかくなのでいろいろ考えたことを書きました。

f:id:yd_niku:20140825150439j:plain

氷水をかぶることについて

僕はかぶらないことを選択しました。 それにより心を動かされたわけでもないし、自分がやることで誰かの心を動かすとも思えないからです。 ひとまず、(ブームであれ)それを通じて知って考えることが重要なのかな、という解釈です。

なお、日本ALS協会の公式でアイスバケツチャレンジへのコメントが出ており、氷水も寄付も任意であることを強調しています。

寄付すること

そもそもの違和感は氷水の是非に話が終始していることで、まずは自分が寄付することの是非を考えるべきかな、と思いました。

世界中に寄付を求めている人たちが大勢いるなかで、直近では広島も東北もアフリカも大変な状況です。 どれも直接自分に縁があるものではないからこそ、なぜそこに寄付するのか動機付けは必要だと思いました。

正直、今回ALSに直接何の所以もなくてどうしようかと思ったんですが、 考えたことに対し、やってみないと自分がどう感じるかわからないという理由で とりあえずはALSには寄付することに決めました。 (どこかの団体経由じゃなくて直接寄付できることもポイントですが)

逆に身の回りで言うなら障害者福祉とか飲食に関わることとか、自分が投資したい分野ってなんだろう、ってことを意識するきっかけになりました。 寄付したかどうかではなく、寄付金の1万円も自分の時間的投資もふくめて何に費やすべきなんだろう、とか。

次のバトン

いろいろ考えたんですが、ノリで回す気分でもないし確固たる理由もないので、 今回自分としてできるのは寄付に賛同するところまでで、無責任に拡散するのは控えたいと思います。

以上です。

SubversionでAddを取り消したいときはRevertする

SubversionやGitを使っているプロジェクトで開発していて、エディタで自動的に追加(Add)されちゃったやつを解除したいときにどっかに移してDeleteしたりしてたけど単にRevertするだけでよかったやつです。 ずっと知らなくて最近気づいたことですが、表題のとおりです。

(※このエントリーはブログへのリハビリを兼ねております)

Booleanを使うときありがちなバグを避ける方法

一度ダイアログ表示していたら次は出さないとか、未読既読とかちょっとした設定をBoolean値で判断することがよくありますが、かつてその手の実装でよくハマったことと対応策としてミスりにくい考え方をまとめてみました。

具体的に起こるミスとしては下記のようなものがあります。

  • 0と1で表されているかtrue/falseか不確定
  • 文字列で"false"と表現されている
  • 値が空の場合も考慮しなければいけない

こういう状況でおこるうる問題としては、

  • 単純にプログラムに慣れていないのでミスる
  • 他人に引き継いだときに困る
  • 実装に自信がもてずに時間がかかる
  • 昨日の自分を信用出来ない
  • APIの仕様がなにかと信用出来ない

という感じでしょうか。 まぁ、実際にはたかがBooleanなので大したことはないのですが、眠さや疲れや焦りなんかがチリも積もってバグとなるわけなのです。

この手の実装をするときには、事前にきめた正しいもの以外はfalseという「ホワイトリスト」という考え方で実装するといいです。

var boolA = config.isRead === true;
var boolB = $("script#config").text() === "true";//仮にHTMLとかテキスト情報で記載しなければいけないとき

こういう感じで常に実装するように心がけておけば、初心者でも混乱しにくいし、疲れてても判断しやすいのでオススメです。 初心者というより中級者くらいにありがちな「かっこよさげな記法で書きたくなる病」とか「むやみにクソ丁寧なif文を書きたくなる病」にかかっているときのほうが危険ですので、シンプルで迷いのない表現をこころがけましょう。自戒をこめて。

たぶんJSONとかであればBooleanをそのままかけるのでいいですが、特にWebAPIから取ってきた値(かつ0/1とか)だったり、Cookieとか設定ファイルとか文字列で保存しないといけないときは、文字列できたりするので、特定の表記以外をfalseにすれば安全だと思います。

最悪、値が0/1で数字がくるか文字列がくるかわからないようなときは、下記のようにいったんtoString()したものを文字列と比較すると良いと思いますが、そんなことしないでも良い設計にするべきだと思いますので参考程度に。

var boolC = config.isRead.toString() === "1";

久々にiOS開発をした人が調べたことを淡々と記録していくよ

StoryBoardの遷移の作り方

http://kesin.hatenablog.com/entry/20120908/1347079921

performSegueWithIdentifierにStoryBoard上のSegueのIDを文字列で渡して進む。 navigationControllerのpopViewControllerAnimatedや、dismissViewControllerAnimatedで戻る。

Segueに関連して、画面間のデータの受け渡しのあれこれ

http://eien.seesaa.net/article/261740269.html

Flashでもよくある話。 グローバル変数とか、ベストじゃない(むしろあんまよくない)けど、勉強ならいいんじゃない、こういうのもあるよ、っていう切り口が良かった記事です。 親子関係にあるならメソッドで渡したりDelegateでやりとりして、アプリ内の状態管理だったらモデルを用意したほうが何かと良さそう。

iOS6から地味なワーニングがでると思ったらAPIが微妙に変わっていたやつ。

http://ameblo.jp/sakurabishi/entry-11401892817.html

Segueを使うと、Modalとかが表現の一種みたいな扱いになって、閉じる系の動作に関するメソッドからModalとかの表記が取れるんですね。

プリインじゃないFontデータをバンドルする方法

http://develop.calmscape.net/dev/295/

otf、ttfファイルをアセットとして追加した上で、plistにフォント名を書くとコード上で指定できるようになる。 でもIB上で指定するやり方がわからなかった。

体育の日なんだって。

PSDのレイヤー書き出しのJSXをバージョンアップしました。

フォトショにはCS5あたりから「レイヤーをファイルに書き出し」っていうバッチ機能があるんですが、なんか微妙にイマイチなので前からFlash用の素材書きだしように作ってたJSXを少しカスタマイズしてみました。

https://github.com/yosukedoke/ExportAllLayers2

といっても今回のバージョンアップは機能を拡張しやすくするためのリファクタリング目的で、ついでにちょっとだけ機能を変えています。

  • 全体的なコードをOOPっぽくリファクタリングとスリム化しました
  • FLAファイル配置用のJSFLを出力しないようにしました(暫定)
  • XCodeのRetina用のサフィックス(@2x)をつけるかどうかのオプションをつけました
  • エラー時に中断するか選べるようにしました

まだあんまりテストしてないのでBeta0.1くらいのバージョン感でお願いします。

また今後の機能としては次のようなものを考えています。優先順位の高い順に。

  • マルチバイトのレイヤー名にも対応する
  • テキスト出力自体の汎用化
  • 出力先を選択する
  • 選択したレイヤーのみ出力する
  • PSDのフォルダ構造を出力したディレクトリ構造に反映する
  • (Retinaに対して)ハーフサイズの画像も出力する
  • JSONなどで座標を出力する
  • 細かいオプションをレイヤ名などで設定できるようにする
    • 出力フォーマット
    • スライスガイド用レイヤー
    • 出力しないフラグ
    • レイヤグループで書き出し

意外に知らなかったSASSの機能

この本を読んでみたら意外と知らない機能や使い方がたくさんありました。 個人的に勉強になった部分をまとめてみようと思います。

Web制作者のためのSassの教科書 これからのWebデザインの現場で必須のCSSメタ言語

Web制作者のためのSassの教科書 これからのWebデザインの現場で必須のCSSメタ言語

セレクタの参照 &

もともと知っていた使い方

.hoge {
    &.foo {
        color : red;
    }
}

知らなかった使い方

.hoge {
    body.foo & {
        color : red;
    }
}

というかこっちがベースの使い方で、 &.fooのほうが応用みたいに書いてある…。

@content

これは知っていたんですがめんどくさくて敬遠していたやつです。

@mixin hoge {
    .hogehoge {
        @content;
    }
}
@include hoge {
    margin : 10px;
}

で、これはplaceholderとかのベンダプレフィックスのとこなどで使えると思いました。

input::input-placeholder {
    color:#CCC;
}
input::-o-input-placeholder {
    color:#CCC;
}
input::-moz-input-placeholder {
    color:#CCC;
}
input::-webkit-input-placeholder {
    color:#CCC;
}

こうすればセレクタにベンダプレフィックスがつくけど中身は一緒見たいのを効率よく書けます。

@mixin input-placeholder {
    input::input-placeholder {
        @content;
    }
    input::-o-input-placeholder {
        @content;
    }
    input::-moz-input-placeholder {
        @content;
    }
    input::-webkit-input-placeholder {
        @content;
    }
}
@include input-placeholder {
     color:#CCC;
}

今日はこのへんで。

UIPageViewControllerを調べてみた

基本的な使い方

UIPageViewControllerと、UIPageViewControllerDataSourceプロトコルを使うと、実際の中身のページを良い感じで切り替えてくれる。

  • 必要に応じてUIPageViewControllerDelegateプロトコルを実装する。
  • 実際のページ用のUIViewControllerのサブクラスを実装する。
  • UIPageViewControllerDataSourceプロトコルを実装する。(親クラスはNSObjectとかでよい)
    • データを保持してページ指定にしたがって取り出せるような感じの実装しておく。
    • ページ遷移が発生したら実際のページインスタンスを生成しデータを紐付けるような処理をさせる。
      • pageViewController:pageViewController viewControllerBeforeViewController:viewController
      • pageViewController:pageViewController viewControllerAfterViewController:viewController
  • UIPageViewController::dataSourceにUIPageViewControllerDataSourceインスタンスを設定する
  • 初期化時

参考)http://d.hatena.ne.jp/hyoromo/20130406/1365274911

構成

親のUIViewControllerがUIPageViewControllerとUIPageViewControllerDataSource,、UIPageControlを持っていて遷移の概要を管理し、データそのものと中身のページは基本的にUIPageViewControllerDataSourceが与えるような感じみたいです。

UIPageViewControllerの実装

初期化時にいくつか設定する。

  • transitionStyle
    • ページ送りの表現の種類。カールするかスライドか選べる。
    • UIPageViewControllerTransitionStyle
  • navigationOperation
    • ページ送りする方向の設定。縦か横か選べる。
    • UIPageViewControllerNavigationOrientation

本のレイアウト情報であるspineLocationとか余白の設定をしたい場合はNSDictionaryに入れてoptionsで渡すと設定できる。 これらは基本的にすべてread-only。

参考) http://d.hatena.ne.jp/hyoromo/20130422/1366658331

もしStoryBoardで上記のプロパティを設定する場合、クラスをUIPageViewControllerにセットしておけばAttributes Inspectorのところにそれ用のチェックボックスが出てくるので適宜設定しておく。

構成としてはUIPageViewControllerを継承してStoryboardで管理しようと思ったけど、 UIPageControlを直接は保持できないみたいだし、他のUIViewControllerに紐付けるわけでもなかったので、コードでインスタンス化する形にしました。

UIPageViewControllerDataSourceプロトコルの実装

プロトコルさえ実装されていればNSObjectでもなんでもいい。 ページが遷移した時に次のUIViewControllerを返すメソッドを実装する感じです。

前後にページ遷移が発生したことが分かるだけでindex的なものは持っていないため、NSArrayとかで管理したいのであれば適宜実装する。 発生した方向に次のUIViewControllerがなければnilを返す。

UIPageViewControllerDelegateの実装

画面遷移の前後のタイミングやデバイスの向きが変わったときに呼ばれるみたいです。

公式ドキュメント