OmniAICreator/Qiita-1.07M huggingface dataset:
【備忘録】NeologdをGCP経由でWindowsにインストールしてみた。

## 目的
Neologdを自身のPC環境を汚さずに欲しい。

## 概要
Google Compute Engine で辞書をインストールして、
Google cloud storage に zip で保存。
ブラウザからダウンロード。

## 背景
NeologdのダウンロードにはUbuntuが必要であるが、自身のPCの容量がない。
GoogleでUbuntuマシン作成できたな？
と、いうわけです。

触ってみる良い機会でした。
備忘録もかねて試行錯誤と手順を紹介します。



## 前提
- Google Compute Engine（GCE）でインスタンスを作成している。
- Google cloud storage（GCS）でバケットを作成している。

## 手順
1. GCEにGCSをマウントする。
1. GCE上で辞書を取得
1. 辞書をzipファイルにしてGCSに保存。
### 1．GCEにGCSをマウントする。
https://qiita.com/Gushi_maru/items/d1cbbfc7e2a1d790b39d

こちらを参考にしてGCEからGCSにデータを保存できるようにします。

#### ハマりポイント
```
//ホームディレクトリ
$ touch mount/text.txt
```
エラー！！
```
touch: cannot touch 'mount/text.txt': Permission denied
```
なぜだと20分くらい悩み色々検索しました。
なんなら``cd mount``もできない。

```
sudo touch mount/text.txt
```
そういえば、前に起動しなくなったUbuntuでも全部``sudo``を付けてたわと思い出す。
GCSに無事、``text.txt``が作成されていることを確認。
マウント成功。


### 2．GCE上で辞書を取得
NeologdをGCE上にダウンロードします。
今回は、参考記事にあるように、Clund Functions にアプリをデプロイしたかったので、サイズの小さい辞書を取得しました。

```
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd/
$ sudo ./bin/install-mecab-ipadic-neologd -y -p $HOME/neologd-light -n --eliminate-redundant-entry
```
通常の辞書をインストールする場合は、``--eliminate-redundant-entry``が不要です。

```
$ sudo ls
mount  neologd-light
```
こんな感じになるはずです。

