OmniAICreator/Qiita-1.07M huggingface dataset:
プログラミングの基礎 /浅井健一　11~13　メモ

# プログラミングの基礎 / 浅井健一

## 11章 自然数と再帰

### 自然数の構造

```
定義1 ０は自然数である。
定義2 n が自然数なら n + 1 も自然数である。
```

リスト同様、再帰的定義。構造に従った再帰関数を作ることができる。

#### 階乗

```ocaml
(* int -> int *)
(* fac: 自然数nが与えられると、nの階乗を返す *)

let rec fac n = 
  if n = 0 then 1
  else n * fac (n - 1)

let test1 = fac 0 = 1
let test2 = fac 1 = 1
let test3 = fac 2 = 2
let test4 = fac 3 = 6
let test5 = fac 4 = 24
let test6 = fac 5 = 120
```

#### 冪乗

```ocaml
(* int -> int -> int *)
(* power: 自然数 n と m が与えられたら n の m 乗を返す *)
let rec power n m =
  if m = 0 then 1
  else n * power n (m - 1)

let test1 = power 2 0 = 1
let test2 = power 2 1 = 2
let test3 = power 2 2 = 4
let test4 = power 2 3 = 8
```

## 13章 一般化と高階関数

一般化の基本

- 似たような形があったとき、違った箇所を引数に取ることで一般化できる

### データの一般化

```ocaml
(* 目的 : 個人情報リストを受け取ったら ketsueki0 の人数を返す *)
(* count_ketsueki : person_t list -> string -> int *)
let rec count_ketsueki lst ketsueki0 = match lst with
    [] -> 0
  | {namae = a; shintyo = s; taiju = t; birthday = birth; bloodType = blood} :: rest
  -> if blood = ketsueki0 then 1 + count_ketsueki rest ketsueki0
                          else count_ketsueki rest ketsueki0
```

### 関数の一般化

#### map

- 「リストの要素に対してなんらかの処理をする」関数の一般化 = map
  - リストの要素したい処理(関数)とリストを与えたら、処理した結果のリストを返す

```ocaml
(* ('a -> 'b) -> 'a lst -> 'b list *)
(* map: 関数とリストを与えたら、リストの要素に関数を実行した値を返す *)
let rec map f lst = match lst with
  [] -> []
  | first :: rest -> f first :: map f rest

let test1 = map sin [2.0; 4.0] = [0.909297426825681709; -0.756802495307928202]
```

- 関数型言語においては関数は普通の値（ファーストクラス）
- 関数を受け取る関数は高階関数と呼ぶ
- 多相型と多相関数（ポリモーフィズム/多相性）は、実行時に型が決定する

### 関数を返す関数

#### twice

```ocaml
(* twice: 関数を受け取ったらその関数を二回実行する関数を返す *)
let twice f =
  let g x = f (f x)
  in g

(* 具体例： 2乗を二回実行するから、2の2乗で4乗する関数を返す *)
let exponent n = n * n
let test1 = exponent 2 = 4
let test2 = (twice exponent) 3 = 81
```

#### fourtimes

```ocaml
(* 具体例: 2乗を4回実行するから、2の4乗で16乗する関数を返す *)
let fourtimes = twice twice
let test3 = (fourtimes exponent) 2 = 65536
```

#### compose

```ocaml
(* ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b *)
(* compose: 関数をふたつ与えられたら合成する *)
let compose f f2 =
  let g x = f (f2 x)
  in g

(* 具体例: 10倍と100倍を合成した「1000倍関数」を返す *)
let times10 n = n * 10
let times100 n = n * 100
let test1 = (compose times10 times100) 1 = 1000
```

- 関数も値のように2倍にしたり合成したり好きなように変化させられる
チェリーピックしたコミットのCommitDateをAuthorDateに合わせる

チェリーピックすると、CommitDate はチェリーピックした日時になる。
ブランチの作り直しなどで CommitDate を AuthorDate にしたいときは、次のようにする。

## 手順
チェリーピックを AuthorDate の順に行う。

都度、次のコマンドを実行。

```sh
$ git rebase HEAD~ --committer-date-is-author-date
```

意図通りにできているかは `$ git log --pretty=fuller` で確認する。
iPhoneリカバリーモードを復元する方法

