TomoProgの技術書

底辺プログラマーが達人プログラマーになるまで

もう1年が経ちました

皆さん
こんにちは、こんばんは
90日以上更新がないと広告が出ることに驚いているTomoProgです。

気がつけば2016年が終わり、
2017年も1ヶ月が過ぎましたね。

このブログを始めたのが去年の1月30日。
もうあれから1年経ちました。

結局スタートはいい感じでしたが、
案の定、後半は失速し、最後の方はほぼ更新出来ませんでした。

ただ、あまり更新しなくなった今でも、毎日少しアクセスがあるようで、
こんな記事でも少しでも誰かの役に立っているのであれば嬉しいことです。

1年目の投稿は39記事。
2年目はこれを超えることを目標にしたいと思います。

底辺プログラマーが達人プログラマーになるまで。

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter

自動実装プロパティを読み取り専用にする方法

皆さん
こんにちは、こんばんは
TomoProgです。

気づけば2ヶ月以上更新してなかったですが、
久しぶりに更新していきましょう!

今回はC#のプロパティを読み取り専用にする方法が分かったので、
そのことを書いていこうと思います。

それでは頑張っていきましょう。

【重要】
今回紹介するやり方はC#6.0以前のバージョンでの使用方法です。
C#6.0から読み取り専用の自動実装プロパティを定義出来る構文が追加されています。

プロパティを使ってメンバーにアクセスする

C#にはクラスのメンバーにアクセスしたいとき、
プロパティを介してアクセスするということがよくあります。

public class Human
{
    /// <summary>名前</summary>
    private string _name;
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
        }
    }

    /// <summary>年齢</summary>
    private int _age;
    public int Age
    {
        get
        {
            return _age;
        }
        set
        {
            if(value > 99)
            {
                value = 99;
            }
            _age = value;
        }
    }
}
class MainClass
{
    public static void Main(string[] args)
    {
        Human h1 = new Human();
        h1.Name = "Yamada";
        h1.Age = 22;

        Human h2 = new Human();
        h2.Name = "Sato";
        h2.Age = 100;

        Console.WriteLine("h1.Name:{0} h1.Age:{1}", h1.Name, h1.Age);
        Console.WriteLine("h2.Name:{0} h2.Age:{1}", h2.Name, h2.Age);
    }
}
実行結果:
h1.Name:Yamada h1.Age:22
h2.Name:Sato h2.Age:99

プロパティである「Name」と「Age」を介してprivate変数へアクセスしています。

プロパティを使うメリットは
値に応じて処理を記述できる
ということです。

今回はAgeプロパティに99より大きい値を入れられた場合は
99に補正するようにsetを定義しています。

このようにget、setの中に処理を記述することで
整合性チェックなどの処理を逐次書かなくても
クラスを安全に使用することができます。

自動実装プロパティを使う

get、setの中に処理を記述するのであればこの書き方は良いのですが、
Nameプロパティのように値を取得、設定するだけの場合は
いちいちget、setを書くのは正直面倒です。

そんなときは自動実装プロパティを使用すると簡単に書くことが出来ます。

/// <summary>
/// 人間クラス
/// </summary>
public class Human
{
    /// <summary>名前/summary>
    public string Name { get; set; }
    
    /// <summary>年齢</summary>
    private int _age;
    public int Age
    {
        get
        {
            return _age;
        }
        set
        {
            if(value > 99)
            {
                value = 99;
            }
            _age = value;
        }
    }
}

変更された点はNameのプロパティ定義です。
private変数の記述が不要になり、
Nameプロパティだけで先程の例と同じように使用することが出来ます。
(実際には自動的にprivateのメンバーが生成されているらしいですが、そのあたりは今回は触れません。)

自動実装プロパティで読み取り専用にしたい

さて、自動実装プロパティの使い方も分かったところでようやく今回の本題です。

例えばこのクラスに血液型を追加で持たせたとします。

名前や年齢は変わるものですが、血液型は変わらないので、
変更出来ないように読み取り専用にしておきたいです。

というわけで、getだけを持つ血液型プロパティを記述してみたいと思います。

/// <summary>
/// 人間クラス
/// </summary>
public class Human
{
    /// <summary>名前</summary>
    public string Name { get; set; }
    
