OmniAICreator/Qiita-1.07M huggingface dataset:
Three.jsを使用する時に苦しんだこと

Three.jsを使用して「SCP132jp」を作れるのでは？？
という軽い気持ちで手を出したら、そこは毒沼でした・・・
ずぶの素人の備忘録です。

### 1.どのThree.jsを使うのか
Three.jsは現在下記3種類をダウンロードできます。
・three.js
　通常のthree.js。デバックが容易なので初心者に優しい。
・three.mini.js
　通常のthree.jsよりかなりサイズが小さいので、WEBサイトに公開する際はこっちを使うらしい。
・three.module.js
　ES modulesの規格ライブラリ。mainのJavaScriptファイルから別のJavaScriptファイル(loaderとか)を読み込めるので、HTMLファイルにたくさん記述しなくて便利。記述の際はtype = "module"になるのでちょっと注意。

結論は、作りたいものによる！！ですが
始めたてでジオメトリとかサンプルを作りたい→　three.js
色々理解してきたから、マウスコントロールしたり、外部から3Dファイルを読み込んで作りたい→three.module.js
かなと個人的には思います。
### 2.ディレクトリを間違えるとエラーが多発
これに関しては所詮 ”おま環” な気がしますが、結構苦しんだのであえて書きます。
現在、HDDがは「C:」「D:」「E:」の三つを使用しています。
　1 容量を気にして「E:」にthree.jsをダウンロード
　2 「D:」で作り始め、「E:」のthree.jsを読み込むよう設定
　3 Chromeブラウザに描画 →**CORSオリジンエラー**発生

対策
　ディレクトリの階層構造はちゃんと考える！（当たり前）
　あとは、使用していたのがVScodeのLiveSeverだったので、CDN等を利用するのも良いかと思います。

少し違いますが、three.module.jsを使用した際もエラー多発しました。これは、呼び出すJavaScriptファイルに書いてあるthree.module.jsのパスを書きなおせば直ります。

### 3.カメラ、ライト、ジオメトリー...種類多い
シーン、カメラ、レンダーを用意して、その中にライトや表現したい物体を設置するイメージでコーディングしていきます。各々種類が多いので、よく使うものだけをまとめます。
**1 シーン**
　　　様々なオブジェクトをすべて保持するコンテナで、ステージや舞台のイメージです。オプションはそんなにないですが、オブジェクトを設定したらscene.add()で追加しないと描画されないので注意！
**2 カメラ**
　　　描画する範囲を設定できる。基本的にはPerspectiveCameraを使用しますが、他にも種類があります。

<details><summary>サンプル</summary>

```rb
const camera = new THREE.PerspectiveCamera(垂直視野,アスペクト比,開始距離,終了距離);
//引数はすべて数字
camera.position.set(x座標, y座標, z座標);
//カメラの位置を決める
```
</details>
　

**3 レンダー**
    シーンとカメラをブラウザ画面に描画する。

　
**4 描画する物体の設定**
　　ジオメトリ(形状)、マテリアル(材質)を設定してメッシュ化の流れで書いていきます。
　　・ジオメトリ→立方体、球、円錐等様々
　　・マテリアル→メタリックや透明度、色などたくさんのプロパティを設定できます。
　　・メッシュ→ジオメトリとマテリアルをまとめてシーンに追加できるようにする。
<details><summary>サンプル</summary>

```rb
//ジオメトリ（立方体）
const box = new THREE.BoxGeometry(幅,高さ,深さ);
//マテリアル
const material = new THREE.MeshBasicMaterial({
 color: "#ffffff",
 metalness:0.5,
 //ここにプロパティを書いていく
});
//メッシュ
const mesh = new THREE.Mesh(box, material);
//設定したジオメトリとマテリアルを入れる
```
</details>

**5 ライト**
　物体を照らすライト（マテリアル設定では影響しないこともある）。影を落とすことができるものと できないものがあるので注意。
  ・AmbientLight→基本的なライト。色を設定でき、オブジェクトにもその色が影響する。
  ・SpotLight→スポットライト。影を落とすことができる。
  ・PointLight→全方向に光が発散する。影を落とすことはできない。

<details><summary>サンプル</summary>

```rb
//ライト
const light = new THREE.AmbientLight( 色 );
```
</details>


### 4.三角関数、クォータニオンなど数学の地獄
カメラやメッシュのアニメーションを付ける際に必須です！絶対に使います。

### それでもThree.jsは面白い
　　3Dソフト「Blender」などで作ったモデルをloarderで読み込めば、描画もできるしアニメーションも付けられるし、マテリアルやライト以外にもシェーダーを使えばより多彩な表現ができます！そして、それを作るのはとても楽しいので、触ってみてください。

#### Three.jsのダウンロードはこちらから
https://threejs.org/
AWS S3 Laravel Storage::putFileするときにfalseが帰ってくる

# 概要

- EC2に設置したLaravelアプリケーションの内部処理でファイルをS3に設置する処理でfalseが帰ってくる問題の解決方法をメモ的にまとめる。

# 原因

- S3にアップロードするオブジェクト（ファイル）　のポリシーをLaravel側で明示的にpublicに指定していたため。
- 当該のS3バケットは「オブジェクト所有者」を「ACL無効（推奨）」に設定していたため、アップロードされるオブジェクト（ファイル）個々に権限を指定する事はできず、エラーが発生したっぽい。

# 問題までの経緯

1. EC2のApache上で動作しているLaravelアプリケーションにおいて、formからファイルをPost → 受け取ってS3格納する処理を作成した。
1. 受け取ったファイルをS3にアップロードする処理は下記の様に記載した。（`$file`は任意のバリデーションを通過したFormRequestクラスを継承したリクエストオブジェクトそのまま）

    ```php
    Storage::putFile(ファイル設置するディレクトリのパス, $file, 'public');
    ```

# 問題

1. 上記に記載したputFile処理でfalseが返される（正常にファイルアップロードされている場合、設置先のパスが返される。）

# 問題解決までの経緯

1. アップロード処理を下記のように変更した。

    ```php
    Storage::putFile(ファイル設置するディレクトリのパス, $file);
    ```

1. 正常にファイルをアップロードする事ができた。
1. putFile時にどうしても`public`を指定してファイルアップロードしたい場合、アップロード先のバケットの「オブジェクト所有者」の設定を「ACL有効」に設定し「希望するバケット所有者」のラジオボタンを選択すれば大丈夫だと思う。（筆者未検証
1. ）
Rails7 でSQLiteでなくMariadbを利用する

## 環境
- Rails 7.0.2.3

## 記事・手順
下記の記事ではRails5.0.1とのことでしたが、Rails7でも問題ないことを確認したため備忘掲載。

https://goodbyegangster.hatenablog.com/entry/2017/02/15/215345
Laravel Validation

この記事ではLaravelのバリデーションについて書いてます。
備忘録なので、私が忘れそうなのを追記していきます。

## same／different
バリデーション対象のパラメータどうしを比較する。
### same
値が異なる場合はエラー
```php
$params = [
    'param1' => 'aaa',
    'param2' => 'bbb'
];
$rules = ['param2' => 'same:param1']; // エラー
```
### different
値が同じ場合はエラー
```php
$params = [
    'param1' => 'aaa',
    'param2' => 'aaa'
];
$rules = ['param2' => 'different:param1']; // エラー
```
【UiPath】Orchestrator Managerを使ってみる

# はじめに
Orchestrator Managerというものがあるのはご存じでしょうか？
Orchestrator Managerは、ExcelインプットからOrchestratorにデータを登録したり、Excelに一覧を書き出したりすることができるOrchestrator管理者向けのツールです。UiPath社から公式に出されているものです。
まあまあ規模が大きい環境でOrchestratorを管理されている方は、アセットを一度に数十件登録することがあると思いますが、これを手作業でやってると高確率でオペミスが発生するので、こういったツールを活用して確実かつ効率的にやってしまいたいところです。

# つかうもの
* UiPath Studio 2021.10.4
* Orchestrator Cloud　※2022年3月時点
* Orchestrator Manager 2.2.4

# 準備
Orchestrator Managerは、UiPath Marketplaceに掲載されていますので、以下のページからダウンロードします。

https://marketplace.uipath.com/ja/listings/orchestrator-manager

.zipファイルがダウンロードされるので、任意の場所に展開します。
このツールは、UiPathワークフローで作られているので、Main.xamlをクリックしてStudioを開きます。
<img width="400" alt="OCM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/a084c6dd-e7a8-c627-4703-52995835dddb.png">

# 実行～認証
実行はStudioから実行します。パブリッシュして実行する場合は、Workbooksフォルダをプロジェクトフォルダの外に出しておくことをお勧めします。
実行すると、認証画面が立ち上がります。
![認証画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/90eeee4d-207f-e2bb-b8ce-4ef7e6ba3894.png)
環境は、オンプレとクラウドの両方を選択でき、オンプレの場合はバージョンとURLを指定します。
認証方式は、OAuth認証（オンプレは2021.4以降使用可能）と、従来の方式（オンプレはID/PW、クラウドはユーザーKey/クライアントID）となります。
OAuth認証の事前準備については過去の記事をご覧ください。

