OmniAICreator/Qiita-1.07M huggingface dataset:
FT232H 245 Sync.FIFOモードを使ってみる

#この記事は
[FT232H](http://www.ftdichip.com/Products/ICs/FT232H.htm)のSynchronousFIFOモードでUSB-パラレル変換した時のメモ
エコーさせたら一応上下合わせて34MB/s出せた。

#FT232H
PCと組込み機器の通信インターフェースの強い味方、FTDIが出しているICの1つ。
USBからUART,パラレル,...など内蔵EEPROMを書き換えることで、いろいろ変換できる。
PC側からは仮想COMポート(VCP)又は専用ドライバのどちらかで認識できる。
ドライバはネイティブ版と、<S>使いにくい</S>.NETラッパーが用意されている。

#FT245 Synchronous FIFOモード
FT245と同じインターフェースで通信するモードで、
USBを8ビットパラレル(信号線は送受兼用)に変換する。
信号はFT232Hが出力するクロック信号(60MHz)に同期している。
データシート曰くMax 40MB/s
なおVCPは使えないので、専用ドライバを触る必要がある。

#ハードウェア構成
FPGA上にシーケンサを構成し、FT232Hの制御と送受信を行う。
送受データはFT232Hのクロックとは非同期のクロックドメインとやり取りするために、
非同期FIFOをかます。

```
 
               : FPGA
               :      --> Rx Async FIFO -->
PC <-> FT232H <-> FSM           :
               :      <-- Tx Async FIFO <--
               :                :
               :      60MHz     :     X MHz

```
FSMは`Idle, Write, ReadyToRead, Read`の四状態で管理。
PCからの受信を優先して行うように遷移条件を書いた。
この辺りは使い方によっていろいろあると思う。
(例えばPCへ送信するだけならFSMいらない。txeを見てStall/Readyを出すだけ)

非同期FIFOは[ここ](http://members3.jcom.home.ne.jp/zakii/digital/18_async_fifo.htm)を参考にした。
このまま使うと出力が1クロック遅れるのでFFをかまさずに出力するように変更する。

#FT232H設定
設定用ソフトFT_Progを使って、モードを245FIFO、ドライバをFTD2xxに変更する。

#通信用PCソフト
FT_ProgだけではSync.FIFOモードにはならず、Async.FIFOモードになる。
通信ソフト側で設定してやる必要がある。
こんな感じ(C#)

```csharp
uint deviceID = 0; //2つ以上つながっている場合は対象のデバイスを探す必要がある
FTDI ftdev = new FTDI();
ftdev.OpenByIndex(deviceID);
ftdev.SetBitMode(0x0, FTDI.FT_BIT_MODES.FT_BIT_MODE_SYNC_FIFO); //Sync.FIFOに設定
```

ドライバは.NETラッパーも用意されているのでC#で書けるのだが、
使いにくいので自分でラッパー作るかラッパーのラッパーを作ったほうがいいと思う。

#動作テスト
100MBぐらいのデータをエコーさせてみた。
結果上下合計34MB/sぐらい出せた。
なお、FTDI.Write()で一度に256byte以上書き込もうとすると高確率でデータが破損した。どこに問題があるのかは現在謎。
255byte以下にしてFTDI.Write()を連発する分には問題ないが、速度は落ちる。
AASM 定義した状態を一覧で取得する Rails, Ruby, Active Record

AASMはclassの状態遷移を実装するgemです。

インストール

```
# Gemfile
gem 'aasm'
```

定義例（Model）

```
class Hoge < ActiveRecord::Base
  include AASM
  aasm column: :status do
    state :deactivated, initial: true
    state :activated
    # activated -> deactivated
    event :deactivate do
      transitions from: :activated, to: :deactivated
    end
    # deactivated -> activated
    event :activate do
      transitions from: :deactivated, to: :activated
    end
  end
 ```

定義したステータスの一覧は下記命令で取得できます。

```
pry(main)> Hoge.aasm.states.map(&:name)
=> [:deactivated, :activated]
```
速くて運用コストが低い位置情報検索アプリを作るときのベストアーキテクチャは？

[mixiグループアドベントカレンダー](http://qiita.com/advent-calendar/2015/mixi)9日目です！

ちょっと前に個人的に開発したアプリで得られた、位置情報検索関連の知見について共有しようと思います。

今回ご紹介するのは、位置情報を使って現在地付近の特定の場所を検索するようなアプリを作ることを考えた場合に、こう作っておけば間違いないんじゃないかと思うアーキテクチャです。
これから会社でも個人でも、位置情報を利用したアプリを作ろうと考えている方の参考になれば幸いです。

まず、アプリに求める要件を書き出します。

# 要件
- 地図を画面全体に展開するタイプのアプリで、画面内に表示対象(建造物など)がある場合はそれを表示する
- 地図をドラッグして動かせる。__動かしている間でも__表示対象があればそれを表示する
- 個人的なアプリでも大丈夫なように、__運用コスト(時間やお金)がかからない__

# 設計を考える前に
位置情報検索を行おうと思った時、すぐに考えつくのは Elasticsearchなどを用いたものでしょう。
クライアントで表示している矩形領域の位置情報をサーバーに送り、サーバー側で先に挙げたElasticsearchなどを用いて範囲内にある表示対象を検索します。しかしこの設計では、上に挙げた要件を満たせないことがわかります。

例えば、ドラッグ中であっても表示対象を更新できるようにするためには、そのまま作ると地図が動く度にサーバー側にリクエストが飛び、1ユーザーからのリクエストがとんでもなく多くなってしまいます。
これではサーバー側の負荷が心配なだけでなく、金銭面でもコストが高くなりそうです。

# 設計案

サーバー側で検索処理を実行してクライアントに結果を返すアーキテクチャだと、更新頻度が多い場合にはどうしてもNetwork I/Oが気になります。逆に考えると、Network I/Oがいっさい発生せずに検索できれば、高速に検索結果を表示できるし、サーバー側のコストも下がるのではないでしょうか！？
そこで今回紹介するアーキテクチャパターンはクライアント側ですべてを完結させる手法になります。
クライアントで完結させることで、次のようなメリットがあります

- 通信が発生しない
- 高速
- サーバー側の運用コストがほぼ0

通信が発生しないので、オフライン時でも検索結果を表示することができます(地下鉄で圏外になっても検索できる！)。
クライアントで検索処理を実行するため、Networkを介さないぶんとても高速に検索結果を得ることができます。
当然サーバー側の負荷も上がらないため、利用者が増えても問題なしです。

まさに 速い！安い！最高！ですね。

ひとつ、クライアントで完結させる際に気になる点として、表示対象データの更新タイミングをどうするかというのがあると思います。これは、位置情報検索で利用する検索対象に建造物が多いこと(更新頻度が多くない)から、一日に一回程度バックグラウンドでデータを取得しなおせば済むとわかります(実際はもっと頻度を下げて良いと思います)。
仮に人物の位置情報などの動的な検索対象を扱う場合でも、データの更新タイミングを調整しさえすれば、クライアント側で処理したほうが良いケースがほとんどだと考えています。

あとは実装方法を考えるだけです。
...が！しかしここでひとつ問題があります。
iOSは当然の事ながらデーモンプロセスの起動ができないため、位置情報検索エンジンとアプリケーションは同一プロセスでなければなりません。


そこで今回自分が目をつけたのがGroongaです。

# Groonga !?

Groongaは自然言語処理で用いられることが多いですが、位置情報検索機能も備えています。
よくElasticsearchと比較されているので、比較記事を読まれた方も多いかもしれません。
特筆すべきはGroongaがファイルベースのアーキテクチャを採用している点で、SQLiteのようにデーモンを立ちあげずに利用することができる点です。(本当はRealmに位置情報検索機能があったらなーと思いましたが、まだ実装されていないようです)

しかしGroongaに関してもモバイル用途での利用などは当然ながら考えられていないため、
iOS/Androidから利用するには一手間加える必要があります。
ですが、GroongaはC言語で書かれているため、軽微な修正でアプリに統合できますし、
ドキュメントは少ないですが、サンプルコードは結構あるのでそちらを参照しながらC APIを駆使して実装することができます。

まだライブラリとして完成されてはいませんが、参考までに自作アプリに組み込んだ際に実装したものを公開します。
この記事で興味を持って頂けた方は https://github.com/goccy/iroonga を参照されると、C APIとのつなぎ込み部分などを理解して頂けると思います。

# さいごに

メリットばかり書きましたが、デメリットもあります。
データをクライアント側にすべて置くため、ストレージ使用量が大きいことです。
(実はこれはGroongaが参照するファイルをgzip圧縮することで、劇的に減らすことができるとわかっています)

そこで我こそは！と思う方がいれば、
冬休みを使ってストレージも食わない、モバイル用途の高速な位置情報検索エンジンを作ってみるのも面白いんじゃないでしょうか!?


明日は、[radioboo](http://qiita.com/radioboo) さんが面白い記事を書いてくれますよ！
冗長度が低下した時の対応(recover, auto_recover)

サーバエラーなどでinstanceが落ちて冗長度が低下してしまった時の対処方法です
![b363487c-bf8f-e597-9b75-3729a69a9141.png](https://qiita-image-store.s3.amazonaws.com/0/103558/52fafde2-4f5a-4d30-368c-158470d7eab5.png)

# 条件
"<b>localhost_10001</b>", "<b>localhost_10002</b>", "<b>localhost_10003</b>"の3インスタンスでクラスターを組んでいた時、"<font color='red'><b>localhost_10001</b></font>"が落ちてしまった時を例にして説明します

# 冗長度復帰手順(recover)
## 1. ステータス確認
まずはtelnetで生きているインスタンスへアクセスし、現在のstatusを確認します

```bash
$ telnet telnet 10002
> stat node
.
routing.nodes.length 2 #=> 3から2へ
routing.nodes ["localhost_10002", "localhost_10003"]  #=> localhost_10001が落ちている
.
routing.short_vnodes 133 # 冗長度の低下したvnodeの数
routing.lost_vnodes 0    # 冗長度が0になったvnodeの数
.
.
```
- localhost_10001が落ちたため、このinstanceが担当していたvnodeの冗長度が落ちています
- デフォルトで冗長度2なので1instance落ちてもデータの読み書きは問題なく行えます
  - ただし該当vnodeは冗長度1の状態

## 2. 冗長度回復
### コマンド
```
> recover
```
- 生きているインスタンスの中で、冗長が落ちているvnodeの担当を再アサイン、及びデータのコピーを行うことで冗長度の回復を行う
- どれか1インスタンスで実行すればOKです

### 実行

```bash
> recover # recover実行

> stat run_recover
  stats.run_recover true # recoverが実行中であることを示します

> stat short
  routing.short_vnodes 127 # 段々減っていきます
```
- recoverプロセスが進むにつれて、`routing.short_vnodes`の数が減っていきます

## 3. 終了確認

```bash
> stat run_recover
  stats.run_recover false # recoverが終了するとfalseに戻ります

> stat short
  routing.short_vnodes 0 # 冗長度の低下したvnodeが0になっています
```
- recoverプロセスにかかる時間は、データ量やサーバスペックによって異なります

# AUTO RECOVER機能
上記では手動でrecoverを実行していましたが、冗長度が落ちた際に自動でrecoverを実行するように設定することも可能です

## コマンド
```
> set_auto_recover [ 'true' | 'false' ] <sec>
```
- trueで起動、falseで停止します
- \<sec>は、冗長度の低下を検知してから何秒後にrecoverを実行するかを指定します
  - 猶予期間のようなもので、recoverではなく他の対処法をとりたくなった場合には、この時間内に`set_auto_recover false`を実行することでrecoverの実行をキャンセルすることが可能です

# 参照URL
ROMA Recovery redundancy: http://roma-kvs.org/learn/recovery_redundancy.html
ROMA Commands Page: http://roma-kvs.org/commands.html
Mac にElasticsearch の環境を構築する（Homebrewでバージョン指定したインストールを行う）

# 目的

+ `AWS`上で`Elasticsearch`動かしてきたけどやっぱりお金かかるので折角`Mac`あるし`Mac`上で完結させる
+ 既に本番環境にサービスインしてる状態の`Elasticsearch`となるべくバージョンは合わせたい
+ `Homebrew`で入れたい

# 各種設定確認

```bash
$ brew --version
0.9.5 (git revision 18cf8; last commit 2015-12-09)
$ brew list
autoconf		libevent		mysql			pkg-config		readline		wget
freetype		libpng			nkf			qt			redis			xz
imagemagick		libtool			node			rbenv			ruby-build
jpeg			mongodb			openssl			rbenv-gem-rehash	tmux
```

# 利用するもの

+ [homebrew-versions](https://github.com/Homebrew/homebrew-versions)

## なぜこれを使用しようと思ったか

+ いくつかの記事で`versions`を探すコマンドとして紹介された物を実行した時にもうサポートしてねぇよ！代わりにこれ使えよ！とツンデレ風に言われたので

```bash
$ brew versions elasticsearch
Error: The `versions` command is no longer supported.
You can use the homebrew-versions tap instead:
  https://github.com/Homebrew/homebrew-versions
Or use `brew log` to browse the git history.
```

# やったこと

+ 基本的には[この方](https://github.com/Homebrew/homebrew-versions/blob/master/README.md)の仰るとおりに進めていった

```bash
$ brew update # formuls を更新
$ brew install homebrew/versions # Version が色々入ってる奴
$ brew install homebrew/versions/elasticsearch17
######################################################################## 100.0%
==> Downloading https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.3.tar.gz
```

# 結果

```bash
$ brew list | grep elasticsearch
elasticsearch17
$ elasticsearch
$ curl -XGET 'http://localhost:9200/'
{
  "status" : 200,
  "name" : "Sagittarius",
  "cluster_name" : "elasticsearch_geshi_yoshiharu",
  "version" : {
    "number" : "1.7.3",
    "build_hash" : "05d4530971ef0ea46d0f4fa6ee64dbc8df659682",
    "build_timestamp" : "2015-10-15T09:14:17Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}
```

+ 無事に追加された！
[Xcode]バージョンアップ時などにpluginsが効かなくなる時の対処

バージョンアップのたびにググってたので自分メモも兼ねて．

- まずは現バージョンのUUIDをチェック
 
```
defaults read /Applications/Xcode.app/Contents/Info.plist DVTPlugInCompatibilityUUID
```
- それを各プラグインの`Info.plist`に追加
  
```
find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist | xargs -IFILE defaults write FILE DVTPlugInCompatibilityUUIDs -array-add 上のコマンドで得たUUID
```

あとはXcodeを再起動して`Load Bundle`を選択すれば完了．

### 手が滑って`Skip Bundle`を選択してしまった時の対処

以下を実行すれば初期化される．
最後の`7.1.1`の部分は現在のXcodeのバージョンを指定

```
defaults delete com.apple.dt.Xcode DVTPlugInManagerNonApplePlugIns-Xcode-7.1.1
```

### コピペも面倒な人はaliasに登録

```
alias xcode-uuid='defaults read /Applications/Xcode.app/Contents/Info.plist DVTPlugInCompatibilityUUID'
alias xcode-add='find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist | xargs -IFILE defaults write FILE DVTPlugInCompatibilityUUIDs -array-add'
```

こんな感じで一瞬で設定できる．

```
$ xcode-uuid
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
$ xcode-add xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
```

### **さらに簡単に実行する**(2016/06/09 追記)
```
function update_xplugins() {
  uuid=`defaults read /Applications/Xcode.app/Contents/Info.plist DVTPlugInCompatibilityUUID`
  find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist | xargs -IFILE defaults write FILE DVTPlugInCompatibilityUUIDs -array-add $uuid
}
```

```
$ update_xplugins
```
### 参考
自分が登録してるPluginsを紹介

・<a href="https://github.com/ksuther/KSImageNamed-Xcode">KSImageNamed</a>
　UIImageのファイル名を補完してくれる．
　画像プレビュー機能もある．
　Swiftには対応してないのが残念．

・<a href="https://github.com/omz/ColorSense-for-Xcode">OMColorSense</a>
　エディタ上のUIColorをビジュアライズ．
　フォーカスがあたるとカラーが出るので色の確認に便利
　これもSwiftには対応してない．
　でも，`[UIColor redColor]`みたいに手打ちすると同じようにビジュアライズしてくれる．

・<a href="http://wafflesoftware.net/hexpicker/">Hex Color Picker</a>
　カラーピッカーで，色を16進数で指定できるようになる．

・<a href="https://github.com/XVimProject/XVim">XVim</a>
　XcodeでもVim使いたい人向け

・<a href="https://github.com/onevcat/VVDocumenter-Xcode">VVDocumenter-Xcode</a>
　Javadoc風のコメントを自動生成してくれる．

・<a href="https://github.com/trawor/XToDo">XToDo</a>
　TODO,FIXME,???,!!!! がついたコメントを一覧表示してくれる．
　Swiftでは`#warning`が使えないこともあり，割と重宝
jacoco4sbtでカバレッジの閾値を設定

build.sbtに下記のように追加。



```
jacoco.thresholds in jacoco.Config := Thresholds(
  instruction = 50,
  method = 50,
  branch = 50,
  complexity = 50,
  line = 50,
  clazz = 50)
```

sbt力がないとソースから設定の仕方を見つけるのは厳しい...

#### 参考サイト

[how-to-fail-build-on-low-test-coverage-with-activator-sbt](http://stackoverflow.com/questions/26510218/how-to-fail-build-on-low-test-coverage-with-activator-sbt)
Amazon Product Advertising API関連リンク集

# Amazon Product Advertising APIとは
Amazon Product Advertising APIとは、Amazonの商品や関連情報をプログラムから参照できるAPIのことです。
Amazonアソシエイトと組み合わせることで紹介料を得ることもできるみたいです。

# Amazon Product Advertising APIを知るためのリンク集
## 公式
[Product Advertising API](https://affiliate.amazon.co.jp/gp/advertising/api/detail/main.html)
[Product Advertising API開発者ガイド](https://images-na.ssl-images-amazon.com/images/G/09/associates/paapi/dg/index.html)
##参考になるサイト
[Amazon Web サービス入門(Product Advertising API)](http://www.ajaxtower.jp/ecs/)
サービスを利用するためのアカウント作成から丁寧に解説。
一部古い情報があるので注意。
例えば、アクセスキーとシークレットアクセスキーの取得方法は以下の記事が参考になります。
[Amazon Product Advertising APIで使うシークレットアクセスキーを取得する](http://blog.makotokw.com/2014/05/21/get-aws-secret-access-key-for-amazon-product-advertising-api/)
##便利なサイト
[Product Advertising API Scratchpad](http://webservices.amazon.co.jp/scratchpad/index.html)
これも公式かも。あるリクエストを送信するとどんなレスポンスが返ってくるかをテストできるツール。
またリクエストURLを確認出来るほか、JAVA、PHP、RORに対応したコードスニペットもある。
bash | 正規表現で連続したスペースを削除する

## 問題

スペースの連続を削除したい。

```:test.sh
#!/bin/bash 

echo '   abc' | sed 's/\s+//g'
echo '   abc' | sed 's/\s*//g'
echo '   abc' | sed 's/ +//g'
echo '   abc' | sed 's/ *//g'
```

## 結果

4番目だけ動く。

```
   abc
   abc
   abc
abc
```

## 解決

`-E` オプションで拡張正規表現を有効にしよう。

```:test.sh
#!/bin/bash 

echo '   abc' | sed -E 's/\s+//g'
echo '   abc' | sed -E 's/\s*//g'
echo '   abc' | sed -E 's/ +//g'
echo '   abc' | sed -E 's/ *//g'
```

下の二つは動くようになる。

```
   abc
   abc
abc
abc
```

# 補足
本記事のコメントも参照のこと。（ありがとうございます）



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
goconveyのSetUp, TearDownの実行順序

Go言語のテストツールGoConveyのSetUp, TearDownを行いたいときに記述箇所や実行順序が分かりづらかったので試してみました。

```go:convey_test.go
package practice

import (
    . "github.com/smartystreets/goconvey/convey"
    "testing"
    "fmt"
)

func TestConvey(t *testing.T) {
    fmt.Println("1")
    Convey("Top level convey", t, func() {
        Println("2")
        defer Println("deferred func 1")
        Convey("first test convey", func() {
            Println("3")
            So(1, ShouldEqual, 1)
        })

        Println("betweeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeen")
        defer Println("deferred func 2")

        Convey("second test convey", func() {
            Println("4")
            So(2, ShouldEqual, 2)
        })

        Println("end of top level convey")

        Reset(func () {
            Println("reset")
        })
    })
}
```

上記のテストコードがあるディレクトリで下記コマンドを実行

```zsh
goconvey
```

プリントされる順番は以下のようになる

```zsh
1
2
3
betweeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeen
end of top level convey
deferred func 2
deferred func 1
reset
2
betweeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeen
4
end of top level convey
deferred func 2
deferred func 1
reset
```
vagrantのvboxsf上でperlのワンライナーがtext busyになる現象

***※解決できません。。解決方法知ってる方がいましたら、教えてください。。。***

今までサーバ上で動いていたものがvagrantの仮想環境上で動かないで調べてみましたら、perlのワンライナーでこけてました。

現象としては、perl実行時に以下のエラーになると、

```shell-session
Can't remove ファイル名: テキストファイルがビジー状態です, skipping file.

※LANG Cの場合はこちら
Can't rename ファイル名 to aaa.txt.bak: Text file busy, skipping file.

```

- 実験

```shell-session
[root@localhost test]# pwd
/vagrant/test

※カレントディレクトリはvagrantのvboxfs配下

[root@localhost test]# echo aaa > aaa.txt
[root@localhost test]# cat aaa.txt
aaa

※ファイルを作成

[root@localhost test]# perl -p -e 's/aaa/bbb/g' aaa.txt
bbb

※perlで文字の置き換え＆標準出力（問題なし）

[root@localhost test]# perl -i -p -e 's/aaa/bbb/g' aaa.txt
Can't remove aaa.txt: テキストファイルがビジー状態です, skipping file.

※【-i】追加して、ファイルの置換失敗


[root@localhost test]# perl -p -e 's/aaa/bbb/g' aaa.txt > bbb.txt
[root@localhost test]# ls
aaa.txt  bbb.txt
[root@localhost test]# cat bbb.txt
bbb

※標準出力する分には問題なし


[root@localhost test]# rm aaa.txt
rm: remove 通常ファイル `aaa.txt'? y
[root@localhost test]# ls
bbb.txt
[root@localhost test]#

※もちろんパーミッションに問題ないので、元ファイルは消せる

```

perlで【-i】オプション付けるとエラーでこける

同様にsedだとどうでしょうか？
先ほど作成したbbb.txtを削除して。。。

```shell-session
[root@localhost test]# echo aaa > aaa.txt
[root@localhost test]# cat aaa.txt
aaa

※ファイル作成

[root@localhost test]# sed -e 's/aaa/bbb/g' aaa.txt
bbb

※標準出力で問題なし

[root@localhost test]# sed -i -e 's/aaa/bbb/g' aaa.txt

※置換も特にエラーなし

[root@localhost test]# ls
aaa.txt
[root@localhost test]# cat aaa.txt
bbb

※ファイルの中身が置換されてることが確認

```

当面はsedで凌ぐか。。。

pythonも同様の現象があり、こちらはパッチがあるっぽいな。。。
https://bugs.python.org/issue25717
ユーザーを指定してその人のTweetを全て取得する

学部３年の後期実験の一つである[情報可視化実験](http://yatani.jp/teaching/doku.php?id=2015infovislab:start)において、データセットとして用いるために特定の人のtweetを全て取得したかったのでその方法についてまとめてみた。
#TwitterAPIを用いない方法
twitter公式にログインして、設定→ユーザー情報→tweet履歴をリクエストから
全てのtweetが含まれているcsvファイルを取得できる。自分のアカウントのtweetを取得するだけならこの方法が最も早い。![20151209-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/103953/ac0d29e6-9873-26be-bdd2-3aebbace9286.png)







#試した方法
情報を可視化するためにd3.jsを用いていたので言語はJavaScriptを用いた。
JavaScriptでtwitterAPIを叩く方法については[このページ](http://qiita.com/rev84/items/eaef78275ba295c9858b)を参考にした。
[ここ](https://github.com/johan/oauth-js)からoauth.js, sha1.jsをダウンロードして適切な場所に置き、さらに[こちら](https://apps.twitter.com/)からtwitterのApplication登録してConsumer key等を取得して先ほどのコードに打ち込むとAPIが叩けるようになる。

まず、statuses/user_timelineを用いてユーザーのtweetを全取得しようとしたがこれは過去3200tweetまでしか取得出来ないという問題があった。また、search/tweetsを用いて日付指定することで過去のtweetを取得しようとしたが、これは過去一週間までしか遡れないという問題があった。

#成功した方法
公式のクライアントでは過去の日付を指定してtweet検索できることから、何らかのAPIがあるはずだと調べていると、search/universal APIというものがあった(詳しくは [こちら](https://gist.github.com/cucmberium/e687e88565b6a9ca7039))。
これを用いると、過去一週間より前も遡ることができた。
このAPIを用いるには公式クライアントのConsumer keyが必要であるので、[ここ](https://gist.github.com/uhfx/3922268)から適当に選ぶ。それに対応するAccess Tokenを取得したいので、[こちら](https://github.com/jugyo/get-twitter-oauth-token)などを参考に取得する（ban等された時のリスクを考え捨て垢でやることをお勧めする。）
コードはこんな感じ（抜粋なのでそのままでは動かない恐れあり。）

```lang:get_all_tweet.html
<html lang="en"><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Get tweet </title>
<style type="text/css">
</style>
<script src="lib/oauth.js"></script> 
<script src="lib/sha1.js"></script>
<script src="getTwitterAPI.js"></script>
</head>
<body>
<script type="text/javascript">
var screen_name = "XXXXXXXXXXX";
var count = 50;
var max_id = 999999999999999999;
var max_id_old;
var url = "https://api.twitter.com/1.1/search/universal.json?q=from%3A" + screen_name  + " max_id%3A" + max_id + "&count=" + count +  "&modules=status";


var hoge = setInterval(get_tweet,5000);
function get_tweet(){
	console.log(max_id);
	url = "https://api.twitter.com/1.1/search/universal.json?q=from%3A" + screen_name  + " max_id%3A" + max_id + "&count=" + count +"&modules=status";
	getTwitterAPI(url,"get_all_tweet");
	if(max_id == max_id_old){
		clearInterval(hoge);	
	}
	max_id_old = max_id;
}
function get_all_tweet(json){
   json.modules.forEach(function(d,i){
   		console.log(d.status.data);
   		max_id = d.status.data.id;
   });
}
</script>
</body>
</html>
```

getTwitterAPI()を実行するとコールバック関数の第一引数にurlを叩いて帰ってきたObjectが渡される。当然一回APIを叩くだけでは全てのtweetを取得することは出来ないので、max_idに取得できたtweetのidを格納し更新し、複数回実行することで全てのtweetを順番に取得した。取得し終わったらmax_idが更新されなくなるので、そうなるまで実行させれば良い。(APIの詳細の仕様や返ってくるdataについては[公式のドキュメント](https://dev.twitter.com/overview/documentation)等を参照してください。)

#おわりに
この手法を用いることで、tweetを全て取得することに成功したが、割と危ない手法を用いている気がするので利用する時は注意して頂きたい。
環境変数取得(Java)

[これ](http://qiita.com/AinoMegumi/items/edc89463d04abfb486bc)作ったからJavaのも作るかって思ったんだけど

```java:Main.java
public class Class7 {
	public static void main(String[] args){
		String env = System.getenv("UserProfile");
		System.out.println(env);
	}
}

```
たったこれだけだったわorz
※分かりやすくするために２行にしました。

ちなみに、存在しない環境変数が指定された場合、nullが返るようです。
AWS/EC2にCentOS7を入れてDockerホストを作成　その1

AWS の EC2 で色々 Docker 試してたんですけど、色々とはまってしまったのでここに書いておこうと思いました。

AWS のアカウントを持ってる前提での説明となります。

#CentOS7 を EC2 に立ち上げる

ホストOSに CentOS7 を使うのは単純に僕の好みです。Amazon Linux でも Ubuntu でもいいと思いますが、ここでは CentOS7 を扱います。

EC2 のダッシュボードから「インスタンス」→「インスタンスの作成」と進み、「AWS Marketplace」から迷わず「CentOS」を選びます。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/104477/6ea2dd02-cb65-052a-e314-f8173e10717d.png)

次に「ステップ 2: インスタンスタイプの選択」になりますが、無料利用枠で使える「t2.micro」はメモリが1GBということで、使ってみると色々と厳しいです（swapを設定すれば使えないことはないですが）。ここでは「t2.small」を選ぶことにします。お金がある人は CPU のCore数が2以上ある「t2.medium」以上を使うことをお勧めします。

ここで「確認と作成」を押さずに「次の手順：インスタンスの詳細の設定」をポチッとします。

「ステップ 3: インスタンスの詳細の設定」ではここでは特に何も変えません。そのまま「次の手順：ストレージの追加」を押します。

「ステップ 4: ストレージの追加」ではストレージの追加をします。せっかく Docker のホストにするのに、ディスクが少ないと色々残念なことになりそうですから。私は以下のように設定してみました。ルートボリュームとは別に一つボリュームを追加しています。お金がある人なら速い SSD（プロビジョンドIOPS）とか使うといいんでしょうね。

![002.png](https://qiita-image-store.s3.amazonaws.com/0/104477/6f21d797-ffb0-e95a-d77e-562d21e5d9f3.png)

「次の手順：インスタンスのタグ付け」を押します。

「ステップ 5: インスタンスのタグ付け」では、適当に好きなタグをつけましょう。「次の手順：セキュリティグループの設定」を押します。

「ステップ 6: セキュリティグループの設定」では、適当に…では駄目で、ちゃんとセキュリティの設定をしましょう。私は既存のグループから流用しました。当然ですが、最低限 SSH だけは通す必要があります。設定したら「確認と作成」を押します。

「ステップ 7: インスタンス作成の確認」の画面で最終確認をしてから「作成」をクリックすると、インスタンスが作成されます。ここで SSHログインの際に利用するキーペアの選択画面になりますので、既存のキーペアを選択するか、新たにキーペアを作成して「インスタンスの作成」をポチります。インスタンスが作成され、しばらくするとインスタンスが起動しているでしょう。

![003.png](https://qiita-image-store.s3.amazonaws.com/0/104477/71a6752c-6bfb-c782-f80b-33d838d2366e.png)

その2に続きます。
[AWS/EC2にCentOS7を入れてDockerホストを作成　その2](http://qiita.com/ABE_TAKASHI/items/3adc28fd7f4fb2a2b993)
環境変数の取得(C++)

ゲームのセーブデータのディレクトリをゲームと同じフォルダにするかAppDataに入れるか悩んでいる時ふと思いつき、書いてみました。

```cpp:get_environment_variable.cpp
#include <cstdlib>
#include <string>
#include <stdexcept>

std::string get_environment_variable(const char* environment_name) {
	size_t buf;
	char buffer[1024];
	if (getenv_s(&buf, buffer, 1024, environment_name)) throw std::runtime_error("read error");
	if (buf == 0) throw std::runtime_error("not such environment variable");
	return std::string(buffer);
}
```
使用例

```cpp:main.cpp
#include <iostream>
#include <stdexcept>
int main() {
	try {
		std::cout << get_environment_variable("UserProfile") << std::endl;
		return 0;
	}
	catch(std::exception &er){
		std::cout << er.what() << std::endl;
		return -1;
	}
}
```

# 実行結果とechoコマンドで呼んだ時の結果の比較
## 実行結果
![GetEnvironmentApplication.png](https://qiita-image-store.s3.amazonaws.com/0/94629/ab6e4af3-b71d-1ef1-631e-ce98edb09ff2.png)

## echoコマンドで呼んだ時の結果
![echo_result.png](https://qiita-image-store.s3.amazonaws.com/0/94629/4e92f5ba-a9c0-e3f7-1847-42ad339f0c16.png)

絶対バッファーのサイズ無駄に大きい気がするけどまあいっか。
ゲーム作るうえで環境変数呼ぶなら日本語パスを想定しないといけないしね。
だってＰＣ基本的なレベルまでしかできないという人とかはユーザー名日本語のこと多いしね。

>@iwadonさんのアドバイスに基づいて作り直してみました。

>```cpp:get_environment_variable.cpp
#include <cstdlib>
#include <string>
#include <stdexcept>
std::string get_environment_variable(const char* environment_name) {
	size_t buf;
	if (getenv_s(&buf, NULL, 0, environment_name)) throw std::runtime_error("read error");
	if (buf == 0) throw std::runtime_error("not such environment variable");
	getenv_s(&buf, buffer, buf, environment_name);
	return std::string(buffer);
}

>```
>使い方は同じです。

>>@yumetodo さんによってさらに編集がかかりました。

>>```cpp:get_environment_variable.cpp
#include <cstdlib>
#include <string>
#include <stdexcept>
std::string get_environment_variable(const char* environment_name) {
	size_t buf;
	if (getenv_s(&buf, NULL, 0, environment_name)) throw std::runtime_error("read error");
	if (buf == 0) throw std::runtime_error("not such environment variable");
	std::string buffer;
	buffer.resize(buf + 1);//reserve
	getenv_s(&buf, &buffer[0], buf, environment_name);
	buffer.resize(std::strlen(buffer.c_str()));//resize
	return buffer;
}
>>```
>>もちろん使い方は変わりません。
CS-Cartの言語変数.poファイル更新を適用する方法

1. var/lang/ja/core.poなどを変更する
2. 管理画面にて「一般設定」→「言語」→「言語の管理」を開く
3. 日本語の「Update translations」を開く<img width="978" alt="Screen_Shot_2015-12-09_at_10_43_55.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/716fa8e2-7962-a00e-bafd-73923f2644aa.png">
4. 「ローカル」を押すとファイルを選べるので、var/lang/ja/core.po などを選択して「更新」を押す<img width="668" alt="一般設定____言語_-_管理画面.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/affd1243-73bb-5955-deba-c8e725d9736d.png">
連続な重複番号を除く


```scala

// input
val xs = (1, "aaa")::(1, "bbb")::(1, "ccc")::(2, "abc")::(3, "xxx")::(3, "kkk")::(1, "abcde")::(1, "qwee")::Nil

// output
val expect = List((1, "aaa"), (2, "abc"), (3, "xxx"), (1, "abcde"))

// fold
val resultFold = xs.foldLeft(List[(Int, String)]()){ 
               case (Nil, t) => List(t)
               case (ys@((i, s)::_), t@(j, q)) => if(i == j) ys else t::ys 
           }.reverse
assert(expect == resultFold)

// invert
val resultInvert = xs.head :: (xs, xs.tail).invert.collect{ case ((i, x), (j, y)) if i != j => (j, y) }
assert(expect == resultInvert )
```
Carrierwaveでfilenameに日時を使いつつresizeしたらfilenameが一致しなくてハマった

# やりたかったこと
* 画像アップロード時に時系列で過去分履歴を残したいのでfilenameに日時をいれたい
* 特定解像度にresizeしたものも用意したい

# サンプルコード
1. filenameをoverrideしてoriginal_filenameに日時を追加する
1. インスタンス変数化してstore時とupload時のfilenameを一致させる
1. smallとlargeというversionでresizeする

```
 class ImageUploader < CarrierWave::Uploader::Base
   include CarrierWave::MiniMagick
    
   def filename
     @name ||= "#{Time.zone.now.strftime("%Y-%m-%d-%H-%M-%S")}-#{super}" if super
   end
    
   version :small do
     process resize_to_fill: [100, 100]
   end
                                                                                                                                                                                                                                  
   version :large do
     process resize_to_fill: [800, 600]
   end
 end
```

# 発生した問題
* storeしたfilenameとuploadされたfilenameが1秒ずれる
* resizeしたfileにおいてだけ稀に発生する

# 原因

```
   def filename
     @name ||= "#{Time.zone.now.strftime("%Y-%m-%d-%H-%M-%S")}-#{super}" if super
   end
```

ここでnameをインスタンス変数化することで、resize時にもfilenameが同一になるだろうと考えていた。
しかし実際resize時の処理はCarrierwave内部でcallbackとして呼びだされ、同クラスの別インスタンスを生成して行われる。
その結果resize時には別インスタンスでこのfilenameが呼ばれるため、nameはnilとなり処理時刻で生成されるためだった。

# 解決方法
rezise時のfilenameとして、原寸画像Upload時のインスタンスのものを使うように指定した。

#### コード変更点

```
   version :small do
     process resize_to_fill: [100, 100]
+
+    def filename
+      model.send(mounted_as).filename
+    end
   end
                                                                                                                                                                                                                                  
   version :large do
     process resize_to_fill: [800, 600]
+
+    def filename
+      model.send(mounted_as).filename
+    end
   end
```

model.send(mounted_as)は、マウントしてるmodelのattributeです。
Versionの処理内でこれを呼び出すことで原寸画像Upload時のインスタンスを取得しています。

これ解決一応したけどversion毎に毎回これ指定するの面倒なので、もっといい解決方法あるんじゃないのか？とも思うので、もっといい方法あったら追記します。

# 参考
* [How to: Use a timestamp in file names · carrierwaveuploader/carrierwave Wiki ](https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Use-a-timestamp-in-file-names)
* [How to: Customize your version file names · carrierwaveuploader/carrierwave Wiki](https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Customize-your-version-file-names)
cocos2d-xで課金処理をSDKBoxでしようとして断念した話し

vermudaのアプリ担当の小林です。

現在の案件をcocos2d-x v3.8で行っています。
その中で課金処理をSDKBoxのiapで実装しようとして以下のドキュメントのまま実装すればすぐに課金自体はできるようになりました。

SDKBoxのin-App-Purchaseのドキュメント
http://docs.sdkbox.com/en/plugins/iap/v3-cpp/

そのあとで不正レシート対策のためにサーバへレシート情報を送信しようとした時に
SDKBoxでそのような処理がないことに気がつき。。。

// SDKBoxで使用できる関数

```
virtual void onInitialized(bool ok) override;
virtual void onSuccess(sdkbox::Product const&amp; p) override; 
virtual void onFailure(sdkbox::Product const&amp; p, const std::string &amp;msg) override;
virtual void onCanceled(sdkbox::Product const&amp; p) override;
virtual void onRestored(sdkbox::Product const&amp; p) override;
virtual void onProductRequestSuccess(std::vector&lt;sdkbox::Product&gt; const &amp;products) override;
virtual void onProductRequestFailure(const std::string &amp;msg) override;
void onRestoreComplete(bool ok, const std::string &amp;msg);
```

購入処理が終わってonSuccessでsdkbox::Productに入ってくるかと思いましたが入っているのは以下だけでした。

```
std::string name; //商品名
std::string id; //プロダクトID
IAP_Type type; //消費、非消費型
std::string title; //タイトル
std::string description;//詳細
std::string price; //価格
std::string currencyCode;//通貨コード
```

色々調べた結果、どうやら2015年12月時点ではレシート情報を取得できないみたいです。
以下のフォーラム
http://discuss.cocos2d-x.org/t/sdkbox-iap-how-to-get-receipt-after-purchase/22309

hurry up please!!って言ってますね。

リリースノート
http://docs.sdkbox.com/en/release-note/#141-release-notes

ということで今回は自前で実装になりました。。。

SDKBoxはまだまだこれからに期待ですね！

vermudaではWEBサービス・ソマートフォンアプリ開発を行っています。
また始めたばかりですがエンジニアブログもやっていますので見ていただけると嬉しいです。
http://engineer-blog.vermuda.jp/
CircleCI で Android アプリをビルドする時のTIPS

## Android アプリをビルドするには
基本、`circle.yml` に設定を記載するだけです。

## ビルド設定ファイル サンプル

```yaml:circle.yml
general:
  artifacts:
    - ./app/build/outputs/apk/
machine:
  java:
    version: oraclejdk7
  environment:
    ANDROID_HOME: /usr/local/android-sdk-linux
test:
  override:
    - echo "Nothing to do here"
  post:
    - ./gradlew compileDevelopReleaseSources
deployment:
  upload:
    branch: [master]
    commands:
      - ./gradlew assembleDevelopRelease
      - ./gradlew uploadDeployGateDevelop
      - ./gradlew assembleProductRelease
      - ./gradlew uploadDeployGateProduct
```

```groovy:build.grade
apply plugin: 'com.android.application'
apply plugin: 'deploygate'

android {
...
    signingConfigs {
        release {
            storeFile file('../release.keystore')
            storePassword System.getenv('STORE_PASSWORD')
            keyAlias System.getenv('KEY_ALIAS')
            keyPassword System.getenv('KEY_PASSWORD')
        }
    }
...
}

...
deploygate {
    userName = System.getenv('DEPLOYGATE_USERNAME')
    token = System.getenv('DEPLOYGATE_API_KEY')

    apks {
        product {
            sourceFile = file("./build/outputs/apk/app-product-release.apk")
        }
        develop {
            sourceFile = file("./build/outputs/apk/app-develop-release.apk")
        }
    }
}
...
```

## TIPS 集
### 共通設定
- JDK の設定は Oracle JDK 1.7 を使う
- `artifacts` は設定しておくと、あとから CircleCI の Webページからapkをダウンロードできる

### keystore 関連
- keystore ファイルは GitHub リポジトリに含める（※非公開リポジトリの場合）
- key alias と key password は CircleCI の Environment variables に設定する
 - https://circleci.com/docs/environment-variables
 - build.gradle 内では `System.getenv(key)` で使用できる


### デプロイ関連
- DeployGate 使うのがおすすめ
 - gradle plugin があるのでそれを使う
 - DeployGate の API KEY も Environment variables に設定する


## もっとわかりやすいドキュメントないの？
日本語の情報が不足していますので、英語のものも併せて確認するのがよいと思います

- 公式ドキュメント
 - https://circleci.com/docs/android

- 参考文献
 - [CircleCIとDeployGateでAndroidアプリのリリース作業を自動化してみた](http://tech.vasily.jp/entry/circleci_deploygate_android_app_automation)
 - [はじめてのCircleCI](http://www.slideshare.net/mogproject/circleci-51253223)
AIアナリストで使っている外部サービスについて

# はじめに
弊社waculではWebサイトの分析・改善を提案する[AIアナリスト](https://wacul-ai.com/)を運営しています。そのAIアナリストで利用している外部サービスについてまとめたいと思います。

# URL2PNG
![URL2PNG_-_Screenshots_as_a_Service.jpg](https://qiita-image-store.s3.amazonaws.com/0/85771/bcc02720-c4ca-3f54-c13c-e1b35b864b46.jpeg)

[URL2PNG](https://www.url2png.com/)はWebサイトのスクリーンショットを保存できます。魚拓的な。
パラメータとして、`Viewport` や `User agent`を指定できるので、PCとスマホの両方で見た場合のスクリーンショットをキャプチャできるのが良いです。

# imgix
![imgix_•_Real-time_image_processing_and_image_CDN.jpg](https://qiita-image-store.s3.amazonaws.com/0/85771/16eba4fc-b1be-ed51-3814-45b0b89af9ce.jpeg)

[imgix](https://www.imgix.com/)は画像をリアルタイムに加工して返してくれるサービスです。
一つの画像をサムネイルサイズや中サイズなど様々なサイズで利用したいケースや中心で切り出したいケースなどがあると思います。そういったことを簡単に行えるのが`imgix`です。

利用方法としては以下のように指定されたURLに画像のURLと加工方法をパラメータで渡すだけです。速度も問題なく、2回目以降のアクセスは加工結果がキャッシュされているそうです。
`<img src="https://xxxx.imgix.net/{画像のURL}?crop=top&fit=crop&h=148&w=264">`

# mailgun
![Transactional_Email_API_Service_for_Developers_by_Rackspace_-_Mailgun.jpg](https://qiita-image-store.s3.amazonaws.com/0/85771/bec18b1f-484f-3169-e780-55930bdaf4d9.jpeg)

[mailgun](https://www.mailgun.com/)はメール送信のAPIを提供しているサービスです。
go言語用のライブラリも用意されています。
メールの送信数に応じて料金が課金されるのですが、サービスの性質上大量にメールを送ることはしないため、ほとんど料金は発生していません。

# zopim
![チャットでオンライン接客ならZopim（ゾピム）___Zopim日本版.jpg](https://qiita-image-store.s3.amazonaws.com/0/85771/2c6ba06c-f79b-1e8d-5b0d-202ff6573400.jpeg)

[Zopim](https://zopimjp.com/) はWebサイト上でお客様とチャットでコミュニケーションできるサービスです。
最近、Webサービスでもこういった機能があるサイトをよく見かけます。

# Zendesk
![Zendesk_Japan_-_カスタマーサポートソフトウェア___ヘルプデスクシステム.jpg](https://qiita-image-store.s3.amazonaws.com/0/85771/a73798e6-5c86-ab5d-8f28-e715fe21549b.jpeg)

カスタマーサポートの管理には[Zendesk](https://www.zendesk.co.jp/)を使用しています。
サポートへのメールやサイト上でのイベントを契機にチケットを発行し、管理を行っています。

# mongoLab
![MongoDB_Hosting__Database-as-a-Service_by_MongoLab.jpg](https://qiita-image-store.s3.amazonaws.com/0/85771/2e847e91-e0b1-f0f2-472c-321c6f063b56.jpeg)

現在は利用していませんが、[mongolab](https://mongolab.com/)というMongoDBのホスティングサービスを利用していました。手軽にMongoDBを立ち上げられ、Web上でデータの確認・編集、バックアップなどができます。
便利ですが、少々コストが高いので利用をやめ、現在ではAWS上に自前で構築しています。

# WebPay
![WebPay__開発者向けクレジットカード決済サービス.jpg](https://qiita-image-store.s3.amazonaws.com/0/85771/104aecbd-14f1-035c-1e65-c16079b3d538.jpeg)


サービスの課金方式が変更になったため、こちらも現在は利用していませんが、[WebPay](https://webpay.jp/)はWeb上でクレジットカードの決済を行うことのできるサービスです。
ちなみに商用利用の審査には、Visa MasterCardは2週間程、JCB, American Express, Diners Clubは3ヶ月程かかりました。
MacでPython 3.5.0インストールに失敗したら

# 環境
- OSX El Capitan Version 10.11.1
- pyenv 20151105-76-g3428431

# インストール

## 試みる
```bash
% pyenv install 3.5.0
Downloading readline-6.3.tar.gz...
-> https://yyuu.github.io/pythons/56ba6071b9462f980c5a72ab0023893b65ba6debb4eeb475d7a563dc65cafd43
Installing readline-6.3...
Installed readline-6.3 to $HOME/.anyenv/envs/pyenv/versions/3.5.0

Downloading Python-3.5.0.tgz...
-> https://yyuu.github.io/pythons/584e3d5a02692ca52fce505e68ecd77248a6f2c99adf9db144a39087336b0fe0
Installing Python-3.5.0...

BUILD FAILED (OS X 10.11.1 using python-build 20151124-5-gebd6c1a)

Inspect or clean up the working tree at /var/folders/jw/qq4kz4hd17lbgv__hgym0z_c0000gp/T/python-build.20151202010623.52953
Results logged to /var/folders/jw/qq4kz4hd17lbgv__hgym0z_c0000gp/T/python-build.20151202010623.52953.log

Last 10 log lines:
  File "/private/var/folders/jw/qq4kz4hd17lbgv__hgym0z_c0000gp/T/python-build.20151202010623.52953/Python-3.5.0/Lib/ensurepip/__main__.py", line 4, in <module>
    ensurepip._main()
  File "/private/var/folders/jw/qq4kz4hd17lbgv__hgym0z_c0000gp/T/python-build.20151202010623.52953/Python-3.5.0/Lib/ensurepip/__init__.py", line 209, in _main
    default_pip=args.default_pip,
  File "/private/var/folders/jw/qq4kz4hd17lbgv__hgym0z_c0000gp/T/python-build.20151202010623.52953/Python-3.5.0/Lib/ensurepip/__init__.py", line 116, in bootstrap
    _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)
  File "/private/var/folders/jw/qq4kz4hd17lbgv__hgym0z_c0000gp/T/python-build.20151202010623.52953/Python-3.5.0/Lib/ensurepip/__init__.py", line 40, in _run_pip
    import pip
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] Error 1
```

## 失敗したら
```bash
% xcode-select --install
```

## もう一度インストール挑戦
```bash
% pyenv install 3.5.0
Downloading readline-6.3.tar.gz...
-> https://yyuu.github.io/pythons/56ba6071b9462f980c5a72ab0023893b65ba6debb4eeb475d7a563dc65cafd43
Installing readline-6.3...
Installed readline-6.3 to $HOME/.anyenv/envs/pyenv/versions/3.5.0

Downloading Python-3.5.0.tgz...
-> https://yyuu.github.io/pythons/584e3d5a02692ca52fce505e68ecd77248a6f2c99adf9db144a39087336b0fe0
Installing Python-3.5.0...
Installed Python-3.5.0 to $HOME/.anyenv/envs/pyenv/versions/3.5.0
```

## 成功
```bash
% pyenv global 3.5.0
% pyenv versions
  system
  2.7.10
* 3.5.0 (set by $HOME/.anyenv/envs/pyenv/version)
```
知らなかったAndroidのフィールドテストモード

# フィールドテストモード
先日、購入した海外製Xperiaに格安SIMを接続してLTEがつながらずゴニョゴニョしてたら出会ったAndroidの機能。知ってますか？ 僕は知りませんでした。
# フィールドテストモードってなに？
端末情報はもちろん、電波の強度やLTE回線をちゃんと使えているのか、バッテリーの種類や温度、Wi-Fi情報などが一覧できます。
# 秘密のコマンドで起動する
さあ起動しましょう。
電話アプリで

```
*#*#4636#*#
```
と入力します。いかにも隠しコマンドっぽい。すると下のような画面になります(Android 5.1.1で起動しています)。
![Screenshot_2015-12-09-09-19-02.png](https://qiita-image-store.s3.amazonaws.com/0/55103/e1a2257e-1b42-a11f-42c1-5d94361c8525.png)

## 携帯電話情報
電話番号や電場強度など閲覧できます。
![Screenshot_2015-12-09-09-20-58.png](https://qiita-image-store.s3.amazonaws.com/0/55103/b260a076-6cee-6c2f-db4c-635758202d63.png)
ボタンでいろいろ切り替えられます
![Screenshot_2015-12-09-09-21-06.png](https://qiita-image-store.s3.amazonaws.com/0/55103/e2a23e88-7a64-294e-94cf-5de8aab966ee.png)

## 電池情報
ここではアプリ開発者が気になる電池の温度などが閲覧できます。
![Screenshot_2015-12-09-09-21-15.png](https://qiita-image-store.s3.amazonaws.com/0/55103/690eb1cc-bf61-3139-6dc3-414a16ab0268.png)

## 使用統括情報
アプリの起動時間などが閲覧できます。
![Screenshot_2015-12-09-09-21-36.png](https://qiita-image-store.s3.amazonaws.com/0/55103/275452ef-e16c-df6b-d876-03b67128d74c.png)

## Wi-Fi information
かなり細かい情報までたどり着けるようです(項目が多すぎて割愛させていただきます。。)。
![Screenshot_2015-12-09-09-22-30.png](https://qiita-image-store.s3.amazonaws.com/0/55103/80521e1e-b08d-6dd9-6c90-6810d4f05fb1.png)

## 知っている方多いと思いますが。。。
恥ずかしながら知らなかったので備忘録として。
Railsでredirect_toする際に、別コントローラーのアクションにエラーメッセージを受け渡したい

## 趣旨
sessionは怖いので、redirect_toの引数としてflashを用いて別コントローラーに引き継ぐのがいいのでは。

## どういうことか。

ときたま、pages_controllerなどで表示した静的ページの中で会員登録を行いたい場合がある。

今現在、/teaserというパスにおり、そこではpages_controller#teaserが呼び出されているとする。
そこで会員登録を行い、失敗した場合は再度同じパスに戻りエラーメッセージを表示させたいというのが今回の目的。

そのような場合でも、createはusers_controllerで行っていることが一般的であり、そうするとバリデーションに失敗してsave出来なかった場合の処理は以下のように書きたくなる。が、**これでは当然上手く動かない。**

```rb

# 静的ページを管理するコントローラー
class PagesController < ApplicationController

  def teaser
    @user = User.new()
    render layout: 'teaser'
  end

  def teaser_thanks
    render layout: 'teaser'
  end

end

# @user.saveはUsersControllerで行いたい
class UsersController < ApplicationController

  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to teaser_thanks_path # 成功すればティザーサイトのサンクスページヘ
    else
      # render 'new'ではなく、teaser_pathへ遷移
      redirect_to teaser_path
    end
  end

  private
  def user_params
    params.require(:user).permit(:email)
  end
end
```

**この時、別コントローラーのアクションを呼び出しているため、インスタンス変数に放り込まれているエラーメッセージ ```@user.errors``` が受け渡されない**

なので若干の工夫をする必要がある。

## 案1 sessionに渡す

この方法でも問題ない気はするが、以下の2つの理由から見送り。

- sessionはむやみに使いたくない
- 同じ画面に2つ同じフォームを置きたい場合(上部と下部にemail入力欄を設けたい、など)、先に出てくるフォームでsession[:error]が消されてしまい、それ以降のフォームではエラーメッセージが表示されない
    - 工夫でなんとかできるが、viewがややこしくなるので好きではない

```rb
class UsersController < ApplicationController

  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to teaser_thanks_path # 成功すればティザーサイトのサンクスページヘ
    else
      session[:error] = @user.errors.full_messages
      redirect_to teaser_path
    end
  end

  # 中略
end
```

```erb
# view
<%= form_for @user do |f| %>
  <%= f.text_field :email, { placeholder: 'メールアドレス' } %>
  <%= f.submit '事前登録' %>

  <% if session[:error].present? %>
    <ul class="errors">
      <% session[:error].each do |e| %>
        <li><%= e %></li>
      <% end %>
    </ul>
    <% session[:error] = nil # 念のため使い終わったら消す %>   
  <% end %>
<% end %>
```

## 案2 素直にflashに渡す

30分ほど格闘し、flashに問題なく渡せることに気づいた。最初からこうすればよかった。

```rb
class UsersController < ApplicationController

  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to teaser_thanks_path # 成功すればティザーサイトのサンクスページヘ
    else
      redirect_to teaser_path, flash: { error: @pre_regist.errors.full_messages }
    end
  end

  # 中略
end
```

```erb
# view
<%= form_for @user do |f| %>
  <%= f.text_field :email, { placeholder: 'メールアドレス' } %>
  <%= f.submit '事前登録' %>

  <% if flash[:error].present? %>
    <ul class="errors">
      <% flash[:error].each do |e| %>
        <li><%= e %></li>
      <% end %>
    </ul>
  <% end %>
<% end %>
```

## 終わりに
rails 楽しい。
が、こういうところで細かく悩まずに済むようにいち早く精進したい。
Xcode 7.1.1 Release Notes無い英語力で。。。

#更新内容

Resolved a crash when moving or renaming Xcode, and then opening an iOS or Apple TV app in Xcode. (23264753)

google 翻訳君
移動やXcodeの名前を変更した後、XcodeでiOSのまたはApple TVのアプリを開いたときにクラッシュする問題を解決しました。

わたくしの英語力
Xcodeで移動、名前変更時の問題の解決。×
アップルＴＶを開いたときの問題の解決。×

#結論
~~たぶんApple Tvアプリ作ってない人には関係ないかも。~~
xcodeで移動、名前変更をして開くと落ちてた。

詳しくなるにはKnown Issuesを読めばいいのか。
間違い等あれば御指摘頂ければと思います。


https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc7_release_notes.html#//apple_ref/doc/uid/TP40001051-CH5-SW22
スマフォゲームアプリの負荷試験いろは


スマフォゲームアプリの負荷試験をしたので、どのように実施したのか共有したいと思います。
今回はDAU10万人を想定して負荷試験を行いました。


# 使ったツール
* 負荷試験クライアント
    * [locust](http://locust.io/)
* 性能監視
    * New Relic (通常の監視に加え、MySQL Pluginを入れるといい)
    * AWSの標準のモニタ


# 単純な構成で負荷試験

まず疎通確認の意味も込めて、単純な構成で負荷試験を行います。
今回は、渡されたjsonをechoするだけのAPIを作って、locustを使い負荷試験を実施しました。
いきなり複数台で行うと、パフォーマンスが出なかったときに、どこを調整していいかわからなくなります。
まずAppサーバ自体でDjangoのフレームワークがどのくらいパフォーマンスが出せるのか確認します。
（本来だったら、素のDjangoでやるのがいいのですが、今回は開発しているアプリサーバのDjangoにAPIを足す形にしてあります）

![server_1.png](https://qiita-image-store.s3.amazonaws.com/0/30079/8092178a-8b46-4a5b-c161-10b92ea96b6b.png "server_1.png")

結果として、DjangoのAppサーバが70%ほどのCPU使用率で、600RPSほど捌けました。
Django自体のベンチマークと比較したりして極端に遅くなっていないかなど見直すといいと思います。

またこの試験を行う利点として、負荷クライアントのlocust自体も性能を発揮できるか確認できます。


単純な構成でうまくいったら、次にテストシナリオを作成します。

# テストを行うユーザの定義とテストシナリオ作成

負荷試験を行う際に、想定されるユーザの定義と、達成すべき目標を決めます。

アプリの特性にもよると思いますが、今回はユーザを以下のように、 **ヘビーユーザ** , **一般ユーザ** , **新規ユーザ** として定義します。

* ヘビーユーザ: ゲームにのめり込んで遊んでくれているユーザ
* 一般ユーザ: ゲームを遊んだことがある既存ユーザだが軽めに遊ぶユーザ
* 新規ユーザ: その日に、新しくゲームをインストールして遊んでくれるユーザ

DAU10万人を想定するといっても新規ユーザが多いのか、ヘビーユーザが多いのかによって、叩かれるAPIの数や種類が違い、負荷が全然違ってきます。
ヘビーユーザが多いとゲームのコアの部分、例えばクエストやPvPが多く遊ばれます。一方で、新規ユーザが多い場合、サインアップ後の登録処理のAPIが多く叩かれます。

ユーザを特徴的なセグメントにわけれたので、次にどのようなAPIがそれぞれ叩かれるのかを以下のように定義しました。

![user_1.png](https://qiita-image-store.s3.amazonaws.com/0/30079/57faa410-ec65-09b1-45ab-8daae637be20.png "user_1.png")

1. 各セグメントが叩くAPIを定義する
2. 各セグメントがそれぞれのAPIをどのくらい叩くか定義する
3. 各セグメントの1ユーザが1日に叩くAPIの数を算出する (図だとヘビーユーザは340)
4. 3に各セグメントのDAUをかけて、足しあわせ、システムにくる1日のリクエスト数を出す (図だと13,510,000)
5. 4により平均RPSが算出できる
6. いままでの経験値などからピーク値は3倍ほどと見積もり469RPS(Request per Seconds)をシステムが出す必要がある

上記のように定義したものを、実際にlocustでシナリオを作成し、負荷試験をしました。


# シナリオを使って１台のサーバに負荷試験

いきなり複数台のAppサーバを使って負荷試験をせずに、１台だけでやります。狙いとしては、テストシナリオの疎通確認という意味と費用削減です。
いきなり複数台のAppサーバをたてると、エラーがあっていろいろ試行錯誤している間にもお金がかかりよくありません。
以下のような構成でMySQL, Redisも含めたテストシナリオの試験をします。

![server_2.png](https://qiita-image-store.s3.amazonaws.com/0/30079/357a01ba-ec0c-9e59-9644-78c7d17a8661.png "server_2.png")


# 想定の負荷に耐えるように負荷試験

最後に、以下のようにサーバをセットアップし、目標であるRPSを達成できるまで負荷試験を実施します。
Appサーバの負荷が高く(CPUが70%以上など)なればAppサーバを増やすか、スペックをよくします。MySQL, Redisに関しても同様です。

![server_3.png](https://qiita-image-store.s3.amazonaws.com/0/30079/3f1487da-8e22-1faf-0fbd-d50921f799fa.png "server_3.png")

# まとめ

自分のプロジェクトでどのように負荷試験をしたか書いてきましたが以下がポイントでした。

* 最小構成から大きくしていくこと
* 想定ユーザからテストシナリオを作る
ボタン押下時に画面全体を半透明のレイヤにより非活性にする方法

jqueryBlockUIとかレイヤ関連は便利なものがありますが、
あえて手作りで非活性レイヤを実装してみます。
(やり方はとある先生から教わりました)

```
<html>
<head>
<script type="text/javascript" src="jquery/jquery-1.7.2.min.js"></script>
<script type="text/javascript">
$(function() {
    $('#order').click(function(){
        $('#layer').css('position', 'fixed');
        $('#layer').css('left', 0);
        $('#layer').css('top', 0);
        $('#layer').css('width', '100%');
        $('#layer').css('height', '100%');
        $('#layer').css('z-index', 1000);
        $('#layer').css('opacity', 0.6);
        $('#layer').css('background-color', '#000000');
        $('#layer').css('display', 'block');
        $('#box').css('position', 'fixed');
        $('#box').css('left', '15%');
        $('#box').css('top', '33%');
        $('#box').css('width', '70%');
        $('#box').css('height', '60px');
        $('#box').css('font-size', '1.5em');
        $('#box').css('z-index', 1001);
        $('#box').css('text-align', 'center');
        $('#box').css('background-color', '#fff');
        $('#box').css('display', 'block');
        // 0.1秒後にsendformをサブミット
        // 待たずにサブミットすると半透明レイヤがでない
        setTimeout(function() {
            $('#sendform').submit();
        }, 100);
    });
});
</script>

<img id="order" alt="注文!" width="100%" src="image/btn_chumon.jpg">

<!-- 実際にレイヤをかけるdiv -->
<div id="layer" style="display:none;"></div>
<!-- レイヤ上に表示させるメッセージ -->
<div id="box" style="display:none;"><b>処理中です。<br />そのままお待ちください</b></div>
</head>
</html>
```
※jquery-1.7.2.min.jsとbtn_chumon.jpgはそれぞれ任意の場所に設置してください。

ボタンをクリックすると画面全体にレイヤがかかり中央にメッセージが表示されます。
2重クリックを防ぎたい場合は使えますね。非活性にしている間にサーバ処理をしてしまえば。
細かい設定の説明は更新して掲載します。
スマホ操作だとjqueryBlockUIが効かないときがしばしばあるので、そういった場面で使えそう。
スマホ操作でjqueryBlockUIを有効化する方法知っている方教えてください。。。
Twilioサーバーレス化作業記録 - RequestURLもサーバーレス化

# はじめに
こちらのハンズオンに参加させて頂きました。

[Twilio API 勉強会 Vol.28 - サーバーレスアーキテクチャで Twilioを安全に運用しよう！ ハンズオンメモ](http://qiita.com/honkimi/items/941b5c7ee87371db9dbf)

とても参考になりました！
honkimiさんありがとうございます！

(この投稿内容もハンズオンメモをベースにしております)

# 概要
ハンズオンではフォールバックURL(=失敗時)のサーバーレス化を行いました。

セッション内で言及されていましたが正常に動作させる場合でも
サーバーレス化と相性が良いですよ、とのこと。

TwilioもLamdbaもまだ初心者ですが、試してみました！

# AWS Lambda 側

## AWS Lambda Functionの作成
AWS にログインし、AWS Lambdaを選択

初期画面にて「Create a Lambda Function」

blueprint で twilio-blueprint を選択

- Name: TwilioRequset
- Role: lambda_basic_execution (ハンズオン内で作成済)

他はデフォルト値のままとしました。
Next → Next → Create Function

## AWS Lambda Functionの設定

Add API Endpoint 選択し、作成

## Amazon API Gatewayの設定
prodを新しいタブで開く
ページ上の右タブResourcesへ

#### Method Request
Method Execution の AuthenticationをNONE

#### Integration Request
- Mapping Templates を選択
- Content-Type を application/json

Input Path ThroughからMapping template へ変更。AWS lambdaに送ったパラメータを全て取得できるようにする

```
{
  "param": {
#foreach( $key in $input.params().querystring.keySet() )
    "$key": "$input.params().querystring.get($key)"#if( $foreach.hasNext ),#end
#end
  }
}
```

#### Integration Response
200を展開

Mapping Templates 

- Content-Type: application/xml
- Input Path ThroughからMapping Templateへ

```
#set($inputRoot = $input.path('$'))
$inputRoot
```

* ここなのですが、Output passthroughでいくかと思ったら上手くいかず、こちらの記述にして動作しましたとてもあやしい...要再確認です。


#### Method Response
200を展開

Add Response Model

- contenttype:  application/xml
- Models: Empty

## Deploy API

Deploy API で prod でデプロイ

Stagesにて左ナビでTwilioRequestのGETへ行って、そのURLをコピー

# Twilio 側

Twilio のRequestURLにURLをセット

その電話番号へ電話をかける

Lambdaのコードで設定したメッセージを喋ってくれた！

# おわりに
駆け足でしたが、なんとか動作するところまでいったので共有まで。
vmware / Windows7 > セーフモードで起動 > msconfig.exe > ブートタブ > セーフブート

```txt:動作確認
Windows 7 pro on vmware workstation
```

vmwareでWindows 7をセーフモードで起動しようとF8を使ってもうまくいかない。

参考
http://5zaru.com/file/3346

以下の手順で起動した

1. msconfigと入力
2. ブートタブに切替
3. 「セーフブート」にチェック。「最小」にチェック

以上でセーフモードでの起動になる。

設定はずっと残るので、通常ブートに戻すには上記を再度行い「セーフブート」のチェックを外す。
Xcodeのバージョンが上がって、XVimなどのプラグインが使えなくなった時の対応


# 対応
## STEP1
```
/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/ActivityPlugin.xrplugin/Contents/Info.plist
```

の中に書かれている`DVTPlugInCompatibilityUUIDs`の文字列を確認する。
Xcode7.2の場合は `F41BD31E-2683-44B8-AE7F-5F09E919790E` となっています。

## STEP2
```
~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/XVim.xcplugin/Contents/Info.plist
```
を修正する。 (パスはXVimのもの)

```
        <key>DVTPlugInCompatibilityUUIDs</key>
       <array>
                <string>AD68E85B-441B-4301-B564-A45E4919A6AD</string>
                <string>A2E4D43F-41F4-4FB9-BB94-7177011C9AED</string>
                <string>37B30044-3B14-46BA-ABAA-F01000C27B63</string>
                <string>63FC1C47-140D-42B0-BB4D-A10B2D225574</string>
                <string>C4A681B0-4A26-480E-93EC-1218098B9AA0</string>
                <string>FEC992CC-CA4A-4CFD-8881-77300FCB848A</string>
                <string>992275C1-432A-4CF7-B659-D84ED6D42D3F</string>
                <string>A16FF353-8441-459E-A50C-B071F53F51B7</string>
                <string>9F75337B-21B4-4ADC-B558-F9CADF7073A7</string>
                <string>8DC44374-2B35-4C57-A6FE-2AD66A36AAD9</string>
                <string>E969541F-E6F9-4D25-8158-72DC3545A6C6</string>
                <string>AABB7188-E14E-4433-AD3B-5CD791EAD9A3</string>
                <string>7FDF5C7A-131F-4ABB-9EDC-8C5F8F0B8A90</string>
                <string>CC0D0F4F-05B3-431A-8F33-F84AFCB2C651</string>
                <string>0420B86A-AA43-4792-9ED0-6FE0F2B16A13</string>
                <string>7265231C-39B4-402C-89E1-16167C4CC990</string>
        </array>
```