koogawa blog

iOS、Android、foursquareに関する話題

なぜ技術ブログを書くのか

昨日、こちらの記事がバズっていました。

www.2dgod.com

ブコメ欄を見ると厳しい意見が並んでいますが、個人的には自分が考えていることや悩みをアウトプットするのは大事だなぁ、と思ったのでした。

自分も普段からブログやQiitaにいろんなことをアウトプットしているので、この機会に なぜブログを書くのか? 自分の考えを整理してみたいと思います。

恩返しをしたかった

プログラミングを始めた頃、先人たちが残してくれた技術記事にいつもお世話になっていました。そして、いつしか自分も「読む側」から「書く側」に回りたいと思うようになりました。

最初は自分の記事なんか人の役に立つのか?そもそも読んでもらえるのか?などと不安でしたが、書いていくうちに「あなたの記事が参考になった」など嬉しい反応を頂けるようになりました。

なんとなく書いたTipsが意外にも多くの反応を頂けたりすることもあるので(困っていることはみんな一緒だったりする)、どんな些細な事でもアウトプットしていくことが大事なんだなぁ、と思いました。

文章力向上のため

自分は元々作文がとても苦手でした(今も得意ではないですが)。ブログを書き始めた頃は、頭の中で考えていることをなかなか文章化できず苦しんだのを覚えています。

しかし慣れというのは不思議なもので、書いているうちに便利な言い回しや、文と文をつなげるテクニック的なものが自然と身に付いてきます。今も決して上手な文章を書けるとは思っていませんが、昔よりは読める文章になってきたと思います。

知識を整理するため

勉強会で発表するときも同じ事が言えますが、いい加減なことをアウトプットすることはできないので、準備に多くの時間を割くことになります。この過程が知識を整理するためのとても良い時間になると思っています。

万が一、内容に間違いがあった場合は、読者の方からご指摘を頂けるのも嬉しいことです*1。こういった助け合いの文化は良いものですね。

自分の存在を知ってもらうため

こちらの記事にとても良いことが書いてあります。

同じようなキャリアを歩んでいる先輩が、他にいなかった 【Kaizen Platform 伊藤直也さん】|転職エージェントのパソナキャリア

いい商品を作っても、マーケティングや営業をしないと売れないケースって多々ありますよね。それと同じで、どんなに高いスキルを持っていてもそれをアピールしなければ、その自分の技術力に気づいてもらう機会はそうそうない。技術系のイベントに登壇したり、ブログで情報発信をしたり、ソースコードを公開してみたりといった活動はキャリア形成において有利に働きます。もちろん内容が伴っていれば、ですよ。僕は自分のブログがたくさん読まれるようになって、それが転職のきっかけの一つになったようなところがありましたから。

私自身、転職する際に自分のブログがとても重要なキーとなったので、この内容にはとても共感できました。自分の名前が外でも通用する名前になるためにも、どんどん情報発信はしていったほうが良いと思います。

はてブ数、ストック数を稼ぐため?

もちろん自分の書いた記事がたくさんブックマークされたりすると嬉しいものです。ただ、それが目的になってしまうのは違うと思っています。

例えば「絶対使うべきライブラリ集」とか「初心者が今すぐ〇〇を使うべき10の理由」といった引きの強いタイトルを付ければ、記事がバズる確率も上がることでしょう。しかし、そういった記事ばかりを書くようにはなりたくないものです。

今後も 瞬間的にバズる記事より、必要なときに参照してもらえる記事 を書いていきたいと思っています。

まとめ

今回書いたこの記事自身も「みんなどういう理由でブログを書いているんだろう?」と疑問に思った方がググった結果として辿り着いてもらえたら嬉しいです。

*1:文句を言うだけで、指摘までしてくれない方もいますが…

【Tips】iOSで標高を取得する方法(Swift 3.0対応)

数年前に書いたこちらの記事が古くなってきたので、Swift編 として書き直しました。

blog.koogawa.com


CoreLocationを使って、位置情報から標高を取得する方法をメモしておきます。

実行環境

実装方法

準備

まずは「CoreLocation.framework」を追加します。

