開発メモ

開発関係のメモをいろいろと。たぶん。

3日で、できる! 簡単iPhoneアプリ開発体験

〜音楽アプリを作ってみよう Swift 2.2 Xcode 7.3 対応〜

IMG_0074

種類 情報
著者 木地和也、武田雅人、中原久美
発行日 2016年7月31日 初版第1刷発行
監修・発行 株式会社 Tekuru

感想

Kindle Unlimitedで無料だったので読んでみたシリーズ。

Xcodeで音楽アプリ(?)を作る手順を説明しただけの本。

ターゲットになっている環境はXcode 7.3 / iOS 9.2 / Swift 2.2。


プログラミングスクールで、1年間に300人近い初心者にiPhoneアプリの開発を教えてる人たちが書いたらしい。それにしては、あまりにも説明不足な気がするんだけど・・・ プログラミングスクールの教材として考えたら、こんなものなのか?

初心者向けの入門書としてみた場合、あまりにも説明不足なところが多い。

『言われたとおりにやればアプリが出来ますよ』系の入門書では良くあることなんだけど、作業をやらせておいて、その意味を説明してない箇所が多い。かなり多い。

あと、同じことをするのに複数のやり方がある場合、1通りの方法しか説明してないってのもこの手の本にありがちなパターンか。

Storyboardでコントロールをおいて、ソースコードと接続するってのはiPhoneアプリの開発では何回も繰り返すことになると思うんだけど・・・ そこで、わざわざ先に自分でメソッドを用意させるってのはちょっと。あまりにも無駄が多すぎる。

アプリ開発で使う素材を、自分で検索してダウンロードさせるのは微妙。本を買った人向けに、どっかのサーバーに置いておくぐらいの気を利かせることは出来なかったんだろうか?

フレームワークの説明も微妙。ソースコードが汚いのも微妙。最低でも、フォーマットぐらいちゃんとするべき。

Auto Layoutの説明で、長々とページを使ってるわりに内容が無い。

サンプルのソースでバックスラッシュの所が『¥』に化けてるのは・・・ 微妙を通り越してひどい。本が出来たあとで、誰も読み直してないの?

いちいち突っ込んでたらキリが無いから途中からスルーしたけど、あまりにも突っ込みどころが多すぎ。著者が三人も居るのに、Swiftをちゃんと使いこなしてる人は1人も居ないらしい。


はっきり言って、この本だけ買って読んでも何も出来るようにならない。というか、この本を読んでiPhoneアプリが開発できるようになる人なら、こんな本無くても出来るようになるでしょう。

これを教材として、先生がマンツーマンで付くなら・・・ まぁ、でも、こんなレベルの教材使ってるようじゃ駄目か。

おすすめ指数:☆

(2016/08/21 読了)

プログラミングの世界へようこそ

IMG_0069

種類 情報
著者 尾川一行、中川聡
発行日 2016年1月27日 初版第1刷発行・電子版 Ver 1.00
発行 マイナビ出版

感想

Kindle Unlimitedで無料だったので読んでみたシリーズ。

プログラミングにおける基本的な考え方を丁寧に説明した本。

特定のプログラミング言語では無く、プログラミングで使われている基本的&汎用的な要素を説明してある。


例えば『ソースコード』とか『変数』とか『関数』とか『インデント』とか。プログラミング言語の解説書には当たり前のように出てくるけど、慣れてない人にはわからない単語について、それなりにしっかり説明してある。

いくつか突っ込みどころもある・・・ 個人的には、主要な13言語の特徴をまとめたところの『学習コスト』は大いに突っ込みたいけど、まぁ、そこまで言ってるとキリが無いか。

最後の『プログラミングが上達するには?』は、もっと充実してると良かったかな。


まったくプログラミングをやったことが無いけど、これから真面目にやってみたい人には良い本かもしれない。

こういう本はありそうでなかったので、それだけでも価値があるかと。ただ、それも、2016年の1月に出された本を8月に読んだからそう言えるわけで・・・ 数年後には、内容的に古くて役に立たないところが増えそう。

毎年、更新版でも出すのかな?

おすすめ指数:☆☆☆+

(2016/08/20 読了)

アップルをプログラミングせよ! Swiftビギナーズガイド

アップルをプログラミングせよ! Swiftビギナーズガイド

種類 情報
著者 掌田津耶乃
発行日 2015年2月
発行 Tuyano-Project

感想

Kindle Unlimitedで無料だったので読んでみたシリーズ。

書かれたのが2015年の2月で、ターゲットになっている環境はXcode 6.0。つまりSwift 1.0・・・ 今となっては、遙か昔のバージョンだな。


まず、読んでてすぐに気がつくのがインデントがおかしい。Xcodeでスペース8個のタブはありえないのでは?

あと、スペースが必要なところに入っていない。Xcodeが標準でフォーマッティングしてくれるSwift風のフォーマットになっていない。

SwiftLintを通したら、片っ端から警告が出るようなサンプルコードだらけ。個人のブログならともかく・・・ いや、まぁ、それでもこれはひどいと思うけど、お金を取って売る本でこのレベルはちょっとひどい。

