OmniAICreator/Qiita-1.07M huggingface dataset:
PowerShellの背景を変える

#プログラミング勉強日記
2020年12月12日
ずっとPowerShellの背景の色が気にいってなかったが、PowerShellを使う機会がすごい増えたので、この機会に背景の色を変えようと思った。なんとなくめんどくさそうなイメージはあったが、簡単だったのでデフォルトで使ってる人はぜひ試してみてほしいと思う。

#設定方法
　PowerShellのタイトルバーを右クリックして、`プロパティ`を選択。プロパティを開くと各設定を変更することができるので、`画面の色`から背景の画像を選択する。
　（設定変更後、うまく変更されていなかったら再度PowerShellを立ち上げるとできる。）

設定外面↓
![1212-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/fa179218-d444-3321-cbf7-5e7c9484a87a.png)

デフォルトの画面↓
![1212.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/a7f90953-6791-2f3e-3ec3-221d5a156c70.png)

設定後の画面↓
![1212-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/9ee0375f-3a8a-1ca2-4b34-420134e0b671.png)

#備忘録
　左側から順番にデフォルトのRGBの値を示す。

| | 黒 | <font color="#000080">紺</font> | <font color="#008000">緑</font> | <font color="#008080">青緑</font> | <font color="#800000">マロン</font> | <font color="#012456">濃紺</font> | <font color="#eeedf0"> 薄い灰色</font> | <font color="#c0c0c0">灰色</font> | <font color="#808080">濃い灰色</font> | <font color="#0000ff">青</font> | <font color="#00ff00">緑</font> | <font color="#00ffff">水色</font> | <font color="#ff0000">赤</font> | <font color="#ff00ff">ピンク</font> | <font color="#ffff00">黄色</font> | 白|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
| 赤 | 0 | 0 | 0 | 0 | 128 | 1 | 238 | 192 | 128 | 0 | 0 | 0 | 255 | 255 | 255 | 255 |
| 緑 |0 | 0 | 128 | 128 | 0 | 36 | 237 | 192 | 128 | 0 | 255 | 255 | 0 | 0 | 255 | 255 |
| 青 | 0 | 128 | 0 | 128 | 0 | 86 | 240 | 192 | 128 | 255 | 0 | 255 | 0 | 255 | 0 | 255 |



#参考文献
[PowerShellの背景を変更](https://pswork.jp/powershell/backgroundcolor/)
[Oracle Cloud]リソース・マネージャ：Resource Discovery

OCIのコンパートメント内のリソースをTerraform構成ファイルとして出力するリソース・マネージャのResource Discovery機能を使ってみた。

# 既存コンパートメントからスタックを作成
Webコンソールから「ソリューションおよびプラットフォーム」の
「リソース・マネージャ」＞「スタック」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/8555b850-5697-74be-dadb-fdabdaa05f87.png)

「スタックの作成」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/1f04d52c-662e-3b6c-76ce-ffa776a800a8.png)

「既存のコンパートメント」を選択し、リソースが存在するコンパートメントを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/8d72bbc6-9652-57eb-1123-c4174169e97f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/dec865c7-6879-f893-7879-11cb8a4eb827.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/0bd6c674-dda9-205e-557a-f9ce4d1461a7.png)


# 構成ファイルのダウンロード

スタックの作成が完了後「Terraform構成ファイル(.zip):」からzipファイルをダウンロードができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/6a0d1663-a51c-c635-8107-d836db202fa9.png)

ダウンロードしたZipファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/e3e925f9-1371-7978-9a2e-2ed00a32621d.png)


# 補足
スタック作成時に、出力する対象のサービスを複数指定することも可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/99499592-3f12-f9bf-ebe8-cd577b5ebfb2.png)

### vars.tf

リージョン、Compartment_ocid のほかマーケットプレースイメージのOCIDが含まれていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/9b2d1234-ec86-9517-175c-65cb19efb96e.png)

# おわりに
簡単にTerraform構成ファイルを出力することができました。

Resource Discoveryこの機能により以下が可能になります。

- 手動管理インフラストラクチャからResource Manager制御インフラストラクチャに移行
- TerraformがHashiCorp構成言語（HCL）構文を使用してOracle Cloud Infrastructureリソースを表す方法の学習
- 別のテナンシーまたはコンパートメントで既存のインフラストラクチャを複製または再構築

構成ファイルは、指定可能なオプションがすべて記載されているので、再作成に必要な記述に編集することで次の環境を作成できました。
jestでテストを分類して個別に実行する

## TL;DR

`hoge.{test category}.test.ts`のようにテストファイルを命名する
例. ``hoge.unit.test.ts`

実行時に対象ファイルを指定する

```zsh
npx jest ".*\.unit\.test\.ts$"
```

`jest.unit.config.js`のように設定ファイルを分割するのもアリ

## 動機

- テストにはそれぞれ特性がある
- 単体テストと言われるような、依存関係が少なく、高速なもの
- 統合テストと呼ばれるような依存関係があるもの
- DBや外部APIアクセスがあるもの
- ビルドが必要なもの

これらを一括で実行するのは現実的ではない

## 対策

テストを適切に分類し、それぞれ任意のタイミングで呼び出す

### 案1. テストファイル名で分類する
 
`hoge.unit.test.ts`のようにファイル名にテスト分類を入れる規約を作る

- pro: どのようなテストをするファイルかわかりやすい

### 案2. テスト分類ごとにディレクトリを分割する

```zsh
└── __tests__
    ├── integration
    │   └─── hoge.test.ts
    └─── unit
         └─── hoge.test.ts
