YAMAGUCHI::weblog

海水パンツとゴーグルで、巨万の富を築きました。カリブの怪物、フリーアルバイター瞳です。

iOS開発に際して調べたことの個人的メモ

はじめに

こんにちは、Go界のドン・チードルです。最近ちょこちょこiOS開発について調べ物したりちょろちょろいじってたので、忘れないうちにメモしておきます。ちなみに僕は最近になってiOS開発、Objective-Cを触り始めたような素人ですので、間違った理解をしているかもしれません。コメントなどいただければ幸い。

Getting Started

とりあえず公式ドキュメント読んどけばいいだろと思ったので、Appleの公式ドキュメントを読みながら手を動かしました。

これで「TODO listアプリをStoryboardとかを駆使してコードをほとんど書かずにできるよ、すごい!!」みたいなチュートリアルやったんですが、結局何がわかったのかがあいまいでわけわからなくなったので、とりあえずObjective-Cのコードを適当に書いてみることにしました。

Objective-C

最初のチュートリアルでObjective-Cがなんとなーくわかったので、今度はiOSプロジェクトではなく、普通のCLIプロジェクトを作ってみることにしました。 新規プロジェクト作成時に OS X > Application > Command Line Tool としてプロジェクトを作成すると main.m くらいしか無いプロジェクトが作成されてめちゃわかりやすい!!

とりあえず NSLog() で出力できればいいやってことで適当に色々書いて、最低限Objective-Cを書くために必要な文法だけ抑えた。

エントリポイント

  • main.m がエントリポイント
    • @autoreleasepool というプロパティでARC (Automatic Reference Counting) が呼ばれる。このブロックの中に書いておけば自動で参照カウント見て良きに計らってくれて助かる。

  • プリミティブに string やら int やらあるが、iOS開発の時はあんまり使わない風
  • NS*** といういかにもNext Step出身でございますよという拡張型が用意されている
    • NSString (文字列)、 NSInteger (整数)など
    • 拡張型は全部 NSObject というクラスの拡張なので、初期化とかがめっちゃだるい
      • eg. NSString *foo = [NSString stringWithCString:"だるい" encoding:NSUTF8StringEncoding];
    • でもだるすぎるので糖衣構文で @ を先頭につけると簡単に初期化出来て良い
      • eg. NSString *foo = @"だるい";
    • ArrayやDictionaryもある
      • eg1. NSArray *bar = @[ @"spam", @"egg", @"ham" ];
      • eg2. NSDictionary *buz = @{ @"Monty": @"Python", @"age": @100 };
    • Arrayはちゃんと初期化するときに、最後 nil 終わりにしないといけないのに注意
      • eg. NSArray *bar = [NSArray arrayWithObjects:@"spam", @"egg", @"ham", nil];
  • 基本はimmutableなので、mutableな型が欲しかったら NSMutable*** を使う。
  • ARC使うので大体ポインタ型で宣言する

クラス宣言・実装

  • クラスはヘッダファイル *.h と実装ファイル *.m で定義。ファイル名がクラス名。クラス名は大文字始まり。
    • ヘッダファイルの @interface から @end の間にクラスのメンバ等を定義
      • @property でメンバ変数の定義。いろいろなオプションある。
      • @property プロパティで宣言するとアクセサを勝手に定義してくれる。デフォルトはprotected。
      • メソッドの定義は - 始まりならインスタンスメソッド、 + 始まりならクラスメソッド。メソッド名は小文字始まり。
    • 実装は実装ファイルの @implementation から @end の間に
    • 実装ファイルの先頭で @interface クラス名() から @end と書かれてる部分はクラスエクステンション
      • クラスエクステンションの中でメンバを宣言するとprivate的な扱い
  • 継承はヘッダファイルでクラス名の後に : で宣言する。単一継承。
    • @interface ChildClass : ParentClass
  • protocolというJavaのInterface的なもの( @optional によって実装しないでも良いメソッドも定義できるのが異なる) を定義することでまとまった機能を継承できる
    • 宣言は @protocol プロパティ
    • 継承する時は親クラス名の後に <> 内に記述。複数継承する場合はカンマ区切り。
      • @interface ChildClass : ParentClass <FooProtocol, BarProtocol>

