OmniAICreator/Qiita-1.07M huggingface dataset:
Elastic Beanstalkのデプロイで権限エラー


デプロイしたらエラーがでた。

```
One or more objects in the Elastic Beanstalk bucket could not be deleted. Verify that your S3 policies allow you to perform 's3:DeleteObject'.
```

Elastic Beanstalkが作ったS3バケットは削除できないようポリシーがデフォルトで設定されている。何のにこいつは削除をするから権限よこせといいやがる。zip形式でデプロイしてるせいかもしれないけれど、しょうがないので許可設定をする。

S3にelasticbeanstalk-ap-northeast-1-xxxxxxxxxxxxみたいなバケット名が作られているので、Properties選択後、Permissions、Edit bucket policyから下記の部分を探す。

```
{
			"Sid": "hogehoge",
			"Effect": "Deny",
			"Principal": {
				"AWS": "*"
			},
			"Action": "s3:DeleteBucket",
			"Resource": "arn:aws:s3:::elasticbeanstalk-ap-northeast-1-xxxxxxxxxxxx"
		}
```

Allowに書き換え
```
			"Effect": "Allow",
```

これで、Elastic Beanstalkの画面でデプロイ済みのバージョンに切り替えできました。…ポリシー編集しなくても切り替えだけでできたんじゃないかと思ったりなんたり。
nvmインストールからnodeインストールまで (mac)


## nvmインストール

```Bash
$ brew install nvm
==> Downloading https://github.com/creationix/nvm/archive/v0.17.3.tar.gz
######################################################################## 100.0%
==> Caveats
Add the following to $HOME/.bashrc, $HOME/.zshrc, or your shell's
equivalent configuration file:

  source $(brew --prefix nvm)/nvm.sh

Node installs will be lost upon upgrading nvm. Add the following above
the source line to move install location and prevent this:

  export NVM_DIR=~/.nvm

Type `nvm help` for further information.

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
```

インストール完了。試し。


```Bash
npm -v
-bash: nvm: command not found
```

足りない。


```Bash
echo "source \$(brew --prefix nvm)/nvm.sh" >> ~/.bash_profile
```

ターミナルを立ち上げ直して

```Bash
npm -v
1.4.28

node -v
v0.10.33
```

いけました。

## node install

```Bash
nvm install v0.10
nvm alias default 0.10
```

これで使えるようになりました。
2つ目のコマンドを入れないとターミナルを再度立ち上げた時、
npmやnodeがcommand not foundになるようで、
再度「nvm use 0.10」とかやらないといけないようです。
NSARRAYをNSMUTABLEARRAYにする時気をつけること

取得した配列に要素を追加したい場合、NSMutableArrayを使うわけですが、元のデータがNSArrayであり、そのコピーを元にして要素追加をしようとする際、以下の様なコードを書くとエラーになります。

```
NSArray *array = @[@"aa",@"bb",@"cc"];
 
NSMutablueArray *mArray = [[NSMutableArray alloc]init];
mArray = (NSMutableArray*)[array copy];
 
[mArray addObject:@"aa"] //ここで実行時エラーになる
```

正しくはこう

```
NSArray *array = @[@"aa",@"bb",@"cc"];
 
NSMutablueArray *mArray = [[NSMutableArray alloc]init];
mArray = (NSMutableArray*)[array mutablecopy];
 
[mArray addObject:@"aa"] //OK
```

前者でもビルドは通ります。キャストにより「このアドレスのオブジェクトはNSMutableArrayだよー」と言っているわけですから。

ただし、実態はNSArrayのままなので、いざメソッドを呼びだそうとした時にはエラーとなるわけです。

mutablecopyとすることで、NSMutableArrayのオブジェクトになるということです。
SwiftのカスタムクラスArray操作その2（Sum）※解決！【メモ】

#SwiftのカスタムクラスArrayでプロパティの値を合計

SwiftのArray内に以下の様なクラスのオブジェクトが入っていたとして、任意のプロパティの合計を求める。

**※末尾にNSArrayでの記法も書いておきます。（コメントありがとうございます！）**


##使用するカスタムクラス（!無しのプロパティに修正）

```swift:Cat.swift
class Cat:NSObject{
    var name:String
    var color:String
    var age:Int
    var score:Int

    init(data: (String,String,Int,Int)){
        name = data.0
        color = data.1
        age = data.2
        score = data.3
    }
}
```

##テストデータ

テストデータを準備しておきます。

```swift:UseCat.swift
var all_cats:[Cat] = [Cat]()
all_cats.append(Cat(data:("タマ","白",10,10)))
all_cats.append(Cat(data:("コトロ","茶トラ",2,10)))
all_cats.append(Cat(data:("ミケ","三毛",3,10)))
all_cats.append(Cat(data:("チビトラ","茶トラ",4,10)))
all_cats.append(Cat(data:("タケチヨ","キジトラ",7,10)))
all_cats.append(Cat(data:("マリアンヌ","白",7,10)))

```

##合計の処理

###正式な記法
正式な記法だと以下のとおり。

```swift:UseCat.swift
let score_sum:Int = all_cats.reduce(0,{
    
    //sum=最終的な戻り値：return結果が次の繰り返しのsumとなる
    //task=Array内のオブジェクト：繰り返しのたびに要素がセットされる
    (var sum:Int, var cat:Cat) -> Int in
    
    //毎回Taskのpropertyの値を足し込むことで、property値のsumも可能
    return sum + cat.score
})
```

実行結果は以下のとおり

```swift:UseCat.swift
println("score sum=\(score_sum)\n")
```

```vim:【実行結果】
score sum=60
```

###※省略した記法

前回同様に、引数の記述を省略して＄0,＄1として値を受け取ることができます。またreturn文を省略して直接処理結果をreturnすることができます。

```swift:UseCat.swift
let score_sum2:Int = all_cats.reduce(0, {
    $0 + $1.score
})

//結果確認
println("score sum=\(score_sum2)\n")
```

```vim:【実行結果】
score sum=60
```
　

##Objective-Cと同様にNSArrayを使う場合

NSArrayのvalueForKeyPathというメソッドは非常に高機能で、値の合計などに使用することができます。