https://qiita.com/shuy/items/9bce3ce08b92e320366b#orchestrator-oauth%E8%AA%8D%E8%A8%BC%E3%81%AE%E6%BA%96%E5%82%99

認証が成功したら、メニュー画面に遷移します。
メニュー画面では操作対象のエンティティと、操作を選択します。操作は、作成、編集、削除、取得といった基本のデータ操作と、エンティティ固有の操作となります。
![メニュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/bbcb1e41-2488-1efd-a64c-c1e51b2e57f5.png)

# データエクスポート
アセットの一覧を出力してみます。
認証後に現れるメニュー画面で、エンティティ「アセット」と操作「取得」を選択し、実行ボタンを押します。
<img width="50%" alt="アセット_エクスポート1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/fd4b7e76-8ffd-cd5f-b487-bae201ad2a5a.png">

次にフォルダ選択画面が現れるので、対象のフォルダを選択して、OKボタンを押します。
<img width="50%" alt="アセット_エクスポート2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/38c7aca4-c95d-6c92-77e1-f4e962e83b8a.png">

エクスポートされた結果は、Workbooksフォルダ内のExcelに書き込まれます。ロボット毎のアセットも出力されています。
![アセット_エクスポート3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/9f580066-c323-2bb7-50d8-47b4c0f462dc.png)

# データインポート
次は、ExcelからOrchestratorへデータ登録を行います。
事前にWorkbooksフォルダ内のExcelにデータを用意し、メニュー画面の実行ボタンを押します。
![アセット_インポート1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/9dc8b9d4-f6af-b516-aa9d-6d13ee9937d8.png)

実行結果は、同じExcelファイル内の結果列に書き込まれます。
![アセット_インポート2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/cc961164-6c3f-be41-e980-ef496e44a443.png)

Orchestratorにもちゃんと登録されていました。
![アセット_インポート3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/2575465b-9e52-2185-6a2d-a4403601019c.png)
![アセット_インポート4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/6de63100-a18c-bfed-2257-8d121cf2eb76.png)

# さいごに
アセットしか紹介しませんでしたが、他のエンティティも同様に簡単な操作でデータ操作ができました。Orchestratorの運用担当者なら、間違いなく役に立つツールなので、ダウンロード必須ですね。
node.js(express)でmysqlに登録したデータのIDを取得する（備忘録）

# MySQLに登録したデータのIDを取得する
MySQLにデータを登録した際、auto_incrementで自動的に一意なIDが与えられる場合を想定しています

```index.js
const express = require('express')
const app = express()
const mysql = require('mysql')
const cors = require('cors') // APIとして利用する場合は必要
const port = 8000

app.use(express.json())
app.use(cors()) // APIとして利用する場合は必要

const con = mysql.createConnection({
  //ご自身の環境に合わせてください
  host: 'localhost', 
  user: 'root',
  password: 'root', 
  database: 'data' 
})

// mysql接続
con.connect((err) => {
	if (err) throw err
	console.log('Connected')
})

app.post('/create', (req, res) => {
  const sql = 'insert into users (name, email, password) values (?, ?, ?)'
  con.query(sql, [req.body.name, req.body.email, req.body.password],(err, result) => {
    if(err) console.log(err)
    const id = result.inserttId //result.insertId に登録したデータのIDが格納されている
    return res.json(id)
  })
}) 
```
MySQL5.7系でAUTO_INCREMENTを使うときの注意点と対策！

業務でCREATE文を本番環境で実施するにあたり、上長に作業承認をもらう必要がありました。
承認にあたり、ある質問を頂きました。

上司：『PRIMARY KEYがAUTO_INCREMENTになっているけれど、DB再起動によるAUTO_INCREMENTリセットなどは考慮できている？物理削除とかは発生しない？』

僕：『ふむ・・・？』

上長はどういう意図でその質問をしたのでしょうか。

意図を知ったことでAUTO_INCREMENTを使う際に気をつけるべきポイントに気づけましたので、まとめます！


## サンプルテーブル
社員テーブルを新規作成するCREATE文をサンプルにします。
```sql
CREATE TABLE `EMPLOYEE` (
  `EMPLOYEE_ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `DEPERTMENT_ID` char(5) NOT NULL,
  `DIVISION_ID` char(5) NOT NULL,
  `EMPLOYEE_LASTNAME` varchar(32) NOT NULL,
  `EMPLOYEE_FIRSTNAME` varchar(32) NOT NULL,
  `JOIN_START_DATE` date NOT NULL,
  `JOIN_END_DATE` date NOT NULL,
  `IS_DELETED` tinyint(4) NOT NULL DEFAULT '0',
  `CREATED_AT` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `UPDATED_AT` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`EMPLOYEE_ID`),
  KEY `DEPERTMENT_IDX_IDS` (`DEPERTMENT_ID`,`DIVISION_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
```

## AUTO_INCREMENTを使う際に気をつけるべきポイント
本テーブルのストレージエンジンとして利用するInnoDBでは、AUTO_INCREMENTのカウンターは永続的なデータとして持っておらず、メモリ上に保持しています。

そのため、DB再起動などが発生した場合、カウンターはリセットされます。

次のINSERTのときに、現存するレコードのAUTO_INCREMENTカラムの最大値を取ってきて、その＋１の値を設定してしまいます。

```sql
SELECT MAX(ai_col) FROM t FOR UPDATE;
```

レコードの物理削除を行うような環境においては、同一番号の再利用がされ、それによってデータの不整合が発生する可能性があるんですね。

## AUTO_INCREMENTを使うときの対策

それではどういった対策が考えられるでしょうか？

### MySQL8系にバージョンアップする
公式ドキュメントより、MySQL8系ではDB再起動が発生してもAUTO_INCREMENTのカウンターはリセットされないようになったみたいです！

AUTO_INCREMENTの値が変更されるたびにREDOログに書き込まれる仕組みになったということですね。

https://dev.mysql.com/doc/refman/8.0/ja/innodb-redo-log.html

>InnoDB enhancements.  These InnoDB enhancements were added:
The current maximum auto-increment counter value is written to the redo log each time the value changes, and saved to an engine-private system table on each checkpoint. These changes make the current maximum auto-increment counter value persistent across server restarts.

今回は全社的なDB環境なのでバージョンアップはできませんでしたが、個人開発とかであれば、バージョンアップしてしまうのが良いと思います！

### 論理削除を採用する
物理削除が起こり得る状態をなくしてしまえばいいということで、論理削除を採用するのがもう一つの方法です。

今回、上長への申請は僕が実施しましたが、テーブル設計をしたのは他のベテランエンジニアの方で、事前に論理削除を想定したテーブル設計をしてくれていました。

以下のカラムが論理削除のためのカラムです。

```sql
`IS_DELETED` tinyint(4) NOT NULL DEFAULT '0',
```

物理削除は想定していない旨を上長に伝えたことで特にお咎めなしで承認されましたが、もし僕がテーブル設計をしていたら差し戻しを食らっていただろうなと思いました・・・

また一つ貴重な学びを得ることができました！！

## AUTO_INCREMENTを使わないで採番するとしたら？
採番用テーブルを別途作ってしまうというのも一つの手かもしれません。

ただ排他制御とかトランザクション管理とか気をつけないといけないことはありそう・・・

なので、採番方法は要件やコストを鑑みて選定した方が良さそうですね！
MYSQLのDB設計※主にゲームwebページ開発

# DB設計が理解できないとページ全体の流れが把握できない。ある程度コーディングになれたら必ず覚えよう


１・そのゲームタイトルで作成するページの一覧に目を通す

２・メインのマスタテーブルを洗い出す(※例、キャラ一覧があればキャラテーブル、武器一覧があれば武器テーブル)

３・キャラステータスが外部キーにする(※レア度やスキル名やスキル効果など)

４・重複する値のカラムは努めて外部キーにする

３・一覧ページで使う項目も追加する(※一覧があれば)

４・他のページで使う項目かどうかチェックする

５・外部キーの項目にするか考察

６・洗い出した項目が他のページでも表示するか確認する

７・必要なテーブルを揃える







以下memo

# マスターテーブルとは

システムの運用上変更が頻繁にない基本的な情報が格納されたテーブル

# プライマリーキーとは

１・テーブルのデータを必ず1件ずつ特定できる主要な列、と決めた列(※主にid)
２・重複する値を格納することができない

# サロゲートキー

主キーとして、自動割り当ての連続した通し番号のように、利用者や記録する対象とは直接関係のない人工的な値を用いること。

１・JOINのFIND_IN_SETで取得できる

# 外部キー 

別のテーブルのデータと連携するために、別テーブルのデータの列の値を格納した列


# mySQLでよく使う型

## 数値型（整数型）

１・TYNYINT型(タイニー(ティニー)イント) 1桁～3桁

２・INT型(イント) 4桁以上

３・double型(ダブル) ※例 double(3,1) 最大３桁、少数第一位まで 0.1～99.9
cscの作法 その93

# 概要
cscの作法、調べてみた。
GetPixel使ってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/30677380-8962-fc87-b20c-5b5b68ed7b44.png)

# サンプルコード