メソッド定義・呼び出し

Objective-Cで一番なれなかったのはメソッド呼び出し(メッセージ式)でした。メソッド見ても最初「なんのこっちゃ?」という感じだったので。

  • メソッド定義は次の通り
    • -/+ (戻り値型)メソッド名部分1:(引数1型)引数1 メソッド名部分2:(引数2型)引数2
    • メソッド名は引数を除いた部分を全部つなげたもの
      • メソッド名部分1:メソッド名部分2: がメソッド名(最後のコロンも入る)
      • へんてこりんに見えるけど、英語で書くとなんか自然言語っぽくなる
        • たいていメソッド名は verb:noun/adv/adj:noun/adv/adj... という感じで続く
    • eg1. - (NSInteger)count
      • NSInteger 型を返す count メソッド(引数が無い)
    • eg2. - (Image *)initWithFile:(NSString *)path Title:(NSString *)title Description:(NSString *)desc
      • Image * 型を返す initWithFile:Title:Decription: メソッド(引数は全部 NSString 型の引数 pathtitledesc
  • メソッド呼び出しは [ ... ] で行う(メッセージ式)
    • eg1. [someString count];
    • eg2. [[Image alloc] initWithFile:@"hoge.jpg" Title:@"great pic" Description:@"flower"];

UI作成

StoryboardやらInterface Builderやらを使えばポトペタで楽ちんなんだろうけど、いろいろ隠蔽されまくるので、最初はなるべくコードで書きながら理解した。このへんのドキュメントを読むとわりと理解できた。

ViewとかViewControllerとか

まあMVCやってますよという話

  • Viewはデータを表示する箱
    • ButtonもWebViewもCanvasも全部Viewです
    • Viewの上下関係に気をつけましょう
    • ViewをView Controllerの中にまとめて画面を構成する
  • View Contollerが画面を構成する単位
    • コンテンツを表示するContent View Controller
    • 画面の遷移情報を管理するNavigation Controller
    • データ情報を管理するContainer View Controller
  • iOSではTableを使ったUIが非常に多いのでTableViewControllerっていうのがあるよ
    • まあ普通にViewController定義してTableViewを持ってるのと変わらないけど、はじめからいろいろ定義してあって便利
  • コンポーネント間のやり取りはprotocolとdelegateを使って行う
    • eg1. ViewController内のView(ボタンとか)のコールバックを受け取るためにViewControllerが自分自身をdelegate
    • eg2. 遷移先のViewControllerからの結果を遷移元が受け取るために、遷移先のprotocolを遷移元が実装して、遷移元が自分自身をそのprotocolのdelegate先とする

全部コードで書く場合に意識すること

  • ViewControllerの loadViewviewDidLoad 内で初期化
  • initWithNibName とか用なしなので自分で init*** を書く
  • イベントはことごとく次のようなメソッドを定義して受け取る
    • - (IBAction)didSomething:(id)sender

snippet

  • initWith***
- (id)initWithTitle:(NSString *)title
{
    self = [super init];
    if (self) {
        self.title = title;
    }
    return self;
}
  • AppDelegate 初期化
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    Hoge *hoge = [[Hoge alloc] initWithString:@"hoge"];
    FooViewController *foo = [[FooViewController alloc] initWithHoge:hoge];
    UINavigationController *nav = [[UINavigationController alloc]
                                   initWithRootViewController:foo];
    self.window.rootViewController = nav;
    
    [self.window makeKeyAndVisible];
    return YES;
}

アプリケーションのルートとNavigation Controllerのルートは別だっていうのは、1回アプリ作っちゃえばわかるんだけど、最初はRootViewControllerって言葉が2回出てきてすごく混乱した。

ところで

はてなブログObjective-Cのsyntax highlight用キーワード調べるのに苦労した。 objc でいいんですね。

Goが4歳になりました

はじめに

こんにちは、Go界のヒュー・ジャックマンです。今日はGoのリリース4周年となる日です。

今日はリリース記念日ということで、上のエントリをなぞりながら、このすばらしい記念日を祝いましょう!

トレンド

