CentOS7にpipをインストールする方法

#はじめに

Djangoでデモサイトを作成することを目的にして、仮装OS上にCentOSをたてたのが先日….

 

それから今日まで…

全く起動させず(ノω・`。)

 

ということで、今日はちょっとイジイジしたいと思って起動させて開発環境を整えることに。

 

CentOS7にはデフォルトでPython2.7.5が入っていたのですが、pipはインストールされていなかったので今回入れてみました!

(※pipの公式サイトによると、Python2.7.9以降、Python3.4以降ではデフォルトパックにすでにpipが入っているみたいです。)

Sponsored Link






# pipインストール方法

 

では、本題のpipインストール方法です。

注:2017年05月27日時点での情報です。

 

まず、wgetコマンドを使って次のように”get-pip.py”をダウンロードします。

wget https://bootstrap.pypa.io/get-pip.py

(wgetコマンドについては「Linuxコマンド集 – 【 wget 】 ファイルをダウンロードする:ITpro」をご参照ください。)

 

さて、これで”get-pip.py”が手に入ったので、あとはこれを実行するだけです。ただし、気をつけないといけないのは管理者権限のあるところにファイルを展開するのでsudoコマンドで下記のように実行します。

sudo python get-pip.py

 

これで通常は問題なくインストールが完了できます。


ちなみに、”get-pip.py”のオプションも準備されているみたいです。詳細はpipの公式サイトをご覧ください。


MY SNS ACCOUNT

Instagram :  @programer_fumi

Twitter: @PROVINSITE

Twitter:@FumiProgrammer

もしよければフォローとイイネしてください♪

喜びます(〃艸〃)←

Sponsored Link





Swiftをもう一度勉強してみた#2

# はじめに

はい、タイトル通り「Swiftをもう一度勉強してみた」ということで、

昔はちょこっとだけ書いていたSwiftをもう一度書いて

iOSやOS X向けのアプリを趣味で作成しようと思って勉強します!

これは、その記録。

勉強にはSwiftの公式Document『The Swift Programming Language』を利用します。

現在2017年5月17日、Swift3.1の情報です。

(前回の記事を書いてからすぐに記事を書き始めたのですが、時間がなかったり、意外と量が多くてまだ書ききっていないところがあります。ご了承ください。 [Date:2017.05.17] )

 

# 今回のテーマ

さて、今回のテーマはまず「フローの制御」です!

SPONSORED LINK




# フローの制御に関して

さて、フローの制御をするには次のような方法があります。

条件分岐 if文, switch文
ループ処理 for-in文, for文, while文, repeat-while文

丸括弧()内は、条件分岐やループ文の条件式を記述する部分で使用します。
また、鉤括弧{}内には、条件を満たした時の処理内容を記述します。

では、例をとって使い方を確認しましょう。

例題
生徒5人のテストのスコアから平均点を導く。また、最高得点と最低得点をそれぞれ求めよ。

/* 5人の生徒の点数 */
let test_scores = [98, 60, 72, 45, 85]

/* 平均点を格納する変数 */
var average = 0

/* 最高得点を格納する変数 */
var max_score = test_scores[0]

/* 最低得点を格納する変数 */
var min_score = test_scores[0]

/* 点数を格納しているリストから順にデータを取り出す */
for score in test_scores{

    /* 点数の加算 */
    average += score

    /* 前回までの最高得点より今回取得したスコアが高いかどうか */
    if(max_score < score){
        max_score = score
    }

    /* 前回までの最低得点より今回取得したスコアが低いかどうか */
    if(min_score > score){
        min_score = score
    }
}


/* 結果の出力 */
print("平均点は\(Double(average)/Double(5))点でした。")
print("最高得点は\(max_score)点でした。")
print("最低得点は\(min_score)点でした。")

 

上記の例は平均点を浮動小数点の形で表現したかったので出力のところでDouble型に型変換を行って割り算を行っています。

今回は5人というのが明白だったので、5人と明記しましたが、人数が分からない時は、配列の中の要素数を教えてくれるcountを使うと人数が変化しても対応可能です。今回は、そこがメインではないので書きませんが。

(参考:Swiftで配列の要素数(Count)を取得する方法


# if文

C/C++では以下のように書けるのが、

int value = 10;

if (value) {
     printf("OK\n");
}

Swiftでは次のように書くと怒られます。

var score = 10
if (score) {
    print("OK")
}

エラーとしては次のように書かれていました。

error: 'Int' is not convertible to 'Bool'
if (score) {
   ~^~~~~~

エラー内容としては、Int型はBool型に変換できないという意味ですが、これはif文の条件式として、scoreが暗黙的に0かどうかを比較することはしないということを示しているとのことです。


また、if文にlet を使うとミスを防ぐことができます。型の宣言をする際にクエッションマーク(?)をその値のオプションとして後ろにつけることでnil (空の状態)を検知することができるようになります。以下がその例です。

var optional_string:String? = "Stree"

/* "Stree"が入っているのでfalseと表示される */
print(optional_string==nil)

var optional_name:String? = "World"
var greeting = "Hello!"

/* optional_nameがnilか判定し、nilでなければoptional_nameのnameに値が代入される */
if let name = optional_name{
    greeting = "Hello, \(name)"
}

/* optional_nameを空(nil)にする */
optional_name = nil

/* optional_nameがnilか判定 */
if let name = optional_name{

    /* optional_nameはnilになったので、ここは呼ばれない */
    greeting = "Hello, \(name)"

}else if let name = optional_string{

    /* optional_stringはnilではないので、ここは呼ばれる */
    greeting = "Hello, \(name)"

}

 

また、クエッションマークを2つ(??)使うことで、次のように書くこともできるみたいです。

let nick_name:String? = nil
let full_name:String = "Sam"
let informal_greeting = "Hi \(nick_name ?? full_name)"
print(informal_greeting)

この出力結果は次のようになります。

Hi Sam

ちゃんと、nick_nameが空であることを感知して、full_nameの方を出力してくれます!

これは便利だなぁ。


# switch文

“Switches support any kind of data and a wide variety of comparison operations—they aren’t limited to integers and tests for equality.”

抜粋:: Apple Inc. “The Swift Programming Language (Swift 3.1)”.

これを読むと、SwiftのSwitch文はあらゆる種類のデータとさまざまな比較操作をサポートしているみたいです。(ちなみに、C/C++ではSwitch文は整数値しか扱えない。)

let vegetable = "red pepper"
switch vegetable {
case "celery":
    print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":
    print("That would make a good tea sandwich.")
case let x where x.hasSuffix("pepper"):
    print("Is it a spicy \(x)?")
default:
    print("Everything tastes good in soup.")
}

このプログラムは「The Swift Programming Language (Swift 3.1)」に書かれているサンプルコードなのです。このコードの結果は次のようになります。

Is it a spicy red pepper?

この文の該当箇所は下記の部分です。

case let x where x.hasSuffix("pepper"):
    print("Is it a spicy \(x)?")

ここで、hasSuffixという関数が登場していますが、これは文字列の後方比較を行う関数です。本関数については参考サイトを以下に示しますのでそちらをご覧ください。

ちなみに、このhasSuffixという関数はObjective-Cの頃からある関数みたいです。

(参考:NSString – iPhoneアプリ開発の虎の巻)

※このサイト(NSString – iPhoneアプリ開発の虎の巻)は昔iPhoneアプリを開発していた時に、よくお世話になっていました…懐かしい。

 

さて、switchの話題に戻ります。Swiftのswitch文の概要が説明されているところにAppleからこんな一文が書かれています。

“Try removing the default case. What error do you get?”

抜粋:: Apple Inc. “The Swift Programming Language (Swift 3.1)”。

(意訳)「defaultのケースを削除してみろ。さぁ、どういうエラーが出力された?」

なんだこのノリは…これがAppleの余裕か( #゚д゚)!!

っと変なツッコミを頭の中で想像しながら

defaultケースをコメントアウトした結果がこちら。

Switch must be exhaustive, consider adding a default clause

…はぁ、そうですか( ´・д・)
網羅性ねぇ。でも、default不要な時もあるしなぁ…。
いまいち、このメリットが見えないなぁ…。

っと思ったのですが、ちょっとこのエラー内容でGoogle先生に聞いたら、この網羅性のありがたさが書いてある記事がすぐに見つかりました!それがこちら↓
Swiftの列挙型、switch文、網羅性チェックが素晴らしい!

上記の記事ではenumを使った時に、要素を網羅できていなかった時それを知る手段として活用できるんだ!素晴らしい!っという旨味を説明してくれていました。

(旨味を少しでも知りたければ上記のサイトの記事を読むと分かると思います。)

 

ただ、網羅したくない時にも怒られるのはちょっとなぁっと思います…

まぁ、仕様だから仕方ないのですが。そういうならif文で書けよ、もしくはクラスでそうゆう機能を持たせればいいだろうっと言われそう。

 


# for-in文

(今後時間がある時に書き足します!)


# while文

(今後時間がある時に書き足します!)

 

【改定履歴】


【追記】


MY SNS ACCOUNT

Instagram :  @programer_fumi

Twitter: @PROVINSITE

Twitter:@FumiProgrammer

もしよければフォローとイイネしてください♪

喜びます(〃艸〃)←

SPONSORED LINK



Swiftをもう一度勉強してみた#1

# はじめに

はい、タイトル通り「Swiftをもう一度勉強してみた」ということで、

昔はちょこっとだけ書いていたSwiftをもう一度書いて

iOSやOS X向けのアプリを趣味で作成しようと思って勉強します!

これは、その記録。

勉強にはSwiftの公式Document『The Swift Programming Language』を利用します。

現在2017年4月15日、Swift3.1の情報です。。

 

# 今回のテーマ

さて、今回のテーマはまず「値に関して」です!

Swiftの変数などについて勉強します。

 

# 値に関して

さてさて、SwiftのDocumentを読んでていると、二つのキーワードが出てきます。それは“let”“var”です。

Documentでは次のように説明されています。

“Use let to make a constant and var to make a variable. ”

抜粋:: Apple Inc. “The Swift Programming Language (Swift 3.1)”。 iBooks

まぁ、読んでもらえればわかるのですが、簡単にいうと、

“let”は一度入れたら中身を変更できない入れ物。

“var”は何度でも中身を変更できる入れ物。

ということです。まぁ、“let”はC++でいうと“const”がついた変数であるという感じです。

なので、この二つの入れ物(以下、コンテナと呼びます)の違いを見てみましょう。


# var

まずは“var”

// var
var str_var = "Hello, World!"
print(str_var)
str_var = "Hello, Var"
print(str_var)

これをコンパイルして、ビルドした結果は次の通りです。

> Hello, World!
> Hello, Var!

ちゃんと書き換わっていますね。

# let

次に“let”

// let
let str_let = "Hello, World!"
print(str_let)
str_let = "Hello, Var"
print(str_let)

これをコンパイルしようとすると、

Swift Compiler Error Group
    Cannot assign to value: 'str_let' is a 'let' constant
        Change 'let' to 'var' to make it mutable

はい、コンパイルエラーです。意味としては、「“let”なんで入れられませんよ。入れたいなら“var”に変換してね。」


次に、コンテナの型を決定して宣言する方法。

ここでは例を示していきます。

 

# Double

Double型で定義しようとするには次のようにします。

var value_double1 = 10.0
var value_double2:Double = 10.0
var value_double3:Double = 10

上記どれでも問題なくDouble型になります。

 

# Integer

Integer型で定義しようとするには次のようにします。

var value_int1 = 10
var value_int2:Int = 10

ちなみに、

var value_int3:Int = 10.0

はDouble型をInt型に入れようとしていることになり、コンパイルエラーとなります。勝手なキャストはしてくれません。 (C++の感覚でキャストというワードを使っていました。Swiftのキャストでは概念が違うという指摘を頂いただきました。)

ですので、次のような式も許してくれません。

var value_int1 = 10
var value_double1 = 10.0

var result:Int = value_int1 + value_double1 // コンパイルエラー

ですので、上記例は以下のようにします。

var value_int1 = 10
var value_double1 = 10.0

var result:Int = value_int1 + Int(value_double1)

かなり厳格ですね。

 

# String

さて、次に文字列型。

let label = "This year is "
let width = 2017
let width_label = label + String(width)
print(width_label)

まず、文字列型はダブルクォーテーション(“)で囲む必要があります。

注意しないといけないところは、シングルクォーテーション(‘)は、文字列型を表す記号ではないのでコンパイルエラーになります。違う型を文字列型にするには、明示的にキャストします。(C++の感覚でキャストというワードを使っていました。Swiftのキャストでは概念が違うという指摘を頂いただきました。)そして、文字列型を繋ぐには他の言語同様 (+)演算子 を使います。

 

その他に、文字列の間に数値もしくは文字列を入れたい場合は次のように、バックスラッシュ(\)を書き、丸括弧内に数値もしくは文字列またはそれらを格納しているコンテナを入れることもできます。

let apples = 3
let oranges = 5
let apple_summary = "I have \(apples) apples."
let orange_summary = "I have \(oranges) apples."
let fruit_summary = "Oh, I have \(apples + oranges) pieses of fruits."
print(apple_summary)
print(orange_summary)
print(fruit_summary)

 


さて、次は配列型(array)と辞書型(dictionary)についてです。

“Create arrays and dictionaries using brackets ([]), and access their elements by writing the index or key in brackets. ”

抜粋:: Apple Inc. “The Swift Programming Language (Swift 3.1)”。 iBooks

上の抜粋内容からわかるように、角括弧([])を利用して表現します。

# Arrays

まずは、配列から。

 

空の配列型(文字列を持つ配列)を作りたい場合は次のように書きます。

var list = [String]()

 

角括弧内に書いてある型が配列内に入れる型を示します。そのため、整数型の配列を作りたい場合は次のようにします。

var list = [Int]()

 

そして、いろんな型のものを許容した配列は次のように書きます。

var list = [Any]()

 

次に、りんご、バナナ、メロンという文字列を持つ配列を作りたい場合は次のように書きます。

var fruits = ["りんご", "バナナ", "メロン"]

上記の配列で一番目の「りんご」から「みかん」 に変えるには次のようにします。

var fruits = ["りんご", "バナナ", "メロン"]
fruits[0] = "みかん"
print(fruits)

この出力結果は、

["みかん", "バナナ", "メロン"]

となります。

 

そして、上記の配列を空の配列にするには次のようにします。

var fruits = ["りんご", "バナナ", "メロン"]
fruits[0] = "みかん"
fruits = []
print(fruits)

この出力結果は、

[]

となります。

 

※これ以上の詳しい内容は別途「配列」というテーマで書きたいと思います。

 

# Dictionary

 

まず、空の辞書(キー:String型、値:Float型)はこのように書きます。

let dictionary = [String:Float]()

 

辞書型はキーがとても重要なので、キーに対しては“Any”を使えませんが、値に対しては次のように使うことができます。

let dictionary = [Int:Any]()

 

次に、授業が月曜日は数学、火曜日は英語という辞書を作ります。それが次。

var 授業 = [
    "月曜日":"数学",
    "火曜日":"英語"
]

ちなみに、コンテナの名前には全角文字列も使用できるので、上記のように書いても問題ありません。

 

上記の月曜日を理科に変更するには次のようにします。

var 授業 = [
    "月曜日":"数学",
    "火曜日":"英語"
]
授業["月曜日"] = "理科"

 

※こちらも詳しい内容は別途「辞書」というテーマで書きたいと思います。

 

 

さて、今日はこのくらいで。でも、う〜ん。真面目にブログにこうゆう内容を残していると時間が取られて仕方がないので、どうにかいい方法を考えなければ。


【改定履歴】

2017.04.16

指摘して頂いた「キャスト」というワードに、打ち消し線を引きました。

日常では、私はC++もしくはPythonを良く書いているため、

Swiftの概念とは書いてしまうことがあると思いますので、

今回のように指摘して頂けるとすごくありがたいです!

2017.04.15

コメントで指摘していただいた「var」が「val」になっている箇所の修正を行いました。

ご指摘して頂きありがとうございました!


【追記】

2017.04.15

「明示的なキャスト」という言葉についてQiitaで質問を頂きました。

 


MY SNS ACCOUNT

Instagram :  @programer_fumi

Twitter: @PROVINSITE

Twitter:@FumiProgrammer

もしよければフォローとイイネしてください♪

喜びます(〃艸〃)←

Sponsored Link





Stateパターン

現在開発しているプログラムで、
モードによって使用できる機能を分割したいと考えていた時に、
デザインパターンで何かいいのないかなぁっと思って調べた時に出会ったのがこちらの「Stateパターン」でした(∩∀`*)

