OmniAICreator/Qiita-1.07M huggingface dataset:
Ionicで動画のインライン再生するならconfig.xmlにも追記が必要

iOS10から動画のインライン再生ができるようになりました。

ただし、Ionicの場合は `config.xml`に以下の記述が必要です。忘れやすいので気をつけましょう。

```config.xml
<preference name="AllowInlineMediaPlayback" value="true" />
```
※https://cordova.apache.org/docs/ja/3.1.0/guide/platforms/ios/config.html

videoタグにはplayinlineを書きましょう

```html
 <video 
       muted
       src="<動画のURL>" 
       poster="<サムネのURL>" 
       webkit-playsinline
       playsinline
       autoplay>
</video>
```

無音(muted)だと自動再生もされるようになります。
噂によると動画の音声トラックがないのも条件らしい(未確認)

ちなみに省電力モードだと自動再生されないので、背景動画等コントローラーなしで使う時はお気をつけて（動画を再生する手段がなくなります)
Pythonを初めて触ってみたメモ(文字列編)

## はじめに
文字列の操作についてまとめました。

## 基本操作
### 初期化
文字列は`''`で囲うことで認識される。
変数を初期化するときは`(変数)='(文字列)'`と記述する。

~~~ python
>>> s = 'test'
>>> s
'test'
>>> print(s)
test
~~~

### インデックス
文字列のインデックスは`(文字列)[番号]`で表示できる。
番号は0番目からスタートする。

~~~ python
# testの2文字目を表示する
>>> 'test'[1]
'e'
# 変数sの2文字目を表示する
>>> s = 'apple'
>>> s[1]
'p'
~~~

インデックスは負の数も指定できる。負の数は後ろから1、2、...と順番付けされる。

~~~ python
# 文字列'test'のうしろから1番目、2番目を表示する
>>> 'test'[-1]
't'
>>> 'test'[-2]
's'
# 変数sのうしろから1番目、2番目を表示する
>>> s = 'apple'
>>> s[-1]
'e'
>>> s[-2]
'l'
~~~

### 連結
- 文字列は`+`で連結することができる。

~~~ python
# 2つの文字列を連結する
>>> 'hot' + 'dog'
'hotdog'
# 文字列を持つ変数2つを連結する
>>> s = 'hot'
>>> t = 'dog'
>>> s + t
'hotdog'
~~~

- 文字列を繰り返し連結するときは`*`を使用する。

~~~ python
>>> 'b' + 'e'*2 + 'r'
'beer'
~~~

### スライス
スライスとは文字列の連続した一部を抜き出すということ。

例えば`apple`という文字列だと、以下のようになる。
インデックスの順番と数え方が異なるため、注意する必要がある。

||a||p||p||l||e||
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|↑||↑||↑||↑||↑||↑||
|0||1||2||3||4||5||

~~~ python
# appleの1文字目と2文字目を表示する
>>> 'apple'[0:2]
'ap'
# appleの4文字名以降を表示する
>>> 'apple'[3:]
'le'
# appleの3文字目までを表示する
>>> 'apple'[:3]
'app'
~~~

### ステップ
元の文字列から、いくつか飛ばした文字列を作成する場合はステップを使用する。

~~~ python
# 1文字目を表示する
>>> 'あいうえおかきくけこさしすせそ'[0]
'あ'
# 11文字目を表示する
>>> 'あいうえおかきくけこさしすせそ'[10]
'さ'
# 1文字目から14文字目まで5つ飛ばしで表示する
>>> 'あいうえおかきくけこさしすせそ'[0:14:5]
'あかさ'
# 4文字目から14文字目まで5つ飛ばしで表示する
>>> 'あいうえおかきくけこさしすせそ'[3:14:5]
'えけせ'
~~~

### 文字列の長さを数える
文字列の長さを取得するときは`len()`を利用する。

~~~ python
>>> len('apple')
5
# 空白もカウントされる
>>> len('I like apple.')
13
~~~

### 定型文に文字列を差し込む(format)
定型文に同じ文字列を挿入したい場合は関数`format`を使用する。
formatは関数であり、関数は`(変数名).(関数名)(引数)`で呼び出すことができる。

~~~ python
# {}でformatで使用する部分を指定できる
>>> s = '{}は「{}」の呪文を唱えた'
# {}には引数が順番に挿入される
>>> s.format('シンドバット', 'ひらけごま')
'シンドバットは「ひらけごま」の呪文を唱えた'

# 引数の番号を指定することができる
>>> s = '{0}は「{1}」の呪文を唱えた。{0}は{3}にダメージ{2}を与えた。'
>>> s.format('プレイヤー','ファイアボール','2000','スライム')
'プレイヤーは「ファイアボール」の呪文を唱えた。プレイヤーはスライムにダメージ2000を与えた。'
~~~

### 置換
文字列を何か別の文字列に置換したいときは関数`replace`を使用する。

~~~ python 
>>> name = '佐藤 田中 鈴木 佐藤 伊藤'
# 佐藤を山本に置換する
>>> name.replace('佐藤','山本')
'山本 田中 鈴木 山本 伊藤'
# 半角スペースをカンマと半角スペースに置換する
>>> name.replace(' ',', ')
'佐藤, 田中, 鈴木, 佐藤, 伊藤'
~~~
【Python】pickle読み書き

```py

model = []  # pickleするもの
file_name = "model.pickle"
```

#書き込み

バイナリで保存

```py

with open(file_name, mode='wb') as f:
    pickle.dump(model, f)
```

#読み込み
バイナリで保存されたものを読み込み

```py
with open(file_name, mode='rb') as f:
    model = pickle.load(f)
```
NETGEAR アンマネージプラス・スイッチ向けPrometheus Exporter

# はじめに
NETGEARのスイッチには普通のアンマネージスイッチにVLANなどいくつかの機能を追加したアンマネージプラスというカテゴリがあります。
ただ残念ながらSNMPは追加されていないので、そのままではPrometheusで監視することはできません。
しかし、同社製のProSAFE Plusというユーティリティソフトを使うとポート毎の送受信データ量などが取れるので、同じプロトコルをしゃべるPrometheus Exporterを実装してみました。

