OmniAICreator/Qiita-1.07M huggingface dataset:
C言語開発者のおっさんがRustに入門してみる

この記事は [セゾン情報システムズ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/sisco) 23日目の記事です。

#はじめに
この記事は、C言語開発で育ったおっさんがRust学習の体験を淡々と描く物です。

#今回の記事のきっかけ
入社してからずっと、私はC言語を中心とした世界で開発をしてきました。
開発しているものの特性上ネイティブモジュールを新旧様々な環境に提供する必要性があり、他の言語への置き換えが難しかったためです。

ただ、近年発展しつつある様々な開発支援ツールもC言語開発ではうまく使うことができず、昔ながらの開発やテスト手法で開発速度をあげつつ品質を向上させる事に限界を感じていました。
そこで開発チームでは一部機能の開発ではGoでの開発を模索していているのですが、性能を求められる製品ではRustが向いているのではないかとも考えており、そのためにまずはどのようなものかを試してみようと考えました。

# おっさんの特徴
| 項目 | 内容 |
|:-----------|------------:|
| 年齢| アラフォー|
| 職業| C言語開発者→製品企画担当→プロダクトマネージャー<br>(実は最近開発していない)|
| 得意な言語| C言語。そもそも他の言語開発経験が少ない|
| 開発環境|Windows OS/ WSL2 /VS Code(vim操作) |

