OmniAICreator/Qiita-1.07M huggingface dataset:
個人的なLinuxプロセス間通信の比較

[プロセスとスレッドの比較](https://qiita.com/pff01632/items/a13c7e8979857a3b5fb2)からの続き。
Linuxにはプロセス間通信の手段がいくつかある。
それぞれに特徴があり、それによって用途もある程度決まってくる。
そういうプロセス間の通信について個人的なまとめ。
ちなみにIPCの手段によってパフォーマンスや特性が異なる。
参考：[プロセス間通信の比較 - ka2yanの日記](https://ka2yan.hatenadiary.org/entry/20090327/1238171280)
#ファイル
えっ！？
はいファイルです。
ファイル、それはグローバルなリソース。
２つのプロセスがO_RDWRでファイルを奪いあえば排他制御もできる。
ファイルを２つ用意すれば双方向通信もできる。
フォーマットも自由に決められる。ストリームもパケットもOK。
欠点はストレージ経由のため遅く、IPCの取り決めが面倒なこと。
だが簡易的なIPCで良ければ十分実用になる。
#パイプ
親子関係のプロセス間限定でメッセージを交換する手段。
ファイルディスクリプタ(fd)にバッファを関連付けて通信を行う。
通信はストリームデータでありデータ区切りはない。
単方向通信である。
#名前つきパイプ
依存関係のない同一ホスト内のプロセス間で通信する手段。
パイプの場合はバッファをfdに結び付けて通信を行うが、
名前つきパイプはopen()したfdの先にバッファが作られる。
バッファはカーネルが用意する。単方向通信である。

fdは権限のあるディレクトリなら作成できるが、ホスト内限定。
通信はストリームデータでありデータ区切りはない。
性能は多分パイプと同じはずである（同じ仕組みのため）。
readerプロセスはCPUの浪費防止でブロッキングwaitしたいが
若干問題がある。
###open()でブロッキングする場合
open()/close()のコンテキストスイッチングが遅い。
通信頻度が少なくオーバーヘッドが無視できるなら問題はない。
###read()でブロッキングする場合
使ったことはないが、open()ブロッキングより高速なはずである。
ただしO_RDWRでopen()する必要があり、その場合の動作は未定義。
参考：[FIFOについてもう少し](https://qiita.com/pff01632/items/c6a35794efd5d47f9933)
#ネットワークソケット
TCP/UDPのソケットをopen()してネットワーク通信を行う。
ネットワーク越しになるためパフォーマンスはよくない。
その代わり同一ホストに限定されないプロセス間通信が可能。
ローカルネットワークでもインターネット越しでも使える。
双方向通信である。
#Unixドメインソケット
依存関係のない同一ホスト内のプロセス間で通信する手段。
ネットワークソケットのIPアドレスをfdに置き換えたイメージ。
名前付きパイプより若干低速らしい。双方向通信である。
#メッセージキュー(MQ)
Linux限定で説明するが、SystemVとPOSIXがある。
しかしPOSIX MQ推奨のため、SystemVは無視していいだろう。
メッセージは区切りがあり、固定サイズのデータ配列になる。
read()でブロッキングでき、パイプより高速である。
mq_timedreceive()を使えばタイムアウト監視も可能。
**欠点はキューのパラメータがシステムファイルであること。**
管理者権限で編集しないと要素数と要素サイズは変更不可。
ただしキューのブロッキング属性だけは動的に変更できる。
単方向通信である。
#共有メモリ
プロセス間でページ単位のメモリを共有する。
仮想アドレスはプロセス別だが物理アドレスは同一である。
ただのメモリなので単方向でも双方向でも思うがままだ。
メモリのread/writeと同じなので高速でもある。
ただし本気で実装すると排他制御が結構面倒である。
#セマフォ
プロセス間で整数値を共有し、排他するための機構。
情報交換するIPCとしての機構には向かない。
#シグナル
ソフトウェア割り込み、という理解でいいと思う。
寝ているプロセスをシグナルで起こせるかは調べていない。
ソフトウェア割り込みなので通知そのものは高速である。
シグナルハンドラを実装しないとデフォルトハンドラが呼ばれる。
シグナルハンドラは[非同期シグナル安全](https://www.google.com/search?q=%E9%9D%9E%E5%90%8C%E6%9C%9F%E3%82%B7%E3%82%B0%E3%83%8A%E3%83%AB%E5%AE%89%E5%85%A8&oq=%E9%9D%9E%E5%90%8C%E6%9C%9F%E3%82%B7%E3%82%B0%E3%83%8A%E3%83%AB%E5%AE%89%E5%85%A8&aqs=chrome..69i57j0i30.4032j0j7&sourceid=chrome&ie=UTF-8)なAPIしか使えない。
シグナルを受信したら通知のみ行い、メイン側で対応すべきだ。
共有メモリと組み合わせたIPCが実現できそうである。
FirebaseError: Port 5000 is not open on localhost, could not start functions emulator.の対処方法

#概要

Firebaseを利用してlocalhostでサーバーを立ち上げようとした際に
Error: Port 5000 is not open on localhost, could not start functions emulator.
が発生した場合の対処方法

#結論

firebase serve -p {任意のポート番号}

#詳細

ポートが重複しているエラー。
重複しているポートがkillできない場合、起動コマンドでポートを指定できる。

1.下記コマンドでヘルプを確認
`firebase [command] --help`

```terminal
> firebase serve --help
Usage: firebase serve [options]

start a local server for your static assets

Options:
  -p, --port <port>   the port on which to listen (default: 5000) (default: 5000)
  -o, --host <host>   the host on which to listen (default: localhost) (default: "localhost")
  --only <targets>    only serve specified targets (valid targets are: hosting, functions)
  --except <targets>  serve all except specified targets (valid targets are: hosting, functions)
  -h, --help          output usage information

```
2.-p {任意のポート番号} でポートを指定して立ち上げる。

```terminal
> firebase serve -p 5001
```
作ったOpenAPIのyamlからReDocを使ってドキュメント生成する方法

# はじめに
APIのドキュメントをプロジェクトで作成していく上でOpenApi 3を選択しました。
ローカルで見れるカタチに整形する方法としてReDocを使って見ようと思います。
※Open APIの作り方はこの記事では省略しています。


# 最終形のカタチ

~~~ bash:bash
$ tree
.
├── app.html
└── openapi.yaml
~~~

# サンプル Open API の準備
~~~ yaml:openapi.yaml
openapi: 3.0.0
info:
  version: 1.0.0
  title: Swagger sample
paths:
  /users:
    get:
      summary: Usersを取得するAPIです。
      responses:
        '200':
          description: HTTPステータスコード200と以下の情報を含むJSONオブジェクトを返します。
          content:
            application/json:
              schema:
                type: object
                properties:
                  user_id:
                    type: string
                    example: 1234567
~~~

# ReDoc

- インストール

~~~ bash:bash
$ npm install -g redoc-cli
~~~

- バンドル

~~~ bash:bash
$ redoc-cli bundle openapi.yaml --output app.html
~~~

- 作成ファイルを`app.html`開く


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/adca51d2-18aa-5de8-6bc2-c4aa5e10d490.png)

# 最後に
すごく簡単に見れる状態にできました。
次はHTMLファイルをホストする環境を作りたいと思っています。

Dockerfile で環境もつくれるので記載しておきます。

~~~ Dockerfile:Dockerfile
FROM node

RUN apt-get -y update

RUN npm i -g npm
RUN npm i -g redoc-cli

~~~
サンプル: C# でタスクトレイに常駐

* VS 2017 Express
* Form で作成、.Net Framework 4.6を指定した。
* app.ico が別途必要。https://icon-icons.com/ja/ などからアイコンを準備 

![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/87f81aaf-f4bd-572c-dfff-2274a087ab0b.png)

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/9489588e-e35c-3d21-91e2-ce7b86b705f0.png)


```cs:Program.cs
using System;
using System.Diagnostics; // ProcessStartInfoで必要
using System.Drawing;
using System.Windows.Forms;

class MainWindow
{
	static void Main()
	{
		Launcher launcher = new Launcher();
		Application.Run();
	}
}

class Launcher : Form
{
	public Launcher()
	{
		this.ShowInTaskbar = false;
		this.setComponents();
	}

	private void cmdHello()
	{
		MessageBox.Show("こんにちは。");
	}

	private void cmdIe()
	{
		ProcessStartInfo processStartInfo = new ProcessStartInfo("C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe", "http://yahoo.co.jp");
		Process process = Process.Start(processStartInfo);
	}

	private void Close_Click()
	{
		Application.Exit();
	}

	private void setComponents()
	{
		NotifyIcon icon = new NotifyIcon();
		icon.Icon = new Icon("app.ico");
		icon.Visible = true;
		icon.Text = "常駐アプリテスト";
		ContextMenuStrip menu = new ContextMenuStrip();
		ToolStripMenuItem menuItem = new ToolStripMenuItem();

		menu.Items.AddRange(new ToolStripMenuItem[]{
			new ToolStripMenuItem("命令cmdHello", null, (s,e)=>{cmdHello();}),
			new ToolStripMenuItem("命令cmdIe", null, (s,e)=>{cmdIe();}),
			new ToolStripMenuItem("終了", null, (s,e)=>{Close_Click();})
		});

		icon.ContextMenuStrip = menu;
	}
}
```

いろんなページを参考にしました。
dependent: :destroyオプション

※プログラミング学習中の私がアップロードしてます。理解が浅いです。
この記事は厳密な仕様に関するものではなく、考え方理解のまとめとして受け取ってください。

>railsガイド
>https://railsguides.jp/association_basics.html

Active Recordの関連付け機能を使うと、2つのモデルの間につながりがあることを明示的にRailsに対して宣言でき、それによってモデルの操作を一貫させることができます。著者と書籍の設定するコードを次のように書き直せます。

```rb
class Author < ApplicationRecord
  has_many :books, dependent: :destroy
end

class Book < ApplicationRecord
  belongs_to :author
end
```

(例)自分のコード 

```rb:（変更前）post.rb
class Post < ApplicationRecord
  belongs_to :user
```

```rb:（変更前）user.rb
class User < ApplicationRecord
  has_one :card
```

```（変更後）user.rb
class User < ApplicationRecord
  has_one :card, dependent: :destroy
```

＊親に設定
Herokuデプロイ手順

##開発環境
Ruby 2.6.5 
Ruby on Rails 6.0
My SQL
Heroku CLIをインストール済み

##１. Heroku上にアプリケーションを作成
```
% heroku create <<アプリケーション名>>
```
##2. ClearDBアドオンを追加
```
% heroku addons:add cleardb
```
##3. 設定を変更(Ruby on railsを使う場合）
```
% heroku_cleardb=`heroku config:get CLEARDB_DATABASE_URL`
% heroku config:set DATABASE_URL=mysql2${heroku_cleardb:5}
```
##4. Heroku上で環境変数を設定
```
% heroku config:set RAILS_MASTER_KEY=`cat config/master.key`
```
##5. Herokuで利用するStackを指定(Ruby2.6.5が動作する場合)
```
% heroku stack:set heroku-18 -a <<アプリケーション名>>
```
##6. Herokuへアプリケーションを追加
```
% git push heroku master
```
##7. Heroku上でマイグレーションを実行
```
% heroku run rails db:migrate
```

##8. 公開を確認
```
% heroku apps:info
% heroku open
```
##9. デバッグ
```
% heroku logs --tail --app <<アプリケーション名>>
```
wemosでsha256

#概要

wemosでsha256やってみた。

#使用したライブラリー



https://github.com/CSSHL/ESP8266-Arduino-cryptolibs

#サンプルコード

```
#include "sha256.h"

void setup() {
	uint8_t key1[] = {0x61, 0x62, 0x63};
	uint8_t key2[] = {0xd3};
	uint8_t key3[] = {0x11, 0xaf};
	BYTE hash[SHA256_BLOCK_SIZE];
	char texthash[2 * SHA256_BLOCK_SIZE + 1];
	Serial.begin(115200);
	Serial.println("");
	Sha256 * sha256Instance0 = new Sha256();
	BYTE text[] = "abc";
	//sha256Instance->update(text, strlen((const char *) text));
	sha256Instance0->update(key1, 3);
	Serial.println("in: abc");
	sha256Instance0->final(hash);
	for (int i = 0; i < SHA256_BLOCK_SIZE; i++)
		sprintf(texthash + 2 * i, "%02X", hash[i]);
	Serial.println(texthash);
	delete sha256Instance0;

	Sha256 * sha256Instance1 = new Sha256();
	sha256Instance1->update(key1, 0);
	Serial.println("in: ");
	sha256Instance1->final(hash);
	for (int i = 0; i < SHA256_BLOCK_SIZE; i++)
		sprintf(texthash + 2 * i, "%02X", hash[i]);
	Serial.println(texthash);
	delete sha256Instance1;

	Sha256 * sha256Instance2 = new Sha256();
	sha256Instance2->update(key2, 1);
	Serial.println("in: d3");
	sha256Instance2->final(hash);
	for (int i = 0; i < SHA256_BLOCK_SIZE; i++)
		sprintf(texthash + 2 * i, "%02X", hash[i]);
	Serial.println(texthash);
	delete sha256Instance2;

	Sha256 * sha256Instance3 = new Sha256();
	sha256Instance3->update(key3, 2);
	Serial.println("in: 11af");
	sha256Instance3->final(hash);
	for (int i = 0; i < SHA256_BLOCK_SIZE; i++)
		sprintf(texthash + 2 * i, "%02X", hash[i]);
	Serial.println(texthash);
	delete sha256Instance3;
}

void loop() {
	delay(10);
}





```

#結果

```

in: abc
BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD
in:
E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
in: d3
28969CDFA74A12C82F3BAD960B0B000ACA2AC329DEEA5C2328EBC6F2BA9802C1
in: 11af
5CA7133FA735326081558AC312C620EECA9970D1E70A4B95533D956F072D1F98


```

以上。
Java Gold SE11 合格体験記

## はじめに

入社時の新人研修の一環で、Java Gold SE11をなんと~~**3週間で**~~取得できました。

・・・嘘ではないですけど、ちょっと盛りました。実際のところ**Silverに2週間・Goldに3週間の1ヶ月強**です。Silverから続けて受験したから合格できたところがあるので。

Silverの体験記はインターネットの海にたくさんありますが、**Goldの合格体験記は少なかった**ので記事を書くことにした次第です。参考になれば幸いです。

## 勉強開始時のスペック・受験理由

入社前は大学の研究でpythonを3年、アルバイトでPHP（WordPress）を3年、Swiftを半年使っていました。基本独学です。

Javaに関しては完全に未経験ですが、オブジェクト指向についてはおおむね理解していたところです。ラムダ式やStream APIも（他言語と細かい仕様は違うと思いますが）読めばわかるくらいの知識がありました。

受験理由についてです。

研修の間にSilverの取得が必須だったのですが、せっかちなのでさっさと受験して合格しました。その結果、**配属前の余った期間で取りなよって言われてしまった**のが理由です。~~未経験にさせることじゃないと思いました。~~

再受験無料キャンペーンの存在も大きかったです。

## 勉強方法

SE11の黒本がないので、**SE8の黒本を2周とSE11の紫本を1周**し、よくわからないところは**コードを書いてデバッグ(?)**してました。あとは合格体験記を書いていたブログや掲示板などを見て参考にしました。

勉強期間についてですが、これは参考にならないと思います。なぜかと言うと、**就業時間中ずっと自習**でした。週5*8時間を自由に使える環境というのは後にも先にもないと思います（学生時代はあったか）。

ただ一方で、あくまで目標とはいえ**配属前の2週間での合格を目指す必要がありました**。~~でもお昼ごはんのあとは睡魔に負けてました。~~そのため、実際の傾向と異なる点が目立つとよく言われてる**紫本の問題はあまりやりませんでした**。

二週目の黒本模擬が8割ほど取れた段階で受験しました。それとは別でSE11からの範囲は紫本をざっと読んで理解した（つもり）にはなってました。

## 結果

**66%で合格しました**（合格ライン63%）。運ゲー決めたなと思います。

実際の問題では**見たことがない問題が多く**流石に焦りました。Silverは出題傾向を把握すれば合格するのは簡単でしたが、やはりGoldは違いました。

根本的な理解に自信がある方は大丈夫だと思いますが、**そうでない方は黒本が出るのを待った方が良いのではないか**と思います。

## 終わりに

総括すると、**SE8の黒本がメインでも合格は不可能ではないがオススメはしない**ってところでしょうか。

やはりもうちょっと勉強して挑むべきではあったと思います。~~あとGWも勉強するべきだった。~~

たくさんの時間を与えてくれた会社と上長に感謝しています。

・・・そして**Java中上級者（未経験）が爆誕**してしまいました。合格したとは言えどギリギリなので、復習して実務を通してがんばるぞい！

<br><br><br>

・・・って思っていたら、**配属先がPHP使ってました**。たくさんべんきょうできるね（白目）
STM32L010のPWMを使う


目的
stm32l010f4p6で遊ぶ
使ってみたかった
LED等を繋げる
sg90でためしていないけど


参考
https://os.mbed.com/users/okini3939/notebook/PwmOut_jp/
http://carefreework.blog.fc2.com/blog-entry-14.html

忙しい人よう
https://os.mbed.com/users/caa45040/code/pwm_test_010/


-gs90-

![o_con60.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/23a5a4aa-bb95-98e9-3b71-ae134856e281.jpeg)

-gs90 pwm-

![o_con61.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/83880acd-41bd-8e73-9057-59574d62148f.jpeg)


![o_con62.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4b0a5507-1f14-3255-afb6-6636fc5f28df.jpeg)



```c++

#include "mbed.h"

//Serial pc(USBTX, USBRX); // tx, rx
//Serial pc(SERIAL_TX, SERIAL_RX); //767
//Serial pc(PA_2, PA_3); //010
//Serial pc(PA_9, PA_10); //010

//data SG90
// 2400us 2.4ms
#define s_max  2400
// 500us 0.5ms
#define s_min  500 
#define s_r    (2400-500)
#define s_c    ((2400-500)/256)
#define SN(n6) (500+(((2400-500)/256)*n6))


//PWMのピンの設定
//PwmOut servo(A0); //       //767
PwmOut servo(A4); //PA_5   //010
 
int main() {

    //周期の設定    
    //servo.period(0.020);          // servo requires a 20ms period
    servo.period_ms (20);

    //無限ループ
    while (1) {
        
        //0から256までループ
        //for(float offset=0.0; offset<0.001; offset+=0.0001) {
        for(int offset=0; offset<256; offset++) {

            //pc.printf(" -S=%d\t%d\r\n", offset , SN(offset) ); //767
    
            //オン時間の設定
            //servo.pulsewidth(0.001 + offset); // servo position determined by a pulsewidth between 1-2ms  　　　
            servo.pulsewidth_us( SN(offset) );
        
            //250ミリ秒まつ
            //wait_ms(250);
            wait_ms(4);
        }//for
    }//while
}//main

//容量削減
void error(const char* format, ...){}



```
自己注意Self-Attention の解説でわかりやすいと思った記事N選　(N＝14）の活用履歴

# 概要

[自己注意Self-Attention の解説でわかりやすいと思った記事N選　(N＝14）](https://qiita.com/enoughspacefor/items/c9810d1065741a7f461c)

の活用履歴を記す。

# 活用履歴
## Word Enbeddingの具体的な様子を確認する[2021/05/15]
## 利用記事：（その６）の（YDC Labコラム）分かった気になる自然言語AIの仕組み
https://www.ydc.co.jp/column/0002/20191118.html
## 内容
Word Enbedding　で、特に、興味があったのが、「the」とか、「（関係代名詞の）which」とか、、、普通の単語でないものの値がどうなっているのか？
そもそもの疑問は、これらの値を掛け算して関連度を出してどうなるのか？という疑問ですが。
実際に利用したのは、この記事で引用されている、
GoogleのEmbedding Projectorという多次元データ視覚化ツール(2016年12月公開)
です。

↓　普通の単語の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/c9b3217d-8d88-45e9-d2bf-6ff9ac1a6252.png)

↓　the の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/81d66fbd-4bd7-cbcc-34b5-28a015b2e137.png)


## 文章のattentionのレイヤによる変化の様子を確認する[2021/05/15]
## 利用記事：（その１２）のThe Illustrated Transformer
http://jalammar.github.io/illustrated-transformer/
## 内容
レイヤを重ねてattentionの様子が高度化する仕組みが理解できないので、そのattentionの様子を確認した。
記事内からリンクされているnotebookで、動的に確認できる。

↓　the が　animal にがちっとあたっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/8d06d0f5-aa03-bd98-7098-0ea22e6f27bd.png)

↓　レイヤ１では、後ろのit は、それほど、しっかり、animalに届いていない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/a31f21e7-2bd3-9902-1bcf-da4d8df99e96.png)



# まとめ
特にありません。
【Javascript】Markdown形式のウェブページのリンクを、ブックマークレットで取得する

## はじめに

記事を書く際、参考 URL をいちいちコピー・整形するのが面倒だったので、ブックマークレットで対応した。

ブックマークレットをクリックするだけで、ウェブページのリンクが Clipboard に書き込まれる。

## 結論

ブックマークレットに以下の URL を登録するだけ。

```js
javascript: navigator.clipboard.writeText(
  `[${document.title}](${location.href})`
);
```

例えば Qiita 上で上記のブックマークレットをクリックすると、`[eyuta - Qiita](https://qiita.com/eyuta)`のような文字列が Clipboard に書き込まれる。

後はこれを任意の場所に貼り付けるだけで良い。楽！

## 詳細

クリップボードへの格納には、[Clipboard.writeText() - Web APIs | MDN](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard/writeText) を使用している。

注意点としては、Web ページの`Document`にフォーカスが当たっていないと、以下のエラーが出力される点。
(アドレスバーやデベロッパーツールにフォーカスしている状態でこの処理を実行するとこのエラーが出力されるので、`Document`にフォーカスした状態で実行するようにする)

- `Uncaught (in promise) DOMException: Document is not focused.`

また、当該メソッドは非同期メソッドなので、後続処理を書く場合は`then`で繋ぐ必要がある。

> ```js
> navigator.clipboard.writeText("<empty clipboard>").then(function() {
>   /* clipboard successfully set */
> }, function() {
>   /* clipboard write failed */
> });
> ```

参考:
 
- [Clipboard.writeText() - Web APIs | MDN](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard/writeText#example)
- [javascript - DOMException on calling navigator.clipboard.readText() - Stack Overflow](https://stackoverflow.com/questions/56306153/domexception-on-calling-navigator-clipboard-readtext)

(上のブックマークレットでリンクを取得した)
Golangに入門して詰まったこと【備忘録】　〜これからやりたいことを添えて〜

##自己紹介
SEです。

趣味の範囲でGolangに入門したので環境構築から詰まった所を備忘録として忘れないようにしておくために投稿しました。
Qiita初投稿なので生暖かい目で見てください。
アウトプットとしてこれからどんどん投稿していきたいと思っています。

##環境
Mac OS BigSur 11.3
go 1.16
VScode
M1 Macbook Air

##早速、環境構築
公式サイトからダウンロード！！！

https://golang.org/dl/

https://code.visualstudio.com/download

公式のやり方ページを参考にインストール

https://golang.org/doc/install

ついでに、vscodeも「vscode インストール」 と検索して流れでGoの拡張機能もインストール!!!

Golangのインストールを確認する。

~~~
$go version
go version go1.16rc1 darwin/arm64
$
~~~

とプロンプトが帰って来ればOK!!!

まぁ、ここまで来ればインストールは完了だけど、一応GOROOT と GOPATHを
確認する。

GOROOT

~~~
$ls -l /usr/local/
total 0
drwxr-xr-x  19 root  wheel  608  5  9 11:45 bin
drwxr-xr-x  20 root  wheel  640  1 28 07:22 go ←goのディレクトリが存在する
drwxr-xr-x   3 root  wheel   96  5  9 11:45 lib
$
~~~

GOPATH

~~~
$ls -l /Users/xxxxx/
total 441632
drwx------@  3 xxxxx  staff         96  1 31 18:08 Applications
drwx------+ 18 xxxxx  staff        576  5  5 16:53 Desktop
drwx------+  3 xxxxx  staff         96  3 13 22:57 Documents
drwx------+ 28 xxxxx  staff        896  5  9 18:22 Downloads
drwx------@ 78 xxxxx  staff       2496  5  9 14:53 Library
drwx------   5 xxxxx  staff        160  2 12 16:48 Movies
drwx------+  5 xxxxx  staff        160  1 31 17:59 Music
drwxr-xr-x@ 13 xxxxx  staff        416  3  6 22:38 OneDrive
drwx------+  4 xxxxx  staff        128  1 31 17:13 Pictures
drwxr-xr-x+  4 xxxxx  staff        128  1 31 17:12 Public
drwxr-xr-x   4 xxxxx  staff        128  1 31 22:26 development
-rw-r--r--@  1 xxxxx  staff  138412110  1 31 20:59 flutter_macos_1.22.6-stable.zip
drwxr-xr-x   5 xxxxx  staff        160  3 14 19:12 go　　　　←goのディレクトリが存在する
drwxr-xr-x  21 xxxxx  staff        672  4 12 20:49 google-cloud-sdk
-rw-r--r--@  1 xxxxx  staff   87698261  2  8 22:32 google-cloud-sdk-324.0.0-darwin-x86_64.tar.gz
$
~~~

最後に、環境変数を確認する。

~~~
$env
GOROOT=/usr/local/go
GOPATH=/Users/xxxxx/go/
(他は省略)
$
~~~

###<font color="Red">⭐️個人的に最大のハマりポイント🌟</font>

GOPATH(/Users/xxxxx/go)以外に作業ディレクトリを作成してGolangを書きたい場合、以下を設定すること。

~~~
$go env GO111MODULE="on"
$go env
GO111MODULE="on"　←ここを"on"にすること！！！
(他は省略)
~~~

【理由】

上記がonになっていない場合及び作業ディレクトリがGOPATH以外である場合

パッケージをインポートした際にGOPATH配下もしくはGOROOT配下を探しに行くため作業ディレクトリがGOPATH配下以外だとパッケージが見つからなくてエラーになるため。

***!!!環境構築完了!!!***

##GoでHelloWorld!!!

!!!作業ディレクトリの構成は以下!!!

~~~
$tree /Users/xxxxx/Desktop/golang_20210207
|--go.mod
|--go.sum
|--main            
|--main.go
$
~~~

【手順】

1. 任意の場所にディレクトリを作成する。
2. 以下のコマンドにて、モジュールを作成

~~~
$go mod init
~~~

3.(任意)デフォルトにないパッケージを使う場合は、以下のコマンドを実行する(今回は省略)

~~~
$go get "[パッケージのURL]"
~~~

4.ソースコードを編集する

~~~go:hello.go
package main

import (
    "fmt"
)

func main() {
    fmt.Println("HelloWorld!")
}

~~~

5.コードを実行

~~~
$go build hello.go
$./hello
HelloWorld!
$
~~~

***完了***

##これからGolangで作りたいもの

- OCR で画像認識を使ってレシートから文字を読み取って家計簿集計アプリ
- LINE チャットボット　(クソアプリ版)
- LINE チャットボット 有用版 (公開しても良い版)
- REST API サーバ/クライアント
- SOAP API サーバ/クライアント

##最後に

これから趣味、仕事問わず個人的に勉強になった事を投稿していきます。
文章とか説明資料の練習も兼ねつつまったりゆるくやってきます。

これから投稿していきたい記事としては、DB、OS,ネットワーク,クラウドあたりと考えています。

主に個人用ですが、読んだ方の参考になれば幸いです。
NestJSでHMR(Hot-Module Replacement)でホットリロードする

NestJSは`nest new`したあとに`nest start:dev`するだけで、ホットリロードする開発環境を整えることができます。しかし、これはファイルの変更を監視し、変更が検知されたら再度ビルドしているだけなので、プロジェクトが大規模になるとTypeScriptのビルドの処理が重くなります。
そこで、WebpackのHMR(Hot-Module Replacement)を利用すると、変更のあったモジュールだけを入れ替えることができるので、大きなプロジェクトでもホットリロードの時間を大幅に短縮することができます。

> この記事は、ほとんど公式ドキュメントの意訳です。
> **ドキュメント** : https://docs.nestjs.com/recipes/hot-reload
> **ライセンス** : https://github.com/nestjs/docs.nestjs.com/blob/master/LICENSE

**注意**

* Yarn v2(berry)を使用している場合は、そのままでは動きません。上記リンクより公式ドキュメントをご確認ください。
* 公式ドキュメントでは、Nest CLIを利用しない方法も紹介されていますが、この記事ではNest CLIを利用する方法のみご紹介します。

---

Nest CLIにはWebpackが含まれているので、Webpackの`HotModuleReplacementPlugin`が使えます。

## インストール
必要なパッケージをインストールします。

```sh
$ npm i --save-dev webpack-node-externals run-script-webpack-plugin webpack
```

## 設定ファイル
アプリケーションのルートディレクトリに`webpack-hmr.config.js`を作って、以下を書き込みます。

```js
const nodeExternals = require('webpack-node-externals');
const { RunScriptWebpackPlugin } = require('run-script-webpack-plugin');

module.exports = function (options, webpack) {
  return {
    ...options,
    entry: ['webpack/hot/poll?100', options.entry],
    externals: [
      nodeExternals({
        allowlist: ['webpack/hot/poll?100'],
      }),
    ],
    plugins: [
      ...options.plugins,
      new webpack.HotModuleReplacementPlugin(),
      new webpack.WatchIgnorePlugin({
        paths: [/\.js$/, /\.d\.ts$/],
      }),
      new RunScriptWebpackPlugin({ name: options.output.filename }),
    ],
  };
};
```

デフォルトのWebpack設定と、Nest CLIから渡されるWebpackパッケージの参照を引数に取ります。そして、`HotModuleReplacementPlugin`、`WatchIgnorePlugin`、`RunScriptWebpackPlugin`プラグインでWebpackの設定を書き換えて返します。

## Hot-Module Replacement

`main.ts`を開いて、以下のように書き換えることで**HMR**を有効化できます。

```js
declare const module: any;

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);

  if (module.hot) {
    module.hot.accept();
    module.hot.dispose(() => app.close());
  }
}
bootstrap();
```

`package.json`に以下のスクリプトを追加します。`nest new`した状態だと既に`start:dev`は存在すると思うので、`start:hmr`にしてもいいと思います。

```json
"start:dev": "nest build --webpack --webpackPath webpack-hmr.config.js --watch"
```

あとは、スクリプトを実行するだけです。

```sh
$ npm run start:dev
```

## 感想
私の環境だと、HMRするとファイル変更がすぐに反映されなかったりしたので、プロジェクトが大きくなるまでは通常のホットリロードを使用した方が無難かなと思いました。
また、Webpackを使用すると、ファイルパスの指定などに違いが出るようなので、HMRに移行する場合には注意が必要かもしれません。
これは私の知識不足ですが、ブラウザをオートリロードする方法がわからないです。
端末操作チート表

#シェル
>シェル (英語: shell) はオペレーティングシステム（OS）があるような高機能なコンピュータにおいて、ユーザーのためにインタフェースを提供するコンピュータプログラムであり、オペレーティングシステムが提供する機能へのアクセスを提供する。
引用:Wikipedia

シェルは貝殻のようにカーネルを包むように存在している。

##主なコマンド
| コマンド　 |  |
|:---------|----------:|
| ls| 現在のディレクトリのファイルやフォルダを表示　|
| cd | ディレクトリに移動、rootに戻る　|
| pwd | 現在のパスを表示 | 
| touch | 空のファイル名を作成 |
| rm | ファイルを削除 |
| mkdir | 新しくディレクトリを作る |
| rmdir | ディレクトリを削除 | 
| dir | ディレクトリやファイルを表示 |
| mv | 「元のファイル名　新しいファイル名」でファイル名を変更 |
| cat | 「ファイル名」で内容を表示。「ファイル名　ファイル名」で連結して表示 |
| cp | 「ファイル名　ディレクトリ」でディレクトリにファイルにコピー |

##オプション
オプションを確認する

```
$ man ls
```

manを日本語にする

```
$ sudo apt-get install manpages-ja
```


#ディレクトリ
| ディレクトリ名 |  |
|:-----------|------------:|
| / | ルート |
| /bin | 一般ユーザの基本コマンド |
| /sbin | システム管理者のコマンド |
| /boot | 起動に必要なファイル |
| /dev | デバイスファイル |
| /etc | 設定ファイル |
| /home | ホーム |
|/root | システム管理者のホーム |
| /lib | 共有ライブラリ |
| /mnt | 一時的な一時的なマウントポイント用ディレクトリ |
| /proc | カーネルやプロセスに関する情報 |
| /usr | プログラムやコードなど |


#ファイルパーミッション

```
アクセス権　リンク数　所有者　所属グループ　ファイルサイズ　最終更新日付　ファイル名
```

例えばこんな感じ。ls -lすると表示される。

```
-rw-r--r-- 1 reten reten 8980  9月  8  2019 test.txt
drwxr-xr-x 2 reten reten 4096  5月 10 23:10 dir1
```


##アクセス権
linuxで作成されるファイルやディレクトリに、アクセス権（パーミッション）が設定される。
[]は、表記の文字数。

```
ファイルの種類[1]　所有者のアクセス権[3]　グループのアクセス権[3]　その他ユーザのアクセス権[3]
```

例えばこんな感じ。

```
-rw-r--r-- 
drwxr-xr-x 
```


###ファイルの種類
| 表記 |  |
|:-----------|------------:|
| - | ファイル |
| d | ディレクトリ |
| l | リンク |



###ファイルに対してのアクセス権

| 表記 |  |
|:-----------|------------:|
| w(書き込み) | ファイルの編集が可能 |
| r(読み込み) | ファイルの内容など表示が可能 |
| x(実行) | プログラムなどのファイルの実行が可能 |



###ディレクトリに対してのアクセス権

| 表記 |  |
|:-----------|------------:|
| w(書き込み) | ディレクトリの内容の編集が可能 |
| r(読み込み) | ディレクトリに登録されているファイル名の表示が可能 |
| x(実行) | ディレクトリに登録されいているファイルへのアクセスが可能 |

ファイルへのアクセス権が許可されていても、ディレクトリのexecute(実行)が許可されていないとアクセスできない。


##アクセス権の変更

```
$ chmod 753 test.txt
```

変更したいアクセス権を数字で与える。

**--w　→　001　→　1
-wx　→　011　→　3
rw-　→　110　→　6
rwx　→　111　→　7**

と、いうことは753は
**rwxr-x-wx**
となり、上記のコマンドは、test.txtをこのアクセス権に変更するという意味になる。
我が国の中央銀行デジタル通貨における現状への取り組み

# 前書き

近年、仮想通貨を筆頭にデジタル通貨が注目を遂げている。しかし、注目の裏腹に伝統的な中央銀行を中心とした金融市場に混乱をもたらしている。

各国の中央銀行が、金融市場の秩序を保つ目的で、中央銀行発行のデジタル通貨の検討をしている。[9]

また、イングランド銀行のJohn Barrdearら[1]の報告によれば、『金融危機前の米国に合わせて調整したDSGEモデルでは、実質金利、歪んだ税金、金融取引コストの削減により、国債に対してGDPの30%のCBDCを発行すると、GDPを恒久的に3%程度引き上げることができることがわかった。』
※日本の場合、デジタル通貨を毎年150兆円発行が必要。



以上を受け日本銀行は2021年4月にデジタル通貨の実証実験を開始した。[2]

ここで、他の電子通貨との違いを明記する。

電子マネー・・・『「円」をデジタルで記録し、現金の代わりに使用する』[3]
仮想通貨（暗号資産）・・・『中央銀行の信用の裏付けがない、民間独自の無国籍通貨』[2]
デジタル通貨・・・デジタル化されている、円などの法定通貨建てである、中央銀行の債務として発行される通貨[4]


最後に、本誌は2021年5月15日現在の状況をまとめたものである。

# 仮想通貨に対する各国政府の批判[2]

1、マネーロンダリングの温床になる
2、破綻した場合の利用者保護が不自由
3、中央銀行の保護が効かず金融秩序や景気に悪影響

# 各国の流れ[2]

### 2020年発行
バハマ中央銀行、カンボジア国立銀行

### 2021年以降発行予定
日本銀行、中国人民銀行、スウェーデン中央銀行、東カリブ中央銀行、トルコ中央銀行、ウクライナ中央銀行、マーシャル諸島共和国財務省、韓国銀行、レバノン中央銀行、ウルグアイ中央銀行、オーストラリア準備銀行、タイ中央銀行、シンガポール金融通貨庁、カナダ中央銀行、

# 日本銀行の実験フロー[2]

1、発行や流通の基本機能の検証
2、保有金額に上限をもうけるなど、実証に向けて検証
3、民間事業者や消費者が参加、実際の決済に使えるか検証

# 法的な問題[5]

1、日本銀行はデジタル通貨を発行できるのか
→電子的なものを銀行券とする解釈は無理があり、法改正が必要。
2、デジタル通貨は通貨たりえるのか
→デジタル通貨は銀行券に含まれると解釈することは難しいため、デジタル通貨に法貨性を付与するには法改正が必要である
3、デジタル通貨の取引を制限できるのか
→一般利用者や仲介機関の範囲を制限することは、是認されうると思われる。
4、マネーロンダリング、テロ資金供与をどう防ぐのか
→責任主体を明確化した制度設計が必要。
5、個人情報保護をどう考えるのか
→責任主体を明確化した制度設計が必要。
6、デジタル通貨が偽造・複製されたり、消滅したりしたら、どうなるのか
→システム設計によって、長短あり。
7、デジタル通貨を差押えることはできるのか
→口座型はできるが、トークン型は改正が必要。
8、通貨偽造をどう罰するのか
→通貨偽造罪の客体については、「通用する貨幣、紙幣又は銀行券」と定められており、デジタル通貨は対象ではない。

# キャッシュレスとデジタル通貨の相違点[6]

|内容 |キャッシュレス  |デジタル通貨  |
|---|---|---|
|デジタル地域通貨  |○    |○  |
|給与のデジタル支払い  |△    |○  |
|企業間決済  |✖️   |○  |
|転々流通  |✖️   |○  |
|プログラマル  |✖️　 |○  |

# 技術的な検討事項[7]

特徴|検討事項
---|---
利便性|端末はユーザがタップして決済する方式をとり、オフラインで使用できるものが良い。
安全性と強靭性|すでに成熟した暗号技術と分散型台帳技術システムをベースに24365対応が望ましい。
即時性と拡張性|パーミションド型分散型台帳技術ネットワークに大容量処理を可能にしたい。
相互運用性|サードパーティの参画がしやすく、囲い込みがし難い設計を行いたい。
柔軟性と適応性|マネーと決済の基本概念を忠実に守る必要がある。

# ブロックチェーンと分散型台帳技術の違い[8]

※以下、[8]をそのまま転機

分散型台帳技術はデータをユーザーみんなで共有する技術
ブロックチェーンはそのデータを保存していく技術
そのために、改ざんできない仕組みや技術が使われている
大事なデータの保存でも安全性が高く、信頼できる
仮想通貨にブロックチェーン技術が使われるほか、企業での導入も進んでいる

# 参考文献

[1]

https://www.bankofengland.co.uk/-/media/boe/files/working-paper/2016/the-macroeconomics-of-central-bank-issued-digital-currencies.pdf?la=en&hash=341B602838707E5D6FC26884588C912A721B1DC1

[2]

https://vdata.nikkei.com/newsgraphics/digital-currency/

[3]

https://www.smbc-card.com/cashless/kojin/digital_currency.jsp

[4]

https://www.boj.or.jp/announcements/education/oshiete/money/c28.htm/

[5]

https://www.boj.or.jp/research/wps_rev/lab/lab19j02.htm/

[6]

https://www8.cao.go.jp/kisei-kaikaku/kisei/meeting/wg/seicho/20210427/210427seicho03.pdf


[7]

https://www.boj.or.jp/research/brp/psr/psrb200702.htm/

[8]

https://coinchoice.net/what-is-a-blockchain/

[9]

https://www.hoover.org/sites/default/files/bordo-levin_bullets_for_hoover_may2017.pdf
Shopee - Price Match Guarantee(Public 203th → Private 829th)のsolutionまとめと反省 

今回kaggleのコンペ「Shopee - Price Match Guarantee」に参加しました。
今回のコンペのsolutionのまとめと反省を行います。

## コンペ概要
こちらのコンペは、Shopeeというショッピングサイトの画像、ハッシュタグ、タイトルとそれぞれの投稿を使用し、どの製品が一緒の製品なのかを予測するコンペとなります。かなり簡単に説明したので、詳しくは以下のリンクを確認してください。

https://www.kaggle.com/c/shopee-product-matching

今回のコンペは、画像、自然言語を組み合わせたタスクとなるため前半2週間は画像、
後半2週間は自然言語のモデルを作成するスケジュールです進めていました。

## コンペ参加
ちょうどコンペが終わる1か月前でした。
まずは、コンペの概要やbaselineの作成、Discussionの読み込みを進めました。
baselineに使用したのはこちらです。(感謝)

https://www.kaggle.com/parthdhameliya77/shopee-pytorch-eca-nfnet-l0-image-training

## 前半2週間
類似した過去コンペのsolution、shopeeコンペのDiscussionを読み漁りつつ、baselineに付け足していきました。
コンペのくくりで言うと、以下の4つです。

https://www.kaggle.com/c/landmark-recognition-2020

https://www.kaggle.com/c/landmark-retrieval-2020

https://www.kaggle.com/c/landmark-recognition-2019

https://www.kaggle.com/c/landmark-retrieval-2019

参考にしたsolutionは最後にリンクをまとめておきます。

先ほどのコードをベースとして以下を試しました。
model: Seresnext系、resnest系、Efficientnet系(v2含む)、NFnet系、regnet(合計20個くらい)
loss: ArcFace、AdaCos、CurricularFace、Focalloss
activation: relu→mish、silu→mish
optimizer: adam、adamw、ranger
augmentation: HorizontalFlip、VerticalFlip、Rotate、RandomBrightness、Normalize、Cutout、RandAugment、Autoaugment
pooling: GeMPooling
other: AMP

最終的にはNFNetl0、l1、Efficientnetb5、Resnest101eにGeMを使用したモデルが精度が高く使用することにしました。

## 後半1週間

baselineにはTFIDFを使用して文章の類似度を計算し、knnでクラスタリングをしていましたが、Bertが使えるんじゃないか？
という議論がDiscussionに上がっていました。ランキング上位層がBertを使っていると、コメントをしていたの使用してみることにしました。
baselineはこちらです。(感謝)

https://www.kaggle.com/tanulsingh077/metric-learning-pipeline-only-text-sbert

こちらをもとに以下を試しました。
model: Roberta-base、paraphrase-xlm-r-multilingual-v1、distilbert-base-indonesian
input: 英語→インド語、インド語→英語にモデルによって変換

## 最終週
最後はアンサンブルの手法、PPTを試しました。
KNNに入力するembedingをconcatしたり、meanしたりそれぞれのモデルのKNNの予測値でvotingをしました。

最終的にはLBが一番高いものと異なるモデルでvotingしたものを提出しました。
![shopee solution.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599573/dfd73d89-b2e3-f994-98b0-c9bbfc85299f.png)


## 結果
PublicLB上ではメダル圏内にいましたが、LBにかなり寄せたチューニングをしていたので、shakeするだだろうなと感じていました。
何とかしようと試行錯誤を行っていましたが、案の定shake downしました。泣

## 反省
入賞した方のsolutionを見ると、PPTが勝負の分かれ目なのだと感じました。
評価指標がF1なので、どうやってFPを減らすかのアイデアと実装が足りなかった。
データをよく見ることと評価指標のハックが基礎であったことを再実感しています。

反省点を列挙します。

・データを見る粒度が荒い。
途中参加だったこともあり、GMのEDAを読むなどしました。
EDAはinputのデータの探索を行います。が、逆の視点、outputからの探索ができていませんでした。
今回の評価指標はF1だったため、FPを減らすアプローチが有用でしたが、
自分のモデルがどうやって予測してるのかなど、モデルの予想からデータをとらえることが不足していました。
その結果、PPTが見つけられなかったと感じています。

・知識不足
そりゃそうだろって、話なんですが、
今回で言うとstakingにペアワイズ学習や、GNNを使用しているチームが、上位入賞していました。
そのあたりの知識がなく、そもそもの引き出しとしてなかったです。

・英語
最新の論文は基本的には英語で、codeもない場合が多いです。
その場合自分で実装する必要があるのですが、そもそも英語が得意ではないため逃げてしまいました。
一日で何とかできるものではないので、あきらめず勉強を継続していきます。

・実装力
上位の方のsolutionを見ると、自身の実装力のなさを痛感しました。
こちらも、上位の方のsolutionを読み再現できるようにしていきます。

## まとめ
今回のコンペでの学びは非常に多く、自身の課題がとても見つかりました。
参加してよかったです。

まずは、宣言として以下の点を復習します。
・GNN
・ペアワイズ学習
・Database-side feature augmentation (DBA) / Query Extension (QE)
・メタデータ学習

あきらめずにMaster目指して頑張ります！
最後に一言だけ、






悔しいです！！
AWS Certified Machine Learning – Specialtyを取得するまでにやったこと

![aws-certified-machine-learning-specialty.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58697/e178cbd4-97d5-dfb8-1161-a27442063420.png)


先日（2021/5/11）、AWS Certified Machine Learning – Specialtyを受験して合格したので、それまでに行った勉強方法を紹介します。

# 筆者のスペック
前提条件の私のスペックです。
#### 機械学習の知識
AI系のスタートアップでソフトウェアエンジニアをしています。
しかし、データサイエンティストやMLエンジニアではないので機械学習の用語はある程度知っている程度で、そこまで詳しいわけではないです。最近は主にIoTやWeb周りをやることが多いので、少し機械学習関連の仕事からは遠ざかってました。

#### AWSの知識
AWSに関しては今の会社に入社して以来、1年半ぐらい使っています。メジャーサービスはほぼ使っていて、今年の3月ぐらいにAWS SAPを取得しました。
学習開始当時、Sagemakerはまだ使ったことがなかったです。（今は結構使っています）

# 勉強方法
二ヶ月ぐらいかけてまったりと勉強していました。総学習時間は土日+GWの8日分(一日5時間程度)ぐらいなので、めちゃめちゃ勉強したわけではないです。
ゼロから作るDeepLearningなどの機械学習入門の本を勧めている合格体験記もありますが、単純に合格を目指すのであれば少し遠回りかなという印象です。

## G検定を受けてみる
合格体験記を眺めているとG検定をやった方が効率的という記事を見つけたので、G検定を受けてみました。
勉強する過程で機械学習の基本的な用語は網羅されるし、G検定もついでに取れたので、おすすめです。トータル勉強時間は3日ぐらいで、G検定の問題集を一通り解きながら、チートシートを用意しました。このチートシートは次のML Specialtyの勉強にも自分用のノートとして加筆していきました。（ML全く知らんという人は5日あれば十分かと思います。）
試験当日は自分の用意したチートシートとネットを探して出てきたチートシートを使って、問題を解いていきました。チートシートを用意すれば難しい試験ではないと思います。

https://www.jdla.org/certificate/general/

## 一回手を動かす
どうやらSagemakerについての問題が多く出題されるということだったので、Sagemakerを知るために手を動かしてみました。
記事を調べながらSagemaker Studioを使って、データの前処理・モデルの作成・モデルのデプロイの一連の流れを一回やってみました。データセットはKaggleの有名なタイタニックのデータセットを使いました。実際Sagemakerを動かしてから勉強すると頭に入りやすかったです。

https://dev.classmethod.jp/articles/amazon-sagemaker-data-wrangler-with-demo-titanic/

## Udemyで模擬問題を受ける
この模擬問題集は全て英語です。日本語の問題集はほぼないので仕方ないですね。でも、自動でブラウザのGoogle翻訳を行いながら解くと割と本番のような問題文で解けるのでおすすめです。（AWSの試験は毎回日本語がおかしい）
Sagemakerの細かい設定に関する問題まで出てきますが、そこまで細かい話は本番出てきませんでした。しかし、本番とほぼ同じ問題がちらほらありました。この模擬問題さえ解けるようになれば基本的に合格すると思います。
自分は、50%ぐらいの正解率でした。一通り解いて見直しをして、G検定のチートシートに加筆していきました。（めんどくさかったので二回目は解いてません。）

https://www.udemy.com/course/aws-certified-machine-learning-specialty-full-practice-exams/

## AWSの模擬試験を受ける
60分で20問あります。問題は解きながら、スクリーンショットを撮って後から見直しできるようにします。（良いのかわかりませんが）
模擬試験は本番よりはやや簡単でしたが当たり前ですが、本番に近い問題が多かったです。以前にAWSの試験を受けて無料バウチャーを持っている方はできれば受けた方が良いと思います。自分は90%ぐらいの正解率でした。

https://aws.amazon.com/jp/certification/certification-prep/

## 公式ドキュメント
このMLSpecialtyについては自分はAWSの公式ドキュメントはあまり読まずに勉強しました。わからなかったところを検索して出てきたところや気になったところだけクラスメソッドさんの記事とホワイトペーパーを参照する形で勉強しました。
ただ、AWSのML系のサービス一覧はある程度覚えていた方が良いので以下の一覧は目を通しておいた方が良いです。

https://aws.amazon.com/jp/machine-learning/

# 本試験の概用・感想
180分で65問の問題数があります。受験料は3万円でかなり高いので、落ちることはできません。50%OFFバウチャーを使って1万5千円で受けました。
SAPのように一問一問時間がかかるというようなことはなく、ゆっくり解いてもかなり時間に余裕がありました。私は見直し込みで70分程度で終了しました。ただ、確実に受かってるか自信があったわけではなく、合っている確信がない問題が13問ぐらいありました。（特にForecastについての問題がわからなかったです。）
SageMakerに関する問題は思ったより多くなかったです。一般的な機械学習の話が半分ぐらいあり、Sagemaker以外のAI系のサービスに関する問題や、ETLに関連するAWSサービスについての問題がバランスよく出題されていました。（詳しいことは規約により書けません）

# スコア
自分のスコアは855点でした。（合格は750点以上）
思ったよりも余裕がありました。

# 取得後
今では会社でもSagemakerを使い始めていて、現在社内にて布教中です。Sagemaker独特のお作法が多いのでそこは厄介ですが、データの前処理やモデルのデプロイが簡単にjupyter Lab上でできるサービスは他になかなかないので重宝してます。
React入門 - Part6 - apiの呼び出し、値の受け取り(axios等)

# 目次

# axiosをインストール

[Part2](https://qiita.com/yokosuka205k9/items/132fbd4129afd9b37500)を参考にプロジェクトを作成しディレクトリをプロジェクトに移動したら下記コマンドを実行します。

```
npm install axios
```

# 那覇市のお天気情報を画面に表示してみる。

`https://weather.tsukumijima.net/`
で那覇の天気が取得できそうなので、表示してみます。

以下のように実装してください。
ファイル名は、`axios-test.tsx`としました。※もちろんpages配下に作成

```typescript
import React, {useState, useLayoutEffect} from 'react';
import axios from 'axios';

export const AxiosTest: React.FC = () => {
    // 那覇市のお天気データ ※https://weather.tsukumijima.net/参考
    const url = `https://weather.tsukumijima.net/api/forecast/city/471010`;
    // データを保存するやつ
    const [data, setData] = useState([]);

    useLayoutEffect(() => {
        axios.get(url)
            .then(res =>{
                setData(res.data);
            })
    }, []);

    /** レンダー部分 */
    return (
        <>
            {JSON.stringify(data)}
        </>
    );
};

export default AxiosTest;
```

`useState`とか`useLayoutEffect`とか出てきましたね。
ここでは、あまり深く考えないで、URLを叩いたらその結果が表示できたくらいの
感じで。
`useState`とか`useLayoutEffect`は後ほどhooksについてのtipsなどで説明したいと思います。

# 表示確認

先で学んだように、

```typescript
yarn dev
```

して

```
http://localhost:3000/axios-test
```

にアクセスすると、

こんな感じで表示されるかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/3dae940f-bd6a-32c6-511b-29cdb90a5ab0.png)
主成分分析の勉強：その１

今日はVRアカデミアにて、主成分分析について学びました。
https://www.youtube.com/watch?v=mMmTHoZKWTI
とても分かり易かったです。いつも感謝です。

`●主成分分析の目的
分析したいデータに関係するパラメータ数を減らすこと！`
例えば、テストの成績についてどんな傾向があるのか８教科のテストの点(８次元)全部では説明しにくいので、合計点だけ(1次元)や、合計点と文系理系(2次元)から説明して判断しやすくする。

そして、出来るだけ分散が大きくなるパラメーターを探したい。分散が大きいほど、そのパラメーターによる説明に意味が出る。
例えば、平均点98点で分散が小さいの世界史よりも、平均点60点で分散が大きい数学に注目して評価した方が、佐藤さんと田中くんの違いが表現できるということ。



●手法：今回は概略だけ
各パラメーターに重みをかけて、足すことで分散を計算する。

Z(佐藤)＝(W(国語) × X(佐藤•国語)) + (W(数学) × X(佐藤•数学)) + (W(英語) × X(佐藤•英語))  ・・・・

ここでZは分散、Wは重み、Xは実際の点数。
分散Zを100人分足して最大となる、重みW(8教科のセット)が第一主成分となる。
実際に計算し、8個の重みが大体同じくらいになったとすると、偏りはあるものの合計点数が第一主成分となる。
ここから、佐藤さんを特徴づけるには、合計点で比べるのが一番有意義ということがわかる。


2番目に分散が大きくなる重みWのセットを第二主成分という。
実際に計算すると、理系科目でマイナスのW、文系科目でプラスのWとなる。
ここから、文系度で分けることが2番目に有意義だということがわかる。




今回はざっくりでしたが、こんどは実装を真似してみたりしたいと思います。(^^)
Python boot camp by Dr.Angela day14

#Mission>> Higher Lower Program
AとBどちらの方がinstagramのfollower数が多いか、勝ち抜き戦をするゲーム。
正解した場合→ どんどん次の挑戦者が現れ、当てていく。
不正解の場合→ その時点でGAME OVERで、Final scoreが表示される。

余談...今までreplit(クラウド型IDEを使用していたが、connectionが途切れることが多いので今回からVisual Studioに変えた。サクサク快適である！)

```python3:higher_lower.py
import random
from game_data import data
from art import logo
import os                     #os.system('○○○')で○○○のコマンドを動作させられる
                              #今回はコンソール消すコマンドで使用
                              #Linuxならclear / Windowsならcls
def select_account():
    """新たにaccountを選定し、返す。さらにそれをリストから削除しておく"""
    NEW_CHAL = random.choice(data)
    remove2 = data.index(NEW_CHAL)
    del data[remove2]
    return NEW_CHAL

def check_answer(guess,a_follower,b_follower):
    """guess vs correctを比較してTrue or Falseを返す"""
    substraction = a_follower - b_follower
    if substraction > 0:
      return guess == "A"     #->"A","B"を返すのではなく、guessの結果とA,Bが合致していればTrueを返す
    else:
      return guess == "B"

def play():
    score = 0
    game_should_continue = True
    a = select_account()      #初回CHAMPION選定
    b = select_account()      #初回CHALLENGER選定
    
    while game_should_continue:       #gameが続く限り繰り返しaccountをget
        print(logo)
        print("[A] CHAMPION: "+ a['name']+ ", " + a['description']+", from " + a['country'])
        print("[B] CHALLENGER: "+ b['name']+ ", " + b['description']+", from " + b['country'])
        
        guess = input("\nWho has more followers? [A/B] ")
        if guess == "A":            #Aを選択した場合
            a = a                     #aはそのままaに据え置き、
            b = select_account()      #bは新たに選定
        else:                       #Bを選択した場合
            a = b                     #bはaとして置き換え、
            b = select_account()      #bを新たに選定

        a_follower = a["follower_count"]
        b_follower = b["follower_count"]
        is_correct = check_answer(guess, a_follower, b_follower)
        #check_answer()にaとbのfollower数投げて、is_correctとしてTrueかFalseをもらう
        line = "---------------------"    
        if is_correct:   #正解である限り繰り返す
            score += 1
            os.system('cls')
            print(f"\n{line}\nYou're right!\nCurrent score: [ {score} ]\n{line}\n")
        else:            #不正解ならば
            game_should_continue = False    #gameは続けない
            os.system('cls')
            print(f"\n{line}\nSorry, that's wrong.\nFinal score: [ {score} ]\n{line}\n")

play()
```
＜今回学んだこと＞
・def check_answer()の中の、return文の書き方。これでTrue/Falseが返ってくる。
・import os & os.system('任意のcommand')でOSのコマンドが実行できるようになる。
Swaggerを使ってAPI仕様書のサンプル例を書いてみる。

<h2>Swaggerを使ってAPI仕様書を書く！</h2>

先日、Swaggerというフレームワークを利用して作成されたAPI仕様書を初めて見たが、使い方や見方がさっぱり分からなかったため、
備忘録の意味でも学習内容を記載いたします。

今回、サンプルや参考サイト等を見て記述したyamlファイルは下記リポジトリに存在します。

<a href="https://github.com/mashharuki/Swagger_Practice">
 SwaggerSample
</a>


<h3>Swaggerとは？</h3>
REST APIを定義するためのフレームワークのこと
(別の方は、ツールセットとも表現されていました。)

<h3>REST APIとは？</h3>
RESTの原則に則って構築されたWebシステムのHTTPでの呼び出しインターフェースのこと。

<h3>RESTとは？</h3>
REpresentational State Transferの略で、分散型システムにおける複数のソフトウェアを連携させるのに適した設計原則の集合、考え方のこと。
RESTの原則に従うことでURIに規律が生まれ、サービス開発者が楽になるなどのメリットが生まれる！
※他に色々ありそうですが、今日のところは割愛させていただきます。

Swaggerの記述に方法については、YAML形式とJSON形式の2通り存在する。
(今回は、YAML形式で作成)

get,post,put,deleteメソッドについてそれぞれ1種類ずつ作成して見た。
AWSのAPIGateWayとも組み合わせることができるらしく、AWS上で構築したアプリケーション機能について、
定義内容と一緒にすぐにAPIが試せるドキュメントが生成できるのは素晴らしい！！
海外では、API使用書をSwaggerで書くことがデファクトスタンダートとなっているらしい。。(自社でも取り入れたい！)

中身の基本的な構造については、下記の通りREADME.mdに記載されているため、参照いただきたい。
<a href="https://github.com/mashharuki/Swagger_Practice/blob/main/README.md">
 README.md
</a>

システム開発でも労力がかかり馬鹿にできないのがドキュメント作成作業。。。。
もしAPIもせっせとwordやらパワポやらで作成するとなると大変な労力となる。。

Swaggerについては、まだまだ勉強が必要であるが、その素晴らしさを垣間見ることができた！

【参考サイト】
<ul>
 <li><a href="https://swagger.io/specification/">公式ドキュメント</a></li>
 <li><a href="https://qiita.com/teinen_qiita/items/e440ca7b1b52ec918f1b">OpenAPI (Swagger) 超入門<a></li>
 <li><a href="https://techblog.zozo.com/entry/swagger_api_mock">開発効率を上げる！Swaggerで作るWEB APIモック</a></li>
 <li><a href="https://qiita.com/poruruba/items/8b541ec730ca070b2bb0">Swagger定義ファイルの書き方(超手抜き編)</a></li>
 <li><a href="https://qiita.com/rllllho/items/53a0023b32f4c0f8eabb">Swaggerの記法まとめ</a></li>
</ul>
gyp: No Xcode or CLT version detected!のエラー対処

## 事象
ReactにTypeScriptを導入しようと思い、npm install関連のコマンドで環境構築していた時に下記のようなエラーと遭遇しました。

```
gyp: No Xcode or CLT version detected!
```

## 解決策
Xcodeはインストール済みだったのでアップデートを促すエラーかなと思いアップデートを試しましたが変わりませんでした。
そのため、下記のように削除してからインストールし直しました。

```
$ sudo rm -rf $(xcode-select -print-path)

# CommandLineToolsのディレクトリを削除
$ sudo rm -rf /Library/Developer/CommandLineTools

# Xcodeを設定とかをリセットする
sudo xcode-select --reset

# Xcodeを再インストール
$ Xcode-select --install

# 再度npmでインストールしてみる
npm install 【インストールしたいパッケージ】
```

すると...
今度は成功していると思います！

参考
https://github.com/nodejs/node-gyp/blob/master/macOS_Catalina.md#i-did-all-that-and-the-acid-test-still-does-not-pass--
【MySQL】mysqlのrootユーザーがsudo無しでログインできるようにする

rootはセキュリティのためにsudoでログインするように設定していることが多いですが、ローカル環境でrootアカウントでデータベースに接続したかったため、sudo無しでrootログインできるようにした過程をメモ。
mysqlのバーションによって違いが出たので、注意。

### mysqlにsudoでログイン

```
sudo mysql -u root -p
```
### 設定し直す

```
mysql > ALTER USER 'root'@'localhost' identified BY '[パスワード]';
mysql >FLUSH PRIVILEGES;
``` 
### ※設定し直す(MYSQL５.7まで有効なコマンド)
``` 

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '[パスワード]';
mysql >FLUSH PRIVILEGES;
```
ransackを使う

## 内容
gem ransackを使って検索機能を実装する方法を記述

## ransackをインストールする
Gemfileにransackを記述

```
gem 'ransack'
```

ターミナルにて

```
$ bundle install
```

※サーバーを再起動する


## 検索したいcontrollerにて

```rb
def index
  @q = Question.ransack(params[:q])
  @questions = @q.result(disitinct: true)
end
```

## html.erbにて

```erb
<%= search_form_for @q do |f| %>

  <%= f.label :title_cont %>
  <%= f.search_field :title_cont %>

  <%= f.submit %>
```
今回の場合は`_cont`を使用（入力した文字を含んでいるもの）

参考
https://github.com/activerecord-hackery/ransack

[![Image from Gyazo](https://i.gyazo.com/9bd61e35f49fad1caff57575a9007a73.png)](https://gyazo.com/9bd61e35f49fad1caff57575a9007a73)

## 内容でも検索したい
以下のような投稿の時にタイトルだけでなくbodyの内容も検索に引っ掛けたい
[![Image from Gyazo](https://i.gyazo.com/5e39c6cad9a1342a11ee58d0e38c3c93.png)](https://gyazo.com/5e39c6cad9a1342a11ee58d0e38c3c93)

```erb
<%= search_form_for @q do |f| %>

  <%= f.label :title_cont %>
  <%= f.search_field :title_or_body_cont %>

  <%= f.submit %>
<% end %>
```
のように`or`を使うと

[![Image from Gyazo](https://i.gyazo.com/4ffbb47d75e47dc48789059f3c89ebdd.png)](https://gyazo.com/4ffbb47d75e47dc48789059f3c89ebdd)
検索に該当することができる
[ActiveStorage]画像複数枚投稿のエラー

※プログラミング学習中の私がアップロードしてます。理解が浅いです。
この記事は厳密な仕様に関するものではなく、考え方理解のまとめとして受け取ってください。

現在、フリーマーケットアプリの開発中です。

環境
-
Rails 6.0.3.6
Activestorage 6.0.3.6
Ruby 2.6.5p114
Devise 4.7.3

現在写真投稿機能にプレビュー機能を追加が終わり、続いて複数枚投稿機能を実装中です。
写真に関する複数枚表示を実装しております。

エラー
-
![20210515-170526.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/2afd4760-e2a0-45ad-760d-36741a22a8d2.png)

こちらのエラーについては同じく受講生さんの@zuu_aaさんの投稿で解決出来そうだと考えたのですが、

これだと１枚目(images[0])に限定するので悩んでいました。
結果は以下
![20210515-171546.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/5dc4c874-cf58-797f-2a68-0194dd1773fc.png)


もう一度ブロック変数で取れている中身を確認し見ると

```rb
<%= link_to item_path(item.id) do %>
 <div class='item-img-content'>
   <% item.images.each do |i| %>
   <%= image_tag item.images[0], class: "item-img" %>
   <% if item.purchase.present? %>
```

```terminal
>> i
=> #<ActiveStorage::Attachment id: 41, name: "images", record_type: "Item", record_id: 39, blob_id: 41, created_at: "2021-05-15 07:38:54">

>>  item.images
=> #<ActiveStorage::Attached::Many:0x00007fccdaa34fb8 @name="images", @record=#<Item id: 39, item_name: "www", description: "www", category_id: 3, status_id: 2, delivery_fee_payment_id: 3, prefecture_id: 2, delivery_prepare_id: 2, price: 3400, user_id: 2, created_at: "2021-05-15 07:38:54", updated_at: "2021-05-15 07:38:54">>
```

というふうに取得できているので

以下のように書き換えるとうまくいきました。

```ruby
    <% @item.images.each do |i| %>
      <%= image_tag i, class:"item-box-img" %>
      <%# 商品購入後実装 %>
      <% if @item.purchase.present?%>
      <div class="sold-out">
        <span>Sold Out!!</span>
      </div>
      <% end %>
    <% end %>
```

結果
![20210515-172054.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/2e5c7f67-24de-4ef0-6a5d-e6e23b97a297.png)
Laravelの初期設定からMySQLを接続するまでの工程

Laravelでのプロジェクトを作成〜DB接続までの流れをまとめました。


## PHPのバージョン確認

```
php -v
```

## composerのバージョン確認

```
composer -V
```

## Laravelプロジェクトを作成

```
composer create-project laravel/laravel 【プロジェクト名】 --prefer-dist "【バージョン】"
```

## ビルトインサーバーを起動できるか確認する

```
php artisan serv
```

## 日本語化する
app.phpで下記の項目を修正する。

```
'timezone' => 'Asia/Tokyo',
'locale' => 'ja',
'faker_locale' => 'ja_JP',
```


## MySQLへ接続する
.envファイルのDB_CONNECTIONがmysqlに指定されていることを確認する。（デフォルトで指定されている）
下記でdatabase.phpのconnectionsでどのDBを呼ぶかを設定しています。


```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=【データベース名】
DB_USERNAME=root
DB_PASSWORD=
```

IDEで補完を強化してくれる
$ composer require --dev barryvdh/laravel-ide-helper
（競合する可能性があるので.gitignoreへ追記しておきましょう）



## モデル作成

```
php artisan make:mode -a [モデル名]
```

上記コマンドを実行すると下記のようにモデルやデータ周りに必要なファイルが作成される。
・migration
・controller
・seeder
・factory

## マイグレーションを作成、実行してDBを構成する
database/migration下のファイルを作成したいDB構成に合わせて編集する
マイグレーションファイルが足りなければ下記のコマンドで作成する

```
php artisan make:migration【ファイル名】 -create=【テーブル名】
```

下記のコマンドでマイグレーションファイル（設計書）をもとにDBに反映させる

```
php artisan migrate
```

## migrationファイルからDBが作成されているかを確認する
データベースを視覚化できるアプリ（sequel Proなど）でテーブルが作成されているかを確認する。
接続するには.envに設定されている情報を使用するので確認する。

接続して、対象のテーブルを確認すると...
先ほどのmigrationファイルで作成したテーブルとカラムが無事作成できているはずです。
DTSpinインストール方法

# 環境
- Ubuntu 20.04

# 概要
モデル検査ツールのSpinはその構造上、時間の概念を扱うのに難があります。これに時間変数を導入したのがDTSpinです。今後利用方法について記事書く予定です。取り急ぎインストール手順だけまとめます。

# 手順
[配布サイト](https://www.win.tue.nl/~dragan/DTSpin/)の以下にてDTSpinLinux.binをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485117/3353af34-4e5d-9c76-3a5d-d6e2a815ca05.png)

ダウンロードしたフォルダにて以下コマンドを打っていきます。

```
chmod +x ./DTSpinLinux.bin
mv DTSpinLinux.bin /usr/bin/dtspin
```

これで完了です。以下のように、dtspinコマンドが使用可能になっています。

```
$ dtspin -h
use: spin [-option] ... [-option] file
	Note: file must always be the last argument
	-a generate a verifier in pan.c
	-B no final state details in simulations
	-b don't execute printfs in simulation
	-C print channel access info (structview)
...
```

ためしに、上記配布サイトの[Fischerのサンプル](https://www.win.tue.nl/~dragan/DTSpin/Fischer)を実行してみます。拡張子は適当に.pmlとしました。
実行の際には同じフォルダに[このヘッダ:dtime.h](https://www.win.tue.nl/~dragan/DTSpin/dtime.h)を置いておく必要があります。
以下実行します。

```
dtspin -a Fischer.pml 
```

これでpan.c, pan.hが生成されます。
私の環境の場合、pan.hの一行目のdefineがC言語の構文エラーとなってしまったので以下で修正しました。

```
sed '1 s/$/ \\&/' pan.h > out.h; mv out.h pan.h
```

以下でコンパイルします。

```
gcc -DSAFETY -DNOFAIR -o pan pan.c
```

panが生成されるので、それを実行します。

```
$ ./pan 
warning: for p.o. reduction to be valid the never claim must be stutter-closed
(never claims generated from LTL formulae are stutter-closed)
(Spin Version 3.3.10 -- 15 March 2000 + Discrete-Time Extension Version 0.1.1 -- 4 April 2000)
        + Partial Order Reduction

Full statespace search for:
        never-claim             +
        assertion violations    + (if within scope of claim)
        cycle checks            - (disabled by -DSAFETY)
        invalid endstates       - (disabled by never-claim)

State-vector 72 byte, depth reached 5181, errors: 0
  503898 states, stored
...
```

以上。
【Laravel、Vue.js】GETリクエストでパラメータを指定できない


GETリクエストでaxiosのパラメータ指定をしようとしたが、パラメータを指定できなかった。

```:GETリクエスト
const response = await axios.get('/api/hoge', {
  // ここにパラメータを指定したいが、うまくいかない
  id: 12345
})
```


##結論
getリクエストは第2引数にクエリパラメータをつけ、postリクエストは第2引数に送信するデータをつける。

```:GETリクエスト
const response = await axios.get('/api/hoge', {
  // ここに「params」というキー名でセットし、クエリパラメータを指定する
  params: {
    id: 12345
  }
})
```

```:POSTリクエスト
const response = await axios.post('/api/hoge', {
  id: 12345
})
```

POSTリクエストの場合は、HTML5のFormData APIを使用することもできる。

```:POSTリクエスト
const formData = new FormData()
formData.append('id', 12345)
const response = await axios.post('/api/hoge', formData)
```

##参考
https://cloud6.net/so/laravel/272748
https://qiita.com/taroc/items/f22f7dd5d6d5443c72a4
組織でのRedmine活用をはじめるその前に

# はじめに

プロジェクト管理のツールとして広く利用されてきたRedmineですが、プロジェクト管理以外のでも様々な活用がされています。
10年ほどRedmineの管理や様々な組織へRedmineを導入してきた経験をもとに、気を付けていることや考え方を記します。

※Redmineのサーバ構築に関する技術的な話は一切出てこないので最初にお断りしておきます。

# 前提と想定する読者

次の人たちを想定しています。

- はじめてRedmineの活用を考えている（考えるように指示された）人
- Redmineを構築してみたものの、設定をどこから手を付けていいかわからない人
- Redmineの管理者をやっているがなんだかうまくいかなかったと思っている人

# Redmineの設定項目と"3つのP"

Redmineを使い始めるときに必ず次の項目を設定していると思います。

- プロジェクト
- ユーザー　/　グループ　/　ロールと権限
- トラッカー　/　カスタムフィールド

これらの項目を設定する前に、そもそもRedmineは何を管理しているのでしょうか？
私は、次のように考えています。

~~~
人(people)は何か仕事の対象物(product)に対してプロセス(process)を通して仕事をしている。
~~~

このProcessの部分を管理していると考えています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190896/40be1579-bd96-4d2b-3411-6ae224f84aab.png)

なので、この **"3つのP"**　**People** / **Process** / **Product**　を整理すればうまく設定できるはずです。

この **3つのP** とRedmineの設定項目の対応は次のようになります。

|3つのP|Redmineの設定項目|
|:---:|:---|
|誰が(People)|ユーザー/グループ/ロールと権限|
|どのように(Process)|トラッカー/カスタムフィールド|
|何に(Product)|プロジェクト|

それぞれについて、検討していきます。

# 何に？(product)

何に対する仕事を管理しようとしているのかを特定します。
それは特定のソフトウェアに対する仕事でしょうか？自組織の活動自体でしょうか？
これがプロジェクトになります。

経験上”プロジェクト”＝”組織名”とするとあまりうまくいきません。
組織にもよると思いますが、プロダクトの寿命よりも組織の寿命が短いので組織変更の度にプロジェクトを組みなおすことになるので手間がかかります。

どうしても組織名でプロジェクトを組みたい場合には、組織名でプロジェクトを作成し、子プロジェクトとしてプロダクトのプロジェクトを組んでおけば、組織変更の際にプロジェクトの親子関係を付け替えるだけで済みます。

# どのように?(process)

何を管理するのでしょうか？不具合管理でしょうか？問い合わせを管理したいかもしれません。保守契約などの契約管理をしたいかもしれません。
管理プロセスがそのままトラッカーになると考えていいでしょう。
管理プロセスが決まれば管理項目があるはずなので、適宜カスタムフィールドを用意しましょう


# 誰が？(people)

あなたが立ち上げたRedmineを利用するのは誰でしょうか？
特定のプロジェクトの人だけですか？同じ組織の人達でしょうか？
もしかしたら、組織外の人もいるかもしれません。
プロジェクトなら品質管理部門の人やパートナーさんもいるかもしれません。

組織や利用する人たちのグルーピングを考えてグループを設定していきましょう。
職責の違いに応じてロールと権限を設定していくとよいでしょう。

#### グループの例
- ○○部○○課
- ○○部ライン職グループ
- 品質管理グループ
- 問い合わせ受付チーム

#### ロールの例

- 管理者
- 開発者
- オブザーバー
- 品質管理者


# 長期利用や大規模利用の際の考慮事項

Redmineを長期で利用していたり大きなコミュニティで利用していると、トラッカーやカスタムフィールドの数が膨大になってしまうことがあります。

例えば不具合管理を例にとると、あるプロジェクトでは不具合管理と呼んでいたものが別の新しいプロジェクトではバグ管理と呼んでいるとします。
ところが、Redmineはトラッカーは、プロジェクトごとではなくRedmine全体で共有しており、プロジェクトごとに別名を付けることができないのでバグ管理というトラッカーが追加したくなってしまいます。（実態が同じものであるにも関わらず！）

カスタムフィールドも同様で、”影響度”、”影響”、”インパクト”など、多様な意味合いのカスタムフィールドが乱立します。

そうなると気づけば、数十～数百のトラッカー、カスタムフィールドが登録されていて何が何だかわからないという状況になります。
そのころには、利用者も増えていて作成当時の経緯もわからないのでもはや変更することは不可能でしょう。

なぜこのようなことが起きるのでしょうか？
Redmineのトラッカーやカスタムフィールドの名前が一意であるということは、トラッカーやカスタムフィールド設定は、そのRedmineを利用するコミュニティの辞書として機能しているということです。

コミュニティの参加者が好き勝手に辞書に登録してしまっては、もはやそれは辞書として機能できません。
管理者の間でよくよく話し合ってトラッカー、カスタムフィールドを追加していくようにしましょう

# さいごに

私自身の経験に基づいたものなので、みんなに当てはまるものではないとは思いますが、「なにから設定したらいいかわからなーい」という人たちの参考になれば幸いです。
immutableとmutableについて

#immutableとmutableについて
##経緯
Flutterのcookbookでダウンロードボタンのエフェクトについて写経しているときに、出てきたimmutableがなんなのかわからなかったので。

##意味
immutable：不可変
mutable：可変

##imuutableにする目的
- mutableだと変更されたくない値なども変更できるのでダメだ！
- immutableにしてオブジェクト全体の参照ではなく、オブジェクトの参照の複製をすること。
- そうすることで、値は変更されなくなって安全に値を使えるよ！
- あと、メモリの節約と実行速度が速くなるよ。

## まとめ
imuutableなクラスを作って、上手くオブジェクトを扱うようにしよう。

## 詳しく書いてくださっている記事様
https://medium.com/flutter-jp/immutable-d23bae5c29f8