OmniAICreator/Qiita-1.07M huggingface dataset:
えっ、環境変数ってコマンドの後ろに書いたらダメなんですか？

## 勘違いしていたこと〜コマンドの後ろに環境変数書けるよね？〜

普段 Ruby on Rails で開発を行っているのですが、rails では以下のように、**コマンドの後ろ**に環境変数を付けることができます。

```shell
# 環境変数 RAILS_ENV を一時的に "test" に変えてから DB を作成する。
$ bundle exec rails db:create RAILS_ENV=test
```

また、経験上 ↓ のように **コマンドの前** に指定できることも知っていました。

```shell
$ RAILS_ENV=test bundle exec rails db:create
```

このことから、僕は **Linuxのシェルはコマンドの前か後ろに環境変数を指定できる** ものだと思い込んでおり、 **その日の気分で前につけたり後ろにつけたり** してました。

## あれ、なんかおかしいな

先日、後置だと ruby スクリプトに環境変数が渡せないことに気づきました。

```env_test.rb
#!/usr/bin/env ruby

puts "APP_ENV: #{ENV['APP_ENV']}"
```

```shell
# NG
$ ./env_test.rb APP_ENV=hoge
APP_ENV:
```

↓ のように前置にするとうまく渡せます。

```shell
# OK
$ APP_ENV=hoge ./env_test.rb
APP_ENV: hoge 
```

調べてみると、[bashで環境変数をexportせずにシェルスクリプトを実行したい場合はコマンドの前に記述することで代替できる](https://shinkufencer.hateblo.jp/entry/2018/10/19/235900) という記事が。
えっ、後ろには書けないの・・・？

## なんで db:create とかは後ろに環境変数を書けるのか

でも db:create とか db:migrate は後ろに書けるじゃーん！なんでー！と思って更に調べました。

すると rails のコマンドを使うときに環境変数を後ろに書けるのは、**rake が引数として `VAR=VALUE` を受け取り、それを環境変数にセットしてるから** ということが分かりました。
https://github.com/ruby/rake/blob/master/doc/command_line_usage.rdoc

rake のおかげだったんだ・・・

## まとめ

* rake タスクを実行するときは、環境変数をコマンドの前に書いても後ろに書いても良い
* それ以外の場合はコマンドの前に書く

変に使い分けて間違えても嫌なので、いっそのこと常に前に書く癖をつけた方が安心かも？
Auth0をSPAアプリケーションでブラウザをリロードすると認証情報が消えてしまうときの対処

react-auth0-spa.jsなどを使ってReactでAuth0を認証に使ったSPAアプリを作っているときに、認証したあとブラウザをリロードするとログアウト状態にされてしまうことがある。その時のAuth0のログには、

```
Failed Silent Auth - Login required
```

などと表示される。Auth0の設定は合っているが、この状況になるときはユニバーサルログインの種類が`Classic`になっている可能性がある。

下記手順でユニバーサルログインを`New`に変更すると解消する。

## Universal Loginリンク

<img width="1071" alt="Screenshot_2020_02_20_17_41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7565/82e7c87f-280e-47b7-7153-bdf34ccf3b8c.png">

## Newを選択

<img width="1068" alt="Screenshot_2020_02_20_17_42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7565/dd75991b-502b-6c7e-b6e5-383f14c13990.png">

## 保存

<img width="686" alt="Screenshot_2020_02_20_17_43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7565/866cdfb7-e078-a4ad-ff24-dc5ca49ebd9f.png">
【MRTK V2.2】 Interactable使用方法

# 準備
下記のサイトを参考にスタンダードなHolo開発環境を整えてください
[参考サイト]()

# 手順

## 1. Hand Interaction Touchを使用する方法(タッチイベントのみほしい場合) 


## 2. Interactableを使用する方法(タッチイベント以外も欲しい場合)

1. タッチしたいオブジェクトをSceneに配置


2. Colliderをセットする(セットされていない場合)


3. `Near Interaction Touchable Volume`コンポーネントを追加する
※この段階で`Tochable Collider`にColliderがセットされていない場合、先ほど追加したColliderをセットするか、RemoveComponentしてもう一度セットしてみてください。
4. `Interactable`コンポーネントを追加する
5. Statusを作成する
6. Profilesを作成する
7. EventReceiverを設定する

※6, 7はどちらでもいいです。
6のほうが色を変えたり同時に複数行えるので管理しやすいと思います。
7はタッチイベントの情報だけ設定できるので便利です。

では順番に説明します。

### 1  タッチしたいオブジェクトをSceneに配置

特に指定はないです。今回はCubeで試したいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363822/d7877aa7-e50e-1241-0724-8ae61e6027e1.png)

### 2  Colliderをセットする(セットされていない場合)

CubeにはColliderが設定されているので特に作業は必要ありません

### 3  `Near Interaction Touchable Volume`コンポーネントを追加する

公式の文章を読むとこれを追加すことでタッチイベントの対象になるようです。

> It is generally recommended to utilize the DefaultInteractableStates when creating Interactable components.

>However, there are 17 Interactable states available that can be used to drive themes, though some are meant to be driven by other components. Here is a list of those with built-in functionality.

> - Visited: the Interactable has been clicked.
> - Toggled: The button is in a toggled state or Dimension index is an odd number.
> - Gesture: The hand or controller was pressed and has moved from the original position.
> - VoiceCommand: A speech command was used to trigger the Interactable.
> - PhysicalTouch: A touch input is currently detected, ***use NearInteractionTouchable to enable.***
> - Grab: A hand is currently grabbing in the bounds of the object, use NearInteractionGrabbable to enable

### 4 `Interactable`コンポーネントを追加する

下記の画像の状態になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363822/4031a059-ae6e-cb8e-2344-315d047beac9.png)

### 5 Statusを作成する

Hololens2ではInteractionを使用する際に、どのinput要素の信号を受け取るようにするかの設定が必要になります。
HoloLens1ではReceiverという機能を使うことで、AirTapの信号などを一括して受け取っていたかと思いますが、
Holo２はstatusという独自定義ファイルを使用します。

handに関する情報を受け取るには、physicaktouchという項目を追加する必要があります。

- focus
- pressed
- targeted
- interactive
- observationTargeted
- observation
- disabled
- visited
- toggled
- gesture
- gesture max
- collision
- voice command
- physical touch
- grab
- custom

以上の項目から、レシーバーとして受け取れます。
それぞれの状態に遷移した際にアクションを起こせるようになるので、あれ？動かない？
と思ったらここの設定をせていない可能性が高いです。

画像(準備中)

### 6 Profilesを設定する

themeを設定することで、先ほどstatusで設定した項目の状態になった際のオブジェクトの状態を定義することができます。
ここで便利なのが、対象のゲームオブジェクトは自身ではなく、他のGameObjectも設定することができるので、ボタンなどにこのINTERACTIVEの設定を行い状態の変化は別のものを使用するようなことも可能になります。

themeには下記のようにたくさんの項目の状態を遷移させることができます！

※準備中

### 7 ReceiverEventを追加する

UIやUX周りのイベントはたいがいProfileで完結することができるのですが、
システム的なことを行いたい(UnityEventで発火させることにはなるが)場合は、EventReceiverを追加することで、対応するStatusを設定していればイベントの発火を行うことができます。

かなり重要なことなので二回いいますが、

Statusを設定しないとイベントの値は受け取れません！(戒め)
Andoroid8の実機にapkファイルからのアプリインストール方法

Andoroid8の実機にapkファイルからのアプリインストール方法ではurlサイトからのダウンロードではapkファイルをダブルクリックしても実行でき無いようです。そこで一番用方法は、gmailを使用し、googledrive経由でインストールする方法が良いようです。手順は
下記にて確認下さい。
Chromeで新しいタブを選択し下記よりドライブを選択
![スクリーンショット 2020-02-20 17.34.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/b5e9e0e9-ec46-bfad-e0d2-353003251b4c.png)
![スクリーンショット 2020-02-20 17.35.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/efcb899c-58f9-bee2-c13e-bd836502e77a.png)
apkファイルを選択しgoogledriveへアップロードする。
![スクリーンショット 2020-02-20 17.35.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/741153d8-5672-18ef-7b9a-45d376b63103.png)
メール作成
![スクリーンショット 2020-02-20 17.35.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/d4a90132-f9e4-10b3-6f65-426d2e1afa6a.png)
下部のgoogledriveのアイコンクリック
![スクリーンショット 2020-02-20 17.37.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/916b6e3e-53c1-03e9-b61e-f819c9bc0b99.png)
添付するapkファイル選択
![スクリーンショット 2020-02-20 17.39.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/97454d17-d0f1-d378-2236-acfbb9d02388.png)
下記の様に添付ファイル名が確認できます。
![スクリーンショット 2020-02-20 17.39.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/c65b8c3a-2b47-0999-3c38-027a68751c37.png)
配信先メールより添付のをクリックでメッセージに従いスマホ側で不明アプリ利用の許可をえてインストールが行なえます。
Salesforce DevToolsをお勧めする理由（２）→検索SOQL文の自動生成と検索データがエクスポートできる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442974/584366c8-7e50-578f-a8b6-ff1e59b7e06a.png)
PCの基本スペックをラベル印刷するためにテキストで取得する

