OmniAICreator/Qiita-1.07M huggingface dataset:
AWS EC2にReactデプロイ環境を作成

## 背景
仕事でAWS EC2に環境作成する機会があったので作業の流れと参考にした記事のまとめ
プロキシ設定以外は通常のLinuxサーバーに構築するのと一緒


## 前提
+ Reactプロジェクトは作成済み
+ EC2インスタンスに接続する認証設定は省略
※PEMでSSL認証をしていたが手順をメモっていなかった・・・
+ ReactはEC2インスタンスにDockerをインストールしてDocker上で動かす。
+ とりあえず動かしたい人向け。

### ローカル：EC2インスタンスにSSH接続
作業はEC2インスタンスで行うのでローカル環境からSSH接続
```powershell
$ ssh -i {pemがあればファイルパスを指定} {ユーザ名}@{IPアドレス}
#例
$ ssh -i C:\corp\hoge.pem ec2-hoge@10.219.1.1
```

後々サーバー上のファイル操作もするので、VSCodeの拡張機能「Remote SSH」で接続するのが楽

https://qiita.com/nlog2n2/items/1d1358f6913249f3e186



### SSH：Linuxプロキシ設定
Linuxのプロキシ設定を行う。
下記の記事を参考に「全体設定、yum」の設定を行う。

https://qiita.com/chroju/items/752eaba0fc0e1b11c524


### SSH：Dockerインストール
参考記事
https://kacfg.com/aws-ec2-docker/

+ Dockerインストール
``` sh
$ sudo yum update -y
$ sudo yum install -y docker
```
+ Dockerサービス起動
``` sh
$ sudo systemctl start docker
$ systemctl status docker
```
+ Dockerサービス自動起動
``` sh
$ sudo systemctl enable docker
$ systemctl is-enabled docker
```

+ dockerプロキシ設定

https://arch.jpn.org/archives/661

>「http'」は「http:」の誤記

aptを使わないなら下記は設定不要
> docker 内で apt を使う設定


### gitインストール
プロジェクトをサーバーに配置するのにgitを利用
scp等でファイル転送するなら不要な手順

https://zenn.dev/tmasuyama1114/articles/ec2-linux-git-install

+ gitプロキシ設定
``` sh
$ git config --global http.proxy http://hogehoge.co.jp
$ git config --global https.proxy http://hogehoge.co.jp
$ git config --global http.sslVerify false
```

### SSH：アプリケーションサーバー設定
+ プロジェクトフォルダ作成
``` sh
$ sudo mkdir /home/hogeprj
$ sudo chmod 777 /home/hogeprj
```

+ プロジェクト作成
gitからプロジェクトclone。（ファイル転送でもいい）
``` sh
$ git clone {url}
```

+ Unitファイルを作成
プロジェクトをサービス化するためUnitファイルを作成

https://qiita.com/miyuki_samitani/items/953140bc3c89f0fb606f


``` /etc/systemd/system/hogeprj-test.service
[Unit]
Description=hogeprj-test
After=docker.service
Requires=docker.service

[Service]
Type=simple
ExecStart=/usr/bin/docker-compose -f /home/hogeprj/docker-compose.yml up
ExecStop=/usr/bin/docker-compose -f /home/hogeprj/docker-compose.yml down

[Install]
WantedBy=multi-user.target
```
※VSCodeでSSH接続すると直接ファイル編集できて楽

``` sh
#ユニットファイルをコピー
$sudo cp hogeprj-test.service /etc/systemd/system/
#自動認識されるはずなので確認
$sudo systemctl list-unit-files --type=service | grep hogeprj-test
#自動起動できるようにenable
$sudo systemctl enable hogeprj-test
```
``` sh
+ サービス起動テスト
$sudo systemctl start hogeprj-test
$sudo systemctl status hogeprj-test
```

``` sh
+ サービス停止テスト
$sudo systemctl stop hogeprj-test
$sudo systemctl status hogeprj-test
```
初投稿です！

しゅるれと申します！
IT関係の実務経験は無く、趣味程度にプログラムを組んで遊んでいる初心者です！

現在はNGSのDry解析や量子化学計算の原理や、それらがどのようにプログラミングされているかについて興味があります！
最終的には自前のプログラムで解析や計算を行い、それらの技術に対する理解を深めたいと考えております！

自身が理解できた範囲を記録するための備忘録としてQiitaを使おうと思ってます！

まずは隔週ペースでの記事投稿を心がけていきます！

ご意見を頂けると嬉しいので、記事に対して気になる点がありましたら教えて頂けると幸いです！

よろしくお願い致します！
PythonでGoFデザインパターンのStateパターンを書く

# PythonでGoFデザインパターンのStateパターンを書く

## はじめに
GoFデザインパターンのStateパターンは、オブジェクトの状態を変更するためのパターンです。これをPythonで実装することで、オブジェクトの状態を動的に変更することが可能になります。

## 実装
まず、基本的なStateパターンのクラスを定義します。
```python
class State(object):
    def __init__(self):
        pass

    def handle(self):
        pass
```

次に、Stateパターンを使用するオブジェクトを定義します。
```python
class Context(object):
    def __init__(self):
        self._state = None

    def set_state(self, state):
        self._state = state

    def get_state(self):
        return self._state

    def request(self):
        self._state.handle()
```
次に、異なる状態を表すクラスを定義します。以下は、状態が「A」と「B」の2つである場合を例としています。
```python
class StateA(State):
    def handle(self):
        print("State A")


class StateB(State):
    def handle(self):
        print("State B")
```
最後に、これらを結合して使用するためのコードを書いていきます。
```python
if __name__ == "__main__":
    state_a = StateA()
    state_b = StateB()

    context = Context()
    context.set_state(state_a)
    context.request() # State A

    context.set_state(state_b)
    context.request() # State B
```
このように、PythonでGoFデザインパターンのStateパターンを使用することで、オブジェクトの状態を動的に変更することができます。

応用例として、ゲームプログラミングなどの状態状態を変更していく場合などに使用することができます。
## まとめ
以上が、PythonでGoFデザインパターンのStateパターンを書く方法です。Stateパターンを使うことで、オブジェクトの状態を動的に変更することが可能になります。
2023年の正規表現はじめ(パスワードの形式指定)

## はじめに

元旦、プログラミングを教えている弟から「この正規表現の意味が分からない」と質問が来ました。

```
//8文字以上で、英小文字、英大文字、数字を1文字以上含む文字列
//※パスワードの形式指定でよくあるやつ
^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]{8,}$
```

う〜ん、兄も分かりません。

## 分からないところを調べた結果

- ```(?=A)```
    - 前方参照。Aという文字があったら、(?=A)の直前の位置にマッチする。(マッチした位置に戻る)
- ```.*```
    - 任意の文字0文字以上

## 動作を日本語にすると

- 任意の文字0文字以上+[a-z]にマッチしたら、文頭に戻る
- 任意の文字0文字以上+[A-Z]にマッチしたら、文頭に戻る
- 任意の文字0文字以上+[0-9]にマッチしたら、文頭に戻る
- その後[a-zA-Z0-9]が最低8回繰り返される文字列(+文末)とマッチする

前方参照の「文字ではなく、位置にマッチする」という性質に戸惑いましたが、調べがいがあって楽しかったです。

## 参考文献

