OmniAICreator/Qiita-1.07M huggingface dataset:
【Javascript】closure(クロージャ）について

# 初めに
javascriptのclosure(クロージャ）について学習した内容のoutput用記事です。

※内容に間違いなどがある場合はご指摘をよろしくお願いします。
※こちらの記事はあくまでも個人で学習した内容のoutputとしての記事になります。

前回の記事:
https://qiita.com/redrabbit1104/items/d9e40ccf59f4a6abb1bd

# closure(クロージャ）とは
関数の中に関数がある場合、外側の関数で定義した変数や定数を内側で定義した関数が参照する状態のことを言います。この外側に定義されている変数はこの関数の外側からはアクセスできず、内側で定義されている関数でしかアクセスすることができません。このように外側の関数に定義した変数を外側の関数によって閉じ込められていることからclosure(閉められているもの）と呼ばれています。

# closureの基本的な形
まずは外側の関数outsideFunction()を用意し、その関数の中にgreetingsという変数を定義します。

```javascript
function outsideFunction() {
  const greetings = 'hello';
}
```
このoutsideFunctionの中にさらに関数を定義します。そしてoutsideFunction()の戻り値はこの関数にします。

```javascript
function outsideFunction() {
  const greetings = 'hello';
  return function () {
    console.log(greetings);
  };
}
```
外側の関数outsideFunction()を実行し、その結果をinsideFunctionという変数に格納します。insideFunctionにはoutsideFunction()が実行され、return文によってoutsideFunction()の中に定義されている関数（内側の関数）を返します。

```javascript
//insideFunctionにはoutsideFunction()の戻り値である関数が格納されている
const insideFunction = outsideFunction();　    
```
insideFunctionの中身は以下のようなものになります。

```javascript
const insideFunction = function () {
    console.log(greetings);
  };
```
このinsideFunctionを実行してみます。

```javascript
insideFunction();
```
するとhelloがコンソールに表示されます。
![スクリーンショット 2021-06-15 21.54.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/51c6af87-0e72-ecc9-ef7a-0eedde5c1f94.png)
つまりoutsideFunction()の中に宣言した変数greetingsを参照していることになります。
これは普通の関数がglobal scopeの変数greetingを参照するのと同じです。

```javascript
const greeting = 'hello';
const insideFunction = function () {
  console.log(greetings);
};
```
この状態を外側の関数outsideFunction()が閉じ込めている状態だといえます。なのでclosureという名前が付けられています。変数greetingsはoutsideFunction（）の外側からは変更できません。

```javascript
function outsideFunction() {
  const greetings = 'hello';
  return function () {
    console.log(greetings);
  };
}
```

#　参考サイト
https://developer.mozilla.org/ja/docs/Web/JavaScript/Closures
残プロ　第-16回　~tkinterでウィジェットを均等配置~

# stickyを指定しても均等に配置されない

tkinterでは起こりがちな問題なんですが，記事が見当たらなかったのでここに書いておきます．
<br>
まず，下の図をご覧ください．

![inframe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578927/6f2e0c8e-5402-a286-01da-e7a7b6cd2dfa.png)


tkinterのウィジェットはpack,grid,placeで配置できます．その際にstickyを指定やることで引き延ばし方向が指定できるのですが，これ例だと上手くいってませんね...

~~~ python:
import tkinter as tk

root = tk.Tk()

frame = tk.LabelFrame(root, text="label frame")
frame.grid(row=0, column=0)

btn = tk.Button(frame, text="button")
btn.grid(row=0, column=0, sticky=tk.NSEW)

label = tk.Label(frame, text="label")
label.grid(row=1, column=0, sticky=tk.NSEW)

root.mainloop()
~~~


## .grid_rowconfigureを使う

.grid_rowconfigureと.grid_columnconfigureを指定することで解決します．
指定は行数・列数分行う必要があります．

~~~
frame.grid_columnconfigure(0, weight=1)
frame.grid_rowconfigure(0, weight=1)
~~~
【PHP】ポリモーフィズムのサンプルソース

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/99da1bab-41b5-c1b5-272d-e722457b61b3.png)



# ポリモーフィズムとは、
##複数のクラスで同じ名前のメソッドを定義しておくことで、同じメソッドでもその動作が異なるようにすること

# メインのファイル
## public/object_sample/polymorphism.php

```php
<?php
 
// 各クラスの読み込み
require_once 'classes/Robot.php';
require_once 'classes/BattleRobot.php';
require_once 'classes/CleanerRobot.php';
 
$robots = [
  new Robot(100, 'ロボ'),
  new BattleRobot(200, 'アン'),
  new CleanerRobot(30, 'サンバ'),
];
 
foreach($robots as $robot){
  $robot->introduce();
  echo '<hr>';
}
```

# 継承元のクラス
## public/object_sample/classes/Robot.php
```php
<?php
class Robot{
  public $energy;
  public $name;
 
  public function __construct($energy, $name){
    $this->energy = $energy;
    $this->name = $name;
  }
 
  // 自己紹介機能
  public function introduce(){
    print '私の名前は' . $this->name . 'です。<br>';
  }
}
```

# 継承先のクラス
## public/object_sample/classes/BattleRobot.php
```php
<?php
require_once 'Robot.php';
 
class BattleRobot extends Robot {
  use WalkingTrait;
  
  public function punch(){
    if($this->energy < 10){
      print '...エネルギー切れでバンチが打てません。';
      return false;
    }
    print $this->name . 'パーンチ！<br>';
    $this->energy -= 10;
    return true;
  }
 
  // introduceメソッドをオーバーライド
  public function introduce(){
    // 最初に継承元（親）クラスのintroduceメソッドを呼び出しておく。
    parent::introduce();
    echo $this->name . 'は戦闘型ロボットだよ！<br>';
    echo '<br>';
  }
}
```


# 継承先のクラス
## public/object_sample/classes/CleanerRobot.php
```php
<?php
// 継承するために最初にRobotクラスの定義を読み込んでおく
require_once 'Robot.php';
 
class CleanerRobot extends Robot {
  // 3. 異なる部分についてそれぞれのクラスに定義する
  public function clean(){
    if($this->energy < 5){
      print '...エネルギー切れで掃除ができません。';
      return false;
    }
    print 'きれいにお掃除しました。<br>';
    $this->energy -= 5;
    return true;
  }
 
  // introduceメソッドをオーバーライド
  public function introduce(){
    echo $this->name . 'は自己紹介せずにお掃除を続けている！<br>';
  }
}
```
VisualStudio2019+OpenCVのデバッグでDLLが見つからない

# 概要
VisualStudio2019でOpenCVを入れ直して使おうとした時に
ビルドは通り、exeではちゃんと動くのにデバッグではDLLが見つからないと出た

![errror_dll.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519407/26d8bbc8-7579-6759-bdf2-226124483982.png)
デバッグのところの設定が抜けていた模様

Windows10
VisualStudio2019
OpenCV4.0.1

---

### できてた所

* インストール（Windowsのやつ）
https://opencv.org/releases/

* システム環境変数（・・・やったつもり）
\opencv\build\x64\vc15\bin

* プロジェクトの構成の設定（構成プロパティ）
![setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519407/4cab6b9a-661f-f59b-bf3a-b3b04a16894f.png)

* VC++ディレクトリ→インクルードディレクトリ
\opencv\build\include

* VC++ディレクトリ→ライブラリディレクトリ
\opencv\build\x64\vc15\lib

* リンカー→入力→追加の依存ファイル
opencv_world401.lib
opencv_world401d.lib


### できていなかった所
* 構成プロパティのデバッグの環境に下記を入れる（環境変数じゃだめだった？）  
PATH=インストール先\opencv\build\x64\vc15\bin;
![setting2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519407/c164a2f0-70f0-e7d7-0807-7e173e555346.png)

おわり

プログラム

```c++
#include <opencv2/opencv.hpp>
int main(void)
{
	cv::Mat src_img;
	src_img = cv::imread("1.jpg", 1);
	// 画像が読み込まれなかったらプログラム終了
	if (src_img.empty()) return -1;
	// 結果画像表示
	cv::imshow("Image", src_img);
	cv::waitKey(0);
	return 0;
}
```
PyCharm チートシート

WindowsとMacを行き来すると忘れちゃうので備忘録

# ショートカット

## 趣旨とは違うが、Macの修飾キーが覚えられないので
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569644/4cd3a9ed-74b5-4d0c-f655-c937b1215635.png)

[Macのメニューに表示される記号](https://support.apple.com/ja-jp/guide/mac-help/cpmh0011/mac)

## コメント
``` 
command + /
```


## フォーマット
``` 
alt + commad + L
```



## 実行
``` 
control + R
```

## デバッグ
``` 
control + D
```

## 補完
``` 
control + D
```


## 矩形選択モード
``` 
shift + command + 8
```

## 指定行に移動
``` 
command + L
```

## 呼び出し階層
``` 
control + option + H
```
【PHP】PHP課題13-10   オーバーライドとクラスの継承

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/8e5fcf9f-2d1a-8209-fa22-5a7a042eade6.png)

# メインプログラムの要件
１・Bulldog クラスのインスタンスと Dog クラスのインスタンスをそれぞれ生成してください。
２・各インスタンスの introduce メソッドを呼び出してください。


# メインのファイル
## public/object_sample/extends_practice.php

```php
<?php
// 各クラスの読み込み
require_once 'classes/Dog.php';
require_once 'classes/Bulldog.php';
 
$taro = new Dog('太郎', 20,70);

$taro->introduce();

echo '<hr>';
 
$bull = new Bulldog('ブル', 30,80);
 
$bull->introduce();
```

# 継承元のクラス
## public/object_sample/classes/Dog.php
```php
<?php
// 猫型ロボットの製造機械、Catクラスを作る
class Dog {
    
    private $name;
    private $weight;
    private $height;
    
    public function __construct($name, $weight,$height){
        $this->name = $name;
        $this->weight = $weight;
        $this->height = $height;
    }
    
    public function introduce(){
          
          $this->introduce_name();
          $this->introduce_weight();
          $this->introduce_height();
          $this->shout();
    }
    
    private function introduce_name(){
        echo '名前は'. $this->name. 'です<br>';
    }
      
    private function introduce_weight(){
        echo '私の体重は'. $this->weight.'kgです。<br>';
        
        if($this->weight < 10){
            echo '小型犬です。<br>';
        }elseif($this->weight < 25){
            echo '中型犬です。<br>';
        }else{
            echo '大型犬です。<br>';
        }
    }
     
    private function introduce_height(){
      echo '私の体長は'. $this->height.'cmです<br>';
    }
  
    public function shout(){
        echo 'ワン！<br>';
    }
}

```

# 継承先   
## public/object_sample/classes/Bulldog.php
```php
<?php
require_once 'Dog.php';

class Bulldog extends Dog {
    
  // introduceメソッドをオーバーライド
  public function introduce(){
    // 最初に継承元（親）クラスのintroduceメソッドを呼び出しておく。
    echo  'ブルルルル...！<br>';
    parent::introduce();
    echo 'ブルルルル...！<br>';
  }   
}
```
Windows Autopilot プロビジョニングの前にMcAfeeリブセーフをコマンドプロンプトからアンインストールする

Microsoft intuneを使ってWindows Autopilotプロビジョニングで事前にウイルス対策ソフトをインストールさせる際、端末にデフォルトでインストールされているMcAfeeリブセーフの影響でインストールが失敗するケースがあります。
その時は、下記手順で予めアンインストールさせておくことで改善できます。

- 予め、以下のバッチファイルを作成してUSB等の外部記録媒体に格納しておく。

```uninstallMcafee.bat
@echo off

"C:\Program Files\McAfee\MSC\mcuihost.exe" /body:misp://MSCJsRes.dll::uninstall.html /id:uninstall
echo McAfee Uninstall プロセス終了

pause
```

- 初期化されたWindowsを起動後、言語選択画面が表示されたら、Shift+F10でコマンドプロンプトを起動
- 外部記録媒体を接続し、作成したバッチファイルを実行する。(下の例は、外部記録媒体のドライブレターがDドライブで、直下にuninstallMcafee.batが格納されている想定）

```
D:\uninstallMcafee.bat
```
HPC Python

HPCを利用するため、急いで環境を設定する。

```shell 
$ which git
/usr/bin/git

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
```

OK.



```shell 
$ tail .bash_profile

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

# [2021/06/17]
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"

```

```shell 
$ source ~/.bash_profile
```

No error messages.

```shell 
$ pyenv install anaconda3-5.2.0 
$ pyenv rehash
$ pyenv global anaconda3-5.2.0
$ echo 'alias activate="source $PYENV_ROOT/versions/anaconda3-5.2.0/bin/activate"' >> ~/.bash_profile


$ source ~/.bash_profile
# ここまではOK

$ conda update conda
# これが全然うまくいかない。
conda create Collecting package metadata (current_repodata.json): failed

# >>>>>>>>>>>>>>>>>>>>>> ERROR REPORT <<<<<<<<<<<<<<<<<<<<<<

File "/home/[user_01]/.pyenv/versions/anaconda3-5.2.0/lib/python3.7/ssl.py", line 807, in _create
        raise ValueError("check_hostname requires server_hostname")
    ValueError: check_hostname requires server_hostname

のようなエラーが出るので、SSLに関することだとあたりがつく。
マシンのセキュリティが厳しいため？
```


そこでいろいろ調べるうちに、以下のやり方でうまくいった。
https://stackoverflow.com/questions/66642705/why-requests-raise-this-exception-check-hostname-requires-server-hostname
https://askubuntu.com/questions/831266/find-proxy-server-using-command-line

```shell
まず、

$ echo "$https_proxy"
https://AAA.BB.CC.DD:EEEE

であることから、

$ more ~/.condarc
proxy_servers: {https: AAA.BB.CC.DD:EEEE}
のように設定する。

一旦ログアウトして、再度ログインする。そしてすぐに

$ conda create -n py37_hvs python=3.7 anaconda 

を実行する。

Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
#     $ conda activate py37_hvs
#
# To deactivate an active environment, use
#
#     $ conda deactivate

$ source activate py37_hvs

(py37_hvs)$ python
Python 3.7.10 (default, Feb 26 2021, 18:47:35) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
>>> import numpy
>>>
```

これでOK

## gala

```shell 
$ conda install -c conda-forge gala

だと、openblas.so.0がないと言われてインストール後にロードできない。
```

```shell 
$ python -m pip install gala

などのやり方だと、SSLのエラーでインストールできず。

WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1091)'))': /simple/gala/
Could not fetch URL https://pypi.org/simple/gala/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/gala/ (Caused by SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1091)'))) - skipping
ERROR: Could not find a version that satisfies the requirement gala
ERROR: No matching distribution found for gala
```

https://github.com/adrn/gala/issues/168 

```shell
conda install -y -c conda-forge astro-gala
conda install -y -c conda-forge openblas==0.3.3
python -c "import gala"

```

これで解決した。

## mwdust

いつもどおり。
モジュール名は自由に命名可能


モジュール名は自由に命名可能

```
自動生成されるデフォルトのモジュール名：
下記の例では：module_16237379939912

{% module "module_16237379939912" path="/new-boilerplate/modules/breadcrumb", label="breadcrumb" %}

```

テンプレート上で利用する場合は自由にモジュール名をつけてモジュール内のデータを利用可能。パスで紐付いているので名前は自由につけて良い。

```
{% module "my_breadcrumb" path="/new-boilerplate/modules/breadcrumb", label="breadcrumb" %}

```

モジュール内のデータを利用するためには下記記述が必要

```

// 追加：export_to_template_context=True
{% module "my_breadcrumb" path="/new-boilerplate/modules/breadcrumb", label="breadcrumb", export_to_template_context=True %}


// モジュール内のdirnameの入力データを利用したい場合
{{ widget_data.my_breadcrumb.body.dirname }} 

旧仕様なのか下記でも利用可能
{{ content.widgets.my_breadcrumb.body.dirname }} 

```
Ajaxとコントローラー

# Ajaxとコントローラー

# 概要
Spring開発にて、Ajaxを用いた非同期通信について記載していく

# 画面更新(リロード)しない非同期通信を行う場合
準備と処理内容
  
- index.html(例は省略)  
    - class=Btの要素をクリックで「AAA」を非同期通信でDBに登録したい
- Ajax.js
    - 非同期処理
- likeController.java
    -非同期処理の実態
- Entity(省略)

※Bt.htmlより抜粋

```html:Bt.html
    <div class="modal-bookmark">
        <p class=modal-bookmark-text>いいね!</p>
        <img src="/images/hogehoge.svg" class="Bt">
        <input type="hidden" th:value="AAA">
    </div>
```


```js:Ajax.js
$(document).ready(function () {
    /* 「class=Bt」のものがクリックされた時に実行 */
    $('.Bt').click(function (e) {
        /* 
        * htmlのデータ取得
        * Btクラスの次の行に記載されているデータを指定
        * 例では「AAA」
        */
        var target = e.target.nextElementSibling.value;
        $.ajax({
            /* Post通信 */
            type: "POST",
            /* likeController.javaの@PostMapping(/like)の箇所へ */
            url: "/like",
            /* 
            * 取得した値（th:value='AAA'）をXXXに格納 
            * XXXはentityの中のメンバ変数
            */
            data: { "XXX": target }
        })
            .done(function () {
                /* 上記Ajaxの処理が成功した場合に、処理される */
            })
            .fail(function () {
                /* 上記Ajaxの処理が失敗した場合に、処理される */
                alert('error');
            });
    });
})
```

```java:likeController.java
@RestController
public class LikeController {
    @PostMapping("/like")
    public void like(@ModelAttribute Entity fugafuga) {
        /* 
        *   Ajaxより非同期で行いたい処理を記載する
        *   例でいうと、DBに登録するための処理を記載する
        */
        }
    }
}
```

# まとめ
　Ajaxを用いることで、java側のコントローラーへ値の受け渡しを行うことができ、画面遷移を行わずにデータのやり取りを行うことができる。(非同期通信)
【SQL】自己結合について

> 自己結合について学習したことをまとめています。

# 自己結合の概要
同一テーブルに対する結合です。
1つのテーブルがあたかも2つあると考えることが重要です。

## 自己結合でできること
|できること|意味|実現方法|
|:-------|:--|:----|
|順列|<1, 2>と<2, 1>を区別する順列対|結合条件に「<>」を使用する自己非同値結合|
|重複順列|重複を含む順列対|自己クロス結合|
|組み合わせ|{1, 2}と{2, 1}を同じものとみなす非順列対|結合条件に「>」を使用する自己非同値結合|
|重複組み合わせ|重複を含む非順列対|結合条件に「>=」を使用する自己非同値結合|

# 自己結合でできることの例
下記Subjectsテーブルを例に自己結合でできることの例を記載します。

|name|score|
|----|-----|
|国語|85|
|数学|90|
|英語|55|

## 順列
結合条件に「<>」を使用する自己非同値結合を利用して順列を作成します。

```sql:順列の例
SELECT
	S1.name AS name1,
	S2.name AS name2
FROM
	Subjects S1
	INNER JOIN Subjects S2 ON S1.name <> S2.name
```

### SQL実行結果
| name1 | name2 |
|-------|-------|
| 国語  | 数学  |
| 国語  | 英語  |
| 数学  | 国語  |
| 数学  | 英語  |
| 英語  | 国語  |
| 英語  | 数学  |

## 重複順列
自己クロス結合を利用して重複を含む順列を作成します。

```sql:重複順列の例
SELECT
	S1.name AS name1,
	S2.name AS name2
FROM
	Subjects S1
	CROSS JOIN Subjects S2;
```

### SQL実行結果
| name1 | name2 |
|-------|-------|
| 国語  | 国語  |
| 国語  | 数学  |
| 国語  | 英語  |
| 数学  | 国語  |
| 数学  | 数学  |
| 数学  | 英語  |
| 英語  | 国語  |
| 英語  | 数学  |
| 英語  | 英語  |

## 組み合わせ
結合条件に「>」を使用する自己非同値結合を利用して組み合わせを作成します。

```sql:組み合わせの例
SELECT
	S1.name AS name1,
	S2.name AS name2
FROM
	Subjects S1
	INNER JOIN Subjects S2 ON S1.name > S2.name;
```

### SQL実行結果
| name1 | name2 |
|-------|-------|
| 数学  | 国語  |
| 英語  | 国語  |
| 英語  | 数学  |

## 重複組み合わせ
結合条件に「>=」を使用する自己非同値結合を利用して重複を含む
 
```sql:重複組合せの例
SELECT
	S1.name AS name1,
	S2.name AS name2
FROM
	Subjects S1
	INNER JOIN Subjects S2 ON S1.name >= S2.name;
```

### SQL実行結果
| name1 | name2 |
|-------|-------|
| 国語  | 国語  |
| 数学  | 国語  |
| 数学  | 数学  |
| 英語  | 国語  |
| 英語  | 数学  |
| 英語  | 英語  |
入力フィールドのタグにデフォルトのclass名を付与


リッチテキストなら可能

```

{
	"default": "<h3 class=\"case_ttl_1\">デフォルトテキスト</h3>",
	"id": "00000000000000000000",
	"label": "タイトル",
	"locked": false,
	"name": "ttl",
	"required": false,
	"type": "richtext"
}

```
うつ病、エンジニア、技術者などの陥りやすい病気について

#なぜ書いたのか
私自身の経験から、この記事を書かせていただいています。
私自身、うつ病、躁鬱病になったことがあり。その時の経験から、今回の記事を書かせていただいております。

#対象読者
経営者、人事、営業、エンジニア等のIT業界、モノづくり業界の方々

#結論
モノづくり業界に心理学系の知識は必要。
特に、うつ病、躁鬱病、抑うつ状態に関する症状と対策に関する知識。

#理由
うつ病、精神疾患を患っている方を早く見つけ、対処を行うため。
また、自分の体の様子がおかしいと感じたら、会社に速やかに報告し、早い段階で治療を行えるような状態を組織内で作って頂くため。
it業界で働くエンジニアや、it業界で働く営業さん人事さん。モノづくりに関わる方など。
その他の方々（IT業界に従事する方々全般）でも、心理学系の学問は少しでも勉強すべきであると思っております。
少なくとも、鬱病、躁鬱、抑うつ状態の症状について学ぶと、早期発見、対応が可能になってくるのではないでしょうか。

#知識がなければ、間違った対応をし、会社に対する憎しみ、上司に対する憎しみだけが残る


#なぜ心理学系の知識が必要なのか
私自身、web制作会社で新米バックエンドエンジニアとして働かせていた頂いた経験があるのですが。
誰も、その当時の状況を理解していなかった。ということです。（自分自身もその当時は鬱の症状についての知識が甘かった。）
強いて言えば、その当時の技術の事も詳しく、その当時の社員の中でも冷静に情報を集め、情報を集め、真実は何なのかを考え続けていた男性部長さんのみ、私がうつ病であるという答えに最も早くたどり着こうとしていた。
その当時の男性部長は、IT関連に関する知識も豊富、経験も豊富なかたでした。直属の女性上司（名前、会社名は伏せますが）とは比べ物にならないくらいすごい方だと私は思っています。
私が退職した今でも、この男性部長（現在は退職）だけはすごかったなと思っています。
これは少し愚痴になってしまいますので、あまり大声では言いたくはないのですが、あえて言わせていただきます。（エンジニアさんのために）
他部署の方はわかりませんが、残念なことに、同部署の方の心理学的な知識量、病気に対する知識を持っていない方がほぼ居なかった印象です。（特に人事部は自分の持っている専門知識以外を舐めているような印象、自分はなんでも見抜けるという知的傲慢さを感じる人ではあったかなと思います。）
体がいきなり動かなくなり、2,3週間家でほとんど何も食べず（会社を休み）、いきなり元気になり、元気になったときに診療内科を受診したところ。
抑うつ状態との診断がなされたのですが、実家に帰り、医師とその当時の状況を話しながら情報を整理、自分でもうつ病の知識を学ぶと、その当時、重い鬱、躁鬱を患っていたのではないかという予測が立ちました。
休職期間中の心療内科の診断書を人事に提出しに行った際、躁鬱病の躁の状態の私を見て「もう少し自分を出していれば、上手くやっていけたんじゃない？」と言った意味の発言してしまっているような状態、これでは会社に戻る気など起きません。

#知識と情報と冷静な判断が被害、損害を抑える力となる
うつ病、躁鬱病に対する理解を行ったうえで、会社の状況、仕事の状態を理解し、制度を設ける、あるは臨機応変に症状に合わせて、休職期間を決めるなど適切な対応を行うと、うつ病を患ったエンジニアさんも会社や上司に対する恨み、憎しみを持たずに復職、あるいは復帰していただけるのではないかと感じております。

#最後に
私の経験と拙い知識、未熟な調査から、この記事を書かせていただきました。
少しでも、この病気に早く気づき、よりより社会人生活を送ってくださる方が一人でも多くなって頂ければ幸いです。

参考URL
https://www.smilenavigator.jp/utsu/about/

https://utsu.ne.jp/depression/
JSPの基本まとめ

## JSPとは
* JavaServer Pageの略
* HTMLのなかにJavaのコードを埋め込める
* ブラウザがJSPファイルをリクエストすると、WebサーバがJSPファイルをサーブレットに変換してくれる

## スクリプトレット
Javaコードを<% %>タグで囲む。

```jsp:for文
<% for(i = 0; i < 10; i++){ %>
<p>Hello</p>
<% } %>
```
## 変数、メソッドの戻り値、演算値などの埋め込み

```jsp
<p>私の名前は<%= name %>です</p>
```

## コメント
```jsp:コメント
<%-- コメントです--%>
```
## pageディレクティブ
ContentTypeの設定、クラス等のインポート、文字コードの設定などができる

```jsp:pageディレクティブ
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" %>
```
[Kotlin] REST APIのレスポンスをメタデータでソートしたいとき

#やりたいこと
REST　APIで以下のようなJSONで帰ってくるKotlinのコードがあったとします。

```json
[{"name":"Taro", "age":"28", "createdAt":"2021/02/22 12:01:10"},
 {"name":"Hanako", "age":"28", "createdAt":"2021/02/22 15:10:39"},
 {"name":"Yoshi", "age":"44", "createdAt":"2021/02/23 00:39:44"}]
```

ResponseクラスにcreatedAtを含めずにでも、createdAtでソートする方法をメモっておきます。

#createdAtを見せずにソート

``````kotlin:Response.kt
data class Response(
        var name: String,
        var age: Int
) {
    @JsonIgnore
    var createdAt: LocalDateTime? = null
    constructor(user: User): this(
        name = user.name,
        age  = user.age
    ) {
        createdAt = user.createdAt
    }
}
```

```kotlin:sort.kt
fun sort(list: List<Response>) : List<Response> {
    return list.sortedBy { it.createdAt }
}
```

```json
[{"name":"Taro", "age":"28"},
 {"name":"Hanako", "age":"28"},
 {"name":"Yoshi", "age":"44"}]
```
ソートに限らず、データクラスに対するメタデータ的なものを用いてロジックを組みたいときなど、`@JsonIgnore`が結構重宝します。

#createdAtが見えてしまう形でソート

```kotlin:Response.kt
data class Response(
        var name: String,
        var age: Int,
        var createdAt: LocalDateTime
) {
    constructor(user: User): this(
        name = user.name,
        age  = user.age,
        createdAt = user.createdAt
    )
}
```
または以下もダメです。

```kotlin:Response.kt
data class Response(
        var name: String,
        var age: Int
) {
    var createdAt: LocalDateTime? = null
    constructor(user: User): this(
        name = user.name,
        age  = user.age
    ) {
        createdAt = user.createdAt
    }
}
```

```kotlin:sort.kt
fun sort(list: List<Response>) : List<Response> {
    return list.sortedBy { it.createdAt }
}
```
golangのアプリをdockerマルチステージビルドで小さいイメージサイズにするメモ

小さいイメージの[alpine](https://hub.docker.com/_/alpine)(A minimal Docker image based on Alpine Linux)を使ったマルチステージビルドってのを使うらしい

-以下2つのファイルを用意(2021/06/18 -tags netgo 追記)

```text:./test/dockerfile
FROM golang:latest as build
ADD ./ ./
ENV GOOS=linux GOARCH=amd64
RUN go build -tags netgo main.go

FROM alpine:latest
COPY --from=build /go/main /app/main
EXPOSE 8080
CMD [ "/app/main" ]
```

```golang:./test/main.go
package main

import (
    "fmt"
    "net/http"
)
func index(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "golang test")
}

func main() {
    http.HandleFunc("/", index)
    http.ListenAndServe(":8080", nil)
}
```

- build

```shell
% docker build -t gotest test/
```

- image size

```shell
% docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
gotest       latest    83fe32afaf4f   5 minutes ago   11.5MB
alpine       latest    b0e47758dc53   40 hours ago    5.33MB
golang       latest    245bf9f4c37a   13 days ago     728MB
```

- run

```
% docker run --name go_docker -d -p 80:8080 gotest
...

% docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS                               NAMES
eecc22a60f82   gotest    "/app/main"   9 minutes ago   Up 9 minutes   0.0.0.0:80->8080/tcp, :::80->8080/tcp   go_docker
```

- access

```
% curl -i -6 http://localhost/
HTTP/1.1 200 OK
Date: Thu, 17 Jun 2021 13:39:51 GMT
Content-Length: 11
Content-Type: text/plain; charset=utf-8

golang test
```
DDD エンティティとは

# エンティティとは
「エンティティ」とはなにか、ということについて調べると、「連続性と同一性によって識別されるもの」という定義がされていることがあるのですが、個人的にどういう意味かよくわからなかったので、現時点での筆者の考えを記します。

# 区別する必要があるかを考える
ユーザー、在庫、住所など、システムがあつかうオブジェクトをエンティティにするか値オブジェクトにするかよくわからなくなったとき、個人的にはまずそのオブジェクトを複数集めたとき、それらはシステムとして区別する必要があるかないか、に着目します。

ユーザーをAさん、Bさんと複数用意すれば、この人たちはおそらく区別し、AさんとBさんが異なる人として扱う必要があるでしょう。
一方、住所（東京都新宿区～）とか、価格（〇〇円、××ドル）といったオブジェクトは、それらを区別する必要はないでしょう。


# 属性"じゃないもの"で区別されるもの
どうやら区別する必要がありそうだぞ、とおもわれるオブジェクトについては次に、あるオブジェクトについて、そのオブジェクトをそのオブジェクトたらしめるものが属性でないことを確認します。

どういうことかというと、たとえばユーザー（人間）には、名前とか所属とかいろいろな属性があるわけですが、あるユーザーをそのユーザーたらしめるものは（おそらく多くのシステムでは）それら属性ではないはずです。

名前で区別することもおおむね可能ですが、システム内でユーザーが名前を変更する場合もあるはずです。そのとき、名前変更前後で別のユーザーとして認識するわけにはいきません。

ということは、一見名前で区別できそうであっても、あるユーザーをそのユーザーたらしめるものは名前ではないはずです。

現実世界でも、人間は名前を変えることもあるでしょうし、顔を変えることもあります。それでも、名前も顔もかわったまるで別人を、ソーシャルセキュリティナンバーなどなくても同一人物と認識する必要が人間社会にはあるでしょうし、我々自身改名や整形をした友達を他人扱いしたりはしないはずですね。

それどころか、我々の意識の上では、昨日という日と今日という日は睡眠のタイミングによって分断されているにもかかわらず、昨日の私と今日の私が同一人物だと信じて疑いません。

これはたぶん記憶の連続性によって同一だと識別しているのだとおもいますから、このようによくわからないけどなんらかの連続性によって識別されるものが世の中にはあるのだとおもいます。

# エンティティの定義ってむずかしい
エンティティを定義せよ、といわれると、「連続性と同一性によって識別されるもの」というむずかしい回答になってしまうので、「属性で識別されないもの」と考えると、ユーザーとか部門、商品など、属性が変わっても連続性が維持されるべきものには、システムはIDを割り振るなどして識別する仕組みをつくる必要があることがわかります。
CloudFront構築時のハマりポイント

## 構成
- CloudFront → ALB → EC2となっている

## 代替ドメインを設定しようとするとCNAMEAlreadyExistsExceptionと出る
### 原因
- CloudfrontのFQDNがRoute53でCNAMEで割り当てられているため起こっているみたい
- 該当するCNAMEレコードを削除する
- CNAMEではなくて、A（エイリアス）レコードで割り当てるのがよいっぽい
    - ただそのためには、CloudFrontの設定をUseAllEdgeLocationにしないといけない
        - それはバージニアリージョンでしか参照させることができないからみたい

## 502 The request could not be satisfied.

```
502 ERROR
The request could not be satisfied.
CloudFront wasn't able to connect to the origin. We can't connect to the server for this app or website at this time. There might be too much traffic or a configuration error. Try again later, or contact the app or website owner.
If you provide content to customers through CloudFront, you can find steps to troubleshoot and help prevent this error by reviewing the CloudFront documentation. 
```

### 原因その1
- ALBに割り当てている証明書がエラーだったから
    - ALBのカスタムドメイン名がCommonNameに含まれているものではなく、まったく一致していない別物を当てていたから

### 原因その2
- ALBを指定するOrigin Domain Nameが不適切だったというか、ALBの名前を指定していた
- ここの答えは、ALBのカスタムドメイン名を指定する
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/d0c8c49d-d570-ad14-defd-b03c441f4e88.png)
    - ということは、Route53でエイリアスレコードやCNAMEレコードでALBを指定して、さらにALBにそのカスタムドメイン名がCommonNameに含まれているエラーを起こさない証明書を割り当てる必要がある

## メモ
- CloudFrontとALBを連携させる場合、証明書は2つ必要になる
    - ワイルドカード証明書でもいいかも
    - 東京リージョンで作っている場合それとは別に、CloudFrontに割り当てるためにバージニアリージョンでも取得する必要がある
        - ちなみにバージニアリージョンで取得する証明書はCloudFrontのAlias設定に割り当てる分必要

## 参考
- https://cloudpack.media/52783
- https://aws.amazon.com/jp/premiumsupport/knowledge-center/resolve-cloudfront-connection-error/
配列処理の使い分け　「PHP初心者向け」

#はじめに
配列処理というのは文字通り[ ]で囲まれた中の物を処理するものですよね。
そんな配列処理は大きく3つあります。
①for文
②foreach文
③while文
以上3つです。

ではこの３つをどう使い分けたら良いのでしょうか？
#for文

`for文は「繰り返し回数が定まっているとき」`に強いです。

例えば１年間３６５日を数字で打ち出したいとすると

```
for ($i=1; $i<=365; $i++) {
        print($i);
    }
```

↓ちなみにwhileで書くと

```
$i=1;
while ($i <= 365) {
         print($i)
         $i++;
}
```
forの方がすごくスッキリかけますね。
逆に言えばfor文は回数が一定に決まらない処理が苦手というわけです。

#foreach文
foreach文は`「連想配列の処理」`に強いです。
フォームからPOSTされてくる時とかに嫌というほど目にしますね。

```
$fruits = [
   'apple' => 'リンゴ',
   'grape' => 'ブドウ',
   'lemon' => 'レモン',
   'tomato' =>　'トマト',
   'peach' => 'モモ',
];

foreach ($fruits as $english => $japanese) {
   pront ($english.':'.$japanese);
}
```

中身をそれぞれ打ち出せます。

DBと組み合わせることで変数内に入ってきた物を打ち出せるので回数が決まっていないものにも対応ができるのです。

#while文

while文は`「指定の条件を満たすまでのループ処理」`が得意です。


```
$cnt = 1;
$i=0;
while($i !== 10) {
    echo $cnt . "回目のループ";
    if($cnt%2 === 0) $i++;
    $cnt++;
}
```

while文は
条件を満たすまで実行し続けるので、無限ループ事故を引き起こしやすいのが難点です。


#まとめ
どれが良いとかではないので場面で使い分けるべきでしょう！
使っているコードを見かけたらなぜこれを使っているんだろうと考えることにします。
PowerShellで日付を書き替え

###・要件
今の時刻はToに書き込み、元のToはFrom時刻に入れ替え
File:ini_start_date.txt

```
etl_start_from=2020-05-23T11:35:28.000+0900
etl_start_to=2021-05-24T11:37:51.000+0900
```

###・対応案
Powershellで、PropertiesFileとして読み込み、今の時刻は入れて再出力する
###・コード

```
 #base path for work
$base_path = "C:/CIRUS/SRC"
$date_file = "${base_path}/ini_start_date.txt"

#date file
$AppProps = convertfrom-stringdata (get-content ${date_file} -raw)
                                                

$from = $AppProps.'etl_start_to'
$to = Get-Date -Format "yyyy-MM-ddThh:mm:ss.000+0900"



#set date for next execution
$filedata1="etl_start_from=${from}"
$filedata2="etl_start_to=${to}"

Write-Output $filedata1 |  Out-File -FilePath $date_file 
Write-Output $filedata2 |  Out-File -FilePath $date_file –Append

```
Ruby 問題12 if,else問題

#はじめに

フロント部分の復習やオリジナルアプリ作成に学習時間を取ってますが、毎朝しっかり問題を解いています！


#問題

メソッドに3つの整数a b cを与えます。
・「aとbの差が2」または「aとcの差が2」であり、かつ「bとcとの数値の差が3以上」の場合はTrue
・それ以外はFalse
と出力するメソッドを作って下さい。

```
close_far(1, 3, 10) → True
close_far(1, 2, 3) → False
close_far(4, 2, 5) → True
```

#ヒント

返り値を絶対値（この場合は正の整数）に変換する際は**absメソッド**を使う。

https://docs.ruby-lang.org/ja/latest/method/Integer/i/abs.html

```.rb
num = 3.abs
#=> 3

num = -3.abs
#=> 3
```

#解答

```.rb
def close_far(a,b,c)
  x = (a-b).abs
  y = (a-c).abs
  z = (b-c).abs

  if x == 2 && z >= 3
    puts "True"
  elsif y == 2 && z >= 3
    puts "True"
  else
    puts "False"
  end
end

```

ポイントは絶対値です。

abcそれぞれの差分を算出し、絶対値に変換します。

`a`と`b`を計算した`x`と`b`と`c`を計算した`z`の条件分岐として
`x == 2 && z >= 3`「aとbの差が2」であり、かつ「bとcとの数値の差が3以上」を検討しています。

同様に `y == 2 && z >= 3`で「aとcの差が2」であり、かつ「bとcとの数値の差が3以上」を検討しています。

省略したバージョンも記述できます。

```.rb
if (x == 2 && z >= 3) || (y == 2 && z >= 3)
  puts "True"
else
  puts "False"
end
```

xが2と等しい時かつzが3以上の時またはyが2と等しい時かつzが3以上の時という条件式を作る事ができます。
AWSでDeepLearningのGPU学習環境を構築したメモ

#1.この記事の内容

自宅のWindows PCを用いてWSL環境でDeepLearningの学習を実行していましたが，GPUのメモリ不足が生じたり，GPU温度が90度近くまで上昇したりと，実行上の問題点や不安要素が生じたことから，自宅PCで対応しきれない規模の学習にAWSを使用することとしました．

基本は[Deep Learning AMIの10分間チュートリアル](https://docs.aws.amazon.com/ja_jp/dlami/latest/devguide/tutorial-10min.html)の[深層学習モデルのトレーニング](https://aws.amazon.com/jp/getting-started/hands-on/train-deep-learning-model-aws-ec2-containers/)に記載の手順で環境構築が可能ですが，足りなかった内容を本記事で補足します．

#2.GPU学習環境構築に関する補足

##2.1 EC2へのアクセス時のセキュリティルールの設定

セキュリティルールのインバウンドルールの編集が必要で，SSHとRDPに対してソースをマイIPに設定する必要があります．
この設定ができない場合，SSH接続などでタイムアウトが発生し，接続に失敗します．

##2.2 Amazon ECRへのアクセス情報の保存

Amazon ECR へのアクセス許可の為にユーザ追加をした場合，追加時の画面から参照できる「Access key ID」と「Secret access key」の情報はcsvファイルの保存またはメモを残しておきます．
これらの情報は作成後は参照ができない為，保存しなかった場合は再度作り直す必要があります．

##2.3 Deep Learningコンテナイメージの選択

チュートリアル以外に[Available Deep Learning Containers Images](https://github.com/aws/deep-learning-containers/blob/master/available_images.md)からDockerイメージを選択する事ができます．用途に応じて選択します．

##2.4 ボリュームの拡張

データセットのダウンロードや学習ログの保存を考慮すると，条件にもよりますが，120GB以上は必要と思います．
必要に応じてボリュームの拡張が必要で，拡張後はファイルシステムの拡張設定が必要な場合がありますので，[ボリュームサイズ変更後の Linux ファイルシステムの拡張](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html?icmpid=docs_ec2_console)から設定してください．

##2.5 WinSCPでインスタンスに接続

学習結果を取得する為に，WinSCPを用いてSCPでインスタンスに接続します．
ホスト名に「パブリック IPv4 DNS」を設定し，ユーザ名はインスタンス生成時のユーザ名(Deep Learning AMIではubuntu)を設定します．

鍵認証の為，パスワードは空白のままで，「設定」→「SSH」→「認証」→「秘密鍵」にキーペア(pemファイル)を選択します．
OpenSSH形式からPuTTY形式に変換するかを聞かれるので，「はい」を選択してppkファイルを保存し，秘密鍵にppkファイルを設定します．

#3.AWS料金のリンク

* [Amazon EC2 オンデマンド料金](https://aws.amazon.com/jp/ec2/pricing/on-demand/)
    * インスタンスタイプに高速コンピューティングを選択して上位に出てくるp2，p3，p4がDeep Learningの学習によく用いられるインスタンスと思います
* [Amazon EBS の価格](https://aws.amazon.com/jp/ebs/pricing/)

#4.さいごに

軽い学習は自宅PCで，重い学習はAWSを使うという考え方です．
他の問題点が生じた時には本記事に追記していこうと思います．
Jupyter Notebookを多用される方はGoogle Colabを活用するのもありですね．


#4.関連リンク

* [AWS Deep Learning AMI とは](https://docs.aws.amazon.com/ja_jp/dlami/latest/devguide/what-is-dlami.html)
* [Amazon EBS の価格](https://aws.amazon.com/jp/ebs/pricing/)
* [Amazon EC2 オンデマンド料金](https://aws.amazon.com/jp/ec2/pricing/on-demand/)
【Swift】複数回addSubviewしたimageViewをremoveFromSuperviewで一括削除

#はじめに
複数回addSubviewしたimageViewをremoveFromSuperviewで一括削除をする方法がわからず数日悩んで解決できたため、記事に残す事にしました。


#環境
Xcode12.3
Swift5.3.2
macOS Big Sur 11.2.3

#完成

![ezgif.com-gif-maker (5).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683624/89f4cc7f-21f0-182d-4571-e059ee92ee85.gif)



#warabiAppendViewに格納するための箱を作る

```swift
 private var warabiAppendView = [UIImageView]()
```

#warabiAppendViewを格納する

```swift
 //warabiImageViewを格納する
        warabiAppendView.append(warabiImageView)
```

#removeFromSuperviewで一括削除

```swift
 //warabiImageViewをaddSubviewしたのを一括で削除
        for view in warabiAppendView {
            view.removeFromSuperview()
        }
```

#全コード

```swift
import UIKit

class ViewController: UIViewController {

    private var warabiAppendView = [UIImageView]()

    var x = 0
    var y = 0

    @IBAction func addButton(_ sender: Any) {

        let warabiImage = UIImage(named: "warabi.png")
        let warabiImageView = UIImageView(image: warabiImage)
        let rect = CGRect(x: x, y: y, width: 100, height: 100)

        warabiImageView.frame = rect
        self.view.addSubview(warabiImageView)
        //warabiImageViewを格納する
        warabiAppendView.append(warabiImageView)
        //y軸を100ずつ下にずらす
        y += 100
    }
    
    @IBAction func deleteActionButton(_ sender: Any) {
        //warabiImageViewをaddSubviewしたのを一括で削除
        for view in warabiAppendView {
            view.removeFromSuperview()
        }
    }
}
```

[ソースコード](https://github.com/kapisan/removeFromSuperviewSample)

#追記
@am10 さんに教えていただいたコードです。
こちらのコードで同じ動きが出来ました。
シンプルで読みやすいコードで勉強になりました。
ありがとうございました:smile:

```swift
for view in self.view.subviews {
            if view is UIImageView {
                view.removeFromSuperview()
            }
        }
```

#参照サイト
http://ja.uwenku.com/question/p-buaxotjn-gy.html

#終わりに
もし何か間違いがあれば優しく教えていただけると嬉しいです。

[Twitter](https://twitter.com/koara1237)やっています。
CefSharpでSSL証明書エラーを回避する方法

#初めに
CefSharpを使って自動ログインブラウザを作っていた際に、ログインするサイトがSSL証明書エラーでアクセスできず、1日ほど詰まったので、解決方法を共有します。

#環境
Windows10 HOME
[Visual Studio 2019 Community](https://visualstudio.microsoft.com/ja/downloads/)

#ライブラリ
.NET framework
CefSharp.WinForms

#問題
[SSL証明書エラーが出るサイト](https://expired.badssl.com/)にCefSharpブラウザからアクセスできない。
アクセスしようしても真っ白い画面が表示されるだけ。

#解決方法
RequestHandlerを実装する。

```cs:ExampleRequestHandler.cs

using CefSharp;
using CefSharp.Handler;
using System.Threading.Tasks;

namespace CefSharpTest
{
    public class ExampleRequestHandler : RequestHandler
    {
        protected override bool OnCertificateError(IWebBrowser chromiumWebBrowser, IBrowser browser, CefErrorCode errorCode, string requestUrl, ISslInfo sslInfo, IRequestCallback callback)
        {
            Task.Run(() =>
            {
                if (!callback.IsDisposed)
                {
                    using (callback)
                    {
                        // 許可するURL
                        if (requestUrl.ToLower().Contains("https://expired.badssl.com/"))
                        {
                            callback.Continue(true);
                        }
                        else
                        {
                            callback.Continue(false);
                        }
                    }
                }
            });
            return true;
        }
    }
}
```

Form1でインスタンス化。

```cs:From1.cs
using CefSharp;
using CefSharp.WinForms;
using System.Windows.Forms;

namespace CefSharpTest
{
    public partial class Form1 : Form
    {
        public ChromiumWebBrowser cefBrowser;

        private string URL = "https://expired.badssl.com/";

        public Form1()
        {
            InitializeComponent();

            // CefCharp初期設定
            CefSettings set = new CefSettings();
            set.Locale = "ja";
            set.AcceptLanguageList = "ja-JP";
            set.LogSeverity = LogSeverity.Disable;
            CefSharpSettings.ShutdownOnExit = false;
            Cef.Initialize(set);

            // CefSharpのWebViewを作成する。
            // ページを表示。
            cefBrowser = new ChromiumWebBrowser(URL);

            // コントロールを追加する。
            this.Controls.Add(cefBrowser);
            cefBrowser.Dock = DockStyle.Fill;
            cefBrowser.BringToFront();

            // 先ほど実装したRequestHandlerをインスタンス化
            cefBrowser.RequestHandler = new ExampleRequestHandler();
        }
    }
}

```


これでSSL証明書エラーが出るサイトでもアクセスできるようになります。
![スクリーンショット 2021-06-17 213241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964196/95bd1d57-657d-4440-8617-9f0a89ddf1ec.png)
GitHub Issueまとめ

##概要
GitHub Issueについて調べたことをまとめる
実際の開発において、GitHubを利用した開発では

1. Issueを作成し

2. それをもとにトピックブランチを切って

3. 開発し

4. プルリクして

5. 承認され

6. マージする

みたいな基本的な流れがある
この時に重要なのが**Issue**であり、開発の起源となるイベントである
これを雑に管理していると

- なぜその機能が開発されたのか

- その機能で達成したい目標は何なのか

- どんな成果物をもってIssueを閉じるのか

を最初に規定されていないがために

- 実装上の(本来は必要のない)相談

- 実装の範囲

- 成果物

の相談やコミュニケーションコストが増大することになる
本来はこれらは**Issue作成の過程でディスカッションされるべき内容**であると思う
今回は

- それらのロスを少しでもなくせるよう調べたこと

- Issue作成のポイントなどについて調べたのでまとめる

(まだチーム開発に使用したことはないが、これらの知識はチーム開発にGitHubを適用するうえでの必要な知識であると思うので)


###以降まとめの参考記事：[チーム開発を変える「GitHub」とは？〜Issuesの使い方〜【連載第3回】](https://seleck.cc/647)
##Issueとは

- GitHubに備わっている機能の一つ

- プロジェクトやリポジトリの課題を管理することを目的として作られた

##Issueの機能
###基本機能

- タイトルと内容を最初に設定して保存することで作成することができる

- (リポジトリにアクセス権限のある人であれば)Issueについてコメントをすることができる

- 結果、Issueの中で仕様を詰めたりディスカッションを行うことができる

- プルリクへのリンクやほかのIssueへのリンクを貼ることができる

###Assignee機能

- 対象のIssueに対応する担当者を割り当てることができる機能

- 一つのIssueに対して一人しか担当者を振ることはできないため、Issueの粒度が重要になってくる

###MileStone機能

- 対象のIssueに対して期限を設定することができる機能

- MileStoneを設定し、Issueを紐づけることでMileStoneのタスクを何％消化しているかという進捗を確認できる

###Label機能

- Issueにラベルを貼ることができる機能

- Issueを分類できると一覧画面でのIssueの分類の視認性が向上する

##Issueの書き方
Issueもチーム開発でそれぞれスタイルがあるかもしれないが
(おそらく一般的には)それほど内容としては変わらないと思うので
(代表として)[この記事](https://qiita.com/ryotakodaira/items/e860396ae44942dcca5e)を参考にしてIssueの書き方と必要性について理解する
###①タイトルについて

- タイトルだけで概要を把握できるようにする

例）○○機能の実装、○○の△△化
例２）ユーザーストーリー風に記述する→ユーザーは○○がしたい。それは△△だからだ。
###②内容について
以下３点で記載する
####WHY(なぜこのIssueを立てたのか)
これがないと解決したい問題や課題が不明瞭ということになる
####WHAT(このIssueで何を決めたいのか)
具体的にどうすることでIssueを解決しようとしているのかを記載する
####OUTPUT(IssueのClose条件(作成する成果物))
IssueをCloseするための成果物を定義する

##Issue作成のポイント
####以降参考記事：[【イベントレポ】GitHub-flowにおけるissue作りのコツとは…達人による登壇を聞いてポイントをまとめてみました。](https://circlearound.co.jp/2015/04/23/%e3%80%90%e3%82%a4%e3%83%99%e3%83%b3%e3%83%88%e3%83%ac%e3%83%9d%e3%80%91github-flow%e3%81%ab%e3%81%8a%e3%81%91%e3%82%8bissue%e4%bd%9c%e3%82%8a%e3%81%ae%e3%82%b3%e3%83%84%e3%81%a8%e3%81%af%e9/)
###①Issueの粒度について
マネージャー視点ではある気がするが(プレーヤーも気を付ける必要があると思う)

- Issueの粒度とコミュニケーションコストは比例関係にある

- Issueを立てるときにはこれを考慮する必要がある

[参考図](https://image.slidesharecdn.com/githubissue-150421013236-conversion-gate01/95/githubissue-11-638.jpg?cb=1436357912)

#####Issue粒度の具体例
粒度「大」

- UIと要求仕様のみを記載する

- 単体機能で記載する

担当者に実装の設計も委ねるので裁量が大きい
マネージャーからするとコントロールしにくいタスクとなる
※外部設計のような、UI部分であったり実処理などは担当者にゆだねてしまうと
そもそもの実現したいIssueの揺れが発生する可能性があるため、そこまではIssueの段階で解消するということ
あくまで内部実装に関してのみ粒度を大きくして担当者の裁量に任せるということか
粒度「小」

- テーブルのカラム名、ロジックまで指定する

- ある機能を実現するための処理の部分的な実装(MVCでいうモデルのみ、コントローラーとビューのみ)

担当者はコーダーに近い役割になる
マネージャーからするとコントロールしやすいタスクとなる
###②親Issueと子Issueについて

- 親Issueで大きな機能単位で設定する

- 子Issueは親Issueを細分化した内容にする

- 親Issueは子Issueがすべて完了することで完了となる

####親Issueの例

- Issueの中で子Issueのリンクとチェックボックスを設定する等

- すべてチェックが付けば子Issueがすべて完了したということにする

####親Issue→子Issue分解の過程

１． 実現すべき内容を機能単位でIssueにする

例）ログイン機能を実装する

２． より小さなIssueを渡したい人向けに分割できないか検討し、子Issueとして細分化

例）【フロントエンド】Presentational Componentを作成する　～(どうつくるかなどをこの後に細かく記載する場合もあり)
例２）【サーバーサイド】ログイン用APIの実装　～(どうつくるかなどをry)


##まとめ

- 調べた結果、Issueについて何となくどう使われているかを理解することができた

- ただ、実際はプロジェクト単位で運用が変わるところではあり、唯一解があるわけではないということが分かったのもよかった

- 特にIssueの粒度などは調べる前にぼんやりとどうするんだろうと感じていたことではあった

- それに対する考え方の指標ができたのでよかった
Rustにそっと触れてみました

# 環境構築

```rust
// インストール
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
// パスを通す
source ~/.cargo/env
// プロジェクト作成
cargo new rust-practice
// ビルド + 実行
cargo run
```

# GETしてみる
Cargo.tomlの[dependencies]にかく

```rust
[dependencies]
tokio = { version = "0.2", features = ["full"] }
warp = "0.2"
```

main.rsに下記をかいて

```rust
use warp::Filter;

#[tokio::main]
async fn main() {
    // GET /hello/warp => 200 OK with body "Hello, warp!"
    let hello = warp::path!("hello" / String)
        .map(|name| format!("Hello, {}!", name));

    warp::serve(hello)
        .run(([127, 0, 0, 1], 3030))
        .await;
}
```

APIテスターとかで

GETで[http://localhost:3030/hello](http://localhost:3030/hello)　するとHello Worldできる

main.rsに


```rust
use warp::Filter;

#[tokio::main]
async fn main() {
    // GET /hello/warp => 200 OK with body "Hello, warp!"
    let hello = warp::path!("hello" / String)
        .map(|name| format!("Hello, {}!", name));

        
        
        // GET /sum/:u32/:u32
        let sum = warp::path("sum")
        .and(warp::path::param::<u32>())
        .and(warp::path::param::<u32>())
        .map(|a, b| format!("{} + {} = {}", a, b, a + b));
        // serverの起動
        warp::serve(sum)
            .run(([127, 0, 0, 1], 3030))
            .await;
    }
```

ターミナルで

```rust
cargo run
```

ブラウザ でURL [http://localhost:3030/sum/1/2](http://localhost:3030/sum/1/2)　をたたくと

```rust
1 + 2 = 3
```

と表示される

## 参考サイト
[https://pione30.hatenablog.com/entry/2020/11/22/204329](https://pione30.hatenablog.com/entry/2020/11/22/204329)
ポートが被ったときに使うLinuxコマンド

### オープンしてるファイル一覧表示

```jsx
lsof [オプション] [パス名]
```

lsof -i 8080 で、localhost の8080ポートが使われてるか確認して、

使われてたら 

```jsx
COMMAND  PID            USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
php     9341 username    5u  IPv6 0xb10a48e3d59486f1      0t0  TCP localhost:8084 (LISTEN)
php     9341 username    6u  IPv6 0xb10a48e3d665edf1      0t0  TCP localhost:8084->localhost:65000 (CLOSE_WAIT)
php     9341 username    7u  IPv6 0xb10a48e3d665d6f1      0t0  TCP localhost:8084->localhost:65001 (CLOSE_WAIT)
php     9341 username    8u  IPv6 0xb10a48e3d665b471      0t0  TCP localhost:65002->localhost:8084 (ESTABLISHED)
```

こんな感じで出てくるから、PIDの部分をオプション-9でkillすれば消える

```jsx
 kill -9 9341
```

このPC内で立ち上がってるやつ全部確認できるし、php縛りで絞り込みたかったらgrepで絞れる

```jsx
ps aux | grep php
```

消しても

```php
Failed to listen on localhost:8080 (reason: Address already in use)
```

とか言われる時は、

```php
sudo lsof -i:8080
```

で入ったら

```php
COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
httpd     81 root    4u  IPv6 0xb10a48e3cd3d0b71      0t0  TCP *:http-alt (LISTEN)
httpd    189 _www    4u  IPv6 0xb10a48e3cd3d0b71      0t0  TCP *:http-alt (LISTEN)
httpd    190 _www    4u  IPv6 0xb10a48e3cd3d0b71      0t0  TCP *:http-alt (LISTEN)
httpd    191 _www    4u  IPv6 0xb10a48e3cd3d0b71      0t0  TCP *:http-alt (LISTEN)
httpd    192 _www    4u  IPv6 0xb10a48e3cd3d0b71      0t0  TCP *:http-alt (LISTEN)
httpd    193 _www    4u  IPv6 0xb10a48e3cd3d0b71      0t0  TCP *:http-alt (LISTEN)
httpd   7034 _www    4u  IPv6 0xb10a48e3cd3d0b71      0t0  TCP *:http-alt (LISTEN)
httpd   7035 _www    4u  IPv6 0xb10a48e3cd3d0b71      0t0  TCP *:http-alt (LISTEN)
httpd   7036 _www    4u  IPv6 0xb10a48e3cd3d0b71      0t0  TCP *:http-alt (LISTEN)
```

まだ居たりするのでこいつらもまた

```php
sudo kill -9 81
```

で消すと消える
衝突判定チェックリスト一枚絵

前に自分で作って持っていた
『説明で描いたけど、以降、意外と役に立ってやがる
衝突判定 こんな場合はどうするチェックリスト』

を描いてみました。あなたの子(娘)の衝突判定は全部攻略出来るでしょうか!?

矢印は移動方向、長さはスピードを表しています
![16239324427232110704525.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001410/f7bebc12-409b-cbd9-023d-7faf7380edf9.jpeg)

他にも｢これはどうする!?｣というのがありましたらお寄せください○┐ﾍﾟｺ
debounceとthrottleの違いについて

# はじめに
どうも@kaneko77です。
RxSwiftのオペレータで`debounce`と`throttle`があります。
こちら初めて見る人は違いが分かりずらいと思います。
今回はその二つのオペレーターの違いについて共有していきます。
それでは行ってみよ〜
※参考にしたサイトは[こちら](https://medium.com/fantageek/throttle-vs-debounce-in-rxswift-86f8b303d5d4)です。

# 説明
## debounce
まず`debounce`についての説明になります。
以下reactivexの引用です。
> **reactivex引用**
http://reactivex.io/documentation/operators/debounce.html
>>別のアイテムを発行せずに特定の期間が経過した場合にのみ、Observableからアイテムを発行します

<img src ="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397376/66a3e19a-94fd-afdb-2259-955d51684d68.png" width="500px">

このように
指定の期間の間、まとまったイベントは最新値のみ流れるようになっています。
指定の期間の最後のアイテムのみを流すということですね。

## throttle
`debounce`とは裏腹に連続したイベントは最初の
イベントだけ流してあとは指定期間の間無視します。
以下reactivexの引用です。
> **reactivex引用**
http://reactivex.io/documentation/operators/debounce.html
>> 指定された期間の連続する時間枠の間にObservableによって発行された最初のアイテムのみを発行するObservableを返します。

<img src ="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397376/c17baa60-f17e-904e-a046-4363e87ce625.png" width="500px">

# 実践
この説明だと「はにゃ？」って感じだと思いますので実際にコードや実行結果を織り交ぜながらやっていきます。

## debounce

``` swift
self.mainView.login.rx.tap.asDriver()
    .debounce(.seconds(2))
    .drive{ _ in
        print("debounceボタンを押下した！！")
    }
    .disposed(by: disposeBeg)
```

## throttle

``` swift
self.mainView.login.rx.tap.asDriver()
    .throttle(.seconds(2), latest: false)
    .drive{ _ in
        print("throttleボタンを押下した！！")
    }
    .disposed(by: disposeBeg)
```

## 比較
こちらのログの結果を見ていただければ今回の対象の`オペレーター`が
どういう性質を持っているか分かると思います。
## debounce
デバウンスは連続したイベントは最新値のみ取得するため、
最新値から２秒後に処理を実行させています。
<img src ="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397376/ac398d20-3a19-8ab6-b4d4-17c231d47778.gif" width="500px">
## throttle
スロットルは最初に値が流れたものを流し処理を実行してから2秒後にまたイベントが一つ流れるということになっています。
<img src ="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397376/4f665edf-b870-c5cc-13ef-60fa0d590836.gif" width="500px">

# 終わりに
今回はよく私自身どっちがどっちだっけ？と
なってしまう`debounce`と`throttle`の違いについて共有しました。
二つに共通して言えるのは **指定秒だけ一つのイベントしか流れない**　ということですね。
ここまで見ていただきありがとうございます。
少しでも皆さんのお役に立てればなと思います。
postgre SQLコマンドmemo

### ユーザー指定して特定のdbに入る

```sql
psql -U username -d reactone 
```

### データベース一覧

```sql
\l
```

### データベースの選択

```sql
\c
```

### テーブル一覧

```sql
\dt
```

### ロール一覧

```sql
\du
```

### ロール追加

```sql
CREATE ROLE name [ [ WITH ] option [ ... ] ]
```

### どんなカラムがあるか

```sql
\d　テーブル名
```

### テーブル作成

```sql
create table テーブル名 (name varchar(255),comment varchar(255),imageUrl text,uid text);
```

### レコードの挿入

```sql
INSERT INTO テーブル名 (カラムの順番覚えてたら順番省略可)(name,comment,imageUrl,uid) VALUES ('SUQQU','綺麗な艶','test.jpg',123456abcd);
```

### レコードの削除

```sql
DELETE FROM items WHERE name(='○◯')IS NULL(空欄の時はISにする)
```

### レコード一覧

```sql
select * from テーブル名;
```

### テーブル(データベース)名の変更

```sql
alter table テーブル(データベース)名 rename  to 新しいテーブル(データベース)名
```

(ハイフンは使えない)

### 行の削除(nameが'testuser23'の行を消す)

```sql
DELETE FROM users WHERE name = 'testuser23';
```

### テーブル(データベース)削除

```sql
drop table テーブル名
```

### そのファイル名の実行

```sql
\i　実行したいxファイル名
```

(vim command.sql とかで新規作成して、その中にテーブルの作成コマンド打ったり)

### 抜ける

```sql
\q
```

### コメントアウト

```sql
-- コメント
```

## データ型

### 数値

- integer(int)
- real(小数点含む実数)
- serial(連番)

### 文字

- char(固定長)
- varchar(上限つきの可変長)
- text(上限なし)

### 真偽値

- boolean

### 日付

- date(日付のみ)
- time(時間のみ)
- timestamp(日付+時間)
2Dアクションゲームを作りながらUnity学習　#6日目

# 環境
* MacBookAir(M1,2020)
* UnityHub 2.4.3
* Unity バージョン2020.3.10f1

# 学習内容
* BGM・SEの設定
* 動く床・落ちる床の設定

# 苦労した点
* 動く床・落ちる床共に物理演算を無視した挙動なので理解に苦労した

# 感想
動く床や落ちる床は中々難しいですが、2Dアクションゲームには必須な物なので是非習得したいです。
【アルゴリズム】JavaScriptでFizzBuzz問題を解く

#はじめに
Qiitaの競技プログラミング研究月間ということで、アルゴリズムの記事を書いています。
今回はFizzBuzz問題をまとめました。

JavaScriptでアルゴリズムの勉強をされている方の参考になれば幸いです。
記事を順次まとめていきますので、その他の記事についてはマイページからご覧ください。

https://qiita.com/suzuki0430

https://qiita.com/official-events/5a0502a2d94ed6a00c30

#FizzBuzz
引数で与えた数値が3の倍数であれば"fizz"、5の倍数であれば"buzz"、15の倍数である場合は"fizzbuzz"を返してください。

```
fizzBuzz(5);
1
2
fizz
4
buzz
```

##解答
n回forを回して、剰余が0になったときに"fizz", "buzz"などを出力するようにします。

```js:index.js
function fizzBuzz(n) {
  for (i = 1; i <= n; i++) {
    if (i % 3 === 0 && i % 5 === 0) {
      console.log('fizzbuzz');
    } else if (i % 3 === 0) {
      console.log('fizz');
    } else if (i % 5 === 0) {
      console.log('buzz');
    } else {
      console.log(i);
    }
  }
}
```
再帰呼び出しを使うと以下のように書けます。

```
function fizzbuzz(n) {
  if (n > 1)
    fizzbuzz(n-1);

  if (n % 3 == 0 && n % 5 == 0)
    console.log("Fizz,Buzz");
  else if (n % 3 == 0)
    console.log("Fizz");
  else if (n % 5 == 0)
    console.log("Buzz");
  else
    console.log(n);
}
```

ネット上に腐るほど転がっているFizzBuzz問題の解答ですが、自分用のメモとして一応書いてみました。
計算量の観点だとどの解き方が一番いいんだろう...

#参考資料
https://www.udemy.com/share/101WNkCEEZd11VRno=/
Git基礎３

##概要
前回まででGit基礎として、Gitの基礎となる原理や考え方などについてまとめたので
今回も調べた結果、よく使うであろうコマンドなどについてまとめてみた

##参考：[いまさらだけどGitを基本から分かりやすくまとめてみた](https://qiita.com/gold-kou/items/7f6a3b46e2781b0dd4a0)

###commit
・直前のcommitを上書きする
タイポ等で新しくcommitを作成する必要がない場合などに使用する
コマンド例：git commit --amend

###tag
リリースバージョン等の重要なタイミングで印をつけるためのもの
git-flowモデルなどでreleaseブランチにtagを打ったりする
・タグ作成
コマンド例：git tag v1.0
・作成したタグをリモートリポジトリに反映する
コマンド例：git push origin v1.0
・タグ削除
コマンド例：git tag -d v1.0

###revert
特定のコミットをもとに戻すコマンド
指定のコミット以降に行われた処理をすべて戻すわけではない
revertによってコミットをもとに戻したこともコミットログとして残る
コマンドを使用するとエディタが開き、コミットメッセージを編集することができる
コマンド例：git revert <commit_id>
参考：[いまさらのrevert](https://qiita.com/chihiro/items/2fa827d0eac98109e7ee)
####PR後に問題が発覚した時の修正反映までのフロー
①GitHub上でPRをrevert
②ローカルでgit pull でrevertを取り込んで更新する
③ローカルでrevertを取り消す
一見①②が無駄にも見えるが、正しくログを残すうえでは必要な操作となる
④修正
⑤リモートにPush
⑥PR作成してマージしてもらう

###reset
特定のコミットをもとに戻すコマンド
resetによってコミットをもとに戻したことはコミットログとして残らない
リモートリポジトリにPushした内容について、resetでもとに戻してはならない

###pull
リモートリポジトリの内容をリモート追跡ブランチに反映し、ローカルブランチに反映するコマンド
オプションなしであれば fetch + merge の動作となる
つまり、マージコミットが積まれるようになる
・rebaseコマンド
git pull --rebaseとすることで fetch + rebase の動作となる
つまり、マージコミットを積まずにpullされる
流れとしては
①ローカルリポジトリでトピックブランチを切る
②変更をリモートリポジトリにPushする
③リモートリポジトリ側でmasterにトピックブランチの差分をマージ
④ローカルリポジトリ側でmasterブランチに移動
⑤git pull --rebaseを実行する
こうするとでトピックブランチの差分がそのまま最新のブランチとなる
オプションなしであればマージコミットが積まれる
つまり、masterブランチ側とトピックブランチ側の両方が親となるマージコミットができることになる

###stash
ローカルコミットしていない内容を一時的に避難させるコマンド
ユースケースが(今のところ)思い浮かばないので、リンクだけ貼っておく
参考：[コミット前の内容を一時的に避けておく「git stash」の使い方](https://www.granfairs.com/blog/staff/git-stash)

###cherry-pick
他ブランチの特定のコミットを現在のブランチに取り込むコマンド
コマンド例：git cherry-pick <commitID>
参考：[cherry-pickコマンド備忘録](https://qiita.com/ta__ho/items/8204a22a53b02ee0817e)

###grep
リポジトリに対して検索し、検索文字列と一致した内容の該当行を出力する
コマンド例：git grep aaa
Dockerを用いた環境構築(docker-compose使用ver.)

#1. 背景
参加したハッカソンでdockerを用いて環境構築を行うことになり、せっかくなので記事にしてみた.
#2. この記事を読んでほしい人
・dockerを初めて使う方
・Gitはちょっとだけ使ったことある方
・環境の大枠をチームメンバーが作ってくれたが、どのように自分の環境に反映させるかわからないという方
#3. dockerとは
一言でいうとコンテナ型の仮想環境を作成、実行するためのプラットフォームです。
例えるなら、 **説明書を渡せば、どんな部屋でも一瞬で作ってくれる建設会社** のようなイメージです
Dockerfileという名の説明書を実行すれば、どんな部屋(Mysql環境、Python環境など)でも一瞬で作ってくれて、同じ内容の説明書を渡せば、誰でも全く同じ作りの部屋に住むことができます.
#4. docker-composeとは
複数のコンテナで構成されるアプリケーションについて、Dockerイメージのビルドや各コンテナの起動・停止などをより簡単に行えるようにするツールです。
こちらの記事で詳しく説明されています.
https://knowledge.sakura.ad.jp/16862/
例えるなら、**建設会社に渡したい説明書がたくさんあるとき、その説明書をまとめて実行してくれる機械** のようなイメージです
#5. 実際の手順
###1. dockerをインストールする
こちらの記事が大変参考になります

https://qiita.com/bezeklik/items/a6a7335acaec12edda45
###2. terminal(git bash)を開く
###3. git cloneする
今回は例としてdockerを用いてmysql環境が作成されているリポジトリを用います
https://github.com/Yugo-Fukuta/HackU_preY_team5

    git clone GitHubリポジトリのURL
###4. Dockerのアプリを起動する
###5. ビルドして立ち上げる
    # イメージのビルド
    docker-compose build
    # コンテナの作成
    docker-compose up -d
環境構築自体はここまでで完了となります
###(6. 実際に使えるか試してみる)
Mysql環境が構築されているか確認してみます

    # コンテナ名の確認
    docker-compose ps
    # コンテナの実行
    docker exec -it コンテナ名 bash -p
    # mysqlの起動
    mysql -u root -p -h 127.0.0.1
    -> パスワードを入力(今回はrootと打てばok)
    # hacku_dbというデータベースがあるか確認
    mysql> show databases;
#6. なぜこれだけでできるのか
後日追加予定