# 学習した内容
Rustには様々な学習コンテンツが用意されています。
細かいことは、ちょうど弊社の他の方が書かれた以下の記事などがわかりやすいので参照してみてください。
[Rust やろうぜ!](https://qiita.com/Yoshihiro-Hirose/items/982429f74b2900963533)

その中でも、入門書的な以下のサイトを参考に、頭から学習を実施しました。
[The Rust Programming Language 日本語版](https://doc.rust-jp.rs/book-ja/)

ただ、~~無料の学習資料だしそこまで量無いだろうと完全に舐めていて~~思ったよりも量が多く、最後まで到達できず今回は9章までの学習となりました。
またのんびり勉強して、いつか後編を上げたいと思います。

# 学習して感じたポイント

勉強をしてみて、C言語での開発と比較して感じたポイントとしては

* C言語だと苦労しないと実現できなかった事が簡単に実現できる
* C言語ではできてしまうがゆえにバグを生む部分を、うまく制限できている
* 基本的な機能がC言語より多いため、覚えることが多く大変

学習コストは高いものの、学習すればそれだけの恩恵を受けられそうな言語だと感じました。

特に良いと感じたのは、所有権の概念により安全かつ高速にメモリ管理が行える事。
C言語開発でありがちなメモリ管理ミスを大幅に減らしてくれるのではないかと。

# まとめ

やはりC言語に変わるプログラミング言語を目指しているだけあり、C言語の欠点を見事に改善しているイメージがあります。
さらに学習情報などが無料で豊富に公開されており、学びやすいことも好印象でした。

ただし、いくらシステム的にミスを減らす取り組みがされていると言っても、やれることが多いが故に、綺麗なコードが書けるかというのは別問題だと感じました。
まだまだRust開発が可能な開発者も少ないため、如何にRustで綺麗なコードを書ける開発者を育てていくかが製品採用に向けた課題かと考えています。

そうは言ってもRustへの期待値は高いので、まずはこの学習を一通り終え、次は通信できるコマンドあたりを開発してみたいと思います。

# （おまけ）学習して感じたメモ

ここからはThe Rust Programming Language 日本語版の章毎に感じたことをダラダラと記載。

1. 事始め
Cargo、Rust公式のビルドシステム。
こういった仕組みがデフォルトで用意されているのがありがたい。
C言語だと有志で作られたものはあれど環境によっては使えなかったりするので……

1. 数あてゲーム
変数の扱いで若干戸惑い。この後語られるという変数と可変性とは……
Result型、C言語のように混迷極める帰り値の世界ではないのが嬉しい。
分岐の書き方、かっこじゃないので戸惑い。これは慣れかな。

1. 一般的なプログラミングの概念
やはり変数の扱いが、ある程度開発をしてみないと慣れないかも。
ただ、コーディングミスを減らしてくれそうな期待はある。
あと、文と式の概念は戸惑いました。以下のような何の計算もしない値だけを置くのが許されるのかと。
fn five() -> i32 { 
	5
}


1. 所有権を理解する
書いてあること複雑だけど、感動した。
Cでありがちな参照地獄でどこからいつ使われるのかわからなくなる問題を発生させなくしてくれるなと。
あと、スライスいいですね。C言語でやろうとしたらとてつもなく面倒ですから……

1. 構造体を使用して関係のあるデータを構造化する
「トレイトの導出で有用な機能を追加する」デバッグ機能など便利なのですが、理屈がわからず。
あと構造体のメソッド、Cでも頑張れば実現できなくはないけど簡単で安全で便利。

1. Enumとパターンマッチング
enumと思ったら、データを直接添付できるのか……
便利やん……
しかも構造的な型も行けるのか……
さらにメソッドも定義できるのか……
なんでもありやん……
そしてNULLの代わりのOption。やっとぬるぽ地獄から開放されるのか……
match/if letはCのswich/if elseよりちょっと便利になっている感じ。

1. 肥大化していくプロジェクトをパッケージ、クレート、モジュールを利用して管理する
モジュールの構造や公開あたりは概ね理解。ただ、慣例的なやり方など意識して使うよう注意がいるのだなと。
例えばglob演算子は便利そうだけど、便利だからと製品コードで使ってしまうようなことが無いようにしないと。

1. 一般的なコレクション
ベクタ、（C言語以外では）見かける配列構造。Enum使えば色々な方を混在できるというのが不思議。
String、必ずUTF-8エンコードされている。逆に日本語データ扱う際に注意しないと。
文字列の扱い自体はC言語のsprintfなどでもできそうなものだけれども、複雑なメモリ管理が不要だったり所有権のおかげでミスなどの発生は抑えられそう。
ハッシュマップ、基本機能として説明されるのですね。あまり使われないと補足はあるけれども。

1. エラー処理
panic!すべきかするまいか。明示的にassert呼ぶかどうかと同じ考え。
製品コード内で正規の処理で呼ぶことはないかなと。デバッグやテストで使うのかしら。
シンプルな二部グラフ判定の実装(C++)

蟻本の二部グラフ判定は引数が２個あってなんか嫌なので、引数１つの二部グラフ判定を実装してみた。
この実装は、関数の戻り値はboolではなく、外部の変数 ok を用いる.(これを改善したい)

```c++
vector<vector<int>> G;//グラフ
vector<int> color;//別途使うときに-1で初期化して、color[0]=0としてあげる必要がある
bool ok=true;
void dfs(ll now) { 
//二部グラフ判定
	for (auto next : G[now]) {
		if (color[next] == color[now]) {
			ok=false;
			return ;
		}
		else if (color[next] == !color[now])continue;
		color[next] = !color[now];
		dfs(next);
	}
}
```

最初はbool型でやろうとしたが、再帰部分でバグらせまくったので方針転換した。
もっとうまい実装があれば教えてほしいです。(切実)
自作npmパッケージをローカルでバックする。

先日[react-ts-github-calendar](https://github.com/togami2864/react-ts-github-calendar)という[github-calendar](https://github.com/Bloggify/github-calendar)のReact + TypeScript対応のコンポーネントを作成して公開しました。
作成を通して、デバックで手間取った部分があったので共有します。

## そもそもローカルでデバック(擬似的にインポートする)するにはどうするの？
package.jsonのあるルートディレクトリで、

```shell
$ npm pack
```
することで**(パッケージ名).tgz**が生成されます。
そしてパッケージを使いたいプロジェクトで

```shell
$ yarn add (.tgzファイルまでのパス)
```
します。(この際yarnにキャッシュが残り、ファイルの中身を編集したのに変更が反映されない現象が起きるので注意。詳しくは次)
package.jsonと.tgzファイルが同じ階層にあれば

```shell
$ yarn add ./（パッケージ名）.tgz
```
すると![スクリーンショット 2020-12-10 18.44.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522425/c9f86c90-39f4-174a-56eb-77831ddc5d81.png)
package.jsonに追加されます。

これで例えばReactコンポーネントであれば

```shell
import {~~~~} from ~~~~
```
のようにいつもどおり使えます。

**注意**
デバックの段階で

```shell
$ npm publish
```
で一度npmにあげてからimportして試すのはやめましょう。(一度やってしまいました。)
**npmパッケージはpublishから72時間以内でないと削除できません。**すぎるとサポートに連絡しないといけなくなります。また、未完成のコードを配布してしまうことになり、単純に迷惑なのでやめましょう。

## 何度 yarn add ./(パッケージ名).tgz しても変更が反映されてない！
**対処法**

```shell
$ yarn cache clear  // キャッシュ　全削除
or
$ yarn cache clean (パッケージ名)
```
でキャッシュを削除しましょう。完全に初見でハマりました。

.tgzファイルを展開するとpackageというファイルがでてきます。
以下react-ts-github-calendarの例

```shell
package
├── LICENSE.txt
├── README.md
├── dist
│   ├── react-ts-github-calendar.d.ts
│   └── react-ts-github-calendar.js
└── package.json
```

ここのファイルの中身を見ると、たしかに変更が反映されているのですが、

```shell
$ yarn add  (.tgzファイルまでのパス)
```
をした後、node_modules内のパッケージを見ると変更が反映されていませんでした。
どうやら**全く同じ名前のファイルをaddしていたので、キャッシュが働いてしまって反映されていなかった**ようです。時々キャッシュを消した状態でもnode_moduleへの反映が遅れていることがあるので、IDEを再起動しましょう。

他にも、とにかくファイル名が変われば良いので、

- パッケージ名を変える
- パッケージのバージョンを上げる。  
といった方法がありますがキャッシュを消すのが早いでしょう。
Railsで後からnull制約を追加する書き方

## この記事で書くこと
毎回調べているので、まとめておく。
後からnull制約を追加する時の書き方を残しておく。

## 動作確認環境
ruby 2.6.5

## やりたいこと

- Userテーブルの `nickname:string` にnull制約をつけたい
- Userテーブル自体はもう既に本番で稼働中
- Userテーブルの `nickname:string` の既存レコード用にdefault値 `未設定` を設定したい。
- **可逆性を担保する**

[Railsガイド | Active Record マイグレーション](https://railsguides.jp/active_record_migrations.html)

## 必要なマイグレーション

```rb

class AddNullFalseToUsers < ActiveRecord::Migration[6.0]
  def change
    change_column_null :users, :nickname, false
    change_column_default :users, :nickname, from: nil, to: "未選択"
  end
end
```

### change_column_null

```rb
change_column_null :テーブル名, :列名, falseかtrue, [デフォルト値]
```

### change_column_default
```rb
change_column_default :テーブル名, :列名, from: デフォルト値変更前の値, to: デフォルト値変更後の値
```
NEONと拡張命令と時々オトン

# はじめに
 - この記事は[ひとりNEONアドベントカレンダー2020](https://qiita.com/advent-calendar/2020/neon-only) 最終日の記事です。
 - なんとか完走できました。ひとえに応援してくれた皆様のおかげでもあります。
 - [昨日は数値変換の命令を紹介](https://qiita.com/tomoaki_teshima/items/9e7458adf87f85f60a8c)した
 - なお、今日の内容は完全にポエムです。

# NEONここがすごいよ
 - 個人的に押したいのは`ld3`命令1つだけです。
 - SSEやAVXやMSAでも実装されてない`gather`命令ですが、これがあるだけでRGB画像への障壁が全然違います[^vsx]
 - `st3`も大好きです。
 - 一方で、残りの23日分はいわばおまけです。
 - おまけとは言いつつも、全体の構成はもうちょっと考えるべきだったかも、と反省しています。
    - なんで、24日目が`cvt`命令やねん、もっと前だろ、とセルフツッコミ

[^vsx]: [OpenCVでの実装例](https://github.com/opencv/opencv/blob/84676fefe3f61da5296b270bf5cb6b35db9b2f1b/modules/core/include/opencv2/core/vsx_utils.hpp)を見る限り、VSXにはSSEより自由度の高いシャッフルがあるため、`ld3`とほぼ等価なことを合計9命令(ロード$\times$3回、シャッフル$\times$6回)で実行可能に見えます。が、例により、未検証です。

# Arm v8.2、v8.4、v8.6
 - Arm は命令セットのv8を出したあとも、小数点以下を上げながら、[Arm v8.1からArm v8.6まで発表](https://pc.watch.impress.co.jp/docs/column/kaigai/1218023.html)しています。[^note1]
 - Arm v8.2では、`FP16`のままの演算命令が追加されました。
 - まだ触ったことないのですが、`dotprod`命令がArm v8.4で追加されたようです。
 - 巷で話題の`bfloat`型も、Arm v8.6からサポートされるとアナウンスされたので、触れる日が来るのを楽しみにしています。

[^note1]: アドベントカレンダー中ではArm v8.2、v8.4、v8.6にしか言及しませんでしたが、Arm v8.1、v8.3そしてv8.5もちゃんとあります。
# SVE
 - そして本アドベントカレンダー通して一切触れませんでしたが、SVE(Scalable Vector Extension)を普通に触れる日が来るのを楽しみにしています
 - 私が把握している範囲だと、富岳に使われてるA64FXに実装されており、それ以外に私みたいな平民が触るためにはqemuなどのシミュレータを使うしかないみたいです
 - また、全然把握していなかったのですが、[SVE2もアナウンスされています](https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/new-technologies-for-the-arm-a-profile-architecture)
 - まだどんなものなのか全然確認していませんが、手元に来て使える日を楽しみにしています。

# 書籍に付いて
 - 実はこのアドベントカレンダーは元々は@dandelion1124 先生に煽られて[^1][^2][^3]NEONのリファレンス本なるものを作ろうとしていたのです。
 - 元々の予定では技術書典8(本来なら2020年2月28日から開催のはず)で頒布する予定だったのですが、見事締め切りを守れず、今日に至ります。
 - このままだとズルズルと出ない本になりそうだったので、一念発起、ひとりアドベントカレンダーで自分を追い込んで、書籍の下書きに相当するものを書いてみました。
 - できれば、近い内に本にまとめる、、、かも？

[^1]: https://twitter.com/dandelion1124/status/1171034911257448448
[^2]: https://twitter.com/tomoaki_teshima/status/1136966923038519298
[^3]: https://twitter.com/tomoaki_teshima/status/1139546116330967040

# ひとりアドベントカレンダー
 - めっちゃ孤独だったし、完走できるかプレッシャーが強かったのですが、なんとか完走できてよかったです。[^note]
 - ひとえに応援してくれた皆様のおかげでもあります。(大事なことなので2回書いた)

[^note]: 11月30日に自転車で転倒して肋骨にヒビが入り、医者に行く時間も無くて、仕事も佳境で、途中で本気でこれは駄目だと何回か思った

# おわりに
 - NVIDIAの手島が、NEON大好きだよっ！ってポエムを25日間書きました。会社は関係ないよ！
 - ここで筆を置こうと思います。
ipynbを開くまで（Anaconda＋JupyterLab）＋お勧めExtension一覧へのリンクあり

メモを目的とした記事です。
### 環境

* win10 2020H2
* Anaconda Python3.8
* Pycharm Community Edition(次の記事で……。)

# ipynbとは
ノートブックドキュメントファイル。コードブロック、テキストブロックの2種類で構成されている。
IPython Notebookはこのipynbを開くためのエディタである。
Pythonコードをインタラクティブに作動させるために用いる。
通常の言語ファイルと異なり、コメント機能が非常にリッチ。なんと、Markdown記法が使える。
また、`%%bash`をブロック先頭に記述すると、コマンドラインツールとしても使える。機械学習の際に便利だぞ。

# 何するの
ipynbファイルはクリックしただけでは開けません。何もインストールしていなければ。
今回は、以下の3点を用いてipynbを開けるようにしていきたいと思う。

### 忙しいあなたへ
クラウドツールに抵抗がないならば、[Google Colab](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)を用いましょう。
そしてこのページを閉じましょう。詳しい説明は、リンク先に全て書かれています。
# Anacondaインストール
> Anaconda はデータサイエンス向けの環境を提供するプラットフォームです。科学技術計算などを中心とした、多くのモジュールやツールのコンパイル済みバイナリファイルを提供しており、簡単にPythonを利用する環境を構築できます。

[引用元](https://www.python.jp/install/anaconda/index.html)

[ここからダウンロード](https://www.anaconda.com/products/individual)できます。

途中でPATHを追加するかどうか聞かれます。コマンド派の方はチェックを入れましょう。

これでanacondaがインストールされました。仮想環境など不要という方は「ノートを開く」まで移動してください。

## Anaconda仮想環境実装
Pythonでは仮想環境を用いるのが一般的なので、Anacondaでも仮想環境を構築します。

1. Anaconda Navigatorを起動
2. Environmentをクリック
3. Create（左下にある）をクリック
4. 仮想環境名を入力
5. R言語も使いたいならRのチェックボックスをONにする

これで仮想環境が実装されました。

### 仮想環境に、ipynbを開くために必要なパッケージを入れる

1. 真ん中にある`Installed`プルダウンメニューをクリック
2. `All`を選択
3. 検索バーに`lab`を入力
4. `jupyterlab`をにチェックを入れ、`Apply`を押す
5. 依存関係チェックが入るので、環境したらもう一度`Apply`を押す

これでipynbが開けるようになりました。

# ノートを開く

1. Homeをクリックする
2. JupyterLab欄にある`launch`をクリックする
3. ブラウザが開き、ホーム画面（ファイル一覧とコンソールのようなもの）が表示される
4. 左ペインにあるファイル一覧からipynbを選び、ダブルクリック
5. 開けました！おめでとうございます👏

これでipynbファイルが開けるようになりました🎉
詳しい使い方などは、この記事に貼られているタグから飛んで、先達のやんごとなき資料で学んでみてください。

# お勧めExtension
[こちらからどうぞ](https://qiita.com/Bandolu/items/430f30ce5a8b2e369e35)
Rust+Wasm+WebGLで四次元超立方体

# Rust+WebAssembly+WebGL で八胞体(4次元超立方体)の描画

この記事はWebグラフィックスAdvent Calendar 2020 の25日目の記事です。

### はじめに

今年になってからRust言語の勉強を始めまして、畳の上の水練で終わらないように
WasmとWebGLを利用して4次元図形を表示させてみることにしました、が、
RustコードとJavaScriptコードでのデータのやり取りに七転八倒、やっとのことで
とうとうなんとか動作するようになりましたので、初投稿してみることにしました。

参考にさせていただいた記事です：

[RustでWebAssembly: Rust内から requestAnimationLoop() でループさせたり、on_click()を登録する](https://qiita.com/mokemokechicken/items/30d908a26ed103622a15)

[Rust(wasm)とJavaScript(WebGL)のデータ受け渡し　Rust+WebGLでポリゴン描画 (1/2)](https://zerogram.info/?p=2925)

[Wasm-Bindgen公式](https://rustwasm.github.io/wasm-bindgen/)

wasm-bingenのページでは"1.4 Without a Bundler"を参照し、node.js等がいらない形で(必要な部分はコードに埋め込まれている)構築しました。

### 四次元オブジェクトの描画法について

三次元での三角ポリゴン描画からの類推で、四次元では三角錐でオブジェクト表面（表体？表胞？）を構成しました。
八胞体なので８つの立方体からなっています。
**八胞体の3次元への展開図**
![octachoron_extend](http://www7b.biglobe.ne.jp/~fdw/svg/octachoron_extend.svg)

各立方体を５つの三角錐に分割すれば計40個の三角錐で八胞体が構成できます。
**立方体の三角錐への分解図**
![cube_decompose](http://www7b.biglobe.ne.jp/~fdw/svg/cube_decompose.svg)


この三角錐群を4次元のアフィン変換を行った後、4次元方向への座標が0である３次元空間で切断して目的の図形（三角ポリゴン群）が得られます。
４次元空間において三角錐を3次元空間で切断した場合、以下のパターンで三角形を生成します。

- 三角錐がすべて3次元空間に含まれる場合。<br>
   ４つの三角形を流用します。
- 一面(三角形)が3次元空間に含まれる場合。<br>
   １つの三角形を流用します。
- 三角錐が切断され、1頂点のみが異なる側にある場合。<br>
   １つの三角形を新たに生成します。最も多いパターンです。
- 三角錐が切断され、2頂点づつが異なる側にある場合。<br>
   ２つの三角形を新たに生成します。
- 三角錐が3次元空間と交わらない場合（1点・１辺のみ含まれる場合を含む）。<br>
   三角形を生成しません。

**生成三角形**
![cutting_pylams.svg](http://www7b.biglobe.ne.jp/~fdw/svg/cutting_pylams.svg)
Rustのパターンマッチングが非常に有用でした。

**立方体からできる平面**
回転がなければ、立方体一つからだいたいこのような平面が６つ出来ます。
![rectangle](http://www7b.biglobe.ne.jp/~fdw/svg/rectangle.svg)
これを改めて視点座標系の変換を行えば画面に表示できるわけです。

- ローカル変換は4次元で行う。
- 変換したものを3次元で切断。
- 視点変換は3次元で行う。

で、出来たものがこれ。多少回転させてあります。
また、市松模様の床は普通の3次元ポリゴンです。
![wasm](http://www7b.biglobe.ne.jp/~fdw/img/Wasm.png)

記事内に一片のコードも無くて申し訳ありません。
ソースコードと、動作しているものは以下にあります。

[ソースコード](https://github.com/pionier/rust_wasm)

[デモ(ホームページ)](http://www7b.biglobe.ne.jp/~fdw/content_20201221_j.html)
また、ホームページにはJavaScriptのコードですが4次元を歩くオブジェクトなどや３Dテクスチャを貼った八胞体なども置いてあります。それぞれ多少ですが操作可能です。
ただし、最新のものの動作確認はChromeでしか行っておりません。悪しからず。
Wikipediaの編集が便利になるツールたち

Wikipediaの編集をしている人たち(ウィキペディアン)が、編集が便利になるツールを紹介します。
<h2>Twinkle</h2>
<b>Twinkle</b>とはWikipediaに蔓延する荒らしや悪戯を差し戻すことの助けになるツールです。
![01E36BAD-08C8-4C09-B5F5-B9AC6CCEA09A.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652978/245e3111-5be8-b745-4a28-096a5f10701e.jpeg)
このツールは、上の写真のように投稿記録に4つのボタンが表示され、このボタンを押すことによって簡単に編集の差し戻しができます。<br>それぞれのボタンの解説をします。
<b>[restore this version]</b>…このボタンが置かれている場所の下に表示されている版まで差し戻し。
<b>[rollback (AGF)]</b>…この編集をした利用者の版を全て差し戻す。要約欄に差し戻し理由の記述が可能で、要約欄に「Reverted good faith edits by…」と表示される。主に初心者の差し戻しに使用する。
<b>[rollback]</b>…この編集をした利用者の版を全て差し戻す。要約欄に差し戻し理由の記述が可能。
<b>[Vandalism]</b>…この編集をした利用者の版を全て差し戻す。要約欄に差し戻し理由の記述が不可能で、確認なしに差し戻す。

<h3>導入法と注意</h3>
<a href="https://meta.wikimedia.org/wiki/Special:Mypage/global.js">このページ</a>に、

```rb:global.js
if ( (mw.config.get("wgDBname") !== "wikidatawiki") && (mw.config.get("wgDBname") !== "testwikidatawiki") ) { // Don't work in Wikidata
    // Fork of Twinkle intended to work on as many wikis as possible
    mw.loader.load('//meta.wikimedia.org/w/index.php?title=User:Xiplus/TwinkleGlobal.js&action=raw&ctype=text/javascript');
}
```

と書き込み、キャッシュを消去したら使えるようになります。その際、<b>Wikimediaのアカウントを持っているか確認し、そのアカウントでWikipedia Metaにログインしている</b>ということを確認してください。

また、Twinkleを使用した編集は全て<b>自己責任</b>です。ウィキペディアの方針・ガイドラインを理解し、それらの方針の許容範囲内でこのツールを使用しなければ、アカウントが<b>投稿ブロック</b>されます。Twinkleなどの荒らし対策ツールを使用する場合は、適切な使用をして下さい。

<h2>ProveIt</h2>
<b>ProveIt</b>は出典の追加や編集を簡単にできるツールです。これを使用すると、テンプレートの引数がわからない初心者でも容易に出典の追加や編集が行えます。

このツールを使うには、編集画面の右下にある<b>[P]</b>というボタンをクリックし、そこに出てきたGUIで引数を編集することができます。

<h3>導入法</h3>
このツールの導入法は簡単で、まずはWikipedia日本語版にログインして<a href="https://ja.wikipedia.org/wiki/特別:個人設定">このページ</a>を開いて<b>ガジェット</b>というところをクリックし、下にスクロールしていき<b>編集補助</b>という欄にある「ProveIt - 出典の追加、編集、検索に使用できるGUIを追加するツール（試す）」という設定をオンにして「保存」をクリックしてください。個人設定が保存され、使えるようになれます。

<h2>HotCat</h2>
<b>HotCat</b>はカテゴリ編集を手助けするためのツールです。カテゴリの検索機能を持ち、カテゴリの変更、付加、除去作業をサポートします。詳しいことや使い方はWikipediaのページ、<a href="https://ja.wikipedia.org/wiki/Wikipedia:HotCat">Wikipedia:HotCat</a>を参照してください。

<h3>導入法と注意</h3>
Wikipedia日本語版にログインして<a href="https://ja.wikipedia.org/wiki/特別:個人設定">このページ</a>を開いて<b>ガジェット</b>というところをクリックし、下にスクロールしていき<b>編集補助</b>という欄にある「HotCatはカテゴリ編集を助けるためのツールです。カテゴリの変更、付加、除去作業をサポートします。」をオンにし、「保存」をクリックしてください。個人設定が保存され、使えるようになります。

<h2>CharInsert</h2>
<b>CharInsert</b>はキーボードで入力しにくいマークアップや文字の入力を補佐するツールです。編集画面の下部にツールバーが表示され、いろいろな記号やマークアップをワンクリックで表示することができます、

<h3>導入法</h3>
Wikipedia日本語版にログインして<a href="https://ja.wikipedia.org/wiki/特別:個人設定">このページ</a>を開いて<b>ガジェット</b>というところをクリックし、下にスクロールしていき<b>編集補助</b>という欄にある「CharInsert: 編集画面の下にマークアップや特殊文字の入力を補佐するツールバーを追加（解説）」をオンにし、「保存」をクリックしてください。個人設定が保存され、使えるようになります。

<h2>まとめ</h2>
いかがでしたか？<br>このように、Wikipediaには様々なツールがあります。これらの有用性や注意を理解したうえで使用していきましょう。

<h2>参考記事</h2>
* <a href="https://ja.wikipedia.org/wiki/help:Twinkle">Help:Twinkle</a>
* <a href="https://ja.wikipedia.org/wiki/利用者:ネイ/DisamAssist">利用者:ネイ/DisamAssist</a>
* <a href="https://ja.wikipedia.org/wiki/Wikipedia:ProveIt">Wikipedia:ProveIt</a>
* <a href="https://ja.wikipedia.org/wiki/Wikipedia:HotCat">Wikipedia:HotCat</a>
* <a href="https://ja.wikipedia.org/wiki/Help:CharInsert">Help:CharInsert </a>
Eclipseで使っているMavenのバージョンを確認する方法

Mavenをわざわざインストールしたわけじゃなくて・・・Eclipseでつかっているだけ・・・な時のこと

# 方法1つめ : 実行の構成から実行して出力する
参考 : [Maven+Eclipse(m2e)上で「mvn -version」の結果を表示する方法](https://did2memo.net/2012/10/23/maven-eclipse-mvn-version/)

1. [実行] > [実行の構成]でダイアログを開く
2. [Mavenビルド] > 以下を設定 > [実行] > [コンソール]に出力される
    - [既定ディレクトリー] : なんでもいいみたいだけど、とりあえず[ワークスペース]ボタンでワークスペースを設定しとく
    - ゴール : `-version`

![スクリーンショット 2020-12-22 22.46.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/a840894c-2549-d7f9-573d-da9d12e73e74.png)

```text:コンソールに出力されたもの
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /Applications/Eclipse_2020-12.app/Contents/workspace/tryJSF/EMBEDDED
Java version: 11.0.8, vendor: N/A, runtime: /usr/local/Cellar/openjdk@11/11.0.8/libexec/openjdk.jdk/Contents/Home
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.16", arch: "x86_64", family: "mac"
```


# 方法2つめ : 設定で見てみる
参考 : [Eclipseのm2eで操作するmavenのバージョンの確認の仕方について - Qiita](https://qiita.com/sakamotoyuya/items/1e16c357889bbdb23335)

1. [Eclipse] > [Preferences]でダイアログを開く
2. [Maven] > [インストール] > [EMBEDDED]
![スクリーンショット 2020-12-22 22.40.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/19b22012-b08c-9705-7e35-d49a3e81b526.png)
【Ruby】特異メソッドと特異クラス

# 特異メソッドと特異クラス

特定のオブジェクトのためだけのメソッドやクラス、というRubyの概念。

## 特異メソッド

- 特異メソッド `build_greeting` は、定義時に変数 `message` が参照していた文字列オブジェクトにだけ属する。

```rb
message = "Hello"  # 文字列オブジェクト
def message.build_greeting(target)
  "#{self}, #{target}."
end
message.build_greeting("world")  # => Hello, world.
message2 = "Hello"  # 値は同じだが異なるオブジェクト
message2.build_greeting("world")  # => NoMethodError
```

### Singletonパターン

- そのクラスのインスタンスが1つしか生成されないことを保証するGoFのデザインパターン。

```rb
CENTRAL_REPOSITORY = Object.new
def CENTRAL_REPOSITORY.register(target)
  @registered_objects ||= []
  unless @resgistered_objects.include? target
    @registered_objects << target
  end
end
def CENTRAL_REPOSITORY.unregister(target)
  @registered_objects = []
  @registered_objects.delete(target)
end
```

## 特異クラス

- 特異クラスの定義式は、 `class` 式において「 `<<（オブジェクト）` 」と記述する。
    - オブジェクト `CENTRAL_REPOSITORY` は、特異クラス `（CENTRAL_REPOSITORY）` に属するようになる。
    - 特異クラス `（CENTRAL_REPOSITORY）` に追加されたインスタンスメソッドは、オブジェクト `CENTRAL_REPOSITORY` に対して呼び出すことができる。

```rb
CENTRAL_REPOSITORY = Object.new
class << CENTRAL_REPOSITORY
  def register(target)
    @registered_objects ||= []
    unless @registered_objects.include? target
      @registered_objects << target
    end
  end
  def unregister(target)
    @registered_objects ||= []
    @registered_objects.delete(target)
  end
end
```

### 特異メソッドとの関係

- **特異メソッドとは、特異クラスのインスタンスメソッド** のこと。
    - つまり上記2つの例で起きていることは同じ。

## クラスメソッド とメタクラス

- **クラスメソッドとは、`Class` オブジェクトの特異メソッド** のこと。

- 疑似変数 `self` は `Duration` 自体を参照しているので、 `a_week_from` は `Duration` の特異メソッド。

```rb
class Duration
  def self.a_week_from(from)
    return self.new(from, from+7*24&60*60)
  end
end
p Duration.a_week_from(Time.now)
```

### メタクラス

- **メタクラスとは、`Class` オブジェクトの特異クラス** のこと。

- 特異クラス `（Duration）` のことを、`Duration` のメタクラスとも呼ぶ。

```rb
class Duration
  class << self  # self(=Duration)の特異クラスを定義
    def a_week_from(from)
      return self.new(from, from+7*24*60*60)
    end
  end
end
p Duration.a_week_from(Time.now)
```

# まとめ

「`A`クラスのクラスは`Class`クラス（ = `A`クラスは`Class`オブジェクト）」 という点を理解することでピンときた。


# 参照

- [初めてのRuby](https://www.oreilly.co.jp/books/9784873113678/)
- [Rubyのメタクラス階層](https://blog.yugui.jp/entry/768)
- [Ruby 初級者のための class << self の話 (または特異クラスとメタクラス)
](https://magazine.rubyist.net/articles/0046/0046-SingletonClassForBeginners.html)
- [結局、Rubyの特異メソッドって何なの？ ](http://blog.livedoor.jp/sasata299/archives/51497378.html)
- [【Ruby】特異メソッドについて
](https://qiita.com/ta-chibana/items/7965d246ab67e14c175a)
M1 mac Docker preview版でmysqlを使う方法

## docker previewのinstall
[このページ](https://www.docker.com/blog/download-and-try-the-tech-preview-of-docker-desktop-for-m1/)のDownload it here!と言うところからダウンロードできます。
![Screen Shot 2020-12-22 at 22.27.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309490/fdcf327b-137c-6022-03a7-05968257ab0b.png)

## mysqlの使い方
バグなのかよくわからないですが

```docker-compose.yml
image: mysql:latest
```

では動かず、

```docker-compose.yml
image: mysql@sha256:dce31fcdd15aaedb5591aa89f19ec37cb79981af46511781fa41287d88ed0abd
```
のように、タグではなくDIGESTの欄のIDを指定しないと以下のようなエラーができる。latest以外のタグでも動いたので開発中のmysqlのバージョンでも動くと思います。

```terminal
ERROR: no matching manifest for linux/arm64/v8 in the manifest list entries
```

## まとめ
preview版なのでこういったことが起きるのかもしれない。
人柱として、内容があまりないですが記事にさせて頂きました。
Pardot Lightning アプリケーションの基本 ⇒ Pardot Lightning アプリケーションの操作方法について

１．Pardot のメニューナビゲーションに含まれる 4 つのカテゴリは何ですか?
２．[作成されたプロスペクト] テーブルに表形式で表示されるのはどのようなプロスペクトですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/6889f78b-a2bf-50a5-56af-39eb5b211109.png)
gitlab-ci(gitlab-runner)で、「fatal: missing blob object 〜error: remote did not send all necessary objects」とジョブが失敗してしまう。


先程まで動いていた、gitlab-runnerが、下記エラーで動かなくなってしまった。。:frowning2:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37406/27326115-a1b2-fff1-198d-f6a873b33914.png)

```shell:gitlab-runner
Fetching changes with git depth set to 50...
Reinitialized existing Git repository in /tmp/builds/〜
fatal: missing blob object 'b80eee3b3c630cef3XXXXXXXX'
error: remote did not send all necessary objects
ERROR: Job failed: exit status 1
```

ようするに、gitlab-runner install時に、指定したディレクトリにキャッシュファイルを作っているようなのですが、
これが何かが原因で壊れてしまい毎回エラーになっていました。

ググっても情報が見つからなかったので念の為メモ。

gitlab-runnerをインストールした時に指定したディレクトリに、
ビルドに必要な作業ディレクトリのようなものを作っていたのを思い出した。

gitlab-runnerをサーバーにインストールした時

```bash:
$ sudo gitlab-runner install -u execuser -d /tmp/
```

インストール時に作られた設定ファイルにも記載が。

```config:
$ sudo vim /etc/systemd/system/gitlab-runner.service
[Unit]
Description=GitLab Runner
After=syslog.target network.target
ConditionFileIsExecutable=/usr/lib/gitlab-runner/gitlab-runner

[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/lib/gitlab-runner/gitlab-runner "run" "--working-directory" "/tmp/" "--config" "/etc/gitlab-runner/config.toml" "--service" "gitlab-runner" "--syslog" "--user" "execuser"


```

それで、その対象のディレクトリを削除してみると。。（※削除コマンドなので扱い注意）

```bash:
$rm -r /tmp/builds/
```

ジョブを再度走らせてみると。。！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37406/fafc3e7a-df79-e6bb-a722-75f4995d806d.png)

成功！！！
対象ディレクトリを削除する事で、無事ジョブが走るようになりました。:coffee:

また、他の方法としてgitlab-runnerを再度`gitlab-runner register`などで作り直しても改善されました。
（working-directory削除の方が楽かな。）
Pardot Lightning アプリケーションの基本 ⇒ Pardot Lightning アプリケーションの使用開始

１．Pardot でビジターをプロスペクトに変換するために必要な情報にはどのようなものがありますか?
２．リードの育成はマーケティングオートメーション戦略で重要な役割を担います。リードの育成ではどのようなことを行いますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/33d70089-371a-bf43-4e9b-95110f913d2e.png)
毎日投稿約半年（180日）経っての振り返り

# どうも7noteです。毎日投稿の定期振り返りです。

Qiitaを毎日投稿して、毎日投稿することによってどのような効果があるのか、また記録を残していくことで今後Qiitaで記事を書いていこうと考えている方の参考や励みになればと思って投稿しています。

[←前回(2020/11/23)の振り返り](https://qiita.com/7note/items/8f40174cf99fe04c73d1)

## 毎日投稿の振り返り

### 現状の実績

※2020年11月23日現在（前回の振り返りから約1ヶ月）

- 総投稿数　　　：**180本**
- 累計LGTM数　 ：**165(22増)**
- Qiitaフォロワー : **33人(3人増)**
- Twitterフォロワー:**34人(変更無し)**
- アナリティクス:  直近1週間の閲覧数 **1,168回**

アクセス数の増加はあまりなく、少し波があります。
毎週土日のアクセスが平日と比べると約半分くらいまで落ちるので、Qiitaの利用ユーザーは予想通り会社員や平日に働きながら見ている方が多いのかなという印象です。

LGTMの数は約半分が新規記事でのLGTML、もう半分は過去150本の記事のLGTMでした。


### 主な投稿内容

HTML CSS javascript等の初心者向けの記事
前回からあまり変更はありません。

### 人気記事TOP3

過去に一番見られている記事です。

・[【初心者でもわかる】cssで文字を等間隔（均等割り付け）にしたり、数行の文章の右端がキッチリ揃う方法](https://qiita.com/7note/items/2d3566c17a1d3949f6c8)
・[【初心者でもわかる】疑似要素が表示されない時に確認する7つの事 ＆ 確認方法](https://qiita.com/7note/items/7cb88dca241a22b54e5c)
・[【初心者でも分かる】定義リスト（dl）を使って、tableみたいな表組みデザインを作る方法（レスポンシブ対応）](https://qiita.com//7note/items/e5b3212e406a7852b052)

## この1ヶ月での気づき

・過去の投稿でも結構LGTMされることが多い。（一ヶ月についたLGTMLの半分は過去の記事）
・ネタ切れに追われる日々。。。おそらくHTMLとCSSだけで150記事書けたら軽く教本作れるくらいの分量あると思う。
・Qiitaでの需要は**「本には書いてないけど、こういう事したいんだよなぁ」**とか、**「デザイナーからこうしてほしいって言われるけど実際どうすればいいのやら」**みたいな疑問を解決できるような記事の需要が高いのかなと思います。

## 半年を振り返って

始めた頃は正直半年も続けられるとは思っていませんでした。
実際に続けてみることで需要がわかりますし、どのような事で困っている人がいるのかなどが可視化され、わかりやすくなりました。

ただデメリットは前回も書いた通り**時間**くらいなものなので、それによって得られるメリットのほうが遥かに多いなと思います。記事を書くスピードも少しずつではありますが早くなっています。
初心者向けの記事が多いので、ゆくゆくは記事をリライトして初心者向けのサイト立ち上げに移したいなと考えております。


#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
オブジェクト指向プログラミング とは？ 〜 初心者編 〜

「**オブジェクト指向プログラミング**」という言葉はよく聞きますが、いまいち理解できていなかったので調べて見ましたが、あくまでプログラミング初心者の備忘録になるので間違いなどありましたら、どんどんご指摘願います。

またオブジェクト指向について説明している技術書やWebサイトは数多く存在し、どの説明もバラバラ、答えはエンジニアによってもバラける。
明確な答えがないのだから、ざっくり雰囲気を理解しておけばいい100%理解しようとするとよくわからなくなるし、あとは自分の成長と共に、理解が進んでいき、自分の中で定義ができるようになる。
というスタンスなので、現時点では100%理解を求めていないです。
以上宜しくお願いいたします。

* * *
 
### オブジェクト指向とは

まず始めに、オブジェクト指向とは、特定のプログラミング言語や手法の名前ではなく、プログラミングを行う際の考え方。「**概念**」ということである。
※概念→物事や対象を丸ごとひっくる見たときの大まかな理解のこと。思考において把握される、物事の「何たるか」という部分。

wikipediaで調べると

`オブジェクト指向プログラミング（オブジェクトしこうプログラミング、英: object-oriented programming、略語:OOP）とは、互いに密接な関連性を持つデータとメソッドをひとつにまとめてオブジェクトとし、それぞれ異なる性質と役割を持たせたオブジェクトの様々な定義と、それらオブジェクトを相互に作用させる様々なプロセスの設定を通して、プログラム全体を構築するソフトウェア開発手法である。`

とある。
また、オブジェクト指向が生まれた背景には、コンピュータ技術が急速に発展し、目的に合ったプログラムを書くためには膨大な行数のコーディングが必要となり、プログラミングの複雑化があったこと。
そして、この解決策として生まれた発想が、プログラミングを「モノの集まり」としてとらえる考え方だった。

さらに噛み砕いて、わかりやすく説明したいが、現時点の私のレベルでは説明できないので、下記は「[オブジェクト指向とは？](https://coeteco.jp/articles/10837)」の記事を参考にさせていただきました。

####プログラムの中のオブジェクト=モノとは？
例として、「3Dモデルでひとつの都市を構築する場合」を考えてみる。
※ドライブゲームなどで出てくる風景と思っていただければOK。

「**オブジェクト指向以前の考え方**」と「**オブジェクト指向**」の考え方をそいれぞれ説明します。

■オブジェクト指向以前の考え方
建物や道路やその上を走る自動車などを「モノ」として捉えない方法
つまり、

- 四角くて白い物体にいくつかの穴が開いている物体 = 建物
- 幅のある平らな白いライン = 道路
- 箱に4つの可動性の輪がついている = 自動車

を羅列するような方法がとられていた。

■オブジェクト指向
まず「建物」、「道路」、「自動車」と**名前をつけた「モノ」を用意する**ところから始める。
その後に、「建物」には、「四角い」、「コンクリートでできている」、「中は部屋で分かれている」などの特徴があると、定義していく。

以上のように、オブジェクト指向が生まれる前は、都市を「ひとつの連続したプログラム」で、『「自動車」だけを人に頼む』という方法がとりづらかった。
一方でオブジェクト指向では、「都市」を「建物」、「道路」、「自動車」などの「**オブジェクト化された個々のプログラムの集合**」と捉え、一つ一つを切り離して作ることができる。

これが従来の方法とオブジェクト指向との違い。
プログラミングを便利かつ合理的にしていく考え方がオブジェクト指向と言える。

* * *
###オブジェクト指向のメリットとは
オブジェクト指向には下記のようなメリットがある。

- **プログラミングの全体像を把握しやすい**
- **分業や共同作業がやりやすい**
- **改良や修正がやりやすい**
- **プロセスしだいでプログラミングを高速化や軽量化できる**

一つずつ見ていきましょう。

■**プログラミングの全体像を把握しやすい**

上記「都市」の例に戻ると、従来の方法は「境目のない連続したコンピュータへの命令」としてプログラミングされるのに対し、オブジェクト指向では「建物と道路と自動車でできた場所」と認識できる。

**プログラム全体の構造が明確に把握でき、実際の都市を設計するようなイメージでプログラムを設計できる。**

まずは全体のイメージを練り、そのあとに細部を練っていく...という企画の進め方ができる。

■**分業や共同作業がやりやすい**

全体のプログラムが連続していて区切りがない場合、複数のプログラマーが共同作業することは難しくなる。
一方でオブジェクト指向なら「わたしは全体の構造を作っていくので、あなたは建物を作ってください」とプログラムを切り分けながら、分業作業を行うのがはるかに容易になる。

オブジェクト指向の登場は、何百人ものプログラマーが関わる巨大システム実現に貢献したと言われている。

■**改良や修正がやりやすい**

プログラミングの作業は、たえず修正や変更を加え、繰り返しながらゴールへ向かう例がほとんどである。
たとえば、完成間近になってから、すべての「建物」の屋上に「アンテナ」を付けたいと修正意見がでたとする。
「一つのつながり」のプログラムなら「すでに作ったすべての建物にアンテナのプログラムを一つ一つ挿入していく」作業が発生し、膨大な作業量になってしまう。

一方でオブジェクト指向なら「建物」の定義に「アンテナ」を追加すれば、たった一つのアクションですべての「建物」を修正できる。

プログラムの中に横串を入れるように、**一気に修正できる**のがオブジェクト指向の特徴である。

■**プロセスしだいでプログラミングを高速化や軽量化できる**

オブジェクト指向のプログラミングは、電子部品などの回路設計にも似ている。

「パーツとパーツをつなげて全体の機能を生み出していく」回路設計と同様に「全体プログラムをどのようにグルーピングして切り分けていくか」、つまり構造を作っていくのがプログラマーの重要な役割になる。

この考え方をすると、計算を大幅に高速化でき、メモリの軽量化も可能になる。

事実、「普通の人なら100行かかるプログラムを5行で書いてしまう」天才プログラマーも世の中に存在しているという。
こんなことが可能になるのはオブジェクト指向のおかげと言える。

* * * 
###おわりに

オブジェクト指向について、複数の記事を拝見しましたが、今回参考にさせていただいた記事が自分にとってはすんなりと理解できた感じがします。そして、プログラミング 初心者には、とてもわかりやすい記事だったと思いますが如何だったでしょうか。
100%の理解はできていないですが、これから経験をつんでもっと理解を深めていきたいと思いますので、宜しくお願いいたします！！
PIR Hat + M5StickC で、人を感知したら、Microsoft Teamsにお知らせする。

#PIR Hat + M5StickC で、人を感知したら、Microsoft Teamsにお知らせします。

LINEは個人用途、Microsoft Teamsは会社用途って感じで使い分けていると思います。
職場で使うことを想定して、PIRセンサー(人感センサー)がMicrosoft Teamsにお知らせします。
職場で、またはリモートワークで、「この人が机に戻ってきたら知らせてほしいな」とか「この廊下を人が通過したら知らせてほしいな」という場面があったら、これを作ってみましょう。


M5StickC PIR Hatはこちら
https://www.switch-science.com/catalog/5756/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269534/15fbb0f8-136c-e1c1-6ba0-5f2f41c0d326.png)

M5StickC PIR HatとM5StickCを接続します。

#Microsoft TeamsのWebhook URLを取得する
このサイトの説明が分かりやすいです。
https://faq.form.run/microsoftteams-webhook
1.Teamsアプリ内で「Incoming Webhook」を追加
2.Incoming Webhookをチームに追加する
3.通知を受け取るチャネルの設定
4.Webhookに任意の名前とアイコンを設定する
5.Webhook URLをコピー 
までの手順を行って、Webhook URLを下のコードにペーストします。


#M5StickCは以下のコードを

```c
#include <M5StickC.h>
#include <WiFi.h>
#include <ssl_client.h>
#include <HTTPClient.h>

const char* ssid = "XXXXXXXXX";   //INPUT your wifi ssid
const char* passwd = "XXXXXXXXXXXXX";  //INPUT your wifi password

HardwareSerial serial_ext(2);

void setup_wifi() ;
void setup() {
  M5.begin();
  setup_wifi();
  M5.Lcd.setRotation(3);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.println("WiFi_Connected, for Teams");
  pinMode(36,INPUT_PULLUP);
}

void loop() {
  M5.update();
  delay(500);
  M5.Lcd.setCursor(60, 30, 4);
    M5.Lcd.println(digitalRead(36));
    int data = digitalRead(36);
    if (data == 0) {
    M5.Lcd.setCursor(60, 30, 4);
    M5.Lcd.println(data);
  } else if (data == 1) {
    send_message();
    M5.Lcd.setCursor(60, 30, 4);
    M5.Lcd.println(data);
  } 
  vTaskDelay(2000 / portTICK_RATE_MS);
}

 /* Wifiに接続する */
void setup_wifi() {
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, passwd);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

// Teamsへの通知
void send_message(){
  HTTPClient http;
  String url = "XXXXXXXXXXXXXXXXXXXX";  //INPUT Teams Webhook URL
  if (http.begin(url))
  {
    String payload = "{'text':'感知した'}"; //INPUT your original message
    int httpCode = http.POST(payload);
  }
}
```

#こんな動きをします
PIRセンサーが感知していない時は0が表示され、感知したときは1が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269534/95ac696d-1c49-b951-2d08-5db0282c22e8.png)

そして感知したときに、Microsoft Teamsにメッセージが届きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269534/795583f4-c6e9-1ad9-b204-119d1c8cac22.png)

PIRセンサーは、Passive Infra Red（赤外線）センサーで、温度変化が発生すれば、反応します。横切るような動きには敏感に反応しますが、ゆっくりな動きでは反応しないことがあります。また空調による空気の温度変化のユラギにも反応することもあり、思った通りには反応してくれないこともありますが、まず試してみるプロトタイプには最適です。

まず試してみる楽しいプロトタイプ生活を！！
Azure Windows Virtual MachineにDiskを追加する

#ディスクの種類

| 種類 | シナリオ | 最大ディスク サイズ | 最大スループット | 最大 IOPS |
|:------------:|:------------:|:------------:|:------------:|:------------:|
| Standard HDD | 32,767 GiB   | This         | 500 MB/秒    | 2,000        |
| Standard SSD | 32,767 GiB   | column       | 750 MB/秒    | 6,000        |
| Premiere SSD | 32,767 GiB   | will         | 900 MB/秒    | 20,000       |

Azure Document：[マネージドディスク](https://docs.microsoft.com/ja-jp/azure/virtual-machines/disks-types?toc=/azure/virtual-machines/linux/toc.json&bc=/azure/virtual-machines/linux/breadcrumb/toc.json)


#ディスクの追加手順
##1.Azure Portal で Disk の追加をする

1．Diskを追加したい仮想マシンを表示し、[ディスク]をクリックします
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683282/0c0459e2-5893-8fd4-a032-a5fdb8686fcb.png)

2．データディスクの[新しいディスクを作成し接続する] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683282/46acd14a-54de-28a1-76d5-8ccd90256231.png)

以下を選択し、[保存]を押す
　LUN　　　：基本的にそのままでよいです。
　ディスク名：この項目からディスクを追加します。
　ストレージの種類：必要に応じて変更します。
　サイズ(GiB)、　
　暗号化
　ホストキャッシュ

##2.Windows OS側でディスクを追加する

1. デスクトップ左下のスタートメニューを右クリックし、[ディスクの管理] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683282/92dd6bfd-fe65-0609-2a4c-b66e6f91a0f4.png)

2. ディスクの初期化ウィンドウが表示されますので、ここで [OK] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683282/e8df9e31-ffa5-edd7-b07c-c1c62d9c6d08.png)

3. 画面下にあります、未フォーマットのディスクを右クリックし、[新しいシンプル ボリューム] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683282/ef7a1dd2-63a8-033b-fe67-d6f79cd21421.png)

4. [次へ] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683282/4a3d174f-2d64-f925-d434-5d793e7c3595.png)

5. ボリュームサイズを必要に応じて変更します。初期値は最大値になっています。

[次へ] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683282/bde44b1f-4cdc-a56d-cab8-721ea30814c8.png)

6. ドライブ文字（ドライブレター）を必要に応じて変更します。

[次へ] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683282/95e28f7c-3d00-87ba-5cc1-02f7e2296ce2.png)

7. フォーマットの内容についてです。

ここではボリュームラベルを Data という名前にしたいので変更します。

[次へ] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683282/d49a9029-07b8-9a3f-4152-798264a3460b.png)

8. [完了] をクリックします。ディスクのフォーマットが開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683282/6c62b6b4-f53e-4ae1-ec47-bad933ecf019.png)

9. ディスクのフォーマットが完了しますと、以下の表示になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683282/47f2f57e-a534-1671-575e-81cd944028c9.png)

10. コンピューターからも E ドライブとして、ディスクが見えるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683282/7213e8b2-f3c7-36c5-5a91-122b7439d057.png)
正規表現の簡単なまとめ

##正規表現
. ^ $ [] * + ? | ()
特殊文字を使って、複数パターンの数字や文字をカバーする。

##デリミタと修飾子
/[a-z0-9]+/xyz
/をデリミタという。/と/でどの部分をカバーするのか。
言語によってデリミタは異なる。
xyzの部分を修飾子という。デリミタの中に機能を追加する。

##メタ文字
独自の機能を持った文字のことをメタ文字という。
[](角カッコ) = 文字または数字を1文字分

```
/orange/ orangeの場合
match → orange
Not match → apple, orbnge, orcnge

/or[abcde]nge/ 3文字目がabcdeいずれかの場合
match → orange, orbnge, orcnge, ordnge
Not match → apple, orznge
```

##キャロット
^(キャロット) = 直後の文字または数字を指定しない

```
/or[^abcde]nge/ 3文字目がabcde以外のない場合
match → ×
Not match →  orange, apple, orbnge, orcnge, ordnge, orenge
```
##ハイフン
-(ハイフン) = 文字数字の範囲を指定する

```
/or[a-e]nge/ 3文字目がa~eのいずれかの場合
match →  orange, orbnge, orcnge, ordnge, orenge
Not match → apple, orfnge

/or[^a-zA-Z0-9]nge/ 3文字目が小文字のa~z,大文字のA~Z,数字の0~9以外の場合
match → or*nge, or:nge, or(nge

/or[a-zA-Z0-9+^]nge/ ^を指定したい場合は最後に書く
match → or^nge
```

##バックスラッシュ
\(バックスラッシュ) = 直後のメタ文字を単なる文字として扱う

```
/or[a-zA-Z0-9+^\[]nge/ [を文字として扱う場合
match → o[nge
```

##ワイルドカード
.(ピリオド) = ワイルドカード。全ての文字が対象。
処理速度を最優先にする場合は使わない方が良い。

```
/gr.y/ 3文字目は何でも良い場合
```

##パイプ
|(パイプ) = 左右のどちらかにマッチするか判定する

```
/lem[ao]m|pe.ch/
match → lemon, peach
not match →  orange, apple
```
##スペース
正規表現ではスペースもカウントされる。

```
/lem (on|pe) ach/
match → lem on ach
not match → lemon, peach
```

##数量詞
繰り返したいパターンの直後

+(プラス) = 1回以上の繰り返し

```
/be.+y/
match → berry, berrrrry

/<a[^>]+>/ aタグを抽出したい場合
```
*(アスタリスク) = 0回以上の繰り返し

```
/be.*y/
match → bey, berry
```
?(クエスチョンマーク) = 入力なしか1文字のみ

```
/be.*y/
match → bey, bery
not match → berry
```
{n} = n回の繰り返し
{n,} = n回以上の繰り返し
{n,m} = n回以上、m回以下の繰り返し

```
/one.{5}/
match → one step
```
最長一致(デフォルト)

```
I have two apples and a banana.
/two.{0,}a/
match → two apples and a banana
```
最短一致
?(クエスチョンマーク) = 数量詞を最短一致にする

```
I have two apples and a banana.
/two.{0,}a?/
match → two a
```
##丸括弧
()(丸括弧) = 正規表現をグループ化する

```
25.48.8.29
127.0.0.0
0.0.0.0
50.96.38.64
255.255.255.255
158.06.125.83
272.5.260.85
5862.654.384.0

/((25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})\.){3}/
```

##区切り
^ = カバーする範囲の先頭を行頭に指定

$ = カバーする範囲の最後を行末に指定

\b = スペースや改行による単語の区切り
\B = \b以外の区切り

\+ 1文字のメタ文字では、大文字にすると機能が逆になる

##ショートコード
[0-9] = \d
[^0-9] = \D
[a-zA-Z0-9_] = \w
[^a-zA-Z0-9_] = \W

\n = 改行
\t = タブ
\r = リターン
\f = 改ページ
[\n\t\r\f ] = \s
[^\n\t\r\f ] = \S

##修飾子

g(global) = マッチする結果全てを抽出

i(case-insensitive) = 大文字と小文字を区別しない

m(multiline) = ^と$の挙動を変え、複数行を対象にする

##日本語
・ひらがな
[ぁ-ん]
[\u3041-\u3096]
[\x{3041}-\x{3096}]

・カタカナ
[ァ-ヶ]
[\u30A1-\u30FA]
[\x{30A1}-\x{30FA}]

・漢字
[亜-熙]
[々〇〻\u3400-\u9FFF\uF900-\uFAFF]|[\uD840-\uD87F][\uDC00-\uDFFF]
[々〇〻\x{3400}-\x{9FFF}\x{F900}-\x{FAFF}]|[\x{D840}-\x{D87F}][\x{DC00}-\x{DFFF}]

・半角文字以外
[^\x01-\x7E]

##電話番号

```
<form>
 <input type="text" pattern="">
</form>
//pattern属性の中にデリミタを除いた正規表現を書く

フリーダイヤル 0120-(\d{2}-\d{4})|(\d{3}-\d{3}))
市外局番 \d{2,4}-\d{2,4}-\d{4}
携帯番号 (090|080|070)-\d{4}-\d{4}
```

##URL

```
<input type="text" pattern="http[s]?:/\/\[\w/%&$#?()=~+-]+">
```

##メールアドレス

```
<input type="text" pattern="[\w-]+@([\w-]+\.)+[a-zA-Z]{2,}">
```

##JavaScriptによる文字検索
```
var reg = new RegExp(/\d+/);
reg.exe("");
```

```
var str ="~~~"
str.match();
```
Android Studioでエミュレータが起動できないときの解決法

Android開発を始めたらAVDが起動しなくて沼ったのでメモ代わりに残す。

# 症状
AVDを起動しようとすると「Android emulator gives error “Resetting for cold boot: emulation engine failed” and exits」あるいは「The emulator process for AVD Pixel_2_API_29 was killed.」というエラーメッセージが出て起動できない。
が、古めのAPIを使っているAVDなら起動する。

# 解決法 (Intel CPU前提)
Tools > SDK Managerを起動して、「SDK Tools」からIntel x86 Emulator Accelerator(HAXM)にチェックを入れてダウンロードorアップデートする。
もしHAXMのインストールが失敗するようなら、自分の使用しているCPUがHAXMに対応しているかを確認しBIOSでIntel Visualization TechnologyがOnになっているか確認する。
そしてPCを再起動してもう一度試してみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212534/acc8011a-e78a-a89c-02de-be7d84a44560.png)

# 考察
私は以前にAndroid Studioを入れるだけ入れて放置していたため、HAXMが古いままアップデートされておらず、そのまま最新のAndroidのエミュレートをしようとしたため失敗したと思われる。
アプデに失敗して再起動したら直ったのは謎。

これだけで直らない場合はコメントしていただければ記事など修正します。
[メモ] カラムの型リスト


| 型            | 用途                       
| ------------ | --------------------------
| primary_key  | プライマリキー
| string       | 短い文字列
| text         | 長い文字列
| integer      | 整数（4バイト）
| bigint       | 整数（8バイト）
| float        | 浮動小数
| decimal      | 精度の高い少数
| numeric      | 数値
| datetime     | 日時
| timestamp    | 更新時間
| time         | 時間
| date         | 日付
| binary       | バイナリーデータ
| boolean      | 真偽値
備忘録 VMware関連　12/22更新 

■仮想化のホスト型とパイパーバイザー型の違い

・ホスト型・・・ホスト型はハードウェア上のOS上に土台となるソフトウェアをインストールし、そのソフトウェア上で仮想マシンを稼働させる方式。
ホストOS上で稼働しているアプリケーションという扱いになる？
一般的なPCや使用中のサーバにもインストールできるので非常に手軽。
一方でゲストOSからハードウェアにアクセスするにはホストOSを経由しなければいけないため、余計なオーバーヘッドがかかってしまい性能をフルに生かすことができない。

・ホスト型に分類されるもの・・・VMware Player、VMware Fusion、Virtualbox
等


・ハイパーバイザー型・・・ハイパーバイザーはホストOSの代わりにハードウェア上で直接動作する仮想化のためのosのようなもの。
サーバへ直接インストールし（OS上にインストールするわけではない）、仮想マシンを稼働させる方式。

ホストOSを挟まなくていい分ハードウェアに直接アクセス・制御できるので性能低下を最小限に抑えることができる。
加えて複数の仮想マシンを効率よく稼働させるための機能・仕組みがある。

ハイパーバイザー型に分類されるもの・・・ESXi、Hyper-V等


・VMware ESXi・・・VMware ESXiはハイパーバイザー型に分類される仮想化ソフトウェアの一種。

・VMware vCenter server・・・仮想化基盤を管理するためのソフトウェア。
vmy ESXiや仮想マシンに対し運用・管理の自動化、リソースの最適化、高可用性、管理の一元化といった機能を提供。
仮想マシンにインストールして使用することも可能。
機能はESXiの管理、vSphereの機能の有効化（HA、vMotion、Storage vMotion等）

・vSphere Web Client・・・VMware ESXiやvcenter Serverを操作するためのソフトウェア？

・クラスタ・・・直訳すると「集団」。
同じ構成のサーバを複数用意し、障害が発生した場合等は別のサーバに自動的に処理を引き継がせる仕組み。
ESXiではクラスタとして登録（クラスタリング）するとHAすることが可能になる。

・vSphere HA（High availability）・・・ESXiホストで障害が発生し、同クラスタ内のESXiと疎通が取れなくなってしまった場合に、自動で同クラスタ内の他のESXi上で障害が起こったESXiホスト上で稼働していた仮想マシンを再起動させ、使用できるようにする仕組み。
この仕組みによりサービスのダウンタイムを最小限に抑えることが可能。


・ハートビート・・・クラスタ内のESXiの間ではハートビートというお互いが正常に稼働しているかを確認する信号のやり取りをしている。他ESXiからハートビートを受信しない状態が１５秒続くとそのESXiで障害が発生したとみなし、障害が発生したESXi上の仮想マシンを他のESXi上で仮想サーバを再起動させることができる。
プラットフォームのエンコーディング (実際は UTF-8) を使用してフィルターされたリソースをコピーします。つまり、ビルドはプラットフォームに依存します!

# 事象 : Eclipseのログでなんか言われてる
- 環境
    - macOS Big Sur バージョン11.0.1
    - Eclipse IDE for Enterprise Java Developers. Version: 2020-12 M1 (4.18.0 M1)
    - openjdk version "11.0.8"
    - Apache Maven 3.6.3

```text
!ENTRY org.eclipse.m2e.logback.appender 2 0 2020-12-22 21:40:38.430
!MESSAGE プラットフォームのエンコーディング (実際は UTF-8) を使用してフィルターされたリソースをコピーします。つまり、ビルドはプラットフォームに依存します!
```

```text:英語版はこんな感じらしい
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
```

## 原因 : ソースの文字コードを指定していないから

> これはつまり、文字コードが指定されていないので、プラットフォームの文字コード（WindowsなのでMS932(CP932)）を使用していて、プラットフォーム依存のビルドになってしまっています（プラットフォームによって実行されるビルド内容が変わってしまうよ）、という意味です。
> [Eclipse+Maven：「Using platform encoding (MS932 actually) to copy filtered resources, &#8230;」エラーの対策方法](https://did2memo.net/2013/05/31/eclipse-maven-using-platform-encoding-error/)

```xml:pom.xmlに定義は見当たらない
<project xmlns="http://maven.apache.org/POM/4.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...省略...
  <properties>
    <!-- Mavenコンパイル用のJavaを定義 -->
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>
...省略...
</project>
```

### 対応 : 文字コードをpom.xmlのpropertiesに指定する

```xml:pom.xml
...省略...
  <properties>
    <!-- ソースの文字コードを定義 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
...省略...
```
マイクロドローン練習

ここで紹介するマイクロドローンは、手の平サイズで重量が100グラム以下
ホビー要素が強いですが、ドローン基礎を遊びながら学べる良いカテゴリーです
また、マイクロドローンは部品点数も少ないので覚えやすいと思います。

今回は購入からセットアップまでの流れを簡単に説明したいと思います
（悪戦苦闘すること１００％保証します　いらない保証ですね　苦笑）

【学びポイント】
　・飛行技術
　・ドローンハード知識
　・バッテリー知識
　・ドローン飛行パラメータ知識
　・メンテナンス知識



〔壱ノ型　購入！！〕
　家電量販店では購入できません。専門ショツプで単品を購入します。
　ラジコン飛行機系のショップ「FUNFUN」、「ROBIN」などが比較的購入しやすく
　商品検索も楽だと思います。（多分まだ販売してると思います）

　　※購入時の注意点として、日本の技術基準適合品を購入して下さい

　　【必要な物】
　　　・プロポ（技適に注意！！）
　　　・ドローン本体（６５系）
　　　・バッテリー（１〜２S）
　　　・充電器
　　　・パソコン
　　　・FPVに挑戦する場合、アマチュア無線ライセンと開局が必要になります。
　　

〔弐ノ型　ドローンセットアップ〕
　一般的なホビードローンと違い、箱から出して直ぐに飛ぶことはありません
　様々なセットアップが必要になります。（説明書もほぼ存在しません）

　　簡単に説明すると下記3つの設定を行います。
　　・プロポ本体の設定　　　　　：プロポについているレバーやスイッチの割付をします
　　・ドローンとプロポのバインド：Bluetooth機器のペアリング設定みたいな感じです
　　・フライトコントローラの設定：パソコンを接続し、ドローン本体の設定、プロポ設定を割付ます

〔参ノ型　バッテリー＆充電器〕
　専用のバッテリーと充電器が必要になります。

　軽視されがちですが、私たちが普段使用している乾電池と違い
　充電、放電、保管について専門の知識が必要です。

　一歩間違えると、爆発や火災に繋がり大変危険です
　まずは、バッテリーの基礎知識を学びましょう！！


（四ノ型　パソコン）
　・フライトコントローラを設定する為に専用ツールが必要になります（ツールは無料）
　・ドローンを接続するためのUSBケーブルが必要

　　　おすすめツール：ベータフライト


ここまで、たどり着ければ　訓練飛行修行に入れます。
Pass the Hash攻撃とは

【Pass the Hash攻撃とは？】

認証時に使用されるパスワードのHash情報を不正に取得し、そのHash情報を使用して認証を行う。
なりすまし攻撃の1種。

■そもそもHash情報とは？
Hash情報とはHash値に関わる情報をまとめてさしている様子。
hash：切る、刻む　という意味。

■Hash値とは？
Hash関数の戻り値。

■Hash関数とは？
入力されたデータを特定のルールに則って返す関数。
出てくる戻り値はぐちゃぐちゃの文字の羅列らしい。

抑えれば良いポイントは、
①同じ入力をすると同じ値が返ってくる。
②入力値が少しでも異なれば出力されるHash値は大きく変わる。
③Hash値から元データの特定はほぼ無理。
このあたり？

^余談
Hash関数に暗号的な性能を付け加えたものが、
「暗号学的Hash関数」というらしく、
ブロックチェーンでも使用されている。
有名なのは　SHA-256　らしい。
【JavaScript編】paizaの問題集を解いてみた

最近、JavaScriptを勉強し始めました。
paizaのレベルアップメニューのコードは公開自由とのことでしたので、勉強の記録として投稿します。

今回挑戦したのは、Cランクレベルアップメニューの「辞書」より「STEP: 1 辞書の基本」。
問題を掲載して良いかはわかりませんので、気になる方は下記よりご確認頂けたらと思います。
https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_dictionary_step1?language_uid=javascript


```
const fs = require("fs");
const inputs = fs.readFileSync("/dev/stdin", "utf-8").trim().split("\n");
const num = Number(inputs[0]);
const searchName = inputs[num+1];


for (let i = 1; i <= num; i++) {
    [personalName, property] = inputs[i].split(" ");
    if (personalName === searchName) console.log(property);
}
```

もっと良い書き方があると思いますので、アドバイス等頂けましたら嬉しいです。
Windows10にて ImageMagick インストール方法

# Windows10にて ImageMagick インストール方法
**Ruby on rails** 開発時に、gem 'mini_magick'、**ImageMagick**を使って、
画像を読み込んでアップロードするなどを実装したいけど、
**Windows10**で
"**Image Failed to manipulate with MiniMagick, maybe it is not an image? Original Error: You must have ImageMagick or GraphicsMagick installed**"
**エラー**が表示された方に、その解決方法を共有します。

## 環境の整理
- 開発環境：Windows10 Home　64ビットオペレーティングシステム、x64ベースプロセッサ
- Rails version 5系

##方法
1. ImageMagick公式（ https://imagemagick.org/script/download.php#windows ）サイトからImageMagick-[version]-xxx.exeをダウンロードする。
　（　例：ImageMagick-7.0.10-52-Q16-HDRI-x64-dll.exe　）

2. ダウンロードしたファイルを起動して、指示通りにインストールを進める。

3. **パソコン**を**再起動**する。**必ず**

OK
統計学のおける母関数総まとめ

# はじめに
本記事は確率分布において, 平均値, 分散の導出などに用いられる母関数についてのまとめを行った記事です.

# モーメント母関数
整数値をとる確率変数 $X$ の確率関数を $p(x)$ とし, $s$ を任意の実数とするとき, $X$ の確率母関数(モーメント母関数)を以下の式で定義する.

```math
G \left(s \right) = E[s^X] = \sum_{x = 0}^{\infty} s^x p(x)
```

このモーメント母関数をパラメータ $s$ で1階微分すると, 

```math
G' \left(s \right) = E[Xs^{X-1}] = \sum_{x = 1}^{\infty} x s^{x-1} p(x)
```

となるので, $G' \left(s \right)$ に $s=1$を代入すると, 

```math
E[X] = G' \left(1 \right)
```
となり, モーメント母関数から期待値が求められる. 同様にして, モーメント母関数をパラメータ $s$ で2階微分すると, 

```math
G'' \left(s \right) = E[X(X-1)s^{X-2}] = \sum_{x = 2}^{\infty} x(x-1) s^{x-2} p(x)
```

となるため, $G'' \left(s \right)$ に $s=1$を代入すると, 

```math
E[X(X-1)] = G'' \left(1 \right)
```

が求められる. 以上から, モーメント母関数から期待値, 分散を求める方法をまとめると, 以下のようになる.

```math
E[X] = G' \left(1 \right) \\
V[X] = G'' \left(1 \right) + G' \left(1 \right) + G' \left(1 \right)^2
```

# 積率母関数
先に述べたモーメント母関数において, $s = e^{\theta}$ を代入すると, 

```math
m \left(\theta \right) = E[e^{\theta x}] = G \left(e^{\theta} \right)
```

が得られる. この式を積率母関数と定義する.

積率母関数をパラメータ $\theta$ で1階微分すると, 

```math
m' \left(\theta \right) = E[x e^{\theta x}] 
```

積率母関数をパラメータ $\theta$ で2階微分すると, 

```math
m'' \left(\theta \right) = E[x^2 e^{\theta x}] 
```

であるので, $\theta = 0$ を代入した結果と合わせて考えると, 期待値, 分散は以下のようになる.

```math
E[X] = m' \left(0 \right) \\
V[X] = m'' \left(0 \right) - m' \left(0 \right)^2
```

# 特性関数
モーメント母関数, 積率母関数ともに, 広義積分あるいは無限級数の収束性を仮定しているため, それらの仮定を満たさないような場合にこれらの母関数を用いることができない. そこで, 虚数 $i$ を変数に組み込むことで, 広義積分あるいは無限級数の収束性を仮定せずに期待値, 分散を求めることができる母関数である特性関数を定義する.

モーメント母関数において, $s = e^{i t}$ を代入すると, 以下のような式が得られる. これを特性関数という.

```math
\phi \left(t \right) = m \left(i t \right) = E[e^{i t x}]
```

ここでもモーメント母関数と積率母関数と同様にパラメータに対して微分を行い, 期待値, 分散を導出したいが, 特性関数はパラメータが複素数となっているため, 実数関数において用いていた微分法を用いることができない. そこで, 複素微分を行う.

定義式より, 

```math
\phi \left(t \right) = E[e^{i t x}] = E[\cos tx + i \sin tx] = E[\cos tx] + i E[\sin tx]
```
であるから, パラメータ $t$ で1階微分すると, 

```math
\phi' \left(t \right) = E[i x e^{i t x}]
```

となるので, $t = 0$ を代入すると, 

```math 
E[X] = \frac{\phi' \left( 0 \right)}{i}
```
が得られる. 分散は

```math 
V[X] = - \phi'' \left( 0 \right) - ( \phi' \left( 0 \right) )^2
```

として与えられる.

# 母関数の性質
母関数の性質としては, 確率分布と一対一に対応していることである. これにより, 母関数上で確率分布と一致した場合, 確率変数はその確率分布に従うことがわかる. また, 独立な変数の和が母関数の積に対応している. 

# おわりに
本記事は統計学において出てくる母関数についてのまとめを行いました. 数理的な部分で気になった方は以下の参考図書の「現代数理統計学の基礎」をみてみると面白いのではないかと思います.

# 参考資料
[日本統計学会公式認定 統計検定準1級対応　統計学実践ワークブック](https://www.gakujutsu.co.jp/product/978-4-7806-0852-6/)
[現代数理統計学の基礎] (https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)
[複素関数論の基礎](https://www.shokabo.co.jp/mybooks/ISBN978-4-7853-1565-8.htm)
３年以上放置していた個人で公開中のiOSアプリを再度申請した話

ある日のこと、Appleから１通の通知が・・・
![スクリーンショット 2020-12-22 20.47.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29418/87277e4e-9785-77e9-970c-d2418b42de67.png)

DeepL翻訳
>2016年9月1日、意図した通りに機能しなくなったアプリ、現在のレビューガイドラインに従っていないアプリ、または時代遅れのアプリを評価して削除する継続的なプロセスを実施することを発表しました。
お使いのアプリがかなりの期間更新されていないことに気付きました。

[ハッシュタグの管理アプリ](https://apps.apple.com/jp/app/ハッシュタグ-メモ-lite/id1153380973)を公開中なのですが、気がついたら前回リリースから３年経過・・・
このまま削除されるのは悲しいので対応を行いました。

# ダークモード対応
ストーリーボードで各種パーツのプロパティを確認したところ、WhiteとかBlackとか固定のカラーを指定している部分がありましたので、システム系のカラーに変更しました。
開発当時はまさかダークモードなんて出るとは思っていなかったので・・・

- 背景で利用したシステムカラー
  - systemBackgroundColor
  - secondarySystemBackgroundColor
- テキストで利用したシステムカラー
  - textColor
  - secondaryLabelColor

![Simulator Screen Shot - iPhone 11 Pro Max - 2020-12-22 at 21.04.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29418/3295b492-2cc4-46b2-7e4a-c46494c5842a.png)

# APIのDeprecated対応

## URL呼び出し

API仕様が変わっていたので修正しました。
旧) [[UIApplication sharedApplication] openURL:url];
新) [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];

## UserDefaultの保存＆読み込み

こちらも最新の仕様に合わせて修正しました。
対応手順がやや複雑なのですが以下記事を参考に対応しました。
[iOS12 unarchiveObject(with:) was deprecated に対応する](https://qiita.com/rcftdbeu/items/2de95d1bc8f520f590ef)

## AutoLayout調整

ソフトウェアキーボードのアニメーションに合わせてUIパーツの位置を調整していたのですが、これもDeprecatedになっていたので対応しました。
Constraintの調整が望ましいと思ったのですが、うまい対応方法が分からず、力技でキーボードの高さとTabbarの高さを求めて対応しました。
旧) self.bottomConstraints.constant = rect.size.height - self.bottomLayoutGuide.length;
新) self.bottomConstraints.constant = rect.size.height - self.tabBarController.tabBar.frame.size.height;

# App Store Connect対応

ソースコード修正以外にも色々やることがあります。

## スクリーンショット追加

以下のスクリーンショットを追加しました。この作業が地味に面倒くさいです。
 - iPhone6.5インチディスプレイ（11ProMaxのシミュレータを利用）
 - iPad Pro（第3世代）12.9インチディスプレイ（第4世代iPadProのシミュレータを利用）

## プライバシーポリシー追加

現在、AppStoreにアプリを公開するには個人・企業問わず、プライバシーポリシーの提出が求められます。
個人で１から作るのは大変なので私は以下を利用して作成しました。(あまり良い方法ではないかもしれませんが)
[App Privacy Policy Generator](https://app-privacy-policy-generator.firebaseapp.com)

この辺りの対応は公式ページも参考にした方が良いと思います。
[App のプライバシーの管理](https://help.apple.com/app-store-connect/#/dev1b4647c5b)

# その他

本件とは関係ありませんが以下のエントリーも行いました。
簡単な質問に答えるだけで対応完了です。
私のような個人開発者には嬉しいプログラムです。
[App Store Small Business Program](https://developer.apple.com/jp/app-store/small-business-program/)

# 終わりに

他にも公開中の放置アプリがいくつかあるので対応を考えないと・・・