OmniAICreator/Qiita-1.07M huggingface dataset:
git入門

# gitの設定

まずは初期設定をする。gitを使った事のない人は名前などの登録から。
エイリアスの登録は、これは単に省略形で入力できるように別名を与えるだけの設定なので設定してもしなくても良い。

* 名前とEmailの設定  
    `git config --global user.name "(your name)"`  
    `git config --global user.email "(your email)"`
* メッセージの色分け  
`git config --global color.ui true`
* 設定確認  
`git config -l`
* エイリアスの登録  
`git config --global alias.co checkout`  
`git config --global alias.st status`  
`git config --global alias.br branch`  
`git config --global alias.cm commit`

# コミット（プログラムの変更箇所を追加する）

新しくプログラムを作ったら、もし間違えた時に以前のバージョンに戻りたい場合に備えてちょくちょくコミットするのがベター。
分かりやすく説明すると、**addでステージングエリア（インデックス）というところに一時登録、そしてコミットすることによりリポジトリというところに最終的に確定登録、みたいなイメージです。**

1. `git init`  
gitを使うための初期化
2. `git add .`  
ステージングエリアに追加という意味。「.」はカレントディレクトリ以下の全てのファイルを追加という意味。
3. git commit -m "Initial commit"  
リポジトリへ追加という意味。
-m オプションを付けると、コミットメッセージを指定してコミットすることができる。

# log確認

`git log`で**ログを確認**できる。  

### オプション  
* `git log --oneline`  
一行で表示
* `git log -p`  
変更箇所も確認したい場合
* `git log -stat`  
どのファイルが何か所変更されたかを表示

# 現在の状態の確認
* `git status`  
変更されたファイルの一覧を表示

# 差分の確認
* ステージングエリアにまだ登録していない場合  
`git diff`
* ステージングエリアに登録している場合  
`git diff --cashed`

# .gitignore（git管理に含めない設定）
「.gitignore」ファイルを作成し**「*.log」**のように記述する

# 過去に戻る
* ステージングエリアに登録した変更（addしてコミットする前）を**一つ前**に戻す  
`git reset --hard HEAD`
* コミットのIDを指定して好きな位置まで戻る  
`git reset --hard コミットID(7桁以上)

# ブランチ
* ブランチ作成  
`git branch 名前`
* ブランチの移動  
`git checkout 名前`
* **ブランチの作成&そのブランチへ移動**  
`git checkout -b 名前`
* ブランチのマージ  
`git merge 名前`
* 要らないブランチの削除  
`git branch -d 名前`

# コミットIDに分かりやすい名前を付ける（タグ）
* 直前のコミットIDの名前を付ける場合  
`git tag 名前`
* 直前ではなくその他のコミットIDに名前を付ける場合  
`git tag 名前 コミットID`
* タグの内容を見る  
`git show 名前`
* タグの一覧確認  
`git tag`
* タグの削除  
`git tag -d 名前`

# 共有リポジトリ
共有リポジトリを行うには基本的に「**.git」などのような共有ディレクトリ内で作業をする。
その際のコマンドは通常と少し異なる。
`git init --bare`

(例)
1. Aさんが「myweb」で行っている作業を、共有リポジトリ「ourweb.git」に**新規追加**する場合
* まずは共有リポジトリのディレクトリを作る
`mkdir ourweb.git`
`cd ourweb`
* 次に、共有リポジトリに「origin」という名前の共有を追加
`git remote add origin ~/ourweb.git`
* リモートのoriginの場所を確認する場合
`git config -l`
* 削除
`git remote -rm origin`
* 共有リポジトリにAさんの内容をpushする場合
`git push origin master`  
2. Bさんが共有リポジトリ「ourweb.git」の中身を「myweb2」に入れる場合
`git clone ~/ourweb.git/ myweb2`  
3. Bさんが「myweb2」でファイル編集して、それをourweb.gitにpushする場合
`git push origin master`
（注）**すでに共有リポジトリに上げられたものを編集したのでgit remote add ~~~~ する必要ない**  
4. AさんがBさんの編集してpushした内容のリポジトリを取り込みたい場合(mergeもする)
`git pull origin master`

**(注)Aさん、Bさんが同じファイルを編集して二人ともpushした場合**
普通は一人が編集したらそれをpullしなければいけないが、一人がpushしたのを知らずにpushした場合に起こる。（衝突（コンフリクト））
1. git pull origin master
一旦このコマンドを入力
2. そのファイルを編集して`git commit -am "conflict fixed"`
3. `git push origin master`
windowsでlaravel5をvagrantの共有フォルダで開発しようと思っている人へ。

詰む人が出てきそうなので、ここに書こうと思います。
実際に自分も詰みました・・・。

新しいやり方書きました。新しい方のほうが雑です。
[最近、Laravel5でベストだと思うフォルダ共有方法。With Windows](http://qiita.com/fagai/items/9d491c139298e6f6e527)


## 一応vagrantの仮想環境について

* vagrant 1.6.5
* centos 6.5
* nodebrew 0.8.1
* node 0.12.0
* npm 2.7.1
* apache 2.2.15
* php 5.4.38
* mysql 5.5.42-log

## 内容

Laravel5では、フロントエンド等を便利にするためのシステムとして、Laravel Elixirというシステムがあります。(フロント以外だと、自動でPHPUnit実行とか出来たりするはず

このLaravel Elixirなのですが、npmでインストールする必要があります。

原因はよくわかりませんが、tarを解凍出来ないエラーが出たりして、npmのインストール時に詰みました。

最終的に私が取ったのは、現状PHPStormを使っていたこともあっったので、SFTPで同期する形でプロジェクトを作りなおす事になりました。


一応、このSFTPで同期する方法を取ることでnpm installは問題なく動くようになりました！→同期に時間が掛かりすぎて、ちょっとこの方法は厳しいことが分かりました・・・。

追記１
node_modulesをシンボリックリンクすれば行けます的な記事を見つけたのでやってみた。
結論としては、シンボリックリンクがどうしても使うことが出来ず、断念。もともとvirtualboxの仕様で、共有フォルダにシンボリックリンクは貼れないらしい・・・。

追記２
読み込ませる方法が分かりました！

VirtualBoxを最新にします。(多分バージョン4以上なら不要)

Vagrantfileに以下を追加します。

```
config.vm.provider "virtualbox" do |v|
    v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
end
```

管理者権限でプロンプトを開きます。

この謎のコマンドを打ちます。どうやらシンボリックリンクの有効範囲を設定するみたいです。(打たなくても行ける人は行けるみたいです)

```
fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
```

これで、vagrantを立ちあげてみると、来ました来ました！シンボリックリンクが貼れました！
あとはこれでnpmが動けば・・・、やったー！動いたーーー！

## 最後に

<del>これを解決出来る人がいれば教えていただきたいです・・・。</del>
最終的に自己解決に至りました・・・ｗ
ではではー。

### 追記
ストックされる方が多くなってきたので追記しておきます。

この方法はwindows環境下でvagrant上でnodeを動かしたい人向けの記事です。
海外の書籍を確認する限り、windows環境にnodeをインストールして動かすというのも手みたいです。
ただ、win環境だと動かないnodeライブラリとか出てきそうですけどね。。。
EC-CUBE3のメモ - 画面を作ってみる -

[EC-CUBE 3 リファクタガイドライン](https://github.com/EC-CUBE/ec-cube/wiki/%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%82%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3)にそって、管理画面＞ポイント管理を作ってみるまでのメモ。

# 環境設定

* 利用ツール
    + Xampp
        - PHP5.4
        - MySQL
    + NetBeans

Xamppでも一応できる
insaller.shが動かせないので、いろいろ頑張る（あとでかく：構築手順）

# ポイント管理

## ぷるりく
https://github.com/EC-CUBE/ec-cube/pull/72/files

## 修正ファイル一覧(不要なのはのぞく、以下5ファイル修正必要)
src/Eccube/Controller/Admin/Basis/PointController.php
src/Eccube/ControllerProvider/AdminControllerProvider.php
src/Eccube/Form/Type/PointType.php
src/Eccube/View/Admin/Basis/point.twig
src/Eccube/ServiceProvider/EccubeServiceProvider.php

## 完成までの流れ

以下の順番でやるとイメージつきやすい

* ルーティングを修正する
    - [src/Eccube/ControllerProvider/AdminControllerProvider.php](https://github.com/EC-CUBE/ec-cube/pull/64/files#diff-482bfad49f0fa04c13afcb1dfa85ed28)
* コントローラを作成する
    - [src/Eccube/Controller/Admin/Basis/PointController.php](https://github.com/EC-CUBE/ec-cube/pull/64/files#diff-26ac934db9f171b55b0104d8102c830f)
* テンプレートを作成する
    - [src/Eccube/View/Admin/Basis/point.twig](https://github.com/EC-CUBE/ec-cube/pull/64/files#diff-e032d22766962f392ca8a0f93cdfd9a0)

いったんここで画面表示して表示されるまで修正

* フォーム作成
    - [src/Eccube/Form/Type/PointType.php](https://github.com/EC-CUBE/ec-cube/pull/64/files#diff-32732e99e9be9573b0feb546dcb1647d)
    - ディレクトリ分ける？パーツ化した方がよい？とか色々考えるけどいったんType以下にフラットで配置でよい
* コンテナに必要なもの追加、修正
    - [src/Eccube/ServiceProvider/EccubeServiceProvider.php](https://github.com/EC-CUBE/ec-cube/pull/64/files#diff-bbec720bd3fbaf4cdcdbecbe3d21bbdb)
    - 作成したFormTypeは、ServiceProviderに追加しないとだめ
    - BaseInfoレポジトリを追加しておくと楽

FormTypeに定義するバリデータなどはSymphonyのドキュメントを参照しながら置き換えていく

http://docs.symfony.gr.jp/symfony2/reference/forms/types.html
http://docs.symfony.gr.jp/symfony2/reference/constraints.html


## submit時にFormValidatorでNoticeがでたら、、、
```
Notice: Trying to get property of non-object in /var/www/Myblog/vendor/symfony/symfony/src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php line 84
```

submitした時に、上記のようなNoticeがでるときがある

カッコの位置が間違ってるのでなおす
http://stackoverflow.com/questions/19299898/symfony2-form-trying-to-get-property-of-non-object-in

## つづき
[ユニットテスト](http://qiita.com/chihiro-adachi/items/f2fd1cbe10dccacb3631)に続く
cocos2d-x 3.2 イベントなどの登録の削除

//イベントの削除はこれが確実かもしれない。
Director::getInstance()->getEventDispatcher()->removeEventListener(m_listener);

//わからないのは、これを使うと落ちる事があったということ、
//理解不足があるということではある。
removeEventListenersForTarget(node)
RebuildfmからDockerに関する回だけを抽出してみた(JavaScriptで)

* [83: Living In A Container (deeeet)](http://rebuild.fm/83/)
* [79: Deep Learning Anime (Naoya Ito)](http://rebuild.fm/79/)
* [41: Kids These Days Don't Know Shell (Naoya Ito)](http://rebuild.fm/41/)
* [25: Immutable Infrastructure (Naoya Ito, Gosuke Miyashita)](http://rebuild.fm/25/)
* [14: DevOps with Docker, chef and serverspec (naoya, mizzy)](http://rebuild.fm/14/)

(スクレイピングなので敬称略ですすいません...)

## 抽出方法

GoogleChromeの JavaScript Consoleでワンライナー書きました。

```js
var baseurl = "http://rebuild.fm"; $('.episode').each(function(i,ep){ var $ep = $(ep);var $a = $ep.find('a'); var path = $a.attr('href'); var excerpt = $ep.find('.excerpt').text(); if(excerpt.match(/docker/i))console.log("* ["+$a.text()+"](" + baseurl + path + ")" ) });
```

見やすく整形するとこうなります。

```js
var baseurl = "http://rebuild.fm";

