真面目なブログはこっち 👉 blog.s64.jp

「詳細! Swift 4 iPhoneアプリ開発 入門ノート」の読書感想文

プログラミング学び直しシリーズの一環として、SwiftおよびiPhoneアプリ開発を総ざらいしようとした。
今回は「詳細! Swift 4 iPhoneアプリ開発 入門ノート Swift 4 + Xcode 9対応」という本を読んだ。

詳細! Swift 4 iPhoneアプリ開発 入門ノート Swift 4 + Xcode 9対応

詳細! Swift 4 iPhoneアプリ開発 入門ノート Swift 4 + Xcode 9対応

以下は読書感想文です。

読むとよさそうな人

  • Androidアプリなどを既に開発している人
  • 既にプログラミングを始めている人
  • iPhoneアプリの概念を知りたい人
  • Swift特有の概念を知りたい人

向いてる用途

  • とりあえずiPhoneアプリ作りの足掛かりを知る
  • iOSアプリで作りたい機能の逆引きをする

向いてない / できないこと

  • 初めてプログラミングをする
  • iPadアプリを作る
  • ストアで配信する
  • 高度な機能を作る

感想

既に他プラットフォームでアプリ開発をしている人間向けの入門書、という印象を受けた。初心者が読んで理解するにはスピードが早く解説も弱いが、その分プログラミングの経験がある人間には小気味良く読み進められる内容だと感じた。Xcodeの使い方としても、他プラットフォームから入った場合に困りそうな操作やレイアウトの設定は網羅されている印象を受けた。

反面、詳細なアプリの設定や高度な機能に関しては解説が一切といってよいほど無いため、これをベースに自身で調べ進める、または次のステップとして他の書籍を当たることが想定されているように感じた。入門として十分であるため、ネガティブには捉えていない。

"初めてのアプリ開発への入門ノート" としてではなく "iPhoneアプリ開発への入門ノート" として読むべきであり、それに十分な内容である。

Mac版LINEで一部AAが豆腐になる問題

例えばこうなる時がある

f:id:S64:20180415152051p:plain

回避策

LINEアプリ上のフォント設定を Times にすると表示できる

f:id:S64:20180415152249p:plain

こうなる。

f:id:S64:20180415151911p:plain

なぜ?

てきとうにやって当たっただけなのでわかっていない。また、検証してない。
どのフォントにどの文字が含まれてどういった場合にフォールバックされるのかもよく理解していない。

ちなみに

期待していた Noto Sans や Noto Sans CJK JP、Source Han Sans とかで試したけどダメだった。
今回の豆腐化してしまう文字自体は Noto Sans Yi に収録されているような気がしている。オールインワンの合成フォントとかあればいけるんだろうか。

C# でソート練習

プログラミング学び直しシリーズ。食わせる数列は以下。1 〜 100の100個の整数をランダムに並べたもの。

60 32 85 24 57 31 98 50 49 81 52 80 96 41 55 91 54 70 77 36 94 74 89 29 38 1 34 73 4 2 6 18 16 65 51 3 22 56 9 28 13 46 17 33 45 72 99 26 76 14 42 82 44 35 53 19 92 87 90 8 12 95 97 69 20 37 48 15 66 64 78 83 40 79 75 86 68 62 61 10 84 100 93 27 21 43 25 67 71 88 63 23 11 39 30 59 5 58 7 47

バブルソート

using System;
using System.Linq;

public class Program
{

    public static void Main(string[] args)
    {
        var steps = 0;
        var list = Console.ReadLine().Split(' ').Select(x => int.Parse(x)).ToArray();

        bool swapped = false;
        do
        {
            swapped = false;
            for (var i = 0; i < list.Length - 1; i++)
            {
                steps++;
                var a = list[i];
                var b = list[i + 1];

                if (a > b)
                {
                    list[i] = b;
                    list[i + 1] = a;
                    swapped = true;
                }
            }
        } while (swapped);

        foreach (var x in list)
        {
            Console.WriteLine(x);
        }

        Console.WriteLine("steps: " + steps);
    }

}
steps: 9207

シェイカーソート

using System;
using System.Linq;

public class Program
{

    public static void Main(string[] args)
    {
        var steps = 0;
        var list = Console.ReadLine().Split(' ').Select(x => int.Parse(x)).ToArray();

        bool swapped = false;
        do
        {
            swapped = false;

            for (var i = 0; i < list.Length - 1; i++)
            {
                steps++;
                var a = list[i];
                var b = list[i + 1];

                if (a > b)
                {
                    list[i] = b;
                    list[i + 1] = a;
                    swapped = true;
                }
            }

            for (var i = list.Length - 1; i > 0; i--)
            {
                steps++;
                var a = list[i];
                var b = list[i - 1];

                if (a < b)
                {
                    list[i] = b;
                    list[i - 1] = a;
                    swapped = true;
                }
            }

        } while (swapped);

        foreach (var x in list)
        {
            Console.WriteLine(x);
        }

        Console.WriteLine("steps: " + steps);
    }

}
steps: 5346

ノームソート

using System;
using System.Linq;

public class Program
{

    public static void Main(string[] args)
    {
        var steps = 0;
        var list = Console.ReadLine().Split(' ').Select(x => int.Parse(x)).ToArray();

        for (int i = 0; i < list.Length - 1; i++)
        {
            do
            {
                steps++;
                var a = list[i];
                var b = list[i + 1];

                if (a > b)
                {
                    list[i] = b;
                    list[i + 1] = a;
                    i--;
                }
                else
                {
                    break;
                }
            } while (i != -1);
        }

        foreach (var x in list)
        {
            Console.WriteLine(x);
        }

        Console.WriteLine("steps: " + steps);
    }

}
steps: 5158

