OmniAICreator/Qiita-1.07M huggingface dataset:
Link > Use of Machine Learning Techniques for improved Monte Calro Integration

Use of Machine Learning Techniques for improved Monte Calro Integration
https://indico.cern.ch/event/568875/contributions/2397925/attachments/1459058/2253175/mcgbr-May12-2017.pdf

by Josh Bendavid (Caltech/LPC)
May 12, 2017
MB4BSM 
SLAC

### キーワード

自分が気になった部分を抜粋。 
読み切れていない部分は記載していない。

- Monte Calro integration
- Monte Calro generation
- camel function
    - S. Jadach, physics/0203033
        - https://arxiv.org/abs/physics/0203033
    - (補足) 4Dや9Dの関数の例として使用
- General idea, sample from some generating probability density g($\bar{x}$) instead of uniformly:
- VEGAS
    - Multidimensional functions are handled as a simple product of one-dimensional histograms 
- Foam
    - S. Jadach, physics/0203033
    - based on a single decision tree
    - hyper-rectangle
- Boosted Decision Trees for Classification
- GBRIntegration
    - Boosted Decision Treesのことらしい
- 4D Camel Function Integration
- Generative Deep Neural Networks
- Generative Adversarial Networks
    - https://arxiv.org/abs/1406.2661
    - a known prior distribution $p(\bar{z})$ (e.g. an N-dimensional normal distribution)
    - generative network $\bar{G}$
        - $G(\bar{z}) = \bar{x}$
    - discriminator network D
    - training
        - D is trained to maximally discriminate
        - G is trained to minimize the discrimination power of D
- $D_{KL}$
    - KL divergence with respect to the generating probability density function
        - Eq. (3)
    - can be approximated numerically from a finite data set
        - Eq. (4)
- Implementation Details
    - Keras + TensorFlow
    - Generative model and regression for function approximation
        - 5 hidden layers of different sizes
    - Generative Model
        - modified tanh activation 
            - 0.7 * tanh(x) + 0.3 * x
        - sigmoid activtion for Output layer
    - Regression Model
        - elu activation for intermediate layers
        - linear activation for output layer
- results: 4D Camel Function Integration
    - Generative DNNの誤差はGBRIntegratorと同じオーダー
    - TODO: Generative DNN (staged)とは?
- results: 9D Camel Function Integration
    - Generative DNN (staged)が最も良い結果を示している
bashスクリプトをデバッグする方法

[debugging - How to debug a bash script? - Unix & Linux Stack Exchange](https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script)より

bash 4.1以上にて

スクリプトの先頭に次のように書いておく

```
#!/bin/bash

exec 5> debug_output.txt
BASH_XTRACEFD="5"
PS4='$LINENO: '
set -x
```

すると`debug_output.txt`にログが出力される。

`exec 5>`はファイルディスクリプタ5番を`debug_output.txt`にするという意味。
`PS4`はトレース出力の際に表示されるプロンプト。`$LINENO`により行番号を表示している。
`set -x`は実行するコマンドをトレース出力させる。

元記事にはbashdb、log4bash、Eclipse、Visual Studioo Codeを使う方法なども紹介されているが、これが一番手軽でほとんどの場合十分だと思う。
Perlヒアドキュメント

Perlのヒアドキュメントメモ

SQL生成でよく使うなれないperlでよくはまるのでメモ

```pl
my $id=1;

my $sql = << "SQL";
select *
from table_a
where id=$id
;
SQL

print $sql;
```

- SQLの文字列は自由に決められる(EOFなどでもOK)
- SQLをダブルコーテーションで括ると変数が展開できる
- "SQL"の後ろにセミコロンが必要


この記事が詳しい
http://perl-users.jp/articles/advent-calendar/2008/14.html
huluで英語学習、ショートカットボタンを押すだけで字幕の日本語と英語を切り替える

huluで英語学習する際に毎回右下の設定アイコンをクリックしてから字幕の表示を切り替えるのがかなり大変だったのでchromeブラウザのデベロッパーコンソールからショートカットボタンを自作しました。
日本語と英語字幕が対応している動画再生ページでテンキーの2を押すと英語字幕、テンキーの3を押すと日本語字幕になります。日本語と英語字幕をボタン一つでトグルして切り替えるにはテンキーの0を押します。3秒前に巻き戻すにはテンキーの1を押します。

その他にはhulu独自のショートカットキーもあり、全画面再生中にスペースキーを押すと動画の再生と停止、方向キーの←→を押すと20秒巻き戻しと早送り、Ctrl+←又はCtrl+→を押すと10秒巻き戻しと早送りします

