OmniAICreator/Qiita-1.07M huggingface dataset:
apache で 403 できたリクエストを404 に返す方法

アクセスして欲しくないディレクトリやファイルは403 forbidden を返すという設定をすることはよくあると思います。ですが、403 forbidden だとディレクトリもしくはファイルがあることがばれてしまうので、404 not found を返したいと思うこともあるのではないでしょうか。

そんな方のために、以下を紹介します！

# 前提条件

 - apache がインストールされていること
 (バージョンは何でも大丈夫です)


 # 事前準備

 今回は403 環境を作成するために、DocumentRoot に.htaccess で拒否して、再現したいと思います。

```
 Docuemnt Root:
 /var/www/html 
 ```

先ずはDocument Root に移動して、.htaccess を作成します。
今回は全てのリクエストを拒否したいので、htaccess でその設定を入れてあげます。
 ```
 # DocumentRoot に移動
cd /var/www/html

# htaccess 作成
touch .htaccess

記述内容:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Order deny,allow
deny from all
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 ```
この設定だけでは、.htaccess が効かないので、httpd.conf で設定の上書きを可能にする必要があります。

```
# Further relax access to the default document root:
<Directory "/var/www/html">

    Options Indexes FollowSymLinks
    AllowOverride All   <= この部分を All にしてください(None はダメ)

    Require all granted
</Directory>

#syntax 確認
httpd -t
Syntax Ok 

# リスタート
systemctl restart httpd
```

上記のように設定します。そうするとdeny from all ですべてのIP からのリクエストが拒否されるという設定になります。拒否されているのをcurl もしくはブラウザで確認できれば、オッケです。

これで準備ができました。

# 403 => 404 のための設定

設定は至極単純です。403 => 404 にリダイレクトするように設定してあげればそれで解決です。httpd.conf をもう一度開けます。
以下の設定を追加してください。

この設定の意味は、403 がきたら、missing.html を返してください。missing.html に対して、アクセスが来たら、404 を返してください。という内容です。

```
ErrorDocument 403 /missing.html

<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteRule missing.html - [R=404,L]
</IfModule>
```

実際にこの設定をして、apache を再起動してあげると、あら不思議、404 not found が表示されるではないか！！！

# まとめ
案外簡単なので、404 に表示を変えたい方は、是非ともしてほしい設定です。virtual host でも同様の設定をすると、404 の表示が実現できます。
VS Codeでdetached HEAD状態の把握方法

## はじめに
こちらの記事を書きながら、

https://qiita.com/satokawa_san/items/ed46b1db1bc125801854

勉強していた時、思いました。
VS Codeでもコマンド操作でも、detached HEADになるときは警告を出してくれますが、慣れていない初心者はよくメッセージを読まずにスルーして、おかしくなってパニックになりそう。
そこで思いました。今detached HEAD状態か、VS Codeではどこかに表示されていたりしないんでしょうか。簡単にわかる方法はないんでしょうか。

## ターミナルでコマンドを叩く
ターミナルからgit branchを実行すれば(HEAD detached at ほにゃらら)と表示されるのでわかります。これが普通のやり方かな、と思います。

```
$ git branch
* (HEAD detached at 08afec7)
  main
```

## 左下のブランチ表示

VS Codeの左下の、ここに現在のブランチが表示されます。
これがdetached HEADのとき。コミットIDになってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/f9eac4e0-d9a9-3af3-f83d-fdeb784c1c01.png)

これが通常で、ブランチ名が表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/d7602d8c-ccd3-8726-57af-627efdbc9a4b.png)

しかし正直小さくてわかりにくいかも。

## コミットメッセージ入力欄

ここ、未入力状態だと、ひそかにどこにコミットしようとしているかが表示されています。
これがdetached HEAD状態のときです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/6036bc47-8f20-3ae4-3cb3-f770ef149bfc.png)

これが通常の状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/7e11121c-1cb4-5bcf-58c6-ff04bcb8b2ae.png)

でもこれも気付きにくいかも。

## Git Graphのブランチ名のフォント
拡張機能Git Graphを入れている場合です。（記事執筆時v1.30.0）
detached HEADの場合、Git Graphでブランチ名が太字ではなく、細字で表示されます。

これは、ブランチでなく最新のコミットにチェックアウトしたときの画面。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/1e364ca8-dac0-435a-dc1f-38956ec6574c.png)

こちらがブランチにチェックアウトしたとき。「main」の、微妙な違いが、わかりますでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/a0e46921-3f2b-0104-567a-9cea7f0aa1aa.png)

## GitLensのコミットグラフ（有料）
拡張機能GitLendsにもコミットグラフを表示する機能があります。有料ですけど、3日間だけおためしで見られるのでdetached HEAD状態を見てみたら、めちゃくちゃわかりやすかったです。（記事執筆時v14.9.0）

これが通常。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/b4b2d39c-6142-81b2-1a64-932b9356a5ec.png)

これが、second commitにチェックアウトした、detached HEADの状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/a8618ec3-f79a-dd1a-b2f6-695165acb3e4.png)

通常はブランチ名しか表示されないのに、detached HEAD状態だと「HEAD」がブランチのところにぽこっと表示されて、明らかになにか違います。

さきほどGit Graphでやってみたのと同じように、最新のコミットにチェックアウトしてみると、こうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/d2772832-472c-2949-0e4d-bac9cf0ac220.png)

「+1」のところにhoverすると、このように。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736931/60c3570a-214f-f736-fc10-29f685198007.png)

## おわりに
GitLensのコミットグラフ、わかりやすい！って思いました。さすが有料機能。


## 参考

https://qiita.com/Kuniwak/items/4e5d55d6888e5f6411fe

https://github.com/mhutchie/vscode-git-graph/issues/600
コードカバレッジの確認方法

Xcodeでのコードカバレッジ(Code Coverage)の表示箇所がいつからか変わっていて分からなかったのですが、たまたま見つけたので、備忘録として残しておきます。
コードカバレッジの見方や活用方法は割愛させていただきます。

テスト実行時しか`Coverage`欄は表示されないようになっています。

![スクリーンショット 2024-04-11 21.14.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409860/f1a7892b-7fca-4aba-0160-693f5e4e7a91.png)
【Rails】スキーマ情報が一目でわかるannotate_models

## はじめに

ファットコントローラーよりファットモデルの方が良い、という教えを守った結果、テーブル情報の確認しづらさを感じ調べてみました。

前回の記事でもアノテーションというものを取り上げた気がしているため、もう注釈おじさんと呼んでください🙇

:::note warn
ご覧いただきありがとうございます!
この記事の投稿者は主にRuby on Railsを学習している初学者です。
理解不足な点や内容に誤りがございましたらご指摘いただけますと幸いです。
:::

## 問題
テーブル・ルーティングの情報をできたら一目で確認したい。
ファイルを開いたときに毎回下までスクロールしないと全容がわからない・・・

## 解決方法
gemがありました🥹

https://github.com/ctran/annotate_models

Gemfileの`development`グループへ

```ruby:Gemfile
gem 'annotate'
```
```
bundle install
```
ここからは固有のコマンドです.
実行すると`lib/tasks/auto_annotate_models.rake`が作成されて、以降はマイグレーション実行時に自動で記述してもらえます！
```
bin/rails g annotate:install
```
テーブルの情報を表示します。
```
bundle exec annotate --models
```
すると、こちらの例のように記述されます💡
```ruby:user.rb
# == Schema Information
#
# Table name: users
#
#  id               :bigint           not null, primary key
#  crypted_password :string
#  email            :string(255)      not null
#  nickname         :string(20)       not null
#  salt             :string
#  created_at       :datetime         not null
#  updated_at       :datetime         not null
#
# Indexes
#
#  index_users_on_email     (email) UNIQUE
#  index_users_on_nickname  (nickname) UNIQUE
#
class User < ApplicationRecord
  authenticates_with_sorcery!
  ##　以下略です　##
```


## 終わりに
ちなみにこちらのgemはテーブルの情報だけでなく`routes`や`factory`の情報もファイルに表示させることができるんです。
興味のある方はGitHubのREADMEをご一読ください✨

応用編の表示はこれのおかげだったのかと今更気づきました😅

個人で使っていて便利なのですが、チーム開発される場合にはよりメリットが大きいのかなと思います💡

最後までお読みいただき、ありがとうございました🙇
## 参考

https://github.com/ctran/annotate_models

https://www.mof-mof.co.jp/tech-blog/rails-annotate
ac-libraryを用いたc++ファイルをコンパイル時に怒られるさいの対処法 atcoder/string.hpp: No such file or directoryなど

## Macの場合
https://qiita.com/yukishiba/items/032873de9398cb67c88f

こちらの記事を参照したところ.zshrcにac-libaryのパスを渡してあげるといいらしいが.zshrcの場所がわからなかった。

そこ下の記事を参考にして.zshrcはホームディレクトリに存在し
```
nano ~/.zshrc
```
で編集できるらしい。エディタの操作方法や新しく.zshrcを作成する場合も下の記事を参照

https://iboysoft.com/jp/howto/how-to-create-zshrc-file-in-mac.html#:~:text=.zshrcファイルは、Z%2D,設定を使用します%E3%80%82
```
export CPLUS_INCLUDE_PATH=(aclibaryのある場所)
```
こちらの文を.zshrcに追加