f:id:koogawa:20131122152458p:plain

次に Info.plist の NSLocationWhenInUseUsageDescription位置情報を使用する目的 を記載します。この内容はユーザに位置情報の使用を許可する際に表示されます。

f:id:koogawa:20160326145627p:plain

実装

CoreLocation をインポートします。

import CoreLocation

CLLocationManagerDelegate プロトコルを宣言します。

class ViewController: UIViewController, CLLocationManagerDelegate {

ユーザが位置情報の使用を許可しているか確認します。許可状況は didChangeAuthorizationStatus デリゲートで確認できます。初回は NotDetermined ステータスが返るので、requestWhenInUseAuthorization() メソッドでユーザに許可を求めます。

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    switch status {
    case .notDetermined:
        locationManager.requestWhenInUseAuthorization()
    case .restricted, .denied:
        break
    case .authorizedAlways, .authorizedWhenInUse:
        break
    }
}

現在地の取得を開始します。

if CLLocationManager.locationServicesEnabled() {
    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.startUpdatingLocation()
}

この状態で iPhone の位置情報が更新されると、次のデリゲートが呼ばれます。

// 位置情報が更新されるたびに呼ばれる
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    guard let newLocation = locations.last else {
        return
    }
    self.textField.text = "".appendingFormat("%.2f m", newLocation.altitude)
}

newLocationaltitude プロパティで標高が取得できます。単位は メートル です。

現在地情報の取得を停止するには次のメソッドを実行します。

if CLLocationManager.locationServicesEnabled() {
    locationManager.stopUpdatingLocation()
}

サンプルコード

注意点

  • 標高は、現在の高度からではなく地図データから測定されます
  • つまり、東京タワーの展望台にいても地上にいても、取得できる標高は一緒になります

応用できそうなアプリ

  • 現在地の標高測定アプリ(すでにいろんなアプリがリリースされている)
  • 標高を競い合ったり、高さによって景品が出るゲーム
  • 気圧計と組み合わせて正確な高度を計測するアプリ

【Tips】iOSで位置情報を取得する方法(Swift 3.0対応)

※数年前に書いたこちらの記事が古くなってきたので、Swift編 として書き直しました。

blog.koogawa.com


CoreLocationを使って、緯度・経度を取得する方法をメモしておきます。

実行環境

実装方法

準備

まずは「CoreLocation.framework」を追加します。

f:id:koogawa:20131122152458p:plain

次に Info.plist の NSLocationWhenInUseUsageDescription位置情報を使用する目的 を記載します。この内容はユーザに位置情報の使用を許可する際に表示されます。

f:id:koogawa:20160326145627p:plain

実装

CoreLocation をインポートします。

import CoreLocation

CLLocationManagerDelegate プロトコルを宣言します。

class ViewController: UIViewController, CLLocationManagerDelegate {

ユーザが位置情報の使用を許可しているか確認します。許可状況は didChangeAuthorizationStatus デリゲートで確認できます。初回は NotDetermined ステータスが返るので、requestWhenInUseAuthorization() メソッドでユーザに許可を求めます。

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    switch status {
    case .notDetermined:
        locationManager.requestWhenInUseAuthorization()
    case .restricted, .denied:
        break
    case .authorizedAlways, .authorizedWhenInUse:
        break
    }
}

現在地の取得を開始します。

if CLLocationManager.locationServicesEnabled() {
    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.startUpdatingLocation()
}

この状態で iPhone の位置情報が更新されると、次のデリゲートが呼ばれます。

// 位置情報が更新されるたびに呼ばれる
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    guard let newLocation = locations.last else {
        return
    }

    self.latTextField.text = "".appendingFormat("%.4f", newLocation.coordinate.latitude)
    self.lngTextField.text = "".appendingFormat("%.4f", newLocation.coordinate.longitude)
}

現在地情報の取得を停止するには次のメソッドを実行します。

if CLLocationManager.locationServicesEnabled() {
    locationManager.stopUpdatingLocation()
}

サンプルコード