# Chromeの拡張機能
Chromeの拡張機能を作成して公開しました
よければ使ってください、以下のURLからダウンロード出来ます
[Huluで英語学習、字幕の言語を切り替えるショートカットキー - Chrome ウェブストア](https://chrome.google.com/webstore/detail/ekpondnfgmcaheiodnlnbiekhnmmjnin)

こちらは日本語と英語字幕を同時表示するHulu版になります
[Hulu 同時字幕で英語学習]
(https://chrome.google.com/webstore/detail/lmmahellpnmhbpmimpebhikpjhiojhok)

こちらはNetflix版で日本語と英語字幕を同時表示します
[Netflix 同時字幕で英語学習]
(https://chrome.google.com/webstore/detail/gibmkmmdicoffkhjkfimmjkojjopoagg)
ESLint v4.4.0

前 [v4.3.0] | 次 [v4.5.0]

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">ESLint 4.4.0 released: <a href="https://t.co/vLbFa9pcID">https://t.co/vLbFa9pcID</a><a href="https://twitter.com/hashtag/javascript?src=hash">#javascript</a> <a href="https://twitter.com/hashtag/ESLint?src=hash">#ESLint</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/893882817679167489">2017年8月5日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint 4.4.0 がリリースされました。
小さな機能追加とバグ修正が行われています。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

> 🏢 [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
> 👫 [日本語サポート チャット](https://gitter.im/eslint/eslint-jp)
> 🏢 [本家リポジトリ](https://github.com/eslint/eslint)
> 👫 [本家サポート チャット](https://gitter.im/eslint/eslint)

# 🚀 本体への機能追加

今回はありません。

# 🔧 オプションが追加されたルール

## [#8955]: [indent] `ImportDeclaration`

名前空間インポートにて、2番目以降の要素の位置を最初の要素に揃えるためのオプションが追加されました。

```js
/* eslint indent: [error, 4, { ImportDeclaration: "first" }] */

//✔ GOOD
import { foo,
         bar,
         baz,
} from 'qux';

//✘ BAD
import { foo,
    bar,
    baz,
} from 'qux';
```

# ✒️ `eslint --fix` をサポートしたルール

今回はありません。

----

[v4.3.0]: http://qiita.com/mysticatea/items/726294183dc2ba2dfbd6
[v4.5.0]: http://qiita.com/mysticatea/items/7cdf8166ad1f036ee022
[#8955]: https://github.com/eslint/eslint/issues/8955
[#9999]: https://github.com/eslint/eslint/issues/9999
[indent]: http://eslint.org/docs/rules/indent
[xxxx]: http://eslint.org/docs/rules/xxxx


<!-- 
![JSCS Icon](http://jscs.info/favicon.ico) JSCS 互換ルールです。
-->
見積もり技術に関するメモ

# 見積もり技術
* 細かい点は省き、概算値として見積もる
* 決まっていない点も見積もる
* ユーザとの調整にかかる工数も考慮する
* 試験項目数を出し、項目数をもとに工数を算出
* 新規なのか、既存の試験を流用するのかを出す
Tumblrのブログからアーカイブページへ遷移するブックマークレット

# フォロワーを増やす時
Tumblrでフォロワーを増やしたり、削除したりするのはTumblrにおいての需要な営みといえます。皆様はフォロワーを増やす時は、どんな動きをしますか？ 私は、以下のようにして自分のフォロワーを増やしています。

1. 自分の投稿一覧に移動
1. 適当な投稿のリアクションの一覧を表示する
1. 同じ投稿をリブログしたユーザーのブログに移動
1. **そのブログのアーカイブに移動**
1. 趣味が合いそうと感じたらフォロー

私の流れは概ねこんな感じ。この時にポイントとなるので、4番目の「そのブログのアーカイブに移動」というステップです。私の中でこれは必須の工程。個別のブログとか見づらくて見づらくてどうしようもないブログだらけですから。「読んで欲しくないのかな？」ってレイアウトなのは普通として、突然音楽が鳴り出すブログまである始末。今は21世紀ですよ？ 音楽が鳴り出すって…

ですから個別のブログに遷移した瞬間にアーカイブページに移動したいのです。アーカイブページとは、Tumblrブログに公式で用意されているパネルレイアウトのページの事です。各ブログのURLに「/archive」をつけると表示出来ます（例：[https://nihongo.tumblr.com/archive](https://nihongo.tumblr.com/archive)）。ここ見やすくて好きなんです。一覧性が抜群だし、どういった画像が多い、テキストの投稿の比率など、その人がどういった傾向の投稿をしているかをぱっと把握するにはアーカイブページが一番。

# アーカイブページに移動する際の障害
このアーカイブページの重要性を理解していない人のなんと多いことか。アーカイブページへのリンクが分かりにくい所にあるのはまだ許せるとして、リンクが存在しないブログも普通にあって許しがたい。

![tmblr_archive_out.png](https://qiita-image-store.s3.amazonaws.com/0/57879/c034eba0-98b6-458d-5757-801ac24f9922.png)


リンクの存在しないファッキンなページの場合は、仕方がなく手動でURLの末尾に手動で「/archive」を付けて移動とかしていました。

# ブックマークレット作った
手動でアーカイブページに移動するのが、あまりにも不毛だったのでブックマークレット作りました。

```
javascript:(function(){var%20url=location.href;var%20blog_url=url.match(/https?:\/\/.+\.tumblr.com/);location.href=blog_url+'/archive';})()
```

TOPページからも、投稿の個別のページ（例：/post/[ポストID]/）でも利用可能です。ただ、独自ドメイン設定しているページには対応出来ません。
docker-composeで作るWordpress環境


### はじめに
---

Vagrantが重過ぎるので、dockerに乗り換えがてら、wordpress環境をサクッと作ってみる。

やりたいこととしては、wordpressのtheme編集が出来て、データベースは非エンジニアでも触れるようにしておけば、使い勝手もいいだろうということでphpmyadminも使えるようにしておく。

なおdocker-composeで作るので、共有も簡単に出来ます。

#### 環境は以下

* Mac OSX 10.12.6
* docker 17.06.0-ce, build 02c1d87
* wordpress (公式イメージのlatest)
* mysql (公式イメージのlatest)
* phpmyadmin (公式イメージのlatest)

> Dockerのインストールに関しては、[Docker for Mac](https://www.docker.com/docker-mac)を入れておけばOK

　

### 1. ディレクトリ構成
---

ディレクトリの構成は以下のような構成で作る。
なお今回は作業ディレクトリ名を`root`とします。

```
root/
　┣ docker-compose.yml
　┣ db-data/
　┣ themes/
```

`root`ディレクトリ直下に`docker-compose.yml`ファイル、`db-data/`フォルダ、`themes`フォルダがあります。
それぞれの役割は

```
// 作成したいコンテナの情報を記述
docker-compose.yml

// docker起動時に最初からデータを入れておきたい場合は、db-dataフォルダ内にsqlファイルを入れておけば勝手にインポートしてくれる
db-data/

// 作成・編集したいテーマフォルダを入れておく。
themes/
```


　
### 2. docker-compose.ymlを書く
---

docker-compose.ymlにdockerイメージの設定なんかを書いていく。
envファイルに環境変数をまとめるやり方の記事が多いが、今回はあくまでもローカルで動かすためなので、envファイルは作らないで書く。


```yml
version: "2"
services:
  # mysql settings
  mysql:
    image: mysql:latest
    environment:
      - MYSQL_ROOT_USER=root
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=hoge
      - MYSQL_USER=wp_user
      - MYSQL_PASSWORD=root
    volumes:
      - db-data:/var/lib/mysql
      - ./db-data:/docker-entrypoint-initdb.d
    ports:
      - 3306:80

  # Wordpress settings
  wordpress:
    image: wordpress:latest
    ports:
      - 80:80
    depends_on:
      - mysql
    links:
      - mysql
      - phpmyadmin
    environment:
      - WORDPRESS_DB_HOST=mysql:3306
      - WORDPRESS_DB_NAME=hoge
      - WORDPRESS_DB_USER=wp_user
      - WORDPRESS_DB_PASSWORD=root
    volumes:
      - ./themes:/var/www/html/wp-content/themes
  # phpmyadmin settings
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - mysql
    ports:
      - 8080:80
    volumes:
      - /sessions
volumes:
  db-data:
    driver: local
```

　
### 3.開発方法
---

適当な作業ディレクトリを作成し、上記の`docker-compose.yml`、`db-data/`、`themes/`を配置する。

めんどくさい方は[https://github.com/ken-sayama/docker-for-wordpress](https://github.com/ken-sayama/docker-for-wordpress) githubにサンプル置いておきます。

そのディレクトリで`docker-compose up -d`をおこなえばwordpress環境が立ち上がります。
　
### 4.アクセス
---

* [localhost](http://localhost:80)
* [phpmyadmin](http://localhost:8080)

上記でブラウザで表示確認が可能

### 5.補足

既存で運営してるサイトのローカル開発環境としたいのであれば、dumpしたsqlファイルを`db-data`フォルダ内に配置して、`docker-compose up -d`。

プラグインの依存関係などもあり、wordpressのプラグインフォルダもホストで管理したい場合は、volumesの設定を以下のように書き換える。



```yml
# Wordpress settings
  wordpress:
    image: wordpress:latest
    ports:
      - 80:80
    depends_on:
      - mysql
    links:
	  - mysql
	  - phpmyadmin
	environment:
	  - WORDPRESS_DB_HOST=mysql:3306
	  - WORDPRESS_DB_NAME=hoge
	  - WORDPRESS_DB_USER=wp_user
	  - WORDPRESS_DB_PASSWORD=root
	volumes:
	  - ./themes:/var/www/html/wp-content/themes
	  # 以下を追加
	  - ./plugins:/var/www/html/wp-content/plugins

```

以上何かあればコメントください
How to set ssh key on Windows

Since Windows cmd can't use ssh command, and I failed many times to set up key when use PuTTY, so I recommend use the [OpenSSH for Windows](http://sshwindows.sourceforge.net/) to set up your key.

## Install OpenSSH
1. Go to the [OpenSSH for Windows download](http://sshwindows.sourceforge.net/download/) page 
2. Choose `Binary Installer Releases`
3. Download the **.zip** file
4. Extract zip file and install it

## Confirm installation is success or not
1. Open command line (If you don't know how to open it, you can use `windows key + R` and input `cmd` then click `OK`)
2. Input `ssh` then you will see some usage of ssh command
<img width="556" alt="ssh.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/150138/30a49c17-17b5-8723-fe7f-c0fcd2d0912c.png">

## Create the key pair
- Open command line
- Enter to target folder. eg: **`cd C:\Users\<User Name>`**
- Input **`ssh-keygen -t rsa`** , you will see the message like below 

```text
Generating public/pricate rsa key pair.
Enter file in which to save the key (/c/Users/<User Name>/.ssh/id_rsa):
Created directory '/c/Users/<User Name>/.ssh'.
```

- It will asking you a password for the key when access, if you don't want to use pass word, just pass it (enter twice). The message will like:

```text
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/<User Name>/.ssh/id_rsa.
Your public key has been saved in /c/Users/<User Name>/.ssh/id_rsa.pub.
The key fingerprint is:
88:55:55:ff:ff:99:aa:e1:f4:a0:01:43:4e:e8:bc:ff <User Name>@desktop
```

## Access git server
- Access server that confirm your key is set up success **`ssh <username>@<server host name>`**
- First time to access server after set up the key, you will see the message as below

```text
The authenticity of host 'host name(IP address)' can't be established.
RSA key fingerprint is 80:5f:25:7c:f4:90:aa:e1:f4:a0:01:43:4e:e8:bc:f5.
Are you sure you want to continue connecting (yes/no)?
```

- Input **`yes`** , and enter your server password
- Then you will enter to server !
Vagrant上のdockerでnginxを作成しホストからアクセスする

Vagrantで作成したVM上のDockerでnginxサーバーを稼働しローカルからアクセスできるようにします。

#環境
MacOS 10.12.6 (Sierra)
Vagrant 1.9.7
CentOS 7.3(VM)
Docker 17.06.0-ce

#下準備
VagrantでVMを作成しその上でDockerを利用できる状態であること。
してない場合は下記参照下さい。
[VagrantでVM起動に自動でDockerをインストールする](http://qiita.com/Manjiii/items/d09233728b5a5d68f67b)

#nginxイメージの取得
イメージはDocker Hub内のOfficialのnginxイメージを使用します。
[Official build of Nginx.](https://hub.docker.com/r/_/nginx/)

```
#vmに入る
vagrant ssh

#nｇinxのdockerイメージを取得する
docker pull nginx
#バージョンを指定したい場合はタグで指定する※ない場合は最新(latest)が指定される
# docker pull nginx:1.13.33

#イメージが取得できたか確認
docker images
#nginxのイメージが表示される
```

#nginxの起動確認
```
#起動
docker run -d --name nginx_test -p 8080:80 nginx
# nginx_test <- 名前付け
# -d <-- バックグラウンドで実行
# -p 8080:80 <- ホスト（VM）の8080番ポートをコンテナの80番ポートにマッピングする
# nginx <- 使用するイメージ名

#コンテナが稼働しているか確認
docker ps -a
#nginxがupになっている

#表示確認
curl localhost:8080
#nginxのwelcomeページが取得される

```

#Vagrantホスト（今回はMac）からアクセスする
##VMにアクセスするためのIPを設定する
```
#ホスト側でVagrantfileを編集
vi Vagrantfile

Vagrant.configure("2") do |config|
  # The most common configuration options are documented and commented below.
 ---略----

 #config.vm.network "private_network", ip: "192.168.33.10"
↓上記の行をコメントアウトを外し任意のIPを設定
config.vm.network "private_network", ip: "192.168.33.10"

 ---略----
  # SHELL
end

#vagrant再起動
vagrant reload

#VMに入り再度nginxを起動する
vagrant ssh

#起動しているコンテナを確認
docker ps -a
#nginxのステタースがExitedになっている

#再開する
docker start nginx

#再開確認
docker ps -a
#nginxのステタースがupになっている

#アクセスが来るかログを監視
docker logs -f nginx

```
##ホスト（Mac）側からの表示確認
ブラウザで
http://192.168.33.10:8080/
\#IPは設定したもの
にアクセスしてnginxのwelcomeページが表示され
dockerのログにアクセスログが出ることを確認する

#自動でnginxをインストールし起動するようにする
上記手順では手動でイメージのインストール、起動を行いましたが
Vagrantファイルに記述することでvagrant up時に自動で行うように設定します。

```
vi Vagrantfile

Vagrant.configure("2") do |config|
  # The most common configuration options are documented and commented below.
 ---略----
#以下の記述を追加
  config.vm.provision "docker" do |d| #dockerをインストール・起動する
    d.run "nginx", image: "nginx", args: "-p 8080:80" #nginxを"-p 8080:80"を引数にrunする（自動でnginxイメージを取得）
  end

 ---略----
  # SHELL
end

```

次はコンテンツ編集をローカルでできるようにしたいと思います。
[Vagrant-docker-nginx環境でhtmlをローカルで編集できるようにする](http://qiita.com/Manjiii/items/10d9f3f6cc59c8fb763e)
VSCodeでテキスト選択（ctrl+shift+〇）のキーバインド登録方法

# 概要

自分は環境は macOS High Sierra です。
mac で ctrl+p で上矢印 ctrl+f で右矢印などのショートカットを使用している人は多いのではないでしょうか。
もともとは Emacs のキーバインドらしいのですが、 macOS では基本的にどのアプリでも使用でき大変便利です。
このコマンドに似せてテキスト選択をキーボードだけで、操作したいと思ったので、その方法を書きます。

ちなみに経緯は kobito (Markdownエディタ)ではこのキーバインドが動作したので、自分のメインエディタである VSCode でも使用できるようにしたかったというものです。

# VScodeでショートカットを登録

VSCodeのバージョンは 1.28.1 での操作です。
今回の件に限らず VSCode では下記の方法で好きなキーバインドを登録することができます。
メニューバーから
File->Preferences->Keyboard Shortcuts
日本語だと
ファイル->基本設定->キーボードショートカット
キーボードショートカットという画面になりますのでその中から
`keybindings.json` を開きます。

あるいは コマンドパレット [Command + Shift + P] で `keybind` などと検索してもこのファイルにだどりつけるかと思います。

keyboard shotcut　という項目に辿りつくかと思います。
ここの一番右のアイコンをクリックすると `keybindings.json` が開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146048/65a471c1-037b-2a5a-39e1-e63777a29363.png)


`keybindings.json` に下記をコピペします。

```json

[
  {
    "key": "ctrl+shift+n",
    "command": "cursorDownSelect",
    "when": "editorTextFocus"
  },
  {
    "key": "ctrl+shift+p",
    "command": "cursorUpSelect",
    "when": "editorTextFocus"
  },
  {
    "key": "ctrl+shift+f",
    "command": "cursorRightSelect",
    "when": "editorTextFocus"
  },
  {
    "key": "ctrl+shift+b",
    "command": "cursorLeftSelect",
    "when": "editorTextFocus"
  },
  {
    "key": "ctrl+shift+a",
    "command": "cursorHomeSelect",
    "when": "editorTextFocus"
  },
  {
    "key": "ctrl+shift+e",
    "command": "cursorEndSelect",
    "when": "editorTextFocus"
  }
]

```

他にも `default keybindings`を参考にいろいろ作れそうですね。
以上です。
JSの練習_郵便番号から住所を検索

# 前提と準備
## 前提
閉鎖ネットワーク下でも使えるようにしたかったのでAPIは使用しない。
JS覚えたてホヤホヤなので実用的なものは今のところ無視。
## 準備
[日本郵便のサイト](http://www.post.japanpost.jp/zipcode/download.html)からCSVファイルをダウンロードして、エクセルやエディタでクリーニングしたあと、オブジェクトに突っ込む。

```js:サンプル
var addressList = [
{"zipcode":"1020072","prefecture":"東京都","city":"千代田区","town":"飯田橋"},
{"zipcode":"1020082","prefecture":"東京都","city":"千代田区","town":"一番町"},
{"zipcode":"1010032","prefecture":"東京都","city":"千代田区","town":"岩本町"},
{"zipcode":"1010047","prefecture":"東京都","city":"千代田区","town":"内神田"},
{"zipcode":"1000011","prefecture":"東京都","city":"千代田区","town":"内幸町"},
...];
```


# やったこと
## 1.addressIndexの生成
郵便番号で検索かけたときに、キー値が直接とれるとうれしかったのだけど、配列じゃないと無理っぽい。
このためaddressListから取得した郵便番号で、addressIndexという配列を生成しなおす。
addressListのオブジェクトから配列を生成することで、addressListとaddressIndexの並び順は同じになるはず。

```js
var addressIndex= []; //空の配列を作成

//郵便番号だけでindexを生成
for( i in addressList){
    addressIndex.push(addressList[i].zipcode);
}
```

## 2.キー値の取得から住所情報へのリターン
//2-1はhtml側からid="zipcode"に入力された値を変数zipCodeに格納。
//2-2でそれを配列addressIndexに問い合わせて、キー値を取得した後、変数iNumに格納している。
それ以降はiNumで取得したキー値をつかって、オブジェクトaddressListの各プロパティとプロパティ値にアクセスしている。
なお、if(iNum != "-1")は、無効な郵便番号を問い合わせたときのための処理。

```js
//郵便番号検索クリックで住所欄に住所を挿入
$("#zipcode-serch").on('click',function(){
    var zipCode = $("#zipcode").val(); //2-1
    var iNum = addressIndex.indexOf(zipCode); //2-2
    if(iNum != "-1"){
       var return_address = addressList[iNum].prefecture+addressList[iNum].city+addressList[iNum].town;
       $("#address").val(return_address);
        }
    });
```

# 感想
30過ぎてからコード書き始めたけども覚えることそのものよりも、合間をぬってコツコツコード書くことが実は一番大変な気がする。（特に仕事（コーディングしてない）が忙しいとき。）
皆さんどうやって勉強してるんだか...。
Cloud Functions for FirebaseとFirebase Hostingを連携させる

[Firebase Hosting](https://firebase.google.com/docs/hosting/)で動的コンテンツのホスティングができないか調べていたら、[「それCloud Functions for Firebaseでできるよ」というドキュメントが英語版だけ存在した](https://firebase.google.com/docs/hosting/functions)(2017年8月時点)ので実際に試してみました。

Cloud FunctionsとFirebase Hostingを組み合わせるメリットは次の3点かと思います。

- 静的コンテンツと動的コンテンツを組み合わせやすくなる
- 動的コンテンツのURLを自由に設定できる
- カスタムドメインの指定ができる

以下、手順を紹介します。

# セットアップ

まず[Firebaseのコンソール](https://console.firebase.google.com/)にログインし、適当なプロジェクトを1個作成します。

次にNode.jsを最新版にアップデートします。私はmacOSを使っていますが、他のOSを利用している場合は適宜読み替えてください。

```
$ brew upgrade node
```

次にnpmでFirebase用のパッケージをインストールして、Firebaseにログインします。

```
$ npm install -g firebase-tools
$ firebase login
```

作業ディレクトリに移動して初期化します。

```
$ cd node-example-on-firebase-hosting
$ firebase init
```

注意点というほどではありませんが、`firebase init`の最初の質問は、スペースで選択してエンターで確定するというインターフェースになっています。

![firebase-init.png](https://qiita-image-store.s3.amazonaws.com/0/46856/a9584730-7547-a7b5-249b-e8f262b5603d.png)

上の図ではFunctionsとHostingを有効にしています。その次の質問で先ほど作成したプロジェクトと紐付けて、初期化を行います。

初期化が終わると必要ファイルが作られているので、`public`以下や`functions`以下のファイルを適当に編集して、デプロイします。

```
$ firebase deploy
```

これで、`https://[proj_id].firebaseapp.com/`以下にコンテンツがデプロイされます。

# Firebase HostingからCloud Functionsの呼び出し

Firebase HostingのURLとCloud Functionsの紐付けは、`firebase.json`の`rewrites`で指定できます。

```json:firebase.json
{
  "hosting": {
    "public": "public",
    "rewrites": [
      {
        "source": "/**", "function": "nodeinfo"
      }
    ]
  }
}
```

上記の設定だと、public以下に存在しないURLが指定された場合は全部`nodeinfo`が処理を行うことになります。

# カスタムドメインの設定

Cloud Functions単体ではカスタムドメインの指定はできません。せっかくFirebase Hostingと組み合わせたわけですから、そのメリットを生かす意味でカスタムドメインを紐付けてみましょう。Firebaseコンソールの「Hosting」「ダッシュボート」から「ドメインを接続」を選びます。

![connect-domain.png](https://qiita-image-store.s3.amazonaws.com/0/46856/13dcb0af-736d-8114-87f9-5c1fd107a3e0.png)

上記のように自分が管理するドメインのFQDNを指定した上で、DNS設定を行います。

自分がドメインの所有者であることを示した上で[^1]、しばらくすると[^2]SSL証明書が自動的に発行され、カスタムドメインにHTTPS経由でアクセスできるようになります。

[^1]: 私は「セットアップモード」「詳細設定」を選んでTXTレコードを登録しましたが、通常は「クイックセットアップ」で問題ないと思います
[^2]: 私の場合は数時間後には使える状態になっていました

# デモサイト

そんなこんなで作ったデモサイトは下記です。

- https://nodeinfo.hnw.jp

上記URLでは[nodeinfo](https://www.npmjs.com/package/nodeinfo)というパッケージを使ってサーバの情報を表示しています。

今後の変遷を確認する意味で、ブラウザのキャプチャ画像も残しておきます。

- [gcf-nodeinfo-20170806.png](https://qiita-image-store.s3.amazonaws.com/0/46856/b73fe1fe-457e-fa0f-c165-1985b1da030a.png)

上記サイトに対応するgitリポジトリは下記です。同じ内容でデプロイしてみたい方はご利用ください。

- https://github.com/hnw/node-example-on-firebase-hosting

# 料金

気になる料金ですが、無料枠だけでもアプリケーションの性質次第では便利に使えそうな印象です（参照：[Firebase 料金表](https://firebase.google.com/pricing/)）。

無料枠で使っていて最初に引っかかりそうなのはCloud FunctionsのCPU時間で、月間4万CPU秒が上限です。上記デモサイトの場合は1リクエストで200ms程度かかっているので、月間20万リクエストでクォータに引っかかることになります。これを多いとみるか少ないとみるかは人それぞれでしょうが、仲間内で使う程度のサービスなら十分すぎるように思います。

ただ、無料枠だとGoogle外部へのネットワーク通信ができません。これは作りたいアプリケーションによっては厳しい制約だと言えそうです。また、RDBが欲しいような場合には別のサービスを利用した方が良さそうな気がします。この環境にこだわりたい場合は[Firebase Realtime Database](https://firebase.google.com/docs/database/)（Firebase独自のNoSQL）で頑張れるかもしれません。
EgitでCommit時のコミッター設定

# はじめに  
eclipseのEgitでGitHubにpushした際にcommitユーザがGitHubのユーザにならず試行錯誤したので備忘録.  

# 結論  
gitconfigにusername/emailを設定する.  

# 手順  
1. eclipse 【ウィンドウ】->【設定】->【チーム】->【Git】->【構成】を開く.  
1. 【ユーザ設定】に【user.email】【user.name】をキーにGitHubに設定している情報を追加.  
![eclipse_git構成.png](https://qiita-image-store.s3.amazonaws.com/0/146699/53acd932-086c-26c6-584f-1e3a8bdb3330.png)
1. 適当にリポジトリに変更を加えてGitステージングを確認すると右下の【作成者】【コミッター】の値が設定した値になっている.  
1. GitHubにPushしてcommitユーザを確認.
サンプル数 n がバグ発見の決め手。

何年もかかってしまったプロジェクトがようやく終焉を迎えようとしていますが、終盤で発見した深刻なバグの経験から、改めて痛感したのは、**サンプル数 n がバグ発見の決め手**であるということ。

データのサンプル数 n の辻褄が合っていない場合、ほぼ100%どこかに深刻なバグが潜んでいます。

備忘録的に対策としての工夫を書き残しておきます。

# 1. nを常に吐き出す

論文にもどのみちサンプル数 n を記載する必要がありますから、**Live Script (MATLAB)では常にサンプル数 n の数字を常に吐き出す**ように心掛ける

  ```matlab
  fprintf('A: n = %d\n',length(A));
  ```
# 2. n の見える化には努力を怠らないこと
**サンプル数の見える化については努力を怠らない**。たとえばもし、A, Bの2つのデータが組になっているならば、

```matlab
...
fprintf('A: n = %d\n',length(A));

...
fprintf('B: n = %d\n',length(B));
```

というように、コードの別々の場所でそれぞれの数字を吐き出すよりは、

```matlab
disp(table(length(A),length(B),...
  'VariableNames',{'A','B'},...
  'RowNames',{'n'}));
```
として一箇所でまとめて表示するほうがよほど可視性が高く問題に気づくのが早くなります。

# 3. assertionを配備しておく

サンプル数に関して、何かルールが存在する場合は（たとえばA群のサンプル数とB群のサンプル数を合わせると100になる、というルール）、データ解析の計算そのものに必要なくとも（ここが肝心。サンプル数が狂っていても問題なく計算できてしまう解析が多い。）、**assertion を追加**しておきます。これによって、もしルールが破られた場合はエラーが出るような安全設計ができます。

```matlab
assert(length(A) + length(B) == 100,...
  'Sample numbers do not satisfy the rule.')
```
ext4のSSDの書き込み総量を取得するdumpe2fsコマンド

# SSDの寿命を推定

SDDの寿命は書き込み回数の上限値で決まっていることがある。
ext4のファイルシステムではdumpe2fsコマンドを使って、
SSDの書き込み総量を取得でき、そこから書き込み回数の上限を推定できる。

http://www.atmarkit.co.jp/ait/articles/1803/22/news028.html

```
# 自分のSSDのファイルシステムがext4かどうかを確認する
mount

# SSDの書き込み総量を表示
# ※ 下記の例では/dev/sdb1がSSDを示すデバイスファイル
# ※ Lifetime writesが書き込み総量
# ※ -h でス―パーブロックの情報だけを表示
dumpe2fs -h /dev/sdb1 | grep "Lifetime writes"
Lifetime writes:          1800 GB
```
http://itpro.nikkeibp.co.jp/article/COLUMN/20140421/551883/

SSDは複数のブロックに分かれており、特定のブロックにばかり書き込みが行われると
書き込み回数の上限に達しやすい。

どのブロックにどのぐらい書き込まれるかは、機種ごとのアルゴリズムによるので分からないAi

SSDの総容量で割ることで、SSDのディスク全体の書き込み回数は算出できるので、
参考値として、どのぐらいSSDに不可がかかっているか判定できる。
SSDのディスク全体の書き込み回数 = SSDの書き込み総量 / SSDの総容量 

http://moriwaka.blogspot.jp/2013/12/ssdext4.html

# 注意点
スーパーブロックが更新されるのは端末再起動がかかったときなど、
ファイルシステム更新時のみなので、dumpe2fs の情報は現在の情報ではなく、
ファイルシステムが更新されたときの情報が表示されている。

# 用語

* ファイル

ハードディスクに配置される情報の集まり

* メタ・データ
各ファイルの配置場所や、更新日、所有ユーザ、サイズなどのファイルの管理情報

* ファイルシステム
上記のメタデータや、SSDの空きブロックサイズなどのファイルの管理情報を管理する仕組み

* ファイルシステムの破損
ファイルの管理情報が参照できなくなり、
どのファイルがどこにあるのか分からなくなること

* スーパーブロック
ファイルシステムの管理情報を記録する領域
https://open-groove.net/linux/linux-filesystem-superblock/

* ジャーナルファイルシステム
ファイルシステムの更新内容をジャーナル(ログ)に記録するファイルシステム。
システム障害が生じた際に、ログに記録された内容を基に復旧が可能

* ext
Linuxで最初にサポートされたファイルシステムは、Minixには性能に問題があったため、
ext(拡張ファイルシステム)が作成された。

ext1 -> ext2 -> ext3 -> ext4と更新されていっている。
Apache License適用時、ソースファイルのヘッダへの記載は不要（？）

注：この記事を書いているのは法律の専門家でも、プロの翻訳家でもありません。内容の正確性についての保証はありません。この記事の情報に基づいて行われた一切の行為とその結果について筆者は責任を負いません。

ソフトウェアにApache Licenseを適用する手順として、全てのソースファイルの冒頭にコメントとしてライセンス表記を記載する、ということが[書かれていたりします](https://github.com/yosukesakai/guideline_for_procedure_of_open_project/blob/master/Appendix/ApacheLicense2.0%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9%E4%BB%98%E4%B8%8E%E3%81%AE%E3%81%97%E3%81%8B%E3%81%9F:%E6%8E%A1%E7%94%A8%E3%81%AE%E7%90%86%E7%94%B1.md)。
正直かなりめんどくさいです。（全てのコードを100%自分で書いているなら、自動で全ソースコードに付与でいいかもですが、scaffoldなどで生成されたコードが含まれていたりしたら…？この辺詳しくないのですが、一つ一つ目視確認することになるのでしょうか…）
全ソースファイルにライセンス文を付与するだけのcommit履歴が残るのも邪魔ですし…

本当に全ソースファイルへのライセンス文付与は必須なのでしょうか。
Apache License適用に関して、ライセンス原文 (https://www.apache.org/licenses/LICENSE-2.0) を見てみます。

"APPENDIX: HOW TO APPLY THE APACHE LICENSE TO YOUR WORK" の項に、
> The text should be enclosed in the appropriate comment syntax for the file format.

という記述があります。
"should"ですから、別に必ずしなければならないわけではなさそうです。

また、[こちらのページ](http://www.apache.org/dev/apply-license.html)には、Apache License適用にあたってのFAQが書かれていますが、
> DO I HAVE TO HAVE A COPY OF THE LICENSE IN EACH SOURCE FILE?
> Only one full copy of the license is needed per distribution. See the policy.

というドンピシャな解答がありました。

１つの配布物につき、ライセンスの完全コピーが１つ含まれていればよい、らしいです。
ライセンス全文を記した`LICENSE`ファイルを１個含めておけば良さそうですね。

ただ、"should"なので余裕があればやっておく方が良いかもですね。
上述の[FAQページ](http://www.apache.org/dev/apply-license.html)には
> Each original source document (code and documentation, but excluding the LICENSE and NOTICE files) SHOULD include a short license header at the top. If the distribution contains documents not covered by CLA, CCLA or Software Grant (such as third-party libraries) then see the policy guide.

と強く書かれていて、[リンク先](http://www.apache.org/legal/src-headers.html#headers)曰く、Apache Software Foundationのソフトウェアは、ソースコードヘッダにライセンス文を記載するという方針みたいです。
Bash On Ubuntu On Windowsのインストール

# Bash On Ubuntu On Windows
今更感満載だけどBash入れてみた。
仮想環境立てるにもマシンスペックカツカツで…
クラウドは落とすの忘れる質なので駄目。

今回のインストール環境のメモ。
・Windows10 Pro
・バージョン1073 (OSビルド15063.413)

# インストール手順
## 機能を有効にする
___・Linux Subsystemを有効にする___

1. 「コントロールパネル」→「プログラムと機能」→「WIndowsの機能の有効化または無効化」の順に開く。
1. 『WIndows Subsystem for Linux(Beta)』を有効にして『OK』。
1. Subsystemのインストールが完了後、再起動する。

___・開発者モードを有効にする___

1. 「設定」→「セキュリティと更新」の順に開く。
1. 「開発者向け機能を使う」を『開発者モード』に変更する。

```
変更時に注意書きが出るので一読の上進める。
```

## bashのインストール
1. コマンドプロンプトを開く。
2. bashと打つ。

```
>bash
-- ベータ機能 --
これにより Windows に Ubuntu がインストールされます。Ubuntu は Canonical によって配布される製品であり、
次のサイトに示される条件に基づいてライセンスされています。
https://aka.ms/uowterms

続行するには、"y" を入力してください: y
Windows ストアからダウンロードしています... 100%
ファイル システムを展開しています。この処理には数分かかります...
Ubuntu のロケールを Windows のロケール (ja-JP) と一致するように設定しますか?
既定のロケールは en_US です。
続行するには、"y" を入力してください: y
新しい UNIX ユーザー名を入力してください:（任意のユーザ名）
新しい UNIX パスワードを入力してください:（任意のパスワード）
新しい UNIX パスワードを再入力してください:（パスワード再入力）
passwd: password updated successfully
インストールが正常に終了しました
環境が間もなく開始されます...
ドキュメントを参照できる場所: https://aka.ms/wsldocs
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

ユーザ名:ホームディレクトリ$ 
```

以上でインストール完了。

なお、Ubuntuを動かすことには変わりないので、定期的なパッケージ更新は行うこと。

```
$sudo apt-get update
[sudo]（ユーザ名）のパスワード:
$sudo apt-get upgrade

```
Kerasを触ってみた その②「音楽生成（LSTM）」（2017/5/23）

---
#最初に
　前回同様にKeras経由のDLに慣れるために、下記URLで紹介されているデモコードを実行してみる。そしてコードに解らない点があったら調査＆メモとして記録する。今回は、LSTM&音楽生成にチャレンジする。

　[Using Keras & Theano for deep learning driven jazz generation ](https://deepjazz.io/)

#事前準備＆実行

◯追加ライブラリの導入
　・music21
　　音楽構造の抽出、変換、編集などといったことを記号操作によって行う。音声ファイル（midi）を数値配列に変換できる。wavやmp3は無理な様子。
　・scipy
　　科学技術計算のツールボックス。補完、積分、最適化、画像処理、統計、特殊関数等。

◯動かすためにやったエラー潰し
　・学習のときに、numpyのエラーが出たが、gitのissueボードを見たら解決策が書いてあって助かった。（epochを制限する）
　・music21の関数の引数の仕様が、installしたライブラリのversionとデモコードとで違いがありハマった。
　・xrangeをrangeに変更。Python3系ではxrangeは存在しない。
　　どうやら、2系で書いたデモコードだった模様。
　
##まとめ
・デモコードが前提とする実行環境と、今回試した環境に差異があったため色々と問題が発生したが、無事に音楽生成が実現できた。

・Keras 〜Theano用のコードも、Keras 〜Tensorflowで動くが、今回のデモコードの場合、Tensorflowの方が圧倒的に早かった。
・途中で止めてしまったので結果の差異は確認していないが、サイトにUPされてる生成済音源と一緒に聞こえ、ほぼ差異はなさそう。
Kerasを触ってみた その①「りんごとオレンジの画像判別」（2017/5/23）

---
#最初に
　とりあえずKeras経由のDLに慣れるために、なんでも良いので動かすことを目的に下記URLで紹介されているデモコードを実行してみる。そしてコードに解らない点があったら調査＆メモとして記録する。

　[Kerasによる、ものすごくシンプルな画像分類（りんごとオレンジ）](http://qiita.com/hiroeorz@github/items/ecb39ed4042ebdc0a957)

#事前準備

◯識別する画像の収集

　　Google画像検索で、リンゴとオレンジの画像をDLしてローカルのフォルダに配置する。
　　Training：20個、Test：5個
>　　train/apple/…
>　　　　/orange/…
>　　test/apple/…
>　　　　/orange/…

◯追加ライブラリの導入
　・numpy
　　(ナムパイ/ナンパイ）は、数値計算を効率的に行うためのライブラリで多次元配列（ベクトル・行列）の演算が可能

　・pillow
　　画像処理ライブラリで、Python Imaging Library (PIL)の fork プロジェクト

#画像識別　〜処理の大まかな流れ
　①学習用データ作成
　②モデル生成・ニューラルネット構築
　③学習の実行
　④モデル予測と正解との比較　→正解率

#①学習用データ作成
・クラスラベル（正解）は、ディレクトリ配置から取得
・画像を25 x25ピクセルに変換
・[R,G,B]3要素のnumpy配列化する
　１画像：25x25ピクセル分の配列
　１ピクセル：[244 245 250]のような感じ

・Transpose→Reshapeで一次元配列に。
　[ 244.  244.  244. ...,  238.  240.  241.]
　要素数は、25x25個

#②モデル生成
```
　model = Sequential()　 #Sequentialモデル(系列) の定義。層を積み重ねたもの
　model.add(Dense(200, input_dim=1875))  #addメソッドで層を追加
　　#Denseは、通常の全結合ニューラルネットワークレイヤー。
　　#モデルは(*, 1875)次元の入力配列となり，(*, 200)次元の出力配列となる
　model.add(Activation(“relu”)) 
　model.add(Dropout(0.2)) #入力にドロップアウトを適用．訓練時のそれぞれの更新において入力ユニットのpをランダムに0にセットすることであり過学習を防ぐのを助ける
　model.add(Dense(200))
　model.add(Activation("relu"))
　model.add(Dropout(0.2))

　model.add(Dense(2))
　model.add(Activation(“softmax”)) #Softmaxは入力の最後の次元に適用
```
　　ReLU (Rectified Linear Unit)で活性化関数を追加
　　参考：http://www.procrasist.com/entry/

#③学習の実行

◯モデルをコンパイル
　　→モデルの最適化（勾配法）には、Adamを使用。（重み付けの手法）
　　　参考：http://qiita.com/tokkuman/items/1944c00415d129ca0ee9
　　→目的関数（ロス関数や最適スコア関数）は、categorical_crossentropy
　　　categorical_crossentropy: マルチクラスlogloss

◯学習の実行（fit）
　　→引数
　　　batch_size: 勾配更新毎のサンプル数を示す整数．
　　　nb_epoch: 学習データ配列の反復回数を示す整数．
　　　validation_split: バリデーションデータとして使われる学習データの割合。モデルはこの割合の学習データを区別しそれらでは学習を行わず，各試行の終わりにこのデータにおける損失とモデルメトリクスを評価
#④モデル予測と正解との比較　→正解率

◯テストデータ作成
　・トレーニングデータと同じ加工

◯モデル予測と正解との比較　→正解率
　・model.predict_classesで、クラスラベルを予想
　・クラスラベル（正解）は、ディレクトリ配置から取得
　・予想と正解の一致を集計
　
##まとめ

今回は殆どデモコードに沿って実行してみたに過ぎないが、Kerasでとてもコンパクトに画像分類が実装できることを実体験した。ただし今回、分類のための方法はかなり単純なものとなっているので、より複雑な分類を行うには前処理としてのデータ加工にパワーを掛ける必要がありそうに思った。
現在ターミナルで開いてるディレクトリをAtomエディタにAdd Project Folderする方法

# どうやるん？

```bash
$ atom -a .
```

ターミナルで開いてるディレクトリが、今開いてるAtomエディタに対して`Add Project Folder`されます٩( 'ω' )و

`atom -h`コマンドで他にもいろいろ便利なコマンドが見つかります。

# いつ必要になるん？

* 自分のプロジェクトで開発中、使ってるライブラリのプロジェクトのコードをいろいろ見たくなった
* 過去に自分が書いたプロジェクトのコードを参照したくなった

こういう時、`ghq`と`peco`を組み合わせた処理で所望のプロジェクトにパパっと移動して上記コマンドを実行することですぐAtom上で開けます。

逆に、「いっつもこのプロジェクトとの組み合わせで開きたい」という場合には、[project-manager](https://atom.io/packages/project-manager)パッケージをAtomに導入して使うと捗ります。

# 実演してみます

![atom_add.gif](https://qiita-image-store.s3.amazonaws.com/0/166225/3d48687e-85ce-dc63-a353-2dd1c72e1ec6.gif)

# 補足

## 使用環境

* Windows 10
* Atom
* bash
    * Git for Windows同梱の`C:\Program Files\Git\bin\bash.exe`を使用
    * ほんとはminttyが綺麗で好きだけど、winpty経由じゃないとpecoとの相性問題があるので素のbash

## bashの文字化け対策

以下の設定をしておけば、文字化け対策は十分です。

`~/.gitconfig`に以下を追加。

```bash
[core]
	quotepath = false
```

`~/.bashrc`に以下を追加

```bash
export LESSCHARSET=utf-8
```

以下の記事が分かりやすいです。

> * [git log、git diff、git showでの日本語の文字化けをまとめて対策](http://www-creators.com/archives/78#i-3)
* [Linuxでのgit logの文字化け](http://qiita.com/wakaba260/items/3bc12e369e6fda7c453a#%E8%A7%A3%E6%B1%BA%E7%AD%96less%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92utf-8%E3%81%AB%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B)

## ghqとpeco

私は、`~/.bashrc`に以下の設定をして使っています。

```bash
ghp() {
  DIR=$(ghq list -p | peco)
  [ -n "$DIR" ] && cd $DIR
}
bind '"\C-x\C-r":"ghp\n"'
```

`ghq`と`peco`を組み合わせたハックは以下の記事がとても詳しいです。

>* [ghqでリポジトリ管理とpeco連携で快適git生活](http://qiita.com/strsk/items/9151cef7e68f0746820d)
* [Windows のコマンドプロンプトを10倍便利にするコマンド「peco」](https://mattn.kaoriya.net/software/peco.htm)

特に後者のmattnさんの記事は、Windowsのコマンドプロンプト環境での実行方法に言及しておられる貴重な記事です。
【Android】Kotlinで選択されたRadioGroupのインデックスを取得する

## やり方

1. `checkedRadioButtonId`でチェックされているRadioButtonのID取得
1. 1のIDからRadioButton取得
1. `indexOfChild`の引数に2のRadioButtonを指定してインデックス取得

## サンプルコード

```kotlin
val radioGroup: RadioGroup = findViewById(R.id.radioGroup)
val id = radioGroup.checkedRadioButtonId
val radioButton = radioGroup.findViewById<RadioButton>(id)
val index = radioGroup.indexOfChild(radioButton)
```

## 参考

RadioGroup | Android Developers
https://developer.android.com/reference/android/widget/RadioGroup.html

java - How to get the selected index of a RadioGroup in Android - Stack Overflow
https://stackoverflow.com/questions/6440259/how-to-get-the-selected-index-of-a-radiogroup-in-android
実践Common lispの最初に載ってるサンプルコード

#QiitaとrubyとCommon lisp初心者です！！

rubyっぽい書き方したくて[Rubyソースコード完全解説](http://i.loveruby.net/ja/rhg/book/)読んでて疲れてきたので箸休めに[実践Common lisp 英語で書いてるweb版](http://gigamonkeys.com/book/)読んでてとりあえず最初の方のDB作成とイテレートのプログラムを写経してみた

動作環境が手元に無いので[dankogaiのevalできるサイト](https://eval.dan.co.jp/)で動かした

defunが関数定義
dolistはrubyの.each do

他は雰囲気で読めるけど、formatが分かりづらかったので[Common Lispのformat関数のディレクティブを俯瞰する。](http://yanqirenshi.hatenablog.com/entry/2016/09/10/Common_Lisp%E3%81%AEformat%E9%96%A2%E6%95%B0%E3%81%AE%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%82%92%E4%BF%AF%E7%9E%B0%E3%81%99%E3%82%8B%E3%80%82)
と[中級の書式文字列 ](http://www.chino-js.com/ja/tech/srfi/srfi-48/srfi-48.html)を参考にした

~{ ... ~} がイテレート、~aが変数の出力、~10tは10回空白を出力、~%は改行、って感じ


```lisp:
#!/usr/local/bin/sbcl --script


(defun make-cd (title artist rating ripped)
  (list :title title :artist artist :rating rating :ripped ripped))

(defvar *db* nil)
(defun add-record (cd) (push cd *db*))

(add-record (make-cd "Roses" "Kathy Mattea" 7 t))
(add-record (make-cd "Fly" "Dixie Chicks" 8 t))
(add-record (make-cd "Home" "Dixie Chicks" 9 t))

(defun dump-db ()
  (dolist (cd *db*)
    (format t "~{~a:~10t~a~%~}~%" cd)))

(dump-db)
```
【Android】Kotlinのデフォルト引数メソッドをJavaから呼ぶ

Kotlinのデフォルト引数があるメソッドをJavaから呼び出そうとするとエラーがでるのでその対処法です。

## 結論

`@JvmOverloads`アノテーションをつける

## サンプルコード

Kotlin側

```kotlin
class Foo {
    @JvmOverloads fun bar(str: String = "A"): String {
        return str
    }
}
```

Java側

```java
Foo foo = new Foo();
foo.bar(); // "A"
foo.bar("B"); // "B"
```

## `@JvmOverloads`アノテーションつけなかったときのエラー

```
java.lang.IllegalArgumentException: Parameter specified as non-null contains null
```

## 参考

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-jvm-overloads/index.html
VNC Serverを変更する

Rasberrypi3で利用している「Raspbian Jessie with PIXEL」に標準でインストールされているRealVNCがUltraVNC Viewerとうまく繋がらないのでtightvncに入れ替える
# realvncを削除
```
$ sudo apt-get purge realvnc-vnc-server
```
# tightvnc serverをインストール
```
$ sudo apt-get install tightvncserver
```
# vnc 接続時のパスワードを設定
```
$ vncserver :1

You will require a password to access your desktops.

Password:
Warning: password truncated to the length of 8.
Verify:
Would you like to enter a view-only password (y/n)? n

New 'X' desktop is raspberrypi:1

Creating default startup script /home/pi/.vnc/xstartup
Starting applications specified in /home/pi/.vnc/xstartup
Log file is /home/pi/.vnc/raspberrypi:1.log
$
```
terminalではできるのにitermだとできない！問題

## 状況
1. 新しく買ったPCでbrewをインストールした
2. iterm2をインストールした。
3. zshをインストールした
4. ログインシェルをzshにした
5. iterm2でbrewコマンドが使えない！ <= いまココ

## 原因
`/usr/local/bin` にパスが通っていないことが原因。
今回ダウンロードしたbrewコマンドは、`/usr/local/bin/brew`に保存されていたため、`/usr/local/bin`にパスが通っていないとbrewコマンドが使えなかった。
（「パスを通す」という事の意味が初めて理解できた気がする。@soarflatさん感謝です。）

## 解決方法
terminal側（brewがうまく使える側）で`echo $PATH`を実行。すると通っているPATHが確認できるので（僕の場合は「`/usr/bin:/bin:/usr/sbin:/sbin`」）、それをexportコマンドの引数にして`~/.zshrc`にコピペ(`export PATH="/usr/local/bin:/usr/local/sbin:$PATH"`)。そしてitermを再起動するとbrewコマンドが使える。順に書くと
1. `echo $PATH`
2. 1の結果を`~/.zshrc`にコピーしておく
3. .zshrcファイルを開く(`vim ~/.zshrc`)
4. 1の結果をexportコマンドの引数としてコピペ（`export PATH="/usr/local/bin:/usr/local/sbin:$PATH"`）
5. itermを再起動

## 参考
- zshにしたらbrewコマンドもvagrantコマンドも使えなくなった時の対処法
https://taccuma.com/brew-and-vagrant-command-not-found-in-zsh/

- PATHを通すとは？ (Mac OS X)
http://qiita.com/soarflat/items/09be6ab9cd91d366bf71
VMware MOBのプロパティやメソッドを取得するスクリプトを作ってみた

VMwareのWeb Serviceで自動化のコーディング(又は、vRealize Orchestrator使ったり)をする時は、Management Object(MOB)やProperty/Data Object/Methodを理解することが必要になってきます。
自動化をする時にドキュメントを読みながらData ObjectやMethodを探すのが面倒になったのでMOBのPropertyやMethodを表示できるツールを作ってみました。

# mob-property-view

[https://github.com/sky-joker/mob-property-view](https://github.com/sky-joker/mob-property-view)

インストール方法などは上記を参照ください。

# Management Object Types Overview(参考)

[http://pubs.vmware.com/vsphere-6-5/index.jsp#com.vmware.wssdk.apiref.doc/mo-types-landing.html](http://pubs.vmware.com/vsphere-6-5/index.jsp#com.vmware.wssdk.apiref.doc/mo-types-landing.html)

# 使用例

例えば、仮想マシンの設定変更をしたいと思いそれっぽいMethodを確認してみた時

```bash
$ ./mob-property-view.py -vc vcenter01.local --mob VirtualMachine -t devel -ml | grep -i config | grep Task
Password:
ReconfigVM_Task
```

[ReconfigVM_Task](https://vdc-download.vmware.com/vmwb-repository/dcr-public/6b586ed2-655c-49d9-9029-bc416323cb22/fa0b429a-a695-4c11-b7d2-2cbc284049dc/doc/vim.VirtualMachine.html#reconfigure)が設定変更するMethodということが確認できました :-)

メモリサイズを変更するストーリーを考えてみます。
設定変更をするにはspecを作らないといけないので、`ReconfigVM_Task` に渡すData Objectである[vim.vm.ConfigSpec](https://vdc-download.vmware.com/vmwb-repository/dcr-public/6b586ed2-655c-49d9-9029-bc416323cb22/fa0b429a-a695-4c11-b7d2-2cbc284049dc/doc/vim.vm.ConfigSpec.html)にある `memoryMB` を確認してみます。

```
$ ./mob-property-view.py -vc vcenter01.local --mob VirtualMachine -t centos --property config
Password:
---------
| devel |
---------
----------
| config |
----------
(vim.vm.ConfigInfo) {
   dynamicType = <unset>,
   dynamicProperty = (vmodl.DynamicProperty) [],
   changeVersion = '2017-08-05T17:13:42.60412Z',
   modified = 1970-01-01T00:00:00Z,
   name = 'devel',
(snip)
hardware = (vim.vm.VirtualHardware) {
   dynamicType = <unset>,
   dynamicProperty = (vmodl.DynamicProperty) [],
   numCPU = 1,
   numCoresPerSocket = 1,
   memoryMB = 2048,
```

現在は `2048` ということが分かりました。
メモリの割り当てを変更する場合は以下の様な感じになります。

```python
vmConfigSpec = vim.vm.ConfigSpec()
vmConfigSpec.memoryMB = 4096
VirtualMachineMOB.ReconfigVM_Task(vmConfigSpec)
```

値を変更した時に問題なく変更されているか確認してみます。

```
$ ./mob-property-view.py -vc vcenter01.local --mob VirtualMachine -t centos --property config | grep memoryMB
Password:
      memoryMB = 4096,
```

このスクリプトの目的は、簡単に「あたり」をつけられればと思って作ったものです。
正直、ドキュメントを読むよりは実機で設定を変更してProperty情報を取ってきて、どのData Objectに格納されているか？を確認した方が早いと思った(それまでは、確認用スクリプトを毎回作ってた)ので :-)
（正直、vROでMOBの中身を確認するのもしんどい...）
その後に、ドキュメントと付き合わせて間違いない事を確認しながら自動化していくのが個人的にやりやすいと思っています。
Makefileの小さなメモ


## コード

```
# cat /tmp/Makefile
all:
        echo Hello!
        @echo Hello!!!

        @echo $(PWD)
```

# 実行

```
# make
echo Hello!
Hello!
Hello!!!
/tmp
```

# 参考

- 自動化のためのGNU Make入門講座 - makeを使ってみよう http://objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/gnu-make/getting-started.html
Intel MAX10キットでFPGAの勉強を始める～組み立て編～

この記事は、[「クラウド時代のシステム管理」](http://www.takanyan.net/fpga-max10-assemble-1/)の記事を転記したものです。


最近、CPUとは違うデバイスを用いた大規模計算が行われています。その中でFPGAはロジックをソフトウェアで書き換え可能であり、かつ1回の計算にかかる時間が短い（Latencyが低い）ので、高速な応答を必要とする用途で注目されています。そこで、巷に売られている書籍と実験キットを使ってFPGAの勉強を始めることにしました。

<!--more-->

## 1. Intel MAX10実験キットと電子工作キット（はんだこて等）の準備

まずは学習のための書籍と実際に触ってみるための実験キットを調達します。幸い、必要な電子部品がすべてセットになった「<a href="http://amzn.to/2uLfOO8" target="_blank">完全版 FPGA電子工作オールインワン・キット (トライアルシリーズ)</a>」が販売されているので、今回はこちらを利用します。電子部品の組み立てにははんだこて、はんだ、その他はんだ工作に必要な物品を用意します。数千円程度で通販で購入できました。

こちらが書籍の写真。電子部品とセットになった箱の中に、説明書としてこの本が入っています。

<a href="http://www.takanyan.net/wp-content/uploads/2017/07/max10_kit_book.jpg"><img src="http://www.takanyan.net/wp-content/uploads/2017/07/max10_kit_book.jpg" alt="FPGA_Max10_Kit_book" class="aligncenter size-full wp-image-369" /></a>

## 2. MAX10-FB基板とMAX10-JB基板の組み立て

書籍は600ページくらいあり、どこに組み立て手順が書いてあるかわかりにくいです。理論、回路の詳細説明も大切ですが、触ってみないとわからないので理論の説明はスキップ！65ページからMAX10 FPGA搭載のMAX10-FB基板の組み立て手順が書かれています。指示に従って7個ほどの部品をはんだ付けすると次の写真のようになります。

<a href="http://www.takanyan.net/wp-content/uploads/2017/07/altera_max10.jpg"><img src="http://www.takanyan.net/wp-content/uploads/2017/07/altera_max10.jpg" alt="altera_max10" class="aligncenter size-full wp-image-367" /></a>

久々のはんだ付けなので手が慣れておらず、ここまでに1時間くらいかかってしまいました。


次に、FPGAへUSBから電源供給したり、FPGAの設定・デバッグを行うMAX10-JB基板を組み立てます。手順は80ページから記載されています。基板には当初1つも電子部品がついていない状態からたくさんの部品をつけるので、組み立てには1.5時間くらいかかりました。すべてつけ終わると次の写真のようになります。

<a href="http://www.takanyan.net/wp-content/uploads/2017/07/max10-jb.jpg"><img src="http://www.takanyan.net/wp-content/uploads/2017/07/max10-jb.jpg" alt="Max10-JB board" class="aligncenter size-full wp-image-370" /></a>

## 3. MAX10-JB上のPICマイコンへの初期設定の投入

MAX10-FB基板の上にMAX10-JB基板を接続します。次にMAX10-JB基板上のMini-USBコネクタにUSBケーブルを接続して電源を供給します。82ページに書かれている動作確認に問題がなければ、MAX10-JB基板上のJ1～J4ジャンパを閉じて再びUSBから電源を投入します。ここでPICマイコンへのプログラム書き込みがうまくいけばMAX10-FB基板上のLEDが緑色に光ります。

<a href="http://www.takanyan.net/wp-content/uploads/2017/07/PIC_Write_LED.jpg"><img src="http://www.takanyan.net/wp-content/uploads/2017/07/PIC_Write_LED.jpg" alt="PIC_Write_LED" class="aligncenter size-full wp-image-372" /></a>

ここで2つハマるポイントがあります。

### 3-1. そもそも家にMini-USBケーブルがない

本にもどこにも書いていませんでしたが、USB-MiniUSBのケーブルが必要になります。私の場合はたまたまデジカメなどで使っていたMiniUSB端子を持つケーブルがあったので、特に問題ありませんでした。

### 3-2. PICマイコンが正常に書き換えられず、LEDが緑色にならない

こちらは本当にハマりました。諦めかけたころにこのブログを書くため検索をしていたら、偶然同じ場所でハマっている記事「<a href="http://nahitafu.cocolog-nifty.com/nahitafu/2016/05/max10-70b8.html" target="_blank">MAX10の付録本を買ったが動かなかった</a>」を見つけました。この記事を見るまで、USBはKindle Fireの充電用USBアダプタにさしていたのですが、これをiPhoneの純正アダプタに変更しました。すると一発で正常に動きました。
そして、本をよく読むと、MAX10-JB基板についての説明の一番はじめである69ページにiPhone純正アダプタで動いた旨が書いてありました。


ここまでで電子部品としての組み立てはいったん完了です。次はFPGA開発環境のセットアップをしていく予定です。
Thinkpad X1 Carbon 2017(5th Generation, 20HR)初期設定メモ

# はじめに
2012年に発表と同時に購入したMacBook Pro Retina Display Modelがいよいよ調子悪くなってきたので、
思い切ってX1 Carbon 2017に乗り換えてみました。
自分のパソコン史上、初のThinkpadです。

# やること
- 初期状態のバックアップ
- SSD換装(128GB SATA → 1TB NVMe)
- Windows10 Pro クリーンインストール
- もろもろ初期設定

# 初期状態のバックアップ
- リカバリメディア作成ツール的なものは最近のモデルには無いようなので、Windows10標準の「回復ディスク」を作成します。
- USBメモリは16GBのものを用意。

# SSD換装
- 裏蓋を取り外します。 Macと違って、簡単に取り外せるのがいいですね。
- 標準の128GB SSDを取り外し。
- あらかじめ購入しておいてたPlextor M8PeGN 1TBモデルに換装
- が、ここでちょっと問題が･･･
- 空間が片面実装を前提とした作りになっていて、M8PeGNは両面実装のため、メインの基板に干渉してしまう･･･
- 裏面のチップが基板い干渉してしまう＆固定すると若干反ってしまう
- 想定外でした･･･orz
- いったん様子見ということで、そのまま取り付けて裏蓋を取り付け

# Windows10 クリーンインストール
- BIOSの設定を確認し、Intel VTを有効に
- MSのサイトよりダウンロードしたWindows10 1703(Creators Update)にてインストール開始
- もともとWindows10 Homeプリインストール機種なので、自動的にHomeでアクティベーションされてた
- 1703のメディアを使うと、Intel Wirelessアダプタ AC8265は最初から認識してくれるので楽ちん。
- BitLockerでドライブ全体の暗号化を有効化
- ストアより「Lenovoアカウント・ポータル」「Lenovo Companion」「Lenovo Settings」をインストール
- Lenovo Companionを起動すると、ドライバセットをダウンロードする用案内されるので、それを落としてインストール
- 全デバイスが自動的に認識される
- Lenovo Companionの更新確認で、追加のアップデートを実施
- あらかじめ購入しておいたWindows10 Proのキーを登録し、Home→Proへ更新
- グループポリシーエディタにて「Windows Updateの手動実施」の設定を実施
- Windows Update実施

# もろもろ初期設定
- フォント関連(MacType, Noto Sans CJK)
- Chrome Font Rendering Enhancer

# 現在の状況
- 原因未解明だけど、Windows再起動をするとLenovoロゴ画面から先に進まない(Windowsのくるくる回るアイコンが出てこない)事象が多発。もう一回Windowsインストールしなおすかな･･･
- CrystalDiskInfoにてSSDの温度を確認。45度程度なので一安心か??
WordPressの記事をWP APIから取得してElasticsearchに突っ込むサンプル


途中でめんどくさくなったので、コードだけ。

## package.json

```
{
  "name": "wpapi-elastic",
  "version": "1.0.0",
  "description": "",
  "main": "handler.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "local": "./node_modules/serverless/bin/serverless invoke local -f hello",
  },
  "keywords": [],
  "author": "",
  "license": "MIT",
  "dependencies": {
    "lodash": "^4.17.4",
    "striptags": "^3.0.1",
    "superagent": "^3.5.2",
    "wpapi": "^1.1.2"
  },
  "devDependencies": {
    "serverless": "^1.19.0"
  }
}
```

## serverless.yml

```
service: oreyome-elastic

provider:
  name: aws
  runtime: nodejs6.10

functions:
  hello:
    handler: handler.hello
```

## handler.js

configの値を適当に変えて使ってください。

```
'use strict';
const _ = require('lodash');
const WPAPI = require('wpapi');
const striptags = require('striptags');
const request = require('superagent');
const config = {
  site: 'example-com',
  url: 'https://example.com/',
  esUrl: 'https://example.us-east-1.es.amazonaws.com',
};

function put(url, body = {}) {
  return new Promise((resolve, reject) => {
    return request.put(url)
      .send(body)
      .end((err, response) => {
        if (err) {
          console.log(err);
          reject(err);
        } else if (response.status > 299) {
          reject(response);
        } else {
          resolve(response);
        }
      });
  });
}

function doPost(post) {
  const url = `${config.esUrl}/${config.site}/${post.type}/${post.id}`;
  return put(url, post);
}

module.exports.hello = (event, context, callback) => {
  const apiPromise = WPAPI.discover(config.url);
  apiPromise.then(function( site ) {
    return site.posts().perPage( 100 )
  }).then(function( posts ) {
    const parsed = _.map(posts, function (value, key) {
      const content = value.content.rendered.split('<!-- Begin Yuzo -->');
      value.content.rendered = content[0];
      const data = {
        title: striptags(value.title.rendered),
        content: striptags(content[0]),
        id: value.id,
        date: value.date,
        type: value.type
      }
      return data;
    });
    return parsed;
  }).then(function(posts) {
    return Promise.all(posts.map(doPost))
  }).then(function(json) {
    callback(null, json);
  }).catch ((err) => {
    callback(err);
  });
};

```

## やるつもりだったこと
- WordPressのコンテンツの分析 -> kibanaでのビジュアライズ方法がよくわからなかった
- Serverless Frameworkでのバッチインポート -> kibanaでめげたから後回し
- config系をserverless.ymlにうつす -> kibanaでめげたから後回し
Bluemix IaaS (旧SoftLayer) の仮想マシンを Migrate Host してみた


# Migrate Host とは

以下のようなメンテナンス通知が出されている方が対象です。
詳細はリンク先をご参照ください。
>
IBMでは、クラウドをより安定してお客様にご利用いただけるように、当初移行先として導入していたVersion7.0に加え、Version7.1を導入いたしました。
今回の移行は、初期に導入されたVersion 7.0のハイパーバイザーを利用している仮想サーバーを、Version 7.1のハイパーバイザーに移動するためのものです。
移行対象の環境であれば「Migrate Host」ボタンを使うことで、任意のタイミングで移行することができます。
「Migrate Host」ボタンが表示されている期間は、「Migrate Host」ボタンの押下、または、ポータルからの再起動によって自動的に移行が始まります。
<a href="https://www.ibm.com/blogs/solutions/jp-ja/hypervisor_migration/" >Bluemix Infrastructure ハイパーバイザー移行のお知らせ</a>


本記事の場合、2017年8月2日に通知され、3週間後の2017年8月22日の強制メンテナンス前に自らのメンテナンスウインドウで移行してみます。


#事前確認
以下の記事に基づいて確認します。
<a href="http://qiita.com/testnin2/items/95f5996663807a93e79f" >XenServerのバージョンをGuest OSから判別する方法 - Qiita</a>

以下の情報からXenServer 7.0で動いていることがわかります。
![migrate_host_02.png](https://qiita-image-store.s3.amazonaws.com/0/101361/2a9134ba-c477-484a-5ef6-d2ebb51a31d9.png "migrate_host_02.png")

また、Windowsのため、このタイミングでWindows Updateによる更新も反映させたかったので、事前に1度再起動によりOS更新を適用しました。

#Migrate Host してみた
移行対象の仮想サーバーのデバイス詳細のアクションリストから「Migrate Host」を選択します。
![migrate_host_01.png](https://qiita-image-store.s3.amazonaws.com/0/101361/ec52b8d3-e601-4b80-6876-3d221e22b26d.png "migrate_host_01.png")

再起動が入る旨の注意が出ますので、確定します。
![migrate_host_04.png](https://qiita-image-store.s3.amazonaws.com/0/101361/bfbb165f-cd63-f13f-0846-67343ba0731b.png "migrate_host_04.png")

「Success」と出れば、移行が開始されます。
![migrate_host_05.png](https://qiita-image-store.s3.amazonaws.com/0/101361/dbad8f41-ecd1-0fdc-0545-021de8224fa9.png "migrate_host_05.png")


以下は移行の間、宛先アドレスにpingを打っていたログです。

```
64 bytes from 10.132.xx.yy: icmp_seq=989 ttl=124 time=25.480 ms
64 bytes from 10.132.xx.yy: icmp_seq=990 ttl=124 time=19.864 ms
64 bytes from 10.132.xx.yy: icmp_seq=991 ttl=124 time=14.720 ms
Request timeout for icmp_seq 992
Request timeout for icmp_seq 993
Request timeout for icmp_seq 994
...
...
...
Request timeout for icmp_seq 2225
64 bytes from 10.132.xx.yy: icmp_seq=2226 ttl=124 time=22.514 ms
64 bytes from 10.132.xx.yy: icmp_seq=2227 ttl=124 time=25.262 ms
64 bytes from 10.132.xx.yy: icmp_seq=2228 ttl=124 time=27.642 ms
```

ダウンタイムは 約1230秒 = 約20分 ほどでした。

#事後確認
以下の情報からXenServer 7.1で動いている（問題なく移行が完了している）ことがわかります。
![migrate_host_06.png](https://qiita-image-store.s3.amazonaws.com/0/101361/c5219703-9a7f-a0d6-a5d0-0cdadc69af3f.png "migrate_host_06.png")
gem 'httpclient' を使用して外部API呼び出し

# 準備

## gem インストール

```
gem install httpclient
```

# 使い方

### 1.requireする

```diff:sample.rb
+ require 'httpclient'
+ require 'json'
```

### 2.urlとパラメータを指定

```diff:sample.rb
require 'httpclient'
require 'json'

+ uri = "http://XXXXXX/XXXXX"
+ params = {
+   paramsA: "XXXX",
+   paramsB: "XXXX"
+ }
```

### 3.リクエスト実行

```diff:sample.rb
require 'httpclient'
require 'json'

uri = "http://XXXXXX/XXXXX"
params = {
  paramsA: "XXXX",
  paramsB: "XXXX"
}

+ client = HTTPClient.new
+
+ request =  client.get(uri,params)
```

### 4.レスポンスをjsonでパース

```diff:sample.rb
require 'httpclient'
require 'json'

uri = "http://XXXXXX/XXXXX"
params = {
  paramsA: "XXXX",
  paramsB: "XXXX"
}

client = HTTPClient.new

request =  client.get(uri,params)
+ response = JSON.parse(request.body)
```

## proxyを使用する場合

```diff:sample.rb
require 'httpclient'
require 'json'

uri = "http://XXXXXX/XXXXX"
params = {
  paramsA: "XXXX",
  paramsB: "XXXX"
}
+ proxy = "http://proxy.XXX.co.jp:8080"

- client = HTTPClient.new
+ client = HTTPClient.new(proxy)

request =  client.get(uri,params)
response = JSON.parse(request.body)

```

#ドキュメント

http://www.rubydoc.info/gems/httpclient/HTTPClient
BATメモ　ファイルコピー

# 概要
指定したフォルダを一か所にかき集めるBATサンプル

# BATファイル

```Bat
REM コピー元の基準パス
SET FROM_BASE_PATH=C:\Work\Projects

REM コピー対象フォルダ名
SET TGT1=Proj1
SET TGT2=Proj_B

REM コピー先パス
SET TO_PATH=D:\Tmp

REM 前回コピーしたものを削除
rd /s /q "%TO_PATH%\%TGT1%"
rd /s /q "%TO_PATH%\%TGT2%"

REM コピー実行（オプションの/Eは空ディレクトリもコピー、/XDは除外フォルダ）
robocopy "%FROM_BASE_PATH%\%TGT1%" "%TO_PATH%\%TGT1%" /E /XD "packages" /XD "bin" /XD "obj" /XD "TestResults"
robocopy "%FROM_BASE_PATH%\%TGT2%" "%TO_PATH%\%TGT2%" /E /XD "packages" /XD "bin" /XD "obj" /XD "TestResults"

pause
```