$('.episode').each(function(i,ep) {
  var $ep = $(ep);
  var $a = $ep.find('a');
  var path = $a.attr('href');
  var excerpt = $ep.find('.excerpt').text();             
  if (excerpt.match(/docker/i)) {
    console.log("* [" + $a.text() + "](" + baseurl + path + ")");
  }
);
```
Arduinoで7セグメント4桁ディスプレイLED05291Pを試す

# 準備

適宜、ご自身の環境に読み替えてくださいませ。

* 環境
 * HW
     * Windows PC (Windows 7 Pro 64bit)
     * Arduino Uno
     * [Grove ベースシールド V2 SLD01099P](http://www.seeedstudio.com/depot/Base-Shield-V2-p-1378.html)
     * [Grove 7 セグメント 4 桁ディスプレイ LED052911P](http://www.seeedstudio.com/depot/grove-4digit-display-p-1198.html)
 * SW
     * Arduino IDE 1.6.1

# EX1:数字0～9をカウントアップ表示する

まずライブラリの使用方法習得のために、単にカウントアップする表示器を作ってみる。

## 1. TM1637 用ライブラリをインストール

1. ライブラリをダウンロード  
http://www.seeedstudio.com/wiki/File:DigitalTube.zip
2. ライブラリを Arduino IDE にインストール  
Arduino IDE の [スケッチ] → [ライブラリを使用] → [ライブラリをインストール…] からダウンロードしたライブラリ ZIP (DigitalTube.zip) を選択しインストールする。
 * \ドキュメント\Arduino\libraries\ 以下にコピーされる

## 2. 7セグディスプレイをベースシールドの**D7端子**に接続する

![IMG_20150320_222511-light.jpg](https://qiita-image-store.s3.amazonaws.com/0/68547/89068004-1eae-a59b-f8f5-e9823e9d0bb9.jpeg)

ピンアサインは、下表です。

| Arduino | Sensor | Color |
|:-:|:-:|:-:|
| GND | GND | Black |
| VCC | VCC | Red |
| D8 | DIO | White |
| D7 | CLK | Yellow |

## 3. スケッチを作成する

各桁が 0 から 9 まで約 1 秒毎にカウントアップし 0 に戻って繰り返します。

```lang:Grove_7_Seg_Display_ex1.ino
#include "TM1637.h"

#define NANA_SEG_CLK 7
#define NANA_SEG_DIO 8

TM1637 tm1637( NANA_SEG_CLK, NANA_SEG_DIO );

void setup() {
  tm1637.init();
  tm1637.set( BRIGHT_DARKEST );
}

void loop() {
  int8_t NumTab[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  int8_t ListDisp[4];
  unsigned char count = 0;
  delay( 150 );
  while( 1 ) {
    count ++;
    if( count == sizeof(NumTab) ) count = 0;
    for( unsigned char BitSelect = 0; BitSelect < 4; BitSelect ++ ) ListDisp[BitSelect] = NumTab[count];
    tm1637.display( ListDisp );
    delay( 850 );
  }
}
```

## 4. 動作を確認する

1. Arduino IDE にてコンパイル＆書き込み
2. 7 セグの表示が 0 → 9 とカウントアップし、0 から再カウントアップすることを確認する

## 5. 感想

* LCD の勢力が強い昨今、7 セグのレトロ感に魅惑される。14セグ, 16セグへの興味が高まる。
* ライブラリの使い方を TM1637.h を見て簡単に理解しておくと作業が捗る。ライブラリ万歳。
* delay を使って簡単に約 1 秒毎としているが、ちゃんとした精度を求めるならそれなりの実装を。

## 6. リファレンス

* https://www.switch-science.com/catalog/1175/
* http://www.seeedstudio.com/wiki/Grove_-_4-Digit_Display

# EX2:つづく…
ldd equivalent on Mac OSX

Macで`ldd`使おうと思ったら無かった。

```zsh

$ ldd
zsh: command not found: ldd
```

Macだと代わりに`otool`というコマンドがあるらしい。

```
OTOOL(1)


NAME
       otool - object file displaying tool

SYNOPSIS
       otool [ option ...  ] [ file ...  ]

DESCRIPTION
       The  otool command displays specified parts of object files or libraries.  If the -m option is not used the file arguments may be of the form libx.a(foo.o), to request information about only that object file
       and not the entire library.   (Typically this argument must be quoted, ``libx.a(foo.o)'', to get it past the shell.)  Otool understands both Mach-O (Mach object) files and universal file formats.  Otool  can
       display the specified information in either its raw (numeric) form (without the -v flag), or in a symbolic form using macro names of constants, etc. (with the -v or -V flag).

       At least one of the following options must be specified:
```

`ldd`と同じように使う場合は`-L`オプションをつける。

```zsh
$ otool -L
```

参照：　
https://discussions.apple.com/thread/309193?start=0&tstart=0
Project Euler 49

問題
---
項差3330の等差数列1487, 4817, 8147は次の2つの変わった性質を持つ.

(i)3つの項はそれぞれ素数である. 
(ii)各項は他の項の置換で表される. 
1, 2, 3桁の素数にはこのような性質を持った数列は存在しないが, 4桁の増加列にはもう1つ存在する.

それではこの数列の3つの項を連結した12桁の数を求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2049

回答
---
1. count_numbersで各桁の数を表す辞書を作成する。
2. すべて素数の等差数列について、その数列に含まれる数のcount_numbersによる辞書が等しいかをチェックする。

mymathについてはこちら
https://github.com/cof01/ProjectEuler/blob/master/mymath.py

```py
# coding: utf-8
import math
from mymath import get_primes,is_prime

def count_numbers(n):
    ret = {i:0 for i in range(10)}
    for s in str(n):
        ret[int(s)] += 1
    return ret

def check(p,diff,pri):
    p1, p2, p3 = p, p+diff, p+diff*2
    if not is_prime(p2, pri):
        return False
    if not is_prime(p3, pri):
        return False
    if count_numbers(p1) == count_numbers(p2) == count_numbers(p3):
        return True
    else:
        return False

def main():
    MIN, MAX = 10**3, 10**4
    pri = get_primes(MAX)
    ans = []
    for p in pri['list']:
        if p <= MIN:
            continue
            
        for diff in range(2, (MAX-p)//2, 2):
            if check(p,diff,pri):
                ans.append([p, p+diff, p+diff*2])
                break
    print ans
main()
```
play-slick でDAO作ろうとしたらArrayIndexOutOfBoundsExceptionが出る

　コピペで適当に書いてはいけない (戒め)

# 事案の内容
1. play-slickに慣れてきたので、データベースを複数使ってみようとする
2. play-slickのサンプルから “cake” パターンをモデル部分だけコピペする
3. **modelsパッケージ以外の場所に `class Hoges (tag: Tag) extends Table[Hoge](tag, "HOGE") { ... }` を書くと、コンパイルエラーは出ないがArrayIndexOutOfBoundsExceptionが出る**

# 解決方法
　application.confから `slick.default = "models.*"` などの設定を消す。
　サンプルをコピペするなら `slick.default="models.current.dao.*"` と変える。

　まさか原因が.confにあるとは想像もしておらず、半日ずっと調べまくっていました。落ち着いてドキュメントをよくよく見ると[ちゃんと書いてある](https://github.com/playframework/play-slick/wiki/Usage#ddl-plugin)のが非常に辛いです。
$this->load->file()の設定の仕方について

気がつけば阿呆だったのですが、検索かけてもでてこなかったので、ここに残しときます

マニュアルにそって普通に

$this->load->file('filepath/filename', true/false)

を行おうと、application/hoge/fuga.php を

$this->load->file('hoge/fuga');

のように呼び出しても、そんなファイルねーよ、と怒られます。
嗚呼、勘違い。

hogeにapplication配下のディレクトリを指定たのですが、あくまでPathとFilename

なので、

$this->load->file(APPPATH. 'hoge/fuga.php')

だったんですよ、これが :joy: 。
【Rails】CSVをエクスポート→エクセル で文字化け問題

** 結論から言うと出回ってる解決策では、完璧には解決しないように思われます。
いろいろ解決策求めてここにたどり着いた方は、一番下に書いた結論のように方向転換して調査することをお勧めします。

以下概要。

# 問題
CSV形式で作成したファイルの日本語文字が、ダウンロードからダブルクリックすると(railsのデフォルト文字コードutf-8だと)エクセル上で文字化けしてしまう。

# 原因
いたってシンプル。
エクセルが、utf-8に対応していないから。

## 解決策らしきもの
以下解決策らしかったけど解決してくれなかったもの。

* http://qiita.com/mashiro/items/0d0b9bbb0f4a6cca620c
* http://qiita.com/shinichinomura/items/88879711245a420f713d


Mac版エクセルでも、Win版エクセルでも両方対応するためには、UTF-16LEでないといけないらしい。
→ 記事通りにencode変える+BOMつける。

```
def csv_download
  column_names = ["事業部名"]
  bom = "\xFF\xFE".force_encoding("UTF-16LE")
  respond_to do |format|
    format.csv{ send_data bom + column_names.to_csv.encode("UTF-16LE"), filename: "filename.csv", type: 'text/tsv' }
  end
end
```

これで,UTF-16LEの文字コードのファイルをダウンロードすることに完了。(ダウンロードして、そのファイルの文字コードがUTF-16LEだった。)

```
file --mime fliepath
```

でencode確認できる。

```
charset=utf-16le
```

ダウンロードしたやつが、utf-16leだった！！きた！！！！

(file --mineでencode確認してるが、それでうまくいかないときはnkfっていうのinstallして、nkf --guessとかでみれる。)

### しかし！！！これをmacエクセルで開くと。。。。

![](https://cloud.githubusercontent.com/assets/7357864/6745156/209471f8-cf03-11e4-821f-fff4f92e592e.png)

"業"が化けてる...。

たしかに、他の文字で試したところ、ほとんど化けないことのほうが多い、だから、記事でUTF-16LEがいい！って言ってる人らは勘違いしてると思われる。

現状調べている感じでは、UTF-16LE以外に、日本語onCSV→excelでうまくいきそうな文字コードは見つかってない。しかし、UTF-16LEを使っても文字化けする文字は上記のように存在するので、それを使うのは少々危険すぎるかと。

## 結局どうすればいいか
① 英語のみにする。日本語とかいうマイナー言語使わん。
② csvで出力するのをやめる。Excelとか。(やめた場合、他の形式で文字化けなくうまくいくかは調査の必要あり。)
③ UTF-16LE以外でうまくいきそうな文字コードを見つける  
の3策。好きなものを選びましょう。
JavaScriptのPromiseとScalaのPromiseは別物で、むしろScalaのFutureが似てる話

JavaScriptにもScalaにもPromiseという機能がありますが、全く内容が違って、しかもScalaのFutureがむしろJavaScriptのPromiseに似た機能なのでそれを整理します。

基本的には、[言語によってちょっと違うFuture/Promiseをまとめてみた](http://qiita.com/reki2000/items/6acf94a07dee8d26a744)のシリーズの内容をはしょったものです。

まずはJavaScriptのPromiseは、非同期処理自体を抽象化したものとなっております。しかも、thenというPromiseを更に関数を適用して得たでPromiseでPromiseChainを書くことも可能です。

詳しくは、Azuさんの[Promiseの本](http://azu.github.io/promises-book/)が詳しく書かれていますが、簡単な実装例で言うと、

```js
function doubleUp(value) {
    return value * 2;
}
function increment(value) {
    return value + 1;
}
function output(value) {
    console.log(value);
}
var promise = new Promise(function (resolve) {
        resolve(1);
});
promise
    .then(increment)
    .then(doubleUp)
    .then(output) // 4が出力される
    .catch(function(error){
        console.error(error);
    });
```
このようなPromiseをチェーンして書いていく方法が書けます。thenが関数を適用すると適用した非同期処理に対するPromiseを返してくれるのでこのようにチェーンして書くことができます。また例外情報を保有しているので、これらの何処かで発生した例外に対して例外処理を書くことができます。

これと似た処理をScalaで実装する場合、Futureを使うことになります。

```scala
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent._

object MainFuture extends App {
  def double(value: Int): Int = value * 2
  def increment(value: Int): Int = value + 1
  def output(value: Int): Unit  = Console.println(value)

  val future = Future {1}
  (for {
    i1 <- future
    i2 <- Future {increment(i1)}
    i3 <- Future {double(i2)}
  } yield output(i3)) // 4が出力される
    .onFailure { case t: Throwable =>
      Console.println(t.getMessage)
    }

  Thread.sleep(1000)
}
```

同じことが書けます。わざと、`val future = Future {1}`と書いてJavaScriptにフォーマットを似せて書きました。ほぼJavaScriptの実装例と同様の動きをします。Futureは非同期処理というよりは、非同期処理によって得られる未来を抽象化したオブジェクトです。本来ScalaのFutureは、宣言した瞬間に別スレッドでその処理を実行しますが、今回のforの中で宣言しているため逐次処理されます。例外処理も、どこかのFutureで例外が発生すれば、その途中で発生した例外に対してonFailureが呼ばれます。

つまり、JavaScriptのPromiseとScalaのFutureは似ています。

複数のPromise/Futureで最初に完了したものを取得する、のようなお便利メソッド(Promise.race/Future.firstCompleteOf)も両言語とも持ち合わせています。

では、ScalaのPromiseはなんでしょうか。これは、一度だけ結果を代入可能なFutureです。使い方は、

```scala
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent._

object MainPromise extends App {
  def output(value: Int): Unit  = Console.println(value)

  val promise = Promise[Int]
  Future {
    promise.trySuccess(0)
  }
  Future {
    Thread.sleep(100)
    promise.trySuccess(1)
  }
  promise.future.map(output) // 先に終了する0が出力される

  Thread.sleep(1000)
}
```

以上の例のように利用します。上記の例では、複数のFutureを合成して先に結果が出た方をFutureとして定義しています。さらに複数のPromiseを利用して複雑なFutureな処理(例えば、カウントダウンラッチのようは並行部品)を実現することも可能です。

というわけで、JavaScriptとScalaのPromise、全然違いますね。
皆さん、気をつけましょう。
【Atom Editor】マウス操作不要！キーボードだけで矩形選択をする方法

# はじめに
Atom Editorで矩形選択したいって思ったら
[sublime-style-column-selection](https://atom.io/packages/sublime-style-column-selection)が有名だと思います。（たぶん）

でもこれって、`alt`キーを押しながらマウス操作しないといけないんですよね。
矩形選択するためにマウス操作するのやだなーって思っていたんですが、解決策を見つけましたので共有します(*´∀｀)

# 必要なPackages
- 【必須】[multi-cursor](https://atom.io/packages/multi-cursor)
- 【任意】[vim-mode](https://atom.io/packages/vim-mode)

`multi-cursor`っていうpackageが複数行選択を可能にしてくれます

![image](https://qiita-image-store.s3.amazonaws.com/0/43862/0dbde862-8cb7-6926-4ddc-5557275c5bd3.png)

キーバインドの初期設定は

```
alt + shift + cmd + up = Create cursor above
alt + shift + cmd + down = Create cursor under
alt + shift + cmd + left = The next cursor will skip 1 line above
alt + shift + cmd + right = The next cursor will skip 1 line under
```
とのこと

# `vim-mode`と併用したキーバインドのオレオレカスタマイズ

```keymap.cson
'atom-text-editor.vim-mode:not(.insert-mode)':
  'alt-cmd-j': 'multi-cursor:expandDown'
  'alt-cmd-k': 'multi-cursor:expandUp'
  'alt-cmd-l': 'core:select-right'
  'alt-cmd-h': 'core:select-left'
  'alt-cmd-u': 'multi-cursor:skipUp'
  'alt-cmd-d': 'multi-cursor:skipDown'
```

この設定をすると、`vim-mode`のコマンドモードの時に
`alt-cmd-j`で下に
`alt-cmd-k`で上に
動かせます。その後 `alt-cmd-l` で 選択範囲を右に広げることができます

![image](https://qiita-image-store.s3.amazonaws.com/0/43862/3173ca04-65a9-e44c-58df-45f5561fb6f9.png)

# 最後に
キーバインドを変えるかどうかは好みだと思いますが、
矩形選択（的？）なことがマウスを使わずに出来るのは個人的にとってもうれしかったので共有してみました。

もっといいPackageやカスタマイズ方法があれば教えて下さいね(๑´ڡ`๑)
CentOS7にDocker1.5をyum installする方法

CentOS7はDockerを公式サポートしていると聞いてwktkして`yum install docker`してみたもののdocker 1.3が入ってしまい「アッハイ」となってしまった @DQNEO ですこんにちは。

yumでDocker1.5をインストールする方法を見つけたのでご紹介します。

# ステップ１ /etc/yum.repos.d/virt7-testing.repo というファイルを作ります。

```txt:/etc/yum.repos.d/virt7-testing.repo
[virt7-testing]
name=virt7-testing
baseurl=http://cbs.centos.org/repos/virt7-testing/x86_64/os/
enabled=0 
gpgcheck=0
```

# ステップ2 インストールします。

```
sudo yum --enablerepo=virt7-testing install docker
```

確認します。

```
$ docker --version
Docker version 1.5.0, build a8a31ef/1.5.0
```

やったーー！！

※ご利用は自己責任でお願いします。

http://billpaxtonwasright.com/installing-docker-1-5-0-on-centos-7/
Webサイトをプリントする場合、背景画像を強制的に表示させることは可能ですか？

お聞きしたいのですが、Webサイトをプリントする場合、デフォルトのプリント設定だと背景が表示されませんが、ブラウザのクロムの場合 
cssの設定で 
@media print { 
 body { 
 -webkit-print-color-adjust: exact; 
 } 
} 
を記述するとプリントのオプション設定をしなくても背景が表示されるのですが、 
他のブラウザでも同様の設定を行うcssやjsなどの記述はありませんでしょうか？ 
（phpとかサーバーサイドでの設定方法でも構いません）
[AWS] とりあえずEC2に、sshを使ってec2-userで入る

とりあえず[こんな感じで](http://liginc.co.jp/web/programming/server/110507)EC2のインスタンスを作ったので、sshで入ろうと思います。

```rb
$ chmod 600 hoge.pem
$ ssh -i hoge.pem ec2-user@[Public DNSのとこのやつ]

# 例: ssh -i hoge.pem ec2-user@ec2-user@ec2-0x0-x0x-0x0-x0x.ap-northeast-10002.hogepute.amazonaws.com
```

Public DNSには

```rb
ec2-[public ip].[region].compute.amazonaws.com

# 例: ec2-user@ec2-0x0-x0x-0x0-x0x.ap-northeast-1.compute.amazonaws.com
```

な感じで記載されているかと思います。

入れるとこんな感じ。

```rb
       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2014.09-release-notes/
11 package(s) needed for security, out of 28 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$
```
エラー「[Oracle][ODBC]デフォルト・パラメータの不正使用です。」

## パラメータが null(Nothing) になっている可能性

パラメータが Nothing(*) だと発生します。以下のようなコードでチェックしてみましょう。
*: VB の場合 Nothing, C# の場合 null。

```vbnet
' ※ cmd には ADODB.Command や System.Data.Odbc.OdbcCommand などが入っていることを想定します。
For Each p As Object In cmd.Parameters
    If p.Value Is Nothing Then
        Dim err As String
        err = p.Name & " が Nothing です"
    End If
Next
```

どうしても Nothing のまま使いたい場合は、以下のように DBNull に変換して設定してあげましょう。

```vbnet
cmd.Parameters(0).Value = IIf(param Is Nothing, DBNull.Value, param)
```

プリペアドクエリ（パラメータクエリ）を使っているとたまに発生します。

動的に SQL を作っていると、偶然が重なってこのエラーが突然出ることがあります。
cmd.CommandText に設定されている SQL を取り出して他のツールで実行してみても問題なく実行できる場合が多いため厄介です。
そこに問題がないのならパラメータ内容を調べましょう。

# 名前つき引数が重複している可能性

※ 2016/11 追記。

以下のようなクエリで発生します。

```sql
-- ※ 例です。こんな更新してはいけません。
UPDATE userInfo
   SET user_name = :USER_NAME
 WHERE user_name = :USER_NAME -- <-- 名前の重複
```

これほど短い SQL ならすぐに気づきますが、動的に生成されたクエリが長かったりすると気づくまでに時間がかかります。これも、プレイスホルダを書き換えて手動で実行すると問題なく動くので厄介ですね。

以下のようにプレイスホルダの名称を変えて（動的に生成している場合は重複して生成されないようにして）実行します。

```sql
UPDATE userInfo
   SET user_name = :USER_NAME
 WHERE user_name = :USER_NAME2 -- <-- 名前を変える
```
エラー「[Oracle][ODBC][Ora]ドライバが機能しません。」

.NET フレームワークから ODBC 経由で Oracle にクエリを発行する際に以下のようなエラーが発生する（ことがあります）。

```
[Oracle][ODBC][Ora]ドライバが機能しません。
[Oracle][ODBC][Ora]Driver not capable.
```

例えば「TIMESTAMP (6) WITH LOCAL TIME ZONE DEFAULT localtimestamp」のような型のカラムを含むテーブルに対して 以下のようなクエリを投げようとすると表題のようなエラーが発生します。

```sql
INSERT INTO user_info (timeStampColumn, userName) VALUES (SYSTIMESTAMP, 'Hoge')
-- または
INSERT INTO user_info (timeStampColumn, userName) VALUES (localtimestamp, 'Hoge')
```

SQL 内で完結してるんだからふざけるなと思うのですが...。

この時はテーブル定義でカラムのデフォルト値などで対応しました。
cocos2d-x3.2 タッチイベントの登録、、、

auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true); //<< モーダル化を意図
listener->onTouchBegan = CC_CALLBACK_2(TouchGuard::onTouchBegan, this );
Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(listener, kPriorityTouchGuard);
cocos2d-x 3.2 ui::Layoutの画面表示　テスト

this->setContentSize(Size(640,1136));
this->setBackGroundColor( Color3B(255,255,255) );

//以下必須であります。初期値＝NONEに設定されてます。
this->setBackGroundColorType(cocos2d::ui::Layout::BackGroundColorType::SOLID);
Hive0.13とPrestoで配列の順序関係を残して色々処理したい。

クエリのちょっとした書き方。

元のテーブルには、カンマで区切られた文字列が格納している。
 
| num | ans |
|-----|-----|
| 1,4 | 2,5 |

この各カラムには対応関係があり、
1 - 2
4 - 5
この対応関係を残して処理したい

つまり、下のようなテーブルが完成できればよい。

| num | ans |
|-----|-----|
| 1   |  2  |
| 4   |  5  |

Hive 0.10だと難しいが、
Hive 0.13からposexplode関数がある。
これはpositionを保持したまま、配列を展開できる。

```sql
SELECT t1.col as num, t2.col as ans
FROM (
SELECT  seq, col  FROM table
LATERAL VIEW posexplode(split('1,4', ',')) rec as seq, col
) t1
JOIN (
SELECT  seq, col  FROM table
LATERAL VIEW posexplode(split('2,5', ',')) rec as seq, col
) t2
ON t1.seq = t2.seq
```

Prestoではregexp_extract_all関数とUNNESTを使う。

```sql
SELECT
 n as num, a as ans
FROM (
  -- record 生成用
  SELECT n1, n2
  FROM (
    VALUES
      ('1,4', '2,5')
  ) AS x (n1, n2)
) t1
CROSS JOIN UNNEST(regexp_extract_all(n1, '[^,]+'), regexp_extract_all(n2, '[^,]+')) AS t (n, a)
```

ちなみにTreasureDataのPrestoの自動構文チェックではUNNESTを使うとWarningがでるが、
無視して実行してよい。
![presto.png](https://qiita-image-store.s3.amazonaws.com/0/34543/d78463ef-018f-415d-503a-911c21345cd1.png)
Xcode6.2でビルドが異常に遅い

ビルドが異常に遅いので調べてみました。Xcodeに含まれるバグ？があるようで下記の方法で解決できそうです。

##環境
・CocoaPodsあり
・Xcode 6.2

##やったこと１→結果：改善せず
（※削除するものはバックアップしましょう。）

 - `~/Library/Developer/Xcode/DerivedData`の中をすべて削除
 - プロジェクト内のPodsをディレクトリごと削除
 - プロジェクト内の`myAppName.xcworkspace`を削除
 - ターミナルからプロジェクトディレクトリで再度`pod install`を実行


##やったこと２　→結果：ほぼ改善

```swift
    func dumy(json:JSON) -> NSDictionary {
        return [
            "1" : json["1"].int!,
            "2" : json["2"].string!,
            "3" : json["3"].int!,
            "4" : json["4"].string!
        ]
    }
```
こんなようなものがあったので、
↓こうしたら概ね良くなりました。

```swift
    func dumy(json:JSON) -> NSDictionary {
        var result = NSMutableDictionary()
        result["1"] = json["1"].int!
        result["2"] = json["2"].string!
        result["3"] = json["3"].int!
        result["4"] = json["4"].string!
        return result
    }
```

Stack OverFlowにもかかれていますが、[]での書き方がなにかindexing周りでおかしなことになるような。。。よく分かりません。

「やったこと１」で改善する人もいるようなので、それはまた別症状なんだろうな。


参照
http://stackoverflow.com/questions/26494082/swift-xcode-index-freezing-or-slow
http://stackoverflow.com/questions/25537614/why-is-swift-compile-time-so-slow
「全角40文字制限」とはなにか？

# 「全角40文字制限」とはなにか？

「全角40文字制限」とはなにか？

## 全角で40文字だよ。半角も1文字としてカウントしちゃうよ？

つ `mb_strlen()`

## 80byteってことだよ。全角って半角の2倍のbyteじゃないの？（間違い）

つ `strlen()`

## 幅的に全角40文字ってことだよ。半角って全角の半分の幅ってことだよね？

つ `mb_strwidth()`
ActionBarの左上の(<)戻るボタンが上手くいかない。

画面遷移とかすると、ActionBarの左上に(<)みたいな戻るボタン出てきますよね。
設定したんですが、何故か上手くいかなくて、結構実は悩んでたので少しメモしておく。でも実際とっても簡単。

ちなみに、もしかしたら同じような些細な事で悩んでるかもしれないので、書いときます。

例えばこんな感じ。onOptionsItemSelectedの中にR.id.homeとかで書くじゃないですか。そう。僕はR.id.homeで書いてて作動しませんでした。なので、その前にandroid.R.id.home:としてみると作動する。
R.id.homeをandroid.R.id.homeにするだけ。これだけです。

```
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}
```

で、[ソフトウェア技術ドキュメントを勝手に翻訳](http://www.techdoctranslator.com/android/guide/ui/actionbar)をしっかり読ませていただきました所

>
ユーザがアイコンをタップすると、システムはアクティビティの onOptionsItemSelected() メソッドを android.R.id.home の ID を渡して呼び出します。したがって、 onOptionsItemSelected() メソッドには android.R.id.home に対してリッスンする条件を追加し、ホームアクティビティを開始したり、最近のフラグメントのトランザクションをスタックからポップして取り出すなどして、適切なアクションを実行する必要があるます。

か、書いてある。しかも普通の人は間違えないんだろうな。雑魚だな俺。

ちなみにStackOverFlowで外国の方が

>
R.layout.* are layouts you provide (in res/layout, for example).
android.R.layout.* are layouts that ship with the Android SDK.

R.layoutはお前が作ったものだし、android.R.layoutはAndroid SDKのだよって
って言ってる。(多分)

参考にしよう。
cocostudio：UIエディター

@note: ファイルが壊れる。　何度かUIアニメーションの不具合を感じていたが。プロジェクトの保存に失敗しましたが表示された場合多分どこか壊れてる。
　対応策は現在不明。仮定としては一旦閉じてバックアップから復元できればよいのではないか？

UIエディター
　UIアニメーションの制御について　困ったこと。
アニメーション付きのUIファイルを読み込む、
この時アニメーションは正常に再生される。
ノード毎削除する。
再生成して、同じUIファイルを読み込んで同じアニメーションを再生させようとすると、
　ー＞　落ちました！！
一応考えました、打開策。
シーンの開始時にシーンファイルを読み込み。
ここでUIファイルも登録・保持される。
シーン終了までノードを破棄しない。保持する。
シーンの終了時に、全解放、アクションマネージャーの登録も全削除。する。
または、
　ActionManagerEXの　_actionDic　をつぶさに制御する命令を追加する。＜＜未テスト、実際に解決するかというところは不明。

　Widgetプロパティ設定について
インタラクティブにチェックを入れるとタッチイベントが止まるので、留意されたし。
クライアントサイド：ネットワーク処理・・・

何が必要か
JSON形式
クライアントサイド
　送信・受信　シリアライズ・デシリアライズ
　JSONへのパース

* エラー 
    * エラーの種類
        * サーバーエラー
        * タイムアウト
        * 不正なデータ
    * エラー時の処理
        * エラーダイアログ表示
        * タイトルへ戻す。
        * 何もせず元の画面を表示
Yahooショッピング注文検索APIで403になる

お世話になっております。

現在、YahooショッピングAPIを使った開発をしております。テスト環境での開発も大体終わり、本番用のアプリのIDを発行してもらいました。2015/03/20に発行となります。
もらったアプリIDを元に本番環境に接続を試みた所、注文検索、注文詳細取得等の注文系APIで403のレスポンスコードが返ってきました。

注文検索では以下のような内容を送っています(SellerIdは伏せています)

接続先URL
https://circus.shopping.yahooapis.jp/ShoppingWebService/V1/orderList

送る内容
&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;Req&gt;
&lt;SellerId&gt;XXXXXXXX&lt;/SellerId&gt;
&lt;Search&gt;
&lt;Field&gt;OrderId,OrderTime,LastUpdateTime,OrderStatus,StoreStatus&lt;/Field&gt;
&lt;Result&gt;100&lt;/Result&gt;
&lt;Sort&gt;+order_time&lt;/Sort&gt;
&lt;Condition&gt;
&lt;OrderTimeFrom&gt;20150320000000&lt;/OrderTimeFrom&gt;
&lt;OrderTimeTo&gt;20150321000000&lt;/OrderTimeTo&gt;
&lt;/Condition&gt;
&lt;/Search&gt;
&lt;/Req&gt;

authorizationヘッダに、本番環境用のトークンを設定しているつもりです。

何か間違い、あるいは申請で足らないところなどがありましたらご指摘いただけないでしょうか。
よろしくお願いいたします。

2015/04/03追記
コメントでのご指摘の通り、単純に申請していないのが原因でした。アプリケーションID発行画面の文面からアプリケーションIDが発行されるのに数日かかるのかと思いきや、すぐに発行されたので、古くからあるショップなこともあり、すぐに使えるものかと勘違いしていました。

注文検索系のAPIを使うには、アプリケーションID発行後にそれと一緒に接続元IPなども申請する必要があります。IPはサブネットマスクによる指定も可能らしい。これに関しては開発の都合もあってまだ一箇所からしか接続していないので未確認です。

ある程度申請関連が落ち着いてきたので、軽く感想を書かせていただきます。

まず申請にかかる日数ですが、5日以内とあれば5日かかる印象を受けました。やりとりによってはさらに長くなります。余裕をもっておかないとかなり危ないです。

必要な申請ですが、アプリケーションIDの発行は当然として、注文情報を扱うのなら本記事でもあったようにその旨を申請をしないと使えません。

API注文情報を使うなら、証明書認証もほぼ必要です。申請が必要になります。
ちなみに証明書がないとトークンが実質12時間で無効になります。人の手で12時間毎に発行するのは現実味のない話です。トークンを発行するようなボットを作れればいいのかもしれませんが、それは非推奨なのと、きちんとボット対策が入っています。

私はYahooのショップ開発は初ということもあり、APIベースで全ていけるのかと思っていましたが、FTPによるファイルアップでの更新もかなり有効です。というより、それでないと更新できない情報もあります(APIでないと更新できない情報もあります)。もっというのならデータのチェック仕様も微妙に違っていますので、使う使わないはともかくとしてFTPのアカウントも取得したほうが無難でしょう。これも申請が必要となります。

APIのヘルプに「利用制限」の項目があり、「※短い時間の間に同一URLに大量にアクセスを行った場合、一定時間利用できなくなることもございます。（1クエリー/秒）　※大規模なサイト構築やアプリ開発等にご利用いただけるデベロッパー様や、法人様向けに、クエリー数制限/秒を解除させていただきます。（無料）」とあるので、それなりの規模のサイトだしと軽い気持ちで申請したのですが、これが落とし穴でした。本申請では１つのアプリケーションIDに対して、特定のAPIを無制限に使用できるようにするものとなります。逆にいうと、申請したAPI以外のAPIは使えなくなります。全APIを列挙して申請しても、セキュリティ上の都合ということで却下されると思われます。

なので、制限未解除のアプリIDでAPIを使いつつ、特定の処理だけを制限解除済みアプリID&APIを使う形しかありません。要するに複数のアプリケーションIDを使い分ける事を求められるわけですが、複数使い分けるぐらいなら複数のアカウントをローテーションして使うぐらいでいい気がします。1アカウントで10個のアプリケーションIDを発行できますが、1つはテスト環境用アカウントとしても残り9個を使えます。つまりx9までいけます。制限解除済みならAPIを無制限(通常は1日5万回)、且つ秒間30回ほど叩けるらしいですが、さすがにそこまでを要求するショップはそうはないでしょう。

詳しくは書けませんし、それほどのノウハウを貯めたわけでもありませんが、なにそれ？　と思ったら大体申請が必要になる雰囲気を感じられます。またそれで時間を取られます。時間がない場合はかなり厳しいことになるので、迷ったらすぐに連絡を入れたほうが無難でしょうか。もっともこの辺、売上があれば全く対応が変わってくるのかもしれません。いや、そういうものでしょう。

新規ショップ開店の方は早め早めの申請を心がけたほうがいいのではないでしょうか。
TwitterとのOAuthをmockするgemを作ってみた

## 概要

[FacebookとのOAuthをmockするgemを作ってみた](http://qiita.com/ogawatti/items/832fb4a550e04c5156dc)のTwitter版です。
**[twimock](https://github.com/ogawatti/twimock)** といいます。

twimockは以下のようにすることで、Twitterとのやりとりをmockに置き換えます。

* omniauth-twitterから叩くapi.twitter.comのAPIをsham_rackを使ってmockに
* omniauth-twitterからTwitterログイン画面へのリダイレクトを、mockの画面に

やりとりを奪えればこっちのもの。あとはtwitterとのoauthの流れに則ってtwimockがよしなにやってくれます。

## 前提

* omniauth-twitterを利用した環境
* mockではsham_rackを使っています (参考 : [sham_rack使ってみた](http://qiita.com/ogawatti/items/9cb87c3f6228e209c502))

## 使い方

[README](https://github.com/ogawatti/twimock/blob/develop/README.md)を参考にしてください！！

## twimockが具体的に何をやっているか

omniauth-twitterは、api.twitter.comと認証・リクエストトークンのやりとりを通して最終的にアクセストークン、ユーザー情報を取得します。

1. api.twitter.comにリクエストしてrequest_tokenを取得する
2. Twitterにブラウザでアクセスして認証・認可する
 * 認証・認可画面を返す
 * 認証・認可される == request_tokenとユーザー・アプリの紐付けが行われる
3. api.twitter.comにリクエストして、request_tokenを元にaccess_tokenを取得する
4. api.twitter.comにリクエストして、ユーザー情報を取得する

このうち、1,3,4をsham_rackでmockして、2で呼び出す画面やAPIをサーバーアプリのrackミドルウェアに組み込むこむことで、twitterのmockを実現しています。
1から2へのリダイレクトは、omniauth-twitterにリダイレクト先を設定できないので、twimockからモンキーパッチを当てています。

図にすると、以下のようになります。
(実際にはtwimockはサーバーアプリ内にいますが、twitterの立ち位置として描いてます。)

*図内の用語補足*

* RT : Request Token
* CK : Consumer Key
* AT : Access Token

![IMG_2901.jpg](https://qiita-image-store.s3.amazonaws.com/0/17647/5081a26f-76fd-82ba-4f9e-7ee50f1c057f.jpeg)

## 今後の展望

どこまでできるかは分かりませんが、今思いついている限りを。

* twimockアプリ認可キャンセル時の動作
 * 今はキャンセルボタンすらない
* facemockへの技術のフィードバック
 * facemock-oauthはomniauth-facebookを通過させない作りになっている
 * sham_rackを使って部分的なmockに改善
 * twimock, facemockでまったく同じコードがあるので共通化して外に出したい
* エラーケースの充実

その他、使ってみた、こういう改善がほしいなどあれば是非コメントを！
pullreqもお待ちしてます。
CentOSでMuninを使う セットアップ系のTIPS

# Munin MEMO
よく検索でひっかけるmunin関連の導入記事のメモ
半分以上自分用

## munin httpd plugin

### STEP1
* muninのhttpdプラグインの導入
* httpdのステータスを拾ってくるhttpd設定
* ステータス取得のテスト
* URL http://wankomagic.hatenablog.com/entry/2013/01/20/221102

### STEP2
* より詳しく状態が把握できるようにプラグインを追加(githubより)
* URL http://usedoor.jp/howto/web/server/munin-apache/

step2の中でwgetがうまくいかなかった場合

```
wget --no-check-certificate http://raw.github.com/munin-monitoring/contrib/master/plugins/apache/apache_status
wget --no-check-certificate http://raw.github.com/munin-monitoring/contrib/master/plugins/apache/apache_activity
wget --no-check-certificate http://raw.github.com/munin-monitoring/contrib/master/plugins/apache/apache_threads
wget --no-check-certificate http://raw.github.com/munin-monitoring/contrib/master/plugins/apache/apache_servers
wget --no-check-certificate http://raw.github.com/munin-monitoring/contrib/master/plugins/apache/apache_memmory
```

httpsを外して、--no-check-certificateを指して動かす

## munin mysql plugin

* mysql-develの導入
* muninのmysqlプラグインを導入
* muninのオプションにDB接続情報を記載
* 動作確認

http://tech.basicinc.jp/munin/2013/11/10/mysql_munin/

## muninの親子ノードごとの設定

* muninサーバー側設定
* muninノード側設定（クライアント？的な）
* つながらない時のトラブルシューティング的な何か

http://blog.layer8.sh/ja/2011/12/16/munin%E8%A8%AD%E5%AE%9A%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%AA%E3%82%B9%E3%83%88%E3%81%BE%E3%81%A8%E3%82%81/

## CentOS5系にmuninを入れる

* epelリポジトリが必要
* 導入手順の記載
* 
http://www.server-world.info/query?os=CentOS_5&p=munin




## アラート機能の設定について

いまいちやり方がわからず、いまだ設定したことのない部分
下記に、参考資料を掲載しておく。

http://castor.s26.xrea.com/blog/2007/10/19
Webフォントで複数のウェイトやスタイルを持つ書体を定義する


# Webフォントの設定


`@font-face`でフォントを指定する時、`font-family`を同じ名前にして、`font-weight`と`font-normal`を使用するフォントに合わせる。

```css
/*medium*/
@font-face {
	font-family: 'myfont';
	src: url('fonts/myfont-medium.woff') format('woff'),
			 url('fonts/myfont-medium.ttf') format('truetype');
	font-weight: 500;
	font-style: normal;
}
/*light*/
@font-face {
	font-family: 'myfont';
	src: url('fonts/myfont-light.woff') format('woff'),
			 url('fonts/myfont-light.ttf') format('truetype');
	font-weight: 300;
	font-style: normal;
}
/*bold-italic*/
@font-face {
	font-family: 'myfont';
	src: url('fonts/myfont-bold-italic.woff') format('woff'),
			 url('fonts/myfont-bold-italic.ttf') format('truetype');
	font-weight: 700;
	font-style: italic;
}
```

## 使う時

`font-family`を上記で指定したフォント名にして、`font-weight`や`font-style`の値を適時指定する。

```css
/*myfont-mediumを指定する*/
.hoge{
	font-family: 'myfont';
	font-weight: 500;
}

/*myfont-lightを指定する*/
.foo{
	font-family: 'myfont';
	font-weight: 300;
}

/*myfont-blold-italicを指定する*/
.bar{
	font-family: 'myfont';
	font-weight:700;
	font-style: italic;
}
```

### 備考

`font-weight`は`normal`か`bold`、または100〜900の数値で指定する。
数値とウェイトの関係は以下のとおり。

|数値|ウェイト|
|---|---|
|100|Thin (Hairline)|
|200|Extra Light (Ultra Light)|
|300| Light |
|400| Normal |
|500| Medium |
|600|Semi Bold (Demi Bold)|
|700| Bold |
|800|Extra Bold (Ultra Bold)|
|900|Black (Heavy)|



※下記サイトを参考にしてる
[font-weight - CSS | MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight)
FastRoute を試す

PHP のコア開発者の Nikita さんが開発しており、[Slim 3](http://docs-new.slimframework.com/objects/router/) に採用されている [FastRoute](https://github.com/nikic/FastRoute) を試してみました。ご本人の書いた[解説記事](http://nikic.github.io/2014/02/18/Fast-request-routing-using-regular-expressions.html)によると、Pux という C 言語で書かれた PHP エクステンションよりも速いとのことです。

## Composer

composer.json の内容は次のとおりです。0.4 系では PHP 5.4.0 が最小要件になっています。

```js
{
    "require": {
        "nikic/fast-route": "0.4.*"
    }
}
```

composer.json のあるディレクトリで次のコマンドを実行します。

```bash
composer install
```

## .htaccess

Silex のサーバー設定[マニュアル](http://silex-users-jp.phper.jp/doc/html/web_servers.html)のコードを利用させてもらいます。

```bash
<IfModule mod_rewrite.c>
    Options -MultiViews
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [QSA,L]
</IfModule>
```

## コード
`http://localhost/myapp/` に設置することを前提とします。

```php
require 'vendor/autoload.php';

$base = '/myapp/';
$handlers = function(FastRoute\RouteCollector $r) use($base) {
    $r->addRoute('GET', $base, 'index');
    $r->addRoute('GET', $base.'about', 'about');
    $r->addRoute('GET', $base.'user/{name}', 'user');
    $r->addRoute('POST', $base.'api/charge', 'charge');
};

// $dispatcher = FastRoute\simpleDispatcher($handlers);

$dispatcher = FastRoute\cachedDispatcher($handlers, [
    'cacheFile' => __DIR__ . '/route.cache',
    'cacheDisabled' => true
]);

$uri = $_SERVER['REQUEST_URI'];
$method = $_SERVER['REQUEST_METHOD'];
$routeInfo = $dispatcher->dispatch($method, $uri);

switch ($routeInfo[0]) {
    case FastRoute\Dispatcher::NOT_FOUND:
        echo "ページが見つかりませんでした。\n";
        break;
    case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
        $allowedMethods = $routeInfo[1];
        echo "許可されない HTTP リクエストです。\n";
        break;
    case FastRoute\Dispatcher::FOUND:
        $handler = $routeInfo[1];
        $vars = $routeInfo[2];
        echo $handler($vars);
        break;
}

function index($vars)
{
    return "トップページです。\n";
}

function about($vars)
{
    return "このサイトに関するページです。\n";
}

function user($vars)
{
    return "{$vars['name']} さん、こんにちは。\n";
}

function charge($vars)
{
   if (!isset($_POST['amount'])) {
       return "金額が入力されていません。\n";
   }
   if (500 > $_POST['amount']) {
       return "寄付金は500円以上からお願いします。\n";
   }

   return "寄付していただきありがとうございました。\n";
}
```

## ページの表示の確認

curl で HTTP リクエストを送信してみましょう。まずは GET リクエスト対応のトップページからです。

```bash
curl http://localhost/myapp/
```

次は POST リクエストのページです。

```bash
curl http://localhost/myapp/api/charge -F amount=500
```
[Rails4] wheneverを使ってcrontabを管理して、cronを回すとzsh:1: command not found: bundleと出る場合

[これ](http://qiita.com/tsumekoara/items/68d9b2bb816fc32138dd)の続きです

# rbenvなどのパスを追加

```rb:config/schedule.rb
env :PATH, ENV['PATH']
job_type :rbenv_rake, %q!eval "$(rbenv init -)"; cd :path && :environment_variable=:environment bundle exec rake :task --silent :output!
```

# 反映

```rb
$ whenever --update-crontab
```
log4netでログにプロセス番号を出力する

log4netにはデフォルトでプロセス番号をログに出すようなパターン名が無い。
log4netのプロパティを用いて出力することとなる。

まず、ログを初めて出力する行より前の領域にて、log4netのプロパティにプロセス番号を設定する。
ここでは、`pid`をキーとしてプロセス番号を設定する。

```csharp
    static void Main()
    {
      // プロセス番号をlog4netのプロパティに設定する。
      // このプロパティをログ出力設定ファイルにて指定する。
      log4net.GlobalContext.Properties["pid"] = System.Diagnostics.Process.GetCurrentProcess().Id;

      logger.Info("Program starts");

```

ログ出力設定ファイルにて、パターン名`%property`(`%P`も可)にて、上で設定したキーを指定する。

```xml:log4net.xml(抜粋)
<ConversionPattern value="%date [%property{pid}] [%-5level] (%method) - %message%n" />
```

```text:出力例
2015-03-20 19:24:01,990 [5288] [INFO ] (Main) - Program starts
```

* 5288がプロセス番号
Stylusで文字列を結合する

ここの参考コードをそのまま引用して補足を入れる。

http://codepen.io/Ash/pen/Exvzf 

```
foo = 'bar'
bat = 'baz'

.{foo}{bat}
  &:after  
    content foo + bat
```

- セレクタ名で結合する時は `{}` で埋め込む
- スタイル値で結合する時は `+` を使う
- `'` で括って宣言する

もし、`foo + bat` 部分に文字列リテラルを使いたい場合は、ここでも `'` で括ります

```
    content 'foo-' + bat + '-baz'
```
OSXでmp4動画の分割

mp4ファイルをmp4ファイルに分割する時は、MPEG Streamclip を使うと便利。

# アプリのインストール

http://www.squared5.com/ から MPEG Stremaclip をダウンロードして、適当なフォルダに展開する

# 分割方法

正しくは、「分割」ではなく「切り出し」を何回か繰り返すことで分割を行う。

切り出しをする時に行うのは、以下の手順

1. 切り出しの開始地点で[cmd]+[K]を押して、近くのキーフレームに移動
2. [I]キーを押して、INポイント(切り出しの開始点)を設定
3. 切り出しの終了地点まで移動
4. [cmd]+[K]を押して、近くのキーフレームに移動
5. [O]キーを押して、OUTポイント(切り出しの終了点)を設定
6. [cmd]+[S]キーを押して、INポイント〜OUTポイントを範囲の動画を保存(ダイアログが出るので、任意のパスに、任意のファイル名をつける)
7. [Shift]+[O]を押して、OUTポイントに移動する
8. [I]キーを押して、次の切り出しのINポイントとして設定する
9. (3)に戻って繰り返し
Pythonicに sum of square を返す表現の歴史を振り返る


# History of sum of square


## 1990: Basic Python

```python
result = []
for i in range(n):
    s = i * i
    result.append(s)
print sum(result)

```

## 2000: List Comprehensions
[PEP202](https://www.python.org/dev/peps/pep-0202/)

```python
print sum([i * i for i in range(n)])
```


## 2001: Generators
[PEP255](https://www.python.org/dev/peps/pep-0255/)

```python
def squares(n):
    for i in xrange(n):
        s = i * i
        yield s
print sum(squares(n))
```


## 2004: Generator Expressions 
[PEP289](https://www.python.org/dev/peps/pep-0289/)

```python
print sum(i * i for i in xrange(n))
```
knife sshでのchef-clientの実行は--no-colorの方が見やすい

# colorオプションについて

> --[no-]color                 Use colored output, defaults to false on Windows, true otherwise

Linux等ではデフォルトで--colorオプションがtrueになるようだが、これでWorkstationからknife ssh経由でchef-clientを実行したら変更点がわかりづらい。

# --colorの場合

`knife ssh "name:test-web01" "chef-client -W" --color`

![color.jpg](https://qiita-image-store.s3.amazonaws.com/0/57615/fb1b92ae-4fa0-8c21-daf5-73d7826816d8.jpeg)

変更点がわかりづらい。

# --no-colorの場合

`knife ssh "name:test-web01" "chef-client -W" --no-color`

![nocolor.jpg](https://qiita-image-store.s3.amazonaws.com/0/57615/a7137b36-581e-db34-1995-1c7666986f8f.jpeg)

変更点がわかりやすい。
Project Euler 48

問題
---
次の式は, `1**1 + 2**2 + 3**3 + ... + 10**10 = 10405071317` である.

では, `1**1 + 2**2 + 3**3 + ... + 1000**1000` の最後の10桁を求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2048

回答
---
generatorとsumで終了。一応最後の10桁らしいので、途中、`10**10`で割るよう配慮してみたが、どれくらい変わるのかは謎である。

```py
# coding: utf-8

def main():
    MAX = 1000
    DIV = 10**10
    print sum((i**i) % DIV for i in range(1,MAX+1)) % DIV
main()
```
[Rails4] wheneverを使ってcrontabを管理して、cronを回す

Rails4のプロジェクトを動かしているさくらvpsでcronを回すことになりまして、wheneverをつかってみたので、そのメモです。

# Install

```rb:Gemfile
gem 'whenever', :require => false
```

# Make config file

```rb
$ wheneverize .
---
[add] writing `./config/schedule.rb'
[done] wheneverized!
```

# Write config

## 設定の方法

[Github](https://github.com/javan/whenever)

[酒と泪とRubyとRailsと](http://morizyun.github.io/blog/whenever-gem-rails-ruby-capistrano/)

### 今回は使った設定

* ログファイル

```rb
set :output, {:error => 'log/error.log', :standard => 'log/cron.log'}
```

* シェル、コマンド設定

```rb
set :job_template, "/bin/zsh -l -c ':job'"
```

* 環境

```rb
set :environment, :development
```

* 日時指定

```rb
every '0 0 27-31 * * ' do
  rake "keihiseisan:please"
end
```

* 曜日ごと

```rb
every :monday, :at => '10am' do # Use any day of the week or :weekend, :weekday
  command "echo '朝会やるよー'"
end
```

* 5分ごと

```rb
every 5.minutes do
  runner "Welcome.test"
end
```

# Register

## save, update

```rb
$ whenever --update-cron
```

## confirm

```rb
$ whenever

or

$ crontab -e
```

## delete

```rb
$ whenever --clear-cron
```

# Troubleshooting

## command not found: bundleと出る場合

http://qiita.com/tsumekoara/items/c85ca362066bf5bf61cc

# References

[Github](https://github.com/javan/whenever)

[酒と泪とRubyとRailsと](http://morizyun.github.io/blog/whenever-gem-rails-ruby-capistrano/)
windows環境でのvirutalenvwrapper

pythonはライブラリが非常に充実している上，`pip`や`easy_install`などのコマンドで自分の使いたいライブラリを
簡単にインストールすることができます．
しかし，何も考えずにライブラリをインストールしまくると，
自分が動かしているプログラムにどのライブラリが必要なのか分からなくなったり，
ライブラリ間の依存関係の問題でアップデートしたら動かくなったりと，悲しいことになります．
幸いなことに，pythonにはこの問題を解決するためのプログラムであるvirtualenvと，
それを使いやすくしてくれるvirtualenvwrapperというプログラムがあります．

このページではwindows上でpythonを動かす場合のvirtualenvwrapperのinstall方法，使い方を紹介します．
pythonのinstallについては[こちら](http://qiita.com/maisuto/items/404e5803372a44419d60 "windows環境へのpythonインストール")を参考にしてください．

# virtualenvwrapperのinstall

コマンドプロンプトを起動し，`pip install virtualenvwrapper-win` と打つと
virtualenvと，windows用のvirtualenvwrapperがinstallされます．
![スクリーンショット 2015-03-20 17.12.54.png](https://qiita-image-store.s3.amazonaws.com/0/58048/3967a865-5329-75e1-0099-cf8e90a08f91.png)

実行しようとして下記のようなメッセージが出た人は，PATHが通っていないか，pythonライブラリがちゃんとイントール出来ていない可能性があります．

```
'pip'は，内部コマンドまたは外部コマンド，
動作可能なプログラムまたはバッチ ファイルとして認識されていません．
```

# 新しい環境の作成

環境を作る，切り替えると言っても，何のことかよくわからないと思います．
まずはコマンドプロンプトで `pip freeze` って打ってみましょう．
installしたばかりの方だと，たぶん `virtualenv` と `virtualenvwrapper-win` の2つだけが表示されるはずです．
ちなみに`==`の後ろの数字はそのライブラリのバージョン番号を表しています．
![スクリーンショット 2015-03-20 17.46.58.png](https://qiita-image-store.s3.amazonaws.com/0/58048/1cc9ca5e-b73a-e228-c2f4-4bd7771782d9.png)

では新しい環境を作成してみましょう．
環境の作成は `mkvirtualenv envname` です． *envname*は好きな名前を入れてください．
例では`myproject`という名前にしています．
![スクリーンショット 2015-03-20 17.13.33.png](https://qiita-image-store.s3.amazonaws.com/0/58048/f02fba47-40cf-8f95-9300-68721a201732.png)

コマンドを実行すると，環境を作成した上で，その環境が有効化（アクティベート）されます．
仮想環境がアクティベートされている場合は，コマンドプロンプトのいつもの表示の左側に (*envname*) と表示されます．

(*myproject*)環境では，まだライブラリを何もインストールしていないため， `pip freeze` を打っても何も表示されません．
![スクリーンショット 2015-03-20 18.01.59.png](https://qiita-image-store.s3.amazonaws.com/0/58048/8683a75c-c882-5e75-8ed4-0a9ffe16cc8e.png)

なお，windowsの場合（virtualenvwrapper-winを使った場合）は，以下の位置に仮想環境が作成されます．
C:\Users\ *username* \Envs\ *envname*

# 使い方まとめ
| コマンド    | 効果 | 注釈 |
|:----------|:------------:|:--:|
|mkvirtualenv *envname*| 新しい環境の作成| 環境作成後，その環境がアクティベートされる|
|workon | 環境一覧表示 | |
|workon *envname* | *envname*の環境をアクティベート ||
|deactivate | 仮想環境から抜ける | 仮想環境に入っていない場合は無効 |
[小ネタ]RailsのScaffoldテンプレートを上書きするススメ

管理画面作る時にrails\_adminとかactiveadminを使いたくなるかもしれないがグッと堪えてscaffoldベースで作る方が基本的にマシなのでは無いかと思う。
bootstrapなりfoundationなりのフレームワークに合わせた見た目が欲しいなら、テンプレートを上書きすればいい。

Railsは`#{Rails.root}/lib/templates/#{template engine}/scaffold/index.html.haml`って感じのファイルを置いておくとコードジェネレーションの時にそちらを利用するようになっている。
simple\_formなんかはそれを利用してデフォルトのformテンプレートを置き換える機能がある。

ちなみに元のテンプレートはerbなら`railties/lib/rails/generators/erb/scaffold/templates/`にある。
hamlの場合はhaml-railsの`lib/generators/haml/scaffold/templates/`に入っている。
これをコピってきて適当に弄ると良い。

controllerのテンプレートなんかも上書きしておけば、最初からkaminari適用済みとか調整できる。
scaffold\_controllerのテンプレのオリジナルは`railties/lib/rails/generators/rails/scaffold_controller/templates/controller.rb`

もうちょっとちゃんと頑張るならlib以下にプロジェクト用のgeneratorを書いておいとくのが良いと思う。
Railsのgeneratorはthorを使ってるんで、APIの詳細を知りたい時は[erikhuda/thor](https://github.com/erikhuda/thor "erikhuda/thor")のドキュメントも合わせて読むのが良い。
取り急ぎEC2にLAMP環境を構築する(AWS公式)


とりあえず以下を打っておけばOK!!!

```
$ sudo yum update -y
$ sudo yum groupinstall -y "Web Server" "MySQL Database" "PHP Support"
$ sudo yum install -y php-mysql
$ sudo service httpd start
$ sudo chkconfig httpd on
$ chkconfig --list httpd
$ sudo groupadd www
$ sudo usermod -a -G www ec2-user
$ exit
$ groups
ec2-user wheel www
$ sudo chown -R root:www /var/www
$ sudo chmod 2775 /var/www
$ find /var/www -type f -exec sudo chmod 0664 {} +
$ yum list installed php
$ sudo yum install -y php
$ sudo service httpd restart
$ sudo service mysqld start
$ sudo mysql_secure_installation
$ sudo service mysqld stop
$ sudo chkconfig mysqld on
```

[チュートリアル: Amazon Linux への LAMP ウェブサーバーのインストール](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/install-LAMP.html)
cocos2d-x　Node衝突判定、、、SpriteもOK

タッチした座標を得る場合。
タッチコールバックの引数　Touch　より、
touch−>getLocation()により座標を取得


ノードが持っているバウンディングボックスを取得
rect = node.getBoundingBox()

点：面
rect.containsPoint（pos）

面：面
rect.intersectsRect（rect_2）


座標変換について
ワールド座標を得る。
Node* node;
 node->getNodeToWorldTransform();

特定のノード原点に対する相対座標を得る場合。（指定のノードの位置座標を原点とするパターン）
        convertToNodeSpace(touch->getLocation())
child->getBoundingBox().containsPoint(convertToNodeSpace(touch->getLocation()))
ElasticCacheを使ってELBに共用キャッシュサーバーを立てる


これがやりたい。
![image1 (2).JPG](https://qiita-image-store.s3.amazonaws.com/0/18614/74c93a5d-2b50-ea65-063c-132f781c1247.jpeg "image1 (2).JPG")


2つのWebサーバーで共用するキャッシュサーバーの建て方をかんたん解説。


# 前提
- 2台のEC2インスタンスは立てている
- ELBにEC2をひもづけ済み

# 手順

## 1.ElasticCacheでMemcachedサーバーを立てる

AWSのコンソール画面ヘッダーのServicesからからElasticCacheを選択し、以下のボタンをクリック。

![スクリーンショット 2015-03-20 17.43.45.png](https://qiita-image-store.s3.amazonaws.com/0/18614/f24662f2-4aa6-4e22-d2c8-d5235ae76841.png "スクリーンショット 2015-03-20 17.43.45.png")


### キャッシュエンジン

Memcachedを選択し、Nextをクリック。

![スクリーンショット 2015-03-20 17.34.03.png](https://qiita-image-store.s3.amazonaws.com/0/18614/7459ccee-1757-89c5-9090-5932db5af024.png "スクリーンショット 2015-03-20 17.34.03.png")


### クラスタ構成の設定

![スクリーンショット 2015-03-20 17.35.20.png](https://qiita-image-store.s3.amazonaws.com/0/18614/12b250e1-f484-9bd2-eee1-26da2ccf6443.png "スクリーンショット 2015-03-20 17.35.20.png")

いじるのはNodeTypeとClusterNameとNumberofNodesの３つ。

Cluster Name: 適当に。
NodeType: キャッシュサーバーの大きさ。わからなければとりあえずmicroで。
Number of Nodes: ノード数の指定。これを増やせば対象外性を向上させたり、パフォーマンス向上のためのスケールアウトを実行することが可能。


### さらに設定

![スクリーンショット_2015-03-20_17_35_32.png](https://qiita-image-store.s3.amazonaws.com/0/18614/d8f80055-19f1-3728-37bf-73983194ca5b.png "スクリーンショット_2015-03-20_17_35_32.png")

VPC Security Group(s): EC2と同じセキュリティグループを設定する。


<b>※EC2のセキュリティグループで11211ポートを設定しておく。</b>


![スクリーンショット 2015-03-20 17.51.48.png](https://qiita-image-store.s3.amazonaws.com/0/18614/69470ecf-b95e-bac7-fa88-66ae712ef74d.png "スクリーンショット 2015-03-20 17.51.48.png")

以上で設定完了。

#### Configuration Endpointの項目をあとで使うのでメモっておく。

![スクリーンショット_2015-03-20_17_53_15.png](https://qiita-image-store.s3.amazonaws.com/0/18614/e29ed009-d8f7-0a34-ae71-d72cf47744a7.png "スクリーンショット_2015-03-20_17_53_15.png")



## 2.サーバーにMemcachedをインストール

以下の手順は２つのEC2インスタンス両方で行う。

### Memcachedのインストール

#### root権限に変更

```
$ sudo su
```


#### インストール

```
# yum install memcached php-pecl-memcached
```

#### 自動起動設定＆起動

```
# chkconfig memcached on
# service memcached start
```

### PHP設定の変更
PHPの設定ファイルと、Memcachedの設定ファイルそれぞれを下記のように設定する。

```
# vi /etc/php.ini
; session.save_handler = files // コメントアウト
; session.save_path = "/var/lib/php/session" // コメントアウト

# vi /etc/php.d/memcached.ini
session.save_handler = memcached // コメントアウトをはずす
session.save_path = hoge.xxxxxx.0001.xxxx1.cache.amazonaws.com:11211" // 追記
```

※session.save_pathの値はElasticCacheの管理画面のエンドポイントを記述する。


#### httpd再起動

```
# service httpd restart
```

以上で使えるはず。