OmniAICreator/Qiita-1.07M huggingface dataset:
homebrew でcaskがアップグレードできなかった話

### brew upgrade --cask が動かなかった

別にエラーが起きたわけでは無かったが、パッケージがアップグレードされていない。
macOSのキャッシュを消しても、`brew cleanup -s`をしても状況は変わらない。
`--cask`でインストールしたSlackやらDockerやらのバージョンが一向に上がらない。
`brew upgrade`は動いているのに。

### 原因調査
調べたらやはり同様の事態に直面している人はいた。英語で調べるの大事。

https://github.com/Homebrew/homebrew-cask/issues/48002

要はGUIを提供しているアプリではそのアプリ内からもアップデートが通知されるのでhomebrewでは`--cask`のバージョン管理はやらなやらないよ、って話。

確かにDockerとかもアップデートがhomebrewの外で通知される。
アップデートが競合して機能不全起こしたら目も当てられないしそりゃhomebrewもそうするか。

### 解決方法
とはいえこちらは全部homebrewで管理する気なのでこれでは困る。
そしたら解決策は公式でちゃんとアナウンスされていた。

https://github.com/Homebrew/homebrew-cask/blob/master/USAGE.md#updatingupgrading-casks

どうしても`--cask`で`upgarde`をしたい(homebrewでバージョン管理をしたければ)`--greedy`オプションをつけろとな。

てなわけで`--greedy`を追加してサクッと実行。

```
brew upgrade --cask --greedy
```

無事成功🍻

### 個別に更新する方法
ただしこの方法だと全部の`--cask`パッケージが強制的にアップグレードされてしまう。
意図して古いバージョンを使用パッケージが混ざっているときはそれでは困る。

そんなときはまず最新バージョンでないパッケージを探して個別で実行しなければ仕方がない。

まずは対象を確認。こちらもが`--greedy`オプションが必要。もちろんformulaならいらない。
```
brew outdated --cask --greedy
```

そしたらバージョン遅れのcaskパッケージとそのバージョンが取得できるので、アップグレードしたいパッケージ名をコピー。
そんでもって個別にあげよう。

```
brew upgrade (パッケージ名) --cask --greedy
```

### ちょっとめんどくさいやつ
Google日本語入力も`homebrew cask`でインストールしていたが、こちらはhomebrewではバージョンが常に`latest`で登録されている。

何が厄介かというとこの状態で`brew upgrade --cask --greedy`を実行すると実際には差分がなくとも常にGoogle日本語入力が更新（と言う名の再インストール）がされてしまう。

それだけならまだいいがこのプロセスが削除→インストールになっているためかIMEの設定からGoogle日本語入力が消えてしまう。
つまり毎回IMEにGoogle日本語入力を再登録してやらなければならない。

さすがに面倒くさいにも程があるのでGoogle日本語入力は仕方なく公式サイトからインストーラーで入れることにした。
AWS EC2がインターネット接続できない時の超凡ミス

## まずは以下のリンクを確認してください！
普通はこれで解決するはず！
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-connect-internet-gateway/
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Internet_Gateway.html
https://www.early2home.com/blog/it/aws/post-2397.html
https://qiita.com/blackpeach7/items/d481b96b2946a247f06b
https://open-groove.net/amazon-ec2/when-deny-outbound-access-from-ec2/


### そんな中、私がやった凡ミスはこちら、、、

##### 【DNS解決が「無効」になっている！！！】
VPCの詳細画面を開いで確認してみてください
ちなみにデフォルトでは「有効」になるはずなので、こんなミスをする輩はいないでしょう
（現に誰も投稿してなさそうです）
私が「DNSは後からEC2に構築するから無効にしてみようかな〜」って分からないまま無効にしてました
結果、yum updateが実行できない始末、、、
![aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2614417/9742768b-c497-d008-39cd-175502423120.png)
統計的推定と検定をPythonで解く「区間推定（正規母集団で母分散未知の場合）」

先日は、Pythonで「区間推定（正規母集団で母分散既知の場合）」を行いました。コード的には、stats.norm.interval 関数を用い母平均の信頼区間を求めるだけです。その引数として「信頼度：alpha」「標本平均：loc」「標準誤差：scale」を必要としました。基本は標準化得点$Z$について、<br>$P(−1.96≤Z≤1.96)=0.95$<br>が成り立つため、母分散の信頼区間を求めるために上手い具合に式を変形して求められるのでした。