```

- pro: testコードをプロダクトコードと分けている場合はわかりやすい
- con: testコードをプロダクトコードと並列にしている場合は使えない

### 案3. テストケース名に分類を入れる

試していないが以下の方な方法もできる？

```ts
describe("unit: hogeのテスト",() => {
  expect(hoge).toBe(true);
}
```

## 備考

テストをどう分類するかについてはまた別の課題とする
動機を考えると、test sizesでの分類が適しているかもしれない

[結合テストと呼ぶのをやめた話](http://akito0107.hatenablog.com/entry/2018/08/27/190333)

より良い手法があればコメントください
Active Adminで設定した心当たりのない検索条件が表示される。

Active Adminで設定した心当たりのない検索条件が表示される現象が発生した。
![101763720-84ed4080-3b22-11eb-8c53-983a21187eaf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680628/cac50202-6e7a-0702-cb86-a6cf033299c2.png)

BOOKMARK
FACILITIES
BOOKMARK FACILITIESなんてパラメータ知らない。。。

選択項目に変な値が出るし。。。

## 結論
Active Admin内でfilterの設定を行なっていないことが原因。
filterで検索条件を指定しておかないと全てのパラメータの検索条件が表示される。

検索条件を明示したいなら、filterの設定を行う必要ある。


```
app/admin/users.rb

  # 絞り込み条件の項目設定
  filter :email
  filter :nickname
  filter :birth_year
  filter :sex, as: :select, collection:User.sexes_i18n.invert.map{|key,value| [key,User.sexes[value]]}
```
![スクリーンショット 2020-12-12 13.52.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680628/589d9175-e378-0a9e-dbc6-c7ae115800ad.png)
設定した検索条件のみ表示されることが確認できた。
これで解決！
Herokuの本番DBを確認する方法（MySQL）

##前置き
herokuをMySQLでデプロイした方向けです。
本番環境のDBを確認したいなーと思って調べているとどうやらherokuではPostgreSQLが推奨されているらしくMySQLの記事がほとんど見つかりませんでした。そこで自分の備忘録をかねてHerokuの本番DBを確認する方法（MySQL）をここに残したいと思います。

##確認方法
この記事を書く前に色々とネットで調べてみました。すると答えが載っていました！！
結論から言うとターミナルでmysql -u DB_USERNAME -h DB_HOSTNAME -pDB_PASSWORDの順番に打ち込むと

```
mysql >
```
のように出てきます。こうなれば成功です！！
。
。
。

なるほど全然わからない。
そもそもどこにUSERNAME、HOSTNAME、PASSWORDがわからない、、
そこからさらに調べているとDATABASE_URLの中身に色々と入っていることが判明。
ターミナルにてheroku configコマンドを実行すると

```
CLEARDB_DATABASE_URL:     mysql://abcdef12345678:１pindesu４@us-cdbr-east-02.cleardb.com/heroku_3232e987654321a?reconnect=true
DATABASE_URL:             mysql2://abcdef12345678:１pindesu４@us-cdbr-east-02.cleardb.com/heroku_3232e987654321a?reconnect=true
LANG:                     en_US.UTF-8
RACK_ENV:                 production
RAILS_ENV:                production
RAILS_LOG_TO_STDOUT:      enabled
RAILS_MASTER_KEY:         *******************
RAILS_SERVE_STATIC_FILES: enabled
SECRET_KEY_BASE:          *******************
```
こんな感じでいっぱい出てくると思います。（ここに乗っていなかったりここに書いてないものが表示されてることもあるかと思います。）

大切なのは
CLEARDB_DATABASE_URL:     mysql://abcdef12345678:1pindesu4@us-cdbr-east-02.cleardb.com/heroku_3232e987654321a?reconnect=trueの部分です。
ここにUSERNAME、HOSTNAME、NAME、PASSWORDやらが載っています。

今回の場合
ユーザー名= abcdef12345678

パスワード= 1pindesu4

ホスト= us-cdbr-east-02.cleardb.com

データベース名= heroku_3232e987654321a
のように割り振られています。

よってターミナルにて

```
% mysql -u abcdef12345678 -h us-cdbr-east-02.cleardb.com -p1pindesu4
```
することで（一番最後の-p1pindesu4は-pの後にスペースを開けないようにしてください）

```
mysql >
```
このように無事に入ることができると思います。
あとはどのデータベースを見たいのかを選択する必要があるので SHOW コマンドを使っていきます。

```
mysql> SHOW DATABASES;
```

```
+------------------------+
| Database               |
+------------------------+
| information_schema     |
| heroku_3232e987654321a |
+------------------------+
2 rows in set (4.76 sec)
```
ここで先ほどheroku configで確認した
データベース名= heroku_3232e987654321aと一致するものが自分が確認したい本番DBということになります。
あとは

```
mysql> USE heroku_3232e987654321a;
```
でデータベースを選択し

```
mysql> SHOW TABLES;
```
コマンドを実行すれば

```
+----------------------------------+
| Tables_in_heroku_3232e987654321a |
+----------------------------------+
| ar_internal_metadata             |
| favorites                        |
| relationships                    |
| schema_migrations                |
| songs                            |
| users                            |
+----------------------------------+
6 rows in set (0.29 sec)

```
こんな感じで本番DBが確認できると思います！！

##まとめ
自分なりにまとめてみたので間違っている箇所などあれば指摘していただける嬉しいです。herokuにかかわらずDBの操作は実務で必ず使うそうなのでいろいろいじって慣れておくことが大切なのかなと思いました。
csvファイルが文字化け

Javaでcsvファイルを読み込み、別のcsvファイルに書き込む。しかし、その時数値や記号は正常に表示されるが、日本語は文字化けしてしまった。

```Java:Task.java
//入力ストリームの準備
FileReader fr = null;
BufferedReader br = null;
//出力ストリームの準備
FileWriter fw = null;
BufferedWriter bw = null;

try{
fr = new FileReader("入力ファイル名.csv");
br = new BufferedReader(fr);
fw = new FileWriter("出力ファイル名.csv");
bw = new BufferedWriter(fw);
String str;

//csvファイルを一行ずつ読み込む
while((str = br.readLine()) != null){
bw.write(str+"\r\n");//改行を含めて書き込む
bw.flush();
}catch(IOException e){
e.printStackTrace();
System.exit(1);
}finally{
br.close();
}
```

結果
![文字化け.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/942694/58116eb6-daee-ee8f-deaf-80921bea047c.png)

文字化けしてしまった。
本来は年月日,平均気温,最高気温,最低気温,降水量,日照時間と出力するはずだった。

読み込むときに文字コードを指定して読み込むことで解決できるらしい。
パラメーターのDecoratorを実装する

```typescript

const requiredParamKey = Symbol('required');

function required(target: any, key: string, index: number) {
  const requiredParams = Reflect.getOwnMetadata(requiredParamKey, target, key) || [];
  requiredParams.push(index);
  Reflect.defineMetadata(requiredParamKey, requiredParams, target, key);
}

function validate(target: any, key: string, descriptor: TypedPropertyDescriptor<Function>) {
  const method = descriptor.value;
  descriptor.value = function() {
    const requiredParams = Reflect.getOwnMetadata(requiredParamKey, target, key) || [];
    for (const i of requiredParams) {
      // eslint-disable-next-line prefer-rest-params
      if (i >= arguments.length || arguments[ i ] === undefined) {
        throw new Error(`Missing required arguments at index ${ i }`);
      }
    }
    // eslint-disable-next-line prefer-rest-params
    return method.apply(this, arguments);
  };
}

class Greeter {
  greeting: string;

  constructor(message: string) {
    this.greeting = message;
  }

  @validate
  greet(@required name: string) {
    return "Hello " + name + ", " + this.greeting;
  }
}
```


## link
https://www.typescriptlang.org/docs/handbook/decorators.html
UINavigationControllerをSceneDelegateでRootViewにセットする時の注意点！

# この記事で言いたいこと
すごく初歩的ですが、
```Storyboardを使っているのか、使っていないのかちゃんと意識しましょう！```
著者はこれで``2時間``無駄にしました！
下記の🙅‍♂️これはダメです！を実施すると、当然のことながら、IBOutletがnilになります。
よって、ViewDidLoad(){   }でUIに値を入れようとしてもクラッシュします！


# 環境
- Xcode : Version 12.2 
- Swift5

##Storyboardを使う場合

```Swift
//Storyboardを使用している場合は、StoryboardからViewControllerを生成しましょう。
      //🙆‍♂️これはOK！ 
        let storyboard = UIStoryboard(name: "Main", bundle: .main)
        let vc = storyboard.instantiateInitialViewController() as! ViewController

      //🙅‍♂️これはダメです！  let vc = ViewController（）
```

```Swift

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    
        guard let windowScene = (scene as? UIWindowScene) else { return }
        let window = UIWindow(windowScene: windowScene)
        let storyboard = UIStoryboard(name: "Main", bundle: .main)
        let vc = storyboard.instantiateInitialViewController() as! ViewController
        let navigation = UINavigationController(rootViewController: vc)
        window.rootViewController = navigation
        self.window = window
        window.makeKeyAndVisible()

    }
}
```

##Storyboardを使わない場合

1.Main.storyboardを削除。
2.プロジェクトのTARGETS > InfoにあるMain storyboard file base nameという項目を削除。
![Screen Shot 2020-12-12 at 1.32.31 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535198/2fed6cd4-d447-7210-8ba7-276021be64db.png)


```Swift

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    
        guard let windowScene = (scene as? UIWindowScene) else { return }
        let window = UIWindow(windowScene: windowScene)
        let vc = ViewController()
        let navigation = UINavigationController(rootViewController: vc)
        window.rootViewController = navigation
        self.window = window
        window.makeKeyAndVisible()

    }
}
```

# 参照
- [【Xcode11】Storyboardを使わずコードだけで画面を生成する方法](https://qiita.com/edasan/items/68cbe9ab63d48ee71594)
- [Set A Root View Controller Programmatically in Swift 5](https://softauthor.com/ios-swift-root-view-controller-programmatically/)
はじめてのUdemy

#はじめに
2019年10月～2020年4月に、私が所属する会社にて推奨されたAI学習にて、会社にて選定されたコンテンツを実施した時の話です。（これらのコンテンツがAIに相当するのかという議論もあるかもしれませんが、そこは大目にみてください。）

#実施したコンテンツ
+   [人工知能（AI）×IoT×ブロックチェーン時代のテクノロジー／次世代ビジネスモデルノウハウの全ての基礎知識を獲得する講座](https://www.udemy.com/course/next-technology/)
+   [現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/)
+   [【4日で体験！】 TensorFlow, Keras, Python 3 で学ぶディープラーニング体験講座](https://www.udemy.com/course/tensorflow/)
+   [挨拶から店舗予約まで！手を動かして学ぶAIチャットボット開発入門](https://www.udemy.com/course/ai-ytxof/)
+  [【TensorFlow・Python 3】GANによる画像生成AI自作入門](https://www.udemy.com/course/tensorflow-gan/)
+  [【画像判定AIアプリ開発・パート1】TensorFlow・Python・Flaskで作る画像判定AIアプリ開発入門](https://www.udemy.com/course/tensorflow-advanced/)
+  [【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門](https://www.udemy.com/course/optworks_1/)
+  [PythonによるWebスクレイピング〜入門編〜【業務効率化への第一歩】](https://www.udemy.com/course/python-scraping-beginner/)

実施したコンテンツは上の８つ。(順番は私が実施した順)

### 人工知能（AI）×IoT×ブロックチェーン時代のテクノロジー／次世代ビジネスモデルノウハウの全ての基礎知識を獲得する講座
　技術の話と言うよりは、最新技術をどうビジネスに展開していくのかというヒントや気づきを得るための内容でした。私はただ受講して、ふむふむってみていただけでしたが、本来の受講方法とは違うかもしれませんが、複数人で受講し、この講座をもとに戦略など掘り下げて議論するようにするともっと良かったのかもと思いました。

### 現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル
　まずは、講師の方の話し方がやさしいというのが一番の印象。Pycharmを使用したPythonの基礎講座。意外と最初に紹介していただいシリコンバレーの様子の場面も面白かったです。

### 【4日で体験！】 TensorFlow, Keras, Python 3 で学ぶディープラーニング体験講座
　AIに関連した学習をしているぞという気になった講座。ちょうどこのころG検定を取得したため、講座内容が勉強したことと親和性があった。G検定の復習・勉強にもなった。TensorFlowやKerasなどに初めてさわった私でも講座や補足のようにやっていくとそれなりにサンプルのように動作させることができた。自分のPCスペックが頼りなかったので、途中からはazure machine learningを利用してサンプル等を実施。やはりGPUを積んだマシンで実行すると実施速度の違いなど如実にわかって、面白かった。

### 挨拶から店舗予約まで！手を動かして学ぶAIチャットボット開発入門
　Dialogflowを利用して、Lineボットを作成したり、GASを利用したAPIの作成をする講座。Line側の設定が講座内容と違ったりしていたが、なんとか実施できた。どれも初めてさわったものばかりでしたが、色んなツールで色んな事ができるんだと、参考になりました。

### 【TensorFlow・Python 3】GANによる画像生成AI自作入門
　GANを実装する講座。手を動かしてみるとGANってこんな感じなのかと、概要をより理解できると思います。

### 【画像判定AIアプリ開発・パート1】TensorFlow・Python・Flaskで作る画像判定AIアプリ開発入門
　機械学習アプリ開発の講座。データの収集からアプリの作成までを実施。

### 【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門
　色々やった中でこれが一番面白かった。
　理由）1. テーマが親しみやすかった。 2.Pythonについての説明がわかりやすい。3. j実習→答え合わせがいい具合にあった。
Pythonをはじめて勉強する人にもおすすめのレベルで、後輩などにもこれからはじめるとよいよとお勧めしちゃいました。

### PythonによるWebスクレイピング〜入門編〜【業務効率化への第一歩】
　今回受講した８講座の中で唯一すぐに実業務に取り入れられたのがこの講座。学んだスクレイピングの機能を利用して複数台設置してあるプリンタの使用状況を取得するアプリを開発できた。






#個人的な満足度ベスト３

1. [【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門](https://www.udemy.com/course/optworks_1/)
　　→　振り返りがあり、講座内容が非常にわかりやすかった点。

2. [【4日で体験！】 TensorFlow, Keras, Python 3 で学ぶディープラーニング体験講座](https://www.udemy.com/course/tensorflow/)
　　→　Pythonを使ってAIさわりっぽいことをしているな～って勝手に思えた点。

3. 　[挨拶から店舗予約まで！手を動かして学ぶAIチャットボット開発入門](https://www.udemy.com/course/ai-ytxof/)
　　→　初めてのlineチャットボットを楽しく作成できた点


#Udemyをやっての感想
+ やはり定期的にある特価期間に購入がおすすめ。
+ コンテンツ内容により、内容が古くなっていてコンテンツと同じサイトがWEB上になかったりすることもそこそこある。
+ 講師によるフォローやアップデートががあり、リンク切れなどに対応してくれているものがおすすめ。
+ Pythonを使った機械学習には、WEBサービスがおすすめ。
　「azure machine learning」や「Google Colaboratory」など
　私は、多くのコンテンツを「azure machine learning」を利用して実施しました。

以上、ありがとうございました。
【VBA】ExcelVBAを勉強するために読んだ本

# はじめに
私は非エンジニアの事務職です。これまで独学でExcelVBAを勉強してきました。
VBA歴は約3年、上級者とまではいきませんが、仕事で使えるマクロツールを作れる程度に上達しました。
そこで、これまで私が読んできたVBAの本を紹介します。初心者の方や、レベルアップのために、次にどの本を読もうか迷っている方の参考になれば幸いです。
# 1.自分のペースでゆったり学ぶＥｘｃｅｌ ＶＢＡ
VBAを勉強するために最初に読んだ本です(私が読んだのは初版ですが、現在は2版が出ているようです)。
絵本のようなイラストや、キャラクターが会話形式で解説をするといった内容から、初心者にもとっつきやすいと思い、購入しました。
VBAの基本的な内容を易しく解説してくれるので、初心者の1冊目におすすめです。
途中で挫折することはないと思いますが、その反面、この本の内容だけでは実務に活かせるようにならない点には注意が必要です。

[【Amazon】自分のペースでゆったり学ぶＥｘｃｅｌ ＶＢＡ](https://www.amazon.co.jp/自分のペースでゆったり学ぶ-Excel-VBA-改訂2版-日花/dp/4297112493/ref=sr_1_1?__mk_ja_JP=カタカナ&dchild=1&keywords=自分のペースでゆったり学ぶ+excel+vba&qid=1607744093&sr=8-1)
# 2.今日から使えるＥｘｃｅｌマクロ＆ＶＢＡ
2冊目に読んだのがこの本です。
様々な機能を実装していくとともに、それに必要な知識を身につけていく、という構成になっており、通常のブックやシートの操作の他、オートフィルター、ユーザーフォーム、図形の取り扱い等について学ぶことができます。
知識の範囲を広げることで、様々な処理が行えるようになりました。この本を読み終えた頃から、実際に仕事でVBAを活用できるようになり始めたと思います。
一方で、書いてある内容を全て覚える必要はないと思います。私も仕事で図形やグラフを扱うことがなかったため、実はいまだに図形やグラフの取り扱い方がよくわかっていません。プロのエンジニアではないので、必要な知識だけ選り好みして身につけていれば良いと思います。

[【Amazon】今日から使えるＥｘｃｅｌマクロ＆ＶＢＡ](https://www.amazon.co.jp/今日から使える-Excelマクロ-2016-2013-2007対応/dp/4802610661/ref=sr_1_2?__mk_ja_JP=カタカナ&dchild=1&keywords=今日から使えるＥｘｃｅｌマクロ＆ＶＢＡ&qid=1607743288&sr=8-2)
# 3.Ｅｘｃｅｌ ＶＢＡを実務で使い倒す技術
3冊目に読んだこの本は、今までの本とは少し種類が異なります。
この頃の私は、2冊目まででそれなりに知識を身につけており、わからないことがあってもネットで調べればよいため、知識をつけるために本を読む必要は特にない、といった時期でした。
この本は「○○の処理をするためにはどのようなコードを書けば良いか」ではなく、「コードの書き方や、書く際の注意点」を解説したものです。
具体的には、変数の命名規則、エラーが発生したときの対応方法、読みやすいコードの書き方といった内容が書かれています。
独学で勉強していると、自分の書いたコードを読んで指導してもらうという機会がないため、このような知識は得にくいものです。
この本のおかげで、コードを書いてただ動かすという段階から、「プログラムを作る」という段階にステップアップできたと思います。

[【Amazon】Ｅｘｃｅｌ ＶＢＡを実務で使い倒す技術](https://www.amazon.co.jp/ExcelVBAを実務で使い倒す技術-高橋宣成/dp/4798049999/ref=sr_1_1?__mk_ja_JP=カタカナ&dchild=1&keywords=excelvbaを実務で使い倒す技術&qid=1607744217&sr=8-1)
# 4.Ｅｘｃｅｌ ＶＢＡ実戦のための技術 入門レベルでは決して足りない実務に必須のスキルとは
4冊目は、3冊目をさらにレベルアップしたような本です。タイトルからして強そうな感じですね。本の厚さもかなりのものです。
この本は3冊目のように「書き方」についても踏み込むとともに、より細かい知識(`MsgBox "hello"`と`MsgBox("hello")`の違い等)や、よりレベルの高い知識(クラスモジュール、Accessとの連携等)が紹介されています。
1回読んだだけではなかなか理解できませんが、何度も読んで実務に活かしていくことで、少しずつ身についていきます。この本の内容を理解し、知識を自在に使いこなせるようになれば、業務改善に貢献できるような大掛かりなマクロツールを作れるようになると思います。
(ちなみに個人的には、クラスについて学ぶ場合は、他の言語でクラスを勉強してから、VBAではどのように実装するかを調べた方が良いと思います。)

[【Amazon】Ｅｘｃｅｌ ＶＢＡ実戦のための技術 入門レベルでは決して足りない実務に必須のスキルとは](https://www.amazon.co.jp/入門レベルでは決して足りない実務に必須のスキルとは-ExcelVBA-実戦のための技術-沢内-晴彦/dp/4802611609/ref=sr_1_2?__mk_ja_JP=カタカナ&dchild=1&keywords=excelvbaを実務で使い倒す技術&qid=1607744217&sr=8-2)
# 5.パーフェクトExcel VBA
最後に読んだのがこの本です。
VBAの言語仕様が網羅的・体系的に記載されており、これまで身につけてきた知識のスキマを埋め、全体像が理解できるような内容になっています。
読んでいくと、点と点が線でつながるような感覚になり、「VBAの理解もずいぶん進んだなあ」という達成感が湧きました。
この本を読めるレベルに至るまでが長い道のりですが、ある程度VBAを使いこなせるようになった方には、是非読むことをおすすめします。

[【Amazon】パーフェクトＥｘｃｅｌ ＶＢＡ](https://www.amazon.co.jp/パーフェクトExcel-VBA-PERFECT-高橋-宣成/dp/4297108755/ref=sr_1_3?__mk_ja_JP=カタカナ&dchild=1&keywords=excelvbaを実務で使い倒す技術&qid=1607744217&sr=8-3)
# おわりに
以上、私がこれまで読んできたVBAに関する本の紹介でした。気になるものがあれば、まずは書店で立ち読みしてみてください。
ちなみに私は全て紙の本で購入しています。紙にするか電子書籍にするかはお好みで。
pythonのクラス設計についてまとめとく

# 参考
[PythonのABCモジュールで抽象クラスを作る方法【初心者向け】](https://techacademy.jp/magazine/19310)

# はじめに
最近phpの現場にいるんだけど、そこでやたら`abstract`とか`Interface`とかが出てくる。で、たしかにクラスが割れてるとgitで複数人で作業できるし、そのメリットを感じだしたので、pythonでも、といった感じ

# まずはabstract
ちなみに`abstract`は「概要」の意味だ。これがわかるだけで結構理解度が違うと思う。抽象クラスじゃなくて概要クラスのほうがわかりやすくない？

```python:Animal.py
import abc