[こちらの記事](https://qiita.com/koutya777/items/be1477a237281dd9afda)を参考にさせていただきました。ありがとうございます。

### 3．辞書をzipファイルにしてGCSに保存。
```
$ sudo apt-get install zip
$ zip -r neologd-light neologd-light
$ sudo cp -r neologd-light.zip mount
```
2行目でzipファイルにして、
3行目で、GCSに保存。

完了。
VMインスタンスは停止。
あとは、ブラウザでGCSのバケットを開いて、ダウンロードボタンでPCにダウンロードできます。

### 参考
https://qiita.com/Brutus/items/22dfd31a681b67837a74

https://qiita.com/Gushi_maru/items/d1cbbfc7e2a1d790b39d

https://qiita.com/koutya777/items/be1477a237281dd9afda

https://self-development.info/mecab-ipadic-neologd%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%80%90ubuntu-windows%E3%80%91/
【#12 エンジニア転職学習】Linux基礎  シェルスクリプト活用知識

# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

昨日は睡魔に勝てずそのまま寝てしまったので、本日は朝と夜2回投稿します。

バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。


https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
昨日も一昨日に続きシェルスクリプトの基礎を学習しました。制御構文の続きでcaseとwhile文。シェル関数と、シェルスクリプト活用のための知識を学習しました。

* case、while文
* シェル関数
* **シェルスクリプト活用知識　←Topics!!**


# シェルスクリプト活用知識
エラー出力や変数宣言の際の注意点等が書かれていました。
エラーに関してはif文と出力リダイレクトの組み合わせでエラー出力にするようです。

* `local 変数名=値`でローカル変数宣言が可能
* 標準出力にはコマンド本来の結果を表示、標準エラー出力にはエラーメッセージを表示するという使い分けが基本
* if文＋出力リダイレクトで`1>&2`とすることで標準エラー出力に変換

使用している書籍はこちら↓

https://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84Linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E4%B8%89%E5%AE%85-%E8%8B%B1%E6%98%8E-ebook/dp/B072K1NH76/ref=sr_1_1?adgrpid=113196705062&gclid=Cj0KCQjwzLCVBhD3ARIsAPKYTcR4WAb_4QVrwuBM_1mIPMFsQ6kNDJ-o4yIofVSAI7_eHpWCeva8kKwaAstgEALw_wcB&hvadid=489559881279&hvdev=c&hvlocphy=1009363&hvnetw=g&hvqmt=e&hvrand=10125867468998217428&hvtargid=kwd-1152146940662&hydadcr=21814_10996132&jp-ad-ap=0&keywords=%E6%96%B0%E3%81%97%E3%81%84+linux+%E3%81%AE+%E6%95%99%E7%A7%91%E6%9B%B8&qid=1655473534&sr=8-1




# おわりに
最後までお読みいただきありがとうございました。
本日もLinuxの続きを行います。
アドバイス・応援コメント等いただけますと幸いです。
ジニ不純度

# 定義
>決定木のあるノード$t$に対し、ノード内のサンプルが$n$個、ノード内のクラスが$c$個のときを考える。
このノード$t$内で、クラス$i$に属するサンプルの個数を$n_i$とすると、クラス$i$に属するサンプルの割合$p(i|t)$を、
$$ p(i|t) = \frac{n_i}{n} \tag{1} $$
と書く。このとき、ジニ不純度$I_G(t)$の定義は以下。
$$ I_G(t) = 1 - \sum_{i=1}^c {p(i|t)}^2 \tag{2} $$
同じくエントロピー$I_H(t)$の定義は以下。
$$ I_H(t) = -\sum_{i=1}^c p(i|t) \log p(i|t) \tag{3} $$
エントロピーの対数の底はなんでも良いが、ノード内のクラス数$c$にするとエントロピーの最大値が$1$になるのでよく採用される。（後述）

引用
https://qiita.com/Qiita/items/c686397e4a0f4f11683d

![tree.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1546468/1e8bcb30-c228-1a12-f798-f013dd2afb51.png)

# 計算例
上記の画像はtitanicのデータをもとに決定木分析を行った画像。一番上の木の値を使って計算をしてみる。

$$
I_G(t)=1-\left\\{\left(\frac{421}{668}\right)^2+\left(\frac{247}{668}\right)^2\right\\}\sim 0.466
$$

```python
print(1-(421/668)**2-(247/668)**2)
# 結果
# 0.4660753343612176
```
AWS Solutions Architect - Associate合格まで（2022.06）

[AWS学習事始め - 基礎資料読んだリスト～Cloud Practitioner合格まで（2022.02） - Qiita](https://qiita.com/e99h2121/items/bec62a16c1264baf6a5e) 以来2件目の合格である。

## 感想

- 勉强前の私
    - AWS界のITパスポート = Cloud practitioner
    - AWS界の基本情報 = SAA
    - 従って普通に頑張れば余裕
- 勉強を始めた私
    - そんなことないわ...
- AWS試験札所巡りを開始した者が最初あるいは2件目に取得すると思われるメジャーなアイテムであり参考書、模試も豊富。世間の受験記事の中には2週間で！とか1か月で！とかいう文言も踊るが侮ってはいけない、彼らは既に実務や個人開発、趣味で素養があるから取れているのである。私のようにCloudFrontとCloudWatchとCloudTrailとでどれがどれだったっけとか思っている者にはここからが本戦。
- 問題を解いて覚える性
    - 1日目: 問題を解く → 解けなかったところを覚える
    - 2日目: 昨日の問題を解く → 解けたら次に行く、今日の問題を解く → 解けなかったところを覚える
    - 3日目: 一昨日の問題を解く → 解けたら昨日の問題をとく → 解けたら（以下続く
- 文字よりグラフィック
    - Snowmobile → エクサバイトとは... ? だが
    - [ASCII.jp：エクサバイトをAWSへ！写真で見る「AWS Snowmobile」 (1/2)](https://ascii.jp/elem/000/001/278/1278918/) ... アッハイ、ってなりますよね。図解大事。
![](https://ascii.jp/img/2016/12/05/559465/l/88663a0b07ae324c.jpg) 画像は記事から引用
- 受験形式: [AWSのDesign for falureを学んだ話 - PSIオンライン自宅受験は2022年6月も政府発行のLatin氏名身分証が必要 - Qiita](https://qiita.com/e99h2121/items/d684714a66889c93b6c1) からの、テストセンター受験。
- 嬉しかったです。

## ロードマップ

試験ガイドとサンプル

https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/

注意: [試験の更新、ベータ試験、新しい認定 | 近日公開の AWS 認定 | AWS](https://aws.amazon.com/jp/certification/coming-soon/)

https://www.udemy.com/course/aws-associate/

https://aws.amazon.com/jp/blogs/news/2022-aws-beginner-learning/

を中心に、あらゆる教材を総ナメしてしまった。その足跡は以下
[AWS SAA なぐり書き (1)](https://zenn.dev/e99h2121/articles/aws-saa-memo-1)
[AWS SAA なぐり書き (2)](https://zenn.dev/e99h2121/articles/aws-saa-memo-2)
[AWS SAA なぐり書き (3)](https://zenn.dev/e99h2121/articles/aws-saa-memo-3)
[AWS SAA なぐり書き (4)](https://zenn.dev/e99h2121/articles/aws-saa-memo-4)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/11af5efd-11ad-09ca-30ff-78c2e088f871.png)
書いて覚える世代です

## 次ステップ

- DVA、SOAを取りに行って2022年中に4冠
- 個人的に好きな分野 データベースなスペシャリティを目指す
- あるいはSAPを一本釣りに行く



どれにしよう... どちらにしてもSaaS屋さんやるなら勉強してムダなことは1mmもないはずだ！ という気持ちのもと引き続きがんばります。

以上です～
ABC257-D O(N^4)

O(N^3) → O(N^4) に訂正しました。

https://atcoder.jp/contests/abc257/tasks/abc257_d

---

### 想定解

$ $
$S$を決めると、頂点間の移動について数値ではなく可能/不可能の`bool`値に還元できる。ワーシャルフロイド法でいずれかの頂点を始点として全頂点に到達可能かどうか、$O(N^3)$で求まる。あとは条件を満たす$S$の最小値を2分探索で求める。$O(N^3logS_{max})$で求まる。
$ $

---

### コンテスト中に試みたこと

$ $
コンテスト中に試みたこと
頂点間の移動コストは、$dist(x,y) / P_x$。辺のない状態から出発して、値の小さい方から辺を追加していく。いずれかの頂点から全頂点に到達可能になれば、最後にみた$⌈ dist(x,y) / P_x ⌉$が求める$S$。
時間中は全ての頂点からダイクストラ法で全域木を求め、最後に採用した辺についての$⌈ dist(x,y) / P_x ⌉$を解としたが、TLEとなった。WAではないがおそらく嘘解法
$ $

$ $
想定解は納得いくものではあるが、頂点間の移動コストの小さい順から試すというアプローチも捨てがたく、なんとかならないものか。
頂点間の移動コストが対称であれば、無向グラフの連結性の問題となり、Union-Findのデータ構造が利用できる。しかし、今回はうまくいきそうにない。
$ $

---

### ワーシャルフロイド法を利用

$ $
想定解にも登場するワーシャルフロイド法は有向グラフの全頂点間最短距離を$O(|V|^3)$で求めるアルゴリズム。

```rust: wf.rs
for k in 0..n {
    for i in 0..n {
        for j in 0..n {
            dist[i][j] = dist[i][j].min(dist[i][k] + dist[k][j]);
        }
    }
} 
```

`dist[i][j] = ...` は、「新たに使用できる頂点kを使用する場合と使用しない場合を考え、全頂点間の距離を更新(緩和)する」処理。詳しくはけんちょん本を。


この考えを利用し、「新たに使用できる辺を使用する場合と使用しない場合を考え、全頂点間の距離を緩和する」。

```rust:AC.rs
fn main() {

    (中略)

    // amは隣接行列。bool値で管理
    let mut am = vec![vec![false; n]; n];
    for i in 0..n { am[i][i] = true; }

    // edgesは辺のリストで、(移動コスト, 始点, 終点)が昇順で格納されている
    for (r, k, l) in edges {

        // 辺の数はN^2程度あるが、木ができれば終了するので実際の処理はN回程度。
        // ↑有向グラフなので最大N^2オーダーありそうです
        if am[k][l] { continue; }
        am[k][l] = true;

        // 辺k->lの情報を加味し、全頂点間の連結情報を更新する
        for i in 0..n {
            for j in 0..n {
                am[i][j] |= am[i][k] && am[l][j];
            }
        }

        // ある頂点を始点とし、全ての頂点に到達可能となれば打ち切り
        if am.iter().any(|v| v.iter().all(|&x| x == true )) {
            // ⌈dist(x,y) / Px⌉ が求める解
            println!("{}", r.ceil());
            break;
        }
    }
}
```

時間計算量は、$O(|E|log|E|+|V|^2|E|) = O(N^2log(N^2)+N^4) = O(N^4)$。

https://atcoder.jp/contests/abc257/submissions/32765198
2022/6/27主にITとかセキュリティの記事

イオンカード、三井住友などクレジットカード利用確認偽るフィッシング確認(6/25)
https://news.infoseek.co.jp/article/mynavi_2436548/?tpgnr=it

Log4Shellはまだ現役？　VMware Horizonを対象にしたサイバー攻撃を確認(6/25)
https://www.itmedia.co.jp/enterprise/articles/2206/25/news035.html

「ギフトカード詐欺」被害が増加中　イギリスの大手スーパーが顧客に注意喚起(6/25)
https://sirabee.com/2022/06/25/20162882030/

トークン経済圏じわり　「投機の場」脱却できるか
Tech×Market 逆境ブロックチェーン㊦(6/24)
https://www.nikkei.com/article/DGXZQOUB1360N0T10C22A6000000/

NSO Group、EU5カ国以上が同社のスパイウェア「Pegasus」を利用していると自白(6/25)
https://news.mynavi.jp/techplus/article/20220625-2377973/

ANA、移動ビズ脱却目指す　「マイル」顧客データ充実(6/25)
https://www.nikkei.com/article/DGXZQOUC144DR0U2A610C2000000/

Apache Tomcatにクロスサイトスクリプトの脆弱性、対策と今後更新を(6/25)
https://news.mynavi.jp/techplus/article/20220625-2378780/

Citrix Hypervisorに脆弱性、アップデートを(6/25)
https://news.mynavi.jp/techplus/article/20220625-2378791/

アルゴリズムに法の目　食べログ判決、独禁弁護士が解説(6/25)
https://www.nikkei.com/article/DGXZQOUC17AQM0X10C22A6000000/

イチから身につく 営業店でのマネロン等対策【第4回】個人の口座開設でリスクを踏まえた対応はどう行えばいいの？(6/25)
https://zuuonline.com/archives/239424
railsにjqueryを導入し、外部ファイルから読み込む時

yarn add jquery

config/webpack/environment.jsに下記を記述。

const webpack = require('webpack')
environment.plugins.prepend('Provide',
  new webpack.ProvidePlugin({
    $: 'jquery/src/jquery',
    jQuery: 'jquery/src/jquery'
  })
)

app/javascript/packs/application.jsに下記を記述。
require("jquery")

これでscriptタグから作るjqueryの動作は作れる。

ただ外部ファイルに分けて動作をさせたい場合は、
app/javascriptの直下に任意のファイル（〇〇.js）を作り、
app/javascript/packs/application.jsに下記を記述。
require("〇〇")
【.NET】WPFのGridを動的に作成してボタンを追加する

# はじめに
Macに無料のWineskinServerを使用してWindowsアプリケーションを幾つか動かしています。ただ、WineskinServerを使うと1つのアプリケーションに1GByte近く容量が取られます。
それならば、1つのWineskinServerに複数のアプリケーションをインストールしてランチャーを使って起動するようにすればいいのではと思いました。ところがネット上で検索して見つけたランチャーソフト(CLaunchなど)をインストールしてみると、ことごとくエラーで動かない。
簡単なランチャーくらいなら自分で作ろうと、どうせならWinFormより高解像度対応なWPFにしようと思ったんですよね。

WPFでDataGridやListViewを使用し、Windows上で動いたのでWineskinServerに持っていって動かすと駄目なんですよね。
DataGridではアプリケーションが表示段階で落ちてしまうし、ListViewでは表示されたけどリストをクリックしても反応しない。
唯一GridにButtonを配置した状態なら動いたので、これを拡張していこうとしています。

※Wineは.NET系は苦手なのか、または自分の作成したWineskinServer環境の何かが悪さしているのかも。

# Gridを動的に作成
ランチャーとして「[CLaunch](http://hp.vector.co.jp/authors/VA018351/)」に想定して作成したいので、Windowsのサイズを変更したらボタンの数も増えるようにしたい。ちょうどいい下記の記事を見つけました。

https://qiita.com/mkuwan/items/ad99164bcba97e1e1b5f

## 実装
参考サイトのプログラムを利用しています。ただ、ReactivePropertyは使用しないので、.Valueは一旦消しています。

```xml
<customgrid:CustomGrid x:Name="gridMain" 
                       GridColumnCount="{Binding GridColumnCount}"
                       ColumnDefinitionWidth="0"
                       GridRowCount="{Binding GridRowCount}"
                       RowDefinitionHeight="0"/>
```

```cs
public MainWindow()
{
    InitializeComponent();

    gridMain.GridRowCount = 3;
    gridMain.GridColumnCount = 4;
    gridMain.ShowGridLines = true;
}
```

## 実行結果
分かりやすように`ShowGridLines = true`にして線を表示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/0668263d-b1a6-dfc4-89cf-4c0c6942396b.png)

# Grid内にボタンを追加
ボタンを動的に追加していきます。

https://stackoverflow.com/questions/34886689/add-dynamic-buttons-in-grid

## 実装

```cs
public MainWindow()
{
    InitializeComponent();

    gridMain.GridRowCount = 3;
    gridMain.GridColumnCount = 4;
    gridMain.ShowGridLines = true;

    int count = 1;
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            Button MyControl = new Button();
            MyControl.Content = count.ToString();
            MyControl.Name = "Button" + count.ToString();
            MyControl.Click += new RoutedEventHandler(Button_Click);
            Grid.SetColumn(MyControl, j);
            Grid.SetRow(MyControl, i);

            gridMain.Children.Add(MyControl);

            count++;
        }
    }
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    Button b = (Button)sender;
    MessageBox.Show(b.Name);
}
```

## 実行結果
MacのWineskinServer上に持っていって動かしてみました。
![スクリーンショット 2022-06-27 2.41.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/01423c68-8bf4-40d5-236d-9750735c76c7.png)

# 最後に
メッセージボックスの代わりにプロセス起動させれば、対象のアプリケーションが動くようになります。

```cs
Process p = Process.Start("C:/Program Files/aviutl110/aviutl.exe");
```

これから少しずつアプリケーションの登録設定や見た目や常駐化などを付け加えていきます。
自分のWineskinServer環境が悪かったとしても、それで動けば他の人の環境でも問題なく動くだろうと思って頑張ります。
ACID特性の Isolation (分離性) に関して雑にまとめる

自分の言葉で垂れ流す。

トランザクションは処理の塊。

> データベースへの読み書き（トランザクション処理）には処理時間が発生する。複数のトランザクション処理依頼がデータベース管理システムへ行われたとき、これらを処理する1つの方法は逐次的（Serial）に1つずつトランザクションを処理する方法である。トランザクション処理に処理時間がかかることから、後に行われた処理は先に行われた処理が完了するまでの間「待ち」の状態になってしまう。
> 
> 待ちを最小化するためにはデータベース管理システムが複数のトランザクションを並行（Concurrent）に処理すればよい。しかしトランザクションは必ずしも安全に並列化できるとは限らない。そのためデータベース管理システムは各並行トランザクションが互いに影響を受けず分離された安全な範囲内でトランザクションを並行化する。あるいは、異常な振る舞い（anomalies）を起こしうる分離レベルが低い並行化を許容し、代わりに並行性を高めてトランザクション処理性能を上昇させる[1]。この安全性・一貫性と性能のトレードオフを生む、並行性トランザクションの分離具合がトランザクション分離レベルである[2]。


トランザクションの並列化の際に、実行中のトランザクション内で発生する問題は以下がある。

- dirty read
   - 他のトランザクション内でなされた、コミットまで行っていない「レコードの変更」・「新規作成されたレコード」が見えてしまう
- non-repeatable read
   - 他のトランザクション内でなされた「レコードの変更」により、トランザクションの実行中にレコードの値が書き変わってしまう。
- phantom read
   - 他のトランザクション内でなされた「レコードの新規作成」により、トランザクションの実行中にテーブル内に新しいレコードが新しく見えるようになる。

これらのどこまでを許容するかは実行するトランザクションの４つの分離レベルとして設定される。
(最も厳しい分離レベルのSerializableだとどれも発生しないが、パフォーマンスが良くない。これらはトレードオフの関係にある。)

- Read uncommitted
- Read committed
- Repeatable read
- Serializable

以下がSQL標準で定義されている対応表。
なお、Serializableは内部で複数のトランザクションが一つずつ実行されているとは限らない。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/5081023b-6125-f99c-275b-d5d366d84190.png)
(from. https://techracho.bpsinc.jp/kotetsu75/2018_12_14/66410)


これらのモードの実行にはテーブルあるいはレコードのロックが使用されているらしい。


## Ref

- [ファントムリードは起こらないのにSEIRIALIZABLEでない、それがポスグレのREPEATABLE READ
](https://qiita.com/yuba/items/89496dda291edb2e558c)
Marp と Markdown Preview Enhanced の共存で詰まった話

<!--
title: Marp と Markdown Preview Enhanced の共存で詰まった話
tags: VSCode,Marp,Markdown-Preview-Enhanced,VSCode-Extension
-->

# 内容

Marp for VSCodeを使ってmarkdownをスライド形式でプレビューするにはVSCodeの標準プレビュー機能を使う必要があります。

でも Markdown Preview Enhanced を入れると標準プレビューのボタンが非表示になってしまいます。

なので設定で非表示を無効化してあげましょう。

```json:setting.json
{
  "markdown-preview-enhanced.hideDefaultVSCodeMarkdownPreviewButtons": false,
}
```

どうやら [2022/3/1のコミット](https://github.com/shd101wyy/vscode-markdown-preview-enhanced/commit/b210492ab5e3470ea10a8c6581fea9dfde7fa8f7) で追加された新しめの機能のようです。どうりでググっても困っている人が見つからなかったわけだ...（2022/6時点）
【Laravel】フラッシュメッセージが再表示されるのを防ぐ

## やりたいこと

flashメソッドやwithメソッドを使ってフラッシュメッセージを表示させる際、
「当該ページでフラッシュメッセージを表示」→「他のページに移動」→「ブラウザの戻るボタンで元のページに戻る」
上記を行うと同じフラッシュメッセージが再表示されてしまう。これを防ぎたい。

## 実装方法

以下コードのように、phpで作成したユニーク値をJavaScriptを使用してブラウザのストレージに保存し「一度目の表示かどうか」を判定する。具体的なコードの説明は本記事の最下部に載せています。
```html:example.blade.php
<div id="FlashMessage">
    <p class="FlashMessage_Text">
        {{session('message')}}
    </p>
</div>

<script>
    if( "{{session('message')}}" ){
      const messageIdValue = "{{ uniqid() }}";
      if (sessionStorage) {
        if (sessionStorage.getItem('messageId') === messageIdValue) {
          document.getElementById('FlashMessage').style.display = "none";
        }else{
          sessionStorage.setItem('messageId', messageIdValue);
        }
      }    
    }
</script>
```


## そもそもフラッシュメッセージの仕組みは？

サーバのSessionデータにメッセージを保存し、それを呼び出している。

通常であればSessionデータに保存した値は特定の条件が満たされるまで保持される。
しかし、flashメソッドやwithメソッドを使用した場合は、Sessionに値を保存した後、１回目のリクエスト（ページ遷移）が終了するとその値が削除される。
なので、特定の操作（記事投稿やログインなど）のあとに１度だけフラッシュメッセージを表示することができる。


Sessionってなんだっけ？という場合は下記の記事様がわかりやく解説してくださってます。

https://qiita.com/hththt/items/07136ad74127999df271


## なぜブラウザの戻るボタンだと再表示される？

ブラウザのキャッシュでページを表示しているから。

通常、ブラウザの戻るボタンは、元のページ宛に改めてリクエストを送っているわけではなく、ブラウザのキャッシュによりページを表示している。つまりサーバとは通信していない。なのでSessionデータに保存したメッセージがサーバ側で消えていても関係ない。

## コードの説明
```html:example.blade.php
<div id="FlashMessage">
    <p class="FlashMessage_Text">
        {{session('message')}}
    </p>
</div>

<script>
    //Sessionデータにメッセージが有るかどうかを確認
    if( "{{session('message')}}" ){
      //phpのuniqid関数でユニーク値をセット
      const messageIdValue = "{{ uniqid() }}";
      //主要ブラウザはsessionStorageに対応しているが、念のため確認
      if (sessionStorage) {
        //messageIdの値が同じだったら、フラッシュメッセージをdisplay:none;する
        if (sessionStorage.getItem('messageId') === messageIdValue) {
          document.getElementById('FlashMessage').style.display = "none";
        }else{
          //messageIdがない場合は新しくセット。
          //messageIdは有るが値が違う場合は上書き。
          sessionStorage.setItem('messageId', messageIdValue);
        }
      }    
    }
</script>
```
ユニーク値はphpで作っているので、ブラウザの戻るボタンを押して同じページに戻った場合、messageIdValueの値は１度目の表示時と同じになります（前述の通りキャッシュでページを表示しているため）。
なので、このmessageIdValueをsessionStorageに保存→照合することにより１度目の表示なのかどうかが判定できます（ちなみにsessionStorageはブラウザのストレージなのでサーバ側のSessionデータとは異なるものです）。
whileをforで代用しよう


# はじめに

皆さんは，`while`を使うべきコードをあえて`for`で書きたくなったことはありますか? (私はありません。)
今回は，そんな素直じゃない皆さんのために`while`を`for`で代用する方法を紹介します。

## 逆は簡単

今回やる逆の「`for`を`while`で代用する」はかなり簡単に実現できます。
`for`が実際にどういう処理なのかを知っておくと`while`を実装する際に理解しやすくなりため一応紹介しておきます。

Pythonの`for`はひたすらイテレータを`next`で叩いて`StopIteration`例外が飛んで来たら止めるだけです。
てなわけで
```python
i = iter(range(10))
while True:
  try:
    item = next(i)
    print(item)
  except StopIteration:
    break
```
のようにすればOKです。

この辺りの事情を知りたい方は[Cpythonのソース](https://github.com/python/cpython/blob/main/Objects/iterobject.c)でも眺めてみるといいかもしれません。

# カスタムイテレータ

ループ回数がわからない`while`を`for`で実現するのは難しそうなので，カスタムイテレータを定義します。
カスタムイテレータは`__next__`と`__iter__`を持つクラスで，この2つのメソッドがあることで`for`に食わせることができます。
`__next__`は上で紹介した`next`のよって呼ばれるメソッドです。
この中で条件式を評価してあげればよいでしょう。
これを実装してあげると
```python
class WhileIter():
  def __init__(self, cond):
    self.cond = cond
  
  def __next__(self):
    if self.cond():
      return None
    raise StopIteration
  
  def __iter__(self):
    return self
```
のようになります。

これを使う時は
```python
n = 0
for _ in WhileIter(lambda: n < 10):
  print(n)
  n += 1
```
のようにします。
条件式`cond`は引数を取らず`bool`として評価可能な値を返す関数ですが，条件式ごときに関数を定義する必要もないので無名関数としています。

# メリット・デメリット

この方法を採用することには，以下のようなメリットとデメリットがあります。

## メリット

特になし。

## デメリット

- 可読性が悪い。何がしたいのかわからない。何か特別な意図があるのかと考えてしまう。
- 条件評価→ジャンプだけの`while`に対して余計な処理が増えるのでパフォーマンスが低下する可能性がある。
- 頭がおかしいのではないかと同僚に勘違いされる。

etc...
【自己学習】Go言語を学ぶ(5)

公式チュートリアルから基本を学ぶ
https://go-tour-jp.appspot.com/list

# Zero values（ゼロ値）

* 変数に初期値を与えずに宣言すると、ゼロ値( zero value )が与えられます。

* 初期値
  * 数値型(int,floatなど): 0
  * bool型: false
  * string型: "" (空文字列( empty string ))

サンプルコード

```go
package main

import "fmt"

func main() {
  var i int
  var f float64
  var b bool
  var s string
  fmt.Printf("%v %v %v %q\n", i, f, b, s)
}
```
結果：0 0 false ""


# Type conversions(型変換)

サンプルコード
※`math.Sqrt`を使って各値の平方根を計算する

```go
package main

import (
  "fmt"
  "math"
)

func main() {
  var x, y int = 3, 4
  var f float64 = math.Sqrt(float64(x*x + y*y))
  var z uint = uint(f)
  fmt.Println(x, y, z)
}
```
結果:3 4 5


# Type inference(型推論)
明示的な型を指定せずに変数を宣言する場合( := や var = のいずれか)、変数の型は右側の変数から型推論されます。
```go
var i int
j := i // int型

i := 42           // int
f := 3.142        // float64
g := 0.867 + 0.5i // complex128
```

サンプルコード
```go
package main

import "fmt"

func main() {
  i := 42           // int
  f := 3.142        // float64
  g := 0.867 + 0.5i // complex128
  fmt.Printf("i is of type %T\n", i)
  fmt.Printf("f is of type %T\n", f)
  fmt.Printf("g is of type %T\n", g)
}
```

結果
```
i is of type int
f is of type float64
g is of type complex128
```


# Constants(定数)
定数( constant )は、 const キーワードを使って変数と同じように宣言します。
定数は、文字(character)、文字列(string)、boolean、数値(numeric)のみで使えます。
なお、定数は := を使って宣言できません。

```go
package main

import "fmt"

const Pi = 3.14

func main() {
  const World = "世界"
  fmt.Println("Hello", World)
  fmt.Println("Happy", Pi, "Day")

  const Truth = true
  fmt.Println("Go rules?", Truth)
}
```

結果
```
Hello 世界
Happy 3.14 Day
Go rules? true
```
【heroku】NameError: uninitialized constant Rack::MiniProfiler、Day11

本日Herokuへアプリの試作版をデプロイしました。その際に「Precompiling assets failed.」とエラーが出たので、その原因と解決方法について紹介します。

# 概要
```:ターミナル
git push heroku master
```
ターミナルにて上記コマンドを実行すると、
エラーが出ます。
```
       Precompiling assets failed.
 !
 !     Push rejected, failed to compile Ruby app.
 !     Push failed
```
コンパイルがうまくいかないために、Herokuへのデプロイがうまくいかないようです。では、具体的にどの部分のコンパイルがうまくいっていないのか特定する必要があります。ターミナルの記述を遡って、どこにエラーが出ているのか確認します。
# 原因
ターミナルの記述を遡ると、errorらしき部分を見つけました。
```
       Detecting rake tasks
-----> Preparing app for Rails asset pipeline
       Running: rake assets:precompile
       rake aborted!
       NameError: uninitialized constant Rack::MiniProfiler
```
エラーの原因を日本語訳すると、「Rack::MiniProfilerが初期化されていません」とのことですが、Rack::MiniProfilerに全く心当たりがないので、ネットで調べてみました。↓がその結果になります。

https://nishinatoshiharu.com/usage-rack-mini-profiler/

https://techblog.gmo-ap.jp/2020/06/08/rack-mini-profiler/

要約すると、Webサイトの素早さなどのパフォーマンスを計測してくれるGemです。「rails new」でアプリの大枠を生み出した時から、デフォルトで搭載されていたもので、特に気にせず利用していましたが、今回のエラーを引き起こしている原因に思えます。では、仮説を検証しましょう。
# 解決方法
Gemfileを確認します。
```ruby:Gemfile
group :development do
  （中略）
  # gem 'rack-mini-profiler', '~> 2.0'
  （中略）
end
```
MiniProfiler（正式名称はrack-mini-profiler）を発見したので、これをコメントアウトし、無効化します。また、これに付随して生成されたファイルの記述もコメントアウトして無効化します。
```ruby:config/initiaalizers/rack_profile.rb
# Rack::MiniProfiler.config.start_hidden = true
```
以上で、「git push heroku master」を実行すると、無事デプロイできました。
ubuntu PCを新しくクリーンインストールした後にコマンドラインからユーザを追加したり削除したりする際のコマンド

ubuntu PCを新しくクリーンインストールした後にコマンドラインからユーザを追加したり削除したりする際のコマンド（N番煎じですみません、、）

#### ユーザ追加

```
sudo adduser testuser
```

sudo権が必要な場合は以下のようにする

```
sudo gpasswd -a testuser sudo
```

ユーザが切り替わるかを確認

```
su - testuser
```

sudo権があるかどうかを確認（なければエラーになるはず）

```
sudo apt update -y
```

パスワード変更

```
sudo passwd
```

#### ユーザ削除

不要になったユーザは以下の通り削除する

```
sudo userdel -r ユーザ名
```

## 参考

https://atmarkit.itmedia.co.jp/ait/articles/1811/08/news037.html

https://atmarkit.itmedia.co.jp/ait/articles/1811/09/news031.html
【Tableau】連続/不連続 ビンの小技 -連続で抜けたビンの間を表現する-

# 今回の解消したい課題
- ビンを連続で表現した時に、本当は __表示して欲しいビン__ (列部)がなくなってしまう
        - ビンを簡単に作成する方法を紹介
# 環境
Tableau Desktop 2022.1.3
データソース：サンプル - スーパーストア

***
【テーマ】：顧客ごとの購入回数とその回数ごとの人数を可視化
1. まずは連続を用いて可視化してみる
Tableauではおなじみのサンプル - スーパーストアを利用
![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707779/08352286-9a8b-2eb4-1891-d49dfa2cc893.png)

2. 気になるポイントはここ
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707779/d670ff47-bf21-da69-f9a2-6dcfff316804.png)
3.  __連続__ を用いて表現すると
![03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707779/cdbf6391-8647-7c1a-9aea-04f1ee9d785d.png)
これだと __14__ と __16__ が表示されるので実現できたように思える
しかし、やりたいと思っていたのと何だが違う。
棒グラフの大きさをもう少し大きくし、余白を調整したい。
「サイズ」を押下し大きさを変更することも可能だが、思ったより空白が大きくなってしまう

4. __不連続__ を用いて簡単に解決してみる
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707779/46993ecc-1c41-c62d-39e2-4aaa9c1f04d9.png)
【手順】
ビンとしたいディメンションを選んで
作成→ビンを選択
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707779/e1b4a71d-4813-54c5-0f70-c12cfe8f411f.png)
上記の「ビンのサイズ」2.17を1に変更
このディメンションを今の列と交換する

#要するに「１で区切ったビンでディメンションを作ってね」ということらしい。

5.不連続を用いて何も無いを表現できた
![06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707779/492ab423-23e8-78de-ba6d-a6ccdacdd04c.png)
***
あくまで個人的な修正方法なので参考になれば...
Tableauの操作は奥が深い。
Visual C++ Releaseビルドでデバッグする #pragma optimize

### 概要
#pragma optimize を使えば部分的に最適化の有効を切り替えることが出来ます。
特定の部分の最適化のみをオフにしてデバッグしたいとき等に便利です。
これを使えばReleaseビルドでもブレークポイントを置くことが可能です。

### 使い方
#pragma optimize("", off) で最適化がオフに
#pragma optimize("", on) で最適化がオンになります

### 使用例
部分的に最適化をオフにする

```objc
#pragma optimize("", off)
	void func()
	{

	};
#pragma optimize("", on)
```


### 参考
* [Microsoft Document optimize pragma](https://docs.microsoft.com/ja-jp/cpp/preprocessor/optimize?view=msvc-170 "Microsoft Document optimize pragma")
【Solid.js + Storybook + Jest + Husky + TypeScript + vite + docker】なんかSolidjs流行ってるっぽいから今風開発環境を作ってみた

# 俺用型番作ってみました
https://github.com/FAL-coffee/solidjs-oreyou-boilertemplate

これcloneしてすぐ開発スタート出来ます。
導入を行った環境は大きくは以下です。

- TypeScript
- Storybook
- Jest
- Husky
- vite
- Docker

それぞれについて軽く書いていきます

## TypeScript
当然入れました。
https://www.solidjs.com/guides/typescript#configuring-typescript
tsconfにこちらを参考に`jsx`と`jsxImportSource`を指定したほかは普通に作りました

## Storybook
デザインカタログとしての他に、コンポーネントを触りながら確認するために入れてます
https://github.com/mochi-sann/solid-js-storybook

こちらのリポジトリを参考に導入を進めました。
-> [参考記事](https://zenn.dev/mochi/articles/f1237909333904)

## Jest
コンポーネントの単体テストはやっていきたいので入れました。
https://github.com/Launch-AI/launch-solid-ui

こちらのリポジトリを参考に導入を行いました。
jest.confの設定に大分手間取りました。
（css,fileのモックは__mock__/を指定する想定でjest.configからコメントアウトしています）

またGitHubActionsからCIを導入しています。

## Husky
コミットを行ったときに自動的に色々やってもらっています。
- stylelint
- prettier
- eslint

便利ですね

## vite
solidのプロジェクトをinitしたらなんかあったのでそのまま使ってます。
バンドルが不要で開発サーバーの起動が超早かったり、使ってみた結果webpackよりも割りと好みでした。
ちなみに**ヴィート**と読むようです。

## Docker
開発用に、超ミニマムに置いてます。
多分動くと思います
AWS Hands-on for Beginners 監視編 サーバーのモニタリングの基本を学ぼう

## はじめに
AWS Certified SysOps Administrator - Associateの試験ラボを乗り切るために、勉強していることをなんとなくメモっていきます。
基本的にハンズオンの内容は説明せずに出てきた単語を少し深掘りしていきます。

行うこと
https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/
AWS Hands-on for Beginners 監視編 サーバーのモニタリングの基本を学ぼう

本人情報
IT現場雑用員（SEで採用されながら一生Excel触ってる人）
半年前にAWS SAA取得済み

<br>

## AWSサービスの監視について
#### なぜ監視を行う必要があるのか
システムのリソース不足や稼働状況を確認することによってユーザーの体験を損なわないように監視する必要があリます。
また、インフラストラクチャだけではなく、アプリケーションが想定した通りに処理、返答を行えているかも確認する必要があります。
これらの要素をリソースのパフォーマンス、キャパシティやOS、アプリケーション、ミドルウェアのログ管理を行うことによって監視することができます。また、これらの要素以外にもセキュリテやコストなど運用を続けていく上で気にしておかなければならないサービスは多数存在します。

#### 利用できるサービス
AWS上でサービスを監視できるサービスは主に２つあります。
##### AWS X-Ray
アプリケーションレイヤ（レイヤ７）を対象として、それぞれのサービスが順に呼び出されていく流れをトレースし、パフォーマンスの問題やボトルネックなどを特定します。それぞれのサービスの順序や、レスポンスタイムなどをサービスマップとして図で表示することもできます。

https://docs.aws.amazon.com/ja_jp/xray/latest/devguide/aws-xray.html

##### AWS CloudWatch
CloudWatchはAWS上のイベント、ログ、メトリクスをモニタリングするための関するさまざまなサービスを提供しています。CloudWatch Logs、CloudWatch Metricsで蓄積されたデータを元にCloudWatch　Alarmによってアクションを実行したり、CloudWatch Alarmsによってアクションを実行したり（停止、削除、再起動など）、 CloudWatch Logs Insightによって収集したログをわかりやすく監視したりすることができます。
今回はこっちをメインで使います。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html



## CloudWatch Alarms
#### CloudWatch Alarmsとは
CloudWatch Alarmsはいくつかのステータスによって管理されています。

OK　　　　　　メトリクスや式は、定義されている閾値の範囲内です。
ALARM　　　　メトリクスまたは式が、定義されている閾値を超えています。
INSUFFICIENT_DATE　　　　　　　データが不足しているため、アラームの状態を特定できません。


#### アクション機能
設定した閾値を超えてステータスがアラームになった場合に、CloudWatch　AlarmsはSNS、 EC2、Auto Scalingなどに対してアクションを実行することができます。


![スクリーンショット 2022-04-03 19.47.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/a77f3bc3-173d-8900-c474-e12594c35169.png)

![スクリーンショット 2022-04-03 19.48.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/5a3acad1-40e5-3a6a-c028-4584a983faee.png)

![スクリーンショット 2022-04-03 19.54.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/623d2d50-9711-c743-1253-102047b0bfdb.png)

![スクリーンショット 2022-04-03 19.54.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/c43f0ff9-ca08-3b13-97f5-ea2ae4083732.png)

![スクリーンショット 2022-04-03 19.54.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/3f982edf-5f40-6644-e048-f1726b7e5f22.png)



## CloudWatch Logs
#### CloudWatch Logsとは
AWSサービスおよびお客様システムのログファイルの監視、保存、アクセスを管理することができます。CloudWatch Logsによって転送されるログはデイレクトリ構造で管理されています。ログストリーム単体か、もしくはロググループに含まれる全てのストリームに対してログの検索を行うことができます。どのような検索を行いたいかによって、設計を考える必要があります。


###### ログイベント
監視しているアプリケーション、もしくはリソースで記録されたログそのものです。記録された時間とイベントメッセージが記録されています。

###### ログストリーム
記録された一連のログイベントです。送信された順にログイベントを並べて表示することができます。

###### ロググループ
同じ設定をもつログストリームを一つのグループにまとめます。一つのロググループに所属させるストリームの数に制限はありません

https://dev.classmethod.jp/articles/design-cloudwatchlogs-log-group/


## CloudWatch Logs Insights
CloudWatch Logsによって収集されたログデータをインタラクティブに検索して分析することができます。Cloud Watch Logs自体の機能でログの絞り込みを行うこともできますが、Lambdaを利用して専用のクエリ言語を実行することによって、検索や分析を行うことができます。S3に出力されている必要はありません。
Javadocの使い方とhtmlファイルで出力する方法について


1.Javadocとは
-
JavadocとはJavaのクラスやメソッドの仕様についてまとめる仕組みのことで、「/**」から始まり、「*/」で終わる形で記述されます。下に例を挙げます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725869/42726b78-d35a-326f-959f-8158550d2580.png)
この写真では引数に1を足すaaaというメソッドについて、Javadocを用いています。
Javadocでは@は特殊な文字として認識されます。「@param」など、@を先頭に置いたものをJavadocタグと言います。
「@param」は引数、「@return」は戻り値、「@author」はプログラムの著者をそれぞれ意味します。
Javadocタグは他にもいろいろ存在します。


2.Javadocを用いる意味
-
Javadocを用いて、クラスやメソッドの説明を行うと、該当するクラスやメソッドが他のクラスで呼び出された際にもそれらにカーソルを合わせるだけで、記述した内容を確認することができます。先ほどの<font color="#1e90ff">aaa</font>メソッドにカーソルを合わせると下のような説明を見ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725869/97990a1e-d205-4416-6c00-9c45e7e259e8.png)


よって、Javadocを用いることでコードが視覚的に読みやすくなり、チームでの作業がやりやすくなると言えるでしょう。また、コードとは別に仕様などを説明した文書などが必要なくなるので、管理のしやすさという意味でも大きなメリットが得られると考えられます。

3.eclipseからJavadocをhtmlファイルで出力する方法
-
①Javadocを出力したいプロジェクトを右クリックし、エクスポートを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725869/e938c79a-aef8-f715-01e8-7f462d24d215.png)
②Java下にあるJavadocを選択し、「次へ」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725869/03ada585-e945-125b-cb91-1c0514ced7d6.png)
③宛先にファイルを生成したい先を入力し、「完了」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725869/e5c31583-56fa-52a9-2d30-29b39119ba0b.png)
④指定した先にdocというフォルダが生成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725869/ddd59d67-5746-cd8c-ffc2-84ee12de72d5.png)
⑤docの中に「<font color="#1e90ff">AAA.html</font>」というファイルが生成されています。これが、「<font color="#1e90ff">AAA.java</font>」についてのJavadocについてのhtmlファイルになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725869/cdcb1f1e-cc1c-cb6a-6d2e-9b596868c758.png)
このような流れで、Javadocをhtmlファイルとして生成できました。
実際に開いてみると、このように表示されます。
![Web キャプチャ_27-6-2022_053_.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725869/d9946454-57bc-17e0-a02f-db55fe6f63e3.jpeg)

クラス内の仕様を即座に確認できるので、便利に使うことができるのではないでしょうか。
Azure で VM のクォータ制限がかかってしまった時にすること

# はじめに

Azure で VM を選択する際に使いたい VM が一覧に表示されないことがあります。
その原因の一つで『クォータ制限』があります。
この問題は特に高スペックの VM を選択する際に発生しますが、その際の『クォータ増申請』を行う方法を残しておきます。

# 発生した経緯

Azure Game Development Virtual Machine(Game Dev VM) を使おうとした時に VM が選択できないことに遭遇しました。

理由は Game Dev VM で選択する VM では vCPU が多く必要なのですが、その vCPU のクォータ制限でした。

# クォータ増申請の方法

https://docs.microsoft.com/ja-jp/azure/azure-portal/supportability/regional-quota-requests

クォータ増申請ですが『リソース作成 > 仮想マシンの作成』から行います。
以下の画像のように　VM を立てるリージョンを選択した状態で『すべてのサイズを表示』を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/c3f03fb2-1479-4c64-4e9e-b3da839ad64f.png)

『VM サイズの選択』画面で VM 一覧が表示されますので、その画面の左上のフィルターで目的の VM だけをフィルターすることができます。

今回は『[NCas_T4_v3](https://docs.microsoft.com/ja-jp/azure/virtual-machines/nct4-v3-series)』シリーズを『Japan East』使用しますのでフィルターには『NC』と入力し、リージョンには『Japan East』となっていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/4df74bf2-54c2-8675-f43b-273309286470.png)

https://docs.microsoft.com/ja-jp/azure/virtual-machines/nct4-v3-series

リストの中で『NC4as_T4_v3』の『クォータの要求』選択すると以下のような画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/e73748f8-96d3-5d86-97cf-4cf2e1451b25.png)

『新しいサポートリクエスト』画面が開きますが、実際にはサポートリクエストは必要なく、以下の設定をすることでクォータ増申請のみを行うことが可能です。

|項目|設定値|
|---|---|
|お客様の問題は何に関係していますか？|Azure サービス|
|問題の種類|サービスとサブスクリプションの制限（クォータ）|
|サブスクリプション|使用するサブスクリプション|
|クォータの種類|コンピューティング-VM（コア-vCPU）のサブスクリプション上限の増加|

上記の設定を行うことで『クォータの管理』が選択できるようになります。
そうすると以下の画像のようにクォータの種類が表示されますので、その中から『Standard NCASv3_T4 ファミリ vCPUs』を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/8765c3e7-c206-5ecc-019f-24321994bafd.png)

この画面では種類だけではなくリージョンも一覧に表示されていますので注意してください。
選択ができれば左上にある『Request quota increase』から『Enter a new limit』を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/be6d05ad-398b-138b-b379-669950c1e1ca.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/869032e9-b95d-762b-a30f-fa8ba00f16bb.png)

上記では『West US』が選択されていますが、使用量が『0 of 0』となっていると思います。
NC4as_T4_v3 では vCPU は最低でも 4 必要ですので『新しい制限』で 4 を指定します。

**※この記事を書いている時点では『Japan East』『Japan West』の両方ともで VM が足りなくなっており、クォータ増申請が通らない状況のため『West US』を選択しています。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/2f49367f-0a71-22d8-93d8-a71212674f1d.png)

クォータ増の申請が却下されると以下のような表示がされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/48946ff7-fcfc-600b-574a-600428523eeb.png)

