OmniAICreator/Qiita-1.07M huggingface dataset:
PHPerKaigi 2019 1日目

PHPerトークンを人質に取られてしまい、身代金としてブログ投稿を要求されたけどブログないのでqiitaに書きます。
長野県からの参加。テック系カンファレンスはしばらくぶり。

# タイムライン

## オープニング

CM。
マジでCMの話しか覚えてない。
PHPの現場でlocaldiskさんが言ってた「強い言葉が残る」はこれのことだったのか(違

## 10:40

トラックB「フレームワークを作りながらLaravelのアーキテクチャを学ぶ」を拝聴。
SlimPHPに色々混ぜて作るのもオレオレフレームワークに入りますか？
ファサードは便利だけど依存関係が隠蔽されてしまう話、その解決策(恐らくAutowire)の辺りまで言及してくれたらよかったのかな。
裏の「PhpStorm30分集中超絶技巧」も聴きたかった…。

## 11:25

トラックB「PHPゆるふわCI入門」を拝聴。CIしなきゃなぁという気持ちが昂ぶる。(するとは言ってない)
どうしてもCIの設定ファイルとかの学習コストで敬遠してしまうのですよね…。

## 12:05

ランチデプロイにて美味しいお昼をゲット。オウケイウェイヴさんありがとう！

## 12:20

オウケイウェイヴさんのラッチセッションを聴く。この辺りからPHPerチャレンジを始める。
ランチセッションのあるページにPHPerトークンが隠されていて、しかもスライドは非公開っぽくて、マジかよ…ってなる。

## 13:30 

トラックB「PHPの現場 公開収録」の会場に居ながら、徳丸先生の挑戦状を解いてた。あとで聴きますんで…。
でもあれを入力したらPHPerトークン通ったので、多分収録内でPHPerトークンが発表されたんでしょうね。

## 14:15

公開収録は途中で抜けてトラックA「設計力を上げるバリエーションの見極め術」を拝聴。
前のプロジェクトでバリエーションの増加に散々苦しめられたので耳が痛い話だった。
やっぱ脳死で仕事してちゃいかんね…。

## 14:45

トラックB「たった1人のAPI開発 BEAR.Sundayでかいけつした課題たち」を拝聴。
BEAR.Sundayは前々から興味があったものの、なかなか使う機会がなかったので是非聴きたいセッションだった。
セッション内にあった「理想と制約」の思考は今後見習いたい。

## 15:30

トラックB「RESTの力」を拝聴…と言いつつ、実際はほとんど徳丸先生の挑戦状を解いてた。これについては後述。
郡山先生申し訳ありません…。

## 16:15

トラックB「サーバーレスPHP」を拝聴…ではなく徳丸先生の挑戦状を解いてた。申し訳ありません…。(正直)

## 16:45

トラックB「Swooleでフレームワークを高速化 - もう動作が遅いなんて言わせない！」を拝聴。
Swooleはかなり興味があったので徳丸先生の挑戦状の手を止めて聴いてました。
結論としては、実用は難しそうな技術で残念。
[田中ﾌﾌﾌﾌさんも本番環境でダメだった](https://twitter.com/tanakahisateru/status/1106126826500382721)と言っている。

## 17:15

トラックCのIRT「Laravel相談会」に参加。
裏の「PHPerのための計算量入門」も聴きたかったけど、入門したばかりのLaravelで質問したいことがあったので優先。
ytakeさんだけでなく、同席した他のLaravelパイセンからもアドバイスを頂けたので結果的に大正解だった。
ここで裏を選んでたら、次のプロジェクトの本番リリース後に痛い目を見ていたかもしれない。おそロシア。

## 17:40

トラックA「Today's Update」を拝聴。
今日の感想をブログに書け、さもないとこのPHPerトークンはやらん(意訳)と脅迫され、この記事を書くことを決意。

## 18:00

PHPer茶会に参加。

LT？セッション？の「SWIMMING IN HELL」を拝聴。
内容も(恐ろしいものがありながらも)面白かった。明日は我が身。

ytakeさんに、IRTに引き続きhackの話を伺う。貴重なお時間ありがとうございました。

その後ボードゲームエリアにて「赤ずきんは眠らない」と「花火」をプレイ。
「まさかこれを使うことはないやろｗ」と思いつつ懐に忍ばせてた花火をおもむろに取り出したのは僕です。
色々すいませんでした！！！ ~~こんなことなら「もっとホイップを！」を持っていくんだった。~~

# PHPerチャレンジ

これなぁ…楽しいんだけど一度始めてしまうと途中でやめづらいし、かといってセッションの間に会場を回るたびにトークンが新たに設置されてるし、今日のリソースをかなりこれに割いてしまった。
しかも入力が早いほどトークンが多いとか、セッション中に徳丸先生の挑戦状解いちゃうでしょ。
アレのアレをアレしたらアレがアレしたから、あとはアレをアレすれば良さそう…なんて状況で平静を保ってセッションを聴けますか？ぼくはきけませんでした。
もう少しゆるりとセッションを聴きたいというお気持ち。

楽しいことは楽しいけど、「期間内に回さなきゃいけないスマホゲーのイベント」と「先人には絶対追いつけないと分かりつつレベリングするMMORPG」を同時にプレイしているような感覚。
2019/03/31 00:00時点で10位ですが、まだ徳丸先生の挑戦状で3つしか見つけられてないのでもう少し潜ります。

2019/03/31 07:00追記 徳丸先生の挑戦状5つ見つけられたので2日目も走ります。
Blenderの使い方メモ書き

# 概要

# Blenderとは

Blender とは、「3Dモデリングツール」である。

# 初期設定

## 日本語化

以下サイト参照。

https://blender-cg.net/nihonngoka/

# 基本概念

## User Interface(UI)

### Components of an Editor

UIは複数のエディタと呼ばれるタブを組み合わせたものとして定義される。

### User Interface Principles

以下の3つの原則のもとにUIは設計されている。

- Non-Overlapping
- Non-Blocking
- Non-Modal Tools

### Editor

### Screens

事前定義されたUIレイアウトのこと。

### Areas

3Dビューエディタやアウトライナなど、特定のエディタ用のワークスペースが含まれる四角いウインドウ。

Areaはsplit(分割)とjoin(結合)が可能。

### Regions

Editorを構成する構成要素。複数のRegionの集合がEditorを構成する。

#### Main Regions

常に表示される少なくとも1つのAreaで構成されるRegion。

#### Header

トップ又はボトムに表示される明灰色の水平方向に表示されるStripで構成されるRegion。

### Tool Shelf

左側に表示されるツール設定。

### Tabs

オーバーラップ・セクション。

### Panels

UIを構成する最小要素。

折りたたみ可能。

### Buttons

左ボタンで押す。それだけ。

### Menus

オプションやツールにアクセスするためのもの。

### Toggle & Radio Buttons

わかるでしょ。

### Number Buttons

わかるよな。

### Eyedropper

スポイト。わかるよね。

## 3DCGソフトの基本的な3つの要素

> - オブジェクト
> - ランプ
> - カメラ
> 
> の3つが必要不可欠となります。

出典: https://blender-cg.net/3dcg-kihonn/

# 参考サイト

- https://blender-cg.net/
- https://cgworld.jp/feature/201806-cgw239-blender.html
- https://docs.blender.org/manual/en/latest/index.html
VS Code install

# install

リポジトリと鍵を追加。

```bash
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo install -o root -g root -m 644 microsoft.gpg /etc/apt/trusted.gpg.d/
sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'
```

apt-getする。

```bash
sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install code # or code-insiders
```
VMware ゲストOSへフォーカスを移す　

`Alt-Tab`でVMwareを選択しても、ゲストにフォーカスがないため、キーボード操作ができません。
ブラウザとVMWareが別ディスプレイにあるときとか、
毎回マウスクリックするために移動するのが大変だったので。。

## TL;DR
`Ctrl + G` バーチャルマシンへフォーカスを移す
Clojureにおけるポリモーフィズム解説

# Clojureにおけるポリモーフィズム解説

リスプであるClojureではJavaのような型でのOOPとは一味違った形でポリモーフィズムを実現できます。

Clojureではポリモーフィズムのサポートとして

1. defmulti
2. protocol

というマクロが用意されています。

## defmulti

使い方

```Clojure
(defmulti name docstring? attr-map? dispatch-fn & options)
```
簡単な例として、いろいろな図形の面積を求める公式をdefmultiを使って書いてみたいと思います。

世の中には三角形や円など、様々な図形があり、どの図形も「面積」を持っています。

面積を求める公式は図形ごとに異なっていますが、全て「面積」ということは共通しているので、一貫した扱いをしたいところ。

ここでは図形の面積を求める関数をareaとして、defmultiを使って実装してみます。

まず、「長方形」と「円」のコンストラクターを用意します。

```Clojure
(defn rectangle [w h] {:width w :height h :id ::rect})

(defn circle [r] {:radius r :id ::circle})
```
次に、これらの面積を計算する関数areaをdefmultiで宣言しましょう。

```Clojure
(defmulti area (fn [x] (:id x)))
```

ここで、ディスパッチとして図形の:idを使用していることに注意してください。

例えば、xが上記のrectangleの結果として出た値ならば、(:id x)は::rectとなるので、後ほど定義する::rectに対応したareaのバージョンがそのxに対して適応されることになります。

それでは、実際に、::rectと::circleに対応したareaを実装していきます。

```Clojure
(defmethod area ::rect [x] (* (:width x) (:height x)))

(defmethod area ::circle [x] (* (:radius x) (:radius x) Math/PI))
```

これで、それぞれの図形にふさわしく面積を求める関数ができました。

それでは、実際に長方形と円の面積をareaで計算してみます。

```Clojure
(def r (rectangle 10 5)) 

(def c (circle 3))

(area r) ;; => 50

(area c) ;; => 28.27 
```
以下のように、areaに渡せる図形のコレクションから、それらの面積の和を求めることも容易になります。

```Clojure
(defn sum-area [coll] (reduce + (map area coll)))

(sum-area [(rectangle 10 5) (circle 3)]) ;;=> 78.27 (= 50 + 28.27)
```

## プロトコル

defprotocolは他のオブジェクト指向言語でのインターフェースに対応する機能を提供します。つまり、関数の「型」だけ定義し、実装は後回しにします。

上で行ったうような異なる図形の面積計算なども、プロトコルを使って行えます。

そのためには、まず、「面積」が計算できる図形を表すプロトコルを宣言します。

```Clojure
(defprotocol Shape
  (area [this]))
```

ここでは長方形や円などの具体的な図形をレコードを使って表現してみます。

```Clojure
(defrecord Rectangle [width height]
  Shape
  (area [this] (* width heigt)))

(defrecord Circle [radius]
  Shape
  (area [this] (* radius radius Math/PI)))
```

レコードのインスタンスを生成するには、下記のように

（クラス名）＋ドット

と書くか、newというマクロを使います。

```Clojure
(def r (Rectangle. 5 3)) ;; or (new Rectangle 5 3)

(def c (Circle. 3)) ;; or (new Circle 3)
```

レコード型はマップのように、キーワードでフィールドを取り出したり、updateなどマップに適用できる関数が使えます。

```Clojure
(:radius c) ;=> 3

(update c :radius inc) ;=>  Circle{:radius 4}
```

プロトコルの関数として実装されているareaの値もチェックしましょう。

```Clojure
(area r) ;; => 15

(area c) ;; => 28.27
```

##　プロトコルとdefmultiの組み合わせ

プロトコルとdefmultiを組み合わせれば、さらに柔軟なポリモーフィズムが実現できます。

ここでは、例として上で定義した長方形と円に対して相似な拡大を行う

scale

という関数を作ってみます。

この場合、分岐の基準として

class

が役に立つでしょう。この関数は

```Clojure
(class x)
```

でxのクラスを返します。

例：

```Clojure
(class r) ;;=> Rectangle
```

それでは、classをディスパッチ関数としてマルチメソッドを作ってみましょう。

```Clojure
(defmulti scale (fn [x s] (class x)))

(defmethod scale Rectangle [x s]
  (-> x (update :width (partial * s)) (update :height (partial * s))))

(defmethod scale Circle [x s]
  (update x :radius (partial * s)))
```
結果：

```Clojure
(scale r 2) ;;=> Rectangle{:width 10, :height 6}

(scale c 2) ;; => Circle{:radius 6}
```
無事に相似拡大されていました。

ついでに「面積比は相似比の二乗に比例する」という図形の性質も確かめてみましょう。（一つの事例だけでは「証明」にはなっていませんが、ここではとりあえず関数を使ってみるのが目的です。）

```Clojure
(= (* 2 2  (area c) ) (area (scale c 2))) ;; => true
```

想定した結果になりました。

## まとめ

今日はClojureでポリモーフィズムを担うプロトコルとマルティメソッドについてご紹介しました。この２つの機能を使いこなせば、非常に柔軟にポリモーフィズムを実現できるでしょう。

今回の内容は以上になります。最後までお読みいただきありがとうございました。
Redmineでカテゴリーidを知る方法

# この記事は？
[Python-Redmine](https://python-redmine.com/resources/issue.html)を使ってチケットを作るスクリプトを書いているときに、カテゴリーを指定するcategory_idをどうやって調べればいいかわからなかったのでメモ。

GUI上ではこんな感じでカテゴリ名以外の情報を得ることができない。
<img width="1339" alt="設定_-_test_-_Redmine.png" src="https://qiita-image-store.s3.amazonaws.com/0/150295/fc949d8b-0578-a4fa-51f3-0936e9ef4ff3.png">

# やり方
やっぱり公式ドキュメント読むのが一番
[こちら](http://www.redmine.org/projects/redmine/wiki/Rest_IssueCategories)にかいてあるが簡単に調べるにはブラウザ上で

```
${REDMINE_URL}/projects/${PROJECT_NAME}/issue_categories.xml

#${REDMINE_URL}には使っているRedmineのURLが入る
#${PROJECT_NAME}には知りたいカテゴリが登録されているプロジェクト名が入る
```
のようなURLを叩くと以下のようなXMLが出力される

```xml
<issue_categories total_count="1" type="array">
<issue_category>
<id>1</id>
<project id="1" name="test"/>
<name>test_category</name>
</issue_category>
</issue_categories>
```

この場合は、`test_category`の`category_id`は`１`になる。

以上
php-master-changes 2019-03-29

今日は不要な php7.spec.in の削除、FFI の修正色々、テストの修正、for ループ条件部での変数宣言をしている箇所があったのの修正があった！

# 2019-03-29
## petk: Remove php7.spec.in file
- https://github.com/php/php-src/commit/5e16f5b8d8c93a124c9b41e17b923195510704c7
- [7.4~]
- RPM specification ファイルを configure で生成する用の php7.spec.in の削除
- 昔公式 RPM パッケージというのを作る気があった？らしい

## dstogov: Fixed bug [#77768](https://bugs.php.net/bug.php?id=77768) (FFI: Builtin Types Should Not Raise Error On Redeclaration)
- https://github.com/php/php-src/commit/a3e52afebe77517ca10d98ba57fefe3f178d56b6
- [7.4~]
- ext/ffi で、組み込み型の再宣言をエラーにせず無視するよう修正

## dstogov: Allow incomplete array variables - extern const char * const sys_errlist[]
- https://github.com/php/php-src/commit/94e3db64b2070c21e66c7b047940e2e5489137d5
- [7.4~]
- ext/ffi で、extern 宣言で `[]` を使うのを許可するよう修正

## dstogov: Ignore "__format__" attribute
- https://github.com/php/php-src/commit/adf930c038c0d73f133f3e851d2bd2d827f0ebb2
- [7.4~]
- ext/ffi で、\_\_format\_\_ を無視するよう修正

## dstogov: Added support for more GCC extensions: attributes, __extension__, __asm__ (ignored)
- https://github.com/php/php-src/commit/745dd94e5585b1dd54716272dc0c37a18eaf1ee1
- [7.4~]
- ext/ffi で、GCC 拡張のサポートを追加

## cmb69: Fix test expectation
- https://github.com/php/php-src/commit/0aa1a2c8333fb828e8f77a369d0f208c1fcb04e3
- [7.2~]
- テストの期待出力の修正

## dstogov: Allow usage of incomplete types for external variables, function parameters and return values
- https://github.com/php/php-src/commit/24fa2008dd987ffececbf0e247b62f049ab2f4a8
- [7.4~]
- ext/ffi で、外部定義の変数や引数、返り値型で不完全型の利用を許容するよう修正

## dstogov: Fixed memory leaks
- https://github.com/php/php-src/commit/a2b39aa0de58898d87d5618af05a4487830532d0
- [7.4~]
- ext/ffi で、メモリリークの修正

## mbeccati: Fixed SKIPIF when --disable-mbregex is used
- https://github.com/php/php-src/commit/16b40a1806e2c6524a0a3ee07e252cb0406be443
- [7.4~]
- ext/mbstring で、SKIPIF の条件を修正して --disable-mbregex 利用時のテストこけを修正

## mbeccati: Removed declaration inside for loops
- https://github.com/php/php-src/commit/4726c35ca33da837406745f21e2320fb18ae7618
- [7.4~]
- ext/mbstring で、for ループ条件部での変数宣言を外に出した
- C だからね……

## cmb69: Fix test expectations
- https://github.com/php/php-src/commit/9f545de0b6b1502364eebbf5ddc0e58a070aa78b
- [7.2~]
- ext/imap でテストの期待出力の修正

## dstogov: Partial support for GCC mode attribute.
- https://github.com/php/php-src/commit/61ad294f26fa7941a26361a68cf6a01b8a2c3e4f
- [7.4~]
- ext/ffi で、GCC の [mode 属性](http://www.delorie.com/gnu/docs/gcc/gcc_80.html)に部分的に対応
SageMaker を ローカルPC に構築する

あまり見かけないのですが、SageMakerのライブラリは GitHub に公開されているので、ローカルに構築可能です。

SageMaker は無料枠が無いので、お金をかけたくない個人ユーザーは活用すると良いと思います。

## リポジトリ

[SageMaker Python SDK](https://github.com/aws/sagemaker-python-sdk)

> The SageMaker Python SDK is built to PyPI and can be installed with pip as follows:
>
> pip install sagemaker
>
> You can install from source by cloning this repository >and running a pip install command in the root directory of the repository:
>
> git clone https://github.com/aws/sagemaker-python-sdk.git
> cd sagemaker-python-sdk
> pip install .

[Amazon SageMaker Examples](https://github.com/awslabs/amazon-sagemaker-examples) - SageMakerのサンプルソース集

## 使い方

Anaconda をインストールして、Jupyter Notebook や Jupyter lab と一緒に使いましょう。

ただ、conda skeleton でビルドしようとして上手くいかなかったので、公式の手順の通りに pip コマンドで入れてしまいました。。。

併せて、awscli もインストールすると使い方が広がります。
AWSでPolkadotノードを立ち上げてValidatorに俺はなる[1/3] 環境構築編

#
Polkadotのエコシステムには

- **Validator**
- **Nominator**
- **Collator**
- **釣り人**(界隈ではフィッシャメーンと呼ばれる)

が存在しており、それぞれがコンセンサスシステムを支える重要な役割を担っています。
今回はその中でも最も大切なValidator（検証する人）になって、その名の通りブロックを検証していきます。

最終的には[Polkadot](https://polkadot.js.org/apps/#/explorer)で自分のノードが検証したブロックが生成されるのを見て楽しむことができます。
![Screen Shot 2019-03-30 at 22.56.12 (2).png](https://qiita-image-store.s3.amazonaws.com/0/380311/dc8428b6-b5d9-1633-7e21-cf00093aa646.png)


結構長いので３部建てでお送りします。

###**1. [AWSで環境構築](https://qiita.com/MasakiBerlin/items/0d2dd0c07d30a7bc802d)(今回)**
###2. [ノードを立てる](https://qiita.com/MasakiBerlin/items/1cb4b31106365d33d202)
###3. [Polkadotでアカウント作成 Validatorになる](https://qiita.com/MasakiBerlin/items/9c139ffee38763c2a1e0)**


##1) AWSで環境構築
~~Localで環境構築はやめましょう。~~
Localパソコンでもいいですが、ずっとノード走らせないといけないのでクラウドを使いましょう。

一番めんどくさいパートですが、AWSは義務教育の一環ですしみんな詳しいと思うのでちゃっちゃとやってきます。新規アカウントは１年間の無料期間付いているのでそれでやります。
いらない人は[Docker環境構築](https://qiita.com/MasakiBerlin/items/0d2dd0c07d30a7bc802d#ssh%E3%81%A7docker%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)まで飛ばしてください。

ちなみに[Run an Ethereum Node on AWS for Free](https://medium.com/coinmonks/run-an-ethereum-node-on-aws-for-free-afca27f253ed)を参考にしました。（英語なので英語アレルギーの方は気をつけてください）

##無料インスタンスを作る
1) [AWS](https://aws.amazon.com/)に登録してEC2インスタンスを開始

2) AMI(Amazon Machine Image)はUbuntuを選ぶ（ParityのDebianはセットアップ簡単）
![1.png](https://qiita-image-store.s3.amazonaws.com/0/380311/4cf5ed07-0c57-7a42-2e51-df8531815fc5.png)

3) インスタンスタイプは無料の`t2.micro`を選択
![2.png](https://qiita-image-store.s3.amazonaws.com/0/380311/5ff9859d-343a-99f4-4a3f-3807224d216d.png)

4) ディスクサイズは無料の30GBを選択（ParityのステイトツリーPruningを使うので容量は現状は全然いらない！[詳しく](https://blog.ethereum.org/2015/06/26/state-tree-pruning/)）
![3.png](https://qiita-image-store.s3.amazonaws.com/0/380311/41858a33-3a84-0cab-46fd-e6390f6a3aa3.png)

5) セキュリティグループはTCPとUDPのポート`30303`を空けておきましょう。（30303はノードを外部から見つけられるようにするためのデフォルトポート）SSHのソースはあなたのIPアドレスを入力。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/380311/0368d3b2-0d82-01ef-72c0-65aad4d3afff.png)

6) sshキーpemファイルを`~/.ssh/`に保存。

##SSHでdocker環境構築
1) SSHでAWSにアクセス。

```terminal:local
$ chmod 600 ~/.ssh/<ssh-key-name>.pem
$ ssh -i ~/.ssh/<ssh-key-name>.pem ubuntu@<インスタンスのパブリックIP>
```
2) SSH接続後、dockerをインストール（ここからはLocalも同じ手順です。）
詳しくは[Docker公式ページ](https://docs.docker.com/install/linux/docker-ce/ubuntu/)参照。

```terminal:ubuntu@yourIP
$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu artful stable"
$ sudo apt-get install -y docker-ce
```

以上、AWSでのDockerの環境構築でした！
次は今回作ったノード上でPolkadotを実際に動かしていきます。

**次回　[2/3Polkadotノードの建て方編](https://qiita.com/MasakiBerlin/items/1cb4b31106365d33d202)**
cssのpositionで、忘れてはいけない基本の基本。

CSSのpositionを指定する場合に忘れてはいけない基本を書いていく。

#positionの種類
まずpositionの種類は次の4つ。
- **satic**
- **relative**
- **absolute**
- **fixed**
でわ、ひとつづつの特徴をみていく。

##static  
sataticはデフォルトの設定である。つまり初期値。なのでわざわざ指定することはほとんどない。
また上下左右に動かすことができないので、topやleftと指定しても効かない。そしてz-indexを指定できないことも重要なので初心者は必ず覚えておいたほうがよい。

##relative
relativeは現在の位置を基準に相対的な位置を決める。本来の表示位置が基準になり移動させることができる。そしてz-indexを指定することができる。

##absolute
absoluteは親要素を基準に絶対的な位置を決める。この「絶対的な位置」と言うのは、要素がどんな形であろうと、間に他の要素や余白が入っていても、その指定した位置に絶対に配置してくれると言う意味である。また注意しなければならないのが、absoluteを指定した場合、親要素がstaticかstatic以外かで挙動が変わる。親要素がstaticの場合は、ウィンドウの左上を起点に位置が計算され、そこに配置される。static以外の場合は、親要素の左上を起点に配置される。また後続に続く要素がある場合、後続の要素は前の要素があたかもなかったように詰めて配置される点にも注意（fixedの場合も同様）。absoluteを使うときは親要素も一緒に考える様にすることを忘れずに。

##fixed
fixedは画面の決まった位置に固定することができる。つまりスクロールしても位置が変わらない。使い道としてはメニューバーやソーシャルボタンなどによく使われている。

###最後に一言
css初心者が最初に躓くのが、このpositionの指定だと私は思う。しっかりとそれぞれの特徴を掴み、自分の思い通りにpositionの指定ができればコーディングも楽になる。しっかりとマスターしよう。
Materializeとsimple_formでシンプルでいい感じのフォームを作りたい！

マテリアルデザイン「Materialize」とフォームの記述がシンプルな「simple_form」の実装をしたので、メモ。
今回はシンプルなinputボックスのみとなります。selectボックスも使いたい方は下記もご参照ください。
[enumを使ったselectボックスの実装
](https://qiita.com/sakuraniumarete/items/ac09780f6b42cc287815)

# GemfileにGemを記載からのbundle install
```Gemfile.
gem 'simple_form' #simple_formのGem
gem 'materialize-sass' #MaterializeのGem
gem 'jquery-rails' #記載あるか確認
```

```ターミナル.
bundle install
```
「jquery-rails」の記載があるか要確認です。
無いとMaterializeが正しく表示されません場合は記載しましょう。
# simple_formのインストール

```ターミナル.
rails g simple_form:install
```
上記コマンドにより、関連ファイルの作成が作成されます。
simple_formの導入はこれでOKです。

# simple_formの記述方法(例)
```
<%= simple_form_for @user do |f| %>
  <%= f.input :username %>
  <%= f.input :password %>
  <%= f.button :submit %>
<% end %>
```
上記のようにシンプルに記述することができます。
詳しくは、[[Github] simple_form](https://itsakura.com/https://github.com/plataformatec/simple_form)を参考に。

#Materializeの続き
「application.css」のファイル名を「application.scss」に変更。
「materialize」を読み込みます。

```application.scss

@import "materialize";
```
#結果確認
![Materialize画面.png](https://qiita-image-store.s3.amazonaws.com/0/332038/e356c7b8-0731-a15a-d498-c8296f654f9c.png)
正常に表示されました！！

#おまけ
1.[画像アップロード Carrierwaveの導入方法](https://qiita.com/sakuraniumarete/items/af0869faf2d369005c4e)

2.今回作成したフォームのコード

```new.html.haml
.row
  = simple_form_for(@product) do |f|
    .row
      .input-field.col.s6
        = f.input :name
        = f.input :description
        = f.input :price
        = f.input :unit
        = f.input :image
        = f.button :submit
```
# 参考
[参考][Railsのform_for内のコードをすっきりさせるsimple_formの使い方
](https://ruby-rails.hatenadiary.com/entry/20140730/1406700205)[参考][Github simple_form](https://itsakura.com/https://github.com/plataformatec/simple_form)
[参考][Github materialize-sass](https://github.com/mkhairi/materialize-sass)
[参考][【Rails】【ソースコードあり】簡単にMaterializecssを導入する方法](https://freelance-in-six-month.com/tech-blog/rails-introduce-materialize/)
【JavaScript】変数と定数の宣言（var, let, constの違い)【自己学習】

##letとconst
JavaScriptでは変数の宣言は従来より`var`が使われていたが、ES2015より`let`が追加された。また、同じくES2015より`const`を用いた**定数**の宣言も可能になった。

##varとletの違い
変数を宣言できる点において共通しているvarとletではあるが、下記の点において２つは異なる。

####varは宣言を省略できる

```variable-1.js
greet = "Hello World!";  //変数の宣言を省略
console.log(greet);  // > Hello World!
```

1行目において変数の宣言は省略されているが、greetに値が代入された時点で暗黙的にvarによる宣言がされたとみなされている。だが、**省略した場合はすべてグローバル変数になる**という性質があるため、省略は避けたほうが良い。

```variable-2.js
scope = "global";

function value() {
  scope = "local";  //グローバル変数として更新
  console.log(scope);
}

value();  // > local
console.log(scope);  // > local
```
関数内での変数の宣言は本来ローカル変数として行われるが、上記のコードではvarを省略したため、グローバル変数の更新とみなされている。

そのため、関数内外どちらの変数scopeを参照してもlocalという値が出力されることになる。

####letは変数名の重複が許可されない
varとは異なり、letは同じ名前の変数の宣言が許可されない。

```variable-3.js
var value1 = 1;
var value1 = 2;  //変数valueの値の更新

console.log(value1);  // > 2

let value2 = 1;
let value2 = 2;  //同名の変数のため宣言が許可されない

console.log(value2);  // > エラー
```
varでは同名の変数の宣言は許可され、変数valueの値が2に更新される。

一方letの場合は許可されず、参照すると「変数valueは既に宣言されています」という内容のエラーメッセージが表示される。

####letはブロックスコープを認識する
従来のJavaScriptでは、他の言語と異なりブロックスコープは存在しなかったが、letが導入されたことでブロックスコープを認識できるようになった。

```variable-4.js
if (true) {
  var value1 = 1;  //ブロックスコープは認識されていない 
}

console.log(value1); // > 1


if (true) {
  let value2 = 2;  //ブロックスコープは認識されている
}

console.log(value2); // > エラー
```
ブロック内でvarを使って変数の宣言を行った場合、ブロックスコープは認識されず、value1はコード全体で参照可能となるため、1が出力される。

それに対してletを使った場合は、ブロックスコープは認識され、value2の参照できる範囲はブロック内のみとなるため、グローバル変数として参照するとエラーが表示される。

##constの特徴
####値の更新ができない
constを使って定数を宣言した場合、同名の定数を宣言できないだけでなく、**定数内の値も更新できなくなる**。

```constant-1.js
const value1 = 1;
const value1 = 2;  //同名の定数の宣言はできない（letと同じ）

console.log(value1);  // > エラー

const value2 = 1;
value2 = 2;  //値の更新もできない

console.log(value2);  // > エラー

```
定数として代入された値は意図せず更新されることがなくなることから、定数を使うことで不具合等を防ぐことにつながる。

####ブロックスコープは認識する
```constant-2.js
if (true) {
  const value = 1; //ブロックスコープは認識されている
}

console.log(value); // > エラー
```
ブロック内でconstを使って定数の宣言を行った場合、ブロックスコープは認識される（letと同様）。
カラーコーディネーター検定1級-商品色彩分野- 勉強方法

## カラーコーディネーター検定とは
- 仕事に役立つ実践的な色彩の知識を学ぶことができる検定試験
    - https://www.kentei.org/color/
- 受験時期
    - 2級・3級は6月と12月の年2回
    - 1級は12月の年1回実施される
- 出題方式
    - 2級・3級はマークシート方式
    - 1級はマークシート方式および論述方式

## カラーコーディネーター1級について
- 次の3つの分野から1つの分野を選択して受験する
    - 第1分野「ファッション色彩」
    - 第2分野「商品色彩」
    - 第3分野「環境色彩」
- 出題の点数配分
    - マークシート：65点
    - 短文論述：10点
    - 長文論述：25点

## 1級の試験範囲
- https://www.kentei.org/color/testinfo.html

## 試験対策
- スマホアプリケーション"Studyplus"で勉強時間を管理するようにした
    - 手動入力、ストップウォッチ、タイマーと3種類の勉強時間の入力方法がある
    - また、どのくらい勉強するか目標を立てたり、実績をグラフで確認できる
    - <img width="100" alt="スクリーンショット 2019-03-30 23.09.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/77327/76e842ca-248a-d45f-5800-a9fd05cd5a16.png">

- 書籍の読み込み
    - 「カラーコーディネーター検定試験1級公式テキスト〈第3版〉: カラーコーディネーションの実際 商品色彩」
        - <img width="244" alt="スクリーンショット 2019-03-30 23.14.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/77327/932a5d02-01d7-5cb8-bbab-3fce4c1af3bb.png">

- 過去問を3年分解く
    - 「カラーコーディネーター検定試験1級過去問題集〈2015・2014・2013〉」
        - <img width="246" alt="スクリーンショット 2019-03-30 23.14.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/77327/b878f3e3-ac08-629d-a144-ac334b9a3d68.png">
- 論述対策のため単語帳を作成
    - 百均で買った少し大きめの単語帳
        - <img src="https://qiita-image-store.s3.amazonaws.com/0/77327/b290c309-bb27-f542-fd0c-8a49a996b52e.jpeg" width="200">
    - 表にタイトル、裏に説明を記述
        - <img src="https://qiita-image-store.s3.amazonaws.com/0/77327/0c3eb1cf-c1e0-226e-d15f-af536f8b7d62.jpeg" width="250">
    - 長文の論述は200文字だが、説明は50文字程度書いてあれば、肉付けして書ける

### 結論
- 試験対策を確実にやれば合格間違いなしです
ブラウザのF5が効かないでOSのファンクションキーが効くのはなぜ

ある日突然ChromeなどのブラウザのF5は効かなくなりました。
F5を押すと、ブラウザのページ更新ではなく、ディスプレイの明るさは暗くなりました。

あれ、ブラウザのF5が効かないでOSのファンクションキーが効いていました。

実は、ファンクションキーがロックされていました。
ファンクションキーがロックされると、OSの機能を優先になります。

ファンクションキーロックの解除は、「Fn」キー　＋　「FnLk」キーで対応できます。
もう一回押すと、ロックされます。

※FnLkキー名はパソコンによって違う場合があります。下記の操作になる場合もあります。
・Fn + NumLk（ニューメリックロック）
・Fn + Esc
・Fn + FnLk

以上
Android RSS読み込み

AndroidでRSSを読み込む案件がありましたので、サンプルを書いて予習しました。
レイアウト等、雑です。

参考にさせてもらった↓こちらで、`org.xmlpull.v1.XmlPullParser` を使われていたのでそのまま拝借させてもらいました。
http://individualmemo.blog104.fc2.com/blog-entry-55.html
意外に繁雑なコードになっているので、もっとよいライブラリあるのかなと思いました。

ソースはGitHubに上げています。
https://github.com/higekick/RssReaderSample
![Screenshot_1553955563.png](https://qiita-image-store.s3.amazonaws.com/0/152641/ab0cf260-a2de-5a7d-7b24-56bdfab85c80.png)
LaravelでSQLiteを利用する

# LaravelでSQLiteを利用する

LaravelでSQLiteを利用する方法のメモ


## 手順
1. sqliteのファイルを作成する
2. `.env`ファイルを編集する

### sqliteのファイルを作成する
sqliteのファイルは`/database/`に`database.sqlite`という名前で設置します。

    $ sqlite3 database/database.sqlite
    sqlite> .table
    sqlite> .q

### `.env`ファイルを編集する
データベースに関する設定を以下のように変更します。

    # DB_CONNECTION=mysql
    # DB_HOST=127.0.0.1
    # DB_PORT=3306
    # DB_DATABASE=homestead
    # DB_USERNAME=homestead
    # DB_PASSWORD=secret
    DB_CONNECTION=sqlite

## sqliteのファイル名や配置場所を変更する場合
`.env`に以下の設定を記述します。

    DB_DATABASE=ファイルの絶対パス

注意したいのが**絶対パス**を指定するということ。どこかで調べたときは相対パスで指定していてここではまってしまいました。`DB_DATABASE`を明示しない場合は上記のように`database/database.sqlite`がデフォルトになるようです。
画像アップロードCarrierwaveを導入する

<p>画像アップロードのGem Carrierwaveの導入方法を忘れちゃうので、手順をメモ。<br>
今回は画像リサイズのためmini_magickも導入します</p>

# Gemfileを設定
それでは早速、下記Gemをインストールします。

```Gemfile.
gem 'carrierwave'
gem 'mini_magick'
```
そして、「bundle install」。また「rails g uploader image」でアップローダーも作成します。

```ターミナル.
bundle install
rails g uploader image //アップローダーを作成

app/uploaders/image_uploader.rb //ファイルが作成されます
```
画像をカラムがない場合は作成しましょう。今回はproductモデルに作成します。

```ターミナル.
rails g migration add_image_to_product image:string
rake db:migrate
```
カラムができました。追加したモデルの「product.rb」を編集し
「image_uploader」をマウントする記述をします。

```product.rb
class Product < ApplicationRecord
  mount_uploader :image, ImageUploader #記述を追加
end
```

<p>先ほど作成した「image_uploader.rb」を編集して、MiniMagick経由で画像のリサイズを行えるようにします</p>

```app/uploaders/image_uploader.rb
include CarrierWave::MiniMagick
process resize_to_fit: [800, 800]」
#上記追記。コメントアウトされてるところもあるので、それを解除でも可。
```

以上で導入はOKです。

# 参考
[参考][carrierwaveの使い方](https://qiita.com/ttaka66/items/264dcb85e41f9135685c)
[参考][CarrierWaveの使い方](https://qiita.com/chokosuki4400/items/647f33528fba1fe3f7ee)
AdMobのエラーコード覚書き

# はじめに
`AdListener#onAdFailedToLoad()`のエラーコードがint値でいつも調べてしまう自分用メモです。

#エラーコード表
|code|name|
|:--:|:--:|
|0|ERROR_CODE_INTERNAL_ERROR|
|1|ERROR_CODE_INVALID_REQUEST|
|2|ERROR_CODE_NETWORK_ERROR|
|3|ERROR_CODE_NO_FILL|

# エラー詳細
## ERROR_CODE_INTERNAL_ERROR

（原文）Something happened internally; for instance, an invalid response was received from the ad server.

下記の細かいエラー以前の根深い何かが起こっているときに発生する。
お支払い情報が登録されておらずそもそも広告の配信がされていないときなど。

## ERROR_CODE_INVALID_REQUEST
（原文）The ad request was invalid; for instance, the ad unit ID was incorrect.

広告のUnitIDが間違っている場合など、設定値が間違っている場合に発生する。

## ERROR_CODE_NETWORK_ERROR
（原文）The ad request was unsuccessful due to network connectivity.

ネットワーク接続エラー、オフライン状態のときなどに発生する。
機内モードにすると再現できました（Pixel3, Android9）

## ERROR_CODE_NO_FILL
（原文）The ad request was successful, but no ad was returned due to lack of ad inventory.

リクエスト自体は成功しているが、配信される広告がない場合に発生する。
設定やネットワークに問題がないにも関わらず広告が表示されないときはだいたいコイツ。
特にアプリの開発初期段階などで起こるイメージ、明確な理由は分かりませんが広告ネットワークが最適化されていないのかなと想像しています。
PyPIパッケージをCondaコマンドでインストールする方法

Conda を使っていてよく困ります。しかも意外とググっても出てこない。。。

こちらで紹介するのは、その解決方法の１つとして使える方法です。

# PyPIのPythonモジュールからcondaパッケージを構築する

```Bash:パッケージ作成
$ conda skeleton pypi <PACKAGE>
$ conda build <PACKAGE>
```

この後にインストールします。

```Bash:インストール
conda install --use-local <PACKAGE>
```

# 参考

[Building conda packages with conda skeleton — conda build 3.17.8+139.g395ee91c.dirty documentation](https://docs.conda.io/projects/conda-build/en/latest/user-guide/tutorials/build-pkgs-skeleton.html)
（conda skeleton を使った condaパッケージの構築方法）
Windows上スクリーンショット、録画方法

Windowsの進化によってますます便利になります。以前はスクリーンショットを取るには、下記の感じです。
・全画面：PrtScキー
・開いてアプリケーションのウインドウ：Alt　＋　PrtScキー

少し加工したい場合はペイントに貼り付けで編集するのは多いと思います。
また、表示領域の一部だけを取りたいことなかなかできないようです。

#Windows　＋　Shift　＋　S
Windows１０では　Windows　＋　Shift　＋　S　でスクリーンの四角領域、フリーフォーム、ウインドウ領域、全画面を取れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/a69aa51a-0a64-a7ab-6b90-8b56f04bfa5c.png)

撮った例：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/bab0a892-bd4c-306e-239d-87772e76b019.png)

Windows10の1809バージョンでは、撮った後すぐ編集ができるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/0192ea97-ae53-0872-edac-858a018d7910.png)


切り取り＆スケッチ機能です。これがあると、ほかのツールはなくても大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/63366027-1d99-7243-2500-d7a923de68ab.png)


#Snipping　Tool
以前のWindowsバージョンではWindowsのSnipping　Toolというツールを使えます。
Windows　＋　Q　で入力欄に「snipping」を入力すると表示されると思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/43fba980-5e00-f237-d9cd-963f79a7e224.png)

モードを選択し、スクリーンショットを取ると編集画面が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/8d6a9788-17aa-f898-3a65-079dc9836ac0.png)

メニューバーにあるペン、蛍光ペン　など画像を表記などすると相手はわかりやすくなると思います。

#録画：　Windows　＋　G
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/1f8ff96c-a77d-0eb9-f4eb-12784c37272b.png)

①、スクリーンショット
・Windows　＋　Alt　＋　PrtSc
・またはカラムがあるボタンを押す（左から一番目）

②、録画する（裏で）
・Windows　＋　Alt + G　
・またはボタンを押す（左から２番目）
ゲームなどの録画の場合は便利です。

③、いまから録画
・Windows　＋　Alt　＋　R
・またはボタンを押す（左から３番目）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/46ee0869-8b8b-e298-95b2-3fcd190118aa.png)

そうすると、右上に録画してるのをわかります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/f9524eb3-b266-c7db-2b27-ec6a7cbfcce8.png)

録画し、停止ボタンを押すと、動画ファイルを保存されます。
場所：C:\Users\ユーザー名\Videos\Captures

外部のソフトをインストールしなくてもできますね。

以上
[Swift] UIImageViewをスクロースして選択するViewを作る

![imageSelecter.gif](https://qiita-image-store.s3.amazonaws.com/0/139593/686ea96c-d334-39ce-cd68-8bd57fa60039.gif)

UIImageViewをスクロースして選択するViewのソースです。

```
import UIKit

protocol SelectViewDelegate{
    func selectChanged(image: UIImage)
}

class SelectView : UIScrollView {
    static let kNotToucheTagId = -1
    var images: [UIImage] = [UIImage(named: "01.png")!,
                             UIImage(named: "02.png")!,
                             UIImage(named: "03.png")!,
                             UIImage(named: "04.png")!,
                             UIImage(named: "05.png")!,
                             UIImage(named: "06.png")!,
                             UIImage(named: "11.png")!,
                             UIImage(named: "12.png")!,
                             UIImage(named: "13.png")!,
                             UIImage(named: "14.png")!,
                             UIImage(named: "15.png")!,
                             UIImage(named: "16.png")!,]
    var selectViewDelegate: SelectViewDelegate? = nil
    var imageViews: [UIImageView] = []
    var imageRect:CGRect? = nil
    
    override func didMoveToSuperview() {
        imageRect = CGRect(x: 0, y: 0, width: self.bounds.height, height: self.bounds.height)
        self.contentSize = CGSize(width: self.bounds.height*CGFloat(images.count), height: self.bounds.height)
        self.isUserInteractionEnabled = true
        self.tag = SelectView.kNotToucheTagId
        setImageViews()
    }
    
    func setImageViews() {
        let x = self.bounds.height/2
        let y = self.bounds.height/2
        for i in 0..<images.count {
            imageViews.insert(UIImageView(), at: i)
            imageViews[i] = UIImageView(frame: imageRect!)
            imageViews[i].image = images[i]
            imageViews[i].layer.position = CGPoint(x: x+imageRect!.width*CGFloat(i), y:y)
            imageViews[i].isUserInteractionEnabled = true
            imageViews[i].tag = i
            self.addSubview(imageViews[i])
        }
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if selectViewDelegate == nil {
            return
        }
        for touch: UITouch in touches {
            if touch.view!.tag == SelectView.kNotToucheTagId {
                return
            }
            self.selectViewDelegate!.selectChanged(image: images[touch.view!.tag])
            break
        }
    }
}
```

利用する側ViewControllerのソースは以下です。

```
import UIKit

class ViewController: UIViewController, SelectViewDelegate {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var selectView: SelectView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let image = UIImage(named: "01.png")
        imageView.image = image
        selectView.selectViewDelegate = self
    }
    
    func selectChanged(image: UIImage) {
        imageView.image = image
    }
}
```

Githubに上記ソースをUPしています。
[UIImageViewをスクロースして選択するView](https://github.com/shunsukemaki/ImageSelector)
babel7で power-assert を mocha6 で使う

# 概要
通常、`power-assert`をmochaで使う場合は、`intelli-espower-loader`を`mocha --require`することで使えますが、ES6以降のテストコードで使う場合は **babel** を使ってトランスパイルしなければなりません。
babelを使ってpower-assertを使用するやり方を今日一日探していたんですが、babelやmochaのバージョンが古い情報が多くて新しい情報が少なく、動かすまで半日以上かかってしまいました。

したがって今回自分用のメモとして babelの **7系** でpower-assertを使うパターンを紹介します。

# 必要なモジュール

それぞれのモジュールについては詳しく説明しませんので各自ググりをお願いします。

### babel系

* **@babel/core** `7.4.0`
* **@babel/polyfill** `7.4.0`
* **@babel/preset-env** `7.4.1`
* **@babel/register**`7.4.0`

### mocha

* **mocha** `6.0.0`

### power-assert系

* **power-assert** `1.6.1`
* **babel-plugin-espower** `3.0.1`

【注意】
* babel7系は6系とモジュール名が違うので注意してください。
* `babel-plugin-espower`を使う場合は、`intelli-espower-loader`は使いません。

# やり方

```
1. モジュールインストール > 2. 設定ファイルの作成 > 3. テストを書く > 4. mocha実行
```

## 1. モジュールのインストール

```shell
$ npm install --save-dev @babel/core @babel/polyfill @babel/preset-env @babel/register mocha power-assert babel-plugin-espower
```

もしくは

```shell
$ yarn add @babel/core @babel/polyfill @babel/preset-env @babel/register mocha power-assert babel-plugin-espower
```

## 2. 設定ファイルの作成

### .babelrc

`.babelrc`に設定を記述します。

```json
{
    "presets": [
        "@babel/preset-env"
    ],
    "plugins": [
        "babel-plugin-espower"
    ]
}
```

**presets**に`@babel/preset-env`を使うのはES6以降のコードを書くためです。

### mocha.opts

`mocha.opts`にmochaを実行するときの引数を記述します。

```
--recursive
--require @babel/register
--require @babel/polyfill
```

* `--recursive`は`test`ディレクトリを**再帰的に**テストする引数です。
* `--require @babel/register`はmochaに`@babel/register`モジュールを **require** するための引数です。`@babel/register`がES6以降のテストコードを変換してくれます。
* `--require @babel/polyfill`はmochaに`@babel/polyfill`モジュールを **require** するための引数です。`Promise`などの`@babel/core`が変換できない機能を変換してくれます。

【注意】
* `--compilers`は廃止されましたので、 `--require`を使用してください。

## 3. テストを書く

```javascript:test.js
import assert from "power-assert";
describe("Tests", () => {
    it("Calcuation test", () => {
        const value = 1 + 1;
        assert(value === 2);
    });
});
```

### 4. mochaを実行

```shell
$ npx mocha
```

結果：

```text


  Tests
    1) Calcuation test


  0 passing (69ms)
  1 failing

  1) Tests
       Calcuation test:

      AssertionError [ERR_ASSERTION]:   # test/test.js:6
  
  assert(value === 3)
         |     |     
         2     false 
  
  [number] 3
  => 3
  [number] value
  => 2
  
      + expected - actual

      -false
      +true
      
```

これでpower-assertが動きます。
この問題の解決策が確認されないので確認しないようにする(Windows)

# これって何なんだろう
アプリがクラッシュして、「プログラムの終了」をクリックした後に出るメッセージ「○○は動作を停止しました。この問題の解決策を確認しています…」。待ってても一回も解決したことがない。キャンセルボタンを押すだけ無駄なので、確認しないようにしておこう。

あと、Windows10になってから、いろんな設定機能をコントロールパネルから設定アプリにバージョンが変わる度に移している関係で、ネットで調べたやり方だと今は出来ないことが多いです。なので、今後も出来る（だろう）やり方をメモしておきます。管理者権限が必要です。

# "サービス"アプリから
元ネタ
[How to Disable Error Reporting in Windows](https://www.lifewire.com/how-do-i-disable-error-reporting-in-windows-2626074)

1. Windowsキーを押して"services.msc"と入力
1. 管理者権限のアカウントならそのまま実行。そうでなければアプリ名を右クリックし、管理者として実行する。
1. "Windows Error Reporting Service" 
をダブルクリック
1. スタートアップの種類で無効を選択
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/239172/b01979ae-f30a-adf1-4e6c-3e2a61d9d23e.png)

2. OKキーをクリック
これでおしまい。

# PowerShellから
PowerShellを管理者権限で起動し以下を実行。

```powershell
> Set-Service -name WerSvc -StartupType Disabled
```


# レジストリエディタから
よく分かっていないのでリンクの紹介だけ。
[[Windows 10] 「この問題の解決策の確認をしています」を起動しないようにさせたい](https://answers.microsoft.com/ja-jp/windows/forum/all/windows-10/26713c6d-1669-4963-8813-8d3c688c49b)
Git for Windowsでgithubの複数アカウントを切り替える

## Windowsでも同じだった
C:\Users\ユーザ名\.ssh に config ファイルを作ればいいだけだった

## C:\Users\ユーザ名\.ssh\config
- id_rsa_github ファイルは、OpenSSH形式の秘密鍵

```
Host github.com.main
  HostName github.com
  IdentityFile "C:\path\to\main_acount_github\id_rsa_github"
  User git

Host github.com.sub
  HostName github.com
  IdentityFile "C:\path\to\sub_count_github\id_rsa_github"
  User git
```

## git cloneするとき
### メインアカウントの場合
```bash
git clone git@github.com.main:メインアカウント/リポジトリ.git

# こちらはメインなので、globalにユーザ名とメールアドレスを設定しておく
```

### サブアカウントの場合
```bash
git clone git@github.com.sub:サブアカウント/リポジトリ.git

# ユーザ名とメールアドレスをこのリポジトリ用に設定しておく
cd リポジトリ
git config --local user.name "サブユーザ名"
git config --local user.email "サブユーザメールアドレス"
```

----
ほかにいい方法があれば教えてください！
React vs React Static速度対決...したけど、引き分け

# 結論
React製の超シンプルなWEBページを静的サイトジェネレータ「React Static」で静的ページにしたけど、別に速くならなかった:neutral_face:

https://speed-test-react.netlify.com/
https://speed-test-react-static.netlify.com/

# 背景
コンポーネント指向の書き方が大好きなので、全然状態の変化しないフツーのサイトもReactで書きたくなりました。
ただ、表示が遅くなりそう...
ただ、誰がいつ見ても同じ内容なのに、一々ブラウザのJSでレンダリングしてもらうなんて...

**静的サイトジェネレータ**を使えば、高速表示のままReactで開発できるのでは...?　

# やったこと
画像とテキストが並ぶ超シンプルなSP前提のWEBページをReactとReact Staticで作ってみました。
Ajax通信も一切ありません。

### React版
https://speed-test-react.netlify.com/
https://github.com/IYA-UFO/speed-test-react

- React
- create-react-app
- styled-components
- BootStrap4のCSS
- 合計700KB程度の画像　一部別サーバー

### React Static版
https://speed-test-react-static.netlify.com/
https://github.com/IYA-UFO/speed-test-react-static

上記＋React Static


### 比較ツール
パフォーマンス測定超初心者なので、ググりながらやりました。

Chrome devtools ダウンロード速度10MB CPU4倍遅い設定(MacBook Pro)


### 比較観点
静的ページ、特にマーケティング系のページにとって、重要なのはファーストビューがちゃんと見えるまでの時間です。
それを比べたい、


...いざ、勝負

# 結果
## Chrome devtools　Performanceタブ
<img width="650" alt="比較.png" src="https://qiita-image-store.s3.amazonaws.com/0/233072/3d1e04c3-f544-5e6e-064d-ec8da9179878.png">

**変わらねぇええ!!**
画面左端がindex.htmlを取得した瞬間です。これより前の出来事にフロントエンドは関係ありません。
上の波みたいなのがCPUの使用量を示します。
大雑把に以下です。

- 青 HTMLパース
- 黄色　JS実行
- 紫　CSS適用

よく見ると、React側はレンダリング前に50msほどJSの実行時間があります。これが心配していた「遅延」です。
React Staticは、その賢い仕様上、HTML、CSSの処理が終わった後にイベントなどを処理するJSをマウントしています。ただ、今回は活躍の機会はありません。

## Chrome devtools　Networkタブ
![比較2.jpg](https://qiita-image-store.s3.amazonaws.com/0/233072/43f901cc-a597-c1f0-df58-10bd1fba8f1e.jpeg)

ちょっと...違う..?
今回のページにはファーストビューにヒーローイメージ？(320KBのやつ)があるので、その子の表示が体感速度のカギとなります。
React側はmain.jsによるHTML生成が終わるまでヒーローイメージをリクエストできないのに対し、React Staticは最初からMax6本リクエストを出していると思われます。おかげで700msほど？速く落とせています！



## 見た目
![比較3.gif](https://qiita-image-store.s3.amazonaws.com/0/233072/3d3186ee-ae5b-59c2-44bb-2bfd4c2a2056.gif)

**変わらねぇええ**
主題はファーストビューの高速表示でしたが、複数回やれば逆転するレベルで同じです。
React＋styled-componentsが裏でこそこそ何しているのかは知りませんが、React Staticは古き良きHTML⇨CSS追加の表示ですね。

# 結論
超シンプルなReactアプリケーション？を静的ジェネレータにかけても、表示がすごく速くなることはない。

# 感想
### パフォーマンスの測定
dentoolsの表示の２割も理解していません。ブラウザの動きを深く知らないとキビシイ世界のようです。
devtoolsの見方を体系的に学びたい...

### 静的サイトジェネレータ
今回のReactさんは50msでHTMLを出しましたが、本格的なReactアプリケーションでは数秒かかることも珍しくないと思います。静的サイトでも本格的に運用すれば数十のコンポーネントを使うわけで、そのとき、静的サイトジェネレータの真の力が唸るのかもしれません。

もちろん、CMSからAjaxでデータを取得する場合、ジェネレータによる事前ビルドの効果は明らかでしょう。


# おわりに
ブラウザのことよく知らないのに背伸びしました。仮説、間違いのご指摘、なんでも全力で歓迎いたします。
それまで、Reactでいいや
CloudFormationの基本のキ

AWSのサービス"CloudFormation"をについての勉強メモ

### AWS CloudFormationとは
- AWSが提供するInfrastructure as Codeを実現するためのサービス
- AWSリソースの設定やプロビジョニングを担ってくれる

### Infrastructure as Codeとは
- 一言で言うと、ITインフラの構築や維持作業をコード化すること

#### メリット
- 自動化
    - インフラ構築をコード化し、それを実行することで素早く・正確にインフラを構築する
- 冪等性
    - 人の手を介さないため、一度コードを作ってしまえば、ミスなく同じ環境を同じように構築可能
    - 「冪等性」と言う言葉は数学界で用いられる言葉で、1回の操作でもn回の操作でも結果が変わらないこと
- 変更管理
    - 再利用性の高いコードとして管理することで、インフラ設定をバージョン管理でき、変更後の差分が分かりやすくなる

#### デメリット
- 学習コスト
    - ツールを利用するのに、まずそのツールを理解しなければならない
- 部分変更に時間がかかる
    - サーバーの設定を少しいじるだけでも、コードを修正して適用になるため、手作業よりも時間がかかる

### CloudFormation実行の主な流れ
1. テンプレートを作成する
    - テンプレートの拡張子はyamlとjsonがある
    - 特別な理由がない場合は可読性が高いので、yamlを用いるのが良いと言われている
2. スタックを作成する
    - スタックはCloudFormationで構築するインフラのひとかたまり
    - ＝テンプレートごとの単位

### 基本のテンプレート
<img width="345" alt="スクリーンショット 2019-03-30 22.06.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/77327/d91eb950-9990-30ad-a809-63fc4b25d8d7.png">


- 9つのセクションを記述できる
- ここではよく使うセクションについて詳しく書きます

#### AWSTemplateFormatVersion(形式バージョン)
- バージョン指定することでテンプレートの機能を識別する
- 現在、2010-09-09のみなので、自動的に指定する
- <img width="273" alt="スクリーンショット 2019-03-30 18.54.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/77327/2fa73a7b-f36b-f62f-3f67-91290028e7b4.png">

#### Description
- CloudFormationの説明
- AWSコンソールではスタック一覧の説明タブに表示される
- ![スクリーンショット 2019-03-30 18.57.02.png](https://qiita-image-store.s3.amazonaws.com/0/77327/7ba0d3a4-43a0-0e77-4020-baf986352b76.png)
- <img width="249" alt="スクリーンショット 2019-03-30 22.37.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/77327/5e9ed675-ed8e-3ac5-2713-8cc25e195bdf.png">


#### Parameters
- テンプレート実行時に任意の値を設定したい場合に記述する
- ![スクリーンショット 2019-03-30 19.03.51.png](https://qiita-image-store.s3.amazonaws.com/0/77327/c4d8014f-d38e-d621-2c15-f126406a7653.png)
- <img width="255" alt="スクリーンショット 2019-03-30 22.39.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/77327/76c6241b-bfa9-7b7f-3376-796cc7def6ba.png">


#### Resources
- 構築するAWSリソースを記述する
- ![スクリーンショット 2019-03-30 22.35.12.png](https://qiita-image-store.s3.amazonaws.com/0/77327/ae589b19-b7a9-ab48-19d5-404517d312ad.png)
- <img width="322" alt="スクリーンショット 2019-03-30 22.43.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/77327/9885c944-2f4c-1471-a2bb-cad13ab067ef.png">



#### Outputs
- リソースを出力する値を記述する
- 例えば、インスタンスのPublicIPなど出力したりする
- ![スクリーンショット 2019-03-30 22.11.19.png](https://qiita-image-store.s3.amazonaws.com/0/77327/fb35c180-00df-235a-d2c3-a34e0d8c78ca.png)
- <img width="219" alt="スクリーンショット 2019-03-30 22.46.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/77327/8e48174a-b94f-854b-2774-381242c947fb.png">
【Substrate】フォークレスチェーンアップグレードのやり方

#凄いぞフォークレスアップグレード
Substrateのブロックチェーンの特徴の一つはフォークレス、リアルタイムのチェーンアップグレードですよね。とっても便利だと思ったので皆さんにシェアします。
メリット、デメリット、やり方、解説の順で説明していきます。

### メリット：
・Cargo buildをしなくていいので実装が速い！
・チェーンをpurgeしないので既存ノードや状態が保たれる！
### デメリット：
・ネイティブに比べインタープレターなので処理は遅め

##やり方　（wasmとcargoでビルド済前提。まだの人は[こちら](https://qiita.com/MasakiBerlin/items/75e8668fe309ffbc0524)）



1) いつも通りノードを動かす

```terminal:bash1
$ ./runtime/release/<project name> --dev
```

2) 別ターミナル開いてWasmのビルド実行

```terminal:bash2
$ ./build
```
すると以下のパスにcompact.wasmファイルが作成されます。
`./runtime/wasm/target/wasm32-unknown-unknown/release/node_template_runtime_wasm.compact.wasm`

3) [Polkadot UI](https://polkadot.js.org/apps/#/extrinsics)のExtrinsicsで**Alice**を選択後（**SudoはadminであるAliceのみが呼べます**）、先ほどの**compact.wasm**ファイルをインプットしてSubmit。Sudidイベントが表示されれば成功です！

```
sudo > sudo(proposal)
proposal: Proposal (extrinsic): consensus > setCode(new)
```

![Screen Shot 2019-03-30 at 21.27.13 (2).png](https://qiita-image-store.s3.amazonaws.com/0/380311/112d4c8c-c550-dd6f-335d-d893aaa9db5a.png)

ページ更新すると追加した機能が反映されています。
ランタイムアップグレード前のストレージ状態（バランス、アカウント等）もそのまま残っていることが確認できます。

##何が起こっているのか
今動いているブロックチェーンはSubstrateが提供するWasmインタープレターを通してランタイムを動かしています。これにより、新しい機能などを既存のノードや状態を壊すことなく簡単に実装することができます。

このランタイムはブロックチェーン上にあるので、チェーンで動いているノード全てがリアルタイムで同期されます。上でも言ったように、Wasmインタプレターはネイティブバイナリに比べると処理が遅いので、必要によって`cargo build --release`と使い分けましょう。

Source: [Shawn Tabrizi](https://github.com/shawntabrizi/substrate-collectables-workshop)
27日目。rubyの配列は簡単でちょっと独特。面白かったです。


rubyの配列の使い方でした！
簡略化されていて、ちょっと独特。ruby面白いです！

・配列をまわすのにforがいらない。eachだけ！
・なみカッコとかどカッコを使い分けている。

（所要時間　2時間）

###each文
 配列.each do |変数名|
 	実行
 end

 ###ハッシュの使い方
「ハッシュ」ってどんな意味？
https://qiita.com/jkr_2255/items/4787055c8f600695658d
hashとは「細切れにする」ハッシュドビーフやハッシュドポテトのハッシュのこと

ハッシュ関数
https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0
ハッシュ関数 (ハッシュかんすう、英: hash function) あるいは要約関数[1]とは、あるデータが与えられた場合にそのデータを代表する数値を得る操作、または、その様な数値を得るための関数のこと。ハッシュ関数から得られた数値のことを要約値やハッシュ値または単にハッシュという。
（中略）
またプログラミング言語の一部（Perl、Ruby等、主に高等言語とされる一般的なプログラミング言語の多く）においては、連想配列のことを伝統的にハッシュと呼ぶが、これは連想配列そのもののプログラムの内部的実装に拠るものであり、ハッシュ関数そのものとは全く異なる。連想配列はハッシュ関数の応用例の一つのハッシュテーブルの実用例である。

まぎらわしいー！


`user = {"name" => "Suzuki", "age" => 21}`
 ・{}波括弧でくくる
 ・変数、文字列は””でくくる
 ・変数=>値 
 ・数値はくくらない

 ###ハッシュの呼び方
 `puts user=["name"]`
 ・変数=["ハッシュ"]
 ・[]角かっこでくくる
 
 ###ハッシュの更新
 `user=["age"] = 22`

 ###ハッシュの追加
 変数["追加のハッシュ"]=値

 ###ハッシュのシンボル
 `:test`のようにあたまにセミコロンをつけるとシンボルになる。
 `"test"=> `と同じ。こんなかんじ。べんり。

 ```ruby
 exam = {:subject => "Math", :score => 80}
 puts exam[:score]
 ```
###nil
存在しないを表す。nullみたいな？

###if nil
キーが存在するとき、しないときで処理を分ける

```ruby
exam = {subject: "Math"}
if exam[:score]
  puts "#{exam[:subject]}の結果は#{exam[:score]}点です"
else
  puts "#{exam[:subject]}の結果は分かりません"
end
```

###要素がハッシュの配列

```ruby
#要素がハッシュの配列をつくる
 exams = [
  {subject: "Math", score: 80},
  {subject: "Science", score: 55}
  ]

#配列の中のハッシュで呼び出す
  puts exams[1][:score]

#配列をeachで回す
exams.each do |exam|
  puts "#{exam[:subject]}の結果は#{exam[:score]}点です"
end
```
[Docker]AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using ***.***.*.*. Set the 'ServerName' directive globally to suppress this message

```
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using ***.***.*.*. Set the 'ServerName' directive globally to suppress this message
```

Dockerで

```
docker-compose up --build
```
ってやると必ず出てくるこの警告(私が)。
解決として、https://askubuntu.com/questions/256013/apache-error-could-not-reliably-determine-the-servers-fully-qualified-domain-n
に書いてあることで解決できました。

しかし、このページが英語であること。DockerでないのでDockerの場合の対策方法を書きます。

と言ってもDockerファイルに以下を追記してもらうのみです！

```Dockerfile
RUN echo "ServerName localhost" | tee /etc/apache2/conf-available/fqdn.conf
RUN a2enconf fqdn

```

内容はというと、

teeがファイルの書き込みのようなので、
fqdn.confにServerName localhostを書くということみたいです。
書き込みと言っても、もともとないのでファイル作成、書き込みを行う感じですね。

a2enconfはfqdnのファイルを有効にするというものらしい。


なので上記追加でコンテナの中はこんな感じになってます！！

```
root@056e18a8a70b:/etc/apache2/conf-available# ls
charset.conf  docker-php.conf  fqdn.conf  localized-error-pages.conf  other-vhosts-access-log.conf  security.conf  serve-cgi-bin.conf
root@056e18a8a70b:/etc/apache2/conf-available# cat fqdn.conf
ServerName localhost
root@056e18a8a70b:/etc/apache2/conf-available# 
```

上記の内容を簡単に説明

現在いるところ(/etc/apache2/conf-available) で　フォルダの中のリスト表示(ls)

fqdn.conf が追加されていることが確認できるとで cat で中身確認

ServerName localhostが記述されている

っと言った感じです。

ちなみにこれ、
https://help.ubuntu.com/community/ApacheMySQLPHP#Troubleshooting_Apache
のトラブルシューティングに書いてあるよと言っていますね！


参考
https://askubuntu.com/questions/256013/apache-error-could-not-reliably-determine-the-servers-fully-qualified-domain-n
https://eng-entrance.com/linux-command-tee
http://www.ei.fukui-nct.ac.jp/~t-saitoh/mt/2015/10/debianapache2.html
Go で複数桁の数字を slice に入れたい時、そして reverse させたい時

# Go で int と slice をいい感じに扱いたい

こんなん考えたらわかるやろって感じの内容なのかもしれませんが、ググってもいい感じのが出なかったのでメモとして残しておきます。

競技プログラミングとかで使えるかも！

## Go で int を1桁ずつ slice に入れる

見てみればなんだこんなもんかって感じです。除算と余りをいい感じに使う再帰関数になってます。

```go
func digit(i int, list []int) []int {
	if i > 0 {
		return digit(i/10, append(list, i%10))
	}
	return list
}
```

## Go で int の slice を逆転したい

作った int の slice を reverse したいときもありますよね？
そういうときはこれです。ループで頑張って入れ替えます。

```go
func reverse(numbers []int) []int {
	for i := 0; i < len(numbers)/2; i++ {
		j := len(numbers) - i - 1
		numbers[i], numbers[j] = numbers[j], numbers[i]
	}
	return numbers
}
```

### int を 1 桁ずつ slice にして逆転する

上記の2つの関数を合わせてこんな感じで使います。
地道にやればなんでもいけますね！

```go
package main

import (
	"fmt"
)

func main() {
	result := 708
	var list []int
	fmt.Println(digit(result, list))
}

func digit(i int, list []int) []int {
	if i > 0 {
		return digit(i/10, append(list, i%10))
	}
	return reverse(list)
}

func reverse(numbers []int) []int {
	for i := 0; i < len(numbers)/2; i++ {
		j := len(numbers) - i - 1
		numbers[i], numbers[j] = numbers[j], numbers[i]
	}
	return numbers
}
```
Transformerのメモ

# 注意
合ってるの？って言われるとわからない

# 元の論文
https://arxiv.org/abs/1706.03762

# 他の人の解説
超詳しい解説、コードを書きながら何やってるかわかる（日本語）：
https://qiita.com/halhorn/items/c91497522be27bde17ce

論文とコードが一緒に読める（英語）：
http://nlp.seas.harvard.edu/2018/04/03/attention.html

大枠から解説（英語）：
http://jalammar.github.io/illustrated-transformer/

# 何が新しいのか・何が今までどおりなのか
ここで言う「今まで」とはRNN系列のモデルを指します
具体的にはAttention LSTM
モデルとしては[Effective Approaches to Attention-based Neural Machine Translation] (http://aclweb.org/anthology/D15-1166)の図がわかりやすい
## 今までどおりなところ
### 1. Decoderの中間層を利用してEncoderの各時刻（各token）の出力に対して重みを計算し、
### 2. Encoderの出力の重み付け和をDecoderの中間層に合成（concat/sum）してる
ところ

AttentionLSTMではDecoderの中間層とconcat
![image.png](https://qiita-image-store.s3.amazonaws.com/0/376849/f209bdec-9fa7-8a32-434d-f5d6a4b01d8c.png)
参照：http://aclweb.org/anthology/D15-1166

TransformerではDecoderの中間層とsum
![image.png](https://qiita-image-store.s3.amazonaws.com/0/376849/623c139b-9421-5a6c-0955-a0927d3e983d.png)
参照：http://jalammar.github.io/illustrated-transformer/

### 推論時の計算
LSTMでもTransformerでも時系列順に計算する必要がある
どういうことかというと、**Transformerであっても、推論を時間ごとに並列化して計算するのは無理**・・・だと思う
なぜなら、出力tokenを$t_1,...t_n$としたとき、token $t_i$の出力確率を計算するには入力にtoken $t_1 ... t_{i-1}$ が必要になるからである

図でいうと下の通り
![image.png](https://qiita-image-store.s3.amazonaws.com/0/376849/d115bc35-53a0-57d9-1fb1-d6c80b8cb159.png)
参照：http://jalammar.github.io/illustrated-transformer/


## 何が違うのか
### 学習時の計算
**Transformerは学習を並列して行うことができる**

並列って具体的にどういうことかというと、
入力token列$t_{i_1}...t_{i_k}$を利用したtoken$t_{o_1}$の出力確率の計算と、
入力token列$t_{i_1}...t_{i_k}$と出力token列$t_{o_1}$を利用したtoken$t_{o_2}$の出力確率の計算と、
入力token列$t_{i_1}...t_{i_k}$と出力token列$t_{o_1}...t_{o_2}$を利用したtoken$t_{o_3}$の出力確率の計算と、...
というを全部バラバラに行えるということである
これは何故かというと、**出力token列は学習データにおいては既知である**ためである


LSTMの場合、token $t_{o_i}$の出力確率を計算するためには、時刻$t_{i-1}$におけるDecoderの中間表現が必要になる**（＝計算が前の時刻の計算に依存している）**
よって並列化が出来ないのである


### 位置の考慮
**Transformerでは、各tokenが文章の何番目に当たるかを考慮している**
これはPositional Encodingという、次元ごとに異なる周期を持つ信号（sin/cos波）をTokenのEmbeddingに足し合わせることで実現されている、具体的には次の関数
![image.png](https://qiita-image-store.s3.amazonaws.com/0/376849/a1d2c8ce-bd6a-89f1-0d8f-01ed6ed4d373.png)
参考：https://arxiv.org/abs/1706.03762

偶数次元ではsin、奇数次元ではcosの信号になっているようだ
また１周するために必要なtoken数は$2π*10000^{2i/D_{model}}$
ここでiはベクトルの各次元に相当する
iが大きくなればなるほど（ベクトルの高次元に行けばいくほど）一周に時間がかかる（＝周期の長い）信号となっていることが数式からわかる

図からもわかる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/376849/92f618a3-0f3b-07dd-29c8-ab6c0ecbd019.png)
参考：http://jalammar.github.io/illustrated-transformer/
ただし、この図では偶数次元/奇数次元ではなくて、全N次元とすると1～N/2次元、N/2+1次元～N次元でsin/cosを分けているようだ

周期的な信号と聞くと「一周したら最初の単語と位置区別できなくなっちゃうじゃん！」と思うが、高次元になればなるほど一周に時間かかるようになってる＋各次元で周期が違うので、全ての次元の周期がきれいに初期状態に戻るには相当な時間がかかる（≒実質的にどんな長さの文章でも入力可能）ように思える
（ちゃんと計算してないので不明）

整理してもやっぱりちょっと疑問は残るといえば残る
足し合わせるんじゃなくて単純にconcatじゃいけないんだろうか
concatするのであればわざわざ次元をtoken embeddingに合わせる必要もない
位置情報を保存するための次元をn-bit確保しといてそれに入れるのでは駄目なんだろうか

bit立てる場合だと桁上りの際に一気に違う信号になるので、連続的な変化をするsin波を使う気持ちはわかる
でもconcatじゃ駄目なのか？という気持ちは拭えない