OmniAICreator/Qiita-1.07M huggingface dataset:
null安全な言語でも、バグ検知を怠れば安心ではない

null安全な言語のSwift, Kotlinを使えば、

リプレイス前より、安全安心になります！

(￣ー￣) ﾄﾞﾔｯ!

---

# 本当に？

---

前提条件

仕様がアプリによって違うため
ここでは、文字列fooがnilまたはnullだった場合、
バグである仕様と仮定にします。
主語は、Swift, Kotlinの場合です。
以下は、僕の個人的見解です。

---

Objective-C時代
nilにメッセージを送っても落ちないが
バグを検知できない

```objc
NSString *foo = nil;
NSLog(@"%lu", (unsigned long)[foo length]); // 0
// nilに対するメッセージ送信結果はnil（数値を返す場合には0）が返却される
// クラッシュしないが、バグが起きたことは検知できない
```

---

Java時代

```java
String string = null;
System.out.println(string.isEmpty()); 
// コンパイル時チェックできない、
// 実行時にjava.lang.NullPointerException
// コンパイル時にはチェックできなくて、実行時にクラッシュ
// Javaの@Nullableアノテーションが徹底されていないと、
// JaString型でnullが返ってくることがある
```

---

Swift リプレイス悪い例1
Implicitly Unwrapped Optionalはnilが代入できるのに、入らない前提で使ってしまう

```swift
var foo: String! = "aaaaaa"
foo = nil
print(foo.isEmpty)
// コンパイル時にはチェックできなくて、実行時にクラッシュ
// Optional型だから、nilを代入できるので
// 決してnilが入らないことを保証するString型として使ってはならない
```

---