クォータ増申請が正常に通ると以下のような画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/aeb3e5f4-0db1-6680-6686-19b7cf8ed7e7.png)
複合テストコードのまとめ

## はじめに
初心者なりにまとめたものになりますので、諸先輩方からは何書いてんだおめえと感じる部分があると思います。
そう感じた際は、お手数ですが、コメント頂けると幸いです。

内容は、自分がテストコードを書く際に使用した物の構成になります。


## 目次
- visit
- expect

- マッチャ(matcher)とは
-be_valid
-include
-eq
-have_content
-have_no_content
-have_selector
-have_link
-change

- find().click
- find().hover
- fill_in


## visit
リクエストを送り、指定されたページへ遷移するためのコード
下のように記述することで、prefixにルーティングされているpathのビュー先へ遷移する

    visit tweets_path
    visit 「prefixのパス」_path

## expect
「アプリの実際の挙動」と「製作者が想定している挙動」が一致するかどうかを判断する記述
マッチャ(matcher)と呼ばれる検証する条件を記述するコードが後ろに付属する

    expect(「検証したいデータ」).to 「マッチャ」

## マッチャ(matcher)とは
expectで指定した引き数に対して、検証したい条件を引き数へ定義する記述
様々なマッチャが存在するが、一部を記述する

    be_valid
    expect(「検証したいデータ」).to be_valid
    - expect内の引き数が真であるかどうかを検証する

    include
    expect(「検証したいデータ」).to include(「expectの引き数に含まれると思われるデータ」)
    - include内の引き数がexpect内の引き数に含まれるかを検証する
    
    eq
    expect(「検証したいデータ」).to eq(「expectの引き数と一致するデータ」)
    - eq内の引き数がexpect内の引き数と一致するかを検証する

    have_content
    expect(「検証したいデータ」).to have_content('「expectの引き数に存在する文字列」')
    - have_content内の引き数がexpect内の引き数に存在する文字列かを検証する

    have_no_content
    expect(「検証したいデータ」).to have_no_content('「expectの引き数に存在しない文字列」')
    - have_no_content内の引き数がexpect内の引き数に存在しない文字列かを検証する
      have_contentと対照的なマッチャ

    have_selector
    expect(「検証したいデータ」).to have_selector('「expectの引き数に存在するセレクタ」')
    - have_selector内の引き数がexpect内の引き数に存在するセレクタかを検証する
      主に画像が存在するのかを判断するために使用する

    have_link
    expect(「検証したいデータ」).to have_link('「expectの引き数に存在するリンク」')
    - have_link内の引き数がexpect内の引き数に存在するリンクかを検証する

    change
    expect(「検証したい動作」).to change('「model名」.count').by(「数値」)
    - change内の引き数がexpect内の引き数の動作を行なった際に、
     「model名」に存在するデータが定義した「数値」に変化するかを検証する

