OmniAICreator/Qiita-1.07M huggingface dataset:
Phoenix のコントローラーテストでセッションを扱いたい


なんか標準で対応してないんですよね。ログインならログインでそこ通してやればいいじゃんみたいな感じの開発者の1人の発言読んだ気がする。こっちはインテグレーションテストがしたいんじゃねーんだよユニットテストがしたいんだよ！と思いました。

これやるのすんごい苦労した。めちゃめちゃ苦労した。stackoverflow なんかにもあったけど、Phoenixの新しいバージョンじゃ通じないみたいでした。サッポロビームの方々、特に @darui_kara 氏にはたっぷりお世話になりました。ありがとうございました。

ではまず、セッションを使ったこんなアクションがあるとします：

```elixir:web/controllers/user_controller.ex
  def new(conn, _params) do
    tmp_user = get_session(conn, :tmp_user)
    changeset = User.changeset(%User{}, tmp_user)
    render(conn, "new.html", changeset: changeset)
  end
```

`&get_session/2`を使っているのでどうにかセッションに値を埋め込みたいですね。
テスト側は`mix phoenix.gen.html`なんかで生成した時はこんな感じだと思います：

```elixir:test/controllers/user_controller_test.ex
  test "renders form for new resources", %{conn: conn} do
    conn = get conn, user_path(conn, :new)
    assert html_response(conn, 200) =~ "New user"
  end
```

このままテスト実行すると tmp_user が nil になるのでテスト失敗しますね。テスト側で`&put_session/3`使いたいですね。この前のアクション実行してからとか、外部の通信とかあったらダルいですね。
そこで、`test/support/controller_helper.ex`というファイルを作ります。あ、YourAppのところは適宜書き換えて下さい。

```elixir:test/support/controller_helper.ex
defmodule YourApp.ControllerHelper do
  defmacro __using__(args) do
    controller = Keyword.get(args, :controller)

    quote bind_quoted: [controller: controller] do
      use Plug.Test

      @controller controller

      def action(conn, action, params \\ %{}) do
        conn = conn
          |> put_private(:phoenix_controller, @controller)
          |> Phoenix.Controller.put_view(Phoenix.Controller.__view__(@controller))

        apply(@controller, action, [conn, params])
      end

      @session Plug.Session.init(
        store: :cookie,
        key: "_app",
        encryption_salt: "yadayada",
        signing_salt: "yadayada"
      )

      defp with_session_and_flash(conn) do
        conn
        |> Map.put(:secret_key_base, String.duplicate("abcdefgh", 8))
        |> Plug.Session.call(@session)
        |> Plug.Conn.fetch_session()
        |> Phoenix.ConnTest.fetch_flash()
      end
    end
  end
end

```

雑に解説しますと、conn の初期化処理を自分でしてます。まず、標準で用意されている conn はセッションの準備をしていません。そこで`&with_session_and_flash/1`というセッション部分の初期化だけを付け足した関数を用意しました。また、標準で用意されている`get`,`post`,`put`,`delete`などのコントローラーへのアクセス関数を通すと conn が再初期化されてしまうので初期化しないでアクセスする関数`&action/3`を定義しています。

そして、テストファイルで`use`を入れてちょちょいと書き足します：

```elixir:test/controllers/user_controller_test.ex
defmodule YourApp.UserControllerTest do
  use YourApp.ConnCase

  # この行追加
  use YourApp.ControllerHelper, controller: YourApp.UserController

...

  # 中身書き換え
  test "renders form for new resources", %{conn: conn} do
    conn = conn
      |> with_session_and_flash
      |> put_session(:tmp_user, @valid_attrs)
      |> action :new, %{}
    assert html_response(conn, 200) =~ "New user"
  end
```

はい。`put_session`,`get_session`,`put_flash`,`get_flash`する前に、`with_session_and_flash`を入れるのとアクションへのアクセスを独自関数`&action/3`でやるのがミソです。標準で用意されている`get`,`post`,`put`,`delete`などを使うと conn が作り変えられてセッションが空マップ(%{})になります。ここは涙を飲んで換えて下さい。なあに、アクションもただの関数だからあんま変わりませんって。一応念の為にセッションが必要ないテストでは標準関数を使うことをおすすめします。

できた？　できたね？　良かったですね。
gRPCにおけるRPC方式の整理

gRPCは通信方法にHTTP/2を使用することにより、一般的なRPCにおける1Request-1Responseな方式の他、1つのTCPコネクションの中で複数のRequest/Responseをやり取りすることが可能となっている。
このTIPSでは、gRPCで使用できるRPCの方式と、protoファイルへの定義方法について記載する。protocolbuffers自体の定義方法は、ここでは省略する。

##1.Simple-RPC
Simple-RPC方式は、一般的なRPCと同様の1Request-1Responseな方式。
HTTP/2の恩恵はあまり受けられないが、最もシンプルで制御し易い方法と言える。