![Label](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539563/eaeffd8d-f9ef-93cd-c8e1-45ad5f299475.jpeg)

Powershellで

```powershell
Write-Host "OS:`t" (Get-WmiObject Win32_OperatingSystem).Caption
Write-Host "CPU:`t" (Get-WmiObject Win32_Processor).Name
Write-Host "Memory:`t" ([System.Convert]::ToInt32((Get-WmiObject Win32_ComputerSystem).TotalPhysicalMemory/(1024*1024*1024))) "GB"
Write-Host "GPU:`t" (Get-WmiObject Win32_VideoController).Name
pause
```

- `Write-Host` でそのあとに続く引数をテキストでPowerShellに出力
- `Get-WmiObject` でオブジェクトを得る
- メモリについては Byte から GB に変換した上で ToInt32 で丸める
- `` `t `` はタブ

↑のファイルを `.ps1` フォーマットで作成し、右クリックして `Run with PowerShell` で実行できますが、権限の関係でできないかもしれません。
その場合はセミコロン区切りで１行にして PowerShell にコピペして実行が楽だと思います。

```powershell
Write-Host "OS:`t" (Get-WmiObject Win32_OperatingSystem).Caption;Write-Host "CPU:`t" (Get-WmiObject Win32_Processor).Name;Write-Host "Memory:`t" ([System.Convert]::ToInt32((Get-WmiObject Win32_ComputerSystem).TotalPhysicalMemory/(1024*1024*1024))) "GB";Write-Host "GPU:`t" (Get-WmiObject Win32_VideoController).Name
```

実行すると次のようなテキストが得られます。

```text
OS:      Microsoft Windows 10 Home
CPU:     Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz
Memory:  16 GB
GPU:     NVIDIA GeForce GTX 1080 Ti
```

これをどうにかしてテプラで印刷します。
Re:Viewで数式をSVGで埋め込んだepubを作成する手順

# Re:Viewで数式をSVGで埋め込んだepubを作成する手順

細かい躓きポイントがあったのでメモ。

## ベースに使った環境：

- [TechBooster/ReVIEW\-Template: TechBoosterで利用しているRe:VIEWのテンプレート（B5/A5/電子書籍）を公開しています](https://github.com/TechBooster/ReVIEW-Template)
- Dockerイメージ：vvakame/review

## 実行手順

文書ファイルは冒頭にあげたベース環境のファイルに一部を変更して使用。

まず、`articles/article.re`の末尾に下記を追記

```:articles/article.re
== 数式チェック！！

//texequation{
\sum_{i=1}^nf_n(x)
//}

@<m>{y = \alpha x ^ 2 + \beta x + \gamma}
```

次に、`articles/config.yml`を変更。
（変更箇所のみ記載。一部本質でない項目も含む）

```yaml:articles/config.yml
imgmath: true
imgmath_options:
  format: svg
  fontsize: 24
  lineheight: 32
  pdfcrop_pixelize_cmd: "pdftocairo -svg -r 90 -f %p -l %p %i %o"
```

epubを生成する。

```sh:epubを生成する
# npm run epub
```
protocolでstaticな関数

ただのメモです。
Swift 4だか5だか。

# 定義

```swift
protocol P {
    static func staticFunc() -> String
}
extension P {
    static func staticFunc() -> String {return "default"}
}
class A: P {
    static func staticFunc() -> String {return String(describing: self)}
}
class B: P {}
class C: A {}
class D    {}
//class E: A {
//  static override func staticFunc() -> String {return "hogehoge"}
//}
//error: cannot override static method
```

# 実行

```swift
[A.self, B.self, C.self, D.self].forEach {
    if let type = $0 as? P.Type {
        print("\(type): \(type.staticFunc())")
    }
}
//A: A
//B: default
//C: C
```

* `D`は`P`に準拠していないので呼び出されない。
* overrideは出来ない。
Salesforce DevToolsをお勧めする理由（１）→オブジェクト定義書の自動生成

Salesforce DevToolsを使って、オブジェクト定義書が自動生成できます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442974/de510acb-17a0-f73a-3022-9aad53337013.png)
【React】this.setStateの即時反映

#困ったこと
Formの入力欄をリアルタイムでバリデーションしたいけど，this.setStateが即時に反映されない．

```react:.js
class Form extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      foo: 1
    };
  }
  
  foo_setTwo = () => {
    this.state({ foo: 2 });
    console.log(foo); // foo : 1
  }
}
```

#解決法
コールバックで呼び出すか，reactのライフサイクルでcomponentDidUpdateメソッドを使うか．

```react:.js
  foo_setTwo = () => {
    this.state({ foo: 2 }, () => {
      console.log(foo); // foo : 2
    });
  }

  componentDidUpdate(prevProps, prevState, snapshot){
    console.log(this.state.foo); // foo : 2
  }
```
SQL select

#SQL SELECT文　基礎

```
SELECT カラム名,カラム名

FROM テーブル名;
```


#条件指定

```
SELECT *
*を付けると全てのカラムを習得してくる
一意の時と比べると少し遅いらしい

FROM テーブル名

WHERE カラム名　= 条件;
条件はデータ型に注意して記述する。
```

#LIKE演算子
ある文字列を習得したい場合はLIKE演算子を使用する
一緒に覚えておくといいのが『ワイルドカード』と言う言葉
意味はどんな文字列にもマッチする的な
LIKE演算子の中では「％」をワイルドカードという。

* %文字列% 全てを含む
* 文字列%  前方一致
* %文字列　後方一致

```
SELECT *

FROM テーブル名

WHERE カラム名　LIKE %文字列%;
```

#NOT演算子
特定の文字列に一致、含まないデータを習得する場合は
NOT演算子を使用する。

```
SELECT *

FROM テーブル名

WHERE NOT 条件;


SELECT *

FROM テーブル名

WHERE NOTカラム名　LIKE %文字列%;
```

#NULLのデータを習得

```
SELECT *

FROM テーブル名

WHERE カラム名　IS NULL；
```
#NULLではないデータの習得
```
SELECT *

FROM テーブル名

WHERE カラム名　IS NOT NULL；
```

#AND、OR 演算子
ANDはかつ

OR、どちらか

```
SELECT *

FROM テーブル名

WHERE カラム名 = 条件１

AND カラム名　＝　条件２；


SELECT *

FROM テーブル名

WHERE カラム名 = 条件１

OR カラム名　＝　条件２；
```
#LIMIT 習得件数の制限
データの習得件数を制限したい場合につかう。

```
５件習得したい場合
SLECT *

FROM テーブル名

LIMIT ５；

条件指定
SLECT *

FROM テーブル名

WHERE カラム名　条件

LIMIT ５；
```

#ORDER BY 習得データの並び替え

ASC 昇順　１、２、３

DESC 降順　３、２、１

```
SELECT *

FROM テーブル名

ORDER BY カラム名　DESC または　ASC

条件指定
SELECT *

FROM テーブル名

WHERE カラム名　条件

ORDER BY カラム名　DESC または　ASC；

習得件数制限
SELECT *

FROM テーブル名

ORDER BY カラム名　DESC または　ASC；

LIMIT ５；
```
docker desktop ver 2.2、insecure-registriesどこ行ったんだ問題

前のバージョンまでは`Preferences -> Advanced`でGUIから設定できた`insecure-registries`ですが、v2.2になって設定のGUIが大きく変わったあげく、見つからない……

と思ったら、ここでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102032/6caca782-53e9-93d2-3078-33cb5e426255.png)
JSON形式でホストを指定してあげてください。
Docker入門｜基本コマンド等

## インストール

### Docker

`$ brew install docker docker-machine`

### Docker Compose

`$ brew install docker-compose`



## 状況確認

### 起動中コンテナ確認

`$ docker ps`