class Animal(object, metaclass=abc.ABCMeta):
    """動物を定義するための基底クラス"""
    @abc.abstractmethod
    def say_hello(self):
        pass
```

```python:main.py
from basic_abstract_class.Animal import Animal


class Dog(Animal):
    """犬を定義"""
    def __init__(self, name):
        self.name = name

    def say_hello(self):
        return "こんにちは！私の名前は" + self.name + "だワン！"


class Cat(Animal):
    """猫を定義"""
    def __init__(self, name):
        self.name = name

    def say_hello(self):
        return "こんにちは！私の名前は" + self.name + "だネコ！"


d = Dog("ポチ")
c = Cat("きゅうべぇ")
print(d.say_hello(), c.say_hello())
```
JavaScript2,クリックしたら動作する。初心者向け

②クリックしたら○○する
今回はJS（JavaScript）でとても良く使う、イベントの処理について解説しています。
HTMLからタグを取得して、それにイベントを紐付けて何か処理をさせてあげるところまで紹介しています。
クリックしたら、文字列を書き換えるところまで実施してるので、是非活用してみてください！

```
document.getElementById("test").addEventListener("click", function() {

})
```


.addEventListener

Add
は追加する

EventをListener
イベントを監視役

("click", function() {

})
クリックすると次{指令}を動作する
【Rails Colorpicker】カラーピッカーの選択色を特定要素の色と連動させる

# 【Rails Colorpicker】カラーピッカーの選択色を特定要素の色と連動させる
## この記事でできるようになること
以下のGIFのように、カラーピッカーで選択した色がリアルタイムで、何か特定の要素の持つ色と連動させることができるようになる！
GIFではちょっとわかりにくいですが、今回はFontawesomeで用意したピンの色と、カラーピッカーでの選択色とをリアルタイムで連携させてます。

![カラーピッカーとの連携.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/40bc0443-3a1c-a776-333e-75fb856da96d.gif)

## 考え方
以下のことをやっていくとなんかいけそうだとまず考える。
①カラーピッカーで選択している色を取得する
②その選択色をもってして、ピンのcolorを変更する

んー簡単そう。
とりあえず、やってみよ

あ、ちなみにカラーピッカーはHTML5の標準搭載の機能でした
めっちゃすごない？？？！！
これだけでカラーピッカー実装できるんですよ？。。。

```html:index.html
<input type="color">
```

## 実装コーディング

```erb:index.html.erb
<%# ↓これがアイコン %>
<i class="fas fa-location-arrow" id="arrow-icon"></i>

<%# ↓これがカラーピッカー %>
<input type="color" class="arrow-icon-color-selector" id="arrow-icon-colorーselector" value="#e66465">
```

```javascript:index.js
  // まずカラーピッカーの要素をcolorpickerという変数に入れる
  const colorpicker = document.querySelector('.arrow-icon-color-selector');

  // 次に、ピンの要素をarrowiconという変数に入れる
  const arrowicon = document.getElementById('arrow-icon');

  colorpicker.addEventListener('input', function(e) {  // カラーピッカーの入力値(inputの値)が変更されたら{}内の処理を実行する
    arrowicon.style.color = e.target.value; // アイコンのCSSのcolorプロパティの値を右辺の値にする。右辺の値とはすなわち、カラーピッカーでの選択値である。
 });
```

コーディングもめっちゃシンプルでした。。。。
応用すれば、画面の背景を変えたりできるので是非に！

例えばこんな感じにしたかったら

![カラーピッカーと背景の連動.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/a290eaea-f94b-f5ca-4509-a2a276d7f30d.gif)

```javascript:index.js
  const colorpicker = document.querySelector('.arrow-icon-color-selector');
  const arrowicon = document.getElementById('arrow-icon');

  colorpicker.addEventListener('input', function(e) {
    document.body.style.backgroundColor = e.target.value;
  });
```

以上です！！
お疲れ様でした！！
realmデータベースを可視化

##直面したもの

realmbrowserを使おうと思ったら、なんか暗号化キーを入れなきゃ使えなかった。

##エラー内容

```
please enter a valid encryption key for this realm file
```


##解決策

https://github.com/realm/realm-cocoa/issues/4795

realm Studioに可視化ソフトが変わったのかなという印象。
Realm studioをインストールして、default.realmファイルをrealm studioで開いたら解決しました
【JavaScript】ラッパーオブジェクトについて

※当方駆け出しエンジニアのため、間違っていることも多々あると思いますので、ご了承ください。また、間違いに気付いた方はご一報いただけると幸いです。

#JavaScript におけるデータは「すべてオブジェクトである」

と、いうふうに聞いたことがある。

しかし、学習を進める上で

**「データ型のうちObjectはオブジェクト型、それ以外をプリミティブ型という。」**とのことで、矛盾していないか？との思いがよぎった。

詳しくはこちら
[【JavaScript】JavaScriptにおける変数の参照について](https://qiita.com/sho_U/items/3d64d23fe31ed09e9dcb)

その答えが、**「ラッパーオブジェクト」**であった。

例えば、以下のような式があるとする。

```js
let str = "name";
let big = str.toUpperCase();

console.log(big);

