OmniAICreator/Qiita-1.07M huggingface dataset:
Unity5.5βでスクリプトエディタにVisualStudioCodeを使う

Unity5.5βからスクリプトエディタにVisual Studio Codeが使えるようになりました。
Visual Studio や Mono Develop と比べて軽量で、動作環境を選ばないので、何処でもコードが書けるようになります。

![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/35009/2ef10e76-dd96-28e4-e755-63c96ea968d9.png)

コード以外の表示される情報量が少なくて済むので、画面を広く使えます。

# 使うもの
+ [Unity ベータ版プログラム](https://unity3d.com/jp/unity/beta)
(2016/08/31時点での最新はUnity5.5.0b1)
+ [Visual Studio Code](https://code.visualstudio.com/)

# あると便利なもの
[.NET Core SDK](https://www.microsoft.com/net/core)

# 導入方法

1. Unity Editorのメニューから `Edit` → `Preferences...` を開く
2. `External Script Editor` を選択、 `visual Studio Code` を選択する。
初回のみ `Brouse...` から `Visual Studio Code` への PATHを指定する必要がある。

![fig001.png](https://qiita-image-store.s3.amazonaws.com/0/35009/708d426f-5392-9f75-c92a-930cbc0b625d.png)

# 注意

同じ環境で **安定板の** Unity Editorを併用していると、`External Script Editor` の選択肢に `visual Studio Code` が現れます。
ただ、単なる外部エディタの扱いなので、 `.vscode/settings.json` の自動生成が動作しません。
今使ってるgoをそのままに、他のバージョンのgoをインストールして使う

メモです。

```
# 新しいバージョンのディレクトリを作る
$mkdir ~/go1.7

# 好きな場所にgoをダウンロードする
$wget https://storage.googleapis.com/golang/go1.7.linux-amd64.tar.gz

# 展開
$tar -C ~/go1.7 -xzf go1.7.linux-amd64.tar.gz

# 使う。go1.7が動くことを確認する
$GOROOT=~/go1.7/go/ ~/go1.7/go/bin/go version
go version go1.7 linux/amd64

# エイリアスを.zsrhcなりに追加する。これで go1.7でgo1.7が動く。
alias go1.7="GOROOT=~/go1.7/go/ ~/go1.7/go/bin/go"

# エディタ等でGOROOTを見せる必要がある時は環境変数でexport
$export GOROOT=~/go1.7/go 
```
UIRefreshControlの位置をずらす


もうすっかりお馴染みになった、ひっぱって更新を実現する```UIRefreshControl```。iOS6からUIKitに組み込まれて、実装もとても簡単になりました。
今回は、WebViewに組み込んだ際にインジケーターが表示される位置を下にずらしたい場合のTipsをメモとして残します。

## 環境

- Xcode 7.3.1
- Swift2.2

## やり方

やり方としては、```UIRefreshControl```のサブクラスを作成して、```layoutSubviews```をオーバーライドして実現します。

>layoutSubviews() - Implement this method if you need more precise control over the layout of your subviews than either the constraint or autoresizing behaviors provide.

[Appleのドキュメント](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIRefreshControl_class/)には、制約またはオートサイズなど、サブビューのレイアウトをより正確に制御する必要がある場合に、このメソッドを実装します、とあります。

## 実装

実装はUIRefreshControlを継承したクラスを作成し、継承したクラスを実際には使います。下記は、Y軸方向にずらす位置があらかじめ決まったいる場合の簡単なサンプルとなります。

```CustomRefreshController.swift
import UIKit

class CustomRefreshControl: UIRefreshControl {

     override func layoutSubviews() {
        var frame: CGRect = self.frame
        let moveY: CGFloat = 55.0
        frame.origin.y = frame.origin.y + moveY
        self.frame = frame
    }
}
```

簡単ですね。


## 謝辞

- [[iOS] Swift時代の! コードによるViewレイアウトのベストプラクティス](http://qiita.com/nori0620/items/f2e6aef9cac3a8c9e366#layoutsubviews)
- [UIRefreshControl tableHeaderViewを無視して配置する方法](http://qiita.com/yusuga/items/f6554424fe9499fadc46)
- [UIViewControllerのライフサイクル](http://qiita.com/mo_to_44/items/0ca628b4cc74c8c5599d)
SSL対応後のWordpress管理画面で発生した無限リダイレクトループの修正方法

WordpressでSSL対応させました。サイトアクセスの速度を上げようと、NginxでProxyキャッシュを効かせています。
サイトへのアクセスは問題なくできましたが、管理画面にアクセスすると無限リダイレクトループに陥ってしまいました。
以下、対応したことを記載しました。


#リバースプロキシを使用している場合のSSL通信

SSLによるログインと管理画面へのアクセスを強制するためには、wp-config.php に 

```wp-config.php
define('FORCE_SSL_ADMIN', true);
```

を設定する必要があります。

ただ、リバースプロキシを使用している場合は、このオプションを設定するとすべてのリクエストが無限リダイレクトループに陥ります。これを避けるためには、

```wp-config.php
if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) {
       $_SERVER['HTTPS']='on';
}
```

という記述により、HTTP_X_FORWARDED_PROTO ヘッダーを認識するようにWordpressを構成する必要があります。

#nginxにproxy_set_header X-Forwarded-Proto httpsを追加設定

HTTP_X_FORWARDED_PROTO をwordpressで認識するために、proxy_set_header に以下の一行追加します。

```nginx.conf
proxy_set_header X-Forwarded-Proto https;
```

#wp-config.php の注意点

ここで注意したいのは、wp-config.php における記述場所です。

```wp-config.php
/* That's all, stop editing! Happy blogging. */
```


 よりも上に記述する必要があります。この記述よりも下に記載すると、デバッグモードで

>Notice: Constant FORCE_SSL_ADMIN already defined in 

というエラーメッセージが表示され、

>「このページにアクセスするための権限がありません。」

と、無限ループは解消されますが、管理画面へはアクセス出来ない状態が続きます。



以上の修正で管理画面へアクセスできるようになりました。

##参考にしたサイト


[Wordpress Codex 「管理画面での SSL 通信」](https://wpdocs.osdn.jp/%E7%AE%A1%E7%90%86%E7%94%BB%E9%9D%A2%E3%81%A7%E3%81%AE_SSL_%E9%80%9A%E4%BF%A1)

[StackExchange 「Constant FORCE_SSL_LOGIN already defined」](http://wordpress.stackexchange.com/questions/106983/error-messages-in-dashboard-login)
[メモ] C++Builder 10.1 Berlin Starterで、Hello World!  

## 動機

Delphiと[C++Builder Starter Edition](https://www.embarcadero.com/jp/products/cbuilder/starter)がいまなら現行のバージョンのライセンスを無料で発行してくれる、とのこと。
https://www.embarcadero.com/jp/products/cbuilder/starter/promotional-download
Special Offer - Before <del>￥38,000</del> Now ￥0 
って、書いてある。32-bitのWindowsのアプリのみ作成可能。

機能的な制限以外に、商用利用での制限
> - 個人または5人以下の企業／組織でかつC++Builderによって開発したアプリケーションに関連する収益が、1,000 USドルを越えないライセンス使用

なつかしいなぁ。(使ってたのは、Borland C++ 4だか、5.5とかだった気がするが...)、、ってのが動機.


## 環境
- Windows 10 64bit

## ボタン押したら、ラベルに、`Hello World`
1. ライセンス取得・ダウンロード・インストール
   ググる..
2. `RAD Studio 10.1 Berlin`の赤い <font color='red'>RX</font>アイコンをダブルクリック(周りが赤くて、RXはシロのアイコン)<br> ![CppBuilder14-2.png](https://qiita-image-store.s3.amazonaws.com/0/75594/f3038083-5f43-bd66-b6de-a6112ea69ece.png)

2. プロジェクト作成
    - メニューから> ファイル > 新規作成 > その他...
    - C++Builder プロジェクトの中の 'SDIアプリケーション'<br>![CppBuilder_Dev01.png](https://qiita-image-store.s3.amazonaws.com/0/75594/09168e1a-929b-b8a4-c53a-36bc6a307f0b.png)
    - 適当なフォルダーを(作って)選んで、`[フォルダー選択]`<br>![CppBuilder_Dev02.png](https://qiita-image-store.s3.amazonaws.com/0/75594/0167a305-81c6-0290-79cc-8609acdc8357.png)
    - こんなのがでてくる<br> ![CppBuilder_Dev03.png](https://qiita-image-store.s3.amazonaws.com/0/75594/092ce4f0-6558-be78-2821-886e88224470.png)
3. とりあえず、Window表示。
    - ツールパレット(右下)のStandardから、`TLabel`と`TButton`を、メインのフォームにドラッグ・アンド・ドロップ<br> ![CppBuilder_Dev04.png](https://qiita-image-store.s3.amazonaws.com/0/75594/c9c0a6ed-ec22-5519-736d-459e8d2d8ba8.png)
    - とりあえず、実行してみる. <br>メニューの 実行 > 実行 F9<br> ![CppBuilder_Dev05.png](https://qiita-image-store.s3.amazonaws.com/0/75594/b075a17a-50cb-8e39-cc06-a3e6ada619d4.png)
    - 右上の `X`をおして、終了

4. コードを書く
    - フォームエディタ(?)で、`Button1`をダブルクリック。
    - 出てきた関数にコードを書く.

        ```cpp:[Button1]をダブルクリックして、出てきた関数.
...
void __fastcall TSDIAppForm::Button1Click(TObject *Sender)
{
            this->Label1->SetTextBuf( L"Hello World !" );
}
```
    - 実行。
    - `[Button1]`を押す。<br> ![CppBuilder_Dev07.png](https://qiita-image-store.s3.amazonaws.com/0/75594/ffd04234-86ff-21a6-5548-cec4170ae8cf.png)


## その他
- エディタ、使いにくい。(カスタマイズできるの?)
- VBみたいのが、C++で、できる！と、十ん年前と同じ感想。
- 通常￥38,000 か...そうかそうか..
VisualStudioCodeでメソッド一覧を出すショートカット

**Ctrl + Shift + o**
![VSCode.gif](https://qiita-image-store.s3.amazonaws.com/0/94585/d6e4dc7f-8469-eecc-5eb9-30d0319a2565.gif)

※サンプルソースは下記を利用
https://github.com/Microsoft/vscode
Windows > ログオンするにはCtrl+Alt+Delを押すか、またはWindowsセキュリティボタンを使ってください

```txt:動作環境
Windows 7 pro (32bit)
```

PCを起動した時、普段の状況なら

> ログオンするにはCtrl+Alt+Delを押してください

になるが、今日見たPCは

> ログオンするにはCtrl+Alt+Delを押すか、またはWindowsセキュリティボタンを使ってください

になっていた。

上記の表示となる状況としては、外付けタッチディスプレイをUSB接続していた時。

USB接続を外したら、通常の表示「ログオンするにはCtrl+Alt+Delを押してください」になった。
Perl ワンライナーで複数行置換

Perlのワンライナーで複数行置換しようと思って少し苦労したので自分用メモ。
PerlはPerl5です。

# 複数行置換するためのワンライナー
まず基本形はこの書き方。

```bash:
$ cat filename | perl -0pe "s/aaa[\r\n ]+bbb/ccc\nddd/gm"
```

これで、aaa改行bbbがccc改行dddに置換されます。

ネットやQiitaで色々試しましたが、これ以外はうまくできなかった……
改行コード回りが微妙な感じでした。

# エスケープのまとめ
エスケープは細かいところ覚えられないので、メモっておきます。

最初ワンライナーのところをシングルクォートでやっていたのですけど、途中でダブルクォートにしてやりなおし。というのも、置換する対象がシングルクォート含むことが多いのでそうしておきました。

Perlワンライナーのダブルクォート内に書く正規表現のエスケープはこんなルール。

(　⇒　\\(
)　⇒　\\)
/　⇒　\\/
.　⇒　\\.
"　⇒　\\"
$　⇒　\\x24

元の文字列を、以上のルールでエディタで一括置換して使っています。
例えばこうなります。

$.ajax({url:'http://localhost/',type:"GET"});
↓エスケープする
\\x24\\.ajax\\({url:'http:\\/\\/localhost\\/',type:\\"GET\\"}\\);
↓正規表現にいれる
"s/aaa/\\x24\\.ajax\\({url:'http:\\/\\/localhost\\/',type:\\"GET\\"}\\);/gm"
さくらのクラウドのオブジェクトストレージをs3fsでマウントする

##概要
さくらのクラウドからさくらのオブジェクトストレージをマウントする手順

環境：

- CentOS6.8

前提条件：

- オブジェクトストレージにバケット作成済み
- さくらのクラウドにインスタンス作成済み

##s3fsのインストール
yum では入らないようなのでソースからインストールする

```bash:
##必要なパッケージをインストール
$ sudo yum install pkgconfig libcurl libcurl-devel libxml2-devel make automake gcc libstdc++-devel gcc-c++
##fuseをソースからインストール(最新バージョンはこちらで確認 https://github.com/libfuse/libfuse/releases)
$ sudo cd /usr/local/src
$ sudo wget https://github.com/libfuse/libfuse/releases/download/fuse-2.9.7/fuse-2.9.7.tar.gz
$ sudo tar zxvf fuse-2.9.7.tar.gz
$ sudo cd fuse-2.9.7
$ sudo ./configure --prefix=/usr
$ sudo make
$ sudo make install
##パスを設定
$ sudo echo "export PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/lib64/pkgconfig" >> ~/.bash_profile
$ sudo source ~/.bash_profile
##共有ライブラリの依存関係情報を更新する
$ sudo ldconfig
##カーネルモジュールをロード
$ sudo modprobe fuse

##s3fsをgitからインストール
##※さくらで動作確認済みのバージョン1.74をインストール(1.80だと正常に動かない部分があった)
$ sudo cd /usr/local/src
$ sudo wget https://github.com/s3fs-fuse/s3fs-fuse/archive/v1.74.tar.gz
$ sudo cd s3fs-fuse
$ sudo ./autogen.sh
$ sudo ./configure
$ sudo make
$ sudo make install
```
##アクセスキーの設定
複数マウントしたい場合は次の行に書く

```bash:
$ vim ~/.passwd-s3fs
------------------------------------------------------------
<バケット名>:<アクセスキー>:<シークレットアクセスキー
<バケット名>:<アクセスキー>:<シークレットアクセスキー
------------------------------------------------------------
$ chmod 600 ~/.passwd-s3fs
```
##sshfsの設定を行う
ファイルを作成して`user_allow_other`と記述

```
##rootでもアクセスできるようになる
$ echo 'user_allow_other' >> /etc/fuse.conf
```

##マウントする

```bash
##マウントポイントのディレクトリ作成
$ mkdir -p /mnt/dirb01
##マウントする
##sigv2オプションがないとエラーになるのでつける。
##デフォルトの認証方法(Signature Version 4)だとエラーになる
##さくらのオブジェクトストレージはSignature Version 2
##nomultipartオプションを付けないと20M以上のファイルの転送でエラーとなる？
$ /usr/local/bin/s3fs  dirb01 /mnt/dirb01/ -o allow_other,url=https://b.sakurastorage.jp,nomultipart
##確認する
$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/vda2              16G   11G  4.7G  70% /
tmpfs                 939M     0  939M   0% /dev/shm
/dev/vdb               59G   54G  2.0G  97% /mnt/disk1
s3fs                  256T     0  256T   0% /mnt/dirb01 ##←これ
##マウントしたディレクトリに1Gのダミーファイルを作成してみる
$ cd /mnt/dirb01
$ dd if=/dev/zero of=tempfile1G bs=1G count=1
$ ll
-rw-r--r--. 1 admin admin 1.0G Aug  4 06:17 tempfile1G
```
↓コンソール確認しても追加されてる
![23d9ea16-2f56-9966-9df6-eed6efa30c27.png](https://qiita-image-store.s3.amazonaws.com/0/76278/af6bde49-b5a9-1b91-e426-dd00f696b34d.png)


##ログを出力する場合
マウントがうまくいかない場合`-d`オプションをつけてログを確認する
出力先→ `less /var/log/messages`

##起動時にマウントする
↓fstabに記述する方法がわからなかったのでとりあえず
追記する

```/etc/rc.local
su - [実行するユーザ名] -c "/usr/local/bin/s3fs  dirb01 /mnt/dirb01/ -o allow_other,url=https://b.sakurastorage.jp,nomultipart" 
```
↑rootで実行されるため`su - [実行するユーザ名]`で実行ユーザを指定するようにしている

## アンマウントする場合
```bash
fusermount -u /mnt/dirb01/
```

busy状態でアンマウントできない場合`-z`オプションを加える

```bash
fusermount -zu /mnt/dirb01/
```


##参考
[CentOS6でs3fsをインストールする](http://hacknote.jp/archives/3952/)
[署名バージョン 4 署名プロセス](https://docs.aws.amazon.com/ja_jp/general/latest/gr/signature-version-4.html)
z/OSへのファイル転送

#はじめに
FFFTP等のFTPツールを使ってz/OSのメンバーやUSS上のファイルを普段送ったり/取得したりしていると、ツールが無い環境でFTPしなければいけない時に意外と困ったりした経験があったので、覚書としていくつか方法を記載。

#コマンド プロンプトでFTP
####<前提>
z側にFTPのA/S（アドレス・スペース)が上がっている事が前提。
*※分散系でいう、FTP daemon (process)が上がっているイメージ*
####<手順>
コマンドプロンプトを開き、ftpコマンドでz/OSと接続し、TSOのUID/PWDでログイン

```
# ftp zos.ip.addr
```

USS上のファイルをput/getしたい場合はLinuxとかの時と同じ操作感で操作
※例： USS上のファイル(/u/soumei/hoge.txt)をget

```
ftp> cd /u/soumei   　　　　<=対象のDirectoryへ移動
250 HFS directory /u/soumei is the current working directory

ftp> ls　　　　　　　　　　 <= リスト
200 Port request OK.
125 List started OK
hoge.txt　　　　　　　　　　　
250 List completed successfully.
ftp: 10 バイトが受信されました 0.00秒 10000.00KB/秒。

ftp> get hoge.txt　　　　　 <= get（mgetコマンドでも可）
200 Port request OK.
125 Sending data set /u/soumei/hoge.txt
250 Transfer completed successfully.
ftp: 11 バイトが受信されました 0.00秒 11000.00KB/秒。
```

####<個人的なMemo Point>
z/OSのPDSメンバーをput/getする場合は、cdコマンドの後に"//"をつけてあげる。
※例：SOUMEI.ZOS.JCLLIB(HOGE)をget

```
ftp> pwd
257 "/u/soumei" is the HFS working directory.　　<=上の例の続きで、今はUSS上にいる

ftp> cd //SOUMEI.ZOS.JCLLIB　　　　　　　　　　　<= getしたいメンバーまでcd。
250 The working directory "SOUMEI.ZOS.JCLLIB" is a partitioned data set

ftp> pwd                                      　　<= 移動できているか確認。
257 "'SOUMEI.ZOS.JCLLIB'" partitioned data set is working directory.

ftp> ls　　　　　　　　　　　　　　　　　　　　　　
200 Port request OK.
125 List started OK
CIFCTS51
CIFCTS52
CMNDDUMP
CPA52BKP
CPA53BKP
CTS52BKP
CTS53BKP
････中略・・・
HOGE
IEBCOPY
IMPRTC21
・・・後略・・・

ftp> get HOGE hoge.txt　　<=おなじみの操作(Get)。個人的には拡張子をget時につけてあげる
200 Port request OK.
125 Sending data set SOUMEI.@OS.JCLLIB(HOGE) FIXrecfm 80
250 Transfer completed successfully.
ftp: 8 バイトが受信されました 0.00秒 8.00KB/秒。
```

#PCOMM（IBM Personal Communications)
メインフレームの世界といえば、3270エミュレーター。
PCOMMが提供する機能でもPUT/GETできます。

####<手順>
ISPFのCommand Shellで、APVUFILEもしくはIND$FILEコマンドを実行。
コマンドをここで書いても駄目で、PCOMMのメニューバーにある”ホストへファイル送信"と”ホストからファイルを受信”の2つのボタンがあるので、どちらかをクリック
*PCOMMの画面イメージ*
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/135263/de1ca57d-811e-a6c9-460c-308479671b7e.png)
そうすると、こんな画面が出てきます。(*”ホストへファイル送信”*をクリックした場合)
![無題3.png](https://qiita-image-store.s3.amazonaws.com/0/135263/e2443e3b-ac21-64aa-8744-c0744f8b5129.png)

参照(B)をクリックすると転送したいファイルを選択でき、転送先や転送タイプ（Binaryやtext）等を適宜選択し、送信(S)をポチっとやって完了。

オプション(O）ボタンをクリックすると、転送タイプのカスタマイズ(CRLFの制御であったり、レコード形式(可変長・固定長)とかの変更)ができます。
![無題5.png](https://qiita-image-store.s3.amazonaws.com/0/135263/dfcee31c-7ec0-868e-408d-9508b3c568e4.png)
####<個人的なMemo Point>
ここで、「一般」タブのホストコマンド(O)でAPVUFILEもしくはIND$FILEを指定してあげます。
APVUFILEはz側に対応するモジュールを組み込む必要があるらしく、デフォルトでは使えないです。IND$FILEはデフォルトで入っているらしいので、こっちを指定しておけば大体大丈夫そう。

#最後に。。。
諸事情により、PCOMMのファイル転送についてあまり細かく書けていません。
画像の添付もイケてないので、時間をみつけてUpdateしていきたいと思います。
もう少しここが知りたいというのがあれば、ぜひ、コメントください。
iOS上で使える開発中に便利なデバッグメニューを作ってみた

> 追記：Swift3.0に対応しました。


前職のゲーム業界では一般的なデバッグメニューをiOSで作ったらどうだろうかと思って作ったので紹介。

# デバッグメニューって何？

ゲーム業界で言うデバッグメニューとは、デバッグでよく使うデータ表示やデータ操作をメニュー化したもので、これといった形式は決まっておらず、メーカーによってバラバラ。

グーグルで調べるとたくさん出てきます。おそらく殆どがリーク情報ですが。
自分が過去に携わったものもリークしてますね。どうやってリークしたのやら。
https://www.google.co.jp/search?q=game+debug+menu&safe=off&espv=2&biw=959&bih=960&source=lnms&tbm=isch&sa=X&ved=0ahUKEwib0MCQzenOAhUEm5QKHW6kDgsQ_AUIBigB#safe=off&tbm=isch&q=debug+menu


# 今回作ったもの

話がそれました。今回作ったのは、UIWindowを新規で用意して、その上にUIStackViewを配置し、そこにUILabelやUISliderを追加してます。

UIWindowの動きに関しては、[以前あげた記事](http://qiita.com/mothule/items/cc945610b3de6751ebf5)と同じです。

![LibraryPromotionAnimation.gif](https://qiita-image-store.s3.amazonaws.com/0/37274/6123b1ea-ac8e-62b9-3d5a-ee23376a6c56.gif)

### GitHub
https://github.com/mothule/RNDebugMenu


# どういった所で使えるか（ユースケース）
- デバッグメニューからSQLコマンド発行
- デバッグメニューから課金済み状態に再現
- UIには出てないデータ表示
- UIレイアウトの調整

など、コマンド実行と微調整、データ参照の３つに適しているかと思います。


# 作ってみた雑感
前職でゲーム向けフロントエンド（HPバーとか装備画面とか）作ったことがありますが、GUIデザイナーでできることは少なく、コード上での実装が殆どだったので、iOSやAndroidのUIは楽だなぁと感じていたのですが、やはりiOSといえど、UIKitがあれど、GUIデザイナーがあれど、レールから外れた応用・発展系の表現は、コード上でUI構築は避けては通れないんだなと再認識しました。

### またデバッグメニューの呼び出しでも違いがあり、悩みの１つです。
ゲームであれば、コントローラーがあるので、そのボタンにデバッグメニュー呼び出しを結びつけることで、いつでもどこでもデバッグメニュー呼び出しできる。しかも操作はコントローラーだからデバッグメニューが操作において邪魔になることは殆ど無い。

しかしiOSアプリだと呼び出しが容易に呼び出せる方法がボタン配置しかない。ジェスチャーやペアリングしたコントローラなどプロダクト機能外だと、不要な実装が多過ぎるし手間、またコード上で制御できないと、リリース時にはデバッグコードは消す必要があります。（プリプロセッサ制御）



# 今後の予定
まだ粗の目出す状態なので、そのまま使うとなかなか使いにくいかなと思います。
GitHubのスターがつくなどして人気があれば、CocoaPodsやCarthageといったパッケージ管理の対応や操作性やIF側のコード量を減らすなど、ライブラリ開発を進めようかなと思います。
Atomにflowtype環境をつくる

対象は、MacOS.

まずはflowをインストール

```
$ brew install flow
```

補完のために`nuclide`をインストール

[nuclide](https://atom.io/packages/nuclide)

が、オールインワンパッケージなので、flow以外の機能をすべてOFFにする。

`linter`と`linter-flow`をインストール。
nuclideのlintの結果は見づらいのでこちらを使う。
nuclideの通知機能をoffにしておかないと競合する。

これでatomのflow環境が整った。
補完やlintが効くようになる。

nuclideが大きすぎるので、補完のための小さいパッケージがほしい。
try/catch か throws Exception か


Javaで例外が起きうるコードを書いていると、あるIDEが `try/catch` をつけるか、`thorws Exception` をつけるかをサジェストしてきた.

それぞれが何を意味していて、いかに使い分ければ良いか.

## サンプルコード

`try/catch`

```.java
public void someMethod() {
	try {
		// do something which might fail.
	} catch (Exception e) {
		// handle the failure.
	}
}
```

`throws Exception`

```.java
public void someMethod() throws Exception {
	// do something which might fail.
}
```

## ハンドルするか/エラーを投げるか

２つの方法には大きな違いがある.

### `try/catch`: エラーを飲み込む. 

catch内部でrethorwしないとすると、メソッドのtry内部でエラーが発生したとしても、呼び出し元はそのエラーを見ない. そのため、メソッド内部で完璧にエラーを飲み込んでハンドルし、メソッドの目的(呼び出し元が期待する戻り値や処理)を果たすことに気をつける必要がある.

特定のエラー後に行いたい処理がある場合、try/catchを使うと書けそう.


### `throws`: エラーを呼び出し元に伝える.

`throw` を使っているメソッド内部で、エラーが発生した場合は、そのメソッドの呼び出し元がエラーをハンドルする必要がある.

メソッド宣言において、こういうエラーを投げうるということを宣言する意味がある.(そうすることで、呼び出し元にエラーハンドリングが推奨される.)


***

Rubyで言うと、`throws`はデフォルトで、`try/catch` は `begin/rescue` に対応するのかなと思った.


* 参考: [try/catch versus throws Exception](http://stackoverflow.com/questions/3241571/try-catch-versus-throws-exception)
Excel VBAでUnix Timestamp(ミリ秒付き)を取得する。

Node.jsの`new Date().valueOf()`で得られるUnixTimestampと同じ値をExcel VBAで取得する方法。
秒単位までは割と簡単なのだけどミリ秒単位までやるとめんどくさいという話。

↓こういう値をVBAで取得したい。

```
> new Date().valueOf()
1472735489962
```

色々ググってようやくこの形に落ち着きました。

Windows 7 Pro 32bit、Excel2010で検証済みです。(Excel2003でも動いた)

```vbnet
Option Explicit


Private Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type


Private Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME)


Private Function GetMillisecond() As Long
    Dim tSystem As SYSTEMTIME
    On Error Resume Next
    GetSystemTime tSystem
    GetMillisecond = tSystem.wMilliseconds
End Function


' (参考)http://d.hatena.ne.jp/KuroNeko666/20070821/1187689020
Public Function GetUnixTimestampWithMilliseconds() As Variant
    Dim ut As Variant
'    ut = ((Now - 25569) * 86400) - (3600 * 9) ' "- (3600 * 9)"は日本の時差を差し引いている。
'    ut = ut * 1000
'    ut = ut + GetMillisecond
    ut = (((Now - 25569) * 86400) - (3600 * 9)) * 1000 + GetMillisecond

    GetUnixTimestampWithMilliseconds = ut
End Function


Private Sub Test()
    Debug.Print "(Node.js) new Date().valueOf() === ", GetUnixTimestampWithMilliseconds
End Sub
```
機内のようなオフライン環境でDockerコンテナ内とローカル通信する際にレスポンスが遅い件

#背景
先日、海外出張の際に気がついたことをまとめます。飛行機の中で時間があったので、少しだけ開発を進めようかと思って、docker内のウェブアプリケーションにアクセスすると、異常にレスポンスが遅いことに気が付きました。

##環境
- MacBook (Retina, 12-inch, Early 2015)
- OS X 10.11.6
- Docker for Mac OS X (Version 1.12.0-a (build: 11213))
- [こちら](http://qiita.com/maloninc/items/369b469ca251119d9a39)のDockerfileを使用


##再現方法
- Docker内でWebrick等でWebサーバを起動
- ホスト側から`curl http://localhost:9292` 等でアクセスして、HTTPコマンドを叩く
- レスポンスが返るまで40秒ほど掛かる

##原因
どうやらDockerがポートフォワーディングする際に、内部的に何処かの外部サーバへアクセスしているように思われる。ホストはオフラインのため、外部サーバへのアクセスに必要な名前解決がタイムアウトするのに40秒かかっていることが原因と思われる。
実際にコンテナ内で `curl` で適当な外部サーバ（例：google.com）へアクセスしようとすると

```
curl: (6) Could not resolve host: google.com
```

というエラーがきっかり40秒で返ってくる。

##回避方法
`docker run`コマンドのオプションにコンテナ内のDNSを指定するオプションがあるので、オフラインの際には 0.0.0.0 を指定することで、すぐに名前解決がタイムアウトするようになる。

```
docker run --dns 0.0.0.0
```

Have a safe flight.
ITサービスマネージャー　2011年度　午後2 問3

#始めに
ＩＴサービスマネージャーの午後２の論文についてあれこれ書いてみようと思います
対象のシステムは[生命保険会社のシステム](http://qiita.com/triple4649/items/56d2b450f2b8b68bdfe5)をベースにしています

#問題文の解析
![ITサービスマネージャー2011‐03.png](https://qiita-image-store.s3.amazonaws.com/0/136860/22a73711-9809-f7fd-2882-7b87875b9ce7.png)
NSNotificationCenterでpostNotificationNameのuserInfoが認識してくれなくてハマった

## NG

```swift
NSNotificationCenter // .defaultCenter() を忘れてた！
    .postNotificationName(
        NotificationType.NotificationHoge.rawValue,
        object: nil,
        userInfo: ["hoge": fuga]
    )
```

エラーメッセージ

```
Value of type '[NSObject : AnyObject]?' has no member 'Key'
```

( ˘⊖˘) これだけじゃどうすればいいかわからないつらい

## OK

```swift
NSNotificationCenter.defaultCenter()
    .postNotificationName(
        NotificationType.NotificationHoge.rawValue,
        object: nil,
        userInfo: ["hoge": fuga]
    )
```

`NSNotificationCenter`の`defaultCenter()`を呼び忘れていたのが原因でした。
Quantum Chemistry - Classical Wave Equation

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Classical Wave Equation
https://www.youtube.com/watch?v=OpTAXlTVnT4&index=9&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh

- u(x, t) : 波の変位
- ピンクの図
  - 位置=0と位置=lを固定した、1次元の振動するstringを考える 
- classical wave equation: 2階の偏微分方程式 (以下、式1とする)
  - 2階: 一番多い微分の回数が2
  - xによる微分、tによる微分
  - v(ブイ): 速度 
  - u(x,t) = X(x)T(t) (以下、式2とする)
  - 変数分離法
  - u(x,t)をxだけの関数とtだけの関数に分離できる、と仮定する
- 緑の式
  - 式1に式2を代入する
  - X(x)T(t)のxによる微分ではT(t)は定数となり
  - X(x)T(t)のtによる微分ではX(x)は定数となり
  - 紫の式が得られる
- ピンクの式
  - 紫の式を変形して左側にxだけの式、次にtだけの式に整理した
  - この式が「どのようなx, どのようなtに対しても成り立つ」には式の値は定数(=k)となる
  - 定数はkともおけるが、-beta^2と置く(以下の式変形のため)
- 黄色の式
  - 左側: ピンクの式の1つ目と-beta^2から整理
  - 右側: ピンクの式の2つ目と-beta^2から整理
  - これらの式から水色の式が得られる (後述)


### 黄色の式から水色の式へ

黄色の式から水色の式への変換がぱっとでてこなかったので、本に登場していただく。
微分積分の本は2冊を選んでおり、その1冊
> サイエンス社 新版 演習 微分積分 by 寺田文行さんら
p167 2階線形微分方程式

(補足) 黄色の式は一部間違っており、xの微分の回数は2である。

```math
\frac{d^2 X(x)}{dx^2} = -{\beta}^2 X(x)
```

2階微分をy'', 1階微分をy', 0階微分をyと置くと、上記の式は以下となる。

```math
y'' = -{\beta}^2 y
```

式変形して以下となる。

```math
y'' + \beta ^2 y = 0
```

y'の項はないが明示すると (以下、式3とする)

```math
y'' + 0 y' + \beta ^2 y = 0
```

この式を解く。p167に記載の「特性方程式」を使う。

```math
y'' + ay' + by = 0
```

という微分方程式がある時、微分2階をlambda^2, 微分1階をlambda...などして以下の特性方程式を得る。

```math
\lambda ^2 + a \lambda + b = 0
```

式3に対する特性方程式は

```math
\lambda ^2 + 0 \lambda + {\beta}^2 = 0
```

式整理して

```math
\lambda ^2 = -{\beta}^2
```

2乗を解消すると、-1は虚数単位iの2乗なので

```math
\lambda = \pm i \beta
```

複素数の実数も明示すると (式4とする)

```math
\lambda = 0 + \pm i\beta
```

p167によると、特性方程式の階がa+ib, a-ibの虚数解の時、yは以下の形となる。

```math
y = e^{ax}(A cos bx + B sin bx)
```

式4において、a = 0, b=betaなので

```math
y = e^{0x}(A cos \beta x + B sin \beta x)
```

```math
y = 1(A cos \beta x + B sin \beta x)
```

```math
y = A cos \beta x + B sin \beta x
```

yの表記をもとのX(x)に戻して

```math
X(x) = A cos \beta x + B sin \beta x
```

として、水色の式の1つ目が得られた。

黄色の式の2つ目は同様に\betaの部分をβv としてくくると

```math
\frac{d^2 T(t)}{dt^2} = -({\beta} v)^2 T(t)
```

という式なので同じ式変形をしていき、

```math
T(t) = C cos \beta v x + D sin \beta v x
```
技術英語 > Our scans of the moon are [inconclusive]. / Don't jump to conclusions.

@ Star Trek Voyager > INNOCENCE

ある衛星において行方不明になったシャトルを探すクルー。周回軌道からのスキャンについてトレスが

> Our scans of the moon are inconclusive.

http://eow.alc.co.jp/search?q=inconclusive
> 結論の出ない

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

> Don't jump to conclusions.

http://eow.alc.co.jp/search?q=jump+to+conclusions
> jump to conclusions
> 〔慎重に考えずに〕結論に飛び付く、結論を急ぐ、慌てて結論を出す、速断する、早とちりする、早合点する、勘違いする
pythonで仮想関数を作る

# pythonで仮想関数を作る

手順の概要
1 クラスを作る
2 abcを使う
3 abstract methodのマークをつける


## クラスを作る
まずは、いわゆる継承関係のクラスを作成します。
MyClassAbstractを継承した、MyClassを作成

 ![継承.png](https://qiita-image-store.s3.amazonaws.com/0/98558/ee423bf5-437e-2dc8-4172-2dac6256b1a9.png)


sample_methodを持つクラス

```py:abstract.py
#coding: UTF-8

class MyClassAbstract(object):
    '''
    classdocs
    '''
    def __init__(self):
        '''
        Constructor
        '''
        pass
    def sample_method(self):
        pass
```

MyClassAbstractを継承するクラスを作成
この時点では仮想関数を作っていないので、
sample_methodを実装していなくてもエラーは出ません。

```py:hontai.py
from abstract import MyClassAbstract

class MyClass(MyClassAbstract):
    def hontai_method(self):
        print("Hontai")
    pass


```

main関数からMyClassのsample_method()を呼び出してみる。

```py:main.py
from hontai import MyClass
   
if __name__ == '__main__':
    MyClass().sample_method()
```


```py:実行結果
abstract
```


## MyClassAbstractのsample_methodを仮想関数にする

MyClassAbstractのsample_methodを仮想関数にする
変更箇所は３箇所
 - abcからABCMetaとabstract methodをインポート
 - __metaclass__ にABCMetaを設定
 - 抽象化したいクラスの直前に[@abstractmethod]を付与

```py:abstract.py
#coding: UTF-8
from abc import ABCMeta, abstractmethod # 変更

class MyClassAbstract(object):
    '''
    classdocs
    '''
    __metaclass__ = ABCMeta # 変更

    def __init__(self):
        '''
        Constructor
        '''
        pass
    
    # 抽象メソッド
    @abstractmethod # 変更
    def sample_method(self):
        print("abstract")
```

このままmain関数を再実行してみる。

```py:実行結果
Traceback (most recent call last):
  File "/Users/shibatanorihiro/Documents/workspace/testprj/src/main.py", line 4, in <module>
    MyClass().sample_method()
TypeError: Can't instantiate abstract class MyClass with abstract methods sample_method
```

継承先が仮想関数を実装しない場合にエラーが出力されるようになりました。


## 動作検証

MyClass側にsample_methodを実装します。

```py:bontai.py
from abstract import MyClassAbstract

class MyClass(MyClassAbstract):
    def hontai_method(self):
        self.sample_method()
        print("Hontai")
    pass

    def sample_method(self):                 #追加
        super(MyClass, self).sample_method() #追加
        print("Hontai sample")               #追加
    pass
```

```py:main.py
from hontai import MyClass
   
if __name__ == '__main__':
    MyClass().hontai_method() #hontai_methodを呼ぶようにする
```

```py:実行結果
abstract
Hontai sample
Hontai
```

想定通り、
main
　-> MyClass.hontai_method
　　-> MyClass.sample_method
　　　-> MyClassAbstract.sample_method


という動きになりました。
「擬人化から始めるPHPerのためのオブジェクト指向超入門」メモ

何気なくYouTubeでカンファレンスの動画を漁ってたら素晴らしいプレゼンを見つけたのでメモ。

元ネタ
PHP Conference 2014「擬人化から始めるPHPerのためのオブジェクト指向超入門」 ([SpeakerDeck](https://speakerdeck.com/sizuhiko/ni-ren-hua-karashi-meruphperfalsetamefalseobuziekutozhi-xiang-chao-ru-men))

## Intro

* オブジェクト指向アプリケーションを構築するということは、**適切なソフトウェア機構を考えだすこと**
    * 私たちは、**実世界に存在しないオブジェクト**を考えだすことで、現実世界の情報、プロセス、相互作用、関係、そしてエラーでさえも表現します。（オブジェクトデザイン p.002より）
    * 生命のないものに対して、**生命と知性を与え**ます。
* 無生物の擬人化は、はっきりと直接的に**無生物に生命を与えている**。
    * 擬人化された世界では、親しみを持たせ、対象に関心を高め、対話形式を用いることで明確性を高め、客観性を出す効果が期待できる。（Wikipedia「擬人化」より）

## オブジェクト指向を擬人化で始める

* 実世界にない存在を考えだす
* 生命と知性を与える
* 対話形式を用いる

## 性格（ロール）を決める

* 情報保持役
    * モデルやエンティティ
    * 情報を知ってる
    * 保持するデータから計算するのもOK
    * MVCのM
* 構造化役
    * ざっくりグループ化する
    * リスト、配列、ハッシュとかキューとか
    * エンティティの関連とかを表現するときも
* サービス提供役
    * 特殊な処理を提供する
    * Worker, Writerみたいに -erになっているクラスを見つけたらその子は大抵これ
* 制御役
    * 他の複数のオブジェクトから状況を聞き出して判断する
    * 判断した結果を指示する
* 調整役
    * あるオブジェクトから情報を受け取って他のオブジェクトに渡す
    * MVCのC
* インタフェース役
    * ユーザーインタフェースとか
    * MVCのV？

## 書き出してみる

* 名前**（超重要）**
    * 適切な名前をつけよう
    * **売れないキャラは大抵名前が微妙**
* 役割
    * ↑6つの中に当てはめる
* 特徴（属性）
    * たくさんはないはず
* できること（責務）
    * 役割に沿っているか確認する

## 例

* `オレ:社長`「自叙伝出せないかなぁ」
    * `Aさん:秘書`→`Bくん:事務`「社長語録まとめて提出して」
    * `Aさん:秘書`→`Cさん:広報`「ライターさんと調整よろしく」
* `オレ:社長`「コピー10部ソートしてホッチキス止めよろしく」
    * `新人君:コピー係`→`こぴお:複写係`「お願いします」
    * `新人君:コピー係`→`ソータ郎:ソート係`「お願いします」
    * `新人君:コピー係`→`止め吉:ホチキス係`「お願いします」

## 性格が決まると

* 責務はおのずと決まってくる
* オブジェクトの相互作用（コラボレーション）が明確になる
* **図に書くのが重要です**
    * [Astah](http://astah.change-vision.com/ja/)をつかおう！！！（~~[Cacoo](https://cacoo.com/lang/ja/home)？知らない子ですね・・・~~

## PHPにするには

* クラス名＝役割
* プロパティ＝特徴
* メソッド＝できること

## Bくん::事務

```php
class 事務 extends Model {
  public $name;
  public function 語録を記録する($contents) {
    return $this->語録->$save(....);
  }
  public function 語録をすべて取得する() {
    return $this->語録->find('all');
  }
}
```

## オブジェクトとインスタンス

* **オブジェクト**はBくん＝**実体**

```php
$b = new 事務;
```

* Bくんは事務の**インスタンス**である＝**実例**

```php
$b instanceof 事務 === true
```

* Bくんは情報保持役の**インスタンス**である＝**実例**

```php
$b instanceof Model === true
```

## まとめ

* オブジェクト指向の設計がわかると実装を理解できるようになる
* まず擬人化して図を書くことから始めると学びやすい
* [オブジェクトデザイン](http://www.amazon.co.jp/dp/4798109037)を入門書として読んでみてほしい
Phalcon Modelによるデータベース操作 - 準備編

Hell@World、いつもいつも自分用にメモを残したくて、ブログとかはじめてみても、途中で「やっぱなんか作りまくった方が早いわ」と、半日坊主だったりして、同じ関数を何度も調べ直すハメになるため、今回こそは準備に時間をかけてみます。

プログラミングとか、２年離れていると、いくら記事で新しい技術の流行を知り、導入、入門あたりまで眺めてみても、自分の頭じゃ手を動かさないとダメなんだと、今まさに自分のために言い聞かせています。

「おい、お前の処理能力はソロバンより弱いんだから手を動かせ、それで大体やってきた」

自己暗示です。

環境は専用のローカルサーバに、Cent7, PHP7, Nginx with php-fpm, Phalcon3, MariaDBという、入門検索ランキング第一位の組み合わせでセットアップ済みです。

それではなにしろデータソースがないとはじまらないので適当なエンティティを用意したいと思います。

「phalcon データベース」というなんともひねりのないキーワードで検索すると、Phalcon公式の「モデルの働き」というものがある。
んじゃこれから行くかと、もうすでに効率が悪そうな手順を踏みます。

PhalconのORMは、Phalcon\Mvc\Modelを継承した対応するテーブル名のクラスを作成し、publicでズラズラ並べるか、getter/setterするかは好きにしろとあります。

順番通り、まずは全部publicのメンバとして定義していきます。
クラス名はキャメルケースと、これも王道のパターン。

まぁエンティティということで適当なファイルシステムもどきのデータということにしてみましょう。

あ。boolいれちゃったんで、これだけゲセッタで。

```php
use Phalcon\Mvc\Model;

class Entity extends Phalcon\Mvc\Model {
    public $uid;
    protected $isDirectory // false: 0, true: 1
    public $name;
    //public $isSymlink;
    //public $target;
    //public $size;
    //public $lastModified;
    //public $permission;
    //public $owner
    //public $group

    public getIsDirectory {
        return $this->isDirectory == 1;
    }
    public setIsDirectory ($val) {
        $this->isDirectory = $val ? 1 : 0;
    }
}
```

書き終わって、「いやこんなにいらねぇだろ」ということで最初の３つだけ使います。

```mysql
create table entity 
(
    uid int not null primary key auto_increment,
    type int(1) not null,
    name varchar(128) not null
);
```

適当にデータを追加します。

```mysql
insert into `entity` values(null, 1, 'js');
insert into `entity` values(null, 1, 'img');
insert into `entity` values(null, 1, 'css');
insert into `entity` values(null, 0, 'index.php');
insert into `entity` values(null, 0, '.htaccess');
```

これで準備は整った、のか？

続きは次回
等価演算子と厳密等価演算子の速度について

厳密比較の方が速度が速い

php -version
PHP 5.5.36 (cli) (built: May 29 2016 01:07:06) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies

httpd -v
Server version: Apache/2.4.18 (Unix)
Server built:   Feb 20 2016 20:03:19


loop: 1000
比較 == 0回目: 0.000236034393311
厳密比較 === 0回目: 0.000198125839233
[比較に対する厳密比較の時間差分:]-3.79085540771E-5
比較 == 1回目: 0.000231027603149
厳密比較 === 1回目: 0.000160932540894
[比較に対する厳密比較の時間差分:]-7.00950622559E-5
比較 == 2回目: 0.00017786026001
厳密比較 === 2回目: 0.000149965286255
[比較に対する厳密比較の時間差分:]-2.78949737549E-5
比較 == 3回目: 0.000178098678589
厳密比較 === 3回目: 0.000149965286255
[比較に対する厳密比較の時間差分:]-2.8133392334E-5
比較 == 4回目: 0.000176906585693
厳密比較 === 4回目: 0.000150918960571
[比較に対する厳密比較の時間差分:]-2.59876251221E-5
end!


loop: 10000
比較 == 0回目: 0.00176596641541
厳密比較 === 0回目: 0.00169086456299
[比較に対する厳密比較の時間差分:]-7.5101852417E-5
比較 == 1回目: 0.00185012817383
厳密比較 === 1回目: 0.00160598754883
[比較に対する厳密比較の時間差分:]-0.000244140625
比較 == 2回目: 0.00176596641541
厳密比較 === 2回目: 0.00148606300354
[比較に対する厳密比較の時間差分:]-0.000279903411865
比較 == 3回目: 0.00191211700439
厳密比較 === 3回目: 0.00256705284119
[比較に対する厳密比較の時間差分:]0.000654935836792
比較 == 4回目: 0.00353193283081
厳密比較 === 4回目: 0.00294399261475
[比較に対する厳密比較の時間差分:]-0.000587940216064
end!

loop: 100000
比較 == 0回目: 0.0200650691986
厳密比較 === 0回目: 0.016273021698
[比較に対する厳密比較の時間差分:]-0.00379204750061
比較 == 1回目: 0.0192341804504
厳密比較 === 1回目: 0.0230228900909
[比較に対する厳密比較の時間差分:]0.0037887096405
比較 == 2回目: 0.0226550102234
厳密比較 === 2回目: 0.0173649787903
[比較に対する厳密比較の時間差分:]-0.00529003143311
比較 == 3回目: 0.0210900306702
厳密比較 === 3回目: 0.0189769268036
[比較に対する厳密比較の時間差分:]-0.00211310386658
比較 == 4回目: 0.0189080238342
厳密比較 === 4回目: 0.0180478096008
[比較に対する厳密比較の時間差分:]-0.000860214233398
end!

loop: 1000000
比較 == 0回目: 0.219089984894
厳密比較 === 0回目: 0.188188791275
[比較に対する厳密比較の時間差分:]-0.0309011936188
比較 == 1回目: 0.212105989456
厳密比較 === 1回目: 0.194359779358
[比較に対する厳密比較の時間差分:]-0.0177462100983
比較 == 2回目: 0.201738119125
厳密比較 === 2回目: 0.180896043777
[比較に対する厳密比較の時間差分:]-0.0208420753479
比較 == 3回目: 0.200308084488
厳密比較 === 3回目: 0.156686067581
[比較に対する厳密比較の時間差分:]-0.0436220169067
比較 == 4回目: 0.195621967316
厳密比較 === 4回目: 0.158803939819
[比較に対する厳密比較の時間差分:]-0.0368180274963
end!

loop: 10000000
比較 == 0回目: 1.91947317123
厳密比較 === 0回目: 1.92924904823
[比較に対する厳密比較の時間差分:]0.0097758769989
比較 == 1回目: 1.97134900093
厳密比較 === 1回目: 1.71951580048
[比較に対する厳密比較の時間差分:]-0.251833200455
比較 == 2回目: 2.31585979462
厳密比較 === 2回目: 1.91265797615
[比較に対する厳密比較の時間差分:]-0.403201818466
比較 == 3回目: 2.16872596741
厳密比較 === 3回目: 1.91157197952
[比較に対する厳密比較の時間差分:]-0.257153987885
比較 == 4回目: 1.97310209274
厳密比較 === 4回目: 1.70109915733
[比較に対する厳密比較の時間差分:]-0.27200293541
end!


参考
http://ezolab-blog.net/blog-entry-5.html
JDBCドライバでMySQLに接続

新人SEだった頃に勉強した、JavaからDB接続するための基本的なコード。
実際の業務で生jdbcを使う機会はたぶん無いでしょうが、一応忘れないようメモしておきます。

```ruby:UseJdbc.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
* localhost上のデータベースと接続し、取得したデータをコンソール出力する。
*/
public class UseJdbc {

	public static void main( String args[] ) throws Exception {

	    /*接続先サーバー名を"localhost"で与えることを示している*/
	    String servername     = "localhost";
	    
	    /*接続するデータベース名をsenngokuとしている*/
	    String databasename   = "senngoku";

	    /*データベースの接続に用いるユーザ名をrootユーザとしている*/
	    String user = "root";

	    /*データベースの接続に用いるユーザのパスワードを指定している*/
	    String password = "password";

	    /*取り扱う文字コードをUTF-8文字としている*/
	    String serverencoding = "UTF-8";
	  
	    /*データベースをあらわすURLを設定している*/
	    String url =  "jdbc:mysql://localhost/" + databasename;
	    
	    /*MySQLの場合、URLの形式は次のようになります。
	      jdbc:mysql://(サーバ名)/(データベース名)*/

	    /*↑データベースをあらわすURL（データベースURL)は、データベースに接続する場合に
	    必要となる情報をセットした文字列である。
	    この文字列の構造は、"jdbc"、サブプロトコル、サブネームの３つの部分から構成される。*/

	    /*接続を表すConnectionオブジェクトを初期化*/
	    Connection con = null;

		try{

			/*クラスローダによりJDBCドライバを読み込んでいることを示している。
			引数は、データベースにアクセスするためのJDBCドライバのクラス名である。*/
			Class.forName( "com.mysql.jdbc.Driver" ).newInstance();

			/*DriverManagerクラスのgetConnectionメソッドを使ってデータベースに接続する。*/
			con = DriverManager.getConnection( url, user, password );

			System.out.println( "Connected...." );

			/*データベースの接続後に、sql文をデータベースに直接渡すのではなく、
			sqlコンテナの役割を果たすオブジェクトに渡すためのStatementオブジェクトを作成する。*/
			Statement st = con.createStatement();

			/*SQL文を作成する*/
			String sqlStr = "SELECT * FROM busyou";

			/*SQL文を実行した結果セットをResultSetオブジェクトに格納している*/
			ResultSet result = st.executeQuery( sqlStr );

			/*クエリ結果を1レコードずつ出力していく*/
			while( result.next() )
			{
				/*getString()メソッドは、引数に指定されたフィールド名(列)の値をStringとして取得する*/
				String str1 = result.getString( "code" );
				String str2 = result.getString( "name" );
				String str3 = result.getString( "syozoku" );
				String str4 = result.getString( "born_era" );
				System.out.println( str1 + ", " + str2 + ", " + str3 + "," + str4);
			}
			
			/*ResultSetオブジェクトを閉じる*/
			result.close();
			
			/*Statementオブジェクトを閉じる*/
			st.close();
			
			/*Connectionオブジェクトを閉じる*/
			con.close();
	    }
		catch( SQLException e ){
		
			/*エラーメッセージ出力*/
			System.out.println( "Connection Failed. : " + e.toString() );
			
			/*例外を投げちゃうぞ*/
			throw new Exception();
			
		}catch (ClassNotFoundException e){
			
			/*エラーメッセージ出力*/
			System.out.println("ドライバを読み込めませんでした " + e);
		}
		finally{
			try{
				if( con != null ){ 
					con.close();
				}
      		}
			catch(Exception e){
			
				/*エラーメッセージ出力*/
				System.out.println( "Exception2! :" + e.toString() );
				
				/*例外を投げちゃうぞ*/
				throw new Exception();
			}
		}
	}
}
```
[Swift] UIViewのxibからインスタンス生成

# Extension

```
extension UIView {
    static func instantiate() -> Self {
        let nibName = NSStringFromClass(self).componentsSeparatedByString(".")[1]
        let nib = UINib(nibName: nibName, bundle: nil)
        return nib.instantiateWithOwner(nil, options: nil)[0] as! Self
    }
}
```

# 使い方

```
let customView = CustomView.instantiate()
```
サーバー監視ツール Sensu

## Sensu
https://sensuapp.org/

## 構成
* CentOS 7.3.1611 (minimal)
* Redis 3.2.3 (epel)
* RabbitMQ server 3.3.5 (epel)
* Sensu 0.26.5
* Uchiwa 0.22.0

## インストール

### Redis
```bash
yum -y install epel-release && yum -y install redis && systemctl start $_ && systemctl enable $_
```

### RabbitMQ
```bash
yum -y install rabbitmq-server && systemctl start $_ && systemctl enable $_
rabbitmqctl add_vhost /sensu
rabbitmqctl add_user sensu sensu
rabbitmqctl set_permissions -p /sensu sensu ".*" ".*" ".*"
```
#### 管理画面
```bash
rabbitmq-plugins enable rabbitmq_management
systemctl restart rabbitmq-server
```
http://192.168.56.101:15672/

### Sensu / Uchiwa
```bash
cat << "_EOF_" > /etc/yum.repos.d/sensu.repo
[sensu]
name=sensu
baseurl=http://sensu.global.ssl.fastly.net/yum/$basearch/
gpgcheck=0
enabled=1
_EOF_
yum -y install sensu uchiwa
```

## プラグイン
```bash
yum install gcc-c++
sensu-install -P disk-checks,cpu-checks,io-checks,hardware,postfix
sensu-install -P snmp,http,mysql,redis,rabbitmq
```
sensu-plugins-http で gcc-c++ パッケージが必要。

## 設定
```bash
cp /etc/sensu/config.json{.example,}
sed -i '/"host"/ s/localhost/127.0.0.1/' /etc/sensu/config.json
sed -i.org 's/Site 1/Sensu Server/;s/api1.example.com/127.0.0.1/' /etc/sensu/uchiwa.json
sed -i '8,17d' /etc/sensu/uchiwa.json
```
`localhost` の指定だとうまく動作しない。

## 起動と自動起動設定
```bash
systemctl start sensu-{client,server,api} uchiwa && systemctl enable $_
```
http://192.168.56.101:3000/

![uchiwa.png](https://qiita-image-store.s3.amazonaws.com/0/15175/06076856-6933-ecbb-0753-635fdbfadf6c.png)


# モニタリング関連記事
* [サーバー監視ツール Munin](http://qiita.com/bezeklik/items/c4863c4114e0c339412b)
* [サーバー監視ツール Xymon](http://qiita.com/bezeklik/items/0f1234d8c9a2b54ec986)
* [サーバー監視ツール Zabbix](http://qiita.com/bezeklik/items/1f638727d6485ce9b931)
* [サーバー監視ツール Hinemos](http://qiita.com/bezeklik/items/f24077009f730eadbab1)
* [サーバー監視ツール Sensu](http://qiita.com/bezeklik/items/d026e9db4d5305165273)
* [サーバー監視ツール netdata](http://qiita.com/bezeklik/items/effb70453a58415ad5dc)
PHPで文字列を表示させる方法「ヒアドキュメント」

ヒアドキュメント
<?php
echo <<< EOD
文字列
EOD;

EOD、EOT、EOF

なんでもいい

EOD(エンドオブドキュメント)ドキュメント
→End Of Document

EOF(エンドオブファイル)ファイル
→End Of File

EOS(エンドオブセンテンス)文章
→End Of Sentence

EOT(エンドオブテキスト)テキスト
→End Of Text

EOL(エンドオブライン)行
→End Of Line
さくらVPS（Ubuntu16.04）でFTPを使えるようにする

# 背景

さくらVPS契約後、CentOSがデフォルトで入っていますが、自身の作業では、Ubuntuの方が良いためUbuntuに入れ替えました。

CentOSでFTPを設定する以下の投稿はありましたが、
http://qiita.com/satomyumi/items/11382273624621f3caee
Ubuntuは見つからなかったので備忘録としてまとめます。

# 環境
OS： Ubuntu16.04 (さくらVPS）

# 実行手順

###<b>①vftpdをインストール</b>
以下のコマンドを実行する

```
sudo apt-get install vsftpd -y
```

###<b>②configファイルを編集する</b>

```
vim /etc/vsftpd.conf
```

↓

```
▼25行目：匿名ユーザのアクセスを拒否する
anonymous_enable=NO

▼31行目:ファイルシステムを変更するFTPコマンドを許可する
write_enable=YES

▼99行目：アスキーモードのアップロードを許可する
ascii_upload_enable=YES

▼100行目:アスキーモードのダウンロードを許可する
ascii_download_enable=YES

▼120行目:設定したディレクトリより上層への移動を禁止する
chroot_local_user=YES

▼121行目:YESの場合、リストアップされたユーザはchrootの対象から除外される
chroot_list_enable=YES

▼125行目:リストアップのファイルの場所を指定する
chroot_list_file=/etc/vsftpd.chroot_list

▼131行目：サブフォルダを含む一括アップロード・ダウンロードを出来るようにする
ls_recurse_enable=YES

▼最終行：ルートディレクトリを指定する
local_root = <path_to_root>

※指定しない場合はユーザーのホームディレクトリ直下にななります。
※public_htmlを指定した場合で、且つ当該ディレクトリがないとログインできないので注意

▼seccomp filter をオフを追記する
seccomp_sandbox=NO
```

###<b>③アクセス許可をするユーザを設定する</b>

```
vim /etc/vsftpd.chroot_list
```

上記のコマンドで、vsftpd.chroot_listを新規作成し、
１行目にアクセスするユーザの名前を入力する。

###<b>④vsftpdを再起動する</b>

```
sudo service vsftpd restart
```

###<b>⑤動作確認</b>

「telnet localhost 21」とコマンドを入力し、以下のような表示になれば正常に動作しています。

```
Trying ::1...
 >Trying 127.0.0.1
 >Connected to localhost
 >Escape character is '^]'.
 >220 (vsFTPd 3.0.2)
```

その後、外部のFTPクライアントを使用して、
アクセスを試みてください。

※より具体的な内容を知りたい場合は、以下の参考URLをご参照ください。
http://www.server-world.info/query?os=Ubuntu_14.04&p=ftp
http://www.ehowstuff.com/how-to-install-and-configure-vsftpd-ftp-server-on-ubuntu-14-04/
[Swift]Sapporoの使い方


## Sapporoとは

[Sapporo](https://github.com/nghialv/Sapporo)とは，iOSのUICollectionViewをCellmodel-drivenで扱うためのマネージャー

## 環境

- OSX El Captan
- Xcode 7.3
- iOS 8.0
- Swift 2.2
- Sapporo 1.1


## ViewControllerの実装


```swift:ViewController.swift
import UIKit
import Sapporo

class ViewController: UIViewController {
    
    @IBOutlet var collectionView: UICollectionView!
    lazy var sapporo: Sapporo = { [unowned self] in
        return Sapporo(collectionView: self.collectionView)
        }()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // 以下のように，repeatedValue にクラスを渡すと実体は1つのため状態が共有されてしまうので，実際に使うときは注意
        let cellmodels: [MyCellModel] = Array(count: 4,  repeatedValue: MyCellModel())
        
        let section = SASection()
        section.inset = UIEdgeInsets(top: 30, left: 10, bottom: 10, right: 10)
        section.minimumLineSpacing = 10
        
        sapporo
            .registerCellByNib(MyCell)
            .setLayout(SAFlowLayout())
        
        sapporo
            .reset(section)
            .bump()
        
        section
            .reset(cellmodels)
            .bump()
    }

}
```

## CellとCellModelの実装

``` swift:MyCell.swift
import UIKit
import Sapporo

class MyCellModel: SACellModel {

    init(){
        let size = CGSize(width: 100, height: 100)
        super.init(cellType: MyCell.self, size: size, selectionHandler: nil)
    }
}

class MyCell: SACell, SACellType {
    typealias CellModel = MyCellModel
    
    override func configure() {
        super.configure()
        
    }
}
```


## セルの操作

- 追加

	```
	section
		.append(cellmodel)
		.bump()

	sapporo[1]
		.append(cellmodel)
		.bump()
	```

- 挿入

	```	
	section
		.insert(cellmodel)
		.bump()
		
	section
        .insertBeforeLast(cellmodels)
        .bump()
	```
	
- リセット
	
	```
    section
        .reset(cellmodels)              
        .bump()

    section
        .reset()                            
        .bump()
    ```


- 移動

	```
	section
        .move(fromIndex: 5, toIndex: 1)
        .bump()
	```
	
	
- 削除
	
	```
	section
        .remove(1)
        .bump()

    section
        .remove(cellmodel)
        .bump()

    section
        .remove(2...5)
        .bump()

    section
        .removeLast()
        .bump()
	```
	
- 更新

	```
	let cellmodel = section[1]
    cellmodel.property = newData
    cellmodel.bump()
	```
	

## セクションの操作

- 挿入

	```
	sapporo
		.insert(section, atIndex: 1)
   		.bump()
	```
	
- 移動

	```
	sapporo
		.move(fromIndex: 1, toIndex: 5)
   		.bump()
	```
【Oracle 12Cのお勉強】データベース内アーカイブ


## 内容

行の表示・非表示を制御できる機能。
"CREATE TABLE"時に"ROW ARCHIVAL"句をつけることで、ORA_ARCHIVE_STATE列が追加され、表示・非表示を制御できるようになる。

## 検証


▼テスト用の表を作成 (row archivalを指定)

```sql:
SQL> create table ttt (
  2    n number(10),
  3    v varchar2(10)
  4  ) row archival;

表が作成されました。
```

▼テストデータの挿入

```sql:
SQL> insert into ttt values (1,'abc');
1行が作成されました。
SQL> insert into ttt values (2,'def');
1行が作成されました。
SQL> insert into ttt values (3,'ghi');
1行が作成されました。
SQL> commit;

コミットが完了しました。
```

▼ORA_ARCHIVE_STATE列が通常は表示されないことを確認

```sql:
SQL> desc ttt
 名前         NULL?    型
 ----------- -------- ----------------------------
 N                    NUMBER(10)
 V                    VARCHAR2(10)

SQL> select * from ttt;
 N V
-- ---
 1 abc
 2 def
 3 ghi

```

▼以下のSQLでORA_ARCHIVE_STATE列が表示されることを確認

```sql:
SQL> select ttt.*, ora_archive_state from ttt;

N V   ORA_ARCHIVE_STATE
-- --- -----------------
 1 abc 0
 2 def 0
 3 ghi 0
```

▼ORA_ARCHICE_STATEの型を確認

```sql
SQL> select column_name,data_type,data_length 
  2  from user_tab_cols where column_name='ORA_ARCHIVE_STATE';
 
COLUMN_NAME       DATA_TYPE  DATA_LENGTH
----------------- --------- ------------
ORA_ARCHIVE_STATE VARCHAR2          4000

```

▼ORA_ARCHIVE_STATE列が0の場合は表示、それ以外の値が格納されている場合は非表示になる

```sql:
SQL> update ttt set ora_archive_state=1 where n=2;

1行が更新されました。

SQL> commit;

コミットが完了しました。

SQL> select * from ttt;
 N V
-- ---
 1 abc
 3 ghi
```

▼セッションパラメータを変更することにより、非表示列を表示させることができる

```sql:
SQL> ALTER SESSION SET ROW ARCHIVAL VISIBILITY=ALL;

セッションが変更されました。

SQL> select * from ttt;

 N V
-- ---
 1 abc
 2 def
 3 ghi

SQL> ALTER SESSION SET ROW ARCHIVAL VISIBILITY=ACTIVE;

セッションが変更されました。

SQL> select * from ttt;

 N V
-- ---
 1 abc
 3 ghi
```

▼ORA_ARCHIVE_STATE列には、文字も格納することが可能。（非表示になる）

```sql:
SQL> update ttt set ora_archive_state=to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') where n=3;

1行が更新されました。

SQL> commit;

コミットが完了しました。

SQL> select * from ttt;

 N V
-- ---
 1 abc
```

▼ORA_ARCHIVE_STATE列の内容を確認

```sql:
SQL> alter session set row archival visibility=all;

セッションが変更されました。

SQL> select ttt.*,ora_archive_state from ttt;

 N V   ORA_ARCHIVE_STATE
-- --- -------------------
 1 abc 0
 2 def 1
 3 ghi 2016-08-29 23:42:59
```

▼ROW ARCHIVALを無効にする

```sql:
SQL> alter table ttt no row archival;

表が変更されました。

SQL> select * from ttt;

 N V
-- ---
 1 abc
 2 def
 3 ghi

SQL> select ttt.*,ora_archive_state from ttt;
select ttt.*,ora_archive_state from ttt
             *
行1でエラーが発生しました。:
ORA-00904: "ORA_ARCHIVE_STATE": 無効な識別子です。
```
【Oracle 12Cのお勉強】管理権限SYS×××


## 内容

12cで管理権限にSYSBACKUP、SYSDG、SYSKMが追加された。
既存のものを含めてまとめる。
SYSBACKUPは便利そうだ。

## 管理権限確認

▼ルートコンテナ

```sql:
SQL> conn / as sysdba
接続されました。

SQL>  select * from v$pwfile_users;
USERNAME  SYSDBA SYSOPER SYSASM SYSBACKUP SYSDG SYSKM  CON_ID
--------- ------ ------- ------ --------- ----- ----- -------
SYS       TRUE   TRUE    FALSE  FALSE     FALSE FALSE       0
SYSDG     FALSE  FALSE   FALSE  FALSE     TRUE  FALSE       1
SYSBACKUP FALSE  FALSE   FALSE  TRUE      FALSE FALSE       1
SYSKM     FALSE  FALSE   FALSE  FALSE     FALSE TRUE        1
```

▼PDB

```sql:
$ sqlplus sys/<password>@PDB1 as sysdba

SQL> select * from v$pwfile_users;
USERNAME                       SYSDB SYSOP SYSAS SYSBA SYSDG SYSKM     CON_ID
------------------------------ ----- ----- ----- ----- ----- ----- ----------
SYS                            TRUE  TRUE  FALSE FALSE FALSE FALSE          0

```

## 各権限について

### SYSDBA

データベース全体を管理する権限。

```sql:
SQL> conn / as sysdba
接続されました。

SQL> show user
ユーザーは"SYS"です。

SQL> SELECT * FROM SESSION_PRIVS ORDER BY 1;

PRIVILEGE
----------------------------------------
ADMINISTER ANY SQL TUNING SET
ADMINISTER DATABASE TRIGGER
ADMINISTER KEY MANAGEMENT

・・・（省略）・・・

UPDATE ANY CUBE DIMENSION
UPDATE ANY TABLE
USE ANY SQL TRANSLATION PROFILE

234行が選択されました。
```

### SYSOPER

データベースの起動・停止を行う権限

```sql:
SQL> conn / as sysoper
接続されました。

SQL> show user
ユーザーは"PUBLIC"です。

SQL> SELECT * FROM SESSION_PRIVS ORDER BY 1;

PRIVILEGE
----------------------------------------
CREATE SESSION
RESTRICTED SESSION
SYSOPER
```


### SYSASM

ASM全体を管理する権限。

### SYSBACKUP

RMANやSQLを使用したバックアップ・リカバリ操作を実行することができる権限。

```sql:
SQL> CONN / as sysbackup;
接続されました。

SQL> show user
ユーザーは"SYSBACKUP"です。

SQL> SELECT * FROM SESSION_PRIVS ORDER BY 1;

PRIVILEGE
----------------------------------------
ALTER DATABASE
ALTER SESSION
ALTER SYSTEM
ALTER TABLESPACE
AUDIT ANY
CREATE ANY CLUSTER
CREATE ANY DIRECTORY
CREATE ANY TABLE
DROP TABLESPACE
RESUMABLE
SELECT ANY DICTIONARY
SELECT ANY TRANSACTION
SYSBACKUP
UNLIMITED TABLESPACE
```

### SYSDG

データガードの操作を実行することができる権限。

```sql:
SQL> CONN / AS SYSDG
接続されました。

SQL> show user
ユーザーは"SYSDG"です。

SQL> SELECT * FROM SESSION_PRIVS ORDER BY 1;

PRIVILEGE
----------------------------------------
ALTER DATABASE
ALTER SESSION
ALTER SYSTEM
SELECT ANY DICTIONARY
SYSDG
```

### SYSKM

暗号鍵を管理するユーザ

```sql:
SQL> conn / as syskm
接続されました。

SQL> show user
ユーザーは"SYSKM"です。

SQL> SELECT * FROM SESSION_PRIVS ORDER BY 1;

PRIVILEGE
----------------------------------------
ADMINISTER KEY MANAGEMENT
SYSKM
```
Spring Boot 1.4 で Spock を使う方法

従来の Spock バージョンでは動作しなくなっているため注意が必要。なお、DI コンテナの起動を伴わないシンプルなテストであれば、従来通りのモジュールバージョンで問題なく動作します。

# 環境

* Java 1.8.0_91
* Maven 3.3.9 (Maven wrapper)
* Groovy 2.4.7
* Spock __1.1-groovy-2.4-rc-1__

```:terminal
$ ./mvnw -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T01:41:47+09:00)
Maven home: /Users/yo1000/.m2/wrapper/dists/apache-maven-3.3.9-bin/2609u9g41na2l7ogackmif6fj2/apache-maven-3.3.9
Java version: 1.8.0_91, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.11.6", arch: "x86_64", family: "mac"
```

# 設定

注意すべきはバージョンのみなので、依存部分を抜粋。
`spock-core` と `spock-spring` に、`1.1-groovy-2.4-rc-1` を指定しているところがポイント。
従来バージョンである `1.0-groovy-2.4` を指定した場合には、テストを起動しても DI コンテナが起動しません。

```:pom.xml
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.codehaus.groovy</groupId>
  <artifactId>groovy-all</artifactId>
  <version>2.4.7</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.spockframework</groupId>
  <artifactId>spock-core</artifactId>
  <version>1.1-groovy-2.4-rc-1</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.spockframework</groupId>
  <artifactId>spock-spring</artifactId>
  <version>1.1-groovy-2.4-rc-1</version>
  <scope>test</scope>
</dependency>

```

1.1 の正式リリースが待ち遠しい。