    /// <summary>血液型</summary>
    public string Blood { get; }
    
    /// <summary>年齢</summary>
    private int _age;
    public int Age
    {
        get
        {
            return _age;
        }
        set
        {
            if(value > 99)
            {
                value = 99;
            }
            _age = value;
        }
    }

    /// <summary>
    /// コンストラクタ
    /// </summary>
    public Human(string name, int age, string blood)
    {
        Name = name;
        Age = age;
        Blood = blood;
    }
}

こんな感じで血液型プロパティを追記しました。

ついでに人間クラスを作るときに名前、年齢、血液型を
指定できるようにコンストラクタを記述したので、
それに応じてメインクラスも書き換えます。

class MainClass
{
    public static void Main(string[] args)
    {
        Human h1 = new Human("Yamada", 22, "A");
        Human h2 = new Human("Sato", 100, "B");

        Console.WriteLine("h1.Name:{0} h1.Age:{1} h1.Blood:{2}", h1.Name, h1.Age, h1.Blood);
        Console.WriteLine("h2.Name:{0} h2.Age:{1} h2.Blood:{2}", h2.Name, h2.Age, h2.Blood);
    }
}

これで血液型はクラス作成時から変更できない
読み取り専用のプロパティとして定義出来たはず。

しかし、コンパイルしてみると、
Bloodプロパティは読み取り専用なので
クラス内でも代入できないと言われてしまいます。

実はBloodプロパティを以下のように変更するだけで
簡単に読み取り専用に出来てしまいます。

/// <summary>血液型</summary>
public string Blood { get; private set; }

これで実際に実行すると

h1.Name:Yamada h1.Age:22 h1.Blood:A
h2.Name:Sato h2.Age:100 h2.Blood:B

実行結果が表示されました。

メインクラス内でBloodプロパティに設定しようと
以下のようなコードを記述すると、

class MainClass
{
    public static void Main(string[] args)
    {
        Human h1 = new Human("Yamada", 22, "A");
        h1.Blood = "B";
    }
}

コンパイル時にsetアクセサーにアクセスできないと言われるため、
メインクラスからの設定は出来なくなります。

これで自動実装プロパティを読み取り専用にすることが出来ました!!

まとめ

自動実装プロパティは
public <型> <プロパティ名> { get; private set; }
で読み取り専用に出来る。

今回は自動実装プロパティを読み取り専用にする方法を書いていきました。
アクセスレベルを制限することで、安全にクラスを使っていきましょう。

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter

Listから条件に適応するものだけを抽出したい

皆さん
こんにちは、こんばんは
TomoProgです。

気がつけば2ヶ月ほどブログ更新していなかった!!
まぁいつもどおりあまり気にせず、ゆるく更新していきたいと思います。

今回はC#にて、List型から条件に適応するものを抽出するにはどうしたらいいのだろう?
ということで調べてみました。

それでは頑張っていきましょう。

素直にすべて走査して抽出する

Listの中身をすべて走査して、条件に合うものを抽出していきます。

using System;
using System.Collections.Generic;

namespace console
{
    class Student
    {
        public string name { get; }
        public int score { get; }
        public Student(string name, int score)
        {
            this.name = name;
            this.score = score;
        }
    }

    class MainClass
    {
        public static void Main(string[] args)
        {
            List<Student> studentList = new List<Student>();

            // リストに生徒を追加
            studentList.Add(new Student("Tanaka", 60));
            studentList.Add(new Student("Sato", 70));
            studentList.Add(new Student("Aoki", 60));

            // 70点未満の生徒のリストを作成
            List<Student> selectedList = new List<Student>();
            foreach (Student s in studentList)
            {
                if (s.score < 70)
                {
                    selectedList.Add(s);
                }
            }

            // 作成したリストの内容を出力
            foreach (Student s in selectedList)
            {
                Console.WriteLine("Name:{0} Score:{1}"
                  , s.name, s.score);
            }
        }
    }
}
実行結果:
Name:Tanaka Score:60
Name:Aoki Score:60

この方法だと、どのプログラミング言語でも出来そうですが、
せっかくC#を使っているので、C#っぽい書き方をしてみます。

Linqを使って抽出する

Listから条件に適応するものだけを抽出する際は、
LinqというC#独自の技術を使うと
先ほど書いたプログラムよりも圧倒的にキレイに書くことが出来ます。

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

