OmniAICreator/Qiita-1.07M huggingface dataset:
StringBuffer(StringBuilder)がHashSetにうまく入らない

# やりたかったこと
単純に、StringBuffer型の文字列をHashSet<StringBuffer>に入れたかった

# 何がダメか
StringBuffer(StringBuilder)はequals()とhashCode()がOverrideされておらず、hashの比較がうまくいっていなかったため　　

# 追記
####StringBufferの場合  

```java
// StringBuffer
Set<StringBuffer> bufferSet = new HashSet<>();
StringBuffer sb = new StringBuffer("");

for (int i = 0; i < 10; i++){
   sb.setLength(0);
   sb.append("test" + i);
   bufferSet.add(sb);
}

bufferSet.forEach(s -> System.out.println(s));

```

```java
//結果
test9
```

**よく考えたら、同じObjectの中身を変更しているだけなので、当然の結果でした。
下記の内容は、合わせて調べた内容ですので参考程度に載せておきます。**  
StringBufferの場合は、Java.lang.Objectのequalsが利用されているため(下記)、Objectの比較のみです。

```java:java.lang.Object.java
public boolean equals(Object obj) {
    return (this == obj);
}
```

以下の方が有用な例です。

```java
Set<StringBuffer> sbSet = new HashSet<>();
sbSet.add(new StringBuffer("abc"));
sbSet.add(new StringBuffer("abc"));
sbSet.add(new StringBuffer("abc"));
sbSet.add(new StringBuffer("abc"));        

sbSet.forEach(s -> System.out.println(s));
```

```java
//結果
abc
abc
abc
abc
```

Objectの比較のみであるので、中の文字列が同じでもイコール判定されない。

  
####Stringの場合

```java
// String
Set<String> stringSet = new HashSet<>();
String st = "";

for(int i = 0; i < 10; i++){
   st = "test" + i;
   stringSet.add(st);
}

stringSet.forEach(s -> System.out.println(s));
```

```java
//結果
test4
test5
test2
test3
test8
test9
test6
test7
test0
test1
```

Stringは、毎回新しいObjectが生成されるため当然、Setに新しく入る。 
ちなみにあまり関係ないですが、Stringのequalsは以下のようになっています。

```java:java.lang.String.java
public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
}
```