Kotlin リプレイス悪い例1
Javaから受け取った[Platform type](http://qiita.com/RyotaMurohoshi/items/5fcc10d04fecd7304556)をnullが入らない前提で使ってしまう

```kotlin
var foo = getJavaString() 
// String!型でnullが入っていた場合、
print(foo.isEmpty())
// コンパイル時にはチェックできず、実行時にnullポクラッシュ
```
---

Swift リプレイス悪い例2
Optionalチェーンで、バグを握り潰し検知をしない
Objective-Cと品質が変わっていないので意味ない

```swift
var foo: String? = nil
print(foo?.isEmpty) // nil 
print(foo?.isEmpty == false) // false 
// クラッシュしないがバグが起きたことを検知できない
```

---

Optinal Chain(?)でクラッシュしなくなるけど、

落ちないだけで、

バグが起きたこと検知してないと

バグの発見が遅れ、被害が大きくなる

---

Swift リプレイス悪い例2

```swift
var foo: String? = nil
        
if let foo = foo, !foo.isEmpty {
  print(foo)
} else {
  print("foo is nil or foo is empty")
// printはローカル端末しか出ないので、
// 本番でサーバーに送らないと、バグ検知できない
}
```

---

Swift リプレイス悪い例3

```swift
var foo: String? = nil
        
if let foo = foo, !foo.isEmpty {
  print(foo)
} else {
  fatalError("foo is nil or foo is empty")
// エラー検知できるが、本番でアプリが強制終了してしまう
}
```

---

#全然安心じゃないじゃないか

---

Swift リプレイス 個人的改善案
Optionalをアンラップした場合やelseの場合で、バグが起きるケースでは、
本番時サーバーにバグを報告する
強制アンラップ(!)は使わない。

---

```swift
var foo: String? = nil   
if let foo = foo, !foo.isEmpty {
  print(foo)
} else {
// FIXME: メソッド外だし ファイル名 行数出力
#ifdef DEBUG  // FIXME: 関数に外だします
  fatalError("foo is nil or foo is empty") // 開発時
#else
  // FIXME: 本番はユーザーに適切なエラーメッセージを表示して、
  // サーバーにバグを報告する
  errorReport("foo is nil or foo is empty") 
#endif
}
```

---

Kotlin リプレイス 個人的改善案
Javaから受け取ったPlatform typeはOptional型にしてアンラップする
Optionalをアンラップする場合や、elseの場合で
バグがある場合は、サーバーにバグを報告
強制アンラップ(!!)は使わない。
ネストが深くなるなら、Swiftのguard式,if letを移植しましょう！

---

```kotlin
var foo: String? = getJavaString() 
foo?.let { foo ->
  println(foo.isEmtpy())
} ?: run { 
// FIXME: メソッド外だし ファイル名 行数出力 
  if (BuildConfig.DEBUG) {
    throw(Exception("foo is null")) // FIXME: 適切なExceptionにしてください
  } else {
    // FIXME: 本番はユーザーに適切なエラーメッセージを表示して、
    // サーバーにバグを報告する
    errorReport("foo is null") 
  }
}
```

---

メリット: 開発時は、fatalErrorで、すぐにバグを検知できる。
本番時は、クラッシュしないので、ユーザーに適切なエラーメッセージを伝えられて、
ロールバックもできるし、サーバーにバグを報告するので、すぐにバグを検知して直せる。
バグ検知のために、ファイル名や行数も一緒に送る

---

デメリット: 面倒?

バグ検知するコードを書く面倒より、
バグ検知するコードがなくて、
バグ検知が遅れて、被害が広がったり、
手探りでバグを見つける方がもっと面倒なので、
nil,nullに関わらず、バグが起きるときは、
バグ検知するコードを安心のために書きましょう！
input type="file"をオリジナルのデザインに変更

#今回やること
input type="file"はcssが反映されないため、直接スタイルの変更ができない。。

ださいデフォルトのデザインをカスタマイズして、今回は ↓ のようなデザインを実装してみたいと思います。

**未選択時**
![image](https://qiita-image-store.s3.amazonaws.com/0/130491/d31dae24-3139-4be1-f455-5041e476add8.png)
**選択後**
![image](https://qiita-image-store.s3.amazonaws.com/0/130491/8bccbcb6-41ac-bfaf-6a9b-beaacb5bc6cd.png)

##html・css
html は input要素のtype="file"を非表示で設置し、その代わりとしてオリジナルボタンを設置。

```html
<div id="js-selectFile">
<!-- 非表示にするボタン -->
<input id="js-upload" type="file" style="display:none">
<!-- オリジナルボタン -->
<button class="original_btn">ファイルを選択</button>
<!-- アイコン -->
<span class="icon">未選択</span>
</div>
```
```css
/* オリジナルボタン */
.original_btn {
    border: 1px solid #ddd;
    padding: 10px;
    cursor: pointer;
    border-radius: 5px;
    color: #666;
    background: linear-gradient(to bottom,#fff 0,#f4f4f4 100%);
    box-shadow: inset 0px -1px 0px 0px rgba(0, 0, 0, 0.09);
}
/* 未選択時のアイコン */
.icon {
    font-size: 12px;
    margin: 0 10px 0 15px;
    padding: 3px 30px;
    border-radius: 15px;
    background: #666;
    color: #fff;
    display: inline-block;
}
/* 選択時のアイコン */
.icon.select {
    background: #ff5050;
    color: #fff;
}
/* ファイル名 */
.filename {
    display: inline-block;
    font-size: 12px;
}
```
##js ( jQuery )
オリジナルボタンの click イベントを発火させ、ファイル選択フォームを開くようにする。

ファイル選択後はファイル情報を変数に格納し、アイコンのデザイン変更とファイル名表示の処理を行う。

```js
$('#js-selectFile').on('click', 'button', function () {
    $('#js-upload').click();
    return false;
});

$('#js-upload').on('change', function() {
    //選択したファイル情報を取得し変数に格納
    var file = $(this).prop('files')[0];
    //アイコンを選択中に変更
    $('#js-selectFile').find('.icon').addClass('select').html('選択中');
    //未選択→選択の場合（.filenameが存在しない場合）はファイル名表示用の<div>タグを追加
    if(!($('.filename').length)){
        $('#js-selectFile').append('<div class="filename"></div>');
    };
    //ファイル名を表示
    $('.filename').html('ファイル名：' + file.name);
});
```
ファイル情報を変数に格納しているので、ファイルサイズ（file.size）やファイルタイプ（file.type）も出力が可能のようです。

古いIEでは動かないかも。。。
モダンブラウザ用で参考にしてみてくださいー！

##参考記事
[jQueryのprop()でプロパティの設定･取得](http://www.flatflag.nir87.com/prop-1812)
C++ Builder XE4, 10.2 Tokyo > BoolToStr(True) > -1を返す / BoolToStr(False) > 0を返す

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String msg19 = BoolToStr(True);
	OutputDebugString(msg19.c_str());

	String msg22 = BoolToStr(False);
	OutputDebugString(msg22.c_str());

}
//---------------------------------------------------------------------------
```

```txt:結果
デバッグ出力: -1 プロセス Project1.exe (3568)
デバッグ出力: 0 プロセス Project1.exe (3568)
```

Trueを-1としている処理系があったと思ったが、C++ Builder (Delphi)でのことだった。
CentOS 6 で yum-cron でセキュリティアップデートして、通知メールを送信する

# ０．はじめに

CentOS 6 を運用していて、セキュリティアップデートを手作業で行っていたんですが、大分面倒だな…。と思う様になり、自動でセキュリティアップデートして、通知メールが届く様にしたいなぁと思い、色々調べてやってみました。

ただ、ほとんどこちらのサイトの手順通りになりました。

* [CentOS6 でセキュリティに関するパッケージの更新のみ行う パソコン鳥のブログ/ウェブリブログ](http://vogel.at.webry.info/201402/article_4.html)

本当に、ありがとうございました。
心から感謝です。

# １．yum-plugin-security のインストールとリポジトリの設定

参考サイトの「インストール・設定」の手順を実施します。

# ２．リポジトリの更新バッチの作成と cron への登録

参考サイトの「セキュリティアップデートの仕方」の手順を基に、以下のスクリプトを作成します。

* /etc/cron.daily/0yum-security-update.cron

```bash:0yum-security-update.cron
#!/bin/bash

wget -q -N -P/security http://cefs.steve-meier.de/errata.latest.xml
python /security/generate_updateinfo.py /security/errata.latest.xml
/usr/bin/modifyrepo /security/updateinfo-6/updateinfo.xml /security/repodata
```

実行権限を付加するのを忘れずに。

# ３．yum-cron の結果を通知メールとして送信設定

以下のファイルを修正します。

* /etc/sysconfig/yum-cron

```
[root@www ~]# diff /etc/sysconfig/yum-cron.ORG /etc/sysconfig/yum-cron
5c5
< YUM_PARAMETER=
---
> YUM_PARAMETER="--security --nogpgcheck"
26c26
< # DEBUG_LEVEL=1
---
> DEBUG_LEVEL=1
38c38
< MAILTO= 
---
> MAILTO="-S smtp=smtp://[SMTPホスト]:587 -S smtp-auth-user=[SMTPユーザーID] -S smtp-auth-password=[PASSWORD] -S from=[送信元メールアドレス] [送信先メールアドレス]"
```

# ９９．ハマりポイント

* 最初、リポジトリの更新バッチを作成せずにいたら、全然自動アップデートが走らなくて「アレッ」と思い、よくよく読んでみると毎回実行しなくちゃいけないことを見逃していました…。
<br>　
* で、その後うまく更新は実行されるものの、全くメールが送信されず…。/etc/cron.daily/0yum.cron を見てみると、/etc/sysconfig/yum-cron の　DEBUG_LEVEL を 1 以上に設定しないと、送信メッセージが出力されないことがわかり、DEBUG_LEVEL を 1 に変更。
<br>　
* 587 で外部ホスト経由でメールを送信する様にしたかったので、/etc/cron.daily/0yum.cron を直接修正し、送信され始めたものの…、yum-cron 自体の更新処理が走り、修正がなかったことに…。「そりゃそうだ。」と思いながら、/etc/sysconfig/yum-cron の MAILTO に長々とした文字列を設定することになりました。
<br>　
* 本当は、毎日メールを送信する様にしたくて、/etc/sysconfig/yum-cron の　DEBUG_LEVEL を 2 に設定していたんですが、あまりにメールの本文がウザかったので 1 に設定し直しました。

# ＸＸ．まとめ

Amazon Linux でも同じ様に、yum-cron の設定をしていますが、ちょっと違いがあって戸惑いました。

忘れない様にメモ。
mongodbでfindで深い階層のフィールドを指定して取得する

# 深い階層のフィールドを指定する場合
次のような構造のデータがあるとする。

```text:hogehoge.json
{
"id":"1"
"name":"xxx"
"address":{
    "pref":"abc"
    "city":"def"
    "after":"ghi"
},
{
"id":"2"
"name":"yyy"
"address":{
    "pref":"jkl"
    "city":"mno"
    "after":"pqr"
}
```

addressの下のafterで検索したい場合は次ようになる。

```
db.hogehoge.find({"address.after": "pqr"});
```

## 参考URL
http://nisihunabasi.mods.jp/blog/?p=683
https://ja.wikipedia.org/wiki/MongoDB#.E3.83.8D.E3.82.B9.E3.83.88.E3.81.95.E3.82.8C.E3.81.9F.E3.83.95.E3.82.A3.E3.83.BC.E3.83.AB.E3.83.89.E3.81.AE.E3.82.AF.E3.82.A8.E3.83.AA
slack bot を作ってみた参考類

# slack bot 作成ベースの参考記事
## Hubot を使う
http://qiita.com/mochidamochiko/items/29c2d77715d8a1ff062a


### よく使うコマンド

```
// 起動
./bin/hubot --adapter slack

```


# 定時時間に発言させる
## cron 機能
http://qiita.com/mats116/items/0164b37ffaa90f03f2a0

## IBM Bluemix
https://bita.jp/dml/slack_botkit
http://qiita.com/Amebayashi/items/ca979ec6f925abc7713f

## AWS Lamdba
http://qiita.com/mumoshu/items/8752047a0d0265dada47

## hiroku
http://qiita.com/acairojuni/items/dc4543aa5827d4c3211c
- 使い方
http://qiita.com/Arashi/items/b2f2e01259238235e187
プロセス
http://qiita.com/zucay/items/3b52b0fbc8b6c963c7e0

```
web: npm install
web: bin/hubot -a campfire
web: bin/hubot --adapter slack

```
モジュールがないって言われたので、npm installを追加



```
// あとurlの設定
$ heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=[your bot app url]
//URL は、以下のコマンドの結果の web_url に書かれているものを指定
$ heroku apps:info
```

起動時間の設定

```
$ heroku config:set HUBOT_HEROKU_WAKEUP_TIME=8:00
$ heroku config:set HUBOT_HEROKU_SLEEP_TIME=24:00
$ heroku config:set TZ='Asia/Tokyo'
$ heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s | grep web-url | cut -d= -f2)
```

http://qiita.com/him0net/items/9e80dd53e1a9a4c33dd7
http://blog.spacemarket.com/code/hubot-on-heroku-free-dyno/

# 参考にしたいネタとか動かし方とか
- 家庭用 bot
http://blog.8arrow.org/entry/2016/01/13/183349
- 人工知能
http://www.e-agency.co.jp/column/slackbot_ai.html#i-4

## 追加してみた
```
npm install hubot-slack-stamp
```
## 使うコマンド
```
// ローカルで起動
./bin/hubot --adapter slack
// ps 一時停止、再開
$ heroku ps:scale web=0
$ heroku ps:scale web=1
```
NetBeans初期設定について

#NetBeans初期設定について

##はじめに
NetBeansスゴイ！NetBeansステキ！
無料でここまで充実してて現在も開発が続いているということであれば、しばらくメインで使ってもいいかも。
将来的にIntelliJを入れたいのだけど。

・・・でも、フォントが~~うんこ~~あまり見やすいものではなかったり、配色の問題があったりと色々。
というわけで初期設定。

##プラグイン
基本的には[こちら](http://qiita.com/r-kawanishi/items/12c50f859de72947d13d)を参考に。
全体の色を変えるために、**dark look and feel**をインストール。

インストール後、再起動して
*オプション → 外観 → ルック・アンド・フィール*
と進み、*優先ルック・アンド・フィール*から気に入ったデザインを選択する。
![ICOPY001.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/6bfdf2cb-05b7-10a8-f5df-6aff2c50800e.jpeg)
個人的には**Dark Nimbus**あたりが好み。選択後、NetBeans再起動が走る。

##デザイン
続いて [NetBeans Themes: Color Schemes of the NetBeans IDE](http://netbeansthemes.com/) からエディタのテーマを取得。
個人的にSublimeあたりのデザインが好きなのでインストール。
エディタの色は重要です。少なくとも、デフォルトの白背景は発狂しそうになるので暗い色に変更する。

ここに色々なカラースキームが上げられている。
zip をダウンロードしたら、以下の手順で NetBeans に適用する。

###デザインの適用方法
*ツール → オプション → フォントと色 → インポート* をクリック。
![ICOPY005.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/29781949-63d8-684f-0957-8726bfdf2ecd.jpeg)

ダウンロードしていた zip ファイルを選択。
![ICOPY006.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/f968a481-4852-c3df-5cb3-73b6d63d44e5.jpeg)
*使用可能なオプション* で *すべて* にチェックを入れて *OK* をクリック
NetBeansを再起動したら、カラーテーマが適用される。

##設定
スペース、行末以降のスペースが表示されないのはいただけないのでこれも設定を変える。
###スペースの表示
![ICOPY000.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/77597621-4e4d-126e-1b6a-e9cf6f9f53ad.jpeg)
*表示 → 表示不可能な文字を表示*にチェックを入れる。

###末尾スペースのハイライト
![ICOPY005.JPG](https://qiita-image-store.s3.amazonaws.com/0/165355/bf7e35c3-16e3-0602-d879-84e76c7e2469.jpeg)
*オプション → フォントと色 → 強調表示*から**末尾の空白**を選択し、前景や効果あたりをいい感じに設定する。

次はNetBeansでデバッグできるようにしていきますよ！
convnetjsとtensorflow その3

#概要
fizzbuzz問題をconvnetjsとtensorflowでやってみた。

#学習データの用意
データ
```
[0, 1, 0, 1, 0, 0, 0, 0, 0, 0]
```
ラベル
```
[1, 0, 0, 0]
```
#モデルの作成
分類	classification です。
##入力、出力
convnetjsの場合

```
{
   type: 'input',
   out_sx: 1,
   out_sy: 1,
   out_depth: 10
}
{
   type: 'softmax',
   num_classes: 4
}
```

tensorflowの場合

```
X = tf.placeholder("float", [None, 10])
Y = tf.placeholder("float", [None, 4])
```

##重みとバイアス
convnetjsの場合

```
{
    type: 'fc',
    num_neurons: 10,
    activation: 'tanh'
}
```

tensorflowの場合

```
w_h = tf.Variable(tf.random_normal([10, 100], stddev = 0.01))
w_o = tf.Variable(tf.random_normal([100, 4], stddev = 0.01))
```

#活性化関数を使う
convnetjsの場合

```
activation: 'tanh'
```

tensorflowの場合

```
h = tf.nn.relu(tf.matmul(X, w_h))
out = tf.matmul(h, w_o)
```

#ロス値を定義
convnetjsの場合

```
stats.loss;
```

tensorflowの場合

```
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = out, labels = Y))
```

#最適化の方法定義
convnetjsの場合

```
var trainer = new convnetjs.Trainer(net);
```

tensorflowの場合

```
train_op = tf.train.GradientDescentOptimizer(0.05).minimize(loss)
```

#セッションを定義して学習する。
convnetjsの場合

```
var point = new convnetjs.Vol(1, 1, 10);
point.w = [0, 1, 0, 1, 0, 0, 0, 0, 0, 0];
stats = trainer.train(point, [1, 0, 0, 0]);
```

tensorflowの場合

```
sess = tf.Session()
sess.run(tf.initialize_all_variables())
for epoch in range(10000):
    sess.run(train_op, feed_dict = {
        X: trX[start:end],
        Y: trY[start:end]
    })
```
#テストデータで取り出す。
convnetjsの場合

```
var point = new convnetjs.Vol(1, 1, 10);
point.w =  [0, 1, 0, 1, 0, 0, 0, 0, 0, 0];
var prediction = net.forward(point);
```

tensorflowの場合

```
teY = sess.run(predict_op, feed_dict = {
    X: teX
})
```

#サンプルコード
convnetjsの場合
http://jsdo.it/ohisama1/swGpU
tensorflowの場合
https://github.com/ohisama/tensorflow-fizzbuzz
WEBrick A server is already running



```
$ ps ax
　　：
　　：
　　：
　　：
 5441 pts/0    Tl     0:06 /home/vagrant/.rbenv/versions/1.9.3-p448/bin/ruby script/rails s
 5582 ?        S      0:00 pickup -l -t fifo -u
 5855 pts/0    R+     0:00 ps ax
```
```
#起動中のプロセスを終了
$ kill -9 5441
```
タグなし > 「いいね」と「ストック」の使い分け

2017年04月24日現在の自分の「いいね」と「ストック」

- いいね: 124ページ
- ストック: 174ページ
   - 自分の記事をストックしている分、多い

いいねとストックをまだ使い分けできていない。

以下のように使うことを考えた。

- いいね
   - 考え方が良いもの、日々使わなくてもいいもの
   - タイトルから内容がわからなくても許容
- ストック
   - 日々使いたいもの、すぐに使えるもの
   - タイトルから内容がわかるものだけ
   - 重点的に読み返したいもの

UIの構造としては「いいね」はUIの階層の奥深くにある。たまに使うという場合は問題がない。
一方で「ストック」はトップページからすぐにアクセスできる。日々使いとしては良い。

現在「ストック」に入っている「いいね」候補は「ストック」をはずすことにした。
これにより、ストックが整理され、日々の作業で「ストック」から使いたいものを短時間で見つけ出せるようになることを期待する。
一方で「いいね」したものは時間が空いたときに読み返す、ということができそうだ。

「いいね」して「ストック」なしの場合は検索ができない点は使いながら考えてみる。
Macにcomposerをインストール


#ダウンロード

公式サイトの `Download` をクリックして、そのままターミナルに貼り付け。

https://getcomposer.org/

`Composer successfully installed...` が出ていたらOK。

##パスを通す

フォルダの中から `composer` が叩けるようにする。

```
$mv composer.phar /usr/local/bin/composer
```

上記がだめなら `sudo` を付けたり。

### mv: rename composer.phar to /usr/local/bin/composer: No such file or directory
ディレクトリがないとのことなので以下のコマンドでディレクトリを作成してからパスを通しましょう。

```
$sudo mkdir /usr/local/bin
```

[参考]
https://blog.fire-sign.info/686/

##インストールできているか確認する

```
$composer -V
```

または

```
composer --version
```

```
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
```

が出ればOK。
matplotlibの凡例を半透明に

#pythonでmatplotlibを用いてグラフ描画をする時に凡例を1行で半透明にする書き方

```
   ax.legend()
```

の部分を以下のようにする。

```
   ax.legend().get_frame().set_alpha(0.6)
```

久しぶりに書こうとして、忘れていたので、こちらにメモ。
Excelのワークシート１つを１ファイルに出力するVBAマクロ


# はじめに
2008年くらいにWindows版Excelで作成したVBAマクロを見つけたので、Mac版Excelでも動くのか試してみたのですが、大抵動く、という結果でした。
せっかくなので、VBAマクロを切り出して残しておこうと思います。

# VBAマクロ
## 概要
１つのワークブックに複数存在する（というかたくさん存在する）ワークシートを、シート1つに付き1ファイルに出力するマクロです。
出力されるファイル名は、「ブック名-シート名.xls」です。（当時のまま）

## ソース
```vbnet
Option Explicit

'=====================================================================
' シートを個別にファイル出力
' -------------------------------------------------------------------
' シート1つに付き1ファイルに出力する。ファイル名は、ブック名-シート名.xls
'=====================================================================
Public Sub OutputSheetFile()
    Dim intIdx As Integer       '処理用インデックス
    Dim intWksCnt As Integer    '処理用カウンタ
    Dim objWks As Object        'シート作成用オブジェクト
    Dim strWbkNme As String     'Excelワークブック名(拡張子含まず)
    Dim strWbkDir As String     'Excelワークブック保存場所
    Dim strWksNme As String     'シート名
    
    'Excelワークブックの情報取得
    strWbkDir = Application.ActiveWorkbook.Path
    strWbkNme = Application.ActiveWorkbook.Name
    If Right(strWbkNme, Len(".xls")) = ".xls" Then
        strWbkNme = Left(strWbkNme, Len(strWbkNme) - Len(".xls"))
    End If
    
    'シート数取得
    intWksCnt = Excel.ActiveWorkbook.Worksheets.Count
    
    'シート数ループ
    For intIdx = 1 To intWksCnt
        '対象シート名取得
        strWksNme = Worksheets(intIdx).Name
        
        'シートのコピー
        Worksheets(intIdx).Copy
        'ファイル保存
        ActiveWorkbook.SaveAs Filename:= _
            strWbkDir & Application.PathSeparator & strWbkNme & "-" & _
            strWksNme & ".xls", FileFormat:=xlNormal, Password:="", _
            WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False
        ActiveWindow.Close
    Next

    MsgBox "シート毎にファイル出力しました。" & vbCrLf _
        & "出力先：" & strWbkDir, vbOKOnly, "出力完了"
    
End Sub
```

# 補足
## 所感
元々は、別のマクロで指定フォルダ内のxlsファイルを１つのワークブックに統合するマクロが存在していて、それの逆バージョンとして作ったものだったと思います。通常、あまり使い道はなさそうですね。
出力するファイル形式が古いことや、処理内でメッセージボックスを表示することを許容していたり、あとは今調べればもっと良い方法もあると思いますので、参考程度、というところでしょうか。

## Windows版をMacで実行した際の修正点
### パス区切り文字
Windows版でファイル出力先のフルパスのパス区切り文字に、リテラルで「¥」マークを記述していたので、
「Application.PathSeparator」
に修正しました。
（当時、Windows以外でExcel VBAを動かすとは少しも思ってもいなかったのですが、それでもこういうところはきちんとしておくべきですね。）
gretelで個別にviewにパンくずを表示する

## 経緯
gretelを使用してviewのpartialにパンくずを表示させたかったので。

## 書き方
partialに以下のように書く。application.html.erbに `<%= breadcrumbs separator...` は書かない。

```
<% breadcrumb :category, @category %>
<%= breadcrumbs separator: ' &rsaquo;&rsaquo; ', link_current: true %>
```


## 一般的な書き方

よくある使いかたとしては以下のように`application.html.erb`記述することで全ページから参照することが出来る。

```app/views/layouts/application.html.erb
<html>
<head>
  <title>MyApp</title>
  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
  <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
  <%= csrf_meta_tags %>
</head>
<body>
  <div class="container">
    <p><%= breadcrumbs separator: " &rsaquo; " %></p> 
      <%= yield %>
  </div>
</body>
</html>
```
技術書読書会 #7 Infrastructure as Code

# 技術書読書会 #7 Infrastructure as Code

## 読書会とは
「好奇心はいつだって、新しい道を教えてくれる。」とみんな大好き、ねずみの国を作った人が言ってました。

技術書を最後まで読み切る事は意外と大変です。一人なら無理だけどみんなの力があればできるかも・・・。
そんなことを誰が思たのか、ともあれそんな気持ちに賛同したメンバーが１冊の技術書を読み込むという結構ハードルの高いことにチャレンジをしていきます。

## 技術書読書会の進め方
eXtreme Readingの方式で進めていきます。

### 実施方法
以下の流れで読書をしていきます。

```
1. 0分～5分間で、今回読み進める章/節を発表する
2. 15分～30分間で、読書
3. 5分～10分間で、ディスカッション
4. 1～3を時間分繰り返す
5. まとめ
```

今回の読書会は、所要時間30分で以下の配分で行いました。

```
1. 5分間で、今回読み進める章/節を発表する
2. 15分間、読書
3. 5分間、ディスカッション
4. 10分間、まとめ
```

### 利点
eXtreme Readingの利点です。

- 事前の準備がいらない。
- ディカッションをすることにより理解を深める事ができる。参加者全体の理解度の底上げが期待できる。
- 時間を区切って進行するので、読書の進捗が一定となり本の読み終わり時期を予測することができる
- みんなでやればなんとかなる


## 今回読む書籍
[Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス](
https://www.amazon.co.jp/Infrastructure-Code-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%90%E7%AE%A1%E7%90%86%E3%81%AE%E5%8E%9F%E5%89%87%E3%81%A8%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9-Kief-Morris/dp/4873117968/ref=sr_1_1?ie=UTF8&qid=1491455639&sr=8-1&keywords=Infrastructure+as+Code)

## 参加人数
5人

## 所要時間
30分

## 進捗
3.4 - 3.5

## ディスカッション

### 3.4 構成レジストリ
峯　はじめ何のことを言っているんだろうって？
浜　データベースというか構成の情報を持っているなにか？
峯　ConsulとかAnsible Towerとかのことをいうんだ
飯　それを踏まえたうえで、軽い構成レジストリってなに？
峯　注釈のところですっきりした。インフラストラクチャー定義ツールとサーバー構成ツールを分離して説明する。

### 3.4.1 軽い構成レジストリ
峯　少し気になったのは、四角の中のCDCテストってなに？

```
クックパッドさん
サービス分割時の複雑性に対処する: テスト戦略の話
http://techlife.cookpad.com/entry/2016/01/04/094705

Consumer Driven Contractsで REST API/マイクロサービスをテスト
https://www.slideshare.net/makingx/consumer-driven-contracts-rest-api-m3tech
```

飯　レジストリに変更を加えるのを躊躇する空気が出来上がりってところがあるあるかなと
峯　スクリプトが独自で動いているんだけど、忘れちゃうよね。なにがなんだったか
浜　逆にたどるのって難しいですよね。例えばあるキーを変更しようとしている例がありましたけど、このキーを参照しているスクリプトを探すみたいな。
飯　密なコミュニケーションって・・・。
浜　がんばれみたいな
飯　正解はない

### 3.4.2 構成レジストリはＣＭＤＢか
浜　ＣＭＤＢって、昔からの人はこっちのほうが知っていたりするんですかね？あまりしらない
峯　これって資産管理みたいなもの？ライセンス管理とか
浜　構成レジストリがCMDBと一緒でしょ。って言われそうだから書いてあるってことなんではないでしょうか

## 気づき
* 3章が終わりました。
* 6月の半ばぐらいには読了できそうです。

## まとめ
Macのsshfsでunmountできなくなった時の対処

この文書は
===

* ただの個人メモです

Macのsshfsがうまくつながらない
===

* MacからLinuxをover sshでマウントできるsshfs便利です
* 何かの拍子でうまくつながらなくなった場合はunmount => 再度mountでだいたいなおります
* しかしunmountすらできなくなる場合があります


```
$ umount /Users/xxx/sshfs/docker/
umount(/Users/xxx/sshfs/docker): Resource busy -- try 'diskutil unmount'

$ diskutil unmount /Users/xxx/sshfs/docker
Unmount failed for /Users/xxx/sshfs/docker
```

プロセスkillで対処
===

* killでsshfsのプロセスをおとしてからunmountしたら通じました

```
$ pgrep -lf sshfs
2449 sshfs root@172.16.91.120:/var/lib/docker/xxxx /Users/xxx/sshfs/docker
$ kill -9 2449
$ umount -f /Users/xxx/sshfs/docker
```
Invoke-WebRequest , Invoke-RestMethod で 基本認証

PowerShellのコマンドレット Invoke-WebRequest , Invoke-RestMethod で Basic認証 / BasicAuth をかける方法。

-Credential 引数に ユーザー名か、PSCredentialオブジェクトを渡してあげます。


### 確認環境

| パッケージ | バージョン |
|:-----------|------------:|
| OS X       |        10.11.6 , El Capitan |
| [PowerShellCore](https://github.com/PowerShell/PowerShell)       |        v6.0.0-alpha.18 |


### ヘルプ

[Invoke-RestMethod](https://msdn.microsoft.com/powershell/reference/5.1/microsoft.powershell.utility/Invoke-RestMethod)

```
-Credential

Specifies a user account that has permission to send the request. 
The default is the current user.

Type a user name, such as User01 or Domain01\User01, 
or enter a PSCredential object, such as one generated 
by the Get-Credential cmdlet.
```

# Credential 作成、実行

## Credential 作成

ヘルプの通り Get-Credential を使う場合。 （パスワードを引数で渡す方法はないので、実行時に入力）

```ps1
$USER = "namae"
$cred = Get-Credential -UserName $USER -Message "enter PASS"
```

毎回いれたくないけど、パスワードをハードコードしたくない人向け。

```ps1
# ファイルにパスワードを保存しておく （暗号化文字列な状態で)
Read-Host -AsSecureString | ConvertFrom-SecureString | Out-File sec.txt

# ファイルに保存しておいたパスワードを利用する
$USER = "namae"
$secpasswd = cat sec.txt | ConvertTo-SecureString
$cred = New-Object System.Management.Automation.PSCredential($USER, $secpasswd)

```

ちょっと試すだけだから、ファイルの利用とかは避けたいという場合。

```ps1
$USER = "namae"
$PASS = "himitsu"
$secpasswd = ConvertTo-SecureString $PASS -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($USER, $secpasswd)
```

## コマンドレットを実行

Credential が作成できたら、後は実行だけ

```ps1
Invoke-WebRequest -Uri "http://internal.server.local/api" -Credential $cred
```


# 参考：
- [PowerShell で Get-Credential を利用する](http://tech.guitarrapc.com/entry/2014/01/14/101056)
- [Using PowerShell credentials without being prompted for a password](http://stackoverflow.com/questions/6239647/using-powershell-credentials-without-being-prompted-for-a-password)
- Qiita : [PowerShell_基本認証接続](http://qiita.com/ki02/items/575fc79c0acd3811902e)

# その他：

PowerShell 6.0 のコマンドレットには -SkipCertificateCheck オプションが追加されているので、SSL自己証明書を利用している際には、手軽にスキップできました。開発用途で立ててあるAPIなどにアクセスする際には、簡単にできて良いのかなぁと。

- [WebCmdlets.Tests.ps1](https://github.com/PowerShell/PowerShell/blob/e8a0f3ca639d2a94d672e2120f65516259075dd4/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1#L437)
Unityで作ったアプリにAdMobで広告を追加したお話 Android編

#目的
同じような記事は多々ありそうですが、Unityで製作したAndroid/iOSのアプリにAdMobの広告を追加したので、自分のために忘備録として残して置きます。

#環境
- Unity 5.4.0f3

#準備
##AdMobの登録
- AdMobに登録し、Androidの広告ユニットIDを用意

##GoogleMobileAdsPluginの設定
- [こちら](https://github.com/googleads/googleads-mobile-unity/releases/tag/v3.4.0)からGoogleMobileAds.unitypackageをダウンロードし、unityでインポート

#実装
1. 広告を表示したいsceneに空のGameObjectを追加します。今回はオブジェクト名はBannerとしました。
2. 追加したオブジェクトに下記のスクリプトを追加します。
3. `INSERT_ANDROID_BANNER_AD_UNIT_ID_HERE`を用意した広告ユニットIDに置き換える。
4. テストバナーを表示したい場合は、`INSERT_TEST_DEVICE_ID_HERE`をテスト端末のデバイスIDに置き換える。
5. バナーを表示したいタイミングでRequestBanner()を呼びだす。(今回はsceneの表示と同時に呼び出すようにしています)
6. バナーを消したいタイミングでStopBanner（）を呼び出す。（呼び出さないとsceneを変更しても出っぱなしになる）
7. ビルドして端末にインストールする。

```c#:BannerControl.cs
using UnityEngine;
using System.Collections;
using GoogleMobileAds.Api;


public class BannerControl : MonoBehaviour {

	private BannerView bannerView;

	void Start () {
		//ページの読み込みと同時にバナーを作成
		RequestBanner ();
	}

	void Update () {
	
	}

	//バナーを作成
	private void RequestBanner()
	{
		#if UNITY_EDITOR
		string adUnitId = "unused";
		#elif UNITY_ANDROID
		string adUnitId = "INSERT_ANDROID_BANNER_AD_UNIT_ID_HERE";
		#elif UNITY_IPHONE
		string adUnitId = "INSERT_IOS_BANNER_AD_UNIT_ID_HERE";
		#else
		string adUnitId = "unexpected_platform";
		#endif

		// Create a 320x50 banner at the top of the screen.
		bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.Top);

		// Create an empty ad request.
		//AdRequest request = new AdRequest.Builder().Build();

		//Create a test ad request.
		AdRequest request = new AdRequest.Builder()
		.AddTestDevice(AdRequest.TestDeviceSimulator)       // Simulator.
		.AddTestDevice("INSERT_TEST_DEVICE_ID_HERE")  // My test device.
		.Build();

		// Load the banner with the request.
		bannerView.LoadAd(request);
	}

	//バナー表示の停止
	public void StopBanner()
	{
		bannerView.Hide ();
		bannerView.Destroy();
	}
```

#テスト用端末のデバイスIDの取得
調査中...

#テストバナーが不要の場合
上記のコードからの下記の部分を削除し、`AdRequest request = new AdRequest.Builder().Build();`のコメントアウトを外してください。

```c#
//Create a test ad request.
AdRequest request = new AdRequest.Builder()
.AddTestDevice(AdRequest.TestDeviceSimulator)       // Simulator.
.AddTestDevice("INSERT_TEST_DEVICE_ID_HERE")  // My test device.
.Build();
```

#おわりに
これで問題がないのかちょっと不安ですが、とりあえず表示まではできました。
ターゲット設定などの各種設定については参考サイトをご覧ください。

#参考サイト
>スタートガイド  |  AdMob by Google  |  Firebase
>https://firebase.google.com/docs/admob/unity/start?hl=ja
Dom操作時の要素の取得について

Javascriptでの、Dom操作時に以下のような書き方をしていて詰まったのでメモ。

```var elem = document.getElementsByTagName("main").style.height = "100px";```

##前提
Dom操作をするときは、特定の要素を指定しないといけない。

##例
操作可能
```var elem = document.getElementById("main");```
```var elem = document.getElementsByClassName("main")[0];```
```var elem = document.getElementsByTagName("main")[0];```

※特定の要素を指定していない、以下は操作不可。
```var elem = document.getElementsByClassName("main");```
```var elem = document.getElementsByTagName("main");```

参考
https://www.w3schools.com/jsref/dom_obj_style.asp
自分のアプリから、iOS版GoogleDriveに遷移させたい

## はじめに
こちらは Xcode8.3.1 Swift3.0 で開発したものになります。

googleスプレッドシートを開こうとして、WebViewでもSafariでも開けない問題にぶつかりました。
そこでgoogleドライブのアプリで見ると、開けることが発見した！
そちらに今回、メモ書き程度にまとめていきたいと思いますmm


## 修正する箇所
* plist
* ソースコード

この二点を改修すれば、遷移するようになります。

## plistについて
下記の内容を追加してください

```
<key>LSApplicationQueriesSchemes</key>
 	<array>
 		<string>googledrive</string>
 		<string>itms-apps</string>
 	</array> 
``` 

こちらでは外部アプリを呼び出すための準備になります。
#### googledrive → googleDrive遷移
#### itms-apps → AppStoreに遷移
できるbundleIDになります。これを予め、書いていないと遷移できませんでした。。。

## ソースコード
下記の内容を追加します！

``` 
// googleDriveが開けるかどうかを確認
if UIApplication.shared.canOpenURL(URL(string:"googledrive://")!) {

                //Googledriveある場合
                let urlStr:String = "googledrive://" + 遷移させたいURL
                UIApplication.shared.openURL(URL(string:urlStr)!)

            } else {

　　　　　　　　　　// GoogleDriveがインストールされていない場合
                let alert: UIAlertController = UIAlertController(title: "", message: "こちらはGoogleDriveをインストールしないと閲覧することができません。今からインストールしますか？", preferredStyle: .alert)
                let okAction = UIAlertAction(title: "OK", style: .default) { (UIAlertAction) in
　　　　　　　　　　　　//OKボタンアクション
　　　　　　　　　　　　////AppleStoreのGoogledriveダウンロードページを開く
                    let appStoreURL:String = "itms-apps://itunes.apple.com/app/id507874739"
                    UIApplication.shared.openURL(URL(string:appStoreURL)!)
                }
                let cancelAction = UIAlertAction(title: NSLocalizedString("cancel", comment: ""), style: .cancel)
                alert.addAction(okAction)
                alert.addAction(cancelAction)
                self.present(alert, animated: true, completion: nil)
            }
```

こちらでアプリをインストールしていない方も、スムーズもインストールできるようになります。
ポイントは、Alertを出したところです。そうすることで、インストールしていない場合にないも通知なしで、AppStoreに遷移することを防いでいます。

## まとめ
今回の困った点は、2点で

* GoogleDriveのBundleIDを調べること
* appStoreのURLを探すこと

ぜひ困ったら使ってください！
少しずつQiitaに記事を載せ、定期的にOutPutしていきます！
また間違い等があった、教えてくださいmm
JavaScriptを使って24時間毎日見れる(聴ける)音楽ライブ放送 🎧 を探す！(第1回)

# 24時間毎日見れる(聴ける)音楽ライブ 🎧 を主にYouTubeから探して紹介します！(<kbd>クローラーもどきも開発します</kbd>)

- 興味のある方は、プログラムを追加・更新する際に変更通知を送りますので「ストック」をよろしくお願いします。

# YouTube の検索結果取得プログラム

- Windows PC で以下のスクリプトファイル(Windows Script ファイル)を作成します。
- 作成できたらダブルクリックすることで IEが起動し YouTube の検索画面が自動的に開きます。
- スクリプトファイルと同じディレクトリの yt-live.txt に検索結果(HTML)が保存されます。
- 保存されたHTMLを加工・処理するプログラムはまた今度紹介します。

```html:yt-live.wsf
<job>

<comment>
********************************************************************************
最終更新: 2017年4月24日 14:44:58
最近の変更点: 
********************************************************************************
</comment>

<script language="JavaScript">

  var url = "https://www.youtube.com/results?search_query=music+live";

  var ie = WScript.CreateObject("InternetExplorer.Application")
  ie.Navigate(url);
  ie.Visible = true;
  waitIE(ie);

  writeTextToFile_Utf8_NoBOM("yt-live.txt", ie.document.documentElement.innerHTML);

  //ie.Quit();
  WScript.Echo("終了します");
  WScript.Quit();

  function waitIE(ie) {    
    while ((ie.Busy) || (ie.readystate != 4)) {
      WScript.Sleep( 100 );
    }
    WScript.Sleep( 1000 )
  }

  function writeTextToFile_Utf8_NoBOM(path, text) {
    var StreamTypeEnum  = { adTypeBinary: 1, adTypeText: 2 };
    var SaveOptionsEnum = { adSaveCreateNotExist: 1, adSaveCreateOverWrite: 2 };
    var stream = new ActiveXObject("ADODB.Stream");
    stream.Type = StreamTypeEnum.adTypeText;
    stream.Charset = "utf-8";
    stream.Open();
    stream.WriteText(text);
    stream.Position = 0
    stream.Type = StreamTypeEnum.adTypeBinary;
    stream.Position = 3
    var buf = stream.Read();
    stream.Position = 0
    stream.Write(buf);
    stream.SetEOS();
    stream.SaveToFile(path, SaveOptionsEnum.adSaveCreateOverWrite);
    stream.Close();
  }

</script>

</job>

```

<hr />

以下のようなビデオを見つける方法を示していきます。(このビデオのライブ配信開始日は 2017/02/08 です)

<table height="400" width="600"><tr><td>
😲<b>POP MUSIC 2017 (HIT MUSIC) 24/7 LIVE STREAM - HUNTER.FM (LIVE NOW!)<img title="😲オススメ！" src="https://raw.githubusercontent.com/javacommons/qiita/master/osusume014_10.gif" /></b>
 <div align="right">
 <a title="HUNTER.FM on YouTube" href="https://www.youtube.com/channel/UCQNN7INAt1yS_v0P0tSlbrQ">[HUNTER.FM Channel]</a>
 </div>
<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">POP MUSIC 2017 (HIT MUSIC) 24/7 LIVE STREAM - HUNTER.FM <a href="https://t.co/AsjhSMFUIj">https://t.co/AsjhSMFUIj</a></p>&mdash; JavaCommons (@javacommons) <a href="https://twitter.com/javacommons/status/856049181349232640">2017年4月23日</a></blockquote>
</td></tr></table>

# 見つかったライブビデオ一覧

>- 見つかった毎日24時間ライブは外部のWikiに移しました(Wikiのページ内で再生できます)。
>- 随時Wikiに見つかったビデオを追加していきます。(ライブとしての公開が終了したものは削除する予定です)

http://youtube.sokuhou.wiki/ (現在掲載中のライブ: 9件)

[![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/2ab4424f-762c-774f-d51a-e2bfcdff4620.png)](http://youtube.sokuhou.wiki/)

----
How to reassign JIRA issues/comments with SQL

  <font color=blue> below is touching JIRA db directry, apparently not supported by Atlassian :exclamation:</font>

- replace old_username, new_username and project_id appropriately


## Update issues - jiraissues

```sql
update public.jiraissue set assignee = 'new_username' where assignee = 'old_username'
```

## Update comments - jiraactions

```sql
update jiraaction set author = 'new_username' where author = 'old_username_here'
 and actiontype = 'comment' and issueid in (select id from jiraissue where project='project_id');
```

```sql
update public.jiraaction set author = 'new_username' where author = 'old_username'
```
```sql
update public.jiraaction set updateauthor = 'new_username' where updateauthor = 'old_username'
```


### Need to re-index

http://jira-server/secure/admin/IndexAdmin.jspa

![jira-reindexing.png](https://qiita-image-store.s3.amazonaws.com/0/114634/51a28673-31b6-62b1-7a32-bc765956d48a.png)

### Done
:smiley:
CentOS環境でjupyter notebookをインストールする際の簡易手順

Cent OS環境でjupyter notebookをインストールする際の簡易手順です。
Cent OSのバージョンは以下の通りです。
>
\# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.3 (Maipo)
\#

以下の手順を実行してインストールしました。

>
\# yum install -y python34-setuptools
\# yum install -y python34-setuptools
\# easy_install-3.4 pip
\# pip3 install --upgrade pip
\# pip3 install jupyter
\# jupyter notebook --allow-root --ip=10.44.60.155


tokenが記載されたURLを使ってアクセスします。
![image](https://qiita-image-store.s3.amazonaws.com/0/177123/07a4d0a5-7a57-cd80-9ceb-e25f624b10ca.png)
React Router v4の変更点

![スクリーンショット 2017-04-23 11.13.26.png](https://qiita-image-store.s3.amazonaws.com/0/54502/e1c1a2d0-f28b-5423-93f7-2c6f88f858bb.png)


React Routerのバージョンが4になっていろいろ変わっていました。

公式ページも変わってました。
https://reacttraining.com/react-router/web/guides/quick-start

## import

以前は`react-router`からimportする仕様でしたが、v4はwebとnativeが分かれるようになりました。
webの場合は`react-router-dom`から、nativeは`react-router-native`からimportする仕様に変更されています。

```js
// v3
import { Route } from 'react-router'

// v4 : web
import { Route } from 'react-router-dom'
// v4 : native
import { Route } from 'react-router-native'
```

## Router

Routerも大幅な仕様の変更が行われています。
個人的にはv4の方がスッキリしていて好きです。

```js
// v3
import React from 'react'
import { render } from 'react-dom'
import { 
  Router, 
  Route, 
  IndexRoute, 
  IndexLink,
  browserHistory 
} from 'react-router';

render(
  <Router history={browserHistory}>
    <Route path='/' component={App}>
      <IndexRoute component={Top} />
      <Route path='hoge' component={Hoge} />
    </Route>
  </Router>
)

// v4
import React from 'react'
import { render } from 'react-dom'
import {
  Route,
  BrowserRouter
} from 'react-router-dom'

render(
  <BrowserRouter>
    <div>
      <Route exact={true} path='/' component={Top}/>
      <Route path='hoge' component={Hoge}/>
    </div>
  </BrowserRouter>
)
```

## パラメーターの受け取り方

パラメーターの受け取り方も変更されました。
今まではprops直下に値が入っていましたが、v4はmatchの中にパラメーターが入っています。

```js
// v3
import React, { Component } from 'react'

class Hoge extends Component {
  constructor(props) {
    super(props);
    // this.props.paramsにパラメーターが格納
    const params = this.props.params
  }

  render() {
    return (
      <div>Hoge</div>
    )
  }
}

// v4
import React, { Component } from 'react'

class Hoge extends Component {
  constructor(props) {
    super(props);
    // パラメーターはthis.props.match内に変更
    const params = this.props.match.params
  }

  render() {
    return (
      <div>Hoge</div>
    )
  }
}
```

## まとめ
他にも変更点はあると思いますが、一旦自分が修正した変更をざっくりまとめました
破壊的な変更もあるので、v3で作ったものを無理やり乗せかえる必要はないと思います。
Kotlinのベストプラクティス記事の紹介

# Kotlinの書き方の記事
これからAndroidなどでも使っていけるKotlinの書き方（ベストプラクティス）に悩んでいたところ、
すごく良い記事を見つけた。
時間ができたら日本語訳をしたい。

# 参考

Idiomatic Kotlin. Best Practices.
https://blog.philipphauer.de/idiomatic-kotlin-best-practices/
proxmox付属のパフォーマンス測定: /usr/bin/pveperf

```計測
sudo pveperf
```

## 結果

```bash:ベアボーン_i7(ssd)
CPU BOGOMIPS:      51080.80
REGEX/SECOND:      3595250
HD SIZE:           28.05 GB (/dev/mapper/pve-root)
BUFFERED READS:    235.02 MB/sec
AVERAGE SEEK TIME: 0.05 ms
FSYNCS/SECOND:     194.53
DNS EXT:           119.35 ms
DNS INT:           14.57 ms
```

```bash:mypc(ssd)
CPU BOGOMIPS:      23147.32
REGEX/SECOND:      2581836
HD SIZE:           116.01 GB (/dev/mapper/pve-root)
BUFFERED READS:    477.40 MB/sec
AVERAGE SEEK TIME: 0.09 ms
FSYNCS/SECOND:     292.31
DNS EXT:           110.81 ms
DNS INT:           147.04 ms
```

```bash:1U_1(hdd)
CPU BOGOMIPS:      24743.84
REGEX/SECOND:      1723138
HD SIZE:           912.71 GB (/dev/md0)
BUFFERED READS:    98.58 MB/sec
AVERAGE SEEK TIME: 18.91 ms
FSYNCS/SECOND:     37.46
DNS EXT:           39.79 ms
DNS INT:           12.97 ms
```

```bash:pc床置き(遅いssd)(debianからインストール)
CPU BOGOMIPS:      22475.64
REGEX/SECOND:      1676190
HD SIZE:           5.36 GB (/dev/sdc2)
BUFFERED READS:    51.49 MB/sec
AVERAGE SEEK TIME: 0.34 ms
FSYNCS/SECOND:     164.96
DNS EXT:           102.95 ms
DNS INT:           7.04 ms
```

```bash:pc右(ssd)
CPU BOGOMIPS:      24744.20
REGEX/SECOND:      1525195
HD SIZE:           114.17 GB (/dev/dm-0)
BUFFERED READS:    253.65 MB/sec
AVERAGE SEEK TIME: 0.15 ms
FSYNCS/SECOND:     284.95
DNS EXT:           75.38 ms
DNS INT:           40.23 ms
```

```bash:nuc_i3(ssd)
CPU BOGOMIPS:      14381.96
REGEX/SECOND:      873440
HD SIZE:           115.15 GB (/dev/dm-0)
BUFFERED READS:    298.61 MB/sec
AVERAGE SEEK TIME: 0.23 ms
FSYNCS/SECOND:     1103.72
DNS EXT:           85.20 ms
DNS INT:           100.24 ms
```
OkHttp（基本的なGET・POST）

# 環境
Java:8
OkHttp:3.7.0

# OkHttpとは
AndroidやJavaのアプリケーション用のHTTP/HTTP2.0のクライアント

# 特徴
* 軽量である
* レスポンスをキャッシュできる
* Android 2.3以降であれば動作可能
* コネクションプーリングを行い、リクエストの遅延を解消
* ライセンスは「Apache License, Version 2.0」

# インストール
Mavenの場合

``` .xml
<dependency>
  <groupId>com.squareup.okhttp3</groupId>
  <artifactId>okhttp</artifactId>
  <version>3.7.0</version>
</dependency>
```
Gradleの場合

``` .gradle
compile 'com.squareup.okhttp3:okhttp:3.7.0'
```

# 前提
Java 7以上

# Get
処理の流れ
1. OkHttpClientクラスのオブジェクト生成
2. RequestオブジェクトをBuilderクラスでURLなどを設定しながら生成
3. OkHttpClientクラスのcallメソッドでリクエストの送信準備
4. OkHttpClientクラスのexecuteメソッドでリクエストの送信及び、レスポンス（Responseオブジェクト）の取得
5. ResponseオブジェクトからHTMLなどが取得可能

``` .java
String url = "http://www.casareal.co.jp";
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder().url(url).build();
Call call = client.newCall(request);
Response response = call.execute();
ResponseBody body = response.body();
```

シンプルに書くと下記のように書ける

``` .java
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
response.body().string();
```


# POST
処理の流れ
1. OkHttpClientクラスのオブジェクト生成
2. MediaTypeクラスのparseメソッドでMIMEタイプなどを事前に用意する
3. RequestBodyクラスで送信データの準備
4. RequestオブジェクトでURLと送信データなどを設定しながら生成(RequestBodyオブジェクトはpostメソッドの引数に渡す)
5.レスポンスの取得などはGETと同じ

``` .java
OkHttpClient client = new OkHttpClient();
MediaType MIMEType= MediaType.parse("application/json; charset=utf-8");
RequestBody requestBody = RequestBody.create (MIMEType,"{}");
Request request = new Request.Builder().url(url).post(requestBody).build();
Response response = client.newCall(request).execute();
```
# 参考

http://square.github.io/okhttp/
jestでテストカバレッジを見る

jestを使うとテストのカバレッジが驚くほど簡単に見れます。

# jestとは
https://facebook.github.io/jest/
facebook製のJavaScriptテスティングフレームワーク。
Reactとの親和性がとても良い。
最初の発表時から大幅に機能の改善が行われたらしく最近脚光を浴びているみたいです。

# 導入方法
まずjestのインストール

```
npm install --save-dev jest
```

React使ってるならbabel入れてると思うので以下も
(npm2以下ならさらに `regenerator-runtime` もインストールが必要)

```
npm install --save-dev babel-jest
```

最後にテストの記法をES6に対応させるために `.babelrc` にこれも書く。

```json
{
  "presets": ["es2015", "react"]
}
```
とりあえず、これだけでおっけー

# サンプルで試す
https://github.com/sitepoint-editors/testing-react-with-jest
とりあえず動くものが見たいからサンプルアプリを持ってきましょう。

`README.md`の`Running locally`に書いてある通りにやれば以下のようなToDoアプリが動いてくれます。

![image](https://qiita-image-store.s3.amazonaws.com/0/128645/a292416c-df4f-493d-3c7f-48dcd85feb9b.png)

このアプリのテストカバレッジを見るにはコンソールで以下コマンドを実行してやる。

```
npm test -- --coverage
```

コンソールにもサマリが出力されて満足してしまうかもしれませんが、実はもっとすごいものが出力されてます。
`coverage/`というディレクトリが生成されていると思うのでその中から`index.html`を見つけてブラウザで開きましょう。

以下のようにわかりやすいテストサマリが表示されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/128645/5fcf5039-2bd8-8f22-4bc8-a3773bc1d8af.png)

さらに、`File`の列のファイル名の部分がリンクになっているのでこれをクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/128645/1b76508d-c2be-717d-10a0-ff292d2f52ff.png)

コードが表示され、左端にパス数が書いてあります。
しかもテストが足りていないパスについては赤で塗ってくれます。
すごい…

# まとめ
テストカバレッジを出してアプリの品質を高めたいとき、かなり強力なツールだと思います。
導入も簡単だし、カバレッジ以外にもたくさん機能がついています。
私は以前はテスティングフレームワークとしてmochaを使っていましたが、多機能になったからと言ってmochaと比較して大幅にテストが遅くなったということも無いです。
とても良い。

# 参考サイト
https://www.webprofessional.jp/test-react-components-jest-1/
CentOS 5.x の yum update で Error: Cannot find a valid baseurl for repo: base エラー

CentOS 5 は、2017/03/31 で EOL となったので、新しいアップデートは行われない。

[[CentOS-announce] CentOS Linux 5 EOL](https://lists.centos.org/pipermail/centos-announce/2017-April/022350.html)

mirrorlist のサーバからは 5.x のツリーは削除されているので、yum による更新はエラーになる。

対処方法は、以下のいずれか。

## 1. CentOS 7 にアップデート

CentOS 7 にアップデートする。正攻法。

## 2. RedHat の拡張サポートを購入

REHL-5 の拡張サポートを購入する。
https://access.redhat.com/support/policy/updates/errata

## 3. yum の向き先を vault.centos.org に設定する

後ろ向きというか、意味は無いのだが、yum-cron などを仕掛けていて、とりあえずエラーを解消したい場合だけの対処療法。（もはや更新されないのだから、yum-cron 自体不要だが。）

yum の向き先を vault.centos.org に向けて、とりあえずエラーを凌ぐ。（追加リポジトリなどは、メンテナンスされていれば更新できる）このサーバは、アーカイブ用サーバなので対象パッケージが更新されることは無い。

`/etc/yum.repos.d/CentOS-Base.repo` を下記のように設定する。

```ini
[base]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os # コメントアウト
baseurl=http://vault.centos.org/5.11/os/$basearch/ # vault.centos.org に設定
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

#released updates
[updates]
name=CentOS-$releasever - Updates
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates # コメントアウト
baseurl=http://vault.centos.org/5.11/updates/$basearch/ # vault.centos.org に設定
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras # コメントアウト
baseurl=http://vault.centos.org/5.11/extras/$basearch/ # vault.centos.org に設定
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
```
VSCodeでKotlinのコンパイルのタスクを用意する


### はじめに

※ こちらは学習中の単純なメモなので、あまり詳しく記載していません。

ただいま何か新しい言語を...と思って勉強中。
Kotlinを使ってみようと思いましたが、コードハイライトの拡張機能はあるものの、ビルドタスクは自前で組まないといけないっぽい。

MavenやGradleでビルドすれば良さそうですが、まだそこまで学習していないので、とりあえず簡単にkotlincでビルドを目指します。

### 設定してみたファイル

- KOTLIN_HOMEは ~/bin/kotlin に配置
- ソースは WorkSpaceの src/tutorial/ 以下に *.kt で配置
  - コマンドラインでは大丈夫なんだけど、tasks.jsonでは *.ktとワイルドカードで指定すると、file not foundになってしまったので、パスで指定
- 出力先は build/classes  

```
{
    "version": "0.1.0",
    "tasks": [
        {
            "taskName": "kotlinc",
            "command": "kotlinc",
            "showOutput": "always",
            // *.ktのようにワイルドカード指定だと上手くいかないので、ディレクトリ指定で
            // kotlin_HOMEは ~/bin/kotlin に設定
            "args": ["-d","${workspaceRoot}\\build\\classes","-kotlin-home",
                "${env.HOME}/bin/kotlinc", "-verbose", 
                "${workspaceRoot}/src/tutorial/"],
            "isShellCommand": true
        },
        // ビルドされたバイナリを実行してみる
        // 実行時に対象のクラスを指定するにはどうするのかわからないので、クラスごとにハードコード
        // ここはなんとかしたい....
        {
            "taskName": "Run HelloKt",
            "command": "kotlin",
            "args": ["-classpath","build/classes/", "HelloKt"],
            "isShellCommand": true
        }
    ]
}
```

### kotlincでコンパイルする

コンパイルは、Command + P -> Run Task -> kotlinc を選びます。
ログの出力結果は、こんな感じ。

```
logging: using Kotlin home directory /Users/akiko_pusu/bin/kotlinc
logging: configuring the compilation environment
output: output:
/Users/akiko_pusu/work/kotlin-memo\build\classes/HelloKt.class
Sources:
/Users/akiko_pusu/work/kotlin-memo/src/tutorial/hello.kt
output: output:
/Users/akiko_pusu/work/kotlin-memo\build\classes/META-INF/main.kotlin_module
Sources:
/Users/akiko_pusu/work/kotlin-memo/src/tutorial/hello.kt
```

### 実行する

実行は、Command + P -> Run Task -> Run HelloKt を選びます。
本当は、実行時に対象のクラスをVSCodeのタスクのダイアログボックスみたいなところで任意に入力したものに指定したいのですが、現在その方法がわからず...。

ひとまずハードコードしたもので実行。


```
Hello, World!
```

### ファイル

もとのファイルはこんな感じです。
先は長いです...。

```
fun main(args: Array<String>) {
    println("Hello, World!")
}
```
Doc2Vecを使い似た投稿を取得する

[livedoor newsコーパス](https://www.rondhuit.com/download.html#ldcc)を使う。
以下のようなDockerfileで用意した。

``` Dockerfile:Dockerfile
FROM shwld/mecab-python

WORKDIR /usr/data
RUN wget http://www.rondhuit.com/download/ldcc-20140209.tar.gz \
    && tar xvfz ldcc-20140209.tar.gz
WORKDIR /usr/src
```

## ファイルを読み込んで訓練データを準備する
[gemsim](https://radimrehurek.com/gensim/)を使う。

``` python
from os import listdir, path
import MeCab
from gensim.models.doc2vec import Doc2Vec
from gensim.models.doc2vec import LabeledSentence

mecab = MeCab.Tagger('-Owakati -d /usr/lib/mecab/dic/mecab-ipadic-neologd')

dirs = [{'key':i, 'label':path.join('../data/text', x)} for i, x in enumerate(listdir('../data/text')) if not x.endswith('.txt')]
dir_docs = [[path.join(x['label'], y), x['label']] for x in dirs for i, y in enumerate(listdir(x['label']))]

training_docs = []
for idx, (dir_doc) in enumerate(dir_docs):
    text = ''
    for line in open(dir_doc[0], 'r'):
        if (line is ''):
            continue

        text += mecab.parse(line)

    training_docs.append(LabeledSentence(words=text, tags=[dir_doc[0]]))

model = Doc2Vec(documents=training_docs, min_count=1, dm=0)
```

## 文書を入力して、似た文書を取得する
``` python
print(open('../data/text/dokujo-tsushin/dokujo-tsushin-4842348.txt').read())

print(model.docvecs.most_similar('../data/text/dokujo-tsushin/dokujo-tsushin-4842348.txt'))
```

こんな感じの結果が得られる

``` python
[('../data/text/dokujo-tsushin/dokujo-tsushin-4887920.txt', 0.8448764085769653), ('../data/text/dokujo-tsushin/dokujo-tsushin-6083306.txt', 0.7008811831474304), ('../data/text/livedoor-homme/livedoor-homme-5297934.txt', 0.6486650109291077), ('../data/text/dokujo-tsushin/dokujo-tsushin-4799908.txt', 0.6451865434646606), ('../data/text/dokujo-tsushin/dokujo-tsushin-5927658.txt', 0.6374314427375793), ('../data/text/dokujo-tsushin/dokujo-tsushin-6443618.txt', 0.627821147441864), ('../data/text/dokujo-tsushin/dokujo-tsushin-5453372.txt', 0.6207228899002075), ('../data/text/dokujo-tsushin/dokujo-tsushin-6661458.txt', 0.6123473644256592), ('../data/text/dokujo-tsushin/dokujo-tsushin-5665838.txt', 0.6056432723999023), ('../data/text/dokujo-tsushin/dokujo-tsushin-6624494.txt', 0.6007457971572876)]
```

似ている順に出力されるので、一番似ているのを見てみると、ちゃんと似ていた。

こんな感じで中身を見る。

``` python
print(open('../data/text/dokujo-tsushin/dokujo-tsushin-4887920.txt').read())
```
convnetjsとtensorflow その2

#概要
Sin問題をconvnetjsとtensorflowでやってみた。

#学習データの用意
データ
```
Math.pi * 4
```
ラベル
```
Math.sin
```
#モデルの作成
回帰	regression です。
##入力、出力
convnetjsの場合

```
{
   type: 'input',
   out_sx: 1,
   out_sy: 1,
   out_depth: 1
}
{
   type: 'regression',
   num_neurons: 1
}
```

tensorflowの場合

```
X = tf.placeholder(tf.float32, [None, 1])
Y = tf.placeholder(tf.float32, [None, 1])
```

##重みとバイアス
convnetjsの場合

```
{
    type: 'fc',
    num_neurons: 20,
    activation: 'relu'
}
{
   type: 'fc',
   num_neurons: 20,
   activation: 'tanh'
}
```

tensorflowの場合

```
w_h = tf.Variable(tf.random_uniform([1, 10], minval = low0, maxval = high0, dtype = tf.float32))
b_h = tf.Variable(tf.zeros([1, 10], dtype = tf.float32))
w_o = tf.Variable(tf.random_uniform([10, 1], minval = low1, maxval = high1, dtype = tf.float32))
b_o = tf.Variable(tf.zeros([1, 1], dtype = tf.float32))
```

#活性化関数を使う
convnetjsの場合

```
activation: 'relu'
activation: 'tanh'
```

tensorflowの場合

```
h = tf.nn.sigmoid(tf.matmul(X, w_h) + b_h)
out = tf.matmul(h, w_o) + b_o
```

#ロス値を定義
convnetjsの場合

```
stats.loss;
```

tensorflowの場合

```
loss = tf.nn.l2_loss(out - Y)
```

#最適化の方法定義
convnetjsの場合

```
var trainer = new convnetjs.Trainer(net);
```

tensorflowの場合

```
train_op = tf.train.AdamOptimizer().minimize(loss)
```

#セッションを定義して学習する。
convnetjsの場合

```
var point = new convnetjs.Vol(1, 1, 2);
point.w = pi;
stats = trainer.train(point, sin);
```

tensorflowの場合

```
sess = tf.Session()
sess.run(tf.initialize_all_variables())
for i in range(10001):
   sess.run(train_op, feed_dict = {
      X: trainx[start:end],
      Y: trainy[start:end]
   })
```
#テストデータで取り出す。
convnetjsの場合

```
var point = new convnetjs.Vol(1, 1, 2);
point.w[0] = pi;
var prediction = net.forward(point);
```

tensorflowの場合

```
yy = sess.run(out, feed_dict = {
    X: validx
})
```

#サンプルコード
convnetjsの場合
http://jsdo.it/ohisama1/gGSV
tensorflowの場合
https://github.com/ohisama/tensorflow-fizzbuzz