![simple.png](https://qiita-image-store.s3.amazonaws.com/0/93136/67b4e54d-34b1-443a-fa58-f786c50e326d.png "simple.png")

**定義方法**

```:Sample.proto
syntax = "proto3"
service MyService {
  rpc simpleRPC(MyRequest) returns (MyResponse){}
}
```

##2.ServerSideStreaming-RPC
クライアントから1つのリクエストを投げた後、サーバーから１〜任意数のレスポンスを受け取ることができる方式。レスポンスの内容を「まとめて」ではなくても良いから少しでも早く欲しい場合に有用。
![serversidestream.png](https://qiita-image-store.s3.amazonaws.com/0/93136/1d33fda4-18ac-fd9a-2815-f5fb22e8497c.png "serversidestream.png")

**定義方法**

```:Sample.proto
syntax = "proto3"
service MyService {
  rpc serverSideStreamingRPC(MyRequest) returns (stream MyResponse) {}
}
```
メッセージの前にstreamが付いていることに注意。

##3.ClientSideStreaming-RPC
クライアントから１〜任意数のリクエストを投げた後、サーバーから１つのレスポンスを受け取る方式。クライアントからのリクエストが送付され終わるのを待たず、少しでも早くサーバー側でのリクエスト処理を開始したい場合に有用。
![clientsidestream.png](https://qiita-image-store.s3.amazonaws.com/0/93136/cbb7a5f8-1567-4312-4cd1-e8a08f3e8840.png "clientsidestream.png")

**定義方法**

```:Sample.proto
syntax = "proto3"
service MyService {
  rpc clientSideStreamingRPC(stream MyRequest) returns (MyResponse) {}
}
```

##4.BidirectionalStreaming-RPC
1つのTPCコネクションの中で、RequestとResponseの送受信を任意数繰り返す方式。HTTP/2の恩恵を最も受けることができる反面、実装は複雑になる。
![bidirectionalstream.png](https://qiita-image-store.s3.amazonaws.com/0/93136/d44b7fd7-9ce8-3c6c-0714-a656ed9a8c86.png "bidirectionalstream.png")

**定義方法**

```:Sample.proto
syntax = "proto3"
service MyService {
  rpc bidirectionalStreamingRPC (stream MyRequest) returns (stream MyResponse) {}
}
```

今回は以上です。お疲れ様でした。
Vagrantのsynced_folderでnpm installするとError: UNKNOWN, symlink


```
$ npm install yuicompressor
npm ERR! Error: UNKNOWN, symlink '../yuicompressor/nodejs/cli.js'
npm ERR! If you need help, you may report this *entire* log,
npm ERR! including the npm and node versions, at:
npm ERR!     <http://github.com/npm/npm/issues>

npm ERR! System Linux 2.6.32-573.el6.x86_64
npm ERR! command "/home/vagrant/.anyenv/envs/ndenv/versions/0.10.33/bin/node" "/home/vagrant/.anyenv/envs/ndenv/versions/0.10.33/bin/npm" "install" "yuicompressor"
npm ERR! cwd /var/www/vhosts/xxxx/current/clients
npm ERR! node -v v0.10.33
npm ERR! npm -v 1.4.28
npm ERR! path ../yuicompressor/nodejs/cli.js
npm ERR! code UNKNOWN
npm ERR! errno -1
npm ERR! not ok code 0
```

* /vagrant のようなsynced_folder でnpm installすると起きるようです。
* パッケージはyuicompressor以外のものでも再現します。

発生した環境

* npm 1.4.28
* Vagrant 1.7.4
* VirtualBox 5.0.4


ここで同様の報告事例があります。

https://github.com/npm/npm/issues/2380

# 回避方法
`--no-bin-links`をつける

```
npm install --no-bin-links
```
mix-inについて


Web上に良いまとめがない為、書き残す。なお、内容が正しいかどうかの保証は無い。


> 　Mix-inというのは元々Lisp界で始まった多重継承の使い方です。Mix-in手法には次の2つの条件があります。
> 
> ●通常の継承は単一継承に限る
> ●2つめ以降の継承は，Mix-inと呼ばれる抽象クラスからに限定する
>
> 　Mix-inクラスは以下のような特徴を備えた抽象クラスです。
> 
> ●単独でインスタンスを作らない
> ●通常のクラスから継承しない

引用元 : [まつもと直伝　プログラミングのオキテ 第3回（3） ](http://itpro.nikkeibp.co.jp/article/COLUMN/20050915/221232/)

実体を持たない(⇔メンバ変数を持たない)為、親クラスの同一のメンバ変数の実体が複数存在してしまうという、菱型継承の問題の一つが発生しない（そもそもクラスごとに必要な実装をmix-inすることで菱型にしなくて済む）。もちろん例えばC++では仮想継承を使うことでも同様の問題は解決できるが元々菱型継承の可能性を考えて継承しておく必要があり面倒である。

なお、実体がないだけで、メンバ変数へアクセスがないとは限らない。Rubyでは以下の様なこともできる。

>```rb
>module Fuga
>  def foo
>    p @bar
>  end
>end
>
>class Hoge
>  include Fuga
>  def initialize
>    @bar = "baz"
>  end
>end
>
>obj = Hoge.new
>obj.foo        # => "baz"
>```

引用元：[RubyのModuleについて - mirichiの日記](http://d.hatena.ne.jp/mirichi/20100314/p1)


ただし、C++等では直接同じことを行うのは不可能（仮想関数を用いないと多態性が実現できない）であるし、出来る言語であってもpublic変数を避けるような言語では同様に控えた方が良いだろう。

mix-inは実装の多重継承ができる言語では実現出来る。実装の多重継承が存在しない場合でも例えば、Java8ではインターフェースのデフォルト実装で、C#ではインタフェース+拡張メソッドでmix-inが実現できる。

参考： [Java8のインタフェース実装から多重継承とMix-inを考える | ギークを目指して](http://equj65.net/tech/java8mixin/), [C# 3.0 で拡張メソッドによる Mix-in 的ななにか - いげ太のブログ](http://igeta.cocolog-nifty.com/blog/2008/05/mixin_cs_3.html)

またデザインパターンのテンプレートメソッドとかなり形が酷似している。
演奏時間とその合計を出力する

# 実行例
まず、結論からいってこのような出力を得られる

```shell-session
lMusic 交響曲 | perl -lne 'system "exif $_ "' | nkf -w | ~/Python_instance/exif2name_time.py
1:33:13
---------
  0:07:39 交響曲第25番ト短調.wav
  0:07:40 交響曲第40番ト短調.wav
  0:06:36 交響曲第40番ハ短調.wav
  0:13:00 Dvorak交響曲第9番_新世界より_第4楽章.wav
  0:19:25 チャイコフスキー_交響曲第6番_ロ短調_悲愴_第1楽章.wav
  0:35:53 メニューイン指揮ドヴォルザーク交響曲第8番.wav
  0:03:00 メンデルスゾーン_交響曲3番_スコットランド_序曲_フィンガルの洞窟.wav
```
# 解説
概要としては lMusic でHDD内のwavファイルを絞り込みそれをプレイリストとして見立て
る。それにsoxなどのplayを繋げば該当するwavが全て聞けるわけだが、終わるまでにどの
程度の時間が掛かるのか気になるところだ。
ファイルから再生時間を得るにはexiftoolがお手軽だ。cygwinでは/usr/bin/exif として
インストールしたか、或いはプリインストールされていた。Linuxならaptなどでインストー
ルすることになる。
exifは1つのファイルに対して[[File Name:filename], .., [Duration:0:03:00]]のよう
な連想配列を思わせる出力をする。ここでは0:03:00のような時間を合計するのに適した
pythonを使って処理する。時間を取り扱うdatetimeが最初から入っているから手軽という
意味で適しているだろう。
## lMusic
これは前回紹介した関数で、引数を1つ与えるとwavファイル名からgrepしてフルパスを出力する。

```zsh:.zshrc
lMusic () {
        if [[ $# -eq 0 ]]
        then
                cd f:/Music_Movie > /dev/null
                ls -v -F --color=auto **/*wav
                cd $OLDPWD > /dev/null
                return
        fi
        ls -v -F --color=auto f:/Music_Movie/**/*wav | grep --color -P "$1"
}
```
## perl
ワンライナーでexifにフルパスを繋ぐ。"exif $_"と処理の形が露出するので分かりやすい。
## exif
-h から抜粋すると「exiftool - Read and write meta information in files」である。
今回は再生時間を抜き出すには大げさな道具である。pythonコードはこれの出力処理といっ
ても過言ではない。nkfを使っているのは何故かexiftoolの標準出力がshift-jisで漢字が
文字化けするからその対策。cygwinのみ化ける。Linuxの方では化けなかった。つまり、
utf-8からshift-jisの間で壊れるファイル名の場合にはエラーが出るだろう。
なおオプションで演奏時間とファイル名だけ抜き出すと今回2倍以上の高速化ができる。
## python script
```python3:exif2name_time.py
#!/usr/bin/env python3
import sys
import datetime


exif_out = sys.stdin
name = []
play_time = []
total_time = datetime.timedelta(0, 0, 0)


def total_timer(time_form):
    """time_form sample is (0:02:18, 0:01:23) """
    td = datetime.timedelta(0)
    time_hms = [[int(time) for time in times.split(':')]
        for times in time_form]
    duration = sum([datetime.timedelta(hours=h, minutes=m, seconds=s)
        for h, m, s in time_hms], td)
    return duration

for line in exif_out:
    key_and_value = [ l.strip() for l in line.partition(':')]
    if key_and_value[0] == "File Name":
        name.append(key_and_value[2])
    if key_and_value[0] == "Duration":
        play_time.append(key_and_value[2])

duration = total_timer(play_time)
print("{0}".format(duration))
print("-" * 9)

for (name, play_time) in zip(name, play_time):
    print("{0:>9} {1:<}".format(play_time, name))
```
標準入力を受け取るためにsysを、時間を処理するためにdatetimeをインポートする。
次の段落ではグローバル変数の宣言と初期化をする。
さらに次の段落ではtotal_timer関数を定義し、これの引数はhh:mm:ss型の文字列を1つの
要素として持つリストである。返り値は合計時間で数字型だ。datetime.timedeltaの中は
数字型なのでintを使う。
for段落は標準入力を処理する。文字列メソッドpartitionは引数にマッチする最初の1つ
で分解するので、Durationの右側の0:02:18のような時間表示がそのまま受け取れる。
最後の2つの段落は出力部分である。前者は総合時間を書き出し、後者はプレイ時間とファ
イル名を書き出す。左端から9つの固定長レコードを時間のために割き、左寄せと右寄せ
と上下関係で総合時間とそれぞれの時間を差別化しながら"---------"で時間表示区分と
いうまとまりを作った。

# 環境
```shell-session
python --version ; uname
Python 3.4.3
CYGWIN_NT-6.0
```
Raspberry Pi用2.8インチタッチディスプレイ。セットアップ備忘録

##概要
本稿は、Raspberry Pi B+に、「Adafruit PiTFT - 2.8" Touchscreen Display for Raspberry Pi」をセットアップした備忘録です。
たぶん、Raspberry Piの機種と Raspbianのバージョンには、依存しないと思います。
日本語で検索をすると2013年くらいのブログ記事がヒットするのですが、その記事の方法は、OSの特定のバージョンに依存していて、試してもでは上手く行きませんでした。（ブログ記事にもその旨の記載がある）
その後、複数の機種とOSバージョンに対応する方法が用意されたんでしょう。（機種も増えましたしね）
英語が苦にならない方は、[本家サイト](https://learn.adafruit.com/adafruit-pitft-28-inch-resistive-touchscreen-display-raspberry-pi/overview)を見てセットアップすると良いと思います。（また更新されるかも知れませんしね）

##組み立て
ピンに差し込んで、重ねるだけなんで難しいことは無かったです。
ただ、B+だと拡張されたピンが余ってしまうので、ちょっと不格好かも知れませんね。
タクトスイッチは、そのうちハンダ付けして使ってみようと思います。

##セットアップ手順
###ドライバーのセットアップ
組み立て終わって電源を入れても画面は表示されません。
カーネルアドオンを下記のスクリプトを実行して追加する必要があります。
[簡易インストール(本家サイト)](https://learn.adafruit.com/adafruit-pitft-28-inch-resistive-touchscreen-display-raspberry-pi/easy-install)
数ページに渡って詳細なセットアップ手順が書かれていますが、下記のスクリプトの詳細な説明なので、取り敢えず動かせればいい人は、読まなくてもタッチディスプレイまで動作します。
（キャリブレーションの調整方法について知りたい人は見た方がいいです）

```
$ curl -SLs https://apt.adafruit.com/add-pin | sudo bash
$ sudo apt-get install raspberrypi-bootloader
$ sudo apt-get install adafruit-pitft-helper
```
###再起動
かなりの分量のインストールが行われますので、時間がかかります。
何回か質問が訊かれるのですが、取り敢えずyesでセットアップしました。
再起動すると画面表示されますよ。

```
sudo reboot
```
![IMG_20150917_224554.jpg](https://qiita-image-store.s3.amazonaws.com/0/7839/d8afc987-e1e4-7795-5a80-33936cc30046.jpeg)
MacにVirturalBoxを入れてDebianを構築した時のネットワーク設定メモ


## VMの設定: Network

### NAT
<img src="https://qiita-image-store.s3.amazonaws.com/0/18766/f0c2fec8-2a61-99e8-5808-330991f56676.png" alt="" title="Octcat" width="50%" />

### Host-only Adapter
* vboxnet0がない場合、VertualBoxのFinderのメニューの設定のネットワークで追加しておく

<img src="https://qiita-image-store.s3.amazonaws.com/0/18766/ea2cd9db-b734-b572-9111-93dc58a605b1.png" alt="" title="Octcat" width="50%" />

### Networkの設定
Debianのコンソールにログインしてネットワークの設定をする

```bash:host
jfk@debian:~$ sudo vi /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet dhcp

allow-hotplug eth1
auto eth1
iface eth1 inet static
  address 192.168.56.101

jfk@debian:~$ sudo /etc/init.d/networking restart
```

*NatのGatewayを乗っ取るので、eth1にはgatewayを追加しない*

routeコマンドで設定を確認する

```bash:host
jfk@debian:~$ sudo route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.0.2.2        0.0.0.0         UG    0      0        0 eth0
10.0.2.0        *               255.255.255.0   U     0      0        0 eth0
link-local      *               255.255.0.0     U     1000   0        0 eth1
192.168.56.0    *               255.255.255.0   U     0      0        0 eth1
```
Nat+Host-only networkの設定の完了

ローカルマシーンから```ssh```で接続ができるようになり、サーバーからNat経由で外部へ接続できるようになる

```bash:local
$ ssh 192.168.56.101 -l jfk
```

さて、何やろう。
ubuntu14.04でmagitを使うために

初投稿がてら，いろんなところに分散した情報をまとめるような形で書きたいと思います．

`ubuntu14.04`で`magit`を入れる際に`apt-get install`で持ってきた`emacs`や`git`ではバージョンが古いため怒られるので，最新版を導入することになった際の話です．

# Emacs24.5を入れる
参考：http://nkenbou.hatenablog.com/entry/2015/06/30/051408
上記を参考というかほぼそのままで動きましたが一点だけ注意が必要．

`build-dep`で`emacs24`に必要なライブラリを入れる．ここで`build-dep emacs`とすると，`emacs24`に必要なライブラリが入ってこないので注意．

```sh
$ sudo apt-get build-dep emacs24
```

残りは参考と同じように

```sh
$ wget -O- http://ftp.gnu.org/gnu/emacs/emacs-24.5.tar.xz | tar xJf -
$ cd emacs-24.5
$ ./configure
$ make
$ sudo make install
```
```sh
$ emacs --version
```

ちなみに，`build-dep emacs`だと`./configure`の際に下記のようになる．

```sh
$ ./configure
.
.
.
checking for libXaw... configure: error: No X toolkit could be found.
If you are sure you want Emacs compiled without an X toolkit, pass
    --with-x-toolkit=no
to configure. Otherwise, install the development libraries for the toolkit
that you want to use (e.g. Gtk+) and re-run configure.
```

# Gitも最新版を入れる
参考：http://qiita.com/isaoshimizu/items/e0891fead893f6d87b0e
こちらは上記の参考ほぼそのままで問題ない

```sh
$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:git-core/ppa
$ sudo apt-get update
$ sudo apt-get upgrade
```
```sh
$ git --version
```

# magitを入れる
後は普通にmagitを入れるだけ

```el
M-x package-list-package
```

一覧からmagitを選択して，以下を設定に書く．

```el:init.el
(add-to-list 'load-path "~/.emacs.d/magitの入ったディレクトリ")
(require 'magit)
```
Mackerel Meetup #5

[Mackerel Meetup #5](http://mackerelio.connpass.com/event/19647/)に参加してきた。
毎週機能リリースしているのは驚いた。

GMOペパボの方が「hubotでmackerelのhost情報を取得出来るようにして置くと便利」のようなことを話していたが、そんな感じのhubot scriptを先日作っていた。
https://www.npmjs.com/package/hubot-mackerel-io

使い方は
一覧表示

```
hubot mackerel hosts
```

詳細表示

```
hubot mackerel hosts <ホスト名>
```

未だmackerelをそれほど触ってないので、本格的に使い始めたらhubot scriptも機能追加していく予定。
長期的なコンバージョンを高めるためにアドネットワークやDSPを使う際の処方箋

# TL;DR

- プロダクトのユーザー認知を大きく拡大したいフェーズにおいて、複数の媒体に対し簡易に広告出稿が可能なアドネットワークやDSPは有効な手段であるが、高い運用力が求められる。
- 広告代理店に運用を任せてはいけない。どんなマーケターであれ、まずは自分で使ってみよう。予算を張って、ターゲットの属性を選択し、広告を出稿してみる。
- 結果を元にPDCAを回そう。効果の良い媒体を選定し、絞り込み、誰にでもコンバージョン効率を上げることができる。
- 最終的に効果の最も良いメディアには直接コンタクトを取り、ネイティブアドの出稿を検討しよう。ネットワークよりも、相性の良い媒体へ直接予算を張るほうが効果的なコンバージョンを産める場合が多い。ネットワークはCV媒体発見機である。

# アドネットワーク？DSP？

広告主側からするとオンライン広告を多数のメディアへ薄く広く配信し、かつ入札方法や出稿する相手をそれぞれのプラットフォームが独自のアルゴリズムで抽出しより効率的なコンバージョンを産むように拡張したもの、程度に捉えておければ十分です。以下に一応参照を掲載します。

**アドネットワーク**
>アドネットワーク事業者は広告主から広告を一手に受注し、参画しているメディアへ広告を配信する。 広告主は、アドネットワークに参画している様々なメディアから親和性の高いメディアへ配信することにより、効率良く顧客の獲得もしくは潜在層へのプロモーションが可能となり、媒体の側は多様な広告主から親和性の高い広告を掲載することにより広告単価を上げることや、多種の広告を掲載することで効率良く収益を上げる事が可能になる。
[参照：wikipedia:アドネットワーク](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%89%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF)



**DSP:Demand side plattform**
>デマンドサイド(広告主側＝需要側)が使用する広告配信ツールとその周辺のことになります。よく勘違いされていますが、DSPとは広告媒体ではなくツールです。DSP広告とは、DSPを用いて広告を配信する行為そのものや、DSPで購買・配信が可能な広告枠などを指して使われる事があります。
[参照：MarkeHack](http://markehack.jp/and-dsp-ad/)

本記事では、両方をまとめてネットワークと呼ぶ。

# なぜ自社運用を勧めるのか

アドネットワークやDSPの運用は絶対に代理店へ任せてはいけない。
なぜ自社運用を勧めるのか、その理由は**事業へ対するコミットの差**がコンバージョンに大きな差をもたらすからである。僕の運用するアカウントと代理店のものを比較すると、最終的にCPAが1/2ほど良いケースが多い。

ex. 自社運用するGDNのある日のCPA

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/b122f3ff-701f-21bf-8b7b-3c35568a2aad.png)

# ネットワークは良い媒体を発見するためのツールである

広告によってプロモーションしたいプロダクトと、広告を掲載する媒体にはもちろんだが相性がある。例えば『smarby』というサービスは子供服に関心の高いママをターゲットとしており、ママがよく見る媒体との相性が良いと仮説が立てられる。
この仮説を検証する際にネットワークは非常に有用なツールとなる。多くのネットワークが有する『コンバージョンオプティマイザー：よりコンバージョンが起きる媒体に出稿回数を自動的に増やす機能（ざっくり）』を用いある程度の期間ネットワークを使用すると、特に結果の良い媒体がわかる。

GDNのプレースメント機能
![image](https://qiita-image-store.s3.amazonaws.com/0/83135/10103448-2fe1-caa9-ddd6-09ef2ed0f40a.png)


smarbyでは『ameblo』や『goo』などの媒体と相性が良いことがわかる。この結果を利用し、相性の良い媒体の、より**良い広告枠（大体の場合サービス運用者が保有している）を買い付けにアプローチする戦略**が非常に有効だ。

その意味で、ネットワークは大きく予算を張り続けるもののではなく、有効な媒体を発見するためのテストだと捉えると良い。

# コメント

- QiitaにはMarketing Techに関する記事が非常に少なく、ユーザーも少ないと感じるのでこの領域をエンジニアの方々にも理解でき、かつ実践的な内容で普及させていきたい。
Google Chromeでjsにブレイクポイントを貼ると変数の中身が更に確認しやすい

## はじめに

* 以前[こんな記事](http://qiita.com/yamamoto_hiroya/items/38cd82f2e7939052241a)を書きましたが更に補足です。

## サンプルコード

```html:index.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
    </head>

    <body>
        <button id='sample'>SAMPLE</button>

        <script type="text/javascript" src="sample.js"></script>
    </body>
</html>
```

```js:sample.js
$(function(){
    $('#sample').on('click', function(){
      var hoge = 'hoge';
      var test = 'テストだよー';
      var get_text = $('#sample').text();
      var long_text = 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん';
      var object = {'a': 'b', 'c': 'd', 'e': 'f', 'g': 'h', 'i': 'j', 'k': 'l', 'm': 'n', 'o': 'p', 'q': 'r', 's': 't', 'u': 'v', 'w': 'x', 'y': 'z'}
      console.log(hoge);
      console.log(test);
      console.log(get_text);
      console.log(long_text);
      console.log(object);
      alert('ここにブレイクポイントを貼って値を確認してみてください');
    });
});
```

## やり方

* `Google Chrome`のデベロッパーモードを起動
* `Sources`タブに移動
* `sample.js`を選択
* `alert`文のところにブレイクポイントを設置（行数の書いてある場所をクリック）
* その状態で`sample`ボタンをクリック
* ブレイク中に`object`の変数の上にマウスカーソルを合わせる

![スクリーンショット 2015-09-17 21.50.58.png](https://qiita-image-store.s3.amazonaws.com/0/67471/747e787f-24bd-f59f-fc96-9f69d13c7c46.png)

もうコンソールログいらないんじゃないかな^^;
今日知ってとても感動したので拡散の意味で記事にしました。
ブレイクポイント貼るだけでさっと中身が確認できて便利ですね:smile:
nginxでリダイレクト時にパラメータを上書きする


## nginxでリダイレクト

nginxでリダイレクトするとき、パラメータはそのまま引き継がれてしまいます。
例えば、```redirect=true```というパラメータがあったら、ルートにリダイレクトさせたいときは以下のような設定になると思います。

```:default.conf
if ($args ~ "redirect=true"){
	rewrite ^ / permanent;
}
```

その場合のリクエスト、リダイレクト後のurlは以下の様になります。

```:リクエストurl
http://xxx.com/111/?redirect=true
```

```:リダイレクト後url
http://xxx.com/?redirect=true
```

## リダイレクト後のパラメータを設定する
リダイレクト後のパラメータを変更するには、リダイレクト前に```$args```に値を設定すれば良いです。

```:default.conf
if ($args ~ "redirect=true"){
	$args = ""
	rewrite ^ / permanent;
}
```

```:リクエストurl
http://xxx.com/111/?redirect=true
```

```:リダイレクト後url
http://xxx.com/
```
YamlDotNetを使って詰まったところなどメモ

#YamlDotNetとは
YamlをC#クラスに流し込むときに便利なライブラリ


VS2015のNuGetで YamlDotNet , YamlDotNet.Dynamic , YamlDotNet.Signedの3つをインストールすれば使えるようになります。
(2015/09/17現在)
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/76f0ffd0-22e7-c2ac-7bef-acb04c463bf0.png)



#参考
YamlDotNet <br> http://aaubry.net/pages/yamldotnet.html

C#でYAMLを使えるか試してみたAdd Star <br> http://opcdiary.net/?p=25878

YamlDotNet - Deserializing an object graph by Antoine Aubry <br> https://dotnetfiddle.net/HD2JXM

#YamlDotNetを使っていて気づいたこと・詰まったところなどのメモ
・YAMLにあるキーの左隣の空白が半角スペース12個、インデントは半角スペース4個になっていないとデシリアライズに失敗する

・C#クラスのメンバ変数の型と対応するYAMLの値の型が異なるとデシリアライズに失敗する

・YAMLにあるキーの名前と同じ名前のpublic変数が無いとデシリアライズに失敗する.
>ただし、YamlAlias属性を変数につけると名前が異なるYAMLキーとC#変数を結びつけることができる。

>>以下の二つは同じものであると解釈されるみたいです。 

>>```
[YamlAlias("in")]
public int inParam;
```
>>```
public int in;
```
>>inなどのC#予約語を使いたいときなんかは便利ですね。 

・yamlの末尾に```...```をつける必要はない(つけていたほうが安全かも)

・値```yes```,```no```はstringと解釈される。 (C#クラス側の変数の型をboolにするとデシリアライズ失敗)

・デシリアライズしたいクラスの中に別のクラス・メソッドなどを定義してもOK

・YAMLのキーの並び順とC#クラスの変数の並び順番は異なっていてもOK
VPS + DockerでEC-CUBE 2.13系のテスト環境をサクッと構築

ローカル環境ではなく、VPSに開発環境を立ててみんなで検証したいこともある。というより開発機が低スペックのWindowsだとVagrantも動かしたくない。
なので、安いVPSにDockerを導入し、検証してみようと考えた次第。

#VPSを用意
海外VPSのVULTRにて構築。
初期イメージにCoreOSも存在するので、コンテナ環境を準備するのも楽。
ただ今回は「そいや既にデプロイしてるUbuntuテスト環境あったっけ」「ログインの為の秘密鍵用意すんのめんどかった」との理由でUbuntuから構築することに。

[海外VPSのVULTRでCoreOSを動かしてみた](http://qiita.com/koh-taka@github/items/36ffbbfd7d1145a80972)

##※未承諾広告※
VULTRは東京リージョンも利用できる格安VPSだ。
Web管理画面は英語のみだが、クレカかPaypalさえあれば公称通り5分以内でデプロイ可能。
最小プラン(1CPU MEM768MB SSD15GB)なら月額$5。時間あたり$0.007。
お友達を紹介するだけでクレジットが$10増える例のアレも完備！

[VULTR(例のアレ)](http://www.vultr.com/?ref=6806696)

#UbuntuにDockerを導入

apt-getでDockerを入れると1.2系が入るので、公式から出ているリポジトリを追加してインストールするまでの流れ。最後のはバージョンチェック。

``` lang:bash
# wget -qO- https://get.docker.com/ | sh
# usermod -aG docker root
# wget -qO- https://get.docker.com/gpg | sudo apt-key add -
# docker -v
```

#EC-CUBE2コンテナを使わせて頂く
https://hub.docker.com/r/matsubo/eccube/
EC-CUBE2.1x系のファイルを大体網羅しており、更にはphpフロントエンド付のpostgreSQL/MySQL、apache2、php5-fpmが既にインストールされている便利な代物。

``` lang:bash
# mkdir /var/docker/eccube-docker
# docker pull matsubo/eccube
# docker run -it -p 80:80 -v /var/docker/eccube-docker/ -d matsubo/eccube:latest
```

で、立ち上がったらブラウザから該当の http://（任意のドメイン）/ にアクセス。

上記コマンド例は2.13系を使用した時の話。一応、永続化をしている。

>eccube_install.shが存在しないことに注意。ブラウザから手作業でがんばろう。

#データベースの作成
データベースeccube_db、権限ユーザeccube_db_userを、postgreSQL/MySQLのいずれかで作成。ブラウザのトップページ下方にphppgadminとphpmyadminへのリンクと、root権限のIDとパスワードが書かれている。
ただまあ、コンテナへログインして直接sql叩いてしまった方が早いかも……。

#ブラウザからインストール
http://（任意のドメイン）/eccube-2.13.3/html/install/ を開き、必要事項を入力していくだけ。

「管理機能の設定 -> ディレクトリ」 には、「eccube-2.13.3/html/」内のディレクトリにて使われていない名前を用意すること（ワイ、adminと入力して爆死。なんでこんな名前で規定以外のディレクトリがあるんだ……）。

無事にインストールが完了したら、後は魔改造して遊ぼう！
Have Fun!

##おまけ：一応セキュリティの話
開発環境だから当然ザルなので、iptablesやufwなどで制限掛けておくこと。
EC-CUBEインストール時、管理画面へのIPアクセス制限を掛けておくのも良い。
だったらVPSへのssh接続を公開鍵でやれって話ではある。すんません。

##おまけ：SQL入力欄で送信してもエラーメッセージに赤い「1」のみしか出ない現象に直面
「ブラウザからインストール」にて発生。
データベースの側に問題はなく、MySQL,pgSQL共に同様のエラーメッセージが表示。
とりまeccube-2.13.3/をディレクトリごと削除し、同じディレクトリにあったeccube-2.13.3.tar.gzを解凍して再インストールで解決。

##おまけ：早速インストールしたテンプレート
https://github.com/clicktx/eccube-on-bootstrap3
bootstrapなのでカラーテーマ変更も容易で、レスポンシブ。神。
Atomの初期カスタマイズについて（日本語化、見映えの変更など）

自分がAtomを入れてまずやったカスタマイズを共有

カスタマイズするときは、Atom > Preferencesから設定画面を開いて、
左メニューにあるInstallをクリックし、パッケージインストール画面を開きます

この画面から各種パッケージをインストールしていきます

![atom01.png](https://qiita-image-store.s3.amazonaws.com/0/86172/83171a9e-4e42-7c9d-5b6e-bf1d42e1a46e.png)


##1 日本語化

・パッケージ名：japanese-menu
Atomのメニューを日本語化するパッケージをインストール
これをインストールすることで、Atomのメニューを日本語化してくれます

詳細は下記のリンク
http://blog.nocorica.jp/2015/03/atom-package-install/

・パッケージ名：Japanese Wrap
Atomには日本語を入力したときに、うまく端で折り返してくれない問題があるようで
この問題を解決してくれるパッケージもインストール

詳細は下記のリンク
https://atom.io/packages/japanese-wrap

##2 表示の拡張


・パッケージ名：minimap
Sublime Textのようにコードの概観を表示するミニマップを追加

https://atom.io/packages/minimap

・パッケージ名：file-icons
ファイルの種類に応じて、ファイルアイコンを表示してくれる

https://atom.io/packages/file-icons

##3 入力の補助

Atom>Settings>Show Invisiblesにチェックをつける
半角スペースやタブを表示させる

・パッケージ名：highlight-line
行のハイライトをしてくれる

https://atom.io/packages/highlight-line

・パッケージ名：show-ideographic-space
全角スペースの可視化

https://atom.io/packages/show-ideographic-space

##4 テーマの変更

フォントの変更
「SourceHanCode JP」というエディタや端末でキレイに日本語を表示してくれるフォントに変更
Atom>Settings>font familyに「SourceHanCodeJP-Normal」を入力

フォントのインストールは下記のリンクから
https://github.com/adobe-fonts/source-han-code-jp/releases/

・パッケージ名：monokai
個人的に好きなテーマ「monokai」に変更

https://atom.io/themes/monokai

##5 コーディング補助 


・パッケージ名：atom-beautify
コードの整形をしてくれるプラグイン
現時点で、下記の言語に対応しているようです

HTML, CSS, JavaScript, PHP, Python, Ruby, Java, C, C++, C#, Objective-C, CoffeeScript, TypeScript, SQL

https://atom.io/packages/atom-beautify

・パッケージ名：linter
コードの検証を行ってくれるプラグイン

https://atom.io/packages/linter

・パッケージ名：color-picker
色選択に便利なカラーピッカーを表示してくれるプラグイン

https://atom.io/packages/color-picker

##6 ターミナル機能の追加


・パッケージ名：term2
atom上でターミナルを動かすプラグイン

https://atom.io/packages/term2

##7 番外編


・パッケージ名：web-browser
atomでブラウザを使う

https://atom.io/packages/web-browser

![atom02.png](https://qiita-image-store.s3.amazonaws.com/0/86172/a2d16f53-ef5f-b002-5809-f4d5eae73862.png)


最終的にこんな感じの見た目になりました
Atomをカスタマイズしながら、色々と触ってみましたが
使いやすいですね（使いにくいところはカスタマイズできるし）

これからAtomを使う方の一助になれば幸いです。
Laravel,PHPで日付や時間を操作・取得したいとき

PHP,Laravelで日付を操作したいとき、ぱっと出てくるのが、

 - PHPのDateTimeを使う
 - Carbonを使う

だと私的に思っています。

##DateTimeを使う適当な例

現在の時刻をDBに保存する場合、

``` lang:Controller内
Model::insert(array('created_at'=>Carbon::now()));
```

などのように、Carbon::now();を使用すると
2015-01-01 15:54:54
と、H:i:sまで保存してくれます。

しかし、Y-m-dのみ取得したいと感じることって、結構多いですよね。
(日付から検索するシステムを作るときなど...。)

そのような場合はDateTimeを使うと良いのかな？と思います。

``` lang:Controller内
リクエストで受け取ったデータを、Y-m-d表記にし、日付で条件検索したい場合
$date = date_create($request->date) //リクエストのdateがH:i:sまで含んでるとする.
$date = date_format($date , 'Y-m-d');
$obj = Model::where('created_at' , 'like' , $date . '%')->get();

Y-m-d表記にViewで表示させたいときなどの場合
$items = Model::all();                        
foreach ($items as $item) {
   $date = date_create($item->date);
   $date = date_format($date , 'Y-m-d');
   $item->date = $date;  //取得したtimestampのデータを、Y-m-dに変換
}
```


##Carbonを使った適当な例

現時刻から、一日後、一か月後などを知りたい場合はCarbonを使って見るのも良いでしょう。

``` lang:Controller内
   現時刻から一か月後の時間を取得したい場合
   $time = new Carbon(Carbon::now());
   dd($time->addMonth(1));

   現時刻の年だけ取得したい場合
   $time = new Carbon(Carbon::now());
   dd($time->__get('year'));
```

詳しくはCarbonクラスを見て頂ければ様々な場面で応用できるので使ってみてください。

また、timezoneの設定は、config/app.php の timezoneを変更すれば切り替わります。

``` lang:app.php
'timezone' => 'Asia/Tokyo',
'locale' => 'ja',
```
お菓子神社を5ヶ月運用してみて得た知見を共有



## お菓子神社とは？


以下を参照してください。

[チーム開発 - 3年くらいお菓子神社運営してきた - Qiita](http://qiita.com/arihh/items/eaff832ca03f807d9232)

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/27794/fa24a427-66c8-8b55-5105-f52a41069acc.jpeg)
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/27794/a42fae41-5aa5-734d-a1c3-5f1133bd4460.jpeg)
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/27794/0518cb38-0faa-4fa3-39af-279a03045db2.jpeg)


## 使い方
* 参拝者がお供え物（お菓子）を取り、善意（お金）を入れる
* 善意の量については任意（好きなだけ入れる）
* 善意は用意してある缶に入れていく

## ルール
* 神主（運用者）が自腹を切らない
* その都度、善意を入れてもらう（一日分入れるとかはなし）

## お菓子神社を作ってよかったこと
* 食べたいお菓子が少しだけ食べれる
* チーム内、外のコミュニケーションの数が増えた
* 別チームの人がお菓子を求めて訪ねてくるようになった
* 非エンジニアとの会話も増えた
* 社長も参拝してくれる

## 参拝してもらうためにやるべきこと
* お菓子を切らさない
* 個別包装モノを置く
* 神社があることを発信
      
## 成功させるためにやった方がいい施策
* 現状を財政状況の確認を行う
* Slackなどでスレを作り状況を共有できるようにする
* 赤字の場合はアラートを出す
* お供え物が入荷された時も共有
* できるだけお供え物の要望を聞き、購入
* お供え物も購入などを協力してもらう。（協力してもらうことで皆で運用しているようにする）

## 問題に対しての対応
* 小銭処理問題
  * 銀行に一度入金し、下ろすとただで両替できるので、そうすることで解決
* 性善説で成り立たない・赤字が続く
  * 偉い人からの寄付を募る
  * 現状の報告をし、多めに入れてもらうようにする
* 儲かってきた
  * 利益率の低いお供え物や、豪華なお供え物を買う（バリエーションが増えるので喜ばれる）

* 補充する人がいない
  * 手伝ってもらう人を作る
  * 最悪、自分で購入
* 神社の周りで食べて周りを汚くする
  * 注意する

## 商品について
* チョコ
  * 夏は溶けるのでやめた方が良い
* 甘じょっぱい系のお菓子
  * 雪の宿、ぽたぽた焼き、歌舞伎揚げはエンジニアが好き
* パイ系
  * 利益率高い

### 常備してあると良い物
* 雪の宿、ぽたぽた焼き
* 歌舞伎揚げ
* ホームパイ or 源氏パイ
* チョコ（夏でなければ）
* ハッピーターン
* 飴
Spring Boot のWebアプリケーションを heroku で動かしてみる

## 準備

* `heroku-toolbelt` をインストール。
* `Spring Boot` のサンプルを作成。 (今回は`org.springframework.boot:spring-boot-starter-web`を使って検証)
    * 今回は、シングルプロジェクト構成で動作確認しました。(複数のサブプロジェクトで構成されたプロジェクトは未確認)
        * プロジェクト名 -> `sample`
        * バージョン -> `0.1.0`
* `Heroku` に、空のアプリケーションを作成。
    * 任意の名前で作成。
        * アプリケーション名 -> `sample-app`

## 各種ファイルの追加

以下のファイルをプロジェクト直下に追加。

| ファイル名          | 内容                                                                                |
| ------------------ | ----------------------------------------------------------------------------------- |
| `Procfile`         | `web: java -Dserver.port=$PORT -jar build/libs/sample-0.1.0.jar -server.port=$PORT` |
| `settings.gradle`  | `rootProject.name = 'sample'`                                                       |
| `system.properies` | `java.runtime.version=1.8`                                                          |

> プロジェクト名やバージョンなどは、作成するアプリケーションに合わせて修正してください。

## `Gradle` タスクの追加

`build.gralde`に`stage`タスクを追加。

```
task stage (dependsOn : ['clean'])
stage.finalizedBy build
```

## デプロイ

下記のコマンドを実行することでデプロイができます。

1. ディレクトリ移動
    * `cd /path/to/root/project/directory/`
1. ログイン
    * `heroku login`
1. リモートリポジトリ追加 (2つ目のコマンドは)
    * `heroku git:remote -a sample-app`
    * `git remote add heroku https://git.heroku.com/sample-app.git`
1. デプロイ
    * `git push heroku master`
    * `Verifying deploy.... done.` が出力されたら成功。

## 動作確認

下記のコマンドを実行すると、ブラウザが自動起動されます。

1. 動作確認
    * `heroku open`

間違いや質問などありましたら、コメントをお願いいたします。

以上。
rsyncコマンドメモ


```bash
rsync -e "ssh -i /Users/Foo/.ssh/bar.pem" -ruvz --exclude="*\/\.*" --delete --force ./www/wordpress ec2-user@example.com:/var/www/html/ > ~/Desktop/log.txt
```

wordpressディレクトリをhtml直下に同期・転送する.

-e コマンド実行
-r 再帰的に
-u コピー元のほうが新しい場合に転送
-v ファイル名等を出力
-z 転送データを圧縮

--exclude 除外ファイル,ディレクトリ指定(パターンマッチ)
--delete コピーもとにない場合はコピー先のファイルを削除
--force 空ではないディレクトリも削除

--dry-run 空で実行
MongoDB - シャード／レプリカセット構成のスナップショットを取得して検証環境で構築する方法


AWSのEC2上にある本番環境のMongoDBのバックアップをスナップショットで取得しており、そのスナップショットからボリュームを作成して検証環境でシャード／レプリカセット構成を構築したときのメモ

#### 環境

- OS... Ubuntu14.04
- MongoDB... 3.0.6
- StorageEngine... WiredTiger

#### 前提条件

- 本手順で使用する環境はすべてはAWSで構築
- 検証環境のEC2インスタンスのMongoDBのコンフィグは設定ずみ（データ領域があれば起動する状態）
- 検証環境のボリュームのマウントポイントは作成済み
- 本番環境と検証環境のシャード名／レプリカセット名は同一のものを使用

#### 構築順序

##### 1.本番環境バックアップ用Mongod停止

```
# 一貫性のあるバックアップを取得するためバックアップ用ノードのMongodを停止
mongo --port 27018
use admin
db.shutdownServer()
exit
```

##### 2.データ領域のスナップショット取得

```
# バックアップ用ノードのデータ領域のボリュームのスナップショットを取得
aws ec2 create-snapshot --volume-id <VOLUME_ID>
```

##### 3.Mongod起動

```
# バックアップ用ノードのMongodを起動
start mongod
```

##### 4.スナップショットからボリュームを作成

```
# バックアップ用スナップショットからボリュームを作成
aws ec2 create-volume --snapshot-id <SNAPSHOT_ID> --size <SIZE> --availability-zone <AVAILABILITY_ZONE>
```

##### 5.ボリュームを検証環境にAttach

```
# 作成したボリュームを検証環境にAttach
aws ec2 attach-volume --instance-id <INSTANCE_ID> --volume-id <VOLUME_ID> --device <DEVICE>
```

##### 6.Attachしたボリュームをマウント

```
# Attachしたボリュームをマウント
mount -a
```

##### 7.検証環境のMongodConfig起動

```
# AttachしたボリュームよりMongodConfigを起動
start mongodconfig
```

##### 8.検証環境のMongod起動

```
# AttachしたボリュームよりMongodを起動
start mongod
```

##### 9.検証環境のレプリカセット設定変更

```
# local dbにあるレプリカセット設定を削除
mongo --port 27018
use local
db.system.replset.remove({ "version": <VERSION_ID> })

# 停止／起動することにより設定が削除されたことを認識させる
use admin
db.shutdownServer()
exit

# 検証環境用レプリカセットの設定をする
mongo --port 27018
use local
config = { _id : "<SET_NAME>", members : [ { _id : 0, host : "<HOST>:<PORT>", "priority": 2 } ], "version": 1 }
rs.initiate(config)
exit
```

##### 10.検証環境のMongodConfig設定変更

```
# MongoConfigのconfig dbにあるシャード設定を検証環境の情報に更新
mogno --port 27019
use config
db.shards.update({"_id": "<SET_NAME>"},{\$set:{"host": "<SHARD_NAME>/<HOST>:<PORT>"}},false, true)
exit
```

##### 11.検証環境のMongosを起動

```
# 検証環境のMongosを起動
start mongos
```

#### ※参考
http://makaaso.hatenablog.com/entry/2015/09/11/204505
Linux - topコマンドでCPU使用率をコア単位で表示する方法

今までは「sar -P ALL 1」とかでリアルタイムに表示させていたけど、topコマンドでも表示できるのでメモ

#### topコマンドでCPU使用率をコア単位で表示する

```
topを叩いて「1」を入力
```

するとこんな感じで表示される

```
top - 11:01:33 up 90 days, 23:09,  2 users,  load average: 0.16, 0.06, 0.10
Tasks: 219 total,   1 running, 218 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  0.7 us,  0.3 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu4  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu5  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu6  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu7  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:  15400972 total, 14071920 used,  1329052 free,   255892 buffers
KiB Swap:        0 total,        0 used,        0 free. 12294600 cached Mem
```

便利なので使おうと思う

#### 参考
http://makaaso.hatenablog.com/entry/2015/09/10/071238
Python - オブジェクトのアトリビュートの確認方法


botoのオブジェクトのアトリビュートがわからなくて調べた時のメモ

#### オブジェクトのアトリビュートの確認方法

```
print (dir(obj))
```

実際にはこんな感じで使用しました

```
snaps = connec2.get_all_snapshots(filters={'description': info['date']+'*', 'volume-id': info['volume']})[0]
print (dir(snaps))
```

この時はスナップショットIDを取得したかったのでこんな感じ

```
snaps = connec2.get_all_snapshots(filters={'description': info['date']+'*', 'volume-id': info['volume']})[0]
print (snaps.id)
```

#### ※参考
http://makaaso.hatenablog.com/entry/2015/09/10/071517
複数のComponentを簡単管理する方法

　*※一旦削除したものの再掲載になります*

　ゲームUIを作っていて、イメージやラベルを配置してコントロールする際に用いた方法です。

```csharp:MenuManager
using System.Collections.Generic;

class Menu {
	Dictionary<string, UILabel> m_Labels = null;

	void Awake () {
		m_Labels = new Dictionary<string, UILabel> ();
		// 自身以下のUILabelを取得
		UILabel[] labels = this.GetComponentsInChildren <UILabel> ();

		foreach (UILabel label in labels) {
			if (m_Labels.ContainsKey (label.name)) {	
				continue;
			}

			// アタッチされているGameObjectの名前で登録
			m_Labels.Add (label.name, label);
		}
	}

	void Start () {
		m_Labels ["Name"].text = "naoK";
		m_Labels ["HP"].text = "100/100";
	}
}

```

　任意のコンポーネントを全てDictionaryに登録して、コンポーネントのアタッチされているオブジェクトの名前で要素にアクセスするので、実際に配置されているオブジェクトとの関連が分かりやすいです。
　Dictionaryを用いるので、オブジェクトの名前はユニークでなければいけません。これは明示的に命名を強制させる事に繋がるため、用途が不明なオブジェクトを減らすメリットがあります。

　デメリットとしては、特に触る必要の無いオブジェクトまで登録してしまう事です。foreachなどを使って一括で処理を行うと、予期せぬ不具合を起こす可能性があります。

　*・実際にはAwakeで行っている処理をジェネリックなものにして使っています。*
　*・コード上の『UILabel』はNGUIアセットのつもりで書いています。*
Python - psycopg2のインストール


Pythonからpostgresに接続するためにpsycopg2をインストールしようとした時につまずいたのでメモ

#### 環境

* OS... Ubuntu14.04
* Python... Python 3.2.3

#### インストールコマンド

```
sudo pip install psycopg2
```

#### エラーメッセージ

```
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-47ldcn/psycopg2
```

#### 対応
以下のパッケージが不足していたようなのでインストール

```
sudo apt-get install -y python3-dev
sudo apt-get install -y libpq-dev
```

再度インストールしたらうまく動作しました

#### ※参考
http://makaaso.hatenablog.com/entry/2015/09/10/071356
[A5:SQL Mk-2]パラメータ設定をコマンドで行う


# 始まり
  「A5:SQL Mk-2 」はほとんど常設で使用している
  SQLエディタで、使いやすいんですが
  いままで、どうもSQLパラメータの設定がめんどくさかった…
　一回一回ウィンドウで設定をするのが面倒くさくて…

# 方法
ちゃんと説明書には書いてありました



```:命令方法
    /**
     [擬似命令]
     [擬似命令]
     */

    --*[擬似命令]
```

# 擬似命令文
・**Captions** 結果セットの各カラムにキャプションをつけます。
・**DataTitle** 結果セットにタイトルをつけます。
・**SetParameter** SQL実行時のパラメータを設定します。
・**ShowParameterWindow** パラメータ設定画面を表示します。

# パラメータセット
例文)

```
--* SetParameter SET_STR '1804' String
--* SetParameter VER_NO '1804' String
--* SetParameter RET_NUMBER '1804' String

```

SetParameter **[param1]  ** ** [param2] ** **[param3]**


SQL実行時のパラメータを設定します。
  **param1**  パラメータ名
  **param2 ** 値（文字列型を指定する場合は''でくくります）
  ***param3***  データ型 以下で指定します。

|    型 |設定文字列 |
|:-----------|------------:|
| 文字列型  |      String | 
|    整数型  |        Integer | 
|    実数型  |      Float  |
|  論理値型 |     Boolean | 
|   日付型   |     Date  |
|    時刻型   |    Time  |
|       日付／時刻型 | DateTime  |

# 最後
ちゃんと調べれば機能があるんですね…
Emacsのオススメ基本設定まとめ（.emacs.el）

高機能で人気のエディターソフト、Emacs（イーマックス）をもっと便利に使うための設定についてまとめました。

## 高機能のエディターソフト、Emacs
システム開発では、エディターは必携のツールです。VimやEmacs、Sublime Text、mi、サクラエディタなどさまざまなテキストエディターが知られていますよね。最近では、GitHubが開発したAtomなんかも注目を浴びています。

本記事のテーマは、プログラミング用として人気が高く、カスタマイズ性にも優れたEmacs（イーマックス）です。オススメの基本設定についてまとめました。

## Emacsの基本設定オススメまとめ
Emacsの設定ファイルは .emacs.el です。設定情報はこちらに書き込んでいきましょう。ファイルは ~/.emacs.el にあります。

もちろん、コンパイルも忘れずに。

```lang:.emacs.el
;; ロードパスの設定
(setq load-path (append
                 '("~/.emacs.d"
                   "~/.emacs.d/packages")

;; 環境を日本語、UTF-8にする
(set-locale-environment nil)
(set-language-environment "Japanese")
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-buffer-file-coding-system 'utf-8)
(setq default-buffer-file-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)
(prefer-coding-system 'utf-8)

;; スタートアップメッセージを表示させない
(setq inhibit-startup-message t)

;; バックアップファイルを作成させない
(setq make-backup-files nil)

;; 終了時にオートセーブファイルを削除する
(setq delete-auto-save-files t)

;; タブにスペースを使用する
(setq-default tab-width 4 indent-tabs-mode nil)

;; 改行コードを表示する
(setq eol-mnemonic-dos "(CRLF)")
(setq eol-mnemonic-mac "(CR)")
(setq eol-mnemonic-unix "(LF)")

;; 複数ウィンドウを禁止する
(setq ns-pop-up-frames nil)

;; ウィンドウを透明にする
;; アクティブウィンドウ／非アクティブウィンドウ（alphaの値で透明度を指定）
(add-to-list 'default-frame-alist '(alpha . (0.85 0.85)))

;; メニューバーを消す
(menu-bar-mode -1)

;; ツールバーを消す
(tool-bar-mode -1)

;; 列数を表示する
(column-number-mode t)

;; 行数を表示する
(global-linum-mode t)

;; カーソルの点滅をやめる
(blink-cursor-mode 0)

;; カーソル行をハイライトする
(global-hl-line-mode t)

;; 対応する括弧を光らせる
(show-paren-mode 1)

;; ウィンドウ内に収まらないときだけ、カッコ内も光らせる
(setq show-paren-style 'mixed)
(set-face-background 'show-paren-match-face "grey")
(set-face-foreground 'show-paren-match-face "black")

;; スペース、タブなどを可視化する
(global-whitespace-mode 1)

;; スクロールは１行ごとに
(setq scroll-conservatively 1)

;; シフト＋矢印で範囲選択
(setq pc-select-selection-keys-only t)
(pc-selection-mode 1)

;; C-kで行全体を削除する
(setq kill-whole-line t)

;;; dired設定
(require 'dired-x)

;; "yes or no" の選択を "y or n" にする
(fset 'yes-or-no-p 'y-or-n-p)

;; beep音を消す
(defun my-bell-function ()
  (unless (memq this-command
        '(isearch-abort abort-recursive-edit exit-minibuffer
              keyboard-quit mwheel-scroll down up next-line previous-line
              backward-char forward-char))
    (ding)))
(setq ring-bell-function 'my-bell-function)

;; Macのキーバインドを使う
(mac-key-mode 1)

;; Macのoptionをメタキーにする
(setq mac-option-modifier 'meta)
```
firefoxでカーソルが表示される



# 事象
あるときにブラウザでカーソルが表示されだした


# 原因
Firefoxにそう言うモードがあるらしい

参考：[firefoxでページ内にカーソルが表示される件について][1]

[1]:http://blog.setunai.net/20070519/firefox%E3%81%A7%E3%83%9A%E3%83%BC%E3%82%B8%E5%86%85%E3%81%AB%E3%82%AB%E3%83%BC%E3%82%BD%E3%83%AB%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E4%BB%B6%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/comment-page-1/

# 対象方法
firefoxのページ内でカーソルが表示がされてしまう。
「キャレットブラウズ」モードというユーザビリティだそうです
Ｆ７キーでON/OFFが切り替えらるので、これで解決
Javaで整数 ⇄ バイト配列の相互変換

## 必要なインポート

```java
import java.nio.ByteBuffer;
```

## 整数 → 4バイトの配列

```java
byte[] bytes = ByteBuffer.allocate(4).putInt(整数).array();
```

## バイト配列 → 整数
```java
int num = ByteBuffer.wrap(バイト配列).getInt();
```


## サンプルコード

整数1695609641を4のバイトの配列に変換して、元の整数に戻す例です

```java
import java.nio.ByteBuffer;

public class Main {

    public static void main(String[] args) {
        // int -> bytes
        byte[] bytes = ByteBuffer.allocate(4).putInt(1695609641).array();
        // bytes -> int
        int num = ByteBuffer.wrap(bytes).getInt();

        System.out.print("bytes: ");
        for(byte b: bytes){
            System.out.printf("%x ", b);
        }
        System.out.println();

        System.out.print("int: ");
        System.out.println(num);
    }

}

```

### 出力結果
```
bytes: 65 10 f3 29 
int: 1695609641
```

## 参考
- http://stackoverflow.com/questions/2183240/java-integer-to-byte-array
- http://stackoverflow.com/questions/7619058/convert-a-byte-array-to-integer-in-java-and-vise-versa
Activiti-5.18.0の導入方法

#<i class="fa fa-cubes" style="font-size:1em;"></i>概要
[Activiti 5(5.18.0)](http://activiti.org/download.html)の導入手順を整理。
Alfresco導入済みであればActivitiのエンジン部分は含まれているようだが、純粋にワークフロー機能だけを使ってみるためにはUIのサンプルプログラムとして「Activiti-explorer」なるものがあるのでこれを試してみる。

JavaのWebアプリケーションなので、作業としてはwarファイルのデプロイのみ。

#<i class="fa fa-cube" style="font-size:1em;"></i>前提
[Alfresco 4.2.c](https://wiki.alfresco.com/wiki/Community_file_list_4.2.c)を導入済みであること。
※Tomcatだけあればよいが、今回はAlfresco内包のTomcat7を間借りする。

#<i class="fa fa-cube" style="font-size:1em;"></i>手順
作業はOSにログインして行う。
実行時ユーザは次の通り
$ : 一般ユーザ
\# : root

1. ダウンロード
`$ cd /tmp/activiti/`
`$ wget https://github.com/Activiti/Activiti/releases/download/activiti-5.18.0/activiti-5.18.0.zip`
<br>

2. 解凍
`$ cd /tmp/activiti/`
`$ unzip activiti-5.18.0.zip`
<br>

3. WARファイルをデプロイ
`# cd /opt/alfresco-4.2.c/tomcat/webapps/`
`$ cp -p /tmp/activiti/activiti-5.18.0/wars/activiti-explorer.war .`
`$ cp -p /tmp/activiti/activiti-5.18.0/wars/activiti-rest.war .`
<br>

4. サービスの再起動
`# service alfresco restart`
<br>

5. サービスの確認
`# service alfresco status`
※起動している(tomcatとpostgresqlがrunningと表示される)こと。
<br>

6. ログの確認
`# tail /opt/alfresco-4.2.c/tomcat/logs/catalina.out`
``# tail /opt/alfresco-4.2.c/tomcat/logs/catalina.`date + %Y-%m-%d`.log``
※エラーが出ていないこと。
<br>

7. ブラウザで確認
http://hostname:port/alfresco-explorer/
Activiti-Explorerのログイン画面が表示されること。
![activiti-5.18.0_login.png](https://qiita-image-store.s3.amazonaws.com/0/85506/01f01e3a-db89-844a-fe63-67c272b4beea.png)
<br>

8. ログイン確認
ログインできること。
![activiti-5.18.0_top.png](https://qiita-image-store.s3.amazonaws.com/0/85506/047b5ecb-6f57-6f5c-96a6-2181e7efb679.png)
デフォルトで、ユーザは役割に応じて3アカウント用意されている。
ユーザ1(admin)
ユーザID　：　kermit
パスワード　：　kermit
ユーザ2(manager)
ユーザID　：　gonzo
パスワード　：　gonzo
ユーザ3(user)
ユーザID　：　fozzie
パスワード　：　fozzie
<br>

#<i class="fa fa-cube" style="font-size:1em;"></i>環境

OS　：　CentOS 6.6
Alfresco　：　[Alfresco 4.2.c](https://wiki.alfresco.com/wiki/Community_file_list_4.2.c)

#<i class="fa fa-book" style="font-size:1em;"></i>参考
https://www.alfresco.com/jp/products/activiti
http://activiti.org/download.html
http://activiti.org/userguide/
C++では、必要でない限り、後置インクリメント演算子は使わず、前置インクリメント演算子を使ったほうがよい

現在C++を勉強しようと、『C++ Primer, 5th Edition』を読んでいるのですが、Javaからプログラミングに入った身として、Javaとは違う慣習をいくつか発見しました。その中の一つが、 *必要でない限り、後置インクリメント演算子は使わず、前置インクリメント演算子を使う* ことです。

# 例
例えばよく使う以下のようなforループでは、Javaプログラマーとしてはこう書いてしまいがちですが、
`for (int i = 0; i < n; i++)`

C++的にはこう書いたほうが良いようです。
`for (int i = 0; i < n; ++i)`

（本当はC++的にはi != nと書いた方が良いようですが、それはまた別の話なので分かりやすくするため、あえて変えませんでした）

# 理由
理由としては、前置バージョンの場合、単純に被演算子をインクリメントしたあと、変更されたオブジェクトを結果として取得しますが、後置バージョンの場合、被演算子をインクリメントしたあと、 **変更される前の元のコピーを取得** します。その結果、後置バージョンの方が処理が多くなってしまいます。コンパイラによりこの辺の処理が最適化してあったりもするようですが、intなどでなく、複雑なイテレータの型の場合、処理が高まる場合もあるようです。

追記 (2016/01/02):
@MoriokaReimenさんによるgccでのint型を使った検証の結果 (コメント参照)、吐き出されるアセンブリコードに違いは現れなかったそうです。最近のコンパイラではプリミティブ型の場合、前置バージョンと後置バージョンによる処理の違いはないと考えてよさそうです。

追記 (2018/06/18）:
@fujitanozomuさんによる初期C++コンパイラであるTurbo C++ Version 1.01による検証の結果（コメント参照）でも、ほぼ違いがでなかったそうです。古いコンパイラでもプリミティブ型の場合、大きな違いは出ないようです。

追記（2020/02/18）：
@hanazino17 さんによる[補足](https://qiita.com/tommy6073/items/bc5bb97e27c6ee7d633f#comment-71c873ce2639f20a008c)：

> 代入する場合はインクリメントが先か代入が先かという違いがあります。
> 効率の話はコピーコンストラクタが何回動くかの話です。
> プリミティブ型はコンストラクタはないので当然アセンブリに差はでないです。
> どちらが良いとかではなく、必要に応じて使い分けるのが正しい理解だと思います。

# 感想
細かい違いですが、C++のような低級な言語では、こういった細かいところでの最適化が大事になってくると思うので、気をつけていきたいと思います。

# 参考文献
[C++ Primer, 5th Edition](http://www.amazon.co.jp/Primer-5th-Edition-Stanley-Lippman/dp/0321714113) (p.148より)
$ git commit --amend の「直前のコミット」って何？

`$ git commit --amend` は「直前のコミット」を変更できる。
ただ、ここでいう「直前」とは何なのか？

それは「いまの更新作業の状態」に対しての「直前」だ。（つまり現在のHEADだ）

だから状況によって `--amend` の対象は変わる。
たとえば `$ git rebase -i` (インタラクティブモード)で過去のコミットを編集していたりすると、amend の対象は変わるぞ。

よく分からなかったら `$ git log` を実行してみよう。
具体的には、ここでリストの一番上に表示されるコミットが、`$ commit --amend` の対象になる。

不安を感じるなら、事前に必ず `$ git log` する癖をつけると良いだろう。



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
WPF BitmapImageをImageにバインドしたのにうまく表示されない


「イメージファイル(png)をBitmapImageに読み込んでxaml上でImageにバインドしたけど表示されないことがある」
という問題が発生。表示できるものとできないものがある。
結果、うまく表示できるようになったのでそのメモ。

### 結論：Imageの「Stretch="None"」の指定やめて、Witdh,Heightにイメージのサイズを指定したら表示された

うまく表示されないときのxaml。

```
<Image Source="{Binding ImageSource}" Stretch="None"/>
```

うまく表示されるxaml。

```
<Image Source="{Binding ImageSource}" Width="{Binding RelativeSource={RelativeSource Self}, Path=Source.PixelWidth}" Height="{Binding RelativeSource={RelativeSource Self}, Path=Source.PixelHeight}" />
```

修正は二箇所。

#### 修正１　Stretch="None"はずした
[Stretchの説明](https://msdn.microsoft.com/ja-jp/library/system.windows.media.stretch(v=vs.110).aspx)には、None「コンテンツの現在のサイズが維持されます。」と書いてある。
なので、てっきりNoneにすればいい具合に等倍で表示されると思い込んで指定してた。

#### 修正２　Width, Heightの設定
BitmapImageがおかしいんじゃないかと思い調べたところ、Width, Heightに謎の巨大な値が入っていた（Dpiとの兼ね合い？）。
PixelWidth, PixelHeightには正しいイメージのサイズが入っていたので、ImageのWidth,Heightにその値をバインドしたところ、うまく表示されるようになった。
Rails Console上で出力を整形してくれるHirbが便利

以下はRails Console上でusersテーブルから1件だけ取得するクエリだが、結果が少々見づらい。

    irb(main):001:0> User.first
      User Load (0.3ms)  SELECT  `users`.* FROM `users`  ORDER BY `users`.`id` ASC LIMIT 1
    => #<User id: 1, status: "active", lock_version: 0, created_at: "2015-08-03 10:25:35 +0900", updated_at: "2015-08-03 10:25:35 +0900">
    irb(main):002:0>

そこで、出力結果を整形してくれるHirbというgemを導入してみる。

# インストール

Gemfileに以下を記述。

    gem 'hirb'
    gem 'hirb-unicode'

bundle installを実行。

    $ bundle install

Hirbを有効にして、先程と同じクエリを実行してみる。
Rails Console上で以下を実行。

    irb(main):002:0> Hirb.enable
    => true
    irb(main):003:0> User.first
      User Load (0.3ms)  SELECT  `users`.* FROM `users`  ORDER BY `users`.`id` ASC LIMIT 1
    +----+--------+--------------+---------------------------+---------------------------+
    | id | status | lock_version | created_at                | updated_at                |
    +----+--------+--------------+---------------------------+---------------------------+
    | 1  | active | 0            | 2015-08-03 10:25:35 +0900 | 2015-08-03 10:25:35 +0900 |
    +----+--------+--------------+---------------------------+---------------------------+
    1 row in set
    irb(main):004:0>

見やすい。
Rails: アクションによってバリデーションを切り替えた時の、モデルのテスト方法

「[状況によってsave時に実行するバリデーションを切り替える] (http://qiita.com/kadoppe/items/061d137e6022fa099872)」という記事が役立った。

ではテストではどうすれば良いのか？
 `.on(:action_name)` を使おう。

```rb:app/models/user.rb
class User
  validates :name, presence: true, on: :index
  validates_length_of :introduction, maximum: 10000. on: :create
end
```

```rb:spec/models/user_spec.rb
require 'spec_helper'

describe User, type: :model do
  it { should validate_presence_of(:name).on(:index) }
  it { should validate_length_of(:introduction).is_at_most(10000).on(:create) }
end
```

---

書き方は Rspec でも Test::Unit でも同じ感じ。

ただし、 `validate_numericality_of.on(:index)` は出来なかった。
( [GitHubの説明通り](https://github.com/thoughtbot/shoulda-matchers/blob/master/lib/shoulda/matchers/active_model/validate_length_of_matcher.rb)に書いてもなぜか NoMethodError )



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->