```
using System;
using System.Drawing;
using System.Windows.Forms;

class Dialog1 : Form {
	public Dialog1() {
		this.Size = new Size(150, 150);
		this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
	}
}
class Form1 : Form {
	Bitmap bitmap;
	Dialog1 dialog1;
	public Form1() {
		bitmap = new Bitmap(@"sakana.png");
		this.MouseClick += new MouseEventHandler(Form1_MouseClick);
		this.BackColor = SystemColors.Window;
		dialog1 = new Dialog1();
		dialog1.Owner = this;
		dialog1.Show();
	}
	protected override void OnPaint(PaintEventArgs e) {
		base.OnPaint(e);
		e.Graphics.DrawImage(bitmap, new Point(0, 0));
	}
	void Form1_MouseClick(object sender, MouseEventArgs e) {
		Point pt = e.Location;
		dialog1.BackColor = bitmap.GetPixel(pt.X, pt.Y);
	}
	[STAThread]
	static void Main() {
		Application.EnableVisualStyles();
		Application.Run(new Form1());
	}
}





```

以上。
春なので、担任の先生オブジェクトをmapでぶん回す

### 春です。
暖かくなってきましたね。
春といえば、新学期。
そして新学期といえば、クラス替えですよね。

みなさん担任の先生には"いい思い出"もあれば、"悪い思い出"もあるのではないでしょうか。

**「担任の先生を生徒が選べないのはおかしい！！」**

ということで、好き勝手に担任の先生を選べるプルダウンを作っていきます。
実装はnext.jsを使います。