注意点としてはatcoderフォルダではなくac-laibary-masterフォルダの場所を指定しなければいけないらしい

自分はvscodeを使っているので再起動したあとに正しくコンパイルすることができた。

## Windowsの場合
windowsの場合新しくCPULUS_INCLUDE_PATHという環境変数を作成しその中身にac-libary-masterのパスを入れてあげれば良い

普段Macあまり使わないので勉強になりました。
[Android] BottomNavigationViewをスクロール時に隠す

![](https://velog.velcdn.com/images/rmsxo5678/post/de7304fe-26e4-410e-8206-9e2a671b16b5/image.gif)


# *layout_behavior*
画面をスクロールするとBottomNavigationViewを消して現れることの実装が必要だったが、検索してみるとxml上でも簡単にできると言っているので

```xml
 <com.google.android.material.bottomnavigation.BottomNavigationView
   android:id="@+id/navigation_main"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_gravity="bottom"
   app:menu="@menu/navigation_main_menu"
   app:layout_behavior="com.google.android.material.behavior.HideBottomViewOnScrollBehavior"/>

  ``` 
  このコードで  ```app:layout_behavior="com.google.android.material.behavior.HideBottomViewOnScrollBehavior"``` 
  を入れればいいと言っていたので、書いたが、スクロールしても消えなかった。
  
  上位レイアウトも ```CoordinatorLayout```をしたが、消えなかったので、検索して原因を探してみたが、それでもわからなかったので、別の方法で動的に実装することを知り、その方法でBottomNavigationViewがスクロールすると消えるようになった。 <br/>

## 実装 
HomeFragment.kt



  ```kotlin
 var down = false
 var height:Float? = null
 val bottomNavView: BottomNavigationView = requireActivity().findViewById(R.id.bottomNavigation)
 
 binding.RecyclerViewId.setOnScrollChangeListener { _, _, scY, _, odscY ->
 
     if (height == null) {
         height = bottomNavView.height.toFloat()
     }
     if (scY > odscY) {
         if (down) {
            down = false
            bottomNavView.clearAnimation()
            bottomNavView.animate().translationY(height!!).duration = 200
         }
     } else {
         if (!down) {
             down = true
             bottomNavView.clearAnimation()
             bottomNavView.animate().translationY(0f).duration = 200
        }
     }
     
}           
  ``` 

いろいろと参考にしてみてスクロール上下時の位置値とBooleanで上にするか下にするかスクロール時に高さ値を与えて、そのBottomNavigationViewがスクロール時に消えて現れるようになった。


</br>
</br>

---

GitHub : https://github.com/GEUN-TAE-KIM/BottomNavigation_disappearOnScroll_Sample.git

</br>

参考
https://stackoverflow.com/questions/44777869/hide-show-bottomnavigationview-on-scroll
20240410 nushell始めた

### nushellに乗り換えてみよう
cmd.exeは論外だし、Powershellは強力だけど癖強くて使いにくいし遅いし、なんかないの！っておもったらRush製のnushellというのを見つけた

#### 始めてみよう
```
> scoop install nu
> nu
```

で始められる
wingetやchocoと違って`nushell`ではなく`nu`でインストール

#### 設定ファイルの場所
scoopでいれると、`$env.SCOOP\apps\nushell\`の下に
* env.nu
* config.nu
の二つできる
env.nuは環境変数、config.nuは設定ファイル、だそうだ

#### ちょっとつかう
いろいろわからないけど、覚えたこと

* 環境変数を見るには`$env`でずらっとでてくる
* 環境変数の設定は `$env.NANIKANO_ENV_VAR = "NANIKANO ATAI"`とする
* `$nu`でnushellの設定一覧が出てくる
* 環境変数を文字列に含めるときは`$"($env.NANIKANO_PATH)/xyz"`とちょっと面倒

これだけ覚えておけばまあなんとかなるんじゃないか

#### zoxide使いたい
もうこれのない生活は考えられません（あとfzfとrgと）

env.nuとconfig.nuの最後に次の行を追加すると使えるようになる
```nu:env.nu
zoxide init nushell | save -f $"($nu.default-config-dir)/.zoxide.nu"
```
```nu:config.nu
source $"($nu.default-config-dir)/.zoxide.nu"
```

参考： [ajeetdsouza/zoxide: A smarter cd command. Supports all major shells.](https://github.com/ajeetdsouza/zoxide?tab=readme-ov-file#installation)

Powershellで使っていたzoxideの履歴は%LOCALAPPDATA%/zoxideの下にあるからそれを共有したいんだけど、どうやるんだ？
＿ZO_DATA_DIRにも設定しているけど読みに行ってないらしい

#### starshipでgit status
未着手

#### 環境変数ちょっと変更
初期設定では、`C:`が`$HOMEDRIVE`だけど、Cドライブは128GBしかないのでできれば余計なものは置きたくない
C:ではなくD:をHOME_DRIVEにしたいので、環境変数をいじってみる

で、env.nuに以下の二つを追加したけど変化ない
なんなんだろー
```nu:env.nu
# custom env
$env.HOMEDRIVE = "D:"
$env.USERPROFILE = "D:\\Users\\(名前)"
```

#### xonshというのも気になる
参考サイト
* [【Xonsh】Python製シェルが尖りまくってて神 #Python - Qiita](https://qiita.com/akoji/items/4935480f9c53c980ffe0)
* [Python製シェルxonshを半年使った所感や環境設定のまとめ - Stimulator](https://vaaaaaanquish.hatenablog.com/entry/2018/06/22/194227)
#AWS アラーム通知実装パターンについて

# AWSアラーム実装パターンについて：
AWS環境内に各種リソースを監視するためにアラームを実装する必要があります。

監視リソース種類に応じてアラームの実装パターンもいくつか存在していて、リソース種類は大きく以下のように分類できるかと思います。
　A. メトリクス系（CPU使用率、メモリ使用率、コンテナ台数など）
　B. ログ系（エラーログ、ヘルスチェックログなど）

下図のように実際AWSコンソールも非常にわかりやすく、それぞれのグループに分けられています。
<img width="200" alt="スクリーンショット 2024-04-09 17.09.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488023/5cf049fe-a55d-94c1-ce40-f067b9d10bed.png">

メトリクス系は基本CPUやメモリなど使用率が想定値より超えたことを通知するだけなので、煩雑な設定をしないでCloudWatch Alarmをそのまま使用したほうが便利です。

ログ系は対象フレーム（キーワード）が検知された場合、アラームを発信する想定なもので、CloudWatch Alarmを使用する場合、アラーム状態になったことだけが通知されるため、実際どんなエラーが発生したかのエラー内容も合わせて通知してほしい場面が非常に多く、その場合はCloudWatch AlarmではなくCloudWatch Logs Subscription Filterをトリガーとしてアラーム通知用Lambdaを作成して、そのLambdaにログ転送も合わせて実装する必要があります。

# CloudWatch AlarmとCloudWatch Logs Subscription Filterとの比較：
### CloudWatch Alarmでのアラーム通知のメリットとデメリット:
CloudWatch Alarmを使用すると、特定のメトリクスが特定の閾値を超えたときに通知を受け取ることができます。
#### メリット
● 設定がシンプル： CloudWatch AlarmはAWS Management ConsoleまたはAPIを使用して簡単に設定できます

● リアルタイム通知： アラームはリアルタイムで発生したメトリクスに基づいてトリガーされます。したがって、システムの問題や障害を素早く把握できます。

● 柔軟: アラームがトリガーされた際に、様々なアクションを実行できます。たとえば、SNSトピックに通知を送信したり、Auto Scalingをトリガーしたりすることができます。

#### デメリット
● アラートの精度: アラームのしきい値を適切に設定することが重要です。間違った設定では、誤検知や不足検知が発生する可能性があります。

● リアルタイムのみ: CloudWatchアラームはリアルタイムでの通知に特化しています。つまり、過去のデータを考慮してアラートをトリガーすることはできません。

### CloudWatch Logs Subscription Filterを使用したLambdaでのアラーム通知のメリットとデメリット:
Logsのサブスクリプションフィルターを使用すると、Lambda関数のログイベントをリアルタイムで監視し、特定の条件に一致するログイベントを処理できます。

#### メリット
● 詳細なログ: Lambda関数が記録したログを利用してエラーを検知するため、詳細ログを得ることができます。これにより、問題の特定とデバッグが容易になります。

● 過去のデータを考慮: CloudWatch　Logs　Subscription Filterは過去のログイベントにも適用されるため、リアルタイムでないエラー検知も可能です。過去のログを分析してパターンを特定できます。

#### デメリット
● セットアップが複雑：　CloudWatch　Logs　Subscription Filterを設定するには、Lambda関数を作成してログを解析し、適切な条件でアラームをトリガーする必要があります。

● 遅延の可能性: Lambda関数がログを解析してエラーを検知するため、リアルタイムの通知よりも遅延が発生する可能性があります。したがって、リアルタイムのアラートが必要な場合は、CloudWatchアラームの使用を検討することが重要です。

# 最後に:
CloudWatch AlarmとCloudWatch Logs Subscription Filterを使用したLambdaでのアラーム通知にはそれぞれメリットとデメリットがあります。通知のリアルタイム性、精度、ログの詳細性などを考慮し、アプリケーションの要件や運用上の考慮事項に応じて、適切なパターンを選択することが重要です。本記事はお役に立ていれば幸いです。
【React】ボタンをクリックした際に親のform要素を取得する方法

以下のように`ev.currentTarget.form`とすると親のform要素を取得できます。

```jsx
export function App() {
  const handleClick = (ev) => {
    console.log(ev.currentTarget.form);  // <form ></form>
    ev.currentTarget.form?.requestSubmit();
  };

  return (
    <form>
      <input type='email' name='email' />
      <button type='button' onClick={handleClick}>
        送信
      </button>
    </form>
  );
}

```
JVM - PCレジスタ

Java Virtual Machine (JVM) の Runtime Data Area 構成要素の一つに「PCレジスタ」があります。（[JVM - 全体構造](https://qiita.com/fastso/items/9bc3f4d861f729b4e54f)をご参考ください。）

![jvm_runtime_data_area.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/6fa83edc-fcd7-7d9c-e716-6b5f1d3b4d44.png)

## JVM仕様のPCレジスタ定義

[The Java Virtual Machine Specification (Java SE 8 Edition)](https://docs.oracle.com/javase/specs/jvms/se8/html/index.html)は次のようにPCレジスタを定義しています。

JVMは、一度に多くのスレッドを実行することができます。JVMの各スレッドは、独自のPCレジスタを持ちます。どの時点でも、各JVMスレッドは、単一のメソッドのコード、すなわち、そのスレッドの現在のメソッドを実行しています。そのメソッドがネイティブでない場合、PCレジスタには現在実行中のJVM命令のアドレスが格納されます。スレッドによって現在実行されているメソッドがネイティブである場合、JVMのPCレジスタの値はundefinedとなります。JVMのPCレジスタは、特定のプラットフォームでreturnAddressまたはネイティブ・ポインタを保持するのに十分な幅があります。

>The Java Virtual Machine can support many threads of execution at once (JLS §17). Each Java Virtual Machine thread has its own pc (program counter) register. At any point, each Java Virtual Machine thread is executing the code of a single method, namely the current method (§2.6) for that thread. If that method is not native, the pc register contains the address of the Java Virtual Machine instruction currently being executed. If the method currently being executed by the thread is native, the value of the Java Virtual Machine's pc register is undefined. The Java Virtual Machine's pc register is wide enough to hold a returnAddress or a native pointer on the specific platform.

## PCレジスタとは

PCレジスタは、現在実行中のJVM命令のアドレスを保持するJVMのコンポーネントです。

PCレジスタは、Javaのマルチスレッド環境において非常に重要な役割を果たします。各スレッドには独自のPCレジスタがあり、それぞれが現在実行中のバイトコード命令の位置を追跡します。これにより、スレッドは独立して実行を進めることができ、コンテキストスイッチが発生しても、正確に前回の実行ポイントに戻ることが可能になります。

**PCレジスタには、GCも、OOMもありません。**

## PCレジスタの働き

JVMがJavaプログラムを実行する際、PCレジスタは次に実行すべきJavaバイトコードの正確な位置を指し示します。

プログラムが命令を実行すると、PCレジスタは次の命令の場所に更新されます。もし現在実行中の命令がメソッド呼び出しなら、そのメソッドの最初の命令を指すようにPCレジスタは更新されます。そして、メソッドが終了すると、PCレジスタは呼び出し元の次の命令に戻ります。

## PCレジスタの重要性

PCレジスタはJVMの実行エンジンにおける基本的な要素であり、プログラムの正確なフローと制御構造を維持するのに不可欠です。また、例外発生時には、PCレジスタが示す位置から例外ハンドラの場所にジャンプすることで、適切な例外処理が可能になります。

PCレジスタはプログラムの正確な実行とエラーハンドリングの両方において中心的な役割を果たします。

## 最後に

PCレジスタは、JVMがJavaプログラムを効率的に、かつ正確に実行するために欠かせないコンポーネントです。マルチスレッド環境におけるその役割は特に重要であり、各スレッドが独立して作業を進められる基盤を提供します。開発者としては、PCレジスタを直接操作することはありませんが、JavaプログラミングとJVMの動作原理を深く理解する上で、その働きを知っておくことは非常に有益です。

## 参考情報

* [The Java Virtual Machine Specification (Java SE 8 Edition)](https://docs.oracle.com/javase/specs/jvms/se8/html/index.html)
Windows10にDocker Desktopをインストールする

### 開発環境
- Windows10 Pro(64bit)
- WSL 2

1.[公式サイト](https://www.docker.com/ja-jp/products/docker-desktop/)へアクセス

2.右上の**今すぐ始める**ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/ea2956cd-9c70-f743-9539-449d1178136b.png)

3.**Dockerのインストール方法を学ぶ**ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/2f76daf3-f1b3-7afd-aeaa-64d55f671162.png)

4.左サイドバーの**Install Docker Desktop - Install On Windows**をクリックし、**Docker Desktop for Windows**ボタンをクリックすると、インストーラのダウンロードが始まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/1e5a1beb-5308-5577-9465-3328b41e4a9a.png)

5.ダウンロードしたインストーラを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/7c3e32b2-3549-2d5f-dc09-bd59a72c2118.png)

6.そのままの状態でOKボタンをクリックすると、インストール開始
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/34d8c67f-ba3d-b77e-2c82-d4c4f242a83b.png)

7.終了したらCloseボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/28f6a0e0-6142-3934-3668-7db20a04a307.png)

8.Docker Desktopを初回に起動したら、以下の画面が出てくるので、**Accept**ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/b79a8d39-0e42-c10e-ebd4-3012cff915f1.png)

9.Skip serveyをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/8b17447a-3dd1-030a-6058-70b848b39009.png)

:::note info
起動時に、Starting中のまま、勝手にシャットダウンしても、もう一度起動すると、そこからはうまく起動しました。また、その際に、**Docker Desktop - Ubutu WSL integration with distro 'Ubuntu' unexpectedly stopped. Do you want to restart it?**　というメッセージが出ても、**Skip Ubuntu WSL distro** を押して、無視しました。
:::


10.起動完了後に、welcome-to-dockerイメージをPullして、起動し、localhost:8080へアクセスする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/d78d4490-3d74-8a1d-c753-320d9bfaad4f.png)

11.以下のような画面が出たら成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/18fdbf63-4ce1-98e0-0fb2-3fdba9c66b5e.png)

:::note info
Docker Desktopを停止させても、コマンドプロンプト上で、Dockerを使用することはできます。(**バージョン情報は表示できますが、イメージをPullしたり、コンテナを起動するなどの基本的な機能は、Docker Desktopを起動しないといけません**)以下、Dockerのバージョンをチェック。
:::
```powershell
docker -v
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/3b4ddf02-67cd-047b-e7bf-e4a2ccba5e90.png)


