OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeからAzure AD B2C のカスタムポリシーをアップロードする


👇参考から設定手順が確認できます。  

参考：https://github.com/azure-ad-b2c/vscode-extension/blob/master/src/help/policy-upload.md

## 拡張機能のインストール

## アプリの登録

アップロード先のAzure AD B2C にVSCodeから接続するためのアプリを１つ登録します。  

- アプリ名（任意の名前）
- この組織ディレクトリのみに含まれるアカウント
- アプリケーションID(クライアントID)をコピー

### APIのアクセス許可 の設定

- アクセス許可の追加
  - Microsoft Graphを選択
  - アクセス許可を選択する でtrustと検索
  - Policy.ReadWrite.TrustFramework にチェックした状態で追加

### 認証 の設定

- 詳細設定
  - パブリッククライアントフローを許可する
    - 次のモバイルとデスクトップのフローを有効にする：はいを選択して保存

## インストールした拡張機能の設定を編集

- 左下の歯車からAzure AD B2C の拡張機能を選択する
  - Graph: Clientid
    - コピーしたアプリケーションIDを設定する
  - Environment: Default
    - アップロードさせたいディレクトリ名を入力する

## アップロード方法

- Ctrl + Shift + P ⇒ B2C Upload all policies
- 右下にポップアップ表示される認証codeをコピーして、Loginする。
- 認証が終わったら再度Uploadしてみるとアップロードできます。
[Ruby] uniqメソッド

##はじめに
面接でかなり撃沈して、何もやる気起きませんが、何か学びを一つ得てから寝ます。
最近メソッドの記事ばかりですが、今回はuniqメソッドを記事にいたします。

##uniqメソッド
uniqメソッドは配列の要素に同じ要素が二つ以上存在していれば一つにしてくれます。

```ruby
array = [1, 1, 2, 3, 4, 5, 5, 6]
array.uniq
=> [1, 2, 3, 4, 5, 6]
```

uniq!とすれば破壊的に使用することも可能です。
M5Stack Core2: HTTP クライアント (Post)

```text:http_post/http_post.ino
// ---------------------------------------------------------------
/*
	http_post.ino

						Jul/08/2023
*/
// ---------------------------------------------------------------
#include <M5Core2.h>
#include <Arduino.h>

#include <WiFiMulti.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

WiFiMulti wifiMulti;
HTTPClient http;

const char *ssid = "some-ssid";
const char *password = "some-password";

int count = 0;

// ---------------------------------------------------------------
void setup()
{
	M5.begin();
	M5.Lcd.setBrightness(32);

	wifiMulti.addAP(ssid, password);
	M5.Lcd.print("\nConnecting Wifi...\n");

	delay(3000);
	Serial.println("*** setup *** aaa ***");
	delay(1000);

	String url_target = "https://httpbin.org/post";

	http_post_proc(url_target);
	delay(5000);

	Serial.println("*** setup ***");
}

// ---------------------------------------------------------------
void loop()
{
	Serial.println("*** loop *** " + String(count));
	M5.Lcd.setTextSize(3);
	M5.Lcd.setCursor(5,30);
	M5.Lcd.println("*** loop *** " + String(count));
  String url_target = "https://httpbin.org/post";

	http_post_proc(url_target);

	delay(3000);
	M5.Lcd.clear();
	delay(1000);
	M5.Lcd.fillScreen(WHITE);
	delay(1000);
	count++;
}

// ---------------------------------------------------------------
void http_post_proc(String url_target)
{
  	M5.Lcd.setTextSize(1);
	DynamicJsonDocument doc(128);
	char data_json[128];

	doc["user"] = "jiro";
	doc["password"] = "123456";
	serializeJson(doc, data_json);

	if((wifiMulti.run() == WL_CONNECTED)) {
		M5.Lcd.print("[HTTP] begin...\n");
		http.begin(url_target);
		M5.Lcd.print("[HTTP] POST...\n");
		int httpCode = http.POST((uint8_t*)data_json, strlen(data_json));
		if(httpCode > 0) {
			M5.Lcd.printf("[HTTP] POST... code: %d\n", httpCode);

			if(httpCode == HTTP_CODE_OK) {
				String payload = http.getString();
				M5.Lcd.println(payload);
				Serial.println(payload);
				}
			}else {
			M5.Lcd.printf("[HTTP] POST... failed, error: %s\n", http.errorToString(httpCode).c_str());
			}
		http.end();
	}
	else
		{
		M5.Lcd.print("connect failed");
		}

    doc.clear();
}

// ---------------------------------------------------------------
```

シリアルポートの受信は次のコマンドで行います。

```bash
cu -s 115200 -l /dev/ttyUSB0
```

Arduino 2.1.1 で表示した様子
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/07653910-d504-a377-60e2-b608f349ffd7.png)
M5Stack Core2: HTTP クライアント (Get)

```text:http_get/http_get.ino
// ---------------------------------------------------------------
/*
	http_get.ino

						Jul/07/2023
*/
// ---------------------------------------------------------------
#include <M5Core2.h>
#include <Arduino.h>

#include <WiFiMulti.h>
#include <HTTPClient.h>

#define SSID "some-ssid"
#define PASSWORD "some-password"

WiFiMulti wifiMulti;
HTTPClient http;

int count = 0;

// ---------------------------------------------------------------
void setup()
{
	M5.begin();
	wifiMulti.addAP(SSID, PASSWORD);
	M5.Lcd.print("\nConnecting Wifi...\n");

	delay(3000);
	Serial.println("*** setup *** aaa ***");
	delay(1000);

	Serial.println("*** setup ***");
}

// ---------------------------------------------------------------
void loop()
{
	Serial.println("*** loop *** " + String(count));
  M5.Lcd.setCursor(0, 0);  
	M5.Lcd.setTextSize(2);

	String url_target = "https://httpbin.org/get";
	http_get_proc(url_target);

	M5.Lcd.setTextSize(3);
	M5.Lcd.println("*** loop *** " + String(count));
	delay(5000);
	M5.Lcd.clear();
	delay(2000);
	count++;
}

// ---------------------------------------------------------------
void http_get_proc(String url_target)
{
	if((wifiMulti.run() == WL_CONNECTED)) {
		M5.Lcd.print("[HTTP] begin...\n");
		http.begin(url_target);
		M5.Lcd.print("[HTTP] GET...\n");
		int httpCode = http.GET();
		if(httpCode > 0) {
			M5.Lcd.printf("[HTTP] GET... code: %d\n", httpCode);

			if(httpCode == HTTP_CODE_OK) {
				String payload = http.getString();
				M5.Lcd.println(payload);
				Serial.println(payload);
				}
			}else {
			M5.Lcd.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
			}
		http.end();
	}
	else
		{
		M5.Lcd.print("connect failed");
		}
}

// ---------------------------------------------------------------
```

シリアルポートの受信は次のコマンドで行います。

```bash
cu -s 115200 -l /dev/ttyUSB0
```

Arduino IDE 2.3.4 で確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/83db61f0-80e9-486e-a81e-ceaca3b6bc4e.png)
vimrcに関するメモ

vimrcに色々と設定を書いていたのですが，反映されずに，バージョンとか絡んでんのかな？と思って放置していました．

重い腰をあげて調べて，解決に至ったので，そのためのメモです．

##肝心のvimrcの中身

```vim
set nocompatible
set fenc=utf-8
set nobackup
set noswapfile
set autoread
set hidden
set showcmd 
set number
set cursorline
set cursorcolumn
set virtualedit=onemore
set smartindent
set visualbell
set showmatch
set laststatus=2
set wildmode=list:longest 
set list listchars=tab:\>\-
set expandtab
set tabstop=2
set shiftwidth=2
set ignorecase
set smartcase
set incsearch
set wrapscan
set hlsearch
syntax on
```

##syntax onを反映したくて...

なんで反映されないん？
嫌がらせすか？
エラーは吐かない．
ただ，vi上で:syntax onと入力すると，反映されるそうですが，
私の場合は<font color="Red">あなたのバージョンではサポートしていません！</font>
くそなめエラーを表示される始末......

そこで色々調べると，新規で拡張パックのようなもののインストールが必要らしい.

```
$sudo apt-get update
$sudo apt-get install vim-nox -y
```

このvim-noxってものが必要らしいです．
ubuntuではvim-tinyという最小構成しかインストールされないそうなので
私が使っているDebianでもおそらく同じでしょう．調べてません．

