nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

Jupyter Notebookの学習まとめ

はじめに

Jupyter Notebookの学習をまとめた記事です。

Qiitaに素晴らしい記事がありましたので、展開します。

Jupyter 知っておくと少し便利なTIPS集 - Qiita

Jupyter Notebookで時間を計測したい

%%timeを使うとよいです。ただし、使用するためにはtimeモジュールのインポートが必要です。

import time

AnacondaのJupyter notebookでnbextensionsを使う

(手順1) Anaconda Promptで以下のコマンドを実行することで、インストールします

conda install -y -c conda-forge jupyter_contrib_nbextensions

(手順2) jupyter Notebookを起動して、Nbextensionsタブをクリックします

(手順3) 追加したい機能に対して、チェックを入れます。(Live Markdown Previewにチェックを入れた様子)

f:id:nprogram:20190308210117p:plain

(手順4) 動作を確認する。マークダウン入力中に、レンダリング結果がリアルタイムで表示される。

[Ratexによる数式を入れる]

\begin{align}
min=\sum_{i=1}^n\sum_{x \in X_i}||x - \mu||^2
\end{align}

[実行イメージ]

f:id:nprogram:20190308211408p:plain

参考サイト

scikit-learn学習

はじめに

機械学習で学んだこと、躓いたところをメモします。

grid_search

最適なパラメータの探索を行うメソッドです。 探索を行いたいパラメータをセットしておくと、最適なパラメータを見つけ出してくれます。何も考えずにSVMとか動かすと精度はあまり良い数値になりません。ただ、手動で探すのはとても大変なので、そこでgrid_searchを使います。

VSCodeでPythonをデバッグしたい

はじめに

Windows環境で、Visual Studio CodeでPythonをデバッグしたいと思います。

環境

  • Windows 10 (version 1809)
  • Python version : 3.7.1
  • IDE : Visual Studio Code
    • Version : 1.31.1

方法

  1. Visual Studio Codeをインストールします
  2. Pythonをインストールします
  3. Visual Studio Code上で、Ctrl + Shift + Pでコマンドパレットを開きます
  4. タスク : タスクの構成を選択
  5. 更に一覧が出てくるので「Others 任意の外部コマンドを実行する例」を選択
  6. tasks.jsonファイルを以下のように修正

tasks.json

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "python",
            "type": "shell",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "command": "python",
            "args": [
                "${file}"
            ],
            "presentation": {
                "echo": false,
                "reveal": "always",
                "focus": false,
                "panel": "shared"
            },
            "problemMatcher": []
        }
    ]
}

最後に、F5で実行します

f:id:nprogram:20190305000928p:plain

参考文献