namespace console
{
    class Student
    {
        public string name { get; }
        public int score { get; }
        public Student(string name, int score)
        {
            this.name = name;
            this.score = score;
        }
    }

    class MainClass
    {
        public static void Main(string[] args)
        {
            List<Student> studentList = new List<Student>();

            // リストに生徒を追加
            studentList.Add(new Student("Tanaka", 60));
            studentList.Add(new Student("Sato", 70));
            studentList.Add(new Student("Aoki", 60));

            // 70点未満の生徒のリストを作成
            var selectedList = from x in studentList
                               where x.score < 70
                               select x;

            // 作成したリストの内容を出力
            foreach (Student s in selectedList)
            {
                Console.WriteLine("Name:{0} Score:{1}"
                  , s.name, s.score);
            }
        }
    }
}
実行結果:
Name:Tanaka Score:60
Name:Aoki Score:60

70点未満の生徒のリストを作成するところが先ほどのプログラムと違うことがわかると思います。

Linqを使えばSQL文を発行するようにList型から条件に適応するものだけを抽出することが出来ます。

何事にも慣れは必要だと思いますが、
C#を使うのであればLinqを使って書いたほうが綺麗ですね。

Linqについて詳しく知りたい場合はこちらのサイトが良いと思います。
ufcpp.net

まとめ

今日はListから条件に適応するものだけを抽出するということで、
2つの方法を紹介しました。

どちらの方法でも結果は同じですが、
Linqを使った方が綺麗にコードが書けて可読性も高まると感じました。
C#使うときは積極的に使っていこうと思います。

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter

C#で見たことが無い型に遭遇した

皆さん
こんにちは、こんばんは
TomoProgです。

気がつけばもうすぐ6月も終わりですね。
今年も半分が過ぎようとしていると思うと早いものです。

最近ブログは週一ぐらいが自分のペースに合ってるなと思ってきました。
ですので、それぐらいのペースで更新していけたらなと思います。

それはさておき、
今回はC#で見たことの無い型を見つけたので、そのことについて書いていこうと思います。

それでは頑張っていきましょう。

戻り値の型がint?ってどういうこと!?

Xamarinを勉強するためにC#で書かれたサンプルコードを眺めていると以下の様なコードに遭遇しました。

static readonly string[] digits = {
    "ABC", "DEF", "GHI", "JKL", "MNO", "PQRS", "TUV", "WXYZ"
};

static int? TranslateToNumber(char c)
{
    for (int i = 0; i < digits.Length; i++)
    {
        if (digits[i].Contains(c))
            return 2 + i;
    }
    return null;
}

なんじゃこりゃ!?
戻り値の型がint?ってどういうこと!?
と心の中で叫んだ私はとりあえず調べてみることにしました。

?を付けるとnullを許容できる

