TomoProgの技術書

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

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

Djangoを使って掲示板を作ってみる Part2

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

久しぶりのDjangoを使って掲示板を作ってみるシリーズを書いていこうと思います。

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

完成した・・・?

こんな風に考えていたんです。
とりあえず、作りながら切りが良いときにブログ書いていくか。

そんなことを思いながら手当たり次第に作っていったところ、

キリがいいところってどこだよ・・・。

となって結局ブログをほぼ更新しませんでした。

しかし、とりあえず動くものを作るという目標は達成せねば・・・

というわけで、とりあえず動くものを作ってみました。

PythonBoardというPython関連のことについて話し合える掲示板です。
http://ik1-326-23085.vs.sakura.ne.jp/PythonBoard

Python関連のことに限定していますが、この記事を見ていただいた方は是非トピック立ててみたり返信してみたり、適当に使ってみてください!!

まだ追加したい機能がいくつかあるので、その時は機能ごとにブログを書いていこうと思います。

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter

辞書型のKeyErrorを回避する

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

久しぶりにブログ書こうと思います。

今回はPythonの辞書型を使っていると遭遇するKeyErrorについて少し調べてみました。
それでは頑張っていきましょう。

辞書型って何?

KeyErrorの前にまずは辞書型について少し書いておきます。
辞書型とは任意のキーに対して値を持てる型のことです。
他の言語でハッシュマップや連想配列という言葉を聞いたことがある人はそれとほぼ同じ型だと思います。

辞書型を使う場合は波括弧を使って「'キー':'値'」の形で表現します。

#-*- coding:utf-8 -*-

def main():
    person_dict = {'name':'tomoprog', 'age':24, 'blood':'A'}
    print(person_dict['name'])
    print(person_dict['age'])
    print(person_dict['blood'])

if __name__ == "__main__":
    main()
実行結果:
tomoprog
24
A

person_dictという変数に辞書型を定義し、「変数名['Key']」で定義した辞書型の値にアクセスしています。
ちなみに辞書型の値は数値でも文字列でも構いません。

KeyErrorを出力してみる

それでは今回の本題に入っていきましょう。
まずはKeyErrorを実際に起こしてみます。

とは言っても引き起こすのは簡単で、存在しないキーで辞書にアクセスするだけです。
実際にKeyErrorを引き起こしたコードがコチラ

#-*- coding:utf-8 -*-

def main():
    d = {'name':'tomoprog', 'age':24, 'blood':'A'}
    print(d['name'])
    print(d['age'])
    print(d['blood'])
    print(d['height'])

if __name__ == "__main__":
    main()
実行結果:
tomoprog
24
A
Traceback (most recent call last):
  File "dict.py", line 11, in <module>
    main()
  File "dict.py", line 8, in main
    print(d['height'])
KeyError: 'height'

heightという存在しないキーで辞書にアクセスしたためKeyErrorが出力されています。

KeyErrorを回避する

KeyErrorが出力されると強制的にプログラムが終了してしまいます。
強制的に終了されては困る場合はこのKeyErrorを対処しないといけません。

対処する方法としては

  1. 辞書にキーが存在するかを確認してからアクセスする
  2. try-exceptを実装する

この2つの方法が考えられます。

実際に2つの方法で対処してみましょう。

辞書にキーが存在するかを確認してからアクセスする

キーを確認してからアクセスする場合はinまたはgetを使用します。
inを使う場合はもし、キーが辞書にあればというif文を書くことでKeyErrorを回避できます。

#-*- coding:utf-8 -*-

def main():
    d = {'name':'tomoprog', 'age':24, 'blood':'A'}

    if 'age' in d:
        print(d['age'])
    else:
        print("d do not have 'age' key")

    if 'height' in d:
        print(d['height'])
    else:
        print("d do not have 'height' key")

if __name__ == "__main__":
    main()
実行結果:
24
d do not have 'height' key

getを使う場合は辞書型.get()メソッドを使用します。
存在する場合は第1引数、存在しない場合は第2引数を返します。

#-*- coding:utf-8 -*-

def main():
    d = {'name':'tomoprog', 'age':24, 'blood':'A'}
    print(d.get('name', None))
    print(d.get('height', None))

if __name__ == "__main__":
    main()
実行結果:
tomoprog
None

どちらかと言えばgetを使うほうがif文が必要ない分綺麗に書けそうです。

try-exceptを実装する

try-exceptを使用する場合はKeyErrorが出力される部分をtryで囲み、exceptでKeyErrorを捕捉します。

#-*- coding:utf-8 -*-

def main():
    d = {'name':'tomoprog', 'age':24, 'blood':'A'}
    try:
        print(d['height'])
    except KeyError:
        print("KeyError Exception.")

if __name__ == "__main__":
    main()
実行結果:
KeyError Exception.

try-exceptが実装されることで、KeyErrorが出力されたときも強制終了することなく実行できます。

まとめ

今回は辞書型のKeyErrorの回避方法として、いくつか例を上げてみました。
個人的にはgetを使う方法が一番綺麗に簡潔に書けるので好きです。
KeyErrorで詰まった時は是非参考にしてみてください。

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter