OmniAICreator/Qiita-1.07M huggingface dataset:
ドメイン駆動設計入門で学んだこと #4

# はじめに

本記事は以下の書籍を読んで学んだことをまとめることを目的としています。
[前回](https://qiita.com/minoura_a/items/b449b108383502432a2a)の続きです。
[ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本 | 成瀬 允宣 |本 | 通販 | Amazon](https://www.amazon.co.jp/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E3%83%9C%E3%83%88%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E3%81%AE%E5%9F%BA%E6%9C%AC-%E6%88%90%E7%80%AC-%E5%85%81%E5%AE%A3/dp/479815072X/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=325IZJW8OL7R9&dchild=1&keywords=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88&qid=1593219430&sprefix=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3,aps,244&sr=8-1)

# 依存関係のコントロール

多くのオブジェクトに依存され、依存しているようなオブジェクトがあるとすると、少しの変更が多くのオブジェクトに影響してしまいます。
依存することは避けられないので、コントロールすることが必要です。
具体的なクラスや、具体的な技術要素への依存は、変化しやすかったり、ソフトウェアの柔軟性が落ちるたりするため、避けるべきです。（[前回記事](https://qiita.com/minoura_a/items/b449b108383502432a2a#%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E7%90%86%E7%94%B1)も参照してください。）
抽象的で変化しにくいインターフェースに依存することによって、ソフトウェアの柔軟性を保ち、また、インターフェースを実装するクラスを変更しても影響が出ないようにできます。

## 実装上の工夫

### ServiceLocatorパターン

事前にServiceLocatorオブジェクトに依存関係の解決先を登録しておき、必要になったらその場所でインスタンスを取得するパターンです。
オブジェクトのインスタンス化を行う実装が点在するのを防げるため、実装クラスを変更することになっても、変更箇所はServiceLocatorオブジェクトに依存関係の解決先を登録する箇所のみで済みます。

※一般的にServiceLocatorパターンではクラスを定義しただけでは、どのクラスと依存があるのかがわかりにくいため、アンチパターンと言われています。依存関係が見えないため、増えた際も気が付きにくく、テストもしづらいです。

### IoC Containerパターン

コンストラクタでDIできるようにし、依存するオブジェクトのインスタンス化をIoC Containerで行うパターンです。
ServiceLocatorパターンとは異なり、依存関係をコンストラクタ引数で受け取るため、依存関係が見えやすいです。また、依存関係が増えるときはコンストラクタ引数に増えるので、もしテストのリファクタをし忘れた際でも、コンパイルエラーとなり気が付きやすいです。

# ファクトリ

オブジェクトの生成を責務とするオブジェクトのことをファクトリと呼びます。

## ファクトリを使う理由

複雑なオブジェクトの生成をドメインオブジェクト内で行うと、その複雑な実装がドメインオブジェクトのコードに表れて、ドメインの意図が読み取りづらくなってしまうためです。
その生成処理自体をオブジェクトして定義することで、ドメイン層内に知識を収めつつ(複雑でドメインの意図がぼやけるからと言ってクライアント側に生成の責務を押し付けない)、ほかのドメインオブジェクトからは簡単に複雑なオブジェクトを生成できるようにします。

## ファクトリはいつ使うべきか

ひとつの指標として、コンストラクタでほかのオブジェクトを生成するようなコンストラクタが単純でなくなる場合が挙げられていました。
このオブジェクトのコンストラクタが変更された際に、すべての生成箇所の修正が必要になってします。他のオブジェクトをただインスタンス化するだけであっても、複雑さが増してしまいます。
なんでもファクトリで生成されるべきではないと思います。シンプルに生成できるのであればそれが一番良いと思います。ただ、ファクトリで生成することを一度考慮してみることが重要だと思いました。

# さいごに

ここまでお読みいただき、ありがとうございました。
長くなるので、#5に続きます。
休日に勉強したmysqlについて

# mysqlについて
- 起動方法
    - 複数のやり方がある。
    - ubuntuの場合は、/etc/init.d/mysql を実行しているっぽい。
    - たたき方は、ここまでのパスを通すか、service mysql ってやる感じらしい。
        - 余談：serviceは、/etc/init.dにあるシェルスクリプトのファイルを指定することで、シェルを実行してくれるもの

init.d 配下はmysqldだったり、mysqlだったりと、色々とパターンがあるらしいので使うときは注意が必要かも
catしか使えなかった人がless, more, tail,headを知った。

# ぶっちゃけこの内容がすべてだと思った。
ファイルの中をのぞくコマンドたち。
色々あるけど、下記サイトにいい感じにまとまってた。

http://tooljp.com/windows/chigai/html/Linux/less-view-more-cat-vi-vim-chigai.html
tailはこっち
https://eng-entrance.com/linux-command-tail
headはこっち
https://eng-entrance.com/linux-command-head

# 結局、ファイルの中除くだけならlessが一番いい。
- 便利オプション
 - lessで開いたファイル内を検索（/[search_word]）
 - lessで開いたファイル内検索で一致した行だけ表示（&[search_word]）もう一度＆入力で抜ける
 - リアルタイムで表示（less +F ファイル名）

抜けるときはqを押す。

#思ったこと。
- 基本的にlinuxのコマンドたちである。
- dockerで立ち上げたubuntuにはlessが入ってないのでinstall必要
- ファイルの中除くだけならlessが一番便利
[100%] MinPerimeterRectangle (codility lessons)

_Lesson10_
## [Prime and composite numbers](https://app.codility.com/programmers/lessons/10-prime_and_composite_numbers/)

[Open reading material (PDF)](https://codility.com/media/train/8-PrimeNumbers.pdf)

> _Easy_
> ### [MinPerimeterRectangle](https://app.codility.com/programmers/lessons/10-prime_and_composite_numbers/min_perimeter_rectangle/)
> Find the minimal perimeter of any rectangle whose area equals N.


#### Task description

An integer N is given, representing the area of some rectangle.

The area of a rectangle whose sides are of length A and B is A * B, and the perimeter is 2 * (A + B).

The goal is to find the minimal perimeter of any rectangle whose area equals N. The sides of this rectangle should be only integers.

For example, given integer N = 30, rectangles of area 30 are:

* (1, 30), with a perimeter of 62,
* (2, 15), with a perimeter of 34,
* (3, 10), with a perimeter of 26,
* (5, 6), with a perimeter of 22.

Write a function:

```java
class Solution { public int solution(int N); }
```

that, given an integer N, returns the minimal perimeter of any rectangle whose area is exactly equal to N.

For example, given an integer N = 30, the function should return 22, as explained above.

Write an **efficient** algorithm for the following assumptions:

* N is an integer within the range [1..1,000,000,000].
* 
***

#### Code Walkthrough

```java
class Solution {
    public int solution(int N) {
        int i = 1;
        int minPerimeter  = Integer.MAX_VALUE;
        while (i * i <= N) {
            if (N % i == 0) {
                int A = i;
                int B = N / i;
                minPerimeter = Math.min(minPerimeter, 2 * (A + B));
            }
            i++;
        }

        return minPerimeter;
    }
}
```

#### Conclusion
* Detected time complexity: O(sqrt(N))
* Detected space complexity: O(log N)

[Codility Report](https://app.codility.com/demo/results/trainingYJZV3F-V7N/)

***
### See also: [CodilityのLessonsをすべて解く（更新中）](https://qiita.com/yp2211/items/537f733060bb0f2aba8f)
[100%] CountFactors (codility lessons)

_Lesson10_
## [Prime and composite numbers](https://app.codility.com/programmers/lessons/10-prime_and_composite_numbers/)

[Open reading material (PDF)](https://codility.com/media/train/8-PrimeNumbers.pdf)

> _Easy_
> ### [CountFactors](https://app.codility.com/programmers/lessons/10-prime_and_composite_numbers/count_factors/)
> Count factors of given number n.

#### Task description

A positive integer D is a factor of a positive integer N if there exists an integer M such that N = D * M.

For example, 6 is a factor of 24, because M = 4 satisfies the above condition (24 = 6 * 4).

Write a function:

    class Solution { public int solution(int N); }

that, given a positive integer N, returns the number of its factors.

For example, given N = 24, the function should return 8, because 24 has 8 factors, namely 1, 2, 3, 4, 6, 8, 12, 24. There are no other factors of 24.

Write an **efficient** algorithm for the following assumptions:

* N is an integer within the range [1..2,147,483,647].
***

#### Code Walkthrough
```java
class Solution {
    public int solution(int N) {
        long i = 1;
        int result = 0;
        while (i * i < N) {
            if (N % i == 0)
                result += 2;
            i++;
        }
        if (i * i == N) result += 1;

        return result;
    }
}
```

#### Conclusion
* Detected time complexity: O(sqrt(N))
* Detected space complexity: O(1)

[Codility Report](https://app.codility.com/demo/results/trainingPK74BK-RGW/)

***
### See also: [CodilityのLessonsをすべて解く（更新中）](https://qiita.com/yp2211/items/537f733060bb0f2aba8f)
[100%] MaxDoubleSliceSum (codility lessons)

_Lesson9_
## [Maximum slice problem](https://app.codility.com/programmers/lessons/9-maximum_slice_problem/)

[Open reading material (PDF)](https://codility.com/media/train/7-MaxSlice.pdf)

> _Medium_
> ### [MaxDoubleSliceSum](https://app.codility.com/programmers/lessons/9-maximum_slice_problem/max_double_slice_sum/)
> Find the maximal sum of any double slice.

#### Task description

A non-empty array A consisting of N integers is given.

A triplet (X, Y, Z), such that 0 ≤ X < Y < Z < N, is called a double slice.

The sum of double slice (X, Y, Z) is the total of A[X + 1] + A[X + 2] + ... + A[Y − 1] + A[Y + 1] + A[Y + 2] + ... + A[Z − 1].

For example, array A such that:

```
    A[0] = 3
    A[1] = 2
    A[2] = 6
    A[3] = -1
    A[4] = 4
    A[5] = 5
    A[6] = -1
    A[7] = 2
```    

contains the following example double slices:

* double slice (0, 3, 6), sum is 2 + 6 + 4 + 5 = 17,
* double slice (0, 3, 7), sum is 2 + 6 + 4 + 5 − 1 = 16,
* double slice (3, 4, 5), sum is 0.

The goal is to find the maximal sum of any double slice.

Write a function:

```java
class Solution { public int solution(int[] A); }
```

that, given a non-empty array A consisting of N integers, returns the maximal sum of any double slice.

For example, given:

```
    A[0] = 3
    A[1] = 2
    A[2] = 6
    A[3] = -1
    A[4] = 4
    A[5] = 5
    A[6] = -1
    A[7] = 2
```

the function should return 17, because no double slice of array A has a sum of greater than 17.

Write an **efficient** algorithm for the following assumptions:

* N is an integer within the range [3..100,000];
* each element of array A is an integer within the range [−10,000..10,000].
***

#### Code Walkthrough

```java
class Solution {
    public int solution(int[] A) {
        int[] prevSubSum = new int[A.length];
        int[] postSubSum = new int[A.length];

        for (int i = 1; i < A.length - 1; i++) {
            prevSubSum[i] = Math.max(0, prevSubSum[i - 1] + A[i]);
        }
        for (int i = A.length - 2; i > 0; i--) {
            postSubSum[i] = Math.max(0, postSubSum[i + 1] + A[i]);
        }
        int globalMaxSum = 0;
        for (int i = 1; i < A.length - 1; i++) {
            globalMaxSum = Math.max(prevSubSum[i - 1] + postSubSum[i + 1], globalMaxSum);
        }
        return globalMaxSum;
    }
}
```

#### Conclusion
* Detected time complexity: O(N)
* Detected space complexity: O(N)

[Codility Report](https://app.codility.com/demo/results/training6A8EBU-KK6/)

***
### See also: [CodilityのLessonsをすべて解く（更新中）](https://qiita.com/yp2211/items/537f733060bb0f2aba8f)
Docker + selenium + chromedriver のスクレイプ環境を構築する

# はじめに
seleniumとchromedriverを用いたスクレイプ環境をDockerコンテナ上で構築したので、そのやり方といくつかハマりポイントをまとめます。

今回動かしたかったライブラリはざっくり以下です。

```python
from selenium import webdriver
import chromedriver_binary
from selenium.webdriver.chrome.options import Options
```

# やり方
## Dockerfile

下記のサイトに記載されているDockerfileをお借りしました。
[Docker 内で Chrome とSelenium を使ったスクレイピング実行環境を構築してみた ](https://q-three.com/archives/1031)

## 実行、エラー
そのままdocker buildして、スクレイプを実行すると次のように怒られます。

```
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 93
```

このときインストールしたgoogle-chrome-stableのバージョンが92だったので、ChromeDriverのバージョンを92用にしても、なぜか同様のエラーが出ました。なぜonly supports version 93になってしまうのかわかっていないのですが、仕方ないのでgoogle-chromeをversion 93にしました。

## google-chromeのバージョン指定
この時点でversion 93はstable版ではありません。なので、次のようにgoogle-chrome-unstableをバージョン指定でインストールしました。

```dockerfile
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add && \
wget http://dl.google.com/linux/deb/pool/main/g/google-chrome-unstable/google-chrome-unstable_93.0.4577.18-1_amd64.deb && \
apt-get install -y -f ./google-chrome-unstable_93.0.4577.18-1_amd64.deb
```

バージョン名（93.0.4577.18-1）は以下のサイトで調べられます。希望するバージョン名を調べて、置き換えてください。

[Package "google-chrome-unstable"](https://www.ubuntuupdates.org/package/google_chrome/stable/main/base/google-chrome-unstable)

## chromedriverのバージョン指定
google-chromeのバージョンに合わせてchromedriverのバージョンも適切なものにします。下記サイトよりバージョンを選択して、"chromedriver_linux64.zip"のダウンロードリンクを取得します。

[ChromeDriver - WebDriver for Chrome - Downloads](https://chromedriver.chromium.org/downloads)

次のように、Dockerfileのchromedriverインストール部分のURLを変更してください。

```dockerfile
ADD https://chromedriver.storage.googleapis.com/93.0.4577.15/chromedriver_linux64.zip /opt/chrome/
```

# まとめ

最終的に、次のようなDockerfileになりました。

```Dockerfile.
FROM python:3

RUN apt-get update && apt-get install -y unzip wget vim

# google-chrome 変更部分①
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add && \
wget http://dl.google.com/linux/deb/pool/main/g/google-chrome-unstable/google-chrome-unstable_93.0.4577.18-1_amd64.deb && \
apt-get install -y -f ./google-chrome-unstable_93.0.4577.18-1_amd64.deb

# ChromeDriver 変更部分②
ADD https://chromedriver.storage.googleapis.com/93.0.4577.15/chromedriver_linux64.zip /opt/chrome/
RUN cd /opt/chrome/ && \
unzip chromedriver_linux64.zip

# python package
RUN pip install selenium && \
pip install bs4 && \
pip install oauth2client

ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/chrome
```

元記事様から、変更した部分をが２つありました。
こちらのDockerfileの、バージョン名を適宜変更すれば、環境構築に成功するのではないでしょうか。

# おわりに
最後までご精読ありがとうございました。
他の解決方法や、ChromeDriverのversionに関係なく`This version of ChromeDriver only supports Chrome version 93`になってしまう原因が分かる方いましたらコメントで教えて頂けますと幸いです。
[100%] MaxProfit (codility lessons)

_Lesson9_
## [Maximum slice problem](https://app.codility.com/programmers/lessons/9-maximum_slice_problem/)

[Open reading material (PDF)](https://codility.com/media/train/7-MaxSlice.pdf)

> _Easy_
> ### [MaxProfit](https://app.codility.com/programmers/lessons/9-maximum_slice_problem/max_profit/)
> Given a log of stock prices compute the maximum possible earning.

#### Task description

An array A consisting of N integers is given. It contains daily prices of a stock share for a period of N consecutive days. If a single share was bought on day P and sold on day Q, where 0 ≤ P ≤ Q < N, then the profit of such transaction is equal to A[Q] − A[P], provided that A[Q] ≥ A[P]. Otherwise, the transaction brings loss of A[P] − A[Q].

For example, consider the following array A consisting of six elements such that:

```
A[0] = 23171
A[1] = 21011
A[2] = 21123
A[3] = 21366
A[4] = 21013
A[5] = 21367
```

If a share was bought on day 0 and sold on day 2, a loss of 2048 would occur because A[2] − A[0] = 21123 − 23171 = −2048. If a share was bought on day 4 and sold on day 5, a profit of 354 would occur because A[5] − A[4] = 21367 − 21013 = 354. Maximum possible profit was 356. It would occur if a share was bought on day 1 and sold on day 5.

Write a function,

```java
class Solution { public int solution(int[] A); }
```

that, given an array A consisting of N integers containing daily prices of a stock share for a period of N consecutive days, returns the maximum possible profit from one transaction during this period. The function should return 0 if it was impossible to gain any profit.

For example, given array A consisting of six elements such that:

```
A[0] = 23171
A[1] = 21011
A[2] = 21123
A[3] = 21366
A[4] = 21013
A[5] = 21367
```

the function should return 356, as explained above.

Write an efficient algorithm for the following assumptions:

* N is an integer within the range [0..400,000];
* each element of array A is an integer within the range [0..200,000].
***

#### Code walkthrough

```java
class Solution {
    public int solution(int[] A) {
        if (A == null || A.length == 0) return 0;

        int k = 0, m = 0, p = 0;
        int k1 = 0;
        for (int i = 1; i < A.length; i++) {
            if (k1 > k) {
                if (A[i] < A[k1]) {
                    k1 = i;
                } else if (A[i] - A[k1] >= p) {
                    k = k1;
                    m = i;
                    p = A[i] - A[k];
                }
            } else {
                if (A[i] >= A[m]) {
                    m = i;
                    p = A[m] - A[k];
                } else if (A[i] < A[k]) {
                    k1 = i;
                } // else // A[k] <= A[i] < A[m]  do nothing
            }
        }

        return p;
    }
}
```

#### Detected time complexity:
O(N)

#### Detected space complexity:
O(1)

#### Report
[trainingR2THJ4-C9G](https://app.codility.com/demo/results/trainingR2THJ4-C9G/)

***
### See also: [CodilityのLessonsをすべて解く（更新中）](https://qiita.com/yp2211/items/537f733060bb0f2aba8f)
[100%] Nesting (codility lessons)

_Lesson7_
## [Stacks and Queues](https://app.codility.com/programmers/lessons/7-stacks_and_queues/)

[Open reading material (PDF)](https://codility.com/media/train/5-Stacks.pdf)

> _Easy_
> ### [Nesting](https://app.codility.com/programmers/lessons/7-stacks_and_queues/nesting/)
> Determine whether a given string of parentheses (single type) is properly nested.



#### Task description
***
A string S consisting of N characters is called properly nested if:

* S is empty;
* S has the form "(U)" where U is a properly nested string;
* S has the form "VW" where V and W are properly nested strings.

For example, string "(()(())())" is properly nested but string "())" isn't.

Write a function:

```java
class Solution { public int solution(String S); }
```

that, given a string S consisting of N characters, returns 1 if string S is properly nested and 0 otherwise.

For example, given S = "(()(())())", the function should return 1 and given S = "())", the function should return 0, as explained above.

Write an efficient algorithm for the following assumptions:

* N is an integer within the range [0..1,000,000];
* string S consists only of the characters "(" and/or ")".

***

#### Source code
```java
class Solution {
    public int solution(String S) {
        java.util.Stack<String> stack = new java.util.Stack();
        for (char c : S.toCharArray()) {
            String currentFlag = String.valueOf(c);
            if ("(".equals(currentFlag)) {
                stack.push(currentFlag);
            } else {
                if (stack.isEmpty() || !"(".equals(stack.pop())) return 0;
            }
        }
        return stack.isEmpty() ? 1 : 0;
    }
}
```

#### Detected time complexity:
O(N)

#### Report
[training5KXWDU-R3T](https://app.codility.com/demo/results/training5KXWDU-R3T/)

***
### See also: [CodilityのLessonsをすべて解く（更新中）](https://qiita.com/yp2211/items/537f733060bb0f2aba8f)
[100%] Brackets (codility lessons)

_Lesson7_

## [Stacks and Queues](https://app.codility.com/programmers/lessons/7-stacks_and_queues/)

[Open reading material (PDF)](https://codility.com/media/train/5-Stacks.pdf)

> _Easy_
> ### [Brackets](https://app.codility.com/programmers/lessons/7-stacks_and_queues/brackets/)
> Determine whether a given string of parentheses (multiple types) is properly nested.

#### Task description
***
A string S consisting of N characters is considered to be properly nested if any of the following conditions is true:

* S is empty;
* S has the form "(U)" or "[U]" or "{U}" where U is a properly nested string;
* S has the form "VW" where V and W are properly nested strings.

For example, the string "{[()()]}" is properly nested but "([)()]" is not.

Write a function:

```java
class Solution { public int solution(String S); }
```

that, given a string S consisting of N characters, returns 1 if S is properly nested and 0 otherwise.

For example, given S = "{[()()]}", the function should return 1 and given S = "([)()]", the function should return 0, as explained above.

Write an efficient algorithm for the following assumptions:

* N is an integer within the range [0..200,000];
* string S consists only of the following characters: "(", "{", "[", "]", "}" and/or ")".
***

#### Source code

```java
class Solution {
    public int solution(String S) {
        java.util.Map<String, String> charPairs = new java.util.HashMap<>();
        charPairs.put(")", "(");
        charPairs.put("}", "{");
        charPairs.put("]", "[");

        java.util.Stack<String> stack = new java.util.Stack();
        for (char c : S.toCharArray()) {
            String currentFlag = String.valueOf(c);
            if (charPairs.containsKey(currentFlag)) {
                // this is an ending flag
                if (stack.isEmpty()) return 0;

                String s = stack.pop();
                if (!charPairs.get(currentFlag).equals(s)) {
                    return 0;
                }
            } else {
                stack.push(currentFlag);
            }
        }

        if (stack.isEmpty()) return 1;

        return 0;
    }
}
```

#### Detected time complexity:
O(N)

#### Report
[trainingM8HRVS-HKZ](https://app.codility.com/demo/results/trainingM8HRVS-HKZ/)

***
### See also: [CodilityのLessonsをすべて解く（更新中）](https://qiita.com/yp2211/items/537f733060bb0f2aba8f)
[100%] Triangle (codility lessons)

_Lesson6_
## [Sorting](https://app.codility.com/programmers/lessons/6-sorting/)

[Open reading material (PDF)](https://codility.com/media/train/4-Sorting.pdf)

> _Easy_
> ### [Triangle](https://app.codility.com/programmers/lessons/6-sorting/triangle/)
> Determine whether a triangle can be built from a given set of edges.

#### Task description
***
An array A consisting of N integers is given. A triplet (P, Q, R) is triangular if 0 ≤ P < Q < R < N and:

* A[P] + A[Q] > A[R],
* A[Q] + A[R] > A[P],
* A[R] + A[P] > A[Q].

For example, consider array A such that:

```
A[0] = 10    A[1] = 2    A[2] = 5
A[3] = 1     A[4] = 8    A[5] = 20
```
Triplet (0, 2, 4) is triangular.

Write a function:

```java
class Solution { public int solution(int[] A); }
```

that, given an array A consisting of N integers, returns 1 if there exists a triangular triplet for this array and returns 0 otherwise.

For example, given array A such that:

```
A[0] = 10    A[1] = 2    A[2] = 5
A[3] = 1     A[4] = 8    A[5] = 20
```

the function should return 1, as explained above. Given array A such that:

```
A[0] = 10    A[1] = 50    A[2] = 5
A[3] = 1
```

the function should return 0.

Write an efficient algorithm for the following assumptions:

* N is an integer within the range [0..100,000];
* each element of array A is an integer within the range [−2,147,483,648..2,147,483,647].

***

#### Code walkthrough

```java
class Solution {
    public int solution(int[] A) {
        java.util.Arrays.sort(A);
        for (int i = 2; i < A.length; i++) {
            if ((long)A[i - 2] + A[i - 1] > A[i]) {
                return 1;
            }
        }
        return 0;
    }
}
```

#### Detected time complexity:
O(N * log(N))

#### Report
[training7535QW-VQY](https://app.codility.com/demo/results/training7535QW-VQY/)

***
### See also: [CodilityのLessonsをすべて解く（更新中）](https://qiita.com/yp2211/items/537f733060bb0f2aba8f)
分岐もややこしい演算も無しの、クラス定義だけで書くFizzBuzz

## はじめに

プログラムに携わって一度もFizzBuzz書いたことないなと思ったので、サクッと書いてみました。
せっかくなので保守性高めるようなコードの書き方を意識して、分岐なしのコードをクラス表現を使って実現しています

## コード

golangのinterfaceクラスにより処理を分け、mapにより分岐を削除しました。
ポリモーフィズムがあって、mapのようなkeyから設定値を取り出せるものがある言語 ~~であれば~~ はもちろん、無い言語でも配列をうまく扱うなどの工夫により、同様のコードが実現可能です

```golang:main.go
package main

import "fmt"

//FizzBuzzのパターン分けをするための構造体
type FizzBuzz struct {
	Fizz bool
	Buzz bool
}

//パターン網羅する為の構造体生成関数
func NewFizz() FizzBuzz {
	return FizzBuzz{Fizz: true, Buzz: false}
}
func NewBuzz() FizzBuzz {
	return FizzBuzz{Fizz: false, Buzz: true}
}
func NewFizzBuzz() FizzBuzz {
	return FizzBuzz{Fizz: true, Buzz: true}
}
func NewNumber() FizzBuzz {
	return FizzBuzz{Fizz: false, Buzz: false}
}

//こっちは各数字用の生成関数
func NewFizzBuzzWithNum(num int) FizzBuzz {
	return FizzBuzz{
		Fizz: isFizz(num),
		Buzz: isBuzz(num),
	}
}

func isFizz(num int) bool {
	return (num%3 == 0)
}

func isBuzz(num int) bool {
	return (num%5 == 0)
}

//Answerのパターンをinterfaceクラスの実装で分ける
type Answer interface {
	Answer(int)
}

type AnswerFizz struct {
}

func (a *AnswerFizz) Answer(num int) {
	fmt.Println("Fizz!")
}

type AnswerBuzz struct {
}

func (a *AnswerBuzz) Answer(num int) {
	fmt.Println("Buzz!")
}

type AnswerFizzBuzz struct {
}

func (a *AnswerFizzBuzz) Answer(num int) {
	fmt.Println("FizzBuzz!")
}

type AnswerNumber struct {
}

func (a *AnswerNumber) Answer(num int) {
	fmt.Printf("%d\n", num)
}

func main() {
	//FizzBuzzのパターンを登録
	fizzbuzzMap := map[FizzBuzz]Answer{
		NewFizzBuzz(): &AnswerFizzBuzz{},
		NewFizz():     &AnswerFizz{},
		NewBuzz():     &AnswerBuzz{},
		NewNumber():   &AnswerNumber{},
	}

	for i := 1; i < 50; i++ {
		//NewFizzBuzzで今の数字と対応するパターンを取得し、Answer()で実処理実行
		fizzbuzzMap[NewFizzBuzzWithNum(i)].Answer(i)
	}
}

```

[Go playground](https://play.golang.org/p/syU4r3g37Cg)

mapのない言語例として、Cの例を@fujitanozomu さんがコメントに追記してくれました。ありがとうございます！

## 最後に
FizzBuzz程度で保守性だのクラス定義だのしゃらくせえ！と思ったあなた。私もそう思います。
ただこういう簡単な仕様に対してどう実現しようか考えてみるのも、頭の体操になっていいんじゃないかななんて思いました
「ネ申Excel」、いや、「Excelネ申」だと思った話

弊社の仲間が書いた記事、[なぜ「ネ申Excel」は無くならないのか][1]を読んで思い出した話。
[1]:https://qiita.com/e99h2121/items/ef194c4fec579ec2c11c

既に有名なお方だと思いますが、**Excel上でドラクエ３を作った** 方がいるんです。

凄くないですか！？

https://nlab.itmedia.co.jp/nl/articles/2011/17/news169.html


以上、「ネ申Excel」、いや、「Excelネ申」だと思った話でした。
「メンバのお勧めの書籍を聞き、それを読む」ということ

# はじめに
私のチームのメンバに「新しく加入した○○さんにお勧めしたい書籍ある？」と尋ねてみました。
そのときに、チームメンバが紹介してくれた書籍を整理しておきます。
ちなみに、私のチームは組込みソフトウェア開発をしているチームです。

10年前の自分に伝えたいのは、『「メンバのお勧めの書籍を聞き、それを読む」という行為を続けてみなさい』ということです。
自分の師匠のお勧めの書籍を読むということはやっていましたが、「メンバのお勧めの書籍を聞き、それを読む」ということは意識的に実行できていなかったです。

# 所感
* 書籍を紹介してくれたのは、私が能力高いと思っているメンバだった。能力の高いメンバは書籍からも知識を得ている可能性が高い。お勧めの書籍を紹介できるか否かでメンバの能力の一部が把握できる可能性がある。
* 「メンバのお勧めの書籍を聞き、それを読む」という行為は効果的な可能性がある。
 * メンバの知識が分かる
 * 自分の知識が増える
 * 書籍内で使われている言葉を使って、認識の齟齬なく効率的に会話ができる

# 紹介書籍一覧
* CODE COMPLETE 第2版 上 完全なプログラミングを目指して
* CODE COMPLETE 第2版 下 完全なプログラミングを目指して
* リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
* アジャイルサムライ−達人開発者への道−
* Java言語で学ぶデザインパターン入門
* Clean Code アジャイルソフトウェア達人の技
* アジャイルなチームをつくる ふりかえりガイドブック 始め方・ふりかえりの型・手法・マインドセット
* コンピュータ・システム
* 達人プログラマー―システム開発の職人から名匠への道

※ちなみに、「コンピュータ・システム」と「達人プログラマー」については、メンバは原書のほうを紹介してくれた。

# 紹介書籍に関するデータ
|書籍|紹介者|私の既読書籍|
|:----|:----|:----|
|CODE COMPLETE 第2版 上 完全なプログラミングを目指して|F|〇|
|CODE COMPLETE 第2版 下 完全なプログラミングを目指して|F| |
|リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)|F,S|〇|
|アジャイルサムライ−達人開発者への道−|F|〇|
|Java言語で学ぶデザインパターン入門|F| |
|Clean Code アジャイルソフトウェア達人の技|S| |
|アジャイルなチームをつくる ふりかえりガイドブック 始め方・ふりかえりの型・手法・マインドセット|S| |
|コンピュータ・システム|Z| |
|達人プログラマー―システム開発の職人から名匠への道|Z| |


# 書籍へのリンク

https://bookmeter.com/books/503537

https://bookmeter.com/books/477133

https://bookmeter.com/books/5148925

https://bookmeter.com/books/4011251

https://bookmeter.com/books/557514

https://bookmeter.com/books/540591

https://bookmeter.com/books/17333782

https://bookmeter.com/books/12426733

https://bookmeter.com/books/105803

# 参考記事

https://zine.qiita.com/topics/2019-book-mailmagazine/

https://zine.qiita.com/topics/2018-book-mailmagazine/

https://qiita.com/kojimadev/items/0bf53b439f0cb4d1f7e3

https://qiita.com/kurkuru/items/97a90e3c267bd127af9b

# おわりに
メンバに紹介してもらった書籍の中に、私はまだ読んでいないものがあるので、読まなければいけない。

昔、先輩から「顧客や上司の席に置いてある書籍を読みなさい。顧客や上司が何を考えているか、何をやろうとしているか掴める。そうすれば、先回りして準備・提案ができる。」と教えられたことがある。これは、全然できていない。
顧客や上司の席に置いてある書籍も、読まなければいけない。

もちろん、師匠のお勧めの書籍も読まなければならない。
清水吉男さんの紹介されている書籍の中に、私はまだ読んでいないものがあるので、読まなければいけない。
※清水吉男さんのお勧めの書籍
https://affordd.jp/koha_hp/Books/BLIndex.html
pimpl idiom の pimpl の読み方

constexprに続き読めない系がありました。

https://qiita.com/h1day/items/fb3738737731d5b17ed5

20211003：コメント頂いたのを反映して追記しました。

# まとめ

- Pointer to Implementation の略
- 英語は素直に読む「ぴんぷる」。これは確定。
- 日本語は「ぴーいんぷる」？議論している様子が無いのは確定だからか、関心が薄いからか。**情報ください。**
- どうでもいいはずのことほど気になります。


# ぴんぷる

スペル通りの読み、pimple(にきび)にかけたダジャレだよねという気持ちだと思われます。
英語は大体こちらです。
頂いたコメントによると、（私もですが）ピンプルと読む人は別の読み方があると思ってないので、紹介が必要だと思わないようです。

https://www.youtube.com/watch?v=KOMl2p49rvo

https://www.youtube.com/watch?v=lETcZQuKQBs

https://youtu.be/D8eCPl2zit4?t=412

https://www.youtube.com/watch?v=02tHcPbyP2s

https://www.youtube.com/watch?v=jYThYohGMqw

> pronounced Pimple, this stands for Pointer to Implementation

https://skills.it.ox.ac.uk/files/itlcppg001notescpluspluscomprehensiveintroductionpdf

20211003ダジャレ説書いているもの探して追記しました。そしてやはり読み方は紹介せず。

>それに加え英語のpimple(にきび)をもじったものらしいです。

https://flat-leon.hatenablog.com/entry/cpp_pimpl


# ぴーいんぷる

Pointer と Implementationの2単語からできているので、音節を分けたいという気持ちだと思われます。
~~動画は見つけられなかったですが、~~ 発音について書かれている記事はこちらの方針です。
頂いたコメントによると、'I'が大文字の 'pImpl' で出会うと「ぴーいんぷる」と自然に読むようです。確かに!

http://dos-sonority.jugem.jp/?eid=1270

https://toolazydidnotread.com/pimplpointer-to-implementation-%E3%83%94%E3%83%BC%E3%82%A4%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A8%E3%81%AF/

https://cpp.aquariuscode.com/pimpl-idioms

@yumetodo さんに頂いた @YukiMiyatake さんの事例。[ニコニコ動画](https://live.nicovideo.jp/watch/lv220960718)は既に非公開。
脱線して普通にBoost.Asioを勉強させていただきました。

>発表文字起こし抜粋

>(前略)mplのvectorつかってるので、そこの定数を変えれば大丈夫とか、まあ、コンパイルは時間かかるのでピーインプル使おうねとか(以下略)

https://www.slideshare.net/chihayatakatuki/boost-asio

自分でも事例探しました。

https://www.youtube.com/watch?v=pfWPcrDvUPQ&t=901s
PowerApps 学習

#Dataverse

Dataverse についてさらに詳しく踏み込み、エンティティ間のリレーションシップの作成方法、ビジネス ルールを構築して組織のニーズに合わせたロジックを実行する方法、計算フィールドとロールアップ フィールドを追加する方法の概要について説明
「Dataverse の基本」ラーニング パスで説明されているトピックについての基本的な理解

モジュール:3

リレーションシップデータベースの構築
ビジネスルール 入力データの動的な割り当てが可能なルール作り可能


モジュール1-4~6 : 実際のデータベース構築可能
モジュール2-4：ビジネスルールを設定してテストまで行える
モジュール3-5：Dataverseのデータを使った計算フィールドを作成


実践的 4
面白さ 4
コスパ 4

#Common data
モジュール2
環境とエンティティに関連付けられているアクセス許可を管理する方法について説明されている
※このラーニング パスに含まれる機能や演習の多くは、環境内の管理者ロールのメンバーであることと、Power Apps の有効なライセンスを必要


Data verseは誰もが更新できる状況では混乱が生じる
適正なアクセス許可の制御が必要
管理者としてシステムを公開する上では必要な知識

加えて運用管理で利用する管理画面の説明と実践方法が記載

1-2,3,4：基本的なロールの概要と権限付与の操作方法

難しいが、結構有効というか必須か？


#Power Apps のキャンバス アプリ
モジュール:4

最良のアプリ ナビゲーションを作成する方法と、テーマ、アイコン、画像、パーソナル化、さまざまなフォーム ファクター、コントロールを使用して最良の UI を構築する方法

PowerAppsで重要なユーザーインターフェースで押さえておく基本的な内容が記載

モジュール1-4 : 基本関数 navigate, back の演習
モジュール2-2~6：アイコンやテーマ変更などが可能になる
モジュール3-2~6：基本的なコントロールの説明
モジュール4-：テストに関しての流れが記載

有用、結構面白い
実践的な内容

#基本的な数式を使用
モジュール:3

関数を使用して機能を改善し、Power Apps キャンバス アプリでの動作を変更

コントロール内の関数設定について具体例と共に記載されている
また、コントロール間の連携についても記載がある
データテーブルをPowerAppsに連携する方法についても記載あり


モジュール1 : 関数の紹介と使い方
モジュール2：コントロール間の連携方法
モジュール3：テーブルの表示と連携

実践的


#Power Apps のキャンバス
モジュール:3

データ ソースに接続する方法を示します。 フィルター処理、条件、およびその他の関数を使用してデータを成形し、データ ソースにデータを書き込む方法

データソースを設定する方法が実践を通して学ぶことができる
データをアプリに読み込み、アプリで活用、データ側への書き込みの一連を学ぶことができる

モジュール1:データの読み込み方法
モジュール2:データのアプリ上での利用方法
モジュール3:データの書き込み方法
【デザインの基礎を学ぶ②】良いサービス開発のために「誰のためのデザイン」を読む

#はじめに
個人アプリ開発のためにデザイン基礎を学んでいます。この記事は前回の「 よいサービス開発のためにデザインの基礎を学ぶ「誰のためのデザイン」を読んで。」の続きです。

#第1章のおさらい
・良いデザインの特徴は「発見可能性」と「理解」である。
・誰もが間違えるという前提のもとデザインせよ。
・ユーザーを観察せよ。
・アフォーダンスとシグニファイヤを意識せよ。
・脳で考えなくて良い設計をせよ。
・フィードバックに気を配ろう。
・概念モデルを意識した設計をせよ。
・ユーザーとデザイナーの概念モデルは大概ずれていると心得よ。
・良いデザインに必要なのはマネジメントスキルである。


#第2章のポイント
第2章の主題は「人はものごとをどのようにして行っているか？」です。

#人間は実行と評価を重ねて行動を行っている
人が行動するのは何らかのゴール（目的）を達成するため。

例えば、別の部屋に移動するというゴール（目的）を達成したいと思った時、私たちは近くのドアを開けて別の部屋に移動するでしょう。その時の私たちは無意識のうちに、実行と評価を行っています。

実行　→ ドアを押して隣の部屋へ移動する。
評価　→ ドアを押すと開くことができた。開くことで別の部屋に移動できた。

#人の行動のメカニズム
また本書では人間が何かを思ってから行動に移すまでの段階が紹介されています。

まず最初の実行フェーズでは、ゴール設定、プラン、詳細化、実行。
評価フェーズでは、知覚、解釈、比較、と書かれています。

私たちが他者の何らかの課題を解決するためには、上記の流れを意識して表面的な解決策ではなく根本的な解決策を提示する必要があります。

#行為に対しての人間の認知
**「人はうまくいかなかった時、自分の責任にしたがる」**

上記のような習性が人間にはあると本書では語られています。つまり、目的に対して自身の行為がそれを満たせなかった時、例えばスマホが使いこなせなった時は自分がテクノロジーに疎いせいだと反省し、お金や投資のことが難しくて理解できない人は、自分の理解力が低いからだと反省するのです。

しかし、ここでは本当の目的を達成させられていない仕組みが悪いと考えるべきだと訴えています。

# デザインはうまくいかないことをうまくいくように設計することが大事
上記の通り、人間にはうまくいかなかった出来事を自身の責任だと考えて反省する習性があります。しかし、デザインはそれを許してはなりません。

もし仮に初回の操作が上手くいかなかったとしても適切なフィードバックをユーザーに返して、次上手くいくように導くことが大切です。

そのため、何かをデザインするときには下記のユーザー認知を意識した上でそれを補助するような設計を意識する必要があります。

**ユーザーの実行前の認知**
・何を達成したいのか？
・達成するために代替となる行為は何か？
・それで何ができるか？
・それをどうやってやるのか？

**ユーザーの実行後の評価**
・何が起こったのか？
・それは何を意味するのか？
・それで良いのか？

#最後に
何気ない行動の中にいくつもの認知が隠れていて、それを理解しながらものごとを設計していくという話が大変興味深い章でした。
【Ruby on Rails】本番環境でデータベースをリセットする方法


#対象

* 本番環境でのデータのリセットに悩まされている方


#目的

* 本番環境でデータをリセットして新たにデータをセットする準備をする

#実際の手順と実例
###1.前提

* Ruby on Railsを使ったアプリ開発
* AWSのEC2を使用してサーバー構築

###2.本番環境でのデータベースリセット

まずは開発環境（cloud9から）EC2へSSHでログインし、自分のアプリケーションのディレクトリに移動します。

````
$ ssh -i ~/.ssh/[キー名][ユーザー名]@[パブリックIPアドレス]
$ cd [アプリケーション名]
````
※ [ ] を入力する必要はありません。

下記のコマンドを打てばOKです。

````
RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rails db:drop
````

これだけでは、エラーが発生してしまいますので、忘れずにデータベースの内容を反映させます。

````
rails db:create RAILS_ENV=production
rails db:migrate RAILS_ENV=production
rails db:seed RAILS_ENV=production
````
※　シードファイルを使用していない方は３行目のコマンドは不要です。


これで、本番環境のデータがリセットされました！
プログラミングスクール生のここがダメ(インフラ構成を理解していない)

##はじめに
どうも、未経験からエンジニア転職を目指しているもきおです。

これは当時プログラミングスクール卒業したての頃、エンジニア採用面接でのお話

**面接官**「えーそれではこのポートフォリオってOSは何を使ってるんですか？」
**もきお**「えっとーEC2ですかね？」
**面接官**　（。。。ダメだこりゃ）

その後普通にお見送りになりました笑

お見送り理由も当時エージェントさんからいただいたのですが技術知識習得に受け身な姿勢と受け取られてしまったみたいです。

このようにとりわけプログラミングスクール生は自分も然りインフラ構成への理解が甘くなる傾向にあると感じています。

###なぜスクール生はインフラ構成の理解が甘くなるか？
これは明確にカリキュラムが充実しすぎているのがあるかと思います。
項目ごとに画面がスクショされててその手順書通りにポチポチGUI操作で作成していけばできてしまうのでインフラ構成の理解が甘い。

そしてとりあえず作れれば良いやという感覚に陥りがち。それではダメなんです。
理解し人に説明できなければ面接でいざ聞かれた時に全然見当違いな答えを言ってしまいます。

今回はどうしたらインフラ構成理解が深まるか、要因を踏まえ自分なりに理解が深まった対策をお伝えできればなと思います。これからエンジニア転職活動を控えてる方々、ぜひ面接前に見てってくださいな。

##思ってる以上に理解せず進めている
まず冒頭の会話の中でなぜあんな答えをしてしまったのか自分の当時の考えについてお伝えします。面接時テンパってたのもあったかもしれませんがEC2立ててる時にOSなんか設定した覚えがないぞと思い見当違いの回答をしてしまいました。

それではいかに理解せず進めてしまっているかAWSでEC2作成の手順を振り返ってみましょう

**EC2トップ画面**
![スクリーンショット 2021-09-28 4.52.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1089852/57d49003-e6a5-88b4-6f95-3d6337dcb58b.png)
まずEC2インスタンスを作成する時はEC2のトップ画面で「インスタンスを起動」をクリックしますよね？

**AMIの選択画面**
![スクリーンショット 2021-09-28 4.53.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1089852/305a10ea-10f7-bd9a-0cca-acc79afe0a24.png)
するとすぐにEC2上のOSを選択する画面に移ります。バリバリ選択してるやん。

このように手順書通りにそのままやってしまうと頭に入ってこないんですよね。
未経験者の方でこれを見て思った以上に理解してなくてハッとした方も少なくないのではないでしょうか？

##じゃあどうやってインフラ構成の理解を深めればいいの？
<font color="red">**じゃあどうやったらインフラ構成の理解を深められるんだよ！！**</font>
という声が聞こえてきそうなのでここで自分が理解を深められると感じたことを2つほど紹介させていただきたいなと思います。

###1.  インフラ構成図を作成する
###Railsポートフォリオ構成図
![スクリーンショット 2021-09-28 7.44.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1089852/fc72643a-adbe-6525-3d36-98e0f219a06e.png)
こんな感じで作成したポートフォリオのインフラ構成図を作成するとインフラ構成の理解が深まるし、GitHubの自身のポートフォリオReadmeに載せておけば見栄えも良くなると思います。

ちなみにこれはvscodeの拡張機能でdrawioを使用し作成しました。
以下の記事を参考に作成しております。

https://qiita.com/kei1-dev/items/f17bd92de103c7ec88c5

###2. もう一度一から作ってみる
あとは自分自身でもう一度EC2インスタンスから作成して「Hello World」とかでも良いのでデプロイして表示させることができるかやってみることですね。

プログラミングスクールでは少なからずメンターさんにお世話になるので完全に自力で一から作成できるか挑戦してみるのも良いのではないでしょうか？
##あとがき
いかがでしたでしょうか？
自作ポートフォリオのインフラ構成は意外と理解できていないですよね。
ちゃんと構成理解してるわ！って方には内容の薄い記事になってしまったかもしれません。

自分も自作ポートフォリオレベルならある程度理解を深めることができてきましたが改めて構成は常に理解に努めていきたいと思います。

少しでも良いと感じていただけましたらLGTMポチッとしていただけますと幸いです。

最後までご覧いただきありがとうございました！！
他にも記事投稿してますのでよければご覧ください！
初心者が１から始めるJava開発〜目次編〜

探すのがめんどくさくなってきそうなので、
そろそろまとめ記事にしとこうと思って。。。。

社内の一部の若手開発者向けに勉強会をした時の記事です。

6回目以降はやってません（今は6回目までしかない）



[初心者が1から始めるJava開発-Vol.1- eclipseセットアップ編](https://qiita.com/soepy/items/898b89284be3c228a951)

[初心者が1から始めるJava開発-Vol.2- Javaプロジェクト作成編](https://qiita.com/soepy/items/f8e78d6a29c164abb321)

[初心者が1から始めるJava開発-Vol.3- クラス、メソッド編](https://qiita.com/soepy/items/135cd35ba678f2b2a246)

[初心者が1から始めるJava開発-Vol.4- 条件分岐編](https://qiita.com/soepy/items/cfaa9927042bdd36fcf7)

[初心者が1から始めるJava開発-Vol.5- 繰り返し編](https://qiita.com/soepy/items/524d2bfda6afd3cafc1e)

[初心者が1から始めるJava開発-Vol.6- Javaの可視性](https://qiita.com/soepy/items/0c65f5a9b2ca586832a6)
ATMega328PのArduino unoを使用した書き込み

単なる自分用のメモ

参考にしたのは以下の記事
https://blog.techlab-xe.net/arduino-write-bootloader/

## １、配線
今回は内蔵発振（8MHz）を使用したかったので配線は記事内の
「内蔵発振で使用するために」と同じ配線にした。

## ２、ArduinoにISP書き込み
ファイル＞スケッチ例＞11,arduino ISP＞arduino ISP
を選択し、以下の設定でArduino unoに書き込む
![スクリーンショット 2021-09-28 7.17.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/4623ede8-f746-98a2-8bc3-e85f1f5f54b2.png)

## ３、ブートローダの書き込み
購入したATMega328Pによるがブートローダが書き込まれていない場合、以下の設定で
「ブートローダを書き込む」を選択する。（ATMega MicroControlsを事前にライブラリーに
インストールする必要があるがどうやってやったのか忘れてしまった。。。
ライブラリの管理でしたのかな？誰か教えてくれれば助かります。）
![スクリーンショット 2022-09-11 10.04.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/938db706-2f0c-5d76-71a8-af136e9863cc.png)


## ４、スケッチの書き込み
この時は、特に配線を変更する必要なく、書き込みたいスケッチを選択し、
ツール＞書き込み装置”Arduino as ISP”を選択して、スケッチ＞書き込み装置を使って書き込むでスケッチを書き込めばATMega328Pへの書き込み完了です。
![スクリーンショット 2021-09-28 7.25.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/537e4eb8-0e12-c000-39a2-cb8ebcdb15ca.png)
![スクリーンショット 2021-09-28 7.27.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/ae430fa5-c9ff-d70b-3e3a-a8107f04cbc0.png)
なぜ「ネ申Excel」は無くならないのか

少し古い記事だが以下のような話題がある。業務アプリ開発者としては、意外と設計に色々な登場人物の考慮が必要な題材だと感じたのでまとめたもの。

https://xtech.nikkei.com/it/atcl/column/17/101200421/101200001/

コメント: https://b.hatena.ne.jp/entry/s/xtech.nikkei.com/it/atcl/column/17/101200421/101200001/


## 何が問題なのか
[「Excel方眼紙」と「神Excel」は違うのか？ Excel方眼紙の賛否を問う「Excel方眼紙公開討論会」実施［PR］ － Publickey](https://www.publickey1.jp/blog/17/excelexcel_excelexcelpr.html)
[「ネ申Excel」はなぜ問題なのか | スラド IT](https://it.srad.jp/story/13/10/23/037221/)
[「神エクセル」が日本の「労働生産性」低下の元凶であることを示す３つの理由 | ワークスタイル.com](https://xn--eckva4aya5tta5g.com/badhabit.html#i-2)


- 生産性が落ちる
    - 「Excel」は表計算ソフトでありデータの再利用性を下げる。
- ファイル管理自体が無駄
    - ファイルの管理プロセスが必要
    - ファイル名の命名規則が必要
    - ファイルの格納場所が必要
    - リグレッション（先祖返り）をなくすためにバージョン管理システム、もしくは手動のプロセスが必要。
    - ファイルを上書きされないように、ファイルのロックや、チェックアウト、チェックインといった、権限管理の仕組みが必要。
- スマートフォンやタブレットなど、マルチデバイス化が進んでいる中、極端に作り込まれたExcel方眼紙は、汎用性の面でも不都合。Excelでしか完璧に再現できないようなワークシートは、思わぬトラブルの基
- 「Excel」の表計算ソフトとしての本来の改良を妨げる。


## しかしなぜ無くならないのか

[「神エクセル」が役所ではびこる理由：ものになるモノ、ならないモノ（73）（2/2 ページ） - ＠IT](https://atmarkit.itmedia.co.jp/ait/articles/1612/26/news032_2.html)
[「Excel方眼紙」の何が悪い？ | 日経クロステック（xTECH）](https://xtech.nikkei.com/it/article/Watcher/20140321/545102/)

- 「WordやExcelでも、柔軟性が高くデータの再利用が容易な仕組みを作ることは可能なのだが、罫線を多用するなど、印刷したときの見栄えを優先する文化や慣習が、日本の職場には色濃く残っている」
- 現場の人がごく手軽に「善意で」業務を効率化するには最も手っ取り早い
- 「Excel方眼紙を批判する人々も、Excel方眼紙を自分で作って印刷して、紙で使うだけなら問題ない と言います。前述した実践ワークシート協会も、 エクセル方眼紙を全否定しませんが、もし、業務としてそれらのデータを『再利用』するのであれば 使うべきではないと、用途に応じた使い分けを訴えています。」

## つまり神Excelを作る者と使う者(とExcelを開発する者)との対立

[「神Excel」問題を解決するには：新刊ピックアップ｜技術評論社](https://gihyo.jp/book/pickup/2020/0021)

> Excelでラクするための考え方やテクニックが学べる『たった1日で即戦力になるExcelの教科書』が，このたびリニューアル。姉妹本の『たった1秒で仕事が片づくExcel自動化の教科書』とあわせて35万部という実績を誇る

- Excelで現場（作る者）が楽になれる逃げ道を確保するか
- 「紙」を排除し使う者が使えるWebシステム化等とするか
- 非技術者にもGitを教えMarkdownなどで管理するか
    - [すべての社内文書はMarkdownで書けばいいと思うこれだけの理由 - Qiita](https://qiita.com/e99h2121/items/28fd575b18bdf41b60dd)

逆にExcelの利用を競った驚異的な作品
https://xtech.nikkei.com/it/article/Watcher/20140321/545102/?SS=imgview&FD=-790423714
![](https://xtech.nikkei.com/it/article/Watcher/20140321/545102/pic5.jpg?__scale=w:600,h:501,q:100&_sh=0b20530480)

どこに効率化を求めるか、その業務フェーズやフロー、全員のやる気などに関わる。業務アプリ開発者としては苦い気持ちになります。ネ申Excel が時として本来の崇められるべき「神」である状況もあり、だからこそ難しい...ということのようです。

以上参考になればさいわいです。


## 追記

コメント大変有り難うございます :bow: 

https://twitter.com/makotodeveloper/status/1443012677576454145?s=20
【Android】Androidプロジェクト作成直後の実行でエラー

#Androidプロジェクト作成直後の実行でエラーが発生し、実行できない
エラー内容は以下の通り

```terminal:terminal
Manifest merger failed : Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.
```

##原因
Android12以降ではAndroidManifest.xmlのActivityにandroid:exported属性の指定が必要だった。

```xml:AndroidManifest.xml(Before)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.helloworlddemoandroidapplication">

    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/Theme.HelloWorldDemoAndroidApplication">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>
```
これを↑
こう↓

```xml:AndroidManifest.xml(After)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.helloworlddemoandroidapplication">

    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/Theme.HelloWorldDemoAndroidApplication">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>
```
NEC　リピーター　NEC AtermWR8165　パラボナアンテナ

![20210928050615.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/b49d2671-8c16-c87a-21d7-a3dcfa180f6e.jpeg)


は　**パラボナアンテナ**型きのこ　です

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/e9f6f98e-ab7f-1d6f-2320-0e1018560848.jpeg)



０）全体像は以下です

![11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/7e8c83a2-5a2f-71d9-0bee-7c3690e70bae.jpeg)


１）親機は

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/480f3e02-8295-2ed7-1c97-0632fd0c7c14.jpeg)

２）子機は

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/749a7da4-cdd0-0145-2add-ecb0120b472a.png)


３）子機を　ルーターに設定しておきます

４）子機の背面にある　QRコード　をスマホで読み込みます
そうすると必要なアプリのところに案内されます
それをインストールします



５）そのアプリは
![Photo Marker_20210927_062135.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/7f744e17-cbcd-e025-a80c-a2549ee1fb84.jpeg)
です


５）スマホでこのアプリを起動すると
子機の　QRコード　を読むように促されます

それを読み込むと子機がリピーター子機としての機能を得ることになります


６）子機と親機とをつなぎますが、これも大変簡単です

子機の WPSボタン（実はこれは　**らくらくスタート**　ボタンのこと）をずっと押し続けて
電源ボタンが点滅するようになったら離します

それから1分以内に親機所に行って
親機の WPS ボタンを電源ボタンが点滅するまで押し続けます

これで　一丁出来上がりです


７）パラボナ　アンテナはこんな具合です
![parabona.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/aa62b024-d39a-f59c-9715-21fbd75a973f.jpeg)

１００円ショップの金属ザルで作ってます


8)natマシンは　manjaro linuxで作ってます

|https://qiita.com/tyokai/items/f7cfdd2afa60f10ff662 |
|:---|
|は　どうでしょう|

ユダヤ人のアイデンテティが　旧約聖書なら
日本人のそれは [古事記](https://www.youtube.com/watch?v=0YYiv4X_Vi0&list=PLB3Wg1bH2Lph8bSy5Tvra3HMVNOAVuCHS) かな




----------------------
----------------------

##1>
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/098e2cf3-f328-f51a-6042-670ac74bd17f.jpeg)

では

https://www.aterm.jp/support/manual/pdf/am1-002367.pdf


の171ページでは
![171.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/88ab58dd-bcd9-27bf-6437-7bbf6d6b20e5.jpeg)

![172.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/2f6668a6-dbe2-9b21-c0da-1e0ce866c277.jpeg)

![173.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/7130b084-d1a4-aae9-d3f6-236e887532cd.jpeg)


----------------------
----------------------

##2>

![Photo Marker_20211004_023123.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/847d73e3-4588-dfa5-bcda-453e3f181cb7.jpeg)

では

![Photo Marker_20211004_023246.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/eaa195a3-2f5c-7529-1edd-43b4d3071719.jpeg)



##3> Archer T2U

lsusb
Bus 002 Device 003: ID 148f:761a Ralink Technology, Corp. MT7610U ("Archer T2U" 2.4G+5G WLAN Adapter


##　その後　変遷し　今は以下です

![0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/b74d785e-8f13-758a-a012-f3998b6f8bc0.png)


![スクリーンショット_2021-10-24_04-39-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/ffe5cc99-a3c1-013a-550c-318bb0fcfb9d.png)
俺のエンジニア覚醒ルート

※読みにくく解釈しづらく申し訳ございません。。。

エンジニアが率先して実践すべき事は、思考に関する基礎的な力を高めていく事だと考えます。

「不明瞭な未来の中で、どんな選択のカードを引いても残り続ける力って何だろう」って考えたことはありますか？

ITに関する技術・推進は、様々な手段があり、選択肢の幅も大きく、正解は存在せず、**「最適解」**と言う曖昧な答えしかありません。

そんな中、あなたにとって必要な力とは何であると考えますか。

知識でしょうか、技術でしょうか、経験でしょうか。

そうですね、確かに必要ではありますが、もっと大事なモノがあります。

それは**「繋ぐ力」**です。

実体を見抜く力ではなく、本質を見抜く力が最も重要な「繋ぐ力」になります。

知識・技術・経験は、目標を達成するための手段であり、目標を達成するための答えではありません。それらを繋ぎ合わせてこそ、目標を達成する答えになるのです。

**これは不明瞭な未来を決める力になり、いつまでも残り続ける力となります。**

エンジニアとして何をすべきか分からない人は、「繋ぐ力」を磨いてみてはいかがでしょうか。

[【頭の体操クイズ】論理的思考と苦めなコーヒーの覚醒(概要説明)](https://www.zenbaren.jp/about-brain-teaser/ "【頭の体操クイズ】論理的思考と苦めなコーヒーの覚醒(概要説明)")

実体を追うのではなく本質を見極めるのです。。。v('Д')v

そうすれば気づくはずです。

**いつまでも残り続ける力が「繋ぐ力」だけではないことに :)**
iOS15でのIDFA許可要求の仕様変更とその対応方法

##このページの概要

IDFA取得許可リクエストを行ってダイアログを表示する処理について、
iOS15以降では、アプリの状態が Active の場合にリクエストしないと
ダイアログが表示されなくなりました。

特に注意が必要なのは、位置情報やプッシュ通知などの許可要求と連続でリクエストしたり、
他のリクエストのcompletionHandler内で実行している場合です。

問題が発生するパターンと、その対応方法について記載しています。

##iOS15で新たに加わった制限の内容

公式ドキュメント

https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/3547037-requesttrackingauthorization

に以下の記載があります。

```text:
Calls to the API only prompt when the application state is: UIApplicationStateActive. Calls to the API through an app extension do not prompt.
```

「アプリの状態がActiveの時しかプロンプトを表示しないよ」とのこと。

【参考】iOSアプリのライフサイクル(Active, Inactive, Backgroud)については下記ページでわかりやすく解説されています。

https://qiita.com/KenNagami/items/766d5f95940c76a8c3cd


##発生する問題

例として、「プッシュ通知許可リクエスト完了時に、IDFA取得許可リクエストを行う」という実装をしている場合を考えてみます。

```swift:NGパターン.swift
UNUserNotificationCenter.current().requestAuthorization(options: authOptions) { (result, options) in
    ATTrackingManager.requestTrackingAuthorization { (status) in
        //IDFA取得リクエスト結果に応じた処理をここに書く
    }
}
```

上記コードでは、

　プッシュ通知許可要求ダイアログのボタンが押された
　　↓
　IDFA取得許可要求ダイアログを表示

という流れになるので一見正常に動作しそうに見えますが、実際にはこのコードではIDFA許可要求ダイアログは表示されません。

理由は、

　requestTrackingAuthorizationが実行されるタイミングでは、
　アプリの状態が Inactive になっているから

です。

プッシュ通知許可要求ダイアログのボタンが押された時点では、まだアプリが Inactive 状態から Active状態に戻っていないため、iOS15ではIDFA許可要求ダイアログは表示されません。


##解決方法

解決方法は簡単。Active状態になるまで少しだけ待ってあげれば良いです。

```swift:OKパターン.swift
UNUserNotificationCenter.current().requestAuthorization(options: authOptions) { (result, options) in
    DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
        ATTrackingManager.requestTrackingAuthorization { (status) in
            //IDFA取得リクエスト結果に応じた処理をここに書く
        }
    }
}
```

asyncAfterで1秒ほど呼び出しを遅らせてあげればOKです。
これでiOS15でもIDFA許可要求ダイアログが表示されます。


##動作確認環境

Xcode: 13
iOS: 15.0


以上
【Salesforce】SOQLで選択リストの表示ラベルを取得する

## 背景
- 例えば以下のような選択リスト項目「PickList__c」があるとします

|表示ラベル|API参照名|
|-|-|
|ラベルA|a|
|ラベルB|b|
|ラベルC|c|

- これを単純にSOQLでselectしてもAPI参照名の方しか取得できません

```apex
HogeObject__c row = [Select PickList__c From HogeObject__c LIMIT 1];
System.debug(row.PickList__c); // 「a」など、API参照名の方のみが表示される
```

- 余談ですが、このSOQLの書き方だと取得結果が0件だった場合にExceptionが発生するので、良い書き方ではありません

## 表示ラベルの取得方法
- 選択リストの表示ラベルを取得するためには```tolabel```関数を使用します

```apex
HogeObject__c row = [Select tolabel(PickList__c) From HogeObject__c LIMIT 1];
System.debug(row.PickList__c); // 「ラベルA」など、表示ラベルの方のみが表示される
```

## 両方取得する場合
- 両方取得する場合も見ていきましょう

```apex
HogeObject__c row = [Select PickList__c, tolabel(PickList__c) From HogeObject__c LIMIT 1]; // エラー
```

- 残念ながらこの書き方ではエラーになります
- PickList__cを2つselectしており、重複してしまうためです
- この場合、表示ラベルの方に別名をつけてあげましょう
  - SOQLでは通常、項目に別名をつけることはできませんが、```tolabel```関数の使用時は指定がサポートされています（As句は不要です）

```Apex
HogeObject__c row = [Select PickList__c, tolabel(PickList__c)　PickListLabel From HogeObject__c LIMIT 1];
System.debug(row.PickList__c); //「a」など、API参照名の方のみが表示される
System.debug(row.get('PickListLabel'); // 「ラベルA」など、表示ラベルの方のみが表示される
```

- 上記の書き方で表示ラベル、API参照名の両方が取得できます
- 別名を使う場合、取得の仕方が異なる（getが必要）ので注意してください
Railsでpublic/packs/manifest.jsonの中身がないというエラーが出てハマった(AWSデプロイ時)

#エラー内容
AWSにRailsアプリを``git clone``でデプロイした時に以下のエラーでどハマりしました。

```
 ActionView::Template::Error (Webpacker can't find application.js in /var/www/rails/アプリ名/public/packs/manifest.json. Possible causes:
1. You want to set webpacker.yml value of compile to true for your environment
   unless you are using the `webpack -w` or the webpack-dev-server.
2. webpack has not yet re-run to reflect updates.
3. You have misconfigured Webpacker's config/webpacker.yml file.
4. Your webpack configuration is not creating a manifest.
Your manifest contains:
{
}
):
```

#解決方法1
以下の記事のように、webpackerをコンパイルすることです。

https://qiita.com/negisys/items/2bf88659f584fe45b686

ローカルの``.gitignore``ファイルに``/public/packs``が含まれていたため、Heroku上では問題なく動いていてもGitHubからcloneしたAWS上ではコンパイルが必要でした。
ちなみに``rails webpacker:compile``コマンドは、完了するまでにかなり時間がかかったので、根気よく待ちましょう。（私は初めてこのコマンドを入力した時に、時間がかかりすぎて固まったと勘違いし強制終了させてしまったような気がします...。）

#解決方法2
私の場合は「解決方法1」ではエラー内容が変わらず、ここでどハマりしました。
`` cat /public/packs/manifest.json``でファイルの内容を確認したところ、記述されており、コンパイルされているもののエラー文は変わらず``Your manifest contains:{}``と表示されていました。
こちらの解決方法は、「アプリケーションサーバーの再起動」です。（私の場合は、ハマりすぎて見当違いにファイルをいじってしまい、``rails webpacker:compile``コマンドでエラーを吐くようになってしまったため``git clone``し直しました。その後「解決方法1」を行ったところ、勝手にアプリケーションサーバーが落ちたため起動し直しました。）


Unicornを使っているので、こちらを再起動します。
再起動は、以下の記事を参考にしました。

https://qiita.com/vinaka/items/90a31d23297b9a1cd65d

これでなんとかエラーを解消することができました！！！
特定のViewがセットされてからUIをさらに更新する方法

たまに使うので忘れないようにメモ

# どういうこと？(使用例)
- 3行以上で省略されるTextViewの下部に、全文表示ボタンをつけたい
- 省略されない場合はボタンを非表示にしたい
- そのため、**TextViewが表示されたタイミングで**省略可能判定を行いたい。

# 結論
- ViewにRunnableを引数に持つメソッドが生えているので使える
 - View.post(Runnable)
 - View.postDelayed(Runnable, long)
- 無論UIスレッドの操作となるので多用は禁物。そもそもこういったものを使う仕様にしたくない。
- (参考) https://developer.android.com/guide/components/processes-and-threads?hl=ja#WorkerThreads

# コード例
（DataBindingを使います）

```kotlin
// View#post()を使います
binding.textView.post {
  binding.textView.layout?.let { layout ->
    val ellipsisCount = layout.getEllipsisCount(MAX_LINES - 1)
    if (ellipsisCount == 0) {
      binding.moreButton.visibility = View.GONE
    } else {
      binding.moreButton.visibility = View.VISIBLE
  }
}
```