注意点

  • シミュレータでテストする場合は、メニュー > Debug > Location から位置情報をカスタマイズできます
  • 位置情報のアクセス権限について詳しく知りたい場合は下記の記事を参照してください

blog.koogawa.com

参考リンク

2016/3/16 #potatotips #27 (iOS/Android開発Tips共有会) に参加してきたよ

昨日は六本木のグリーさんで開催された potatotips #27 (iOS/Android開発Tips共有会) に参加してきました。

connpass.com

非常に広い会場でした。

f:id:koogawa:20160317002907p:plain

お水も頂きました!ごちそうさまでした😄

f:id:koogawa:20160317002918p:plain

ツイートもまとめておきました。

以下は私の方で気になった発表のメモになります。間違いなどあれば教えて下さい(遅刻してしまったため、最初の方はメモが取れておりません🙇)


目次:

Focus Engineに願いを

GoroOtsubo さんによる発表。tvOSのお話です。

iPhoneiPadとは違い、Apple TVでは画面のボタンを直接タップすることができません。そこで、リモコンでスワイプしてボタンにフォーカスをあわせる必要があるのですが、このフォーカスが思い通りに動かず半日ぐらい悩まれたそうです。フォーカスがどこに移るかはFocus Engine神のみぞ知るとのこと😇

▼GoroOtsubo さんの書籍

iBeacon Tips

@SatoHikaruDev さんによる発表。

iOS 7から搭載された iBeacon ですが、未だあまり浸透してない感じがすると sato さんは語ります。よって、今がチャンスなのだそうです!

Beacon機器としてはestimoteなどがあり、ひとつ300〜3000円くらいで購入可能。乾電池2本で1年以上持つんだとか。

実装上の注意としては、iBeaconの機能を使うためには位置情報を「常に許可」しておかないといけないそうです。また、電源入れた直後は1〜5分iBeaconの機能が使えないとのこと。

実装自体はとても簡単で、ユーザが領域から出たり入ったりしたタイミングでデリゲートを呼ぶようにできます。

tuple tips

成田さんによる発表です。

タプルとは複数個のデータをまとめたもの。一時的に使用する関連する値のグループをまとめるのに使えます。

タプルの要素にはインデックスでアクセスできますが、スコープが長くなった場合に可読性が下がってしまいます。そこで、タプルの要素にキーワードを付けることで可読性を上げるというTipsが!

タプルの比較。タプルの要素が6までのときに比較ができます(6個である理由はスライドを参照)。比較できるのはあくまでタプルの要素がEquatable、Comparableに準拠した型の場合であり、タプル自体はこれらのプロトコルに準拠していないので比較はできないので注意が必要です。タプルの中にタプルを入れると比較ができなくなります。

SwiftでDependency Injection

@yoichitgy さんによる発表。

github.com

WebとiOSの連携方法は何がベストか? 2016年版

@yoneapp さんによる発表。Webからアプリを開く方法のお話です。

標準で SmartAppBanner という仕組みがありますが、これが動くのはSafariのみ。WebViewには対応していません。そこで、各社のアプリはどうハックしているのか、という紹介が興味深かったです。

App Submission Feedback

@tomzoh さんによる発表。

アップルが公開しているリジェクト事例集 Common App Rejectionsを元に、最近多いリジェクト事例の紹介です。

なんと今日は72枚のスライドを準備されたそうですw 個人的にはぜんぶ聞きたかったのですが、時間の関係もあり、いくつかピックアップして発表されていました。

▼こちらはtomzohさん主催のイベント!8月に開催されます iosdc.jp

【書評】本気ではじめるiPhoneアプリ作り(ヤフー黒帯シリーズ)

ヤフー株式会社 西 磨翁 様より献本頂きました。ありがとうございます。


2016.12.12追記:Xcode 8 & Swift 3改訂版が発売されました!これからアプリ開発をはじめる方はこちらがオススメです。


Xcode 7 & Swift 2 対応版はこちら

本気ではじめるiPhoneアプリ作り Xcode 7.x+Swift 2.x対応 黒帯エンジニアがしっかり教える基本テクニック (ヤフー黒帯シリーズ)

ヤフー黒帯シリーズとは