Chain of Responsibility [C#]

Chain of Responsibility

Chain-of-responsibility パターン, CoR パターンは、オブジェクト指向設計におけるデザインパターンの一つであり、一つの コマンドオブジェクトと一連の 処理オブジェクトから構成される。

各処理オブジェクトは、処理できるコマンドオブジェクトの種類と、自身が処理できないコマンドオブジェクトをチェーン内の次の処理オブジェクトに渡す方法を記述する情報を保持する。

また、新たな処理オブジェクトをチェーンの最後に追加する機構を備える。

クラス図

f:id:nprogram:20190311230813p:plain

コード

using System;

namespace ConsoleApp10
{
    public enum PRICE_MANAGER_APPROVE : int
    {
        MANAGER = 100000,
        DIRECTOR = 200000,
        PRESIDENT = 300000
    }

    class Program
    {
        static void Main(string[] args)
        {
            Purchase item1 = new Purchase(1, "PC", 100000);
            Purchase item2 = new Purchase(2, "High Spec PC", 200000);
            Purchase item3 = new Purchase(3, "Super High Spec PC", 300000);
            Purchase item4 = new Purchase(4, "Ultra High Spec PC", 400000);
            Authorizer manager = new GeneralManager("Ichiro");
            Authorizer director = new Director("Tom");
            Authorizer president = new President("Jerry");

            manager.SetNextApprove(director);
            director.SetNextApprove(president);
            president.SetNextApprove(null);

            // マネージャーにPC購入の承認を判定してもらう
            manager.JudgeApproveItem(item1);
            Console.WriteLine();

            // マネージャーにHigh Spec PC購入の承認を判定してもらう
            manager.JudgeApproveItem(item2);
            Console.WriteLine();

            // マネージャーにSuper High Spec PC購入の承認を判定してもらう
            manager.JudgeApproveItem(item3);
            Console.WriteLine();

            // マネージャーにUltra High Spec PC購入の承認を判定してもらう
            manager.JudgeApproveItem(item4);
        }
    }

    /// <summary>
    /// 承認者クラス
    /// </summary>
    public abstract class Authorizer
    {
        /// <summary>
        /// 承認者名
        /// </summary>
        public string Name { get; private set; }

        /// <summary>
        /// 次の承認者
        /// </summary>
        protected Authorizer next = null;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="someName"></param>
        public Authorizer(string someName)
        {
            this.Name = someName;
        }

        /// <summary>
        /// 次の承認者をセットする
        /// </summary>
        /// <param name="someNext"></param>
        public abstract void SetNextApprove(Authorizer someNext);

        /// <summary>
        /// 購入物を承認するか判定する
        /// </summary>
        /// <param name="somePurchase"></param>
        public abstract void JudgeApproveItem(Purchase somePurchase);
    }

    /// <summary>
    /// 部長クラス
    /// </summary>
    public class GeneralManager : Authorizer
    {
        public GeneralManager(string someName) : base(someName) { }

        public override void SetNextApprove(Authorizer someNext)
        {
            this.next = someNext;
        }

        public override void JudgeApproveItem(Purchase somePurchase)
        {
            if (somePurchase.Price <= (int)PRICE_MANAGER_APPROVE.MANAGER)
            {
                Console.WriteLine("Manager has approved this item({0} : {1}yen)].", somePurchase.Name, somePurchase.Price);
            }
            else
            {
                Console.WriteLine("Manager can't judge this item({0} : {1}yen)].", somePurchase.Name, somePurchase.Price);
                next.JudgeApproveItem(somePurchase);
            }
        }
    }

    /// <summary>
    /// 取締役クラス
    /// </summary>
    public class Director : Authorizer
    {
        public Director(string someName) : base(someName) { }

        public override void SetNextApprove(Authorizer someNext)
        {
            this.next = someNext;
        }

        public override void JudgeApproveItem(Purchase somePurchase)
        {
            if (somePurchase.Price <= (int)PRICE_MANAGER_APPROVE.DIRECTOR)
            {
                Console.WriteLine("Director has approved this item({0} : {1}yen)].", somePurchase.Name, somePurchase.Price);
            }
            else
            {
                Console.WriteLine("Director can't judge this item({0} : {1}yen)].", somePurchase.Name, somePurchase.Price);
                next.JudgeApproveItem(somePurchase);
            }
        }
    }

    /// <summary>
    /// 社長クラス
    /// </summary>
    public class President : Authorizer
    {
        public President(string someName) : base(someName) { }

        public override void SetNextApprove(Authorizer someNext)
        {
            this.next = someNext;
        }


        public override void JudgeApproveItem(Purchase somePurchase)
        {
            if (somePurchase.Price <= (int)PRICE_MANAGER_APPROVE.PRESIDENT)
            {
                Console.WriteLine("President has approved this item({0} : {1}yen)].", somePurchase.Name, somePurchase.Price);
            }
            else
            {
                Console.WriteLine("President can't judge this item({0} : {1}yen)].", somePurchase.Name, somePurchase.Price);
            }
        }
    }

    /// <summary>
    /// 購入品クラス
    /// </summary>
    public class Purchase
    {
        public int Id { get; private set; } = 0;
        public string Name { get; private set; } = null;
        public int Price { get; private set; } = 0;

        public Purchase(int someId, string someName, int somePrice)
        {
            this.Id = someId;
            this.Name = someName;
            this.Price = somePrice;
        }
    }
}

出力結果

Manager has approved this item(PC : 100000yen)].

Manager can't judge this item(High Spec PC : 200000yen)].
Director has approved this item(High Spec PC : 200000yen)].

Manager can't judge this item(Super High Spec PC : 300000yen)].
Director can't judge this item(Super High Spec PC : 300000yen)].
President has approved this item(Super High Spec PC : 300000yen)].

Manager can't judge this item(Ultra High Spec PC : 400000yen)].
Director can't judge this item(Ultra High Spec PC : 400000yen)].
President can't judge this item(Ultra High Spec PC : 400000yen)].

参考リンク

ソフトウェア設計全般

はじめに

ソフトウェア設計全般について学習する記事です。

UMLモデリング

凝集度をチェックしましょう

凝集度とは、情報工学においてモジュール内のソースコードが特定の機能を提供すべく如何に協調しているかを表す度合いです。

凝集度の高いモジュールは * 堅牢性が高い * 信頼性が高い * 再利用性が高い * コードを読みやすい

凝集度の低いモジュールは * 保守しにくい * 評価しにくい * 再利用しにくい * コードを読みにくい

凝集度は次の場合に低下します * クラスの責任範囲(メソッド群)に共通性がほとんどない * メソッドが様々なことを行い、しばしば粒度の粗いデータや全く関係のないデータ群を扱う

凝集度が低い(弱い)場合の欠点は次の通りである: * モジュール群を理解することが難しくなる * システムの保守が難しくなる。ある論理的修正が複数のモジュールにまたがって影響する可能性が増すためである * モジュールの再利用が難しくなる。凝集度の低いモジュールの提供するAPIには一貫性がないことが多いため

