OmniAICreator/Qiita-1.07M huggingface dataset:
Keychain Access GroupのためにTeam IDをソースに埋めたくない

## Keychain Access GroupとTeam ID

iOSのKeychainを使えば、同じTeam ID（AppIdentifierPrefix）を持つアプリ間でアカウント情報を共有したりできますね。それについては、例えば、以下のサイトが詳しいです。

[[iOS] 複数アプリケーション間でのデータ共有 〜 Keychain Services を使った第三の方法 - Cocoaの日々](http://cocoadays.blogspot.jp/2011/02/ios-keychain-services_07.html)

ここで問題になるのが、Keychain Access Groupの名前です。
デフォルトのAccess Group以外のグループを使おうとすると、Access Group名として、Team IDを含んだ文字列を `kSecAttrAccessGroup` に指定する必要があります。

```objc
[attributes setObject:@"GFDZH8PXXX.share" forKey:(id)kSecAttrAccessGroup];
```

別に気にせず、Team IDまでを含めた文字列をソースコードに書けばそれでいいわけですが、

- ロジックを書くべきソースコードに、ビルド時のProvisioning Profileによって変化するTeam IDを入れてしまうのが生理的にイヤ
- ストア申請用ビルドと、社内利用のためのEnterprise（In-House）ビルドの両方をビルドするので、ビルドによってTeam IDが変わる
- 最終的に顧客のアプリを開発するのだが、開発中は自社で契約しているTeamを使っている
- オープンソースなので特定のTeam IDに依存させたくない

などの理由で、ソースコード中にTeam IDを含めたくないことがあります。

## これで解決

Info.plist ファイルにアプリ独自の情報を埋めておけば、プログラムでそれを読み出すことができます。その情報を含める際に `$(AppIdentifierPrefix)` と書けば、ビルド時にその部分はTeam ID + `.` に置き換えられます。

つまり、Info.plist ファイルをOpen As→Source Codeで開いて、

```xml:Info.plist
<key>AppIdentifierPrefix</key>
<string>$(AppIdentifierPrefix)</string>
```

というような記述をしておけば、プログラムで次のようにして、Team IDを取得することができます。

```objc
NSString *appIdentifierPrefix =
    [[NSBundle mainBundle] objectForInfoDictionaryKey:@"AppIdentifierPrefix"];
```

ここで得た `appIdentifierPrefix` には最後にピリオド `.` が付いていることにだけ注意が必要です。

または、

```xml:Info.plist
<key>SharedAccessGroup</key>
<string>$(AppIdentifierPrefix)share</string>
```

のような感じで、あらかじめAccess Group名そのものを Info.plist から取得するように記述しておいてもいいでしょう。


## 実はこのネタ‥‥

以前、Stack Overflowに解答として投稿したものです。

[Access App Identifier Prefix programmatically - Stack Overflow](http://stackoverflow.com/questions/11726672/access-app-identifier-prefix-programmatically/28714850#28714850)

質問自体は古くて、ちょっと無理やり感のある解答が付いていたんですが、そっちはぼくにとって気に入った方法じゃなかったので、別の方法もあるよ、という気分で解答したのです。すると、どうも、古い解答のやり方はiOS 8で使えなくなっていたらしく、こちらの方法も徐々にVoteされ始め、気分がよくなったので、もとい、需要があるんだなあと思ったので、Qiitaにも共有してみました。
unifdefを使ってみる


# はじめに
「#ifdef」ディレクティブが多いソースコードってやだなぁ。
「#if 0」も多いなぁ。
不要なコードを見たくないし、削除できるツールが欲しいなぁ。
自作しようかとも考えたが、車輪の再発明かもしれないので探してみる。
お、あった、あった。unifdefか。
昔に見たことあるような気が...。

# 参考になった情報源
[FreeBSD 一般コマンドマニュアル unifdef(1)](http://freebsd4-jman.kandk.co.jp/1/unifdef.1.html)
[C言語ソースのifdefを削除するツール](http://itdokata2pg.hatenablog.com/entry/2013/07/07/155223)

BSD系のコマンドだったのか。
昔に使ったことある気がしてきた。
手元のMacでは、標準で使えることを確認。（MacOSはBSD系だから当たり前）
しかし、Windowsの環境で使いたいんだよね。

# では、最新をダウンロード
[unifdef - selectively remove C preprocessor conditionals](http://dotat.at/prog/unifdef/)
現時点では、2.10が最新だった。

# インストールしてみよう、ビルドせなあかんのね
INSTALLには、以下のようにある。
> The win32 subdirectory contains build files for MinGW and Visual
> Studio 2010 which make use of the FreeBSD code plus some other
> portability wrappers.

手元にVisual Studioがインストールしてあったので、解凍したファイル群の中のwin32フォルダにあるunifdef.slnを開いてビルド。
同じフォルダにあるwin32.cの65行目で、エラーが出る。

```c
    count = _vsnprintf_s(str, size, _TRUNCATE, format, ap);
```
strがない？
恐らく、この関数の引数 bufだと判断し、下記のように修正。

```c
    count = _vsnprintf_s(buf, size, _TRUNCATE, format, ap);
```
再ビルド。⇒OK

# さてと、使い方は

```
unifdef.exe -h
```
とすれば、ヘルプもでるし、
[Read the manual](http://dotat.at/prog/unifdef/unifdef.txt)
にも、マニュアルがある。

使いたいオプションは、次のぐらいかな。

- -b : 置き換えた行は空行にする (-l と同じ？)
- -m : ファイルを上書きで書き換える（元ファイルはバックアップがあるから、置き換えでいいや。）
- -k : #if を扱う(#if 0 - #endif を消す,#if 1 - #endifを残す)
- -fpath : pathに指定したファイルの定義を読む

例えば、定義ファイルが sample.def、ソースコードが sample01.c だとしたら、

```
unifdef -b -m -k -fsample.def sample01.c
```
こんな感じで実行すればよいのね。

定義ファイルに、コメント入れたりしても問題ない模様。

sample.def (例)

```c
// AAAは有効とする
#define AAA
// BBBは無効とする
#undef BBB
// #define CCC // CCCは残しておこう
```

# 一気に置き換え
さて、使い方もわかったので、プロジェクト全体に実行してみるとしよう。

henkan.bat

```bat
for /f "usebackq" %%i in (`dir /B /S *.h`) do undef -b -k -m fsample.def %%i
for /f "usebackq" %%i in (`dir /B /S *.c`) do undef -b -k -m fsample.def %%i
```

これで、全体が置き換わった。よしっ。
LOGO(ACSLogo)で遊ぶ


[ACSLogo For Mac OS X](http://www.alancsmith.co.uk/logo/) で遊びます。

環境

- Mac OS X 10.10.4

## 資料

- 公式サイトの [User Guide](http://www.alancsmith.co.uk/logo/LogoUserGuide151.pdf)
- [LOGO - wikipedia](https://ja.wikipedia.org/wiki/LOGO)


## 関数定義

関数を定義するには、以下のように書きます。

```
define 関数名 [[引数] [本体]]
```

たとえば、二つの引数を受け取り、その和を返す関数 add は次のようになります。

```
define "add [[a b] [:a + :b]]
```

本体で引数を参照するときは、`:a`, `:b` のように先頭にコロンを付けます。


## コメントの書き方

ダブルスラッシュでコメントになります。

```
sum 10 20 // これはコメント
```

## 亀の表示オンオフ

`showturtle` で亀を表示、`hideturtle` で亀を非表示にします。

## サンプル

(サンプルは更新中です)

### スパイラル

![spiral.jpg](https://qiita-image-store.s3.amazonaws.com/0/1900/7cc6329e-29d0-10c5-6a41-6ce0604571ae.jpeg "spiral.jpg")


```
define "spiral [[size angle]
  [if :size < 100
    [fd :size
     rt :angle
     spiral (:size + 2) :angle]]]

cs spiral 0 90
```

### 花

![flower.jpg](https://qiita-image-store.s3.amazonaws.com/0/1900/dc37fc82-5bfb-20d5-5a57-11bc9db49afd.jpeg "flower.jpg")


```
define "halfleaf [[]
  [repeat 9 [fd 10 rt 10]]]

define "leaf [[]
  [halfleaf
   rt 90
   halfleaf]]

define "flower [[]
  [repeat 10 [leaf rt 10]
   setheading 180
   fd 200
   rt 180
   fd 30
   rt 20
   leaf]]

cs flower
```

### コッホ曲線

![koch.jpg](https://qiita-image-store.s3.amazonaws.com/0/1900/8c81ea75-ed02-406d-c3c2-0ca7e531e250.jpeg "koch.jpg")


```
define "koch [[len level]
  [if :level = 0
    [fd :len]
    [local "w
     local "h
     make "w (:len / 3)
     make "h :level - 1
     koch :w :h
     lt 60
     koch :w :h
     rt 120
     koch :w :h
     lt 60
     koch :w :h]]]

cs rt 90 koch 300 4
```
js-yamlでymlをjsonに変換しました。

Jsonはコメント書けないなど不便なのでymlファイルからJsonを作成しました。この環境はNodeはインストール済みとします。

# js-yamlをインストール

```bash:js-yamlのインストール
npm install -g js-yaml 
```
npm installします。

# ymlファイルを準備
hoge.ymlのファイルを作成します。

```yaml:hoge.ymlを作成
data:
  type: "array"
  id:
    type: "integer" #数値
  message:
    type: "string"
required:
  - data

```
ymlファイルの中味を適当に書きました。

# js-yamlコマンドで変換

```bash:ymlをjsonに変換
js-yaml hoge.yml > hoge.json
```
hoge.jsonが出来上がりました。

```json:hoge.json
{
  "data": {
    "type": "array",
    "id": {
      "type": "integer"
    },
    "message": {
      "type": "string"
    }
  },
  "required": [
    "data"
  ]
}
```
jsonを手書きはきついのでyml書くほうが楽だと思いました。

# おまけ
ymlをjsonへウェブで変換する場合は http://yamltojson.com/ が楽でした。
VRレーシングゲームのコース・ゴールを作る

[この記事](http://qiita.com/fumishitan/items/2b60f27b79fdb4772be4)の第2回目の記事です。

多くは[hiyotama](http://hiyotama.hatenablog.com/archive/category/%E3%83%89%E3%83%A9%E3%82%A4%E3%83%93%E3%83%B3%E3%82%B0%E3%82%B2%E3%83%BC%E3%83%A0)さんのブログを参考にさせていただいた。
ただ設定値などが違うのでその点も含め記事を書いていきたい。

今回のやることは以下
　・コースの設置
　・コース・ゴール用壁の設置

## コースの設置

今回コースは芝生・道路の２つのパーツから作る。
まず芝生から作りたい
下記の図のように、Unityヘッダーのメニューから
GameObject > 3DObject > Plane を選びましょう

![スクリーンショット 2015-07-07 12.16.45.png](https://qiita-image-store.s3.amazonaws.com/0/55227/f3724a6c-3525-5b4b-c7cb-90b4c76e43f1.png)

そしてインスペークターから
objectの名前をGreenにリネーム
positionを（0,0,300）
scale を（20,1,60）
に合わせてあげます

また、下記の図のようにAssets>Create>Materials
を選び緑色を表示するGlassというMaterialをつくりましょう
![スクリーンショット 2015-07-07 12.21.15.png](https://qiita-image-store.s3.amazonaws.com/0/55227/055e06d1-8c5e-00c4-a6cc-23c46e7d7d40.png)
結果下記の図のような形のマテリアルができます。
![スクリーンショット 2015-07-07 12.23.59.png](https://qiita-image-store.s3.amazonaws.com/0/55227/e33ad260-940a-7f24-3e6f-5d87e8a5ac50.png)

そしてそれをGreenにアタッチしましょう。

次に道路を作りましょう！
道路は上記のGreenと同じようにplaneを作りCourseと名付けます。
そしてインスペクターでposition(0,0.05,300),scale(1.5,1,60)に合わせます
それに下記の、図を貼り付けましょう

![road.png](https://qiita-image-store.s3.amazonaws.com/0/55227/ac47cbca-637d-323b-14a0-6ba0613a7b90.png)

そうしたらコースの出来上がりです。
またコースから飛び出ないための壁も作ります。

## コースの壁の設置

コースの壁はGameObject > 3DObject > Cubeで立方体を作成します
そのCubeに下図の様にRigidbody,BoxColiderをAdd Componentしインスペクターで設定値を加える

![スクリーンショット 2015-07-08 9.20.47.png](https://qiita-image-store.s3.amazonaws.com/0/55227/45833cbc-85e5-605a-ad98-d71601b2b5fc.png)


このCubeをWallと名付け３つ作る
2つはコース両端に置き左右に飛び出るのを防ぐため
1つはゴールに置きゴール後飛び出ない様にするためです

それぞれのインスペークターのTransform値を明記する
左壁
Position (-12.5, 1, 300)
Rotation (0, 0, 0)
Scale    (10, 10, 500)

右壁
Position (12.5, 1, 300)
Rotation (0, 0, 0)
Scale    (10, 10, 500)

ゴール
Position (0, 1, 601)
Rotation (0, 0, 0)
Scale    (200, 10, 1)

これでゴールからプレイヤーを飛び出ない様にします。

## ゴールの設置

ゴールの設置を行います。
まずゴールのGameObjectを作成します
GameObject > 3DObject > Cubeで立方体を作成し、Goalとリネームします
その後、インスペクターで下記の様に設定します

Position (-1.5, 1, 600)
Rotation (0, 0, 0)
Scale    (3000, 400, 1)

正直Scaleのxはゴールの幅以上であればなんでもいい

またBoxColiderやRigidBodyを付け加え下図の様に設定します
![スクリーンショット 2015-07-08 20.07.04.png](https://qiita-image-store.s3.amazonaws.com/0/55227/97d9784e-29c5-d60e-c09e-7bd961893269.png)

気づいた方もいるかもしれませんがSkyというマテリアルを貼り付けています。
こちらは完全に趣味で夜空をイメージして色を貼り付けているので
皆さんはお好きな色をお選びください。
ここで一旦ゲームを保存しましょう。保存時に新しいシーンの名前として「run」と名付けします。
ということでコースは大体できたので今日はここまでにします。
watchでコマンド実行結果を目視監視する


## 概要
- watchは、プログラムを定期的に実行し、出力結果を表示するコマンド
- watchコマンドで目視監視っぽいことができる
- `while true; do <command>; sleep <seconds>; done` とほぼ同じようなことがより手軽にできる

## サンプルいくつか

### 文法

```
// <command>はsh -cに与えられる
$ watch [options] <command>
```

### 5秒おきに`ls /tmp`を実行し、結果を出力する

```
$ watch -n 5 ls /tmp
```



### dateコマンドの結果を10秒おきに実行して結果を出力し、変化があった場合にハイライトする

```
$ watch -n 10 -d date
```

ちなみに変更があった際のハイライトは下の画像みたいな感じになる。dateコマンドの十の位の秒数が、前回の結果から変わったことを示している。

![Screen Shot 2015-07-08 at 23.47.53.png](https://qiita-image-store.s3.amazonaws.com/0/2813/67294bbe-d2f5-6469-cf98-48f3a72f69d8.png "Screen Shot 2015-07-08 at 23.47.53.png")

## 使いそうなオプション
|オプション|意味|
|:--|:--|
|n|インターバル時間（秒）。0.1秒以上の頻度は指定できない。|
|d|一つ前の実行結果との差分をハイライトする|
|t|ヘッダ部分のタイトルを表示しない|
|x|コマンドを`sh -c`の代わりに`exec`に渡す|

## その他雑感
- watchは実行結果を画面上から上書いていくので、実行結果の履歴を通して見ることができない。一方、先述した`while`と`sleep`を組み合わせて使う方法だと、実行結果は1つ前の実行結果の下に続くので通しで見ることができる
- どんな目視監視をしたいかに応じて使い分けるのが良さそう
RICOH THETA m15で撮影した動画を使ってハコスコ用のアプリを作る（その１：全天球モデルを作る）

[RICOH THETA m15][link-1]で撮影した360度動画を使ったアプリをUnityで作る[機会][link-2]があったので、作り方をメモしておきます。全天球の内側に360度動画をムービーテクスチャとして貼り付けて再生し、ジャイロの値をカメラの方向に反映させるだけです。

# 360度動画を用意する

[RICOH THETA m15][link-1]で360度動画を撮影してください。
撮影を完了するとDual-FisheyeのMOVファイルが生成されます。
Dual-Filsheyeだと全天球に貼り付けられないので、[THETA m15のダウンロード][link-3]で提供されているパソコン用アプリケーションでEquirectangular形式のMP4ファイルに変換してください。

# 全天球モデルを作成する

動画を貼り付ける全天球モデルをBlenderで作成します。
モデル作成は[こちら][link-4]のサイトを参考にしました。
ほぼ参考先の手順通りなのですが、最後の法線反転をしないと上手く動作しなかったので、自分が実行した手順を改めて記載します。
法線の扱いは[こちら][link-5]のサイトを参考にしました。

1. UVSphereを作成します。Segmentsは64、Ringsは32、Sizeは10に設定します
2. ShadingをSmoothに設定します
3. 両極を選択して、Ctrl+I (アイ) で反転します
4. UV UnwrapeをCylinder Projectionにして、以下の通り設定します
  * DirectionにAlign to Objectを選択
  * AlignにPolar ZXを選択
  * Correct Aspectを選択
  * Scale to Boundsを選択
5. 法線を表示します。球体を選択しNを押してプロパティを表示します
6. Mesh DisplayのNormalsで面表示を選択すると青く法線が表示されます
7. 青い法線は標準だと短いので、サイズを少し大きくします
![viewNormal.png](https://qiita-image-store.s3.amazonaws.com/0/35817/4b38c05b-356e-4166-5e1c-ab928a18759e.png)

8. 現時点では法線が全て外向きになっており、ムービーテクスチャを貼ると外側に貼られてしまうのでShadingのNormalsでFlip Directionを選択して法線方向を内向きにします![reverseNormal.png](https://qiita-image-store.s3.amazonaws.com/0/35817/09573591-973f-3068-377d-70ea467222ae.png)


以上でモデルの作成は終わりです。
.blenderファイルとして保存してください。

次回は、Unityでアプリの実装をします。


# 参考サイト
1. [RICOH THETA m15][link-1]
2. [女の子か怖い人に囲まれ体験アプリ - デイリーポータルZ：@nifty][link-2]
3. [RICHO THETA m15 ダウンロード][link-3]
4. [360度カメラTHETAで撮った写真・動画をUnityで使う - Psychic VRラボの殴り書き][link-4]
5. [オブジェクトの法線方向の確認方法 - Blender Cycles memo][link-5]

[link-1]:https://theta360.com/ja/ "RICOH THETA m15"
[link-2]:http://portal.nifty.com/kiji/150611193773_1.htm "女の子か怖い人に囲まれ体験アプリ - デイリーポータルZ：@nifty"
[link-3]:https://theta360.com/ja/support/download/ "RICHO THETA m15 ダウンロード"
[link-4]:http://psychic-vr-lab.com/blog/unity/360%E5%BA%A6%E3%82%AB%E3%83%A1%E3%83%A9theta%E3%81%A7%E6%92%AE%E3%81%A3%E3%81%9F%E5%86%99%E7%9C%9F%E3%82%92unity%E3%81%A7%E4%BD%BF%E3%81%86/ "360度カメラTHETAで撮った写真・動画をUnityで使う - Psychic VRラボの殴り書き"
[link-5]:http://cycles.wiki.fc2.com/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E6%B3%95%E7%B7%9A%E6%96%B9%E5%90%91%E3%81%AE%E7%A2%BA%E8%AA%8D%E6%96%B9%E6%B3%95 "オブジェクトの法線方向の確認方法 - Blender Cycles memo"
FirefoxのバルーンっぽいCSS（小ネタ）

暇だったので、Firefox 39のバルーンっぽいやつ作ってみました。いまのFirefoxってバルーンがトランジションするんですね。CSS向きな感じでした。

![スクリーンショット 2015-07-08 23.49.29.png](https://qiita-image-store.s3.amazonaws.com/0/84193/59a722b1-a064-8ef7-66fb-577949decc9f.png)

コードはjsfiddleにおいてます。
https://jsfiddle.net/lovalotta/fgj9efph/

最初ダイアログだと思って作ってたんですが、スクリーンショット撮ってみたらバルーンだったんですね。吹き出しを忘れてました。でもいいや。実際のFirefoxは、吹き出しがある位置がtransform-originっぽい雰囲気でした。

# 追記
吹き出しにしました。
https://jsfiddle.net/lovalotta/tdhkdbdc/
transactionを使用するときの注意点

結構調べて対応したので、メモしておきます。
##transactionとは
ソフトウェアの処理方式の一つで、互いに関連・依存する複数の処理をまとめ、ひとつの処理単位として扱うこと。つまり複数の処理をひとつの処理として考えるということで処理A、処理Bをひとつの処理Cとして扱う。処理Aが終了し処理Bを実行しているときにエラーが起こると処理Cがなかったことになる（この場合処理Aがなかったことになるということ）。


##delete もしくは destroyを使用したとき
コントローラの中で要素を削除するという処理を加え、保存するときにこのtransactionを使用してみた。で例外処理としてその要素にnilを入れたかったので以下のようなコードにした。

```
if client_attributes[:client_hoge_attributes]
  @client_temp.client_hoge.each { |obj| obj.delete }
  client_attributes[:client_hoge_attributes].each do |key, val|
    if client_attributes[:client_hoge_attributes][key]
      client_attributes[:client_hoge_attributes][key].delete("id")
    end
  end
end
@client_temp.attributes = client_attributes
@client_temp.delete_blank
begin
  ClientTemp.transaction do
    @client_temp.save! validate: @client_temp.applied?
    @client_temp.client.update_photo_used
  end
  if @client_temp.temp?
    flash[:notice] = I18n.t "clients.update.temp"
  else
    flash[:notice] = I18n.t "clients.update.offer"
  end
  redirect_to client_top_path and return
rescue
  @errors = @client_temp.errors
  @client_temp.client_hoge.each{|obj| obj.client_temp_id = nil }
  @client_temp.fill_blank
  render action: :edit
end
```
特定の条件下でRuntimeError Can't modify frozen hashというエラー発生！
こいつがやっかいだった。


##RuntimeError Can't modify frozen hash
これの意味は「オブジェクトの中身を変更できなくなっている」のに変更をしようとしているので出るエラー。
transactionのブロック内で破壊的メソッドのsave!をしている。ここで[例外処理に移ったときdeleteで削除されているidも絡んで起こるエラーっぽいです。](https://github.com/rails/rails/issues/18191)
いまいち腑に落ちていないのですがまあ対応してみた。


##方法
freezeを解除する方法があれば解決するのでは？とあたりをつけて調べてみた。
[dup を使えばほぼ同じ内容の凍結されていないオブジェクトを得ることはできます。](http://docs.ruby-lang.org/ja/search/query:freeze/query:frozen%3F/)とかこういうのを参考にしました。[ActiveRecord オブジェクトをコピーする](http://blog.hello-world.jp.net/ruby/809/)
ってことで

```
rescue
  @errors = @client_temp.errors
　@client_temp = @client_temp.dup
  @client_temp.client_hoge.each{|obj| obj.client_temp_id = nil }
  @client_temp.fill_blank
  render action: :edit
end
```

みたいに対応してみたら、、、成功！！


エラーの意味の詳細がわかり次第、更新します。

[レファレンスtransaction](http://railsdoc.com/references/transaction)
【WIP】CAOS2015勉強会まとめ

## はじめに

7/7(火)にCAさんで行われていた
 "CAOS 2015 Summer「開発効率のツール開発とオープンソース活動」" 
の勉強会に行ってきましたので、その内容をレポートさせて頂きます！
勉強会のagendaは、下の３点になっています.

- スマートフォン端末検証システム STF
- リアルタイム通信基盤 duck
- デザイン作業効率化ツール ImageHayabusa

まとめた内容に間違ってる点などあったらご指摘していただけますと幸いですー！

## 全体のまとめ
STFはandroid端末に対して、スマートフォンやPCのブラウザからアクセスできるようになるシステム.
簡単なテストにはすごく重宝しそうだが、触り心地やレスポンスの確認などは難しく、これだけでテスト全体の担保はできないかも..?

duckはリアルタイム通信用の基盤.
アプリ側にて、通信プロトコルをwebsocket、MQTTの中から選ぶことができる.
既に２つのアプリが運用にのっており、実績はあるとのこと.

ImageHayabusaは、APIを叩いて、サーバー上にアップロードされたリソース(png,psd,ai)に対して所望の加工を加えてくれるwebアプリケーション.
製作者に直接聞いたところ、一番良く使われている機能はpng画像のリサイズ、切り出し、圧縮の３点.

## STF (Smartphone Test Farm)
サーバーにつないだandroid端末に対して、
スマートフォンやPCのブラウザからアクセスできるようになるシステム.

### できること
- Web 上で各端末のリアルタイムログを取得
- ドラッグ&ドロップでアプリ（.APK ファイル）のインストール
- ブラウザからのリモートシェルの実行


### 未対応の機能
端末の権限設定 
=> だれでもその端末のrootになれちゃう！

端末の初期化 
=> usbが繋げなくなっちゃうので

音の再生 
=> 対応予定！

appiumなどを用いたシナリオテスト 
=> システムの主な目的はリモートアクセスなので、自動テストなどは考えてない.
=> PRお待ちしています.

複数端末を同時に操作可能
=> gihyoとかには出来るって言ってたけど、最新版ではできなくなった.
=> あんまり使われないわりには、リモート端末の通信品質の劣化が見込まれるので

### 参考リンク
https://github.com/openstf/stf

### 所感
appiumに対応したら、導線確認などの簡単なテストに重宝しそう！
アプリの手触り等の確認に使えるかは、実際使ってみないとなんとも言えない感じ.

## duck
社内で利用するリアルタイムメッセージ基盤.
特徴としては、サービスの開発者が、
通信プロトコル(websocket, MQTT)やデータフォーマット
(JSON, MessagePack, Protocol Buffers)を選択することができること.

### 導入実績
すでに２アプリで導入されているとのこと

同時接続2000人
1.2億 messages/month
の環境で現在稼働しているとのこと

### 所感
メッセージ周りのミドルウェアは、対応している通信プロトコルや、CAさんの過去の発表内容から、RabbitMQかなぁ.
toychat見ると、proxyサーバーがclientをchatサーバーに振り分けたあとも、clientの監視に使われている模様.
普通にやると、scaleするときに、こいつがボトルネックになりそうだなぁと思うのだが、どうだろう.

### 参考リンク
(たしか、toychatと関連があるとかなんとか言っていたような...うろ覚え)
http://ameblo.jp/principia-ca/entry-12016672808.html
CoffeeScriptの落とし穴(unmatched OUTDENTで悩まされている方へ)

CoffeeScript便利ですよね。簡単かつ見やすい。
ただし、"unmatched OUTDENT"お前さえいなければの話だ…

# 原因

例えば次のようなコードを見てみましょう。

```lang:sample.coffee
msg = 'caution'
if msg == 'caution'
  alert msg
  msg2 = 'run away'
  if msg2 == 'run away'
    alert msg2
...
```

このようにif文が入れ子状に入るコードはよく見かけますよね。
vim-coffee-scriptを使っているので、自動でインデントもつけてくれて、便利便利…

…とこれが落とし穴なのです。
初期設定ではvimのタブスペースは8文字分ですが、それ以上のインデントをvim-coffee-scriptのsyntaxでつけようとすると、タブスペースと空白スペースが混ざってしまいます。その結果、見た目は合っているように見えるのに実際はインデントがずれていると認識されてしまう…というわけです。
実際にコンパイルすると「unmatched OUTDENT」なるエラーが発生します。
見た目が合っているだけあって、意外と気づきにくいミスかもしれません。

# 対策

CoffeeScriptを使う上では(特に初心者)、次の設定は必須でしょう。

```lang:.vimrc
...
set expandtab "タブスペースの代わりに空白スペースを挿入
set tabstop=2 "tabキーを押した時のインデント幅を設定
set shiftwidth=2 "syntaxのインデント幅を設定
...
```

これでもう心配ありません。快適なCoffeeScript生活をお送りください。
消される前に消す！Cascade Deleteが待ちきれない人に

#背景
CoreDataではRelationshipに対してDelete Ruleを設定しておくことができます。これにより、オブジェクトを削除した際に、関連するオブジェクトを連鎖的に削除することができます。(CascadeDeleteRule)

#問題点
上記のDelete Ruleは非常に便利なのですが、この処理は常に遅延して実行されます。通常はこの遅延は問題になりませんが、オブジェクトの削除直後に集計等を行うと、削除されるはずのオブジェクトが含まれてしまう場合があります。

#対策
NSManagedObjectが削除される際に呼び出されるprepareForDeletionというフックがあるので、これを利用して即時にオブジェクトを削除することが出来ます。下記のコードではモデル上で設定されたDelete Ruleに基づいて削除処理を行っています。

```swift:該当オブジェクトに実装
    override func prepareForDeletion() {
        super.prepareForDeletion()
        btk_propagateDelete()
    }
```

```swift:NSManagedObjectのエクステンション
import CoreData

extension NSManagedObject{
    
    func btk_propagateDelete(){
        if(managedObjectContext == nil){
            return
        }
        let context = managedObjectContext!
        let relationships = entity.relationshipsByName
        let relationshipNames:[String] = {
            var names:[String] = []
            for name in relationships.keys{
                names.append(name as! String)
            }
            return names
        }()
        
        for relationshipName in relationshipNames{
            let desc = relationships[relationshipName] as! NSRelationshipDescription
            if(desc.deleteRule == .CascadeDeleteRule){
                if(desc.toMany){
                    if(desc.ordered){
                        let toMany = mutableOrderedSetValueForKey(relationshipName)
                        for obj in toMany.array as! [NSManagedObject]{
                            context.deleteObject(obj)
                        }
                    }
                    else{
                        let toMany = mutableSetValueForKey(relationshipName)
                        for obj in toMany.allObjects as! [NSManagedObject]{
                            context.deleteObject(obj)
                        }
                    }
                }
                else{
                    let obj = valueForKey(relationshipName) as! NSManagedObject
                    context.deleteObject(obj)
                }
            }
            else if(desc.deleteRule == .NullifyDeleteRule){
                if(desc.toMany){
                    if(desc.ordered){
                        let toMany = mutableOrderedSetValueForKey(relationshipName)
                        toMany.removeAllObjects()
                    }
                    else{
                        let toMany = mutableSetValueForKey(relationshipName)
                        toMany.removeAllObjects()
                    }
                }
                else{
                    setValue(nil, forKey: relationshipName)
                }
            }
        }
    }
    
}
```
jtwig を使う

Spring MVC 上で、テンプレートエンジンについて、jsp、velocity、FreeMarker などについてはオフィシャルのドキュメントで紹介されている。

それぞれのテンプレートエンジンの比較は以下の文章でもなされている

- [SpringMVCで使えるテンプレートエンジンを比較してみた #jsug](http://blog.horimisli.me/entry/2012/12/24/181743)

しかしながら継承などを行いたいため、Twig のようなテンプレートエンジンを探していた。Velocity でもテンプレートの継承を行う方法はあるようだが、記法がどうも気に食わなかった。

- [Velocityでテンプレートの継承](http://jxck.hatenablog.com/entry/20100306/1267872374)

そこで、見つけてきたのが [jtwig](http://jtwig.org/) というテンプレートエンジンである。そのまんまである。名前の通り、Java で動く [Twig](http://twig.sensiolabs.org/) だ。

Spring MVC で使う方法は非常に簡単で、まずは依存の追加。

```groovy:build.gradle
compile 'com.lyncode:jtwig-spring:3.1.1'

compile 'org.slf4j:jcl-over-slf4j:1.7.12'
compile 'ch.qos.logback:logback-core:1.1.+'
compile 'ch.qos.logback:logback-classic:1.1.+'
```

依存に、`twig-spring` を追加。ついでに、`logback` も追加した。多分、デフォルトの設定のためだと思われるが、これがないと上手く初期化されない。

Context には以下を追加

```xml
<bean id="viewResolver" class="com.lyncode.jtwig.mvc.JtwigViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".twig"/>
</bean>
```

これだけで完了。
あとは、WEB-INF/views に PHP の twig のようにテンプレートを置くだけ
Sprint WebMVC の Controller ではテンプレート名をしておけば良い

```java
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
 
@Controller
public class IndexController {
 
    @RequestMapping("/")
    public String indexAction (ModelMap model) {
        model.addAttribute("name", "JTwig");
        return "index";
    }
}
```

もちろん、extends タグに対応している。

```:WEB-INF/views/layout.twig
<html>
<head>
...
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
```


```:WEB-INF/views/index.twig
{% extends "layout.twig" %}

{% block content %}
{{ name }}
{% endblock %}
```
Python(boto)でAmazon S3にあるデータをGoogle Cloud Storageへコピーする


Amazon S3(以下S3)にあるデータをRedShiftに入れるときなどは、同じAWSということもあり簡単に行えますが、BigQueryで同様のことをするとなるとやはりGoogle Cloud Storage(以下GCS)を経由するのが便利です。GCSはS3と互換性を持たせることが可能なので、それを利用してS3からGCSへの移行、またはその逆を行うことができます。

この記事はPythonとbotoを使ってそれを実現する方法について書いています。

## 考慮すべき代替案

コマンドライン上でコピーを実行するといった用途の場合は以下のより優れた方法を採用できます。

### gsutil

通常、最も簡単にS3・GCS間でデータをコピーできるのは`gsutil`コマンドを利用する方法です。
https://cloud.google.com/storage/docs/gsutil


```
$ gsutil cp s3://bucket/file gs://bucket/file
```

## 準備

### 互換運用アクセス

GCS管理コンソールからGCSを互換運用アクセスを有効にしておきます。
（参考にした記事：[Google Cloud Storage に AWS CLI や AWS SDK for PHP でアップロード](http://qiita.com/ngyuki/items/fd3bb47cd4aeb2f61fec)）

### 必要な情報

S3・GCSについてそれぞれ次の情報が必要なので事前に取得しておきます。当然ですが書き込む側にはwrite権限が必要です。

- bucket名
- Accsess key ID
- Secret accsess key ID

### boto

botoを使うためインストールしておきます。

```
$ pip install boto
```

## 実装例

botoでは、ありがたいことにS3とGCSの両方に対して読み書きできます（GCS関連クラスはS3関連クラスを継承して実装されている）。それを利用してPython上で読み込み・書き込みを行います。

### bucket操作の準備

```bucket2bucket.py
from boto.gs.connection import GSConnection
from boto.s3.connection import S3Connection


gs_bucket = GSConnection(
    'GS_ACCSESS_KEY', 'GS_SECRET_ACCSESS_KEY').get_bucket('GS_BUCKET_NAME')

s3_bucket = S3Connection(
    'S3_ACCSESS_KEY', 'S3_SECRET_ACCSESS_KEY').get_bucket('S3_BUCKET_NAME')
```

### ファイルやStringIOなどを使っての読み込み・書き込み

```bucket2bucket.py
from StringIO import StringIO


def bucket2bucket(from_bucket, to_bucket, file_name):
    io = StringIO()
    try:
        from_bucket.get_key(file_name).get_file(io)
        io.seek(0)
        key = to_bucket.new_key(key_name=file_name)
        key.set_contents_from_file(io, replace=True)  # replaceは上書きの許可
    finally:
        io.close()
```

`get_file`や`set_contents_from_file`などは他にも引数を指定できるのでドキュメントの確認をお勧めします。

### 実行例

```bucket2bucket.py
bucket2bucket(s3_bucket, gs_bucket, 'spam')
bucket2bucket(gs_bucket, s3_bucket, 'egg')
```

このように、botoではS3とGCSを同じように扱うことができるので、お互いのデータのやり取りが簡単に出来ます。なお、同一bucket内でコピーを行うのは`Bucket.copy_key`が用意されているのでそちらの利用を推奨します。
Minority's hello, world

[鍋谷 武典](https://twitter.com/Nabetani])さんからCodeIQにて出題された問題, [Minority's hello, world](https://codeiq.jp/q/1579)を解いた時の戦略をメモ.
問題の概要は次の通り.
>「hello, world」と出力するプログラムを提出して下さい。
>提出されたプログラムで使われている文字を、全挑戦者について集計します。
>各文字には「(その文字を利用した挑戦者の人数)の2乗」というポイントが割り当てられます。
>提出されたプログラムのポイントは、そのプログラムで使われている文字のポイントの合計となります。
>提出コードのポイントが少ない順に順位をつけます。最小ポイントの方が優勝です。

## 提出したコード
```php:answer.php
<?='%#&-%bk!&#&&'^'MFJAJNKVIQJB';
```
# 戦略
## 比較的短く書ける言語を選択する
　短く書ける, かつ, 使える言語としてRubyとPHPで迷ったのですが, 文字列出力だけであればPHPのほうが短く書けるのでPHPを選択しました.
 
## 文字同士の排他的論理和をとる
これは「hello, world」を構成する文字を使わないための回避策で, PHPならではの技になります.
PHPには文字同士の排他的論理和をとると, その文字のASCIIコード値同士の排他的論理和に対応するASCIIコード文字を返す仕様があります.

|e.g.|
|:--|
|![daum_equation_1436258647536.png](https://qiita-image-store.s3.amazonaws.com/0/72064/810820dc-95d1-da99-1ecd-25b5de735029.png) |

また, 文字同士だけでなく, 文字列同士の排他的論理和をとることで, 演算を一括して行うことも可能です.

|e.g.|
|:--|
|![daum_equation_1436258568966.png](https://qiita-image-store.s3.amazonaws.com/0/72064/693ba3ac-e0c2-089f-6a4d-2d3c81011b0c.png)|


## アルファベットの大文字をなるべく使う
定数やクラス名など特定の部分でしか使われにくいアルファベットの大文字をふんだんに（しかし必要最小限に）盛り込みました.
また, 「hello, world」を大文字にした「HELLO, WORLD」を使ってくる人もいると考え, なるべくこの文字列を構成する文字の使用を避けました.

## 細かいところにこだわる
その他, 細かいところ

- 文字列を囲うときは「"」ではなく「'」を使う
- 標準出力に使われる文字（put, print, echo, (, ), ", '...）を避ける <br>
→今大会1位のPINさんのコードを参考にすると最初の「'」も外せたみたい<br>
（外していたら2位だったかも(´・ω・｀)）
- 末尾に「;」が必須な言語（c++, java, ...）より, **末尾に「?>」が必要だと思っている人が多そうなPHP**を使ってくる人が多いと考え, 文字列の末尾を「;」にした<br>
→結果見る限りあまり変わらない様子
- 「 （空白）」を使わない

# 結果
名だたる強者たちとの心理戦(？)の結果, 前回大会同様, 銅メダルでした！

# おまけ
文字列同士の排他的論理和を試せる, ~~イケてない~~コード（なぜかRubyで書いた）

```ruby:xor.rb
string1 = "hello, world"
string2 = "%#&-%bk!&#&&"
each_slice1 = string1.each_char.map(&:ord)
each_slice2 = string2.each_char.map(&:ord)
puts each_slice1.zip(each_slice2).inject('') { |sum, v| sum += (v[0]^v[1]).chr }
# => MFJAJNKVIQJB
```

# 参考
- [今回大会結果発表ページ](http://nabetani.sakura.ne.jp/codeiq/hwbattle2/)
- [前回大会結果発表ページ](http://nabetani.sakura.ne.jp/codeiq/hwbattle/)
- [ビット演算子：php.net](http://php.net/manual/ja/language.operators.bitwise.php)
- [Perl 記号ゴルフと Acme::EyeDrops：shinh.hatenablog.com](http://shinh.hatenablog.com/entry/20061107/1162835826)
- [Tips&Tricks - phpGolf：www.phpgolf.org](http://www.phpgolf.org/tips)
hello, worldの戦い 〜 #Min略d の参加者より

CodeIQで、「Minority's hello, world」という問題が出題されて、それに回答してみました。

# 問題
「hello, world」と出力するプログラムを提出して下さい。

提出されたプログラムで使われている文字を、全挑戦者について集計します。

各文字には「(その文字を利用した挑戦者の人数)の2乗」というポイントが割り当てられます。

提出されたプログラムのポイントは、そのプログラムで使われている文字のポイントの合計となります。

提出コードのポイントが少ない順に順位をつけます。最小ポイントの方が優勝です。

## 詳細
細かいレギュレーションとして、

*コードに書ける文字はASCIIの32〜126のみ、改行やタブ、漢字などは使用不可
*出力は標準出力へ、エラー出力は不可
*出力は「hello, world」もしくは「hello, world（改行）」のどちらか（表記ゆれ、間違いに注意）
というようなことがありました。

# 自分の回答
自分は、Rubyで回答してみることにしました。戦略としては、多くの人が使いそうな文字を避ける、ということが重要になるので、その辺りを考えて書くことにしました。

## 1回め
```rb:1回め.rb
%@4`1`8`8`B`5K`58`J`B`E`8`0@.split(?`).map{|q|putc(q.to_i(36)+100)}
```

まずは、二重引用符や角カッコを避けるために、文字列を[%記法](http://qiita.com/mogulla3/items/46bb876391be07921743)で表現して、しかも区切り文字には他の言語でも現れなさそうな@を使っています。そして、これまた出番の少なそうなバッククオートでsplitすることで、36進法の文字列配列を生成します。ここでも?+1文字という、あまり見慣れない文字列リテラルとして引用符を避けています。

あとは配列ごとに36進法から10進法に戻して、ASCIIコード指定で`putc`させるだけですが、eを使わないために`each`ではなく`map`としています（何かが生成されますが、出力されないので無視できます）。

とりあえずはこれでそこそこ上に来たのですが、しばらくすると半分を超えるほど順位が低迷して来ました。で、やはり**長い**ということに気づいて、コードの短さも意識して再作成してみることにしました。

## 2回め（最終形）
```rb:最終形.rb
$><<%W@68656C6C6F2C20776F726C64@.pack(%@H*@)
```

だいぶ長さが縮みました。まずは`$>`が標準出力で、それに`<<`することで出力を行います。その次はまたも%記法ですが、`%W@...@`では、中身を文字列にした配列を生成します。この状況で変数展開は不要なのですが、wは出力文字列中にあるので回避して大文字としています。

で、お題の文字列を16進で表した文字列1つの入った配列ができますが、それを[pack](http://docs.ruby-lang.org/ja/1.9.3/method/Array/i/pack.html)でデコードします（この関数自体が暗号みたいですね）。これまたしつこく%記法で引用符を回避しています。

全体にコードは短くなって、英小文字もpackの4つだけになりました。

# 結果発表
途中経過も追いかけていたのですが、[最終結果](http://nabetani.sakura.ne.jp/codeiq/hwbattle2/)としては11位（Rubyトップ）となりました。トップに来た戦略の「文字列のxor」は薄々思いついてはいたのですが、Rubyでできないために放置していました。

他の人が繰り出す技で気になったものが、

* PHPの関数名は大文字小文字を問わないのを利用
* PHPに入らず、そのまま`hello, world`だけ書く
* どう考えても、この勝負に向かなさそうなJavaであえて挑戦する姿勢

などです。
HTMLのイベント属性(onclickなど)のスコープについて

後輩から、以下のコードが動かないのがわからないという相談を受けた。(一部改変)

```html
<!DOCTYPE html>
<title>ugougo</title>
<form>
	<input type="button" value="送信" onclick="submit()">
</form>
<script>
	function submit() {
		alert(1);
	}
</script>
```

まさかと思ってやってみたが本当に動かない。`submit()`を呼ぶと`this.form.submit()`が呼ばれて本当にsubmitされてしまう。謎だ。

半時間ほど調べてみたところ、以下の仕様が見つかった。

> Lexical Environment Scope
1. Let Scope be the result of NewObjectEnvironment(document, the global environment).
2. If form owner is not null, let Scope be the result of NewObjectEnvironment(>form owner, Scope).
3. If element is not null, let Scope be the result of NewObjectEnvironment(element, Scope).
http://www.w3.org/TR/html5/webappapis.html#getting-the-current-value-of-the-event-handler

要するに、上の`submit()`は、機能的に以下のコードとほぼ等価である。

```javascript
with (this.form) {
    with (this) {
        submit();
    }
}
```

つまり、onclickから`id`を参照すると`this.id`が呼ばれ、`submit`を参照すると`this.form.submit`が呼ばれるのだ。キモいことこの上ないが、仕様なのでしかたがない。<del>もともと<code>&lt;script&gt;</code>にはtypeが指定できるのにイベント属性にはtypeが指定できないというエモい仕様だけど</del>

参考: [javascript - Why do an element's attributes appear in the scope of an inline function? - Stack Overflow](http://stackoverflow.com/q/20766922/2864502)
background-imageやborder-colorにcurrentColorを使う

# 変数みたいなことがでける
プレーンCSSで唯一使える変数（みたいなやつ）`currentColor`を使うと、`background-image`や`background-color`、`border-color`を`color`で設定できます。オメガ嬉しいときもあるけれど、日常的にはあってもなくても感もあります。

```html:html
<div class="foo red"></div>
<div class="foo green"></div>
<div class="foo blue"></div>
```

```css:css
.foo{
    width:100px;
    height:100px;
    margin:10px;
    background-image:linear-gradient(to bottom,
        currentColor 20%,
        transparent 20%,
        transparent 40%,
        currentColor 40%,
        currentColor 60%,
        transparent 60%,
        transparent 80%,
        currentColor 80%);
    border:1px solid currentColor;
}
.red{
    color:red;
}
.green{
    color:green;
}
.blue{
    color:blue;
}
```

## 動作サンプル
https://jsfiddle.net/lovalotta/7v65f36o/
【AWS】DevOps エンジニア – プロフェッショナルの模擬試験が受験できなくてハマった



どうも、iron千葉です。
DevOpsの勉強がてら、模擬試験(英語)を受験しようと思ってハマったのでメモしておきます。
たぶん、世の中で私ぐらいしかハマってないのでは？と思いますがw


# DevOps エンジニア – プロフェッショナルの模擬試験でハマった

[ここ](http://aws.amazon.com/jp/certification/certified-devops-engineer-professional/)に記載がある通り、英語での受験しかできないと書いてあります。

![スクリーンショット_2015-07-08_21_47_08.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/4fd69a2d-1d74-3dd3-ed7c-54a928ca39db.jpeg "スクリーンショット_2015-07-08_21_47_08.jpg")

そして、リンクからKRYTERIONにログインします。
そして、驚愕です。なぜか、DevOpsが模擬試験の一覧に表示されません。

![スクリーンショット_2015-07-08_21_17_24.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/7ff9b373-38e4-36e5-ebc2-02904c5c53f7.jpeg "スクリーンショット_2015-07-08_21_17_24.jpg")

プロファイルの編集からリージョンとか、住所とか変えたのですが一向にDevOpsが表示される形跡がありませんでした。

# ということで、このアカウントでの利用はあきらめた
よくわからなかったので、新規アカウントから新たにアカウントを作成しましたw
リージョンをアメリカにしてみました。

![受験者アカウントの作成__br__br__英語で入力してください。__Please_enter_your_information_in_English_.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/6330c883-262f-424f-e8ae-ab098b8636d7.jpeg "受験者アカウントの作成__br__br__英語で入力してください。__Please_enter_your_information_in_English_.jpg")

住所とかは日本で作ったものと同じものを入力しました。


# 結果受験できた
新規作成したアカウントで模擬試験を確認すると無事表示されました。


![スクリーンショット_2015-07-08_21_27_34.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/813aace3-1ef5-4cda-4642-5f1651fa5bb1.jpeg "スクリーンショット_2015-07-08_21_27_34.jpg")



そして、なぜか$20。
webでは$40と記載あったので、お得やん！と思って受験してみると問題数は20問でした（ソリューションアーキテクトは4000円で40問でした）
ただ、問題数が少ないだけっぽかったです。


# まとめ
日本語のアカウントでリージョン変えたら行けそうな気がするのですが、即時反映されないだけですかね？一晩寝て起きたら反映されている？
中の方、何か知ってたら教えてくださいm(_ _ )m
edmxファイルをカスタムツール実行するとFK名が１，２，３となってどれとリレーションしているかわからない問題をジェネレータを改造することで解消

多重でリレーションしているテーブルをDBからコードを自動生成すると以下のように変なネーミングになってどのカラムとリレーションしているかわからなくなります（相手のテーブル名順）。

```csharp:TableA.cs
    using System;
    using System.Collections.Generic;
    
    public partial class TableA
    {
                        .
                        .
                        .
        public virtual TableB TableB  { get; set; } 
        public virtual TableB TableB1  { get; set; }
        public virtual TableB TableB2  { get; set; }
        public virtual TableB TableB3  { get; set; }
    }
```


ttファイルを以下のように変えると解消されるよ。

```csharp:xxbefore.tt
// 50行目くらい 
        this.<#=code.Escape(navigationProperty)#> = new HashSet<<#=typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType())#>>();

// 200行目くらい
            _code.Escape(navProp),

```
↓↓↓↓↓↓↓↓↓↓↓

```csharp:xxafter.tt
// 50行目くらい 
        this.<#=code.Escape(navigationProperty.RelationshipType).Replace("_","")#> = new HashSet<<#=typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType())#>>();

// 200行目くらい
            _code.Escape(navProp.RelationshipType).Replace("_",""),

```


ビバ、エドマックス！
Evernoteが離れられないケドMarkdownは使いたいのだよ。


Evernoteを使いこなしすぎて離れられない現実。。

**でもMarkdownは使いたいよね。便利だもん。**

・
・
・

たいしたことできないけど(笑)

###そんなわけで
EvernoteにMarkdownで書くべく。本日、Marxicoを入れてみた♡



***
Chrome使ってるならコッチ → **[Marxico](https://chrome.google.com/webstore/detail/marxico/kidnkfckhbdkfgbicccmdggmpgogehop)**

WebAppならコッチ → **[Marxico](http://marxi.co/)**
***


*Qiitaに上げるならkobito。

*Evernoteに入れとくならMarxicoだねこりゃ♡

ツール変えるのは面倒だけど、なんでもやってみましょ♡
Hierarchy上のアセットを全て取得する

# 要件
取得したいものはHierarchyに表示されているGameObjectで、
アクティブかどうかを無視して取得してきたい。

# コード
```csharp
var objects = Resources.FindObjectsOfTypeAll(typeof(GameObject)) as GameObject[];

return objects
    .Where(d => !PrefabUtility.GetPrefabType(d).Equals(PrefabType.Prefab) && !PrefabUtility.GetPrefabType(d).Equals(PrefabType.ModelPrefab))
    .Where(c => c.hideFlags.Equals(HideFlags.None) || c.hideFlags.Equals(HideFlags.HideInHierarchy));
```
8章　selectを攻略する


# リレーションとは
属性のドメインの直積から、特定のタプルだけを選び出して、構成した集合。

# selectをデータを取得する唯一の手段

# テーブルのリスト→検索条件→カラムのリストの順番でカラムを決定する。


# 集約関数
sumとかavg、max、min、countなど。


# countは特殊な関数
nullに対して、0を返す。
他のだったらnullを返す。avgとかsumとか。

# group by
whereはgroup byの前に評価され、
havingはgroup byの後に評価される。　

# having whereの違い
集約関数を使う条件文を使用する場合havingを使用する。
where句の中では集約関数は使えない。

## whereの時はエラーが出る。
```
mysql> select * users where age > count(*);
```

→ Invalid use of group function 

## havingだとエラーが出ない。

```
mysql> select * users having age > count(*);
```

→　User

|  id | name  | age  |
|:-:|:-:|:-:|
| 1  | sato  | 23  |
|  2 | tanaka  | 31  |



# サブクエリとは
select句を入れ子にして埋め込む「サブクエリ」という。
userテーブル、年齢が、maleテーブルの平均年齢以上のレコードを取得したとする。
簡単ですね、男性の平均年齢以上のUserを取得したいときに、select文を入れ子にして埋め込みます。
入れ子になったクエリをサブクエリと呼びます。


```
mysql> select * from users where	age > (select avg(*) from males);
```

(select avg(*) from males) →　サブクエリ

結果↓

|  id | name  | age  |
|:-:|:-:|:-:|
| 1  | sato  | 23  |
|  2 | tanaka  | 31  |
|  4 | john  | 22  |
S3の100万オブジェクトを簡単に消す方法

# はじめに

とある案件のクロージングでS3のオブジェクトを消すのにちょっと苦労したので、その共有です。時間のない方はまとめだけよむとよいです。

# マネジメントコンソールから消す 1日目

AWSマネジメントコンソールにログインして、S3に移動、バケットを選択して「delete」
次の日になったら消えるだろうということで、その日はそのまま帰りました。

# マネジメントコンソールから消す 2日目、朝

朝、会社にくると、まったく消えていませんでした。STSをつかったログインだったので1時間程度で削除権限がなくなったようです。
IAMユーザーを作成して、そのユーザーで削除を実行しました。
その間、別の作業をすることにしました。

# マネジメントコンソールから消す 2日目、夜

夜、朝の作業をおもいだし、実行結果を確認しようとしました。
ですが、削除処理を実行しているブラウザ画面がどこかにいってしまいました。たぶん、別のページにリロードしてしまったのでしょう。バケットにオブジェクトは一杯のこっている雰囲気です。

ここで、S3のライフサイクルルールをおもいだしました。これは
「S3のオブジェクトに有効期限を設定する」
という機能で、期限のたったオブジェクトをアーカイブ(gracierに保存)、失効(削除される)が可能です。

#ライフサイクルをつかった削除方法

バケットを選択して、ライフサイクルを選択、「ルールを追加する」をクリックします。
![スクリーンショット 2015-07-08 21.05.37.png](https://qiita-image-store.s3.amazonaws.com/0/51203/04e5b445-445a-25c7-4fba-579178817128.png)

バケット単位の場合はなにも変更せず「ルールの設定」をクリック、一部のオブジェクトを消したい場合はプレフィックスを設定します。

![スクリーンショット 2015-07-08 21.00.50.png](https://qiita-image-store.s3.amazonaws.com/0/51203/5271fd86-169a-b80e-a3db-104ecf460fef.png)

最新バージョンの操作は「失効のみ」を選択します。
失効する日は1日後(1が最小値です)。
「レビュー」をクリック
![スクリーンショット 2015-07-08 21.00.10.png](https://qiita-image-store.s3.amazonaws.com/0/51203/5303139f-29f4-4b64-d606-2e39aa130ffa.png)

必要ならルール名を入力して「ルールの作成と有効化」をクリック
![スクリーンショット 2015-07-08 21.10.09.png](https://qiita-image-store.s3.amazonaws.com/0/51203/9175fb12-2438-38b0-3c39-018e1b13a9ad.png)

バケット画面をみるとルールが追加されていることが確認できます。
![スクリーンショット 2015-07-08 21.10.36.png](https://qiita-image-store.s3.amazonaws.com/0/51203/7b64eabd-ef7a-678e-6346-389a948282dc.png)


# マネジメントコンソールから消す 3日目、昼

UTCだと日付の区切りが朝9:00なので、少し時間をまってお昼に確認したところ無事全部のオブジェクトが削除されていました。メデタシメデタシ。

# まとめ

S3の100万オブジェクトの削除は時間がかかるので、ライフサイクルルールをつかうとよいです。一日かかりますが、確実にファイルは消えます。
でも、これ間違って使うと恐ろしい機能ですのでご注意ください。
【VBA】コントロールをクリックして連番をふる。

画面の画像を全選択して、マクロを登録。
グリッドに１～XXXの数字を登録
はじめたい数字のセルをくりっく
図形を選択すると数字が入る
最後にマクロ削除を実行する



Sub 文字列取込()
   With ActiveSheet.Shapes(Application.Caller)
      If ActiveCell.Value <> "" Then
         .TextFrame.Characters.Text = ActiveCell.Value
      End If
   End With

       ActiveCell.Offset(1, 0).Select

End Sub





Sub マクロ削除()
Dim shp
For Each shp In ActiveSheet.Shapes
shp.OnAction = ""
Next
End Sub


------------------------------------
「おまけ:連番をふるマクロ」

For i = 12 To 999
   For ii = 1 To 400
    int count = 8504
    Range("P" + count).Select
    count++
    Next
Next
    

count = 403690
For i = 12 To 13
   For ii = 1 To 2
    Range("P" + CStr(count)).Select
    ActiveCell.FormulaR1C1 = CStr(i)
    count = count + 1
    Next
Next


count = 100008
Dim moji1 As String
moji1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim moji2 As String
moji2 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
For i = 1 To 26
   For ii = 1 To 1 '62
    Range("P" + CStr(count)).Select
    ActiveCell.FormulaR1C1 = CStr(Mid(moji1, i, 1))
    count = count + 1
    Next
Next


◆重複行の削除
For i = 6 To 20

'行ごとのカウント
Dim cntAtRow As Long

cntAtRow = WorksheetFunction.CountIf(Range("$C$" + CStr(i) + ":$C$20"), Range("C" + CStr(i)))

If cntAtRow > 1 Then

Range("C" + CStr(i)) = ""

End If

Next
Atomパッケージの作り方（超入門）

Atomのバージョン1.0でパッケージを作った時のメモ

* ひな形を作るには、コマンドパレットから `Package Generator: Generate Package` を実行
* 開発ツールは `cmd + option + i` で開く。(あとはGoogle Chromeと同じ感じ)
* package.json に dependencies 等を追加したあとは、コマンドパレットから `Update Package Dependencies: Update` を実行。(node_modules配下に格納されるので、ブレイクポイントの設定等も可能)
* リロードは、コマンドパレットから `Window: Reload` を実行。（[View -> Developer -> Open In Dev mode...]で開けばいいよ、という記事も見たけど自分の環境だと怪しかったので、毎回リロードするようにした。。。）
* Javascriptで `debugger` と書いてもデバッガが起動せず原因が分からなかった。（無限ループしてるように見えた）
  * 代替ツールを探したものの、いいツールを見つけられなかったので、古典的な `console.log` デバッグをした。。。
* パッケージレジストリに登録するには、
  * https://atom.io/ にサインインする。
  * [アカウントページ](https://atom.io/account) にAPIトークンが表示されているのでコピー。
  * ターミナルから `$ apm publish minor` 実行。（パッケージのディレクトリで）
  * APIトークンを聞かれるので、先ほどコピーした値をペースト。
MermaidのプレビューができるAtomパッケージを作った 


[mermaid.jsが素晴らしいけどなかなか使ってる人見かけないので実例晒す](http://qiita.com/uzuki_aoba/items/a01f8b0b52ced69c8092)

以前からmermaid.jsを使ってたけど、ブラウザ上でしか使えず不便だなと思ってました。
そんなおり、上記の投稿を見ました。しかし残念ながらAtom editorのパッケージは紹介されておらず、探してもAtom用は無さそうでした。
そこで自分で作ってみました。

https://github.com/y-takey/atom-mermaid

パッケージレジストリにも登録しているので、Atomから[Preferences -> install]で"mermaid"と検索すると、ヒットします。

正直なところ、現状はまだかろうじてプレビューが表示されるという状態で、図が小さくて見にくかったり、まだまだ改善点があります。
もし使っていただけて何かあればGithubにissueを立ててくださると嬉しいです。
ちなみにGithubでは無理して適当英語を使ってますが、issueは日本語でも大丈夫です！
CMakeをつかったmake時にdoxygenが実行されるような方法

#はじめに

CMakeの設定ファイルCMakeLists.txtにdoxygen関連の記述をする方法について述べます．まとめると以下の２点です．

* ``make``時にコンパイルと一緒にdoxygenを実行できる
* CMakeLists.txtに書かれたバージョン番号をdoxygenの設定ファイル(Doxyfile など．以下ではdoxygen.conf)に書くことができる．いちいち設定ファイルにあるバージョン番号をいじる必要がない．

#必要なもの

* Doxygen用のコメントがついた自作のライブラリ(以下の説明では，自作のライブラリ https://github.com/tmichi/mibase を使用しています) 
* Doxygen (http://www.doxygen.jp)

Windows, Macの両方でできたことを確認しています．

# 参考資料

* https://github.com/qknight/libnoise

# ファイル
必要なことは，以下の３つです．

* CMakeLists.txtで定義した変数を埋め込んだ設定ファイルdoxygen.conf.inを用意する．
* CMakeLists.txtに，(1)doxygen.conf.inからdoxygen.confを生成する，(2)doxygenを実行する，(3)インストール先を指定する記述を追加する．
* (オプション) doxygenがない場合の処理を追加する．


```cmake:docs/CMakeLists.txt
FIND_PACKAGE(Doxygen)
IF(DOXYGEN_FOUND)
        SET(DOXYGEN_CONF_FILE "doxygen.conf")
        SET(DOXYGEN_CONF_PATH   ${CMAKE_CURRENT_BINARY_DIR}/${DOXYGEN_CONF_FILE})
        SET(DOXYGEN_SOURCE_DIR ${CMAKE_SOURCE_DIR})
        SET(DOXYGEN_TARGET "doc" )

        CONFIGURE_FILE(${DOXYGEN_CONF_FILE}.in ${DOXYGEN_CONF_PATH})

        ADD_CUSTOM_TARGET(${DOXYGEN_TARGET}
                        ${DOXYGEN_EXECUTABLE} ${DOXYGEN_CONF_PATH}
                        DEPENDS  ${DOXYGEN_CONF_PATH})
 # この設定だと Macでmake docしなかった場合に，make installしたらエラーが出るので，コメントアウトして保留 (15/07/09)
 #       IF (WIN32)
 #               # to do .
 #       ELSE()
 #               INSTALL( DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/html/"
 #                        DESTINATION "/usr/local/share/doc/${PROJECT_NAME}-${VERSION_STRING}" )
 #       ENDIF (WIN32)
ELSE(DOXYGEN_FOUND)
#ない場合は，warningを出す．
        MESSAGE (WARNING "doxygen binary couldn't be found")
ENDIF(DOXYGEN_FOUND)
```
``# to do ``とかいてある部分は，Windowsでインストールする際に，どこにおけばいいかわからなかったので空欄にしています．

```:doxygen.conf.in
DOXYFILE_ENCODING      = UTF-8
PROJECT_NAME           = @PROJECT_NAME@
PROJECT_NUMBER         = @VERSION_STRING@
(以下省略)
```
``@PROJECT_NAME@`` や ``@VERSION_STRING@``は ルートのCMakeLists.txtで定義済みの変数です．

以上の設定で，``cmake .. ``　とでもやると，doxygen.confが作成されて，``make doc`` でdoxygen が走ります．Windowsでもちゃんとできたのが嬉しいです，
AnimationCurveのプリセットにペナーイージングを加える

Unity標準のAnimationCurveプリセットが貧弱なので、[ペナーイージング](http://easings.net/ja)で計算したカーブからプリセットを生成してみました。

https://github.com/nobutaka/EasingCurvePresets

この[.curves ファイル](https://raw.githubusercontent.com/nobutaka/EasingCurvePresets/master/Assets/Editor/EasingCurves.curves)を適当なEditorディレクトリに配置すれば、以下のようにおなじみのカーブ(41種類)を使えるようになります。

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/21130/ecfc9703-2d69-a9bb-8dde-9d66a9dc0162.png)

サンプリングして作ったデータなので制御点は多めですが、簡単に使えるのでお試しあれ。
RAID Z2の構築、運用

CentOS 6.5
#ステップ1: zfsサービスの導入
まず、以下のサービスをyumる。
```
yum install zlib-devel libuuid-devel lsscsi
```
splとzfsを取ってきて、rpmパッケージをインストールする。
http://zfsonlinux.org/

```
./configure
make rpm
rpm -Uvh *.x86_64.rpm
```

# ステップ2: partedでHDDにラベルをつける
全てのHDDにラベル付けを行う。
```
parted /dev/任意のid
(parted) mklabel gpt
(parted) quit
```

# ステップ3: zfsでプールを作成し、マウントを行う。
1) ```zpool create zfspool raidz2 全てのHDDのシリアルナンバー spare HDDのシリアルナンバー```
2) zfs create zfspool/raid2
3) zfs set mountpoint=ディレクトリ zfspool/raid2
4) zfs mount -a

# ステータス確認
```zpool status -v```: ステータス

# 交換方法

1) ```zpool replace 壊れたシリアル spareのシリアル```
2) % doneでチェック
3) zpool detach 壊れたシリアル
4) HDDを外し、新しいのをつける
5) zpool add spare シリアル

# コメント
## rebootで自動マウントがされない場合
selinuxが起動している可能性あり、getenforceで確認
```vi /etc/selinux/config```で編集
Cloud Academy EBS

#EBSをやってみた！！！

今日はCloud AcademyでEBSについて学びました。

Cloud Academyでは　
　

①コースでレクチャーを受ける（ビデオクリップをみて内容を理解）
②labで実際にやってみる。（説明がとても丁寧なのでわかりやすい）

③最後に自分が理解したことをこのqiitaにまとめるようにして、整理する

![スクリーンショット 2015-07-08 18.55.24.png](https://qiita-image-store.s3.amazonaws.com/0/84382/2911565d-55e3-c9c0-61b0-2c9a1aa1afe6.png)

#EBSのまとめ

①EC2インスタンスにアタッチして使用するストレージサービス

②OSやアプリ、データの置き場などさまざまな用途で利用される

③snapshot機能によるS3へのバックアップやディスクの暗号化機能がある

④９９．９９９％の可用性を備えるように設計されている

特徴としましては
①容量を１GB単位で決めることができる。最大で１６まで
②AZごとに独立しているため、同一のAZのインスタンスからしかアクセスできません
③snapshotから任意のAZに復元できる
④EC2インスタンスに複数のEBSを接続できるが、EBSを複数のインスタンスで共有することはできない
⑤セキュリティグループ通信制御の対象外。全ポートを閉じてもEBSは使用可能

詳しくはこちらを参照に
<iframe src="//www.slideshare.net/slideshow/embed_code/key/Jd4tH1qkb6HtM5" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/AmazonWebServicesJapan/20150408-aws-blackbeltelasticblockstore" title="AWS Black Belt Techシリーズ 2015 Amazon Elastic Block Store (EBS)" target="_blank">AWS Black Belt Techシリーズ 2015 Amazon Elastic Block Store (EBS)</a> </strong> from <strong><a href="//www.slideshare.net/AmazonWebServicesJapan" target="_blank">Amazon Web Services Japan</a></strong> </div>

みなさんもぜひ使ってみてくださいね！！
Azure blob storageのデータをwindows上にてまとめてDL

## 概要

Azureのblob storageからデータをまとめてDLしたい。

そこで[Azure Storage Explorer](https://azurestorageexplorer.codeplex.com/)とか使えばぱぱっとDLできると思ったらなぜかタイムアウトしたりで全部まとめてDLできなかった。

そこで別の手段としてつ[Microsoft Azure Storage で AzCopy を使用する方法](https://azure.microsoft.com/ja-jp/documentation/articles/storage-use-azcopy/)など試してみた。

## やってみた
[蒼の王座AzCopy–Windows Azure Blob用のファイルアップロード・ダウンロードツールがリリース - 蒼の王座](http://sqlazure.jp/b/windows-azure/1384/)

とかもみつつexeをwindowsにインストールして、

```bash:
# cmd.exe開く
cd %ProgramFiles(x86)%\Microsoft SDKs\Azure\AzCopy

# コンテナ単位で全てDL
AzCopy.exe /Source:https://<storage_account>.blob.core.windows.net/<container_name> /Dest:<dst_path> /SourceKey:<storage_account_key> /S 

```

でできた。

めでたしめでたし。
1000ファイル位あっても数MB/sでDLできたので何より。

logファイルなりなら、サービスバスなり別のサービスをblob storageにつなげてぱぱっと解析するプラットフォームを作れという話もある。
Elastic BeanstalkでELBのHTTPS設定（CLI編）

## 問題

EB cliのv2までは`option settings`で以下のような記述で`eb update`したらHTTPSの設定ができていたけど、新しいv3では[対応しなくなった](http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli.html#eb-cli2-differences)。

```
[aws:elb:loadbalancer]
LoadBalancerHTTPSPort=443
SSLCertificateId="arn:aws:iam::123456789012:server-certificate/ssl_2015"
LoadBalancerSSLPortProtocol=HTTPS
```
や

```
option_settings:
  - namespace: aws:elb:loadbalancer
    option_name: LoadBalancerHTTPSPort
    value: 443
  - namespace: aws:elb:loadbalancer
    option_name: SSLCertificateId
    value: "arn:aws:iam::123456789012:server-certificate/ssl_2015"
  - namespace: aws:elb:loadbalancer
    option_name: LoadBalancerSSLPortProtocol
    value: HTTPS
```

## 現状

`eb config`でeditorを開いて[編集しろ](https://forums.aws.amazon.com/thread.jspa?messageID=581394#581394)との事ですが、Web consoleを使うのと大差ない上、いかんせん面倒くだい。

## 解決

なので、eb cliは使わずにaws cliで設定する

```
aws elasticbeanstalk update-environment --environment-name can-pass-production --option-settings Namespace=aws:elb:loadbalancer,OptionName=LoadBalancerHTTPSPort,Value=443 Namespace=aws:elb:loadbalancer,OptionName=LoadBalancerSSLPortProtocol,Value=HTTPS Namespace=aws:elb:loadbalancer,OptionName=SSLCertificateId,Value=arn:aws:iam::123456789012:server-certificate/ssl_2015
```

ふう。

ref:
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli.html#eb-cli2-differences
mysql2+capybara+poltergeistでrspecを動作させるとThis connection is in use by Threadというエラーが出る時の対策

備忘録としてメモします。

#問題
表題の通り、mysql2、capybara、poltergeistを組み合わせたrapecのテストで、下記のエラーが発生しました。

````
This connection is in use by: #<Thread:0x007fd32136efd8 sleep>
````


#対策
[github gist :josevalim / shared_connection.rb](https://gist.github.com/josevalim/470808)でmrsimoさんが示した内容です。

````spec/support/active_record.rb
class ActiveRecord::Base
  mattr_accessor :shared_connections
  self.shared_connections = {}

  def self.connection
    shared_connections[connection_config[:database]] ||= begin
      retrieve_connection
    end
  end
end

module MutexLockedQuerying
  @@semaphore = Mutex.new

  def query(*)
    @@semaphore.synchronize { super }
  end
end

Mysql2::Client.prepend(MutexLockedQuerying)
````

自分の環境では、spec/supportに上記のファイルを追加すると、テストが通るようになりました。
以上です。

# 参考
https://gist.github.com/josevalim/470808
Vimの正規表現を使用してグループ毎に置換する方法

Vimで正規表現を使用してグループ毎の置換をしたい時、Perl等の正規表現とは違って独特の
書き方をしないといけないので注意すること。 よく自分が忘れるのでメモを残した。

1. `(.*)`と書けばいいところを、`\(.*\)`のように`\`を`(`, `)`の前に加えなければならない。
2. `$1`、`$2`...は`\1`、`\2`のように書かなければならない。

以下のコマンドを実行すると、その下の実行結果のようになる。


```txt:実行前
status=ステータス
dataList=データ一覧
deptid=ユーザの組織ID
userid=ユーザID
updateDate=更新日時
```

```vim:コマンド
:%s/\(.*\)=\(.*\)/hashMap.put("\1", "\2");/g
```

```java:実行後
hashMap.put("status", "ステータス");
hashMap.put("dataList", "データ一覧");
hashMap.put("deptid", "ユーザの組織ID");
hashMap.put("userid", "ユーザID");
hashMap.put("updateDate", "更新日時");
```

# 参考

Vimで使える正規表現
http://archiva.jp/web/tool/vim_regexps.html
CentOS7 yumでproveコマンドをインストールする方法

CentOS 等でproveを使いたいけど、いちいちcpanやcpanmには頼りたくないときのtips

proveは`perl-Test-Harness`という名前のrpmパッケージなので下記のようにすればおｋです。

```
yum -y install perl-Test-Harness
```
Rspecの"should"か"expect"か。"it"か"specify"か。

## Rspecはshouldでもexpectでも書けるけど、どっち使えば？
Rspecにおいてpage変数を使うと、指定したpageがあらかじめ意図した要素をちゃんと持っているか、テストを行う事ができます。

例えばサインインするためのページに、ちゃんとサインインへのリンクが貼ってあるかどうかのテストをする時

```rb:sample.rb
describe "Signin page" do
  before { visit signin_path }
  it "should have right content" do
    expect(page).to have_content('Sign in')
    expect(page).to have_title('Sign in')
  end
end
```

しかし上記の方法だとテストする要素が多くなるにつれて、page,page,page,page...と修行僧のように連呼することになるので以下のようにするとすごくすっきりする。

どんどんDRYにするのだ・・・(良い言葉だ

```rb:sample.rb
describe "Signin page" do 
  before  { visit signin_path }
  subject { page }
  it { should have_content('Sign in') }
  it { should have_title('Sign in')   }
end
```

使える文法のバリエーションは結構多いので、letやsubject、beforeなどでどんどん冗長さを取り除いてDRYにすると、メンテナンス性も高まりますね。

**do~endがひとつ減るだけでもうれしい！！！！**

## itとspecifyの使い分け

部分的にexpectを使ったりして、itで自然言語的におかしくなる所は要所要所でspecifyとかに変えるとなお良さそう。(わかってる感を出してみんなでドヤ顔しよう！！！！)


```rb:sample.rb
describe "when submitting a GET request" do
  before  { get root_path }
  specify { expect(response.body).to match('Home')}
end

```

注）itでもspecifyでもどちらでも通ります
注）specify...明示する、明記するなどの意味
この場合はそのまま主語としてitを使うと、不自然になります。

結局人間がいつか読む事になるので、こういうクセをどんどんつけていこう(ง ˆᴗˆ)ว
PHP で ORA-24315: illegal attribute type error が出る場合

PHP から Oracle へ接続しようとした時、 **ORA-24315: illegal attribute type error** が表示される場合があります。

この場合、 `php.ini` で、どの oci8 ドライバを使用しているか確認しましょう。

```ini
extension=php_oci8_11g.dll   ;; Oracle 11g 以降のバージョンで使用可能
extension=php_oci8.dll       ;; すべてのバージョンで使用可能
```

`php_oci8_11g` を使用している場合は、 `php_oci8` に変更してみましょう。
Oracle11g を使用していても、Oracle Instant Client のバージョンが古いと  `php_oci8_11g` が使用できません。

phpinfo() の **OCI8** の項目に Oracle Instant Client の項目があるので確認してみましょう。

`Oracle Instant Client 10.2` となっていた手元の環境では、 `php_oci8` を使用することにより **ORA-24315** は解消されました。
MySQLコマンドの履歴を消す

# 背景
更新SQLとか、削除SQLとか実行したあとに、再び同じSQL実行しないようにしたい

# 実行

`.mysql_history`ファイルを削除する。`select`はあると便利なときもあるため、常に削除する方法は掲載しない。

```
$ rm ~/.mysql_history 
```