今回はこの「Stateパターン」について説明を…しません(笑)

その代わりに、私が参考とした記事を紹介します。
その記事がこちら↓

「State パターン | TECHSCORE(テックスコア)」
そして、

上記の記事はJavaで書かれているのですが、それをC++で実装し直したというのが今回の話です(笑)

どういう内容の話をコーディングしているかは、上記の記事でご確認ください。

まず、これがユーザが呼び出す上位レイヤーの「StatePatternYumichan」クラス。

※由実ちゃんというのは上記のサイトから受け継いでいるだけで、なぜ由実ちゃんなのかは知りません。

// StatePatternYumichan.h

#pragma once

#include <memory.h>

#include "OrdinaryState.h"
#include "BadMoodState.h"

class StatePatternYumichan {
public:
    StatePatternYumichan();
    /*
    *********************************************
    * Function
    **********************************************
    */

public:
    /*!
    * @brief 朝の挨拶を返す
    * @retuen 朝の挨拶
    */
    std::string morning_greet();

    /*!
    * @brief 防寒対策を返す
    * @retuen 防寒対策
    */
    std::string get_protection_for_cold();

    /*!
    * @brief 風邪をひく
    */
    void has_a_cold();

    /*!
    * @brief 風邪が治る
    */
    void is_over_her_cold();

private:
    /*!
    * @brief ご機嫌を変更する
    */
    void change_state(State * state);