## find('「クリックさせたい項目」').click
クリックさせたい項目のものをクリックさせる

    find('「クリックさせたい項目」').click

## find('「カーソルを合わさせたい項目」').hover
カーソルを合わさせたい項目のものをクリックさせる

    find('「カーソルを合わさせたい項目」').click

## fill_in '「フォームの名前」', with: '「入力する文字列」'
「フォームの名前」へ「入力する文字列」を入力させる記述

    fill_in '「フォームの名前」', with: '「入力する文字列」'


## おわりに
自分がテストコードを書く際に使用した物のまとめになります。
【unity】別のスクリプトの変数を取得する

<h1>概要</h1>
別のスクリプトの変数の値を参照したり、変更したりしたいときにどうすればよいかをメモしておく。

<h1>方法</h1>
参照または取得したい変数が記載されているスクリプトが紐づいているオブジェクトから取得していく。

例えば<code>Player</code>というタグが付いているオブジェクトに紐づいている<code>PlayerManager.cs</code>というスクリプト上の<code>varExp</code>という変数を取得したい場合。

```
public class ExampleClass : MonoBehaviour
{
    private GameObject playerObj
    private PlayerManager playerManager;

    void Start()
    {
        playerObj = GameObject.FindGameObjectWithTag("Player");
        playerManager = playerObj.GetComponent<PlayerManager>();
        Debug.Log(playerManager.varExp);
    }

    ・・・
}
```