前回の記事
[統計的推定と検定をPythonで解く「区間推定（正規母集団で母分散既知の場合）」](https://qiita.com/tan0ry0shiny/items/e4b04a508873e83c7fc6)

今回は、「区間推定（正規母集団で母分散未知の場合）」について解いていこうと思います。今回も「[とけたろうさんのチートシート](https://toketarou.com/cheatsheet/#toc16)」を使わせて頂きます。今回の問題も前回に引き続き電球の寿命を調べる問題になっています。全く同じ題材を少し変えて出して下さるので分かり易いと思います。

<h1>問題</h1>
【問題】あるメーカーの電球Aの寿命を調べるため，次のように無作為に５つの標本を取り出した。

1134，1253，1078，1190，1045（時間）

この電球Aの寿命のデータ全体（母集団）は正規分布に従うものとするとき，母平均 $\mu$ の信頼度 95％ の信頼区間を求めなさい。

<h1>解答</h1>
<h2>どういう問題か（問題の分類）</h2>
今回も、母平均の区間推定です。確率分布としては正規母集団で、母分散は未知です。

<h2>どのように解けるか（解法）</h2>
母分散 $\sigma^2$ が分かっている時は、95％ 信頼区間を考える時、標準正規分布を想定しました。今回は母分散 $\sigma^2$ が分かっていないので、$t$ 分布を想定し、推定量 $T$ を求めます。95% 信頼区間は推定量 $T$ を用いて次の様に表すことが出来ます。今回は自由度4の $t$ 分布なので、$t$ 分布表より上側 2.5％ 点は 2.776 となります。<br>
$P(-2.776\leq T\leq 2.776)=0.95$<br>
これは $P$ という事象は確率的にいろんな値 $T$ をとるが、$−2.776≤T≤2.776$ の範囲内では、95% 信頼区間に入る、という事だと理解しておきます。
では $T$ とは何かというと、次の式で求められます。<br>
$$T=\displaystyle \frac{\bar{X}-\mu}{SE}$$

$$SE=\displaystyle \frac{U}{\sqrt{n}}$$

$\bar{X}$：標本平均、$\mu$：母平均、$U$：不偏分散、不偏標準誤差：$SE$

ここで、不偏標準誤差は勝手にそれっぽく定義したので気を付けて下さい。ここはとけたろうさんの表現とは違います。意味は一緒のつもりなので、間違いがあったら教えて頂けると幸いです(´・ω・｀)
そもそも、なんで不偏標準誤差$SE$としたかというと、標準誤差 $SE$ をそのまま流用した物で間違いの元になるのですが、一時的に使用しています。
$P(-2.776\leq T\leq 2.776)=0.95$
に戻りますと、$T$の式を代入して式を変形します。
$P(-2.776\leq \displaystyle \frac{\bar{X}-\mu}{SE}\leq 2.776)=0.95$
$P(\bar{X}-2.776\times SE\leq \mu\leq \bar{X}+2.776\times SE)=0.95$
$SE=\displaystyle \frac{U}{\sqrt{n}}$ なので$U$を次のように求めます。
不偏分散の実現値 $U^2$ は、自由度が4なので
$U^2= \frac{(1134-1140)^2+(1253-1140)^2+(1078-1140)^2+(1190-1140)^2+(1045-1140)^2}{4}$
$=7043.5$
$U≒83.9$
これらを代入すると、母平均 $μ$ の信頼度 95％ の信頼区間は次のように求められます。<br>
$1036\leq \mu\leq 1224$

<h2>どのように解けるか（Python）</h2>

```Python
import numpy as np
from scipy import stats

data=np.array([1134,1253,1078,1190,1045])
barX=data.mean()
sample_mean = barX
sample_std = np.std(data,ddof=1)
n=len(data)
#区間推定
low, high = stats.t.interval(alpha=0.95, loc=sample_mean, scale=sample_std/np.sqrt(n), df=n-1)
```

母平均$\mu$の信頼度95％の信頼区間は
$1036\leq \mu\leq 1224$になります。

次に、このコードの解説をしていきます。前回は正規分布だったため、stats.norm.interval 関数を使いました。今回は $t$ 分布ですので stats.t.interval 関数なのですが、これを使うためには、「信頼度：alpha」「標本平均：loc」「不偏標準誤差：scale」「自由度：df」が必要になります。

<h1>感想</h1>

1. この記事を作ってみて
今回は、統計的推定の簡単な問題2です。前回の「統計的推定（正規母集団で母分散既知の場合）」でした。違いは「正規分布か$t$分布か」くらいだったと思います。私の表現の仕方に癖があり、受け入れられない方も多くいらっしゃると思いますが、そこは生暖かい目で見守って頂ければと思います。また、間違いの指摘やご意見などありましたら遠慮なく仰って下さい。

<h1>次の記事</h1>

[統計的推定と検定をPythonで解く「区間推定（一般母集団で大標本の場合）」(2022.4.11)](https://qiita.com/tan0ry0shiny/items/5fe9d090676669adaf9a)
CharlesでステータスコードのRewriteがうまくいかないとき

サーバがエラー系のステータスコードを返した場合の挙動を確認したいとき、[Charles Proxy](https://www.charlesproxy.com)の `Rewrite` という機能が便利です。

例えば以下のようなルールを書いておくと、レスポンスがステータスコード `422` で返ってくるようになります。

![スクリーンショット 2022-04-08 16.05.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25727/b8749a4b-4f97-cc7b-366c-6049418dcdcd.png)

...ところが、これだけではうまく `Rewrite` できない事象がおきました。
よくよくCharlesのログを見てみると、

```
Rewrite Tool: status change resuled in invalid status "422"
```

と表示されています。

![charles_ss2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25727/8e98d738-831a-6a86-7a84-2bf2d502fc47.png)

このようなときは、 `Rewrite` の値を `422 Unprocessable Entity` のように完全な形で記述すると解決できました。

![charles_ss1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25727/33b0f3b3-7246-91b4-86ae-13231509c549.png)

私の場合は開発中のアプリをAndroid Emulatorで動かした場合だけこの問題が起きたので、詳細な理由はわかっていません。同じような問題に当たった方への参考になればと思います。

参考: https://testerhome.com/topics/18251
Laraveのモデルの更新・更新【個人的なお勉強アウトプット】

## 参考図書
https://www.amazon.co.jp/dp/B07CLLW4MX/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

## モデルの更新
あらかじめどのモデルを更新するか指定し、モデルの内容を書き換えて保存する。
新規作成はnewでインスタンスを作成したのに対し、更新ではモデルのfindメソッドで更新するモデルを取得する。

```app/Http/Controllers/PersonController.php
public function edit(Request $request){
$person = Person::find($request->id);
return view('person.edit', ['form' => $person]);
}

public function update(Request $request){
$this->validate($request, Person::$rules);
$person = Person::find($request->id);
$form = $request->all();
unset($form['_token']);
$person->fill($form)->save();
return redirect('/person');
}
```

## モデルの削除
```app/Http/Controllers/PersonController.php
public function delete(Request $request){
$person = Person::find($request->id);
return view('person.del', ['form' => $person]);
}

public function remove(Request $request){
Person::find($request->id)->delete();
return redirect('/person');
}
```
削除したいモデルの対象をfindで検索してdeleteメソッドをよびだすだけ。
TypeScriptで手軽にCLIを実装する

GitHub Actions上で簡単なスクリプトを実行する機会があり、TypeScriptで書いてさくっと実行したいなと思いました。また、

- 開発時に毎回JavaScriptにトランスパイルするのはめんどくさい
- mainにマージする前はDry Runを実行したい

という背景から、TypeScriptのトランスパイルと実行を手軽にできる`ts-node`、 CLIのオプションなどを手軽に設定できる`commander`を使うことにしました。

記事で使っているコードはこちらのリポジトリに上げています。

https://github.com/kyntk/q-typescript-cli

## ts-nodeでTypeScriptの実行

https://github.com/TypeStrong/ts-node

typescript, ts-nodeをインストールします。

```bash
yarn add -D typescript ts-node
yarn tsc --init
```

まずはコンソールに出力するだけのスクリプトを実装します。

```ts:main.ts
const main = () => {
  console.log('Hello World')
}

main()
```

以下のコマンドを打つだけで、トランスパイルと実行が行われます

```bash
yarn ts-node main.ts
# -> Hello World
```

あとはmain.tsで実行したいスクリプトを実装するだけです。

```ts:main.ts
import { getUser } from './lib/api'

const main = () => {
  getUser()
}

main()
```

今回はAPIを叩く処理を実施します。

## オプションの設定

冒頭でも触れましたが、このスクリプトにオプションを渡して処理を分岐させたいと思います。

引数を受け取って判定をしてもいいのですが、`commander`というライブラリを使うとより手軽に便利に実装することができます。

https://github.com/tj/commander.js

```bash
yarn add commander
```

以下のようにオプションを定義して、対象のオプションの値を取得することができます。

```ts:main.ts
import { program } from 'commander'
import { getUser } from './lib/api'

const main = (dryRun: boolean) => {
  getUser(dryRun)
}

program.option('-d, --dry-run', 'dry run')
program.parse()
const options = program.opts()

main(options.dryRun)
```

上記のように実装することで、`-d`オプションをつけるとdryRunを実行することができます。

commanderは自動でhelpオプションも作成してくれる点も嬉しいです。

```bash
$ yarn ts-node main.ts -h
Usage: main [options]

Options:
  -d, --dry-run  dry run
  -h, --help     display help for command
```

これだけで好きなTypeScriptの実装を、気軽に実行することができました。

## 参考

- https://qiita.com/mangano-ito/items/75e65071c9c482ddc335
- https://github.com/TypeStrong/ts-node
- https://github.com/tj/commander.js
マークアップ言語

###### マークアップ言語
* テキストの中にマーク(タグ)を埋め込み、文書の構造などを示す言語
* 専用のエディタがなくても編集可能

###### SGML(Standard Generalized Markup Language)
* 電子商取引で利用するためにISOが標準化
* 独自タグを定義でき、文書構造などを示す

###### HTML
* SGMLをベースにしたWebページ用の言語

###### XML(Extensible Markup Language)
* SGMLをベースに簡略化して、Webで利用するために作られた言語



* 利用者が**独自タグ**を定義して、文書の**論理構造**を示すことができる
プログラミングノート（TypeScript①　設定と基本の型）

# はじめに
Udemyの[【世界で7万人が受講】Understanding TypeScript 日本語版](https://www.udemy.com/course/understanding-typescript-jp)を参考にTypeScriptを学習したので、プログラミングノート（カンペ用ノート）をします。

# 設定
## インストール
nodejs インストール
https://nodejs.org/ja/download/

TypeScriptインストール
https://www.typescriptlang.org

グローバルなツールとしてインストール
sudo npm install -g typescript

## 開発環境設定
package.jsonをインストール（依存関係などを定義する）
npm init 

開発用ツールとしてサーバを更新するツールをインストール
npm install --save-dev lite-server

package.jsonのscriptsに以下を追加して起動できるようにする
"start":"lite-server"

npm start で起動。

## TypeScryptのコンパイル
### 個別にコンパイル

tsc app.ts
これでJavaScriptファイルが作成される。
lite-serverによりJavaScriptの反映は即座にlocalhostに反映される

### 自動でコンパイル
tsc app.ts -w //watchモード。 保存すればすぐにコンパイル。

### プロジェクト内のTypeScriptファイルをコンパイル
tsc --init //ルートフォルダで実行。プロジェクトがTypeScriptであることを伝える。tsconfig.jsonが作成される。
tsc // プロジェクトのうちtscファイルを全てコンパイルする。

tsconfig.jsonでコンパイルに関する様々な設定が可能。



# 型
## コアな型
```
number:1,5.3,-10
string: ’Hi’ , ”Hi” , `Hi`
boolean: true, false
object: {age; 30}
```

## その他の型
### Array型
```ts
const person = {
    name : 'yota',
    age : 30,
    hobbies:['Sports','Cooking'] // Array型
};
```

### Tuple型
要素の数が決まった配列
```ts
const person: {
    name : string;
    age : number;
    hobbies: string[];
    role: [number, string];
}={
    name : 'yota',
    age : 30,
    hobbies:['Sports','Cooking'],
    role: [2, 'author']
};
```
### Enum
`
enum { NEW, OLD } // 列挙型
`

### union型（複数の型をマージする）
`let numberOrUndefined: number | undefined;`

### Alias型（Union型を再利用）
`type Combinable = number | string;`

### リテラル型（コアな型の中でさらに詳細に定義）
`type ConversionDescriptor = 'as-number' | 'as-text';`

### function型
`let combineValues: (a: number, b: number) => number;`

戻り値を特に設定しない場合はvoidとなる。
何かを返そうとするとundefinedとなる。
```ts
function sayHi(): void {
  // ...
}
```

### unknown型、　any型
```ts
let userInput: unknown;
// let UserInput : any // any型は型チェックをしないため、if文がなくてもエラーにならない。
let userName: string;

userInput = 5;
userInput = "Max";
// if (typeof userInput === "string") {　　//any型は型チェックをしないが、unknown型は型チェックが必要なのでこれがないとエラーになる
userName = userInput;
// }
```

### never型
戻り値を絶対に返さないことを明示的にする。TypeScriptの型推論ではvoid型になるが、neverを使うことで明示的にできる。

```ts
function generateError(message: string, code: number): never {
  throw { message: message, errorCode: code };
}

const result = generateError("エラーが発生しました", 500);
console.log(result);
```

# 構文
forで一個ずつ取り出し
```ts
for (const hobby of person.hobbies){
    console.log(hobby)
}
```

# 関数

## callback関数
```ts
unction addAndHandle(n1: number, n2: number, cb: (num: number) => void) {
  const result = n1 + n2;
  cb(result);
}

// callback関数resultをconsoleに出力
addAndHandle(10, 20, (result) => {
  console.log(result);
});
```
Visual Studio CodeでJavaの実行環境の追加とデフォルトの設定

Visual StudioでJavaの開発環境を作成する際に、Javaの実行環境を追加したり、どれをデフォルトとして使うのかを設定する方法を確認しました。

settings.jsonに`java.configuration.runtimes`に配列で複数のJavaの実行環境を`name`、`path`を指定して設定できます。
更にデフォルトで使うものは`"default": true`を指定することが可能です。

```
    "java.configuration.runtimes": [
        {
          "name": "JavaSE-1.8",
          "path": "/Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home",
          "default": true
        }
    ],
```

## 思ったこと。
ある時、ビルドはできるけど、Visual Studio Code上でのユニットテストがエラーを吐くようになった。
おそらくOSに新しいJVMを入れたからだと思う。

ビルドはターミナルでgradleでやっていて、そちらはSDKMANで切り替えているので問題なかったのだろう。

たまにしかVisual Studio CodeでJavaを触らないから、ちょいちょいハマるなー。
Laravelのモデルの新規保存【個人的なお勉強アウトプット】

## 参考図書
https://www.amazon.co.jp/dp/B07CLLW4MX/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

Eloquentでは、レコードはモデルのインスタンスとして扱われる。ということは、新たにレコードを作成したい場合は、モデルのインスタンスを作成し、保存するというやり方になる。
以下の手順。

1.モデルのインスタンスを作成する
newをつかって作成できる

2.値を設定する
インスタンスのプロパティに値を設定する。
ひとつひとつのプロパティに値を代入してもよいし、値を設定するメソッド`fill()`を利用するやり方もある。

3.インスタンスを保存する
モデルクラスには保存のためのsaveメソッドがある。これを呼び出すとインスタンスの内容がテーブルのレコードとしてデータベース側に保存される。

```app/Models/Person.php
class Person extends Model{
protected $guarded = array('id');

public static $rules = array(
'name' => 'required',
'mail' => 'email',
'age' => 'integer|min:0|max:150'
);

public function getData(){
return $this->id . ': ' . $this->name . '(' . $this->age . ')';
}
}
```
バリデーションのルールはモデルに容易しておいたほうが便利。
`$guarded`プロパティは入力のガード（保護）を設定しておくもの。例えばフォームから送信した値を元にインスタンスをつくり、保存する場合、モデルでは基本的に必要となるすべての項目に値が揃っていて初めて保存できる。だが時には値を用意しておかない項目も存在する。このようなときに用いれられるのが`$guarded`。
例えばプライマリーキーであるidフィールドはデータベース側で自動的に番号を振るので、モデルを作成する際には値は必要ない。

```app/Http/Controllers/PersonController.php
public function add(Request $request){
return view('person.add');
}

public function create(Request $request){
$this->validate($request, Person::rules);
$person = new Person;
$form = $request->all();
unset($form['_token']);
$person->fill($form)->save;
return redirect('/person');
}
```
■バリデーションの実行
`$this->validate($request, Person::$rules);`
バリデーションは`$request`そのものを引数に指定すれば、そこにあるさまざまな値をチェックできる。モデルにルールなどを保管しておけば、上記の第二引数のように、必要に応じて使える。

■Personインスタンスの作成
`$person = new Person;`
バリデーションを通過した保存作業。まず、Personインスタンスをnewで作成。

■値を用意
`$form = $request->all();`
`unset($form['_token'])`
保存する値を用意、送信されたフォームの値を使う。
ただし、フォームに追加される非表示フィールド「_token」だけはunsetで削除。

■インスタンスに値を設定して保存
`$person->fill($form)->sace()`
フォームの値がまとめられた`$form`を引数にしてfillメソッドを呼び出す。fillは引数に用意されている配列の値をモデルのプロパティに代入するもの。まとまった値がある場合は、fillを使うことで個々のプロパティをまとめて設定できる。
値が設定されたらsaveを呼び出してインスタンすを保存する。
下記のように一つ一つの値をインスタンスに設定していってもOK.
```
$person = new Person;
$person->name = $request->name;
$person->mail = $request->mail;
$person->age = $request->age;
$person->save();
```
【抄訳】Azure Cosmos DB TLS証明書の今後の変更

みなさんごきげんよう。Microsoft App Innovation チームです。今回は 3 月 21 日に投稿された Microsoft Developer Blogs より、「Upcoming changes to Azure Cosmos DB TLS certificates」の抄訳をお届けします。

https://devblogs.microsoft.com/cosmosdb/tls-certificates-changes/?Dev_QT=PET3035062

2022 年 7 月から、Azure Cosmos DB TLS サーバー証明書のルートと認証局（ CA ）が新しくなります。

**Azure Cosmos DB サービスのルート証明チェーンが DigiCert Global Root G2 になり、TLS サーバー証明書が新しい ICA によって発行されます。**

ほとんどの Azure Cosmos DB のお客様は影響を受けないと予想されますが、受け入れ可能な CA のリストを明示的に指定すると、アプリケーションに影響が及ぶ可能性があります（「証明書ピンニング」と呼ばれる方法）。この変更は、Azure のパブリック クラウドと Azure Government に限定されています。Azure ソブリンクラウド製品に変更はありません。 

クライアントアプリケーションのいずれかがルート CA Baltimore Cyber Trust Root 、または以下にリストされている現在の中間 CA に固定されている場合は、Azure Cosmos DB アカウントへの接続の中断を防ぐためにアクションを実行する必要があります。

## クライアントアプリケーションが影響を受けているかどうかの確認方法

ソースコードで、ルート CA または中間 CA のサムプリント、共通名、およびその他の証明書のプロパティを検索します。

- ルート CA：Baltimore Cyber Trust ルート CA（サムプリント：d4de20d05e66fc53fe1a50882c78db2852cae474）
- 中間 CA：Microsoft RSA TLS CA 01（サムプリント：703d7a8f0ebf55aaa59f98eaf4a206004eb2516a）
- 中間 CA：Microsoft RSA TLS CA 02（サムプリント：b0c2d2d13cdd56cdaa6ab6e2c04440be4a429c75）

これらが一致する場合、アプリケーションが影響を受けます。 

## 必要なアクション

1.中断せずに変更作業を行うためには、Baltimore に加えて、クライアントアプリケーションまたはデバイスが [DigiCert Global Root G2 CA(英語)](https://www.digicert.com/kb/digicert-root-certificates.htm?Dev_QT=PET3035062)（サムプリント：df3c24f9bfd666761b268073fe06d1cc8d4f82a4）を信頼することをお勧めします。中間証明書は、ルート CA よりも頻繁に変更されることが予想されます。証明書のピンニングは、ロールの頻度が少ない場合にのみ行うようにしましょう。

2.混乱を防止として、下記ルートの追加もお勧めです。

- [DigiCert Global Root G3 (英語)](https://www.digicert.com/kb/digicert-root-certificates.htm?Dev_QT=PET3035062) (サムプリント: 7e04de896a3e666d00e687d33ffad93be83d349e) 
- [Microsoft RSA Root Certificate Authority 2017](https://www.microsoft.com/pkiops/certs/Microsoft%20RSA%20Root%20Certificate%20Authority%202017.crt?Dev_QT=PET3035062)(サムプリント: 73a5e64a3bff8316ff0edccc618a906e4eae4d74) 
- [Microsoft ECC Root Certificate Authority 2017](https://www.microsoft.com/pkiops/certs/Microsoft%20ECC%20Root%20Certificate%20Authority%202017.crt?Dev_QT=PET3035062)(サムプリント: 999a64c37ff47d9fab95f14769891460eec4c3c5) 

## もっと詳しく知る 

この変更は、すべての Azure サービスに影響します。特定のサービスの詳細については、ドキュメントをお読みください。

https://docs.microsoft.com/ja-jp/azure/security/fundamentals/tls-certificate-changes?Dev_QT=PET3035062
NavigationBarのBackbarButtonItemをカスタムする!!

# はじめに

画面遷移した際のNavigationBarのBackボタン、デフォルトだと＜ Backという文字が入っていますが、この文字をカスタム出来る事を知りましたので、紹介します。
尚、以下のアドレスのAppにコードを追記していきたいと思います。
https://qiita.com/masasumi0327/items/fe285b606ea99a3026ba
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/13729325-f128-3d81-e58b-957889375895.png" width=40%>

### 1.Backの文字を消したい！
コードを記述します。
```swift:ViewController
import UIKit

class ViewController: UIViewController {
    @IBAction func toSecondViewButton(_ sender: Any) {
        let secondVC = storyboard?.instantiateViewController(identifier: "secondView") as! SecondViewController
        navigationController?.pushViewController(secondVC,animated: true)
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let backBarButtonItem = UIBarButtonItem()
        backBarButtonItem.title = ""//SecondViewControllerのNavigationItemの文字列変換
        self.navigationItem.backBarButtonItem = backBarButtonItem
    }
}
```
ポイントは遷移前のViewControllerにコードを記述して下さい。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/c2801a8b-e270-0feb-5d52-f4a110c96517.png" width=40%>
はい!消えましたね!
### 2.カスタムいろいろ
UIImage等も設定出来ますのでコードを記述していきます。
```swift:SecondViewController
import UIKit

class SecondViewController: UIViewController {
    
    @IBAction func toThirdViewButton(_ sender: Any) {
        let thirdVC = storyboard?.instantiateViewController(identifier: "thirdView") as! ThirdViewController
        navigationController?.pushViewController(thirdVC,animated: true)
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        //backBarButtonの設定
        let backBarButtonItem = UIBarButtonItem(image:UIImage(systemName: "arrowshape.turn.up.backward.fill"), style: .done, target: self, action: #selector(toSecondView))
        
        self.navigationItem.backBarButtonItem = backBarButtonItem
        backBarButtonItem.tintColor = UIColor.systemRed
    }
    @objc func toSecondView() {
        self.navigationController?.popViewController(animated: true)
    }
}
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/ec19b75a-3dbf-1bf6-5f17-8f9098872e43.png" width=40%>

こんな感じで設定出来ました!!

以上になります。
PycordでSlashcommandのファイル分割の仕方

> 公式のExampleにCommandGroupについての記述があったので追記

## やりたいこと

DiscordのBotを作っていると思い付きでコマンドを追加したくなってくることが多々あります。（N=1的な感想）
そうなってくると1つのpythonファイルの中にコマンドを追加していくと死ぬほど読みづらくなってしまいます。

なので、コマンドごとにファイル分割をしようって感じのはなしです。

#### 前提環境

- Python    3.10.4
- py-cord   2.0.0b5


## Cogを利用したファイルコマンド読み込み

**Bot commands framework**の**Cogs**を利用することができます。

https://docs.pycord.dev/en/master/ext/commands/cogs.html

従来のprefixを定義して利用するBOTだと以下の記事のような方法です。

https://qiita.com/sizumita/items/c58170b72790df8ba417

このままだとSlashcommandでは利用できないので、以下の動画を参考にして変更をしました。

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

ディレクトリ構成は以下のような感じです。
```
.
┣━ main.py
┗━ Cogs
   ┗ sub.py
```

以下のような記述で実行できます。

```py:main.py
from discord.ext import commands
bot = commands.Bot()


@bot.event
async def on_ready():
    print('Ready!')

bot.load_extension('Cogs.sub')

bot.run('token')
```

```py:sub.py
import discord
from discord.ext import commands
from discord.commands import slash_command # 追加

guild_ids = [00000000000000] # guild id


class Example(commands.Cog):
    def __init__(self, bot):
        self.bot = bot

    @slash_command(guild_ids=guild_ids) # 変更
    async def hi(
            self,
            ctx: discord.ApplicationContext):
        await ctx.respond('hi!')

def setup(bot):
    bot.add_cog(Example(bot))
```

## CommandGroupの設定

Cog内でCommandGroup定義する方法が公式Exampleに普通に乗っていたので、そちらも紹介します。

https://github.com/Pycord-Development/pycord/blob/master/examples/app_commands/slash_cog_groups.py


ディレクトリ構成などは一緒でほんのすこしの変更があるだけです。

```py:main.py
from discord.ext import commands

# debug_guildsを引数に入れればコマンド毎にguild_idsを渡す必要ないそうです
bot = commands.Bot(debug_guilds=[...])


@bot.event
async def on_ready():
    print('Ready!')

bot.load_extension('Cogs.sub')

bot.run('token')
```

```py:sub.py
import discord
from discord.ext import commands
from discord.commands import SlashCommandGroup


class Example(commands.Cog):
    def __init__(self, bot):
        self.bot = bot

    # コマンドグループを定義
    greetings = SlashCommandGroup('greetings', 'Various greeting from cogs!')

    # コマンドグループのデコレータを使用する
    @greetings.command()
    async def hi(
            self,
            ctx: discord.ApplicationContext):
        await ctx.respond('hi!')

def setup(bot):
    bot.add_cog(Example(bot))
```

class変数として`SlashCommandGroup`のインスタンスを生成してデコレータとして利用するだけなので実装も簡単です。

公式Exampleの書き方として`main.py`の中でBOTのインスタンス生成をする時に
`bot = commands.Bot(debug_guilds=[...])`と記述するとコマンドごとに毎回入れてた`guild_ids`が不要になるっていうことに気づけてよかったです。

基本的に非公開のBOTはコレで良さそうですね。
AWSのIAM【個人的なお勉強アウトプット】

## 参考図書
https://www.amazon.co.jp/%E5%9B%B3%E8%A7%A3%E5%8D%B3%E6%88%A6%E5%8A%9B-Amazon-Web-Services%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF%E3%81%A8%E6%8A%80%E8%A1%93%E3%81%8C%E3%81%93%E3%82%8C1%E5%86%8A%E3%81%A7%E3%81%97%E3%81%A3%E3%81%8B%E3%82%8A%E3%82%8F%E3%81%8B%E3%82%8B%E6%95%99%E7%A7%91%E6%9B%B8-%E5%B0%8F%E7%AC%A0%E5%8E%9F/dp/4297108895/ref=asc_df_4297108895/?tag=jpgo-22&linkCode=df0&hvadid=342458612368&hvpos=&hvnetw=g&hvrand=4074056018199486930&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009227&hvtargid=pla-1031061044592&psc=1&th=1&psc=1

AWS IAMとはIdentity and Access Managementの略でAWSにおける認証機能。
つまり、IDとアクセスの管理。
AWSアカウントは契約を管理するのもので別。
人に対して与えるIAMをIAMユーザー。サービスやプログラムなどに当てるものをIAMロールという。
IAMはMultiFactor Authencation（他要素認証）を使用したほうがよい。

## IAMとIAMポリシー
AWSでは複数のEC2インスタンスやS3バケットを使うケースがある。そのひとつひとつのサービスに対してメンバーひとりひとりに権限を設定していくのは大変。IAMグループとして、グループ化できる。
IAMポリシーは、実行者（ユーザー、ロール、グループ）が、どのサービスにアクセスできるのかを設定する機能。実行者が何をできるのかを個別に設定するのではなく、ポリシーを適応するかたちで設定する。
そのため、権限の設定を変えたい場合、ポリシーを変更、付け替えするだけで結びつくユーザーやロールの設定を変更できる。

## IAMポリシーで設定できること
何に対して、どのような操作を許可するかしないかを設定できる。
実行者（ユーザー、ロール、グループ）が何をできるか、も設定できるし、操作される側（サーバーやフォルダなど）に対して何を許可できるかの設定もできる。
前者をアイデンティティのポリシー、後者をリソースベースのポリシーという。
IAMポリシーはオリジナルでも設定できるが、設定する項目が多くミスが発生しやすい。
なのでAWS管理ポリシーに容易されているものを使うほうが多い。
RDSが遅いと感じたら

わりと常識かも知れないが、RDSを使っていてconnectやクエリが徐々に重くなって来た場合は、
サーバスペックを上げるよりもストレージ容量を増やすほうが効果的

(汎用SSDを使っている場合、ストレージ容量がそのままIOPS性能に響くため)

推奨は100GiB以上

ただしデフォルト20GiBの時よりも800円/月くらい高くなるので個人でやってる場合は注意が必要
SNR・CNRの違い（途中）

# はじめに

通信工学に触れると必ず出てくるSNR，CNRの違い（および相互関係）をまとめました．

# (前準備)ベースバンド帯と搬送波帯

無線通信では，ディジタル値が1)ベースバンド信号に変換され，2)搬送波信号と乗積されて変調波となります．1)と2)の信号を周波数の側面で

- 1)の信号：ベースバンド帯
- 2)の信号：搬送波帯

と区別します．実は，SNR，CNRは周波数帯に応じて定義されます．したがって，ベースバンド帯や搬送波帯の理解が必要になるため，それらの概要をまとめます．

以下の図は，最も基本的なディジタル通信における送信側の様子を示します．以降，同図を用いてベースバンド帯と搬送波帯の信号表現をまとめます．ディジタル変調方式には，ASK，PSK，FSK等がありますが，本記事ではPSK変調方式を採用します．

![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290566/1255f068-98dd-5f02-4aa5-902c9c7c4c06.jpeg)


## 信号表現(主に式の変形)

PSK変調波$s(t)$を次のように表現します．

```math
\begin{align}
s(t)
 &= A \cos[2\pi f_c t + \phi_m(t)]  \\
 &= A\cos \phi_m(t) \cos(2\pi f_c t) - A \sin \phi_m(t) \sin(2\pi f_c t) \tag{1} \\
\end{align}
```

ここに，$\phi_m(t)$は**ディジタル値に応じて設定される位相**です（例えば，PSKの中でもBPSKなら，データ0には$\phi_m(t)=0$，データ1には$\phi_m(t)=\pi$）．また，$A$は信号振幅で，$f_c$は搬送波周波数です．上の式を分かりやすくするために，次のような信号$z(t)$を定義します．

```math
\begin{align}
z(t)
&= A \exp[j \phi_m(t)] \\
&= A \cos\phi_m(t) + j A \sin\phi_m(t) \\
&= Re[z(t)] + Im[z(t)] \tag{2}
\end{align}
```

但し，$Re[z(t)]$と$Im[z(t)]$は次のように与えられますね．

```math
\begin{equation}
\begin{cases}
Re[z(t)] &= A \cos\phi_m(t) \\
Im[z(t)] &= A \sin\phi_m(t)
\end{cases}
\end{equation}
```

これを用いると式(1)は次のように書き換えられます．

```math
\begin{align}
s(t)
 &= A \cos[2\pi f_c t + \phi_m(t)]  \tag{1}\\
 &= A\cos \phi_m(t) \cos(2\pi f_c t) - A \sin \phi_m(t) \sin(2\pi f_c t) \\
 &= Re[z(t)] \cos(2\pi f_c t) - Im[z(t)] \sin(2\pi f_c t) \tag{変形1}
\end{align}
```

## 信号の意味

以上で材料が出そろいました．

```math
\begin{equation}
\begin{cases}
z(t) = A \exp[j \phi_m(t)]  &(再掲2) \\
s(t) = Re[z(t)] \cos(2\pi f_c t) - Im[z(t)] \sin(2\pi f_c t) &(再掲1)
\end{cases}
\end{equation}
```

■ ベースバンド信号
前述のように，PSK変調では，01のディジタルデータと変調波$s(t)$は位相$\phi_m(t)$により対応付けられます．再掲した式(1)と(2)を眺めると，実質的に$\phi_m(t)$を含むのは$z(t)$です．すなわち，**$z(t)$は実質的にディジタルデータが乗った信号**です．このような信号$z(t)$を**ベースバンド信号**といいます．

(補足) ディジタルデータとベースバンド信号$z(t)$の対応関係を視覚的に表したものを**信号点ダイヤグラム**といいます．**ディジタルデータを信号点ダイヤグラムに配置することをマッピング**と呼びます．以下のその例を示します．式(2)の実部をIチャネルと呼び，虚部をQチャネルと呼びます．

![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290566/d3e2c153-0a79-20a6-9d70-59d5107486ee.jpeg)



■搬送波帯信号
一方で，式(1)は変形前の形から分かるように，搬送波周波数$f_c$を含んだ形です．この信号が実際に空間を伝搬していきます．その意味で，変調波の式$s(t)$を**搬送波帯信号**と呼びます．以下の式を観察すると，

- ベースバンド成分の実部$Re[z(t)]=\cos\phi_m(t)$には$\cos(2\pi f_c t)$の搬送波
- ベースバンド成分の虚部$Im[z(t)]=\sin\phi_m(t)$には$\sin(2 \pi f_c t)$の搬送波

が乗積されています．

```math
\begin{align}
s(t)
 &= A \cos[2\pi f_c t + \phi_m(t)]  \tag{1}\\
 &= A\cos \phi_m(t) \cos(2\pi f_c t) - A \sin \phi_m(t) \sin(2\pi f_c t) \\
 &= Re[z(t)] \cos(2\pi f_c t) - Im[z(t)] \sin(2\pi f_c t) \tag{変形1}
\end{align}
```

(蛇足) $\cos(\cdot)$には$\cos(\cdot)$が，$\sin(\cdot)$には$\sin(\cdot)$が対応しています．前者の$\cos(\cdot)$**同士は同じ位相を持つので同相成分と呼び，英語ではIn-Phase**と呼びます．これがIチャネルとよぶ理由です．一方，$\sin(\cdot)$**は$\cos(\cdot)$に対して位相が直交しているので，直交成分（Quadrature）**と呼び，Qチャネルの由縁です．






## ベースバンド信号と搬送波帯信号の比較

前述のように，SNR，CNR0は周波数帯に応じて定義されます．ベースバンド帯信号と搬送波帯信号を周波数の側面で観察します．以下の図は，ベースバンド帯信号と搬送波信号のI軸($Re[\cdot]$)成分の時間波形と周波数波形です．これらの図から分かるように，ベースバンド帯では中心周波数が0 Hzで，搬送波帯では中心周波数が$f_c$ Hzとなっていますね．

![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290566/734e2277-4220-0326-e7e1-6a7496333621.jpeg)
サーバーの仮想化とは【個人的なお勉強アウトプット】

## 参考図書
https://www.amazon.co.jp/%E5%9B%B3%E8%A7%A3%E5%8D%B3%E6%88%A6%E5%8A%9B-Amazon-Web-Services%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF%E3%81%A8%E6%8A%80%E8%A1%93%E3%81%8C%E3%81%93%E3%82%8C1%E5%86%8A%E3%81%A7%E3%81%97%E3%81%A3%E3%81%8B%E3%82%8A%E3%82%8F%E3%81%8B%E3%82%8B%E6%95%99%E7%A7%91%E6%9B%B8-%E5%B0%8F%E7%AC%A0%E5%8E%9F/dp/4297108895/ref=asc_df_4297108895/?tag=jpgo-22&linkCode=df0&hvadid=342458612368&hvpos=&hvnetw=g&hvrand=4074056018199486930&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009227&hvtargid=pla-1031061044592&psc=1&th=1&psc=1

コンピューターが動くときは物理的なメモリやハードディスクやOSなど、さまざまな部品が必要。
それらをソフトウェアで置き換えるのが仮想化技術。
一つの物理サーバー上に、複数の子となるサーバーを仮想的に作成する。
仮想化によって複製も容易にしている。
C＃を使用してExcelセルにテキストと画像のコメントを追加する方法

注釈とは、テキスト注釈と画像注釈の2種類があり、常にレポートとかに応用され、読者にデータをよりよく理解させるために、役立つ追加情報を注釈を付けるという形式で使用されています。では、注釈を追加する方法といえば？ Microsoft Excelには、コメントを挿入する組み込み関数が用意されているため、セルにコメントを簡単に追加できます。非常にちょろい方法ですからここは紹介しません。この記事の主な目的は、C＃プログラミングを使用してこの機能を実現する方法を紹介することです。そのために、ここは無料のコンポーネントFree Spire.XLSを使用しよう。これは独立した.NET Excelコンポーネントであり、実行するのにMicrosoft Officeに依存せず、操作するのも簡単です。

## 下準備
1.無料のSpire.XLSをダウンロードしてインストールします
2. C＃コンソールプロジェクトを作成し、Spire.XLS.dllへの参照を追加します
## コード一覧
以下の名前空間を使用する：
```
using System.Drawing;
using Spire.Xls;
```
ステップ１、Excelドキュメントをロードする
```
Workbook workbook = new Workbook();
Worksheet sheet = workbook.Worksheets[0];
```
ステップ２、テキスト注釈を追加する
```
ExcelFont font1 = workbook.CreateFont();
font1.FontName = "Calibri";
font1.Color = Color.Firebrick;
font1.IsBold = true;
sheet.Range["C6"].Comment.RichText.Text = "evanece@hotmail.com";
sheet.Range["C6"].Comment.Width = 200;
sheet.Range["C6"].Comment.Height = 50;
sheet.Range["C6"].Comment.RichText.SetFont(0, 18, font1);
```
ステップ３、画像注釈を追加する
```
Image image = Image.FromFile(@"C:\Users\Administrator\Desktop\Logo.png");
sheet.Range["E6"].Comment.Fill.CustomPicture(image, "Logo.png");
sheet.Range["E6"].Comment.Height = image.Height;
sheet.Range["E6"].Comment.Width = image.Width;
```
ステップ４、ドキュメントを保存する
```
workbook.SaveToFile("result.xls", ExcelVersion.Version97to2003);
```
## 追加した結果：
テキストコメント：
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/376092fb-910f-65c4-f608-dc5fc1a70b9d.png)

画像コメント：
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/a81f7b5c-ed36-6dd5-a2e7-039c7e3638bf.png)

## 完全なるコード
```
using System.Drawing;
using Spire.Xls;

namespace ExcelComment
{
    class Program
    {
        static void Main(string[] args)
        {
            Workbook workbook = new Workbook();
            Worksheet sheet = workbook.Worksheets[0];

            ExcelFont font1 = workbook.CreateFont();
            font1.FontName = "Calibri";
            font1.Color = Color.Firebrick;
            font1.IsBold = true;
            sheet.Range["C6"].Comment.RichText.Text = "123@yahoo.com";
            sheet.Range["C6"].Comment.Width = 200;
            sheet.Range["C6"].Comment.Height = 50;
            sheet.Range["C6"].Comment.RichText.SetFont(0, 18, font1);

            Image image = Image.FromFile(@"C:\Users\Administrator\Desktop\Logo.png");
            sheet.Range["E6"].Comment.Fill.CustomPicture(image, "Logo.png");
            sheet.Range["E6"].Comment.Height = image.Height;
            sheet.Range["E6"].Comment.Width = image.Width;

            workbook.SaveToFile("result.xls", ExcelVersion.Version97to2003);
        }
    }
}
```
今回のExcelセルにテキストと画像のコメントを追加する方法は以上でした、最後まで読んでいただきありがとうございました。
laravel apiでsessionを利用する【健忘録】

apiでsession情報を取得しようとしたら
取得できなかった。

apiじゃなかった場合は取得できているのになぜだ、、


apiでsessionを使うには$middlewareGroupsにセッションに関するミドルウェアをいれてあげないといけませんでした。

```app > Http > Kernel.php
protected $middlewareGroups = [

    'api' => [
       //ここから
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        //ここまで
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'throttle:60,1',
    ],
];
```

それぞれが何をしているかまでは掘っていませんが
webと同じように設定する必要がありました。

```app > Providers > RouteServiceProvider.php
protected function mapApiRoutes()
{
    Route::prefix('api')
        ->middleware('api')
        ->namespace($this->namespace)
        ->group(base_path('routes/api.php'));
}
```
gitlabをリバースプロキシ下で運用する場合のURL問題の解決

# はじめに
個人でgitサーバを運用していたのですがリポジトリ作成をするためにコンソールアクセスしたり，そもそもリポジトリの場所忘れたりしちゃうので思い切ってgitlabを運用しようとした際に，かれこれ1か月(実時間1週間くらい？)くらい悪戦苦闘したので自分の中で納得行くとこまでいけた今，一種の手順をまとめておこう！という趣旨の記事です．

# 解説しないこと
- gitlabの入れ方(入れ方は公式や有志の記事がいっぱいある)
- nginxの入れ方(同上)
# 事前環境
- サーバソフトはすべてnginx
- リバースプロキシはRTX1200(YAMAHAのL3スイッチです)下でNAPTを介してグローバルIPで待ち受けている
- 外と直接つながっているのはリバースプロキシのみ
- ドメインはすべてこのリバースプロキシを指している
- SSL認証はリバースプロキシどまり(内部はhttp)
- git, nextcloud, web用とそれぞれのサーバがリバースプロキシを稼働させているPCで稼働している．
- gitlabへのドメインは仮に記事中では，`domain.com`とする

# gitlab目標環境
- gitlabで動かすnginxはgitlab内包のものを使う
- リバースプロキシはaptでインストールしたnginx
-  gitlabにはドメインで外部からちゃんとアクセスできる
-  forkURLとかcloneURLとかちゃんとドメインURLになるようにする
-  あとはデフォルト

## 問題
### リバースプロキシ配下で運用することについて
リバースプロキシ下でのgitlab運用方法を調べると，よく`gitlab.rb`の`external_url`をFQDN,すなわち`domain.com`にする．とあるがこれでは内包されたnginxの`server_name`が`external_url`で指定したドメインで待ち受けることになってしまい自分の環境では不可能だった
．  
ただ，これだけで言えば`external_url`の値をローカルIPにでもしてしまえば一応は繋がるようになる．が，後述するが`external_url`に設定した値はForkする際やコミット後のページ遷移時に利用されるため，ここをローカルIPにすると外部の人間が触れなくなってしまう．

## 解決法
今回取った解決法が以下
1. いったんは`gitlab.rb`にて`external_url`を`domain.com`にしてしまう．
2. ターミナル上で，`gitlab-ctl reconfigure`して構成．
3. 構成後に，***直接***gitlabが利用しているnginxのconfファイルを弄って`server_name`をローカルIPに変えてしまう

いわれてみれば...という内容ではあるが，３で設定した内容は`gitlab-ctl reconfigure`するたびにクリーンアップされてしまうため，仮にgitlabに構成変更があった場合は３を毎回行わなければならないという手間がある．   
が，
- reconfigureは明確にユーザが意思を持って行っている
- reconfigureはそう頻繁には行わない  
ので今回は問題なしと判断しました．ただしupt upgradeで発生する場合あり．しっかりログでreconfigureしているのがわかるので今回はスルー．

# 手順

### gitlab.rbの編集
/etc/gitlab/gitlab.rbを編集する．
```
32行目: external_url `domain.com`
```

### 再構成
ターミナル上で，
```
gitlab-ctl reconfigure
```
### gitlab-http.confの編集
/var/opt/gitlab/nginx/conf/gitlab-http.confを編集する．
```
35行目: listen *:your port;
38行目: server_name your localIP:your port;
例:
listen *:11111;
server_name  192.168.23.2:11111;
```

### gitlab再起動
ターミナル上で，
```
gitlab-ctl restart
```

### proxyサーバの設定
リダイレクトなどで，gitlab-http.confで設定したserver_nameに飛ばせばおｋ．
```
 upstream test {
  2   server 192.168.23.2:111111 fail_timeout=0;
  3 }
 
 11 server {
 12   listen 443 ssl;
 13   server_name domain.com;
 14   server_tokens off;
 15
 16   client_max_body_size 10g;
 17
 18   access_log /var/log/nginx/gitlab_access.log;
 19   error_log  /var/log/nginx/gitlab_error.log;
 20
 #############
 #
 #SSLの証明書の場所とか...
 #
 #############
 26   location / {
 27     gzip off;
 28
 29     proxy_read_timeout     300;
 30     proxy_connect_timeout  300;
 31     proxy_redirect         off;
 32
 33     proxy_set_header  Host              $http_host;
 34     proxy_set_header  X-Real-IP         $remote_addr;
 35     proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
 36     proxy_set_header  X-Forwarded-Proto https;
 37     proxy_set_header  X-Frame-Options   SAMEORIGIN;
 38                                                                                                                                         
 39     proxy_pass  http://test;
 40 }
 41 }
 
```
### おわりに
この方法の場合，apt upgradeなどでgitlabの更新が入った場合，自動でreconfigureが走るため，都度上記手順が必要．
.NET学習記録2(ポーカー)

表題の通りポーカーを作ってみました
いやぁ～大変だった…
ダウンロードは以下リンクからどうぞ
https://ux.getuploader.com/pokergameAmericanStyle/download/2

.NETを使った制作は楽しいけど単純なゲームでさえ一からデザインして作るのは大変だな、と痛感する限り…
まだまだ修行が足りませんね
【Flutter × Firebase】簡単に,ログイン・新規登録のエラーをUIに反映させる方法

# はじめに
今回は、`flutter`と`firebase`の`Authentication`を使ってログインや新規登録のエラー分を実際にアプリのUIに反映させる処理をやっていきたいと思います。
# 完成画面（イメージ）
![スクリーンショット 2022-04-08 11.33.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567243/e7e99ac6-dd51-766c-59fd-8938dae481a4.png)
このようによく見るようなログインエラーが実装できました。
やっていきましょう。

# 前提.firebase_authからのエラーをキャッチする方法
まずはfirebase_authからのエラーを受け取って使えるようにする必要があります。
この方法については[こちら](https://qiita.com/mqkotoo/items/b6b1a7d3be010f31a193)をご覧ください。
# ステップ1.エラーメッセージを格納する変数を用意する
```dart:login.dart
class LoginXXX extends State<LoginXXX> {
      String errorMessage = ''; //この行を追加

```
# ステップ2.ログイン処理を行う関数を作る
```dart:login.dart

      String errorMessage = '';
                    .
                    .
                    .
Future<void> loginUserFromEmail() async {   

    try {
      // newUserに値を入れる
      final newUser = await FirebaseAuth.instance.signInWithEmailAndPassword(  //ログインの実装
          email: email, password: password);

      // ユーザが確認できたら
      if (newUser != null) {

        // ログインが成功したら、次のページに遷移する
         Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => XXXページ()),
         );
        print("ログインに成功しました");
      }
    } on FirebaseAuthException catch (e) {  //エラーメッセージに応じてエラー文をerrorMessageに格納する
      if (e.code == 'user-disabled') {
        errorMessage = 'そのメールアドレスは利用できません';
      } else if (e.code == 'invalid-email') {
        errorMessage = 'メールアドレスのフォーマットが正しくありません';
      } else if (e.code == 'user-not-found') {
        errorMessage = 'ユーザーが見つかりません';
      } else if (e.code == 'wrong-password') {
        errorMessage = 'パスワードが違います';
      }
    }
  }

```
# ステップ3.ログインボタンを押した時にステップ2の関数を呼ぶ
```dart:login.dart
//ログインボタンを押したときの処理
     onPressed: () {
          loginUserFromEmail(); //ログインを行う関数を呼ぶ
        },
```
# ステップ4.エラーメッセージをUIに反映させる
```dart:login.dart
          メールアドレスの入力フォーム（）,
         
          パスワードの入力フォーム（）,

                SizedBox(   //SizedBoxでスペースを空ける
                  height: 8.0,
                ),

                // FIREBASEからのエラー表示
                Center(
                  child: Text(
                    errorMessage,  //エラーメッセージをテキストで表示する
                    style: TextStyle(
                      color: Colors.red,
                      decoration: TextDecoration.underline,  //赤の下線をひく
                      decorationColor: Colors.red,
                    ),
                  ),
                ),

                SizedBox(   //SizedBoxでスペースを空ける
                  height: 24.0,
                ),

          ログインボタン(),
```
完成です。
参考になったなと思ったらいいねしてくれたら喜びます！

# 最後に
参考にさせていただいたものはこちら　↓ ↓
https://www.youtube.com/watch?v=0yykOVwHV7c&t=615s
Go言語 メソッド

## Method
任意の型に特化した関数を、定義する仕組み。
通常の関数と異なる点は、メソッド名の前にレシーバーが必要になること。

## Code
```Go
// 映画タイトルのための構造体
type Movie struct {
	Directer string
	Title    string
	Year     int
}

// 映画情報を出力するメソッド
func (m *Movie) infoMovie() {
	// レシーバーの変数を介して、値を出力
	fmt.Printf("Title : %s, Directer : %s, Year : %d \n", m.Title, m.Directer, m.Year)
}

// メイン関数
func main() {

	// 映画情報を格納
	movie1 := &Movie{
		Directer: "Steven Spielberg",
		Title: "Saving Private Ryan",
		Year: 1998,
	}

	// infoMovieメソッドの呼び出し
	movie1.infoMovie()
}
```

## Output Sample
~ $ go build main.go   
~ $ ./main   
Title : Saving Private Ryan, Directer : Steven Spielberg, Year : 1998  

## GitHub
https://github.com/GL-Kageyama/Go_Method
laravel クエリビルダーでselect句の括弧のついたor条件を表現する 個人メモ

# 内容

```php
$query->where(function($query) {
    $query
        ->where( 'users.status_id', '=', 2 )
        ->orWhere( 'users.status_id', '=', 3 );
});
```

- 上記のようにクロージャー（無名関数）を使ってSQLの括弧書きのwhere条件の部分を表現する
SQL group byの基礎の基礎のメモ

# 概要

- サブクエリと同様に、お恥ずかしながらSQLのgroup byをしっかりと理解できていなかったので基礎だけまずまとめてみる。

# 前提

- MySQL8系を用いて説明する

# 準備

- 下記のSQLをすべて実行して検証用のDB、テーブル、データを作成する。
- DBの作成

    ```sql
    create database test;
    ```

- テーブルの作成

    ```sql
    use test;
    create table users (
        id int(11) auto_increment,
        last_name varchar(255),
        first_name varchar(255),
        age int(11),
        PRIMARY KEY (id)
    );
    ```

- データのインサート

    ```sql
    insert into users
    values(
        1,
        'Yamada',
        'Ichirou',
        20
    ),
    (
        2,
        'Yamada',
        'Jirou',
        19
    ),
    (
        3,
        'Yamada',
        'Saburou',
        15
    ),
    (
        4,
        'Yamada',
        'Shirou',
        13
    ),
    (
        5,
        'Satou',
        'Ichirou',
        22
    ),
    (
        6,
        'Satou',
        'Jirou',
        20
    ),
    (
        7,
        'Satou',
        'Saburou',
        19
    ),
    (
        8,
        'Satou',
        'Shirou',
        17
    );
    ```

# 基礎group byを体験してみる

- group byを用いてlast_nameが一致しているレコードのageの平均をそれぞれ出力してみようと思う。下記のようなSQLを実行する。

    ```
    mysql> select last_name, avg(age) from users group by last_name;
    +-----------+----------+
    | last_name | avg(age) |
    +-----------+----------+
    | Yamada    |  16.7500 |
    | Satou     |  19.5000 |
    +-----------+----------+
    ```

- 指定したカラムが一致するものの平均値を作成して表示する事ができた。
kivyで作成したアプリをテストする際の"ModuleNotFoundError"の対処法

# 環境
- kivy-ios:12.5
- Xcode:13.3

# ModuleNotFoundErrorについて
kivy-iosによって作成したプログラムをXcodeからエミュレーターや実機に転送し，アプリを起動しようとすると

`ModuleNotFoundError: No module named '{モジュール名}'`

というエラーが発生し，アプリが起動しないということがあります．

ex:`ModuleNotFoundError: No module named 'requests'`

# 解決方法
`toolchain create`を行ったディレクトリで，

```sh:bash
$ toolchain pip install <モジュール名>
```
を行う．

例えば，
```sh:bash
$ toolchain pip install requests
```

# 参考
- [YouTube: iOS App in Python with Kivy - Part 14: Run It On Your iPhone!](https://www.youtube.com/watch?v=UAi3PG-qN2k&list=PLy5hjmUzdc0lo7EJM0UDMMN35nWqb3_Ei&index=15&t=785s)
- [PyPI: kivy-ios](https://pypi.org/project/kivy-ios/)
【初心者応援】新人エンジニア向け、覚えておくといいこと4選

# 初めに
今回、新人プログラマ応援イベントが開催されているので新人のAndroidエンジニア向けの覚えておくと役立つこと4選を書いていこうと思います。

### 1つ目: 検索能力
まずは、最重要である検索能力です。
プログラムを勉強してきた方、してこなかった方問わずこれは絶対に覚えておいた方がいいことです。
では、どうやって検索能力を身につけていくかです。
重要なのは2点あります。
* 検索時に英語を使うこと
* 無駄な文字を省く

まず、検索時に英語を使うことについてです。
なぜ英語を使って検索をかけることを勧めるかというと、エンジニア人口が一気に広がり該当の記事が見つけやすくなるからです。
日本語で調べると、文字での説明がありとてもわかりやすいですが幅が狭まります。
重要なのはコードなので英語圏まで手を伸ばして検索をした方が自分が探している問題の解決策を見つけやすくなります。
`stackOverFlow`等がおすすめです

次に無駄な文字を省くことです。
Google等の検索ロジックは検索にかけられた文字がサイト内に存在しているかどうかで探しています。
そのため、無駄な文字があるとほんとに欲しい情報が載っているサイトが自動的に省かれてしまいます。


### 2つ目: デバッグ機能
次に覚えておいて欲しいのはデバッグ機能です。
AndroidStudioを触ったことある方なら知っている方もいらっしゃるとは思いますが、デバッグ機能とはコードの各行にBrakePointというのを設置することができます。
BrakePointを設置した状態でAndroidStudio上部にある虫マークでアプリを実行することで設置したコードの処理が走る際に処理が一時停止してくれます。
その際に、変数の中身などを見ることができるので「そのコードまで到達したのかどうか」や「変数は期待通りの値になっているかどうか」等を確認することができます。
このデバッグ機能をうまく使うことで1つ目で紹介した検索能力は格段に上げることができます。

### 3つ目: Log機能
3つ目はLog機能です
Android Studio下部にあるLogCatを押下する事でAPIのレスポンス等の裏で行われている処理が見ることができます。
画像内でVerboseとなっている部分をErrorに切り替えることでクラッシュした際にどういった原因でクラッシュしたのかが即時にわかります。
![スクリーンショット 2022-04-08 12.20.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638092/54bf2129-d84f-c68e-b9f8-40feb0a77fc7.png)
また、画像内で`custom_token`となっている部分を検索したい文字列にすることで膨大な量のLogの中から自分が知りたい情報のみを検索することができます。
よく使う検索は下記になります
* OkHttp
これは、APIを叩いてる時には絶対に出てくるログです
こうすることでAPIの返却物を知りたい時にすぐに欲しい情報が取得できます
* Log.dで書いたString
実は、Logを任意に追加できるLog.dというコードが存在します。
好きなタイミング、好きな文字列をLogに出すことができるのでデバッグ時に重宝します

### 4つ目: コードに目を慣らす
最後はコードに目を慣らすことです
これは、だんだんと身についていくものではありますがとにかくサイト等でコードを読み、自分で書いてみることです。
そうすることで、コードの意味を理解でき、1つ目であげた検索能力で出てきたサイトのコードだけを読み情報の取捨選択もできますし、英語圏のサイトをみたときでも解決策を見つけやすくなります。
前述したようにだんだんと身についていくものではありますが、早く身につけておけば他のエンジニアと差をつけることができますし、何より自分の作業が楽になります。

## 最後に
今回は新人の方でも読む気になっていただけるよう、コード等の難しい部分は一切載せずに記事を書いてみました。
こういった書き方は初めてなので読みづらい点も多くあるとは思いますが、新人の方のお役に立てたら光栄です。
焦る必要はありません。自分のペースで大丈夫です。エンジニアはやればやった分だけ着実に成長できる職業です。
では、新人プログラマの皆さん良いエンジニアライフを！！
Alpine.js

Laravel BreezeをインストールするとAlpine．jsもインストールされ使えるようになる
テストに
```bash
npm run dev
```
して
```resources/views/test/alpine.blade.php
<!doctype html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="{{ asset('js/app.js') }}" defer></script>
</head>
<body>
<div x-data="{ open: false }">
    <button @click="open = !open">Click me</button>
    <ul x-show="open">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
    </ul>
</div>
</body>
</html>
```
を作成して
```routes/web.php
...
Route::view('alpine', 'test.alpine');
...
```
を追加
Rails ActiveStorageを使って画像を投稿する方法

この記事は私の学習の保存用のために書いている記事になります。新しく学んだ内容をアウトプットして残していき充実した学習をしていきたいと思います。
説明の不足や間違っている情報などがあればご指摘いただけると幸いです。よろしくお願いします。

## そもそもActiveStorageとは?

Railsで画像の投稿や表示を行うもので画像は通常のカラムとして保存できないため特別な保存方法が必要となり、それを行うのがActiveStorageです。

## ActiveStorageをインストールする

以下のコマンドでActiveStorageをインストールする

```
$ rails active_storage:install
```
インストールが終わるとマイグレーションファイルが自動で追加される。マイグレーションファイルをmigrateするために以下のコマンドを入力
```
$ rails db:migrate
```
以上がマイグレーションファイルができたときの基本の流れで、カラムを追加する必要があれば追加してから「rails db:migrate」を行う。

## モデルに記述を追加

ActiveStorageを使用する際は画像を表示したいモデルに宣言しておかないと画像が使えない。
以下の記述をモデルに記述しておくことでモデルにカラムが追加されている状態になり画像の表示が可能になる
```ruby
has_one_attached :image
```
コントローラ内のストロングパラメータにimageカラムを追加
```ruby
private
def モデル名_params
  params.require(:モデル名).permit(:image)
end
```
以下のような記述で画像を表示することが可能
```ruby
<%= image_tag モデル名:image, size:"〇〇x〇〇" %>
```
ネットワーク関連の用語【個人的なお勉強アウトプット】

## LAN
Local Area Networkの頭文字をとったもの。
一定の限定されたエリアで接続できるネットワーク。

## WAN
Wide Area Networkを略したもの。
遠く離れたエリアとつながったネットワークのこと。
インターネットもWANのひとつ。LANとLANをつないだワイドなネットワーク。

## イーサネット
LANに採用されている通信規格。
物、に関する規格。例えばLANケーブルとか。

## TCP/IP
通信するときにつかうプロトコル（言語）のひとつ。
インターネットの通信をするときのお約束事。
通信する双方が同じお約束事で会話しないと成り立たない、そのためのお約束事。
https://wa3.i-3-i.info/word1540.html

### TCP
安全重視のやりとり
ちゃんと届いたか都度確認しながらやりとるする
なので、もれなく伝わるが、スピードは遅くなる。

### IP
Internet Protocolの頭文字をとってIP。
IPだけではうまく通信できないので、TPCにフォローしてもらっている。

## ルーター
ネットワークの出入り口に置かれる機器。片側から入ってきたデータの宛先を確認し、宛先に近いもう片側のネットワークデータを転送する

## HUB
ネットワークの配線を分割する装置。同一のネットワーク上の他の端末へとデータを転送する。

## ファイヤーウォール
出入りするデータを確認して通してよいか否かを確認する装置。セキュリティを高めるために用いる。ちなみにAWSのWAFは通信の中身までみる。

## DMZ
インターネットなどの外部ネットワークと社内ネットワークの間に設けるネットワーク。どちらからでもアクセスしたいサーバーをおく。

## DHCP
接続された端末に自動的にIPアドレスを振る仕組み
社内ネットワークのLANのとき用いられるのかな

## サブネット
ひとつのネットワークをさらに小さく分割したネットワークのこと

## ゲートウェイ
通信プロトコルが異なるネットワーク同士がデータをやり取りする際、中継する役割を担うルータのような機能を備えた機器やそれに関するソフトウェア
経営ビジョンお決まりワード


日本企業大体は2022年度キックオフのシーズン
よくある経営ビジョンのお決まりワードを拾って見ました

プロジェクトでも経営方針からの目標設定などで遭遇茶飯事かと
いつの時代もいつの社長もいつの組織も使い古し
当然中身は変われど人間ができることは限界＝お決まりとなり

まあこれらの幾つか（全部でも）をテーマに挙げて
累々の過去問題課題、やれもしない施策、到達できそうにない目標・・・
をそれらしく作文すれば
今日からあなたも一流コンサル！

最適化
効果効率的の徹底
リスクマネジメント
デジタル化
高速化
シミュレーション
標準化
人材強化
SaaS、PaaS、Iaasの違い【個人的なお勉強アウトプット】

いつも忘れてしまうのでアウトプット。
提供度合いによって定義している。

|  種別  |  提供しているもの  | 例|
| ---- | ---- |---- |
|  SaaS  |  アプリケーション<br>プラットフォーム（OS）<br>インフラ(ハードウェア)  | Gsuite、SNS、ブログサービス |
|  PaaS  |  プラットフォーム(OS)<br>インフラ（ハードウェア）  |　レンタルサーバー |
|  IaaS  |  インフラ（ハードウェア）  |　 |
【IBM Application Gateway】IBM Cloud Log Analysisへリクエストログ/監査ログを出力する

# はじめに
IBM Cloud Log Analysisを設定し、IBM Application Gatewayのコンテナコンソールに出力されるリクエストログ、監査ログがどのように表示されるか試してみました。

IBM Cloud Log Analysisについては、下記記事を参考にしました。
[IBM Log Analysis with LogDNAで、IBM Cloud Kubernetes Service(IKS)のログを監視・アラート通知する](https://qiita.com/hisato_imanishi/items/cdfe71a98919d3dfe38f)



# 1.IBM Cloud Log Analysis設定
IBM Cloudの[ロギング](https://cloud.ibm.com/observe/logging)のページにアクセス
![qiita (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/11cfd2c7-44dd-4750-151a-a13ade5b764f.png)

今回は検証のため、無料のライトプランを選択しました。
![qiita (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/977d0537-5bba-08f4-f532-56207acb66c9.png)

作成されたリソースを選択
![qiita (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/ef91f737-95af-773b-d5c3-3a8155f4a282.png)

ダッシュボードを開く
![qiita (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/204b0a5b-30b4-b7d3-1c27-14557784bc5c.png)

Openshiftのコマンドが提供されているため、なにも修正せずに１つずつ実行します。
![qiita (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/7bff541d-0480-ec2b-7f7a-a8275093f0f2.png)

```
1. プロジェクトを作成します。 プロジェクトは、クラスター内の名前空間です。
>oc adm new-project --node-selector='' ibm-observe

2. サービス・アカウント logdna-agent をクラスター名前空間 ibm-observe で作成します。
>oc create serviceaccount logdna-agent -n ibm-observe

3. 特権 SCC へのアクセス権限をサービス・アカウントに付与します。
>oc adm policy add-scc-to-user privileged system:serviceaccount:ibm-observe:logdna-agent

4. シークレットを追加します。
>oc create secret generic logdna-agent-key --from-literal=logdna-agent-key=5d91a1702a34930ea2bddb4706841b82 -n ibm-observe


5. OpenShift DaemonSet をインストールします。
>oc create -f https://assets.jp-tok.logging.cloud.ibm.com/clients/logdna-agent-ds-os.yaml -n ibm-observe

```

実行した結果、ibm-observe プロジェクトにPodがデプロイされていました。
```
> oc get pods -n ibm-observe
NAME                 READY   STATUS    RESTARTS   AGE
logdna-agent-bq729   1/1     Running   0          40s
logdna-agent-rffnq   1/1     Running   0          40s
```

# 2.IBM Application Gatewayでアプリケーションにアクセスしてログを生成

今回はリクエストログ、監査ログを出力しているIBM Application Gateway環境を利用しました。

Security Verifyでのログイン/アプリケーションアクセスして、コンテナのコンソールにログがでることを確認します。
![qiita (18).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/cc088bfe-9373-b695-89c0-455cb82ab03d.png)

# 3. IBM Cloud Log Analysisでのログ出力確認
IBM Cloud Log Analysisに、IBM Application Gatewayのログが表示されました。
無事にIBM Cloud Log Analysisとの連携ができました。
![qiita (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/0952e355-e0ff-39dd-e305-21265cd9872e.png)

# 最後に
IBM Cloud Log Analysisへのログ出力は、非常に簡単にできました。
IBM Application Gatewayのログをファイル出力にすると、IAGのコンテナごとに別々のファイルを参照する必要があるため、IBM Cloud Log Analysisにログ出力/横断的に参照、検索できるのは便利だと思います。
iroha-cliでAPIにアクセス

# 前提条件
- Docker、node.js、npmはインストール済み
- 使用PC：M1 Mac
- API・DBコンテナは起動済み
- 作業ディレクトリは~/User/development/

# 各コンテナの動作確認
## Hyperledger Iroha
### iroha-cli
iroha-cliとは、Hyperledger Iroha プロセスにアクセスするものでほぼすべての処理（transaction）を指示でき、 状態の表示（query）もできます。つまり、Hyperledger Iroha はプログラムなしでも利用できます。
### iroha-cli起動
iroha-cliコマンドで対話型のAPI操作が可能となります。以下は起動コマンドのフォーマットです。以下はアカウントをデフォルトで入っているadmin@testに指定します。
```
iroha-cli --account_name (アカウント名)＠ドメイン名
```
## 例題：ロールの表示
### ロール
ロールとは複数の権限を 1 つのグループにまとめたものです。
## 動作確認
①irohaコンテナにアクセス
```
docker exec -it iroha /bin/bash 
```
②iroha-cli起動
```
iroha-cli -account_name admin@test
```
③「New query（qry）」を選択
④「Get all current roles in the system (get_roles)」を選択
④「Send to iroha peer（send）」を選択
⑥ Peer のアドレスを選択
- デフォルト値の 0.0.0.0 の場合、 そのまま Enter キーを押す

⑦ port を選択
- デフォルト値の 50051 の場合、 そのまま Enter キーを押す

⑧ 結果が表示される
⑨ iroha-cli コマンド終了
- Ctrl ＋ C キーを押す 

### 最終状況
![スクリーンショット 2022-04-08 8.10.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953297/b69756b5-a9f4-4fa2-c675-e16ac29cd8c6.png)

## PostgresSQL
Hyperledger Iroha プロセスの正常動作をiroha-cliコマンドで確認できれば、some-postgresコンテナのPostgreSQLデータベースの動作も正常といえます（その理由は各自で考えてください） 。

# まとめ
対話型簡単で良いですね。