OmniAICreator/Qiita-1.07M huggingface dataset:
DeepLearning ✖️ Swift的なことがしたいッッ…！！　(工事中)

#DeepLearning✖️Swift的なことがしたいですッッ…！！！！　
理由：なんか面白そうだから。
テーマは、、、
#手の画像を撮影し、その手がグーチョキパーのどれかを推測するシステム
にしました。
##全体の流れ

 ![スクリーンショット 2021-09-12 16.45.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1230993/2e4e2afb-f049-af5f-8a99-bb3a5cad6c9b.png)

・訓練済みのネットワークは、PythonとKerasでゴニョゴニョしようと思います。
・訓練済みのネットワークをswiftで認識してくれるフレームワークを使おうと思います。（あれば）
・特に理由はありませんがスタンドアローン的な感じにしてみます。

##分類器(訓練済みのネットワーク)を作成するための環境づくり
・python 3.6 (Deep Learningといえばpython)
・Anaconda (以前使っていたため)
・Jupyter Notebook (以前使っていたため)
・Keras (初心者御用達深層学習フレームワーク)
![スクリーンショット 2021-09-15 20.30.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1230993/73931483-8169-4a74-2e7f-ca48ea39ee91.png)
(色々とフレームワークインストールしてくれるしわかりやすいUI。多分主流ではないけど。)

###データ収集
iPhoneで撮影し、その画像をネットワークに入力することを想定しているので、まずは画像を撮影するアプリを作ります。（考慮ポイント：画像撮影、パーミッション、サイズ変更、画像形式）
画像のサイズは128✖️128に。特に理由はないですが、一旦簡単そうなサイズでやってみます。本当はサイズ固定なしが良いですが、確かRun by DefineであるKeras(tensorfrow)はそうゆうの無理だった気がします。(pyTorchならできるっぽいけど、怠惰優先)


###コーディング

##iOS側の実装

###分類器以外

###分類器
っていうか、作成した分類器はswiftで使えるんか？？？

#使ってみた

#記録
・9/12 とりあえず全体像を記入した
・9/15 pythonの環境まとめ
・1/2 　　とりあえずこの記事に手を加えた　いつか画像を撮影するアプリを作る（はず）
Image Inpaintingを試してみた

画像のかけている部分を周囲の画素から復元するImage Inpaintingと呼ばれる技術を気軽に試せるソフトを見つけたので、使ってみました。
もしかしたら、Photoshop等に標準搭載されているかもしれません。

##インストール
https://freesoft-100.com/review/inpaint.html
freesoftのページからダウンロードサイトに飛べます。
windows/mac両方対応している用です。
windowsアプリは今は使えないみたい。

##試してみる
こちらの穴開きジーンズを補修してみます。

![Screenshot_2021-09-12-16-15-20-04_fe657d718f12c74f5142081a66e15273.jpg - Inpaint 2021_09_12 16_30_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727164/a1c92381-9c02-64ad-33a6-bddce237c0ba.png)

修正箇所をマスクし、削除を押すと…
![Screenshot_2021-09-12-16-15-20-04_fe657d718f12c74f5142081a66e15273.jpg - Inpaint 2021_09_12 16_32_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727164/18cb66ce-41e0-de72-d981-a66ac14ea36a.png)

キレイに補完してくれました。
画質が低いのもありますが、ぱっと見た感じでは分かりませんね。
![Screenshot_2021-09-12-16-15-20-04_fe657d718f12c74f5142081a66e15273.jpg_ - Inpaint 2021_09_12 16_34_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727164/53b2d3e2-6f87-32f8-93c6-4406b2da55b2.png)



チャックレスにしてみようと思ったのですが…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727164/8bcbf010-b3d2-0e43-894e-2f4dce97c467.png)

こっちはあまりキレイになりませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727164/bda4ffb5-4a38-329d-fe70-373bd437e06f.png)

赤いマスクが修正死体箇所で、緑のマスクが修正のために参考にする領域なのですが、この辺をうまく使い分けることができれば、もっと高精度な結果になるかもしれませんね。


Image inpaintingのような画像処理技術は日々進歩しているので、これよりもっと精度の高い手法もあるかもしれませんね
なんにせよすごい技術！

※フルスクリーンでスクショしたので、この記事すごく見づらいですね。終わってから気づきました。次から気をつけようと思います。
Visual Studio 2019 v16.4以降でC#を使う場合にはinheritdocを使った方がいいという話

# はじめに

筆者がVisual Studio 2019 v16.4以降でC#で開発をしていた際にinheritdocを使えることを知って、便利だなと思ったので、inheritdocの使い方について本記事ではまとめます。

# そもそもinheritdocとは

基底クラス、インターフェースのメソッドからXMLコメントを継承するためのXMLタグです。
詳細は[こちら](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/xmldoc/recommended-tags#inheritdoc)のMS公式の説明を参照ください。
Visual Studio v16.4でinferitdocに対応するようになりました。

# inheritdocを知らなかったときの開発上での問題点

例えば、以下のような計算機インターフェースがあるとします。

```csharp
interface ICalculator
{
    /// <summary>
    /// 足し算する
    /// </summary>
    /// <param name="term1">項1</param>
    /// <param name="term2">項2</param>
    /// <returns>計算結果</returns>
    double Add(double term1, double term2);

    /// <summary>
    /// 引き算する
    /// </summary>
    /// <param name="term1">項1</param>
    /// <param name="term2">項2</param>
    /// <returns>計算結果</returns>
    double Subtract(double term1, double term2);
}
```

計算機インターフェースを実装する計算機クラスでは、AddメソッドとSubtractメソッドのコメントがインターフェースと同じなので、コピペして作成することにしたとします。
以下のような感じです。

```csharp
class Calculator : ICalculator
{
    /// <summary>
    /// 足し算する
    /// </summary>
    /// <param name="term1">項1</param>
    /// <param name="term2">項2</param>
    /// <returns>計算結果</returns>
    double Add(double term1, double term2){...}

    /// <summary>
    /// 引き算する
    /// </summary>
    /// <param name="term1">項1</param>
    /// <param name="term2">項2</param>
    /// <returns>計算結果</returns>
    double Subtract(double term1, double term2){...}
}
```

このようにインターフェースと実装クラスでメンバのコメントが同じである場合、インターフェースのメンバが多いほどクラス側にコメントをコピペするといったことが多くなり、コメントを付ける手間が大きくなります。また、インターフェースのコメントと実装クラスのコメントを追従させるのが大変になるという問題も起きます。

# inheritdocを使うとどうなるか

inheritdocを使うと計算機クラスから計算機インターフェースでメンバのコメントの同期ができます。
以下のように書くことで、計算機クラスのAdd,Subtractメソッドのコメントは、計算機インターフェースのAdd,Subtranctメソッドのコメントと同期されます。さらにinheritdocではインターフェースと実装クラスで常にメンバのコメントが同期するので、計算機インターフェースのメンバのコメントを変更した際に計算機クラスのメンバのコメントを修正する必要がありません。

```csharp
class Calculator : ICalculator
{
    /// <inheritdoc/>
    double Add(double term1, double term2){...}

    /// <inheritdoc/>
    double Subtract(double term1, double term2){...}
}
```

# まとめ

Visual Studio 2019 v16.4以降でC#開発時に使った方が良いinheritdocタグについてメリットを中心にまとめました。
インターフェースと実装クラス間でのメンバコメントのコピペや追従をする必要がなくなるので、積極的に使っていきたいですね。
Gemfileで使われる「~>」とは

#「~>」とは

今後のバグ修正のみ受け入れたい場合に使用する。

```
# 6.1.3以上、6.2.0未満
gem 'rails', '~> 6.1.3' 
```

```
# 4.1.0以上、5.0.0未満
gem 'puma', '~> 4.1' 
```

#参照
https://yu8mada.com/2018/04/22/what-does-tilde-greater-than-sign-mean-in-gemfile/

https://qiita.com/awakia/items/5745938c192ca1139c63
osを作る その11

#概要

osを作る。
インラインアセンブラで、ジャンプしてジャンプしてジャンプしてみた。

#サンプルコード

```

void hello(void) {
	asm("jmp   HELLO2");
	asm("HELLO:");
	Serial.println("hello");
	asm("jmp   HELLO3");
	asm("HELLO2:");
}

void test(void) {
	asm("jmp   HELLO");
	asm("HELLO3:");
}

void setup(void) {
	Serial.begin(9600);
	Serial.println("ok0");
	hello();
	Serial.println("ok1");
	test();
	Serial.println("ok2");
}

void loop(void) {
}




```

#結果


```
ok0
ok1
hello
ok2
```


以上。
PySparkにて階層されているStructTypeを単一のカラムにフラット化する方法

## 概要
PySparkにて階層されているStructTypeを単一のカラムにフラットする方法を共有します。

階層されているStructTypeとは、下記のデータフレームのstruct列のことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/19d1a165-41b9-70f2-88cf-6a71fa647c9f.png)