なにはともあれ，syntax onが反映されたので良しとしますか．
Google Cloud認定資格を制覇したので横断的感想

一通り揃ったので、通しでの一言感想（Lookerを除く）。
各人のバックボーンによっても得意領域が違うと思うので、試験計画の参考までに。

Data Engineer, Cloud Security Engineer, Cloud Network Engineerについては、結構前に受験したので、難易度の感覚ズレがあるかも。
他は更新を含め４ヶ月くらいの間で隔週くらいのペースで纏めて取りに行ったので、感覚の基準は大差はないと思う。
自分自身は、運用保守＆セキュリティ面でのマネジメントとして、Google Cloudに携わっている。（身近にはあるが、自分自身でガリガリ弄ってはいない）

| レベル | 資格名 | トライ回数 | （個人的）難易度 | 一言メモ |
| --- | --- | --- | --- | --- |
| Foundational | Cloud Digital Leader (＊1) | 1 | :grinning: | AWSのPractitionerよりは難しいかも |
| Associate | Cloud Engineer (＊2) | 1 | :neutral_face: | Cloud Architectとレベル差はない感覚 |
| Professional | Cloud Architect (＊2) | 1 | :neutral_face: | Cloud Engineerとレベル差はない感覚 |
| Professional | Cloud Developer | 2 | :cold_sweat: | k8s祭り... |
| Professional | Data Engineer | 1 | :confused: | データストアや分析系の知識要だがそこまで深くはない |
| Professional | Cloud Security Engineer | 3 | :tired_face: | Workspace(旧G Suite)も出てくる |
| Professional | Cloud Network Engineer | 1 | :neutral_face: | 専用線問題もあるが、VPNを張れる程度の知見があれば大丈夫 |
| Professional | Cloud DevOps Engineer | 1 | :blush: | MSPとして顧客のためにどう動くのか考えながら解く |
| Professional | Machine Learning Engineer | 2 | :neutral_face: | ドメイン知識が必用だが、入門書をなんとなく流す程度で大丈夫 |
| Professional | Collaboration Engineer | 1 | :dizzy_face: | 一発合格したが勘の恩恵 |


(＊1) β試験で受験
(＊2) 更新受験時の回数・感触。初回受験時はCloud Architectに１度落ちた。

## オススメの試験
1. Cloud DevOps Engineer
知識より考える問題。解いていて楽しい。

2. Data Engineer
Google Cloudが強みを持つコンポーネントなので押さえておきたい。

3. Cloud Architect
全体的に網羅しているので。
Rails × Vue.jsで急にFailed to load resource: the server responded with a status of 404 (Not Found)

Rails APIとVue.jsでアプリ作成していて、
ある日突然、<%= javascript_pack_tag 'hello_vue' %>が
Failed to load resource: the server responded with a status of 404 (Not Found)

となったが、リロードしまくってたら治った。。なんやねん。。。
Pythonでモジュールがインポートできない

参考書を写経しているとどこかでつまる
今回はモジュールをインストールしたはずがIDLE上でimportできない事象について解決までの手順？をメモで残しておく
ちなみに、解決方法を先に書くとsys.path.append("フォルダパス")で一時的に追加するか、環境変数を弄って恒久対処の二択



####どんなエラーメッセージが出たか？

```python
>>> import pyperclip
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    import pyperclip
ModuleNotFoundError: No module named 'pyperclip'
```

pyperclipをインポートしたいんだけどどうやら見つからないらしい・・・
おかしい、ちゃんとインストールしたはずなのに・・・


####コマンドプロンプト上でもう一度モジュールインストール
```
C:\Users\kuratsuka>pip install pyperclip
Requirement already satisfied: pyperclip in c:\users\kuratsuka\anaconda3\lib\site-packages (1.8.2)
```
あれ？もうあるよって返答が・・・

調べてみるとそもそもimport時はsys.pathを参照してモジュールを探すらしい
なのでsys.path上にプロンプトのディレクトリを参照先としてあるのかを確認する

```python
>>> import sys
>>> import pprint
>>> 
>>> pprint.pprint(sys.path)
['',
 'C:\\Users\\kuratsuka\\AppData\\Local\\Programs\\Python\\Python39\\Lib\\idlelib',
 'C:\\Users\\kuratsuka\\AppData\\Local\\Programs\\Python\\Python39\\python39.zip',
 'C:\\Users\\kuratsuka\\AppData\\Local\\Programs\\Python\\Python39\\DLLs',
 'C:\\Users\\kuratsuka\\AppData\\Local\\Programs\\Python\\Python39\\lib',
 'C:\\Users\\kuratsuka\\AppData\\Local\\Programs\\Python\\Python39',
 'C:\\Users\\kuratsuka\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages']
>>> 
```

ない・・・おかしい・・・
やはりanacondaをよくわからんけどヨシ！でインストールしたからなのかな？？？
とりあえずこの一覧に載せたい・・・！！


###sys.path.append()でパスを追記する
```python
>>> sys.path.append("C:\Users\kuratsuka\anaconda3\Lib\site-packages")
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
```

パスを素直にコピペするとSyntaxErrorを吐く、パスの区切りは「\」単体ではなく「\\\」にしないと！
なのでもう一度書く

```python
>>> sys.path.append("C:\\Users\\kuratsuka\\anaconda3\\Lib\\site-packages")
>>> 
>>> pprint.pprint(sys.path)
['',
 'C:\\Users\\kuratsuka\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages',
 'C:\\Users\\kuratsuka\\anaconda3\\Lib\\site-packages']
>>> 
>>> import pyperclip
>>> 
```

エラー吐かずに読み込めた！！！
けどIDLE落とすとまた読み込めんぞ・・・？

どうやらsys.path.append()は一時追加的なものでずっとは続かないらしい
もう少し調べてみると環境変数でパス指定することでIDLEを落としても使えるようになるらしい
てか、環境変数ってなんだ？？

>「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典様
https://wa3.i-3-i.info/word11027.html

このサイトめちゃお世話になってる、環境変数が何となくわかった気がする
とりあえずIDLE(他プログラム)がWindowsに問い合わせたときに帰ってくるパス的な感じ？？

####分かった気になったので環境変数をいじってみる
![環境変数.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517314/420d5d8b-2a41-5132-2cd4-3e649df53617.jpeg)

Windows上で変数名を"PYTHONPATH"で指定したいパスを値に入れるとできる
もう一度IDLE再起動させて確認してみると・・・

```python
>>> pprint.pprint(sys.path)
['',
 'C:\\Users\\kuratsuka\\AppData\\Local\\Programs\\Python\\Python39\\Lib\\idlelib',
 'C:\\Users\\kuratsuka\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages']
>>> 
>>> import pyperclip
>>> 
```

無事に入った！！！
Word文書をhtmlタグ付きのテキストに変換するツール

掲題のツールをつくったのでその使い方など。

https://112ka.github.io/tools/word2html/

サイトコーディングする際、規約など大量のWord文章をhtmlタグ付けする機会が年2,3回あって、非常にめんどくさかった。
それらしきツールはWeb上にあるものの自分の希望の動作をするものが見つからなかったので、時短＆Reactの練習も兼ねてつくりました。
とりあえず、自分の欲しい機能だけ入れてます。


# Usage

## 1. タグ付けしたいWord文書を整形する
自分以外の誰かが作ったWord文書ファイルがそのまま自分の思い通りのタグをつけてくれることはあまりない。

自分のつけたいHTMLタグがでてくるように、最初にWord文書を編集しておきます。
※このStepはWordアプリ上で行う作業です。
### 見出し
Word 見出し1 -> h1
Word 見出し2 -> h2
Word 見出し3 -> h3
…
に対応しています。

### リスト
Word上で箇条書きになっていないとリスト要素として変換されません。
これ↓
![2021-08-31 17_10_15-サンプル文書.docx - Word.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207875/e0e07bd8-cd86-3061-9bfc-dac244789d92.png)


