OmniAICreator/Qiita-1.07M huggingface dataset:
rails db:seedできなくなった

# rails db:seed できなくなった
## rails db:seed とは
Railsには、初期データを追加するためのシード機能が備わっており、「seed.rb」ファイルにデータを記述していきます。
例えば、
```
Customer.create!(
 email: "aaa@amail.com",
 password: "a12345",
 nickname: "れいこ",
 profile: "令和生まれの道子です。",
)
```
こんな感じでCustomersテーブルのそれぞれのカラムにデータを保存(create!)します。
このような記述の集まりが、「seed.rb」ファイルで、それを実行するのが、```rails db:seed```というわけです。
## エラー
rails db:seedをすると、既にemailがデータベースにあるようで、バリデーションエラーとなりました。
## TRY
1. x
```
rails db:reset
rails db:seed
```
2. x
```
rails db:drop
rails db:migrate
rails db:seed
```
## そもそも
### rails db:reset
- ```rails db:drop```　と　```rails db:setup```を連続して行うコマンド
### rails db:drop
- database.ymlの設定に従って、データベースを削除するコマンド
### rails db:setup
- 全てのデータベースを作成し、全てのスキーマをロードし、seedデータで初期化するコマンド
- ```rails db:create``` ```rails db:schema:load``` ```rails db:seed```を連続して実行するコマンド
### rails db:create
- データベースの設定に従ってデータベースを作成するコマンド
### rails db:schema:load
- データベーススキーマの最新の状態のキャプチャである「schema.rb」ファイルでデータベースを作成するコマンド
### rails db:migrate
- 未実行のマイグレーションファイルを実行するコマンド
## つまり
- 1は、
```
rails db:drop
rails db:create
rails db:schema:load
rails db:seed
rails db:seed
```
と同じであり、もう既に初期データが追加されたのに、もう一度追加しようとしたわけなので、できるわけないよね〜
- 2は、コマンドはそのままだけど
```rails db:drop```した後に、```rails db:migrate```しているから、データベースがないところに、マイグレーションファイルを実行しているから、そりゃ無理っしょ、となるのかな。
## 解決
以下のコマンドで解決しました。
```
rails db:drop
rails db:create
rails db:schema:load
rails db:seed
```
↓
```
rails db:drop
rails db:setup
```
こちらのサイト
https://eiji-hb.hatenablog.com/entry/2019/12/19/225008
のを見てとりまやってみて解決したのですが、１つ１つ何をしているか見るとどこでなぜコケたのかよく分かりました。
## まとめ
- １つ１つ何を担っているのか知ることが大事
- 問題の切り分けをすることが必要ですね
- ちなみに、今回で言うと、途中「ああああああああ！！」ってなりましたが、 
  - マイグレーションファイルがおかしい
  - データが残っている
　　　　　　　　　　　　　　　　　　　の２つに当たりをつけてました。
#### これからは、落ち着いて仮説と検証を繰り返すスタイルを確立させたいと思います！
Rubyで半角小文字カナを半角カナに変換

## はじめに
半角小文字カナから半角カナへ変換する必要があったので対応をメモとして残します

半角カナ→全角カナへの変換は色々と情報があったが、半角小文字カナ→半角カナへの変換はあまり情報がなかったので、同じような実装をする方の参考になればと思います


## 実装方法
gsub!メソッドのパターンマッチを使って変換機能を実装

https://docs.ruby-lang.org/ja/latest/method/String/i/gsub=21.html
> gsub!メソッドは、文字列中の pattern にマッチした部分をキーにしてhashを引いた値で置き換えすることができる

上記のhashを用いての変換を使用

## 実装例
```rb
PATTERN = { "ｧ" => "ｱ", "ｨ" => "ｲ", "ｩ" => "ｳ", "ｪ" => "ｴ", "ｫ" => "ｵ", "ｯ" => "ﾂ", "ｬ" => "ﾔ", "ｭ" => "ﾕ",
  "ｮ" => "ﾖ", "ｰ" => "-" }.freeze

## 半角小文字カナを設定
str = "ｧｨｩｪｫ"

PATTERN.each do |k, _o|
  str.gsub!(k, PATTERN)
end

p str
```
### 出力結果
```
ｱｲｳｴｵ
```

これで半角小文字カナを変更することができました
## まとめ
ライブラリなどを使えばもっと簡単に実装することができるかもしれないので、分かり次第追記します
Golang 最新版を Amazon Linux2 へインストールする


Golang 最新版はこちら

https://go.dev/dl/

執筆時点の最新版は 1.18.3 でした

```bash
wget https://go.dev/dl/go1.18.3.linux-amd64.tar.gz
```

ファイルを解凍します

```bash
sudo tar -C /usr/local -xzf go1.18.3.linux-amd64.tar.gz
```

パスを追加します

```bash
echo 'export PATH=$PATH:/usr/local/go/bin' >> .bash_profile
```

確認

```bash
source ~/.bash_profile
go version
```

結果
```bash
go version go1.18.3 linux/amd64
```
Python + librosa で14平米にスーベニア -広川恵一 Remix-から久川凪を救出する

Twitterで話題の久川凪をpythonライブラリの`librosa`を使ってプロットしてみました

https://twitter.com/_Akira_Melon_/status/1538172760622776321

# コード

```python:
import numpy as np
import librosa
import librosa.display
from matplotlib import pyplot as plt
from matplotlib import cm
from matplotlib import ticker


file_path = r'./souvenir.wav'
y, sr = librosa.load(file_path, sr=44100)

# スペクトログラムの生成
D = librosa.stft(y, n_fft=2048)  # STFT
S = np.abs(D)
S_db = librosa.amplitude_to_db(S, ref=np.max)  # db変換

# プロット
fig, ax = plt.subplots(dpi=300)
img = librosa.display.specshow(S_db, sr=sr, x_axis='time', y_axis='hz', ax=ax, cmap=cm.gray)

# 177.6秒から182.1秒あたりに画像が埋め込まれている
ax.set_xlim([177, 183])
ax.set_ylim([0, 22050])
ax.set_aspect((183 - 177) / (22050 - 0))  # アスペクト比を1:1に

ax.xaxis.set_major_locator(ticker.MultipleLocator(5))
ax.xaxis.set_minor_locator(ticker.MultipleLocator(1))

fig.colorbar(img, format='%+2.0f db')
fig.savefig('./souvenir.png')
fig.show() 
```

# 久川凪
![souvenir.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49903/6e00b733-9823-982d-dc72-b015f280710e.png)

やったぜ。

音源を購入したい方は以下のサイトからどうぞ。

https://shop.columbia.jp/shop/g/gS4302/
マップマッチング

こんにちは。
[マップマッチング](https://en.wikipedia.org/wiki/Map_matching)とは、地理座標点の並びを与え（図例内の 1, 2, 3）、それらの近傍で対応するグラフのエッジ（＝用意した道路地図のリンク）の繋がった並びを求めるものです（図例内の経路（＝太線））。

* したがって、「近傍探索＋経路探索」ということになります。
* なお与えた地理座標点が道路の位置から離れていること（図例の各垂線（＝点線）の長さ）を一種の誤差（およびその解消）と見なすと、誤差補正処理に相当します。

<img width="400px" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54617/00111418-c0e9-fc35-f7e6-3730c1eb2251.jpeg">

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54617/db01d6f3-4bfa-d171-f79d-61ba0ca74e8f.gif)

#### 理論