//NAME
```

toUpperCase()関数は、呼び出し元の文字列を大文字にして返却する関数であるが、なぜプリミティブ型のであるstring型のstrが関数を呼べるのか。
実際、下記の様にデータ型を調べてみると、

```js
console.log(typeof str);
//string
```
string型である。

この理由はJavaScriptの**「ラッパーオブジェクトの自動変換」**という機能にある。

ラッパーオブジェクトというのは、本来オブジェクト型でない値を、オブジェクトで包んで（ラップして）オブジェクトとしての振る舞いを持たせるというものである。

つまり、

```js
str.toUpperCase();
```
この様に、string型のデーターに対し、オブジェクトとしての振る舞いを要求された時は、ラッパーオブジェクトで自動的に包んで、実行されるのである。

```js
str.toUpperCase();
```

この時

```js
(new String(str)).toUpperCase();
```

この様に自動的に、string型に対応するオブジェクトであるStringからインスタンスが作成され、関数を呼び出している。(Stringオブジェクトは、toUpperCaseメソッドを保有している。）

実際、開発者はこの自動変換を意識せずともコードは書くことができるので、string型もオブジエクとして扱うことができる。

つまり
###JavaScript におけるデータは「すべてオブジェクトである」のではなく、ラッパーオブジェクトのおかげで、「全てのデーターはオブジェクトのように振舞うことができる」と言うことなんですね。
[Elixir] プロセス使用を検討する基準

この記事は [Elixir その2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir2) 17日目です。

前日は、「[[Elixir] GenServerのアイドルタイムアウト](https://qiita.com/mnishiguchi/private/1bcef0e91a413879d79a)」でした。

## はじめに

さて、Elixirはプロセスが軽量でGenServerを用いて手軽に扱えAWESOMEです。
ですが、OOPになれたプログラマがGenServerを使ってると、無意識にプロセスをOOPのオブジェクトのように使いがちです。
また、Elixirで簡単に並行処理ができるといって、何でも並行処理にすればよいというわけでもないはずです。

その辺に警鐘をならす方々がいます。

## Elixir作者のJose Valimさん

> [... what the GenServer is giving us besides adding a potential bottleneck? If the concern is code organization, then modules and functions are the correct level to address it, not processes.](https://elixirforum.com/t/task-start-vs-tasksupervisor/26718/5?u=mnishiguchi)

「なんのためにGenServerを使ってるの？何かボトルネックでもあるの？もし、ただコードと整理したいだけなんやったら、モジュールと関数で解決できるやん。別にプロセス使わなくても。」

## 「Elixir in Action」著者のSasa Juricさん

> [So, can we manage a complex state in a single process? We certainly can! Simple functional abstractions ... allowed me to separate concerns of a more complex round state without needing to resort to agents. That doesn’t mean we need to be conservative with processes though. Use processes wherever they make sense and bring some clear benefits.](https://www.theerlangelist.com/article/spawn_or_not)

「ひとつのプロセスで複雑な状態管理できるのか。確実にできますよ。単純な関数による抽象化により、複雑な状態の関心事を分けることができます。プロセスを複数つかうことなく。だからといってプロセスをつかうなということではなく、プロセスをつかうメリットがある場合はどんどん使ったら良い。」

- プロセスをどう使用するかは、ランタイムの関心事である。コードをどう整理するかではない。
- 専用のプロセスを検討するガイドライン
  - コードが長い間使用される場合。
  - コードが再利用可能な資源を扱う場合。（TCP接続、ファイル、データベース、OSプロセスへのパイプ等）
  - 重要なコードは同期させたほうがよい。たった一つの専用プロセスで処理する。

## さいごに

今後更に新しいことを学んだら随時内容も更新していこうと思います。

---

明日は「[[Elixir] GenServer.init関数で重い処理](https://qiita.com/mnishiguchi/items/c50fed098acd506d9559)」です。引き続き、Elixirを楽しみましょう。

Happy coding!

- [Elixir その1 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir)
- [Elixir その2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir2)
- [【毎日自動更新】QiitaのElixir LGTMランキング！](https://qiita.com/torifukukaiou/items/1edb3e961acf002478fd) by @torifukukaiou
githubを利用するのに必要な作業【sshキー登録編】

個人的なメモとして残しています。

#☆SSHkey登録の手順

1.鍵をいれるフォルダに移動
```$cd ~/.ssh```

2.鍵を生成
```ssh-keygen -t rsa```
なにか聞かれたらエンターを押しておけばok

3.Githubに公開鍵をアップロード
https://github.com/settings/sshへアクセス
titleは適当,keyに鍵の中身をペーストする

```pbcopy < ~/.ssh/id_rsa.pub```
windowsなら
```clip < ~/.ssh/id_rsa.pub```
Laravel 5.5 Storageファサードで画像ファイルを保存


URLから取得した画像ファイルをStorageファサードを使い
storage/app/public/下に保存した時に、少し詰まったのでメモ。

<h2>Storageファザードを使ってファイルを保存する方法</h2>
Storageファザードを使ってファイルを保存する方法は以下
公式リファレンスより抜粋
https://readouble.com/laravel/5.5/ja/filesystem.html


~~~php:readouble.com/laravel/5.5/ja/filesystem.html
use Illuminate\Support\Facades\Storage;

Storage::put('file.jpg', $contents);

~~~
Storage::put()を使うと、第一引数にファイル名、第二引数に保存したいファイルを入れます。
そうすると通常はstorage/app/public/内に画像が保存されます。

でも、保存先フォルダも指定したい！
という場合はこちら

~~~php:readouble.com/laravel/5.5/ja/filesystem.html
use Illuminate\Http\File;
use Illuminate\Support\Facades\Storage;

// 自動的に一意のIDがファイル名として指定される
Storage::putFile('photos', new File('/path/to/photo'));

// ファイル名を指定する
Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg');
~~~
引数はそれぞれ以下の通りです。
Storage::putFile(保存先, new File('ファイルのパス'));
Storage::putFileAs('保存先', new File('ファイルのパス'), ファイルの名前);



今回はファイル名も指定したい、保存先も指定したい、とのことで、
Storage::putFileAs()を使うことにしました。


<h2>詰まったところ。　ファイルのパスって？</h2>

Illuminate\Http\Fileのインスタンスの引数にファイルのパス指定しますが、
ファイルのパスの取り方が思いつかなくて少し考えました。

が、簡単にできました。

一時ファイルを使います。

~~~php:

//画像のURL
$url = 'https::example.com/img.jpg';
//URLからファイル名を取得 ここはお好きな方法でファイル名を決めてください。
$file_name = substr(strrchr($url,"/"),1);
//URLからファイル取得
$img_downloaded = file_get_contents($url);
//一時ファイル作成
$tmp = tmpfile();
//一時ファイルに画像を書き込み
fwrite($tmp, $img_downloaded);
//一時ファイルのパスを取得
$tmp_path = stream_get_meta_data($tmp)['uri'];
//storageに保存。
Storage::putFileAs('images', new File($tmp_path), $file_name);
//一時ファイル削除
fclose($file_handle);
~~~

ちゃんとstorage/app/public/images/下に保存できました！
publict直下に保存したい時は

~~~php:
Storage::putFileAs('', new File($tmp_path), $file_name);
~~~
フォルダの指定を空にすればOKです！

S3などのクラウドディスクにファイルを保存する場合もこの方法で大丈夫なのではないかとおもいます！
共同開発で学んだこと

私立探求学園というオンラインサロンで技求祭が行われました。
今回は共同でのアプリ開発となりました。

#1.技求祭とは
技術を探求するお祭り(ハッカソン)です。
テーマ・・・技術祭のテーマはコロナの中で便利に使えるアプリ
期間・・・5月初旬から8月末
白組、青組、紅組に分かれあるテーマをもとにアプリを共同開発しました。
私が所属している白組ではLaravel,Vue.jsでアプリを開発しました。

#2.メンバー構成(白組）
PM 1人
Laravelチーム　4人
Vue.jsチーム　 4人

#3.開発工程
①アプリ作成案
②画面遷移図
③デザインカンプ
④環境構築(Laravel 5.8　Vue.js　２．６)
⑤ER図
⑥開発

■4.アプリ作成案
白組ではOTOSHIという料理アプリを開発することにしました。

■5.OTOSHIの機能
・秒単位から10分以内で作れる料理のみに厳選
・オンライン飲み会でたべるおつまみ
・皆で同じメニューをつくり、いいねの数で競い合う

#6.画面遷移図
どんな画面があって、どのようにいったりきたりできるのか表す図
![白組アプリのサイトマップの叩き台 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471165/56ec41ff-2869-5d88-9a7a-81af8efe8351.png)

#7デザインカンプ
画面のデザイン完成図!
![iOS の画像 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471165/5ebb475d-905a-2bc6-2f44-df899b186500.png)
![iOS の画像 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471165/0545b314-e3f3-67b2-b617-375f1edf5655.png)
![iOS の画像 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471165/c3776e6b-4e26-94b2-393b-5fb6a6318995.png)
![iOS の画像 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471165/1a20bb0f-8caa-9789-187a-9855e603620f.png)
![iOS の画像 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471165/681109db-474f-8e24-520c-53d9233eec53.png)

#8.ER図
テーブル同士の関係を図で表したもの

![200621_ER図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471165/3c924fa7-6f22-ee5b-aaa0-ead9f4377d84.png)

#9.開発
Laravelチーム、Vueチームに分かれて開発。
勉強会を6月末まで1週間に1回行い、7月からタスクを割り当て本格的に開発に着手。

#10.発表
８月末に探求学園内（オンライン）て各組発表を行いました。
白組はそこで見事優勝することができました!

##発表で使われた資料
[技求祭](https://docs.google.com/presentation/d/1sn8j_euSTFZhbNxkGcm3yEbw_FWMIuEJgL0I5kWJ6dM/edit#slide=id.g94aa0693d6_1_330)

##OTOSHIアプリ完成品の動画
https://www.youtube.com/watch?v=nVFrVWLM-fg
[![IMAGE ALT TEXT HERE](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471165/5ebb475d-905a-2bc6-2f44-df899b186500.png)](https://www.youtube.com/watch?v=nVFrVWLM-fg)

#11.技求祭で学んだこと
・開発工程
・アイディアを形にする楽しさ
・共同開発することの難しさ

今回を通して自分たちでアイディアをだし、ものを作ることの楽しさを知ることができたのが一番の学びです。
ああでもない、こうでもないといいながらアイディアを形にするのはとても楽しかったです!
エンジニアになれて本当に良かったと思いました。
#12.反省点
・チームとしてタスクの進捗管理の見える化をしていなかった
・誰がどれくらいの時間開発に時間を割くことができるのか事前に把握していなかった
・皆で共有できるきちんとした議事録がなかった

#13.総括
まだまだ未熟もので、なかなか要件定義の部分から仕事で関わることが難しい中、環境と機会を与えてくれた私立探求学園は控えめに言っても最高だと思いました!
これからも私立探求学園で技術を探求し続けていきたいと思いました。
今回チームとしてアプリを作りましたが、技求祭を通して学んだことを活かして個人でアプリ草案から開発まで行いたいと思います。
【備忘録】Swift 実践入門について　第9章

Swift 実践入門のまとめ。
分からない部分の抜粋も記載し、解決できたら随時更新していきます。
なお、ここに記載している以外でも「わけわからん…」となっている部分も多々ありますが、
今は必要ない、と言い聞かせて飛ばしています。

第9章
プロトコル　仕様書のこと。その仕様書を適合したら、プロトコル内部のプロパティやメソッドは全部盛り込む必要があるため確認がしやすい。
理解度：40％くらいか

struct / class / enumが設計図、インスタンスが出来上がった実体だとすると、プロトコルは仕様書。可読性を高める効果がある。

9-3 プロトコルを構成する要素
プロトコル内ではletは使えないのでvarを使う。var A : String { get set }のような感じ。このgetとget setがよく分かってない。コンピューターサイエンスでお馴染みだからか、swiftで改めて丁寧な説明はないように感じた。まあgetはプロパティの取得(get)、get setでプロパティを取得し、具体的な値を代入(set)までするというイメージ。
【ES6】Rest演算子の使い方メモ【JavaScript】

## reduce()メソッドで引数の合計を計算する関数sum()を定義してみる

```js:app.js
function sum( ...theArgs ) {
  return theArgs.reduce((previous, current) => {
    return previous + current
  })
}
console.log(sum(1, 2, 3))