まず<code>GameObject.FindGameObjectWithTag( ~ )</code>を用いてタグからオブジェクトを取得する。
次に、<code>GetComponent\< ~ \>()</code>で変数を持っているクラスのインスタンスを取得する。
あとは取得したインスタンスの変数にアクセスすればよい。
EventBridgeを使用した定期実行の間隔別にLambdaの処理内容を変える

ある検算処理を行って異常がないか確認し、その結果をSlackに通知するLambdaを作成しました。
Lambdaのトリガーは[EventBridge (CloudWatch Events) ](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-what-is.html#)を使用して、1時間毎と24時間毎に定期実行を行いました。
1時間毎と24時間毎で処理内容を変える方法について記載します。
開発言語はPythonです。

# EventBridgeでルールの作成
EventBridgeで下記のルールを2つ作成しました。

## rule-every-hour　
1時間毎の定期実行　```rate(1 hour)```
このイベントをLambdaが受けた場合、異常があれば通知する（異常がなければ通知しない）。


## rule-every-day　
24時間毎の定期実行　```cron(0 10 * * ? *)```　毎日午前 10:00　
このイベントをLambdaが受けた場合、異常がなくても結果を通知する。


# 判定方法
Lambda関数に渡ってくるイベントJSONで判定します。

## イベントJSON
EventBridgeから渡ってくる[JSONデータ](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-handler.html)

```JSON
{
    "version": "0",
    "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "detail-type": "Scheduled Event",
    "source": "aws.events",
    "account": "xxxxxxxxxxxxx",
    "time": "2022-05-10T09:48:31Z",
    "region": "us-west-2",
    "resources": [
        "arn:aws:events:us-west-2:xxxxxxxxxxxxx:rule/rule-every-day"
    ],
    "detail": {}
}
```
イベントJSONの中のresourcesキーの値がEventBridgeで作成したルール名になっていますので、
その値をLambdaのソースコードの中で取得して、if文で判定しました。


# ソースコード
今回はルール名に"every-hour"が含まれているかどうかで判定しています。
1時間毎と24時間毎の処理内容はほとんど共通化していて、通知するかどうかの処理だけ変えています。
1時間毎の定期実行ではエラーがあれば通知し、24時間毎の定期実行ではエラーがなくても実行結果を通知します。

```PYTHON
def main(event, context):     
    for resource in event["resources"]:
        if 'every-hour' in resource:
			# 1時間分検査 -> エラーがある場合は結果通知
            result = check(range_hours=1)
			if result.has_error:
				notify_slack(result)
        else:
			# 24時間分検査 -> 必ず結果通知
            result = check(range_hours=24)
			notify_slack(result)
```
astyle 使ってみた

C言語を習得する３つの方法
https://qiita.com/kaizen_nagoya/items/84cab0888c193bba429b

C言語(C++)が必要な人と必要ない人
https://qiita.com/kaizen_nagoya/items/2afe9e846b55b24cb6f1

# C++N4910:2022 Standard Working Draft 
on ISO/IEC 14882(0) sample code compile list
https://qiita.com/kaizen_nagoya/items/fc957ddddd402004bb91

C＋＋コード断片をコンパイルできる形にしようとしている。

直したコードは、できれば整形して見やすくしたい。
http://astyle.sourceforge.net/

残念だったのは、規定値でnamespaceを構造的にしないことかもしれない。

9.8.2.1 General [namespace.def.general] C++N4910:2022 (115) p228.cpp
https://qiita.com/kaizen_nagoya/items/866e00a3e122f33117be

# 算譜(source code)

```c++:p228.cpp
// C++N4910 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/n4910.pdf
const char * n4910 = "9.8.2.1 General [namespace.def.general] C++N4910:2022 (115) p228.cpp";
// Debian clang version 14.0.5-++20220610033153+c12386ae247c-
// g++ (GCC) 12.1.0 Copyright (C) 2022 Free Software Foundation, Inc.
// Edited by Dr. Ogawa Kiyoshi. Compile procedure and results record.
// C++N4910:2022 Standard Working Draft on ISO/IEC 14882(0) sample code compile list
// https://qiita.com/kaizen_nagoya/items/fc957ddddd402004bb91

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <coroutine>
#include <vector>
#include <complex>
#include <map>

using namespace std;

// Example 1
namespace Outer {
int i;
namespace Inner {
void f() {
    i++;    // Outer::i
}
int i;
void g() {
    i++;    // Inner::i
}
}
}
// [Example 2 :
namespace A::inline B::C {
int i2;
}
// The above has the same effect as:
namespace A2 {
inline namespace B2 {
namespace C2 {
int i2;
}
}
}
int main() {
    cout  <<  n4910 << endl;
    return EXIT_SUCCESS;
}
```

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
seach_30_dayを使ってツイートを取得

# 1. はじめに
`search_tweets`では過去約7日分のツイートしか取得できない．
よって、`serach_30_day`を使って、ツイートを取得する．
`serach_30_day`は過去30日分のツイートを取得できる．
ちなみに、無料プランではツイートの取得数に限度があり.(確か1か月で25,000ツイートまで)

# 2. コード
```
searchkey = 'パナソニック 自転車 -楽天'
tweets = tweepy.Cursor(api.search_30_day, label='', query=searchkey).items(2000)
```

`query`：検索したいワードを入れる．
上記の例だと、パナソニック AND 自転車 AND 楽天を含んでいない
`label`：twitter APIで設定した名
items() ： 取得ツイート数
accepts_nested_attributes_forを使ったデータ生成でハマった話

>どうもaono1234と申します。記事がいいなと思ったらtwitterのフォローもお待ちしております‼
https://twitter.com/takeshi_program

accepts_nested_attributes_for でデータ保存をする際、テーブル同士が1対1なのか1対多なのかで書き方が違うらしい

# 1対1の場合
```ruby
params = { member: { name: 'Jack', avatar_attributes: { icon: 'smiling' } } }
member = Member.create(params[:member])
```
createに渡すデータはハッシュを渡し、その中のavatar_attributesはハッシュのデータ。

# 1対多の場合
```ruby
params = { member: {
  name: 'joe', posts_attributes: [
    { title: 'Kari, the awesome Ruby documentation browser!' },
    { title: 'The egalitarian assumption of the modern citizen' },
    { title: '', _destroy: '1' } # this will be ignored
  ]
}}

member = Member.create(params[:member])
```
createに渡すデータはハッシュを渡しその中のposts_attribuesは配列のデータ。
John the Ripperでパスワードが掛かったファイルを開いてみる

# Johnの使い方
htbで使える手法メモ。
悪用は厳禁。
- できること
・鍵付きzipファイルのパスワード解析
・鍵付きpfxファイルのパスワード解析

- 手順
（１）オフライン解析のためのハッシュ生成
　　　zip2john {FileName}.zip > hash.txt
（２）パスワード解析
　　　John --word-list={WordList_Path} hash.txt

※pfxのパスワード解析したい場合は、zip2johnをpfx2johnに変更する
Laravel AWSデプロイ→TODOアプリ実装までにやった事

# AWS　EC2にLaravel x mysqlx nginx環境を構築するまでやったこと

## AWS環境構築を学ぶ

https://qiita.com/H-Toshi/items/56957ace6e4fb36a82fc

上記はUdemyを参考にした[udemyリンク](https://www.udemy.com/course/aws-and-infra/)
動画はEC2にWordPressをアップロードしているが、EC２の構築までを参考にして、デプロイするものをLaravelにすれば良い。

### EC2にSSH接続する

https://qiita.com/H-Toshi/items/d81ee20603d0b0420934


## LaravelをCloud9で作ってみる

https://qiita.com/H-Toshi/items/144fa458abe9b8e4b22b

Cloud9はAWSの無料枠だと使用できるメモリに限りがある為、CRUDだけ試して撤退した。

## Laravelのローカル開発環境を作ってみる

### Laravel6 : Mampで最初つくった（しかし、その後公式のDocker Sailを知る）

https://qiita.com/H-Toshi/items/2732358d234e4b8d4187

Mampで動いたが、Laravel８はDocker Sailコマンドで簡単にローカル環境が作れることを知り、そちらを採用した。

### Laravel8でローカル環境構築

https://qiita.com/H-Toshi/items/d23949f03bb95c748d25

上記記事ではローカル環境でLaravelアプリを作り、mysqlを入れるまで行った。
そして、github経由でAWSへのデプロイを試みたが、失敗した。


### LaravelをAWS(nginx)へデプロイし、さらに編集をしていく方法

https://qiita.com/H-Toshi/items/cbaebbb75e92f7eae5b4

上記でEC2へのデプロイとその後の編集、TODOアプリ作成まで実装できた。

### デプロイしたnginx環境のEC２にBasic認証を設定

https://qiita.com/H-Toshi/items/05675a383f66ca150e73


## デプロイまでの感想
当初cloid9で行けると思ったら、メモリの関係でいけず、Mampでやろうとしたが、今はDocker環境を公式が用意していて、それに移行。
しかし、デプロイがうまくいかず苦戦
最終的にデプロイできたら、今度は編集方法がわからない。。
直接SSHしてVSCodeで編集出来てアルチザンコマンドも使える！
それでなんとかここまでいけました。
ここから、自身のオリジナルアプリを実装していくまでさらに研究します

（続く）
【自己学習】Go言語を学ぶ(4)

公式チュートリアルから基本を学ぶ
https://go-tour-jp.appspot.com/list

# Basic types（基本型）
### 基本型についてまとめ

* 論理値型
bool ()

* 文字列型
string

* 数値型
  * 符合付き整数型
  int  int8  int16  int32  int64
  * 符合なし整数型
  uint uint8 uint16 uint32 uint64 uintptr

* byte型
byte // uint8 の別名

* rune型(Unicodeの番号を10進数に変換したものを返す)
rune // int32 の別名
     // Unicode のコードポイントを表す

* 浮動小数点型
float32 float64

* 複素数型
complex64 complex128

# 論理値型
サンプルコード
```go
package main

import "fmt"

func main() {
  var b bool

  b = true
  b = false
  b = trie || false
  fmt.Println(b)
}
```

# 数値型
サンプルコード
```go
package main

import "fmt"

func main() {
  var i int = 12345
  var i64 int64 = int64(i)

  fmt.Println(i64)
}
```

# 文字列型
サンプルコード
```go
package main

import "fmt"

func main() {
  var str string
  str = "A"
  str = str + "B"
  str += "C"

  fmt.Println(str)
}
```
Docker + Laravel + PostgreSQL + Apache の開発環境を構築する

## 目的

個人開発をしてみようと思い、インフラは費用を抑えるためにHerokuにしようと考えています。
HerokuではデフォルトのDBがPostgreSQLであることと、docker環境を自ら作成したことがなかったので勉強も兼ねて作成したものを残します。


## 開発環境
- PHP 8.0
- Laravel 最新バージョン
- PostgreSQL 14.4
- Apache 2.4.53

# ファイル
## ファイル構成
```
docker-compose
├── apache
│   └── default.conf
├── php
│   └── Dockerfile
├── src // ソースコード格納用ディレクトリ
└── docker-compose.yml
```

## Dockerfile
``` :Dockerfile
FROM php:8.0-apache

RUN apt update && apt install -y zlib1g-dev g++ libicu-dev zip libzip-dev zip libpq-dev \
    && docker-php-ext-install intl opcache pdo pgsql pdo_pgsql \
    && pecl install apcu \
    && docker-php-ext-enable apcu \
    && docker-php-ext-configure zip \
    && docker-php-ext-install zip \
    && apt-get install -y git \
    && a2enmod rewrite


WORKDIR /var/www/html

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

```

## default.conf
``` :default.conf
<VirtualHost *:80>
   ServerName laravel_sample
   DocumentRoot /var/www/html/public

   <Directory /var/www/html>
       AllowOverride All
   </Directory>
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

```


## docker-compose.yml
``` :docker-compose.yml
version: '3.8'

services:
  database:
    image: postgres
    container_name: database
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: laravel_sample
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    ports:
      - '5432:5432'

  php:
    container_name: php
    build:
      context: ./php
    ports:
      - '8080:80'
    volumes:
      - ./src:/var/www/html
      - ./apache/default.conf:/etc/apache2/sites-enabled/000-default.conf
    depends_on:
      - database

```

# 手順
ファイル作成後の手順
docker-composeディレクトリでコンテナをビルド
```
docker-compose up -d --build
```
コンテナに入る
```
docker-compose exec php bash
```
Laravelのアプリケーションを作成(既存の作成中のものがあればgit cloneする)
```
composer create-project laravel/laravel .
```

laravelのプロジェクトを作成すると以下からLaravelのウェルカムページが表示されます。
http://localhost:8080/



```
composer install
```

.env作成
```
cp .env.example .env
```

.envのAPP_KEY作成
```
php artisan key:generate
```

.envのDBに設定
```
DB_CONNECTION=pgsql
DB_HOST=database
DB_PORT=5432
DB_DATABASE=laravel_sample
DB_USERNAME=postgres
DB_PASSWORD=secret
```

マイグレーション実行
```
php artisan migrate
```

## 参考にした記事

- https://www.twilio.com/blog/get-started-docker-laravel-jp
- https://zenn.dev/lightkun/articles/b4ec49bb8bcf0c

## おわりに

シンプルな記事を参考にしたのであまり難しく考えず構築することができました。
足りないものもありそうなのでこれから改良していきながら知識を増やそうと思います。

間違っているところなどあれば、ご教示ください。
Flutter finalとconst

# [Flutter] 変数finalとconstの違い

## はじめに
Flutter開発の本や動画を漁っていて、一度値が決まったら変更できない変数を定義する際、finalとconstの2通りの定義の仕方があった。
違いがわからなかったので、調べてわかったことを備忘録として記載しておく

## 違い

`const`・・・　constはコンパイル時に値が代入されて、それ以降は変更できない変数
`final`・・・finalはコンパイル時には値が代入されず、プログラムを実行して値を代入した後、変更できない変数

つまり、
`const`は別の変数やユーザの入力によって変わるメソッド（TextEditingController()）などを使用するとエラーになる。
`final`はコンパイル後に定義するので、そのような変数やメソッドあってもよい。
【Laravel】testing時のエラー【./vendor/bin/phpunit】

`Laravel`開発時の`./vendor/bin/phpunit`によるエラーまとめ

## actingAs()
エラー内容:
```
There was 1 failure:

1) Tests\Feature\ExampleTest::testBasicTest
Expected response status code [200] but received 302.
Failed asserting that 200 is identical to 302.
```
原因：auth権限がない状態で`$this->get('/posts')`などのルーティング
解決策：権限が必要なルーティング前に`actingAs()`でauth権限を付与しておく
```ExampleTest.php
<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    use RefreshDatabase;
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $response = $this->actingAs($this->user())->get('/');

        $response->assertStatus(200);
    }
}

```

## use RefreshDatabase
エラー内容
```
Illuminate\Database\QueryException: SQLSTATE[HY000]: General error: 1 no such table: users (SQL: insert into "users" ("name", "email", "email_verified_at", "password", "remember_token", "updated_at", "created_at") values (Hailee Green, langworth.nick@example.com, 2022-06-26 12:31:17, $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi, JQpjdLEH4j, 2022-06-26 12:31:17, 2022-06-26 12:31:17))
```
原因：使用していたデータベースが影響してusersテーブルでエラーが発生していた？(actingAs()を使用した影響？)
解決策：各Testファイルの先頭に`use RefreshDatabase;`を記述
```ExampleTest.php
<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    use RefreshDatabase;
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $response = $this->actingAs($this->user())->get('/');

        $response->assertStatus(200);
    }
}

```