OmniAICreator/Qiita-1.07M huggingface dataset:
FlexとGridの個人的な使い分け

[ひとりCSS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/css-becolomochi) 12日目です。

今日はポエムです。Flex と Grid の個人的な使い分けについて書きます。

## どっちがいいの

Flex も Grid も一長一短ある

- Flex のほうが直感的に組める
    - flex も使えるけど width で横幅を指定できる
    - float の時代からマークアップやっていた人はたぶん脳死で組める
- Grid は技術的に将来有望
    - 単純に情報を追いかけるだけでもたのしい（感想）
    - 今、ページのレイアウトを組むなら Flex より Grid のほうがいいのかもなあと思う
        - ボックスに名前つけられるし
    - Masonry レイアウトとか3行で書けるの夢がある（実装はこれから）
- 結論
    - ページのレイアウトを組むなら Grid
    - ページの中のコンテンツでちょっと横並びにしたいときは Flex
- 異論は認める。他の人と議論したい。ぜひお願いします。

## Flex と Grid の共通点

- gap で余白指定できる
    - ほんと良い、助かってる
- minmax() などを使えばレスポンシブしやすい
    - もちろんメディアクエリでもいいのだけどブレークポイントでガタっと一気にレイアウトかわるのが気になったりする
    - コンテンツを大事にしたいからどの幅でも綺麗に見せたい
    - が、実装スピード優先でメディアクエリで実装してしまっているな〜

## まとめ

CSS 便利になったよね、実装者にフレンドリーになってる。ありがたい。一生推す。
めっちゃ駄文だった…すみません。
RustからWebAssemblyにコンパイルする（1）



# 概要
https://developer.mozilla.org/ja/docs/WebAssembly/Rust_to_wasm

RustもWebAssemblyもほぼわからない筆者が、MDNのRustからWebAsemblyにコンパイルするチュートリアルをゆっくり理解しながら記録を残す記事です。


## Rustのインストール
https://www.rust-lang.org/tools/install

```bash
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ source "$HOME/.cargo/env"
$ rustc --version
rustc 1.65.0 (897e37553 2022-11-02)
```

以下のことを実施しました。

https://doc.rust-jp.rs/book-ja/ch01-00-getting-started.html

- rustupで最新の安定版のRustをインストールする
- 新しいRustのバージョンに更新する
- ローカルにインストールされたドキュメントを開く
- 「Hello, world!」プログラムを書き、rustcを直接使って実行する
- Cargoにおける習慣に従った新しいプロジェクトを作成し、実行する

## VSCodeにRust用のextensionをインストール
Rustのextensionはdeprecatedでした。

https://marketplace.visualstudio.com/items?itemName=rust-lang.rust


代わりに、rust-analyzer extensionをインストールしました。

https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer

また、Cargo.tomlを編集するようにBetter TOMLをインストールしました。

https://marketplace.visualstudio.com/items?itemName=bungcip.better-toml

## WebAssemblyパッケージのビルド
### プロジェクトの準備
`cargo new` で新しいプロジェクトを作成しますが、その際に `--lib` オプションを指定しています。
これはcargoが用意してくれるライブラリ作成用のテンプレートプロジェクトを作成してくれているようです。

```bash
$ cargo new --help
--lib                    Use a library template
```

```bash
$ cargo new --lib hello-wasm
```

一度作られたプロジェクトを見てみます。

```bash
$ tree .                   
.
├── Cargo.lock
├── Cargo.toml
├── src
│   └── lib.rs
└── target
```

- Cargo.toml
Cargの設定のマニフェストファイルで、tomlで記述する。
別のパッケージへの依存等を記載する。

- Cargo.lock
Cargo.lockはCargoの最新コミットを取得して、最初にビルドする際にその情報を書き込んだものでパッケージのバージョン等を管理する。

- lib.rs
Rustのコードを記述するファイル。

- target
コンパイルされた実行ファイルが格納されるディレクトリ。


### Rustを書いていく

```rust
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
extern {
    pub fn alert(s: &str);
}

#[wasm_bindgen]
pub fn greet(name: &str) {
    alert(&format!("Hello, {}!", name));
}
```
---

```rust
use wasm_bindgen::prelude::*;
```

`wasm_bindgen::prelude` モジュールにあるものをすべてインポートしている。

https://rustwasm.github.io/docs/wasm-bindgen/introduction.html


wasm-bindgenを利用することで、JavaScript/wasmが文字列、JavaScriptオブジェクト、クラスなどと通信できるようにするためのプロジェクト。RustでJavaScriptのクラスを定義したり、JavaScriptから文字列を受け取ったり、返したりすることができます。

`use`キーワードを使用することで、指定したパッケージの要素がローカルにあるかのように呼び出すことができます。

---

```rust
#[wasm_bindgen]
extern {
    pub fn alert(s: &str);
}
```

#[ ] の内側は「アトリビュート」と呼ばれ、次に来る文を何らかの形で修飾します。この場合、その文は外部で定義された関数を呼び出したいことを Rust に伝える extern です。アトリビュートは「wasm-bindgen はこれらの関数を見つける方法を知っている」ということを意味しています。

`extern` はC言語ライブラリなどのその他の言語ライブラリを呼び出すことができます。ここでは、JavaScriptによって提供されるalert関数です。

JavaScript関数を呼び出したいときは、いつでもこのファイルに追加すれば、wasm-bindgenがセットアップを助けてくれる。

`pub` キーワードを付けることによって、下のgreet関数でアクセスできるようになります。

---

```rust
#[wasm_bindgen]
pub fn greet(name: &str) {
    alert(&format!("Hello, {}!", name));
}
```

Rustの関数定義は、`fn`キーワードによって始まります。
greetという名前の関数に対して、nameという引数を受け取ります。 `&str`は文字列を表す型です。
macOS環境にて、gccコンパイルを実行する方法

# 本記事について
macOS環境にて、gccコンパイルを実行する方法について記述します。　

# 実行環境　
・macOS Ventura 13.0.1
・Homebrew GCC 12.2.0

# 問題点
下記のiostreamライブラリを使用したCソースをgccコンパイラでコンパイルしようとすると、fatal error(＝致命的なエラー)が発生してしまう。　


■Cソース
```cpp
  1 #include <iostream>
  2 using namespace std;
  3 
  4 int main(void){
  5 
  6         string name1, name2;
  7 
  8         name1 = "Satoshi ";
  9         cin >> name2;
 10         cout << "Hello, " + name1 + " " + name2 << endl;
 11 
 12         return 0;
 13 }
 ```


■実行結果　
「ヘッダーファイルwchar.hは存在しません。」という感じの致命的エラーが発生します。

```c
% gcc -g main.cpp
In file included from /opt/homebrew/Cellar/gcc/12.2.0/include/c++/12/bits/postypes.h:40,
                 from /opt/homebrew/Cellar/gcc/12.2.0/include/c++/12/iosfwd:40,
                 from /opt/homebrew/Cellar/gcc/12.2.0/include/c++/12/ios:38,
                 from /opt/homebrew/Cellar/gcc/12.2.0/include/c++/12/ostream:38,
                 from /opt/homebrew/Cellar/gcc/12.2.0/include/c++/12/iostream:3,
                 from main.cpp:1:
/opt/homebrew/Cellar/gcc/12.2.0/include/c++/12/cwchar:44:10: fatal error: wchar.h: No such file or directory
   44 | #include <wchar.h>
      |          ^~~~~~~~~
compilation terminated.
```
　
# 解決方法　
コンパイル時に下記のオプションを加えることにより、 上記のような致命的なエラーが発生しなくなります。 

```c
% g++ --sysroot=$(xcrun --show-sdk-path) main.cpp
```

やはり、xcrunコマンドを用いてSDKヘッダーパスをsysrootオプションに指定する必要があるみたいだ…
```c
% xcrun --show-sdk-path
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
% cd `xcrun --show-sdk-path`
% pwd
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
% find ./ -name 'wchar.h'   
.//usr/include/c++/v1/__support/solaris/wchar.h
.//usr/include/c++/v1/wchar.h
.//usr/include/wchar.h
```

これでgccコンパイラはwchar.hを参照することが出来る。
シングルサインオン（SSO）＆ OIDC



```bash

通常のサービスで、サービスごとにIDやパスワードを入力しログインする必要がある。
また利用するサービスが多岐にわたると、パスワードを忘れてしまったり、面倒だからといつも同じパスワードを設定してしまいがち

こういったリスクを低下させるセキュリティツールがシングルサインオンの長所となる

その他
複数のアカウント情報をまとめて管理することで、個々のIDやパスワードを覚えておく必要がなくなり、ユーザの管理負担や失念したためにログインできない、といったリスクを軽減することも可能となる

また、ID統合システムと比較して対象アプリケーション側の認証システムを調整する必要がないため、導入期間が短く、かつ低コストで導入できる。

ここまではメリットの部分。
しかし、デメリットがないわけでもない。

以下のようなデメリットもある。＆
1パスワードの流出による被害が増加する
SSOの場合、全てのアカウントにログインできてしまい、不正利用されてしまうリスクもある。

2システム停止によりログインができなくなる
シングルサインオンに関わるシステムが停止してしまうと、そもそもログインができなくなってしまう。

シングルサインオンの５つの方式

エージェント方式
リバースプロキシ方式
代理認証方式
透過型方式
フェデレーション方式

という方式が存在する。
上記の違いや特徴も併せて覚えておくと、よりよい使い方ができると思われる

```

OIDCについて

```
OpenID Connectとは
SSOを実現する仕組みの一つで、OAuth 2.0を認証のために拡張させたものがOpenID Connect。
OpenID Connectは1.エンドユーザー、2OpenID Provider と 3.Relying Party という三構成で成立するもの。

1.Relying Partyの認証が必要な画面にユーザーがアクセスした際、OpenID Providerに対して認証(認可)リクエストを行う。
⇨人間

2.このとき表示された認証・認可画面でユーザーが操作を行い、OpenID Providerがレスポンスを返す。
⇨サーバーの画面

3.このレスポンスに認可コードが含まれる。
⇨サーバーの画面に移し出されるコードはOIDCの機能である。

もう少し深く記載して実装することにいたします。
因みにインストールする難易度はそこまで複雑ではありません。

```
エンジニアの失敗との向き合い方