今回紹介するのは、structのカラムをstruct.strintg.in.structという単一のカラムにする方法です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/09ff2733-d868-ddc1-97a7-339708f552bb.png)


## 検証環境
databricks runtime: 8.3.x-cpu-ml-scala2.12
Python version: 3.8.8
pyspark version: 3.1.2.dev0

## 手順
## 1. データを準備

```python
json_data ="""
{
    "array":[
        { "strintg.in.array": "値①"},
        { "strintg.in.array": "値②"},
        { "strintg.in.array": "値③"}
    ],
    "number":100,
    "string":"日本語",
    "struct":{
        "strintg.in.struct": "struct_1"
    },
}
"""

df = spark.read.json(sc.parallelize([json_data]))

df.display()
df.createOrReplaceTempView('tmp_nested_columns')

df.printSchema()
```

## 2. 関数を定義

```python
def get_flatten_transformation(df:DataFrame, combine_str = '_'):
    """StructTypeの階層をフラット化
    """
    cols=[col(e['name']).alias(e['renamed_column_name']) for e in _get_defination(df.schema.jsonValue(), combine_str=combine_str)] 
    return df.select(cols)

def _get_defination(schema:dict, prefix='', combine_str='_'):
    """Sparkデータフレームのスキーマを辞書の変数としてリターン値
    """        
    fields = schema['fields']
    list_definations=[]
    prefix = prefix+'.' if prefix !='' else ''
    for field in fields:
        if type(field['type']) is dict:
            if field['type']['type'] == 'struct':
                column_name_prefix = f'{prefix}`{field["name"]}`'
                list_definations.extend(DataEngineering.get_defination(field['type'], column_name_prefix))
            else:
                field["name"] = f'{prefix}`{field["name"]}`'
                field["renamed_column_name"] = f'{field["name"]}'.replace('.', combine_str).replace('`', '')
                list_definations.append(field)
        else:
            field["name"] = f'{prefix}`{field["name"]}`'
            field["renamed_column_name"] = f'{field["name"]}'.replace('.', combine_str).replace('`', '')
            list_definations.append(field)
    return list_definations

```

## 3. 階層されているStructTypeをフラット化

```python
df_2 = get_flatten_transformation(df)

df_2.printSchema()
df_2.display()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/533373a2-bf8b-fd46-8651-320c04c60b52.png)

## 4. ArrayTypeのデータフレームをフラット化

```python
# ArrayTypeをexplode関数によりStructTypeに変換
df_2_explode = (df
                    .select('*',explode('array').alias('_array'))
                    .drop('array')
                    .withColumnRenamed('_array','array')
               )

df_2_explode.display()
df_2_explode.printSchema()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4928ac73-a89c-5e86-7668-629a95c4c45a.png)
フローとプロセスビルダーで「変更済み」の解釈が異なると言う話

前提APIバージョン　52.0

# 結論
フローの「変更済み」はどちらの状態でもTrueとなるが、
プロセスビルダーの「変更済み」は未入力から入力済みの場合はFalseとなり、
入力内容が変更された場合のみTrueとなる。

表にすると以下の通り。

|  | 未入力->入力済み | 入力済み->入力内容変更 |
| :-: | :-: | :-: |
| プロセスビルダー | False | True |
| フロー | True | True |

この差異が元からなのかバージョンが原因なのかはわかりません。

---
# おまけ
試した処理の流れは以下の通り

* 処理１：ステータスの状態更新を契機に項目Aに値を設定する。
* 処理２：処理１の結果を契機に別の項目Bに値を設定する。

処理２の実行条件を直感的に書くとこうなる。

```
and(
    ISPICKVAL( [ParentObj__c].Status__c  , "Stage3") ,
    ISCHANGED([ParentObj__c].SubContact__c ) 
)
```

しかしプロセスビルダーでは動かない。
数式でもプルダウンによる条件設定の方で「変更済み」を使っても動かない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/f28e45ea-fe2c-a866-0d04-90b1d1748e94.png)
では、フローで同じ条件ならどうなるか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/81a0f917-4f17-b258-08c0-49549f348601.png)
なんと動くのだ。

当初はフローとプロセスビルダーの混在環境が原因と思い、プロセスビルダーのみで作っても再現したために冒頭の結論が原因では？と行き当たり、試してみたらまさかのビンゴでした。
JMX とは？(主にzabbixの監視について)

## 勉強前イメージ

java的なやつ？
zabbixでJMX監視ってあったけどよくわからなかった

## 調査

### JMX とは

Java Management Extensions の略で、
アプリケーションやシステムのネットワークの管理や監視を行うフレームワークになります。
JMXに沿って管理を行うことで、簡単にできます。

### zabbixでJMX監視をする

元々はzabbixを見てJMXとは？って思ったので、
今手元に監視できるものがないので、
軽くどう進めていけばいいのかだけ確認します。

- zabbixサーバに zabbix-java-gateway をインストール
- アプリケーションサーバで zabbix-agent のインストール、zabbixの設定を行う
- zabbixの画面でホストからJMXインタフェースでIPを指定してホストを追加、アイテム等の取得を行う

流れとしては以下になります。
JVM用のIPを指定するインタフェースもあります。

## 勉強後イメージ

実はまだそこまで理解できてなかったりするんだけど
フレームワークを通じてzabbixで管理する一つって感じがする・・・
正直ほぼjava触ったことないから概要しかイメージできてない

## 参考

- [zabbixによるJMX監視](https://www.doodle-office.work/entry/2019/03/19/162549)
- [ZabbixでJMX監視を行う](https://dev-error.hatenablog.com/entry/2020/09/29/163057)
UbuntuとApacheとmod_auth_mellonでAzureADにSAML認証する

IdPにAzureADを使用し、SPにApache(mod_auth_mellon)を使用した時の設定をまとめます。
特に、UbuntuとAzureADの組み合わせに関しては、まったく記事が見つからなかったので少しでも参考になれば幸いです。
他に不明なところはコメントください追記や別記事にしていきたいと思います。

# 環境

|構成  |環境  |
|---|---|---|
|IdP  |AzureAD  |
|SP  |Ubuntu(Apache 2.4 mod_auth_mellon)  |

UbuntusはWindows10 WSL2 の Ubuntu 20.4を使用しました。 

# 参考
基本的にこのサイトのとおりにやればできました。
https://www.techsupportpk.com/2021/05/integrate-azure-active-directory-authentication-apache-ubuntu-debian.html

# つまづいたところ
AzureADのデフォルト属性の中にはNameという属性がないので、設定する必要あり。もし設定しなかった場合はHTTP 500エラーとなった。

```
<Location /protected>
Require valid-user
AuthType "Mellon"
MellonEnable "auth"
MellonDecoder "none"
MellonVariable "cookie"
MellonSecureCookie On
MellonUser "Name"
</Location>
```

# 設定しなくてもOKなところ
AzureADでユーザへの割当要求を設定しているが、これがデフォルトの「はい」の場合はユーザまたはグループをAzureADに割り当てる必要あり

# 必須かどうかわからない設定
前にPythonでSAML2.0を設定したときは不要だった、IdPのフェデレーションが今回は必要でした。
AzureADでフェデレーション設定の情報をダウンロードした後に、Apacheを再起動するようです。
AzureAD_metadata.xmlの部分です。

```
<location />
MellonSPPrivateKeyFile /etc/apache2/mellon/mellon.key
MellonSPCertFile /etc/apache2/mellon/mellon.cert
MellonSPMetadataFile /etc/apache2/mellon/mellon_metadata.xml
MellonIdPMetadataFile /etc/apache2/mellon/AzureAD_metadata.xml
MellonEndpointPath /mellon
MellonEnable "info"
</Location>
```

# わからないところ
* HTTPSは必ず必要か？
* Location設定が2か所に必要だけど関係性は調査が必要
* HTMLの中で属性値を取りたい場合はどのように設定したらいいかわからない
* 細かい設定がわからない

わからないところだらけだけど、まずはSSOできたことやAzureADの例が少ない弱点でしょうか。
次は、CentOSで実際にHTMLで取得するときにどうすればいいのか？などを調べていきたいと思います。
gitコミットでignoreされるThe following paths are ignored by one of your .gitignore files:

###状況:



```
% git add .
```
githubにpushしたのになぜか一つのファイルだけ無視されている


```
% git add index.html
The following paths are ignored by one of your .gitignore files:
index.html
hint: Use -f if you really want to add them.
hint: Turn this message off by running
hint: "git config advice.addIgnoredFile false"
```

###解決：

-f for force
addの後にオプション　”-f”　+　ファイル名

``` 
% git add -f index.html
```
Commandパターンの利用:1つのボタンで複数の機能を使えるようにする

#目的
1つのボタン（機能を割り当てる対象であれば何でもよい）に複数の機能を割り当てることの出来るような柔軟性を持たせるためにはどのように実装すればよいかを知る。

参考 : [Game Programing Patterns](https://gameprogrammingpatterns.com/)

#要求仕様
ボタンA,B,Cがある時に、ユーザーはそれぞれのボタンにキック、パンチ、ジャンプの機能を自由に割り当てる、実行できること。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/e1c545ee-6538-55a7-634f-f33945b32675.png)


#完成動作
![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/6e7feaeb-e600-f6a5-968f-7185f21532dd.gif)

#実現方法
[お試しコード](https://github.com/KANJI-practice/Game-Programming-Patterns)

Commandクラスを仮想クラスとして、Jump,Punch,Kickそれぞれのクラスが継承し、独自のメソッドを実装しコマンド動作を実現します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/f947c033-d07c-de17-f9bd-013cf8196951.png)

ボタンA,B,Cにはユーザーが指定したコマンドをAssignButtonCommand()で割り当てます。
ButtonStringでどのボタンに、CommadStringで何のコマンドを割り当てるか指定します。

```c#:InputHandler.cs
 public void AssignButtonCommand(string ButtonString, string CommadString)
        {
            //C#の参照はこれでよいのか良く知らない
            ref Command Button = ref GetButtonInstance(ButtonString);

            if (IsKick(CommadString))
            {
                Button = new KickCommand();
            }
            else if (IsJump(CommadString))
            {
                Button = new JumpCommand();
            }
            else if (IsPanch(CommadString))
            {
                Button = new PunchCommand();
            }
            else
            {
                //TODO デフォルト割り当て 各ボタンのデフォルトがセットされるようにする
                Button = new KickCommand();
            }
          
        } 
