OmniAICreator/Qiita-1.07M huggingface dataset:
Python > inpbtとprint(inpbt)の出力の違い > [ 1.  2.  3.] / array([ 1.,  2.,  3.], dtype=float32)

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

TensorFlowのコードを実装中に持った疑問。

```py
>>> import numpy as np
>>> inpbt = np.array([1,2,3], dtype='f')
>>> print(inpbt)
[ 1.  2.  3.]
>>> inpbt
array([ 1.,  2.,  3.], dtype=float32)
```

learn_xxyyfunc_170321.pyというコードで実装して、print()でinput batchを出力した時に後者の`array(..., dtype=...)`の表記になる。

一方で、上記のようにinteractive mode(?)で実行時、print()を使った例では、`array`や`dtype`の表記は見られない。

短いスクリプトでも試しみた。

```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np

# on Python 2.7.6

inpbt = np.array([1,2,3], dtype='f')
print(inpbt)
```

```txt:実行
$ python test_python_170324a.py 
[ 1.  2.  3.]
```

Pythonスクリプト実行時に`array(..., dtype=...)`表記にするなんらかのオプションが有効になっているのだろうか。

```test_python_170324a.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np

# Python 2.7.6

inpbt = np.array([1,2,3], dtype='f')
print(inpbt)
alist = list([inpbt])
print(alist)
```

```txt:実行
$ python test_python_170324a.py 
[ 1.  2.  3.]
[array([ 1.,  2.,  3.], dtype=float32)]
```

list型を`[]`でかこった上にlist()でくくると`array(..., dtype=...)`表記になった。
Proxmox VE 5.0 beta1

2017/5/24 Proxmox VE 5.0 beta2 リリース

----

* https://www.proxmox.com/en/downloads
    * 5.0-5まではVM自動起動、バックアップイメージの不具合があるため、更新して 5.0-6/669657df 以降にすること。(2017/4/20確認)