### はじめに

`失敗した時が一番成長している時`
若田宇宙飛行士の、心にぐっと来た言葉です。

エンジニアにとっても、失敗から得られる知識や経験は代えがたい貴重なものです。
ただし、失敗には苦痛が伴い、落ち込んだり自信を無くしてしまう場合もあります。
メンタルが強くない場合(自分のことです)、立ち直るのに時間がかかったりします。

そこで、エンジニアの失敗との向き合い方を考えてみます(あくまで個人的な見解です)。

### まず、エンジニアの失敗には種類が存在します

- 製品リリース前の開発やテストフェーズで発覚した小さな(?)失敗
    - 設計時の仕様考慮不足
    - コーディングミス
    - テストケース漏れ

- 本番導入、サービズイン後に発生した大きな(?)失敗
    - システム障害によりお客様の業務が止まる
    - 脆弱性により不正アクセスや情報漏洩が発生

小さな失敗は、ほとんどのエンジニアが経験するものではないでしょうか。
「バグを起こさない唯一の方法はコードを書かないこと」と言われるほどですので。
恥ずかしい思いはしますが、そこから学べるものがたくさんあるので、
前向きに受け止めたいです。

大きな失敗は、会社とお客様に甚大な影響を及ぼします。
お客様への説明と謝罪だけで済まず、損害賠償を求められることすらあります。
それを教訓に次の成長につながるかもしれませんが、代価があまりにも大きい、
可能であれば未然に防ぎたいです。

### つぎに、いかに失敗を小さなものにとどめるかを考えます

小さな失敗が大きな失敗に発展し痛い目に遭う前に、対策を講じておきたいです。

- テストに手を抜かない

納期を守るため、レグレッションテストなどを絞りたくなる場合があります。
その時は、本番環境でバグによる致命的な障害が発生するリスクを考えてみます。
スケジュールを調整してでも、必要なテストをしっかり通しておきたいものです。

- チーム連携と情報共有を怠らない

ほとんどのプロジェクトは個人戦ではなくチームプレイです。
課題は一人で抱え込まず、早め早めにメンバーと共有し、意見を求めます。
積極的にコードレビューを受けることで、製品出荷前にバグを潰しておきたいです。

- 他人のアドバイスや意見を求める

同じ課題について、様々な視点や解決方法が存在するかもしれません。
たとえ、自分の案が正しいと思っても、メンバーの考え方やアドバイスを聞いてみる。
「このような発想やアイディアもあるんだ」と、気づきやヒントをいただけるかもしれません。

- 上司への報告を怠らない

タスクの進捗不調や課題を、手が打てる内に上司に相談することが重要です。
上司にリスクを報告することで、責任が共有でき(責任転嫁ではありません)、
会社やお客様の利益を守るとともに、結局は自分自身を守ることになります。

### 後悔を長い間引きずらないためには

悩むだけでは何も変わりません。

- 後悔の時間がもったいないので、自分の力で改善できることに目を向けてみる
- 振り返りを行い失敗原因と対策をまとめたら、過去の失敗は忘れる
- 同じ失敗を繰り返さないため、スキル向上とナレッジ蓄積に励み、自分の価値を高める

### おわりに

過去の失敗ですが、自分のコーディングミスでお客様業務に影響を与えてしまったことがありました。
お客様から原因と対策について厳しく追及され、パニック寸前になったことを鮮明に覚えています。

それ以来、出荷前の成果物に対し、自らメンバーにレビューや指摘をお願いするようになりました。
出荷前に、問題点やバグを見つけてくれることが、どれだけありがたいことか気付いたからです。

だれもが失敗をします。
その失敗を糧に、つぎの成長につなげたいものです。
失敗を乗り越え、自ら成長することで、新しい景色が見えてくることを信じて。
【Go】chi の組み込み middleware にカスタムロガーを設定しようと思ってやめた話