    /*
    *********************************************
    * Variable
    **********************************************
    */
private:
    std::shared_ptr<State> state;

};
// StatePatternYumichan.cpp

#include "StatePatternYumichan.h"

StatePatternYumichan::StatePatternYumichan() :state(std::make_shared<OrdinaryState>) {}

std::string StatePatternYumichan::morning_greet() {
    return this->state->morning_greet();
}

std::string StatePatternYumichan::get_protection_for_cold() {
    return this->state->get_protection_for_cold();
}

void StatePatternYumichan::has_a_cold() {
    this->change_state(std::make_shared<BadMoodState>);
}

void StatePatternYumichan::is_over_her_cold() {
    this->change_state(std::make_shared<OrdinaryState>);
}

void StatePatternYumichan::change_state(std::shard_ptr<State> state) {
    delete this->state;
    this->state = state;
}

 

そして、こちらが由実ちゃんの気分によって受け答えの基底となる「State」クラス。

 

// State.h

#pragma once

#include

/*!
* @brief 由実ちゃんの状態を表す基底クラス
*/
class State {
public:
    /*!
    * @brief 朝の挨拶を返す
    */
    virtual std::string morning_greet() = 0;

    /*!
    * @brief 防寒対策を返す
    */
    virtual std::string get_protection_for_cold() = 0;

};

 

