OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyでcurlコマンドを組み立てる

# Gemを使わない方法

下記URLから`curl_builder.rb`をダウンロードし、自分のスクリプトから`require`する。
https://gist.github.com/aoyama-val/502631dc6e20d7987b9fc7b8bd521767#file-curl_builder-rb

使い方：

`CurlBuilder#build`は`curl`コマンドラインを組み立てて文字列として返す。

```ruby
require_relative "./curl_builder.rb"

c = CurlBuilder.new
puts c.build(base_url: "http://httpbin.org/get", params: {a: 123, b: "hoge"}, headers: {"X-Hoge": "myheader"})
# => curl -X GET 'http://httpbin.org/get?a=123&b=hoge' -H 'X-Hoge: myheader'  -v  -s 
```

```ruby
puts c.build(base_url: "http://httpbin.org/post", method: "POST", params: {a: 123, b: "hoge"}, headers: {"X-Hoge": "myheader", "Content-Type": "application/json"}, body_filename: "body.json")
# => curl -X POST 'http://httpbin.org/post?a=123&b=hoge' -d '@body.json' -H 'X-Hoge: myheader' -H 'Content-Type: application/json'  -v  -s 
```

`CurlBuilder#exec`はコマンドラインを組み立ててそれを実行する。コマンドライン、標準エラー出力、標準出力をそれぞれ色分けして表示してくれるのが少し便利なところ。

```ruby
c.exec(base_url: "http://httpbin.org/post", method: "POST", params: {a: 123, b: "hoge"}, headers: {"X-Hoge": "myheader", "Content-Type": "application/json"}, body_filename: "body.json")
```

# Faradayを使う方法

[faraday_curl](https://github.com/mauricio/faraday_curl)というFaradayのアダプタを使うと、Faradayのインターフェイスを使って書いたコードから`curl`コマンドを出力できる。

```
$ gem install faraday
$ gem install faraday_curl
```

```ruby
require 'faraday_curl'
require 'logger'

domain = "http://httpbin.org/"
logger = Logger.new(nil)

conn =  Faraday.new(:url => domain) do |f|
  f.request :url_encoded
  f.request :curl, logger, :warn
  f.adapter Faraday.default_adapter
end

response = conn.get do |req|
  req.url "/get"
  req.headers['Authorization'] = auth if @use_get_token
end

p response.env[:curl_command]
# => ["curl", "-v", "-X GET", "-H 'User-Agent: Faraday v0.14.0'", "\"http://httpbin.org/get\""]```
```
sls deployしたら ServerlessError: Signature expired が出たときの対処

#はじめに

`sls deploy`を実行した後に、エラーが発生しました。

```
  Serverless Error ---------------------------------------
 
  ServerlessError: Signature expired: 20180412T100757Z is now earlier than 20180412T101229Z (20180412T101729Z - 5 min.)
 
  Stack Trace --------------------------------------------
 
```

AWSにデプロイするときにクライアント側の時刻が現在時刻と10分以上差がありました。
その為、`Signature expired`が発生しました。
ということで、時刻同期を行いました。

#開発環境
* VirtualBox 5.2.8 r121009
* ubuntu 14.04

#対処
以下のコマンドを実行します。

```
$ sudo ntpdate -v ntp.nict.jp
```

これで、時刻が同期されましたので、再度デプロイを実行すればOKです。
LaravelでPug（旧Jade）を使う

bladeだけだと、html自体は素なので
Railsやってた時の様にhamlやslimっぽく書けたらなーと思って探してみた。

意外とこの手のやつは少なくて見つけたのはこちら。
[GitHub - BKWLD/laravel-pug: Pug view adapter for Laravel and Lumen](https://github.com/BKWLD/laravel-pug)

## 環境

- Laravel v5.6.6

## インストール

README通り

```sh
$ composer require bkwld/laravel-pug
```

```diff:app/Exceptions/Handler.php
<?php                                                                                                                                                             

namespace App\Exceptions;

use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Auth\AuthenticationException;
+ use Bkwld\LaravelPug\ExceptionHandlerTrait;

class Handler extends ExceptionHandler
{
+   use ExceptionHandlerTrait;

    /**
     * A list of the exception types that are not reported.
     *
     * @var array
     */
    protected $dontReport = [
        //
    ];

    ...

   /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $exception
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $exception)
    {
-       return parent::render($request, $exception);
+       return $this->filterErrorResponse($exception, $request, parent::render($request, $exception));
    }
}
```

## テンプレート

```haml:index.pub.blade
html                                                                                                                                                              
head
  meta(charset="utf-8")
body
  h1 ユーザ一覧
  table
    @foreach($users as $user)
    tr
      td {{ $user->name }}
    @endforeach
```

簡潔で綺麗なテンプレートですね。

ただ実践投入してないので、速度的に少し心配です。
[Java] 文字列と数字が混在している場合のソートTips

前回の[[Java8] 従業員のソートから考えるComparableとComparatorの適切な使い方](https://qiita.com/ekuro/items/458a9dffdb8fbb443c9e)に引き続きソート時のTipsです。

探してみてもあまり見つからなかったのですが、

```Java
["2", "32", "100", "13", "1", "21"]
```
こんな配列や

```Java
["A02", "12", "A11", "A01", "B01", "A21"]
```
こんな配列を**「よしなに」**ソートをしたい！と思ったことありませんか？

いちいち数字にパースするもの面倒だし、パースする場合は数字じゃない場合の制御も面倒ですよね。
大した内容ではないのですが、わりと簡単な処理で解決できるなぁと思ったので、処理内容を書いておきます。

```Java:期待されるソート結果
["1", "2", "13", "21", "32", "100"]
// -> ソート前 ["2", "32", "100", "13", "1", "21"]

["12", "A01", "A02", "A11", "A21", "B01"]
// -> ソート前 ["A02", "12", "A11", "A01", "B01", "A21"]
```

結論を書くと、**まず文字列の長さを比較した上で、文字列同士の比較すること**です。

実際に書いてみます。

```Java:文字列の長さを比較してから、文字列同士を比較
pubic List<String> sort(List<String> list) {
    list.sort((s1, s2) -> {
        if (compareLength(s1, s2) == 0) {
            return s1.compareTo(s2);
        }
        return compareLength(s1, s2);
    });
    return list;
}

private int compareLength(String s1, String s2) {
    if (s1.length() > s2.length()) {
        return 1;
    } else if (s1.length() < s2.length()) {
        return -1;
    } else {
        return 0;
    }
}
```

```Java:実行結果
List<String> list1 = new ArrayList<>(Arrays.asList("2", "32", "100", "13", "1", "21"));↲
List<String> list2 = new ArrayList<>(Arrays.asList("A02", "12", "A11", "A01", "B01", "A21"));↲
List<String> list3 = new ArrayList<>(Arrays.asList("0002", "0032", "0100", "0013", "0001", "0021"));↲

System.out.println(ArrayUtils.toString(sort(list1)));
System.out.println(ArrayUtils.toString(sort(list2)));

// 実行結果
[1, 2, 13, 21, 32, 100]
[12, A01, A02, A11, A21, B01]
```

ちなみに桁が0埋めされているケースでも、桁数が同じであれば想定通りにソートしてくれます。

```Java:0埋めの場合
List<String> list = new ArrayList<>(Arrays.asList("0002", "0032", "0100", "0013", "0001", "0021"));↲

System.out.println(ArrayUtils.toString(sort(list)));