先のエントリには "golang" というキーワードがどれくらい検索されてきたか、グローバルでの検索ボリュームを見ていて、2012年のversion 1.0リリースから急増したことが示されています。では日本国内に限ってはどうだったのかも見てみましょう。

面白いのは日本では各区切りの段階(初公開リリースと1.0のリリース)のタイミングでピークを迎えていて、それ以外は低空飛行をしている、という状況です。しかしながら、2012年3月の1.0リリース以降を見てみると、着実に検索ボリュームを伸ばしているのがわかります。

プロダクション投入

こちらに関しては日本国内においてはまだ表向きにはプロダクション環境でGoを利用しているという話はあまり出てきていません。(もしあればぜひご連絡ください!)

実際半年前の春の段階では「興味があります」というような内容が多かったですが、先日のGo Conference 2013 autumnでは「実際にプロダクションへ投入している」「導入を積極的に検討している」という声がちらほら聞こえ、いよいよ浸透してきたなあという実感を得ました。

半年後にまたGo Conferenceを開催したいな、と思っていますが、その時にはプロダクション環境での事例が1つでも聞けたら嬉しいなあと思います。

コミュニティ

国内のGoコミュニティは最近活発になってきています。

などなど。他にもあれば教えて下さい!

公式ブログのほうでも「Tokyoのコミュニティがあるよ」と紹介されていますが、東京に限らず各地域で勉強会が開催されています。ぜひ参加してみてください!また日本語情報などはGoogle+コミュニティ、Lingrなどで交換されていますので、ぜひ参加してみてください!

おわりに

リリース4周年おめでとうございます!次の4年がどうなっているか楽しみです!

Go Conference 2013 autumnを開催しました #gocon

はじめに

こんにちは、Go界のジャック・ニコルソンです。連休最終日の10/14に日本マイクロソフトさんの品川オフィスをお借りしてGo Conference 2013 autumnを開催してきました。

新幹線を使って参加された方もいて、大変うれしかったです。次回はまた半年後の春頃に開催したいと思っています。GoConでは絶賛発表者を募集しておりますので「何か作った」「突っ込んで調べてみた」という方がいたらご連絡ください。また次回もLTをしようと思うので、こちらはもっと気軽な感じで参加してみてください。

発表者スライド

LT

プレゼン

Gopher in the Cloud」という話をしてきた

クラウドとタイトルに付いていますが、GoをサポートしているPaaSの話と、Build Constraintの話をしてきました。

Go言語はその立ち位置からしてグローバルで見てもインフラ系のエンジニアにすごく人気で、PaaS/IaaSベンダーのエンジニアが多くコミットしているイメージがあります。しかしながら、そういうエンジニアが彼らのインフラ上でGoのアプリケーションを容易に動かせるように、非公式とはいえハックしてくれていて、ほぼ準公式に動作するものとして公開されています。

GoはC++/Javaがカバーしていたミドルウェア系のソフトウェアを書くだけでなく、LL系で実装したAPIやWebサービスを高速化する事例でも使われ始めていて、実際にAndrewのキーノートでも紹介されているように、標準パッケージのみでもある程度のものであればWebアプリケーションを作れるようになっています。まずは多くの人に試してもらいたいとおもったので、プレゼン前半では3rd partyのPaaSをいくつか紹介しています。

後半ではBuild Constraintsという若干応用的な内容を紹介しました。Build Constraintsを用いることで、複数の環境で異なるソースを用いてビルドを行うことが出来、ネイティブコードを吐くGoの柔軟性をさらに高めることが可能となります。 肝心なのはこれがソース内のコメントのみで制御される点で、ビルドファイル無しでビルドができるというGoの設計が反映されています。

Tシャツ販売

@nuki_ponさんがGoConオリジナルTシャツとスタンダードなGopher Tシャツの販売を始めました。コミュニティ発Tシャツ熱い!!GoCon Tシャツは10/21までの1週間限定販売だそうです。

謝辞

会場提供をしてくださったマイクロソフトの藤山さん、ありがとうございました。再度スポンサータイム。

また運営を手伝ってくださったみなさん、ありがとうございました。 > @Jxck_、@tenntenn、@nuki_pon、id:futoase、@es_kap、@ikasamt、@manji0112

