OmniAICreator/Qiita-1.07M huggingface dataset:
【FileMaker】マージ変数とマージフィールド、結局使い方はほぼ一緒

マージ変数とマージフィールド、最初さっぱりわかりませんでしたが、つまりは「テキストの中に埋め込む”変数”がマージ変数、テキストの中に埋め込む”フィールド”がマージフィールド”」であると理解しています。

どっちも”＜＜＞＞”で囲むんだから、
一つの言葉でええやん。

と思いますが、FileMakerでは言葉を分けているようです。

ほら使い方は一緒。
![1222_4.png](https://qiita-image-store.s3.amazonaws.com/0/60538/30815d63-f324-ce4c-10c1-4610a9dd2d8d.png)

ただこれで話を終わらせるのもなんなので、マージ変数で使っているグローバル変数とマージフィールドの適用例をここに示します。

例えば、カテゴリーごとにメニューを表示したい時〜。
これは今全件表示しているところ。
![1222_1.png](https://qiita-image-store.s3.amazonaws.com/0/60538/d14a8163-e1ff-d98c-2390-41eb4ccf05b7.png)

カテゴリーボタンをクリックすると、ボタンを押すごとにくるくるとカテゴリーごとのメニューが現れます。
![1222_3.png](https://qiita-image-store.s3.amazonaws.com/0/60538/b742f2c5-f1e2-5ca3-0f64-e2117ee7b01c.png)

そして、「店長のオススメ度」という情報は、「店長オススメ」というフィールドをテキストに入れ込んでいます。これがマージフィールドです。
印刷フォーマットなどでもよく使うと思います。
![1222_2.png](https://qiita-image-store.s3.amazonaws.com/0/60538/f885616e-a11a-069f-5857-cfb22935844a.png)

ちなみに、マージうんちゃらはこの辺↓にあります。
![1222_6.png](https://qiita-image-store.s3.amazonaws.com/0/60538/3a44c6b6-b57c-dbee-a743-5d7265ffc0a2.png)

マージフィールドを作る時は、「マージフィールドにこのフィールドを使う」と選択するだけです。
![1222_7.png](https://qiita-image-store.s3.amazonaws.com/0/60538/0d8f51ca-47b3-408b-dd19-4979586e0bcc.png)

マージフィールドは単に出力するだけなのですが、マージ変数はスクリプトでボタンが押された時のボタン名を変更したり検索したりと様々なことができます。
![1222_5.png](https://qiita-image-store.s3.amazonaws.com/0/60538/7d5f3e21-9f3a-233a-f4c3-ab3bbb57f302.png)

ボタン押した時にボタン名の変更とかって、よくある仕様ですよね。

マージ関連についても開発時はよく使う項目だと思いますが、意外と言葉的にフィットしないのでスルーしてしまうので（私だけ？）、綺麗なレイアウトや動的に実現したいことがあったらぜひ使ってみてください。
Railsでページャーを簡単に実装できるGem「kaminari」

## いつ使えるの？

Railsプロジェクトで、ページャーを実装したい時。

## 公式リポジトリ

[kaminari](https://github.com/amatsuda/kaminari)

## kaminariをインストール

```ruby:Gemfile
gem 'kaminari'
```
```
$ bundle install --path vendor/bundle
```

で gem をインストールします。

## 設定ファイルを生成
```
$ bundle exec rails g kaminari:config
``` 

```ruby:config/initializers/kaminari_config.rb
Kaminari.configure do |config|
  config.default_per_page = 5
  # config.max_per_page = nil
  # config.window = 4
  # config.outer_window = 0
  # config.left = 0
  # config.right = 0
  # config.page_method_name = :page
  # config.param_name = :page
end
``` 
default_per_page には、ページに表示するコンテンツの数を指定します。（Controller側で、Book.page(params[:page]).per(5)とも書ける）

## Bookモデルを作成

```
$ bundle exec rails g model book title:string color:string
```

## Controllerを編集

```ruby:app/controllers/home_controller.rb
def show
  @books = Book.page(params[:page])
end
``` 

## View側

```erb:app/views/home/show.html.erb

<% @books.each do |book| %>
<%= book.title %>
<% end %>
<%= paginate(@books) %>
```
![page.png](https://qiita-image-store.s3.amazonaws.com/0/36485/a130d4fd-c3e3-1b59-53c2-d14c0c31692d.png)

データをいれると、コンテンツが表示されて、paginateの部分にページャーができました。

シンプル！
プライベート関数をユニットテストする

## アクセス制御を回避して、プライベート関数をテストする方法

プライベート関数をVarに変換してアクセスすれば、他のパッケージから呼び出し可能。[参考](http://christophermaier.name/blog/2011/04/30/not-so-private-clojure-functions)

* プライベート関数を定義

````clojure
(ns private-test.core)

(defn- a-private-func []
  (println "called a private function."))
````

* ユニットテストから呼び出し

````clojure
(ns private-test.core-test
  (:require [expectations :refer :all]
            [private-test.core :refer :all]))

(expect nil
  (a-private-func))
````

````
Error refreshing environment: java.lang.RuntimeException: Unable to resolve symbol: a-private-func in this context, compiling:(private_test/core_test.clj:6:3)
````

* 完全パッケージ名をつけても同様に失敗

````clojure
(expect nil
  (private-test.core/a-private-func))
````

* ```#'``` をつけると、異なる名前空間からでもプライベート関数の呼び出しが可能

````clojure
(expect nil
  (#'private-test.core/a-private-func))
````

## なぜこんなことが可能なのか

* ```#'``` (Var quote)は```(var x)```の省略記法。```private-test.core/a-private-func```はシンボル(clojure.lang.Symbol)であるが、Var quoteによってvar (clojure.lang.Var)に変換されている。プライベート関数のアクセス制限はシンボル内の```:private```メタデータで行われているため、varに変換されるとその制限は外れる。

````clojure
(meta #'private-test.core/a-private-func)
=>
{:private true, :ns #<Namespace private-test.core>, :name a-private-func, :file "private_test/core.clj", :column 1, :line 3, :arglists ([])}
````
日本語で単語の途中で改行させないように頑張る

# やりたいこと

HTML上で「メールアドレス」という単語が画面幅の都合上、

> メールア
> ドレス

と改行されることがあり、これを

> メール
> アドレス

のように単語で区切って改行されるようにしたい。

# 結果

とりあえずこういう感じにマークアップすればよかった。
（注：実運用では間違っても`span`全体に指定しないこと）

```html
<!doctype html>
<meta charset="utf-8">
<style> span { white-space: nowrap; } </style>
<div>
<span>私</span><wbr><span>は</span><wbr><span>日本語</span><wbr><span>を</span><wbr><span>勉強</span><wbr><span>して</span><wbr><span>い</span><wbr><span>ます。</span>
</div>
```

手で指定するにはあまりにも面倒なので、自動でやってくれるスクリプトがほしい。
が、形態素解析が必要なのでJSだけだと無理かも。

## 追記

~~全体をくくるだけで良かったようだ。多少楽になった。~~ ダメだったらしい、コメント参照

```html
<!doctype html>
<meta charset="utf-8">
<style> .no-wrap { white-space: nowrap; } </style>
<div class="no-wrap">
私<wbr>は<wbr>日本語<wbr>を<wbr>勉強<wbr>して<wbr>い<wbr>ます。<wbr>
</div>
```

# 他に

なにかもっとシンプルなやり方があればコメント下さい。
今更ですけど、fluentdについてマトメてみる(その1)

個人的にfluentdをちゃんと分かっていないと思ったので、勉強の意味もこめて改めて纏めてみました。

#fluentdってそもそもどういうものか
公式サイトは[こちら](http://www.fluentd.org/)です。

![スクリーンショット 2014-12-22 11.44.40.png](https://qiita-image-store.s3.amazonaws.com/0/1686/289a5a38-fcfa-b8e5-9973-20aab18a13ba.png)

fluentdを一言で言えばイベントログ収集ツール。Treasure data方が作成されたもので、ログの収集や転送などができます(複数台のサーバのログを収集できる)。プラグインがあって、様々なシステムで利用することができます。

参考：[イベントログ収集ツール fluent リリース！](http://frsyuki.hatenablog.com/entry/20110929/p1)

#fluentdを使ってみる
##インストール
方法は幾つかあるようです。

*gemで入れる
*yumで入れる

参考:[fluentdのインストール方法](http://docs.fluentd.org/categories/installation)

##試しに使う
サンプルとしてローカルで動かしているrailsアプリケーションのログをfluentdを使って収集してみます。

まずはfluentdの設定ファイルを作成します。

```fluentd.conf
<source>
  type tail
  format none
  path /usr/local/*****/****/log/development.log
  tag hoge_log.access
</source>

<match hoge_log.access>
  type file
  path /usr/local/****/fluent_log/test.log
</match>
```

sourceで指定しているpathの値はサンプルrailsアプリのログの出力先です。
matchのpathはfluentdが収集したログを出力する先(今回はtypeをfileで指定してファイルとして出力)です。
それでは起動してみます。

<pre>fluentd -c fluentd.conf -vv &</pre>

上のように設定ファイルを指定して起動します。プロセスをチェックして起動出来ていることを確認してみると

![スクリーンショット 2014-12-22 10.54.46.png](https://qiita-image-store.s3.amazonaws.com/0/1686/0eaf9f50-ed8b-9abb-c0c6-3b66ce0ddbe2.png)

で、railsアプリを起動して適当に動かしてみると・・

![スクリーンショット 2014-12-22 11.32.55.png](https://qiita-image-store.s3.amazonaws.com/0/1686/9cfac0ce-e40c-7db9-baf0-8e31c86de913.png)

左がrailsアプリのログで右がfluentdのログですが、ログ出力されているなーというのが分かるかと思います。

#fluentdの設定を見てみる
fluentdの設定ファイルの記述方法について整理します。

##source
ログの入力先を定義します。入力もととしては標準入力、ファイル、ポート指定のHTTP通信などがあります。

###type
ログの入力もとを指定

* forward: 標準出力
* tail: ファイル(上の例ではこちら)
* http: http通信

###path
入力もとファイルのパス

###tag
matchディレクティブで指定しているもの。sourceで入力を定義し、matchで出力を定義しますが、tagはsourceで入力されたものをどのmatchで受け取るか関連付けるもの。

##match
収集したログの出力先を定義します。先ほどの例のようにファイルに出力する方法もあれば、標準出力、他のfluentdに転送するなど色々あります。

###type
収集したログの出力先を指定

* stdout: 標準出力
* file: ファイル(上の例ではこちら)
* http: http通信

###path
入力もとファイルのパス

## include
他のfluentd設定ファイルをincludeすることができます。

#他のfluentdとの連携
ここはその2で書きます。
[JAWS-UG CLI] SQS:#4 キューの削除

AWS CLIを利用して、SQSのキューの削除をします。


前提条件
========


SQSへの権限
-----------

SQSに対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

* AWS CLI 1.10.6
* AWS CLI 1.6.10

```bash:コマンド:
aws --version
```

```text:結果(例):
aws-cli/1.9.20 Python/2.7.5 Darwin/13.4.0 botocore/1.3.20
```


0. 準備
=======


0.1. リージョンの決定
---------------------

削除対象のキューが存在するリージョンを指定します。 (カレントユーザが利用するカレントリージョンも切り変わります。)

```bash:変数の設定(東京リージョンの場合):
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. 変数の確認
---------------

プロファイルが想定のものになっていることを確認します。

```bash:コマンド:
aws configure list
```

```text:結果(例)
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile         sqs-prjz-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                         ap-northeast-1  env    AWS_DEFAULT_REGION
```


0.3. キューの指定
-----------------

削除するキューを指定します。

ここでは、http://qiita.com/tcsh/items/a41ac99e41430c1d758c で作成したキューを指定します。

```bash:変数の設定:
SQS_QUEUE_NAME='example-queue'
```

```bash:変数の設定:
SQS_QUEUE_URL=$( \
        aws sqs get-queue-url \
          --queue-name ${SQS_QUEUE_NAME} \
          --output text \
      ) \
        && echo ${SQS_QUEUE_URL}
```

```text:結果:
      https://ap-northeast-1.queue.amazonaws.com/XXXXXXXXXXXX/example-queue
```


1. 事前作業
===========


1.1. キューの確認
-----------------

削除対象のキューが一覧に存在することを確認します。

```bash:コマンド:
aws sqs list-queues \
        --queue-name-prefix ${SQS_QUEUE_NAME}
```

```json:結果:
      {
        "QueueUrls": [
             "https://ap-northeast-1.queue.amazonaws.com/XXXXXXXXXXXX/example-queue"
        ]
      }
```


1.2. メッセージ数の確認
-----------------------

キューの削除前に、キュー内にメッセージが残っていないか確認しましょう。

```bash:コマンド:
aws sqs get-queue-attributes \
        --queue-url ${SQS_QUEUE_URL} \
        --attribute-names ApproximateNumberOfMessagesNotVisible
```

```json:結果:
      {
        "Attributes": {
          "ApproximateNumberOfMessagesNotVisible": "0"
        }
      }
```

```bash:コマンド:
aws sqs get-queue-attributes \
        --queue-url ${SQS_QUEUE_URL} \
        --attribute-names ApproximateNumberOfMessages
```

```json:結果:
      {
        "Attributes": {
          "ApproximateNumberOfMessages": "0"
        }
      }
```

両方とも値がゼロになっていれば、処理待ちのメッセージが無いことになります。


2. キューの削除
===============

キューを削除をします。

```bash:変数の確認:
cat << ETX

        SQS_QUEUE_URL: ${SQS_QUEUE_URL}

ETX
```

```bash:コマンド:
aws sqs delete-queue \
        --queue-url ${SQS_QUEUE_URL}
```

```text:結果:
      (戻り値なし)
```


3. 事後作業
===========


キューの削除完了確認
--------------------

削除したキューが一覧に存在しないことを確認します。

```bash:コマンド:
aws sqs list-queues \
        --queue-name-prefix ${SQS_QUEUE_NAME}
```

```text:結果:
      (戻り値なし)
```

listに反映されるまでにタイムラグがあるようです。


完了
====

以上で、SQSのキュー削除が完了しました。
今年の CandyCane まとめ

こんにちは:smile: 普段 CakePHP を書いてないくせにアドベントカレンダーを書く暴挙にでたアカウントがこちらです。

さて、もうすぐクリスマスですね。クリスマスと言えばなんでしょうか? そう、[CandyCane](http://yandod.github.io/candycane/ja/) ですね。
そんなわけでいつも通り他に話せるネタがないので CandyCane の話をします。

# 今年の CandyCane

今年は私はバグを直しただけであまり関われてないのですが、コミットログを見る限りだと、Vagrantfile がしっかりしたり、Selenium でのテストが追加されたり、PHP 5.6 でのテストが追加されたりと主にテスト回りが強化された感じでしょうか。

# 来年の CandyCane

来年は CakePHP 3 もでるだろうし、きっと CandyCane を CakePHP 3 で動かしてみたって人がでてくる気がするのでそれなりに動きがあったりするんじゃないかと予想していますがどうなるでしょうか。

# まとめ

そんなわけでもう書く事がなくなってしまいました。
なので、仕方なくプラグインを作ったりしてネタ増やしてきたので、今年作ったプラグインをまとめたので紹介します。

# 今年の CandyCane Plugins

残念ながらまだ公式のプラグインリストに反映されてないので、CandyCane の画面上からはインストールできません:dizzy_face: 

## CandyCane Overall Activity Menu

[hamaco/candycane-overall-activity-menu](https://github.com/hamaco/candycane-overall-activity-menu)

マネージャーだとか、複数のプロジェクトを並列で動かしてる人とかだと、プロジェクト単体のチケット一覧ではなく、プロジェクトを跨いだ全体の活動状況を一発で確認できると便利だと思います。
通常だと、プロジェクト一覧ページの右上からしかアクセスできない「全ての活動」へのリンクがグローバルメニューに置かれるので、クリック一発で見れて超便利！

ちなみに同名の Redmine プラグインがあります:yum: 

![candycane-overall-activity-menu.png](https://qiita-image-store.s3.amazonaws.com/0/844/28a98c70-41e7-9b89-66bd-0b2f012b1d04.png)

## CandyCane Default Due Date

[hamaco/candycane-default-due-date](https://github.com/hamaco/candycane-default-due-date)

チケットを作成する時に、開始日にはデフォルトで今日の日付が入ってるのに期限日には何も入ってないので、デフォルトで `7日後` の日付を入れてくれるようになります。

ちなみに同名の Redmine プラグインのパクりです:sweat_smile: 

![candycane-default-due-date.png](https://qiita-image-store.s3.amazonaws.com/0/844/57e2fe73-fc49-91f7-36a6-a900c90eeb51.png)

## CandyCane YouTube Video

チケットを作る時に YouTube の動画を貼りたい時ってあると思います。いや、あります。
そんな時にこのプラグインを使うと `{{youtube:M7x-P7CddPw:560:315}}` みたいな感じで、動画IDとサイズを渡してあげると YouTube 埋め込み用タグに置き換えてくれます。
あと、Wiki でも同様の書き方で YouTube の動画を埋め込めます。

ちなみに同名の Redmine プラグインを参考にしました:stuck_out_tongue_winking_eye: 

![candycane-youtube-video.png](https://qiita-image-store.s3.amazonaws.com/0/844/2fd811f8-c22e-94de-e61c-a6fd3c1f8f4a.png)

## その他のプラグイン

[プラグイン一覧](https://github.com/yandod/candycane-plugins)も最後の更新が去年だし、軽くググったり、GitHub で「candycane」で検索してみたりしても見つからないので多分ないです:cry:

# そんなわけで

あまりプラグイン増えていってる感じがしなくて個人的につまらないので、皆さんも CandyCane のプラグイン作りまくってみましょう！
CandyCane のプラグイン弄ってると、CakePHP のイベントシステムをバリバリ使いこなせるようになるかもしれませんよ！ 

ちなみに、CandyCane のプラグインは [yandod/cc_nyancat](https://github.com/yandod/cc_nyancat) あたりを読むとどんなことができるのか一通り分かってくると思うので、この辺を読んで作ってみると良いんじゃないでしょうか。
ついでに Redmine だとプラグインでここに処理挟めるのになーとかそういうのあったら CakePHP の Event 差し込みまくって CandyCane 本体にプルリクエスト投げまくると皆幸せになるかもしれません。
【CentOS, Ruby, rbenv】CentOSにrbenvを入れてRubyをインストール



## 前提

CentOS6.5での動作検証をしています。


## 一般ユーザ権限でrbenv, rubyをインストールする

### rbenvとruby-buildのインストール
	
	$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
	$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

### rbenvにPATHを通すための設定を追記
	
	$ echo '# add settings for rbenv' >> ~/.bash_prorile
	$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
	$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
	$ source ~/.bash_profile

### Rubyをインストール

#### インストール可能なバージョン一覧を確認

	$ rbenv install -l

#### Ruby 2.0.0-p598をインストールしてみる

	$ rbenv install 2.0.0-p643

#### デフォルトで利用するRubyのバージョンを指定

	$ rbenv global 2.0.0-p643


#### 使用されるRubyのバージョンを確認

	$ ruby -v


## root権限でグローバルにrbenvをインストールする

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

※ 事前に"su -"を行いrootユーザになっておく

	# cd /opt
	# git clone git://github.com/sstephenson/rbenv.git
	# mkdir /opt/rbenv/plugins
	# cd /opt/rbenv/plugins
	# git clone git://github.com/sstephenson/ruby-build.git


### rbenvのコマンドが有効になるように設定を変更

#### /etc/profileにrbenvのコマンドPATHを読み込むように追記

	# echo '# add settings for rbenv' >> /etc/profile
	# echo 'export RBENV_ROOT="/opt/rbenv"' >> /etc/profile
	# echo 'export PATH="${RBENV_ROOT}/bin:${PATH}"' >> /etc/profile
	# echo 'eval "$(rbenv init -)"' >> /etc/profile


#### /etc/profileの設定を読み込み

	# source /etc/profile


#### rbenvコマンドが実行できることを確認

	# rbenv

![rbenv_001.png](https://qiita-image-store.s3.amazonaws.com/0/18615/0913c031-6912-e380-610b-9652fc6102c0.png "rbenv_001.png")


### Rubyをインストール

#### インストール可能なバージョン一覧を確認

	# rbenv install -l

![rbenv_002.png](https://qiita-image-store.s3.amazonaws.com/0/18615/990658f9-2439-3825-6aa7-c139807de560.png "rbenv_002.png")


#### Ruby 2.0.0-p598をインストールしてみる

	# rbenv install 2.0.0-p598

![rbenv_03.png](https://qiita-image-store.s3.amazonaws.com/0/18615/929c8592-c19b-51f3-2c49-7bf50a2c755c.png "rbenv_03.png")


#### デフォルトで利用するRubyのバージョンを指定

	# rbenv global 2.0.0-p598


#### 使用されるRubyのバージョンを確認

	# ruby -v

![rbenv_04.png](https://qiita-image-store.s3.amazonaws.com/0/18615/5754e5d7-5256-6570-ed39-6a2ae85f35a8.png "rbenv_04.png")


## まとめ
以上、一般ユーザ・ルートユーザそれぞれでのrbenv, rubyのインストール方法でした。
基本的には開発時には、一般ユーザでのインストールをすることがおすすめです！
システム全体で同じ設定を共有することを前提として大丈夫な場合のみ、ルートユーザでのインストールをする感じかなと思います。
[JAWS-UG CLI] SQS:#2 メッセージの送信 (依頼側)

AWS CLIを利用して、SQSのキューにメッセージを送信してみましょう。
ジョブ依頼側の立場で、ジョブ処理を依頼するイメージになります。

前提条件
========

## SQSへの権限

* 操作するキューに対してRead/Write権限があること。

## AWS CLIのバージョン

以下のバージョンで動作確認済

* AWS CLI 1.10.6
* AWS CLI 1.6.10


0. 事前作業
===========


0.1. リージョンの指定
---------------------

対象のキューが存在するリージョンを指定します。
(カレントユーザが利用するカレントリージョンも切り変わります。)

```bash:コマンド:
export AWS_DEFAULT_REGION='ap-northeast-1'
```

このハンズオンでは、AWS標準のリージョン変数を利用していますが、regionオプションでコマンド毎に指定しても同様の結果になります。
(「オペミスを回避するために明示的に実行する」という意味ではregionオプションの方が良いです。)


0.2. キューの指定
-----------------

メッセージの送信先となるキューのURLを確認します。

```bash:コマンド:
SQS_QUEUE_NAME=$(date +%Y%m%d)-handson-queue \
  && echo ${SQS_QUEUE_NAME}
```


1. キューのURLの取得
=====================

```bash:コマンド:
SQS_QUEUE_URL=$(aws sqs get-queue-url \
  --queue-name ${SQS_QUEUE_NAME} \
  --output text \
) \
   && echo ${SQS_QUEUE_URL}
```

```text:結果:
   https://ap-northeast-1.queue.amazonaws.com/XXXXXXXXXXXX/20160509-handson-queue
```


2. 通知内容の決定
=====================

通知するメッセージ内容を決定します。

```bash:コマンド:
SQS_MSG_BODY='Hello World!'
```


3. メッセージ数の確認
=====================

メッセージ送信前に、キューにいくつのメッセージが処理待ちになっているか確認します。

```bash:コマンド:
aws sqs get-queue-attributes \
       --queue-url ${SQS_QUEUE_URL} \
       --attribute-names ApproximateNumberOfMessages
```

```json:結果:
   {
       "Attributes": {
           "ApproximateNumberOfMessages": "0"
       }
   }
```

キューを作成した直後であれば0のはずです。


4. メッセージの送信
===================

メッセージを送信します。

```bash:コマンド:
aws sqs send-message \
  --queue-url "${SQS_QUEUE_URL}" \
  --message-body "${SQS_MSG_BODY}"
```

```json:結果:
   {
       "MD5OfMessageBody": "6699d5711c044a109a6aff9fc193aada", 
       "MessageId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
   }
```


5. メッセージ数の確認
===========================

メッセージ送信後に、キューにいくつのメッセージが処理待ちになっているか確認します。

```bash:コマンド:
aws sqs get-queue-attributes \
       --queue-url ${SQS_QUEUE_URL} \
       --attribute-names ApproximateNumberOfMessages
```

```json:結果:
   {
       "Attributes": {
           "ApproximateNumberOfMessages": "1"
       }
   }
```

先程送信したメッセージがキューに到着していれば1になるはずです。


完了
====

ここまでで、ジョブの依頼側からキューに依頼を投げました。
generator-ionicのAndroid環境設定とproxyの設定

#generator-ionicのAndroid環境設定

[generator-ionic を紹介します](http://albatrosary.hateblo.jp/entry/2014/12/12/220521) の記事ではiOSしか紹介されていないのでAndroidについて補足する。

 1.まず、npm update -g でnpmを最新にする。
 2.次に、ionicのインストール

```
npm install -g cordova
npm install -g phonegap
npm install -g generator-ionic
mkdir ionic && cd $_
yo ionic
```

パラメータを適当に設定して導入完了。

3.次にAndroid SDKのインストール(mac osxを前提）

[ダウンロード](http://dl.google.com/android/android-sdk_r24.0.2-macosx.zip)したものを解凍してandroid-sdk-macosxをApplicationsフォルダにコピー、ターミナルから``tools/android update sdk`` でインストーラ実行、必要パッケージを選択する。
（ちなみに、私は以下を選択した）

```
    Tools
        Android SDK Tools
        Android SDK Platforms-tools
        Android SDK Build-tools (最新のもの21.1.2を一つだけ選択)
    Android 4.4.2(API 19)
        SDK Platform
        Google APIs(x86 System Image)
        Intel x86 Atom System Image
    Android 4.2.2(API 17)
        SDK Platform
        Google APIs
        Intel x86 Atom System Image
    Extras
```

4.antが入っていない場合、インストールする

```
curl -O http://ftp.jaist.ac.jp/pub/apache//ant/binaries/apache-ant-1.9.4-bin.tar.gz
tar zxvf  apache-ant-1.9.4-bin.tar.gz
sudo mv apache-ant-1.9.4 /usr/bin/
```

5.~/.bash_profile の編集して以下を追加

```
eport ANT_HOME=/usr/bin/apache-ant-1.9.4
export ANDROID_HOME=/Applications/android-sdk-macosx
export ANDROID_TOOLS=/Applications/android-sdk-macosx/tools/  
export ANDROID_PLATFORM_TOOLS=/Applications/android-sdk-macosx/platform-tools/                                                                                                                   
export PATH=$ANT_HOME/bin:$ANDROID_HOME:$ANDROID_TOOLS:$ANDROID_PLATFORM_TOOLS:$PATH
```

PATHの反映と確認
```
source ~/.bash_profile
ant -version
```

6.androidプラットフォームの選択
```
grunt platform:add:android
```

7.avdの作成(私の場合はandroid17を選択）
```
android list targets (android17のIDを確認する）
android create avd --name android17 --target 1
```

8.ブラウザ起動

~/.ionic/ionic.configに以下を追記する 
"ionicServeAddress": "localhost"

IPは２つ以上検知されると聞いてくるのでlocalhostを選択する
```
grunt serve
```

9.エミュレータ起動
```
grunt emulate:android --livereload
```

#proxyの設定

ionicサーバはreverse proxy機能があり、grunt-connect-proxyは使う必要がありません（使えません）

以下のようにionic.project にproxiesを追加するだけで使えるようになります。

***
In the `ionic.project` file you can add a property with an array of proxies you want to add. The proxies are object with two properties:

* `path`: string that will be matched against the beginning of the incoming request URL.
* `proxyUrl`: a string with the url of where the proxied request should go.

```json
{
  "name": "appname",
  "email": "",
  "app_id": "",
  "proxies": [
    {
      "path": "/v1",
      "proxyUrl": "https://api.instagram.com/v1"
    }
  ]
}

```
herokuでsidekiq起動時のエラー対処方法

railsでsidekiqを使って非同期の処理を扱いたいherokuに乗っているアプリにworker dynoを足してデプロイしました。

```
# config/sidekiq.yml
:verbose: true
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:concurrency: 2
:queues:
 - default
```

```
# Procfile
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
worker: bundle exec sidekiq -C config/sidekiq.yml
```

ProcfileでLaunchingのコマンドを足したので動くと思ってたんですがダメでした。
config/sidekiq.ymlが悪いのか、config/secrets.ymlでREDISTOGO_URLを受け取れてないのかいろいろ疑ったんですが、結局ログ見たら```tmp/pids```ディレクトリが無いというエラーが有りました。

つまりデプロイ時にtmpフォルダを作らないといけないのでProcfileを以下のように修正

```
# Procfile
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
- worker: bundle exec sidekiq -C config/sidekiq.yml
+ worker: mkdir -p tmp/pids && bundle exec sidekiq -C config/sidekiq.yml
```

とても単純なところなんですが気付くまでちょっと時間かかりました。

てゆうかtmpフォルダって無かったらheroku側で作ってくれないかな
VirtualBox(Vagrant)で一時共有フォルダを使う

一時的にホストOSと共有したいフォルダがあったときに、追加する方法です。

#前提
ゲストOSにVirtualBox guest additionsがインストールしてあること。
Vagrant環境なら、vagrant-vbguestが便利です。
https://github.com/dotless-de/vagrant-vbguest

#ホスト側
VM VirtualBox　マネージャーの設定で
共有フォルダー→新規共有フォルダーから、フォルダーのパスとフォルダー名を設定します。
名前を控えておいてください。
![vagrant.png](https://qiita-image-store.s3.amazonaws.com/0/55057/14e44086-cb84-d912-5325-91682012ebd0.png)

#ゲスト側
##linux
mount -t vboxsf [共有フォルダの設定の名前] [マウントするディレクトリ]

```
# mkdir /d_drive
# mount -t vboxsf D_DRIVE /d_drive
```

##windows
ネットワークの共有フォルダになっています。
&yen;&yen;vboxsvr&yen;share
GitHub に公開したライブラリプロジェクトの注目度を上げよう

ライブラリプロジェクトを作ったら、Maven や jCenter にアップロードして、DSL で簡単に依存管理できるようにすることは勿論重要な事ですが、ライブラリプロジェクト自体の存在が知られなければ、使われなくなってしまいます。

最近は Qiita などで取り上げられたり、GitHub にライブラリのまとめ情報があがったりして、それなりに注目を集める場ができつつありますが、折角なら、日本語圏に限らず広く知られる場所で認知度を高めていきたいものです。

## Android Arsenal

https://android-arsenal.com/

最近プロジェクトの登録が活発化しており、GitHub にバッチを貼るプロジェクトも少しずつ増えてきたサイトです。登録リクエストを投げると、サイトのオーナーがひとつずつ見て回って、感想も交えたりしながら掲載してくれます。このところはリクエストが多数寄せられているようで、掲載までに少し時間がかかるようですが、多少の英語と、いくつかのサンプルコードやスクリーンショットがあれば、それも含めて掲載してくれます。最悪英語がなくても、掲載時にオーナーがフォローしてくれるのでなんとかなります。

## Android Libs

http://android-libs.com/

Android Arsenal と同じく、Android のライブラリやツールを公開するためのポータルサイトです。Submit 機能はなにやらエラーを起こしているようですが、どうも動いているっぽい気がします（画像をアップロードしないと成功と見なされないようですが、投稿自体は機能しているようです）。
使えないPGを使えるようにする方法


本人も辛いだろうけど、回りも辛い。
使えるようにしてあげよう。
以下、上手くいった実例を綴ります。

### 目標設定（追記23/12/2014）
何かに対して、役に立つことを宣言してもらいます。
「教えられる」のではなく、自身で「求め、学ぶ」ことをペーパーに書いてもらいます。


### 分析
まずは聞いてみましょう。「何故プログラムなんかしたいのか？」
答えは色々でしょうけど、ポイントは目線
目線をそらす人は時間かかります。　迷子です。難しいです。
直視できる人は時間かかりません。 やりかたが解らないだけ。

### 環境構築
Linux環境を実機で構築することをやってもらいます。ここ大事です。
間違えたら動かないを体で覚えてもらいます。
ディストリは何でもいいです。
コンパイラ、エディタ、ローカルホストまで。
ターミナルとシェルを軽くレクチャー
とにかc,c++をやってもらいます。
IDEは一切使いません。

### 日本語化しない。
ソースコードを翻訳して、見せてあげましょう。
Englishを７割読めれば「使える」ことを伝えましょう。

###何がわからないのか？（追記23/12/2014）
ここもポイント
言葉にして、ディスカッションを行います。
「分からない」「わかった振り」の違いを徹底的に。

これで何とか出来てます。
ご意見等あれば、喜んで拝見いたします。
sorceryでログイン後にパスワードを再確認する方法

自分へのメモも兼ねて共有します。

#書き方

```
User.authenticate( email, password )
```
`email`と`password`でログインできるユーザーが存在すれば該当するユーザーを、そうでなければ、`nil`を返します。

#使用例

`email`変更時に`password`入力を求める場合。

````config/routes.rb
resources :users do
  get :edit_email, on: :collection
  post :update_email, on: :collection
end
````

````app/views/users/edit_password.html.erb
<%= form_tag edit_password_users_path, method: :post do %>
  <%= text_field_tag :email,
      placeholder: 'email'
   %>
  <%= password_field_tag :password,
      '',
      placeholder: 'パスワード'
   %>
<% end %>
````

````app/controllers/users_controller.rb
def update_email
  user_to_edit = User.authenticate( current_user.email, params[:password] )
  if user_to_edit.present? and user_to_edit.update_attributes(email: params[:email])
    redirect_to user_path(user_to_edit)
  else
    render :edit_email
  end
end
````

おかしなところがあったら指摘して頂けると嬉しいです。
この情報が誰かのお役に立てば幸いです。

#参考
https://github.com/NoamB/sorcery/issues/150
https://github.com/NoamB/sorcery/issues/34
pipのインストールが凄く楽になっていた件

Sphinxのlatest見に行ったら

>
Python Package Indexからソースコードをダウンロードするか、以下のコマンドでインストールしてください:「pip install -U Sphinx」


となっていて、「あれ、easy_install使わないんだ」なんて思っていたら2.7.9にpipが同梱されているみたいです。

私の端末は2.7.6でpipは入れてなかったので、試しに2.7.9にアップデートしたらpipコマンドが使えるようになってました。
うわー超楽になりましたね！
配列のキーはシングルクォートを使え

業務でリプレイス中のコードに以下のようなコードがあり、

```php
$array["key"] = $value;
```

シングルクォートとの違いが判らなかったのでメモ。

>配列のキーは、シングルクオートで囲む・ダブルクオートで囲む・~~なにも囲まない~~では、処理スピー>ドが違い、
>早い順番は　**シングル > ダブル > ~~囲まない~~** の順番である。
>ただ、実験してみると大きいスクリプトでない限り差は顕著に見られないが、
>可読性とバグ・エラー潰しのために囲っておくが吉。

とのこと。

## 追記
コメントより「囲わない」は厳禁だとの指摘を頂きました。
PHPマニュアルにも記載されておりました。（[該当箇所](http://php.net/manual/ja/language.types.array.php#language.types.array.foo-bar)）
ありがとうございます！

また、以下のような文字列連結の場合も、

```php
$text = 'text' . 'description';

$text = "text" . "description";
```

シングルクォートの方が早いことが多いらしいが、
ダブルの方が早い場合もあるため、特に拘る必要はなさそう。


# 参考URL
[カサヒラボ](http://d.hatena.ne.jp/kasahi/20070815/1187201809)
gitでPermission deniedって出た時にしたことメモ

色々やってみたが、下記なら上手くいった


```

$ vi  ~/.ssh/config

```


```

Host github
  HostName github.com
  IdentityFile ~/.ssh/id_rsa
  User rcmdnk
  Compression yes

```


### 追記
これでもしばたくしたらまた同じエラーが出た。
githubのGUIアプリ開いたらなぜか通った。謎。

難しいよgit
perlの-iオプションを<>ループ外から使うときの挙動

# 概要

結論から言えば、`-i`オプションは`<>`ループ外から使おうとしても狙い通りの挙動にならない。よってワンライナーでは原則として`-n`や`-p`とともに使うべきである。

例えば、以下は期待した挙動にならない。(perl 5.18.2で確認。以下同様)

    ## 3行目を削除して出力したい
    $ perl -i.orig -e '@f = <>; $f[2] = ""; print @f' sample.txt 

この場合、出力結果は標準出力に出てしまい、sample.txtは空ファイルになる。

以下も同様である。

    ## 各行に"> "という接頭辞をつけたい
    $ perl -i.orig -e 'print "> $_" for <>' sample.txt 

# なぜそうなるのか？

`perlrun`, `perlvar`によれば、グローバル変数`$ARGV`には現在`<>`で読み込んでいるファイル名が、グローバルファイルハンドル`ARGVOUT`には`-i`オプションの効果による出力先ファイルハンドルがセットされるらしい。

そこで、以下のスクリプトを用意する。

```perl
sub p {
    my ($dev, $ino) = stat(*ARGVOUT);
    print STDERR "ARGV: $ARGV, ARGVOUT: $ino, ^I: $^I\n";
}

print STDERR "-- before loop\n";
p();
print STDERR "-- enter loop\n";
while(<>) { p() }
print STDERR "-- after loop\n";
p();
```

で、実行。

```
$ perl -i.orig process.pl sample.txt sample2.txt 
-- before loop
ARGV: , ARGVOUT: , ^I: .orig
-- enter loop
ARGV: sample.txt, ARGVOUT: 2759153, ^I: .orig
ARGV: sample.txt, ARGVOUT: 2759153, ^I: .orig
ARGV: sample.txt, ARGVOUT: 2759153, ^I: .orig
ARGV: sample2.txt, ARGVOUT: 2759159, ^I: .orig
ARGV: sample2.txt, ARGVOUT: 2759159, ^I: .orig
ARGV: sample2.txt, ARGVOUT: 2759159, ^I: .orig
-- after loop
ARGV: sample2.txt, ARGVOUT: , ^I: .orig
```

上の結果から、以下の事実が読み取れる。

- `ARGVOUT`は`<>`の読み込み中にのみセットされており、`<>`ループの前と後では存在しない。この時、`print`は通常通り`STDOUT`に出る。
- `<>`の読み込み中、`ARGVOUT`は`$ARGV`の値に応じて適切に変化する。これにより、複数ファイルを一度に処理できる。

先の例では、

    $ perl -i.orig -e 'print "> $_" for <>' sample.txt 

`<>`を限界まで読み込んでリストに保持してからループを回している。そのため、ループ中は既に`ARGVOUT`は存在しない。

この場合、`for`を`while`にすればうまく動く。

    $ perl -i.orig -e 'print "> $_" while <>' sample.txt
Python環境セットアップ


## 0.はじめに
以下の説明基本的にMac環境ですが、そうでなくてもできるように書き直してみた(2016.02.26)。anyenvを使って、Python管理をしてみた。

### 前準備
git や ruby(普通はインストールされている; Homebrewが動か無い) が必要です。

```sh
# Macの場合
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew install git ruby

# Ubuntu
$ su
$ apt-get update && apt-get upgrade # もちろん、aptitudeでも良い。
$ apt-get install git ruby

```


## 1.anyenvインストール
- anyenvをインストールする。
- 環境変数(path)の設定をする。

### 1.1.参考にしたページ
- [anyenvをmacにインストールしてみる](http://qiita.com/kenjingoo/items/ef04bb85ca5ff7c0b033) / kenjingooさん
- [anyenvで開発環境を整える](http://qiita.com/luckypool/items/f1e756e9d3e9786ad9ea) / luckypoolさん
 - zshをbashに読み替えた。

### 1.2.手順
```sh
$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile 
$ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
$ source .bash_profile 
$ exec $SHELL -l
```

## 2.pyenvインストール
- pyenvをインストールする
- minicondaをインストールする
  - miniconda3-*.*.*でなく、miniconda-3.3.3を入れる。
  - 3無し(-3.3.3)は、Python2.7.9。(別にver.3が嫌いな訳ではない)
- 各種モジュールをインストールする。
  - ipython
  - dateutil
  - 数値計算系 / numpy, scipy, sympy
  - グラフ描画 / matplotlib
  - 天文系 / ephem, astropy
  - その他 / tornado

### 2.1.参考にしたページ
- [pyenvとminiconda3で数値計算環境構築](http://qiita.com/edvakf@github/items/feb7f0f077d3830725c6) / edvakf@githubさん

### 2.2.手順
```sh
$ anyenv install pyenv
$ pyenv install --list
#-> インストール出来るpythonバージョンの確認
$ pyenv install miniconda-*.*.*
$ pyenv global miniconda-*.*.*
$ pyenv rehash
$ python --version

$ conda install ipython numpy matplotlib scipy
$ pip install ephem astropy pyfits tornado
#-> ここは"pip install"でも出来る。
```

## 3. rbenvのインストール
rubyのとあるtoolを使いたかったので、入れてみた。
### 3.1.手順
```bash
$ anyenv install rbenv
$ exec $SHELL -l
$ rbenv install -l
# -> 2.2.0-rc1

$ rbenv install 2.2.0-rc1
$ rbenv global 2.2.0-rc1
$ exec $SHELL -l

```

# 4.その他
## インポートディレクトリの変更
```python
import sys
sys.path.append('/path/to/dir')
```


## まとめ
### 確認環境
#### Python
- MacOSX 10.10.1 _ '15/04/30
 - 基本問題がないが、一部でバグあり。
	 - Tkinterを起動する際に、アラートが出る。
	 - minicondaのpy2.7.9でなく、通常の2.7.9だと症状はでない。
- MacOSX 10.8.4
 - 上記全て確認。 
- Ubuntu 12.4.0
 - 上記全て確認。 
- RasberryPi Wheezy(3.12.28)
	- python2.7.6　インストール / 2015.06.01

#### Ruby
- MacOSX 10.8.4
 - 上記全て確認。 
 -
javascriptをcoffeescriptに書き換えるときは「==」演算子に気をつけるんだ！



## 要約
javascriptでの`a == b`と、coffeescriptでの`a == b`では意味が違う。
coffeescriptの`a == b`はコンパイルされると、javascriptの`a === b`になる、というお話。

## javascriptでの「==」と「===」
「===」演算子は、値とデータ型の両方が一致するときにtrueを返す。
一方、「==」演算子は、数値と文字列の比較でも察して比較してくれる。

```
123 == 123          // true
123 === 123         // true

123 == "123"        // true
123 === "123"       // false

123 == "0x7b"       // true
123 === "0x7b"      // false
```

一見いい感じに見える「==」だけど、8進数(0始まり)には弱い

```
123 == 0173         // true
123 == "0173"       // false(10進数の173として解釈される)
```

## coffeescriptでの「==」
「==」演算子は、コンパイルされるとjavascriptの「===」演算子になる。
javascriptで言うところの「==」演算子に相当するものはない。

```
123 == 123          // true
123 == "123"        // false
```

javascriptと挙動が違うのが気持ち悪いという人がいるからか、
coffeescriptには「==」演算子と同等の「is」演算子がある

```
123 is 123          // true
123 is "123"        // false
```

## coffeescirptで文字列と数値を比較するときは、
`parseInt`や`parseFloat`を使う。

```
123 is parseInt("123")     // true
1.23 is parseFloat("1.23") // true
```
Rubyで乗算/除算/剰余にビット演算を使うと却って遅くなるっぽい


CやC++を扱う人にとって、乗算/除算/剰余は実行速度面で無闇に使ってはいけない演算子で、
`b = a % 8;`とか見かけた日にはモヤモヤが止まらないと思う。
実質、コンパイラがこっそり最適化してくれてたり、実行頻度が低いコードだとほぼ差は無かったりするんだけれども。

そんな人がRubyを扱い始めて、同じようにビット演算を使って計算して「今日も良いコードを書いたぜ」と思ってたらむしろ悪化している、というお話。

## 測ってみた
こんな感じのコード。

```
require 'benchmark'

Benchmark.bm(7) do |x|
  # 乗算
  x.report("mul_nrm: ") { 10_000_000.times { 123 * 4  } }
  x.report("mul_bit: ") { 10_000_000.times { 123 << 2 } }

  # 除算
  x.report("div_nrm: ") { 10_000_000.times { 123 / 4  } }
  x.report("div_bit: ") { 10_000_000.times { 123 >> 2 } }

  # 剰余
  x.report("mod_nrm: ") { 10_000_000.times { 123 % 4 } }
  x.report("mod_bit1:") { 10_000_000.times { 123 & 3 } }
  x.report("mod_bit2:") { 10_000_000.times { 123 & ((1<<2)-1) } }
end
```

こんな結果に

```
                user     system      total        real
mul_nrm:    0.590000   0.000000   0.590000 (  0.598509)
mul_bit:    0.680000   0.000000   0.680000 (  0.681477)
div_nrm:    0.640000   0.000000   0.640000 (  0.633073)
div_bit:    0.690000   0.000000   0.690000 (  0.693372)
mod_nrm:    0.590000   0.000000   0.590000 (  0.595054)
mod_bit1:   0.670000   0.000000   0.670000 (  0.670466)
mod_bit2:   1.020000   0.000000   1.020000 (  1.012992)
```

`123 & ((1<<2)-1)`とか下位何ビットが欲しいのか分かるように気を利かせて書いた日にはもう…。

## ちなみにCの場合
一番極端なところだけ。`gcc -O0`でコンパイルした。
それでも`a = 123 % 4`なんてしてると書いた通りのアセンブラが生成されないので、
`a`を順次更新するようにちょっと変えている。厳密じゃないけど、ざっくりした比較ということで。

```
#include <stdio.h>
#include <time.h>

int main(void)
{
  int a = 123456789;
  clock_t start_time = clock();
  for(int i = 0; i < 1000000; ++i)
  {
    // 計測対象の計算 * 10回
  }
  double elapsed_time = clock() - start_time;
  printf("%f[sec]\n", elapsed_time / CLOCKS_PER_SEC);

  return 0;
}

```

|計算式|処理時間[sec]|
|:---|:---|
|`a = a % 4`|0.096101|
|`a = a & ((1<<2)-1)`|0.018355|

## 原因は…
原因はまだ調べてない！
個人情報を送信するアプリには必然性がいる 〜 17.2対応


#はじめに
ここに書く`個人情報`とはいわゆる日本国内で定める法規的意味でなく
・生年月日
・メールアドレス
など項目として使いがちな情報を必要とするコンテンツを制作するのに気をつけること、としての備忘録です。

法規的な内容についてはPrivacyPolicyの内容に含めてユーザに提示していることを前提としています。
>ユーザが入力する情報については、細かいものも含めて送信前にユーザへ承諾を得ることになっています

じゃあFacebookとかTwitterから情報取得する対応でもAppleさまから同じ17.2を元にご助言があったので
おまけでつけました。

#リスク回避
レビュア次第、というところはまだ払拭できません。

個人情報を任意項目として、入力しなくても利用できる構成がベスト
ですが、要件的にどうしても外せない、工期的に無理という場合は
必然性があるフローとして説明しきる構成に変えることを考慮します。

#申請から公開までの期間
長めにとる方が良いです。

iTunes Connectでアプリの申請時に
取得したパラメータの使い方をAppleのレビュアに説明として記載します。
レビュアとのやりとりは数日かかることがあり、数時間で回答してくれることは稀です。
レビュアが入力項目がどこで使われているか探してくれることは期待しないほうがいいです。

#項目について
入力させる項目については、確実に機能として使っていることが分かるよう実装していること

##生年月日
ユーザの生年月日に合わせたコンテンツであることが説明できる内容であること
生年月日を必要とするコンテンツは限定されると思います。

##例
乳幼児の健診、履歴書作成、人間ドックのオススメ

##メールアドレス
メールアドレスを使用する機能を実装していること。

###例
メールアドレスでのユーザ認証、機種変更時のデータの復元

#個人情報（名前、メアド）はSNSから取得するから入力しない方法は・・・
これも取得の用途だけではだめ！
Shareしたり、発言したりする機能をつけなさい
とRejectをもらいました:fearful: 

# 結果的によく取る対応
（1）本当にアプリの中で使ってるって分かる項目だけにする
レビュアによってなのか、アップル全体なのかは不明ですが`任意項目にしなさい`から動かない場合も多々あります。任意である分にはいいと・・・
（2） :apple: 聞く耳持たないから、ユーザ登録フロー取っちゃおうぜ :construction_worker: 
　→結果PCで登録させる

# 仕様を確認してから実装にかかりたい・・・
仕様を:apple:好みに変更するとして、こういう構成で良いかな、というところを決めるのは
>仕様策定段階では応えられない、実装済みのアプリありき

という対応でした。実装したアプリを申請してレビューしての判断ということを強くいわれます。

#参考URL

App Store Review Guidelines
https://developer.apple.com/app-store/review/guidelines/#privacy

Developer:リジェクトされないために App Storeレビューガイドラインの和訳 2014年最新版
http://www.sirochro.com/note/app-store-review-guidelines/#dt17

スマートフォンのアプリケーション・プライバシーポリシーに関するガイドライン
http://www.mcf.or.jp/temp/sppv/mcf_spappp_guidline.pdf

Your app needs a privacy policy.Why? Here are the 6 reasons.
http://www.iubenda.com/en/mobile/?utm_source=blog&utm_medium=post&utm_campaign=ios_guide

http://stackoverflow.com/questions/13561238/app-rejected-on-17-2-clause-asking-for-email-id
Smalltalkによる心のこもった計算

あらすじ
---

[八百屋で１００円のりんごを１００個買うといくら？ 1万円では、ない。](http://attrip.jp/70611/)への対策をPharo Smalltalkで実装してみました。

1万円ではない、だとう？
---

八百屋で100円のりんごを100個買うと10,000円だという計算には心がないのだそうだ。
八百屋ならおばちゃん（あるいはおじちゃん）が1,000円ぐらいまけてくれるから、答えは9,000円なのだそうだ。

なんという後出しジャンケン！
っていうか、オレ、八百屋で1,000円もまけてもらったことないです。orz

しかし、ビジネスをする上でこの手の後出しジャンケンは日常茶飯事。後出しジャンケンされてもニッコリと微笑んでその上をいってやろうではないか。それがビジネスSmalltalkerの生きる道である。キリリ

八百屋さんのビジネスロジック
---
まずは価格をオブジェクトで表現してみよう。ここではPharo3.0を使う。Heartful-Computationpパッケージ内で作業することにしよう。

```smalltalk:Heartful-Computation
Object subclass: #Money
	instanceVariableNames: 'unit number'
	classVariableNames: ''
	category: 'Heartful-Computation'
```

Moneyオブジェクトは通貨単位と数からなっています。メソッドは以下の5つ。


```smalltalk:Money-class
unit: aString number: aNumber
	^ self new
		setUnit: aString number: aNumber;
		yourself
```


```smalltalk:Money-class
yen: aNumber
	^ self unit: '¥' number: aNumber
```

```smalltalk:Money
* aNumber
	^ self class unit: unit number: number * aNumber
```

```smalltalk:Money
printOn: aStream
	aStream nextPutAll: unit.
	number printOn: aStream.
```

```smalltalk:Money
printOn: aStream
	aStream nextPutAll: unit.
	number printOn: aStream.
```

わかりやすいimmutableなオブジェクトですね。当然です、金額を提示した後で書き変えられたらたまりませんから。ビジネスの常識ですキリリ。
Smalltalkらしさのアピールとして、Numberにyenメッセージを追加。

```smalltalk:Number
yen
	^ Money yen: self
```

心あるObjectBoyの登場
---

では、八百屋の計算をするオブジェクトをつくります。

```smalltalk:Heartful-Computation
Object subclass: #ObjectBoy
	instanceVariableNames: 'lastAnswer'
	classVariableNames: ''
	category: 'Heartful-Computation'
```

まずは素直な八百屋計算を実装します。

```smalltalk:ObjectBoy
computeUnit: aMoney amount: anInteger
	^ lastAnswer := aMoney * anInteger
```

そして後出しジャンケンへの対応

```smalltalk:ObjectBoy
rightAnswer: anObject
	lastAnswer ifNotNil: [ lastAnswer become: anObject ]
```

さあ、ObjectBoyの「心」を見よ！
---

```smalltalk:Workspace
| boy answer |
boy := ObjectBoy new.
answer := boy computeUnit: 100 yen amount: 100.
Transcript cr; show: 'ここで変数answerに「', answer printString, '」と言質を取られる'.
Transcript cr; show: '9000円よ、あなたの計算には心がないわ！'.
boy rightAnswer: 9000 yen. 
Transcript cr; show: 'ふ、だから最初から言ってるじゃん、', answer printString, 'だって！'.
```

さて、Transcriptを見てみよう。

![スクリーンショット 2014-12-19 6.31.46.png](https://qiita-image-store.s3.amazonaws.com/0/59918/584c314d-8ecf-63b0-fb15-a2afddd49d3c.png)

バッチリ。Moneyオブジェクトはimmutableだということをお忘れなく。
これで見積書に間違った計算を書いて郵送しちゃってもオッケーですキリリ。
goqueryでHTMLの解析をする

今までHTMLの解析はRuby使ってNokogiriでやることが多かったんだけど、インストールしようとすると大抵ビルド系のエラーが少なくとも一度は出て、ワーってなることまちがいなし。
というわけで、そういう苦しみの少なそうなgoでのHTML解析を探してみたら[goquery](https://github.com/PuerkitoBio/goquery)が良さそうだったのでメモ。

まずはインストール。

```[bash]
$ go get github.com/PuerkitoBio/goquery
```

続いて、スクリプト。今回書いたのはローカルのファイルを読み込んで、特定のタグのリンク先をまとめて書き換えて標準出力するというもの。
GoDocは[こちら](https://godoc.org/github.com/PuerkitoBio/goquery)なので細かいところはそっちを参照。

```[go]
package main

import (
	"fmt"
	"log"
	"os"

	"github.com/PuerkitoBio/goquery"
)

func ReplaceLinks() {

	// ファイルからドキュメントを作成
	f, e := os.Open("./index.html")
	if e != nil {
		log.Fatal(e)
	}
	defer f.Close()

	doc, e := goquery.NewDocumentFromReader(f)
	if e != nil {
		log.Fatal(e)
	}

	// DOMを解析してhrefの値を変更
	doc.Find(".list td a").Each(func(i int, s *goquery.Selection) {
		s.SetAttr("href", fmt.Sprintf("%03d.html", i+1))
	})

	// 変更したDOMの値をHTMLとして標準出力
	result, e := doc.Html()
	if e != nil {
		log.Fatal(e)
	}
	fmt.Print(result)
}

func main() {
	ReplaceLinks()
}

```

標準のgoのパーサーよりもこっちのが普段使いには良さそうかな。ちなみにMechanizeっぽいライブラリとしては[surf](https://github.com/headzoo/surf)が良さそうなので、必要になったら今度使って見る。

これで、Nokogiriのビルド地獄から開放されるといいなー。
Goでnet/httpを使う時のこまごまとした注意

# httpクライアント編

## レスポンスを受け取ったら必ずBodyをCloseすること

```go
resp, err := http.DefaultClient.Do(req)
if err != nil {
  return err
}
defer resp.Body.Close()
```

HTTPレスポンスを受け取ったとき、``err != nil``のときresp.Bodyは常に非nilである（たとえBodyが0バイトであっても）。この``resp.Body`` を ``Close`` するのは呼び出し側の責務である。``Body.Close`` を怠ると、Keep-Alive(デフォルトで有効)のためにTCPコネクションが再利用されない。…ということが [ドキュメント](http://golang.org/pkg/net/http/)に口を酸っぱくして書いてある。

## 同一ホストへのコネクション数はデフォルトで最大2に制限されている
同一ホストへのコネクション数は``http.DefaultMaxIdleConnsPerHost``定数によりデフォルトで2に制限されている。

```go
// DefaultMaxIdleConnsPerHost is the default value of Transport's
// MaxIdleConnsPerHost.
const DefaultMaxIdleConnsPerHost = 2
```

ベンチマーク目的などで同一ホストへの最大コネクション数を変更する場合は、http.ClientのTransportの``MaxIdleConnsPerHost``メンバを0以外に設定する。(0のときはDefaultMaxIdleConnsPerHostになる)

以下のように設定する。

```go
// DefaultTransportの制限を変更する場合。
// DefaultTransportはhttp.DefaultClientのTransportとして使われる。
http.DefaultTransport.(*http.Transport).MaxIdleConnsPerHost = 32

// 自分で用意したhttp.Clientの制限を変更する場合。
c := http.Client{
  Transport: http.Transport{ MaxIdleConnsPerHost: 32 },
  }
res, err := c.Get("http://example.com")
```

## http.Clientはグローバル変数を使い回そう
（ @methane さんの指摘で追加しました。ありがとうございます）

> The Client's Transport typically has internal state (cached TCP connections), so Clients should be reused instead of created as needed. Clients are safe for concurrent use by multiple goroutines.

ドキュメントにある通り、http.Clientは内部のTransportメンバとしてTCPコネクションの管理機構(RoundTripper)を持っているので、出来る限り使い回すべきです。http.Clientは複数Goroutineからの並行利用に対して安全です。

http.Clientは、常にグローバルで確保されている`http.DefaultClient``を使えばいいと思います(``http.Get()``などの関数も内部的に``DefaultClient``を利用しています)。

@methane さんのコメントもご参照ください。(ゼロ値で初期化したhttp.Clientはhttp.DefaultTransportを参照するので問題ないはずですが、特に理由がなければ使わない方がいいでしょう)

# httpサーバ編

## WriteHeaderの前にContent-Typeを付与すること
Writeした時点でContent-Typeが空だと、httpサーバーは自動的にMIME-TYPE判定のためにレスポンスボディの先頭512bytesをバッファしたりする。それを避けるためにContent-Typeをつけておくこと。

```go
w.Header().Set("Content-Type","text/plain")
w.WriteHeader(http.StatusOK)
w.Write([]byte("Hello, world"))
```

## url.Query()を何度も呼ばないこと

サーバがリクエストのクエリ文字列を得る時に``url.Query()``は便利だが、これは構築済みのurl.Valuesを返している訳ではなく、コールごとに生URLからパース処理をしてから戻り値を返しているので、何度も呼ぶのは非効率。
代わりに、``r.ParseForm()``でURLのクエリパラメータとBodyのPUTまたはPOSTのformパラメータがパースされて``Request.ParseForm``に格納されるのでこれを使う。formパラメータとの区別が必要ないのであればこの値を使おう。(なぜformパラメータと混ざっているのだろう…)

### 追記
Formパラメータと分離しておきたい場合は普通に ``q := url.Query()`` と変数に代入して使おう。

## RequestのContent-Lengthは``r.ContentLength``から取ろう

r.Header().Get("Content-Length")は文字列なのでパースや異常値の扱い面倒。
``http.Request`` に ``ContentLength int64``が用意されており、こちらを使った方が簡単。
``Content-Length``ヘッダが存在しなかったり、不正な値だったりした場合は``r.ContentLength``に-1が代入され、ヘッダは削除される。
(Response構造体にも同様にContentLengthメンバが用意されているので、クライアントでも同様である)

## Content-Lengthヘッダを設定しないレスポンスは、長いと自動的にchunk転送になる
デフォルトで2048バイト(http.bufferBeforeChunkingSize)までのレスポンスであれば、自動的にContent-Lengthヘッダが設定される。
それを越えると、レスポンスは自動的にchunk転送に切り替わり、ヘッダには``Transfer-Encoding:chunk``がつく。
チャンク転送になると困る場合は、事前にContent-Lengthヘッダを設定しておこう。
羽田空港の駐車場の予約キャンセルをいち早く検知するスクリプト


羽田空港の駐車場予約がかなり激戦なので作りました。
ほんとどうでもいい内容なので、ソースだけのせて終了します。

```
require 'open-uri'
require 'nokogiri'

@reserve_days = [28, 29, 30]

def reserved_dai2ordai3?(doc, parking_num, day) 
    index = 0
    if parking_num == 2
        index = 1 #td index
    elsif parking_num == 3
        index = 3 #td index
    end
    doc.css("#guide_01 table tr")[2].css("td")[index].css(".calday").each do |dom| 
        if dom.text == "#{day}"
            return dom.attribute("class").value.include?("bgRed")
        end
    end
end

def reserved_dai4?(doc, day) 
    doc.css("#calendar01 table.calendar_waku td").each do |dom| 
        if dom.text == "#{day}"
            return dom.attribute("class").value.include?("full")
        end
    end
end

def can_reserve?(parking_num, days)
    if parking_num == 4 
        doc = make_doc('https://haneda-p4.jp/airport/entrance/0000.jsf')
        days.each do |day|
            if reserved_dai4?(doc, day)
                return false
            end
        end 
    else
        doc = make_doc('https://hnd-rsv.aeif.or.jp/airport/entrance/0000.jsf')
        days.each do |day|
            if reserved_dai2ordai3?(doc, parking_num, day)
                return false
            end
        end 
    end
    return true
end

def make_doc(url)
    charset = nil
    html = open(url) do |f|
      charset = f.charset
      f.read
    end
    
    doc = Nokogiri::HTML.parse(html, nil, charset)
end

# dai2
p can_reserve?(2, @reserve_days)

# dai3
p can_reserve?(3, @reserve_days)

# dai4
p can_reserve?(4, @reserve_days)
```
vrangeps

値が範囲に入っているかどうかを比較する時、絶対値で比較したい場合はたまにありますね。

rangeps は、符号を多少操作して min, max します。

即値4bitのうち2bitで、

- min
- max
- 絶対値比較の min
- 絶対値比較の max 

が選べて、残り2bitで、結果の符号を、

- src1 の符号
- min,max 結果の符号
- 符号クリア
- 符号セット

が選べます。

```cpp
#include <immintrin.h>
#include <stdio.h>

float out[16];

static inline __attribute__((always_inline)) void
test(float a, float b, const int imm)
{
    __m512 v1 = _mm512_set1_ps(a);
    __m512 v2 = _mm512_set1_ps(b);
    __m512 v3;
    
    __asm__ __volatile__ ("vrangeps %[imm], %[src2], %[src1], %[dest]\n\t"
                          :[dest]"=v"(v3)
                          :[src1]"v"(v1),
                           [src2]"v"(v2),
                           [imm]"i"(imm)
        );

    _mm512_storeu_ps(out, v3);

    printf("src1=%4.0f, src2=%4.0f, cmp=%d, signsel=%d : result=%5.1f\n", a, b, (imm)&3, (imm>>2)&3, out[0]);
}

#define CMP_MIN 0
#define CMP_MAX 1
#define CMP_ABS_MIN 2
#define CMP_ABS_MAX 3

#define SIGNSEL_PRESERVE_SRC1 (0<<2)
#define SIGNSEL_PRESERVE_RESULT (1<<2)
#define SIGNSEL_SETZERO (2<<2)
#define SIGNSEL_SET1 (3<<2)

int
main()
{
    test(-2, 1, CMP_ABS_MIN|SIGNSEL_PRESERVE_SRC1);
    test(2, -1, CMP_ABS_MIN|SIGNSEL_PRESERVE_SRC1);
    test(2, -1, CMP_ABS_MIN|SIGNSEL_PRESERVE_SRC1);

    test(2, -1, CMP_MIN|SIGNSEL_PRESERVE_RESULT);

    test(-2,-2, CMP_MAX|SIGNSEL_SETZERO);
    test(2,2, CMP_MIN|SIGNSEL_SET1);
}
```

```
$ ./sde -skx -- ./a.out 
src1=  -2, src2=   1, cmp=2, signsel=0 : result= -1.0
src1=   2, src2=  -1, cmp=2, signsel=0 : result=  1.0
src1=   2, src2=  -1, cmp=2, signsel=0 : result=  1.0
src1=   2, src2=  -1, cmp=0, signsel=1 : result= -1.0
src1=  -2, src2=  -2, cmp=1, signsel=2 : result=  2.0
src1=   2, src2=   2, cmp=0, signsel=3 : result= -2.0
```

完全に浮動小数演算の気がしますが、何故か AVX-512DQ 拡張です。KNLでは動きません。


明日は @tanakmura が vpexpandd について書きます。
AVAudioEngine でマルチバンドイコライザーを作る

![eqimg.png](https://qiita-image-store.s3.amazonaws.com/0/3603/9d844e79-e51a-71bf-58bd-cce88b6903fe.png)

# はじめに

iOS 8から AVFoundation に追加された AVAudioEngine を利用すると Objective-C で Audio Unit を操作することができます。Core Audio が何やら難しげでとっつきにくかった我々には朗報です。マルチバンドイコライザーなどの幾つかの Audio Units は AVAudioEngine で扱うことが可能です。ただし、AVAudioEngine だけでは Core Audio の全てを扱える訳ではないので今後の対応に期待しましょう。

# AVAudioUnitEQ

マルチバンドイコライザーを扱うためのクラスです。バンド数は任意に指定することが可能です。実態は `kAudioUnitSubType_NBandEQ` だと思われます。

## インスタンス化

```objc:ObjC
AVAudioUnitEQ *EQNode = [[AVAudioUnitEQ alloc] initWithNumberOfBands:10];
```
```swift:Swift
let EQNode = AVAudioUnitEQ(numberOfBands: 10)
```

引数を一つ取り、これには総バンド数を指定します。今回は iTunes でも使われる10-Bandとしました。


## AVAudioUnitEQFilterParameters

各バンドは `AVAudioUnitEQFilterParameters` で表現され、各のインスタンスに対してパラメータを後から設定します。これらは `bands` プロパティから得られる配列内に既にインスタンス化されているため、alloc-init は不要です。

```objc
// 初期化時に指定した数の AVAudioUnitEQFilterParameters オブジェクトが格納される（今回は10個）
NSArray *bands = EQNode.bands;
```
```objc
AVAudioUnitEQFilterParameters *parameters = bands[0];
```
```objc:ObjC
// NO で有効になる
parameters.bypass = NO;
// AVAudioUnitEQFilterType
parameters.filterType = AVAudioUnitEQFilterTypeParametric;
// 帯域幅(オクターブ)
parameters.bandwidth = 1.0f;
// 周波数(Hz)
parameters.frequency = 32.0f;
// 増減値(dB)
parameters.gain = 3.0f;
```
```swift:Swift
parameters.bypass = false
parameters.filterType = AVAudioUnitEQFilterType.Parametric
parameters.bandwidth = 1.0
parameters.frequency = 16000.0
parameters.gain = -1.2
```

全体の増減値は `AVAudioUnitEQ.globalGain` です。

```objc
EQNode.globalGain = -8.0f;
```

これらを iTunes のイコライザーに当てはめるとこのようになります。

![itunes.png](https://qiita-image-store.s3.amazonaws.com/0/3603/60bb40f5-6171-7812-c06b-601c8955a483.png)

# オーディオファイルの再生

こちらの記事で解説されています。
http://objective-audio.jp/2014/09/avaudioengine.html

# AU Lab.app

AU Lab.app では Audio Unit の検証をすることができます。AUNBandEQ で動作検証をすると良いでしょう。
以前の Developer Tools には標準で組み込まれていましたが、最近では追加ダウンロード扱いのようです。

https://developer.apple.com/downloads/index.action?name=Audio
Vagrantで作った環境の現在の状態をboxに書き出す

Vagrantで作った環境をゴニョゴニョやってて、現在の状態をboxに書き出したいときのコマンドをメモ。
毎回ググったりしてるんで・・・ね。

#vagrant package#
まずは起動中のvagrantを停止する => `vagrant halt`
パッケージファイルを作成する => `vagrant package`

これでpackage.boxというファイルが出来上がる。

#package.boxをvagrantにaddする#
`vagrant box add ボックス名 package.box`
これで完了。

あとは`vagrant init ボックス名` でOK。

##二回目からは##
とりあえず自分の場合 `vagrant box add ボックス名 package.box --force` で上書いてしまっている。(怪しいときは ボックス名2 とかにするケド・・・)
ただ .vagrant.d/boxes 配下にある各boxの下にはバージョン別に保存できそうな感じ。
おいおい調べてみます。
ChromeのWebVRビルド版がDirectモード(Direct HMD Access)に対応

ChromeのWebVR実装ビルド版がOculst RiftのDirectモードに対応しました。
12/18に公開されたビルドで私の環境でもDirectモードが動作しました。
(その前に12/14にもビルドがすでに公開されてましたが、私の環境ではうまく動作しませんでした。)
[Chrome WebVRビルド版公開ページ(Brandon Jonesさんの g+ページ)] (https://plus.google.com/101501294230020638079/posts/MfB8bBrz4gG)

##Directモード有効
Directモードを楽しむためには、Oculus Rift Runtimeの0.4.4が必要ですのであらかじめインストールしてください。
(0.4.4がインストールされてないとChromeを起動したときに警告メッセージが表示されます。)
Directモードを有効にするためには、起動オプションに --disable-gpu-sandbox をつけて起動します。

##特に設定なし
NVIDIAのコントロールパネルなどで特に設定を行うことなくできました。
私が所有するマシンは
>MSI GS70 2QE 
GPU 970M
OS Win8.1

です。
検索してみると右クリックで使用するGPUを選択できることを知り、
"高パフォーマンス NVIDIA プロセッサ"で試してみたら、数秒間Oculus Riftに表示された後WebGLがクラッシュしてしまいました。
逆に設定をいじらない(デフォルトですとたぶん"グローバル設定（自動選択：統合型)を使用する"が適用されていると思います)ほうが(現時点では)いいようです。

##Directモードの問題点
ノートマシンだとDirectモードができないという方が多くいらっしゃるようで、Extendモードの問題よりこちらの問題のほうが(影響が)大きいようです。
Optimusという機能が関係しているようですが、私はOptimusのことはほぼ無知ですのでその辺のところはよくわかってません。

##Extendモードの問題点
WebVRはデバイスに表示する際はデバイス(HMDVRDeviceオブジェクト)を指定して行うため、Extendモードでも難なくそのデバイスに映像を表示できるのでいいのですが、Direct/Extendの切り替えはグローバルでしかできないため、WebVRアプリを楽しむ際は切り替えなければならないという手間がありました。
また、Oculus Rift DK2のモニターは縦に認識されるという問題もあります。Extendモード使用するためには横になるように設定しなければなりません。
環境によってはこの設定ができずExtendモードが実質利用できない人もおられるようです。

##軽く試してみた
 * [mozvr](http://mozvr.com/)
   Directモードで動作しました。ただしFPSがかなり落ちます。
 * [WebVR test](http://media.tojicode.com/webvr-test/)
   オブジェクトが少ないためか、それほどFPSが落ちている印象はないのですが、ただ、なんかフレームがブレブレします。

環境によっては75fps出せるみたいですが、私の環境では40fps行きませんでした。Optimusが影響してるとFPSがガタ落ちするそうで、私のこの環境もこれが原因かもしれません。


##あとがき
Direct/Extendそれぞれに現時点では問題がありますが、WebVRが両方のモードで動作するようになったことで、WebVRが動作する環境が広がったことは間違いありません。しかし、Brandon Jonesさんがインタビューで、まだまだたくさん実装しなければならいとおっしゃっており(そのほかのVRデバイス対応？)、更なるWebVRの発展に期待してます。