```
## 出力結果
>6
【JavaScript】なぜプリミティブ値にメソッドを生やせるのか(プリミティブ型とラッパーオブジェクトについて)

## はじめに
業務でJavaScriptを触り始めて約1年が経ちました。
業務開始 = JavaScript歴なので最近やっと実装に必要なことは多少複雑なものでも、調べつつ進められるというレベルになってきたと感じています。
とにかくタスクをこなすのに必死で、言語仕様の理解をおざなりにしていたので、改めて根本的なことから学び直しています。
TypeScriptも触り始めるようになり、内包されているJavaScriptについての理解がより必要だと思ったのもきっかけの一つです。

データ型について整理をする中で、プリミティブ値についておや??と思うことがありました。
(とても基本的なことですが)

## プリミティブ値
[MDN web Docs](https://developer.mozilla.org/ja/docs/Web/JavaScript/Data_structures) から引用。

>オブジェクトを除くすべての型は不変の値 (つまり、変更できない値) として定義されています。例えば文字列は（C 言語とは異なり）不変です。これらの型の値を、プリミティブ値と呼びます。

つまり```オブジェクトではない``` 全ての型の値がプリミティブ値です。
逆説的に言えば、
```プリミティブ値ではない```ものは全てオブジェクトです。

JavaScriptでは下記がプリミティブ値です。

- Number (ex: 123, -10, 0x, 0o, 0b, 1.23, 1.2e3)

- String (ex: 'abc', "efg", `hij ${hoge}`)

- Boolean (ex:true, false)

- Null (null)

- Undefined (undefined)

- BigInt (ex: 1n)

- Symbol (一意で不変のプリミティブ値)
※ シンボルの詳細は[こちら](https://developer.mozilla.org/ja/docs/Glossary/Symbol)

プリミティブ値の値を定義する時には、***リテラル***を使うます。
簡単にいうと、数値や文字列...etc のベタ書きです。

## プリミティブ値はオブジェクトではない

***プリミティブ値はオブジェクトではない*** ということはインスタンスメソッドも持たないということです。
へぇ〜。と思っていましたが、違和感を持ちました。

```javascript

const pri = 'Qiita'.indexOf('Q',0 ,1);
console.log(pri); // 0
```

```'Qiita'``` は文字列リテラルでプリミティブ値です。
なのに```indexOf()```メソッドが使えます。

??
プリミティブ値はオブジェクトではない
インスタンスメソッドも持たない

なんでメソッドか使えるのでしょうか....。

### プリミティブ値からラッパーオブジェクトへの自動変換

文字列リテラルとString型を比較をしてみます。

```javascript

const a = 'Qiita';

const b = new String('Qiita');

console.log(a === b); // false

console.log(a === b.valueOf); true
```

単純に```a === b```でプリミティブ値の```a```とString型の```b```を比較するともちろん一致しません。

```a === b.valueOf```という比較では、オブジェクトが持つvalueOf()が指定したオブジェクトのプリミティブ値を返すので一致します。


JavaScripteではプリミティブ値に対してアクセスするときに、
それぞれに対応する```ラッパーオブジェクト```に自動変換されます。

先ほどの```'Qiita'.indexOf('Q',0 ,1)```は

```javascript

'Qiita'.indexOf('Q',0 ,1);
```

↓

```javascript

(new String('Qiita')).indexOf('Q',0 ,1);
```

文字列リテラルというプリミティブ値から、Stringオブジェクトに自動で変換されます。

```'Qiita'``` が```indexOf()```メソッドを使えるのは、変換後のStringオブジェクトとしてインスタンスメソッドを実行しているためです。

このようにプリミティブ値に対応するオブジェクトに変換されるため、
リテラルでもメソッドが使えるようになります。

## 最後に
ものすごく初歩的なことですが、とりあえず書ければいいという段階から抜け出すためにこれからも言語仕様の理解に勤しみたいと思います。

理解が浅い部分があるかと思いますが、最後まで読んで頂きありがとうございました。
3人いるならラウンドロビン設計

# はじめに
* いろんな人の経験値や知識に依存する設計。それを探求するためには、多くの時間と経験を要すると思います。
* それを効率良く吸収するための、面白いアクティビティを発見したので記事にします。

# ラウンドロビン設計とは
**参加者が設計のアイデアをスケッチとして作成し、そのスケッチを共有・批評する設計手法の１つです。**

もう少し噛み砕くと、ある課題解決のための設計をスケッチし、参加者内でそのスケッチぐるぐる回し設計を強化・共有するアクティビティです。

## メリット
* 参加者は自分自身のアイデアに加えて、新しいアイデアを得られます。
* 意図しない組み合わせの機会の創出に繋がります。
* 異なる可能性のあるアイデアで合意をとれます。
* 参加者間での考え方の違いもしくは類似点を共有できます。


## 実践方法
### 参加者
* 少なくとも3人必要。
* 12人以上になってくると会話が崩壊するそうです。笑

### 所要時間
* 15分~45分くらい

### 使用するもの
* A4くらいの用紙
* 3色ペン

### 進め方
(1) すべての参加者が5分間でスケッチをする。
(2) スケッチを左の人に渡す。
(3) 違う色のペンで5分間スケッチをを批評する。
(4) スケッチを左隣の人に渡す。
(5) 違う色のペンを使用して、先ほどの批評によって識別された弱点を改善する設計になるような改善案を記載する。
(6) スケッチを作者に戻し、批評・改善案をまとめ参加者同士でレビューを行う。

![議論図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/eb231070-eb29-bc8f-4fe8-10d63011a4ef.png)


# 参考文献
Design Itには他にも様々な設計手法が記載されています。
是非興味があればお読みいただけると面白いと思います。
[Design It! ―プログラマーのためのアーキテクティング入門](https://www.amazon.co.jp/Design-%E2%80%95%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-Michael-Keeling/dp/4873118956)
変数名を一括で変換するプログラム

## 変数名を一発で変換したい
環境によってはηやδが使えないときってありますよね。
そんなときにtxtで保存したソースコードの指定した一文字の変数を変換してくれるヤツです。

```python:replace.py
with open('source_code.txt', mode='rt', encoding='utf-8') as f:
    data = list(f)

target = ""
replace = ""

replaced = []
for i in range(len(data)):
    if target in str(data[i]):
        replaced.append(str(data[i]).replace(target,replace))
    else:
        replaced.append(str(data[i]))
replaced = ''.join(replaced)

with open("replaced.txt",mode = "w",encoding='utf-8') as f:
    f.write(replaced)

```

## (追記)もっと簡潔に書けました。

ファイルから読みだしたデータは文字列なのでforループで回す必要無かったです。
@shiracamus 様ありがとうございます。

```python:replace.py
with open('source_code.txt', encoding='utf-8') as f:
    text = f.read()

target = ""
replace = ""
replaced = text.replace(target, replace)

with open("replaced.txt", "w", encoding='utf-8') as f:
    f.write(replaced)

```
[Rails]twilioでSMSを送信する

# tiwilioでサインアップする
https://jp.twilio.com/try-twilio
まずは会員登録をしましょう。
テストであれば無料で使えます。

### 必要な情報を入手

**TRIAL NUMBER**、**アカウントSID**、**AUTHTOKEN**を入手しましょう！
(consoleのトップ画面に表示されています。)

# gemをインストール

```Gemfile
gem 'twilio-ruby'
```

# コード作成

### モデルを作成

```message.rb
class Message
  def initialize(tel:)
    @tel = tel
  end

  def hello(user:)
    @message = "#{user.name}さんこんにちは"
    send
  end

  private

  def send
    @tel = "+81" + @tel.slice(1..11)
    account_sid = ENV['TWILLIO_ACCOUNT_SID']
    auth_token = ENV['TWILLIO_AUTH_TOKEN']
    @client = Twilio::REST::Client.new account_sid, auth_token
    @client.messages.create(
        from: ENV['TWILLIO_PHONE_NUMBER'], # TRIAL NUMBERを入力
        to: @tel,
        body: @message
    )
  end
end
```

### コントローラーを設定

```users_controller.rb
def send_sms
    user = User.first
    message = Message.new(tel: ENV['YOUR_PHONE_NUMBER']) # twilioに登録した電話番号
    message.hello(user: user)
end
```

### 完成です！
Ruby on Railsのbundle installで躓いたときの解決法



#はじめに
Ruby on Railsチュートリアルにて初めてのアプリケーションを作成していたところ、bundle installが上手くいかずエラーが出ました:sob:



ある方法を試したところ、無事この画面に辿り着けました！
![riding_rails.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864329/1046d34c-b314-aeb3-eb42-7b2e9c2dcdbd.png)
今回、私が試した方法をご紹介します。

#何があった
Ruby on Railsチュートリアル第1章で、hello_appディレクトリにbundleをインストールしようとしたところ

```
$ bundle install
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. 
```
と出てしまい、インストールされなかった模様。




#どうする？
色々探してみた結果、今回は[こちらのサイト](https://code-schools.com/ror-bundleerror/)を参考に、
**Gemfile.lockのファイルを削除する**
という方法を取ってみることにしました。

ざっくりまとめると、バージョンのちょっとした違いによってかかってしまうlockを一旦解除する、ということなのかなと解釈しました。

#どうやった？
Gemfile.lockはファイルナビゲーターのhello_appディレクトリ内にありましたので、右クリック→ Deleteで削除。

これだけです。

ちなみにGemfile.lockに関しては削除しても再度bundleをインストールするとまた作成されるとのことです。無惨様かよ。

#こうなった
そして改めて

```
$ bundle install
```


すると・・・


```
$ bundle install
Fetching gem metadata from https://rubygems.org/............
```

おぉっ！さっきとは文章が変わった！！


そしてPreview → Preview Running Appricationで
画面を表示させてみると・・・

![riding_rails.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864329/1046d34c-b314-aeb3-eb42-7b2e9c2dcdbd.png)

はい、出ました！:pray:パチパチ


#まとめ

**bundle install 時のエラーは、Gemfile.lockファイルを削除することで解消できる場合がある。**

です。
間違ってたらごめんなさいw
if文について

# 最初に

**カレンダー企画2020の12日目**
プログラミングの勉強を始めて3ヵ月程経ったので学んだことのメモをアウトプットとして記事に残します。
これからプログラミングの世界に入る人の手助けになれたら嬉しい限りです。
間違っていたり、言葉が違っていたり、誤解されるような言葉があったら教えてください^^
言葉を長々と読みづらかったら申し訳ありません。少しずつなれてがんばります。

## if文についてまとめてみる

### if文？？

if文とは、「もしAならBを実行、AでないならCを実行」といったように、条件や状況に応じて実行内容を変える条件分岐で使用するもの

書き方と言葉で表すと、、、

```Terminal
if 条件
 処理
