OmniAICreator/Qiita-1.07M huggingface dataset:
Apache POI でExcelのセルの内容（テキスト・画像）を取得する

JavaでMicrosoft Officeの各種ファイルを扱う場合は [Apache POI](http://poi.apache.org/) を使います。
今回はExcelのセルの内容を取得するサンプルを調べました。

# セルのテキストを取得

`Sheet` クラスが `Iterable<Row>` を実装しているので拡張for文で1行ずつなめつつ `CellReference#formatAsString()` でテキストを取得。

```java
    // import org.apache.poi.ss.usermodel.*;

    Sheet sheet1 = wb.getSheetAt(0);
    for (Row row : sheet1) {
        for (Cell cell : row) {
            CellReference cellRef = new CellReference(row.getRowNum(), cell.getColumnIndex());
            System.out.print(cellRef.formatAsString());
            System.out.print(" - ");

            switch (cell.getCellType()) {
                case Cell.CELL_TYPE_STRING:
                    System.out.println(cell.getRichStringCellValue().getString());
                    break;
                case Cell.CELL_TYPE_NUMERIC:
                    if (DateUtil.isCellDateFormatted(cell)) {
                        System.out.println(cell.getDateCellValue());
                    } else {
                        System.out.println(cell.getNumericCellValue());
                    }
                    break;
                case Cell.CELL_TYPE_BOOLEAN:
                    System.out.println(cell.getBooleanCellValue());
                    break;
                case Cell.CELL_TYPE_FORMULA:
                    System.out.println(cell.getCellFormula());
                    break;
                default:
                    System.out.println();
            }
        }
    }
```

# 特定のセルに設置された画像の取得

~~`CTDrawing` オブジェクトに画像のアンカー情報がセルの座標で記録されてるが、内部APIを使わないと取得できないので、`XSSFWorkbook#getAllPictures()` のソース http://git.io/mKdmpw を参考に以下のように CTDrawing オブジェクトをなめる処理を書く。~~


やってみたら `CTDrawing#getTwoCellAnchorList()` がNoClassFoundErrorとかで全然動かない。
半ばキレ気味に調査した結果、`XSSFDrawing#getShapes()` で *XSSFShape* オブジェクトを取得して *XSSFPicture* クラスにキャストすると座標がとれることが分かった。
ただし Apache POI 3.9 以降でないと使えない。

```java
// シートに添付されている画像を収集
for (POIXMLDocumentPart dr : ((POIXMLDocumentPart) sheet).getRelations()) {
    if (dr instanceof XSSFDrawing) {
    	XSSFDrawing xfd = (XSSFDrawing)dr;
        for (XSSFShape shape : xfd.getShapes()){
            if (shape instanceof XSSFPicture) {
                XSSFClientAnchor xca = ((XSSFPicture) shape).getPreferredSize();
                // 画像が設置されているセルの左上座標を取得
                int row = xca.getRow1();
                int col = xca.getCol1();
            }
        }
    }
}
```

# 余談

POI は *Poor Obfuscation Implementation* (質の悪い難読な実装) の略とのこと。
また HSSF は *Horrible Spread Sheet Format* (ひどい表計算フォーマット) とのことで、ネーミングに邪念を感じる。

# リンク

Busy Developers' Guide to HSSF and XSSF Features
http://poi.apache.org/spreadsheet/quick-guide.html

APIドキュメント
http://poi.apache.org/apidocs/
Unity5 Canvasの中に対してブラーとか使うとき（修正版）

**●Assets->Import Package->Effects**でパッケージをインポートしておく


**●GameObjectの構成を下記のようにする。**

　Main Camera->Canvas->GameObject

**●各オブジェクトの説明**
・Main Camera：
　　Cameraオブジェクトを設定、**Blurスクリプト**をここに追加
・Canvas：
　　①Canvasオブジェクトが設定されていて、**RenderMode**を
　　　**Screen Space - Overlay**から**Screen Space - Camera**にする。
　　②**Render Camera**を上記のMain Cameraにする
・GameObject：
　　**Raw Image・Image**等の表示したいものを貼り付ける。

**※Blurスクリプトを有効にした時**


![スクリーンショット 2015-03-02 23.18.02.png](https://qiita-image-store.s3.amazonaws.com/0/17904/cc39a614-5b7c-ca4c-2815-42dea8ee8eef.png)

**※Blurスクリプトを有効にしない時**

![スクリーンショット 2015-03-02 23.18.41.png](https://qiita-image-store.s3.amazonaws.com/0/17904/abf894cf-d66a-f9ff-87ca-29f7139f56a7.png)
タプルの配列、への append が失敗する

```swift
var arr: [(firstname: String, lastname: String?)] = []
```

という配列があったとしよう。

```swift
arr.append(firstname: "taro", lastname: nil)
println(arr)
// output: [(taro, nil)]
```

これは問題なく通る。

なのに、String を指定するとエラーになる:

```swift
arr.append(firstname: "taro", lastname: "yamada")
```

```
repl.swift:5:11: error: type 'T' does not conform to protocol 'IntegerLiteralConvertible'
arr.append(firstname: "taro", lastname: "yamada")
```

`+=` でももちろんダメ:

```swift
arr += [(firstname: "taro", lastname: "yamada")]
```

```
repl.swift:5:1: error: '[(firstname: String, lastname: String?)]' is not identical to 'UInt8'
```

だいたい `UInt8` って...

初期化だとどうかなとやってみると、

```swift
var arr1: [(firstname: String, lastname: String?)] = [(firstname: "hanako", lastname: "suzuki")]
println(arr1)
// output: [(hanako, Optional("suzuki"))]
```

通るじゃないか。ん? `Optional` ... もしや...

```swift
arr.append(firstname: "taro", lastname: Optional("yamada"))
println(arr)
// output: [(taro, nil), (taro, Optional("yamada"))]
```

そういうことか！

ちなみに as してもいけた

```swift
arr += [(firstname: "hanako", lastname: "suzuki") as (firstname: String, lastname: String?)]
```
DefaultVPC以外に自分でVPCを作成してみる

初投稿です。
自分で作る際のメモ的な意味も多分に含んでいます。

---

先日ソリューションアーキテクト・アソシエイトの試験を終え、なんとなーくですがawsってなんぞってわかるようになってきたので、弄った内容をいろいろと書いていけたらなと思っています。


##やること
マネジメントコンソールからDefault以外のVPCを作成してみたいと思います。
今回はこんな感じのを作成します。![150302-0002.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/cb7cd20c-c0ab-141f-9660-f4bdf52f7988.jpeg)

外部通信可能なpublicサブネットを１つと外部との通信手段を持たないprivateサブネットを１つ作ってみます。

---
AWSにログインして下部のVPCを選択します![150302-0005.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/0f5ab93f-1c8d-a213-6317-ae676b715dec.jpeg)

画面上部のStart VPC Wizardを選択
![150302-0004.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/012e78ad-0ea5-bb35-856f-4bbca50683cd.jpeg)

一番上のpublicサブネットを一つ作る奴を選択して作成ボタンを押します。
全部手動で作ったり２番目のprivateとpublicとNATインスタンスを作成してくれるのでも良いのですが今回はこれにします（楽なので）。
![150302-0006.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/18bf53b8-0ec4-6b3e-7e95-dd4b39dee5fe.jpeg)

CIDRやVPCの名前サブネットに関する情報を記入します。
VPCのCIDRは/16
サブネットは/24の範囲で作成します。
サブネットはVPCの範囲を超えて作成することはできません。
![150302-0007.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/de8d75c4-9bff-10b5-35df-b720d743f497.jpeg)
ちなみに、CIDR範囲がかぶっても検証上は問題はないですが、VPN接続をする際に不具合が生じる的な理由で公式的には複数のVPCで同じ範囲を使用することは推奨されていないようです。

CIDR•••デフォルトのまま
VPCname•••VPC01
publicsubnet・・・デフォルトのまま
AZ・・・デフォルトのまま（単一のAZで作成するので）
Subnet name・・・デフォルトのまま
Enable DNS hostname・・・デフォルトのまま
　→インスタンスにDNS名をつけれるかどうかです。
　　yes/No両方やって挙動の違いを確かめてください。NoにするとDNS名出ません（今回はYesにします）。

Hardware tenancy・・・デフォルトのまま
　→ハードウェア占有インスタンスの設定です。検証ならまあ使うことはないはず・・・
設定したらブルーのボタンで自動的にVPCが作成されます。

![150302-0008.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/07293708-316a-e019-0c19-a42913da1d7a.jpeg)

名前を設定しておくと識別がしやすくなるので管理がしやすくなります。

![150302-0009.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/c442726f-f9de-b2b0-ec82-e7f1af17dab4.jpeg)

publicサブネットを作成としたのでigwが作成されています
publicサブネットというのはサブネットにigwをアタッチしてiwgに対して全てのトラフィッックを流す（0.0.0.0/0）サブネットをいいます。
逆に、igwをアタッチしないインスタンスをprivateサブネットといいます。

![150302-0010.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/ecf09eff-af88-0757-df8f-cc81d8e97bcf.jpeg)

実際にサブネットのルートテーブルを確認するとigwがアタッチされています。
サマリータブを選択してパブリックサブネットのAZを確認しておきましょう。

---
#####privateサブネットの作成
先ほどの画像の上部クリエイトサブネットを押下します。![150302-0011.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/232b8312-5520-6700-4929-925f47fc76cc.jpeg)
名前はprivate subnet
VPCは先ほど作成したものを選択してください
AZはパブリックサブネットと同一の物を選択
CIDRは10.0.1.0/24としました。VPCの範囲内かつ他のサブネットと被らない範囲で選択すればOKです（第三オクテットの数字変えておけば大丈夫です）。

NATインスタンス経由でアウトバウンド通信のみ許可するサブネットを作成するときはこの手順に加えてルートテーブルのルールでtargetにnatインスタンスを指定したルールを追加してあげれば作成できます。

---
以上でVPCとサブネットの作成が完了しました。
privateとpublic間で通信するときはSGに相手のSGをソースで許可する設定を加えてあげれば通信をすることができます（DefaultVPCはデフォルトでできるようになってます）

今後もこんな感じでヌルヌル書いて行こうと思います。


---
####参考
公式ドキュメントや以下のサイトを主に参考にしました
http://recipe.kc-cloud.jp/archives/470
http://dev.classmethod.jp/cloud/aws/minimum-amazon-vpc-server-environment/
Project Euler 30

問題
---
驚くべきことに, 各桁を4乗した数の和が元の数と一致する数は3つしかない.

`1634 = 1**4 + 6**4 + 3**4 + 4**4`
`8208 = 8**4 + 2**4 + 0**4 + 8**4`
`9474 = 9**4 + 4**4 + 7**4 + 4**4`
ただし, `1=1**4`は含まないものとする. この数たちの和は `1634 + 8208 + 9474 = 19316` である.

各桁を5乗した数の和が元の数と一致するような数の総和を求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2030

回答
---
手首の運動。

```py
def main():
  MAX = (9**5)*6+1
  ls = [x**5 for x in range(10)]
  ans = 0
  for num in range(2,MAX):
    wa = sum(map(lambda x: ls[int(x)], str(num)))
    if wa == num:
      ans += num
  print ans
  
main()
```
Project Euler 29

問題
---
`2 ≤ a ≤ 5` と `2 ≤ b ≤ 5` について, `a**b` を全て考えてみよう:

`2**2=4, 2**3=8, 2**4=16, 2**5=32`
`3**2=9, 3**3=27, 3**4=81, 3**5=243`
`4**2=16, 4**3=64, 4**4=256, 4**5=1024`
`5**2=25, 5**3=125, 5**4=625, 5**5=3125`
これらを小さい順に並べ, 同じ数を除いたとすると, 15個の項を得る:

4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125

`2 ≤ a ≤ 100` と `2 ≤ b ≤ 100` で同じことをしたときいくつの異なる項が存在するか?
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2029

回答
---
しいて言えばリスト内包表記の練習？かな？

```py
def cof():
  seq = range(2,101)
  ans = len(set([x**y for x in seq for y in seq]))
  print ans
```
gistをコマンドラインで使ってみる



## 概要

### 環境

- Mac OS X Yosemite 10.10.2


## 準備

### インストール

```bash
$ brew install gist
```

### ログイン

```bash
$ git --login
```


## 使う

Prefix.pchをgistに登録する場合のサンプル

```bash
$ gist -o -f Prefix.pch -d "for Cocos2d-x iOS Project" < Prefix.pch

-f 名前の設定
-d 説明の設定
-o push後にブラウザで開く
```


## 参考

- [コマンドラインからgistに投稿する](http://saku-na63.hatenablog.com/entry/2013/10/03/220921)
Project Euler 28 非効率的回答案　「螺旋状に並んだ数」を作成する

問題
---
1から初めて右方向に進み時計回りに数字を増やしていき, 5×5の螺旋が以下のように生成される:

21	22	23	24	25
20	7	8	9	10
19	6	1	2	11
18	5	4	3	12
17	16	15	14	13
両対角線上の数字の合計は101であることが確かめられる.

1001×1001の螺旋を同じ方法で生成したとき, 対角線上の数字の和はいくつか?

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2028

回答
---
久しぶりに燃えた問題。
n*2 + a*n + b
的な公式に当てはめた回答もできるけど、ここは効率悪く「螺旋状に並んだ数」を作成してみることとした。

螺旋状に並んだ数は、次のルールで作られる。
・前回が上方向への移動であった場合‥右があいていれば右、右があいていなければ上
・前回が下方向への移動であった場合‥左があいていれば左、左があいていなければ下
・前回が右方向への移動であった場合‥下があいていれば下、下があいていなければ右
・前回が左方向への移動であった場合‥上があいていれば上、上があいていなければ左

あとは、このルールをコードに落とし込めばらせん状に並んだ数を再現することが出来る。
度の処理を関数化するなどが残といったところだろうか。

```py
UPPER = 'upper'
UNDER = 'under'
RIGHT = 'right'
LEFT  = 'left'

def nextupper(domain,i,j):
  return (UPPER,i-1,j)
  
def nextunder(domain,i,j):
  return (UNDER,i+1,j)

def nextright(domain,i,j):
  return (RIGHT,i,j+1)
  
def nextleft(domain,i,j):
  return (LEFT,i,j-1)
  
def nowupper(domain,i,j):
  if domain[i][j+1]:
    return nextupper(domain,i,j)
  else:
    return nextright(domain,i,j)

def nowunder(domain,i,j):
  if domain[i][j-1]:
    return nextunder(domain,i,j)
  else:
    return nextleft(domain,i,j)

def nowright(domain,i,j):
  if domain[i+1][j]:
    return nextright(domain,i,j)
  else:
    return nextunder(domain,i,j)

def nowleft(domain,i,j):
  if domain[i-1][j]:
    return nextleft(domain,i,j)
  else:
    return nextupper(domain,i,j)

def next(domain,drct, i, j):
  if drct == UPPER:
    return nowupper(domain,i,j)
  elif drct == UNDER:
    return nowunder(domain,i,j)
  elif drct == RIGHT:
    return nowright(domain,i,j)
  else:
    return nowleft(domain,i,j)
  
def cof():
  #MAX = 5
  MAX = 1001
  START = MAX//2
  seq = range(MAX)
  
  domain = [[0 for i in seq] for j in seq]
  v = 1
  (drct, i, j) = (UPPER,START,START)
  while i < MAX and j < MAX:
    domain[i][j] = v
    (drct, i, j) = next(domain, drct, i, j)
    v += 1
    
  #for i in seq: print domain[i]
  
  ans = 0
  for m in seq:
    ans += domain[m][m]
  for m in seq:
    ans += domain[m][MAX-m-1]
  ans -= domain[START][START]
  print ans
  
cof()
```
Project Euler 27

問題
---
オイラーは以下の二次式を考案している:

`n**2 + n + 41`.
この式は, n を0から39までの連続する整数としたときに40個の素数を生成する. しかし, n = 40 のとき `40**2 + 40 + 41` = `40(40 + 1) + 41` となり41で割り切れる. また, n = 41 のときは `41**2 + 41 + 41` であり明らかに41で割り切れる.

計算機を用いて, 二次式 `n**2 - 79*n + 1601` という式が発見できた. これは n = 0 から 79 の連続する整数で80個の素数を生成する. 係数の積は, -79 × 1601 で -126479である.

さて, |a| < 1000, |b| < 1000 として以下の二次式を考える (ここで |a| は絶対値): 例えば |11| = 11 |-4| = 4である.

`n**2 + a*n + b`
n = 0 から始めて連続する整数で素数を生成したときに最長の長さとなる上の二次式の, 係数 a, b の積を答えよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2027

回答
---
言われるままに全文検索。おそらくよくないんだろうな。
なお、mymathはこちら
http://qiita.com/cof/items/45d3823c3d71e7e22920

```Py
import mymath

def f(n,a,b):
  return n**2 + a * n + b 

def cof():
  P_MAX = 10 ** 6
  pri = mymath.get_primes(P_MAX)
  max_n = 0
  ans = 0
  seq = range(-1000,1001)
  for a in seq:
    for b in seq:
      n = 0
      while pri['bool'][f(n,a,b)]:
        n += 1
      if n > max_n:
        max_n = n
        ans = a*b
  print ans
```

遅いこと山の如し。
Project Euler 26

問題
---
単位分数とは分子が1の分数である. 分母が2から10の単位分数を10進数で表記すると次のようになる.

1/2 = 0.5
1/3 = 0.(3)
1/4 = 0.25
1/5 = 0.2
1/6 = 0.1(6)
1/7 = 0.(142857)
1/8 = 0.125
1/9 = 0.(1)
1/10 = 0.1

0.1(6)は 0.166666... という数字であり, 1桁の循環節を持つ. 1/7 の循環節は6桁ある.

d < 1000 なる 1/d の中で小数部の循環節が最も長くなるような d を求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2026

回答
---
(1) 1/d の小数部の循環節の長さは、dが10^n-1を割り切る最小のnである点。
(2) 2,5等の因子は小数部の循環説の長さに寄与しない点。
の2点を前提(補足参照)に以下のコードを書いた。
get_prime_boolean, get_prime_listm get_primesの三点はmymathに収容しているので、そっちを参照してもよい。

コード
---

```py
def get_prime_boolean(max):
    bool = [False,False]+[True]*(max-1)
    bool[4::2] = [False] * (len(bool[4::2]))
    p = 3
    p_max = int(math.sqrt(max))+1
    while p<=p_max:
        if bool[p]:
          bool[p*2::p] = [False] * (len(bool[p*2::p]))
        p+=2
    return bool

def get_prime_list(bool):
    length = len(bool)
    return [i for i in range(2,length) if bool[i]]

def get_primes(max):
    bool = get_prime_boolean(max)
    list = get_prime_list(bool)
    return {'bool':bool,'list':list}

def pe26():
  MAX = 1000
  seq = range(MAX)
  ans = seq[3::10] + seq[7::10] + seq[9::10] + seq[11::10]
  t = 9
  while len(ans) > 1:
    i = 0
    while i < len(ans):
      if (t%ans[i]) == 0:
        ans.pop(i)
      else:
        i += 1
    t = t*10 + 9
  print ans[0]
  import math
  print math.log(t,10)

pe26()
```
UITabBarControllerの子としてUINavigationControllerを持たせて、その中のテーブルから遷移した際の

以下のような構造で
---
UITabBarController
└UINavigationController(タブA)
　└UITableViewController (一覧画面)
　└UIViewController (詳細画面)

└UINavigationController(タブB)
　└UIViewController
手順
---
(1)タブA表示中に、一覧画面のUITableViewCellをタップして、詳細画面へ遷移
(2)タブB(TabBarItem)をタップした後、またタブAに戻る
(3)タブAでは、詳細画面が表示されている
(4)タブAが表示された状態で、タブA(TabBarItem)を押す
(5)詳細画面が一覧画面にPOPする


上記(5)の動作を止める為にはどうしたらよいかハマっていました

解決策
---
UITabBarControllerのサブクラス内
デリゲートメソッドでタブ切り替えのキャンセル処理

```objectivec
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)
{
    UINavigationController *nav = (UINavigationController *)viewController;
    if ([NSStringFromClass([nav.viewControllers[0] class]) isEqualToString:@"詳細画面のクラス名文字列"]) {
        if ([nav.viewControllers count] == 2 && selectedController == viewController) {
            return NO;
        }
    }
    return YES;
}
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    if (selectedController != viewController) {
        selectedController = viewController;
    }
    
}
```
Project Euler 25

問題
---
フィボナッチ数列は以下の漸化式で定義される:

Fn = Fn-1 + Fn-2, ただし F1 = 1, F2 = 1.
最初の12項は以下である.

F1 = 1
F2 = 1
F3 = 2
F4 = 3
F5 = 5
F6 = 8
F7 = 13
F8 = 21
F9 = 34
F10 = 55
F11 = 89
F12 = 144
12番目の項, F12が3桁になる最初の項である.

1000桁になる最初の項の番号を答えよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2025

回答
---
そのままコードに書いた。

```py
import math
def main():
  (n1, n2) = (1,1)
  N = 10
  MAX_N = 1000-1
  n = 2
  while math.log(n2, N)<MAX_N:
    (n1,n2) = (n2, n1+n2)
    n += 1
  print n
main()
```
任意のディレクトリでローカルサーバを立てる方法

Webアプリやサイト制作でローカルサーバが必要なシーンはよくあると思いますが、他の方法に比べて比較的簡単にサーバだけとりあえず立てる方法として、 `takeapeek`というのがありましたので、メモしときます。

### インストール
npm でインストールします。

```shell-session
$ npm install -g takeapeek
```

### 起動
サーバに置きたいサイトもしくはアプリのルート・ディレクトリで下記を実行します。

```shell-session
$ cd /path/to/yourapp
$ takeapeek
Serving static file from directory /path/to/yourapp on port 3141 
```

あとは、`http://localhost:3141`にアクセスするとhttp経由で動作確認できます。
Project Euler 24

問題
---
順列とはモノの順番付きの並びのことである. たとえば, 3124は数 1, 2, 3, 4 の一つの順列である. すべての順列を数の大小でまたは辞書式に並べたものを辞書順と呼ぶ. 0と1と2の順列を辞書順に並べると

012 021 102 120 201 210
になる.

0,1,2,3,4,5,6,7,8,9からなる順列を辞書式に並べたときの100万番目はいくつか?
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2024

回答
---
あとで追加予定（＝やらない。）。

```
import math
def main():
  target = 10**6
  target -=1
  ans = ''
  ls = range(10)
  for i in range(9,-1,-1):
    n = ls.pop(target // math.factorial(i))
    target %= math.factorial(i)
    ans += str(n)
    

  print ans

  
main()
```
音声データをストリーミングで取得する。

#はじめに
Pepperのマイクからの音声をPython経由でPC/Mac上にファイルとして取得してみました。マイクロフォンのドライバから音声をとってGoogleさんの音声認識を実行するページが大変参考になりましたが、ちょっと敷居が高かったのでPythonSDKのみで実行できるものにしてみました。
※テストはMac上のPythonでしか行っていません。

下記ソース利用時にはPEPPER_IPを自分のIPアドレスに変えてください。
保存されるファイル名が「pepper_record.raw」となっていますので、こちらも適宜変えてください。

#ソース
```python:pepperRecord.py
# encoding:UTF-8
import sys
import time

from naoqi import (ALProxy, ALBroker, ALModule)

PEPPER_IP = "192.168.0.15"

PepperModule = None
memory = None

class PepperModuleClass(ALModule):
	def __init__(self, name):
		ALModule.__init__(self, name)
		#
		self.BIND_PYTHON( self.getName(),"callback" );
		self.tts = ALProxy("ALTextToSpeech", PEPPER_IP, 9559)
		#
		print "PepperModule Initialyze"

	def startRecord(self):
		self.tts.say("録音を開始します")
		#
		# ファイルの保存先設定
		self.saveFile = open("pepper_record.raw","wb")
		self.pepperMicrophone = ALProxy("ALAudioDevice", PEPPER_IP, 9559)
		#
		# 16KHzのモノラル音声でFront(3)マイク１つのみを指定
		self.pepperMicrophone.setClientPreferences(self.getName(), 16000, 3, 0)
		#
		# 録音開始
		self.pepperMicrophone.subscribe(self.getName())

	def processRemote(self, inputChannels, inputSamples, timeStamp, inputBuff):
		# 録音バッファを保存
		self.saveFile.write(inputBuff)

	def stopRecord(self):
		# 録音終了
		self.pepperMicrophone.unsubscribe(self.getName())
		time.sleep(1)
		self.tts.say("録音を終了しました")
		self.saveFile.close()

def main():

	myBroker = ALBroker("myBroker","0.0.0.0",0,PEPPER_IP,9559)

	global PepperModule
	PepperModule = PepperModuleClass("PepperModule")

	try:
		print "録音開始"
		PepperModule.startRecord()
		while True:
			time.sleep(1)
	except KeyboardInterrupt:
		print "録音終了"
		PepperModule.stopRecord()
		myBroker.shutdown()
		sys.exit(0)

if __name__ == "__main__":
	main()
```


###ポイントは

```
・self.BIND_PYTHON( self.getName(),"callback" );
```
↑　callbackの設定

```
・processRemote(self, inputChannels, inputSamples, timeStamp, inputBuff):
```
↑　ドキュメントではprocessのみですが、processRemoteで取得できました。
↑　processとprocessRemoteでは最後の２つの引数の順番が違っていました。(C++APIのヘッダーにて確認）

- - -

#最後に
録音した音声は16KHz/16bitのモノラル、リトルインディアンのPCM音声となります。
単体マイクだと意外に本体のノイズがのっているだなと思いました。

###参考URL
[pepperくんの耳を良くする](http://nextdeveloper.hatenablog.com/entry/2015/02/17/192621)
[NAO robot remote audio problems](http://stackoverflow.com/questions/24243757/nao-robot-remote-audio-problems)
jasmineで例外をテストする

## jasmineについて
jasmineはjavascript用のテストフレームワークです。
以下の様な感じでテストを書くことが出来ます。

```js:
describe('example', function() {
  it('example', function() {
    expect(1+2).toBe(3);  // 1+2=3であるか...成功
    expect(true).toBeFalsy(); //trueはfalseか...失敗
  });
});
```

jasmineの記法については、公式サイトやQiitaに詳しい記事がありますので、そちらを御覧ください。
この記事ではjasmineでの例外テストについて記述しています。

## jasmineで例外テストを実装する
関数を実行した際に例外が発生するかを`.toThrow()`でテストできます。

```js:
expect(func).toThrow();
```

また例外の内容を引数に指定すると、エラー内容が正しいかなどもテストできます。

```js:
expect(func).toThrow(new Error('This is Error.'));
```

### 具体例
```js:Example.js
function Example() {}
Example.prototype.errorFunc = function() {
  throw new Error('エラー');
};
module.exports = Example;
```

```js:ExampleSpec.js
describe('Exampleテスト', function() {
  var Example = require('Example');
  var example = new Example();

  it('例外の発生を確認', function() {
    expect(example.errorFunc).toThrow();
  });

  it('例外でエラーを投げているのを確認', function() {
    expect(example.errorFunc).toThrow(new Error('エラー'));
  });

});
```

### 困ったときは (Actual is not a Function)
テストが動かない場合、expectに渡している関数を実行してしまっている可能性があります。
関数に引数を渡す必要がある場合は`function`で囲えば解決できます。

```js:Example.js
function Example() {}
Example.prototype.errorFunc = function(argument) {
  if (argument == 'NG') {
    throw new Error('エラー');
  }
};
module.exports = Example;
```

```js:ExampleSpec.js
describe('Exampleテスト', function() {
  var Example = require('Example');
  var example = new Example();

  it('誤った実装例１', function() {
    expect(example.errorFunc('OK')).toThrow();
    // Actual is not a Function
    // expectの引数には関数を指定する必要がある。
  });
  it('誤った実装例２', function() {
    expect(example.errorFunc('NG')).toThrow();
    // Error: エラー
    // Exampleの例外が発生し、テストが終了してしまう。
  });
  it('正しい実装例１', function() {
    expect(function() {
      example.errorFunc('OK');
    }).toThrow(); // テスト失敗(例外が発生しない)
  });
  it('正しい実装例２', function() {
    expect(function() {
      example.errorFunc('NG');
    }).toThrow(); // テスト成功(例外が発生する)
  });

});
```


## リファレンス
[jasmine公式サイト](http://jasmine.github.io/)
[qiita - Jasmine使い方メモ](http://qiita.com/opengl-8080/items/cf3acafda9756f4b04c9)
[stackoverflow - How to write a test which expects an Error to be thrown](http://stackoverflow.com/questions/4144686/jasmine-how-to-write-a-test-which-expects-an-error-to-be-thrown)
Project Euler 23

問題
---
完全数とは, その数の真の約数の和がそれ自身と一致する数のことである. たとえば, 28の真の約数の和は, 1 + 2 + 4 + 7 + 14 = 28 であるので, 28は完全数である.

真の約数の和がその数よりも少ないものを不足数といい, 真の約数の和がその数よりも大きいものを過剰数と呼ぶ.

12は, 1 + 2 + 3 + 4 + 6 = 16 となるので, 最小の過剰数である. よって2つの過剰数の和で書ける最少の数は24である. 数学的な解析により, 28123より大きい任意の整数は2つの過剰数の和で書けることが知られている. 2つの過剰数の和で表せない最大の数がこの上限よりも小さいことは分かっているのだが, この上限を減らすことが出来ていない.

2つの過剰数の和で書き表せない正の整数の総和を求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2023

回答
---
辞書内包表記の練習。
※辞書内包表記を使う理由：
適当に見たサイトから
http://www.peignot.net/python-speed
>setsや辞書を使った要素の検証（O(1)）は、配列の検索（O(n)）よりも高速です。 a in b を調べるとき、bはリストやタプルではなくsetsや辞書であるべきです。

```py
# -*- coding: utf_8 -*-
def factor_sum_seq(max):
  dl = [0] + [1]*(max)
  seq = range(max+1) 
  for i in seq[2:]:
    for j in seq[i*2::i]:
      dl[j] += i
  return dl

def cof():
  MAX = 28123+1 #+1を計算するのすらめんどい

  seq = range(MAX)
  dl = factor_sum_seq(MAX)
  abu = [i for i in seq if dl[i] > i and dl[i]<MAX]
  abu2 = {i+j:True for i in abu for j in abu}
  ans = 0
  for i in seq:
    if not (i in abu2):
      ans += i
  print ans

cof()
```

それにしても遅すぎる。とはいっても改善するつもりも全くないのだけど。
phoenixでlive reloadさせる方法

# 何これ？
phoenixフレームワークでlive reload(ファイルの変更をすると自動的にページがリロードされるヤツ)を使う方法をまとめます。

なお、この機能が入ったブランチ([cm-brunch](https://github.com/phoenixframework/phoenix/tree/cm-brunch))は2015/3/2現在、まだ[masterにマージされていないようなので](https://github.com/phoenixframework/phoenix/network)、使う時は自己責任でｵﾅｼｬｽ。

その内マージされるんじゃないですかね、知らんけど。


## 数分でできるお
* phoenixプロジェクト自体を落としたいディレクトリにcd
* 下記実行  

``` bash
git clone https://github.com/phoenixframework/phoenix.git && cd phoenix && git checkout cm-brunch && mix do deps.get, compile
```

* 下記実行（live_reload, ~/path/to共に任意に読み替えて下さい）  

``` bash
mix phoenix.new live_reload ~/path/to/live_reload && cd ~/path/to/live_reload && mix deps.get
```

* 下記を実行して、サーバーを起動しましょう

``` bash
mix phoenix.server
```

* ブラウザで http://localhost:4000 にレッツアクセス！

## 実験
例えば、``` web/templates/page/index.html.eex ``` を適当に編集して、saveしましょう。そうすると、ブラウザが勝手にreloadします。

やったねー☆

## 参考リンク
* [この機能作った人の動画](https://www.youtube.com/watch?v=CgSjuCRHKvg&feature=youtu.be)

## 追記（2015/3/9）
本日、PhoenixのVer 0.10がリリースされたようで、
上記のLive Reloadはきっちりマージされています٩(๑❛ᴗ❛๑)۶

さて、0.10のnew featureについてはこれから色々触ってみて、
暇があればまとめます。

それにしてもPhoenix、大分色々よくなって来てますね。
下のブログの通り、Elixir共々Phoenixは、次の１０年を見据えたプロジェクトとして着々と育って行っているように思います。

* [Why I’m betting on Elixir](https://medium.com/@kenmazaika/why-im-betting-on-elixir-7c8f847b58)
AWS CLI でS3へアクセスするコマンドメモ

AWS CLIを使ったS3へのアクセスのコマンドラインの備忘録。
aws-cliのインストールとアクセスキー/シークレットキーの設定は済んでいる前提。

##ディレクトリ配下のファイルを確認

```bash
$ aws s3 ls s3://mybucket1/data/test/
2015-02-04 14:43:43          0
2015-02-06 14:46:08          5 test.txt
```

##S3のファイルをローカルにダウンロード

```bash
$ aws s3 cp s3://mybucket1/data/test/test.txt ./
download: s3://mybucket1/data/test/test.txt to ./test.txt
```

##S3にファイルをアップロード

```bash
$ aws s3 cp ./test2.txt s3://mybucket1/data/test/
upload: ./test2.txt to s3://mybucket1/data/test/test2.txt
```

##アップロード後されたファイルを確認

```bash
$ aws s3 ls s3://mybucket1/data/test/
2015-02-04 14:43:43          0
2015-02-06 14:46:08          5 test.txt
2015-02-06 15:00:44          5 test2.txt
```
Project Euler 22 

問題
----
5000個以上の名前が書かれている46Kのテキストファイル filenames.txt を用いる. まずアルファベット順にソートせよ.

のち, 各名前についてアルファベットに値を割り振り, リスト中の出現順の数と掛け合わせることで, 名前のスコアを計算する.

たとえば, リストがアルファベット順にソートされているとすると, COLINはリストの938番目にある. またCOLINは 3 + 15 + 12 + 9 + 14 = 53 という値を持つ. よってCOLINは 938 × 53 = 49714 というスコアを持つ.

ファイル中の全名前のスコアの合計を求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2022

回答
----
reduce関数を使う練習。

```py
dict = {"A":1,"B":2,"C":3,"D":4,"E":5,"F":6,"G":7,"H":8,"I":9,"J":10,"K":11,"L":12,"M":13,"N":14,"O":15,"P":16,"Q":17,"R":18,"S":19,"T":20,"U":21,"V":22,"W":23,"X":24,"Y":25,"Z":26}
def get_point(name,i):
  #if name == 'COLIN':
  #  print reduce(lambda x,y:x+y, map(lambda x:dict[x], name)) * (i+1) 
  return reduce(lambda x,y:x+y, map(lambda x:dict[x], name)) * (i+1) 

def main():
  filename = "names.txt"
  F = open(filename)
  names = F.read()
  namelist = map(lambda x: x.strip('"'), names.split(","))
  namelist.sort()
  ans = 0
  lng = len(namelist)
  for i in range(lng):
    ans += get_point(namelist[i],i)
  print ans

main()
```
マイグレーションでテーブルカラムにコメントを設定する

Laravelのマイグレーション(スキーマビルダー)でカラムにコメントを設定する方法。
検索しても「できます」的な情報が見つけられず、出来なかった頃の方法がトップに出てくるので、
知らない人多い？と思い共有します。

```php
Schema::create('users', function (Blueprint $table) {
    $table->string('name')->comment('ユーザー名');
});
```

`MySqlGrammer`クラスで定義されているみたいです。なので、使えるのはMySQLだけっぽい。
https://github.com/laravel/framework/commit/1aca4bbde671a1f25bffc9859af34eecc98002f5#diff-6b15e6c9bf5e3fe00e3f4cb4bc3fd386R577

`->comment()`がある場合に、MySQL以外のDBで実行するとどうなるんでしょう？
MySQL以外を使ってないので、試された方の情報共有お待ちしてます。

---

### 参考

[Laravel のマイグレーションで MySQL の COMMENT を扱う - takaya030の備忘録](http://d.hatena.ne.jp/takaya030/20130926/1380209935)
Scala: joda-timeで何分経過したか計算したい

joda-timeを使って、`DateTime`オブジェクト同士の分の差を計算して、「何分かかったか？」「何分経過したか？」などを求める方法です。`Minutes.minutesBetween`を使うと、日付をまたいでいても計算することができます。

```scala
    import org.joda.time.{ Minutes, DateTime }
    val start = new DateTime("2015-02-01T10:50:01")
    val end = new DateTime("2015-02-02T11:10:59")
    val duration = Minutes.minutesBetween(start, end).getMinutes
    println(duration) // 1460
```
よく使うLinuxコマンドメモ

じぶんよう

***

#検索系

##ファイル検索
```lang:ヒットしたファイル名を一覧で表示
find . -name '*' | xargs grep -l hoge
```

```lang:エラー非表示
find . -name '*' | xargs grep -s hoge
```

```lang:ヒットした行からX行目までを表示
find . -name '*' | xargs grep -A X hoge
```

ちなみに-B Xだと「ヒットした行のX行前から表示」になる。

##ファイル内検索(圧縮ファイル検索)

```lang:イラナイ語句を省く
zgrep --color=always hoge ファイル名 | zgrep -v イラナイ
```
zgrepのオプションで-vは除外。
あとは-iで大文字/小文字の区別をつけない。

--color=alwaysは「検索文字に色づけ(赤字)してくれるオプション。
(ただし、lessコマンドをつけると効かなくなる)

```lang:lessが文字化けするとき
コマンド | less -R
```
かなり便利。zgrepコマンドと組み合わせOK。


# プロセス系
##プロセス確認
```lang:おすすめ
ps aux | grep プロセス名
```
##プロセスが開いているファイル確認
```lang:おすすめ
lsof | grep プロセス名
```
lsofだけだと出力尋常じゃないｗ


# メモリ系
##メモリ確認
```lang:rss項目を降順表記
ps aux --sort -rss
```

rss：消費した物理メモリ。
このコマンドを使うと消費順にみることができる


# ダウンロード系
## ファイルをダウンロードする

```
wget [option] [URL]
```

[option]に`-b`をつけるとバックグラウンドで実行。
`-d`だとデバッグ情報が出る。

# ファイル展開系
## 解凍して展開
もうこれで覚えちゃったほうがいいかも。

```
tar xvzf [圧縮ファイル名]
```

# ユーザー・グループ系

## ユーザーの追加

```
useradd [ユーザー名]
```

## グループの追加

```
groupadd [グループ]
```
gitで差分が出続ける現象の解決法


gitで差分が出続ける時がある。

```
$git status

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   app/hoge.php

no changes added to commit (use "git add" and/or "git commit -a")
```

commitしてもstashしてもresetしても出続ける。SourceTreeやGitHubのGUIで実行しても同じ。なにこの悪夢。


### addしてみたら以下のwarningが出た

```
$ git add app/hoge.php
warning: LF will be replaced by CRLF in app/hoge.php
```

## 原因
Git が改行コードを CRLF へ勝手に変更しようとするらしい。

## 解決方法

addの前に以下のコマンドを打てばOK。<b>改行コードの自動変換をしなくなる設定に。</b>

```
$ git config --global core.autoCRLF false
```

### 補足
上記コマンドにより.gitconfigファイルでもともとtrueだった以下の設定がfalseになる。

```:gitconfig
core.autoCRLF=false
```

というわけで、

```
$ git config --global core.autoCRLF false
$ git add app/hoge.php
$ git commit -m "piyopiyo"
```

これで無事コミットできた。
PublicIPを持っていないサーバマルチAZでの冗長化

## 目的
PublicIPを持っていないサーバマルチAZでの冗長化（Active-Stanby)
以下の課題を解決：

- FloatingIP: マルチAZ対応できない
- DNSフェルオーバー：PublicIPが必要

## cli53のインストール

<pre>
easy_install pip
pip install cli53
</pre>

## 構成

HA_Node_IP: 10.10.100.101, 10.10.200.101
HOSTED_ZONE: xyz.com
HOST: myserver

初期登録(route53)
myserver A 10.10.100.101 60


## HAモニター(shell)

監視の相手から応答なし、かつ現在DNSに登録されたIPは相手のサーバの場合、
DNSレコード更新（自分のIPに設定）

以下のスクリプトはAWSのFloatingIP用サンプルコードを参考して作成した。
rc.localなどで常時起動

<pre>
#!/bin/sh

#監視相手のIPを設定
HA_Node_IP=10.10.100.101
HOSTED_ZONE=test.xyz.com
HOST=myserver

SELF_IP=$(curl -s http://169.254.169.254/latest/meta-data/local-ipv4)

echo `date` "-- Starting HA monitor"
while [ . ]; do
  pingresult=`ping -c 3 -W 1 $HA_Node_IP | grep time= | wc -l`
  if [ "$pingresult" == "0" ]; then
    ACTIVE_IP=$(cli53 rrlist ${HOSTED_ZONE}|grep ^${HOST}|awk '{print $5}')
    if [ "SELF_IP" != "$ACTIVE_IP" ]; then
      echo `date` "-- HA heartbeat failed, taking over domain name"
      cli53 rrcreate $HOSTED_ZONE $HOST A $SELF_IP --ttl 60 --replace
    fi
  fi
  sleep 10
done
</pre>
Scala: Int同士の割り算は、Intが戻り値なので注意

整数同士の割り算、例えば 100000 ÷ 30 = 3333.333333333 の結果はFloatになりそうですが、Scalaは3333のようにIntが戻り値になるので注意が必要です。

```scala:計算結果がInt
object Main extends App {
  val sales = 100000
  val days = 30
  val salesPerDay = sales / days
  println(salesPerDay) // 3333
}
```

計算結果を少数として欲しい時は、計算に使う数字を`Float`に変換しておく必要があります。

```scala:計算結果がFloat
object Main extends App {
  val sales = 100000
  val days = 30
  val salesPerDay = sales / days.toFloat
  println(salesPerDay) // 3333.3333
}
```
CentOSのバージョンを確認する方法

CentOSのバージョンを確認したい場合があります。たまにしか確認しないので忘れてしまいます(^^ゞ

# CentOSのバージョンを確認
/etc/redhat-releaseを表示すると、CentOSのバージョンが表示されます。

```bash:CentOSのバージョンを確認
cat /etc/redhat-release
CentOS release 5.6 (Final)
```
ちゃんと表示されました(☝ ՞ਊ ՞)
Deviseのpassword変更時のencrypted_passwordの挙動

# 概要
Devise を使っている際、`encypted_password`が更新されるタイミングが気になったので、`Rails Console`で動かしてみました。誰得メモです。

# 注意
書いてる本人は Devise 歴 30分程度の超にわかです。

# 実践
まずは普通に、`password`と`password_confirmation`に同じ値を格納して`save`し、`encrypted_password`と`authenticatable_salt`の値を確認してみました。

```ruby
pry > @user.password = @user.password_confirmation = "hogehoge"
=> "hogehoge"
pry > @user.save
=> true

pry > @user.encrypted_password
=> "$2a$04$vcBoXTQKDCWg7Ghyb1KlFu0cEdCMUhY1kGNKzAVrtQH6SlVb6TVem"
pry > @user.authenticatable_salt
=> "$2a$04$vcBoXTQKDCWg7Ghyb1KlFu"
```

普通の動作です。

なんとなく salt が気になったというだけで、`authenticatable_salt`を何かよくわからないまま見てたので、中身が何かをここで確認しました。

```ruby
pry > show-method @user.authenticatable_salt

From: devise-1.4.9/lib/devise/models/database_authenticatable.rb @ line 90:
Owner: Devise::Models::DatabaseAuthenticatable
Visibility: public
Number of lines: 3

def authenticatable_salt
  self.encrypted_password[0,29] if self.encrypted_password
end
```

なんと、`encrypted_password`の先頭ぶった切っただけでした。というわけで、以後、特に見ないことにします。

次は気になった動作です。`save`せず、`password`のみ変更し、同じ文字を連続で入れたりしてみました。

```ruby
# 更新される
pry > @user.password = "hoge"
=> "hoge"
pry > @user.encrypted_password
=> "$2a$04$I1OFA2gKnvA5w0QD6NDZ5OvBJ5u7S2eh3zLvqr5.PJQf4STsJEznG"

# 更新される
pry > @user.password = "hoge"
=> "hoge"
pry > @user.encrypted_password
=> "$2a$04$IbK7Mqdi1iG5xPlqqkCrAelLKUyAUwNowaOfTNy32XgoDGr0qxtLO"

# 更新される
pry > @user.password = "foobar"
=> "foobar"
pry > @user.encrypted_password
=> "$2a$04$/0.33wLEmjZ0XUV2rZtrSuMQM"

# 更新される
pry > @user.password = "hoge"
=> "hoge"
pry > @user.encrypted_password
=> "$2a$04$rw/k92vw0TX9MLcejTCmBOw.WcM7YdfOYxFcJKos7ygKfVFqap8LG"

# 更新されない
pry > @user.password_confirmation = "hogege"
=> "hogege"
pry > @user.encrypted_password
=> "$2a$04$rw/k92vw0TX9MLcejTCmBOw.WcM7YdfOYxFcJKos7ygKfVFqap8LG"
```

`save`しなくても、`password_confirmation`に値を入れなくても、`encrypted_password`が更新されています。そして同じ値を入れてもハッシュ値が別になっています。

また、`password_confirmation`のみ変更した場合、`encrypted_password`は更新されませんでした。

勝手に`password`と`password_confirmation`に同じ値が入っている状態で`save`したら`encrypted_password`が更新されるんだと思い込んでましたが、どうやら違ったようです。

# 結論
Devise の`encypted_password`は`password`の値が変更されたタイミングで更新される。
QEMU で NAT

## 参考

* [QEMU (日本語) - ArchWiki](https://wiki.archlinux.org/index.php/QEMU_(%E6%97%A5%E6%9C%AC%E8%AA%9E))
* [How to use Network](http://www.h7.dion.ne.jp/~qemu-win/HowToNetwork-ja.html)
* [Documentation/Networking - QEMU](http://wiki.qemu.org/Documentation/Networking)

## KVMコマンド

`qemu-system-x86_64 -enable-kvm`
と同じ。

* Virtualboxを起動していると、kvmを利用できないので注意。

```rb
#qemu-img create -f qcow2 20g.qcow2 20G

# fullscreen : alt + control + f

cd /home/User1

kvm \
 -m 4G \
 -cdrom boot.iso \
 -drive file=20g.qcow2,format=qcow2,if=virtio \
 -net nic \
 -net user,hostfwd=tcp::2222-:22 \
 -k ja
 #-full-screen
```

* [KVMのインストール（debian） - わすれないうちにメモしよう](http://d.hatena.ne.jp/kt_hiro/20120113/1326464460)

```bash:SSH越しでコンソール表示
sudo kvm \
 -hda 20g.qcow2 \
 -m 512 \
 -net nic -net tap \
 -curses \
 -virtioconsole stdio
```

```bash:daemonize
sudo kvm \
 -hda 20g.qcow2 \
 -m 512 \
 -net nic \
 -net tap \
 -vnc :1 \
 -daemonize
```

### その他の例

```bash:
qemu-img create -f qcow2 6gb.qcow2 6G

kvm \
  -m 1000 \
  -hda 6gb.qcow2 \
  -cdrom rancheros.iso \
  
  -curses \
  -boot d
```

----


## virtio for windows

* [download](https://fedoraproject.org/wiki/Windows_Virtio_Drivers)


## 使い方

qemuは事前のインストール不要でそのまま動いてくれる。
勝手にsshしまくってくれてVPNっぽくしてくれる君を
ポータブルに持っておくのもいいかも

[Tiny Core Linux](http://tinycorelinux.net/downloads.html)を使った。
Xも起動するので、X転送に良い。

## 起動方法

```bash:
sudo qemu-system-i386 \
  -net nic,model=virtio \
  -net user,hostfwd=tcp::2222-:22 \
  -cdrom TinyCore-current.iso
```

* localhostのport 2222 に 仮想マシンのport 22 をバインドします。

```bash:
sudo qemu-system-i386 \
  -net nic,model=e1000 \
  -net user,hostfwd=tcp::3389-:3389 \
  -hda hdd2g.qcow2 \
  -cdrom xpsp3.iso \
  -boot order=d
```

* CDからbootします

## HDDの追加

```bash:
qemu-img create -f qcow2 hdd2gb.qcow2 2G
```

```bash:
-hda hdd2gb.qcow2
```

HDDイメージは`qemu-img create `で作っても良いし、適当なファイルを指定して、
ゲスト側で`fdisk /dev/sda`してパーティション作り、`mkfs.ext4 /dev/sda1`すればよい。


## bootデバイス

```bash:cdromから起動
-boot d
```

```bash:HDDから起動
-boot c
```

----

## メモ

* `-m`をつけなければ128MBが割り振られる。

```bash:
sudo qemu-system-i386 \
  -m 1024 \
  -net nic,model=virtio \
  -net user,hostfwd=tcp::3389-:3389 \
  -drive file=hdd2g.qcow2 \
  -vga std -nographic -vnc :0

#sudo qemu-system-x86_64 \
# -cdrom virtio-win-0.1.102.iso \
# -boot order=d
# -net nic,model=rtl8139 \
# -net user,hostfwd=tcp::23389-:3389 \
# -hda hdd2g.qcow2 \
# -hdb hdd1m.qcow2 \
# -drive file=hdd1m.qcow2 \
# -usbdevice tablet \
# -drive file=hdd1m.qcow2,if=virtio \
```

## XP

```sh
DISPLAY=:0 \
qemu-system-i386 \
 -m 300M \
 -drive file=24gb.qcow2 \
 -net nic,model=virtio \
 -net user,hostfwd=tcp::3389-:3389 \
 -k ja \
 -cdrom xp.iso \
 -boot d
```
MySQLでテンポラリテーブルの作成がやたらと遅いときの回避方法

MySQL5.6でテンポラリテーブルを作る場合は、MyISAM指定で作ると速くなります。

以下は原因の推測です。
恐らく、MySQL5.5からデフォルトDBがMyISAMからinnodbに変わったのが原因のように思います。
テンポラリテーブルはMEMORYテーブルとして作成され、テンポラリテーブルのサイズ上限を超えるとMyISAMに自動変換される仕様にはなっていますが、ここが実はデフォルトDBなんじゃないかと思っています。
なので、MEMORYテーブルの内部構造はMyISAMで5.1以下時代は作られていたが、
5.5以上だとMEMORYテーブルの内部構造がinnodbになっていて、
これをメモリに乗せようとすることで、処理にやたらと時間がかかるようになってしまったのではないでしょうか。
jsdoでjthreeをホスティングする

[こちら](http://qiita.com/rana_kualu/items/c4f60a0c1c78e2b92342)の記事を見て、jthreeをjsdoでホスティングしたくなった。
v2.1は動かなかったので、v1.5.1を使った。
手順
まず、gomlを書く。
```xml
<?xml version="1.0" encoding="UTF-8"?>
<goml>
	<head>
		<gmt id="Gmt" type="Cube" param="3.0 3.0 3.0" />
		<rdr frame="body" camera="camera:first"/>
	</head>
	<body>
		<scene>
			<camera style="positionZ: 10;" />
			<mesh gmt="#Gmt" />
		</scene>
	</body>
</goml>
```
次に、jthreeを書く。
```html
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js">
</script>
<script src="/assets/A/u/R/d/AuRdd">
</script>
<script src="/assets/5/q/y/f/5qyf5">
</script>
```
最初に、jquery読んで、jThree.js、jThree.Trackball.jsを読み込む。
```js
jThree.goml("/ohisama1/pzT5/js", function(j3) {
	j3.Trackball();
});
```
"/ohisama1/pzT5"は。gomlのurlを指す。
実際は、これ。
[goml](http://jsdo.it/ohisama1/pzT5)
[jthree](http://jsdo.it/ohisama1/4cAG)
MySQLのパラメータチューニングメモ

性能改善に役立ったパラメータのメモです。

１．table_open_cache
一度開いたファイルのファイルポインタを格納しておくキャッシュを設定します
デフォルトは2000でautosizedとなっているため、上限を決めると性能が上がる可能性があります。

２．table_open_cache_instances
table_open_cacheの分割数を設定します。
分割することでDDL文以外の並列性が向上します。
推奨値がないため、最初はCPUの数を設定してあげて、その近辺から最も性能が上がる数を探しています。
デフォルトは１です。

３．innodb_buffer_pool_size
InnoDBのデータやインデックスなどのキャッシュ領域を指定します。
システムに見合った適切な値を設定してあげてください。
デフォルトは134217728byteです。

４．innodb_autoextend_increment
ibdataの自動拡張時の拡張サイズを設定します。
デフォルトは8MBなのでバッチで大量のデータをinsertするようなシステムでは、この値は広く取らないと領域拡張の嵐で性能が劣化します。

５．binlog_cache_size
1トランザクションでバイナリログ出力するbinlogをキャッシュしておくサイズを指定します。
1トランザクション中に発行するクエリの総量がこの値を超えると性能が劣化します。
デフォルトは32768byteです。

６．innodb_sync_array_size
待機中スレッドについての同時実行性を高めるために、内部データ構造をいくつに分割するかを指定します。
（mutex/rw_lockのイベント待ち処理の並列性に影響。）
何の設定かがいまいち分からないですが、内部データ構造を分割することでデータの書き込み領域を排他している？のかなと。
CPU * 2くらいの値を設定するのが推奨で、設定すると確かに速くなります。（なぜ速くなるのかが、説明できませんが・・・）
アナリティクスから人気記事を表示させるプラグインSimple GA Rankingでサムネイルを付ける

アクセスが多いWordPressサイトでは、人気記事を表示させる「Wordpress Popular Posts」プラグインを使っていると、ページのアクセスのたびにDBに書き込み・読み込みが発生して負荷がかかる、という指摘を受けたので、Googleアナリティクスから人気記事ランキングを表示させるプラグイン「Simple　GA Ranking」を使うことにしました。
標準のままだとランキングの表示に記事のサムネイルが表示されないので、アイキャッチ画像も表示させるようにしてみました。

##コード
プラグインのソースを見たら、以下のapply_filtersがありました。

```php:simple-ga-ranking.php
apply_filters( 'sga_ranking_before_title', '', $id, $cnt )
apply_filters( 'sga_ranking_after_title', '', $id, $cnt )
```

私の場合はタイトル表示の前にサムネイルを表示させたかったので、sga_ranking_before_titleの方を使うべく、functions.php に以下を追加しました。

```php:functions.php
add_filter('sga_ranking_before_title', 'showRankingImage', 10, 2);
function showRankingImage($ret, $id, $cnt) {
  $post_url = get_permalink($id); // 記事のURL
  $title = get_the_title($id); //タイトル
  $ret = "";
  if( has_post_thumbnail( $id ) ) {  // アイキャッチ画像の有無
    $post_thumb_src = wp_get_attachment_image_src( get_post_thumbnail_id( $id ) );
    $post_thumb = $post_thumb_src[0];
    $ret = "<a href=\"{$post_url}\" title=\"{$title}\"><img src=\"{$post_thumb}\" alt=\"{$title}\" title=\"{$title}\"></a>";
  }
  return $ret;
}
```

プラグインのソースの中を見ると、他にもいくつかフィルターがあったので、色々カスタマイズ出来そうです。
virtualbox + ubuntuにnginxをインストール

virtualbox + ubuntuにnginxをインストールしたときのメモ。

#### 環境
---
 * VirtualBox 4.3
 * ubuntu 14.04
 * nginx 1.6.2

#### インストール
---

2015/03/02現在の最新のStable versionをインストールします。

```bash
# nginxのAPTキーを登録する
$ curl http://nginx.org/keys/nginx_signing.key | sudo apt-key add -

# リポジトリを追加
$ sudo sh -c "echo 'deb http://nginx.org/packages/ubuntu/ trusty nginx' >> /etc/apt/sources.list"
$ sudo sh -c "echo 'deb-src http://nginx.org/packages/ubuntu/ trusty nginx' >> /etc/apt/sources.list"

# インストール
$ sudo apt-get update
$ sudo apt-get install nginx
$ nginx -v
nginx version: nginx/1.6.2
```

#### nginxを起動してみる
---

```bash
$ sudo /etc/init.d/nginx start
$ ps aux | grep nginx
root      6227  0.0  0.0  31196   992 ?        Ss   17:34   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf                    
nginx     6228  0.0  0.0  31584  1656 ?        S    17:34   0:00 nginx: worker process
```

起動しました。
Docker をつかって Hubot の環境を整え、AWS で動かす

Hubot 用の環境を Dockerfile にまとめ、ビルドしたものを Dockerhub においておけば、AWS にかぎらず docker が使えればどこでも同じ環境をモリモリ用意できるので、その手順をまとめておく。

## Dockerfile

[Hubotの環境に必要なもの](http://qiita.com/KeithYokoma/items/5803c0b1559095ec9efa)を Dockerfile に入れてく。

```text:Dockerfile

FROM ubuntu:14.04
MAINTAINER keithyokoma

ENV HUBOT_SLACK_TOKEN your-slack-token

## install
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install git nodejs npm redis-server -y
RUN npm install -g coffee-script
RUN npm install -g hubot
RUN npm install --save hubot-slack
# replace nodejs to node
RUN update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10
```

## ビルド

Mac なら`boot2docker`を使ってビルドし、DockerHub の private repo にプッシュする。

```

(client)      $ boot2docker ssh
(boot2docker) $ docker build .
(boot2docker) $ docker login
(boot2docker) $ docker push my_account/repo:latest
```

ビルドには時間がかかるのでじっくり待つ。

## AWS

Amazon Linux なら、まず`yum`で docker をいれデーモン化し、DockerHub の private repo から pull してきてコンテナを起動する。名前をつけておくとあとでコンテナを起動したり止めたりが簡単になって良い。

コンテナを起動したら、コンテナにアタッチして入り、自分用の Hubot を GitHub などから取ってきて走らせ、`Ctrl+p`、`Ctrl+q`でコンテナから抜けて終わり。

```

(client)    $ ssh aws
(aws)       $ sudo yum update
(aws)       $ sudo yum install docker
(aws)       $ sudo service docker start
(aws)       $ sudo docker login
(aws)       $ sudo docker pull my_account/repo:latest
(aws)       $ sudo docker run -i -t --name HUBOT drivemode/hubot /bin/bash
(container) # exit
(aws)       $ sudo docker start HUBOT
(aws)       $ sudo docker attach HUBOT
(container) # git clone https://github.com/your_account/your_hubot
(container) # cd your_hubot
(container) # nohup ./bin/hubot -a slack > LOGFILE &
(container) # (Ctrl+p, Ctrl+q)
(aws)       $ exit
```

コンテナから抜けるとき、`exit`すると`docker start HUBOT`で起動したコンテナが止まっちゃうので、`Ctrl+p`、`Ctrl+q`で抜けるようにする。そうするとコンテナは起動したままになる。
DynamoDBLocalとAWS SDK for PHP2でごにょごにょする4 - delete

次は[DynamoDBLocalとAWS SDK for PHP2でごにょごにょする3 - putとget](http://qiita.com/duke-gonorego/items/dda7770243a2f35366c8)で登録したデータをテーブルごと削除してみます。

#### 環境
---
 * VirtualBox 4.3
 * ubuntu 14.04
 * PHP 5.5.9-1ubuntu4.5 (cli)

#### テーブル削除と確認
---

```php:DeleteTable.class.php
<?php
require_once 'DynamoDB.class.php';
class DeleteTable {
    private $dynamo;
    public function __construct() {
        $this->dynamo = DynamoDB::conn();
    }

    public function execute() {
        $param = array(
            'TableName' => 'user'
        );

        $this->dynamo->deleteTable($param);

        // 確認
        $param = array(
            'TableName' => 'user'
        );

        try {
            $result = $this->dynamo->describeTable($param);
            var_dump($result);
        } catch (DynamoDbException $e) {
            print $e;
        }
    }
}
$deleteTable = new DeleteTable;
$deleteTable->execute();
```

```
$ php DeleteTable.class.php                                                                           
PHP Fatal error:  Uncaught Aws\DynamoDb\Exception\ResourceNotFoundException: AWS Error Code: ResourceNotFoundException, Status Code: 400, AWS Request ID: fdb831b7-f4e3-41b6-8025-4186edf6b7c3, AWS Error Type: client, AWS Error Message: Cannot do operations on a non-existent table, …
```

テーブルを削除した後に、テーブルの確認をしたことにより
「non-existent table」
が出力されました。

正しくテーブルが削除されたようです。
C++覚え書き

C++コーディングで良く忘れる項目を覚え書き。

クラス名の取得
---
```cpp
CA *pt = new CA(); 
const std::type_info &info = typeid(*pt);
printf ("class - %s", info.name());
```

可変引数(※長さ制限有り)
---
```cpp
std::string format(const char *fmt, ...) {
#define CC_MAX_STRING_LENGTH (1024*100)

  std::string ret;
  va_list ap;
  va_start(ap, fmt);
	
  char* buf = (char*)malloc(CC_MAX_STRING_LENGTH);
  if (buf != nullptr) {
    vsnprintf(buf, CC_MAX_STRING_LENGTH, fmt, ap);
    ret = buf;
    free(buf);
  }
  va_end(ap);
  return ret;
}
```

std::function
---
```cpp
#include <function>

void CA::foo(std::function<void (int)> func) {
  func(100);
}

void CA::bar() {
  foo([this](int val){
    printf("val - %d", val);
  });
}
```

std::vector
---
```cpp
#include <vector>

CA *ca1 = new CA();
CA *ca2 = new CA();

std::vector<CA*> list;

// 追加
list.push_back( ca1 );
list.push_back( ca2 );

// まとめて代入
list = {ca1, ca2};

// イテレータアクセス
for (std::vector<CA*>::iterator it=list.begin(); it!=list.end(); ++it) {
  CA *ca = *it;
}

// 特定項目の削除
list.erase( remove(list.begin(), list.end(), ca1), list.end() );

```

std::map
---
```cpp
#include <map>

std::map<std::string, int> maps;

// 追加
maps["1st"] = 100;
maps["2nd"] = 200;

// まとめて代入
maps = {{"1st", 100}, {"2nd", 200}};

// 順次アクセス
for (std::vector<std::string, int>::iterator it=maps.begin(); it!=maps.end(); ++it) {
  std::string key = it->first;
  int val = it->second;
  printf ("key=%s, val=%d", key.c_str(), val);
}

// 要素の検索
if (maps.find("2nd") != maps.end()) {
  printf ("要素が見つかった");
}

// 特定項目の削除
maps.erase("2nd");

```
NetworkImageViewを含むResourceをInflate時にエラー発生

独自の`ListAdapter`を実装時にVolleyの`NetworkImageView`を使用した所、下記のようなエラーが発生しました。

    android.view.InflateException: Binary XML file line #8: Error inflating class NetworkImageView
これは独自に定義した`ListItem`用のXMLの中で、`NetworkImageView`のフルパスを指定しなかったのが原因でした。
コンパイルエラーなどが発生せず気づきにくかったので、メモとして残しておきます。

```xml:list_item.xml（悪い例）
<LinearLayout
    android:orientation="horizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <NetworkImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

     <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>
```

```xml:list_item.xml（良い例）
<LinearLayout
    android:orientation="horizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <com.android.volley.toolbox.NetworkImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

     <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>
```
【論理プロパティ】margin-startとは その他比較

知らなかったのでメモ

### margin-start（= margin-left）
文の始まりの前にマージンがつく。
★がマージンが付く部分だとして、
例）★あいうえお
### margin-end(= margin-right)
文の終わりにマージンがつく
例）あいうえお★
### margin-before(= margin-top)
文が始まる段の上にマージンがつく
例）
　　★
　　あいうえお
### margin-after(= margin-bottom)
文が終わる段の下にマージンがつく
例）
　　あいうえお
　　★

## 

## 例
![横.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/e1f99bcd-9f67-f132-3e63-50997374a0b5.png)

## 以下のように指定
(chromeでしかチェックしていません)

```css

<style type="text/css">
.textboxwrap {
	border: 2px #000 solid;
}
.textbox.start {
	margin-start: 50px;
	-webkit-margin-start: 50px;
	background-color: red;
}
	.textbox.end {
	margin-end: 50px;
	-webkit-margin-end: 50px;
	background-color: blue
}
	.textbox.before {
	margin-before: 50px;
	-webkit-margin-before: 50px;
	background-color: yellow;
}
	.textbox.after {
	margin-start: 50px;
	-webkit-margin-after: 50px;
	background-color: orange;
}
</style>
```
CakePHP、データベースをupdateする時の注意点

CakePHPで、データベースのupdateをかけるフィールドを特定のカラムに限定して、
さらにバリデーションを無視する場合の書き方。

注）以下のPostモデルの項目commentにはバリデーションでnotEmptyが設定されている。

```php
$data = array('id' => $myId, 'comment' => NULL);
$this->Post->save($data, false, array('comment'));
```
save()の引数の真ん中の false を true にすると、notEmpty が有効なため、commentに NULL を入れようとしても全く入らない（update文が実行されない）。

３つ目の引数の array() が updateするカラムの指定で、これを入れないとデータベース上でdefault valueが設定されているようなカラムも一緒に更新しようとする。
AtomとかでVimModeを使ってみるメモ

#AtomでVimMode
Vim
    VimMode
        コマンドモード(insert or visual　の時に ESC)
        インサートモード　(コマンドモードから a,i,s,cc)
        ヴィジュアルモード(コマンドモードから v)

##モード遷移
インサートモード i
行頭からインサートモード I
カーソルの右からインサートモード a
行末からインサートモード A

##移動
一文字右へ space, l

・移動 h,j,k,l
行頭へ 0
行末へ $

ファイル先頭へ gg
ファイル末尾へ G

・次の単語へ w
・前の単語へ b

・大きく移動 {, }

##操作、コピペ
一文字 削除 x

d d - 1行削除切り取り（カット）
d $ - カーソル位置から行末まで削除 

d w - カーソル位置から空白を含む単語の末尾まで削除 
d e - カーソル位置から空白を含まない単語の末尾まで削除 



・ビジュアルモード v
１行コピー yy
・ペースト p
・一行切り取り dd
・二行切り取り dj, dk




#macでvim

ターミナルでvi(vim)と書くと開く。

```
$ vi
```

閉じる時は `:q`
ESCでコマンドが入れれるようになる。
`i`でインサートモード。

ファイルを開く時は

vi 既存のファイル名

```
vi test.txt
```

vi 新規ファイル名で新規ファイル作成。

```
vi testfile
```

で、testfileが生成。


`:w`で保存。
`:wq`で保存して終了。
`:q!`で保存せずに終了。

#モード
a か i でインサートモードに移動。
ESCでコマンドモードに。
インサートとappend。

i その場でインサートモード
a 次の文字入力場所でインサートモード

コマンドモードで、
大文字 `A` で行末に移動。

移動
h　左移動
j　下移動
k　上移動
l　右移動

0　行頭
$　行末
A　行末に移動してインサートモード

ctrl+f 1ページ進む
ctrl+b 1ページ戻る

:数字　行番号に移動（例 :10 10行目に移動）

gg 文頭に移動
G 文書末に移動
Pythonのリスト/タプルからNumPy風に(indexのリストを使って)要素を抽出する



こんな感じで出来る。

```python:itemgetter_iterable_example.py
import numpy as np
from operator import itemgetter

np_list = np.linspace(0, 1, num=11)
# -> array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9,  1. ])
py_list = list(np_list)
indexes = [1, 3, 5]  # 適当なインデックス

# NumPyだとこんな感じ
np_list[indexes]
# -> array([ 0.1,  0.3,  0.5])

# Pythonのリストだとこんな感じ
itemgetter(*indexes)(py_list)
# -> (0.1, 0.3, 0.5)
```

NumPyに一回変換すればいいじゃん、っていう話もある。