```
実行ボタンが押されると、実行コマンドに選択されているコマンドのインスタンスが取得され、対応するコマンドが実行されます。

```c#:Form1.cs
        //実行
        private void checkBox13_CheckedChanged(object sender, EventArgs e)
        {
            Command command = GetActiveButtonCommand();
            label8.Text = command.Execute();

        }
```


C#は普段使わないので、文法的に間違っている可能性があるので、コアの考え方だけ

```c++:Sample.cpp
 class Sample
    {
        //Button_Aにコマンドを割り当てる処理
        //Button_Bにコマンドを割り当てる処理

        //実行
        void func()
        {
            if (//ボタンAが押されたら)
            {
                Button_A.execute();
            }
            else if (//ボタンBが押されたら)
            {
                Button_B.execute();
            }
            else { };
        }
    }

```
【Python】argparse で `--help` や `--version` のようなコマンドを自作する

[argparse](https://docs.python.org/ja/3/library/argparse.html) を使って、一般的な CLI における `--help` や `--version` のような動きをするコマンドを実装してみました。

具体的には以下の要件です。

- 他の引数やオプションよりも優先して実行される
- 実行された後、即時終了する

## 実行環境

`Python 3.9.7` で正常に実行されることを確認しました。ある程度新しいバージョンであれば動くと思います。

## サンプルスクリプト

`-S` もしくは `--system` をオプションとして与えられたとき、`print(sys.version)` を実行して処理を終了するシンプルなスクリプトです。

```python:sample.py
import sys
from argparse import SUPPRESS, Action, ArgumentParser


def show_system_version():
    print(sys.version)


class SampleAction(Action):
    def __init__(self, option_strings, dest=SUPPRESS, default=SUPPRESS, help=None):
        super().__init__(
            option_strings=option_strings,
            dest=dest,
            default=default,
            nargs=0,
            help=help,
        )

    def __call__(self, parser, namespace, values, option_string=None):
        show_system_version()
        parser.exit()


def main():
    parser = ArgumentParser()
    parser.add_argument(
        "-S", "--system", action=SampleAction, help="show system version and exit"
    )
    parser.add_argument("--mushi", help="無視されるべきオプション")
    args = parser.parse_args()
    print(args.mushi)


if __name__ == "__main__":
    main()
```

`show_system_version` 関数の中身やヘルプメッセージを変更するなどしてカスタマイズできます。

ポイントは以下です。

- `Action` クラスを継承したクラスを作成する
- `__call__` 内で処理を実行し、 `parser.exit()` する
- `add_argument` の `action` にそのクラスを指定する

実装の詳細は、[argparse モジュールの _HelpAction クラスと _VersionAction クラス](https://github.com/python/cpython/blob/9cd8fb8d6356c17dafa1be727cab3d438f6df53f/Lib/argparse.py#L1079-L1121) を参考にしました。

## サンプルスクリプトの実行結果

```sh
# ヘルプテキストが正常に表示されることを確認
$ python3 sample.py -h

usage: sample.py [-h] [-S] [--mushi MUSHI]

optional arguments:
  -h, --help     show this help message and exit
  -S, --system   show system version and exit
  --mushi MUSHI  無視されるべきオプション
```

```sh
# print(sys.version) が正常に実行されることを確認
$ python3 sample.py -S

3.9.7 (default, Sep  3 2021, 12:37:55)
[Clang 12.0.5 (clang-1205.0.22.9)]
```

```sh
# -S をつけないと --mushi 引数のテキストは表示される
$ python3 sample.py --mushi テキスト

テキスト
```

```sh
# -S をつけると --mushi は無視される
$ python3 sample.py --mushi テキスト -S

3.9.7 (default, Sep  3 2021, 12:37:55)
[Clang 12.0.5 (clang-1205.0.22.9)]
```

```sh
# 順番を変更しても上記と同じ結果
$ python3 sample.py -S --mushi テキスト

3.9.7 (default, Sep  3 2021, 12:37:55)
[Clang 12.0.5 (clang-1205.0.22.9)]
```

## 補足

サンプルスクリプト内で `sys.version` を表示していますが、実際に**パッケージやライブラリのバージョン**を表示する `--version` コマンドを実装する場合は、`add_argument('--version', action='version', version='%(prog)s 2.0')` のような専用アクションが用意されていますので、そちらを使用すべきです。

## 参考リンク

- [argparse --- action — Python 3.9.4 ドキュメント](https://docs.python.org/ja/3/library/argparse.html#action)
- [argparse --- Action クラス — Python 3.9.4 ドキュメント](https://docs.python.org/ja/3/library/argparse.html#argparse.Action)
- [cpython/argparse.py at 9cd8fb8d6356c17dafa1be727cab3d438f6df53f · python/cpython · GitHub](https://github.com/python/cpython/blob/9cd8fb8d6356c17dafa1be727cab3d438f6df53f/Lib/argparse.py#L1079-L1121)

## 終わりに

記事内に誤りがある場合や「もっとうまいやり方があるよ」という場合は、コメント頂けますと幸いです。

また、Qiita 初投稿ですので、記事の書き方の作法的な部分でのご指摘もお待ちしております。
RubyKaigi Takeout 2021参加レポート

こんにちは。今回はRubyKaigi Takeout 2021に参加してきました。
昨年に引き続きオンラインでの開催ということで、自宅からの参加です。オンラインでの開催はコメント欄などで反応がリアルタイムに見れるのが楽しいですね。

https://rubykaigi.org/2021-takeout

参加したいくつかのセッションをご紹介します。

## 一日目

### Keynote: TypeProf for IDE: Enrich Dev-Experience without Annotations
https://rubykaigi.org/2021-takeout/presentations/mametter.html

https://www.slideshare.net/mametter/typeprof-for-ide-enrich-development-experience-without-annotations

Ruby 3.1にbundleされるTypeProfの話からRubyKaigi Takeout 2021はスタート。
TypeProfによって静的型付けでの開発がより快適に進められる様子を見ることができました。
型推論がエディタにリアルタイムで表示される様におおっとなりました。
今後の課題としては、IDEでの動作に時間がかかるとのことでしたが、
RBSを書くことによってスピードアップが見込まれるため、書くとよさそうという話もありました。

### RuboCop in 2021: Stable and Beyond

https://rubykaigi.org/2021-takeout/presentations/koic.html

Rubocopの1.0が昨年リリースになったものの、1.0以前のDL数が圧倒的に多いということで、
アップグレードする後押しとして、1.0の特徴が紹介されました。
1.0 以降はアップグレード時に互換性を担保しており、アップグレードしたことによる急なrubocopエラーの上昇にはならなそうです。
また、`--parallel` オプションがデフォルトとなり、環境によっては約6倍の速さになるとのこと。

### Parallel testing with Ractors: putting CPUs to work

https://rubykaigi.org/2021-takeout/presentations/vinistock.html

Ractorを利用した並列テストの実行について。
複数CPUを活用するときに、予めどのテストがどのCPUを利用するか決まっている場合、適切にテストを配分できないことが想定されますが、テストの進行に合わせてCPUに配分できれば、最適化できそうです。
複数CPUを活用するなら、Ractorが使える？ということで、テストを並列化し、それを実際に実行してみせてくれました。

## 二日目

### The newsletter of RBS updates

https://rubykaigi.org/2021-takeout/presentations/p_ck_.html

Ruby3.1におけるRBSの更新について。
依存ライブラリの管理をするためのrbs collectionや、bounded type parameter, Generic Type Aliasの導入が発表されました。
RBSを使うにあたっての柔軟性が上がって、より使いやすくなりそうという印象を受けました。

### include/prepend in refinements should be prohibited

https://rubykaigi.org/2021-takeout/presentations/shugomaeda.html

refinementsの機能の修正方針について。
refineはモンキーパッチを当てるのに便利な機能ですが、この中でmoduleをincludeすると不具合が発生することがあるため、
include/prependを禁止し、代わりにimportを導入するとのこと。

### Graphical Terminal User Interface of Ruby 3.1

https://rubykaigi.org/2021-takeout/presentations/aycabta.html

めちゃくちゃ自然がキレイでした、スイカ美味しそう :watermelon:
ダイアログウィンドウつかってみたいです。

### Ruby Committers vs the World

これからのRubyをどうしていくか？について、コミッターの話が直に聞ける機会。
新機能の検討から開発環境まで、Ruby開発の裏側を知ることができました。

## 三日目

### How to develop the Standard Libraries of Ruby?

https://rubykaigi.org/2021-takeout/presentations/hsbt.html

Ruby3.0以降でStandard Libraryをgem化して、各機能の導入をカスタムできるようにする流れについて。
各機能における問題をRubyの本体の問題と切り離すことができるメリットに頷かされました。

### Ruby, Ractor, QUIC

https://rubykaigi.org/2021-takeout/presentations/yu_suke1994.html

高速な通信を目指して開発された新しい通信プロトコルQUICにRactorを利用して対応してみようという取り組み。
QUICの説明からパケットをどうRubyで扱うかが丁寧に説明されていて面白かったです。
残念ながらRactor内でOpenSSLが使えずに終わってしまったものの、Ractorの使える幅が今後もっと広がればいろんなところに可能性があるなと改めて思いました。

### 10 years of Ruby-powered citizen science

https://rubykaigi.org/2021-takeout/presentations/matschaffer.html

私はこれまで存じ上げなかったのですが、[Safecast](https://safecast.jp/about/)という福島の原発事故を発端とした、有用なデータを収集・公開するプロジェクトについての紹介でした。
バックグラウンドにRubyが使われており、そのこと自体の関心はもちろん、収集した情報のAPIでの提供や、grafanaを利用したグラフが公開されているなど、一般の人が収集されたデータに触れやすいようになっている取り組みが素晴らしいと思いました。

### Matz Keynote

Ruby3.0で追加された各機能の振り返りと、その使い勝手を更によくするような今回の3.1のアップデートについて。
全体を通して、Rubyを利用した開発体験が更によくなっていきそうという印象を受けました。

## 終わり

個人的には3.0で追加されたRactorが興味深くて、もっといろんなgemが対応するようになると嬉しいなと思いました。
また、静的型付けを利用した開発環境がかなり整っていく様が伝わってきて、この開発体験を確かに利用してみたい！という気持ちが増しました。
C# delegateの使い方メモ

delegateを自ら使う機会はほとんどないのですが、ライブラリのソースコードを読む時にたまに遭遇して、そこで「うっ」となったりします。
このままだとよくないので、delegateを脳に染み込ませるためにも、改めてサンプルコードを書いてみました。

あくまで、個人用のメモであり、delegateとは何なのか？いつ使うのか？等の話は出てきません。ご了承ください。



# サンプルコード

Unityで使えるサンプルコードを書いてみました。（delegateはUnity以外でも利用できます。）

```c#
using UnityEngine;

namespace Practice
{
    // デリゲートを宣言します
    public delegate void Printer(string s);

    /// <summary>
    /// 任意のGameObjectにアタッチしてご利用ください。
    /// </summary>
    public class DelegatePractice : MonoBehaviour
    {
        private void Start()
        {
            // newでデリゲートを生成できます。
            var printA = new Printer(Debug.Log);
            // 実行すると、「Hello World A」とコンソールに表示されます。
            printA("Hello World A");

            // newを省略することができます。この場合、varは利用できません。
            Printer printB = Debug.Log;
            // 実行すると、「Hello World B」と表示されます。
            printB("Hello World B");

            // 匿名メソッドでデリゲートを生成できます。
            Printer printC = delegate(string s) { Debug.Log(s); };
            // 「Hello World C」と表示されます。
            printC("Hello World C");

            // ラムダ式でデリゲートを生成できます。JavaScript経験者なら馴染みのある書き方だと思います。
            Printer printD = (string s) => { Debug.Log(s); };
            // 「Hello World D」と表示されます。
            printD("Hello World D");

            // 複数のデリゲートを生成し、+で結合できます。
            var printE = new Printer(Debug.Log) + new Printer(Debug.Log);
            // この場合、「Hello World E」が2回表示されます。
            printE("Hello World E");

            // 登録したものを-で削除できます。以下では、「Debug.Log」を2回登録してから、1回削除しています。
            var printF = new Printer(Debug.Log) + new Printer(Debug.Log) - new Printer(Debug.Log);
            // この場合、「Hello World F」が1回表示されます。
            printF("Hello World F");

            // +=で後から追加したり、-=で後から削除したりできます。以下では、「Debug.Log」を2回登録してから、1回削除しています。
            var printG = new Printer(Debug.Log);
            printG += new Printer(Debug.Log);
            printG -= new Printer(Debug.Log);
            // この場合、「Hello World G」が1回表示されます。
            printG("Hello World G");
        }
    }
}
```

こんな風に、1つの変数に複数のデリゲートを登録したり削除したりできます。


# delegateという英単語のニュアンス

delegate という英単語を辞書で調べると「委任」という意味が出てきます。

この委任という言葉がいまいちピンと来ないんですが、あえて委任という言葉を使って、上記のサンプルコードを説明する場合、
「`DelegatePractice` というクラスが、 `Printer` という処理を、 `Debug` というクラスに委任している。」
ということになると思います。（間違っていたらすみません。）



# さいごに

本記事作成にあたり、以下の記事を参考にさせていただきました。わかりやすい記事、ありがとうございました。

- [C# デリゲートについて](https://qiita.com/ysn/items/71fe3f332ea9a3114d36)
はじめてのSAT solver実行

ひさしぶりにSAT　solverを触ることになり、環境を再構築したため、備忘録的に。

まずは協議会であるSAT competition　2021のサイトから。
今はminiSatではなく、CadiCalというものになっている様子。

https://satcompetition.github.io/2021/downloads.html


1) まずはforkして自分のレポジトリの中に。

https://github.com/arminbiere/cadical

2) 次にConfigure&make

```terminal
./Configure
make
```

3) そうすると buildディレクトリの中に実行ファイル`cadical`ができるので
`cadical -h`でhelpを見ておく

4) 解く問題はCompetitionから適宜持ってくる。2021のものであれば

https://satcompetition.github.io/2021/downloads.html

から

```　terminal
mkdir problems #適当にフォルダを作る　ー多数ダウンロードされるため
cd problems
wget --content-disposition -i https://satcompetition.github.io/2021/downloads/main2021.url
```
などでダウンロード。

5) あとは実行。とりあえず制限時間120秒（実時間）で

```terminal
./build/cadical -t 120 ./problems/(問題名指定）
```


Windowsで実行するのに戸惑ったのが嘘のよう。簡単。
aspect-ratioでアスペクト比を固定する

# 環境
+ Windows10
+ Chrome93

Chromeでは88から、Firefoxでは89から、Safariは15からです。

https://caniuse.com/?search=aspect-ratio

# aspect-ratio
今回は16:9にします

```html
<div class="container"></div>
```

```css
.container {
  aspect-ratio: 16 / 9
}
```

これだけです。とても簡単。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053860/f8d9f5b8-b901-bc7b-f4cf-8cdce22de364.jpeg)
Safariでも使えるようになりました。

# 未対応ブラウザ
## 方法1

```html
<div class="container"></div>
```

```css
.container {
  position: relative
}

#container::before {
  content:"";
  display: block;
  padding-bottom: 56.25%; /*  height(9) / width(16) * 100  */
}
```
少し使い勝手が悪いです。

## 方法2
```
16:9 = w:h
 16h = 9w
   h = 9w / 16
```
とかいう等式変形で

```css
.container {
  width: 100vw; /* (任意のwidth(100%とかは無理そう)) */
  height: calc(9 * 100vw / 16);
}
```
こんな感じでいけます。

# まとめ
`aspect-ratio`がおすすめ
【AWS】EventBridgeでEC2インスタンスIDを指定する時の注意

AWSのEventBrigeとSystemManagerを使用して、
EC2インスタンスを定時で停止するため実装したが、
時間になってもインスタンスが停止されず、原因解決に時間が掛かってしまった。

その原因が分からないと沼りそうだったので、備忘録として記載する。

## 実装内容
- 毎日0時にEC2インスタンスを自動停止する
- EventBrigeで停止スケジュールと停止対象のインスタンスを指定
- SystemManagerでインスタンスの停止アクションを選択する。

## 原因
***ダブルコーテーションの記述が間違っていた***
EventBrige ルールにて、インスタンスIDを記述するダブルコーテーションが
正常に認識されていなかった。

- 誤った記述（ダブルコーテーション「"」が斜めになっている）
![スクリーンショット 2021-09-12 15.11.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614948/7379a6da-b900-d804-7818-83c03cba04af.png)

- 正常な記述
![スクリーンショット 2021-09-12 15.09.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614948/9ab38e75-3f98-bacb-19e9-6d8c9c6c9090.png)

## 発生理由
slackやメモ帳からコピーすると、ダブルコーテーションが斜めになってしまう可能性がある。
これはフォントの違いによって発生してしまうとのこと。

## まとめ
- 外部アプリからコードをコピーする時は、ダブルコーテーションの違いに気をつけよう
サンプルデータモデルをインポートして、DynamoDB にコミットする【NoSQL Workbench】

DynamoDB 専用の NoSQL Workbench には様々なサンプルデータモデルが用意されています。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/workbench.SampleModels.html

サンプルデータモデルには、GSI やファセットが定義されているので DynamoDB のテーブル設計の参考になります。

また、NoSQL Workbench には[コミット機能](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/workbench.Visualizer.Commit.html)があり、データモデルを DynamoDB にエクスポートすることができます。サンプルデータモデルには Item もいくつか用意されているので、データモデルを DynamoDB にコミットした後には、サンプルデータを用意することなく、そのまま簡単なアプリケーションの作成まで行えそうです。

## サンプルデータモデルのインポート

左側ペインの**[Amazon DynamoDB]**から Sample data models テーブルの中からインポートしたいモデルの行にカーソルを持っていき**[Import]**を選択します。
![import-sample-model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/2b9ee08e-d0ec-a6a9-0e90-985bfdce4015.png)

インポートが成功すると**[Data modeler]**にインポートしたテーブルの情報が表示されます。
![data-model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/0d5a4b26-72a1-5009-4f8b-48fa250443b1.png)

## データをビジュアル化

左側ペインの**[Visualizer]**を選択すると、メインテーブルや GSI でのデータ表示が可視化されます。
![visualizer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/d3a61e1d-9965-7553-817e-504084099519.png)

## サンプルデータモデルを DynamoDB にコミット

データモデルを DynamoDB のテーブルにコミットしてみます。
**[Visualizer]**から**[Commit to Amazon DynamoDB]**を選択すると、モーダルが表示されます。
![commit-sample-model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/0419e3d2-3f64-1f14-198a-8c834b12ebce.png)
新しいコネクションを作成するか、既存のコネクションを選択します。コネクションを選択できたら**[Commit]**を押下します。すると、Operation builder のトップページに移ります。
![new-connection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/bf5b8fc6-d9ea-9bfc-27d5-8a4735067344.png)
先ほど選択したコネクションの**[Open]**を選択すると、そのコネクションに紐づいているテーブルの一覧が Tables に表示されます。コミットしたデータモデルのテーブルを選択すると、Visualizer で確認していたデータがテーブルにコミットされているのが確認できます。
![table-data.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/70f8b3b0-95c8-a395-4680-f2515a2f9e81.png)

## おわりに

DynamoDB のテーブル設計は、あらかじめアプリケーションのクエリパターンを知っておく必要があるので、NoSQL Workbench の **Data modeler** と **Visualize** を使用して、クエリパターンがシミュレーションできるのは、なかなか便利かなと思いました。
Oracle Database サポート期間

#Oracle Database サポート期間

| Version | Premier Support | Extended Support |   remarks |   GA|
|:-:|:-:|:-:|:-:|:-:|
|  11.2.0.4 | 2015/1/31  | 2018/12/31  | Market Driven Support <br> 2024/12/31 |2009|
| 12.1.0.2  | 2018/7/31  |  2019/7/31 | Market Driven Support  <br>  2024/12/31 |2013|
| 12.2.0.1  |  2020/11/30 | 非提供  |  Market Driven Support  <br> 2024/12/31 |2017|
| 18c (12.2.0.2) | 2021/6/30  | 非提供  |  - |2018|
|  19c (12.2.0.3) | 2029/12/31  | 2032/12/31  | -  |2019|
|  21c  | 2027/7/30  | 非提供  | -  |2021|

##### 更新日2024/11/06
masterブランチで作業してしまった時の対処法

####＜手順＞

1, まずは修正内容を確認する。

```bash
$ git status  #ターミナルに作業した内容、変更した内容が出てくる
```

2, 修正内容を別の場所に一時保管する。

```bash
$ git stash 
```

その後もう一度`git status`をすると先ほどの修正内容はなくなり、ターミナルに下記のような文章が出るはず。

```bash
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
```

3, 本来作業をしたかったブランチに切り替えorブランチ作り切り替える。

```bash
git checkout -b ○○○
```

4, 一時保管していた内容を切り替えたブランチに適用する。

```bash
git stash apply
```
ノイズ入り波形の生成

##ポイント
➀波形データは時系列解析などで重要となってくる。ノイズ生成やノイズ除去の方法について整理しておく必要がある。
➁波形データの特徴量
・振幅（基線からの波の振れ幅）
・周期（一回振動するのにかかる時間）
・振動数（一秒間あたりに振動する回数）
・波長（一回振動するときのx軸方向の長さ）
➂sin波のy座標に対して乱数値を足し合わせることによって、ノイズを表現することができる。
➃今回のグラフ表示には、matplotlibを使用した。このライブラリの機能の特徴としては、
・グラフを重ね合わせて表示することができる。
・表示範囲について、X軸もしくはY軸方向の最大値・最小値を設定することができる。
・表示する曲線の色や点線の有無などの設定をすることができる。
・ラベル、Grid線、凡例（Legend）の表示を行うことができる。
・横線や縦線を引くことができる。

##ソース

```Python
import numpy as np
import matplotlib.pyplot as plt
```

```Python
n=100 #x軸方向のデータ数
xmin, xmax = 0,19
#x軸方向の範囲(0～6π)にかけて、100個のx座標データを用意する。
x = np.linspace(0, 6*np.pi, n) 
#きれいなsin波とノイズ入りsin波の準備
y=np.sin(x)
y_noise= y + 0.2 * np.random.randn(n)
#波形の描写
p = plt.plot(x, y, "blue", linestyle='solid')
p = plt.plot(x, y_noise, "red", linestyle='solid')
p = plt.hlines([0], xmin, xmax, "yellow", linestyles='dashed')     # 基線

p = plt.xlim(xmin, xmax)
p = plt.ylim(-1.5, 1.5)
p = plt.xlabel('X')
p = plt.ylabel('Y')
plt.show(p)
```

##出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246864/dc52bc36-0a52-60a0-79d3-a7b3d11c4e52.png)
Asp.net core Identity 翻訳開始まで

#はじめに
Asp.net core Identityを使うと、アカウントの作成やログイン/ログアウトを始め外部認証など様々な認証関係の仕組みを手っ取り早くシステムに反映させる事が出来ます。特にセキュリティ関係に詳しくない人からすると1からコーディングするよりも遥かに安全に認証の仕組みを導入出来るので非常に大きい恩恵があります。

この記事はAsp.net core Identityを使うと翻訳作業は必須になると思うので翻訳が行えるまでの記事です。(ソースコードを見れるので読み解いてカスタマイズなども行っていけるようになります)

#手順
Areasフォルダを右クリックし追加を選択、新しいスキャンホールディングを選択し、表示された画面上でIDを選択します。 後は、追加を押すとどのページのコードが必要かの選択画面が出ますので対象を選択し追加することでコードが追加されます。

(開発が進んだ後にこの作業を行いエラーが発生する場合は、別の新規プロジェクトでこの作業を行い、作成されたコードをまるまる移動して追加してやれば問題なく進みました。)実体験なので念のため記載。

![6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110251/8b0fd517-20fa-6cfa-be43-43c18f377949.gif)

正常に追加すると以下のようにソースファイルが追加されますので、後は翻訳をしていく事になります。

![キャプチャ18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110251/7c3eaba3-b1ad-cd27-f936-b1d1f9358a11.png)

<br>
[Blazor関連のリンク]
[Blazor WebAssembly プロジェクト作成(認証あり)](https://qiita.com/pero_88/items/be142d5d0ba92e5c91d0)
[Blazor WebAssembly 初期プロジェクト構成の入門](https://qiita.com/pero_88/items/ced1028ad536a43fec1d)
[Blazor WebAssembly Postgresを使うまで](https://qiita.com/pero_88/items/23e88a1d2bc3659b9946)
[Blazor WebAssembly コードビハインド](https://qiita.com/pero_88/items/be871f4ac63868f048f0)
[Blazor WebAssembly InputSelectの使い方](https://qiita.com/pero_88/items/3eddcd1aedf8bbc8441b)
[Blazor WebAssembly 部品コンポーネントへ渡した変数とのバインド](https://qiita.com/pero_88/items/f5d70b41337ca6d08dd1)
[Asp.net core Identity 翻訳開始まで](https://qiita.com/pero_88/items/44a66b7ac217f674a7f3)
[Blazor WebAssembly 使いまわしが利く部品(表)を作る。](https://qiita.com/pero_88/items/5e1e3f68d50d941ee36a)
AvastによってSpring Bootのjarファイルが消滅する現象

#事象
java（OpenJDK11）コマンドでSpring Boot（v2.5.4）のjarファイルを実行すると、一定時間の後にプロセスが停止してjarファイルが消滅する。
Spring Bootが正しく起動しなければ（例えばクラスパスが不足しているとか、メインメソッドでSpringApplicationを実行しないとか）、これは発生しない。

#原因
avastのファイルシールド（メインシールド）が断りも無く削除していた。メインシールドを切るか、例外ディレクトリに作業ディレクトリを追加すると事象は発生しなくなった。

----
Spring Bootが正しく起動しないと発生しないのでSpring Boot側の問題かとも思ったが、もちろんそんなことは無かった。消す時に確認するモードにしているはずなんだが、勝手に消されてしまうようだ。
ビット演算　基本中の基本のビットフラグ操作

ビット演算の基本のフラグの上げ下げと指定したビットを操作する関数です。templateクラスです


```c++
#include <iostream>


#define BYTE_BIT (8)	//区切り

template<typename T>
class Bit
{

public:

	//コンストラクタ
	Bit()
	{
		bit = 0;
	}
	

	//ビット表示
	void Print()
	{
		for(int i = sizeof(bit) * 8 -1; i >= 0; i--)
		{
			std::cout<< ((bit >> i) & 1) <<" ";

			//区切り
			if( (i % BYTE_BIT) == 0)
			{

				std::cout<<"  ";
			}
		}

		std::cout<<std::endl;
		
	}

	//フラグが立っているかどうか？
	bool IsFlagUp(T number)
	{
		if( (bit >> number) & (T)1)
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	//符号ビットを立たせる
	void SignedUp()
	{	
		bit = bit | ((T)1 << (sizeof(T) * 8 -1));
	}


	//フラグを立たせる 左から何番目か？
	void FlagUp(T  number)
	{
	    if(IsFlagUp(number) == false)
	    {
			number = (sizeof(T) * 8 - 1) - number;
			bit =  bit | (1 << number);
	    }
	}

	//フラグを下げる 左から何番目か？
	void FlagDown(T number)
	{
	    if(IsFlagUp_Int(bit,number) == true)
	    {
			number = (sizeof(T) * 8) - number;
			bit =  bit ^ (1 << number);
	    }
	}

	//フラグをクリア　全部下げる
	void FlagAllDown()
	{

		bit = 0;

		return bit;
	}

	//フラグを全部上げる　
	void FlagAllUp()
	{
		FlagAllDown();	//フラグを下げる
		bit = ~bit;		//ビットを全部反転
	}


	//デストラクタ
	~Bit()
	{
		
	}


private:

	T bit;	//ビット操作対象

};

```
OpenMPI 4.1.1 をalmalinuxにいれる

## 環境

- Almalinux

## 実行手順

[OpenMPI](https://github.com/open-mpi/ompi)のREADMEを参照した。[そのときのREADMEも貼っておく](https://qiita.com/drafts/c54608d606f243813e20/edit#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9Fopenmpi%E5%85%AC%E5%BC%8F%E3%81%AEquick-start)。ちなみに該当[commit](https://github.com/open-mpi/ompi/commit/6abd667325aa31ceb6dae3e49ceac47fc997ea75)はこちら。

tar.bz2は[ここ](https://www.open-mpi.org/software/ompi/v4.1/)から、[openmpi-4.1.1.tar.bz2](https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.1.tar.bz2)をwget した。

```shell
wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.1.tar.bz2
```

READMEのQuick startを見る限りでは、あとは手順通り進めればいいことになるがこれでは失敗する。perlやC, C++などのコンパイラや実行環境が不足しているから。
なので、`apt install build-essential`のノリで、いい感じにいろいろ入れてくれるやつをyumで入れる。

[参考](http://blog.64p.org/entry/2013/07/22/142457)

```shell
sudo yum groupinstall "Development Tools"
sudo yum install kernel-devel kernel-headers
```

特定の環境のコンパイラや実行環境を求める場合は、これでやらずに一個ずつ丁寧に入れるか、一括して入れたあとにこだわりたいものをいい感じに入れなおせばいいと思う。（やってない）

ここまでこればあとはQuick startの通りにやればいい。最初にわたす`--prefix`は`/usr/local/package/openmpi/4.1.1`とかでいいんじゃないだろうか。自分はそうした。

というのも、module environmentを使ってスパコンみたいにパッケージとかバージョン管理できたら依存関係とか楽そうでいいよね。なので今度は[これ](https://qiita.com/Ag_smith/items/f268ad27165a60aecd35#introduction)を参考にmodule envirnmentを導入してみようと思う。

module environmentを入れれば、`/usr/local/package/openmpi/3.1.1`とか`/usr/local/package/openmpi/4.1.1_gcchogehoge`など、いろいろなのを共存できそう。

## 参考にしたOpenMPI公式のQuick start

> ## Quick start
>
>In many cases, Open MPI can be built and installed by simply
>indicating the installation directory on the command line:
>
>```
>$ tar xf openmpi-<version>.tar.bz2
>$ cd openmpi-<version>
>$ ./configure --prefix=<path> |& tee config.out
>...lots of output...
>$ make -j 8 |& tee make.out
>...lots of output...
>$ make install |& tee install.out
>...lots of output...
>```
>
>Note that there are many, many configuration options to the
>`./configure` step.  Some of them may be needed for your particular
>environmnet; see below for desciptions of the options available.
>
>If your installation prefix path is not writable by a regular user,
>you may need to use sudo or su to run the `make install` step.  For
>example:
>
>```
>$ sudo make install |& tee install.out
>[sudo] password for jsquyres: <enter your password here>
>...lots of output...
Mosquitto で AWS IOT に接続した時のエラー対策

mosquitto_pub 実行時に次のようなエラーが出た時の対策です。

```text
Error: The connection was lost.
```

証明書に結びついている ポリシーの権限が不足です。

次のようなポリシーにして下さい。

```text
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:*"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
```

テストに使ったスクリプト

```bash:publish.sh
#
cafile="../certs/root-CA.crt"
certfile="../certs/iot01.cert.pem"
keyfile="../certs/iot01.private.key"
host="abcd6goq68zt4o-ats.iot.ap-northeast-1.amazonaws.com"
device="iot01"
TOPIC="sdk/test/Python"
#

mosquitto_pub --cafile $cafile \
	--cert $certfile \
	--key $keyfile \
	-h $host \
	-p 8883 -q 1 -d -t $TOPIC \
	-i $device -m "{ \"message\": \"Good Morning AM 07:50\" }"
```

```bash:subscribe.sh
#! /bin/bash
#
#   subscribe.sh
#
#                       Sep/12/2021
#
cafile="../certs/root-CA.crt"
certfile="../certs/iot01.cert.pem"
keyfile="../certs/iot01.private.key"
#
host="abcd6goq68zt4o-ats.iot.ap-northeast-1.amazonaws.com"

port=8883
device="iot01"
topic="sdk/test/Python"
qos=1
#
mosquitto_sub -d --cafile $cafile --cert $certfile \
    --key $keyfile -q $qos -h $host -p $port \
    -t $topic
```
Snowflake にファイルをアップロードする

# これは何

Snowflake でステージへのファイルの扱いのコマンドを忘れがちだったので、コピペできるようにメモを取りました。

公式ドキュメントはこのあたり
- https://docs.snowflake.com/ja/sql-reference/sql/put.html
- https://docs.snowflake.com/ja/sql-reference/sql/list.html
- https://docs.snowflake.com/ja/sql-reference/sql/remove.html

## Snowsqlを準備しましょう

```zsh
% brew install snowflake-snowsql
% snowsql -v
1.2.17

// もしここでバージョン変えたかったら、下記のようにすればよいです
% snowsql --versions
1.2.17
1.2.16
・・・
% snowsql -v 1.2.16
% snowsql -v
1.2.16
```

## アップロード(put)

```sql
-- テーブルステージにファイルを上げる
put file:///PATH_TO_FILE/hoge.csv @データベース名.スキーマ名.%テーブル名  

-- すでにあるファイルを上書きする(OVERWRITE = TRUE をつける)
put file:///PATH_TO_FILE/hoge.csv @データベース名.スキーマ名.%テーブル名 overwrite = TRUE

-- 複数ファイル一気にアップロードする
put file:///PATH_TO_FILE/* @データベース名.スキーマ名.%テーブル名

-- ユーザのステージにアップロードする
put file:///PATH_TO_FILE/hoge.csv @%~
```


## 上がってるファイルの確認(list)

```sql
-- 名前付きステージの場合
list @名前付きステージ名

-- テーブルステージの場合
list @データベース名.スキーマ名.%テーブル名
```

## 上げたファイルを消す(rm/remove)

`remove` は省略形 `rm` も使える

```sql
rm @データベース名.スキーマ名.%テーブル名
```

# まとめ

INSERT文でファイルを投入するのはとてもコスト効率が悪いので、ステージにファイルを上げてバルクロードするようにしましょうと思っているのですが、やるたびに基本的なステージでの操作をググっていたので、メモとして残しました。
WSLがUSBデバイスサポートしていなかった件について

#1.WSLがUSBデバイスサポートしていなかった件まとめ

[WSLでGUIアプリを実行する](https://qiita.com/ryoma-jp/items/bff539d8b060a0ff84cc)でWSLでGUIアプリを利用できるようになったので，USBカメラなどのUSBデバイスを接続していろいろ遊べると思っていたら，WSL2がUSBデバイスをサポートしていなかったことが判明しました．

Microsoft公式のFAQ「[WSL 2 の GPU にはアクセスできますか? ハードウェア サポートを強化する予定はありますか?](https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-faq#wsl-2---gpu---------------------------------------)」に記載がありました．
筆者が確認したのは，2021/04/07に更新された記事で，今後サポートされるかもしれません．

調査した際に，[USBシリアルはWSL上のLinuxからscreenコマンドで通信できる](https://www.yokoweb.net/2018/03/05/windows10-wsl-com-port/)らしいのと，[WSLのカーネルをカスタマイズすればUSBデバイス接続できる](http://ktkr3d.github.io/2020/07/06/USB-support-to-WSL2/)らしいことがわかりましたので，興味のある方は試してみていただければと思います．

なお，USBメモリなどのストレージに関しては，[ドライブをマウントする](https://atmarkit.itmedia.co.jp/ait/articles/1806/08/news042.html)ことは可能です．

筆者は，シリアル通信はラズパイでベアメタルプログラミングする際に使用するかもしれませんが，USBデバイス接続についてはMicrosoftが公式サポートするまで保留する予定です．

#2.関連リンク

* [WSL 2 の GPU にはアクセスできますか? ハードウェア サポートを強化する予定はありますか?](https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-faq#wsl-2---gpu---------------------------------------)
* [Windows 10 Pro上にLinuxのwebcam開発環境をDockerで構築する](https://qiita.com/yoneken/items/dcf61947ed70c17ab9b6)
* [【Linux】WindowsのWSL2でLinux GUIアプリが動くらしい](https://asarinomisosoup.com/entry/2021/04/24/030658)
* [【Windows10/WSL Ubuntu】COMポートにアクセスしシリアル通信する](https://www.yokoweb.net/2018/03/05/windows10-wsl-com-port/)
* [WSL2でUSBデバイスを認識させる](https://contentsviewer.work/Master/WSL/Tips/WSL2-USB/WSL2-USB)
* [USB support to WSL2](http://ktkr3d.github.io/2020/07/06/USB-support-to-WSL2/)
* [Windows 10の「WSL」でネットワークドライブなどをマウントする](https://atmarkit.itmedia.co.jp/ait/articles/1806/08/news042.html)
afconvertでwavファイルをApple Lossless Audio Codec (ALAC) に変換する

# これは何？

Macのコマンドラインから、フォルダ内にあるwavファイルを一気にALACに変換する方法のメモです。

# 操作方法

```sh
$ foreach i (*.wav)
foreach> afconvert -d alac $i $i:r.m4a
foreach> end
```

これで、フォルダ内にあるwavファイルが一気にALACに変換されます。

```sh
foreach>
```

はシェル側で表示されるため、入力する必要はありません。

シェルはzshを使用しております。tcshでも同じ操作です。
curl --aws-sigv4 を使用してAWS SSM ParameterStoreの値を取得する

[curl 7.75.0](https://curl.se/changes.html#7_75_0) で AWS SigV4 をサポートしていると教えてもらいました。
どうやって使うのかメモっておく。

## AWS Systems Manager Parameter Store

```shell
$ curl --aws-sigv4 "aws:amz" \
    --user "$AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY" \
    -H "X-Amz-Target: AmazonSSM.GetParameter" \
    -H "Content-Type: application/x-amz-json-1.1" \
    -d '{"Name":"/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2","WithDecryption":true}' \
    https://ssm.us-east-1.amazonaws.com/
{
  "Parameter": {
    "ARN": "arn:aws:ssm:us-east-1::parameter/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2",
    "DataType": "text",
    "LastModifiedDate": 1630616412.613,
    "Name": "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2",
    "Type": "String",
    "Value": "ami-087c17d1fe0178315",
    "Version": 51
  }
}
```
χ二乗検定



一番簡単お手軽な方法。関数に入れるndarrayは質的変数ごとや介入ごとの合計値などを持っている必要がないことに注意。

```
cross = np.array([[60,30,10], [20,40,40]])
cross

chitest = ss.chi2_contingency(cross)
print('カイ二乗値', chitest[0])
print('p値', chitest[1]) # 片側p値
print('自由度', chitest[2])
print('期待度数表', chitest[3])

カイ二乗値 39.42857142857143
p値 2.7428022661917792e-09
自由度 2
期待度数表 [[40. 35. 25.]
 [40. 35. 25.]]
```
プルリクエストでコンフリクトが発生した際の対処法

#そもそもコンフリクトとは？

直訳すると「衝突」という意味。

ファイル上で「自分の作業」と「他人の作業」が重複してしまった状態のことを指す。
　


#発生原因

「同一ファイル」の「同一箇所」を複数人が編集した状態でマージした時に発生する。

また、ローカルブランチをpushした後にmasterブランチに変更を加えてしまうことでも発生する。
　


#`git pull –rebase` を使った対処法

###＜手順＞

1, masterブランチを最新にして、作業ブランチをチェックアウト

```bash
$ git checkout master
$ git fetch origin
$ git pull origin master
$ git checkout [作業ブランチ]
```

2, 作業ブランチに対してmasterブランチをrebaseする

```bash
$ git pull --rebase origin master
```

3, コンフリクトがあれば直す

```bash
error: Failed to merge in the changes.
#このようなエラーが発生したらコンフリクトなので対象ファイルを修正
```

```ruby
#対象のファイルを開くと、コンフリクト起こした部分は以下のように表示される

<<<<<<< HEAD
[作業ブランチでの変更内容]
...
=======
[マージしたブランチでの変更内容]
...
>>>>>>> develop
```

コンフリクトが発生しなくなるまで上記手順を繰り返す。

  　

#`git pull origin master`実行時にコンフリクトした時の対処法

###＜原因＞

ローカルブランチをpushした後にmasterブランチに変更を加えてしまうことで、origin/master(リモートリポジトリ)とmaster(ローカルリポジトリ)の状態に差異が生じてしまっていること。

###＜対処法＞

現在のブランチの状態を「強制的に」他のブランチの状態に合わせるときの方法として、`git reset --hard` を利用する。

```bash
$ git reset --hard origin/master  # 現在のブランチの状態をorigin/masterに合わせる
```

⚠️ `git reset --hard`を実行すると手元にある作業ツリーとインデックスの変更内容は、すべてふっとんで消えてなくなるので、バックアップを取るなどして実行前は注意する必要がある。
59日後にITパスポートを受けるFラン私大文系既卒(45日目)

# 階層データモデル
* 階層データモデルとは?
 * データ同士の関係を木構造で表す
 * 親となるデータを一つだけ持つことができる

# ネットワークデータモデル
* ネットワークデータモデルとは?
 * データ同士の関係を網の目ように繋がった状態で表す
 * 親となるデータを複数持つことができる

# CPRM(Content Protection for Recordable Media)
* CPRMとは?
 * 一回だけ炉多くができる機能

# プロポーショナルフォント
* プロポーショナルフォントとは?
 * 文字ごとに適切な幅が設定されたフォント
Blazor WebAssembly 部品コンポーネントへ渡した変数とのバインド

#はじめに
この記事は部品コンポーネントへ変数を渡し、部品コンポーネントの中で渡された変数が変更された際、渡し元の変数も自動的に変更させる事を実現するまでの記事です。

#準備
以下のように、ボタンを押したら渡された変数の文字列が変更されるだけの部品コンポーネントを作りました。

部品コンポーネント

```
<h3>Component1</h3>

<p>部品コンポーネント内の値 : @Test1</p>
<button @onclick="ButtonOnClick">クリック</button>

@code {
    [Parameter]
    public string Test1 { get; set; }

    private void ButtonOnClick()
    {
        Test1 = "ボタンが押されました。";
    }
}
```

呼び出し元

```
@page "/test"

<p>呼び出し元の値 : @Test1</p>
<Component1 Test1=@Test1/>

@code {
    private string Test1 { get; set; } = "ボタン押される前の文字列";
}
```
動き
ボタンを押しても呼び出し元の変数の値は変わっていない
![4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110251/184b0aab-1112-a734-24e9-aeb857d90f4d.gif)

#呼び出し元の変数の値の変更方法
部品コンポーネント側で、バインドしたい変数の`EventCallback`を追加する。この時の変数名の名前は`〇〇〇Changed`とする必要がある。（今回は`Test1`の変数をバインドしたいため`Test1Changed`としている。）

`Test1`の値が変更されるタイミングで`Test1Changed`を実行する事で、呼び出し元の変数も自動で変わってくれる。

また、呼び出し元もバインドしたい変数に`@bind-`をつける必要がある。

部品コンポーネント

```
<h3>Component1</h3>

<p>部品コンポーネント内の値 : @Test1</p>
<button @onclick="ButtonOnClickAsync">クリック</button>

@code {
    [Parameter]
    public string Test1 { get; set; }
    [Parameter]
    public EventCallback<string> Test1Changed { get; set; }

    private async Task ButtonOnClickAsync()
    {
        Test1 = "ボタンが押されました。";
        await Test1Changed.InvokeAsync(Test1);
    }
}   
```
呼び出し元

```
@page "/test"

<p>呼び出し元の値 : @Test1</p>
<Component1 @bind-Test1=@Test1>
</Component1>

@code {
    private string Test1 { get; set; } = "ボタン押される前の文字列";
}
```

動き
渡し元の変数も変わっている。
![5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110251/351ddb46-2fd2-f4a4-1777-d6185e9803aa.gif)

<br>
[Blazor関連のリンク]
[Blazor WebAssembly プロジェクト作成(認証あり)](https://qiita.com/pero_88/items/be142d5d0ba92e5c91d0)
[Blazor WebAssembly 初期プロジェクト構成の入門](https://qiita.com/pero_88/items/ced1028ad536a43fec1d)
[Blazor WebAssembly Postgresを使うまで](https://qiita.com/pero_88/items/23e88a1d2bc3659b9946)
[Blazor WebAssembly コードビハインド](https://qiita.com/pero_88/items/be871f4ac63868f048f0)
[Blazor WebAssembly InputSelectの使い方](https://qiita.com/pero_88/items/3eddcd1aedf8bbc8441b)
[Blazor WebAssembly 部品コンポーネントへ渡した変数とのバインド](https://qiita.com/pero_88/items/f5d70b41337ca6d08dd1)
[Asp.net core Identity 翻訳開始まで](https://qiita.com/pero_88/items/44a66b7ac217f674a7f3)
[Blazor WebAssembly 使いまわしが利く部品(表)を作る。](https://qiita.com/pero_88/items/5e1e3f68d50d941ee36a)
【2021版】Google Maps APIの取得方法

#はじめに
Googleマップを実装したい場面は多々ありますよね。
そのためには、まず　APIを取得する必要があります。
その手順について見ていきましょう。

#Google Maps APIの取得方法
1) [Google Cloud Platform](https://console.cloud.google.com)にアクセスします。
2) ヘッダーの左側にある「プロジェクトを選択」をクリックします（以前作成して選択していたプロジェクト名が表示されている場合もあります）。
3) ダイアログの右上の「新しいプロジェクト」をクリックします。
4) プロジェクト名を記入し、「作成」ボタンをクリックします。
5) 2)でクリックした箇所をクリックし、作成したプロジェクト名をクリックした上で、右下の「開く」をクリックします。
6) APIとサービスという画面が開かれていると思うので、「＋APIとサービスの有効化」をクリックします。
7) APIライブラリのページに遷移するので、マップという項目の「すべて表示」をクリックします。
8) 一覧が表示されるので、「Maps JavaScript API」をクリックし、ページ遷移後、「有効にする」ボタンをクリックします。
9) APIページに戻るので、左側の「認証情報」をクリックし、ページ遷移後、上部の「＋認証情報を作成」をクリックします。
10) ダイアログが表示され、「自分のAPIキー」が表示されるので、それをコピーしてクリップボードなどに貼り付けて保存しておきます。
11) ダイアログ右下の「キーを制限」をクリックします。
12) 「API キーの制限と名前変更」というページが開かれるので、「アプリケーションの制限」という項目の「なし」を「HTTPリファラー（ウェブサイト）」に変更します。すると、その下に「ウェブサイトの制限」という項目が出てくるので、「項目を追加」をクリックし、「リファラー」と書いているところをクリックし、マップを利用するサイトのURLを入力します（＊を含めたURL（例:http://＊.example.com/＊））。また、「APIの制限」項目の「キーを制限しない」を「キーを制限」に変更し、「Select API」と書かれているプルダウンをクリックし、表示された一覧の中から「Maps JavaScript API」にチェックを入れて、右下の「OK」をクリックします。以上の入力が終わったら、下部の「保存」ボタンをクリックします。

#おわりに
以上で、Google Maps APIを取得することができました。
このほかにも、支払い設定が未了の方はそちらも行う必要があります（毎月200ドル分は無料）し、実際にコーディングを行う必要もありますが、今回はAPIの取得にポイントをしぼって説明しました。
お店のHPなどにはマストな機能だと思うので、参考になれば幸いです。
Laravelでマイグレーションを使ってテーブルにカラムを追加する

#はじめに#
　phpmyadminを使えばカラムを追加するのは簡単ですが、Laravelにはマイグレーションファイルがあります。マイグレーションファイルを使ったカラムの追加方法を備忘録として残していきます。


#追加手順#
　まずは新たにマイグレーションファイルを作成します。今回はitemsテーブルにimageカラムを追加するという想定でいきましょう。

```
 php artisan make:migration add_image_to_items_table --table=items
```

ターミナルでこのように打ちこむと、新しくマイグレーションファイルが生成されます。
public function up()にカラムの追加の記述を入れましょう。downの方には削除の記述をしておきます。

```xxxx_add_image_to_items_table.php
class AddImageToItemsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('items', function (Blueprint $table) {
            //
            $table->string('image');  //カラム追加
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('items', function (Blueprint $table) {
            //
            $table->dropColumn('image');  //カラムの削除
        });
    }
}
```

マイグレーションファイルの編集が終わったら実行しましょう。

```
 php artisan migrate
```

無事にitemsテーブルにimageカラムを追加することが出来ました！