こちらが通常時の受け答えをする「OrdinaryState」クラス。

// OrdinaryState.h

#pragma once
#include "State.h"

class OrdinaryState : public State{
    public:
    /*!
    * @brief 朝の挨拶を返す。通常は、男らしく応えます。
    */
    std::string morning_greet() override;

    /*!
    * @brief 防寒対策を返す。通常は、走るようです。
    */
    std::string get_protection_for_cold() override;
};

 

// OrdinaryState.cpp

#include "OrdinaryState.h"

std::string OrdinaryState::morning_greet() {
    return "おっす!";
}

std::string OrdinaryState::get_protection_for_cold() {
    return "走る";
}

 

こちらが風邪をひいた時の受け答えをする「BadMoodState」クラス。

 

// BadMoodState.h

#pragma once
#include "State.h"

class BadMoodState : public State {
public:
    /*!
    * @brief 朝の挨拶を返す。気分が悪いので、ぶっきらぼうに応えます。
    */
    std::string morning_greet() override;

    /*!
    * @brief 防寒対策を返す。気分が悪いので、ももひきをはきます。
    */
    std::string get_protection_for_cold() override;
};

 

// BadMoodState.cpp

#include "BadMoodState.h"

std::string BadMoodState::morning_greet() {
    return "おお";
}

std::string BadMoodState::get_protection_for_cold() {
    return "ももひき";
}

 

そして最後に、実際に使用するとしたらこんな感じ。

// main.cpp

#include "StatePatternYumichan.h"

void comment(const StatePatternYumichan yumicahn){
    std::cout << std::endl;
    std::cout << "  挨拶:";
    std::cout << yumichan.morning_greet() << std::endl;
    std::cout << "防寒方法:";
    std::cout << yumichan. get_protection_for_cold() << std::endl;
}

int main () {
    StatePatternYumichan yumichan;
    // 通常時
    comment(yumichan);

    yumichan.has_a_cold();

    // 風邪をひいて具合が悪い時
    comment(yumichan);

    yumichan.is_over_her_cold();

    // 通常時
    comment(yumichan);
}

 

 

ソースコードはGitHubでも公開しています。最新のコードはGitHubでご確認ください。
fantm21/PublicCode/DesignPattern/DesignPattern/StatePattern/


MY SNS ACCOUNT

Instagram :  @programer_fumi

Twitter: @PROVINSITE

Twitter:@FumiProgrammer

もしよければフォローとイイネしてください♪

喜びます(〃艸〃)←

Sponsored Link