OmniAICreator/Qiita-1.07M huggingface dataset:
Snap.svgでホバーアニメーションを要素ごとにやってみる。


Snap.svg触ってみています。
というかSVG自体ほぼ初めてです。

知り合いエンジニアの方に教えてもらったのですが、ここのサイト([Snap.svgの使い方まとめ](http://www.h2.dion.ne.jp/~defghi/snapsvg/snapsvg.xhtml))が良いみたいなので参考にして書いてみています。

##要素ごとにアニメーションさせたい

![](http://i.gyazo.com/0574427e35ba0816c2565b9260b02bd2.png)

こんな感じで四角を作って、各要素ごとにアニメーションさせたいです。

![](http://i.gyazo.com/b0dcec2dd7cc0e660e101a85802d3d80.gif)

```svg.js
  var paper = Snap(200,200).remove().attr({viewBox: [0,0,200,200]});
  var rect = [];
  
  rect[0] = paper.rect(10,10,30,30).attr({fill:"red"});
  rect[0].mouseover(function(e){
    rect[0].attr({fill: "blue"});
  });
  rect[0].mouseout(function(e){
    rect[0].attr({fill: "red"});
  });
  
  rect[1] = paper.rect(10,50,30,30).attr({fill:"red"});
  rect[1].mouseover(function(e){
    rect[1].attr({fill: "blue"});
  });
  rect[1].mouseout(function(e){
    rect[1].attr({fill: "red"});
  });

  }
  
  rect[2] = paper.rect(10,90,30,30).attr({fill:"red"});
  rect[2].mouseover(function(e){
    rect[2].attr({fill: "blue"});
  });
  rect[2].mouseout(function(e){
    rect[2].attr({fill: "red"});
  });

  }
  
  var container = document.querySelector("#container");
  paper.prependTo(container);
```

##for文でまとめたら`'attr' of undefined`って怒られた。

こんな感じにしたら` Uncaught TypeError: Cannot read property 'attr' of undefined`と怒られました。

```svg.js
  var paper = Snap(200,200).remove().attr({viewBox: [0,0,200,200]});
  var rect = [];

  for(var i = 0; i < 3; i++){
    var y = 10 + i * 40;
    rect[i] = paper.rect(10,y,30,30).attr({fill:"red"});

    rect[i].mouseover(function(e){
      rect[i].attr({fill: "blue"});
    });
    
   	rect[i].mouseout(function(e){
     rect[i].attr({fill: "red"});
    });
  }
  
    var container = document.querySelector("#container");
  paper.prependTo(container);
```

###イベント発火時はthisを使うと上手くいった

`rect[i].attr()` を `this.attr()`に変更すると上手くいきました。

```
    rect[i].mouseover(function(e){
      this.attr({fill: "blue"});
    });

    rect[i].mouseout(function(e){
      this.attr({fill: "red"});
    });
```

thisの参照がかわるみたいですね。

Snap.svg便利っぽいのでもう少し触ってみます。
CoffeeScriptでCMSを作成するフレームワーク「code:JS」チュートリアル（１）

# code:JSを使えるようにする
code:JSを動かすサーバーでは、

1. PHP5.3
1. CoffeeScript
1. SQLite3
1. ImageMagick

が使えるようになっている必要があります。
この他に、PHPからSQLite3を使えるようにするライブラリもインストールされている必要があります。
環境が整った状態で、[githubのcode:JS](https://github.com/digitarhythm/codeJS)ページからフレームワークをクローンしてください。
そして、

**[フレームワークのディレクトリ]/bin**

にパスを通しておいてください。
PHP5.3をCGIとCLIで実行でき、CoffeeScriptがコンパイル出来る状態であれば、code:JSを使うことが出来ます。

# 新規プロジェクトを作成する
**DocumentRoot**配下のWebブラウザでアクセス出来るディレクトリで、以下のコマンドを実行するとcode:JSプロジェクトが作成出来ます。

$ **codejs new [プロジェクト名]**

プロジェクト名を「project01」にした場合の例は、

$ **codejs new project01**

になります。
正常に実行出来た場合は、カレントディレクトリに「**project01**」というディレクトリが作成されていることを確認してください。
以降は、「**project01**」というディレクトリ内で作業をするという前提で進めます。

# viewを作成／表示する
プロジェクトディレクトリ「**project01**」が作成されましたら、「**appscode**」というディレクトリに入ってください。
そこにある、「**applicationMain.coffee**」というファイルが、Webアプリケーション実行時に最初に呼ばれます。
ですので、この「**applicationMain.coffee**」に処理を記述していきます。

```coffeescript
class applicationMain extends JSObject
    constructor:(@rootView)-> super()
    didFinishLaunching:->
        ### 
        Please describe the user code below from here.
        Please arrange an indent with the head of this comment. 
        ### 
```
上記のようになっていると思います。
処理は、「**didFinishLaunching**」メソッドに記述していきます。
CoffeeScriptなのでインデントに注意してください。
ここに、下記のソースを追記します。

```coffeescript
        view = new JSView(JSRectMake(8, 8, 320, 240))
        @rootView.addSubview(view)
```
修正が終わりましたらコンパイルをするのですが、ソースファイルの変更を監視して変更があった場合に自動的にコンパイルするコマンドを用意しています。
ソースを編集しているターミナルとは別のターミナルで、プロジェクトディレクトリトップ（**project01**直下）で、

$ **codejs build**

と実行してください。
自動的に今あるソースをコンパイルし、監視状態に入ります。
この状態で先ほど修正していたソースを保存してみてください。
自動的にコンパイルが行われるのを確認してください。

エラーが出ずにコンパイルが終了しましたら、Webブラウザでプロジェクトディレクトリトップにアクセスしてください。
左上にグレーの四角が表示されていれば正解です。
これは、

**JSViewというクラスを使い、320x240のサイズでオブジェクトを生成し、画面の(8, 8)の位置に表示しろ。**

という処理になります。
次に、**addSubview**の下に、

```coffeescript
        view.setDraggable(true)
```
というコードを追記してください。
正常にコンパイルが行われましたらWebブラウザをリロードしてください。
見た感じは先ほどと変わりませんが、グレーの四角にマウスカーソルを重ねるとマウスカーソルが指アイコンになっていると思います。
そして、グレーの四角をドラッグすると移動させることが出来ます。
このコードは、

**viewのドラッグ機能を有効にしろ。**

という処理になります（この処理はjQueryUIを使っています）。
このように、Viewを生成しパラメーターをいろいろ設定し画面を構成するのが、code:JSの基本的な画面生成方法になります。
GoogleAppEngine for Go を同一Wi-Fiネットワーク内でSmartPhoneから確認する

# はじめに
今回は下記環境で確認した

* Macbook Air OSX 10.10.1
* Google Cloud SDK 0.9.43
* Xperia SO-04E　Android4.2.2

# プライベートIPアドレスを確認
システム環境>ネットワークを表示し、左ペインからWi-Fiを選択し、
右ペインの状況に表示されているIPアドレスをコピーする
「192.169.3.103」など、PCにより異なる

# GoogleAppEngineLauncherにApplicationを登録
GoogleCloudSDK内にインストールされている「GoogleAppEngineLauncher.app」を起動する.
> **NOTE**
> 当方の環境では下記にインストールされている
> google_cloud>google-cloud-sdk>bin>GoogleAppEngineLauncher.app

メニュー>File>Add Existing Application
ダイアログにてProjectのルートディレクトリをPathに設定
> **NOTE**
> 今回は事前に[HelloWorldを表示するProject](http://qiita.com/Yuki_312/items/12bdc0017033f383fa9d)を作成


# GoogleAppEngineLauncherにIPアドレスを設定する
追加したプロジェクトをダブルクリックしてApplication Settingsを開く
下記Portを設定する
`Admin Port：8002`
`Port：10080`
`Extra Flags：--host=192.169.3.103`

# 実行
GoogleAppEngineLauncherから追加したプロジェクトを選択しRUNボタンで実行する
SO-04Eのブラウザアプリからアドレスバーに下記を設定して実行
`192.169.3.103:10080`
「HelloWorld」が表示されれば成功
> **NOTE**
> GoogleAppEngineLauncher以外でGAEを実行していると表示されないことがあるため、確認プロジェクト以外は停止しておくことを勧める

以上
プログラマになること#10 幸せのインスタンス


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#出会い
敬愛する師匠から、「この娘に何とかWebを教えてあげてくれませんか？」
Yes以外の回答なし。やりますとも、当たり前です。

#Webインターン大丈夫かい？
彼女なりに頑張っとるんだが…
確かにグラフィックでの就職は難しい。
気持ちはわかるが、現実はあまりにも厳しい。
ちょいと教えてみたけれど、なかなか入らん。
卒業時期が近づいてきて、インターンのチャンスが来る。

#見つけてくれた人
インターン先で、素晴らしいエンジニアと出会います。
彼は、彼女の「美点」を見つけ、伸ばします。
色々あったみたいだけど、彼の庇護の元働くこととなりました。

#可愛い人であること
私達が「こいつは何とかせねば」と「紡いで」いったのは「人として可愛いい」からなのです。
//本人の名誉の為にルックスもいいのですよ.
ずっと大変な思いをしてきて、荒れた時期もあったろうけど、美しい心を保ち続けた。故に、皆、何とかしようと行動したのです。

#幸せのインスタンス
彼女の出会ったエンジニアを含め３人でお食事しました。楽しかった。
この出会いも大事にさせてもらうよ。
幸せなクラスを考えよう、幸せのインスタンスを作ろう。
いつか君の言葉として、誰かに伝えて下さい。
Quickでテスト書く#1


プロジェクトをつくって簡単なテストが通るのを確認するまで。

##必要なもの

- [Quick](https://github.com/Quick/Quick)
- [Nimble](https://github.com/Quick/Nimble)

をcloneしておく。


##テストコードを書く準備

###プロジェクトをつくる
なんでもいいけど今回はSingleViewでやる。

![New Project](https://qiita-image-store.s3.amazonaws.com/0/53664/f2e467a2-01c3-e3e6-5596-17a6fb5c0c5d.png "New Project")



###テストターゲットにQuick.xcodeprojとNimble.xcodeprojを追加する


プロジェクトの中にある`○○Tests`を右クリックして`Add Files to ○○`を選択。

![Add Files](https://qiita-image-store.s3.amazonaws.com/0/53664/47247402-b06f-eeb3-b738-35a4d63528ca.png "Add Filesを選択")

cloneしておいた`Quick.xcodeproj`を選択。

![Quick.xcodeprojを選択](https://qiita-image-store.s3.amazonaws.com/0/53664/1b5175f8-f8e4-7529-b9b1-7cf435778536.png "Quick.xcodeprojを選択")

というのを`Nimble.xcodeproj`でもやる。

こんな感じ。
![Quick.xcodeprojとNimble.xcodeprojを追加した](https://qiita-image-store.s3.amazonaws.com/0/53664/06379c0e-f379-2767-eafc-70b23b6a8371.png "Quick.xcodeprojとNimble.xcodeprojを追加した")


###Quick.frameworkとNimble.frameworkをリンクする

プロジェクトを選択してTARGETSの`○○Tests`を選択して`Build Phases`タブを表示。
`Link Binary With Libraries`を開いて`+`マークを押す。

![○○TestsのBuild Phasesタブ](https://qiita-image-store.s3.amazonaws.com/0/53664/7e37d0e9-cf50-a723-729a-cc728db98bb9.png "○○TestsのBuild Phasesタブ")

`Quick.frameworks`を追加。
OSX用とiOS用があるので注意。今回はiOS用を選択。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/53664/8330a3a8-b5f0-5cdd-5f68-072eb4f15c7c.png "6.png")

というのを`Nimble.framework`でもやる。

こんな感じ。

![Quick.frameworkとNimble.frameworkをリンク](https://qiita-image-store.s3.amazonaws.com/0/53664/fff6eaac-a2d8-c759-bd1e-f8964e31cdc5.png "Quick.frameworkとNimble.frameworkをリンク")


##テストコードを書く

`○○Tests.swift`を`○○Spec.swift`に改名して、中身も書き換える。
`QuickSpec`クラスのサブクラスをつくり、`spec`メソッドを`override`してテストコードを書いていく。

![○○Spec.swiftを書き換える](https://qiita-image-store.s3.amazonaws.com/0/53664/ea99ce66-bba4-926d-be25-81f51b653b65.png "○○Spec.swiftを書き換える")


こんな感じ。

![1 + 2 = 3 のテスト](https://qiita-image-store.s3.amazonaws.com/0/53664/074dd9d4-bda0-a952-cbcc-81c24e266354.png "1 + 2 = 3 のテスト")


##テストを走らせる
`⌘ + U`

![Test Succeeded](https://qiita-image-store.s3.amazonaws.com/0/53664/610f2cf7-bbf0-a23b-2749-b0d36478a0d0.png "Test Succeeded")

`Test navigator`でも確認できる。

![Test navigator](https://qiita-image-store.s3.amazonaws.com/0/53664/cc8c8880-7f09-2ab0-955f-e75236c18253.png "Test navigator")

という感じでテストを書いていく。


[\#2](http://qiita.com/keiskimu/items/31d436f15ce93ec7a490)があると思うなよ
Secure AWS Users Meetup #1に参加してみた


こんにちは、ひろかずです。
2015年1月22日開催のSecure AWS Users Meetup #1に幸運にも参加することができたので、カジュアルに一筆書きます。

ダイニング・キッチンのような会場でリラックスムードでの会でした。

#お品書き
1. How to secure your AWS API
2. Slackで作る社内SOC
3. IAM ユーザー管理：awscliを用いたユーザー管理とIDフェデレーションの比較
4. [LT]セキュアだ！freeeだ！
5. [LT]Attack on AWS, ec2 + honeypot
6. [LT]セキュリティの設定、どこまでやってますか？
7. [LT]IAMでの権限設定をひたすらがんばっている話

#1.How to secure your AWS API
AWS上の侵入検知/防御

* WAFを入れてもロジックバグは防げない。(脆弱性診断が必須)
* 考え方はオンプレと変わらない。(NWが触れないくらい)
* AWSの操作はAPIでできるので、とにかくAPIを守る。APIを触られないことが前提。
* 事故事例：bitcoin採掘(AccessKey/Secretkeyがgitから漏れる)

ソリューション

* IAMで権限絞る(rootアカウントはMFAにして封印する)
* 標準ポリシー(必要最低限)は、グループ単位で作成する。
* コンソールユーザにはMFA必須にしたいけどポリシーでは絞れないので、Credential ReportでMFA設定していない人を検出
* アクセスキー管理は、envchainを使うといい。(Macユーザ向け)
* ポリシーの変更管理は、miamを使うといい(ポリシーをtxt管理：gitっぽく)

ポイント

* 気付くためには、APIコールのログを取る => cloudtrail
* ログはS3に入るけど、MFA Deleteで縛る。
* 見るポイントは「失敗の兆候」
* Conditionは、時間帯とか細かく使えるけど、使いすぎると複雑化する。

#2.Slackで作る社内SOC

* SOCとは、Security Operation Centerのこと。
* 各社扱っているものが違うので、ログ分析をアウトソースするのもポイントがズレる。
* 社内でログ監査しようにも体制がない。

ソリューション

* slackをSOC基盤にする。(みんな見れるし)
* ログをfuletdで集めてSlackに流す。(pluginある)
* 不正アクセスポイントは小型PCで(FlashAir x 電子制御盤)で常時監視(リアルタイムでslackに投稿)
* 入退室管理もslackに投稿

ポイント

* /var/log/secure見るのは鉄則(ログイン失敗は明らかに変)
* `tail -f` 程ではないが、リアルタイム性があるのがいい。
* slackに全部出し


#3.IAM ユーザー管理：awscliを用いたユーザー管理とIDフェデレーションの比較
ポイント

* ログ収集・解析は、`CloudTrail＞SNS＞SQS＜Splunk`
* NessusでAWSセキュリティベストプラクティス検査機能がある($1,200)
* PCIDSSの認定スキャナ
* IAMの強権限を使って設定をチェックしてる。

#LT1.セキュアだ！freeeだ！
ポイント

* Security MonkyでIAM監視
* Google auth proxyいいかも

#LT2.Attack on AWS, ec2 + honeypot
ポイント

* 攻撃ポートは、9200,3128,3389,22、他には2222やXX22は人気
* shellshockは80、8080(NAS脆弱性)が人気

#LT3.セキュリティの設定、どこまでやってますか？
ポイント

* outboundは制限したほうがいい(iptables,nacl：shellshockはこれで被害制限)

#LT4.IAMでの権限設定をひたすらがんばっている話
ポイント

* IAMポリシーの`*`は敵
* conditionでIPとregion縛る

#雑感
お寿司おいしかったです。
CloudTrail のログを Hive で集計する


使われてなさそうなアクセスキーを削除したいけど、ほんとに使われてないのか自信ないので、CloudTrail のログを集計しようかなと思って調べたら、Hive の神 SerDe を見つけたのでメモ。[このブログ](http://blog.fzakaria.com/2014/10/analyzing-cloudtrail-logs-using-hivehadoop/)に書いてあることをやってるだけ。

```
hive> CREATE EXTERNAL TABLE IF NOT EXISTS cloud_trail_20150120
  ROW FORMAT SERDE 'com.amazon.emr.hive.serde.CloudTrailLogDeserializer'
  STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
  OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
  LOCATION 's3://cloudtrail/AWSLogs/xxxxxxxxxxxx/CloudTrail/ap-northeast-1/2015/01/20/'
;

hive> DESC cloud_trail_20150120;
OK
eventversion            string                  from deserializer
useridentity            struct<type:string,principalid:string,arn:string,accountid:string,invokedby:string,accesskeyid:string,sessioncontext:struct<attributes:struct<mfaauthenticated:string,creationdate:string>>> from deserializer
eventtime               string                  from deserializer
eventsource             string                  from deserializer
eventname               string                  from deserializer
awsregion               string                  from deserializer
sourceipaddress         string                  from deserializer
useragent               string                  from deserializer
requestid               string                  from deserializer
eventid                 string                  from deserializer
Time taken: 0.047 seconds, Fetched: 10 row(s)

hive> SELECT useridentity.accesskeyid, count(*)
  FROM cloud_trail_20150120
  GROUP BY useridentity.accesskeyid
  ORDER BY useridentity.accesskeyid
;
XXXXXXXXXXXXXXXXXXXX    2
XXXXXXXXXXXXXXXXXXXX    1777

hive> SELECT useragent, count(*)
  FROM cloud_trail_20150120
  GROUP BY useragent
  ORDER BY useragent
;
Amazon CLI/ElasticLoadBalancing 1.0.17.0 API 2012-06-01 2
Boto/2.25.0 Python/2.6.9 Linux/3.4.76-65.111.amzn1.x86_64       1777
...
GlassFishのキャッシュを疑っていくスタイル

GlassFish で開発してると、以下のような問題に結構たまにまぁまぁ頻繁に遭遇する。

- 実装を修正したけど、変更が反映されない。
- いろいろいじってたらエラーが出たので、動いていた頃に戻したけどエラーが改善されない

「エラーを吐いている箇所をごっそり削除しても、同じ場所でエラーになる？！」なんて時はキャッシュがかなり怪しい。

その場合は、 GlassFish を一旦停止して、以下のフォルダを削除してから再起動すると改善することがある。

`<GlassFish インストールフォルダ>\glassfish\domains\<ドメイン名>\osgi-cache\` の下にある `felix` 。

Stack Overflow とかを検索すると、よく「このフォルダを消してごらん」的な回答を見かける。
備忘録:Pythonデコレータ

ただの関数

```
def hoge():
  print "aaaaaaabb"

hoge()
```

```shell-session
aaaaaaabb
```

なんの変哲もないですね。


## 関数をデコる

実はPythonは@(関数名)
という記述を関数定義の前につけることで入れ子状の構造に出来ます。
なので少しいじってみると


```py

def deco(func):
  def aaa():
    print "wei soiya"
    func()
  return aaa

@deco
def hoge():
  print "aaaaaaabb"

hoge()
```

```shell-session
wei soiya
aaaaaaabb
```

前に一文追加されます


上の例だと

```py
@deco
def hoge
```

とすることで

```py
hoge()
```

が

```py
deco(hoge)()
```

と等価になってます。




## 多重デコレータ＋引数をもたせる

多重のデコレータを組ませることも、ラッパーを噛ますことでデコレータに引数を別途渡すことも出来るようです。

```py
def deco1(name):
    def wrapper(func):
        def aaaa():
            print "your name is "+name
            print "deco1 called!"
            return func("aaa","www",yakiniku="teishoku")
        return aaaa
    return wrapper

def deco2(func):
    def bbbb(*args, **kwargs):
        print "wrap2 called!"
        return func(*args, **kwargs)
    return bbbb

@deco1('nanntara-kanntara-')
@deco2
def eee(*args, **kwargs):
    print args
    print kwargs
    return "done"

print eee()
```

```shell-session
your name is nanntara-kanntara-
deco1 called!
wrap2 called!
('aaa', 'www')
{'yakiniku': 'teishoku'}
done
```


以下のサイトを参考にしました。

http://hangar.runway7.net/python/decorators-and-wrappers
マジで3秒でできるslackに天気投げるやつ

## 登録
チャンネルにこれを投稿する。
`/feed subscribe http://weather.livedoor.com/forecast/rss/area/130010.xml`

## 解除
`/feed list`
で表示されたidを元に
`/feed remove <id>`
のように入力する。

忘れたら `/feed help` するといいです。 

## 所感
slackbotとのDMにでも設定しておくといい感じ。
天気以外にもfeedであれば登録できるので、アイデア次第で面白いことができそう。

## 参考
※天気の取得にはlivedoor天気情報で提供されているAPIを使いました。
こちら: http://weather.livedoor.com/weather_hacks/rss_feed_list#forecast
jshintで嘘のエラーが出た時の対処法


#概要
jshint便利ですよね。かなり自由に書けるjavascriptに秩序を与えてくれます。
自分はsublimeを通して使っています。
 普通のjavascriptを書く分にはいいのですが、node.jsなど外部ファイルを必要とするものを書く時は「定義されていませんよ〜」的なエラーたくさん出てきます。その対処法を調べたのでまとめておきます。
![スクリーンショット_2015_01_22_23_17.png](https://qiita-image-store.s3.amazonaws.com/0/34727/905820b3-f9b0-c653-73f7-f664e8da646a.png "スクリーンショット_2015_01_22_23_17.png")
![スクリーンショット_2015_01_22_23_17.png](https://qiita-image-store.s3.amazonaws.com/0/34727/2961467d-8f08-87b3-ffda-bd9efa01a169.png "スクリーンショット_2015_01_22_23_17.png")

>require' is not defined. 'require' is not defined.と嘘のエラーが出ています。

#対処法その1
fileの先頭の以上の用に追加する。

```
/*global require */
```
これでこのファイルではrequireが定義されている事になります。
自分で作った外部ファイルの関数などはこうするしかないのかも。

#対処法その2
jshintが無視するように指定してしまいます。未定義以外のエラーにはいいかもれませんね。

```
root: __dirname + 'views',// jshint ignore:line
```

#対処法その3
実はnode.jsなどについては楽に出来る方法がアリます！

```
"node" : true
```
を.jshintrcに付け加えるだけ。以上です。

また

```
/*jshint node: true */
```
を最初に付け加えるという方法もあります。
![スクリーンショット_2015_01_22_23_27.png](https://qiita-image-store.s3.amazonaws.com/0/34727/821dd610-aaf7-f634-d5a1-d044e01c9508.png "スクリーンショット_2015_01_22_23_27.png")

　　

jshintrcのオプションは[JSHintで気軽なコーディングを](http://blog.craftgear.net/50832ff38cdc8fb415000001/title/JSHint%E3%81%A7%E6%B0%97%E8%BB%BD%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%92)が参考になると思います。
Vagrant + Virtualboxの仮想マシンファイルの置き場所を調べてみた

Vagrantを使ってローカル開発をしてるときに、仮想マシンのファイル(.vmdk)がどこにどう配置されているのかを調べてみました。

## 環境
* Mac OSX Yosemite
* Vagrant 1.7.2
* VirtualBox 4.3.20

## 配置場所には２種類ある

* ~/.vagrant.d/boxes/  ... 種仮想マシンの置き場所
* ~/VirtualBox\ VMs/   ... 起動したインスタンスの実体

##  $HOME/.vagrant.d/boxes/

ここには、vagrant addなどしたときにインターネットからダウンロードされてきた仮想マシンが保存されます。
ここにある仮想マシンは基本的に読み取り専用として使われます。
AWSにおけるAMIのようなものと考えればよいでしょう。

Vagrantfileに
```ruby:Vagrantifle
config.vm.box = "chef/centos-6.6"
```
と書いてvagrant upした場合(または`vagrant add chef/centos-6.6`した場合)、初回時にはatlas(旧名`vagrant cloud`)のサイトから`chef/centos-6.6`のイメージがダウンロードされて`~/.vagrant.d/boxes/chef-VAGRANTSLASH-centos-6.6/`というディレクトリの下に保存されます。

ここにあるイメージファイルのサイズはだいたい1ファイル200MBから400MBで、読み取り専用なので肥大化とかは起こりません。
ですが使わなくなった古いマシンイメージはときどき消しておくとよいでしょう。

`vagrant box list`で一覧表示
`vagrant box remove foo/bar`で削除


## "$HOME/VirtualBox VMs/"

vagrant upした後のインスタンスの仮想マシンイメージが保存される場所です。
AWSにおけるEBS Root Deviceのようなものと考えればよいでしょう。

仮想マシンインスタンスの中にいろいろなファイルを作ったりインストールしていくと、この下にあるここにある仮想マシンファイルがどんどん肥大化していきます。

私の環境では、半年間使い込んだ1個の仮想マシンの容量が13GBにも肥大化してしまっていました。
この仮想マシンの容量を削る方法は一応あるようですが、Immutable Infrastructureな観点からは、削除して新しく作り直すのがいいのではないでしょうか。

`Orace VM Virtualboxマネジャー`で一覧表示
`vagrant destroy`で削除
Boxを使ってPharファイルを簡単に作成

PHPでコマンドラインツールを作成するときにPharにして配布した方が、1ファイルに納まっているので使いやすいですよね。

## Box ってなに？

BoxはPharの構築を非常にシンプルにしてくれるツール

http://box-project.org/

## Box をインストール

```bash
$ curl -LSs https://box-project.github.io/box2/installer.php | php
```

`box.phar` を、/usr/local/bin とかに `box` として移動しておくと便利です

## Phar を作成するための設定 box.json を作成

説明の参考例として yaml を json に変換するためのコマンドツールを作成したので、これを例に説明します。
Box以外の部分の詳細などはGithubのリポジトリを参照してください
https://github.com/iwai/yaml2json 

とりあえず設定ファイルは以下の感じです。

```json
{
  "alias": "yaml2json.phar",
  "chmod": "0755",
  "files": [
    "LICENSE",
    "vendor/autoload.php"
  ],
  "finder": [
    {
      "name": "*.php",
      "exclude": [ "tests" ],
      "in": [
        "vendor/nategood",
        "vendor/mustangostang",
        "vendor/kevinlebrun",
        "vendor/composer"
      ]
    }
  ],
  "main": "bin/yaml2json",
  "output": "yaml2json.phar",
  "stub": true
}
```

### alias
Phar::mapPhar の第一引数に指定されるaliasです。コマンドラインツールの場合は必要ない気がするので指定しなくても問題ないです。未指定の場合は、Boxのデフォルトで `default.phar` の指定になります。

### chmod
作成されるPharファイルのパーミッションの設定、実行権限付けておくと便利。

### files
Pharファイルに含めるファイルの指定、後ほど説明する `finder` でも出来るんだけど、finderだと指定しづらいものは、こっちで指定しておく

### finder
Pharファイルに含めるファイルの指定、今回は、composerでインストールした依存ライブラリを含めるように指定。Box内での処理的には`Symfony\Component\Finder\Finder`が使われているらしいので、それに準じた指定ができるっぽい。

### main
コマンドラインからPharが実行された場合に実行されるファイルの指定、コマンドラインツールなので、ここ重要。

### output
作成されるPharファイルのパス、今回は box 実行した直下に作成したけど、`bin/yaml2json.phar` とかでもOKと思う、ファイル名まで指定しないと、`default.phar` で作成される。

### stub
作成したstubファイルのパスか、`boolean`で指定する、`true`にしておけば、デフォルトのstubファイルで作成してくれる。`false`とかにすると、Phar拡張とかが有効になってないphpの環境とかで動かなくなるので、コマンドラインツールとしては、`true` にしておいた方が吉。

## box で build する

ビルドすると`output`で指定したところに、pharファイルできてます。

```bash
$ box build -c box.json
```

Pharファイルにするとポータブルになって導入とか非常に楽になるのでオススメです。

## 気をつけたいこと

box で build するときは、`composer install --no-dev` で不要なライブラリが入っていない状態にしないと、composerのautoload系のファイルに、boxで含めてないファイルに関連する設定が入って、pharが実行できなかったりするので、そこ注意。
capybara-webkitをbundle installしてコケた時の対処法

##経緯
Capybaraでテストを書いていたのですが、Ajaxのテストが必要になったためcapybara-webkitをインストールしてみたら盛大にコケたため解決手順を残しておきます。

使用環境と手順は以下のとおり。

## 使用環境
* mac OSX10.9.5
* rails 3.2
* ruby 2.1.4
* Homebrew
* Xcode6.1.1

## 手順
Gemfileに
`gem capybara-webkit`
と書いて
`bundle install`
してもインストール出来ず。

調べてみるとcapybara-webkitには[qt](http://ja.wikipedia.org/wiki/Qt)が必須とのことです。

http://konifar.com/1076

そこで、
`brew install qt`
して再度`bundle install`するも失敗。

エラーを見るとXcodeのコマンドラインツールが見つからないためコケてしまったみたいです。

##注意点
Xcodeを最新バージョンにした場合、コマンドラインツールを再度インストールする必要があります。また、複数バージョンのXcodeがインストールされている場合は古いバージョンを削除しましょう。
ゴミ箱にドラッグ＆ドロップでもアンインストール出来ます。

以下リンクを参考に
http://qiita.com/kakipo/items/b9902513d92d4a29c6c0

最新のコマンドラインツールを入れ再度installするも、今度は削除したXcodeのコマンドラインツールのパスを参照していたため失敗。

http://atsumo.hatenablog.com/entry/2014/08/07/223241
を元にパスを再度設定することで無事にcapybara-webkitをインストール出来ました。

##教訓
ローカル環境にXcodeが複数あるなら、古いバージョンは削除しておいたほうが良さそうです。

関連
http://qiita.com/kwappa/items/20eecde98c81cc08cba8
Postモデルから、search_wordsに含まれる単語をAND検索する

こんな感じで、`scope`を用意してみる

```post.rb
  scope :search, ->(search_words) {
    return if search_words.empty?
    post_arel = Post.arel_table[:content]
    conditions = search_words.map { |word| post_arel.matches("%#{word}%") }
    where_clauses = conditions.inject do |arel_cond, condition|
      arel_cond.and(condition)
    end
    where(where_clauses)
  }
```

ORの場合はこんな感じ

```diff
-     arel_cond.and(condition)
+     arel_cond.or(condition)
```
phpでの漢字の正規表現を調べる続き~異体字セレクタ

[phpで漢字の正規表現を調べる(utf-8)
](http://qiita.com/awm-kaeruko/items/45f7074ba26424c4fce5)の続きです。
※この記事はMacのChromeで表示を確認しています。

以前phpで使える漢字の正規表現を示したところ
**異体字セレクター**と**Standardized Variants**
が考慮されていないというご指摘を頂き
知らなかったので調べてみました。

結果正規表現は以下となりました。

```php
preg_match("/^([\x{3005}\x{3007}\x{303b}\x{3400}-\x{9FFF}\x{F900}-\x{FAFF}\x{20000}-\x{2FFFF}][\x{E0100}-\x{E01EF}\x{FE00}-\x{FE02}]?)$/u", $subject, $matches);
```

前回の記事を参考に正規表現を作ってしまった方ごめんなさい。

##異体字セレクターとは
[wikipedia](http://ja.wikipedia.org/wiki/%E7%95%B0%E4%BD%93%E5%AD%97%E3%82%BB%E3%83%AC%E3%82%AF%E3%82%BF)に詳細に書かれていますが、
字形を詳細に表現するためにコードポイントの後ろにくっつく番号です。
例えばあなどるの「侮」という字のコードポイントは**FA30**ですが、
後ろに**E0101**をつけると*侮󠄁*
後ろに**E0103**をつけると*侮󠄃*
後ろに**FE00**をつけると*侮︀*
となります。

はて、３種類あるけど、E0103とFE00は同じ字形なのになぜ重複しているの？
これはU+E0100〜U+E01EFとU+FE00〜U+FE02とで領域の名前が異なり、
U+E0100~はIVS、U+FE00〜をStandard Variantsといって
新しく追加されたものだからです。
重複で言えばユニコードの歴史は奥深く、重複に重複が重なり
現在**悔**が3、異体字の*侮*が2つ登録されています。
しかもwikipediaによれば
>漢字の場合、出典が異なれば同一字形であっても別の異体字セレクタが割り当てられることとなっている。

と言っているので、今後異体字セレクタの領域に複数の侮や侮が入ってくる可能性もあります。

表にするとこんな感じです。

|種類| 漢字 | コードポイント | UTF-8 |
|:-----------|:-----------:|:------------|:------------|
|統合漢字|侮|4FAE |E4BEAE|
|互換漢字(JIS X 0213由来)|侮|FA30 |EFA8B0|
|IVS|侮󠄃|4FAE E0103|E4BEAE, F3A08483|
|IVS異体字|侮󠄁|4FAE E0101|E4BEAE, F3A08481|
|Standard Variants|侮︀|4FAE FE00 |E4BEAE, EFB880|

前回の記事ではセレクタを考慮していなかったため
正規表現の対象の中に異体字セレクタが混じっていると
4FAEとE0103がバラバラに認識されて、
4FAEは漢字、E0103はなんかわからんもんとして認識されて
全文字漢字と判断したい時にfalseとなります。

###参考
[異体字セレクタ - Wikipedia](http://ja.wikipedia.org/wiki/%E7%95%B0%E4%BD%93%E5%AD%97%E3%82%BB%E3%83%AC%E3%82%AF%E3%82%BF#.E3.82.BD.E3.83.95.E3.83.88.E3.82.A6.E3.82.A7.E3.82.A2)
[CJK互換漢字 - Wikipedia]
(http://ja.wikipedia.org/wiki/CJK%E4%BA%92%E6%8F%9B%E6%BC%A2%E5%AD%97)
[異体字セレクター ‐ 通信用語の基礎知識](http://www.wdic.org/w/WDIC/%E7%95%B0%E4%BD%93%E5%AD%97%E3%82%BB%E3%83%AC%E3%82%AF%E3%82%BF%E3%83%BC)
[Standardized Variants](http://unicode.org/Public/UNIDATA/StandardizedVariants.html)
[CJK互換漢字 - Wikipedia](http://ja.wikipedia.org/wiki/CJK%E4%BA%92%E6%8F%9B%E6%BC%A2%E5%AD%97)
[Mac OS Xの文字コード問題に関するメモ](http://d.hatena.ne.jp/NAOI/20130116/1358319668)
iOSでWebページを表示した時にscrollイベントが連続的に発生しない

#iOSでWebページを表示した時にscrollイベントが連続的に発生しない

ブラウザでスクロールした際に要素の位置や色をスクロール量に合わせて変更するような処理を行おうとしたところ、JavaScript(jQuery)でscrollイベントでちょっとつまずいたのでメモ。
ちなみにjQueryのバージョンは2.1.1。

scrollイベントを使ってスクロール中に連続的な処理を行う場合、PCやAndroid端末上では期待通りの動作をするが、iOSで閲覧した場合に期待通りに動作しない問題が発生。（自分の場合はiOSのChromeで発生したけど、Safariでは問題なかった・・・）

```sample.js
var $win = $(window);
$win.scroll(function () {
  //スクロール量を取得して要素の色を変えたりするよ
});
```

##AndroidとiOSでは、イベントの発生タイミングが異なる

[この記事](http://www.atmarkit.co.jp/ait/articles/1301/16/news029_3.html)によると、以下の違いがある事が分かった。

>iOSでは、スクロールが完了したタイミングで1回だけイベントが発生します。スクロールを行っている間は、イベントは発生しません。
Androidでは、スクロールしている間、連続的にイベントが発生します。このイベント発生タイミングは、PCブラウザと同じです。

##タッチデバイスの場合はtouchmoveイベントを使う

という事でタッチデバイスでスクロールした際に連続的に処理を行いたい場合は、touchmoveイベントを使用する。

```sample.js
var $win = $(window);
$win.scroll(function () {
  //スクロール量を取得して要素の色を変えたりするよ
});
if('ontouchstart' in window) {
  $win.bind('touchmove', function () {
    //スクロール量を取得して要素の色を変えたりするよ
  });
}
```

ただ、scrollイベントとtouchmoveイベントを併用するとtouchmoveイベント発生時にscrollイベントも同時に発生してしまうため、場合によってはtouchmoveイベント登録後にscrollイベントをunbindした方がいいかも。

もし、もっと良い方法を知っている方いたらぜひ教えてください。
byebugのインストール方法

* 「DEVELOPMENT KIT」をインストールする （http://rubyinstaller.org/downloads/）
（※インストール先はどこでもよい）

* インストール先のディレクトリに移動し、下記を実行

    ```
ruby dk.rb init
```

* 上記コマンドで生成されたファイル`config.yml`を編集する。ファイル内コメントを参考にrubyフォルダのパスを指定する。 


* 下記のコマンドを実行する。

    ```
ruby dk.rb install
```

* 下記のコマンドを実行する

    ```
gem source -a http://rubygems.org/
gem install byebug
```

※上記、ruby 2.1を使用
plenv で virtualenv な話


仕事に詰まって現実逃避。
元ネタは[ここ](https://github.com/jizhang/perl-virtualenv)。
`perldoc` が付いてなかったのが不満だったのと、単独での実行はいらない事と、親パスまでは決め打ちで良い事から、改造。

`plenv` 入れてあるので、その perl にて。

* `plenv` 以外の使用を前提としない。
* 元の `perl` は、`cpanm`, `local::lib` が入っていること
* 箱作る所だけ、下のスクリプト。
* 使用は、`plenv` まかせ。
    * `plenv shell` とか、`plenv uninstall` とか、
* 外部コマンドのソースからのインストール時には、このスクリプトで作成した `perl` 以外の `perl` でインストールを。
    * `pod2man` あたりでトラブルの危険
    * `Makefile` とか直接弄るんでもいいけど



### 実行

```bash:
$ plenv versions
  system
* 5.20.1 (set by PLENV_VERSION environment variable)
$ perl /PATH/TO/venv.pl oppai
$ plenv versions
  system
* 5.20.1 (set by PLENV_VERSION environment variable)
  oppai
$ plenv shell oppai
$ cpanm Acme::Oppai
$ plenv rehash
$ perldoc Acme::Oppai
#（略）
$ perl -MAcme::Oppai -le 'print Acme::Oppai->new->massage;'
　　　 _ 　∩
　　(　゜∀゜)彡　おっぱい!おっぱい!
　　(　 ⊂彡
　 　|　　　|　
　 　し ⌒Ｊ

$ plenv uninstall oppai

```

### ソース

```perl:venv.pl
#!/usr/bin/env perl
use strict;
use warnings;

use Config;
use File::Path qw(make_path);

die if ! defined $ENV{PLENV_ROOT} ;
die if ! defined $ARGV[0] ;
my $new_path    = join q{/}, $ENV{PLENV_ROOT}, q{versions}, $ARGV[0] ;
my $new_bin     = join q{/}, $new_path, q{bin} ;
my $new_perl    = join q{/}, $new_bin,  q{perl} ;
my $new_doc     = join q{/}, $new_bin,  q{perldoc} ;
my $new_cpanm   = join q{/}, $new_bin,  q{cpanm} ; 
my $new_lib_dir = join q{/}, $new_path, q{lib}, q{perl5} ;


my $orig_bin    = $Config{bin} ;
my $orig_perl   = $Config{perlpath} ;
my $orig_doc    = join q{/}, $orig_bin, q{perldoc} ;
my $orig_cpanm  = join q{/}, $orig_bin, q{cpanm} ;

die if -T $orig_perl ;
die if -l $orig_perl ;
die if ! -f $orig_doc ;
die if ! -f $orig_cpanm ;

die if qx{$orig_doc -l local::lib} !~ m{^/.*?/lib\.pm$} ;

make_path $new_bin if ! -d $new_bin;
{
    
    open my $fh, q{>}, $new_perl ;
    print {$fh} <<"EOF" ;
#!/bin/sh
exec $orig_perl -Mlocal::lib=$new_path "\$\@"
EOF

    close $fh ;
    chmod 0755, $new_perl ;
}

{
    open my $fh, q{>}, $new_cpanm ;
    print {$fh} <<"EOF" ;
#!/bin/sh
exec $orig_cpanm --local-lib=$new_path "\$\@"
EOF

    close $fh ;
    chmod 0755, $new_cpanm ;
}

{
    open my $fh, q{>}, $new_doc ;
    print {$fh} <<"EOF" ;
#!/bin/sh
export PERL5LIB=$new_lib_dir
exec $orig_doc "\$\@"
EOF

    close $fh ;
    chmod 0755, $new_doc ;
}
```
Amazon,S3にてBasic認証をかける


S3で静的サイトをホスティングする、Static Website Hosting。
便利で高性能だが、Basic認証がかからない。

リバースプロキシを介することで対応してみる。
リバースプロキシサーバがボトルネックとなり、せっかくのStatic Website Hostingの性能も生かせないが、とりあえずやってみる。


描くまでもないが、構成はこんな感じ。

![Untitled (3).png](https://qiita-image-store.s3.amazonaws.com/0/51320/0bf9b56b-9f6e-33b2-9dba-25f4fd074607.png "Untitled (3).png")


以下、手順。
① webサーバでリバースプロキシの設定を行う。

```Apache:httpd.conf
<IfModule mod_proxy.c>
ProxyPass /hoge http://xxx.s3-website-ap-northeast-1.amazonaws.com/app
ProxyPassReverse /hoge http://xxx.s3-website-ap-northeast-1.amazonaws.com/app
</IfModule>
```

② webサーバでリバースプロキシにBasic認証を設定

```Apache:httpd.conf
<IfModule mod_proxy.c>
  <Proxy *> 
    AllowOverride FileInfo AuthConfig Limit 
    Options MultiViews Indexes SymLinksIfOwnerMatch 

    AuthType Basic
    AuthName "Secret Zone"
    AuthUserFile /xxx/yyy/.htpasswd
    Require user fuga
  </Proxy> 
...
</IfModule>
```

③ S3のバケットポリシーで、送信元IPアドレスをwebサーバに絞る。

```
{
	"Version": "2008-10-17",
	"Id": "Policy1403165896111",
	"Statement": [
		{
			"Sid": "Stmt1403165893575",
			"Effect": "Allow",
			"Principal": {
				"AWS": "*"
			},
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::xxx/*",
			"Condition": {
				"IpAddress": {
					"aws:SourceIp": [
						"##.##.##.##/##"
					]
				}
			}
		}
	]
}
```
Minimax algorithm

# Minimax algorithm
**Minimax** is an algorithm which can be used for two-player zero-sum game theory, in particular to program artificial intelligences.

## Game tree
The states of the game can be represented by a tree, in which nodes are states, and one can navigate from one to another by playing one move.
Here is an example for Tic-Tac-Toe:
![i-4c76ab16b0a7b14c79135582c9506807-tic-tac.png](https://qiita-image-store.s3.amazonaws.com/0/59430/043c1d21-21f6-8d96-5ce5-cbf4cb365246.png)
In theory it is possible to read the whole game by exploring the whole tree, to chose the best move to play, but those game trees are generally big. For instance, in the case of Tic-Tac-Toe the number of states is 2^9 = 512. Even though that's ok for a computer, it's already big for such a simple game. In comparison the size of a go board is 19x19, which corresponds to 2^361 states.

## Evaluation function
Because the whole game tree cannot be explored, Minimax uses an **evaluation function** to estimate a state of the game. It takes a given state of the game as a parameter and returns a score.
If A and B are two players and the evaluation function is made from A's point of view, this means that the more the situation of the game is favorable for A, the greater the score should be. On the other hand, for a situation where A is likely to lose the score should be negative.
As it is supposedly a zero-sum game, if the score is X for player A, it will be -X for player B. The more player A is winning, the more player B is losing, and conversely.

When minimax is used for an artificial intelligence, its strength is essentially determined by the evaluation function. The way it works is arbitrary, and it usually needs some thought to implement. For instance, what is the score of this board?
![f8455b5eaec147cd366f99cb02a35c82.png](https://qiita-image-store.s3.amazonaws.com/0/59430/10c49dda-85b0-ba38-66e1-b7bb1010614f.png)
Not so easy, is it ?

## Algorithm
Minimax explores a part of the game tree considering that for each step, each player plays the best move.
This means that for the moves played by A, Minimax will chose the state which has the maximum score, because it's the most favorable for A. On the contrary, Minimax considers that B will play the move which produces the state with the minimum score.![Min_Max_Sample_2.png](https://qiita-image-store.s3.amazonaws.com/0/59430/836c11f6-b006-1116-2845-ff865e253692.png)
On this picture, squares represents states where A plays whereas circles are player B states.
If A plays the left move, B will be able to play three others, which would respectively result in states with scores of 12, 10 and 3. B wants to have the lowest score as possible so he will play the one which gives 3. So, if A plays the left move, the final score will be 3.
Using the same method for the other moves, one finds that the middle move is the best, because it is the maximum of the minima.

### Depth of the tree
The exploration stops at a certain depth, chosen in advance. A deeper exploration gives better results, but takes more time.
[Swift] class/struct の init 内では let 宣言したプロパティへの代入を無尽蔵に行える

知らんかった

```swift:momo.playground
class 桃太郎 {
    let きびだんご: Int
    init() {
        きびだんご = 1
        きびだんご = 2
        きびだんご = 3
    }
}

let どんぶら子 = 桃太郎()
どんぶら子.きびだんご  // 3

struct 雉 {
    let 羽: Int
    init() {
        羽 = 1
        羽 = 2
        羽 = 3
    }
}

let 鳩 = 雉()
鳩.羽  // 3

```
超高機能マークダウンエディタ「StackEdit」の Welcome Document を和訳してみた

　私は自分のブログ（WordPress）や、GitHubで管理しているアプリのREADME、はてはミーティングの議事録とか、およそドキュメント書く時にはマークダウンエディタ「[StackEdit](https://stackedit.io)」を使っている。
　Webアプリなのでネットワークに繋がればどこでも使えるうえ、一度アクセスしておけばオフラインでも使える。さらに作った文書はGoogle Drive等に同期しておけるのでファイルはどこからでも参照できるうえ、そのまま各種ブログに公開までできてしまう優れものだ。ほとんど全ての機能が無料で使えるのも素晴らしい点の一つなのだが、私はマークダウンで作った文書をPDF化してエクスポートしたかったこともあって、このたび永久ライセンス（日本円で&yen;3,000というのがまた安い！）を購入しちまいました。

　結構バージョンアップも頻繁に行われていて、最新版ではついにマークダウンでUML図表まで描けるようになった。いやぁ、システム設計書までこれで書けちゃうなぁ…うれしすぎるぞ（笑）

**StackEditでのUML図作成用構文の例**

![UML図作成用Markdown](http://ka2.org/assets/2015/01/stackedit.png "UML図作成用Markdown")

一般的なMarkdownのコードブロックみたいに書いたものが、UML図表化していくのは見ていて感動した。これは、すごい…！

- - -

　そんな「StackEdit」信者である私なのだが、エディタ自体のUIは英語ベースで多言語対応はしていないので、機能説明書でもある「Welcome Document」を和訳してみた。
　和訳したマークダウン文書をQiitaのMarkdownフォームにコピペしてみたら、脚注やTOC、UMLとかが再現できなかったので、和訳した文書はPDF化して[こちらに共有化](http://ka2.org/assets/2015/01/StackEdit-WelcomeDocument-ja.pdf "日本語訳版 StackEdit Welcome Document")してみた。興味のある方は見てみてください。
[Groovy]2.4リリース！groovyshがちょっと便利になりました。

#概要

昨日、Groovyの新メジャーバージョン2.4がリリースされました。
[Groovy 2.4 release notes](http://docs.codehaus.org/display/GROOVY/Groovy+2.4+release+notes)

PivotalがGroovyとGrailsのスポンサーを3月末で終了するとアナウンスされてから数日でのリリースです。
今回の目玉は間違いなく[Androidのサポート](http://docs.groovy-lang.org/docs/next/html/documentation/tools-groovyc.html#section-android)です。
コレでAndroid開発が劇的に楽になるはずですね！

しかし、私はAndroidアプリの開発をしたことが無いので、今回は2.4で向上した地味な部分、groovyshに関して書きます。

#defが使えるようになりました
いままでgroovyshの中では、`def`を使って変数の宣言が出来ませんでした。
Groovy2.4からはやっと`def`を使って変数が宣言できるようになりました！
早速試してみます。

```groovy
kkuwana% groovysh
Groovy Shell (2.4.0, JVM: 1.8.0_25)
Type ':help' or ':h' for help.
-------------------------------------------------------------------------------
groovy:000> def hello = "Hello Groovy"
===> Hello Groovy
groovy:000> hello
===> Hello Groovy
groovy:000> String hey = "hey hey Groovy"
===> hey hey Groovy
groovy:000> hey
===> hey hey Groovy
groovy:000> 
```

ちゃんと動いていますね！
実は、gvm経由でGroovy2.4をインストールした直後は、何故かちゃんと動作しませんでした。
もし動かねぇぞ！っていう場合は、一旦再起動するか、groovysh上で`:set interpreterMode true`を実行してみてください。

#groovyshに初期状態を与える
どういうことだ？という話ですが、groovysh起動時に事前に準備したコマンドを実行できるようになりました。（。。。なんか前からあったような気がするんですが気のせい？）
具体的には、ユーザのホームディレクトリ中に、`.groovy/groovysh.rc`というファイルを準備して、その中にGroovyコードを書いておけば、groovyshが起動するときに勝手にその内容を実行してくれます。

例えば以下のようなファイルを準備します。

```groovy:~/.groovy/groovysh.rc
// groovyshを起動した場所のフルパスを表示する。
println "You are executing groovysh on the ${new File(".").canonicalPath}"

// 当然事前に使いそうだなという変数を宣言しておくことも出来る。
def now = new Date()
```

これで、適当なディレクトリに移動して、groovyshを実行してみます。
すると。。。？

```groovy
kkuwana% groovysh
You are executing groovysh on the /var/www/nginx
Groovy Shell (2.4.0, JVM: 1.8.0_25)
Type ':help' or ':h' for help.
-------------------------------------------------------------------------------
groovy:000> now
===> Thu Jan 22 12:01:48 CET 2015
groovy:000> 
```

groovyshが起動した時にちゃんとメッセージが表示されて更にnowという変数にDateオブジェクトが格納されていますね。

#まとめ
特に派手な変化ではありませんが、こういう部分の変更にまでちゃんと手が及んでいるというのは非常にありがたいですね。

#参考

[Groovysh improvements](http://docs.codehaus.org/display/GROOVY/Groovy+2.4+release+notes#Groovy2.4releasenotes-Groovyshimprovements)
[Groovy 2.4のgroovyshでは、defが効くようになった。](http://uehaj.hatenablog.com/entry/2014/07/29/224235)
enchant.js と Underscore.jsが出会ってn-way弾をうつ

Underscore.jsを触っていて思いました。
each,map,find,shuffle,contains,groupBy・・・・
これで弾幕や当たり判定とか、色々作れるな・・・ｗ

###これはゲームのアルゴリズムと相性が良いはず
そうなんですねー。ゲームでやってることってUnderscore.jsと相性が良いのではと思いますよね、簡単なn-way弾を作ってみました。

まずenchant.js内に、**「X,Y,速度,角度」の引数で角度に対して弾が撃てるクラス**を作ります。
この原理は「[弾幕の初歩（距離系と角度系）](http://qiita.com/hp0me/items/1164bf9669a825d76ffa)」にのせました。
その原理をもとに、[enchans.jsのクラスの作り方](http://enchantjs.com/ja/resource-ja/overview/)とブレンドします。

それをもとにUnderscore.jsのメソッドを実行すると・・・

3way
![nway.gif](https://qiita-image-store.s3.amazonaws.com/0/57193/c358a381-eb83-e2ca-ae82-71ea4524c3ec.gif)

```js:3way
game.rootScene.addEventListener('enterframe', function() {
  //20フレームに1回
  if(this.age % 20 == 0){

    //まず最初に空の配列を作って、wayが増えるたびに配列にプッシュ
    // X,Y,速度,角度
    var bArr = []
    var way_1 = [450,30,3,90];
    bArr.push(way_1);
    var way_2 = [450,30,3,45];
    bArr.push(way_3);
    var way_3 = [450,30,3,135];
    bArr.push(way_3);

    _.each(bArr,function(elm,i){
       var bullet = new Bullet(elm[0],elm[1],elm[2],elm[3]);
    });

  }
});
```


こうするとwayを増やすのが容易になります。
これがUnderscore流？

5way
![5way2.gif](https://qiita-image-store.s3.amazonaws.com/0/57193/af597877-e4d7-af59-b52b-735e80b7db23.gif)


```js:5way

game.rootScene.addEventListener('enterframe', function() {
  //20フレームに1回
  if(this.age % 20 == 0){

    //5way弾幕ならこのように
    //まず最初に空の配列を作って、wayが増えるたびに配列にプッシュ
    // X,Y,速度,角度
    var bArr = []
    var way_1 = [450,30,3,90];
    bArr.push(way_1);
    var way_2 = [450,30,3,125];
    bArr.push(way_2);
    var way_3 = [450,30,3,55];
    bArr.push(way_3);
    var way_4 = [450,30,3,160];
    bArr.push(way_4);
    var way_5 = [450,30,3,20];
    bArr.push(way_5);

    _.each(bArr,function(elm,i){
       var bullet = new Bullet(elm[0],elm[1],elm[2],elm[3]);
    });

  }
});

```

##ぶっちゃけ
まぁ、大したことはやってません。実際、普通にJavaScriptでも書けます。。
でも、ロジックが複雑化したらどうか？・・・
オブジェクトが簡単に探索できたら？DB連携とかしはじめたら？・・・
ここらへんは未検証です。

当然、懸念点もあります。

##Unity,Cocos2d-JSBではどうする
web系だと通用する方法ですが、これはUnityやCocos2d-JSBといったネイティブ系のJavaScriptコードをコンパイルするような環境では使いにくいですね。

Cocos2d-JSではWebviewを使ってネイティブ実装するという手もあるようですが、実際どうなんでしょう？それができれば、Underscoreとか色々JSで培ってきたものが使えるのですが。

##Webゲーム開発とネイティブゲーム開発を繋げたい・・
どうしても懸念されるのは、ブラウザとネイティブ実装の乖離です。
Webview,TitaniumのようなJS→ネイティブ変換の技術は結構あるようですし、海外ではCocos2d-JSを使ったゲーム開発も多くなっているようですが、まだまだです。
実際enchant.jsで作ったゲームはスマホだともっさりしてたことがありました。あと、広告SDKが無かったり。
あとCocos2d-JSBも試してみたのですが、思わぬところでコンパイルエラーが出てしまいモチベーションが下がりました。そうであれば最初からC++でCocos2d-xの方が早いと思ってしまいます。

##逆に言うと
逆に言えば、これがスムーズになっていけば開発効率がぐっと上がります。JavaScriptでブラウザでテストして、スマホ移植っていう流れが出来ればいろんなクリエイティブが発揮できる人が増えるでしょう。Underscore.jsやjQueryだって使えるようになりますし、websocketとかHTML5とか、Web系技術の出番も増えてきます。

##どうなんでしょう
JS→ネイティブ連携にくわしい方、何か考えがある方はコメントかhp0isme@gmail.comまでお願いします。
Cocos2d-JSでまともにゲームが作れるのか、JSで作ったゲームをネイティブに持っていくのって普通になったのか。
SwiftでのNSDataの変換

- [SwiftでのNSDataの変換](#sec-1)
  - [NSData <=> String](#sec-1-1)
  - [NSData <==> NSInteger](#sec-1-2)

# SwiftでのNSDataの変換<a id="sec-1" name="sec-1"></a>

## NSData <=> String<a id="sec-1-1" name="sec-1-1"></a>

```swift
var str = "Hello";
// String to NSData
let data = str.dataUsingEncoding(NSUTF8StringEncoding)
// NSData to String
var out: String = NSString(data:data, encoding:NSUTF8StringEncoding)
println(out) // ==> Hello
```

## NSData <=> NSInteger<a id="sec-1-2" name="sec-1-2"></a>

```swift
var src: NSInteger = 2525
var out: NSInteger = 0
// NSInteger to NSData
let data = NSData(bytes: &src, length: sizeof(NSInteger))
// NSData to NSInteger
data.getBytes(&out, length: sizeof(NSInteger))
println(out) // ==> 2525
```
Toolbar使用時にstartActionModeがおかしくなるときの対処法

[Toolbar](http://developer.android.com/reference/android/support/v7/widget/Toolbar.html)を使うようにしたら[ActionBarActivity.startSupportActionMode](https://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html#startSupportActionMode(android.support.v7.view.ActionMode.Callback))を呼んだ時に

これを
![device-2015-01-22-191638.png](https://qiita-image-store.s3.amazonaws.com/0/56668/620d6faa-64f1-bd60-2c31-db731d6787b3.png)

こうしたい
![device-2015-01-22-191929.png](https://qiita-image-store.s3.amazonaws.com/0/56668/64e2611c-61e5-5d79-897d-bf6ec95ac8d5.png)
のに

こうなってしまう！！
![device-2015-01-22-191628.png](https://qiita-image-store.s3.amazonaws.com/0/56668/96142d3b-8b2c-b764-6cbe-7e46f74c24e2.png)
ときの対処法です。

`styles.xml`（テーマを設定しているファイル）で`<item name="windowActionModeOverlay">true</item>`を指定する。

```xml
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="windowActionModeOverlay">true</item>
</style>
```

そして、ActivityではなくToolbarのstartActionModeを呼ぶ。
MiniMagick とか ImageMagick 使うときのメモリ消費量比較

http://qiita.com/overleo@github/items/516cdf7d882ded88fd76

これの続きです。

1日百万回ぐらい実行されるアプリでパフォーマンスが出ず、問題はメモリ消費量では、ということで調査しました。

前回と同様、よくある適当な 1080 x 236 px の JPEG 画像を ImageMagick を使って適当な位置を切り取ってくるという処理をして速度を比較しています。

比較したのは以下の3つ。

* MiniMagick
* ファイル渡しで ImageMagick を直接叩く
* パイプ渡しで ImageMagick を直接叩く

## 環境

```
% ruby --version
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]
```

![スクリーンショット 2015-01-22 18.46.14.png](https://qiita-image-store.s3.amazonaws.com/0/18001/bce39f6f-b17a-41ff-c9ce-f6af718337eb.png)

## 比較方法

ps を叩いて ruby プロセスがどれだけメモリを消費しているかを出力します。対象は ruby だけなので ImageMagick の使用分は含まれてない、はず。（子プロセスは毎回終了されるのでここでは考慮しないでも平気だろう、という感じ）

適宜 `minimagick` のところを入れ替えたり、`GC.start` をコメントアウトしたりしながら、1つ1つ全てのパターンを調査してます。

```ruby
require 'benchmark'
require 'mini_magick'
require 'tempfile'
require 'open3'

TARGET = 'common_case_1.jpg'

N = 10000

IMAGE = File.open(TARGET).read

def minimagick
  piece_image = MiniMagick::Image.read(IMAGE)
  piece_image.crop('450x556+0+0')
  image = piece_image.to_blob
end

def imagemagick_file
  Tempfile.open('tmp_piece_input', './') do |input_image|
    Tempfile.open('tmp_piece_output', './') do |output_image|
      input_image.write IMAGE
      `convert -crop 450x556+0+0 #{input_image.path} #{output_image.path}`
      output_image.read
    end
  end
end

def imagemagick_pipe
  image,_ = Open3.capture2("convert -crop 450x556+0+0 jpeg:- jpeg:-", stdin_data: IMAGE, binmode: true)
end

def put_memory_size
  puts `ps -o rss= -p #{Process.pid}`.to_i
end

counter = 0
N.times {
  minimagick
  put_memory_size
  if (counter += 1) > 100
    #GC.start
    counter = 0
  end
}
```

## 結果

![スクリーンショット 2015-01-22 19.15.30.png](https://qiita-image-store.s3.amazonaws.com/0/18001/c072196a-0459-fd1e-b97e-3e001f9bbaea.png)

縦軸はメモリ使用量、横軸はループ回数。

MiniMagick のメモリ使用量すごい。でもその前に自分で GC するの大切、という結果です。

## さらに GC のタイミングを変えて比較した結果

![スクリーンショット 2015-01-22 19.15.44.png](https://qiita-image-store.s3.amazonaws.com/0/18001/bc91fce0-de66-94f5-a00a-320edc08f53d.png)

軸は先程と同様、10, 100, 1000 は `GC.start` するループの回数。10000 は自然に実行されるのに任せたもの。

## 考察

* 適当なタイミングで自前で GC 実行しないとヤバイ、GC 実行されるタイミングでってあまり詳しくないですが画像のように大量にメモリが必要な物を大量に回すにはなんか考えないと
MacPorts あれこれ


アップデート
----------
インストールされているportをすべてアップデートする．

```bash
sudo port selfupdate && sudo port upgrade outdated
```

インストールされているが，active でないものを削除する
-------------------

ノートPCなどでディスクが圧迫される場合に，もう使われていないパッケージを削除することで開放できることがある．

```bash
port installed|grep -v '(active)'|sed -e 1d|sudo xargs port uninstall
```

Activeなportをすべてdeactivateする
-------------------------------

OSのアップデート前やMacPortsを再インストールする前にやっておくと良い．MacPortsはだいたいのファイルは`/opt/local`以下にファイルがあるが，一部のファイルは`/Applications/MacPorts`やその他の場所にインストールされるので，MacPortsの再インストール前には`deactivate`して削除しておくと良い．

```bash
port installed|fgrep '(active)'|sed -e 's/(active)//g'|sudo xargs port deactivate
```

デフォルトのPythonをMacPortsのPythonに設定する
-----------------------------------------

以下のコマンドで`python`と打って呼び出されるコマンドをMacPortsのものにできる．（python27がインストールされていることが前提となる）

```bash
sudo port select --set python python27
```

`port select`で選択可能なリストを見る
--------------------------------

`python`として指定可能なリストは以下のようにして見れる．

```bash
port select --list python
```

ただ，`python`以外に何が指定できるかを`port`コマンドで見る方法はない．そこで，以下のコマンドを実行するとgroupとして何が利用可能なのかを確認できる．

```bash
ls /opt/local/etc/select
```


MacPortsのバイナリを共有する
------------------------

複数台のMacを所有しているときにMacPortsのバイナリを共有することができる．多くのportにおいてバイナリパッケージが提供されているが，されていない場合にはビルドに時間がかかる．それを，複数台のコンピュータで繰り返すのは無駄なので，一台のコンピュータでビルドされたものを使い回すことができる．

詳細については以下のURLを参照．

https://trac.macports.org/wiki/howto/ShareArchives2
[Grails]Serviceの中で任意のdataSourceを使って生のSQLを実行する方法

#概要

**下書きが溜まってしまったのでとりあえず投稿。そのうち文章とか修正予定。**

GrailsはDataSource.groovyの中の各環境（dev, test, prod)にそれぞれ定義された`dataSource`の定義に従ってデータベースに接続してくれます。
普段はそれでいいのですが、ある特定のデータを取得するときだけは別のデータベースに繋ぎたい場合はどうすればいいのでしょうか？
通常は自分自身が利用するデータベースは一つだけですが、やはり要件によっては別のシステムのデータベースにアクセスしてデータを取得しなければならない、という状態は当然想定されます。

今回、独自のdataSourceを定義して、それをServiceの中から利用する方法を調べたのでメモします。

#オリジナルのdataSourceの定義方法

オリジナルのdataSourceの定義自体はすごく簡単で、対象の環境（dev, test, prod）の中で、
**dataSource_オリジナルの任意の名前**
という書式で定義します。
dataSource_は固定です。
例えば以下のような感じ。

```groovy:grails-app/conf/DataSource.groovy
development {
    dataSource {
        dbCreate = "create-drop"
        url = "jdbc:postgresql://localhost:5432/postgesqldb"
    }
    dataSource_mysql {
        dialect = org.hibernate.dialect.MySQLInnoDBDialect
        driverClassName = 'com.mysql.jdbc.Driver'
        username = 'mysqluser'
        password = '******'
        url = 'jdbc:mysql://localhost/mysqldb'
    }
}
```
JDBCドライバどうすんの？って話ですが、それはGrailsのBuildConfig.groovyのdependenciesに定義してしまえばOKです。非常にシンプル！

#独自のdataSourceをServiceの中で使う
ここが落とし穴で、公式ドキュメントなどには、Serviceクラスの中で、以下の様に宣言するようにと説明されていますが、**単純にServiceからgroovy.sql.Sqlを使いたい場合はコレではダメです。**

```groovy:ダメなバージョン
class DataService {

    // 独自dataSourceのアンダーバー以降を指定する
    static datasource = 'mysql'

    def serviceMethod() {

        // groovy.sql.Sqlのコンストラクタにはこの場合'mysql'というStringが渡されることになる。
        // でもStringを取るgroovy.sql.Sqlのコンストラクタは無いので当然例外。
        def sql = new Sql(dataSource)
        def query = """
            SELECT COUNT(*) FROM hoge
        """
        println sql.rows(query)
    }
```



以下のようにする必要が有ります。

```groovy:成功するバージョン
class DataService {

    Sql sql
    // 独自dataSource用のセッターを宣言する。
    // 独自dataSource名の先頭にsetをつけて、先頭文字を大文字にするだけ。
    void setDataSource_mysql(dataSource) {
        sql = new Sql(dataSource)
    }

    def serviceMethod() {

        def query = """
            SELECT COUNT(*) FROM hoge
        """
        println sql.rows(query)
    }
```
GORMからも同じように別のデータベースにアクセスできるようですが、それはまた別の機会に調べたいと思います。


#参考
[5 Configuration 2.4.4](http://grails.org/doc/latest/guide/conf.html#multipleDatasources)
[Grails User (Old Archive) - Using multiple datasources](http://grails.1312388.n4.nabble.com/Using-multiple-datasources-td4295401.html#a4296277)
[[Grails]servicesで直接SQLを実行する方法](http://qiita.com/saba1024/items/133e829dae67934e8d13)
[Sql (Groovy 2.2.1)](http://groovy.codehaus.org/api/groovy/sql/Sql.html)
rubyでIntegerクラスを四捨五入できるように拡張する


地味に便利シリーズ！

## やったこと

訳あってrubyで整数を四捨五入したかったんだけど、
意外とメソッドがなかったので、Integerクラスを拡張して、

    integer_instance.roundint(num)

ってやれば、上から#{num+1}桁を四捨五入してくれるようにしてみました。

## 実装

```roundint.rb

class Integer
  def roundint(size=1)
    return self if size >= self.to_s.length                                                                        
    level = self.to_s.length - size
    if self%10**level >= (10**level)/2 #ここで四捨五入を切り分け
      self/10**(level)*10**level + 10**level #切り上げ
    else
      self/10**level*10**level #切り下げ
    end
  end
end

```

## 結果

```console

154954959.roundint(1)
=> 200000000

154954959.roundint(2)
=> 150000000

154954959.roundint(3)
=> 155000000

154954959.roundint(100)
=> 154954959 #引数が桁数を超えたらそのまま返します

154954959.roundint(-1)
=> 0 #引数を0以下にしたら0を返します


```

と思ったけど、

    14545454.to_f.round(-3)

でできますねｗ

以上、地味に便利シリーズでしたｗw
MacにWinをブートキャンプするやつメモ

#用意するもの
64bit の Win7 or 8 のディスク or isoファイル.
8G以上のUSBメモリ.

#手順
## winのisoが無い場合
isoファイルがない場合は、ディスクからisoファイルを生成する。
WinのディスクをMacに入れて、ディスクユーティリティから
Winディスクを選択し、新規イメージをクリック。

適当に名前を付けて。イメージフォーマットをDVD/CDマスターにして保存。
名前.cdr のファイルが出来るので、名前.iso に拡張子を変更する。

##isoがある場合。
8GB以上のメモリをMacに差し込む。
BootCampアシスタントを開く
ISOイメージを選択して進む。
この時、USBメモリが使えなかったらフォーマットし直すと出来ることもある。
フォーマットはディスクユーティリティから行う。
Windows サポートソフトウェアのダウンロードは環境によっては時間がかかるので注意。


#Winのインストール
パーティションを切って、
切った大きさのパーティションを選択して、
フォーマットしてWinをインストール。
Winの入ったMacが出来る。

#キーボードについて
[WindowsとMacのキーボード対応表](http://pc-karuma.net/bootcamp-key-assignment/)


#OSの切り替え
Mac->win
システム環境設定->起動ディスク
Win->Mac
タスクバーにある謎の◆で。

#右クリックの設定
◆-> BootCampコントロールパネル->トラックパッド->1本指の操作->副ボタンのクリック

#トラックパッドのスクロール方向の変更
regedit->検索->FlipFlopWheel/FlipFlopHScroll