### 停止中を含む全てのコンテナ確認

`$ docker ps -a`

### コンテナの稼働確認

`$ docker stats`

### 現状のイメージの確認

`$ docker images`

### イメージの詳細確認

`$ docker inspect [オプション] [コンテナ識別子またはイメージ識別子]`

### Docker のバージョン確認

`$ docker -v`

### Docker Compose のバージョン確認

`$ docker-compose -v`

### Dockerの実行環境確認

`$ docker info`



## 生成/起動

### コンテナの生成＋起動

`$ docker run [オプション] イメージ名[:タグ名] [引数]`

### コンテナの起動

`$ docker start [オプション] [コンテナ識別子]`

### コンテナの再起動

`$ docker restart [オプション] [コンテナ識別子]`

### DockerfileからDockerイメージの作成

`$ docker build -t [生成するイメージ名]:[タグ名] [Dockerfileの場所]`

[Dockerfileの場所]は、ビルドコンテキストの指定でもある。

--no-chash オプションをつけると、ビルド済みの部分もビルドし直す。

### Docker Compose からの起動

`$ docker-compose up -d`

### Docker Compose からDockerイメージの作成

`$ docker-compose build`



## 停止
### コンテナの停止

`$ docker stop [コンテナIDもしくはコンテナ名]`

一括停止の場合は以下のコマンド

`$ docker stop $(docker ps -q)`

### Docker Compose からの停止

`$ docker-compose stop`

コンテナの停止と削除を行う場合は以下のコマンド

`$ docker-compose down`



## 削除

### コンテナの削除

`$ docker rm [コンテナID]`

コンテナIDの複数指定OK

一括削除の場合は以下のコマンド

`$ docker rm `docker ps -a -q``

docker ps -a -q は、コンテナIDの一覧表示


### イメージの削除方法

`$ docker rmi [イメージID]`

イメージの前にコンテナを削除する必要あり。

forceオプション（以下）で強制削除も可能。ただしコンテナは残る。

`$ docker rmi -f [イメージID]`


### ※削除時は順番を考慮する必要あり

削除を行う際は、下記順番を考慮して作業をすすめる必要あり。

1. 起動中のコンテナを停止する
2. 停止中のコンテナ
3. Dockerイメージ

（理由）
- 起動中のコンテナは削除できない
- コンテナが存在すると、そのコンテナで使用しているイメージは削除できない



## その他

### Docker Hubへのログイン

`$ docker login`

### Docker Hubへのイメージアップロード

`$ docker push イメージ名[:タグ名]`

### Docker Hubからのログアウト

`$ docker logout`
WordPressのカスタム投稿タイプを作成する方法（プラグイン編）

今回はプラグインを使ってカスタム投稿タイプを作ります。

# Custom Post Type UI
[Custom Post Type UI](https://ja.wordpress.org/plugins/custom-post-type-ui/)というプラグインを使います。
適当に検索してインストールしましょう。
![Custom Post Type UIインストール](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128044/77081cd6-d857-9efb-fb06-26a617340d10.png)

インストールが出来て有効化すると左メニューに **CPT UI** というメニューができ、ここからカスタム投稿タイプを作成することができます。
ちなみにカスタムタクソノミーも作れるみたいです。
![インストール後](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128044/93fc5afc-ec65-bc68-c626-32db94fdc957.png)

# 作ってみよう！
**CPT UI** メニューの投稿タイプの追加と編集

大項目が3つで
 
 * 基本設定
 * 追加ラベル
 * 設定

です。
基本設定のみ必須項目があるので、これだけ入力すればもうできあがりです。
必須項目も3つだけで

 * 投稿タイプスラッグ
 * 複数形のラベル
 * 単数形のラベル
 
だけです。
このプラグインは`functions.php`に書いてた以下の記述

```php
register_post_type(
  'oreore_qiita',
  [
    'label' => 'Qiitaの投稿',
    'public' => true,
  ]
);
```

と同じことをUIから出来るイメージですね！

投稿タイプスラッグ → `$post_type`
複数形のラベル、単数形のラベル → `$args['label']`

といった感じです。

![登録](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128044/38f057ae-bdae-2a92-ce79-9148f4169eba.png)

全然難しいところはなく作成できます。
注意すべきは、デフォルト値が自分でコード書くのとは違い、Custom Post Type UIの設定になるということぐらいです。
Custom Post Type UIは初期からREST APIを使えるようにしているので、ここで作ったカスタム投稿タイプはWordPress REST APIで取得できます。

# まとめ
プラグインを使ってカスタム投稿タイプを作成しました。
基本的にこれで充分なのでわざわざ`functions.php`に自分でコード書く必要はないかなと感じました。
ただ、エンジニアとしては裏側でどんなことをしているかを抑えられるのは良いことなので、自分でコードを書く方法を一度試した上で、プラグインを使うと良いのかなと思います。
[Java] Javaは + で文字列連結しても大丈夫と言われていたので確かめた

# 試したこと

こんなファイルを作り

```java:PlainString.java
import java.time.LocalDateTime;

class PlainString {
    String getString() {
        // え！文字列 + で連結しちゃうの！？
        return "abc" + LocalDateTime.now();
    }
}
```

コンパイルし

```console
javac PlainString.java
```

# JDK8の場合

## 結果

逆コンパイルしてみました。

```console
javap -c PlainString
Compiled from "PlainString.java"
class PlainString {
  PlainString();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  java.lang.String getString();
    Code:
       0: new           #2                  // class java/lang/StringBuilder
       3: dup
       4: invokespecial #3                  // Method java/lang/StringBuilder."<init>":()V
       7: ldc           #4                  // String abc
       9: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      12: invokestatic  #6                  // Method java/time/LocalDateTime.now:()Ljava/time/LocalDateTime;
      15: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
      18: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      21: areturn
}
```

しっかり `StringBuilder` に置き換えられていました。

## 結論

~~イマドキのJavaは、とくに気を使わずに + 使って文字列連結して大丈夫そうです。~~
**2020/2/22追記** @cfm-art さんからコメントいただきました。ありがとうございます。
単純に連結するだけであれば + で大丈夫。
ループのなかで + を使うと、その度に`StringBuilder`が作られるのでダメ。

## 環境

* Ubuntu 18.04.4 LTS
* OpenJDK 8u242-b08-0ubuntu3~18.04

# 【2020/2/22追記】 JDK13の場合

JDK11 以降は StringBuilder 使われていないと教えていただいたので、試してみました。

## 結果

javacしてからjavapしました。

```console
javap -c PlainString                                                                                                      Compiled from "PlainString.java"
class PlainString {
  PlainString();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  java.lang.String getString();
    Code:
       0: invokestatic  #7                  // Method java/time/LocalDateTime.now:()Ljava/time/LocalDateTime;
       3: invokedynamic #13,  0             // InvokeDynamic #0:makeConcatWithConstants:(Ljava/time/LocalDateTime;)Ljava/lang/String;
       8: areturn
}
```

`StringBuilder`が消えて、`makeConcatWithConstants`というものに変わっていました。

## 結論

文字列連結にどこでも + 使って大丈夫そう。

## 環境

openjdk version "13.0.2" 2020-01-14
OpenJDK Runtime Environment AdoptOpenJDK (build 13.0.2+8)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 13.0.2+8, mixed mode, sharing)
無料のSelf-Hosted CIツールを探してみた


下記の条件で、CIツールを探しました。

- Self-Hostedできる（AWS上でHostしたい）
- 無料で使える（予算確保してない）
- Windows/Linuxの両方をCIできる
- BacklogのGitと連携できる← Github.comならGithub Action一択なのだが・・・

## Github.com / Github Enterprise

- Github Flow/Actions で、お手軽CIが可能。
    - クラウド版（Github.com）でも、無償範囲（処理時間、数千分/月が無償）で、結構いける。
    - オンプレの場合は、github Enterprise（お高い）。かつ、Github Flow/Actionsはまだ対応してない模様。

## Azure DevOps(Azure Pipeline)

- クラウド版なら、Azure DevOpsが無料で５名まで使える。Pipelineで、お手軽CIできる（MS Hosted CI/CD 1800 minutes）
    - Azure Boards（Issue管理）との連携もGood。
- オンプレの場合は、Team Foundation Serverを使う？面倒すぎて敬遠。

## CircleCI

- CloudはFreeプランが有るが、Self-Hostedは有償のみ？（ユーザーあたり月額$35。） → 無理

## TravisCI

- Cloudのみの模様。（Enterpriseはあるが、当然お高いと思う） → 無理

