OmniAICreator/Qiita-1.07M huggingface dataset:
複数列の条件で値を割り当てる(SPSS Modeler データ加工逆引き3-21)

## 複数列の条件で値を割り当てる

![スクリーンショット 2022-11-07 13.58.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/074afce4-6d6b-685a-e3d4-8654ecb38939.png)

## 1.想定される利用目的

・ 顧客行動予測のための目的変数作成
・ 設備故障や異常検知のための目的変数作成

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/if_then.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-11-07 14.44.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b9ba4901-85be-822d-4762-73f3d96ac022.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2022-11-07 14.46.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b8b19117-a970-4a51-b166-d3e038254da0.png)

b.[フィールド作成]ノードを編集します。
![スクリーンショット 2022-11-07 14.47.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/709ece87-9a92-c47b-bca8-c15a0669f79b.png)

式ビルダーを利用すると便利に入力できます。[論理]でリストからif then else elseif を選択します。
![スクリーンショット 2022-11-07 14.48.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ba1c92de-0751-ac8b-c87a-4702eabe5f80.png)

[プレビュー]します。完成しました。
![スクリーンショット 2022-11-07 14.48.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/09ba426c-3a55-d918-5da6-46a518694196.png)

[データ表示]で散布図を利用して分類の状態を確かめます。
![スクリーンショット 2022-11-03 12.05.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/44c738f5-53f0-c9e2-3930-5c55d517c7d8.png)

#### 注意点

抜け漏れなく割り当てられているか注意します。今回はどれにも該当しないと欠損値[undef]にするといった工夫をしています。

## 4.参考情報

#### if-thenを派生モードで扱った記事

https://qiita.com/416nishimaki/items/bfcfd38557e7bc5982b5

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
読み易いソースコードが書ける人

プログラマーに良く言ってました。

《本を読みましょう！》

本に書いてある事によって、得られる物は、沢山あるので、

僕も月に３～４冊くらいは、本を読みます。
※少ないですね。。

時には、読むのに、すっごくストレスが掛かる本もあれば、

買って、その日に一気に読んでしまう事できる本もあります。
（もちろん、書いてある内容にもよりますが）

《読み易い本》

ソースコードもこれと同じで、

・読み易いソースコード
・読み難いソースコード

日本語で、相手にわかり易い文章が書けてこそ、読み易いソースコードが書けるってもんです。

Java,PHP,C,VB...全て言語、コンピュータに対して命令する言語です。

その言語の記録がソースコードです。

綺麗なソースコードは、分かり易いだけでなく、読む気にもさせてくれます。

１．本を沢山読む
２．わかり易いドキュメントを沢山書く
３．人のソースコードを読む
　良い本を読んでるのと同じです。

→ソースコードが綺麗に書ける様になります！

※本は、雑誌系は、イラスト等が多いので、普通の書籍の方が良いと思います
Google Cloud Runを使ってみる


Cloud Runを使ってみます。

## 全体の流れ

おおよその流れは以下の通り。

* ローカルでイメージをビルド
* GCP(artifact registry)にイメージをpush
* Cloud Runで実行

## 前提

* mac
* dockder, gcloudインストール済み
* Google Cloudにプロジェクト(hoge-dev-test)作成済み

## 準備

### ログイン

まずはGoogle Cloudにログイン。

```bash
gcloud auth login
```

### 資格証明ヘルパー？の登録（不要かも）

gcloudとdockerが連携できるよう認証（登録）する。

```bash
gcloud auth configure-docker asia-northeast1-docker.pkg.dev
```

>上記のコマンドを実行すると/User/hoge/.docker/config.jsonに、credHelpersとして登録される。

### artifact registryの作成

以前はImageのpush先としてはContainer Resistryが一般的だったけど、今はArtifact Registryが登場してそっちが推奨となってるみたいなのでそちらを利用してみます。

```bash
gcloud artifacts repositories create hogerepo --location=asia-northeast1 --repository-format=docker
```

>Artifact Registryにはイメージのチェックとかの機能もあるみたい。
>久しぶりに上記を実行したらバーミションエラー。Artifact Registry管理者権限を追加したらOKでした。。。。


>上記作業はGoogle CloudのコンソールからGUIで行うことも可能です。

## ローカルでイメージをビルド

普通にnginxのイメージのまんまでもいいのですが、簡単にカスタムビルドしてみます。



### 作業場の作成

```bash
cd 
mkdir cloudrun-test
cd cloudrun-test

touch Dockerfile default.conf index.html
```

### Dockerfile

```bash
FROM nginx
COPY ./default.conf /etc/nginx/conf.d/
COPY ./index.html /var/www/html/
```

### default.conf

```json:default.conf
server {
    listen 80;
    charset UTF-8;

    location / {
        root /var/www/html;
        index index.html;
    }
}
```

### index.html

```html:index.html
Hello Cloud Run!
```

### イメージをビルドとテスト（ローカル）

```bash
docker build -t my_ngnix:v1 .
```

```bash
docker run --rm --name my_www -p 8888:80 -d my_nginx:v1
```


## Cloud Run用のイメージのビルドとpush


### build

```bash
docker build -t asia-northeast1-docker.pkg.dev/hoge-dev-test/hogerepo/my_ngnix:v1 .
```

### push

```bash
docker push asia-northeast1-docker.pkg.dev/hoge-dev-test/hogerepo/my_ngnix:v1
```

## Cloud Runの設定と実行

ここからは基本GUI。

### サービスの生成

Cloud Runのページにアクセスし、「サービスの作成」をクリック。

![Kobito.biWPoq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/a3266ff7-23e6-b43c-18d5-4c350dff9c42.png "Kobito.biWPoq.png")

### イメージの選択

コンテナイメージのURLの選択を押し、先程pushしたイメージを選択。

![Kobito.irNbrt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/0b37b408-6e09-f0da-23e4-f73f18f1563d.png "Kobito.irNbrt.png")

### 必要な設定を行う

#### 認証の有無

未認証の呼び出しを許可を選択。

![Kobito.WUN2c5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/9d2b1462-b6ce-079a-6a7e-b5abf55423a7.png "Kobito.WUN2c5.png")


#### ポートの設定

nginxのリッスンポートとして指定したポート番号を設定。

![Kobito.y2D0fh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/a2562c61-fd1b-893a-dd43-9de87a75c39f.png "Kobito.y2D0fh.png")


### 作成（デプロイ）

作成をクリックすると10秒くらいでデプロイが完了します。

![Kobito.4k66nT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/09dd7ec1-0777-94ae-5f53-af1aaef3c7b0.png "Kobito.4k66nT.png")

### 動作確認

URLにアクセス。

![Kobito.zG4c8a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/71a50b95-0494-ca3f-fb61-9eca28aee38c.png "Kobito.zG4c8a.png")


## メモ

* http/https, gRPC以外でのアクセス（例えばDBとか）は無理っぽい。。。
Ubuntu22でGo Fyneを使ってAndroidアプリを作ってみた

## はじめに
Go言語でGUIを作ることができるfyneなのですが、モバイルアプリを作ることができるというので、実際にfyneでAndroidアプリが作ることができるか試してみました。

## 前提条件
OS　Ubuntu22.04
Go　go1.19 linux/amd64
Go言語とfyneのインストールはしてある前提で話を進めます。

