OmniAICreator/Qiita-1.07M huggingface dataset:
go の乱数を見て気づいたこと

# これは何？

go の乱数の実装を見て気づいたことを書く。
扱うのは、数値シミュレーションとかで使う方の乱数。
ハードウェア乱数の話も暗号用途の話もしない。

# 気づいたこと

## 生成

seed が 64bit しかない。64bit では足りない場面を見たことがあるので、えー64bit しかないのー、みたいな気分。

## スキップしたい

複数のプロセスや goroutine で大量の乱数を発生させるとき、みんな同じ種で作っておいて、「n番目のプロセスは、`rng.Uint64` を $n×2^{128}$ 回呼んだ後と同じ状態にしてからスタート」みたいなことができると便利だと思うんだけど、そういう機能はない模様。残念。

## Source64

math/rand に `Source64` というインターフェイスがあるけど、これの使い方が難しい。

ソースを見ると。

```go:go
rng := rand.New(s)
```

みたいにするとき、`s` は math/rand の `Source` である必要があるわけだけど、 `s` が `Source64` を実装しているとそれも使ってくれる模様。

ソースを見たから気づいたけど、 [math/rand の func New(略) の説明](https://pkg.go.dev/math/rand#New) で言及されてないから気づかないよ。

## 同期

グローバルな乱数は、mutex で保護されている。なので、その分遅い。手元で `Uint32()` の時間を適当に測ったら、グローバルな方はグローバルでない方の 3倍以上の時間を使っていた。
グローバルでない乱数は mutex で保護されていない。その分速いんだけど、複数の goroutine で使うと死ぬかもしれないんじゃないかな。

## アルゴリズム

C++・Java なんかは各種アルゴリズムを取り揃えていて用途によって使い分けることができるけど、 go の標準では一種類しか提供してない模様。

中身を見るとわりと無名なアルゴリズムを使っている印象。専門家からすると、あああの乱数ね、となるのかもしれないけど、私は他で使われているのを見たことがない。

[ソースコード](https://cs.opensource.google/go/go/+/refs/tags/go1.17.5:src/math/rand/rng.go)を見ると

```go:go
/*
 * Uniform distribution
 *
 * algorithm by
 * DP Mitchell and JA Reeds
 */
```

とあるんだけど「メルセンヌ・ツイスタ」とか「Permuted congruential generator (PCG) 」みたいな名前は見当たらない。

[Go の疑似乱数生成器は Goroutine-Safe ではないらしい（追記あり）](https://text.baldanders.info/golang/pseudo-random-number-generator/#fn:1) によると

> math/rand パッケージに実装されている擬似乱数生成器はラグ付フィボナッチ法（Lagged Fibonacci Generator）のバリエーションらしい。

とのこと。

中身を見ると、 64bit 整数 607個、つまり 4856バイトもの状態を持っている。メルセンヌ・ツイスタ（MT19937）の 2496バイトより多い。
初期化にあたっては 4856バイトを埋めなければならないのでわりと時間がかかる。
まあ初期化に時間がかかっても困らないけどね。

ソースコードを見る限り、周期はわからない。
「1万種類のシードで1万個発生させる」みたいなことが安心してできるのかどうか(つまり、あるシードからできた系列が、別のシードからできた系列の5千番以降と同じだったりすると困る)がよくわからない。

## 計算

計算は加減5回ぐらいと比較しかないけど、なにせ状態が 4856 バイトもあるのでメモリアクセスが遅くなりがちだと思う。

手元で Xoshiro256++ と比較してみたけど、大差ない感じだった。キャッシュに乗るかどうかの勝負なので条件によって変わるんじゃないかな。

# まとめ

グーグル様監修なので変なことはないと思うけど、周期がわからないのは不安。
状態が 5kバイトぐらいあるのはやだなぁと思ったけど、そんな非力なコンピュータは相手にしてないのかなとも思った。

あと。名前知りたいなぁ。
【令和3年度 秋】情報処理安全確保支援士試験受験体験記！！

こんにちは。

先日、情報処理安全確保支援士試験を受験してきましたので、自己採点結果や合格発表内容などを記載いたします。  
これから受験される方については、今回の私の記録を少しでも参考にしていただければ嬉しいです。

問題につきましては下記の通り、IPAから発表されています。

<a href="www.jitec.ipa.go.jp">IPA 独立行政法人 情報処理推進機構：問題冊子・配点割合・解答例・採点講評（2021、令和3年）</a>

自己採点する上で参考にさせていただいた解答速報は、TACさんとiTecさんのものになります。

<a href="www.tac-school.co.jp">解答速報 令和3年度秋期試験｜情報処理｜資格の学校TAC[タック]
資格の学校TACが提供する情報処理技術者試験・情報処理安全確保支援士試験の解答速報。情報処理技術者試験・情報処理安全確保支</a>

<a href="www.itec.co.jp">情報処理技術者試験 | 解答速報・自動採点サービス | IT技術者資格取得ならアイテック
「解答速報・自動採点サービス」長年にわたる情報処理技術者試験の分析・講評が好評のアイテックが無料でご提供。</a>


前回応用情報技術者試験に合格していたこともあり、午前1については免除という形で挑戦しています。

受験時点での筆者の状態ですが下記の通りです。

| 項目|説明|
|----|----|
|大学|工学系の大学を卒業(情報系の授業ほぼ無し)|
|社会人になる前のプログラミング経験|授業や卒業研究でC++とpythonをかじった程度|
|エンジニア歴|2年半|
|開発経験|ヘルスケア系Webアプリの開発と運用の経験あり|
|社外活動での経験|デジタル通貨フォーラムのウォレットセキュリティ分科会に参画|
|取得済の資格|G検定(2020#2)、基本情報(2019)、応用情報(2021)|

エンジニアになってからまだ間もない状態で、脆弱性が出てきても先輩に相談しながら解決しているという状態でした。
社外でセキュリティを中心に議論する活動に参加させていただけたことは非常に大きかったと思います。
リスク分析や既存のセキュリティ基準について興味を持って勉強する良いきっかけになったと思います。

午後の選択問題については、次の通りで選択しました。

【午後1】 問１と問３

【午後2】問２

午後2については、ネット上でも問１の方が難しかったという声が多かったため選択自体については解きやすい方をちゃんと選べたと感じています。       過去問を解いている時も開始3分は、問題全体をさらっと確認して解きやすそうな問題を判断することに使っていたので、その訓練が生きたのだと感じています。

午後1については、例年並みか少し易しくなったという声が多かったですね。

さて、自己採点の結果ですが、下記の通りの結果となりました。

【午前2】 84点

【午後1】 

|TAC予想配点|iTec予想配点|
|-|-|
|71点|61点|

【午後2】

|TAC予想配点|iTec予想配点|
|-|-|
|64点|63点|

午後1については、2社の解答速報で10点もの幅が出たので、結果はこの間の点数に近くなるのではないかと予想いたしました。                                              午後2については、2社ともほぼ同じ点数となりましたので、記述解答の採点が厳しくなければこのあたりの点数になるのではないかと予想いたしました。  
(厳しいかった場合は、不合格も覚悟しました。)

前回の応用情報の時もそうでしたが、記述部分の部分点が全く分からないため、▲の問題がどの程度取れているかで変わってくると思います。  
今回の場合、ボーダーライン上の点数となったため合格発表までの2ヶ月間はかなり不安でした。。。

【12/17 合格発表】

12/17正午に合格発表がありました！仕事終わりにサイトに行って確認してみると、、、、


![スクリーンショット 2021-12-18 14.43.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299653/1ee24dc7-3bb4-171e-d3d3-13339d1a8a18.png)

無事に合格していました！！！！！

午後1については、少し記述部分の採点が甘かったのかと感じています。　　　　　　　　

午後2については、自己採点通りの点数でホッとしましたが、あと1問間違えていたら落ちていましたね。。。

今回、合格率も20%越えと少し増えていますのでゲタを履かせてもらったのかもしれません。

ともかく、情報処理安全確保支援士となるために必要な要件を満たせたので登録処理を実施して情報処理安全確保支援士になりたいと思いますが、ご覧の通り合格点を余裕で超えて合格したわけではありませんので、ここをスタート地点として精進して行きたいと思います。

次回は、ネットワークスペシャリストかE資格に挑戦して見たいと思います！

よろしくお願いいたします。
[laravel vue] laravelで関連するモデルのカウントをvueに渡す

##はじめに
質問投稿サイトで質問に紐ずく回答の数を表示する方法をご紹介します。

```php:Question.php
public function answers(): HasMany
    {
        return $this->hasMany('App\Answer');
    }
```
withCountメソッドを使います。

```php:QuestionController.php
$question = Question::where('id', $question_id)->withCount('answers')->first();
```

```vuejs:Vue
{{ this.question.count_answers }}
```

https://readouble.com/laravel/5.7/ja/eloquent-relationships.html
プレゼン資料の内容を考える時の進め方

#前書き
初めまして、前田陸斗です。
某大学でセミナーをする機会を5分頂いたので、**プレゼン資料の内容を考えるときの進め方**を調べてみました。
今後、プレゼン資料を作る際に驚く程、役に立つ記事にまとめる事に成功しました。

#最初に
![meeting-g818a12ce4_1280.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389802/af2bf69b-3fda-c178-ae58-14a29c0555b9.png)
プレゼンとは何のためのものでしょうか？
僕は、**伝えた人に行動してもらうためのもの**と思っております。

その上でどうすれば行動してもらえる資料の内容を考えることができるのかを僕なりに4ステップでまとめました。

##行動して欲しい事を考える

聞いてもらうだけではなく行動してもらうためには、
下記の伝えたい人の状況を把握して相手の意識を集中させることが大事です。

<dl>
  <dt>立場</dt>
  <dd>相手が今どんな立場なのか？</dd>
  <dt>興味</dt>
  <dd>どうゆう事に興味があるのか？</dd>
  <dt>知識</dt>
  <dd>自分が話す内容の知識をどのくらい持っているのか？</dd>
</dl>

##伝えたいことの情報を集める
![brain-g316e97611_1920.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389802/3ee08d71-81dd-7062-6056-f2759f6322f2.jpeg)

- なぜその行動をして欲しいのか？
- 行動した先に何があるのか？
- その行動に対する思考を整理する（マインドマップ）

##伝えたいことを再確認する
僕は、この辺りで一度落ち着いて当初の**行動して欲しい事**を再確認した方が良いと思います。
情報を集めているうちに思考が広がってブレが生じてしまうからです。

##伝える構成を組み立てる
今回5分で伝える必要があるため、SDS法を意識して組み立てていきます。

<dl>
  <dt>Summary（要点）</dt>
  <dd>わかりやすい文章を書くための「SDS法」をオススメします。
</dd>
  <dt>Details（詳細）</dt>
  <dd>SDS法とは、要点・詳細・要点という構成の文章を構築据する際のフレームワークです。
SDS法では最初に話の要点を伝えます。次に内容の詳細、最後に要点のまとめを伝えます。
最初に要点を伝える事で「何についての話題なのか」を理解させた状態でその話の詳細の説明も行いますので要点が伝わりやすくなります。
また、最後に要点をまとめて伝えるのは「復習」となり、相手の記憶に残りやすくなります。
一度で理解しやすいので時間のロスがなくなり、時間を有効に使える事も良い点です。
</dd>
  <dt>Summary（要点）</dt>
  <dd>このように、SDS法を使って文章を作れば、文章作成が苦手な人でも伝わりやすい文章を書けるようになります。</dd>
</dl>

#最後に
これで皆さんも全く困らず、プレゼン資料の内容を考える事ができます。
僕はこれから残りのスライド作成と練習に進もうと思います。
![ookawa-higePAR59104070_TP_V4.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389802/dabe57f7-c628-b56a-73c3-e7e6e5419248.jpeg)


以上、ありがとうございました！
毎日10分の勉強で人間は成長できるのかという話

## はじめに
弊社はWeb制作会社で、開発にはgulpを使用しています。
自分は入社2年目ですが、gulpに触れたのは入社してからでした。

制作時はいつも会社の開発環境（テンプレート）を使用していたので、gulpに関しては

- 便利なツール！仕組みは…gulpfile.jsに書いてい( ˘ω˘ )ｽﾔｧ…
- 初回実行時にエラーが出ないようにとりあえずお祈り。
- 「gulpfile.js」は軽い気持ちで触るとやばそうだな。ヨシ、そっとしておこう。

という感じで、苦手意識を持っていました。

今回はgulpの勉強を毎日10分程度行なった結果、この苦手意識がどう変わったのかを書いていこうと思います。


## 始めるに至った経緯
2020年の年末、冬休み中に2021年の抱負（四字熟語）を考えてくることになり、Google先生に頼った結果「水滴石穿」という四字熟語を見つけました。

>水滴石穿
>小さい力でも積み重なれば強大な力になることのたとえ。
>「水滴」は一滴の水、「石穿」は石に穴をあけること。
>水滴も同じ位置に落ち続ければ、いずれ石に穴をあけることができるという意味から。
>「水滴石を穿（うが）つ」とも読む。

引用：[四字熟語辞典オンライン](https://yoji.jitenon.jp/yojid/1793.html)

「水滴石穿」の意味から、毎日10分程何かしらの勉強をしようと考えました。
勉強時間を10分にした理由は主に以下の点からです。

- 勉強が好きではないので勉強に対するハードルを下げたかった。
- 1日10分であればどこかで時間が作れそうだと思ったから。
- 「ちりつも」は勉強にも通用するのか好奇心が湧いた。

結果的に勉強時間を10分に設定したのは自分に合っていたと思います。

### なぜgulp?
勉強内容をgulpにした理由は先輩の
__「開発環境の構築したことないならやってみては？？」__
という言葉がきっかけです。

「やばい。gulpキタ。」と思いました。
しかしながらいつまでも苦手意識を持っていると、それはそれで将来良くないことになる気がしたのでやってみることにしました。
この時点でgulpに関する知識はほぼゼロだったので、これ10分で大丈夫か？という不安しかなかったのを覚えています。

## とりあえずやってみよ
まずはリポジトリを用意。
ローカルに作業ディレクトリも用意。


…ココカラドウスレバ？

さっそく詰まり、初日はここで終わりました。10分なんてこんなもんです。
翌日もまず何をすれば良いのかを調べるだけで終わった気がします。

調べていくと、まずはpackage.jsonを作成しgulpをインストール、gulpfile.jsを作成することが必要だとわかりました。
[gulp公式]("https://gulpjs.com/")を見ればすぐに解決したことだったのですが、こんなに最初の方で出てくるとは思わなかったので時間がかかってしまいました。

package.jsonとgulpfile.jsがあると急にそれっぽくなりますよね。
ちょっとここで楽しくなってまいりました。

### パッケージ追加祭り（エラー祭り）
基本のファイルが用意できたら、ここからが本番です。
gulpに働いてもらうためにパッケージを追加していくのですが、これがすごく大変でした。
ちょっと楽しくなってきたぐらいでは太刀打ちできないしんどさでした。
ほんと1日10分でよかった。。

gulpにやってもらいたいことを考える。→どんなパッケージがあるのかをネットで調べ、[npm]("https://www.npmjs.com/")で詳細を確認。
という感じでパッケージを追加していたのですが、似たようなパッケージがいくつもありどれが良いのかかなり悩みました。
選ぶ基準としては

- 有名なもの
- 現在もメンテナンスされているもの

を軸に考えていたのですが、当てはまらないことも勿論あります。
そんな時は先輩へ相談したり、会社のテンプレートをカンニングして乗り越えました。

また、gulp.jsへの記述方法に慣れるまでにかなり時間を要し、パッケージの追加時は必ずと言っていいほどエラーを出していました。
1つの処理（たとえばbabelでJSをトランスパイル）をするのに複数のパッケージが必要なことがありますが、「このパッケージが足りない！追加しろ！」と怒られたり、追加したのに「見つかんねーぞ！」となったり。。記述を間違えて動かない、などなど。

このエラー祭りを経験したことにより、エラーが出ないのに処理が動いていないことがあると、「エラー出してよ！」という精神状態にまで成長（？）することができました。
もはやあの赤い文章は味方のように感じられます。


## 始める前から変わった点
1年近くパッケージの追加とエラー対応を繰り返しているとやはり変化はありました。

まずはじめに書いた、
>- 便利なツール！仕組みは…gulpfile.jsに書いてい( ˘ω˘ )ｽﾔｧ…
>- 初回実行時にエラーが出ないようにとりあえずお祈り。
>- 「gulpfile.js」は軽い気持ちで触るとやばそうだな。ヨシ、そっとしておこう。

これらの苦手意識に関しては全くなくなりました。
gulpfile.jsの内容がよく分かっていなかったことが原因だったので、自分で作ることでどんな処理が書いてあるのかやエラーへの理解が深まったことが大きいと思います。

また、案件によっては追加したい処理（または使わない処理）もありますし、build先のディレクトリ構造を変えたいときがあります。
そんな時は会社のテンプレートをカスタマイズする必要がありますが、追加・修正・削除する場所がわかるようになったので色々と自分で試せるようになりました。
これはgulpの勉強をして1番良かったなと思えることでした。

## おわりに
1年間を通してgulpについて学習し、開発環境を一から作っていく大変さを体験することができました。（割とシンプルな環境なのに…）

タイトルに毎日10分と書きましたが、仕事が休みの日はやっていませんし、忙しかったり他のことに興味が湧いてやらなかった日もあります。
逆に10分のつもりが30分やってしまうなんて日もあり、わりとゆるめに進めていました。

もし何か新しいことをやりたいと思っているけど勉強が嫌い！という方は、「1日10分だけ」と考えてとりあえずやってみてはいかがでしょうか？

来年は何をしようかなー。
やっぱり「Excel方眼紙」でマニュアルを作ろうと思った(「Relax Tools Addin」のおかげ)

## はじめに
論争の絶えない「ネ申エクセル」「Excel方眼紙」ですが、
色々検討してやっぱり「Excel方眼紙」でマニュアルを作ろうと思いました。

※これは全て「[Relax Tools Addin](https://software.opensquare.net/relaxtools/)」があったおかげです。
　本投稿では詳細な「Relax Tools Addin」の操作を記載していませんが、
　ネット上には多くの操作紹介があるのでそちらを参照してください。

（2024.12.21 補足）この記事では、最終的にPDFなど印刷できるドキュメントにする時の原本としてエクセルを使っています。
いまやPDFにしてしまえば生成AIにも取り込めますしね。

## 「エクセル」＋「Relax Tools Addin」でマニュアルを作る利点

【前提条件】
　　全ては「Relax Tools Addin」がインストールされていないと始まりません。
　　「Relax Tools Addin」がないとマニュアル雛形の整地がしにくく、
　　あっという間に「ネ申エクセル否定派」に潰されてしまいます。。

（１）一般企業の事務作業で標準的な「Microsoft Excel」で
　　　レイアウトを考慮したマニュアル作成ができる。
（２）「Microsoft Excel」の「シート」で「章分け」ができる。
　　　章の差し込みも容易にできる。
（３）「Microsoft Excel」だけではできない「目次」や「章番号」も
　　　「Relax Tools Addin」によって楽々実現できる。

**それ以外のアプリやツールを使うことの弊害と思われること**

「Microsoft Word」「Microsoft PowerPoint」もっと専門的には「Adobe Photoshop」「Adobe XD」などを使ってマニュアルを作成する手段はありますが、
それらはやはり編集の自由度や専門性から難があると思うのです。

さらには「MarkDown」「LaTeX」などを利用する方法も考えられていますが、
さらに専門性が増し、システム化も必要となってしまい、
会社の全ての部門で簡単にマニュアルを作るツールとしては即応性がいまいちだなと思っていました。
(2024.12.21 補足)とか言いながら結構「[かんたんMarkDown](https://qiita.com/tatesuke/items/225b51b270faf8b10923)」は使わせていただいています！
※原稿のインプットには非常に便利なので！

## 【実践】「エクセル」＋「Relax Tools Addin」でマニュアルを作る
![技術マニュアルテンプレート(Excel方眼紙+RelaxTools)_基本はこのルールで.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/42c6c1b4-cd4d-954b-d5a3-c48c9860a0cb.png)

### 1.エクセルに「Relax Tools Addin」をインストールする。

「Relax Tools Addin」
https://software.opensquare.net/relaxtools/

・これはマニュアル作成に従事する全ての人員にやっていただく必要があります。
　しかし、無料のツールです！

### 2.マニュアルの「テンプレート」を作る。
※A4縦のレイアウトを想定して作っています。
・[Relax Word]-[Excel方眼紙]で全てのセルを方眼紙化する。　
・「B列」を「章番号」のセルとして定める。
　　[Relax Word]-[段落番号追加(+)]や[右インデント(→)]を使うことで自動的に採番できます。
　　※変に採番されても[Relax Word]の採番ルールに沿って手書き修正もできます。
・「章」「項」「本文」の文字バランスを決める。
　　※私はエクセルが文字サイズにより勝手にセルを広げてしまうのを避けるために
　　　次のルールを決めました。
　　最初の章：16ポイント、メイリオ、2行を結合。
　　次の項：　14ポイント、メイリオ
　　本文：　　11ポイント以下、メイリオ、文字の折り返しには[フィル]-[文字の割付]を
  　　　　　　　使う。
　　　　　　　※あるいはオートシェイプ（枠なし）を使うこと、
       　　　　　　　と割り切っても良いかもしれません。
・「シート」の「ページレイアウト」は「横：1ページ」「縦：自動」にしておき、
　「印刷」は「拡大縮小なし」にして、無理に文章や図表を詰め込まないようにする。
　　※試しに何文字か書いて[表示]-[改ページプレビュー]で実際の改ページ枠も確認しておくと良いです。

### 3.「章の執筆」は「テンプレート」の「シートをコピー」し、図表作成はエクセルを使わない。

図表作成はエクセルを使わない。←重要なのはこれです。

このテンプレート化したエクセル上で図表を作ると、せっかくの方眼紙がやがて崩れてしまうのです。
差し込み修正も容易ではありません。

図表作成はどうするかと言うと、
[挿入]-[オブジェクト]で[
Microsoft Word文章
 OpenDocument Text]を選択し、そのWordオブジェクトの中で図表を作成します。

１ページ以上にわたる図表はこのWordオブジェクトで１ページごとに作成しグループ化して揃えます。

章ごとでシート内の改ページを使ってもいいですし、改めて新しいシートにテンプレートをコピーして続きを書いても良いです。

### 4.[Relax Word]-[目次の作成]で目次ページに目次を自動生成させる。
[RelaxToolsで目次生成.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/d7a6018d-bf78-2017-4319-cf718e01684a.gif)
・[Relax Word]の採番ルールで、各対象シートに章番号、項番号を生成していればこのように目次も自動生成できます。
・生成後の目次は普通にエクセルの操作で編集ができますので、重複したページ番号などを修正します。

### 5.先頭に表紙「シート」を作って、マニュアル完成！

以上です。
【UE4】初心者になりたかったので基礎備忘録

#はじめに
詳細まで詰め込むと大変だったのである程度簡略化しつつ、自分の備忘録的にも残したいことを記載していく。
※会社などの経験は無く、趣味でUE4制作している輩です。


#ぶっちゃけたところ
良いサイト・良い勉強会、あります！なんならQiitaも…

####無料
- https://unrealengine.jp/unrealfest/extreme2021winter/
- https://www.youtube.com/playlist?list=PLr_Cbd4sUDTzbVjg1Bsm5s_21uPQ4xHLx
- https://historia.co.jp/archives/

####有料
- https://www.udemy.com/course/unreal-engine-4-beginner-tutorial/
- https://www.udemy.com/course/unrealengine4sound/
- https://www.udemy.com/course/unreal-engine-4-award/
- https://www.udemy.com/course/uihud-unrealengine4-umgwidget/

ぶっちゃけここが最初ですべて…。


#プロジェクト作成まで
「Unreal Engine」というものを導入というよりかはSteamみたいなゲームランチャーを導入する感じでランチャーをダウンロードするような感じ。
なのでエピックランチャーのゲーム遊んでいる人ならもう既にUnreal Engineの開発環境は整っていたりする…！
https://www.epicgames.com/store/ja/download

あとはランチャーから以下の項目クリックしていけばプロジェクトまで作れてしまう。
![ue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252485/3aeb8d4c-0a40-2a82-5f4d-54028d69b5cb.png)

参考例

- https://hahanha-create.com/2019/12/27/unreal-engine-4-%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%A8%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/
- https://yutateno.hatenablog.jp/entry/2019/08/30/034723



#ショートカット
最初に触ってみた所感として、ゲーム開発というよりかはGCCツールを扱っているような感覚が強いものでした。
なので、コードとは！サウンドとは！UMGとは！というよりショートカットはねっていうのを先に覚えておきたい感じでした。

- ビュー
    - カメラ移動：マウス右クリックホールド＋マウス移動
    - 位置移動：マウス右クリックホールド＋WASDキー
    - アクター移動：Wキー
    - アクター回転：Eキー
    - アクター拡大縮小：Rキー
- ブループリント
    - 検索窓：左クリック
- マテリアルブループリント
    - 変数一つ：1キーホールド＋左クリック
    - 変数二つ：2キーホールド＋左クリック
    - 変数三つ：3キーホールド＋左クリック
    - 変数四つ：4キーホールド＋左クリック


参考例

- https://www.unrealengine.com/ja/tech-blog/designer-s-guide-to-unreal-engine-keyboard-shortcuts
- https://historia.co.jp/archives/3478/
- https://yutateno.hatenablog.jp/entry/2021/07/18/225841


#よく使ってたブループリント
考えてみたけどそんなにない…たぶん全然把握してないだけだと思います…。

- 画面上デバッグ出力：[Print String]


#ちなみに…
はてなブログのほうで書いてたりしてます。
https://yutateno.hatenablog.jp/archive/category/Unreal%20Engine
カレントディレクトリの全てのHEICファイルを一撃でPNGに変える

## 結論
[imagemagick](https://imagemagick.org/index.php)のconvertを使用する。カレントディレクトリで以下を入力する。

```
$ convert * converted.png
```

## imagemagickのインストール方法
Macの使用を前提とする。

(1). terminalで以下を入力する。(homebrewをインストールする)

```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
(2). terminalで以下を入力する。(homebrew経由でimagemagickをインストールする。)


```
brew install imagemagick
```
【jQuery】要素の追加、削除の方法（append,prepend,remove,empty..)

#要素の追加、削除方法
<b>1.追加</b>
  ・append
  ・prepend
  ・after
  ・before

<b>2.削除</b>
  ・remove //要素自身を削除
  ・empty　　　//子要素を削除
  ・html("")　　//要素の内容を削除


##追加
demo:https://jsfiddle.net/boababy/w7d9j5vk/12/

```javascript
<ul>
  <li>最初のli</li>
</ul>

<div> 元div</div>

<script>
  $(function(){
  
  //内部追加
    var li=$("<li>後付けのli append</li>")
    var li2=$("<li>後付けのli prepend</li>")

    $("ul").append(li)
    $("ul").prepend(li2)
    
  //外部追加
    var div1=$("<div>後付けのdiv before</div>")
    var div2=$("<div>後付けのdiv after</div>")

    $("div").before(div1)
    $("div:eq(1)").after(div2)  
    
});

</script>

```


##削除
demo:https://jsfiddle.net/boababy/xwom24j8/9/


```javascript

<div class="remove">
remove
</div>
<button id="remove-bt" type="button">
remove element
</button>

<div class="empty">
<p>empty</p>
<p>empty</p>
</div>
<button id="empty-bt" type="button">
empty element
</button>

<div class="html">
<p>html</p>
<p>html</p>
</div>
<button id="html-bt" type="button">
use html empty element
</button>

<script>
$(function(){

   $("#remove-bt").click(function(){
      $(".remove").remove()
   })

 
   $("#empty-bt").click(function(){
      $(".empty").empty()
   })

   $("#html-bt").click(function(){
      $(".html").html("")
   })
  

});
</script>


```
テキストコミュニケーションをハックする

# はじめに
「この人怒ってるのかな？」「こんな初歩的な質問できないや...」

もしあなたがエンジニア（エンジニアでないとしても）であるならば、そう思った経験があるのではないでしょうか。私も経験があります。リモートワークが一般的となり、テキストコミュニケーションが主流となった今、そのようなネガティブな感情を抱く機会は少なくありません。

コロナの影響もあり、フルリモートやそれに近い環境で就業する方も増えてきたことでしょう。私自身、Webエンジニアとしてのキャリアをスタートしてから現在に至るまで、出社をした経験はほとんどありません。リモートネイティブとでも言えるでしょうか。

ご存知のとおり、リモートワークについては、その是非やあり方について、活発に議論がされています。今回はそういった、「リモート環境下における生産性の高い業務の進め方」などには言及せず、「現場のエンジニアがいかにして心理的安全性高く働くことができるか」にフォーカスします。

今回は例として、コードレビューにおけるテキストコミュニケーションを想定して、どのようなコミュニケーションが望ましいか検討します。

## 悪い例

悪い例として、以下の２つを提示します。エンジニアとしてチーム開発を経験したことのある方であれば、見たことがあるようなやり取りではないでしょうか。

### ①

```
@implementer
レビューしました。
３点指摘したので、修正お願いします。
```

```
@reviewer
修正完了です。

```

### ②

```
@implementer
追加ですが、コンフリクトが発生しているので、解消後に再度コメントお願いします。
```

```
@reviewer
コンフリクト解消しました。レビューお願いします。
```

## 丁寧にコミュニケーションする

まず一つ目が、とにかく丁寧にコミュニケーションすることです。対面のコミュニケーションと同様に、テキストコミュニケーションでも重要です。

- もしよろしければ、〜していただけると幸いです
- お手すきで構わないので、〜お願いします
- お忙しいところ申し訳ないのですが〜

このような構文を用いることで、受け手に安心感を与えることができます。

## 感謝の気持ちを伝える

次に、感謝の気持ちを伝えることです。これも、対面のコミュニケーションにも言えますが、意図が伝わりにくいテキストコミュニケーションではより重要性が増します。

- 対応いただきありがとうございます
- 実装いただきありがとうございます

このような一言を付け加えることで、受け手に安心感を与えることができるでしょう。

## とりあえず絵文字や「！」を使っておく

最後が、絵文字や「！」を使う、です。

今どき、プライベートで絵文字や「！」をむやみに使っていると「おじさん構文」と揶揄されたりして、気持ち悪がられるリスクが高いですが、仕事に関して言えば、使っておいて損はないです。

なにか相手に指摘する場合でも、絵文字があるだけで受け手に与える安心感は増します。

ちなみに、私が多用する絵文字は、「🙇‍♂️」「🙏」「👍」です。

※「PCでどうやって絵文字を打つんだよ！」と思った方もいるかもしれませんので補足ですが、MacであればCommand + Control + Spaceで絵文字の入力画面を表示できます。

## 良い例

以上を踏まえて、悪い例を改善してみました。かなり安心感が増しているのがわかるのではないでしょうか。

### ①

### Before

```
@implementer
レビューしました。
３点指摘したので、修正お願いします。
```

```
@reviewer
修正完了です。

```

### After

```
@implementer
実装ありがとうございます👍レビューしました！
３点指摘しましたので、お手すきで修正いただけると助かります🙇‍♂️
```

```
@reviewer
ご指摘ありがとうございます🙏
以下のコミットで修正しました！
`2xxxxxx`
お手すきで構わないので、再度レビューお願いします🙇‍♂️
```

### ②

### Before

```
@implementer
追加ですが、コンフリクトが発生しているので、解消後に再度コメントお願いします。
```

```
@reviewer
コンフリクト解消しました。レビューお願いします。
```

### After

```
@implementer
追加で申し訳ないのですが、コンソールの方でエラーとWarningが発生しているみたいなので、お手すきで修正お願いします🙏
また、priceの型はnumberではなく、stringではないでしょうか？差し支えなければ変更していただけると助かります🙇‍♂️
修正後、改めてメンションいただければすぐにレビューします！

```

```
@reviewer
ご指摘ありがとうございます！完全に見逃していたので助かりました🙏
以下のコミットで修正しました👍
`2xxxxxx`
お手すきで再度レビューお願いします🙇‍♂️
```

## 対面コミュニケーションの機会を作ろう

「テキストコミュニケーションをハックする」をテーマに、どのようなコミュニケーションを図れば互いに心地よく働くことができるか、例を挙げて示してきましたが、「実際に話して仲良くなる」に勝る方法はありません。とはいえ、毎日オフィスで顔を合わせる必要はありません。たまにでも、実際に会ったり、通話したりするなどして自己開示ができていれば、コミュニケーションのハードルが下がり、心理的安全性を高めることができるでしょう。

## おわりに

エンジニアの採用面接で「チーム開発の経験について」は定番の質問です。そして、最近は「リモートワークの経験について」もまた聞かれる機会が増えているように思います。テキストベースの非同期的なコミュニケーションを得意としておくことのメリットは大きいでしょう。巷では「テキストコミュニケーションは難易度が高い」と言われたりもしますが、コツさえ掴めば、対面のコミュニケーション以上に簡単です。本稿を参考に「テキストコミュニケーションをハック」していただけると幸いです。

※本稿は[こちら](https://www.hidemitsuaoki.com/blog/9y7ebz1hid9)にも掲載されております。
応用情報技術者試験の勉強方法

令和3年秋期の応用情報技術者試験の結果が発表されました。  
「取らないと業務に支障が出る」や「昇進に影響する」といったことは無いのですが、IT企業に勤めており資格手当も支給されるため、取っておいて損は無いかと思い、受験を致しました。　  
無事合格ができましたので、その時の勉強方法や利用していたサイトなどについて振り返りたいと思います。  

# 簡単なプロフィール  
 - IT企業入社5年目
 - 大学は情報系の卒業
 - 基本情報は持ってる
 - 餃子とビールが好き

# 勉強時間
 - 2ヶ月弱
    - 平日：1時間程度
    - 休日：3,4時間(拘束時間は5,6時間でダラダラとやってました。個人的にはオンオフを付けない方がストレスなく続けられました)

「IT企業5年目で情報系出身なら、そんなに勉強しなくても良いのでは？」と思われるかもしれませんが、応用情報は難しく範囲が幅広い為、実務での経験をしたことのない問題も出題されます。また、私自身心配性な性格であり、準備を入念にしたいタイプですのでこうなりました。（余談ですが、目覚まし時計は3回くらい見直してから寝ます。そのため、人生で一度しか寝坊したことがないです。一度した寝坊に関しては、プライベートの約束でしたので多めに見てください。）

# 勉強方法
試験前の勉強方法に関してご紹介します。  
## 午前試験の勉強方法
 - 午前の勉強に関しては、ひたすら過去問
 - 間違えた問題は、あとで見直せるように印やメモを取っておく
    - 正解した問題も、自信を持って回答できなかった部分に関しては同様に印やメモを取っておく  
 - **間違えた問題が、どこが間違えなのかをしっかりと理解する**
    - 必要に応じて、他のサイトで間違えたところを深堀して調べてみる
    - ここに結構注力していました  

## 午後試験の勉強方法
 - 午後の勉強に関しても、ひたすら過去問
    - 自身の持てそうな大問を選び、問題に慣れる
 - 一問一問の文章が長い為、一度読んでなるべく理解できるように文章を図に起こしながら理解をしやすいようにして進める
    - スライド作成などにも利用される図解といったイメージです
    - 特に参考にしたサイトなどはありませんが、自分が後でその図を見て内容を理解できるような形で書いていました


上記の方法で勉強を進めていました。  

## 勉強に利用したサイト  
参考書などは特に利用せずに、ツールも全て無料のものを利用しました。  
### [応用情報技術者試験ドットコム](https://www.ap-siken.com/apkakomon.php)
 - 言わずと知れた、名サイトです
 - 振り返りや間違えた問題もわかりやすく重宝させてもらっております  

### [Ankilot](https://ankilot.com/)
 - 単語帳アプリです
 - 間違えた問題の単語とその意味を表裏それぞれに記載して後で復習ができるようにしていました
 - 単語帳の作成はPCで行い、通勤時間などで単語帳を見ながら過ごしていました
 - 操作などは直感で利用できる感じで、非常に使い勝手がよかったです

上記は応用情報時の勉強ツールですが、その他にも最近では以下のツールでも勉強しています。
### [XMind](https://jp.xmind.net/)  
 - マインドマップを作成できる
 - 視覚的に記憶ができ、相互関係などを図示できて良い  

### [Notion](https://www.notion.so/)
 - Qiitaと同様にマークダウン形式でページを作成できる
 - メモなどに便利



# 応用情報を受けて良かったこと  
 - 会社から手当が出ること
    - 単純に嬉しい
 - 勉強の習慣がついたこと
    - もはや勉強をしないと不安になってくる
    - もう次受ける資格を探してしまっている
 - 担当業務以外の知識も蓄えることができる
    - 業務上アプリケーション開発を行っていますが、ネットワークの分野などは、管轄外であり、こういった機会がないとあまり勉強しなかったかなと思います
    - ITの分野は進歩が早く、自分から探しに行かないと発掘できない情報がたくさんあります。新しい技術の知識も増えたと思います

# 応用情報を受けて悪かったこと
 - 奥さんから「また勉強してるの？」と怒られる
 - 奥さんから「いつ勉強終わるの？ご飯食べようよ」と怒られる  

勉強期間中は、家事や食事など色々とお願いしてしまっていたので、なにか欲しい物を買ってあげようと思います。  


皆さまの勉強方法なども、是非お聞かせください！
OpenAPI定義からクライアントコードを生成するコマンド

```
docker run \
  --rm \
  --volume "/path/to/where/you/want/to/generate/client/code:/local" \
  openapitools/openapi-generator-cli:v5.1.0 \
  generate \
    --input-spec http://host.docker.internal:3000/api-json \
    --generator-name typescript-axios \
    --output /local
```
[Laravel]paginate()後のforeachの注意点

## 背景

- 業務で管理画面にページネーション機能を持った一覧画面を作る、というシンプルなタスクに着手したときのこと
- 当初Laravelではおなじみの`pagineate`メソッドがあるので、これを使って書こうと構想していた
- ただ、今のプロジェクトが[Laravel-admin](https://laravel-admin.org/docs/en)というライブラリを使用しており、paginateをforeachしてループさせて、別の変数に格納するという処理が必要だった
- そこで、

> 「プロジェクト内の同じページネーション機能を持った一覧表示画面はどう書いているんやろか？」

と確認してみると、、、

```php
$orders = $user->orders()->paginate();
...
foreach ($orders->toArray()['data'] as $order) {
    $id = $order['id']
    ...
}
```

> 「ん？！なんだこの`toArray()`は？['data']って何？」

となった

- `toArray()`自体の意味は知っていたが、ここに存在する理由が謎だった。

- 実際に、既存の`toArray`を消して以下のようにしてみたが

```php
$orders = $user->orders()->paginate();
...
foreach ($orders as $order) {  // 修正
    $id = $order->id   // 修正
    ...
}
```

- 機能として問題ない（むしろこっちのが見慣れた形なので、動かないと困る笑）
- これを調べた時の話

## 結論

- まず結論からいうと、**静的解析でエラーになる**というのが結論です。

## 詳細

- phpstanによる静的解析の結果は以下

```php
Argument of an invalid type Illuminate\Contracts\Pagination\LengthAwarePaginator supplied for foreach, only
iterables are supported.
```

- 要約としては

> 「foreachは**iterablesなもの**には使えるけど、今は**LengthAwarePaginator**に使っていて、これには使えないよ」

といった感じ。

- ここでいう「iterablesなもの」というのは要はイテレータのことでざっくりいうと「反復可能なモノ」
    - 具体的には配列、Collectionがイテレータこれに該当。

[イテレータについて（PHP公式）](https://www.php.net/manual/ja/class.iterator.php)

- そして`Illuminate\Contracts\Pagination\LengthAwarePaginator`というのは`paginate()`メソッドの戻り値のインスタンス
    - これは配列でもColllectionでもないオブジェクトになる、つまり**イテレータではない**ので、エラーが発生する、ということ

## 本題

- 以上を踏まえて、冒頭のコードに戻ると

```php
$orders = $user->orders()->paginate();
...
foreach ($orders->toArray()['data'] as $order) {
    $id = $order['id']
    ...
}
```

1, `$orders->toArray()`で`LengthAwarePaginator`インスタンスを配列化（これで静的解析エラー回避）

2, その配列化した要素の内、取得したい値は`['data']`にあるので、これを取得

3, foreachでループ処理

という流れになるということでした

# 所見

- 普段よく見かける`paginate()`の使い方は、以下を作って

```php
$users = User::paginate(15);
```

Viewファイルに以下を書く

```php
{{ $inquiries->links() }}
```

のが一般的かな、と思います。

- この静的解析結果がエラーになることを知り、Laravel内でもどっかで同じような処理してんのかな？と思って`links`メソッド内では特にforeachしてなさそうでしたね。。。

※ちなみに、静的解析も「どこまでエラーとして吐かせるか」というのはプロジェクトごとにレベルを変えれるので、今回のようなエラーが出ない可能性もあります。

### 余談ですが、、、

- 静的解析で今回のように**直感的にわかりにくいコードが作られてしまう**のは静的解析を採用することのデメリットかと思います。
- ただ、これによりプロジェクトが大規模化した際に起こりうる**バグの温床を開発と同時並行でつぶし込めている**のはかなり安心感があり大きなメリットです！
    - 特にサービス寿命を長く持たせたい自社開発プロダクトであれば採用しておきたいところかな、と思いました。
    - たまに「これ想定しなきゃダメ！？」みたいなのエラーももちらほらありますが、、、
- 結論、この静的解析を進めつつ開発を進めるのは個人的には賛成ですね。

※コレ、当たり前のモノだったらスイマセン。。。
ただ、気づきとして純粋に静的解析が便利だな、と思ったんです。。。
本番環境のホームディレクトリ直下を全削除した話

# 本番環境のホームディレクトリ直下を全削除した話

かれこれもう10年以上昔の話です。

旧システムから新システムへリプレイスする案件で、本番環境オープンの1週間程前に事件は起こりました。

データやコンテンツを旧システムから新システムに移行する要件があり、シェルスクリプトで処理を行います。
移行スクリプトを実行して、コーヒーブレイクのために離席します。
しばらくしてから席に戻ると机にはお客様からの電話の着信を知らせる付箋が貼ってあります。

お客様に電話すると、やけに慌てた様子でした。

「急に本番環境にアクセスできなくなりました!!」


お客様の方では、本番環境に静的ファイル等のコンテンツファイルを登録したり、デザインのチェックなどを行っていました。

特別思い当たるフシもなかったのですが、アプリケーションが異常終了したかと思い、SSHでサーバーに接続します。

アプリケーションのディレクトリーへ移動するコマンドを叩きます。

`cd: no such file or directory`

嫌な予感がしましたが、この時はタイプミスだろうと思い、`ls`コマンドで移動先のディレクトリーを確認します。

``` shell
$ ls -l
合計 0
```

**0?** 

慌てて `pwd`コマンドを実行しても、アプリケーションユーザーのホームディレクトリーにいます。

なにが起こったんだ・・・？

吹き出る汗。
ふるえるぜハート!血液のビートを刻みそうになってました。


原因は、先程実行したデータ移行用のシェルスクリプトにありました。

シェルスクリプトは以下のような内容でした。

``` shell
# /bin/bash

cd aaa
cd ../
cd bbb
cd ../
cd ccc
rm -rf ./
```

シェルスクリプトの中では何回か`cd`コマンドを使ってディレクトリーを移動して、ファイルのコピー、移動、削除などを行っていました。
ただし、シェルスクリプトの中では`cd`の戻り値を評価して制御を分けるような事はしていませんでした。
`cd`コマンドで移動に失敗しても、シェルスクリプトが終了するわけではありません。ただ、そのディレクトリーから移動しないだけです。
何度か`cd`コマンドで移動を繰り返した結果、ホームディレクトリーに移動し、とどめの一撃 `rm -rf ./` でカレントディレクトリー配下を全削除していたのでした。

お客様の方で静的コンテンツファイルなどをバックアップしており、無事にシステムリニューアルは出来たのですが、エンジニアになって最も魂が震えた事件でした
RubyのTimeクラスを理解する

# 目的
コーディングテストのオブジェクト指向問題において、クエリの処理などの時間を使用するものが多いためまとめる

# DateクラスとTimeクラス
- Dateクラス
    - ***日付のみ***を扱いたい場合に使用
- Timeクラス
    - ***日付と時刻***を扱いたい場合に使用

# Timeクラス（timeライブラリを含む）のよく使うメソッド

## parse メソッド
- 時間の文字列からTimeクラスオブジェクトに変換
- parseメソッドはRubyの組み込みのTimeクラスのメソッドではなく、timeライブラリによって拡張することによって使用可能となるため、先頭にrequireの記述が必要

```ruby
require 'time' # 拡張

time_str = "2021/11/5 14:00:32"
time_obj = Time.parse(time_str)
=> 2021-11-05 14:00:32 +0900
```

## Time オブジェクト同士減算
- 時間の差を出したい時がある
    - Timeオブジェクトに変換して、減算してあげることで差が求まる
    - 結果は秒数のFloat型で変換

```ruby
time1 = "2021/11/5 14:00:32"
time2 = "2021/11/5 15:42:32"
time1_obj = Time.parse(time1)
time2_obj = Time.parse(time2)
time2_obj - time1_obj

=> 6120.0

# 秒数の絶対値が返るわけではない
time1_obj - time2_obj
=> -6120.0
```

### 秒で返るので分に直す
- 分単位で扱いたい場合
- Numeric クラスを拡張してあげてもいいかもしれない

```ruby
class Float
  def to_minutes
    (self / 60).to_i
  end
end

time1 = "2021/11/5 14:00:32"
time2 = "2021/11/5 15:42:32"
time1_obj = Time.parse(time1)
time2_obj = Time.parse(time2)

(time2_obj - time1_obj).to_minutes

```
Cloud IDSがGAになったので、導入してみる

今月にCloud IDSというフルマネージドなIDSがGCPで利用できるようになりました。
試しに導入してみたので、その手順をメモしておきます。

https://cloud.google.com/blog/products/identity-security/announcing-general-availability-of-google-cloud-ids

# Cloud IDSとは
Cloud IDSとはGCPが提供しているフルマネージドなIDS(侵入検知システム)です。
VPCネットワーク内の通信を監視し、セキュリティリスクを発見してくれます。
通信の監視のためにVPCのPacket Mirroring機能を使用しています。
この機能はSDNのレイヤーで機能するため、VPC内で動いている個々のVMやコンテナに対する設定は不要です。

https://cloud.google.com/vpc/docs/packet-mirroring

また、IDSそのものはPalo Altoのものが使われており、検知可能なシグネチャはPalo Altoのページで確認できます。

https://www.paloaltonetworks.com/blog/2021/07/google-cloud-network-threat-detection/

https://docs.paloaltonetworks.com/pan-os/10-0/pan-os-admin/threat-prevention/threat-signatures.html

# 設定してみた
## Private service accessの設定
最初にPrivate service accessを設定します。

Cloud IDSはIDSとして動作するVMがGoogle管理のVPCに立ち上がり、そのVPCとVPC Peeringすることによって動作します。
そのため、その設定を最初に行います。

Google管理のVPCのCIDR範囲を指定します。
Cloud SQLなどでも初回構築時に同様のことをしている場合があります。
その場合はこのコマンドは不要です。

```sh
gcloud compute addresses create <CIDRレンジ予約名> \
  --global \
  --purpose=VPC_PEERING \
  --addresses=<Googleに払い出すCIDRのネットワークアドレス> \
  --prefix-length=<Googleに払い出すCIDRのサブネットマスク> \
  --network=<VPCネットワークID>
```

次にVPC Peeringを設定します。

```sh
gcloud services vpc-peerings connect \
  --service=servicenetworking.googleapis.com \
  --ranges=<CIDRレンジ予約名> \
  --network=<VPCネットワークID> \
  --project=<プロジェクトID>
```

https://cloud.google.com/vpc/docs/private-services-access

## Cloud IDSのエンドポイントの作成

```sh
gcloud ids endpoints create <エンドポイント名> /
  --network=<VPCネットワーク名> /
  --zone=<IDSを配置するゾーン> /
  --severity=<INFORMATIONAL|LOW|MEDIUM|HIGH|CRITICAL>
```

IDSを配置するゾーンは監視したいVMが配置されているゾーンと同一ゾーンに設定します。
VPCのルーティングモードがグローバルならば、別ゾーンにも配置できそうな気もしますが、未検証です。
また、現状ではエンドポイントを作成後にseverityオプションを変更することができないので、注意が必要です。
エンドポイントの作成は数分〜数十分で完了します。
完了後に以下のコマンドを実行し、endpointForwardingRuleに表示されているURLをメモしておきます。

```sh
gcloud ids endpoints describe --zone=<IDSを配置したゾーン> <エンドポイント名>
```

## Packet Mirroringの設定
最後にPacket Mirroringを設定してVPC内に流れるパケットをCloud IDSにも流すようにします。

```sh
gcloud compute packet-mirrorings create <ポリシー名> \
--region=<リージョン> --collector-ilb=<さっきメモしたendpointForwardingRule> \
--network=<VPCネットワーク名> --mirrored-subnets=<監視したいVMが配置されているサブネット>
```

Packet Mirringには他にも多くのオプションがあるので、それによって柔軟に監視対象を設定することもできます。
例えば、mirrored-tagsオプションを使うことで、特定のタグがついているVMのみを監視対象にすることもできます。

https://cloud.google.com/sdk/gcloud/reference/compute/packet-mirrorings/create

# 設定の確認
Cloud IDSの設定が完了したので、正常に通信を監視できているかどうかを確認してみます。
今回は監視対象のVMの中で以下のコマンドを実行してみました。

```sh
curl http://example.com/cgi-bin/../../../..//bin/cat%%20/etc/passwd
```

その結果、Cloud IDSの画面でこのように表示され、脅威検知ができていることが分かりました。

![スクリーンショット_2021-12-18_13_38_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/8de171f7-aebe-2200-a0ba-ffb939986455.png)
Swiftのクロージャーについて学習した感想

# Swiftのclosureについて
クロージャー（無名関数）と呼ばれている変数の中に書く独特の文法はJavaScriptやPHPでもあったが、Swiftの場合書き方が独特すぎて慣れるまでは、理解できなかった。

**自身の感想としては、function(関数)で書いた方が読みやすい気がする**

## 書き方の例
```
{ (引数名: 引数型) -> 戻り値の型 in
   //ここで処理を実施
}
```

## 自分の好きなライトノベルのキャラクターの名前を使ってサンプルを作成してみた
```
//高校生かどうかを判定するクロージャー
let studentCheck = { (age: Int) -> String in
    let message: String
    if age < 18 {
        message = "七瀬さんはまだ高校生ですよ!"
    } else {
        message = "七瀬さんは高校を卒業しています!"
    }
    return message
}
//クロージャを実行する
print(studentCheck(19))
```
実行結果

```
七瀬さんは高校を卒業しています!
```

## 三項演算子という文法を使うと一行で書くこともできる!
```
//三項演算子を使って処理を一行に省略できる
let studentCheck = { (age: Int) -> String in return age < 18 ? "七瀬さんはまだ高校生ですよ!" : "七瀬さんは高校を卒業しています!" }
//三項演算子を使ったクロージャーを実行する
print(studentCheck(16))
```
実行結果

```
七瀬さんはまだ高校生ですよ!
```

## returnを省略するパターン
```
//returnを省略するパターン
//高校生かどうかを判定するクロージャー
let studentCheck = { (age: Int) -> String in age < 18 ? "七瀬さんはまだ高校生ですよ!" : "七瀬さんは高校生を卒業しています!" }
//クロージャを実行する
print(studentCheck(19))
```
実行結果

```
七瀬さんは高校を卒業しています!
```

## 最後に
もっと短く書く方法があるのですが、省略しすぎると無名関数ならではの文法に慣れていないと「なんだこれ、短く書けるけどわかりにくい...」と感じて良くないかなと思いましてここまでにします。
もっと詳しく知りたい方は、こちらのサイトを参考にして下さい
https://www.isoroot.jp/blog/3000/
Livewireを触ってみた感想

Laravel8から加わったLivewireを少し触ってみたので個人的に良いと思ったところを書いてみます。
# Livewireとは
公式サイトは[こちら](https://laravel-livewire.com/)
PHPのみで動的コンポーネントを作成できることが特徴で、Laravel8の認証機能のうちの一つである、Jetstreamを使うためのライブラリです。
## すごいと思ったところ
### jsを書かなくても動的コンポーネントができる
動的コンポーネントといったら、vueやreactといったJavascriptでしか実現が難しいものかと思いきや、なんとLivewireではPHPのみで作成ができます。
### LaravelのBlade構文をそのまま使える
Livewire用の構文も多数存在するので学習コストはもちろん0ではありませんが、Blade構文をそのままに使えるのはとても魅力的に感じます。

## 試してみる
それでは実際に例で見てみます。

```
composer require livewire/livewire
```
```welcome.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Livewire</title>
    @livewireStyles
</head>
<body>
    @livewireScripts
</body
</html>
```
インストールが完了したら、headタグの最後とbodyタグの閉じる直前に@livewireScriptsと記述します。
次にコンポーネントを作成します。
コンポーネントは、`php artisan make:livewire`で作成できます。
今回は弊社猫社員を呼ぶ簡単なアプリを作るのでまずは猫コンポーネントを作成します。

```
php artisan make:livewire cat
```
App/Http/Livewire/ に Cat.php と、resources/views/livewire/ に cat.blade.php が作成されました。

```Cat.php
<?php

namespace App\Http\Livewire;

use Livewire\Component;

class Cat extends Component
{
    public $cat = '呼んでみる？';
    public $count = 3;

    public function call()
    {
        $cats = [
            'ふたば「にゃぁ」',
            'みるく「アオォォーーー」',
            'はな「みゃーーぅ」',
            'ちまき「オアーーーーーー！！！」',
            'さくら「モガ」',
            'りぼん「ミャア」',
            'みい「めえええ」',
            'ちゃこ「ワーォ」',
            'ごまお「ニャーーン！！！」',
        ];

        $randKey = array_rand($cats, 1);
        $this->count--;
        $this->cat = $cats[$randKey];
    }

    public function render()
    {
        return view('livewire.cat');
    }
}

```

```cat.blade.php
<div>
    <h1>猫を呼ぼう！</h1>
    <h2>{{ $cat }}</h2>
    @if($count > 0)
    <p><button wire:click="call">呼ぶ</button></p>
    @else
    <p><button>仕事しましょう</button></p>
    @endif
</div>
```

```welcome.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Livewire</title>
    @livewireStyles
</head>
<body>
    <livewire:cat>
    @livewireScripts
</body
</html>
```
![cat.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442492/af715b92-80b7-2665-9737-68745c583cac.gif)

`<livewire:コンポーネント名>`でコンポーネントをレンダリングできます。

フロントとバックの繋ぎ込みはLivewireがうまい具合にやってくれるので、特に何も記述しなくてもボタンをクリックするごとにPOST送信されています。
![スクリーンショット 2021-12-15 22.24.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442492/8f4c6bf5-023a-e938-4d62-7dc651de6b5a.png)

##まとめ
本当にごく一部分のみの紹介となりましたが、Livewireとても良いと思います！
LaravelユーザーでもサクッとSPAを作ることができます。
今後の盛り上がりに期待します！

##参考記事
https://reffect.co.jp/laravel/laravel-livewire

https://kobatech-blog.com/livewire/
サンタクロースで考えるUIUXデザイン

こんにちは、UIUXデザイナーの @j-skt です。

今年も残すところわずかとなりました。
最終営業日が近づくにつれてあれもこれもと慌ただしい日が続きますね。

今日はサンタクロースで考える UI（User Interface）/ UX（User eXperience）デザインのお話です。

12月になると街はイルミネーションで飾られキラキラとしたおきまりのクリスマス風景。商業主義にあおられ大人がケーキやプレゼントを探している一方で、子どもたちからは「サンタクロースは、本当にいるの？」って会話が聞こえてきます。

うちには小学生になる前の娘がいるのですが「今年はサンタクロースに手紙を書く！」と張り切っています。直接会えないけれど、彼女なりに一年に一度のサンクロースの訪問を楽しみにしているようです。
![img_santa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2339335/4f72aa2e-450f-bb6e-9b87-aadf1569c2f9.png)
サンタクロースの存在を子どもに話すか話さないかは各家庭によるところですが、うちの娘にはできるだけ長い間信じていて欲しいなと思っています。

では、なぜそうして欲しいのか？

長いこと自分の中で言語化できない問いでした。
そんな時に偶然出会ったのが松岡 亨子さんのエッセイです（こちら抜粋です）。

>子どもたちは、遅かれ早かれ、サンタクロースが本当は誰かを知る。知ってしまえば、そのこと事態は他愛のないこととして片付けられてしまうだろう。しかし、幼い日に、心からサンタクロースの存在を信じることは、その人の中に、信じるという能力を養う。私たちは、サンタクロースその人の重要さのためだけでなく、サンタクロースが、子どもの心に働きかけて生み出すこの能力ゆえに、サンタクロースをもっと大事にしなければいけない。

>心の中に、ひとたびサンタクロースを住まわせた子は、心の中に、サンタクロースを収容する空間を作り上げている。サンタクロースその人は、いつかその子の心の外へ出て行ってしまうだろう。だが、サンタクロースが占めていた心の空間は、その子の中に残る。この空間がある限り、人は成長に従って、サンタクロースに代わる新しい住人を、ここに迎え入れることができる。

>この空間、この収容能力、つまり目に見えないものを信じるという心の働きが、人間の精神生活のあらゆる面で、どんなに重要かはいうまでもない。のちに、いちばん崇高なものを宿すかもしれぬ心の場所が、実は幼い日にサンタクロースを住まわせることによって作られるのだ。

>サンクロースの部屋 子どもと本をめぐって
>松岡 亨子

初めてこの一説を読んだ時、これだ！っと強い共感を持ったのと同時に、私が幼い頃に「サンタさんは、サンタさんのことを信じている子どものところに来てくれるんだよ！」と言い聞かせてくれた両親に感謝したことを覚えています。
![img_child.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2339335/f0fc4bf4-7520-9c31-26b4-6973d47b397c.jpeg)
子どもにとってクリスマスのケーキやプレゼントは UI（User Interface）であり（極論）何でもよくて、__本質的な UX（User eXperience）を形作るのは「空想の世界にいるサンタクロースを住まわす心の空間 ＝ 目に見えないものを信じる力」なのだと思います。__

今年のクリスマスイブの夜、娘と一緒に、プレゼントを届けてくれるサンタクロースのために温かいココアとチョコレート、それに手紙を添えて。。「サンタさんココア喜んでくれるかな？」「サンタさん手紙読んでくれるかな？」なんて話をしながら眠りにつくのが楽しみです :snowflake: :santa: :christmas_tree: :snowflake:
<br><br>
atcoder

# A - 地域エリアデザイン

https://atcoder.jp/contests/hokudai-hitachi2021/tasks/hokudai_hitachi2021_a

# Sample code for Hitachi Hokudai Lab. and Hokkaido University Contest 2021 A

* This is an explanation of the sample code used in the Hitachi Hokudai Lab. and Hokkaido University Contest 2021 A. Based on the distributed code the participants can create input samples and evaluate the score of their output on their own local machine.
* Please note that you are using the provided sample code on your own responsibility. In particular, neither Hokkaido University nor Hitachi Ltd. can be held responsible or liable, in case the execution of the provided sample code causes any damage to your computer.
* The provided program for score evaluation is identical with the program which will be used to evaluate your score during the contest. However, since the random seed used to generate the input cases during the contest may vary from your input cases, the final score of your program might vary.

## Sample code overview

The sample code can be found in this folder.

* `judge_A.cpp`
    * This program is the game engine which simulates the environment and scores the contestant output.
* `sample_A.sh`
    * This is an example program that outputs a simple answer (input and output format 2).
* `testcases/*.in`
    * In testcase subfolder, examples of testcases can be found.


## Compilation

To create executable files `judge_A`, please compile judge_A.cpp as follows.

```bash
g++ -std=c++17 -O2 judge_A.cpp -o judge_A
```

# Output the score

For the test case `testcases/A.in`, score calculation are performed as follows.

```bash
./judge_A ./sample_A.sh < testcases/A.in > test_case.result
```

By executing the above command, the score will be output to `test_case.result`.

## Acknowledgement

* The sample code is released under the MIT license.
【備忘録】InteliJ 便利ショートカット(Windows)



個人的によく使用するものを抜粋🐾
覚えてないものほど上に記載


>参考 Windows & Mac ver
https://qiita.com/yoppe/items/f7cbeb825c071691d3f2

>Git機能もこちらから
https://qiita.com/yoppe/items/fd03607d4d4f191d32dd




#■ 選択行を上下に移動(Move Line Up/Move Line Down)
ショートカットキー(Windows)：Alt + Shift + ↑／↓
![https___qiita-image-store.s3.amazonaws.com_0_7885_fe95c531-b796-4ddb-b290-6bf2cf2c809b.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/76ff32b5-d3f2-a325-7ca6-96055783f651.gif)



#■ マルチカーソル(Add Selection for Next Occurrence)
ショートカットキー(Windows)：（特定文字列を選択してから）Alt + J


>※置換すると不要なとこまで変更してしまう
![https___qiita-image-store.s3.amazonaws.com_0_7885_032506cc-235a-6e7f-0cb5-b639e4a84435.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/a58047a6-d89a-9338-1e7e-7bb67f066b23.gif)






#■ プロジェクトツールウィンドウの表示/非表示(Structure)
ショートカットキー(Windows)：Alt + 1
![https___qiita-image-store.s3.amazonaws.com_0_7885_3e0a1f87-dd56-40af-3ac0-f706d28cb4c5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/ee3e4c46-6aff-b1a0-f305-9a38da6c9596.gif)





#■不要なimport文削除 :
ショートカットキー(Windows)：Ctrl + Alt + O

#■ ファイル横断テキスト検索(Find in Path)
ショートカットキー(Windows)：Ctrl + Shift + F
![https___qiita-image-store.s3.amazonaws.com_0_7885_4c4dd7d7-b14b-8a84-b549-86365b436bcd (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/436548ad-e55a-db3e-e5d0-a86ff88c88e2.gif)


#■ なんでも検索(Search Everywhere) 
ショートカットキー：Shift 2回連打
![https___qiita-image-store.s3.amazonaws.com_0_7885_a391b300-7aea-f076-16be-602dbe1ffdc9.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/3aa38817-225c-e6e4-afc6-d751d616ee50.gif)



# ■コピー履歴から貼り付け(Paste from History)
ショートカットキー(Windows)：Windowsアイコン + V
>※Windowsのみ

#■ 宣言へジャンプ(Go to Declaration or Usages)
ショートカットキー(Windows)：Ctrl + B  //   Ctrl + クリック(便利)

>メソッドが使用されてる箇所 や クラス  へ即アクセスできますｂ


#■ 継承関係をクラス図で表示(Show UML Popup)
ショートカットキー(Windows)：Ctrl + Alt + U
![https___qiita-image-store.s3.amazonaws.com_0_7885_e7f35e12-cbe5-6ee0-d91a-40273c39dbe5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/c6c7017d-6975-f29d-6bfa-3a35d5be1176.gif)
PowerShellで独自のコマンドレットを作成する


## プロファイルの存在を確認する
PowerShellでは、プロファイルというファイルを編集することで独自のエイリアスやコマンドレットを作成することができる。

下記コマンドでプロファイルの存在を確認する。

```
> Test-Path $profile
False
```

Falseの場合は存在しないため、プロファイルを作成する。

```
> New-Item -path $profile -type file -force

    ディレクトリ: C:\Users\*****\Documents\WindowsPowerShell

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2021/12/14     10:26              0 Microsoft.PowerShell_profile.ps1
```

## エイリアスを作成する
`Set-Alias`コマンドレットでエイリアスを作成する。

```powershell:Microsoft.PowerShell_profile.ps1
# Sublime Textを起動
Set-Alias st "C:\Program Files\Sublime Text 3\sublime_text.exe"
```

オプションやコマンドライン引数を利用したい場合は関数として宣言する。

```powershell:Microsoft.PowerShell_profile.ps1
function pikotaro() {
    Write-Host ("This is " + $args[0])
}
```

コマンドライン引数は`$args`で受け取ることができるが、
下記のように`param()`を使用することで変数名を割り当てることができる。

```powershell:Microsoft.PowerShell_profile.ps1
function pikotaro() {
    param ($word1,$word2)
    Write-Host ("This is " + $word1 + "-" + $word2)
}
```

`$args`で引数を受け取る場合、実行時の引数の順番が固定されてしまうが、
変数名を使用すると、オプションに指定することで引数の入力順を入れ替えることができる。

```
# オプションなしの場合$word1 $word2の順で引数を渡す
> pikotaro apple pen
This is apple-pen

# オプションを使用すると指定した変数に引数を渡せる
> pikotaro -word2 pen -word1 apple
This is apple-pen
```

## プロファイルを読み込む
PowerShellを再起動するか、下記コマンドレットを実行することでプロファイルが反映される。

```
> . $profile
```

コマンドレットの実行時に`このシステムではスクリプトの実行が無効になっているため～`のような
エラーが出る場合は、Windowsの設定でPowerShellスクリプトの実行ポリシーが許可されていないため
下記コマンドレットで実行ポリシーを変更する必要がある。
（RemoteSigned: ローカル上のスクリプトと非ローカル上の署名のあるスクリプトのみ実行可能）

```
> Set-ExecutionPolicy RemoteSigned
```

## 日本語が文字化けする場合
日本語を含むパスなどを入力すると文字化けすることがあるが、
`Microsoft.PowerShell_profile.ps1`の文字コードをBOMつきのUTF-8で保存すると解消される。


## 参考
- [PowerShellで独自のエイリアスやショートカットを設定したい](https://qiita.com/bonny_d/items/a2f3a3ac59304609e42a)
パスパラメータ、クエリパラメータ、リクエストボディ　違いとは？

##パスパラメータ（Pathparameter）,クエリパラメータ(queryparameter)
URIで送るものがパスパラメータとクエリパラメータです。

```
https://example.com/pathparameter/{pathparameter}?queryparameter1=hogehoge&queryparameter2=fugafuga
```

例を見て説明すると
>URIでドメインの後、？の前に来るものがパスパラメータ。

> ?の後に来るのがクエリパラメータ。


##リクエストボディ(requestBody)
URIではなく、JSONで送るものです。

```
{
  hoge_name: fugafuga,
  description: hogefugahoge,
}
```
【Windows】ウィンドウの切り替え【開きすぎる人は便利ｂ】

>［Alt］＋［Tab］キーを押すと、開いているウィンドウのイメージが表示されます。 



［Alt］キーを押したまま、［Tab］キーを繰り返し押すと、順に選択できます

![alt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/2ea27e28-b758-0618-526a-62a0aea29a56.png)



P.S　最近Vtuberにハマりました
reCAPTCHA v3 設置方法

#クライアントサイドの設定
headタグ内にAPI実行スクリプト記載
"recap"の部分はフォームのIDを設定する

	<script src="https://www.google.com/recaptcha/api.js"></script>
	<script>
	   function onSubmit(token) {
		 document.getElementById("recap").submit(); //フォームID設定
	   }
	</script>

フォームタグに関連付け

```
<form action="index.php" method="post" class="contact_form" id="recap">
```

送信ボタンの設定

```
<button class="g-recaptcha" data-sitekey="サイトキー" data-callback="onSubmit" data-action="submit">送信</button>
```					

#サーバーサイドの設定
PHPにデータ受け取りと条件判定のプロセスを実行
$secret_key 変数にシークレットキーが入る

```
$recap_response = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='. $secret_key .'&response=' . $_POST['g-recaptcha-response']);
$recap_response = json_decode($recap_response); // JSON形式をPHPオブジェクトにデコード
		 // successプロパティ（trueかfalseか）で判定
    if ($recap_response->success == true) {
		    // 合格の場合の処理
		} else {
		    // 不合格の場合の処理
		    echo "Error: BOT送信の可能性があります。再度入力してください";
                    die;
    }
```
rbenvユーザーのためのtfenvの使い方

# はじめに
最近、Terraform に入門して 「コードでインフラを管理できるの！？すごっ！」 となった[日野](https://twitter.com/_kt15_)です。業務では Rails と Vue.js を触ることが多く、 Ruby のバージョン管理には rbenv を使用しています。

# なぜ rbenv と tfenv？
なぜこの組み合わせ？と思った方もいると思います。

>Terraform version manager inspired by rbenv

これは tfenv の [README](https://github.com/tfutils/tfenv#tfenv) からの引用ですが、ここからも分かる通り、 tfenv は rbenv からインスパイアされて作られたようです。なので、できることは rbenv と似ているのですが、下記の違いから混乱することがよくありました。

- インターフェースがけっこう違う
- 似たようなコマンドはあるが、挙動が微妙に違う

そのため、本記事では rbenv でよく使うコマンドに対応した tfenv のコマンドをまとめてみました。「rbenv を使ったことがあるかつ、これから tfenv の使い方を学びたい」という方の役に立てれば幸いです。（筆者は tfenv を使い始めてまだ日が浅いので間違った理解をしているかもしれません。その場合はコメント等で教えていただけると助かります🙏）

# tfenv とは
tfenv を知らない方もいるかもしれないので、さらっとだけ説明を・・
tfenv は [Terraform](https://www.terraform.io/) のバージョンを管理するツールで、よくある *env の Terraform 版です。
tfenv を使用することで、プロジェクト内で使用する Terraform のバージョンを固定することができます。

https://github.com/tfutils/tfenv

# よく使うコマンド
ここから rbenv でよく使ってるコマンドをベースに見ていきます。

## *envでインストール可能なバージョンのリストを取得する

### rbenv install --list-all
基本的にはこれで取得できます。ただ、rbenv の場合、比較的新しいバージョンをインストールしようとすると、該当のバージョンが表示されない・・ということがよくあり、筆者の場合は`brew upgrade ruby-build`を実行することでリストを更新しています。

### tfenv list-remote
tfenv の場合は自動でリストを更新してくれるので、別途コマンドを実行する必要がないです。
実行するコマンドが少ないのは良いですね・・！

## プロジェクトで使用するバージョンを固定する

### rbenv local <設定したいバージョン>

実行すると`.ruby-version`が作成され、このファイルを元に自動で Ruby のバージョンが切り替わります。

### tfenv use <設定したいバージョン> と .terraform-version を手動で修正

`tfenv use <設定したいバージョン>`を実行しても、 `.terraform-version`には反映されないため、手動で修正する必要があります。

正直 tfenv use を実行する理由がよく分かってないのですが、以前 tfenv use をやらずに作業していたらエラーになったような記憶（うる覚え）があるので、一応実行するようにしています。（この辺り詳しい方がいれば教えていただけると助かります🙏）

## *-version に記載されているバージョンがインストールされていなかった時の挙動
### rbenv の場合
rbenv の場合、`rbenv versions`を実行することで、既にインストールされているバージョンのリストを取得できます。今回は下記の状態になっているとします。

```
$ rbenv versions
  system
  2.7.4
* 2.7.5 (set by ...)
  3.1.0-preview1
```

次に、`.ruby-version`にインストールされていないバージョンを設定します。

```diff:.ruby-version
- 2.7.5
+ 2.7.2 
```

この状態で ruby のコマンドを実行してみます。

```terminal
$ ruby -v
rbenv: version `2.7.2' is not installed (set by ...)
```

すると、設定したバージョンはまだインストールされていないためエラーが表示されます。つまり、rbenv の場合は事前に変更後のバージョンをインストールしておく必要があります。

### tfenv の場合

tfenv の場合は、`tfenv list`を実行することで、既にインストールされているバージョンのリストを取得できます。今回は下記の状態になっているとします。

```terminal
$ tfenv list
  1.1.1
  1.1.0
* 1.0.11 (set by ...)
  1.0.10
```

同様に`.terraform-version`にインストールされていないバージョンを設定します。

```diff:.terraform-version`
- 1.0.11
+ 1.0.9
```

この状態で terraform のコマンドを実行してみます。

```terminal
$ terraform version
version '1.0.9' is not installed (set by ...). Installing now as TFENV_AUTO_INSTALL==true
Installing Terraform v1.0.9
...
```

なんと、tfenv の場合は自動でインストールしてくれるので、事前にインストールしておく必要がありません。試しに `tfenv list`を実行してみます。

```terminal
$ tfenv list
  1.1.1
  1.1.0
  1.0.11
  1.0.10
* 1.0.9 (set by ...)
```

ちゃんとインストールされて、バージョンも切り替わっているようです。この挙動を始めて知った時は感動しました・・チームで開発するときは `.terraform-version` をコミットに含めると思うのですが、誰かが Terraform のバージョンを変えても、他の人は自動でバージョンが切り替わってくれるので楽ですよね・・！

# 終わりに
今回は rbenv でよく使うコマンドに対応した tfenv のコマンドをまとめました。自分は今のところ今回紹介したコマンドで事足りているのですが、他にも便利なコマンドをご存知の方がいればコメントで教えていただけると嬉しいです！

# 参考
- https://github.com/tfutils/tfenv
- https://www.terraform.io/
今、僕が新しい TypeScript プロジェクトを立ち上げるならこんな環境構築をします


[タイムリープ TypeScript ~ TypeScript を始めたてのあの頃に知っておきたかったこと ~](https://qiita.com/advent-calendar/2021/timeleap-typescript)
アドベントカレンダーの 19 日目の記事です

TypeScript に限らずですが、新しいものを導入する時に一番大変なのは何でしょうか？
僕は**"環境構築"**ではないかと思います。

特に Web 業界は自由な JavaScript のおかげか検索すると多くの情報が出てきて
何が正しいのかよくわからず、ESLint や Webpack の設定を意識せずスタートし、
後で見返すと頭が痛くなる瞬間を経験したことがある人も多いかと思います。

そこで、**今、僕が新しい TypeScript プロジェクトを立ち上げるならこんな環境構築をします**と言う話をします

## 前提

- Node.js が導入されている

Node.js の導入はそこまで難しくないので、導入済みであるとします。
Docker ではなく、ローカルに NVM などバージョン管理ツールを用いてインストールすることをお勧めします

## Nx を導入しプロジェクトを作る

React が使いたければ、Next.js や Gatsby、Node サーバーであれば Nest.js など
フレームワークやライブラリを導入したくなるかと思いますが、
公式 HP で入れることを踏みとどまり、大規模プロジェクトになった場合を想定しておきます。

多くのプロジェクトは真剣に作り出すとどんどん規模が大きくなってきます。
ユーザー側と管理画面側で linter の設定が違う、ライブラリのバージョンが違う
となってくると、継続的にコストがかかり続けます。

おすすめは Nx によるモノレポ構成です

:::info
モノレポとは？
複数のプロジェクトを一つのリポジトリで管理する構成です。
:::

### おすすめ理由

- TypeScript は標準サポート
  - Next.js でも Nest.js でも Gatsby でも Angular でも自由に作成可能
- ESLint や Prettier なども標準サポート
- Webpack の設定なども標準サポート
- Cypress や Jest なども TypeScript で書ける
- 大規模になった時にプロジェクトを同じリポジトリで分割し、Linter やライブラリのバージョンは同じものが使える

### 構築手順

npx コマンドを通して作ることができます。

試しに、Next.js × TypeScript の環境を作ってみようと思います
スケールした時のことも考慮し、ユーザーと管理画面両方のアプリケーションを作ることとします

1. 空の Nx プロジェクトを作成します

```bash
npx create-nx-workspace sample --preset=empty
```

2. Next.js の cli を追加

```bash
yarn add @nrwl/next
```

3. Next.js の user 用アプリケーション作成

```bash
yarn nx g @nrwl/next:app user
```

これだけで TypeScript サポートされた Next.js 環境が出来上がります

```
apps/
 └ user/ ← Next.js × TypeScript
libs/
```

アプリケーションがスケールし、管理画面も必要になった時は

4. Next.js の admin 用アプリケーション作成

```bash
yarn nx g @nrwl/next:app admin
```

```
apps/
 └ user/ ← Next.js × TypeScript
 └ admin/ ← Next.js × TypeScript
libs/
```

user と admin で共通のコンポーネントが欲しくなった時は

5. React の shared-components ライブラリを作成

```bash
yarn nx g @nrwl/react:lib shared-components
```

```
apps/
 └ user/ ← Next.js × TypeScript
 └ admin/ ← Next.js × TypeScript
libs/
 └ shared-components ← React × TypeScript
```

といった形にコマンド一つでどんどんアプリケーションをスケールさせていくことができ、
package.json や eslint、jest の設定などは一つにまとめていくことができるため、
管理しやすい ts 環境を作っていくことができます

## まとめ

**今、僕が新しい TypeScript プロジェクトを立ち上げるならこんな環境構築をします**

ということで

Nx というビルドシステムを導入することで、TypeScript 環境を構築すると
ゆくゆく救われるよと言う話をしました。

現状、Vue.js はサポートされてないですが、React や Nest などの環境を作るのであれば
問題なく開発をスタートしていけると思います。
難点はバージョン追従が Nx に依存してしまうことですが、
新しいバージョンが出てから一ヶ月以内ぐらいには追従されていくので、多くの場合では問題なく運用していけるかと思います。
Jupyter notebookでセルの出力をスクロール表示してみる

# はじめに
こちらの記事の応用となります。 [Jupyter notebookでセルの出力を制御する](https://qiita.com/tavi_ai/items/8aace6061695ad4cba22)

ディープラーニングの学習はEPOCHとBATCHの２重ループで行うことが多いので、延々とログ表示が流れていきます。少し見辛いので学習中のログ表示を工夫してみました。

# ログをスクロール表示
EPOCHの進み具合をプログレスバーで、BATCHのログを一定行数のスクロールで表示してみました。
![imageonline-gifspeed-2461737.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037574/421d5159-2bc2-18ca-a0ca-05e122606de5.gif)

```
from IPython.display import display
LOG_LINE_NUM = 10　　　　# ログ出力行数の指定
line_list = []
dh = []

def log_print(line):
  global line_list
  if len(line_list) < LOG_LINE_NUM:
    line_list.append(line)
    dh.append(display(line, display_id=True))
  else:
    line_list = line_list[1:]
    line_list.append(line)
  
  for i, str in enumerate(line_list):
    dh[i].update(str)
```
この関数を指定して、ログ出力のprint文をlog_print()に変更します。

# まとめ
スッキリしました。
（追記。パフォーマンスに問題がありました。。。（涙））