全体的に説明不足なのもひどい。『switchの最後には、必ずdefault:を用意します。』って・・・ こんなあからさまな嘘が書いてあるのが恐ろしい。

これ、書き終わったあとで、だれか詳しい人に目を通してもらってないんだろうか? この一文を見ただけで、この著者の他の本も買えなくなるな。


他のプログラミング言語をある程度使いこなせている人が、Swiftの雰囲気を掴む程度の役割は果たせるかもしれない。けど、その程度だったらネットで調べれば充分。つまり、単独の本としてみた場合、特に価値は無い。

そもそも『表紙のフォントがひどすぎる』って言うのは指摘しちゃ駄目なんだろうか? だれか、周りにアドバイスしてくれる人が居なかったのか・・・

おすすめ指数:☆

(2016/08/20 読了)

iOS8開発テクニック集 Xcode6編

iOS8開発テクニック集 Xcode6編

種類 情報
著者 zuvola
発行日
発行

感想

Kindle Unlimitedで無料だったので読んでみたシリーズ。

タイトルからして紛らわしい・・・ というか、わざとミスリードさせてるんだろうけど、iOS8向けにアプリを開発するときのObjective-Cのテクニックを紹介した本では無い。

実際には、Xcode6であまり知られてないテクニックを列挙した本。ただ、質も量もかなり微妙。Xcodeを使い始めたばかりの初心者なら、目を通す価値があるのかもしれないけど・・・ 初心者向けなら初心者向けで、それぞれの項目をもう少し丁寧に書くべきかと。

すでにXcodeを使いこなせてる人には要らない本。少なくとも自分は、読んで良かったと思えた項目は1つも無かった。そもそも、もうすぐXcode8が出る時期に、Xcode6のテクニックを調べようと思う人は居ないか。

おすすめ指数:☆☆

(2016/08/19 読了)

Code Complete 第2版

完全なプログラミングを目指して Kindle

code complete

種類 情報
著者 Steve McConnell
翻訳 株式会社クイープ
発行日 2016年4月4日 第1版
発行 日経BP

感想

ソフトウェアを開発するときのいろんな事を片っ端からまとめた本。Amazonkindleの合本版が安くなってたから買ったんだけど・・・ 微妙だった。


ソースコードを書くときに気をつけることだけで無く、そもそもの設計の話からプログラマーの心構えまで、幅広く丁寧に取りあげた本。これさえ読めば、ソフトウェア開発の事なら何でもわかる・・・ とはいかないのが難しいところ。

ただでさえ内容が幅広いのに、無駄な記述が多くて読んでて疲れる。というか、読んでられない。幅が広いだけに、あまりにも当たり前のこともいちいち丁寧に説明してあるのも逆につらい。

実際のコード例を出す場面では、C++JavaVisual Basicが使われているが・・・ なんというか、すでに過去の歴史になりつつあるのがつらい。その当時は確かに注意しなければいけなかったかもしれないけど、2016年ではプログラミング言語そのものが進化しちゃってる。今さら、whileループやらgotoについて熱く語られてもねぇ・・・

そういう意味は、プログラミングにおける概念を抽象的に説明した部分さえ古くなっているのが面白い。一般的な考え方を説明しているはずなのに、プログラミング言語が進化することで、実は一般的じゃ無かったことが明らかになってしまうと言う。


真面目にプログラミングに取り組んでる人なら、この本は要らないんじゃないかなぁ。一通り目を通せば新たな発見とか役に立つところとかもあるんだろうけど、それ以上に時間の無駄になりそう。

そして最大の問題点は、この本の内容を全て実現したとしても、完全なプログラミングは出来ないって事だな。


おすすめ指数:☆☆

(2016/07/26 読了)

Safariのダウンロードが正常に終わらない時の対処法 2016夏

以前、 『Safariのダウンロードが正常に終わらない時の対処法 - 開発メモ』 という記事を書きましたが、これでも上手くいかないケースが出てきたので、別の方法を試してみました。

明らかにダウンロードが終了しているはずなのに処理が進まなくなった時、こんな風にするとうまくいくかもしれません。

1. ダウンロードを中止します

Safariツールバーにあるダウンロードアイコンをクリックして、対象ファイルのダウンロードを終了させます。

2. ダウンロードしたファイルの中を見ます

ダウンロードフォルダに『ファイル名.download』という名前のファイル(?)が出来てるはずなので、右クリックして『パッケージの内容を表示』を選択します。

3. ダウンロードしたかったファイルがあります

パッケージの中に落としたかったファイルがあります。たぶん。

あとは、煮るなり焼くなりご自由に。これで駄目なら・・・ 最初からダウンロードのやり直しかな。

というか、AppleのサイトからSafariでファイルを落としてて上手くいかないってどういうことなのかとorz

iOS向けアプリで画像を自動的に切り替え

はじめに

一定の間隔で、自動的に画像を切り替えて表示するアプリを作ります。

作業の手順としては、こんな感じになります。

  1. 画像を表示するところまで作成
  2. 一定の間隔で処理するためのタイマーを設定
  3. 画像を切り替える