end
```

これは
条件に当てはまるなら真の処理が実行されます。
条件に当てはまらないなら処理が行われない。

ここで条件を記述する上でさまざまな条件をつける為に「比較演算子」「論理演算子」があるのでまとめていきます。


### 比較演算子

```ruby
<   #右辺の方が大きい
<=  #右辺の方が大きい、または等しい（ "≦" これと同じだと私は認識しています。）
>   #左辺の方が大きい
>=  #左辺の方が大きい、または等しい（ "≧" これと同じだと私は認識しています。）
```

右辺と左辺を比較してそれに伴って処理を変える時に使う。


### 論理演算子

```ruby
!   #否定
&&  #両方の条件が正しいならtrue（ "and" という意味ですね。）
||  #片方の条件が正しいならtrue（ "or" という意味ですね。）
==  #右辺と左辺が等しい（数学でいう "=" という意味ですね。）
!=  #右辺と左辺が等しくない（数学でいう "≠" という意味ですね。）
```

私は比較演算子や論理演算子を自分の認識（カッコ内）で置き換えて少し覚えやすくしました！



### elsif / else

これはifを記述する時によく出てくるもので意味としては、
if文の条件に合わなかった時（false）で行う処理を設定できる。

```ruby
if 条件
 処理A
else
 処理B
end
```

「条件がtrueならば処理Aを行う。falseならば処理Bを行う。」


```ruby
if 条件1
 処理A
elsif 条件2
 処理B
elsif 条件3
 処理C
.
.
.
elsif 条件n
 処理x
else
 処理z
end
```

elseでは1つの条件に対して条件分岐を行いましたが、
elsifでは条件を無限に書くことができます。（感覚的にif文をたくさんつなげて1つにまとめた！みたな）


## 最後に

if文についてまとめてみました。他にも条件分岐という観点ではたくさん書き方があるようです。
個人的にif文が苦手で使いこなせるまで時間がかかったのでまとめて整理しました。
django.db.migrations.exceptions.CircularDependencyError エラーの回避方法

# 原因
この循環依存エラー**"CircularDependencyError"**は、異なるアプリケーションのマイグレーションファイルがお互いのモデルを外部参照している場合に発生する模様。

# エラー例

二つのアプリ"app1","app2"でお互いのモデルをForeignKeyでリレーションしているとき

```python:app1/models.py
from django.db import models

class model_A(models.Model):
    id = models.AutoField( primary_key=True )
   
class model_B(models.Model):
    id = models.AutoField( primary_key=True )
    app2_a_model = models.ForeignKey('app2.model_A', on_delete=models.CASCADE)
```

```python:app2/models.py
from django.db import models

class model_A(models.Model):
    id = models.AutoField( primary_key=True )
   
class model_B(models.Model):
    id = models.AutoField( primary_key=True )
    app1_a_model = models.ForeignKey('app1.model_A', on_delete=models.CASCADE)
```

makemigraionsを実行すると

```bash
python manage.py makemigrations app1
python manage.py makemigrations app2
```

お互いに依存しあったマイグレーションをファイルが出来上がり

```python:app1/migrations/0001_initial.py
    ...
    dependencies = [
        ('app2', '0001_initial'),
    ]
    ...
```

```python:app2/migrations/0001_initial.py
    ...
    dependencies = [
        ('app1', '0001_initial'),
    ]
    ...
```

CircularDependencyErrorが発生する。

```
django.db.migrations.exceptions.CircularDependencyError: app1.0001_initial, app1.0001_initial
```

# 解決策
アプリの役割を整理して循環依存状態を解消するのが良いかも知れないが、ここでは循環依存状態のままマイグレーションを成功させる方法を模索。

一つ分かっている事は、アプリ同士のモデルが依存し合っていても、依存先のマイグレーション世代が異なればCircularDependencyErrorは発生しない。

そこで一時的に循環依存状態を解消してマイグレーションファイルを作成してから循環依存状態に戻し次の世代のマイグレーションファイルを作成する事に。

手順としては、
 
* app1のmodel_Bモデルのリレーション先を'app2.model_A'からダミーモデル'Dummy_model'に変更してapp1 をmakemigraions
* app2をmakemigraions
* app1のmodel_Bモデルのリレーション先を元に戻してapp1をmakemigraions


```bash
# 循環依存解消 
cp -pi app1/models.py app1/models.py.ori
sed "s/'app2.model_A'/'Dummy_model'/" app1/models.py.ori > app1/models.py
# ダミーモデルを追記
cat >>app1/models.py <<'__EOF__'
class Dummy_model(models.Model):
    id = models.AutoField ( primary_key=True )