### 参考リンク
- [WSLには3つの「バージョン」がある](https://qiita.com/omu_kato/items/f9a6b5a02e25f5f2a487)
JMeterのタイマーの配置場所には気を付ける

## この記事について

JMeterのタイマーの配置場所が原因で詰まった箇所があった為、その備忘録です。

## 起きた現象

- JMeterによる負荷試験をした際に、想定の半分～三割程度のリクエスト数しか出せない状態となってしまっていた
- ヒープメモリの指定、CPU使用率、ファイルディスクリプタ上限やプロセス数も確認したが、特に問題ない状態

## 原因

- JMeterのタイマーの追加場所が正しくなかった

> Note that timers are processed before each sampler in the scope in which they are found; if there are several timers in the same scope, all the timers will be processed before each sampler.
Timers are only processed in conjunction with a sampler. A timer which is not in the same scope as a sampler will not be processed at all.
To apply a timer to a single sampler, add the timer as a child element of the sampler. The timer will be applied before the sampler is executed. To apply a timer after a sampler, either add it to the next sampler, or add it as the child of a Flow Control Action Sampler.

複数のタイマーが同一スコープ内に存在する場合、全てのタイマーが各サンプラーの前に処理されるとの事でした。

参考：[jmeter.apache.org - 18.6 Timers](https://jmeter.apache.org/usermanual/component_reference.html#timers)

## 結果として

- 本来、サンプラーの子要素としてタイマーを追加すべき所を、サンプラーと並列で複数のタイマーを追加してしまっていた事が問題となっていた
- 結果として、各サンプラーでタイマーが実行される事となり、想定以下のリクエスト数となっていた
AtCoderで青色になって落ち着いたから書いた記事

## はじめに
青色になれました。やったね！
そして、すぐ水に戻って、また青になって、…を繰り返していましたが、直近は水に戻らなくなったので、満を持してこの記事を書いています。
今更過ぎ？知らないよそんなこと。僕が書きたくなったから書くんだよ。

では、見ていきましょう。

## 入青時
入青したのは2023年10月21日。え、半年経ってるじゃん…怖…。
![スクリーンショット 2024-04-11 225414.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664889/6e123c2a-2a3d-759c-209b-bb497b3f15a7.png)
まぁ画像を見れば分かるとおり、反復をしてました。
かなり精神衛生上良くなかったです。
あまりにも辛くてTwitter開く気力も無くなってしばらくほったらかしてたら、いつの間にかアカウントが凍結されていてもっと辛くなりました。
イーロン君って、そうやって弱い者いじめするんだね。

まぁそんなことはおいといて、入水が2023年1月7日なので前回の色変から10ヶ月くらいですか？
どんどん期間が長くなっている…入黄できるのか不安になるわよ…。
ちなみに競プロ始めてから2年半ですね。もうそんなになるのか。

## 自己紹介
って言っても、もう[入水記事](https://qiita.com/viral_8/items/20a39d023d8090061191)で大体書いたんだよな。
あ、Twitterは凍結してしまったので載せておくと、今は[@_viral8code](https://twitter.com/_viral8code)です。
あと変更点は…あぁ！B4になりました。
もうB4なんですよ。早くない？研究キツいんだが？？？
メモ帳も相変わらず使ってるし…コーヒーもキメてるし…まぁ、変更点は上記で終わりですかね。

ネタ切れちゃった。
なんか訊きたいことあったら[マシュマロ](https://marshmallow-qa.com/viral8code)かTwitterのリプかDMで送って。

## Problemsのやつ
こんな感じ。

![スクリーンショット 2024-04-11 230636.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664889/11dd3348-411c-4f1f-fb5a-e9322ea8aa6b.png)

あれ、もう2200AC超えてたんだ。

![スクリーンショット 2024-04-11 230743.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664889/edb76e12-1682-f747-0656-5c1167f71c2d.png)

じわじわ埋めてる。やっぱりE以降は難しいですわ。

![スクリーンショット 2024-04-11 230920.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664889/1abaec14-25d2-f1ce-4b1f-e15e05e0bb55.png)

diffで見るとスッカスカ。なかなか埋めることが出来てない…悲しい…。

## なんか変わったこと
水の時を思い返しても特にこれといった違いは無いんですが、強いて挙げるなら、E、Fまで手が出せるようになったことですね。
Eまで解けたら良い方、という認識だったんですが、最近はFまで解けたら良いなという認識に変わってきてます。じゃないと、マジで、レートが溶ける…。

あと、水になってからはいろいろやったような気がします。期間が長いってのもあるんだろうけど。
例えば有志コンテストでWriter/Testerをやったり、ICPC出たり、人生初のオンサイトコンテストに行ったり(第2回緑以下コン)、これまではひっそりとやってるという感じだったんですけれども、実際に多くの方が競技プログラミングをやっているのだなぁという気持ちになりました。
兎にも角にも、いろいろ経験できて良かったなぁと思います。特にICPC。弊学に競プロerがいるという事実を体感出来ただけでも非常にモチベが向上しました。あと、気軽にエンカしてくれる友人ができたことも嬉しかったです。

## まとめ
やっと青って言っても良いくらいには水に落ちなくなりました。もしかしたら次回水に戻るかもしれませんが、まぁ、そんときは暖かい目で見てくれれば…。

大学生のうちに黄色になりたいなとは思いますが、そんなに希望があるわけでは無いのでいつも通り楽しく参加しようと思います。

読んで頂きありがとうございました！
gitignoreファイルを用いて、特定のファイルの更新をメンバー単位で不可にしたい【結論:出来ない】

# 出来ない理由
- .gitignoreのファイルは「まだ追跡ファイルに含まれていないファイルを追跡ファイルに含めないようにする」設定です
- つまり、.gitignoreを用いて更新不可にすることは不可能です。
- .gitignoreのファイルに書かれているものでも、既にリポジトリに含まれていれば、更新可能です。
- グローバルの.config/git/ignoreの中に更新したくないファイルのシグネチャを定義していても、Gitリポジトリに含まれていれば更新可能になります。

# 対応策（未調査）
1. gitAttributeのファイルを使う？
1. gitのフック処理を用いる？

一旦備忘録として
---
[Git リファレンス](https://git-scm.com/docs/gitignore)
[Git フックの適用例](https://git-scm.com/book/ja/v2/Git-のカスタマイズ-Git-ポリシーの実施例)
[.config/git/ignoreの設定に関するQiitaの記事](https://qiita.com/pyon_kiti_jp/items/89a0bc9f9b8f617b3668)
[テストしたGithubリポジトリ](https://github.com/Shiryu-go/TestGitIgnore)

---
### 感想
大規模プロジェクトでの更新不可の設定ファイルへのプロテクトの設定に".gitignore"が使用できると思って調べてたんですが、ダメらしいです。結構調査が怠かったので、備忘的に残しておきました。
```
- .gitignoreのファイルは「まだ追跡ファイルに含まれていないファイルを追跡ファイルに含めないようにする」設定です
```
これ↑のことをちゃんと理解するまで結構時間がかかりました。そうなんだ…。
Gitのフックまで作り込むのはコストに見合っていなさそうなんで、あんまりやりたくないですね…。

---
### 追加の失敗
#### ディレクトリとファイルの違いがわからない
最初、.config/git/ignoreに更新不可ファイルを定義したのにGitの追跡ファイル扱いをされてしまうものだから、ignore配下に.gitignoreを追加しなければいけないのではないかと勘違いしました。
結論としてはこれは間違いで、ignoreファイルの中に定義しなければいけなかった訳ですが…。

ディレクトリであることを明示するのであれば、.config/git/ignore/と書いてあるはずなのですが、その辺りの表記の違いをあまり理解できておらず、無駄に時間を取られました。
ちなみに、その時は以下のようなエラーが出ました。
```
Git: fatal: cannot use /Users/gotohshiryuu/.config/git/ignore as an exclude file
```
今見ると、「ignoreがディレクトリになっているせいで読めないんだけど💢」というように受け取れますね…。
.gitignoreが重複しているせいでエラーになっているのかと勘違いしていました。
Websocket通知とは何か、その仕組みをざっくりと理解する

エンジニアになって最初にぶち当たった壁であるwebsocket通信について、まとめます。

自分は、サルでもわかる〇系の技術ブログを読んで、理解できず、悲しい気持ちになった過去の自分を助けるつもりで書きました。誰かのお役に立てれば幸いです。

# この記事でわかること
・websocketとは何かがわかる
・websocketの仕組みが「ざっくりと」わかる


# websocket通信とは何か？
ググると、
**ブラウザとサーバー（Webサーバー）間で双方向通信を行うためのプロトコルのこと**
と出てきます。つまりどういうこと？　と思った方も多いはず。

# 噛み砕くと...
例えばみんなが使っているアプリのラインを想像してください。

だれかにメッセージを送ります。
その返信が、更新ボタンをおさずとも「ラインッ」という音と同時に、メッセージが更新されます。
この、更新ボタンをおさずに(<font color="red">こちらからリクエストを送らないで</font>)メッセージを受け取ることができるのがwebsocket通信です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3747635/d4015388-d8f6-74fb-494d-259acd1174d0.png" width=50%>


そんなの当たり前じゃんと思う人もいるかもしれないので、websocket通信じゃない例を見てみます。
例えば予約フォームを想像してください。![スクリーンショット 2024-04-09 13.05.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3747635/5480264d-7308-5cb3-3ce1-e8bf863a3821.png)


メールアドレスをいれて、名前をいれて、「送信」ボタン」を押します。すると、画面が変わり、「予約を受け付けました」と表示されます。

この場合、送信ボタンを押して(<font color="red">こちらからリクエストを送って</font>)、予約が無事に完了したよという返事が返ってきます。
websocket通信と比較されるのが、HTTP通信です。


**Websoket通信は、こちらからリクエストをせずとも、相手からの通知を受け取れる通信**
**HTTP通信は、こちらからリクエストを送ることで、相手からの返事を受け取れる通信**


websocket通信では、
私がラインを友人に送る　私→友人(私→サーバー)
友達がラインを私に送る　私←友人(私←サーバー)
で、双方向通信が可能になるわけです。(私と友人の間にはラインのアプリサーバーがあります)

HTTP通信では、
私が予約フォームで、送信ボタンを押して、予約完了の表示が出ることはあっても、
予約フォームの画面を開いていたら、何も押してないのに、急に「予約完了」のメッセージが送りつけられてくる、なんてことはありません。
私→サーバー　の単方向の通信になります。

# websocket通信のリアルタイム通知を実装する
シナリオ
Aさんの学校では、画面を開いているとリアルタイムで通知が届くチャットアプリを利用して、会話をしています。
・Aさん、Bさん、Cさんは「１年グループ」に所属しています。
・Iさん、Jさん、Kさんは「２年グループ」に所属しています。
Aさんの所属している「１年グループ」で、Cさんがメッセージを送りました。通知は、１年グループに所属している人全員に送られます。


全体の流れ
![スクリーンショット 2024-04-10 14.50.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3747635/485ea8df-313b-5c47-93fa-8a292317da90.png)

### ①で起こっている処理を詳しく
1. フロントエンドにて、画面の初期表示時に、「新しく画面が開かれたから、新しい接続を、通知送るリストに登録してね」というリクエストを、バックエンドに送る
2. バックエンドにて、フロントエンドからのリクエストを受け取り、新しい接続を作成
3. フロントエンドにて、「新しく作った接続(ConnectionID)が"１年グループ"に関連付くように処理して」 とバックエンドに指示を送る
4. バックエンドにて、新しく作ったConnectionIdに、groupID：1年グループを関連づける

というような処理を行っています。

### 【フロントエンド】Websocket通知の実装

vue.js
```
  data: function () {
    return {
      groupId: String
    };
  },
  
  async created() {
    let self = this;
    self.groupId = "グループ名"
    // 新しい接続を作るようバックエンドにリクエストする
      this.connection = new WebSocket(process.env.VUE_APP_WEBSOCKET_ENDPOINT)
      // 通知が来るまで待機。通知が来たら、この中で処理を行う
      this.connection.onmessage = function (event) {
        console.log('通知されたメッセージ　:', event);
      }
      // 今のConnectionIDのレコードに、groupID:グループ名を入れるよう、バックエンドにリクエストする
      this.connection.onopen = () => this.connection.send(self.groupId);
  },
```
### 【バックエンド】Websocket通知の実装

バックエンドはというと、
ConnectionIdをパラメータに持つリクエストが来た場合と、
ConnectionIdをパラメータに持たないリクエストが来た場合で処理を変えて行います。

![スクリーンショット 2024-04-10 20.06.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3747635/640f150c-9da4-004c-8134-fc2c297b6021.png)
バックエンドの実装については、gitでコードをあげている方もいるので、そちらを見てもらえたらと思います。（正直、うまく説明できる気がしません）

# 一文でいうと、Websocket通知って何？
**誰かがブラウザを開くたびに、開かれたブラウザの住所みたいなものを「通知するリスト」に保存する仕組みになっていて、更新が必要なたびに、そのリストに載っているブラウザにリアルタイム通知を送る仕組みのこと**

今回は、Websocketについて学んだイメージを絵にしてみました。まだまだ自分は勉強不足ですので、間違っている情報等あればコメント等で教えていただければ嬉しいです。
Rails7においてパスごとに表示するリンクを切り替える

# はじめに
久しぶりにQiita投稿しました。

いつもならはてなブログなんですが、たまにはいいかなと。

無駄話はこれくらいにして本題です。

#　環境
```
ruby-3.2.1
Rails 7.0.6
```

# やりたいこと
同じレイアウトを使用しているときに、urlによって表示するリンクを分ける

例えば管理者画面において`app/layouts/admin_layouts.html.erb`たるものを使用していたとする。

管理者は全商品を管理する商品一覧ページと購入明細一覧ページを参照できるとする。

どちらのページも同じレイアウトを使用しているときに

商品管理ページのナビには存在する `商品一覧`リンクと`新規作成`リンクのうち

`新規作成`リンクのみ購入明細一覧ページには表示させたくない。

# 結論
`request.path.match`を使用する

今回はパスの中に`/admin`が入っているかで判別を行った。

```
    <% if request.path.match(/\/admin.*/) %>
      <%= link_to "一覧画面", admin_products_path, class: "btn btn-outline-dark" %>
      <%= link_to "新規作成", new_admin_product_path(@product), class: "btn btn-outline-dark" %>
    <% else %>
      <%= link_to "一覧画面", orders_path, class: "btn btn-outline-dark" %>
    <% end %>

```
実際の画像
商品一覧ページ(url: `http://localhost:3000/admin/products`)
![スクリーンショット 2024-04-11 23.00.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567812/55c8eba0-bcca-571a-f932-a31c880e5161.png)


購入明細一覧ページ(url: `http://localhost:3000/orders`)
![スクリーンショット 2024-04-11 22.59.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567812/bf5c81ce-e2e4-74a8-5732-5bc916b54fed.png)

# 終わりに
これが最善な方法かはわかりませんが、以前あのポートフォリオを作っていたときに

やったことがあるやり方だったのでやってみました。

他にいい方法があればそれも試してみたいと思います。
Arduino UNOでビットの並びを逆転して遊ぶ。(0bABCD EFGH->0bHGFE DCBA)


目的
8ビットの上位、下位を逆転して遊ぶ
3回シフトする方法を選択
ビットリバースと言うらしい。
ビット順序反転
(逆転再生の逆転)

1回目 ABCD EFGH -> EFGH ABCD

2回目 EFGH ABCD -> GHEF CDAB

3回目 GHEF CDAB -> HGFE DCBA


オンラインコンパイラ

```c++

#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    int x=0b10000000;
    printf("[%02x]\n",x);
    
    x=(x >> 4) | ( (x & 0x0f) << 4 );
    printf("[%02x]\n",x);
    
    x=((x & 0b11001100) >> 2) | ( (x & 0b00110011) << 2 );
    printf("[%02x]\n",x);
    

    x=((x & 0b10101010) >> 1) | ( (x & 0b01010101) << 1 );
    printf("[%02x]\n",x);
    
    
    
}


```

結果

```

[80]
[08]
[02]
[01]

```


arduino


結果

![o_coq026.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1f065aef-7368-4646-5742-0e2634f47242.jpeg)


プログラム



```c++



//0bABCD EFGH -> 0bHGFE DCBA
//0bABCD_EFGH__0bHGFE_DCBA_UNO_1


// the setup routine runs once when you press reset:
void setup() {

  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);

}

// the loop routine runs over and over again forever:
void loop() {

  int x = 0b10000000;

  // print out the value:
  Serial.println(x, HEX);

  x = (x >> 4) | ( (x & 0x0f) << 4 );
  // print out the value:
  Serial.println(x, HEX);

  x = ((x & 0b11001100) >> 2) | ( (x & 0b00110011) << 2 );
  // print out the value:
  Serial.println(x, HEX);

  x = ((x & 0b10101010) >> 1) | ( (x & 0b01010101) << 1 );
  // print out the value:
  Serial.println(x, HEX);

  delay(1000);        // delay in between reads for stability
}



```
独習PHP学習メモ（Chapter2-定数）


[PHP8技術者認定初級試験取得](https://www.phpexam.jp/summary/novice8)を目指しています🔰

公式の認定教材である[独習PHP第4版](https://www.amazon.co.jp/dp/4798168491/)での学習のアウトプット用の記事です。

## 構文

```
const 定数名 = 値;

// 例
const TAX = 1.1
```

#### ルール

1. 名前の先頭に$はつけない
1. 予約語ではないこと
1. 全て大文字で命名する。単語と単語はアンダースコアで繋げる
1. 利用できる型は決まっている


#### 補足

define関数という関数があり、定位数を定義することができる。
以下の定義は同義である。

```
const TAX = 1.1
define('TAX', 1,1);
```

お互いにできることが異なり、
トップレベル以外での宣言（functionの配下など）、変数や関数の戻り値を設定したい時はdefine関数を使う。

## 定義済みの定数

PHPには最初から用意された定数が存在する。
以下は例である。


| 定数 | 概要 |
|:-:|:-:|
| __FILE__  | 実行中のファイル名（絶対パス）  |
| __DIR__  | 実行中のファイルが存在するフォルダ  |
| __FUNCTION__  |  実行中の関数名 |
| __CLASS__  |  実行中のクラス名（所属する名前空間を含む） |
Amazon Linux 2でpostgres 15.x clientをインストール

EC2にPostgreSQL15のクライアントをインストールする方法を記録する。

下記のファイルを作成。 

```/etc/yum.repos.d/pgdg.repo
[pgdg15]
name=PostgreSQL 15 for Redhat Linux – x86_64
baseurl=https://download.postgresql.org/pub/repos/yum/15/redhat/rhel-7.10-x86_64
enabled=1
gpgcheck=0
```

その後、下記のコマンドを実行する。
```
sudo yum makecache
sudo yum repolist (ensure that pgdg15 shows as a repository)
sudo yum install libzstd
sudo yum –disablerepo=”*” –enablerepo=”pgdg15″ install postgresql15-15.3-1PGDG.rhel7 (To get postgres 15.3)
```

クライアントをインストールする。
```
sudo yum install postgresql15-server
```

接続
```
psql -h <hostname> -U <username> -d <database> -p <port>
```
mecabの使い方（parse / parse to node）

<h1>mecabとは</h1>
形態素解析をしたいときに使うライブラリのこと。これを使うことで文章を単語ごとに分割することができる

<h2>今回の目的</h2>
スクレイピングで手に入れたURLをbs4で可視化する。<br>
そのうえでmecabで形態素解析をして、単語内にどんなキーワードが使われているのかを把握したい

<h2>コード</h2>
~~~python

import MeCab
wakati = MeCab.Tagger("-Owakati")
#おわかちを利用して、mecabを使えるように

node = wakati.parseToNode(text)
#テキスト情報をparsetonodeで区切る
words=[]
while node:
#nodeがある間は、ということ
    words.append(node.surface)
    #parsetonodeはnodeクラスに格納されているため、クラスメソッドを用いて、whileで取り出していく必要がある
    node = node.next
    #parsetonedeはnode.textをいれないと次の単語に進まない
print(words)
~~~

<h2>parseとparsetonodeの違い</h2>
parse：カンマなどで単語の情報を区切って集める必要がある<br>
parsetonode：クラスメソッドで単語の情報を集められる<br>
└単語数の情報はこちらの方が集めやすい<br>
参考）https://zerofromlight.com/blogs/detail/56/
C# Devkitを入れた後のVS codeのメモリ濫用を抑制する(?)

この何ヶ月か、VS Codeが遅くてしょうがなくなるという問題に悩まされていた。
理由はわかっていた。
**Microsoft.CodeAnalysis.LanguageServer** がメモリを濫用するのだ。
下はそのスクリーンショットだが10分も触れば、これぐらいには膨れ上がる。そして、これは野放図に膨れ上がり、８ギガバイトとか10ギガバイトとか使ってしまうのだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96586/b228d39e-c7e4-af21-1cae-6b0cb35edce7.png)

しかもメモリを濫用するだけでなく、何をやっているのか知らないが(想像はつくが…）、何かをちょっと入力するだけで、CPUも無駄飯ぐらいをして、気が狂うほど編集が遅くなってしまう。
これはMSのC#のサポートが C# Devkitに変わってから起こっている問題だったのだけど、これがないとunityのデバッガがattach出来なくなってしまっているので外すわけにもいかず、膨れ上がったら一度VS Codeをクローズして、また開けるなんて消極的な手段で対応していたのだけど、それなりにマシにする方法がわかったので、以下に日本語の資料として残しておきたい。
なお見つけたのは、これに関係するgithubのcodeの以下のissueからだ。

https://github.com/dotnet/vscode-csharp/issues/5733

やり方は簡単。

1. 設定を開く
1. dotnetと検索に入力
1. Text Editorを選択する
1. そこにある Dotnet > **Background Analysis: Analyzer Diagnostics Scope** の設定を **none** にする

![スクリーンショット 2024-04-10 001744.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96586/49ac8694-bb64-f802-744f-5a040306a2db.png)

これでも、以下のスクショぐらいは食ってしまうのだけど、少なくとも自分の環境ではイライラすることはなくなった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96586/8d527358-95ab-5c2f-7d54-7e9c354b7168.png)

これで100%直るという気はないけれど、悩まされている方がいたらお試しアレ。
WindowsにドメインAdministratorとしてログインしてるのに管理者権限無い件の対応

# 現象

ドメインAdministratorでログインして『C:\Users\Default\Documents』にフォルダー作ろうとしたら下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/a85b5908-80a8-4550-1ab8-20094d3f0475.png)

> 対象フォルダーへのアクセスは拒否されました
> この操作を確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/525a4407-fbdd-c282-4d85-993ae78ccd09.png)

Administratorでログインしてるのになんで？？

手動で設定する分に「ちょっと面倒くさいなあ」レベル。
ですが『自動設定バッチ』のようなものを作る場合は、このせいで処理が止まってしまいます。

全PCで発生するわけではなく、特定のPCで発生。

# 原因はこれだった

ドメインAdministratorでログインした状態で、Windowsマークを右クリック ⇒ 『ファイル名を指定して実行』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7c25ac9c-5113-c00e-6747-c2e6abfe4abb.png)

```secpol.msc``` でローカルセキュリティーポリシー設定画面を起動。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/62b917af-1d5c-9b52-63c1-5f7d56f4d0ab.png)

『ローカルポリシー』 ⇒ 『セキュリティオプション』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/4408edab-92fc-9047-2fd3-3ad523890f66.png)

『ユーザーアカウント制御：ビルドインAdministratorアカウントのための管理者承認モード』が『有効』になっていました。
『無効』に設定することで解決しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/96de6bfa-5a5d-fe3b-8c04-f176033f9931.png)

# レジストリーで設定変更したい場合

下記フォルダーの…

```
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
```

『FilterAdministratorToken』を0にすれば無効に設定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2d3fb71a-b1a5-ff84-9c48-c7630dbd11cb.png)

# 蛇足

ローカルセキュリティーポリシーは右クリックで下記のようにすればtxt出力できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/83b972e9-06e6-e91c-5928-64a4ae2dc5e0.png)

『想定通りに動くPC』『想定通り動かないPC』それぞれからtxtを出力して、WinMergeなどで差分チェックすると『設定が違うところ』をすぐに洗い出せます。

# バージョン

Microsoft Windows [Version 10.0.22631.3447]
PHPでフィボナッチ数列の学習課題を解いたときの話

Qiita初投稿

学習課題のアウトプット用の記事です。

使用言語はPHP

# フィボナッチ数列とは
>(Fn) は、次の漸化式で定義される：
>F0 = 0,
F1 = 1,
Fn+2 = Fn + Fn+1 (n ≥ 0)

>第0～22項の値は次の通りである：
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, …

Wikipediaより参照
[フィボナッチ数 - Wikipedia](wikihttps://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0)

# 課題内容
学習課題の一つで

<!--
> **整数nを引数に、fibonacci関数を定義してください。**

> **f(0) = 0
f(1) = 1
f(n) = f(n-1) + f(n-2)　(n ≧ 2)**

> **1 <= n <= 30**
-->

> 家のお手伝いを毎日継続すると、継続日数 n 日に応じて、その日にもらえるお小遣いの金額が増えていきます。お小遣いの金額は以下の条件に従ってもらうことができます。

> f(0) = 0 円
f(1) = 1 円
f(n) = f(n-1) + f(n-2) 円   (n ≧ 2)

> 整数 n に対して、n 日間お手伝いを継続した時のお小遣いの金額を算出する関数 fibonacci を定義してください。

という内容だった。

この時、**与えられた式やWikipediaの漸化式をそのまま使おうとばかり考え、どうやってプログラムに書けばいいかと悩んでいた。**

# 考え方
求めたいフィボナッチ数(f(n))は、フィボナッチ数列の「一つ前の数(f(n-1))」と「二つ前の数(f(n-2))」を足して求められる。

### フィボナッチ数列を作るためのループ処理を考える。
* どこからどこまでか
開始は1からとして考え、引数nまでのループ処理をする。
</br>

* 一つ前の数字と二つ前の数字の表現
変数を三つ用意し、`$a`, `$b`, `$c`とした。
    1. `$c` = "求めたいフォボナッチ数"　f(n)
    1. `$a` = "二つ前の数"　f(n-2)
    1. `$b` = "一つ前の数"　f(n-1)

    `$a`には`0`、`$b`には`1`をそれぞれ代入しておく。(数列の最初の二つの数)
</br>

* 処理の内容
    1. `$c`に`$b`, `$a`を足した数が代入される
    1. `$a`は次の計算で、今の`$b`の数が代入される
    1. `$b`は次の計算で、今の`$c`の数が代入される
</br>

* ループ処理が終わったら出力

# 結果
```
<?php
function fibonacci($n){
    if($n <= 0){
        return;
    }
    $a = 0;
    $b = 1;
    $c = 1;
    for($i = 1; $i < $n; $i++){
        $c = $a + $b;
        $a = $b;
        $b = $c;
    }
    echo $c;
}

fibonacci(22);
?>
```

引数に`1`が入力されたとき、`$c`に予め`1`を代入しておくことで、ループ処理に入らずそのまま出力される。

引数に`0`以下の数が入力されたとき、`return`で何も出力されず終わる。

# 実行結果
引数に`22`を入力
```fibonacci.php:fibonacci(22);
17711
```
Wikipediaにあった第22項の値と一致している。
<details><summary>その他の実行結果</summary>

引数に`0`を入力
```fibonacci.php:fibonacci(0);

```
引数に`1`を入力
```fibonacci.php:fibonacci(1);
1
```
引数に`2`を入力
```fibonacci.php:fibonacci(2);
1
```
引数に`3`を入力
```fibonacci.php:fibonacci(3);
2
```
引数に`30`を入力
```fibonacci.php:fibonacci(30);
832040
```

</details>

# まとめ
見たものをそのまま使おうとするのではなく、本質を理解することで考え方を変えることができた。
結果は思ったよりシンプルなコードになった。
もっと効率のいいコードもあるかもしれないが、課題解決におけるアプローチの仕方には様々な方法があると学ぶことができた。
~~あと、この家のお小遣い事情は改めた方がいいと思った。~~
エンタープライズ セキュリティの強化を明らかにする: ソフトウェア デファインド ペリメーターとその最新トレンドを探る

サイバー脅威が大きな影響を与え、従来のセキュリティ対策では対応できない時代において、企業は革新的なソリューションに目を向けています。この文脈において、ソフトウェア定義の許可者(SDP)は、進化するサイバー脅威に対する動的で堅牢な防御メカニズムを提供し、希望の光を提供します。SDPの本質、最新のトレンド、そして今日のデジタル環境におけるエンタープライズアプリケーションを強化する方法を探ってみましょう。

ソフトウェア定義の許可者(SDP)について
ソフトウェア定義のアクセス許可は、個々のユーザーやデバイスが企業リソースにアクセスするときに、動的にセキュリティで保護され、個別のネットワーク パーミネーターを作成するセキュリティ フレームワークです。従来のセキュリティモデルは静的な境界防御に依存していましたが、 SDPはゼロトラストアプローチを採用し、ネットワークの場所ではなく、ID検証とコンテキスト要因に基づいてアクセスを許可します。 

SDPは、暗号化、ID検証、マイクロセグメンテーションを活用して、安全なオーバーレイネットワークを確立し、不正アクセスからリソースを保護し、攻撃対象領域を最小限に抑えます。SDPは、特定の資産の周囲にパーミネーターを動的に作成することで、 ネットワークの場所に関係なく、認証されたユーザーのみが機密情報にアクセスできるようにします。 

ソフトウェア定義の制限に関する最新動向
ゼロトラストアーキテクチャの統合: 組織がゼロトラストモデルを採用するにつれて、 SDP はアーキテクチャの重要なコンポーネントになっています。既存のIDおよびアクセス管理(IAM)ソリューションとの統合により、シームレスなユーザー認証とアクセス制御が提供され、全体的なセキュリティ体制が強化されます。 

マルチクラウドのサポート: クラウドサービスの普及に伴い、 SDPソリューションはマルチクラウド環境でシームレスな保護を提供するために進化しています。この傾向により、クラウドプロバイダーやインフラストラクチャに関係なく、一貫したセキュリティポリシーとアクセス制御が保証されます。 

コンテナ化とマイクロサービス:企業がコンテナ化とマイクロサービスアーキテクチャを採用するにつれて、SDPソリューションはこれらの動的な環境を保護するために適応しています。SDPは、きめ細かなアクセス制御と暗号化メカニズムを提供することで、コンテナ化されたデプロイに内在するセキュリティリスクを軽減します。 

AIと行動分析:  SDPソリューションは、人工知能と行動分析を活用することで、脅威の検出と軽減の機能を向上させます。SDPは、ユーザーの行動とネットワークトラフィックのパターンを分析することで、潜在的なセキュリティ侵害を示す異常を特定し、プロアクティブな対応アクションを可能にします。 

エッジセキュリティ:エッジコンピューティングが脚光を浴びる中、SDPはエッジデバイスやIoTデバイスに保護を拡張します  。 SDPゲートウェイをネットワークエッジに導入することで、組織は分散エッジ環境に一貫したセキュリティポリシーとアクセス制御を適用できます。 

続きを読む@ https://www.snsinsider.com/reports/software-defined-perimeter-market-3700
Windows環境でDockerのHelloWorldを実行する

Windows環境でDockerのコンテナを作成して、シェルから「Hello, World!」と出力させるまでの手順です。
環境は以下となります。
- OS: Windows11

## Dockerのダウンロード・インストール
Docker Desktopのインストーラをダウンロードして、インストールします。

:::note info
2024年4月現在、「Mac用のダウンロード ウィンドウズ」と少し日本語がおかしいですが、このボタンを押すことでWindows用のインストーラがダウンロードできます。
:::

https://www.docker.com/ja-jp/get-started/

## 作業用ディレクトリの作成
任意の場所に作業用ディレクトリを作成します。
今回は例として以下の通りディレクトリを作成します。
```
C:\dev\dockertest\myimage
```

## Dockerfileの作成
作業用ディレクトリの配下に`Dockerfile`という名前のファイルを作成します。
ファイルの内容は以下の通りです。
```dockerfile:C:\dev\dockertest\myimage\Dockerfile
FROM ubuntu:22.04
COPY ./hello.sh /hello.sh
ENTRYPOINT ["/hello.sh"]
```
- FROM
Ubuntu22.04を元にしてイメージを作成します。
- COPY
次項で作成する`hello.sh`をコンテナの`/hello.sh`にコピーします。
- ENTRYPOINT
コンテナを起動したら`/hello.sh`を実行するようにします。

## hello.shの作成
作業用ディレクトリの配下に`hello.sh`という名前のファイルを作成します。
ファイルの内容は以下の通りです。

:::note warn
改行コードは**LF**で作成してください。
CRLFで作成するとコンテナの実行時に想定通り動きません。
:::

```bash:C:\dev\dockertest\myimage\hello.sh
#!/bin/bash
set -eu
echo "Hello, World!"

```
## Dockerイメージの作成
PowerShellを起動してDockerイメージを作成します。
作業用ディレクトリの1階層上に移動します。
```powershell
cd C:\dev\dockertest
```
`docker build`コマンドを実行します。
```powershell
docker build -t myimage:v1 ./myimage
```
`-t myimage:v1`でイメージ名とタグを指定しています。
`./myimage`でディレクトリを指定しています。

Docker Desktopの`Images`に`myimage`が作成されていれば成功です。

## Dockerコンテナの実行
Powershellで以下のコマンドを実行し、Dockerコンテナを実行します。
```powershell
docker run --name mycontainer myimage:v1
```

`--name mycontainer`でコンテナ名を指定しています。
`myimage:v1`で先ほど作成したイメージを指定しています。

標準出力に以下の通り出力されます。
また、今回はシェルの中で`echo`しか実行していないため、そのままコンテナは実行終了します。
```
Hello, World!
```

## Dockerコンテナの削除
Powershellで以下のコマンドを実行し、Dockerコンテナを削除します。
```powershell
docker rm mycontainer
```

以上です。
OpencvをVScodeを用いてC++で使う

## 1. 前書き
opencvは画像処理を簡単に行うことが出来る非常に便利なライブラリである。またカメラを用いたリアルタイム処理も行える。しかしこれをpythonで使うと実行速度などの面で不自由もある。そこで今回はC++でopencvを使うための環境を整えていく。このような記事は他にも沢山あるが筆者は上手くいかずに嵌ってしまったのでここに残しておく。

pc:
os:windows10
必要なもの
opencv
vscode
minGW
visualstudio
CMake

## 2. 手順
1. opencvを[こちら](https://opencv.org/)からダウンロードして適当な場所に展開する
2. vscode、visualstudioを[こちら](https://visualstudio.microsoft.com/ja/free-developer-offers/)からインストーラをダウンロードしてそこからインストールする
3. [minGW](https://www.mingw-w64.org/)をインストーラからダウンロードする
4. [CMake](https://cmake.org/)をダウンロードする 
5. VScodeの拡張機能であるCMaketoolsをインストールする
6. 環境変数のPATHに以下のパスを通す
~~~
C:\opencv\build\x64\vc16\bin
C:\opencv\build\x64\vc16\lib
C:\Program Files\CMake\bin
C:\Program Files\CMake
C:\MinGW\bin
C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin
~~~

## 3. CMakeListsの書き方
このままVScodeで
~~~
#include <opencv2/opencv.hpp>
~~~
このように書いても赤い波線が引かれる。そこでincludeパスに含めることでこれを解決する。
そしたらこのmainファイルと同じ階層にCMakeLists.txtを作成する。その内容は以下のように記述される。
~~~CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(プロジェクト名)

# specify the C++ standard
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# find OpenCV library
find_package(OpenCV REQUIRED)

# include OpenCV directories
include_directories(${OpenCV_INCLUDE_DIRS})

# add your source file
add_executable(プロジェクト名 ファイル名)

# link OpenCV libraries
target_link_libraries(プロジェクト名 ${OpenCV_LIBS})
~~~

## 4. ビルドして実行する
ここまで出来たらターミナルを開いて書きコマンドを実行していく
~~~
mkdir build
cd build
cmake ..
msbuild プロジェクト名.vcxproj/p:Configuration = Release
~~~
最後に以下のコマンドでプログラムを実行する
~~~
cd Release
.\プロジェクト名.exe
~~~

## 5. 最後に
今回はC++でopencvを使えるようにしました。この手順はさまざまなやり方で成功している人がいるのでそのうちの一つとしてみていただけると幸いです。それではまた次回会いましょう。
Qiitaに記事を書き始めてよかったこと

半年前からQiitaに記事を書くようになって、たくさんいいことがあったので振り返りも兼ねて記事にしました。

# よかったこと（まとめ）
- 仕事における生産性があがった
- 知らないことを調べる時の思考方法が劇的に変わった
- あらゆる場面で構造的に考える事ができるようになった
- 主体的に考えられるようになった結果、楽しく仕事ができるようになった

# そもそもなぜ記事投稿を始めたのか
```
人生を自分らしく楽しみ、
ファンが推し続けてくれるような活動を通して、
コミュニティ全体の幸福に寄与する
```
これは私が掲げているビジョンです。
このビションを実現するために社外にも自分のファンを増やしたいと思ったことが投稿のきっかけでした。

# 実際に始めてみると
1個の記事を書くのに２、３時間かかっていました。
文章の推敲をAIと相談の上でそれくらいの時間がかかっていたので、正直苦痛でしたし、忙しくなったら無理だなと思うようになりました。

# 気づき
記事を書いた知識の定着具合がエグいな、ということにある日気が付きました。
最初は意識していなかったのですが、その日に調べたところやわからなかったことを記事にすることで自然と復習をする形になっていたことが大きかったのだと思います

# 目的変更
これに気づいたことで記事の投稿目的をビジョン達成のためではなく、自分の知識アップ、ひいては生産性アップのために投稿をしよう！というモードに切り替わりました

# そこからいろんな事が変わった
自分のレベルアップのためとはいえ、何時間も時間かけるのは嫌だから、どうしたら効率よく記事が書けるかを考えた結果、「インプットする時からアウトプットすることを意識する」という結論に至りました。

これを意識することで、頭の中で最初から知識が構造化され、整理されるので、インプット時点での記憶の定着にもいい影響が出て、アウトプットする時にもすでに記事の構成が頭にあるので推敲する時間が減り、記事を投稿する時間が減りました

# アウトプットすることを意識すると
アウトプットを意識しておく癖がつくと、システムの設計であったり、新規案件の内容、普段の会話とあらゆる場面でその思考が働くことで理解度がグッとアップしました

# その結果
知識がアップしたこと、あらゆる場面での理解度が増した結果、生産性がアップしました。

また、集中していろんなことを聞くようになったため、今まで少し距離を持って対応していたことも主体的に考えるようになることで、興味がなかったことでも興味が湧いて楽しくこなせるようになりました

# もう一度まとめ
- 仕事における生産性があがった
- 知らないことを調べる時の試行方法が劇的に変わった
- あらゆる場面で構造的に考える事ができるようになった
- 主体的に考えられるようになった結果、楽しく仕事ができるようになった

全ての人がこの結果に至るとは思いませんが、個人的にはQiitaに記事投稿をする習慣がついたことは本当によかったと思います。

今後も記事投稿を続けるとともに、当初の目的であるファンを獲得することも達成できたら、と思っています。

この記事を読んで１人でも投稿始めてみようかな！と思う人がいたら幸いです。
Elixirでの累積リスト作成

# Elixirでの累積リスト[^1]作成

本記事では累積リストとは、`[1,2,3] -> [[1],[1,2],[1,2,3]]` のように1次元のリストがあったとき、n番目までの要素のリスト、を要素とするリストのこと。リストのリストとなる。「ジャグ配列」だと階段状であることが表現できないので、ここでは累積リストと呼ぶことにする。

用途としては、nの階乗を順に並べたリスト`[1,2,6,24,120]`を作ったり、Windowsのフォルダを並べたリスト`["c:", "Users", "Doe", "Documents"]`から、親フォルダの絶対パスを階層の順`["c:", "c:/Users", "c:/Users/Doe", "c:/Users/Doe/Documents"]`に得たりする。

Elixirで`Enum.reverse/1`を活用して実装した。`build_cumulative/1`では、`Enum.reverse/1`を使ってリストの順を逆順にする。また、結果をとるアキュムレーターの初期値`[]`を第2引数にして、`build_cumulative/2`を呼び出す。

```Elixir
def build_cumulative(enum) do: build_cumulative(Enum.reverse(enum), [])
# [1,2,3] -> build_cumulative([3,2,1])
```

`build_cumulative/2`では、第1引数（元のリスト全体）を再度逆順にすることによって元に戻したリストをアキュムレーターに渡す。逆順リストからヘッダ（＝末尾項目）を除く。のぞいた結果を第1引数に与えて再帰的に自分自身を呼び出す。

```Elixir
def build_cumulative([head | tail], acc) do
  build_cumulative(tail, [Enum.reverse([head | tail])|acc])
end
# [3 | [2,1]], [] -> build_cumulative( [2,1], [[1,2,3] | []])
```

すべての項目が除かれたら、アキュムレーターには完成した累積リストが入っているので、それを終了条件としてアキュムレーターを返す。

```Elixir
def build_cumulative([], acc), do: acc
```

#### 累積リストのコード全体

```Elixir
def build_cumulative(enum) do: build_cumulative(Enum.reverse(enum), [])
def build_cumulative([], acc), do: acc
def build_cumulative([head | tail], acc) do
  build_cumulative(tail, [Enum.reverse([head | tail])|acc])
end
```
## 応用

累積リストの応用例である累積和や階乗リスト、フォルダ階層は`Enum.scan/2`でも実現でき、最適化もされているので累積リストをあえて使うことはないかもしれない[^3]。累積リストは基礎的な興味を満たすのと、後続の処理で関数の引数が要素ではなくリストを使えるところが違い。

### 累積和

累積リストができると、Enum.mapの第2引数に与える関数をリストに対する関数を与えることができ、1, 1+2, 1+2+3, ... のような項目数が一つずつ増えた数列の和を返すことができる。

```elixir
1..10
|> build_cumulative()
|> Enum.map( fn list -> Enum.reduce(list, fn x, acc -> acc + x end) end)
#[1, 3, 6, 10, 15, 21, 28, 36, 45, 55]
```

> **[別解]**
> `1..10 |> Enum.scan(fn x, acc -> acc + x end) `

### 階乗

階乗も項目数を1つずつ増やした数列の積のリストとして得ることができる。

```elixir
1..10
|> build_cumulative()
|> Enum.map( fn list -> Enum.reduce(list, fn x, acc -> acc * x end) end)
#[1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]
```

> **[別解]**
> `1..10 |> Enum.scan(fn x, acc -> acc * x end) `


### フォルダ階層

フォルダ階層も、親の階層から順に子、孫、ひ孫の階層のフォルダの絶対パスにすることができる[^2]。

```elixir
["c:","User","Doe","Documents"]   
|> build_cumulative()  
|> Enum.map( fn list -> Enum.join(list,"/") end)  
#["c:", "c:/User", "c:/User/Doe", "c:/User/Doe/Documents"]
```

> **[別解]**
> `["c:","User","Doe","Documents"] |> Enum.scan(fn x, acc -> acc <> "/" <> x end) `

### 複数階層からの絞り込み

組織階層の途中のノードで絞り込みを行う。

```elixir
[
  ["ABC株式会社", "D事業部", "E部", "F室"],
  ["ABC株式会社", "D事業部", "E部", "G室"],
  ["ABC株式会社", "H事業部", "J部", "K室"],
  ["ABC株式会社", "I事業部", "L部", "M室"]
]
|> Enum.map(fn hierarchy -> build_cumulative(hierarchy) end)    
|> Enum.map(fn hierarchy_list -> Enum.filter(hierarchy_list, fn list -> Enum.any?(list, fn x -> x == "E部" end) end) end)
|> Enum.filter(fn hierarchy_list -> hierarchy_list != [] end)    
#[
#  [
#    ["ABC株式会社", "D事業部", "E部"],
#    ["ABC株式会社", "D事業部", "E部", "F室"]
#  ],
#  [
#    ["ABC株式会社", "D事業部", "E部"],
#    ["ABC株式会社", "D事業部", "E部", "G室"]
#  ]
#]
```

[^1]:定義が見当たらなかったため、本記事内のみで通用する定義。
[^2]:もともとのモチベーションはこの用途
[^3]:Enum.scanの利用をご教示いただき感謝
【新卒・中途・未経験必見！！】コピペで使える先輩エンジニアへの質問テンプレート集

# 概要
歴1年3ヶ月のエンジニアです。
今回は、1年3ヶ月で溜め込んだ先輩エンジニアへの質問テンプレートを公開したいと思います👏
テンプレートの収集を始めたきっかけは、自分自身ソフトスキルが弱く、相手に自分の考えを伝えられず落ち込んでいました。
その対策として「上手い人の真似よう」という考えに至り、これいいなと思ったものはテンプレート化し、いつでも使えるようにしています。
自分と同じように悩んでいる方はぜひ、ご参考にしてください!!
※5分で読めます。

# テンプレート集
## 実装相談
```
### チケット名

* ＜リンク等＞

### 実装内容

* どんな実装をしたいのか

### 課題 

* 実装で詰まっているところ

### やったこと

1. 〇〇
2. 〇〇

調べた記事
＜リンク＞
```

エンジニアなりたての頃、１番使っていたテンプレートですね！
このテンプレートを使って頭の中で整理してから、先輩に相談することが多かったです。
書いているうちに解決することもありました！笑

## スケジュール相談
```
### チケット名

* ＜リンク＞

### 元々の期日→変更後の期日

* MM/DD → MM/DD

### 理由

* 原因
    * 結果

※例

* 実装途中で考慮漏れ・バグを発見した
    * 対策に+1日はかかりそう


 ### 全体のスケジュールに影響があるか？

* Yes or No

＜Yesの場合＞

* どれくらい影響があるのか？

```
初めのうちは見積もりがうまくできず、よく延長していました💦
1番やってはいけないことは、**期日が過ぎてから延長依頼をすること**です。
タスクの期間にもよりますが**期日の2-3日前**にはこのテンプレを使って上長に報告できると「こいつちゃんと報告できるな！」と思われます。（主観）

## 仕様・デザイン相談
```
### チケット名

* ＜リンク＞

### 内容の種別

* 考慮漏れ（新規追加）/修正/改善提案

### 内容の詳細

* 

### 自分なりの考え

```
実装している中で必ず、「この仕様どうなんだ？」「このデザイン少しわかりづらいような」ということは多々起きます。
このテンプレを使用して相談することで、**端的**に相談内容を伝えることできます。
**端的**というのは、相手の読解の負荷をさげ、コミュニケーションのラリーを減らすことができる非常に重要なワードです。
テキストコミュニケーションでは、考える時間はたくさんあるのでより端的な文章を目指しましょう！
何か相談事を文章化するとき、15分はかけています。

## タスク完了報告
```
### チケット名

* ＜リンク＞

### デプロイURL 

* ＜リンク＞

### リポジトリURL 
※存在する場合

* ＜リンク＞

### 希望日時

* MM/DD（曜日）


```
会社によって報告の仕方はバラバラだと思いますが、自分はこのテンプレが一番しっくりきました。
基本は社内のテンプレに合わせるのが良さそうですね。


## MTG開催告知
```
@メンション
※~~についてご相談したいです。
### 報告会の趣旨

1. 
2. 


### 日時
00/00(曜日) 00:00~00:00

### アジェンダ

1. 
2. 


### その他
※MTGまでに相手にしてほしいこと

```
大きなMTGを開くときは、大体上長もいます。
失礼のないようフォーマットを用意しています！

# 最後に
よく使うテンプレート集は以上になります😆
テンプレートにしておくと、テキストコミュニケーションではなく口頭での会話でも役立ちます。
何回も使うとなんとなく覚えてくるのですが、頭に入っているということは**会話の中でもテンプレ通りに話せる**ということです。人と話すときオドオドしてしまうタイプの方には　特におすすめなのでぜひ使ってみてください👋

### PS
私が就業している[PRUM](https://www.wantedly.com/companies/company_8173074)ですが、未経験からエンジニアになった方がたくさんいます！
ご興味ある方はぜひ！
また、個人開発もしています！
サイト少しでも覗いていただけると嬉しいです😄
https://girlsbar-cabalet.com
![ガルバとキャバ (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1798471/bd8294df-d7ff-ca4a-973d-b860ed2195bb.png)