ヤフーには 黒帯 という制度があるようです。

ヤフー株式会社には、技術や制作の分野において専門性に優れたエキスパート人財を「黒帯」に認定し、 その活動を手厚く支援する黒帯制度があります。 「ある分野に突出した知識とスキルを持っているその分野の第一人者」が黒帯として任命され、 褒賞金と活動予算が付与されます。 それぞれの分野において、社内外への情報発信を積極的に行うとともに、 社内外の専門技能の発展に寄与します。

本書は「黒帯」である西さんが書かれた本であり、これからアプリ作りを始めようとしている人がApp Storeに公開するまでを 爆速 で支援してくれる本になります。

この本をおすすめしたい方

  • プログラミングを少しかじったことがあるけど、iOSアプリの開発は未経験
  • 古くからiOSアプリを開発しているけど、実はAuto LayoutやSize Classesがよくわかっていない
  • iOS 9から追加されたスタックビューの使い方をちゃんと学びたい

Apple IDすらもっていない」という方でも、この本を読めば最終的にアプリをApp Storeに公開するところまでできるようになります。

各章の内容

感想も交えて順に解説していきたいと思います。

Chapter1 アプリ開発の準備

この章ではApple IDを取得するところから、開発ツールである Xcode を用いて、実機テストをするところまで詳しく解説されています。

実機テストをするための設定は初心者がとても躓きやすいところなので、図を交えながらの丁寧な解説は嬉しいですね。

また、いきなり開発に入るのではなく、アプリ開発の主な流れについて説明があるのは良いと思いました。

  • 企画
  • 制作
  • 開発
  • テスト
  • リリース
  • フィードバック対応

Chapter2 Swiftプログラミングの基本

この章ではプログラミング言語 Swift の基本的な書き方を Playground というツールを用いて学習していきます。プログラミングはちょっとかじったことがあるけど、Swiftは全く初めて、という方に最適な進め方だと思います。最終的にはXcodeで簡単なプロジェクトを作り、ビルドするところまでできるようになります。

また、章末のコラムとして、ヤフーさんがiOSアプリを開発するプログラミング言語として Objective-C から Swift へ移行した際の話についても触れられています。詳細はヤフーTech Blogに寄稿されています。

Chapter3 iOSにはどんな部品があるか

この章ではiOSアプリの基本的な画面構成、各部品について解説されています。

最初に「ビューとビューコントローラの関係」について触れられています。実は私自身もアプリ開発を始めた頃はビューとビューコントローラの違いがなかなか理解できなかった記憶があるので、「なぜビューコントローラが必要なのか」の解説はとても重要だと思いました。

章の後半ではボタン、ラベル、画像などの各部品について解説があり、iOSアプリ開発に必要な部品をざっと把握することができます。

Chapter4 アプリの基本をマスターしよう

この章からは「割引計算アプリ」を作りながら、本格的なiOSアプリの開発に入っていきます。

Storyboard という仕組みを用いて開発を進めていく形式で、もちろん最近のiOSアプリ開発における必須知識である Auto Layout の解説もあります。

また、Xcode バージョン6から登場した Size Classes の仕組みについてもしっかり説明があります。昔からiOSアプリを開発してるけど、Storyboardの画面下部に表示される 「wAny」「hAny」という文字の意味が実はよくわかっていない という人にもおすすめです。

Chapter5 永続的なデータを扱う

この章では、実用的なアプリを作る上で重要な永続化(アプリを終了してもデータを保持できるようにすること)について解説されています。

iOSアプリでの永続化手段としては

  • NSUserDefaults
  • Core Data
  • iCloud
  • Keychain

などがありますが、ここではそれぞれの特徴や、実際にデータが保存される場所について解説されています。

後半では応用としてToDoリストアプリを作って行きます。ここで UITableView が登場するのですが、実は ここがとても重要 だと思っています。iOSアプリを開発したことがある方ならわかって頂けると思いますが、実用的なアプリを作る上で、テーブルビューの理解は必要不可欠と言っても過言ではないでしょう。

この章ではコラムとして、「テーブルビューを滑らかにスクロールするにはどうしたらよいか」についても触れられていて、素晴らしいと思いました。