担任の先生はこちらの記事、ランキング１位から６位を拝借しました。
[担任の先生になってほしい芸能人ランキング 1位から10位](https://ranking.goo.ne.jp/column/7591/ranking/53511/)

それではまちに待った担任の先生の発表です。

どどん
```
const teacher = {
　　　　a: '仲間由紀恵',
　　　　b: '阿部寛',
　　　　c: '武田鉄矢',
　　　　d: '反町隆史,
　　　　e: '櫻井翔',
　　　　f: 'ムロツヨシ'
}
```

クラスはaからf。
担任はランキング１位から順に並べました。
屈強なヤンキーたちを治めた、信頼と実績のラインナップですね。

今回はbクラスに入って東大を目指したいので、阿部寛先生を選ぼうと思います。

さて、プルダウンを作っていきましょう。
arrayであればmapで回すだけなのですが、
今回はobjectです。
クラスと先生の名前、両方とも欲しいので
key,valueが取れるObject.entriesを使っていきましょう。


```
Object.entries(teacher).map(([key, value]) => {
       return <option value={key} key={key}>{value}</option>
    })
}
```


ちなみに普通のjsだとfor ofを使うと同じような処理ができます。

```
for (const [key, value] of Object.entries(teacher)) {
  <option value=key>value</option>;
```


プルダウンができました。
![スクリーンショット 2022-03-17 17.41.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694053/ba718ff2-e222-568e-f95c-db503ec6aae6.png)


それでは、よい新学期を。
ブラマンジェ曲線の面積

### ブラマンジェ曲線

ブラマンジェ曲線は[高木曲線(Wikipedia)](https://ja.wikipedia.org/wiki/%E9%AB%98%E6%9C%A8%E6%9B%B2%E7%B7%9A)とも呼ばれる中点を再帰的に分割してできるフラクタル曲線の一種とのこと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/dbcb2ceb-a438-eb61-9392-a819f1b3c72a.png)

その定義は以下のようにかなり難しい式で表されるますが、

```math 
\large T(x) = \sum_{n=0}^{\infty} \frac{s(2^nx)}{2^n} \\
ここで \large s(x)=min_{n \in Z}|x-n|
```

Wikipediaにもあるように三角波関数を波長・高さを半分にしていき足し合わせることで近似値を得ることが出来ます。n=1,2,4,10の結果を図にすると以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/c656ce97-21aa-10b6-351f-2a98fa35b2ae.png)

### ブラマンジェ曲線の面積

そこでこのブラマンジェ曲線とX=0に囲まれた部分の面積です。三角波関数の面積が1/2の等比数列になっていることから0.5になりそうなことは容易に想像できまが、実際にプログラムで求めてみます。プログラムは三角波関数を再帰呼び出しで実装しています。

```python 
# ブラマンジェ曲線の面積
def blan(x1, dx, y1, y2):
  dx1, y0 = dx/2, (y1+y2)/2
  if dx <= TH:  
    return dx * y0
  ret = blan(x1, dx1, y1, y0+dx1) + blan(x1+dx1, dx1, y0+dx1, y2)
  return ret

TH = 1/(2**10)
area = blan(0, 1.0, 0, 0.0)  # x1, dx, y1, y2
print(f"Answer = {area:0.3f}")
# Answer = 0.500
```
となり予想どおりの結果が得られました。

このアルゴリズムはEuler Project: Problem 226に役に立ちます。

（開発環境：Google Colab）
「X」記号を検出するOpenCVライン検出

行内のX記号を検出する必要がある画像があります。
画像：
![dpUhO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603249/927d24f1-3cd1-a18a-d833-f00898f5c519.png)

上の画像を見るとわかるように、線の中にX記号があります。シンボルのX座標とY座標を知りたい。この絵の中でこのシンボルを見つける方法はありますか、それとも小さいですか？
```
import cv2
import numpy as np


def calculateCenterSpot(results):
    startX, endX = results[0][0], results[0][2]
    startY, endY = results[0][1], results[0][3]
    centerSpotX = (endX - startX) / 2 + startX
    centerSpotY = (endY - startY) / 2 + startY
    return [centerSpotX, centerSpotY]

img = cv2.imread('crop_1.png')
res2 = img.copy()

cords = [[1278, 704, 1760, 1090]]
center = calculateCenterSpot(cords)
cv2.circle(img, (int(center[0]), int(center[1])), 1, (0,0,255), 30)
cv2.line(img, (int(center[0]), 0), (int(center[0]), img.shape[0]), (0,255,0), 10)
cv2.line(img, (0, int(center[1])), (img.shape[1], int(center[1])), (255,0,0), 10)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# You can either use threshold or Canny Edge for HoughLines().
_, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
#edges = cv2.Canny(gray, 50, 150, apertureSize=3)

# Perform HoughLines tranform.
lines = cv2.HoughLines(thresh,0.5,np.pi/180,1000)
for line in lines:
    for rho,theta in line:
            a = np.cos(theta)
            b = np.sin(theta)
            x0 = a*rho
            y0 = b*rho
            x1 = int(x0 + 5000*(-b))
            y1 = int(y0 + 5000*(a))
            x2 = int(x0 - 5000*(-b))
            y2 = int(y0 - 5000*(a))
            if x2 == int(center[0]):
                cv2.circle(img, (x2,y1), 100, (0,0,255), 30)
            if y2 == int(center[1]):
                print('hell2o')
                # cv2.line(res2,(x1,y1),(x2,y2),(0,0,255),2)

#Display the result.
cv2.imwrite('h_res1.png', img)
cv2.imwrite('h_res3.png', res2)

cv2.imwrite('image.png', img)
```
JuliaからPythonの関数を呼び出す(Docker)


## ソース

### Julia

```julia:jsample.jl
ENV["PYTHON"] = "/usr/local/bin/python"
import Pkg
using Pkg
Pkg.add(["PyCall"])
Pkg.build(["PyCall"])
using PyCall

if PyVector(pyimport("sys")["path"])[1] != ""
    pushfirst!(PyVector(pyimport("sys")["path"]), "")
end

sample = pyimport("pysample")
total = sample.sum(10, 20)
println("total:", total)
```

### Python

```python:pysample.py
def sum(num1, num2):
    return num1 + num2
```

### docker-compose.yml

```
version: '3'
services:
  julia-python:
    restart: always
    build: .
    container_name: 'julia-python'
    working_dir: '/root/'
    tty: true
    volumes:
      - ./src:/root/
```

### Dockerfile

```docker
FROM python:3
USER root

RUN apt-get update
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
RUN wget https://julialang-s3.julialang.org/bin/linux/x64/1.7/julia-1.7.2-linux-x86_64.tar.gz
RUN tar -zxvf julia-1.7.2-linux-x86_64.tar.gz
RUN mv julia-1.7.2 /opt/
RUN ln -s /opt/julia-1.7.2/bin/julia /usr/local/bin/julia
```

### 環境

Dockerが実行できる環境

### 実行

```
cd julia-python
docker compose up -d --build
docker compose exec julia-python bash
julia jsample.jl
```

### 結果

```
total:30
```

JuliaからPythonの関数を呼び出すことに成功。

### juliaファイルとpythonファイルのディレクトリが違う場合

ディレクトリ構成例

```
-julia.jl
-test
  └─python.py
```

ディレクトリをインポートする箇所を

```julia
pushfirst!(PyVector(pyimport("sys")["path"]), "test")
```

に変更する。

## GitHub

https://github.com/botanic7arc/julia-python

## 参考文献

- [DockerでPython実行環境を作ってみる - Qiita](https://qiita.com/jhorikawa_err/items/fb9c03c0982c29c5b6d5)
- [UbuntuにJuliaをいれてHello,world!するまで - Qiita](https://qiita.com/STInverSpinel/items/a9efcb393030da3670f0)
- [SDPARA を開発しよう: Julia の PyCall で python ファイルを reload する](http://margaret-sdpara.blogspot.com/2019/04/julia-pycall-python-reload.html)
【Julia言語】自己励起閾値モデル (TAR model) の実装

# 閾値モデルとは
まず閾値モデルとはなにか、沖本本によると

> ある状態変数 $s_t$ がある閾値を超えているかどうかによって, $y_t$ が従うモデルが変化するモデル

とあります。以下沖本本にそって物語が進んでいきます. 
さて, 時系列モデルの基本となるARモデル( 自己回帰モデル )について閾値モデルを考えていきます. ARモデル + 閾値モデル は特にTARモデル( threshold AR model )といいます。

# TARモデルとは

TARモデルのイメージをつかむには数式を見るのが一番早いです。2状態TAR(1) を見てみましょう。

```math
\begin{align}
y_t &= \phi_{01} + \phi_{11} y_{t-1} + \sigma_1 \epsilon_t \quad s_t < c \\
y_t &= \phi_{02} + \phi_{12} y_{t-1} + \sigma_2 \epsilon_t \quad s_t \geq c  
\end{align}
```

ここで, $\epsilon_t ～ \mathcal{N}(0, 1)$, $c$ は閾値である。閾値モデルとは, 閾値 $c$ を $s_t$ が上回るか下回るかでモデルが切り替わると一体感じです。

ここで重要なのは, 状態数はいくつに増やしてもいいし, もちろん状態が切り替わるごとに $\epsilon_t$ の分布も変えてもよく, さらに言えば各状態におけるARモデルのラグ $p$ も状態によって変化させてもいいです。パラメータの一部だけを変化させても問題ありません。それらはすべてモデルにおく仮定によって柔軟に対応できます。

さて, 実際にTARモデルを考えていこうとすると $s_t$ をどうやって決めるかで困ると思います. $s_t$ の設定は __$t$ 期の時点ですでに手に入っている観測値であれば__, どんな値でも構わないです。一般に使われているのは $s_t = y_{t-d}$ または, $s_t = |y_{t-d}|$ です。$d$ の選択としては $d = 1$ がよく使われるみたいです.

# パラメータの推定

パラメータ $d, c$ を所与とすれば, 簡単に最尤推定を行うことができます. 例えば, 2状態TAR(1)の場合, $s_t < c$ の場合, $\mathcal{N}(\phi_{01} + \phi_{11} y_{t-1}, \sigma_1^2)$ を使い, $s_t \geq c$ の場合, $\mathcal{N}(\phi_{02} + \phi_{12} y_{t-1}, \sigma_2^2)$ を使って密度を計算すればいいです.

しかし, 一般にTARモデルは最尤推定で解が定まりません.そのためMCMC法を用いたベイズ統計学に基づいた推定方法など, いろいろな工夫がされてきています[砂田 2004].
今回はベイズ統計学に基づいた方法は取り扱いません. 先ほど説明したパラメータ $d, c$ を所与としたときの最尤推定を行っていこうと思います.

# 実装

https://gist.github.com/takahashi-r/dbddf2d3749e3d3d206c2c700e38f449

実装はこちらにあります。R言語ではパラメータ $c$ をデータから学習できるみたいです。どういう計算をしているのか、時間があるときにプログラムを確認してみたいと思います。

実装内容としては、状態を判定した後にARモデルを推定しているだけなので、複雑なことをしているわけではありません。


# 参考

- [経済ファイナンスデータの計量時系列分析](https://www.amazon.co.jp/%E7%B5%8C%E6%B8%88%E3%83%BB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%8A%E3%83%B3%E3%82%B9%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E8%A8%88%E9%87%8F%E6%99%82%E7%B3%BB%E5%88%97%E5%88%86%E6%9E%90-%E7%B5%B1%E8%A8%88%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%83%BC-%E6%B2%96%E6%9C%AC-%E7%AB%9C%E7%BE%A9/dp/4254127928)
- [閾値自己回帰モデルのベイズ推定―米国金利データへの応用―](http://www2.lib.yamagata-u.ac.jp/kiyou/kiyous/kiyous-35-1/image/kiyous-35-1-001to014.pdf)
- []()
TypeScript - How to Cast null to string?

Sometimes you will get the return value type ***string | null*** from function, then reassign the return value to a string type value. And the typescript will show the type error. 

# Example
```typescript
const language: string = localStorage.getItem('language');  // type error
```

# Cast
```typescript
const language: string = (localStorage.getItem('language') || '').toString();
```

https://pineco.de/snippets/casting-null-values-string/
最終アクセスからの経過時間でデータ管理 on Azure 

# やりたいこと
仕事で Azure を使っていて、Storage に保存したデータを「**保存されてからの期間**」ではなくて「**アクセスされなくなってからの期間**」によって、データを Cool Tier に移動させたり Archive したり、削除したりということが必要になった。割りとよく使われそうなユースケースなので、ここに載せておく。

# 参考
https://docs.microsoft.com/ja-jp/azure/storage/blobs/lifecycle-management-overview#move-data-based-on-last-accessed-time

https://docs.microsoft.com/ja-jp/azure/storage/blobs/lifecycle-management-policy-configure?tabs=azure-cli#optionally-enable-access-time-tracking

https://docs.microsoft.com/ja-jp/rest/api/storagerp/blob-services/set-service-properties#lastaccesstimetrackingpolicy

# 前提
* Azure の Subscription をもっていること
* Azure Portal 上で基本的な操作が行えること
    * ここでは操作手順は書いていないけど、調べながらできれば OK！
* Azure CLI を操作できること
    * Cloud Shell だったり、ローカルだったり

# 設定内容
1. 任意の Storage アカウントを作成する。
1. 作成した Storage アカウントのライフサイクルポリシーの項目に移動する
1. Add a rule をクリックして、以下の内容を確認する
    1. Details タブ
        1. ルール名: 任意
        1. その他の項目はデフォルトのままで OK
        1. Next をクリック
    1. Base Blobs タブ
        1. if のブロック内に、**この時点では Last-accessed の項目が無いはず**
        1. ルールの作成をキャンセルして、Storage アカウントのページに戻る
1. Azure Portal 上で Cloud Shell を起動する or ローカルの Bash などを起動する
1. 以下コマンドで、`--enable-last-access-tracking` に true を設定する (有効化する)
    1. `<resource-group>` と `<storage-account>` は自分の環境に合わせて変更すること
   ```
   az storage account blob-service-properties update \
       --resource-group <resource-group> \
       --account-name <storage-account> \
       --enable-last-access-tracking true
   ```
1. サイドライフサイクルポリシーの項目に移動して、下記内容でルールを作成する
    1. Details タブ
        1. ルール名: 任意
        1. その他の項目はデフォルトのままで OK
        1. Next をクリック
    1. Base Blobs タブ
        1. if のブロック内に**今回は Last-accessed の項目が現れているはず**
        1. More than (days ago): 任意の日数
        1. Then のブロックで任意のアクションを設定する
        1. Add をクリック
1. 適当なコンテナを作成して、適当なファイルをアップロードする
1. ルールで指定した日数が経過するまで待つ。。。🛌
1. アップロードしたファイルが削除されている！🎉🎉🎉

これで、最終アクセスからの経過時間でデータを削除したり別の Tier に移動させたりできるようになった。
いつまでデータを保持するかのガバナンスは重要だし、データも増大するので一定期間アクセスの無いデータを Archive するなどはコストの観点からも重要だと思う。
今回の内容が参考になれば嬉しいです。

以上です。

# 気になること
AWS でも同じことができるかちょっと調べてみたけど無さそう？だった (あれば教えてください)。
AWS の場合はアクセス頻度に合わせて自動でストレージクラスを最適に変更してくれる設定 (Intelligent-Tiering とか) があるからいらないのかな？🤔
逆に Azure は自動でやってくれないんだなーと。どっちが良いのかは時と場合によるけども。

# ひとりごと
最近は Azure をメインで使ってるから AWS のリソース名とか忘れてきた。。。
Python3: Elastic Cloud に API でデータを投入する

こちらと同じことを Python3 で行いました。
[Elastic Cloud に API でデータを投入する](https://qiita.com/ekzemplaro/items/5591fa43c2dc39d47a6b)

```py:elastic_cloud_insert.py
#! /usr/bin/python
#
#	elastic_cloud_insert.py
#
#					Apr/04/2022
# ------------------------------------------------------------------
import  sys
import  json
import  requests
# ------------------------------------------------------------------
def file_to_str_proc(file_in):
	str_out = ""
	try:
		fp_in = open(file_in,encoding='utf-8')
		str_out = fp_in.read()
		fp_in.close()
	except Exception as ee:
		sys.stderr.write("*** error *** file_to_str_proc ***\n")
		sys.stderr.write(str (ee))
#
	return	str_out
# ------------------------------------------------------------------
host="https://mar29-project.ent.asia-northeast1.gcp.cloud.es.io"
private_key="private-*******"
name_engine="blog-apr0102"
#
sys.stderr.write("*** 開始 ***\n")
file_json = sys.argv[1]
sys.stderr.write(file_json + "\n")
#
json_str = file_to_str_proc(file_json)
#
url=host + "/api/as/v1/engines/" + name_engine + "/documents"
headers = {"Content-Type": "application/json",
	"Authorization": "Bearer " + private_key}

rr=requests.post(url, headers=headers, data=json_str.encode('utf-8'))
#
print(rr.text)
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行結果

```text
$ ./elastic_cloud_insert.py all_data.json
*** 開始 ***
all_data.json
[{"id":"t001","errors":[]},{"id":"t002","errors":[]},{"id":"t003","errors":[]}]
*** 終了 ***
```
pod install で CDN: trunk URL couldn't be downloaded が出たときの対応


忘れっぽい自分のための備忘録

## エラー内容

```shell-session
>pod install
Analyzing dependencies
Pre-downloading: `XXXX` from `git@github.com:XXXX/XXXXXXXX.git`, commit `XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`
[!] CDN: trunk URL couldn't be downloaded: https://cdn.cocoapods.org/all_pods_versions_2_e_c.txt Response: URL using bad/illegal format or missing URL
make: *** [cocoapod-configure] Error 1
```

## 解決方法

下記のコマンドを実行したら、解消した。

```shell
pod repo remove trunk
pod install
```

#### 参考にしたissue
- https://github.com/CocoaPods/CocoaPods/issues/10356#issuecomment-908896957
【ServiceNow】HMAC-SHA256を利用したwebhookメッセージの検証方法

## Webhookとは？
WebhookとはWEBシステムで特定のイベントが発生した際に外部システムへHTTPでリアルタイムに通知する仕組みのことです。

事前に通知するタイミングや通知の内容や通知の宛先を指定しておくことで、他システム連携が可能になります。

例えば、申請データのステータスが完了になった時に他システムにその情報を連携する、といった使い方ができます。

とても便利な仕組みですが、受信側システムとしてはメッセージが改ざんされていないかどうかは重要なポイントですね。

今回は外部システムからServiceNowに送られてきたWebhookメッセージが改ざんされていないか検証する方法をご紹介したいと思います。


## 事前に用意するもの

メッセージ送信側システムで作成された下記3点
　・秘密鍵
　・メッセージ本文
　・ハッシュ値


## サンプルスクリプト

今回はServiceNowのScripted REST APIs宛てに送信された[DocuSign Connect](https://support.docusign.com/s/document-item?language=ja&rsc_301&bundleId=pik1583277475390&topicId=ctv1583277395112.html&_LANG=jajp)からのメッセージを扱います。

DocuSign Connectからのリクエストヘッダーには秘密鍵でハッシュされたメッセージ本文が含まれています。

DocuSignの秘密鍵とリクエスト本文を使ってServiceNowでもハッシュ値を生成し、
リクエストヘッダーに同じ値が含まれているか検証します。


```javascript:Scripted REST APIs
(function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {

 var bodyAll =JSON.stringify(request.body.data);
 var Headers =JSON.stringify(request.headers);

 //秘密鍵と取得したbodyを使用してハッシュ値を作成する。
 var mac = new GlideCertificateEncryption;
 var key = "送信側システムで作成した秘密鍵";
 key = GlideStringUtil.base64Encode(key); //base64に変換されている場合はここは不要
 var h = mac.generateMac(key, "HmacSHA256", bodyAll);

if (Headers.indexOf(h) !== -1) {
    //検証OKの場合に実行する処理を記載する
}

})(request, response);
```

上記の処理で作成したハッシュ値がリクエストヘッダーに含まれていたら
・DocuSign Connectから送信されたメッセージである
・メッセージは改ざんされていない
ということがわかります。



## 終わりに
今回はDocuSign Connectから受信したリクエストをもとにご紹介しましたが、別システムからのリクエストの検証にも転用できるのではと思っています。

似たようなケースを検討されている方は上記方法をぜひ試してみてください。

## 参考サイトまとめ
##### DocuSign
[Supportサイト - DocuSign Connect](https://support.docusign.com/s/document-item?language=ja&rsc_301&bundleId=pik1583277475390&topicId=ctv1583277395112.html&_LANG=jajp)

##### ServiceNow
[Developerサイト - GlideCertificateEncryption](https://developer.servicenow.com/dev.do#!/reference/api/paris/server_legacy/c_GlideCertificateEncryptionAPI)
[Developerサイト - GlideStringUtil](https://developer.servicenow.com/dev.do#!/reference/api/sandiego/server/no-namespace/GlideStringUtilScopedAPI#GSUS-isBase64_S)
Android Studioでテストコードを書いてみた

## はじめに
アプリを実装するにあたってテストコードといった方法があると知ったのですが、
今まで試したことがなかったので、簡単なコードですが書いてみました。
[テストコード](https://qiita.com/ie_Blue/items/332e9a4b0976e769b429)について簡単にまとめたものを以前記事にして書いております。

## 実際に書いてみよう
今回は四則演算のコードに対して、テストコードを書いてみました。
言語はKotlinで試しております。

コードを書く場所はExampleUnitTestに書いております。
ファイルの位置はこちらになります。
![ExampleUnitTest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472891/7e71fe9a-e2ea-8da1-7b71-1a94fbbd07f2.png)

超簡単に四則演算を行うコードを作成しテストいたしました。
```
@Test
    fun calculationTestCode(){
        // 足し算
        assertEquals(4, 2 + 2)
        // 引き算
        assertEquals(0, 2 - 2)
        // 掛け算
        assertEquals(4, 2 * 2)
        // 割り算
        assertEquals(1, 2 / 2)
    }
```

## テスト実装する方法
テストする方法は以下の画像のように、
テストしたい関数（今回だとcalculationTestCode）を右クリックからRunを実行することでテストすることができる。

assertEqualsの結果が正しい場合以下のような結果になります。
・正しい結果
![isCorrect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472891/5aefcf80-5fa4-4b03-d51d-108be049d2d6.png)

・間違った結果
![notCorrect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472891/d709d2bc-ab93-805c-b292-f7bbc195bcb6.png)

具体的にどう間違っていたかを答えと場所まで教えてくれます！

## まとめ
今回テストコードを実際に書いてみました。
本当は実際のコードのメソッドをテストしたかったのですが、
mockitoが必要になるとのこと。。。
その辺りの調査もしていきます！

## 最後に
簡単なテストコードは書くことができました。
次はmockitoを使用したテストに挑戦してみたいなと思います。
railsがアプリを新規作成できないエラーを治す方法

railsがアプリを新規作成できない原因は
ホームディレクトリに直接railsアプリをすでに作成していて
その状態でフォルダを作って新規作成しても
アプリのファイルはすでにあるとして作れないためでした。
なので、この状況を治すためには
ホームディレクトリに直接作られたrailsのアプリファイルを
全て削除することです。
面倒なようですがどれがrailsファイルなのか見分けがつきやすいので
すぐにファイルを全て削除できます。

全部削除し終えて新しくフォルダを作りcd で新しいフォルダに移動している状態でターミナルで　rails _6.1.4.1_ new sample-appとすると無事フォルダを作成できます。

作ったフォルダをvscodeに貼り付ければ編集ができるようになります。

https://qiita.com/nakamurau1@github/items/bd86c9e8d6ad93cb4039

https://supportdoc.net/support-ror3/cannot_initialize.html

https://fukatsu.tech/create-rails-new-app

https://qiita.com/gyu_outputs/items/8e0d91f625e1daa8720b
SORACOMのサービス（ネットワーク）

SORACOMのサービスを理解するための自分用メモ

[（参考）SORACOM のサービス](https://soracom.jp/services/)

---

# ネットワーク
- [Virtual Private Gateway](https://soracom.jp/services/vpg/)
- [SORACOM Canal](https://soracom.jp/services/canal/)
- [SORACOM Direct](https://soracom.jp/services/direct/)
- [SORACOM Door](https://soracom.jp/services/door/)
- [SORACOM Gate](https://soracom.jp/services/gate/)
- [SORACOM Junction](https://soracom.jp/services/junction/)
- [SORACOM Peek](https://soracom.jp/services/peek/)
- [SORACOM Napter](https://soracom.jp/services/napter/)

## Virtual Private Gateway
- SORACOMプラットフォームの出口を提供するサービス

### アウトバウンドルーティングフィルター
- デバイスから外部へのアクセスを制御できる

### インターネットゲートウェイ
- ON/OFF可能
- OFFにした場合、デバイスからインターネットへのアクセスは不可となる

### 固定グローバルIPアドレスオプション
- デバイスから外部にアクセスする際のグローバルIPを固定できる
- アクセス先は固定されたIPからアクセスされることになる
- 固定化されたグローバルIPに対し外部からアクセスすることは不可
    - デバイスから外部への通信はNATされているため

#### Private Garden
- SORACOMが用意したVPG
- デバイスからインターネットへのアクセスを制限
- 以下サービスを利用できる
    - Napter
    - Beam
    - Funnel
    - Funk
    - Harvest
- VPGの利用料金はかからない
- Canalは利用できない

## SORACOM Canal
- AWS内でSORACOMのVPCとこちらのVPCを接続するサービス
- 物理専用線やVPN接続することなく閉域網で接続（インターネットを介さない）できる
- デバイスからこちらのVPC内のEC2にプライベートIPを利用してアクセス可能になる

## SORACOM Direct
- AWS以外の環境と専用線で接続するサービス
- AWSでは利用しない
    - SORACOMがAWS環境なので専用線を経由するメリットがない

## SORACOM Door
- AWS以外の環境とVPN接続するサービス
- AWSでは基本利用しない
    - SORACOMがAWS環境なのでインターネットを経由するメリットがない

## SORACOM Gate
- デバイス同士を内部ネットワークで通信させるサービス（D2D）
- VPCピアリングしたこちらのAWS環境からデバイスに対しアクセスできるサービス（C2D）
- デバイスにアクセスしたいときにグローバルIPを付与する必要がなくなる

## SORACOM Junction
- VPGを通るパケットをミラーリングするサービス
    - パケットのコピーを別の環境に送信する
    - パケットの分析を別環境で行うことができる
- VPGを通るパケットをリダイレクションするサービス
    - パケットを振り分ける
    - 優先度の高い通信を優先させることができる
- VPGを通るパケットをインスペクションするサービス
    - パケット解析情報を別の環境に送信する
    - 統計情報として分析できる

## SORACOM Peek
- デバイスからの通信をパケットキャプチャするサービス
- トラブルシューティングやPoCで利用する

## SORACOM Napter
- デバイスにセキュアに環境外からアクセスするサービス
- アクセスのためにグローバルIPをデバイスに付与する必要はない

# 感想
- 今回はサービスのうち、ネットワークについて調べたが他サービスも調べてみたい
kubernetesとDockerのメモ

## Docker Hubにログイン
```bash
$ docker login localhost:8080;
```

```bash
$ docker tag hoge/hoge:v0.0.1 localhost:8080/hoge/hoge:v0.0.1;
$ docker push localhost:8080/hoge/hoge:v0.0.1;
```

## 操作する先を変更する
```bash
$ kubectl config get-contexts;
$ kubectl config use-context docker-desktop;
```

## namespaceを作成する
```bash
$ kubectl create namespace hoge;
```

## Pod
### apply/delete等
```bash
# apply
$ kubectl apply pod -f deployment.yaml;

# delete
$ kubectl delete pod -f deployment.yaml;

# get pods;
$ kubectl get pods;

# restart
$ kubectl rollout restart deployment <deployment_name> -n <namespace>;
```

# with kustomization.yaml
```bash
$ kubectl apply -f ./;
```

## macのDocker Desktopでkubernetesを動かす
[Kubernetesの基礎 〜Docker for Macハンズオン〜 - Qiita](https://qiita.com/nyanchu/items/ecb16ad3ad1f491b5131)
ソーシャルカスタマーサービスの設定 Service Cloud 

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f0b16173-3818-9d4c-4a14-b1d35c0e5c63.png)


ソーシャルカスタマーサービスは、API対応 のProfessionalエディション、Enterprise、Performance、およびUnlimitedエディションで利用できます。開発者組織では利用できません。


+ [Social Customer Service setup?](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000A8LA2SAN)
+ [Interaction Channels on Trailhead](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000Fxl8vSAB)
React 18のSuspenseを使うにあたって、fallbackのスタイリングを考える

## この記事の概要

[2022年3月29日、Reactのv18.0がリリースされましたね。](https://reactjs.org/blog/2022/03/29/react-v18.html)

公式ドキュメントの他、少し前の @uhyo さんの記事に改めて目を通していました。

https://qiita.com/uhyo/items/bbc22022fe846fd2b763

上記の記事によれば大切なのは「**とにかくSuspenseを理解する**」だそうです。
私はデザイナーですから、スタイリング観点でいくらか考えてみました。

## `fallback`でよくありそうなこと（予想）

今後はこんな感じで書かれることが多くなるだろうと思っています。

```jsx
const SomePage = () => {
  return (
    // 何かしらのコード
    <div className='some-class'>
      <Suspense fallback={<FallbackComponent />}>
        <SomeComponent />
      </Suspense>
    </div>
  )
}
```

こう書いた場合`FallbackComponent`が表示されている際のスタイルが意図通りにならないかもしれません。
（問題無い場合もあると思いますが）

例えば`SomeComponent`の描画が終わったとき、このようになっていて欲しいとします。

| 描画完了 |
| --- |
| ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/95ddfa71-ecab-5a2c-cb72-886e2c058359.png) |

`SomeComponent`自体はただのリストで、`background-color`をつけたいのは今回がたまたま。
そのため`some-class`によって`background-color`（付随する`padding`や`border-radius`も）を与えたという設定です。

一見良さそうですが、`fallback`にも背景色がついてしまいます。

| 実際に表示される`fallback` | 実現したい`fallback` |
| --- | --- |
| ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/9dfe02c9-778f-f72b-38fc-835d82e67036.png) | ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/adb74c57-b221-7240-ea42-317c8c2cc467.png) |

ここでパッと浮かぶのは次のようなコードでしょうか

```jsx
const SomePage = () => {
  return (
    // 何かしらのコード
    <Suspense fallback={<FallbackComponent />}>
      <div className='some-class'>
        <SomeComponent />
      </div>
    </Suspense>
  )
}
```

`SomeComponent`にだけ`some-class`を与えたいのだから、当然と言えば当然ですね。
しかしこれはこれで問題です。

| 実際に表示される`fallback` | 実現したい`fallback` |
| --- | --- |
| ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/eca87b67-827b-931f-d043-979cbbe7b5b1.png) | ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/adb74c57-b221-7240-ea42-317c8c2cc467.png) |

左の方が余白が詰まっています。（この例だと大したこと無い話ですが……。）
今回は`fallback`には何もクラスが当たっておらず、かつコンポーネント自体に余白を持たせるのはバッドプラクティスのため、こういった表示になってしまいました。

:::note
ローディング中のUIで、レイアウトシフトが起きたり明らかに大きさがおかしかったりするのは割と見かけます。
デザイナー、エンジニア、どちらの守備範囲からも微妙に外れる感は分かるのですが……抜かりなく提供したいと筆者は考えています。
:::

## 上記の解消方法

現状浮かんでいるのは以下の3つです。

1. レイアウト用ユーティリティクラスを作っておく
1. レイアウト用コンポーネントを作っておく
1. `fallback`用コンポーネントは`className`などを受け取れるようにしておく

1と2はイメージしやすいと思います。

```jsx:レイアウト用ユーティリティクラス
const SomePage = () => {
  return (
    // 何かしらのコード
    <Suspense fallback={<div className='mt-1'><FallbackComponent /></div>}>
      <div className='some-class'>
        <SomeComponent />
      </div>
    </Suspense>
  )
}
```

```jsx:レイアウト用コンポーネント
const SomePage = () => {
  return (
    // 何かしらのコード
    <Suspense fallback={<Margin top={1}><FallbackComponent /><Margin>}>
      <div className='some-class'>
        <SomeComponent />
      </div>
    </Suspense>
  )
}
```

だいたい上記のようになると思います。

議論が起きそうなのは3でしょうか。
「コンポーネントの責務を逸脱するので受け取れない方が良い」という意見はあるはずです。
筆者は個人開発だったら`className`を渡せるようにしちゃうケースが多いのですが、チームでとなると微妙ですね。

いずれにせよ「`fallback用コンポーネント`をそのまま`fallback`に渡すとスタイル崩れが起きるかもしれない」と認識してスタイル設計に臨むのが良いのかなと思っています。

---

最後まで読んでくださってありがとうございます！
Twitterでも情報を発信しているので、良かったらフォローお願いします！

https://twitter.com/xrxoxcxox
[Atcoder]python3の入力処理方法

3/26からAtCoder始めました。対戦よろしくお願いいたします。
AtCoderの入力方法は標準入力です。
普段、標準入力はあまりしないので、戸惑ってしまいました。
そのため、主な入力処理パターンをまとめました

# 入力個数が1つ(ex 1)
```python
# int
a = int(input())
# str
a = str(input())
```

# 入力個数が決まっているパターン(ex A B C Dが与えられるパターン)
```python
# int
a, b, c, d = map(int, input().split())
# str
a, b, c, d = str(int, input().split())
```

# 個数が指定されない場合（ex. A1~Anの個数が当たられるパターン）
```python
# int
An = list(map(int,input().split()))
# str
Bn = list(map(str,input().split()))
```

# 1つ目に個数、２つ目以降にリストがある場合（n k1 k2 k3 .... kn)の場合
```python
n, *kn = map(int, input().split())
```

# 文字列分割の場合
```python
#ABCD
a = list(input())
# a = ["A","B","C","D"]
```

楽しく競技プログラミングしましょう！
27歳未経験エンジニアがPHP7技術者認定初級試験に合格した話

## 試験概要

以下[PHP技術者認定機構](https://www.phpexam.jp/summary/novice7/"PHP技術者認定機構")のHPからPHP7技術者認定初級試験について抜粋してます。

> 概要：PHPプログラミングの基本知識を問う試験
ITスキル標準(ITSS)：レベル1
受験料金：13,200(税込)
試験会場：全国のオデッセイコミュニケーションズCBTテストセンター
試験日：試験会場にてほぼ一年中実施
設問数：40問(1000点中700点以上で合格)
試験時間：1時間
> 出題形式：選択式(複数または単一選択)



試験予約はネット申し込み。
会場にもよると思いますが、基本的には5営業日前から申し込みしないと希望日に受験できないです。
「よし、勉強完璧だ。明日受けて合格だ」これは基本受付してもらえないです。
予定立てて試験の申し込みをしましょう。


## 試験を受けた理由
・PHPを本格的に学び始めてどれくらいの実力が身についたかを測りたかったから。
(初級程度の能力しか身についてないと実感したので初級を受けた。)
・自分の持っている能力を可視化したかったから
・IT系の資格を持っていることに憧れがあったから

## 合格までにやったこと
3つのことだけを集中的にやりました。

### ①1ヶ月間のPHPブログラミング
就職先から頂いた課題を解く→完成後に会社のPHPのプロからコードレビュー
5つの課題を1日平均5時間ほど、約1ヶ月間掛けて解く。
課題内容としては、フォームデータの送受信、データのバリデーション、DB連携等々
PHPの基礎中の基礎のことだけをやりました。

### ②初めてのPHP(PHP7対応)
下記の参考書を3周読み込みました。
PHPを経験したことのある人は基礎部分なので、さらっと読むことができるのではないかと思います。

<img width="300" alt="初めてのPHP" src="https://images-na.ssl-images-amazon.com/images/I/51VvVTeZbvL._SX388_BO1,204,203,200_.jpg">

https://www.amazon.co.jp/初めてのPHP-David-Sklar/dp/4873117933/ref=sr_1_10?__mk_ja_JP=カタカナ&crid=1LGGGJ06BJK9W&keywords=php7&qid=1648989665&sprefix=php%2Caps%2C211&sr=8-10



### ③徹底攻略PHP7技術者認定[初級]試験問題集
初めてのPHPを読み込みながら、合間合間で下記の問題集を解いていました。
がっつり時間を割いて問題を解くと言うよりは、電車や待ち時間等の隙間時間で解いていました。
こちらも3周＋覚えにくいポイント等を何度も見返すことに時間を割きました。

<img width="300" alt="初めてのPHP" src="https://m.media-amazon.com/images/I/514YelAdZyL.jpg">

https://www.amazon.co.jp/徹底攻略PHP7技術者認定［初級］試験問題集-徹底攻略シリーズ-内山-祥恵-ebook/dp/B07V2MK63C/ref=sr_1_2_sspa?__mk_ja_JP=カタカナ


### 結論
①に約150時間、②及び③に約30時間
①＋②＋③の合計で約180時間、勉強したことになります。

ネットの情報で合格された方は平均で約50時間以内の勉強で合格していることがほとんどでした。
合格率は70%ほどの試験ですので、そこまで難しくはないです。

## 試験当日
~持ち物~
①顔写真付きの証明書
②Odyssey(試験を実施ている団体)のID及びパスワード
※これがないと試験を受けさせてもらえないので事前にログインできる状態かを確認しておきましょう。

10分前に試験会場に到着
試験時間となり試験PCに案内され、試験スタート!!!

「想像していたのと、違う。む、むずい」
「合格率70%と聞いていたが、舐めすぎていたか」
「あ、そうでもないや。大丈夫だ」
運悪く初めの3問連続で勉強を薄くしていたところが出題され焦ったが、最後まで解くと合格ラインは越えたかなと言う感じだった。

結果は合格
1000点中875点でフィニッシュ
この試験は試験終了ボタンを押下した瞬間に合否判定をされると言う、神レスポンスの試験だった。

合格を聞いた自分は、左手にミスド、右手にマクドを携え帰路についたのであった。

お読みくださって、ありがとうございました。
見積もりをちょっとできるようになる方法

## はじめに

本記事は、現在開催中の「新人プログラマ応援 - みんなで新人を育てよう！」の記事です。直接的なTipsではないですが、過去「見積もりってどうすれば良いの〜！？」と思っていた私がちょっとできるようになるための記事を書きました！

https://qiita.com/official-events/3f21c92121aa125807b4

それでは最初に結論です。以下の3点を実施してみましょう！
 1. まずは概算で良いから見積もってみる
 2. 作業を細かく分割してそれぞれの時間を予測し、合計値を出す
 3. 作業を行った後にふりかえって実測値を確認する
あと、心構えとして「今まで経験がないものは簡単に出来ないよね！」と思っておくと心理的に良いと思います。

## 著者について
- プログラマ(エンジニア)経験3年目（2020年3月〜）
- IT業界に来て初めてQCDという単語を聞き、今までの仕事でも作業見積もりを行った経験がない（=見積もり、納期という意識が弱い）
- それまでのプログラミング経験も細かい納期はなく見積もる必要がなかった
- これはどのくらい時間がかかりそう？という問いに答えを出せず、絶望していた

## 対象読者
見積もりがよく分からない、出来ないよ〜と困っている新人のエンジニア・プログラマ

## 書いた動機
見積もりは個人の経験・勘で実施されているのが主だと感じており。ネットでググっても情報が少ないので、記事を書こう！というのが動機です。

## 見積もりについて
見積が出来ない1番の理由は「自分が行う作業を正しく認識出来ていない」からだと思っています。
そして「今までやっていない・やったことがないから出来ていない」とも思っています。
誰しも経験がないものを最初からできるわけがないと思います。
はじめに、でも書きましたが気楽にいきましょう！

## 前提条件
- 1人で1, 2週間程度の時間をかけて開発できるタスク
- 開発〜テストまでを担当する
- これさえすれば絶対に作業を見積もれるぞ！という銀の弾丸でもありません！

## 具体例
では、実際に考えてみたいと思います。
- 求人情報の検索サイト
- 検索画面で検索できるプラスアルファの条件に「リモートワーク可能かどうか」を追加してほしいと言われた
    - 既にプラスアルファの条件として、未経験可能、残業少なめといった条件のチェックボックスが存在している

### まずは概算で良いから見積もってみる
今までやったことのない作業であればどのくらい時間がかかるか、わからないと思います。
その状態で不確実なものを出したくない・・・という気持ちが芽生えるかと思うのですが、やったことのないものはやったことがない！ということで開き直って「このくらいかな」と見積もってしまいましょう。

### 作業を細かく分割してそれぞれの時間を予測し、合計値を出す
え？流石にざっくりし過ぎだろう？
・・・そうですよね。でも、まずは1歩目を踏み出してみたということで、もう少し具体的な方法を述べてみます。

> - 検索画面で検索できる条件に「リモートワーク可能かどうか」を追加してほしいと言われた

この条件で、実際に行うことは何でしょうか？例えば以下のようなことが挙げられると思います。

- 影響調査
    - フロントエンド/バックエンドがどう組み立てられているのか調査する
- フロントエンドの修正
    - リモートワーク可能かどうかのチェックボックスの追加
    - 入力値チェック（変な値を送信された場合の挙動はどうするか？）
    - 検索後へ遷移する画面での条件保持ロジックの追加（複数ページにまたがる場合でも検索条件を維持する仕組み）
- バックエンドの修正
    - フロントエンドで追加した値を受け取れるように取得ロジックの追加
    - 異常値かどうかバックエンドでも確認をするロジックの追加
    - 値を受け取った後、SQL/ORMへの条件追加
- テスト
    - テストコードがあるならテストコードの作成、追加
    - テストを実施する内容の洗い出し、仕様書の作成
    - テスト実施

と、こんな感じになるでしょうか。ここまで洗い出してみると、概算見積もりにもう少し具体性が出るのではないでしょうか？
段落ごとに分けた1つの作業=1時間にすることでも、なんとなく全体でxx時間！とするのよりも具体的ではないかなと。


より具体的に見積もるなら、フロントエンドはあまり触ったことがないから時間がかかりそうだな、バックエンド側のロジックはある程度理解しているから、あそこに追加すれば大丈夫そうだな、という具合に時間を算出するのが良いと思います！

### 作業を行った後にふりかえって実測値を確認する
そして最後に、ふりかえりです。見積もるだけ見積もってやった気になってはいけません。
自分が実際に考えていた時間よりかかることがあればちょっとメンタルにダメージがありますが・・・その場合は「今の自分だとこのくらい実際にかかるんだな」と客観視してダメージを減らしましょう。繰り返しですが、やったことのないものは全然出来ないものです。仕方ないか、という開き直りも大事になります。

また、思っていたよりも早く出来た、というのも無意識のうちに「バッファ」を設けすぎていた可能性があるのでもう少し減らせる余地があります。
（バッファとは、作業時間で想定していないことがあると仮定して予め設けておく予備時間のことです。）

## 終わりに
どうでしたか？少しは参考になったでしょうか？
私自身、出来ていないところがまだまだあるのですが、「作業見積もりってどうしたら良いんだ！」とずっと思っていました。
少しでも作業見積もりについて何か参考になれば幸いです。

## 参考文献
https://qiita.com/jnchito/items/017487cd882091494298

私が一方的に尊敬している方の伊藤さんの記事でタスクばらし、というワードがあり「全然出来てない・・・！」と当時思いました。言葉をそのまま真似させていただくと、大きなタスクを最初から食べようとしている状態ですね。

見積もりだけでなく、仕事の話全般について書かれているので、ぜひ伊藤さんの記事も読んでみてください！
PHPでHTML圧縮 - Wordpress対応かも？

### はじめに

WordpressプラグインでHTML圧縮ができるかもしれませんが、
過剰に圧縮するためにうまく動かない場合が存在します。

簡単なコードで HTML圧縮をしてみるのも良いでしょうか

### 先に参考サイトの記載

https://prfac.com/php-minify/

https://manablog.org/php-html-minify/

### 試しに組み込んでみたもの

```functions.php
function sanitize_output($buffer) {
	$search = array(
		'/\s\/\>/s',			// XMLの /> を圧縮
		'/\>[^\S ]+/s',			// タグの後の空白を削除
		'/[^\S ]+\</s',			// タグの前の空白を削除
		'/(\s)+/s',				// 連続した空白を削除
		'/(\t)+/s',				// 連続したタブを削除
		 '/<!--[\s\S]*?-->/s'	// コメントを削除
		'/type=\"text\/javascript\"/s'	// 今は不要なものを削除

	);
	$replace = array(
		'>',
		'>',
		'<',
		'\\1'
	);
	$buffer = preg_replace($search, $replace, $buffer);
	return $buffer;
}
ob_start("sanitize_output");

```

- functions.php のどこに設置しても動作します。
- Wordpressでなくても、phpなら動作します。

### 追加されたものの説明

- 今は /> 等XMLで閉じる必要がありませんので、削減します。
- タブも削除します。
- 今は &lt;script type="text/javascript"&gt; と記述する必要のないものを最適化
- 上記はWordpressプラグインで使われていることがあるので、一括して削除するとよさそうです。
React props簡単な使い方

そもそもpropsは親から子に要素を渡すヤツ（正直賢い人が書いたの見てもよくわからんから未来の自分がわかるように書く）

```親.jsx
     <View>
      <Item />
    </View>
```
```子.jsx
const Item = () => {
  return (
      <View>
        <Image source={{ uri:'httpなんたらかんたら.com' }} />
      </View>
      <View >
        <Text numberOfLines={3}>
          なんたらかんたら
        </Text>
        <Text style={styles.subText}>なんたらかんたら作者</Text>
      </View>
  );
};
```
上記の奴はまだPropsとか使ってない状態。
これでもちゃんと動くし普通に見れる。

Propsを使って書いてみる
```親.jsx
     <View>
      <Item author="なんたらかんたら" imageUrl="httpなんたらかんたら.com" content="なんたらかんたら"/>
    </View>
```
```子.jsx
const Item = (props) => {
  return (
      <View>
        <Image source={{ uri: props.imageUrl }} />
      </View>
      <View >
        <Text numberOfLines={3}>
          {props.content}
        </Text>
        <Text style={styles.subText}>{props.author}</Text>
      </View>
  );
};
```

これで全く同じPropsを使って全く同じ見た目のものが作れた！

ちなみに子.jsxのPropsを変えてあげると
```子.jsx
const Item = ({ imageUrl, content, author }) => {
  return (
      <View>
        <Image source={{ uri: imageUrl }} />
      </View>
      <View >
        <Text numberOfLines={3}>
          {content}
        </Text>
        <Text style={styles.subText}>{author}</Text>
      </View>
  );
};
```
いちいちPropsって書かなくてもいいようになる。
SpringBoot × Thymeleaf タグ要素の中に式(値)を入れる方法

# はじめに
今回は、以下のように、親要素とその子要素のテキストをThymeleafの式で実装する方法について解説します。
※以下の記述にすると、親要素(h2タグ)の`th:text属性`の値しか表示されません。
```html:sample.html
<h2 class="heading-normal" th:text="${hoge}">
  <span th:text="${fuga}"></span>
</h2>
```

# th:text属性について
ます、「なぜ、上記のような記法で親要素と子要素のどちらの値も表示できないのか」を解説します。

結論を言うと、「`th:text属性`を指定すると、**その要素の中身身全て（入れ子になっている要素も含む）** が`th:text属性`の値に置き換わるため」です。

それでも親要素と、入れ子になっている子要素に値を渡したい時があります。
そんな時にはThymeleafにある`インライン記法`を用いるとすんなり実装できます。

# インライン記法
インライン記法というのは、Thymeleafの式をth:**属性ではなく、直接HTMLに式を記述できる記法のことです。

具体的には、以下のような記述のことを指します。
```html:sample.html
<h2 class="heading-normal" th:inline="text">
  [[${hoge}]]
  <span th:text="${fuga}"></span>
</h2>
```

ポイントとしては、実装に応じて指定した要素に`th:inline属性`を指定し、その値に"text"を指定します。
そして、HTMLには式を`[[${式}]]`のように記述するだけです。

それだけで、例えば以下のように普通のテキストと式を併用することが可能です。

```html:sample.html
<h2 class="heading-normal" th:inline="text">
  こんにちは、[[${hoge}]]
  <span th:text="${fuga}"></span>
</h2>
```

もちろん、式の中でテキストを足すことも可能です。
```html:sample.html
<h2 class="heading-normal" th:inline="text">
  [[${hoge} + 'hello']]
  <span th:text="${fuga}"></span>
</h2>
```

こうすることで、親要素も子要素もThymeleaf式の値を表示することができます。

ここでは、親要素に`th:inline属性`、子要素に`th:text属性`を指定していますが、子要素にも`th:inline属性`を指定すれば、親要素と子要素どちらでも同じことが可能です。

# 参考文献
- [thタグのテキスト表示とaタグについて](https://ja.stackoverflow.com/questions/28278/th%E3%82%BF%E3%82%B0%E3%81%AE%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E8%A1%A8%E7%A4%BA%E3%81%A8a%E3%82%BF%E3%82%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
- [Thymeleaf](https://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf_ja.html#%E3%82%A4%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E5%87%A6%E7%90%86)
JavaScript: Number()が数値型に変換できる文字列

JavaScriptの`Number`関数は文字列を受け取り、それをパースして数値型の値を返すことができる関数です。文字列から数値型への変換するのに便利です。

`Number`は`123`や`1.23`のような数字だけからなる単純な文字列以外に、様々な文字列フォーマットにも対応しています。そのため、入力文字列のパターンが限定できていない場合、想定外の値になってしまうといった問題に遭遇する可能性があります。

`Number`で文字列→数値への変換を行う場合は、`Number`の仕様を理解した上で、想定外の結果にならないよう、追加の処理を加えたほうが良さそうです。たとえば、ユーザー入力など、入力文字列のパターンが無数に考えられる文字列を扱う場合は、`Number`に渡す前に正規表現などでバリデーションするなど。

## 空文字列

空の文字列は`0`になります。

```javascript
console.log(Number(""));
//=> 0
```

## 空白文字だけからなる文字列

半角スペース、全角スペース、タブなどの空白文字だけからなる文字列は`0`になります。

```javascript
console.log(Number("\t\f\v\u{20}\u{3000}\u{FEFF}"));
//=> 0
// \u{20} ... 半角スペース
// \u{3000} ... 全角スペース
// \u{FEFF} ... Zero Width No-Break Space (BOM, ZWNBSP)
```

## 前後に空白文字がある文字列

前、うしろ、または、前後に空白文字は無視されます。

```javascript
console.log(Number("  1  ")); 
//=> 1
```

## 符号

`+`や`-`の符号がついたものもパースできます。

```javascript
console.log(Number("-1")); //=> -1
console.log(Number("+1")); //=> 1
console.log(Number("-0")); //=> -0
console.log(Number("+0")); //=> 0
```

## 2進数表記

`0b`または`0B`ではじまる2進数表記の文字列がパースできます。

```javascript
console.log(Number("0b10"));
//=> 2
```

## 8進数表記

`0o`または`0O`ではじまる8進数表記の文字列がパースできます。

```javascript
console.log(Number("0o10"));
//=> 8
```

## 16進数表記

`0x`または`0X`ではじまる16進数表記の文字列がパースできます。

```javascript
console.log(Number("0x10"));
//=> 16
```

## `Infinity`

文字列`"Infinity"`は、数値型の`Infinity`になります。

```javascript
console.log(Number("Infinity"));
//=> Infinity
```

## 小数

```javascript
console.log(Number("1.1"));
//=> 1.1
```

## ドットで始まる文字列

`.`で始まり、数字が続く文字列は小数としてパースされます。

```javascript
console.log(Number(".1"));
//=> 0.1
```

## 指数表記

`e2`、`e-2`、`e+2`などの指数表記がパースできます。

```javascript
console.log(Number("1e2")); //=> 100
console.log(Number("1e+2")); //=> 100
console.log(Number("1e-2")); //=> 0.01
```

## 組み合わせ

上のいろいろを組み合わせた場合もパースできるパターンがあります。

```javascript
// 16進数表記 + 前後空白文字
console.log(Number("\u{3000}0x10\r\n"));
//=> 16

// 符号 + ドット始まり小数 + 指数表記
console.log(Number("-.123e+2"));
//=> -12.3

// 符号 + Infinity + 空白文字
console.log(Number("-Infinity\t"));
//=> -Infinity
```