* [リポジトリ](http://download.proxmox.com/debian/pve/dists/stretch/pvetest/binary-amd64/?C=M;O=D)

## 変更点

* debian8 -> 9
* kernel 4.4 -> 4.10
* インストーラーでNICの選択ができるようになった
* WebUIは変更ないっぽい。(BETAの記述あるくらい。)

![pve5.png](https://qiita-image-store.s3.amazonaws.com/0/25728/05ebd604-5ec8-7b3a-9f00-63ee13abb557.png)

## 問題点 (5.0-10で解決済み)

> Wide character in print at /usr/share/perl5/PVE/APLInfo.pm line 22, <DATA> line 755.

![backup.png](https://qiita-image-store.s3.amazonaws.com/0/25728/480e385a-0eab-63b3-41d4-e187f735f239.png)

![pveupdate.png](https://qiita-image-store.s3.amazonaws.com/0/25728/4b12894f-1f41-5ea1-a6aa-583d072cc7f8.png)

## 問題点 (5.0-6で解決済み)

### `Start at boot` : Yes で自動起動しない・・・。

* [VM won't auto-start Proxmox 5.0-2 | Proxmox Support Forum](https://forum.proxmox.com/threads/vm-wont-auto-start-proxmox-5-0-2.34222/)
* [Proxmox 5 beta OSD trouble... | Proxmox Support Forum](https://forum.proxmox.com/threads/proxmox-5-beta-osd-trouble.33757/)

![erro.png](https://qiita-image-store.s3.amazonaws.com/0/25728/5d533b6a-de78-a6f0-f441-fc011bfb8391.png)

* 手動で `Start` は可能。 

```
# m h dom mon dow command
@reboot /usr/sbin/pct start 111
@reboot /usr/sbin/pct start 112
@reboot /usr/sbin/qm start 113
```

### (解決済み)リストア失敗

* [Cannot restore VM backup image at 5.0beta1(5.0-5) : ERROR **: restore failed - wrong vma extent | Proxmox Support Forum](https://forum.proxmox.com/threads/cannot-restore-vm-backup-image-at-5-0beta1-5-0-5-error-restore-failed-wrong-vma-extent.33820/#post-167277)

> Problem seems solved with yesterday's updates from 5.x test repo, thanks a lot
技術英語 > Rather than [leaving it to chance], use try to wrap your code,

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2903 / 12833)

> Rather than **leaving it to chance**, use try to wrap your code, and except to provide the error handling:

leave it to the expertで「専門家に任せる」だが、上記の言い回しだと

http://ejje.weblio.jp/content/leave+to+chance
> 放置、運を天に任せる
Macおすすめ作業効率向上アプリ

最近はamazonでのwindow?ショッピングと作業効率アプリの探索がもっぱらの人生の楽しみな僕ですが，いままでMacを数年使ってきたなかで「これ使えるじゃん！」と思った作業効率アプリをメモ書き程度に書いておきます．

+ [Pocket](https://getpocket.com/)を追加しました　（2017/04/07）


# [Pocket](https://getpocket.com/)
「あとで読みたい！」と思った記事をワンクリックで登録出来るアプリ
Mac版アプリ，iPhone版アプリとChrome拡張がなんでもあるため，あとで読みたいと思った記事をすぐに保存できる
情報収集にめちゃくちゃ便利

# [SourceTree](https://www.sourcetreeapp.com/)
いわずと知れたgit管理用のGUI tool．
GUI上でfetch, pull, pushなどの基本コマンドが打ててdiffも非常に見やすい．
CUIもいいですが，それと同時にSourceTreeも使い始めると止められません．

# [CotEditor](https://coteditor.com/)
ちょっとしたメモに最適なEditor.
起動が速く，ストレスレスにメモできます．
各言語ごとにモードを切り替えられるので，ちょっとしたコーディングにも使えるかも．

# [Todoist](https://en.todoist.com/)
タスク管理の大御所．
サクッとTODOを登録できるのが一番のミソ．
iPhoneなど複数の端末で無料で同期できるのが本当に便利．
なんと無料！

# [LastPass](https://www.lastpass.com/)
1PassWordを以前は使っていたんですが，サブスクリプションが少々高めだったので乗り換えました．
無料ですが，複数端末での同期，ブラウザ連携，二段階認証など1PassWordと比べても特に劣っている印象は受けません．
一度使ってみることをオススメします．

# [Evernote](https://evernote.com/intl/jp/)
ノートツールの決定版．
プレミアム版では複数台の端末での同期が可能なので，僕のようにMac, iPhone, iPad, Androidといった各種端末を管理している人間からしたら必需品以外での何者でもない．
ローカルで保存していると何かと怖いですが，Web上にデータが保存されているのでそこら辺は安心．
データのexportも簡単なので，めっちゃおすすめです．
（僕は当然課金してます）

# [Spectacle](https://www.spectacleapp.com/)
ブラウザ，アプリの画面サイズをショートカットで変更できるアプリ．
最大化，右寄せ，左寄せなど自由にコマンドを割り当てられるので，なるべくキーボードから手を話したくないエンジニアの方にはぜひとも入れてもらいたいツール.

# [BetterTouchTool](https://www.boastr.net/)
最近有料になった本アプリ．
Windowsでは標準装備である，画面のマウス操作での最大化機能やスニップ機能などを実現．
300円前後だったはずなので，これからの作業ストレスを考えるとお釣りがくるくらい便利なツール．

# [Clipy](https://github.com/Clipy/Clipy)
コピーした文章を複数クリップボード上に保持出来るアプリ．
複数の文章を保存して貼り付ける場合などに大変大変重宝します．
無料なので，騙されたと思っていれてみてください．

# [HyperSwitch](https://bahoom.com/hyperswitch)
Cmd+Tabでのアプリスイッチをさらに便利にするツール．
デフォルトでは，finderなどは複数のwindowがあった場合でも１つのアイコンしか表示されませんが，これは各windowがそれぞれ表示されて，好きなwindowに移動できます．
各種細かい設定もできるので，とりあえずいれてみて問題はないです．

# [Go for Gmail](https://itunes.apple.com/us/app/go-for-gmail-email-client/id979538493?mt=12)
desktop版のgmailクライアントとしては現状で（当社比）最高のアプリ．
Macのタブ上にショートカットアイコンを表示して，未読メッセージ数などを簡単に確認できます．
メモリ使用量が玉にキズ．

# [Sequel Pro](https://www.sequelpro.com/)
DBをちょこっといじりたいとき，Table情報をちょこっと確認したいときに本当に役に立つアプリ．
GUI上でInsertやdeleteなどの各種操作やSQL文の実行・確認などができるので，コマンドラインとあわせてぜひ使ってほしい．

# [NoSleep](https://www.macupdate.com/app/mac/37991/nosleep)
学会発表やデモなどで非常に有用なツール．
自動的にMacがSleep状態になるのをボタン一発で防ぎます．

# [Dropbox](https://www.dropbox.com)
課金すべきツール第一位（当社比）．
月1200円で1TBものオンラインストレージを確保できます．
また，Dropbox内のフォルダやファイルはリンクを共有することで他人と共有することも可能に！
Mac内のlocalフォルダに対してシンボリックリンクを貼ったりしてバックアップするのもめっちゃ楽．
複数端末でのアクセスも簡単なので，正直課金しない意味がわからない（暴言）

# [Cyberduck](https://cyberduck.io/?l=en)
サーバ上にGUIからアクセスできるようにするツール．
ぱぱっとサーバに入ってファイルを参照したりするときにとても有用．
重く感じるときもありますが，historyやresolutionを弄れば大体解決．

---
その他，TweetdeckやSlack,Line,iTerm2など色々と紹介したいツールはありますが，とりあえずはここまで．

皆さんのオススメ作業効率化ツールについてもぜひおしえてください!!
SparkをEMRで使ってみたかった


下記サイトを参考、、というより、ほぼそのまま実施
http://www.atmarkit.co.jp/ait/articles/1609/27/news018.html


##CSV作成
csvをrubyで作成。s3にアップロード

##sbtプロジェクトを作成

```build.sbt

name := "SparkExampleApp"

version := "1.0"

scalaVersion := "2.11.7"

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "2.1.0",
  "org.apache.spark" %% "spark-mllib" % "2.1.0",
  "org.apache.spark" %% "spark-sql" % "2.1.0",
  "com.databricks" %% "spark-csv" % "1.4.0"
)

```

ソースコードは下記を丸コピ

https://github.com/nihitok/atmarkit-spark-articles/blob/master/src/main/scala/SparkExampleApp.scala

使用するsparkのspark-defaults.confに下記を追記


```spark-defaults.conf
spark.jars.packages  com.amazonaws:aws-java-sdk:1.7.4,org.apache.hadoop:hadoop-aws:2.7.3
```

##s3にフルアクセスできるユーザー作成
(若干ポリシー周りのUIが違うが気をつけて)

https://joppot.info/2014/06/14/1621

アクセスキーとシークレットキーをコピーしておく

先ほどのSparkExampleApp.scalaにアクセスキーとシークレットキーを貼り付け

##実行
ローカルで実行

```
./bin/spark-submit --class SparkExampleApp --master local ｛自分の作成したjarファイルのpath｝ ｛S3に配置したdata.csvのパス） ｛S3の保存先のパス｝
```

下記みたいな感じになる

```
./bin/spark-submit --class SparkExampleApp --master local ~/Desktop/SparkExampleApp/target/scala-2.11/spark-sample-project_2.11-1.0.jar s3n://my-bucket-name/data.csv s3n://my-bucket-name/output.csv
```

マシンの性能が足りないとtmpファイルがs3にアップロードされる

EMRではしっかり動くのであとは最初の記事通り設定すればOK

![スクリーンショット 2017-03-24 2.51.33.png](https://qiita-image-store.s3.amazonaws.com/0/91271/64f6e9a0-5950-e956-0a75-dc33008a13e6.png "スクリーンショット 2017-03-24 2.51.33.png")
ASP.Net Core Identity でログインユーザIDを取得

探してもなかなか見つからなかったので自分用メモ。
コントローラクラスの引数に `IHttpContextAccessor` のインスタンスを渡して `httpContextAccessor.HttpContext.User.FindFirst` メソッドで探すらしい。あまり理解してません。

戻り値の型は `Claim` で、 `Claim.Value` でユーザIDが取得できる。未ログインの時には null が返ってくるのでチェックが必要。

下記のコードはログインしているかどうかチェックして、未ログインの時にはホーム画面にリダイレクト、ログインしているときには何かクエリを実行してビューに渡す例です。一応自分の環境では動作しました。

```CSharp

class SomeController : Controller {

  private readonly Claim _claim;

  // コンストラクタ
  public SomeController(IHttpContextAccessor httpContextAccessor)
  {
    _claim = httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier);
  }

  // GET:
  public async Task<IActionResult> Index()
  {
    if(_claim == null)
    { // ログインしてないときにはホーム画面にリダイレクト
      return RedirectToAction("Index", "Home");
    }

    // ユーザID取得
    string userId = _claim.Value;

    // ユーザIDを使ってクエリとかして...
    var query = // ...

    // ビューに渡す
    return View(await query.ToListAsync());
  }
```

## 参考にしたリンク

- http://stackoverflow.com/questions/36641338/how-get-current-user-in-asp-net-core

## その他参考

こちらのQAだと Controller.User を使っている。こちらの方がコードがシンプルかも。

- http://stackoverflow.com/questions/38751616/asp-net-core-identity-get-current-user
Kaggleの「Titanic: Machine Learning from Disaster」にニューラルネットワークを適用する（続き）

#はじめに

前回、tensorflowを使ってKaggleの「Titanic: Machine Learning from Disaster」にアプローチしました。そこで、次にモデルのチューニングを試みましたので報告します。
前回は、ベースモデルの作成が目的だったため、過学習のことは意識しませんでしたが、今回はモデルのチューニングなのでトレーニングデータとテストデータに分けて評価します。

まず、前回のモデルについてトレーニングデータ80％とテストデータ20％に分けて正解率を算定します。結果は以下の通りでした。

　トレーニングデータ　：　79.72％
　テストデータ　　　　：　79.68％

この値がベースとしてモデルのチューニングでどの程度まで改善できるのかを確認します。

#モデルの変更点

まず、隠れ層として１層追加します。問題は隠れ層のノード数です。検索しましたが、指針のようなものを見つけることができませんでした、今回の特徴量は８つで、そのうち、５つはカテゴリーデータ（One-Hot化したもの）なので、連続値のことを無視すると、最大で2の5乗（32）の組み合わせが理論上、あることになります。隠れ層がこの32の組み合わせが抽象的な特徴量にまとめられると仮定して、この32種類がどのくらいになるのかと考えます。
とりあえず、1/2に相当する15と1/3に相当する10、ミニマムサイズの2を試して、そこから前後を調べながらチューニングすることにします。
前回は出力層は1つとしてsigmoid関数の結果から生存・非生存を判定することにしていましたが、今回は2つにしてsoftmax関数で確率値にしたもので判定するものに変更します。したがって、損失関数も変更します。
ウェイトの初期値の設定もゼロ固定からランダム（tf.truncated_normal）にしました。
以上をコードにします。

```

# データの準備
y = pd.get_dummies(data['Survived']).as_matrix()
x = Merge_data.drop('Survived',axis=1).as_matrix()


x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=3)
       
# モデルの定義
# 変数の定義
node_num =15　♯この値を適宜変更する

feature = tf.placeholder(tf.float32, [None, 8])
label = tf.placeholder(tf.float32, [None, 2])
w0 = tf.Variable(tf.truncated_normal([8, node_num]))
b0 = tf.Variable(tf.zeros([node_num]))
w1 = tf.Variable(tf.truncated_normal([node_num,2]))
b1 = tf.Variable(tf.zeros([2]))


# モデルの本体
f0 = tf.matmul(feature, w0) + b0
p0 = tf.nn.sigmoid(f0)
f1 = tf.matmul(p0 , w1) + b1
p1 = tf.nn.softmax(f1)

# 学習
# 準備

loss = -tf.reduce_sum(label*tf.log(p1))                            # 損失関数
train_step = tf.train.AdamOptimizer().minimize(loss)              # 最適化手法

```

学習回数は50,000回としてみました。（前回が5,000回だったので単純に10倍）
コードは以下のとおりです。

```

# 初期設定
sess = tf.Session()
sess.run(tf.global_variables_initializer())

result_data = np.zeros([500,node_num])
i = 15
for _ in range(50000):
    i += 1
    sess.run(train_step, feed_dict={feature : x_train, label:y_train})

predict = sess.run(p1 , feed_dict={feature:x_train , label : y_train})
pre_label = np.argmax(predict,axis=1)
res=metrics.accuracy_score(pre_label,np.argmax(y_train,axis=1))
print ('Train Accuracy : %f' % res)

predict = sess.run(p1 , feed_dict={feature:x_test , label : y_test})
pre_label = np.argmax(predict,axis=1)
res=metrics.accuracy_score(pre_label,np.argmax(y_test,axis=1))
print ('Test Accuracy : %f' % res)
```

結果は、以下の通りです。

ノード数２
Train Accuracy : 0.831874
Test Accuracy : 0.818182

ノード数10
Train Accuracy : 0.875657
Test Accuracy : 0.825175

ノード数15
Train Accuracy : 0.872154
Test Accuracy : 0.825175

ノード数10で、テストデータで82.5％とチューニング前よりも改善しました。また、過学習もなく、いい感じです。

♯評価
隠れ層の追加で改善できました。さらに細かいチューニングをすればテストデータで85％も夢ではないかもしれません。このあたりがtensorflowのモデル化に利点と言えるでしょう。
ただし、コード量がかなり多くて面倒です。skit-learnのライブラリーを使えば数行で済みます。改善したければ、モデルそのものをロジスティック回帰からSVMやベイズに差し替えるほうが簡単かもしれません。
また、処理に結構時間を必要とします。自分の家庭用ノートPCだと1分くらいの時間が必要でした。（学習回数に依存）待つの嫌であれば、tensorflowは適合していないと思われます。

最後にモデルの解釈が難解です。一番の困るのが「隠れ層」です。隠れ層がどういう意味を持っているのかを解釈できないと、第3者にモデルの説明をすることはほぼ不可能です。勝手に特徴量を抽象的な特徴量にまとめているとしましたが、隠れ層がそのような意味のものとは限らないので困ります。
今回の隠れ層の意味でわかったことがあれば投稿します。
PythonでMIMEタイプを取得してファイルの形式を判定

PythonでファイルのMIMEタイプを取得する方法です。
これによって、入力されてきたファイルの形式で判断して動作を変えることが出来ますね。
# 取得

```python
import mimetypes
mime = mimetypes.guess_type(ファイルのパス)
print(mime) # => (MIMEタイプ, エンコード形式)
```
たったのこれだけです。
エンコード形式の部分には、gzipで圧縮されたファイルだったりするとなにか値が出ますが、基本的にNoneとなります。

# ファイルの形式によって動作を変える
簡単な例として、Markdownファイルだけ受け付けるとしましょう。
それ以外のファイルが入力されてきたら、エラーメッセージを出します。

```python:markdown.py
import mimetypes
import sys

input = sys.argv[1]
mime = mimetypes.guess_type(input)

if mime[0] = "text/markdown":
    print("お前はMarkdownファイルだな!")
else:
    print("{mime}のタイプのファイルはあっちいけｼｯｼｯ!".format(mime=mime[0]))
```
実行すると...

```bash
$ python3 markdown.py hoge.md
お前はMarkdownファイルだな!
```
```bash
$ python3 markdown.py fuga.jpg
image/jpegのタイプのファイルはあっちいけｼｯｼｯ!
```
C++でint型の割り算をしたときのミスを減らす方法

私は仕事で，c++を使って数値計算をするのですが，そうすると，良く1/2とかが出てきます．当然コード上に打つのですが，そうすると，たまにint型同士の割り算になってしまい，1/2が0になってしまうことがあります．
そこで，私は数字を打つときには，たとえ整数であっても.0を付けるようにしています．これで，不意にint型同士で割り算してしまうことを防げます．

以下に例を示します．

```C++:
#include <iostream>
int main() {

	double a;

	a = 5.0 * (1.0 / 4.0);
	std::cout << a << std::endl;//1.25　良い

	a = 5.0 * (1.0 / 4);
	std::cout << a << std::endl;//1.25　良い．4はint型だが，1.0がdouble型のため．

	a = 5.0 * ( 1 / 4 );
	std::cout << a << std::endl;//0 ミス．これは1/4がint型で割り算をされているから．

	return 0;
}
```

2017年3月26日追記
コメントをもらいました．ありがとうございます．
最終的な計算結果の型を判断するだけではなかなか分からないことがあります．私がやるような数値計算は基本的にすべてdouble型なのですが，数字を直打ちする様なところはどうしてもint型に解釈されてしまうところがあります．
では，直打ちしないで，

```C++:
#include <iostream>
	int main() {

	double a = 1;
	double b = 4;
	double c = 5;;
	double y = c * (a / b);;
	std::cout << y << std::endl;//1.25 一応okだが美しくない．

	return 0;
}
```
こうしてしまえば，計算結果には問題無いのですが，これでは教科書的には美しくありませんし，別のバグを誘発する恐れがあります．
例えば，教科書に，

```math
y=c^{\frac{1}{4}}
```

なんて書かれていたらソースコードにも同じように書きたいわけです．ここでは，以下の書き方とは微妙にニュアンスが違うのです．

```math
y=c^{0.25}
```

とでも書いてしまうと，1/4と言う書き方に物理的な意味があったり，工学的な意味があったりすることがあるのでソースコードに書くときも，可能な限り教科書や参考文献の書き方をそのまま使いたいのです．
いまは，一行だけで書ける式ですが，数行にわたる式を書くことなんてざらにあります．そういうときに，定数を打ち込む箇所は何カ所も出てきます．
と言うときにたとえ少し面倒でも，数字を打ち込むときは1.0とか4.0と言うように，確実にdouble型にしておきます．
numpy.array を「だいたい等しく」分割する(numpy.array_split)

# numpy.split と numpy.array_split

個人的に、multiprocessing で並列処理を行う時に多用しています。

numpy.array の分割には、numpy.split と numpy.array_split の2つがあります。

```
# coding: utf-8

import pandas as pd
import numpy as np

X = np.array([[1,2],[2,3],[3,2],[4,6]]) 
```
numpy.split だと等分割します。

```
np.split(X,4)
```
```
[array([[1, 2]]), array([[2, 3]]), array([[3, 2]]), array([[4, 6]])]
```
しかしながら、等分割にならなければエラーになります。
上の例だと、np.split(X,3) だとエラーになります。

ですが、numpy.array_split だと等分割にならなくても分解してくれます。

```
np.array_split(X,3)
```

```
[array([[1, 2],[2, 3]]), array([[3, 2]]), array([[4, 6]])]
```

特に役立つのは、並列処理でデータを分割する必要がある場合かと。
また、データフレームもdf.valuesでarrayになるので、データフレームを分割して処理する際にも便利だと思います。
Accessで必ず使うVBA 全テーブル、クエリ、レポート、フォームを無変更で閉じる

```AllObjectClose.BAS
Sub AllObjectClose() 
'QiiQ From Qiita
'This Macro To Close Opened Tabels Queries Reports Forms on Current Database.
Dim db As dao.Database: Set db = CurrentDb
Dim rs As dao.Recordset
Dim tdf As dao.TableDef
Dim fld As dao.Field
Dim rpt As Access.Report, objForm As Access.Form
Dim myNo As Long
Dim fldName As String
Dim Qtb As dao.QueryDef
Dim i As Long, i1 As Long
If MsgBox("開いているTable,Query,Report,Formを無変更で閉じます(acSaveNo)。キャンセルで中止します", vbOKCancel + vbCritical, "確認") = vbCancel Then Exit Sub

For Each rpt In Application.CurrentProject.AllReports
If SysCmd(acSysCmdGetObjectState, acReport, rpt.Name) <> 0 Then
DoCmd.Close acReport, rpt.Name, acSaveNo
End If
Next

For Each objForm In Application.CurrentProject.AllForms
If SysCmd(acSysCmdGetObjectState, acForm, objForm.Name) <> 0 Then
DoCmd.Close acForm, objForm.Name, acSaveNo
End If
Next

For Each Qtb In db.QueryDefs 'Opend Query Close NoSave
If SysCmd(acSysCmdGetObjectState, acQuery, Qtb.Name) <> 0 Then
DoCmd.Close acQuery, Qtb.Name, acSaveNo
End If
Next

For Each tdf In Application.CurrentDb.TableDefs 'Opend Table Close NoSave
If SysCmd(acSysCmdGetObjectState, acTable, tdf.Name) <> 0 Then
DoCmd.Close acTable, tdf.Name, acSaveNo
End If
Next

End Sub
```

##使用方法
このマクロはかなりAccessで使います。というのも今開いているテーブルを閉じないとエラーになったりするからです。
ACCESSのVBAの冒頭では必ずこのマクロを噛ませます。
つまり Call AllObjectClose
を書くのです。
このようにすることで、そのあと、安全にマクロを動かすことができます。
なお、変更があっても変更は無視して閉じます。つまり変更は反映されません。

##それにしても変数とFor Eachは
Dim rpt As Access.Report, objForm As Access.Form

この変数の宣言のしかた、

For Each rpt In Application.CurrentProject.AllReports
For Each objForm In Application.CurrentProject.AllForms
この For Eachの指定の仕方はおもいつかないですね。Allがつくなんて。

##閉じる順番は迷っています
とりあえずレポート、フォーム、クエリ、テーブルの順で閉じています。テーブルの無変更終了は他のオブジェクトに影響を与える可能性があるため一番最後でしょう。
[Mac] Automator を使って Finder 上から直接ファイルの内容をクリップボードにコピーする

# 動機
「Git で clone してきたサンプルコードをちょっとコピペして試してみたい...」 ときに、毎回エディタ上でファイルを開いてからコピーするのは面倒くさい。

なので、Mac で Finder 上から直接ファイルの内容をクリップボードにコピーする方法を調べてみた。

OSX Yosemite 10.10.5 で動作確認を行ったが、恐らく他のバージョンでも動くと思う。

# 方法
結論としては、Automator を使えば簡単に実現できる。

*  まず、アプリケーション ディレクトリの中の Automator (/Applications/Automator.app) を起動しよう。
以下のようなアイコンが目印。

<img width="87" alt="Automatorアイコン.png" src="https://qiita-image-store.s3.amazonaws.com/0/96400/025cd042-5e53-8a4c-5055-6246895988e2.png">

*  Automator が起動したら、新規書類を作成する。すると、以下のようなウィンドウが表示されるので、**サービス** を選択状態にして **選択** ボタンをクリックする。

<img width="1112" alt="新規書類ウィザード.png" src="https://qiita-image-store.s3.amazonaws.com/0/96400/3381d786-9e9e-1a9d-ee10-5faed3499585.png">

*  Finder 上でファイルの内容をクリップボードにコピーするワークフローを作成する。ウィンドウ左側の **ライブラリ** から **ユーティリティ** を選択し、その隣のメニュー中にある **シェルスクリプトを実行** という項目を、ウィンドウ右側の "ワークフローを作成するには、ここにアクションまたはファイルをドラッグしてください。" というメッセージが表示されているエリアにドラッグ＆ドロップしよう。

*  続いて、以下の設定を順番に行う。
    -  **"サービス"は、次の選択項目を受け取る** を **ファイルまたはフォルダ** に設定する。
    -  **検索対象** を **Finder** に設定する。
    -  **入力の引き渡し方法** を **引数として** に設定する。
    -  実際に実行するシェルスクリプトの内容を、以下のように設定する。

```bash
cat $@ | LC_CTYPE=UTF-8 pbcopy
```

（ここでは `LC_CTYPE=UTF-8` を指定することでロケールの文字コードを UTF-8 に設定している。Automator でシェルスクリプトを実行する際にはロケールの設定が行われていないため、このようにロケール情報を設定しておかないと日本語が文字化けした状態でコピーが行われてしまう。）

*  以上の設定が行えたら、**ファイル** メニューから **保存...** を選択し、このワークフローを保存しよう。
    -  保存する際、名前に日本語が含まれていると正しく認識されないようなので、名前は英語で入力するのが無難。

*  以下にここまでの全作業を行った後の状態を示す。
    -  シェルの設定が `/bin/zsh` になっているが、これは僕の環境のデフォルトのシェルが zsh であるだけなので、合わせる必要はない。シェルの設定を特に行っていない場合には `/bin/bash` などになるだろう。

<img width="1112" alt="完成図.png" src="https://qiita-image-store.s3.amazonaws.com/0/96400/d11125e8-4c8d-4fbd-05c0-b279e06faadf.png">

*  これにより、Finder 上でコンテキストメニューから選択したファイルの内容を直接クリップボードにコピーすることができるようになった。

<img width="673" alt="コンテキストメニュー.png" src="https://qiita-image-store.s3.amazonaws.com/0/96400/64ca91f7-7f36-0b7a-bec5-ff0c916075dc.png">

# 参考

* [OS_X、プレーンテキストでコピーする方法](http://ringosuki.hateblo.jp/entry/2012/04/30/OS_X%E3%80%81%E3%83%97%E3%83%AC%E3%83%BC%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%A7%E3%82%B3%E3%83%94%E3%83%BC%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
*  [Miscellaneous](http://osxnotes.net/miscellaneous.html)
Node jsでHello WorldをVPSにデプロイする

# nodejsのインストールは、省略

##mac
```
brew install nodejs
```

##ubuntu
```
sudo apt-get install nodejs
sudo apt-get install npm
```


# node js で Hello Worldを書く。

```js:hello.js
var http = require('http');

var server = http.createServer(function( request, response){
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end("Hello World\n");
});

server.listen(8000);

console.log("Server running at http://localhost:8000/");
```

動かしてみる
```
node hello.js
```

ブラウザで、`localhost:8000`を開くと、hello worldが見えるはず！
チョー簡単。




# flight plan

## server
daemon化するためのforeverをインストール

```bash
npm install -g forever
```


## local 

### install flightplan

```bash
npm install -g flightplan
```

### config file

```js:flightplan.js
// flightplan.js
var appName = 'sample-node-app';
var username = 'yourusername'
var plan = require('flightplan');

// configuration
plan.target('staging', {
  host: 'yourdomain.com',
  port: <your ssh port>,
  username: username,
  agent: process.env.SSH_AUTH_SOCK
});

plan.target('production', [
  {
    host: 'yourdomain.com',
    port: <your ssh port>,
    username: username,
    agent: process.env.SSH_AUTH_SOCK
  }
]);

```


### deploy

```bash
fly production
```
postgresql基本操作 + DBに他のユーザ(Superuser以外)からアクセスできないようにする

デフォルトでは、`psql postgres`でログインできる


# User関係

1. User作成
    test_userというUnixUserがいるとして、

    ```
    create user test_user with password 'password';
    ```
    これによって、`test_user`というroleもできる
1. roleの確認

    ```
    \du
    ```
    結果

    ```
                                         List of roles
      Role name       |                         Attributes                         | Member of
----------------------+------------------------------------------------------------+-----------
postgres             | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 test_user            | Superuser, Create role, Create DB                                               | {}

    ```
1. CurrentUserをチェックする

    ```
    select current_user;
    ```

1. SuperUserにする

    ```
    ALTER USER myuser WITH SUPERUSER;
    ```

1. test_userをmd5認証にする

    Postgresでは、デフォルトでUnixのUser名と同じでないといけない（peer）という認証方法なので、test_userというUnixユーザ名以外の人は、このUserを使えない。そこで、`/etc/postgresql/9.5/main/pg_hba.conf`を編集して、unixユーザ名が異なるユーザでもtest_userを使ってログインできるようにする(md5)

    ```:2行目を追加
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    local   all             test_user                               md5
    # "local" is for Unix domain socket connections only
    local   all             all                                     peer
```
    これで、権限のあるDBには、以下のコマンドでログインできるようになる。（今の時点では、DBの権限が一つもないので、入れない）

    ```
    psql -d <db_name> -u test_user -W
    ```

1. あるDBの権限をUserに与える（psql postgresからログインして権限を与える）

    権限を与える
    ```
    GRANT connect on database test_db to test_user;
    ```

    権限がちゃんと与えられたかチェック (dbリストを表示して　Access PrivAccess Privilegesにtest_userがいるのを確認)

    ```
    \l
    ```

    これで、上記のtest_userは以下のコマンドでログインできるようになる。

    ```
    psql -u test_user -d test_db
    ```

1. DBにはつなげるがテーブルの中身が見れない

    以下のコマンドで`test_table`にアクセスできるようにする。
    ```
    GRANT ALL PRIVILEGES ON TABLE test_table TO test_user;
    ```
　　（全部のテーブルを可能にするやり方は調べてない…）

# DB関係の操作

1. DB作成/削除

    ```
    create database test_database;
    drop database test_database;
    ```


1. PublicからのAccessをなくす

    ```
    REVOKE ALL ON DATABASE test_database FROM PUBLIC;
    ```
    RoleがSuperUserのUserは、Accessができる。

    SuperUser以外では、以下のようにアクセス出来ないようになる
    ```
    select * from users;
    ERROR:  permission denied for relation users
    ```


1. あるDBへ移行する(mysql でいう`use <database name>;`)

    ```
    \c test_database
    You are now connected to database "test_database" as user "test_user".
    ```
複数のComboBoxをFor文で回す方法

ユーザーフォームにコンボボックスを複数作った際
ループを回してすべてのコンボボックスに対して同じ処理を行う方法がわからなかったが
以下でできるようになった。

```vbnet
    For i = 1 To 5
        Me.Controls("ComboBox" & i).AddItem 0 
    Next
```

【参考URL】
http://www.moug.net/tech/exvba/0090067.html
centos7 で epel リポジトリが入らない

`nginx`, `php-fpm` を入れようとしてグダグダしたのでメモ。

`remi` を追加する際に以下のようなエラーではじかれた。

```
$ rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
    epel-release = 7 is needed by remi-release-7.3-1.el7.remi.noarch
```

`epel-release` のバージョンが `7` のものが必要そうなので入れようとする。

```
$ yum install epel-release
No package epel-release available.
Error: Nothing to do
```

What...

ってことで、`wget` で直接取りにいった。(今回とりあえずホームディレクトリへ)

```
$ wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-12.noarch.rpm ~/
```

次に`rpm`で展開

```
rpm -ivh ~/epel-release-7-9.noarch.rpm 
```

これで `epel` が入りやした。

以上。

検索用キーワード

centos7 nginx php-fpm yum epel epel-release remi
vagrantコマンドでnot accessibleエラーが出たときの対処

## 環境
・Windows 10 Pro
・Vagrant 1.9.2

## エラー
vagrantコマンド実行すると以下のエラーが発生する。
<pre>
Vagrant failed to initialize at a very early stage:

The home directory you specified is not accessible. The home
directory that Vagrant uses must be both readable and writable.

You specified: C:\HashiCorp\Vagrant
</pre>

## 対処
C:\HashiCorp\Vagrant フォルダの変更権限を付与する！
![SnapCrab_NoName_2017-3-23_14-54-8_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/76758/7d04b7af-eb98-c71e-9ff4-c705ddf40652.png)
Open JDKのARMの処理性能が低かった話


# Open JDKのARMの処理性能が低かった話

Open JDKのARM版を使用したら、intel版に比べて処理速度が遅いという事象が発生したので、
そのときの調査内容、および参考にしたサイトについて記載。

※ただし、処理性能が低い根本的な原因の究明にまでは至っていない

# JDK(Java Development Environment)とは
Java用の開発パッケージ。
JRE(Java Runtime Environment : Java用のプログラムを実行する環境)に加え、
Java用のコンパイルなどの開発用のソフトウェアが入っている。

JREには、
JVM(Java Virtual Machine : Javaのプログラムを動作させる仮想環境)や
Java用のAPI(Application interface)が入っている。

http://qiita.com/chkkchy/items/3a4594645b3aef7a98b7

# Oracle JDK
Oracle社が開発したJDK。
商用での利用は有料。

A. COMMERCIAL FEATURES.の欄にそれらしきことが記載されている↓
http://www.oracle.com/technetwork/java/javase/terms/license/index.html

# Open JDK
Oracle以外の企業も開発に参加しているオープンソース版のJDK。

JDK7以降は、Open JDKもOracle JDKも基本的には同じで、
普通にプログラミングする程度なら特に変わりはない。



# Open JDKはCPUがARMだと処理性能が低い？

下記のサイトによると、Open JDKはARM向けに最適化されていないので、
Oracle JDKに比べて、処理性能が低いとの記載がある。
※ Oracleのサイトなので、Oracle贔屓になっているのかもしれないが

https://blogs.oracle.com/jtc/entry/comparing_arm_linux_jvms_revisited

# 動作比較
実際に実機でARM環境で、Open JDKとOracle JDKでJavaのプログラムを実行したところ、下記の結果が得られた。

* Open JDK版は、処理速度が非常に遅い
* Open JDK版は、CPU使用率が非常に高い。

# コードキャッシュの削除による処理速度低下の可能性

Javaのコードキャッシュ(コンパイルされたコードを一時的に保存する領域)、のサイズがデフォルト設定だと小さいため、上限を超えた際にJavaの機能により、コードキャッシュが削除されてしまい、
その都度コンパイルをするため、処理が遅くなるという事象があるようだ。

http://blog.cybozu.io/entry/2016/04/13/080000

# コンパイル自体が実行されていない?
jstatコマンドでコンパイル状態を確認したところ、
Open JDKだと全くコンパイルが行われていない状態だった。

```
* JITコンパイルされたタスクの累積を表示
jstat -compiler ${JAVA_PID} 表示間隔(ミリ秒)

* JITコンパイルされたメソッドを表示
jstat --printcompilation ${JAVA_PID} 表示間隔(ミリ秒)

https://docs.oracle.com/javase/jp/6/technotes/tools/share/jstat.html

```

下記のサイトでは、下記の用にJavaの起動オプションでコードキャッシュを削除する機能を無効にしたところ、処理遅延が改善したと記載されている。

当方の環境では、上記対応をしてもコンパイルがされない状態が続いた。

http://blog.cybozu.io/entry/2016/04/13/080000


```
* Javaのオプションの初期値を表示し、コードキャッシュが有効になっていた場合、オプションを指定してコードキャッシュの削除を無効に
java -XX:+PrintFlagsFinal -version

* コードキャッシュの削除を無効
-XX:-UseCodeCacheFlushing
```

理由は分からないが、Javaのオプションの中には特定のCPU専用のオプションがあるが、
そのオプションが影響して、ARM版ではそもそもコンパイルがされない状態になっている可能性がある?


# 参考

* [javaのオプション確認](http://etc9.hatenablog.com/entry/2016/05/11/012037)
* https://docs.oracle.com/cd/E22646_01/doc.40/b61441/optionxx.htm
sympyで部分分数展開の複素根は計算できない？

何かいい方法は、ありますか？よろしくお願いします。

```python
from sympy import *
var("x")
f=1/(1+x^2)
g=factor(f,extension=I)
print(g)
print(aprt(g))
#　1/((x - I)*(x + I))
```
(参考)【 Python で 部分分数展開 】＞複素根は計算できない？（部分分数展開が途中で止まっている）
http://qiita.com/HirofumiYashima/items/5c4f31c14a748d5b0b0b
(参考)あらきけいすけの雑記帳＞複素関数を知っている人は
http://d.hatena.ne.jp/arakik10/20050326/1111842127
(参考)Wolfram|Alpha: Computational Knowledge Engineで
https://www.wolframalpha.com/input/?i=1%2F(1%2Bx%5E2)
(参考)Integral of 1/(x^2+1) - Proof using complex numbers
https://youtu.be/NqI8_ieh2UA
【初心者投稿-8】progate_挫折の予感

#昨日までのおさらい
有料会員に手を出す気がなかった私がついに…半日の検討の結果手を出すことに！
progateのすべてを手に入れて満足しましたが、まずは１ヵ月使い切ってやる！

#挫折の予感
実戦モードになるとぜーんぜんわからない…。
今まで数学でも"わからなかったらすぐ答え見るタイプ"でした。

でも、答えとclass名の割り振りが違うと、そもそも何が間違っているのかわかりづらい上に、htmlの方の答えをコピペしたところで、cssも変えなきゃいけない。。。

今のままじゃ時間だけが経って全然道場コースが進まないぞ…。

…なので自分はまず中級コースまでやってしまってからまとめて道場コースをやることにします！
htmlとcssの仕組みや関わり方にまずは慣れようと思います。

…これでいいのか？？？

#学習の記録
* Progate6日目
* 今日の勉強時間：1時間15分
* 総学習時間：7時間10分
* 今日学んだこと：わからないとすぐ答えを求めるせっかちな性格はダメということ。我慢強さ。辛抱強さ！これが大事。
IEで NodeList を forEach するとエラーになる問題の対処方

原因はIEがサポートしていないから。

jQuery のセレクターはやめて、document.querySelectorAll でDOM要素を取得し、取得した数だけループして何か処理をしたい際、IEでは動かなかった（サポートされていなかったのを知らなかった...）ので、その解決方法のメモ。

# やりたいこと
何かの要素が複数個あり、それらを取得。
取得した数だけ、別の処理を行いたい。

```html:html
<ul>
  <li class="js-get_listItems">item0</li>
  <li class="js-get_listItems">item1</li>
  <li class="js-get_listItems">item2</li>
</ul>
```

# Chromeでは動くのであまり気にしていなかった書き方
`querySelectorAll` で取得した NodeList　に対して `NodeList.forEach()` でループ処理する方法。これはIEでは動作しないです。

```js:javascript
var nodelist = document.querySelectorAll('.js-get_listItems');

nodelist.forEach(function(elem, index){
  elem.textContent = "アイテム" + index;
});

//item0　→ アイテム0 に書き換えしている
//item1　→ アイテム1 に書き換えしている
//item2　→ アイテム2 に書き換えしている

```

MDN：NodeList.forEach()
https://developer.mozilla.org/ja/docs/Web/API/NodeList/forEach

記事の下あたりにInternet ExplorerはNo supportと記述があります。

# for...of ではEdgeならOK。それ以前（IE11ではダメ）

MDNにある方法。
`for...of ループであれば、NodeList オブジェクトを正しく扱うことができます。`
https://developer.mozilla.org/ja/docs/Web/API/NodeList

```js:MDNに記載されている方法
var list = document.querySelectorAll( 'input[type=checkbox]' );
for (var item of list) {
  item.checked = true;
}
```

と記述があるが、IE Edge　から利用可能。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for...of

つまり、IE１１では動作してくれない。。

# 回避策
```js:javascript
var nodelist = document.querySelectorAll('.js-get_listItems');

var node = Array.prototype.slice.call(nodelist,0); 
node.forEach(function(elem, index){
  elem.textContent = "アイテム" + index;
});
```

`NodeList`で取得したものを`Array.prototype.slice.call`で配列として取り出し、`Array.prototype.forEach()`でループ処理する方法。

stackoverflowに投稿がありました、なるほど。
http://stackoverflow.com/questions/13433799/why-doesnt-nodelist-have-foreach
MapStructでBeanマッピング その2

前回の続き
http://qiita.com/kentama/items/09a8573bd5d0831b470e


# 複数のBeanから一つのBeanを作成

```java:Bean
public class Hoge {
    private String hoge1;
    private String hoge2;
    private String hoge3;
    private String hoge4;

    // constructor/getter/setter
}

public class Fuga {
    public String fuga1;
    public String fuga2;

    // constructor/getter/setter
}

public class Piyo {
    public String piyo1;
    public String piyo2;

    // constructor/getter/setter
}
```

## Mapperの作成

`@Mapping` source属性でどのBeanのフィールドを使用するか指定する。

```java
@Mapper
public interface HogeMapper {
    HogeMapper INSTANCE = Mappers.getMapper(HogeMapper.class);

    @Mapping(target = "hoge1", source = "fuga.fuga1")
    @Mapping(target = "hoge2", source = "fuga.fuga2")
    @Mapping(target = "hoge3", source = "piyo.piyo1")
    @Mapping(target = "hoge4", source = "piyo.piyo2")
    public Hoge map(Fuga fuga, Piyo piyo);
}
```

## 実行

```java
Fuga fuga = new Fuga("a", "b");
Piyo piyo = new Piyo("c", "d");
Hoge hoge = HogeMapper.INSTANCE.map(fuga, piyo);

System.out.println(hoge.getHoge1()); // a
System.out.println(hoge.getHoge2()); // b
System.out.println(hoge.getHoge3()); // c
System.out.println(hoge.getHoge4()); // d
```

---

# 作成済みのBeanを更新する

## Mapperの作成
更新対象の引数に `@MappingTarget` を付与する。

```java
@Mapper
public interface UpdateMapper {
    UpdateMapper INSTANCE = Mappers.getMapper(UpdateMapper.class);

    @Mapping(target = "hoge1", source = "fuga1")
    @Mapping(target = "hoge2", source = "fuga2")
    @Mapping(target = "hoge3", source = "fuga1")
    @Mapping(target = "hoge4", source = "fuga2")
    public void updateHogeFromFuga(Fuga fuga, @MappingTarget Hoge hoge);
}
```

##　実行

```java
Fuga fuga = new Fuga("a", "b");
Hoge hoge = new Hoge("1", "2", "3", "4");
UpdateMapper.INSTANCE.updateHogeFromFuga(fuga, hoge);

System.out.println(hoge.getHoge1()); // a
System.out.println(hoge.getHoge2()); // b
System.out.println(hoge.getHoge3()); // a
System.out.println(hoge.getHoge4()); // b
```

---

# カスタムメソッドの追加
## defaultメソッドを使用した方法
defaultメソッドを定義し、独自のマッピングメソッドを追加することができる。

```java
@Mapper
public interface FooBarMapper {
    FooBarMapper INSTANCE = Mappers.getMapper(FooBarMapper.class);

    default Bar fooToBar(Foo foo) {
        Bar bar = new Bar();
        bar.setBar1(foo.getFoo1());
        bar.setBar2(foo.getFoo2());
        return bar;
    }
}
```

## 抽象クラスを使用した方法
これまでインターフェイスクラスで作成してきたが、抽象クラスでも作成可能。

```java
@Mapper
public abstract class FooBarMapper {
    public Bar fooToBar(Foo foo) {
        Bar bar = new Bar();
        bar.setBar1(foo.getFoo1());
        bar.setBar2(foo.getFoo2());
        return bar;
    }
}
```

利用する際には、インスタンスを明示的に作成する必要がある。

```java
FooBarMapperImpl mapper = new FooBarMapperImpl();
Bar bar = mapper.fooToBar(new Foo("あいうえお", "かきくけこ"));

System.out.println(bar.getBar1()); // あいうえお
System.out.println(bar.getBar2()); // かきくけこ

```


続きは次回。
ransackとenum_helpを用いた際の柔軟な検索の為のオプション

# はじめに

　ransackとenum_helpを利用している時、他のenumじゃないカラムと同一の検索ボックスを利用してname_or_job_or_etc_orみたいな検索をしたくなる場合があります。というか、そういう注文がよく飛んできます。

　そのまま対応すると、enumな部分だけクエリに%0%とか入ってきて、なんだよこれ、全然だめじゃんよ。ransackってばenumに対応してないじゃんちくしょう。みたいな非常に切ない気分になります。

　個別に検索用のセレクトボックスを付けるのも癪であす。bootstrapでシンプルにカッチョ良く決めた画面が、inputの乱立から段々と崩れていくのは悲しいことです。開発を続けるモチベーションも下がってしまいます。

# 実装

　これを解決するのがransackerという、ransackに用意されている切り込み隊長的なオプションです。同オプションを対象のモデルに定義しおくと、上記の問題を簡単に解決することができます。なんて便利なんでしょう。



<pre>
enum job: { neet: 1,  homeless: 2, lolicon: 3 }

ransacker :job, formatter: proc { |v|
  sym = User.jobs_i18n.invert[v]
  if sym.blank?
    -1
  else
    sym
  end
} do |parent|
  parent.table[:job]
end
</pre>

　途中で何故か-1を返している部分については、対応するi18nの文字列がconfig/locales/*.ymlに存在しない場合、enumで利用していない値を返すことで対応するためです。もしも-1を利用している場合は、他に絶対使わないだろう値を返すように変更する必要があります。

　尚、上記よりこのprocっている部分の実装にミスった場合、予期せぬ越権クエリが走って、想定外のデータまでwhereで引っ張られることになります。あまり複雑なことはしないほうが良いと思いました。
pingに日時（タイムスタンプ）をつける

私が自分で気に入っているpingに日時（タイムスタンプ）をつけるコマンドは以下のとおりです。理由は短いからです。

```bash:
$ ping localhost | xargs -I_ date +'%c _'
```

結果はこんな感じです。

```text:
Thu Mar 23 17:32:01 2017 PING localhost (127.0.0.1) 56(84) bytes of data.
Thu Mar 23 17:32:02 2017 64 bytes from localhost (127.0.0.1): icmp_req=1 ttl=64 time=0.087 ms
Thu Mar 23 17:32:02 2017 64 bytes from localhost (127.0.0.1): icmp_req=2 ttl=64 time=0.070 ms
Thu Mar 23 17:32:03 2017 64 bytes from localhost (127.0.0.1): icmp_req=3 ttl=64 time=0.077 ms
Thu Mar 23 17:32:04 2017 64 bytes from localhost (127.0.0.1): icmp_req=4 ttl=64 time=0.070 ms
Thu Mar 23 17:32:05 2017 64 bytes from localhost (127.0.0.1): icmp_req=5 ttl=64 time=0.074 ms
Thu Mar 23 17:32:06 2017 64 bytes from localhost (127.0.0.1): icmp_req=6 ttl=64 time=0.074 ms
Thu Mar 23 17:32:07 2017 64 bytes from localhost (127.0.0.1): icmp_req=7 ttl=64 time=0.071 ms
```

## 日時フォーマットについて
日本語の環境の場合は日時の部分が「2017年03月23日 17時32分01秒」のように日本語になってしまうので、それが嫌な場合は事前に`LANG=C`としておくか、以下のようにコマンドの中に`LANG=C`を挟み込みます。

```bash:
$ ping localhost | LANG=C xargs -I_ date +'%c _'
```

また`%c`のところを`%F %T`のようにすれば以下のように表示することもできます。UNIXとかに慣れていない方はこちらの方が馴染みやすいかもしれません。

```text:
$ ping localhost | xargs -I_ date +'%F %T _'
2017-03-23 17:38:15 PING localhost (127.0.0.1) 56(84) bytes of data.
2017-03-23 17:38:15 64 bytes from localhost (127.0.0.1): icmp_req=1 ttl=64 time=0.078 ms
2017-03-23 17:38:16 64 bytes from localhost (127.0.0.1): icmp_req=2 ttl=64 time=0.078 ms
2017-03-23 17:38:17 64 bytes from localhost (127.0.0.1): icmp_req=3 ttl=64 time=0.070 ms
2017-03-23 17:38:18 64 bytes from localhost (127.0.0.1): icmp_req=4 ttl=64 time=0.073 ms
2017-03-23 17:38:19 64 bytes from localhost (127.0.0.1): icmp_req=5 ttl=64 time=0.072 ms
2017-03-23 17:38:20 64 bytes from localhost (127.0.0.1): icmp_req=6 ttl=64 time=0.074 ms
```

## xargsの-Iオプションについて
xargsを使ったサンプルで`-I`と`-L 1`を同時に指定しているのをよく見かけるのですが、`-I`オプションのヘルプを読むとImplies -x and -L 1とあるので私は`-L 1`は指定していません。もし挙動がおかしいとかの場合、指定してみると変わるのかもしれません。

## 結果を保存するには
pingの結果を保存するには以下のような感じで`tee`コマンドを使うのがシンプルで分かりやすいかなと思います。

```bash:teeコマンド
$ ping localhost | xargs -I_ date +'%c _' | tee localhost.txt
```
nginxのproxy_passでhostsを参照させる

nginx-1.11.9で確認

例えば、hostsで定義した

http://dev.example.jp/hoge/
を
http://dev-hoge.example.jp/

にプロキシしたい場合、nginxで以下のように設定しますが、

```
server {
    listen 80;
    server_name dev.example.jp;

    location ~ ^/hoge/(.*)$ {
        proxy_pass http://dev-hoge.example.jp/$1?$args;
    }
...
}
```

dev-hoge.example.jpのIPアドレスをhostsで解決していた場合、

http://dev.example.jp/hoge/

でアクセスしても、hosts参照をしてくれず、Not Foundとなってしまいます。

※error.log には以下のように出力されます

```
2017/03/23 20:19:11 [error] 19306#0: *11 no resolver defined to resolve dev-hoge.example.jp, client: 172.17.0.5, server: dev.example.jp, request: "GET / HTTP/1.1", host: "dev.example.jp"
2017/03/23 20:19:11 [error] 19306#0: *11 open() "/usr/share/nginx/html/50x.html" failed (2: No such file or directory), client: 172.17.0.5, server: dev.example.jp, request: "GET / HTTP/1.1", host: "dev.example.jp"
```

※ちなみに、rewrite設定の場合は、hosts参照してくれるようで、正しくリダイレクトされます。

```
rewrite ^/hoge/$ http://dev-hoge.example.jp/ permanent;
```

# 解決策

### dnsmasqをインストール

dnsmasqは/etc/hostsを参照するDNSサーバーです。

```
# yum install dnsmasq
# service dnsmasq start
# chkconfig dnsmasq on
```

dnsmasqはlocalhostの53番ポートで起動します。

```
$ telnet 127.0.0.1 53
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
```
/etc/resolv.conf に127.0.0.1を追加し、

```
nameserver 127.0.0.1
```

digコマンドで、hostsで定義したホスト名を参照すると、Aレコードとして引くことができます。

```
$ dig dev-hoge.example.jp

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.52.amzn1 <<>> dev-hoge.example.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43153
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;dev-hoge.example.jp.       IN      A

;; ANSWER SECTION:
dev-hoge.example.jp. 0      IN      A       172.17.50.11

;; Query time: 6 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Mar 23 22:12:02 2017
;; MSG SIZE  rcvd: 57
```

### resolver ディレクティブを追加

proxy_passの直前に、resolverディレクティブを追加し、127.0.0.1を参照するように設定します。

```
server {
    listen 80;
    server_name dev.example.jp;

    location ~ ^/hoge/(.*)$ {
        resolver 127.0.0.1;
        proxy_pass http://dev-hoge.example.jp/$1?$args;
    }
...
}
```

dnsmasqとnginxを再起動し、

```
# service dnsmasq restart
# service nginx restart
```

http://dev.example.jp/hoge/

でアクセスすると、今度は、Not Foundとならず、hostsで定義した

http://dev-hoge.example.jp/

の内容をプロキシすることができます。
[Python] CufflinksでPandasのデータフレームをPlotlyに一発描画

# はじめに
以前、[[Python] Plotlyでぐりぐり動かせるグラフを作る](http://qiita.com/inoory/items/12028af62018bf367722)の記事で、インタラクティブなグラフを描画することができるPlotlyというライブラリを紹介しました。ただ、Plotlyの描画に至るまでに唱える呪文をいまいち覚えきれず、毎回どこかからコピペをしており、手軽に使用できないかなと常々思っていました。

そんな状況で、[Cufflinks](https://github.com/santosjorge/cufflinks)という、Pandasのデータフレームから、Plotlyを用いたグラフを一発で描画するライブラリを見つけたので紹介します。

# Cufflinksのインストールと使いかた
インストールは、```pip install cufflinks```で完了です。
描画するには、Cufflinksをインポートしてから、```df.plot()```と同じように、```df.iplot()```と打ち込むだけと簡単！

```py3
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 2), columns=["col1", "col2"])

import cufflinks as cf
# デフォでPlotlyのオンラインモードとなっているのでオフラインモードへと変更
# 恒久的にデフォルトをオフラインモードとする方法は下に記述
cf.go_offline()
df.iplot()
```
![newplot.png](https://qiita-image-store.s3.amazonaws.com/0/61468/8c10fc3a-e70d-8346-8124-c5391fd1bb14.png)


# 細かい設定
細かい設定は、[公式ページ](https://github.com/santosjorge/cufflinks)にあるTutorialsを参照ください。
また、使いそうな例を下記に示します。

## デフォルト設定の変更
```py3
# オフラインモード、白基調のテーマ、リンク表示OFFをデフォルト設定に
cf.set_config_file(offline=True, theme="white", offline_show_link=False)
```

## タイトル、初期表示領域の指定
```py3
df.iplot(xTitle="X軸名", yTitle="Y軸名", title="タイトル")
df.iplot(xrange=[0,5], yrange=[0,1])
```


## 散布図
```py3
df.iplot(kind="scatter" mode='markers', x="col1", y=["col2"]) # 系列は列名で指定
```

# subplot
```py3
df.iplot(subplots=True, shape=(2,1), shared_xaxes=True)
```

# 第2Y軸プロット
```py3
fig = df.figure(secondary_y="col2", yTitle="ylabel", xTitle="xlabel")
fig.layout.yaxis2.title = "y2label"
cf.iplot(fig)
```
[超下書き] Storyboardでカラースペースを指定する

歯車アイコンからカラースペースを指定可能。

before (sRGB)
![ss1.jpg](https://qiita-image-store.s3.amazonaws.com/0/7547/44f92a18-e3a5-ad28-9b94-f3f7bfb7be2f.jpeg)

after (Generic RGB/calibratedRGB)
![ss2.jpg](https://qiita-image-store.s3.amazonaws.com/0/7547/556953c6-29bc-db11-d517-ef4f8e59c092.jpeg)

diff

```diff
diff --git b/ColorSpace/Base.lproj/Main.storyboard a/ColorSpace/Base.lproj/Main.storyboard
index 1ab23fe..9844d2f 100644
--- b/ColorSpace/Base.lproj/Main.storyboard
+++ a/ColorSpace/Base.lproj/Main.storyboard
@@ -20,7 +20,7 @@
                     <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
                         <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                        <color key="backgroundColor" red="0.37647058823529411" green="0.75294117647058822" blue="0.56470588235294117" alpha="1" colorSpace="calibratedRGB"/>
+                        <color key="backgroundColor" red="0.37647058823529411" green="0.75294117647058822" blue="0.56470588235294117" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                     </view>
                 </viewController>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
```
Zabbixでバッチジョブの所要時間と実行結果を監視する

先日、cronで回しているとあるバッチジョブがたまに妙に時間がかかっているようだったので、その所要時間をZabbixで監視してみました。

# time(1)

コマンドの所要時間を計測するには`time(1)`コマンドが便利です。bash組み込みの`time`も便利ですが、`time(1)`はさらにいろんなオプションが使えます。

    $ /usr/bin/time -o result.time -f 'time:%e exit:%x' --quiet -- COMMAND

- `-o`オプションは計測結果を指定ファイルに出力します。
- `-f`オプションは結果の出力フォーマットを指定します。`%e`はいわゆるreal時間(単位は秒)、`%x`はCOMMANDのexit statusです。他にもいろいろな計測ができます。
- デフォルトではCOMMANDのexit statusが非ゼロの場合にエラーメッセージを出力します。それを抑制するには`--quiet`を指定します。

`time(1)`コマンドを使ってファイルに所要時間を出力しておけば、あとは適当な方法でそれをZabbixへアップロードすればOKです(後述)。

ただし、`time(1)`コマンドは実行開始時点で出力先ファイルを書き込みオープンするため、バッチジョブの実行中は出力先ファイルの中身が空になってしまいます。なので出力先ファイルは一時ファイルとし、コマンド実行完了後に`mv`するとよいと思います。

また、やや余談ですが時間のかかるバッチジョブでもう一つ大事なのが多重起動の防止です。これを実現するには`flock(1)`が便利です。

ということで、以上をまとめた`run_job.sh`を書いておきます。

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

basename="$1"
shift
(
  flock -n 9 || { echo "$basename is already running." >&2 ; exit 1 ; }
  /usr/bin/time -o "/tmp/$basename.time.tmp" -f 'time:%e exit:%x' --quiet -- "$@"
  mv -f "/tmp/$basename.time.tmp" "/tmp/$basename.time"
) 9> "/tmp/$basename.lock"
```

crontabでは以下のように使います。

```
10 23 * * * root  run_job.sh JOB_NAME COMMAND 2>&1 | logger
```


# Zabbixのアイテムの設定

次に、計測したジョブの所要時間をZabbixにアップロードします。これはzabbix-agentでポーリングする方法と、zabbix-senderでプッシュする方法のどちらでもできます。

zabbix-agentを使う場合は`vfs.file.regexp`キーで所要時間ファイルの中身を切り出せばいいでしょう。

ただ、残念ながら筆者の使っているZabbixはバージョンが古すぎてregexpキーが使えなかったので、`system.run`で以下のように設定しました。

- ジョブ所要時間

    - Key: `system.run[perl -ne '/time:(\S+)/ and print $1' /tmp/result.time]`
    - Type: Numeric(float)
    - Units: s

- ジョブ実行結果

    - Key: `system.run[perl -ne '/exit:(\S+)/ and print $1' /tmp/result.time]`
    - Type: Numeric(unsigned)
    - Units: exit code

もちろん、`system.run`を使わずにUserParameterを使うこともできます。(そっちの方がよかったかな・・・)

ついでにジョブの実行完了時刻も取得します。これは所要時間ファイルのタイムスタンプから分かります。

- ジョブ実行完了時刻

    - Key: `vfs.file.time[/tmp/result.time]`
    - Type: Numeric(unsigned)
    - Units: unixtime


# Zabbixのトリガーの設定

作成したアイテムに対してトリガーを設定し、異常時にアラートが上がるようにします。

- 所要時間が1時間を超えた場合にアラート

        {host:system.run[perl -ne '/time:(\S+)/ and print $1' /tmp/result.time].last(0)}>3600}

所要時間の変動が激しくてトリガーが暴れるようなら`max`関数などを使ってフィルタリングするとよいです。

- 実行結果が非ゼロの場合にアラート

        {host:system.run[perl -ne '/exit:(\S+)/ and print $1' /tmp/result.time].last(0)}#0

- 実行完了時刻が3日以上古い(あるいは新しい)場合にアラート

        {host:vfs.file.time[/tmp/result.time].fuzzytime(3d)}=0
CoverageツールのCoberturaが開発が止まっている件について

いま気づいたことで、全然知らなかったので自分と同じように調べるのに時間を浪費しないようにというメモ書きです。

言いたいことはこれだけです！！
***Coberturaは開発が止まっている！！！***

## いつから止まっているのか（2017/03/23現在）
最終のリリースが2015/02/27。２年以上も止まっています…

## なぜ気づいたか
Java8のプロジェクトをCoberturaでカバレッジを取っていたら、
半分以上のクラスがカバレッジ対象になっていなかったためです。

そしてココらへんを見て、サポートされてないと気づいきました。
https://github.com/stevesaliman/gradle-cobertura-plugin/issues/95
https://github.com/cobertura/cobertura/issues/166

私の場合は、たぶんですが、Java８で導入されたLamda式でエラーになっているのだと思っています。（詳しくはおいません。）
DHCP設定のまま Raspberry piのIPを固定する

## 面倒なのでDHCPで運用したいがSSHを使うからサーバのIPは固定したい。

Raspberry piで自宅にサーバーを立てました。
SSHで作業する時にはサーバIPを固定しておいたほうが便利ですが、自宅はDHCP運用のため
固定IP設定のサーバを混在させるのは厄介です。

そのためルーター側（ATERM-4CF11B）の機能を使って、Raspberry piの設定は
DHCPのまま、IPアドレスを固定を行います。

### まず Raspberry pi の ネットワークカードのMACアドレスを調べます。

``` bash
//Raspberry pi 側
$ ifconfig
wlan0     Link encap:Ethernet  HWaddr b8:27:eb:b3:82:9e 
          inet addr:192.168.0.3  Bcast:192.168.0.155  Mask:255.255.255.0
         
　...
```
HWaddrがMACアドレスです。
b8:29:eb:a3:82:9e 部分を控えておきます。

次にルーター側の設定です。

ルーターの管理画面にログインします。
設定を変えていなければ http://192.168.0.1 でルーターのWEB設定画面が開くと思います。
所持している機種の場合『DHCP固定割当設定』の項目からMACアドレスに対して割当てるIPの固定ができました。
![wariate-gamen.png](https://qiita-image-store.s3.amazonaws.com/0/62902/d5bdad54-7d78-93e3-f698-22ad2170a4f3.png)

### 今回は192.168.0.10で固定しました。

![wariate-2.png](https://qiita-image-store.s3.amazonaws.com/0/62902/bd7ce810-bf0a-2618-fba8-3134c89c4855.png)

この設定後、ルータによってはルータ自体の*設定保存*や*再起動*が必要だったり、すると思いますので忘れないように。

### あとは Raspberry pi を再起動してIPが固定された事を確認します。

``` bash
//Raspberry pi 側

$ reboot

//再起動後
$ ifconfig
...

wlan0     Link encap:Ethernet  HWaddr b8:27:eb:b3:82:9e  
          inet addr:192.168.0.10  Bcast:192.168.0.255  Mask:255.255.255.0

...
```

無事固定されました。
[fluentd] Punycodeや日本語URIをdecodeしてBigqueryに投げるメモ

# やりたいこと

nginxなどから吐き出されたアクセスログを
Bigqueryに送る前にPunycodeやPercentEncodeされた文字列をdecodeする

# なんで？

log集計する際など、encodeされたURIやpunycodeだと不便と言われたので  
（開発中のサイトでは、ドメイン、サブドメイン、パーマリンクに日本語や記号が使用されているものがあります）

# 解決方法

* fluentdでBigqueryに投げる際に、ruby使ってdecode
* fluentdの組み込みプラグイン [exec Output Plugin](http://docs.fluentd.org/v0.12/articles/out_exec) を利用
* decodeしている部分は、下記td-agent.confの `command` 部分

#### ※ Notice
* Punycodeをdecodeするために、SimpleIDNがインストールされている必要があります  
    `# /opt/td-agent/embedded/bin/fluent-gem install simpleidn`
* 本記事はv0.12 (td-agent2)を対象に書いています

### td-agent.conf
```
<source>
  type exec
  format ltsv
  time_format %Y-%m-%d %H:%M:%S %z
  command tail -f /var/log/nginx/access.log | while read l ; do echo $l | ruby -e 'require "rubygems"; require "uri"; require "simpleidn"; str=STDIN.gets; arr=str.split(/\s/); arr[4] = "uri:"+URI.decode(arr[4].gsub("uri:", "")); arr[5] = "vhost:"+SimpleIDN.to_unicode(arr[5].gsub("vhost:", "")); puts arr.join("\t")'; done
  pos_file /var/log/td-agent/access_log.pos
  tag log.nginx
</source>
<match log.nginx>
  type record_reformer
  enable_ruby true
  tag ${tag}.${time.strftime('%Y%m%d')}
</match>
<match log.nginx.**>
  type forest
  subtype copy
  <template>
    <store>
      type bigquery
      method insert

      auth_method json_key
      json_key /etc/bq/.key/gcp_key.json

      project {project ID}
      dataset {dataset}

      auto_create_table true
      table nginx_access_log_${tag_parts[-1]}

      schema_path /etc/bq/schema.json
    </store>
  </template>
</match>
```

# 参考サイト
* [(｡･ω･)ﾉﾞ fluentd url decode](http://ameblo.jp/g-pinchan-new/entry-11812587989.html)
* [【Fluentd】in_execプラグインを使ってみる](http://qiita.com/mogulla3/items/065930a6ac07cf4a14e2)
* [fluentdでプラグインを書かない](http://qiita.com/kazegusuri/items/4cde6a252d595d339699)
* [Fluentdプラグイン in_exec, out_execの動作を確認する](https://open-groove.net/fluentd/exec-plugin/)

# 最後に
fluentdもRubyも勉強中のため、改善点などあれば、ご指摘お願いいたします！
VBA.IsMissingの致命的な問題

# 概要

`VBA.IsMissing`関数を特定条件下で使用したとき、ホストアプリケーションを巻き込んで強制終了してしまう。

# 確認環境

```text
Office2010 32bit on Windows 7 64bit
Office2016 64bit on Windows 10 64bit
```

# サンプルコード

ホストアプリケーションで何も重要なファイルを開いていない状態で、`FatalErrOfIsMissing`プロシージャを実行してください。

```vb
Sub FatalErrOfIsMissing()
    Dim tmp() As Variant
    Call TestIsMissing(tmp)
End Sub

Private Sub TestIsMissing(Optional ByVal arg As Variant)
    Call VBA.IsMissing(arg)
End Sub
```

# 条件詳細

## 送る変数

宣言だけされたVariant型の動的配列。

他の型の配列や、`Array()`では発生しない。

## 引数の宣言

ByValで宣言（ByRefでは発生しない）。

# 対策

`Missing`はエラー値の一種のため、予め`IsError`関数でフィルターすればこの問題を回避できる。

```vb
Public Function IsMissing(ArgName As Variant) As Boolean
    If VBA.IsError(ArgName) Then _
        Let IsMissing = VBA.IsMissing(ArgName)
    'Else return False
End Function
```

# 関連

[Missingを能動的に取得する - Qiita](https://qiita.com/nukie_53/items/36fc3d45981905073b19 "Missingを能動的に取得する - Qiita")
np.array の各行からひとつずつ列番号を指定して要素をとりだす (np.choose)


```python
a =  np.arange(20).reshape(4,5)

=> array([[ 0,  1,  2,  3,  4],
         [ 5,  6,  7,  8,  9],
         [10, 11, 12, 13, 14],
         [15, 16, 17, 18, 19]])
   
jcol = [1, 1, 2, 3]    
```

第0,1,2,3行からそれぞれ第 1 1 2 3 列の数値を取り出したいとする。つまり `a[i, jcol[i]]` からなる `[1 6 12 18]` を得たい。

Python でループをまわすことなく高速にこれをするには:

```
np.choose(jcol, a.T)

=> array([ 1,  6, 12, 18])
```


## 応用

想定している応用は `y[i, j]` が i番目のデータの答えが j である確率で、 `t[i]` が正解の index だとすると、交差エントロピー誤差
$$ 
E = - \sum_i \log y[i, t[i]]
$$

は

```
-np.sum(np.log(np.choose(t, y.T) + 1.0e-7))
```

と書ける。 `+1.0e-7` は log が発散しないように下駄を履かせてる。

## 参考
http://stackoverflow.com/questions/17074422/select-one-element-in-each-row-of-a-numpy-array-by-column-indices