## Bamboo

- ATLASSIN社。この時点で面倒そう。
- 30 日間無料のトライアルあり。JPY 1,200の買い切りプランあり。 → 無理

## GitLab

- FreeでCIできるっぽいが、Git管理機能が余計。 → 無理

## TeamCity

- JetBean社。
- Freeあり（BuildConfig100件まで。Build Agent 3まで） https://www.jetbrains.com/ja-jp/teamcity/buy/#new
- Dockerイメージあり！ https://www.jetbrains.com/ja-jp/teamcity/download/#section=docker
- Windows/Linuxの両方に対応できるっぽい。https://www.jetbrains.com/help/teamcity/supported-platforms-and-environments.html#SupportedPlatformsandEnvironments-Platforms(OperatingSystems)

って事で、TeamCityを試用してみます！ ←誰に報告しているんだ？
docker-composeで起動中のログにアタッチする方法

`docker-compose up -d $serviceName` でコンテナを起動した時、logの出力を確認するには
`docker-compose logs $serviceName`で確認できる
ただこの場合だとそれ以降のlogを取得するには再度同じコマンドを打たなければならない

docker-composeででタッチ起動したコンテナのlogを出力させ続けるには以下のコマンドを打つ

`docker-compose logs -f $serviceName`

`-f`または`--follow`オプションをつけることでその後もログを出力させ続けることができる
【django version up】TextFiledを保存するときのstringへの変換の仕方が変わった

# 背景
Djangoのバージョンを`1.11.1`から`2.2`へあげると、バイト文字列で保存したTextFieldsの値が取り出した時に、
`b'...'`と皮まで保存されるようになっていた。

# 結論
- decodeを使ってstring型に変換していたのがstr()を使ってstring型へ変更するようになっていた。
- str()を使うと改行文字がエスケープされたり、b''まで文字列に含まれたりする。

# 参考
### version 1.11.1
- s = s.decode(encoding, errors)
- https://docs.djangoproject.com/ja/1.11/_modules/django/db/models/fields/

```django.db.models.fields.py
from django.utils.encoding import (
    force_bytes, force_text, python_2_unicode_compatible, smart_text,
)

class TextField(Field):
    description = _("Text")

    def to_python(self, value):
        if isinstance(value, six.string_types) or value is None:
            return value
        return force_text(value)
```

```django.utils.encoding.py
def force_text(s, encoding='utf-8', strings_only=False, errors='strict'):
    """
    Similar to smart_text, except that lazy instances are resolved to
    strings, rather than kept as lazy objects.

    If strings_only is True, don't convert (some) non-string-like objects.
    """
    # Handle the common case first for performance reasons.
    if issubclass(type(s), six.text_type):
        return s
    if strings_only and is_protected_type(s):
        return s
    try:
        if not issubclass(type(s), six.string_types):
            if six.PY3:
                if isinstance(s, bytes):
                    s = six.text_type(s, encoding, errors)
                else:
                    s = six.text_type(s)
            elif hasattr(s, '__unicode__'):
                s = six.text_type(s)
            else:
                s = six.text_type(bytes(s), encoding, errors)
        else:
            # Note: We use .decode() here, instead of six.text_type(s, encoding,
            # errors), so that if s is a SafeBytes, it ends up being a
            # SafeText at the end.
            s = s.decode(encoding, errors)
    except UnicodeDecodeError as e:
        if not isinstance(s, Exception):
            raise DjangoUnicodeDecodeError(s, *e.args)
        else:
            # If we get to here, the caller has passed in an Exception
            # subclass populated with non-ASCII bytestring data without a
            # working unicode method. Try to handle this without raising a
            # further exception by individually forcing the exception args
            # to unicode.
            s = ' '.join(force_text(arg, encoding, strings_only, errors)
                         for arg in s)
    return s
```

### version 2.2
- str(value)
- https://docs.djangoproject.com/ja/2.2/_modules/django/db/models/fields/

```django.db.models.fields.py
class TextField(Field):
    description = _("Text")

    def to_python(self, value):
        if isinstance(value, str) or value is None:
            return value
        return str(value)
```
nfs時にaccess denied by server while mounting example.comが出た場合

# TL;DR
VirtualBoxでNFSを使う場合は/etc/exportsにinsecureをつける
# 現象
 VirtualBoxの中からnfs mountを試みた時に以下のエラーがでた。

```
mount.nfs4: access denied by server while mounting example.com:/
```

その時のexportsは以下の通り。

```:/etc/exports
“/home/data” 192.168.10.0/24(rw,no_subtree_check,no_root_squash,fsid=0) 10.255.0.0/24 (rw,no_subtree_check,no_root_squash,fsid=0)
```

# 原因
nfsサーバーの/etc/exportsにsecureが付いている(default:secure)と1024以下のportのみしか許可しない。
VirtualBoxを使用している場合、ホストOS経由のnfs mountになる.ゲストOS側では1024以下のport番号であっても、NATになっている場合、ホストOSから出るパケットは1024より大きなport番号になることがある。
そのためaccess deniedとなる。

wiresharkでパケットをキャプチャすると、以下のエラーが出ていたため気づくことができた。

```
PUTROOTFH | GETATTR Status: NFS4ERR_PERM
```

# 対策
/etc/exportsにinsecureをつける。
1024以上のport開けるのも嫌だが、他の解決方法が現在思いついていない。
yarn global add でインストールしたコマンドが実行できなかった場合の対処

yarn global add で、インストール成功したのに、実行しようとしたら「そんなコマンドはない！」って怒られたときの対処方法です。

## 症状

```
$ yarn global add n
yarn global v1.21.1
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
success Installed "n@6.2.0" with binaries:
      - n
Done in 0.35s.

$ n
n: command not found
```

## 調査

### インストールパッケージ一覧

```
$ yarn global list --depth=0
yarn global v1.21.1
info "n@6.2.0" has binaries:
   - n
Done in 0.10s.
```

インストールされている！

### binの場所

```
$ yarn global bin
/home/seya/.yarn/bin
```

### PATHの確認

```
$ echo $PATH
/home/seya/.vscode-server/bin/c47d83b293181d9be64f27ff093689e8e7aed054/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/ProgramData/DockerDesktop/version-bin:/mnt/c/Program Files/Docker/Docker/Resources/bin:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/WINDOWS/System32/OpenSSH/:/mnt/c/Program Files/Git/cmd:/mnt/c/Program Files/dotnet/:/mnt/c/Program Files (x86)/Nodist/bin:/mnt/c/Program Files (x86)/Google/Cloud SDK/google-cloud-sdk/bin:/mnt/c/Program Files/PuTTY/:/mnt/c/Users/seya.DORASU/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/seya.DORASU/AppData/Local/Programs/Microsoft VS Code/bin:/mnt/c/Users/seya.DORASU/AppData/Local/Programs/Microsoft VS Code Insiders/bin:/mnt/c/Program Files/heroku/bin:/mnt/c/Program Files (x86)/sox-14.4.2:/mnt/c/Program Files:/snap/bin
```