# はじめに
- go の web フレームワークライブラリとして [chi](https://github.com/go-chi/chi) がある
- http リクエスト/レスポンスをインターセプトして共通処理をする middleware が差し込めるようになっている
- よく使われるものは chi が用意してくれており、自前で書かなくても使えるようになっている

# 経緯
- リクエスト処理中に panic した時用に、panic ハンドリングをする middleware を差し込みたかった
- chi が用意してくれているものがあるので、それを使おうとした
- これが内部的にエラーログを出力するが、デフォルトだと改行されてズラズラ出力されるので、それを構造化された形（json）で出力したかった
    - アプリケーション内では [zap](https://github.com/uber-go/zap) を使っており、middleware 内でもそのカスタムロガーを使ってログを吐きたかった

# tl;dr
- ロガーをカスタムするのが面倒そうだったので、結局 chi の用意してくれたものを使うのではなく、panic ハンドラを自作してそれを差し込んで使うようにした
    - 内容的には大した実装ではない
    - 自分で書くなら、自分で作ったロガーを使って好きにログを吐くようにできる
- chi が提供している midleware の中でログを吐くのは panic ハンドラーと、アクセスロギングのハンドラーしかなく、後者も自作したかったため、この対応で特に問題なかった
    - アクセスロギングは、提供されている interface に則ると、出力したいものが出力できなかったため自作した

# middleware にロガーを設定する
結局使わなかったが、もし設定するならどうやるか

## 方法1 chi の RequestLogger middleware を使う
そもそも、chi の middleware にはカスタムロガーを設定するというオプションはなく、アクセスログを自動で吐くための `RequestLogger` という middleware しか用意されていない。

https://github.com/go-chi/chi/blob/0fe6bf1ba3ac601700b7993bc4c62f6c5f707932/middleware/logger.go#L42-L43

この `RequestLogger` の引数にロガーを渡すことができ、それは chi の定めたロガー `LogFormatter` interface を実装している必要がある。
```go
// LogFormatter initiates the beginning of a new LogEntry per request.
// See DefaultLogFormatter for an example implementation.
type LogFormatter interface {
	NewLogEntry(r *http.Request) LogEntry
}

// LogEntry records the final log when a request completes.
// See defaultLogEntry for an example implementation.
type LogEntry interface {
	Write(status, bytes int, header http.Header, elapsed time.Duration, extra interface{})
	Panic(v interface{}, stack []byte)
}
```

以下は chi が用意する example コード。

https://github.com/go-chi/chi/blob/master/_examples/logging/main.go

上記の例では [logrus](https://github.com/sirupsen/logrus) を使い、chi のロガー interface を満たした struct にそれを持たせて使う、という形になっている。
見ての通り、interface を満たすために、多くのコードを書かないといけなく、ちょっと辛い。

で、この middleware を設定すると内部的にはリクエスト context にそのロガーを突っ込んでおり、panic ハンドラーでは context からロガーを取り出して使う実装になっているので、副次的に panic ハンドラーのロガーも更新されるという形になっている（分かりづら...）。


それから、panic ハンドラーのロガーを変えたいだけなのに、アクセスログも出るようになってしまうし、context に勝手にロガーオブジェクトを突っ込まれてしまう。
もちろん、`NewLogEntry` と `Write` メソッドの実装を空にしておけば何も出力されないが、ちょっと気持ち悪い。

## 方法2 go-chi/httplog を使う
https://github.com/go-chi/httplog 

readme に書いてある通り、`httplog` のロガーを作って `httplog.RequestLogger(logger)` で middleware に設定する。

```main.go
// Logger
logger := httplog.NewLogger("httplog-example", httplog.Options{
    JSON: true,
})

// Service
r := chi.NewRouter()
r.Use(httplog.RequestLogger(logger))
```

- 単に json にしたいだけならお手軽な方法ではある
    - オプションを指定することで json にしたりログレベルを変えたりなどが可能っぽい
- しかし、内部的に [zerolog](https://github.com/rs/zerolog) が使われるようで、自作のロガーを使うことはできない

# よもやま
chi のリクエスト/レスポンスロギング middleware の何が微妙だったか

- レスポンスのログにパス名を含められない
- リクエストとレスポンスでそれぞれログを吐かないといけない
    - このリクエストに対してこのレスポンスをした、というのを一つのログで吐きたかった
- ということで、結局以下のように自分で作った middleware を使っている
    - https://qiita.com/nakaryooo/items/8d12d284c9caceb9c947
embotをブラウザからLチカ

タカラトミーから発売されている embot は
スクラッチにも似たGUIでプログラミングして
LEDの点灯消灯やブザー鳴らし、サーボの回転ができる製品です。

https://www.takaratomy.co.jp/products/omnibot/embot/

embot の中心である embotコア は BLE で通信可能のようなので
今回はブラウザの WebBluetooth でLチカしてみたいと思います。  
本記事でブラウザは Win11 の Microsoft Edge 108 を使用しました。

下記のように index.html と index.js を作成し
index.html を Edge に読み込みます。  
※エラー処理は省略しています。

```index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Lチカ</title>
</head>
<body>
<button onclick="_start()">開始する</button>
<button onclick="_on()">つける</button>
<button onclick="_off()">消す</button>
<script src="index.js"></script>
</body>
</html>
```

```index.js
const _uuid = (s) => {
    return `f7fce5${s}-7a0b-4b89-a675-a79137223e2c`;
};
let _char = null;
const _write = async (char, val) => {
    const buf = new Uint8Array(1);
    buf[0] = val;
    await char.writeValueWithoutResponse(buf.buffer);
};
const _start = async () => {
    const blue = window.navigator.bluetooth;
    try {
        const opt = {
            optionalServices: [ _uuid('10') ],
            filters: [{ namePrefix: 'EMBOT_' }]
        };
        const device = await blue.requestDevice(opt);
        const server = await device.gatt.connect();
        const service = await server.getPrimaryService(_uuid('10'));
        const char = await service.getCharacteristic(_uuid('15'));
        _char = char;
    } catch(e) {
        console.error(`_start catch`, e.message);
    }
};
const _on = () => {
    _write(_char, 1);
};
const _off = () => {
    _write(_char, 2);
};
```

赤LEDを JP4 に差し込み embotコア の電源を入れます。

「開始する」をクリックすると embot をスキャンするので選択してペアリングします。
「つける」ボタンをクリックするとLEDがつきます

|実行結果1|
|:-:|
|![embot03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213145/f4d5be17-d3c4-82dc-aab7-e352f60c2176.png)|
|ブラウザが BLE デバイスペア設定ダイアログを出します。|

|実行結果2|
|:-:|
|![embotl04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213145/e409734f-9c34-8c28-f0f1-45d38db567af.jpeg)|
|ぴかー|

ボードとかには詳しくないので
分解したりはしていません、あしからず。  
ぐぐってみたところ、先駆者によると
esp32のようでした。
python で glob を使って特定パターンのパスを取得したい

# はじめに
今更な内容ではあるが、タイトルの通り。
pathlib も同じようなことができるが、python3.7以降(？)は結果をlenでチェックできなかったり、listでキャストすると内容が消えたり(？)して使い勝手が悪い。

# 環境
- windows10 pro 
- wsl2(20.04.5 LTS (Focal Fossa))
- Dockerのバージョン
    - Docker version 20.10.18, build b40c2f6
    - docker-compose version 1.29.2, build 5becea4c
※Docker Desktop ではありません
- python 3.10.7

# （対象パターンを取得する）フォルダ構成
```
/tmp
  ├ abc
  │  ├ temp1.txt
  │  └ temp2.txt
  ├ def
  │  └ temp4.txt
  ├ ghij
  │  └ sample2.txt
  ├ klm
  │  └ sample3.txt
  ├ nop
  │  └ sample4.txt
  ├ temp3.txt
  ├ sample.txt
  └ sample1.txt
```

# 目的
- 特定のフォルダ(今回は上記の `/tmp` )からファイル名`sample`を含むテキストファイルを取得したい

# コード
```python
import glob

# パターンを取得
files = glob.glob("/tmp/**/sample*.txt", recursive=True)

# 出力（１つ以上取得できているかのチェック）
if len(files) > 0:
    # ループ処理
    for file in files:
        # 単一のパスに対しての処理
        print(file)
```

## 出力結果
```
/tmp/sample.txt
/tmp/sample1.txt
/tmp/nop/sample4.txt
/tmp/klm/sample3.txt
/tmp/ghij/sample2.txt
```

## ちなみに
`recursive`(再帰設定)なしで実行すると `/tmp` 直下のフォルダは対象外になる
```python
files = glob.glob("/tmp/**/sample*.txt")
```
```
/tmp/nop/sample4.txt
/tmp/klm/sample3.txt
/tmp/ghij/sample2.txt
```

以下でも結果は同じ
```python
files = glob.glob("/tmp/*/sample*.txt")
files = glob.glob("/tmp/*/sample*.txt" recursive=True)
```

※ `**` に意味が出てくる認識でよいかと


# 最後に
`?`とか`[X-X]`とかのパターン表現もあるが、やり始めるときりがないので省略…
qiita始めてみた！(始めて数週間の初学者)

javaとawsとandroid studioを学習中！
覚えることは山ほどあるけどがんばります！
ところで「amazon web services 基礎からのネットワーク＆サーバー構築」
という本は初学者にはハードルが高いのかな？完璧に読む必要がないだけ？
「エンジニアはめんどくさがりで効率を求める」とかよく聞くけど、基礎を勉強するうえでめんどくさいことは
避けては通れそうにないのかもね...
環境：windows10
基礎学習済：html,css,js,react,git,github,コンソール操作,SQL
(コンピューターはmacに変えたほうがいい？)
ベータ分布を題材としたベイズ推定とMAP推定

## はじめに
統計検定準1級の勉強をしたときの記録です。
ベータ分布の観点から、事後分布のベイズ推定とMAP推定について学びます。

## ベータ分布について
ベータ分布 $Be(a,b)$ の確率密度関数は、以下の式で表されます。
$C$は確率の合計が1になるようにするための規格化定数です。

``` math
\begin{align}
f(\theta) &= C \theta^{a-1}(1-\theta)^{b-1}   \\
C &= \frac{1}{\int_0^1 \theta^{a-1}(1-\theta)^{b-1} d\theta}
\end{align}
```

以下のような性質があります
- $Be(1,1)$ は、一様分布と同義
- 期待値は、$\frac{a}{a+b}$



## 共役事前分布
ベイズの定理より、事後分布は事前分布と尤度の積に比例します。

``` math
P(\theta|X) \propto P(X|\theta)P(\theta)
```

このとき、うまく分布をとることにより、事前分布と事後分布が同じ確率分布族に従う状態を作ることができます。
このような事前分布を共役事前分布と呼びます。
尤度が2項分布の場合、Beta分布は共役事前分布となります。

事前分布としてベルヌーイ分布$Be(a,b)$ を仮定し、何らかの二項分布$Bin(n, \theta)$ の施行の結果として、$r$ 回成功したとします。
このとき、施行結果によって更新された分布、すなわち、事後分布は、Cを適当な定数として以下のようになります。

``` math
\begin{align}
posterior &=  C_0 \theta^{a-1}(1-\theta)^{b-1} \times {}_n C_r \theta^r(1-\theta)^{n-r} \\
&= C_1 \theta^{a+r-1}(1-\theta)^{b+n-r-1} \\
&\sim Be(a+r, b+n-r)
\end{align}
```

確かに、事後分布がベータ分布になりました。


## ベイズ法による事後分布からのパラメータの点推定
点推定にはいくつかありますが、ここではベイズ推定量とMAP推定量について考えます。

### ベイズ推定量

ベイズ推定量は、以下で表されます。

``` math
\hat{\theta} = \int_{\theta \in \Theta} \theta f(\theta | X) d\theta
```


すなわち、事後分布におけるパラメータ$\theta$の期待値がベイズ推定量です。
前述の事後分布 $Be(a+r, b+n-r)$ であれば、ベータ分布の期待値に等しく、$\frac{a+r}{a+b+n}$ となります。

### MAP推定量
MAP推定量は、事後分布の値を最大化する$\theta$です。すなわち、

``` math
\hat{\theta} = arg\max_{\theta \in \Theta} f(\theta | X)

```

よって、微分して極値 (= 二項分布のモード) をとる値をもとめればよいことがわかります。
ベータ分布 $B(a,b)$ について考えると、

``` math
\frac{df}{dx} = ((a-1)(1-\theta) - (b-1)\theta)\theta^{a-2}(1-\theta)^{b-2} 
```

なので、$\theta = \frac{a-1}{a+b-2}$ となります。

よって、事後分布$Be(a+r,b+n-r)$ のMAP推定量は、$\frac{a+r-1}{a+b+n-2}$ となります。



## 参考文献
- 日本統計学会編　「統計学実践ワークブック」
PHP laravel セッションに値が入っているかテストする

:::note info
この記事は[miriwoお一人様 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/miriwo)の11日目の記事です
:::

# 概要

- セッションに任意の値が格納されていることをチェックするテストを記載する方法をまとめる

# 方法

- 下記の様に記載することでセッションに値が格納されているか否かをチェックする事ができる。

    ```php
    $response->assertSessionHas(キー名, 値);
    ```

- 例えば、キー名が「name」の値が「テストユーザー名」がセッションに入っているかチェックする場合下記の様に記載する。

    ```php
    $response->assertSessionHas('name', 'テストユーザー名');
    ```
【Android】画像読み込み時にヘッダー情報を付与する方法 by Picasso

# はじめに
画像を非同期で読み込むライブラリは複数ありますよね。
最近はコルーチンを利用したcoilがよく使われている認識ですが、Picassoやglideもまだまだ現役かと思います。
そんな中でも今回はPicassoに関して、OkHttpライブラリと組み合わせて画像取得時に認証情報などのヘッダー情報を付与する方法を簡単にまとめたいと思います。

# ヘッダー情報を付与する方法
実装としては以下になります。

```kotlin
override fun onViewCreated(
   view: View,
   savedInstanceState: Bundle?
) {
   val builder = OkHttpClient.Builder()
      .authenticator { route, response ->
         response.request.newBuilder()
                                        // 任意のヘッダー情報を設定してください
            .addHeader(
               "AUTHORIZATION_NAME",
               "AUTHORIZATION_NAME_VALUE"
            ).build()
         }.build()

   val downloader = OkHttp3Downloader(builder)
   val picasso = Picasso.Builder(requireContext())
      .downloader(downloader)
      .build()
}
```

以上になります、上記で作成したpicassoオブジェクトを使用することで、事前に設定したヘッダー情報を使用して画像を取得する処理が走ります。
ちなみに今回はサンプルの為onViewCreated内で実装していますが、プロジェクトにあった形で定義していただければと思います。
また、ログを出したい場合はbuilderに対してHttpLoggingInterceptorを設定することで、表示可能です。

# さいごに
okhttpライブラリや画像を非同期で読み込むライブラリなどはもはや必須とも呼べるライブラリですよね。
それぞれの設定などで覚えておくと便利な実装は他にもありますので、需要があるようであれば今後も記事にしていきたいと思います。
何も分からない人のためのVirtualBox記事その1_OSダウンロード

次回：[何も分からない人のためのVirtualBox記事その２_仮想マシンの作成](https://qiita.com/Hachioji_City/items/4ecf409c6cba16ce6c39)

# そもそもVirtualboxとは
PC内に複数のPCを作ることができるもの。
恐らくあなたの足元には箱型のパソコン本体があると思いますが、これを画面上の仮想空間で作ります。だから仮想環境と呼ばれているのですね。
ゲームで例えると、ソフト（ＯＳ）を入れて遊べるゲーム機（仮想マシン）を作れる3Dプリンタ（Virtualbox）といった感じでしょうか。ちょっと違うかな…
とりあえず扱いたい"OS"を用意。Virtualboxをインストールし、VirtualBox上で"仮想マシン"を作成して先に用意したOSをインストールすることで遊べるようになります。

# OSのダウンロード
使用したいOSをダウンロードしてきましょう。
ただしmacOSなどは利用するのにお金が掛かります。Windowsも同様。
「え、無料で色々やりたかったのに…」と思った方はLinux系統を選びましょう。
端的に言えば無料のOSです。私は今回Vyosというものを導入するのでその紹介となりますが、色々共通点もあると思いますので読んでいただけると嬉しいです。

# vyosの概要
さらっと調べただけでは「vyosってDHCPサーバなの？ルータなの？」とゴチャゴチャになるかもしれないが、大前提として、vyosとはルータである。
ルータはLANとWANを繋げてくれるもの。簡単にいうと家や会社といった狭いネットワーク（内）と、全世界に張り巡らされているインターネット（外）を結ぶ玄関口のような役割をしている。
本来の役割は内と外を繋げるだけだが、最近のルータは多機能化している。
例えば以下のような機能を追加でVyosにも搭載することもできる。

・DHCP機能（IPアドレスを振り分ける機能）
・ファイアウォール機能（セキュリティを向上させる機能）

話をまとめると、
__Vyosは追加で様々な機能を追加できるルータ__
ということになる。

# vyosのダウンロード
[vyosの公式サイト](https://vyos.io)
上記リンクにアクセスすると

・LTS Release v1.3.2
・Rolling Release

の2種類のボタンが中央に表示されている。
これらはvyosをダウンロード（以下DL）する際の契約の違いである。
vyosは前者が有料、後者が無料となっているので「仮想環境でとりあえず触りたい」みたいな人はRolling Releaseを押下し、
一番上の拡張子.isoのものをDLして問題ない。
（拡張子isoとは、CDにOSなどを記録したファイルの拡張子。今はCDを利用しなくても、それを表すデータ（フォルダ）で事足りる。）
※以下この2つの説明。興味ない人は飛ばして下さい。

>端的に説明すると、LTSは（Long-Term Support）の略で、有料で長期のサポートを保証しているいわゆる安定板。
Rolling Releaseは短期間でアップデートするもの。"Rolling Release"を押下した先のサイトには"nightly builds"とあるが、
これは安定板としてはまだ実装できない実験的な最新のものとなっている。バグもある可能性があるから無料となっている。
まとめると、LTS Release v1.3.2は安心安全の保障がある有料版。Rolling Release(nightly builds)は安定型としてはリリースできない、完成前の機能が提供されているリスクある無料版。

# CentOSの概要
有料版だった、とあるLinuxを模倣して作成したフリーのOS。
先に紹介したVyosとは違い、サーバ（サービスを提供するPC）のOSに利用される事が多いらしい。まだ深く触っていないため断言はできません。
また無料とはいえサポート期間が存在します。が！なんと2021年とか2024年で切れるとか。

# CentOSのダウンロード
[CentOSの公式サイト](https://www.centos.org/)
上記リンクにアクセスし、上にあるバーの"Download"というタブをクリックすると

・CentOS Linux
・CentOS Stream

の2種類の項目が中央に表示されている。
デフォルトでは"CentOS Linux"が選択されているはずです。
"CentOS Linux"は元となった有償のRHELというOSの有償部分を取り除いたもの、
"CentOS Stream"がバグや脆弱性を無視して新機能などを追加している実験的なものです。

またCentOS Linuxはサポートは2021年で切れているとか。基本どの記事もCentOS Streamを推奨しているように見受けられます。

次回：[何も分からない人のためのVirtualBox記事その２_仮想マシンの作成](https://qiita.com/Hachioji_City/items/4ecf409c6cba16ce6c39)
SHARP Brain に Linux を入れて遊ぶ(7) - アセンブラ

[目次](https://qiita.com/nekopro2/items/7eff2eb5e1c4480d3b30)

# 概要
SHARP Brain でアセンブラを使う

## as
アセンブラは 拡張子が .s。
そのまま gcc に食わせて自動で as を判別してもらおう。

Makefile に追加したのは以下のとおり。
~~~:Makefile
AS		= gcc
AFLAGS	= 

.SUFFIXES: .s.o

.s.o:
	$(AS) $(AFLAGS) -c -o $@ $<
~~~

## GAS の文法
ARM 純正な書き方に慣れているとミスるのでメモ
- シフタの前にカンマが必要 (省略してはいけない)
- コメントは @
- ローカル ラベルは数字
  -  参照は 数字+b や 数字+f を付ける

平方根を求めるコード
~~~:unsigned int miyu_sqrt(unsigned int v)
	.text
	.global	miyu_sqrt

miyu_sqrt:
	mov		r12, #0					@ a:   r12
	mov		r1, #1					@ one
	mov		r2, #30					@ bit: r2
1:	add		r3, r1, r12, lsl #2		@ t = 4a + 1
	mov		r12, r12, lsl #1		@ a <<= 1
	cmp		r0, r3, lsl r2			@ n と (t << bit) を比較
	addcs	r12, r12, r1			@ n >= (t << bit) なら a++
	subcs	r0, r0, r3, lsl r2		@ n >= (t << bit) なら n -= (t << bit)
	subs	r2, r2, #2				@ bit -= 2 して　フラグを更新
	bpl		1b						@ bit >= 0 なら 1: へジャンプ
	mov		r0, r12					@ 戻り値を設定
	bx		lr

	.end
~~~

プロジェクトはこちら: https://gitlab.com/nekodevteam/brainux/-/tree/main/astest

# ARM について
- PW-SH1 に乗ってるのは ARM926EJ-S (Armv5TEJ)
  - ARM9E 200 MHz で ニンテンドーDS のメインCPU の兄弟
- 特色
  - 命令は 4バイト長、Thumb という 2バイト長命令セットもあり
    - 切り替えは PC のビット0 で切り替えを行う
    - 切り替え時は bx命令 でジャンプする
    - PC が偶数なら ARM コードを実行
    - PC が奇数だったら (PC - 1) を Thumb コードとして実行
  - ARM 命令セットの特徴
    - 演算とシフトを同時実行できる
    - 命令に実行条件が付けられる
    - 演算命令ごとにフラグを更新するかしないかを選択できる
    - 除算命令がない

# gcc とのやりとりについて
- r0, r1, r2, r3, r12 が caller-save レジスタ (.s で壊してよいレジスタ)
- そのほかは callee-save レジスタなので退避が必要 
- C言語の引数は r0, r1, r2, r3 の順に割り当て、残りはスタック
- C言語への戻り値は r0 (とr1)
- gcc は ARMコードなので リターンは bx lr ではなく、mov pc, lr で良い
M5STACK BASIC / M5StickCPlus UiFLOWで水温を測定する

我が家に長く住むカメくんのために，水温を測ってみることにしました。
さっさと水温計を買ってこい！ という自分へのツッコミはさておき，せっかくなのでM5STACKで測定することを考えました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/d972c7c6-001d-6a78-1f01-936073710595.png)

DS18B20を使った測定キットはいろいろ種類がありますが，水温用で，プルアップ抵抗と変換基板がセットになったものを調達しました。これならいつものピンだけで簡単に使えそうです。

BASICの場合，Bottomに端子がいっぱいありますので，ささっと接続するには好都合です。Stickでもできそうですが，とりあえずBASICです。

ただし，内部で使われているピンも開放されています。公式ドキュメントでピンアサインを確認，2番ピンを選びました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/5eb69de6-7ee8-29be-3970-fcda923c708d.png)

Arduinoで測定する例はいっぱい出てくるのですが，ここはなんとかUiFLOWで使いたいところです。最近はUiFLOWで，WiFi経由でさっとテストするのが楽でいいですね。

探した結果，以下のところに情報がありました。感謝です！

- https://github.com/stonatm/UiFlow-custom-blocks/tree/master/ds18b20

ここから m5b ファイルをもらってきて，UiFLOWで読ませ，上記のサンプルのようにブロックを配置していきます。ピン番号だけ変更して，すぐに動きました！

配置されたブロックから，`import _onewire`してデータを読み書きしているようでした。勉強になります。

ここまでくればディスプレイを活かしてグラフにしたり，クラウドにデータ送信するのも簡単で面白そうですね。

M5StickC Plus でも無事に動きました。

さてカメくんの水槽，さすがに室内では室温と同じぐらいで，冬眠はしなくて良さそうですね。夜はどうなっているのやら。
メールサービス

# 【メールサービス】

メールの理解が浅すぎると思ったので LPIC 202 の勉強も兼ねて。

## メール

- メールを処理をするソフトウェアには、以下がある
  - MTA（メッセージ転送エージェント）
      - MUAからメールをMTAに送信する時や、MTA間でのやりとりには、SMTPプロトコルが使われる
      - そのため、**SMTPサーバとも呼ばれる**
      - 広く使われているのが Postfix, sendmail 等
  - MUA（メールユーザーエージェント）
    - PC等で利用するメールクライアントソフトウェア（メーラ）
    - MUAがメールを受信する時には、POPやIMAPプロトコル（現在は POP3,IMAP4）が使われる
    - POP/IMAPサーバには Dovecot 等
    - **Dovecot** はPOP3, IMAP4プロトコルに加えて、SSL/TLSを使ったPOP3S、IMAPSにも対応している
  - MDA（ローカルメール配送エージェント）

```:メール関連の主なポート
SMTP : 25 （メール送信・転送）
SMTPS : 465 （上記の暗号化）

POP3 : 110 （メールの受信）
POP3S : 995 （上記の暗号化）

IMAP : 143 （メールの受信）
IMAPS : 993 （上記の暗号化）

Submission port(SMTP) ： 587 （クライアントからのメール送信(OP25B)）
```

### メール配送の仕組み

1. メーラMUAからメールを受け取ったメールサーバMTAは、DNSサーバに問い合わせて、配送先MTAを調べ、MTAへメールを配送
1. MTAはメールを受け取ると、ローカル配送プログラムMDAが、宛先ユーザーのメールボックスにメールを格納
1. 受け取り側ユーザーのMUAは、POPサーバや、IMAPサーバを経由してメールボックスからメールを取り出す

### Postfix （MTA）

sendmailと互換性ある、高速に動作し、設定も容易
- Postfixの設定は、`/etc/postfix`ディレクトリ以下の
    - `main.cf`
        - MTAとしての基本設定ファイル
    - `master.cf`
        - Postfixを構成する各種デーモンの設定ファイル
- Postfixの全設定値を表示 ： `postconf`コマンド
- Postfixの制御 ： `postfix`コマンド

### メールリレー

MTA間でのメールの中継をリレーという
- 他のホストに宛てたメールを受け取った場合、MTAはそのメールのリレーを許可すべきか判断
- ※ リレーを無限に許可すると、スパム送信時の踏み台に利用されかねないので注意


## SMTPサーバの運用と管理

Postfixの運用と管理は多岐にわたる、その中でもメールキューとメールボックスを理解しておくのは大事

### メールキュー

処理待ちのメールが一時的に保持される場所をメールキューという
- Postfixでは`/var/spool/postfix`ディレクトリ以下のサブディレクトリ
- Postfixでのメールキューの表示には、
    - `mailq`コマンド
    - `postqueue -p`コマンド

### メールボックス

メールサーバが受け取ったメールは、メールボックスに格納される

## 参考

https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LPIC%E3%83%AC%E3%83%99%E3%83%AB2-Version-4-5%E5%AF%BE%E5%BF%9C-%E4%B8%AD%E5%B3%B6/dp/4798151254
ABC281に参加してみた〜ひよこになるため日記【2日目(12/10)】〜

# 2日目にやったこと
こんにちわ。今日は朝早く起きようと思いましたが、気づいたら１１時。。。。
土曜日なんでと心を許しながら
- Atcorder　Beiginers Constestに参加してみた！！
- アルゴリズムの勉強を少ししてみた

この２本立てでいこうかなと思います。
それでは行きましょう！！

# ABC281回参加
今日初めてAtCorder Beginers Contestに参加しました。
今回俺が解けたのはA〜C問題！！
D問題は途中までできたけど、それ以降ができなかった。。。
そこの感想も踏まえて他の人の回答を見ながらどのようにしていくかも書いていけたらなと思います。それでは行ってみよう！！

## A問題
A問題は[こちら](https://atcoder.jp/contests/abc281/tasks/abc281_a)から〜
自分の書いたプログラムは以下の通りです。
```python
s = int(input())
while s>=0:
    print(s)
    s-=1
```
解説すると
１行目で標準入力をしつつ、それをint型に変えてsに代入している
2行目以降のwhile文でs以下の文字列を出力している。
ここに関してはすぐできた！！
## B問題
B問題は[こちら]（https://atcoder.jp/contests/abc281/tasks/abc281_b）〜
自分の書いたプログラムは以下の通りです。
```python
s = list(input())
length = len(s)
if length != 8:
    print('No')
    exit()
for i in range(length):
    if i == 0 or i == length - 1:
        if not ('A' <= s[i] <= 'Z'):
            print('No')
            exit()
    elif i == 1:
        if not (s[1].isdigit() and 1 <= int(s[1]) <= 9):
            print('No')
            exit()
    else:
        if not (s[i].isdigit() and 0 <= int(s[i]) <= 9):
            print('No')
            exit()
else:
    print('Yes')
```
正直、今回のB問題はC問題より難しかった。
今回どこが難しかったかというと大文字と数字の判断基準！！
ここを整理していきたいです！！
参考した記事は[こちら](https://note.nkmk.me/python-capitalize-lower-upper-title/)〜
まず、今回のキモは２つあって
- 英字の大文字かを判断する
- 数字かどうか判断する
まず、大文字かどうか判断する方法を調べてみました。
pythonには大文字かどうかを判断する関数がありました。それがこちら

```
str.isupper()
```
pythonには数字かどうかを判断する関数もありました。それがこちら
```
num.isdigit()
```

# C問題
C問題は[こちら]（https://atcoder.jp/contests/abc281/tasks/abc281_c）〜
自分の書いたプログラムは以下の通りです。
```python
N,T = map(int,input().split())
l = input().split()
total=0
for i in range(len(l)):
    total+=int(l[i])
music = T%total
for i in range(len(l)):
    if music>=int(l[i]):
        music-=int(l[i])
    else:
        print(f'{i+1} {music}')
        break
```

2~4行目は以下の通りに書き換えれる！！
```
t_list = list(map(int, input().split()))
t_cycle = sum(t_list)
```

sum関数パッと出てこなかった、、、
これからコードを短く書くことを意識して使ってみよう！

# アルゴリズムを勉強してみた
アルゴリズムとは何なんだ〜！？分かってるようで分かってなかったのでもう一度勉強してみた、、
## アルゴリズムとは
一言で言えば、「問題を解決するための手順や計算方法」って書いてありました！！
簡単に言うと、公式みたいな感じなのかな！？

アルゴリズムを勉強するメリットは以下の通り
- 計算量が早くなる
- 短いコードで書ける

自分みたいな初心者は必要ないけど今後重要になってくるらしい！！
D問題とか解く時には必須って書いてあったから勉強して短いコード書けるように頑張ります！！

## 計算量
### Big O notation(Big O記法）
これはどのくらい時間がかかるかを示したものである
表記の仕方はO(1)、O(n)、O(n^2)だったりと色々ある。
これはy=1であったりy=nを書いてあげるとわかるとおり、時間がどれくらいかかるよと表している。
つまりO(n^2)が計算量が多いことがわかる。
こうやって考えると分かってきた。
実際にO(n)のコードを書いてみた。
これが以下の通りだ。
```
# o(n)
def func(numbers):
    for num in numbers:
        print(num)
```
n回回しているからこうなることがわかる


O(log n)のコードはこんな形だ！
```
def func1(n):
    if n<=1:
        return
    else:
        print(n)
        func2(n/2)
```
何でこうなるの？？って最初思ったが、漸化式を解くとこうなることがわかった！！

これからまずソートのアルゴリズムを勉強をする！！
めちゃくちゃ大変だけど頑張ります！！

# 感想
今日で今後の課題点などがわかったので、
これからは
- アルゴリズム　
- pythonの基本的な関数

といったところを勉強していきます。色々大変だと思うのですがよろしくお願いします。
C++経験者はC#に馴染みやすい？

C#ってC++のバージョンアップみたいな感じ(勝手な解釈です)なので、
C++やってた人ならC#を理解しやすい？

「そんなふうに考えていた時期が俺にもありました。」
実際苦労しています。という話をしたいと思います。

まず私の経歴ですが、C++の経験が15年以上あり、C#は1年程度です。

そんな私が新しい現場でC#の開発をする事になりました。
要求スキルとしてはC#経験がありデザインパターンを知っていること、
あとメンタルが強い人(普通こんなこと聞く???)とのこと。

C#の経験が1年程度あったものの、
今までの現場ではC++チックなC#だったので、
C#にしか無いような機能は殆ど使っていませんでした。
どういう事かというと、ラムダ式、LINQ、interfaceってナニソレオイシイノです。
他にも沢山ありますが省略します。

それぞれについてですが。
・ラムダ式
⇒何かいてるか意味不明。。。でもグーグル先生に聞けばなんとかなる。
・LINQ
⇒何かいてるか意味不明。。。でもグーグル先生に聞けばなんとかなる。
・interface
⇒どういう物かは分かったけど、これをどうやって使うの？

特にinterfaceが難しいです。
デザインパターンが難しいです。
修正した実装がどこにあるか探すのが難しいです。

そう考えると、Java経験者さんの方がC#に馴染みやすい。となるのでしょうか？？
WebAssemblyとは？

# 概要
この記事は、残りのアドベントカレンダー期間をWebAssemblyとRustに費やして、少しでもWebAssemblyを理解しようとするためのメモです。

## MDNのWebAssemblyの概要をスクラップしていく

https://developer.mozilla.org/ja/docs/WebAssembly/Concepts

### WebAssemblyとは何か？
- 新たな機能と大幅なパフォーマンス向上を提供する新しい種類のコード
- C、C++、Rust 等の低水準の言語にとって効果的なコンパイル対象となるように設計
- ネイティブ水準の速度で複数の言語で記述されたコードをウェブ上で動作させる方法を提供

全然わからない。。。

他の記事も読見漁っていると、以下のようなものらしい。JavaでいうJVMみたいな感じ？

> 「仮想マシン上で動作するバイナリの命令形式」


生まれた背景は、JSよりももっと速くコードを実行できる方法が欲しかったためらしい？
JSと強調して動かせるWeb周辺の技術のうちの1つという感じで、基本的には計算しかできず、それがJSよりも速く実行できるように設計されている。

### WebAssembly の目標
https://www.w3.org/community/webassembly/

で、オープン標準として以下を目標に定めて作成されている。

- 高速で、高効率であり、ポータブルであること 
- 可読性を持ちデバッグ可能であること
- 安全であること
- ウェブを破壊しないこと

### WebAssemblyがどのようにウェブプラットフォームに適合するのか？
https://webassembly.org/docs/use-cases/

- 画像・動画編集
- ゲーム
- P2Pアプリケーション
- 画像認識
- VR・AR
- CADアプリケーション
- 科学的な視覚化とシュミレーション
... などなど

#### 採用事例

https://medium.com/google-earth/google-earth-comes-to-more-browsers-thanks-to-webassembly-1877d95810d6

https://medium.com/ebaytech/webassembly-at-ebay-a-real-world-use-case-ef888f38b537

https://www.figma.com/blog/webassembly-cut-figmas-load-time-by-3x/


### WebAssembly の主要概念
- モジュール

`WebAssembly.Module()`
ステートレスの WebAssembly のコードであり、ブラウザーでコンパイルされ、効率的にワーカーと共有することができ、複数回インスタンス化することができます。

- メモリー

`WebAssembly.Memory()`
buffer プロパティが可変長の ArrayBuffer であり、これが WebAssembly の Instance からアクセス可能なメモリーのバイト列を保持しています。

- テーブル

`WebAssembly.Table()`
WebAssembly のテーブルを表す配列風の構造で、関数の参照を保持します。

- インスタンス

`WebAssembly.Instance()`
ステートフルで、実行可能な WebAssembly.Module のインスタンスです。

https://developer.mozilla.org/ja/docs/WebAssembly/JavaScript_interface

よくわからない。。。 何か作ってみるしかないか。。。

### WebAssemblyをどのようにアプリで用いるか
- Emscripten を用いて C/C++ 製アプリケーションを移植する。
- アセンブリー水準で WebAssembly を記述もしくは直接生成する。
- Rust アプリケーションを書き、 WebAssembly を出力ターゲットとする。
- TypeScript によく似た AssemblyScript を用いて、 WebAssembly バイナリーに出力する


### おまけ ChatGpt
> WebAssemblyとは

> WebAssembly (Wasm) は、Web ブラウザー上で実行されるプログラムを作成するための新しい技術です。Wasm は、ほとんどのプログラミング言語から生成される、独自の命令形式を持つバイナリフォーマットです。これにより、高速で、高品質な Web アプリケーションを構築することができます。Wasm は、Web ブラウザーと同様に、世界中の人々が利用することができるオープンな技術です。


## 参考
https://developer.mozilla.org/ja/docs/WebAssembly/Concepts

https://zenn.dev/takewell/articles/11b80090137dcc

https://mixil.mixi.co.jp/people/12242

## 最後に
まだ全然わからないので、この記事に今後わかった概念等を追加していく可能性があります。あくまでメモです。

https://webassembly.github.io/spec/core/intro/index.html

時間がある時にじっくり読みます。。。
Juliaで学ぶプログラミング入門 コレクション / 置換 replace

# 置換(replace)
コレクションのうち上書き可能で文字列や配列など順番のあるものを置換したいときはreplaceを使います。

## 文字列の置換
Juliaで文字列の置換を行うには、replace関数を使用します。
```julia
# 文字列の置換
replace(s, old => new)
```
例えば、文字列s = "Hello World"の中の"World"を"Julia"に置換したい場合は、次のようにします。


```julia
s = "Hello World"
new_ary = replace(s, "World" => "Julia")  # "Hello Julia"
```

## 配列の置換
```julia
ary = [1, 2, 3, 4, 5]
new_ary =replace(ary, 3=>30)  # [1, 2, 30, 4, 5]
```

## 引数のコレクション自身を書き換えたい（上書きしたい）とき
！を追加します。(replace!を使います)

```julia
ary = [1,2,3,4,5]
replace!(ary, 4=>400) # ary = [1, 2, 3, 400, 5]
```


※2022.12 julia1.7の解説です。
やさしいD言語クイズ（その３）

# はじめに

やさしいD言語クイズの第３回です。
クイズを通して、D言語の言語仕様を紹介しています。これをきっかけにD言語に興味を持ってもらえると幸いです。
参考までに、過去２回の出題内容を紹介します。

https://qiita.com/devmynote/items/2c3763246f74ef983fcd

https://qiita.com/devmynote/items/15d4b5c14fb500524aa5

# クイズの前提
[Online D Editor](https://run.dlang.io/)（2022/12/10現在）での実行結果をクイズの正解とします。

## Online D Editorの環境情報（2022/12/10現在）

```d:
import std.stdio;

void main(){
  writeln(__VENDOR__);
  writeln(__VERSION__);
}
```
```text:実行結果
Digital Mars D
2099
```

# 問題７
ソースコードをコンパイル、実行すると、どんな出力結果になるでしょうか。

```d:
import std.stdio;
void main(){
    enum {
        A,
        B,
        C = E + 1,
        D = 7,
        E
    }
    writeln(A, B, C, D, E);
}
```

# 問題８
ソースコードをコンパイル、実行すると、どんな出力結果になるでしょうか。

```d:
import std;
void main()
{
    int[4] a = [1, 2, 3, 4];
    int[4] b = 2 * a[] - 1;
    int[4] c = a[] * a[] - b[];
    writeln(a);
    writeln(b);
    writeln(c);
}
```

# 問題９
ソースコードをコンパイル、実行すると、どんな出力結果になるでしょうか。

```d:
import std;

struct zoo
{
    static string[string] cage;
    void opDispatch(string s1)(){
        string s = s1;
        foreach ( key; cage.keys ){
            s = s.replace(key, cage[key]);
        }
        writeln( s );
    }
    static void opCall(string[] s ...){
        foreach ( i; 0 .. s.length / 2 ){
            cage[s[i * 2]] = s[i * 2] ~ s[i * 2 + 1];
        }
    }
}

void main()
{
    zoo z;
    with ( z ){
        zoo("カモ", "🦆", "シカ", "🦌", "ウシ", "🐄🐂");
        カモシカのようなウシ;
    }
}
```

:::note warn
ここから回答編です。ネタばれ注意！！
:::

# 問題７の答え

<details><summary>問題７の実行結果</summary><div>

```text:実行結果
01978
```
</div></details>

答えへの補足

enum（列挙型）についての問題です。
* 最初の要素である`A`には、値の指定がないので、初期値の`0`が代入されます。
* 次の`B`にも値の指定がないので`A`に`1`を加えた`1`が代入されます。
* `C`は、後方の`E`の値が決まってから、値が確定します。
* `D`には`7`が代入され、次の`E`は、`D`に`1`を加えた`8`が代入されます。
* `E`の値が決まったので、`C`は`9`になります。

# 問題８の答え

<details><summary>問題８の実行結果</summary><div>

```text:実行結果
[1, 2, 3, 4]
[1, 3, 5, 7]
[0, 1, 4, 9]
```
</div></details>

答えへの補足

ベクトル演算についての問題です。
* `2 * a[] - 1`では、配列`a`の各要素に`2`をかけて`1`を引く演算を行います。

```math
2 \times \vec{a} - 1 = 
2
\times
\begin{pmatrix}
2 \times 1 - 1 \\
2 \times 2 - 1 \\
2 \times 3 - 1 \\
2 \times 4 - 1 \\
\end{pmatrix}
=
\begin{pmatrix}
1 \\
3 \\
5 \\
7 \\
\end{pmatrix}
```

* `a[] * a[] - b[]`では、配列の各要素同士で演算を行います。
```math
\vec{a} \times \vec{a} - \vec{b} = 
\begin{pmatrix}
1 \times 1 - 1 \\
2 \times 2 - 3 \\
3 \times 3 - 5 \\
4 \times 4 - 7 \\
\end{pmatrix}
=
\begin{pmatrix}
0 \\
1 \\
4 \\
9 \\
\end{pmatrix}
```

# 問題９の答え

<details><summary>問題９の実行結果</summary><div>

```text:実行結果
カモ🦆シカ🦌のようなウシ🐄🐂
```
</div></details>

答えへの補足

関数のオーバーロード、連想配列、可変長引数を扱った問題です。
* `main`の`zoo`関数は`opCall`と紐づいています。（関数呼出しのオーバーロード）
* `opCall`の引数は`string`型の可変長と定義しています。`string`型の動的配列のように扱えます。
* `カモシカのようなウシ`は関数です。`opDispatch`に紐づけられます。（フォワード機能）
* `opDispatch`の`s1`に`カモシカのようなウシ`が代入されます。
Luaの学習中に躓いたポイント

# ■はじめに
書籍「スクリプト言語による効率的なゲーム開発 C/C++へのLua組み込み実践」を使ってLuaの学習を行いました。
ズブの素人がこの本とWEB上の情報を参考に学習を進める際に躓いたポイントを纏めていこうと思います。
かなり初歩的なことしか書かないと思います。

# ■開発環境
- Lua 5.1.5
- tolua++ 1.0.92
- Visual Studio 2022 Community
- Intellij IDEA 2022.2.4
    - EmmyLuaプラグインを使用
- Visual Studio Code
    - Lua Helper Guideプラグインを使用

# ■tolua++の開発が停止中
本書は LuaとCpp の繋ぎ部分を楽にするために tolua++ を使用してグルーコードを生成していましたが、
書籍に載っているWEBページが404になっていました。
幸いtolua++を試している方がいらっしゃったので参考にさせていただきました。

- [【tolua++】tolua++を VisualStudio2017 でビルドして使ってみる - GOTH's LABORATORY.](https://gothlab.org/toluapp-1/)

ただし、tolua++が10年以上更新が止まっておりLua5.1までしか対応していないようですので、よっぽどの理由がない限り使わないほうが良いかと思います。

# ■オブジェクト指向的なメソッドコールの種類
オブジェクト指向的な書き方が出来るLuaで2種類のメソッドコールがあり使い分けが最初わかりませんでした。
下記の例のようにself部分を省略するかどうかのようです。

```test.lua
function Character:move(x, y)
    -- 中略
end

local chr = Character:new()

-- ドットの場合
chr.move(chr, 100, 200)

-- コロンの場合
chr:move(100, 200)
```

変数に持たせたりコルーチンにわたす際はドットしか渡せないようでした。

```test.lua
local chr_move1 = chr.move        -- OK
local chr_move2 = chr:move        -- ERROR

local co1 = coroutine.create(chr.move)        -- OK
local co2 = coroutine.create(chr:move)        -- ERROR
```

# ■テーブルによる変数管理
変数が格納されているのはあくまでテーブルなんだということを知れた良い例でした。

例えば、Pointというテーブルの定義があるとします。
```point.lua
Point = {
    count = 0,
}

function Point:new()
    local table = {}
    local mt = { __index = Point }
    setmetatable(table, mt)
    return table
end

function Point:add_count()
    self.count = self.count + 1
    self["count"] = self["count"] + 1
end
```

下記の出力結果は「PointCount:2」となります。
`self.count` でも `self["count"]` でも同様にアクセスできることがわかります。

```test.lua
dofile("point.lua")
local point = Point:new()
print("PointCount:"..point:add_count())
```

# ■まとめ
書籍がしっかりサポートしてくれたので難しいと思っていたガベージコレクションやコルーチンの部分で躓くことはほぼ有りませんでした。
基礎的な部分はかなりサッパリと記載されているので、プログラムに慣れている方がLuaを学びたいと思うなら丁度いい難易度の書籍だと思います。

# ■おまけ1：書籍の注意点（2022/12/11現在）
著者が用意しているサンプルはページが存在しないようで入手することが難しくなっていますのでお気をつけください。

# ■おまけ2：EmmyLua と Lua Helper Guide
今回の学習にあたって最初にEmmyLuaを使用していたのですが、途中からLua Helper Guideに変更しました。

理由としては、Lua Helper Guideにはデバッガーの機能も入っており、スクリプト単体でテストする際にステップ実行をすることが出来るのが大変便利でした。
他にもターミナル上からリアルタイムに引数を変えたりもできたので、そのポイントも良かったと思います。

難点を上げるとすると、出力される言語が中国語なのでコンソールログ等の解読には少し苦労しました。
paiza.ioでelixir その139

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
360度パノラマを表示せよ。

# サンプルコード

```

IO.puts """
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>360° Image</title>
	<meta name="description" content="360° Image - A-Frame">
	<script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
</head>
<body>
	<a-scene>
"""
IO.puts """
		<a-sky src="https://t3.ftcdn.net/jpg/00/44/83/96/240_F_44839699_ftxwLRoprSsq86yhyI5rWMrvGnHXboc7.jpg" rotation="0 -90 0"></a-sky>
	</a-scene>
"""
IO.puts """
</body>
</html>
"""




```

# 成果物

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

以上。
BigQuery移行で学んだクエリコスト削減Tips

# はじめに

こちらのブログの小話です。

https://techblog.zozo.com/entry/migration-on-premise-dwh-etl-to-bigquery-digdag


とあるオンプレDWHからBigQuery用にクエリを移行しました。
つまり、クエリの実行コストが高いとお金のコストもかかる領域にお引越しました。

その時BigQuery用にコスト削減を施したTipsを少しご紹介します。

# パーティション分割項目

大概これで削減できます。
1日24回動くクエリが複数あり、その中にこんなクエリが有りました。

```sql
SELECT
  user_id
  ,item_id
  ,accessed_at
FROM
  access_log
WHERE
  accessed_at >= TIMESTAMP_SUB(current_timestamp, INTERVAL 2 hour)
```

このクエリの実行コストが大体2ドル/1回実行位でした。
24回実行するので約20ドル/日。1ヶ月30日とすると、600ドル/月。
じわじわお財布が泣いてます。でもビジネスロジック上このクエリを変えられない。

このaccess_logにはパーティションがなかったので
accessed_atをパーティション項目にすることで上記のようなクエリは
0.002ドル/1回実行 まで下げることができ、月の金額は見えない程度になりました。

https://cloud.google.com/bigquery/docs/creating-partitioned-tables?hl=ja

これは一例ですが、ほとんどのケースはこれでかなりお安くできました。

### おまけ：どれをパーティション分割項目にする？

作成日時、更新日時、配信日時、アクセス日時、購入日時
全てtimestampのこんな項目が1テーブルに並んでいたら
あなたはどれをパーティション分割項目にしますか？？

極力並ばないようにテーブルを分けたりデータの蓄積方法を変えるのが
綺麗かもしれませんが、そうもいかないケースは多々あります。

何も考えたくなければ、とりあえず作成日時にすることが個人的お勧めです。
作成日時でしぼった後で他のtimestamp項目で絞っても
出力データを変えずに済む可能性が高いからです。

ただBigQueryに既存クエリを移行する場合は
"実はクエリは全て配信日時で絞って使っているため、配信日時が適切"
てこともあるので、移行の時のパーティション項目は事前に見極める必要があります。


# コストのかかるクエリの実行回数を減らす

これはBigQuery問わず時間というコストを下げるために実施することが多いかと思います。
移行前クエリも元々こうなってて課金コストかからずに済んだことがあります。

要は処理ごとに何度もコストの高いテーブルを参照するのではなく

![名称未設定ファイル-ページ2.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48316/6698e308-4139-5146-302b-f4ac00b7b316.png)

1回だけ参照して、結果だけ何度も使いましょうってやつです。
図で言うhigh_cost_tableの期間項目をパーティション分割項目にすると
よりコストが下げられる可能性があります。

![名称未設定ファイル.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48316/a05fb915-5c5d-ac68-0490-cc9b1dbfc4e4.png)

この方法は、速度もお金も含めて安パイな方法です。

### おまけ: 安パイは適切？

今まではクエリが遅いと言う理由だけで1日1回にしてた。
BigQueryに移行したら、1日1回が都度実行に変更許容できる程度の実行速度になる。

なんてこともあります。

上の図で言うと、batchごとに何度もデータをリアルタイムに取得することで
BigQueryの課金は上がりますが、実は費用対効果がある可能性もあります。
パーティション分割等で課金を下げられる可能性もあります。

もちろん逆も然りで
リアルタイムでなくても費用対効果は変わらない可能性も十分あります。

ので、用途や効果を見極めた上で検討しましょう。

# パーティションが効かないケースにご用心

パーティション項目でwhere句作ればいいんでしょ？って思ったそこのあなたへ。

パーティション項目の比較対象が動的な値の場合にご用心。
この場合コストはパーティションなし状態と同等にかかります。以下例

```sql
# date: パーティション分割項目
SELECT
  id
FROM
  tableB
WHERE
  date = (select max(created_at) from tableC)
```


詳しくはこちらの公式ドキュメントをご覧ください。

https://cloud.google.com/bigquery/docs/querying-partitioned-tables?hl=ja#better_performance_with_pseudo-columns

# 最後に

移行後は定期的にデータポータル(現Looker Studio)で
クエリごとのコストランキングを載せたダッシュボードを作り
何のクエリにコストが掛かってるかをチーム内で確認した上で
上記のTipsを施しました。

Tipsは方法(How)の話ですが
まずは1つ1つのクエリのかかるコストについて
これは何でなぜこのクエリを使ってるのか(What, Why)を把握することが
結果的にBigQueryのクエリが早い！安い！うまい！状態につながります。

BigQueryコンソールの右上に出るコストが
元々1GiBだったのに、自分の修正で500GiB, 1TiBに変わってないかを
チラ見して把握しておくだけでもコスト感覚が掴め
チューニングのきっかけになるかもしれません。

"共通の参照テーブルの仕様が変わったやべえ課金があああ！"

なんて心配が、常にコスト意識してるかしてないかで
微増になるか急激な上昇になるかの境目になったりするかもしれません。

そんなTipsでした。
paiza.ioでelixir その138

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
youtubeを呼べ。

# サンプルコード

```

IO.puts """
<!doctype html>
<html>
    <head>
    </head>
    <body>
"""
IO.puts """
    <iframe width="240" height="200" src="https://www.youtube.com/embed/7MWJ83iIx4g" frameborder="0"></iframe>
"""
IO.puts """
</body>
</html>
"""

```

# 成果物

https://paiza.io/projects/DE8ZSdKAbm7RKz08raT3aA

以上。
TypeScriptのエラーの見方

# TypeScriptのエラーの見方

## エラーコードの種類

こちらに定義があります。

https://github.com/microsoft/TypeScript/wiki/Coding-guidelines#diagnostic-message-codes

 番台 | エラーの種類 | 説明
 --- | --- | ---
 1000 | シンタックスエラー | 文法のエラー
 2000 | セマンティックエラー | 文法は正しいが、命名ケース、引数の数、数値リテラルの型などのエラー
 4000 | declaration emit messages | モジュールのエクスポートなどのエラー
 5000 | コンパイラオプションメッセージ | TypeScriptコンパイラのオプションに関するエラー
 6000 | コマンドラインコンパイラメッセージ | コマンドライン引数のエラー
 7000 | noImplicitAnyメッセージ | any型が推論された時のエラー

エラー文言の定義一覧

https://github.com/microsoft/TypeScript/blob/main/src/compiler/diagnosticMessages.json

## 参考

https://qiita.com/uhyo/items/8b7589e925835bad095c
[AWS] LambdaでS3の署名付きURLを発行する時に読む記事

# これは何？

LamdbdaでS3の署名付きURLを発行する時に、個人的につまづいたポイントを書いた記事です。

具体的なつまづいた現象としては、「Lamda上の処理で指定した有効期限に関わらず、有効期限が12時間程度になってしまう」というものでした。

「LambdaでS3の署名付きURL発行したけれど、長めに有効期限に指定したのに有効期限が切れてる～～～」でお困りの方、参考になると幸いです。

# 大まかな原因と解決方法

※ 私の解釈によるものが多いので、間違えていたら教えてください

## 原因

LambdaのIAMロールによって発行されたAWS Credentialを使用する場合、IAMロールによる一時的な認証が適用される。
※ 該当IAMロールの設定にもよるが、セッション期間は1時間～12時間で設定可能

https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html#permissions-executionrole-session

その際に、`IAMロールのセッション有効期限 < S3 署名付きURLの有効期限`とした場合、IAMロール側の有効期限が優先され、結果としてS3署名付きURLの期限がうまく機能しない状態となる。

## 解決策

「S3署名付きURL用のIAMユーザを発行し、署名付きURLを発行する場合にのみ、そのcredentialを用いる」という解決方法をとった。

### 補足

- Lambdaの環境変数と、S3用のcredentialを分けて定義する

Lambdaの環境変数では、IAMロールに応じて一時的な有効期限を持った`AWS_ACCESS_KEY`などが発行される。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime

> `AWS_ACCESS_KEY`、`AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY`、`AWS_SESSION_TOKEN` – 関数の実行ロールから取得したアクセスキー。

そのため、S3用のcredentialを分けて定義したい場合は、これらと重複しないようにすべきですね。


- やってみたけれど、解決されないんだが？？

別の原因があるかもです。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/presigned-url-s3-bucket-expiration/?nc1=h_ls

# あとがき

S3の署名付きURLの有効期限は、リアルタイムでデバッグしていくしかないので、結構気付きにくいポイントでした。

LambdaなどでURLを発行して、「次の日にURLでダウンロードできないんだが～～～」となったら、IAMロールのcredentialを使用していることを疑うといいかもしれません。

そして、これから同様のことをしようとしている方、参考になればと思います！

ありがとうございました。
定期的に Blockchain Symbol のハーベスト通知を取得する

こんにちは。 [faunsu19000](https://twitter.com/faunsu19000) です。
Blockchain の Symbol でハーベストの履歴を取得する Google Apps Script を作成しました。

自前でサーバーを用意する必要がない為、低コストに導入出来ます。

## 実行方法
1. 以下のスクリプトを Google Apps Script へ貼り付けてください
2. 関数 main の中の address 変数へ監視したいアドレスを入力して下さい
3. main 関数を実行します

## 挙動
main 関数を実行すると自動的に３０分毎に最新の履歴を取得しに行きます。
もし停止したい場合には stop 関数を実行していただければ止まります。


```javascript
/**
 * Address を 48桁形式に変換する
 * @param {string} address plain 形式のアドレス
 * @param {string} node node の URL
 */
function getEncodeAddress(address, node) {
  const url = [node, "accounts", address].join("/");
  const res = UrlFetchApp.fetch(url);
  return JSON.parse(res.getContentText()).account.address
}

/**
 * amount を Uint 形式から Int 形式へ変換する。
 * Symbol メインネットの値をハードコートで本関数は作成
 * @param {string} amount
 * @returns {number}
 */
function getIntAmount(amount) {
  return Number(amount) / 1000000;
}

/**
 * トランザクション履歴よりハーベスト履歴のみ取得する。ページネーションは１ページ目のみとする
 * @param {string} address plain 形式のアドレス
 * @param {string} node node の URL
 */
function getHarvestHistory(address, node) {
  const HARVEST_FEE_ENUM = 8515;
  const url = [node, "statements", "transaction"].join("/");
  const encodedAddress = getEncodeAddress(address, node);
  const res = UrlFetchApp.fetch(`${url}?targetAddress=${address}&order=desc`);
  const data = JSON.parse(res.getContentText()).data;
  let harvestHistory = [];
  data.forEach((d => {
    d.statement.receipts.forEach((r => {
      if (r.type === HARVEST_FEE_ENUM && r.targetAddress === encodedAddress) {
        r.targetAddress = address;
        r.amount = getIntAmount(r.amount);
        harvestHistory.push({ height: d.statement.height, ...r });
      }
    }))
  }))
  return harvestHistory;
}

/**
 * Gmail にて自身に対して通知を行う
 */
function sendGmail(data) {
  GmailApp.sendEmail(Session.getActiveUser(), "[通知]ハーベストしました", JSON.stringify(data));
}


/**
 * 取得結果をデータベースへ格納し、新たなデータがあればユーザーへ通知する
 */
function writeDatabase(data) {
  const database = PropertiesService.getUserProperties();
  let oldData = database.getProperty("data");
  if (!oldData) {
    database.setProperty("data", JSON.stringify([]));
    oldData = [];
  } else {
    oldData = JSON.parse(oldData);
  }

  data.forEach(d => {
    if (oldData.every(o => o !== d.height)) {
      oldData.push(d.height);
      GmailApp.sendEmail(Session.getActiveUser(), "[通知]ハーベストしました", JSON.stringify(d, null, 4));
    }
  })

  database.setProperty("data", JSON.stringify(oldData))
}

/**
 * 定期実行をGASに対して設定する
 */
function setTrigger(){
  const database = PropertiesService.getUserProperties();
  const triggerStatus = database.getProperty("trigger");
  if(!triggerStatus){
    const id = ScriptApp.newTrigger("main").timeBased().everyMinutes(30).create();
    database.setProperty("trigger",id.getUniqueId());
  }
}

function stop(){
  const database = PropertiesService.getUserProperties();
  database.deleteProperty("trigger");
  ScriptApp.getScriptTriggers().forEach(e => ScriptApp.deleteTrigger(e));
}


function main() {

  const node = "https://symbolnode.blockchain-authn.app:3001";
  const address = "ここにアドレスを入力してください";

  setTrigger();
  writeDatabase(getHarvestHistory(address, node));

}
```
アプリ作成（rails ver.6.0.0）

## Ruby_on_Railsでアプリを作る


```
[Terminal]
#指定のファイルに移動。（例えば、projectsディレクトリ内でアプリを作成する）
% cd ~/projects

#アプリを作成(データベースはmysqlで作成)
% rails _6.0.0_ new [app_name] -d mysql

#アプリのディレクトリ内に移動
% cd [app_name]
```

```
[config/database.yml]
# encoding: utf8mb4 を下記のエンコーディングに設定を変更する
  encoding: utf8
```
```
[terminal]
#データベースを作成
% rails db:create
```
以上のようにターミナル内にてRailsアプリを作成し、この後、MVCモデルを作っていきます。
さよなら紙の請求書

この記事は [デジタルキューブ ＆ ヘプタゴン Advent Calendar 2022](https://qiita.com/advent-calendar/2022/digitalcube-heptagon) の 12月11日分の記事として執筆しています。

デジタルキューブでは珍しく、エンジニアではなく、バックオフィス系を統括担当しています。創業以来リモートワークの当社ですが、バックオフィス系の業務においてはまだまだ紙とハンコに苦しめられています（それでも当社はだいぶ少ない方だとは思います）。

バックオフィスのリモート化は自社のみでは完結しないので、微力ながらノウハウを共有することで皆がハッピーになれる流れを作れればと思っております。

**「経理は苦しめられている」**
唐突ですが、コロナ禍において、多くの職種がリモートに移行した中、なかなか移行できていない職種があります。それはバックオフィス系の業務、特に「経理」です。
状況を問題視した政府が「184万人の経理の声なき声を届ける。」というプロジェクトまで立ち上げていました。

[プロジェクトHP](https://www.robotpayment.co.jp/keiri_liberty/)

[プロジェクト概要YouTube](https://www.youtube.com/watch?v=WWC-JCWUgbg&t=1s)
（冒頭30秒のみでいいので、見ていただけると仲間が増えて嬉しいです）

プロジェクトの詳細は上記に譲りますが、2022年末において少しずつ前に進んでいるものの、まだまだ出社を余儀なくされている方も多くいるようです。

**デジタルキューブの取り組み**

当社では経理系も含めて出社がかなり少ない方ですので、そんな当社の取り組み（要望含む）を一部紹介します。

**その①　契約書締結は可能な限り電子契約**

電子契約は契約主体である双方・広く捉えると社会にとってもメリットが非常に大きいです。なぜなら、以下のものを節約できます。

・経費・・・書面契約書では、契約書の紙代・インク代や封筒・郵送費（普通郵便でも定形外で140円、レターパックなら370円か520円）、準備する方の人件費等々を合わせますと、返送用の封筒等も合わせて1契約に1,000円以上のコストがかかっていると思います。これを電子契約だと、全部節約できます。電子契約ツールの導入にコストがかかるからといって躊躇しているバックオフィスの方、紙の契約にもコストは十分かかっているので、全然ペイすると思います。郵便屋さん・宅配屋さんも往復が省けて早くお家に帰れます。


・時間・・・紙の契約書の締結は、通常以下のプロセスを経ています。

①	契約書の内容を合意する。
②	A社で契約書を2部印刷する。押印申請に回して、押印完了して、B社の住所に送る（2営業日）
③	B社で受け取る。B社で押印申請して、押印完了して、A社に送る（2営業日）
④	A社で受け取る（１営業日）

契約書の内容を合意してから、社内で印刷して、申請して、押印して、郵送して、先方に受け取ってもらって、押印して、送り返してもらって、ってしてたら最短でも1週間ぐらいかかります。リモートワークで会社に押印対応できる方がいないと2週間かかることもザラです。海外との契約に書面を使っている場合も同様です。契約書の締結がないと次に進まない、大きな損害が生じる場面もあります。

通常、契約書の内容を合意した時点①で、適切な押印権限者の承認は得ています。電子契約なら合意したその日のうちにメール送付して、締結完了できるので、関係者全員の時間も節約できます。ぜひ電子契約を活用しましょう。
Time is money！！

・税金・・・紙の契約書を締結しただけでかかる税金があります。印紙税です。契約書の左上の方に貼ってあるのを見た記憶がある方も多いと思います。あれって紙の契約書だから必要なのですが、電子契約の場合には不要なんです。ちなみに日本における1年間の印紙税の税収はいくらでしょうか？

[答えは・・・1兆円！！](https://www.nta.go.jp/about/introduction/torikumi/report/2020/01_3.htm#a01_3a)

塵も積もれば。。ってやつですね。この中には登記に必須な印紙も含まれているので全部ではありませんが、皆で協力すれば節税になります。紙の契約書に固執せず、一度電子契約を検討してみませんか？ 

**その②　請求書は可能な限りデータで送り、データでもらう**

だいぶ減ってはきましたが、まだまだ紙の請求書をご依頼頂くケース、紙で請求書を送ってこられるケースがあります。メール・Webベースでのデータのやり取りであれば以下のメリットがあります。

・請求書が届いていないとかのトラブル、紛失のリスクがありません。送付履歴も残ります。
・タイムラグもないので、早期に決済手続ができてTo doも減ります。
・リモートワーク主体の会社でもスムーズに対応できます。
・その①と同じく、郵送代や人件費等のコスト削減にもつながります。

[冒頭の政府プロジェクト](https://www.robotpayment.co.jp/keiri_liberty/)でも請求書の電子化による経済効果が試算されています。

![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981963/30ded499-3976-d40e-6207-8c768e96190e.png)

 
また、詳しくは割愛しますが、2022年1月に電子帳簿保存法の改正が施行され、書類関係はデータでいいよ！ってことが認められています。
紙で送る時代は終わっています！『さよなら紙の請求書』

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981963/4c87796f-fb29-59ee-0626-f2c2c81ee1b0.png)


**最後に**
紙ベースの業務が電子化されていけば社会全体にいい影響が生まれます。
上記の事例はほんの一例ですし、個人的もまだまだ電子化したい書類・DX化したい業務は山のようにありますので、率先して改善していきます。
こういった動きは1社では成り立ちませんので、是非賛同頂ける方々、一緒にいい流れを作っていきましょう！