OmniAICreator/Qiita-1.07M huggingface dataset:
既にGitで追跡済みのファイルはgitignoreで除外されない話

## はじめに

Git管理対象外にしたいファイルやディレクトリを `.gitignore` に記載することで実現することができます。
しかし、先日 `.gitignore` に指定してもGit管理対象外とならなずに躓いたため、その共有です。

## 結論

何が原因でGit管理対象外とならなかったかというと、既にコミット(またはステージング)済みのファイルを管理対象外としようとしていたためでした。

少し考えたら当然ですが、既にGitで追跡済みのファイルに対しては `.gitignore` に指定しても効力がないらしいです。

[gitのドキュメント](https://git-scm.com/docs/gitignore)に以下のような記載がありました。

> A gitignore file specifies intentionally untracked files that Git should ignore. Files already tracked by Git are not affected; see the NOTES below for details.

## 実験

実際に手元で挙動を色々確認してみます。

次の３種類の状態のファイルを `.gitignore` に指定した時の振る舞いをみていきます。

```sh
> tree .
.
├── added.txt      // ステージング状態だが、まだ一度もコミットしていないファイル
├── committed.txt  // 既にコミット済みのファイル
└── not_added.txt  // 一度もコミットもステージング状態にもしていないファイル
```

```sh
> git status
On branch gitignore-demo
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   added.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        not_added.txt
```

これらファイルを `.gitignore` に追加します。

```txt:.gitignore
added.txt
committed.txt
not_added.txt
```

この状態で `git status` で状態を見ると以下となりました。

```sh
> git status
On branch gitignore-demo
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   added.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   .gitignore
```

`not_added.txt` は管理対象外となりましたが、一度ステージングした `added.txt` はしっかり管理下にいます。

`git reset HEAD` でステージングされている `added.txt` をステージング前の状態に戻すとどうなるか試してみます。

```sh
> git reset HEAD
Unstaged changes after reset:
M       .gitignore
```

```sh
> git status
On branch gitignore-demo
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   .gitignore

no changes added to commit (use "git add" and/or "git commit -a")
```

きちんと管理対象外になりました。

次に一度コミットされている `committed.txt` を編集して、状態を確認してみます。

```sh:修正後のgit status
> git status
On branch gitignore-demo
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   .gitignore
        modified:   committed.txt

no changes added to commit (use "git add" and/or "git commit -a")
```

一度Gitで追跡しているので、 `.gitignore` で指定していても除外されません。

### 既に追跡済みのファイルを除外する

先ほどのような、既にGitで追跡しているファイルをGit管理対象外にしたい場合は以下コマンドを実行して、キャッシュを削除します。

```sh
> git rm --cached committed.txt
```

キャッシュ削除後の状態は以下となります。

```sh
> git status
On branch gitignore-demo
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    committed.txt

no changes added to commit (use "git add" and/or "git commit -a")
```

この変更をコミットすれば `committed.txt` は管理対象外となりました。

## 参考

- [gitignore の除外が反映されない時の対処方法](https://www-creators.com/archives/6144#gitignore)
【Ruby】入力された住所からエリアを抜き出す方法【正規表現】

# 目的
[チェリー本](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4774193976)と下記記事で正規表現を勉強しました。

[初心者歓迎！手と目で覚える正規表現入門・その１「さまざまな形式の電話番号を検索しよう」 - Qiita](http://qiita.com/jnchito/items/893c887fbf19e17d3ff9)

勉強した内容のアウトプットのため、記事を書きます。

# 目標

入力された住所（`〇〇県〇〇市〇丁目X-X`）から、エリア（`〇〇県〇〇市`もしくは`〇〇市`）だけを表示させたい場合の正規表現を考えます。

# 結論と解説
結論と解説を記載します。
実際に動かしたい方は[Rubular](https://rubular.com/)を使ってみてください。

また、今回は住所を`address`という変数に代入して、その変数に対して`[]`で出力しています。
他にも`address`に対して`slice`を使ったりして文字列を抜き出せますが、そこは冒頭で紹介したチェリー本で勉強してください。

## 〇〇県〇〇市　を抜き出す場合
住所から「〇〇県〇〇市」を抜き出す正規表現は、`.+[市区町村]`です。

```ruby
address = "群馬県前橋市1-2-3"
address[/.+[市区町村]/]
#=> 群馬県前橋市

address = "長野県阿智村一丁目4-5"
address[/.+[市区町村]/]
#=> 長野県阿智村
```
解説します。
`.+`「一文字以上の任意の文字列」を意味しています。ここが〇〇県〇〇までを表します。
`[市区町村]`「市区町村のうちのどれか」を意味しています。
`?:`今回はキャプチャする必要がないので、or条件で使用した()につけます。

## ある県内の市区町村名を抜き出したい
ある県内の市区町村名を抜き出す場合の正規表現は`(?<=〇〇県).+[市区町村]`です。
〇〇県の部分は任意の都道府県名を入れてください。
今回は東京都にしました。
```ruby
address = "東京都渋谷区1-2-3"
address[/(?<=東京都).+[市区町村]/]
#=> 渋谷区

address = "東京都東村山市一丁目4-5"
address[/(?<=東京都).+[市区町村]/]
#=> 東村山市
```
解説します。
`(?<=東京都)`「東京都」という文字列に対して**肯定の後読み**をします。これにより抜き出す文字列のスタート位置を決めます。
`.+`「一文字以上の任意の文字列」を意味しています。
`[市区町村]`「市区町村のうちどれか」を意味しています。

ここで勝手にポイントだと思っているのが、**東村山市**の2文字目の**村**で切れていない点です。
`+`が**貪欲なマッチ**である点を逆に利用しました。

:::note warn
こちらの方法だと、市区町村以降に「市区町村」を含む地名の場合、集落名まで含んでしまうとご指摘を頂きました。ごもっともです。
より厳密な方法として、頂いた[コメント](https://qiita.com/ysk91_engineer/items/def4f01d498fe72e160c#comment-dffd42adbc1f6725ae99)を参照して頂けると幸いです。
:::

# まとめ
今回は自分が勉強した内容をまとめました。
正規表現を知る前は住所からエリアを抜き出す方法が分かりませんでしたが、勉強することで自分なりの解決方法が分かりました。
ネットワーク構築 #3(Internet)

# 今回の内容
･ルーターをInternetに出られるようにする設定
･実施日:2022/07/10～2022/07/28

# 状態
現在のネットワークの環境は以下の通りです。
R0はプロバイダからレンタルしているルーター(設定はデフォルトのまま)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516251/4fe941fd-2082-64fe-fdd1-44aaf3956545.png)


R1からGoogle(8.8.8.8)へはpingが通りますが、R2とR3はGoogle(8.8.8.8)へpingが通りません。
また、R0のポートから接続しているPCからR2とR3へpingを打っても通りません。

R1からR3はOSPFで3台ともエリア0で設定しています。
R1にdefault-information originate alwaysコマンドを設定しています。
tracerouteを実行しても外部へ行ったまま戻ってきません。
R1からR3のpingは疎通が通ります。

# 原因
tracerouteを実行すると、R0から外に行ったまま戻って来ない理由を検証しました。
調べたり、社内の人に相談するとR0に原因があるんじゃないかと･･･。
プロバイダから借りているルーターにスタティック設定が出来るため、各セグメントを登録してpingを実行・・・。
すると、今まで通らなかったpingが即時応答で返って来てくれました。

今回の課題はクリアしましたので、ここまで。
【Ruby】GemをGitHub Packagesに公開する

## 前提条件
* RubyGems v2.4.1 以降である
```:ターミナル
  $ gem --version 
```

* bundler v1.6.4 以降である
```:ターミナル
  $ bundle --version
```


## パーソナルアクセストークンの設定
GitHub Packagesに公開などをするには認証が必要です。  
以下の手順でパーソナルアクセストークンの設定をします。  

GitHubのSettingsページを開きます。
![image220730_080233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/14c246e6-70d9-7fd7-3d05-0155e24eeb20.png)

左サイドバー一番下の「Developer settings」を選択します。
![image220730_080909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/4e5c8cff-a85e-98b6-c83b-d5e379ba535f.png)

左サイドバーの「Personal access tokens」を選択します。
![image220730_081141.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/066fa4c1-de28-efb4-857c-e306db42bc4d.png)


「Generate new token」を選択します。
![image220730_081329.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/a2978e2c-1fd3-5caa-381a-98748e3f5f3a.png)


「Note」にわかりやすい名称を入力します。
![image220730_081453.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/19690a42-56b8-d8e6-f337-c9f4a96dad66.png)


「Select scopes」で「repo」と「write:packages」を選択します。
![image220730_081711.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/ac65a36e-a0f2-f8bd-407d-b3a66e24f1bb.png)

「Generate token」をクリックします。
![image220730_081643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/0ac81b28-5b93-9499-bbb2-96ce63a8f99f.png)

パーソナルアクセストークンが作成できました。

`~/.gem/credentials`を以下の内容で作成します。
```~/.gem/credentials
:github: Bearer 作成したトークン
```
```:ターミナル
$ chmod 0600 ~/.gem/credentials
```

## Gemを公開する
以下のコマンドを実行してGemをGitHub Packagesに公開します。
パッケージをビルドします。
```:ターミナル
$ gem build sample-gem.gemspec
```

GitHub Packagesに公開します。
```:ターミナル
$ gem push --key github \
--host https://rubygems.pkg.github.com/リポジトリを所有するユーザー名 \
sample-gem-0.0.1.gem
```
上記`sample-gem-0.0.1.gem`は実際の`.gem`ファイル名に置き換えてください。

公開されているかGitHubで確認します。

![image220730_084651.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/92f134f7-c7bd-e444-03f3-25fbb59cfb26.png)


## Gemをインストールする
上画像のパッケージ名をクリックするとインストール方法の記載されたページが表示されます。
![image220730_084831.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/d517264d-4b39-c26c-99ba-6dc0712e4508.png)


このページの説明に従いインストールします。
Android で端末の充電状態を監視するようにした話

## はじめに

バッテリーの充電状況を取得するための備忘録メモとなります。
その他、BatteryManager では電池残量やバッテリーの状態などを得ることができます。

> Android Developers Reference

[BatteryManager](https://developer.android.com/reference/android/os/BatteryManager)

> サンプルソース

- GitHub
[simple-battery-android](https://github.com/ngkr327/simple-battery-android)

## BroadcastReceiver をマニフェストに登録

AndroidManifest.xml に以下を追加します。

```
<receiver android:name=".PowerConnectionReceiver"
    android:exported="false">
    <intent-filter>
        <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
        <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
    </intent-filter>
</receiver>
```

## 充電状態の変化を監視する

```Kotlin
// Kotlin
class PowerConnectionReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context?, intent: Intent?) {
        val status = when(intent?.getIntExtra(BatteryManager.EXTRA_STATUS, -1) ?: -1) {
            BatteryManager.BATTERY_STATUS_CHARGING -> "充電中"
            BatteryManager.BATTERY_STATUS_DISCHARGING -> "放電中"
            BatteryManager.BATTERY_STATUS_FULL -> "充電完了"
            BatteryManager.BATTERY_STATUS_NOT_CHARGING -> "未充電"
            BatteryManager.BATTERY_STATUS_UNKNOWN -> "UNKNOWN"
            else -> "不明"
        }
    }
}
```
Typescriptのexhaustiveness checkがtsconfigのnoUnusedLocalsオプションに引っかかる

## 要約
[Typescriptの`never`型を用いたexhaustive check](https://www.typescriptlang.org/docs/handbook/2/narrowing.html#exhaustiveness-checking)で型エラー検知用の変数を使わない時に`'変数名' is declared but its value is never read.`のエラーが出る場合、tsconfigの`noUnusedLocals`オプションが有効になっていないかを確認するべき。

## Typescriptのexhaustiveness checkとは
Typescriptのunion型に種類を追加した時、`never`型を用いて既存のif文やswitch文で対応漏れが発生していないかをチェックする[`exhaustiveness check`](https://www.typescriptlang.org/docs/handbook/2/narrowing.html#exhaustiveness-checking)というテクニックがあります。

```ts
// Typescriptの記事より引用
// https://www.typescriptlang.org/docs/handbook/2/narrowing.html#exhaustiveness-checking
interface Circle {
  kind: "circle";
  radius: number;
}
 
interface Square {
  kind: "square";
  sideLength: number;
}

type Shape = Circle | Square;
 
function getArea(shape: Shape) {
  switch (shape.kind) {
    case "circle":
      return Math.PI * shape.radius ** 2;
    case "square":
      return shape.sideLength ** 2;
    default:
      // 例えば、shape.kindに"triangle"が増えた場合、上のcase文を増やさないと
      // ここに到達する可能性が出てくるため、never型と不整合が生じ型エラーが起きる
      const _exhaustiveCheck: never = shape;
      return _exhaustiveCheck;
  }
}
```

## 問題と解決
このテクニックでは型検知用の変数を定義してそれをreturnしているが、それはあくまで検知用なので使いたくない場合がある。
例えば上記では`_exhaustiveCheck`をランタイムで返すと挙動がおかしくなるので`undefined`を返したいなど。
自分があるプロジェクトでそれをやろうとした時、`'_exhaustiveCheck' is declared but its value is never read.`というエラーが出てしまい、最初はLinterのエラーかと思って[ESLintの`no-unused-vars`](https://eslint.org/docs/latest/rules/no-unused-vars)を消すなどして時間を消費してしまった。
結果的に、tsconfigで`noUnusedLocals`オプションがオンになっていたためtscエラーを起こしていたというオチだった、、、
このtscのエラーは`// @ts-ignore`アノテーションを付与することにより回避できるが、その場合exhaustiveness checkもignoreされて本末転倒な感じになってしまう。このテクニックを使いたいならTypescriptの`noUnusedLocals`オプションはオフにしてeslintの`no-unused-vars`に移行した上で`// eslint-disable-next-line`するのがいいと思う。
KaggleのJPXコンペをエラーで終えて

エラー出ましたね。
Privateで参加者の4割程度がエラーとなっており、自分も御多分に洩れずその一員となっています。

エラーが頻出した原因として、デリストの可能性が指摘されています。自分も、**毎回のイテレーションで受け取るデータの銘柄数が2000より少なくなった場合はエラーが出る**と思います（これが原因ではないかもしれませんが）。というか、そもそも受け取るデータによってエラーが出る可能性が高いだろうということは、サブミ前に分かっていたんですね。

### なぜ対策しなかったか？
サブミでエラーが出なかってので、「まあええやろ」と手を抜いてしまったんですね。
本来であれば、何回もアップデートしてくれたsupplementalファイルをカットしてイテレートし、Privateを模擬して本当にエラーが出ないか確認すべきでした。


### なぜ対策しなかったのか？？
ええ、そう、面倒くさかったんです。

コンペの過程では、誰しもどこかで妥協の悪魔と出会います。このデータは多分効かないから検証しなくていいやろ。うーん、こっちもやったほうがいいけど面倒やなぁ。

でもこういうのって、コンペが終わってからふとやってみると劇的にパフォーマンス改善したりするんですよね、そして、なぜあのとき検証をやりきらなかったか、後悔する。あるあるだと思います。

今回のコンペではアルファを探すためにこれまでにないくらい探索しました。オプションデータを単体でディープラーニングにかけたくらいです。
ですが、**今回はどうやら一番大切なところで手を抜いてしまっていたみたいです**。

### 全ては経験
タイムシリーズAPIに関するTipsの記事を読んだことはありますが、やはり体験しないと身に付かないですね。そして、その失敗をしっかりと記録しておかなければ、また同じ失敗を繰り返します。

偶然エラーが出なかった人も多いでしょうが、中にはきっちりと作り込んでPrivateエラー対策をしていた人もいるでしょう。そういう人に敬意を払い、この結果は受け入れるべきだと思います。

皆様、対戦ありがとうございました。
javascriptで let instance=await new myClass(); ってしたい



適当な非同期処理(Promise)
```js
async function waitNsecond(n){
	return new Promise(function(resolve,reject){
		setTimeout(resolve,1000);
	});
}
```
type1
```js
// set super class
var SUPER=Array;
// define async constructor
async function constructor(...args){
//	console.log(this);
	SUPER.call(this);
	this.push(...args);
	await waitNsecond(1);
}
// define async generate class
function myAsyncClass(...args){
	if(new.target){
		return new Promise(async function(resolve,reject){
			let instance=Object.create(myAsyncClass.prototype);
			await constructor.call(instance,...args);
			resolve(instance);
		});
	}
}
// set prototype
myAsyncClass.prototype=Object.create(SUPER.prototype);
Object.defineProperty(myAsyncClass.prototype, 'constructor', { value: myAsyncClass, enumerable: false, writable: true });
// define method
myAsyncClass.prototype.printAll=function(){ console.log(this.join()); };
```
type2
```js
class myAsyncClass extends Array {
	constructor(...args){
		super();
		let instance=this;
		return new Promise(async function(resolve,reject){
			instance.push(...args);
			await waitNsecond(1);
			resolve(instance);
		});
	};
	printAll(){
		console.log(this.join());
	};
}
```
結果
```js
let instance=await new myAsyncClass(5,6,7,8,9);
instance.constructor===myAsyncClass;
instance.printAll();	// 5,6,7,8,9
```
だいぶ雑だけど基本はこんな感じでいける。かなぁ...
Data Connector for Salesforce

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


+ [スプレッドシートの Salesforce データを簡単に更新](https://workspaceupdates.googleblog.com/2019/02/salesforce-data-connector-refresh.html)
+ [Data Connector for salesforceのAuto Refreshの基準時間を変更したい](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JdxBPSAZ)
+ [Data connector for Salesforceの条件が保存できないか](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UrwBoSAJ)


# MFAの設定が影響している?

+ [Data Connector for Salesforceでレポート連携時、行数制限（2000行）が起きてしまう](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000E9qNXSAZ)
+ [Auto-refresh sync error in Salesforce data connector for Google Sheet](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000ISliISAT)

関係ないみたい。障害かな

+ [Auto-refresh sync error in Salesforce data connector for Google Sheet](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000ISliISAT)

# 共有設定時の注意

+ [Data connector for Salesforce使用時のセキュリティ](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000QLJCR)

# The selected primary key column is not a valid ID. Please check the column name or choose another one

+ [Salesforce ConnectorでDeleteができない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007akSiC)

:::note
レポートの列ラベルを”Id”（大文字のI 小文字のd）に設定したら、SpreadSheetからDelete操作ができました。

カスタムオブジェクトの場合、標準レポートでは"オブジェクト名: ID"という列ラベルのため、カスタムレポートタイプを作成してラベル名を"Id"に変更する必要がありました。

列名がオブジェクトの項目名と完全一致しないと認識されないのかな？という感じです。
標準オブジェクトは扱いが違うのか、取引先責任者の場合、標準レポートのラベル名" 取引先責任者 ID"もしくは"Id"ならDelete可能ですが、" 取引先責任者ID"は不可でした。
:::
STM32G031J6M6(32kb)に64kb書き込んで遊ぶ


x 自己責任て言う意味がわかる人むけ


目的
ただのテスト

STM32CubeProgrammerでコネクトしてSizeをffffにする
なんか書いてリターン

![o_con601.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/895d4c00-1b07-b523-7d90-d279295fef78.jpeg)


いろいろ

mbedでも動いたよ


https://qiita.com/caa45040/items/3686753c90e7e85ea7e4
Dockerがやっぱり苦手（vオプション）

というお話です。
ぶっちゃけ慣れてる人からすると「なんだあ、てめぇ」案件でしょうが私は本気で苦手です。
苦手なのですぐ頭が忘れようとするため、残す意味合いで書きます。

## dockerの-vオプションが使えなく困った
簡単にまず、vオプションの概要を説明（間違っているかもしれない）をすると
` docker上で管理しているフォルダ（の対象部分）をローカルのフォルダと対応させる `
感じだと思います。
別にvオプションじゃなくてもDockerfileに書き込んでおけば、立ち上げ時に自動でつながるそうですが...（セッシャヨクワカラナイ）

という事で今回の目標はvオプションを使った動機です。

## 結局何で詰まったの？
私、windows用のdockerを用いておりまして、windowsだとフォルダを指定するときに、区切りは \ であらわされます。
ここで詰まっておりました。

## 構成
```
APP
|-docker-compose.yml
|-Dockerfile
|-requirements.txt
```
場所はどこでもよいです。
```Dockerfile:Dockerfile
FROM python:3

ENV PYTHONUNBUFFERED 1

RUN mkdir /code

WORKDIR /code

ADD requirements.txt /code/

RUN pip install -r requirements.txt

ADD . /code/
```
```docker-compose.yml
version: '3'

services:
  app:
    build: .
    command: python manage.py runserver
    depends_on:
      - db
  db:
    image: mysql:5.7
```
```requirements.txt
Django
```
上記3種類のファイルが必要になります。
上記ファイルが準備できれば後は実行していくだけです。

## 実行コマンド、流れ
全体の流れは以下のとおりである
```
Ⅰ　imageの作成（build)
Ⅱ　コンテナの作成（run）
Ⅲ　ローカルからexecコマンドによってdjangoの立ち上げ（django-admin）
```
とりあえず作成流れを把握するため、非常に単純な立ち上げです。
実行した実際のコードは以下のとおりである。
```git:コマンド
docker build -t test .
docker run -itd -v C:/~~/~~/~~/Todo_app:/code --name django-test-3 test
docker exec django-test-3 django-admin startproject test .
```
~~の部分はフォルダ名を入れてほしい（各個人によって変わります）
build時に「-t」オプションをつければimageに名前を付けれます。
-vオプションの後ろが
` ローカル:ドッカー上 `
のように書いて紐づける。
（紐づけることで後に行うstartprojectで作られるフォルダが
ローカルに反映されたりする）
ちなみにdjango-test-3はコンテナ名です。なので、自由に変更可能です。

## まとめ
多分ほかの人より一番簡単な環境を作れたと思います。
（もっとも初心者向けでしょう！！）
windowsでdocker使ってみたいなあ、という人は一度お試しください
（WIP）プロジェクトドキュメントをプレーンテキストで管理できるツールまとめ

プロジェクトドキュメントをプレーンテキストで管理できるツールまとめました。
コメント等で情報をいただければ適宜更新していこうと思います。

## ツール

### [MkDocs](https://www.mkdocs.org/)

https://www.mkdocs.org/

個人的にとても気に入って使ってるプロジェクトドキュメント管理ツールの一つ。
書き方が直感的で覚えやすくて皆んなに書いてもらいやすいツールだなー、と思っております。

特にマテリアルデザインに対応した Material for MkDocs と組み合わせて使うのが好き。

https://squidfunk.github.io/mkdocs-material/

今の会社ではMkDocsで３つくらい管理してる。

### [Sphinx](https://www.sphinx-doc.org/en/master/)

https://www.sphinx-doc.org/en/master/

[Pythonのドキュメント](https://docs.python.org/3/)でお馴染みのやつですね。
sphinx_rtd_themeがよく使われている印象。

↓こんなん↓（例：[ｐｈｐMyAdmin](https://docs.phpmyadmin.net/en/latest/)）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265758/46feb336-e7da-0703-ba26-bebbcb4a6abe.png)

やっぱりPython系が多いですが、いろんなプロジェクトで使われてますね。

https://www.sphinx-doc.org/ja/master/examples.html

ただ MkDocs に比べて書き味が悪かったので見送りました。(ただの個人的感想です）

### [Pandoc](https://pandoc.org/MANUAL.html)

公式
https://pandoc.org/MANUAL.html

日本語版（by　日本ユーザーグループ）
https://pandoc-doc-ja.readthedocs.io/ja/latest/users-guide.html

### [Jekyll](http://jekyllrb-ja.github.io/)

http://jekyllrb-ja.github.io/

GitHubページでお馴染みのやつ。使ったことはない。

### [Hugo](https://gohugo.io/)

https://gohugo.io/

知らなかった。ドキュメント生成ツールというよりはHPとかの作成に向いてそう。

### [Read the Docs](https://readthedocs.org/)

https://readthedocs.org/

これも知らなかった。要調査。

### [DockFx](https://dotnet.github.io/docfx/)

https://dotnet.github.io/docfx/

無限に出てくるなー。

### [docsify](https://docsify.js.org/#/)

https://docsify.js.org/#/

T.B.D

### [VuePress](https://vuepress.vuejs.org/)

https://vuepress.vuejs.org/

T.B.D

### [Pelican](https://docs.getpelican.com/en/latest/)

https://docs.getpelican.com/en/latest/

ん？これSphinxじゃね？

### [Docute](https://docute.egoist.sh/)

もはや静的サイトジェネレーターではなくなってしまった。

## 比較表

T.B.D
curlの代わりにHTTPieを使う

Linuxだとほぼ標準でcurlが入ってるけど、Windowsだとインストールがちょっと面倒くさい。なのでよく使うのがHTTPieです。
Pythonが入っている環境だとインストールはとっても簡単。

`pip install httpie`

JSONをリクエストボディに入れてPOSTする場合は下記のようにする

`http POST http://xxxx/xxx foo=10 bar=20`

こうするとリクエストボディは下記のように解釈される。

```json: sample
{
    "foo": 10,
    "bar": 20
}
```

複雑な構造をもつJSONもファイルにしておけばもちろんPOST可能。

```sh:sample
# For Bash
$ http POST http://xxx/xxx < req.json

# For Powershell
$ Get-Content req.json | http POST http://xxx/xxx
```
「A Tour of Go」 の Exercise: Loops and Functions を解きました

GCが標準で備わっていてかつ高速な言語を使えるようになりたいと思い、Goに入門。公式のチュートリアル「[A Tour of Go](https://go-tour-jp.appspot.com/list)」を読み進めています。その中に練習問題がいくつか用意されています。当記事は、関数に関する練習問題「[Exercise: Loops and Functions](https://go-tour-jp.appspot.com/flowcontrol/8)」を解いた記録です。

# コード
```go
package main

import (
	"fmt"
)

func Sqrt(x float64) float64 {
	z := 1.0
	for i := 0; i < 10; i++ {
		z -= (z*z - x) / (2 * z)
	}
	return z
}

func main() {
	fmt.Println(Sqrt(2))
}
```

# 解説
## コード
用意された関数を任意回ループするだけなので簡単です。このアルゴリズムはA Tour of Go で紹介されている通り、「ニュートン法」に基づくものです。
## ニュートン法
ニュートン法は以下の式で与えられ、近似的に解を導出できます。
```math
x_{n+1} = x_{n} - \frac{f(x)}{f'(x)}
```
今回求めるxの平方根をzとします。すると考えればよい関数が以下に定まります。
```math
f(z) = z^{2} - x
```
zはxの平方根なので
```math
z^{2}=x
```
すなわち
```math
z^{2} - x = 0
```
となるようにしたいわけです。つまり
```math
f(z) = 0
```
ですから、これはf(x)の解に他なりません。
f(x)の一階微分f'(x)を導出しておきましょう。
```math
f'(x) = 2z
```
少し手計算してみます。A Tour of Goにある通り
```math
z_{0} = 1.0
```
とします。
```math
\begin{align}
z_{1} &= z_{0}-\frac{f(z_{0})}{f'(z_{0})}\\
&=1.0 - \frac{-1}{2}\\
&=1.5
\end{align}
```
```math
\begin{align}
z_{2} &= z_{1}-\frac{f(z_{1})}{f'(z_{1})}\\
&=1.5 - \frac{0.25}{3}\\
&≒1.416666666
\end{align}
```
第3項目で小数点第2位まで期待の値になりました。

# 最後に
コード自体は簡単でしたが、ニュートン法はそれなりに高度なアルゴリズムみたいです。次元次数共に２なので簡単？でしたが、もっと高次元にも適用できるようです。
【自作Cコンパイラ】【x86-64】コード生成におけるアセンブリの理解(1)

# 参考サイト
[こちら](https://www.sigbus.info/compilerbook)のサイトを読んで自作コンパイラの制作を勧めています。
制作を勧めていく中で、メモしておきたいことをまとめました。
今回はコード生成におけるアセンブリの理解です。

# コード生成
### 除算
```c:codegen.c
case ND_DIV:
      printf("  cqo\n");
      printf("  idiv rdi\n");    //RDIは割られる値
      break;
```
idiv ➔ 符号あり除算を行う命令
x86-64のidivの仕様
暗黙のうちに、RDXとRAXを取り、その2つを合わせたものを128ビット整数とみなす。
その整数を引数のレジスタ（今回はRDI）の64ビットの値で割り、商をRAX、余りをRAXにセットする、という仕様。
RDXとRAX(128bit) / RDI(64bit) = RAX(商)  RAX(余り)
cqo命令を使うと、RAXに入っている64ビットの値を128ビットに伸ばしてRDXとRAXにセットする。

### 等号
```c:codegen.c
case ND_EQ:
      printf("  cmp rax, rdi\n");
      printf("  sete al\n");
      printf("  movzb rax, al\n");
      break;
```
#### cmp
x86-64のcmp命令の結果はフラグレジスタにセットされる。
cmp命令はフラグレジスタの全フィールド(ZFやOFなど)を更新する。
更新するフィールドは命令によって違う。

#### sete
ZFの値が１のとき(値が0であるとき)にALに1をセットする。
それ以外の場合は0をセットする。

#### movzb
seteがALに値をセットすると自動的にRAXも更新されることになるが、
RAX全体に0か1をセットしたい場合は上位56ビットをゼロクリアしなければならない。
それを行うのがこの命令。
ALはRAXの下位8ビット。

# 成果物
自分の成果物はこちらに上げています。
https://github.com/rei0515reten/recc
開発環境からHTTPSで接続できない

### 接続できない理由は他のブログなどでも言われている内容と同じ

```
curl: (60) SSL certificate problem: unable to get local issuer certificate More details here: http://curl.haxx.se/docs/sslcerts.html
```

これだった。
https://japan.zdnet.com/article/35177496/

### 解決は・・・

開発環境で以下を実施した
```
sudo yum update ca-certificates
```

### やりたかったことは

APIサーバ＝がHTTPSであり、開発環境を使ってAPIサーバーから情報を取得したかった。

### 経緯

恐らくは上記の内容であろうことは検討がついていたが、上記が問題であると確定させる方法が不明だった。

開発環境のサーバーは、Amazon linux 2　であり、APIサーバーは又別に存在している。

まず、先駆者が書いてくれている情報から証明書の問題であることはわかるが、それがAPIサーバー側で必要なことか開発環境で必要なことかがわからなかった。
しかし、ローカル環境からはAPIサーバーに対してHTTPSでの通信が行えていることから開発環境が問題であることは分かった。

そこで更に、開発環境で本当に証明書が悪いという点を確認したかったので方法を探した。

結果的に以下の方法で該当したため、証明書が悪いと判断した。

開発環境に接続し、
`trust list | grep -C3 'DST Root CA X3'`
そして何が表示されるかを確認した。
```
pkcs11:id=%a8%e3%02%96%70%a6%8b%57%eb%ec%ef%cc%29%4e%91%74%9a%d4%92%38;object-type=cert
    type: certificate
    label: DST Root CA X3
    trust: anchor
    category: authority
```
何も表示されなければOKとのことだった。

書いている最中に参考になる記事が他にも無いか確認したところ、こっちのほうが参考になりそうだった。
https://iret.media/51301
https://www.yukkuriikouze.com/2020/12/27/4085/

下記を使うことで、SSL証明書の内容を調べることが出来るようだ。
```
openssl s_client -connect foo.bar.com:443 < /dev/null 2> /dev/null | openssl x509 -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            04:e3:91:24:eb:0e:28:a7:9e:e7:84:ac:b4:65:8d:4d:b9:c7
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
        Validity
            Not Before: Oct 26 13:34:11 2019 GMT
            Not After : Jan 24 13:34:11 2020 GMT
:
```

### 余談

yum list installed
でパッケージを確認できる。
これで表示されたバージョンが以下だった。
`ca-certificates.noarch  2019.2.32-76.amzn2.0.3   installed`

これが問題になるのか分からなかった。

よくわからないながら実施したことだったが、yumがインストールされていない、使えない状況の場合は、
クロス署名されたLet’s Encryptの中間証明書を取得してシステムに組み込むという対応が正しいのだろう。

結局解決できているが詳しいことが理解できていない。
EC2インスタンスの場合はLet’s Encryptが使われているのだろうが、本番環境も同じという考えでいいのか、この辺りは未だ勉強する必要がある。
Azure Machine LearningのvCPUクォータの引き上げ申請方法


Azure Machine Learningではコンピュータリソース毎にvCPUの制限が掛かっており、使いたいリソースの上限が0になっている場合や上限に引っかかって使えない場合は、サポートへ連絡してクォータを引き上げる必要があります。今回はそのvCPUクォータを引き上げるための申請方法に関して解説します。

推論用GPUクラスターとして「NCv3 シリーズ」を使いたい場合を考えてみましょう。

https://docs.microsoft.com/ja-jp/azure/virtual-machines/ncv3-series
# クォータの確認
Azure Machine Learning Studioにアクセスし、[コンピューティング]->[コンピューティング クラスター]->[新規]をクリック。
![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/f8017fde-ed97-2e16-f040-7b30398792e1.png)
場所は「Japan East」バーチャルマシン層「専用」仮想マシンの種類「GPU」仮想マシンサイズ「すべてのオプションから選択」を選択しましょう。
NCv3シリーズである「Standard_NC12s_v3」のクォータが足りていないことが確認できます。
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/9296aab4-e497-d309-6d27-80ae614064cc.png)

:::note
クォータはサブスクリプションごと、リージョンごとに設定されています。例えば「Japan East」でNCv3シリーズが使えない場合でも、例えば「Asia East」で使える、ということがあります。他リージョンのクラスターを使った場合、ジョブ実行時にリージョン間のデータ転送が発生しますのでその分ジョブの実行が遅くなりますが、お試しで使ってみたい場合に活用しましょう。
:::

# クォータ引き上げの申請
一度ポータルに戻り、[Azure Machine Learning]->[(ワークスペース名)]->[使用量とクォータ]をクリックします。
「NCSv3 ファミリのvCPU」のクォータは確かに「0」になっており、クォータが不足していますね。それでは、クォータの上限を引き上げるために「クォータの増加を要求」をクリックしましょう。
![画像7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/f7f6f8f5-83af-30c3-b980-a7edc9ac25a9.png)
[概要]に「Machine Learning クォータの申請(任意でOK)」を入力し、[クォータの種類]は「Machine Learning サービス：仮想マシン クォータ」を選択し、「次へ」をクリックします。
![画像8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/64378af0-d64c-91cd-00fa-6b12fcaf563a.png)
[詳細を入力]をクリック、今回は[場所]を「Japan East」、[VMの種類]を「専用」、VMシリーズは「NCSv3 シリーズ」を選択します。
申請の単位はvCPU(仮想CPUのコア数)となります。例えば「Standard_NC6s_v3」を10台使いたい場合、6(vCPU)×10(台)=60(vCPU)として申請します。
![画像12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/a452b37a-12ab-74f6-388d-5d6c3e7713ce.png)
[高度な診断情報]は特にこだわりがなければ「はい」を選択し、ご希望の連絡方法と連絡先の情報を入力して「次へ」をクリックしましょう。
![画像10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/aca956a8-85f4-b53a-d55d-03992d2df07f.png)
最後に[作成]をクリックし、申請は完了です。リソースの種類にもよりますが翌日～数日でメールにて申請結果が通知されると思います。
特にGPUサーバは22年7月時点で枯渇しているリージョンもありますので、申請が通らなければ別のリソースか別リージョンで申請しましょう。
![画像11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/4232a7f1-d4c8-c95d-6131-be55f12c8afa.png)

# まとめ
Azure Machine LearningのvCPUクォータの引き上げ申請について解説しました。Azure Machine Learningのその他クォータに関してはこちらのドキュメントに記載されていますので、合わせてご確認いただければと思います。

https://docs.microsoft.com/ja-jp/azure/machine-learning/how-to-manage-quotas#request-quota-increases
プルダウンのフォームでプレースホルダーのようなものを実装する方法（Rails）

# はじめに

Railsでアプリを作成中、以下のようなフォームを実装したいときに、どのように実装するかが勉強になったので記載します。

- 未選択時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051539/17b2e2fd-80f2-bea2-3bfc-b84f0275a532.png)
- プルダウンを表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051539/a049724b-45c2-1c93-9e25-8920c7961bd4.png)
- 選択後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051539/5be5710e-ecf8-a9b4-d4f8-7ac0b09efdb2.png)

前提として、**selectタグでは、placeholder属性が効かない**ので、実装にあたって少し工夫が必要でした。
# 仕様
このプルダウンのフォームは、以下のような仕様になっています。

1. **未選択時は「選択してください」**という文言を**グレーで**表示する
2. プルダウンを表示した際には、管理者、アシスタント、一般ユーザーのいずれかを選択できる。**「選択してください」は選択肢に含めない**。
2. 選択した場合は黒色で選択済み状態となる。

# 未選択時に「選択してください」という文言を表示する
[promptもしくはinclude_blank](https://api.rubyonrails.org/v7.0.3/classes/ActionView/Helpers/FormTagHelper.html#method-i-select_tag)を使うことで、未選択時に任意のテキストを表示するようにできます。
```erb:_form.html.erb
<%= form_with(略) do |f| %>
  <%= f.label :role %>
  <%= f.select :role, ['管理者', 'アシスタント', '一般ユーザー'], { prompt: '選択してください' }, required: true %>
<% end %>
```

include_blankを使う場合は以下です。
```erb:_form.html.erb
<%= form_with(略) do |f| %>
  <%= f.label :role %>
  <%= f.select :role, ['管理者', 'アシスタント', '一般ユーザー'], { include_blank: '選択してください'}, required: true %>
</div>
```
しかし、この状態だとプルダウンをクリックした際、「選択してください」も選択肢として表示されてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051539/330381b8-90db-81ae-b9a0-b3bf97b8ce80.png)
# 選択肢から「選択してください」を消す

選択肢を「管理者、アシスタント、一般ユーザー」の３つにしたいです。
これを行うには、CSSを使います。

まず、今の状態がどのようなHTMLになっているかを確認します。
```html:html
<select required="required" name="xxx" id="xxx">
<option value="">選択してください</option>
<option value="管理者">管理者</option>
<option value="アシスタント">アシスタント</option>
<option value="一般ユーザー">一般ユーザー</option></select>
```

これを見ると、optionタグでvalueが入っていないものを非表示にすればよさそうです。
```css:css
select {
  option[value=""] {
    display: none;
  }
}
```

これで、「選択してください」が選択肢から消えました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051539/3a945520-84ac-491b-43a8-5e568b96cc28.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051539/04062915-032c-f2aa-40c2-ed5999e8123c.png)

## 「選択してください」の文字だけグレーにしたい

今回はプレースホルダーっぽくしたいので、「選択してください」、が表示されているときは色をグレーにしたいです。
逆に、何かを選んだ時は黒色で表示したいです。

まず、今回の前提ですが、例に出しているRoleは**選択必須**の場合になります。
選択が任意のフォームの場合は、この方法は使えないと思うのでご了承ください。

選択必須のプルダウンでは、疑似要素:invalidで値が入っていない場合を判定できます。
したがって、CSSを次のように書きます。

```css:css
select {
  &:invalid {
    color: grey
  }
  option[value=""] {
    display: none;
  }
}
```

これで選択されていないときに「選択してください」をグレーにすることができました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051539/1d0d4983-126b-4fbb-7912-6f2d62297f51.png)
何かの値が選択された場合は黒色になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051539/b5ede7bc-2ec9-06dd-d00a-c552a8689c24.png)

最初はJavaScript使わないとかな、と思ったのですが、CSSだけで解決できたので勉強になりました。

## 参考
[Selectタグの最初の項目だけ色を変える方法【2つの方法を紹介】](https://flex-box.net/select/)
【pixiv downloader】作品を一括PDFダウンロードするchrome拡張

# はじめに

**好きな作品を保存**しておかないと、イラストレータさんが消しちゃうかもしれない！
でも、一枚一枚PNGファイルで保存されても困るし、**PDFで保存**したい！
というかPDFなら**kindleで読みたい！**

# 対象拡張
[Pixiv downloader](https://chrome.google.com/webstore/detail/pixiv-downloader/obpplliepllmongaimfbkbdembbmkfne?hl=ja&authuser=0)
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498595/96f0e568-23a0-b4fc-ba0a-f708a64a110f.jpeg)


# スローガン
以下のスローガンをもとに開発いたしました！
### ワンクリック
簡単操作でダウンロードがしたい！

### 一括
イラスト1枚=1ファイルでダウンロードされても...

### PDF
まとめて見るならやっぱりPDFですよね！

### kindle連携
スマホのkindleアプリでいつでも見たい！

# 使用方法
**1. chrome拡張ページから「[Pixiv downloader](https://chrome.google.com/webstore/detail/pixiv-downloader/obpplliepllmongaimfbkbdembbmkfne?hl=ja&authuser=0)」を検索し、「Chromeから追加」をクリックします。**
![Screenshot from 2022-07-29 00-45-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498595/63713ad5-d292-5c20-ba75-eb53e738340e.png)


**2. お好きなpixivの作品ページに移動し、ボタンをクリックします。**
* **PDFをダウンロードする場合**：右上の青い「PDF」ボタンをクリックします。
* **kindleにアップロードする場合**：右上の青い「kindleアイコン」ボタンをクリックします。
![Screenshot from 2022-07-29 00-46-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498595/4dc34c7c-278e-e6fe-eefc-ac61988c71eb.png)

**3. ダウンロード/アップロードされるのを待つだけ！**
※kindleへのアップデートは、ファイルサイズによって時間がかかることがあります。


**以上です♪**


## 対象
本拡張で対象となるものを以下にまとめました。
今後の拡張のアップデートで追加していく予定です。

||PDFでダウンロード|kindleにアップロード|
|:---:|:---:|:---:|
|**イラスト**|**○**|**○**|
|**小説**|**○**(実装予定)|**○**(実装予定)|
|**イラストシリーズ**|**○**(実装予定)|**○**(実装予定)|
|**小説シリーズ**|**○**(実装予定)|**○**(実装予定)|

# 開発環境
以下テンプレートを使用して開発しました。
* [mv3-vue-chrome-extension-template](https://github.com/munron/mv3-vue-chrome-extension-template)

こちらのテンプレートでは、ホットリロード開発環境を提供しています。
## ホットリロード開発環境とは？

ローカル開発環境( http://localost:8080/ )でフロント側の開発しているとき、普通は以下を繰り返すと思います。

触ったことがある人ならわかると思いますが、
`3. npmを再実行`が結構なストレスになります...
```
1. ソースコードを編集
2. ソースコードを保存
3. npmを再実行
4. ブラウザをリロード
```

しかし、ホットリロードを取り入れると、以下のようにnpmをリロードする手間が要らなくなります。

```
1. ソースコードを編集
2. ソースコードを保存...した瞬間に、自動でnpmを再読込
3. ブラウザをリロード
```



## 開発環境構築

### **1. テンプレートをインストールする**
```
git clone https://github.com/munron/mv3-vue-chrome-extension-template.git
cd mv3-vue-chrome-extension-template
npm install
npm run build
mv .env.sample .env
```
### **2. 拡張機能をパッケージ化**
1. [拡張機能](chrome://extensions)を開く
2. `拡張機能をパッケージ化`をクリック
3. `拡張機能のルート ディレクトリ`にてインストールしたテンプレート内の`dist`ディレクトリを選択
4. `拡張機能をパッケージ化`をクリック
`dist.crx`と`dist.pem`が生成されます。
5. `dist.pem`の内容を`.env`の`VUE_APP_MV3_KEY`に以下のようにコピー
```
VUE_APP_MV3_KEY="-----BEGIN PRIVATE KEY-----\nXXXXX.....XXXXXX\n....\nXXXXXX.....XXXXXXX\n-----END PRIVATE KEY-----"
```

### Hot Reloadを起動する
1. 以下コマンドを実行
```
npm run dev
```
PowerShellでPython3.1.5をインストールするスクリプト

# 概要
PowerShellでPythonをインストールし、WindowsでPythonの実行環境を構築するスクリプトを書いたので備忘録として投稿。
InstallALlUsersでインストールしているため利用する場合は管理者権限で実行してください。

* インストールされるバージョン：`3.10.5`
* インストール先: `C:\Program Files\python310`

## スクリプト
```PowerShell
#Python3.10.5 インストーラダウンロード
Write-Host "Pythonインストーラをダウンロードします"
Invoke-WebRequest -Uri "https://www.python.org/ftp/python/3.10.5/python-3.10.5-amd64.exe" -OutFile $env:temp\python.exe
if(!(Test-Path $env:temp)){
  $Host.UI.WriteErrorLine("ダウンロードに失敗しました。")
  exit 1
}

#Python3.10.5 インストール
Write-Host "インストールを開始します。"
Start-Process "$env:temp\python.exe" -ArgumentList "PrependPath=1","InstallAllUsers=1","/quiet" -wait

#Python3.10.5 インストーラ削除
Write-Host "インストーラを削除します"
Remove-Item $env:temp\python.exe -force

#環境変数の更新と確認
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
$paths = $env:path.split(";")
$paths.foreach({if($PSItem -like 'C:\Program Files\Python310\'){ Write-Host "正常にインストールが完了しました"; break }})


```

## 解説
味気ないので一応解説します。

### インストーラのダウンロード
まず初めに公式のダウンロードリンクからPython3.10.5のインストーラを一時フォルダにダウンロードしています。
```PowerShell
#Python3.10.5 インストーラダウンロード
Write-Host "Pythonインストーラをダウンロードします"
Invoke-WebRequest -Uri "https://www.python.org/ftp/python/3.10.5/python-3.10.5-amd64.exe" -OutFile $env:temp\python.exe
```
ダウンロードするバージョンを変更したい場合は`-Uri`の引数を変更してください。

ダウンロード終了後、ダウンロードファイルが存在している(ダウンロードに成功している)ことを確認しています。
※Try-Catchなりできるのかしら？　有識者が見ていたら教えてください。
```PowerShell
if(!(Test-Path $env:temp)){
  $Host.UI.WriteErrorLine("ダウンロードに失敗しました。")
  exit 1
}
```
存在しない場合はexit 1でエラー終了させます。

### サイレントインストール
Python3.10.5をサイレントインストールします。
`/quiet`がサイレントインストールのオプションです。
その他のオプションについては[こちら]("https://docs.python.org/ja/3/using/windows.html")のリファレンスを参照してください。
```
#Python3.10.5 インストール
Write-Host "インストールを開始します。"
Start-Process "$env:temp\python.exe" -ArgumentList "PrependPath=1","InstallAllUsers=1","/quiet" -wait
```

### インストーラファイルの削除
インストール完了後、インストーラファイルを削除します。

```PowerShell
#Python3.10.5 インストーラ削除
Write-Host "インストーラを削除します"
Remove-Item $env:temp\python.exe -force
```

### 環境変数確認
インストール時に環境変数を設定しているため、環境変数を再読込し、パスが正常に通っていることを確認します。
正常にパスが通っている場合、インストールは正常終了したとみなします、

```PowerShell
#環境変数の更新と確認
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
$paths = $env:path.split(";")
$paths.foreach({if($PSItem -like 'C:\Program Files\Python310\'){ Write-Host "正常にインストールが完了しました"; break }})
```
Vue3系でフェードアニメーション

# これは何？
画像がフェードイン&フェードアウトするサンプル。

# 作った経緯
勉強のため。
かつ、ネットには動かないサンプルが大量に転がっていて腹がたったから。

今回重視したのは以下２つです。
- `v-for` と `v-if` を同時に使いたい時にどうするか理解する
- transition によるアニメーション挙動を理解する

そもそも、`v-for` と `v-if` を同時に使うことは非推奨だとドキュメントに書いてあるのに、
ネットでは同時に使っているサンプルが出てくるので、ドキュメントのことを思い出すまでに時間がかかりました。

https://v3.ja.vuejs.org/style-guide/#v-for-%E3%81%A8%E4%B8%80%E7%B7%92%E3%81%AB-v-if-%E3%82%92%E4%BD%BF%E3%81%86%E3%81%AE%E3%82%92%E9%81%BF%E3%81%91%E3%82%8B-%E5%BF%85%E9%A0%88

スタイリングガイドによると、要は
- フィルタ済みの Object で for を回す
- template 構文を使って、 for と if を分ける
このどちらかにしなければいけないので、今回は後者を選びました。

# コード

```vue
<template>
	<div class="slider-outer">
		<div class="slider-inner">
			<template v-for="(slide, idx) in slides" :key="idx">
				<transition name="fade" mode="in-out">
					<img v-if="idx == currentSlide" v-bind:src="slide.img" width="450" height="300">
				</transition>
			</template>
		</div>
		<div class="slider-trigger">
			<button class="prev" v-on:click="prev()"> &lt; </button>
			<button class="next" v-on:click="next()"> &gt; </button>
		</div>
	</div>
</template>

<script>
export default {
	data: function(){
		return({
			currentSlide: 0,
			timerId: 0,
			slides: [
				{ img: require('./assets/img1.jpg') },
				{ img: require('./assets/img2.jpg') },
				{ img: require('./assets/img3.jpg') },
				{ img: require('./assets/img4.jpg') },
			],
		})
	},
	created: function(){
		setTimeout(this.autoPlay, 3 * 1000);
	},
	methods: {
		prev: function(){
			this.currentSlide--;
			if(this.currentSlide == -1){
				this.currentSlide = this.slides.length -1;
			}
			this.cancelTimer();
			this.autoPlay();
		},
		next: function(){
			this.currentSlide++;
			if(this.currentSlide == this.slides.length){
				this.currentSlide = 0;
			}
			this.cancelTimer();
			this.autoPlay();
		},
		autoPlay: function(){
			this.currentSlide++;
			if(this.currentSlide == this.slides.length){
				this.currentSlide = 0;
			}
			this.timerId = setTimeout(this.autoPlay, 3 * 1000);
		},
		cancelTimer: function() {
			clearTimeout(this.timerId);
		}
	},
}
</script>

<style lang="scss">
*, *:before, *:after {
	box-sizing: border-box;
	margin: 0;
	padding: 0;
}
.slider-outer{
	position: relative;
	width: 100%;
	height: 600px;
	overflow: hidden;
	margin: 0;
}
.slider-inner{
	position: relative;
	width: 100%;
	height: 100%;
	background-color: #222222;
	img {
		position: absolute;
		top: 50%;
		left: 50%;
		transform: translate(-50%, -50%);
		display: block;
		width: 100%;
		height: auto;
	}
}
.slider-trigger{
	position: absolute;
	top: 50%;
	transform: translateY(-50%);
	width: 100%;
	z-index: 10;
	button {
		position: absolute;
		background-color: transparent;
		border: none;
		cursor: pointer;
		outline: none;
		padding: 0;
		appearance: none;
		font-size: 24px;
		color: #FFFFFF;
	}
	.next { right: 30px; }
	.prev { left:  30px; }
}
.fade-enter-active {
	transition: all 1s ease;
	position: absolute;
	z-index: 2;
}
.fade-leave-active {
	transition: all 1s ease;
	position: absolute;
	z-index: 3;
}
.fade-enter    { opacity: 0; }
.fade-leave-to { opacity: 0; }
</style>
```

# 最後に
次回からは先にドキュメントとスタイルガイドを読むことにします。
ansibleで特定のタスクのみを実行したいときの方法

## ansibleで特定のタスクのみを実行する方法

ansibleを使用して、環境構築をしているとターゲットに対してこのタスクだけ実行したいというときありますよね？そんなときの方法を紹介します。

結論から書くと、`--start-at-task`オプションと`--step`オプションのあわせ技で行う。

まず`--start-at-task`これは、タスクの開始位置を指定できる。
```
# ex taskからタスクを開始する
ansible-playbook playbook.yml --start-at-task="ex task"
```

そして`--step`これは、タスクを一つ一つ、対話形式で実行できる。
```
ansible-playbook playbook.yml --step
Perform task: first task(y/n/c):
```
一番最初のタスクが「first task」だったらこんな感じになる。そして、「y」はタスクが実行、「n」はタスクをスキップ、「c」は残りのタスクすべて実行する。

これを組み合わせることによって
```
ansible-playbook playbook.yml --step --start-at-task="ex task"
```
上のオプションをつければ「ex task」から実行し「--step」でタスクを一つ一つ対話型で実行できるので、ex taskを実行したあとに`CTRL＋C`で強制終了すれば特定のタスクのみを実行できたことになる。
【個人メモ】VSCODEでpythonスクリプトを実行できなかった時の対処法

## 事象
Pythonのインストールと、vscodeにpython拡張機能をインストールした状態でpythonスクリプトを実行したところ、
以下エラーメッセージが出た。

```powershell
PS C:\WebApp\portfolio\0030_scraping> & %PythonPath% c:/WebApp/portfolio/0030_scraping/Scraping.py
& : 用語 '%PythonPath%' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラム
の名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はその
パスが正しいことを確認してから、再試行してください。
発生場所 行:1 文字:3
+ & %PythonPath% c:/WebApp/portfolio/0030_scraping/Scraping.py
+   ~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (%PythonPath%:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
```

##  原因
vscodeの設定にて「python.defaultInterpreterPath」の値にpython.exeの配置フォルダパスが指定されていなかった。

## 対応方法
「設定」の「python.defaultInterpreterPath」にpython.exeの配置フォルダパスを指定する。
![cap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943997/de3a8fb4-1f99-b1ee-4273-f1037db23deb.png)
★備忘録 Laravel Auth を利用する場合のデフォルトルーティング

Laravel8でのデフォルト認証機能Laravel Authを利用する際の
デフォルトルーティングについてメモ。
デフォルトルーテイングは以下のファイルに記載されている。

> ~/vendor/laravel/ui/src/AuthRouteMethods.php
※~ 部分は各自のPJに依存
Raspberry Pi 4 で ffmpeg の h264_v4l2m2m の出力が壊れた (解決済み)

# Raspberry Pi 4 で ffmpeg の h264_v4l2m2m の出力が壊れた
暫定ですが解決したので備忘録を載せておきます。

## 環境
- Raspberry Pi 400
- Raspberry Pi OS 32bit
- ffmpeg version 4.3.4-0+deb11u1+rpt2 (更新前)

## 問題発生までの経過
1. apt で各種パッケージを更新 （多分執筆時点まで半年ぐらい更新していなかった）
2. ffmpegのRaspberry Pi 4 用ハードウェアエンコーダ `-c:v h264_v4l2m2m` が動かなくなる
    - 正確には出力映像がすべて真っ黒に

## 解決策
1. ffmpeg を更新
1. リサイズオプションを追加 

### ffmpeg を更新
以下の記事の手順に従って Raspberry Pi用に ffmpeg の最新版 (執筆時点で `54e0971`)をビルドしました。

https://pimylifeup.com/compiling-ffmpeg-raspberry-pi/

この記事の手順でビルドしたffmpegは `/usr/local/bin/ffmpeg` に配置されるので注意。
自分の環境の更新前のパスは `/usr/bin/ffmpeg` でした。

### リサイズオプションを追加
ffmpegを更新すると出力動画が真っ黒問題は解決しましたが、今度は映像が斜めにノイズが入った感じに乱れるようになりました。
調べてみると `-vf scale=1920:1080` のように`-vf`でリサイズすれば乱れも解消するようです。
このオプションを追加したところ、自分の環境でも映像が乱れなく出力されひとまずエンコード自体もできるようになりました。

仕様上`-vf`を追加した場合、しない場合に比べてエンコード速度が明らかに落ちるのですが現状では仕方ないみたいです。

## 参考
https://pimylifeup.com/compiling-ffmpeg-raspberry-pi/

https://nico-lab.net/raspberry4_64bit_deinterlace_hw_encode/
BVE 鉄道シミュレーターで自宅運転台を動かそう~自宅運転台を作ろう

__BVE 鉄道シミュレーターで自宅運転台を動かそう__ のまとめとして自宅運転台を作ってみましょう。
本当は実車の部品が手に入る事が一番良いのですが入手できない為です。
# 構成を考える
今まで作ってきたものを基に02系の運転台を作ってみます。
+ ワンハンドルマスコン
+ メトロATCメーター
+ 電流計
+ ブレーキ指令
+ 液晶ディスプレイ
を構成することとします。
# 大きさと配置
02系をベースに考えたため、初期設計では幅が700mmを超えてしまう事がわかりました。
![assembly1-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9177d99f-7c74-7954-bcb3-5e56f45e8b81.jpeg)
700㎜というのは一人で移動させることが出来ないサイズとなります。
この為、幅500㎜となるように配置を変えて小さくしました。
結果として、02系とはだいぶ異なる配置となってしまいました。
![assembly5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/19fac4e9-5f72-7f6c-a0ea-5e12e9c6aef8.png)
# ワンハンドルマスコン
今回も、両手用のワンハンドルマスコンという事で初代電車でGoコントローラーを使用しましたが、左手用で良い場合は三鶯重工のOHC-PC01Aの方がリアルで良いと思います。
# 板金加工
今回も協和工業株式会社にご協力頂きました。

https://www.bankin.co.jp/

![レーザー切断](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/36513eb5-d666-b987-8e02-21cbaf8f7725.jpeg)
![プレス加工](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/18745fb2-facc-a532-f630-f19628323379.jpeg)
![プレス加工](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/fcd5d27c-ddc3-92f4-dae7-bb65760ea6c3.jpeg)
# 仮組み
出来上がった部品を仮組してみます。
![仮組み](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/306a212f-7fdf-b017-a421-7c7d8aa84635.jpeg)
無事フィッティング出来ました。
# 塗装
02系のパネルと同じ色に塗装してもらいました。
### フロントカバー
![フロントカバー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/074fc7fc-93ce-e7dd-06dc-af8abf44ca8d.jpeg)
### アンダートレイ
![アンダートレイ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/0a2c1c0f-31cf-9db5-0a86-8c371e69c957.jpeg)
### メーターパネル
![メーターパネル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/dfe39b0a-fb55-52ca-0fde-499182fdcd09.jpeg)
### メーターカバー
![メーターカバ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/32a34783-2922-1953-359b-fd6f042d3a2b.jpeg)
# 組み立て
塗装をしたので仮組の時より若干きつくなっています。
![フィッティング](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2968fb44-6c57-d31f-5ca0-2ff7e47f4a98.jpeg)
まずは、メーターパネルとアンダートレイを固定し、メータと液晶ディスプレイを取り付けます。
![メータ取付](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/0fb3a1bf-f6ab-b81f-6456-daffba9b8a18.jpeg)
![背面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b9907cb4-bb5d-d284-73bb-5b514a05b945.jpeg)
フロントカバーを組み立てていきます。
![フロントカバー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/e936b688-b645-ec19-cd3c-285db17c7fe8.jpeg)
配線を通して組み上げます。
# 完成
最後に動作確認をして完成です。
![完成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/51b4c933-aad7-238a-b209-fdab063e0f9d.jpeg)
# 製作動画
https://www.youtube.com/watch?v=Ezl4XLLQUj8
Zabbixでnginxのログからデータ可視化

## Zabbixでログデータ取得して可視化

zabbixでは、簡単にログ監視の設定を行えます。主な使い方と言ったらerrorログを検出して通知するみたいな使い方でしょうか。しかし、ログからレスポンスタイムなどを取得し、データの可視化なども可能です。

ログの取得には、以下のキーを使用します。logとlogrtの２つがありますが、違いは、ファイルパスに正規表現を使用できるかできないかの違いです。

```
logrt[file_regexp,<regexp>,<encoding>,<maxlines>,<mode>,<output>,<maxdelay>,<options>,<persistent_dir>]
log[file,<regexp>,<encoding>,<maxlines>,<mode>,<output>,<maxdelay>,<options>,<persistent_dir>]
```

上のようにたくさんパラメータがありますが、今回使用するのは、「file」「regexp」「mode」「output」
file：監視するファイル
regexp：正規表現でログの抽出する部分を指定
mode：「all：すべてのログファイルを対象にする」か「skip：アイテムを設定したあとのログファイルのみを対象にする」
output：regexpで抽出する箇所を選択する。「\1」で1番最初の「()」を「\2」で2番目の「()」の中身を抽出する。

※regexpで使用できる正規表現はバージョンによっては、違うので注意。ここで詰まった。。自分の使用しているzabbixのバージョンのドキュメント確認してみてください。
https://www.zabbix.com/documentation/5.0/en/manual/regular_expressions


## nginxのログを抜き出す

nginxのログ
```
192.168.0.1 - - [1/Jun/2022:10:44:05 +0900] "GET / HTTP/2.0" 500 21 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36" "-" "TLSv1.2" "ECDHE-RSA-AES256-GCM-SHA384" 0.232 502 80
```
上記のログだとレスポンスタイムは「0.232」の部分。今回は、これを抜き出したい。ちなみにレスポンスタイムがどこの部分かは、/etc/nginx/nginx.confに記載があります。

上のログの場合は、以下のようなキーでレスポンスタイムを取得できる。値を抽出したあとのグラフ化とかは、他の記事見てください。
```
log[/var/log/nginx/nginx.log,\s(\d+\.\d{3})\s,,,skip,\1]
```
このような要領で、色々なログのデータからグラフ化とかできるようになります。

## まとめ

すごく雑な説明ですけど、zabbixでもログのデータを抽出できることがわかります。今回これを説明しておいてなんですけど、ログデータの可視化ならelasticsearch，kibana，td-agentを使用したほうがいいです。
ローカル環境でLaravel9を使えるようにする

# はじめに
Laravel9を初めて触る中で苦戦した箇所がいくつかあったので、備忘も兼ねてまとめます
誤っている点やもっと良い方法があればコメントにてご教授お願いいたします
<!-- 発端や概要を記載 -->

<!-- 各チャプター -->
<a id="#Chapter0"></a>
# 前提
PHPが実行できる状態であること

<a id="#Chapter1"></a>
# 構築環境
OS：Windows 11 Home
ターミナル：Windows11デフォルトのターミナル（PowerShell）
ブラウザ：Google Chrome

<a id="#Chapter2"></a>
# 事前準備
ライブラリ管理ツールであるComposerをインストールします

[Composerの公式サイト](https://getcomposer.org/download/)からセットアップツールをダウンロード

https://getcomposer.org/download/


Composer-Setup.exeをクリックしてダウンロード開始
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1956952/da87ff23-d35d-01aa-ef7b-d70e5893a5ef.png)

ダウンロードが完了したらComposer-Setup.exeを実行して任意の場所にComposerをインストール

ターミナルで`composer -v`を実行してComposerの表示が出ればインストール成功
上手くいかない場合はパスが通っているかを確認してください

<a id="#Chapter3"></a>
# Laravel9のインストール
先ほどインストールしたComposerを使ってLaravelのインストーラをダウンロード
```bash
composer global require "laravel/installer=~1.1”
```
ここでパスが通っているか確認する
通っていなければ通す
ターミナルで`laravel -v`を実行してバージョン情報が表示されれば成功


<a id="#Chapter4"></a>
# プロジェクトの作成

新規プロジェクトを作成
```bash
composer create-project --prefer-dist laravel/laravel:^9.* PROJECT_NAME
```

`Your requirements could not be resolved to an installable set of packages.`というWarningが出る場合、php.iniファイルをいじるか無視します

無視する場合はこのコマンドです

```bash
composer create-project --prefer-dist laravel/laravel:^9.* PROJECT_NAME --ignore-platform-req=ext-fileinfo
```
追記：[エラーを無視せずLaravel9プロジェクトを作成する](https://qiita.com/asuka-hanerock/items/572afc5aad44e0bcb5e6)にてちゃんと対応する方法をまとめましたのでとにかく動けば良いという方以外は参考にしてください

<a id="#Chapter5"></a>
# 動作確認
```bash
cd PROJECT_NAME
php artisan serve
```

ローカルサーバーが起動したら表示されているURLにアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1956952/f1f2df8e-f1e8-815e-453b-a2cbd65fa744.png)

こんな画面が表示されればOKです
残業って…

結論：ひどい残業をしている人はそういう星の下に生まれてるので、評価してくれる、もしくは守ってくれる組織に所属しよう。

所感：残業は「現場による」ではなく「その人の働き方による」は概ね正しいと思う。
チーム全体にとって(自分を犠牲にして)最適な行動ができたり、忙しい上司の仕事を自ら巻き取ったり、その業務に性があってたり。一言で言ってしまうと、その業務が得意で責任感のある人が、自分を犠牲にしながら働くと”いつも残業してる人”になるんだとおもう。
相応にして、これらの人は役職が上がっていくことが多いと思うけど、もし上がらなかったら、その組織はどうなの？って思う。
どうせ死ぬなら、きちんと弔ってくれる村で畑を耕そうぜ！
【Unity】キー押下でゲーム終了をおこなう方法

キー押下でゲーム終了をおこなう方法です。
GameManagerとかに書いてあげると良いかもしれません。

# 環境
Windows

# コード
```C#:GameManager.cs
void Update() 
{
    Quit();
}

private void Quit() 
{
    if (Input.GetKey("escape")) {
        // UnityEditorの終了(ビルドでエラーになる場合は分岐にしてあげると良いです)
        UnityEditor.EditorApplication.isPlaying = false;
        Application.Quit();
    }
}
```

# 参考
https://docs.unity3d.com/ScriptReference/Application.Quit.html

https://docs.unity3d.com/ScriptReference/EditorApplication-isPlaying.html
CPPファイルがコンテンツブラウザに表示されないときの解決方法

# はじめに
今回、UnrealEngineでC++を使おうと思い新規でC++ファイルを作成したが、一度UnrealProjectを落とし再度起動するとコンテンツブラウザのC++フォルダには何も表示されないといった問題が起きた。
右下のボタンを押してコンパイルをすると表示はされるが、一度Projectを落とすとまた表示されなくなる。

例えば親クラスにそのCPPファイルを設定していると、設定された子クラスは開けなくなるというように。
エディターでは反映されていたコードもパッケージ化すると反映されなくなるため直し方が分からないと致命的だろう。

調べてみるとこの現象は昔からあったのだが、日本語で書かれた記事が2022年7月29日時点で見当たらなかったので今回記事にする。


# 動作環境
UnrealEngine 5.0.3
VisualStudio 2022

# 解決方法
１：次のフォルダを削除する
・.VS
・Binaries
・DerivedDataCache
・Intermediate
・Saved
・プロジェクト名.sln

２：プロジェクト名.uprojectからGenerate Visual Studio project files

３：Epic Games Launcherからプロジェクトを開く
ここでrebuildをするかどうか聞かれるので、yesを押してrebuild

これで今回の問題は解決しました。

# 原因の考察
今回消したデータがキャッシュだったり保存されたデータだったりなので残っていたいらないデータが悪さをしてるっぽい？

# まとめ
今回CPPファイルがコンテンツブラウザに表示されない問題を解決し記事にしました。
この問題はUnreal EngineでC++を使おうと思う初級者にとってはかなり致命的な問題だと思います。
この記事を参考にして同じ問題に出くわした人の手助けになればと思います。
「IT業界で働きたいです！」って…

って言って入ったけど、解像度低かったな。っていう話

結論：自身は解像度低かったなと反省しつつ、現時点でそう考えてる人は人は周りに解像度高めていこ。

所感：発達しすぎて分野が広くなったから、未経験のうちに解像度を高めるハードルが高くなったんだろうけど、にしても解像度が低い。
高卒以外でそう言って入ってくる人少ないんじゃないかなと思いつつ、どういう層までだったら言っていいんだろね？
大卒でそんなこと言う人は居ない印象。
偏見だけど、言って入れても1年で辞めて第二新卒で再就職ねらいそう。
学歴関係なく未経験だったらこれ以上言えないか。
けど、30代未経験でそう言って転職しようとしてる人にエンカウントしたら要注意な印象。むしろ、それで入れる仕事はITではないし、我々は避けなければならない印象。
まあ、私もIT商材売ってるだけで、高度IT人材じゃないんだろうけど…

”あなたは大丈夫？　これに当てはまったらやばいIT人材診断メーカー”
とか面白そう。そんなんあったら俺が見たい。

注釈：この投稿は特定の個人や経歴を持つ人を傷つけることを目的としていません。
もし傷ついた場合は、あなたがあなた自身が傷つけている、もしくはある種のコンプレックスを持っている可能性があります。

最後に：面白い話し合ったら教えて下さい。ムカついたらレスバトルしませう。