感想ブログエントリなど

関連エントリ

引越し備忘録

はじめに

こんにちは、Go界のジェット・リーです。10年間北区に住んできたのですが、新しい場所に住んでみたいという気持ちと、通勤時間を減らしたいという気持ちが強くなったので、勢いで先々月引越をしてみました。その際色々とやることがあって、想定していたよりやることがあったので、今後のために残しておきます。

家を借りたくなったら

家を借りたくなったら

引越し準備 (2013年6月中旬〜7月末)

部屋探し (2013年6月中旬〜7月中旬)

足で稼ぐのは厳しいので部屋探しサイトを活用した。いくつか選択肢があった中で、suumoで検索条件をマイリスト化して、新着物件をメールを受け取るのが一番性にあっていた。 結局知り合った仲介業者から送付されてきた物件も合わせて、間取り図は200枚近くは見た気がする。その中から選んで内見は7件ほどおこない、最終的に2つの候補から現物件を選んだ。

契約 (2013年7月中旬〜7月下旬)

仲介会社、管理会社各々に対して手数料および各種料金の支払いを行った。物件の管理会社がわかっていたため、直接管理会社に掛けあっても良かったが、時間がもったいなかったため仲介業者に交渉や諸項目の確認を任せた。 交渉に関しては家賃が下がったあとの交渉だったため、金額面では特に割引はなかったが、入居日に関してかなり融通を利かせてもらった。これだけでも半月分の家賃は浮いた。

引越し作業 (2013年7月下旬〜8月末)

インフラ系停止・開始連絡

東京電力が運営している「引越れんらく帳」が大変有用。電気・ガス・水道の停止・開始の連絡をウェブ経由で一発でできる。それだけでなく、ここにまとめてあるような諸々の民間サービスに対して連絡を行ったかのチェックリストも作成できるため、まずはここでアカウントを作るのが良い。

引越し業者選定

なんか楽そうだったので「引越し侍」を使ったら、電話がじゃんじゃんかかりまくってきて最悪だった。あと引越し侍の電話オペレータもなんか全然応対ができない感じの人で全然話が噛み合わなかったのでめんどくさかった。二度と使わないし、使うこともおすすめしない。

大手引っ越し業者は、テレアポの人がやたらピッチが高い声色で独特の日本語を使ってるし電話かけるたびに同じことを3回も4回も言わなきゃいけないし、業務中でもガンガン電話かけてくるし、メールでの応対しないっていうし、引越し業界は終わってると思ったし、こんな人件費に引越し費用がかかってると思ったら頭にきた。TVCM流す前に業務改善しろ。具体的には「アリさんマークの引越社」「サカイ引越センター」が最も電話連絡が煩わしかった。

そんななかで結局利用した「フクフク引越センター」はまともな対応で、メールでの応対もしてくれ、値段も良心的だったので良かった。

荷造り (2013年7月下旬〜8月中旬)

契約が決まるまでは何もしたくなかったので、逆に契約が決まってからはバタバタしてしまった。結局次のような量になった。

  • 大箱6個
  • 中箱3個
  • 小箱5個
  • 1.5Lペットボトル半ダース用箱5個
  • 衣装ケース6つ
  • 140Lバッグ1つ
  • ギター1本
  • ベース1本
  • ベースアンプ1個
  • デスクトップマシン3つ
  • こたつ
  • 姿見
  • シングルベッドフレーム+マットレス
  • 掛け布団、毛布、ブランケット、枕
  • アーロンチェア1脚
  • 24inchモニタ、19inchモニタ各1つ
  • 自転車1台

粗大ごみ廃棄 (2013年8月上旬)

自分の自治体では粗大ごみを捨てる場合は事前に廃棄日の予約と、廃棄物に応じた粗大ごみチケットを購入しておかなければならなかった。

荷解き (2013年8月中旬〜8月末)

引っ越し当日にダンボールは8割方片付けてしまったし、ベッドも棚も組み上げてしまったので特に問題はなかった。

引越し事後処理

転居元清掃 (2013年8月中旬)