選択ソート

using System;
using System.Linq;

public class Program
{

    public static void Main(string[] args)
    {
        var steps = 0;
        var list = Console.ReadLine().Split(' ').Select(x => int.Parse(x)).ToArray();

        for (var i = 0; i < list.Length; i++)
        {
            var min = i;

            for (var j = i + 1; j < list.Length; j++)
            {
                steps++;
                if (list[min] > list[j])
                {
                    min = j;
                }
            }

            steps++;
            if (i != min)
            {
                var a = list[i];
                var b = list[min];

                list[i] = b;
                list[min] = a;
            }
        }

        foreach (var x in list)
        {
            Console.WriteLine(x);
        }

        Console.WriteLine("steps: " + steps);
    }

}
steps: 5050

C# で愚直にN-Queens問題

プログラミング学び直しシリーズ。Nクイーン問題 (8クイーン問題) をC# で愚直に解く。

using System.Collections.Generic;
using System.Linq;
using System;

class MainClass
{
    public static void Main(string[] args)
    {
        nQueen(
            int.Parse(Console.ReadLine())
        );
    }

    static void nQueen(int n)
    {
        var queens = new List<Queen>();
        for (int y = 0; y < n; y++)
        {
            for (int x = 0; x < n; x++)
            {
                if (check(queens, x, y))
                {
                    queens.Add(new Queen(x, y));
                    break;
                }
                else
                {
                    while (x == (n - 1) || y == (n - 1))
                    {
                        var q = queens.Last();
                        y = q.y;
                        x = q.x;
                        queens.Remove(q);
                    }
                }
            }
        }

        foreach (var q in queens)
        {
            Console.WriteLine(q);
        }
    }

    static bool check(List<Queen> queens, int x, int y)
    {
        foreach (var q in queens)
        {
            if (q.x == x || q.y == y || Math.Abs(x - q.x) == Math.Abs(y - q.y))
                return false;
        }
        return true;
    }

    class Queen
    {
        public int x { get; set; }
        public int y { get; set; }

        public Queen(int x, int y)
        {
            this.x = x;
            this.y = y;
        }

        public override string ToString()
        {
            return string.Format("x={0}, y={1}", x, y);
        }

    }

}

出力例。例えば8の場合:

x=2, y=0
x=4, y=1
x=1, y=2
x=7, y=3
x=5, y=4
x=3, y=5
x=6, y=6
x=0, y=7

C# で雑にFizzBuzz

プログラミング学び直しシリーズ。FizzBuzzをC#で愚直に書く。

class MainClass
{

    public static void Main(string[] args)
    {
        foreach (int i in Enumerable.Range(1, 100))
        {
            Console.WriteLine(fizzBuzz(i));
        }
    }

    static string fizzBuzz(int x)
    {
        StringBuilder b = new StringBuilder();

        if (fizz(x)) b.Append("Fizz");
        if (buzz(x)) b.Append("Buzz");
        if (b.Length == 0) b.Append(x);

        return b.ToString();
    }

    static bool fizz(int x)
    {
        return x % 3 == 0;
    }

    static bool buzz(int x)
    {
        return x % 5 == 0;
    }

}

ひと目見ただけで何が起きてるのか理解するのはこれくらいが良さそうだけど、もっとスマートな書き方をあとで考えてみよう。

「マスタリングTCP/IP 入門編 第5版」の読書感想文

プログラミング学び直し活動の一環として、「マスタリングTCP/IP 入門編 第5版」を読みました。

マスタリングTCP/IP 入門編 第5版

マスタリングTCP/IP 入門編 第5版

以下は読書感想文です

読むとよさそうな人

  • アプリケーションばかりでOSやインフラ等の層へ関与しない人
  • 雰囲気でプログラミングをしている人
  • プログラミングに興味のある人、学生

向いてる用途

  • コンピュータとネットワークの歴史を知る
  • プログラミングの考え方を鍛える (OSI参照モデルなど)
  • 中学 〜 高校講師が生徒向けのテキストとして採用する
  • ネットワークについて雰囲気を知る
  • 現代のアプリケーションについて大雑把にイメージする

向いてない / できないこと

  • Internet Protocolを書けるようになる
  • TCP/IPより上の層でプロトコルを書く

感想

広く浅くネットワークやそれに付随する概念を学ぶことができた。

コンピュータの歴史上にネットワーク、特にインターネットが必要不可欠であることが理解できる解説から始まり、アプリケーションばかり開発している自分は関与し得ない歴史的背景を知ることができた。
他者からインターネットの仕組みについて訊ねられた際に返答する分には十分な知識を得ることができる。が、これを読むことで実際にIPやその上位層のプロトコルを書けるようにはならない。あくまで大まかな雰囲気を知る、まさに "入門" にふさわしい本であろう。

また、いわゆる "パソコンの授業" を担当している講師はこれを元にカリキュラムを作ることができると感じた。自分も実際に担当している授業で取り入れようと思う。
挿絵や例えも多く、前提知識が少なく平易な言葉で書かれているため、初学者への教え方に困った際にも参考になるだろう。

TCP/IP全体像として各層のプロトコルが複雑に絡み合っているため致し方ないことではあるが、各章の内容を順々に読むだけでは少々理解しづらく、2週するなどして前後の内容を把握した状態で読み直すとより理解が深められるのではと感じた。

f:id:S64:20180405224506j:plain

昭島市長である臼井 伸介さまより献本いただきました。ありがとうございます。