Chapter6 サウンドとアニメーションの処理

この章ではサウンドやアニメーション機能を利用して、よりインタラクティブなアプリを作っていきます。

iOSアプリの場合、開発者が意識しなくともOS側で自動的にアニメーションを付加してくれるため(暗黙的なアニメーション)、それなりにインタラクティブなアプリが出来上がります。しかし、さらに凝ったアニメーションを実現するためには、開発者が明示的にアニメーションを実装する必要があります(例えばイイネ!ボタンをタップした時のアクションなど)。本章ではそういった明示的なアニメーションの実装方法についても詳しく解説されています。

また、後半で作成するクイズアプリでは、iOS 9から登場した UIStackView が さり気なく使われています。実は UIStackView の使い方がよくわかっていない、という方にもおすすめです。

Chapter7 通信できるアプリを作ろう

この章からより高度な内容になっていきますが、一番重要な章でもあります。と言うのも、App Storeに公開されている人気アプリのほとんどがネットワーク上のデータと連携するものだからです。

本章では NSURLSession という通信用のクラスを用い、ヤフーショッピングの商品を検索できるアプリを作っていきます。(2016.12.12 追記:改訂版ではSwift 3 の URLSession を使用)

初学者が躓くであろうATS(App Transport Security)についてもカバーされているので、安心して学習を進められると思います。

Chapter8 アプリの公開に向けて

この章ではいよいよアプリをApp Storeに登録していきます。

アプリアイコンの作成にはグラフィックツールである「Sketch 3」が使われています。Sketchの使い方までカバーされているのはすごいですね。

後半ではアプリ申請に必要な情報(アプリ名、説明文、Bundle ID等)や、実際の手順について詳しく解説されています。とくに証明書まわりの作業は複雑であり、初心者がもっともハマりやすいところなので、この章は必読でしょう。

また、万が一アプリ審査に落ちた場合(リジェクト)の心構えについても触れられていて、著者の優しさを感じました。*1

おわりに

「本気ではじめるiPhoneアプリ作り」というタイトルではありますが、入門者から中級者層まで広くカバーしている一冊だと思いました。私自身、実はiOS 9から追加されたスタックビューの概念をよく理解していなかったので、とても勉強になりました。

また、「初代ヤフオク!アプリが1週間でできた秘話」など、ヤフーならではのコラムが非常に面白いと感じました。

2016年、本気でiPhoneアプリの開発を始めたい方にぜひおすすめしたい一冊です。

※本書に出てくるサンプルコードはもちろん書籍サイトからダウンロードできます

おまけ

「黒帯」というだけあって、章ごとに瓦を一枚ずつ割っていくのが印象的でした。

f:id:koogawa:20160227175910p:plain

*1:実際にとても親切な方です

情報収集のための11の質問に答えてみる

d.hatena.ne.jp

naoya さんの記事に影響され、自分も答えてみたくなりました。

元々は次の記事から広がったようです。

で、ここからが本題なのですが、情報収集方法について幾つかの質問を作成しそれをバトンのように回していったら、気になるアルファブロガーの丸秘テクニックが!ここに明らかに!となればいいな、と思いました。

情報収集のための11の質問 - 量産型ブログ

1. RSSリーダーを使っていますか?

no。後で説明しますが、Twitterで十分な気がするので。

2. アンテナを使っていますか?

yes。はてなアンテナデベロッパー向けサイト(foursquareとか)の Change Log を常にチェックしてます。

3. ソーシャルブックマーク(SBM)を使っていますか?

yes。はてなブックマークを愛用しています。毎日オススメの記事をメールで送ってくれるのも重宝しています。

4. その他情報収集に使っているツールはなんですか?

Twitterがメインです。ニュース系のアカウントをリストに入れて毎日見ています。アカウント登録数は60〜70くらいです。

5. 他人にこれはお勧め!と思う方法は?

id:naoya さんの HBFav というアプリがホントにおすすめです。お気に入りに登録したユーザーがはてなブックマークに記事を登録すると、プッシュで通知してくれるのが嬉しいです。最近だとニュース系のアプリより、HBFav を見てる時間のほうが多いです。