// 実行結果
[0001, 0002, 0013, 0021, 0032, 0100]
```

**「よしなに」**ということでどのようなシチュエーションでも使えるものではないと思いますが、個人的には思い通りの結果が得られて満足しております。
もっとスマートに処理できるようなロジックだったり、この方法だと「よしなに」処理できないようなリストがあれば是非共有していただけると嬉しいです！

### 追記

下記のようにするとよりシンプルになるとコメントいただきました！

```Java
List<String> list = Arrays.asList("2", "32", "100", "13", "1", "21");
list.sort(Comparator.comparing(String::length).thenComparing(Function.identity());
System.out.println(list);
```
capistranoより自動デプロイは正常完了したが、本番環境でhttpエラー500が返ってくる

自分用の備忘録

# 現象
capistranoによりデプロイは正常完了したが、本番環境でhttpエラー500が返ってくる。
ログイン画面は正常に表示されるが、その他が全部ダメ。

# 原因・解決策
nginxを再起動しても状況は変わらない。
unicornがおかしいのでは？とあたりをつける。
そこでunicornを落として、再度capistranoより自動デプロイしてみる。（unicornが落ちてても自動デプロイしたらunicornも起動する）

```ruby:ターミナル
[ec2-user@ip-100-10-10-10 test-APP]$ kill -QUIT `cat tmp/pids/unicorn.pid` #unicornを落とすコマンド
cat: tmp/pids/unicorn.pid: そのようなファイルやディレクトリはありません
kill: 使用法: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... または kill -l [sigspec]
```

うまくいかない・・・。
プロセスから落としてみると・・・

```ruby:ターミナル
[ec2-user@ip-100-10-10-10 test-APP]$ ps aux | grep unicorn #unicornのセッションを調べる
ec2-user 13757  0.0  0.2 110484  2104 pts/0    S+   02:18   0:00 grep --color=auto unicorn
ec2-user 26827  0.0  8.6 352560 87512 ?        Sl   Apr10   0:02 unicorn master -c /var/www/test-APP/current/config/unicorn.rb -E deployment -D                                               
ec2-user 26868  0.0 10.4 372912 106504 ?       Sl   Apr10   0:06 unicorn worker[0] -c /var/www/test-APP/current/config/unicorn.rb -E deployment -D
[ec2-user@ip-100-10-10-10 test-APP]$　kill -9 26827 #pプロセスを強制的に落とす。
[ec2-user@ip-100-10-10-10 test-APP]$ ps aux | grep unicorn #プロセスが落ちたかどうか確認
ec2-user 15012  0.0  0.2 110484  2228 pts/0    S+   02:33   0:00 grep --color=auto unicorn
```

これで落とせたので、自動デプロイしたらうまくいった。

参考
[プロセスを終了するkillコマンドの使い方まとめ！](https://eng-entrance.com/linux-command-kill)
MacでMatLabをつかってみたレビューとかをつらつら綴る話

## 要旨

　研究室のMacにMatLabをインストールした．
　その結果，Macの操作性が神すぎて参照しているディレクトリのファイル名を
いじったりするのが非常に楽で，
Macのキーボードがそこそこ打ちやすいからコーディングがそこそこはかどって，
Macの見た目が綺麗だからどや顔でプログラムを回すことができる利点があった．
　しかし，Winとの互換性を考えると，特にExcelファイルの吐き出し関連が
あまり賢くなく(というかExportできん)，
仕様としてはかなり悲しみの深い悲しみとなった．

## 概要

研究室のMacでMatLabを使う機会があったので思った事をつらつらとかいてみようと思いました．

## インストールして気付いたこと

MacもWin同様そんなにインスコにはとまどりはなかったです．何が必要なのかは事前に見極める必要がありますが．

## 立ち上げて見て思った事．

見た目はよくあるIDEですので，詰まるところWinと変わらぬMatLabです．
ファイルのリネームとかEnter x2とかめっちゃ神ですね．
あとMacintoshのキーボードは代々打ちやすいのでとても打ちやすかったです(ThinkPadユーザーの率直な意見です)
でも，やっぱりThinkPadのキーボードも神だしトラックポイントが神なので，Macのキーボードにトラックポイント移植すれば
この世の真理にたどり着くことが出来ると確信しました(MatLab関係ない)

しかし，操作に関してはMacに寄せたのでWinで右クリックをボタンで押す文化に定着があるとかなり苦戦しそうです．

## いろいろ回して見て気付いたこと

WinでMatLabをお使いの方はよくExcelにデータを吐き出し，そこから見やすいグラフを・・・
とか重回帰分析とかしたいし，Excel統計ぶん投げて・・・みたいな流れが良く想定されますが，
MacにOfficeを入れていようと，MatLabさんは.xlsxファイルで吐き出すという考えを持ってなさそうなので，
もし，Win使いの皆さんでこういう処理したい時はとても深い悲しみを感じることになると推定されます．

## その他

基本的使い勝手はWinのMatLabと変化無かったので，非常に使い勝手のいい環境が構築されるものと確認できました．
ただし，あくまで筆者の個人的意見なので，賛否両論はあるかと．

## 結論
Macは神だが，MatLabはところどころボロがあるので，ソコをどうにかしたほうがさらに良い物になって幸せになれると確信が持てた．
MathWorksさん，MacもExcel形式で保存できるようになりませんかねぇ？
容量は残っているし inode も枯渇していないのに "No space left on device" と怒られる問題

# 先に結論
 `/tmp` 領域がいっぱいだ．消そう．

# 背景
GCE 上インスタンス[^1]にデプロイ済みのシステムが有り，一旦容量が枯渇してしまったので[ディスク容量の拡張](https://cloud.google.com/compute/docs/disks/add-persistent-disk?hl=ja)を行った．かなり面倒くさい手順だったがこちらは何とか終わった． `df -h` で確認してみる：

~~~
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            837M  4.0K  837M   1% /dev
tmpfs           170M  336K  170M   1% /run
/dev/sda1        30G   11G   19G  36% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
none            5.0M     0  5.0M   0% /run/lock
none            849M     0  849M   0% /run/shm
none            100M     0  100M   0% /run/user
overflow        1.0M  1.0M     0 100% /tmp
~~~

ということで 19G 空きができてる（心もとないけど）．ここで満を持して `ls`しようとするが，補完のところで．．．：

```
-bash: cannot create temp file for here-document: No space left on device
```
ということで怒られた．なぜだ！容量は十分あるじゃないか！

# 調査
## inode 枯渇問題? 
[No space left on device とエラーが出るときの対処法](https://qiita.com/0x50/items/ecc6cfdbb8a3f0c0855f)によると容量はあっても inode が枯渇している場合にこのエラーが出るとのこと． `df -i` で調べてみる：

```
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
udev            214046    377  213669    1% /dev
tmpfs           217142    341  216801    1% /run
/dev/sda1      1966080 305712 1660368   16% /
none            217142     14  217128    1% /sys/fs/cgroup
none            217142      6  217136    1% /run/lock
none            217142      1  217141    1% /run/shm
none            217142      2  217140    1% /run/user
overflow        217142      1  217141    1% /tmp
```

バッチリ残っている．　ここで私は気がつく

```
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            837M  4.0K  837M   1% /dev
tmpfs           170M  336K  170M   1% /run
/dev/sda1        30G   11G   19G  36% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
none            5.0M     0  5.0M   0% /run/lock
none            849M     0  849M   0% /run/shm
none            100M     0  100M   0% /run/user
overflow        1.0M  1.0M     0 100% /tmp
```

...

```
overflow        1.0M  1.0M     0 100% /tmp
```
/tmp が 100% だった．．．

# 解決
というわけで `/tmp` の中身を消したらエラーは出なくなりました． `bash` は `ls` 時の補完で `/tmp` を使うんですね．そもそも，なぜ `/tmp` 領域が1Mしかないのか？という問題について調べたいですが，宿題にします．

# 追記
@tty74 様から答えをいただきました

[2018-04-12 21:29](https://qiita.com/azumag/items/616c94762e02548a5134#comment-28f8670e649e67725630)
>起動時にはディスクフルだったんでしょうか？
Ubuntuなどでは/tmp が書き込まないと1MBのサイズでoverlaysタイプでマウントをし直されます。

なるほど！たしかに， `df -h` で確認すると overflow という名前でマウントされている．
以下のブログでアンマウント方法がかかれていたので，参考に
 `sudo umount overflow`で，きれいになった．
[Overflow filesystem mounted as /tmp in linux](http://jarrodoverson.com/blog/overflow-filesystem-in-linux/)



[^1]: Linux 4.4.0-112-generic Ubuntu SMP 2018 x86_64 GNU/Linux
２０１８年4月1２日講座コマンド

```
cal 2018 > cal2018.sato.txt ; date > date.sato.txt ; id sato > id.sato.txt
mkdir user_info
mv ./* ./user_info

cp *.sato.txt *.sato.txt.old

cp id.*.* id.sato.txt.old

echo Written by Kho >> cal2018.sato.txt.old

tar cf document.tar *

cat /etc/passwd > current_user.txt ; pstree > pstree.info
head -20 /var/log/dmesg > demesg.info ; tail -10 /var/log/dmesg >> demesg.info
chmod 444 *

yum install psmisc


rpm -qa | grep python > gpython ; wc -l gpython
rpm -qal | grep python

tar cf cu_ps_dmesg.tar *
gzip cu_ps_dmesg.tar

mount > mount.info
yum list installed | grep python >python.pkg.info ; yum list installed | grep python | wc -l >> python.pkg.info
cat -n python.pkg.info > python.pkg.info2

```


select avg(age) from userlist where age between 20 and 25;
select * from userlist order by age;
select * from userlist order by age desc ;

useradd nam; useradd namgf
mkdir /home/nam ; mkdir /home/namgf ; mkdir /home/myhome
echo Do you like me? > present.conf ;cat /etc/fstab > pet.info ; pstree > bed.info

cat /etc/inintab  > pet.info ; dmesg > bed.info
mv /home/nam/pet.info /home/myhome/pet.info.nam ; mv /home/nam/bed.info /home/myhome/bed.info.nam

mv /home/namgf/pet.info /home/myhome/pet.info.namgf ; mv /home/namgf/bed.info /home/myhome/bed.info.namgf


useradd lee ; useradd leegf1 ; useradd leegf2 ; useradd leegf3
cat /etc/passwd > ./lee/money.info ; pstree > ./leegf1/money.info ; dmesg > ./leegf2/money.info ; cat /etc/fstab > ./leegf3/money.info

cal 2018 > ./lee/car.info

cat ./leegf1/money.info >> ./lee/money.info ; cat ./leegf2/money.info >> ./lee/money.info ; cat ./leegf3/money.info >> ./lee/money.info

cat ./leegf1/money.info >> ./lee/money.info ; cat ./leegf2/money.info >> ./lee/money.info ;  cat ./leegf3/money.info ./lee/money.info

rm ./leegf1/money.info ;rm ./leegf2/money.info ; rm ./leegf3/money.info
userdel leegf1 ; userdel leegf2 ; userdel leegf3

wc -l /etc/passwd;pstree|wc -l;dmesg|wc -l;wc -l /etc/fstab 


```
[root@ik1-331-25935 home]# wc -l /etc/passwd
32 /etc/passwd
[root@ik1-331-25935 home]# pstree|wc -l
27
[root@ik1-331-25935 home]# dmesg|wc -l
541
[root@ik1-331-25935 home]# wc -l /etc/fstab
11 /etc/fstab
```
JAVA_HOMEについて

JAVA_HOMEについて
##環境
Mac OS(バージョンは10.13.4)

##JAVA_HOMEとは
Javaとかにはバージョンごとにフォルダにその情報とかが入っている。
そこまでの階層`/Library/Java/JavaVirtualachine/jdk{バージョン}/`をさすのはめんどくさいから、JAVA_HOMEという変数みたいなのに入れて楽に扱おうというもの。

##設定の方法
####１、登録

```
export JAVA_HOME=`ディレクトリ`
```

のコマンドをターミナルに打ち込めばいいらしい。
なお、ディレクトリは

```
/usr/libexec/java_home
```

コマンドで表示できる。
このコマンドは

```
/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java_home
```

の短縮系みたいなもので上記の階層`/Library/Java/JavaVirtualachine/jdk{バージョン}/`が表示される。

####２、確認

```
echo $JAVA_HOME
```

このコマンドで呼べれて入ればおっけい。

##Javaのバージョン切り替え
Java9を使いたい時

```
export JAVA_HOME=`/usr/libexec/java_home -v 9`
```

Java8を使いたい時

```
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
```

こうやって切り替えを行うのか。

##参考にさせていただいた記事
ありがとうございました
[MacでのJAVA_HOME設定](https://qiita.com/seri_k/items/e978c1339ce51f13e297)
[MacでのJava開発環境構築を通して「PATHを通す」意味を学ぶ](https://qiita.com/s_hino/items/a185deb4f9fc31c0f5e2)
【CakePHP】github webhookとの連携

github webhookとcakephpを連携させる手順を簡単にまとめておきます

#やりたいこと
- githubにpushされたら何かしらのアクションを起こしたい

#github側での手順
 - 連携したいリモートリポジトリの「settings」を開く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242303/349ee4da-e800-0668-9b0f-5bf7b96d5fde.png)
 - 左のメニューからwebhookをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242303/e80bb2ea-1c01-3b2d-dfc1-9646a6e5a224.png)
 - add webhookをクリック
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/242303/2a97d6a0-5285-e446-e22d-d1ec4a729cd1.png)
 - payLoad URLには飛ばしたいコントローラのアクションまでのパスを書く
    - 例：\http://localhost/myapp/models/action?token=aaaaaaaaaa
- Which events would you like to trigger this webhook?の項だが今回はプッシュでのみ反応させたいので一番上を選ぶ
- それ以外の項目は今回特に設定しない
- 最後にadd webhook
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242303/290b91e8-b250-f4e6-7ee0-22c01aaf320a.png)
- webhook一覧に先ほど作成したwebhookが表示されている。
    - クリックすると編集画面にいけるのだが、画面下部に通信履歴が表示される。
    - 通信成功していれば緑のチェックマークが出るので覚えておきましょう
  
#cakephp側の設定
 - コントローラ側で適当な処理を書いてやればいいだけ
 - githubから送信される内容は$this->request->data['payload']で拾えます
    - payloadの見方は下記URLのEventsを参照
        - https://developer.github.com/webhooks/
    - サーバーにIP制限をかけている場合はgithubからのアクセスを許可してやる必要があります。
        - https://api.github.com/meta
        - こちらのhooksに書かれているアドレスがgithubの外部向けIPアドレスとなっています
How to fix コンフリクト



## 前提
```
- master
- {working_branch}(作業ブランチ)
- masterにworking_branchをmergeさせたいがコンフリクトでできない・・
```

### 1. masterを最新状態に更新し作業ブランチにマージ
```
$ git checkout {working_branch}
$ git pull origin master // ローカルファイルを更新し{working_branch}にmasterをマージ
```

### 2. コンフリクト解消

> CONFLICT (content): Merge conflict in {conflict_file_name}
> Automatic merge failed; fix conflicts and then commit the result.

とでるので{file_name}へ移動しコンフリクト箇所を修正

### 3. 再びコミットし修正完了

```
$ git add {conflict_file_name}
$ git commit -m "Fix conflict"
$ git push origin {working_branch}
```

### 参考情報
コンフリクト解消するにあたって片方の変更を適用したい時は便利なコマンドがある
- {conflict_file_name_1}: 作業中のブランチの変更を適応したい
- {conflict_file_name_2}: masterブランチの変更を適応したい

```
$ git checkout --ours {conflict_file_name_1}
$ git checkout --theirs {conflict_file_name_2}
$ git add {conflict_file_name_1} {conflict_file_name_2}
$ git push origin {working_branch}
```
ログインシェルをzshに変える

#ログインシェルをzshに変えるコマンドを書いておくだけ

- LinuxMintは標準のshellはbash
- 友達のターミナルを見てzshを使いたくなったのでログインシェルを変える

##etc/shellsの確認
```
% cat /etc/shells 
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/bin/zsh
/usr/bin/zsh
/usr/bin/tmux
```

/bin/zsh発見！

##ログインシェルをzshに変更する
```
chsh -s /bin/zsh
```
ターミナルを閉じて再起動すればzshになるっす。
[Effective Python] 項目43：contexlibとwith文をtry/finallyの代わりに考える


# with文とは
Pythonのwith文とは、
コードが **特別なcontext下で** 実行されていることを示すのに使われてます。

# 良く使う例

ファイルを開いてデータを書き込む例。

```
with open('file.txt', 'w') as handle:
	handle.write('some data')
```

ファイルにデータを書き込んだ後（withブロックを抜けた後）で、
**ファイルのHanlderを閉じてくれます**。

**try/finally** 構成でやると、こうなイメージになります。


```
try: 
	hanlder = open('file.txt', 'w')
	handle.write('some data')
finally:
	handler.close()
```

## with構文をネスト

```
with open("sample1.txt", "r") as f1:
    with open("sample2.txt", "w") as f2:
        f2.write(f1.read())
```



# with構文に対応したクラスを作ってみよう

with構文が使えるクラスを作成するには、

**__enter__()**メソッドと **__exit__()**メソッドの両方を定義しなければなりません。


```
# My with sample class

class MyWithSampleClass:
    def __enter__(self):
        print('START')
        return self

    def myfunc(self):
        print('Do something...')

    def __exit__(self, exception_type, exception_value, traceback):
        print('END')


with MyWithSampleClass() as c:
    c.myfunc()
```

# with構文に対応した関数を作ってみよう

* `__enter__` と `__exit__`を書きたくない
* クラスを作りたくない

そうな時には、 **contextlibモジュール**　の **contextmanager** デコレータを使います。


例えば、あるフォルダーに入り処理を行ったあとにまた入る前のディレクトリに切り替えたい
ユースケースがあるとします。

```
cwd = os.getcwd()
os.chdir('/tmp/foo')
try:
    run()  # 何か処理
finally:
    os.chdir(cwd)
```

withで使えるように次のようなcdを実装して:

```
@contextlib.contextmanager
def cd(target_dir):
    cwd = os.getcwd()
    try:
        os.chdir(target_dir)
        yield
    finally:
        os.chdir(cwd)
```
 
以下のように使えます:

```
with cd('/tmp/foo'):
    run()  # 何か処理
```  


# まとめ

* 定型処理にwithを使うことでコードが簡潔化
* ネストも可能で複雑な処理がさらに見やすくなる
* with構文に対応したクラスも関数も
やっとモーションセンサー使えた

煮詰まったので、Monacaにログインしてローカルで書いたコードをコピペして、デバッグしていました。
デバッグのログが対辺見やすく、デバッグが捗りました。

その結果、センサーで下記のコードを書いたら動きました。

```js
        function onDeviceReady(){
            console.log("センサーが使えるようになりました！");
        }

```
そして

```js
ons.ready(function test2() {
  
    // CordovaのAPIを呼び出す準備が整った
    
  
    //加速度センサー　更新時間
    var options = { frequency: 1000 };  // 1秒ごとに更新

    //センサー戻り値
    watchID = navigator.accelerometer.watchAcceleration(onSuccess, onError, options);

  });
```
と続けて書いたら、無事にセンサー動きました。

センサーの停止も加えました。

```js
    //センサー停止
    navigator.accelerometer.clearWatch(watchID);
```

Visualstudioのブラウザのエミュレーションでも、センサーを使うことが出来ました。
![キャプチャ-センサー.PNG](https://qiita-image-store.s3.amazonaws.com/0/20977/af57c2da-4f17-4399-2d61-d80fbd77eab3.png)

Monacaでは、HTML5の音声合成のAPIを使うことが出来ないです。
また、私は無料プランなので、Cordova TTSのプラグインを加えることが出来ないので、ローカルで開発を続けます。

でも、8割くらいようやく完成したので、良かったです。
After.js で SSR / Code Splitting  on react-router

after.js とは、「next.js meets react-router.」 です。以上。

after.js、 おそらく本来のプロジェクト名は razzle だと思うんですが、 next.js に対抗して razzle エコシステムをかき集めたものを after.js と呼んでるみたいです。

ルーティングのコード例

```js
import React from 'react'
import Layout from './components/Layout'
import { asyncComponent } from '@jaredpalmer/after'

const loadingPlaceholderWithLayout = <Layout>Loading...</Layout>

export default [
  {
    path: '/',
    exact: true,
    component: asyncComponent({
      loader: () => import('./pages/Home'), // required
      Placeholder: () => loadingPlaceholderWithLayout
    })
  },
  {
    path: '/about',
    exact: true,
    component: asyncComponent({
      loader: () => import('./pages/About'), // required
      Placeholder: () => loadingPlaceholderWithLayout
    })
  },
  {
    path: '/detail/:id',
    exact: false,
    component: asyncComponent({
      loader: () => import('./pages/Detail'), // required
      Placeholder: () => loadingPlaceholderWithLayout
    })
  }
]
```

クライアント遷移時はルート要素に placeholder を刺した上で非同期ローディングを開始するので、 それぞれの要素の中でも使ってる Layout 要素 を一旦展開しておかないと、かなりガクガクします

next みたいに pages 以下のファイルパスが暗黙にURLになったりはしません

## next.js と同じ点

- `static async getInitialProps() {...}` による非同期SSR
- エントリポイントごとの Code Splitting
- .babelrc を隠蔽
- webpack を隠蔽

サーバーは src/index  、クライアントは `src/client` がエントリポイントです。他はなんか適当に razzle のヘルパを使うと next.js みたいに動きます。そういう風になってるというドキュメントが見つけられなかったけど自分が試した限りはそう動きました。

規約が少ない分、自由度が高いんですが、自分でコードを書く量は増えます。

`pages/index.js` に ReactComponent 定義を置くと起動する next.js の開発体験には全く及びませんが、結局 next も カスタムサーバーを起動する server.js とか pages/_document.js とか書かなかったことないし、むしろ最初から剥き出しになってる方が、最終的な安心感はありますね。

## next.js との違い

- react-router
    - react-router 剥き出しなので他のライブラリと連携しやすい
    - next.js は独自ルーターなんで他のライブラリとの連携やハックが辛かった
- サーバーモードのみで static export なし
    - 必ず node アプリケーションとしてデプロイする必要があり
    - サーバーで受けてルーティングするので、URLの自由度は高い(というか next の URL表現が貧弱すぎる…)

全体的にexpress と react-router 剥き出しです。そのまま使う。

## どっちを選ぶか

- 静的エクスポートしたい => next.js
- SSR とかコードスプリッティングを自分で書きたくない => どっちでもいい
- react-router に慣れてる/好き => next.js

静的エクスポートするかどうか決まってるなら、あとは自分が webpack react-router エコシステムに強いか、next.js に巻かれたいかで選ぶと良いと思います。要は node に強いかどうかです。


## 書き味

どんなコードになるかはサンプルプロジェクトを作りました。 https://github.com/mizchi/razzle-project-example
now に一発でデプロイ出来るようにしてます。

公式の README が非常に読みづらいというか、動かないコードや暗黙の事前条件が必要なものを解説無しで平気で書いてるので、ドキュメントから気持ちを察するのに時間がかかりました。

## 最後に

ここまで書いておいて何ですが、僕は react-router 好きじゃなくて、任意の要件に対してハックできるポイントを調査した感じでした。終わり。
Contact Form 7でselectボックスの選択によりメール送信先を変更する

Contact Form 7で、問い合わせ先の店舗をselectボックスで選択してもらい、その選択によって、送信先のメールアドレスを変更するようなときに使用できます。

### フォームのselect要素

```
[select* send-to "新宿店|mail01@example.co.jp" "渋谷店|mail02@example.co.jp"]
```

表示する店舗名と、アドレスを半角のパイプ「|」で挟んで記述する。
send-to の箇所は、適当な名前を。

### メールの送信先

![_ 2018-04-12 18.34.29.jpg](https://qiita-image-store.s3.amazonaws.com/0/6121/841128bf-3643-67f6-c505-e86f1709fcd9.jpeg)

上記のように記述する。
不明なメールボックス〜のエラーメッセージは無視します。

### メール本文

```
[_raw_send-to]
```

メール本文には、問い合わせ先の店舗名を表示したい場合、上記のように、`_raw_`をつけると、パイプの前部分を表示できる。
【R】データフレームをただの行列に変換したい

## やりたいこと

データフレームのオブジェクトを `matrix()` で生成されたようなただの行列に変換したい。単に `as.matrix()` するだけじゃなくて、行や列の名前も無い行列にしたい。こんな風に。

```r:変換前
# 適当に iris[1:10, 1:4] したやつ
   Sepal.Length Sepal.Width Petal.Length Petal.Width
1           5.1         3.5          1.4         0.2
2           4.9         3.0          1.4         0.2
3           4.7         3.2          1.3         0.2
4           4.6         3.1          1.5         0.2
5           5.0         3.6          1.4         0.2
6           5.4         3.9          1.7         0.4
7           4.6         3.4          1.4         0.3
8           5.0         3.4          1.5         0.2
9           4.4         2.9          1.4         0.2
10          4.9         3.1          1.5         0.1
```

```r:変換後
      [,1] [,2] [,3] [,4]
 [1,]  5.1  3.5  1.4  0.2
 [2,]  4.9  3.0  1.4  0.2
 [3,]  4.7  3.2  1.3  0.2
 [4,]  4.6  3.1  1.5  0.2
 [5,]  5.0  3.6  1.4  0.2
 [6,]  5.4  3.9  1.7  0.4
 [7,]  4.6  3.4  1.4  0.3
 [8,]  5.0  3.4  1.5  0.2
 [9,]  4.4  2.9  1.4  0.2
[10,]  4.9  3.1  1.5  0.1
```

以降、 `hoge` は変換したい何らかのデータフレームオブジェクト。

```r:hogeの例
hoge <- iris[1:10, 1:4]
```

その1からその3まで、それぞれ別々の方法を書いてみる。

## その1　`matrix()` を使う

まずは、素朴に `matrix()` を用いる方法。 `matrix()` の第一引数は勝手にベクトルにしてくれるので、 `as.vector(as.matrix(hoge))` とかを渡さなくてもよい。

```r
hoge <- matrix(as.matrix(hoge), nrow(hoge), ncol(hoge))
```

また、データフレームは転置すると行列型になる（記事の最後に参考URL）ので、以下のような書き方もできる。

```r
hoge <- matrix(t(hoge), nrow(hoge), ncol(hoge), byrow = T)
```

## その2　`apply()` を使う

`apply(hoge, 1, as.numeric)` 1回のみの場合、列の名前が残って転置されたものが返ってくるので、もう一度転置している。

```r
hoge <- apply(apply(hoge, 1, as.numeric), 1, as.numeric)
```

## その3　名前を落とす

行と列、それぞれの名前を落とす例。
これでどちらか片方だけ名前を落とすこともできる。

```r
hoge <- as.matrix(hoge)
colnames(hoge) <- NULL
rownames(hoge) <- NULL
```

あるいは、行と列一括で名前を落とす例。

```r
hoge <- as.matrix(hoge)
dimnames(hoge) <- NULL
```

あるいは、一括で落とす例の別の書き方。

```r
hoge <- as.matrix(hoge)
hoge <- unname(hoge)
```

## 参考
[Rでデータフレームを転置すると行列になる](https://qiita.com/emihat/items/1130b15152621a5e37f5)
[R 行列Tips大全](http://www.okadajp.org/RWiki/?%E8%A1%8C%E5%88%97Tips%E5%A4%A7%E5%85%A8#sef8d40a)
Rust by Examples のお勉強 - Types, Conversion

## casting vs. conversion

詳しい違いはよくわからないけど、casting は`as`を使って行うものであって、conversion は`From`と`Into`を使って行うものだと思っている。

## casting

```rust
let dec = 65.4321_f32;
let int = dec as u8;
let ch = int as char;
println!("{} -> {} -> {}", dec, int, ch); // 65.4321 -> 65 -> A
```

## `From`
`A`に`From<B>`を実装すると、`A::from()`を使って`B`から`A`への conversion が出来る。`use std::convert::From;`を忘れずに。

```rust
use std::convert::From;

#[derive(Debug)]
struct Wrap(i32);

impl From<i32> for Wrap {
    fn from(x: i32) -> Wrap {
        Wrap(x)
    }
}

fn main() {
    let w = Wrap::from(12);
    println!("{:?}", w); // Wrap(12)
}
```

## `Into`
`From`を実装すれば、`Into`も自動的に実装される。しかし、`From`と違って、コンパイラは`Into`がどの型に convert しているのが分からないので、type annotation を書く必要がある。

```rust
fn main() {
    let w: Wrap = 12.into();
    println!("{:?}", w"); // Wrap(12)
}
```

## `ToString`
`std::string::ToString`にある。`std::fmt::Display`を実装すれば、`ToString`を実装する必要はない。

次の例では、`String`を返すマクロ`format!`を使っている。

```rust
use std::string::ToString;

#[derive(Debug)]
struct Wrap(i32);

impl ToString for Wrap {
    fn to_string(&self) -> String {
        format!("<< {} >>", self.0)
    }
}

fn main() {
    let w = Wrap(12);
    println!("{}", w.to_string()); // << 12 >>
}
```

## `FromStr`
`std::str::FromStr`にある。`String`ではなく`&str`からの変換だと言うことに注意。変換先の型自体ではなく、`Result`を返すので、自分のエラー型`Err`も書かないといけない。

```rust
use std::str::FromStr;
use std::string::*;
use std::fmt;

struct MessageFish {
    msg: String,
}

#[derive(Debug)]
struct MessageFishErr;

impl fmt::Display for MessageFish {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "(x ")?;
        write!(f, "{}", self.msg)?;
        write!(f, " )<")
    }
}

impl FromStr for MessageFish {
    type Err = MessageFishErr;
    fn from_str(s: &str) -> Result<Self, Self::Err> {
        Ok(MessageFish {
            msg: String::from_str(s).unwrap()
        })
    }
}

fn main() {
    let msg = "rust is fun!";
    let fish = msg.parse::<MessageFish>().unwrap();
    println!("{}", &fish);            // 
    println!("{}", fish.to_string()); // (x rust is fun! )<
}
```
【SQL】プロシージャ

### プロシージャ

決めった仕様により、プログラム開発作業をリリースまで終わってから、今後お客様から追加依頼があったら、プログラムの改修となると思われます。
普通は、その改修のコースができれば、既存システムへの影響が少ない方がラクです。
たとえば、何かしら一つのコードを追加したいとかの依頼が来られたら、プログラム側の改修として、先ずコード定義の追加、後、そのコードに関係ある処理の改修対象かとうかのスコープを決めて、コースとかを見積もって、お客様とやり取りにして検討するという形です。
こういう場合は、最初から、プログラム側処理をプロシージャとしてお客様に提案しましょう。
なぜなら、今後システムの運用上で、何が増やすか減るのかの可能性が高いと認識され、今一もやもやしてるが決められないところ、今後保守期間の改修が発生したら、コースを増やしたくない場合、今一として、その処理を丸ごとにプロシージャにしましょう。

例として挙げます。

ユーザーさんの個人のメールアドレス宛てに何件のメールが送信したか、失敗した件数を集計したいです。メール送信のステータスが　`送信済(1)`　の以外はいろんなステータスがあるとして、どれのが集計するのはお客様次第なので、今後増やすの恐れがあります。

以下のプロシージャ処理で、今後ステータスの変更があったら、そのSQLだけ直してすぐ対応できます。

```SQL:PostgreSQL

/* プロシージャ集計 */
/** Table - mails
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
pno |mail_no |status |send_datetime
1   |1001    |1      |2018/04/09 11:10:41.565
1   |1002    |2      |2018/04/10 11:10:41.565
1   |1003    |2      |2018/04/11 11:10:41.565
2   |2001    |2      |2018/04/10 11:10:41.565
2   |2002    |3      |2018/04/11 11:10:41.565
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
**/


-- データ型の定義
CREATE TYPE T_mail_counter AS (pno VARCHAR(5), count INTEGER);


CREATE OR REPLACE FUNCTION F_mail_send_failed(
     date_from TIMESTAMP WITH TIME ZONE, 
     date_to TIMESTAMP WITH TIME ZONE)  
RETURNS SETOF T_sms_counter AS $BODY$
----
-- 
-- 集計処理プロシージャ(F_mail_send_failed)
-- 
--    個人ナンバーごとに対象期間内メール送信失敗のデータを集計する
-- 
-- param: 
--    date_from       抽出対象期間の開始日
--    date_to         抽出対象期間の終了日
-- 
-- return:
--    array
--      pno           個人ナンバー
--      count         件数
--
----

-- 定義
DECLARE
	pno             VARCHAR(5);                  -- 個人ナンバー
	count           INTEGER;                     -- 件数
	data_set        T_sms_counter;               -- データセット
-- 集計処理
BEGIN

	FOR data_set IN 
		SELECT
			pno
			, count(*) AS count
		FROM
			mails
		WHERE
			status IN('1','2')
			AND send_datetime > date_from
			AND send_datetime < date_to
		GROUP BY
			pno
	LOOP 
	 	IF NOT FOUND THEN NULL;
		END IF;
		RETURN NEXT data_set;
	END LOOP;
	RETURN;
END; 
$BODY$ LANGUAGE 'plpgsql'; 

/**
result
     [param]date_from: '2018/04/10 00:00:00'
     [param]date_to  : '2018/04/11 23:59:59'
＿＿＿＿＿＿
pno |count 
1   |2  
2   |1  
＿＿＿＿＿＿
**/



```
Materializeのselectを解除する

# 前提
- Materialize 0.100.2を使用
- セレクトで選択されている値を解除したい

# コード

selectのvalに空文字入れてもダメでした。
クラスを足したり消したりしてもダメでした。
以下のコードで出来ました。

```javascript
//selectのidを指定する
$('#id').prop('selectedIndex', 0); 

$('#id').material_select();
```

# 参考
[jQuery/Materialize : Changing select option back to disabled select on clear](https://stackoverflow.com/questions/37399188/jquery-materialize-changing-sel
ect-option-back-to-disabled-select-on-clear)
再生/一時停止をAudioタグで管理し、AudioBufferで加工する。

AudioBufferのみだと一時停止やシークが難しくなるので、そのような操作はMediaElement(Audioタグ)に任せて、AudioBufferに結線してから加工する方法をとってみました。

確認のためにディレイをインサートしています。他のFXをどんどん入れていくと冗長になるので、外部モジュール化する予定です。

ちなみに、再生速度の変更はMediaElementだと音程は維持できますが音が切れます。
AudioBufferだと滑らかに遷移しますが、音程が速度に比例します。

```html:html
<input id="Afile" type="file">
<audio id="Aplayer"></audio>
<input type="checkbox" id="play_pause">PLAY/PAUSE
<input type="checkbox" id="loop">LOOP
<br>
<input type="range" id="volume" value="1" min="0" max="1" step="0.05">GAIN
<input type="range" id="pitchAdj" value="1.00" min="0.7" max="1.16" step="0.01">PITCH
<br>
<input type="range" id="repeatRate" value="0" min="0" max="1" step="0.05">repeatRate
<input type="range" id="intensity" value="0" min="0" max="1" step="0.05">intensity
<input type="range" id="echoVolume" value="0" min="0" max="1" step="0.05">echo volume
```

```javascript:javascript
//ファイルの読み込み
Afile.onchange = function() {
	Aplayer.src = URL.createObjectURL(this.files[0]);
	play_pause.checked = false;
};
//再生、一時停止
play_pause.onchange = function() {
	(play_pause.checked) ? Aplayer.play(): Aplayer.pause();
};
//ループ
loop.onchange = function() {
	(loop.checked) ? Aplayer.loop = true: Aplayer.loop = false;
};

window.onload = function() {
	var source;
	var Actx = new(window.AudioContext || window.webkitAudioContext);
	var gain = Actx.createGain();
	source = Actx.createMediaElementSource(Aplayer);
	//ディレイ
	var delay = Actx.createDelay();
	var delayIn, delayOut = Actx.createGain();
	var dry, wet, feedback = Actx.createGain();
	delayIn.gain.value = delayOut.gain.value = dry.gain.value = 1.0;
	wet.gain.value = feedback.gain.value = 0.0;

	//ルーティング
	delayIn.connect(dry).connect(delayOut);
	delayIn.connect(delay).connect(wet).connect(delayOut);
	delay.connect(feedback).connect(delay);
	source.connect(delayIn)
	delayOut.connect(gain).connect(Actx.destination);
	//再生速度の変更
	pitchAdj.addEventListener('input', function() {
		Aplayer.playbackRate = this.valueAsNumber;
	});
	//音量
	volume.addEventListener('input', function() {
		gain.gain.value = this.valueAsNumber;
	});
    //ディレイタイム
	repeatRate.addEventListener('input', function() {
		delay.delayTime.value = this.valueAsNumber;
	});
    //フィードバック
	intensity.addEventListener('input', function() {
		feedback.gain.value = this.valueAsNumber;
	});
	//ディレイボリューム
    echoVolume.addEventListener('input', () => wet.gain.value = this.valueAsNumber);
};
```
【VSCode】最近のアップデートでtexがコンパイルできなくなった話【Latex-Workshop】


#原因
春休み期間中にLatex-Workshopがアップデートされたことで，VSCode上でtexのコンパイルができなくなりました．
どうやら，ユーザー設定で

**"latex-workshop.latex.toolchain"**
という記述ができなくなった（？）っぽいです．

#解決法
"toolchain"部分が
**"latex-workshop.latex.recipes"**
になりました．

解決法は
https://gist.github.com/Ikuyadeu/204d06fffd912f441b383eb02463e29b
の方が書かれている通りの方法でやりましたが，bibファイルがないにも関わらず，ユーザー設定に"pbibtex"の記述をすると，自分の環境ではエラーが出てきたので気をつけましょう．

どうやら"recipes"に書かれたステップを踏んでtexファイルをコンパイルしていくという方法で，"tools"には具体的なパラメータを記述するといった感じ．
GCP内でのComputer Engineのインスタンスの移行の方法

#GCP内でのGCEのインスタンスの移行 
##経緯
　GoogleCloudePlatformには無料枠があるのですが、設定をミスると少なからず料金がかかってきます。インスタンスを立てたばかりで何もしていない場合は、削除して新しく作り直せば良いのですが、もしそのインスタンスで既に何かうごがしたりして、その設定を引き継ぎたい場合には移行前のインスタンスの中身を引き継ぐ必要があります。先日私もそのような事態に陥り、今回の方法を行いました。

##方法
　無料枠サーバーの立て方はこちらの記事を参考にしました　
　(https://qiita.com/ndxbn/items/7ef0a96e409a5b5837bd)

- <font color="Brown">**インスタンスのゾーンは変えない場合**</font>

「クローン作成」を行うだけ
![001.png](https://qiita-image-store.s3.amazonaws.com/0/177611/746262fb-f615-c252-a981-6882d8f460fc.png)

　

- <font color="DarkViolet">**インスタンスのゾーンも変更する場合**</font>

　スナップショットというものを作成していきます。スナップショットの作成方法について検索していると、ターミナル上でコマンド打って作成する方法はよく見かけますが、ここでの方法はGCPのサイト内のボタン操作で完結します。

　まずはGCEの左のメニュー内から「スナップショット」を選択
![002.png](https://qiita-image-store.s3.amazonaws.com/0/177611/34c535cc-ef0e-d7b0-6cc9-0ff03fa7d513.png)
　
　
　「スナップショットの作成」を押すと下のような画面になります。
"ソースディスクの選択"でスナップショットを取りたいインスタンスを選択し作成します。
![スクリーンショット 2018-04-12 17.10.38.png](https://qiita-image-store.s3.amazonaws.com/0/177611/2f11e821-8c14-8af5-9e7d-d9e7413bbfc2.png)
　
　
　下の画像のようにスナップショットが作成されましたらスナップショットの名前をクリック(赤矢印)
　![006.png](https://qiita-image-store.s3.amazonaws.com/0/177611/9455c021-d5fe-2b56-915e-d17fd24e72fb.png)
　
　
　「インスタンスの作成」をクリックするとスナップショットのデータが適応されたインスタンスが作成されます。
　![007.png](https://qiita-image-store.s3.amazonaws.com/0/177611/1fceca74-ba44-1ef0-6315-2c4974408ea9.png)

　
　以上です。
　インスタンスの作成は各自で自由に行ってください。

##最後に
ググればコマンド打ってなんとかする方法がたくさん出てくるのですが、最初に参考にしたページが悪かったのかできずに萎えていました。ただ、GCPがこんなに便利なインターフェースなのにボタン操作でできないはずはないとよくみたところ、ボタン操作でできちゃいました。
convnet.jsの作法 その３

#概要

convnet.jsの作法を調べる。

#convnetjs.Trainer()

トレーナー

オプチマイザーは、methodで指定する。
agd, adam, adagrad, adadelta, windowgrad, nesterovがある。

ラーニングレートは、learning_rateで指定する。

trainer.trainで学習する。
batch_sizeあるけど、ループは、自分で回す。
prediction は、net.forwardで取り出す。


以上。
kubectl で Namespace を切り替える

# はじめに

* [Namespace](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) を使うと同一クラスタ内で Pod や Service, Deployment や StatefulSet などを仮想的なクラスタとしてグルーピングして取り扱うことができて便利。
* ここでは kubectl コマンドで Namespace を切り替えて扱う方法についてまとめる。

# Namespace を一時的に切り替える

* 実行コマンドごとに Namespace を切り替えたい場合は `-n` オプションを使う。

```sh
# 表示する Namespace を "mynamespace" に切り替える
$ kubectl -n mynamespace get all
```

# Namespace を永続的に切り替える

* 接続中のコンテキストでのデフォルト Namespace を変更する。

```sh
# コンテキストのデフォルト Namespace を "mynamespace" に変更する
$ kubectl config set-context $(kubectl config current-context) --namespace=mynamespace

# Namespace を確認する
$ kubectl config view | grep namespace:
```

# 特定の Namespace 用の kubectl コマンドを用意する

* 同一クラスタ内で複数 Namespace を扱っている際、永続的には切り替えたくないが特定の Namespace に頻繁に切り替えたいとする。
* この場合は特定の Namespace が適用済みの kubectl コマンドを用意すると便利かもしれない。

```kubectl-mynamespace.sh
#!/bin/sh
/usr/local/bin/kubectl -n mynamespace $@
```

* 使い方は通常の kubectl コマンドと同様

```sh
./kubectl-mynamespace.sh get all
```
Markdownでかけるエディタを調べてみた

いままで Simplenoteというアプリを使って、個人的な技術備忘録をメモしていました。でも最近はMarkdownでかけた方が便利だな〜と思い、ググったところ、いくつか出てきたので紹介します。

# Simplenote
https://simplenote.com/
というか、Simplenote、最近のアップグレードでmacでもmarkdownに対応してた！

右上のinfoボタンから、markdown formatted にチェックをいれて、markdownを記述

<img src="https://qiita-image-store.s3.amazonaws.com/0/68684/99a75eb8-ba58-7b75-3cc4-ccd819e78f47.png" width="500px">

記述後に目玉マークをクリックすると、表示されました

<img src="https://qiita-image-store.s3.amazonaws.com/0/68684/62994bd9-8ec7-55ea-3d98-7187569070fb.png" width="500px">

でも...

- Qiitaの入力方法みたく、左に書いたものがリアルタイムで右に出たりはしない
- macだと、markdownとpreviewの切り替えもできない（クリックが必要）

なので、markdownにはまだ使いにくそうな印象。

# Boostnote
https://boostnote.io/
まさにmarkdownを描きながらpreviewできる模様！

<img src="https://qiita-image-store.s3.amazonaws.com/0/68684/dbce87cc-25c4-1e9a-e700-2899394e2c65.png" >

simplenoteのようにタグや文字検索もできるからよさそうです。
dropboxに同期することで、スマホなどとも共有できたので、PCが壊れたときにも安心。

あと、地味にいいなと思ったのが、コードをコピーできる機能

<img src="https://qiita-image-store.s3.amazonaws.com/0/68684/555cb42f-cdda-faed-298d-6a86bd4a5d67.png" >

右側プレビュー画面の右側にコピーボタンがあって、これをクリックすれば、コピーできる。便利そう！

# Typora
https://typora.io/

これは、markdownで書くと、自動的にプレビュー画面に反映してくれるから、直感的に使えるし、画面が分割されないので、大画面でさくさく作れて良さそう。

1つのmarkdownにつき、1ファイルが作られる。(.md)

ただ自分の場合、プログラミングの備忘録として使いたいため、全ファイルからの検索やタグづけができないため、引っかかりました。

# まとめ

最近は簡単にmarkdownがかけるようになっていて、感動しました。
ひとまず自分の要件を満たしたのは boostnoteだったので、しばらく使ってみようとおもいます。
LaTeX備忘録 #数式

# 結局どの方式で数式を書けばいいんだ．
まとめている人がいたぜ．
とりあえず，

`usepackage(amsmath)`

の下で，
一行なら
`\begin(equation)
 この間に好きな数式を入れるんや
\end(equation)`
二行以上なら
`\begin(align)
 この間 & に & 好きな \\
 数式  & を & 入れるんや
\end(align)`
ってことでええか．

文中？
`$ この間に好きな数式を入れるんや $`

*amsmathの数式環境まとめ
https://qiita.com/t_kemmochi/items/a4c390b4967b13f3afb7*

#条件付き数式の縦棒
`\mid`
http://dayinthelife.at.webry.info/200811/article_1.html
UbuntuMATEをいろいろ設定③〜データ解析用（Sublime Text・Texmaker・Texlive）編〜

#1.はじめに
ひょんなことからデータサイエンティストへ弟子入りし、プログラミングの世界に導かれやってきました、都会で頑張る田舎者です。文系大学卒の元OLです。

Python、git、docker、Ubuntu、raspberry piなどなどを修行しております。

[超新人プログラマー（見習）がWindowsにUbuntuをインストール②〜シングルブート編〜](https://qiita.com/petadimensionlab/items/78b27ed5c97e93cc387d) より、生まれ変わった”Windowsの皮をかぶったUbuntuMATE”さんをデータ解析用に設定してこうと思います！
今回は師匠（データサイエンティスト）より命じられた、テキストエディタをインストールをして行きます！

→[超新人プログラマー（見習）がWindowsにUbuntuをインストール①〜インストールUSB作成編〜](https://qiita.com/petadimensionlab/items/3b4df62eed514e9e0b9f)
→[超新人プログラマー（見習）がWindowsにUbuntuをインストール②〜シングルブート編〜](https://qiita.com/petadimensionlab/items/78b27ed5c97e93cc387d)
→[UbuntuMATEをいろいろ設定①〜言語設定・Google Chrome・Slack編〜](https://qiita.com/petadimensionlab/items/2f62ae270be0443573a3)
→[UbuntuMATEをいろいろ設定②〜データ解析用（Anaconda）編〜](https://qiita.com/petadimensionlab/items/5d719d6010042c790925)

#2.Sublime Text
私も使用しているテキストエディタです！
###・Sublime Textとは
>Sublime Textはプロプライエタリのクロスプラットフォームテキストエディタである。
Pythonアプリケーションプログラミングインタフェース（API）を備え、多くのプログラミング言語やマークアップ言語をネイティブにサポートしている。

参考：[Wiki](https://ja.wikipedia.org/wiki/Sublime_Text)

Sublime Textの[公式サイト](http://www.sublimetext.com/3)からインストール！と言いたい所ですが、最新バージョンには　”.deb”　ファイルがありません。
そこで・・・
![sublimetext.png](https://qiita-image-store.s3.amazonaws.com/0/241094/b853c1ca-f9a3-addb-c820-1973e82b4e08.png)
Download画面の「[Linux repos](http://www.sublimetext.com/docs/3/linux_repositories.html)」をクリックしますと、インストール方法が書かれているのでその通りにMATE端末（コンソール）に入力実行！

同じですが備忘録として記載します。※aptの欄を参照
・GPGkeyインストールします

```terminal:command
$ wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add -
```
・aptがhttpsソースで動作する設定か確認のためインストール

```terminal:command
$ sudo apt-get install apt-transport-https
```
・使用するチャンネルを選択
　→Stableを選択しました。

```terminal:command
$ echo "deb https://download.sublimetext.com/ apt/stable/" | sudo tee /etc/apt/sources.list.d/sublime-text.list
```
aptソースを更新し、Sublime Textをインストールして完了！

```terminal:command
$ sudo apt-get update
$ sudo apt-get install sublime-text
```
「アプリケーション」→「プログラミング」→「Sublime Text」で起動！

#3.Texmaker
師匠「Texmakerもインストールしといて」
私「？？」
###・Texmakerとは
>Texmaker は，統合環境として使える LaTeX エディタです． SyncTeX もサポートされています． Texmaker のデフォルトの文字コードは UTF-8 です．

参照：[TeX Wiki](https://texwiki.texjp.org/?Texmaker)
どうやらこちらもテキストエディタなんですね！

こちらのコマンドでインストール！簡単！（言われるがままだったり・・・）

```terminal:command
$ sudo apt-get install texmaker
```
「アプリケーション」→「オフィス」→「Texmaker」で起動！
ちなみに公式サイトはこちら→[TEXMAKER](http://www.xm1math.net/texmaker/download.html)

#4.Texlive
師匠「texliveもインストールしといて」
私「承知！！（きっとTexmakerの仲間や！）」

###・Texliveとは
>TeX Live は TeX のディストリビューションです． TeX の超巨大な集大成ともいえるもので，現在では国際的に最も普及している最新の TeX ディストリビューションです．

参照：[TeX Wiki](https://texwiki.texjp.org/?TeX%20Live)
なんか、かっけえ。

インストールは下記コマンドを入力でOK！

```terminal:command
$ sudo apt-get install texlive-full
```

#5.参考URL
・[Sublime Text:Linux Package Manager Repositories](http://www.sublimetext.com/docs/3/linux_repositories.html#apt)
→公式サイトです。

・[Ubuntu 16.04 に TeX Live を入れる](http://xartaky.hatenablog.jp/entry/2016-12-27-texlive-on-ubuntu)
→Texliveについて詳しく記載されております。
　動作確認については”一応 TeX Live がちゃんとインストールされたか試験する．”以下を参考に確認してみましょう！

---
以上です！
次回はRもインストールします！
UnityのAmplify Shader EditorでShader作成の練習

UnityのAmplify Shader Editor(ASE)の練習としてそれっぽい氷のShaderを作ってみた．

#環境
Unity 2017.3.1f1
Amplify Shader Editor 1.5.2

#完成図
![icetexture1.PNG](https://qiita-image-store.s3.amazonaws.com/0/156512/e6720244-0d8c-3493-1eac-bdef7d61963c.png)
![icetexture2.PNG](https://qiita-image-store.s3.amazonaws.com/0/156512/4ffd1ea4-a075-5995-0947-eafb217d715b.png)

#作り方
##とりあえず完成形をイメージ
- 透明にしたい．
- 氷っぽい質感．
- 周りからの光を反射出来たらそれっぽい．

##ノードの(雑な)説明
###Output Node
最終的に出力されるものをまとめたノード．
要素が多く理解しきっていないので変更したところだけ．

- Shader Name
    - MyShader/IceShader
        - このShaderの名前．ファイル名と同じにしておく．
        - "/"で名前を区切ることで階層構造にすることができる．自分で作ったものをまとめておきたいときに使うとよさげ．
- Blend Mode
    -  Transparent
        -  Opacity(不透明度)とRefraction(屈折)の出力が使えるようになる．

###Texture Sample
テクスチャを扱うノード．
ショートカットはTキー
今回は2つのTextureノードを使用．

- Texture(Albedo)
    - ASEのアセットに含まれていたfoam-distortion-001.pngを利用．
- Normal Map(Normal)
    - Default Textureの項目をBumpに変更．
    - Albedoで用いたテクスチャを[こちらのサイト](http://cpetry.github.io/NormalMap-Online/)を用いてNormal Mapにしたものを使用．

###Texture Coordinates
テクスチャのUVをごちゃごちゃさせたいときに必要なベースになるノード．
ショートカットはUキー
Tiling(テクスチャを並べる)やOffset(テクスチャをずらす)の調節ができる．

###Color
色を扱うノード．
ショートカットは5キー
今回はOutputのEmissionに接続することで発光させる色を指定．

##Float
浮動小数点を扱うノード．
ショートカットは2キー
ParameterのTypeを変更可能
今回は4つのFloatを使用

- Metallic
    - 0-1で指定
    - 金属光沢的なもの
- Smoothness
    - 0-1で指定
    - なめらかさ
- Refraction
    - 0-1で指定
    - 屈折率
- Opacity
    - 0-1で指定
    - 透過率

##ParametersのType
FloatやColorなどのノードはTypeによってインスペクター上などからアクセスを制限することができる．

|Type|雑な説明|
|:-:|:--|
|Constant|そのShader内で定数として使える|
|Property|ShaderやUnityEditorのInspector上，およびScriptからアクセスできる|
|Instanced property|ScriptからアクセスできてIncetanceとして生成|
|Global|Scriptからアクセスできるpublic static的なやつ|

[ASE公式の説明(Float)](http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Float)
>A set of ways the value behaves in different situations.
Constant: the value is assigned directly in shader code and can't be dynamically changed.
Property: the value becomes available in the properties of the material that uses the shader and can be changed in the material inspector or by script.
Instanced Property: the value can only be set by script and this defines the shader as an instanced shader. ( see more here: GPU Instancing )
Global: the value can only be set by script and this defines a static variable that is shared between all shaders that use it. It's useful to change a value globally.

#まとめ
ASEの練習もかねてとりあえずHello world的な．間違ってる可能性大．

#参考
[Amplify Shader Editor Wiki](http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor)
EC2へのデプロイ時のgemインストール「bundler:install」エラー対応

自分がcapistranoでデプロイ時に出たgemインストールエラーを備忘録。

# エラー内容
```terminal:ローカルのターミナル
UsernoMacBook-Pro:test-APP user$ bundle exec cap production deploy # capistranoのデプロイコマンド
00:00 git:wrapper
       mkdir -p /tmp
    ✔  ec2-user@10.100.10.100 0.074s
      Uploading /tmp/git-ssh-test-APP-production-test.sh
・
・
・
00:07 bundler:install
       $HOME/.rbenv/bin/rbenv exec bundle install --path /var/www/test-APP/shared/bundle --without development test…
       Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
      
      current directory:
       /var/www/chat-space/shared/bundle/ruby/2.3.0/gems/ovirt-engine-sdk-4.2.3/ext/ovirtsdk4c
       /home/ec2-user/.rbenv/versions/2.3.1/bin/ruby -r
       ./siteconf20180411-1701-1tt6of5.rb extconf.rb
       checking for xml2-config... yes
       checking for curl-config... no
       *** extconf.rb failed ***
       Could not create Makefile due to some reason, probably lack of 
      	--with-libcurl-config
       	--without-libcurl-config
       	--with-pkg-config
       	--without-pkg-config
       extconf.rb:40:in `<main>': The "libcurl" package isn't available. (RuntimeError)

```

なんぞやコレは？
```checking for curl-config... no```とか、
```extconf.rb:40:in `<main>': The "libcurl" package isn't available. (RuntimeError)```
というエラーが出ている。

# 原因
調べてみたら、[curlやlibcurl](https://www.ibm.com/developerworks/jp/opensource/library/os-curl/)がインストールされてないらしい。
なので早速インストール

# 解決策
```terminal:サーバに接続してるターミナル
$ sudo yum -y install curl
$ sudo yum -y install libcurl libcurl-devel
```
※自分の場合は「libcurl」がなかった。

インストール後、再度デプロイ

```terminal:ローカルのターミナル
00:07 bundler:install
       $HOME/.rbenv/bin/rbenv exec bundle install --path /var/www/chat-space/shared/bundle --without development test…
    ✔  ec2-user@10.100.10.100 0.506s
00:08 deploy:assets:precompile
       $HOME/.rbenv/bin/rbenv exec bundle exec rake assets:precompile
```

お！通った！
EC2でデプロイしている時に「bundle:install」でエラーが出る場合は、サーバ上に何かインストールされるべきものがされてないみたい。
```checking for curl-config... no```や```extconf.rb:40:in `<main>': The "libcurl" package isn't available. (RuntimeError)```というエラーメッセージに表示されているものをインストールしてみましょう。

curl、libcurl以外の場合は下記記事参照。
[1.bundleでnative extensionを使ったgemのインストールでエラーになる件（mysql2,rmagick,sqlite3）](https://qiita.com/tsubu-mustard/items/ed0d6a701ed0cacf4c11)
[2.gem インストール時に発生したエラーとその解決方法まとめ（therubyracer,kakasi, mecab,libxml-ruby,nokogiri,capybara-webkit,thrift）](http://kzy52.com/entry/2014/11/09/000511)
[3.ruby-filemagic -v 0.6.1 Gem::Ext::BuildError: ERROR: Failed to build gem native extension.　の解決方法](https://qiita.com/motty93/items/29e22c6bf811f8dd00ab)
AzureCLIからWebAppsを作成する

# 前準備

- 適当にプロジェクトファイルを作成しておく

```
### azure-cliのインストール
brew update && brew install azure-cli

### ログイン ブラウザにて認証する
az login

### リソースグループを作る
az group create --name hogegroup --location japanwest

### Azure Plan 作成、今回はFREE
az appserviceplan create --resource-group Resource-Group1 --name myAppServicePlan --location japaneast --sku FREE

### Microsoft.webのプロバイダが登録されてないと怒られた時にやる
az provider register --namespace Microsoft.Web
```

# WebAppsの作成
```
### 今回はnode8.1で作成
az webapp create --resource-group Resource-Group1 --name hogeapp --plan myAppServicePlan --runtime "NODE|8.1"

### 他のRuntimeにしたい時にやる
az webapp list-runtimes
```

- https://{app名}.azurewebsites.netを確認

# ローカルソースをデプロイ
```
### ソースをzip化 index.htmlとかがあるディレクトリでやること！
zip -r hogePJ.zip hogePJ

### デプロイ
az webapp deployment source config-zip --resource-group Resource-Group1 -n hogeapp --src {zipまでのpass}/hogePJ.zip
```

https://{app名}.azurewebsites.netを確認
index.htmlの内容が表示されていればデプロイ完了

毎回zipにするのもめんどくさいし、webapps管理画面上でローカルgitと連携させた方が簡単そう
Kotlinセットアップ with Vagrant

# Kotlinを走らせるまで

都合上PCに直で入れるのは難しかったし、dockerが使えなかったのでVagrantで地道に
インストールしていく

## Vagrant/Ubuntu

vagrant box add "ubuntu/trusty64"

vagrant init

```
Vagrant.configure("2") do |config|
    config.vm.box = "ubuntu/trusty64"
end
```

vagrant up && vagrant ssh

## Kotlinセットアップ

```
sudo apt-get install zip
curl -s https://get.sdkman.io | bash
source "/home/vagrant/.sdkman/bin/sdkman-init.sh"
sdk install kotlin
```

## Javaセットアップ

```
sudo add-apt-repository ppa:webupd8team/java
sudo add-apt-repository ppa:webupd8team/java
sudo apt install oracle-java9-installer
```

## 編集 & コンパイル

ok to run

```
cd /vagrant
touch test.kt
kotlinc test.kt -include-runtime -d test.jar && java -jar test.jar
```