凝集度を上げるポイント

  • クラスの関連を見直す (クラスとクラスとの関連の線が複雑になっていませんか?)
  • クラス名・メンバ変数・メンバメソッドの見直し

  • 凝集度と結合度:このコードのどこが悪いのか?

可変性分析

PL開発におけるコア資産のメンテナンス性は、可変性を如何にうまく捉えるかによって大きく変わります。

なぜなら、開発する資産がスコープに含まれる製品に対して柔軟に対応できるためには、それらの製品間の差異、すなわち可変性を考慮した設計・実装を行う必要があるため、その入力として可変性が適切に分析されている必要があるからです。

ゆえにPL開発では、対象とする製品群に存在する可変性を特定・管理することが極めて重要なのです。通常はPLスコープを決定した後に、以下の順序で可変性の分析を行います。

  1. 可変性の特定
  2. 可変パターンの分析(モデル化)

  3. 可変性の分析

参考リンク

Django学習 (トラブルシューティング)

はじめに

DjangoのWebアプリケーション作成時につまったところを記載します。

開発環境

  • Windows 10 (version 1809)
  • Python version : 3.7.1
  • Django version : (2, 1, 7, 'final', 0)
  • IDE : Visual Studio Code

ディレクトリ構成

プロジェクトの中に一つのアプリケーションがある場合のディレクトリ構成を以下に記載します。

  • プロジェクト名 : project
  • アプリケーション名 : myapp
project
├── myapp
│ ├── migrations
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── model.py
│ ├── tests.py
│ └── views.py
│
├── project
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
│
├── db.sqlite3
└── manage.py

Djangoでmodel.pyを書き換える場合の注意点

model.pyを変更した場合は、以下の2つのコマンドを忘れずに実施してください。実施しないとmodel.pyの変更が反映されません。(´;ω;`)

  1. Jangoフレームワークにモデルを作成したり、変更したことを伝えるコマンド

py manage.py makemigrations [アプリ名]

  1. 上記を実際に反映させるコマンドもさらに必要

py manage.py migrate

関数仕様を調べたい

Djangoでサーバーを起動しようとしたときにエラーが発生する

サーバーを起動するコマンドを入力したとき(py manage.py runserver)

以下のように、エラーが発生する場合があります。 エラーを見るときは、後ろから見ます。後ろから新しいエラーがあるためです。

すると、最後のエラーを見ると、employee.appsがパッケージにないようです・・・。

ModuleNotFoundError: No module named 'employee.apps.EmployeeConfigdjango'; 'employee.apps' is not a package

C:\Users\uv2ut\PycharmProjects\project2>py manage.py runserver
Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x000002158F8B7840>
Traceback (most recent call last):
  File "C:\Users\uv2ut\AppData\Local\Programs\Python\Python37\lib\site-packages\django\utils\autoreload.py", line 225, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\uv2ut\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\management\commands\runserver.py", line 109, in inner_run
    autoreload.raise_last_exception()
  File "C:\Users\uv2ut\AppData\Local\Programs\Python\Python37\lib\site-packages\django\utils\autoreload.py", line 248, in raise_last_exception
    raise _exception[1]
  File "C:\Users\uv2ut\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\management\__init__.py", line 337, in execute
    autoreload.check_errors(django.setup)()
  File "C:\Users\uv2ut\AppData\Local\Programs\Python\Python37\lib\site-packages\django\utils\autoreload.py", line 225, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\uv2ut\AppData\Local\Programs\Python\Python37\lib\site-packages\django\__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "C:\Users\uv2ut\AppData\Local\Programs\Python\Python37\lib\site-packages\django\apps\registry.py", line 89, in populate
    app_config = AppConfig.create(entry)
  File "C:\Users\uv2ut\AppData\Local\Programs\Python\Python37\lib\site-packages\django\apps\config.py", line 116, in create
    mod = import_module(mod_path)
  File "C:\Users\uv2ut\AppData\Local\Programs\Python\Python37\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 962, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'employee.apps.EmployeeConfigdjango'; 'employee.apps' is not a package

原因は、settings.pyにおいて、'employee.apps.EmployeeConfig'の後にカンマがないことでした。(-_-)

INSTALLED_APPS = [
    'employee.apps.EmployeeConfig'
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

PyCharmのトラブルシューティングまとめ

はじめに

PyCharmで、躓いたところをまとめておく記事です。

環境

  • Windows 10 (version : 1809)
  • PyCharm 2018.3.4 (Professional Edition)

No R interpreter defined

問題

PyCharm上で、機械学習をしようとしたら、以下のエラーメッセージが出る・・・。

No R interpreter defined: Many R related features like completion, code checking and help won't be available. You can set an interpreter under Preferences->Languages->R

対処方法

  1. CRAN(The Comprehensive R Archive Network)からインストーラーをダウンロードします

  2. R言語インストールします。

  3. PyCharmのSettingsから、R言語のexeのパスを設定します。

f:id:nprogram:20190227192259p:plain

参考