OmniAICreator/Qiita-1.07M huggingface dataset:
Nginxのif文であれこれやりたいとき

image_filter で画像の変換とか、proxy_pass とかを組み合わせる場合。
http://cloudrop.jp/labs/nginx_image_filter
こちらでは

> ` proxy_pass http://$s3host/$file;`

のように指定しているが、`proxy_pass` にURLは含めたくないのだよね。
でも次のように

> `location /s3_resize {`

 `location` でURLを使ってしまっているので、どうにも上手いこといかない。proxyの先には `/s3_resize` のようなURLは無いのだ。


と思っていたら、named locationの書き方を見つけた。
https://gist.github.com/pymeat/7332082

> ` error_page 418 = @backend; return 418;`


つまり

```nginx
location ~* \.(gif|jpg) {
  if ( ... ){
    error_page 418 = @case1; return 418;
  }
  error_page 418 = @case2; return 418;
}

location @case1 {
  proxy_pass http://backend;
}
location @case2 {
  ...;
}
```

このように書くと無駄なlocation urlを消費しないし`proxy_pass`も綺麗に書ける。
綺麗というかバッドノウハウ的というか。

ステータスコード 418 は `I'm a teapot` のジョークコード。
axios で POST する際、Content-type を application/x-www-form-urlencoded にしたい時どうするか 