- [正規表現オンライン教材 文字を指定するメタ文字](http://www2.otani.ac.jp/fkdsemi/seikihyogen/metamoji-moji.html)
- [正規表現オンライン教材 量を指定するメタ文字1](http://www2.otani.ac.jp/fkdsemi/seikihyogen/metamoji-ryou1.html)
- [正規表現オンライン教材 位置を指定するメタ文字3](http://www2.otani.ac.jp/fkdsemi/seikihyogen/metamoji-iti3.html)
- [正規表現：AND（かつ）の表現方法 | WWWクリエイターズ](https://www-creators.com/archives/5332)
- [はじめての正規表現とベストプラクティス#4 先読みと後読みを極める｜TechRacho by BPS株式会社](https://techracho.bpsinc.jp/hachi8833/2021_04_08/63564)
バッチ処理にカスタム表示ラベルを利用する時にハマったこと

#### バッチ処理にカスタム表示ラベルを利用する場合、ハマったことを紹介致します。
Salesforceの中に、変わりそうな変数や定数がある場合、その変数や定数をカスタム表示ラベルで定義して、今後業務ニーズにより、カスタム表示ラベルの値だけを変更すれば、コード修正なしで業務調整することができるのは通常な考え方かと思います。
ただし、バッチ処理にカスタム表示ラベルを利用する場合、カスタム表示ラベルの呼び出す方により、修正後のカスタム表示ラベルの値が読み込まれないことがあります。
#### ◆事象
<b>実装手順</b>
　①Apexクラスにカスタム表示ラベルを取得処理が実装
　　※下記のtestBatchのCase01の実装
　②そのApexクラスをバッチスケジューラ登録する（毎日定刻に実行）
　③バッチスケジューラを登録した後に、カスタム表示ラベルの値を修正
<b>事象</b>
　次回のバッチで、修正後の値で動作することを期待していたが、修正後のカスタム表示ラベルの値が使用されず、修正前の値でバッチが動作していた。
```testBatch.cls
global class implements Schedulable {
    Public String x01 = System.Label.X01;
    global void execute() {
        System.debug('変数に指定した場合：' + x01);
        // Case01：カスタム表示ラベルを変更しても、出力が変わらない。

        System.debug('直接利用した場合：' + System.Label.X01);
        // Case02：カスタム表示ラベルを変更したら、出力が変わる。
    }
}
```
#### ◆原因説明
スケジュール済みジョブオブジェクトとそのメンバー変数及びプロパティは、初期化から後続のスケジュールされた実行まで存続します。
System.schedule()を呼び出した時点（スケジュールジョブを作成した時点）のオブジェクトの状態は、後続のジョブ実行時も存続する動作になります。
つまり、バッチ処理にカスタム表示ラベルを利用する場合、登録済のバッチ処理に対し、変数に指定したカスタム表示ラベルを修正してもその値が読み込まれないことです。
#### ◆対策案
・既存ソースはCase01で実装していた場合、コード修正なしで、カスタム表示ラベルを修正した後に、ジョブを再スケジューラすれば、最新カスタム表示ラベルが読み込まるようにする。
・今後Apexクラスを作成する時に、カスタム表示ラベルを利用する場合、なるべくCase02のように直接利用するのはお勧めですでしょうかね。
Trailhead コントローラを使用したアクションの処理

# はじめに
年末年始を挟んで表題`コントローラを使用したアクションの処理`を実施した時にしょうもないポイントではまったので自戒の念を込めて投稿するものである。

# 事象
packItemが見つからないというエラーが出続ける。
jsファイルが静的リソースに含まれていることも確認できており、保存もできている。
実装内容を少し変えてみたりしてみるが状況は変わらない。

# 原因
cmpファイルを表示した状態で右側に出ているペインの`CONTROLLER`をクリックしてリソースを作成する必要があった。
M1 Macでhomebrewはあるのにエラーが出るとき

ARM版のMacを使っていると、ターミナルのコマンドやらでいろいろ頼んでもないエラーがでるときがあります。

そのなかでもhomebrewらへんは厄介かなと。

基本的には
https://docs.brew.sh/Installation
のとおりにすれば解決できます。
しかし、インストールした後にも、（```brew -v```でもちゃんと確認できるにもかかわらず）

```
Error: Cannot install in Homebrew on ARM processor in Intel default prefix (/usr/local)!
Please create a new installation in /opt/homebrew using one of the
"Alternative Installs" from:
  https://docs.brew.sh/Installation
You can migrate your previously installed formula list with:
  brew bundle dump

```
のようなエラーがでてしまうことがありました。

<h1>解決策</h1>
結論から言えば、<h3>パスの優先度が低いまま</h3>
が原因だそうです。

なんやかんやいろんなPATHを通して訳がわからなくなるうちに、
```usr/local/homebrew```が今回インストールした```/opt/homebrew```よりも先に来てしまうことが原因です。

この順番をちゃちゃっと入れ替えれば基本的には直ります。
書き換える方法は``source ~/.zshrc```とかで直接編集するなどお好きなように〜
（あくまで私の場合となるため、さまざまなケースには対応していないです）

その後に
```brew cleanup```でもしておけば、さまざまな依存関係を解消してくれます
【Rails で論理削除】paranoid | paranoia を使わないで discard gem を使う理由

# 【Rails で論理削除】paranoid | paranoia を使わないで discard gem を使う理由

## 三行まとめ
```
User.destroy # 物理削除
Comment.destroy # 論理削除
```
☝️いやみわけつかん🥺


## 【悪い点】 paranoid | paranoia は rails の関数をオーバーライドする。

モデル側で`acts_as_paranoid`という指定をすると、destroy が論理削除になる。

```
class Comment < ApplicationRecord
  acts_as_paranoid
end
```


## paranoid | paranoia のメリデメ
### メリット

物理削除の時と名前が同じなので覚えやすい

### デメリット

論理削除と物理削除のモデルが混在するとバグ埋め込む可能性が上がる

たとえば

- User.destroy = 物理削除
- Comment.destroy = 論理削除

という風に物理削除と論理削除を使うモデルが混在している場合が問題
呼び出し元で物理削除なのか論理削除なのかの判別ができないためバグを埋め込みやすい

### paranoia | paranoid の感想

圧倒的にデメリットがきついと思った
なので別の方法を探してみて discard という gem にいきついた

## discard gem を使う

discard gem では ActiveRecord の関数をオーバーライドしないので混乱しない。

- User.destroy = 物理削除 # 素のRailsと一緒
- Comment.discard = 論理削除 # include Discard::Model によって新しく追加される

こんな感じで物理削除するときの関数と論理削除をするときの関数が呼び出し元で明らかなのでバグの混入率が低い


## 感想

paranoia のほうがスター数多いのトラップすぎると思った
2022年に読んで良かった本

2022年も月に一、二冊のペースですが技術系の本を読んできました。

その中でも「**読んでよかった、今後も手元に残しておきたい**」と感じたものをメモしていこうと思います。
私は広く浅いジャンルを読む傾向にあるのですが、2022年は珍しく**機械学習**についての本を集中的に読んだ気がします。
単純に仕事で関わる機会は増えたというのもありますが、機械学習の世界はやっぱり奥が深くて面白い分野だなと思います。

というかほとんど**技術評論社**の本しか読んでなくて、ポイントとか貯めさせてほしいくらい課金している気がします。


# 1.効果検証入門 ～正しい比較のための因果推論／計量経済学の基礎
![スクリーンショット 2023-01-02 10.59.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2255713/eb68341e-e48e-d441-6b00-267afd7502bf.png)

**まだ全部読めてないんですが、**「効果検証入門」は全ページから学びがあるなと感じました。
本書に出会うまではなんとなく数字を並べて効果検証を行っていたのですが、日々の業務の中でも「あれ、この比較って意味ないんじゃね？」と気づくことができるよになった気がします。
ちょっと固めの本なので、すべての内容を理解して手法として落とし込むためにはまだまだ知識も足りないなと課題感は感じつつ、吸収できるポイントは多めでした。
まぁ、**まだ全部読めてないんですが。**


https://gihyo.jp/book/2020/978-4-297-11117-5

# 2.入門 統計解析法
![41uG1I4bMmL._SY291_BO1,204,203,200_QL40_ML2_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2255713/23486e6a-e7b5-abe7-e650-31ace1d529aa.jpeg)

続いては**統計解析の入門書**である「入門統計解析法」です。
今まで統計の本はけっこう触れてきましたが、本書が１番わかりやすく、知識として落とし込めることができたなと思います。
恥ずかしながら、「**自由度**」って概念がよくわかっていなかったのですが、本書に触れて少しは理解できたかなと。
基礎統計の解説から、回帰分析やら分散分析まで解説があるので、今までに解説がふんわりとした書籍で挫折してしまった人にはおすすめの一冊です。

https://www.juse-p.co.jp/products/view/23


# 3.Webを支える技術 ―― HTTP，URI，HTML，そしてREST
![51OSBZvAxGL._SX351_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2255713/316a52ae-2249-840a-2b91-104713fa2699.jpeg)

言わずとしれた**Web業界の人間必読の最強良書**です。
Webの歴史を紐解く形で、「HTTPってなに？」とか「HTTPのステータスの意味は？」みたいな基礎的な疑問へのベストアンサーになっている書籍です。
エンジニアでなくても、webの世界で働くなら必ず目を通しておくべき課題図書になっているかなと。
「〇〇を支える技術」はシリーズにもなっていて気になるものが多いのですが、**結構いい値段するので**お財布と相談して読んでいきます…。
個人的には「[コーディングを支える技術](http://nhiro.org/langbook/)」が気になります。

https://gihyo.jp/book/2010/978-4-7741-4204-3

# 機械学習を解釈する技術 〜予測力と説明力を両立する実践テクニック
![9784297122263.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2255713/bb020b10-4a71-9d0f-c2b8-886577e9176f.jpeg)

**絶賛読書中の書籍です。** 今まではモデル構築とか、予測精度を向上させるためのインプット量を増やしていましたが、本書に出会って「**特徴度ってなんだ？」とか「この特徴量ってどうやって解釈すればいいんだ？**」みたいな疑問にしっかり向き合うことができ始めているかなと思っています。
めちゃくちゃ大事だけど意外とちゃんと理解していない「**モデルの解釈**」を詳細に説明している本って少ないんじゃないですかね？（知らないだけか）
データサイエンティストのタマゴになるために色々勉強していますが、本書は間違いなく一生手元においておく一冊になると思います。
まぁ、**まだ全部読めてないんですが。**

# Kaggleで勝つデータ分析の技術
![TH320_9784297108434.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2255713/987749fe-024c-aa9c-b3c3-8380c186a89e.jpeg)

**モデル構築時の必携書**です。
私のような初心者にとっては、**特徴量分析からモデルの評価まで詳細に、しかもコード例付きで解説をしてくれている**本書は非常に助かります。

最初はKaggleでランクインするための技術にフォーカスした本なのかなと思って買いましたが、ちゃんと現場でも使える内容になっていたかなと思っています。
本職がデータサイエンティストではないので、データサイエンスを主な事業としているエンジニアにとってどこまで役に立つのかは測れないのですが、社内向けのアウトプットをするレベルであればしっかり活用できると感じました。

本書も私にとっては**一生手元においておく一冊**になっています。
https://gihyo.jp/book/2019/978-4-297-10843-4

# まとめ
2022年も結構色んな本を読んできましたが、ちゃんと記憶に残る本って意外と少ないですよね。
あと、やっぱり技術書は高いので、技術書だけのレンタルサービスは早く普及してほしいものです。

ちなみに、本業に関わりが深い「**機械学習系**」の本を中心に目を通して来ましたが、最近の興味は「**セキュリティ**」と「**量子コンピューティング**」です。
とはいえ機械学習の世界が深すぎて、まだまだその世界の表面に触れているだけの状態なので、機械学習中心の勉強はもう少し継続することになりそうです。
EC2とparsecを使ったゲームサーバー構築時のメモ

# 概要
EC2（Windows）上にSteamとparsecを入れて手元のMac等からリモートデスクトップでゲームができるようにした際のメモ

主にこちらの記事を参考にゲーミングサーバーを作ってみた際に追加でやった作業などです
https://dev.classmethod.jp/articles/parsec-gaming-on-aws/

最終的に手元のMacbook ProにDual Shock4を繋いでコントローラーでゲームするところまで行きました。

# 追加でやった作業やメモ
## EC2起動時
- g4ad.xlargeのWindows Serverは2019で構築
  - 恐らく2022でも行けるが https://github.com/parsec-cloud/Parsec-Cloud-Preparation-Tool では対象のリストにないため
- EBSは一旦100GBでいいがゲームによってはぎりぎり
  - Death Strandhingダウンロードしたら残り8GBくらいになった
- スポットインスタンスで構築
  - コスト削減のため。めったに突然停止するものじゃないので問題なし
    - 中断の頻度はここから調査 https://aws.amazon.com/jp/ec2/spot/instance-advisor/#%E3%82%B9%E3%83%9D%E3%83%83%E3%83%88%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%82%A2%E3%83%89%E3%83%90%E3%82%A4%E3%82%B6%E3%83%BC
  - 終了時の動作を停止にする
  - インスタンスは永続で作成
  - これであとは普通に使う時にインスタンス一覧から開始、止める時は停止でok

## ホストマシンにparsec導入時
- コマンド流した際にどうも失敗することがあったのでその際はサーバー再起動してコマンド流しなおす
  - それでもダメな時はインスタンス構築からやり直す
- parsecアプリをクリックしても起動しない際はサーバー自体の再起動を試みる
  - parsecの設定変更したい時とかに
  - ただそれ以外はインスタンス開始するだけで自動でparsec起動してるので、そのままparsecクライアントからログインできる
- 音が出ない問題はこちらを参考に設定する
  - https://kb.vmware.com/s/article/1004839?lang=ja
- コントローラー認識しない問題はこちらを参考に設定する
  - https://github.com/ViGEm/ViGEmBus/issues/153
- Administratorのパスワード変更しておく
  - デフォルトだと長くて入力辛いので、普通にwindowsの設定アプリからadministratorユーザのパスワード変更をしておく

# コストについて
- オンデマンドインスタンスだと100円/hくらい（その時の為替による）
  - スポットインスタンスだと半額くらい
- EBSの料金
  - インスタンス停止してる間もEBSの料金はかかる
  - 100GBくらいで月1500円強とか？
    - https://aws.amazon.com/jp/ebs/pricing/
- ネットワーク
  - 何気にEC2からインターネットへの通信量がある（EC2のメトリクスから確認）
  - 月100GBまでは無料だが日に数時間やると超えそうなので一応注意
    - https://aws.amazon.com/jp/ec2/pricing/on-demand/#Data_Transfer

# 備考

- インスタンス削除時はまずスポットリクエストをキャンセルし、次にインスタンスを終了する
- ネットワークが良く数十GBあるゲームのダウンロードも早いので、しばらく使わない場合はサーバー削除して再度構築した方が経済的
草莽Erlang ── 02. 基本データ型

口で言うより行うことがErlang習得への近道と信じています。

https://qiita.com/mnishiguchi/items/9237780e849d80a85e11

## 整数

```erlang
> 255.
255
```

整数を2進数、8進数、16進数で表記することも可能です。

```erlang
> 2#0110.
6

> 8#0644.
420

> 16#1F.
31
```

https://www.erlang.org/doc/reference_manual/data_types.html#number

## **浮動小数**

```erlang
> 3.14.
3.14
```

1未満の小数の「0」を省略することはできません。

```erlang
> 0.5.
0.5

> .5.
* 1:1: syntax error before: '.'
```

64ビットの倍精度で、指数`e`に対応しています。

```erlang
> 1.0e-10.
1.0e-10
```

https://www.erlang.org/doc/reference_manual/data_types.html#number

## アトム

自身の名前がそのまま値になる定数です。全て小文字で表記します。

```erlang
> foo.
foo

> foo =:= foo.
true

> foo =:= bar.
false

> is_atom(true).
true

> is_atom(false).
true
```

空白や特殊な文字を含む場合は一重引用符（ `’` ）で囲みます。

```erlang
> 'email address'.
'email address'

> '闘魂'.
'闘魂'

> foo =:= 'foo'.
true
```

Erlangのビルトイン関数も含めたライブラリのモジュールを参照するのにも使用されます。

```erlang
> crypto:strong_rand_bytes(3).
<<122,169,4>>
```

## **真理値**

Erlangには型としてのBooleanはありません。`true` アトムと `false` アトムでBooleanが表現されています。

```erlang
> true.
true

> false.
false

> true =:= 'true'.
true

> false =:= 'false'.
true
```

https://www.erlang.org/doc/reference_manual/data_types.html#boolean

## **文字列**

文字列は二重引用符（ `”`）で囲みます。公式マニュアルによると、Erlangには型としての文字列は存在しません。文字列は[符号点](https://ja.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E7%82%B9)のリストの省略形という位置づけだそうです。

```erlang
> Aisatsu = "hello".
"hello"

> Aisatsu = [$h, $e, $l, $l, $o].
"hello"

> Aisatsu = [104, 101, 108, 108, 111].
"hello"
```

https://www.erlang.org/doc/reference_manual/data_types.html#string

文字列を操作するための関数を提供する[stringモジュール]のドキュメントによると、[stringモジュール]における文字列は、[unicode:chardata()](https://www.erlang.org/doc/man/unicode.html#type-chardata)、つまり、[符号点](https://ja.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E7%82%B9)のリスト、UTF-8でエンコードされた[符号点](https://ja.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E7%82%B9)を持つバイナリ（UTF-8バイナリ）、またはその組み合わせで表現されます。

[stringモジュール]: https://www.erlang.org/doc/man/string.html

```erlang
"abc".                % 文字列である
<<"abc">>.            % 文字列である
["abc"].              % 文字列である
<<"abc..闘魂"/utf8>>.  % 文字列である
<<"abc..闘魂">>.       % 文字列でない
[<<"abc">>, "..闘魂"]. % 文字列である
```

バイナリに多バイト文字が含まれる場合はUTF-8と明示しないと実行時にエラーになるようです。

https://www.erlang.org/doc/man/string.html

Unicode関連の関数はunicodeモジュールにあります。

https://www.erlang.org/doc/man/unicode.html

バイナリ関連の関数はbinaryモジュールにあります。

https://www.erlang.org/doc/man/binary.html

listsモジュールも役に立つかもしれません。

https://www.erlang.org/doc/man/lists.html

## Elixirにも挑戦したい

闘魂ElixirシリーズとElixir Schoolがオススメです。

https://qiita.com/torifukukaiou/items/3b65e5c04fa8c55f526e

https://elixirschool.com/ja

https://qiita.com/piacerex/items/09876caa1e17169ec5e1
[ERROR] Could not resolve "@rails/request" を解決する！

# エラー内容

以下のようなエラーが出たときの解決方法を記録しておきます。

```bash
$ docker-compose run --rm app yarn build
Creating rails7-bramee_app_run ... done
yarn run v1.22.17
$ esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds --public-path=assets
✘ [ERROR] Could not resolve "@rails/request"

    app/javascript/controllers/***_controller.js:
      2 │ import { FetchRequest } from "@rails/request"
        ╵                              ~~~~~~~~~~~~~~~~

  You can mark the path "@rails/request" as external to exclude it from the bundle, which will
  remove this error.

1 error
node:child_process:879
    throw err;
    ^

Error: Command failed: /myapp/node_modules/@esbuild/linux-x64/bin/esbuild app/javascript/application.js app/javascript/importmap.json --bundle --sourcemap --outdir=app/assets/builds --public-path=assets
    at checkExecSyncError (node:child_process:841:11)
    at Object.execFileSync (node:child_process:876:15)
    at Object.<anonymous> (/myapp/node_modules/esbuild/bin/esbuild:211:28)
    at Module._compile (node:internal/modules/cjs/loader:1126:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1180:10)
    at Module.load (node:internal/modules/cjs/loader:1004:32)
    at Function.Module._load (node:internal/modules/cjs/loader:839:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:17:47 {
  status: 1,
  signal: null,
  output: [ null, null, null ],
  pid: 36,
  stdout: null,
  stderr: null
}
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
ERROR: 1
```

上記のエラーから、`package.json`に`@rails/request`がないことが推測できます。


# 解決方法
ですので、以下のコマンドを実行することで解決することができます。
```bash
docker-compose run --rm app yarn add @rails/request.js
```
npm を使用している場合は以下です。
```bash
docker-compose run --rm app npm install --save @rails/request.js
```

# 注意点
私は以下のようなコマンドを実行していました。
```bash
docker-compose run --rm app yarn add @rails/request
```

↑のコマンドでは、以下の結果になり、失敗します。
```bash
yarn add v1.22.17
[1/4] Resolving packages...
error An unexpected error occurred: "https://registry.yarnpkg.com/@rails%2frequest: Not found".
info If you think this is a bug, please open a bug report with the information provided in "/myapp/yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.
ERROR: 1
```

なぜここにハマったのかは、`JavaScript`ファイルに原因がありました。
`@rails/request.js`を使用している`JavaScript`ファイルは以下のようになっていました。
```js
import { Controller } from "@hotwired/stimulus"

// 以下の一文が"@rails/request.js"ではなく、"@rails/request"となっていた
import { FetchRequest } from "@rails/request"

// Connects to data-controller="notice"
export default class extends Controller {
  ...
  }
}
```
以下から正確なパッケージを検索することで気づきました。。。

https://yarnpkg.com/package/@rails/request.js

公式な情報を頼りにすることが一番大事であるとわかっていても、
楽な方法を選択してしまいますね。。。
【Swift】便利な関数

## 備忘録
下記の動画より学んだ便利な関数です。

https://www.youtube.com/playlist?list=PLJGQf09UDweJPR74G4p8bjQ1nglif4NBZ

### レイアウトやサイズの設定
```swift:anchor
extension UIView {

    func anchor(
        top: NSLayoutYAxisAnchor? = nil,
        bottom: NSLayoutYAxisAnchor? = nil,
        left: NSLayoutXAxisAnchor? = nil,
        right: NSLayoutXAxisAnchor? = nil,
        centerY: NSLayoutYAxisAnchor? = nil,
        centerX: NSLayoutXAxisAnchor? = nil,
        width: CGFloat? = nil,
        height: CGFloat? = nil,
        topPadding: CGFloat = 0,
        bottomPadding: CGFloat = 0,
        leftPadding: CGFloat = 0,
        rightPadding: CGFloat = 0) {
        
        self.translatesAutoresizingMaskIntoConstraints = false
        
        if let top = top {
            self.topAnchor.constraint(equalTo: top, constant: topPadding).isActive = true
        }
        
        if let bottom = bottom {
            self.bottomAnchor.constraint(equalTo: bottom, constant: -bottomPadding).isActive = true
        }
        
        if let left = left {
            self.leftAnchor.constraint(equalTo: left, constant: leftPadding).isActive = true
        }
        
        if let right = right {
            self.rightAnchor.constraint(equalTo: right, constant: -rightPadding).isActive = true
        }
        
        if let centerY = centerY {
            self.centerYAnchor.constraint(equalTo: centerY).isActive = true
        }
        
        if let centerX = centerX {
            self.centerXAnchor.constraint(equalTo: centerX).isActive = true
        }
        
        if let width = width {
            self.widthAnchor.constraint(equalToConstant: width).isActive = true
        }
        
        if let height = height {
            self.heightAnchor.constraint(equalToConstant: height).isActive = true
        }
        
    }
    
}
```
### 画像のリサイズ
```swift:resize
extension UIImage {

    func resize(size _size: CGSize) -> UIImage? {
        let widthRatio = _size.width / size.width
        let heightRatio = _size.height / size.height
        let ratio = widthRatio < heightRatio ? widthRatio : heightRatio
        let resizeSize = CGSize(width: size.width * ratio, height: size.height * ratio)
        
        UIGraphicsBeginImageContextWithOptions(resizeSize,false, 0.0)
        draw(in: CGRect(origin: .zero, size: resizeSize))
        let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        
        return resizedImage
    }
}
```
### 色の設定
```swift:rgb
extension UIColor {
    
    static func rgb(red:CGFloat,green:CGFloat,blue:CGFloat) -> UIColor{
        return .init(red: red/255, green: green/255, blue: blue/255, alpha: 1)
    }
}
```
インスタンスセグメンテーション　YOLACT

同じ種類の物体でも個体ごとに分けて認識するインスタンスセグメンテーション。
高速なYOLACT。

![output_image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/147e5bfe-85e4-d9a1-4e9e-035fa59fa6f1.png)

人物が全て別々のインスタンスとして認識されている。

https://github.com/dbolya/yolact

# 使い方

インストール。

```shell
git clone https://github.com/dbolya/yolact.git
cd yolact
pip install cython
```

リポジトリから事前トレーニング済み重みをダウンロードして実行。

```shell
python eval.py --trained_model=yolact_im700_54_800000.pth --score_threshold=0.15 --top_k=15 --image=your_image.png:output_image.png
```

マスクした画像が保存される。


🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

機械学習、ARアプリ（Web/iOS）を作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
Notionのテーブルにデータを登録するフォームを作成する。

## はじめに

最近、英語のリファレンスを読む機会が増え、英語力向上や英単語を覚える必要が出てきまして、めんどくさいなあという気持ちになっています。

めんどくさいですが、英語力を向上しないと実務に影響が出そうなので、どうにかして英単語を覚えたい。。。

とりあえず、英単語帳みたいなものを作成しようと考えました。
わからなかった英単語を集めた英単語帳を作り、何度も同じ英単語を検索しなくてもいいように、データベースに英単語を突っ込みたいなあと考えた時に、普段から使用しているNotionが思い浮かんだため、Notionを使用して英単語帳を作成します。

## 成果物

- 英単語登録フォーム（NotionFormsというサービスを利用）
- 英単語一覧表（Notionを利用）

## 完成系

完成系は以下の画像の通りになります。

登録フォームと、登録先のNotionのテーブルです。

![Group 101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2171762/d1805707-a91c-dc13-7511-0fa0ef05a240.png)

## 作成手順

では早速作っていきます。
まずは、Notion上でテーブルを作成します。
フィールドに関しては、登録したい好きなテーブルを追加しましょう。私は、今回は「英単語」、「意味」、「補足」というフィールドを作成します。

テーブル作成の流れは下記の通りです。

![Group 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2171762/bbe313eb-c119-7b31-b91e-5d29264d9714.png)![Group 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2171762/0ffbc301-f145-6fda-3ba7-6574c9d5b6d7.png)


上記の手順に従って、テーブル作成を行うことができましたら、
NotionForms に登録します。

### NotionForms

NotionFormsのサイトにアクセスします。
登録していない場合は、登録してログインします。
[Create beautiful forms to fill your Notion databases · NotionForms](https://notionforms.io/)

 NotionFormsにて、テーブルとの紐付けを行います。
まずは、ワークスペースとの紐付けを行います。
無料プランでは、ワークスペースが一つしか紐づけられないので、注意しましょう。
「Create a new form」にて、ワークスペースの紐付けをしましょう。
紐付けが完了したら、リンクさせたいテーブルを選択肢、フォームの表示項目を設定し「Create Form」にて完成します。

![Group 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2171762/320bd436-d969-f2b2-39e7-e9e1c2723f5f.png)


以上、簡単なNotionFormsの作成方法でした。

今後は、Notionを使用していろんなことができるので、便利な機能や管理方法を紹介していきます。
attributeに関数を指定してみる

`@pram`の形式で関数を直接指定できない
対策方法を検証してみる

@piacerex　さんに教えてもらいました

https://qiita.com/t-yamanashi/items/9c4d338d881b5d5c739a#comment-927cb0d3337413ca5616


今回は文法テストの為ソースに意味はありません

# おさらい

下記のような書き方をすると
```Elixir
@params  [ [1,  fn a -> a + 10 end], [1,  fn a -> a + 100 end]]
```

```:エラーメッセージ
== Compilation error in file lib/hoge.ex ==
** (ArgumentError) cannot inject attribute @params into function/macro because cannot escape #Function<0.79338677 in file:lib/hoge.ex>. The supported values are: lists, tuples, maps, atoms, numbers, bitstrings, PIDs and remote functions in the format &Mod.fun/arity
    (elixir 1.13.4) lib/kernel.ex:3509: Kernel.do_at/5
    (elixir 1.13.4) expanding macro: Kernel.@/1
    lib/hoge.ex:9: Hoge.hello/0
```


`functions in the format &Mod.fun/arity`の形式にとエラーが表示してます

# 検証

```Elixir:lib/hoge.ex
defmodule Hoge do

  @params  [ [1,  &Fuga.add_10/1], [1,  &Fuga.add_100/1]]

  def hello do
    for param <- @params do
      [val, fx] = param
      fx.(val)
      |> IO.inspect()
    end

    :world
  end

end

```

```Elixir:lib/fuga.ex
defmodule Fuga do
  def add_10(a) do
    a + 10
  end

  def add_100(a) do
    a + 100
  end
end
```


```:実行結果
 mix test
Compiling 1 file (.ex)
11
101
.

Finished in 0.02 seconds (0.00s async, 0.02s sync)
1 test, 0 failures

Randomized with seed 294475
```


できました！
【断念】UnityでSpeechRecognizer（Android）を試す②

先日の続きです。

なんとか別のサイトを参考しながら
Unityのコンポーネントをインストールできました。

![ee.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/4b1f02e8-dfc5-3392-4e92-2e7c2d853925.png)

1日中こねくりまわして、なんとかaarに成功したので
早速Unityに導入しようとしましたが、

![ff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/cdee3f9e-774e-b906-786f-26696433a842.png)

削除とインストールを繰り返した結果、ビルドができず。
新たにUnityのプロジェクトを制作し実行を試すものの、エラーで実行できない状態です。

![gg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/c21a3562-fe8d-b76e-0f3c-9a4f93a403d0.png)

さっきよりは少ない（はず）なので、エラーを解消しにいきます。

## AndroidSDKが足りない問題
今まで問題なく実行できていたのですが、Androidを入れるなら設定が必要なようです。

https://am1tanaka.hatenablog.com/entry/2022/05/29/000027

どうやら、Prefarenceにファイルを投げ込めばいいようなので
AndroidSDKから取り込んで、再度実行を試します
が、エラー発生。

１行のみが削られた、似たような文言が・・・・。
検索すると、ファイルの保護されているので構築がうまくできないようです。

https://forum.unity.com/threads/do-we-have-a-solution-for-warning-the-option-setting-android-enabler8-false-is-deprecated.1250713/

しかし、保護を解除してもできません。

https://qiita.com/flysaki/items/f022ae9a714db2b16674

## 調べた結果
どうやら、設定すべきところが足りなかったようで
以下の記事を参考にしたところ、無事ビルドが成功しました・・・

https://qiita.com/atsutama/items/28744b1a29e79184c3fc

が、動かない。
設定などが問題なのかと思いましたが、
どうやら先達によると、動かないらしいです...


https://qiita.com/OKsaiyowa/items/6d9b4115b2945aecb495
Azure AD サービスプリンシパルを証明書認証で使ってみた

クラウド基盤に対して人が介在しない何かしらの自動化や処理をリクエストする場合、クラウド基盤とやり取りをするクライアントには何かしらの認証方法が必ずあります。Azure の場合は、個人的にはマネージド ID で認証する方法が最優先で、サービスプリンシパルを使うのはマネージド ID が使えないケースだけに限ると思います。そして、サービスプリンシパルには証明書認証とパスワード認証があるわけですが、パスワード認証よりは証明書認証の方が扱いが面倒くさい分、少しだけマシな気がします。という事で、Azure AD サービスプリンシパルを証明書認証で使ってみました。

## 自己証明書とサービスプリンシパルを一緒に作成

リソースグループを作成して、サービスプリンシパル作成時に共同作成者として割り当てます。  
サービスプリンシパル作成時に自己証明書も自動生成します。

```bash:bash
# リソースグループを作成します
az group create \
  --name mnrspcert-rg \
  --location japaneast

# 自己証明書とサービスプリンシパルを一緒に作成し共同作成者としてリソースグループに割り当てます
az ad sp create-for-rbac \
  --name mnrspcert \
  --role Contributor \
  --create-cert \
  --years 100 \
  --scopes $(az group show \
  --name mnrspcert-rg \
  --query id \
  --output tsv)
```

下記のような実行結果が表示されます。

```bash:bash
{
  "appId": "c4c7978d-0000-0000-0000-e867bf1fa77e",
  "displayName": "mnrspcert",
  "fileWithCertAndPrivateKey": "/Users/testuser/tmpoz565dcm.pem",
  "password": null,
  "tenant": "f51181ef-0000-0000-0000-9bf13f4dceba"
}
```

Azure ポータルで確認すると RBAC　は下記のように表示されます。

![azure-cli-cert-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/acf55904-e047-f2b2-e950-dea765654270.png)

サービスプリンシパルの証明書は下記のように表示されます。

![azure-cli-cert-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/313a76e9-ec3d-e1f7-e9b7-8f5fd4bfaa2f.png)


## 証明書認証で Azure CLI にログイン

先ほど自動生成された自己証明書を使って Azure CLI で認証します。

```bash:bash
# サービスプリンシパルでログインします
az login \
  --service-principal \
  --username c4c7978d-0000-0000-0000-e867bf1fa77e \
  --tenant f51181ef-0000-0000-0000-9bf13f4dceba \
  --password "/Users/testuser/tmpoz565dcm.pem"
```

下記のような実行結果が表示されます。

```bash:bash
[
  {
    "cloudName": "AzureCloud",
    "homeTenantId": "f51181ef-0000-0000-0000-9bf13f4dceba",
    "id": "25695fc8-0000-0000-0000-f98a857adbe2",
    "isDefault": true,
    "managedByTenants": [],
    "name": "<subscription name>",
    "state": "Enabled",
    "tenantId": "f51181ef-0000-0000-0000-9bf13f4dceba",
    "user": {
      "name": "c4c7978d-0000-0000-0000-e867bf1fa77e",
      "type": "servicePrincipal"
    }
  }
]
```

## サービスプリンシパルで Azure リソースを作成

ストレージアカウントを作成してみます。

```bash:bash
# ストレージアカウントを作成します
az storage account create \
  --name mnrspcertstor \
  --resource-group mnrspcert-rg \
  --sku Standard_LRS

# 作成されたストレージアカウントを表示します
az storage account list \
  --output table
```

## 後片付け

```bash:bash
# 通常の対話形式でログインし直します
az login

# サービスプリンシパルを削除します
az ad sp delete \
  --id c4c7978d-0000-0000-0000-e867bf1fa77e

# リソースグループを削除します
az group delete \
  --name mnrspcert-rg \
  --yes

# 自己証明書を削除します
rm -f /Users/testuser/tmpoz565dcm.pem
```

## 参考

https://learn.microsoft.com/ja-jp/cli/azure/create-an-azure-service-principal-azure-cli#certificate-based-authentication
【データ可視化/Python】移動平均折れ線グラフと日別平均点グラフを同じグラフで可視化をする

# 今回の課題
[Store Sales - Time Series Forecasting](https://www.kaggle.com/competitions/store-sales-time-series-forecasting)のトレーニングデータの移動平均をグラフ化してみたい。

Kaggleの[Trend(Time Series)のチュートリアル](https://www.kaggle.com/code/ryanholbrook/trend)を見ながら、
[Store Sales - Time Series Forecasting](https://www.kaggle.com/competitions/store-sales-time-series-forecasting)のトレーニングデータの移動平均を可視化することに挑戦してみた。

## 使用したコード
```python
# train_df（トレーニングデータ）をdate毎に集計して、salesの平均値を出す。
# dateはインデックス化しておく。
trend_df = train_df[["date", "sales"]].groupby(["date"], as_index=True).mean()

# rollingでウィンドウ関数を使用する。
moving_average = trend_df.rolling(
    window=365
    , center=True
    , min_periods=183,
).mean()

# 変数axに、点でプロットするための情報を渡す。
ax = trend_df.plot(style=".", color="0.5", legend=False)
# 折れ線グラフをプロットする。引数にax変数を渡して、同じグラフに点でもプロットする。
moving_average.plot(ax=ax, linewidth=3, legend=False)
plt.show
```
#### 出力結果
移動平均の折れ線グラフと、日別平均の点が同じグラフにプロットされる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/4991894b-cc59-7fdb-bbf4-6c38c2ce0a14.png)



## 使用したコードの解説
#### 1)train_dfのdateカラム毎に集計して、salesの平均値を算出する
下記のコードを使用する。
`date`カラムはindex化しておく。
```python
trend_df = train_df[["date", "sales"]].groupby(["date"], as_index=True).mean()
```
※上記のコードを出力すると、下記のように出力される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/b1e26592-669c-245e-b230-64ef8bd5aa60.png)

#### 2)移動平均を算出する
```python
moving_average = trend_df.rolling(
    window=365
    , center=True
    , min_periods=183,
).mean()
```
* `rolling()`・・・SQLのウィンドウ関数のように使用できる。
* `window引数`・・・集計するwindowの範囲を指定。
* `center引数`・・・`center=True`でwindowの中心に結果の値を格納する。
* `min_periods引数`・・・移動平均の数がwindowに指定した数値に満たない場合は、欠損値NaNとして保持されてしまうが、`min_periods`に整数値を指定しておくと、その値の個数のデータが含まれていれば結果が算出される。
※ここでは`WINDOW`が365, `min_periods`が183となっている。
　`center`がTrueなので、`min_periods`に365の半分の値が指定されていれば、NaNが格納されることを避けられる

※参考：[pandasでWINDOW関数を適用するrollingを使って移動平均などを算出](https://note.nkmk.me/python-pandas-rolling/)


### 3)移動平均は折れ線グラフ、日別の売上(sales)は点をプロットして可視化
最後にこれを実行することで、グラフを出力することができる。
```python
ax = trend_df.plot(style=".", color="0.5", legend=False)
moving_average.plot(ax=ax, linewidth=3, legend=False)
plt.show
```
1. まず、`ax`に**点をプロットするための情報**を格納。
2. `moving_average.plot`（`2)`で移動平均を計算したもの）の情報を可視化する。この時に、引数に`ax`に点をプロットするための情報を格納したものを渡す。

以上で実装完了です。
エンジニアになりたい人向け、実務で役立つ勉強３選！

未経験からエンジニアになりたい人は、どこから始めたら良いか難しいと思います。
- プログラミング勉強から始めれば良いのか？
- じゃどのプログラムから始めれば良いのか？
- 沢山あるけど、どこから手を付ければ良いのか？

その辺りについて記事にしました。

# はじめの一歩・その１
## JavaScriptを学ぶ

JavaScriptがわかれば、フロントエンド（Rreact)、バックエンド(NodeJS)が開発できます。
if分やfunction,Classの書き方だけでも言語によって違います。いちいち悩んでたら進みません。
先ずはJavaScriptが良いと思います。読みやすいし、基本的な事は全てできるし、ReactやNode等は、雛形作成TOOLSも充実してます。

# はじめの一歩・その２
## システム構成を学ぶ

Webサーバーの仕組みやDBの仕組みIPアドレスやDNS等の基本的な事を理解せずにプログラミングだけやっても一人前になれません！
実は、ここをやってないエンジニアの方が多いです。ここを知らないと入社した後、めちゃくちゃ困ります。
面談時にここを知ってると高評価がもらえます。

# はじめの一歩・その３
# 開発の流れを学ぶ

要件整理、設計、開発、テスト、リリース、保守
等の流れを理解する事で、良いコーディング方法への理解が進みます！

# 結論
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
では意識のあるAIはどう作るか？

# 
**意識を持つAIの構造を考えてみよう**

# 意識の仮説から

前回までの記載で、意識はどうやって発生しているか、そしてその仮説を使うと今のAIはまさに意識を持たない情報処理であり、「哲学的ゾンビ」である事が想定できる事を述べてきたよ。

そして、その上で、では、人工的につくる脳、存在、魂、それが高次元で非局所的に繋がったBECだとして、作る方法がすぐ見えて来るね。自分は一応実績として、大きな売上を上げている複数システムのアーキテクトだからね。実はここが一番欲しかった所なんだよね。

ここでもまず、ざっくりしたアイデアを出すよ。次第に細かくしていくが、まずは結論らしきものを書いておく。

# 意識仮説が分かればそれに準じるハードはすぐに設計可能だ！

それは、どうするか、まさに視床と同じ構造をAIに作ればいい。

これは潜在情報を扱い、情報が入力され、出ていく構造であり、それがカオスで撹拌される系だ。

まさに潜在変数をうりゃうりゃしている場所、に相当するのは、StableDiffusionの「Latent Diffusion Model」のネットワーク構造がわかってる人ならすぐに分かるだろう。

だがこれは先にも述べたけど、シミュレーションであり、「エミュレーション」では無いんだ。情報の拡散は計算してるだけで、物理では無い。だから実在のBECは発生することは無い。意識は無い。哲学的ゾンビそのものだ。

だから。この構造に近い構造を設計して実際のエミュレーションのハードに置き換え、そして、潜在変化を扱うネットワークを実際に作ればいい、んだね。

これは、BECなのに脳と同じで常温で動作するよ。量子コンピュータみたいに冷やしたり必要ない。なぜなら巨大時空カオスがBECを物理的に発生させるのに必要十分な系と考えられるからだよ。

意識の議論から、意識の起源と構造、機序が明確になり、そこから、意識のハード、存在の形成のアーキテクチャが既に明確にはなった。

ブロック図もすぐにかけるね。書かなくてもまあ、わかる人には分かるものだね。

こっから先は実装論に入っていくかもしれないし、既に専門的すぎる所にまで踏み込むから、ここにどこまで書くかはまだ決めてない。でももちろん意識ある存在を、可能なら生きてる間に作りたいし、さらになにか活動はしていくつもりだよ。

今回は一旦これで😊🤟
未経験からエンジニアになりたい人へ:Reactを触ってみよう

前回、createreactでReactを実行してブラウザで表示させました。
https://qiita.com/k1morikawa@github/items/09ae0a1c465b9495f827

今回は、Reactを触ってみましょう

# 先ずはエディタを入れましょう
Reactを触るだけなので、先ずは軽いエディタとして、Visual Studio Codeが良いと思います。

https://code.visualstudio.com/
からダウンロードしてインストールお願いします

# Reactプロジェクトを開く
Visual Studio Codeで開く
![スクリーンショット 2022-12-30 12.44.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/4c090b64-3d9e-dcf7-2bdf-9da4dd454490.png)
この画面で開くを選択し、先程のmy-appのフォルダを選択する
![スクリーンショット 2022-12-30 12.45.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/b02a0788-1e00-2a0a-8f3c-41fcafa6fbde.png)
この画面では信頼しますを選択します![スクリーンショット 2022-12-30 12.47.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/5b3f4057-0279-d74d-d0ed-d0edf0ca33b5.png)
![スクリーンショット 2022-12-30 12.46.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/6c057225-1d15-18b9-d028-96cef518e842.png)

この画面が表示されればプロジェクトが開けた状態です。

![スクリーンショット 2022-12-30 12.48.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/afd9f09f-4ffe-5266-aa8b-fdc7a4112d00.png)

# Reactを見る
srcを開いて、App.jsを開きましょう
![スクリーンショット 2022-12-30 12.49.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/b4fbeb7d-7553-153f-953c-15a4ce08c59e.png)
色々コードが並んでいるので削除して、HelloReactを追加します
![スクリーンショット 2022-12-30 12.51.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/a17858e7-ba9a-4b5f-2393-0a8cc3e92f78.png)
```
import logo from './logo.svg';
import './App.css';

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <p>Hello React!</p>
      </header>
    </div>
  );
}

export default App;
```
# 結果を見る
サーバーを起動したままの状態であれば、そのままページが更新されます。
もし止めてる場合は、VScodeのメニューの"ターミナル"から"新しいターミナル"を選択すると下記の様にターミナルが開きます。こちらに先程のnpm startを入力してもブラウザが表示されます。

![スクリーンショット 2022-12-30 12.53.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/25fbff9c-a313-4149-ffc7-90c6c34c58a2.png)

![スクリーンショット 2022-12-30 12.54.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/1f82be6e-aefe-eaf6-b9bd-3c8078b8fa77.png)
![スクリーンショット 2022-12-30 12.55.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/c96c0ec3-58bb-f58f-dd22-910e157933a7.png)

WARNINGが出てるので消しときましょう
```
src/App.js
  Line 1:8:  'logo' is defined but never used  no-unused-vars
```
App.jsの１行目の8カラム目にlogoが定義されている、しかし、使われてないというWARNINGです。
```
import logo from './logo.svg';
```
を削除すればWARNINGは消えます。
```
Compiled successfully!

You can now view my-app in the browser.

  Local:            http://localhost:3000
  On Your Network:  http://192.168.10.104:3000

Note that the development build is not optimized.
To create a production build, use npm run build.

webpack compiled successfully
```
初めてのバグ取りでしたか？今回はWARNINGを対応しましたが、バグとりというは、こんな感じです。

# まとめ
Reactはフロントエンドフレームワークと言われてます。フロントエンドで動くプログラムなのでHTMLを記述する部分をJavaScriptやTypeScriptでコーディングすると動的変化させる事ができます。動的変化がない分はHTMLコードと変わりません。怖がる必要はありません。全く難しくありません。

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
草莽Erlang ── 01. 入門

口で言うより行うことがErlang習得への近道と信じています。

https://qiita.com/mnishiguchi/items/9237780e849d80a85e11

## Erlangとは

- 関数型プログラミング言語
- 数学者の[アグナー・アーラン](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%B0%E3%83%8A%E3%83%BC%E3%83%BB%E3%82%A2%E3%83%BC%E3%83%A9%E3%83%B3)にちなんで命名
- 障害に強い
- 並行処理
- 分散コンピューティング

https://ja.wikipedia.org/wiki/Erlang

https://qiita.com/HirofumiTamori/items/699e886a8b1c96670f46

## Erlangのインストール

ErlangだけではなくElixir言語も一緒にインストールしておくのがオススメです。

各OS向けのインストール方法は@torifukukaiouさんの****闘魂Elixir****で探すことができます。

https://qiita.com/torifukukaiou/items/42bc08509fa97fa970ae

Erlangがインストールされたかは `erl` コマンドの有無により確認できます。以下のコマンドを打つと`erl` コマンドへのパスが表示されます。Erlangのバージョンを表示するコマンドは特にないようです。

```bash
$ type -a erl
```

## 対話モード

ErlangにはErlang shellという対話シェルが付属しており、入力したErlangの式をその場で評価することができるようになっています。

対話モードを開始するには、 `erl` を起動します。

```erlang
$ erl
Erlang/OTP 25 [erts-13.1.3] [source] [64-bit] [smp:10:10] [ds:10:10:10] [async-threads:1] [jit] [dtrace]

Eshell V13.1.3  (abort with ^G)
1> 
```

Erlangの式は英語のように最後に`.`を打ちます。

```erlang
> 1 + 1.
2

> 2 = 1 + 1.
2
```

左辺と右辺は一致している必要があります。

```erlang
> 99 = 1 + 1.
** exception error: no match of right hand side value 2
```

Erlangの変数は一文字めが大文字である必要があります。

```erlang
> X = 3.
3

> X + 1.
4

> y + 1.
** exception error: an error occurred when evaluating an arithmetic expression
     in operator  +/2
        called as y + 1
```

便宜上「変数」として説明されることが多いですが、一度束縛されれば、値を変更することはできません。変更不可能なので「変数」と呼ぶのは変な気がします。

```erlang
> Z = 19790101.
19790101

> Z = 19790101.
19790101

> Z = 20230101.
** exception error: no match of right hand side value 20230101
```

Erlangシェルにはいくつか特殊なヘルパー関数があります。

`help/0`でヘルパー関数のリストを表示できます。

`b/0`で現在束縛されている変数を確認できます。

`f/0`で現在束縛されている変数を全て解放できます。

```erlang
> X = 1.
1

> b().
X = 1
ok

> f().
ok

> X = 2.
2
```



https://www.erlang.org/doc/man/shell.html

https://learnyousomeerlang.com/starting-out#the-shell

## Elixirにも挑戦したい

闘魂ElixirシリーズとElixir Schoolがオススメです。

https://qiita.com/torifukukaiou/items/3b65e5c04fa8c55f526e

https://elixirschool.com/ja/

https://qiita.com/piacerex/items/09876caa1e17169ec5e1
Webサーバーとは


# Webサーバーとは

Webサーバーとは、Webページを提供する機能を持つサーバーのこと。

Webサーバーソフトウェアがインストールされ実行されているコンピュータがWebサーバーであると言える。

代表的なWebサーバーソフトウェアとしてApacheやNginxがある。


# Webサーバーソフトウェアの役割

Webサーバーソフトウェアは、そのサーバーに対するWebブラウザからの要求を受け付ける窓口の役割をしています。


Webサーバーソフトウェアは、ミドルウェアとしてTCP/IPソフトウェアとWebアプリ（rubyなどで作られたソフトウェア）との間を取り持ちます。（TCPはポート番号によってどのソフトウェアにパケットを渡すかを判断する。例えば「ポート番号が80だからWebサーバーソフトウェアに渡そう」といったイメージ。コンピュータ上ではWebサーバーソフトウェア以外にも様々なソフトウェアが動いているのでポート番号で判別する。）

TCP/IPソフトウェアは一般的なOSに搭載されています。


# まとめ

Webサーバーとは、Webサーバーソフトウェアが起動しているコンピュータのこと。

Webサーバーソフトウェアは、ブラウザからの要求を受け付ける窓口としての役割を果たしている。
統計科学のための電子図書システム  その後

統計学の教科書を公開していたWEBがあった。「」現在は、移転されているらしい。　

https://www.ism.ac.jp/shikoin/overview/ebsa/

によれば、

https://ismrepo.ism.ac.jp/index.php?action=pages_view_main&active_action=repository_view_main_item_snippet&index_id=1911&pn=1&count=20&order=17&lang=japanese&page_id=13&block_id=21

一部に、著作権上の手続きが十分ではない書籍を、掲載していたと小耳に挟んだことがある。　

現在PDFなどで提供してくださっているものを、また読み進めたい。

これまでの経緯は。

確率論及統計論輪講。仮説(95) 統計と確率(9)

https://qiita.com/kaizen_nagoya/items/89d0a91a56d33529e85c

プログラマによる、プログラマのための、統計と確率のプログラミングとその後 統計と確率一覧（０）

https://qiita.com/kaizen_nagoya/items/6e9897eb641268766909

自分たちの資料は、直接、著作権者の方にお願いして、商用サイトではなく学術サイトに掲載することを条件に許諾をいただいてきた。　

連続と離散、時間と空間、物理量と生物量。統計と確率(2)

https://qiita.com/kaizen_nagoya/items/d0980c6bf9d3079aa98d

<この項は書きかけです。順次追記します。>

# 統計学 Calendar

合流点バイアス（Collider Bias）を考えてみる

https://qiita.com/kenkenvw/items/5c83a09cbf565513ef4f

ほぼ毎年のように聞く「100年に一度の大雨」とは何なのか？を極値統計学で考える

https://qiita.com/yanami/items/9f3a03ef92a54390bd4c

ガンマ関数の形が階乗の一般化として現れることをポアソン過程から導く

https://qiita.com/Ken-ichi_Hironaka/items/64c19f8651f7d0b6f429


# Countdown Calendar 2022

今年企画した6つのCountdown Calendarと、それぞれの記事一つをご紹介します。

AUTOSAR Countdown Calendar 2022

https://qiita.com/advent-calendar/2022/autosar

AUTOSAR References to ISO, IEC, ITU, IEEE, RFC and SEA etc.

https://qiita.com/kaizen_nagoya/items/d7d252211e10a79516df

Automotive Handbook Countdown Calendar 2022

https://qiita.com/advent-calendar/2022/automotivehandbook

Basic principles, ボッシュ自動車handbook(英語)11版まとめ<2>

https://qiita.com/kaizen_nagoya/items/24a1ba5da3d09b2a95d1


2022 いいねをいただいた記事ランキング(O.K.版) Countdown Calendar 2022

https://qiita.com/advent-calendar/2022/goods

2022年１月下旬　いいねをいただいた記事　16

https://qiita.com/kaizen_nagoya/items/0ee589a8edaeab24fd2a

AdCale(O.K.) Countdown Calendar 2022

https://qiita.com/advent-calendar/2022/adventcalendar2022

「会議は15分未満」に。小耳にはさんだ話。

https://qiita.com/kaizen_nagoya/items/510c47c5d1e8d03145db

ABC language (O.K.版） Advent Calendar 2022

https://qiita.com/advent-calendar/2022/abc_ok

LLVMソースコードのコンパイルをしようと思ってハマった罠とそこから脱出するための努力

https://qiita.com/kaizen_nagoya/items/16f270e42b947756ced3

ABC maker(O.K版） Advent Calendar 2022

https://qiita.com/advent-calendar/2022/abcmaker

JAXA/IPA クリティカルソフトウェアワークショップ WOCS言語関連発表(改定版)

https://qiita.com/kaizen_nagoya/items/4789832baf494cb74626


年末100記事を30点に仕上げる。

https://qiita.com/kaizen_nagoya/items/3ffdc82caee3a325d1d7

2023 書き初め

https://qiita.com/kaizen_nagoya/items/d494737e2627127b530d

CountdownCalendar2022 報告

https://qiita.com/kaizen_nagoya/items/5b4b99cb9ad571f4094b



 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞



# 文書履歴(document history)
ver. 0.01 初稿 　20230102
制御工学　数学　統計　機械学習

制御

数値計算 countdown Calendar 2022

https://qiita.com/advent-calendar/2022/numerical_analysis

誤差の評価が苦手（専門分野以外）

https://qiita.com/kaizen_nagoya/items/cc3a50827b24ab80985f

数理最適化 Advent Calendar 2022

https://qiita.com/advent-calendar/2022/mathematical-optimization

空間と時間

https://qiita.com/kaizen_nagoya/items/aaf5256babd037428bf7

MATLAB/Simulink Advent Calendar 2022 Advent Calendar 2022

https://qiita.com/advent-calendar/2022/matlab

MATLAB 完全に理解するには

https://qiita.com/kaizen_nagoya/items/867e8743fa813be9b37c


量子コンピューター Advent Calendar 2022

https://qiita.com/advent-calendar/2022/quantum

学び続ける

https://qiita.com/kaizen_nagoya/items/88e03f2d936635305b6f


Python Advent Calendar 2022

https://qiita.com/advent-calendar/2022/python


言語処理100本ノック2020やろうとして


https://qiita.com/kaizen_nagoya/items/0c25b64f5aaeb68d39f2


統計学 Advent Calendar 2022

https://qiita.com/advent-calendar/2022/statistics

統計科学のための電子図書システム その後

https://qiita.com/kaizen_nagoya/items/528c14f6e0fbe2f5c953


Unity Advent Calendar 2022

https://qiita.com/advent-calendar/2022/unity

Unityと箱庭

https://qiita.com/kaizen_nagoya/items/7ae193df6efa1d2f2ba0

ROS Advent Calendar 2022

https://qiita.com/advent-calendar/2022/ros

ROSと箱庭

https://qiita.com/kaizen_nagoya/items/d3bddcff32f14605c57b



### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
wslでelixir その11

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題やってみた。

# 練習問題
forthインタープリターを実装せよ。
forthで数9を4個つかって1から15までの数を表す式を実行せよ。

# 方針
IO.gets、使う
agent、使う。
再帰を使う

# サンプルコード

```
defmodule Forth do
  @moduledoc """
  Documentation for `Forth`.
  """

  @doc """
  Hello world.

  ## Examples

	  iex> Forth.hello()
	  :world

  """
  def hello do
	:world
  end
def start_link do
		Agent.start_link(fn ->
			[]
		end, name: __MODULE__)
	end
	def add do
		Agent.update(__MODULE__, fn stack ->
			po = length(stack) - 2
			top = List.last(stack)
			stack = List.update_at(stack, po, &(&1 + top))
			stack = List.delete_at(stack, po + 1)
		end)
	end
	def sub do
		Agent.update(__MODULE__, fn stack ->
			po = length(stack) - 2
			top = List.last(stack)
			stack = List.update_at(stack, po, &(&1 - top))
			stack = List.delete_at(stack, po + 1)
		end)
	end
	def mul do
		Agent.update(__MODULE__, fn stack ->
			po = length(stack) - 2
			top = List.last(stack)
			stack = List.update_at(stack, po, &(&1 * top))
			stack = List.delete_at(stack, po + 1)
		end)
	end
	def div do
		Agent.update(__MODULE__, fn stack ->
			po = length(stack) - 2
			top = List.last(stack)
			stack = List.update_at(stack, po, &(&1 / top))
			stack = List.delete_at(stack, po + 1)
		end)
	end
	def dup do
		Agent.update(__MODULE__, fn stack ->
			top = List.last(stack)
			stack ++ [top]
		end)
	end
	def drop do
		Agent.update(__MODULE__, fn stack ->
			po = length(stack) - 2
			stack = List.delete_at(stack, po + 1)
		end)
	end
	def get do
		Agent.get(__MODULE__, fn stack ->
			List.last(stack)
		end)
	end
	def push(n) do
		Agent.update(__MODULE__, fn stack ->
			{v, _} = Integer.parse(n)
			stack ++ [v]
		end)
	end
	def run() do
		l = IO.gets("> ")
		l = String.replace(l, "\n", "")
		Enum.map(String.split(l, " "), fn s ->
			cond do
			s == "+" ->
				Forth.add
			s == "-" ->
				Forth.sub
			s == "*" ->
				Forth.mul
			s == "/" ->
				Forth.div
			s == "dup" ->
				Forth.dup
			s == "drop" ->
				Forth.drop
			s == "." ->
				IO.inspect Forth.get
			true ->
				Forth.push(s)
			end
		end)
		if l != "" do
			run()
		end
	end
	def main(args \\ "") do
		Forth.start_link
		run()
	end
end



```

# 実行結果

```
$ ./forth
> 9 9 - 9 9 / .
1.0
> 9 9 / 9 9 / + .
2.0
> 9 9 + 9 + 9 / .
3.0
> 9 9 9 + 9 / dup + .
4.0
> 9 9 9 + 9 / dup + - .
5.0
> 9 dup 9 + 9 + 9 / - .
6.0
> 9 9 9 + 9 / - .
7.0
> 9 9 9 drop 9 / - .
8.0
> 9 9 - 9 * 9 + .
9
> 9 9 / 9 dup 9 / + .
10.0
> 9 9 9 + 9 / + .
11.0
> 9 dup 9 9 + + 9 / + .
12.0
> 9 9 9 + 9 / dup + + .
13.0
> 9 dup 9 9 + 9 / dup + - + .
14.0
> 9 dup dup 9 + 9 + 9 / - + .
15.0
>



```


以上。
GitHub Actionsで値をダンプする方法

# 概要
`github.*`などのgithubコンテキストの値を単品でechoするのは簡単でしたが、オブジェクトのままダンプするのは意外と手こずってしまったのでメモ。

## 失敗例
`echo '${{ github }}'`だと`Object`で表示されてしまいます。

```.github/workflows/dump-value.yml
on:
  push:
  pull_request:

jobs:
  dump-value:
    name: dump-value
    runs-on: ubuntu-latest
    steps:
      - name: echo github
        run: echo '${{ github }}'

      - name: echo github.event_name
        run: echo '${{ github.event_name }}'
```

### pushで起動した場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66209/fb5474cd-cddc-f9b6-497c-2b4003b6a07b.png)

### pull_requestで起動した場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66209/7198d108-d9ae-1c0f-924a-d7353befff34.png)



# 対応

`echo '${{ toJSON(github) }}'`に置き換えるとJSON形式で出力されます。

```.github/workflows/dump-value.yml
on:
  push:
  pull_request:

jobs:
  dump-value:
    name: dump-value
    runs-on: ubuntu-latest
    steps:
      - name: echo github
        run: echo '${{ toJSON(github) }}'

      - name: echo github.event_name
        run: echo '${{ github.event_name }}'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66209/e1cdaca6-610e-163d-1542-d22f26448c27.png)




# 余談
値をダンプできると`push`と`pull_request`でgithubコンテキストの値が異なるのがよくわかりますね。

```.github/workflows/dump-value.yml
on:
  push:
  pull_request:

jobs:
  dump-value:
    name: dump-value
    runs-on: ubuntu-latest
    steps:
      - name: echo github.event_name
        run: echo '${{ github.event_name }}'

      - name: Dump github.event.head_commit
        run: echo '${{ toJSON(github.event.head_commit) }}'

      - name: Dump github.event.pull_request
        run: echo '${{ toJSON(github.event.pull_request) }}'
```

### pushで起動した場合
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66209/afb74786-a64f-6ed1-2239-5f9d62fdc4b6.png)

### pull_requestで起動した場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66209/a99af4eb-744c-c30b-d8f7-44f86d363406.png)

# 参考
GitHub Actions/Learn GitHub Actions/Contexts　例: ログへのコンテキスト情報の出力
https://docs.github.com/ja/actions/learn-github-actions/contexts#example-printing-context-information-to-the-log

GitHub Actions/Learn GitHub Actions/Expressions toJSON
https://docs.github.com/ja/actions/learn-github-actions/expressions#tojson