#参考
[A Set in java never allows duplicates, but it takes StringBuffer objects with the same argument. Why?](http://stackoverflow.com/questions/17462576/a-set-in-java-never-allows-duplicates-but-it-takes-stringbuffer-objects-with-th)
「windows」で「PowerShell」を「一切画面表示せず」に「タスクスケジューラに登録」する方法を再確認

何も考えずにタスクスケジューラでpowerShellを登録すると、一瞬ウィンドウが表示されるダサい事になっちゃうんだよね。`-windowstyle hidden` を付けても意味なし。

![意味が無い](https://qiita-image-store.s3.amazonaws.com/0/5825/89f801e0-d609-c0e0-3cfa-53c6c716ddc6.png)
ダメな例。

じゃあどうするんかってーと、powershell.exeを使う限りどうしようもないので他の言語に頼る事になるってのが常套手段。このブログとか。
[PowerShellの盲点 バイクと癒しのおじさんブログ/ウェブリブログ](http://27126080.at.webry.info/201008/article_6.html)

具体的に以下のjsファイルを作る

```ps1:task-scheduler.js
wsShell = WScript.createObject("WScript.Shell");
retCode = wsShell.Run("\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" -File \"" + WScript.Arguments.Item(0)+"\"",0,true);
WScript.Quit(retCode);
```

タスクスケジューラにはこう登録する。カレントディレクトリもちゃんと反映される。
![imgTemp-2016-05-01-10-36-18.png](https://qiita-image-store.s3.amazonaws.com/0/5825/c5ef5f96-1f05-7a03-8bed-16cbffe26f06.png)

これでオッケー と。
MacでAnsible2系をHomebrewでインストールする

Ansible2.0が正式リリースされたので
MacでHomebrewを使ってインストールしてみることにします。

まずは`brew info`コマンドでパッケージのバージョン情報を確認

```bash
$ brew info ansible
ansible: stable 1.9.4 (bottled), devel 2.0.0-0.8.rc3, HEAD
```

上記のようにまだバージョンが1系であればHomebrewを更新します

```bash
$ brew update
```

バージョンが2系に上がっていることを確認

```bash
$ brew info ansible
ansible: stable 2.0.2.0 (bottled), devel 2.0.2.0-0.4.rc4, HEAD
```

いざansibleをインストール

```bash
$ brew install ansible
```

インストールが完了したらansible2系が実際に入っていることを確認します

```bash
$ ansible --version
ansible 2.0.2.0
  config file =
  configured module search path = Default w/o overrides
```

以上！
MongoDBのファイルをCGI化したPowerShellで表示

# MongoDBのファイルをCGI化したPowerShellで表示

更新の間が空いてしまいました。取りあえず尻切れトンボだったネタを終わらせておきます。

[SikuliからMongoDBにアクセスする（その２）－画像を保存](http://qiita.com/Helicobacter_pylori/items/aeb8c6d8e1f32a886325)で保存したファイルの取り出しです。
私の使い方は、とりあえずログとして貯めておき、見るときは１つのhtmlにまとめて表示します。
なので、マイナーな使い方だと思いますが、CGI化したPowerShellから読みimgタグ内にBASE64で埋め込みます。
（CGI化したPowerShellについては、[Windows2016TP4のIISでPowerShellをCGIとして動かす。](http://qiita.com/Helicobacter_pylori/items/a85965fd5c47443c703e)を参照願います。）

|ソフト等|バージョン|備考|
|:------|:--------|:---|
|Windows Server 2016|Technical Preview 4(Build 10586)|2012R2のHyper-V上で動作|
|PowerShell|5.0|2016TP4標準のまま|
|MongoDB|3.2.1|Windows 64-bit 2008 R2+ legacy|
|MongoDB .NET Driver|1.11.0||

## PowerShellソース

思い切り手抜きです。
エラーチェックありませんが、取り出して表示するイメージは判るかと思います。

```ps1:getfile.ps1
##### 指定ファイルをMongoDBから取り出し #####
# ファイル名はクエリーで指定。
# ex: getFile.ps1?file.PNG

write-host "Conten-Type: text/html"
write-host ""
write-host "<html><head></head>"
write-host "<body>"

# ドライバ読み込み
$DRIVER_PATH = "C:\MongoDB\CSharpDriver-1.11.0";
Add-Type -Path "$DRIVER_PATH\MongoDB.Bson.dll";
Add-Type -Path "$DRIVER_PATH\MongoDB.Driver.dll";

# MongoDBの、imgデータベースに接続
$client = New-Object MongoDB.Driver.MongoClient("mongodb://S2016TP4");
$server = $client.GetServer();
$db = $server.GetDatabase("img");

# GridFS接続してファイルを取得
$gridfs = New-Object MongoDB.Driver.GridFS.MongoGridFS($db);
$file = $gridfs.OpenRead($ENV:QUERY_STRING);

# bytes配列に取り込み、BASE64エンコード
$bytes = New-Object byte[] $file.Length;
$file.Read($bytes, 0, $file.Length) > $null;
$base64 = [System.Convert]::ToBase64String($bytes);

# 拡張子を抽出
$ext = $ENV:QUERY_STRING.Substring($ENV:QUERY_STRING.LastIndexOf(".") + 1);

# imgタグで表示
write-host "<img src = 'data:image/$ext;base64, $base64'>"

write-host "</body></html>"
```

\$file.Read()部分でファイルサイズ\(byte数\)が出力されてしまうので、> $nullで消しています。

## 実行結果

![screen.png](https://qiita-image-store.s3.amazonaws.com/0/111541/602aab17-5cbc-b315-a17b-05aded0b58f8.png)

ブラウザ上で50%表示にしています。
前回良く判らなかった右と下の黒い部分も表示されてますね…

![htmlsource.png](https://qiita-image-store.s3.amazonaws.com/0/111541/ab77c286-86f0-0fe3-1515-94eddc65760c.png)

ブラウザ上でソースを見ると、この通りBASE64で埋め込まれています。
若干ファイルサイズが大きくなるのが欠点ですが、大量の画像があってもhtmlファイル１つで済むので取り扱いが楽です。
サーバテクニカルコマンド

##ハードウェア監視
ipmitools
```
yum install OpenIPMI IPMI-tools
chkconfig ipmi on
/etc/ini.d/ipmi start

ipmitool fru  #ハードの詳細
ipmitool sdr  #ハードの障害
ipmitool sel list  #イベント・ログ表示
```

dstat
```yum install dstat```
stat系の親玉

## スペックチェック
lscpu #cpu information
lspci #PCI表示
lspci | grep -i nvidia

## カーネル系
lsmod #カーネルモジュール表示
lsmod | grep -i nvidia



##ログ・ファイル監視
logmon
任意の文字列が生じた場合にアクションを起こす．
```
git clone https://github.com/moomindani/logmon.git
cd logmon
sudo ./setup.sh

/etc/logmon/logmon.conf #設定ファイル
```

##システムログチェック
sysstat
```
yum install sysstat
sar -u -f /var/log/sa/sa*  #CPU使用状況
sar -r -f /var/log/sa/sa*  #メモリ使用状況
sar -b -f /var/log/sa/sa*  #ディスクI/O使用状況
sar -W -f /var/log/sa/sa*  #SWAP使用状況
sar -n DEV -f /var/log/sa/sa*  #ネットワーク使用状況
sar -A -f /var/log/sa/sa*  #全てのデータ
```

##コマンドログチェック
psacct
```
yum install psacct
chkconfig psacct on
/etc/init.d/psacct start
lastcomm  #コマンドログ表示 /var/account/psacctに記載，設定は/etc/logrotate.d/psacct
```

##認証システムPAMの設定
/etc/pam.d/ファイル #各認証システムの詳細設定

#ネットワーク
##IPアドレス，マックアドレス対応表
```
arp -n
```

##VLAN設定
/etc/sysconfig/network
VLAN=yes
/proc/net/vlan/config #稼働状況

##Bonding driver
mode1: active-backup
ARP監視: パケットを定期的に生成・送信し，一定量増えない場合はリンク障害
MII監視: NICのドライバから状態を取得
mode4: 負荷分散

/etc/modprobe.conf, /etc/sysconfig/network-scripts/ifcfg-bond0 #設定

##TCPコネクション
```
netstat -nat
```
/etc/services #TCPポートとアプリケーション名の対応

sysctl -a # カーネルのパラメータ表示

##プロセス管理
```
kill : 9;強制終了, 19:停止, 18:再開, 1:リスタート
ps aux
```

###Tips
```
tree: ディレクトリ構造表示
pstree: プロセスツリー表示
```
c++ builder / VK_XXX > VK_Fなどは定義されていない

```txt:動作環境
C++ Builder XE4
```

VK_Fを使おうとしたらコンパイルエラーとなった。
VK_Fなどの仮想キーはdelphiでは定義されていないようだ。

http://delphi.about.com/od/objectpascalide/l/blvkc.htm
空き容量取得メモ

調べたのでメモ。

```swift
    /**
    容量取得
    - returns: freeとtotalのサイズ取得
    */
    static func GetDiskSize() -> (free: Double?, total: Double?) {
        let _0_paths: NSArray = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.UserDomainMask, true)
        let _0_last: String = _0_paths.lastObject as! String
        do {
            let _0_dic: NSDictionary = try   NSFileManager.defaultManager().attributesOfFileSystemForPath(_0_last)
            return (
                (_0_dic[NSFileSystemFreeSize] as! NSNumber).doubleValue,
                (_0_dic[NSFileSystemSize] as! NSNumber).doubleValue
            )
        } catch let e as NSError {
            print("error : \(e.localizedDescription)")
            return (nil, nil)
        }
    }
```
技術英語 > the [cardinal points specification] of the neo pixel drivers. / cardinal number

@ Adam Taylor MicroZed Chronicles - Using the Zynq 101 [Kindle Edition]
No. 1477/2129

> In my last blog I introduced the neo pixel and outlined the cardinal points specification of the neo pixel drivers.

http://eow.alc.co.jp/search?q=cardinal+point
> 主要点、枢要点

<hr>
「cardinal points specification」で検索すると軍事用語がちらほらと出てくる。

Softwareでも少しある。
[books.google](https://books.google.co.jp/books?id=K_38BAAAQBAJ&pg=SA16-PA3&lpg=SA16-PA3&dq=%22cardinal+points+specification%22+software&source=bl&ots=cMKC_-5Ghk&sig=D88E-gLNrPWaEP352jC4z06MGX0&hl=ja&sa=X&ved=0ahUKEwjmgdSz87LMAhVWzWMKHSRaAOUQ6AEIGzAA)

<hr>
関連して思い出したのは

cardinal number

http://eow.alc.co.jp/search?q=cardinal+number
> 基数
PHPでtime_sleep_untilをEC2で使ったら秒単位で狂って辛い

# 1分以下の定期実行にPHPのtime_sleep_untilを使った

LinuxのCRONを使えば、年月日時分単位で自動的にコマンドを実行可能です。
ただ、Dockerのコンテナ上では面倒だったり、1分以下の設定が出来なかったりとちょっと不便に思う時もあります。

そこで、PHPの[time_sleep_until](http://php.net/manual/ja/function.time-sleep-until.php)を使えば、○○時○○分○○秒までスリープするというタイムスタンプを指定したスリープ処理が可能です。
## サンプルコード

```php:demo_time_sleep_until
<?php
while(true){
	$next_time_stamp = time()+(60);
	echo exec("date");
	sleep(45);
	time_sleep_until( $next_time_stamp );
}
?>
```
　3行目`$next_time_stamp = time()+(60);`で次の実行時刻を指定しています。60秒毎に実行するように、現在時刻＋60をしています。5行目`sleep(45);`は、何らかの時間がかかる処理を実行したことをシミュレートするためです。
　6行目の`time_sleep_until( $next_time_stamp );`で3行目に指定した時刻までスリープするように設定します。


##実行結果

```shell-session
2016年  5月  1日 日曜日 06:44:20 JST
2016年  5月  1日 日曜日 06:45:20 JST
2016年  5月  1日 日曜日 06:46:19 JST
2016年  5月  1日 日曜日 06:47:18 JST
2016年  5月  1日 日曜日 06:48:17 JST
2016年  5月  1日 日曜日 06:49:16 JST
```
1回のループで1秒程度早まっている事が観察されました。
MacBook Proで試した時には、早まったりすることは無かったのですが。。。。

##実行環境
- インスタンス EC2 Amazon Linux 
- PHP 5.3.29 (cli) (built: May 12 2015 22:42:19) 

#まとめ
time_sleep_untilを使う場合には、実行環境によって動作が異なるので、お気をつけ下さい。
パーマリンクの設定 / 404エラー対応メモ


サーバーをあまりいじったことがないので、
勉強がてらwordpressでブログを作成しました。

パーマリンクの設定後、
記事のページに飛ぶと404になってしまい、
少しハマったのでメモがてら設定した内容をまとめます。

### まとめ

* mod_rewriteモジュールを有効にする必要がある

パーマネントリンクで設定したurlからwordpressが記事を在りかを探すため。

* ```.htaccess```を編集（なければ作成）する

wordpressが記事の在りかを探すための具体的な内容を記述するため。

> 動作要件
http://wpdocs.osdn.jp/%E3%83%91%E3%83%BC%E3%83%9E%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9#mod_rewrite:_.22Pretty_.E3.83.91.E3.83.BC.E3.83.9E.E3.83.AA.E3.83.B3.E3.82.AF.22

### 環境

* さくらVPS
* CentOS


```console
cat /etc/redhat-release
```

```
CentOS release 6.7 (Final)
```

* apatch

```console
httpd -v
```

```
Server version: Apache/2.2.15 (Unix)
Server built:   Mar 22 2016 19:03:53
```
* url

http://blog.example.com/

### 手順

#### パーマリンクの設定@wordpress

割愛

#### mod_rewriteを有効にする

/etc/httpd/conf/

```httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so
```

上記を追加もしくはコメントアウトを外す。

#### ```.htaccess```を読み込めるようにする

/etc/httpd/conf/

```httpd.conf
<Directory "/var/www/html/blog/wordpress">
    AllowOverride All
</Directory>
```

```httpd.conf```が全体の設定、
```.htaccess```が個別ディレクトリの設定を制御しており、
```AllowOverride All```を記載しないと、
```httpd.conf```の設定が優先されてしまい、
```.htaccess```がそもそも読み込まれない。

ちなみに```AllowOverride All```になっていなかったので、
ぼくはハマりました。

#### ```.htaccess```を編集

```
# BEGIN WordPress
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /wordpress/ 
  RewriteRule ^index\.php$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.php [L]
</IfModule>

# END WordPress
```

* RewriteBase の初期値は / になっています

#### 設定を反映

```service httpd restart```



これでパーマリンクが反映された個別記事もきちんと表示されるはず。
Swifterを使ってTwitterにDictionary<String, String>をそのまま投稿しようとすると401が返ってくる


#始めに
[Swifter](https://github.com/mattdonnelly/Swifter) を使ってSwiftの `Dictionary<String, String>` をそのまま投稿しようとしたら弾かれた。

#Swifterとは
[Swifter](https://github.com/mattdonnelly/Swifter) とは、Pure SwiftなTwitterクライアント作成用のライブラリ。
割とちゃんとメンテされてる感じなのにCocoaPodsにもCarthageにも対応してないのが不思議。
(ちなみに、CocoaPodsに関しては対応するPRがコンフリクトしたまま放置されている)

なお、[同じ名前のサーバーエンジン](https://github.com/httpswift/swifter) があり、
しかもこちらはCocoaPodsに対応している。
Swifterを`pod install`すると、サーバーエンジンがインストールされてしまうので要注意。

最初は[FabricのTwitterKit](https://docs.fabric.io/ios/twitter/twitterkit-setup.html)を使おうとしたのだが、
ユーザー操作無しで固定IDで認証 & ツイートする方法がどうにもわからなかったのでこちらを使うことにした。

#準備
[Swifter](https://github.com/mattdonnelly/Swifter) のインポート及び、ConsumerKey, AccessTokenの取得は済ませておく。
ここでは手順は書かない。

#失敗するコード
```swift:Test.swift
class Test: NSObject {
    func test() {
        let swifter = Swifter(consumerKey: TWITTER_CONSUMER_KEY, consumerSecret: TWITTER_CONSUMER_SECRET, oauthToken: TWITTER_ACCESS_TOKEN, oauthTokenSecret: TWITTER_ACCESS_TOKEN_SECRET)
        let dictionary = ["hoge" : "fuga"]
        let string = dictionary.description
        swifter.postStatusUpdate(string, success: { status in
        }, failure: { error in
            print(error)
        })
    }
}
```

#結果
```
/* 投稿した文字列 */
["hoge": "fuga"]

/* 返って来たエラー */
Error Domain=NSURLErrorDomain Code=401 "HTTP Status 401: Unauthorized, Response: {"errors":[{"code":32,"message":"Could not authenticate you."}]}" UserInfo={Response-ErrorCode=32, NSLocalizedDescription=HTTP Status 401: Unauthorized, Response: {"errors":[{"code":32,"message":"Could not authenticate you."}]}, Response-Headers=<CFBasicHash 0x7f8003d01ee0 [0x1135a2a40]>{type = immutable dict, count = 10,
entries =>
	0 : Server = tsa_a
	1 : Content-Type = <CFString 0x7f8001eadaf0 [0x1135a2a40]>{contents = "application/json; charset=utf-8"}
	2 : Set-Cookie = <CFString 0x7f8001eac7d0 [0x1135a2a40]>{contents = "guest_id=v1%3A146204234384616421; Domain=.twitter.com; Path=/; Expires=Mon, 30-Apr-2018 18:52:23 UTC"}
	3 : Strict-Transport-Security = <CFString 0x7f8003e48890 [0x1135a2a40]>{contents = "max-age=631138519"}
	4 : x-tsa-request-body-time = 0
	5 : x-connection-hash = <CFString 0x7f8003e55cf0 [0x1135a2a40]>{contents = "c39f9646d5657d9e8c0921a2a2c0abf7"}
	6 : Date = <CFString 0x7f8001ee9350 [0x1135a2a40]>{contents = "Sat, 30 Apr 2016 18:52:23 GMT"}
	7 : x-response-time = 9
	8 : Content-Encoding = gzip
	10 : Content-Length = 89
}
```

#考察
同じ文字列をブラウザやTweetbotから投稿しようとしたら普通に投稿できた。
また、`"hoge : fuga"`は問題なく投稿できることが確認できた。
このライブラリが内部でおかしなことをしているのか、投稿できたクライアントが特殊な処理をしているのか、
もしくはこのライブラリが必要な処理をしていないのか、は未調査。
わかったら追記する。(御存じの方がいらっしゃったら、御教示ください。)

#終わりに
この辺のことを修正してPR出せば、OSS contribute処女を喪失できるかも、とか思った。


#(2016/05/19 追記)
`[]` が含まれているとエラーが出るようだったので、こんなPRを作ったが現在放置中。
https://github.com/mattdonnelly/Swifter/pull/141

#(2016/08/12 追記)
マージされて直った :tada: 
https://github.com/mattdonnelly/Swifter/pull/141
let's encrypt を node.js でつかう

# letsencrypt with node.js
個人的には今までSSL系はオレオレ証明書でなんとかしのぎ切ってきましたが、やりたいこと的にどうしてもvalidなSSL証明証が必要だったのでletsencryptを始めました。
記事内のexample.comは自分の持ってるドメインでやってね。

## let's encrypt
https://letsencrypt.jp/ を参考に /etc/letsencrypt/配下に証明書などが揃った状態にします。

```
# ls /etc/letsencrypt/live/example.com/
cert.pem  chain.pem  fullchain.pem  privkey.pem
```

letsencryptの環境設定で80番ポートが未使用状態であることはキモっぽいです。

## node.jsでつかう

```lang:app.js
"use strict"
const   
https = require('https'),
fs = require('fs'),
conf = require('./conf');
        
const httpsServ = https.createServer(
    {   
        key: fs.readFileSync (conf.key),
        cert: [fs.readFileSync(conf.cert)],
        ca:   [fs.readFileSync(conf.chain), fs.readFileSync(conf.fullchain)]
    },  
    (req, res) =>{
        res.write("hello");
        res.end();
    }
).listen(3001);
```

```lang:conf
exports.key='/etc/letsencrypt/live/example.com/privkey.pem';
exports.cert='/etc/letsencrypt/live/example.com/cert.pem';
exports.chain='/etc/letsencrypt/live/example.com/chain.pem';
exports.fullchain='/etc/letsencrypt/live/example.com/fullchain.pem';
```

/etc/letsencrypt/live配下はrootユーザでしか読み込めない設定になってるので適当になんとかすること。




## curlで動作確認
**修正に伴いこの項目の結果**

```
$ curl https://example.com:3001
curl: (60) Peer's Certificate issuer is not recognized.
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.
```

どうも、自分の環境の情報だと単純にはできないらしい...
curlに-kオプションをつけるか以下のようにやることで、動作を確認。

```
$ curl https://example.com:3001 --cacert /etc/letsencrypt/live/example.com/fullchain.pem
hello
```

とりあえず大丈夫そう。。。かな？

**2015/05/11修正**
CAにfullchain.pemとchain.pemを指定すると怪しい挙動がなくなったので指定するのが適切な模様。
VirtualBox 向け CloudReady ライブイメージの作り方

CloudReady を仮想マシンとして動かしたくなって研究してみた。

# 元のイメージを手に入れる
[CloudReady](http://www.neverware.com/freedownload) のイメージファイルを公式ページからダウンロード。
``cloudready-free-47.1.86.bin.zip`` という
``bin`` ファイル(OS のイメージファイル)を ``zip`` で圧縮したファイルが手に入る。

# イメージファイルの加工
``cloudready-free-47.1.86.bin.zip`` を解凍する。
(Windows 標準の解凍機能でも 7-Zip 等でも良い)
``chromiumos_image.bin`` というイメージファイルが出てくる。

これを [Rufus](https://rufus.akeo.ie/) 等で USB フラッシュメモリへインストールすると
物理マシン用の USB ブートディスクが出来上がる。

が、今回はやらない。

代わりに [VBoxManage](https://www.virtualbox.org/manual/ch08.html) を使って ``bin`` ファイルを ``vdi`` ファイルに変換する。

```ps1:PowerShellで実行する場合
& 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' convertfromraw .\chromiumos_image.bin .\chromiumos_image.vdi --format VDI
```

# VirtualBox で動かす
## 新規仮想マシンを作る
名前: お好きな名前でどうぞ。

タイプ: Linux を指定。

バージョン: Other Linux(32-bit) / Other Linux(64-bit)
　(今回は 32-bit で検証。 64-bit は未検証)

メモリーサイズ: 1500 MB
　(最低動作メモリ値は未検証。
　公式ドキュメントでは 2 GB 推奨と書いてあるが、
　1.5 GB でも軽快に動いた)

ハードディスク: 「すでにある仮想ハードディスクファイルを使用する」を指定し、
　``chromiumos_image.vdi`` を選択する。

## 設定
システム > マザーボード > ポインティングデバイス: PS/2 マウス を指定する。
システム > マザーボード > EFI を有効化
システム > プロセッサ > PAE / NX を有効化

※PS/2 マウスを指定し忘れると起動後にマウス操作ができない。
※EFI, PAE / NX を有効にしないと起動しない。

## 起動
ライブメディアとして使用する分には問題なく動くのだが ......
**インストールができない**。 orz

仮想ハードディスクをもう一つ積んで試みてもダメだった。
(レイド設定なし。ただ積んだだけ)

# 課題
インストールできるようにしたいのだが ...... 
やはり VirtualBox 上で USB ブートさせるしかないのだろうか?
しかし VirtualBox は USB ブートを公式にはサポートしていないようだし。

どなたか良い方法を知っていたら知恵を貸してください。
データサイエンスの面接において知っておくべき２１のQ＆A（日本語訳その３「作成したモデルを検証するために何をしますか？」）


Originally published in KDnuggets: <a href="http://www.kdnuggets.com/2016/02/21-data-science-interview-questions-answers.html">21 Must-Know Data Science Interview Questions and Answers</a>
*KDnuggetsより正式に和訳を書くことの許可を得ました。*
*Gregory-san thank you for the approval*

[一つ目](http://qiita.com/ogamiki/items/57d37d83b624e6f44804)、[二つ目](http://qiita.com/ogamiki/items/4872a0e74130a6a7d978)に続き、今回はデータサイエンスの面接において答えられないといけない質問２１種類の三つ目の質問です。

#3.How would you validate a model you created to generate a predictive model of a quantitative outcome variable using multiple regression.

和訳すると「値の予測モデル用に重回帰で作成したモデルをどうやって検証するか答えなさい」となります。

原文
>If the values predicted by the model are far outside of the response variable range, this would immediately indicate poor estimation or model inaccuracy.

モデルの予測値が想定される値の範囲から大きく逸脱している場合、即座にまずい推定か不正確なモデルであることを明示しています。

原文
>If the values seem to be reasonable, examine the parameters; any of the following would indicate poor estimation or multi-collinearity: opposite signs of expectations, unusually large or small values, or observed inconsistency when the model is fed new data.

予測値が合理的に見える場合には、パラメータを確かめます。期待と違う符号があるか、異常に大きい値または小さい値があるか、モデルに新しいデータを追加した際に矛盾が生じる場合には、まずい推定か多重共線性がある可能性があります。

原文
>Use the model for prediction by feeding it new data, and use the coefficient of determination (R squared) as a model validity measure.

いくつかの新しいデータを使い、決定係数($R^2$)を使用し、モデルの妥当性判定します。

原文
>Use data splitting to form a separate dataset for estimating model parameters, and another for validating predictions.

データ分割手法を使用し個別のデータセットを生成し、片方をモデル作成に使用し、もう片方を検証用に使用します。

原文
>Use jackknife resampling if the dataset contains a small number of instances, and measure validity with R squared and mean squared error (MSE).

データの要素が少ない場合には、ジャックナイフ法を利用し、決定係数($R^2$)と誤差の平方和(MSe)によって、モデルの妥当性を判定します。

#まとめ
特段特殊なことを出している訳ではないが、あくまで検証の順番にそって丁寧に説明しています。つい、決定係数のようなモデルの妥当性を判定する指標をすぐに頼りたくなりますが、順序として、予測値が妥当なのか、モデルが妥当なのかと大切なワンステップが盛り込まれています。
WebElement.clear()がonchangeを発火しない

nodejsでseleniumのテストを書いていてハマったお話です。

アプリケーションはReact+es6で書いていて対象のHTML部分を抜粋するとこんな感じです。

```js
export default class FirstView extends BaseView
{
  constructor(props) {
    super(props);
  }

  onChangeEventMemo(e){
    FirstViewActions.changeEventMemo(e.target.value);
  }

  render() {
    return (
      <div className="form-group titled-textarea">
        <textarea name="" className="form-control event-memo" value={this.state.eventMemo} onChange={(e) => this.onChangeEventMemo(e)}></textarea>
      </div>
    );
  }
}
```

下記の様なシナリオを書いていました。

1. textareaに文字列を入力。
2. 保存
3. 再度開いて値をチェック
4. 内容をクリアし保存
5. 再度開いて空になってるかチェック

ところが、`4`-`5`のところで、画面を見ているとクリアされているのですが、保存する直前に値が戻ってしまう。詳細に追ってみたら、`onChangeEventMemo`が発生せず、stateの値が変わらないので保存の直前に再`render`されて値が戻ってしまっている様でした。つまり、タイトル通りですが、`WebElement.clear()`は`onchange`イベントを発火しない様です。

バックスペースはイベントを発火する様なので、とりあえず無理やりonchangeを発火させるために下記の様にクリアする部分を書き換えて対応しました。

```js
clearEventMemo(){
  return this.element.findElement(By.css("textarea.event-memo"))
    .then(elem => {
      return elem.clear()
        //とりあえずなんでもいいので一文字入力
        .then(elem.sendKeys('a'))
        //その一文字をバックスペースで削除
        .then(elem.sendKeys(Key.BACK_SPACE));
}
```

ちなみに空文字はダメでした。下記のコードは期待通り動きません。

```js
clearEventMemo(){
  return this.element.findElement(By.css("textarea.event-memo"))
    .then(elem => elem.clear().then(() => elem.sendKeys('')))
}
```
mysqlからmysqliへの書き換え方法

#概要
PHP7系以降のバージョンでは、mysql関数が使用出来ない為、mysqliクラスまたはPDOクラスの関数等で書き換える必要がある。現在多くの主要レンタルサーバ等では、標準でPHP5系が採用されており、セキュリティ等のサポート切れの問題で、PHP7系に切り替わる日がやってくることが予想されるが、今からmysql関数で記述されている部分を書き換えておけば安心である。今回はmysql関数をmysqliクラスの関数等で書き換える方法についてまとめておく。

#mysqliとは
mysqlの機能拡張版である。
**mysqli** = **mysql** + **improved**

#オブジェクト指向型で書き換える
**手続き型**（クラスを利用していない）ではなく、**オブジェクト指向型**（mysqliクラスをオブジェクト化して使用）での書き換えが推奨されているので、それに従い書き換える方法を示す。

#mysql関数（手続き型）
```
//データベースに接続
$con = mysql_connect($host, $username, $password);
if (!$con) {
    error_log(mysql_error());
    exit;
}

//データベースの選択
$res = mysql_select_db($dbname, $con);
if (!$res) {
    error_log(mysql_error());
    exit;
}

//SQLを実行
$res = mysql_query($sql, $con);
if (!$res) {
    error_log(mysql_error());
    exit;
}

//結果の出力
while($row = mysql_fetch_assoc($res)){
    error_log(mysql_real_escape_string($row['name']));
}

//接続のクローズ
mysql_close($con);
```
#mysqli関数（オブジェクト指向型）

```
//データベースの接続と選択
$mysqli = new mysqli($host, $username, $password, $dbname);
if ($mysqli->connect_error) {
    error_log($mysqli->connect_error);
    exit;
}

//SQLを実行
$res = $mysqli->query($sql);
if (!$res) {
    error_log($mysqli->error);
    exit;
}

//結果の出力
while ($row = $res->fetch_assoc()){
    error_log($mysqli->real_escape_string($row['name']));
}

//接続のクローズ
$mysqli->close();
```
#mysql_connect()関数＆mysql_select_db()関数を書き換える
**new**して**mysqliオブジェクト**を作成する。**４番目の引数**に**データベース名**を指定することで、DBの接続と選択処理が一行で書ける。

```
$mysqli = new mysqli($host, $username, $password, $dbname)
```
mysql：http://php.net/manual/ja/function.mysql-connect.php
mysqli：http://php.net/manual/ja/function.mysqli-connect.php
#mysql_query()関数を書き換える
```
 $mysqli->query($sql)
```
mysql：http://php.net/manual/ja/function.mysql-query.php
mysqli：http://php.net/manual/ja/mysqli.query.php
#mysql_fetch_assoc()関数を書き換える
```
$result = $mysqli->query($sql)
$result->fetch_assoc()
```
mysql：http://php.net/manual/ja/function.mysql-fetch-assoc.php
mysqli：http://php.net/manual/ja/mysqli-result.fetch-assoc.php
#mysql_error()関数を書き換える
```
$mysqli->error
```
mysql：http://php.net/manual/ja/function.mysql-error.php
mysqli：http://php.net/manual/ja/mysqli.error.php
#mysql_real_escape_string()関数を書き換える
```
$mysqli->real_escape_string($string)
```
mysql：http://php.net/manual/ja/function.mysql-real-escape-string.php
mysqli：http://php.net/manual/ja/mysqli.real-escape-string.php
データサイエンスの面接において知っておくべき２１のQ＆A（日本語訳その２「一番すばらしいと思うデータサイエンティストは？」）


Originally published in KDnuggets: <a href="http://www.kdnuggets.com/2016/02/21-data-science-interview-questions-answers.html">21 Must-Know Data Science Interview Questions and Answers</a>
*KDnuggetsより正式に和訳を書くことの許可を得ました。*
*Gregory-san thank you for the approval*

[前回](http://qiita.com/ogamiki/items/57d37d83b624e6f44804)に続き、今回はデータサイエンスの面接において答えられないといけない質問２１種類の二つの目の質問です。

#2.Which data scientists do you admire most? which startups?
和訳すると「一番すばらしいと思うデータサイエンティストとスタートアップ企業は何ですか？」となります。

原文
>This question does not have a correct answer, but here is my personal list of 12 Data Scientists I most admire, not in any particular order. 

この質問に答えはないとしていますが、その中であえて[Gregory Piatetsky](http://www.kdnuggets.com/author/gregory-piatetsky)さんが順不同で12人のデータサイエンティストを功績とともに紹介しています。


[Geoff Hinton](https://en.wikipedia.org/wiki/Geoffrey_Hinton),[Yann LeCun](https://en.wikipedia.org/wiki/Yann_LeCun)と[Yoshua Bengio](https://en.wikipedia.org/wiki/Yoshua_Bengio)はニューラルネットワークに対する粘り強い研究によって、今のディープラーニングブームを起こした三名です。

[Demis Hassabis](https://en.wikipedia.org/wiki/Demis_Hassabis)はDeepMindにおける活動として、アタリのゲームや囲碁において、人間のトッププレイヤーレベルの動きを達成させた人です。

DataKindの[Jake Porway](https://en.wikipedia.org/wiki/The_Numbers_Game)とU. Chicago/DSSGの[Rayid Ghani](https://en.wikipedia.org/wiki/Rayid_Ghani)はデータサイエンスへの貢献をソーシャルグッズから可能にした二人です。

[DJ Patil](https://en.wikipedia.org/wiki/DJ_Patil)はホワイトハウスの最初のデータサイエンティストとして、アメリカ合衆国に貢献した人です。

[Kirk D. Borne](http://www.datasciencecentral.com/profile/KirkBorne)はソーシャルメディアにおけるインフルエンサーでありリーダーの役割を果たしています。

[Claudia Perlich](https://sites.google.com/site/claudiaperlich/home)はKDD-2014[^1]の議長を務めた人です。

[^1]: KDDは最古のデータマイニングカンファレンスの一つで、学会、政府、企業から1200もの参加者がいます。


[Hilary Mason](https://en.wikipedia.org/wiki/Hilary_Mason_(data_scientist))はBitlyで高い業績を残した人です。

[Usama Fayyad](https://en.wikipedia.org/wiki/Usama_Fayyad)はリーダーシップを見せながら、KDDとデータサイエンティストにとって高い目標を与え続けた人です。

[Hadley Wickham](https://en.wikipedia.org/wiki/Hadley_Wickham)はRにおけるデータサイエンス、データビジュアライズ領域の開発者としてすばらしい功績(dplyr, ggplot2やRstudio)を上げた人です。

原文
>There are too many excellent startups in Data Science area, but I will not list them here to avoid a conflict of interest. 

スタートアップ企業に対してはあまりにも多く存在することから、KDnuggetsにstartupのタグがつけられている[記事へのリンク](http://www.kdnuggets.com/tag/startups)だけの紹介となっています。

#まとめ
答えがない質問ではありますが、学術的に結果を残した人やプロジェクトとして結果を残した人、協会の人として有名な方などデータサイエンティストとしても様々なポジションの方がいらっしゃるので、自分の目指すキャリアの中からあこがれを持つのがいいのかもしれません。また、有名な人の活動を追うことはその業界の最先端を知ることの近道にもなりますので、おすすめです。
超小型USBシリアル変換モジュール(AE-FT234X)をArduino互換機で使う

対象の製品はこちら。

![超小型ＵＳＢシリアル変換モジュール](http://akizukidenshi.com/img/goods/L/M-08461.jpg)
[超小型ＵＳＢシリアル変換モジュール AE-FT234X](http://akizukidenshi.com/img/goods/L/M-08461.jpg)

これを、

![AE-ATMEGA328-MINI](http://akizukidenshi.com/img/goods/C/K-10347.jpg)
この[Arduino Pro Mini互換機(AE-ATMEGA328-MINI)]((http://akizukidenshi.com/img/goods/C/K-10347.jpg))で使うおうという算段。

本当はこちら
![FT-232RQ](http://akizukidenshi.com/img/goods/C/K-09951.jpg)
([FT-232RQ](http://akizukidenshi.com/img/goods/C/K-09951.jpg))を買おうと思っていたのだが品切れでまぁ隣にあった安いやつでもいけるかなと思って。


## 結論から言うと

そのままではうまくいかない。

詳しくはこのあたりを。

> 超小型ＵＳＢシリアル変換モジュールをArduinoとして使う方法 (https://b.eax.jp/eh/arduino/13744/)

DTRリセットをモジュールに返さないといけないようなのだがこのモジュールではDTRを受け取れない。RTSを引き抜いてくるという裏技が書かれてあるがそれもちょっと...と思い他を探すとこれ。

> Arduino Pro Mini 互換 起動メモ (http://www.greysound.com/2014/05/07/arduino-pro-mini-%E4%BA%92%E6%8F%9B-%E8%B5%B7%E5%8B%95%E3%83%A1%E3%83%A2/)

書き込み中にArduino側のリセットボタンを押せばいける、と。

## 結論としては

うまくいった。

リセットのタイミングが難しいとあるが、Arduino IDEの設定で書込の詳細ログを表示するようにして

![](https://i.gyazo.com/244b07c673f3fd305f8ccb5e07a66a77.png)

のあたりのタイミングでArduinoをリセットすればすんなり書き込めます。

検証環境

- Arduino IDE 1.6.7
- AE-ATMEGA328-MINI
- AE-FT234X
Arduino+GoogleAppsScriptによる3G回線越しのお手軽データロギング

　山の中とが池のど真ん中など、ローカルネットワークから隔絶された所の環境測定を行うべく、Arduinoと3GIM( http://a3gs.wiki.fc2.com/ )でセンシングデバイスを構築しました。しかし次に待っていたのはサーバ確保の問題。上の人が動いてくれる気配はないし、自分のを使うのもいろいろと面倒だし、安定性にも自信がないので、代わりにGoogleスプレッドシートを用いてデータ収集を行うことにしました。

# GoogleAppsScript(GAS)を用いるメリット
最近のIoTムーブメントおかげで、データをアップロード・ロギングする選択肢はたくさんあります。XivelyとかM2Xとか。でもGASを使いたい。理由は、

 * 自前でサーバを用意する必要が無い。
    * HTTPSにも対応。多分下手に自分でサーバ立てるよりも安全。
    * まあこれは他のサービスにも当てはまりますね。
 * 全ての処理をGASで完結できるかも。
    * スプレッドシートに表ができてしまえば、もう後は煮るなり焼くなり。
 * 無料。

そんなところでしょうか。大体のデータ処理がGoogleのサーバ上で終わってしまうのがありがたいですね。

# 方法
簡潔に書くとこれだけです。

 1. スプレッドシートにGASでdoPost(e)メソッドを仕込んで、Webアプリとして公開する。
 1. Arduino(3GIM)からWebアプリのURLへPOSTメソッドでデータを送りつける。
    * 3GIMを用いる場合、ヘッダに`"Content-Type: application/x-www-form-urlencoded"`が必要です。

ヘッダを省略するとスプレッドシートに"undefined"のデータが延々とやって来ます。自分はここで詰まりました。

GASのコードはここのコードを改変して使わせて頂きました。(改変というか削っただけ。)
https://mashe.hawksey.info/2011/10/google-spreadsheets-as-a-database-insert-with-apps-script-form-postget-submit-method/

改変後

```js:code.gs
/*   
   Copyright 2011 Martin Hawksey
  
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at
  
       http://www.apache.org/licenses/LICENSE-2.0
  
   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/
/*
   Original
     https://mashe.hawksey.info/2011/10/google-spreadsheets-as-a-database-insert-with-apps-script-form-postget-submit-method/
   Customize history
     * 2016-04-30 Optimized for 3GIM and Arduino.(by Homimume[http://qiita.com/homimume])
*/

function doPost(e) {
  var ss = SpreadsheetApp.openById('[スプレッドシートのID]');
  var sheet = ss.getSheetByName("DATA");
  var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]; //read headers
  var nextRow = sheet.getLastRow(); // get next row
  var cell = sheet.getRange('a1');
  var col = 0;
  for (i in headers){ // loop through the headers and if a parameter name matches the header name insert the value
    if (headers[i] == "Timestamp"){
      val = new Date();
    } else {
      val = e.parameter[headers[i]]; 
    }
    cell.offset(nextRow, col).setValue(val);
    col++;
  }
  return ContentService.createTextOutput("PostOK");
}
```

実は正常にreturnしていなさそうです。実用上問題は無さそうですが・・・。

とりあえずここまで。あまりにも不親切なんで後日加筆するかもです。
Windows で VirtualBox の shared folder が遅かったので、SFTP Net Drive を使ってみた

# はじめに

VirtualBox を Windows で使うと、shared folder が、驚くほどに遅いです。

こちらの記事でも、遅さに言及されていて、解決策についても記載されています。
（参考）[Windows on Vagrantでsync folderを高速に使う方法](http://qiita.com/derui@github/items/44977e0de5b892009b2f)

VAGRANT + VirtualBox + ScotchBox という組み合わせが便利なのでよく使うのですが、symfony2 、concrete5 などを shared folder にインストールして、ブラウザでアクセスすると反応が激遅です。

ScotchBox は、標準では、/var/www 以下が shared folder になっています。
apache の DocumenRoot は /var/www/public になっていて、ここにインストールすると、shared folder 配下になります。
結果、反応が劇遅なります。

反応の遅さを解決するには、shared folder を使わないか、shared folder 以外のフォルダ、例えば /home/vagrant にインストールして、/var/www/public にリンクすればよいかと思います。
しかしながら、この場合 shared folder の対象外になるため、Windows 側からインストールしたファイルにアクセスできなくなります。

先に紹介した記事のように、rsync や SMB よりも、手軽に解決したいと思い、SFTP でアクセスしたフォルダを、Windows のドライブにマウントで出来ればいいのにと思って見つけたのが、SFTP Net Drive でした。

# SFTP Net Drive を使ってみる

インストールは非常に簡単です。以下のページの説明を読んでください。
https://www.eldos.com/sftp-net-drive/

設定画面もシンプルなので、接続に必要な情報を入力して、画面下部の「CONNECT」ボタンをクリックすると、Windows のドライブにマウントされます。鍵ファイルは、PUTTY 方式に変換しておく必要があります。

（参考） [[Vagrant] VagrantでSSH接続するためのSSH client導入法 for Windows ユーザー[PuTTY]](http://qiita.com/pakiran/items/eeeb736cbef5d8b609db)

![SFTPNetDriveFree.jpg](https://qiita-image-store.s3.amazonaws.com/0/1154/a2a6ae60-1d55-82be-d839-f8540dbca33e.jpeg)

標準の状態だと、/home/vagrant がマウントされますので、/ ルートからマウントしたい場合は、Profile Setting の drive セクションの Root folder on the Server を Server's root folder にします。

![SFTPNetDriveFree2.jpg](https://qiita-image-store.s3.amazonaws.com/0/1154/366d9a73-e60b-53e8-6ac5-b366c55f9117.jpeg)

# 利用したソフトウェア

◆VirtualBox
https://www.virtualbox.org/

◆VAGRANT
https://www.vagrantup.com/

◆SFTP Net Drive
https://www.eldos.com/sftp-net-drive/
http://www.forest.impress.co.jp/docs/review/20111110_489324.html

◆ScotchBox
https://box.scotch.io/
Wordpress用フレームワーク「Herbert」を試してみる

#はじめに

先月あたりにこちらの記事で，Wordpressプラグイン作成用フレームワーク「Herbert」の存在を知った．
[WordPressのプラグイン作成のためのフレームワーク・「Herbert」](http://kachibito.net/useful-resource/herbert)
Wordpressラブなエンジニアには目が離せないトピックであったと感じる．

しかしどうだろう，，，
**使いたくても日本語リファレンスは愚か，参考となる記事をほぼ存在しない．**

そこで[公式リファレンス](http://getherbert.com/)を解読しながら，何かしら役立つ情報が発信できればなと思う次第である．

#環境
ホストOS:Windows 10
ゲストOS:CentOS 6.7
Vagrant(ローカル開発環境)
vccw(Wordpress導入用)
Wordpress 4.5.1–ja
PHP ~~5.4.45~~←5.4だと動きませんでした．
＝＝＞5.6.21

#**Getting Started**

##前準備(Requirements)
どうやらcomposerが必要らしい．

curlで引っ張るなり(Linux or Mac OS)，直接ダウンロードする(Windows)なりしてインストールせよとのこと．
自分の環境はCentOS おんざ windowsなので，前者である．


```
$ curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer
```
書いてあったとおりにコピペすればよし．

##インストール(Installation)
composerが入れば，インストール自体とても簡単である．
ソースをダウンロードして，`composer install`
ダウンロード方法は以下の2種類

### 1.Gitからクローン
作業用ディレクトリ(ここではtest-plugin)にクローン
```
git clone https://github.com/getherbert/herbert.git test-plugin
```

### 2.ZIPでダウンロード
Direct Downloadから直接入手→展開

##wp用プラグインフォルダにリンク(Working with WordPress)
先ほど入手したソースファイルを`wp-content/plugins/`に置くための処理
シンボリックリンクを貼っている．ちなみにplugin-nameはプラグインの名前で自由に決めてよし．

```
ln -s 「入手したソースフォルダのパス」 「～～/wordpress/wp-content/plugins/plugin-name」
```

何をやってるのかわからない方は，直接wp-content/plugins配下にフォルダ作ってソースをコピーしても良いと思われる．

#おさらい
フレームワークになれた方なら，よくあるインストール手順であろう．

- composerを使ったインストール
- wordpressのプラグインフォルダにリンク

今回はここまで
次回は**Naming your Plugin**から
設定ファイルをイジりましょう
[Wordpress用フレームワーク「Herbert」プラグイン名の設定](http://qiita.com/tonchan1216/items/6b7fc40bb24582bb7138)
【俺メモ】CentOS7にNode.js＋SQLite3環境をインストール

うーん、インストールでコケたからメモっておく。
下の手順はうまくいった後やで。

# 使用するツール・ライブラリ等

## nodebrew
Node.jsのバージョンごとに環境を切り替えてくれるツールや。
これでインストールから切り替えも楽チンやで。
[nodebrew - Node.js version manager](https://github.com/hokaccha/nodebrew)

## node-sqlite3
Node.js用のSQLite3に接続するパッケージや。
[Asynchronous, non-blocking SQLite3 bindings for Node.js](https://github.com/mapbox/node-sqlite3)

## node-pre-gyp
Node.jsでC++のバイナリをコンパイル？（よく調べてないけど）するためのものっぽい。
[Node.js tool for easy binary deployment of C++ addons](https://github.com/mapbox/node-pre-gyp)

# インストール

## SQLite3インストール

```shell-session
$ sudo yum install sqlite3
```

## Node.jsバージョン指定
node-sqlite3がNode.jsのバージョンを指定してるから注意な。
指定のバージョンは上の公式ページ(GitHub)のサイトに書いてあるからチェックや。

```shell-session
$ nodebrew install-binary v5.11.0
$ nodebrew use v5.11.0
$ node -v
```

## node-pre-gypとnode-sqlite3インストール

```shell-session
$ npm install -g node-pre-gyp
$ npm install -g node-sqlite3
```

もしかすると、node-pre-gypいらへんかもしれへんわ。
Optimize Game Objects設定の効果計測

# Optimize Game Objects設定とは

FBXのインポート設定に「Optimize Game Objects」というものがあります。
これは、階層構造になっているFBXの内部構造を最適化し、アニメーションの処理を高速化するためのものです。
詳しくはテラシュールブログさんの内容をご覧下さい。（少し前の記事なので、今のUnityではインターフェースが変わっていますが、効能は同じです）
http://tsubakit1.hateblo.jp/entry/2015/04/30/012956

![optimize_check.png](https://qiita-image-store.s3.amazonaws.com/0/66080/f8900e6c-c358-b48e-1a91-be17221971e4.png)

# 計測してみる

これが実際にどの程度高速化するのかを計測してみました。
計測環境は以下の通りです。

- Unity5.3.4p5を使用
- 「SDユニティちゃん 3Dモデルデータ」を使い、Optimize設定をONにしたものとOFFにしたものをそれぞれ15体づつ並べ、Profilerで計測する

![unity-chan.png](https://qiita-image-store.s3.amazonaws.com/0/66080/922e32b0-e648-9000-994b-c7f976ccf15b.png)

# 計測結果

## Optimize無し

0.71～0.87ms程度

![profile_normal.png](https://qiita-image-store.s3.amazonaws.com/0/66080/dc4a69d8-7342-309d-194f-cb0046466bc7.png)

## Optimize有り

0.27～0.41ms程度

![profile_optimize.png](https://qiita-image-store.s3.amazonaws.com/0/66080/b37ac6b0-8241-79b3-c029-33ae240b9dfc.png)

結構違いが出ました。
特に理由がない限りはOptimize設定はONの方が良さそうです。

# Optimize設定をすることによるデメリット

Optimize設定をすることでデメリットが存在します。
２つほど例を挙げてみます。

## 特定のボーンに対する計算を行う時に追加の設定が必要

例えば髪などの揺れものをスクリプトで制御するケースとか、手に武器を持たせるケースなどは、取り扱うボーン名をあらかじめインポート前に指定しておく必要があります。こちらはテラシュールブログさんにも記載がありますね。

ゲームでは多種多様なモデルが出てくるはずで、これらに対して追加出力するボーンを逐一設定しているとなかなかに面倒です。だからと言って全てのモデルで共通の設定をすると、特定のモデルでしか使わないボーンが全てのモデルに混入して、ちょっと処理負荷が増えてしまいます。

アセットインポーターで自動設定することも出来ますが、いずれにせよ色々考える必要があります。

## あとでボーンが必要になった時にインポートしなおしになる

リリースされたゲームで仕様変更があり、特定のボーンが必要になったとします。例えば髪を揺らすことになったので、人間系のモデルで髪のボーンが新たに必要になる、といったケースですね。

この時、既にOptimize設定済みの人間系のモデル全てに対し、髪のボーンを追加出力する設定をしなおさなくてはいけません。端的に言うとプレハブの出し直しです。

更にアセットバンドルにしていた場合、アセットバンドルの更新が入ります。遊んでくれているユーザーさんにダウンロードを強いてしまう訳です。

これらは、予めOptimizeしないでおけば避けられる問題です。
もしも処理負荷をそこまで気にしなくても良いなら、Optimizeしないのも一つの選択かと思います。メリットとデメリットを見極めて使いたいですね。
【Objective-C】StoryboardでセットしたUITabBarControllerの画像が実行時に反映されない

## 現象
XcodeでUITabBarに画像をセットしたいが、オリジナルで作った画像をセットすると青色でfillされ、反映されない。

## 原因
UITabBarにセットする画像に、アルファチャネルが含まれていない。

## 対策
アルファチャネルを含んだ画像を使用する。

## 余談
以下のサイトにアルファチャネルを含む画像をダウンロードできる。他にもiOS、Android、Windows8、Windows10などのデバイスを指定できる。当方はよく利用している。

https://icons8.com/
Mac OS X El CapitanからOpenSSLのヘッダファイルが消えた話

最新のMac OS X 10.11から、システムの提供するOpenSSLのヘッダファイルが消えました。

これについて、Macnetworkprog MLの投稿「[Re: OpenSSL -> Secure Transport for libevent2](http://lists.apple.com/archives/macnetworkprog/2015/Jun/msg00025.html)」にAppleの技術者による説明があります。

* OpenSSLは10.7の頃からdeprecated（非推奨）だった。OpenSSLがバージョン間のバイナリ互換性を担保しなかったので、最新版にアップデートできなかったからだ。（訳注：0.9.8系と1.0.x系の話ですかね…？実害の有無ではなく、今後への危機感を持ったってことなら理解はできますね）
* 10.7の頃からOpenSSLのヘッダファイルを使ってビルドすると非推奨の警告が出ていた
* 10.11でOpenSSLのヘッダファイルを削除した（訳注：共有ライブラリのみ残っている）
* 各アプリ内にOpenSSLのコピーを持つことをオススメする（訳注：システムの提供する共有ライブラリをあてにするな、ということでしょう）。もしくは、ネイティブAPIである[Secure Transport](https://developer.apple.com/library/mac/documentation/Security/Reference/secureTransportRef/index.html)を使うこともできるよ。

OpenSSLのヘッダファイルは消えたものの、実行バイナリ`/usr/bin/openssl`や共有ライブラリ`/usr/lib/libssl.0.9.8.dylib`は残っていたりして非常に気持ち悪い状態です。
セキュリティエンジニアとしての道

ヤフー知恵袋の話題もあって、セキュリティエンジニアに興味津々ですよね。
ね。
今回は簡単にセキュリティエンジニアの説明と、資格周り、資料のご紹介をします。

# セキュリティエンジニアとは

検索しました（笑）

>セキュリティエンジニアとは、情報セキュリティに特化したエンジニアのことです。セキュリティに配慮したシステム設計や構築、システム運用、サイバー攻撃を未然に防ぐための調査や改善などを行います。 技術職のため黙々と仕事をするイメージを持たれがちですが、実際はクライアントと意見交換をするシーンが多く、コミュニケーション能力や人柄も重視される仕事です

https://www.internetacademy.jp/it/job-description-and-annual-income-of-security-engineers.html

セキュリティといってもさまざまフィールドのセキュリティがありますよね。
インフラ部分のネットワーク、サーバのセキュリティ
開発、設計のセキュリティ
運用レベルのセキュリティ

できたてほやほやのシステムの脆弱性を調べる専門会社も多く存在するので、
インジェクションなどの攻撃に対する防御ができているかを調べるセキュリティエンジニアもいます。

各フィールドのセキュリティを考えるのは、今の時代ならアプリケーション、インフラエンジニアとして当然です。
今国家レベルで求められているセキュリティエンジニアとは、
**フルスタックセキュリティエンジニアだと思います**

改正サイバー法の成立により、情報セキュリティスペシャリストの資格が廃止され、新しい国家資格である情報処理安全確保支援士が新設されるのは、IT技術の中で包括的にセキュリティのことを考え対策、運用をすることのできる人材を求めているからです。

# セキュリティエンジニアとして求められるのは

最近セキュリティ知識分野の人材スキルマップが更新されました
http://www.jnsa.org/result/2016/skillmap/

下記の役割ごとに求められるセキュリティスキルが定義されています。

```
CISO（最高情報セキュリティ責任者）
POC（Point of Contact）
ノーティフィケーション
コマンダー
トリアージ
インシデントマネージャー
インシデントハンドラー
キュレーター
リサーチャー
ソリューションアナリスト
セルフアセスメント
脆弱性診断士
教育・啓発
フォレンジックエンジニア
インベスティゲーター
リーガルアドバイザー
ＩＴ企画部門
ITシステム部門
情報セキュリティ監査人
```

よくわからない役割もありますが、
リンク先のファイルに説明があるので調べてみてください。

# セキュリティの資格

調べてみましたが、結構ありますね。

## CISSP
Certified Information Systems Security Professional

情報セキュリティに関する知識を有したプロフェッショナルであることを証明する国際資格。
非ベンダーが実施しているセキュリティ資格の中で最も評価されているものの1つ。
3年毎に再認定を受ける必要あり。
資格を維持する年会費もあり。

## SSCP
Systems Security Certified Practitioner

CISSP受験の厳しい実務経験要件を満たせない人のための国際資格。
3年毎に再認定を受ける必要あり。
資格を維持する年会費もあり。

## GSE
GIAC Security Expert

認知度が高く、評価されているもう1つのセキュリティ国際資格。
３つの下位レベル資格
GSEC（GIAC Security Essentials Certification）、GCIA（GIAC Certified Intrusion Analyst）、GCIH（GIAC Certified Incident Handler）
の取得。
それらのうちの少なくとも2つは「Gold」レベルの必要あり。
Goldレベルは筆記試験、テクニカルレポートを提出し、面接試験もある。

## CCNA Security
シスコ技術者認定（セキュリティ）
シスコのネットワーク保護や、アソシエイトレベルが問われる。

## CCNP Security
シスコ技術者認定（セキュリティ）
CCNAの上位レベルの資格

## CCIE Security
シスコ技術者認定（セキュリティ）
シスコ技術者認定プログラムにおいて実質上最高位の資格であり、ネットワーク資格においても最高位。
更新試験は2年ごと。
筆記試験が約4万円、ラボ試験が約18万円

## CompTIA Security+

CompTIAが実施する資格試験。
セキュリティ技術者としての知識やスキル、活用能力などを証明できる。
世界的に認知されている信頼度の高い資格のひとつ。

## ネットワーク情報セキュリティマネージャー（NISM）

ネットワーク情報セキュリティマネージャーは、攻撃者による不正アクセスなどの危険性に対処するために創設されたベンダーフリーの資格試験。
NISM推進協議会が実施する資格認定のための講習を受け、一定のレベルに達することにより有資格者として認定される。

## 公認情報セキュリティマネージャー（CISM）

セキュリティ管理者のための国際的な資格。
セキュリティプログラムのマネジメントや設計、監督などを行う情報システム監査人を対象にしている。
情報セキュリティ管理に関する5年以上の実務経験が必要。

## 情報セキュリティスペシャリスト試験

日本の国家試験。
スキルレベル4に相当。
経済産業大臣から情報セキュリティスペシャリストとしての「情報処理技術者試験合格証書」が交付される。
改正サイバー法成立により廃止予定。

## 情報処理安全確保支援士
改正サイバー法成立により新設される国家資格。
試験合格者の登録制。
情報セキュリティスペシャリストにかわる、更新制の国家資格である。
試験の内容は、現行のSCのものをベースとする。2017年春以降、情報処理技術者試験と同じ日に年2回実施する方向。
現行のSC合格者が支援士登録を申請する場合、支援士試験を免除される。

# 政府の動き

こちらもご参考に。
[知っておきたい政府のセキュリティ対策](http://qiita.com/hatahata/items/222393551c4272eb546c)

そして最近ですと
経済産業省が情報セキュリティ専門の「課」を新設してます。
また、国際情報セキュリティ企画官も設定する予定みたいです。

情報セキュリティ・情報化推進審議官の一人には、
サイバー対策の第一人者で情報セキュリティー会社「ラック」の伊東寛・ナショナルセキュリティ研究所長が起用されるそうです。


# セキュリティに関する資料

http://www.nisc.go.jp/materials/
http://www.npa.go.jp/cyber/csmeeting/
http://www.ipa.go.jp/security/keihatsu/
スモールデバイスでセンサー情報を収集して、クラウドで集計・解析する with Slack

# コンセプト

raspberry pi 等のスモールデバイスにセンサーを接続して情報を収集する場合、
情報の永続性や集計・解析結果へのアクセスの容易性等から
クラウドと連携すると便利です。
色々なやり方がありますが、自分はSlackが慣れているので、Slackを用いました。

センサーからの情報を収集・解析する事によって、健康に資する使い方が様々あります。
照度センサーによる情報を解析すると、例えば一人暮らしの場合、寝室は
　日没後は暗くなる（もしくは遮光カーテンで昼間も暗いまま）
　帰宅後に明るくなる
　睡眠時に暗くなる
　日照または起床後の室内灯で明るくなる
となるので、
　夜間の暗い時間を測定すれば睡眠時間を
　夜に暗くならなかった場合、点灯したまま寝落ちした事を
把握出来ます。

点灯したままの睡眠は質が低いので健康に良くありませんし
睡眠時間が短いのも良くありません。
睡眠時間が長くても、細切れ睡眠だと効率が落ちます。

という訳で、寝室の照度を観測すると、健康に関する情報が取得できます。

# システム構成

スモールデバイス --> http リクエスト --> Slack WebHook --> Slack

クラウドサーバーで
　Slack用Hubot --> 発言ログファイル
　発言ログファイルをバッチ処理
　処理結果をWebやSlackのチャンネル等で閲覧可能に

Slackは無料でサービスを作れるので、コスト面で有利です。
クラウドサーバーは、IDCFの毎月500円定額サーバーを自分は使用しています。

スモールデバイスでのセンサー出力をファイル化する部分・Slackを立てる部分・Slack WebHookを設定する部分は、情報ソースが沢山ありますので割愛させて頂きます。

# スモールデバイスからのhttpリクエスト

自分は、下記のようなbashの関数を作成して使用しています。

```
function call_slack_webapi {
  if [ $# -lt 2 ] ; then
     msg="${FUNCNAME[0]} text url <channel> <username> <icon_emoji>"
     show_usage_and_quit "$msg"
  fi
  text="$1"
  url=$2
  channel=${3:-#general}
  username=${4:-webhookbot}
  icon_emoji=${5:-:ghost:}
  out_text=$(now)' '"$text"
  json="payload={\"channel\": \"$channel\", \"username\": \"$username\",
       \"text\": \"$out_text\", \"icon_emoji\": \"$icon_emoji\"}"
  set +u
  curl -s -S -X POST --data-urlencode "$json" $url >/dev/null 2>&1
  set -u
}
function now {
  TZ=Japan date '+%Y-%m-%d %H:%M:%S'
}
```
[Swift] [iOS] switch文で二次元の範囲を指定したいときの書き方

# 目的
よくタップの場所の判定を二次元で考えたい時にswitch文を使うのでメモ
switch文に直接範囲を書くと長くなるのでClosedInterval\<CGFloat>を使う。

# 書き方
```swift
let pictureXRange: ClosedInterval<CGFloat> = CGFloat(指定したい範囲X軸の先端の座標)...CGFloat(指定したい範囲のX軸の末尾の座標)
let pictureYRange: ClosedInterval<CGFloat> = CGFloat(指定したい範囲Y軸の先端の座標)...CGFloat(指定したい範囲のY軸の末尾の座標)

// gestureRecognizer.viewタップされるView
let tapedCGPoint = gestureRecognizer.locationOfTouch(0, inView: gestureRecognizer.view)
let tapedPointXY = (tapedCGPoint.x, tapedCGPoint.y)

switch tapedPointXY {
case (pictureXRange, pictureYRange):  
    print("taped")
default:
    // 処理
}
```

# 問題
```swift
switch tapedPointXY {
case (pictureXRange, pictureYRange): 
```
をpictureXRange, pictureYRangeをまとめたいので

```swift
let pictureXYRange = (pictureXRange, pictureYRange)
switch tapedPointXY {
case pictureXYRange: 
```

と書きたいがなぜかエラーになってしまう。
MacにRとR Studioをインストール

MacにRとR Studioをインストールしたときのメモ
まあ普通にすんなりとできました。

## 前提条件
Mac OS X El Captain(10.11.3)
R：3.2.4
R Studio : 0.99.896

## そもそもR/R Studioとは
Rはオープンソースの統計言語かつ環境
R StudioはRのIDEというか、統合開発環境。RだけでももちろんRは動くけれども色々便利なので入れます。eclipseのイメージで、関数や変数の補完をしてくれたり、ウィンドウが整理されてて見やすいです。

## Rをダウンロード＆インストール
・以下のリンクへ飛ぶ。最新版のリンクをクリックして、対象ファイルをダウンロード。
https://cran.r-project.org/bin/macosx/

・![スクリーンショット 2016-04-30 17.30.01.png](https://qiita-image-store.s3.amazonaws.com/0/119378/e3cec36d-5a82-6cf0-84c0-d82668031fc7.png)

・ダウンロードしたファイルを実行。基本的に全部「続ける」とか「はい」で進む。
## R Studioのインストール
・以下のリンクへ飛ぶ。Serverとか色々あるけど無視して、Clientと書かれているものの最新版で自分の入れたいOSのもの（今回はMac）をクリックして対象ファイルをダウンロードする
https://www.rstudio.com/products/rstudio/download/
![スクリーンショット 2016-04-30 17.33.23.png](https://qiita-image-store.s3.amazonaws.com/0/119378/056508dc-ee24-d27b-7927-13192376d7c4.png)
・ダウンロードファイルを実行すると以下のようなウィンドウが現れるので、ドラッグ＆ドロップ。これでインストール完了
![スクリーンショット 2016-04-30 22.37.47.png](https://qiita-image-store.s3.amazonaws.com/0/119378/51355fe8-8d99-0a4a-f99d-fa199d95244d.png)


## R Studio　こんなかんじ
おしゃれさん。
![スクリーンショット 2016-04-30 22.39.49.png](https://qiita-image-store.s3.amazonaws.com/0/119378/25df7d7c-8b8c-f29d-5ee9-b0700ec4094a.png)
tensorFlow : ニューラルネットワークによる回帰(regression)

#はじめに
画像の分類やオブジェクト認識などの問題でDNNが注目されていまして，たくさんのサンプルコードが公開されています．これらは分類(classification)の問題ですが，回帰(regression)の問題をDNNで解きたい場面もあると思います．本稿ではtensorFlowとscikit-learnのデータセットを用いて回帰の問題を解いてみようと思います．

#データセット
scikit-learnの"diabetes"のデータセットを用います．これは糖尿病患者の生理学的な特徴量(10次元, real)と1年後の病状を表すターゲット(1次元, int)をセットにしたデータです．特徴量は$\pm0.2$に正規化されており，ターゲットの値域は$25<y<346$となっています．各特徴量がそれぞれの値が何を意味しているか理解していませんが，とりあえず回してみます．サンプル数は442です．

#ネットワーク構造
全結合構造(MLP)を用います．
入力は10次元，中間層は256次元，出力層は1次元です．活性化関数としてランプ関数( ``relu()`` )を用いますが，出力層では活性化関数を用いずに直接出力とします．入出力は正規化等はせずそのまま使いました．

#コード
```regression.py

#特徴量
x = tf.placeholder("float", shape=[None, 10]) 
#ターゲット
y_ = tf.placeholder("float", shape=[None, 1])


w1 = tf.Variable(tf.truncated_normal([10, 256], stddev=0.1))
b1 = tf.Variable(tf.constant(1.0, shape=[256]))
h1 = tf.nn.relu(tf.matmul(x, w1) + b1)

w2 = tf.Variable(tf.truncated_normal([256, 1], stddev=0.1))
b2 = tf.Variable(tf.constant(1.0, shape=[1]))
y = tf.nn.relu(tf.matmul(h1, w2) + b2)

#二乗誤差
loss = tf.reduce_sum(tf.square(y - y_))
train_step = tf.train.AdagradOptimizer(0.05).minimize(loss)
```

入力が10次元の特徴ベクトルと1次元のターゲットとなります．誤差として二乗誤差を用いて``AdagradOptimizer``によって最小化します．

#おわりに
回帰の問題においても分類の問題と同様の発想で，最終出力層のみ変更することで対応できました．今回はデータに対して特に前処理を行いませんでしが，生のデータであれば正規化等の処理が重要になってくると思われます．
gccの_Generic式がclangの挙動と異なる

#gccの_Generic式がclangの挙動と異なる

##C11の_Generic式について
**僕は余りC言語に詳しくないので,この挙動に関して詳しい,もしくは説明できる方がいましたらコメントなどで補足してくれると大変助かります.**

**コメントで言及しましたが,これは規格バグっぽいです.n1930参照**

↓のコードをgcc5.3でコンパイルする.オプションはなし.

```c
#include <stdio.h>

enum {a=1,b,c};

int main(void) {
_Generic((char[b]){0}, char[1]:puts("1"), char[2]:puts("2"), char[3]:puts("3"));
}
```

こんなエラーがでる

```sh
main.c: 関数 ‘main’ 内:
main.c:6:10: エラー: ‘_Generic’ selector of type ‘char *’ is not compatible with any association
 _Generic((char[b]){0}, char[1]:puts("1"), char[2]:puts("2"), char[3]:puts("3"));
          ^
```

clang3.7でコンパイルする.オプションはなし.
通る.しかも正常に実行される.

```sh
./a.out
2
```

enumじゃなくて,例えばsizeof演算子を使ってみる.

```c
#include <stdio.h>

enum {a=1,b,c};

int main(void) {
_Generic((char[sizeof(char)]){0}, char[1]:puts("1"), char[2]:puts("2"), char[3]:puts("3"));
}

```

エラーがでる

```sh
main.c: 関数 ‘main’ 内:
main.c:6:10: エラー: ‘_Generic’ selector of type ‘char *’ is not compatible with any association
 _Generic((char[sizeof(char)]){0}, char[1]:puts("1"), char[2]:puts("2"), char[3]:puts("3"));
          ^
```

clangはもちろんエラーなんて出ないし正常に実行される.

エラーの文章で一つおかしいと思う所は,`(char[sizeof(char)]){0}`の型はchar[1]でchar*じゃないんじゃないか?ということ.

本来はclangの挙動になるべきだと思う.

バグかどうか分かんないけど,もしこれがバグならコンパイラのバグなんて初めて踏んだのでちょっと嬉しかったり.

**詳しい方のコメントお待ちしております.**