# 経緯
・[axios](https://github.com/mzabriskie/axios) (Javascript の Promise based HTTP client) で Postしたい。
・Defaultでは Post Parameter は JSON 形式で送信されるが、Formで入力されたときとと同じパラメータ形式としたい。
・Option で Content-type を  application/x-www-form-urlencoded に変更しただけでは、うまくいかない。
　Json形式で送信されている様子

【だめだった例】

```js
    axios.post('/test', { param1: '1', param2: 'test' }, {headers: {'Content-Type': 'application/x-www-form-urlencoded'}})
        .then(function() {
           ....
        })
        .catch(function() {
           ....
        });
```

# 解決策
・URLSearchParams を使ってパラメータを構築する。

【よい例】

```js
    var params = new URLSearchParams();
    params.append('param1', '1');
    params.append('param2', 'test');

    axios.post('/test', params)
        .then(function() {
           ....
        })
        .catch(function() {
           ....
        });
```
# 教訓

やっぱり、ざっとでもいいので、マニュアルを **最後まで** 見ましょう!!
UI > Excel 2013 > 行の削除 > ctrl + [-]

```txt:動作環境
Excel 2013 on Windows 8.1 pro(64bit)
```

表を扱うソフトを作る場合、Excelの操作と同じショートカットキーを使えると、ユーザの学習コストを減らすことができる。

[行削除・列削除のショートカットキー−Ctrl＋-キー @ インストラクターのネタ帳さん](http://www.relief.jp/itnote/archives/003602.php)

実際に試したところ、行の削除は以下の手順であった。

1. 行を選択
2. <kbd>ctrl</kbd>+<kbd>-</kbd>

削除時に確認ダイアログが出ないのは、[こちら](http://qiita.com/7of9/items/4f3f907b88479c886895)で見た以下と関係しそう。

> 意訳「undoを提供しなさい。行動をやり直す方法を提供しなさい。例として、Microsoft Windowsにおいてファイル削除はたいていconfirmation を必要としません。なぜなら削除ファイルはごみ箱から復活できるからです。注記点として、とても簡単に実行できるものなら、ユーザがそれをやり直せるようにすることで十分です。」

作成ソフトでundo機能をつけるかは要検討。

上記手順1の「行を選択」をせずに、<kbd>ctrl</kbd>+<kbd>-</kbd>では削除の仕方（下図)の選択ダイアログが表示される。

![qitia.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a051c7c9-a152-aa59-dc59-df80fb09aca2.png)


作成ソフトでは行方向にしか削除しないため、このダイアログは不要。
GitLabCi、GitLabCi RegistryのSSL化（Let's Encrypt）

業務でGitLabCiを使うのにSSL化したいが、オレオレ証明書はGitLabCi Registryで使えない模様
ならLet's Encryptでやっちゃおう！

#前提
- GitLabCiがインストールされている
- OSはCentOS系
- ドメインは　xxxxxx.xxxxxx.jp

###Let's Encryptの設定ツール（certbot-auto）のインストール
```
sudo yum install epel-release
cd /usr/local/bin
sudo wget https://dl.eff.org/certbot-auto 
sudo chmod a+x certbot-auto 
```
Let's Encryptで証明書を取らないでオレオレ証明書でやるとgitlab-ci-multi-runnerの登録と、GitLabCi RegistryでのDocker login pushで問題が出ます

###GitLabCi本体のサーバ証明書作成
```
cd /usr/local/bin
./certbot-auto certonly -a standalone -d xxxxxx.xxxxxx.jp
```

###GitLabCi Registry[DockerImage]のサーバ証明書作成
```
cd /usr/local/bin
./certbot-auto certonly -a standalone -d registry.xxxxxx.xxxxxx.jp
```

###GitLabCiの設定を変更
```ruby:/etc/gitlab/gitlab.rb
## GitLab URL
##! URL on which GitLab will be reachable.
##! For more details on configuring external_url see:
##! https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab
external_url 'https://xxxxxx.xxxxxx.jp'

~

gitlab_rails['time_zone'] = 'Asia/Tokyo' 

~
##! if ssl_verify_client on, verification depth in the client certificates chain
# nginx['ssl_verify_depth'] = "1"

nginx['ssl_certificate'] = "/etc/letsencrypt/live/xxxxxx.xxxxxx.jp/fullchain.pem"
nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/xxxxxx.xxxxxx.jp/privkey.pem"

~

################################################################################
## Container Registry settings
##! Docs: https://docs.gitlab.com/ce/administration/container_registry.html
################################################################################      
registry_external_url "https://registry.xxxxxx.xxxxxx.jp"      

~
   
################################################################################
## Registry NGINX
################################################################################
registry_nginx['enable'] = true
registry_nginx['redirect_http_to_https'] = true
registry_nginx['redirect_http_to_https_port'] = 80
registry_nginx['ssl_ciphers'] = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
registry_nginx['ssl_prefer_server_ciphers'] = "on"
registry_nginx['ssl_certificate'] = "/etc/letsencrypt/live/registry.xxxxxx.xxxxxx.jp/fullchain.pem"
registry_nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/registry.xxxxxx.xxxxxx.jp/privkey.pem"
```
編集したら、再構成、再起動

```
sudo gitlab-ctl reconfigure 
sudo gitlab-ctl restart
```

SSL化完了

###GitLabCi へ アクセス
ブラウザから

```
https://xxxxxx.xxxxxx.jp
```


###GitLabCi Registry　へ　DockerImageを登録するケース

クライアントから

```
docker login registry.xxxxxx.xxxxxx.jp
docker push registry.xxxxxx.xxxxxx.jp/{Groups}/{Projects}:{Tags}

```
[Laravel 5] artisan schedule:run で、ジョブが何個実行されたか調べる

`php artisan schedule:run` をした時に、ジョブが何個実行されたか知りたいときがある。

`app/Console/Kernel.php` で `$schedule->dueEvents($this->app)` とすれば取得できる。

```php:app/Console/Kernel.php
class Kernel extends ConsoleKernel
{
    protected function schedule(Schedule $schedule)
    {
        // ジョブを指定
        $schedule->exec('echo abc')->monthly();
        $schedule->exec('echo abc')->everyMinute();

        dd($schedule->dueEvents($this->app));
    }
}
```

結果はこんな感じ。

```
array:1 [
  1 => Illuminate\Console\Scheduling\Event {#409
    +command: "echo abc"
    +expression: "* * * * * *"
    +timezone: null
    +user: null
    +environments: []
    +evenInMaintenanceMode: false
    +withoutOverlapping: false
    #filter: null
    #reject: null
    +output: "/dev/null"
    #shouldAppendOutput: false
    #beforeCallbacks: []
    #afterCallbacks: []
    +description: null
  }
]
```

ドキュメントには無かったので、ソースコードを直接探して調べた。

https://github.com/laravel/framework/blob/5.1/src/Illuminate/Console/Scheduling/Schedule.php#L103
初めて見る環境(Linux Server)での調査日記

とある日の昼下がり

デザイナーAさん：「モジュールをアップしたけどページに反映されません＞＜」
私：「！？どの環境ですか？」
デザイナーAさん：「Tの環境です」
私：「分かりました調べてみます。（Tってなんだ？初めて聞くんだが。。）」

さて、接続情報する知らないサーバでの原因調査となりました。
IP/ポート、ログインID/PWは分からないとお話しにならないので資料ディレクトリをあさって発掘。

次に色々な人にヒアリングして状況を整理しました。

デザイナーAさん：一月前に作業した時は、同じ手順で反映されました。
デザイナーAさん：リニューアル前のドキュメントルートもバックアップとして残っています。（怪しい。。）
エンジニアBさん：Tの環境なら先週Apacheの再起動をしたよ。（怪しい。。てか知ってるんだったら見てくれればいいのに。。）
エンジニアBさん：2サーバ(TサーバとUサーバ)あってLBで振り分けてるはずだよ。構成はアクティブ・スタンバイになってるよ。（怪しい。。）

みんな原因は分からないというので、ここから調査に入ります。

1. LBの設定
---
まず、LBの設定を見ました。
確かにTサーバとUサーバの2台構成で、アクティブ・スタンバイとなっていました。
Tサーバがアクティブで、Uサーバがスタンバイだったので、
調査はTサーバで始めることにします。

2. Tサーバの調査
---
まず疑ったのが、

- <b>リニューアル前のドキュメントルートもバックアップとして残っています。</b>
- <b>Tの環境なら先週Apacheの再起動をしたよ。</b>

怪しすぎます。

右も左もわからない見たこともないサーバだったので、まずApacheの起動元を確認しました。

```bash:command
$ ps aux | grep httpd
root      4777  0.0  0.0 107460   916 pts/0    S+   10:23   0:00 grep httpd
apache   31088  0.0  2.8 370344 28800 ?        S    Apr09   0:04 /usr/sbin/httpd
apache   31089  0.0  5.9 455960 61240 ?        S    Apr09   0:13 /usr/sbin/httpd
apache   31090  0.0  4.5 441196 46056 ?        S    Apr09   0:04 /usr/sbin/httpd
```

これでまず、「/usr/sbin/httpd」が起動元だと分かります。

次に「httpd.conf」の場所を確認します。
「/etc/httpd/conf」の配下にあることが多いですが、
念のためコマンドで確認します。

```bash:command
$ /usr/sbin/httpd -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:81                   xxxxx01 (/etc/httpd/conf/httpd.conf:1036)
Syntax OK
```
コマンドの結果、confの場所は「/etc/httpd/conf/httpd.conf」、
記載行は「1036行目」だとわかります。
次はconfを調べます。

3. httpd.confの確認
---
viコマンドでhttpd.confを開き、
1036行目を確認してみましょう。

```bash:httpd.conf
# ファイルを開く
$ vi /etc/httpd/conf/httpd.conf
# :1036で1036行目へジャンプ
1036 <VirtualHost *:81>
1037      DocumentRoot /var/www/html
...
1042 </VirtualHost>
```

ドキュメントルートは「/var/www/html」と分かりました。
結論から述べると、これは正しい設定でした。
アップしたモジュールも存在しました。

4. 深まる謎
---
モジュールはきちんとTサーバにアップされてました。
ここで、下記2つはこの件とは無関係と判断しました。

- ~~<b>リニューアル前のドキュメントルートもバックアップとして残っています。</b>~~

- ~~<b>Tの環境なら先週Apacheの再起動をしたよ。</b>~~

もうUサーバしか考えられないので、1～3の工程をUサーバでも実施しました。
結果、ページとして見えていたのは、Uサーバのモジュールでした。

5. 原因特定
---
ダッシュボード上のLBの状態が表示と実体で異なっていました。
表示とは違いUサーバがアクティブとなっていたようです。

なんともしっくりこない結果でしたが、
目に見えるものが必ず正しいとは限らない教訓になりました。
後「httpd -S」が本当に便利です。
vagrantの共有ディレクトリが外れてしまう現象でハマった

初めて投稿します。
誤字脱字、説明不足等指摘事項がありましたらお知らせください。
よろしくお願いします。

私は現在Virtual BoxとVagrantを使って開発作業を行っております。
たまたま手が空いたので.net Coreの検証をしようと新しく仮想環境を立てた所、vagrantを再起動すると共有ディレクトリが共有されなくなる現象に当たりました。
その現象にハマって数時間つぶしてしまったので、自分へのメモとして記事に残したいと思います。

#環境
OS　windows7
visual box 4.3.8
vagrant 1.7.4
開発仮想環境OS　centOS 6.5 
検証仮想環境OS　centOS 7.1

#どの段階でエラーが発生するのか？
vagrant cloudからcentOS 7.1のboxを引いてきて、vagrant upした段階では、共有できている事を確認しました。
その後。yum updateを行いvagrant reloadした所、エラーが発生し共有ディレクトリが共有されなくなりました。


#原因調査
vagrant upする際に、
**Guest Additions versions on your host (4.3.8) and guest (5.0.10) do not match.**
というエラーが表示されていることに気付いたのでしらべました。

###Guest Additionsとは
Guest Additionsというのはhost側(VirtualBox)とguest側(centOS7)のディレクトリ共有を使うために必要なモノで、host,guestが同じバージョンを使用しないといけない事がわかりました。

つまり、centOS7のyum updateを行った際、
OSのカーネルが更新され、Guest Additionsのバージョンが更新されたためにhost側(VirualBox)とのバージョン不一致が起き共有ディレクトリのマウントに失敗していたようです。

#修正対応
今回はguest側のバージョンが新しいのでhost側のバージョンを上げてそろえる事で解決できそうです。ですが、vagrantには便利なプラグイン、vagrant-vbguestがあるのでこれを使って、バージョンをそろえることにしました。

```
vagrant plugin install vagrant-vbguest
```

これで、host側とguest側のGuest Additionsが一致し、共有ディレクトリが共有されました。



#次は開発環境が・・・
その後念のためと開発環境を更新した所、こちらもエラーでも共有ディレクトリでエラーがおきました。

今度はhost側のGuest Additionsのバージョンが新しすぎてguest側と異なっていました。
なので、今度はguest側のOSを更新したのですが、更新に失敗してしまいます。
内容的にどうやらインストールされているnode.jsのバージョンが低すぎてそこでエラーになっていたようです。
(※エラーログを取っとけばよかったのですが、とり忘れました・・・)

#結局Virtual Boxのダウングレードを行った
guest側のGuest Additionsを更新できないため、バージョンをそろえる事が出来ない以上、host側のバージョンを下げざるを得ないため、guest側で使用しているバージョンと同じバージョンのVisualBoxをダウンロードしてきてインストールし、ダウングレードによってバージョンを合わせて対応しました。

https://www.virtualbox.org/wiki/Download_Old_Builds_4_3_pre24

#まとめ
というわけで開発環境は復活しましたが、また検証環境がマウントできなくなったハズです。
どのようにして検証環境を動かすかはこれから考えます。
1台のPCで複数の仮想環境を作る場合はそれぞれの環境のバージョン等に気を付けないとダメですね。
Pepper広告アプリ 百聞は一動画に如かず取扱説明書

![百聞は一動画に如かず-01.jpg](https://qiita-image-store.s3.amazonaws.com/0/175870/3fdda6fd-7b53-8b05-8ea2-cffdea34d12b.jpeg)
![百聞は一動画に如かず-02.jpg](https://qiita-image-store.s3.amazonaws.com/0/175870/267f13da-2244-867e-400f-bf34f6198ec2.jpeg)
![百聞は一動画に如かず-03.jpg](https://qiita-image-store.s3.amazonaws.com/0/175870/14f43e1c-4445-fb28-17e9-32704873c59d.jpeg)
![百聞は一動画に如かず-04.jpg](https://qiita-image-store.s3.amazonaws.com/0/175870/ff4c9f1f-dd55-3f10-e0b3-e504f621444b.jpeg)
![百聞は一動画に如かず-05.jpg](https://qiita-image-store.s3.amazonaws.com/0/175870/372ea9b1-08cb-b0d0-cf87-fc4cd1e2de45.jpeg)
![百聞は一動画に如かず-06.jpg](https://qiita-image-store.s3.amazonaws.com/0/175870/29e73d53-860f-880c-f803-46d83e29a57e.jpeg)
![百聞は一動画に如かず-07.jpg](https://qiita-image-store.s3.amazonaws.com/0/175870/c7407267-ba3a-6725-9041-1ad1a625645f.jpeg)
![百聞は一動画に如かず-08.jpg](https://qiita-image-store.s3.amazonaws.com/0/175870/e73e1ba1-516e-b872-b638-ed35df1c5229.jpeg)
![百聞は一動画に如かず-09.jpg](https://qiita-image-store.s3.amazonaws.com/0/175870/d41600c3-d7b3-08ee-b439-d0faebafecb7.jpeg)
![百聞は一動画に如かず-10.jpg](https://qiita-image-store.s3.amazonaws.com/0/175870/20b73d5e-b3e6-b219-f2c1-a5613b9075b8.jpeg)
---
動画広告アプリ　百聞は一動画に如かず のダウンロードはこちら
アキないペッパー ホームページ　●http://akinaiapp.com/

---
アキナイアプリインストール手順書
http://qiita.com/trustring_pepper/items/50e253c6b99f929d3daf
アプリストア：Akinai App Market for Pepper
http://akinaiapp.com/
開発元：トラストリング株式会社
http://www.trustring.jp/
Hiveでランダムサンプリング

##概要
SQLライクな言語Hiveでのランダムサンプリングです。

##例
以下のようなデータが続くとき
３行のみランダムに抽出したい

###使用するデータ
|customer_ID|item_name|date| 
|:--|--------:|:--------:|
|　3  |  A    |　　2016-10-11　　|  
|　3  |  B    |　　2016-11-11　　|  
|　5  |  C    |　 2016-12-10　|  
|　2  |  A    |　　2016-09-20　　|  
|　3  |  D    |　 2016-08-09　|  



###クエリ

```.sql
SELECT 
    sample.customer_ID,
    sample.item_name,
    sample.date,
    sample.row_num
        
FROM

    (
    SELECT
          *, 
          --全行にランダムに行番号をふる
          row_number()             
              over(ORDER BY rand() ) as row_num          
    FROM        
          table
    ) as sample

WHERE
    --ランダムに振られた番号の1~3まで抽出
    sample.row_num between 1 and 3
```


###イメージ
①全行にランダムに番号をふって(一番右の列)、

|customer_ID|item_name|date|row_num|
|:--|--------:|--------:|:--------:|
|　3  |  A    |　　2016-10-11　　|1|  
|　3  |  B    |　　2016-11-11　　|5|
|　5  |  C    |　 2016-12-10　|3|
|　2  |  A    |　　2016-09-20　　|4|  
|　3  |  D    |　 2016-08-09　|2|

②行番号が1-3のものだけ抽出

|customer_ID|item_name|date|row_num|
|:--|--------:|--------:|:--------:|
|　3  |  A    |　　2016-10-11　　|1|　←ここ
|　3  |  B    |　　2016-11-11　　|5|
|　5  |  C    |　2016-12-10　|3|　←ここ
|　2  |  A    |　　2016-09-20　　|4|  
|　3  |  D    |　 2016-08-09　|2|　←ここ

③完成！

|customer_ID|item_name|date|row_num|
|:--|--------:|--------:|:--------:|
|　3  |  A    |　　2016-10-11　　|1|　←ここ
|　5  |  C    |2016-12-10　|3|　←ここ
|　3  |  D    |　 2016-08-09　|2|　←ここ
Docker for Mac の volumesマウントが異常に遅い（半分解決）

#volumesマウントが異常に遅い
Docker for Macが遅い
とにかく遅い
ホストのディレクトリにvolumesをマウントすると遅い
みんなどうやって使ってるのか不思議なくらい遅い

そこで調べてみたら、issue上がってるー

[File access in mounted volumes extremely slow #77 issuecomment-287896901](https://github.com/docker/for-mac/issues/77#issuecomment-287896901)

```
Host     VM          File loc  Build time
Mac      VirtualBox  VM         41.715s
Windows  VirtualBox  VM         48.928s
Mac      Docker      VM         51.915s
Mac      VirtualBox  host       69.139s  <- forced to use this
Windows  Docker      VM         83.194s
Mac      Docker      host      122.067s  <- because this is too slow
Windows  VirtualBox  host      126.406s
Windows  Docker      host      168.358s
```

Mac on VirtualBoxの優秀さ
体感で3〜5倍程度遅かったので、まぁこんな感じ。

そこで、[docker-sync](http://docker-sync.io/)も試しました（当然）
速くなりますよ。
でも、なんか違くね？

dockerの裏でrsync(unison)してるので大量なファイルだと少しlagがあるのです。
（しかも、自分の環境ではphp7のob_start();が遅くなり使い物にならず...）

[直したから4月にリリースするよ by dockerの中の人](https://github.com/docker/for-mac/issues/77#issuecomment-283996750)

```
-v /hostdir:/mountdir:cached
```
簡単に言うと「cachedオプションをつけて解決だ！」
そこまで言うなら、期待して待つ

##待つこと1ヶ月！！

[Edge版だけど試してみてね by dockerの中の人](https://github.com/docker/for-mac/issues/77#issuecomment-291815500)


#早速試してみる
まず、現在のバージョンを全部消しちゃいましょう
**イメージも消えちゃうから気をつけましょう**

##docker(17.04.0-ce)をインストール
https://download.docker.com/mac/edge/Docker.dmg

インストールしたらバージョンを確認しましょう

```
$ docker --version
Docker version 17.04.0-ce, build 4845c56
```

[docker run でのcachedの使い方](https://github.com/docker/for-mac/issues/77#issuecomment-292192768)

```
$ docker run --rm -v $(pwd):/mount:cached  -w /mount golang:latest \
    bash -c 'time go list ./...  &>/dev/null'
```

###docker-composeを利用してる場合
docker-composeもバージョンを1.12.0へアップする必要があります

```
$ curl -L "https://github.com/docker/compose/releases/download/1.12.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
```

docker-composeもバージョンを確認しましょう

```
$ docker-compose --version
docker-compose version 1.12.0, build b31ff33
```

[docker-composeでのcachedの使い方]
(https://github.com/docker/for-mac/issues/77#issuecomment-292277623)

```
    volumes:
        - "{local directory}:{docker directory}:cached"
```



#結果

[まだ微妙...](https://github.com/docker/for-mac/issues/77#issuecomment-292529647)

```
file         | docker      | docker        | docker       | lsyncd ad-hoc
             | 17.03.0-ce  | 17.04.0-ce    | 17.04.0-ce   | container
             |             |               | :cached)     |
------------------------------------------------------------------------
app_dev.php  | 319ms/req   | 312ms/req     | 84ms/req     | 46ms/req
app.php      | 86ms/req    | 83ms/req      | 21ms/req     | 9ms/req
```

#結論
- どうしてもdockerを使う必要があれば、cachedオプションは有効
- docker-syncの選択肢もあるが、大量ファイルだと微妙な挙動に
- macで開発するならvirtualbox+vagrantが**速度的にはベスト**！（2017/04/14時点）
AngularJSのウオッチ数を確認できるChromeの拡張機能が便利

以前、開発したときに使ってた「Angular watchers」が便利だったのでメモ。


[ここ](https://chrome.google.com/webstore/detail/angular-watchers/nlmjblobloedpmkmmckeehnbfalnjnjk?hl=ja)からChromeに追加できます。

<img width="502" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/135956/d040c32d-b017-e4ee-1760-880c57043365.png">


Angularを利用している画面でデベロッパーツールを起動して、「$$watchers」を選択すると次のような感じで表示されます。


<img width="611" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/135956/f2ca2f1a-45ec-4d67-4b5f-1c914d45946c.png">


ウオッチ数が変動すると動的に表示してくれます。


<img width="202" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/135956/561f0e90-8acb-2174-f19c-de5e0471ef09.png">


数字が動いているさまを見ているのが好きです（笑）
スマートフォン対応 Ｐｅｐｐｅｒおしゃべりリモコン クレイジートーク　取扱説明書

![0001.jpg](https://qiita-image-store.s3.amazonaws.com/0/175870/1fbfef72-cad2-1be7-60c1-efc046feb3ec.jpeg)
![0002.jpg](https://qiita-image-store.s3.amazonaws.com/0/175870/43134804-e5b8-7281-71aa-db0f7d303ba8.jpeg)
![0003.jpg](https://qiita-image-store.s3.amazonaws.com/0/175870/847a72db-fd94-d9e3-6b29-4580fb37f0a8.jpeg)
![0004.jpg](https://qiita-image-store.s3.amazonaws.com/0/175870/1918cbcb-92b8-9e86-d6fc-9d497ae0113a.jpeg)
![0005.jpg](https://qiita-image-store.s3.amazonaws.com/0/175870/e413a0b6-4416-0df9-f29d-73ff4b064161.jpeg)
![0006.jpg](https://qiita-image-store.s3.amazonaws.com/0/175870/58a47630-3562-328b-984f-8d2c3981faf0.jpeg)
![0007.jpg](https://qiita-image-store.s3.amazonaws.com/0/175870/9b00f9e4-ce85-31df-877d-2c1df67c505c.jpeg)
![0008.jpg](https://qiita-image-store.s3.amazonaws.com/0/175870/94cd47e3-4a9a-0d43-23be-64bcc7372ea0.jpeg)

---
クレイジートークのダウンロードはこちら
アキないペッパー　●http://akinaiapp.com/

---
アキナイアプリインストール手順書
http://qiita.com/trustring_pepper/items/50e253c6b99f929d3daf
アプリストア：Akinai App Market for Pepper
http://akinaiapp.com/
開発元：トラストリング株式会社
http://www.trustring.jp/
[xcode][swift 3.0]Type 'ほげほげ' does not conform to protocol 'UITableViewDataSource' なエラーが出る対策


#概要

Swift3.0でUItableViewControllerの実装を試していて、
例えば
http://qiita.com/yutat93/items/1b6dfe34fa8537cf3329
を試すと、
 Type 'ArticleListViewController' does not conform to protocol 'UITableViewDataSource'
なエラーが出ます。XCode 8.3.1 / Swift 3.1で確認。


``` 
func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath  ) -> UITableViewCell {
```

```
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath ) -> UITableViewCell {
```

上の書き方を下の書き方に直すとOKです。

#理由
以下のようにSwift2.0と3.0で変わっているためでした。そもそも元のサンプルはSwift2.0の書き方でした。

|Swift 2.0|
-----|
|override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { } |


|Swift 3|
-----|
|override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { }  |

#参考サイト
https://www.codeschool.com/blog/2016/09/14/evolving-to-swift-3/

#それにしても
このエラーメッセージで直感的に原因が分かる人ってどれだけいるんでしょうか。。。
Pepper向けロボアプリ あなたのかわりもこん 操作手順書

目次
1.	はじめに
2.	準備するもの
①	『あなたのかわりもこん』がPepperにインストールされていること
②	インターネット環境（Wi-fi）
③	QRコード読み取り機能があるスマートフォン
3.	起動方法
①	Pepperにインストールした『あなたのかわりもこん』を起動します。
②	PepperのタブレットにQRコードが表示されます。
③	スマホのQRコード読み取りアプリでPepperタブレットのQRコードを読み込みます。
④	読み込まれたURLにアクセスすると、Pepperタブレットにログイン完了の文字が表示されます。
⑤	ログイン完了すると、スマホにリモコン画面が表示されます。
4.	操作方法
①	PepperのIPアドレス
②	再接続ボタン
③	起きる
④	休む
⑤	移動
⑥	しゃべる
⑦	動作の起動


 
1.	はじめに

本操作手順書は、トラストリング株式会社が提供する『あなたのかわりもこん』アプリの操作手順を記したものです。

2.	準備するもの

①	『あなたのかわりもこん』がPepperにインストールされていること
②	インターネット環境（Wi-fi）
③	QRコード読み取り機能があるスマートフォン
【対象モデル】
Pepper（一般販売モデル）、Pepper for Biz
【対象OS】
Naoqi OS 2.4.2以上
 
3.	起動方法
①	Pepperにインストールした『あなたのかわりもこん』を起動します。
![image](https://qiita-image-store.s3.amazonaws.com/0/175870/d25a6b0b-5269-6eec-bced-3ff04a4c6f58.png)

②	PepperのタブレットにQRコードが表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/175870/fc984307-fd59-482d-6c0f-ab4ebf99171c.png)
 
 

③	スマホのQRコード読み取りアプリでPepperタブレットのQRコードを読み込みます。
QRコード読み取りアプリはどんなものでもかまいません。お好みのアプリをお使いください。

④	読み込まれたURLにアクセスすると、Pepperタブレットにログイン完了の文字が表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/175870/ca3d0c59-ae55-66b2-9011-657ae6230583.png)
 
 
⑤	ログイン完了すると、スマホにリモコン画面が表示されます。
画面上部に接続成功と表示されていれば成功です。もし、接続成功の表示がなければ再度ログイン操作をやり直してください。以上でログイン手順は完了です。
![image](https://qiita-image-store.s3.amazonaws.com/0/175870/e40ef5df-141f-c9be-15cf-f7a3e951f69f.png)
 
 
4.	操作方法
![image](https://qiita-image-store.s3.amazonaws.com/0/175870/aaa73728-e973-5760-1790-cfdc4979e2d5.png)

①	PepperのIPアドレス
②	再接続ボタン
Pepperに再接続します。動かなくなった場合にお試しください。通常は使用しません。
③	起きる
④	休む
⑤	移動
足元後方のフラップが閉じている場合に動作します。周囲に障害物や段差がないか十分に注意してください。
⑥	しゃべる
入力した文字をPepperがしゃべります。セリフを入力して音量、スピード、高さを調節し、しゃべるボタンを押下してください。
⑦	動作の起動
動作ストップ…動いているアプリや動作を止めます。すぐに止まらない場合があります。
挨拶…こんにちは
歓迎…いらっしゃいませ
お礼…ありがとうございました
お別れ…また来てね
誘導…ついてきてね
呼び込み…いらっしゃい、いらっしゃい
ネタ…時給100円で働いているPepperですよ
スタッフ…スタッフー！

---
---
アキナイアプリインストール手順書
http://qiita.com/trustring_pepper/items/50e253c6b99f929d3daf
アプリストア：Akinai App Market for Pepper
http://akinaiapp.com/
開発元：トラストリング株式会社
http://www.trustring.jp/
CSS Grid Layoutをガッツリ使った所感

この記事は、加筆して「[CSS Grid Layoutをガッツリ使った所感 \- ICS MEDIA](https://ics.media/entry/17403)」に引っ越しました。

<a href="https://ics.media/entry/17403">![キャプチャー：CSS Grid Layoutをガッツリ使った所感](https://ics.media/wp-content/uploads/2018/03/170414_grid_eyecatch.png)</a>

引越し先の記事では

- CSS Grid Layoutを使ってよかったこと
- 逆に苦労したこと、解決できなかったこと
- **IE 11対応には工夫が必要**
- Autoprefixerの最新版を使えば、**IE 11向けのコードに変換**してくれる

という内容をまとめています。

※Google検索で辿り着いた方がリンク切れだと申し訳ないので、投稿は残しておきます。
Serverlessでデプロイするアカウントのプロファイルを変更する

Serverless側で何も設定していない状態では、[default]のプロファイルが選択されるようです。プロファイルを指定してデプロイする方法を説明します。

##serverless.xmlの編集

provider.profileに使用するプロファイル名を指定します。

```serverless.yml:
provider:
  name: aws
  runtime: nodejs6.10

# you can overwrite defaults here
  stage: dev
  region: ap-northeast-1
  profile: vsv1 # 追記 !!

```

##参考
https://serverless.com/framework/docs/providers/aws/guide/credentials/#creating-aws-access-keys

※AWS CLIで複数プロファイルを管理する方法は、以下の記事が参考になります。
http://qiita.com/ryuzee/items/e3ce493f132f1981f57a
Windows Update 更新プログラムの確認が終わらない場合の対応

動作環境はwindows７
Windows Updateの更新プログラムの「最終確認日次」「インストール日時」が2016年7月末と１年近く前。
しかし「更新プログラムの確認」を１営業日近く実施しても最新の更新プログラムが取得できなかった。
どうやら2016年7月以降、長い間アップデートしていないと、更新の確認が終わらないという現象が発生するようだ。
以下に、対応をまとめる。


# １．KB3177467(2016年7月13日配信)の更新を確認する
1．「インストールされた更新プログラム」から「KB3177467」がインストールされているか確認をする。
2．インストールされていない場合は、インストールする。

# ２．更新が終わらない問題が解消できる更新をインストールする
1．以下のどちらかの更新をインストールする
KB4015549　(2017年4月12日配信)
KB3172605　(2016年8月17日配信)
2．インストール後は「更新プログラムの確認」を実行し、更新プログラムのインストールを実行し最新の状態にする。

##### 参考サイト
[http://freesoft.tvbok.com/tips/windows_update/not_proceed_update.html](http://freesoft.tvbok.com/tips/windows_update/not_proceed_update.html)
コマンドは覚えられるけどオプションが覚えられないそんなあなたへ


# 背景
lsやらmkdirやらrmやら、「そんな基本コマンドは朝飯前よ！」と思っているそこのあなた。でもオプションはなんか覚えられないなんて経験はありませんか？はい、私ですね。今回は、よく使う割になんか覚えられないコマンドオプションをまとめてみました。この記事を読んで覚えるのもよし。この記事をストックしといて、「あのオプションなんだっけ」って時に見るのもよし。一緒にコマンドマスターになりましょう。では、行ってみよう！

# lsコマンド
ディレクトリ内の情報を表示する

```
$ ls
directory	document.pdf	hoge.txt	img.jpeg
```


## 詳細まで見たい！[-l]
```
$ ls -l
total 185856
drwxr-xr-x  3 xxxx  xxxx Users       102  4 14 17:14 directory
-rw-r--r--@ 1 xxxx  xxxx Users  95060924  4 10 11:14 document.pdf
-rw-r--r--  1 xxxx  xxxx Users         0  4 14 17:14 hoge.txt
-rw-r--r--@ 1 xxxx  xxxx Users     92069  4 14 13:05 img.jpeg
```
色々を一気に見れちゃいますね。


## 隠しファイルも見たい！[-a]
```
$ ls -a
.		..		.secret.txt	directory	document.pdf	hoge.txt	img.jpeg
```
怪しいファイルを見つけました。


## ファイルサイズ順で見たい！[-lS]
```
$ ls -lS
total 185856
-rw-r--r--@ 1 xxxx  xxxx Users  95060924  4 10 11:14 document.pdf
-rw-r--r--@ 1 xxxx  xxxx Users     92069  4 14 13:05 img.jpeg
drwxr-xr-x  3 xxxx  xxxx Users       102  4 14 17:23 bbb
drwxr-xr-x  3 xxxx  xxxx Users       102  4 14 17:22 directory
```
お前が容量を圧迫していたのか。

## 時間順で見たい！[-t]
*コメントにより追記（4/20）させていただきます。*

```
$ ls -t
hoge.txt	directory	img.jpeg	document.pdf
```

最近更新されたのがどれかを知りたい時に便利そうですね。

## 階層表示したい！[treeコマンド]
階層表示が出来るlsのオプションありそうでないですね。
そんなときは **treeコマンド**！
番外編ということでお教えします。
まずはインストールしましょう。

```
$ brew install tree
```

そしたら使ってみましょう。あら便利。

```
$ tree
.
├── directory
│   └── fuga.md
├── document.pdf
├── hoge.txt
└── img.jpeg

1 directory, 4 files
```

# mkdirコマンド
ディレクトリを作成する

```
$ mkdir aaa
$ tree
.
├── aaa
├── directory
│   └── fuga.md
├── document.pdf
├── hoge.txt
└── img.jpeg
```

## 子ディレクトリと孫ディレクトリ一気に作りたい！[-p]
```
$ mkdir -p bbb/ccc
$ tree
.
├── aaa
├── bbb
│   └── ccc
├── directory
│   └── fuga.md
├── document.pdf
├── hoge.txt
└── img.jpeg
```
これオプション使わなくても出来るけどだいぶ面倒ですよね。

# rmコマンド
ファイルを削除する

```
$ rm hoge.txt
$ tree
.
├── aaa
├── bbb
│   └── ccc
├── directory
│   └── fuga.md
├── document.pdf
└── img.jpeg
```

## ディレクトリを削除したい！[-r]
```
$ rm aaa
rm: aaa: is a directory
$ rm -r aaa
$ tree
.
├── bbb
│   └── ccc
├── directory
│   └── fuga.md
├── document.pdf
└── img.jpeg
```
いつも1回目はオプションつけ忘れて怒られる。

# 各コマンド共通
## このコマンドなんだっけ！オプションなんだっけ！[--help]
*コメントにより追記させていただきます。*

コマンドについて分からないことがあるとついついネットで調べちゃいますが、そこを解決してくれる便利なオプションです。ハイフン2個ってところが私の中では落とし穴です。分からないときはまず```--help```や```man```コマンドを使おうとするのが、コマンドマスターになるための秘訣かもしれませんね。


```
$ mkdir --help
Usage: mkdir [OPTION]... DIRECTORY...
ディレクトリを作成する。ただし既にディレクトリがあれば何もしない。

長いオプションに必須の引数は短いオプションにも必須です.
  -m, --mode=MODE   set file mode (as in chmod), not a=rwx - umask
  ・
  ・
  ・
```



# まとめ
こういう細かいとこをどうしても毎回調べちゃうとか、覚えられないから便利なオプション使わないとかは、作業効率にじわじわと響いてきちゃいますね。他にもよく使う割になんか覚えられないオプションあったらこの記事に追加していきたいと思います。真のコマンドマスターになりましょう。なりたいです。
Laravel5のパスワード再発行メールを日本語化する

Laravel5のデフォルト認証システムには、パスワード忘れの再発行の機能までついてて大変便利だが、デフォルトのメール文面が英語な上、日本語化するのにパッと見、どこを変えたらいいのかがわかりづらい。

結論からいうと、下の2つのカスタマイズが必要。

1. デフォルトの通知メールのテンプレートの書き替え
2. パスワード再発行メールのNotificationクラスの書き換え

# デフォルトのメール文面のテンプレートの書き替え

公式ドキュメントで案内されてる要領で行う。

https://laravel.com/docs/5.4/notifications#customizing-the-templates

```

php artisan vendor:publish --tag=laravel-notifications


```

通知メールのテンプレートが、resources/views/vendor/notifications/email.blade.php にコピーされるので、それを編集すればOK。

# Notificationクラスの書き換え

デフォルトのパスワード再設定のNotificationクラスは、Illuminate/Auth/Notifications/ResetPasswordで、中を見ると、

```php:ResetPasswordNotification.php

    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->line('You are receiving this email because we received a password reset request for your account.')
            ->action('Reset Password', route('password.reset', $this->token))
            ->line('If you did not request a password reset, no further action is required.');
    }

```

とtoMailメソッドの中でメールの本文が定義されてる。


これを置き換えるNotificationを、App\Notifications\ResetPasswordNotification.phpとかで作ります。

上のクラスの継承クラスでもいいし、artisan make:notificationで新規で作ってもOK。新規で作る場合はコンストラクタで再発行リクエストトークンを受け取って、それを$this->tokenというプロパティに格納しておくこと。

あとはさっきのtoMailメソッドを、

```php:ResetPasswordNotification.php

    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->subject('パスワードの再発行')
            ->line('パスワード再発行のリクエストを受け付けました')
            ->action('パスワードを再発行する', route('password.reset', $this->token))
            ->line('もしこのメールに心当たりがない場合は、何もしなくていいです');
    }

```

みたいに変えればOK。メールの件名もここで変えられます。

# 利用するNotificationの置き換え

最後に今作ったNotificationを再発行時に使うようにするには、Userモデルクラスにメソッド1個を書き足せばいい。

```php：App\Users.php

...
//デフォルトのNotificationの代わりに、
//use Illuminate\Auth\Notifications\ResetPassword as ResetPasswordNotification;

//オリジナルNotificationを使う
use App\Notifications\ResetPasswordNotification;

class User extends Authenticatable
{
    use Notifiable;

    ....

    //メソッド追加
    public function sendPasswordResetNotification($token)
    {
        $this->notify(new ResetPasswordNotification($token));
    }

}

```

追加したメソッドは、Userの上位クラス、Illuminate/Auth/Passwords/CanResetPasswordの記述のコピペ。Notificationクラス名が同じなら冒頭のuse文だけ変えれば切り替わるかと思ったけどダメだった。
AndroidのRecycleViewでrippleエフェクトが出ない時にチェックしたほうがいいこと

自分でかつて解決したのに再び自分でハマったので覚書。
~~なんでこれで直るのかは特に調べてないです(以前調べた気がするけど忘れた)~~→LinearLayoutの`android:foreground`の提供APIレベルが23からなのが原因っぽい(Referenceはレベル1と書かれてるらしい)。
なのでLinearLayoutにタグを指定しても動かない(MinSDKを23以上にしてもいいけど普及率を考えるとあまり現実的じゃない)。
一方でFrameLayoutでは`android:foreground`はレベル1から提供されてるので動いた、というのがからくり。

# rippleエフェクトが出ないxmlの書き方
```xml:ripple_ng_adapter.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:focusable="true"
              android:clickable="true"
              android:foreground="?android:attr/selectableItemBackground"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">
    <!-- 中身 -->
</LinearLayout>
```

rippleエフェクトの指定したXMLタグの中にAdapterの要素が実装されてる

# rippleエフェクトがでるxmlの書き方

```xml:ripple_ok_adapter.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:focusable="true"
             android:clickable="true"
             android:layout_height="wrap_content"
             android:foreground="?android:attr/selectableItemBackground">
    <LinearLayout android:orientation="vertical"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content">
    <!-- 中身 -->
    </LinearLayout>
</FrameLayout>
```

rippleエフェクトがFrameLayoutに指定されてて、その中にLinerLayoutを指定し、Adapterの主要素が実装されている
anyenv updateでmergeできないエラー

php7.1.4がでたのでインストールしようと`anyenv update` したらこんなエラーがでた。

```shell-session
$ anyenv update
Updating 'anyenv'...
Updating 'anyenv/anyenv-update'...
Updating 'phpenv'...
Updating 'phpenv/php-build'...
 |  From https://github.com/php-build/php-build
 |  6da869a..85a1dcf  master     -> origin/master
 |  * [new branch]      xdebug     -> origin/xdebug
 |  error: Your local changes to the following files would be overwritten by merge:
 |  share/php-build/definitions/7.1.0
 |  share/php-build/definitions/7.1.3
 |  Please commit your changes or stash them before you merge.
 |  Aborting
 |  Failed to update. Use 'verbose' option for detailed, or 'force' option.
Updating 'phpenv/phpenv-composer'...
```

どうやら`anyenv update`は、`git pull` してるだけのよう(たぶん)で、昔修正したdefinitionsとコンフリクトしている模様。

`git stash`でいったん退避して`anyenv update`したらいけた。

```shell-session
$ cd ~/.anyenv/envs/phpenv/plugins/php-build
$ git stash
$ anyenv update
Updating 'anyenv'...
Updating 'anyenv/anyenv-update'...
Updating 'phpenv'...
Updating 'phpenv/php-build'...
Updating 'phpenv/phpenv-composer'...
```

最後に`git stash apply`で退避した変更をもどしておく。

```shell-session
$ git stash apply
Auto-merging share/php-build/definitions/7.1.3
Auto-merging share/php-build/definitions/7.1.0
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   share/php-build/definitions/7.1.0
	modified:   share/php-build/definitions/7.1.3

no changes added to commit (use "git add" and/or "git commit -a")
```
MATLAB -> イラストレータでアクションを使用してクリッピングマスクなどを一発で解除する

MATLABで透明度などを保ったまま figure をイラストレータなどに貼りたい場合，下記のようにクリップボードに保存してそのままペーストする方法がある．

```
figure; hold on;
subplot(121); hold on
histogram(randn(128), -6:.05:6)
histogram(randn(128) + 2, -6:.05:6)
print('-clipboard','-dmeta', '-painters')
```
この場合，figure はグループになっているし，各axesでクリッピングマスクを形成しているので数があると大変面倒くさい．
イラストレータにはアクションというマクロ機能があるので大抵のことは自動化できる．ここではグループとクリッピングマスク解除のマクロを設定する

![0.PNG](https://qiita-image-store.s3.amazonaws.com/0/28835/29050930-99ce-a44c-9ca4-3fff49b2df56.png)

ただ貼り付けるとこのようになっているので下のようなマクロを登録する．アクションパネルの右から二番目のボタンを押すと新規アクションが設定できる
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/28835/f61ef222-6b62-3bd4-6a66-a0ac1b963002.png)

適当な名前とショートカットを設定する．図を選択したあと，上のメニューからグループ解除，クリッピングマスク解除を行い，アクションパネルの四角いボタンを押すと登録が完了し，いつでもショートカットで上記のアクションが呼び出せる．

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/28835/f7c55550-43de-b8db-55e2-c41f8d66c2c5.png)

この状態の方がつかいやすいよね？この状態でMATLABから貼り付けられる方法をしってたら教えて欲しい．
シェル作成（個人メモ）

作ったシェルスクリプトはこれ↓

```bash:sample.sh
#!/bin/sh

# 作業ディレクトリ
BASE_DIR=/home/batchuser
# カレントディレクトリを移動
cd $BASE_DIR

# (1) 処理対象ファイルを決める
# 処理対象ファイル名：FYYY_YYYYMM.zip
# ・FYYY：年度（例：2016, 2017...など）
# ・YYYYMM：年月（その年月までを含むデータ）
# ・処理対象：バッチ実行日の前月データ
# 　例）2017/04/14に実行→FYYY_201703.zipを処理する
# (1-1) 前月を求める必要があるので当月1日を求める
this_month=`date +'%Y/%m/01'`
# (1-2) 検索ファイル名：*_YYYYMM.zip（YYYYMMは前月）
file_name_part=*`date -d "$this_month 1 month ago" +'%Y%m'`.zip #(※1)

# (2) 処理対象ファイルをbackupに移動する
# バックアップディレクトリ名：/home/batchuser/backup/YYYYMMDD
# ・YYYYMMDD：バッチ処理日
# (2-1) 本日を求める（YYYYMMDD）
today=`date +'%Y%m%d'`
# (2-2) バックアップディレクトリ名を決定
backup_today_dir=./backup/$today
# (2-3) 未作成ならディレクトリを作成する
if [ -e $backup_today_dir ]; then #(※2)
        : #(※3)
else
        mkdir $backup_today_dir
fi
# (2-4) 対象ファイルをbackupにすべて移動する
ls -1 ./$file_name_part | while read filename #(※4)
do
        mv $filename ${backup_today_dir}/
done
```

(※1)：　一ヶ月前を求めるにはまず当月1日を求めなければならない。
```"2017/03/30 1 month ago"```とすると```2017/03/01```になってしまう(仕様)。
(※2)：　ファイル（ディレクトリ）の存在チェック
→　```if [ -e ${path} ]; then : else : fi```
(※3)：　bashで何も処理をしない場合は ```:```
(※4)：　ファイルリストを複数行に出して、複数行を繰り返し処理する
Kerasを乗せたDockerのイメージをECSでAPIとして利用するために、どのようなインスタンスを選択するべきか


あくまでも個人で実際に試した内容であり、これから環境を構築するという方に対しての一つの情報になればいいなと思っています。

環境
---

* API
	* アプリサーバ（Docker)
		* flask v0.12.1
		* gunicorn v19.7.1
		* keras v2.0.3
	* Webサーバー
		* nginx

* 負荷分散
	* Application load balancer


今回やったこと
---

* c4.xlargeを4台立ち上げて、タスクを4つ作成
* c4.4xlargeを1台立ち上げて、タスクを1つ作成


| インスタンスタイプ| vCPU | メモリ |
| --- | --- | --- |
| c4.xlarge | 4 | 7.5 |
| c4.4xlarge | 16 | 30 |


ECSでのリソースの割り当ては以下

* c4.xlargeを使う場合の設定

![スクリーンショット 2017-04-14 16.44.31.png](https://qiita-image-store.s3.amazonaws.com/0/18331/bedea269-1989-39cd-3a96-63f9779bbb82.png "スクリーンショット 2017-04-14 16.44.31.png")

* c4.4xlargeを使う場合の設定

![スクリーンショット 2017-04-14 16.45.00.png](https://qiita-image-store.s3.amazonaws.com/0/18331/35aae942-d0a2-91c7-c42e-96fa91d80808.png "スクリーンショット 2017-04-14 16.45.00.png")

gunicornがkerasを積んだニューラルネットワークの計算を行うもの、nginx_gunicornはnginx

（微妙なリソースの割り当て割合の差とか出ていますが...）


負荷をかけてみる
---

Tsungを使って、予測するURLに負荷をかけてみました。
[Tsungを積んだDockerで負荷テストを行う
](http://qiita.com/RyujiKawazoe/items/042f07c679cbf01fff02)

テスト内容は、180秒で2秒間に1回ユーザーが新規にアクセスをするといった感じ

* c4.xlarge * 4

![graphes-HTTP_CODE-total_tn.png](https://qiita-image-store.s3.amazonaws.com/0/18331/925f6f6c-9b0d-aec4-d5e2-77869b18aaae.png "graphes-HTTP_CODE-total_tn.png")

* c4.4xlarge * 1

![graphes-HTTP_CODE-total_tn.png](https://qiita-image-store.s3.amazonaws.com/0/18331/1d6e2b8f-a0b1-8b21-2b4f-b7909393c86c.png "graphes-HTTP_CODE-total_tn.png")


結論を言うと、今回はスケールアップした方が負荷に対して強かった。


少しグラフの見方があっているかわからないので、正しい確証ないのですがcloudwatchなどと照らし合わせて考えると、c4.xlargeで待ちうける場合、ある時点からレスポンスの時間が低下し始めタイムアウトが発生しエラーが右肩上がりに増える。


感想
---


最適なリソースの割り当てが、どうするべきかまだDocker運用もニューラルネットワーク用の数値計算ライブラリの運用もペーペーなので、最適解があれば教えて欲しいです
Vagrant環境でwebpack-dev-serverを動かしたい

# 背景

Ruby on Rails 5.1.rc1 で webpacker を使ってみたかったので、手始めに
[【動画付き】Rails 5.1で作るVue.jsアプリケーション ～Herokuデプロイからシステムテストまで～](http://qiita.com/jnchito/items/30ab14ebf29b945559f6)
を参考にして環境を整えていた。

## バージョン

- rails (5.1.0.rc1)
- webpacker (1.1)

# 問題：webpackerでビルドしたjsが取ってこれない

vagrantは今までも使っていたので、鼻歌混じりに http://localhost:3031/ を叩くも、画面には何も表示されない。
（ポートフォワーディングでホストOS側を `3031` に設定済み）
Chromeのコンソールを見ると

```コンソールログ
Failed to load resource: net::ERR_EMPTY_RESPONSE    hello_vue.js
```

と出ていて、hello_vue.jsが取れていなかった。

# 対応

## webpack-dev-serverを起動する

`javascript_pack_tag` を使うとwebpackでビルドしたjsファイルへの参照に置換してくれるが、参照先のポートは設定した覚えのない `8080` になっていた。
`rails s` では `3000` を使うようにしていたし、ホストOS側からは `3031` で繋がるようにしていたので、当然のことながら繋がらない。

そこで `8080` はどこで設定されたものなのかを調べると、`rails webpack:install` で作られた `config/webpack/development.server.yml` というファイルで見つかった。

ここに記載されているポート番号は、そのまま `javascript_pack_tag` で利用されるようなので、ポートフォワーディングでホストOS側に設定しても良いポート番号と同じにしておく。
また、hostが `localhost` だと、ホストOS側から見ることができないので、 `0.0.0.0` に設定しておく。

```config/webpack/development.server.yml
# Restart webpack-dev-server if you make changes here
enabled: true
host: '0.0.0.0'
port: 8881
```

## ポートフォワーディングを設定する

`rails s` 用の設定とは別に、 `webpack-dev-server` 用の設定を追加する。
この時、ゲストOSとホストOSのポート番号を同じにしておく。

```Vagrantfile
  config.vm.network "forwarded_port", guest: 3000, host: 3031 # rails s
  config.vm.network "forwarded_port", guest: 8881, host: 8881 # webpack-dev-server
```

最後に `vagrant reload` で設定をリロードし、 `webpack-dev-server` を起動する。

```sh
bin/webpack-dev-server
```

これで改めてホストOS側から `http://localhost:3031/` を読み込めば正しく表示される。

# 最後に

`webpack-dev-server` で設定したポート番号をホストOS側で使えるようにしなければいけないのが気持ち悪い...。
`javascript_pack_tag` で任意のポート番号（＝ホストOS側で設定したいポート番号）が使えれば解決しそうな気がするので、要調査。

# 参考

[rails/webpacker](https://github.com/rails/webpacker)
[【動画付き】Rails 5.1で作るVue.jsアプリケーション ～Herokuデプロイからシステムテストまで～](http://qiita.com/jnchito/items/30ab14ebf29b945559f6)
[Vagrant+webpack-dev-serverでプライベートIPに接続できない時の対処](http://qiita.com/msykd/items/7e72c4a942610e39b317)
お一人様のMastodon


[Mastodon](https://github.com/tootsuite/mastodon)を見ていたら、`SINGLE_USER_MODE`という設定項目があった。

- トップページは`アカウントID=1`のストリームに固定(リダイレクト)される
- `/about`からサインアップできない。(入力はできるけど、トップに戻り何も起きない)
- Adminの管理はできる

公開インスタンスリストにも3つばかりSingleな奴がいますし、作ってもいいんじゃないかと。

[List-of-Mastodon-instances](https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/List-of-Mastodon-instances.md)


## SINGLE_USER_MODEをセットアップする

まずは普通に立ち上げよう。準備。

- cp .env.production.sample .env.production
- `vim` .env.production
  - `rake secret`を埋めたり。
  - 手元でやってみる場合、LOCAL_DOMAINはとりあえず`localhost:3000`を入れとくとよいです。

Rails的な色々をしつつ起動。

- docker-compose build/up
- rake db:migrate
- rake assets:precompile
  - Webにスタイルが当たってなかったらVolume失敗してるのでdocker-compose upしなおせばOK

サインアップします。

http://localhost:3000/about で適当に入力。メールは送信できなくてもよい。

### メール強制confirmationと管理者に昇格

サインアップ後のメール認証はタスクでもできるのでします。お一人なので管理者にもしておきましょう。

```
docker-compose run --rm web rails mastodon:confirm_email USER_EMAIL=sawanoboly@example.com
docker-compose run --rm web rails mastodon:make_admin USERNAME=sawanoboly
```

一旦railsのコンテナを止めて、

設定から`SINGLE_USER_MODE=true`とします。

これでもう一度起動しすれば、たいていのアクセスは`http://localhost.local:3000/@sawanoboly`にリダイレクトされるようになります。

![sawanoboly_-_Mastodon.jpg](https://qiita-image-store.s3.amazonaws.com/0/7454/2e727edc-4228-6993-a527-2177fb4ea335.jpeg "sawanoboly_-_Mastodon.jpg")


Tootするときには、 http://localhost:3000/auth/sign_in に直接訪れれば自分はログインできるので`/web/*`でやりましょう。

![Mastodon.jpg](https://qiita-image-store.s3.amazonaws.com/0/7454/1350b70d-3e00-c22f-e07d-211beea489a6.jpeg "Mastodon.jpg")

- 管理画面には`Open registration`の項目があるので、`Disabled`にすれば登録フォームが消えます。

フェデレーション用のTCP/4000はどうなるのかまでを見てないですが(試すにはもう1セット立ち上げればよいのかな？)、シングル運用のインスタンスでもフォロー・フォロワーの数はあるしなんとかなるんでしょう。



## 運用


スキーマ定義に`enable_extension "plpgsql"`ってあったから、RDBはPostgreSQLしかダメなのかなってなると、ホスティングしてるPaaSがよいなあと思う次第。
SideKiq用のRedisもいるし、公式デモに習ってscalingoやらherokuが楽かなって思いますが、web+workerになるのはなーと。

画像などはローカルのほかにAmazon S3が使えます。S3のほうは互換性があれば他でもよさそう(rubygemsのPaperclipを使ってた。)。`S3_ENDPOINT(API),S3_HOSTNAME(配信ドメイン)`が環境変数から指定できるようになっているので、国内でも色々選択肢はあったはず。
手間とお金が安く運用できそうな組み合わせを考えてみるのもよいね。

ちなみにメールはサンプル設定にもあるように、Mailgunで不自由しないと思います。それか場所によってはSMTP_METHODをsendmailにしときゃ十分。


> 意外と反応が多いので追記: 
>
> docker-composeでそのまま起動して運用もそこそこできますが、補足しておきます。
>
> - docker-compose.ymlでは、volumeのコメントアウトを外して、(少なくとも)volumeをローカルのホストに書き出しておくと`docker-compose rm`しても残ります。
> - 3000, 4000はこのようにnginxでリバースプロキシをつけましょう。
>   - https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Production-guide.md
>   - 証明書はサンプルにもあるようにLetsEncryptでやるとよいです。
> - この例そのまま、localhostでやっては意味がないので、それがよくわからなかったらやめとく方が無難です。
> 

なお、データをエクスポートできるようなので飽きたら止めて移住できそう。フォロワーから見てドメインがどうなるんだろうという点は気になりますけど。
Webサーバで公開鍵認証を実施する

▪️　構成
クライアント：　mac book
サーバ：CentOS

▪️実装
１：鍵の生成
クライアントで以下を実行。
「ssh-keygen -t rsa -C "hoge@example.com"」
hogeが名前？
$ ssh-keygen -t rsa
Enter file in which to save the keyと聞かれるので、鍵の名前（今回はid_rsa）を入力する。
次にEnter passphrase (empty for no passphrase):と、パスフレーズを聞かれるので入力します。空にするとパスフレーズ無しで生成できます。今回はくろたんじょうにした。

すると、カレントディレクトリに以下の2ファイルが生成される。
id_rsa （秘密鍵）
id_rsa.pub （公開鍵）

２：サーバ側の設定
２−１：公開鍵の配置
ユーザでログイン。
ディレクトリとファイルを作成し、権限を整える。
この時、rootでファイルを作ると、権限以外に、所有者などの変更も行わないといけないので、注意。

mkdir .ssh
chmod 700 .ssh
touch .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
vi ~/.ssh/authorized_keys
→　ここで
authorized_keys
に
id_rsa.pub （公開鍵）
の内容をコピーする


２−２：SSHの設定
/etc/ssh/sshd_config
の
PasswordAuthentication yes
を
PasswordAuthentication no
に変更する。変更した後は、リスタートを忘れずに。


２−３：SSHに秘密鍵を用いてログインする
ssh -l アカウント名 -i id_rsa IPアドレス
パスフレーズは設定したものを入力。無事にSSH接続ができれば完了。


番外：Macのときの注意！
誰かが作った秘密鍵を使う場合、MacではPutty形式の秘密鍵は使えないので、OpenSSH形式に変換する必要あり。変換はWindows上で、PuttyGeneとか使えば簡単にできた。
Python初心者がGoogle Play Musicの非公式APIをたたいて音楽を流す

#まえがき
これ以前にPython触ったことないです
GUI？知らない子ですね漢は黙って端末叩くもんでしょ

#事の始まり
google play music 関連でこんなものをを見つけた
https://github.com/simon-weber/gmusicapi
↓
python触ったことないけど面白そう

#環境構築など
##環境
Windows10 Home 64bit
Anaconda3-4.3.1
python-vlc
gmusicapi https://github.com/simon-weber/gmusicapi
たぶんVLCのインストール（いらないかも）

##まずはPython
よくわかんないかったけどAnacondaってのが楽らしい
https://www.continuum.io/downloads#windows

##モジュール
pipという便利なものがあるらしい
pipでpython-vlcとgmusicapiとurllib3をインストール

#作業
参考になるものを探してたら
こんなものが
[Amazon Dash ボタンで Get Wild を流す by Google Play Music（Chromebookで失敗編）](http://qiita.com/keihino/items/8c2afb3a248f13bbad6b)

ふむふむ

英語と格闘しながら
http://unofficial-google-music-api.readthedocs.io/en/latest/index.html
と
https://github.com/simon-weber/gmusicapi/blob/develop/example.py
を読み漁る

#詰まったポイント
##python-vlcの情報がすくないので自分でソースを読むしかない
また英語と格闘
https://github.com/oaubert/python-vlc/blob/master/generated/vlc.py

##APIの機能がそこまで豊富じゃない
プレイリストから楽曲を引っ張ってくる方法がわからない
↓
じゃあもう検索しよう
↓
searchだ
↓
帰ってくる辞書の処理に手間取る
↓
検索にヒットした一番最初の曲をとりあえず再生しよう

あとはひたすら格闘

#結果
![cap4-14.JPG](https://qiita-image-store.s3.amazonaws.com/0/165966/50aa4164-d2ad-72ae-cd4a-219966eeca86.jpeg)

なんかいろいろ表示されるけど
音ながれたあああああ

##問題点
途中でストリームが止まる
![cap4-14-2.JPG](https://qiita-image-store.s3.amazonaws.com/0/165966/ff1df257-f96a-2fea-822f-eae3b9f896a0.jpeg)

#あとがき
Pythonのモダンな書き方にやられた
数日格闘したけど結局普通に再生したほうが楽
英語の勉強になった
Macは試してないけどUbuntu14.04のpython3でも動いた

#Githubのリンク
https://github.com/johejo/mygpm/blob/master/mygpm.py

#4/15追記
python-vlcのvlc.pyにバグがあるようです。
Macのターミナルで動作テストした場合にAttributeErrorが起きました。
stack overflowにも同様の質問がありました。
http://stackoverflow.com/questions/17440802/vlc-python-module-not-working-in-ubuntu

色々試した結果
http://git.videolan.org/?p=vlc/bindings/python.git;a=tree;f=generated;b=HEAD
こちらのvlc.pyを持ってきてpython-vlc内のものと差し替えると正常に動作するようです。

python-vlcで参照しているvlc.pyは以下のスクリプトでパスを確認できます。

```check_vlc.py
import vlc
print(vlc.__file__)
```


Noneオブジェクトの処理がウンタラカンタラ。。。。。らしいですが私にはよくわかりませんでした。
Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $　とは(備忘録)

# はじめに
Android開発でHTTPSのGETリクエストは必然的になってきます．
HTTPSのGETリクエストを行い，それに対するレスポンスが返ってきます．
今回は返ってきた結果がJSON文字列であるときのお話です．

# 参考
こちらを参考にしました．
http://qiita.com/furusin_oriver/items/59dd0ae6dc795737eded
いざ実行！

エラー:frowning2:

```error:terminal
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
```

# 原因
原因は取得したJSON文字列の書式問題でした．
つまり用意している格納変数は

```json:sample1
{
  "name": "Name",
  "todofuken": 36,
  "address": 1,
  "img_url": "https://xxx.s3.amazonaws.com/uploads/user/foo.jpg?xxx..."
}
```

であれば成功していたけど，

```json:sample2
[
 {
  "name": "Name1",
  "todofuken": 36,
  "address": 1,
  "img_url": "https://xxx.s3.amazonaws.com/uploads/user/foo.jpg?xxx..."
}
,
{
  "name": "Name2",
  "todofuken": 36,
  "address": 1,
  "img_url": "https://xxx.s3.amazonaws.com/uploads/user/foo.jpg?xxx..."
},

.
.
.

,
{
  "name": "NameN",
  "todofuken": 36,
  "address": 1,
  "img_url": "https://xxx.s3.amazonaws.com/uploads/user/foo.jpg?xxx..."
}
]
```
のように配列のようになっていたのが原因でした．
もっと簡単に大袈裟にいうと

```java:
int x;
ArrayList<String> array = new ArrayList<String>();
x = array;//エラー
```

みたいな感じになっているのが原因でした．
そりゃ型が合わないと変数は入れれませんよね...:sweat:

# 解決策
解決策としてはその

```java:

int x;
ArrayList<String> array = new ArrayList<String>();
x = array;//エラー
```

を

```java:
ArrayList<String> array1 = new ArrayList<String>();
ArrayList<String> array2 = new ArrayList<String>(array1);
```
みたいな感じで型を合わせてやればいいといきつきました．
# 結論
レスポンスを格納する変数を全てArrayListにしてください．

# 余談
Java初心者で，不具合等ございますが，ご了承ください．
v8のソースのダウンロード＆ビルド


社内勉強会資料。

[Building from Source · v8/v8 Wiki](https://github.com/v8/v8/wiki/Building-from-Source)

## 事前準備

下記が必要

- git
- python
	- 2.7以上推奨

## depot_tools

- [depot_tools(7)](http://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools.html)
- [depot_tools_tutorial(7)](http://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html)

### depot_tools とは？

depot_toolsは、ChromiumやChromium OSのソースコードのダウンロードやレビューの管理などを行うためのスクリプト集。v8もdepot_toolsを使ってソースコードのダウンロードとビルドができる。

### depot_tools のインストール

Linux/macは、git cloneして、PATHに追加すればOK。

```
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
$ export PATH=`pwd`/depot_tools:"$PATH"
```

Windowsは↑のチュートリアルを読んでください。

depot_toolsの中でも下記を使います

- fetch: ソースコードのダウンロード
- gclient: 3rd partyリポジトリのアップデート＆依存関係の解決
- gn: ビルドに使うビルドファイルの生成
- ninja: ビルドツール

## v8のソースコードのダウンロード

depot_toolsのfetchで簡単にダウンロード（チェックアウト）できる

```
$ fetch v8
$ cd v8
```

その他のプロジェクトもfetchでダウンロードできる

```
$ fetch chromium  # Basic checkout for desktop Chromium
$ fetch android   # Chromium checkout for Android platform
$ fetch ios       # Chromium checkout for iOS platform
```

## 依存関係の解決

v8ディレクトリで`gclient sync`すれば、OK。

```
$ gclient sync
```

チュートリアルには、

> You will need to run this any time you update the main src checkout, including when you switch branches.

と書いており、ソースコードのチェックアウト、ブランチ変更を行った時に実行する必要があるみたい。

## ビルドファイルの生成

tools/dev/v8gen.pyを実行すると、out.gn以下にビルドファイルが出力される

```
v8ディレクトリで
$ tools/dev/v8gen.py x64.debug

out.gn/x64.debugに出力される
$ ls -l out.gn/x64.debug
total 120
drwxr-xr-x  10 XXXX  XXXX   340B Apr 14 14:37 ./
drwxr-xr-x   4 XXXX  XXXX   136B Apr 14 14:34 ../
-rw-r--r--   1 XXXX  XXXX    16B Apr 14 14:37 .ninja_deps
-rw-r--r--   1 XXXX  XXXX    15B Apr 14 14:37 .ninja_log
-rw-r--r--   1 XXXX  XXXX   119B Apr 14 14:34 args.gn
-rw-r--r--   1 XXXX  XXXX    13K Apr 14 14:34 build.ninja
-rw-r--r--   1 XXXX  XXXX   2.9K Apr 14 14:34 build.ninja.d
-rw-r--r--   1 XXXX  XXXX     2B Apr 14 14:34 mb_type
drwx------  60 XXXX  XXXX   2.0K Apr 14 14:37 obj/
-rw-r--r--   1 XXXX  XXXX    24K Apr 14 14:34 toolchain.ninja
```

tools/dev/v8gen.py listで事前に用意されているプリセット一覧が出力される

```
$ tools/dev/v8gen.py list
arm.debug
arm.optdebug
arm.release
arm64.debug
arm64.optdebug
arm64.release
ia32.debug
ia32.optdebug
ia32.release
mips64el.debug
mips64el.optdebug
mips64el.release
mipsel.debug
mipsel.optdebug
mipsel.release
x64.debug
x64.optdebug
x64.release
```

v8gen.pyはdepot_toolsのラッパーで、gnを直接使う方法は下記に書いてある。

[Building with GN · v8/v8 Wiki](https://github.com/v8/v8/wiki/Building%20with%20GN)

## ビルド

depot_toolsのninjaを使う。v8gen.pyで生成したビルドファイルのディレクトリを-Cに指定して、ビルドする。（結構時間が掛かる）

```
$ ninja -C out.gn/x64.debug
```

ビルドすると、out.gn/x64.debug以下に色々生成されている。out.gn/x64.debug/d8を実行するとREPLが起動する。

```
$ ./out.gn/x64.release/d8
V8 version 5.8.0 (candidate)
d8> 1+1
2
d8> function add(a, b) { return a + b; }
undefined
d8> add(1, 1)
2
d8>
```

## その他

[Exposing HomeObject – Hacker Noon](https://hackernoon.com/exposing-homeobject-e61061cbfe17)

上記記事が結構参考になった。ソースを書き換えて再ビルドして、d8で確認したり。あと、ソースを読むだけなら、ブラウザから検索できるっぽい。

[Code Search](https://cs.chromium.org/)
TypeScript 色々な関数型の記法

TypeScript の関数型の記法がわかりづらいのでメモ。

普通の関数定義の型は、各パラメータの後ろにコロンで区切って型を書く。
戻り値はパラメータのカッコの後ろにコロンで区切って型を書く。

    function sum (a: number, b: number): string {
      return `${a} + ${b} = {a + b}`;
    }

Arrow function の場合も同じ。

    const sum1 = (a: number, b: number): string => {
      return `${a} + ${b} = {a + b}`;
    };

パラメータでは無く、変数の後ろに型を書きたい場合は (a: number, b: number) => string のように => で区切って戻り値の型を書く。

    const sum2: (xxx: number, yyy: number) => string = (a, b) => {
      return `${a} + ${b} = {a + b}`;
    };

この場合、型の前のパラメータ名 xxx や yyy は明らかに無駄だが、省略出来ないみたいだ。絶対に省略出来ないわけがないと思って探し回って無駄だった。
標準入力から空行を消す

いつも調べながらやっていたが、これなら覚えられるような気がしたのでメモ。

```bash
cat file.txt | perl -lne 'print if length'
```

ちょっと応用すると、80文字以上の行を抜き出すにはこんな感じ。

```bash
cat file.txt | perl -lne 'print if length($_) > 80'
```
IntelliJで複数モジュールを持つsbtプロジェクトの特定モジュールのmainメソッドを実行

IntelliJで、複数モジュールをもつsbtプロジェクトの開発をしている時。
特定モジュールのmainメソッドを実行したい場合の設定方法。

sbtのバージョンは0.13.13, IntelliJはUltimate 2016.3

1. メニュー[Run]より[Edit Configurations...]を選択。
2. 「SBT Task」を追加し、Tasksの欄に以下のように記入

`"project your-module-name" run`

「your-module-name」には、あなたが動かしたいmainメソッドがあるモジュールの名前を指定。
画面だとこんな感じ。

![runscreenshot.png](https://qiita-image-store.s3.amazonaws.com/0/34732/0bd51ec7-151c-7766-2ef8-e887381691c1.png)
MacのターミナルからSSHしたOSでsuになると日本語入力ができなくなる問題の解決策

# 具体的な状況
iTerm2上で```vagrant ssh```したCentOS 6.5上で、```sudo su```したところ、
日本語入力ができなくなった。

# 対策方法
```sudo su```する前（vagrantユーザ）の.bashrcに日本語入力設定を行う

# 実際の操作
vagrantユーザで```.bashrc```を開く。

```
$ vim ~/.bashrc
```

以下を追記。

```vim:~/.bashrc
export LESSCHARSET=utf-8
```

suに切り替える

```
$ sudo su
```

＿人人人人人人人人人＿
＞　日本語が打てる　＜
￣Y^Y^Y^Y^Y^Y^Y^Y￣