転居元が転居先からそこまで遠くないため(電車で30分程度)、転居先への荷物搬入完了後に転居元の清掃を行った。 基本は掃除機でホコリを吸い取る作業ばかりだったが、床にクッション材として使っていたゴム板のカスがへばりついていたのを取る作業が厄介だった。 歯ブラシとマジックリンで綺麗に落ちた。歯ブラシとても便利。

ゴミが「可燃ごみ」「不燃ごみ」「資源ごみ」それぞれあったので、転居後にも各ゴミを転居元自治体のゴミ収集日に合わせて出さなければいけないのは不便。 ゴミ集積所がある集合住宅であればこういう心配がなくて正直羨ましい。

オフライン手続き

行政

転出届 (2013年8月中旬)

転居先の自治体で転入届を提出するためには、転居元で転出届を出して、転出証明書を受け取る必要がある。 転居元は北区なので、北区の転出証明書を受け取る。

転入届・印鑑登録 (2013年8月中旬)

転出証明書を受け取ったあとに、転居先で転入届を行った。渋谷区はヒカリエに区民サービスセンターがあり、土曜日も半日対応してくれているのでとても助かる。

印鑑登録は転入届を行う際に窓口で申請書類をもらって引き続き行うことが出来る。

転居・転送サービス(2013年7月末)

当面の郵便物が転居先に来るように郵便局に申請する必要がある。最近はネットでも登録ができるらしく便利。自分の場合はオフィスのそばに郵便局があるので、昼休みに提出した。事前に登録できるので、転居の2週間以上前でも申請だけしておいた。

運転免許証住所変更(2013年9月中旬)

なぜかこれだけだらだらと先送りにしてしまった。手続き自体は非常に簡単で、住民票、公共料金の領収書/請求書などで新住所と氏名の記載があるものなどがあれば手続き可能。自分はNTTの料金請求書で変更手続きを行った。時間にして10分程度。

個人

インターネット回線&プロバイダ契約 (2013年8月上旬)

家のインターネット回線はFLETSで、プロバイダがOCNというNTTにおんぶにだっこな感じだが、116に電話するだけで回線の移転手続きが終わったのは大変良かった。ただ転居先がフレッツ光のマンションタイプに入っておらず、ファミリータイプに加入して最悪穴空け工事をする必要があると言われたので、工事当日に確認してもらい穴空け工事が必要になった場合には解約するということで回線移設の連絡をした。

当日は配電盤部分から光回線を引きこもうとしたが、集合住宅の共有部を通さざるを得ない状況となり、大家から認められなかったため、外からエアコンダクト経由で通した。こちらに関しては無駄な心配をすることになるため、契約時に管理会社に「光回線の引き込み可能の確認が取れるまでは契約しない」という条件を盛り込んでも良かったかもしれない。

クレジットカード住所変更届け(2013年9月上旬)

利用しているクレジットカード会社によってまちまちだが、オンラインで変更できるものは非常に楽で助かった。トラップだったのはTカードは、Tサイト、Tカードそのもの、クレジットカード機能それぞれに対して住所変更届を行わなければいけなかったことぐらい。

銀行口座住所変更(2013年9月末)

これも利用している銀行によるが、メガバンクはオンラインで変更できるので非常に楽。少なくとも確認しただけで次の銀行はオンラインで変更可能だった。

ただしシティバンクに関してはウェブでの変更にあたってワンタイムパスワード(OTP)を利用する必要があり、OTP利用開始にあたって郵送される通知書を待つ時間が3営業日ほど必要となる。

保険契約住所変更届け(2013年8月下旬)

契約していた保険会社に住所変更届を行う必要がある。こちらも契約している保険会社によって変わる。自分の場合は電話一本で済ませられたので助かったものの、自分のタイミングで変更できるWebシステムがないのは微妙。 このへんはライフネット生命みたいなオンラインが主の保険会社だと違うのだろう。

会社

住居変更 (2013年8月下旬)

住民税や年金の納付先が変わるので、会社側に伝える必要がある。人事に伝えて完了。

おわりに

振り返ってみると色々とやることがありましたが、こうして作業を洗い出してみると結構並行してできるものも多く、いつになるかわからないけれど、次回の引越しはより一層スムーズに出来そうです。