OmniAICreator/Qiita-1.07M huggingface dataset:
muninでningxのステータスを監視

# nginxでステータスを見れるようにしておく
default.conf辺りにserverディレクティブを併記。

```conf:/etc/nginx/conf.d/default.conf
server {
    listen 80;
    server_name localhost;
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}
```

nginxの再起動。

```bash
$ sudo service nginx restate
```

# localhostが宣言されていた場合

以下のようなエラーが出た場合。

```
nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored
nginx を停止中:                                            [  OK  ]
nginx を起動中: nginx: [warn] conflicting server name "localhost" on 0.0.0.0:
```

/nginx_statusだけ記載。

```conf:/etc/nginx/conf.d/default.conf
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
```

# 動作試験

動いているか試験。

```bash
$ curl http://localhost/nginx_status
Active connections: 707
server accepts handled requests
 4155 4155 8582
Reading: 0 Writing: 7 Waiting: 700
```

プラグイン有効化。

```bash
$ cd /etc/munin/plugins
$ sudo ln -s /usr/share/munin/plugins/nginx_request ./
$ sudo ln -s /usr/share/munin/plugins/nginx_status ./
```

munis-nodeの再起動。

```bash
$ sudo service munis-node restart
```

監視元ホストから確認。

```bash
$ telnet muninnode.example.com 4949
Trying xxx.xxx.xxx.xxx...
Connected to muninnode.example.com.
Escape character is '^]'.
# munin node at localhost.localdomain
fetch nginx_request
request.value 20956
fetch nginx_status
total.value 649
reading.value 0
writing.value 8
```

完了！
CakePHP3でRedis使ってみた


# 手順
## インストール(CentOS6.6)
```command
yum -y install redis
yum -y install  --enablerepo=remi --enablerepo=remi-php70 php-redis
```

##php.ini修正
```ini:php.ini
extension=redis.so
```
## apache再起動とredis-server起動
```command
sudo service httpd restart
redis-server
```

## CakePHP3のCacheをRedisに修正
```php:config/app.php
         'default' => [
             'className' => 'Redis',
             'prefix' => 'shinderuman_', // defaultは'cake_'
         ],
```

## 実装
### 単純なKeyValue
```php:HogeController.php
         $key = 'bar';
         $foo = 'abc';
         Cache::write($key, $foo);
         $cache = Cache::read($key);
         var_dump($cache); // 'abc'
```
### SimpleXMLElement保存できないかしら
```php:HogeController.php
         $key = 'foo';
         $xml = '<?xml version="1.0" encoding="utf-8"?><project name="hogehoge" default="hogehoge"></project>';
         $foo = new \SimpleXMLElement($xml);
         Cache::write($key, $foo); // やっぱりserializeしようとして怒られるorz(Serialization of 'SimpleXMLElement' is not allowed)
```

## cliからも取得してみる
```command
~% redis-cli
redis 127.0.0.1:6379> get shinderuman_bar
"s:3:\"abc\";"
redis 127.0.0.1:6379> get shinderuman_foo
(nil) // 当然いない
```

# 参考資料
- Caching — CakePHP Cookbook 3.x documentation http://book.cakephp.org/3.0/en/core-libraries/caching.html
- ElastiCacheでRedisをサポートしたのでCakePHPから使ってみた - Qiita http://qiita.com/uda0922/items/a8a9760a4476adb3d88a
Dockerコマンド

``` $docker run -it ubuntu bash ```
ubuntuのイメージからコンテナを作成。
-t ttyを確保する
-i 標準出力を表示

``` Ctrl + D ```
停止

``` $docker ps -a ```
存在するコンテナを一覧表示

プロセス一覧でコンテナのNAMEを確認

``` $docker start NAME ```
起動

``` $docker attach NAME ```
起動したコンテナのシェルなどに入れる。

``` $docker stop NAME ```
コンテナを停止

``` $docker rm NAME ```
コンテナを削除
C++ VST Pluginを作成する(環境構築)

# VST Pluginを作成する

## 環境設定
### VST SDKをダウンロード
VST 3.6.5 Audio Plug-Ins SDKをダウンロード
[http://www.steinberg.net/en/company/developers.html](http://www.steinberg.net/en/company/developers.html)

以下、Cドライブ直下に解凍したフォルダを置いたことして説明する。

### プロジェクトを作成
[ファイル]->[追加]->[新しいプロジェクト]
[Visual C++]->[Win32 プロジェクト]
![160324_VST_000.png](https://qiita-image-store.s3.amazonaws.com/0/111261/0aad64b0-219e-cb05-a730-56db3eab62c8.png)

[次へ]
![160324_VST_001.png](https://qiita-image-store.s3.amazonaws.com/0/111261/659032ad-9550-bb3f-1762-09c741c42ab6.png)

【アプリケーション設定】
＞アプリケーションの種類
[DLL]にチェック

＞追加のオプション
[空のプロジェクト]にのみチェック
![160324_VST_002.png](https://qiita-image-store.s3.amazonaws.com/0/111261/81780450-143d-4b2e-6507-9ddc301aecea.png)


### プロジェクトの設定(1)
[構成マネージャー]->[Releaseに設定]
![160324_VST_003.png](https://qiita-image-store.s3.amazonaws.com/0/111261/1a1296e3-834a-69c6-16a1-6c8576754f80.png)


[構成プロパティ]->[VC++ ディレクトリ]->[インクルートディレクトリ]
C:\VST3 SDK
C:\VST3 SDK\vstgui.sf\vstgui
C:\VST3 SDK\pluginterfaces\vst2.x
C:\VST3 SDK\public.sdk\source\vst2.x

![160324_VST_004.png](https://qiita-image-store.s3.amazonaws.com/0/111261/3dda254f-19ee-bb22-e4b7-3634cc727a2a.png)


[構成プロパティ]->[リンカー]->[入力]->[モジュール定義ファイル]
../vstplug.def

![160324_VST_005.png](https://qiita-image-store.s3.amazonaws.com/0/111261/aba3f7ac-61d2-92ef-8120-a81e14de83d8.png)

### vstplug.defの作成
Visual C++のプロジェクトファイル(.slnファイル)のあるフォルダを開き、vstplug.defというからファイルを作成する
ファイルの内容は以下のように設定する
```cpp:vstplug.def
EXPORTS
	VSTPluginMain
	main=VSTPluginMain
```

### VST SDK 2.4のソースファイルの追加
[ソース ファイル]->(右クリック)->[追加]->[既存の項目]
C:\VST3 SDK\public.sdk\source\vst2.x
audioeffect.cpp
audioeffectx.cpp
vstplugmain.cpp

### プロジェクトの設定(2)

[構成プロパティ]->[C/C++]->[コード生成]->[ランタイム ライブラリ]
マルチスレッド(/MT)
![160324_VST_006.png](https://qiita-image-store.s3.amazonaws.com/0/111261/59a98861-4bf0-2d01-2fc8-94c32fb24c76.png)
PayPal SandboxにSSL関連のエラーで接続できなくなった場合の対処法（PHP編）

[こちらの記事](http://qiita.com/benzookapi/items/9aa2c53bfd833495bfd3)で書きましたが、PayPalへの通信がTLS V1.2に強制移行されます。（2016年6月予定）

すでにSandboxは移行されており、通信のテストができますが（テストの詳細は[こちら](https://github.com/paypal/TLS-update)を参照してください）、PHPのcurlを使った通信実装で問題が起きるケースがあるようです。

実際に通信エラーになった時の対応方法を参考までに載せておきます。（もちろん、環境や実装方法により対応は異なるのであくまで一例です）

##Curlの接続オプションに明示的にTLSオプションを指定

`curl_setopt($conn, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
（$connはHTTP接続のコネクションインスタンス）`

PHPのバージョンによってCURL_SSLVERSION_TLSv1が定義されていない場合は

`curl_setopt($ch, CURLOPT_SSLVERSION, 1);`

とする。

これだけで解消する場合あり。

##（上記で解消しない場合は）サーバーの関連するライブラリのバージョンを上げる
上記で解決しない場合、あるCentos 6サーバーでは以下のライブラリを古いものから以下のバージョンに引き上げたところ解消しました。

`openssl 1.0.1e-42.el6_7.4
curl 7.19.7-46.el6
nss 3.18.0-5.3.el6_6（curlと依存関係になるので必然的に上がります）`

詳しいライブラリやバージョンの情報、脆弱性そのものを説明は、HeartBleedの説明やその対応のページを参照することをお勧めいたしますが、opensslの場合は、以下のように、バージョンを上げずに、tls1オプションで回避できることもあるようです。
https://teratail.com/questions/9776

PHP編と銘打ったので、本当は他の言語版も載せたいのですが、なかなか事例収集が難しいので、もしご協力いただける方がいたら幸いです。

なお、上記の対応は、**PayPalユーザーでなくても今後必要となってくる対応**ですので、**早めのセキュリティ環境の整備**をお勧めします。
ASP.NET MVC 3はNuGetを使用しないと動作しなかった話

#内容
自分が経験したASP.NET MVCアプリケーションの配置トラブルを元に解決方法や、プロジェクトテンプレートのまま開発するよりもNuGetを使う方がいい理由をまとめた。

#トラブル
ASP.NET MVC 3で作成したアプリケーションが客先環境で動作しなかった。
自マシン、自社環境、客先担当者PCでは動作確認は行っていた。

#原因
発行したサイトに必要なDLLが含まれていなかった。（binフォルダにアプリケーションのDLLのみがある状態）
最終的に必要だったDLLは下記の通り。

- Microsoft.Web.Infrastructure.dll
- System.Web.Helpers.dll
- System.Web.Mvc.dll
- System.Web.Razor.dll
- System.Web.WebPages.Deployment.dll
- System.Web.WebPages.dll
- System.Web.WebPages.Razor.dll

#解決するためにやったこと1
- 参照設定のプロパティにあるローカルコピーを全てTrueにし、ビルド時にbinフォルダに出力されるようにした。
- 参照設定に表示されないDLL（Microsoft.Web.Infrastructure.dll、System.Web.WebPages.Razor.dll）は「C:\Program Files (x86)\Microsoft ASP.NET」配下のDLLを追加した。
- この作業をしながらSystem.Web.Mvc（C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies）のバージョンがいつの間にか3.0.0.1に変わっていたことに気がついたのでWeb.config内の表記を更新した。

#解決するためにやったこと1の結果
結果的には動作しなかった。エラーの内容はSystem.Web.Mvcのバージョン3.0.0.0が見つからない、という内容だった。

#解決するためにやったこと1の結果を受けて考えたこと
- 3.0.0.0の表記がないのにも関わらず探しているということは、依存関係が崩れ依存先が探しているのだろうと予想した。
- そんな中このような記事を見つけた。
- [Mvc.dll のバージョン相違](http://surferonwww.info/BlogEngine/post/2015/01/12/change-in-version-of-mvcdll-due-to-windows-update.aspx)

#解決するためにやったこと2
- 上記URLの内容を参考に参照設定をやり直した。

#解決するためにやったこと2の結果
エラーの内容は変わらず、動作しなかった。

#解決するためにやったこと2の結果を受けて考えたこと
- Visual Studio 2010のテンプレートから作成した時点でMVC関係の参照が設定されたが、上記URLにあるパッチでSystem.Web.Mvcのみが更新され、依存関係が壊れているのだろうと予想した。
- 解決策が見つからず途方に暮れた。
- そんな中このような記事を見つけた。
- [Issue with ASP.NET MVC Version 3.0.0.1. Security Update and How to Fix it](http://www.spiria.com/en/blog/web-applications/issue-aspnet-mvc-version-3001-security-update-and-how-fix-it)
- 記事を感じ取ると、MVCはNuGetを使って突っ込みなさいよ、という内容に感じた。

#解決するためにやったこと3
- パッケージマネージャーから下記のコマンドを実行しMVCのパッケージをインストールした。
- `Install-Package Microsoft.AspNet.Mvc -Version 3.0.50813.1`
- [ASP.NET MVC 3 3.0.50813.1](https://www.nuget.org/packages/Microsoft.AspNet.Mvc/3.0.50813.1)

#解決するためにやったこと3の結果
- 全ての必要なDLLがbinフォルダに出力され無事動作した。
- パッケージフォルダに下記のフォルダが作成され、参照がその中のDLLに設定されローカルコピーがTrueに設定された。
 - Microsoft.AspNet.Mvc.3.0.50813.1
 - Microsoft.AspNet.Razor.1.0.20105.408
 - Microsoft.AspNet.WebPages.1.0.20105.408
 - Microsoft.Web.Infrastructure.1.0.0.0
- パッケージ内のSystem.Web.Mvcは3.0.0.1となっており、NuGetが依存関係を解決してくれて他のDLLも正しくインストールされたようだ。

#今回学んだこと
- ASP.NET MVC（に限らないかもしれないが）のアプリケーションはテンプレートから作成したまま使うのでなく、NuGetを使用してパッケージをインストールしなおす方がパッチ等の影響を受けることがないので幸せになれると思った。
- 開発環境の動作確認で満足せず、限りなく本番環境に近い環境で早めに動作確認を行ったほうがよい。
- 上記手順を何度でも思い切りやらせてくれるVCSはやはり素晴らしい。
AD2 > Link > reference manual > 7. USB Controller > The WaveForms software identifies the connected device and downloads an appropriate .bit file at power-up

@ [reference manual](https://reference.digilentinc.com/analog_discovery_2:refmanual#usb_controller) 7. USB Controller

> Programming the FPGA: There is no non-volatile FPGA configuration memory on the Analog Discovery. The WaveForms software identifies the connected device and downloads an appropriate .bit file at power-up,...

FPGAの.bitファイルはWaveFormsというソフトから供給される、ということか。
この仕組みは今後使えそうか。
AD2 > Link > reference manual > 6.6. Temperature Measurement > SMBus > 100kHz

@ [reference manual](https://reference.digilentinc.com/analog_discovery_2:refmanual#temperature_measurement) 6.6. Temperature Measurement


> SMBus/I2C®-compatible serial interface

SMBusというのは初めて見た。

[アプリケーションノート476 > Comparing the I²C Bus to the SMBus](https://www.maximintegrated.com/jp/app-notes/index.mvp/id/476)

こういうのは実際に使うことになってからでないと資料だけを読んでもよくわからなかったりする。
Hugula Framework for SLua

https://github.com/tenvick/hugula


Hugula 游戏框架 for slua

Hugula是一个基于unity3d+lua技术的全LUA免费开源游戏框架，能方便实现代码动态更新。 特点：全lua逻辑，基于状态模式，包含引用计数，对象池，自动资源回收等功能，能极大提高开发速度。 帮助文档。 qq群：19324776。

本框架需要以下条件

1)unity3d 版本为 5.0以上 （5.1以上需要自行清理lua wrap file，后重新make）

2)slua项目 地址 https://github.com/pangweiwei/slua

3)如需使用tools辅助功能 需要配置python2.7 lua5.1环境

框架目录

Assets

-Config （存放xxx.csv 配置文件 使用菜单 Hugula/export config [Assets\Config]导出）

-CustomerResource （存放美术资源）

-Hugula （核心代码）

-Lan （多国语言包 csv 使用菜单 Hugula/export language [Assets\Lan]导出 lua中可直接调用）

-Scene （场景 begin为开始场景）

-Slua （Slua插件）

-Tmp （编译lua文件临时存放目录）

-Lua （lua脚本）

运行发布

1 导出assetbundle资源 菜单 AssetBundles/Build AssetBundles

2 导出其他

2.1 Hugula/export lua [Assets\Lua] 打包编译脚本

2.2 Hugula/export config [Assets\Config] 打包配置

2.3 Hugula/export language [Assets\Lan] 打包语言包

3 导出slua接口

3.1 Slua/All/Make 导出slua所需要的wrap类。

3.2 如果打开有报错 Slua/All/Clear 清理已经生成的wrap类

lua架构图
![alt](https://github.com/tenvick/hugula/raw/master/Client/Assets/Doc/hugula%20lua%20framework.png)


自带demo

俄罗斯方块小游戏 apk下载地址：http://pan.baidu.com/s/1o6L4E86
Xcode7.3のSimulatorで3D tocuhを検証する


# 概要
Xcode7.3のSimulatorが3D tocuhに対応していた。
<img src="https://qiita-image-store.s3.amazonaws.com/0/11454/61f6e52a-1182-3904-2520-c8f6171727a8.png" alt="simulate_3d_touch.png" width="375px" height="667px" />

# 使い方
Force Touchトラックパッドが必要。
Simulatorのメニュー→Hardware→Use Trackpad Force for 3D touch
ショートカットキー(`Command`+`Ctrl`+`3`)でON/OFFを切り替えられる
<img src="https://qiita-image-store.s3.amazonaws.com/0/11454/1dfa7535-3cda-5f4e-cfa7-d9e92a36a9e9.png" alt="simulator_menu.png" width="336px" height="442px" />
# 参照
[Xcode 7.3 Release Notes](https://developer.apple.com/library/mac/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc7_release_notes.html#//apple_ref/doc/uid/TP40001051-CH5-DontLinkElementID_31)
> Simulator.app supports delivering touch pressure to iOS and watchOS by using a Force Touch trackpad.
Legacy support for setting force touch pressure in the watchOS simulator (for example, Shift-Command-2) is deprecated and will be removed in a future release. (24853602)
OpenAMをEC2にインストールする

# 概要
EC2にOpenAMをインストールします。
# ターゲット環境
今回は、以下の構成の環境をターゲットに。
![39B3C51E-4A39-4DEF-A92C-3539045988C6.png](https://qiita-image-store.s3.amazonaws.com/0/118448/c03f0281-e219-eb5b-ba4d-ddf2cd14331c.png)
# 手順
以下にインストールの手順を書きます。
## 不要なサービスの停止
```
$ sudo service iptables stop
$ sudo service ip6tables stop
$ sudo chkconfig iptables off
$ sudo chkconfig ip6tables off
```
## hostsの編集
```
$ sudo cp /etc/hosts{,.orgn}
$ sudo vi /etc/hosts
$ sudo diff /etc/hosts.orgn /etc/hosts
1a2
> 172.31.29.76 sso.XXXXX.com
```
## ネットワークの編集
```
$ sudo cp /etc/sysconfig/network{,.orgn}
$ sudo vi /etc/sysconfig/network
$ sudo diff /etc/sysconfig/network.orgn /etc/sysconfig/network
2c2
< HOSTNAME=localhost.localdomain
---
> HOSTNAME=sso.XXXXX.com
```
## Tomcatのインストール
```
$ sudo yum -y install tomcat7
$ sudo /sbin/chkconfig --level 2345 tomcat7 on
```
## OpenAMの入手
[サイト](https://backstage.forgerock.com/#!/downloads)からwarファイルをダウンロードする。

```
$ sudo mv OpenAM-13.0.0.war /usr/share/tomcat7/webapps/openam.war
$ sudo chown -R tomcat /usr/share/tomcat7/
```
## Tomcatの設定
```
$ sudo cp /etc/tomcat7/tomcat7.conf{,.orgn}
$ sudo vi /etc/tomcat7/tomcat7.conf
$ sudo diff /etc/tomcat7/tomcat7.conf.orgn /etc/tomcat7/tomcat7.conf
21a22
> JAVA_OPTS="-Xmx1024m -XX:MaxPermSize=256m"
```
## Tomcatの起動とログフォルダ権限変更
```
$ sudo /sbin/service tomcat7 start
$ sudo chmod -R 775 /var/log/tomcat7/
```
## OpenAMにアクセス
http://sso.XXXXX.com:8080/openam/
OpenAMの画面が表示されればOK
![OpenAM.png](https://qiita-image-store.s3.amazonaws.com/0/118448/5ab35a2d-ab46-2adc-327d-6ebfdfb31ae4.png)
iOSアプリのステータスバー分表示領域がズレてしまう際の対処法

## 問題
特定の状況でステータスバーの領域が確保されてしまい、コンテンツの表示が y:20px の位置から表示されていた。
こんなところでかなりの時間を費やされたので忘却録として残しておく。

<img alt="iOSアプリのステータスバー分表示領域がズレてしまう現象" src="https://qiita-image-store.s3.amazonaws.com/0/19698/7d4d80c2-28db-479b-d95f-1bc38b442ff2.jpeg">

## 対処法
画像上部の AutoLayout の指定先が Top Layout guide になっていたのが原因のよう。
<img alt="AutoLayout の指定先が Top Layout guide" src="https://qiita-image-store.s3.amazonaws.com/0/19698/34fb0d14-2f25-0d34-2ae1-e6db3ac001f0.png">

これの指定先を Superview にすることで解決した。
Top Layout guide は Xcode がよしなに一番上の要素を決めていて、それが今回は Status Bar の直下を指しているのだと思われる。対して、Superview (=self.view) はスクリーン全体を指しているので、Superview に差し替えることで解決した（ということのはず）。

どうやってするか。self.view にドラッグして制約をつけても、 Top Layout guide についてしまい苦戦。他のアプリと見比べて違いを見てみると、Storyboard 上で Status Bar の表示をオフにしていたのが違いだったのでそこを修正。

<img alt="Storyboard 上で Status Bar の表示をオンにする" src="https://qiita-image-store.s3.amazonaws.com/0/19698/c5588d8b-e8e8-94ed-ee1b-a58cfa446d50.png">
None から Inferred に変更。

<img alt="Top Layout guide につけていた制約のワーニング" src="https://qiita-image-store.s3.amazonaws.com/0/19698/c9f87ddd-959b-a283-33b3-95208fa06e30.png">
すると、 Top Layout guide につけていた制約でワーニングが出るので、この制約を削除。

<img alt="画像上部に AutoLayout の制約をつける" src="https://qiita-image-store.s3.amazonaws.com/0/19698/6c4e3908-c71f-c5e6-3f69-8f5ca2ee4352.png">
再度画像上部の制約をつければ、SuperView に対する制約となり、表示上の問題も解決した。

<img alt="ステータスバー問題解決後の状態" src="https://qiita-image-store.s3.amazonaws.com/0/19698/c9e90508-7f1c-c24e-476b-31788ad32f63.png">
Superview に対する制約になってる。

なにか、抜け漏れ補足誤りありましたらコメントください。
[Cocos2d-x] Xcode7.3にしたらSpriteでpng読み込み時にlibpng error: CgBI: unhandled critical chunk

Xcode7.3にしてから実機でcocos2d-xで開発したものが実機でビルドするとエラーがでるようになってしまった・・

`libpng error: CgBI: unhandled critical chunk`

新規で作ったCocosのプロジェクトも同じエラーで動かないためいろいろ調べていたところどうもXcodeでPngファイルいじっている箇所がBuild Settingsにありました

<img width="714" alt="スクリーンショット 2016-03-24 11.56.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/57844/fa4913b9-6a7b-a610-000c-4d4b22e0e560.png">

Remove Text Metadata From Png FilesがYesになっていたのでNoにしたところ実機のビルドが通るようになりました。
WP REST API(v1)で投稿の総件数、総ページ数など

Wordpressの"WP REST API"プラグインに関するメモになります。
投稿の一覧を取得するのは、/posts エンドポイントにGETリクエストすればよいのですが、
（ページャ実装などに必要な）総ページ数情報などに気づきにくかったのでメモしておきます。

# 注意
WP REST API バージョン1の情報です。
バージョン2の仕様については調べていません。

# 結論
レスポンスヘッダの"X-WP-TotalPages","X-WP-Total"を参照すればよい。

* X-WP-Total
 * 総投稿数 
* X-WP-TotalPages
 * （現在の1ページ当たり表示件数での）総ページ数

# 簡単な確認方法

※ドメインとかWordpressのディレクトリは適当に伏せております。

## 確認コマンド(curl)

```bash
$ curl -s -D - http://exapmle.com/path/to/wordpress/wp-json/posts -o /dev/null
```

レスポンスボディを`/dev/null`に捨ててレスポンスヘッダのみ表示してます[->参考](http://te2u.hatenablog.jp/entry/2015/08/04/001554)

## 結果（レスポンスヘッダ一覧）

"X-WP-Total"と"X-WP-TotalPages"が含まれていますね。
記事件数が少ないのでサンプルとしては微妙ですがご容赦ください。

```
HTTP/1.1 200 OK
Date: Thu, 24 Mar 2016 02:26:40 GMT
Server: Apache/2.2.15 (CentOS)
X-Content-Type-Options: nosniff
X-WP-Total: 2
X-WP-TotalPages: 1
Last-Modified: Wed, 23 Mar 2016 02:37:35 GMT
Link: <http://exapmle.com/path/to/wordpress/wp-json/posts/5>; rel="item"; title="TEST", <http://exapmle.com/path/to/wordpress/wp-json/posts/1>; rel="item"; title="Hello world!"
Content-Length: 4381
Content-Type: application/json; charset=UTF-8
```

## jQueryで確認例

※ 2016/3/24 ちょっと追記
jQueryを使ってAJAXで実装しているのなら、`$.ajax`の成功時コールバックの第3引数を見ればよいです

```js
$(function(){
  var postsPerPage = 1; // 1ページ当たり件数
  var currentPage  = 1; // 取得したいページ数 

  $.ajax({
    type: 'GET',
    url:  '/path/to/wordpress/wp-json/posts', // 適当に読みかえてください
    dataType: 'json',
    data: { 
      page: currentPage,
      filter : {
        posts_per_page: postsPerPage
      }
    }
  })
  .done(function(json, textStatus, request){
    // このあたりを参照すればよい
    console.log(request.getAllResponseHeaders());
    console.log(request.getResponseHeader('X-WP-TotalPages')); // 個別に参照するならこうする
    console.log(request.getResponseHeader('X-WP-Total'));      // 個別に参照するならこうする
  })
  .fail(function(){
    // 失敗時処理
  });
});
```

# 参考URL

* http://wp-api.org/guides/getting-started.html#getting-posts
 * "X-WP-Total"と"X-WP-TotalPages"について説明があります。
 * 最初一生懸命、http://wp-api.org/index-deprecated.html を読んでいて途方に暮れた。
正規表現で ASCII 文字列にマッチさせる

簡単そうですが、意外と色んなケースがあると思います。

## TL;DR

```rb
#!ruby
# 英小文字のみでいい
str =~ /^[a-z]+$/
# 大文字も含めたい
str =~ /^[a-zA-Z]+$/
# 数字と _ も OK
str =~ /^[\w]+$/
# 空白・タブ・改行も OK
str =~ /^[\w\s]+$/
# 記号も OK
str =~ /^[0x21-0x7e\s]+$/
```

最後のものについて。  
ASCII の印字可能文字は `/^[0x20-0x7e]$/` の範囲ですが、これには `[\t\n\r\v]` が含まれないので、含めたい場合はこのようにすればよいでしょう。 

詳しくは ASCII コード表を参照してみてください。

## 参考

- https://ja.wikipedia.org/wiki/ASCII
Redmine 3.xでlogroatedを使わずにログローテーションをする


RedmineをWindows Serverにインストールした環境で、production.logが肥大化していることに気づいて対応した。

logroatedを使ったローテーション方法は良く見かけるし、Redmine 2.x向けっぽい設定方法も良く見かけるけど、3.xでlogroatedを使わずに対応する方法はあまり見かけなかった。

対応方法は、 **config/additional_environment.rb ** に設定を入れること。

以下の例では、ついでにログレベルも変更している。

```ruby
config.logger = Logger.new("log/production.log", 'daily')
config.log_level = :info
```

上記の設定を入れることで、production.logが **production.log.20160324** のように日次でローテーションしてくれるようになった。
VectorDrawableを使う際に、SVGで設定している色が反映できないときの対処方法

以下のようなシンプルなsvgを、Vector Asset Studioを使ってxmlに変換しようとしました。
![スクリーンショット 2016-03-24 10.57.26.png](https://qiita-image-store.s3.amazonaws.com/0/6061/35dc63c4-8831-49f3-c3fc-e038f2d48b7e.png "スクリーンショット 2016-03-24 10.57.26.png")

ところが実際に変換をかけようと思ったら、以下のように★が黒になってしましたした。。
（今回のように単純な単色で良ければ、黒で書き出し + `android:tint`で色付けでも良いですが、色情報を失いたくないという前提で話を進めます）
![スクリーンショット_2016-03-24_10_58_51.png](https://qiita-image-store.s3.amazonaws.com/0/6061/de4861ff-13f0-93ee-2f32-a971e255f5dd.png "スクリーンショット_2016-03-24_10_58_51.png")

画面下に出ている「Error」を見てみます。

```
In hoshi.svg:
ERROR@ line 2 <defs> is not supported
```

どうやら現状のVector AssetStudioではsvgに含まれる`defs`タグを読み込めないようです。
[StackOverFlow](http://stackoverflow.com/questions/33130447/android-studio-vector-asset-import-error-tags-not-supported)にも同様の症状が載っていました。

これが原因でVectorDrawableを諦めるのは少し悔しいのでなんとか対応してみます。

まず読み込めなかったsvgファイルをテキストエディタで見てみます。

```xml
<svg xmlns="http://www.w3.org/2000/svg" viewBox="574.448 207.512 31.072 29.984">
  <defs>
    <style>
      .cls-1 {
        fill: #ffd100;
      }
    </style>
  </defs>
  <path id="_" data-name="★" class="cls-1" d="M16-27.488l-3.744,11.52H.448l9.5,7.136L6.3,2.5,16-4.512,25.664,2.5,22.048-8.832l9.472-7.136H19.712Z" transform="translate(574 235)"/>
</svg>
```

これを見ると、`defs`の中で色指定（`#ffd100`）されていることがわかります。
これを以下のように書き換えてみます。

```xml
<svg xmlns="http://www.w3.org/2000/svg" viewBox="574.448 207.512 31.072 29.984">
  <path id="_" fill="#ffd100" data-name="★" class="cls-1" d="M16-27.488l-3.744,11.52H.448l9.5,7.136L6.3,2.5,16-4.512,25.664,2.5,22.048-8.832l9.472-7.136H19.712Z" transform="translate(574 235)"/>
</svg>
```

色の指定を`path`の中に直接入れました。
これでVector Asset Studioで色付きで読み込めるようになりました。

![スクリーンショット_2016-03-24_11_06_20.png](https://qiita-image-store.s3.amazonaws.com/0/6061/94f20045-e9b8-a815-9f2f-fcaf4434b4ee.png "スクリーンショット_2016-03-24_11_06_20.png")

シンプルな画像であれば、こうした対応で良いのですが複雑なsvgだと対応が難しそうです。。。
drawableの中にsvgを直接取り込める＆いろんな形式のsvgに対応してくれれば色々と楽なのですが。。。

追記：
http://inloop.github.io/svg2android/ だと`defs`に付いてる色指定も反映してくれますね！
非公式なツールなので、使いどころは限られるかもしれませんが、手軽に対応するときには便利そうです。
JINS MEME ACADEMIC PACKのセンサが一部動作しない

# JINS MEME ACADEMICを使っていて、EOGセンサのみ機能していて加速度、ジャイロが動いていない現象に遭遇しました。電源ボタン１３秒長押しで直ったので一安心です。

##### 以下、現象のメモと試みの詳細です。
瞬きを数回、その後目を固定して頭を動かしたり（※）してEOGセンサが動いているのを確かめました。
一方で、頭を動かしているにも関わらず、加速度や、ジャイロのシグナルは微動だにしていません。。
※頭に対して相対的に目が動くのでEOGシグナルが検出されます。


![capture.PNG](https://qiita-image-store.s3.amazonaws.com/0/108112/4dfd29b3-64c7-ab49-6232-6d0d97919abd.png)


どうしたもんかとググってみるとJINSサポートページで

【解決方法】
**電池残量がある状態で電源ボタンを13秒以上長押しし、本体をリセットしてから動作確認を再度行う**
https://jins-meme.com/ja/support/return/

との記載。

試しにやってみると

![キャプチャ (2).PNG](https://qiita-image-store.s3.amazonaws.com/0/108112/909b15be-cb7a-8800-8bde-9d25369ef698.png)

無事直っているのを確認。
リブートはやはり強いですね。
Rのsnowパッケージを使ってrandomForestを並列化


#:arrow_forward: 通常と並列化の比較
##:small_blue_diamond:通常のランダムフォレスト

```
library(randomForest)
library(kernlab)

data(spam)
set.seed(777)
system.time(fit.rf<-randomForest(type~.,data=spam,ntree=1000))
```

| ユーザ | システム | 経過 |
|:-----------:|:------------:|:------------:|
| 21.584| 0.213| 21.919|

##:small_blue_diamond:並列化のランダムフォレスト
```
library(snow)
cl <- makeCluster(4,type="SOCK")
invisible(clusterEvalQ(cl,{
        library(randomForest)
        library(kernlab)
        data(spam)
    }))
set.seed(777)

print(system.time(fit.rf <- clusterApply(cl,rep(250,4),function(ntree) randomForest(type~.,spam,ntree=ntree))))
fit.rf.all<-do.call("combine",fit.rf)
stopCluster(cl)
```

| ユーザ | システム | 経過 |
|:-----------:|:------------:|:------------:|
| 0.053| 0.036| 11.525|

#:arrow_forward: 並列化方法解説
他のプロセスでもライブラリや変数を利用するために通常の読み込みとは別に事前準備が必要となる。また、関数内で並列化を行う場合引数を利用することはできない(引数はclusterExportすることができない)。

* クラスターの生成

```
cl <- makeCluster(4,type="SOCK")
```
> アクティビティモニタを利用するとプロセスが4つになっていることが確認できる。
![use_snow.png](https://qiita-image-store.s3.amazonaws.com/0/11743/c5a0ba55-2953-c9dc-26dd-7f9b5f6a1669.png)


* ライブラリなどの読み込み

```
invisible(clusterEvalQ(cl,{
    library(randomForest)
    library(kernlab)
    data(spam)
})))
```

* 変数の利用方法

```
clusterExport(cl,"value1")
```

* クラスターの終了

```
stopCluster(cl)
```
> エラーなどによって正常に終了することができなくて放置すると
![memory_snow.png](https://qiita-image-store.s3.amazonaws.com/0/11743/db213296-6f56-cc7e-e223-fb4bb922ea7e.png)
一度Rを終了させればリセットされる。

# 参考資料
* [snowパッケージで並列化（R）](https://sites.google.com/site/scriptofbioinformatics/bing-lie-hua-guan-xi/snowpakkejide-bing-lie-hua-r)
* [Rによるハイパフォーマンスコンピューティング](http://www.amazon.co.jp/R%E3%81%AB%E3%82%88%E3%82%8B%E3%83%8F%E3%82%A4%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0-%E7%A6%8F%E5%B3%B6-%E7%9C%9F%E5%A4%AA%E6%9C%97/dp/4883379353/ref=sr_1_1?ie=UTF8&qid=1458784005&sr=8-1&keywords=R%E3%81%AB%E3%82%88%E3%82%8B%E3%83%8F%E3%82%A4)
Tips項目


新しいプログラミング言語を使う場合に調べておく項目メモ。

- コーディング規約
	- クラス名/変数名/名前空間/インデント
	- IDEまたはLintツールでチェック
- 基本構文
	- 基本構文最速マスター記事で確認・暗記
- オブジェクト指向関連の記法
	- 各言語で違いがあって忘れやすいものをメモする
		- コンストラクタ
		- 親呼び出し
		- オーバーロード
		- 継承記法
- コレクションライブラリ
	- Array/List/Map/Set
- 時間計算ライブラリ
	- ロケール
	- 現在時刻
	- n秒前/後
	- 曜日
	- 文字列フォーマット変換
- 文字列操作
	- Stringクラスのメソッド
	- 正規表現
- URLパーサライブラリ
- ディレクトリ/ファイル操作
	- ディレクトリ内のファイル一覧
	- ディレクトリ存在確認
	- ディレクトリ作成
	- ファイル読み込み/書き込み
- ライブラリエコシステム
	- リポジトリ
	- コマンド/ライブラリ指定方法
	- ライブラリの作成方法/アップロード方法
- コマンドオプションパーサー
- 乱数関連
	- ランダム文字列の生成
	- ランダム数の生成
- MySQLとの連携
	- O/Rマッパ
- Redisとの連携
- テストフレームワーク
	- Mock
	- DB/Fixture
- Web Application Framework
    - UserAgent判別方法
    - Header情報取得方法
    - フォーム作成
	    - 各フォームの生成方法
	    - バリデーション
    - HTMLテンプレート
	    - ページネーション
    - セッション管理
	- CRUD
	- ログイン機能
		- ログイン認証
		- ログイン機能提供
	- ソーシャルログイン機能
		- ライブラリ
	- Basic認証
	- WebSocket
	- データアップロード
	- デプロイ方法
		- サーバ
- HTTPクライアント
    - GET
    - POST
    - APIを叩く
    - ログイン
- JSONパーサ
- XMLパーサ
- ログライブラリ
- Tips
    - 環境変数の取得方法
    - シグナルハンドル
- 設定ファイルパーサ
	- YAML/TOML/Property
- Reflection機能
- AWS関連のライブラリ
【Apache】HTTP/HTTPS共存　リダイレクト設定　Rewrite【SSL設定】


【個人メモ】
Apacheの設定でSSLと通常の通信を行う際の共存設定方法
バーチャルホストの設定にて実施

__Listenは80__しか開けてない
__NameVirtualHost *:443__書いてから起動時にWarnを見るように⇒不要かも？


####基本構文
```httpd:httpd.conf

<VirtualHost *:80>
        ServerName HTTP通信時のてすとサーバの名前（サイトURL）
        DocumentRoot /var/www/html/ほげほげ
        <Directory "/var/www/html/ほげほげ/">
                AllowOverride 
                RewriteEngine 
                
        </Directory>
</VirtualHost>

<VirtualHost *:443>
        ServerName HTTPS通信時のてすとサーバの名前（サイトURL）
        DocumentRoot /var/www/html/ほげほげ
        Redirect 
        
        <Directory "/var/www/html/ほげほげ/">
                AllowOverride 
                RewriteEngine 
                
        </Directory>
        	RewriteEngine 
        	SSLEngine on
        	SSLCertificateFile    /etc/ssl/hoge.cer
        	SSLCertificateKeyFile /etc/ssl/hoge.key
        	SSLCertificateChainFile /etc/ssl/hoge-hoge.cer
</VirtualHost>


```

複数ドメイン運用の際は上記セットをドメイン数分書いてしまえばドメイン数分HTTP/HTTPSの設定が可能



###.htaccess
.htaccessを利用する場合、上記ディレクトリタブ内の『AllowOverride』を　AllowOverride All とする。
この記述が無いと.htaccessが効かなくなる。
聞かせたいディレクトリ階層の一番上で1回この記述を書いておけば、その下の階層の.htaccessは効く

 ---
 
###リダイレクト
URLの書き換え＜Rewrite＞を行う場合このタブ内に記述（物によってはヴァーチャルホストタブの中で無いと効かなかったので両方試す）
リダイレクトはそのドキュメントルートからみて、どこにアクセスが有った場合どこに飛ばすと言った形で書く

Rewriteサンプル

```htttpd:サンプル
RewriteRule .* https://www.google.co.jp/ (⇒そのディレクトリに来たやつを全部飛ばす）
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]　（⇒HTTPをHTTPSに強制リダイレクト）
```
後ろの[R,L]とか結構重要


Redirectサンプル

```httpd:サンプル
Redirect /sub_dir1 http://qiita.com/Yuki_BB3/stock
Redirect /sub_dir1/index.html http://qiita.com/Yuki_BB3/stock
Redirect /sub1(.*) http://qiita.com/Yuki_BB3/stock
```

---

###SSL証明書設定
バーチャルホストタブ内

         	SSLEngine on
        	SSLCertificateFile    /etc/ssl/hoge.cer
        	SSLCertificateKeyFile /etc/ssl/hoge.key
        	SSLCertificateChainFile /etc/ssl/hoge-hoge.cer

により設定する。
ドメインにより証明書が異なる場合、それに合致したものを間違えないように使う。

---
参考にしたサイト

http://blog.dawgsdk.org/weblog/archives/411011
http://kana-lier.com/web/redirect/#sec2
http://aoi-f.blog.so-net.ne.jp/2010-08-20-1
http://web.antenna.work/rewritecond-rewriterule/
https://www.suzukikenichi.com/blog/integrating-www-and-non-www-by-301-redirect/
http://rfs.jp/server/apache/02apache/url_rewrite.html
https://gist.github.com/y13i/65a73493b55474f9a658
http://web-tan.forum.impressrd.jp/e/2010/01/05/6369#www
http://digital-marketing.jp/site-renewal-301-redirect/
Firefoxで戻るボタンを押したときに前の効果が残ったままになる

タイトルのことで少しハマったのでメモメモ。

検索ボタンなどを二重押しさせないようにJavaScriptの方で、一度押したらそのボタンを押せないようにしてた（もちろん検索後はPOSTするので元に戻る）
IEでは問題なくこれで動くけど、Firefoxでは戻るボタンを押したときにボタンが押せないままになっている。

この原因はIEとかChromeはonloadイベントが呼ばれるけど、Firefoxでは呼ばれないために起こるっぽい。
なのでFirefox用に戻るボタン押下時やページ表示時に実行されるというpageshowを使って対応することにした。

```js:javascript
/*
 * 検索ボタン
 */
$( document ).on( "click", "#Search", function()
{
  /* 検索の処理とか */

  /* ------------ */

  document.body.style.cursor = 'wait';  // カーソルを待機中に変える
  $('input').css('cursor', 'wait');     // ボタン上のカーソルを変える
  return true;
} );


/*
 * 二度押し防止
 */
var doubleSubmitSet = 0;
function double()
{
  if ( doubleSubmitSet == 0 )
  {
    doubleSubmitSet = 1;
  }
  else
  {
    alert( "二重押し禁止！！" );
    return false;
  }
}

/*
 * 二度押し防止の処理をした後に戻るボタンで戻った時の動作
 */
window.onpageshow = function()
{
  doubleSubmitSet = 0;
  document.body.style.cursor = 'auto';  // カーソルを待機中に元に戻す
  $('input').css('cursor', 'auto');     // ボタン上のカーソルを元に戻す
}
```

```html:HTML
<form action="xxx" method="post" id="SearchForm" onSubmit="return double()">
  <input type="submit" value="検索" id="Search" name="Search">
<form>
```



これで必ずページ表示時に二重押しのフラグがリセットされるため、戻るボタンを押してもクリックできる。
これ以外にも「window.onunload=function(){}」を使いキャッシュ機能を無効にすることでも出来るけど、キャッシュ無効はパフォーマンス的に厳しいので今回はこちらにした。

この方法だとSafariがまだ対応できていないので、別途追加しなくては・・。

参考：ブラウザの戻るボタンで戻ったときに呼ばれるイベントとかキャッシュとかそこらへんのことAdd Star
http://d.hatena.ne.jp/koumiya/20080916/1221580149

window.onunloadを使ってキャッシュを無効に
http://www.webbibo.com/blog/javascript/onunload.html
Bracketsで、jade（またはerbやhamlその他）をライブプレビューする

あらゆるテンプレートエンジンが、Brackets上でプレビューできるようになります。

## 前提
プレビュー可能なように、 localhostのサーバーを立てる。


## やり方

以下のコマンドを実行するだけ。
```
sed -i '.bak' 's/, "shtml"\]/, "jade", "shtml"\]/' main.js 
```

（他のテンプレートエンジンの場合は、 jade の部分を erb や haml や slim に変更すれば良いです）
デフォルトのプロジェクト保存先を指定する

プロジェクト保存先の指定方法がわからなかったのでメモ。

![image](https://qiita-image-store.s3.amazonaws.com/0/113248/1ffd78d0-3591-084c-36d5-50d27173b9dd.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/113248/e5e70093-851e-7fae-76a1-340568b29ee4.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/113248/4365a64c-8933-ec6a-89f6-4830c5b2f3d0.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/113248/cfedb4bb-21f5-c408-2898-38fa9c81b706.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/113248/474c35e4-3f99-8325-75a7-dc90e23e7df9.png)
Electronで外部コマンド実行【メモ】

Electron勉強がてらのメモです。
内容薄いです。

- - -

Electronで外部コマンド実行する場合は、nodeのやり方でOK。

```js
const exec = require('child_process').exec;

var command = 'ls';

exec(command, (error, stdout, stderr) => {
  // なんか処理
});
```
実践 オフショア開発の品質管理 Rails + NewRelic + mini-profiler

GYAOの窓際エンジニア　玉利です。

ベトナムオフショアだと、「ベトナムの東大京大クラスのエンジニアが安価で雇える」という売り込みを聞くことになります。


![IMG_7511.jpg](https://qiita-image-store.s3.amazonaws.com/0/113049/9ee29ba2-37fb-4f5c-a049-75481a2b552f.jpeg)
BEFORE & AFTER これがベトナムの誇る最新の画像テクノロジー？？？


それは正しくもあるのですが、猛烈に頭のいいエンジニアはやっぱり少なくて、日本とかわらない確率で普通のエンジニアがアサインされます。

それでいいんです。日本で働いても、できの悪い後輩のほうが人間味があって可愛いんですから。ベトナム人の若者、男も女の子もわかりやすい天然が入っていて、むっちゃくちゃかわいいです。

とはいえ、仕事は神聖なる金稼ぎの場なので、ベトナム生産といえども日本人からぎりぎりOKを貰える品質を目指さなければいけません。

相棒のベテランSE　Nさんが本日分の検証結果を、私が退社したあとに社内Slackメッセくれました。会社携帯でメッセが読めてしまうので、あまりうれしくないのですが」

Nさん「今日上がってきた分、一通り検証しました。なんか一覧表示で大量のSQLが発生してるみたいで、むちゃくちゃ遅いんですが」
玉利「了解です。明日、NewRelicの使い方を教えます」

というわけで、何が問題なのか解析方法をNさんにおしえることになりました。Nさんはベテランなので古いシステムの担当を任されてしまう事が多く、今回のRails新規案件をコードを書かなくても楽しんでくれているようです。

Nさん「たぶん、joinしてSQLの回数減らせばいいんじゃないでしょうかね？」
玉利「ついでにRedisいれて、マスタ参照をキャッシュしますか」
Nさん「まず先にSQLをしっかり改善しましょう」

Nさんは私よりもソフト開発歴が長いだけあって、さすがの見識です。


# 実践　品質管理

Nさんに、パフォーマンス解析のやりかたを説明します。

私がやっているオフショアのPJでは、最初からmini-profilerとNewRelicを仕込んであります。これは日本側からgit pushします。

New Relic http://newrelic.com/
インストールは簡単、3分でできます。qiitaに大量に記事があるので省略します。

Rack-mini-profiler
http://railscasts.com/episodes/368-miniprofiler?language=ja&view=asciicast

これもインストールは簡単で、gemをdevelopmentグループに入れてあげるだけです。

NewRelic APMを開きます。

Trancactionsを確認します。案の定、遅いですね。どうやらrubyのコード（水色)に問題があるようで、sqlite(黄色)はほとんどコストがかかってません。

![CaPhe-GYAO__Development__-_New_Relic.png](https://qiita-image-store.s3.amazonaws.com/0/113049/793b85ae-e275-8d26-3392-7abe8be523fa.png)

Breakdownを確認します。viewのどこかが遅いようです。

![Transactions_-_CaPhe-GYAO__Development__-_New_Relic.png](https://qiita-image-store.s3.amazonaws.com/0/113049/3e939831-6cd0-c791-2391-0b4e91cafcdd.png)


中を見ると、まだ作り始めたばかりなので変なコードは入ってません。うーん、レコードを回す配列のあたりが大きすぎるのかなぁ。

ここで、rack-mini-profilerの登場です。

SQLを確認。おお、この137sqlという回数はおかしい。ここもクリックできます。

![CaPhe-Proto.png](https://qiita-image-store.s3.amazonaws.com/0/113049/d623395a-1f38-6626-5714-5ddcd7731793.png)




どんなSQLが発行されてるのか、一覧で見えます。名前の表示のためにUser.display_nameを１行毎に検索してるんですね。そりゃ遅いわけだ。

![CaPhe-Proto.png](https://qiita-image-store.s3.amazonaws.com/0/113049/79fc384a-7902-805d-5c57-18cdb29b0abd.png)


ここまで探すのに、5分かかりませんでした。典型的なN+1問題でした。



# 仕事の基本は仕組みで解決

だいたい、こういうのを直感的にわかるエンジニアというのが今まで評価されてきましたが、いまではマネージャーが適切な測定ツールを用意しておけば、新卒に毛が生えた程度のエンジニアでもそこそこの打率を叩き出せます。いい時代です。

でも、今回いちばん恩恵を受けたのは、ニコニコしてるベテランNさんみたいです。

Nさん「いままでは原因探すの普通はあちこち追いかけて試行錯誤してだけど、これ(NewRelic)見れば一発じゃないですか」

腕の良いエンジニアの工数は再生産できないので、どうやらこの一件だけで数時間以上、数万円分は会社が得をしたようです。

ベトナム人はテキトーにガンガン作るので、片っ端からおかしいところを指摘していかないとあとで大変な目にあいます（日本人が！）。この手のツール武装なしにオフショア開発をするのは、お勧めできません。


※　NewRelicは、アカウントを作ってしばらくすると西海岸から英語の直電がかかってきます。落ち着いて「I really can't speak Japanese」と言って煙に巻きましょう。＜冗談です。
SourceTreeの差分アーカイブ作成

https://ics.media/entry/4475

Windows環境にて、SourceTreeの内蔵Gitを使用する場合には、
上記ページのバッチが動きませんでした。

少し試した結果、PATHを通すと動作しました。
gitコマンドのパスを直接指定するのもいいかもしれません。


```lang:export_diff_zip.bat
if "%2" EQU "" (
  set PARAM1=HEAD
  set PARAM2=%1
) else (
  set PARAM1=%1
  set PARAM2=%2
)
 
setlocal enabledelayedexpansion
set PATH=%USERPROFILE%\AppData\Local\Atlassian\SourceTree\git_local\bin;%PATH%

set RET_DIR=
for /F "usebackq" %%i in (`git diff --name-only %PARAM1% %PARAM2%`) do (
  set RET_DIR=!RET_DIR! "%%i"
)
 
git archive --format=zip --prefix=archive/ %PARAM1% %RET_DIR% -o archive.zip

```
Java SE7 Gold 取得を目指して (13)

Java SE7 Gold をとりたい…!
===

本日は第13回目です。
JDBCについての章です。

## 今日のこぼれ話
こぼれている場合じゃない…! JDBCは盛りだくさんです。

## 本日知ったこと(10章)

* JDBCの使い方(以下の順で流れる)
  1.  データベースの指定
     * `String url = "jdbc:mysql(subprotocol)://localhost/mydb(subname)";` 
     * デフォルトポートは 3306
  2.  データベースとの接続
     * `Connection con = DriverManager.getConnection(url, "username", "password");`
     * JDBC4.0より `Class.forName()` によるドライバのロードが不要に(CLASSPATHに含まれていれば自動でロードする)
  3. ステートメントの取得
     * `Statement st = con.createStatement();`
  4. SQL実行
     * `ResultSet rs = st.executeQuery("SELECT * FROM users");` 
  5. 結果の取得
     * `rs.next()` 
     * 初期状態でカーソルは**1行目の前**(next()なしでデータを読もうとすると例外が出る)
     * `getXXX(列番号|列名)`(XXXはJavaの型名) でデータを取り出す(最初の列番号は**1**)
  6. リソースの解放

* SQLステートメント
  *  Statementインタフェース

    メソッド|説明
    :---|:---
    ResultSet executeQuery(String sql)|SQLを実行する<br>結果が空でもnullは返さない
    int executeUpdate(String sql)|SQLデータ操作言語文(UPDATE,INSERT,DELETE...)を実行する
    boolean execute(String sql)|実行結果がResultSetの場合はtrue、更新行数がないか結果がない場合はfalseを返す
    ResultSet getResultSet()|現在の結果であるResultSetを返す<br>結果がカウントか結果がない場合はnull

  * PreparedStatement

    ```java
   PreparedStatement st = con.preparedStatement("INSERT INTO users VALUES(?, ?, ?)");
   st.setInt(1, id); // 1つ目の?へidを設定
   st.setInt(2, age); // 2つ目の?へageを設定
   st.setString(3, name); // 3つ目の?へnameを設定
    ```

 * CallableStatement
   * ストアドプロシージャの呼び出しに使う

    ```java
   CallableStatement st = con.prepareCall("{ call myprocedure (?, ?)}");
   st.setInt(1, 1000); // 1つ目の?へ入力パラメータを設定
   st.registarOutParameter(2, java.sql.Types.BIGINT); // 2つ目の?へ出力パラメータを設定
   st.execute();
   int result = st.getInt(2); // 結果(出力パラメータ)の取得
    ```

* メタデータ
  * DatabaseMetaData
     * JDBCドライバ名やバージョン名などデータベースに関するメタデータを取得する
  * ResultSetMetaData
     * 列の型やResultSetに何行含まれているかなどResultSetに関するメタデータを取得する
     
* ResultSet拡張
  * ステートメント取得時にResultSetを切り替えられる

    定数名|モード/タイプ
    :---|:---
    CONCUR_READ_ONLY|更新できないResultSetオブジェクトの並行処理モード
    CONCUR_UPDATABLE|更新可能なResultSetオブジェクトの並行処理モード
    TYPE_FORWARD_ONLY|カーソルは順方向にしか移動しない
    TYPE_SCROLL_INSENSITIVE|スクロール可能<br>データベースへの変更は反映しない
    TYPE_SCROLL_SENSITIVE|スクロール可能<br>データベースへの変更を反映する

 * データの挿入/更新
     * `updateXXX(int columnIndex, XXX x)`(XXXはString,intなど) で更新

      ```java
      /* 行の挿入 */
      rs.moveToInsertRow(); // 挿入行へ移動
      rs.updateString(1, 100); // 値更新
      rs.updateString(2, "name");
      rs.insertRow(); // 行の挿入
      ```

* トランザクション
  * `con.setAutoCommit(false)` で自動コミットオフ
  * `con.setTransactionIsolation(int level)` で分離レベルの設定

    定数名|ダーティーリード|反復不能リード|ファントムリード
    :---|:---:|:---:|:---:
    TRANSACTION_NONE|-|-|-
    TRANSACTION_READ_UNCOMMITTED|許可|許可|許可
    TRANSACTION_READ_COMMITTED|抑制|許可|許可
    TRANSACTION_REPEATABLE_READ|抑制|抑制|許可
    TRANSACTION_SERIALIZABLE|抑制|抑制|抑制

* RowSet
  * DBへの問い合わせ結果をカプセル化する
  * アプリケーション側で使用しやすいように機能が拡張されている
  * DisConnected RowSet(DBへの接続が保持されない) と Connected RowSet(DBへの接続が保持される) がある
  * DisConnected RowSetなら接続断(close)後でも結果を取得できる
  * RowSetProvider → RowSetFactory でRowSetを取得する(Java7から)

    ```Java
    RowSetFactory factory = RowSetProvider.newFactory();
    JdbcRowSet rowSet = factory.createJdbcRowSet(); // RowSetごとにcreateXXXX()が用意されている
    ```
Re: Windowsのbatファイルで"%~dp"と書いてはいけない

元記事: [Windowsのbatファイルで"%~dp"と書いてはいけない](http://qiita.com/Fushihara/items/e6eca40d19582efd48f3)

これはWindowsのコマンドライン引数の解釈が摩訶不思議だから起こることみたいですね。

- [cmd.exe のコマンドラインの仕様を解析してみた - 永遠に未完成](http://thinca.hatenablog.com/entry/20100210/1265813598)
- [コマンド ラインの指定 (MSDN)](https://msdn.microsoft.com/ja-jp/library/78f4aasd(VS.80).aspx)

前者の「4. 個々のコマンドの解釈」のフェーズがC#プログラムに任されることで、後者の「コマンド ライン構文の規則」が適用されるんですね。

それで、

> 円記号を前に付けた二重引用符 (\") は、リテラル二重引用符文字 (") として解釈されます。

が適用され、めでたくディレクトリ末尾のバックスラッシュが捨てられる代わりに、ダブルクォーテーションが1文字だけリテラル扱いになり、引数内に含められてしまうようです。

ようです？

それにしても、残りの空白文字やダブルクォーテーションの扱いが、なんだか変なことになっていますね……
システム間連携におけるEnterprise Integration Pattern

複数のシステム(やサービス)を跨いでデータ連携したい、なんて要望は今やどこの現場でもあると思うが、その際のデザインとしてEnterprise Integration Patternというものがある。この手の検討は主に「方式設計」なんて呼ばれていて、開発のかなり早い段階で検討されたりする。Enterprise Integration Patternには4パターンあり各々簡単にまとめた。

# パターン1：File Transfer
![a.png](https://qiita-image-store.s3.amazonaws.com/0/23101/60aef923-6d64-2c50-2c88-4bf2f322c06f.png)

いわゆるファイル転送でのデータ連携。比較的容易に実現出来て、色んな現場で見かけるパターン。即時性を求められないバッチ等でよく見受けられる。双方のシステムで連携するデータ項目を定めて、IFファイル定義書を作成する。

# パターン2：Shared Database
![2.png](https://qiita-image-store.s3.amazonaws.com/0/23101/d5a3740f-a324-0cb4-9d0c-256639ac0eb1.png)

いわゆるデータベース共有でのデータ連携。説明不要ってくらいどこにでもあるデータ連携方式。フロントエンドとバックエンドで分かれるようなシステム構成をとる場合によく利用される。

# パターン3：Remote Procedure Invocation
![3.png](https://qiita-image-store.s3.amazonaws.com/0/23101/0f1f1709-3b16-642e-6306-5c7220e1caa8.png)
RESTやSOAPみたいなWeb APIなんかはこのパターン。外部システムのProcedureをリモートコールしてデータ連携する。昔はSOAでSOAP、最近ではマイクロサービスアーキテクチャなんかが注目されてきて特にRESTful APIなんかはトレンド感がある。

# パターン4：Messaging
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/23101/f56cf3ae-970c-d629-40e8-529a0c50845b.png)
メッセージバスと呼ばれる、非同期を前提としたフレームワークを介してデータ連携するパターン。SOAなんかでは多く見られたパターン。

# どのパターンを採用するか？
最近マイクロサービスアーキテクチャという言葉をよく聞くからといって、安易にパターン3のRemote Procedure Invocationパターンを使おう！ではだめです。また、リアルタイム性が求められているのにパターン1のFile Transferやパターン4のMessagingを使うのも違うかと思います。自分たちが何を求めているのかしっかりと分析したうえで、じゃあこれだね、ってなるかと思います。要するに適材適所です。
技術英語 > things dry out, [fall apart], blow away. / come off

@ LOE > February 21, 2003

http://loe.org/shows/shows.html?programID=03-P13-00008
> In the fall, the days shorten, things dry out, <font color=red>fall apart</font>, blow away.


http://ejje.weblio.jp/content/fall+apart

崩落する、などの意味のようだ。

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

http://ejje.weblio.jp/content/come+off
> come off
> …からとれる、はずれる、…から引かれる、割引される

wall paperがcome offしたという使い方がどこかの資料で見た気がする。
HHKB Proを利用していてcapslockを無効化したいとき


まずは、HHKB PRO用のドライバーを入れる。

https://www.pfu.fujitsu.com/hhkeyboard/download.html

ちなみに、DIP SWは1,5だけONにすると、通常のMacキーボードっぽくなる。


設定ー＞キーボードー＞装飾

ここで、CapsLockのアクションを、なしにすればOK
２０分ぐらいはまったので、メモっておく。

![スクリーンショット 2016-03-24 5.34.24.png](https://qiita-image-store.s3.amazonaws.com/0/44315/2ec799b0-8037-d77e-2a22-1938a114de41.png "スクリーンショット 2016-03-24 5.34.24.png")
underscoreコードリーディング（random）



underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##randomとは


###[underscorejs.orgのrandom](http://underscorejs.org/#random)

こんな説明。
>####_.random(min, max) 
>Returns a random integer between min and max, inclusive.
>If you only pass one argument, it will return a number between 0 and that number.


```javascript
_.random(0, 100);
=> 42

```

------------- 
引数にあるminとmaxお間のintegerをランダムで返します。
もし1つしか引数を渡さなかった場合、0からその値までの間のランダムな値を返します。

###[underscore.random](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1321)
コード的にはこのあたり。

```javascript
  // Return a random integer between min and max (inclusive).
  _.random = function(min, max) {
    if (max == null) {
      max = min;
      min = 0;
    }
    return min + Math.floor(Math.random() * (max - min + 1));
  };
```

maxがnullの場合はminをmaxにして、minを0にする。
その後、 Math.randomのmax - min + 1の間の中の値をfloorで整数化したものとminを足し合わせたものを返す。
iOS8で突然起動しなくなる「dyld: Symbol not found: ___NSDictionary0__ ...」


#現象
- iOS9系では正常に動作しているアプリが、iOS8系で一切起動しない

```
dyld: Symbol not found: ___NSDictionary0__
  Referenced from: /Users/XXXXXXX/Library/Developer/Xcode/DerivedData/XXXXXXXXXXXXX-XXXXXXXXX/Build/Products/Debug/XXXXXXXXXXXXX (which was built for Mac OS X 10.11)
  Expected in: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
 in /Users/XXXXXXX/Library/Developer/Xcode/DerivedData/XXXXXXXXXXXXX-XXXXXXXXXXXXXXX/Build/Products/Debug/XXXXXXXXXXXX
Trace/BPT trap: 5
```

#参考URL
http://stackoverflow.com/questions/24333981/ios-app-with-framework-crashed-on-device-dyld-library-not-loaded-xcode-6-beta

#解決策(だと思うこと)
    - TARGETSのLinked Frameworks And Librariesに「CoreFoundation.framework」を追加する
    - CoreFoundation.frameworkのstatusのRequiredではなく「Optional」にする

#その他やったことや環境
- MacOSは関係ないと思うが、当日にEI Captainにしていた
- podのframework関連かとおもったので、pod updateなどをしようと思ったが...
- pod updateがOSアップデートの影響でできなくなったので、こちらを試した(http://kotalab.com/el-capitan-pod-command-not-found)
Data Bindingに触れてみた導入編


#Data Bindingに触れてみた
気になったので試してみようと思った。
導入で記事を探していたら下記をgradleに追加すれば使えるって記事を多く見かけたので
記載して試してみた。

```build.gradle/Project
dependencies {
   classpath "com.android.tools.build:gradle:1.3.0-beta1"
   classpath "com.android.databinding:dataBinder:1.0-rc0"
}
```
```build.gradle/Module
apply plugin: 'com.android.databinding'
```

エラーが出た

```
Error:Unable to find method 'android.databinding.tool.LayoutXmlProcessor.<init>(Ljava/lang/String;Landroid/databinding/tool/writer/JavaFileWriter;IZLandroid/databinding/tool/LayoutXmlProcessor$OriginalFileLookup;)V'.
Possible causes for this unexpected error include:<ul><li>Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
<a href="syncProject">Re-download dependencies and sync project (requires network)</a></li><li>The state of a Gradle build process (daemon) may be corrupt. Stopping all Gradle daemons may solve this problem.
<a href="stopGradleDaemons">Stop Gradle build processes (requires restart)</a></li><li>Your project may be using a third-party plugin which is not compatible with the other plugins in the project or the version of Gradle requested by the project.</li></ul>In the case of corrupt Gradle processes, you can also try closing the IDE and then killing all Java processes.
```

調べたら下記のgradleのverで統合されてたぽかった
```
classpath 'com.android.tools.build:gradle:1.5.0-alpha1
```

moduleでdataBindingを有効にしたらエラーが消えた


```build.gradle/Module
 dataBinding {
        enabled = true
    }
```
#まとめ
次回以降触れて行こうと思う。
AngularJS+Ionicテンプレをエミュレータ・モバイル実機で動かす(Android)

# Angular JS + Ionic + Cordova の導入〜実機で実行まで
* 前提: SDKは導入済みとする  
Androidアプリを作成したローカル環境なら既に通っているはず  
※ 通っていなければ次の3つのパスを通す  
     ADK(Android SDK)の`platform`、`platform-tools`、
     Java `JDK`

## 環境構築手順
必要なCLI

* Node.jsをインストール (npmのため)
* Cordovaをインストール
* Ionicをインストール
※Ionicのプロジェクトを作成する際に、Angular JSの.jsも含まれるのでインストールは不要

導入方法

* Node.js
公式から、DL+インストール
※ Homebrewとか好きなパッケージマネージャーを使ってもOK

* Cordova
`$ npm install cordova -g`

* Ionic
`$ npm install ionic -g`

## プロジェクト作成
`$ ionic start APP_NAME TEMPLATE`

(参考)
Ionicには初期構築用のテンプレートが用意されている
・blanc : 中身が空のアプリ
・tabs : タブ要素を使用したアプリ
・sidemenu : サイドメニュー要素を使用したアプリ
末尾の引数(TEMPLATE)に、`blank | tabs | sidemenu` を指定すれば良い

## プロジェクトの実行
`$ cd APP_NAME` (作成したプロジェクトに移動)
`$ ionic serve`
ブラウザが起動し、作成したプロジェクトを稼働させた画面が表示される

## Android用の環境を構築
`$ ionic platform add android`
下記のように、platform/androidディレクトリが生成される

## Androidのエミュレータ上で実行
`$ ionic build`


## Androidの実機で実行
`$ ionic run`
※事前に実機でデバッグモードONを忘れずに

# フォルダ構成
`$ ionic start tabs_myApp tabs`
で作成したプロジェクトのフォルダ構成は以下。
![folder.png](https://qiita-image-store.s3.amazonaws.com/0/69447/2eb4626c-b1bb-e276-7ed9-65f62e86188d.png)


## ハイブリッドアプリ開発をする上で実際に触る箇所
`tabs_myApp/www/`以下の`css`、`js`などのディレクトリ内や、`html`ファイル
Ionicのサンプル構成ではwww/js/は、以下のようになっている。
![jsFolder.png](https://qiita-image-store.s3.amazonaws.com/0/69447/15597bbf-64c3-e7ee-ca6b-c9aa430f4e00.png)
・`app.js`では、index.html内にある、「<ion-nav-view>ここ</ion-nav-view>」に埋め込むテンプレート(template/以下にある.html)へのパスと、そこで使用するコントローラを指定している
・`controller.js`では、各コントローラと、スコープのセットアップを行っている
・`services.js`では、コントローラーで呼び出すメソッドや、変数の操作を登録している。

## ネイティブ実装が必要な場合
従来通りの方法で行う。
Cordovaでおなじみのディレクトリは、`platforms/`以下で、AndroidManifest.xmlの編集や`src`にJavaコードを入れるイメージになる。

## Ionicで用意されている既存パーツを変更する場合
`tabs_myApp/www/lib/ionic/`にある`css`、`fonts`、`js`、`scss`を変更することになる。
ただ、cssは直接いじらず、scssを弄る方が良いらしい。

※ scssを弄るということは、cssにするためコンパイルが必要となる。そのためのツールは別途必要。
※  Angular JSの.jsもionic/ディレクトリに含まれている。


# 参考ページ

* Developer Guide (おすすめ)
https://docs.angularjs.org/guide
全部読むのは大変だが、"Conceptual Overview"だけでも見ておくといいかも

* API Reference
https://docs.angularjs.org/api

* Angular JSを使用したアプリ集
https://builtwith.angularjs.org
自身のソースを投稿する形式で公開されている
色んなテクノロジーの組み合わせで作っている例を見れる

* Ionic Docs
http://ionicframework.com/docs/
OverviewからHTMLの書き方、CSSの書き方、何でも揃ってる

* Ionicを使用したアプリ集
http://showcase.ionicframework.com
Angularと同様に、他人のアプリイメージを参照する時に有用

結局、公式ページがおすすめな気がする


※本投稿は2015年初の実施内容

# 後日談
* 実際に使ってみてリッチなFWのため学習コストが高いことは事実
 * なので複数人での開発で選択すべきかは要検討
 * 一方で，同時に使用するフレームワークは少なく済む場合がある (IonicはAngularJSをバンドルしている)
* もしハイブリッドアプリを作るなら良いかも
 * Cordova (JSでNative機能利用)
 * Ionic (UI系)+AngularJS
sedを使ってiniファイルのコメントアウト、アンコメントを行う方法

# sedとは
sedはテキストファイルの文字列を置換したい場合によく使われるコマンドです。

確実性や再利用性を考えると、テキストファイルの一部を書き換えたい場合は、
vimで編集するよりも `sed` コマンドを実行した方がいい場合もあります。


# iniファイルのコメントアウト
例えば以下のようなiniファイルがあるとします。

```
$ cat conf.ini
servers[]="192.168.56.102"
servers[]="192.168.56.103"
servers[]="192.168.56.104"
```

`192.168.56.102` のサーバーをメンテナンスしたいのでコメントアウトしたい場合、
`sed` を使って以下のように実行できます。
iniファイルは先頭に;(セミコロン)を付けることでコメントアウト出来ます。

```
$ sed -i 's/.*192.168.56.102/;&/g' conf.ini 
```

`-i` のオプションと最後のファイル名を指定することで、ファイルをそのまま書き換える事が出来ます。
`s/` から始まる部分は正規表現を使って記述することが可能です。/までが置換前文字列、
次の/までが置換後文字列になります。

`&`は正規表現にマッチした文字列を表しますので、`;&` と書くことで内容を変更せず、コメントアウトだけが可能です。
この場合&には、`servers[]="192.168.56.102` が入ることになります。

# iniファイルのアンコメント

アンコメントをする場合は以下のコマンドです。
先ほどの置換前文字列を `()` で囲んでグルーピングします。
()はそれぞれバックスラッシュでエスケープする必要があります。
()にマッチした文字列は、`\1`で表現可能です。
なお、複数の括弧がある場合は、\2,\3・・・のように表現が可能です。

```
$ sed -i 's/;\(.*192.168.56.102\)/\1/g' conf.ini
```

# sedの基本正規表現と拡張正規表現

sedには `基本正規表現` と `拡張正規表現`があります。
何もオプションを指定しなければ基本となり、 `-r` オプションを付けると拡張となります。

拡張正規表現は書き方が少し変わり、場合によっては基本正規表現よりも簡潔に書くことが出来ます。
アンコメントを拡張正規表現で行うと、以下のようになります。
括弧の前のバックスラッシュによるエスケープが不要となります。

```
sed -i -r 's/;(.*192.168.56.102)/\1/g' conf.ini
```
C++ TMPでズンドコ関数

若干今更感があるけれど噂のズンドコ関数をTMPで実装してみた


###コード
```cpp
#include<cstdint>
#include<type_traits>
#include<iostream>

template<std::uint32_t n>
struct seed_impl
{
    static const std::uint32_t value = (__TIME__ __DATE__)[n] + seed_impl<n-1>::value;
};
template<>
struct seed_impl<0>
{
    static const std::uint32_t value = (__TIME__ __DATE__)[0];
};
using seed= std::integral_constant<std::uint32_t, seed_impl<sizeof(__TIME__ __DATE__)-2>::value>;

template<std::uint32_t n>
class xorshift
{
    static const std::uint32_t a = n ^ (n << 13);
    static const std::uint32_t b = a ^ (a >> 17);
public:
    static const std::uint32_t value = b ^ (b << 5);
    using next = xorshift<value>;
};
void print(){}
template<class H,class ...T>
void print(H h,T...t)
{
    print(t...);
    if(h)
        std::cout<<"ズン";
    else
        std::cout<<"ドコ";
}

template<class R,class...T>
void zundoko(R,std::false_type ,std::true_type,std::true_type,std::true_type,std::true_type,T...x)
{
    print(std::false_type{}, std::true_type{},std::true_type{},std::true_type{},std::true_type{},x...);
    std::cout<<"キヨシ";
}
template<class R,class...T>
void zundoko(R,T...x)
{
    zundoko(typename R::next{}, std::integral_constant<bool, R::value % 2>{},x...);
}
#include<iostream>
int main()
{
    zundoko(xorshift<seed::value>{});
}

```

###結果

```bash
Start
ズンズンドコドコドコズンズンドコドコドコズンドコドコドコドコズンドコドコドコズンズンズンドコズンズンズンズンズンズンドコキヨシ
0
Finish

```


http://melpon.org/wandbox/permlink/gRhEhqEhfIe8D3x0