OmniAICreator/Qiita-1.07M huggingface dataset:
GETDDLコマンド一覧

GETDDLで各オブジェクトのDDLを取得できます。

####初期設定

```
set lin 200 pages 200 long 99999
```
```
--表領域（CREATE TABLESPACE）
SELECT DBMS_METADATA.GET_DDL('TABLESPACE','<TablespaceName>') FROM DUAL; 

--ユーザー（CREATE USER）
SELECT DBMS_METADATA.GET_DDL('USER','<USER_NAME>') FROM DUAL;

--テーブル（CREATE TABLE）
SELECT DBMS_METADATA.GET_DDL('TABLE', '<TableName>', '<SchemeName>') FROM DUAL; 

--ビュー（CREATE VIEW）
SELECT DBMS_METADATA.GET_DDL('VIEW', '<TableName>', '<SchemeName>') FROM DUAL; 

--インデックス（CREATE INDEX）
SELECT DBMS_METADATA.GET_DDL('INDEX', '<IndexName>', '<SchemeName>') FROM DUAL; 

--DBLINK
SELECT DBMS_METADATA.GET_DDL('DB_LINK', '<DBLLINKNAME>', '<SchemeName>') FROM DUAL; 
```

####指定出来るオブジェクトタイプ一覧
・FUNCTION (ストアド・ファンクション)
・INDEX (索引)
・PACKAGE (ストアド・パッケージ)
・PROCEDURE (ストアド・プロシージャ)
・SYNONYM (シノニム)
・TABLE (表)
・TRIGGER (トリガー)
・VIEW (ビュー)
・CONSTRAINT (制約)
・DB_LINK (データベース・リンク)
・MATERIALIZED_VIEW (マテリアライズド・ビュー)
・PACKAGE_SPEC (パッケージ仕様部)
・PACKAGE_BODY (パッケージ本体部)
・SEQUENCE (順序)
GAS（TypeScript）の始め方

最近、GAS を触り始めました。
TypeScript 勉強中なので、使い慣れた IDE でコード整形されながら TS で書きます。