__EOF__
python manage.py makemigrations app1
python manage.py makemigrations app2
# app1のmodel_Bモデルのリレーション先を元に戻す。
mv -f app1/models.py.ori app1/models.py
python manage.py makemigrations app1
# マイグレーションを実行
python manage.py migrate
```

これでmigrateを実行するとエラーが解消される。

makemigration実行時に、特定フィールドやテーブルだけ除外する方法は、無かった。
もっとスマートな方法はないだろうか？
Windowsで入力している￥は \（バックスラッシュ）

***Windows OS***で通常入力したり表示している ```¥```は ```\（バックスラッシュ）0x5C ```です。

| Unicode | 文字コード |
| ------- | ---------- |
| \（バックスラッシュ）       | U+005C       |
| ¥（円記号）       | U+00A5       |

なんで```\```を入力しているのに、```¥```と表示されるか？
日本語フォントが ```\```を表示上 ```¥``` で変換して表示しているため
※欧米フォントはバックスラッシュをそのままバックスラッシュで表示している

Arialなどの欧米フォントは ```\```
メイリオやMS ゴシックなどの日本語フォントは ```¥```

下記サイトで自分のPCから使えるフォントでの表示を見比べれる。
操作方法：テキストボックスに ```\```を入力してEnter
https://wordmark.it/

# Mac OSだとどうなるか？
```¥```は そのまま ```¥（円記号）0xA5```で入力される
```Option + ¥```で ```\（バックスラッシュ）0x5C```を入力できる。
[参考：Macにおけるバックスラッシュ（\）の入力方法 - Qiita](https://qiita.com/miyohide/items/6cb8967282d4b2db0f61)

# きっかけ
Mac Bookで　JavaScriptの正規表現での置換で、エスケープシーケンスをWindowsでコーディングしている時と同じ感覚で入力していたため

```javascript:エラー例
var str = 'filename.txt';
var str = str.replace(/¥.txt/g, '.csv'); // この行のようにコーディングしてしまった
console.log(str);
```

```javascript:上記エラーを正常へ書き直した例
var str = 'filename.txt';
var str = str.replace(/\.txt/g, '.csv');
console.log(str);
```

# 歴史的経緯

## 国際標準と日本標準のずれ
一番最初の文字コードが[ISO/IEC 646](https://ja.wikipedia.org/wiki/ISO/IEC_646)で、IEO/IEC 646を元に各国語版の文字コードが定義されました。
アメリカがASCII、日本がJIS X 0201（初期Shift-JIS）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136617/56ab3dd0-69c8-0a96-a6d8-e00628729be9.png)

| 文字コード種類 | 文字コード | 文字名称               | 
| -------------- | ---------- | ---------------------- | 
| ASCII          | 0x5C       | \ （バックスラッシュ） | 
| JIS X 0201     | 0x5C       | ¥（円記号）            | 


> [ASCII - Wikipedia](https://ja.wikipedia.org/wiki/ASCII#ASCII印字可能文字)
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136617/8017f47c-d8a3-5759-e06d-129917f22afa.png)
> [JIS X 0201 - Wikipedia](https://ja.wikipedia.org/wiki/JIS_X_0201#%E3%83%A9%E3%83%86%E3%83%B3%E6%96%87%E5%AD%97%E7%94%A8%E5%9B%B3%E5%BD%A2%E6%96%87%E5%AD%97%E9%9B%86%E5%90%88)
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136617/5b94f3a4-4c7b-02ea-a290-580b51aebda3.png)

## WindowsOS　内部コード変換時の対応
Windows 95, 98 → ShiftJIS
Windows NT 4.0以降 → Unicode
とWindows NT以降はShiftJISからUnicodeへ文字コードが変わっています。

今までShiftJISで書いていた ```0x5Cの¥```が二つの意味を持っておりそれを振り分けることが難しいという課題があった。
・制御コードとしての```\（バックスラッシュ）0x5C```?　
・通貨単位などを表すための円記号なのか？

課題の現実的な解決策として、内部の文字コードは変換せずに ```0x5C```のまま、マイクロソフトの日本語フォント ```0x5C```を円記号として表示することで表面上の問題が起きないようにした。

> [円記号 - WikipediaのUnicodeが持つ問題（円記号問題）一部](https://ja.wikipedia.org/wiki/%E5%86%86%E8%A8%98%E5%8F%B7#%E7%8F%BE%E5%AE%9F%E7%9A%84%E8%A7%A3%E6%B1%BA)
> 多くの日本語JISキーボードでは円記号とバックスラッシュのキーが別々に存在しているが、どちらを入力しても005Cが入力されるようになっている。結果、JISからの変換やキーの入力は005Cに統一され、これらのフォントを用いる限り円記号が表示されるようになっている。
UdemyのおかげでAWS Cloud Practitionarに合格できた話


先日AWS Cloud Practitionarに合格したのですが、いくつか勉強教材があったうち、主にUdemyの [「この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）」](https://www.udemy.com/course/aws-4260/)が最も役に立ったので、この講座を有効活用する方法について書きたいと思います。

#勉強教材リスト

###★使ったもの
- 参考書として①：[図解即戦力 Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書](https://amzn.to/2Kd440G)
    - 参考書として使った図解即戦力～の本は、決してAWS Cloud Practitionar受験向けに書かれた本ではないのですが、「AWSのいちばんわかりやすい本です！」と名売ってるだけあって、**めちゃくちゃ分かりやすいです。** AWS初心者の方で、これからCloud Practinar目指されるのであれば、これ一択じゃないかなと思うくらいです。イラストも豊富、全編カラーですごく読みやすいです。ただし、書かれてることは結構概要レベルなので、読むなら一言一句漏らさぬ！くらいの勢いで読み込むことが必要です。
    
- 参考書として②：[AWS Cloud Practitionar 公式トレーニング](https://www.aws.training/Details/Curriculum?id=34408)
    - 丸8時間くらい時間がかかったのであまり乗り気ではありませんでしたが、一応AWS公式の無料トレーニング（eLearning）も見ておきました。
- 問題集として①：Udemy [この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）](https://www.udemy.com/course/aws-4260/)
    - Udemyの講座は、Cloud Practitionar合格体験記系のブログを読むと必ずと言ってよいほど登場する、合格へのバイブルだと思ってます。詳細は後述。
- 問題集として②：AWS公式 Cloud Plractitionar模擬試験
    - 色んな方のブログを読みましたが、模擬試験については受ける受けないで賛否が分かれてますね。悩みましたが、ここで2000円ケチって本番試験で10000円損するよりは、投資だと思って私は受けておくことにしました。これも絶対受けてよかったです！本番のテスト環境や、レベル感が体験できます。おすすめです。



###★使わなかったもの
- 巷ではよく、[AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー](https://amzn.to/3oNIFdB)こちらの本がよくオススメされているのですが、白黒印刷で文字ばっかり&章末の試験問題が微妙・・・と感じたので、買っては見たもののほとんど開いてません。。好みが分かれると思いまます。カラフルなテキストのほうが好き♪という方は上記図解即戦力～をオススメします。

個人的には、[AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー](https://amzn.to/3oNIFdB)を買うお金があるなら、**絶対にUdemyの講座を買った方がいいです！！！！！**

#Udemy講座のすばらしさ

この講座の素晴らしいところは以下です。

- 解説が超丁寧！
- 問題数が豊富！
- レベル感が本番の問題にあってる！
- 復習しやすい構成！

まず解説が超丁寧！ですが正しい選択肢のみの説明だけでなく、他の選択肢がなぜ間違いだったか？ひっかかりやすいポイントはどこか？を分かりやすく解説してくれています。似たような問題であっても、解説は省略せずに書いてあるので助かります。

次に問題数が豊富！ですが、1回分の試験を7種類解けます。内容もランダムで重複が多いわけでもないので、準備においては非常に役に立ちます。**ちなみに、私は基本①、基本②、応用①しか解きませんでした。**理由は、応用②になった瞬間1問目から何もわからなかったからです。笑　とりあえず数問解いてたのですが全く分からず、見なかったことにしてすっと画面を閉じました。

他のブログでは本番の内容は応用①より難しく応用②より簡単と書いてるものもあったので不安だったのですが、**とりあえず基本①、②、応用①をそれぞれ90%以上回答できるようになってれば、それでも合格できました。**当日のスコアは934/1000だったので、ぎりぎりというわけでもなかったです。**応用②を解くかどうか悩んでる方がいれば、それより前の３回分を完璧に解けるようにして、AWS公式の2000円の模擬試験もカバーしておくことをお勧めします！**

レベル感が本番の問題にあっている、については、実際に基本①基本②応用①を解いておけば合格できたので、有難いレベル設定だったなという感じです。

最後に、復習しやすい構成！ですが、これはこの講座に限らずUdemyの仕様だと思いますが、その問題を解いた回数ごとに結果が記録されていて、正答率は何%だったか？が表示され、不正解だった問題やフラグを付けた問題のみに絞って復習することができます。私はこの機能を活用して、各回4-5回解きました。

#おわりに

AWS Cloud Practitionar合格のために使った勉強教材と、その中のUdemy講座のすばらしさについでご紹介しました。
合格体験記はたくさんありますが、特にUdemyの講座買う？買わない？買ったけど、応用②以降の問題どうしよう・・・と不安になってる方の参考になれば嬉しいです。

外資系や海外転職にも有利なIT資格については以下の動画でも紹介してるので良かったらご覧ください！

https://www.youtube.com/watch?v=yBKF-nXyZ6c&t=42s



それではみなさんHappy Holidays!
ライブラリにドメイン駆動を適用するときはクラスが増えすぎないように注意しましょう

本記事では、とあるライブラリにドメイン駆動を取り入れた際の反省点について書きます。

# 変更点

- 2023/7/7：ライブラリに適用するという前提はこの問題において重要そうですので、タイトルにライブラリへの適用を明示しました。

# 注意点

- 仕事で書いていたプログラムのため、実際とは異なる対象を想定した例を使用して書きます。
- ソースコードの例は C++ で書きます。（C++ の文法が分からなくても意味が分かる程度になっているとは思います。）

# 例示用の問題

ここでは、実際に仕事で取り組んだのとは異なる次のような問題を例に挙げて書きます。

- 次のデータを使用してログイン処理を行いたい。
  - ユーザ名
  - パスワード

# 事象

上記のような問題に対して、ドメイン駆動をもとに以下のようなクラスを作ることにしました。

- 認証を行うサービスのクラス（AuthenticationService）
- 認証に必要なデータのクラス（AuthenticationRequest）
- ユーザ名のクラス（UserName）
- パスワードのクラス（Password）
- 認証結果のクラス（AuthenticationResult）
- 認証成功時に使用するセッションのクラス（Session）

ユーザ名とパスワードは文字列ですが、バリデーションの処理を後から追加できるようにクラス化することになりました。
その結果、ログインをするために次のようなソースコードを書くことになりました。

```cpp
Session authenticate(const std::string& name, const std::string& password) {
    AuthenticationRequest request = AuthenticationRequest(UserName(name), Password(password));
    AuthenticationService service = AuthenticationService();
    AuthenticationResult result = service.login(request);
    return result.session();
}
```

これの問題点は、ただログインを行うためだけに 6 つのクラスの API を確認しなければならないということです。開発していたのはライブラリのため、開発に関わっていない一般ユーザに上のソースコードを書かせる必要があります。（たとえ、このライブラリの入門者であったとしても。）
なお、実際には上記のような調子で何十個もクラスを書いたため、実装した私本人でも実装を確認しながらでなければ使えないという酷い状態になりました。

なお、「バリデーションの処理を後から追加できるように」と上で書きましたが、バリデーションの処理が入ることはないまま納品となりました。UserName, Password クラスは、ただ内部に C++ 標準の文字列型（std::string）を持つだけのクラスになりました。

# 反省

ドメイン駆動を取り入れるにあたって、名前の付く値を全てクラスにすると、クラスが増えすぎて管理できなくなります。本当にクラスでないといけないか考え、言語の標準の型で問題のない値をクラス化しないようにしましょう。例えば、上の例は、以下のように済ませることもできたはずです。

```cpp
Session authenticate(const std::string& name, const std::string& password) {
    AuthenticationService service = AuthenticationService();
    return service.login(name, password);
}
```

クラス化しなかった値を後からクラス化する必要が出てきた場合、API の変更により色々な箇所のソースコードを修正する必要があります。しかし、大量のクラスによる分かりにくい API を使用したソースコードを何度も書いたり、お客様も書けるように説明したりするのに比べれば、楽だったのではないかと思っています。

# まとめ

ドメイン駆動は多少クラスが増えやすい部分があります。クラスが増えすぎて使いずらいという状態にならないように、気を付けて設計を進めましょう。