OmniAICreator/Qiita-1.07M huggingface dataset:
初心者向けdocker-composeコマンド逆引き

全然網羅できていないのですが、参考にしてください。
今後暇なときに書き足していきます。

## アプリの起動＆停止

### 初回起動
```sh
# foregroundで起動
docker-compose up

# backgroundで起動
docker-compose up -d
```
`docker-compose up` は（imageがなければimageビルドから）コンテナの起動までを行う
### 停止
```sh
# foregroundで起動していた場合
## Ctr + C

# backgroundで起動していた場合
docker-compose stop
```

### 再起動 or 実装変更を反映させる
```sh
# foregroundで起動していた場合
docker-compose up

# backgroundで起動していた場合
docker-compose restart
```
restartでは、コンテナはそのままでソースコードの変更だけ反映可能

### docker-compose.ymlの変更を反映させる
```sh
# foregroundで起動
docker-compose up

# backgroundで起動
docker-compose up -d
```
コンテナの再構築が行われる

### Dockerfile or ビルド処理の変更を反映させる
```sh
# foregroundで起動
docker-compose up --build

# backgroundで起動
docker-compose up -d --build
```

## アプリのログを見る
backgroundで起動中のサービスのログを表示する

```sh
# 最新5行からtailする
docker-compose logs -f --tail="5"

# 最新5行からタイムスタンプ付きでtailする
docker-compose logs -f --tail="5" -t
```

## 後片付け
```sh
# 停止＆削除（コンテナ・ネットワーク）
docker-compose down

# 停止＆削除（コンテナ・ネットワーク・イメージ）
docker-compose down --rmi all

# 停止＆削除（コンテナ・ネットワーク・ボリューム）
docker-compose down -v
```