iPhone がリカバリーモードでスタックされた後、リカバリーモードからスタックされたiPhoneをリスタートすることができ、[ElPhone OSFixit](https://www.eelphone.jp/solution/ipad-stuck-in-recovery-mode.html)を利用してリカバリーモードでスタックされたiPhone XS / XS Max / XR / X / 8/ 7 / 6s / 6 / 5s / 5c / 4S / 4を復元することもできます。僅かなクリックで完成できます。

![standard-mode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652246/021a2b09-3771-66c4-e66e-9f03007aab54.png)

###方法１　スマホをフォーカススタートしてリカバリーモードを解除しますH3

これは問題を解決する最も一般的な方法です。スマホをソフトリセットするプロセスであり、データ紛失がありません。

iPhone機種に基づき、フォーカスリスタートする方法も異なります。

**iPhone 6s及びその前のバージョンの場合**
ウェーク/スリープボタンとホームボタンを同時にプレスし、10秒ぐらい保持してください。その後、iPhoneでAppleログが見えます。しかし、スマホ画面にまだ不完全である場合、操作システムをリーインストールしなければなりません。

**iPhone 7及びiPhone 7 Plusの場合**
電源ボタンとボリュームダウンボタンを当時にプレスし、10秒ぐらい保持します。

**iPhone 8、iPhone X、iPhone XS及びiPhone XRの場合**
ボリュームアップボタンを速やかにプッシュしてリリースします。その後、ボリュームダウンボタンに同じな操作を行った後、電源ボタンをプレスしてappleが出現するまでに保持してください。「スライドして電源オフ」画面が出現したら、電源ボタンをリリースしないでください。

しかし、この方法はまったく有効ではありません。この方法はデバイスのキャッシュを除去してデバイスを「リーフレッシュ」に過ぎず、問題を完全に解決できない可能性もあります。

###方法２　データ紛失せずにリカバリーモードでスタックされたiPhoneを解除しますH3

「[ElPhone OSFixit](https://www.eelphone.jp/solution/ipad-stuck-in-recovery-mode.html)」ツールキットはリカバリーモードでスタックされたiPhoneを解除することができます。ツールキットは特殊な技術を利用してデバイスを修復します。その修復プロセスは修復モードと関係ないので、データの紛失になりません。ツールキットは多くのメリットがあります。例えば、

・プロセスはiPhoneを操作することが不要で、簡単なクリックで完成できます。
・iPhone X/XS/XR及びiPhone 5/6/7/8を含むほぼ全てのiOSデバイスに適用できます。
・リカバリーモード問題を解除だけではなくて、白い画面、黒い画面、appleログにスタックされるなどの問題を解決することもできます。

ステップ１　パソコンでツールキットを立ち上げます。

ステップ２　パソコンにiPhoneを接続します。

ステップ３　標準モードボタンをクリックして標準モードに入ります。

必要なiPhoneファームウェアをダウンロードする為にオプションを提供します。その後、「修復」ボタンをクリックしてください。
![confirm-ios-version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652246/6307777c-7dc5-d297-cbd3-28209c698bb5.png)

ステップ４　ダウンロード完成後、「開始」ボタンをクリックします。問題は解決されます。
![ipsw-unpacked.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652246/45a5b80f-fe25-ad39-8e6f-8dac503c2089.png)

上述した方法を全て試しても問題を解決できない場合、一番近いappleサポートを探してハードウェア問題を検査することをお勧めします。問題はハードウェアである恐れもあります。データ復元する時、最新版のiTunesを利用しないことも問題になる可能性があります。
[iPadがリカバリーモードにスタックされた場合の修復方法](https://www.eelphone.jp/solution/ipad-stuck-in-recovery-mode.html)
[iPhoneアップデートして固まった後の修復方法](https://www.eelphone.jp/solution/how-to-fix-a-frozen-iphone.html)
[DFUモードにスタックされたiPhoneを修復する方法](https://www.eelphone.jp/dfu/how-to-fix-iphone-stuck-in-dfu-mode.html)
Eclipse上でFlywayを追加・設定・実行

#　EclipseプロジェクトにFlywayを追加・設定・実行までの手順

今回はmavenプロジェクトでflywayを追加などを説明

## 追加手順

pom.xmlにFlywayのdependencyを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546056/57acfdc6-d199-30ed-bcb7-4d12681fb6b9.png)

		<dependency>
			<groupId>org.flywaydb</groupId>
			<artifactId>flyway-core</artifactId>
		</dependency>

## 接続設定

pom.xmlに

project > build > plugins の中にpluginを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546056/d7107dbe-a0df-5199-fdb8-cae5e73b1cdf.png)

			<plugin>
				<groupId>org.flywaydb</groupId>
				<artifactId>flyway-maven-plugin</artifactId>
				<configuration>
					<user>user<user>
					<password>password</password>
					<url>jdbc:mysql://localhost:3306/databaseName?serverTimezone=UTC</url>
					<schemas>
						<schema>schemaName</schema>
					</schemas>
				</configuration>
			</plugin>

## 実行

プロジェクトのrootフォルダーの中に「shift+MR」（shift +　右クリック）で「powershell。。。」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546056/78d82ef8-cf97-4a19-97e6-46e4ad987549.png)

PowerShellを開いた後以下のコードを実行
> ./mvnw clean flyway:migrate 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546056/8c52e0a4-5a8e-c590-f5a5-cedb9a2f2060.png)
git rebase で FIRST COMMIT を後から追加する

# はじめに
諸事情で README.md のみの FIRST COMMIT が必要になった。
後から歴史を改変し FIRST COMMIT を履歴の最初にcommitする方法について記載する。

# 以下手順

1. これまでの歴史を無視したブランチを新規に作成する
``` git checkout --orphan [ブランチ名]```

2. リポジトリ内の既存のファイルがインデックスに追加された状態になるので、```git rm --cached``` でまとめてインデックスから削除。（ファイルも削除しておく）

3. お目当の README.md を作成し、FIRST COMMIT を作成


4. 対象ブランチへcheckout
```git checkout [改変したいブランチ]```

5. git rebase で FIRST COMMIT を取り込む
``` git rebase --onto [1のブランチ名] --root [4のブランチ名]```

6. CONFLICT の解決
履歴にファイル削除されてたりすると、CONFLICTが生じるので、
```git rebase --continue```
```git rebase --skip```
で内容を見ながら頑張る

7. git log で履歴を確認

# まとめ
歴史を改変し、後から FIRST COMMIT を追加する手順について記載した。

滅多にやらないだろうけど、忘れるだろうから記録として記載しておく。
歴史が古いと結構大変なので覚悟すること。
AWS EC2 AmazonLinux2 Gitをインストールする

# 目的

- AmazonLinux2インスタンスにGitをインストールする方法をまとめる。

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| AWS EC2インスタンス | AmazonLinux2 | こちらの方法を用いてイメージからインスタンスを作成→[AWS EC2 をMacで使ってみよう!](https://qiita.com/miriwo/items/a1ab84c098008e43d042) |

# 前提情報

- 下記、または下記に準ずる方法でAWS EC2 AmazonLinux2インスタンスが起動していること。
    - [AWS EC2 をMacで使ってみよう!](https://qiita.com/miriwo/items/a1ab84c098008e43d042)


# 説明完了時の状況

- インスタンス内で`$ git version`がエラーなく実行できる。

# 詳細

- これより説明で実行するコマンドは全てインスタンスにssh接続した上で実行する。

1. 下記コマンドを実行してyumを最新の状態にする。

    ```terminal
    $ sudo yum update
    ```
1. 下記コマンドを実行してgitのパッケージをインストールする。

    ```terminal
    $ sudo yum install git
    ```
1. 下記コマンドを実行してgitのインストールを確認する。

    ```terminal
    $ git version
    ```
denoを使ってみた感想

　最近何かと話題沸騰しているdenoを使ってみたので、その所感を書いてみようと思います。あくまで個人の感想です。denoに関しての詳しい説明は[Denoとはなにか - 実際につかってみる](https://qiita.com/azukiazusa/items/8238c0c68ed525377883)を読んでいただいた方が良いと思います。
#denoを好きになりました
##良い点
###typescriptが標準で使える。
　今までtypescriptを使ったことがなかったんですが、denoを使うに当たってようやく重い腰を上げて使い始めました。denoの環境構築するだけでtypescriptが使えるのは便利かなと感じます。
###ブラウザ向けの関数も使える
 fetchとかそうなんですけど、nodejsだと普通に使えなかったブラウザ用の関数が使えるのは便利だと感じました。
###GitHubから直接importできる
　URLのblobの部分をrawに変えるだけでimportできます。詳しいやり方は[Denoの自作モジュールをGitHubから読み込む](https://qiita.com/windchime-yk/items/991c9d9213c8bb467dde)を読んでいただくと良いと思います。

###余計にストレージの容量を食わない
　npmの様にローカルファイルにインストールするわけではないので、容量を食いません。かと言ってコンパイルの度に毎回importするモジュールをダウンロードするわけではなく、キャッシュする仕組みがあるので動きも軽量です。　

###標準モジュールが便利
　標準モジュールがnodeより豊富で、writeJsonSyncなんていうJSON専用の書き込みモジュールなんてものもあります。中身の実装見てみると普通にオブジェクトをJSON.stringify()してDeno.writeFileSync()しているだけなんで、自分で実装するのとそう変わりない気もしますが、標準モジュールにあるならそれ使った方が早いですよね。そう考えると便利かなと思いました。
　gitHubからimportするテストも兼ねて、ちょっとしたモジュールを公開したので、気になる人は見てみてください。JSONのソートを実装するたびちょっと面倒だなと感じることが多かったので作りました。https://github.com/R-Az/deno_jsonSort

##悪い点
###Denoというオブジェクトがエラー扱い(当然)されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455591/6c6761f5-44c8-03d7-9af0-590b8339866f.png)
　Denoというオブジェクトからいろいろな関数が呼び出せるみたいなんですが、VSCodeではグローバル変数として(？)認識されていません。コンパイルしたら普通に通るのに、エラー表示になっているのは地味にストレスです。対策を探していますがそもそもVSCodeの仕様を把握しきれていないので、何か知っている人がいらしたら教えてくださると嬉しいです。


2020/06/09　**追記** コメント欄にて解決方法をお教えいただきました。@k-izumiさんありがとうございます！
>下の記事を参考に
deno types > deno.d.ts
を実行したら型定義ファイルができて Deno.*** にエラーが出なくなりました。
https://qiita.com/syumai/items/b84f9508036b026bef26

もしVSCodeが反応しないようなら、一度deno.d.tsファイルを開いて上げると認識しました。


###名前が紛らわしい(日本語のみ)
　すごいしょうもない事なんですけど、denoって文字列を各種検索エンジンは「での」って日本語と勘違いするときがあるみたいで、想定外の結果になることがあります。
![deno検索結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455591/fd66348d-2a8c-6d91-b36a-0cd4f3d83bcd.png)
　とはいえこれは、今後denoが普及すれば解決する問題だとは思うので、あんまり気にしなくても良いですよね。~~検索結果の画像を見せたかっただけです。逆にローマ字を日本語として認識する検索エンジンが凄いと思いました。~~

##まとめ
　この記事で書いた以外にも良い点はいっぱいあります。新規でプロジェクトを立ち上げるならdenoを使ってみるのも選択肢に上がるんじゃないでしょうか。兎にも角にも一回使ってみると良いと思います。私はdenoを好きだと感じたので、個人開発するときは積極的に使おうと思います。
　
##おまけ
　npmみたいに予めインストールするわけではないので、Denoのimportするモジュールにはコード補完が普通には効きません。VSCodeならExtentionを入れて、その上で下記のコマンドを叩くか、一度コンパイルするとコード補完が効くようになります。（因みに1.0.0より前は、fetchってサブコマンドだったらしいです）

```bash
deno cache ファイル名.ts
```
Flutter の基礎知識


# 概要

久々に触るといろいろ忘れていたので備忘録。
公式ドキュメントが充実しているのがありがたい。

Flutter の基礎理解の流れとしては、サンプルプログラム（Project作成時にすでにあるカウンターアプリ）の`main.dart`を理解すれば十分。

あとは必要に応じて公式ドキュメントを参照するのがbest だと思う。



#サンプルの main.dart 

- [このQiita記事](https://qiita.com/h-hiroki/items/a2030fa76e7f8d1ce647)がすごいわかりやすかった。



### 以下 +αの補足

- private なクラス名・メソッド名・変数名の先頭に`_`をつける。
    - 勝手にエラー検知してくれる。
    - `State`の実装には`_`つけるのが一般的。
    - [参考記事(StackOverflow)](https://stackoverflow.com/questions/53142171/what-does-underscore-before-variable-name-mean-for-flutter)






## Flutter は基本全てが`Widget`

 UIも、widget を複数組み合わせて構築している。

-  `Widget は immutable`  
immutable （doesn't change）だが、頻繁に replaceされる。  
それは Widget の `State` が変わると Widget は再構築される設計だから。





## State とはなんぞや。
  
  -  [公式ページ](https://flutter.dev/docs/development/data-and-backend/state-mgmt/intro)が超わかりやすい。
    -  **Widgetが持つ状態のこと。**


#### なんのためにあるのか？
    
- Flutter の設計で、state（状態）が変化したとき（例えばユーザーのボタンクリック時）そのWidget を 再構築するようになっている。
    - Flutter は画面描写が高速なのでこれが可能。
        - この辺りの設計思想についての[公式ページ記事](https://flutter.dev/docs/development/data-and-backend/state-mgmt/simple)  

<img width="300" alt="スクリーンショット 2020-06-09 11.58.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266096/f1ac78fe-0af0-15b3-c586-50c844edae26.png">


<img width="300" alt="スクリーンショット 2020-06-09 12.05.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266096/43f5597e-44fa-4599-91f0-0ed1e3f9a4a1.png">
図： flutter widget のStateには `App State`と`Ephemeral State`がある。
テンプレートリテラル記法マスターまでの道のり

# テンプレートリテラル記法って何？
JSの中で分かりやすくHTML要素を書き込むためにあるものです。
書き方はバックティック文字（｀）で囲みます。
これはめちゃくちゃ便利です。

##改行はそのままでOK！
以下の例を見てください

```javascript
var a = `ジャバ\nスク
リプト`;
console.log( a ); // ジャバ⏎スク⏎リプト
```
本来なら改行は\nで処理するはずでしたが、リテラル記法では
改行はそのまま改行すれば反映されます。
もちろん\nでもそのまま反映されます。

##そのまま文字にしたい時
String.rawでそのまま文字にできます。
以下、例です

```javascript
var a = String.raw`ジャバ\スク\nリプト`;
console.log( a ); // ジャバ\スク\nリプト
```
これだと\nの文字もそのまま書き込むことができます。

##変数や計算式を入れるためには？
以下、例です。

```javascript
var a = "Yes"
var b = `ジャバ${a}スク${111+222}リプト`;
console.log( b ); // ジャバYesスク333リプト
```
${}で囲めば大丈夫です。これもシンプルでいいですよね。
Linuxで4GB以上のZIPファイルを解凍する。

## 結論

- 4GB以上のZIPファイルは作成しない、もらわない。
- tarや7zなどでもらう。
- もらってしまった場合は相手のOSを確認する。
    - Linux系、mac系なら7zで解凍できる。
    - Windows系はエンコード問題が発生するので、unarを利用する。(全部unarでもいい)

## 背景というか何が起きたのか？

顧客から大容量のローカルに保存してあるファイルをいただきました。
元の容量が数百GBということと、コロナの影響で物理的にわたしづらいということもあり、顧客側できりの良いところで分割してファイルサーバにアップロードしてもらったのですが、そのファイルたちが1ファイル2～10GBのZIPだったというのが、ことの初まりです。
ローカルのPCで数百GBを捌けないので、ubuntuサーバーで解凍しようとしたけどいろいろな問題にはまりました。

## 1. 4GBを越えたZIPファイルはUNZIPできない。

unzipもとい裏のライブラリの影響で、4GBを越えるものは下記のようなエラーとなり解凍できません。
びっくりですね。

```
Archive: xyz.zip
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
```

この問題だけであれば、7zをインストールすることで解決できます。

```bash
sudo apt install p7zip-full
```

7zでは解凍はe,xのどちらかでできますが、eはフォルダー構造を無視して解凍するので普通ならxで解凍します。

```bash
7z x -o destdir xyz.zip
```

## 2. SHIFT-JISが文字化け

Windowsの日本語ユーザーの殆どの方はをSHIFT-JIS標準で使われています。ZIPでは文字コードを変換したりしないため、SJISのファイル名はそのままSJISとして保存されています。
最近のLinuxやMacはUTF8ですので、解凍時に文字化けした状態となります。
ググると色々な解法(LANGの設定を変更すればいいとかconvnv使うとか)が出てきますが、どれを試しても上手くいきませんでした。

いろいろググった結果、unarで解凍で一発解決になりました。
インストールは下記で可能です

```bash
sudo apt install unar
```

解凍はシンプルに

```bash
unar xyz.zip
```
でできます。フォルダーが存在していると上書きかどうか聞いてきますので、面倒な場合は`-f`を利用するといいです。

## 最後に

色々あるとおもいますが、ZIPつかわない方が幸せになれそうです。
AWS(AmazonLinux2)でPHP7.4インストール

# 背景
AmazonLinux2リポジトリのPHPのバージョンが古く、以前まではRemi7をリポジトリに登録してAwsにPHP環境を作成していたが、一部でインストールする際など諸々考慮が必要となり、管理が煩雑となることから「amazon-linux-extras」を利用するよう変更したら、諸々楽になったので、メモ

# Extraインストール
```cmd
sudo amazon-linux-extras install php7.4
sudo yum update
```

# phpインストール
```cmd
sudo yum install php php-mbstring
```
【Golang】標準パッケージ ioutil

#【Golang】標準パッケージ ioutil
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

```
package main

//ioutil
/*
osでも代用できるが、目的によって使い分ける。osはcdなどの一部にファイルの読み込みがある。

ioutilは、ioに特化したパッケージ。パケットを読み込んで、書き出すなど。

ファイルの読み込みなど

############

I/Oとは、Input/Outputの略で「入出力」を意味しています。
コンピューターは情報を入力（input）し、計算結果を出力（output）するという処理を行なっていますが、これらの処理を総称してI/Oと呼んでいます。

頻繁にデータの入出力が繰り返されることにより、ハードウェアやネットワークにI/O処理の負荷が発生することがあります。ハードディスクなどの記憶媒体に対するデータの読み書きについては「ディスクI/O」、ネットワークに対する入出力については「ネットワークI/O」と、I/O負荷の発生場所によって区別して表記することがあります。

大容量のデータの送受信にあたっては、リソースのI/O性能の高さが求められることになります。
*/

import (
	"bytes"
	"fmt"
	"io/ioutil"
)

func main() {
	//ファイルを読み込む。エラーハンドリング
	//content, err := ioutil.ReadFile("time.go")
	//if err != nil{
	//	log.Fatalln(err)
	//}
	//fmt.Println(string(content))

	//書き込み
	//if err := ioutil.WriteFile("ioutil_temp.go", content, 0666); err != nil{
	//	log.Fatalln(err)
	//}

	//byte配列を読み込む
	//NewBuffer byte配列を一時的に記憶領域に書き込む
	r := bytes.NewBuffer([]byte("abcdefg"))
	//読み込む
	content, _ := ioutil.ReadAll(r)
	//変換
	fmt.Println(string(content))
}

```
Twitterのお気に入り画像を取得するプログラム

#このプログラムを作った背景
・「いいね」したtweetの画像を手元に置いておきたいと思ったため。
・過去に「いいね」したtweetを遡って見るため。

自分がこのプログラムを書いた目的は自分が感じる不便を解消したいと思ったからです。

過去の「いいね」したtweetを見ようとすると、今のTwitterの仕様では画面を下にスクロールして探すしか方法がなく、とても使いにくいと感じていました。

この問題をなんとか解決できないかと考えながら調べたところ、Twitterを管理している会社がapiを提供していることを知りました。この方法でなら自分で作れそうと思い、python言語でこのプログラムを作りました。

#コードのこだわり

このプログラムには2つのこだわりがあります。

1つは可読性が高いコードを目指して作ったことです。コードを読む人や未来の自分がなるだけ少ない時間で理解できるようにするためです。

メイン処理部分をスッキリさせるため関数を利用し、関数名もどのような処理を中で行っているのかがわかりやすいように工夫しました。

2つ目はカスタマイズがしやすいものであることです。

コードの初めにある変数の値を変更することで、取得するユーザーのアカウントや画像の数を変えられるというものです。

また画像保存フォルダに保存できる、画像の上限数を設定できるようにしました。

#使った技術

Python……骨格になるコードをこの言語で作成した。
Pandas……python内でデータフレームを扱えるようにするためのライブラリ。
request……pythonからurlパスの先にデータが存在するかを確認するために利用。
json……python内でjson形式のデータを扱えるようにするためのライブラリ。
csv……pythonからcsvファイル形式で出力できるようにするため利用。
os……pythonで保存フォルダまでのディレクトリパスを利用できるように使用した。
re……python内で正規表現操作をするために利用。これでwindowsの環境で利用できない文字や記号を削除した。
Twitter API……Twitter社が提供する公式のAPI。これを利用してtweetを取得。
Tweepy……python内でTwitterAPIの利用を簡単にしてくれるライブラリ。
JupyterNotebook……メインエディターとして利用した。この中でコードの試行錯誤を行った。
VScode……エディター。最後にコードの清書とプログラムの実行テストのために利用した。
Sourcetree……gitでバージョン管理やコードのバックアップをするために利用。

#ソースコード
ソースコード…https://gist.github.com/takutakumi/999a8e76fe725f4e38002bf39c5657d7
指標と測定を理解する

# 広告の指標・KPI
## 認知広告
- 純粋想起
    - 助けなしで想起するブランド
    - 全国100人に「ファストフードのブランドと言えば？」と聞いて、「マクドナルド」と答えた人が30人であれば、マクドナルドの純粋想起は30%となる
- 助成想起
    - 助けありで想起するブランド
    - 全国100人に「マクドナルドって知ってる？」と聞いて、「知ってる」と答えた人が80人であれば、マクドナルドの助成想起は80%となる
    - ブランドリフト
        - 広告接触者と非接触者を比較して、助成想起にどれだけ差が生まれたかを計測する
    - サーチリフト
        - 広告接触者と非接触者を比較して、ブランド指名検索数にどれだけ差が生まれたかを計測する
## 獲得広告
- 量を表す5つの指標
    - Imps: 表示回数(Impressions)
    - Clicks: クリック数(Sessions)
    - CVs: 獲得数(Conversions)
    - Costs: 費用
    - Sales： 売上
- 率を表す7つの指標
    - CTR: クリック率(Click Through Rate)
    - CVR: コンバージョン率(Conversion Rate)
    - CPM: インプレッション単価(Cost per Mille)
    - CPC: クリック単価(Cost per Click)
    - CPA: 獲得単価(Cost per Acquisition)
    - SPA: 売上単価(Sales per Acquisition)
    - ROAS: 広告費用対効果(Return On Advertising Spend)

### 公式
- CPC = Costs/Clicks
- CPA = Costs / CVs
- ROAS = Sales / Costs
- ROAS = SPA / CPA
- CTR = Clicks / Imps
- Costs = CVs × CPA ｜ Clicks × CPC ｜ Imps × (CPM / 1000)

```
CPA = Costs / CVs
    = （Clicks × CPC）/ （Clicks × CVR）
    = CPC / CVR
→ CPAが高騰している原因は、CPCが高すぎる or CVRが低すぎるのどちらか
```

### 例題
あなたはECサイトの担当者です。商品は一着10,000円の服のみ。これをweb広告で宣伝しようと思います。商品原価を考慮すると、ROAS150%以上は確保しておきたい。

1. 上限CPAはいくらでしょうか

```
SPA = 10000
ROAS = 150%（= SPA / CPA）
∴ CPA = SPA / ROAS = (10000 / 1.5) = 6666.66…
よって、上限CPAは 6,666円
```

2. CPCが100円の場合、サイトのCVRは何%より高くする必要があるでしょうか

```
CPA = 6666
CPC = 100
CVR = CPC / CPA（ii.より）
    = 100 / 6666 = 0.01500...
よって、1.5%より高くする必要がある
```

# 広告の測定方法
- かつての測定: ラストクリックモデル
    - 最後のクリックに全ての評価をするという測定モデル
    - リレーで例えると、ボルトが第一走者で圧倒的差をつけて最終走者の人だけが評価される感じ
- 現在の測定： アトリビューションモデル
    - CVに至るまでの全ての評価を分配するという測定モデル
![スクリーンショット 2020-06-09 11.46.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239829/77a4ee3c-ab62-fde1-1c70-48ad620dcceb.png)

- 終点モデル(Last Interaction model)
  - ラストクリックモデルと同じ
 
    ![スクリーンショット 2020-06-09 11.46.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239829/71c30dcc-6efa-fed5-1e99-2dba836f1f59.png)


- 起点モデル(First Interaction model)
  - 流入時に重点を置く

![スクリーンショット 2020-06-09 11.46.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239829/de1e6732-ff88-dd2e-0505-11879dfa97f3.png)

- 線形モデル(Linear model)
    - 均等に評価を分配する
![スクリーンショット 2020-06-09 11.46.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239829/0ed66a53-013d-353e-64cc-d07d8b41120d.png)

- 減衰モデル(Time decay model)
    - CVに近い順から評価を高く分配する
![スクリーンショット 2020-06-09 11.47.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239829/1117ed13-f67f-612c-5629-62a124eb51b0.png)

- バスタブモデル・U-shapedモデル
    - 最初と最後の評価を高く分配する

![スクリーンショット 2020-06-09 11.47.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239829/b0f203e3-2a8e-8b98-4ef1-07d4b6a7e4be.png)
Dockerでnginxを一から構築した際に気付かなかったこと

dockerでlaravelの環境構築を行った際に、コンテナは立ち上がっているがどうもnginxと噛み合わないことがあったので書いてみました。
# docker-compose.ymlの作成
```docker-compose.yml
nginx:
    image: nginx:1.17-alpine
    container_name: web
    depends_on:
        - php-fpm
    ports:
        - 80:80
    volumes:
        - ./src:/work
        - ./docker/nginx/default.conf:/etc/nginx/default.conf
```
**これはnginxのみの設定です。**
php-fpmやmysqlなどその他の設定もありますが**省略**。そしてコンテナを立ち上げる。
laravelをインストールする流れは他と同じ。設定した全てのコンテナが立ち上げ、コンテナの中に入りcomposerでlaravelをインストール。

**これで完了！！と思ったが、laravelが起動しない！！！！**

このdocker-compose.ymlのnginxの記述をよく見ると、コンテナ側のnginxの設定ファイルのパスが間違っていますね。
`- ./docker/nginx/default.conf:/etc/nginx/default.conf`
ではなく、
`- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf`
こうです。正しくはこのdocker-compose.ymlです！！

```docker-compose.yml
nginx:
    image: nginx:1.17-alpine
    container_name: web
    depends_on:
        - php-fpm
    ports:
        - 80:80
    volumes:
        - ./src:/work
        - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
```

**conf.d**ディレクトリが抜けていた！ケアレスミス！！！ではなく、nginxの設定ファイルの構成が理解出来ていませんでした。

## なぜ、間違えたのか？

nginxの設定ファイルの構成を考えるとすぐ分かります。nginxの設定は、


```
 etc
  └─ nginx
       ├─ nginx.conf
       └─ conf.d
            ├─ defalut.conf
            ├─ *.conf
            :
```
nginx.confをまず読み込んでから、conf.dディレクトリの.confファイルをインクルードする流れです。つまり、このnginx.confとdefault.confがゴチャゴチャになっていました。私の場合、ホスト側の./docker/nginx/default.confではserverディレクティブの構成を記述していたので、これはコンテナ側のnginx/conf.d/default.confの内容ですね。

# まとめ
初歩的なミス。nginxのファイル構成を調べればすぐ出て来ますが、原因がなかなか見つけられず時間がかかってしまいました...
そもそも、nginxをしっかり調べてからを立ち上げれば良かっただけです。
Windows10+WSL2でパフォーマンスが改善されない場合のノウハウ(With Docker)

### 環境
1. Windows10
2. WSL2(Ubuntu)
3. VSCode
4. Docker(v19.x)
5. PHP7.3x + Laravel 5.8 + XDebug

### 導入
1. [WSL2導入](https://qiita.com/TsuyoshiUshio@github/items/947301bd9317610572fc)
2. [Widows Terminal導入](https://www.microsoft.com/ja-jp/p/windows-terminal/9n0dx20hk701)

### 問題点
1. WSL1から改善されたはずなのに重たい。
    2. VSCodeの読み込みが重たい / Laravelのcompose installが10分かかる...
3. npm run watchが動かない
    4. これは致命的。jsの更新が即時反映しない。npm run watch-pollすれば疑似動作はできますが、重たすぎる。。。

### 解決策
1. 重たい原因は、Dockerの環境をWindows側のフォルダにおいて、WSL2のUbuntuから参照させていたから。
[超参考元](https://www.tamaosa.com/2020/wsl2/)
2. 私の場合は Ubuntuから /mnt/c/home/systems(要はWindowsのC:\home\systems)に置いたプロジェクトを動かしていた事が問題。これを/home/ubuntu/systems/ に移動する。
（※ちな、mvとかcpでやると死ぬほど時間かかるから、割り切ってgit cloneし直すのも手だよ！）
3. dockerがぬるぬる動く（＾ｗ＾）
4. npm run watchもぬるぬる動く（＾ｗ＾）

### 原因
1. WSL2からWindows側のフォルダを参照する時に、ファイルシステムが原因となって、処理のボトルネックになる模様。詳しくは参考元をみてくだせい。

### memo
1. [WindowsのエクスプローラからUbuntuのディレクトリを参照する方法](https://qiita.com/Uchitaso/items/6e0a7859e87bb8bdb527)
[rails 5.2]public フォルダーにファイルを置くとき、「トレイリング スラッシュ」ありなし注意

# はじめに

ruby on rails に、public フォルダーの中に置いているものは、アクセスする方法共有と自分用にメモです

ファイル場所

```
/app
/bin
/config
...
/public
   ┣ /folder/img2.png
   | 
   ┗ img.png
```

アクセス方法

```
http://localhost:3030/folder/img2.png
http://localhost:3030/img.png
```

# ただし！

public folder の中に、index.html 置こうとした際には、「トレイリング スラッシュ」ありなし注意しましょう

例
ファイル場所

```
/app
/bin
/config
...
/public
   ┣ /folder/index.html
   | /folder/index.css
   ┗ /folder/img.png
```

index.html

```
<html>
<link rel="stylesheet" href="index.css">
...
<img src="img.png" />
</html>

```


リンク

```
http://localhost:3030/folder
```
アクセスすれば、folder にある index.html はアクセスし、
index.html 中にあるcss や png は folderの中に取得して表示されるようにするはずですが、

なんと、

css と png のパス確認すると、以下からのリンク取ろうとしています

```
http://localhost:3030/index.css
http://localhost:3030/img.png
```

検証してみたら、

アクセスは

```
http://localhost:3030/folder/
```

試してみたら、大丈夫でした。

改めて、URLの最後に付ける「トレイリング スラッシュ」ありなしは注意する必要がある。

トレイリングスラッシュなしの「folder」⇒ folderというファイルをリクエスト
トレイリングスラッシュありの「folder/」⇒ folderというディレクトリをリクエスト

らしいです

これは、ruby on rails に限りなく、URL sub directory のルールとなっています。

以上です。
vue.js + typescript development / production環境でbuildするソースを変える１つの方法

# やりたいこと
development環境とproduction環境で読み込む ts / jsファイルを 切り替えたい。

1例として「ローカル環境での開発時は、JSONファイルやJSで動的に生成したデータを取得し、その他の時にはrestapiでデータを取得するようしたい」など

私自身はvue,typescript,webpack等の知識は皆無に等しいので、あくまでも上の開発環境を実現したくて設定した１例になります。なので、よりスマートな方法があるかもしれません。

# 環境

node.js v12.10.0
vue.js v2.6.11
typescript v3.8.3

# ファイル構成

対応前の構成（抜粋）
<Pre>
- /src
    - ./restapi
        -   aaa_api.ts ... aaaに関するデータ取得
        -   bbb_api.ts ... bbbに関するデータ取得
</pre>

これをdevelopment / production時で読むソースファイルを切り替えられるようにする。
<pre>
- /src
    - ./restapi
        - ./development ... NODE_ENV==development時はこっちを利用する
            - aaa_api.ts
            - bbb_api.ts
        -  ./production ... NODE_ENV==production時はこっちを利用する
            -  aaa_api.ts
            -  bbb_api.ts
</pre>
# 手順

## 1 vue.config.jsにpathのaliasを設定する。

```javascript

const path = require('path');
module.exports = {

  chainWebpack: config => {
    if( process.env.NODE_ENV === 'production' ) {
        // @@/myapiというのは適当な名称です。
        config.resolve.alias.set(‘@@/myapi', path.resolve(__dirname, 'src/restapi/production')); // ~/apiがts/vueから、このパスをimport するときのエイリアスになる。
    } else {
        config.resolve.alias.set(‘@@/myapi', path.resolve(__dirname, 'src/restapi/development'));
    }
  }
}
```

参考
https://webpack.js.org/configuration/resolve/
https://github.com/vuejs/vue-cli/issues/2398
http://kinoue3.hatenablog.com/entry/2016/11/18/233946
https://github.com/vuejs/vue-cli/blob/ff57b8f55fa69873f643e418cfe6d4842d7c7674/packages/%40vue/cli-service/lib/config/base.js#L49-L50

# 2 tsconfig.jsonでincludeするパスを指定する

```json
"compilerOption": {
  "paths": { 
     “@@/myapi”: [ "src/restapi/production/*”, “src/restapi/development/*” ], 
     “@/*“:  [ "src/*" ] 
  }
}
```

この箇所は、可能であれば “@@/\*”: [“src/\*”]（もしくは “src/\*\*/production/\*, “src/\*\*/development/\* )的な指定をしたかったのですが、解決できませんでした。

参考
https://www.typescriptlang.org/docs/handbook/module-resolution.html
https://stackoverflow.com/questions/54561799/vue-typescript-error-with-webpack-alias-path-not-found


# 3 利用する

```js
import AAA from '@@/myapi/AAA' // NODE_ENVに応じて、restapi/production/aaa_api.tsか
                               // restapi/development/aaa.tsのどちらかがimportされる。
```
Ruby on Railsチュートリアルを逆走したらGemNotFoundException

## 環境
- macOS Catalina 10.15.5

## やろうとしたこと

[Ruby on Railsチュートリアル 第4版の第3章](https://railstutorial.jp/chapters/static_pages?version=5.1#cha-static_pages)、3.1セットアップから始めたら詰まった。
(第6版を先行してやっていたが第4章から有料 & 周回が必須っぽいので、先に第4版を終わらせてから6版に行こうとした)

## 現象

```terminal:terminal
% rails _5.1.6_ new sample_app
Traceback (most recent call last):
	2: from /usr/local/bin/rails:23:in `<main>'
	1: from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems.rb:302:in `activate_bin_path'
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems.rb:283:in `find_spec_for_exe': can't find gem railties (= 5.1.6) with executable rails (Gem::GemNotFoundException)
```

「そんなgemしらない」って言ってる。

## 解決策

じゃあgem入れようそうしよう。
[第4版 第1章](https://railstutorial.jp/chapters/beginning?version=5.1#sec-installing_rails)に記載があるコマンドを叩きます。

```terminal:terminal
% gem install rails -v 5.1.6
Fetching activesupport-5.1.6.gem
(中略)
Fetching activerecord-5.1.6.gem
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.6.0 directory.
```

「権限ない」って行ってるので、`sudo`つけて再トライ。

```terminal:terminal
% sudo gem install rails -v 5.1.6
Password:
Fetching actionview-5.1.6.gem
(中略)
Done installing documentation for activesupport, actionview, actionpack, railties, websocket-driver, actioncable, activejob, actionmailer, arel, activemodel, activerecord, rails after 12 seconds
12 gems installed
```

無事インストールできたので、プロジェクトを作ってみましょう。

```terminal:terminal
% rails _5.1.6_ new sample_app   
      create  
      create  README.md
(中略)
* bin/rails: Spring inserted
% ls
sample_app
```

無事作れました。めでたしめでたし。

## 教訓

チュートリアル系はつまみ食いしないで頭からやろう。
graphql-ruby でS3の署名付きURLを発行するためだけのmutation

フロントから直でS3にアップロードしたい時に署名付きのURLを発行すると思うが、それを行うための mutation を書いた。

### バージョン情報
Ruby: 2.6.3
graphql-ruby: 1.10.1
aws-sdk-s3 1.67.1


```ruby
# frozen_string_literal: true

require 'aws-sdk-s3'

module Mutations
  class CreateS3PresignedUrlMutation < Mutations::BaseMutation
    description 'S3アップロードのための署名付きURLの発行'

    argument :filename, String, required: true

    field :presigned_url, String, null: true
    field :presigned_fields, GraphQL::Types::JSON, null: true
    field :errors, [Types::ObjectTypes::GraphqlError], null: false

    def resolve(filename:)
      credentials = Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'])
      s3_resource = Aws::S3::Resource.new(region: ENV['S3_REGION'], credentials: credentials)
      s3_bucket = s3_resource.bucket(ENV['S3_BUCKET_NAME'])

      # 仮に同じfilenameでも被らんように uuid を発行している。ユースケースに応じて他のID使うなりするといい
      key = "uploads/#{SecureRandom.uuid}/#{filename}"

      presigned_object = s3_bucket.presigned_post(key: key, acl: 'public-read', success_action_status: '201')

      if presigned_object
        {
          presigned_url: presigned_object.url,
          # ここで `no implicit conversion of nil into String` が起きる方は aws-sdk-s3 のバージョンが低い可能性があります
          # https://github.com/aws/aws-sdk-ruby/issues/1071#issuecomment-173994607
          presigned_fields: presigned_object.fields,
          errors: []
        }
      else
        # エラーレスポンスを返す
      end
    end
  end
end

```
WSL2が一般提供されたので改めてWindowsでの開発環境を整えた時の参考URL


[「WSL 2」が今後の主流に？ LinuxのGUIアプリも動作可能？ ～「WSL」のこれからに注目]
(https://forest.watch.impress.co.jp/docs/serial/yajiuma/1257/032/index.html)

[Windows 10 Home で WSL 2 + Docker を使う]
(https://qiita.com/KoKeCross/items/a6365af2594a102a817b)

[WSL2時代のDocker開発スタイル]
(https://nabinno.github.io/f/2019/07/06/WSL2%E6%99%82%E4%BB%A3%E3%81%AEDocker%E9%96%8B%E7%99%BA%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB.html)


[WSL2 + VScodeでWindowsから一瞬でDockerコンテナ内に引き篭もれる開発環境を整えたかった]
(https://qiita.com/iridon0920/items/005a9224343413b74f78)

[WSL+pyenv+pipenv+VSCodeで令和モダンなpython仮想環境を構築しよう！]
(https://highso.hatenablog.com/entry/2020/01/16/180000)

[【WSL / WSL2】VSCode×WSLでWindows上にLinux開発環境を構築]
(https://qiita.com/_masa_u/items/d3c1fa7898b0783bc3ed)

[WSL+Pyenv+Jupyter+VSCodeでPythonの環境を構築する]
(https://qiita.com/HoriThe3rd/items/ea4c98f8518d107bd161)
XAMLにシングルトンをバインディング

下記のようなシングルトンがあった場合

```csharp:シングルトン
namespace test
{
	public class Setting {
		static Setting instance = new Setting();
		static public Setting I { get{ return instance; } }
		
		public double Font_Size { get; set; }
	}
}

```

下記のようにバインディングします。

```xml:xaml
<UserControl x:Class="test.ucInput"
	     xmlns:local="clr-namespace:test"
>
........

<Setter Property="FontSize" Value="{Binding Font_Size, Source={x:Static local:Setting.I}}"/>
```
複数のカラムを更新するメソッドまとめ【Ruby on Rails】

Railsには複数のカラムを同時に更新するメソッドが複数あるため、違いをまとめました。

---
### assign_attributes

<strong>特徴</strong>

* DBの保存はされない。
* alias(別名) は attributes=

<strong>使用例</strong> (Userというテーブルがある場合)

```ruby
user = User.first
user.assign_attributes(family_name: "foo", given_name: "bar")
user.save

#attribute=の場合
user.attributes = { family_name: "foo", given_name: "bar" }
```

保存はされないので、saveを呼び出す必要があります。

---
### update_attributes

<strong>特徴</strong>

* DBに保存される。
* alias(別名) は update
* バリデーションのチェックやコールバックの呼び出しも行われる。
* 保存の可否をtrueかfalseで返す。

<strong>使用例</strong>

```ruby
user = User.first
user.update_attributes(family_name: "foo", given_name: "bar")

#updateの場合
user.update(family_name: "foo", given_name: "bar")
```

saveを別途に呼び出す必要はありません。

---
### update_attributes!

<strong>特徴</strong>

* 保存に失敗した場合、例外が発生する。
* aliasはupdate!

<strong>使用例</strong>

```ruby
user = User.first
user.update_attributes!(family_name: "foo", given_name: "bar")

#update!の場合
user.update!(family_name: "foo", given_name: "bar")
```
update_attributesとは結果の返し方が異なります。

---
### update_columns

<strong>特徴</strong>

* データベースに直接アクセスするため、最も更新速度が速い。
* バリデーションのチェックやコールバックの呼び出しが行われない。
* update_atが更新されない。

<strong>使用例</strong>

```ruby
user = User.first
user.update_columns(family_name: "foo", given_name: "bar")
```
バリデーションのチェックやコールバックの呼び出しがないので注意が必要です。



---
参考
https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update_attributes
Cognos Analytics 11.1の各バージョンのFix一覧情報

#Cognos Analytics Fix一覧
Cognos Analytics 11.1.XのFix一覧はあるのかと良く聞かれます。

CA 11.0.11までは公開されていたのですが、その後長らく公開していませんでしたが、最近になってひっそりと公開を再開したようです。

こちらのサイトで、CA 11.1.3以降のFix一覧をPDFでダウンロードできます。
**IBM Cognos Analytics 11.x Fix Lists**
https://www.ibm.com/support/pages/node/6195689

CA 11.0.11以前はこちらで可能でした。
**Cognos Analytics 11.0 Fix Lists**
https://www.ibm.com/support/pages/node/607169

必要な時に思い出して頂ければと思います。
AWSラムダを全く理解していない人間が練習

###あくまで備忘録です
#やりたいことだけ明確に
###まず、目標
※この部分を書いている時点で一切の作業をしていません
AWSのラムダを使うとしてお金がかかるので、ローカル（Windows環境）にダウンロードできるものだけでラムダを作りたい。
htmlで書いた(ここの言語は未定)Webサイトにアクセスし、Pythonの書かれたラムダに投げて帰ってきたデータでhtmlを更新する、なんて形を取れればいいと思っている。
~~静的なWebサイトを作るのであればS3でもいいとか言ってはいけない~~

#何をダウンロードしよう
ググったところ[[参考：A]](https://dev.classmethod.jp/articles/invoke-aws-lambda-python-locally/)のサイトを見つけたので内容を確認。**python-lambda-local**というものを使えばいいらしいので早速インストール

cmdからpipでダウンロード~~pipがナニか変わらなかった無知な自分は[こちら](https://techacademy.jp/magazine/21161)~~

```
> pip install python-lambda-local
> python-lambda-local --version
'python-lambda-local' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

```

・・・・・・あれ？インストールできてない？？

よく見てみると

```
ERROR: Could not install packages due to an EnvironmentError: [WinError 5] アクセスが拒否されました。: 'c:\\programdata\\anaconda3\\lib\\site-packages\\docutils-0.16.dist-info\\COPYING.txt'
Consider using the `--user` option or check the permissions.
```

~~管理者権限になっていませんでした。失敗は成功の母といいますしそのまま載せていきます。~~

```
>python-lambda-local --version
python-lambda-local 0.1.12
```

こんどこそインストールできました。

#インストールまで終わったら

おそらく興味がある人が読むとしたらここから。だって初心者用の記事だとインストール実行までだし、~~逆に詳しい記事だと何かいてあるかわからないし~~。

初めに書けよというかもしれませんが、実行環境はあまり説明しません。何が入ってるから動くとか、パスの設定何してあるから動くとか普段使いしているとわからなくなるので。
できる限りその場でインストールしたもののバージョンなんかは書いていくつもりですが……
[[参考：A]](https://dev.classmethod.jp/articles/invoke-aws-lambda-python-locally/)のサイトではlambda-uploaderを入れていますが、現状使っているAWSアカウントも無くアップロード先が無いのでとりあえずスキップ。

###このあたりですでに暗雲が立ち込めている気がしますがもう少し頑張ります

[[参考：B]](https://dev.classmethod.jp/articles/invoke-aws-lambda-python-locally/)サイトをもとにjsonとpyファイルを作成。

ちなみに、ファイルを作成する際に使っているテキストエディタはMeryです。コレ、機能が最低限のわりに使い勝手がいいから好きなんです。サクラエディタとかアトムとかも使いますが、普段使いはコレですね。

```event.json
{
  "key1": "おはよう",
  "key2": "こんにちは",
  "key3": "テスト",
  "key4": "Hello",
  "key5": "Good Afternoon"
}
```

```lambda_function.py

import sys
import json
import random as rn

def lambda_handler(event, context):
    sys.stderr.write("*** lambda_handler *** start ***\n")
    print("Received event: " + json.dumps(event, indent=2))
    
    keys=['key1','key2','key3','key4','key5']
    
    print("AAA value1 = " + event[keys[rn.randint(0,4)]])
    sys.stderr.write("*** lambda_handler *** end ***\n")

    return event['key1']
```
    
このファイルを作成し、どこにプログラムを置いて起動しようかと調べていた際に異変が
[[参考：C]](https://qiita.com/tanj/items/70c57ed9ca742884c61e)どうやらWindows環境だとpython-lambda-localが動かないらしい。

うーん、ここまでやったのに。

備忘録として残しておきますが、この先やるかは未定です（やれそうなら追加で書きます）


#参考文献
[参考：A]https://dev.classmethod.jp/articles/invoke-aws-lambda-python-locally/
[参考：B]https://dev.classmethod.jp/articles/invoke-aws-lambda-python-locally/
[参考：C]https://qiita.com/tanj/items/70c57ed9ca742884c61e


##脱線したときに読んでいた記事
https://www.gixo.jp/blog/3965/
GALプログラマVPP問題

VPPの電圧の調整などを完全自動化を行うと回路が大きくなるので、部分的に手動化して回路を小さくすることを目指します。

VPPに設定しなければいけない電圧は読み出し時の12Vと書き込み時のチップごとの14V-16.5Vがあります。

VPPはEPROMの時代からあり、初期のEPROMの2716,2732は25Vで2764は21Vでした。その後12.5VなものがでてきてEPROMからFlashに移り、初期のFlashはVPPがありましたが、じきに単一5Vで書き込みできるようになりました。

5Vを昇圧して、レギュレータで目的の電圧を作る方法があります。昇圧にはTL497AやMC34063やLT1054などが候補になりました。

レギュレータはLM317あたりでしょうか。

常に書き込み電圧で処理する方法もありますが、ちょっと心配なのでまずは12Vで試したいと思いました。

ただ毎回12Vと書き込み用の電圧を調整するのは面倒です。

たまたま[ATTinyのリセッター](http://denshiken.my.coocan.jp/AVR004.html)を作った時に買ったMAX662Aのストックがありました。これは12Vの昇圧チップとなっていますが、データーシートを見ると20Vも生成できることがわかりました。ネットで検索してもデュアル電源で使っているケースはあまり見当たりませんでした。

MAX662AとLM317を使うことにしました。LM317は330Ωの抵抗と5KΩの可変抵抗を使いました。

![写真（2020-06-09 10.18）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/4b92714d-ac37-9c7d-b289-3bc66ad85082.jpeg)

12Vと書き込み用電圧はスイッチで切り替えて、VPP自体のコントロールはRN2202と2SC945を使うことにしました。

![写真（2020-06-09 10.18） #2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/5fa9e2c1-835d-cd5d-662f-6c91c42e5b85.jpeg)

40年前にROMライターを作ろうとして作った電源を見直したのだが、トランスの出力が24VなのにMC78L24を使っていた。正常に動かないと思う。結局ROMライターは作れなかったので、問題に気がつかなかったのだが、なんてもの作ってたかな。

LM317に代えて、可変の電源に仕立て直しました。

![IMG_20211017_094347.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/4abde544-cc88-2b9d-6f42-5121143a7bc3.jpeg)
Linuxで手軽にCPU/メモリの負荷をかける方法

#今日の目標
サーバー構築後、Linuxのリソースの負荷試験を実施する際にLinuxの標準機能だけで負荷を発生させる簡単な方法を学ぶ

### CPU負荷を手軽にかける
一般的に知られている「stress」といったツールを使って・・・、といった方法ではなく、Linux標準コマンドで出来る方法が良いな～


本番環境とかだと気軽ツールとかインストール出来ないので。
なるべく環境には手を加えない方法をピックアップしてみました。

###yesコマンドを使う

yesコマンドはOS標準で入っているビルトインコマンドです。
このyesコマンドを連打することによってCPU負荷をかける方法になります。

 yesコマンドで処理をかける

```
# yes > /dev/null
```
リダイレクトの向きに気を付けてください。
処理を停止させる場合は「Ctrl + C」になります。

1個だとたいした負荷はかからないので、ターミナルを複数立ち上げでyesコマンド連打もアリ。

```
# yes > /dev/null &
# yes > /dev/null &
# yes > /dev/null &
# yes > /dev/null &
# yes > /dev/null &
```
停止させる場合は「jobs」で確認し、

```

# jobs
[1]   実行中               yes > /dev/null &
[2]   実行中               yes > /dev/null &
[3]   実行中               yes > /dev/null &
[4]   実行中               yes > /dev/null &
[5]   実行中               yes > /dev/null &
[6]-  実行中               yes > /dev/null &
[7]+  実行中               yes > /dev/null &

```
以下のような感じで停止させる

```
# kill %1 %2 %3
[1] 終了しました yes > /dev/null
[2]- 終了しました yes > /dev/null
[3]+ 終了しました yes > /dev/null
```
###opensslコマンドを使う

opensslコマンドでCPUのクロック数に合わせてCPU負荷をかけます。


opensslコマンド処理実行例

```
[root@localhost ~]# openssl speed -multi `grep processor /proc/cpuinfo|wc -l`
Forked child 0
+DT:md2:3:16
+R:256480:md2:3.000000
+DT:md2:3:64
+R:133412:md2:3.000000
+DT:md2:3:256
+R:94141:md2:3.000000
+DT:md2:3:1024
+R:26955:md2:3.000000
+DT:md2:3:8192
+R:3545:md2:3.000000
+DT:md4:3:16
+R:16046421:md4:3.000000
+DT:md4:3:64
```

opensslコマンドでの処理を停止させる場合は「Ctrl + C」

##メモリ 負荷を発生させる方法

ダミーのシェルスクリプトを作成する。

```
# vi test-memory.sh
```
Enterを押下する毎に500MB分のメモリを消費する処理を以下のように記述

```bash:
#! /bin/bash
# "--bytest 5000000" is 500MB.
echo PID=$$
echo -n "[ Enter : powerup! ] , [ Ctrl+d : stop ]"
c=0
while read byte; do
   eval a$c'=$(head --bytes 5000000 /dev/zero |cat -v)'
   c=$(($c+1))
   echo -n ">"
done
echo
```
作成したスクリプトを実行します。

```
# chmod +x test-memory.sh
# ./test-memory.sh

```
Enterを押下する毎に500MB分のメモリを消費します。
停止したい時は、Ctrl + d を押してください。

上に挙げた以外にも、CPU負荷をかける方法はたくさんあると思いますが、ある程度考えてやらないと環境そのものを壊してしまう可能性も考えられるので、その点は注意しましょう！
BacklogのGitをSSHでクローンする方法


# やりたかったこと(できなかった)
自分以外の人も使う環境にGitのリポジトリをクローンして使いたい。
他の人も使うからパスワードは使わずに鍵でクローンしたい。
[GitHubでもある方法をBacklogでもやりたい。](https://qiita.com/ponsuke0531/items/0060a38b9d93b7315b65)
が、鍵は個人にしか設定できず・・・同じ鍵はほかの人で設定しようとするとエラーになって設定できなかった。
残念。
SSHの方法だけメモしておく。

# BacklogのGitをSSHでクローンする方法
- 環境
    - CentOS Linux release 7.8.2003 (Core)
    - git version 1.8.3.1

## ssh-keygenで鍵を作る

```bash
# 1. RSA鍵のペアを作成する
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ponsuke/.ssh/id_rsa): #  <<<< Enter(鍵を作成する場所)
Created directory '/home/ponsuke/.ssh'.
Enter passphrase (empty for no passphrase): # <<<< Enter(パスフレーズ)
Enter same passphrase again: # <<<< Enter(パスフレーズ)
# ...省略...

# 2. 公開鍵を表示してコピーする
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAA...
```

## Backlogに公開鍵を登録する
[SSH接続設定｜サル先生のGit入門【プロジェクト管理ツールBacklog】](https://backlog.com/ja/git-tutorial/reference/ssh/)の「BacklogにSSH鍵を設定したい」の方法に従って公開鍵を登録する

## 設定ファイルを書く
```bash
# 1. configに設定を書く
$ vi ~/.ssh/config
$ cat ~/.ssh/config 
# BacklogのGit
Host backlog
    HostName ponsuke.git.backlog.jp
    User ponsuke
    IdentityFile ~/.ssh/id_rsa

# 2. configのへのアクセス権限をつける
$ chmod 600 ~/.ssh/config

# 3. SSH接続を確認する
$ ssh -T backlog
The authenticity of host 'ponsuke.git.backlog.jp (12.134.567.89)' can't be established.
RSA key fingerprint is SHA256:vUgu+kx036pk/3Za77wrtd/+3nNsamN/C/+ncbV/20g.
RSA key fingerprint is MD5:25:c4:1e:3b:c5:5w:dw:7b:e3:3f:d5:3d:ac:84:c8:4d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ponsuke.git.backlog.jp,12.134.567.89' (RSA) to the list of known hosts.
Hi ! You've successfully authenticated, but Backlog does not provide shell access.
```

## リポジトリをクローンする

```bash
$ git clone backlog:/PROJECT/src-ponsuke.git
Cloning into 'src-ponsuke'...
remote: Enumerating objects: 158, done.
remote: Counting objects: 100% (158/158), done.
remote: Compressing objects: 100% (124/124), done.
remote: Total 158 (delta 55), reused 0 (delta 0)

Receiving objects: 100% (158/158), 2.38 MiB | 0 bytes/s, done.
Resolving deltas: 100% (55/55), done.
```
システムGitでSourceTreeのPuTTYで設定したSSHを使う

## 概要

### 環境

- Windows 10
- SourceTree 3.3.8

### やりたいこと

- SourceTreeの内臓GitではなくシステムGitを使いたい
- SourceTreeのシステムGitでSourceTreeのPuTTYで設定したSSHを使いたい
- SourceTreeのPuTTYとは別でSSHの設定をしたくない

## 設定方法

### 前提条件

- SourceTreeの内臓Git（Embedded Git）とは別で、Gitをインストールしている（System Git）
- SourceTree上でSSHの設定を済ませている（GUI上でSSHが利用できている）

### SourceTree内のplink.exeのパスを控える

SourceTreeで動作しているPuTTYの`plink.exe`を探す。
SourceTreeで使われているPuTTYは`tools\putty`にある。
SourceTreeはバージョンによってインストール先が異なる。
自分の環境では`C:\Users\{名前}\AppData\Local\SourceTree\app-{バージョン}\tools\putty\plink.exe`だった。

### 環境変数`GIT_SSH`の設定

環境変数に新しく`GIT_SSH`を作成し、控えたplink.exeのパスを設定する。  

## 参考文献

- [PuTTY pageantを使っでgit for Windowsに公開鍵認証を設定 - Qiita](https://qiita.com/EvilSpirit39/items/d383c5dc1e0be0c6bbde)
- [(PuTTYの入った) windows 環境で GitHub を ssh で使用する場合の注意 - Qiita](https://qiita.com/te2ji/items/7add46a485e33b2c95d8)
- [Git for Windowsでplink(putty)を使う - hogelogの日記](https://hogelog.hatenablog.com/entry/20120627/p1)
Python超初心者の超初心者のためのPython #型（type）を変換する方法：str編

環境
windows7　（Mac Book Pro 16inch欲しい）
Visual Studio Code
chrome
python ver3.8.3

この記事はプログラミング初心者かつPython初心者に向けて記述します。

#1.Pythonの型（type）を変換する方法
##str
integerは数（整数）、stringは文字（文字列）でした。
数（整数）をそのまま文字（文字列）と連結させて出力しようとすると下記のようになります。

```style.py
calc = 100 * 3.14
answer = "円周率に100倍は" + calc + "です"
print(answer)

#answer = "円周率に100倍は" + calc + "です"
#TypeError: can only concatenate str (not "float") to str

```

エラーが出ました。
`TypeError:can only concatenate str (not "float") to str`
このエラーは、「型（type)が違うから連結できませんよー」というエラーです。
"円周率に１００倍は"の文と"です"の文は文字（文字列）で、変数calcは数（と言っても浮動小数点数）なので、Pythonは
「文字（文字列）と数（整数や浮動小数点数）は整えてから連結しようね」
という約束事です。

そのようなときは文字（文字列）はそのまま　"   "で囲い、数（整数、浮動小数点数）を文字（文字列）に変換してあげます。
では、`Calc`に　"    "で囲ってあげれば良いのでしょうか。

```python:type.py
calc = 100 * 3.14
answer = "円周率に100倍は" + "calc" + "です"
print(answer)

#円周率に100倍はcalcです
```

`calc`をそのまま文字（文字列）として認識してしまいました。
それでは下記のように変えてみましょう。
今回のテーマの`str`の出番です。

```python:style.py
calc = 100 * 3.14
answer = "円周率に100倍は" + str(calc) + "です"
print(answer)
#円周率に100倍は314.0です
```

はい、無事に出力されました。
上の2点のコードの何が違うのかというと、
answer = "円周率に100倍は" +` calc` + "です"
answer = "円周率に100倍は" + `str(calc)` + "です"
とcalcにstr()を追加しただけです。

数（整数、浮動小数点数）を文字（文字列）に整える（変換する）のは、`str()`を使います。
上記の例は変数を使った例ですが、もっと単純にわかりやすいのは

```python:type.py
print(type(123))
#<class 'int'>

print(type(str(123)))
#<class 'str'>
```

上記の例の上段は
123
は数（整数）ですよー
と言ってます。
下段は
str(123)
は文字（文字列）ですよー
と言ってます。

以上、型（type）を変換する方法：`str`編でした。
CentOS７: IPアドレスの固定とIT IS POSSIBLE ~

###IPアドレスを固定

```console:/etc/sysconfig/network-scripts/ifcfg-ens{xxx}
$ sudo vi /etc/sysconfig/network-scripts/ifcfg-ens{xxx}
# #編集
ONBOOT=yes <- 起動時にネットワークを有効化
BOOTPROTO=static
BROADCAST=192.168.0.255
IPADDR=192.168.0.{xxx} <- 固定したいIPアドレス
PREFIX=24
GATEWAY=192.168.0.{xx} <- ルーターアドレス
DNS1=192.168.0.{xx} <- ルーターアドレス
DNS2=8.8.8.8
```

***BROADCAST***はIPアドレスの全ホストにパケット送信できるアドレス（アドレスの末尾）。192.168.0.[255]
***PREFIX***はIPアドレスのどの部分がネットワーク部分であるか？というサブネットマスクの省略形のようなもの。[192.168.0]の部分。

###IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
何度もIPアドレスの変更をしてて上のエラーがでたら、操作しているクライアントPCに保存されているホスト鍵に問題があります。

***$HOME/.ssh/known_hosts***

クライアントPCに保存されている上記のファイルの該当するIPアドレスを削除してあげるとエラーもでなくなります！
###ついでにHostnameも変更しとく？

```console
$ sudo hostnamectl set-hostname {新ホスト名}
```
GitHubコマンドメモ

## はじめに
[【GitHub超初心者入門】この前初めてGitHubを使い始めたエンジニア見習いが書くGitHubの使い方と実践～とりあえず一緒に動かしてみようぜ！～](https://qiita.com/nnahito/items/565f8755e70c51532459)

上記の記事を読み終わって「さあやるぞ！」となっても，次の日には忘れると思うのでメモ
自分の言葉で説明するから覚えると思う
> 読み返せってコメントはなしで

## 初回のみ

### 新規作成(コミット)
1. [ここから](https://github.com/)リポジトリ作成
2. ローカルディレクトリ作成
3. ローカルディレクトリ上で `git init`
4. ファイル作成(test.cなど)
5. ファイルをローカルディレクトリに登録（コミット）するために `git add test.c`
6. そしてコミット `git commit -m "コメント"`
7. ローカルディレクトリに登録された

>`git add test.c` と `gitcommit -m "コメント"` はセット？

### 新規作成(プッシュ)
1. 最初の儀式 `git remote add origin https://github.com/あなたのUSER_ID/リポジトリ名.git` 
> `original`がブランチのデフォルト名になる（変更可能）
2. GitHub上に載せる(プッシュ) `git push origin master`

## 実用

### ファイルを更新したら

#### 少しの編集(ローカル上に)
- コミット
1. `git add test.c` 
2. `git commit -m "変更してみたよ"`

#### 大きな変更があった場合(GitHub上に)
- プッシュ
1. `git push origin master`

#### テストする場合(元のファイルと枝分かれ)
- ブランチ
1. 枝を作成 `git branch testbranch`
2. プランチ確認 `git branch` 
3. ブランチ移動 `git checkout testbranch`
4. ブランチ確認 `git branch`
5分でSpring bootとThymleafでHello World

STSを使用しています。

#　手順

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/a0c9e4f2-b0a1-1749-b3e1-9b2ddd9e43e5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/ef469c6d-df4f-2dba-20d7-ce8c5ca9433b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/909513b9-8a9e-46a4-eff5-2467e4bd4371.png)


```DemoController.java
package com.example.HelloThymleaf;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class DemoController {

	@RequestMapping("/")
	public String index(Model model) {
		model.addAttribute("msg", "Hello! Thymleaf!!");//Hello! Thymleaf!!はmsgへ格納し、index.htmlへ返します。
		return "index";
	}
	
}
```

```html:index.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8" />
    <title>demo</title>
</head>
<body>
<p th:text="${msg}">ここの文字列は、実行時に ${msg} で置換されます。</p>
</body>
</html>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/2be98d88-a3a3-9924-bc75-25cde01ef604.png)

#　参照リンク
https://www.shookuro.com/entry/2017/11/18/142212
【Unity/C#】コルーチンについて

#本記事の概要
本記事は自分がコルーチンについてでの程度理解しているかの確認もかねて書いておりますので間違っていることがあります、もし間違いを見つけた場合コメントなどをください、修正します。

#目次
* [コルーチンとは？](https://qiita.com/tilyakuda/items/353cc268bbd43c6e8898#%E3%82%B3%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3coroutine%E3%81%A8%E3%81%AF)
* [どうやって使うの？](https://qiita.com/tilyakuda/items/353cc268bbd43c6e8898#%E3%81%A9%E3%81%86%E3%82%84%E3%81%A3%E3%81%A6%E4%BD%BF%E3%81%86%E3%81%AE)
  * [サンプルコード](https://qiita.com/tilyakuda/items/353cc268bbd43c6e8898#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89)
* [どうやって呼び出すの？](https://qiita.com/tilyakuda/items/353cc268bbd43c6e8898#%E3%81%A9%E3%81%86%E3%82%84%E3%81%A3%E3%81%A6%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E3%81%AE)
* [yieldって？](https://qiita.com/tilyakuda/items/353cc268bbd43c6e8898#yield%E3%81%A3%E3%81%A6)
  * [yield一覧](https://qiita.com/tilyakuda/items/353cc268bbd43c6e8898#yield%E4%B8%80%E8%A6%A7)

#コルーチン(Coroutine)とは？
コルーチンとは処理を中断したり、何秒後に処理を再開したり、中断したところから再開したりすることができ、非同期のような処理ができる関数っぽいものです。
(コルーチンはマルチスレッド見たいに感じますがシングルスレッドで動いていますしメインスレッドでの処理となります。)
[Unityマニュアル](https://docs.unity3d.com/ja/2018.4/Manual/BestPracticeUnderstandingPerformanceInUnity3.html)
詳しく知りたい方はこちらの公式マニュアルをお読みください。

#どうやって使うの？
まず必須なのが**using System.Collections**の宣言です。
**using System.Collections**を追加することによって**IEnumerator型**を宣言できるようになっています。
この**IEnumerator型**を戻り値にして関数のように書けばコルーチンとして認識されます。

##サンプルコード
```C#
IEnumerator Test()
{
  yield break;
}
```
コルーチンはこのように記述します。
yield breakについてはあとでどのような処理なのか説明します。

#どうやって呼び出すの？
この二つの方法で呼び出すことができます。

```C#
//文字列でコルーチンの名前を書く
StartCoroutine("Test");
//コルーチンを関数呼び出しのように書く
StartCoroutine(Test());
```
このように呼び出す方法は２種類あります、引数を持たせて呼び出したい場合は

```C#
IEnumerator Test(int num,string name)
{
  yield break;
}
//コルーチンを関数呼び出しのように書く
StartCoroutine(Test(10,"名前"));
```
このように呼び出すことによって引数を渡すことができます。

# yieldって？
メソッドの処理を一時的に中断し、処理を呼び出し元に返すことができるようにするためのものです。

## yield一覧

```C#
//処理を止めて次のフレームに処理を開始する場所
yield return null;
//処理を止めて次のフレームに処理を開始する場所
yield return 0;
//ここで処理を強制的に止めます
yield break;
//処理をここで止めて引数で渡した数値秒経ったら処理をここから再開
yield return new WaitForSeconds(1f);
```
Laravelでcomposer updateするとPackage jakub-onderka/php-console-color is abandoned, you should avoid using it. Use php-parallel-lint/php-console-color instead.


（今更記事にするほどでもないのですが、少しでも同じことを調べる人の時間短縮になれば幸いです）

- Laravel 6.2

## composer update(install)するとこのようなエラーが出る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179992/0779fb4e-31db-d95d-5028-71acf9b94996.png)

単純に日本語訳するとこんな感じ。
```パッケージjakub-onderka / php-console-colorは廃止されました。使用しないでください。 代わりにphp-parallel-lint / php-console-colorを使用してください。
```

「こんなpackage入れてないけどな？」と調べると、Laravastsにドンピシャの投稿あり
https://laracasts.com/discuss/channels/laravel/jakub-onderka-package-abandoned-warnings

どうやら`nunomaduro/collision`を始めとするpackageにて使われているpackageのようで、
記事の中のtwitterLinkにもあるとおり、警告解消に向けて対応は進んでいるようです。

https://twitter.com/enunomaduro/status/1246531267023290370

https://github.com/nunomaduro/collision/commit/9b430e44467e7186f5a7e48c8cdeac0571817286

## 2020/06/09現在のうちは、様子見で放置でよさそうです。