**詳しくは、[Apple KVC Programming Guide](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueCoding/Articles/CollectionOperators.html#//apple_ref/doc/uid/20002176-BAJEAIEE)を参照のこと**


```swift:UseCat.swift
let score_sum3
    = (all_cats as NSArray).valueForKeyPath("@sum.score") as Int
println(score_sum3)
```
　

**※ただしSwift上からこのコードを利用する場合には、Array内のカスタムクラスの計算させたいプロパティには、Optional型やImplicitly Unwrapped Optional型は使えないようです。
（プロパティの型として?や!付きの宣言しているとvalueForKeyPathからは利用できない）**


```swift:Cat.swift（エラーになる例）
class Cat:NSObject{
    var name:String!
    var color:String!
    var age:Int!
    var score:Int!

    //以下略
}
```

```vim:【実行結果】
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<MyProject.Cat 0x999999999999> valueForUndefinedKey:]: this class is not key value coding-compliant for the key score.'
```

　

##※以下は未解決時の記載
~~**※うーん、このコードはうまく動かないです。エラーメッセージ的には配列内の要素がNSObjectとみなされていないようです。原因がわかる方いらっしゃいましたらコメントいただけると有難いです。
（NSKeyValueCodingプロトコルと関係がありそう）**~~



~~**（追記）
こっちは動くのはなぜだろう。@max,@min,@sum,@avgはダメ。@countとかは結局プロパティにアクセスしないからOKなのだろうか。**~~

~~```swift:UseCat.swift
let score_count
    = (all_cats as NSArray).valueForKeyPath("@count.score") as Int
println(score_count)
```~~
JenkinsのスレーブをJNLPからInstall as Windows Serviceできなかった

slave-agent.jnlp を実行してダイアログが表示されますが、メニューバー？が表示されません。
Wiki には表示されている様子があります。

[Install Slave as a Windows service (require .NET 2.0 framework) - Jenkins Wiki](https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+as+a+Windows+service#InstallingJenkinsasaWindowsservice-InstallSlaveasaWindowsservice(require.NET2.0framework))

以下のところで言及されているのが原因でしょうか？

"Bug 382490 - Installing JNLP Slave as windows service fails"
https://bugs.eclipse.org/bugs/show_bug.cgi?id=382490#c27

> Hi, this part of slave .jnlp has no effect since java java 7u45:
> `<property name="hudson.showWindowsServiceInstallLink" value="true"/>`
>
> This property is not passed so menu option is NOT shown - starting from java 7u45 launch descriptor (JNLP file) need to be signed in order to set 'insecure' system properties.
>
> This issue should be Reopened and needs to be fixed.

現象の発生する環境は Windows 7 64bit, JRE 7u71 です。
node.jsでプロセスの自動再起動【express4】

##nodeの起動スクリプトをデーモン化するツール
　forever、node-dev、supervisor などなど

　今回はその中のsupervisorを使用した。
　(環境はwindows7、フレームワークはexpress4を使用。)

### ● パッケージインストール
```コンソール
 $npm install -g supervisor
```
### ● 起動
```コンソール
$supervisor ./bin/www (express4.x)
$supervisor node app.js (express3.x)
```

### ● オプション

アップロードや書き込みなどで都度再起動してしまうので、監視するディレクトリやファイルをオプションで設定する必要があるみたい。

-i(--ignore)オプション　（例 : $supervisor -i node-module ./bin/www ）
-w(--watch)オプション
AppVeyor で Node.js を CI する

## AppVeyor とは?
[AppVeyor](http://www.appveyor.com) は OS に Windows を使っていることを特徴とした CI (継続的インテグレーション) サービスです。[Travis CI](http://www.appveyor.com) と同じように、オープンソースプロジェクトでは、無料で使用できます。

## Node.js とは
サーバーサイド JavaScript 環境の一つで、公式に Windows 環境での動作がサポートされています。[node-gyp](https://github.com/TooTallNate/node-gyp) を用いた、ネイティブモジュールのコンパイルも利用できます (コンパイラとしては、Visual C++ が使われます。)。

## なぜ、Windows で Node.js を CI するのか ?
オープンソースプロジェクトでは、Node.js の CI として、Travis CI が一般に使われています。Travis CI は Linux (Ubuntu) で動作しており、apt-get や Xvfb も利用でき、CI としては十分です。

しかし、プロジェクトの開発者は、Unix 系 OS を利用している人だけとは限りません。ネイティブモジュールの中には、Windows では正常に動作しないものもあります。そのような事態を、Windows でも並行して CI することにより、未然に防ぐことができます。

## AppVeyor の特徴
- オープンソースプロジェクト 無料
- GitHub 連携が可能
- appveyor.yml にビルドスクリプト記述し実行
- Windows 系 OS (Windows Server 2012)
- 管理者権限 (Administrators グループ) を持つユーザーで動作
- Ruby, Python など、標準でインストール ([ソフトウェア一覧](http://www.appveyor.com/docs/installed-software))
- [Selenium](http://www.seleniumhq.org) (IE, Firefox, Chrome) を標準でインストール
  - Internet Explorer での自動テストが可能
- [Chocolatey](https://chocolatey.org) が利用可能 (Windows 版パッケージマネージャー)
  - 必要なソフトウェアをコマンドから簡単にインストール可能

## AppVeyor の利用方法
まず、[AppVeyor](http://www.appveyor.com) に GitHub アカウントでサインアップし、有効にします。そして、appveyor.yml を対象のリポジトリに配置すれば OK です。

## appveyor.yml サンプル
実際に動作する appveyor.yml のサンプルを以下に載せます。

```yaml
# appveyor file
# http://www.appveyor.com/docs/appveyor-yml

install:
  # Update Node.js
  # 標準で入っている Node.js を更新します (2014/11/13 時点では、v0.10.32 が標準)
  - ps: Update-NodeJsInstallation (Get-NodeJsLatestBuild $env:nodejs_version)
  - node --version
  
  # Update NPM
  - npm install -g npm
  - npm --version
  
  # Update node-gyp
  # 必須! node-gyp のバージョンを上げないと、ネイティブモジュールのコンパイルに失敗します
  - npm install -g node-gyp
  
  # Install dependencies & devDependencies
  # Visual Studio のバージョンを指定しないとコンパイルが通らない場合あり
  - npm install --build-from-source --msvs_version=2013
  
  # 以下は、プロジェクトに合わせてください
  # 例として、パッケージ管理に bower, ビルドツールに grunt を用いている場合
  
  # Install build tools
  - npm install -g grunt-cli bower
  - grunt --version
  - bower --version
  
  # Install bower packages
  - bower install

  # Build
  - grunt build

test_script:
# テスト用のコマンドを指定します
  - npm test

environment:
  matrix:
    - nodejs_version: 0.10

init:
# git clone の際の改行を変換しないようにします
  - git config --global core.autocrlf false

branches:
# ビルドするブランチを制限する場合に記述します
  only:
    - master
  except:
    - gh-pages

build: off
deploy: off
```

参考: [Testing with Node.js and io.js - Appveyor](http://www.appveyor.com/docs/lang/nodejs-iojs)

### 注意点など
- コマンドは、cmd.exe 経由で実行されます。ps: と行頭に付けた場合、PowerShell 経由で実行されます。
- Unix 環境で用いている & (バックグラウンド実行) などは Windows では利用できないので、注意してください。

## その他
AppVeyor はビルドまでの時間、ビルドの時間が Travis CI と比較すると著しく遅いです。そのため、ビルドするブランチを master, develop に絞ったり、他の CI と併用するなどして利用することをオススメします。
【Mac】tmuxのVimでクリップボードに利用するのにやったこと


### はじめに

Macで最近いろいろやるようになって、クリップボードと連携させたくなったので設定しました。
環境は  OSX 10.9.5 です。シェルはzshを使っています。

## clipboardオプションを有効にしたVimのインストール

下記結果で +clipboard が取得できればclipboardに対応しているvimなので新たにインストールしなくてよいです。

```zsh
vim --version | grep +clipboard
```

対応していなかった場合はVimをインストールします。

```zsh
brew install vim
sudo mv /usr/bin/vim /usr/bin/old_vim
sudo ln /usr/local/Cellar/vim/7.4.{インストールしたpatchバージョン}/bin/vim /usr/bin/
```
vimrcに設定を追加します。

```zsh
echo 'set clipboard+=unnamed' >> ~/.vimrc
```

## tmuxの設定をする

OSXで使うために、tmuxのラッパー *reattach-to-user-namespace* をインストールし、tmuxの設定を追加します。

```zsh
brew install reattach-to-user-namespace
echo 'set-option -g default-command "reattach-to-user-namespace -l zsh"' >> ~/.tmux.conf
```

これで、tmuxを起動するとVimとクリップボードの共有ができるようになっています。 

#### 参考URL
[tmuxとMacのクリップボードを共有する](http://qiita.com/upinetree/items/cd80bc7865c52091be10)
[初心者がVimをインストールするメモ](http://qiita.com/South_STR/items/4bd3fb7acd0d5bdf519a)
MR_contextForCurrentThreadはdeprecated


[ここ](https://github.com/magicalpanda/MagicalRecord/wiki/Saving-Entities#context-for-current-thread-deprecation)によると、MagicalRecord 3.0 になったら削除されるみたいですね。

そこで、他の方法を模索してみることに。

MagicalRecord / CoreData歴が浅いのでよくわからないけどメモしておく。

# saveだけ

## before

```swift:XXXObject.swift
func save() {
  let localContext = MR_contextForCurrentThread()
  let obj = MR_createInContext(localContext) as XXXObject
  obj.hoge = "hoge"
  localContext.MR_saveToPersistentStoreAndWait()
}
```

## after

```swift
func save() {
  MagicalRecord.saveWithBlockAndWait {
    (localContext) in
    let obj = MR_createInContext(context) as XXXObject
    obj.hoge = "hoge"
  }
}
```

こんな感じで書けばいいのかな？

# saveしてreturn

このパターンは正直よくわからない。

## before

```swift:XXXObject.swift
func saveAndReturn() -> XXXObject {
  let localContext = MR_contextForCurrentThread()
  let obj = MR_createInContext(localContext) as XXXObject
  obj.hoge = "hoge"
  localContext.MR_saveToPersistentStoreAndWait()
  return obj
}
```

そもそも、これをそのまま`return`していいのかわからないけどこのスレッド内ではデータは使えるはず。

## after

```swift:XXXObject.swift
// identifierというフィールドを用意して主キー的に使う
override func awakeFromInsert() {
  super.awakeFromInsert()
  identifier = NSUUID().UUIDString
}

func saveAndReturn() -> XXXObject {
  var identifier: String!
  MagicalRecord.saveWithBlockAndWait {
    (localContext) in
    let obj = MR_createInContext(context) as XXXObject
    obj.hoge = "hoge"
    identifier = obj.identifier
  }
  return MR_findFirstByAttribute("identifier", withValue: identifier)
}
```

`find`しなおしているのがダサいか…。
Amazon Linux に Sixpack をインストール

Sixpack の環境構築の覚え書き
[seatgeek/sixpack · GitHub] https://github.com/seatgeek/sixpack 

環境：
AMI ID：amzn-ami-hvm-2014.09.1.x86_64-ebs (ami-4985b048)

1 Redis のインストール

以下を参考にさせてもらいました。
[CentOSへのRedisインストールメモ - Qiita] http://qiita.com/n0bisuke/items/2448010c0dfaf8a20167

```lang:RedisEnv.
# wget http://download.redis.io/releases/redis-2.8.17.tar.gz
# tar xzf redis-2.8.17.tar.gz
# cd redis-2.8.17/
# make
# make install
```

2 Python 2.7 のインストール
デフォルトでPython2.6がインストールされているのでアンインストールしてPython2.7をインストール。合せて eazy_install、pip も入れる。以下を参考にさせてもらいました。

[Amazon Linux のPython をアップデートしてbotoをインストールします。 | ナレコムAWSレシピ] http://recipe.kc-cloud.jp/archives/4296

```lang:pythonEnv.
# yum -y remove python
# yum -y install python2.7
# ln -s /usr/bin/python2.7 /usr/bin/python
# cp /usr/bin/yum /usr/bin/_yum_old
# sed -i s/python/python26/g /usr/bin/yum
```

```lang:eazy_install&pip
# curl -o /usr/local/src/ez_setup.py  https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py
# d /usr/local/src/
# python ez_setup.py
# easy_install-2.7 pip
```

3 Sixpack のインストール

これはサイトに出ているまんま。デフォルトの設定ファイルでも起動はする。

```lang:Sixpack
# pip install sixpack
```

4 起動

```lang:Run
# redis-server &
# sixpack &
# sixpack-web &
```
起動確認以下をブラウザで。
http://localhost:5001 <- sixpack-web
http://localhost:5000 <- sixpack
Terraformプラグインの作り方（リソース操作編）


Terraformリソースプロバイダプラグインの作り方については@tkakさんの[TerraformのProviderを作った](http://tkak.hatenablog.com/entry/2014/11/07/074044)というエントリによくまとめられていて、プラグイン作成の全体の流れを把握することができます。

ここでは、プロバイダプラグインが実際にリソースを操作する方法をまとめていきます。

# リソースに対するCRUD

Terraformリソースプロバイダは`schema.ResourceData`というstructを利用してリソースを表現します。

ResourceDataは内部にプロパティを保持しており、ユーザが.tfファイルに記述した各種定義はここに格納され、下記のように`Get()`や`Set()`を介してアクセスできます。

```go
// 入力
// resource "foo_resource" "bar" {
//   your_awesome_name = "baz"
// }

func YourFunc(d *schema.ResourceData) {
	// 読み込み
	v := d.Get("your_awesome_name").(string)
	// v == "baz"

	// 書き込み
	d.Set("your_awesome_name", "new_value")
}
```

TerraformリソースプロバイダはこれらのAPIを用いてリソースに対するCRUDを実装します。CRUD用の関数はすべて下記のような同じインターフェイスで実装します。

```go
func createFoo(d *schema.ResourceData, m interface{}) error {
	// 引数mはConfigureFuncで返す値が渡されます
	// ...
	return err
}
```

これらの関数を`schema.Resource`のフィールドにセットすることで、リソースのCRUD関数として動くようになります。

ここから先はCRUDの各関数で行うべきことについて簡単にまとめます。

## Create

.tfファイルの定義をもとに、実際のリソースを作成します。

Create関数は実際のリソースがまだ存在していない時のみ呼び出されます。すでにリソースが存在している場合にはUpdate関数が呼び出されます。リソースの存在については後述するRead関数によってチェックされます。

```go
func readFoo(d *schema.ResourceData, m interface{}) error {
	foo := PutFoo(d.Get("awesome_name").(string))
	d.SetId(foo.Id)
	// ...
	return err
}
```

## Read

実際のリソースの状態を取得し、引数として渡されてきたResourceDataへ書き込みます。

渡されてきたResourceDataにはユーザが.tfファイルに記述した値があらかじめセットされていて、その値と実際のリソースの状態に差分がある場合にプロバイダが実際の値で上書きするようにします。

Read関数でResourceDataへの上書きを行った場合、Terraformは設定ファイルと実際のリソース状態の差分を埋めるためにUpdate関数を呼び出します。逆に、ResourceDataへ何も書き込まなかった場合にはUpdate関数の呼び出しはスキップされます。

また、対象のリソースが実際には存在していなかった場合にはResourceDataの`SetId()`関数で空文字列を渡すようにします。この場合、TerraformはCreate関数を呼び出してリソースを新たに作成しようとします。

```go
func readFoo(d *schema.ResourceData, m interface{}) error {
	foo := GetFoo(d.Id())
	if foo == nil {
		d.SetId("")
	} else if d.Get("awesome_name").(string) != foo.AwesomeName {
		d.Set("awesome_name", foo.AwesomeName)
	}
	// ...
	return err
}
```

## Update

Read関数を呼び出し、.tfファイルの定義と実際のリソースに差分があった場合にはUpdate関数が呼ばれます。この関数では、引数として渡されるResourceDataの内容にあわせて実際のリソースを変更します。

ResourceDataのプロパティに変更があったかどうかを知るには、`HasChange()`関数を使用します。これによって変更のあったプロパティのみを更新することができます。

```go
func updateFoo(d *schema.ResourceData, m interface{}) error {
	if d.HasChange("awesome_name") {
		EditFooAwesomeName(d.Id(), d.Get("awesome_name").(string))
	}
	// ...
	return err
}
```

## Delete


実際のリソースを削除します。

```go
func deleteFoo(d *schema.ResourceData, m interface{}) error {
	DeleteFoo(d.Id())
	d.SetId("")
	return err
}
```
[LinuxMint]AndroidStudioのインストール

VirtualBox上のLinuxMintにAndroidStudioをインストールした時の、作業手順まとめ。自らの備忘録なので、あまり丁寧には書いていない。

基本的な手順は以下の２つ。Linuxの場合、javaのJDKにはOpenJDKがあるわけですが、どうやらAndroid StudioではOracleJDKを推奨しているようです。

実際、OpenJDKで起動すると警告文が出ます。なので、特別な事情がない限りはOracleJDKを入れるようにしましょう。

したがって、インストールに必要な手順は以下の三つです。
1. OracleJDKのインストール
2. Android Studioのインストール
3. AndroidSDKのインストールとAndroid Studioへの紐づけ


【参考にさせていただいた情報】
http://note.chiebukuro.yahoo.co.jp/detail/n299597
http://coffeetime2011.at.webry.info/201301/article_3.html

1. OracleJDKのインストール
---------------------------
実際は、参考にさせていただいたサイトの手順どおりにすすめていけば問題ないのですが、ここでも同じ内容を必要最低限の部分だけに絞って記載していきます

Oracleの[公式サイト](http://www.oracle.com/technetwork/java/javase/downloads/index.html)から最新のJDKをダウンロードしてきます。（JREじゃなくてJDK）
rpm版とtar.gz版とありますが、.tar.gz版をDLします。
※debian系の話になると思いますが、rpmでのインストールは推奨されていないらしい。「alien」コマンドを利用してrpmパッケージをdebパッケージにしてインストールすることも可能なようですが、今回は無視。

DLしたファイルを/usr/local/javaへ展開します。
端末で以下のコマンドでファイルを移動と展開を行う

```lang:jdk
  mkdir /usr/local/java
　cp ＜DLしたファイル名> /usr/local/java  
  cd /usr/local/java
  tar xvzf <DLしたファイル名>
```

次に、環境変数とJDKの設定を更新します。
Android Studioは「JAVA_HOME」の環境変数からJDKを読みにいくので、JDKがあっても見つけられずにエラーが起きて起動できません。
以下の例では、vimを利用した例です。

```
　sudo vim /etc/profile

　JAVA_HOME=/usr/local/java/（JDKのディレクトリ名）
　PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
　export JAVA_HOME
　export PATH
```

続いて、Oracle javaを登録します。以下のコマンドを順番に実行するだけです。
source /etc/profile

```
　　sudo update-alternatives —install “/usr/bin/java” “java” “$JAVA_HOME/bin/java” 1
　　sudo update-alternatives —install “/usr/bin/javac” “javac” “$JAVA_HOME/bin/javac” 1
　　sudo update-alternatives —install “/usr/bin/javaws” “javaws” “$JAVA_HOME/bin/javaws” 1

　　sudo update-alternatives —set java $JAVA_HOME/bin/java
　　sudo update-alternatives —set javac $JAVA_HOME/bin/javac
　　sudo update-alternatives —set javaws $JAVA_HOME/bin/javaws
```

最後にOracleSDKが読み込まれるか確認します。端末から以下のコマンドを実行して、自分がインストールしたjavaのバージョンが表示されれば成功です。
　java -version

2. Android Studioのインストール
----------------------------------------

Andorod Studioの場合、公式サイトからダウンロードしてくるZipファイルを任意の場所に展開すればよいだけです。

　` unzip ＜DLしたファイル名＞ `

で展開し、展開したフォルダの`android-studio/bin/studio.sh`を起動すればよいです。

メニューにショートカットを登録する。
これは必須ではないですが、個人的にメニューにアイコンを表示させたいので、手順を記載しておきます。といっても、そんなに難しいことではないんですが
メニューからコントロールセンターを選択してウィンドウを表示します。
次にメイン・メニューを選択すると、現在のメニューの状態がわかるウィンドウが表示されます。
その中のアプリケーションで、Android Studioを登録しましょう。
image

上のような形にするためには、画面右上にある「新しいアイテム」を選択します。そうすると、ランチャの作成ウィンドウが表示されますので、以下のように設定します。

　・種類：アプリケーション
　・名前：Android Studio
　・コマンド：<任意の場所>/android-studio/bin/studio.sh

これで、メニュー画面にもAndroid Studioのアイコンが表示されて、選択すれば起動するようになるかと思います。

3. AndroidSDK ManagerをAndroid Studioに紐づけ
------------------------------
書きかけ
AppleLanguagesを上書きする弊害


# 先に結論

`AppleLanguages`を上書きしたら、`NSLocaleCountryCode`の結果が`nil`になってしまった。

(この値を使う事がないならば、`AppleLanguages`を上書きしてしまってもいいかもしれないが…)

# 経緯

アプリ内で言語変更を実装する必要があって調べてみたら

`AppleLanguages`を使う方法が見つかった。

```swift
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(["en"], forKey: "AppleLanguages")
defaults.synchronize()
```

という感じのコードを`applicationDidFinishLaunching`とかに書いておくと、確かに指定した言語に変更する事ができた。

でも、こいつの影響で

```swift
let countryCode = NSLocale.currentLocale().objectForKey(NSLocaleCountryCode)
```

の結果が、`nil`になってしまった。

`NSUserDefaults`の中身を見ていると`AppleLocale`という物もあって、こいつをいじればいいのかなぁと思って、

```
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(["en"], forKey: "AppleLanguages")
defaults.setObject("en-US", forKey: "AppleLocale")
userDefault.synchronize()
```

とかやると、`countryCode`は`US`を返すようになった。

でも、設定アプリで地域とかを変更しても変更した値が取得できない。

色んなタイミングで`removeObjectForKey`で消してみたんだけど改善せず。

結局、言語に応じて`Localizable.strings`を切り替える方法に変更。

まぁ、安易にシステム側から設定される値を上書きするべきではないですね(笑)
Javaの実行結果をbottle.pyでWebに表示する

ちょっと前にEclipseを使ってJavaのプログラムを書いたのだが、これをWebにするのが面倒そうだったので、Pythonのbottle.pyというフレームワークを使って`java hoge.hoge.com.HelloWorld`というコマンドを実行して標準出力を表示するサーバを作ってみた。


```py3
import os
from bottle import route, run, template

@route('/java')
def index():
    os.chdir("c:\\workspace\\HelloWorld\\bin")
    s = os.popen("java hoge.hoge.com.HelloWorld")
    return template('{{output}}', output=s.read())

run(host='127.0.0.1', port=8080)
```

ちなみにbottle.pyは、こんな感じで書けばWebサーバにできる軽量サーバ。ちょっとした確認に便利そう。というかJavaは苦手っす。

```py3
from bottle import route, run, template

@route('/hello/<name>')
def index(name):
    return template('<b>Hello {{name}}</b>!', name=name)

run(host='localhost', port=8080)
```
SafariからPHPExcel、CSVでファイルをダウンロードすると.htmlになってしまう。


CSVの場合は、viewを以下のようにする。

```lang:PHPExcel
<?php
$this->Csv->addRow($row);
echo $this->Csv->render(true, 'sjis-win', 'utf-8');
exit;//この一行を足す
```

参考：http://norm-nois.com/blog/archives/2416


PHPExcelの場合は、viewを以下のようにする。

```lang:CSV
<?php
$writer->save('php://output');
exit;//この１行を足す
```

参考：http://phpjp.info/?PHPExcel%20Excel%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90
SwiftのカスタムクラスArray操作その3（ユニーク）【メモ】

#SwiftのカスタムクラスArrayでユニーク値

SwiftのArray内に以下の様なクラスのオブジェクトが入っていたとして、プロパティの値のユニーク一覧を取得するときのメモ。

**※末尾にNSArrayでの記法も書いておきます。
（NSArrayのvalueForKeyPath:メソッドは非常に有難いです）**

##使用するカスタムクラス（!無しのプロパティに修正）

```swift:Cat.swift
class Cat:NSObject{
    var name:String
    var color:String
    var age:Int
    var score:Int

    init(data: (String,String,Int,Int)){
        name = data.0
        color = data.1
        age = data.2
        score = data.3
    }
}
```

##テストデータ

テストデータを準備しておきます。

```swift:UseCat.swift
var all_cats:[Cat] = [Cat]()
all_cats.append(Cat(data:("タマ","白",10,10)))
all_cats.append(Cat(data:("コトロ","茶トラ",2,10)))
all_cats.append(Cat(data:("ミケ","三毛",3,10)))
all_cats.append(Cat(data:("チビトラ","茶トラ",4,10)))
all_cats.append(Cat(data:("タケチヨ","キジトラ",7,10)))
all_cats.append(Cat(data:("マリアンヌ","白",7,10)))

```

##ユニークな値を取るには

正直いい方法が見つからなかったので、filterとreduceを組み合わせてみました。
（もっといい方法がありましたらぜひ教えて下さい）

【やり方】
・reduceの引数(=戻り値)をtemp:Array<String>にして、そこに重複しない値をappendする

```swift:UseCat.swift
var cat_colors = all_cats.reduce([String](),{
    //引数省略の$0はそのままではreturnできないので、変数に代入
    var temp = $0
    //存在チェックで使用したい値を変数に確保
    let color = $1.color
    
    //戻り値の配列arrayに対して、カテゴリ値でフィルター件数を取得
    let count:Int = temp.filter({
        $0 == color
    }).count
    
    //まだ存在していなければ、追加
    if count==0 { temp.append($1.color) }
    return temp
})

//結果確認
println(cat_colors)
```

```vim:【実行結果】
[白, 茶トラ, 三毛, キジトラ]
```

##Objective-Cと同様にNSArrayを使う場合

NSArrayのvalueForKeyPathというメソッドは非常に高機能で、このようにユニークだけでなく最大最小、平均、合計なども簡単に処理することができます。

Swiftで利用するときには、配列をNSArrayでキャストすることと、戻り値となるArrayの型を明記することが大切です。

```swift:UseCat.swift
let cat_colors2
    = (all_cats as NSArray).valueForKeyPath("@distinctUnionOfObjects.color")
        as [String]
println(cat_colors2)
```

```vim:【実行結果】
[白, 茶トラ, 三毛, キジトラ]
```
【デザイナー向け】[Xcode6]AssetCatalog用にpdf素材を制作する時の注意点


Xcode6 から Asset Catalogでベクター形式がサポートされた事により、RetinaやNon Retinaで別々の画像を用意する必要がなくなりました。
pdf(ベクターデータ)が利用できることにより、1xのサイズのpdfデータを1つだけ用意すれば良くなりました。
実際iOSアプリにてpdf素材を制作してみて…失敗から発見したことがありましたので、失敗制作フローと注意点を残しておきます。

##参考
[Asset Catalog でベクターが扱えるようになりました！](http://dev.classmethod.jp/references/xcode-6-asset-catalog-vector/)



#実際の制作フロー
##STEP1:【Photoshop】でモック制作
![sam01.jpg](https://qiita-image-store.s3.amazonaws.com/0/42236/62bdf27f-6d7a-a14b-b786-2dbd7df86afb.jpeg "sam01.jpg")


今回、単純なオブジェクトに白フチがついた素材を制作しました。
アプリのラフ案自体もPhotoshopで制作していたので、Illustratorでシェイプを制作後、Photoshopで整えるという流れで制作しています。

##STEP2:【Photoshop】で白フチ書き出し失敗
![sam03.jpg](https://qiita-image-store.s3.amazonaws.com/0/42236/b2969f41-6282-a6b3-4fdd-b010c5efeb2a.jpeg "sam03.jpg")


レイヤースタイルを利用して白フチを制作したものをpdfで書き出しをしても、
レイヤースタイルで制作した白フチはベクター化されない為ボヤけてしまいます。

##STEP3:【Photoshop】でスマートオブジェクト化し失敗
Illustratorで制作したシェイプデータを白フチ込みで、Photoshopに持ってきてスマートオブジェクト化しました。
スマートオブジェクトの中身はベクターデータなので…ボヤけないのではないかと考えましたが、残念ながら失敗しました。

##STEP4:【Illustrator】で白フチ込みのデータを書き出し
![スクリーンショット-2014-11-13-20.31.28.jpg](https://qiita-image-store.s3.amazonaws.com/0/42236/8be4330b-ad6f-4536-1a75-6addd5fe1fe1.jpeg "スクリーンショット-2014-11-13-20.31.28.jpg")


結果的にIllustratorで白フチ付きのシェイプデータを制作しました。
この際、アートボードを1xのサイズに指定します。書き出しの際は<b>Illustratorの編集機能を保持</b>のチェックを外し保存して完成しました。


#注意点
##【Photoshop】スマートオブジェクト化ではボケてしまう
スマートオブジェクト内はシェイプデータなので、
もしかして…pdfなら拡大してもボケないのでは？と甘い考えをしました。
結果的にスマートオブジェクト化にしてもボケました。

##【Illustrator】でアートボードサイズを指定
そもそも、イラレでシェイプデータを制作する時に
アプリに入れるサイズまで意識して制作していないかと思います。（私だけかもしれませんが
なので、フォトショ上で書き出したいサイズを確認⇒イラレでアートボードサイズを指定したいサイズに変更し、
そこに収まるようにベクターデータを調整して書き出しました。

```
Illustrator で書き出したサイズと、Asset Catalogに入れたときのサイズが合わないという問題
```
上記のような現象があるとしたら、もしかすると…アートボードサイズが合っていないから起きているのかもしれません。
今回アートボードサイズを指定して、実際に組み込んでもらった所…特に問題はなかったようです。

##書き出す際、"編集機能を保持"のチェックを外す
書き出す際、<b>"Illustratorの編集機能を保持""Photoshopの編集機能を保持"を必ず外し保存。</b>
ここにチェックが入ってるだけ<b>10倍くらい容量が重く</b>なりました。
保存の際は、すべてのチェックを外して保存しています。


#考えられる解決策
- Photoshopでラフ案を制作する時点で、すべてをシェイプデータにして配置する
- 最初からPhotoshop完結出来る作りにしておけば、Illustratorでのアートボード調整などは不要
- 白フチなどIllustratorでも代用できる表現は、あらかじめシェイプ化して制作する
- Illustratorで素材を制作する際、1xサイズで制作する

#結論
- 当たり前ですが…ベクターデータでないと表現不可能
- <b>Photoshop特有の表現(レイヤースタイル)をベクターデータにするのは大変</b>
- 複雑な表現をpdfすることは出来ないので、フラットデザイン化が進む…
- いっそpngで切り出した方がスピードは早いかも

臨機応変にpngにしたり、pdfにしたりすれば良いのかと思いますが、
あらかじめ、デザイナー側で制作の工夫(Photoshop or Illustrator)が必要かもしれないです。
（今後ベクター化が進むとなると…最初からIllustratorで制作して方が効率的になる可能性もあり？）

#追記(2014.12.02)
pdfを使用すると、若干の変色をすることが確認しました。
見て分からない程度ですが、pdfより書き出したビットマップデータの方が濃く発色しているようです。
今のところ…確実に再現するには、pngで各サイズを書き出すのが確実かもしれません。

#追記(2015.01.14)
![色比較.jpg](https://qiita-image-store.s3.amazonaws.com/0/42236/53effd1f-5409-db2b-6864-7aa26b9647a0.jpeg)

実際にどれだけ色が違うかを比較したところ、
pdfを書き出した後の方が色が濃くでることが分かりました。
border等、細い線の色再現はかなり難しいかもしれません。

#おわりに
今回のは一例になりますので必須事項ではありません。参考程度にして頂ければと思います。
画期的な解決策ありましたら…是非教えて頂きたいです。
RubyMine 7にアップグレードしたら Cannot switch SDK. になる場合の対策

# 現象

RubyMine 7が公開されていました。早速アップグレードしましたが、存在するはずのRubyを`.ruby-version`に記述していたのですが、以下のメッセージが出てしまいました。

```
8:29:43 PM Project .ruby-version Settings: Cannot switch SDK. RVM SDK '2.1.3' wasn't found. (show balloon)
```

# 原因と対策

原因としては、.ruby-installの書き方がまずいようでした。（逆に、RubyMine 6までは、下記の記述で大丈夫でした。）

```:.ruby-version
2.1.3
```
これを、以下のように変更すると解決しました。

```:.ruby-version
ruby-2.1.3
```

RVMのlistの中で、以下のようになっていたので、それに則した形で記述する必要があったのかな？

```
➜  ~  rvm list

rvm rubies

   ruby-1.8.7-head [ i686 ]
   ruby-1.8.7-p374 [ i686 ]
   ruby-1.9.2-p320 [ x86_64 ]
   ruby-1.9.3-p547 [ x86_64 ]
   ruby-2.0.0-p353 [ x86_64 ]
   ruby-2.0.0-p481 [ x86_64 ]
   ruby-2.1.0 [ x86_64 ]
   ruby-2.1.2 [ x86_64 ]
=* ruby-2.1.3 [ x86_64 ]

# => - current
# =* - current && default
#  * - default
```
# References

- [rvm - Ruby Mine complains that "Cannot switch SDK." even if the SDK is there and available - Stack Overflow](http://stackoverflow.com/questions/23171956/ruby-mine-complains-that-cannot-switch-sdk-even-if-the-sdk-is-there-and-avail)
Slack上にTimelineを形成して全チャンネルの発言をゆるく眺める


## これはなに

![スクリーンショット_2014_11_13_20_09.png](https://qiita-image-store.s3.amazonaws.com/0/20074/0ce84943-a00a-20b8-a77c-836c5d925b11.png "スクリーンショット_2014_11_13_20_09.png")

@kozyty@github が社内で作っていたtimeline形成用のhubot-scriptをパッケージ化してみました。

[hubot-slack-timeline](https://www.npmjs.org/package/hubot-slack-timeline)

Slack上のプライベートグループを除いた全てのチャンネルの発言を一つのチャンネル(#timeline)に集約します。

常に流れを追おうとするのではなく、ゆるく社内の会話を眺めるのに適しています。

## 使い方
### 前提条件
- Slack上でHubotを飼っていること

### 設定

事前にSlack上で `#timeline` チャンネルを作成しておきます。

![スクリーンショット_2014_11_13_20_12.png](https://qiita-image-store.s3.amazonaws.com/0/20074/143cabe8-b37f-eb15-3d48-83e48c602522.png "スクリーンショット_2014_11_13_20_12.png")


external-scripts.jsonに以下を追加

```
["hubot-slack-timeline"]
```

環境変数にSlack API TOKENを設定

Herokuで動かしている場合

```
% heroku config:add SLACK_API_TOKEN="YOUR_SLACK_API_TOKEN"
```

Unix環境の場合

```
% export SLACK_API_TOKEN="YOUR_SLACK_API_TOKEN"
```


その後、Hubotをデプロイしたら完了。
Linuxカーネルアップデートメモ

カーネルアップデートしたい時のメモ

32bitならi386のを代わりにダウンロード
http://kernel.ubuntu.com/~kernel-ppa/mainline/

```
$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.16.7-utopic/linux-headers-3.16.7-031607_3.16.7-031607.201410301735_all.deb

$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.16.7-utopic/linux-headers-3.16.7-031607-generic_3.16.7-031607.201410301735_amd64.deb

$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.16.7-utopic/linux-image-3.16.7-031607-generic_3.16.7-031607.201410301735_amd64.deb

$ sudo dpkg -i linux-headers-3.16.7*.deb linux-image-3.16.7*.deb
```

再起動、これでアップデート完了

動作が正常でなかった場合は以前のカーネル(Grub -> Advanced -> 以前のカーネルを選択)で起動して
以下のコマンドでカーネル削除

```
$ sudo apt-get remove 'linux-headers-3.16.7*' 'linux-image-3.16.7*'
```

最後にgrub menuのアップデート

```
$ sudo update-grub
```
DELL P2815Q を iMac の Retina ディスプレイとして使う


# 目的

DELL の 4K ディスプレイ P2815Q を iMac Late 2013 の Retina ディスプレイとして使おうと思いましたが、普通に接続しただけでは ```@1x``` の ```1920x1080``` でしか利用できませんでした。

そこで、ディスプレイ設定を書き換えて、P2815Q を Retina ディスプレイとして使えるようにしました。

# 環境

* iMac Late 2013 (21.5-inch)
* DELL P2815Q (DisplayPort 接続)
* OS X 10.10.0 Yosemite

> MacBook Pro with Retina 13-inch では、普通に接続するだけで P2815Q を Retina ディスプレイとして使用できました。

# ディスプレイ設定を書き換える

## 設定ファイル名

ディスプレイ設定は ```/System/Library/Displays/Overrides``` フォルダー内に設定ファイルを使って調整できます。

この中に ```DisplayVendorID-???/DisplayProductID-???``` という名前で設定ファイルを用意します。今回の DisplayPort に接続した P2815Q であれば ```DisplayVendorID-10ac/DisplayProductID-f05a ``` になるようです。

> 環境によっては ID が違うことがあるかもしれません。接続方法によっても変わってきます。自分の環境では ```DisplayProductID``` が DisplayPort 接続では ```f05a``` に、HDMI 接続では ```f05c``` になっていました。

## 設定ファイルの内容

設定ファイルは XML 形式で、次の内容を保存します。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
     <key>IODisplayEDID</key>
     <data>AP///////wBMLYALAAAAADQXAQS1PSN4Ol+xoldPoigPUFS/74BxT4EAgcCBgKnAswCVANEAC8IAoPBwPoAwIDUAX1khAAAaVl4AoKCgKVAwIDUAX1khAAAaAAAA/QAySx6GNgAKICAgICAgAAAA/ABVMjhENTkwCiAgICAgAfUCAwzwIwkHB4MBAAACOoAYcTgtQFgsRQBfWSEAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlw==</data>
     <key>DisplayProductName</key>
     <string>DELL P2815Q (EZ-NET, DP)</string>
     <key>scale-resolutions</key>
     <array>
          <data>AAAPAAAACHAAAAAB</data>
     </array>
</dict>
</plist>
```

これで Mac を再起動すると、```1920x1080``` の Retina ディスプレイとして利用できるようになります。

# 解像度の設定

解像度の設定は MacBook Pro with Retina のような専用の画面設定ではなく、通常の画面設定で行います。

![U28D590D-setting-fullhd.png](https://qiita-image-store.s3.amazonaws.com/0/17198/7e161835-c6a6-d54a-dbde-e0395e036705.png "U28D590D-setting-fullhd.png")

ここで ```1920x1080``` を選択すると、この ```@2x``` の解像度、つまり ```3840x2160``` ピクセルの出力になります。ここで ```3840x2160``` を選択すると、数値のとおりの解像度が ```@1x``` で出力されます。

> ```低解像度``` と記されている解像度は ```@1x``` で出力されることを意味します。ただし最大解像度は、そう記載されていなくても ```@1x``` で出力されるようです。

# 出力される映像について

DELL P2815Q で ```3840x2160``` を出力するには、仕様上 ```30Hz``` で出力しないといけないはずですが、今回の設定では ```60Hz``` しか選択できません。

ディスプレイで信号を確認すると、DisplayPort 接続では ```2560x1440``` の ```60Hz``` で出力されているようです。

![signal-dp-samsung.JPG](https://qiita-image-store.s3.amazonaws.com/0/17198/25bde11b-30b7-cb3f-27ff-a58b6da29fb7.jpeg "signal-dp-samsung.JPG")

そのため、必ずしも完璧な情報を送れていないかもしれません。

実際、```1920x1080``` の Retina に設定すると、見た目的になんとなく滲んでいる感じもします。もちろん、ピクセルが抜けるわけではないので、設定したとおりの Retina ディスプレイとして振舞いますし、スクリーンショットも完全に撮れるので、問題にはならなそうです。

もし Retina に完全な美しさを求めたい場合は、解像度を半分の ```1280x720``` くらいに抑えるのが良いかもしれません。

---

[詳細] http://ez-net.jp/article/25/7cndVOZE/nLAALA24WeHz/

> ブログでは、DisplayProductID の調べ方や、設定ファイルの内容についての詳細、そして ```1920x1200``` で Retina 出力する方法についても記しています。
これから sails.js を始めるときにおさえておきたい10のこと ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい | sails.js (0.10.x) で始めるアプリ開発

# sails.js とは？

Node.js でできたフルスタックのウェブアプリケーションフレームワークで以下の特徴があるよ

 - Ruby の rails みたいな感じ
 - URLのパスからの自動マッピングでコントローラー実行、モデル操作などでコード量を軽減
 - WebSocketを使ったリアルタイム処理(pub/sub)も特に意識せず開発できる
 
とりあえず、node.js + npmの環境があるなら `npm install sails -g` みたいな感じでインストール！

# サンプルアプリケーション作成

ワンコマンド `sails new waai_project` で一発でサンプルアプリケーション作成できるよ、作成後 `npm install` を忘れずにね

# アプリケーションの起動

帆を上げよ！YooHoo！パイレーツ・オブ・カリビアーンな感じで！

```bash
sails lift
```

でアプリケーションが起動するよ。`sales` じゃないからコマンドの打ち間違いには注意ね `http://localhost:1337` で確認

# sails.js 公式ドキュメントがオフラインで読めるからダウンロードしよう

sails-docsがgithub.comからチェックアウトできるよ。オフラインでもドキュメント確認できて便利。

# 対話的なCLIを使って動作確認

**アプリケーションを都度都度起動するのは面倒だよ。各モジュールの動作を確認したりするなら対話的なCLIが使える。**これを使いこなすとsails.jsの仕組みの理解が一気に進みやすいよ :heart_eyes: 

# grunt については知っておいた方がいいよ

アプリケーション起動時にsails.jsはgruntを実行するので、ちょっとおさえておいた方がいいよ。

# テストはmocha使う感じで

他のテストフレームワークでもいいけど、公式はmochaを推奨

# 各種設定や、開発環境・本番環境の切り替えは config ディレクトリの中が重要な役割

config 内のことはざっとドキュメントの目を通すと良いよ。公式ドキュメントの Anatomy のセクションは超参考になるよ。

必読

 - DBコネクション設定関係 connections.js
 - ロギング設定関係 log.js

少したったら読む

 - ルーティング関係 routes.js
 - ポリシー関係 policies.js
 - ビュー関係 views.js

# ORMのwaterlineの応用に進もう

少し複雑なものをつくるなら、ORMのwaterlineを理解しておこう。

 - DBのテーブルリレーション：1対1、多対多、1対多、などなど
 - connection, adapter 等、複数のデータソース（RDM、KVSの混在環境）の設定方法など

# 参考資料

 - 公式： 
 - コミュニティ： 
 - http://nantokaworks.com/p1320/
eclipse で .js ファイル内の文字をコピー Ctrl+C したらハングするときの対処方法 ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

皆さんこんにちはっス。

# 現象

Eclipse + nodeclipse の環境で、javascript editor 使用時、文字列 :ab: をコピー :clipboard: するために Ctrl+C するとEclipseがハング :scream: することがあります :sweat_drops:

## バージョン等

 - windows7
 - jdk 1.7.0
 - Eclipse Luna SR1 4.4.1
 - Nodeclipse 0.5.0

# :hammer: 対処方法

:ghost: メニューから

ウィンドウ > 設定 > 一般 > エディター > テキスト・エディター > ハイパーリンク

を開き、「オンデマンド云々・・・」のチェックボックスをOFFにする :ballot_box_with_check: ⇒ :black_medium_square:

誰のバグ :bug: なのかは不明です

# 参考

 - http://stackoverflow.com/questions/20392791/eclipse-hangs-on-copy-cut-for-javascript-files
 - http://stackoverflow.com/questions/3515422/why-does-eclipse-hang-on-copy-paste-in-javascript-files
xcode 6.1 で An error was encountered while running (Domain = FBSOpenApplicationErrorDomain, Code = 4) なエラーが出た時の対応

![Screen Shot 2014-11-13 at 19.10.27.png](https://qiita-image-store.s3.amazonaws.com/0/18705/d71f5454-ffa2-9a49-e953-0aa43292d164.png)

iOS Simulator のメニューからReset Content and Settings。

![Screen Shot 2014-11-13 at 19.10.44.png](https://qiita-image-store.s3.amazonaws.com/0/18705/62aa16b2-52ba-e684-7323-3eecb940e880.png)

でだいたいは直る様です。



# References

* http://stackoverflow.com/questions/24763743/simulator-error-fbssystemservicedomain-code-4
Swiftプロジェクトにブリッジングヘッダを追加する方法

SwiftからObjective-Cを呼び出すためのブリッジングヘッダ、SwiftプロジェクトにObjetctive-Cのソースを新たに生成したり、.mファイルをドロップして追加した時は生成ダイアログが表示されるのですが。「Add Files to」などで追加した場合はダイアログが表示されないようです。
そこで、後からブリッジングヘッダを追加する方法を調べました。
プロジェクト内に、適当な名前でブリッジングヘッダ用のヘッダファイルを作成し、プロジェクトのターゲットの、「Building Settings」ー「Swift Compiler - Code Generation」ー「Objective-C Bridging Header」にヘッダファイルのファイルパスを登録します。

![スクリーンショット 2014-11-13 18.14.14.png](https://qiita-image-store.s3.amazonaws.com/0/26936/9b39b077-b53f-8dff-9107-2ca398dd0f63.png)
Java で Git を操作する

とある Git リポジトリからファイルをごっそり持ってきて加工したあげく別システムに取り込むバッチ処理を作る必要があったので触ってみました。

## Jgit とは？
* Java で Git を操作するためのライブラリ
  * Eclipse 用の Git プラグイン Egit で使われているらしい
  * ので Eclipse Foundation が開発しているらしい
      * http://www.eclipse.org/jgit/

## やりたいこと
* リモートリポジトリを含めたブランチ一覧の取得 (git branch -a)
* ローカルブランチの切り替え (git checkout ほげほげ)
* ローカルブランチとリモートブランチのマージ (git pull もしくは git fetch ＆ git merge)

## サンプルコード
* 前提
  * Jgit ライブラリは適宜ダウンロードするなり maven や gradle で使えるようにしておく
      * 下記コードは Jgit の Core Library だけで動くはず
* 操作するローカルリポジトリは git clone 実行済み (以下例だと /ika に clone した状態)

```JgitSample.java
public class JgitSample {
    public static void main(String[] args) throws Exception {
    	// ローカルリポジトリの指定など
        FileRepositoryBuilder builder = new FileRepositoryBuilder();
        Repository repository = builder.setGitDir(new File("/ika/" + Constants.DOT_GIT)).readEnvironment().findGitDir().build();

        // Git オブジェクト作成 (このオブジェクトを操作していろいろする)
        Git git = new Git(repository);
        // まず fetch してブランチの情報を最新にしておく
        try {
            git.fetch().setRemote(Constants.DEFAULT_REMOTE_NAME).call();
        } catch (GitAPIException e) {
                throw new RuntimeException(e);
        }

        // ブランチの切り替え(リモートにあるやつ)
	    try {
            // 初めてリモートリポジトリを checkout する場合
	    	git.checkout().setCreateBranch(true).setName("ブランチ名")
				.setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.SET_UPSTREAM)
				.setStartPoint("リポジトリ名" + "ブランチ名").call(); # origin/ブランチ名 みたいに設定する

	    } catch (RefAlreadyExistsException e) {
    	    // 2回目以降(checkout 済みだと上記例外が投げられるっぽいので)
	    	try {
	    		git.checkout().setName("ブランチ名").call();
	    		git.pull().call();
	    	} catch (GitAPIException e1) {
                throw new RuntimeException(e);
	    	}
	    } catch (GitAPIException e) {
		    throw new RuntimeException(e);
	    }

        // ブランチ名の一覧取得(Ref の getName()で「refs/remotes/origin/master」のように取得できる)
        List<Ref> branchList = git.branchList().setListMode(ListBranchCommand.ListMode.ALL).call();
    }
}
```
Firefoxでbackground-positionが指定できない

jQueryを使って背景位置を指定しようとした時にFirefoxだけ動かずハマったのでメモ。

そもそも

```js
$('hoge').css('background-position-x');
```

とかx,y個別に値を取ろうとしてもなぜか無理だけど、

```js
$('#hoge').css('background-position');
```

とすると、`0px 0px`って形の*String*がとれるので、これをごにょごにょしたりして

```js
$('#hoge').css('background-position', '10px 10px');
```

とかで*x,y*一緒に指定してあげると動く。
Flash Lite 1.1で気をつける事

モバイル向けのプラットフォームであるFlash Lite。その中でも初期のバージョンで、わりと古めの機種にも対応しているFlash Lite 1.1での制作で気をつけることのメモ。

以前待ち受け画面を作った時に試したバージョンなんだけど、いろいろ忘れている事が多かったので最初は身体が慣れるのに苦労した。

基本的にはActionScript1.0、Flash Player4と同等で、それプラス携帯電話固有の情報をfscommandで扱えたりする。
以下に列挙。

##*Function*の概念がない
代替として、フレームスクリプトを書いてラベルを貼り

```as
call("FrameLabel");
```
でスクリプトを呼び出す。引数は渡せない。

##*Array*の概念がない
代替として、文字列とeval()を使って

```as
a0 = "ichi";
a1 = "ni";
a2 = "san";
for(i=0; i<3; i++){
	trace( eval("a" add i) );
}
// 出力 ichi, ni, san
```
保持・呼び出しする。

MovieClipの生成。

```as
for(i=0; i<9; i++){
	newName = "mc" add i*9;
	duplicateMovieClip( "tempMC", newName, i);
	eval(newname)._x = i*10;
}
```

##*this*とか*return*とか*var*とかない
`_root`と`_parent`はある。それぞれ`/:`と`../:`でも代替できる。

##*tellTarget(){}*内での*_parent*の扱い
```as
a = 0;
tellTarget("mc"){
	_x  = _parent.a;
}
```
みたいな場合、mcから見た階層になるので同タイムラインに記述しても_parentが必要になる。

##変数名の大文字と小文字は区別しない

```as
a = 0;
A = 1;
trace(a);
```
AS2、AS3なら当然のように0が出力されるけど、AS1だと、aとAを同じ変数とみなすので値が上書きされて1が出力されます。普段あまり意識しないで使ってると意外とハマる。

##文字列の連結は*+*じゃなくて*add*
比較は`==`じゃなくて`eq`、`!=`じゃなくて`ne`。

##*Number*のキャストは*int()*で

```as
a = "02";
trace( Number(a))
// 出力 = 02

trace( int(a))
// 出力 = 2
```

##*(a | 0)*は使えない
`Math.floor()`を代わりに使う。

##*substring( str, 0, i)*と*substring( str, 1, i)*の返る値が同じ
これしばらく悩み続けました。

```as
str = "abcdefg";
trace( substring( str, 0, 3) );
// 出力 = abc

trace( substring( str, 1, 3) );
// 出力 = abc

trace( substring( str, 2, 3) );
// 出力 = bcd
```
どう考えてもおかしいんですがそういうことみたい
Redisの起動と停止


##redisサーバの起動
$redis-server

##クライアントの起動
$redis-cli
ここでいろいろ操作できる

##終了
redis-cliから
$shutdown

※Ctrl + Cでも停止できるけど、メモリに残っているデータは消える


##サーバが裏側で動いているとき
サーバを立ち上げようとして、
`[90750] 13 Nov 18:47:25.610 # Creating Server TCP listening socket *:6379: bind: Address already in use`
のエラーが出ることがある

→既にそのアドレスは使われている(既にサーバが立ち上がっている)

###確かめる
redis-cli ping
→pong が返ってきたらredisが動いている

$redis-cli shutdown
で停止することができる
文書の特徴をベクタライズする

これまで[テキストマイニングの流れ](http://qiita.com/ynakayama/items/aa4596fa44b4872bd326)を説明し、[文書から TF-IDF を指標として特徴となる語彙を抽出](http://qiita.com/ynakayama/items/234ad00ae520030217ab)し、それらの[語彙を可視化する](http://qiita.com/ynakayama/items/8c898253bcf124862de3)といったことをしてきました。

少し間が空いてしまいましたが、こうして得られた文書の特徴をベクタライズする流れを今回は記述します。

## ベクトル化する

機械学習などの手法で文書を扱うにあたり、まずその対象の特徴を数列 (一次元配列) にするのがよくある方法です。

線形の数列同士であれば、たとえば類似度を算出したり、似たもの同士を分類するといったことも、機械学習ライブラリを用いて簡単におこなうことができます。

今まで扱ってきた自然言語処理は結局のところ、その文書を表す数列を求めるまでの処理といっても過言ではないでしょう。

### ベクタライズのイメージ

自然言語で書かれたテキスト文書を

![1.png](https://qiita-image-store.s3.amazonaws.com/0/38501/d765e1ef-2eb4-15a3-2650-a497dc957509.png)

↓↓↓↓↓

![2.png](https://qiita-image-store.s3.amazonaws.com/0/38501/60d8e411-d397-a0a8-5dbc-11b17d5ecf22.png)

数列 (一次元配列) に変換する

## ベクトルの生成

このようなテキストの処理はスクリプト言語をグルー (糊) として順次処理していくと、柔軟であり検証もしやすく便利です。

### ワードカウントする

ワードカウントはデータ分析でよくある事前処理のひとつで、たとえば Hadoop などでのサンプルとしても登場するので、よく知られるポピュラーな方法のひとつです。

Ruby を使うときわめて簡潔に記述できます。

```rb
# @hits にあれば件数を加算、無ければ 1 を用意する
def wordcount(word)
  @hits.has_key?(word) ? @hits[word] += 1 : @hits[word] = 1
end
```

こうして「単語」すなわち「特徴」と、そのカウントがハッシュとして求まります。ハッシュの値でのソートは次のようにします。

```rb
hash.sort{|a, b| b[1] <=> a[1]}
```

ただしハッシュの順序は現在の言語仕様ではともかく、本来的に保証されるとは限らないので気をつけましょう。たとえば Ruby の現在の安定版では保証されますが、他の Python の場合は OrderedDic を利用するなどします。

### ベクタライズする

各文書の特徴をワードカウントしたなら、全体の語彙を一覧とし、各文書が全語彙のどれをどの数だけ含んでいるかを数列にします。

これも単にあれば 1 なければ 0 の数の列にするという方法と、登場回数をそのまま数列にする方法とがあります。前者はベルヌーイ分布、後者は多項分布になります。

今回は多項分布を想定します。あまり処理効率は考えず、文書ごとのベクトルと、全体の語彙すべてを詰め込んだファイルを作ってみます。

```rb
@all_words = [] # 全語彙を格納する配列
@word_vector = {} # どの文書がどういうベクトルを持つかを保持するハッシュ

dic = {}
open(filename) do |file|
  file.each_line do |line|
    word, count = line.force_encoding("utf-8").strip.split(',')
    dic[word] = count.to_i # ワードカウントの結果をハッシュに詰め込む
  end
 end
@all_words.concat(dic.keys) # 全語彙表に登場した語彙を入れていく
@word_vector[filename] = dic # 文書ごとにハッシュをハッシュに格納

@all_words.sort.uniq # すべての語彙はこれで求められる
```

このように、登場するすべての語彙と、各文書がどの語彙をどの回数だけ含むかという数列を詰め込んだハッシュができあがるわけです。

これをベクタライズしていきます。

```rb
# まずはハッシュを走査
@word_vector.each {|filename, words|
  vector = [] # 空のベクトルを用意して
  @all_words.each {|word| # ソートされた語彙表ごとに
    vector << words[word].to_i # 登場回数を数値として埋め込んでいく
    # Ruby の場合はハッシュにキーが無ければ nil が返り
    # nil を .to_i すれば既定で 0 になるので
    # 無ければそのまま 0 が埋め込まれることになる
  }
  write_file(filename, vector) # ファイルを書き出す
}
```

## まとめ

今回はベクタライズができました。プログラミングができる人にとってはごくごく簡単な処理であったと思います。

こうして得られた数列同士をどのように処理していくかは機械学習の話になりますが次回以降解説していきます。
Spockにおいて、setupSpecでMockした場合とsetupでMockした場合の振る舞いまとめ

最近の単体テストでは欠かせないMockingですが、GroovyのテストフレームワークであるSpockでもなかなか強力なMocking機能が標準搭載されています。

この記事では、よくMockingのためのコードを記述するsetupSpecとsetupでの振る舞いについて、一個のテストクラスにまとめてみました。


```groovy:MockTest.groovy
@Grab(group='org.spockframework', module='spock-core', version='0.7-groovy-2.0')

import spock.lang.*

class MockTest extends Specification {
  interface ClassA{
    int method1()
  } 
  
  static ClassA classA_spec,s1
  static ClassA classA_setup,a1
  
  def setupSpec(){
    classA_spec = Mock()
    s1 = classA_spec
  }
  def setup(){
    classA_setup = Mock()
    a1 = classA_setup
  }
  
  def "setupSpecでMock()されたオブジェクトはメソッドの動作定義が出来ない(setup)"(){
    setup:
    classA_spec.method1() >> 1
    
    expect:
    s1.is(classA_spec) && s1.method1() != 1
  }
  
  def "setupSpecでMock()されたオブジェクトはメソッドの動作定義が出来ない(when)"(){
    when:
    classA_spec.method1() >> 2
    
    then:
    s1.is(classA_spec) && s1.method1() != 2
  }

  def "ただしsetupSpecでMock()されたオブジェクトでもwhereではメソッドが定義できる"(){
    expect:
    s1.is(classA_spec) && s1.method1() == 3
    s.is(classA_spec) && s.method1() == 3
    
    where:
    s << [{classA_spec.method1() >> 3;s1}()]
  }
  
  def "setupでMock()されたオブジェクトはメソッドの動作定義ができる(setup)"(){
    setup:
    classA_setup.method1() >> 1
    
    expect:
    a1.is(classA_setup) && a1.method1() == 1
  }

  def "setupでMock()されたオブジェクトはメソッドの動作定義ができる(when)"(){
    when:
    classA_setup.method1() >> 1
    
    then:
    a1.is(classA_setup) && a1.method1() == 1
  }

  def "setupでMock()されたオブジェクトではwhereではメソッドが定義できない"(){
    expect:"where時点のオブジェクトとも変わる"
    a1.is(classA_setup) && a1.method1() != 1
    !a.is(classA_setup) && a.method1() != 1
    
    where:
    a << [{classA_setup.method1() >> 1;classA_setup}()]
  }

  def "setupでMock()されたオブジェクトではdataテーブルが有効"(){
    setup:
    classA_setup.method1() >> data
    
    expect:
    a1.is(classA_setup) && a1.method1() == data
    
    where:
    data << [1,2,3]
  }
  
  def "setupSpecでMock()されたオブジェクトのメソッドは他のメソッドで定義済みだとそれ以降定義できない"(){
    expect:
    s1.is(classA_spec) && s1.method1() == 3
    
    where:
    data << [4,5,6].each {
      classA_spec.method1() >> it
    }    
  }
  
  
  def "そもそも同一のMockオブジェクトのメソッドの動作を定義できるのは一度きり"(){
    setup:
    classA_setup.method1() >> data
    classA_setup.method1() >> 1
    
    expect:
    a1.is(classA_setup) && a1.method1() == data
    
    where:
    data << [1,2,3]
  }
}
```

これらの振る舞いから、

* テストを通じて振る舞いが変わらないMock対象
  * setupSpecでMockオブジェクトを用意する
  * 同様にsetupSpecで振る舞いまで定義する

ことによって、テスト全体の前提となるMock定義を一箇所で管理する

* それぞれのテストにおいて振る舞いを変える必要のあるMock対象
  * setupでMockオブジェクトを用意する
  * 各テストメソッドのsetupまたはwhenで動作を定義する

ことによって、whereによるDataDrivenなテストをやりやすくする

と良いでしょうということが考えられます。
Eclipseで Scalaの build path is cross-compiled with an incompatible version of Scala エラーを回避する方法


Scalaを 2.11にあげている場合に、2.10で作られた jarをリンクしようとすると、コマンドラインではビルドできるのに、Eclipseでビルドしようとすると、以下のようなエラーを吐いてビルドできないことがあります。

```
build path is cross-compiled with an incompatible version of Scala (2.10.0.). In case this report is mistaken, this check can be disabled in the compiler preference page.
```

ここに指示がある通り、Scalaの compiler 設定を開くと、

![スクリーンショット 2014-11-13 18.12.55.png](https://qiita-image-store.s3.amazonaws.com/0/41616/ee108a56-388d-1253-bb21-75a5aff535cb.png "スクリーンショット 2014-11-13 18.12.55.png")


のように withVersionClasspathValidator というチェックボックスがONになっています。これを外せばいいはずなのですが、チェックを外して設定画面を閉じても、もう一度設定画面を開くとチェックが元に戻ってしまいます!

# 回避方法

いろいろ試しましたが、設定ファイルを直接いじるしか方法がないようです。

## Eclipseの workspaceの設定を変更する

workspace全体の設定を変えたい場合は、ワークスペースの ```<workspace-dir>/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.scala-ide.sdt.core.prefs``` ファイルを編集し、以下のように **withVersionClasspathValidator=false** を追加します。

```
eclipse.preferences.version=1
org.scala-ide.sdt.core.diagnostic.currentPluginVersion=4.0.0.m3-2_11-201407240952-b0e64c7
withVersionClasspathValidator=false
```

この設定を変更したら Eclipseを再起動するとめでたくチェックが外れます。

## プロジェクト設定を変更する

プロジェクトの設定にも同じ設定があります。こちらをいじりたい場合は、プロジェクトの ```<project-dir>/.settings/org.scala-ide.sdt.core.prefs``` を編集し、やはり、  **withVersionClasspathValidator=false** を追加します。

これで Eclipseを再起動するか、F5キーなどでプロジェクトをリロードすれば反映されます。
dnspythonのnameserversに複数のサーバを指定したときの挙動

dnspythonというモジュールの使い方を調べている際に下記のようにfor文を使ってresponseを表示していて素朴な疑問が湧いたのでメモ。

タイトルの結論としては、一般的なプライマリDNS、セカンダリDNSを設定したときと同じような動作の「いずれかから返ってきたらよかろうなのだ」理論で、もし全部から返ってこなくても何度か問い合わせてくれる様子。
ただしSERVFAILというコードが返ってきた場合は再試行対象から外す模様。

以下実験のきっかけ

```py:pythonでdigるための一部
resolver = dns.resolver.Resolver()
resolver.nameservers = [socket.gethostbyname(nameserver)]
for rdata in resolver.query('www.yahoo.com', 'A'):
    print rdata
```

短絡的にこう考えてしまった。

* nameserversに複数入れたらresponseが複数になる？　←願望

しかしながら冷静に考えると

* query結果は複数ある場合があり、それらを表示するため。

どっちがどうなのか分からなかったので試してみた&ソースも読んでみたところ動作的には

1. **nameserversは一般的なプライマリDNS、セカンダリDNSを設定したときと同じような動作**
2. **問い合わせ対象typeの結果が複数存在した場合はrdataに複数入ってくる**

というDNSの挙動としては至極真っ当な結果でした。(そうだよな、今考えたらdefaultは既定のDNSの設定なんだし)

以下余談。
なぜ上のような願望があったかというと、特定のゾーンを設定したRoute53のDNSサーバ全てに対して本当にゾーンが設定されているのか確認する必要があり、for文入れたくなさのあまりの思考でした。
文字列を任意のデリミタで区切って最後の要素を取得する


ファイルパスをスラッシュで区切ってファイル名だけ取得したかったので、備忘録として。

# 実装例
```bash
#!/bin/bash

delimiter=/
str=/home/hoge/foo/bar.txt

last=${str##*${delimiter}}
echo $last
```

```bash:出力結果
bar.txt
```



# その他の使い所
カンマ区切りの最後の要素を取得したい時は、デリミタをカンマに変えればOK
Redisでイベントをsubscribeする

# Keyspace notificationsとは

Keyspace notificationsとは2.8.0で実装された機能で、
データセットに対する様々な変更イベントを、Pub/Subチャンネルで受け取るための仕組みらしい。
公式ドキュメント：http://redis.io/topics/notifications

## 事前準備
デフォルトでKeyspace notifications機能はオフになっているので、有効にする。

```
config set notify-keyspace-events KEA
```

## あるイベントが発生したKeyをsubscribeする

こんな感じでイベントの発生したKeyを監視できる。

```
subscribe __keyevent@0__:{イベント名}
```

例えば有効期限が切れたKeyを検知したければ、こう。

```
subscribe __keyevent@0__:expired
```

例えば削除されたKeyを検知したければ、こう。

```
subscribe __keyevent@0__:del
```


## あるKeyに対して発生したイベントをsubscribeする

こんな感じであるKeyに発生したイベントを監視できる。

```
subscribe __keyspace@0__:{キー}
```

ちなみにワイルドカードを使うこともできる。

```
subscribe __keyspace@0__:*
```
Gradleのapplicationプラグインにmainのクラス名と引数と-D引数を渡す

[こちら(Gradle使い方メモ)](http://qiita.com/opengl-8080/items/4c1aa85b4737bd362d9e)を参考に、もうちょっと探ってみました。

設定可能な値については、[こちら(JavaExec)](http://gradle.monochromeroad.com/docs/dsl/org.gradle.api.tasks.JavaExec.html#org.gradle.api.tasks.JavaExec)を参考にして下さい。

```groovy:build.gradle

defaultTasks 'run'

apply plugin: 'application'

// アプリケーション起動設定
run {
	// "main" というプロパティが渡されていたらメインクラスを設定
    if (project.hasProperty('main')) {    
        main(project.main)
    }

    // "XXX" というプロパティが渡されていたらJVM引数を設定
    if (project.hasProperty('XXX')) {
		jvmArgs("-DXXX=" + project.XXX)
	}
	
	// mainに渡す引数を設定
	args(
		project.arg1
	,	project.arg2
	,	project.arg3
	,	project.arg4
	)
}

```

main.class.nameというクラスを引数を渡して実行するサンプル

```bash
$ gradle -PXXX=sample -Pmain=main.class.name -Parg1=AAA -Parg2=BBB -Parg3=CCC -Parg4=DDD
```