この問題に対し、[Paul Newson and John Krumm](https://www.microsoft.com/en-us/research/publication/hidden-markov-map-matching-noise-sparseness/) (2009) による定式化が近年広く用いられ[^1]、下記の最小化解を求めます（$N$は与点の総数、$r_i$は各垂線の長さ、$L$は経路の全長）。

```math
\begin{align}
&\min \left(\frac{1}{2} \Sigma_{i=1}^N \left(\frac{r_i}{\sigma}\right)^2 + \frac{L}{\beta}\right)
\end{align}
```

これは「[隠れマルコフモデル](https://ja.wikipedia.org/wiki/隠れマルコフモデル)」問題と等価であり、$r_i$ の項が emission probability、$L$ の項が transition probability に相当します。解は定数$\frac{\sigma^2}{\beta}$の値に依存します。[Viterbi アルゴリズム](https://ja.wikipedia.org/wiki/ビタビアルゴリズム)を用いて効率的に解くことができます[^2]。

* なおマップマッチングの歴史は古く、上記の定式化以前は各種の heuristic な解法が使われていました[^3]。

#### マップマッチング動作例

[horizon](https://github.com/LdDl/horizon)[^4]（および [osm2ch](https://github.com/LdDl/osm2ch)、[osmium-tool](https://osmcode.org/osmium-tool/index.html)）を動かし、そのサーバーへ web クライアントで接続し、地理座標点（```GPS #1,2,3```）の並びを与えました。 [日本の高速道路](https://ja.wikipedia.org/wiki/日本の高速道路)を対象[^5]とした例です。

```console
$ wget https://download.geofabrik.de/asia/japan-latest.osm.pbf
$ osmium tags-filter -o japan-motorway.osm.pbf japan-latest.osm.pbf w/highway=motorway,motorway_link
$ osm2ch --file japan-motorway.osm.pbf --out map.csv --geomf geojson --units m --tags motorway,motorway_link --contract=true
$ horizon -h 0.0.0.0 -p 32800 -f map.csv -sigma 50 -beta 30 -maplon 135.4 -maplat 35.2 -mapzoom 5
Extracting edges from 'map.csv' file...
Done in 9.954906378s
Loading graph and preparing engine...
Done in 91ns
 ┌───────────────────────────────────────────────────┐ 
 │                   Fiber v2.30.0                   │ 
 │              http://127.0.0.1:32800               │ 
 │      (bound on host 0.0.0.0 and port 32800)       │ 
 │ Handlers ............. 8  Processes ........... 1 │ 
 │ Prefork ....... Disabled  PID .............. 5948 │ 
 └───────────────────────────────────────────────────┘ 
```

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54617/191e7df7-64cd-342a-03fc-041914ed3435.gif)


#### 参考情報

* [map-matching](https://github.com/topics/map-matching) (GitHub)
* [Go で超高速な経路探索エンジンをつくる](https://speakerdeck.com/avvmoto/go-conference-2019-autumn-go-ch) (speakerdeck.com)

[^1]: 参考："[Matching GPS traces to a map](https://blog.mapbox.com/matching-gps-traces-to-a-map-73730197d0e2)" (Mapbox Blog).
[^2]: Viterbi アルゴリズムはオフライン／オンラインに対応可能です（バッチ／リアルタイム処理）。
[^3]: 参考：「[マップマッチングのアルゴリズム](https://slideshowjp.com/doc/1437115/マップマッチングの-アルゴリズム)」
[^4]: [horizon](https://github.com/LdDl/horizon) (GitHub) は Go で書かれています。
[^5]: 参考：「[日本の高速道路を OSM データから抽出](https://qiita.com/kkdd/items/1c39f87fe34c2fb406f3)」
Flutter Firebase データの色々な取得方法

# 初めに
flutterでfirebaseのfirestoreからデータを取得する際の取得方法を一部記述します。

# データの取得方法
**前提のコード**
```
  //Firestoreインスタンスの作成と代入 
  static final FirebaseFirestore _firestore = FirebaseFirestore.instance;

  //firebase上のコレクションへのアクセス(変数名を _users にしているが、自由に決める)
  static final CollectionReference _users = _firestore.collection('コレクション名');
```
これ以降のコードは ``_users`` で進めていきますが、上記の「コレクションへのアクセスの部分で決めた変数」に置き換えてください。

以後のコードに出てくる``_userStream``も好きな変数名でOKです

## 全て取得

```
final Stream<QuerySnapshot> _userStream = _users.snapshots();
```

## where： 指定の値のみを取得
例：nameの値を指定して取得する場合
```
final Stream<QuerySnapshot> _userStream = _users.where('name', isEqualTo: '指定の値').snapshots();
```
## where： 指定の数値より小さい値のデータのみを取得
例：ageが25より小さい値のデータだけを取得
```
final Stream<QuerySnapshot> _userStream = _users.where('age', isLessThan: 25).snapshots();
```

## limit： 指定の個数だけ取得(登録の新しい順から)
例：登録が新しい順に2つだけデータを取得
```
final Stream<QuerySnapshot> _userStream = _users.limit(2).snapshots();
```
## orderBy(並び替え)：  昇順に並び替えて取得
数値の小さい順に上から並べる
文字列だったとしても数値が入っていれば適応可能
```
final Stream<QuerySnapshot> _userStream = _users.orderBy('age').snapshots();
```
## orderBy(並び替え)：  降順に並び替えて取得
数値の大きい順に上から並べる
文字列だったとしても数値が入っていれば適応可能
```
final Stream<QuerySnapshot> _userStream = _users.orderBy('age', descending: true).snapshots();
```
# 終わりに
 
Twitterでも情報発信しておりますので、ぜひフォローお願い致します!
https://mobile.twitter.com/tatsuki_kt
[Unity]Instantiateで生成するとScaleが変わる問題の対応

久々にInstantiate使ったらSetParent以外で生成したオブジェクトの親を設定できることを知った話

# Instantiateでオブジェクトを複製したけどなんかでかい！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272154/f5b7de3a-bf66-2705-5b71-0b61bdaeed9e.png)
こんな感じのScrollViewの中にボタンをいっぱい生成して選択できるようにしたいです。そんなときはInstantiate。Prefabから生成できるように以下のようにコードを書きました。
(ScrollViewのContentにはHorizontalLayoutGroupコンポーネントを設定しているのであとは追加していくだけで横にずらーっと並んでくれる想定です。)

https://docs.unity3d.com/ja/2018.4/ScriptReference/UI.HorizontalLayoutGroup.html


```C#:Instantiate_test.cs
// インスペクタで生成したい数だけ設定する
[SerializeField] private Color[] _color;
// Prefabから生成するオブジェクト
[SerializeField] private GameObject _object;

private void Start()
{
    var buttonsParent = this.gameObject.transform.Find("Scroll View/Viewport/Content");

    for (int i = 0; i < this._color.Length; ++i)
    {
        var button = Instantiate(this._object);
        button.transform.parent = buttonsParent;
        button.GetComponent<Image>().color = this._color[i];
    }
}

```

以下実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272154/2018b9ae-355a-1be3-3f86-c52384a578f8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272154/b908c7cc-7a80-8d26-ab35-572035222ee8.png)
生成はされましたがインスペクタを見てみると生成されたオブジェクトのScaleが大きいです。
1(Prefabの正しいScale)に戻すと正しく表示されますが、
理由もわからないまま
```
button.transform.localScale = Vector3.one;
```
なんてしないようにしてください。 ~~(1敗)~~
# なぜ勝手にScaleが変わってしまうのか
その原因はワールド座標、ローカル座標にあります。
ワールド座標、ローカル座標についての説明は以下のサイトでとても詳しく説明されていらっしゃるので、ぜひご覧ください。

https://nekojara.city/unity-transform-point

```
var button = Instantiate(this._object);
button.transform.parent = buttonsParent;
```
先ほどのコードだと、生成した際のthis._objectは何処に生成されるでしょうか。
そう、ここでは生成されたオブジェクトはrootにワールド空間で生成されます。
そのあとにparentを指定しているのでワールド空間のオブジェクトがcanvas内に入り、このときScaleが変わってしまっていました。
# 対応①
```
var button = Instantiate(this._object, buttonsParent, false);
```
生成する際に親の設定を行う。(falseは規定値なので記載しなくても動作は変わらないです)
このように記載することで
生成するタイミングでtransformを親に対して相対的に設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272154/2e8915f7-a8d0-22be-f107-d6cec3f10605.png)
表示も正しく行えました！

ちなみに
```
Instantiate(this._object, buttonsParent, true);
```
このように記載すればワールド空間に生成できます。
その他の詳しい説明などはリファレンスをどうぞ

https://docs.unity3d.com/ja/2018.4/ScriptReference/Object.Instantiate.html
# 対応②
いままで自分が使っていた方法です。
```
var button = Instantiate(CustomManager.Instance._PrefabButton);
button.transform.SetParent(buttonsParent.transform, false);
```
生成した後にSetParentで親を設定していました。
こちらの方法だと2行使ってしまい見栄えも悪いです。
# まとめ
Instantiateで生成する際は
```
Instantiate(複製するオブジェクト, 親オブジェクト.transform, false);
```
で生成すると冒頭にあった問題は回避できます。
ResultBuilderを悪用してメソッドの返り値をプリントデバッグする便利なやつを作る

メソッドの返り値にどんな値が入っているのか確認したいことがあります。

```swift
func getCurrentUser() -> User {
  userRepository.getCurrent()
}
```

この場合、次のように修正して見ることになります。

```swift
func getCurrentUser() -> User {
  let user = userRepository.getCurrent()
  print(user)
  return user
}
```

折角省略した`return`を書き直すハメになりました。さらにuser変数を作ることにもなりました。
これではprintデバッグをサクッとしたいときに時間がかかりますね…。

そこで、resultBuilderを使って返り値をprintするBuilderもとい、Printerを作ってみます。

```swift
@resultBuilder
public struct DebugPrinter {
    public static func buildBlock<T: CustomDebugStringConvertible>(
        _ component: T,
        file: String = #file,
        function: String = #function,
        line: Int = #line
    ) -> T {
        print(file, function, line, component.debugDescription)
        return component
    }
}
```

こうすることで、

```swift
@DebugPrinter
func getCurrentUser() -> User {
  userRepository.getCurrent()
}
```

メソッドの上に`@DebugPrinter`と書くだけで

```console
Sources/Repository/UserRepository.swift getCurrentUser 64 
{
  id: 123
  name: Michel
  age: 12
}
```

とコンソールに出力されました。
メソッド名やファイル名も出力されるので、フィルタもできて便利ですね。
Active Directory と AWS Directory Service を理解する

AWSについてきちんと勉強し始めて半年ちょっと。
いろいろとぼんやりしながらSCSの勉強をしてしまっているので、基礎から整理することにしました。

# Active Directory(AD) とは
Microsoftが提供している、Windows server OS向けの機能。
会社や組織が保有している人材や情報などの各種リソースを管理するためのディレクトリ。

## 主な機能
### ユーザー認証とアクセス制御
人、モノ、データなどの情報を「ドメイン」で管理している。
「ドメインコントローラー」はユーザーIDとPWを使用してユーザー認証を行う他、データの閲覧・編集権限等の編集が可能。また、データへのアクセス範囲、ユーザーの所属部署等の情報、使用しているデバイス等の情報を管理している。

### ドメインツリーとフォレスト
#### ドメインツリー
例として、本来アクセスできない親ドメインに、子ドメインからアクセスできるようにポリシーが設定された状態のこと。親子ドメイン間に信頼関係がある。
#### フォレスト
親子とは全く別のドメインと信頼関係を結び、アクセスが可能になった状態。

### シングルサインオン（SSO）
ユーザーが所属するドメインにユーザーID, PWでログインした場合、ドメインツリーやフォレスト内にある別ドメインのリソースに認証不要でアクセスできること。たとえば、所属ドメインのドメインコントローラーから認証を受けた場合、ドメインツリー内の別ドメインが管理しているサーバーやプリンター等に認証なしでアクセスが可能となる。

### フェデレーション
外部のクラウドサービスやWebサービスへSSOができる関係のこと。
Active Directoryは、Microsoft Azure や Microsoft 365といった外部クラウドサービスとも1つのID・パスワードで接続できる。

# AWS Directory Serviceとは
Microsoft ADを、AWSの他のサービスと併用するために使用するサービス。

|サービス名|概要|
|--|--|
|AWS Managed Microsoft AD|AWS上にマネージド型のMicrosoft ADを構築するサービス。<br>AWS上にフルスペック型のMicrosoft ADを構築したい場合や、Linuxアプリケーション用にLDAPサポートが必要な場合に使用。<br>EC2インスタンスをAWS Managed Microsoft ADに結合すると、ユーザーはオンプレのワークロードへアクセスする際と同様のSSOで、AWSクラウドのWindowsワークロードにアクセスできる|
|Simple AD|Linux-Samba ADで構築されたマネージド型Directory Service。<br>シンプルにユーザーID、PWのみで管理する場合に使用。<br>小規模なユーザー管理を目的として、既存のシステムと連携する必要がない場合に便利|
|AD Connector|既存のオンプレADに対してリダイレクトするADのプロキシサービス。<br>既存ADを互換性のある AWSサービスと併用する場合に最適。<br>AD Connectorを使用して、Amazon EC2インスタンスを既存のADドメインに結合することも可能|

## オンプレの既存ADとの接続パターン
### Microsoft AD を利用
双方向に信頼関係を構築するほか、同一リージョンで稼働するためレイテンシーの考慮がほぼ不要。AWS側で完結して設計・拡張が可能。
```plantuml
@startuml
"AWSリソース" -->[認証要求] "AWS Managed Microsoft AD"
-->[VPCを利用した、VPN/ダイレクトコネクト接続] "既存AD"
--> "AWS Managed Microsoft AD"
@enduml
```

### AD Connector を利用
認証の都度既存ADへ問い合わせを行うため、レイテンシーの問題がある。また、既存ADのスペックにも左右される。
```plantuml
@startuml
"AWSリソース" -->[認証要求] "AD Connector"
-->[VPCを利用した、VPN/ダイレクトコネクト接続] "既存AD"
@enduml
```

## 利用方法の例
### AWSユーザーを管理
認証機能としてADを利用し、認証済みのユーザーに適したIAMロールを割り当てる。MFAの利用も可能

### AWS CognitoのSAML（Security Assertion Markup Language)として利用
Cognitoユーザープールを設定し、使用するSAMLとして「Microsoft AD Federation Service」を選択する
手順：[Amazon Cognito ユーザープールを使用してサードパーティの SAML ID プロバイダーを設定する方法を教えてください。](https://aws.amazon.com/jp/premiumsupport/knowledge-center/cognito-third-party-saml-idp/)

# AWS Cognitoとの使い分け
より大きな規模のユーザー管理をおこなったり、ソーシャルID認証にも対応しているスケーラブルなディレクトリが必要な場合は、Cognitoを使用する認証がおすすめ。


# 参考
- [AWS Directory Service とは?](https://docs.aws.amazon.com/ja_jp/directoryservice/latest/admin-guide/what_is.html)
- 要点整理から攻略する『AWS認定 セキュリティ-専門知識』
- [Active Directory（アクティブディレクトリ）をゼロから解説、関連用語もまとめて紹介](https://www.sbbit.jp/article/cont1/37798)
- [Active Directoryとは？メリットやデメリット、使用上の注意点などを解説](https://www.rworks.jp/system/system-column/sys-entry/21659/)
俺「パジネーションってなんやねん」

# データを細切れに取得するで

Webサイトで一覧を表示するときに、1ページに全部を表示しないで決まった個数ずつ表示する仕組みを指すで。

下の画像がパジネーションの例やで👇

<div>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512610/9b2bf71b-432e-7302-c561-397502c38db6.png" width="400">
</div>

<div>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512610/3df663b0-7596-075e-1384-3de06c91e8b6.png" width="500">
</div>

1ページに表示する要素数を絞るような機能を指すよ！

例えば、記事が100個あるWebサイトがあるとして、1ページに表示する記事数を8個に決めるとリンクが「100÷8=12.5」で13ページ分(余りは切り上げ)のパジネーションが作成されるね。

# 全部表示するとページが長くなっちゃう

パジネーションを実装する主な理由は以下になるぜ。

- データ量が多いのにパジネーションがないと、、、
    - Webページの読み込み時間が長くなっちゃう
    - Webページの表示が長くなっちゃう

取得するデータを細切れにすることで、これらの欠点を回避することができるぜ。

# パジネーションの弱点

物事は等価交換で成り立っていて、パジネーションすることのデメリットもあるで、、、泣。

- パジネーションを実装することによって、、、
   - 全部を1ページに表示する仕様と比べて、ユーザーに余計な操作(リンクのクリック)をさせちゃう
   - 1枚のページに情報が揃ってないから、欲しい情報に到達するまでに時間がかかる

# 【余談】発音が難しい

英語で「pagination」って書くけど、これが「ページネーション」じゃなくて「パジネーション」って読むらしい。

ページを作るし、初見だと「ページネーション」って読んじゃう、、、。
【vue3】script setupで親コンポーネントから子コンポーネントにFunctionをpropsとして受け渡す

# やりたいこと
- `<script setup>`で親コンポーネントから子コンポーネントにFunctionをpropsとして受け渡す
仕事で`<script setup>`を勉強することがあったのでメモ。
今回はボタンコンポーネントに親からFunctionを渡しています。

## 実装
### 子コンポーネント
```typescript
<template>
  <div class="button-component">
    <button @click="onClick">{{ label }}</button>
  </div>
</template>

<script setup lang="ts">
import { defineProps } from 'vue';

defineProps({
  label: {
    type: String,
    default: "label"
  },
  onClick: {
    type: Function,
    default: () => {
      console.log("button default")
    }
  }
})
</script>
```

### 親コンポーネント
```typescript
<template>
  <div class="parent">
    <h1>Test Page</h1>
    <button-component label="parent method" @click="onClick"></button-component>
  </div>
</template>

<script setup lang="ts">
import ButtonComponent from '@/components/ButtonComponent.vue';

function onClick () {
  console.log("parent method")
}
</script>
```
## ボタン押してみた
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712912/43758917-c67d-303b-b55d-c742fdc6c0b1.png)

①`@click`を指定していない方のボタンをクリック
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712912/b455bf72-2605-1c87-c503-655644f7f69a.png)
Functionを渡してないのでdefualtのメソッドが呼び出される

②`@click`を指定した方のボタンをクリック
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712912/4a55be6e-ff38-8993-22cd-d994b1253f0c.png)
親から渡したFunctionが実行される

## 感想
`<script setup>`はまだまだ慣れないですね。
使いこなせたら便利そう。
else節ではraiseしたくなる

### はじめに

僕はcase文だったりswitch文のelse(default)節に正常処理を書くことが嫌いです。
ただ、if文のelse節には正常処理をガンガン書きます。
どうして、そうしているのか、その訳をつらつらと書いていきたいと思います。

### Rubyの制御構造（条件分岐）
Rubyの制御構文、特に条件分岐に関するものは以下の三種類がある。

- if文
- unless文
- case文

それぞれの構文は以下の通りだ。式を後置修飾するif修飾子およびunless修飾子については本題から逸れるので省略した。

<strong>if文</strong>
```ruby
if 式1
    処理1
elsif 式2
    処理2
end
```

<strong>unless文</strong>
```ruby
unless 式
    処理1
else
    処理2
end
```

<strong>case文</strong>
```ruby
case 式0
when 式1
    処理1
when 式2
    処理2
else
    処理3
end
```

if文はelsif節を使って、case文はそもそもの構文として複数条件による分岐ができる。それに対して、unless文にはそれに該当する構文がない。
そのため、case文とif文はお互いに書き換えができ、実際、<strong>[rubyの日本語リファレンス](https://docs.ruby-lang.org/ja/latest/doc/spec=2fcontrol.html)</strong>にもcase文からif文への書き換え方が記載されている。

ただ、僕はcase文とif文にはその目的、使用意図に決定的な違いがあると考えている。それどころか、個人的にはif文とunless文が同じ枠組みで、case文はそれらとは別物だと思っている。
if文とcase文の目的の違いこそが、僕にcase文のelse節でraiseしたい衝動を呼び起こしているのだ。

### if文とcase文の違い

端的に表せば、それは条件式に期待されることだ。簡単に書くと次の通りだ。
- if文：boolean
- case文：ある集合に属する値

<strong>if文の場合、</strong>構文的にも条件式の値はbooleanとして解釈されるし、読み手もそれを期待する。（少なくとも僕はそうだ）
もちろん、Rubyはfalseとnilだけをfalseとして解釈し、それ以外の値を全てtrueとして評価するから、if文の条件式にboolean以外を与えることはできるし、それについては、nilをundefinedのように扱って、特定の値が存在すれば処理をする、のような書き方もできるから否定はしない。というか、割と使う。

<strong>case文の場合、</strong>そもそも条件の成立条件はそれぞれの処理に紐づいている条件式だけでは決まらない。なぜなら、大元の式の評価値とそれぞれの条件式の評価値の一致を条件の成立としているからだ。
そのため、個人的にはcase文はある変数が特定の値の内どれかであることが確定している場合に使うことが多い。
例として、あまり綺麗ではないが以下のコードを掲載しておく。
```ruby
module Brother
    Taro = 1
    Jiro = 2
    Saburo = 3
end

def name(brother)
    case brother
    when Brother::Taro
        'taro'
    when Brother::Jiro
        'jiro'
    when Brother::Saburo
        'saburo'
    else
        raise "#{name} is not a brother"
    end
end
   
```

仮に、上の例のnameメソッドを以下のように書き換えると非常に気味が悪い。
なぜなら、変数brotherに兄弟ではないmichaelやjohnが来たとしても、saburoとして評価してしまうからだ。
実務的な理由から、raiseではなくロギングにとどめていることもあるが、それでもsaburoと返してしまうよりはマシだろう。
つまり、個人的にはcase文のelse節はそもそも限りなく例外に近いのだ。
契約を破った要求に対して、見当違いの応答をするぐらいなら拒否してくれたほうが、まだ良心的だ。

```ruby
def name(brother)
    case brother
    when Brother::Taro
        'taro'
    when Brother::Jiro
        'jiro'
    else
        'saburo'
    end
end
```

### 最後に
なぜ、こんな考え方になったんだろう、と思い返すと、自分がシステムに埋め込んだあるバグと、[攻撃的プログラミング](https://gihyo.jp/news/report/01/phpcon2016/0002?page=2)という考え方、また、以前読んだ[あるエッセイ](https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E6%AD%A3%E3%81%97%E3%81%84%E4%BD%BF%E3%81%84%E6%96%B9%E3%82%92%E7%B0%A1%E5%8D%98%E3%81%AB-%E8%AA%A4%E3%81%A3%E3%81%9F%E4%BD%BF%E3%81%84%E6%96%B9%E3%82%92%E5%9B%B0%E9%9B%A3%E3%81%AB/)に影響を受けていると思う。
参考までにそれぞれへのリンクを載せて終わることにする。
Laravelでテーブル・モデル・ビュー・コントローラーを作成したい。

<h2>Viewの作成</h2>
C:\xampp\＜プロジェクト名＞\resources\viewsフォルダに、任意のテーブル名でフォルダを作成。
ここでは例として、"projects"という名前でフォルダを作成する。

![スクリーンショット (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708305/9ce22b55-8cb3-b31d-34d7-b8a8830a51b3.png)

projects内には、一覧View(index.blade.php)、新規追加View(create.blade.php)、編集View(edit.blade.php)を用意する。createとeditは、detailというフォルダ下に作成しておく。

![スクリーンショット (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708305/1574620c-9527-066d-31a1-2b0f89728287.png)

![スクリーンショット (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708305/0e0438c3-d467-76f2-f246-eeec2c3fdc27.png)

具体的なファイルの内容については、改めて書きます。

<h2>Modelの作成</h2>

コマンドプロンプトに下記を記載。
```
php artisan make:model <任意のモデル名>
```
C:\xampp\<プロジェクト名>\app\Models\に、＜モデル名＞.phpファイルが生成される。
このファイルに、モデルで使用するカラム名を記載。具体的内容はいつか。

次に、データベースを作成。
```
php artisan make:migration create_＜テーブル名＞_tables
```

C:\xampp\＜プロジェクト名＞\database\migrations\に、＜作成日時＞_create_＜テーブル名＞_tables.phpが作成されている。
ここに、カラムの型やルール（Nullを許すかどうかなど）を記載。

それができたら、実際に作成。下記を記載。
```
php artisan migrate
```

phpMyAdminに指定したテーブルが作成されていることを確認。


<h2>Controllerの作成</h2>
ここでは一覧Viewを呼び出すControllerと、新規作成・編集Viewを呼び出すControllerの２つを作成。

```
php artisan make:controller ＜テーブル名＞Controller
php artisan make:controller ＜テーブル名＞DetailController
```

app\Http\Controllers\に作成される。

<h2>まとめ</h2>
かなり雑だが、手順はこんな感じ。具体的な書き方はまた今度、気が向けば。
Routeに関しては、routes\web.phpがすでにあるので、そこに加筆してくだけ。

MVCモデルの仕組みが、個人的には面白かったです。
【Mac M1環境】MS outlookから数百通の個別メールを、連続自動送信するコードの書き方。（丸２日作業を瞬殺した話）

＜やりたい事＞ 
下記の様なメールリストが、あります。（実際にには数百の宛先に送付する必要があります。）
![list0615.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/0dee25a9-d930-c1d5-618a-d0d495805a29.png)

上のメールリストに対して、下記の様なOutlookメールを個別に自動送信して、楽をしたい。
（尚、手動のBCCメールは、経験上、誰も読まないのを知っているので、楽ですが、ダメです。あくまでも個別メールにしたいと思っている。）

```
山田様、
これからは本文です。本日は、こんにちは！テストです。先日はありがとうございました。これはテストです。
```
これですが、メール数通位なら、兎も角、数百通を手動で発信したら、丸２日は掛かります。また、手動特有のメール誤送信がマジで怖いですね。
従って、手動メール送信は論外です。

＜もし、Windows環境なら＞
因みに、過去にも、Windows環境なら構築したことがあります。
「Python+Openpyxl+win32comで、15分で開発できるだろう！」とタカを括っていたのですが、Win32comのモジュールは、Mac環境では使えない事に、最後の最後で気が付きました。

Windows環境で自動送信する方法。（過去記事）⇨
https://qiita.com/naiveprince0507/items/3e4d322f7f1c3068487a
尚、Win32comに相当するMac用のモジュールは、丸１日掛けて探したのですが、見つかりませんでした。
ご存じの方がいたら、教えてください。

＜解決策＞　
Mac環境では、Pythonでの開発は難しいそうなので、Applescriptを使うことにしました。
http://tonbi.jp/AppleScript/Introduction/01/
このapplescriptですが、Macアプリを自在に操作する為のスクリプト言語の様です。（知らなかった。）
この文法を、丸一日、必死にネットで勉強したが、まあ、分かりやすいですね。（ただ、私が主戦場としている、Java,Python,Javascript等と比べると情報が少な過ぎるのが、難点。）

■ 事前準備
まず、元のExcelで、A列が宛先、B列がメールアドレスのシンプルなシートを作り、それをCSVでrecipient1.csvという名前で保存します。（保存先は、/Users/xxxxx_yyy/Desktop/code/recipient1.csv)
中身は次のような形になります。

```
山田,yamada@gggmail.com
高橋,takahashi@gggmail.com
鈴木,suzuki@gggmail.com
```
これを1行ずつ読み込み、名前とメールアドレスに分解します。この形なら1つのrepeat文で両方が得られる様にします。


で、下記のコードで動きます。

```
set org to AppleScript's text item delimiters -- オリジナルの区切り文字を保存
set AppleScript's text item delimiters to "," -- 区切り文字を","に変更

set srcFile to ("/Users/xxxxx_yyy/Desktop/code/recipient1.csv") as text
set lns to paragraphs of (read srcFile as «class utf8»)

-- ここからは、メール本文の読み込み。
set theText to loadText("/Users/xxxxx_yyy/Desktop/code/mailcontent1.txt")

on loadText(theFile)
	try
		open for access theFile
		set theText to read theFile
	end try
	close access theFile
	return theText
end loadText
-- メール読み込み。ここまで。

repeat with ln in lns

set theList to every text item of ln -- 区切り文字で分解してリストを作成
set theHonbun to (item 1 of theList) -- リストから宛先を取り出して本文を作成
set theAddress to item 2 of theList -- リストからアドレスを取り出し

display dialog theHonbun -- 確認のため本文を表示
display dialog theAddress -- 確認のためアドレスを表示
display dialog theText

tell application "Microsoft Outlook"
	
	set theMessage to make new outgoing message with properties {subject:theHonbun & "様、
先日はありがとうございました。これはテストです。", content:theHonbun & "様" & theText}
make new recipient with properties {email address:{address:theAddress}} at end of to recipients of theMessage
send theMessage

end tell
end repeat

set AppleScript's text item delimiters to org -- オリジナルの区切り文字に戻す
```

完璧に動作します。
丸２日作業を、瞬殺した事になります。
WindowsでUSB-LANアダプタが動作しない時の対策方法

WindowsにUSB接続のLANアダプタを接続し、ちゃんと設定をしたのですが、Windowsを再起動するとUSB-LANアダプタとの通信ができなくなりました。LANアダプタをUSBポートから抜いて再度差し込むと再度使用できるようになるのですが、問題の根本的な解決のため原因を調べてみました。その際に集めた知識をメモとして残します。

# USBセレクティブサスペンド

USBセレクティブサスペンドとは、長時間使用していないUSB機器へ電力供給を断つ機能です。
![電源オプション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593076/16ba16f9-37b9-2e80-f144-20ac211d61cf.png)
この設定の変更方法は、「コントロールパネル」の「システムとセキュリティ」を押し、立ち上がったウィンドウ内の使用しているプランの横の「プラン設定の変更」を押し、さらに立ち上がったウィンドウの「詳細な電源設定の変更」を押し、また別のウィンドウが立ち上がるので、その中の「USB設定」、「USBのセレクティブサスペンドの設定」を開き、設定を「無効」に変更します。

# Windows接続マネージャー

グループポリシーのWindows接続マネージャー内に「インターネットまたはWindowsドメインへの同時接続の数を最小化する」設定があります。この設定を簡単に書くと「複数のNICがある場合は使用頻度の低いNICを切断します」とのことです。
![接続マネージャー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593076/1af46eeb-70b5-145d-77be-e0d930ceb7cd.png)
設定の変更方法は、「gpedit.msc」で検索しグループポリシーを起動し、立ち上がったグループポリシーの左ペインで「ローカルコンピュータポリシー」、「コンピュータの構成」、「管理用テンプレート」、「ネットワーク」、「Windows接続マネージャー」を開き、右ペインに出てきた「インターネットまたはWindowsドメインへの同時接続の数を最小化する」をダブルクリックして、更に出てきたウィンドウ内の「未構成」を「無効」に変更し、「OK」を押します。

# おわりに

私の場合はWindows接続マネージャーの設定が原因でした。設定変更して問題解決しております。
Nuxt.jsの新規プロジェクト作成における「対話型コマンド」をDockerfileで自動入力する

## 概要
Nuxt.jsにおいて新規プロジェクトを作成する`npm init nuxt-app {ディレクトリ名}`をDockerfileで実施するのに躓いてしまったので、メモを兼ねて記載。

## やりたいこと

Nuxt.jsの新規プロジェクト作成における、「コマンドライン上の質問（プロジェクト名や使用言語など）」を自動で入力し、Dockerイメージをbuildするタイミングで新規プロジェクトも作っちゃいたい。

## 解決策

質問に対する回答を入力するためのjsonテキストを作成しておき、`--answer`オプションを付けてコマンドを実行する。

``` Dockerfile:Dockerfile
FROM node:14
USER node
WORKDIR /home/node
RUN npm install create-nuxt-app
RUN npm init nuxt-app src --answers "{ \
  \"name\": \"kotonoha-app\", \
  \"language\": \"ts\", \
  \"pm\": \"npm\", \
  \"ui\": \"balm-ui\", \
  \"features\": \"axios\", \
  \"linter\": \"eslint\", \
  \"test\"  : \"none\", \
  \"mode\"  : \"universal\", \
  \"target\"  : \"server\", \
  \"devTools\": \"dependabot\", \
  \"ci\": \"github-actions\", \
  \"gitUsername\": \"itezora-nonoha\", \
  \"vcs\": \"git\" }"

```

> 対話入力時の後ろの方の質問は、「前の質問に対する回答によっては出現しない」ことがある。
> しかし、`--answer`をオプションを使用する際のjsonについては「問われない選択項目に対する回答」も入れておかないとコマンド実行に失敗してしまうため注意。上記例だと`ci`項目などは対話入力においては不要

## create-nuxt-appのヘルプ内容

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712998/113f873d-43bc-12d4-de2e-1d7d91353744.png)

## 参考リンク

- [prompt.js - nuxt/create-nuxt-app(GitHub)](https://github.com/nuxt/create-nuxt-app/blob/master/packages/create-nuxt-app/lib/prompts.js)
  - jsonで流し込むkey-valueの参照に使用
wsl2のGNU emacsからWindowsのデスクトップ通知を行う

## 環境
この記事の内容は、
  ・Windows10
  ・wsl2 Ubuntu 20.04LTS
  ・GNU emacs 29 (wsl2でソースからビルド)
  ・X-server環境でGUI emacs起動
で確認しています。
が、wsl2で動かすemacsなら同じように動作できると思います。

## 前提
普段、タスク・スケジュール管理に、emacs の org-mode , org-agenda を使っています。

org-mode, org-agenda については、
https://maskaw.hatenablog.com/entry/2018/09/21/205910
などご参考に。


##### org-mode,org-agendaのすごいところ
org-modeで作業環境母艦としてのemacsから離れることなく、テキストでTODOを確認、編集できます。
org-agendaで、仕事、プライベート、一時メモなど複数のorgファイルからまとめてスケジュールを確認することが出来ます。
現時点(2022/06)、世界最高のオーガナイザーと思います。


## 今回やりたいこと
### org-modeでTODOの日時を入れて、時間が来たらWindowsのデスクトップに自動通知

です。
Linux/MacOSではさほど悩まずにgrowlやterminal_notifierで実現できるのでしょうが、wsl2 なので実現した例を見つけることが出来ませんでした。


#### [準備1] wsl2からデスクトップ通知するpowershellスクリプトを作成する

https://tarenagashi.hatenablog.jp/entry/2022/02/24/214743

を、引数2つ、titleとmessageを受け取れるように少し改造して保存します。

#### [準備2] emacsからpowershellスクリプトを呼び出すシェルを作成する
wsl2側からwindowの実行ファイルを起動できるので、PowerShellをオプションつけて、先程のデスクトップ通知するスクリプトを起動させます。
~~~terminal_notifier.sh
#!/usr/bin/sh
token=$1
shift
name=$*
/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -Sta -NoProfile -WindowStyle Hidden -ExecutionPolicy RemoteSigned -File d:/Wintool/emacs/home/notify.ps1 "$token" "$name" &
~~~
シェルに実行権限を加えておきます。
wsl2 terminal> chmod a+x terminal_notifier.sh

#### [準備3] emacsに、org-alertを導入して通知時の内容を変更する
emacsに、org-alertを導入します。
https://github.com/spegoraro/org-alert
その中のファイルで、alert.elを使って出力する部分を改造し、先程のpowershellをlisp shell-command で呼び出すようにします。
~~~org-alert.el
(Defun org-alert--dispatch ()
  (let* ((entry (org-alert--parse-entry))
	 (head (car entry))
	 (time (cadr entry)))
    (if time
	(when (org-alert--check-time time)
-	  (alert (concat time ": " head) :title org-alert-notification-title))
+    (shell-command (concat "/mnt/d/Wintool/emacs/home/terminal-notifier.sh"  " '" head "'"  " '"  time "'"))
		(alert head :title org-alert-notification-title))
  (alert head :title org-alert-notification-title))))
~~~

#### [準備4] Init.el設定追加

~~~init.el
(require 'org-alert)
(add-hook 'org-agenda-mode-hook 'org-alert-enable)
~~~

#### 動作確認
org-agendaグループ内のorgファイルにSCHEDULED:が定義されたTODOを定義し、org-agendaでアジェンダビューしました。
![orgファイルのSCHEDULEDに日時を設定する.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712713/c6d77393-259a-dcf3-facc-ac961fef00b1.png)

でました！デスクトップ トースト通知。
![Windows側にデスクトップ通知.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712713/6da401ae-37b2-4012-24fe-902a8bab4329.png)

#### 最後に
* これで打ち合わせに遅れることもなくなるぞ！
* もっとシンプルな実現方法があれば。
* outlookの予定表とorg-modeのTODOを同期できたらいいな。
引数とパラメータがようやく理解できた僕

# はじめに
エンジニアとしてキャリアをスタートして半年。
"引数"という概念が全く理解できてませんでした。
**「変数を定義して使い回すときに便利なもの」**
↑こんな感じで理解した振りをして、使いこなせずに日々格闘しておりました。
そんなある日、業務後の自習時間中に **「そういうことだったのか！！」** と、なったので初投稿させていただきます。
僕は野球が大好きなので、自分なりに考えた野球ネタで初学者なりに何とか例えてみます。

# やりたいことの説明
ここではメソッドを使って、野球の球速をマイルからキロに変換するまでの流れを説明していきます。
例) 100マイルは約160キロだ
上記のような例文を、メソッドを組み込んで表示していきます。
※上手に活用できていないことは重々承知で、意味を理解することがミソです。

# 関数の定義
まずは関数の定義です。
```js
// speedメソッドを定義して、パラメータをmileとする
function speed(mile) {
    // 定数conversionに1.6を代入する
    const conversion = 1.6;
    // 下記の掛け算(乗法)を呼び出し元に戻す
    return mile * conversion;
}
```
順序に沿って説明します
1. speedメソッドの定義
野球の球速を表してます。
例)150キロのストレート、130キロのスライダー等の速度の単位
2. パラメータをmileとする
上記同様に球速を表してますが、メジャーリーグ(アメリカ)での速度の単位を指す
3. 定数conversionを定義してに1.6を代入する
conversionは変換という意味
1.6はマイルをキロに換算した際の数値
例) 1マイル＝1.6キロ
4. returnで右側のデータを呼び出し元に返す
ここではmileにconversion(1.6)を掛け算したデータを呼び出し元に返す
return が実行されると、functionの処理は終了する

# console.log()で処理の実行
定義した処理を実行します。
```js
console.log('88マイルは' + speed(88) + 'キロです');
console.log('99マイルは' + speed(99) + 'キロです');
```
ここではメソッドと引数を使用している箇所のみ説明します。
※ここの引数は88と99になります
1. speed()でメソッドを呼び出す
speedメソッドは野球の球速（キロ単位）を要求するため、キロに換算したいマイル単位の数値を含める
2. 数値を入れてマイルからキロに換算する
speed()メソッドの()に数値を入れることで、関数の定義でパラメータmileとした箇所に数値が入り、メソッドが処理される

# 結果
デベロッパーツールには下記の通り表示されます
![スクリーンショット 2022-06-19 23.15.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712692/e12ee931-d19e-67a4-fff2-c4229d981a98.png)
88mile × 1.6 = 140.8キロ
99mile × 1.6 = 158.4キロ
想定通りに実行されてます！！

# まとめ
いかがだったでしょうか。
決して便利な使い方ではありませんが、学んだことを自分なりの解釈をしてアウトプットすることで、理解が深まると思います。
僕と同様にメソッド、パラメータ、引数の理解に自信がない方への一助となれば幸いです。
不明点や誤りがありましたら、遠慮なくコメントお願いいたします。

# 参考リンク
+ [確かな力が身につくJavaScript「超」入門 第2版](https://www.sbcr.jp/product/4815601577/)
+ [パラメータと引数の違い | 同じと思っていない？](https://tooljp.com/windows/chigai/html/Programming/parameter-hikisu-chigai.html)
エンジニアならこの問題、解けるよなぁ？！

どうも。タイトルほどの威勢はありません。
ということでTwitterみてたら我らがしみけんさんがこんなツイートしてた。
<img width="500" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292175/6368faeb-9eb8-9438-84e6-bfae2ad98ade.jpeg">

https://twitter.com/avshimiken/status/1538000208675581955?s=20&t=Q1GLgn2B6eyiD-DGuZMc8Q

簡単にいうと、コインを100回投げて、裏表を10*10マスに文章の横書きの順番で記録してこい。ただし捏造しても良い。というものだ。
で？って話なんだけどこの課題を出した教授は捏造されたものを簡単に見分けたのだとか。
じゃあどうやって見分けたんだ？ってのが面白そうだったから考えてみて、そしてエンジニアらしくプログラムを組んでみた。
読み進める前に、ちょっと考えてみて欲しい。
## 考える
注目すべきは100回試行するうちに何回連続して何回同じ面が出現しているんだってところ。
左は連続の最大値は3で、右は連続の最大値は7。
100回試行して最大値が3というのは少し変だなと思い、計算をしてみる。
４回連続して同じ面が出る確率は、ある一定地点から観測すると
1*(1/2)**3 = 1/8 = 12.5%
つまり、12.5%の確率で4回以上（継続している場合があるため以上）同じ面が続く可能性を毎回持ちながらコインを投げていることになる（ちょっと違うかもだけど）。

とはわかっていても、一見左の図の方がまばら感があってランダムに生成された感が漂っている。
実際に100回コインを投げるのは面倒なので機械に任せてプログラムを組んでみた。

## 実装
今回はrubyで実装。したんですけど構築が昔使ってたPHPほど簡単ではなく、あんまりよくわからなくてrailsで作った。（オーバースペックや）
1から100までのループ処理の中で、
<ul>
  <li>表を作る処理</li>
  <ul>
    <li>○と●で表記。</li>
    <li>10*n番目の処理の時改行するようにしてスタイルを整える。</li>
  </ul>
  <li>連続数とその回数と確率を算出する処理</li>
  <ul>
    <li>基本的に前回のコインの向きと同じかどうかによって処理内容を変えた。</li>
  </ul>
</ul>
の大きく二つに分けてコードを書いた。

```erb:main.html.erb
<%
if params[:flag] == "true"

  result_map = '' # 結果の図
  pre_rand_val = nil # 一回前のループ処理でのrandomの値
  result = {}
  for i in 1..100 do
  
    #### 図作る処理 ####
    random = rand(0..1) # ランダムで0or1を返す
    if random == 0
      result_map += '○'
    elsif random == 1
      result_map += '●'
    end
    result_map += '<br>' if i%10 == 0 # 10回で行を折り返す

    #### 連続を数える処理 ####
    if pre_rand_val == nil #1回目のループ
      count = 1
    elsif pre_rand_val == random #前と裏表が同じだったとき
      count += 1
    else #表裏同じ向きの連続が終わった時
      result[count] ? result[count] = result[count] + 1 : result.store(count, 1)
      count = 1
    end
    pre_rand_val = random #初期化

  end
  result[count] ? result[count] = result[count] + 1 : result.store(count, 1) #100回目保存処理

  sum = result.values.inject(:+) # 割合出すための分母算出
  result = result.sort
  description = ""
  result.each do |item|
    probability = item[1]/sum.to_f*100 # 割合算出
    description += "#{item[0]}回同じ向きが連続した場合が出現した回数: #{item[1]}回(約#{probability}％)<br>"
  end

end
%>

<form  action="" method="get">
 <input name="flag" type="hidden" value="true">
 <input type="submit" value="実行">
</form>

<form  action="" method="get">
 <input name="flag" type="hidden" value="false">
 <input type="submit" value="リセット">
</form>

<div style = "line-height: 15px" >
  <%= result_map.html_safe if result_map %>
</div>
<%= description.html_safe if description %>
```

んで実行結果はこんな感じになっている。
<img width="600" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292175/1c05745b-b03e-07bf-45c2-e1cf763bc317.png">

何回か試しても4回以上連続しないというパターンを出現させるのは至難。面白い。
herokuに上げているので下のリンクから試してみてください。(アクセス時間かかります)

https://coinapp0619.herokuapp.com/

## 感想
あれに似てるな。クラスメイト40人くらいいたとして、誰1人誕生日に被りがない確率がかなり低いというやつ。
10%くらいらしい。
誰かが数字は嘘をつかないが、嘘つきは数字を使うって言ってたように、数字って人間の感覚とはまた違った結果になるんやな。
おもしろい。
おしまい。

>https://twitter.com/ugkajiwara
>ツイッターフォローとLGTMをください！！！

## 追記
コメントで@scivola様よりrubyでの簡略化した書き方をご教授いただきましたので参考にしてみてください！
ImageSpanで画像の高さを変えたい

# はじめに
今回は　spanを使っていく中で　画像と行の高さが合わずに、違和感がある状態だったので
色々試した結果　どこを変えたかを記事にして残しておきます

# ImageSpan

    public ImageSpan(@NonNull Context context, @NonNull Bitmap bitmap, int verticalAlignment) 

とある様に
ImageSpanでは必須の引数として　Context と　Bitmap を必ず設定する必要があります
**必須の引数二つのみ**を設定していると画像の高さは行の下辺と画像の下辺が同じ高さになるのが
デフォルトの様です



# 解決法
画像の高さを変えるにの注目したのは　第三引数にある　verticalAlignment　でした
intであるので　はじめは適当な数字を入力してみましたが、特に変化はありませんでした
そこで０から順に入力してみることにしました
０では初期値である　行の下辺と画像の下辺が同じ位置になりました（変化なし）
１にしたところ、画像の高さは　行の上辺と下辺の間、つまり真ん中の高さに設定されました
これにより　行と画像の高さにより違和感を払拭することに成功しました！


# おわりに
今回は高さを調整することで見た目をよく見せる手段を取りましたが、画像のサイズを変えたり、行の高さを変えたりと、spanの機能をうまく使えば　色々な方法があるのではないかと考えています
spanについては調整が見た目でわかるものが多く色々試すのが楽しく思えるので、今後も
問題の解決や、今後覚えておくと便利そうなものがあれば　記事に残しておこうと思いました
ベイズ統計学入門(1) ベイズ更新とは

観測データを増やしていくことで確率を更新していくベイズ統計学の基本的な考え方です。
例えば、赤球と白球が入った袋Aと袋Bがあったとします。
袋Aには(赤球,白球)=(6,4)
袋Bには(赤球,白球)=(5,5)
の分だけそれぞれの球が入っていることがわかっているとします。
ここで、A,Bどちらの袋であるかがわかっていない状態で袋から玉を取り出してみてA,Bどちらかを言い当てるということをしてみましょう。
（※ただし取り出した球は色を見た後すぐに復路に戻すとします。）

一回目: 赤が出ました。さて、どちらの袋でしょうか？ …当然一回しか取り出していないのでわかりませんね（笑）
二回目: 赤が出ました。また赤です。もう一回取り出してみます。
三回目: 赤が出ました。なんとなくこの袋は赤が多いようだからAっぽいな。。。？

と回数を重ねていき、赤が出た回数が多ければ多いほど袋Aである確率(確信)が頭の中で更新されていくイメージが湧くかと思います。
これがいわゆるベイズ更新と言われるものです。データが多ければ多いほど精度は良くなっていくという直感的に理解しやすいのではないでしょうか？


今回はこのベイズ更新をpythonを使って実装していきます。


    import matplotlib.pyplot as plt #グラフを描画するためのモジュール
    import pandas as pd #統計分析用のモジュール
    import numpy as np #多次元配列における計算をするためのモジュール　統計データは多次元配列であるこ 
    とが多いためよく使われる
    from scipy.stats import bernoulli   #確率分布を利用したい場合に用いるモジュール　今回の場 
    合、確率分布はAかBか、表か裏かという、二択の場合によく用いられるベルヌーイ分布を用いる。


    plt.style.use('ggplot')

    #パラメータの設定

    p_A = 4.0/10.0  #Aの球を選んできた場合に赤の玉を選んでくる確率
    p_B = 5.0/10.0  #Bの球を選んできた場合に赤の玉を選んでくる確率

    p_prior = 0.5   #どちらを選んだのか、よくわからないからとりあえずA,Bの二択であることからAを選んだ確 
    率を0.5と設定しておく

    #0を白、1を赤球とする

    data = [0,0,1,0,1,0]    #所得データ

    num_data = 2    #使用するデータの個数 データの個数を増やすほどに、事後確率の精度が上がっていく

    likelihood_A = bernoulli.pmf(data[:num_data], p_A)   #袋Aに関してベルヌーイ分布に従う 
    球の選び方の確率密度関数(尤度関数)を出力　num_data番目までのデータを使用 p_Aの部分は、1の時の確 
    率を渡す
    likelihood_B = bernoulli.pmf(data[:num_data], p_B)   #袋Bに関してベルヌーイ分布に従う 
    球の選び方の確率密度関数(尤度関数)を出力　num_data番目までのデータを使用 p_Bの部分は、1の時の確 
    率を渡す

    p_A_posterior = p_prior #Aの事後分布(更新前)
    p_B_posterior = p_prior #Bの事後分布(更新前)

    p_A_posterior *= np.prod(likelihood_A)
    p_B_posterior *= np.prod(likelihood_B)


    #正規化(足したら1になるように調整する)

    normal = p_A_posterior + p_B_posterior

    p_A_posterior /= normal
    p_B_posterior /= normal

    df = pd.DataFrame([p_A_posterior,p_B_posterior],columns=["post"])
    x = np.arange(df.shape[0])

    plt.bar(x,df["post"])
    plt.xticks(x,["袋A","袋B"]) #メモリに名前をつけたい場合に用いる　
    plt.show()  #描画


#取り出す回数が1回だけの場合(使用するデータが1回目だけ、つまり、num_data = 1)の出力結果

![スクリーンショット 2022-06-19 23.25.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667538/614cf27d-28ca-7189-03dd-e43512aa77d4.png)

一回だけだと、どっちなのかよくわからない状況ですが....

回数を増やしていくごとに確率の精度が上がっていくのが実感できると思うのでぜひ試してみてください。
Javaの学習まとめ①

### はじめに
Javaの学習はじめたので用語をまとめています。
理解のためにRailsでやった内容だとこういう意味かな？とリンクさせたりしていますが合っているのか自信はないです🙇‍♀️
（Rubyは学習できていないのでRailsで考えています）

なにやらメソッドやらクラスやらインスタンスやらの用語が結構出てきます。
モデルへのメソッドの定義方法を知れたことが結構でかく、言っていることが少しわかります。
↑これが出来るようになるまでは出てくる用語に対して全然理解できていなかったのでJavaの学習が進まなかったと思います。

#### 言語
Java:コンパイル言語
はじめにソースコードをパソコンが理解できるように置き換えてからプログラムを実行。
いちいちコンパイルしてから実行するので面倒だけど一度書いちゃえば環境問わず、高速に動作する。
Railsみたいにdebuggerを入れてデバッグは出来ないらしい

Rails:スクリプト言語
実行するたびに理解できるように書き換える。プログラムが途中でも実行が可能。

Javaの使いづらい部分を改善するために出来た言語が多いが、それでもJavaはよく使われている。大人数での開発だとJavaを使うことが多い。

#### 構文
大文字小文字を区別します。

{}で囲まれたブロックと;で終わる文で構成
必ず文が終わる時は;が必要なのでちょっとめんどくさいです。

ブロック：プログラムの塊、do ~ endみたいなもの
メソッドブロック：メソッドを記述する、クラスブロックの内側に記述
クラスブロック：メソッドをまとめるクラス、Modelをイメージするとちょっと分かる

空白や改行がなくてもOK（単語の途中ではNG）、わかりやすさのために改行する。

JavaScriptみたいな書き方だと思いました。

#### 変数
ここが大きくRailsとは違いました。

型 変数名;
Railsだと型は意識しなくても変数を作れるので手当り次第作れましたが、Javaでは何を入れるか、何が入るかを意識してつくる必要がありそうです。

そして変数を使うには宣言が必要になります。
ここもRailsではなかったかなと思います。

##### 変数の宣言
int number;
ってやると変数numberが使えます。

変数に入れる値が決まっているのなら↓でいけます。
int number = 15;
これを<b>変数の宣言と初期化</b>と言うそうです。

初期化：宣言した変数に初期値を代入すること

#### 定数
final と付けると定数になる。

#### 条件分岐
- if文
- switch文：breakを明示的に記述してあげる必要がある。
Railsでのwhen ~ と同じ感じでしょうか？

#### 繰り返し
- while文
- do-while文
ここの違いはfalseのときに何も実行しないのがwhile文
falseでも必ず1回は実行して切れるのがde-while文
- for文：繰り返したい数が決まっていればwhileよりもこっちが良い？
- 拡張for文：配列やコレクションの全要素に対して処理を行う
Railsでのmapメソッドに近いのかなと思いました。
取り出しては処理、取り出しては処理してくれるので.eachだと処理書くと複数行になってしまうけど.mapだと一行で書けていました。

continueはif文がtrueだと処理をスキップ

#### クラスとメソッド
パッケージ：目的に合わせてグループ化したもの
ディレクトリ構成が jp1 > practice.javaとなる場合
practice.javaファイルの冒頭に　package jp1;　と宣言する。

　インポート：他のファイルをインポートして使えるようにする
メソッドを書くファイルと実行するファイルを分けるらしい、なのでimportが必須。
実行ファイルには  public static void main(String[] args) { ~ }が付く
Railsのモデルに書いてviewは違うファイル（ディレクトリ）みたいな感じ？かなり違う気がするけど理解はしやすいのでとりあえず進みます。

this変数：自分自身のインスタンスを指す、Railsのselfだと思います
コンストラクタ：インスタンスを生成する際に実行されるメソッド、クラスメソッドみたいなものだと思っときます

#### 例外処理
- Errorクラス：致命的なエラーを表すクラス
OutOfMemoryError等
- Exceptionクラス：一般的な例外を表すクラス
例外を補足する記述がないとコンパイルエラーになる
→きちんと例外処理されているかチェックできるので「チェック例外」とも呼ばれる
FileNotFoundException等がある
- RuntimeExceptionクラス：バグと言われる例外を表すクラス
コンパイルはされても、プログラム実行中に発生する例外
コンパイル時にはチェックされず実行されるため「非チェック例外」と呼ばれる
NullPointExceptionやArithmeticException（0で割り算した時のエラー）等がある

例外処理自体全く意識していなかったです。
たしかに世に出回っているサイトでエラー画面とか見たこと無いので、すごく重要なことだと思いました。

上記のエラークラスを使用しながら例外処理を行っていきます。

```
try {
    tryブロック（例外が発生する可能性がある処理）
} catch (例外クラス 変数名) {
    catchブロック（例外が発生した時に実行する処理）
} catch (例外クラス 変数名) {
    catchブロック（例外が発生した時に実行する処理）
} finally {
    finallyブロック(例外発生の有無にかかわらず必ず実行する処理)
}
```

try文:必ず必要な文　本当に実行したいプログラム
catch文：try↑での起きた例外と、例外クラスが一致するとブロックの処理が行われる
なので複数の例外クラスを記述する事ができる
例外処理がいらないなら使わない
finally文：例外発生問わず必ず実行される文、無くてもOK
throw文：意図的に例外を発生させたいときに使用「例外をスローにする」という
例外処理が動作しているかチェック？
例）throw new SQLException("好きな文字列")で呼び出し＋文章出力

#### メモ
◯シンプルなメソッドの呼び出し
クラス名.メソッド名
クラス名.　とかインスタンス.　とか忘れがち

### 最後に
ダラダラ長くなっているので②に書いていくことにします。
かなり曖昧で学習中ですので多々間違っている所があるかと思います。
ただ、youtubeをみて概要を少し知れたのでもう少し精度を上げて②を作成できたら、と考えています。

閲覧いただきましてありがとうございました！
お客さんのVMが乗っ取られかけた話

## 初めに

まだ社会人2年目くらいの時に、自分が開発に携わった製品の導入作業に参加することになった。
自社製品はtoB向けのWindows Serverに導入することができる製品で、当時はまだ導入手順が、それほど自動化されていなかった。
そのため、オンプレのWindows Serverをお客さんに用意してもらったら、その後こちらが現地に赴き2時間ほどかけて導入作業をするというのが流れになっていた。

## 初めての形式のお客さん

ただ、その時のお客さんはいつもと要件が異なり、AWSのクラウドに上げてあるWindows VMに製品を導入してほしいとのことだった。

オンプレでの導入実績はあったが、クラウドにあるVMに導入することは初めての試みであったため、いつもの手順ではなく、以下のような手順をとり、導入することになった。
- まずはこちら側で同じVMを用意し、導入のリハを実施
- うまくいくことを確認したら客先のVMへ導入
- 最後、客先のネットワークからちゃんと動くことを確認するため現地に赴き検証(一部客先社内ネットワークから実施しないといけない作業もあるため、残念ながらこの部分は外せない。)

と、大体こういう手順を踏むことになった。

んで、いろいろオンプレのWindows ServerとVMの間では勝手の違いがあり、リハでミスもいろいろあったがそれらを全て解決しいざ客先のVMに導入。これもうまくいき、「後日そちらに行きますんで、よろしくお願いします」というところまできた。

正直リハの時点でVMとオンプレのサーバーの仕様の違いに痛い目を見せつけられて、導入手順書が2倍以上近く膨れ上がったところがこの仕事のピークだと思っていたが、実際はそんなんじゃなかった。

## 乗っ取り

実際に客先に赴くとうちの製品が動いていないのだ。VM自体は動いているが、VMに置いたうちの製品が機能していない。もちろん導入後にうちの製品が動いていることは確認したので、導入から、お客さん先に赴くまでのタイムラグの数日の間にうちの製品が落ちてしまったのだろう。しかし、VMは立っているが製品は機能していないというのはおかしい状態なので、VMへアクセスし製品が吐き出しているであろう、最後のエラーログを確認しようとする。

で、VMの中身を見るとさらに様子がおかしい。あらゆるディレクトリに「〇〇_README.txt」といった身に覚えのないファイルが転がっている。恐る恐るメモ帳で開くと中には

>おたくのファイルはすべて凍結した、解除してほしくば〇〇にBitCoinでいくら払え(意訳)

といった内容の英語のメモが出てきた。

ランサムウェアにやられVM全体のディレクトリにメモが残されたらしい。ただ、ファイル自体は別になんもロックなどはされておらず、ＶＭ自体を再起動するだけでうちの製品は改めてちゃんと動き出した。

ファイルロック自体は未遂に終わったらしい。

しかし、明らかにランサムが動いた痕跡が残っているためお客さんに報告。幸い、他に用途がないＶＭだったため潰して立て直すことになった。うちの製品の再導入は必要になるが、その程度のコストで済んでよかった。

## 原因

ランサムウェアは何故入り込んだのか？うちのリハ環境も改めて確認したが、当然ランサムが動いた形跡はない。導入に関わるファイルに原因があるわけではない。というかそこに問題があったらオンプレであろうとやられていたはずだ。どうやらお客さんはＶＭをうちの社内ネットワークからもアクセスできるようにする際、ＩＰ制限を丸々取り払ってしまったらしい。本来、お客さん先のネットワークからアクセスできないように制限をかけ、導入作業中はうちの社内ネットワークからもアクセスできるようにする、というのがIP制限の理想の状態なのだが、世界中どこからでもアクセスできるようにしてしまったらしい。加えてVMのID/PASSはIDのほうがデフォルトのままになっていた。

我々もVMへアクセスさせてもらうタイミングでアクセス制限は全開放ではなく、「うちの社内ネットのIPが〇〇なんで、ここだけアクセスできるようにしておいてください」と先んじてお願いしておく必要があったと反省している。

今回は未遂に終わったし、運用前にこういった事態になったおかげでＶＭを簡単につぶせたが、運用中にこういうことが起きてしまったらマジで大問題になるので、冷や汗が出たのを今でも覚えている。

ＶＭのアクセス制限は厳しく！
過去問共有サービス Univer の開発を行いました。


![スクリーンショット 2022-06-19 22.57.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667538/97698656-b2fb-4cfa-b054-c09ded52b39f.png)

過去問共有サービスUniverです。企画からデザイン、デザインに至るまで一気通貫して一人で行いました。


https://universitycommunity.herokuapp.com/

[開発背景]
開発の理由は二つあります。
一つ目の理由は、コロナの影響で縦と横のつながりが薄くなり、過去問が手に入りづらくなったという学生の問題を解決するためです。
また私自身の周りにそういった悩みを抱えている学生の方が多くいたことから、ユーザー数が期待できるため、多くの方のフィードバックを通じてより質の高いサービス開発に取り組めると考えたからです。

[実装機能]
投稿機能、画像投稿機能、ログイン・ログアウト機能、フォロー機能、いいね機能、コメント機能、お気に入り登録機能、検索機能など、お問い合わせフォーム、いいね数やフォロワー数によってソートされる機能などSNSに利用されている基本的な機能を実装しております。

[開発言語・フレームワーク]
言語はRuby HTML/CSS JavaScriptを使用しています。
フレームワークはrailsを選択しました。
技術選択の理由は二つあります。
一つ目は学習効率が高かったからです。
Reactなどのフレームワークの場合、UIには特化しているが、バックエンドの処理は他のフレームワークを使用しなければならなかったため、一つのサービス開発を行うために、複数のフレームワークを学習する必要があるため、学習効率が非常に下がってしまうと考えました。ですがRailsの場合、一つのフレームワークで開発が完結するため、学習効率が非常に高いということで選択しました。
二つ目は日本語の参考記事やサイトが多く存在したからです。
Railsの核の言語であるRubyは日本人が開発したということもあり、多くの日系webサービスにおいてrailsが利用されており、日本語の参考記事が多く存在したことから、複雑な機能の実装をする際に参考記事が多い方が便利であると考えたことからRubyを選択しました。
Your Ruby version is 2.7.3, but your Gemfile specified 2.7.5　と表示されるエラーの解決

<h2>はじめに
<p>ロリポップマネージドクラウドを使い自作アプリをデプロイしようと思い 
<p>

`git push lolipop master`

<p>を行うと

`remote: Your Ruby version is 2.7.3, but your Gemfile specified 2.7.5`

<p>というエラーが起きた。

<h2>エラーについて
<p>エラー内容を直訳すると

`あなたのRubyは2.7.3なのに、Gemfileには2.7.5となっている。`

<p>という事だがGemfileを確認すると2.7.3になっており、他にもGemfile.lock、.ruby-versionを確認しても2.7.3だった。

他サイトなどを参考にし、

`bundle install` や `rbenv local 2.7.3`

<p>などを行っても解決しなかった。

<h2>エラー解決
<p>GemfileやRubyのバージョンを変更した際に、gitにコミットしていないことが原因であった。

そこで

`git add .`

`git commit -m ""`

をターミナルで行った後に

`git push lolipop master`

を行うとアプリをデプロイする事が出来た。

<h2>終わりに
<p>非常に初歩的なミスではあったが、意外と忘れている方もおられるのではないか。

と思い、投稿しておきました。
サクッとAPIを叩く方法 (VS CodeでHTTPリクエストが送れちゃう拡張機能)

# 概要

* 開発中のAPIを試したり、サードパーティのAPIをサクッと叩いてみたいといった時に皆さんどのようにしますか？
* 私は、curlコマンドやPostmanをよく使っています。
* ただ、もっと楽にHTTPリクエストを投げ、かつその時使用した情報を残すことができる方法を以前のチームメンバーに教えていただいたので、記事にしました。

# REST Client

* 今回、紹介するのはVS Codeのエクステンションにある[REST Client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client)というものになります。

* このREST ClientというのはVS Code上でHTTPリクエストを送信し、レスポンスを確認できる拡張機能となっています。

![スクリーンショット 2022-06-19 22.35.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/611bef95-ea3e-8cdf-69d6-6e305dc7c93b.png)

## 使用方法

* 使用方法はすごく簡単で、拡張子が「.http」か「.rest」というファイルで決められた構文に従いHTTPリクエストを記述するだけです。

下記にcrudの例を載せていきたいと思います。
また今回は[REST APIのsample](https://reqres.in/)を使用し、crudを試していこうと思います。


### 全体的な操作感

* まず全体的な操作感を書いていくのですが、左のタブがHTTPリクエストを記述し、右のタブが送信したHTTPリクエストのレスポンスが表示されます。
* 1ファイル内で複数のHTTPリクエストを書く場合には、 ###で区切ることができます。
* また、ヘッダーについてはリクエストを記載している行の直下から空行までをリクエストヘッダと認識するようです。

* コマンドとしては、**Windowsの場合は、Ctrl + Alt + R** / **Macの場合は、Cmd + Alt + R**でHTTPリクエストを送信することができます。
* もしくは、下記のスクショにあるように、それぞれのHTTPリクエストのメソッド名の上に表示されている「**Send Request**」をクリックすると、当該のHTTPリクエストを送信することができます。

![スクリーンショット 2022-06-19 22.56.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/50c5d3d9-840a-48f0-2bdb-7f3d9c0b414f.png)


* もしくはコマンドパレットから「rest」と入力し実行するコマンドもあります。

![スクリーンショット 2022-06-19 22.50.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/db0b25c4-c591-eb5d-2b7a-a935b1cb21d0.png)

### GET

* Getの場合は、methodを省略した形でも送信することができます。

```http

GET https://reqres.in/api/users?page=2HTTP/1.1
Content-Type: application/json

###

https://reqres.in/api/users/2
```

![スクリーンショット 2022-06-19 22.56.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/511fce21-c0cb-77b7-f901-d8b8b30dd456.png)


### PUT/PATCH/POST/DELETE

* bodyを含めるような場合は、下記のようにリクエストヘッダから1行あけて記載していきます。

```http

POST https://reqres.in/api/users HTTP/1.1
Content-Type: application/json

{
    "name": "morpheus",
    "job": "leader"
}

###

PUT https://reqres.in/api/users/2 HTTP/1.1
Content-Type: application/json

{
    "name": "morpheus",
    "job": "zion resident"
}

###

PATCH https://reqres.in/api/users/2 HTTP/1.1
Content-Type: application/json

{
    "name": "morpheus",
    "job": "zion resident"
}

###

DELETE https://reqres.in/api/users/2 HTTP/1.1
Content-Type: application/json
```

![スクリーンショット 2022-06-19 23.00.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/9c86b9f9-7ff3-a161-1224-b0501db16235.png)

# まとめ

* いやぁ、非常に便利ですね。
* **これファイルとして残せるので、チームで共有したい場合はGitなどで共有すると開発効率/あとはデモ等でも使用できそうですね!**

# 参考

https://qiita.com/toshi0607/items/c4440d3fbfa72eac840c

https://reqres.in/
Laravel9を試すためにローカルのPHPをアップデートしたけどcomposerでエラー

忘備録です。

レンタルサーバーとかならそのままちゃんと動くようになっていると思いますが、ローカルだと全部自分で環境作らなきゃ・・

Laravel9＋Vue3のプロジェクト作成記事はたくさんあるので、それ自体はそちらを御覧ください。

たまたま小さなシステムというかツールを作ることになりました。
レンタルサーバーですが、他に何も入ってないサーバーでしたので、ついでに練習がてらLaravel9+Vue3で作ってみようと思ったんです。

Laravel9はPHP8.0以上なんですね。

ローカルで今までPHP7.4が走ってました。

PHPはXAMPPじゃなくてPHPは別で入れてあったので7.4を退避させて8.1.7をダウンロードしてきて解凍。

CLIなのでそのまま

```cmd
php -v
```
で8.1.7の表示を確認。

その後は各種記事を見ながらcomposerでLaravl9をインストールするまでは特にトラブルには見舞われませんでした。

ただインストール後のVueの設定をする際に
```cmd
npm run watch
```
でコンパイルが通らず、vue-loaderが入って無いと言われ、エラーメッセージ中の指示にバージョンまで指定してあったのでその通り16.8.0を入れたら違うエラーが発生。

結局の解決策は
```cmd
npm update
```
vue-loaderがアップデートされてちゃんとVue側のコンパイルが通るという・・
え？それで良いのか・・・なんのためのVue-loaderのバージョン指定なんだ・・・

まぁ良いや。
「npm rum watch」はコンパイル通るようになったので、次は起動させようと思いました。

```cmd
php artisan serve
```
うん、素直に通るわけ無いとは思った。

composerでアップデートする必要があったようです。

```cmd
composer update
```
おい、通らんや無いか・・・

メッセージをよく見るとPHPにcurlが無いって言われて「ああ、PHPを8.0にしたから.iniがそのままなのか・・」って感じです。
各種拡張を有効にします。


とりあえずは

```php.ini
fileinfo
curl
```
を有効にしておけば（要するにローカルにダウンロードする系と思われます）composerは作動するようです。

で、無事にcomposer updateが通りました。

```cmd
php artisan serve
```

うん、ちゃんとVue3のテンプレートが表示されました。

一応最終に動作した環境は・・

Windows11
PHP8.1.7
Laravel9.17.0
Vue3.2.37

でコンパイル＆表示されました。

あくまでローカルでPHP8.0以上を入れてLaravel9を動かす忘備録でした。
２次元配列の斜め方向のループ

２次元配列の各要素にアクセスするとき、斜めの方向にアクセスする必要がある場合がありますが、よく忘れるのでメモしておきました。
以下、斜めに各要素を番号付けした配列を出力するコードです。

```droop.cpp
#include<bits/stdc++.h>
using namespace std;

int main(){
    int n;
    cin >> n;
    vector<vector<int>> ans(n,vector<int>(n));
    int x=0; //通し番号
    //前半部分
    for( int k=0; k<n; ++k ){
        for( int i=k; i>=0; --i ){
            int j = k-i;
            ans[i][j] = x;
            ++x;
        }
    }
    //後半部分
    for( int k=n-2;k>=0; --k ){
        for( int i=k; i>=0; --i ){
            int j = k-i;
            ans[n-1-j][n-1-i] = x;
            ++x;
        }
    }
    //出力
    for( int i=0; i<n; ++i ){    
        for( int j=0; j<n; ++j ){
            if(ans[i][j]>9) cout << ans[i][j] << " ";
            else cout << ans[i][j] << "  ";
        }
        cout << endl;
    }
    return 0;
}
```

前半を数えた後、それをひっくり返したループで後半を数えました。$k$は斜めに見たときの列の要素数-1になっています。
($k+1=1,2,\cdots,n-1,n,n-1,n-2,\cdots,1$と変化します。ちなみに奇数番目の$k$は対角成分を含む列、偶数番目は対角成分を含まない列です。)

例えば、$n=5$で出力すると

```
0  2  5  9  14 
1  4  8  13 18 
3  7  12 17 21 
6  11 16 20 23 
10 15 19 22 24
```

$n=6$で出力すると

```
0  2  5  9  14 20 
1  4  8  13 19 25 
3  7  12 18 24 29 
6  11 17 23 28 32 
10 16 22 27 31 34 
15 21 26 30 33 35 
```

となります。