OmniAICreator/Qiita-1.07M huggingface dataset:
第1回Android Studio超入門#3 -主要なディレクトリ構造について-


## はじめに

ここではEclipseとは異なる、Gradleを採用したAndroid Studioにおけるディレクトリ構造の違いを説明します。

## ワークスペースとプロジェクト

Eclipseでは、ワークスペースを開き、複数のプロジェクトを参照できる構造になっていました。Android Studioでは、ワークスペースを開くという概念はなく、プロジェクト単位で起動します。(#1or2からやってきたなら）今現在起動している画面が１つのアプリケーションのプロジェクトです。

## アプリケーション内部のディレクトリ構造

### プロジェクトルート

Android Studioでは、プロジェクトルートにモジュールディレクトリが並んでいます(appディレクトリがそうです)。Androidのライブラリをソースコードごとインポートして使いたい場合は、プロジェクトルートにライブラリのモジュールディレクトリが並びます。（#4でやってみます）

まず新規アプリケーションを作成すると必ず存在しているのがappディレクトリです。

#### appディレクトリ

アプリケーションの本体です。`app/src/main/`以下にソースコードやリソース等の重要なファイルが含まれています。

#### app/build.gradle

Gradleのappディレクトリ内に適用されるビルドファイルです。ここにアプリケーションの情報（SdkVersionなど）や依存関係（app内で用いるライブラリなど）を記述します。今まではAndroidManifest.xmlで管理していたバージョン情報などが、ビルドファイルに記述することでビルド時にその内容を書き換える（もしくは書き込む）ことができます。

```build.gradle
apply plugin: 'com.android.application' 

android {
    compileSdkVersion 19
    buildToolsVersion "20.0.0"

    defaultConfig {
        applicationId "com.example.helloworld"
        minSdkVersion 8
        targetSdkVersion 19
    }

    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile 'com.android.support:support-v4:19.1.0'
    compile 'com.android.support:appcompat-v7:19.1.0'
}
```

### build.gradle

これはプロジェクトルートにある`build.gradle`です。違う階層に同じ名前のファイル(app/build.gradleなど)があって非常に混乱しますので間違えないようにしてください。

ここには、プロジェクト全体に関わるビルド設定を記述します。新規プロジェクトでは使用するリモートリポジトリ(jcenter)が指定されています。

```build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.13.0'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

```

### settings.gradle

ここには、includeしたいモジュールを指定します。includeすると、モジュールが使えるようになります。

[#4へいく](http://qiita.com/sugoi_wada/items/fc5f624d1d9da3136dd7)
第1回Android Studio超入門#2 -Eclipseプロジェクトのインポート-


## はじめに

ここではEclipseで開発したプロジェクトをAndroid Studioにインポートします。どうなるか確認してみます。

## Eclipseのプロジェクトを用意する

今回は残念ながら僕がEclipseのプロジェクトを１つも持っていなかった（というか資料作る前に移行してしまった）ので、EclipseでblankActivityのプロジェクトを作りました。それをインポートします。

## Android Studioからインポートする

起動時の画面もしくはFileメニューから`Import Project`を選択します。

![スクリーンショット 2014-09-27 0.31.00.png](https://qiita-image-store.s3.amazonaws.com/0/16620/7442bf33-6471-b126-6fbd-b690e3a0b8b6.png "スクリーンショット 2014-09-27 0.31.00.png")


Eclipseのプロジェクトを選択します。

![スクリーンショット 2014-09-27 0.33.02.png](https://qiita-image-store.s3.amazonaws.com/0/16620/da5dd3c8-b34f-7778-4e49-32a23279d9c5.png "スクリーンショット 2014-09-27 0.33.02.png")

Nextを押します。

![スクリーンショット 2014-09-27 0.33.10.png](https://qiita-image-store.s3.amazonaws.com/0/16620/0ca9d7cc-8fff-a6df-745a-ee2d2596fee7.png "スクリーンショット 2014-09-27 0.33.10.png")

これは、Eclipseのプロジェクトをインポートする際に、Gradle依存のディレクトリ構造に置換するか聞いています。そのまま`Finish`を押して完了します。

![スクリーンショット 2014-09-27 1.12.46.png](https://qiita-image-store.s3.amazonaws.com/0/16620/11218abe-b196-405b-ecba-5958f9784e36.png "スクリーンショット 2014-09-27 1.12.46.png")

最初に表示されている`import-summary.txt`から置換されたディレクトリがわかったり、バグのレポートが吐きだされます。

```ディレクトリ構造が変わった例
Moved Files:
------------
Android Gradle projects use a different directory structure than ADT
Eclipse projects. Here's how the projects were restructured:

* AndroidManifest.xml => app/src/main/AndroidManifest.xml
* assets/ => app/src/main/assets/
* res/ => app/src/main/res/
* src/ => app/src/main/java/
```

[#3へいく](http://qiita.com/sugoi_wada/items/c5fddd5ebcbc8df7a5aa)
RubyKaigi 関連記事まとめ #rubykaigi

# RubyKaigi 関連記事まとめ #rubykaigi

更新日: 2014/09/29 21:46:55

|No.|タイトル|作成日|ストック数|
|--:|:--|:--:|--:|
|1|[Ruby  RubyKaigi2014で話題に。安全に Ruby のコードを変換できる Synvert gem をインストール #rubykaigi ](http://qiita.com/tbpgr/items/8bdb92fa8f9324727336)|2014/09/22 01:01:20|25|
|2|[RubyKaigi 2014 1日目まとめ #rubykaigi](http://qiita.com/tbpgr/items/7761e85325e2e61f69ac)|2014/09/19 03:41:52|18|
|3|[RubyKaigi 2014 2日目まとめ #rubykaigi](http://qiita.com/tbpgr/items/d448ba5962e59996eabf)|2014/09/20 03:26:09|14|
|4|[RubyKaigi 2014 3日目まとめ #rubykaigi](http://qiita.com/tbpgr/items/bb1f2090b1167592262f)|2014/09/21 01:21:37|11|
|5|[RubyKaigi 2014 を通して感じた昨今の定番構成。そして人的負債 #rubykaigi ](http://qiita.com/tbpgr/items/78421a43728a4de786c2)|2014/09/21 22:48:18|4|
|6|[RubyKaigi 2014 事前情報 #rubykaigi](http://qiita.com/tbpgr/items/344f9f996e0c0e20150e)|2014/09/17 22:01:45|7|
|7|[RubyKaigi 2014の知見。 Microservices について #rubykaigi](http://qiita.com/tbpgr/items/d7ecc21266d7ee9d6971)|2014/09/27 01:18:12|3|
|8|[RubyKaigi2014の知見  Tracepoint #rubykaigi ](http://qiita.com/tbpgr/items/ff877b60bb18a8d8e5ac)|2014/09/22 02:23:47|9|
|9|[RubyKaigi2014の知見。Rubyで強力なパターンマッチを利用できる Egison gem をインストール #rubykaigi](http://qiita.com/tbpgr/items/3c4b48f106901c7fde1c)|2014/09/25 22:10:30|7|
|10|[RubyKaigi2014の知見。geminabox gem で Private な Gem Server を構築 #rubykaigi](http://qiita.com/tbpgr/items/53794bfb2a7c0d7247eb)|2014/09/25 22:23:40|4|
ソートしないで重複行を削除する

uniq コマンドは事前にデータをソートしておく必要がありますが、ソートされていないデータから重複する行を削除したいこともありますよね。そんなときは

```zsh
awk '!a[$0]++' FILE
```

これだけです。

# 解説
* a は連想配列の変数で名前は何でもいいです
* $0 には行全体が格納されています
* つまり各行をキーとする連想配列を作成し、同じ行が現れるたびに値をインクリメントします
* ! により値が 0 のとき、つまり最初にその行が現れたときだけ条件が真になります
* アクション部分は省略されているので行全体が表示されます
他人が編集できるファイルを強調表示する

emacs の dired だと他人が編集できるファイルの場合、パーミション部分の w が赤く表示されるので ls でもやってみた。
.zshrc あたりに以下を追加

```zsh
function ll(){
    if [[ -t 1 ]]; then
        ls --color=always -l $@ |
        perl -pe 's/(^(?:\s*?\d+[KMGTPEZY]? )?[^l][-rwxsS]{4})(w?)([-rxsS]{2,3})(w?)/$1\033[38;5;196m$2\033[0m$3\033[38;5;196m$4\033[0m/'
    else
        ls -l $@
    fi
}
```

```ll -i```や```ll -s```でも正しく色が付きます。
PadrinoでCoffeeScriptを使う


### プラグイン追加
以下のコマンドで既存のプロジェクトにcoffeescriptプラグインを追加。

```
$ padrino g plugin coffee
```

`Gemfile`と`app/app.rb`に必要なgemや設定が追記され、`lib/coffee_initializer.rb`が作成される。

###gemインストール
Gemfileに追記されたgemをインストール。

```
$ bundle install
```
※ `therubyracer`がインストールされていない場合は、Gemfileに追記してから`bundle install`

### coffeescript追加

`public/javascripts/`以下に.coffeeファイルを追加。

```public/javascripts/hello.coffee
console.log 'Hello coffee'
```

### viewから呼び出し

通常のjavascript呼び出しと同様に、`javascript_include_tag`でok。

```hoge.slim
= javascript_include_tag 'top'
```

※ 例ではテンプレートエンジンにslimを使っている

## 参照
[PadrinoでもCoffeeScriptをつかいたい](http://marutanm.hatenablog.com/entry/20111021/p1 'PadrinoでもCoffeeScriptをつかいたい')
データ分析と統計処理の基本的な手順の整理 (5)

前回まで[分布の把握](http://qiita.com/ynakayama/items/8fe96b4f5ba6a225b1de)、[区間推定](http://qiita.com/ynakayama/items/09b8a09f79ebaff24ea8)と進めてきました。ここから先は複数の変量に相関があるかを調べていくわけですが、手順の整理なので細かい話は各記事に譲るとして、大まかな説明をしてきます。

## 推測統計

統計の手法には多く分けて二つあります。記述統計と推測統計です。記述統計とは、データを大まかに要約し、図表などで可視化しようというものです。これは最も古くからある統計の利用方法です。記述統計による考え方というのには大きな制約があります。そもそも全データが明らかであることを前提に、そのすべてを詳細に見ることができないので要約して可視化しようというものだからです。

わたしたちが観察することのできるデータは全体のごく一部ということがほとんどですから、そこで推測統計の考え方が必要になります。そのために[分布を把握](http://qiita.com/ynakayama/items/8fe96b4f5ba6a225b1de)し、ありそうな値の範囲を[推定](http://qiita.com/ynakayama/items/09b8a09f79ebaff24ea8)するということをしたわけです。これが推測統計と呼ばれるものです。以前に[モンティ・ホール問題](http://qiita.com/ynakayama/items/1e1693503e27ce33e0a0)でちらっと触れたベイズ統計学も、基本的にはこの推測統計の類になります。

## 回帰分析

多くの人がデータ分析に期待する効果として、データとデータの関係性を発見し、その関係にもとづいた予測をしたいといったことでしょう。たとえば今設備投資をしているとしてその設備がもたらす売上やコスト、品質への影響などを知りたいといったビジネス上の課題。また社会的な話題がどのように集客に影響しているかといった動向調査などです。

これらの関係性や影響の度合いが直接観察できるのはきわめて稀です。現実のデータにはさまざまなノイズが混入しています。たとえばゲームのように 1 日 2 時間勉強をしたから知能ポイントが 2 ポイント上昇！なんて簡単にはいきません。現実の問題はとても入り組んでおり、膨大な不確実性の中から自分の知りたい関係を発掘しなければなりません。

そのためのひとつの手がかりが回帰分析です。これは変数間の関係性の強弱を示す相関係数や、変数間の数量的な関係を推計します。

### 散布図を描く

散布図の描き方そのものは[すでに書きました](http://qiita.com/ynakayama/items/2ec380ab1176e4569ebe)からそちらを参照してください。

散布図の効能として、一見関係の無さそうな変数の間に意外な関係性があることがわかることがあります。またこの二つの変数の関係を数値で示す統計量が相関係数です。

### 回帰式

回帰分析は、ある変数 (被説明変数) を他の変数 (説明変数) でどのようにどれくらい説明できるかを探索する手法です。そしてそれは回帰式で表されます。回帰式とはたとえば次のようなものです。

```math
Y = 13.5X - 39.5
```

このとき Y が被説明変数、 X が説明変数、また X = 0 だったときの Y の値が定数項、 X の Y への影響力を示す 13.5 を X の回帰系数と呼びます。

このように回帰式を用いると、ならば X がいくつのときに Y がいくつか、といったことを予測できます。

回帰式は説明変数の説明を、ノイズがたくさんある中から柱になる関係性だけを導いたものです。このときどれくらい説明できているかを表す基準が決定係数です。たとえば決定係数が 0.45 なら回帰式で説明変数の動きの 45% が説明できていることになります。

### 標準誤差と t 値

区間推定で、サンプルの平均から標準誤差の 2 倍離れた区間を求めましたが、これと同じく回帰式で 95% 正しい区間予測を求めるのにも標準誤差を利用します。

推測統計では、母集団の一部を抽出したサンプルをもとに分析をします。回帰式を導いたデータもほとんどはサンプルにすぎませんから、もしかしたら母集団と大きな差があるかもしれません。推計された定数や係数が、本当は 0 なのにも関わらずサンプルで出現した値かもしれないということを示すのが t 値です。

t 値の絶対値が 2 以上なら「本当は 0 」である確率は 5% 未満であるという判断をします。

## 重回帰分析

被説明変数を定数項とひとつの説明変数で求めるのを単回帰分析といいます。これに対し、定数項と複数の説明変数で求めるのが重回帰分析です。

実際の分析では、出来る限り説明変数を用いて重回帰分析をおこない、そのうち係数が有意でない変数を見つけたら、それを除いた重回帰分析をまたおこなう、というステップを繰り返しておこないます。

単回帰式では Y と X の直線的な関係を導くことになりますが、重回帰分析ではより複雑な関係や直線以外の回帰式も求めることになります。

## 回帰分析の手順のまとめ

* 仮説や経験から、被説明変数と説明変数を決める
* サンプルを収集し、説明を試みる
* 回帰係数が偶然による値ではないことを (t 値から) 確かめる
* 回帰式を使った 95% 信頼区間の予想では、誤差がありうることに留意する

t 値と標準誤差が掲載されていない回帰式はその分析の信頼性がわかりません。

## 回帰分析の注意点

統計による思考は、たとえ相関関係を求めてもそれが因果関係ではない場合もあることに気を付けなければなりません。

因果関係とは「風が吹けば桶屋が儲かる」というもので、相関関係は「風速が強い」「桶屋の売上が高い」ことが同時に観察されるという状況の記述です。つまり、相関関係を引き起こす「共通の要因」を把握しておかないと分析は失敗します。

このための考え方としては
* ある因果関係を仮説として設定して、これを検証するために回帰式と検定を使う
* さまざまな回帰式を推計しそこから、これらの相関関係を生み出す因果関係は何かを考える
というふうに統計を利用していくということが挙げられます。

統計は目的なく何かを導くものではなく、上記のように目的を明らかにして利用するものだということです。

## まとめ

駆け足でしたがデータ分析と統計の基本的な手順の整理についてはこれでおしまいです。いかに統計的に正しく高度な分析手法を利用しても、その役立て方をまちがえては失敗しますので、道具を正しく使うための思考をよく理解しましょう。
ubuntu 14.04 LTS DesktopEditionにsynergy 1.5.1を簡単にインストールするには

## ubuntu 14.04 LTS Desktopにsynergy の最新版をインストールする話

* synergyは、Version 1.5.0リリース後から有料（寄付）ソフトウェアになった。
* なんか資金面に難があり色々と決断したらしい
* $4.99 / 500円くらい？

![screenshot_2014-09-26_22.34.58.png](https://qiita-image-store.s3.amazonaws.com/0/49795/14f775ae-53fe-f254-fed2-db2595a6c242.png)

* [A personal message from Nick Bolton,Founder & CEO of Synergy Si, Inc.](http://synergy-project.org/download/)

![screenshot_2014-09-26_23.00.34.png](https://qiita-image-store.s3.amazonaws.com/0/49795/2df8a646-9884-7bc3-479f-8965473b3583.png)

* とりあえず寄付をしアカウントを作って最新版/beta版をゲットできたのはいいが、インストール時にログイン画面にて認証し、ソフトウェアをマウスでクリックしてダウンロードするのは面倒なのです。
* 今回はそれらを解決するソリューションです。

## インストール方法

```
wget -q -O - http://archive.getdeb.net/getdeb-archive.key | sudo apt-key add -
sudo sh -c 'echo "deb http://archive.getdeb.net/ubuntu trusty-getdeb apps" >> /etc/apt/sources.list.d/getdeb.list'
sudo apt-get update
sudo apt-get install synergy
```

* archive.getdeb.net については、情報源の項目 " UbuntuTips/Application/GetDeb - Ubuntu Japanese Wiki "を参照してください。

## 情報源

* [Install Synergy 1.5.1 on Ubuntu 14.04 - Sysads Gazette](http://www.sysads.co.uk/2014/08/install-synergy-1-5-1-ubuntu-14-04/)
* [UbuntuTips/Application/GetDeb - Ubuntu Japanese Wiki](https://wiki.ubuntulinux.jp/UbuntuTips/Application/GetDeb)

## 注意

* あくまでも個人メモを共有しただけです。
* 自己責任でお願いいたします。
Xcode6のiOS Simulatorの場所


Xcodeを6にアップデートしたらiOSシミュレーターがエイリアスから起動しなくなった。どうやらパスが変わった模様。

    /Applications/Xcode.app/Contents/Developer/Applications/iOS Simulator.app

にあった。
エイリアス再作成してアプリケーションフォルダなんかに入れておけばオケ。

自分はAlfredのWorkflow「[Launch iOS Simulator](http://www.alfredforum.com/topic/2126-launch-ios-simulator/)」で起動するので、Workflowのスクリプトのパスも変更。


```bash:bash
open /Applications/Xcode.app/Contents/Developer/Applications/iOS\ Simulator.app/
```

Alfred一発起動オッケー。

ホームボタンが見当たらなくなって画面だけになってしまったので、ホームボタンのショートカット`⇧⌘H`はおぼえておかなきゃだな。
正規表現を複数回実行する際の注意点

## javascriptで正規表現を複数回実行する際の注意点

以下のコードは"hoge"という文字列が含まれているか正規表現で検索し、結果を表示するコードです。

```js:hoge.js
var example = "hoge";
var regexp = /hoge/g;

regexp.test(example);
// true
regexp.test(example);
// false
regexp.test(example);
// true
regexp.test(example);
// false
...
```

一度目の実行では`true`が返ってきますが、二度目の実行では`false`が返ってきます。
以降は交互に結果が変わります。不思議ですね。

私はループ内で正規表現を実行する際に、この挙動につまづきました。
一体何が起きているのでしょうか？

```js:hoge_loop.js
var examples = ["hoge", "hoge", "hoge", "hoge", "hoge", "hoge"];
var regexp = /hoge/g;
var result = [];

examples.forEach(function(example) {
  result.push(regexp.exec(example));
})

console.log(result);
// [['hoge'], null, ['hoge'], null, ['hoge'], null]
```

## 原因
正規表現に`/g`フラグが付与されている場合、最後に一致した文字列が`regexp.lastIndex`に保持されます。
`regexp.lastIndex`と同一の文字列を引数にした場合、その文字列から先を対象に正規表現が検証されます。
先程の例の場合、`"hoge"`は前回ヒットした内容と同一文字列のためスキップされてしまいました。

## 解決策1
正規表現ごと初期化することで問題を解決できます。

```js:hoge_answer1.js
var examples = ["hoge", "hoge", "hoge", "hoge", "hoge", "hoge"];
var result = [];

examples.forEach(function(example) {
  var regexp = /hoge/g; //ループごとに初期化
  result.push(regexp.exec(example));
})

console.log(result);
// [['hoge'], ['hoge'], ['hoge'], ['hoge'], ['hoge'], ['hoge']]
```

## 解決策2
`regexp.lastIndex`を初期化することで問題を解決できます。

```js:hoge_answer2.js
var examples = ["hoge", "hoge", "hoge", "hoge", "hoge", "hoge"];
var regexp = /hoge/g;
var result = [];

examples.forEach(function(example) {
  result.push(regexp.exec(example));
  regexp.lastIndex = 0; // lastIndexの初期化
});

console.log(result);
// [['hoge'], ['hoge'], ['hoge'], ['hoge'], ['hoge'], ['hoge']]
```

## 解決策3
そもそも必要ないのであれば、正規表現に`/g`フラグを付与しなければ問題を解決できます。

```js:hoge_answer3.js
var examples = ["hoge", "hoge", "hoge", "hoge", "hoge", "hoge"];
var regexp = /hoge/;
var result = [];

examples.forEach(function(example) {
  result.push(regexp.exec(example));
})

console.log(result);
// [['hoge'], ['hoge'], ['hoge'], ['hoge'], ['hoge'], ['hoge']]
```

## 解決策4
`regexp.exec(str)`ではなく`string.match(regexp)`を利用することで問題を解決できます。
(※それぞれの`/g`フラグが付与されている場合の挙動の違いについては注意してください。)

```js:hoge_answer4.js
var examples = ["hoge", "hoge", "hoge", "hoge", "hoge", "hoge"];
var regexp = /hoge/g;
var result = [];

examples.forEach(function(example) {
  result.push(example.match(regexp));
})

console.log(result);
// [['hoge'], ['hoge'], ['hoge'], ['hoge'], ['hoge'], ['hoge']]
```


以上、連続して同一文字列を検証する可能性がある場合はお気をつけください！
(コメントにてご指摘を頂きました皆様ありがとうございます！)
vagrant upでmountエラーがでる場合の対処法

```
$vagrant up
```

これをやると以下のエラーがでる

```
Failed to mount folders in Linux guest. This is usually beacuse
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group apache | cut -d: -f3`,dmode=777,fmode=777 /vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g apache`,dmode=777,fmode=777 /vagrant /vagrant
```
vboxをリビルドすることで解決できる

```
$vagrant ssh
```

```
$ sudo /etc/init.d/vboxadd setup

Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
Building the main Guest Additions module                   [  OK  ]
Building the shared folder support module                  [  OK  ]
Building the OpenGL support module                         [  OK  ]
Doing non-kernel setup of the Guest Additions              [  OK  ]
Starting the VirtualBox Guest Additions                    [  OK  ]
```

それで再起動

```
$vagrant halt
$vagrant up
```

これでmountできてる
Elixir case / cond / if

# Elixir case / cond / if

## 概要
Elixir の case / cond / if について

## case
複数のパターンとのパターンマッチを行う。
ガード句として when を利用可能。

~~~
iex> use_case = fn a ->
...>   case a do
...>     [1,x,3] when x > 0 ->
...>       "hit1-3, x > 0"
...>     [1,x,3] ->
...>       "hit1-3, x <= 0"
...>     [4,5,6] ->
...>       "hit4-6"
...>     _ ->
...>       "not hit"
...>   end
...> end
#Function<erl_eval.6.82930912>
iex> use_case.([1,2,3])
"hit1-3, x > 0"
iex> x
2
iex> use_case.([1,0,3])
"hit1-3, x <= 0"
iex> use_case.([4,5,6])
"hit4-6"
iex> use_case.([4,5,7])
"not hit"
~~~

## Expressions in guard clauses.

ガード句で利用可能な関数について。
詳しいリストについては下記参照
http://elixir-lang.org/getting_started/5.html#5.2-expressions-in-guard-clauses.

### ガード句での利用例

~~~
iex> guard_sample = fn a ->
...>   case a do
...>     x when is_float(x) ->
...>       "float"
...>     x when is_list(x) and is_atom(hd(x)) ->
...>       "atom list"
...>     x when is_list(x) ->
...>       "list"
...>     _ ->
...>       "not hit"
...>   end
...> end
#Function<erl_eval.6.82930912>
iex> guard_sample.(1.1)
"float"
iex> guard_sample.([1.1,:hoge])
"list"
iex> guard_sample.([:hige,:hoge])
"atom list"
iex> guard_sample.(:hoge)
"not hit"
~~~

## cond

異なる条件で分岐を判定したい場合に `cond` を利用する。
他言語でいうところの `elseif` にあたる

~~~
iex> cond_sample = fn a,b ->
...>   cond do
...>     a+a==b ->
...>       "plus"
...>     a*a==b ->
...>       "multiply"
...>     true ->
...>       "not match"
...>   end
...> end
#Function<erl_eval.12.82930912>
iex> cond_sample.(1,2)
"plus"
iex> cond_sample.(1,1)
"multiply"
iex> cond_sample.(1,3)
"not match"
~~~

## if / unless

### if
~~~
iex> use_if = fn bool ->
...>   if bool do
...>     "true!"
...>   end
...> end
#Function<erl_eval.6.82930912>
iex> use_if.(true)
"true!"
iex> use_if.(false)
nil
~~~

### unless
~~~
iex> use_unless = fn bool ->
...>   unless bool do
...>     "false!"
...>   end
...> end
#Function<erl_eval.6.82930912>
iex> use_unless.(false)
"false!"
iex> use_unless.(true)
nil
~~~

## block
### if do-end

~~~
iex> use_if = fn bool ->
...>   if bool do
...>     "true!"
...>   end
...> end
#Function<erl_eval.6.82930912>
iex> use_if.(true)
"true!"
iex> use_if.(false)
nil
~~~

### if do:
1行にまとめて記述

~~~
iex> use_if_do_coron = fn bool ->
...>   if bool, do: "true!"
...> end
#Function<erl_eval.6.82930912>
iex> use_if_do_coron.(true)
"true!"
iex> use_if_do_coron.(false)
nil
~~~

### if do: else:

~~~
iex> use_ternary_operator = fn a ->
...>   if a, do: "true", else: "false"
...> end
#Function<erl_eval.6.82930912>
iex> use_ternary_operator.(true)
"true"
iex> use_ternary_operator.(false)
"false"
~~~

## 参照
http://elixir-lang.org/getting_started/5.html
Unityのバージョン違いによるアセットバンドル

かなりハマった

Unityのバージョンについて、
アセットバンドルを作成したUnityのバージョンと
自分PCで起動しているUnityのバージョンが一致しないと
アセットバンドルを正しく読み取れないらしく完了しません。
SWIGを使ってPython用のモジュールを作ってみる

SWIGを使ってみた。前にJumanで形態素解析するときに使った覚えがありますが、ちゃんと調べたことなかったので自分用にメモ.

マニュアル
http://www.swig.org/Doc1.3/Python.html#Python_nn4

インストールはREADMEにしたがって行います。

```
$./configure
$make
$su
$make install
```

インストールが終わったらマニュアルのサンプルを参考にいじりまわす。

.iファイルの中身は
http://blog.livedoor.jp/yoshichi9/archives/21911908.html参考

```
module モジュール名
%{
include ヘッダファイル名
%}
関数の列挙(または.hファイル)
#define(マクロの定義など)
```

らしいです。

さて、次に正規分布に従う値を返す拡張モジュールを作ってみる。

まずは各種ｃのソースファイルを準備。

```c:normaldist.h
double normal_distribution(double myu, double sigma, double x);
```


```c:normaldist.c
#include "normaldist.h"
#include <math.h>

double normal_distribution(double myu, double sigma, double x){

  double d;
  double coefficient, in_exp;

  coefficient = sqrt(2 * M_PI * sigma); //係数
  in_exp = exp( -pow( x - myu, 2 ) / (2 * sigma ));  //expの肩にのるやつ

  d = in_exp / coefficient;

  return d;
}
```

次にswig用の.iファイル

```normaldist.i
%module normaldist

%{
#define SWIG_FILE_WITH_INIT
#include "normaldist.h"
#include <math.h>
  %}

double normal_distribution(double myu, double sigma, double x);
```

最後にsetup.py

```py:setup.py
from distutils.core import setup, Extension

module1 = Extension('_normaldist',
                    sources = ['normaldist_wrap.c', 'normaldist.c'])

setup (name = 'normaldist',
       version = '1.0',
       description = 'This is a normaldist package',
       ext_modules = [module1],
       py_modules = ["normaldist"],)
```

あとは順番にコマンドを打ち込むだけでokです。

```
$swig -python normaldist.i
$python setup.py build_ext --inplace
```

同ディレクトリ内に_normaldist.soができているはず.
iOS 8.0.2でフツーにSafariからフォトライブラリにアクセスできるようになった

# バグ対応らしいけど

- [iOS 8 Mobile Safari の変更点を予測してみました - latest log](http://uupaa.hatenablog.com/entry/2014/08/22/033611)

によると、そもそもiOS8のリリースのしばらく前にコードが削除されており、
文句言われたから元に戻したのかなぁ


# GPS情報は？

位置情報はiOS7時代までと同様でカットされてました。iOS 8.0でのフォトライブラリ対応のWebClip形式にしてもこれまでと同様にカットされてました。

# 関連投稿

- [iOS8のSafariでフォトライブラリの画像データにアクセスできた！ - Qiita](http://qiita.com/kjunichi/items/8c012fc40fe33fcf6b4c)
- [iOS8にしたらSafariでWebGLは動くようになったがカメラロールの画像が！ - Qiita](http://qiita.com/kjunichi/items/681e56ccd82f0f25582e)

# Link

- [フォトライブライブラリの写真の位置情報の確認 - jsdo.it](http://jsdo.it/kjunichi/bR37)
CentOSのSRPMはvault.centos.orgにある

ShellShockのRHELのpatch内容が知りたくて、CentOS のSRPMが欲しかったのだが
http://mirror.centos.org/ とかだとRPMしかおいてなくてSRPM欲しいときはどこだ！、と探していたら
http://vault.centos.org/ にあると教えて貰った
PythonのC拡張やってみた

チュートリアルのC や C++ による Python の拡張 の前半を写経した。
Cythonの勉強しようかと思っていたけど、上の方法のブログ記事がたまたま出てきたのでやってみた感じです。
そこまで難しくなさそうという印象です。まだAPIとか何もわかっていませんが。。
本当にチュートリアルのまま spammodule.cをカキカキ。
コメントもチュートリアルの本文そのまま貼っつけ。

```c:spammodule.c
#include <Python.h>

static PyObject *
spam_system(PyObject *self, PyObject *args)
{
  const char *command;
  int sts;

  if (!PyArg_ParseTuple(args, "s", &command))
    /*Python の文字列または Unicode オブジェクトを、キャラクタ文字列を指す
      C のポインタに変換. "s"の意味
    */
      return NULL;

  sts = system(command);
  return Py_BuildValue("i", sts);
  /*書式化文字列と任意の数の C の値を引数にとり、新たな Python オブジェクト
   を返す. "i"は整数オブジェクトという意味*/
}

static PyMethodDef SpamMethods[] = {
  {"system", spam_system, METH_VARARGS,
   "説明 Execute a shell command."},
  {NULL, NULL, 0, NULL}
};


PyMODINIT_FUNC
initspam(void)
{
  (void) Py_InitModule("spam", SpamMethods);
}

```

無事書き終えたらsetup.pyを以下のように作成。
<a href="http://qiita.com/ynakayama/items/47be068dba7d9439ebe1">こちらの記事</a>を参考にしました。<br />

```py:setup.py

from distutils.core import setup, Extension

module1 = Extension('spam',
                    sources = ['spammodule.c'])

setup (name = 'Spam',
       version = '1.0',
       description = 'This is a spam package',
       ext_modules = [module1])

```

あとはコマンドライン上で

`$python setup.py build`

(今回は実験なのでinstall はしない)
を実行する。するとカレント直下にbuildというディレクトリができる。
中身は環境によって違うのかと思いますが、spam.soのパスを指定してimportすれば
使えるようです。
私は適当なディレクトリにspam.soごとコピペしました（いいのかな？）
適当なメモでした。
開発中のappiumを使ってみる

iOS 8でテストを動かしたいので、開発中のiOS 8ブランチを使ってみました。
とりあえず単純なテストは起動するものの、環境のクリアなどがまだのようでした (2014.09.26現在)。

```
$ git clone https://github.com/appium/appium.git
$ git show HEAD
commit 30dab9c6577fdc1f6b717a9c7fce002f4ded8161
Merge: 90d746b 1e4e6f7
Author: Jonathan Lipps <jlipps@gmail.com>
Date:   Thu Sep 25 16:14:50 2014 -0700

    Merge pull request #3711 from imurchie/isaac-location

    Fix Android location test

$ cd appium
$ git checkout ios8
$ ./reset.sh --ios
$ npm install -g .
$ appium
info: Welcome to Appium v1.3.0-beta1 (REV e62477a94202799c55f8b0dd6b83c08141452e03)
info: Appium REST http interface listener started on 0.0.0.0:4723
info: Console LogLevel: debug
```
Gradle Plugin を 0.13.x にしたらすること

[0.11.+ の時の話題はこちら](http://qiita.com/KeithYokoma/items/e3c6af95d366d2af52ec)

# Gradle のバージョンアップ

2.1 が必要です。Android Studio を最新にしておけば、自動で 2.1 を使うように properties ファイルを編集するかどうかのプロンプトが出るはずです。自動で編集してもらいましょう。

# Robolectric Gradle Plugin

https://github.com/robolectric/robolectric-gradle-plugin/issues/66

例によって Robolectric Gradle Plugin が壊れますので、Robolectric Gradle Plugin を最新(`0.12.0`)にする必要があります。
シェルスクリプトでtry-catch-finally

引数のパスに対しての`cd`の成否で`CATCH`が表示されたりされなかったり。
`FINALLY`は常に表示される。

```bash
#!/bin/sh

set -eu

trap catch ERR
trap finally EXIT

function catch {
    echo CATCH
}
function finally {
    echo FINALLY
}

echo pre
cd $1
echo post
 
exit 0
```

#### 成功例

```bash
$ ./test.sh /
pre
post
FINALLY
```

#### 失敗例

```bash
$ ./test.sh /root
pre
./test.sh: line 16: cd: /root: 許可がありません
CATCH
FINALLY
```
spinjs-rails のバージョンを 1.3 から 1.4 にする

`jquery.spin.js` 経由で `spin.js` を使っているユーザーにしか役に立たない記事です :bow: 

## [spinjs-rails](https://github.com/dnagir/spinjs-rails)

画像を使わずにローディングインジケータを表示してくれる JavaScript ライブラリである [spin.js](http://fgnass.github.io/spin.js/) の Rails プラグインです。

### 実に 1 年以上ぶりのアップデート

spin.js の方はこの１年の間も何度かアップデートしていたのですが、`spinjs-rails` の方はそのままになっていました。

今回のアップデートで利用される `spin.js` のバージョンは 1.3 から 2.0.1 にあがっているようです。（どうでもいいですが、`spinjs-rails` のバージョンは 1.4 になっているので spin.js のバージョンとあわなくなってますがいいんですかね :sweat_smile: ）

## 更新方法

1.3 までは `jquery.spin.js` から `spin.js` を使う場合には `application.js` を以下を記述するだけでOKでした。

```js:application.js
//= require jquery.spin
```

しかし、1.4 以降では以下のように `spin.js` 自体も読み込まなくてはいけません

> もし jquery も読み込んでいないのなら jquery も

```js:application.js
//= require spin
//= require jquery.spin
```

### なぜか？

[1.3 から 1.4 の差分](https://github.com/dnagir/spinjs-rails/compare/v1.3...v1.4)

差分をみてもらうと分かりますが、1.4 の `jquery.spin.js` には `require` の記述が消えています。

```diff:vendor/assets/javascripts/jquery.spin.js
-//= require jquery
-//= require spin
```

よって、これまでは `jquery.spin.js` を読み込むだけで良かったのですが、明示的に読み込まなければいけなくなりました。

これは推測ですが、`spin.js` のコミットログを見る限り、`jquery.spin.js` は最初から `require` の記述は無かったので、1.3 までの `jqurey.sipn.js` は `spinjs-rails` が独自に提供していた機能だったのでは無いかと思います。

で、本家から提供されだしたので、そちらを使うようにしたため、このようになったのではないかと。

いずれにしろ、１年ぶりに更新されて利用者としては助かりました！
ActiveDirectoryで認証

使用モジュール名： Authen::Simple::ActiveDirectory
URL: http://search.cpan.org/~chansen/Authen-Simple-LDAP-0.3/lib/Authen/Simple/ActiveDirectory.pm

予め、cpanmコマンドで上記モジュールをインストールします。
下記を認証のサンプルに使用してください。

```Perl:test_ad.pl
use warnings;
use strict;
use 5.010;
use Authen::Simple::ActiveDirectory;

        my $host = 'your_AD_address';
    my $ad = Authen::Simple::ActiveDirectory->new(
        host      => $host,
        principal => 'your_domain'
    );
    my $username = 'yasuhiro';
        my $password = 'password';
    if ( $ad->authenticate( $username, $password ) ) {
        # successfull authentication
        say 'success';
    } else {
        say 'fail';
}
```
Varnish + Plone 環境の検証


# 注意

このドキュメントは書きかけです。メモ代わりに公開しているものです。作業が進むにつれて順次記載をしていきます。

# 使用環境

- Nginx
- Varnish 4.0.1
- Plone 4.3.3


# Varnish ログの確認

```
$ sudo varnishlog
```


# キャッシュされているかどうか？

- nginx のログを tail
- Plone のログを tail

# パージの確認方法

パージ(PURGE)のみの確認

```
$ sudo varnishlog -q "ReqMethod eq PURGE"
```

パージ(PURGE)のさらにURLのみの確認

```
$ sudo varnishlog -q "ReqMethod eq PURGE" | grep ReqURL
```


# 参考資料

http://www.slideshare.net/xcir/v4rp-tokyo
Guardでテスト開始を通知する


そうしたいなあと思ってソース見てたらHookの仕組みがあったのでこれを利用する。

```ruby:Guardfile
guard :rspec, cmd: 'spring rspec' do
  #〜watch各種〜

  [:run_all_begin, :run_on_modifications_begin].each{|sym|
    callback(sym){
      ::Guard::Notifier.notify("running", type: :running, title: "running", running: "Black")
    }
  }
end
```

テスト開始時に:run_all_begin, :run_on_modifications_beginっていうイベントが来るのでこれをフック、通知を走らせる。手元ではEmacsの通知を使ってるのでこれ用の書き方だけど、他のもそれほど難しくなく書けると思う。/lib/guard/notifiersを参照のこと。
Knockout.jsのform:submitに対するアクションをjasmineでテストする


# お断り
ネットでググってもあんまり引っかかんなかったので、とりあえず独力でやってみました。もっといいやり方があったら教えて下さい(切実)

# やりたいこと
knockout.jsでsubmitイベントにバインドされたアクションで、例えばボタンをdisableにする等を行った後、submitを実行するやつをjasmineでテストしたい。

ただし実際にsubmitは実行したくない！

# だめだったパターン
## Knockout.jsのViewModel
```coffeescript
class SubmitViewModel
  constructor: ->
	@submit_action = (elem) ->
      # submit前になんかいろいろやる
      elem.submit()
```

## Jasmine
```coffeescript
describe "SubmitViewModel", ->
  beforeEach ->
    # 適当なformがあるfixtureを用意
    loadFixtures "submit_vm_fixture"
    ko.applyBindings(new SubmitViewModel())
  afterEach ->
	ko.utils.domData.clear(document.body)

  it "submitを実行するとよしなになんかやる", ->
	# formのsubmitを止めればいいじゃん？
	spyOnEvent($('#form'), 'submit')	
	# 実行ボタンをクリック
	$('#button').click()
	# よしなになんかやってるのをアサーションする
```

## 結果　
submit動くよぉ！

# これでいいのかパターン
## knockout.js
```coffeescript
class SubmitViewModel
  constructor: ->
	@submit_action = (elem) =>
	  # submit前になんかいろいろやる
	  @execute(elem)

	@execute = (elem) ->
      # こっちをspyすることにしたのでsubmit部分を関数化
	  elem.submit()
```

## Jasmine
```coffeescript
describe "SubmitViewModel", ->
  beforeEach ->
    # 適当なformがあるfixtureを用意
    loadFixtures "submit_vm_fixture"
	 @vm = new SubmitViewModel()
    ko.applyBindings(@vm)
  afterEach ->
	ko.utils.domData.clear(document.body)

  it "submitを実行するとよしなになんかやる", ->
	# 仕方ないがこっちをspyするか...
	spyOn(@vm, 'execute').andReturn(false)
	# 実行ボタンをクリック
	$('#button').click()
	# よしなになんかやってるのをアサーションする
```

## 結果
submit動かない(当然)
あとKnockout.jsのテスト情報あんまり引っかからないんですが、そもそもKnockout不人気なのか、テストなんて書かないのか。本家はJasmineで書いてるんですけどねぇ...
awsのvimでリモートデバックできるようにした

vimでリモートデバックをできるようにしたときのメモ

### 環境

```
$cat /proc/version
Linux version 3.4.76-65.111.amzn1.x86_64 (mockbuild@gobi-build-31004)
 (gcc version 4.6.3 20120306 (Red Hat 4.6.3-2) (GCC) ) #1 SMP Tue Jan 14 21:06:49 UTC 2014
```

```
$vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Sep 26 2014 08:33:01)
Huge version without GUI. 
```

### xdebug, vdebug, chromeツール

ほぼこちら参照
[Vim + Vdebug + Xdebug でPHPのリモートデバッグ](URL "http://blog.code-life.net/blog/2012/10/01/vim-vdebug-xdebug/")

```
$pecl install xdebug
```

```
vim.rcに下記をいれ、:NeoBundleInstall
NeoBundle 'joonty/vdebug'
```

```
$find / -name "xdebug"*
xdebugは下記にインストール
/usr/lib64/php/modules/xdebug.so
```

```
/etc/php.d/xdebug.iniを作って下記を入れる
zend_extension=/usr/lib64/php/modules/xdebug.so
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9000
```

chromeにXdebug Helperを入れる
https://chrome.google.com/webstore/search/Xdebug%20helper

### はまった

これで、準備完了のはずが、
vimを開いてF5を押してもまったく何も起きない。。

```
:help vdebugを行う

TroubleShootingに下記の記載あり。

If you have any questions or problems that aren't addressed or fixed here then
feel free to raise an issue on the Github page https://github.com/joonty/vdebug
or email me at <jon AT joncairns.com>. If the question is good I might even add
it to this list.

    Q. I can't get the debugger to run! Pressing <F5> does nothing.
    A. The most common reason for this is that your VIM installation is not
       compiled with Python support. To check this, run "vim --version" and check
       for any mention of Python. If it is compiled with Python support, try
       remapping the start key to something else, e.g:
        :let g:vdebug_keymap['run'] = '<C-s>'

ようするにvimにpythonがサポートされてない？？？？
```

調べ方は下記。

```
# vim --version | grep python
+cryptv          +linebreak       -python          +viminfo
+cscope          +lispindent      -python3         +vreplace
```

python が-　＜＝これがだめだった。

### 解決

解決方法はそのまんまこちらを参照
[CentOSで最新ソースからvimをインストール](URL "http://deris.hatenablog.jp/entry/20120804/1344080402")

```
$ yum -y install gcc make ncurse-devel
$ yum -y install mercurial
$ yum -y install perl-devel perl-ExtUtils-Embed
$ yum -y install ruby-devel
$ yum -y install python-devel

$ hg clone https://vim.googlecode.com/hg/ vim
$ cd vim/src
$ ./configure \
--with-features=huge \
--disable-gui \
--without-x \
--disable-gpm \
--disable-nls \
--enable-multibyte \
--enable-rubyinterp \
--enable-pythoninterp \
--enable-perlinterp \
--enable-cscope
$ make
$ sudo make install
```

```
# vim --version | grep python
+cryptv          +linebreak       +python          +viminfo
+cscope          +lispindent      -python3         +vreplace
```

python が+

### その後

今度こそvimでF5を押すと、

Waiting for a connection (Ctrl-C to cancel, this message will self-destruct in  20  seconds...)

が出た！

vimでF5を押した状態で、google-chromeのDebugを有効にして、該当ページにアクセスすると、リモートデバックができた
VirtualBoxにUbuntu14を入れる時の個人的まとめ(途中)


VirtualboxのAddonは入れとく

```
sudo apt-get update
sudo apt-get install virtualbox
```

### Dropbox
<a href="http://qiita.com/ironsand/items/65b0406b42a876e57629">Ubuntu14にDropboxをaptでいれる - Qiita</a>
ちょいちょい忘れるHTTP Host Headerメモ

間が開くとちょいちょい忘れるので備忘録

## 何に使うん？

- あるドメインの特定のサーバに負荷かけたいとか
- あるドメインの特定のサーバ上のWebサーバへの疎通確認したいときとか
- この辺にわかりやすい説明がありました [こちら](http://www.atmarkit.co.jp/fwin2k/win2ktips/1199iishshd/iishshd.html)


## メモ

- URL

```
 http://サーバIP/
 ex.  http://123.123.123.123/
```

- Hostヘッダ

```
 Host: ドメイン
 ex.  Host: www.yahoo.com
```


とすると 123.123.123.123上のwww.yahoo.co.jpへリクエストを送れます。
PostmanとかjMeterとかで指定することちょいちょいあるよね。

前回から間が開いた時、何故かHostヘッダにサーバIPを書いて、つながんねーなー　ってなる時があるので備忘録でした。
PhpStorm 8 新機能リンク集 -第18回関西PHP勉強会-


## Jetbrains

* [What's new in PhpStorm 8?](http://www.jetbrains.com/phpstorm/whatsnew/)
* [PhpStorm Docs & Demos](http://www.jetbrains.com/phpstorm/documentation/)
* [What's new - PhpStorm 8.0 Web Help](http://www.jetbrains.com/phpstorm/webhelp/whats-new.html)

## blog

* http://www.sitepoint.com/phpstorm-8-new-features/
* [WordPressをサポートするようになるPhpStorm 8の使い方とその特徴について | 株式会社LIG](http://liginc.co.jp/web/wp/93982)
* [PhpStorm 8 で、Vagrant VM の PHPUnit を IDE から実行する - Shin x blog](http://www.1x1.jp/blog/2014/09/phpstorm-phpunit-by-remote-innterpreter-with-vagrant.html)


## YouTube

[Phpstorm 8 - YouTube](https://www.youtube.com/results?search_query=Phpstorm+8)
【API】Instagramから特定ユーザの最新画像を取得する【Instagram】

#下準備
1.instagramアカウントを取得する。
2.[Instagram Developer](http://instagram.com/developer/)に登録する。
3.登録して取得したcurrentID とRedirectURLを仕様して下記URLにアクセスする。

```
https://instagram.com/oauth/authorize/?client_id=【CLIENT-ID】&redirect_uri=【REDIRECT-URI】&response_type=token
```

するとredirect_urlが表示され、パラメータにアクセストークンが付与されているのでこれを保持する。

```
【REDIRECT-URI】#access_token=xxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxx
```

#ユーザアカウントから固有ユーザ情報を取得する。

APIで特定ユーザの画像を取得するにはユーザ固有のIDを確認する必要がある。
この固有のIDはユーザアカウントではない。
なので、APIを使いユーザアカウントからユーザ情報を取得し、そこに格納されている固有IDを取得する必要がある。

```
// ユーザネームから固有のuser_IDを取得する。
define("INSTAGRAM_ACCESS_TOKEN", "xxxxxxxxxxxxxxxxxxxx");
$user_api_url = 'https://api.instagram.com/v1/users/search?q=' . $user_id . '&access_token=' . INSTAGRAM_ACCESS_TOKEN;
$user_data = json_decode(@file_get_contents($user_api_url));

$user_data->data[0]->ID; // ユーザ固有ID
```

##ユーザ情報を取得する上での注意点
上記の方法で取得する際、APIの仕様で検索した際に**似たようなユーザアカウント情報も取得**されてしまいます。
なので、取得の際は書きのようにして自分が欲しい正しいデータを取得するのが必要かもしれませんね。

```
// ユーザネームから固有のuser_IDを取得する。
define("INSTAGRAM_ACCESS_TOKEN", "xxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxx");
// ユーザアカウント名
$user_account = 'user_acount_mei';
 
// ユーザアカウント名からユーザデータを取得する。
$user_api_url = 'https://api.instagram.com/v1/users/search?q=' . $user_account . '&access_token=' . INSTAGRAM_ACCESS_TOKEN;
$user_data = json_decode(@file_get_contents($user_api_url));
 
// 取得したデータの中から正しいデータを選出
foreach ($user_data->data as $user_data) {
    if ($user_account == $user_data->username) {
        $user_id = $user_data->id;
    }
}

```
#ユーザ固有IDを用いてユーザが登録した最新画像を取得する。

```
// ユーザネームから固有のuser_IDを取得する。
define("INSTAGRAM_ACCESS_TOKEN", "xxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxx");
// ユーザアカウント名
$user_account = 'user_acount_mei';
 
// ユーザアカウント名からユーザデータを取得する。
$user_api_url = 'https://api.instagram.com/v1/users/search?q=' . $user_account . '&access_token=' . INSTAGRAM_ACCESS_TOKEN;
$user_data = json_decode(@file_get_contents($user_api_url));
 
// 取得したデータの中から正しいデータを選出
foreach ($user_data->data as $user_data) {
    if ($user_account == $user_data->username) {
        $user_id = $user_data->id;
    }
}
 
$photos = array();
// 特定ユーザの投稿データ最新5件を取得する
$photos_api_url = 'https://api.instagram.com/v1/users/'.$user_id.'/media/recent?access_token=' . INSTAGRAM_ACCESS_TOKEN . "&count=5";
$photos_data = json_decode(@file_get_contents($photos_api_url));
 
foreach ($photos_data->data as $photo) {
    echo '<img src="' . $photo->images->standard_resolution->url . '" alt="">';
}

```

なお、images以下には画像サイズが3種類用意してあるので用途に応じて大きさを使い分けてください。
また、このAPIで取得したデータには画像に対してlikeしてくれた人のデータも保持されてたので、
使いようによってはもっとあれこれできるかも。
iOS SimulatorでiOS8を動かすとEUC-JPエンコードのバイト列をNSStringにするときにエラーとなる

# Summary
タイトルの通りなんですがEUC-JPエンコードのバイト列をNSStringにするときに以下のエラーが発生します。
iOS SimulatorをiOS7で動かすと正しく読み込めます。(Xcode6.0, Xcode6.1で確認)

```
Error Domain=NSCocoaErrorDomain Code=261 "The operation couldn’t be completed. (Cocoa error 261.)" UserInfo=0x7fdfe2657ef0 {NSFilePath=/Users/tetsuo/Library/Developer/CoreSimulator/Devices/766F5633-A7C6-45AE-AADF-A2182FA157EF/data/Containers/Bundle/Application/7DC78A9D-4BA7-44D2-9852-AC6A099014FE/TestApp3.app/eucdata.txt, NSStringEncoding=3}
```

# Description
Xcodeでプロジェクトを適当につくって、以下のようなコードを書いて検証しました。
(Swiftで書くのは初めてなので、慣れないな...)

```swift
    @IBAction func actionHoge(sender: UIButton) {
        if let dataPath = NSBundle.mainBundle().pathForResource("eucdata", ofType: "txt") {
            var error : NSError?
            let str = NSString(contentsOfFile: dataPath, encoding: NSJapaneseEUCStringEncoding, error: &error)
            
            if let e = error {
                NSLog("%@", e)
            } else {
                NSLog("str: %@", str)
            }
        }
    }
```

ちょっと試した感じだと回避方法が見つからなかったので、Appleにお願いだな...
背景色によって、字を白と黒どちらにするか判定

====================================


参考
http://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color


```js
// RGBで対比させる色 黒/白
function colorOnRGB(rgb) {
	var red = rgb.r,
	green = rgb.g,
	blue = rgb.b;

	var color = 'black';
	if ((red * 0.299 + green * 0.587 + blue * 0.114) < 186) {
		color = 'white';
	}
	return color;
}
```
【TravisCI高速化】aptのキャッシュを利用する

# はじめに
* 以前、以下のような高速化をはかり改善した
 * [【TravisCI高速化】bundle installを毎回走らせないようにキャッシュする](http://qiita.com/oh_rusty_nail/items/374c30ecc5aa9997d1f3)
 * [【TravisCI高速化】並列実行で実行時間を短縮する](http://qiita.com/oh_rusty_nail/items/d345e9612a9dc12d0382)
* しかし、気付けばapt-getのインストールを結構叩いていることに気付いたのでさらに高速化につながる改善が出来ないかと検証してみた

# キャッシュの利用方法
* .travis.ymlのcacheを有効にするだけ

```rb:.travis.yml
cache: apt

# cache対象を複数指定する場合
cache:
  - bundler
  - apt

# 複数書いておいて明示的に有効/無効と書くとき
cache:
  - bundler: false
  - apt: true
```

# 効果確認
* 正しく設定できていればTravisのコンソールに「Setting up APT cache」と表示される
* どれだけ時間短縮になるのかの検証は難しいかもしれません
* 全く変更を加えていないものでも毎回テスト時間は異なります
* そして、どれだけapt-get install叩いているのかでまた変化が見えやすかったりそうでなかったりすると思います
* 特段理由がなければcacheは有効にしておけばよいのかなと...
* また、何か問題や嬉しい効果がありそうなら追記します！

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
Ubuntu14にDropboxをaptでいれる

```
sudo apt-key adv --keyserver pgp.mit.edu --recv-keys 5044912E
sudo add-apt-repository "deb http://linux.dropbox.com/ubuntu trusty main"
sudo apt-get update && sudo apt-get install dropbox
```

で、あとはDropbox立ち上げたら必要なDaemonをダウンロードしてくるので待つ。
ぷよぷよ in python

# ぷよぷよ in python

haskellの記事眺めてたらこんなの見付けた。
http://qiita.com/tanakh/items/c2e157f0a48667370b0e

問題はこっち。
http://okajima.air-nifty.com/b/2011/01/2011-ffac.html

まだ全然haskell力(はすけるちから)が足りないからさっぱり理解できないので、
とりあえずhaskellは置いといて、
せっかくなのでpythonで書いてみる事にした。

なんか

* pythonの文字列がindex指定で書き換えられないからbytearrayにしたり
* 探索で隣同士で再帰しちゃって無限再帰しちゃったり

予想外に手間取ったけど、2時間ちょうどくらい…かな。
いや、ちょっと超えちゃったかな。まぁいいや。

`c++`で書けば良かった。
`for(int i=0; i<10; ++i)` 形式のループが使えないのがものすごい不便。

ぷよの箱の横幅/縦幅はベタ書きしてないので、縦横広がってもそのまま動くと思う。
まぁ縦横広がる事があるのかわからんけど。

動かしたのは`python2.7.6`。

```py:puyo.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-

puyo_array = [
    "  GYRR",
    "RYYGYG",
    "GYGYRR",
    "RYGYRG",
    "YGYRYG",
    "GYRYRG",
    "YGYRYR",
    "YGYRYR",
    "YRRGRG",
    "RYGYGG",
    "GRYGYR",
    "GRYGYR",
    "GRYGYR",
]

# pythonの文字列はindex指定で書き換えられないのでbytearrayに変換
puyo = [ bytearray(line) for line in puyo_array ]

def show():
    print "-" * 8
    for x in puyo:
        print "|{}|".format(x)
    print "-" * 8
    print

def erase():
    u'''4つ以上繋がってるの消す'''
    class Way:
        u'''どっちから探索来たか'''
        UP = 1
        DOWN = 2
        LEFT = 3
        RIGHT = 4

    def mark(dx, dy, p, dst = None):
        u'''隣接してる同色を辿る'''
        if dx < 0 or dy < 0:
            return

        try:
            if puyo[dy][dx] == p:
                points.append((dx, dy))
                # 入ってきた方向に探索すると無限再帰するので
                if dst != Way.RIGHT:
                    mark(dx+1, dy, p, Way.LEFT)
                if dst != Way.UP:
                    mark(dx, dy+1, p, Way.DOWN)
                if dst != Way.LEFT:
                    mark(dx-1, dy, p, Way.RIGHT)
                if dst != Way.DOWN:
                    mark(dx, dy-1, p, Way.UP)
        except IndexError as e:
            pass

    for y, line in enumerate(puyo):
        for x, p in enumerate(line):
            if chr(p) != " ":
                points = []
                mark(x, y, puyo[y][x])

                if len(points) >= 4:    # 4連結以上
                    for x, y in points:
                        puyo[y][x] = " " # 消す

def drop():
    u'''浮いてるの落とす'''
    height = len(puyo)
    assert(height > 0)
    width = len(puyo[0])
    is_zenkeshi = True
    for x in range(width):
        for y in range(0, height)[::-1]:    # 下から嘗める
            if chr(puyo[y][x]) == " ":
                for y2 in range(0, y+1)[::-1]:
                    if chr(puyo[y2][x]) != " ":
                        puyo[y][x] = puyo[y2][x]
                        puyo[y2][x] = " "
                        break
            else:
                is_zenkeshi = False
    # 全部消えてたらTrue
    return is_zenkeshi


if __name__ == '__main__':
    import itertools
    for i in itertools.count():
        print i
        show()

        erase()
        if drop():
            break
    
    print "finish!!"
    show()
```
リカバリーモードでrootユーザーなのにReadOnlyだと怒られる時の対処法

### 困ったこと

Mintが起動しなくなったのでリカバリーモードでrootログインしてるのに設定ファイルを編集しようとすると「Read Onlyだよ、バカ。」と怒られる。当然ファイルのパーミッションは書き込みありにしてるのに。

### 原因

マウント処理自体が読み込み専用で行われてるらしい。リカバリーモードなんだから変更できるようにしといてもらいたいんだけど、何でこんな設定になってんだろう…。

### 対策

```
mount -o remount,rw /
```

### 参考

mount - How do I change file system in recovery mode to read-write mode? - Ask Ubuntu http://askubuntu.com/questions/117950/how-do-i-change-file-system-in-recovery-mode-to-read-write-mode
[CentOS 6.5]ユーザー追加してrbenvをシステムにインストールするまでの手順

参考サイトが多く、いつもタブをたくさん開いてしまうのでまとめておく。
rbenv公式：[sstephenson/rbenv · GitHub](https://github.com/sstephenson/rbenv)

## 作業ユーザーを追加
作業ユーザーを追加する。
すでに作成してある場合はスキップ。

```bash
# useradd rbuser
# passwd rbuser
```

## ユーザーをwheelグループに追加
作成したユーザーでsudoを使うためにwheelグループに追加する。

```bash
# gpasswd -a rbuser wheel
```

## sudoers の設定
[rbenvをシステムワイドにインストールする](http://office.tsukuba-bunko.org/ppoi/entry/systemwide-rbenv) で紹介されている例に倣ってデフォルトの設定ファイルではなく、個別のファイルを作成します。

```bash
# visudo -f /etc/sudoers.d/00_base
```

以下を記述する。

```
%wheel ALL=(ALL) ALL
Defaults !secure_path
Defaults env_keep += "PATH RBENV_ROOT"
````

* 1行目
    * wheelグループに所属するユーザーがsodoできるようにする
* 2行目
    * sudo時のPATHの初期値を設定する secure_path を無効化
* 3行目
    * 操作ユーザーのPATHとRBENV_ROOTを引き継ぐ

sudoが使えるようになりましたので、これ以降は一般ユーザーで操作します。

## rbenv, ruby-build のインストール

作業用の環境変数設定。

```
$ export RBENV_ROOT=/usr/local/rbenv
$ export PATH=${RBENV_ROOT}/bin:${PATH}
```

gitでrbenvとruby-buildを取得。
以後、バージョンアップする場合はそれぞれのディレクトリに移動して `sudo git pull` すれば最新版にできる。

```
$ sudo git clone git://github.com/sstephenson/rbenv.git ${RBENV_ROOT}
$ sudo git clone git://github.com/sstephenson/ruby-build.git ${RBENV_ROOT}/plugins/ruby-build
```

rbenvを初期化。

```
$ sudo rbenv init -
```

設定ファイルにrbenv用の設定追加。

```
$ sudo bash -c 'cat << \_EOT_ > /etc/profile.d/rbenv.sh
export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
_EOT_'
```

シェルを再起動

```
$ exec ${SHELL} -l
```

## Rubyインストール

```
$ sudo rbenv install 2.1.2
$ sudo rbenv global 2.1.2
$ sudo rbenv rehash
```

`rbenv install -l`で利用可能なrubyの一覧を表示できる。

### パッケージが足りない場合

```
$ sudo yum -y --enablerepo=remi,epel install zlib zlib-devel readline readline-devel openssl openssl-devel libxml2 libxml2-devel libxslt libxslt-devel
```

### Ruby 2.2.0 の場合

Ruby 2.2.0 をインストールしたときにビルドエラーが発生しました。
[こちら](http://qiita.com/MorimotoYasunori@github/items/fb81946fc088b18d6a3a)の記事を参考にして対応。 

```
$ sudo yum install libffi-devel
```

## bundlerインストール

```
$ sudo gem install bundler --no-ri --no-rdoc
$ sudo rbenv rehash
```

bundlerインストール後はプロジェクトごとにGemを管理するのが良いとのこと。
* [システムのgemにrailsをインストールせずrails newする](http://qiita.com/youcune/items/222777415f00d19cccb4)

## 参考サイト
* [usermod -G でユーザに新しいサブグループを追加してはいけない](http://d.hatena.ne.jp/thegoodbadugly/20130116/1358316032)
* [ユーザー・グループの作成と root 権限を制限する設定 〜 CentOS6](http://easyramble.com/create-user-group.html)
* [rbenvをシステムワイドにインストールする](http://office.tsukuba-bunko.org/ppoi/entry/systemwide-rbenv)
* [CentOSでrbenvをシステムにインストールする](http://qiita.com/youcune/items/a5cc93313641b69b62f8)
* [rbenv と ruby-build で Ruby をインストールして管理 〜 CentOS6](http://easyramble.com/install-ruby-with-rbenv.html)
[Symfony2][AngularJS] テンプレートキャッシュを自動生成するバンドル作ってみました


つくってみた

https://github.com/hshn/HshnAngularBundle
https://packagist.org/packages/hshn/angular-bundle

# 背景

Symfony2でAngularJSのテンプレートを使おうとすると[JmikolaJsAssetsHelperBundle](https://github.com/jmikola/JmikolaJsAssetsHelperBundle)を使ってテンプレートのURL解決を行わなければならないし、httpリクエストもテンプレートの数だけ増えてなんか嫌だなと。

AngularJSには[$templateCache](https://docs.angularjs.org/api/ng/service/$templateCache)で事前にテンプレートをキャッシュする仕組みがあるし、それを[grunt-html2js](https://github.com/karlgoldstein/grunt-html2js)で事前に生成する人たちもいるしAsseticで自動生成すればいいんじゃね？といった動機です。

# 使い方

## インストール
```bash:
$ php composer.phar require hshn/angular-bundle:dev-master
```

```php:AppKernel.php

// カーネルに追加

public function registerBundles()
{
	return array(
		...
		new \Hshn\AngularBundle\HshnAngularBundle()
        ...
	);
}
```

## 設定
```yaml:config.yml
hshn_angular:
    template_cache:
        modules:
            # テンプレートキャッシュが"app"モジュールとして生成される
            app:
                targets:
                    # キャッシュを生成したいテンプレートが置いてあるディレクトリを指定する
                    - @YourBundle/Resources/public/js
    assetic: ~
```
> 
> __補足：指定したディレクトリからの相対パスが、キャッシュのキーになります__
>
> 仮に指定したディレクトリ配下に２つのファイルがあったとすると
>
> ```html:@YourBundle/Resouces/public/js/views/foo.html
> foo 
>```
> ```html:@YourBundle/Resouces/public/js/views/foo/bar.html
> foo::bar
>```
> 生成されるキャッシュはこんな感じになります
>
> ```js:生成されるキャッシュファイル.js
>angular.module('app')
>    .run(['$templateCache', function ($templateCache) {
>         $templateCache.put('view/foo.html', 'foo');
>         $templateCache.put('view/foo/bar.html', 'foo::bar');
>    }]);
>```
> > このファイルをロードすれば、`app`モジュールをロードした状態で`view/foo.html`と`view/foo/bar.html`が使えるようになりますよ、といった感じです

## テンプレートを使う

まずテンプレートキャッシュをロードします。

Asseticから`@ng_template_cache_{モジュール名}`でロードできるようになっているので、Symfonyのテンプレートで指定するだけです。

```layout.html.twig

{% javascripts filter="?closure" 
  '@YourBundle/Resouces/js/angular.js'
  '@YourBundle/Resouces/js/app.js'
  ...
  '@ng_template_cache_app'
  ...
%}
<script type="text/javascript" src="{{ asset_url }}"></script>
{% endjavascripts %}

```

あとは[$templateCache](https://docs.angularjs.org/api/ng/service/$templateCache)の説明通り[ngInclude](https://docs.angularjs.org/api/ng/directive/ngInclude)やディレクティブの`templateUrl`等々でテンプレートのパスを指定して使えますよといった感じです

よかったら使ってみてくださいー
> PR歓迎してます、英語力がゴミってるのでドキュメントの修正とか嬉しいです
CoffeeScriptでyieldが使えるようになってた


Nodeではオプショナルで使えるようなってるyield(generator)。CoffeeScriptのyield事情ってどうなってるのだろうと調べたら、ちょうど6日前にyield関連のコミットがされてた。

https://github.com/jashkenas/coffeescript/commit/a78cbe78a15175452a640f2d18b8585a397e41fb
https://github.com/jashkenas/coffeescript/pull/3240

なので使ってみようと思う。

#Nodeの準備
最近のNode(v0.11のいくらか)でないとgenerator使えないので入れる。nodebrew使うけどそのインストール手順は省略。

```
nodebrew install v0.11.14
nodebrew use v0.11.14
```

#CoffeeScriptの準備
```
npm install -g cake
git clone https://github.com/jashkenas/coffeescript.git
cd coffeescript
npm install
cake build
```

#サンプルスクリプト
ちょっとgeneratorの説明に適したコードが思い浮かばないので、雑ですが。function*()みたいな表記をしなくても、yieldが使われてる関数が勝手にgeneratorになるっぽい。

```coffee:sample.coffee
p = console.log

g = ->
  p "  enter"
  p yield "  yld"
  p "  after yield"
  "  exit"

g1 = g()
p "start"
p g1.next().value
p "after next"
p g1.next("arg").value
p "end"
```

#使ってみる
Coffee経由でNodeに--harmony-generatorsを渡す。

```
bin/coffee --nodejs --harmony-generators sample.coffee
```

#結果
行ったり来たりした独特の挙動がわかると思う。

```
start
  enter
  yld
after next
arg
  after yield
  exit
end
```

#まとめ
リリースが楽しみです。
突然Getリクエストで名前解決が出来なくなった


機内モードやwifiなどを切り替えをしながらテストをしていたら突然セルラー接続時にGetリクエストでエラーが発生して、エラー内容を見たらどうやら名前解決ができなくなったらしい。
別の端末でセルラー接続したら正常に取得できていたので、iPhoneを再起動したら直った。

デバイスは
iPhone5S,iOS8,Softbank
php 覚書 1 プロパティアクセス編

案件が変わったので今後は php の投稿が多くなる見込み

```php
<?php
class A {
  public $b = "hoge"; // 良い子は プロパティ を public で定義しちゃダメだゾ
}

$a = new A();
$c = "b";

var_dump($a->b);      // string(4) "hoge"
var_dump($a->{'b'});  // string(4) "hoge"
var_dump($a->$c);     // string(4) "hoge"
var_dump($a->{$c});   // string(4) "hoge"
```

2個目があるおかげで、json 文字列をデコードする時も問題なく行える。

```php
<?php
$jsonStr = <<<EOT
{
  "normal": "hoge",
  "a b": "fuga",
  "a->b": "expected",
  "a": {"b": "unexpected"}
}
EOT;
$json = json_decode($jsonStr);
$normal = "normal";
$space = "a b";
$arrow = "a->b";

var_dump($json->normal);      // string(4) "hoge"
var_dump($json->{'normal'});  // string(4) "hoge"
var_dump($json->$normal);     // string(4) "hoge"
var_dump($json->{$normal});   // string(4) "hoge"

// var_dump($json->a b);      // Parse error
var_dump($json->{'a b'});     // string(4) "fuga"
var_dump($json->$space);      // string(4) "fuga"
var_dump($json->{$space});    // string(4) "fuga"

var_dump($json->a->b);        // string(10) "unexpected"
var_dump($json->{'a->b'});    // string(8) "expected"
var_dump($json->$arrow);      // string(8) "expected"
var_dump($json->{$arrow});    // string(8) "expected"
```

個人的には、オブジェクトのプロパティと連想配列のキーとの区別が無い JavaScript の方が好き。
注文検索APIの証明書利用とリフレッシュについて

Yahoo注文検索APIの証明書とアクセストークンのリフレッシュについてお教え下さい。
http://developer.yahoo.co.jp/webapi/shopping/help.html

上記URLのように証明書を利用することによりアクセストークンの有効期限を延長することができますが、
証明書は1回に限り使用できるのでしょうか。それとも認証することにより再利用することができるのでしょうか。

つまり、1回の証明書申請で4週間 → 12時間 → 12時間となるのか4週間 → 4週間 → 4週間となるかをお聞きしたいです。


また、注文検索APIにおいても通常のYConnectと同じようにrefresh_tokenを使用して
アクセストークンの取得ができるのでしょうか。

初歩的な質問で申し訳ございませんがよろしくお願い致します。