ソースコードはこちら。

See_Ku / SimpleSlideshow — Bitbucket
https://bitbucket.org/See_Ku/simpleslideshow

動作環境

環境 情報
Xcode 7.3.1 (7D1014)
iOS 9.0
Swift 2.2
Date 2016/7/2

1. 画像を表示するところまで作成

以前、『iOS向けアプリで画像を画面に表示』というネタを書いたので、こちらを参考にしてImage Viewに画像を表示するところまで作業しておきます。

iOS向けアプリで画像を画面に表示 - 開発メモ
http://seeku.hateblo.jp/entry/2016/07/02/160916

今回は複数の画像を切り替えられるようにするので、プロジェクトに複数の画像を追加しておきます。今回は6枚の画像を追加してみました。

f:id:see_ku:20160702221653p:plain

2. 一定の間隔で処理するためのタイマーを設定

ストーリーボード側はImage Viewが1つあれば充分なので、ここから先は全てソースコードを書いていく作業になります。

iOS向けのアプリで一定の間隔で何か作業をするとき、よく使われるのが NSTimer です。例えば、1秒間隔で onTimer() を呼び出すような場合、こんな感じになります。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!

    /// 一定の間隔で処理を行うためのタイマー
    var timer: NSTimer?

    override func viewDidLoad() {
        super.viewDidLoad()

        let image = UIImage(named: "fruit_melon_cut_orange")
        imageView.image = image

        // タイマーを設定
        timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(ViewController.onTimer(_:)), userInfo: nil, repeats: true)
    }

    /// NSTimerによって、一定の間隔で呼び出される関数
    func onTimer(timer: NSTimer) {

        // 関数が呼ばれていることを確認
        print("onTimer")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

動かしてみるとこんな感じになります。

f:id:see_ku:20160702221754p:plain

ちなみに、 NSTimer.scheduledTimerWithTimeInterval() は以下のように宣言されています。

    public class func scheduledTimerWithTimeInterval(ti: NSTimeInterval, target aTarget: AnyObject, selector aSelector: Selector, userInfo: AnyObject?, repeats yesOrNo: Bool) -> NSTimer

それぞれ、引数の意味はこんな感じです。

引数 意味
ti 関数を呼び出す間隔(秒)
target 関数を持っているオブジェクト
selector 実際に呼び出される関数
userInfo 関数を呼び出す際に渡す情報
repeats true: タイマーを繰り返す false: 1回のみ

プログラムとしてみると、以下の項目がポイントになります。

  • 作成したタイマーを保存するためのプロパティを用意しておく
  • NSTimer.scheduledTimerWithTimeInterval()でタイマーを作成
  • onTimer()がちゃんと呼び出されているか確認する

3. 画像を切り替える

いつまでも onTimer と出力し続けても仕方がないので、実際に画像を切り替える処理を組み込んでみます。こちらは、以前に『iOS向けアプリで複数の画像を切り替え』というネタを書いているので、そちらに書いた画像を切り替える処理を少し修正して使います。

少し長いですが、ViewController.swift全体はこうなりました。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!

    /// 一定の間隔で処理を行うためのタイマー
    var timer: NSTimer?

    /// 表示している画像の番号
    var dispImageNo = 0

    /// 表示している画像の番号を元に画像を表示する
    func displayImage() {

        // 画像の名前の配列
        let imageNameArray = [
            "fruit_melon_cut_orange",
            "fruit_slice10_orange",
            "fruit_slice11_kiwi",
            "fruit_slice05_strawberry",
            "fruit_slice12_grape",
            "fruit_slice08_apple",
            ]

        // 画像の番号が正常な範囲を指しているかチェック

        // 範囲より下を指している場合、最後の画像を表示
        if dispImageNo < 0 {
            dispImageNo = 5
        }

        // 範囲より上を指している場合、最初の画像を表示
        if dispImageNo > 5 {
            dispImageNo = 0
        }

        // 表示している画像の番号から名前を取り出し
        let name = imageNameArray[dispImageNo]

        // 画像を読み込み
        let image = UIImage(named: name)

        // Image Viewに読み込んだ画像をセット
        imageView.image = image
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let image = UIImage(named: "fruit_melon_cut_orange")
        imageView.image = image

        // タイマーを設定
        timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(ViewController.onTimer(_:)), userInfo: nil, repeats: true)
    }

    /// NSTimerによって、一定の間隔で呼び出される関数
    func onTimer(timer: NSTimer) {

        // 関数が呼ばれていることを確認
        print("onTimer")

        // 表示している画像の番号を1増やす
        dispImageNo += 1

        // 表示している画像の番号を元に画像を表示する
        displayImage()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

やっていることは、単純で、タイマーで呼び出される関数の中で、表示している画像の番号を1増やして、画像を表示しているだけです。

実際に動かすとこんな感じになります。・・・静止画にするとわかりませんね。

f:id:see_ku:20160702221813p:plain

謝辞

画像はいらすとやさんの物を使わせていただきました。

無料イラスト かわいいフリー素材集 いらすとや
http://www.irasutoya.com/