(WSL上で実行しているので、Windowsのパスがいっぱい！）

/home/seya/.yarn/bin
はPATHにない！！！！

## 対処方法

yarn global add でインストーるされる場所に、PATHが通っていあないので、コマンドが無いと怒られていたらしい。

対処方法としては２つ
1. PATHを追加
2. yarnでインストールされる場所を変更する

今回は、すでにnコマンドをインストールしているので、PATHを追加する方法を試してみます。

### PATHを追加

```~/.bashrc``` に、以下の行を追加します。

```sh
export PATH="$HOME/.yarn/bin:$PATH"
```

bashを再度立ち上げて、確認。

```
$ echo $PATH
/home/seya/.yarn/bin:/home/seya/.vscode-server/bin/c47d83b293181d9be64f27ff093689e8e7aed054/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/ProgramData/DockerDesktop/version-bin:/mnt/c/Program Files/Docker/Docker/Resources/bin:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/WINDOWS/System32/OpenSSH/:/mnt/c/Program Files/Git/cmd:/mnt/c/Program Files/dotnet/:/mnt/c/Program Files (x86)/Nodist/bin:/mnt/c/Program Files (x86)/Google/Cloud SDK/google-cloud-sdk/bin:/mnt/c/Program Files/PuTTY/:/mnt/c/Users/seya.DORASU/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/seya.DORASU/AppData/Local/Programs/Microsoft VS Code/bin:/mnt/c/Users/seya.DORASU/AppData/Local/Programs/Microsoft VS Code Insiders/bin:/mnt/c/Program Files/heroku/bin:/mnt/c/Program Files (x86)/sox-14.4.2:/mnt/c/Program Files:/snap/bin
```

```/home/seya/.yarn/bin``` が最初に追加されています。

## 確認

### コマンドの場所確認

```
$ which n
/home/seya/.yarn/bin/n
```

ちゃんとパスが通っているようです。

### コマンド実行

```
$ n --lts
12.16.1
```

実行できました！！！
ListとArrayとSeqの使い分け

ListとArrayとSeq、どれもよう似てるけど、結局何が違うねん？と思って違いを調べてみた。

ざっくり言えば、以下の結論になった。

* 不変性のList
* 可変性とパフォーマンスのArray
* 遅延評価とメモリ節約のSeq

##List&Array
ListとArrayは一回こっきり生成する。
だから要素数が特大な場合は、メモリに詰め切れなくて死ぬ事もある。

ListとArrayの差は、ざっくり言えばデータ構造的にはLinkedListかArrayListの差。

###List
利点はデータの不変性を証明できる事。

ただ、パフォーマンス面では注意が必要。
リストの要素追加はなるべくcons(::)を使う。
consだとリスト先頭のポインタを変更するのみで済む。

一方List.appendは第一引数のリストの全コピー処理が発生するのでパフォーマンス面で不利。
スライスを使ってアクセスする時も、リストの後半を指定すればするほど不利になる。

```fsharp:List
let nums =
    [
        for i in 1 .. 5 do
            printfn "create %d" i
            yield i
    ]

List.item 4 nums |> printfn "%d"
List.item 2 nums |> printfn "%d"

// 文法エラーになる
// nums.[4]  <- 56

// consは先頭に要素を1個しか足せないが超早い
56::nums |> printfn "%A"
// appendは要素を複数足せるが、内部的に第一引数の要素は全コピーしないといけない
List.append [50..62] nums |> printfn "%A"

// スライス
[50..62].[10..11] |> printfn "%A"
```

```
create 1
create 2
create 3
create 4
create 5
5
3
[56; 1; 2; 3; 4; 5]
[50; 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 1; 2; 3; 4; 5]
```
###Array
Arrayは中身がmutableである。

インデックスアクセスが必要な場合と、要素の変更が必要な場合に適している。
生成、インデックスアクセス共に、SeqとListの比にならないくらい圧倒的に早い。

ただし、Arrayは参照型であり、単純に別の束縛を作ってもコピーにはならない。
スライスの[*]を使うことで、全コピーを作る事ができる。

あとは、C#と違い、=で比較できるのがF#Arrayの強み。
同じ長さ、同じ中身なら同値と判定してくれる。


```fsharp:Array
let nums =
    [|
        for i in 1 .. 5 do
            printfn "create %d" i
            yield i
    |]

Array.item 4 nums |> printfn "%d"
Array.item 2 nums |> printfn "%d"

// エイリアスとなる
let nums2 = nums

// エイリアスにしたくない時はスライスでコピー
let nums3 = nums.[*]

// Arrayは中身はmutable
nums.[4]  <- 56
nums.[4] |> printfn "%A"

// 実体は同じなのでこっちも変更後の値が出る
nums2.[4] |> printfn "%A"

// これはそのまま
nums3.[4] |> printfn "%A"
```

```
create 1
create 2
create 3
create 4
create 5
5
3
56
56
5
```

##Seq
Seqは中身にアクセスするたびに、再生成が行われる。
遅延評価ってこういう事か。
だからメモリは圧迫しないけど、そのかわりアクセスの度に生成コストがかかる。

使いどころは要素数が凄い量になる場合、すなわちメモリを節約しないといけない場合や、要素の値が後付けで決まる場合。

あとはyield![^1]を使って、内包表記の中で再帰を使う事ができる。
特定ディレクトリの配下の全ファイルの探索...みたいなケースにも使えるそうな。
確かにこれをArrayやListでやろうとすると、生成時にすげーコストかかって死んでしまうと思われる。

[^1]: 「いーるどばん」と読むらしい


```fsharp:Seq
let nums =
    seq {
        for i in 1 .. 5 do
            printfn "create %d" i
            yield i
    }

Seq.item 4 nums |> printfn "%d"
Seq.item 2 nums |> printfn "%d"
```

```
create 1
create 2
create 3
create 4
create 5
5
create 1
create 2
create 3
3
```

##おわりに
中身をきちんと勉強すると、パフォーマンス計測の結果がしっくりきた。
https://qiita.com/aoi_erimiya/items/6a23114d6718b0ccc5f5

目的に合わせて適切なやつ選ばなあかんよって事やね。
無線でiPhoneの画面をテレビに表示させる方法

#無線でiPhoneの画面をテレビに表示させるには？
Androidスマホなら、その画面をスマートテレビに映すのは簡単でしょう。
「iPhoneの画面をテレビに映す」と聞いたら、LightningケーブルやHDMIアダプターを利用するという方法が頭に浮かぶでしょう。
しかし、ケーブル、アダプターいっぱいでは面倒でしょう。
この記事は**無線でiPhoneをテレビにミラーリングする**方法についてご紹介します。


##事前準備
iPhone
画面ミラーリングアプリ（ここで[LetsView](https://letsview.com/jp/)という無料アプリを例として）
Adroidテレビ

##操作手順
1. まずは[LetsView](https://letsview.com/jp/)アプリをiPhoneとテレビにダウンロードして、インストールします。
![QzpcVXNlcnNccml4aWxcQXBwRGF0YVxSb2FtaW5nXERpbmdUYWxrXDYxNDM4ODUwOF92MlxJbWFnZUZpbGVzXDE1ODIxODQ1NTgwNTRfNDgxRjM0QTgtMTNEMS00NDYzLTk3ODctMjQxOUJCNEM3OUJDLnBuZw==.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417797/f5fd06e3-eb1a-73b0-4506-036245bc6b05.png)

2. iPhoneとテレビを同じWi-Fiネットワークに接続します。

3. 両方ともアプリ起動します。
4. iPhoneのコントロールセンターを開いて、「画面ミラーリング」＞「LetsView＋テレビの名前」を選択して、ミラーリングを開始します。
![QzpcVXNlcnNccml4aWxcQXBwRGF0YVxSb2FtaW5nXERpbmdUYWxrXDYxNDM4ODUwOF92MlxJbWFnZUZpbGVzXDE1ODIxODQ2ODk5NDJfMTk4ODZEMkMtNDNFMC00YzNlLUEwQzctODMxMUIwOTIwODlELnBuZw==.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417797/8165f6d6-eb6f-ab96-6fe4-84bf3d07bb2a.png)

5. iPhoneの画面はテレビに出力されます。
1日に何度もデプロイする人のためのgit操作スクリプト


文言修正などのたびにgitでマージしてデプロイするのがきついのでスクリプトで簡単にする話になります。

# いままで

ステージングブランチにfeatureブランチをマージしてデプロイする流れで説明します。
大抵は下記の流れになるかと思います

git checkout staging
git pull
git merge featureブランチ
git push
デプロイスクリプト実行など（CIが自動でやる場合は省略）

たかだか文言修正のためにコマンド5回実行は面倒ですよね。

# 改善後
下記スクリプトをコピペかスクリプトファイルにして１発実行できます。
適用したいfeatureブランチにいる状態で実行して下さい。

```bash
current_branch=`git symbolic-ref --short HEAD`
if [ ! $current_branch = "staging" ] && [ ! $current_branch = "master" ]; then
  true
else
  echo 'error. staging, master branch'
  false
fi && git checkout staging &&
git pull &&
git merge --no-edit $current_branch &&
git push &&
bundle exec cap staging deploy && # （ここは任意のデプロイスクリプトに置き換えてください）
# featureブランチに戻る場合
git checkout $current_branch
```

間違ってmasterやstagingブランチにいる状態でマージしないように最初にチェックしています（一度やらかしたので。。改善点です）

# シェルスクリプトmemo
&&で前回実行のコマンドの終了ステータス$?が成功(0)の場合のみ続けて実行されるのを利用し途中失敗しても安全にしたつもりです。
ちなみに途中でコメントはさんでも&&が正しく機能しました。下記のechoは実行されません。

```bash
false && 
# コメントテスト
echo 'test'
```

trueコマンドとfalseコマンドは地味に使えますね。
if分の中でメイン処理書きたくなかったのでこの形にしました。
fiのあとに&&で実行判断するのに終了ステータス書き換えたいなーと悩んでたらそういえばあったなと。

# 環境
Mac Mojave 標準bash

# つぶやき
各位秘蔵のマージ＆デプロイスクリプトあると思うのですが、ググってもうまく見つかなかったので書いてみました。
（シェル芸人の人たちにとっては書くほどでもないのかもしれない。。）
カスタム投稿タイプをWordPress REST APIで取得する

前回の[WordPressのカスタム投稿タイプを作成する方法（ソースいじる編）](https://qiita.com/gungungggun/items/4a89d56fb0280eef2ea2)でカスタム投稿タイプを作りました。
ここから管理画面でデータを登録して、WordPress REST APIを投げてみた所、取得できませんでした。
おそらく`register_post_type()`のパラメーターでAPIで取得できたり出来なかったりするのでしょう。
見ていきましょう。

## `show_in_rest`
これが最重要項目です。
デフォルトは`false`。
これだとWordPress REST APIでデータを返さないみたいです。
これを設定して、
`http://localhost:8000/wp-json/wp/v2/<$post_type>`
にアクセスするとデータが返ってきます。

## `rest_base `
この項目を設定するとURLを変えることが出来ます。
デフォルトは`$post_type`なので
`http://localhost:8000/wp-json/wp/v2/<$post_type>`
ですが、`rest_base => 'hoge'`としてやると
`http://localhost:8000/wp-json/wp/v2/hoge`
で取得できます。
Pythonのtry/exceptメモ

webアプリのソースコードをいじっている際、以下のような状況に出会した。

- とある関数を実行した際、特定の処理によるエラーのみスルーさせて処理を続行したい
- 成功の場合も失敗の場合も必ず実行させたい処理がある
- フロントには処理中に一部エラーが発生したことを通知したい

pythonのtry/catchでこんな感じの書き方をしたら動いたので備忘録として書き留めておく。

### サンプルコード

```python
class SampleException(Exception):
    pass


def specific_func(raise_error: bool):
    if raise_error:
        raise Exception("error from specific_func")
    else:
        print("[INFO] success specific_func")


def error_sample(raise_error: bool):
    try:
        specific_func(raise_error=raise_error)
    except Exception as e:
        print("[ERROR] ",e)
        raise SampleException("一部の処理に失敗しました")
    finally:
        print("[INFO] 必ず実行したい処理")
```


```python:main.py

print("=== 異常系 =====================")
try:
    error_sample(raise_error=True)
    print("(通知) 処理に成功しました")
except SampleException as e:
    print("(通知)", e)

print("=== 正常系 =====================")
try:
    error_sample(raise_error=False)
    print("(通知) 処理に成功しました")
except SampleException as e:
    print("(通知)", e)
```

### 実行結果

```console
=== 異常系 =====================
[ERROR]  error from specific_func
[INFO] 必ず実行したい処理
(通知) 一部の処理に失敗しました
=== 正常系 =====================
[INFO] success specific_func
[INFO] 必ず実行したい処理
(通知) 処理に成功しました
```
QiSDK アップデート情報 1.6.1～1.6.7

「[QiSDKサイト](https://qisdk.softbankrobotics.com/sdk/doc/pepper-sdk/ch5_news/index_news.html#release-notes)」の翻訳記事をレビューしていたらちょいちょい "API level 6" のタグを見かけるように。ちょっと気になったので "1.6.x" の更新内容をサラッと見てみたのでその共有です。日本で販売されているPepperには1.4.xを使えと言われてたりしますので、実用にに耐えうるかはわかりませんが、いくつか実機で動かした感じでは動きそうな雰囲気ではありました。

**追記: 2020/02/26**
1.6系を使うと、Command centerからのアプリ配信が出来なくなるようです。1.6系は2.9.4向けらしいので、実践投入はもう少し先になりそうですね。

#1.6.1
#####カスタムチャットボットで無視してフラグ(isAvailableToReply)を追加
俺はもう死んでいる。Dialogflow と連携したけどオフラインで動けねぇ見たいケースに対応できるということでしょうか。

#####Layout EditorにPepper用のテーマを追加
Speechbarが表示されるテーマがあるようです。ただ、「実機と見た目が違う場合があるときがあるから注意してねッ！」 とのこと！　えッ！？
これについては、[翻訳記事](https://qiita.com/kskrin/items/343d8a44404284a5bdf8)もあるので参考にどうぞ。

#1.6.2
#####スピーチバーの出し方にImmersiveを追加
これがめっちゃかっこいいです。個人的には1.6で一番ありがたい更新かもしれません。
![cu0ru-8gt8r.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275659/e6752556-f3a2-b293-cc94-bb0bb285e2b6.gif)

#1.6.3
#####スピーチバーの表示位置を画面下辺に移動可能に
これはいらない気も。どっちかに統一したほうが、UX良さそうだけど、どうなんだろう。
下のほうが気持ちよいということに気づいたけど、既に上で出してるアプリもあるから致し方なく両方できるようにしたとかかな。ちなみに上のgifアニは表示位置を画面下辺に移動させたものです。

#1.6.4
欠番

#1.6.5
#####GoToアクションのパラメータ追加
- 障害物よけないパラメータ：真っすぐ前に進んで障害物で前に進めなくなると目的地に到着してなくても止まるようです。従来のやつは不器用に避けようとします。
- GoToアクション実行時のPepperの向きのパラメータ：ちょっと広いころで試してみないと分からなそうですが、Pepperの向きを固定で移動を行うようです。アトリエに行った時にでも試してみようかな。
- 制限速度のパラメータ：最大速度を制限できるとのこと。デフォは0.35m/秒らしいので、100m/秒とかに設定しとけば最大速度で動いてくれそうでが、最速は知れてるので、ゆっくり動かしたいときに使う感じでしょうか。

#####電源フラップの状態が取得できるように
移動をやるアプリにとってはありがたいですね。電源フラップが開いてると移動できないので。

#1.6.6
欠番

#1.6.7
#####ApproachHumanアクションの追加
特定の人に右手を突き出しながら近づいていくようです。NAOqiであったような機能ですね。

#####Holderのバリエーションで、ホイールの動きだけ止める機能が追加
地味に使いそうなやつですね。勝手に回転しちゃうのがうっとおしくて電源フラップを開けとくんだけど、そのせいで移動できない問題が発生してたのを解決できそうです。


#まとめ
以上、超ざっくりですが、1.6系の更新内容です。全体的に移動系の修正が多そうで、これから力を入れたいといったところでしょうか。ハード的にかなり厳しそうな分野ですが移動がもりもり出来るようになったPepperを見てみたい気もしますね。

最後に、あれですが、[リニューアルされたサイト](https://developer.softbankrobotics.com/pepper-qisdk/qisdk/whats-new#release-notes)があるけど、メンテされてない。ナゼナノカァ。
AWS EC2 に Linux 立てて VSCode で 接続できるまでのメモ

# AWS EC2 に Linux 立てて VSCode で 接続できるまでの覚書

## やったこと
### EC2インスタンスの作成
1. AWSのアカウントを取得
2. AWSマネジメントコンソールにログイン
3. 東京リージョンに変更(アカウント名の横、デフォルトはオハイオ？)
4. サービスからEC2を選択し「EC2ダッシュボードを表示」
5. 左側サイドバーメニューから「インスタンス」を選択、インスタンス一覧画面が表示される
6. 「インスタンス作成」を押下
7. ステップ 1：Amazon マシンイメージ…「Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type」を選択
8. ステップ 2：インスタンスタイプの選択…「無料利用枠の対象」とついた「t2.micro」を選択 => 確認と作成 ※おそらくデフォルト
9. ステップ 7：インスタンス作成の確認「[作成] をクリックして、インスタンスにキーペアを割り当て、作成処理を完了します。」とか書いてあるけど「起動」を押下
10. 「既存のキーペアを選択するか、新しいキーペアを作成します。」みたいな画面が出てくるので「新しいキーペアの作成」を選択し、「キーペア名」を入力
11. 「キーペアのダウンロード」を押下して、キーペアを保存（接続の際に使うので大切に）、「作成」を押下
12. 作成まで少しかかるので1,2分放置

### パブリックIPアドレスを設定する

パブリックIPアドレスが変化してしまうそうなので固定する手順。

1. 現在地：EC2ダッシュボード
2. 作成したインスタンスのIPアドレスを確認(確認用)
3. 左側サイドバーメニューから「Elastic IP」を選択 => 「Elastic IP アドレス」の一覧画面が表示される
4. 「Elastic IP アドレスの割り当て」を押下→次の画面で「割り当て」を押下
5. 「Elastic IP アドレス」の一覧画面に戻り、作成したIPアドレスをクリック(パブリックIPv4 アドレスのところ)
6. 「Elastic IP アドレスの関連付け」押下
7. インスタンス欄をクリックして、先ほど作成したインスタンスを指定、それ以外はデフォルトで「関連付ける」を押下
8. インスタンス一覧に戻って確認してみると、IPアドレスが作成したもに変わっているはず

### セキュリティグループの設定

なんかやるって書いてあったからやるけど、これなんだよと思ったワシの読んだもの
↓
[Linux インスタンスの Amazon EC2 セキュリティグループ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-security-groups.html)

ファイアウォールらしい。

1. インスタンス一覧から作成したインスタンスのセキュリティグループをクリック
2. インバウンドタブの「編集」を押下
3. 「HTTP」と「HTTPS」を追加
4. 「保存」を押して完了

### VSCode関連のインストールと設定

1. VSCode をインストール
2. Remote SSH (プラグイン) をインストール
3. その後、VSCode再起動
4. Ctrl + P => Remote-SSH:Connect To Host => Configure SSH Hosts
5. 「C:\Users\XXXXX(ユーザー名)\.ssh\」に、ダウンロードしておいたキーペアを配置（フォルダが無かったら作ってください）
6. C:\Users\XXXXX(ユーザー名)\.ssh\config に 以下の内容に変更して保存

   ```config
      # Read more about SSH config files: https://linux.die.net/man/5/ssh_config
      Host aws.ec2-user
         User ec2-user
         HostName XX.XX.XX.XX # IPアドレス
         identityFile ~/.ssh/XXXXXXXXX.pem # キーペア名
   ```

### つなげてみる
1. Ctrl + P => Remote-SSH:Connect To Host => aws.ec2-user
2. 繋がったらOK！！！
wxListCtrlのカラムクリックのソート

wxListCtrlでカラムクリックしたときに、降順昇順方法をぐぐっていたら下記の記事を見つけたら動作しなかったので
自分でちょっと修正してみました。

https://bty.sakura.ne.jp/wp/archives/42

```ruby:wxListCtrl.py
#!/usr/bin/env python
#coding:utf-8
 
 
import wx
 
caption = (u"No",u"都道府県",u"男女計",u"男",u"女")
 
data = [
(1,u"北海道",5570,2638,2933),
(2,u"青森県",1407,663,744),
(3,u"岩手県",1364,652,712),
(4,u"宮城県",2347,1140,1208),
(5,u"秋田県",1121,527,593),
(6,u"山形県",1198,575,623),
(7,u"福島県",2067,1004,1063),
(8,u"茨城県",2969,1477,1492),
(9,u"栃木県",2014,1001,1013),
(10,u"群馬県",2016,993,1024),
(11,u"埼玉県",7090,3570,3520),
(12,u"千葉県",6098,3047,3051),
(13,u"東京都",12758,6354,6405),
(14,u"神奈川県",8880,4484,4396),
]
 
class MyTable(wx.ListCtrl):
    def __init__(self,parent):
        wx.ListCtrl.__init__(self,parent,-1,style = wx.LC_REPORT | wx.LC_VIRTUAL)
        self.InsertColumn(0,caption[0],wx.LIST_FORMAT_CENTER)
        self.InsertColumn(1,caption[1])
        self.InsertColumn(2,caption[2],wx.LIST_FORMAT_RIGHT)
        self.InsertColumn(3,caption[3],wx.LIST_FORMAT_RIGHT)
        self.InsertColumn(4,caption[4],wx.LIST_FORMAT_RIGHT)
        self.items=data
        self.SetItemCount(len(self.items))
        self.Bind(wx.EVT_LIST_COL_CLICK,self.Sort)
        self.prevColumn = None
        self.sortAcend = True
 
    def OnGetItemText(self,line,col):
        return str(self.items[line][col])
 
    def Sort(self,event):
        global data
        col=event.GetColumn()
        if col != self.prevColumn:
            self.sortAcend = True
        else:
            if self.sortAcend:
                self.sortAcend = False
            else:
                self.sortAcend = True
        if self.sortAcend:
            data = sorted(data, key=lambda x: x[col])
        else:
            data = sorted(data, key=lambda x: x[col], reverse=True)
        self.prevColumn = col
        self.DeleteAllItems()
        self.items=data
        self.SetItemCount(len(self.items))
 
class MyWindow(wx.Frame):
    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,"MyTitle",size=(450,300))
        MyTable(self)
 
if __name__=='__main__':
    app=wx.App(False)
    frame=MyWindow(parent=None,id=-1)
    frame.Show()
    app.MainLoop()
```
create-nuxt-appでエラーが出る


# 起こった問題

以下の設定で `create-nuxt-app` した時に

```
% yarn create nuxt-app aiue

create-nuxt-app v2.14.0
✨  Generating Nuxt.js project in aiue
? Project name aiue
? Project description My impeccable Nuxt.js project
? Author name mur71mur
? Choose the package manager Yarn
? Choose UI framework Bulma
? Choose custom server framework Express
? Choose Nuxt.js modules Axios, Progressive Web App (PWA) Support
? Choose linting tools ESLint, Prettier
? Choose test framework Jest
? Choose rendering mode Single Page App
? Choose development tools (Press <space> to select, <a> to toggle all, <i> to invert selection)
```


```
throw new SAOError(`Failed to install ${packageName} in ${cwd}`)
```

というエラーが出た。
この時のnodeのversionは

```
% node -v
v10.10.0
```

# 調査
設定をいじってたらeslintがある時にこのエラーが出てることが判明したので

```
% yarn add -D eslint
```
eslintだけをinstallしてみると

```
eslint@6.8.0: The engine "node" is incompatible with this module. Expected version "^8.10.0 || ^10.13.0 || >=11.10.1". Got "10.10.0"
```

nodeのversionがダメと言われる。

# 解決策

とりあえずエラー文に従って

```
% node -v
v12.6.0
```

にするとeslintを設定しても `create-nuxt-app` できる。
pymc3でガウス過程

こちらのサイトで見つけたシャンプーの売上に関するデータを用いてGaussian Processによって推定してみようと思います。

https://machinelearningmastery.com/time-series-datasets-for-machine-learning/

ガウス過程はノンパラメトリックの代表的な回帰モデルです。
非線形性のあるデータに強かったり、推定の不確実性を確認できるといったメリットがあります。





```py
import os
import pandas as pd
shampoo_df = pd.read_csv('../data/shampoo.csv')
shampoo_df
shampoo_df.plot.line(x='Month', y='Sales',c="k");
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180524/8680c755-1139-083b-1409-9f0f6209e512.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180524/5fe13164-c6ff-3218-b7c6-cb90aa7e0b34.png)

以下では、適切な尤度と事前分布のペアを得るために、周辺尤度を算出しています。

```py

with pm.Model() as shampoo_model:
    ρ=pm.HalfCauchy('ρ', 1) # これらはLength scale 大きい値ほど、近い動きに見える　<＝自己相関的な
    η = pm.HalfCauchy('η', 1) # これらはLength scale 大きい値ほど、近い動きに見える　<＝自己相関的な
    
    M = pm.gp.mean.Linear(coeffs=(shampoo_df.index/shampoo_df.Sales).mean()) # 初期値
    K= (η**2) * pm.gp.cov.ExpQuad(1, ρ)

    σ = pm.HalfCauchy('σ', 1)
    gp = pm.gp.Marginal(mean_func=M, cov_func=K) 
    gp.marginal_likelihood("recruits", X=shampoo_df.index.values.reshape(-1,1), 
                           y=shampoo_df.Sales.values, noise=σ)
    trace = pm.sample(1000)

pm.traceplot(trace);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180524/7c237556-d12d-260e-00b1-92f4634c02f1.png)


最尤推定は、尤度関数p(X｜θ)をパラメータθに関して最大化することで当てはまりの良いモデルを作って行くのですが、事前分布p(θ)を使いません。一方、事前分布がある場合を最大事後確率推定というらしいです。

詳しくは以下の本を参照ください。
須山敦志. 機械学習スタートアップシリーズ　ベイズ推論による機械学習入門 (Japanese Edition) (Kindle Locations 2154-2156). Kindle Edition. 




最大事後確率推定によって最適なパラメータを得る。


```py

with shampoo_model:
    marginal_post = pm.find_MAP()
```

{'ρ_log__': array(2.88298779),
 'η_log__': array(5.63830367),
 'σ_log__': array(4.13876033),
 'ρ': array(17.86757799),
 'η': array(280.98567051),
 'σ': array(62.72501496)}




```py

X_pred=np.array([r for r in range(X_pred.max()+10)]).reshape(-1,1)

with shampoo_model:
    shampoo_pred = gp.conditional("shampoo_", X_pred)
    samples=pm.sample_ppc([marginal_post], vars=[shampoo_pred] ,samples=100)



fig = plt.figure(figsize=(10,5)); 
ax = fig.gca()

from pymc3.gp.util import plot_gp_dist
plot_gp_dist(ax, samples["shampoo_"], X_pred);

ax.plot(shampoo_df.index, shampoo_df.Sales, 'dodgerblue', ms=5, alpha=0.5);
ax.plot(shampoo_df.index, shampoo_df.Sales, 'ok', ms=5, alpha=0.5);
plt.show()
```

pm.sample_ppcではmarginal_post内のパラメータに基づく事後予測分布からサンプリングしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180524/bbe7d05b-4cf6-6c7e-0088-5ac977aa358c.png)
Face IDを使ってみた開発メモ(Objective-C編)

#事前準備
1.プロジェクトから「info」→「Custom iOS Target Properties」に
　「Privacy - Face ID Usage Description 」を追加する。
　内容はFaceIDの使用を許可するダイアログメッセージに使用される。
<img width="688" alt="スクリーンショット 2020-02-20 16.32.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504099/fa091416-bdce-2327-e789-c326bd71b54b.png">



2.プロジェクトにLocalAuthetication.frameworkを追加する。
 「Build Phases」→「Link Binary With Libraries」→「＋」ボタンから追加
<img width="858" alt="スクリーンショット 2020-02-19 17.57.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504099/83a7771a-4621-1cd6-7e00-c82fac3f8af7.png">

3.使用するクラスにimportを追加

```
import "LocalAuthentication/LocalAuthentication.h"
```


#使用するメソッドの説明
```
- (BOOL)canEvaluatePolicy:(LAPolicy)policy 
                    error:(NSError * _Nullable *)error;
```
動かしている端末が指定の生体認証に対応しているかチェックするメソッド。
指定する「LAPolicy」には以下のようなパターンがある。

|LAPolicy|内容|
|:---|:---|
|LAPolicyDeviceOwnerAuthenticationWithBiometrics|生体認証|
|LAPolicyDeviceOwnerAuthenticationWithWatch|AppleWatchによる認証|
|LAPolicyDeviceOwnerAuthenticationWithBiometricsOrWatch|生体認証かAppleWatchのいずれかによる認証|
|LAPolicyDeviceOwnerAuthentication|端末で認証として設定しているいずれかの認証|
今回は生体認証が使用できるかどうかをチェックするので
「LAPolicyDeviceOwnerAuthenticationWithBiometrics」を使用する。
「error」は「LAError」で返ってくる。詳細は参考から。

```
- (void)evaluatePolicy:(LAPolicy)policy 
       localizedReason:(NSString *)localizedReason 
                 reply:(void (^)(BOOL success, NSError *error))reply;
```
指定した生体認証を行うメソッド。
「localizedReason」には実際に生体認証を行う際のダイアログメッセージとして利用される。
生体認証の成否は「success」でtrue/falseで返ってくる。
こちらも「error」には「LAError」が返ってくる。詳細は参考から。

#サンプル
```
    LAContext *context = [[LAContext alloc] init];
    NSError *authError = nil;

    if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError])
    {
        [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
                  localizedReason:@"今回はテストでFaceIDを使用します"
                            reply:^(BOOL success, NSError *error)
         {
             if (success) {
                 NSLog(@"ログインに成功しました");
             } else {
                 NSLog(@"ログイン出来ませんでした。");
             }
         }];
    } else {
        NSLog(@"FaceIDに対応していない端末でした");
    }
```

#参考

公式ドキュメント
https://developer.apple.com/documentation/localauthentication/lacontext?language=objc

LAErrorについて
https://developer.apple.com/documentation/localauthentication/lapolicy/lapolicydeviceownerauthentication?language=objc
transition を使ってマウスオーバー/アウト時にアニメーションの動きを変える

# 要約
- マウスオーバーでアニメーションをさせたい時、 transition プロパティを `:hover` にのみ指定すると、マウスアウトした時に瞬時に戻る
- 上を逆手に取ると、マウスオーバー/アウトでアニメーションを変化させたり、マウスオーバーした時に複数の要素を段階的にアニメーションさせることが出来る

# 概要
CSSの transition プロパティを使う時、 `:hover` にだけ指定すると、マウスアウトした時に無効になり瞬時に変化してしまいます。
これはマウスオーバー時にのみその transition が有効になっているからですが、それを逆手に取って、**マウスオーバー/アウト時にそれぞれ異なったアニメーションを発生させる**こともできます。
transition はプロパティごとに指定できるので、異なったプロパティを変化させることも可能です。

例：マウスオーバー/アウトでアニメーションの速さを変える
<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="css,result" data-user="semigura" data-slug-hash="JjdRJOG" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="transition-1-3">
  <span>See the Pen <a href="https://codepen.io/semigura/pen/JjdRJOG">
  transition-1-3</a> by semigura (<a href="https://codepen.io/semigura">@semigura</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

応用すると、リンク内の複数の要素に違う transition を指定して段階的に変化させていくということもできます。
ただしこの時、変化させるプロパティを要素ごとに書いていく必要があります。

例：マウスオーバーで複数の要素を段階的に変化させていく
<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="css,result" data-user="semigura" data-slug-hash="wvazePj" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="transition-1-3">
  <span>See the Pen <a href="https://codepen.io/semigura/pen/wvazePj">
  transition-1-3</a> by semigura (<a href="https://codepen.io/semigura">@semigura</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
フォームの送信先の文字コードが異なる場合の対策

# 概要

**サイトA**：検索フォームが設置されている[文字コードUTF-8]
**サイトB**：サイトAからのリクエストを受けて結果を表示[文字コードEUC-JP]

例えば古いサイトで、ブログだけWordPressで作られてたりして、
共通ヘッダーから商品検索ができるようにしたい場合。
まぁ今時UTF-8以外で作られてるサイトって...とは思いますが、それは置いといて。

# 対策しないとどうなるか

文字化けします↓
![コメント 2020-02-20 153847.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336446/5ae6fa28-f434-dfaf-df60-bc9ee2f9bb73.png)

# [対策1] accept-charset

```html
<input type="search" name="search_form" placeholder="キーワードを入力" autocapitalize="off" value="" />
<input type="button" name="search_button" value="検索" />
<form name="search" id="search" method="get" action="/list.html" accept-charset="EUC-JP">
	<input type="hidden" name="search_key" id="search_keyword" value="">
</form>
```
accept-charset属性に送信先の文字コードを指定するだけで上手くいっちゃったりする。
しかし、IE非対応。あるある過ぎて、もはや怒りも湧いてこない。

# [対策2] ecl.js

https://www.junoe.jp/downloads/itoh/enc_js.shtml


```html

<form name="search" id="search" method="get" action="/list.html" onsubmit="submitFunc(); return false;">
	<input type="text" name="search_form" placeholder="キーワードを入力" autocapitalize="off" value="" />
	<input type="submit" name="search_button" value="検索" />
	<input type="hidden" name="search_key" id="search_keyword" value="">
</form>
<script src="./js/ecl.js"></script>
<script>
	function submitFunc() {
		var utf8Pram = document.search_form.value; //入力値を取得
		var eucPram = EscapeEUCJP(utf8Pram); //エンコード処理
		document.forms.search.search_key.value = eucPram; //valueに設定
		document.forms.search.submit(); //送信処理
	}
</script>

```

# 詰まったところ

```html

onsubmit="submitFunc(); return false;"
```

対策2を試しているとき、入力してエンターキーを押すと、デフォルトでフォーム送信処理が走るのですが、その際submitFunc()の処理が通らない事象に遭遇しました。
エンターキー押下時のデフォルトの動きを抑制しつつ、処理を挟むやり方が最初分からなかったです。
インラインで実行せずに全部JavaScript側で処理しても良かったのですが、今回はなるべくソースを流用する方向で対応しました。


# 参考文献

[form - MDN - Mozilla](https://developer.mozilla.org/ja/docs/Web/HTML/Element/form#Attributes)

[[IE対策も] UTF-8フォームから別の文字コードへPOSTする際の文字化け解消法](https://www.hachi-log.com/utf8-to-sjis-post/)