Go言語のインストールとfyneのインストールは、[Fyne Develop Getting Started](https://developer.fyne.io/started)、または、@hibikingさんのこちらの記事[GO言語のGUIライブラリ「Fyne」のインストール方法](https://qiita.com/hibiking/items/58a3e93e67394fa1bb4f)を参考にしてください

## 参考にした記事（Youtubeの動画）
実際にAPKファイルを作る方法は、こちら[Golang Fyne: How to compile *apk for Android | Golang Fyne tutorial](https://www.youtube.com/watch?v=4S-AQlV1pcw&list=WL&index=48)で解説されていたので、これをもとに説明します。

# 準備

## アンドロイド関連のインストール
１　アップデートする
　　``` sudo apt update ```
２　openJDKのインストール
　　``` sudo apt install openjdk-17-jdk ```
３　android-sdkのインストール
　　``` sudo apt install android-sdk ```
４　android−NDKのダウンロード
　　GitHubのAndroid/ndkの[Unsupported Downloads](https://github.com/android/ndk/wiki/Unsupported-Downloads)からzipファイルをダウンロードする。
５　ndkファイルの展開と環境変数の追加
　　ダウンロードしたzipファイルをホームディレクトリに展開する。
　　.bashrcに次の環境変数の追加
　　``` export ANDROID_NDK_HOME=（展開したディレクトリ名）```

## fyneコマンドのインストール
１　fyneコマンドのインストール
　　``` go install fyne.io/fyne/v2/cmd/fyne@latest ```
2　~/go/binへパスを通す 

## コンパイル
１　作業するディレクトリを作る
２　ソースコードを準備する
　　https://developer.fyne.io/started/hello からサンプルのコードをコピーして、先程作ったディレクトリ内にmain.go　　の名前で保存する。
３　次のコマンドを実行
　　※作成されるapkファイルはinitで指定した名前（．は＿に変換）になります。
~~~
    go mod init com.hoge.fuga
    go mod tidy
~~~
4　アイコンファイルを準備する。
　　inkscapeなどで48px✕48pxのアイコンを作り「Icon.png」の名前で先程のディレクトリ内に保存する。
５　コンパイル
　　次のコマンドを実行する。
　　※appIDは作成されるapkファイルの名前には影響しません。
　　``` fyne package -os android -appID com.hoge.fuga ```

## 最後に
以上でfyneでandroidアプリを作ることができます。実際に動くか確認するためには、エミュレーターなどを利用して確認してみてください。
※　私はANBOXを使って確認しました。

ここまで読んでいただいて誠に感謝しております。私も試行錯誤をして２〜３日かかって確認したので間違っていることがあるかもれませんが、実際にGo＋Fyneでanndroidアプリを作ることができました。もしよかったら参考にしていただけると幸いです。

ではでは
paiza.ioでelixir その56

# 概要
paiza.ioでelixirやってみた。
Regex.named_captures使ってみた。

# サンプルコード

```
Regex.named_captures(~r/A(?<hoge>.+)C/, "A0bCA1bCA2bCA3bCA4bC")
|> IO.inspect

string = "Here is my phone number: 999-111-1234"
regex = ~r/number: (?<phone>[\d|-]+)/
Regex.named_captures(regex, string)
|> IO.inspect

regex = ~r"\[tag1\](.+?)\[\/tag1\]"
Regex.run(regex, "[tag1]bar[/tag1]")
|> IO.inspect
Regex.scan(regex, "[tag1]bar[/tag1] [tag1]baz[/tag1]")
|> IO.inspect

Regex.named_captures(~r/A(?<hoge>.*)C/, "A0bCA1bCA2bCA3bCA4bC")
|> IO.inspect

Regex.named_captures(~r/(?<name>\w)/, "ab")                    
Regex.scan(~r/\w/, "ab") 
|> Enum.map(fn x -> 
    %{name: hd(x)} 
end) 
|> IO.inspect

Regex.scan(~r/\w/, "ab") 
|> List.flatten
|> IO.inspect

Regex.named_captures(~r{(?<protocol>http://|https://)(?<domain>.*)}, "https://qiita.com")
|> IO.inspect

Regex.named_captures(~r[Guard #(?<guard_id>\d+) begins shift], "[1518-11-01 00:00] Guard #10 begins shift")
|> IO.inspect
			
Regex.named_captures(~r/(?<minus>-?)(?<digit>[[:digit:]]*)(?<frac>\.?[[:digit:]]*)(?<exp>[eE]?[-+]?[[:digit:]]*)(?<rest>.*)/s, "12345")
|> IO.inspect
Regex.named_captures(~r/(?<minus>-?)(?<digit>[[:digit:]]*)(?<frac>\.?[[:digit:]]*)(?<exp>[eE]?[-+]?[[:digit:]]*)(?<rest>.*)/s, "12:45")
|> IO.inspect
Regex.named_captures(~r/(?<minus>-?)(?<digit>[[:digit:]]*)(?<frac>\.?[[:digit:]]*)(?<exp>[eE]?[-+]?[[:digit:]]*)(?<rest>.*)/s, "12.45")
|> IO.inspect
Regex.named_captures(~r/(?<minus>-?)(?<digit>[[:digit:]]*)(?<frac>\.?[[:digit:]]*)(?<exp>[eE]?[-+]?[[:digit:]]*)(?<rest>.*)/s, "1.2e+4")
|> IO.inspect

   
   
```

# 実行結果

```
%{"hoge" => "0bCA1bCA2bCA3bCA4b"}
%{"phone" => "999-111-1234"}
["[tag1]bar[/tag1]", "bar"]
[["[tag1]bar[/tag1]", "bar"], ["[tag1]baz[/tag1]", "baz"]]
%{"hoge" => "0bCA1bCA2bCA3bCA4b"}
[%{name: "a"}, %{name: "b"}]
["a", "b"]
%{"domain" => "qiita.com", "protocol" => "https://"}
%{"guard_id" => "10"}
%{"digit" => "12345", "exp" => "", "frac" => "", "minus" => "", "rest" => ""}
%{"digit" => "12", "exp" => "", "frac" => "", "minus" => "", "rest" => ":45"}
%{"digit" => "12", "exp" => "", "frac" => ".45", "minus" => "", "rest" => ""}
%{"digit" => "1", "exp" => "e+4", "frac" => ".2", "minus" => "", "rest" => ""}
```

# 成果物


https://paiza.io/projects/r6IIXJaLYtjxsU7lkVFNCQ?language=elixir


以上。
php 開発環境構築



```
-------apache24 インストール
https://mebee.info/2020/04/17/post-9589/
ダウンロード＞解凍だけ
httpd -v

path追加
windows start >右クリック＞設定＞システム＞詳細情報＞
システムの詳細設定＞環境変数＞システム環境変数＞
path＞編集＞新規

-------php8.32 インストール
https://webkaru.net/php/windows-php-instal/
ダウンロード＞解凍だけ
php -v

------php.ini 編集
extension_dir = "ext"
display_errors = On
extension=intl
extension=mbstring
extension=openssl
extension=pdo_mysql
extension=pdo_odbc
extension=pdo_pgsql
extension=pdo_sqlite

-----httpd.conf 編集
Define SRVROOT "e:/dev/Apache24"

ブラウザ表示のurl
ServerName localhost:80

Apache バックグラウンド起動
httpd -k install
windows service 追加

ブラウザ
http://localhost/
It works!

php 動作するため設定
LoadModule php_module "e:/dev/php/php8apache2_4.dll"
PHPIniDir "e:/dev/php"
AddType application/x-httpd-php .php .htm .html

test.php
<?php
phpinfo()
?>

Apache24 再起動
localhost:80/test.php

Apache自動起動設定
サービス＞Apache24＞プロパティ＞スタートアップの種類＞自動

Mysqlインストール
ダウンロードした
mysql-installer-community-5.6.21.1.msi
全て次へ
Product Configuration  Cancel で完了
Mysql Command Line Client 起動

------Composerのインストール
https://getcomposer.org/
ダウンロードした下記ファイルをローカルに実行
Composer-Setup.exe 実行
devlope mode チェック
proxy 出た場合、チェック

確認
新しくコマンドプロンプトを立ち上げて、必須！！！
composer -V   注意 V  大文字
path追加不要、自動追加されたようです。

------vscode インストール
https://code.visualstudio.com/
「Download For Windows」を押下します
VSCodeUserSetup-x64-1.85.2.exe
上記ダウンロードしたファイルをローカルに実行します

日本語化にする
左側＞白い□＞japan入力＞右側でインストール
インストール
右下のChange Language and Restart クリック　必須です

左側＞白い□＞php入力＞右側でインストール
php拡張機能インストール
php debug
php extension pack
php intellisense





laravel インストール



A5 インストール
コミュニティベースgTLD とは？他のカテゴリも見てみる

## 勉強前イメージ

コミュニティベースとは・・・

## 調査

### コミュニティベースgTLD とは

新gTLDのカテゴリの一つで特定のコミュニティにおいて利用されることを前提とするgTLDのことを指します。
新gTLDでは2012年からは以下のような新しい分類のgTLDが出来ています。

- コミュニティベースTLD
	- コミュニティにおいて利用される
- 地理的名称TLD
	- 地域名に基づき利用される
- ブランドTLD
	- サービス名をラベルとして利用される

2012年では上記ですが、他にも2000年から追加されたカテゴリや2005年から追加されたものもあります。
ASCII文字だけじゃなくて多国文字(様々な言語の文字で表記されるドメイン名)でも申請は可能です。

## 勉強後イメージ

日本語ドメインもあるしねーこれが多国文字

## 参考

- [gTLDとは](https://www.nic.ad.jp/ja/basics/terms/gtld.html)
- [gTLD（分野別トップレベルドメイン）](https://jprs.jp/glossary/index.php?ID=0024)
最遅の日を締め切りにしない

複雑な要素や関係性は抜きに、たとえば**2月1日にリリースしたい**ものがあるとします。

この場合、ぜったいに開発が終わってないといけない日は1月31日です。正確には1月31日の29時ぐらいでしょう。

ちゃんとやれば、いつもと同じように進むなら、1月31日までには確実に終わりそうな規模感であることは、なんとなくみんな承知しています（適当な前提ですみません）。

## 1月31日が締め切り？

このとき、開発メンバーに「1月31日までに開発を完了してほしい」と伝えるのはどうでしょうか。

筆者はこのような伝え方をすると、次のようなトラブルに見舞われる可能性が高いと感じています。

- **開発が本当に1月31日ちょうどに完了する**
  - 前日・前々日はとても慌ただしく、品質も不安
- 開発に遅延が起きていることを、締切直前になって知る
  - 「昨日までは1月31日までに終わりそうだったが、実は今日〜が発生して終わらないことがわかった」みたいなことになる

とくにひとつめの事態は、**パーキンソンの法則**として知られています。

> 第1法則
> 仕事の量は、完成のために与えられた時間をすべて満たすまで膨張する[^1]

次の言い換えも引用させてください。

> パーキンソンが言わんとしているのは、私たちは作業完了までの期間が決まっていると、許される限りの時間をすべて使ってしまう、ということだ。[^2]

## 最遅の日＝締め切りではない

ここで押さえておきたいことは、**締め切りを「それが完成/完了していないとトラブルが起きる日＝最遅の日」にしてはいけない**ということです。

「トラブルが起きる日」を締め切りにした場合、その計画の半分がギリギリでトラブルを回避でき、もう半分はトラブルを引き当てます。

締め切りを考えるとき、もっとも簡単に浮かぶ日付はたしかに「最遅の日」ですが、何も考えずに最遅の日をただ相手に伝えることは避けるべきだと感じます。

## 締め切りはいつに設定するべきか

アンチパターンは説明できても、ベストプラクティスはなかなか難しいのが本件の苦しいところです。

筆者は、許されるなら、こちらが**相手の支援や開発の遅延を意思決定できる最遅の日**にすべきだと考えています。

たとえば、次のような理由から1月24日を締め切りにするのはどうでしょうか。

- 2月1日に遅れるのであれば、1週間前の1月24日までに先方へ伝えたい
- 予定通り進まない場合、他の業務を調整してでもこの開発を進めたい。そのようにして本気を出す期間を1週間ほど確保したいから、1月24日を締め切りにする

このように、なにかアクションを起こせる日付をベースにできると、多少のトラブルにもある程度余裕を持って対応できることが多いように感じます。

## 締め切りを考える過程も共有できるとベター

もうひとつ自分の考えを書くと、このような「締め切りを考える工程」そのものを相手と共有すべきだと感じることも多いです。

2月1日までにリリースしたい、直前の遅延は判断できない、リソースの調整も検討するぐらいには重要な作業である......そのほか色々な情報や計画、感情を共有し、そのうえで締め切りをいっしょに決定する。

これができると、合理的な締切が決められるだけでなく、途中の進捗確認もやりやすくなりますし、各自のモチベーションの向上にも繋がる気もしています。

相手を縛るための締め切りではなく、自由に安心して集中できるための締め切りになるようなイメージです。

## 最後に

とても純粋な開発を例に挙げましたが、この考え方はとくに「チーム間の依頼」で強く意識すべきだと感じることが多いです。

ぶっきらぼうに相手のチームに最遅の日を伝えるのではなく、たとえば上述したような工夫をすることで、お互いに気持ちよく仕事ができる可能性が上がるはずです。

ベストプラクティスは場面によると思うので、「〜の場合はこう考えて締め切りを決めている」などあれば是非コメントで教えてください！

## こんな記事も書いています

### [アジャイルはコミットしなくていいから楽？](https://qiita.com/kobori_akira/items/6ee2bf6ec5dbd2b0fc3c)

締め切り≒コミットだとすると、アジャイル開発には締め切りは存在しないのでしょうか。むしろ締め切りを日々更新し続けるのがアジャイルかもな、と感じた記事です

### [だれかの進捗をうまく把握できないときのフレーズ集](https://qiita.com/kobori_akira/items/9ab3e81bbf0d1c00e49f)

締め切り≒目標が設定されたうえで、その目標が達成できそうかを判断することも難しい作業です。そのとき使っているフレーズをまとめてみました

### [期待値には「幅」をもたせる](https://qiita.com/kobori_akira/items/13c0375d5c70a554dbf1)

似たような話題として、期待値の設定方法を考えてみました。

[^1]: [パーキンソンの法則 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%BC%E3%82%AD%E3%83%B3%E3%82%BD%E3%83%B3%E3%81%AE%E6%B3%95%E5%89%87)

[^2]: Mike Cohn『アジャイルな見積りと計画づくり ～価値あるソフトウェアを育てる概念と技法～』、p43。
【TypeScript】変数宣言

# はじめに
`TypeScript`を学んだことのメモです

# 変数宣言
TavaScriptの変数宣言には、`let`と`const`と`var`がある

## `let`

* `let`の特徴
    * 再代入可能
    * 初期値なしで宣言可能

```typescript
let x = 1;
x = 2; // 再代入

let y; // 初期値なし
y = 1;
```

## `const`
* `const`の特徴
    * 再代入禁止
    * 初期値必須
```typescript
const z = 1;
```

## `let`と`const`の使い分け

* 基本的に`const`を使う
* `let`は必要なときだけ

## `var`
* `var`の特徴
    * 再代入可能
    * 同名の変数宣言可能（エラーにならない）
    * 初期値なしで宣言可能
```typescript
var name = "taro";
var name = "jiro"; // 同名の変数宣言可能
```
* `var`の問題点
`var`を使用する場合、以下の点に考慮しなければいけない
    * 同名の変数宣言
    * グローバル変数の上書き
    * 変数の巻き上げ
    * スコープ
    
問題点の詳細はこちら👇

https://typescriptbook.jp/reference/values-types-variables/vars-problems#var%E3%81%AE%E5%95%8F%E9%A1%8C%E7%82%B9

## 型推論
`TypeScript`には`型推論`というコンパイラが**型を自動で判別する機能**がある
```typescript
let x = 1; // let x: number = 1;と同じ意味になる
```

# 参考
https://typescriptbook.jp/
flow概要(javascriptの静的チェッカー)

flowについて学習する必要があったのでメモ

## flowとは
Facebook(現meta)が初めて発表したJavaScript用の静的型チェッカー。

## インストール
```
npm install --save-dev flow-bin
```
プロジェクトファイルにflowを加える
```package.json
"scripts": {
  "flow": "Flow"
}
```

## セットアップ
プロジェクトフォルダのルートに、.flowconfigという名前のコンフィグファイルを作成する
```
npm run flow init
```
以下のコマンドでプロジェクト全体のコードをチェックできる
```
npm run flow check
```

Flowの型チェックはオプトイン。
Flowでチェックしたいjavascriptのファイルの先頭に@flowコメントを加える

```
@flow
```

## 型推論
型チェックは2つの方法を使う

- アノテーションを使う方法
予測する型をコードの一部として指定し、型チェッカーがその予測に基づいてコードを評価する
- コード推論による方法
ツールが、変数が使われている文脈から方を賢く推論し、推論に基づいてコードをチェックする

型推論の例
```example.js
/*@flow*/

function foo(string) {
  return string.split(",");
}

foo(1)
```

このコードは、foo関数が文字列を引数とするのに、数字を引数として渡しているのでエラーとなる

## null許容型

Flowはnullを無視しないため、別の正当な型の代わりにnullが渡されて、アプリケーションをクラッシュさせるエラーを防ぐ

```null_not_complie_example.js
/*@flow*/

function lengthCheck(string) {
  return string.length();
}

let length = lengthCheck(null);
```

上の例はFlowはエラーを表示する。解決するには以下のようにしないといけない
```null_complie_example.js
/*@flow*/

function lengthCheck(string) {
  if (string === null) {
    return 0;
  }
  return string.length();
}

let length = lengthCheck(null);
```

## 型アノテーション
望ましい動作を規定するのに型アノテーションが使える。型アノテーションは、関数パラメーター、戻り値、変数に使える

### 関数
```annotation_function_test.js
/*@flow*/
function addExample(x: number, y: number) : number {
  return x + y;
}
```
### 配列
```annotation_array_test.js
/*@flow*/
let foo: Array<number> = [1,2,3];
```

### クラス
```annotation_class_test.js
/*@flow*/
class Bar {
  x: string;
  y: string;
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
}
```

### オブジェクト
```annotation_object_test.js
/*@flow*/
let object: {a: string, b: number, c: Array<String>, d: Bar} = {
  a: "hello",
  b: 20,
  c: ["morning", "afternoon", "night"],
  d: new Bar("foo", "bar")
}
```

### Null
Tの代わりに、?Tと書くことで、どのTにもnull/undefinedを組み込むことができる
```annotation_null_test.js
/*@flow*/
let null_test: ?string = null;
```
上の場合、null_testはnullまたは文字列になる

## ライブラリを使う場合
サードパーティのライブラリを使う場合
- ライブラリ定義(libdef)を使う
- flow-typedを使う
- 自分のlibdefを作る

## 型アノテーションを取り除く
型アノテーションは、JavaScriptの文法ではないので、ブラウザで実行する前に取り除く必要があるので、ビルドツールを使って除く必要がある
JavaScript「〜を含む」メソッドの使い分け


今回はJavaScript「〜を含む」メソッドの使い分けについてまとめたいと思います。

## ■メソッドの種類と使い分け
| メソッド | 検索ワード                       | 戻り値  | 
| -------- | -------------------------------- | ------- | 
| includes | 通常の文字                       | boolean | 
| indexOf  | 通常の文字                       | 文字列、出現位置  | 
| test     | 正規表現                         | boolean | 
| match    | 正規表現                         | 文字列、出現位置   | 
| search   | 通常の文字 or 正規表現どちらでも | 文字列、出現位置   | 


:::note info
基本的にbooleanだけを返すメソッドの方が軽いと思われる。
そのためマッチパターンや出現位置を知る必要がなければ、booleanの方を選択すれば良い
:::


## ■正規表現を使うメリット

> 一撃で複雑な文字列パターンの指示を送ることができます。

ユーザーからの入力等、いくつかのパターンを許可したい場合は正規表現を使う。
単純にコードの中で「この値が含まれているか？」だけであれば、通常の文字列での比較で良い。

```js:単純な比較例
const lang = "ja"

if(lang.includes("ja")) {
 console.log("こんにちは")
} else {
 console.log("Hello")
};
```


## ■どこまで見るか？
正規表現で`g`をつけると、一致するものを全て見てくれる。

```js
const sampleText = "あいうえお　あいうえお　あいうえお"

const matchText = mystr.match(/あ/);
const allMatchText = mystr.match(/あ/g);

//最初にマッチしたものだけ抽出
console.log(matchText); //["あ"]

//マッチしたもの全て抽出
console.log(allMatchText); //["あ","あ","あ"]
```


## ■参考資料

https://codechacha.com/ja/javascript-check-if-includes-string/

https://www.teijitaisya.com/regex/

http://shain.blog.conextivo.com/2007/04/javascript_matchsearchtestexec.html

https://www.sejuku.net/blog/21049
Flutterアプリのversionを更新するためのスクリプト

# 概要
Flutterで作ったアプリのバージョンは`pubspec.yaml`の中で定義しているため、CIなどで自動更新するにはスクリプトなどを書く必要がある。
覚書程度に残しておく。

https://dart.dev/tools/pub/pubspec#supported-fields

# スクリプト

```
# Versionの更新
perl -i -pe 's/^(version:)(\s+\d+\.\d+\.)(\d+)(\+)(\d+)$/$1.$2.($3+1).$4.$5/e' pubspec.yaml
```

自分はGithub Actionsで実行している。
具体の実装は下記。
```
- name: update app version
  run: |
    # Versionの更新
    perl -i -pe 's/^(version:)(\s+\d+\.\d+\.)(\d+)(\+)(\d+)$/$1.$2.($3+1).$4.$5/e' pubspec.yaml

    # 別のstepで更新されたVerisonを利用するための後処理
    VAR=`perl -ne 'print if /^(version:)(\s+\d+\.\d+\.)(\d+)(\+)(\d+)$/' pubspec.yaml`
    VAR_APP_VERSION=`echo $VAR | grep -o -E "([0-9]+\.){1}[0-9]+(\.[0-9]+)?" | head -n1`
    echo "::set-output name=APP_VERSION::${VAR_APP_VERSION}"

```


# ついでに

`build number` も更新したくなってくるが、これはbuildオプションの `--build-number` で渡せるようになっているので、それを利用すれば良い。

`flutter build ipa -h` の出力結果. 
`build` に `-h` をつけても表示されないので注意。
```
--build-number                                  

An identifier used as an internal version number.
Each build must have a unique identifier to differentiate it from previous builds.
It is used to determine whether one build is more recent than another, with higher numbers indicating more recent build.
On Android it is used as "versionCode".
On Xcode builds it is used as "CFBundleVersion".
```

https://docs.flutter.dev/reference/flutter-cli#flutter-commands
paiza.ioでelixir その55

# 概要
paiza.ioでelixirやってみた。
Map使ってみた。

# サンプルコード

```
Map.delete(%{a: 1, b: 2}, :a)
|> IO.inspect
Map.drop(%{a: 1, b: 2, c: 3}, [:b, :d])
|> IO.inspect
Map.equal?(%{a: 1, b: 2}, %{b: 2, a: 1})
|> IO.inspect
Map.fetch(%{a: 1}, :a)
|> IO.inspect
Map.fetch!(%{a: 1}, :a)
|> IO.inspect
defmodule User do
	defstruct [:name]
end
Map.from_struct(User)
#Map.from_struct(%User{name: "john"})
|> IO.inspect
Map.get(%{a: 1}, :a)
|> IO.inspect
Map.get_and_update(%{a: 1}, :a, fn current_value ->
	{current_value, "new value!"}
end)
|> IO.inspect
Map.get_and_update!(%{a: 1}, :a, fn current_value ->
	{current_value, "new value!"}
end)
|> IO.inspect
map = %{a: 1}
fun = fn ->
	13
end
Map.get_lazy(map, :a, fun)
|> IO.inspect
Map.has_key?(%{a: 1}, :a)
|> IO.inspect
Map.keys(%{a: 1, b: 2})
|> IO.inspect
Map.merge(%{a: 1, b: 2}, %{a: 3, d: 4})
|> IO.inspect
Map.merge(%{a: 1, b: 2}, %{a: 3, d: 4}, fn _k, v1, v2 ->
	v1 + v2
end)
|> IO.inspect
Map.new()
|> IO.inspect
Map.new([{:b, 1}, {:a, 2}])
|> IO.inspect
Map.new([:a, :b], fn x -> 
    {x, x} 
end)
|> IO.inspect
Map.pop(%{a: 1}, :a)
|> IO.inspect
Map.pop!(%{a: 1}, :a)
|> IO.inspect
map = %{a: 1}
fun = fn ->
	13
end
Map.pop_lazy(map, :a, fun)
|> IO.inspect
Map.put(%{a: 1}, :b, 2)
|> IO.inspect
Map.put_new(%{a: 1}, :b, 2)
|> IO.inspect
map = %{a: 1}
fun = fn ->
	3
end
Map.put_new_lazy(map, :a, fun)
|> IO.inspect
Map.replace(%{a: 1, b: 2}, :a, 3)
|> IO.inspect
Map.replace!(%{a: 1, b: 2}, :a, 3)
|> IO.inspect
Map.split(%{a: 1, b: 2, c: 3}, [:a, :c, :e])
|> IO.inspect
Map.take(%{a: 1, b: 2, c: 3}, [:a, :c, :e])
|> IO.inspect
Map.to_list(%{a: 1})
|> IO.inspect
Map.update(%{a: 1}, :a, 13, fn existing_value -> 
    existing_value * 2 
end)
|> IO.inspect
Map.update!(%{a: 1}, :a, &(&1 * 2))
|> IO.inspect
Map.values(%{a: 1, b: 2})
|> IO.inspect


```

# 実行結果

```
%{b: 2}
%{a: 1, c: 3}
true
{:ok, 1}
1
%{name: nil}
1
{1, %{a: "new value!"}}
{1, %{a: "new value!"}}
1
true
[:a, :b]
%{a: 3, b: 2, d: 4}
%{a: 4, b: 2, d: 4}
%{}
%{a: 2, b: 1}
%{a: :a, b: :b}
{1, %{}}
{1, %{}}
{1, %{}}
%{a: 1, b: 2}
%{a: 1, b: 2}
%{a: 1}
%{a: 3, b: 2}
%{a: 3, b: 2}
{%{a: 1, c: 3}, %{b: 2}}
%{a: 1, c: 3}
[a: 1]
%{a: 2}
%{a: 2}
[1, 2]
```

# 成果物

https://paiza.io/projects/G0Lm3m6WnRWqRsozZ85jfQ?language=elixir


以上。
Exception has occurred: CLR/System.Text.Json.JsonException

C#でjsonをデシリアライズするときにエラー発生

`JsonSerializer.Deserialize<List<T>>(jsonString)`の動作に失敗した 

```
Exception has occurred: CLR/System.Text.Json.JsonException
An unhandled exception of type 'System.Text.Json.JsonException' occurred in System.Text.Json.dll: ''c' is an invalid start of a value. Path: $ | LineNumber: 0 | BytePositionInLine: 0.'
 Inner exceptions found, see $exception in variables window for more details.
 Innermost exception 	 System.Text.Json.JsonReaderException : 'c' is an invalid start of a value. LineNumber: 0 | BytePositionInLine: 0.
   at System.Text.Json.ThrowHelper.ThrowJsonReaderException(Utf8JsonReader& json, ExceptionResource resource, Byte nextByte, ReadOnlySpan`1 bytes)
   at System.Text.Json.Utf8JsonReader.ConsumeValue(Byte marker)
   at System.Text.Json.Utf8JsonReader.ReadFirstToken(Byte first)
   at System.Text.Json.Utf8JsonReader.ReadSingleSegment()
   at System.Text.Json.Utf8JsonReader.Read()
   at System.Text.Json.Serialization.JsonConverter`1.ReadCore(Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state)
```

読み込んだJsonの形式が正しくない場合に発生するエラーとのこと
今回の場合、`{}`ではなく`[]`で囲また配列になっていた

修正が必要なJsonであっても、オプションによって読み込むことができるものもある
```cs
JsonSerializerOptions options = new()
{
    NumberHandling =
        JsonNumberHandling.AllowReadingFromString |
        JsonNumberHandling.WriteAsString,
    WriteIndented = true
};

string forecastJson =
    JsonSerializer.Serialize<Forecast>(forecast, options);
```

## Reference

https://learn.microsoft.com/ja-jp/dotnet/standard/serialization/system-text-json/how-to?pivots=dotnet-6-0

https://docs.microsoft.com/ja-jp/dotnet/api/system.text.json.jsonexception?view=net-6.0

https://learn.microsoft.com/ja-jp/dotnet/standard/serialization/system-text-json/invalid-json?pivots=dotnet-7-0

https://learn.microsoft.com/ja-jp/dotnet/api/system.text.json.serialization.jsonnumberhandlingattribute?view=net-7.0
[gcp]VMインスタンスのデプロイ時に「The reference 'id' is not found」と言われた話

※この記事は2022年11月10日時点のものです。

初学者のため完璧に理解していないまま書いているものもありますが、
ひとまず解決したので書き留めておきます。

# まずは結論から
自分はこの設定で無事にデプロイが完了しました（赤枠はデフォルトから変更した箇所）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/1330004c-da62-923a-d146-9f37fb37957d.png)
↓結果（警告の内容は後述。ひとまず無視でOK）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/3f54b783-b135-4253-053b-9adac8fbe1ed.png)

※警告文詳細…<font color = "orange">
This deployment has resources from the Runtime Configurator service, which is in Beta. There is no planned date for moving this feature into General Availability (GA). Examples of runtimeconfig types used: runtimeconfig.v1beta1.config, runtimeconfig.v1beta1.waiter
(日本語訳：このデプロイには、ベータ版の Runtime Configurator サービスからのリソースが含まれています。この機能を一般提供 (GA) に移行する予定日はありません。使用される runtimeconfig タイプの例: runtimeconfig.v1beta1.config、runtimeconfig.v1beta1.waiter)
</font>
※警告の内容について…
　平たく言うと、「お前のアカウントじゃ使えん機能が含まれてるけどいいんか？」と言われています。これは問題ないので無視でOKです。

# 失敗したときのデプロイ設定（備忘録）
上記まででデプロイ成功した方は、以下は見なくても大丈夫です。
自分はデプロイに失敗したとき、以下のような設定をしていました。

<b>画像①</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/d0837af7-8699-0791-2d75-1ad44c79e80a.png)
この設定でデプロイした後、以下のような結果になりました。

<b>画像②</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/42a5790a-e35f-351d-fe95-d9e6b6ced226.png)
↑画面のwordPress-with-nigix内にエラーがあり、wordPress-with-nigixをクリックすると赤いビックリマークがこんにちはします。

<b>画像③</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/a32e3121-bf63-f3dd-af30-47fa3d8600e7.png)
どうやらSite addressとAdmin URLが未割り当てっぽい。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/bce9a604-306a-abc1-7629-a4a4320ec428.png" width=10%>
↑ちなみにここにカーソルを合わせると、「式を評価できませんでした」と出る。なんのこっちゃ。


では、画像①、②に出てきたエラー内容と自分がしたミスについて見ていきます。
### 画像①（デプロイ設定画面）
ここで「マシンファミリー」内の「シリーズ」を「N1」に設定しているのが間違いでした。
[公式リファレンス](https://cloud.google.com/blog/ja/products/compute/choose-the-right-google-compute-engine-machine-type-for-you)を読む限り、「N1」は
・選択肢の中でも一番古い型
・コスパが他と比べて良くない
ので、特に理由がない限りは使うべきではないのかもしれません。
### 画像②（デプロイ失敗時の画面）
画像②内に出ている警告文は以下の通りです。
（注意文はこの記事の上の方に記載したものと同じです）

<font color = "red"> 
【警告文】<br></br>
The reference 'id' is not found, reason: The resource 'my-first-gce-vm' exists, but the reference value does not. <br></br>
(参照 'id' が見つかりません。理由: リソース 'my-first-gce-vm' は存在しますが、参照値は存在しません。)
</font>
</font><br></br><br></br>
The reference'id'(=参照id？) とは Site addressかAdmin URL、又は両方のことを指しているのかな、と思います（もしくはSite address、Admin URLを決定するときに必要なid？）

理由は不明ですが、マシンファミリー内のシリーズが「N1」だとここらへんがうまくいかないっぽいです。

参考：
* [GCP公式リファレンス（Compute Engine の説明: マシン ファミリーとマシンタイプの選択基準）](https://cloud.google.com/blog/ja/products/compute/choose-the-right-google-compute-engine-machine-type-for-you)
* [Q&A GCPのWordpressデプロイのVMインスタンスが消えてしまいました](https://qiita.com/0211_sakiko/questions/88554f0d56ae32960ea3)
pythonでテトリスの大会をやってみた！（継続していく予定）

## 目次
- 自己紹介
- pythonテトリス大会とは :thinking:
- pythonテトリス大会の様子 :smiley:
- 機械学習を用いた事例
- まとめ
- 今後の課題

---

## 自己紹介
・ハンドルネーム: @seigot 
・関西在住
・ソフト開発
　・プログラミング言語：C言語, python, シェルスクリプト
　・資格：[エンベデッドシステムスペシャリスト](https://qiita.com/seigot/items/2890ee49de29964e1ead)、[情報処理安全確保支援士試験合格](https://qiita.com/seigot/items/80a0ed8437b8918c723a)、
・pythonテトリス活動（2021年〜現在）
　・pythonテトリス大会を開催してみた（2022.9）
　・[参考:Qiita記事 テトリスを題材にpythonを学べるツールを作成してみた話](https://qiita.com/seigot/items/0b42a807217dbe636226)
　・[参考:Qiita記事 テトリスを題材にpythonを学べるツールを作成してみた話2](https://qiita.com/seigot/items/0b42a807217dbe636226)

---
## pythonテトリス大会とは :thinking:

---

## pythonテトリス大会

・流行りのプログラミング言語であるpythonでテトリスを動かしてスコアを競う取り組み
・テトリスを題材にすることで楽しくプログラミングを学ぶことが目的

## 課題感
・新しくプログラミング言語を学ぶきっかけがなかなかない事も多い。
・プログラミング言語の独学は挫折しがちであり、アプリ開発等をするのはハードル高い
・~~闇のエンジニアの方がpython使いであり自分も仲間になりたかった~~ 楽しんで学びたい:relaxed:
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">人気ブロガーからあげ先生のとにかく楽しいAI自作教室 [楽天] <a href="https://t.co/ffJvnWW5Te">https://t.co/ffJvnWW5Te</a> <a href="https://twitter.com/hashtag/rbooks?src=hash&amp;ref_src=twsrc%5Etfw">#rbooks</a> <a href="https://t.co/GXTZxiu8UG">pic.twitter.com/GXTZxiu8UG</a></p>&mdash; cm-pr0225 (@cmpr001) <a href="https://twitter.com/cmpr001/status/1466252470678855680?ref_src=twsrc%5Etfw">December 2, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

---

## pythonテトリス大会の様子 :smiley:

---

## pythonテトリス大会の様子
・トーナメント形式、有志20名程が参加
・事前にテトリスを動かすプログラムを自作し、当日に上手くブロックを消せた人が勝ち
・個性的なプログラムがたくさん登場しとても盛り上がった
https://www.youtube.com/watch?v=9hxtCJVXFjU

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">tetris のAI同士で対戦とかしてみたり <a href="https://t.co/ak4etzdOue">pic.twitter.com/ak4etzdOue</a></p>&mdash; st (@st17890027) <a href="https://twitter.com/st17890027/status/1572630631343067137?ref_src=twsrc%5Etfw">September 21, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

---

## 機械学習を用いた事例
・機械学習を活用したプログラム限定トーナメントも実施（[大会動画の64:14~](https://www.youtube.com/watch?v=9hxtCJVXFjU&t=3854s)）
・深層強化学習(DQN)などの登場
・ハイパーパラメータチューニングや評価関数等の工夫が競争ポイント
refer: https://github.com/uvipen/Tetris-deep-Q-learning-pytorch
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">DeepQLearningを用いたTetrisなるもの<a href="https://t.co/1U5aBYeJQT">https://t.co/1U5aBYeJQT</a></p>&mdash; st (@st17890027) <a href="https://twitter.com/st17890027/status/1590425439012814849?ref_src=twsrc%5Etfw">November 9, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

---

## まとめ
・プログラミング言語(python)の学習を目的にpythonでテトリスの大会をやってみた！
・ものが動くと面白い、対戦がアツい
・pythonの基本、及び機械学習の基本が身に付く気がする

## 今後の課題
・より強いテトリスプログラムを実現していきたい。
・pythonテトリス大会を有志で継続開催したい。興味ある方コメントおまちしています。




---

以上

---

（備考）
ソースコードは以下です！
https://github.com/seigot/tetris
スマホで広告をブロックする

# 注意
自己責任でやってください。
DNSとかを使います。
消えない広告もあります。(Youtubeの広告など)


## 方法
まずこのアプリを入れてください

DNSCloak
https://apps.apple.com/jp/app/dnscloak-secure-dns-client/id1452162351

入れれたらダウンロードしたアプリを開いて
**adguard-dns-doh**
というのを押してUse This Serverを押しましょう。
VPNの設定とか何とか言われたら適当に設定しといてください。

できたら、
**adguard-dns-ipv6**
というのも押して 先程と同じようにしてください。

できたら左上の再生マークみたいなのを押せば出来ます。
止める時も同じところを押せばOKです

これでウザイ広告が消えるようになりました！

### 最後に

最初にも言った通り消えない広告もあります
大体のアプリの広告は消えますがYoutubeやTwitchなどは消えません
百億のEtherと一兆のタイル　-ハッカソンでWeb3でNFTなリアルメタバースを作ったよ-

# はじめに

11/6まで行われていた[東京web3ハッカソン](https://tokyo.akindo.io)に参加し、プロダクトを提出することができました。
軽く何を作ったかを書きます。

# OrthoverseZero

開発したコード等は以下のリポジトリです。
https://github.com/oho-sugu/OrthoverseZero

以前PLATEAUハッカソンで[開発したLIT](https://qiita.com/oho-sugu/items/8761352eb56d9238bd15)で、AR技術を利用したリアルメタバースの実現には、2つの大きな課題があるとしました。
世界規模のVPSと場所-コンテンツの権利の管理です。
現在、GoogleのGeospatial APIにより一つ目の課題がそれなりにクリアされたので、二つ目の、権利などを管理してどう場所に情報を紐付けるかということを考えてみます。
当初DNSのような仕組みを作ることで場所と情報をグローバルに結びつける仕組みが構築できないか？ということを考えていましたが、ENSという仕組みを知って、ブロックチェーン上にデータを記録するということが魅力的に思えてきました。

今回のハッカソンでは、そこに注力し、NFTコントラクトとして、場所と情報を結び付け、それをオーナーとなったユーザーが管理できる仕組みを構築してみました。

## コントラクトの設計

ERC721Enumerableを継承して、各トークンにURLを記録、オーナーのみURLを変更できるようなコントラクトを作成しました。
トークンのIDには、ズームレベル20で区切ったタイルのタイルコードのXとYを合成したものを使います。
これにより、およそ日本付近では20m四方の矩形領域とURLを紐付けることができます。
ちなみに、総タイル数はおよそ一兆、デフォルト設定での全部mintした場合のコントラクトに入る手数料は百億Ether…のはずです。

## クライアントアプリ

クライアントアプリでは、GeospatialAPIを利用して端末位置を推定します。そこから端末位置の空間IDを計算し、ブロックチェーン上の近傍のトークンを取得し、各トークンに紐付けられたURLから取得したコンテンツをレンダリングします。

コンテンツはHOMLという独自マークアップで記述されています。マークアップは、Mozilla発の[A-Frame](https://aframe.io/)の記法に寄せて作っていますが、細部で違いがあります。

## 他

他にも、OpenStreetMapのタイルサーバーを自鯖に建てたり、メタデータのAPIを作って、OpenSeaで各トークンに地図が表示されるようにしたりなど、色々試してみました。

# さーて、今年のアドベントカレンダーは？

と、ざっと書きたいことを整理していて、これは1エントリーでは足りないと思ったので、今年も一人アドベントカレンダーを走ろうと思います。今回のハッカソンでやったことを中心に、雑多なことを書いていこうと思います。
https://qiita.com/advent-calendar/2022/oho
完走できるかな？あんまり期待せずに生暖かく見守ってください。

※タイトルの元ネタは一兆じゃなくて千億だったか…百億ってので連想したので…
仮想マシンの可用性オプション

●仮想マシンの可用性オプション
Azureの仮想マシンでは可用性セットや可用性ゾーンという可用性を高めるためのオプションがある。いずれも仮想マシンの作成時に決定する必要があり、作成済みの仮想マシンには可用性オプションを追加できないので注意。

■可用性セット
・障害ドメイン
仮想マシンのデーターセンター内のいくつのラックに分散して配置するかを決定する。最大値は３だが、選択したサブスクリプションとリージョンによっては３より小さい場合がある。

・更新ドメイン
仮想マシンをいくつのサーバーグループに分散して配置するかを決定する。サーバーグループは計画的なメンテナンス時にまとめて再起動されるサーバーの単位。最大数は２０。

■可用性ゾーン
同じ構成の仮想マシンを複数作成するときに、配置先のデータセンターを分けることができるオプション。
データセンター障害に対応できる可用性オプション。
Ubuntu20.04でCPythonをビルドしてみた

# 1. はじめに

この記事はeeic2022の3年後期実験「大規模ソフトウェアを手探る」の4班の成果報告の記事です。
私たちの班はCPythonに様々な機能を追加していきました。ビルドを終えたら以下の記事も参考にしてみてください。

https://qiita.com/bnn877/items/3ad88383f0ff936e9822

https://qiita.com/LEEANHUA/items/fcedb7b8ceeca7c2fd3e





# 2. 実行環境

Ubuntu 20.04.5 LTS





# 3. ビルドの手順

## 目標
- ダウンロードしたCPythonソースコードのzipファイル（cpython-main.zip）
- 解凍したCPythonソースコードのディレクトリ（cpython-main）
- インストールしたCPythonのディレクトリ（cpython-install）

ファイル名ディレクトリ名は上記のように設定し、これら3つをホームディレクトリに配置することを目標とします。

また、以降では「/home/denjo」がホームディレクトリという前提でコマンドを表示します。



## ソースコードzipファイルのダウンロード
GitHub上で公開されている[CPythonソースコード](https://github.com/python/cpython)をダウンロードします。
緑の<strong>Code</strong>というボタンを押した後、<strong>Download ZIP</strong>を選択しましょう。
![手順.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950220/76d9363a-31a1-25ee-70ac-f8ad0c3cb7d8.png)
ダウンロードされたzipファイルをホームディレクトリに移動させてください。



## ターミナルでホームディレクトリに移動
`$ cd ~`



## ソースコードzipファイルを解凍
`$ unzip cpython-main.zip`



## 解凍したソースコードディレクトリに移動
`$ cd cpython-main`

ここには、CPythonのソースコードが展開されています。
<strong>「configure」</strong>というファイルもあるはずなので確認してください。次で使います。



## コンパイルの設定
`$ CFLAGS="-O0 -g" ./configre --prefix=/home/denjo/cpython-install`

`./configure`はコンパイルに関する設定を行ったり、これからコンパイルを行う環境の情報を入手して適切な対処を行うために実行します。以下で、上記コマンドのオプションについて説明します。

- `CFLAGS="-O0 -g"`はデバッガでプログラムを追跡しやすくするためのオプションです。今後CPythonを改造しようと思ってる方は付けたほうがよいでしょう。
<dl>
<dt>-O0</dt>
<dd>最適化を最低レベルにします。これにより、プログラムの実行順序が最適化によって大きく省略されることがなくなり、デバッガでプログラムの動きを追うときに混乱せずに済みます。</dd>
<dt>-g</dt>
<dd>実行可能ファイルにデバッグシンボルを含めます。デバッガでプログラムを実行した際に、コンパイル後の命令列とソースコード上の位置を対応づけて表示させることができます。</dd>
</dl>

- `--prefix=`はインストール先ディレクトリを指定するオプションです。
上記のコマンドでは、ホームディレクトリに「cpython-install」というディレクトリを作り、その中にインストールすることを意味します。



## コンパイル
`$ make`



## インストール
`$ make install`

コンパイルの設定で指定したインストール先ディレクトリが作成され、その中にCPythonがインストールされているはずです。



# 4. CPythonを利用してみる
インストール先ディレクトリの中の<strong>「bin」</strong>というディレクトリに移動します。
`$ cd ~/cpython-install/bin`

その中に<strong>「python3」</strong>というファイルがあるはずです。それを実行すると、CPythonを対話モードで利用できます。
`$ ./python3`

またこのディレクトリに「a.py」というファイルを作成し、CPythonでそれを実行することもできます。
`$ ./python3 a.py`



# 5. 最後に

これにてCPythonのビルドが完了しました。
ソースコードを変更し再びビルドしてあげれば、CPythonの機能を改造できます。
皆さんもぜひ試してみてください。
Nuxt3でhead情報を追加する方法

# まず、useHeadを使う方法
useHead({title:'xxx'});

# 次、nuxt.config.tsを使う方法（の参考サイト）
https://kikuchance.com/2022/08/10/nuxt3-nuxtconfig-meta-bootstrap/

以下、サンプル。

```
import { defineNuxtConfig } from 'nuxt'

// https://v3.nuxtjs.org/api/configuration/nuxt.config
export default defineNuxtConfig({
    ssr:true,
    app:{
        head: {
          title: "My Blog",
          meta: [
            { charset: "utf-8" },
            { name: "viewport", content: "width=device-width, initial-scale=1" },
          ],
          link: [
            { rel: "icon",type: "image/x-icon", href: "/favicon.ico" }, 
            {rel: "stylesheet",href: 　　　　　　　　　　　　　　　　　　　　　　　　"https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css"}
          ],
        },
      }

})
```
PCの使用履歴を取るManicTimeっていうソフトを試す

# 概要

どんな作業にどれだけの時間をかけたかを記録してる。
でも手で記録すると忙しい時忘れたり、入力ミスとかで正確なものにならない場合がある。
何より面倒くさい。

自動で記録をとってくれるManicTimeってソフトがあるのでそれを使ってみる。

# インストール

https://www.manictime.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/9f3728ec-aca0-b9db-5b29-f6a8b86e7fd4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/10234451-6eb5-e289-c895-63a6b307fd3d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/eae3d54a-9c03-083c-0473-152696305eb4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/203783d6-1e9a-9e62-945a-7d510ec64d56.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/45c401fb-e20d-bb3b-25e3-1cd52a8481b3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c81fc3e7-c368-c5e8-c557-a51308e1b9dd.png)

お試しなので下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/142d51dd-382c-3374-8e41-673cecd765bc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/dc4ac8bb-5e38-2ead-d258-8f4166dfe9b3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/323016af-197d-9ba6-d16e-0be564db3a4d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/f2173362-1947-e0f2-c86d-a6a29a88190f.png)

# 使用履歴のエクスポート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/f2a29f9a-d142-7e2e-342e-2af56022ddf9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/80283403-9a7c-15a3-c001-6a8d16550bee.png)

期間と集計方法が選べる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/166f0424-1c63-bfba-8468-61fdaefc1eb9.png)

いったん『アプリケーション』の設定で出力してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7670a34e-18d5-fef0-47ab-b614c152ac9d.png)

xlsxかcsvか選べる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e7788d0c-e2ae-2cec-36cc-9d212a70270c.png)

csvはこんなかんじ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b1ca2f4e-4bd2-87ba-3929-a33a3a5745db.png)

|項目名|説明|
|---|---|
| Name |ソフトが開いてるファイル or サイトなど |
| Start | 作業開始日時 |
| End | 作業終了日時 |
| Duration | 作業にかかった時間 |
| Process | ソフト名 |

# バージョン

Windows 10 Home 21H1 19043.2251
ManicTime 5.1.8.0 (64-bit) スタンダード（無料）
激安なDBの仕組み作りにチャレンジ 2回目

# はじめに

[この](https://qiita.com/hiroaqi/items/fac3267c1a6d6b8b7fcc)記事の続きになります。

今回は、前回作成した仕組みのクライアント側(SQLと結果を受け取る)を作成していきます。主な処理の流れは、Cloud Pub/SubにSQLを含んだメッセージを送信して、その結果が出力されているCloud Storageから結果を受け取ります。

# クライアント側のコード

クライアントもRubyで書いていきます。Gemfileには次の2つのgemを追加します。

```ruby:Gemfile
gem "google-cloud-pubsub"
gem "google-cloud-storage"
```

クライアント側のコードは次のようになります。

```ruby:client.rb
require "google/cloud/pubsub"
require "google/cloud/storage"
require "json"
require "securerandom"

def execute(query)
  bucket_name = '{バケット名}'
  topic_name = '{トピック名}'
  
  pubsub = Google::Cloud::PubSub.new

  topic = pubsub.topic(topic_name)

  query_id = SecureRandom.hex(10)

  publish_message = {
    id: query_id,
    query: query
  }

  message = topic.publish(JSON.generate(publish_message))

  return nil unless query.downcase.index('select') == 0

  storage = Google::Cloud::Storage.new
  bucket = storage.bucket(bucket_name, skip_lookup: true)

  filename = "output/#{query_id}.txt"
  
  for i in 0..5
    sleep(1)
  
    file = bucket.file(filename)
    unless file.nil?
      download = file.download
      download.rewind
      json = download.read

      return JSON.parse(json)
    end
  end

  return nil
end

rows = execute('SELECT * FROM users;')
p(rows)
```

Pub/Subにメッセージを送った後に処理が完了するまで(ファイルが作成されているかどうか)待ち、作成されている場合にはダウンロードして結果を返しています。利用する時にはexecuteにSQLの文字列を引数として設定して呼び出すと結果を取得できるようにしています。

実行前にGoogle Cloudの認証情報の鍵を設定しておく必要があります。また、この鍵に関連したアカウントのロールには、Cloud StorageのロールとCloud Pub/Subのロールである「Pub/Sub パブリッシャー」と「Pub/Sub 閲覧者」を設定しておきます。

```bash
export PUBSUB_CREDENTIALS={パス}
export STORAGE_CREDENTIALS={パス}
```

実行する時は次のようにします。


```bash
ruby client.rb
```

取得した結果は、出力されるようになっていますので無事に実行できると表示されるかと思います。

# おわりに

今回は、簡単な仕組みで試してみました。sleepの箇所などは確認の頻度を上げても良いのではないかと思います。
Rancher Desktop を利用する方法（Docker Desktop の代替ツール）


まずは公式サイトにアクセスする。

https://rancherdesktop.io/

利用環境に合わせてアプリケーションをダウンロードする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59081/c753fd11-2dfc-ac3c-c388-41cf0cf9278f.png)

ダウンロードしたらアプリケーションを起動する（画像はMacの場合）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59081/433f50b3-6fb4-4054-cf59-31764c8e775c.png)

起動をしたら右上の歯車ボタンを押して「dockerd」にチェックする。

- dockerd: 今まで通り docker ps とかで docker を操作したい場合
- containerd: Kubernetesのコンテナランタイムを利用する方向け。nerdctl 〜 コマンドで操作するみたい。今後はこちらが標準になる動きがあるとかないとか
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59081/6c8dcb0f-c2f5-3e63-d7b7-0ab9f0246eb8.png)

これでOK。

docker-compose が入っていなかった場合（Macの場合）

```bash
# インストール
$ brew install docker-compose
$ ln -sfn /usr/local/opt/docker-compose/bin/docker-compose /usr/local/bin/docker-compose

# 動作確認
$ git clone https://gitlab.com/gitlab-de/docker-hub-limit-exporter.git
$ cd docker-hub-limit-exporter/example/docker-compose

$ docker-compose up -d
```
SAMLの基礎知識を調査

## これは何
SAML についての基礎知識を備忘録としてまとめたものです。

## SAML とは
SAMLとは、Security Assertion Markup Language の略で、
標準化団体 OASIS によって策定された、XML をベースにした異なるインターネットドメイン間でユーザー認証を行うための標準規格。
一度のログインで複数のサービスにログインできる SSO を実現するために活用される。

## SAML 認証の登場人物
SAML認証では、ユーザー・IdP・SP の三者間で認証情報をやり取りします。

### ユーザー
利用者。主にブラウザを用いてのやり取りになります。

### IdP
Identify Provider の略。
SSO の仕組みを提供するサービスを指す。

### SP
Service Provider の略。
ログインしたいクラウドサービスを指す。

## 認証の流れ
SAML認証には2パターンの流れが存在します。

### SP Initiated
SP を起点とした認証の流れです。

1. ユーザーが SP にアクセスする
2. SP がSAML認証要求を作成し、ユーザーに応答する
3. ユーザーは SP から受け取ったSAML認証要求を IdP に送信する
4. IdP の認証画面が表示される
5. ユーザーは認証情報を入力して IdP との間で認証処理を行なう
6. 認証が成功すると、IdP からSAML認証応答が発行される
7. ユーザーは IdP から受け取ったSAML認証応答を SP に送信する
8. SP にSAML認証応答が届くとログインができる

図にすると以下のようになります。

```mermaid
sequenceDiagram
participant idp as IdP
participant user as ユーザー
participant sp as SP
    user ->> sp : 1. ユーザーが SP にアクセスする
    sp ->> user : 2. SP がSAML認証要求を作成し、ユーザーに応答する
    user ->> idp : 3. SP から受け取ったSAML認証要求を IdP に送信する
    Note over idp : 4. IdP の認証画面が表示される
    user ->> idp : 5. ユーザーは認証情報を入力して IdP との間で認証処理を行なう
    idp ->> user : 6. 認証が成功すると、IdP からSAML認証応答が発行される
    user ->> sp : 7. ユーザーは IdP から受け取ったSAML認証応答を SP に送信する
    Note over sp: 8. SP にSAML認証応答が届くとログインができる
```


### IdP Initiated
IdP を起点とした認証の流れです。

1. ユーザーが IdP にアクセスする
2. IdP の認証画面が表示される
3. ユーザーは認証情報を入力して IdP との間で認証処理を行なう
4. 認証が成功すると、IdPにログインできる
5. IdP の画面からアプリケーションを選択する
6. IdP 側でSAML認証応答が発行される
7. ユーザーは IdP から受け取ったSAML認証応答を SP に送信する
8. SPにSAML認証応答が届くとログインできる

図にすると以下のようになります。

```mermaid
sequenceDiagram
participant idp as IdP
participant user as ユーザー
participant sp as SP
    user ->> idp : 1. ユーザーが IdP にアクセスする
    Note over idp : 2. IdP の認証画面が表示される
    user ->> idp : 3. ユーザーは認証情報を入力して IdP との間で認証処理を行なう
    Note over idp : 4. 認証が成功すると、IdPにログインできる
    user ->> idp : 5. IdP の画面からアプリケーションを選択する
    idp ->> user : 6. IdP 側でSAML認証応答が発行される
    user ->> sp : 7. ユーザーは IdP から受け取ったSAML認証応答を SP に送信する
    Note over sp: 8. SP にSAML認証応答が届くとログインができる
```

## SAMLアサーション
SAMLアサーションは、IdP がユーザー認可ステータスを含む SP に送信するXMLドキュメントです。
大きく分けて以下の情報が含まれています。

### 認証アサーション
ユーザが認証された場所や時刻等、およびユーザーを識別するための情報

### 属性アサーション
名前やメールアドレス等のユーザの属性情報

### 認可決定アサーション
ユーザに許可された操作やアクセス権限等の情報
Google colaboratoryでblast+を利用する

blast+はローカル環境でblast検索を行うためのプログラムである。

https://blast.ncbi.nlm.nih.gov/Blast.cgi?PAGE_TYPE=BlastDocs&DOC_TYPE=Download

自信のPCでも実施可能だが、Google Colabratoryでも勘弁に行うことができる。

まず、blast+をインストールする。
最初のセルで以下のコマンドを実行する。

```
#blast+のインストール
!sudo apt install ncbi-blast+
```

blast+の実際の動作は"!"を利用したコマンド入力でもいいが、コマンドをpythonで書き換えたい場合はsubprocess.Popenを利用する方が便利である。
そこでまず、これらをimportする。

```
import subprocess
from subprocess import Popen
```

さらに次のセルで、試しにblast +のhelpを呼び出してみる。


```
#blast -helpの呼び出し
#コマンドの文字列を作成

cmd = "blastp -help"

#コマンドの実行
test = subprocess.Popen(cmd, shell=True, text=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
outs, errs = test.communicate()

#結果の出力
print(outs)
print(errs)

```

これにより、helpが出力されればインストールは成功している。

<h1>データベースの作成</h1>
以下のコマンドでデータベースの作成が可能である。

```
#コマンドの文字列を作成
cmd = "makeblastdb "
cmd += "-dbtype prot " #
cmd += "-in file.fasta "
cmd += " -out file_db"

#コマンドの実行
test = subprocess.Popen(cmd, shell=True, text=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
outs, errs = test.communicate()

#結果の出力
print(outs)
print(errs)
```

<h1>実際の検索</h1>
queryとなるfastaファイルをアップロードし、以下のコマンドにより、blast検索を実行する。
outの形式は自分の目的に合ったものを選ぶと良い。

```
#コマンドの文字列を作成
cmd = "blastp " #blastpを実行する場合
cmd += "-query query.fasta " #queryファイル名の入力
cmd += "-db file_db " #データベースのファイル名
cmd += " -out result.txt" #結果のファイル名

#コマンドの実行
test = subprocess.Popen(cmd, shell=True, text=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
outs, errs = test.communicate()

#結果の出力
print(outs)
print(errs)
```
【Angular】練習アプリ作成日記（DBは何にする？）

[前記事](https://qiita.com/lacky-lacky/items/7f7bfe2321fd60653437)

前回、Gitの環境を作りました。
最終的なゴールは検索して表示する簡単なアプリを作ること
その為に必要なDBの設定をしていきたいと思います。

# それぞれのDBについて
有名どころですと、MySQL,Oracle,PostgreSQLが上がるかと思います。
案件の現場によっては使われるものは様々です。
今回は個人的に使う場合の視点で見たいと思います。

# MYSQLについて
世界的にも有名なものですね。
ビジネスでは幅広く使われていると聞きます。
一般的に上げられるメリットは以下の通りです。
- オープンソース（無償である点）
書いてある通りです。無償で使えるのがいいですね。
誰でも学習用に簡単に使えるということが言えると思います。

ちなみに、これらは、webサービスやクラウドサービスなどに利用されています。

# Oracleについて
これも有名なものですね。
- 高い堅牢性
要するに、頑丈ということですね
予期しないエラーや障害やセキュリティ上のリスクなどに
柔軟に対応できます。
- 行レベルの排他制御が可能。
色々な人が利用できる点では便利ですね。
- パフォーマンス、拡張機能などビジネスニーズに合ってる
これだけ高機能なものが揃っている訳ですからそうですよね。
- ただし有償
これだけ高いパフォーマンスを保つのですから
それなりにコストもかかります。
個人利用には向かなそうですね。

# PostgreSQLについて
これもまた有名なものです。
- 利用料がかからない
会社から見たら、導入コストが低いということです。
- サポート体制が不十分
徐々に改善されている点ではありますが、
トラブルが起きた場合は自己解決をしなければいけないです。
※企業が提供しているサポートもあるそうです、
- それでも商用に匹敵する機能は持っている
データベースに必要不可欠な機能はそろっていますので、
使う分には特に問題なく使えます。

# どれを使用する？
以上の点から、各SQLのメリット、デメリットを上げました。
学習用に使うのが目的ですので、
筆者はPostgreSQLを使おうかなと思います。
過去の現場でも使ったことがありますし、 簡単に導入できますから。

# まとめ
各SQLのメリット、デメリットを調べて、学習用に何を使うか検討しました。
次回は、PostgreSQLを入れてみたいと思います。
macOS Venturaにアップデートしたら、「xcode14.1」を要求された

## MacOS Venturaが登場！
2022/10/25にMacの新OSである、「Ventura」がリリースされました！

Apple好きな私としては、早速アップデートだ！
しかしhomebrew使用時エラーが出た。。？

そこで問題と解決法を簡単にまとめてみました。

## Venturaでは、Xcode14.1を要求してくる
OSをVenturaにアップデートした後、
Homebrewを使っていたところ以下のエラーが出ました。

```
Error: Your Xcode (14.0.1) is too outdated.
Please update to Xcode 14.1 (or delete it).
```
ああ、xcode14.1を入れろってことかー
てことで今度はAppleのページから最新版をダウンロード
しようとしたところ、最新は「14.0.1」になっている。。

なにこれ？詰んでね？

:::note info
2022年11月2日にXcode14.1が正式にリリースされているので、
現在は問題なく動作すると思われます。
:::

https://moshbox.jp/?p=75345

## 解決方法
現在はXcode14.1がリリースされているので、
同現象はもう起きませんが今後同じようなことが起こらないとも
限らないので簡単にメモ。。

どうやら「Command Line Tools for Xcode 14.1 Release Candidate 2」を
ダウンロードすると改善されるとのこと(Appleのページから行けます)

https://developer.apple.com/download/all/?q=Command%20Line%20Tools%20for%20Xcode

ダウンロードが確認できたら、「brew upgrade」を実行すると解決！

## 参考文献
同じ現象の記事が既にありました。
homebrewだけでなく、MacPortsでも影響があったみたいです。

https://softantenna.com/blog/macos-ventura-brew-ports-require-xcode-14-1/