OmniAICreator/Qiita-1.07M huggingface dataset:
フリーザ様で考察するウォーターフォールとアジャイルの違い

# 唐突に…
> このフリーザは変身をするたびにパワーがはるかに増す・・・その変身をあと２回もオレは残している・・・その意味がわかるな？

ドラゴンボール最大の敵と言えば私の中ではフリーザ様。
は、どうでもよくて本題に入りましょう。

# ウォーターフォールとアジャイルの違い
ウォーターフォールとアジャイルの違いとはなにか。という話題をPMBOKガイド（第6版）を元に考えます。
本文中の引用は全て[PMBOKガイド第6版](https://www.pmi-japan.org/topics/pmi1/pmbok6_1.php)から取っています。


# ウォーターフォールってなに？

- 予測型ライフサイクル
- 反復型ライフサイクル
- 漸進型ライフサイクル
- 適応型ライフサイクル
- ハイブリッド型ライフサイクル

PMBOKガイドでは上記の4つ＋1つの複合ライフサイクルが紹介されています。

ということで1個ずつ見てみましょう

# 予測型ライフサイクル
> 予測型ライフサイクルにおいて、プロジェクトのスコープ、タイム、およびコストはライフサイクルの初期フェーズで決定される。スコープへのすべての変更は慎重にマネジメントされる。予測型ライフサイクルはウォーターフォール型ライフサイクルとも呼ばれる。

というわけでウォーターフォール型ライフサイクルは
PMBOKでは予測型ライフサイクルと呼ばれます。

![予測型.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974516/17ae508d-0406-8af5-025d-eab8442ebcf5.png)

- ポイント
    - 最初に成果物の完成形を決める。
---

# 予測型ライフサイクル
> 予測型ライフサイクルにおいて、プロジェクトのスコープ、タイム、およびコストはライフサイクルの初期フェーズで決定される。スコープへのすべての変更は慎重にマネジメントされる。予測型ライフサイクルはウォーターフォール型ライフサイクルとも呼ばれる。

---
# 反復型ライフサイクル
> 反復型ライフサイクルでは、プロジェクト・スコープは通常プロジェクト・ライフサイクルの初期に決定されるが、タイムとコストの見積もりは、プロジェクト・チームのプロダクトへの理解が増すとともに日常的に変更される。反復型では一連のサイクルの繰り返しを通してプロダクトが作成され、一方、漸進型では継続的にプロダクトの機能が追加されていく。

![反復型.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974516/7e4a2b22-8fc6-c680-49e1-d7a1cd4c865d.png)

- ポイント
    - 最初に成果物の完成形を決める。
    - フェーズを繰り返すことで徐々に精度を上げていく。
    - 反復の途中でも（質は悪いが）利用は可能。

---
# 漸進型ライフサイクル

漸進型ライフサイクルでは、成果物は、所定の時間枠内で連続して機能を追加する一連の反復を通して作られる。成果物は、最終の反復の後にのみ完了とみなすのに必要かつ十分な能力をもつ。

![漸進型.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974516/ae56e329-f0b6-6e98-c22f-ac0adafac447.png)

- ポイント
    - 最初に成果物の完成形を決める。
    - 機能を順次追加していく。
    - すべての反復が完了するまで完成しない。

---
# 適応型ライフサイクル
> 適応型ライフサイクルは、アジャイル型、反復型、または漸進型である。詳細なスコープは反復の開始前に定義され承認される。**適応型ライフサイクルは、アジャイル型**または変化駆動型ライフサイクル**とも呼ばれる**。

**適応型ライフサイクル＝アジャイル**

![適応型.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974516/e2465d72-4f37-fb4c-cf4c-aabdeb642311.png)

- ポイント
    - 最初に成果物の完成形が決まらない。
    - プロジェクトの終了が成果物によって定義されない。

---
# まとめてみた
![ライフサイクル概要.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974516/4904a281-2aff-3d4d-6495-39263ec7af4f.png)

---
# ウォーターフォールとアジャイルの違いは…
- フェーズの繰り返し回数が違う。
- 成果物の完成条件が違う。
    - ウォーターフォール：最初に成果物の完成形を決める。
    - アジャイル：成果物の最終形態は決まらない。

フェーズを繰り返せばアジャイルだろう。という誤解をされることも多いですが、アジャイルの一番の特徴は適応型です。
成果物の最終形態は決まらずに、ユーザのフィードバックや製品を取り巻く環境の変化に柔軟に適用していくことが大切です。

---
# 諸説あり
PMBOK(Project Management Body of Knowledge)とは、
どっかのプロジェクトを成功／失敗させた人が、こうやるといいよ～／ダメだよ～といった知識をかき集めて、体系的にまとめたものなので、どこまで行っても「**諸説あり**」です。

---
# さて、、、冒頭に戻って、、、
フリーザ様のこのセリフは…何型ライフサイクルでしょうか。
> このフリーザは変身をするたびにパワーがはるかに増す・・・その変身をあと２回もオレは残している・・・その意味がわかるな？

フリーザ様は反復型ライフサイクルです。（断言）[^1]
- 各変身が終わった際にいつでも戦える。
    - 途中は最終形態より弱い（質は悪い）けど。
- だんだん強くなる。
- 最終形態は定義されている。

社内のLTで上記の研究成果を発表したところ「ゴールデンフリーザ[^2]はどうした」と、私のドラゴンボール知識の甘さに猛烈な指摘をいただいたことを追記しておきます。[^3]

[^1]:読者の反応をみながらストーリーを考えていったのであればアジャイルじゃないか！という説もあります。
[^2]:ゴールデンフリーザ…なにそれ。
[^3]:ネタなのであんまりリアルに突っ込まないで…( ﾉД`)ｼｸｼｸ…
pythonでclass名を上書きする方法

どうしようもなくてこんなことをしたくなったんだけど

syntax errorかと思いきや、イケるのね・・・でも結果は、、


```py
class AAA:
    status = "Former one"

class User(AAA):
    aaa = AAA()                # 上書きされた後にcallされる

    def do(self):
        print(self.aaa.status)

class AAA(AAA):              # 上書き
    status = "Latter one"

if __name__ == "__main__":
    # debug
    user = User()
    user.do()
```


result

```rb
$ python aaa.py
Former one
```

だめぽい！
Laravel Sail Xdebug3設定

Laravel Sailを利用した開発環境の設定を行い、デバッグ設定で手間取ったので備忘録。

## 開発環境ビルド

https://laravel.com/docs/9.x/installation#getting-started-on-macos

Macで開発していて、Docker Desktopがすでにインストールされている環境なのでこちら実行。


## Xdebug3

2022年3月の時点だとsailで環境設定した場合Xdebug3がインストール済みでした。

- .env に追記

```
SAIL_XDEBUG_MODE=develop,debug
```

- vendor/laravel/sail/runtimes/8.1/php.ini に追記

```
[xdebug]
xdebug.start_with_request = yes
```
これを設定しないとデバッグを始めるのにいちいちurlに
``?XDEBUG_SESSION_START=session_name``
をつけないといけなくなる。


- ビルドし直す

```shell
./vendor/bin/sail up
```



## 参照

https://chigusa-web.com/blog/laravel-sail-xdebug/

https://medium-company.com/vscode-php-%E3%83%87%E3%83%90%E3%83%83%E3%82%B0/

https://zenn.dev/hdmt/scraps/898f1fceabe71a

https://qiita.com/castaneai/items/d5fdf577a348012ed8af

https://xdebug.org/docs/upgrade_guide/ja

##
ローカルでlaravelをとりあえずいじってみたい場合laravel sailは便利だと思う。
ビルドを前提としたlaravel sailの利用方法もあるのだろうか。
WebStormでキーペアを使ったSFTPができない問題の対策

# はじめに
最近、VSCodeからIntelliJ系WebStormに乗り換えました。というか乗り換え中。
SFTPでwebサーバにデプロイしようとしたところ、そもそもSSH接続がうまくいかない問題が発生して悩んでいたんですが、ようやく解決したので書いておきたいと思います。

# 発生した問題
## 環境
Windows 10
WebStorm 2021.3.3

## 問題の詳細
**とにかくキーペアを使ったSSH接続（いわゆる鍵認証）ができない。**
パスフレーズの有無は関係なかった。

ちなみに、同じPC上の他のアプリ（VSCode, RLogin）からは接続できていた。

SSH設定から接続情報を登録し、「接続のテスト」ボタンを押すと
> リモートホストに接続できません

と表示される。

### ログ
ログはこれだけ。エラー的なものは見当たらなかった。
※ ヘルプ＞診断ツール＞デバッグログ設定 で`#com.intellij.ssh`を追加してから実行した。
```
INFO - om.intellij.ssh.impl.sshj.sshj - Client identity string: SSH-2.0-IntelliJ__WebStorm_WS-213.7172.31__SSHJ_0.32.1_SNAPSHOT 
INFO - om.intellij.ssh.impl.sshj.sshj - Will treat the identification of this server 'SSH-2.0-OpenSSH_4.3' leniently 
INFO - om.intellij.ssh.impl.sshj.sshj - Server identity string: SSH-2.0-OpenSSH_4.3 
INFO - om.intellij.ssh.impl.sshj.sshj - Disconnected - BY_APPLICATION 
```

# 対処法
**SSH構成ファイルを作成して、HostKeyAlgorithmsを設定した。**


- `C:\Users\自分のユーザ名\.ssh`に`config`ファイルを作成して以下を記述する。
```config
HostKeyAlgorithms ssh-rsa
```

- WebStormのSSH設定で、「構成ファイル ~/.ssh/configの構文解析」にチェックを入れる。

以上！

## 参考
- [PuTTY SSH keys (.ppk) are broken since 2021.3](https://youtrack.jetbrains.com/issue/IDEA-284623)
- [RSA keys aren't accepted by old OpenSSH servers](https://youtrack.jetbrains.com/issue/IDEA-290663)

※WebStormに限った話ではないっぽい。 PHPStormでの問題報告が多い。

# おわりに
コピーミスとか鍵指定ミスかと思って、めちゃくちゃ何度もコピペしたり指定し直したりしてたので、悲しくなりました。

実はこれが初投稿です。生暖かく見守っていただけると嬉しいです。
Pandas 覚書き

spreadsheetでは大きすぎるファイルをpandasで処理する際に必要な関数の覚書き


```python
## インポート
import pandas as pd
df = pd.read_csv('filepath', sep=',')

## データの概要確認
print('dataframeの行数・列数の確認==>\n', df.shape)
print('indexの確認==>\n', df.index)
print('columnの確認==>\n', df.columns)
print('dataframeの各列のデータ型を確認==>\n', df.dtypes)
print('欠損値(NaN)の確認',df.isnull().sum())

## 前処理(Na)
df.fillna(value={'column_1': 0.0}, inplace=True)
df.dropna(subset=['column_1'], axis=0, inplace=True) 

## 前処理
df['column_1'] = df['column_1'].str.replace('--', 0).astype(float)
pd.DataFrame(df['column_1'].mask(df['column_1'] > 95, 100))
df.drop(['column_1'], axis=1, inplace=True) # column_1自体を削除

## 参照
df['ColumnName'] #=> series
df[['ColumnName1', 'ColumnName2']] #=> dataframe
df['IndexName'] #=> Series


## Filter
df[1:2] #=> dataframe, 行番号でのアクセスはスライスしかできない。df[1]はエラー
df.loc['IndexName'] #=> Series
df.loc[['IndexName1', 'IndexName2']] #=> Series
df.iloc[IndexNum] #=> Series
df[df.column1 == 'condition1'] #=> dataframe
df[df.column1.map(lambda x: x == 'condition1')] #=> dataframe

## Sort
df.sort_values(['column1'])

## 列挿入
series = pd.Series(['X2', 'X3', 'X4'], index=['TWO', 'THREE', 'FOUR'], name='X')
df['NewLabel'] = 0
df['NewLabel'] = series
df2 = df.assgin(X=func(df['A'])) #非破壊。XはそのままLabel名

## 結合
pd.merge(data_frame1, data_frame2, how="inner" ,on="id")

## group_by
df.groupby('key')
df.groupby('key').agg({
  'column1': 'sum',
  'column2': 'mean',
  'column3': 'count',
  'column4': lambda xs: ','.join([x for x in xs if x.strip()])
  'column5': lambda xs: xs.iloc[0]
})

## column名の変更
df = df.rename(columns={'old_column_name': 'new_column_name'})

## 集計
# weather列の集計
df['weather'].value_counts()

# groupbyメソッドで、'week'列ごとに'soldout'の数をカウントする
df.groupby(['week'])['soldout'].count()

# テキストデータが入っている列全てをdummy化(=one hotベクトル化)する
dummy_df = pd.get_dummies(df, columns=['week', 'name', 'event', 'weather', 'period'])
dummy_df.head()
```

## よく使う処理
ある列でuniqな最初の行だけを取得
```python
df = df[~df.duplicated(subset='column1')]
```

一つの列にある複数選択された値を列ごとにバラしてカウントする
Android,iOSで画面遷移時のバックスタックを制御する方法

# やること
A, B, Cの3つの画面があります。
AからCに遷移した後、Cでバックボタンを押下したときにBに戻るようにします。

# Android (Navigation Architecture Component)

navigateメソッドを2回使用して、A→B→Cと遷移させます。

```kotlin
navController.navigate(R.id.action_aFragment_to_bFragment)
navController.navigate(R.id.action_bFragment_to_cFragment)
```

# iOS(UINavigationController)

UINavigationControllerの[setViewControllers](https://developer.apple.com/documentation/uikit/uinavigationcontroller/1621861-setviewcontrollers)メソッドを使います。

```swift
navigationController?.setViewControllers([self, bVC, cVC], animated: true)
```
うわっ・・・私のウィングマン、当たらなさすぎ・・・？【APEX】【python】

# はじめに

こんにちは。今日はpythonとOCRを使ってウィングマンの命中率をだしてみます
デモはこんな感じ。スプラAIに引き続き、APEXでも画像処理で何かしたいと思ってこんなことしてみました。

https://twitter.com/itdk1996/status/1432603269176594436?s=20

# 大まかな内容
APEXにおいては敵に弾が当たると、敵の周りに数字がでるんですが、この位置はなかなか捉えられないんですよね。
そこで今回OCRかけるのは3つ。
(・現在の武器)
・現在の弾数(撃ったか撃ってないかがわかる)
・与ダメージ(与ダメージの増加により当たったかどうかがわかる)
・キル数(修正用)

# 取得する画像
元画像
![src_img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/803d5021-fbc7-4b29-4c73-16a383d38e19.jpeg)
ここから座標を指定して必要な画像の部分だけ切り抜きます。
武器名
![weapon_name.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/27090ebb-63c4-fc2e-b3e4-cba0c7aea965.jpeg)

ダメージ
![damage.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/61c34baf-0f4e-bc8a-eb73-a3372f6084a8.jpeg)

弾数
![bullet.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/4547a90c-1d71-48f5-ea00-d47640271c97.jpeg)

どれもいい感じに閾値きめて二値化したり大津の二値化を使って白黒にしてます。

余談ですが
![weapon_name (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/67998c19-24b6-98ac-ba0d-603fa1109ea4.jpeg)
人だと読めるし、画像内だと白文字って結構あるんですが、OCRだとこういうの読めないっぽいんですよね。これに気が付くの結構時間かかりました。

# 処理の内容
### 誤り補正
これがかなり大事。
特にダメージの認識はかなり小さい文字なのでちょいちょいご認識が起きるので適宜修正していく。例えばsとSは2に。iは1にといった感じ

どうしても解決できない問題として
デジタル表記だと0と8がそっくりなんですよね0の真ん中にスラッシュいれるなよ。。。
この辺はshoot_managerに補正させます。例えば、弾は減る一方なので4->3->8ってなってたらこれはリロードして4->3->0になったんだなみたいな感じです。

後は上の画像だとダメージ表記の横に変なヒットマークがあってこいつが邪魔なんですよね。でも、数字の桁数によって動くので、下手にクロップすると数字が見切れてしまうという。

そこでdigitで管理を行う。1個前の与ダメージが90なら次弾があたったら3桁になりそうなので3桁分右から見ようのような感じ。

こういった調整をこまごまと行う。
それでも問題は多い

### 動画のエンコーディング
H264形式(twitterで再生できる形式)の動画のエンコーディングがどうしてもopencvでできなかったので、今回は3段階で行く。

OPENCVで動画生成
↓
ffmpeg-pythonで動画を再エンコーディング
↓
moviepyで元々の動画と生成した動画で音をくっつける






# コード
github(リファクタリング中)

https://github.com/daikiclimate/wingman_hitcounter
python main.py path-to-movie
でとりあえずは動く

notebook(初期、未整備)
https://colab.research.google.com/drive/1TNZM2arw_y2hK3AUIintzPpEH5mKpMc6?usp=sharing

# 残る問題
・まず武器1(左側)にウィングマンがないと認識できない(というよりしてない)
・同じ問題として、現在の武器が武器1がメインなのか、武器2がメインなのかがわからない
・ウィングマン以外で与ダメージを与えてしまった時にshoot_managerがバグる気がする
・その他もろもろ

この辺が起きないようにサンプルvideoが簡単めに調整されてる

# 感想
OCRって意外とめんどくさいな。。。
[記事紹介] PPAPを拒否するMilterを作ってみました

@qualitia_cdevの中の一人、@hirachanさんが書いた記事をみなさまにご紹介します。

### PPAPを拒否するMilterを作ってみました
https://qiita.com/hirachan/items/898e3554c007ae1026ef
C++のクラスでタグの存在を判定するメタ関数 (Lightweight Type Categorization Idiom)

C++でクラスにタグのようなものを埋め込み，その存在の有無をコンパイル時に判定するためのメタ関数を実装したい．

```cpp
#include <type_traits>

template<typename T, typename R=void>
struct enable_if_type {using type = R;};

template<typename T, typename R=void>
struct has_x_tag : std::false_type {};

template<typename T>
struct has_x_tag<T, typename enable_if_type<typename T::x_tag>::type> 
 : std::true_type {};

int main()
{
  struct A {};
  struct X {using x_tag = void;};

  static_assert(has_x_tag<A>::value, "");  // fail
  static_assert(has_x_tag<X>::value, "");  // pass
}
```

ポイントは2つ:
1. タグは適当な型エイリアス `using x_tag = void` で定義
2. 判定用メタ関数 `has_x_tag<>` は SFINAE で実装

このアイデアは Stack Overflow にて [@JoelFalcou](https://stackoverflow.com/users/737268/joel-falcou)  氏が提案した "Lightweight Type Categorization Idiom" を拝借したものです:
* [How to check whether a class has specified nested class definition or typedef in C++ 11?](https://stackoverflow.com/questions/9644477/how-to-check-whether-a-class-has-specified-nested-class-definition-or-typedef-in)
* [Simplest implementation of "lightweight type categorization idiom"?](https://stackoverflow.com/questions/52777854/simplest-implementation-of-lightweight-type-categorization-idiom?rq=1)
ネットワーク構造の可視化

ネットワークモデルの可視化をしたかった。
参考にした記事
https://nine-num-98.blogspot.com/2020/03/dnn-visualization.html

Google colabratoryで実装

自分で使用しているモデルの可視化をしたかったので、一部訂正のみ。
from tensorflow.keras.utils import plot_model 

これで以上。
cscの作法 その102

# 概要
cscの作法、調べてみた。
listview使ってみた。

# 参考にしたページ

https://qiita.com/kob58im/items/aea2d2bd3380449a9f6a

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/6aad12d7-ff62-1b75-a5cf-67fb53e8a164.png)

# サンプルコード

```
using System;
using System.Drawing;
using System.Windows.Forms;

class ListViewSample : Form {
	ListView lsv;
	ListViewSample() {
		ClientSize = new Size(300, 500);
		lsv = new ListView();
		lsv.Dock = DockStyle.Fill;
		lsv.View = View.Details;
		lsv.FullRowSelect = true;
		lsv.HideSelection = false;
		lsv.MultiSelect = false;
		lsv.GridLines = true;
		Controls.Add(lsv);
		lsv.Columns.Add("angle", 70, HorizontalAlignment.Left);
		lsv.Columns.Add("cos(angle)", 70, HorizontalAlignment.Left);
		lsv.Columns.Add("sin(angle)", 70, HorizontalAlignment.Left);
		lsv.SelectedIndexChanged += Lsv_SelectedItemChanged;
		AddItemsToTheListView();
	}
	void Lsv_SelectedItemChanged(object sender, EventArgs e) {
		if (lsv.SelectedItems.Count == 1)
		{
			Text = "angle=" + lsv.SelectedItems[0].SubItems[0].Text + ", cos(angle)=" + lsv.SelectedItems[0].SubItems[1].Text;
		}
		else 
		{
			Text = "No item is selected.";
		}
	}
	void AddItemsToTheListView() {
		lsv.Items.Clear();
		lsv.BeginUpdate();
		for (int i = 0; i < 100; i++)
		{
			double degree = i * 7.5;
			double x = degree * Math.PI / 180.0;
			double cosX = Math.Cos(x);
			double sinX = Math.Sin(x);
			lsv.Items.Add(new ListViewItem(new string[] {
				degree.ToString("F1"),
				cosX.ToString("F3"),
				sinX.ToString("F3")
			}));
		}
		lsv.EndUpdate();
	}
	[STAThread]
	static void Main() {
		Application.Run(new ListViewSample());
	}
}





```

以上。
cscの作法 その101

# 概要
cscの作法、調べてみた。
自作dll使ってみた。

# コンパイル手順

```
>csc ore2.cs /reference:gengo.dll


```

# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;
using Ore;

class Form1: Form {
	TextBox bo1;
	Gengo ore;
	Form1() {
		Text = "oregengo";
		ClientSize = new Size(400, 600);
		ore = new Gengo();
		bo1 = new TextBox();
		bo1.Location = new Point(50, 50);
		bo1.Width = 300;
		bo1.Height = 450;
		bo1.Multiline = true;
		bo1.Text = "10 a=1\r\n30 b=a/15\r\n40 #=%=0*120\r\n50 b=a/5\r\n60 #=%=0*140\r\n70 b=a/3\r\n80 #=%=0*160\r\n90 ?=a\r\n100 #=a<100*180\r\n110 #=300\r\n120 ?=\"fizzbuzz \"\r\n130 #=180\r\n140 ?=\"buzz \"\r\n150 #=180\r\n160 ?=\"fizz \"\r\n180 a=a+1\r\n190 #=30\r\n#=1\r\n";
		Controls.AddRange(new Control[] {
			bo1
		});
		Button btn1 = new Button();
		btn1.Location = new Point(50, 20);
		btn1.Text = "run";
		btn1.Click += btn1_Click;
		Controls.AddRange(new Control[] {
			btn1
		});
	}
	void btn1_Click(object sender, System.EventArgs e) {
		bo1.Text += ore.run(bo1.Text);
	}
	[STAThread]
	public static void Main() {
		Application.Run(new Form1());
	}
}





```

以上。
S3にディレクトリをアップする時に微ハマりした話

S3のアクセス制御とcliがちゃんと使えるかの確認中
**「ディレクトリごとアップロード」** を試した時に起きたこと

アップしようとしたファイルはこういう中身
```
sample_dir/
　┣ test/
　┃ ┗ index.html
　┗ index.html
```

```bash 
aws s3 cp --profile iichiko ./sample_dir s3://mugijo-chu/ --recursive 

upload: sample_dir/index.html to s3://mugijo-chu/index.html 
upload: sample_dir/test/index.html to s3://mugijo-chu/test/index.html 
```

いけ...てない。
思てたんと違う。

```
s3://mugijo-chu/sample_dir/index.html 
s3://mugijo-chu/sample_dir/test/index.html 
```

こうなってほしいのだが。

## 策

```
aws s3 cp --profile iichiko ./sample_dir s3://mugijo-chu/sample_dir --recursive 
```

from sample_dir 
to sample_dir 
と指定すればOK

ディレクトリごとコピーってこんなんだったかな
普通のファイル操作と微妙に違う感じがちょっと気持ち悪い
S3でディレクトリとか言うこと自体がそもそもナンセンスなのかもしれないけど

**おわり。**
MacでターミナルからVSコードを起動しようとしたらエラーが・・・

# エラー内容

```console
$ code .
-bash: code: command not found
```

# 原因
bashにcodeコマンドのパスが通っていない。

bashで[code]と打つと、登録されているパスのディレクトリを順次検索して、そのなかに[code]というコマンドなければあかんわけです。

# 解決の道は公式ドキュメントに
https://code.visualstudio.com/docs/setup/mac

>Open the Command Palette (Cmd+Shift+P) and type 'shell command' to find the Shell Command: Install 'code' command in PATH command.

訳
>コマンドパレットを開くんやで！ショートカットキーは括弧の中に書いとるさかい、参考にせい！ほいでやな、'shell command'って打ってみぃ！ほしたらcodeコマンドをパスに登録するコマンドが見つかるっちゅう話やで！他愛ないで！

vscodeを日本語化している場合は、以下のような感じで表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/aef16bdb-4570-b7fa-ac9f-d942b4853775.png)

# まとめ
ドキュメント読もうねってことやね！
英語の勉強にもなって一石二鳥！
英語を喋れるようになったらパツキン美女と夢の・・・
【MySQL】データベースの削除方法【DROP DATABASE】

本稿ではMySQLでデータベースを削除する方法を紹介します。

## 【参考】公式ドキュメント
[MySQL 8.0 リファレンスマニュアル(DROP DATABASE ステートメント)](https://dev.mysql.com/doc/refman/8.0/ja/drop-database.html)

## データベースの削除
書式は以下の通りです。
> DROP DATABASE db_name


実際にデータベースを削除してみます。
### 削除するデータベースの確認
testdbが存在することを確認します。
```
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
5 rows in set (0.00 sec)
```

### データベースの削除
testdbを削除します。

```
mysql> DROP DATABASE testdb;
Query OK, 4 rows affected (0.03 sec)
```

### 削除されたことを確認
testdbが削除されたことを確認します。

```
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql>
```

MySQLでデータベースを削除する方法を紹介しました。
Iterm2でマウススクロールが効かなかった時

# 前提

OS: Mac 12.3
マウス: Logicool MX Master 3 for Mac
ソフト: Iterm2

# 状況

Macに搭載されているトラックパッドではスクロールができるのですが、マウスを使用するとスクロールできなくなりました。
Iterm２以外のアプリケーションでは全て正常に動作しております。

# 解決方法

Secure Keyboard Entryにチェックが入っているのが原因でした。
チェックを外したら正常に動作しましたのでご参考までに！！！！

![スクリーンショット 2022-04-07 10.56.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932783/80ea304e-0a13-518f-3717-44dd7bc11dd0.png)
sarコマンドが使えないときの対処法



sarコマンドはサーバーの負荷を確認したいときなどに便利です。
ですが、sysstatをインストールしたあとsarコマンドを使ってみると以下のようなえらーになりました。

```
$ sudo yum install -y sysstat # sysstatのインストール

$ sar
Cannot open /var/log/sysstat/sa07: No such file or directory
Please check if data collecting is enabled
```

## 解決方法

原因はsysstatが有効化されていないため。
以下のように設定を変更します。

```
$ sudo vi /etc/default/sysstat

# ENABLED="false" falseではなく、trueに変更してください
ENABLED="true"
```

数十分後、再度sarコマンドを試してみてください。
【Firebase】transaction中にFAILED_PRECONDITIONが発生した

# 結論
複数の異なるリソースに対して、同時に`transaction.get`することはできない。

# やろうとして失敗したこと
やりたかったことはこちら。

- `/teams/aaa`ドキュメントが存在することを確認
- `/users/xxx`ドキュメントが存在しないことを確認
- `/users/xxx`ドキュメントを新しく作成

こちらが問題のコード

```index.ts
async createUser(): Promise<void> {
  const teamRef = doc(this.firestore, 'teams', 'aaa');
  const userRef = doc(this.firestore, 'users', 'xxx');
  await runTransaction(this.firestore, async (transaction) => {
    const teamDocSnap = await transaction.get(teamRef);
    if (!teamDocSnap.exists()) {
      throw new Error('チームが存在しません');
    }
    const userDocSnap = await transaction.get(userRef);
    if (userDocSnap.exists()) {
      throw new Error('すでにユーザーが存在しています');
    }
    transaction.set(userRef, {
      name: 'sample user name',
      teamId: 'aaa',
      createdAt: serverTimestamp(),
      updatedAt: serverTimestamp()
    });
  }).catch((err) => {
    console.log('transaction error', err);
  });
}
```

こちらを実行したところ、こんなエラーが発生してしまった。

```
9 FAILED_PRECONDITION: the stored version (1649289374616448) does not match the required base version (0)
```

# 原因と対処方法
まずかったのは、こちらの2行。

```typescript
const teamDocSnap = await transaction.get(teamRef);
```

```typescript
const userDocSnap = await transaction.get(userRef);
```

`teamRef`と`userRef`の異なる2つのリソースに対して、`transaction.get`を実行しようとしてしまった。
下のように、一方を`getDoc`にすることで対処した。

```index.ts
async createUser(): Promise<void> {
  const teamRef = doc(this.firestore, 'teams', 'aaa');
  const userRef = doc(this.firestore, 'users', 'xxx');
  await runTransaction(this.firestore, async (transaction) => {
    const teamDocSnap = await transaction.get(teamRef);
    if (!teamDocSnap.exists()) {
      throw new Error('チームが存在しません');
    }
    const userDocSnap = await getDoc(userRef); // getDocに変更
    if (userDocSnap.exists()) {
      throw new Error('すでにユーザーが存在しています');
    }
    transaction.set(userRef, {
      name: 'sample user name',
      teamId: 'aaa',
      createdAt: serverTimestamp(),
      updatedAt: serverTimestamp()
    });
  }).catch((err) => {
    console.log('transaction error', err);
  });
}
```
PostgreSQL Functionで複数の戻り値を得る

最近functionを初めて作った事があって書き方を整理してみました。

```sql
CREATE OR REPLACE FUNCTION f_getsomething(in_ymd date)
RETURNS TABLE (a numeric
			   , b integer
			   , c integer)
AS $$
-- 戻り値：a(コメント)、b(コメント)、c(コメント)
DECLARE
one_rec         RECORD;

cur_data cursor(in_ymd date) is

    -- ～SQL文～
    ;    

BEGIN
	FOR one_rec IN cur_data($1) -- C#のforeachみたいにcur_dataから1行ごどに出して処理する
	LOOP                        -- LOOPからEND LOOP内の内容を繰り返す
            IF NOT FOUND then   -- もしcur_dataに何も入ってない場合のデフォルト値
                a := 0;
                b := 0;
                c := 0;
            ELSE
                a := one_rec.a;  -- ３つのデータを上で宣言した変数に入れる
                b := one_rec.b;
                c := one_rec.c;
            END IF;
		RETURN NEXT;             --　結果集合(塊)に1行を追加する、LOOPが進めて行くと共に結果集合に行が増える
	END LOOP;    
	RETURN;                      -- 結果集合を戻り値で返す
END;
$$ LANGUAGE plpgsql;
```
functionを使用して処理をプログラム側とデータベース側で分ける事ができ、選択地は増えました。
だが逆にどこまでプログラム側で処理して、どこまでDB側でやるかを決めるのが難しいです。
function処理はデバックで追いかけるのができない？と聞いてるのでC#みたいにエラーの原因探りも難しいそうです。
経験を積むしかないのかと思います。
参考：https://qiita.com/ester41/items/3401606322888a0a7f21
　　　https://eatsmart.hatenablog.com/entry/2019/03/01/155838
Makefileでコマンド管理

# 1.はじめに
みなさん、Makefileをご存知でしょうか？
僕は独学で勉強していた際に、Makefileという便利なファイルを知りました。
簡単にいうと、（プロジェクトごとに）コマンドにエイリアスをつけて、呼び出せます！
是非、広まってほしいと思い、記事にすることにしました。

# 2. Makefileとは

元々はC言語で使われていたファイルで、依存関係の管理、インストールなどのルールを記述しておくためのファイルだそうですが、
その性質を利用して、コマンドにエイリアスをつけて、呼び出せます。

以下は実際に僕が使っているMakfileになります（プロジェクト直下に置いてます）。

```makefile
.PHONY: up lint format install uninstall

up:
	docker-compose up

lint:
	docker-compose run --rm next npm run lint:fix

format:
	docker-compose run --rm next npm run format

install:
	docker-compose run --rm next npm install ${P}

uninstall:
	docker-compose run --rm next npm uninstall ${P}
```

これを呼び出すときは
```
$ make up
```
でdocker-compose upが実行されます。


コマンドの内容を動的に変えたい場合は、
make installで説明すると
```
$ make install P=@mui/material
```
と渡すことができます。

# 3.最後に
いかがでしょうか？
Makefileにプロジェクト毎によく使われるコマンドを記載しておけば、
ターミナルでの作業が効率化でき、
別の人がプロジェクトに参画した際にも、コマンドのマニュアルになるので、
いいことづくめだと思います！
もっと広まってほしい、、、
Go言語 ゴルーチン

## ゴルーチン
ゴールーチンと呼ばれる、スレッドを用いて並行処理を行う機能。
関数に「go」を付加することで、その関数は並行的に処理される。

## Code
```Go
// 素数をチェックする関数
func checkPrime(number int) bool {
	isPrime := true
	if number == 0 || number == 1 {
		return false
	} else {
		for i := 2; i <= number/2; i++ {
			if number%i == 0 {
				isPrime = false
				break
			}
		}
		if isPrime == true {
			return true
		}
	}
	return false
}

// 素数を生成する関数
func primeRoutine1() {
	i := 0
	for {
		i += 1
		if checkPrime(i) {
			fmt.Printf("PrimeRoutine1 ☆ : %d\n", i)
		}
	}
}

// 素数を生成する関数
func primeRoutine2() {
	i := 0
	for {
		i += 1
		if checkPrime(i) {
			fmt.Printf("PrimeRoutine2 ◇ : %d\n", i)
		}
	}
}

// 素数を生成する関数
func primeRoutine3() {
	i := 0
	for {
		i += 1
		if checkPrime(i) {
			fmt.Printf("PrimeRoutine3 ◯ : %d\n", i)
		}
	}
}

// 素数の生成を非同期処理
func main() {
	
	// ゴルーチンによる非同期処理
	go primeRoutine1()
	go primeRoutine2()
	go primeRoutine3()

	for {
		// mainを駆動させ続けるための無限ループ
	}
}
```

## Output Sample
~ $ go build main.go  
~ $ ./main  
  
 ~ 省略 ~   
  
PrimeRoutine3 ◯ : 493211  
PrimeRoutine3 ◯ : 493217  
PrimeRoutine2 ◇ : 492799  
PrimeRoutine1 ☆ : 493211  
PrimeRoutine3 ◯ : 493219  
PrimeRoutine1 ☆ : 493217  
PrimeRoutine2 ◇ : 492839  
PrimeRoutine3 ◯ : 493231  
PrimeRoutine1 ☆ : 493219  
PrimeRoutine2 ◇ : 492853  
PrimeRoutine1 ☆ : 493231  
PrimeRoutine3 ◯ : 493243  
PrimeRoutine2 ◇ : 492871  
PrimeRoutine1 ☆ : 493243  
PrimeRoutine3 ◯ : 493249  
PrimeRoutine2 ◇ : 492883  
PrimeRoutine1 ☆ : 493249  
PrimeRoutine3 ◯ : 493277  
PrimeRoutine2 ◇ : 492893  
PrimeRoutine3 ◯ : 493279  
PrimeRoutine1 ☆ : 493277  
  
 ~ 省略 ~  

## GitHub
https://github.com/GL-Kageyama/Go_Goroutine
【Blue Prism】対象ウィンドウのちょうど真ん中をクリックする方法

# はじめに

テキストボックス等に入力後、フォーカスを外したいと思ったことはありませんか？
この記事では、フォーカスの外し方としてBlue Prismでウィンドウの真ん中をクリックする方法をご紹介します。

# 前提
バージョン
Blue Prism v6.8.0

# グローバルマウスクリック（中央）を使おう

操作ステージを用意します。
![オブジェクトスタジオ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626430/a058e18c-27ce-2cf0-cfcc-f54fb8b453c9.jpeg)

操作ステージで、下記のように指定します。
- 要素： Win32モードでスパイしたウィンドウ
- アクション：グローバルマウスクリック（中央）
![操作ステージ_赤枠あり.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626430/5484d9da-e55e-8df3-b8fd-d29836dc976e.jpeg)

# 真ん中がクリックされたことを確かめる

ここでは、動作確認のため、クリックされた座標をテキストボックスに出力するウィンドウで確認します。
ウィンドウ左上の赤丸の位置が、(X, Y) = (0, 0)となる座標です。
![確認用ウィンドウ_赤枠あり.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626430/cf150de8-e2b3-e0c4-217c-8c0dced9fbc2.jpeg)
## 中央をクリックする
カーソルがウィンドウの中央に移動し、クリックされた座標が、テキストボックスに表示されました。
X、Yともに下記の式に当てはまり、それぞれ高さ、幅の半分の値となり、ちょうど真ん中がクリックされたことがわかります。

X（水平）座標は、幅の半分   [ X = 0.5 * Width - 8 ]
Y（垂直）座標は、高さの半分 [ Y = 0.5 * Height - 31 ]
※切片-8、-31については、この確認用ウィンドウ固有の値のため、ウィンドウにより異なります。
![カーソルあり_赤枠あり.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626430/a168c38a-75cf-7627-39a7-04f08960e9e6.jpeg)

# まとめ
* ウィンドウの中央をクリックするには、操作ステージのアクションで、**グローバルマウスクリック(中央)** を使用する。

# 注意点
* ウィンドウのちょうど真ん中にリンクやボタンが配置してある場合は、以下の点について注意して下さい。
  * ウィンドウの真ん中にリンクやボタンがあると、それをクリックし、別ウィンドウに移動したり、他のアクションが発生してしまうので、実際に動かして確認して下さい。
  * このアクションでリンクやボタンをクリックしてしまう場合は、ウィンドウのサイズを変更することにより解決する場合もあります。
  * フォーカスを移動させたい場合は、TABキーをグローバルキー送信する方法もあります。
Kintoneでプラグインを開発するに当たって。

Kintoneでプラグインを開発しようと思い、どのようなプラグインを開発すれば顧客が求めているものが出来そうかを実際に運用されているプラグインをもとにどんなものがあれば便利か調べてみました。

## ・　指定した日付を取得できる日付計算。
## ・　Kintoneのデータをエクセルやワードで出力できるようにする。
## ・　アプリやレコード内のテーブルデータを一括で他のアプリに転送できる機能。
## ・　入力フォームの表示・入力を制御する。
## ・　レコード一覧画面のステータスを一括で更新する。
## ・　レコードの集計と結果をアプリ内に書き込めるようにする。
## ・　レコード一覧画面で検索窓を表示することができる。
## ・　レコードの作業者を一括で更新できる。
## ・　アプリ内のデータを一括で変更更新ができる。
## ・　ルックアップフィールド間でコピーがやり取り出来てコピー先で編集できる。
別アプリのデータを各フィールドにコピーできる。

## ・　住所を入力すると地図が表示され、軽度と緯度が取得できる。
地図上の登録したい場所をタップするとクリックした位置の座標と住所を取得し登録することができる。外出先で現在地登録に便利。

## ・　一覧画面をエクセルのように編集できる。
業務系のアプリでマスタデータを一つずつ呼び出してレコードを編集する作業は、レコードを開き→編集ボタンを選択→入力して保存すると大変。着手・未着手などステータス毎に分けてタスク管理する場合に便利。

## ・　ルックアップにアプリタブを付与。
現場の人の効率を上げるために、ルックアップの取得ボタンの横にアイコンを表示させて、クリックでルックアップもとの顧客管理アプリを別タブで開けるその場で顧客管理が開く。別タブで自動に表示させて作業効率向上。

## ・　レコードの新規登録時に必要な行数と値を初期表示
書類の期日管理、現場の作業工程管理をスムーズにするために毎回テーブル内にレコードを追加してサブテーブルに入力したり、レコードを再利用して上書きする手間を省く。

## ・　自動採番(データ管理のために、データに固有の番号を自動で与える)
関連レコードの機能を使う上で、紐づけるためのキーを手動で入力すると漏れが生じるミスを無くす。

## ・　検索窓をアプリ内に表示させて、使いやすくする。
Kintoneの標準機能で絞り込みはあるが、検索結果の表示が変わるのと必要ない情報が入ってくるので不便。絞り込み検索条件はKintone仕様で縛りがあるので注意。

## ・　エクスポート不要でアプリ内レコードを別アプリにコピーする機能。
レコードを他のアプリに移すためには出力して取り込む作業をCSVで処理しなくてはならないのを改善。

## ・　ルックアップしている参照先のデータを自動更新。
会社名変更時に顧客のマスタデータを変える時など、紐づいているルックアップ先の他のアプリの顧客名は変わらないので自動で変えれるようにする。

## ・　フィールド内の入力内容によって他のフィールドを制御したりできる。
チェックボックスで1と2があったとして1が選択されたら、このフィールドは表示しないとか、ドロップダウンでAを選択したらBの表示がでるような条件計算ができる。

と、幅広いプラグインが既に開発されているが各業態で求めている部分はもちろん変わってくるので、それも踏まえて開発していきます。
push　配列の末尾に追加　JavaScript

## 用途
・配列の末尾に値や要素を追加したいときに使用する。

## 使用方法
```js:書き方
var array = 配列;
array.push( 追加したい要素, 追加したい要素, 追加したい要素...... );
```
`配列` + `.（ドット）` + `push` で繋ぎ、`()` で追加する要素を囲う。
追加する要素は、複数でも可能。また、数値・文字列・オブジェクトなど多様な要素の追加が可能。

```js:例
var hoge = [hoge1, hoge2];
hoge.push(hoge3, hoge4, hoge5);

console.log(hoge);

結果
[hoge1, hoge2, hoge3, hoge4, hoge5];
```

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

:::note warn
注意
連想配列では使えない
:::

```js:例
var hoge = { class:'A', color:red };
hoge.push(['B', green]);

console.log(hoge);

結果
Uncaught TypeError: obj.push is not a function
```

## その他
配列の「要素数」を返してくれる。
```js:例
var hoge = [hoge1, hoge2, hoge3, hoge4, hoge5];
var hoge_length = hoge.push(); //要素数を取得
 
console.log(hoge_length);

結果
5
```
　
　
　
この記事は以下の情報を参考にして執筆しました。
・https://www.sejuku.net/blog/84475
初心者がGoを学ぶときに気になったことメモ

最近のはやりに乗って、GoとBlockchainの両方をこの動画（シリコンバレーエンジニアの酒井潤さんの「現役シリコンバレーエンジニアが教えるGoで始めるスクラッチからのブロックチェーン開発入門」https://www.udemy.com/course/go-blockchain/
）を見て勉強し始め、ここ最近終了したところなのだが、なんせbackendもblockchainもまるで初心者なもので、この動画を通してGOの理解しにくかった部分を自分なりにかみくだいてアウトプットしていこうと思う。僕のようにバックエンド完全初心者の手助けになれば幸いです


# MarshalJsonって何？

MarshalJsonというのは、構造体→JSON形式に変換することらしい。
(逆にUnMarshalJsonというのは、JSON形式→構造体に変換すること)

しかし、この講座をみていると、少し不思議な書き方をしていた。


```golang:blockchain.go
type Block struct {
	timestamp    int64
	nonce        int
	previousHash [32]byte
	transactions []*Transaction
}

func (b *Block) MarshalJSON() ([]byte, error) {
	return json.Marshal(struct {
　　　　　　　　　　//型　　　　　　　//json上における名前　
		Timestamp    int64          `json:"timestamp"`
		Nonce        int            `json:"nonce"`
		PreviousHash string         `json:"previous_hash"`
		Transactions []*Transaction `json:"transactions"`
	}{　　　　　　　　
　　　　　　　　　　　//入れたい値
		Timestamp:    b.timestamp,
		Nonce:        b.nonce,
		PreviousHash: fmt.Sprintf("%x", b.previousHash),
		Transactions: b.transactions,
	})
}

```

"encoding/json"というパッケージの中にMarshalという関数があるのに、わざわざMarshalJsonという関数をつくっている。（しかも少し複雑な書き方で）

これが何なのか調べたところ、プログラムと実際のJson内で異なる型を使いたいときがあるとき、このようにひと手間加えてMarshalJsonするらしい。







# sync.Mutexという謎の型

こんな記述があった
```golang:blockchain.go

func (bc *Blockchain) SyncNeighbors() {
	bc.muxNeighbors.Lock()
	defer bc.muxNeighbors.Unlock()
	bc.SetNeighbors()
}

```

なんやら排他制御を行いたいときに、使うらしい。
理解してしまえば簡単だが、並列処理などで処理の衝突（当時に同じ配列を書き換える、など）を防ぐために、
Lockでその変数に鍵をかけ一つだけしか処理をできないようにし、
deferで関数の最後にUnlockをして、鍵を開けているということらしい




# httpリクエストを飛ばす方法
少しできる人からしたら簡単なことだろうが、まったく知らなかったのでメモ。


```go
// request structの作成
req, _ := http.NewRequest(
    "Post",
    "https://test",
    bytes.NewBuffer([]byte("request body"),
)
// そのheaderを指定
req.Header.Add("Content-Type", "application/json")

// クライアントを初期化
var client *http.Client = &http.Client{}
//今回の動画見る感じ、これでも行ける？
client := &http.Client{}

// そこからリクエストを飛ばす
resp, _ := client.Do(req)

// そのリスポンスをprint
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))


```



エンドポイントをいじりたいときは、


```go
方法１（結合）
base, _ := url.Parse("https://test/mypage/")
reference, _ := url.Parse("myPicture?a=1&b=2")
endpoint := base.ResolveReference(reference).String() // URLを結合する


方法２（変数名を入れる）
endpoint := fmt.Sprintf("http://%s/transactions", n)

```
こんな感じで少しいじってやる。



# flag

コマンドライン引数を指定できる。
今回だとこんな感じで、port番号とgatewayを指定していた。

```go

func main() {
	port := flag.Uint("port", 8080, "TCP Port Number for Wallet Server")
	gateway := flag.String("gateway", "http://127.0.0.1:5000", "Blockchain Gateway")
	flag.Parse()

	app := NewWalletServer(uint16(*port), *gateway)
	app.Run()
}

```


また、気になったことがあれば随時更新していきます。






講義を受けている途中はちんぷんかんぷんだったが、この記事を書くにつれ頭の中でまとまって、Goを割と理解できるようになってきたきがする。サーバサイドあたりの知識が弱いのでこれからもGo書きながらいろいろと勉強していきたい。今度はgoでDappsとか作ってみたいな。
Dartでenumの値を指定する

# 2022/05/13追記
Dart 2.1.17から標準で以下の書き方ができるようになりました。 (@Cat_sushi ありがとうございます)

```dart
enum Water {
  frozen(32),
  lukewarm(100),
  boiling(212),
}
```

参考
https://medium.com/dartlang/dart-2-17-b216bfc80c5d#72da

# 旧記事
TypeScriptとかだと、↓こんな感じにできて便利なんですが、DartだとExtensionを作る必要があるようです。
数値の方がDBに格納されている場合に、enumの並び順を変更して値が変わると困るので。
 
```typescript
enum MyColor {
 red = 1,
 green = 100,
}

```

```Dart
enum MyColor {
  red,
  green
}

extension MyColorExtension on MyColor {
  int get id {
    switch (this) {
      case MyColor.red:
        return 1;
      case MyColor.green:
        return 100;
    }
  }
}
```
2元１次不定方程式( indefinite equation?)＜3/4＞「2022年度 大学入学共通テスト 本試験｜数学Ⅰ第4問」(配点20点)sympyのdiophantineで

つづき

https://qiita.com/mrrclb48z/items/53d66ad6a5ef6a3d01e4


# 考察を使っていません。sympyのdiophantineで

32行で(配点20点)でした。100行書けば、2022共通テスト満点とれるかも。
a shift of origin(原点の移動:deepL翻訳より)と言うそうです。
```python
from sympy import *
from sympy.abc import x, y
from sympy.solvers.diophantine import diophantine
var('x')
myFormula1= 5**4*x-2**4*y-1
myFormula2= 5**5*x-2**5*y-1
myFormula3=11**5*x-2**5*y-1
def diox(eq, x):
    s = diophantine(eq)
    assert len(s) == 1
    a, b = s.pop()
    p = a.free_symbols
    assert len(p) == 1
    p = p.pop()
    i = solve(a >= x).as_set().intersection(Integers)
    if i.start.is_infinite:
        i = i.sup
    else:
        i = i.start
    t = Tuple(a, b).xreplace({p: i})
    e = Tuple(a, b).xreplace({p: Symbol('n')+i-1})
    return t, e
print("#(1)アイウ　　　　　",diox(myFormula1,  0)[0])
print("#(1)エオカキク　　　",diox(myFormula1, 10)[0])
print("#(2)ケコ　　　　　　",solve(Eq(625**2,5**x)) )
print("#(3)サシスセソタチツ",diox(myFormula2,100)[0])
print("#(4)テトナニヌネノ　",diox(myFormula3,  0)[0])
#(1)アイウ　　　　　 (1, 39)
#(1)エオカキク　　　 (17, 664)
#(2)ケコ　　　　　　 [8]
#(3)サシスセソタチツ (125, 12207)
#(4)テトナニヌネノ　 (19, 95624)
```

# 参考

教えてもらいました。

https://stackoverflow.com/questions/71761022/i-want-sympy-gcdexax-by-c-this-is-a-linear-diophantine-equation


# つづく　＜4/4＞　へ

https://qiita.com/mrrclb48z/items/03ac47c624f39c1d67a0
SharePoint 基本設定 権限設定編

# SharePointについて

SharePointのリストやドキュメントサイトにはインターネットから簡単にアクセスできるのはとても便利です。
一方で、適切に接続を制限することもセキュリティの観点から必須要件です。
SharePointへのアクセスレベルには幾つか種類があるため、
本記事を参考にして設定してみましょう。

[SharePoint 基本設定 チームサイト作成編](https://qiita.com/mikaka360/items/99b56ad91c3ba14912d7)

## 権限の種類

デフォルトで用意されている権限はざっと以下のようになっています。

|内容|フルコントロール(所有者)|デザイン|編集(メンバー)|閲覧|制限付きビュー|
|--|:--:|:--:|:--:|:-:|:-:|
|権限管理|○||||
|サイト作成|○||||
|ページの追加|○|○||
|グループの作成|○||||
|リスト/ドキュメントの作成と編集|○|○|○|||
|ドキュメントのダウンロード|○|○|○|○||
|リスト/ドキュメントの表示|○|○|○|○|○|

一般的な例になりますが、情報システム部門のSharePoint運用管理者は`フルコントロール`を設定すべきでしょう。※サイト作成者はデフォルトでこの権限を持ちます。
経理のためのSharePointサイトなら、経理の従業員皆を`編集(メンバー)`の権限に設定すべきです。

社外の人も参加するプロジェクトであれば、外部ユーザーとして権限を追加する必要があります。`編集(メンバー)`か`閲覧`がおすすめです、`閲覧`ならダウンロードも可能です。
ただし、外部に不用意に情報を流出させたくないなら、`制限付きビュー`を選びましょう。

これらはデフォルトで用意されている権限ですが、
サイトやファイル単位で個々に設定を行うことも可能です。
ただし複雑にならないようできるだけシンプルな権限設計にしたほうが良いです。

## 権限の設定方法 (SharePointグループ編)

フルコントロール(所有者)/編集(メンバ)の権限は、
SharePointを作成したときにデフォルトで作られるSharePointグループによるものです。
このグループにアカウント(メール)を追加することで適切な権限になります。

サイトの歯車アイコン上から簡単に行えます。

歯車アイコンの「設定」から、「サイトのアクセス許可」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123580/fdaf089d-7037-eff9-db64-0b1d019e8784.png)

「メンバーの追加」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123580/ab59eccd-67ec-50da-729b-633fd40e5b6b.png)

「メンバーをグループに追加する」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123580/cbcce321-e3d7-fa60-bc28-d08652b68b25.png)

同じMicrosoft365テナントのユーザーならメールアドレスを指定し、
外部のメールアドレスならOutlookの画面に移動しますが、そこから追加しましょう。

## 権限の設定方法 (高度なアクセス許可)

より細かい設定を行ってみましょう。
もう一度歯車アイコン「設定」から、「サイトのアクセス許可」をクリック。
その後、画面下部の「高度なアクセス許可」をクリックしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123580/002ea362-81e1-b988-9bd7-6eeaa449bbaa.png)

権限設定ページに遷移できました。
このページでは
①権限グループを作成
②メンバーを追加
を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123580/b7ecfa31-a5d3-03e3-5e4e-2917749224b7.png)

### 権限グループを追加

「グループの作成」をクリックし、グループの作成画面に移動
グループの名前とグループの権限を設定しましょう。
画面のサンプルでは、「閲覧」にしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123580/7cea3c94-438d-db55-1131-2539f2f537c8.png)


### メンバーを追加

作成したグループの「新規」＞「ユーザーの追加」をクリック。
追加するユーザーのインビテーションが送れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123580/c18ff7ec-7221-4778-9a1d-858e501980f5.png)


完了！！
[Kotlin]JetpackComposeで日付入力ダイアログを表示する

# 概要
Kotlinの日付入力ダイアログ(DatePickerDialog)をJetpackCompose内で使うサンプルコードです。
![スクリーンショット 2022-04-07 8.11.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/1c2007ef-ab61-f1c9-52f8-d3a29af92031.png)

# 本文
ダイアログを表示する部分

```kotlin
// 日付入力ダイアログを表示する
fun showDatePicker(
    context: Context,
    onDecideDate: (String, String, String) -> Unit,
) {
    val calendar = Calendar.getInstance()
    val year = calendar.get(Calendar.YEAR)
    val month = calendar.get(Calendar.MONTH)
    val day = calendar.get(Calendar.DAY_OF_MONTH)
    calendar.time = Date()

    DatePickerDialog(
        context,
        { _: DatePicker, pickedYear: Int, pickedMonth: Int, pickedDay: Int ->
            onDecideDate(pickedYear.toString(), (pickedMonth + 1).toString(), pickedDay.toString())
        }, year, month, day
    ).show()
}
```

ダイアログを呼び出す部分(JetpackCompose)

```kotlin
@Composable
fun DatePickerSample() {
    val context = LocalContext.current
    val inputYear = remember { mutableStateOf("") }
    val inputMonth = remember { mutableStateOf("") }
    val inputDay = remember { mutableStateOf("") }

    Column() {
        Button(onClick = {
            showDatePicker(
                context,
                onDecideDate = { year, month, day ->
                    run {
                        inputYear.value = year
                        inputMonth.value = month
                        inputDay.value = day
                    }
                }
            )
        }) {
            Text(text = "日付取得")
        }

        Text(text = inputYear.value + "年" + inputMonth.value + "月" + inputDay.value + "日")
    }
}
```
# 補足
このサンプルコードはこちらのYouTube動画を参考にして手を加えたものです
https://www.youtube.com/watch?v=cJxo96eTHVU

# 補足2
DatePickerDialogで得られる月は1少ないので1を加えています:raised_hands:
AWS公式資料で挑むSCS認定(31)-こんな時どうする(全分野その8)

##### [前回] [AWS公式資料で挑むSCS認定(30)-こんな時どうする(全分野その7)](https://qiita.com/mingchun_zhao/items/ac0d7999eaee4f443dd1)

## はじめに

今回も引き続き、「こんな時どうする」集の作成です。

## 分野1: インシデント対応

- 特定IPアドレス範囲からウェブサイトへ大量リクエストが確認された、拒否リストに登録せずアクセス頻度のみ制限したい
    - AWS WAFのレートベースのルールを使用
    - レートベースルールのIP許可リスト条件で、ソースIPアドレス範囲から単位時間内のリクエスト数を制限
    - 制限を超えた場合、新しいリクエストはリクエストレートが設定されたしきい値を下回るまでブロックされる

## 分野2: ログとモニタリング(監視)

- 自分のAWSアカウントで実行されたすべてのAWS WAF API呼び出し履歴を取得したい
    - AWSアカウントのAWSマネジメントコンソールでAWS CloudTrailを有効に設定
    - セキュリティ監視、コンプライアンス監査に必要なAWS WAF API呼び出し履歴がすべて記録される

- CVE(Common Vulnerabilities and Exposures)に含まれたアプリケーション脆弱性を悪用した、外部からのセキュリティ攻撃を受けていないか監視したい
    - AWS WAFで事前設定されたマネージドルールをデプロイし使用
    - マネージドルールは、CVE、OWASP、ボットなどアプリケーション脆弱性による脅威からアプリケーションを保護
    - マネージドルールは、AWS Marketplaceセキュリティ販売者によって自動的に更新される

## 分野3: インフラストラクチャのセキュリティ

- AWSにホストされていないウェブサイトを保護したい
    - Amazon CloudFrontは、AWS外のカスタムオリジンをサポート
        - CloudFrontディストリビューション作成時、カスタムオリジンを使用し、ファイルリクエストの送信先を独自のHTTPウェブサーバーに指定
    - Amazon CloudFrontと統合されているAWS WAFを使用しウェブサイトを保護

- 監査要件を満たすか評価/検証するため、監査人からシステム開発のセキュリティ制御に関する証拠を求められた
    - AWS Artifactの監査アーティファクトレポートを、コンプライアンス評価の証拠として提供
    - ※ 監査アーティファクトとは、組織が文書化プロセスに従っていること、または特有の要件を満たしていることを示す証拠
        - システム開発のライフサイクル全体で収集およびアーカイブされ、内部および外部向けの監査や評価における証拠として使用可能

- 企業がHIPAA(Health Insurance Portability and Accountability Act)対象となり、規制の遵守を求められた
    - AWS Artifact Agreements(契約)の事業提携契約(BAA)を使用
    - ※ AWS Artifact Agreementsとは、監査およびコンプライアンスポータル機能で、AWS Organizations全アカウントおよび個々のアカウントにおけるAWSとの契約を確認、受諾、管理できる
        - AWS Artifact機密保持契約(NDA)の規約を受諾する必要あり。各契約は機密で外部と共有不可
        - 以前受諾した契約が不要になった場合、AWS Artifactを使用し終了可能
    - ※ HIPPAとは、1996年に制定された米国における医療保険の相互運用性と説明責任に関する法令、米国の労働者が転職または失業したときに健康保険に加入できるようにすることを目的とした法律

## 分野4: アイデンティティ(ID)及びアクセス管理

- ABAC(属性ベースのアクセス制御)を使用しアクセス制御を行いたい
    - まずアクセス制御に使用するタグのキーと値を定義
    - IAMロールに適切なタグを割り当てる
        - 複数IDが同じIAMロールを使用する場合は、セッションにタグを割り当てる
    - リソースに適切なタグを割り当てる
        - リソースの作成/変更時に適切なタグを割り当てるよう要求できる
    - ポリシーを定義し、ロールタグまたはセッションタグがリソースタグと一致する場合のみアクセス許可
    - ※ ABACとは、属性に基づいて許可を定義する認可戦略
        - 属性はタグと呼ばれ、AWSリソース、IAM ロール、ロールセッションで定義することができる

## 分野5: データ保護

- AWS責任共有モデルに基づき、データ保護を実施したい
    - AWSが、AWSクラウドのすべてが実行される、グローバルインフラストラクチャの保護に責任を持つ
    - ユーザーが、AWSインフラストラクチャにホストされる、コンテンツの管理/維持に責任を持つ
        - 保管/転送中データの保護(暗号化など)
        - AWSサービスのセキュリティ設定と管理タスク

- データ保護の対策として、AWSアカウントの認証情報を保護し、IAMを使って必要なアクセス許可のみユーザーに付与するよう指示された
    - 以下の方法でデータを保護
        - 各アカウントで多要素認証(MFA)を使用
        - SSL/TLSを使用しAWSリソースと通信(TLS 1.2以降を推奨)
        - AWS CloudTrailでAPIとユーザーアクティビティログをセットアップ
        - AWS暗号化ソリューションをAWSサービス内のすべてのデフォルトのセキュリティ管理と併用
        - Amazon Macieなどアドバンストマネージドセキュリティサービスを使用し、Amazon S3保存の個人データ保護を支援
        - CLI(コマンドラインインターフェイス)またはAPIを用いたAWSアクセスで、FIPS 140-2検証済みの暗号化モジュールが必要な場合は、FIPSエンドポイントを使用

## おわりに

「こんな時どうする」の追記でした。
次回も続きます、お楽しみに。

##### [次回] [AWS公式資料で挑むSCS認定(32)-こんな時どうする(全分野その9)](https://qiita.com/mingchun_zhao/items/22adf680b663c1ebde7b)
Java 17 (OpenJDK: Eclipse Temurin) を Homebrew で macOS にインストールする

## 概要

- Java 17 (Eclipse Temurin 17) を Homebrew で macOS にインストールする。

## 今回の環境

- macOS Big Sur 11.6

## インストール

インストール方法は Eclipse Temurin の前身である AdoptOpenJDK の公式資料が参考になる。

[GitHub \- AdoptOpenJDK/homebrew\-openjdk: AdoptOpenJDK HomeBrew Tap](https://github.com/AdoptOpenJDK/homebrew-openjdk)

```
$ brew tap homebrew/cask-versions
$ brew install --cask temurin17
```

## java_home コマンドでインストールされたディレクトリの場所を確認

```
$ /usr/libexec/java_home -v 17
/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home
```

## 環境変数 JAVA_HOME と PATH を設定

環境変数 JAVA_HOME と PATH を設定する。

```
$ export JAVA_HOME=/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home
$ PATH=${JAVA_HOME}/bin:${PATH}
```

これらは必要に応じて .zprofile や .zshrc などにも記述する。

## インストールした Eclipse Temurin を確認

```
$ java --version
openjdk 17.0.2 2022-01-18
OpenJDK Runtime Environment Temurin-17.0.2+8 (build 17.0.2+8)
OpenJDK 64-Bit Server VM Temurin-17.0.2+8 (build 17.0.2+8, mixed mode, sharing)
```

```
$ javac --version
javac 17.0.2
```

```
$ which java
/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home/bin/java
```

```
$ which javac
/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home/bin/javac
```

```
$ ls /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home/bin 
jar             javap           jdeps           jlink           jrunscript      keytool
jarsigner       jcmd            jfr             jmap            jshell          rmiregistry
java            jconsole        jhsdb           jmod            jstack          serialver
javac           jdb             jimage          jpackage        jstat
javadoc         jdeprscan       jinfo           jps             jstatd
```

## 参考資料

- [Eclipse Temurin \| Adoptium](https://adoptium.net/temurin)
- [homebrew\-cask\-versions/temurin17\.rb at master · Homebrew/homebrew\-cask\-versions · GitHub](https://github.com/Homebrew/homebrew-cask-versions/blob/master/Casks/temurin17.rb)
- [GitHub \- AdoptOpenJDK/homebrew\-openjdk: AdoptOpenJDK HomeBrew Tap](https://github.com/AdoptOpenJDK/homebrew-openjdk)
- [Java 11 \(OpenJDK: Eclipse Temurin\) を Homebrew で macOS にインストールする \- Qiita](https://qiita.com/niwasawa/items/4b817f1a8692e15141dc)
記事のフォーマット - 継続更新中

# 初めに

アウトプットをするためにQiita書けって勧められたけど、どうしていいかわからない。私も１時間前まではそうでした。

![PAK86_miagerebamidori1226.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1160079/170d56a0-4129-8b8f-81b8-70be1cde8708.png)


## 何を書いたか？ 

Qiitaを投稿するときのフォーマットを作成しましたので、記事にします。

## なぜ書いたか？

私は初めてQiitaの記事を書こうとすると、まず文章構成に悩みました。次に悩んだのは、マークダウン以外のよく使うこれってどうするの？で検索するのはあまりにも効率が悪いので、記事を書くたびに学んだことを追加しようと考えました。

## 記事を読んでわかること

* Qiitaを初めて書く方はフォーマットとしてご利用ください。

# フォーマット例

下記にフォーマット例を示します。継続的に更新していますので、あれ？前と違うという点についてはご容赦ください

```
# 初めに

<アイキャッチ用の画像を挿入>


## 何を書いたか（本題が短い場合は不要）

＜本題の要約＞

## なぜ書いたか？

＜状況や目的、対象読者＞

1. 
2.
 
## 記事を読んでわかること

<読者へ伝えたいこと、共有することに価値があると感じること>
1.  

---
# 本題

＜本題が大きい場合はTopicに分割＞

こういう風に<font color='red'>色を使ってみよう</font>。

---

# オススメな例１

インラインでコードブロックを使うときは　`改行`
複数行でコードブロックを使うときは　```改行```
---

# オススメな例2

---

# 結論

* 

---

# 参考文献

```

# 参考文献

https://qiita.com/t12u/items/8c28484100dfd3a6351b

https://help.qiita.com/ja/articles/qiita-image-upload
gcc ってなに？

## 勉強前イメージ

C言語書くときに使うなにかってイメージ・・・
あんまりよくわかってないけど入れてた

## 調査

### gcc とは

GNU Compiler Collection の略で、
GNUプロジェクトが開発・公開しているコンパイラです。
元々はGNU C Compilerを意味していましたが、
今はC言語だけじゃなく、JavaやGoなど様々な言語のコンパイラを集めたパッケージとなっています。
gccはGNU Public Licenseというライセンスでオープンソースとして公開されています。

### gccの動き

gccがすべて行うというわけではなく以下を行う際に外部のコマンドを呼び出したりしています。

- プリプロセッサディレクティブを処理
- アセンブリ言語の形式に一括して変換
- 機械語に変換
- オブジェクトコードを連結、実行可能ファイルを作成

## 勉強後イメージ

元々C言語のコンパイラだったけど、他の言語のコンパイラも入ってきたパッケージってことか。
あんま言語使ったことないから知らんかったけどGNUなんですね。
なんかよく聞くよね、GNU

## 参考

- [gcc 【GNU Compiler Collection】 GNU C Compilier](https://e-words.jp/w/gcc.html)
- [gcc](https://kaworu.jpn.org/c/gcc)
2022/4/7主にITとかセキュリティの記事

「GitLab」にアカウント奪取が可能となる脆弱性 - 早急に更新を
https://www.security-next.com/135490

フィッシングURLやブランド悪用が過去最多 - 報告は8万件超に
https://www.security-next.com/135498

Fortinet、「OpenSSL」脆弱性判明受けてアップデート - 「Spring4Shell」の影響は調査中
https://www.security-next.com/135479

「CODE BLUE 2022」、10月にハイブリッド開催 - 今年で10回目
https://www.security-next.com/135512

「ウイルスバスター for Mac」に権限昇格の脆弱性
https://www.security-next.com/135524

不正アクセスでメアド流出の可能性 - 岡山県医師会
https://www.security-next.com/135415

サイバー攻撃　企業は脅威への備え急ぎたい(4/4)
https://www.yomiuri.co.jp/editorial/20220403-OYT1T50205/

中小企業の3割がセキュリティ対策未実施　IPAが実態調査の結果を公開(4/4)
https://enterprisezine.jp/news/detail/15804

コニカミノルタ、英子会社が不正アクセス被害(4/5)
https://www.nikkei.com/article/DGXZQOUC050RP0V00C22A4000000/

防衛産業のサイバー基準強化　5年度以降の受注契約(4/4)
https://mag.executive.itmedia.co.jp/executive/spv/2204/04/news057.html

Microsoft Defender、脆弱なドライバをブロックする新オプション(4/4)
https://news.mynavi.jp/techplus/article/20220404-2312525/

【Eye Spy】スパイ大国アメリカも戦慄ネットを遮断してもハッキングできる「最恐スパイツール」を中国が完成させていた(4/4)
https://courrier.jp/cj/283960/?utm_source=newspicks&utm_campaign=283960

GAFA撤退でロシアのネット空間はどうなる？ 「IT鎖国の先輩」中国の例から考える(4/5)
https://diamond.jp/articles/-/300331

中小企業がセキュリティ対策投資を行わない理由、「必要性を感じていない」が最多の40.5%に(4/5)
https://s.netsecurity.ne.jp/article/2022/04/05/47410.html

貴重な書籍画像520万枚がインターネット・アーカイブの公式アカウントごとFlickrに突如削除されて消滅(4/5)
https://gunosy.com/articles/eRcFv

謎のCSVコンバータ、未完のViewer、依存関係可視化ツール　私がRustを使って作った3つのプロダクト
https://logmi.jp/tech/articles/326358

zlibに17年前から存在し4年前から放置の脆弱性、修正(4/5)
https://www.zaikei.co.jp/article/20220405/667169.html

EU、ビッグテック規制の｢デジタル市場法｣合意でアドテク業界への影響は？ GAFAを利する結果を懸念する声も(4/5)
https://www.businessinsider.jp/post-252438

中学生のSNS利用率は9割、小学生低学年ではTikTokが浸透 - ドコモ調査(4/4)
https://nordot.app/883598454175891456?c=113147194022725109

NEDO、ドローン向けサイバーセキュリティ指針を公開(4/5)
https://ascii.jp/elem/000/004/088/4088333/?rss

【独占】規制とイノベーション。アップル重役が語る、目指すべき最良の顧客体験(4/5)
https://www.pen-online.jp/article/010365.html

仮想の土地売買だけじゃない！The Sandboxで稼ぐ人のアセットを制作・販売する方法(4/6)
https://gunosy.com/articles/ahCmZ

今月の用語解説「セキュリティーキーとは」(4/4)
https://japan.cnet.com/release/30664955/?ref=rss

詐取の電子マネー換金疑い、収益2000万円超か　3人逮捕(4/5)
https://www.nikkei.com/article/DGXZQOUE057CY0V00C22A4000000/

なんで作った？AndroidスマホをLightning対応に改造する猛者が現る(4/4)
https://www.gizmodo.jp/2022/04/cursed-an-engineer-put-a-lightning-port-in-an-android.html

レディースシューズブランド「hermerry」が日本のファッション業界では初となる「ブランド公式トークン」を発行。国産D2Cブランドのネクストステージを目指すプロジェクトが「FiNANCiE」にて始動(4/5)
https://rkb.jp/article/98082/

米・インテルが新ビットコインマイニングチップを発表(4/5)
https://nextmoney.jp/?p=49401

既存アプリをクラウド移行　32ビットや文字コードに留意(4/6)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/120800267/033100005/

SaaSかパッケージか　D2C向けECサイト構築の勘所(4/6)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/101400256/033000009/

パナソニックのカナダ子会社がランサムウエア感染か、犯罪集団Contiがサイトに掲載(4/6)
https://xtech.nikkei.com/atcl/nxt/news/18/12578/

社外は危険がいっぱい、安全にテレワークをするためにやるべきこと(4/6)
https://xtech.nikkei.com/atcl/nxt/column/18/02004/040500004/
【Docker】Docker for macのコンテナに他端末からアクセスする方法【Rails】【React】

## はじめに
　本記事は、プログラミング初学者が学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## Docker for macのコンテナに他端末からアクセスする方法
Docker for macでは特段の設定をすることなく、ローカル環境と同じように[【Rails】macのrailsサーバーに他の端末からアクセスする方法](https://qiita.com/P-man_Brown/items/040b14576020f51a843d)に記載の手順でアクセスできました。
Windowsの場合には別途設定が必要なようです。

### Nginx + Rails
`nginx.conf`を以下のように記述している場合には`http://localhost`の代わりに`http://ローカルIPアドレス`とすることでiPad等でアクセスできます。

```nginx.conf
upstream myapp {
  server unix:///myapp/tmp/sockets/puma.sock;
}

server {
  listen 80;
  server_name localhost;
  access_log /var/log/nginx/access.log;
  error_log  /var/log/nginx/error.log;

  root /myapp/public;

  client_max_body_size 100m;
  error_page 404             /404.html;
  error_page 505 502 503 504 /500.html;
  try_files  $uri/index.html $uri @myapp;
  keepalive_timeout 5;

  location @myapp {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://myapp;
  }
}
```


## React
`npm start`した際に表示された`On Your Network`に記載のアドレスをアドレスバーに入力することでアクセスできます。
```:ターミナル
  Local:            http://localhost:3000
  On Your Network:  http://192.168.2.108:3000
```

## ローカルIPアドレスをホットキーで取得する方法
ショートカットアプリでショートカットを作成し、ホットキーを割り当てることでホットキーでローカルIPアドレスを取得することができます。

ショートカットアプリで以下の内容のショートカットを作成します。
![スクリーンショット 2022-04-07 3.27.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/97b03268-7de4-d68d-2b29-bc7f7d07d15d.png)

赤枠のマークをクリックして「クイックアクションとして使用」にチェックを入れます。
次に「キーボードショートカットを追加」をクリックし、任意のホットキーを入力します。
![スクリーンショット 2022-04-07 3.30.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/ed039a6e-37c3-78d5-2b5a-6fb0249170ef.png)

以下のように「次で実行」に設定したホットキーが表示されます。
![スクリーンショット 2022-04-07 3.31.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/9eb9028d-dcd0-e813-3634-dcd576a2d94e.png)

以降ホットキーを入力することでローカルIPアドレスがクリップボードにコピーされペーストできるようになります。