OmniAICreator/Qiita-1.07M huggingface dataset:
[Tensorflowを使って画像を分類したい ](2)画像を分類しよう

# Inception-v3を使って分類する

Inceptionの説明は割愛します
下記のサイトを参考にしてください
[TensorFlow : Tutorials : 画像認識](http://tensorflow.classcat.com/2016/02/25/tensorflow-tutorials-image-recognition/)
[TensorFlowチュートリアル - 画像認識（翻訳）](http://qiita.com/KojiOhki/items/dab6922b6cd7b990c002)


# 環境準備
[前回](http://qiita.com/sfu/items/6e8ed8e963b241f8585f)構築した環境に"classify_image"を使えるようにします

<pre>
$ git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow/models/image/imagenet
</pre>

# ひとまず動かしてみる
引数を指定しない場合はパンダの画像の分類結果を表示してくれます。
<pre>
python classify_image.py
giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca (score = 0.88493)
indri, indris, Indri indri, Indri brevicaudatus (score = 0.00878)
lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens (score = 0.00317)
custard apple (score = 0.00149)
earthstar (score = 0.00127)
</pre>

#分類したいファイルパスを書いた一覧を作ります。
こんな感じですね
<pre>
/home/vagrant/my_tensorflow/images/image01.jpg
/home/vagrant/my_tensorflow/images/image02.jpg
/home/vagrant/my_tensorflow/images/image03.jpg
/home/vagrant/my_tensorflow/images/image04.jpg
/home/vagrant/my_tensorflow/images/image05.jpg
</pre>

# 実際に分類してフォルダ分けする
分類したimageファイルをディレクトリに移動させます。

```
#!/bin/bash -x
FILES=`cat /home/vagrant/my_tensorflow/train.csv | tr -d ' '`
for FILE in $FILES
  do
    DIR="/tmp/image/"`python /home/vagrant/tensorflow/tensorflow/models/image/imagenet/classify_image.py --image_file ${FILE} | awk 'NR==1{print $1}' | tr -d "," | tr -d ' '  `"/"

    echo "-------------------"
    echo "FILE:$FILE"
    echo "DIR:$DIR"
    mkdir $DIR
    mv $FILE $DIR
  done
```

#フォルダ分け出来た
<pre>
ls /tmp/image/comic/
image02.jpg
image04.jpg
</pre>
cocoapods をインストール（エラーに対応）


MACにインストールする時の備忘録
cocoapodsをインストールしようと思ったらエラーになった

```
$ gem install cocoapods
Fetching: i18n-0.7.0.gem (100%)
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.
```

パーミッションエラーがだね
ディレクトリの書き換え権限がないってこと

で、どうするかというと
sudo
コマンドを使います
これは　Super User DO　の略らしい
スーパーユーザとして命令しますってこと
したのようにパスワードが聞かれるから入力してあげると。。

```
$ sudo gem install cocoapods
Password:
Fetching: i18n-0.7.0.gem (100%)
Successfully installed i18n-0.7.0
Fetching: thread_safe-0.3.5.gem (100%)
Successfully installed thread_safe-0.3.5
Fetching: tzinfo-1.2.2.gem (100%)
Successfully installed tzinfo-1.2.2
Fetching: minitest-5.9.0.gem (100%)
Successfully installed minitest-5.9.0
Fetching: concurrent-ruby-1.0.2.gem (100%)
Successfully installed concurrent-ruby-1.0.2
Fetching: activesupport-5.0.0.1.gem (100%)
ERROR:  Error installing cocoapods:
	activesupport requires Ruby version >= 2.2.2.
```

このようにできた。
Apache で HTTP を HTTPS にリダイレクト

Apache に HTTP でアクセスしたときに HTTPS にリダイレクトさせる方法をググるといろんなサイトで mod_rewrite を使ふ設定例を紹介してるのばかりが出て来るが、mod_alias で十分だよといふことが公式マニュアルに書いてある。

[When not to use mod_rewrite](http://httpd.apache.org/docs/current/en/rewrite/avoid.html#redirect)
ActiveJobでリトライ制御

ActiveJob はまだまだリトライ制御機能が弱く、`retry_job` での単純な再実行位しか機能がありません[^1]。
そこで、公式ドキュメントで公開されている API のみを活用し、ある程度の制御が行えるモジュールを作成しました。

[^1]: `enqueue`というのもありますが、`retry_job`と全く同じ挙動に見えます。ref: [ActiveJob::Enqueuing](http://api.rubyonrails.org/classes/ActiveJob/Enqueuing.html)

# 成功するまでリトライ
まず `retry_job` を使ったシンプルな例です。

```ruby
class RetryJob < ApplicationJob
  queue_as :default

  rescue_from(StandardError) do
    retry_job(wait: 5.minutes)
  end

  def perform(*args)
    # Do something later
  end
end
```

StandardError が発生すると、`rescue_from`で補足され、5分後に再実行するようにスケジューリングされます。

ただし、これでは成功するまで無限にリトライが行われてしまいます。リトライ回数の制限を行おうと思っても、現状 ActiveJob ではその制御機構がありません。

当然 Gems もいくつか既に提供されていますが、まだまだ「これが間違いない」と思える gem が出てきてないように思います。

おそらく一番 Github でスターが多いのが [ActiveJob::Retry](https://github.com/isaacseymour/activejob-retry) なんですが、

> **This is an alpha library** in active development, so the API may change.

> <cite>[isaacseymour/activejob-retry](https://github.com/isaacseymour/activejob-retry)</cite>

と書いてあり、まだまだ本番で使うには不安な感じです。

あと個人的には、少し重厚過ぎるな、という印象です。

# やりたいこと
リトライ回数上限が設定できて、現在何回目の試行回数かわかって、リトライ時回数を超えたかどうかがわかれば最低限事足りそうです。

それができれば、以下のようにリトライ回数制御を追加可能です。

```ruby
class LimitedRetryJob < ApplicationJob
  queue_as :default
  retry_limit 5

  rescue_from(StandardError) do |exception|
    raise exception if retry_limit_exceeded?
    retry_job(wait: attempt_number**2)
  end

  def perform(*args)
    # Do something later
  end
end
```

これで良さそうなので、これを動くように実装していきます。

# 実装
リトライ回数の受け渡しについてですが、[公式ドキュメント](http://api.rubyonrails.org/classes/ActiveJob/Core.html)にほぼそのままのサンプルが載っています。`serialize`と`deserialize`をオーバーライドすることにより、シリアライズ可能なインスタンス変数の持ち回しが実現できそうです。

というわけで、公式ドキュメントを参考に実装してみました。

```ruby
class ApplicationJob < ActiveJob::Base
  DEFAULT_RETRY_LIMIT = 5

  attr_reader :attempt_number

  class << self
    def retry_limit(retry_limit)
      @retry_limit = retry_limit
    end

    def load_retry_limit
      @retry_limit || DEFAULT_RETRY_LIMIT
    end
  end

  def serialize
    super.merge("attempt_number" => (@attempt_number || 0) + 1)
  end

  def deserialize(job_data)
    super
    @attempt_number = job_data["attempt_number"]
  end

  private

  def retry_limit
    self.class.load_retry_limit
  end

  def retry_limit_exceeded?
    @attempt_number > retry_limit
  end
end
```

それぞれ、

* ApplicationJob.retry_limit
    * リトライ上限設定
* ApplicationJob#attempt_number
    * 現在の試行回数を取得
* ApplicationJob#retry_limit_exceeded?
    * リトライ上限を超えてるかどうか確認

という機能を提供しています。

# 本番環境で使う
全サブクラスでリトライ制御が必要になるわけではないので、モジュール化を行いました。

* [necojackarc/active_job_retry_controlable.rb - Gist](https://gist.github.com/necojackarc/2eb388bfae26c3228c9affe592a0def6)

# メリット
公式ドキュメントに載ってる API しか使ってないので、壊れにくいかなーと思います。
あと、メソッドを少し提供しているだけなので、制御の自由度が高いです。


# デメリット
逆に言うと、かなりシンプルなので、色々自分で実装する必要があります。
自動でリトライを行ってくれる、というモジュールではありません。

# 元記事
- [Cool Way to Control Retry with ActiveJob - necojackarc’s blog](http://necojackarc.hateblo.jp/entry/2016/08/27/195440)
【しずおかアプリ部】活動ログ　第24回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/ee800648-fa25-1829-20c3-bad9c2055d35.jpeg)


##■タイトル##
第２４回


##■開催日##
２０１６年８月２７日（土）　１６：００～１８：００


##■参加者##
１０名


##■活動内容（概要）##
・[個人で任天堂ハード向けソフト開発が行えるNintendo Developer Portalの紹介](https://developer.nintendo.com/home)
・部員さんプレゼン「Gitでバージョン管理〜コミット修正編〜」
・[Sonyが開催中のVRコンテンツのコンテスト](http://www.jp.playstation.com/psvr/mwuc/)
・保坂プレゼン「マインクラフトでプログラミング！」


![IMG_7228.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/21260dd7-ac83-7d93-4085-56804b0f9efb.jpeg)


##■活動内容（詳細）##

【実演・プレゼン】


**・部員さんプレゼン「Gitでバージョン管理〜コミット修正編〜」**

　前々回に引き続き、SourceTreeを使ってのgitの使い方を解説。
　今回は、コミット後の修正方法について。

![IMG_7230.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/a9bb7438-ca52-9f70-06c6-b11816a4c1ea.jpeg)

　・ブランチの作成（branch）
　　　バージョン管理する木の枝を作るイメージ。
　　　リリース1.0のアプリを配信後に、リリース2.0を作っていて、
　　　その途中でリリース1.0でバグが見つかったから、修正して1.1を出さなくてはならない。
　　　そんな場合に1.0をブランチで作っておけば、2.0を作りながら修正した1.1も用意でき、
　　　2.0にも修正があてられるという便利すぎる仕組み。
　　　バックアップ目的としても使える。

　・コミットを取り消し（reset）
　　使えるモードは３種類
　　・Hard - 完全に全消し
　　・Mixed - 作業コピーの変更はそのままmにするが、インデックスの状態はリセットする
　　・Soft - ローカルの変更はすべてそのままにする
　
　・直前のコミットを修正（amend）
　　修正後のコミットは別物になる。


　　資料：[第24回_プレゼン資料(Gitでバージョン管理～コミット修正編～).pdf](http://monolizm.com/sab/pdf/第24回_プレゼン資料(Gitでバージョン管理～コミット修正編～).pdf)

![IMG_7226.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/2240b683-18fb-8da1-9299-b2a919b38324.jpeg)
　
　
　
　
<hr>
　
　　　　


**・保坂プレゼン「マインクラフトでプログラミング！」**
　ComputerCraftとLua言語を使って、マインクラフトでプログラミングする方法を紹介します。
　家を建てる、材料を集める、モンスターを倒すなどの作業を自動化可能！

![IMG_7239.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/b314e99d-b4da-f5d7-ea22-42d782a61107.jpeg)


　コンピュータ版マインクラフトに「Conmputer Craft Edu」というmodを入れることで、
　マインクラフトの中で、プログラミングができるようになる。

　まずはビジュアルプログラミング版。
　![IMG_7240.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/9500b7d3-e9d3-6bb5-b1a9-6ba28adc4abf.jpeg)
　移動や採掘、攻撃などのタイルや、whileやtrueなどのプログラミングタイルを並べるだけで、
　タートルと呼ばれるロボットを操作可能。


　続いてLua言語版
![IMG_7241.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/7ca51f1e-4448-8c8a-14d9-4fa7c413e747.jpeg)
 DOS画面のようなエディタ上でLua言語を用いてプログラミング可能。


　プログラムの勉強というのは地味で、退屈（と感じる人もいる）な作業なので、
　途中で投げ出してしまった人も多いのではないでしょうか。
　ゲームをプレイしながらプログラミングを身に付けられるというのは、非常に良い勉強方法だと思う。
　
　　資料：[第24回_プレゼン資料(マイクラでプログラミング！？).pdf](http://monolizm.com/sab/pdf/第24回_プレゼン資料(マイクラでプログラミング！？).pdf)

<hr>
FinagleでWebAPIサーバを立てる


## 概要

（「フィネーグル」って読んでるけど、正しくは「フィネーフル」なんですか？）

ちょっと仕事で簡単なWebAPIサーバー立てることになったのでfinagle-httpを試した。
結局その後色々あってplay2に変えてしまいましたが。。

その時に調べたら、全然情報がなかったので簡単にメモ。
WebAPI用途ならsprayとかakka-httpの方が人気なんだろうか。。
akka-httpはいつexperimental取れるんだろうか。。

## ゴール

- finagle-httpでパスに応じて処理を切り分ける。
- headerとかcookieとかいじる

## コード

```scala:build.sbt
libraryDependencies ++= Seq(
      "com.twitter" %% "finagle-netty4-http" % "6.37.0"
    )
```

finagle-httpはnetty3だったのでなんとなくこっち使ってみた。

```scala:Main.scala
import com.twitter.finagle.http.service.RoutingService
import com.twitter.finagle.http.{Cookie, Request, Response}
import com.twitter.finagle.{Http, Service, http}
import com.twitter.util.{Await, Future}

object Main {

  def main (args: Array[String] ): Unit = {

    val index = new Service[Request, Response] {
      def apply(request: http.Request): Future[http.Response] = {
        val res = http.Response(request.version, http.Status.Ok)
        res.setContentString("Ok")
        Future.value(res)
      }
    }

    def execute(userId: String, num: Int) = new Service[Request, Response] {

      def apply(request: Request): Future[http.Response] = {
        val resultString = s"user id: ${userId}. num: ${num}"
        val res = http.Response(request.version, http.Status.Ok)
        res.setContentString(resultString)

        val cookie = new Cookie("key", "value")
        cookie.httpOnly_=(true)
        res.addCookie(cookie)

        res.setContentType("text/plain")

        Future.value(res)
      }
    }

    import com.twitter.finagle.http.path._
    val router = RoutingService.byPathObject[Request] {
      case Root / "userId" / userId / "number" / Integer(num) => execute(userId, num)
      case Root / "userId" => execute("uuu", 3)
      case _                             => index
    }

    val server = Http.serve(":9999", router)
    Await.ready(server)
  }

}
```


```shell
$ curl --verbose http://localhost:9999/userId/uu/number/100
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 9999 (#0)
> GET /userId/uu/number/100 HTTP/1.1
> Host: localhost:9999
> User-Agent: curl/7.45.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Set-Cookie: key=value; HTTPOnly
< Content-Type: text/plain;charset=utf-8
< Content-Length: 21
< 
* Connection #0 to host localhost left intact
user id: uu. num: 100
```

## まとめ

routingのとこ、ソースコード読まないとわかんなかった。
ドキュメントシンプル過ぎてよくわかんない
Lumen(Laravel5), PHPUnitでファイルをPOST/アップロード

# はじめに
Larabel5のmicro-framework:LumenでREST API的なものを作ってUnitTest(PHPUnit)を書こうとしたときに、バイナリファイルをPOSTしようとした時にハマったので対策メモ。

## 前提

- ファイルを投げると結果を返すだけのAPIを作った。
- REST APIとして作っているので、FORMを使わない。
 - Laravel5 [フォームの埋め込み, ファイル添付操作のパターン](https://readouble.com/laravel/5.1/ja/testing.html#interacting-with-your-application)はLumenで使えない

```php:Laravel5抜粋
public function testPhotoCanBeUploaded()
{
    $this->visit('/upload')
         ->name('File Name', 'name')
         ->attach($absolutePathToFile, 'photo')
         ->press('Upload')
         ->see('Upload Successful!');
}
``` 

# PHPUnit

```php:ExampleTest.php
<?php

use Illuminate\Http\UploadedFile; // (1)

class FooTest extends TestCase
{
    public function testPostUpload()
    {
        $filepath =  '/tmp/image.jpg';

        // Illuminate\Http\UploadedFile
        $upfile = new UploadedFile(
                $filepath,             // file path
                'image.jpg',           // original Name
                'image/jpeg',          // mimeType
                filesize( $filepath ), // size
                null,                  // error
                true // (2)            // test
        );

        $response = $this->call( 
                'POST',                // method
                '/api/post',           // uri
                [ ],                   // parameters 
                [ ],                   // cookies 
                ['file' => $upfile ]   // files 
        );

        $this->assertJsonStringEqualsJsonString(
                $response->content(),
                json_encode( [
                    'result'  => true,
                    'message' => "Upload complete.",
        ] ) );
    }
}
```

## (1) use Illuminate\Http\UploadedFile;

ファイルのアップロードをする方法を検索すると`use \Symfony\Component\HttpFoundation\File\UploadedFile;`を使う記述がたくさん見つかる。でも、Laravel5/Lumenを使うなら、`use Illuminate\Http\UploadedFile;`を使ったほうが良いみたい。

### 参考
- [Laravel 5.2 | Testing UploadedFile Misses the $test Value after Post. Bug?](http://stackoverflow.com/questions/36857800/laravel-5-2-testing-uploadedfile-misses-the-test-value-after-post-bug)

## (2) UploadedFileの引数testをTrueにする

元になっているSymfonyのUploadedFileのtestパラメータの説明書きだと「Whether the test mode is active」となっていて、テストモードのときにActive(ture)にする必要があるみたい。（`move()`の動きを見ると、testパラメータにtrueが設定されていると、細かいチェックなしにファイルを移動させてる）

# 最後に
Laravel5/Lumenを調べてたら、Symfonyの中身を調べることになるとは思わなかった。
ドットインストールのRuby on Rails 4入門／タスク入力エラー時にメッセージを表示するようにしてみた

#＃ はじめに
ドットインストールの[Ruby on Rails 4入門](http://dotinstall.com/lessons/basic_rails_v2)では、「Project」と「Task」の２つの入力画面があり、レッスン内では、Project側のみ、入力エラー時のメッセージを表示させる処理を実装しています。その後、Project側の実装を参考にTask側の実装してみたところ、ちょっとつまずいたので、そのときの備忘録です。

## バージョン
    % ruby -v
    ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]

    % rails -v
    Rails 4.2.7.1

## 作業の流れ
##### <font color="red">task.rb 修正前</font>
```ruby:/app/models/task.rb
  class Task < ActiveRecord::Base
    belongs_to :project
-   validates :title, presence: true
    scope :unfinished, -> { where(done: false) }
  end
```

##### <font color="blue">task.rb 修正後</font>
```ruby:/app/models/task.rb
  class Task < ActiveRecord::Base
    belongs_to :project
+   validates :title,
+     presence: { message: "入力してください" },
+     length: { minimum: 3, message: "短すぎ！" }
    scope :unfinished, -> { where(done: false) }
  end
```
<br>

##### <font color="red">tasks_controller.rb 修正前</font>
```ruby:/app/controllers/tasks_controller.rb
  class TasksController < ApplicationController
    def create
      @project = Project.find(params[:project_id])
-     @task = @project.tasks.create(task_params)
-     redirect_to project_path(@project.id)
    end
```

##### <font color="blue">tasks_controller.rb 修正後</font>
```ruby:/app/controllers/tasks_controller.rb
  class TasksController < ApplicationController
    def create
      @project = Project.find(params[:project_id])
+     @task = @project.tasks.build(task_params)
+     if @task.save
+       redirect_to project_path(@project.id)
+     else
+       # @project.tasks.build で tasks に1行追加されている
+       # そのままだと一覧にエラーの分も表示されてしまうので再取得する
+       @project = Project.find(params[:project_id])
+       render 'projects/show'
+     end
    end
```

<br>

##### <font color="red">show.html.erb 修正前</font>
```erb:/app/views/projects/show.html.erb
- <%= form_for [@project, @project.tasks.build] do |f| %>
  <p>
    <%= f.text_field :title %>
  </p>
```

##### <font color="blue">show.html.erb 修正後</font>
```erb:/app/views/projects/show.html.erb
+ <%# @project.tasks.build だと @task.errors にメッセージが入らないため @task に変更 %>
+ <%= form_for [@project, @task] do |f| %>
  <p>
    <%= f.text_field :title %>
+   <% if @task.errors.any? %>
+     <%= @task.errors.messages[:title][0] %>
+   <% end %>
  </p>
```

<br>

##### <font color="red">projects_controller.rb 修正前</font>
```ruby:/app/controllers/projects_controller.rb
  class ProjectsController < ApplicationController
    def show
    end
```

##### <font color="blue">projects_controller.rb 修正後</font>
```ruby:/app/controllers/projects_controller.rb
  class ProjectsController < ApplicationController
    def show
+     # show.html.erb の @project.tasks.build を @task に変更したため追加
+     @task = Task.new
    end
```

## 最後に
エラーメッセージを flash で ProjectsController に渡す方法も試したのですが、個人的にはこの方法がしっくりきました。
まだまだ、Rails初心者なので、他にもっとベターな方法がありましたら、教えていただけると助かります。
GCPは要注意。GCPとAWSの中国（大連）からのアクセス速度検証。

中国をターゲットにしたいならGCP（Google）には注意した方が良いという教訓

# 実験材料
実験台Web：静的コンテンツも動的コンテンツもそれほどなく、CDNも特に実施していない、簡単なWordPressサイト

# GCP(GAE)
中国人「アクセス所要時間は１分〜２分、さらにHP中のリンクをアクセスと、なかなか表示できません。」

# AWS(EC2)
中国人「非常にスムーズでアクセスできます。」

金盾の影響か、Google関連のリンクがあるとアクセス速度が担保できなくなるので注意した方がよい。
もちろんGAEじゃなくてGCEやGCSもダメなので要注意。
TwitterAPIで期間指定してTweetを取得する方法

# ある日のツイートを取得したい

特定のキーワードで、「特定の日のつぶやき」を取得する際に躓いたのでメモとして残しておきます。
使用しているTwitterAPIライブラリはTwitter4jです。
ですが、TwitterAPIの仕様のお話になるので言語は問いません。

## 一般的な取得方法

「特定のキーワード」で「過去」を検索するため、TwitterSearchAPIを使用します。

https://dev.twitter.com/rest/reference/get/search/tweets

試してみましょう。「2016/08/26」に「#IoT」で呟かれたツイートを検索しようとすると下記のようなクエリになります。

* query = #IoT
* since = 2016-08-26
* until = 2016-08-27

**実行結果**
2016-08-26T09:02:02+09:00[Asia/Tokyo]
から
2016-08-27T08:54+09:00[Asia/Tokyo]

の24時間分取得できました。しかし、欲しいのは26日分のみで、27日のツイートは別で取得してほしい。

よく見ると09:00から09:00までの24時間を取得しているため、UTC時間の日付になっていると想定されます。

TwitterAPIのドキュメントにはタイムゾーンの指定ができるオプションはありませんでしたが、色々調べていたところsinceとuntilには年月日だけでなく、時間とタイムゾーンも指定できることがわかりました。
そのフォーマットがこちらです。

```
YYYY-MM-DD_hh:mm:ss_ZZZ
```

上記にならい、2016/08/26のツイートを検索してみましょう。

* since = 2016-08-26_00:00:00_JST
* until = 2016-08-26_23:59:59_JST

として指定すると。

**実行結果**
2016-08-26T00:04:05+09:00[Asia/Tokyo]
から
2016-08-26T23:37:12+09:00[Asia/Tokyo]

までの想定通りのツイートを取得することができました。

APIドキュメントに載っていない隠れ仕様のようです。同じ悩みを持たれている方の参考になれば。

***

## 上記で発生する別問題についての対処

### 一度のAPIアクセスで100件しか取れない

:no_good: TwitterAPIのcountには最大100件までしか指定できません。
:+1: 返却されるJSONのnext_resultsに以降の情報が含まれているので、それを利用して何度もクエリを発行しましょう。

### 件数が多すぎて途中でAPI制限に掛かってしまう

:no_good: 何度もAPIにアクセスしていると15分間のAPI制限が掛かります。
:+1: プログラムの中でAPI制限を検知したら15分スリープさせてあげましょう。

### 途中の時間で検索結果が終わってしまう

:no_good: 件数が多いせいなのか、それともAPIの気まぐれなのか24時間分取得できないことがあります。特にその時間帯にツイートが集中していると検索結果が途中で終わってしまう現象が発生しました。
:+1: その場合はuntilに最後のツイートの時間を指定して再度クエリを投げれば続けて取得できます。

### 上記の問題はプログラム内部で自動化しましょう

:no_good: API制限で15分待ったり、検索結果がぷちぷち切れて手動で対応するのは大変です。
:+1: プログラム内でうまくハンドリングしてあげると放置しているだけでデータ収集ができます :clap: 

***

## その他

### 日単位で取得すれば7日前までしか取得できない制限を突破できます

untilには7日より前の日付を指定しても取得することができませんが、sinceとuntilで1日ずつ取得すれば7日より前の過去も取得できます。

## キーワードの精度は単語で区切られている必要がある

今回の例では「#IoT」とハッシュタグ検索しましたが「IoT」で検索するとぐっと検索結果が減ります。理由は、単語単位で区切られていないからです。

英語では必ず単語単位（スペース）で区切られます。しかし日本語では「IoTで未来を変える」など、スペースで区切られません。ハッシュタグであれば必ずスペースで区切られるため、検索の精度が高くなります。

よって、日本語でsearchAPIを使用する場合はハッシュタグで検索することを念頭に置いておくと幸せになれます:tada:
SVGで円をアニメーションさせたい時のMEMO

くるっと回る円のアニメーションを作りたい。
![Create_a_New_Pen.png](https://qiita-image-store.s3.amazonaws.com/0/2582/b6d35e8d-0301-57c4-e4c3-2b12ed7fafd9.png)
http://codepen.io/melo15/pen/yJmVEJ

結論、下記のように書くと良い。

```html
<svg width="124" height="124">
	<circle cx="62" cy="62" r="60" />
</svg>
```

```css
svg {
	transform: rotate(-90deg);
}

circle {
	fill: transparent;
	stroke: #4fa8df;
	stroke-width: 4;
	animation: circle 1s infinite;
}

@keyframes circle {
  0% { stroke-dasharray: 0 377; }
  99.9%,to { stroke-dasharray: 377 377; }
}
```

インラインSVGなので、モダンブラウザは対応していて、
IE8以下、Android2系以下辺りは使えなさそう。
http://caniuse.com/#feat=svg-html5

半径60pxの円を作りたいとすると、
`<svg>`の`width`と`height`には、`60px x 2 = 120px`
これに、のちのち設定する円の外側の線幅(stroke-width)の4pxを足して、124pxを設定する。
`<circle>`の`cx`と`cy`には、124pxの半分の値を設定し、円を`<svg>`の中央に配置する。
`r`は円の半径で60pxを設定するが、この値によって後々アニメーションさせる時の値が変わってくる。

CSSでは、
`<circle>`の`fill`を`transparent`にして塗りつぶしなしに設定。
`stroke`と`stroke-width`を指定して、円の外側に線を表示する。
これを`animation`を使って、くるっと回るアニメーションにする。

アニメーションでは、破線を設定する`stroke-dasharray`を使う。
`stroke-dasharray: 破線の長さ 破線の間隔;`
この破線の長さをアニメーションさせる事で、くるっと回るアニメーションとなる。

この時、破線の間隔の値は、円周の長さを設定する必要があり、計算によって導く。
円周の長さは`直径 x 3.14`で計算する。
今回は、`120 x 3.14 = 376.8`なので、小数点を切り上げて`377`とした。
あとは、破線の長さを0から377までアニメーションさせると、くるっと1周するアニメーションとなる。

```css
@-webkit-keyframes circle {
  0% { stroke-dasharray: 0 377; }
  99.9%,to { stroke-dasharray: 377 377; }
}
```

もし、1周ではなく半分のところで止めたい場合は、`377 / 2 = 188.5`などを設定すると良い。

最後に、そのままだとアニメーションの開始点が90度ずれてしまうので、
`<svg>`に`transform: rotate(-90deg);`を設定して、上からくるっと回るアニメーションにする。

同じようなアニメーションのデモも、CodePenにあったのでメモ。
https://codepen.io/kyledws/pen/Gvelt/
定期的に原因不明でサーバーが落ちるのでシンプルに監視する


AWSで運用中のサービスが定期的に何故か落ちるので落ちたら通知してくれる仕組みを導入してみた。
モニタリングのサービスは色々あって高機能なものが多いけれど、今回は単純に落ちてるかどうかわかればよかったので[NewRelic](https://newrelic.com/)のSYNTHETICSでやってみる。

前提
-----

[NewRelic](https://newrelic.com/)でアカウント登録済み


SYNTHETICSに登録する
-----

SYNTHETICSメニューから `Create new monitor` を押して新規登録する。
![Screen Shot 2016-08-20 at 20.20.54.png](https://qiita-image-store.s3.amazonaws.com/0/10058/3f2e236a-c9f0-d10e-8d81-8531d836a5fc.png "Screen Shot 2016-08-20 at 20.20.54.png")


 - モニタタイプ= `Ping`
 - URL= 監視したいURL
 - Location= ひとまずTokyoだけでいいや
![Screen Shot 2016-08-20 at 20.23.01.png](https://qiita-image-store.s3.amazonaws.com/0/10058/bb4aac8e-3495-e580-e133-f0f8001c971d.png "Screen Shot 2016-08-20 at 20.23.01.png")
![Screen Shot 2016-08-20 at 20.23.15.png](https://qiita-image-store.s3.amazonaws.com/0/10058/63456e36-f994-f321-d1ba-d30314c10f46.png "Screen Shot 2016-08-20 at 20.23.15.png")


 - schedule= そんなにシビアでもないので１０分で
![Screen Shot 2016-08-20 at 20.23.21.png](https://qiita-image-store.s3.amazonaws.com/0/10058/bab8979e-045b-79ef-4b57-511abf3529f9.png "Screen Shot 2016-08-20 at 20.23.21.png")

 - notified= 通知したいEmailアドレス
![Screen Shot 2016-08-20 at 20.23.44.png](https://qiita-image-store.s3.amazonaws.com/0/10058/ddc13324-e520-ddb1-8ad4-0fc923799442.png "Screen Shot 2016-08-20 at 20.23.44.png")


登録された
![Screen Shot 2016-08-20 at 20.24.34.png](https://qiita-image-store.s3.amazonaws.com/0/10058/0805eecb-bd05-6b74-fed5-c976776873bb.png "Screen Shot 2016-08-20 at 20.24.34.png")

通知されてみる
-----

サーバーが落ちているとこんな感じのメールが届く
![Screen Shot 2016-08-27 at 15.57.20.png](https://qiita-image-store.s3.amazonaws.com/0/10058/b61c115b-7a38-63d5-7a7f-36dbe6f5cb11.png "Screen Shot 2016-08-27 at 15.57.20.png")


復旧してしばらくするとこんな感じのメールが届く
![Screen Shot 2016-08-27 at 15.57.33.png](https://qiita-image-store.s3.amazonaws.com/0/10058/ebc2a8b8-bca1-b893-a923-8214c904fd8e.png "Screen Shot 2016-08-27 at 15.57.33.png")



ひとまずはこれでしのいでみる。そもそもなんで落ちるのか原因を探らないと・・・。

以上
Railsマイグレーションの外部キー制約を表現するreferencesについて



![CompanyとProjectの一対多の関係性](https://cdn.suin.io/547/1.svg)

この図のような関連性で外部キー制約を表現するには

```rb
class CreateProjects < ActiveRecord::Migration
  def change
    create_table :projects do |t|
      t.references :company
      t.timestamps null: false
    end
  end
end
```

と書けばよさそうですが、これでは外部キー制約になりません。`foreign_key: true`を付ける必要があります。

```rb
class CreateProjects < ActiveRecord::Migration
  def change
    create_table :projects do |t|
      t.references :company, foreign_key: true
      t.timestamps null: false
    end
  end
end
```

また次のような同じモデルを複数カラムから参照するような関連性でも`references`は使えません。

![MessageテーブルとUserテーブル](https://cdn.suin.io/547/2.svg)

こうしたケースでは、`add_foreign_key`を使います。

```rb
class CreateMessages < ActiveRecord::Migration
  def change
    create_table :messages do |t|
      t.references :sender
      t.references :recipient
      t.timestamps null: false
    end
    add_foreign_key :messages, :users, column: :sender_id
    add_foreign_key :messages, :users, column: :recipient_id
  end
end
```

参考: [Rails:外部キー制約をマイグレーションで表現する方法](https://suin.io/547)
ソフトウェア・テストの技法 第２版読んだまとめ

# 自己紹介
- 村上です
- オズビジョン6年。
- 過去にはゲーム会社にいたり、受託開発したり。
- 猫好き
- 本は古典が好き
- 仕事はほとんどPHP。
- テストコードはPHPUnit、Seleniumをちょろちょろ触る。

---
# テスト関連で読んだ本
- はじめて学ぶソフトウェアのテスト技法
- ソフトウェアテスト293の鉄則
- テストから見えてくる グーグルのソフトウェア開発
- マインドマップから始めるソフトウェアテスト

---

# ソフトウェア・テストの技法 第２版
- 著者:グレンフォード・J・マイヤーズ
- 1979年初版
- 1980年日本語訳
- 2004年2版
- 古典だけど25年ぶりにWebプログラミングとかエクストリームプログラミングの内容を追加して出版された。
- 2版も10年以上前だけど。

---

# １章〜３章まで読んだ
- １章：自己診断テスト
  - 3つの数字を入力してどんな３角形になるかを出力するシステムのテストを考える。
- ２章：プログラム・テストの心理学と経済学
  - テストはサディスティックだ！
  - 全部テストするのは無理だ！
- ３章：プログラムの検査、ウォークスルー、検討
  - 要はレビュー。

---
# １章：自己診断テスト
このプログラムのテストケースとテストデータを考えてみろ。
- 入力ダイアログから３つの整数を読む。
- ３つの値は、三角形の3辺の長さを表す。
- 出力は、三角形が「不等辺三角形」「二等辺三角形」「正三角形」のどれかを示すメッセージ。

---
# やってみたところ
- パラメタの値が3つじゃないとかやな！
- 入力が数字じゃないとかやな！
- 0とかマイナス値とかやな！
- あとは正常系のパターンやな！

---
# 足りなかった事
- 少数を考えてなかった！
- 数字３つなら全部三角形が成り立つと思ってた！
  - １、２、３だと線になってしまう。
  - １、２、５だと線がつながらない。
- 各パターンの順番を変えたパターンがなかった。
  - １、２、３の他に２、１、３とか。

---
# １章まとめ
もし、あなたが良い点を取ったならおめでとう。
さもなければ、私が助けよう

だそうです。助けてもらおうと思います。

---
# ２章：プログラム・テストの心理学と経済学
全てのパターンをテストする事は無理ですよという前提から始まるこの章。

---
# テストとは！
↓違う
・エラーが無い事を示す過程
・意図された通りに動く事を示すこと
・思い通り動く確信を作る

↓正解
・エラーを見つけるつもりでプログラムを実行すること。

---
# 心理的な話
言葉遊びのようでもあるが

- 「エラーが無いようにする」
  - エラーが出ないようなテストデータを考える心理になる。

- 「エラーの存在を証明する」
  - エラーを見つける確率の高いデータを考える心理になる。

---
# つまり
- テストとはサディスティックな行為だ！
- 破壊的だ！
- エラーの発見は「失敗したテスト」ではなく「成功したテスト」だ！

---
# 例えるなら
体調が悪くて医者に行って「異常はありません」と言われたらどう思うか？

プログラムを体調の悪い患者だと思え！

---
# 全てのテストが無理な話
- ブラックボックステスト
- ホワイトボックステスト
- 他いろいろ原則

---
# ブラックボックステスト
- 入力と出力を気にしてテストする。
- 入力可能な全ての値を試す。  
↓
- 無理  
↓
- 制限されたパターンで発見できるエラーを最大化する。という事になる。

---
# ホワイボトックステスト
- プログラムの全ての経路を通るようなテストをすれば完全なテストになるか。  
↓
- 繰り返し処理があるから無理
- プログラムが仕様通りじゃないかもしれないから無理  
↓  
略

---
# その他原則
- 結果もしっかり定義しておく。
  - もっともらしい結果を都合よく解釈するのが人間というもの。
- 他人にテストしてもらう
- エラーが見つかった所には更にエラーがある


など、１０個ぐらい書いてあります。

---
# ３章：プログラムの検査、ウォークスルー、検討
要するにレビューの事だった。

昔読んだ本と同じような事が書いてあった。
「ピアレビュー」
https://www.amazon.co.jp/ピアレビュー-Karl-Wiegers/dp/489100388X

---
# エラーの早期発見
- 発見が早いと修正のコストが安い
- レビューでエラーを見つけると修正箇所も同時に見つかる
- エラーがまとめて見つかる

経済的！
---
# レビューのやりかた
- 書いた人以外が読む。
- エラーを見つける事に集中する。
- 修正方法については後で話す。
- 人ではなくプログラムに質問する。
- レビュー結果を人事評価などに使わ無い。
- エラーのチェックリストを使う。

など

---
# 感想
Web上でのレビューが流行ってるからこういう事するのが少なくなりました。
そんなことないですか。

---
# 仲間内の評価
お互いのコードを評価して品質を高めていこうという取り組みについて書いてあった。
テストとは直接関係ない。

- メンバーから自分にとって最高なコードと最低なコードと思うものを集める。
- 集まったメンバーに無作為にコードを配ってチェックしてもらう。

---
# 評価のしかた
YES、NOをつけてもらう。
- 理解しやすかったか
- 設計が明確で適切か
- 変更しやすいか
- 自分が書いたとしたら誇りに思えるか

プログラマの自己評価に使ってみよう。

---

# 次回
- ４章はテストケースの設計の話とか。
foreachに関する小ネタ

#何をするのか
みんな大好きforeachでくるくる回すのに必要なコトって何なの？と言うことで一つ

#foreachに必要なこと
一般的には、`foreach   (   local-variable-type   identifier   in   expression   ) `の`expression`の部分が`Ienumerable<T>`を持ってるコトが必要と思われがちです。。。が、実はこれだけじゃ無かったりする。

実際、下記のサンプルは動くし、言語仕様的にも規約通りだったりする。

```csharp

using System;

namespace ForEachSample
{
	public class NotEnumerator
	{
		private readonly int _limit;

		public NotEnumerator(int limit)
		{
			_limit = limit;
			Current = -1;
		}

		public bool MoveNext() => ++Current < _limit;

		public int Current { get; set; }
	}

	public class NotEnumerable
	{
		public NotEnumerator GetEnumerator()=>new NotEnumerator(10);
	}

	static class MainEntry
	{
		static void Main()
		{
			NotEnumerable value=new NotEnumerable();

			foreach (int i in value)
			{
				Console.WriteLine(i);
			}
		}
	}
}

```

このように、`bool MoveNext()`メソッド及び`Current`プロパティを持っている列挙子を返すような`GetEnumerator()`メソッドを実装していればforeachで列挙可能だったりする。有り体に言えば、ダックタイピングが可能だよと言うことで。
厳密な定義に関しては、言語仕様の8.8.4 foreach ステートメントの後半に書いてあるので興味のある方はご一読頂ければと。

#但しLINQおめーはダメだ

C#2.0くらいまでなら、割とコレなら何でも行けて便利デスネで終わるのですが、時代はC#6.0なので、`IEnumerable<T>`持っていないと実は結構致命的な問題が出てくる。そう、みんな大好きLINQ[^1]が使えないのだ。
これは、`IEnumerable<T>`に対する拡張メソッドとして定義されているので、`IEnumerable<T>`じゃないオブジェクトには利用不可であるという当たり前っちゃ当たり前の理由。

#まとめ
原則、`IEnumerable<T>`を使うが一番良いとは思います。それにイマドキなら`yield`からそれこそ、Enumerator部分を文字通りyieldするので、この辺気にすることも無いかなと。

じゃあ全然使いどころが無いかと言われると、そんなことも無いのが面白いところで、特定の状況でこいつ使うと、素のyield使った実装よりシャア並に早くなったりすることもある。
その辺は又別のエントリでまとめてみようかと。
と言うことでおつきあい頂ありがとうございました。

[^1]: 正確に言えばLINQ to Objectデスね。
インスタンスをpickleするときに困ったこと

インスタンスを丸ごと保存したく，pickleを利用したのだが，配列のメンバ変数（コードにおける__hoge）が適切に保存できていなかった。sample1.pyではうまく行かず，sample2.pyではうまくいっています。理由はよくわからないが，appendと代入は違うようです。

詳細知っている方は，ぜひコメント頂けたらと思います。

```py:sample1.py
# -*- coding: utf-8 -*-

import os
import pickle

class Test():
    __hoge = []
    __foo = ""

    def __init__(self):
        self.__hoge.append("hoge1")
        self.__hoge.append("hoge2")
        self.__hoge.append("hoge3")
        self.__foo = "foo"
        return

    def print(self):
        print(self.__hoge)
        print(self.__foo)
        return

if __name__ == '__main__':
    pickle_path = 'dataset.pkl'

    if not os.path.exists(pickle_path):
        # initialize class and save pickle
        test = Test()
        with open(pickle_path, 'wb') as output:
            pickle.dump(test, output)
        test.print()
        # console:
        # ['hoge1', 'hoge2', 'hoge3']
        # foo

    else:
        # load pickle
        with open(pickle_path, 'rb') as output:
            test = pickle.load(output)
        test.print()
        # console:
        # []     <---- why?
        # foo

```

```py:sample2.py
# -*- coding: utf-8 -*-

import os
import pickle

class Test():

    __foo = ""
    __hoge = []

    def __init__(self):
        hoge = []
        hoge.append("hoge1")
        hoge.append("hoge2")
        hoge.append("hoge3")
        self.__hoge = hoge
        self.__foo = "foo"
        return

    def print(self):
        print(self.__hoge)
        print(self.__foo)
        return

if __name__ == '__main__':
    pickle_path = 'dataset.pkl'

    if not os.path.exists(pickle_path):
        # initialize class and save pickle
        test = Test()
        with open(pickle_path, 'wb') as output:
            pickle.dump(test, output)
        test.print()
        # console:
        # ['hoge1', 'hoge2', 'hoge3']
        # foo

    else:
        # load pickle
        with open(pickle_path, 'rb') as output:
            test = pickle.load(output)
        test.print()
        # console:
        # ['hoge1', 'hoge2', 'hoge3']     <---- great!
        # foo

```
mruby hello world

https://github.com/mruby/mruby/issues/2813

https://matt.aimonetti.net/posts/2012/04/25/getting-started-with-mruby/

-lm要放在最后面 比如

```bash
 gcc -I mruby-1.2.0/include/ 2.c /home/vagrant/.rvm/src/mruby-1.2.0/build/host/lib/libmruby.a -lm -o 2 
```

```bash
gcc -I /home/vagrant/.rvm/src/mruby-1.2.0/include wiki-example.c /home/vagrant/.rvm/src/mruby-1.2.0/build/host/lib/libmruby.a -lm -o wiki-example 
```

https://github.com/mruby/mruby/wiki/Building-your-Ruby-environment-and-accessing-it.

http://blog.mruby.sh/201207020720.html

https://github.com/carsonmcdonald/mruby-c-example

https://github.com/ruby-rcade/mruby_examples
UnityOSC

# UnityでOSCをしてみる

UnityとMaxの連携をしてみる。

##1.UnityOSCをダウンロード

https://github.com/jorgegarcia/UnityOSC

##2.UnityにUnityOSCをいれる
Assets直下にUnityOSC/srcをドラッグ＆ドロップ。

##3.OSCController.CSフォルダをつくる
Assets直下に。


```OSCController.CS

using UnityEngine;
using System.Collections;

public class OSCController : MonoBehaviour {
	public string serverId = "max";
	public string serverIp = "172.20.10.3";
	public int    serverPort = 12000;

	public KeyCode debugKey = KeyCode.S;
	public string  debugMessage = "/sample";

	// Use this for initialization
	void Start () {
		OSCHandler.Instance.Init(this.serverId, this.serverIp, serverPort);
	}
	
	// Update is called once per frame
	void Update () {
		if (Input.GetKeyDown(this.debugKey))
		{
			OSCHandler.Instance.SendMessageToClient
			(this.serverId, this.debugMessage, Time.timeSinceLevelLoad);
		}
	}
}

```


##4.OSCHandler.CSの一部を書き換える

```OSCHandler.C

...

public void Init(string serverId, string serverIp, int serverPort)
	{
        //Initialize OSC clients (transmitters)
        //Example:		
		CreateClient(serverId, IPAddress.Parse(serverIp), serverPort);

        //Initialize OSC servers (listeners)
        //Example:

        //CreateServer("AndroidPhone", 6666);
	}

...

```

##5.Max


![スクリーンショット 2016-08-25 19.37.48.png](https://qiita-image-store.s3.amazonaws.com/0/45798/c1841f0f-c5cd-12ec-de65-128fdf844121.png)
Zurb Foundation 6で、Grid（レスポンシブ対応段組機能）でカラムに枠線をつけたい

FoundationのGrid機能は大変強力ですが、実際のプロダクションフローやクライアントワークで求められるデザインを実現するには、CSSの理解と、カスタマイズが必要です。

カラムに線をつけるというのは必ずといって良いほど求められるスタイルですので、紹介しておきます。

# 前提として読んでおいていただきたい記事（拙著）

* [Zurb Foundation 導入前の予備知識](http://qiita.com/kohki-shikata/items/bd6cfda580a54159232e)
* [Zurb Foundation 6で、Grid（レスポンシブ対応段組機能）を理解し実用する（基本編）](http://qiita.com/kohki-shikata/items/db34b811f2e1ab25fcbb)
* [Zurb Foundation 6のGrid（レスポンシブ対応段組機能）について、小ネタとTips編](http://qiita.com/kohki-shikata/items/1edfb347d72dae0ae852)

# 普通に考えると…

こうしますよね？？

```html:hoge.html
<div class="row">
  <div class="columns medium-8">
    <h2>メインコンテンツ</h2>
    <p>メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　</p>
    <p>メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　</p>
  </div>
  <div class="columns medium-4">
    <h2>サイドバーだよ</h2>
    <p>サイドだよ　　サイドだよ　　サイドだよ　　サイドだよ　　サイドだよ　　サイドだよ　　サイドだよ　　</p>
  </div>
</div>
```

```css:app.css
.columns {
  border: 1px solid #ddd;
}
```

## 結果

![スクリーンショット 2016-08-27 16.46.47.png](https://qiita-image-store.s3.amazonaws.com/0/116223/f542963c-8a63-8383-1c78-cc7a797c412e.png)

うーん、なんか残念ですね。メインとサイドバーがぴっちりくっついちゃってます。

# 改善

```html:hoge-advanced.html
<div class="row">
  <div class="columns medium-8">
    <div class="inner">
      <h2>メインコンテンツ</h2>
      <p>メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　</p>
      <p>メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　メインだよ　　</p>
    </div>
  </div>
  <div class="columns medium-4">
    <div class="inner">
      <h2>サイドバーだよ</h2>
      <p>サイドだよ　　サイドだよ　　サイドだよ　　サイドだよ　　サイドだよ　　サイドだよ　　サイドだよ　　</p>
    </div>
  </div>
</div>
```

```css:app.css
.inner {
  border: 1px solid #ddd;
  padding: 0 15px;
}
```

`.columns`の一つ下に`.inner`という要素を新しく作り、それに対して枠線をあてています。また、paddingも調整しました。

## 結果

![スクリーンショット 2016-08-27 16.53.52.png](https://qiita-image-store.s3.amazonaws.com/0/116223/5f23a6a4-7107-3c6e-aa89-62a58c7665e7.png)

メインとサイドバーの間に隙間が空きました。良い感じになりましたね。
CLLocationManagerでdidUpdateLocationが2回呼ばれる現象

初投稿になります。
お見苦しい箇所も多々あると思いますがよろしくお願い致します。
###現象
ボタンをタップしたら位置情報を取得して画面遷移を行う機能を実装していました。
画面遷移が完了してから、端末のGPSがオフになる前にBack前画面へ戻り、
同一のボタンをタップすると、didUpdateLocationが2回呼ばれ、一気に2画面遷移をしてしまう事態が発生しました。
###対応
```swift
// MARK: - delegate
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {

    // 位置情報取得後挙動

    // GPSのオフ
    manager.stopUpdateLocation()
    // 以下今回対応箇所
    self.locationManager.delegate = nil
}

// MARK: - プロパティ
let locationManager = CLLocationManager()
```

位置情報が取得されたタイミングでstopUpdateLocationを呼んでいたのですが、コールバックが2回来るため、delegateに対してnilを入れることで2度目のコールバックが呼ばれる事をブロックしました。
stopUpdateLocationが呼ばれてから端末のGPSがオフになるまでに5~10秒ほど時間がかかっていたので、その間に再度startUpdateLocationが呼ばれることで、コールバックが2回来ていたのではないかと考えています。
###終わりに
私の実装方法が悪かったのか、LocationManagerでは発生しうる可能性の高い現象かはわかりませんが、同じ現象で悩んでいる方のご参考になればと思います。
また同じ現象でもっといい修正方法があればご教授いただければなと思います。
【JSF】標準コンバーターについて

JSF備忘録として今回もJSFの記事です

JSFシステムはコンポーネントが受け取った値をバッキングビーンの変数に代入します
文字列を変数と同じ方に変換するときに使用されるのが`コンバータ`です

##標準コンバータ
入力された文字列データをバッキングビーンの変数と同じ方に変換するために自動的に使用されます
またバッキングビーンの値をJSFページに出力するときも逆変換のために使用されます

| 標準コンバータ|
|:----------------|
| BooleanConverter|
| LongConverter|
| EnumConverter|
| ByteConverter|
| FloatConverter|
| DateTimeConverter|
| CharacterConverter|
| DoubleConverter|
| NumberConverter|
| ShortConverter|
| BigDecimalConverter|
| IntegerConverter|
| BigIntegerConverter|

日付と数値に関してはFaceletsタグとしてプログラマが利用できます
日付は`f:convertDateTime`タグ、数値は`f:convertNumber`タグ

##Date型のコンバータ(f:convertDateTime)

`f:convertDateTime`タグは、文字列をDate型に変換、または逆変換をするコンバータです

###日付の入力
日付を入力するときのf:convertDateTimeの使い方は、h:inputTextタグの子要素として記述します
その際の`pattern`属性に日付の入力形式を指定します

```
<!-- 例2016/1/1のように出力 -->
<h:inputText value="#{bean.date}">
	<f:convertDateTime pattern="yyyy/M/d"/>
</h:inputText>
```

###日付の出力
日付を出力するときのf:convertDateTimeの使い方は、h:outputTextタグの子要素として記述します
その際の`pattern`属性に日付の入力形式を指定します

```
<!-- 例2016年10月01日のように出力 -->
<h:outputText value="#{bean.date}">
	<f:convertDateTime pattern="yyyy年MM月dd日"/>
</h:outputText>
```

###パターン文字

| 文字| 意味|
|:---|:---|
| y| 年|
| M| 月|
| d| 日|
| E| 曜日|
| a| 午前または午後|
| h| 時(12時間制)|
| H| 時(24時間制)|
| m| 分|
| s| 秒|

###属性
f:convertDateTimeの属性

| 属性| 値| 初期値
|:---|:---|:--:|
| type| date, time, both(時刻と日付)のどれかを指定| false
| dateStyle| default, short, medium, long, fullのどれかを指定| -|
| timeStyle| default, short, medium, long, fullのどれかを指定| -|
| pattern| yyyy/M/dなどのフォーマット指定| -|
| local| ja, enなどの言語の地域を指定| -|
| timeZone| 指定値は(java.util.TimeZoneクラス)を参照| GMT|

##数値型のコンバータ(f:convertNumber)
`f:convertNumber`タグは、文字列と数値の変換を行うコンバータです
主に出力で使用し小、数点の桁数を指定したり、通貨形式で表示したりすることができます

###数字の出力
数値を¥10,000のように表示するには、`type属性`に`currency`を指定します
currencyを指定すると、通貨記号がつき、3桁ごとにカンマで区切られます

```
<!-- ¥10,000のように出力 -->
<h:outputText value="#{bean.amount}">
	<f:convertNumber type="currency" />
</h:outputText>
```

また、任意に整形して表示するには、数値の`パターン文字`を使用します

```
<!-- 3桁ごとにカンマで区切って出力 -->
<h:outputText value="#{bean.amount}">
	<f:convertNumber pattern="###,##0" />
</h:outputText>
```

値が0の場合は「0」と表示されます
末尾の0を#とすると値が0の時は空白の表示となります

###パターン文字

| 文字| 意味|
|:---|:---|
| #| 数字、1230は、「###,###」の指定で「1,230」と0を削って表示|
| 0| 数字、1230は、「000,000」の指定で「001,230」と0をそのまま表示|
| .| 小数点|
| ,| 数字の間に挿入するカンマ|
| %| 100倍した値に%をつけて表示|

###属性
f:convertNumberの属性

| 属性| 値|
|:---|:---|
| type| number, currency, percent|
| pattern| フォーマット指定|
| maxFractionDigits| 小数点以下の最大桁数|
| minFractionDigits| 小数点以下の最小桁数|
| maxIntegerDigits| 最大桁数|
| minIntegerDigits| 最小桁数|
| IntegerOnly| trueとすると整数部分だけをパース|
| groupingUsed| falseとすると区切り文字を挿入しない|
| local| ja, enなどの言語の地域を指定|
| currencyCode| JPY, USD, EURなどISO_4217での通貨コードを指定|
| currencySymbol| ¥,$などの通貨記号|
Pythonを実行しているOSの判別

Pythonのプログラムで、ファイル名をフルパスで指定する場合など、WindowsとLinuxでパス名が違っているため区別したいことがあります。

WindowsかLinuxかを判別するだけでよければ、`os.name`で十分です。

https://docs.python.org/3.5/library/os.html#os.name

Windowsの場合

````
>>> import os
>>> os.name
'nt'
````

Bash on Ubuntu on WindowsなどLinuxの場合

````
>>> import os
>>> os.name
'posix'
````

となるので、`os.name`をチェックすれば、どちらのOSかがわかります。

判別例

````
if os.name == 'nt': fname = 'C:\Windows\Fonts\YuGothM.ttc'
else: fname = '/mnt/c/Windows/Fonts/YuGothM.ttc'
````
Zurb Foundation 6で、Grid（レスポンシブ対応段組機能）でカラムを中央揃えにしてみる

時として、サイト全体の幅いっぱいでなく、少し狭めた幅でコンテンツを表現したい時もあるかと思います。FoundationのGridにはそういう時のためのクラスも用意されています。

# 前提として読んでおいていただきたい記事（拙著）

* [Zurb Foundation 導入前の予備知識](http://qiita.com/kohki-shikata/items/bd6cfda580a54159232e)
* [Zurb Foundation 6で、Grid（レスポンシブ対応段組機能）を理解し実用する（基本編）](http://qiita.com/kohki-shikata/items/db34b811f2e1ab25fcbb)
* [Zurb Foundation 6のGrid（レスポンシブ対応段組機能）について、小ネタとTips編](http://qiita.com/kohki-shikata/items/1edfb347d72dae0ae852)

# こんな風にしたい

カンプ的なものを、Adobe XDで作ってみました。

![Web 1920 – 1.png](https://qiita-image-store.s3.amazonaws.com/0/116223/a4e92fa1-22fc-9ad4-5bc6-eb0e223671f9.png)

# 実践

```html:hoge.html
<div class="row">
  <div class="column medium-6 medium-centered">
    <h2>見出し的な</h2>
    <p>コンセプチュアルな文言　コンセプチュアルな文言　コンセプチュアルな文言　コンセプチュアルな文言　コンセプチュアルな文言　コンセプチュアルな文言　コンセプチュアルな文言　コンセプチュアルな文言　コンセプチュアルな文言　コンセプチュアルな文言　コンセプチュアルな文言　コンセプチュアルな文言　</p>
  </div>
</div>
```

```css:app.css
body {
  padding-top: 200px;
}
.row {
  background-color: #F1FADF;
  padding-top: 100px;
  padding-bottom: 100px;
}

.column {
  background-color: #fff;
}

h2 {
  text-align: center;
}
```

スタイルは適当です。

## 結果

![スクリーンショット 2016-08-27 16.24.34.png](https://qiita-image-store.s3.amazonaws.com/0/116223/97c7bb43-6efa-ba5f-fb6f-cbc359cd06c9.png)

## 理屈

* **`.画面幅-centered` とふった`.column`は、.rowの中で中央揃えになる**
* モバイルファースト設計なため、`.画面幅-centered`を指定した一段階広い幅の画面でも、-centeredは引き継がれる
    * `.medium-centered.large-centered`と`.medium-centered`は同じ振る舞いになる。

# 応用編： 特定の画面幅でだけ中央揃えにしない

あんまりないかもしれませんが、下記のようなシチュエーションを想定します。

* PCの時は、左寄せ
* タブレットの時は、中央揃え

```html:hoge.html
<div class="row">
  <div class="column medium-6 medium-centered large-uncentered">
    <h2>見出し的な</h2>
    <p>コンセプチュアルな文言　コンセプチュアルな文言　コンセプチュアルな文言　コンセプチュアルな文言　コンセプチュアルな文言　コンセプチュアルな文言　コンセプチュアルな文言　コンセプチュアルな文言　コンセプチュアルな文言　コンセプチュアルな文言　コンセプチュアルな文言　コンセプチュアルな文言　</p>
  </div>
</div>
```

## 結果

PCの時

![スクリーンショット 2016-08-27 16.32.04.png](https://qiita-image-store.s3.amazonaws.com/0/116223/9dd5f82a-fe8f-4a75-d1f3-f241a94fefd4.png)

タブレットの時

![スクリーンショット 2016-08-27 16.32.14.png](https://qiita-image-store.s3.amazonaws.com/0/116223/6d6b77af-49cd-ec88-f776-5bcc03993b32.png)

## 理屈

`-centered`が指定された`.column`は、それよりも一段階広い幅においても引き継がれるため、それよりも一段階広い幅の時に中央寄せを止めたい場合は、リセットする必要があります（←とても面倒くさい日本語すいません💦）

その時に使うのが`.画面幅-uncentered`です。uncenteredも、一段階広い幅に対して引き継がれるようになっています。

例えば

* `.column.small-6.small-centered.medium-uncenterd`
* `.column.small-6.small-centered.medium-uncenterd.large-uncentered`

は同じ振る舞いです。上記は、

| スマホ | タブレット | PC |
|:-:|:-:|:-:|
|中央揃え|左寄せ|左寄せ|

という振る舞いになります。
Inventory / unity > code v0.9 > Mac: 入力欄の日本語対応

```txt:ビルド環境
Unity 5.3.5-f1 on MaxOS X El Capitan
```

在庫表示システム。
関連: v0.1 http://qiita.com/7of9/items/076cf5aaff7095bb876d

### バグ

MacOS X上においてのみ、InputFieldの日本語入力が失敗していた。

以下の訂正をした。
http://qiita.com/7of9/items/3f99e9ca8d685f5ac24b

Name入力欄だけ対応。

[v0.9 @ github](https://github.com/yasokada/unity-160820-Inventory-UI/releases/tag/v0.9)

<font color=red>git pull時にInventory.csvも更新されます。</font>
Unityでプレイ動画を録画してシェアするパッケージ作った

# UnityRecShare
https://github.com/tkyaji/UnityRecShare

* 今の所 iOS のみで、録音は未対応

# 機能

* 要は Lobi REC とか Everyplay みたいなやつ
* 動画ファイルを直接共有するので、Twitter や Facebook の**タイムライン上で再生可能**
* iOS の共有シート(`UIActivityViewController`)で共有 *1
* 動画の最初・最後に画像を差し込める（アプリのタイトルとか表示できる）
* 動画に指定した画像を重ねて録画できる（画面端にアプリのアイコンとか表示したり） *2


> *1 Twitterは動画ファイルの共有に対応していないようなので、UIActivityを作って対応した

> *2 動画に画像を重ねた場合、録画中のCPU消費が増加してしまうので注意（あんまり使えないかも。。。）

# サンプル

実際に録画してTwitterに投稿したサンプル。
動画の最初と最後に画像を差し込んで、動画の右下にURL画像を重ねている状態。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ro" dir="ltr">UnityRecShare<a href="https://t.co/7sFfMHiKvN">https://t.co/7sFfMHiKvN</a> <a href="https://t.co/Tq5gVkyqaK">pic.twitter.com/Tq5gVkyqaK</a></p>&mdash; tkyaji (@tkyaji) <a href="https://twitter.com/tkyaji/status/769431504766119936">2016年8月27日</a></blockquote>
tfenvでTerraformのバージョン管理をする

[tfenv](https://github.com/kamatama41/tfenv)はTerraformのバージョン管理を簡単にするために作ったツールです。[rbenv](https://github.com/rbenv/rbenv)にインスパイアされてます。

現在複数の環境でTerraformを使ってて、それぞれ使っているバージョンが違う場合があるので、バージョンの切り替えを楽にしたい、間違って違うバージョンを使ってしまう事故を防ぎたい(tfstateの互換性が無かったりする場合があるので)という動機で作りました。

## 使い方(v0.5.x)
### Install/Uninstall
GitHubから任意のパスにcloneして`tfenv/bin`にパスを通すだけ。 
アンインストールはそのパスを消すだけです。

もしくはMacユーザーの方はHomebrewでもインストールできます

```
$ brew install tfenv
```

### tfenv install/uninstall
指定したバージョンをインストール/アンインストールします`latest`で最新版をインストールします。 `latest:^0.8`という書き方もでき、この場合0.8系での最新がインストールされます。

```sh
$ tfenv install 0.8.0
$ tfenv install latest # latest version
$ tfenv install latest:^0.8 # latest version with Regex
$ tfenv uninstall 0.8.0
```

`shasum` コマンドと [keybase](https://keybase.io/)がインストールされていると、よりセキュアにダウンロード可能になります。 [参考PR](https://github.com/kamatama41/tfenv/pull/39)

### tfenv use
利用するバージョンを切り替えます。こちらも`latest:^0.8`という書き方ができます。

```sh
$ tfenv use 0.8.0
$ tfenv use latest:^0.8 # latest version with Regex
```

### tfenv list
現在インストールしているバージョンを列挙します。

```sh
% tfenv list
0.9.0-beta2
0.8.8
```

### tfenv list-remote
インストール可能なバージョンをリモートから取得して列挙します。

```sh
% tfenv list-remote
0.9.0-beta2
0.9.0-beta1
0.8.8
0.8.7
0.8.6
...
```

### .terraform-version
rbenvの`.ruby-version`と同じような機能で、プロジェクトルートに`.terraform-version`というファイルを置いておくとそのファイルに書かれたバージョンを優先して利用します。また、引数なしの`tfenv install`でそのバージョンをインストール出来るようになります。

```sh
$ echo 0.7.3 > .terraform-version

$ terraform --version
Terraform v0.7.3

$ echo latest:^0.8 > .terraform-version

$ terraform --version
Terraform v0.8.8
```
Rails5へのActiveAdminの導入

基本的に[ActiveAdmin](https://github.com/activeadmin/activeadmin)のreadme読めばいいだけの話ですが作業メモがてら

#### 1.Gemfileを編集 
依存関係にあるのでdevise未導入の場合は一緒に導入

```ruby:Gemfile
# framework for creating administration style interfaces
gem 'activeadmin', github: 'activeadmin'
gem 'inherited_resources', github: 'activeadmin/inherited_resources'
gem 'devise' # if you need
```
#### 2. bundle install
#### 3. インストーラを実行

```bash
bundle exec rails g active_admin:install 
```

いつもの設定事項リストなので割愛

```bash
  ===============================================================================

Some setup you must do manually if you haven't yet:

  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:

       config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

     In production, :host should be set to the actual host of your application.

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root to: "home#index"

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

  4. You can copy Devise views (for customization) to your app by running:

       rails g devise:views

===============================================================================
```

#### 4. DB migration
AdminUserモデルのmigrationファイルが生成され、seed.rbに初期ユーザのseedが追記されているので反映
この際、初期管理者ユーザのmail, P/W は以下を編集しておけば変更できる

```ruby:db/seed.rb
AdminUser.create!(email: 'admin@example.com', password: 'password', password_confirmation: 'password')
```

migrationを実行

```bash
bundle exec rails db:migrate
bundle exec rails db:seed
```

#### 5. 動作確認

```bash
bundle exec rails s
```

http://localhost:3000/admin へアクセスして、初期管理者ユーザのmail, P/Wでログインできれば成功
Inventory / unity > csv_d160827 > 手持ちの部品をInventory.csvにした > ネスト例など

```txt:ビルド環境
Unity 5.3.5-f1 on MaxOS X El Capitan
```

在庫表示システム。
関連: v0.1 http://qiita.com/7of9/items/076cf5aaff7095bb876d
関連: v0.8 http://qiita.com/7of9/items/dfa9a46710b9805b8f2a

### Inventory.csv更新

自分が現在もっている電子部品関連を棚卸しなおして、データシートリンクの整備も行いInventory.csvを更新した。

ソフトの動作は変更がないので、以下のタグとした。
[tag:csv_d160827 @ github](https://github.com/yasokada/unity-160820-Inventory-UI/releases/tag/csv_d160827)

[Inventory.csv @ github](https://github.com/yasokada/unity-160820-Inventory-UI/blob/master/Assets/Resources/inventory.csv)

### 使用例

- 162品目
- 箱がいくつかある。箱にはName: `shelf{4桁数字}`をつけた。
  - 例: shelfNo=1, row=1, column=1: shelf0002. 8連ケース
- shelNo=9999は箱に入っていない置き方を意味する
  - 例: shelfNo=9999, row=1, column=1: shelf0015. 箱 > チップスターS
- 箱の中に箱があり、その箱の中に部品がある場合。
  - 例: shelfNo=1, row=1, column=26: shelf0014(伊右衛門 2gx20bag) 
  - 例(続き): shelfNo=14, row=1, column=1: ESP-WROOM02
- shelf0035を見たい時
  - Unique ID: 350101と入力 (shelfNo:35, row=1, column=1を意味する)
  - Check押下
  - あとはRow:Prev/Next, Column:Prev/Nextで箱の中身を移動できる

### トラブル

Inventory.csvは以下の場合、ソフトが正常に動かない

- shelfNo, row, columnの組合せが重複している
- Nameが重複している
- 項目の途中に改行が入っている

上記の場合、ソフト起動直後の内部辞書登録時にエラーが出る。

エラーを回避するようにもできるが、どういう対応が最適か未検討。

実行時エラーが出たら上記あたりを確認すること。

- 名前重複を避けるため、以下のようなことをしているデータもある
  - ケーブル緑__230103
  - shelfNo=23
  - row=1
  - column=3

### 余談

今回の棚卸に以下のラベルシールを使った。
http://www.nichiban.co.jp/stationery/mt_removable/index.html

ラベルシールを購入するため近所に買い出しに行ったが、３つ目のお店で見つけた。今回のソフトをこういうことに使うのもありかもしれない。

ソフト実装に10時間ほどかかり、棚卸に7時間かかった。

17時間かかったが、今後の部品準備にかかる時間が短縮できるので問題ない。
Zurb Foundation 6で、Grid（レスポンシブ対応段組機能）で左右のカラムを入れ替えてみる

[前回](http://qiita.com/kohki-shikata/items/1edfb347d72dae0ae852)、[前々回](http://qiita.com/kohki-shikata/items/db34b811f2e1ab25fcbb)の記事では、FoundationのGridにおける基本と、その小ネタやTipsについて紹介しました。

この記事では、それを踏まえて、より高度な機能を事例を交えて紹介します。

# カラムの左右入れ替え

何度も紹介しているサイドバーですが、左サイドバーの場合、何も考えずにマークアップすると、こうなりますよね。

```html:left-sidebar.html
<div class="row">
  <div id="sidebar" class="columns medium-3">
    <h2>サイドバーやで</h2>
    <p>コンテンツやで　コンテンツやで　コンテンツやで　コンテンツやで　コンテンツやで　</p>
  </div>
  <div id="main" class="columns medium-9">
    <h2>メインーやで</h2>
    <p>コンテンツやで　コンテンツやで　コンテンツやで　コンテンツやで　コンテンツやで　</p>
  </div>
</div>
```

しかし、これだと

![CodePen_-_A_Pen_by_Kohki_SHIKATA.png](https://qiita-image-store.s3.amazonaws.com/0/116223/0dcc68c3-0839-12fa-d5ca-2d649ca8326e.png)

サイドバーがコンテンツの頭にきてしまいます。SEO的観点からも、サイトのメインコンテンツはサイドバーよりも先に表示されないと都合が悪いです。

## 解決

Foundationには、サイドバーを入れ替える`push-`と`pull-`という機能があります。

```html:left-sidebar.html
<div class="row">
  <div id="main" class="columns medium-9 medium-push-3">
    <h2>メインーやで</h2>
    <p>コンテンツやで　コンテンツやで　コンテンツやで　コンテンツやで　コンテンツやで　</p>
  </div>
    <div id="sidebar" class="columns medium-3 medium-pull-9">
    <h2>サイドバーやで</h2>
    <p>コンテンツやで　コンテンツやで　コンテンツやで　コンテンツやで　コンテンツやで　</p>
  </div>
</div>
```

まず、`#sidebar`と`#main`を入れ替え、`#main`を先にします。これだけだと、右サイドバーになってしまい、都合が悪いですね。

次に、入れ替えたい**`.画面幅-push（またはpull）-ずらしたいカラム数`**という名前のクラスを入れます。pushは画面左から右に向かって押し出すイメージ、pullは、画面右にあるものを左に引き寄せるイメージです。

今回サイドバーとメインのを入れ替えるため、サイドバーのカラム幅分、メインを右に押し出し、逆にメインの幅分、サイドバーを左に引き寄せることによって、見た目上左サイドバーとしています。

## 結果

PC・タブレットの時

![スクリーンショット 2016-08-27 15.48.35.png](https://qiita-image-store.s3.amazonaws.com/0/116223/32b6d5cf-2e07-217d-64bf-b2a45ebcc826.png)

スマホの時

![スクリーンショット 2016-08-27 15.50.55.png](https://qiita-image-store.s3.amazonaws.com/0/116223/4d3a6683-c02a-391e-c5b9-420f07f80d70.png)


# まとめ

* Foundation Gridでは、カラムの左右を入れ替える`push`と`pull`というクラスが用意されている
* SEO的観点からも、メインコンテンツはサイドバーよりもHTML上は先に表記されていたい
split関数で区切文字が連続する場合にデータの空白を列に反映させる方法

# 問題
データがNULLのカラムなどで区切り文字が連続で表示される場合、
split関数をそのまま利用すると、データがずれてしまう

例)
#### csvデータ
1a,b,c,d,e
2a,,c,,e

#### splitを利用
1a|b|c|d|e
2a|c|e|◯|◯
※◯の分データが左寄せになる

# 回避策
substitute関数を利用する
例)
```split(substitute(substitute(a1,",,",",NA,"),",,",",NA,"),",")```

参考
[Google スプレッドシート　区切り文字を指定して文字列を複数セルに分割](http://webbeginner.hatenablog.com/entry/2014/09/22/104019)