## 2. ツールにコピーしてコンバートボタンを押す
今回使用するサンプルのWord文書は　→→→　[これ](https://github.com/112KA/word2html/blob/main/%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E6%96%87%E6%9B%B8.docx)

ツールのUIはこんな感じ。
![2021-08-31 17_25_30-Word2html App.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207875/6fae1670-17e7-8c50-972f-328d7bf274a0.png)


TextAreaにWord文書をPasteすると、以下のダイアログがでるんですが、「Keep」ボタンを押してください。formatはkeepしたいので。
![2021-08-31 17_20_05-Word2html App.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207875/420bbafd-e872-9a6d-5c09-a82276cf39a3.png)

ペーストするとConvertボタンがアクティブになるのでを押すと。。
![2021-08-31 17_22_32-Word2html App.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207875/f86012cd-e940-bd2d-d84e-b1121a8881b8.png)



## 3. できたよ！

![2021-08-31 17_28_04-Word2html App.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207875/68b50d39-bce4-bf26-be45-a66ccb3b25e7.png)

# 似たようなツール
https://word2cleanhtml.com/
https://wordtohtml.net/
https://wordhtml.com/

もう一個、インターフェースの参考にしたサイトがあったと思ったんですが、みつかりません。。UIレイアウトはそのサイトのパクリです。
これらのツールのほうが画像とかテーブルとか多機能です。
私は改行は&lt;br&gt;タグを入れたかったので、自分のツールを作りました。
[ESLint]関数の最大長を設定し、リファクタリングに役立てる。

関数の行数は絶対的な指標ではないですが、リファクタリング対象の関数を検出するのに使うことができます。

例えば、300行の関数があったと想像してみましょう。
多分、この関数はやりたいことが多すぎる気がしています。
関数内でごちゃごちゃやってそうなので、テストもしづらいでしょう。
関数名も実態を表していないがしてきました。
また、300行のどこかにコメントが書いてあったとして、メンテ忘れも発生しそうですね。
よくないことだらけです。

そんな行数の関数書かないよと思うかもしれませんが、
何年も稼働しているサービスだと300行まではいかなくても、
長めの関数はそこそこあるのではないでしょうか。

ESLintにルールを設定して、長すぎるコードを検出して、
既存プロジェクトのリファクタリングをしていきましょう。

## ESLintのmax-statementsを設定する。

ESLintのmax-statementsルールを使うことで、関数の最大長を指定できます。

[enforce a maximum number of statements allowed in function blocks (max-statements)](https://eslint.org/docs/rules/max-statements)

ESLintのルールに記述しましょう。今回は.eslintrc.jsonに記述します。

```json
{
  ~~
  "rules": {
    "max-statements": ["warn", 30]
  }
}
```

errorでもいいですが、とりあえずwarnで設定しました。

スクロールしなくてすむ限界値かなということで30行で設定しています。
チーム次第ではもっと短くした方がいいと思います。
これで、30行以上の関数に警告が出るようになったかと存じます。

ただ、これだと関数コンポーネントも警告対象になってしまいます。
JSXやpropsの記述もあるのでコンポーネントが30行縛りだとちょっと苦しいですね。

## 関数コンポーネント内の関数を検出対象にする

オプションとしてignoreTopLevelFunctionsを設定すればOKです。

```json
{
  "extends": [
		// 省略
  ],
  "rules": {
		// 省略
    "max-statements": ["warn", 30, { "ignoreTopLevelFunctions": true }]
  }
}
```

これで、関数コンポーネント内の関数のみ警告が出るようになります。

---

他の人が読みやすいコードという前提で、関数は短い方がいいと思います。
リファクタリング対象を見つけてどんどん短くしていきましょー。
CのあいまいなソースコードをRustで実行する 

この記事はCの未定義動作など、あいまいなソースコードをRustでコンパイル・実行し
コンパイル・実行結果を比較してみよう、というものです。
Webブラウザのみで確認できるシミュレータを使うので、気になった方は後述のシミュレータで動作確認してみてください。


# 背景
Rustの学習を始めて自社の勉強会でアウトプットすることにしました。
C/C++とRustのコードを比較し、Rustの安全さ・モダンさを知ってもらえれば・・・と思いました。
RustからC/C++の安全なソースコードの書き方も学べるかな、と思ったのも勉強会・記事を書いた理由です。
Rust初心者の方向けの内容と思います。

# 資料とソースコード
資料とソースコードは次の場所に置いています。適宜参照ください。

## 資料
[Speaker Deck](https://speakerdeck.com/grace2riku/20210830-rustru-xue-shi "Speaker Deckの資料")
または
[SlideShare](https://www.slideshare.net/KoujiAbe/20210830-rust "SlideShareの資料")

**※資料の28ページ以降にはCとRustの実行結果を記載しています。
こちらは後から確認することをお勧めします。**

## ソースコード
[ソースコード](https://github.com/grace2riku/c_cpp_vs_rust/tree/master "ソースコード")


# 未定義動作
RustとCのコードを比較するにあたりCの標準規格は**C99**にすることにしました。
理由は仕事で使っているコンパイラのバージョンと同じだからです。

C99の**未定義動作**の定義はこちらです。
[未定義動作](https://ja.wikipedia.org/wiki/%E6%9C%AA%E5%AE%9A%E7%BE%A9%E5%8B%95%E4%BD%9C "未定義動作")

コンパイラは
<u>**未定義の動作に対して，その状況を無視して予測不可能な結果を返してもよい。**</u>
だそうです。

未定義動作に該当するコードを書いてしまうと危険そうですね・・・。


# 確認環境
RustとC/C++の確認環境は次にしました。

## C/C++
[wandbox](https://wandbox.org/ "C/C++のシミュレータはwandbox")
Cの設定はデフォルトから次の項目を変更します。

* Languages ⇛ C
* コンパイラ ⇛ gcc 11.1.0
* 標準規格 ⇛ C99


## Rust
[Rust Playground](https://play.rust-lang.org/ "RustのシミュレータはRust Playground")
デフォルトの設定のままにします。動作確認したときの設定は次になっていました。
* Stable version: 1.54
* Edition 2018


# 確認テーマ(CとRustの比較)
次のテーマについてC、Rustでコンパイル・実行結果を比較します。
ファイル拡張子はCは*.c, Rustは*.rsです。


## 1. 整数型オーバーフロー: val_overflow.*
整数型の有効範囲を超えた値を代入し実行してみます。

## 2. 未初期化変数の参照: uninitialized_val.*
定義した変数を初期化することなく参照・使用します。

## 3. ゼロ割り: div_by_zero.*
0で割ります。

## 4. 配列要素外アクセス: array_index_err.*
定義した配列の要素数を超えた領域にアクセスします。

## 5. ビットシフトオーバーフロー: shift_overflow.* 
変数型のビット長を超えてビットシフトさせてみます。

## 6. ビットシフト負の数: shift_negative.*
ビットシフトに負の数を指定します。

## 7. enum, switch: enum_switch.*
switchとmatch、enumについてCとRustで比較してみます。
* Cはswitch、Rustはmatch文の条件をひとつ削除して実行してみてください。
* print_shape(Circle);の引数Circleを1(または任意の整数値)に変更して実行してみてください。


# 確認テーマ(C++とRustの比較)
ファイル拡張子はC++は*.cpp, Rustは*.rsです。
wandboxの【Languages】は【C++】に変更し実行してみてください。


## 1. 多態: polymorphism.*
多態の説明にありそうなサンプルコードを書きました。こちらのテーマはソースコードを比較してみてください。

次がサンプルコードのクラス図です。
![polymorphism.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/130f9929-9d22-60ba-d142-ca82f4a13824.png)


図形を抽象クラスとして、円・三角形・正方形の各クラスに実装を行います。

抽象クラスのメソッドは次の2つです。
* 図形の種別を表示するprint_type
* 図形の面積を計算するcalc_area

実装クラスに面積を計算するためのプロパティを追加しています。
私は多態をRustで実現したことがなかったので実装してみました。
コードの比較をするためにC++でも多態を書いてみました。
普段C++を使っていないこともあり仮想関数の実装について忘れていました。
Rustで多態をやってみた感想ですが、C++と変わらずむしろC++よりもシンプルに書けたような気がしました。


# 最後に
ここまで読んでいただきありがとうございました。
C・C++とRustの比較は如何でしたでしょうか?
実際にソースコードを実行することでRustのコンパイラの安全性が体感できたのではないでしょうか。
Rustの言語仕様からより安全なC、C++ソースコードを書く際のなにかヒントになれば嬉しいです。
【Python, Jupyter】他のノートブックの特定のセルの内容を新規セルにコピーする。

何らかの理由で別のノートブックからプログラム的にセルをコピーしたくなった際に参考にしてください。

```python 
def addCellFromOtherIPYNB(path='', cell_num=0):
    from json import loads
    assert path
    with open(path, 'r') as f:
        data = loads(f.read())
    source = ''.join(data['cells'][cell_num]['source'])
    get_ipython().set_next_input(source)
```

`get_ipython()`で得られるオブジェクトには他にもいくらか使い道の有りそうな関数があるので、興味があればチェックしてみることをおすすめします。
with できるクラスにパラメータを渡したいとき

なんかググって出てくる `__enter__` のサンプルとかってだいたい

```python
with WithClass() as x:
  x.hoge()
```

みたいに `with` の中でコンストラクタ呼んで即使い捨ててるけど、
別に使い回すこともメンバ変数持たせることもできるんですよね。

```python:a.py
class Enterable:
    def __init__(self, *args, **kwargs):
        print("init")
        self.args = args
        self.kwargs = kwargs
        self.count = 0

    def hoge(self):
        print("hoge", self.count, self.args, self.kwargs)

    def __enter__(self):
        self.count += 1
        print("-" * 10)
        print("enter", self.count)
        return self

    def __exit__(self, ex_type, ex_value, trace):
        print("exit", self.count)


x = Enterable(1, 2, foo=3, bar=4)

with x: x.hoge()
with x: x.hoge()
with x: x.hoge()
```

```bash
$ python a.py
init
----------
enter 1
hoge 1 (1, 2) {'foo': 3, 'bar': 4}
exit 1
----------
enter 2
hoge 2 (1, 2) {'foo': 3, 'bar': 4}
exit 2
----------
enter 3
hoge 3 (1, 2) {'foo': 3, 'bar': 4}
exit 3
```


## おまけ：`__enter__` に引数を渡したいとき

`@contextlib.contextmanager` 使うとそれ相当のことができます。
この場合、 class 自体は `__enter__` 無しの普通のクラスになって、メンバ関数をデコレートすることで実現されます。

`yield` の引数は `as` で指定した変数に渡ってきます。
例外補足する場合は `yield` を try - except すればOK。

```python:b.py
import contextlib

class EnterableWithArgs:
    def __init__(self, *args, **kwargs):
        print("init")
        self.args = args
        self.kwargs = kwargs
        self.count = 0

    @contextlib.contextmanager
    def hoge(self, arg_with_context):
        print("-" * 10)
        self.count += 1
        print("hoge", self.count, self.args, self.kwargs, arg_with_context)
        yield self

x = EnterableWithArgs(1, 2, foo=3, bar=4)

with x.hoge(100) as y: print(y)
with x.hoge(200) as y: print(y)
with x.hoge(300) as y: print(y)
```

```bash
$ python b.py
init
----------
hoge 1 (1, 2) {'foo': 3, 'bar': 4} 100
<__main__.EnterableWithArgs object at 0x1070c22e0>
----------
hoge 2 (1, 2) {'foo': 3, 'bar': 4} 200
<__main__.EnterableWithArgs object at 0x1070c22e0>
----------
hoge 3 (1, 2) {'foo': 3, 'bar': 4} 300
<__main__.EnterableWithArgs object at 0x1070c22e0>
```

っていう話。
Python で Selenium を使用し、ChromeDriver を利用している時、バージョンを自動でアップデートする方法

## ChromeDriver をいちいちバージョン確認してアップデートしなくていい方法を教わったのでメモ
### 1. 環境

| 内容 | バージョン |
|:-|:-|
| OS  | Windows 10 Pro (64bit)  |
| Chrome  | 92.0.4515.159  |
| ChromeDriver  | 92.0.4515.107  |
| Python  | 3.9.0  |
| selenium  | 3.141.0  |

+ Visual Studio Code

| アイテム | バージョン |
|:-|:-|
| バージョン  | 1.59.1 (user setup)  |
| コミット  | 3866c3553be8b268c8a7f8c0482c0c0177aa8bfa  |
| 日付  | 2021-08-19T11:56:46.957Z  |
| Electron  | 13.1.7  |
| Chrome  | 91.0.4472.124  |
| Node.js  | 14.16.0  |
| V8  | 9.1.269.36-electron.0  |
| OS  | Windows_NT x64 10.0.19042  |
| Python | 3.9.0 64bit  |

### 2. 現状
1. Chrome のバージョンチェック。
1. Chrome Driver のサイト で Chrome と近いバージョンのものをダウンロード。
1. 中身をインストール。

Chrome のバージョンが変わると毎回これをしなければならないので、自動アップデートがしたい。

### 3. 自動アップデート
以下のモジュールをインストール
`pip install webdriver-manager`

コードを一部書き換える。
これ↓を

```python
from selenium import webdriver
import chromedriver_binary
 
driver = webdriver.Chrome()
driver.get('https://google.com')
```

こう↓

```python
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
 
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://google.com')
```
2行目と4行目を変更しただけ。
ちなみに、これ↓も同じように、

```python
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get('https://www.google.com/')
```
こう↓

```python
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://www.google.com/')
```
これだけで自動アップデートなんてありがたいですね！

### 4. 参考にさせて頂いたサイト

https://yuki.world/python-selenium-chromedriver-auto-update/
テストマシンの事前準備用のバッチファイルを作成したときの備忘録

## はじめに

バッチファイル(.bat)でテストマシンでの必要ツールのインストールといった事前準備を行わせるために作成をはじめました。
ちょっと詰まった箇所があったため備忘録として残します。

## 作成バッチファイル

```bat
@echo off

rem /* \\ネットワーク上のとあるフォルダに格納されたインストーラをTestフォルダごとテストマシンのデスクトップにコピーする */
xcopy /e /d /y /c  \\ネットワーク上のTestフォルダ\ %USERPROFILE%\Desktop\Test\

rem /* ツールをサイレントインストールする */
rem /* コマンドライン上でexe実行させる場合にワイルドカードが利用できないため下記のようにfor文で実行させている */
for %%A in (%USERPROFILE%\Desktop\Test\初回インストール用\Setup*.exe) do (
  start %%A /qr
)
```
上記バッチファイルで困ったこととして、Testフォルダをネットワーク上からテストマシンにコピーしてくるまでは良かったが、インストーラをワイルドカード指定で実行できず困ってしまった。
（Testフォルダ内のインストーラはSetup20210831.exeのようにバージョンが更新されていくため、バージョンの部分をワイルドカード指定したかった）

解決策は以下の記事が参考になりました。

[windows\-7 — Windowsコマンドシェルにワイルドカードパスを展開させる方法はありますか？](https://www.it-mure.jp.net/ja/windows-7/windows%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%B7%E3%82%A7%E3%83%AB%E3%81%AB%E3%83%AF%E3%82%A4%E3%83%AB%E3%83%89%E3%82%AB%E3%83%BC%E3%83%89%E3%83%91%E3%82%B9%E3%82%92%E5%B1%95%E9%96%8B%E3%81%95%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F/959141814/)

こちらを参考にfor文で動作させるようにして解決できました。
Swift script で複数ファイルのモジュールを読み込む

## はじめに

Swift は以下のように実行することで、コンパイルなしに簡単に実行できます

```shell
swift main.swift
```

ちょっと動かしてみたいときや簡易コマンドラインツールとして実行したいときに非常に便利です

ただし、1ファイルに全て書かないといけないため、複数モジュールに分かれるような複雑なコードの場合、すごく長くて管理しにくくなります

そもそも複雑な処理なら、ちゃんと XCode でプロジェクト作れという正論もありますが、、、

気軽に実行しつつ、複数ファイルに分割したいときの解決方法が stack overflow にあったので、少し改良してまとめました

https://stackoverflow.com/questions/28069043/is-there-a-way-to-have-a-swift-script-use-multiple-files

## 複数ファイルを読み込んで Swift を実行する

以下のようにすることで複数ファイルを読み込むことができます

stack overflow からコードを抜粋

```shell
cat A.swift B.swift main.swift | swift -
```

つまり、以下のことを実行しています

- `cat` コマンドで A.swift と B.swift のテキストを結合して標準出力する
- `|` （パイプ）で次のコマンドの入力に渡す
- `swift -` で入力されたコードを実行する

なるほど、これなら確かに複数ファイルを横断できますね

このままだとファイル数が多くなったときに不便なので、 `cat` のワイルドカードを使いましょう

例えば、以下のようなディレクトリー構成のとき

```text
root/
├ main.swift
├ Extensions/
│  ├ A.swift
│  └ B.swift
└ Modules/
   └ C.swift
```

各ディレクトリー配下を全て読むには、以下のようにします

```shell
cat Extensions/* Modules/* main.swift | swift -
```

ディレクトリーも多いという場合、以下のようにすることも可能です

ディレクトリー構成

```text
root/
├ main.swift
└ imports/
  ├ Extensions/
  │  ├ A.swift
  │  └ B.swift
  └ Modules/
     └ C.swift
```

実行コマンド

```shell
cat imports/*/* main.swift | swift -
```

後は上記コマンドをシェルスクリプトにでもしておけば簡単に実行できます

## 実装例

[以前の記事（Swift script で CoreML モデルによる物体検出を実行する）](https://qiita.com/RyoWakabayashi/items/216b5842c67b428029d7)を上記の方法で分割しました

https://github.com/RyoWakabayashi/mlmodel_scripts

分割したときのコミットはこちら

https://github.com/RyoWakabayashi/mlmodel_scripts/commit/3e301c786ef94f050d532e50af32817666a9e5a2

## おわりに

これを応用すれば、既存コードを使いまわしたスクリプトも簡単に組めますね
React HooksのuseSWRのinitialDataでエラー

React hooksのuseSWRにおいて初期値を設定する際のオプション名が initialData から fallbackData に変わったようです。

### 旧

```javascript
const { data: tasks, error } = useSWR('todosFetch', fetcher, {
    initialData: staticTasks,
    revalidateOnMount: true,
})
```

### 新

```javascript
const { data: tasks, error } = useSWR('todosFetch', fetcher, {
    fallbackData: staticTasks,
    revalidateOnMount: true,
})
```

###参考
https://gitmemory.cn/repo/vercel/swr/issues/1375

理由に関してはこんな感じらしい
https://twitter.com/koba04/status/1431612709808664578
【CSS】ホバー時のアンダーラインアニメーションサンプル

Webデザインでよく使うアンダーライン（下線）アニメーションのサンプルです。
ナビゲーションなどによく使われている使用頻度の高いもの３パターンになります。


#左からフェードインする下線
hoverすると左から右へアンダーラインが引かれます。カーソルを離すと左へ戻ります。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="OJgMZYJ" data-user="kanna999-" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kanna999-/pen/OJgMZYJ">
  左からフェードインする下線</a> by m-akagi (<a href="https://codepen.io/kanna999-">@kanna999-</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>



#下から上へフェードインする下線
hoverすると下から上へアンダーラインがフェードインします。カーソルを離すと下に戻ります。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="NWgxzWN" data-user="kanna999-" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kanna999-/pen/NWgxzWN">
  下から上へフェードインする下線</a> by m-akagi (<a href="https://codepen.io/kanna999-">@kanna999-</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>



#中央から左右に伸びる下線
hoverすると中央から左右に線が伸びます。カーソルを外すと中央に戻ります。


<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="dyRGKoa" data-user="kanna999-" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kanna999-/pen/dyRGKoa">
  中央から左右に伸びる下線</a> by m-akagi (<a href="https://codepen.io/kanna999-">@kanna999-</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
(laravel) Content-Type: image/jpeg のリクエストを受け取って保存する

## 概要

LINE の Messaging API が画像ファイルを直接渡す形になっていたので、真似するために調べた。

普通は `multipart/form-data` の方が `$request->validate()` も使えて扱いやすい。

## 環境

- PHP 7.4.22
- Laravel 8.56.0
- Laravel Sail 1.10.1

## 実装

```php
Route::post('test', function (Request $request) {
    $content = $request->getContent(true);
    Storage::put('test.jpg', $content);
});
```

### 取得

`getContent()` の第一引数を `true` にすると `resource` として取得する。

```php
$content = $request->getContent(true);
```

### 保存

`resource` はそのまま `Storage::put()` などに渡して保存できる。

```php
Storage::put('test.jpg', $content);
```

## 動作確認

curl を使って確認する場合、`-T, --upload-file <file>` オプションにファイルパスを指定する。

```
curl -X POST http://localhost/test
    -H 'Content-Type: image/jpeg'
    -T ./image.jpg
```

`storage/app/test.jpg` が作成されているのを確認した。

# 参考資料

https://modess.io/2013/07/25/get-raw-post-data-in-laravel/
【JavaScript】==と===の違いについて

# はじめに
アウトプットが苦手な自分が練習の一環として記事を書いてみる。

第五回目です。

今回はJavaScriptで「==」と「===」の違いについて書いていきます。

# 等価演算子 (==)
等価演算子は方は比較するもの同士の型を見て、型が異なる場合は同じ型に変換してから比較を行います。
例えば数値の「1」と文字列の「'1'」を比較する場合、文字列の「'1'」を数値型に変換してから比較する挙動となります。

```javascript:等価演算子
console.log('1' == 1); // true
console.log('0' == 0); // true
console.log(true == 1); // true
console.log(false == 0); // true
console.log('' == 0); // true
console.log(undefined == null); // true
```

# 厳密等価演算子 (===)
厳密等価演算子は等価演算子と違い型が異なる同士の場合でも型の変換が行われません。
よって先ほど等価演算子でtrueが返っていたものが厳密等価演算子ではfalseが返ってきます。

```javascript:厳密等価演算子
console.log('1' === 1); // false
console.log('0' === 0); // false
console.log(true === 1); // false
console.log(false === 0); // false
console.log('' === 0); // false
console.log(undefined === null); // false
```

# まとめ
以上になります。

今回のように等価演算子と厳密等価演算子で結果が異なること場合があるため、
比較を行う際はどのようなことをしたいのか考え使用する演算子を使い分ける必要があります。

個人的には等価演算子だと空文字が0と同じ値として処理されてしまい予期せぬ挙動に
なってしまうことがたまーにあったりしたので、
基本的には厳密演算子が使える言語の場合は厳密演算子を使用するようにしています。
未経験の人がプログラミングの勉強を始めるならまずはWordPressが最適な話

数年前からプログラミングブームが来ています。

副業もしやすく、好きな場所で働けて、稼ぎやすい。そんな魅力に惹かれて始める方も多いのではないでしょうか。

勉強を始めようと思って、スクールを検討したり、書籍を買ったことある方もいるかもしれません。

しかし、そのように未経験から勉強を始める方に言いたいのですが、まずはお金をかけずWordPressから始めた方がいいですよって話です。

大体の人がプログラミングを勉強するってなったら、人から教えてもらうためにお金を払うのですが、最初からお金を払うのはもったいなすぎます

なぜなら向いているかどうかもわからないですし、途中でやめたくなる可能性だってあるので。

それなのに、スクールで50万ぐらいの大金を払って学ぼうなんてリスクが大きすぎるとは思いませんか？しかし、皆さんこのようにお金を払ったけど、やめていく人が多いんですよね。

つまり、スクールに大金払うぐらいだったら月額1000円以下のWordPressにお金払って、まずはそこからHTMLとCSSを勉強したほうが、お金の無駄にならなくて済むということです。

というわけでこれからプログラミングを勉強しようと思っている方は、WordPressから始めてみてください。そこで面白そうだなって思ったらスクールを検討してみましょう。

最後にちょっと宣伝。

Webマーケティングの学習ブログを運営しています。未経験からWEBマーケターになった実体験をもとに記事を作っているので、これからはプログラミングじゃなくて、Webマーケティングに興味がある方は是非ご覧ください。

[ブログはこちら](https://shotakoblog.com/ "Webマーケティング学習ブログ")

https://shotakoblog.com/web-marketing-school/
Pythonいろんな構文

## 変数代入について

まとめて代入

```python
x, y, z = 1, 10, 100
print(x, y, z)  # 1 10 100
```

## リスト、辞書型の展開

### リストの展開

```python
test = [1, 2, 3]
print([test, 4, 5])  # [[1, 2, 3], 4, 5]
print([*test, 4, 5])  # [1, 2, 3, 4, 5]
```
### 辞書型の展開

```python
test = {'apple': 'red', 'remon': 'yellow'}
print({**test,'cherrie': 'pink'}) # {'apple': 'red', 'remon': 'yellow', 'cherrie': 'pink'}
```

## 真偽

`test`が`None`ではないまたは`True`の場合は真

```python
if test:
    print('OK')
```

`test`が`None`または`False`の場合は真

```python
if not test:
    print('NG')
```

### inは辞書型でも使える

```python
test = {'age': 20}
if 'age' in test and test['age'] >= 20:
    print('大人です')
```

### 比較演算子の組み合わせ

```python
if x >= 0 and x <= 20:
if 0 <= x <= 20:
```

## 三項演算子

if文の中の処理が少ないとき、１行で済ませる方法があります。

```
(変数) = (条件が真のときの値) if (条件式) else (条件が偽のときの値) 
```

```python
if test >= 0:
    message = "正の数または0です"
else:
    message = "負の数です"
# ↓一行で終わり
message = "正の数または0です" if test >= 0 else "負の数です"
```

## 文字列の扱い

### 文字列の中に変数を埋め込む

```python
name = "太郎"
print("私は" + name + "です")

# 一番見やすく簡単
print(f"私は{name}です")

# format関数
print("私は{}です".format(name))

print("私は%sです" % name)
```

### 型変換

```python
# 文字から数字へ
int('100') # 100

# 数字から文字へ
str(100) # "100"
```

### 文字列置換

`は`と`も`を置換している。

```python
print("私は男です。".replace("は", "も"))
# 私も男です。
```

### 金額のカンマ

'money'は数値型ですがフォーマットでカンマをつけると文字列になります。

```python
money = 12345678
print("代金は￥{:,}円になります。".format(money))
# 代金は￥12,345,678円になります。
```

### 小数点以下丸め

```python
print("{:,.2f}".format(1234.5678))
# 1,234.57
```

## for文

### indexと一緒に繰り返す

`index`には0～カウントアップする数字が入っています。
`value`にはtestの中の値が入っています。

```python
test = [1, 10, 15, 16]

for index, value in enumerate(test):
    print('index:', index, 'value:', value, ',', end=' ')
```

### 複数のリストを同時に回す

```python
list1 = [1, 2, 3, 4]
list2 = ["リンゴ", "みかん", "もも", "パイナポー"]

for num, fruit in zip(list1, list2):
  print(f"{fruit}が{num}個")

# リンゴが1個
# みかんが2個
# ももが3個
# パイナポーが4個
```

**`enumerate`と`zip`の合わせ技もできる。**

### 辞書のFOR文

普通にするとkeyの値しか入ってない。

```python
test = {'apple': 'red', 'remon': 'yellow'}

for key in test:
    print(key)
　　print(test[key])
```

`.items()`を付与することでキーと値が取れるようになる。

```python
for key, value in test.items():
    print(f"{key}:{value}")
```

## 配列

### 配列内の重複を削除

```python
test = [1, 2, 3, 3, 5, 1]
print(list(set(test))) # [1, 2, 3, 5]
```

### ソート（昇順降順）

```python
test = [10, 25, 4, 100, 69]
print(sorted(test)) # [4, 10, 25, 69, 100]
print(sorted(test, reverse=True)) # [100, 69, 25, 10, 4]

test = [[10, 25], [4, 100], [69, 71]]
print(sorted(test, key=lambda item: item[1])) # [[10, 25], [69, 71], [4, 100]]
```

### 辞書型のソート

```python
test = [{'name': 'taro', 'age': 18},{'name': 'jiro', 'age': 12}]

# [{'name': 'jiro', 'age': 12}, {'name': 'taro', 'age': 18}]
print(sorted(test, key=lambda item: item['age']))
```

## 例外

`try`の中でエラーが起こった場合`except`に入ります。
`finally`はエラーになってもならなくても最終的に通るところです。
`finally`はなくてもいいです。
エラーの場合、何もしない場合は`except`の中に`pass`


```python
try:
    print("テスト")
except Exception:
    print("エラー！")
finally:
    print("ここは絶対通る")
```

エラーの場合、何もしない場合は`except`の中は`pass`

```python
try:
    print("テスト")
except Exception:
    pass
```
Rails active_model_serializerとは

#serializerとは
データを保存したり、ネットワークで送受信できるようにしたりするものです。

#active_model_serializerとは
RailsでAPIを叩いて開発する時、わかりやすいJSON形式にしてくれるものです。

⚫︎公式ドキュメントに概要や使い方が乗っています。
https://github.com/rails-api/active_model_serializers
⚫︎公式ドキュメント翻訳
https://qiita.com/ikamirin/items/be809c845f6104aa6f48#adapters

#active_model_serializerの導入

```Gemfile
gem 'active_model_serializers', '~> 0.10.0'
```
を追記

```
$ bundle install
```
公式ドキュメントではbundle　なのでbundleも可。

```
$ bundle exec rails g serializer Staff(モデル名)

```
上のコマンドを実行し、serializersディレクトリが作成されuser_serializer.rbが生成される。

```staff_serializer.rb

class PostSerializer < ApplicationSerializer
  attributes :id
end

```

この中を開発したいものによってbelongs_toやhas_manyを入れていく。

例えば

```staff_serializer.rb

class StaffSerializer < ApplicationSerializer
  attributes :id :name :account :email 
  belongs_to :office
end

```

みたいな感じです。


#名前空間を使った時
コントオーラーを作成した時ルーティングでapi/v1のような名前空間を定義した時
は下のようになります。

```
$ bundle exec rails g controller  api/v1/staffs index create show update destroy

```

```api/v1/staffs_controller.rb

class Api::V1::StaffSerializer < ActiveModel::Serializer
  attributes :id, :name,:account, :email,
end

```

みたいにclassの後にApi::V1が追加されます。

```api/v1/staffs_controller.rb

module Api::V1
class Api::V1::UsersController < ApplicationController
 #省略

  def index
    staffs = Staff.all
    render json: staffs
  end

#省略
end

```
みたいに使えます。
あくまで参考にお願いします。




⚫︎参考資料
https://qiita.com/onikan/items/d24ce08adf144c326812
https://qiita.com/ikamirin/items/be809c845f6104aa6f48
https://rooter.jp/programming/rails-activemodelserializers/
https://qiita.com/TeruhisaFukumoto/items/33dd278115efe6f1fa31
https://qiita.com/TeruhisaFukumoto/items/33dd278115efe6f1fa31
WordPress Rest APIとパーマリンク

##Rest APIで投稿一覧を取得したい
https://サイトのURL/wp-json/wp/v2/posts
上記のようにすれば投稿一覧が取得できる

##なぜか404エラーになるんだけど・・・
なんとパーマリンクの設定が「基本」のままだと動かないらしい。とりあえずパーマリンクの設定を「投稿名」にすると動いた！

##パーマリンクを「基本」のままでRestAPI使いたいんだけど・・・
https://サイトのURL/?rest_route=/wp/v2/posts
どうもこんな感じで書くといいみたい。
カスタムAPIも問題なく動いたよ。
Unity の Video Player で 複数の動画を同時に再生する

# はじめに
Unity の シーン中で Video Player を用いたストリーミングで複数の動画を同時に再生したかったのですが、リクエストが複数飛ぶことによる負荷や遅延が生じたときに再生タイミングがずれることなどに悩まされまして、その際の対処について記します。
# 方法
あらかじめすべての動画を一つの画面の中にまとめて出力しておき、ストリーミング元に置いておいて、読み込んだあとUnityシーン中で分割する方法をとりました。

# セッティング
## Video のストリーミング
シーン中の Video Player は一つだけにして、その出力先を動画ファイルと同じアスペクト比のRender Texture にします。今回は1:2 の動画を5つ表示したかったので、横に並べてつなげた5:2の動画・Render Texture を用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321302/1c5af0c5-a8c2-11c5-b545-42f7d5138a9f.png)

### 確認
普通にPlane に Render Texture を適用するとこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321302/473b3653-16c6-4007-a9b2-1911b858bf8e.png)

## 表示用のマテリアル
表示する箇所ごとにマテリアルを用意します。シェーダは共通で Unlit Shader のデフォルトのものでかまいません。
5つのPlaneを用意し、それらにこのマテリアルを適用します。次に、Inspector からテクスチャとして先ほどのレンダーテクスチャを選び、に適用すると、次のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321302/c603c053-54c2-1b56-9dec-b909e9c30746.png)



### タイリングとオフセット
次に、uv座標とレンダーテクスチャ上のピクセルとの関係を設定していきます。
次のように設定すると、左端の領域だけが表示されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321302/8d671c60-e8cc-c335-b51f-baaf9ef45988.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321302/fc423943-78ae-99e5-fb8b-069973e22d6b.png)


これは、tiling で 横方向のuv座標を 0 ~ 0.2 の範囲に再設定しています。

さらに、offset のx成分を0.2ずつずらしていくと、次のような結果が得られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321302/6000c2e5-4d6d-b09e-d202-d6c06fc2de38.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321302/2393bab2-4f6a-e731-3a11-cc38cab66705.png)

これは上記のuv座標範囲を設定した値だけずらす処理に相当し、左から 0.0~0.2, 0.2~0.4 ... となっています。
順序回路の作法 その3

# 概要

順序回路を理解する。
JKフリップフロップの真理値表を書いてみた。

# 写真

0-J
1-K
4-Q
5-Q_

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/dbecd6b0-9605-5ce8-e3bb-89e2a5f628ef.jpeg)


# 成果物

https://embed.plnkr.co/plunk/YH3KIa6276EiCmG9

以上。
サブネット化したIPアドレスの割り当て

#考え方
あるサブネットのネットワークアドレスが192.168.143.64/26のとき、利用可能なアドレス。

64の2進数は0100 0000でこれが割り振りが可能なアドレスの一番始め。(ネットワークアドレス)
厳密にはネットワークアドレスは割り振ることができないため、0100 0001から割り振りが可能。

また、最後がブロードキャストアドレスでこの例だと、0111 1111となるため、割り振り可能な最大値は0111 1110となる。

ということは、このIPアドレスのホスト部は0100 0001〜0111 1110の範囲となる。

#参考

[Network Study1](https://www.infraexpert.com/study/study12.html "Network Study1")
【Unity】画像、音声のインポート設定の要点

## [🖼️画像のインポート](https://docs.unity3d.com/ja/2019.4/Manual/class-TextureImporter.html)
![ImportSprite.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/9b35b9ed-f534-726d-b7cb-f63ffd6c34bd.png)
圧縮を利用するために、テクスチャの縦横のサイズは 2のべき乗 (...512,1024,2048...) にしてください。比率は width,height や Transform.localScale 等で調整して下さい。また、縮小後の縦横のサイズが2のべき乗になるケースでも圧縮できます（例えば 1600×400px のテクスチャは 1024×256px のテクスチャとして圧縮できます）。
なお、UI画像のような、アトラス化してから圧縮する画像は、サイズや比率を気にする必要はありません。

|項目名|推奨|説明|
|-|-|-|
|Alpha Source|透過情報を利用しなければNone|透過情報の利用について設定できます。|
|Generate Mip Maps|遠くに置かないテクスチャや、小さいテクスチャであれば無効|テクスチャが遠くにあるとき、縮小済みのテクスチャを描画することで、負荷軽減とちらつきを防止する機能です。有効にすると縮小済みのテクスチャを内部で保存するため、ファイルサイズが大きくなります。|
|Max Size|目立たない程度に小さく|画像の長辺の最大サイズを指定します。|
|Use Crunch Compression|有効にして、目立たない程度にQualityを落とす|画像を圧縮してファイルサイズを大幅に削減できます。|

## [🎵音声のインポート](https://docs.unity3d.com/ja/2018.4/Manual/class-AudioClip.html)

![ImportAudioClip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/080fa6c0-8992-9898-941b-9d8e8c112574.png)

|項目|推奨|説明|
|-|-|-|
|Force To Mono|効果音なら有効|モノラル音源として扱うフラグです。|
|Load In Background|基本有効|非同期読み込みを有効にするフラグです。|
|Preload Audio Data|基本有効|シーンと同時に音声も読み込むフラグです。|


||✅Load In Background|🟩Load In Background|
|-|-|-|
|✅Preload Audio Data|基本はこの設定です。<br>音声の読み込み完了を待たずにシーンを開始します。シーン開始から数秒の間に音声を再生しようとすると、遅れて再生される恐れがあります。|音声の読み込み完了を待ってからシーンを開始します。シーン開始から数秒の間に、音声を遅延なく再生したい場合はこの設定にします。|
|🟩Preload Audio Data|シーン読み込み時に音声を読み込みません。<br>Play()を呼んでから再生されるまでに遅延があっても問題ない音声ならこの設定にします（環境音など）。|用途が思いつきません（用途があったら教えてください）。|

### 音声の読み込みとアンロードを制御する方法

AudioClip はスクリプトから読み込み・アンロードできます。
必要に応じて読み込み・アンロードすれば、メモリの使用量を抑えられます。

|関数・プロパティ|説明|
|-|-|
|audioClip.LoadAudioData()|読み込み|
|audioClip.UnloadAudioData()|アンロード|
|audioClip.loadState|読み込み状況の確認|


### Load Type

|Load Type|用途|説明|
|-|-|-|
|Decompress On Load|頻繁に鳴らす効果音|音声を展開してメモリにロードしておきます。<br>メモリを食いますがCPU負荷は軽いです。|
|Compressed In Memory|たまに鳴らす効果音|音声を圧縮したままメモリにロードします。<br>再生する度に音声を展開するのでCPU負荷がかかります。|
|Streaming|BGM|再生する部分のみ展開するので使用メモリをかなり減らせますが、一番CPU負荷がかかります。|

### Compresstion Format
圧縮するほど、容量とメモリを節約できます。圧縮をしないほど、CPUの負荷を減らせます。
|Compresstion Format|用途|説明|
|-|-|-|
|ADPCM|短い効果音|ノイズがかかりますが、低負荷なので大量に再生できます。|
|Vorbis|長い効果音、BGM|ADPCMより圧縮できますが、圧縮するほど高音が潰れます。<br>またCPU負荷も高くなります。|
|PCM||無圧縮|
Dockerコンテナ上にWordpress本番環境を構築してホームページを公開した話

#概要

大学で被験者実験を行うことになり，募集用HPを作成したときの記録です．
大学が管理しているサーバーに，私の指導教員が研究室HPを置いており，
そのサーバーにアカウントを作成してもらえたので，そのサーバー上で募集用HPを作成しました．
同じような境遇だったりする人の参考になればと思います．

#サーバーへ接続 ~ コンテナ立て

docker-composeに関しては，こちらのサイトを大いに参考に(丸パクリ)させていただきましたので，詳細はこちらでご確認いただければと思います．
[簡単便利！DockerでWordPressの開発環境を作ろう。方法＆メリット紹介 - Workship MAGAZINE](https://goworkship.com/magazine/wordpress-docker/)

以下に一応ざっくりとした流れを書いておきます．また上記リンクがリンク切れになった場合は，ymlファイル等の中身もここに載せようと思います．

作成してもらったアカウントでssh接続し，
 /var/www/html/wp  へ移動．(ディレクトリはなかったので作りました）

ディレクトリ wp の中に，
・ wp-content (ディレクトリ)
・ .env 
・ docker-compose.yml
を作成．

ディレクトリ wp で，

```
docker-compose up -d
```

を実行してコンテナ立て完了です．

※注意 
自分はwp-contentというファイルで失敗して，ファイルの削除権限がなかったので，wp-content2というフォルダを新しく作成してwordpressを立ち上げました．しかし，wordpressのアドインがうまく作動しなかったので，'wp-content'というフォルダ名はオリジナルのものに変えない方がいいです．

#サーバー内コンテナに接続 ~ Wordpressホームページ作成

上記URLのサイトにあったように，ローカル環境であれば，

```
http://localhost:3001
```

に接続すれば，ブラウザでWordpressのインストール画面が確認できると思います．
ですが，今回はローカル環境ではありませんので，localhostの部分を現在接続しているサーバーのIPアドレスに変更してください．それで接続できると思います．
(接続できない場合，アクセスが許可されてない可能性がありますので，サーバー管理者に聞いてみてください．これに関しては後述します．）

あとは，wordpressで自由にホームページを編集してください

#ホームページ公開

さて，ホームページの公開ですが，自分がwordpressを編集しているURLである，

```
http://<IPアドレス>:<ポート番号>/
```

にアクセスすれば，外部からもHPを閲覧できますが，ホームページの共有する際にIPアドレスを教えることになります．ので，ドメインを取得してサーバーのIPをAレコードとして登録すれば，

```
http://<取得ドメイン>:<ポート番号>/
```

にブラウザでアクセスすることで，同様の結果が得られます．

※ 外部ネットワークから接続できない場合は，そのポート番号からの外部アクセスをサーバー管理者がシャットアウトしている可能性があります．(私の場合はそうでした．）サーバー管理者に聞いてみてください．

※ SSL通信したい場合は，サーバー側で現在使用しているポートでのSSL通信を許可する必要があるらしいです．これに関しては試せていないです．
参考になるかもしれない記事
[SSL接続（HTTPS）をやろうとしてはまっている人はiptablesを確認しよう](https://qiita.com/EntreGulss/items/54ef3df70338632c750f)

#最後に

上記の流れで，無事HP公開に至りました．
サーバーメンテとかでdockerが落ちると，wordpressの再インストールとかから始めなければいけない可能性があるので，バックアップはしっかり取っておいてくださいね．
(私のは，フォルダ名がwp-content2なので，バックアッププラグインがうまく機能せず，ローカル環境に全く同じサイトを複製して，何かあったらコードエディタ部分をコピペするようにしてます．)

他にも紆余曲折あった気がするので，思い出したら更新します．
特に何もフォントをダウンロードせずにmatplotlibの日本語豆腐を避ける方法(Windows)

# はじめに
pythonのmatplotlibで日本語を扱うときに豆腐(→ □□)になることがあるだろう。これを避ける方法を調べていると、"サイトから「ipaexg.ttf」をダウンロードして～～"って説明が多いと思う。なんかめんどうだなーって思ったことがある。そもそもすでに標準に持っているフォントじゃダメなの？って思ってたらできるやん。

# コード
以下のようにすると豆腐になる。

```python
import seaborn as sns
import numpy as np
sns.set()
fig=plt.figure()
ax=plt.subplot(1,1,1)
ax.plot(np.arange(-10,11),np.arange(-10,11)**2)
ax.set_title('二次曲線')
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542929/023e507d-1c79-92cb-4813-7b80899d1a02.png)

しかし以下のmsgothic.ttcを使えば、日本語を可視化できる。（おそらくWindowsならデフォルトで入っているはず）
matplotlib.font_managerのfindSystemFonts()で使用できるフォント一覧が取得できるので、その中で"msgothic"と書かれているものだけを取り出して、そのフォントをplt.rcParams['font.family']で設定してあげると、日本語化できる。

```python
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
sns.set()
jpn_fonts=list(np.sort([ttf for ttf in fm.findSystemFonts() if 'ipaexg' in ttf or 'msgothic' in ttf or 'japan' in ttf or 'ipafont' in ttf]))
jpn_font=jpn_fonts[0]
prop = fm.FontProperties(fname=jpn_font)
print(jpn_font)

plt.rcParams['font.family'] = prop.get_name()
fig=plt.figure()
ax=plt.subplot(1,1,1)
ax.plot(np.arange(-10,11),np.arange(-10,11)**2)
ax.set_title('二次曲線')
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542929/ef2761a4-77ac-7d5c-7458-f5738ed283bc.png)

# おわりに
定常的にmsgothicを使いたいなら、matplotlibrcを書き換えたりしないといけないけど、突貫で豆腐を避けるならmsgothicをfindSystemFonts()で取り出してplt.rcParams['font.family']で定義してあげればいいだけなので"サイトから「ipaexg.ttf」をダウンロードして～～"って作業はいらないと思われる。MacやLinuxの場合は知らない。
以上！

※追記
あ、matplotlibは昔ttcファイルに対応していなかったからipaexg.ttfをダウンロードしてたんだね…知らなかった…。

※追記2
WSL2(Windows Subsystem for Linux 2)上でpythonを使っていて、豆腐を避けたい人はデフォルトで日本語対応のフォントは入っていないのでインストールする必要がある。
WSL(Ubuntuを使用)上のターミナルで以下のコマンドでipafontをインストール。

```{}
sudo apt install -y fonts-ipafont
```
すると、日本語対応のフォントがいくつか入るのでどれかを選んで使用すればOK。

```{python}
import matplotlib.font_manager as font_manager
import numpy as np
jpn_fonts=list(np.sort([ttf for ttf in font_manager.findSystemFonts() if 'japan' in ttf or 'ipafont' in ttf]))
jpn_font=jpn_fonts[0]
prop = font_manager.FontProperties(fname=jpn_font)

display(jpn_fonts)
print(jpn_font)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542929/d1028c96-8341-3aff-67ac-3f2d9bf2e0c5.png)
Gtk3アプリのTreeViewの表示の簡略化 Part2

###Gtk3 TreeViewの表示の簡略化 Part2

<a href="https://www.mono-project.com/docs/gui/gtksharp/widgets/treeview-tutorial/">gtk-Sharpチュートリアル</a>に書かれているサンプルを簡略化します

####前回からの改良点
TreeViewColumnの中でカラムを追加する
カラムのWidthを変更できるようにする
カラムサイズをFillできるようにする
bindingのlongの対応

<img width="500" alt="スクリーンショット 2020-03-29 12.53.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/825dc505-bfa3-0631-64eb-25a9e83bff95.png">

https://qiita.com/iota_11/items/cf5ac9c11969ad8b8307

[Gtk3アプリ イベントハンドラー自動生成ツール　改良](https://qiita.com/iota_11/items/3318fa527065d4c73a3f)に続く
BOM 付き CSV ファイルを PHP で処理

「phpでcsvを読み込んで項目名をキーにした連想配列をつくる[メモ]」
https://qiita.com/Terasan_Koshigaya/items/00ce0b114e527a572865
で紹介されている、csvToArray.php を使っていた。


```

// csvの1列目をキーにした連想配列を返す（引数：csvファイルのパス）
function csvToArray($csvPath){
  $csvArray = array();
  $firstFlg = true;
  $keys = array();
  $count = 0;
  $file = fopen($csvPath, 'r');

  while ($line = fgetcsv($file)) {
    if($firstFlg){
      for($i = 0; $i < count($line); $i++){
        array_push($keys,$line[$i]);
      }
      $firstFlg = false;
    }else{
      for($i = 0; $i < count($line); $i++){
        $csvArray[$count][$keys[$i]] = $line[$i];
      }
      $count++;
    }
  }
  fclose($file);
  return $csvArray;
}
```

これが、LibreOffice で出力したものは問題なかったけれども、
Excel で出力したCSVをどうもうまく読んでくれない。

以下の test1.csv (問題ない) と test2.csv ( キー名 DATE のデータが空になる ) の違いは無さそうなのだが・・・・

```

$ cat test1.csv
DATE,ID,NAME
2021/7/9,123,JOHN
$ cat test2.csv
DATE,ID,NAME
2021/7/9,123,JOHN


```

中身は同じのようなのにファイルサイズが異なっている

```

$ ls -alh test?.csv
-rw-r--r-- 1 www-data www-data 33  8月 31 12:00 test1.csv
-rw-r--r-- 1 www-data www-data 36  8月 31 11:59 test2.csv
```

改行コード CR/LF の問題かな？ と思ったが、ダンプしてみると違っていた。

```

$ od -ax test1.csv
0000000   D   A   T   E   ,   I   D   ,   N   A   M   E  cr  nl   2   0
           4144    4554    492c    2c44    414e    454d    0a0d    3032
0000020   2   1   /   7   /   9   ,   1   2   3   ,   J   O   H   N  cr
           3132    372f    392f    312c    3332    4a2c    484f    0d4e
0000040  nl
           000a
0000041
$ od -ax test2.csv
0000000   o   ;   ?   D   A   T   E   ,   I   D   ,   N   A   M   E  cr
           bbef    44bf    5441    2c45    4449    4e2c    4d41    0d45
0000020  nl   2   0   2   1   /   7   /   9   ,   1   2   3   ,   J   O
           320a    3230    2f31    2f37    2c39    3231    2c33    4f4a
0000040   H   N  cr  nl
           4e48    0a0d
0000044

```

改行コードではなく、ファイル頭に efbbbf がついています。UTF-8 の BOM ですね。

 
このシステムは、CSVファイルをユーザーでアップロードして処理するものです。

だったのですが、 function csvToArray($csvPath) を呼び出す前に以下のように下処理をしました。

変更前：

```

if (is_uploaded_file($tempfile)) {
  if ( move_uploaded_file($tempfile , $filename )) {
    echo $filename . "をアップロードしました。";
```

変更後：

```

if (is_uploaded_file($tempfile)) {
  if ( move_uploaded_file($tempfile , $filename."_BOM" )) {
    exec ( "nkf -w ".$filename."_BOM > ".$filename );
    echo $filename . "をアップロードしました。";
```

nkf コマンドを呼び出して、-w オプションで BOM ヘッダを消去。

これでちゃんと動くようになりました。