ちなみにProSAFE Plusのプロトコルは[ProSafeLinux](https://github.com/tabacha/ProSafeLinux)を参考に実装しました。こちらはPython製のコマンドラインツールで、すでに開発停止状態ですが、たいだいの機能は網羅されているようです。

# 使い方

[prosafe_exporter](https://github.com/dalance/prosafe_exporter)

上記サイトの[リリースページ](https://github.com/dalance/prosafe_exporter/releases)からバイナリをダウンロードできます。
Exporter側の設定は待ち受けポート設定だけで、デフォルトのままなら引数不要です。

```console
$ prosafe_exporter --web.listen-address=":9493"
```

接続するスイッチの設定は[SNMP exporter](https://github.com/prometheus/snmp_exporter)と同様に、Prometheusサーバ側の設定で行います。

```prometheus.yml
- job_name: 'prosafe'
  static_configs:
      - targets: ['switch1:eth0', '192.128.0.100:enp1s0'] # 対象スイッチ (形式は 'hostname:NIC名')
  metrics_path: /probe
  relabel_configs:
    - source_labels: [__address__]
      target_label: __param_target
    - source_labels: [__param_target]
      target_label: instance
    - target_label: __address__
      replacement: 127.0.0.1:9493 # prosafe_exporterのhostname:port
```

少し変わっているのが`targets`設定で、`hostname:NIC名`という形式です。これは「ProSAFE Plusが接続に使うNICはスイッチと同一サブネットになければならない」という制限がある（と思われる）ためです。そのため接続先のホスト名（あるいはIPアドレス）と接続に使うNIC名というペアで指定するようにしています。
スイッチのIPアドレスがわからない場合はProSAFE Plusユーティリティで設定しましょう。

# メトリクス

現時点では以下のメトリクスを実装しています。

| metric                       | description                        | labels                         |
| ---------------------------- | ---------------------------------- | ------------------------------ |
| prosafe_up                   | The last query is successful       |                                |
| prosafe_receive_bytes_total  | Incoming transfer in bytes         | port                           |
| prosafe_transmit_bytes_total | Outgoing transfer in bytes         | port                           |
| prosafe_error_packets_total  | Transfer error in packets          | port                           |
| prosafe_link_speed           | Link speed in Mbps                 | port                           |
| prosafe_build_info           | prosafe_exporter Build information | version, revision, rustversion |

# 動作確認

以下のスイッチで確認しています。

- XS708E
- GS108Ev3
- GS105Ev2

リンク速度は10Gbpsまで対応していますが、2.5Gbpsや5Gbpsは実機がないので未実装（リンク速度0扱い）です。
ニワトリが先かタマゴが先かを確認する

# はじめに
先日、下記のツイートを見つけました。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Wel that settles that. 😂 <a href="https://t.co/0xHvS8Dply">pic.twitter.com/0xHvS8Dply</a></p>&mdash; allie, 🎃 the spookiest 👻 transbian 💀 (@aBagorn) <a href="https://twitter.com/aBagorn/status/1051286652663025664?ref_src=twsrc%5Etfw">October 14, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# やってみる
## Python
[Google Colaboratory](https://colab.research.google.com/) ならPythonが使える。
![ニワトリタマゴ.png](https://qiita-image-store.s3.amazonaws.com/0/14053/5d7f63e1-b71f-d000-465c-abb866d999f5.png)

```python
sorted(['🥚', '🐔'])
['🐔', '🥚']
```

結果はニワトリが先となった。

## Javascript
ChromeのF12キーでConsoleを使えば、Javascriptが使える。
![ニワトリタマゴ2.png](https://qiita-image-store.s3.amazonaws.com/0/14053/fd5c3b16-1ab8-c962-36aa-56f9f8d6bb27.png)

```javascript
['🥚', '🐔'].sort()
▶(2) ['🐔', '🥚']
```

結果はニワトリが先となった。

## CSharp
[CodingGround](https://www.tutorialspoint.com/codingground.htm) はオンライン上で様々なプログラム言語が使えるサイトである。ここで「C#」を選択した。

![ニワトリタマゴ3.png](https://qiita-image-store.s3.amazonaws.com/0/14053/0781cd54-6670-906f-7a3f-c60b314dcadc.png)

```CSharp
using System.IO;
using System;

class Program
{
    static void Main()
    {
        string[] ary = new string[] {"🥚", "🐔"};
        Array.Sort(ary);
        foreach(var s in ary){
            Console.Write(s);
        }
    }
}
```

結果はタマゴが先となった。うーむ・・・、教えて偉い人

【2018/10/18追記】
Visual StudioのC#6.0上では、ニワトリが先になりました。Mono環境が古いからかな。


# 理由
文字コードでニワトリが先に登録されているからです。~~C#の結果は失敗ですけど。~~

|Unicode|絵文字|名前|採用|
|:--|:--|:--|:--|
|U+1F414|🐔|にわとり(chicken)|Unicode 6.0(2010)|
|U+1F95A|🥚|たまご(egg)|Unicode 9.0(2016)|

## 漢字
ちなみに漢字だとどうなるか、日本語と中国語でやってみました。

```javascript
['卵', '鶏'].sort()
▶(2) ["卵", "鶏"]
['蛋', '鸡'].sort()
▶(2) ['蛋', '鸡']
```
結果はどちらでもタマゴが先となります。

# 最後に
これがいわゆるゴミ記事ってやつですね。
【Tips】rbenvでRuby2.4.0未満をインストールしようとしたときに発生するエラーへの対処

# 問題：Rubyインストールにおけるエラー
## 入力
```shell
rbenv install 2.2.5
```
## 出力
```shell
Downloading ruby-2.2.5.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.5.tar.bz2
Installing ruby-2.2.5...

WARNING: ruby-2.2.5 is past its end of life and is now unsupported.
It no longer receives bug fixes or critical security updates.


BUILD FAILED (Ubuntu 18.04 using ruby-build 20180618-5-gad8f3a4)

Inspect or clean up the working tree at /tmp/ruby-build.20181018001254.16775
Results logged to /tmp/ruby-build.20181018001254.16775.log

Last 10 log lines:
../../internal.h:84:30: warning: this use of "defined" may not be portable [-Wexpansion-to-defined]
linking shared-object objspace.so
make[2]: ディレクトリ '/tmp/ruby-build.20181018001254.16775/ruby-2.2.5/ext/objspace' から出ます
linking shared-object date_core.so
make[2]: ディレクトリ '/tmp/ruby-build.20181018001254.16775/ruby-2.2.5/ext/date' から出ます
linking shared-object nkf.so
make[2]: ディレクトリ '/tmp/ruby-build.20181018001254.16775/ruby-2.2.5/ext/nkf' から出ます
make[1]: ディレクトリ '/tmp/ruby-build.20181018001254.16775/ruby-2.2.5' から出ます
uncommon.mk:189: recipe for target 'build-ext' failed
make: *** [build-ext] Error 2
```

# 環境
- Lubuntu 18.04 LTS
- anyenv
    * rbenv 1.1.1-37-g1c772d5

# 原因：OpenSSLの対応バージョン
Rubyの2.3台まではOpenSSLの1.1に未対応。

# 解決方法：OpenSSLのダウングレード
```shell
sudo apt install libssl1.0-dev
rbenv install 2.2.5
```

# 補足
## 1. その他の原因
openssl以外でRubyのビルドに必要なものがインストールされていない場合も上記と類似したエラーメッセージが表示される。
必要インストールについては[こちら](https://www.tmp1024.com/programming/rbenv-install)を参照。
## 2. 事後処理
OpenSSL1.0をインストールすることでOpenSSLがダウングレードしてしまう。
Rubyのインストールが無事終了したら以下を実行。

```shell
sudo apt install libssl-dev
```

## 3. Pythonの場合
PythonにおいてもPython3系の3.5.3未満で同様の原因でエラーが発生する。
くわしくは[こちら](https://qiita.com/GandT/items/5adfc647a51ddda89237)の記事を参照。

# 参考文献
- [Ubuntu 18.04上においてruby-buildでruby 2.3.*をインストールする](https://arimasou16.com/blog/2018/04/30/00255/)
[メモ] NGINX Unit

Qiita: [nginx-unitに関する投稿](https://qiita.com/tags/nginx-unit)

---

[About — NGINX Unit](http://unit.nginx.org/)

- Mercurial repository: [unit: log](https://hg.nginx.org/unit)
- GitHub mirror: [GitHub \- nginx/unit: An official read\-only mirror of http://hg\.nginx\.org/unit/](https://github.com/nginx/unit)


![](https://www.nginx.com/wp-content/uploads/2017/09/dia-FM-2018-04-11-what-is-nginx-unit-01_1024x725.png)

NGINX Unit In-Depth Demo - YouTube
https://www.youtube.com/watch?v=I4IWEz2lBWU


---


NGINX Unit が正式リリースされたので触ってみる
https://qiita.com/suzu2469/items/c36a4cd55073ca8b9268

NGINX Unitが正式リリース。PHP、Go、Pythonなどに対応した軽量アプリケーションサーバ － Publickey
https://www.publickey1.jp/blog/18/nginx_unitphpgopython.html

軽量アプリケーションサーバ NGINX Unitを触ってみる | GMOアドパートナーズグループ TECH BLOG byGMO
https://techblog.gmo-ap.jp/2017/11/20/%E8%BB%BD%E9%87%8F%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%90-nginx-unit%E3%82%92%E8%A7%A6%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/

NGINX社から公式リリースされた"NGINX Unit"ってどんな代物か、試してみる - bitA Tech Blog
https://tech.bita.jp/article/21
CentOS7でPHPからMySQLへの接続に手間取るの巻

CentOS7でWordpressを構築していた時にDB接続で躓いたので記録しておく。

## TL;DR

- `php-mysql` ではなく `php-mysqlnd` を使う
- MySQL 8.x のデフォルト文字コードを従来の物に戻す

```
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
collation-server = utf8_unicode_ci
character-set-server = utf8
```

- MySQL 8.x のデフォルト認証形式を従来の物に戻す

```
[mysqld]
default_authentication_plugin = mysql_native_password
```


## 事の起こり: PHPとMySQLのバージョンの齟齬問題

- PHPは `yum` で入れた `5.4.16`
- MySQLは、[MySQL公式のyumリポジトリ](https://dev.mysql.com/downloads/repo/yum/)で入れた `8.0.12`
- Wordpress は事情により `4.7.11`

以上をインストールしてアクセスしてみたところ、次のエラーが出た。

```
mysqli::real_connect(): Headers and client library minor version mismatch. 
```

エラーが出る意外は正常に動作している。もっと言えば、`WP_DEBUG_DISPLAY` が false ならばエラーに気付きすらしない。だが気持ち悪い。

少し調査したところ、PHPとMySQLのバージョン違いに起因するとの事だった。しかしながら、MySQLを入れ直すのも億劫だった小生は、`php-mysql` ではなく `php-mysqlnd` を使えば良いという情報を仕入れてその様にしてみる。当然の事ながらこの２つは競合するので、先に `php-mysql` を削除してから `php-mysqlnd` を導入する

```
$ yum remove -y php-mysql
$ yum install -y php-mysqlnd
$ systemctl restart httpd.service
```

これで解決！と思いきや勿論そんな事はなく、別の刺客が現れるのであった。

## MySQLの文字コード問題

次に出てきたエラーはこれだ。

```
mysql_connect(): Server sent charset (255) unknown to the client.
```

「MySQLのやつがよくわからん文字コードで返してきた」などと云っている様だ。もはやこれは接続に失敗しているので、当然 Wordpress は正常に動作しない。つまり状況は悪化していると言える。

調べてみると、MySQLのバージョン8からデフォルトの文字コードが `utfmb4` に変更されたらしい。その為、クライアントであるPHPと会話が出来ていないのだろう。そうであるならば、MySQLのデフォルトの文字コードを修正してやれば動くはずである。

cf) [php \- PDO::\_\_construct\(\): Server sent charset \(255\) unknown to the client\. Please, report to the developers \- Stack Overflow](https://stackoverflow.com/questions/43437490/pdo-construct-server-sent-charset-255-unknown-to-the-client-please-rep)

`/etc/my.cnf` に次のように記述を追加して、

```
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
collation-server = utf8_unicode_ci
character-set-server = utf8
```

mysqld を再起動してやる。

```
$ systemctl restart mysqld.service
```

これで解決！と期待したが、やはりまだ刺客が隠れていた様だった。

## MySQLの認証形式問題

次のエラーはこれだ。

```
mysql_connect(): The server requested authentication method unknown to the client [caching_sha2_password]
```

「MySQLのやつが未知の認証方式を使ってて門前払いを食らった」などと云っている。

`caching_sha2_password` と言うのはMySQLバージョン8から追加された認証方式なので、PHP5.4側が追随できていないという事なのだろう。ここは従来の `mysql_native_password` を使って認証をする事にした。

`/etc/my.cnf` の `[mysqld]` セクションに次のように追記しておく。

```
[mysqld]
default_authentication_plugin = mysql_native_password
```

そして再起動。

```
$ systemctl restart mysqld.service
```

これで解決！今度こそ解決！ Wordpress が正常に動作している事を確認できました。めでたし。
私のpecoコマンド履歴検索


zshで動きます。

``` sh
#-----------------------------------------#
# hs: inc search in command history
#-----------------------------------------#
function peco-history-selection() {
    print -z `\history -n 1 | tail -r | peco --prompt "[hs]"`
    CURSOR=$#BUFFER
}
alias hs="peco-history-selection"
```

# こだわっている点
## キーをトリガーにしない

ネットでは`C-r`とかのキーをトリガーにしているものがありますが、キーバインドの枯渇やmnemonicを考慮して`hs`のエイリアスコマンドにしている。

## そのまま実行しない

過去のコマンドの一部を変更して実行するのはよくあることなので、pecoで選択したときに実行せずに入力部分に表示した状態にする。
AWS勉強 -プライベートサブネットを構築する-

# プライベートサブネットを構築する

万全の対策をしていてもインターネットに繋いでる限り攻撃を受ける可能性が少しはある.
そこでセキュリティを高める方法として検討したいのがインターネットから隔離したプライベートサブネットだ.
データベースサーバーなどはインターネットから隔離したプライベートサブネットに配置することで安全性を向上させることができる.

## プライベートサブネットの利点

前章までで作成してきたWebサーバーはインターネットからSSHやWebブラウザでアクセスできる.
しかし,データベースなどのバックエンドシステムはインターネットから直接接続して欲しくない.
隠したいサーバーは「インターネットから接続できないサブネット」に配置するようにする.
このようなサブネットをプライベートサブネットと呼ぶ.
プライベートサブネットを構築するとセキュリティが向上する.

## プライベートサブネットを作る

ここで作成するプライベートサブネットは「10.0.2.0/24」とする.

### アベイラビリティーゾーンを確認する

<img width="761" alt="スクリーンショット 2018-10-17 23.54.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/c4b6ae9b-4b6f-9499-d274-315bf84697a7.png">

環境(ゾーン)によって次からの説明を読み替えましょう.

### プライベートサブネットを作る

<img width="785" alt="スクリーンショット 2018-10-17 23.58.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/1179a176-59e8-7ef7-2764-0b53f69ee329.png">

からの,

<img width="784" alt="スクリーンショット 2018-10-18 0.03.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/206e58dc-7496-7783-44ba-a335d0defec3.png">

デフォルトの状態では「自身のネットワーク」に対してルーティングだけが設定されている.

<img width="790" alt="スクリーンショット 2018-10-18 0.11.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/d07fa633-26d4-9beb-cf12-9141b0bf7f29.png">

作成した「プライベートサブネット」にはこのルートテーブルが設定される.
この設定は「サブネット」メニューから確認できる.

<img width="796" alt="スクリーンショット 2018-10-18 0.15.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/b1973d2b-e36c-438f-6b17-a336dd76c7bb.png">

プライベートサブネットはインターネットに接続しないためデフォルトのルートテーブルのまま変更する必要がない.

## 感想

この本も後半に差し掛かったので全貌が見えてきた.
サブネット周りの理解が深まってきたと感じる.
iOS開発時　見逃しちゃった 細かいバグ集

アプリを開発してた時 or 他の人が開発しているアプリを見た時に、ぼけっとしていると見逃してしまいそうなiOS開発特有の細かいバグをピックアップしました。
今後の教訓として、活用していこうと思います。

# UITextField/UITextView
## 入力制限を実装した時
TextFieldの入力制限をdelegateで行った時に、外部キーボードから入力制限をした文字列が入力できてしまい、バグになった。
さらに、入力制限を行った->バリデーションが要らないということで、バリデーション処理を行っていなかったので、被害が拡大した。

ViewController以下のような外部キーボード無効化処理を入れると防げた。
そもそも、TextFieldの入力制限を完全に行うのは手間がかかるので、バリデーションをしっかりやったほうがいいと反省しました。

```objc
// BackKeyを無効化
- (NSArray *)keyCommands {
    return @[[UIKeyCommand keyCommandWithInput:@"\b" modifierFlags:0 action:@selector(description)]];
}
```

# GPS(CoreLocation)
## バッテリー周り
不用意にGPSを最高精度にしたため、バッテリーの減る速度が早くなった。

```objc
CLLocationManager *locationManager = [CLLocationManager new];
locationManager.desiredAccuracy = kCLLocationAccuracyBest; //不必要に精度を高くしない
```

# WebView
## ネットワーク エラー表示
Webページの読み込み失敗時にアラートを表示する仕様があるときに、
ページが表示しきる前に、次のページに遷移すると読み込み失敗時にアラートが表示されるバグが発生した。

次のページに遷移する時に、現在表示中のページ読み込みが読み込み失敗（=キャンセル）扱いになるので、エラーコードにNSURLErrorCancelledが指定されていた時は、無視するように実装すると、不必要なエラーアラートが表示されなくなった。

```objc
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
    if ([error code] != NSURLErrorCancelled) {
        //エラー処理
    }
}
```

# Photos.frameworkで画像取得/表示
## iCloud上のみにある画像の拡大表示
PHImageを使用して、iCloudで管理されている画像を表示する時、

- サムネイル : 端末内
- オリジナル画像 : iCloudのみ

の条件を満たす画像が、大きいサイズを指定した時に表示されないバグが発生した。
テストの時は、

- iCloudにしかないデータを使用してなかった
- サムネイルは問題なく表示されていた

ため、バグに気づかなかった。

PHImageRequestOptionsを生成する時に、networkAccessAllowedをYESにすれば、PHImageが勝手にiCloudから取得してきてくれます。

```objc
PHImageRequestOptions *requestOptions = [PHImageRequestOptions new];
requestOptions.resizeMode   = PHImageRequestOptionsResizeModeExact;
requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;
requestOptions.synchronous = NO;
requestOptions.networkAccessAllowed = YES;

[[PHImageManager defaultManager] requestImageForAsset:asset
                                           targetSize:PHImageManagerMaximumSize
                                          contentMode:PHImageContentModeDefault
                                              options:requestOptions
                                        resultHandler: ^(UIImage *image, NSDictionary *info){
    // 取得したimageを反映
}];
```

resizeMode・deliveryModeについては、以下のスライドがわかりやすかったです。
https://www.slideshare.net/kanamenoto/photos-vs-assets-library-photosframework
*.csvのファイル名の展開方法をスタック・オーバーフローで教えてもらった。

(参考)awkで複数ファイルの入力(指定)にアスタリスクが使えますか？
https://ja.stackoverflow.com/questions/49250/awk%e3%81%a7%e8%a4%87%e6%95%b0%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e5%85%a5%e5%8a%9b%e6%8c%87%e5%ae%9a%e3%81%ab%e3%82%a2%e3%82%b9%e3%82%bf%e3%83%aa%e3%82%b9%e3%82%af%e3%81%8c%e4%bd%bf%e3%81%88%e3%81%be%e3%81%99%e3%81%8b

(内容)
ファイル名を1行で羅列します。

(環境)
win7
paste (GNU coreutils)5.3.0

ファイル名2個
csv1.csv
csv2.csv

(実行方法)
dir *.csv /b | paste -s -d " " > txt.txt

(txt.txtの内容)
csv1.csv csv2.csv

(参考)こんな方法があったのか！ Windows用GNUコマンド群 「GNU utilities for Win32」 
http://orangeclover.hatenablog.com/entry/20100801/1280657002

(実行時の問題点)
標準出力したら「write error:invalid argument」がでるので、
標準出力をあきらめて, >txt.txt にした。、
「invalid argument が出て動作しない問題」があるそうです。

(感想)dirとawkの連続技もありました。
OpenBLASをRasPiZeroビルドしてみる

#概要
OpenBLAS を RasPiZeo 用にビルドしてみました。

#環境構築
今回は、何も考えず Docker を使用しました。

``` bash
docker pull ubuntu:18.04
docker run -w /root -it ubuntu bash
```

もちろん git と、ビルドに cmake が必要です。

``` bash
apt update
apt install -y git cmake
```

ツールチェインとOpenBLASをそれぞれ git clone します。

``` bash
git clone https://github.com/raspberrypi/tools
git clone https://github.com/xianyi/OpenBLAS.git
```

#ビルド
今回 RasPiZero 向けビルドのため、ターゲットは ARMV6 を指定、コンパイラはarm-linux-gnueabihf-gccを使用します。

``` bash
# cd OpenBLAS/
# make TARGET=ARMV6 HOSTCC=gcc CC=/root/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc
```

あまり大きなライブラリではないので、ビルド時間はあまりかからないはずです

"OpenBLAS build complete."と出力されればビルドは成功です。
念のため、生成物の中身を確認しておきましょう、

``` bash
readelf -A ./libopenblas_armv6p-r0.3.4.dev.so
```

```
Attribute Section: aeabi
File Attributes
  Tag_CPU_name: "6"
  Tag_CPU_arch: v6
  Tag_ARM_ISA_use: Yes
  Tag_THUMB_ISA_use: Thumb-1
  Tag_FP_arch: VFPv2
  Tag_ABI_PCS_wchar_t: 4
  Tag_ABI_FP_denormal: Needed
  Tag_ABI_FP_exceptions: Needed
  Tag_ABI_FP_number_model: IEEE 754
  Tag_ABI_align_needed: 8-byte
  Tag_ABI_enum_size: int
  Tag_ABI_HardFP_use: Deprecated
  Tag_ABI_VFP_args: VFP registers
  Tag_ABI_optimization_goals: Aggressive Speed
  Tag_CPU_unaligned_access: v6
  Tag_DIV_use: Not allowed
```

以上でビルドは完了です。お疲れさまでした。
laravelでHello World

PHPで人気のlaravelを使ってみます。

##1.環境

php, composer, laravelのインストールは完了しているものとします。

| 　     |  version              |
|:-------|:---------------------:|
| os     | windows10 64bit home　|
| php    |  7.2.10 |
| Laravel| 5.7.9 |

##2.Hello Worldの構築

###(1)プロジェクトを作成する。

```
composer create-project laravel/laravel helloworld
```

###(2)プロジェクトフォルダ「helloworld」に移動

```
cd helloworld
```

###(3)web.phpを編集

```helloworld\routes\web.php
<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/


Route::get('/', function () {
    return view('welcome');
});

Route::get('hello', 'HelloController@index');
```
###(4)Controllerを作成

```cmd.prompt
php artisan make:controller Hello2Controller
```

###(5)Controllerを編集

```helloworld\app\Http\Controllers\HelloController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    //
  public function index()
  {
    return view('hello');
  }
}
```

###(6)viewを作成

```resources\views\hello.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>My First Page</title>
</head>
<body>
  <h2>Hello World from blade!!</h2>
  <p>{{date("Y/m/d H:i:s")}}</p>
</body>
</html>
```

###(7)サーバを起動

```cmd.prompt
php -S localhost:8000 -t public
```

###(8)動作確認

ブラウザで以下のURLにアクセスする。
http://localhost:8000/hello


![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/c059c49c-de73-85a3-0f9b-de8d86bf0f02.png)
Swift学習 on Docker for Windows

# swift on windows

- こんど[swift](https://www.apple.com/jp/swift/)さわることになるっぽい
- さわってからだと業務秘密が云々とかなってはイヤなので
- 予習段階でひと記事つくっときます

## まとめ

- swift on docker for windows でOK
- 今回はチュートリアルでコンソールプログラム的な
- ~~次回以降やること~~
  - ~~端末エミュで動かす -> windows向けあるかな？なければLinux向けでOK、、なはず~~
  - ~~iPhone6で動かす~~
- シミュレータも実機も、Macがないと駄目なように囲われてた、手が出ません

## 印象

- Mac必要なんだよなぁと思って避けてた
  - けどLinuxでいいらしい

> 無料でオープンソースのSwiftは、Apache 2.0オープンソースライセンスのもと、多くのデベロッパ、教育機関、学生の方々に幅広く利用していただけます。Appleでは、iOS、macOS、watchOS、tvOS、Linux向けのコードをコンパイルできる、macOSとLinuxのためのバイナリを提供しています。
> (引用 https://www.apple.com/jp/swift/)

## 情報を集める

- WSLなら多分これが一次情報に当たる > [Swift on the Windows Subsystem for Linux (WSL)](https://github.com/apple/swift/blob/master/docs/WindowsSubsystemForLinux.md)
- dockerなら多分これが公式イメージ > [library/swift - Docker Hub](https://hub.docker.com/_/swift/)
- 非公式だけど[swift for windows](https://swiftforwindows.github.io/) があるらしい
- Qiitaに wsl で動かす記事もある > [Windows 10でSwift開発環境構築 with Atom - Qiita](/akira_/items/e5550dbb571a20deb3c1)
- Qiitaに docker で動かす記事もある > [DockerでSwiftが動くUbuntu環境を立ち上げる - Qiita](/clouder/items/867ecb5db2077bc91f9e)
- Qiitaの検索でタグを複数条件にする方法を覚えた > 「[tag:Swift tag:Windows](https://qiita.com/search?q=tag:Swift+tag:Windows&sort=created)」

## 選ぶ
- 一番素のwindowsを汚さなさそうだからdockerにする
- イメージは公式をつかう

## docker

### 失敗例
- 公式とおりにstartすればよいのですが
- ちかごろdocker composeの使い勝手を確認中なので

```yaml:docker-compose.yml
version: '2.1'

services:
  swift:
    image: swift:4.2
```

```powershell:powershell
PS>docker-compose run swift /bin/bash
```

- ベースはubuntu:16.04でサイズは1.47GBでした
- REPL狙って`docker-compose run swift swift`てしたらエラーになりました

```powershell:powershell
error: failed to launch REPL process: process launch failed: 'A' packet returned an error: 8
```

- 失敗の原因はつぎのとおり

> Swift requires a little bit of extra security privilege to run the REPL.

### 失敗例２ - というか、公式の案内のまま

```powershell:powershell
docker run --cap-add sys_ptrace -it --rm swift:4.2 swift
```

- あれ？公式の案内`requires a little bit of extra security privilege`を頼りに

### 成功 - docker

```
docker run --privileged -it --rm swift:4.2 swift
```

### 成功２ - docker-compose

```yaml:docker-compose.yml
version: '2.1'

services:
  swift:
    image: swift:4.2
    privileged: true
```

```powershell:powershell
PS>docker-compose run swift swift

Welcome to Swift version 4.2 (swift-4.2-RELEASE). Type :help for assistance.
  1> 1 + 1
$R0: Int = 2
  2> :quit
```

## チュートリアル
https://docs.swift.org/swift-book/GuidedTour/GuidedTour.html

- hello world

```swift:swiftのrepl
print("Hello, world!")
```

以上
Spacemacsいいよね

<img width="774" alt="Screen Shot 2018-10-17 at 23.30.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/141539/064b2e99-e0de-bc22-776b-d8ce73dbba98.png">


# Spacemacsとは
- Emacsの拡張、というかEmacsの１つのディストリビューション。
- EmacsをVimバインドで操作する（ことができる）。
- Emacsのキーバインドも多少は知っていると便利。（ほんとに少しだけ。ターミナルのときに使う程度）
- デフォルトでほとんどの機能が入っているので、設定ファイルが小さくなる。
- 様々な言語やツールに対応している。
- それぞれの機能がレイヤーという形でまとまっている。例えばjavascriptを編集する場合は設定ファイルに`javascript`と追加すれば関連パッケージや設定を追加してくれる。（実際は設定ファイルに追加する必要もなく、jsファイルを開いて`yes`と言えば勝手にやってくれる。
- キーバインドが本当によくできていて覚えやすい。覚えていなくても次にどのキーを打てば何が起こるか教えてくれる。


# インストール
githubのREADMEを読みながら適当に読み替えてください。

## Emacsのインストール

emacsを拡張バージョンの[emacs-plus](https://github.com/d12frosted/homebrew-emacs-plus) をインストールする。

```sh
brew tap d12frosted/emacs-plus
brew install emacs-plus --fetch-HEAD
ln -sf /usr/local/Cellar/emacs-plus/*/Emacs.app/ /Applications/
```

## Spacemacs

```sh
# clone spacemacs
ghq get https://github.com/syl20bnr/spacemacs.git
# create .emacs.d link
ln -sf path/to/src/github.com/syl20bnr/spacemacs ~/.emacs.d
```
`github.com/syl20bnr/spacemacs`がそのまま`$HOME/.emacs.d`となります。
私は全てのレポジトリを一箇所に管理している（$GOPATHの下）ので、`$HOME/.emacs.d`にシンボリックリンクを作っています。
上記のリポジトリが`emacs.d`（emacsの設定・拡張ファイルとかもろもろが入ったディレクトリ）になるので、そのまま`develop`ブランチをチェックアウトすれば、開発中の機能も使うことができる。
ちなみに開発は`develop`ブランチで行っていて、任意のタイミングで`master`にマージされている模様。

# 設定ファイル
私の`.spacemacs`です。参考までに
https://github.com/kentakozuka/dotfiles/blob/master/spacemacs/.spacemacs
初めて見るひとは「長い！」と思うかもしれませんが、大部分は最初からのものです。
Spacemacsで`SPC f e D`と打てば、デフォルトとの差分を見れて便利。
`SPC f e d`に設定ファイルを表示、`SPC f e R`でリロードします。

# 本家サイト

http://spacemacs.org/
Tシャツとかマグカップを購入できる。
（たしか）5ドルから支援とかもできる。

# Github

なにはともあれまずはここから、ドキュメントも充実している。
https://github.com/syl20bnr/spacemacs

## Layers
https://github.com/syl20bnr/spacemacs/blob/master/layers/LAYERS.org

# Gitter

質問して最も早く回答が返ってくる場所
https://gitter.im/syl20bnr/spacemacs


# Twitter

Spacemacs
https://twitter.com/spacemacs

作者 @syl20bnr
https://twitter.com/syl20bnr

Emacs本家
https://twitter.com/emacs

SpacemacsのTipsを教えてくれる
https://twitter.com/iLemming

# Youtube

チュートリアル
https://www.youtube.com/watch?v=ZFV5EqpZ6_s&list=PLrJ2YN5y27KLhd3yNs2dR8_inqtEiEweE

他にもいっぱいあります。
【要約】自分を操る超集中力

## 1. はじめに

以下書籍の要約。

- 題名：[自分を操る超集中力](https://www.amazon.co.jp/%E8%87%AA%E5%88%86%E3%82%92%E6%93%8D%E3%82%8B%E8%B6%85%E9%9B%86%E4%B8%AD%E5%8A%9B-%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%AA%E3%82%B9%E3%83%88%EF%BC%A4%EF%BD%81%EF%BD%89%EF%BC%A7%EF%BD%8F-ebook/dp/B01FLFFF2Q/ref=sr_1_2?ie=UTF8&qid=1539786437&sr=8-2&keywords=%E8%87%AA%E5%88%86+%E3%82%92+%E6%93%8D%E3%82%8B+%E8%B6%85+%E9%9B%86%E4%B8%AD+%E5%8A%9B) 

- 著者：DaiGo
- 出版：セブン&アイ


## 2. 集中力を自在に操る

#### 2-1. 集中力の高い人は鍛え方を知っている

- 集中力が湧き出す泉は、頭から2～3センチ奥の**前頭葉**にある。これが思考や感情をコントロールする力で**ウィルパワー**と呼ばれる。
- ウィルパワーにも一定の量があり、集中力を使う度に消費される。
- ウィルパワーを高める方法は、**トレーニングによって総量を増やす**か**消費量を節約するか**。
- 総量を増やすには**姿勢に気を付けて生活する**。日々無意識に行っていることをやらないようにすることは強い集中力を必要とする。筋トレのようなもの。
- 消費量を節約するには、**意思決定の機械を減らす**。服を選ぶのも意思決定。人は行動ではなく意思決定の連続で疲れる。即決できる仕組みを作るべき。

#### 2-2. 集中力の高い人は長時間集中していない

- 人間の脳は集中力を持続させないようにできている。
- 作業に対する時間を短く区切り、仕事や勉強を打ち切ってしまう。
- 休憩中も「もうちょっとやりたい」というモチベーションを保つことができる。**焦らし効果**という。
- 脳はやりかけのタスクを考え続けてくれている。

## 3. 高い集中力を生み出すエンジン

#### 3-1. 場所
- **水色**は集中力を高め、体感時間を短くする効果がある。

#### 3-2. 姿勢
- 姿勢がよくなると、前頭葉の機能が活性化される効果がある。
- 座るときは**あごを引く、お尻と腰を直角にする、両膝を付ける、足の裏を床に付ける**。
- 15分に一回、**椅子から立ち上がる**と脳がクリアになる。
- **立っているとき、さらに歩いているとき**は認知力、集中力が高まる。

#### 3-3. 食事
- **ナッツ**は集中力を高め、鬱防止にも繋がる。水もよい。

#### 3-4. 運動
- **20分ほどの軽い運動**の後の3～4時間は集中力や考察力が高まる。
- 運動は脳そのものを強化し、疲れにくくする。合わせて、感情もポジティブになる。
- 緑の中で散歩とかの運動をする**グリーンエクササイズ**は最強。

## 4. 疲れをリセットする回復法
#### 4-1. 睡眠
- 睡眠不足は集中力を奪う要因となる。
- 人の脳は寝ているときに回復する。
- 東大に合格した受験生は平均7時間程の睡眠をとっていた。
- 椅子での15分の仮眠は、3時間の睡眠に匹敵する。

#### 4-2. 感覚
- 脳の疲れは目の疲れ。目の疲れをとることで、集中力を取り戻すことができる。
- 脳が処理している情報のうちの8割以上は、視覚を通して集められている。
- 目の疲れをとるには、**あたためる、目のストレッチを行う、目を休ませる**とよい。
React Nativeでindex.android.bundleがAPKに保存されない

React Native 0.52でAndroidのリリースビルドを行った際に生成されるAPKファイルにindex.android.bundleが保存されず、実行できないという問題に直面しました。

いろいろ調べたところ、使っているReact NativeのバージョンのAndroidビルドに問題があることがわかったのでまとめました。

## 経緯

具体的にはAndroid用のリリースビルドを行うときには

```bash
$ cd android
$ ./gradlew assembleRelease
```

を実行し、`app-release.apk`というAPKファイルを生成し、それを配布する、というのが通常の流れになります。

APKファイルにはReact Nativeのランタイムやアプリのリソース、そして、自分たちが書いたJavaScriptのコードがバンドルされます。

APKファイルの実態はZIPアーカイブなので、 `unzip -l`などで中身を見ることができます。

```bash
$ unzip -l app-release.apk
```

問題はこの中に自分たちのJavaScriptが保存されなくなってしまったことです。

## すべてはこいつ `react.gradle`

Androidはgradleというビルドツールを使ってビルドしており、React Nativeにおいては[facebook/react-native](https://github.com/facebook/react-native)の`react.gradle`というファイルに問題があったようです。

ざっくりいうと、`react-native bundle`を実行し、自分が書いたJavaScriptのコードを`index.android.bundle`という1つのファイルにまとめてくれます。

いろいろ調べていると、どうもこのロジックが怪しい模様でした。調査結果から言うと、

**試しに0.57のファイルを `node_modules/react-native/` にコピーしたところ、無事にAPKに追加されるようになりました。**

- 使っていたバージョン（0.52）:arrow_right: https://github.com/facebook/react-native/blob/0.52-stable/react.gradle
- 最新バージョン（0.57）:arrow_right: https://github.com/facebook/react-native/blob/0.57-stable/react.gradle

## さらに深掘り

こちらの2つを比べると分かるのですが、`index.android.bundle`の出力先が変更されていることがわかります。

- 0.52: `android/app/build/intermediates/assets/release`
- 0.57: `android/app/build/generated/assets/react/release`


GitHubのIssueなどを探してみたところ、やはりビルドのようにクリティカルな話だけあって、 [かなり盛り上がっておりました。](https://github.com/facebook/react-native/issues/16906)

最終的には[このコメント](https://github.com/facebook/react-native/issues/16906#issuecomment-364003857) に書いてあるのが最終的な修正のようです。一番キーのメッセージがこちら :arrow_down:

> Output to "build/generated" instead of "build/intermediates"

ただ、やはりビルド全体が複雑なのか、「何が」「いつから」「どう」「なんで」変わったのかは記載されておらず、自分たちの環境でも何故突然起きたのか分かりませんでした。

## 結論

とは言いつつも、`node_modules/react-native/`の下のファイルを入れ替えたりするのは危なっかしいので、実際には別の回避策を設けておいて、React Nativeのバージョンアップを待つこととしました。

## 余談1： enableAapt2

Androidのパッケージツールの[Aapt2](https://developer.android.com/studio/command-line/aapt2)ですが、こちらはReact Nativeと相性が悪く、だいたい`gradle.properties`とかで`enableAapt2=false`としてオフにすることになるのですが、上記の修正の一環としてビルドの順番とかを修正したおかげで、再び使えるようになりました！`enableAapt2=true`、もしくは消してしまってもビルドできるようになります。

## 余談2： PRが出たり入ったり

ちなみ、[facebook/react-native#17967](https://github.com/facebook/react-native/pull/17967)で一度入ったのですが、revertされたらしく、最終的には[facebook/react-native#20526](https://github.com/facebook/react-native/pull/20526)になります（変更内容は同じのようです）。
Rspecのあれこれ2

Rspecについて、前回調べきれていなかった項目について調べた。
気づいたことを順不同で調べたため取り留めないです。

## 実は遅延評価される `let`
遅延評価されるという特徴を知らずに、ハマってしまいました。

```ruby:user_spec.rb
describe User do
  let(:user) { User.create(name: 'piyoko', email: 'qqq@hoge.jp') }
  it 'Userの取得ができる' do
    expect(User.first).to eq user
  end
end
```
- `let` は遅延評価される
- expect(User.first)を呼び出した時点では、let(:user)が実行されていないのでnilになる
- `before do` で明示的に呼び出しておくか、もしくは `let!` を使うと良い

```ruby:user_spec.rb
describe User do
  let!(:user) { User.create(name: 'piyoko', email: 'qqq@hoge.jp') }
  it 'Userの取得ができる' do
    expect(User.first).to eq user
  end
end
```
`let!` すごい


## subjectとは
- テストする対象のオブジェクト（orメソッドの実行結果）が決まっている場合は、subjectを使用することでまとめることができる
- subjectとis_expectedはセットで使う
- `is_expected` は `subject` のインスタンス変数を呼び出しているので、 `subject`に渡しておいた値が評価される

```ruby:user_spec.rb
require 'spec_helper'

describe User do
  let(:user) { User.new(name: "pi----yo", email: "piyo@hoge.com", use_count: 2) }
  subject { user.repeat_user }　 <= これと
  describe '#repeat_user' do
    it '二回以上購入（リピートユーザー）ならtrueが返る' do
      is_expected.to be true　　<= これがセット
    end

    it '一度も購入していない場合は falseが返る' do
      user.use_count = 0
      is_expected.to be false　　<= これがセット
    end
  end
end
```

## Factory_bot便利そう
導入部分は割愛
- `spec/factories/user.rb` にデータを準備しておく


```ruby:spec/factories/user.rb
FactoryBot.define do
  factory :user do
    name { "piyo_user" }
  end
end
```
`factory :hogeuser, class: User do` のようにするとclass名と違う名前もつけられるらしい

createかbuildで生成する

```ruby
# DBへレコード保存
@user = create(:user)

# モデルのみの作成
@user = build(:user)
```

使用例

```ruby:user_spec.rb
require 'spec_helper'

describe User do
  before do 
    @user = build(:user)
  end

  describe 'validations' do
    it "name", :aggregate_failures do
      @user.name = "piyopiyo"
      expect(@user.valid?).to eq(true)
      @user.name = ""
      expect(@user.valid?).to eq(false)
    end
  end
end
```

テスト書いてくぞ。
PDFKITがwkhtmltopdfを見つけられないことがある

Pythonのライブラリ、pdfkitを使っていると、wkhtmltopdfがインストール済みの環境にもかかわらず、「No wkhtmltopdf executable found」というエラーでPDF作成に失敗することがあります。

答えはPDFKITの構成ファイルにあります。

```python:pdfkit\configuration.py
        if not self.wkhtmltopdf:
            if sys.platform == 'win32':
                self.wkhtmltopdf = subprocess.Popen(
                    ['where', 'wkhtmltopdf'], stdout=subprocess.PIPE).communicate()[0].strip()
            else:
                self.wkhtmltopdf = subprocess.Popen(
                    ['which', 'wkhtmltopdf'], stdout=subprocess.PIPE).communicate()[0].strip()
```
Windows環境では、whereコマンドを使ってwkhtmltopdfを探しています。このため、wkhtmltopdfにパスが通っていない環境では、処理に失敗します(というか、whereコマンドなんてあったんだ・・・)。
そして、2018/10/17現在最新のバージョン0.12.5では、**wkhtmltopdf.exeにパスを通してくれません**(ﾅﾝﾃｺｯﾀｲ)
そのため、以下の二通りの方法で解決が可能です。

* wkhtmltopdf.exeにパスを通す
* pdfkitのConfigureオブジェクトを作り、そこでwkhtmltopdf.exeのパスを指定する

自分で使う環境ならともかく、他者に使ってもらうことを考えると、パスを自力で探したほうが早いという気もします(どうせパスの情報はレジストリにも書かれていますし)

# というわけで、wkhtmltopdf.exeのパスを検索して、設定してみた

wkhtmltopdfのパスは、インストール済みであれば、`HKEY_LOCAL_MACHINE\SOFTWARE\wkhtmltopdf\PdfPath`に格納されています。

```python:program.py
    import winreg
    try:
      with winreg.OpenKeyEx(winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\wkhtmltopdf', 
        access=winreg.KEY_READ | winreg.KEY_WOW64_64KEY) as k:
        data, regtype = winreg.QueryValueEx(k, "PdfPath")
        configure = pdfkit.configuration(wkhtmltopdf=data)
        regtype = regtype

        pdfkit.from_file(html, "output.pdf", configuration=configure)    
    except FileNotFoundError:
      pass
```

winreg.KEY_WOW64_64KEYは、Pythonインタプリタ自体のアーキテクチャにかかわらず、64bitのレジストリビューのデータを確認するというフラグです。64bit版のPythonを使用している場合は省略可能です(64bit版のPythonを使っているときに指定しても害はないので、そのままにしてあります)
DeepLearningで数字の識別をしたい

現在、DeepLearningの勉強をしています。mnistサンプルコードを応用(？)して、自分で取り込んだ画像に書いてある数字を当てるモノを作ることを目的としました。
参考にしたサイトは[https://book.mynavi.jp/manatee/detail/id=89558]です。
この、「2018番目の画像データを推論してみる」の入力を自分で入手した画像の変えれば目的を達成できるのかと思い、以下のコードを作成しました。
以下が作成したコードです。

```Deeplearning.py
from sklearn.datasets import fetch_mldata
 
mnist = fetch_mldata('MNIST original', data_home=".")
X = mnist.data / 255 
y = mnist.target
import matplotlib.pyplot as plt

 
plt.imshow(X[0].reshape(28, 28), cmap='gray')
print("This is {:.0f}".format(y[0]))
import torch
from torch.utils.data import TensorDataset, DataLoader
 
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=1/7, random_state=0)
 
X_train = torch.Tensor(X_train)
X_test = torch.Tensor(X_test)
y_train = torch.LongTensor(y_train)
y_test = torch.LongTensor(y_test)
 
ds_train = TensorDataset(X_train, y_train)
ds_test = TensorDataset(X_test, y_test)
 
loader_train = DataLoader(ds_train, batch_size=64, shuffle=True)
loader_test = DataLoader(ds_test, batch_size=64, shuffle=False)

from torch import nn
 
model = nn.Sequential()
model.add_module('fc1', nn.Linear(28*28, 100))
model.add_module('relu1', nn.ReLU())
model.add_module('fc2', nn.Linear(100, 100))
model.add_module('relu2', nn.ReLU())
model.add_module('fc3', nn.Linear(100, 10))
 
print(model)
from torch import optim
 
loss_fn = nn.CrossEntropyLoss()  

optimizer = optim.Adam(model.parameters(), lr=0.01)

from torch.autograd import Variable
 
def train(epoch):
    model.train()  
    for data, target in loader_train:
        data, target = Variable(data), Variable(target)  
        optimizer.zero_grad() 
        output = model(data)  
        loss = loss_fn(output, target) 
        loss.backward() 
        optimizer.step()  
    print("epoch{}:end\n".format(epoch))

def test():
    model.eval() 
    correct = 0
    for data, target in loader_test:
        data, target = Variable(data), Variable(target)  
        output = model(data)          
        pred = output.data.max(1, keepdim=True)[1]  
        correct += pred.eq(target.data.view_as(pred)).sum() 
    data_num = len(loader_test.dataset)  
    print('\n answer: {}/{} ({:.0f}%)\n'.format(correct,data_num, 100. * correct / data_num))
    
for epoch in range(3):
    train(epoch)
 
test()

import cv2
img1 = cv2.imread('awa.jpg')
gray = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY)  
data = Variable(gray)
output = model(data)  
pred = output.data.max(0, keepdim=True)[1]  
print("I think {}".format(pred))
```
動かしたところ、以下のエラーが検出されました。
variable data has to be a tensor, but got numpy.ndarray

使用した画像はPNGイメージで、画像の大きさは225×225、サイズは1.63 KBです。

入力データがテンソルではないといわれているのだと思いますが、どのように形を合わせればよいかわかりません。
データセットの画像ではなく自分が用意した画像をDeepLearningにかけるというような内容のもので、よい文献等教えていただきたいです。
また、上記のエラーについても教えていただけると助かります。
まだプログラミング初心者であるため分かりずらい表記が多々あると思います。申し訳ありません。
スライスのまとめ

個人的な備忘としてのメモです。

スライスは参照型
可変長配列であるが、ちょっと注意が必要。

```go:sample.go
package main
import "fmt"
func main(){
    a := [5]int{1,2,3,4,5} // 配列
    s := a[0:2] // スライス
    fmt.Println("a:", a) // a: [1 2 3 4 5]
    fmt.Println("s:", s) // s: [1 2]
    
    a[0] = 10
    fmt.Println("a:", a) // a: [10 2 3 4 5]
    // 参照型なので配列の変更が影響される
    fmt.Println("s:", s) // s: [10 2]
    
    s[0] = 100
    fmt.Println("a:", a) // a: [100 2 3 4 5]
    fmt.Println("s:", s) // s: [100 2]
    
    s = append(s, 6)
    fmt.Println("a:", a) // a: [100 2 6 4 5]
    fmt.Println("s:", s) // s: [100 2 6]
    
    
    b := [3]int{1,2,3} // 配列
    t := b[:] // スライス
    fmt.Println("b:", b) // b: [1 2 3]
    fmt.Println("t:", t) // t: [1 2 3]
    
    t = append(t, 6) // スライスが自動拡張される　→　参照先の配列が変わる
    fmt.Println("b:", b) // b: [1 2 3]
    fmt.Println("t:", t) // t: [1 2 3 6]
    
    b[0] = 10
    fmt.Println("b:", b) // b: [10 2 3]
    // 参照先の配列が変わったので、配列の変更が影響されない
    fmt.Println("t:", t) // t: [1 2 3 6]
}
```
Processing から Syphon を使って MadMapper に実行結果を送信する

# 概要
* ProcessingからMadMapperに実行結果を送信するのでプロジェクションマッピングでもProcessingが使えてHAPPY!!
* Syphon経由しているので各種VJソフト用にも使えそう

関連 :
[MacとUnity2017\.4\.1f1とMadMapperでプロジェクションマッピング \- Qiita](https://qiita.com/reona396/items/e8d84bf22496eac9ef2a)

# 解説
## 実験環境
* Mac High Sierra
* Processing 3.4
* MadMapper Demo 3.5.1

## 手法

1 . Processingを起動していつもどおりコーディング
2 . スケッチ > ライブラリをインポート > ライブラリを追加 から「Syphon」を選択しインストール
<img width="750" alt="スクリーンショット 2018-10-17 15.43.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/67311/2d2ba75a-bc5f-a294-eede-444a7f6ff4a6.png">
3 . スケッチ > ライブラリをインポート > Syphon を選択
4 . setup関数内にSyphon送信用のコードを記述
P3Dモードしか動かないようなので注意

```java
import codeanticode.syphon.*;
PGraphics canvas;
SyphonServer server;

void setup() {
  size(350, 350, P3D);
  canvas = createGraphics(350, 350, P3D);
  server = new SyphonServer(this, "Processing Syphon");
}
```

5 . draw関数内などに書いた描画用コードを上記canvas対象に書き換え、draw関数の最後に送信用のコードを記述

```java
void draw() {
  canvas.beginDraw();
  canvas.fill(100, 0, 0);
  canvas.stroke(255, 0, 0);
  canvas.ellipse(100, 100, 50, 50);
  ...
  canvas.endDraw();
  server.sendImage(canvas);
}
```

6 . Processingを実行
7 . MadMapperを起動し、左パネルのManage Surfacesアイコン(四角のアイコン)から適切な形のオブジェクトを追加
下記画像では円を追加している(左に並んでいる+マークのついたアイコンから追加できる)
<img width="269" alt="スクリーンショット 2018-10-17 15.46.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/67311/eee6ab40-8c09-ee36-5b65-92fe95d5bdd4.png">
8 . 右パネルの素材リスト下部にある「Syphon」欄でProcessingから送信した映像を選択
9 . Processingから送信した映像が中央パネルに配置されることを確認
<img width="1024" alt="スクリーンショット 2018-10-17 16.29.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/67311/5ac0c132-acbc-1525-adda-17fdccb7d941.png">

# 余談
## ライブコーディングに使えるかも？
Processing側でコードを変更→再実行すると自動的にMadMapper上の映像もそのとおりに切り替わるのでうまくやればライブコーディング的な楽しみ方ができる…かも？
![p5mm (1).gif](https://qiita-image-store.s3.amazonaws.com/0/67311/c2e94f19-af91-2248-e612-e96194ebbfce.gif)
## Windows なら Spout が使える
今回はMac+Syphonを使用したが、Windowsで同じようにProcessingの実行画面をMadMapperに送信したい場合はSpoutが使える
以下の記事が大変参考になったのでオススメ

[ProcessingとResolumeを連携させて、映像作ってみた時の話 \- Qiita](https://qiita.com/_miki/items/3e1ee4947ca4f456fa38)

# 参考
* [Tutorial: Using Syphon with Processing to stream video into MadMapper \| Marcos can Type](https://socram484.wordpress.com/2013/09/12/using-syphon-with-processing-into-madmapper/)
C#のことを自分なりにまとめてみた


コンパイル言語
パラダイム：オブジェクト指向
型付け：強い静的型付け

# アプリケーションが実行される仕組み
Javaの実行環境とよく似ている

1. C#のソースコードをC#コンパイラが共通中間言語(Javaでいうバイトコード)へとコンパイルする
2. コンパイルされたアプリケーションは共通言語ランタイム上で動作する仮想マシン(JavaでいうJVM)で実行される
3. 仮想マシンでは共通中間言語をネイティブコードに翻訳し、OSを通してCPUで実行される

#特徴
## Windowsアプリにつよい
- Microsoft謹製
- 豊富なWindowsAPI
- nugetというパッケージ管理システムでライブラリもたくさんある
- 同じくWIndowsアプリに強いVB.netよりもサンプルが多い
- Windows向けデスクトップアプリ作るならほぼ一択

## Linqという強力な配列処理機能がある
- メソッド記法によって可読性の高い配列処理ができる

## Web開発
- ASP.netを使用することでWeb開発、MVC開発が可能

## MVVM開発
- WPFによる強力なBinding機構でMVVM開発が可能

## クロスプラットフォーム開発
- Unity
    - ゲーム開発もできる！
- Xamarin
    - iOSも作れる！(ただしビルドにはOSX環境が必要)
- Mono
    - Linux環境の開発もできる！

## 高機能なIDEによる補助で開発スピードが速い
- VisualStudioの高度な入力補完機能によって、基本的な.Netの名前空間のフレーズだけ入力すればある程度の開発ができる
- プロジェクト全体に対する変数名、クラス名一括変更等ができる
    - 変更漏れによる手戻りが起こりにくい

## 共通言語基盤上の仮想環境で実行される
- 同じ仕組みで実行されるVB.Netで書かれたライブラリも参照できる
- プラットフォーム非依存で実行できる環境が構築されつつある
    - Monoとか

# まとめてみた感想
- Runtimeの対義語がCompiletimeということを知れた。
  Runtimeで一つの単語だと勘違いしていて意味がよくわからないな～とか思ってたけどただ「実行時」と直訳すればよかったのですね。

- 2年ほど.netの環境に触れていたけどいざまとめてみるとなかなか難しい。他言語を実務で使えれば比較できてわかりやすいのかも
- 技術選定をするためにはもっと深くまで掘り下げないといけないのだろうという感覚
python2と3のそれぞれでosコマンドを実行してその結果を取得する

いずれもsubprocessを使用します。
する……んですが、3から2に落とすっていう不思議な作業をしていたらちょっと戸惑ってしまったので。

```python2.py
import subprocess

result = subprocess.check_output(["ls", "-l"])
print(result)
```

```python3.py
import subprocess

process_result = subprocess.run(["ls", "-l"], stdout=subprocess.PIPE)
result = process_result.stdout.decode('ascii')

print(result)
```

早く全部3で記述できる世の中にならないかしら
(MEMO)ラズパイ with カメラモジュール とOpenCVで動画のFrame取得する

(作成日　201８/10/17)
ラズパイとカメラモジュール、Opencvを使用して動画のFrameを取得。

1.ラズパイにカメラモジュールを接続後terminalを立ち上げ、下記コマンドでモジュールをロードする。
```>sudo modprobe bcm2835-v4l2 ```
v4(エル小文字)2。

2.下記区スクリプトでframe取得して表示。

```python
#!/user/bin/python

import cv2

cap = cv2.VideoCapture(0)
print(cap)
while True:
    ret,frame = cap.read()
 
    ########################
    #ここに画像に対する処理を入れる
    # 
    ########################
   
    cv2.imshow('window',frame)
    
    # sを押すとStop
    k = cv2.waitKey(0)
    if k == ord('s'):
        break

cap.release()
cv2.destroyAllWindow()


```

こっちの方が、[以前の記事](https://qiita.com/Ponjiro/items/ab3700394faab7422bb3)より機械学習とかやりやすいのかも？
fpsの設定やサイズなどの設定/取得は下記のキーワードでググる。
   cv2.CAP_PROP_FPS
Pythonを初めて触ってみたメモ(インストール〜実行編)

## モチベーション
- 業務とは直接的に関連はないものの、使用するシーンがありそう
- なんとなく面白そう
- 知り合いに[Pythonの入門書](https://www.amazon.co.jp/dp/B07D6ZHFYS/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)をもらった。

ということでPythonの勉強を始めました。

## 作業環境
端末: MacBookAir
実行環境: コンソール([iTerm2](https://www.iterm2.com/)を利用)

## インストール方法
1. 下記サイトにアクセスする。
https://www.python.org/downloads/

2. 必要なバージョンのパッケージをダウンロードする。
3. インストーラを起動し、インストールする。
4. 完了。

特につまるところなくできた。
Pythonのバージョンは3系と2系が共存？しているとのこと。
とりあえず困ることがなければ3系を追っていくこととする。
 
## 基本操作
### 対話形式でPythonを開始する
1. コンソールを開く
2. `Python3`と入力
3. 以上

### 対話形式のPythonを終了する
1. `exit(), Ctrl+D`と入力する
2. 以上 

`Ctrl+D`って書いてあるから反射で`⌘+D`入力したけど本当に`Ctrl+D`だった。。。

### Pythonでプログラムを実行する
1. ファイル(test.py)を作成する。
2. ファイル保存ディレクトリへ移動する。
3. `python3 (ファイル名)`でファイルを実行する。

例. 保存先が`/Users/(ユーザ名)/Desktop/python_test`の場合

~~~ bash
$ cd /Users/(ユーザ名)/Desktop/python_test
$ ls
test.py
$ python3 test.py
hello
~~~

## 感想
ちょっと試したいときにサクッと書いてすぐ実行できるのがいいなあーと思った。
まだまだどんなことができるのか見えてない部分があるので楽しみです。
Laravel 5.7 + GraphQL（Dump Server編）

[LaravelとGraphQLでAPI開発](https://qiita.com/ucan-lab/items/b1796b083ac5c0bcb019)こちらの記事の続きです。

## シリーズ記事

- [LaravelとGraphQLでAPI開発](https://qiita.com/ucan-lab/items/b1796b083ac5c0bcb019)
- [Laravel 5.7 + GraphQL（Install編）](https://qiita.com/ucan-lab/items/32969d6a9b5aa99b475e)
- [Laravel 5.7 + GraphQL（ScalarType編）](https://qiita.com/ucan-lab/items/32ee8dd18974d6146456)
- [Laravel 5.7 + GraphQL（Relation編）](https://qiita.com/ucan-lab/items/4eae9e538be9a7a7c5e9)
- Laravel 5.7 + GraphQL（Dump Server編）
- [Laravel 5.7 + GraphQL（Pagination編）](https://qiita.com/ucan-lab/items/c037d4bd07840af32b94)
- [Laravel 5.7 + GraphQL（ErrorHandling編）](https://qiita.com/ucan-lab/items/fa3bf9b1e7fca1b19d0d)
- [Laravel 5.7 + GraphQL（Test編）](https://qiita.com/ucan-lab/items/1815071cd1cf32d53008)

## Dump Serverとは

Dump Server は Laravel5.7 で追加された新機能です。
ブラウザ上ではなく、コンソールorファイルにdump結果を出力します。（ファイルにも出力可能）

![LaravelDumpServer](https://camo.githubusercontent.com/e462bc1d18bf73137110242447378c1c9c88cc29/68747470733a2f2f6265796f6e64636f2e64652f6769746875622f64756d707365727665722f64756d707365727665722e676966)

- https://laravel-news.com/laravel-dump-server-laravel-5-7
- https://github.com/beyondcode/laravel-dump-server

### dump-serverコマンド

```
$ php artisan dump-server

# もしくはHTMLファイルとして出力できます
php artisan dump-server --format=html > dump.html
```

- 使用ポートは `9912`
- Symfonyが開発した機能の1つで Symfony4.1 から導入
  - https://symfony.com/doc/current/components/var_dumper.html#the-dump-server
- Laravel5.6以下でもcomposerから追加して利用可能

### GraphQLと使用するメリット

GraphQLの実行結果を表示したままdump結果を確認できる
つまり、dumpをコメント化する必要がない

### 蛇足

ちなみにDump ServerなしでGraphQLを実行した場合

`app/GraphQL/Type/PostType.php`

```php
    protected function resolveUserField(Post $root, array $args) : User
    {
        dump('test');
        return $root->user;
    }
```

<img width="1096" alt="スクリーンショット 2018-10-17 22.06.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/52879/6755a854-b30f-cd44-f669-cd158fe5ff01.png">

😇😇😇

dump-serverがないとdump関数をコメントイン、コメントアウトしながらデバッグしなければいけなくなるのでとてもツラいです😢
Laravel5.7でdump-serverが追加されて幸せになりました😊
【第2回】branchと切替方法　〜fork〜pull request〜

#branchとは?
https://backlog.com/ja/git-tutorial/stepup/stepup1_1.html

####branchが必要な理由?
>分岐したブランチは他のブランチの影響を受けないため、同じリポジトリ中で複数の変更を同時に進めていくことができます。

####チェックアウト 〜branchの切替え〜
https://backlog.com/ja/git-tutorial/stepup/stepup1_3.html

#fork(フォーク)〜pull request(プルリクエスト)まで
資料に従って、fork(フォーク)〜pull request(プルリクエスト)までをやってみましょう｡

[参照資料](http://kik.xii.jp/archives/179)

forkとcloneは前回の資料を参考にして下さい｡
[【第1回】Gitってなに？ 基本的なコマンド 〜commit push pull〜](https://qiita.com/kumegoon/items/9ffa48f990a2fb18697b)

##(pull)
最新の履歴を取得する必要がある場合のみ
https://backlog.com/ja/git-tutorial/stepup/stepup3_1.html

```
git pull origin master　　　　　　　　　　　　　　　　　//リモートリポジトリの履歴を取得
```

##checkout
https://backlog.com/ja/git-tutorial/stepup/stepup1_3.html

```
git checkout -b develop　　　　　　　　　　　　　　//developブランチを作成して切り替え
```
```
git checkout -b localのブランチ名(任意)　remote名/remoteのブランチ名　　　//リモートブランチをローカルに作成(ブランチ名は任意)して切替
```
例えば､remote追跡ブランチが､remotes/hoge/developなら､[remote名/remoteのブランチ名]には､hoge/developを指定する

```
git branch -a          　　　　　　　　　　　　　//branchをすべて表示するコマンド
git log             　　　　　　　　　　　　   　//履歴を表示するコマンド
　//チェックアウトした2つのブランチの履歴を比較してみましょう｡
```

##ファイルを編集
ここでは､hoge.htmlをディレクトリに作成します｡

```
touch hoge.html             　　//hoge.htmlファイルの作成(touchコマンド)
```

##commit
```
git add hoge.html          　　//hoge.htmlファイルをステージング(コミット対象を決める)
```
```
git commit -m "test"      　　　//コミット(変更内容をローカルリポジトリに反映)
```
##push

```
git push origin ブランチ名    //変更内容をリモートリポジトリに反映
```

##pull request
https://backlog.com/ja/git-tutorial/pull-request/pull-request1_1.html
>プルリクエストとは簡単に言うと、開発者のローカルリポジトリでの変更を他の開発者に通知する機能です。

https://backlog.com/ja/git-tutorial/pull-request/pull-request2_3.html

```
githubの画面で､pull request(プルリクエスト)を送ります｡
```

##【時間があれば紹介】mergeする時のconflict(競合)
下記に書いてある内容を紹介
https://backlog.com/ja/git-tutorial/stepup/stepup2_7.html

#参考リンク
https://www.kaeruspoon.net/articles/1078

https://qiita.com/forest1/items/db5ac003d310449743ca

以上
ルーターの初期化のしかた

わりと高い頻度でルーターの初期化をするのですが、毎回調べていて面倒になってきたので、備忘録です。

対象のルーター

- Yamaha RTXシリーズ
- NEC IXシリーズ

# ログインできる場合
`administrator`や`enable-config`になれる場合です

### Yamaha
```
> administrator
Password:
# cold start
Password:
```

### NEC
```
Router# enable-config
Router(config)# erase startup-config
Are you sure you want to erase the startup-configuration? (Yes or [No]): y
Router(config)# exit
Router# default-console command-line
Router# reload
% Warning: current running-configuration is not saved yet.
Notice: The router will be RELOADED. This is to ensure that
        the peripheral devices are properly initialized.
Are you sure you want to reload the router? (Yes or [No]): y 
```

# ログインできない場合
ログインのパスワード忘れちゃった場合です

### Yamaha
`security class`のforgetがon(初期値)の場合

```
Password: w,lXlma
# cold start
Password: w,lXlma
```

`security class`のforgetがoffの場合

|型番|やり方|
|---|---|
|RTX1100|initボタンを押しながら起動|
|RTX1200|microSD,USB,DOWNLOAD の3つのボタンを押しながら起動|

### NEC
起動中に`Loading: ##`が出力されている途中でCtrl+cを入力

```
NEC Bootstrap Software
Copyright (c) NEC Corporation 2001-2014. All rights reserved.
%BOOT-INFO: Trying flash load, exec-image [ix2215-ms-9.0.9.ldc].
Loading: #########
```

ブートモニタモードになる

```
NEC Bootstrap Software, Version 6.0
Copyright (c) NEC Corporation 2001-2014. All rights reserved.
boot[0]>
```

ccコマンドを実行し、スタートアップコンフィグを削除

```
boot[0]> cc
Enter "Y" to clear startup configuration: y
% Startup configuration is cleared.
```

bコマンドを実行し、プログラムファイルをロード

```
boot[0]> b
NEC Bootstrap Software
Copyright (c) NEC Corporation 2001-2014. All rights reserved.
%BOOT-INFO: Trying flash load, exec-image [ix2215-ms-9.0.9.ldc].
Loading: ##################################### [OK]
```

# 蛇足
UbuntuなPCでUSB→RS232Cケーブルで繋いだ時に使うコマンド

```sh
$ sudo screen /dev/ttyUSB0 9600
```


# 参考
- [IX2000 シリーズ VPN 対応高速アクセスルータ 取扱説明書](https://www.manuals.nec.co.jp/contents/system/files/nec_manuals/node/344/UM-IX2000-ver10.0-1.pdf)
- [Yamaha ルーターシリーズ コマンドリファレンス](http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/index.html)