## clasp インストール
まず、ローカルの IDE でコーディングするために、
Git みたいな感じで GAS から `clone` 、GAS に `push` みたいにできるツールである
「[clasp](https://github.com/google/clasp#install)」をインストールする。

```
$ npm install -g @google/clasp
$ clasp -v
2.3.0
```

## ログイン

```
$ clasp login
```

## GAS プロジェクトを `clone` する場合

```
$ clasp clone スクリプトID(GAS のプロジェクトの設定からコピペ)
$ ls -a
コード.js appsscript.json .clasp.json // これらがダウンロードされる。
$ mv コード.js main.ts // .ts ファイルに変更
$ mkdir src
$ mv {main.ts,appsscript.json} src/
```

## `.clasp.json` を編集

```:.clasp.json
{
    "scriptId": "スクリプトID(GAS のプロジェクトの設定からコピペ)",
    "rootDir": "./src"  // 追加
}
```

## `main.ts` の `myFunction()` を変更してみる

```:src/main.ts
function myFunction(): void {
    console.log('Hello TypeScript!');
}
```

## `push`
（[GAS API の設定](https://script.google.com/home/usersettings)をオンにしとかないとできない）

```
$ clasp push
```


ローカルの IDE で書いた TypeScript を実行できた。 
![スクリーンショット 2021-03-06 2.51.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493097/0fda772d-b743-1d52-e8c4-70c20a3ce48e.png)



## GAS ライブラリの補完をできるようにしとく

```
$ npm init --y
$ npm install --save-dev @types/google-apps-script
```


## もっとやるなら

GAS プロジェクトを作成する場合　今回はやってない

```
$ clasp create --title "ProjectName"
```

遠隔で GAS 実行（[設定](https://github.com/google/clasp/blob/master/docs/run.md) をしとかないと以下のようなエラーになる）今回はやってない

```
$ clasp run 
Running in dev mode.
? Select a functionName myFunction
Could not read API credentials. Are you logged in locally?
```

#参考
[Google Apps ScriptをローカルPCで開発する方法　Office の杜](https://officeforest.org/wp/2019/04/07/google-apps-script%E3%82%92%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABpc%E3%81%A7%E9%96%8B%E7%99%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)
[GAS(TypeScript) での開発時にやること　Qiita](https://qiita.com/hasehiro0828/items/75fd45713759923d77de)
pyplotでガントチャートを作ってみた

# Summary
- matplotlib.pyplot.barhを使って横棒グラフを描画する
- width引数で棒の幅、left引数で棒のオフセット位置を指定

![hoge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298237/1e8e5919-8873-e058-a504-14ffd83e426e.png)

# Code
```py
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import datetime as dt

# 描画用データ、csvなどから取り込んでこの形にしても良い
periods = [
    ["one",   dt.datetime(2021,  4,  1), dt.datetime(2021,  8,  1)],
    ["two",   dt.datetime(2021,  6,  1), dt.datetime(2021,  8,  1)],
    ["three", dt.datetime(2021,  8,  1), dt.datetime(2021, 10,  1)],
]

# barhがy軸正方向に描画していくので、ガントチャートらしくなるよう逆向きにする
periods.reverse()
# periodsが2重のlistになっているので、行と列を入れ替えて取り出す
titles, begins, ends = list(zip(*periods))

# pyplot内でDatesとして扱われるように変換
edate, bdate = [mdates.date2num(item) for item in (ends, begins)]

# 実際に描画
fig, ax = plt.subplots()
ax.barh(y=titles, width=edate - bdate, left=bdate)
#  横軸目盛の表示形式をdateに変更する
ax.xaxis_date()

# 描画
plt.savefig("hoge.png")
#plt.show()
```

# 補足情報
- ガントチャートのy軸はラベルが長くなりやすいので
  - `plt.subplots(figsize=(12, 6))` などでグラフを横長にする
  - `fig.subplots_adjust(left=0.5, right=0.95)` などでyticksラベル用の領域を増やせる
- y軸の順序が意図したとおりにならない場合
  - `ax.barh(y=range(len(titles), ...)` `ax.yticks(range(len(titles)), titles)` としてtitlesの順序通りにできる
- `ax.xaxis.set_major_formatter()` でx軸の表示形式をいじれる
- `ax.xaxis.set_major_locator()` で主目盛、`minor` にすれば補助目盛の間隔をいじれる
  - より詳細にいじるには `bdate` などと同じ用に `xticks` を作成して `ax.set_xticks(xticks, minor=False)` などで指定可能
  - 最大・最小は `ax.set_xlim(bdate[-1], edate[0])` などして揃えられる
react-router-domでCannnot Getとなった時の対処法

# 背景
いつものように`react-router-dom`を利用していると急に`Cannot Get`とか言われて🤔になったので、備忘録として
残しておく。`Why`と`How`を突き詰めることで知識と対応力をつけていきます。💪
ちなみに`webpack`を利用しているため、今回はそちらの解決方法を紹介するつもりです。
間違っている点や疑問点はビシビシコメントください🤖

# Why

![スクリーンショット 2021-03-06 1.11.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427792/2b056846-1de9-0117-b963-898ddce1e54e.png)

そもそも何でこんな問題が発生しているのかについて考えいきましょう！
ブラウザは`https://sample.com/`にアクセスするとサーバーサイドに問い合わせが飛びます。
サーバーは`/(index.html)`を求めるものだと判断して`index.html`をレスポンスします。
そのため、もし`https://sample.com/hello.html`にアクセスして、`hello.html`が存在しない、かつ特に`Not Found`処理をしていない場合は`Cannot GET`になってしまいます。

今回の場合、`/sample`にアクセスが入り、サーバーは`sample`ファイルが見つからずこのような結果になってしまってます。

# How
ここからは解決策を見ていきましょう！！
`webpack`を利用している場合`dist`等のプロジェクトフォルダーがビルドを行うことで、吐き出されていると思われます。
全ての`URL`に対してhtmlファイルを吐き出すのはよくないでしょう。(**SPAじゃない**)
それではどのように解決するかというと`webpack.config`に次のような設定を追加しましょう！！

``` webpack.config.js
 output: {
    ....
    publicPath: '/'
 },
 devServer: {
    ...
    historyApiFallback: true,
  },
```

`publicPath`と`historyApiFallback`の2行を追加しただけで動くようになりました。
これら2つの設定がどのような動きをするのか見てみましょう。

## publicPath
公式には次のようにあります。
> The publicPath configuration option can be quite useful in a variety of scenarios. It allows you to specify the base path for all the assets within your application.

公式にあるように`CSS`や`JavaScript`等のasset群に対して、ベースURLを提供します。 下記のように`public Path`を指定するとpathが変更されていることがわかります。

``` webpack.config.js
 output: {
    ....
    publicPath: 'https://asset.com/'
 },
```

``` dist/index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Hello World</title>
    <meta name="viewport" content="width=device-width, initial-scale=1" />
  <link href="https://asset.com/styles/index.css" rel="stylesheet"></head>
  <body>
    <div id="root"></div>
  <script defer src="https://asset.com/scripts/bundle.js"></script></body>
</html>
```

`url-loader`等に噛ませることも可能で、本番環境で画像等をCDNを利用して配信する場合、環境変数を通してローカルと本番環境でファイルpathの変更できます。
実は今回の問題に対して`publicPath`の設定が必要な場合と、そうでない場合の2種類があります。
ほとんどの場合`publicPath`を指定しないで後述する`historyApiFallback`を設定してあげることで動くのですが、プロジェクトのフォルダ構成やそれこそCDNの関係で必要となる場合があるので適宜設定してあげましょう。 

## historyApiFallback
> 
When using the HTML5 History API, the index.html page will likely have to be served in place of any 404 responses. Enable devServer.historyApiFallback by setting it to true:

そのままですね。これを`true`にしてあげることで、ファイルが見つからなった場合に`index.html`を返すようになります。
試しにプロジェクトファイルに2つのHTMLファイルを用意します。 この時の注意点ですが、`HtmlWebpackPlugin`はデフォル設定だと`filename`を`index.html`で吐き出してしまうので、どちらかに`filename`を追加しましょう。

``` webpack.config.js
 plugins: [
    ....
    new HtmlWebpackPlugin({
      template: path.resolve(SRC_PATH, "./index.html"),
      inject: "body",
    }),
    new HtmlWebpackPlugin({
      template: path.resolve(SRC_PATH, "./sample.html"),
      filename: "sample.html",
    }),
  ],
```

これで`/sample.html`の場合はファイルが存在するので、`https://hoge.com/sample.html`の場合は`sample.html`がレスポンスされます。それ以外の場合は`index.html`がレスポンスされます。
`historyApiFallback`を利用することで`Cannnot GET`問題は解決できます。


# 参考
[【意訳】Webpackの混乱ポイント](https://qiita.com/chuck0523/items/caacbf4137642cb175ec)
変数とは何か？？

今回は、変数についての説明をしていきます

##誰向けの記事か

・PHPの勉強を始めたばかりの方
・変数は、わかっているけど<b>言語化</b>できない

という人向けに書きます。

##変数とは何か？？
<b>変数</b>とは、入れたいデータを入れる事ができる<b>箱</b>です。

例：

```php:test.php
<?php
    $test = 'ここのデータが$testに入る';

```

これで<b>変数</b>はOKです!

上記の書き方をすると変数の中（<b>$test</b>）に<b>'ここのデータが$testに入る'</b>が入ったことになります。
***
###しかし、ここで問題があります。。。
変数にデータを入れたはいいけど<b>代入したデータを表示</b>できない・・・


**これの解決方法は簡単です！！**

```php:test.php
<?php
    $test = 'ここのデータが$testに入る';
    print $test;
```
これで<b>OK</b>です!!

これだけで<b>変数にデータ</b>を入れてさらに<b>データを表示</b>ができます！

<b>次にオススメの記事</b>:

<b>[【超初心者向け】「変数は何のために使う？？」2分で理解](https://qiita.com/laravel_daichi/items/cf4606df557de9b62e9d)</b>


##終わりに
今回は、<b>変数</b>のことを書きました。

なぜこの記事を書こうとしたかというと、
<br>
**僕がプログラミングを始めた際に、**
<font color="red">**教材に難しく書いてあり理解できなかった**</font>ので、**できるだけ簡単に初心者時代の自分にでも理解できる様に書きました。**
<br>
最後まで読んでいただきありがとうございます。
カフェでプログラミングしてる風（でも何もやってない）Pythonコード

やってみたくなっただけです。

# 参考

https://qiita.com/3S_Laboo/items/660883a0184dabaea65b

# ソースコード

```python

from time import sleep
from random import random


def random_sleep(short_sleep, long_sleep):
    """
    適当な秒数待つ関数
    """
    r = int(random() * 10)
    sleep_time = long_sleep if (4 < r <= 6) else short_sleep
    sleep(sleep_time)


def dung_status_change(sharp_num=50):
    """
    > ステータスが変化してる風コード
    """
    counter = 0
    while True:
        if counter < sharp_num:
            print("#", end="", flush=True)
        else:
            print(" done!!")
            counter = -1
        counter += 1
        random_sleep(0.01, 0.1)


def dung_compiler(code_num=50):
    """
    > コンパイルが動いている風コード
    """
    while True:
        print("".join([str(int(random()*10)) for _ in range(code_num)]))
        random_sleep(0.1, 0.5)

```

# 結果

![Videotogif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260295/64c22312-e2b6-f145-5128-c6f9f6d6c90a.gif)

（アス比がおかしいのはご愛嬌です。再生速度も多分Gifの設定でちょっと早くなっています。）

# GitHub

コードもこちらに上げてみました。
まぁ、興味があれば。

https://github.com/gsy0911/nice_cafe_code

# 勉強になったこと

`print()`の引数に`flush=True`で簡易的なロードバーみたいなのを再現できること

# その他

1. 関数`dung_status_change()`はもう少し短くなりそうだけれど、諦めました。
2. 作り終えた後に、Python版っぽいのがすでにあることに気がつきましたが、作ってしまったので。
SVNでクリーンアップしろと言われるが、クリーンアップ出来ないときの対処方法

previous operation has not finished; run 'cleanup' if it was interrupted Error:​Please execute the 'Cleanup' command.

こんなエラーでクリーンアップ出来なくて詰みかけたので、調べたついでにメモ

発生状況としては、SVNからファイルの削除をしようとしてエラーが出た。

##対処方法##

###1. sqliteのダウンロード###

https://www.sqlite.org/download.html
ここらダウンロード
![sqlite.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100934/2aad0b89-5dc4-dc4b-fae2-44aa0c574572.png)

正直どれ選ばばいいのかよくわからなかったんで適当に選択しましたw


###2. sqliteの配置###
svnで管理している、一番上のフォルダに**.svn**という名前のフォルダで
中に「wc.db」がある所にコピーします

DLしたファイルに入っている
**sqlite3.exe**
をSVN管理しているルートフォルダと同じ階層にある「.svn」の中に配置します。

SVNで管理している、一番上のフォルダに**.svn**という名前のフォルダで
中に「wc.db」がある所にコピーすれば大丈夫です。

###3. コマンドプロンプトを立ち上げる###
cdコマンドで**sqlite3.exe**を配置したフォルダに移動します。

```
cd c:\user\hoge\.svn
```

###4. sqliteでsvnのdbを見る###
「wc.db」がsvnのdbがになるので
SELECT, DELETEを行っていきます。


####キューを確認####

```shell-session
sqlite3 wc.db "select * from work_queue"
```

恐らく何かしらSELECT出来ると思います。

####キューを削除####

```shell-session
sqlite3 wc.db "delete from work_queue"
```
delete後にもう一度selectしてみて
無くなっていればOKです。


###4. svnのクリーンアップ###
svn管理しているルートフォルダでクリーンアップを実行すれば成功するはずです。

##参考##
こちらを参考にさせていただきました。
[https://qiita.com/tetsu8/items/11adce538942f738d231](https://qiita.com/tetsu8/items/11adce538942f738d231)
【BigQuery】standardSQLでパーセンタイル（や中央値）を集計関数のように計算する

## 問題提起
**BigQuery**（この記事では**standardSQL**のみ考える）でパーセンタイルを計算するには`PERCENTILE_DISC()`や`PERCENTILE_CONT()`が使える。ただし、これは**分析関数**[^ana] (*analytic function*) であって、`SUM()`や`AVG()`のような**集計関数** (*aggregate function*) と同じ文脈で使えない。

[^ana]: この記事ではBigQueryの[ドキュメント](https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators)の用語をそのまま使う。**分析関数**よりも**ウィンドウ関数** (*window function*)という呼び方に馴染みがある人も多いと思う。

## 解決策
集計関数のようにパーセンタイルを計算する処理は、以下のように書ける。`0.5`の部分を求めるパーセンタイルに置換すればよい（中央値ならこのままでOK）。`SUM()`や`AVG()`と並べて使えることに注目。

```sql
#standardSQL
SELECT
  ARRAY_AGG(value ORDER BY value)[OFFSET(CAST(CEIL((COUNT(value)-1)*0.5) AS INT64))] AS percentile,
  SUM(value) AS total,
  AVG(value) AS average,
FROM UNNEST(GENERATE_ARRAY(0, 100)) AS value
;
/*
percentile,total,average
50,5050,50.0
*/
```
UDFを使って整理すると以下の通り。UDFを列に直接適用するのではなく、`ARRAY_AGG()`を挟む必要がある点に注意。

```sql
#standardSQL
CREATE TEMP FUNCTION PERCENTILE(arr ANY TYPE, percentile FLOAT64) AS ((
  SELECT ARRAY_AGG(a ORDER BY a)[OFFSET(CAST(CEIL((COUNT(a)-1)*percentile) AS INT64))]
  FROM UNNEST(arr) as a
));

SELECT
  PERCENTILE(ARRAY_AGG(value), 0.5) AS percentile,
  SUM(value) AS total,
  AVG(value) AS average,
FROM UNNEST(GENERATE_ARRAY(0, 100)) AS value
;
```

~~もしくは、上記のUDFを公開しておいたので、以下でもOK。~~
最近このGCPプロジェクト消しちゃった。

```sql
SELECT
  skndr666m1.fn.PERCENTILE(ARRAY_AGG(value), 0.5) AS percentile,
  SUM(value) AS total,
  AVG(value) AS average,
FROM UNNEST(GENERATE_ARRAY(0, 100)) AS value
;
```

## 解説
ポイントは、対象となる列に集計関数`ARRAY_AGG()`を適用して配列に変換すること。あとはソートして適切なインデックスを指定するだけ。線形補完などはしていないので、`PERCENTILE_CONT()`よりも`PERCENTILE_DISC()`に近い処理となる。

懸念点は、ある程度大きなテーブルでも列を配列に変換する処理が可能かどうか。またUDFの場合、`ARRAY_AGG()`された状態の引数を、`UNNEST()`後に再び`ARRAY_AGG()`するという手順を踏むため、これもパフォーマンスに影響するかもしれない。気が向いたら検証する。

ちなみに、中央値だけでよければ[community contributed UDF](https://github.com/GoogleCloudPlatform/bigquery-utils/tree/master/udfs/community)として公開されている`bqutil.fn.median()`[^median]も使える。

[^median]: コードを確認したところ、こちらは対象が偶数の場合に線形補完する処理が記載されていた。そのため`PERCENTILE_CONT(foo, 0.5)`のような処理になる雰囲気。
Ubuntu Desktop 20.10 on a Raspberry pi 4 のCUIの解像度変更

# 背景とか
photorecでHDD解析させるのにGUI無駄だなと思って止めたんです。
そしたら、つないだテレビがフルハイ非対応でして・・・一応なんか文字っぽいのを表示してるのですが、文字が潰れて読めないんです。

ちなみに、実際の設定変更はsshからやりました。

## ハマりどころ
- CUIの解像度はRaspberry piのお作法で変更する
    - Raspberry pi OSと同じ考え方
    - x86版Ubuntuのお作法(GRUB)は使えない
- config.txtが/bootではなく/boot/firmwareに居る
- usercfg.txtを作っても読んでくれない
    - 今の/boot/firmware/READMEには記載がなくなっている
    - config.txtも触るなって警告文もなくなっている
    - ということでconfig.txtに書いちゃう
- sudoじゃないと保存できない
    - 最後の最後で書き込み蹴られると悲しい

# 設定内容

```/boot/firmware/config.txt
# 末尾に追記
# 要sudo

[HDMI:0]
hdmi_group=1
hdmi_mode=4
hdmi_drive=2

```

- `[HDMI:0]`
    - Raspberry Pi4 はHDMIを2つ持つので、0/1を指定する必要あり
- `hdmi_group=1`
    - 1080pや720pといったテレビ表記の設定を使う場合は1
- `hdmi_mode=4`
    - 今回は720p 60Hz 16:9の解像度
- `hdmi_drive=2`
    - 1はDVI扱いで音声出力なし
    - 2がHDMIで音声出力あり

他の選択肢は[公式ドキュメント](https://www.raspberrypi.org/documentation/configuration/config-txt/video.md)をご参照ください。

# 前提条件
- Raspberry Pi 4
- Ubuntu Desktop 20.10
    - CUIモード

# Thank you!
- [ARM Ubuntuでは解像度を変更できません](https://www.it-swarm.jp.net/ja/raspberrypi/arm-ubuntuでは解像度を変更できません/997901327/)
Goの構造体とポインタ

ポインタ型での処理の備忘録．Go初心者，ポインタと不仲なら多分あるあるだと思います．
# 関数とポインタ

まず，構造体は値型です．ですので関数の引数に構造体を渡して加工してあげても元の構造体が変化することはありません．

```go
package main

import (
	"fmt"
)

type point struct {
	x, y float64
}

func swap(p point) {
	x, y := p.x, p.y
	p.x = y
	p.y = x
}

func main() {
	p := point{x: 0, y: 1}
	swap(p)
	fmt.Printf("%+v\n", p)// {x:0 y:1}
}
```

これがいわゆる値渡しです．関数の引数の構造体を加工してあげるにはポインタで渡してあげます．

```go
package main

import (
	"fmt"
)

type point struct {
	x, y float64
}

func swap(p *point) { // 引数をポインタへ
	x, y := p.x, p.y
	p.x = y
	p.y = x
}

func main() {
	p := point{x: 0, y: 1}
	swap(&p) // 渡す
	fmt.Printf("%+v\n", p) // {x:1 y:0}
}

```

うまく値が入れ替わりました．よかったです．これがいわゆる参照渡しというやつですね．

# レシーバとポインタ

Goには構造体に対するメソッドという機能があります（このとき，この構造体をレシーバといいます）．一般にメソッドはポインタ型で定義されています．この理由をサンプルを通して確認したいと思います．

まずは値型でメソッドを定義して振る舞いをみます．

```go
package main

import (
	"fmt"
)

type point struct {
	x, y float64
}

// メソッドを値型で定義
func (p point) init(x, y float64) {
	p.x = x
	p.y = y
}

func main() {
	p1 := point{} // point型
	p1.init(5, 10)
	fmt.Printf("%+v\n", p1) // {x:0 y:0}


    p2 := point{} // *point型
	p2.init(5, 10)
	fmt.Printf("%+v\n", p2) // {x:0 y:0}
}

```

point型， *point型にしてもうまく動作しませんでした．これは先ほどの値渡し同様に，メソッドの呼び出し時にはレシーバのコピーが生成され，そのコピーに対して処理が行われているためです．

例によってレシーバをポインタ型で定義してみます．

```go
package main

import (
	"fmt"
)

type point struct {
	x, y float64
}

// メソッドをポインタ型で定義
func (p *point) init(x, y float64) {
	p.x = x
	p.y = y
}

func main() {
	p1 := point{} // point型
	p1.init(5, 10)
	fmt.Printf("%+v\n", p1) // {x:5 y:10}


    p2 := point{} // *point型
	p2.init(5, 10)
	fmt.Printf("%+v\n", p2) // {x:5 y:10}
}

```

想定通りの挙動になりました．point型，*point型ともにメソッドを呼び出せしてちゃんと実行できています．また，メソッドならば，ユーザは対象の構造体を値型かポインタ型どちらにするか気にする必要がない恩恵があることもわかります．（このためにポインタの理解がガバりがちです）

以上のことから構造体に対する操作（関数，メソッド）はポインタ型に対して行うべきだとわかりました．

# おまけ：rangeとポインタ

DBへのパッチ処理など，データをGET -> 加工 -> PUTする処理をしたい場面はたまにあると思います．そんな時にハマりかけたの経験がこの記事のきっかけでした．最後にサンプルを置いておきます．

```go
package main

import (
	"fmt"
)

type Person struct {
	Name string
	Age  int
}

type userInfo struct {
	Name *string
	Age   *int
}

func main() {
	persons := []Person{
		{
			Name: "Bob",
			Age:  20,
		},
		{
			Name: "Alice",
			Age:  10,
		},
	}

	data := make([]userInfo, 0)

	for _, p := range persons {
		input := userInfo{
			Name: &p.Name,
			Age:   &p.Age,
		}
		data = append(data, input)
	}

	for i := 0; i < len(data); i++ {
		fmt.Printf("data[%d]...Name:%s, Age:%d\n", i, *data[i].Name, *data[i].Age)
	}
}
/*
data[0]...Name:Alice, Age:10
data[1]...Name:Alice, Age:10
*/
```
dataに格納された内容がおかしいようです．rangeは同じポインタがチャネルに入れられており、ループが進むにつれて，参照している値が書き換えられているだけだからです．
そのため，以下のようにインデックスを指定して参照させると思った通りの挙動になります．
https://play.golang.org/p/aO8q4keS5o6


```go

for i, _ := range persons {
	input := userInfo{
		Name: &persons[i].Name,
		Age:  &persons[i].Age,
	}
	data = append(data, input)
}

```

参考：https://tour.golang.org/methods/1
matplotlib ~ 3Dグラフに点を書く

pythonで3Dデータを描画するには以下のように書きます.

```python:prot_3d.py
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig)

ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")

ax.set_xlim(-300,300)
ax.set_ylim(-300,300)
ax.set_zlim(-200,200)

x = 0
y = 0
z = 0
ax.plot([x],[y],[z],marker="o",linestyle='None')

plt.show()
```

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/9d83eead-2831-80fa-5abd-0b6e5d1b4f02.png)
TypeScriptで、class以外の型にinterfaceをimplementsする（型クラスとインスタンスのデザインパターン）

# 概要

TypeScript には`class`があるけど、あんまり使わないよね。
でも型に`interface`を実装したいときはあるよね。
でもでも`implements`は`class`にしかないよね。

じゃあ**型クラスパターン**を使おう！

# 結論

```typescript
/**
 * 目的の型がstrong-typedefパターン（newtypeパターン）で定義されていた場合に
 * （classでない場合に）、
 * interfaceを実装させたいときは、type-classパターンが使える。
 * @packageDocumentation
 */

/**
 * An example for 'newtype'.
 */
type AccessToken = string & { wrappingForAccessToken: never }

/**
 * いわゆる[スマートコンストラクタ](https://wiki.haskell.org/Smart_constructors)。
 *
 * 実運用ではAccessToken型と同じモジュールに置いておいて、
 * AccessTokenに「asするな！！！ makeAccessToken使え！！！」
 * って書いておくといいと思う。
 * ※1
 */
function makeAccessToken(x: string): AccessToken {
  return x as AccessToken
}

/**
 * [[makeAccessToken]]の双対。
 *
 * 本稿では使わないけど、newtypeパターンに必要なものとして挙げておく。
 * [[makeAccessToken]]と同じく「as使うな！！！ unwrapAccessToken使え！！！」
 * って書いておくといいと思う。
 */
function unwrapAccessToken(x: AccessToken): string {
  return x as string
}

/**
 * An example for 'type-class'.
 *
 * type-classは型引数を1つ（以上）受け取る。
 *
 * type-classは日本語では「型クラス」という。
 */
interface SerializableAsCookie<T> {
  saveToCookie(value: T): void
  getFromCookie(): T | null
  removeFromCookie(): void
}

/**
 * An example for "instance".
 *
 * type-classへの間接的なinterfaceの実装。
 * これをtype-class instance（型クラスインスタンス）と呼ぶ。
 * （単に「インスタンス」とも言うけど、OOPの文脈だとクラスインスタンスと紛らわしすぎるので、だいたいはフルネームで呼ぶ。）
 */
const instanceOfSerializableAsCookie: SerializableAsCookie<AccessToken> = {
  saveToCookie(value: AccessToken): void {
    throw new Error('Some implementation')
  },

  getFromCookie(): AccessToken | null {
    throw new Error('Some implementation')
  },

  removeFromCookie(): void {
    throw new Error('Some implementation')
  },
}

/**
 * type-classパターンの使用例。
 */
function saveAllToCookie<T>(serializer: SerializableAsCookie<T>, xs: Array<T>): void {
  for (const x of xs) {
    serializer.saveToCookie(x)
  }
}

// HaskellやScalaだと、serializerの指定はコンパイラが勝手にってくれる。
// 逆に言うとここを勝手にやってくれるだけなので、型クラスはそれらの言語でしか扱えないわけじゃないよ！
//
// ↑ここ重要！
saveAllToCookie(instanceOfSerializableAsCookie, [
  makeAccessToken('atasi-ha-inu-maid-da-nyan!'),
  makeAccessToken('itumo-mitekureru-minna-ga-suki-dayo!'),
  makeAccessToken('arigato-wan!'),
])
```

※1: https://qiita.com/kgtkr/items/1c136e1e4ccee8928bc8

- - -

Thanks :3
現在yumでインストールされているパッケージの一覧を出力する

# 目的

- yumでインストールされているパッケージの一覧を表示するコマンドをメモ的にまとめる

# 紹介

- 下記コマンドを実行して一覧を出力する。

    ```terminal
    $ yum list installed
    ```

- 例えば、PHPと名前のつくインストールされているパッケージ名を出力したいときはgrepを併用する。

    ```terminal
    $ yum list installed | grep 'php'
    ```
カオス過ぎる Unicode, UTF-8, UTF-16, UTF-32 の違い概要まとめ

文字コードについて、Shift-JISもカオスながら、鳴り物入りで出来たUnicodeも色々あるようなので、要点をサクッとまとめ。

# とりあえずこれだけ押さえておけばOK

- Unicode：文字コードの規格の名称。あらゆる国の文字コードを格納できる
- UCS-4：Unicodeとほぼ互換
- UCS-2：UCS-4の一部分。65,535文字を表現
- UTF：UCS-4(UCS-2)、Unicodeをバイト列で表現する方法。Unicodeでは "Unicode Transformation Format"、ISO/IEC 10646では "UCS Transformation Format"の略
- BOM (Byte Order Mark)：この文書がビッグエンディアンかリトルエンディアンかを示すファイル先頭に付ける数バイトのマーク。「ボム」と読むみたい
- UTF-8：1～4バイトの可変長で、先頭1～5ビットがバイト数を示す。ビッグエンディアン一択らしいのでBOMは付けないのが普通だが、BOMを付けても良い事になっている
- UTF-16：2または4バイトの可変長。BOM無しはビッグエンディアン、BOMで指定があればそれに従う
- UTF-32：4バイトの固定長

基本的には、UTF-8かUTF-16で全言語まかなえる。UTF-32は固定長がありがたい環境向け。
UTF-8は、ASCIIコード付近のバイト数が少なく、英字が多いなら総バイト数が小さくなる。
UTF-16は、日本語が3バイトらしく、日本語が多いなら総バイト数が小さくなる。


# 呼び方の変種や亜種的なもの
UTF-8N：後述
UTF-16LE：UTF-16のリトルエンディアンのこと
UTF-16BE：UTF-16のビッグエンディアンのこと
UTF-7：UTF-16をBASE64エンコード。メール関係の互換用らしい？
ISO/IEC 10646：Unicodeのほぼ互換規格だが、文字範囲が広いため、この規格をUTF-8で表現すると最大6バイトになる
UTF-8 mb4：MySQLは、UTF-8は3バイトまでの対応だったらしく、4バイト対応を明記したもの
CESU8：UTF-8の亜種。Oracle独自

ちなみにMicrosoftは、以前(Win10 1903あたり？)まで以下のように表記していた模様。
・「UTF-8(BOM有り)」の事を「UTF-8」
・「UTF-8(BOM無し)」の事を「UTF-8N」
・「UTF-16LE」の事を「Unicode」
・「UTF-16BE」の事を「Unicode big endian」
・「BOM」の事を「シグネチャ」

Web系以外でも、UTF-8、UTF-16LE辺りは、触れる機会多いのではないかと。

# それぞれのプラットフォームでの標準
Windows：UTF-8 (BOM有り)、PowerShellは UTF-16LE (バッチファイルは Shift-JIS)
Linux：UTF-8 (BOM無し)
Mac：UTF-8 (BOM無し)

あとついでに、改行コードにも注意です。
Windows：CR+LF
Linux：LF
Mac：CR

Linuxのシェルスクリプトで、CRLFのファイルを実行しようとすると、行末に`^M`って文字が入ってエラーが出たり、予期せぬバグの元になります。
SSLサーバ証明書の有効期間をOpenSSLを使って確認する方法

# 概要
検証環境で利用しているSSLサーバー証明書が90日の有効期間[^1]と短いため、証明書の有効期限を確認したくなることがあるので、OpenSSLを利用した確認方法をメモ

# SSLサーバ証明書とは
[こちらのサイト](https://jp.globalsign.com/ssl-pki-info/ssl_beginner/sslcerts.html)では、以下のような説明がされている。
**SSLサーバ証明書は、ウェブサイトの「運営者の実在性を確認」し、ブラウザとウェブサーバ間で「通信データの暗号化」を行うための電子証明書**


ざっくりいうと、[httpsで始まるドメイン](https://qiita.com/mach555/private/026929d370797781c835)の運用に必要となり、認証局と呼ばれるところで発行してくれるもの
この証明書には有効期間が定められており、期限を過ぎると利用できなくなる（期限切れの状態だとブラウザで警告が表示されアクセスが制限されてしまう）ため、定期的に更新を行う必要がある

# 有効期間の確認方法
以下のコマンドで、証明書の有効期間が確認できる

~~~shell
openssl x509 -in <証明書ファイル名> -noout -dates
~~~

# コマンド実行例
例えば、ファイル名が`sslfile.pem`という証明書の有効期間を確認する場合は以下の通り

~~~shell
$ openssl x509 -in sslfile.pem -noout -dates
notBefore=Mar  1 12:05:10 2021 GMT
notAfter=May 30 12:05:10 2021 GMT
~~~

### 結果確認
実行結果が2行出力されるが
`notBefore=Mar  1 12:05:10 2021 GMT` ←"**notBefore**" この日より前は使えない
`notAfter=May 30 12:05:10 2021 GMT` ←"**notAfter**"　この日より後は使えない
つまり、`Mar  1 12:05:10 2021 GMT` ～ `May 30 12:05:10 2021 GMT`がこの証明書の有効期間ということがわかる

# オプションの意味

- `- x509`  
opensslのサブコマンド、X.509証明書関連の処理を行う
- `- in`  
入力ファイルを指定
- `- noout`  
証明書の内容を出力しない（No Out）、これをつけないと例の記号文字列がずらずら出力される
- `- dates`  
開始・終了日時を出力する

参考リンク：[OpenSSLコマンド簡易マニュアル](http://ash.jp/sec/openssl.htm)

[^1]: [SSL証明書の有効期間が90日に短縮された場合の影響とは？](https://ssl.sakura.ad.jp/column/ssl-90days/)
【JDLA E資格】情報エントロピー

#はじめに
JDLA E資格試験で出題される情報エントロピーについて解説した記事です。
E資格試験の応用数学パートでは、__情報エントロピーなどの定義などが出題されます__。
特に、クロスエントロピーやKL-ダイバージェンスは頻出です。
また、情報エントロピーも機械学習・深層学習全般において使用されるため、本稿の内容を理解しておくのは必須です。


なお、他パートの具体的な解説については、下記をご覧ください。
[E資格試験に関する私の投稿記事リスト][link-1]
[link-1]:https://qiita.com/fridericusgauss/items/5a97f2645cdcefe15ce0

###目次
1. [情報エントロピー](#情報エントロピー)
2. [クロスエントロピー](#クロスエントロピー)
3. [KL-ダイバージェンス](#kl-ダイバージェンス)
4. [JS-ダイバージェンス](#js-ダイバージェンス)
5. [おわりに](#おわりに)

###数学表記
$\Omega$は確率変数$X$が取り得る標本空間を表します。
確率や確率分布の諸定義については、下記をご覧ください。
[期待値・分散][link-2]
[確率分布][link-3]
[link-2]:https://qiita.com/fridericusgauss/items/ab36d7cf91093d284ba0
[link-3]:https://qiita.com/fridericusgauss/items/14bbcdc0423fc39067c2


#情報エントロピー
自己情報量（選択情報量）とは、__事象の情報量を表す指標です__。
情報理論においては、__不確実性が高い(起こりにくい)ほど、情報としての価値が高い__とみなします。
事象$X$の自己情報量$I(X)$は式(1)で表せます。

```math
I(X) = -\log_{2}P(X)
\tag{1}
```

ただし、$P(X)$は事象$X$の確率です。$I(X)$の単位は、対数の底が2のときはビット、自然対数の底$e$のときはナットです。

平均情報量（シャノンの情報エントロピー）$H(X)$は式(2)で表せます。

```math
H(X) = \mathbb{E}[I(X)]=- \sum_{x\in \Omega} P(X=x)\log_{2}P(X=x)
\tag{2}
```

情報理論において、エントロピーと呼ばれるのは、この平均情報量を示しています。

#クロスエントロピー
クロスエントロピー(交差エントロピー)とは、__真の確率分布に対するモデルの確率分布の離れ度合いを示す尺度__です。
真の確率分布$p(x)$に対するモデルの確率分布$q(x)$のクロスエントロピー$H(p,q)$は式(3)で表せます。

```math
H(p,q) = - \sum_{x\in \Omega} p(x)\log_{2}q(x)
\tag{3}
```

なお、$p,q$は非対称で、交換すると$H(p,q)\neq H(q,p)$です。
$p=q$のときクロスエントロピーは平均情報量に一致します。
__機械学習において、クロスエントロピーは多クラス分類の誤差関数として利用されます__。


#KL-ダイバージェンス
ダイバージェンスは二つの確率分布の離れ度合い（分離度）を測る尺度で、__距離ではありません__。
特に、KL（カルバック・ライブラー）-ダイバージェンス（KL情報量）とは、__真の確率分布に対するモデルの確率分布の分離度を測る尺度__です。
真の確率分布$p(x)$に対するモデルの確率分布$q(x)$のKL-ダイバージェンス$D_{\mathrm{KL}}(p||q)$は式(4)で表せます。

```math
D_{\mathrm{KL}}(p||q) = \sum_{x\in \Omega} p(x)\log_{2}\frac{p(x)}{q(x)}
\tag{4}
```
なお、$p,q$は非対称で、交換すると$D_{\mathrm{KL}}(p||q)\neq D_{\mathrm{KL}}(q||p)$です。
$p=q$のときクロスエントロピーは平均情報量に一致します。
__機械学習において、変分Auto-Encoder（VAE）などの誤差関数として利用されます__。

また、KL-ダイバージェンスとクロスエントロピーの間には、式(5)の関係があります。
__式(5)の関係はE資格試験では特に問われることが多いです__。

```math
D_{\mathrm{KL}}(p||q) = H(p,q) - H(p)
\tag{5}
```

下記のように式(5)は示すことができます。

```math
\begin{align}
D_{\mathrm{KL}}(p||q) =& \sum_{x\in \Omega} p(x)\log_{2}\frac{p(x)}{q(x)}\\
 =& \sum_{x\in \Omega} p(x)(\log_{2}p(x)-\log_{2}q(x))\\
 =& \sum_{x\in \Omega} p(x)\log_{2}p(x)-\sum_{x\in \Omega} p(x)\log_{2}q(x)\\
 =& - \left(-\sum_{x\in \Omega} p(x)\log_{2}p(x)\right) -\sum_{x\in \Omega} p(x)\log_{2}q(x)\\
 =& - H(p) + H(p,q)
\end{align}
```

KL-ダイバージェンスの詳細は下記などを参考にしてください。
[KL-ダイバージェンス][link-4]
[link-4]:https://www.hellocybernetics.tech/entry/2016/11/17/072852


#JS-ダイバージェンス
JS（イェンセン・シャノン）-ダイバージェンス（JS情報量）も、__真の確率分布に対するモデルの確率分布の分離度を測る尺度__の一つです。
真の確率分布$p(x)$に対するモデルの確率分布$q(x)$のJS-ダイバージェンス$D_{\mathrm{JS}}(p||q)$は式(6)で表せます。

```math
D_{\mathrm{JS}}(p||q) = \frac{1}{2}(D_{\mathrm{KL}}(p||m) +D_{\mathrm{KL}}(q||m))
\tag{6}
```

ただし、$m(x) = (p(x) + q(x))/2$です。
なお、$p,q$について対称で、交換可能です。
[JS-ダイバージェンス][link-5]
[link-5]:http://yusuke-ujitoko.hatenablog.com/entry/2017/05/07/200022

#おわりに
E資格向けの情報エントロピーについて解説しました。
なお、上記は、2021年2月時点における内容であることにご注意ください。

[E資格試験に関する私の投稿記事リスト][link-1]
プログラミングで3年働いて感じたプログラミングの書き方

私は新卒で接客業の会社に就職しましたが、これからはITの時代だと考えた為、働きながらプロゲートやドットインストールでプログラミングの勉強をし、IT企業に転職した者です。

IT企業に転職してから、最初は指示通りにボタンを押すだけのテスターでしたが、運良くバックエンド開発に携わらせていただき、色々な言語を経験してきました。

主にRubyやjavascript, python, Rで開発してきました。

今考えると、プログラミングの本質はまとめるということだったと思います。

例えば、私はプログラミング初心者の頃、下記のようなまとめられていないコードを書いていました。

```
DisplayGraph1 = functon() {
  data1 = originData1
  data2 = originData2
  data3 = data1 + data2
  return(data3)
}

DisplayGraph2 = functon() {
  data1 = originData1
  data2 = originData2
  data3 = data1 + data2
  data4 = data3 + originDaya4
  return(data4)
}
```

理由は、単純に上から読んでいけば処理の内容が分かるからです。しかし、プログラミングには同じようなコードを繰り返し書くべきではないというルールがある為、処理を上から順に読めなくなりますが処理を関数にまとめる必要があります。
上記コードをまとめると下記になります。

```
SummaryFunction = function() {
  data1 = originData1
  data2 = originData2
  data3 = data1 + data2
  return(data3)
}

DisplayGraph1 = functon() {
  return(SummaryFunction())
}

DisplayGraph2 = functon() {
  data3 = SummaryFunction()
  data4 = data3 + originDaya4
  return(data4)
}
```

SummaryFunction関数に、同様の処理をまとめることで、記載するコードの行数を少なくすることができる、また、テストがしやすいコードになります。

記載するコードが少なくなるということは、今後バグが発生した時にコードの修正が容易になるということです。
Reactライフサイクル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249640/95b55b86-5ec2-2896-30c9-e477d3faf35d.png)

##Mount
　コンポーネントが配置される（生まれる）期間
##Update
　コンポーネントが変更される（成長する）期間
##Unmount
　コンポーネントが破棄（死ぬ）期間
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249640/60c9a89f-4d1f-b8d0-192c-6beb2e9a63d9.png)

##Mounting
### constructor() 
 初期化（stateなど）
### render()
 VDOMを描画（JSXをリターン）
### componentDidMount()
 render()後に一度だけ呼ばれる
 リスナーの設定やAPI通信に使われる　

##Update
### render()
 VDOMを再描画
### componentDiaUpdate()
 再render()後に呼ばれる
 スクロールイベントや条件付イベント

##Unmount
### componentWillUnmount()
 コンポーネントが破棄される直前
 リソースを解放するため、リスナーの解除など
【Node.js】json-server導入【Mock API】

## 概要

APIのモック用にjson-serverを導入したので主な処理をざっくりとまとめた

## json-serverについて

簡単にモックAPIを作成できるnodeのライブラリ
主にテスト作成時に使われるもの

## 導入

```
$ yarn add json-server
```

または

```
$ npm install –save-dev json-server
```

## 実際に使ってみる

次の内容の`mock.json`を作成する

```json
{
  "test": {
     "id": "mock_id",
     "text": "mock json desu"
  }
}
```

ターミナルで次のコマンドを実行

```
$ json-server mock.json
```

リクエストメソッド`GET`、エンドポイント`http://localhost:3000/test`を叩くと次の内容のレスポンスを取得できる

```json
{
   "id": "mock_id",
   "text": "mock json desu"
}
```

### 解説

`mock.json`の第一階層のキー名がそのままエンドポイントになる
例えば次のように`mock.json`を作成すればエンドポイントが`/test`と`/sample`のAPIのモックを作れる

```json
{
  "test": {
     "id": "mock_id_1",
     "text": "mock json test"
  },
  "sample": {
     "id": "mock_id_2",
     "text": "mock json sample"
  }
}
```

リクエストメソッドは全て`GET`になる(仕様)
portの指定がなければ`3000`が割り振られる

## オプションについて

### `-m {{ jsファイルのパス }}`

APIモックが叩かれたらデータを取得する前に指定したjsファイルを実行してくれる
`GET`以外のリクエストメソッドのAPIのモックを作成したい時やトークンでの認証をする時などに使う

#### 例

`mock.json`

```json
{
  "test": {
     "id": "mock_id_1",
     "text": "mock json test"
  },
  "test_patch": {}
}
```

次の内容の`middleware.js`を作成

```js
module.exports = async function (req, _res, next) {
  // リクエストメソッドが PATCH の場合、リクエストURLに _patch をつけ、リクエストメソッドを GET に直す
  if (req.method === 'PATCH') {
    req.method = 'GET'
    req.url += '_patch'
  }
  next()
}
```

ターミナルで次のコマンドを実行

```
$ json-server mock.json -m middleware.js
```

リクエストメソッド`PATCH`、`http://localhost:3000/test`を叩くと次のレスポンスを取得する

```
{}
```

### `--routes {{ jsonファイルのパス }}`

エンドポイントが`/test/sample`のような形になる場合やエンドポイントにクエリパラメータが含まれる場合に使う

#### 例

`mock.json`

```json
{
  "mock_1": {
     "id": "mock_id_1",
     "text": "mock json test"
  }
}
```

次の内容の`routes.json`を作成

```json
{
  "/test/sample": "/mock_1"
}
```

ターミナルで次のコマンドを実行

```
$ json-server mock.json --routes routes.json
```

`http://localhost:3000/test/sample`を叩くと次のレスポンスを取得する

```
{
   "id": "mock_id_1",
   "text": "mock json test"
}
```

### `--host {{ host名 }}`, `-p {{ port番号 }}`

ホスト名とポート番号を指定できる

## おまけ

モックの数が増えると`mock.json`の中身が煩雑になってくると思います
それの対策として他のファイルでjsonを作成して立ち上げ時に`mock.json`にまとめるという形にしました

次の内容のjsファイルを用意

```js
const fs = require('fs')
const path = require('path')

const root = path.resolve('./', 'mocks')

const api = fs.readdirSync(root).reduce((api, file) => {
  // ファイル名を取得
  const endpoint = path.basename(file, path.extname(file))
  // ファイル名をキー名にする
  api[endpoint] = JSON.parse(fs.readFileSync(root + '/' + file, 'utf-8'))
  return api
}, {})

// 作成したjsonをmock.jsonに書き込む
fs.writeFile('./mock.json', JSON.stringify(api), err => {
  if (err) throw err
})
```

mocksフォルダを作成し、その中にファイル名がパスになるjsonファイルを作成する
エンドポイントごとにファイルを分けられるので`mock.json`だけの状態よりはかなり見やすくなります
最後にサンプル用に作成したリポジトリを置いておきます

https://github.com/d-yamagishi522/sample-json-server/
【Rails】git push herokuをしてもEverything up-to-dateと言われる【Heroku】【Git】

<h2>症状</h2>
git push herokuをやっても、herokuに変更が反映されませんでした。

```
git push heroku
Everything up-to-date
```

「Everything up-to-date」は変更するデータないよと言われているようです。

原因を調べると、gitも更新されていなかったことがわかりました。

<h2>解決策</h2>

コミットはしたものの変更をマージしていなかったことが分かりました。。
以下のコマンドを良しなに入力して解決しました。

初歩的なミスでしたが、解消に時間がかかったので書きました。

```
git merge ブランチ名
```
[mac OS Catalina] "新規作成したファイルの保存でフリーズ" に対する解決法

# はじめに
ある日突然，wordにおいて，新規作成ファイルの保存の段階でフリーズするようになりました．
Cubaseという音楽制作ソフトにおいても新規プロジェクトの保存でフリーズ・・・
この現象については無事解決できたので，備忘録的に記事に残しておきたいと思います．
スペックは以下．
MacBook Air (13-inch, Early 2015)
プロセッサ 1.6 GHz デュアルコアIntel Core i5
メモリ 8 GB 1600 MHz DDR3
macOS Catalina (バージョン 10.15.7)

# 現象の詳細

[例1] Microsoft Word（Microsoft Office 365）で新規ファイルを作成し，そのまま作業
→command（⌘）+sでいつものようにファイルを保存しようとする
→名前をつけるポップアップが出ず，レインボーカーソル現る
→「アプリケーションが応答しません」
→(´・ω・`)

[例2] Cubase 10.5で新規ファイルを作成し，新規トラック追加
→⌘+sでいつものようにファイルの保存を試みる
→名前をつけるポップアップが出ず，レインボーカーソル現る
→「アプリケーションが応答しません」
→(´・ω・`)

再起動かけても変化なし．
既にあるファイルの上書き保存は可能．
Cubaseについては急遽他のプロジェクトをコピーして，既にあるトラック全消去&上書き保存で対処．
そういえば数日前からFinderが重い・・・？

# ディスクユーティリティのFirst Aidで直った！
いろいろ検索したが，同じような問題にいきあたった人はおらず・・・
そこで，MacのメンテナンスといったらFirst Aidということで，一通りやってみたら直りました．
（詳しくないので原因は推測でしかありませんが，ディスクのアクセス権に問題が？詳しい方是非コメントください！）
First AidによるメンテナンスについてはApple公式サポートページが詳しいです．
https://support.apple.com/ja-jp/HT210898

ディスクユーティリティを開くと，macOS Catalinaでは「Macintosh HD」「Macintosh HD - Data」の2つが表示されますが，とにかく「Macintosh HD - Data」「Macintosh HD」の順でFirst Aidを実行．
その後再起動をかけ，wordなどを開き，新規ファイルからの⌘+sで無事名前をつけるいつものポップアップ出現．
無事直ったことを確認しました．

# まとめ
Macで不具合おこったら再起動．
それでもダメだったらセーフモードかFirst Aid！
（しょーもない記事でお恥ずかしい限りです）
トランザクションの特性のACIDについて

トランザクションというあまり聞かない言葉の意味を深掘ってみた。
どうやら特性があるらしいので、それらについて備忘録書いていきたいと思います。
　　
##トランザクションとは
IT用語で
**「複数の処理を一つにまとめたものを意味する言葉」**
このトランザクションという言葉は`結果は成功か失敗かのみ`の２通りしかなく、
トランザクションで成功とされるのは、すべての処理がうまくいった時のみです。処理にどこかおかしい場所があると、失敗とみなされてすべての処理がキャンセルされます。

　

そんな`トランザクション`には**ACID**と言われる特性があります。
それぞれの意味を確認しながら見ていきたいと思います。

#A[Atomicity]
[**Atomicity(原子性)**]でトランザクションが終わった後に、そこに含まれていた更新処理が全て実行されるか、
全て実行されない状態で終わることを保証する性質。

#C[Consistency]
[**Consistency(一貫性)**]でトランザクションの処理はそれぞれの制約を満たすという性質。

#I[Isolation]
[**Isolation(独立性)**]であるトランザクションが実行中の場合、もう一方のその他のトランザクションの影響を受けないという性質。

#D[Durability]
[**Durability(永続性)**]でトランザクションが完了した後、そのデータ状態が保存され失われることは無いという性質。

　

原子性、一貫性、独立性、永続性
最低限、特性だけは覚えておきたいところです。
【GitHub】 直前のコミットメッセージの訂正方法

はじめに
---
開発環境で作業の一区切りがついたので、よしGitHubへpushするぞ！って思ったそんな時にコミットメッセージを途中の状態や、打ち間違えた状態でエンターキーを押してしまうことがしばしあります。
コミットメッセージを間違えてしまった、とガックリします。
その都度調べては直す作業を繰り返しているので、自身の備忘録として残しておこうと思います。
<br>

直前のコミットを修正する
---
"投稿機能追加"と打ちたかったのに、"加"が抜けてしまった。
commitした直後に内容に誤りがあることに気づいた場合。

```terminal.
$ git add .
$ git commit -m "投稿機能を追"

# 直前のコミットメッセージを修正（エディタが開きます）
$ git commit --amend

# コミットメッセージが変更出来ているか確認（※ qで抜け出せます）
$ git log --oneline
943c6ec (HEAD -> <ブランチ名> 投稿機能追加)
0bf2b4b 
5b9a073
   :
   :
:

$ git push origin <ブランチ名>
```




終わり
---
今回は以上になります。
私自身もプログラミング初心者ですが、同じ様な立場の方に少しでも参考になればと思っています。
また、もし内容に誤りなどがございましたら、ご指摘いただけますと幸いです。
Shinyでdebounceを使ってインプットの反映を遅らせる方法

Shinyでは作成したinput要素がアプリ上で変更されると、自動的にそのinputが含まれる関数が更新されます。
例えば、下記のreactive関数があったとします。

```
ReactiveFunction = reactive({
  input$sample
  print(“reactive is updated”)
})
```
Shinyアプリ上で、sampleというIDのインプットを変更すると、ReactiveFunctionが更新され、print(“reactive is updated”)が実行されます。

もし、print(“reactive is updated”)の実行を、sampleというIDのインプットがShinyアプリ上で変更されてから1秒後にしたい場合は、下記のように書きます。

```
debounce(ReactiveFunction, 1000)
```

このように記載すると、sampleというインプットを1秒以内に連続で変更し続けた場合は、変更が1秒以上途切れるまで、print(“reactive is updated”)は実行されません。

インプットが変更されるたびに毎度毎度関数が更新されてほしくなく、ある程度間隔を置いてからインプットの変更が関数に反映されて欲しい時に上記のような書き方が有効です。
Swiftでの配列の初期化方法

# Swiftでの配列の初期化
Swiftでの配列の初期化はいくつか方法があるためそれらを紹介していきます。
他にもあればコメントで教えてください。

#要素あり初期化
```swift
var array1 = [12, 32]
var array2: [Int] = [12, 32]
var array3: Array<Int> = [12, 32]

```

# 要素なし初期化
```swift
var array1 = [Int].init()
var array2: [Int] = [Int]()
var array3: [Int] = [Int].init()
var array4: Array<Int> = Array<Int>()
var array5: Array<Int> = Array<Int>.init()
```
SQLをそこそこ勉強した感想

#はじめに
ここ1ヶ月くらいは、SQLの学習についてアウトプットすることが多くありました。それは、アプリケーションを作るとなれば、多くの場合DBを扱うと考え、その扱いに慣れておく必要があると考えたからです。今回は、学習の一段落として、ここまでの学習の感想を述べていきます。

##英文読解みたい
結局、予約後の意味がパッと思い浮かべることができれば、命令を理解することができそうだと感じました。でも、実際のエンジニアの方はどうやって読んでいるのかは不明です。知りたい。
英文読解に似ているとはいえ、圧倒的に出てくる単語数は少ないし、文法もかなり限られているので、英語が苦手な私でも頑張れそうです。

##結局、手
実際に、命令文を打つという体験をしないと、なかなか覚えることは難しいということです。その過程において、文法的な並び方を覚えていくことができるのだと感じました。私は、これから、ここを重点的に行っていこうと思います。思い通りに欲しい情報を取得できるようになりたいと思います。そのためには、量！！

##DB操作
SQLを学習する前から、RailsでActiveRecodeを使ってDB操作を行っていました。しかし、その時は、どんなSQL文が生成させるか、ほとんど考えず、扱っていました。ターミナルに表示されるログについても、エラーが出た時に読む程度で意識していませんでした。しかも、エラーが出た時のログもまともに読めていませんでした。ActiveRecodeという便利なものに頼っていました。
なでしこで2DRPGを作ろう! #0 環境作成

# はじめに
最近、「中学の教科書になでしこが採用された」というニュースを聞きまして、なでしこでこんなことができるよって感じでこの記事を書いてます。

# なでしこで2DRPGを作ろう!
- <a href="">#0 環境作成</a> 
- <a href="https://qiita.com/naoki-iso/items/fd1f738da34713f255d6">#1 メインウィンドウ作成</a>

# なでしことは
そもそもなでしことは何でしょうか？
簡単に言うと、なでしことは
- 日本語でプログラミングできる言語
- オープンソースなので誰でも気軽にはじめられる
- プログラムの入門に最適
といった感じです。詳しくは、<a href="https://nadesi.com/top/index.php?%E3%81%AA%E3%81%A7%E3%81%97%E3%81%93%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">なでしこ公式ページ</a>を見てください。
　また、なでしこには、windowsを対象にした「なでしこv1」とブラウザ版の「なでしこv3」があります。今回は「なでしこv1」を使用します。

# 必要環境
 なでしこv1はwindows上で動作するので、windows搭載PCで開発していきます。また、なでしこで作成したゲームはJavaやPythonといった英語(アルファベット)で書かれたゲームと比べると動作が遅いです。そのため、快適にゲームを作りたい場合はそこそこ性能の高いPCを使うといいでしょう。

# なでしこのインストール
<a href="https://nadesi.com/top/index.php?%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89">なでしこのダウンロード</a>にアクセスします。
![0 ダウンロードページトップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647752/d49d1750-e83d-b5c2-3bb6-0fe48cda3dae.png)
下にスクロールしていくと「(1) 公式サイトからダウンロード」というl項目だあります。
![1 ダウンロードページ合言葉.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647752/6541f6fb-478b-ebd4-ee41-ddc450d8636d.png)
合い言葉の入力欄に「コロッケ」と入力して、「ダウンロード」ボタンを押してファイルをダウンロードします。
![2 ダウンロードページダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647752/c59e7a1e-763f-4ee9-c1ff-be93c1a85b89.png)
ダウンロードが完了したら、ダウンロードしたファイルをクリックするか、「フォルダを開く」からフォルダを開きます。
![エクスプローラダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647752/0c180459-e878-c1a2-dd6e-bec45638be47.png)
ダウンロードしたファイルを右クリックして、「すべて展開」をクリックします。
![4 エクスプローラ展開前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647752/b3c97bc1-0cf4-5db0-9cb5-21dc48653ae6.png)

展開するフォルダーを確認して「展開」をクリックします。
![5 展開指定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647752/c52dd7c8-fadf-5a87-4ee6-15f98dcc5f75.png)
展開したフォルダーを開きます。
![6 フォルダ開き.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647752/889d2266-4983-9c6d-3001-8b81533ed62c.png)
「SetupNako」もしくは「SetupNako.exe」をダブルクリックします。
![7 インストーラ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647752/22b59d2c-053b-69a9-e0e4-bd8a399c86db.png)
インストール先を確認して「実行」をクリックします。しばらくして、「インストールが完了しました。」と出てくればインストール完了です。
![8 インストール成功.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647752/857b3f43-3069-ebd2-a399-bd148b5833e8.png)
なでしこのエディタを開き、チュートリアルをやってみてください。
<a href="https://nadesi.com/doc/kouza/">公式サイトのチュートリアルページです</a>

# 更新履歴
2021/3/5 公開
2021/9/19 なでしこ公式サイトのチュートリアルページへのリンクを追加
2021/10/19 #1 メインウィンドウ作成のリンクの追加

# おわりに
今回は、なでしこを使うために必要な環境を構築しました。次回はメインウィンドウの作成、マップの作成などをやりたいな、と考えていますが、いつ公開するか未定なので気長に待ってくれたらなと思います。最後に、誤字脱字やおかしな点があったらコメント欄で指摘してくれたらうれしいです。
関数から参照されているグローバル変数の名前を取得する


CPythonの関数が参照している名前(ローカル変数と自由変数を除く)は、その関数のコードオブジェクトの`co_names`に保存されていることは[以前書きました](https://qiita.com/fumitoh/items/fb01fae31759b0319f15)。`co_names`は、グローバル変数名だけでなく、例えば次の例では`y`も含んでいます。

```Python
def foo():
    return x.y

foo.__code__.co_names　# => ('x', 'y')
```

ではグローバル変数の名前だけを取り出したい場合はどうするかについてです。
結論から言うと、`dis`標準ライブラリで、その関数をディスアセンブリし、`LOAD_GLOABL`インストラクションの引数を取り出す、という方法があるようです。　

```Python
import dis

def global_names(func):

    insts = list(dis.get_instructions(func.__code__))

    names = []
    for inst in insts:
        if inst.opname == "LOAD_GLOBAL" and inst.argval not in names:
            names.append(inst.argval)

    return tuple(names)
```

ただこの方法だと、ネストした関数内で参照されているグローバル変数名は取得できないようです。

```Python
def foo():
    def bar():
        return x
    return bar()

global_names(foo)  # => ()
```

参考: https://stackoverflow.com/questions/60639406/how-to-extract-names-of-global-variables-referenced-in-a-function

2021/7/11 追記

ジェネレータ表記やネストした関数で参照されているグローバル変数名も取得するには、関数のコードオブジェクトの`co_consts`の要素でコードオブジェクトである要素を再びディスアセンブルし、`LOAD_GLOBAL`のインストラクションの引数を取り出せばよいようです。

```python
import dis
from types import CodeType

def global_names(func):
    return tuple(_extract_globals(func.__code__))

def _extract_globals(codeobj):

    insts = list(dis.get_instructions(codeobj))

    names = []
    for inst in insts:
        if inst.opname == "LOAD_GLOBAL" and inst.argval not in names:
            names.append(inst.argval)

    # Extract globals in generators and nested functions
    for co in codeobj.co_consts:
        if isinstance(co, CodeType):
            names.extend(_extract_globals(co))

    return names
```
Laravel8でUUIDを使用してみるよ【簡単】

UUIDを使う方法をサクッと書いていきます。

##ライブラリインストール

```
composer require goldspecdigital/laravel-eloquent-uuid:^8.0
```

##マイグレーション

```php

    public function up()
    {
        Schema::create('article_drafts', function (Blueprint $table) {
            $table->id();
            $table->uuid('uuid')->unique();
            //以下は好きなものを書きましょう。
        });
    }
```

ちなみにUUIDをプライマリキーにする人もいますが、外部キーとして使用することもある場合は、別にUUID用のカラムを作った方が良きです。

リレーれション先でも128ビットの数値をデータとして持っておくのは非効率ですからね。

##UUIDの生成（データの保存）

あとは下記のように保存したい時に記述してあげればOK。

```php

use Illuminate\Support\Str;

//省略

'uuid'=>(string) Str::uuid(),
```

##idを隠す

ついでにidは隠しておくと良きです。

```php
class Article extends Model
{
    protected $fillable = [
        'uuid',//お好きなように
    ];
 
    protected $hidden = [
        'id' //こんな感じ。
    ];
}
```

これで、idが隠れます。
【TypeScriptハンズオン①】男もすなるTypeScriptといふものを、女もしてみむとてするなり

# この記はなに

TypeScriptを実際に触りながらTypeScriptを説く記です。
TypeScriptが **しょしんなる** 方や、TypeScriptを **いとをかし** と思っている*ひと*が対象です。

この記で、**こころよし**と思った方は、LGTM✨を**何卒よしなに願い申し上げ候**。


続編
[【TypeScriptハンズオン②】 ~自分だけの型を作ろう！~](https://qiita.com/NOMURA_keibyou38/items/819e2efdfe60a4a36e50)
 [【TypeScriptハンズオン③】 ~webアプリとして動かそう！~](https://qiita.com/NOMURA_keibyou38/items/12d5985bc9623cd4e8f1)

@ TypeScriptをインストールしていない*ひと*はこちら👇
　 [【画像で説明】シンプルにTypeScriptを導入して使う方法](https://qiita.com/NOMURA_keibyou38/items/2cbb5971cea1ef6e83f5)
@ TypeScriptを*いとをかし*と思った*ひと*はこちら👇
　[JavaScriptを知っている方がTypeScriptをなんとなく理解するための記事](https://qiita.com/NOMURA_keibyou38/items/06a3218de3ff480ce9de)

# ハンズオン
✅ これ以降、古語は出てきません。ご安心ください
✅ VSCodeを使います

### 基本的な型の明記（Type Annotations）
TypeScriptは、変数や関数に型を明記することで、[開発者がハッピー](https://qiita.com/atukan0930/items/e7b2f9dc70b579467de6)🤪になります。
まずは、このハッピー🤪になれる型の明記にて、以下でハンズオン✋をおこなっていきます。

変数に型を付けるときは次のように、変数の後に`: <型>`と明記します。

```typescript
let profile: string = '紀貫之はネカマ';
```

このように記述すると、VSCode上では、`profile`が`string`型となっていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1160002/d7f5d649-aea5-cb40-f30a-893d6d7cd2ba.png)

これにより、`profile`には文字列`string`しか許容されなくなるので、数値を代入しようとするとエラーが発生します。

```typescript
let profile: string = '紀貫之はネカマ';
profile = 111; // タイプ「数値」をタイプ「文字列」に割り当てることはできません。
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1160002/f47cc402-2fe2-ae9a-8089-d703bf6e27c2.png)

以上のように、型を明記することで、**意図しない型（文字列型, 数値型, 真理値型などなど...）の代入を防ぐことが出来ます。**

次は関数の型について、触っていきましょう。

関数では、**引数や返り値**に型を明記することが出来ます。
**引数**に型を指定するには、次のように型を指定します。

```typescript
const 関数名 = (引数名: <型>) => {
  ...
}
```

これは、以下のように使っていきます。

```typescript
const bookDetails = (bookName: string) => {
  if(bookName === "土佐日記") {
    return "男もすなる日記といふものを、女もしてみむとてするなり。それの年（承平四年）のしはすの二十日あまり一日の、戌の時に門..."
  } else {
    return "この本の詳細はありません。"
  }
}
console.log(bookDetails("土佐日記")); // 男もすなる日記といふものを、女もしてみむとてするなり。それの年（承平四年）のしはすの二十日あまり一日の、戌の時に門...
```

さきほどと同じように,引数の後に`: <型>`をつければOKです！
これにより、bookDetails( )の括弧内に入れる値は、文字列`string`の型のみ許容されます。

また、**関数の返り値**にも型を指定することが出来ます。
**返り値**に型を指定するには、関数の( )の後に`: <型>`をつければOKです!

```typescript
const 関数名 = (): <型> => {
  ...
}
```

これは、以下のように利用します。

```typescript
const bookDetails = (bookName: string): string => {
  if(bookName === "土佐日記") {
    return "男もすなる日記といふものを、女もしてみむとてするなり。それの年（承平四年）のしはすの二十日あまり一日の、戌の時に門..."
  } else {
    return "この本の詳細はありません。"
  }
}
console.log(bookDetails("土佐日記")); // 男もすなる日記といふものを、女もしてみむとてするなり。それの年（承平四年）のしはすの二十日あまり一日の、戌の時に門...
```
VSCodeを確認すると、返り値がstring型であることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1160002/b5a56caf-3273-1036-bd5c-88b57942e46f.png)

このように、型をバシバシ指定していって、品質の高いソフトウェアを作る手助けをするのがTypeScriptです！

# おわりに
今回は、簡単な型定義のハンズオンを行いました。
続編もぜひぜひ

Next: [【TypeScriptハンズオン②】男もすなるTypeScriptといふものを、女もしてみむとてするなり② ~自分だけの型を作ろう！~](https://qiita.com/NOMURA_keibyou38/items/819e2efdfe60a4a36e50)
# 参考文献
- https://www.typescriptlang.org/docs/handbook/typescript-tooling-in-5-minutes.html#compiling-your-code
- https://qiita.com/atukan0930/items/e7b2f9dc70b579467de6
[メモ] migration index


references 型カラム定義時に :to_table オプションを使う
references 型のカラム定義時に、オプション 
foreign_key: { to_table: <参照先テーブル名> } を指定します。

add_foreign_key の :column オプションを使う
テーブル／カラム定義後に外部キーとしたいカラムに対して 
add_foreign_key <テーブル名>, <参照先テーブル名>, column: <カラム名> を指定します。

###indexとは？
テーブルの中の特定のカラムのデータを複製し、データを取得する際に検索が行いやすいようにしたものです。アルファベット順にnameを並べ替え検索しやすいようにしてくれます。

例えば Userの名前データを参照したい場合、Usersテーブルのnameカラムにindexを張ってないと、プログラムはUserテーブルのnameカラムを上から順にみて、そのユーザーのデータを取得します。データが多ければ多いほどすごく時間がかかります。

 

###indexのメリット・デメリット
メリット：データの読み込み・取得が早くなる
デメリット：書き込みの速度が倍かかる
indexを貼り、カラムを検索しやすいように整理しデータの読み込み・取得が早くなる反面、そのカラムのデータを複製する処理が走るので、書き込みの速度に倍かかってしまいます。データ量の少ないテーブルやアクセスのないカラムに張っても、大した速度改善は見込めません。

 

###indexをはる対象
ある程度多くのデータを格納するテーブルの、格納される値がそれぞれ異なるようなカラムの中で、検索がよく行われるカラムに対して張ると効果的です。
例) 外部キー、よく検索に使われるカラムなど

 

---


###indexってなんぞや
特定のカラムからデータを取得する際に、テーブルの中の特定のカラムのデータを複製し検索が行いやすいようにしたものです。
例えば、あるユーザーをバイネームで検索したい！となった際に、Usersテーブルのnameカラムにインデックスを張ってないと、プログラムは、Userテーブルのnameカラムを上から順にみて、そのユーザーのデータを取得します。もし、これが1万人もしくはそれ以上の大量のデータを含むカラムだったらどうでしょう。すごく時間がかかりますね。
Usersテーブルのnameカラムにindexを張ることで、アルファベット順にnameを並べ替え検索しやすいようにしてくれます。

###indexのメリット・デメリット
1.でindexってすげー便利！じゃあ、全部のカラムに貼っちゃおう！と思ってしまいがちですが、もちろんメリットとデメリットがあります。

・メリット：データの読み込み・取得が早くなる。
・デメリット：書き込みの速度が倍かかる。

indexを貼り、カラムを検索しやすいように整理しデータの読み込み・取得が早くなる反面、そのカラムのデータを複製する処理が走るので、書き込みの速度に倍かかってしまいます。かつ、たいしたデータ量のやアクセスのないカラムに張っても、大した速度改善は見込めません。

なので、基本的にindexは、

ある程度多くのデータを格納するテーブルの、格納される値がそれぞれ異なるようなカラムの中で、検索がよく行われるカラム
に対して張ると効果的です。
[CSS] vertical-align 垂直の位置の指定

`vertical-align` を使ってインライン要素またはテーブルのセル要素で垂直の位置の指定をします。

```:css
vertical-align : 値;
```

#インライン要素での指定
インライン要素には　`aタグ` `spanタグ` などがあります。
[MDNでインライン要素を確認する](https://developer.mozilla.org/ja/docs/Web/HTML/Inline_elements#elements)

- baseline　親要素のbaseline に揃えます。(初期値)
- top 行全体の上端に揃える
- middle　親要素の中央に揃える
- bottom　行全体の下端に揃える
- text-top　親要素のフォントの上辺に揃える
- text-bottom　親要素のフォントの下辺に揃える
- super　上付き文字にする
- sub　下付き文字にする

#テーブルのセル要素での指定

- baseline
- top 
- middle
- bottom

#参考にしたサイト
[MDN](https://developer.mozilla.org/ja/docs/Web/CSS/vertical-align)
えっ、iタグってiconのiじゃないんですか？

## 違います

[Font Awesome](https://fontawesome.com/)をはじめとしたアイコンフォントの実装例には`i`タグが使われていることが多いですよね。

それもあってかときどき`i`タグを「**アイコンを表すタグ**」として認識している方を見かけます。[^1]

[^1]: あくまで筆者の観測範囲における話です。

ですが、そうではありません。
比較的わかりやすいので[日本語版のMDN Web Docs](https://developer.mozilla.org/ja/docs/Web/HTML/Element/i)を見てみましょう。[^2]

> HTML の興味深いテキスト要素 (`<i>`)は、何らかの理由で他のテキストと区別されるテキストの範囲を表します。例えば、技術用語、外国語のフレーズ、架空の人物の思考などです。英文においてはよく斜体で表示されるものです。

「アイコンは文章の中で区別されるべき存在である」と捉えられなくはないですが、そもそもアイコンはテキストではありません。
少なくとも**アイコンを表しているわけではない**のは間違いないですね。

[^2]: 筆者はHTMLタグの役割などを確認する際は、標準仕様を参照するためにもHTML Living Standardを閲覧する場合が多いのですが、iタグに関しては若干詩的な表現で理解が難しかったため今回はMDNを引用しました。

## それを踏まえてアイコンには何のタグを使えば良いのか

基本的には`span`で良いはずです。

アイコンが使われるのは「前後にテキストがあり、その上で視覚的な装飾を施したい」といった場合が多いのではないでしょうか。
そのため、セマンティックな意味をもたない`span`がかえって適切だと思われます。

もちろん様々なケースがあるため一概には言えませんが、筆者は大抵`span`を使っています。[^3]

[^3]: HTMLでのアイコンの扱い方というスコープからは外れるかもしれませんが、アイコンそのものがボタンの場合は`button`にFont Awesomeのクラスを付与しつつ`aria-label`をつける……といった実装をするパターンなどもあります。

## おまけ：なぜアイコンには`i`を使うのかを考えてみた

そもそも何故アイコンには`i`が使われるようになったのかを調べてみましたが、決定的な原因は分かりませんでした。
そのため以下はあくまで筆者の推測に過ぎません。
もしご存じの方がいたらコメントで教えていただけると幸いです。

- 1文字のタグなのでタイピングが楽
- 役割は違えどiconの頭文字がiであるのは事実だから覚えやすい
- 「`h`みたいにデカい影響力を持っていないし、多少変な使い方しても良いよね」の気持ちになってしまった
OpenCVで画像を不定形の座標で切り出し背景を透明にする

Open CVで作業をするとき毎回忘れてそのたびに解決策を探す小ネタの一つに上のものがある。
結構面倒なので毎回ゲンナリしてしばらくやる気を失いがちなのでこれ以上繰り返さないために書く。
pythonです。

結論はこれ

```python
import cv2
import numpy as np

def cutByPoints(src_img,poly):
    mytest=cv2.cvtColor(src_img,cv2.COLOR_BGR2BGRA)#アルファ追加　
    mask = np.zeros_like(mytest) #全画素透過
    mask = cv2.fillPoly(mask, [np.array(poly)], color=(255, 255, 255,255))#図＝白　背景＝透明
    masked_src_img00 = np.where(mask==255, mytest, mask)#図＝元画像　背景＝透明
    minx=-1
    miny=-1
    maxx=-1
    maxy=-1
    leng=len(poly)
    for i  in range(leng):
       if i==0: 
           minx=poly[i][0]
           maxx=poly[i][0]
           miny=poly[i][1]
           maxy=poly[i][1]
       else :
           if minx>poly[i][0]:
               minx=poly[i][0]
           if maxx<poly[i][0]:
               maxx=poly[i][0]
           if miny>poly[i][1]:
               miny=poly[i][1]
           if maxy<poly[i][1]:
               maxy=poly[i][1]         


    resimg=masked_src_img00[miny : maxy, minx : maxx]

    return resimg
```

これ以上googleしないために書いた

使い方はこんな感じ

```python
src_img = cv2.imread("/home/kokawa2003/ピクチャ/kyBXv.png")#元画像
#座標（星の右半分）
poly= [
            [200, 0],
            [260, 160],
            [400, 160],
            [300, 240],
            [400, 400],
            [200, 320],
]
img_bool=cutByPoints(src_img,poly)    

cv2.imwrite("./masked_crop.png", img_bool)
```