## 参考
* [Compose command-line reference](https://docs.docker.com/compose/reference/)
* [docker-compose up vs docker-compose up --build vs docker-compose build --no-cache
](https://stackoverflow.com/questions/39988844/docker-compose-up-vs-docker-compose-up-build-vs-docker-compose-build-no-cach/39988980)
* [What is the difference between docker-compose up and docker-compose start?
](https://stackoverflow.com/questions/33715499/what-is-the-difference-between-docker-compose-up-and-docker-compose-start)
T3インスタンスに移行して、料金を10%OFFしてみました。

# T3がリリースされました
AWSのEC2には様々なインスタンスファミリーがあります。その中でも一番お手頃なものがTシリーズです。私の周りのAWSアカウントを除いても、t2.microがゴロゴロしています。
そんなTシリーズの最新インスタンスT3がリリースされました。

[T3インスタンスリリースされました](https://dev.classmethod.jp/cloud/aws/t3-instance/)
[T3インスタンスの性能をWordPress環境で確認してみた](https://dev.classmethod.jp/cloud/aws/comparison-wordpress-t3-t2/)

いいことづくしなので、使わない理由ないですよね。
ということで、今あるt2.microをt3.microにアップグレードしてみました。

# t2.xxxx->t3.xxxxへの変更手順
## コントーロールパネルで変更
インスタンスの変更は、基本的にはコントロールパネルでインスタンスを選択して
1. [インスタンスの状態]->[停止]
2. [インスタンスの設定]->[インスタンスタイプの変更]
3. [インスタンスの状態]->[開始]
とすればOKです。
インスタンスタイプの一覧で```t3.xxxx```が選べるようになっています
<img width="321" alt="スクリーンショット 2018-08-26 9.32.06のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/283575/9a478487-9a17-6f56-190f-fc4140101524.png">

## つまずきポイント
上記で「基本的には」と書いたのは理由があります。変更後、インスタンスを開始しようとすると、

```
Enhanced networking with the Elastic Network Adapter (ENA) is required for the 't3.xxxx' instance type. Ensure that your instance 'i-xxxxxxxx' is enabled for ENA.
```
というエラーが表示される場合があります。
<img width="950" alt="スクリーンショット 2018-08-24 7.20.47のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/283575/ac9e5ca1-6b9d-c9c0-23d4-565b95502fe9.png">

これは、T3インスタンスが新しいタイプのネットワークアダプターENAへの対応が必須のためです。
以下、対応方法を説明します。

## ENA対応準備

#### ENAへの対応は３ステップ
1. 一旦```t2.xxxx```に戻し、インスタンスを起動する。
2. SSHでログインしてENA対応環境にアップデートする
3. CLIでENAを有効化する

CLIはあらかじめ下記を参考に環境を準備しておいてください。
[AWS CLIをインストール](http://gihyo.jp/admin/serial/01/awscli_diary/0001)

#### 念のためバックアップを
コントロールパネルでインスタンスを選択して
 [イメージ]->[イメージの作成]
として、AMIを作成するのが簡単です。

## ENA対応環境へのアップデート
まずログイン

```
mac$ ssh -i xxxx.pem ec2-user@xxx.xxx.xxx.xxx
```
modinfoコマンドでENAが無効であることを確認

```
$ modinfo ena
ERROR: modinfo: could not find module ena
```

そしてアップデート

```
$ sudo yum update
```
アップデートが完了したら
- ログアウト
- インスタンスの再起動
- 再ログイン
してください

再度modinfoコマンドで確認

```
$ modinfo ena
filename:       xxxxxx
version:        xxxxxx
.....
.....
```
これでアップデート完了。

[詳しくはAWS公式アップデート手順へ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/enhanced-networking-ena.html)

## ENA有効化

以下、AWS CLIで行います
(例では```--profile``` ```--region```等のオプションは外しています。必要な方は追加してください)

インスタンスの停止

```
mac$ aws ec2 stop-instances --instance-ids i-xxxxxxxx
```
ENA有効化

```
mac$ aws ec2 modify-instance-attribute --instance-id i-xxxxxxxx --ena-support
```
インスタンス起動

```
mac$ aws ec2 start-instances --instance-ids i-xxxxxxxx
```

これで、ENA有効化できました。
再度```t2->t3への変更手順```を実行してください。

# まとめ

今回、4年ぶりのアップデートとなりました。

前回のt1->t2の時は仮想化方式の変更（PV->HVM）だったため移行が煩雑でしたが、今回は比較的簡単に移行できました。

また、T3インスタンスの単価は、T2と比べ10%ダウンしていることもメリットです。

| インスタンス | 金額 |
|:-:|:-:|
| t2.micro  | $0.0152  |
| t3.micro  | $0.0136  |

検証は必要ですが、移行のメリットは大きそうです。


# メモ

T3のテクニカルな側面、NITROについてのメモです

- T3ではハイパーバイザーがNITROに。（T2はZEN）
- オーバヘッドが小さくなりパフォーマンスが向上。
- その仕組みを垣間見れるセッションがre:Invent 2017のレポート資料に。[【レポート】 EC2仮想基盤の進化](https://dev.classmethod.jp/cloud/aws/aws-reinvent-cmp332-compute/)
Scala Futureのawait/readyをもっと楽にする方法

## 前提

ScalaのFuture型のawait/readyの苦痛度が高い。
歴史的経緯・設計者の間隔もあってなぜかFuture型の外にawait/readyが実装されている[^1]。

[^1]: この表現は厳密には語弊がある。詳しくは[Awaitable型](https://www.scala-lang.org/api/current/scala/concurrent/Awaitable.html#ready(atMost:scala.concurrent.duration.Duration)(implicitpermit:scala.concurrent.CanAwait):Awaitable.this.type)参照

```scala
val futureInt = Future(42)

Await.result(futureInt, Duration.Inf)
```

## ソリューション

[bigwheel/rich\-awaitable](https://github.com/bigwheel/rich-awaitable)を使う。

以下のようにより自然に書ける。

```scala
val futureInt = Future(42)
futureInt.safeResult(Duration.Inf)
```

implicitを使えば毎回最大待機時間を渡す手間も減らせる。

```scala
implicit val atMost: Duration = Duration.Inf

val futureInt = Future(42)
futureInt.safeResult
```
auto-sklearnのインストールではまった話



モデル選定まで自動でやってくれるならもうこれでいいじゃん・・・
というわけでauto-sklearnなるものを使ってみようとしたら意外とはまった話

[auto-sklearnの公式はこちら](https://automl.github.io/auto-sklearn/stable/index.html)

元々の環境：以下のコマンドで作ったdocker上に構築したjupyter環境
`$ docker pull jupyter/tensorflow-notebook`

上記環境ではデフォルトでauto-sklearnが入っていないが以下のcommandでpython環境にauto-sklearnが導入できる
`$ pip install auto-sklearn`

早速実行してみたが、pip installerのバージョンが古くて対応していないとのことなので、以下のコマンドを打つこと要求された

`$ pip install upgrade pip`

コマンドを実施してみるとpipのアップグレードに成功。

改めてauto-sklearnをインストールしようとすると別のエラーが発生
 
    Failed building wheel for pyrfr
    Running setup.py clean for pyrfr

    Failed to build pyrfr

    Installing collected packages: xgboost, pyrfr, smac

      Running setup.py install for pyrfr ... error

        Complete output from command /opt/conda/bin/python -u -c 
    "import setuptools, tokenize;__file__='/tmp/pip-install-
    52evskv6/pyrfr/setup.py';f=getattr(tokenize, 'open', open)
    (__file__);code=f.read().replace('\r\n', 
    '\n');f.close();exec(compile(code, __file__, 'exec'))" install --
    record /tmp/pip-record-f6yrgnm4/install-record.txt --single-
    version-externally-managed --compile:
    running install
    running build_ext
    building 'pyrfr._regression' extension
    swigging pyrfr/regression.i to pyrfr/regression_wrap.cpp
    swig -python -c++ -modern -features nondynamic -I./include -o 
    pyrfr/regression_wrap.cpp pyrfr/regression.i
    unable to execute 'swig': No such file or directory
    error: command 'swig' failed with exit status 1

    

    ----------------------------------------

    Command "/opt/conda/bin/python -u -c "import setuptools, 
    tokenize;__file__='/tmp/pip-install-
    52evskv6/pyrfr/setup.py';f=getattr(tokenize, 'open', open)
    (__file__);code=f.read().replace('\r\n', 
    '\n');f.close();exec(compile(code, __file__, 'exec'))" install --
    record /tmp/pip-record-f6yrgnm4/install-record.txt --single-
    version-externally-managed --compile" failed with error code1 in 
    /tmp/pip-install-52evskv6/pyrfr/

いろいろ調べていたら以下の記事を見つけた
https://github.com/automl/auto-sklearn/issues/347

`$ sudo apt-get install swig`
を打った後に改めて
`$ pip install auto-sklearn`
を打ったら成功した

これでauto-skleranをpython上で使えるようになった
次に転職するときにやること・先方に聞くこと

# 常にやり続けること

* 転職サイトでポートフォリオを継続的に更新する(forkwell, greenなど)

# 面接で聞くこと(あるいは事前に調べるもの)

その時点で優先順位が高いものほど上

## 基本

* 給与
* 勤務形態
* 利用言語・仕様IaaS/SaaS

## 企業詳細

* 売り上げと目的、今後の成長見込み
* CXOが率先してドッグフーディングをしているか

## 働き方・職場の詳細

* ~~現状困っていることを聞く~~
    * そんな簡単に本当に困っていることは教えてもらえない(その企業の弱点、逆鱗なので利害関係者でもない外部の人間には教えてもらえない)ので質問の仕方を何か考えたほうがいい
* チームの編成方式(言い換えると組織図)
* 就業場所を見せてもらう
* リモートワークの可否、およびリモートワークの実行状態(形骸化した制度になっていないか)
* 面接時にできれば労働契約書を見せてもらう
    * 特に残業規定や社員の個人活動を著しく制限するような項目に注意する

## その他

* マッチングが良さそうな場合お互いに実際の業務遂行能力や職場環境を見ず雇用するリスクが高いので、1週間の体験入社を提案してみる
Ubuntu18.04にrubyを入れる

Ubuntu18.04にrubyを入れる。

```shell
sudo apt install ruby
# バージョン確認
ruby -v
```
今回はruby 2.5.1p57がはいりました。
最新なのでしょうか。
わからないのですが、homebrewやbenvを使うより簡単な気がします。
Mac と Amazon Linux WorkSpaces の組み合わせでアンダーバーを入力する

Amazon WorkSpaces (Linux US 版) に MacBook Pro (JIS キーボード) からつなげていますが、残念ながらこの組み合わせだと初期状態で "_" (アンダーバー) を入力できません。

試行錯誤の末、とりあえず対症療法でごまかせたので、備忘録として手順を残しておきます。

## 原因

アンダーバーが入力されないのは、既定でアンダーバーのキー(右 shift キーの左にあるキー)がサウンドの音量を上げるキーとして割り当てられているためでした。

そもそも、なぜ割り当てがおかしくなるのかは分かりません:expressionless:

## 回避方法

システムの設定を書き換えて、音量を上げるキーをアンダーバーキーにマッピングしました。

## 手順

**警告**: **この方法はシステムのファイルを書き換えるため、自己責任で行ってください。誤って設定すると、キーボードの入力ができなくなるなどの重大な不具合が起きる可能性があります。**

1. 何かあったときにリカバリできるように、書き換え対象のファイル (/usr/share/X11/xkb/symbols/inet) をバックアップしておく。
1. テキストエディタで /usr/share/X11/xkb/symbols/inet を開く。(システムファイルを書き換えるため、root 権限が必要。)<br/>例: `sudo pluma /usr/share/X11/xkb/symbols/inet`
1. 次の行を探す。

    ```:/usr/share/X11/xkb/symbols/inet
        key <VOL+>   {      [ XF86AudioRaiseVolume  ]	};
    ```
1. 変更前に、念のため行を複製して、片方の行をコメントアウト。

    ```:/usr/share/X11/xkb/symbols/inet
    //    key <VOL+>   {      [ XF86AudioRaiseVolume  ]	};
        key <VOL+>   {      [ XF86AudioRaiseVolume  ]	};
    ```
1. コメントアウトしていない方の行の "XF86AudioRaiseVolume" を "underscore" に書き換える。

    ```:/usr/share/X11/xkb/symbols/inet
    //    key <VOL+>   {      [ XF86AudioRaiseVolume  ]	};
        key <VOL+>   {      [ underscore  ]	};
    ```
1. 変更を保存して、エディタを終了。

最後にシステムを再起動すると、無事アンダーバーを入力できるようになりました:tada:

はやく公式になおってほしいです。
githubに対してローカルコミットした内容が反映されなくなったとき

少しハマったのでメモ

gitチェックアウトして古いバージョンに戻したあと、
ローカルのファイル追加がgithubに反映されなくなってしまった。

①git checkoutでで特定バージョンに戻る。
②git addでローカルにファイル追加
③git commitでローカルコミット
④git push
したのだが、なぜかgithub側に反映されない。
エラーにはならないし、こちらのローカルファイル削除して、pullするともどせるから登録はできていそう。

git pullしたあと追加してもだめ。
色々、試したところgit fetchして、git pullしたところうまくいった。
どうも、fetchしないでいて、リモートリポジトリとずれたままになっていたっぽい。気をつけよう。
HSPのint,str引数は変数ではなかった。Error23の原因と対策

int 引数に代入すると「Error 23 : 変数名が指定されていません。」が発生しました。
環境は HSP3.5, windows 7 personal 64bit です。

![2018-08-26_105307.png](https://qiita-image-store.s3.amazonaws.com/0/46088/da7bfb48-25e7-0edc-fb91-d1bfaeeb7cf9.png)

HSP の命令・関数の int, str 引数は 1 や "ABC" と同じ扱いであって、C++ などの値渡しの仮引数のように変数として扱えないことが原因です。

たとえば int _cnt という引数があっても _cnt = 0 のような代入はできません。
引数の値が 1 だとしたら、1 = 0 という処理(Error23)をしようとしたことになるようです。

この対策としては、
1. 引数の型を var 型に変える
2. 命令・関数の内部の変数にコピーして使う
などが考えられます。

対策１では、呼び出し元で変数を指定する必要がでてくるため

```HSP
funcInt 1
funcStr ABC
```
から

```HSP
i = 1    : funcInt i
s = "ABC": funcStr S
```
のように、手間が増えるかもしれません。

エラーの詳細については、[HSP3のFAQ:エラーメッセージの意味と対処法が分からない - HSPWiKi](http://quasiquote.org/hspwiki/HSP3のFAQ:エラーメッセージの意味と対処法が分からない#H-zupint)が大変参考になりました。

次に str, int の引数で Error 23 が発生するコードを作成し確認しました。

# str 引数で Error 23 が発生するコード
```HSP
// --- str 引数による Error 23 ---
#module
	#deffunc commaSplitErr1 str _msg
		split _msg, ",", _array    // error 23
		logmes "commaSplitErr1 要素数 = " + stat
	return
#global

#module
	#deffunc commaSplit1 var _msg
		split _msg, ",", _array
		logmes "commaSplit1 要素数 = " + stat
	return
#global

#module
	#deffunc commaSplit2 str _msg
		_tmpMsg = _msg
		split _tmpMsg, ",", _array
		logmes "commaSplit2 要素数 = " + stat
	return
#global

// OK
_msg1 =  "1, 2, 3, 4": commaSplit1 _msg1

// OK
commaSplit2 "1, 2, 3, 4, 5"

// Error23: 
commaSplitErr1 "1, 2, 3"
```
結果は次のとおりで、 最後の commaSplitErr1 命令の内部で引数を split に変数として渡した 4 行目でエラーが発生していました。

```console
commaSplit1 要素数 = 4
commaSplit2 要素数 = 5
```
![2018-08-26_105307.png](https://qiita-image-store.s3.amazonaws.com/0/46088/db51aef3-af14-b143-acd9-04a9ead85299.png)

# int 引数で Error 23 が発生するコード

```HSP
// --- int 引数による Error 23 ---
#module
	#defcfunc plusOneErr1 int _val
		_val = _val + 1    // error 23
	return _val
#global

#module
	#defcfunc plusOne1 var _val
		_val = _val + 1
	return _val
#global
#module
	#defcfunc plusOne2 int _val
		_tmpVal = _val
		_tmpVal = _tmpVal + 1
	return _tmpVal
#global

// OK
_val1 = 4: logmes "result = " + plusOne1(_val1)

// OK
logmes "result = " + plusOne2(5)

// Error23
logmes "result = " + plusOneErr1(2)
```
結果は次のとおりで、最後の plusOneErr1 関数の内部の _val 引数に代入する 4 行目でエラーになっていました。

```console
result = 5
result = 6
```

![2018-08-26_110444.png](https://qiita-image-store.s3.amazonaws.com/0/46088/a6b7bc1b-b5c4-f66a-3474-2bc25adc3f07.png)

# コンパイルエラーの Error 23 は引数の書き方が間違っていると起こる
例えば local p と書くところと local, p と書いたりするとコンパイルエラー (Error 23) が発生します。

```HSP
#modinit local, p
```

```console
SCTmxMap.as(10) : error 23 : パラメーター引数の指定が間違っています (10行目)
--> #deffunc __init modinit sctmxtileproperties,local,p
```

同じように local や int などの型を書き忘れてもおこります。

```HSP
#modinit p
```

```console
SCTmxMap.as(10) : error 23 : パラメーター引数の指定が間違っています (10行目)
--> #deffunc __init modinit sctmxtileproperties,p
```

#参考サイト
- [HSP3のFAQ:エラーメッセージの意味と対処法が分からない - HSPWiKi](http://quasiquote.org/hspwiki/HSP3のFAQ:エラーメッセージの意味と対処法が分からない#H-zupint)
ClovaでローカルマシンのMP3を再生させる #asciihack #linebootawards


`#asciihack`にて質問を受けたので書いています。

[ClovaスキルでMP3ファイルを再生してみよう #asciihack #linebootawards](https://dotstud.io/blog/nodejs-clova-skill-mp3/)で書いた内容の補足です。

MP3ファイルなどは基本的にサーバーに置いていてそこにアクセスして再生させます。音声ファイルを変更した場合などに毎回サーバーにあげなおすのは大変なのでローカルマシンのMP3にアクセスさせたいケースがあります。

## ngrokを使ってローカルPCのMP3にアクセスできるようにします

知ってる人からすると当たり前な話ですがngrokでトンネリングです。

```
ngrok http 3000
```

でトンネリングさせます。

`https://xxxxxxxxxxx.ngrok.io`などのURLが生成されてエンドポイントになります。
ただ、それだけでは`https://xxxxxxxxxxx.ngrok.io/myaudio.mp3`などの形式でアクセスす流ことはできません。

## express.static()を利用

ClovaのNode.js SDKのサンプルではExpressを利用しているのでルーティングがExpressの規則に則る形になります。

[Express での静的ファイルの提供](http://expressjs.com/ja/starter/static-files.html)などみると分かりますが、`express.static()`を利用して`publicフォルダ`などに静的ファイルを設置して利用できるようにします。

`app.js`と同様の階層に`publicフォルダ`を作成し、その中にmp3ファイルを設置します。

チュートリアルコードの下部で`app.use(express.static(__dirname+'/public'));`の宣言を追加します。

```app.js
・
・
(省略)
・
・

const app = new express();
const port = process.env.PORT || 3000;

app.use(express.static(__dirname+'/public')); //←追記: publicフォルダにアクセスできるように

const clovaMiddleware = clova.Middleware({applicationId: 'YOUR_EXTENSION_ID'});
app.post('/clova', clovaMiddleware, clovaSkillHandler);

app.listen(port, () => console.log(`Server running on ${port}`));
```

これでサーバーを再起動すると`publicフォルダ`内のファイルにそのままアクセスすることができるようになります。

これで`https://xxxxxxxxxxx.ngrok.io/myaudio.mp3`に直接アクセスできます。フォルダやpng画像やcssなどその他のファイルも同じようにアクセスできます。

* public/myaudio.mp3 -> `https://xxxxxxxxxxx.ngrok.io/myaudio.mp3`
* public/img/myimage.png -> `https://xxxxxxxxxxx.ngrok.io/img/myimage.png`

## 所管

Node.jsなどを利用している人だとルーティングに関しての規則は把握しているけど、他の言語で普段開発をしていてClovaを触ろうとする人はNode.jsサンプルが多いからやりはじめてみるけどこういうところでつまづくのかもなぁと思ったりしました。 Express周りの使い方も紹介していけると良さそうですね。
C++Builder ライブラリの修正手順メモ

C++Builder 10.2.3 Tokyo Professional版のソースファイルを使用して、
ライブラリの不具合を修正してみました。

・対象コンポーネント：
　「TWebBrowser」　ー　Win32版
　　”file://〜.htm” 指定が正常に動作しないのを修正する。

・修正するライブラリ：
　「FMX.WebBrowser.Win.dcu」

　　このファイルは、下記２箇所のフォルダに格納されています。
　　① インストール先¥lib¥win32¥Debug¥
　　② インストール先¥lib¥win32¥Release¥
　　　　● 標準インストール先は
　　　　　C:¥Program Files (x86)¥Embarcadero¥Studio¥19.0¥ 

・ソースファイル：
　「FMX.WebBrowser.Win.pas」
　　インストール先¥source¥fmx¥ 内 のファイル

・修正する手順
　（１）「TWebBrowser」を使用する新規プロジェクトを作成する。
　（２）ライブラリのソースファイルをプロジェクトフォルダへコピーして、
　　　　更にプロジェクトへこのファイルを追加する。
　（３）ライブラリのソースファイルを修正しコンパイル、実行動作を確認する。
　（４）Debug版とRelease版の両方でコンパイルし、
　　　　２種類の「FMX.WebBrowser.Win.dcu」を作成する。
　（５）上記２種類の「FMX.WebBrowser.Win.dcu」をそれぞれ
　　　　ライブラリファイル　① と　② と置き換える。 

　ライセンスの関係が絡むと困るので、ソースファイルや修正箇所は載せておりません。

　恐らく他のコンポーネントやDelphiでも、同じ方法で修正出来ると思います。
RT1310AでPCIサポートしてみた

FreeBSDは12のリリースに向けてarmの古いコードを消していて私の書いた[arm/ralink](https://qiita.com/yamori813/items/0d2945f2cb771cd2fba9)も危うく消されそうになって、結構頭にきてます。で、腹いせにというわけではないのですが、PCIのサポートも入れてみました。

https://reviews.freebsd.org/D16892

かなり前からやってたのですが、手こずってやっと動くようになりました。

このSOCのPCIの構成はこのようになっています。

![RT1310_PCI.png](https://qiita-image-store.s3.amazonaws.com/0/104066/cdeb3b76-02c4-7b3a-0418-7bee64b66a6e.png)

まずdtsiにpciを追加してfdtでPCIがprobeされるようにします。

PCIのattachではPCIのメモリ空間とIO空間の確保とBridgeの初期化を行います。このSOCのPCI Host Bridge(0,0)はコンフィグレーションのベンダーがabcdでデバイスが1234となっていて、おそらく正式なIDではないと思われます。

Bridgeの初期化はメモリ空間にあるレジスタとコンフィグレーションレジスタでおこないます。この方法は採用されているBridge毎に違います。

レビューのコードを見てもらうと分かりますが、コンフィグレーション読み書きの処理とちょっとした初期化ぐらいしかしていません。PCIはドライバーの処理軽減のためにハードがいろいろやってくれるおかげだと思います。

arm/versatileを参考にしたのですが、このコードのコンフィグレーションの読み書きで0.0は除外するコードが入っています。

これを知らずにBridgeのコンフィグレーションの初期化を行っていたので動きませんでした。

PCIでBrigeのアドレス空間(BAR0)はメインメモリすなわちこのSOCでは0x40000000に設定します。

FreeBSDのPCIバスのプローブのコードはデバイスを対象にしていてHost Bridge(0.0)は対象から外すのがしきたりのようです。このため初期化の時だけ読めるようにして、PCIバスのプローブ時には0xffffを返すようにしました。

PCIでは割り込みの処理も必要なのですが、fdtとpcibがうまくやってくれているようで、自前の処理はありません。

なにか一つPCIのドライバーを書いてみたいと思っていたので、デバイスの処理が動いた時にはちょっと嬉しかったです。

RT1310Aは10年くらい前のSOCですが、このころはSOCにPCIバスがありましたが、その後あまり使われなくなってIOがメモリ空間直付けになり、最近だとハイエンドのSOCでPCI-eをサポートしているケースもちらほらあるようです。

古いarmのコードはfdtやINTRNGやeventtimerなどがサポートされてなかったので、仕方がないところはあるのですが、RT1310Aのコードはこれらを全てサポートしていて、消される言われはこれっぽちもありません。

16MのメモリのターゲットでもFreeBSDはちゃんと動くのですが、中の人はそうは思ってなかったようです。Flashが4Mで動かせるのはZRouterのおかげですが、カーネルはそれほど操作してないので、16Mのメモリで動くのはFreeBSDの実力です。jailは標準で入るですが、このような組み込みではあまり必要ないので、外せるようにするとか、もう少しカーネルを小さくする仕組みがあっても良い気がしますが。

小さいOSとしてFreeBSDを使いたい需要もあるとおもうので、あまり大きくしないポリシーもあっても良いのではないかと思います。

amd64でarmをクロスビルドするとZRouterを使っても7時間以上かかり、素のbuildworld/kernelだとそれ以上かかり気が遠くなります。gcc 4.2のままのmipsは45分くらいです。clangのビルドが大半の時間をしてめていて、もしクロスビルドに時間がかかるからターゲットを絞りたいとか考えているのであれば、そもそもclangにしたこと自体が間違いだったのではないでしょうか。
クラス名に任意の数字を記入し、プロパティの値として扱う[HTML.CSS]

cssのクラス名に任意の数字を指定し、その値をプロパティとして扱います。
レイアウトを組む際に、例外の意図的な余白がある。
コンポーネント一覧ページなど、実装するページでは無いが見通しを良くしたい時などに便利。

DOMが汚れてしまうのと、データが入っていないDOMを記述することは善とされていないので邪道な方法になってしまうが、コンポーネント指向を取り入れているとどうしてもここだけ・・・といったことがあるので。

```scss:style.scss
@for $i from 1 through 200 {
	.clearance_#{$i * 1} {
		width:#{$i * 1}px !important;
		height:#{$i * 1}px !important;
	}
}
```

```html:index.html
<div class="clearance_100"></div>
```

注意点

レスポンシブの際に余白が不要になる。または余白のサイズが変わる時は扱いが不便になるので、PC,SPで切り分けるクラスを入れておくのが良い。

```html:index.html
<div class="clearance_100　pc"></div>
<div class="clearance_50　sp"></div>
```


ご意見、ご連絡ありましたらぜひ、Twitterにお気軽にご連絡ください！
https://twitter.com/RinstarskyKujat
ターミナル起動時に、ホームディレクトリではなく任意のディレクトリをデフォルトに設定する

# はじめに
ターミナルを起動するとデフォルトではホームディレクトリが指定された状態です。
そこから`cd PATH_OF_YOUR_DIR`などと毎回打つのは面倒です。
そこで本稿ではホームディレクトリではなく任意のディレクトリをデフォルトに設定する**2パターン**の方法についてご紹介します。
# 1
まず最もわかりやすい方法は、**ターミナルの環境設定から設定する方法**です。

1. ターミナルを起動します。
2. メニューから「ターミナル->環境設定...->プロファイル->シェル」へ移動します。
3. 「コマンドを実行」のチェックボックスをチェックし、右隣の枠内に`cd PATH_OF_YOUR_DIR`を入力します（例 「cd /Users/*USER_NAME*/Documents/sandbox」）。

以上で、起動時にいつも入力したコマンドが実行され特定のディレクトリに移動した状態になります。

# 2
次に、**ホームディレクトリのbash_profileにコマンドを書き込んで設定する方法**です。
前項では`cd PATH_OF_YOUR_DIR`というコマンドの実行結果も毎回ターミナルに表示されます。
これがわずらわしいと感じる方は以下の方法を試してください。

1. ターミナルを起動します。
2. `echo "cd PATH_OF_YOUR_DIR" >> ~/.bash_profile`を実行します（例 「echo "cd /Users/*USER_NAME*/Documents/sandbox" >> ~/.bash_profile」）。

以上で、起動時に特定のディレクトリに移動した状態になり、コマンドの実行結果は表示されません。

# 参考
[Set the default directory in mac terminal](https://stackoverflow.com/questions/5696757/set-the-default-directory-in-mac-terminal)
【今日から携わる】既存の静的HTMLサイトをWordPress化するHowToサイトのまとめ

# 携わるタスク
HTMLで作られたサイトを、WordPress化する

## 記事を書いた理由
今日、既存のHTMLサイトをWordPressサイトにする案件に携わった際に参考にしたいサイトをまとめました。
 
# まとめ

##　参考1
2015年6月23日 5:01 PM
### [HTMLサイトをWordPressに移行する手順のまとめーその１]
https://ruuski.net/web/modify-html-website-to-wordpress/

> 1. HTMLサイトのコピーをローカルに作成
> 2. HTMLファイルを整理する
> 3. HTMLファイルとWordpressテンプレートとの対応を考える
> 4. WordPressテーマの基本的なファイルを作成
> 5. 元のHTMLファイルをパーツ化しWordpressテンプレートファイルに移行
> 6. htmlの一部をphpコードに置き換える
> 7. style.cssとfunctions.php
> 8. WordPressテーマをzip化し、アップロード
> 9. この後の作業をリストアップ

##　参考2
2015年7月17日 11:57
### [HTMLサイトをWordPressに移行する手順のまとめ ‐ その2]
https://ruuski.net/web/switch-html-website-to-wordpress-2/
> 1. 大まかな流れ
> 2. WordPressをサーバーにインストールする
> 3. wp-config.phpをデバッグモードにする
> 4. テーマをアップロードする
> 5. サイトを作る場合は固定フロントページの設定を
> 6. PHPファイルの記述の誤りを修正していく
> 7. 残りのテンプレートファイル（page.php、archive.phpなどの作成）
> 8. パーマリンク設定
> 9. コンテンツの作成・メニューやウィジェットなど
> 10. 基本的なプラグインの導入
> 11. 全体的な動作確認
> 12. wp-config.phpをデバッグモードをオフに
> 13. トップページをhtmlからwordpressに切り替える作業
> 14. リダイレクト設定（必要な場合）

##　参考3
2018年6月22日
### [静的HTMLサイトをWordPress化するときの具体的な移行手順]
https://haniwaman.com/static-to-wordpress/

#### 下記の静的HTMLサイトを実際にWordPress化していきます。
https://haniwaman.com/sample/part3/template_08/

> 1 静的HTMLサイトをWordPress化するときの手順
> 1.1 １.テーマフォルダを作成
> 1.2 CSS、JavaScript、画像ファイルをテーマフォルダにコピー & 読み込み
> 1.3 テーマの宣言
> 1.4 index.phpを「とりあえず」作成
> 1.5 テンプレートファイル分割
> 1.6 固定ページ作成
> 1.7 投稿ページ作成
> 2 WordPress化の検討事項
> 2.1 URL構造
> 2.2 メニュー機能
> 2.3 ウィジェット機能
> 2.4 カスタム投稿タイプ
> 2.5 記事のトレース
> 3 WordPress移行後のチェック
> 3.1 URL構造のチェック
> 3.2 リンク切れがないかチェック
> 4 おわり

##　参考4
### [HTMLをWordPressテンプレートにする方法]
https://inthecom.net/1643
> 1. imageファイルを紐付る
> 2. index.htmlを分割する
> 3. header.phpをWP用に編集する
> 4. page.php・single.phpをWP用に編集する
> 5. archive.php、search.phpをWP用に編集する
> 6. functions.phpを作成する
> 7. sidebar.phpを編集する
> 8. footer.phpを編集する
> 9. style.cssを編集する
> 10. wp-contents＞theme　にフォルダをアップロードする


## Wordpressのテーマを自作する参考サイト

ワードプレス自作テンプレート作成

初心者必見！自作のWordPressオリジナルテーマを作成する方法を徹底解説（2018.08.20）
https://plusers.net/wordpress_theme_0
demo:https://plusers.net/theme-sample/
評価：96点

WordPressのテーマを自作してオリジナルサイトを作る方法　2018/8/21　2018/10/29
https://www.sejuku.net/blog/68742

WordPressのテーマを自分で作成してみたら意外と簡単だった！（2018.10.02）
https://wpmake.jp/contents/theme/theme_create/


ざっくりWordPressの自作テンプレートの作り方（2018年02月10日に更新、2015年07月20日に投稿）
https://qiita.com/kazukichi/items/5126a4fd259d374e99ae


WordPressオリジナルテーマを作成するための全手順【自作は簡単です】2018.10.17
https://creive.me/archives/1136/

WordPress オリジナルテーマの作り方
https://www.webcreatorbox.com/tech/wordpress-original-theme

WordPressテーマの自作方法を解説する！【ここまでできればWPはOK】2018.12.16 2019.04.12
https://yukinishimura.net/wordpress-theme-create/

超倍速でWordPressオリジナルテーマ作成！骨だけ「Bones」の使い方をザックリと
http://websae.net/wordpress-bones-20141203/
demo:https://themble.com/bones/
評価：65点
Macのハードディスクの空き容量を開放する


## 容量を食っているファイルを抽出する
```console
# 1000M以上のファイルを抽出
$ sudo du -x -m -d 5 / | awk '$1 >= 1000{print}'
```

## メモリ関連
### ハイバネーション機能
スリープ時にバッテリーがなくなってもデータは保存してるから安心してね機能。
`/private/var/vm/sleepimage`に、スリープから復帰する際や、バッテリー駆動時に終了してしまった際などに、バックアップとしてRAM（メモリー）上に保管されているデータをいったんハードディスクに退避するために保存してある。

消して問題なし。

```console
$ sudo rm -r /private/var/vm/sleepimage
```

なおハイバネーション機能はオフにもできるが、休止状態にした時に復旧できなくなるのでオンのままにする。オフにするやり方は以下の通り。

```console
# ハイバネーション機能をオフにする
$ sudo pmset -a hibernatemode 0
# ハイバネーション機能をオンにする
$ sudo pmset -a hibernatemode 3
```

### スワップファイル
同時に多数のアプリなどを動かすことによってメモリーが足りなくなった時に、使ってないアプリなどのメモリー領域を一時的に保存する場所。

`/private/var/vm/swapfile`にある。

これはパソコンを再起動すれば消える。

手動で消したい場合は、作業が落ち着いたタイミングで以下の手順でスワップを実メモリに書き戻す。

```console
$ sudo launchctl unload /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
$ sudo launchctl load /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
```

## Adobeのキャッシュ
Adobeのキャッシュを、作業終了後に削除する。
場所は、Macintosh HD/Users/＜ユーザー名＞/Library/Application Support/Adobe/Common/ 以下の「Media Cache Files」および「Media Cache」フォルダ内のファイル。

```sh
rm -rf ~/Library/Application\ Support/Adobe/Common/Media\ Cache/* ~/Library/Application\ Support/Adobe/Common/Media\ Cache\ Files/*
```

## Macのキャッシュ
以下の場所にMacのキャッシュは保存されている。

システムキャッシュ（`/System/Library/Caches`）、ローカルキャッシュ（`/Library/Caches`）、ユーザーキャッシュ（`/Users/ユーザ名/Library/Caches`）の3つ。

コマンドで一括削除する。

```sh
sudo rm -rf /System/Library/Caches/* /Library/Caches/* ~/Library/Caches/*
```

## Sketchのオートセーブ
Sketchのオートセーブで保存されいるファイルを削除する。

```sh
sudo rm -r /.DocumentRevisions-V100/.cs
```

Sketchのオートセーブ機能は、SketchのPreferences > General からオフにできます。

## Spotlight
Spotlightのインデックスでファイル容量が大きくなっていたので、インデックスを作成し直す。

```console
$ sudo mdutil -i off /
$ sudo rm -rf /.Spotlight-V100/
$ sudo mdutil -E -i on /
```

## iCloud Drive
iCloudはほぼ使用していなかったので削除。

Macのシステム環境設定 > iCloud > iCloud Drive のチェックを外す。

※ローカルからファイルが消える可能性があるため、デスクトップや書類のデータはバックアップを取得しておくこと

## 削除したら
すべて削除したらPCを再起動する。
PythonでTwitter APIを使って検索できるようにしてみた

#やったこと
・Pythonの勉強のため、twitterAPIでツイートを検索し、検索結果をログに出力できるようにした。

#環境など
・AWS
・python3

#実行結果のイメージ
コードを実行すると、以下の画像のように検索結果がログに出力されます。
<img width="797" alt="スクリーンショット 2018-08-25 10.13.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/240361/c04b44e8-b5a0-2284-c11b-6a4485058a0a.png">

#コード
検索用のコードと各種キーが記述されたコードを別ファイルで記述しています。

```python:autoSearch.py

import urllib.request
from requests_oauthlib import OAuth1Session
# from bs4 import BeautifulSoup
# from TwitterAPI import TwitterAPI
import datetime
import requests
import tweepy
import os
import key

#apiを取得
auth = tweepy.OAuthHandler(key.getConsumerKey(), key.getConsumerSecret())
auth.set_access_token(key.getAccessToken(), key.getAccessSecret())
api = tweepy.API(auth)

#検索キーワードを設定する。
#searchWord = "大阪桐蔭" #検索ワード１つ
searchWord = ["金足農業","応援"] #検索ワード複数

# twitter内を検索する
for status in api.search(q=searchWord, lang='ja', result_type='recent', count=5): #qに検索したいワードを指定する。
    print("ユーザーID:" + status.user.name) #userIDを表示
    print("ユーザー名:" + status.user.screen_name) #ユーザー名を表示
    #time = status.created_at + datetime.timedelta(hours=9)
    print("投稿日時:" + str(status.created_at + datetime.timedelta(hours=9))) #投稿日時を表示
    print(status.text) #ツイートを表示
    print()
```

```python:key.py
#git ignoreとして設定する。
CONSUMER_KEY = 'xxxxxxxxxxxxxxxxxxxxx'
CONSUMER_SECRET = 'xxxxxxxxxxxxxxxxxxxxx'
ACCESS_TOKEN = 'xxxxxxxxxxxxxxxxxxxxx'
ACCESS_SECRET = 'xxxxxxxxxxxxxxxxxxxxx'

def getConsumerKey():
    return CONSUMER_KEY
    
def getConsumerSecret():
    return CONSUMER_SECRET

def getAccessToken():
    return ACCESS_TOKEN
    
def getAccessSecret():
    return ACCESS_SECRET
```

key.pyの「xxxxxxxxxxxxxxxxxxxxx」にはTwitterAPIに登録時に発行された自身のキーやトークンを設定します。
AWS Lambda で WebAssembly を動かす

成果物: https://github.com/macoshita/lambda-wasm-example

Lambda が今年の 4 月に Node.js 8.10 に対応した。 8 からはフラグ無しで WebAssembly (WASM) に対応しているので、動くんだろうなーとは思いつつも試してなかったのでやってみた。結論、動く。

## 構成

```
.
├── README.md
├── hello_world
│   ├── app.js
│   └── wasm
│       ├── hello_world_wasm.d.ts
│       ├── hello_world_wasm.js
│       ├── hello_world_wasm_bg.js
│       └── hello_world_wasm_bg.wasm
├── hello_world_wasm
│   ├── Cargo.lock
│   ├── Cargo.toml
│   ├── build.sh
│   ├── package.json
│   └── src
│       └── lib.rs
└── template.yaml
```

hello_world_wasm をビルドして、成果物を hello_world の中に出力し、 hello_world を AWS Lambda にデプロイする。
プロジェクト全体は AWS SAM CLI で作っていて、 Rust 部分は [wasm-bindgen](https://github.com/rustwasm/wasm-bindgen/) の Basic Usage をやってるだけ。

## Rust 側

受け取った文字列に Hello をつけるだけ。

```rs
extern crate wasm_bindgen;
use wasm_bindgen::prelude::*;

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

ビルドスクリプトは [こちら](https://github.com/macoshita/lambda-wasm-example/blob/master/hello_world_wasm/build.sh) 。ポイントは下記のコマンドで `--nodejs` をつけていること。

```bash
$ wasm-bindgen target/wasm32-unknown-unknown/debug/hello_world_wasm.wasm --nodejs --out-dir ../hello_world/wasm
```

## Node.js 側

Rust 側が吐き出した以下の js 群を……

```
├── hello_world
│   ├── app.js
│   └── wasm
│       ├── hello_world_wasm.d.ts
│       ├── hello_world_wasm.js
│       ├── hello_world_wasm_bg.js
│       └── hello_world_wasm_bg.wasm
```

JS 側で require して使う。

```js
const wasm = require('./wasm/hello_world_wasm')

exports.handler = async event => {
  return {
    'statusCode': 200,
    'body': JSON.stringify({
      message: wasm.greet('rust!!!')
    })
  }
}
```

Node.js 8 に対応した Lambda だと、すごくスッキリかけるようになっていた。よい。

## ローカルで動作確認

Docker が入っていれば、下記のコマンドでローカルで Lambda を試すことができる。

```bash
$ sam local start-api
```

http://127.0.0.1:3000/hello にアクセスすると、以下のような JSON が返される。 WASM が動いた。

```json
{"message":"Hello, rust!!!!"}
```

## 用途

Lambda は Go を使えば速度も申し分ないし、そこまで使い所はないんだろうなーと思いつつ、以下が思いついたところ。

- 既存の Lambda の一部だけを早くしたい
    - 一番ありそう
- シングルバイナリ生成が面倒 or バカでかくなる言語で Lambda 書きたい
    - https://github.com/appcypher/awesome-wasm-langs とか見てると結構ありそう
        - てか下手すると Java とか Python は WASM にして動かしたほうが早いんじゃ？
- バイナリ生成して exec で呼び出すよりは WASM のサンドボックス内にあるから安全かも
    - かも

これはというのがあったら教えて欲しい。
C++、VB.NET、InterSystems ObjectScriptの文法翻訳

「まったく同じ処理を行う」方法がわかれば、ObjectScriptでの記述も楽になると思い、作りました。InterSystems飯島さんのチェック済みです。（ありがたい）
![20180828-4.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/fcd83079-6e4c-3dc4-8323-847d81685188.png)
![20180828-5.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/1065b626-3e5e-b1bc-1126-f43c25498de5.png)



追記：
yumetodoさんのコメントをいただきまして、コードを検証しました。（確かにoperator +は""の和には使えず、動きませんでした。その他、大文字小文字の別など、いろいろありました。ご親切にご指摘ありがとうございます。Visual Studio 2015/Visual C++のコンソールアプリケーションにて以下のコードで動作確認しました。なお、飯島様にはObjectScriptのチェックを行っていただいており、C++部分は私の書き間違いです。）

```cpp:test.cpp
// ConsoleApplication1.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include <cstdio>
#include <string>

class ClsBase
{

};

class test1 : public ClsBase
{
public:
	std::string outstring(std::string filename)
	{
　　　　　　return filename + std::string("a") + std::string("b");
	}

};


int main(void)
{
	test1 t;
	std::string s;
	std::string s1 = "testcode";
	s = t.outstring(s1);
	printf("%s", s.c_str());
	system("pause");
	return 0;
}
```
EXCELからActiveXを使ってInterSystems Cache'にアクセスし、レコードを作成する方法

Cache'側の準備
Studioで新規作成→Cacheクラス定義
![20180826-1.png](https://qiita-image-store.s3.amazonaws.com/0/262065/afe17bf8-4250-0c18-a730-ba86e506512c.png)
User.Main.NewClass1という名前のClassを生成
![20180826-2.png](https://qiita-image-store.s3.amazonaws.com/0/262065/04d2685f-8459-cab4-79b6-6bd4ccbd40cd.png)
データベースとして使いたい場合、Persistentを選択
![20180826-3.png](https://qiita-image-store.s3.amazonaws.com/0/262065/8c1cb6d2-cafa-cf5a-fbf8-22dc4c1933a5.png)
![20180826-4.png](https://qiita-image-store.s3.amazonaws.com/0/262065/6dc5c048-4061-09fd-97f4-ad3e78581512.png)

コードは、Propertyが変数（かつフィールド名）（ここはVB風）
%Numericは数字（整数、少数を含む）
%Stringは文字列
最後に;をつける（ここはC風）
Property i as %Numeric;
Property s as %String:

```ruby:NewClass.cls
コード例
Class User.NewClass1 Extends %Persistent
{
Property i as %Numeric;
Property s as %String:
}
```
Studioでビルド→コンパイルでCache'側の準備はOK

VBA側から呼び出す
準備
開発→Visual Basicで画面を呼び出す
ツール→参照設定から、
CacheActiveX 2.0 Type Library
CacheObject
を選択
![20180826-7.png](https://qiita-image-store.s3.amazonaws.com/0/262065/3f10b937-1283-41fc-99fb-0b05523bca77.png)

プロジェクトエクスプローラで右クリック→挿入→標準モジュール
（ここではModule1が生成されたとする）
![20180826-5.png](https://qiita-image-store.s3.amazonaws.com/0/262065/9e261be0-8ba8-18d3-2b19-3666c4b25f4d.png)

```vb:Module1

Dim factory As CacheActiveX.factory
Sub TestCacheConnection()
       'Cache'と接続する方法----------------------------------------
       Set factory = CreateObject("CacheActiveX.Factory")
       If Not factory.IsConnected() Then
       Dim connectstring As String
     
     ' You can explicitly specify the connection string:
     connectstring = "cn_iptcp:127.0.0.1[1972]:USER:userid:password"

     ' Alternately, you can pop up a connection dialog
     ' This method returns the connection string.
     'connectstring = factory.ConnectDlg()

     'DBに接続する
     Dim success As Boolean
     success = factory.Connect(connectstring)

     'インスタンスを生成
     Dim inst As CacheActiveX.ObjInstance
     Set inst = factory.New("User.Main.NewClass1")

     'Propertyに値をセット
     inst.i = 10
     inst.s = "new input from VBA!" & Now()

     'Cache'DBに保存 = .sys_Save
     inst.sys_Save

     '接続を閉じる = sys_Close
     inst.sys_Close
     Set inst = Nothing 

End If

End Sub
```
サブルーチンを実行すると、Cache'DBにデータエントリーができる

データを簡単に参照する方法
Cache'アイコン→管理ポータルを開き、右上のネームスペースをUSERに変更（大事）
システムエクスプローラ→SQLを開く
![20180826-8.png](https://qiita-image-store.s3.amazonaws.com/0/262065/f1b15bdf-494b-4fef-8831-284bceba7326.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/262065/62686f96-154e-fc6f-e2db-61f7276ffd5f.png)
テーブルから、先ほど作成したUser.Main.NewClass1(ここでは、SQLルールにより、User_Main.NewClass1となっている)を選択し、右側のテーブルをクリック
![20180826-9.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/7e8c5836-4cbe-f5f1-38bd-181b31aa69d2.png)
以下のようにテーブルが表示される（画面はいくらかデータを入力してみたところ）
![20180826-10.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/cfc6a517-187e-b441-32b8-d281fd012d54.png)
ES2017でawaitのネストを避ける

async/await前提のライブラリ（例：Puppeteer）を使っていると、awaitをネストしたくなることがあります。例えば次のような状況です。

```javascript
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

class Foo {
  async getBar() {
    console.log('getBar()');
    return new Promise(resolve => resolve(new Bar()));
  }
}

class Bar {
  async baz() {
    console.log('baz()');
    await sleep(5000);
    console.log('baz finished');
  }
}

(async () => {
  const foo = new Foo();
  await (await foo.getBar()).baz();
})();
```

Barオブジェクトのメソッドbaz()をawaitしたいが、そのBarオブジェクトを得るのにfoo.getBar()をawaitで受け取る必要がある、という状況です。

個人的には、この例のようにawaitがネストしているとカッコ悪いなあ、と感じてしまいます。

`await foo.getBar()`を一回変数に受け取ってもいいんですけど、他に書き方は無いのだろうか、ということで考えてみました。

## thenでメソッドチェーンする

下記のようにすればawait1回でやりたいことが実現できます。

```javascript
(async () => {
  const foo = new Foo();
  await foo.getBar()
    .then(x => x.baz());
})();
```

このように書くとthen()の返すPromiseをawaitすることになるので、awaitでthen()の終了を待つことになります。

これで読みやすくなったかは疑問ですが、awaitが三重四重になるようであればこのような書き方もアリかなと思います。

## Puppeteerでの実例

上のような状況の例としてPuppeteerのコードを示します。

Puppeteerで、ページ中の要素の出現を待ってクリックする、というような状況では次のようなコードを書くことがあります。

```javascript
const button = await page.waitForSelector('button[type="submit"]', {visible: true});
await button.click();
```

これを1行で書きたいとき、次のように書くことができます。

```javascript
await page.waitForSelector('button[type="submit"]', {visible: true})
  .then(el => el.click());
```

Puppeteerでのコーディングではセレクタ1個にそれほど重要な意味はないので、いちいち変数に取りたくない気持ちになるんですよね。
KVM上でk8s+calicoをkubeadmで試そうとしてNATネットワーク内でのルーティングでハマる

## 発端
kubeadmでkubernetesをデプロイしてみようとインストールガイド、その他を見ながらチャレンジ。

参考1：https://kubernetes.io/docs/setup/independent/install-kubeadm/
参考2：https://qiita.com/k-srkw/items/7a4c6be6c3e3fbf3c23c

## 当初の環境
```
+------+ +------+ +------+
|Master| |node-1| |node-2|
+---+--+ +---+--+ +---+--+
    |.9      |.65     |.66
+---+--------+--------+--+
|      virbr0(deafult)   | 192.168.122.0/24
+------------+-----------+
             |.1
+------------+-----------+
| Host OS : Ubuntu 16.04 |
+------------------------+
```

シングルマスタ＋ノード２台構成で構築。

kubeadmのデプロイの簡単さに驚愕しながらnginxをデプロイ。
参考３：https://qiita.com/mihirat/items/ebb0833d50c882398b0f


## 問題事象

``kubectl expose deployment nginx --port 80  --external-ip 192.168.122.9``

```
[root@k8s-master ~]# kubectl get services nginx
NAME       TYPE        CLUSTER-IP      EXTERNAL-IP     PORT(S)   AGE
nginx      ClusterIP   10.99.238.250   192.168.122.9   80/TCP    12s
```

``[root@k8s-master ~]# curl 192.168.122.9``を打つも応答なし・・・タイムアウトしてる。

## 切り分け
Deployやexposeに誤りがあるのかと、小一時間色々とやり直したり。
どうもそういう問題でなさそうな気がするので``tcpdump``で切り分け実施。
masterとnginxのpodsが上がっているVMでtcpdump。

**master上でのキャプチャ結果（ログ残ってなかったのでイメージ）**

```tcpdump
01:53:41.775515 IP 192.168.122.9.49240 > 10.244.2.2.http: Flags [S], seq 1831094493, win 43690, options [mss 65495,sackOK,TS val 2867936 ecr 0,nop,wscale 7], length 0
```

**node上でのキャプチャ結果**

```tcpdump
01:53:41.775515 IP 192.168.122.1.49240 > 10.244.2.2.http: Flags [S], seq 1831094493, win 43690, options [mss 65495,sackOK,TS val 2867936 ecr 0,nop,wscale 7], length 0
01:53:41.775609 IP 192.168.122.66.49240 > 10.244.2.2.http: Flags [S], seq 1831094493, win 43690, options [mss 65495,sackOK,TS val 2867936 ecr 0,nop,wscale 7], length 0
```

なぜかnodeに来るときにsourceIPが変わっている。.1ってHostのIPなのになぜ・・・

しばし謎でしたがどう見てもSNATがかかってるのでもしやと・・・


```
10.x.0.1 10.x.1.1 10.x.2.2
+------+ +------+ +------+
|Master| |node-1| |node-2|
+---+--+ +---+--+ +---+--+
    |.9      |.65     |.66
+---+--------+--------+--+
|      virbr0(deafult)   | 192.168.122.0/24
+------------+-----------+
             |.1
+------------+-----------+
| Host OS : Ubuntu 16.04 |
+------------------------+
```

ちゃんとiptablesがどういう設定されていたかは読んではないですが、Master->Nodeの通信でvirbr0を通りつつ、virbr0以外の宛先アドレスであるがためにブリッジ内でSNATをかけていた模様・・

下記構成のようにVMアクセス用ブリッジと、k8s内通信用ブリッジを分けることによりめでたく、k8sでの疎通確認ができました。
参考4:https://libvirt.org/formatnetwork.html#examplesPrivate

```
  10.x.0.1 10.x.1.1 10.x.2.2
  +------+ +------+ +------+
  |Master| |node-1| |node-2|
  +-+-+--+ +-+-+--+ +-+-+--+
    | |.9    | |.65   | |.66
  +---+--------+--------+--+
+-|          br-new        | 172.30.0.0/24(Isolated)
| +------------+-----------+
+ -----------+-----------+ 192.168.122.0/24(Deafult/NAT)
             |
+------------+-----------+
| Host OS : Ubuntu 16.04 |
+------------------------+
```

## 教訓とまとめ
- KVMというか、iptablesの仕様（というか書き方?）により必ずしもHOST OS側IFの外へ出て行くものだけがNATかかるわけではない
 - k8s/calicoに限らず、L3ルーティングするもののお試しに、KVMデフォルトのNAT networkはダメ・ゼッタイ
- 環境の組み直しなどを何度もしましたけど、kubeadmが便利過ぎ。
 - もし自分でビルドしてとかパッケージから入れてたら、ダメだった時点で心折れてたかも・・
axis メモ

機械学習に関する本を読み進めている途中に,axisという単語にひっかかったので記述.
###axisとは、軸、軸線という意味。

下記のリンクを参考にしてね
[https://teratail.com/questions/74560](https://teratail.com/questions/74560)
[https://qiita.com/shuetsu@github/items/2bf8bba233c5ecc7a0ad](https://qiita.com/shuetsu@github/items/2bf8bba233c5ecc7a0ad)
FlashAir開封からカメラへの挿入、iOSアプリの利用まで

FlashAir開封からカメラへの挿入、iOSアプリの利用までのフローをわかりやすく説明している記事が見当たらなかったので整理してみる。

FlashAirの初期設定を行い、カメラにFlashAirを挿入、スマホアプリである「FlashAir」からカメラで撮影した写真を確認するまでの流れを書いた。

# パッケージ開封
ただ開けるだけ。
中にFlashAirと取扱説明書兼保証書が入っている。

# 「FlashAir™設定ソフトウェア」のダウンロードとインストール
FlashAirの初設定や工場出荷状態へのレストアを行うための「FlashAir™設定ソフトウェア」をインストールする。Win/Mac用のソフトウェアが公開されているので下記ページからダウンロードし、インストールする。
https://jp.toshiba-memory.com/support/download/flashair/software/we/software02.htm

初設定はiOS/Androidアプリだけでも行えるようだけど、PC/Mac用のソフトを入れた。

#FlashAirの設定
購入直後のFlashAirは電源を投入するとWiFiの基地局として振る舞う。
FlashAirをPC/Macに挿入し、FlashAir™設定ソフトウェアを使ってWiFi基地局の設定（SSID/パスワード）を行う。

# スマホアプリのインストール
iOS/Android用のアプリ「FlashAir」をインストールする。

# スマートフォンからFlashAirにWiFi接続する
FlashAirをカメラに挿入して電源を入れる。
スマートフォンからWiFi基地局としてのFlashAirに接続する。
上記で設定したWiFi基地局としてのFlashAirのSSID/パスワードを使用する。

# スマホアプリを使ってFlashAir内の写真を確認する。
FlashAirを挿入したカメラで何枚か写真を撮影する。
スマホアプリから写真を確認できる。
これで一通り試すことができた。
Ubuntuでrsync(lsync)を利用する際のエラー

Ubuntuでlsyncやrsyncを利用する際に吐かれたエラーのメモ。
なぜこうもわかりにくいのか。

# エラーと原因と対策

## protocol version mismatch

### エラー
```bash
protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(176) [sender=3.1.1]
Sat Aug 25 16:14:26 2018 Error: Failure on startup of "/var/keys/".
```

### 原因
- rootで作業しようとしてた
    - ubuntuはrootログイン禁止なのでコケていた

### 対策
- ubuntuユーザで作業するよう修正

## Host key verification failed.

### エラー
```bash
Host key verification failed.
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.1]
Sat Aug 25 16:54:01 2018 Error: Temporary or permanent failure on startup of "/var/keys/". Terminating since "insist" is not set.
```

### 原因
- known_hostに接続対象のサーバの設定が足りていなかった

### 対策
- known_hostを無視するため`-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no`をオプションに追加。

lsync設定ファイルの例:

```json
...

sync {
    default.rsync,
    source="/tmp/foo",
    target="ubuntu@target_server:/tmp/foo",
    delete=false,
    rsync = {
        rsh = "/usr/bin/ssh -i /home/ubuntu/.ssh/pkey -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"
    }
}
```

# 環境
- ubuntu: `16.4 LTS`
    - `Linux ip-10-1-0-5 4.4.0-1057-aws #66-Ubuntu SMP Thu May 3 12:49:47 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux`
- rsync: `version 3.1.1  protocol version 31`
- lsync: `2.1.5`
Retrofitを使って複雑なPOSTをする

## Multipartで画像と多次元配列を投げたい
Multipartで画像を投げるだけなら簡単ですが、画像と一緒に `params[][hoge_id]=1&params[][hoge_name]=aaa` みたいな可変長なクエリを投げるとなると方法がわからなかったので、調べた結果をメモします。

## 結論：OkHttpで書いてRequestBodyを渡せば良い
いきなり結論ですが、OkHttpを使ったコードを書いて作ったRequestBodyを渡すことで解決しました。コードはこんな感じです

* Retrofitのインターフェース

```kotlin

    @POST("items")
    fun postItem(@Header("Authorization") token: String, @Body body: RequestBody): Single<Item>

```

* APIを呼ぶ側のコード

```kotlin
        val boundary = System.currentTimeMillis().toString()
        val imageMedia = MediaType.parse("image/png")
        val builder = MultipartBody.Builder(boundary).apply {

            setType(MultipartBody.FORM)

            addFormDataPart("image", "image.png", RequestBody.create(imageMedia, image))

            params.forEach {
                addFormDataPart("params[][hoge_id]", it.id.toString())
                addFormDataPart("params[][hoge_name]", it.name)
            }
        }

        api.postItem(
                body = builder.build(),
                token = getToken()
        )

```

## まとめ
そんなに頻繁に使わないのですが、よく忘れるのでメモ。
クエリでListとMapが入れ子になるような場合は、このやり方を使うのが一番楽な気がしてます。もっと良い方法があれば教えていただけると嬉しいです。
【VSCode tips】統合ターミナル開始時に Python 仮想環境(venv) に入る【#2】

# 統合ターミナル開始時に Python 仮想環境(venv) に入る

## ゴール

統合ターミナル(Ctl + Shift + ‘)を開いたときに、`activate` コマンドを自動実行する

## 環境

* Visual Studio Code
* Python 3 or 2
* virtualenv or venv
* Pythonプラグイン(Microsoft)

## Python 仮想環境を用意する

これができる人が対象なので、詳しくは説明しない。

```bash:Python仮想環境の構築
# venvを使う場合
$ python -m venv envs

# virtualenvを使う場合
$ virtualenv envs
```

なお、Pythonのプラグインは仮想環境が入ったディレクトリの名前を `envs` にしておくと、
VSCode側は実行ファイルのパスなど、仮想環境を認識してくれるようである。

## シェル起動時にスクリプトを自動実行する方法を調べる

ここで`シェル`が示す対象は`統合ターミナル`ではなく、`bash`や`powershell`などのシステム（OS)のシェルである。

統合ターミナルはこれらのシステムのシェルを使用している。
これらのシェルを起動する際には、任意のコマンドまたはスクリプトを実行する事ができるオプションを持っているため、このオプションを指定して、シェル起動時に `activate` / `activate.bat` / `Activate.ps1` を実行するように設定するとよい。

シェル別のオプションは以下である。

### OSX / Linux

```console:bash
$ /bin/bash --rcfile <仮想環境へのPATH>/bin/activate`
```

ただし、`${HOME}/.bashrc` が読み込まれなくなってしまう点に注意しなければならない。

### Windows

```console:コマンドプロンプト
$ cmd /k <仮想環境へのパス>/Scripts/activate
```

```console:PowerShell 
$ powershell -NoExit -Command <仮想環境へのパス>/Scripts/Activate.ps1
```

## ワークスペースの設定に追加する

統合ターミナルが起動するときに調べておいたコマンドを実行するようVSCodeの設定に追加する。ショートカットからでも表示は可能だが、画面左下の歯車マークをクリックして、`設定` を選択するのが簡単であろう。

![スクリーンショット 2018-08-26 01.17.00.png](https://qiita-image-store.s3.amazonaws.com/0/133372/76ce656e-4b5b-e30c-bf17-d432421c0b26.png)

次に、`ワークスペースの設定` タブを選択する。
デフォルトでははじめに`ユーザ設定`が選択されているが、`ユーザ設定`はユーザグローバルに設定が反映される。追加すると、これ以外に使用するプロジェクトすべてに適用されてしまうので注意が必要である。

`ワークスペースの設定`を選択したら、環境に応じて次を追記する

```json:OSX/bashの場合
{
  "terminal.integrated.shellArgs.osx": [
    "--rcfile", "<仮想環境へのパス>/bin/activate"
  ]
}
```

```json:Linux/bashの場合
{
  "terminal.integrated.shellArgs.linux": [
    "--rcfile", "<仮想環境へのパス>/bin/activate"
  ]
}
```

```json:コマンドプロンプトの場合
{
  "terminal.integrated.shellArgs.windows": [
    "/k", "<仮想環境へのパス>/Scripts/activate"
  ]
}
```

```json:PowerShellの場合
{
  "terminal.integrated.shellArgs.windows": [
    "-NoExit", "-Command", "<仮想環境へのパス>/Scripts/activate"
  ]
}
```

追記したら、保存する。
このあと、VSCodeを再起動する必要はない。

## 確認

`Ctrl + Shift + ‘` を押して、統合ターミナルを起動する。
次のように、プロンプトの先頭に`(envs)` などが表示されれば成功である。

以下はOSXでの例である。
![スクリーンショット 2018-08-26 02.28.25.png](https://qiita-image-store.s3.amazonaws.com/0/133372/a98c072d-481a-bfaf-d1a0-e443787ed2fb.png)
UIBarButtonItemにTintColorではなくオリジナルの画像を表示する


UIBarButtonItemに画像を設定しても色がTintColorに依存してしまう

オリジナルの画像を表示したい場合は

```ViewController.swift
barButtonItem.image = image.withRenderingMode(.alwaysOriginal)
```

でオリジナルの画像がでる
push先でtabbarをhiddenにしたらtabbar分のスペースが残った件


pushで遷移するときにtabbarを消したのだけどそのtab分のスペースが残ってしまった。


![スクリーンショット 2018-08-26 1.56.09.png](https://qiita-image-store.s3.amazonaws.com/0/97817/31b4b2b2-00a0-358c-9360-079a590f96b6.png "スクリーンショット 2018-08-26 1.56.09.png")
Toolbarの下にtabbr分のスペースが残ってる

##解決策

bottomのConstraintsがSafeAreaについているのが原因

![スクリーンショット_2018-08-26_2_05_51.png](https://qiita-image-store.s3.amazonaws.com/0/97817/664fb29e-7f96-0ad4-25ea-f388a5756dc9.png "スクリーンショット_2018-08-26_2_05_51.png")

ここをダブルクリック

![スクリーンショット_2018-08-26_2_06_09.png](https://qiita-image-store.s3.amazonaws.com/0/97817/e914bf40-3ad7-1304-f591-0d9801047eb9.png "スクリーンショット_2018-08-26_2_06_09.png")

制約をSuperViewに変更

![スクリーンショット 2018-08-26 2.06.45.png](https://qiita-image-store.s3.amazonaws.com/0/97817/b4e8a2b0-81d5-aedc-f578-923c2ae50de2.png "スクリーンショット 2018-08-26 2.06.45.png")

これで直った！
mkdir と cd を同時にやるために独自のコマンドを追加した

# はじめに
ターミナルで、mkdirを実行して空のフォルダを作成したあと、そのフォルダに移動するためcdを実行することがけっこうあると思います。
本稿ではmkdirとcdを同時に行うコマンドを追加する方法について書いていきます。
似たような記事がけっこう見受けられますが、丁寧めに説明したいと思います。
# 環境
- macOS High Sierra 10.13.3

# 方法
.bashrc というファイルを作成して編集、保存することで独自のコマンドを追加します。

- ターミナルを起動します。
- ターミナルで`vim ~/.bashrc`を実行しホームディレクトリに.bashrcファイルを作成します。画像のような画面になると思います。<img width="682" alt="スクリーンショット 2018-08-26 1.30.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/107152/50f29d0a-68ec-b2bd-dc69-cb0e20ee92da.png">
- すでに .bashrcファイルの編集ができる状態です。ここでは"mkcd"という名前のコマンドを追加するため以下のコードを記述してください（任意の名前に変更してもかまいません）。

```bash
function mkcd {
  if [ ! -n "$1" ]; then
    echo "Enter a directory name"
  elif [ -d $1 ]; then
    echo "\`$1' already exists"
  else
    mkdir $1 && cd $1
  fi
}
```
- 記述したら`:wq`と打ってEnterを押します（":wq"は編集内容を保存して操作を終了するコマンドです）。
- macOSのデフォルトでは、ホームディレクトリに.bashrcを作成してもターミナル起動時に読み込むようになっておらず、このままでは追加したコマンドは使えません。自動で読み込ませるために、再びターミナルで`vim ~/.bash_profile`を実行します。ホームディレクトリに.bash_profileが作成されるので、これまでと同様に以下のコードを記述して保存（`:wq`）してください。

```bash

if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi
```
- これで mkcd というコマンドが追加できました。試しに`mkcd test`を実行するとtestフォルダが作成＆フォルダ先に移動していると思います。<img width="682" alt="スクリーンショット 2018-08-26 1.17.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/107152/a046671f-84a0-3afc-ed34-df2d3cf54039.png">

以上です。

#参考
[Made a custom terminal command](https://medium.com/@miqdadamirali/made-a-custom-terminal-command-3e1bbfbf2013)
[Is there a shortcut to mkdir foo and immediately cd into it?](https://superuser.com/questions/152794/is-there-a-shortcut-to-mkdir-foo-and-immediately-cd-into-it/152801)
[ターミナル起動時に.bashrcを読み込むようにする](http://blog.ruedap.com/2010/09/13/mac-bash-bashrc)
windows10　キッティングコマンド

スクリーンセーバー設定　にログオン画面にログオン画面に戻るにチェックつけない
reg add “HKEY_CURRENT_USER\Control Panel\Desktop” /v “ScreenSaverIsSecure” /t REG_SZ /d “0” /f

スクリーンセーバー設定　再開時にログオン画面に戻るにチェックつける
reg add “HKEY_CURRENT_USER\Control Panel\Desktop” /v “ScreenSaverIsSecure” /t REG_SZ /d “1” /f

この接続のアドレスをDNSに登録する(ipv4)無効
netsh interface ipv4 set dnsservers name="イーサネット" source=dhcp register=none

コンピュータをスリープ状態にする無効(電源接続時)
powercfg -x standby-timeout-ac 0

全ネットワークアダプタipv6無効
powershell
Get-NetAdapterBinding | ? {\$_.DisplayName -match 'ipv6'} | Set-NetAdapterBinding -Enabled $false

rem ディスプレイの電源を切る無効(電源接続時)
powercfg -x monitor-timeout-ac 0

rem コンピュータをスリープ状態にする無効(電源接続時)
powercfg -x standby-timeout-ac 0

ipv6無効のpowershellをバッチファイルで実行
@(echo '> NUL
echo off)
NET SESSION > NUL 2>&1
IF %ERRORLEVEL% neq 0 goto RESTART
setlocal enableextensions
set "THIS_PATH=%~f0"
set "PARAM_1=%~1"
PowerShell.exe -Command "iex -Command ((gc \"%THIS_PATH:`=``%\") -join \"`n\")"
exit /b %errorlevel%
:RESTART
powershell -NoProfile -ExecutionPolicy unrestricted -Command "Start-Process %~f0 -Verb runas"
exit
') | sv -Name TempVar

Get-NetAdapterBinding | ? {    \$_.DisplayName -match 'ipv6'} | Set-NetAdapterBinding -Enabled $false
Get-NetAdapterBinding
pause
php-master-changes 2018-08-25

# 2018-08-25
## petk: Replace HAVE_ST_BLOCKS with HAVE_STRUCT_STAT_ST_BLOCKS
- https://github.com/php/php-src/commit/3ceecaa9a014c0990c49bd2db1dc16db01254e4b
- HAVE_ST_BLOCKS を HAVE_STRUCT_STAT_ST_BLOCKS に置き換え
- autoconf 2.50 以降では AC_STRUCT_ST_BLOCKS が HAVE_ST_BLOCKS　にかわって HAVE_STRUCT_STAT_ST_BLOCKS を定義
- PHP 5.3 は autoconf 2.13 以降を要求、 PHP 5.4 から 2.59 以降を要求

## petk: Remove Doxygen configuration
- https://github.com/php/php-src/commit/7b39e8a338d5e74c6f2c52a8f54b1a0acc01cde5
- ext/spl 用の Doxygen の 設定を削除
- かつて SPL のドキュメントは [http://www.php.net/~helly/php/ext/spl/](https://web.archive.org/web/20131015174703/http://www.php.net/~helly/php/ext/spl/) にあり、後に [PHP マニュアルの方](http://php.net/manual/ja/book.spl.php)へ移った
- [先日](https://qiita.com/sj-i/items/0cb8e791d4a2e7f3a2c0#carusogabriel-drop-splinternal-documentation)ドキュメント用のコード自体も一通り削除されたので、もうこの設定ファイルもいらないですねという話っぽい

## petk: Remove some old parts of the php
- https://github.com/php/php-src/commit/fcf4088d3fe27a3c950985afc49af1064c54b024
- [こんな流れ](https://github.com/php/php-src/commit/c0ef58e9fe78e9d982d48983386763f9d34088bb#commitcomment-29801530)があり、 phpt 生成ツール用のコードが使われてなさそうだったので[削られ](https://github.com/php/php-src/commit/ba138a3746b3077ebe5b7356b5b49f21cfc30438)、今回微妙に残っていたファイルを消した

## cmb69: Fix [#76712](https://bugs.php.net/bug.php?id=76712): Assignment of empty string creates extraneous text node
- https://github.com/php/php-src/commit/692e5d5c88a939a7c3ce3de61c5fd39effe7c7ae
- ext/simplexml で、ノードを追加した時点で内容を空文字列にしておくのと、ノードの追加後に空文字列を代入した場合で、出力される XML での空要素の表現が異なる問題の回避
- \<foo>\</foo> なのか \<foo /> なのか的な
- 下層の libxml の API に根があるっぽい

## cmb69: Fix [#53891](https://bugs.php.net/bug.php?id=53891): iconv_mime_encode() fails to Q-encode UTF-8 string
- https://github.com/php/php-src/commit/eb03290754105dbefeb5a3d75c20e504cd82715b
- ext/iconv で、[iconv_mime_encode()](http://php.net/manual/ja/function.iconv-mime-encode.php) が UTF-8 文字列で [Q-encode](https://www.wdic.org/w/WDIC/Q%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89) に失敗する問題の修正

## cmb69: Fix [#55146](https://bugs.php.net/bug.php?id=55146): iconv_mime_decode_headers() skips some headers
- https://github.com/php/php-src/commit/6e1980e1520306cc5ec7109ccb3d7c8a0a672689
- ext/iconv で、[iconv_mime_decode_headers()](http://php.net/manual/ja/function.iconv-mime-decode-headers.php) が LF だけで区切られたヘッダをスキップする問題の修正

## cmb69: Fix [#63839](https://bugs.php.net/bug.php?id=63839): iconv_mime_decode_headers function is skipping headers
- https://github.com/php/php-src/commit/8754d44167d95a381c9c60beeb26492f4176fe1c
- ext/iconv で、[iconv_mime_decode_headers()](http://php.net/manual/ja/function.iconv-mime-decode-headers.php) が =? を Subject に含むヘッダをスキップする問題の修正