https://itunes.apple.com/jp/app/hbfav/id477950722?mt=8&uo=4&at=10l8JW&ct=hatenablog

6. 逆にこれはお勧めできないな、と思う方法は?

片っ端からブックマークして、そこに書いてある情報がすべて正しいと信じてしまうこと。言い方は悪いですが、ネット上の情報は常に疑って読むようにしています。(一次情報でない限り)

また、ブックマークする際は、なるべくコメントもつけるようにしています。数年後に自分のコメントを見た時に、当時はこういう考え方だったんだなぁ、という振り返りにもなります。また、シェアする際にも自分の意見を添えることは大事だと思っています。(タイトルとURLだけだとbotっぽくなってしまう)

7. 情報収集で良く参照するサイトは?

8. 自分のブログで良く言及・リンクするサイトは?

最近だとQiitaが多いです。技術系の記事を書くときは、なるべく公式サイトのリンクも貼るようにしています。

9. 逆にここは参照してはいけない、と思うサイトは?

このサイトはダメ、というのは無いのですが、英語のニュースを翻訳した記事を読む場合は、できる限り原文もチェックするようにしています。わりと誤訳も多いので。

10. WEB以外で良く情報源にするものは?

面白そうな技術書籍はとりあえず買ってしまいます。会社のお金ではなく、自分で買うのがポイントです(買ってもらった本はなぜか読まない)。雑誌だとWeb+DB Pressを毎号読んでいます。

11. 最後にあなたが情報収集方法を知りたい人は?

気になる方はすでにはてなブックマークのお気に入りに追加していますが、中でも id:miyagawa さん、id:Watson さん、id:invent さん、id:sakebook さんが気になります。皆さん、情報収集に対するアンテナ感度がとても高い方たちなので!

iOS用のCIサービス「Bitrise」を使ったメモ

Github のプライベートリポジトリにも対応したCI(Continuous Integration)サービスを探していたところ、Bitrise というサービスを見つけたので使ってみました。

www.bitrise.io

料金

無料プランがあります。ただし、次の制限があります。

  • 2 team members
  • 200 builds / month
  • 1 concurrent build
  • 10 min build duration

個人で使う分には十分だと思いました。

Bitrise Plans and Pricing

特徴

Bitriseの最大の特徴は、ひとつひとつのStepを「Workflow」に追加していくところです。

f:id:koogawa:20160131103745p:plain

GUIベースで作業の順番を編集できるのが面白いですね。

できること

  • Unit Test 実行
  • Archieve作成
  • iTunes Connect へのアップロード
  • Cocoapodsにも対応
  • Slackに通知

他にもいろいろできます。

Integrations

今回のゴール

Github の develop リポジトリにプッシュされたタイミングで Unit Test 実行。常にテストが通る状態にしておきたかった。

やったこと

まずは、Bitriseにサインアップするところから。次のQiitaがとても親切でした。

iOS用のCIサービスBitriseを使ってみた - Qiita

あとは画面に従っていくだけで、比較的簡単にCI環境が作れてしまいました。

必要になったもの

  • テスト実行可能なXcodeプロジェクトが置いてあるGithubリポジトリ
  • ビルド用のプロビジョニングプロファイル
  • プロビジョニングプロファイルに対応したCode Signing Identity(.p12)とパスフレーズ

ハマった点

Xcodescheme が見つからない!というエラーに悩まされましたが、ドキュメントにちゃんと答えがありました。

http://devcenter.bitrise.io/docs/scheme-cannot-be-found

Github

*.xcworkspace/xcshareddata/xcschemes/SchemeName.xcscheme

が上がってなかったのが原因でした。

f:id:koogawa:20160130222529p:plain

無事、テストが通りました。

所感

  • ビルド回数などに制限はあるものの、個人として使うには十分
  • 業務に投入する場合は有料プランを検討しても良さそう
  • GUIベースでいろいろカスタマイズできるのは嬉しい
  • 最新のXcodeに対応しているのが嬉しい

参考にさせて頂いたサイト