調べてみると以下のサイトに辿り着きました。
メモ帳: [C#] int?

なるほど。
?を付けるとその型の範囲値だけでなくnullを許容できるようになるらしいです。

int?型を使ってみる

本当にnullを許容できるようになるのか実際にコードを書いてみます。

using System;

namespace console
{
    class MainClass
    {
        public static void Main (string [] args)
        {
            int val = null;
            if(val == null)
            {
                Console.WriteLine("val is null");
            }
            else
            {
                Console.WriteLine("val is {0}", val);
            }
        }
    }
}

valがnullであれば"val is null"が表示されるはずですが、
コンパイルしてみると・・・

Error CS0037: Cannot convert null to `int' because it is a value type

nullからint型へ変換できないと言われてしまいました。

次にintに?を付けてみます。

using System;

namespace console
{
    class MainClass
    {
        public static void Main (string [] args)
        {
            int? val = null;
            if(val == null)
            {
                Console.WriteLine("val is null");
            }
            else
            {
                Console.WriteLine("val is {0}", val);
            }
        }
    }
}

これを実行すると、

val is null

nullを変数に入れる事ができ、正しく表示出来るようになりました!!

int?型を関数の戻り値として使ってみる

関数の戻り値でもint?型を使ってみたいと思います。

using System;

namespace console
{
    class MainClass
    {
        public static void Main (string [] args)
        {
            string str = string.Empty;
            char c = 'z';
            str = "123456abcdef";

            int? index = SearchIndex(str, c);
            if(index == null)
            {
                Console.WriteLine("'{0}' is not found", c);
            }
            else
            {
                Console.WriteLine("Index of '{0}' is {1}", c, index);
            }
        }

        private static int? SearchIndex(string str, char target_chara)
        {
            for (int i = 0; i < str.Length; i++)
            {
                if (str[i] == target_chara)
                {
                    return i;
                }
            }
            return null;
        }
    }
}
実行結果:
'z' is not found

文字列の中に対象文字が存在する場合はその位置を、存在しない場合はnullを返す関数を定義しています。
int?型を戻り値に指定することで、戻り値にnullを指定することが出来ました!!

まとめ

  • int型に?を付けるとintの範囲値だけでなく、nullも許容できるようになる

intだけでなくdouble、float、char、boolなどに使用出来るみたいです。
初めて見た型だったので少しビビりましたが、nullが使えるようになると覚えておけばとりあえず大丈夫だと思ってます。

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter

Azureを使ったXamarin.FormsアプリをiPhoneにインストールしてみた Part2

皆さん
こんにちは、こんばんは
TomoProgです。

Azureを使ったXamarin.FormsアプリをiPhoneにインストールしてみたPart2です。

前回でアプリのダウンロードまで終わったので、今回は実際に実機にインストールしてみたいと思います。

それでは頑張っていきましょう。

ダウンロードしたアプリをXamarin Studioで開く

Downloadボタンを押してアプリをダウンロードしたら、フォルダを開き、ソリューションファイル(.sln)をクリックします。f:id:TomoProg:20160622222154j:plain

ソリューションファイルを開くと自動的にXamarin Studioが開きます。
iPhoneをPCと接続し、左上のDebugモード、Releaseモードを選べるところからRelease | iPhoneを選択します。
選択したらその横にある実行ボタンを押します。
f:id:TomoProg:20160622224347j:plain

ビルドに失敗する・・・

実機で動かす時が来たと言いたいところですが、実はこのまま実行すると・・・
f:id:TomoProg:20160622225907j:plain

Error: No installed provisioning profiles match the installed iOS signing identities.
プロビジョニングプロファイルがインストールされていないというエラーが表示され、実機にインストールが出来ません。

私自身iPhoneアプリに詳しくは無いので、プロビジョニングファイルの詳しい説明は出来ませんが、検索したところアプリケーションのメタ情報や作成者の署名などを書いておくファイルらしいです。

というわけで、プロビジョニングファイルを作成していきます。

プロビジョニングファイルを作成する

プロビジョニングファイルを作成するにはXcodeを使います。
Xcodeを開いたらFile->New->Projectを選択し、新しいプロジェクトを作成します。
プロジェクトはiOS用のプロジェクトであればおそらく何でも構いません。
適当にプロジェクトを作成したら、Bundle Identifierに書かれている内容を確認します。
f:id:TomoProg:20160622234843j:plain

次にXamarin Studioに戻り、Info.plistを開きます。
Info.plistのBundle Identifierを先ほどXcodeで確認したBundle Identifierに書き換えます。
f:id:TomoProg:20160622235515j:plain

これで実機にインストールする環境が整いました!!

実機でアプリを使ってみる

インストールする準備が出来たので、早速実行してみます。
実行すると接続しているiPhoneにインストールされます。
f:id:TomoProg:20160623001450j:plain

アプリを開くとToDoリストアプリが開きます。
f:id:TomoProg:20160623001813j:plain

実際に何かToDoリストに登録してみます。
Item nameにやることを入力して横の「+」ボタンを押すと登録出来ます。
f:id:TomoProg:20160623001952j:plain

AzureでToDoリストのテーブル内容を確認する

登録が出来たので、Azureからテーブルを見てみようと思います。
Azureにログインし、
App Service->作成したアプリ名->設定->Easy Table->TodoItem
を選択します。
選択すると先ほど登録したToDoリストが登録されていることが確認できます。
f:id:TomoProg:20160623003403j:plain

まとめ

今回は2回に分けてAzureを使ったXamarin.FormsアプリをiPhoneにインストールしてみました。
Azureを使うことでバックエンドをほぼ意識せず構築出来ました。
Xamarinを使うときはAzureの選択はありだと思います。

Azureの使い方も少し分かったところで、これからは自作アプリ作りに励もうと思います。

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter

Azureを使ったXamarin.FormsアプリをiPhoneにインストールしてみた Part1

皆さん
こんにちは、こんばんは
TomoProgです。

Microsoft Azureと連携したXamarin.FormsアプリをiPhoneにインストールすることに成功したので、インストールまでの道のりを何回かに分けて書いていこうと思います。

Visual Studioを使っている人には申し訳ないですが、私がMacユーザーなので、Xamarin Studioを使うことを前提で書きます。

それでは頑張っていきましょう。

Xamarin Studioをインストールしよう

さてインストールのやり方は・・・
と言いたいところですが、ぶっちゃけますとほとんど覚えていません。笑

Microsoftエバンジェリストのちょまどさんのブログに超詳しく書いてあるので、ここを参考にすると良いと思います。
https://blogs.msdn.microsoft.com/chomado/xamarin/getting-started-xamarin-on-mac-for-free/blogs.msdn.microsoft.com
というわけで、
Xamarin Studioのインストールはちょまどさんに任せて次に進みましょう。笑

Microsoft Azureのアカウントを作成しよう

次にAzureのサービスを利用するためにAzureのアカウントを作成します。
アカウント作成にはクレジットカードが必要なので、準備しておきましょう。
azure.microsoft.com

Azureは本来は課金制ですが、無料で使える期間があるので、今回はそれを利用します。
Azureについて詳しく知りたい人はGoogle先生に聞いてみてください。

Microsoft Azureでモバイルアプリを作ろう

さてここまでかなり端折りましたがアプリ開発に入っていきましょう!!
まずは作ったAzureアカウントでAzureにログインします。

ログインしたら新規->Web + モバイル -> Mobile Appからモバイルアプリを作成します。
f:id:TomoProg:20160616224906j:plain
アプリ名は世界で唯一の名前にしないと設定できません。
リソースグループはとりあえずアプリと同じ名前に設定しておきました。
App Service プランは無料のものを選択しています。

作成すると自動でデプロイされるのでデプロイが完了するまで少し待ちます。
デプロイが完了するとこんな感じでメッセージが表示されます。
f:id:TomoProg:20160616225943j:plain

次にApp Service->自分が作成したアプリ名->設定->クイックスタートを選択します。
クイックスタートの検索バーでXamarinを検索し、Xamarin.Formsを選択します。
f:id:TomoProg:20160616230745j:plain

Xamarin.Formsを選択したらまずはデータベースを作成します。
Data Connections->Add data connection->データベース
から新しいデータベースを作成します。
データベースが作成出来たら、Data Connectionが出来るまでしばし待ちましょう。
f:id:TomoProg:20160616233505j:plain

Data Connectionが出来たらCreate a table APIチェックボックスにチェックを入れ、Create TodoItem tableのボタンを押します。
TodoItemテーブルが完成したら、Downloadボタンからアプリをダウンロードします。
f:id:TomoProg:20160616234421j:plain

ここまででAzure側の設定はすべて終了です。
と同時に今日はここまでにしておきます。

次はXamarin Studioでのビルドから実機にインストールするまでを書いていこうと思います。

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter

Xamarin使ってスマホアプリ開発をやってみようと思う Part0

皆さん
こんにちは、こんばんは
TomoProgです。

気がつけば5月が終わってしまいました。
時が経つのは本当に早いですね。

5月は何を作っていたのか振り返るとDjango掲示板を作成してましたね。

とりあえず、動くものを目指して作ったところ今回は挫折せずに動くものを作ることが出来ました。
PythonBoardという簡単な掲示板です。

http://ik1-326-23085.vs.sakura.ne.jp/PythonBoard/

まだまだ実装していない機能もありますが、次にやりたいことが出てきたので、そっちに移ろうと思います。

次にやりたいことって何よ?
それは・・・

Xamarinを使ったスマホアプリ開発!!

最近Microsoftで話題のちょまどさんの影響でXamarinを使ったアプリ開発をやってみたいと思いました。
twitter.com

こんなアプリ作りたいなという構想はあるので、それを実現できるようなアプリを作っていこうと思います。

今日から頑張っていこう!!

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter