OmniAICreator/Qiita-1.07M huggingface dataset:
sshログインができるcentos7イメージを作った


いろいろハマったのでメモ。
ハマりポイントが多すぎて調べきれてないので、一旦成功したDockerfileを書いておく。

```ruby:Dockerfile
FROM tukiyo3/centos7-ja-systemd

# 必要に応じ
RUN yum -y install systemd-libs-208-11.el7_0.4 systemd-sysv-208-11.el7_0.4
# systemdがupdateされてerrorが発生するためらしい。`
RUN echo 'exclude=systemd*' >> /etc/yum.conf
RUN yum -y update

# install package
RUN yum -y install passwd openssh openssh-server openssh-clients sudo rsync git vim && \

# Create user
    useradd docker && \
    passwd -f -u docker && \

# Set up SSH
    mkdir -p /home/docker/.ssh; chown docker /home/docker/.ssh; chmod 700 /home/docker/.ssh && \
    echo "公開鍵" > /home/docker/.ssh/authorized_keys && \
    chown docker /home/docker/.ssh/authorized_keys && \
    chmod 600 /home/docker/.ssh/authorized_keys && \

# setup sudoers
    echo "docker ALL=(ALL) ALL" >> /etc/sudoers.d/docker && \

# Set up SSHD config

    sed -ri 's/#PermitRootLogin yes/PermitRootLogin yes/g' /etc/ssh/sshd_config && \
    sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config && \
    sed -ri 's/#UsePAM no/UsePAM no/g' /etc/ssh/sshd_config && \
    # PAMを利用するときには下記をオフにしないとSSHログインできない
    # Centos7からPAMをオフにするのが推奨されてないので、下記設定は必須？
    sed -i -e 's/^\(session.*pam_loginuid.so\)/#\1/g' /etc/pam.d/sshd

```

すでに回避されている方がいたのでそれを丸パクリして、あとはsshdできるようにもろもろ設定してこのような形になりました。もう少し細かい部分まで調べておきたいですね。

# 参考
- [vagrant - Dockerfileから、centos7のサービスを起動したい - スタック・オーバーフロー] (http://ja.stackoverflow.com/questions/5544/dockerfile%E3%81%8B%E3%82%89-centos7%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%9F%E3%81%84)

- [CentOS7 + systemd + Docker でインフラCIをやっていく - Qiita] (http://qiita.com/udzura/items/fa93f262bbe036a1413e)

- [CentOS 7のDockerコンテナ内でsystemdを使ってサービスを起動する - Qiita] (http://qiita.com/yunano/items/9637ee21a71eba197345)

- [CentOS7 の OpenSSH — togakushi.bitbucket.org 0.1 documentation] (http://togakushi.bitbucket.org/build/html/centos7_sshd.html)
【iOS】NSDataがJSONかどうか判定する方法

NSDataがJSONかどうか判定する方法

とあるAPIを叩いた際に、JSONか画像のどちらかが返ってくるという状態で、NSDataがJSONかどうかを判定する必要があり、if([NSJSONSerialization isValidJSONObject:data]){ としてもうまくいきませんでしたが、JSONObjectWithDataを利用することで判定できました。

```objc:isjson.m
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data
                                          options:NSJSONReadingMutableContainers
                                          error:nil];
if(json != nil) {
     // json
}else{
     // not json
}
```

参考：StackOverflow
http://stackoverflow.com/questions/17149868/isvalidjsonobject-not-working-as-expected
フィーチャーフォンで2段階認証を快適にする

# 概要

2段階認証といえば、スマートフォンやSMSが有名ですが、フィーチャーフォンでも2段階認証アプリを利用できます。
個人の携帯電話はスマートフォンでも、会社支給の携帯電話はフィーチャーフォンだというケースはよくあるのではないでしょうか。
セキュリティポリシーなどで、個人携帯に2段階認証設定を入れることを許可されていない場合、 [WinAuth](https://winauth.com/) のようなデスクトップ型のジェネレータを使ったりする場合が多いのかもしれません。
でも、物理的に別のデバイスを利用可能なのであれば、利用するに越したことはありませんね。

# 成り行き

以下のサイトを参考にさせていただきました。

* [Googleの2段階認証プロセスの確認コードをフィーチャーフォン（ガラケー）から振り出す方法](http://d.hatena.ne.jp/tmatsuu/comment/20111210/1323481495)

[gauthj2me](https://code.google.com/p/gauthj2me/) は、シンプルなシングルプロファイル型ジェネレータです。複数サイトのトークンを生成したい用途には使えませんでした。

[lwuitgauthj2me](https://code.google.com/p/lwuitgauthj2me/) はマルチプロファイル対応ですが、 WX12K ではうまく動作しませんでした。

最終的に、 [totp-me](http://totpme.sourceforge.net/) が最善の選択肢であるとわかりました。

# でも...

gauthj2me, lwuitgauthj2me, totp-me いずれも、 secret を手で入力する必要がありました。
できないではない（secret を QR 生成して読み込んでコピーアンドペーストするなど）のですが、やっぱり二段階認証生成用 QR コードを読み込んで、コピーアンドペーストできたほうが便利です。

ということで、 totp-me を [カスタマイズしました](https://github.com/comutt/totp-me/tree/add_otpauth_uri) 。

# カスタマイズ版インストール方法

J2ME 対応デバイスにて、 http://comutt.github.io/totp-me/ の QR コードを読み取ってダウンロード・インストールしてください。

# 画面キャプチャ
![totpme-01.png](https://qiita-image-store.s3.amazonaws.com/0/29654/e585832c-ead7-8ffc-58d1-35ef2848e6e9.png) ![totpme-02.png](https://qiita-image-store.s3.amazonaws.com/0/29654/e0661b54-a025-07d6-be23-d6bf804d1356.png) ![totpme-03.png](https://qiita-image-store.s3.amazonaws.com/0/29654/4b95858f-1a17-dab5-adff-284e8a40cac5.png) ![totpme-04.png](https://qiita-image-store.s3.amazonaws.com/0/29654/054976f9-4cd5-3641-41b6-18766e70da7b.png) ![totpme-05.png](https://qiita-image-store.s3.amazonaws.com/0/29654/9af2944f-b18c-a3bb-b1e7-778a726a686d.png) ![totpme-06.png](https://qiita-image-store.s3.amazonaws.com/0/29654/162da948-0d7e-d7ea-56dc-408189456bd2.png)
実行中のモードを判定する

```scala
object Global extends GlobalSettings {

  override def onStart(app: Application): Unit = {
    Logger.info("Application has started")
    app.mode.toString match {
      case "Prod" => Logger.info("Prod mode.")
      case "Dev" => Logger.info("Dev mode.")
      case "Test" => Logger.info("Test mode.")
      case _ => Logger.info("unknown mode.")
    }
  }

  override def onStop(app: Application): Unit ={
    Logger.info("Application shutdown ...")
  }
}
```

ご指摘を頂いたので下記のように修正。（`case _`の部分がもっと省力できる？）

```scala
object Global extends GlobalSettings {

  override def onStart(app: Application): Unit = {
    Logger.info("Application has started")
    match {
      case _ if isProd(app) => Logger.info("Prod mode.")
      case _ if isDev(app) => Logger.info("Dev mode.")
      case _ if isTest(app) => Logger.info("Test mode.")
      case _ => Logger.info("unknown mode")
    }
  }
  override def onStop(app: Application): Unit ={
    Logger.info("Application shutdown ...")
  }
}
```



参考

* http://www.atmarkit.co.jp/ait/articles/1312/18/news031.html
Play Framework のモジュールで単体で使えるやつ

play-json (参考： http://qiita.com/daneko0123/items/1f19f83b943cfd3b8829 ) のように単体で使えるモジュールの一覧ってまとまってないのかなって思ったらないっぽくてtypesafeのリポジトリを見るしかないっぽい
http://repo.typesafe.com/typesafe/releases/com/typesafe/play/
loopback-passportを使う時に「The model type must be a constructor」が出た話

Node.js loopback-passport (loopback-component-passport) を使おうとして、下記のようなエラーがでた。

```
assert.js:93
  throw new assert.AssertionError({
        ^
AssertionError: The model type must be a constructor
    at Function.registry.getModelByType (***/node_modules/loopback/lib/registry.js:286:3)
    at PassportConfigurator.setupModels (***/node_modules/loopback-component-passport/lib/passport-configurator.js:32:50)
    at Object.<anonymous> (***/server/server.js:26:22)   
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:929:3
```

そもそも、loopback-passportには[loopback-example-passport](https://github.com/strongloop/loopback-example-passport)として使用例が用意されていて、当然試しました。
上記のエラーは改めて自分で作ってみようとした時に起きたエラーです。

Node.jsのことを十分に理解していない状態で触っているので、これがのせいじゃないのという気もしていますが。。。

エラーメッセージでググると、loopback-example-passportのissuesで下記のようなのも引っかかります。
Node.jsのお作法を知っていれば、sourcesに設定するものが足りないというパターンが多いのではないでしょうか。。
https://github.com/strongloop/loopback-example-passport/issues/25

自分の場合はこのパターンではなく、**Node.jsのお作法の問題**でした。
結論からいうと、下記を欠いていただけ。

```server.js

var loopback = require('loopback');
var boot = require('loopback-boot');
var app = module.exports = loopback();

// Passport configurator                                                                              
var loopbackPassport = require('loopback-component-passport');
var PassportConfigurator = loopbackPassport.PassportConfigurator;
var passportConfigurator = new PassportConfigurator(app);

...

//忘れてたのはこれ↓
boot(app, __dirname);

...

//Initialize passport                                                                                 
passportConfigurator.init();

//エラーが出てるのはここ↓
passportConfigurator.setupModels({
    userModel: app.models.user,
    userIdentityModel: app.models.userIdentity,
    userCredentialModel: app.models.userCredential
});
```

Node.js 1.x系では、```app.boot(__dirname)```としていた部分。
2.x系からはプロジェクト別れたようです。
Loopbackの初期化(initialize/bootstrap)をする仕事をしてくれています。

ちなみに、```__dirname``` は、nodeを起動する時のcurrentを指しているところを取得します。(docは[こちら](https://nodejs.org/docs/latest/api/globals.html#globals_dirname))

source設定を有効にするにも、これが必要だった、ということでしょうか。

ちなみに、Third-party loginの説明として、[ここ](http://docs.strongloop.com/pages/releaseview.action?pageId=3836277
)には1.x系の説明で書いてあります。
サンプルを2.x系で実行すると、こんな形でエラー出ました。
（まんま、メッセージに書いてある。親切ですねー。）

```
***/node_modules/loopback/lib/application.js:360
  throw new Error(
        ^
Error: `app.boot` was removed, use the new module loopback-boot instead
    at EventEmitter.app.boot (***/node_modules/loopback/lib/application.js:360:9)
    at Object.<anonymous> (***/server/server.js:22:5)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:929:3
```
latexのbeamerスタイルを使うと数式のレイアウトが変になる


プレゼンの資料をbeamerを使って作るときに、数式（特にΣ）のレイアウトが若干期待と違うように表示される。

```
$\sum_{s\in S}x_s$
```

としたときに、`s\in S`の部分はΣの真下にきて欲しいのですが、普通の下付文字（Σの右下部分）に表示されてしまいます。
これをΣの真下に設定するために

```
$\displaystyle \sum_{s\in S}x_s$
```

としてあげると、期待通りに表示してくれます。
ついでに

```
\usefonttheme{professionalfonts}
```
を指定してあげるとフォントも変わるらしいです。
第11回 クラウドごった煮（コンテナ勉強会）に参加してきました。


久し振りにこういった勉強会に参加してきました。

クラウド・仮想化界隈のソフトウェアが増えてきて、
何が何やらって感じだったので キーワードをまとめて置きたいと思います。

#####Docker
今回の主題 Docker LXC Linuxコンテナと呼ばれるシステムを使っている

Dockerファイル…イメージの作成手順が記載されている
DockerファイルからDockerイメージを作成
DockerHubにPushしたりできる

VirtualMachine のVMDK 仮想ディスクを作ると
データ容量が大きい
コンテナだとイメージが小さくできる

docker pull すると
DockerFileとDockeImage の差分をLocalに適用して動かせる

Device Mpper Thin-Provisioning (Dm-thin)
Dockerイメージの内部構造はデータ用デバイスの上に論理デバイスをかぶせて読み書きしている

中身はディレクトリツリーがアーカイブされている様子。

VMDKとかと一緒のような気もするが。
スナップショットを取るように変更の差分を記録し、
その差分をすでにローカルに持っていれば使うという方法で、
イメージファイルの容量を小さくできる様子。

ローカルにベースとなるOSのDockerイメージが無ければ、
全部取ってくる事になるからダウンロード容量は減らない。
と思われる。

#####今後知りたいこと
ただ元がコンテナなのでホストのOSと共有している部分があるのか、ないのか気になる。

DockerFileで定義できるものは何か？
パッケージの情報？
ネットワークの情報？

参考資料：
http://www.slideshare.net/enakai/docker-43975886
http://www.slideshare.net/enakai/docker-is-not-container-dockerpaas



#####デモとかで気になったコマンド
watchコマンド
losetupコマンド


######Atomic Host
RedHatが作ったDockerに適したディストリビューション

Docker以外の機能・ソフトが入らない
yumがない


######Kubernetes
Dockerコンテナを複数管理できる

サービスを2つ起動してやると、
勝手にロードバランスしてくれる。

RedHatのOpenShiftV3は中身にKubernetesを使っている


######マイクロサービス
ファンクションごとにサービス・機能を切り分けて
コンテナごとに動かすようなことをしていれば
影響範囲を小さく限定的にできる考え方

######C4SA
ニフティのPAAS

######tutum
コンテナ事業者

######IBM Containers
BlueMix

IBMとDockerが提携
IBMがDockerを使って提供する

IBM BluemixというPaaS

IBMがIaaSのベンダーSoftLayerという会社を買収した

Docker Imageのプライベートリポジトリが提供される
Dockerの実行環境が提供される

現在ベータ版なので無料で使える枠がある

######GoogleContainerEngine
GCEだとGoogleComputeEngineになってしまうため、
GKEと呼ばれるらしい

アルファ版
マネージドKubernetes

######Docker Machine
Machine Swarm Compose Orchestration

Docker MachineはDockerの実行環境を自動で作成できるツール

実行環境を作る先は豊富
AmazonEC2 デジタルオーシャン GoogleComputeEngine などなど


######Docker Mesosとは
Apache Aurora は Mesosのフレームワークの一つ
ジョブスケジューラ

######Dockerネットワーキング
Dockerは単体のPCの中で動作する分には、
コンテナ同士の通信に困ることはないが、
複数のサーバやクラウドサービス上で動作している場合、
違うサーバ上のコンテナ間で通信させようとすると、
途端に難しくなる。
それを解消するためのツール群が出てきている、ということみたい。
flannel
weave
Socket

OpenVNet
株式会社あくしゅさんが開発している
ネットワーク仮想化ソフトウェア
wakame-vdc からスピンアウト

商用だとVMware NSX

VDC


######RancherIO
Dockerホストの管理
コンテナ操作
オーバレイネットワークの提供
ホスト・コンテナのリソース監視
プライベートリポジトリの作成
プロジェクト管理
アクセス制御
Githubアカウントによる制御
Unity iOS / AndroidでMovieTextureを使う

# Unity5.0はiOS, Android向けのMovieTextureをサポートしていない

[Unity - マニュアル: ムービー テクスチャ](http://docs.unity3d.com/ja/current/Manual/class-MovieTexture.html)

> Movie Texturesは,iOS上ではサポートされません。
> Movie Texturesは,Android上ではサポートされません。

まじか


# [Easy Movie Texture For Android (Video Texture) - Asset Store](https://www.assetstore.unity3d.com/jp/#!/content/10032)

サードパーティ製だがこのAssetが良い。$35
iOSはβ版扱いだがUnity Pro 5.0.1f1でAndroid, iOS両方に書き出せてどちらも実機で動いた。
エラーメッセージを読んでも直し方のわからないコンパイルエラーは↓のひとつを除いて出なかったと思う。
・Build Settings -> iOS -> Player Settings -> Other Settings -> Graphics API でMetalやAutomaticを選択しているとXcodeでビルドする際にエラーが出る


# 使えなかった / 使わなかったMovieTexture互換Asset

（値段、最終更新月）
・[Asset Store - Mobile Movie Texture](https://www.assetstore.unity3d.com/jp/#!/content/2449)
　$75, 2015/1, デモ有

・[prime[31] - Unity plugin documentation](https://prime31.com/docs#iosLiveTexture)
　$70, 2015/1

・[Asset Store - iPlayer](https://www.assetstore.unity3d.com/jp/#!/content/8002)
　$30, 2013/4

・[hayaq/GLMovieTexture](https://github.com/hayaq/GLMovieTexture)
　無料, 2013/1 

## [Mobile Movie Texture](https://www.assetstore.unity3d.com/jp/#!/content/2449)

UnityEditor上では普通に動く
動画はOgg Theora形式でないといけないのでMP4をここで変換 [Converting your file](http://www.online-convert.com/result/b2bd11f447312efd31c264741d521ee9)
iOS向けにビルドする際に"Plugins colliding with each other"エラーが出たのでAssets/Plugins/x86を削除（x86とx86_64フォルダの中身が被ってた中身が被ってた）
[フォーラム](http://forum.unity3d.com/threads/mobile-movie-texture.115885/)を見るとUnity5.0では動いていない
→ Unity Pro 4.6.3f1 でExampleシーンを、Build Settings -> Player Settings -> Other Settings -> Graphics API をAutomaticからOpenGL ES 3.0にしたところiPhoneで動作した。しかし解像度を低くしないとかなりフレームレートが落ちる。フレームレート下がるのはMobileMovieTextureの部分のみなのでスペック不足が直接の原因ではない？

自作の動画を入れたときにiPhone上での再生が止まった
```WARNING: no native support for texture format 5, converting to 4!```
→ これはMovieTextureサンプルの動画でもでて、その動画は実機で再生できるので原因ではなさそう
　→ Diveを外したら出なくなったのでおそらくそれ系
　→ 

# memo

[Movie texture in Unity - Metaio Helpdesk](http://helpdesk.metaio.com/questions/18865/movie-texture-in-unity)
MetaioのUnity SDKにMovieTexture相当の機能が入っているらしいがどこから入手できるのか不明。
[Metaio SDK](http://www.metaio.com/products/sdk/)には入っていなかった

Vuforiaに入っているという情報がある
[Video Texture and Android GearVR | Unity Community](http://forum.unity3d.com/threads/video-texture-and-android-gearvr.282295/)
サンプルプロジェクトのリンクが途切れていたのでこちらからダウンロード [Vuforia Developer Portal](https://developer.vuforia.com//downloads/samples?t=vwsapi-4822302-1803-2383)
※MovieTexture入っているとされるサンプルがない

[Unity でiOS向けビルドをする際にLinkerエラー - 備忘録](http://d.hatena.ne.jp/xlis/20140109/1389274736)
Xcodeでゴチャゴチャになったimportの順番を一発で整理する


* 別の画面へ飛ぶためにViewControllerのimportを追加
* 外部の便利フレームワークを使うためにimportを追加
* コード上でUIを記述するためにimportを追加
* 内製のオレオレライブラリを使うためにimportを追加

このように、Objective-Cでimportをずらずらと追加していくと、下の画像のような状態になってしまうことがないでしょうか。

![スクリーンショット 2015-03-29 10.05.29.png](https://qiita-image-store.s3.amazonaws.com/0/36593/aa7b5a19-109d-bbeb-a316-e6bcd1deead4.png "スクリーンショット 2015-03-29 10.05.29.png")

この煩わしさをなくすため、Xcodeでimportの順番を自動で整理してくれるプラグインを作ってみました。その名もImportSorterです。

### ImportSorter

リポジトリ：[manji602/ImportSorter](https://github.com/manji602/ImportSorter)

#### インストール方法

上記のリポジトリをcloneしてプロジェクトをビルドするか、以下のワンライナーを実行してください。

```
$ curl -fsSL http://github.com/manji602/ImportSorter/raw/master/Scripts/install.sh | sh
```

#### 使い方

`ctrl+s`を押すか、メニューから`Edit->Import Sorter->Sort Import On Current File`をクリックしてください。

先ほどのimportは、このように綺麗に並び替えることが出来ます。

![スクリーンショット 2015-03-29 10.10.25.png](https://qiita-image-store.s3.amazonaws.com/0/36593/db9d7fa1-f0d5-8af4-d539-f03bb046b178.png "スクリーンショット 2015-03-29 10.10.25.png")

#### Roleについて

ImportSorterでは、Roleという概念を利用してimportされたファイルを区別し、そのRole毎にアルファベット順にソートします。

デフォルトでは、上の画像のように

* 自分自身のヘッダ
* フレームワークのヘッダ(`<>`で閉じられたヘッダ。`// :: Framework ::`以下のヘッダ)
* その他(`// :: Other ::`以下のヘッダ)

の順番で並ぶようになっています。

##### Roleをカスタマイズするには

プロジェクト内の`ObjCClassRole`というmoduleでroleを管理しているので、以下の部分を修正してください。

###### (1) `ObjCClassRole.h`内のenum(`ObjCImportClassRole`)

```objectivec:ObjCClassRole.h

typedef NS_ENUM(NSInteger, ObjCImportClassRole) {
    ObjCImportClassRoleSelf = 0,
    ObjCImportClassRoleFramework,
    ObjCImportClassRoleOther
};

```

ここに必要なRoleを追加してください。

###### (2) `ObjCClassRole.m`内の`getImportClassRole`

import宣言された行が引数として渡ってくるため、どの行をどのRoleにマッチさせたいかはこちらで定義してください。

###### (3) `ObjCClassRole.m`内の`labelForClassRole`

(1)で定義したRoleに付けるLabelを記述してください。Labelを定義する場合はソートのロジックの都合上、`kClassRoleLabelPrefix`で始まるNSStringにしてください。

###### (4) `ObjCClassRole.m`内の`lastImportClassRoleIndex`

(1)で定義したenumの末尾に該当する項目を記述してください。

#### Swiftでも

Swiftでコードを書く場合は、同じプロジェクト内で実装したファイルは自動で読み込まれるため、import宣言を記述する必要のあるファイルは少なくなると思います。

当プラグインはSwiftでのimport順のソートにも対応していますが、Objective-Cほどimportの量が多くなることはあまりないため、roleについては特に設定しておりません。
roleを変更する場合は上述の`ObjCClassRole`に該当する`SwiftClassRole`内の同様の項目を編集してください。

#### 終わりに

保存時(`Command+S`)に自動でソートできないなど、まだまだ機能不足な面もあるので随時アップデートしていく予定です。また、ニーズが多ければAlcatrazに登録するつもりです。バグや機能改善等のPRもお待ちしています…！
CSSやJavascriptを読み込む時httpやhttpsを省略する

最近になってCSSやJavascriptを読み込むときhttpやhttpsを省略できることを知ったので、
メモとして残しておこうと思います。

例えばgoogle mapsのJavascriptを読み込むとき

```html
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
```

のように記述していたのですが、

```html
<script type="text/javascript" src="//maps.google.com/maps/api/js?sensor=false"></script>
```

このようにhttpやhttpsを省略した形で記述できる。
省略した場合はhttpのページはhttpになるしhttpsのページならhttpsになります。
これは便利だと個人的には思います。
デメリットとかあるのだろうか
Outlookデータのインデックス再構築

メールの整理(削除や移動)を大量にすると、outlookのインデックスがうまく効かなくなる場合があります。
しかし、outlookのメニューをいくら見てもインデックスの再構成のメニューはありません。
→実はOS側にインデックスの再構成画面があります。
ということで、インデックスの再構築方法を紹介します。

## インデックス再構築手順
1.「コントロールパネル」を開く
2.「システムとセキュリティ」の項目の下にある「コンピューターの状態を確認」を選択
![control_panel.png](https://qiita-image-store.s3.amazonaws.com/0/53476/edc4ab6e-db00-5a7e-4ffc-8be32e6002c6.png)
3.左の縦に並んでいる「パフォーマンス情報の表示」を選択
![コンピューターの状態を確認.png](https://qiita-image-store.s3.amazonaws.com/0/53476/3bbe77fa-f189-1b16-c60e-17856dc2152f.png)
4.左の縦に並んでいる「インデックスのオプションの調整」を選択
![パフォーマンス情報の表示.png](https://qiita-image-store.s3.amazonaws.com/0/53476/50887db5-6ac5-3d4d-49e5-c3eeed5c4cbf.png)
5.「インデックスのオプション」が表示されるので、その中のOutlookを選択
![Outlook.png](https://qiita-image-store.s3.amazonaws.com/0/53476/a1213936-3aaf-8ca6-ab5f-a86b189d6dec.png)
6.「詳細設定」ボタンを押し、詳細オプションの画面で、「再構築」ボタンを押す
![再構築.png](https://qiita-image-store.s3.amazonaws.com/0/53476/d90e9662-a859-3eba-f188-fe86f8ea3c87.png)


件数が多いとインデックス再構築時間が結構かかります。
CakePHP3 試してみました

先日リリースされたばかりのCakePHP3を触ってみるついでに簡単なシステムを作ってみました。
dev版のときにも一回触ったのですがそのときはbakeしただけなので今回は少しソース触ってみたいと思います。
試作品は[GitHub](https://github.com/ishigetani/Novels)で公開されています。


# 全体的な印象
ファイルの位置やら命名規則が変わったのは置いておいて、関数自体の変更とかはあまり気にならなかった。
Cake2系ではこう書けばよかったからこうだろ！…ってのは９割方そのまま使えました。この分だと移行はそんなに難しくないかも？

# 技術的な覚書
実装中にわかった・気付いたことの羅列

## PHPタグ
bakeして出されるタグが短縮系になっている。これに合わせたほうがいいのかな
```
<?= ?>
```

## 定数などの位置
debugのOn/OffやDB情報などのCake設定はapp.js
たぶんアプリケーション固有の定数とかはbootstrap.phpに書けばすっきりする。

## Migration
Migrationがデフォルトでついてくる。ただし、まだ使いこなせてません。
```
php cake.php Migrations 
```

## 対象カラム
bake後にDBにカラムを追加したときに発見。
ModelのEntityに保存対象にするカラム一覧を更新しないといけない。
```
/**
* Fields that can be mass assigned using newEntity() or patchEntity().
*
* @var array
*/
protected $_accessible = [
    'sentence' => true,
    'sort' => true,
    'novel_id' => true,
    'novel' => true,
    'title' => true, // 後から追加
];
```

## Controller関数・変数
Cake2系と同じ使い方でいける関変数
* $this->layout
* $this->loadModel()

## Paginator
Classを指定できなくなったやつがある？
```
// $this->Paginator->prev('< ' . __('previous'), ['class' => ['previous']], null, ['class' => ['previous']]) // 2系だとこんな感じ
$this->Paginator->prev('< ' . __('previous'))
```
Rails じゃない project  の rake で activerecord を使う。

# Rails じゃない project  の rake で activerecord を使う。 

rails だと rake に db:drop, db:create, db:migrate などのタスクが実行できます。  
Rails を使っていない project で 同様のタスクを定義してみました。    
See [https://github.com/katoy/using_ar](https://github.com/katoy/using_ar)

Database も 2 つ扱ってみています。  
  
　　Database: db1_development
　　　　table: users
　　Database: db2_development
　　　　table: infos
のような DB / table を
　　create、migrate、fixuter 読み込み、table 内容の表示
するタスクを定義しました。  

    $ rake -T dbs
    rake dbs:create      # create database "db1_{AR_ENV}", "db2_#{AR_ENV}"
    rake dbs:create_db1  # create database "db1_{AR_ENV}"
    rake dbs:create_db2  # create database "db2_{AR_ENV}"
    rake dbs:drop        # drop all table in database "db1_{AR_ENV}, db2_{AR_ENV}"
    rake dbs:drop_db1    # drop all table in database "db1_{AR_ENV}
    rake dbs:drop_db2    # drop all table in database "db2_{AR_ENV}
    rake dbs:fixtures    # Load fixtures into "db1_#{AR_ENV}, db2_#{AR_ENV}",  Load specific fixtures using FIXTURES=x,y
    rake dbs:migrate     # Migrate the database through scripts in db/migrate, Target specific version with VERSION=x
    rake dbs:reset       # Reset db1, db2 (drop, create, migrate, fixtures)
    rake dbs:show        # Show db1_#{AR_ENV}
    rake dbs:show_db2    # Show db2_#{AR_ENV}

ファイル構成

    ├── Gemfile
    ├── Gemfile.lock
    ├── Rakefile
    ├── config
    │   └── database.yml
    ├── db
    │   └── migrate
    │       ├── db1
    │       │   └── 20150322042600_create_users.rb
    │       └── db2
    │           └── 20150322043000_create_infos.rb
    ├── log
    └── test
        └── fixtures
            ├── db1
            │   └── users.yml
            └── db2
                └── infos.yml

Rails の db 関係のフォルダ構成を真似してます。  
config/database.yml は Rails と同じ設定内容です。  
RAILS_ENV の代わりに AR_ENV をつかって  環境 (productio/development/test) を切り替えられます。  
password などは <%= ENV('AR_PASSWORD') %> と書いておくことができます。  
(rake を実行する前に export AR_PASSOWRD="xxxx" のように設定しておきます)  

db/migrateion には、 Database 毎に Folder を分けて置いています。  
test/fixtures にも、 Database 毎に Folder を分けて置いています。
CapybaraでSeleniumとヘッドレスブラウザの切り替えを簡単にするコード

# 概要

ブラウザの自動操作でヘッドレスならデバッグが大変だし、
Seleniumからブラウザを操作すると遅いって方のために、
Capybaraを使っていたら開発時Selenium、使用時ヘッドレスに変更しやすいですよってお伝えするためのコードを書きました。
コードを見てどこを書き変えるのか確認していただければと思います。

# 仕様

コマンドラインの実行時に指定したドライバでCapybaraを使う。
使えるオプションは以下。

* selenium
* webkit
* poltergeist
* selenium_firefox
* selenium_chrome

# 使い方
driverとして与えた引数のドライバで動作する。

```sh
$ ruby capybara-drivers.rb --driver webkit
```

# 実装

```rb:capyabra-drivers.rb
#! /uer/bin/env ruby

require 'capybara'
require 'selenium-webdriver'
require 'capybara-webkit'
require 'capybara/poltergeist'

require 'optparse'

opt = OptionParser.new
OPTS = {}
opt.on('--driver ',
       ['selenium','webkit','poltergeist','selenium_firefox','selenium_chrome'],
       'selenium | webkit | poltergeist | selenium_firefox | selenium_chrome') {|v| OPTS[:driver] = v }
opt.parse(ARGV)

browser = nil
case OPTS[:driver]
when 'selenium' then
  browser = Capybara::Session.new(:selenium)

when 'webkit' then
  browser = Capybara::Session.new(:webkit)

when 'poltergeist' then
  browser = Capybara::Session.new(:poltergeist)

when 'selenium_firefox' then
  Capybara.register_driver :selenium_firefox do |app|
    Capybara::Selenium::Driver.new(app, :browser => :firefox)
  end
  browser = Capybara::Session.new(:selenium_firefox)

when 'selenium_chrome' then
  Capybara.register_driver :selenium_chrome do |app|
    Capybara::Selenium::Driver.new(app, :browser => :chrome)
  end
  browser = Capybara::Session.new(:selenium_chrome)

else
  browser = Capybara::Session.new(:selenium)
end

browser.visit 'http://qiita.com/'
browser.save_screenshot 'screenshot.png'
```

```rb:Gemfile
source 'https://rubygems.org'
 
gem 'capybara'
gem 'selenium-webdriver'
gem 'capybara-webkit'
gem 'poltergeist'
```

# あとがき

コードってここを書き変えるだけで簡単に動くんですよって言われても導入が面倒だって言われそう。
導入には触れずに動作させるためのコードだけ書きました。

# ライセンス

こちらのコードはMITライセンスです。
JavaScriptでAND/OR/NOT条件を使ったテキスト検索

# 実行サンプル

```js
var condition = [
  ['dog', 'fox', '-cow'],
  ['cat'],
  ['pig'],
]; // 意味は (dog AND fox AND !cow) OR cat OR pig

var matcher = compile(condition);

matcher.test("The quick brown fox jumps over the lazy dog.")); // true
```

# compile関数の中身

```js
function compile(cond) {
  var joinAnd = function (arr) { return '^(?=[\\s\\S]*' + arr.join(')(?=[\\s\\S]*') + ')'; };
  var joinOr  = function (arr) { return '(?:' + arr.join('|') + ')'; };
  var escape  = function (str) { return str.replace(/(?=[(){}\[\].*\\^$?])/, '\\'); };
  var rx = joinOr(cond.map(function(inner) { return joinAnd(inner.map(escape)) }));
  rx = rx.replace(/=\[\\s\\S\]\*-/g, '![\\s\\S]*');
  return new RegExp(rx);
}
```

# 解説・補足

* 基本的に以下のような意味の正規表現を作ってるだけです。

```js
/(^(?=.*dog)(?=.*fox)(?!.*cow)|cat|pig)/
```

* `(?=)` で先読みしているためAND条件部分はどれが先に来てもマッチできます。
* 先読みの中に `.*` が入っており対象文字列の先頭で1回試行してゼロ幅マッチしてくれれば良いようにしているため `^` を置いています。これを忘れると対象がN文字だった時N倍の時間がかかります。
* 正規表現中の `.` は改行にマッチしないので `[\s\S]` で代替しています。
* 当然ですが行っているescape処理を省けば条件に正規表現が使えます。
* 特定文字の前に「\」を置くだけのエスケープなら先読みを使うことで、キャプチャせず単純なreplaceで表現できます。
* `new RegExp(rx, 'i');` にすれば大文字小文字を無視します。
* 適当にNode.jsでベンチマークをとった所、コンパイル部分のコストを無視しても、ループして地味に `indexOf` する方が倍くらい早かったです。
* これを書いている時にNOT機能を思いついて後付けしています。

# 使い所

コードが少ない割に十分な機能と小回りが効くようにしてあるため、ユーザスクリプトに組み込んで使っています。
こんな感じで、見たくないコメントなどをあぼーんしたりするのに使えます。
（ユーザスクリプトで使う場合エスケープ処理は無くしてしまった方が使いやすそうです）

```js
Array.prototype.slice.call(document.getElementsByClassName('comment'))
    .filter(function(c) { return matcher.test(c.textContent) })
    .map(function(c) { c.className += ' hide'; });
```



逆にGoogle検索で `(A|B) C D` とするように、複数の対象の中から目的のものを探し出すような使い方をする場合、`joinAnd`と`joinOr`の呼び出している部分を交換します。
（恐らくタイトルから連想される動きはこちらだと思います）

```js
  var rx = joinAnd(cond.map(function(inner) { return joinOr(inner.map(escape)) }));
```
今更だけどRails4.2のchangelogを眺めていたら見つけた嬉しいモノ(試してない)

Take label values into account when doing I18n lookups for model attributes.

The following:

```
# form.html.erb
<%= form_for @post do |f| %>
  <%= f.label :type, value: "long" %>
<% end %>

# en.yml
en:
  activerecord:
    attributes:
      post/long: "Long-form Post"
```
Used to simply return "long", but now it will return "Long-form Post".

https://github.com/rails/rails/blob/v4.2.1/actionview/CHANGELOG.md
Vagrantで起動したVMにrootでログインする

# やりたいこと
* rootユーザで公開鍵認証でログインしたい
* `~/.vagrant.d/insecure_key`を使いたい 
* `vagrant ssh`でログインしたい

# 環境
OSX 10.10
Vagrant 1.7.2

# うまくいかなかった設定
```ruby:Vagrantfile
Vagrant.configure(2) do |config|

  config.vm.box = "chef/centos-7.0"
  config.vm.network 'private_network', ip: '192.168.90.10'
  config.cache.scope = :box if Vagrant.has_plugin? 'vagrant-cachier'
  config.ssh.username = 'root'
  config.ssh.password = 'vagrant'
  config.ssh.insert_key = 'false'
end

```

こんな設定を試しました。`ssh.username`を指定するとrootでログインできるのですが、`ssh.insert_key`がデフォルトでtrueなためログインに利用する鍵が指定できませんでした。falseにすると共通の鍵を使うようになりますが、`/root/.ssh/`以下に公開鍵が入っておらず、`/home/vagrant/.ssh`に入っている状態だったためログインができませんでした。

# 最終的に

```ruby:Vagrantfile
Vagrant.configure(2) do |config|

  config.vm.box = "chef/centos-7.0"
  config.vm.network 'private_network', ip: '192.168.90.10'
  config.cache.scope = :box if Vagrant.has_plugin? 'vagrant-cachier'
  config.ssh.username = 'root'
  config.ssh.insert_key = 'false'
  config.vbguest.auto_update = false
  config.vm.provision "shell", inline: <<-SHELL
     sudo cat /home/vagrant/.ssh/authorized_keys >> /root/.ssh/authorized_keys
 SHELL

end

```

`provision`の指定をすることに。初回起動時にパスワード効かれますが、我慢します。。。一度起動したVMに`vagrant ssh`でrootとして入りたいなと思ったことがあったので今回いろいろ試してみました。`ssh.insert_key`をtrueにしてもよいなら起動時にパスワード聞かれることもないと思うので、使えるかもしれないですね。(参考に記載)

初回`vagrant up`時にmountできないエラーが出る時があったので、`config.vbguest.auto_update = false`を追記しました。

# 参考

```ruby:Vagrant

Vagrant.configure(2) do |config|

  config.vm.box = "chef/centos-7.0"
  config.vm.network 'private_network', ip: '192.168.90.10'
  config.cache.scope = :box if Vagrant.has_plugin? 'vagrant-cachier'
  config.ssh.username = 'root'

```
Hyper-V上にWindows7をインストールする

#はじめに#
Windows2012R2のHyper-V上にWindows7やWindows2008R2等のWindows8より前に
リリースされたOSをインストールする場合、いわゆる「世代１」としてインストールする。
この際、Intel 82371AB/EB PCI to ISA bridge 等のいわゆるIDEやPS/2といった
レガシーデバイス周りでエラーが発生する。
![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/73245/eec51f9b-29e5-df1a-ceea-d7feb07703a9.jpeg)

これを解決するためには、導入するOSに応じた統合サービスを適用する。
なお、統合サービスを導入するにはWindows7の場合SP1を適用済でなければならない。
(いわゆるOS準仮想化のためのパッチ？)

#構成#
実験で利用する環境は以下の通り
* CPU Intel Core i5-4590s
* Gigabyte GA-H97N-WIFI (Intel Gigabit Ethernet Controller I217-V)
* Memory PC3-12800 16GB
* HOST OS WindowsServer2012Standard
* GEST OS Windows7 SP1

#適用方法#
1． Hyper-V Connectを起動し、[操作]→[統合サービス セットアップ ディスクの挿入]を選択する。
2. ゲストOSから統合サービスセットアップを起動し、インストールする。
![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/73245/3f81fbd1-8f7e-2980-2e57-b894543e84e9.jpeg)

#参考#
http://www.atmarkit.co.jp/ait/articles/1308/08/news087.html
https://social.technet.microsoft.com/Forums/windowsserver/en-US/cbe1b3c8-cbc1-4df2-90e8-f730a63ce3ba/trouble-getting-virtual-nics-to-appear-in-vm
サイト「ワザノバ」のタイトルに「Go」が付いている記事の一覧

ITビジネスモデル紹介サイト「[ワザノバ](http://wazanova.jp/)」さんが[サイトの更新を終了する](http://wazanova.jp/items/1702)ということで、タイトルに「Go」が付いている記事を集めてみました。

* [Goと大規模分散システムの相性 - ワザノバ | wazanova](http://wazanova.jp/items/1621)
* [Sourcegraph: Goアプリのテスト - ワザノバ | wazanova](http://wazanova.jp/items/1466)
* [Node.js & Go: スタートアップのテクノロジーの選択 - ワザノバ | wazanova](http://wazanova.jp/items/1412)
* [Go TimeとLinuxカーネルの関係 - ワザノバ | wazanova](http://wazanova.jp/items/1147)
* [YouTube & Go言語: MySQLをパワーアップするVitess - ワザノバ | wazanova](http://wazanova.jp/items/1070)
* [[その２] Rubyプログラマー向けのGo言語の解説 - ワザノバ | wazanova](http://wazanova.jp/items/879)
* [[その1] Rubyプログラマー向けのGo言語の解説 - ワザノバ | wazanova](http://wazanova.jp/items/875)
* [Go言語のMapの仕組みをマクロ視点で見てみる - ワザノバ | wazanova](http://wazanova.jp/items/856)
* [RailsとGoのアプリでセッションを共有する - ワザノバ | wazanova](http://wazanova.jp/items/850)
* [Goでのゲーム開発 - ワザノバ | wazanova](http://wazanova.jp/items/1674)
* [Prometheus: Go言語で書かれたモニタリングシステム - ワザノバ | wazanova](http://wazanova.jp/items/1672)
* [Go 1.2 パフォーマンス改善のまとめ - ワザノバ | wazanova](http://wazanova.jp/items/722)
* [CloudFlare: Goで書いた安全にデータをやりとりする仕組み - ワザノバ | wazanova](http://wazanova.jp/items/700)
* [コマンドラインアプリを配布するのにGo言語で書いてみた - ワザノバ | wazanova](http://wazanova.jp/post/67207541956/go)
* [規模の大きい本番システムをGo言語で書き直した感想 - ワザノバ | wazanova](http://wazanova.jp/post/66645562844/go)
* [PythonプログラマがGo言語を使った感想 - ワザノバ | wazanova](http://wazanova.jp/post/66133120187/python-go)
* [D言語とGo言語 - ワザノバ | wazanova](http://wazanova.jp/post/64086105199/d-go)
* [Go : 盛り上がり感 (hype) を実力にすることが重要 - ワザノバ | wazanova.jp](http://wazanova.jp/post/63408341634/go-hype)
* [GoプログラミングでApp Engineアプリのパフォーマンス向上 [Google I/O 2013] - ワザノバ | wazanova](http://wazanova.jp/post/62846680483/go-app-engine-google-i-o-2013)
* [膨大なデータビジュアライゼーションprojectでもGoが使われている [Google I/O 2013] - ワザノバ | wazanova](http://wazanova.jp/post/62846654973/project-go-google-i-o-2013)
* [Goでプロキシサーバをつくってみた [codingcookies.com] - ワザノバ | wazanova](http://wazanova.jp/post/62206690458/go-codingcookies-com)
* [Goプログラミング: Rob Pike and Andrew Gerrand [The Changelog] - ワザノバ | wazanova.jp](http://wazanova.jp/post/61897802099/go-rob-pike-and-andrew-gerrand-the-changelog)
* [Goプログラミング言語がQMLをサポート - ワザノバ | wazanova](http://wazanova.jp/post/61722248930/go-qml)
CentOS7 + nginx + uWSGI + Flask

## nginx インストール

```shell:shell
yum install epel-release
sed -ri 's/^enabled.*=.*1$/enabled = 0/g' /etc/yum.repos.d/epel.repo
yum install nginx --enablerepo=epel
vi /etc/nginx/nginx.conf
```
>
```conf:/etc/nginx/nginx.conf
user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log;
pid        /run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    keepalive_timeout  65;
    index   index.html index.htm;
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80 default_server;
        server_name  localhost;
        root         /usr/share/nginx/html;
        include /etc/nginx/default.d/*.conf;
        location / {
                include uwsgi_params;
                uwsgi_pass unix:/var/lib/nginx/tmp/uwsgi/uwsgi.sock;
        }
        error_page  404              /404.html;
        location = /40x.html {
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
        }
    }
}
```

```shell:shell
systemctl enable nginx.service
systemctl start  nginx.service
systemctl status nginx.service
```

## FLASKインストール

```shell:shell
yum install gcc python-devel
curl https://bootstrap.pypa.io/get-pip.py | python
pip install flask
mkdir -p /var/www/flask/
vi /var/www/flask/index.wsgi
```
>
```py:/var/www/flask/index.wsgi
import sys
from flask import Flask
sys.path.append('/var/www/flask')
application = Flask(__name__)
@application.route('/')
def index():
    return 'HelloWorld'
```

## uWSGIインストール

```shell:shell
yum install pcre-devel openssl-devel zlib-devel
pip install uwsgi
vi /etc/nginx/uwsgi.ini
```
>
```ini:/etc/nginx/uwsgi.ini
#http://uwsgi-docs.readthedocs.org/en/latest/Systemd.html
[uwsgi]
socket      = /var/lib/nginx/tmp/uwsgi/uwsgi.sock
python-path = /var/www/flask
wsgi-file   = /var/www/flask/index.wsgi
uid         = nginx
gid         = nginx
processes   = 4
threads     = 2
stats       = 127.0.0.1:9191
```

```shell:shell
vi /etc/systemd/system/uwsgi.service
```
>
```ini:/etc/systemd/system/uwsgi.service
[Unit]
Description=uWSGI
After=syslog.target
>
[Service]
ExecStart=/bin/uwsgi --ini /etc/nginx/uwsgi.ini
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
>
[Install]
WantedBy=multi-user.target
```

```shell:shell
systemctl enable uwsgi.service
systemctl start  uwsgi.service
systemctl status uwsgi.service
```

## firewalld

```shell:shell
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
```
Rails Tutorial-第7章メモ_part1

就活の予定が色々と忙しくなってきて、思う様に勉強が進まなくて辛い。
今回はGravatarのところで結構ハマった。


##ハマったところ。

###Gravatarが表示されない
リスト7.12　ユーザー表示ビューに名前とGravatarを表示する

```erb:show.html.erb
<% provide(:title, @user.name) %>
<h1>
  <%= gravatar_for @user %>
  <%= @user.name %>
</h1>
```


リスト7.13　gravatar_forヘルパーメソッドの定義

```rb:users_helper.rb
def gravatar_for(user)
    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}"
    image_tag(gravatar_url, alt: user.name, class: "gravatar")
  end
end
```
この部分。

[*Gravatar - グローバルに認識されるアバター*](https://ja.gravatar.com/)

このGravatarなるものを用いて、ユーザーのプロフィール画像を表示できる。

この
``gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}"``

の部分に、ユーザーのメールアドレスを組み込むことで自動的に対応する画像が表示される仕組みらしい。

(私はFPSとか好きなんですが、BFとかでGravatar使ってたんですね。)

そして何にハマっていたかというと、本来はユーザー名の左に表示されるであろうGravatarの画像が表示されない。

ググってみてGravatarの画像(の変更)が反映されない時にすべきこととして、ブラウザのキャッシュの削除があった。

削除。

しかし表示されない。

しばらくにらめっこした結果、原因は``gravatar_url``の部分だった。

``gravatar_url = " https://secure.gravatar.com/avatar/#{gravatar_id} "``

となっていて、自分の普段の癖でダブルクォーテーションの直後に空白を入れてしまっていた。

ここに空白があったせいで、パスが正しく認識されずにトラブっていたようだ。

この空白を消して、

`` gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}" ``

としたら無事に画像が表示された。

今後もこういうミスが目立ってくるんだろうなぁ...
JavaScriptでGETのパラメータをパースしたい(Rails)

正攻法だと、window.location を文字列処理でパース？

でも少し面倒なので、erb でパラメータを埋め込んで渡すという方法を考えた。

```hoge.erb
<script>
var params = $.parseJSON('<%= params.to_json().html_safe %>');
</script>
```

これも気持ち悪いので、もっといい方法が無いかと思ったら、gon という gem があるらしい。
http://qiita.com/mosa_siru/items/e69eee47a183b13cfb62
cloudatcostのクライアントライブラリを作った


# 概要
激安VPSで有名なcloudatcostのAPIが提供されたのでライブラリを作成した

#cloudatcostってなに？
## カナダにある激安VPSサービス
[CloudatCost] (http://www.cloudatcost.com/)
[Twitter ](https://twitter.com/cloudatcost)
[人柱: 激安VPSのcloudatcostを試してみた](http://qiita.com/sharow/items/70d1584752322af812cc)

# API仕様
[ここ読んでね](https://github.com/cloudatcost/api)

## 現在サポートしているAPI
+ リスト一覧取得
+ テンプレート一覧取得
+ タスク一覧取得
+ コンソールへのログイン情報 取得
+ 電源のON/OFF/REBOOT

# 作成したライブラリ
[github](https://github.com/masayukioguni/go-cloudatcost)

# 使い方
## 準備
[ここ読んでね](https://github.com/cloudatcost/api#instructions)

## 環境変数の設定
CLOUDATCOST_API_LOGIN:メールアドレス
CLOUDATCOST_API_KEY:[ここのsettingsで取得できます](https://panel.cloudatcost.com/index.php#)

## サンプル

```
package main

import (
	"fmt"
	"github.com/masayukioguni/go-cloudatcost/cloudatcost"
	"os"
)

func main() {
	Login := os.Getenv("CLOUDATCOST_API_LOGIN")
	Key := os.Getenv("CLOUDATCOST_API_KEY")
	client, _ := cloudatcost.NewClient(&cloudatcost.Option{Login: Login, Key: Key})

	listservers, hr, err := client.ListServersService.ListServers()

	if err != nil {
		fmt.Printf("error: %v\n\n", err)
		return
	}

	if hr.StatusCode != 200 {
		fmt.Printf("http response error: %+v %+v \n\n", hr, err)
		return
	}

	fmt.Printf("%v,%v\n", listservers, err)

}

```

```結果
[{1 1 16 c1116353-29235 xxxxx c90000-689604-110144152-29235 1xxx.xxx.xxx.xxx 255.255.255.0 xxx.xxx.xxx.xxx Cloud-ip-7 c111xxxxx-xxxxx.cloudatcost.com xxxxxxx  12345 xxxxxxx Custom Ubuntu-14.04.1-LTS-64bit 1 23 512 214.355 11 0.804909862 03/20/2015 Powered Off  Safe 1}],<nil>
```

# まとめ
+ APIのレスポンスにrootpassが入るのが怖い…
+ go langは楽しいがこれだったら curl + jq でもよかった…

#TODO
+ readme更新
+ CloudAtCostのAPIが追加されたら対応予定
+ Terraformのプラグインも書く
+ CLIツールも作る
rest apiのモックサーバ、ドキュメント作成ツール

REST APIについてのモックとドキュメント作成ツールのメモ書き。まだ調べただけ。

restとsoapのモックサーバ
https://www.mockable.io/

モックとドキュメントをマークダウンで
http://apiary.io/

モックサーバを自前でつくる
http://www.mock-server.com/

コードからAPIドキュメント生成
http://www.miredot.com/

コードからドキュメント一覧アプリのwar作成
http://apivisualizer.cuubez.com/quick-start.html


http://jsondoc.org/index.html
Laravel5のミドルウェアの使い方

Laravel5のミドルウェアについてちょっと調べてみました。
http://readouble.com/laravel/5/0/0/ja/middleware.html

例えば、職場の偉い人が「WEBサイトの訪問者に挨拶したい」とか言ってきたとします。
要件としては大体こんな感じです。

* WEBサイト上のすべての画面で挨拶したい。
* ちなみに時間帯によって挨拶の文言を変えたい。

ミドルウェアはこういう「**常に何かやりたい**」ってケースで使えば良さそうです。
それでは、上記要件を満たすミドルウェアを作ってみます。

## ミドルウェアの作成
まず、artisanコマンドでミドルウェアを作成します。

```
$ php artisan make:middleware GreetingMiddleware
```

作成された app/Http/Middleware/GreetingMiddleware.php を適当に編集します。

```php:app/Http/Middleware/GreetingMiddleware.php
<?php namespace App\Http\Middleware;

use Closure;
use Config;
use Illuminate\Contracts\View\Factory as ViewFactory;
use Carbon\Carbon;

class GreetingMiddleware {

	/**
	 * Create a new instance.
	 *
	 * @param  \Illuminate\Contracts\View\Factory  $view
	 * @return void
	 */
	public function __construct(ViewFactory $view)
	{
		$this->view = $view;
	}

	/**
	 * Handle an incoming request.
	 *
	 * @param  \Illuminate\Http\Request  $request
	 * @param  \Closure  $next
	 * @return mixed
	 */
	public function handle($request, Closure $next)
	{
		$timestamp = $request->server('REQUEST_TIME');
		$hour = Carbon::createFromTimeStamp($timestamp, Config::get('app.timezone'))->hour;

		$message = 'こんばんは';
		if (in_array($hour, range(5, 9)))
		{
			$message = 'おはよう';
		}
		else if (in_array($hour, range(10, 17)))
		{
			$message = 'こんにちは';
		}
		$this->view->share('greetingMessage', $message);

		return $next($request);
	}
}
```

## ミドルウェアの登録

全てのリクエストで上記ミドルウェアを実行したいので、グローバルミドルウェアとして登録します。

```php:app/Http/Kernel.php
protected $middleware = [
    ....
    
    'App\Http\Middleware\GreetingMiddleware', // <= 追記する
    ];

```

## テンプレートファイルの編集

続いて、挨拶を表示すべくテンプレートファイルを編集します。
今回は、resources/views/app.blade.phpのヘッダー付近に書いてみます。

```php:resources/views/app.blade.php
<span>
{{ $greetingMessage }}
@if (Auth::guest())
    ゲストさん
@else
    {{ Auth::user()->name }}さん
@endif
</span>
```

これでWEBブラウザから確認すると、「こんにちは XXXさん」のように表示されるようになりました。


## ミドルウェアのテスト

最後に、テストがないと同僚がプルリクエストを受け付けてくれないので、ユニットテストを書きます。

```php:tests/Http/Middleware/GreetingMiddlewareTest.php
<?php
use App\Http\Middleware\GreetingMiddleware;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\ServerBag;

class GreetingMiddlewareTest extends TestCase {

	public function setUp()
	{
		parent::setUp();
		$this->view = app('view');
		$this->middleware = new GreetingMiddleware($this->view);
		$this->request = new Request();
	}

	public function handleDataProvider()
	{
		return [
			['2015-03-27 05:00:00', 'おはよう'],
			['2015-03-27 09:59:59', 'おはよう'],
			['2015-03-27 10:00:00', 'こんにちは'],
			['2015-03-27 17:59:59', 'こんにちは'],
			['2015-03-27 18:00:00', 'こんばんは'],
			['2015-03-28 04:59:59', 'こんばんは'],
		];
	}

	/**
	 * @dataProvider handleDataProvider
	 */
	public function testHandle($datetime, $expected)
	{
		$this->request->server = new ServerBag(['REQUEST_TIME' => strtotime($datetime)]);
		$this->middleware->handle($this->request, function($request){});
		$this->assertEquals($expected, $this->view->shared('greetingMessage'));
	}
}
```

ユニットテストを実行してグリーンになればOKです。

```
$ phpunit tests/Http/Middleware/GreetingMiddlewareTest.php
```
複数のDigest認証のページをスクリプトで生成したい

Digest認証がかかった複数のページをスクリプトで生成します。

# ディレクトリ構成
生成するディレクトリ構成はこんな感じです。

```bash
./foo/bar1 ...ユーザ: bar1、パスワード: pass1で認証
./foo/bar2 ...ユーザ: bar2、パスワード: pass2で認証
...
```

# 事前に準備するファイル

* パスワードを記載したファイル

1行に1つパスワードを記載します。

```text:password.txt
pass1
pass2
```
* .htaccessのひな形

```text:.htaccess
    AuthType Digest
    AuthName "foo"
    AuthDigestDomain /foo/bar/
    AuthUserFile /var/www/html/foo/bar/.htdigest
    Require valid-user
```

# 生成スクリプト

Digest認証の設定ファイルはhtdigestコマンドで生成するのですが、対話式のためそのままでは自動実行できません。bashのexpectを使って自動化します。

```bash:generate_digest.sh
#!/bin/bash
i=1
for line in `cat password.txt`; do
  dir_name="bar${i}"
  mkdir "${dir_name}"
  cp .htaccess "${dir_name}/.htaccess"
  sed -i -e "s|bar/|bar${i}/|g" ${dir_name}/.htaccess
  expect -c "
  spawn htdigest -c ${dir_name}/.htdigest foo ${dir_name} 
  expect \"New password:\"
  send -- \"${line}\n\"
  expect \"Re-type new password:\"
  send -- \"${line}\n\"
  wait
  "
  i=$(( i + 1 ))
done
```
* for loopでpasswordファイルを1行ずつ読み込みます。
  * barX ディレクトリを作成し、.htaccessファイルをコピーします。
  * .htaccessの内容を、フォルダ名に合わせて置換します。
  * htdigestコマンドを実行します。
  * パスワードを、expect/sendで自動入力されるようにします。
  * waitでhtdigestコマンドの終了を待ちます。waitで待たないと、spawnでサブプロセスとして実行されたhtdigestコマンドがファイルを生成する前に中断されたりして、正しくファイルを生成できませんでした。

# スクリプトの実行

expectが入ってない場合はインストールしておきます。

```bash
sudo aptitude install expect
```

fooディレクトリにパスワードを記載したファイル、.htaccessのひな形、スクリプトを配置し、スクリプトを実行します。

```bash
$ ./generate_digest.sh
```

fooディレクトリを/var/www/html/にコピーします。

# スクリプトの検証

当初、wait処理を入れていなかったため、一部のページだけDigest認証の設定ファイルが正しく生成されない現象に陥ったので、検証用のスクリプトを作りました。
curlでページを叩いて、200が返ってきているかを確認するスクリプトです。

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

i=1
url="http://localhost/foo/"
for line in `cat password.txt`; do
  curl --digest -u bar${i}:${line} ${url}bar${i}/ -o /dev/null -w '%{http_code},' -s
  i=$(( i + 1 ))
done
```

実行結果はこんな感じです。


```bash
$ ./verify_digest.sh 
200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,...
```
Rubyで(に限らず)小数点を含む演算を行うときの注意

既出もいいところだけど自分用にメモ。

Ruby 2.2.1 + pry でたまたま `1.6 + 0.1`というたわいもない小数演算を行ったところ、`1.7000000000000002`という結果が出て少々驚く。`1.6 + 0.2`なら普通に`1.8`になる。

すわバグかと思いきや、http://d.akiroom.com/2014-01/ruby-float-add-sub-precision/ によると、2進数に変換したときに循環する10進小数で本質的に発生してしまう既知の問題であるとのこと。

Rubyでの対処法のひとつとして、rationalリテラルを使用する方法がある。数字の後ろに`r`を付けると有理数(というか分数)として扱われるので、最後にto_fで浮動小数点に戻す。

> 1.6r + 0.1r  #(17/10)
> (1.6r + 0.1r).to_f  # 1.7

この問題はRubyに限らない。

ところで、昔ながらの電卓では、プアなハードウェア上でこの問題をどうやって回避していたのだろう。

さらに、http://d.hatena.ne.jp/tociyuki/20090620/1245503707 によると、浮動小数点同士を`==`などで比較するのは絶対ダメで、計算機イプシロンなるものを使用する必要があるとのこと。気を付けねば。
External Parameter Namesで関数オーバロードが出来る


Objective-C, Swiftをほぼ知らないので、サンプルを写経している時に以下の関数宣言のexternalParameterNameにあたる部分が何を意味しているのか理解してなかった。

```swift
func someFunction(externalParameterName localParameterName: Int) {
    // function body goes here, and can use localParameterName
    // to refer to the argument value for that parameter
}
someFunction(externalParameterName: 1)
```

単に名前付き引数の際に指定する引数名を表しているだけらしい。
しかもこのExternal Parameter Nameが違うだけでオーバロードできるので余計混乱してた.

```swift
func say(msg message: String){
    println("msg: \(message)")
}

func say(msg2 message: String){
    println("msg2: \(message)")
}

say(msg: "hello")     //msg: helloが出力
say(msg2: "hello")    //msg2: helloが出力
```

ここら辺Delegateメソッドで多用されていて、Delegateの[命名規則](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html)知らなかったのもあって以下のようなコードを文法理解していないまま書いていたがやっと意味がわかった...

```swift
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return sections[section].count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->  UITableViewCell {
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")
        cell.textLabel?.text = sections[indexPath.section][indexPath.row]
        return cell
    }
```


参考/引用元

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html


https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html
PowerShell あるフォルダ配下のプロジェクトファイル(csproj)に含まれないC#(.cs)ファイルを探す

システムの規模が大きくなると、昔は使っていたけど不要になったクラスファイルがVisual Studioで管理されていないけどWindowsのフォルダに物理的に残っちゃうことがよくあります。
そんな不要なファイルを探すPowerShellスクリプトはこちら。

// あるディレクトリ内でcsproj内で参照されている csファイルを抽出 完全ではないが、まぁ、なんとなく。
`Get-ChildItem -Path "C:\Users\koki\Documents\Visual Studio 2015\Projects\NLayerAppV2" *.csproj -Recurse | Select-String -Pattern ".cs""" -Encoding default -CaseSensitive | %{ $_.line.Split('"')[1] } `


// あるディクレクトリ内のすべてのcsファイルを抽出
`$(Get-ChildItem -Path "C:\Users\koki\Documents\Visual Studio 2015\Projects\NLayerAppV2" *.cs -Recurse ).FullName`

１行で書きたかったけど断念。
PowerShellでLINQしたいけど。出来そうで出来ない。多分できるけど頑張るほどでもない。

```ps1:findNoManageCSFiles.ps1
$path = "パス名"
$a = Get-ChildItem -Path $path *.csproj -Recurse | Select-String -Pattern ".cs""" -Encoding default -CaseSensitive | %{ $_.line .Split('"' )[1 ] }
$b = $(Get-ChildItem -Path $path *.cs -Recurse ). FullName
foreach( $filename in $b )
{
    $flg = $true;
    foreach( $aname in $a )
    {
        if( $filename .Contains($aname ) )
        {
            $flg = $false;
            break;
        }
    }
    if( $flg )
    {
        Write-Output $filename
    }
}
```
CordovaでiOS,Androidハイブリッドアプリ開発環境を整える


# はじめに
久しぶりにスマートフォン関連の事をやりたいなと思っていたところ、手軽に触れそうなCordovaがあったので興味本位でやってみました。
環境はYosemiteです。

# Cordovaって何？
ハイブリッドアプリ開発のプラットフォームです。
HTML5, JavascriptをメインにAndroid,iOSのスマートフォンアプリが作れます。

詳しいことは[こちら](http://www.slideshare.net/monaca_mobi/120-apache-cordova)のスライドが一番把握出来ると思います。

# 事前準備

## Node.JS

https://nodejs.org/
こちらのリンクからダウンロード&インストールしてください。

## Xcode
AppStoreで検索してインストールしてください

## Java

Javaが無いとAndroid Studio起動時に怒られるので、もしインストールしていなければ Javaをインストール&ダウンロードしてください。

https://support.apple.com/kb/DL1572?locale=ja_JP

## Android Studio
http://developer.android.com/sdk/index.html
こちらのリンクからダウンロード&インストールしてください。

# Cordovaのインストール
インストールコマンド

```bash 
$ sudo npm install -g cordova
```

インストールされたか`cordova -v`でバージョンを確認してみましょう。

```bash 
$ cordova -v
$ 4.3.0
```
# Androidのパスを２つ通す
AndroidSDK配下の /platform-toolsと/toolsに対して、パスを通してあげる必要があります。

特にインストール先などを変更していなければパスは
**/Users/ユーザ名/Library/Android** だと思います。

**実行した内容**

```bash 
$ export PATH=$PATH:/Users/ユーザ名/Library/Android/sdk/platform-tools
$ export PATH=$PATH:/Users/ユーザー名/Library/Android/sdk/tools
```

**パスを通したら環境変数を読み込みます**

```bash 
$ source ~/.bash_profile
```

# プロジェクトを作る
Cordovaプロジェクトを作りたい任意の場所に移動してください。
今回の例では /Users/ユーザー名/developというフォルダ内で実行します。

```bash 
$ cordova create sample-project
```
無事作成されると以下の表示がされます。

```bash 
$ Download complete
```

プロジェクトに移動

```bash 
$  cd sample-project
```

今回の例の場合、このタイミングで
`/Users/ユーザー名/develop/sample-project`
に居る事になります。

# iOSプラットフォームと iOS Simulatorの追加

iOSプラットフォーム追加

```bash 
$  cordova platform add ios
```

iOS Simulatorの追加

```bash 
$  sudo npm install -g ios-sim
```

# まずはiOSで確認

ビルド

```bash 
$  cordova build ios
```
ビルド結果で以下が出ていれば正常にビルドされています。

```bash 
$  ** BUILD SUCCEEDED **
```

シミュレータの起動

```bash 
$ cordova emulate ios
```

実行結果が

```bash 
$ ** RUN SUCCEEDED **
```

となってシミュレータが起動していれば OKです！

![スクリーンショット 2015-03-28 18.41.53.png](https://qiita-image-store.s3.amazonaws.com/0/65968/c7a04d28-6bc6-7f54-59fc-afee2239b9f7.png)


# Androidプラットフォームの追加

Androidプラットフォーム追加

```bash 
$ cordova platform add android
```

# Androidで確認

ビルド

```bash 
$ cordova build android
```

私の場合は残念ながらここで、エラーが出ました。
 (エラーが出ない方は飛ばしてください。)

```
Failed to run "ant -version", make sure you have ant installed and added to your PATH.
```

**Apache Antが無い場合**このエラーになるようなので、 brewから  antをインストールします。

```bash 
$ brew install ant
```

もう一度ビルドすると無事に BUILD SUCCESSFULが！


```bash 
$ BUILD SUCCESSFUL
```

シミュレータの起動

```bash 
$ cordova emulate android
```

起動するとiOS同様にのような画面が表示されます。

![スクリーンショット 2015-03-28 20.07.12.png](https://qiita-image-store.s3.amazonaws.com/0/65968/29599f5b-8f04-05f9-2912-9c90dcf56762.png)

**Androidの起動時に気になった点**
色々とネットに情報があるように Androidのシミュレータ起動がやたら遅いです。

私の場合もこんな感じの状態がしばらく続いたりしてました。

```bash 
$ Waiting for emulator...
$ Booting up emulator (this may take a while).................
```

回避策もいくつかあるようなので、後日試してみたいと思います。

# おわりに
一通りやってみて気になったのはAndroidのシミュレータ起動が遅い点くらいでしょうか。基本的につまる事なく進めると思います。