OmniAICreator/Qiita-1.07M huggingface dataset:
IPAddressへPingを送信<C#>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.NetworkInformation;
namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            Ping p = new Ping();
            /*送信先IPAddress*/
            PingReply pr = p.Send("127.0.0.1");
            if(pr.Status == IPStatus.Success)
            {
                Console.WriteLine("ping --- OK");
            }
            else
            {
                Console.WriteLine("ping --- NO");
            }
        }
    }
}



上のはコード上で送信先IPAddressを指定しています。
次はソフト上で指定できるようにしてみましょう。



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.NetworkInformation;
namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            Ping p = new Ping();
            Console.Write("IPAddress :: ");
            var ip = Console.ReadLine();
            PingReply pr = p.Send(ip);
            if (pr.Status == IPStatus.Success)
            {
                Console.WriteLine("ping --- OK");
            }
            else
            {
                Console.WriteLine("ping --- NO");
            }
        }
    }
}


これでソフト上で指定できるようになりました。

var ip = Console.ReadLine()　👈これでユーザーが入力できるようになっています。
　　　　　　　　　　　　　　　　　そしてvar変数で、
　　　　　　　　　　　　　　　　　変数名ipをpingReply pr = p.Send(ここに変数名)こうしてp.Sendに収めます。
暗号の3属性とSSL/TLSの3要素


暗号技術は、達成すべき3つの属性があります。そして、SSL/TLSには、実装に当たって3つの暗号技術を組み合わせています。ただし、この3つは必ずしも一致するものではありません。ここでは、暗号技術が達成すべき3つの目標と、SSL/TLSの実装で使われる3つの技術について説明します。
# 暗号技術の目標
暗号と言えば、まず第一に想像するのが、「第三者に文章を読めなくする」ということですが、これだけでは文章の安全性の確保としては不十分です。現代暗号では、安全性確保のために3つの要素が考慮されています。
## 機密性
上でも触れたように、「正当な受信者以外が通信内容を知ることはできない」という性質です。古代暗号から脈々と受け継がれている機能ですが、現代暗号の中には誰もが「正当な受信者」となる、すなわち機密性を持たない応用も存在しています。

## 完全性
たとえ正しく機密性が確保された文書であっても、通信途中で（暗号は外さないままで）改竄されてしまうことがありえます。「完全性」は改竄がされた場合には復号自体ができなくなる、あるいは復号時にチェックすれば改竄が判明するような仕組みを取って、改竄されない通信を確保します。

## 相手の認証
現実に相手と会う場合よりはるかに容易な形で、コンピューター通信では常になりすましの危険が発生します。いくら機密性・完全性を保ったところで、なりすまされた相手と通信するようでは安全性は崩壊してしまいます。技術的に相手を偽れないようにすることも、暗号技術の目指すところの1つです。

# SSL/TLSの3要素
ブラウザ上で日常的に使われているSSL/TLSですが、詳しく見れば3つの要素を組み合わせています。
## 公開鍵暗号
詳細は省略しますが、「公開鍵と秘密鍵を生成する」という、古典暗号とは大幅に違った性質を持つ暗号です。その性質を生かした核種の応用が存在しますが、SSL/TLSでは証明書を利用した「相手の認証」と、公開鍵暗号で直接あるいは応用形のDH鍵共有で暗号鍵を共有することで、「機密性」保証の**一部**を担います。
## 共通鍵暗号
これは古典暗号とも共通する、暗号化と復号化に同じ鍵を使う暗号化方式です。公開鍵暗号は数学的に複雑となるため速度が遅く、通信すべてを暗号化するのは実用的ではありません。そこで、鍵だけは上の公開鍵暗号でやり取りして、その鍵を使って共通鍵暗号で本文を暗号化して「機密性」を確保する、という2段構えの構成（ハイブリッド暗号）となっています。
## メッセージ認証符号
メッセージの「完全性」を保証するために、メッセージ認証符号が使われます。メッセージ本体と、共有している鍵を使って、鍵を知らない第三者には生成できない認証符号を付けます。
### 認証付き暗号
メッセージ自体の暗号化とメッセージ認証符号を独立に付けると、組み合わせによってはセキュリティ上の問題が生じることが分かってきました。そういうわけで、「認証付き暗号」として1つのアルゴリズムとしてしまおうという考えが生まれ、策定中のTLS 1.3ではそれが必須となる予定です。

# 参考文献
結城浩「[暗号技術入門 秘密の国のアリス](http://www.hyuki.com/cr/)」
スライドにソースコードを貼る

# スライドにソースコードを貼る
発表資料にソースコードを貼りたいときなど．
Keynoteが対象であれば`highlight`を利用しrtf形式に変換してクリップボードにコピーすれば良い（ref: [Keynoteにシンタックスハイライトされたソースコードをはりつける方法 - Qiita][highlight-takuma7]）．
しかし，対象がAdobe Illustratorの場合は話が違ってくる．rtf形式で貼り付けてもプレーンテキストになってしまうため，違うアプローチを取る必要がある
ここでは，svgファイルに出力して貼り付ける方法を紹介する．

## Install `highlight`
homebrewから．

```shell-session
$ brew install highlight
```

## Generate `.svg`
### Format
`highlight`では`-O`（`--out-format`）オプションにより出力形式を選択できる．出力可能な形式は以下のとおり: 

* `html`
* `xhtml`
* `latex`
* `tex`
* `odt`
* `rtf`
* `ansi`
* `xterm256`
* `bbcode`
* `pango`
* `svg`

Illustratorに貼り付けたいなら`svg`ファイルに出力，Keynoteに貼り付けたいなら`rtf`形式でクリップボードにコピーしたら良い．

```shell-session
# Keynoteに貼り付けたい場合
$ highlight -O rtf awesome_code.rb | pbcopy

# Illustratorに貼り付けたい場合
$ highlight -O svg awesome_code.rb > awesome_code.svg
```

### Include style
では，先ほどのコマンドでsvgを生成してIllustratorに貼り付ければいいか（rtfならさっきのでOK）．

残念ながら，これでも残念なコードが貼り付けられてしまう．スタイルが別ファイルに書きだされてしまってるからである．スタイルも同一ファイルに含めるためには`-I`（`--include-style`）オプションを付与すれば良い．

```shell-session
$ highlight -O svg -I awesome_code.rb > awesome_code.svg
```

### Other options
`highlight -h`とか打てば確認できる．ここではよく使いそうなのだけ紹介．
#### color theme
`-s`（`--style`）オプションにより変更可能．利用できるスタイルは以下のコマンドを打てば確認できる．

```shell-session
$ ls $(highlight --print-config | grep -A 1 "Config file search directories" | tail -n 1)/themes | awk -F. '{print $1}'
```

#### line numbers
`-l`（`--line-numbers`）オプションにより付与できる．また，`-j`（`--line-number-length`）により桁数を変更できる．デフォルトが結構大きいので，スライドに貼るのが目的なら2とかで十分．

#### font
`-k`（`--font`）オプションで種類を，`-K`（`--font-size`）で大きさを制御できる．
スライド中のフォントサイズには注意しましょう．


# まとめ
だいたいこんなかんじ．

```shell-session
$ highlight -O <format> -s <style> --include-style --line-numbers --line-number-length 2 --font Ricty --font-size 24 awesome_code.rb > awesome_code.svg
```

* Illustratorに貼りたい: svgに書き出す
* Keynoteに貼りたい: rtfにしてコピー

# Reference
* [Keynoteにシンタックスハイライトされたソースコードをはりつける方法 - Qiita][highlight-takuma7]

[highlight-takuma7]: http://qiita.com/takuma7/items/c7839d6a2b916b85105b
Ubuntu 14.04に最新のnodejsをインストールする


何時間もハマったので書いときます

[Node.js v0.12, io.js, and the NodeSource Linux Repositories](https://nodesource.com/blog/nodejs-v012-iojs-and-the-nodesource-linux-repositories#installing-node-js-v0-12)

```
# Note the new setup script name for Node.js v0.12
curl -sL https://deb.nodesource.com/setup_0.12 | sudo bash -

# Then install with:
sudo apt-get install -y nodejs
```

[2015/11/9]追記
↑はv0.12が最新だったときの方法です

現時点での最新のnodejsをインストールするときは
[https://github.com/nodesource/distributions/tree/master/deb](https://github.com/nodesource/distributions/tree/master/deb)
から任意のversionを選んで↑の`setup_0.12`と置き換えて試してみてください

詳しくは↓
https://github.com/nodesource/distributions
HomeBrew で古いバージョンをインストールするもうひとつの方法


Ruby 開発で RMagick が ImageMagick 6.9.0 を要求するも、Mac 環境では ImageMagick 6.9.1 がインストールされており、rails が起動できないという状況です。

```bash
$ bundle exec rails s
/Users/ogata/.rvm/gems/ruby-2.1.5/gems/activesupport-3.2.21/lib/active_support/dependencies.rb:251:in `require': This installation of RMagick was configured with ImageMagick 6.9.0 but ImageMagick 6.9.1-1 is in use. (RuntimeError)
```

おそらく `brew update` でバージョンアップしてしまったんだと思います。

まずは、現在インストールされている ImageMagick 6.9.1-1 を削除します。

```bash
$ brew uninstall imagemagick
```

次に、ImageMagick を unlink します。

```bash
$ brew unlink imagemagick
```

そして、ImageMagick の過去のログを確認し、目的のバージョン 6.9.0 を探します。

```bash
$ cd /usr/local/Library/Formula
$ git log imagemagick.rb
(snip)
commit e8a20c2ef80a82b7c1deb1d4fc532a7d164e169d
Author: Alex Dunn <dunn.alex@gmail.com>
Date:   Sat Apr 4 21:28:24 2015 -0700

    imagemagick 6.9.1-0
    
    Closes #38375.
    
    Signed-off-by: Xu Cheng <xucheng@me.com>

commit f6b47796d0fc3a05cc00d62fc68556b77ad5a1dc
Author: Arthur Darcet <arthur+github@darcet.fr>
Date:   Thu Apr 2 11:50:40 2015 +0200

    imagemagick: optional pango dependency.
    
    Closes #38296.
    
    Signed-off-by: Mike McQuaid <mike@mikemcquaid.com>

commit c809b354df36c3d2a92c0a4945803aeb203c8369
Author: BrewTestBot <brew-test-bot@googlegroups.com>
Date:   Mon Mar 9 12:06:36 2015 +0000

    imagemagick: update 6.9.0-10 bottle.

commit f0e1fe27baf666035b7cdebceae54c402d6a5044
Author: tpetry <tobias_petry@hotmail.com>
Date:   Sun Mar 8 22:45:06 2015 +0100

    imagemagick 6.9.0-10
    
    Closes #37513.
    
    Signed-off-by: Mike McQuaid <mike@mikemcquaid.com>
```

どうやら f6b47796d0fc3a05cc00d62fc68556b77ad5a1dc が最も新しい 6.9.0 のようです。これをチェックアウトします。

```bash
$ git checkout f6b47796d0fc3a05cc00d62fc68556b77ad5a1dc imagemagick.rb
```

チェックアウト後、ImageMagick をインストールします。

```bash
$ brew install imagemagick
```

これで ImageMagick をバージョン指定してインストールすることに成功しました。

これで解決すると思いますが、もし解決しなかったら、プロジェクトディレクトリ配下で以下のコマンドを打って RMagick をリビルドしてみてください。

```bash
$ sudo PKG_CONFIG_PATH=/usr/local/Cellar/imagemagick/6.9.0-10/lib/pkgconfig gem install rmagick -v '2.13.2'
```
Androidのchromeで「&nbsp;」が「・」になるバグ

# 備忘録

Android の chrome 40 で「&amp;nbsp;」が「・」になるバグがあったので対処法をメモ



## 症状

### 通常の見え方
![nomal.png](https://qiita-image-store.s3.amazonaws.com/0/33813/de3f2add-5b93-6df6-ce35-a9ed000eaea5.png)

### Android版Chrome
![android_chrome_bug.png](https://qiita-image-store.s3.amazonaws.com/0/33813/c9004094-38e7-87d1-799b-d226f64c52a6.png)


「&amp;nbsp;」が「・」になってる。


## 対処法

font-familyに「Helvetica」を指定する


```css:バグがあった状態
body{
  font-family: sans-serif;
}

```


念のためjsでユーザーエージェント判定しでclass付与してバグ回避。

・[JavaScriptでユーザーエージェントを取得しclassを付与する](http://qiita.com/tonkatu_tanaka/items/472ec6055dcf9c4110b1)

```css:バグがあった時
body{
  font-family: sans-serif;
}
html.android.chrome body{
  font-family: Helvetica, sans-serif;
}

```
RequireJS使用下で任意のファイルをconcatして使用する際のメモ

# 概要
メモなので流し書き。

RequireJSを使うことで任意のライブラリ達をそのページごとに動的に読み込めるように書くことができるが、これをそのまんま使い、小分けにモジュール単位でJSを組んだ場合、読み込むJSのリクエスト数が膨れ上がっていく。

webpackでは1枚のファイルに使用するJS達を結合することで解決する。
RequireJSならr.jsやらgrunt-contrib-requirejsでも同様のことが可能である。

が、運用フェーズではWebpackやGrunt等のタスクランナーが使用できない状況下で
RequireJSを用いて動的に読み込みつつ共通部分に関してはリクエスト数を減らすため、結合したライブラリを用いたい。

単純にgrunt-contrib-concat等を使ってconcat、結合すればよいかといえば現状そのままではうまくいかなくてハマったのでその解決策をメモする。

# 例
例えば、標準でjqueryとunderscoreとbackboneをどのコンテンツでも使用すると仮定した場合、この3つのファイルを結合したJSファイルを作り、これを単純にconcatしたファイルをrequireで読み込んだ場合、backboneの読み込みがコケる。

grunt-contrib-requirejsやらを用いるとうまく読むので、どうも普通にはくっつけていない模様、何が違うのかと。


## 原因
AMD対応で入れたdefine部分の書き方に少し問題がある。
grunt-contrib-requirejsやらの使用ではちゃんと解決した状態でconcatしている。

### jQuery

```
define("jquery",[],function(){return m})…
```
→define部分が「名前」「依存関係」「定義」になっている。
この名前が定義されているライブラリ群はconcatされていても「jquery」指定で正しく読める。

### 問題のbackbone

```
define(["underscore","jquery","exports"],function(i,r,s){t.Backbone=e(t,s,i,r)})…
```

→define部分に名前が定義されていない
これが原因で読み込みがコケる。

```
define("backbone",["underscore","jquery","exports"],function(i,r,s){t.Backbone=e(t,s,i,r)})…
```
で、こう直すと「backbone」で読めてうまくいく。


### 締めに
```
define('vendor',['jquery', 'underscore', 'backbone'], function(){});
```
concatしたファイルに最下部にこの1行を入れておくと「vendor」指定でこの3つのライブラリが読める。

# ほかに
velocityも同様に名前定義が無いのでconcatでくっつける場合は名前指定を入れておく。
自分でモジュールを作る場合もdefine指定は名前を定義しておく癖を付けておく。
【Sass】配列を@each文でリストとして出力

#概要

each文を使って配列を繰り返し処理して、
スタイルを生成、`<ul><li></li></ul>` にテキストとして出力。

単に用意されている`<li></li>`にCSSでテキストを出力しているだけで、別に動的に出力しているわけでは無いんですけどね・・・。

#内容

HTML

```html:html

<ul>
 <li></li>
 <li></li>
 <li></li>
 <li></li>
 <li></li>
 <li></li>
</ul>


```

SCSS

```j:scss

// 配列 
$values: Curtis Wilbur, John S McCain, Fitzgerald, Lassen, McCampbell, Mustin;

ul{
    @each $value in $values {
        $key: index($values, $value);
        li:nth-child(#{$key}):before{
            content: '#{nth($values, $key)}';
        }
    }
}

```

上記のコードをコンパイルすると、こういう形で出力されます。

```css:css

ul li:nth-child(1):before {content: "Curtis Wilbur";}
ul li:nth-child(2):before {content: "John S McCain";}
ul li:nth-child(3):before {content: "Fitzgerald";}
ul li:nth-child(4):before {content: "Lassen";}
ul li:nth-child(5):before {content: "McCampbell";}
ul li:nth-child(6):before {content: "Mustin";}


```

ブラウザで見るとこうなります。

```

・Curtis Wilbur
・John S McCain
・Fitzgerald
・Lassen
・McCampbell
・Mustin


```


#簡単に手順説明

まず、配列を定義します。

```j

// 配列 
$values: Curtis Wilbur, John S McCain, Fitzgerald, Lassen, McCampbell, Mustin;


```

配列はコンマか半角スペースを入れることで定義できます。


```
$key: index($values, $value);

```

`$key` に数値を定義。

```

nth($values, $index_key)

```

で、配列の値を取得して、プロパティの`content:''`で出力します。


#ちなみに

```j:scss

ul{
    @each $value in $values {
        $key: index($values, $value);
        li:nth-child(#{$key}):before{
            content: '#{nth($values, $key)}';
        }
    }
}

// 配列 
$values: Curtis Wilbur, John S McCain, Fitzgerald, Lassen, McCampbell, Mustin;

```

配列が後ろにきても大丈夫。

#ちなみに、ちなみに

each文はこの記事のような使い方をするものではありません（免罪）
海外への返金処理について

海外のユーザーに返金処理したいのですが、すでに「返金」ボタンが消えてしまっています。
おそらく取引日より60日経過したためでしょうか。
返金ボタンを使えばおそらく当時の為替レートで手数料を含めて返金が出来たと思うのですが、
もう難しいでしょうかね。
AWSのEC2でサーバーが起動しないエラー対応

#概要

AWSで動いているWindows2012Server R2でエラーが出て起動できなくなりました。
対応方法としては、
サーバーをシャットダウンして、ECのタイプをC3.laregeにすることで起動することができました。
原因は、下記の参考URLをあとでゆっくり読んでみたいと思う。

```lang:Logs
システムログ: i-XXXXXXXX (XXX(WIN2012))
2015/05/18 06:24:33Z: AMI Origin Version: 2014.07.10
2015/05/18 06:24:33Z: AMI Origin Name: Windows_Server-2012-R2_RTM-Japanese-64Bit-Base
2015/05/18 06:24:33Z: OS: Microsoft Windows NT 6.2.9200.0
2015/05/18 06:24:33Z: Language: ja-JP
2015/05/18 06:24:33Z: EC2 Agent: Ec2Config service v2.2.5.0
2015/05/18 06:24:36Z: Difficulty detecting PV driver details for Console Output
2015/05/18 06:25:18Z: Message: Waiting for meta-data accessibility...
2015/05/18 06:30:15Z: AMI Origin Version: 2014.07.10
2015/05/18 06:30:15Z: AMI Origin Name: Windows_Server-2012-R2_RTM-Japanese-64Bit-Base
2015/05/18 06:30:15Z: OS: Microsoft Windows NT 6.2.9200.0
2015/05/18 06:30:15Z: Language: ja-JP
2015/05/18 06:30:15Z: EC2 Agent: Ec2Config service v2.2.5.0
2015/05/18 06:30:20Z: Difficulty detecting PV driver details for Console Output
```


#エラー解消方法
このサイトからこのファイルをダウンロード
Download the AWS PV upgrader 
http://ec2-downloads-windows.s3.amazonaws.com/Drivers/AWSPVDriverSetup7.2.5.zip


![image](https://qiita-image-store.s3.amazonaws.com/0/47172/fb14c5fa-7f75-d4c1-ff04-6b62c865cbcc.png)

**ドライバがインストールされたか確認**

![image](https://qiita-image-store.s3.amazonaws.com/0/47172/83de25aa-0215-25a3-37c3-48303caf31f7.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/47172/f9c465f2-3416-b4d2-8a0c-c13b2e91d9d1.png)

バージョンが7.2.5.1

![image](https://qiita-image-store.s3.amazonaws.com/0/47172/f8a7b83a-e6f7-cac1-f07a-4c951cb3899c.png)




#参考URL
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/Upgrading_PV_drivers.html
http://aws.amazon.com/windows/products/ec2/server2012r2/network-drivers/
https://forums.aws.amazon.com/thread.jspa?messageID=609101
https://forums.aws.amazon.com/thread.jspa?threadID=168604
定期支払いのステータス返却先

定期支払ステータス(変更/失敗)の返却先メモ

1. PayPalにAPIを呼び出しているPayPalビジネスアカウントでログイン
2. 表示された画面の上部にあるメニューから「個人設定」をクリック
3. 表示された画面の「販売ツール」内にある「即時支払い通知」欄の更新をクリック
4. 表示された画面で「設定を編集」ボタンをクリックして、返却先URLを設定

指定したURLに返却される具体的な内容は、以下にあります。

Instant Payment Notification
https://developer.paypal.com/webapps/developer/docs/classic/ipn/gs_IPN/
ActiveRecord の take と first の違いは？

どちらも LIMIT 1 した結果を返す。
ただし first は、order の指定がなければプライマリーキーでソートする。
となっているようです。

```ruby
require "active_record"
ActiveRecord::Base.logger = ActiveSupport::Logger.new(STDOUT)
ActiveSupport::LogSubscriber.colorize_logging = false
ActiveRecord::Migration.verbose = false
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
silence_stream(STDOUT) do
  ActiveRecord::Schema.define do
    create_table :users do |t|
      t.string :name
    end
  end
  class User < ActiveRecord::Base
  end
  User.create!
end

User.take
User.first
User.order(:name).first
# >>   User Load (0.1ms)  SELECT  "users".* FROM "users" LIMIT 1
# >>   User Load (0.1ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" ASC LIMIT 1
# >>   User Load (0.1ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."name" ASC LIMIT 1
```
Windows 環境の PHP から Oracle へ接続する

Windows 環境の PHP から Oracle へ接続する
==========================================

Linux 向けの記事はたくさんありましたが、 Windows 向けの記事は見かけなかったので。

準備
-----

### Windows 版 PHP のインストール ###

[WebMatrix](https://www.microsoft.com/japan/web/webmatrix/) や [Web Platform Installer](http://www.microsoft.com/web/downloads/platform.aspx) を使用すると良いでしょう。

ここでは PHP5.5.x を例にします。他のバージョンを使用する場合は、適宜読み替えてください。

### Oracle Instant Client のダウンロード ###

[Instant Clientのダウンロード](http://www.oracle.com/technetwork/jp/topics/index-099943-ja.html) より、 **Instant Client for Microsoft Windows (32-bit)** をダウンロードします。
64bit 版の Windows でも 32bit 版の Instant Client を使用することに注意してください。

今回は **Version 11.2.0.3.0** を例にします。他のバージョンを使用する場合は、適宜読み替えてください。

セットアップ
-------------

### ZIP の展開と DLL のコピー ###

Instant Client の ZIP ファイルを適当な場所に展開します。

展開したフォルダ直下にある、以下の DLL を PHP のインストールされたフォルダにコピーします。

- `oci.dll`
- `ociw32.dll`
- `orannzsbb11.dll`
- `oraocci11.dll`
- `oraociei11.dll`
- `orasql11.dll`

WebMatrix や Web Platform Installer を使用して、 PHP5.5.x をインストールした場合は、以下のフォルダにコピーします。

```C:\Program Files (x86)\IIS Express\PHP\v5.5```

### php.ini の編集 ###

`C:\Program Files (x86)\IIS Express\PHP\v5.5\php.ini` の末尾に以下を追加します。

```ini
;; extension=php_oci8.dll    ;; Oracle 11g より前のバージョンはこちらを有効に
extension=php_oci8_11g.dll   ;; Oracle 11g 以降のバージョンはこちらを有効に
extension=php_pdo_oci.dll
```

Oracle 11g をインストールしていても、 環境によっては Oracle 10g のクライアントが有効になっている場合があります。
その場合は、`php_oci8.dll` を有効にしないと接続に失敗しますので注意してください。

接続方法
---------

<http://php.net/manual/ja/function.oci-connect.php> のサンプルが詳しいです。

Doctrine DBAL で、サービス名を指定して接続する例です。

```php
<?php
$config = new \Doctrine\DBAL\Configuration();
//..
$connectionParams = array(
    'dbname' => '<SERVICE_NAME>',
    'user' => 'user',
    'password' => 'secret',
    'host' => 'localhost',
    'driver' => 'oci8',
    'port' => 1521,
    'charset' => 'AL32UTF8',
    'db_event_subscribers' => 'Doctrine\DBAL\Event\Listeners\OracleSessionInit',
    'service' => true
);
$conn = \Doctrine\DBAL\DriverManager::getConnection($connectionParams, $config);
```
Elastic Besnstalkで同じsubnetにELBとEC2を配置する方法

ネットワーク構成の関係で、ELB & EC2を同じサブネットかつ、internalで作りたかったときに、どうにも、同じサブネットにelbとec2をManagement Consoleで設定できなくてはまったが、以下のような順番でやったらできたのでメモ。

1. Associate Public IP Address のチェックボックスははずさない状態でサブネットを選択（はずしてしまうと、Management Consoleでは、同一のsubnetにチェックボックスがつけられない。）
![Create_Environment_-_2015-05-18_18.23.26.png](https://qiita-image-store.s3.amazonaws.com/0/37781/6b31f01c-aee8-1af7-603f-0758585cefaa.png)

2. Asscociate Public IP Addressのチェックボックスをはずす
![Create_Environment_-_2015-05-18_18.23.56.png](https://qiita-image-store.s3.amazonaws.com/0/37781/02481c2b-7f72-4fe9-a7fe-06ad018e604e.png)


と、自分でNATをつくって、internetから、elb subnetにいけるように設定してね、的なwarningがでるが、そのまま進む。

と、普通につくれる。
composerのインストール

1. composerのコマンドツールをダウンロードします。<br />
``
curl -sS https://getcomposer.org/installer | php
``
2. composerのコマンドの起動パスが通るようにします。<br />
``
mv composer.phar /usr/local/bin/composer
``

これで、コマンドが使用出来ます。
$ composer
MyHDLのデコレータ

MyHDLに出てくるデコレータをReferenceから整理しました。

## instance()
最も一般的なデコレータです。自動的にgeneratorを作ります。

```python
def ClkDriver(clk, period=20):
    
    lowTime = int(period/2)
    highTime = period - lowTime

    @instance
    def driveClk():
        while True:
            yield delay(lowTime)
            clk.next = 1
            yield delay(highTime)
            clk.next = 0

    return driveClk
```

## always()
決まったパターンで使うデコレータ。クロックの立ち上がりで動作する回路の例

```python
    @always(clk.posedge)
    def write():
        if we:
            mem[addr].next = din
```

## always_comb()
組み合わせ回路を記述するデコレータ。

```python
    @always_comb
    def read():
        dout.next = mem[addr]
```

## always_seq()
順序回路を記述するデコレータ。

```python
def Inc(count, enable, clock, reset):
    @always_seq(clock.posedge, reset=reset)
    def incLogic():
        if enable:
            count.next = count + 1

    return incLogic
```
Rustで空いているポート番号を取得する

Rustで適当な空いているポートを取得したいことがあり、以下のように書いたらポート番号が取れて便利でした。

```rust
use std::io;
use std::net::TcpListener;

fn available_port() -> io::Result<u16> {
    match TcpListener::bind("localhost:0") {
        Ok(listener) => {
            listener.local_addr().unwrap().port()
        }
        Err(e) => Err(e)
    }
}

fn main() {
    println!("port: {}", available_port().unwrap());
}
```

`TcpListener::bind` の引数に `localhost:0` を渡すと、OSが空いているポートへの割り当てを要求するらしいので、それを使ってbindしてポート番号を取得してからそのリスナーをcloseすればそのポートが空くので空きポートが取れる、という寸法です。

実行する度に異なるポートが割り当てられています。

```sh
$ cargo run
     Running `target/debug/sample`
port: 59103
$ cargo run
     Running `target/debug/sample`
port: 62786
$ cargo run
     Running `target/debug/sample`
port: 62799
```

Hyperを使う場合は、Hyperは内部でTcpListenerを使っているので `localhost:0` を指定すれば同じように適当なポートでbindされます。

```rust
Server::http(hello).listen("localhost:0").unwrap();
```

# 参考リンク

- [TCPの空きポートをListenする](http://qiita.com/shiena/items/14016f3875a136ad0134)
- [Javaで空いているポート番号を取ってきたい](http://moznion.hatenadiary.com/entry/2014/11/29/222221)
- [std::net::TcpListener - Rust](https://doc.rust-lang.org/std/net/struct.TcpListener.html)
IE8で動作するJSフレームワークを検討

##**概要**

IE8でも動作するJSフレームワークを検討しました。**前提条件**は以下です。

###前提条件

1. **悲しいことにIE8をサポートしなければならない**
2. **JavaScriptフレームワークを導入することで開発コストが下がる**
3. **<a href="http://giolog.iij.ad.jp/2015/01/07/13902/" target="_blank">IE8のサポートは2016年1月12日に終了する</a>ため、それまでの運用となる**


##**Angular.js 1.2系**

* フルスタックなフレームワーク
* ひな形を使うとアプリケーションを構築するまでの手間が少ない
* 他の業務で使用しているため、使い慣れている
* 1.3系はIE8をサポートしないため、<a href="http://giolog.iij.ad.jp/2015/01/07/13902/" target="_blank">2016年1月12日にIE8のサポートが終了する</a>までの一時的な使用となる

### 課題

* サポートがなくなる
* 2.0系のことも考えると様子を見たい気持ちもある

### 参考

* <a href="https://docs.angularjs.org/guide/ie" target="_blank">AngularJS: Developer Guide: Internet Explorer Compatibility</a>

## **Backbone.js**

* IE7でも動作する。
* MVC
* APIたくさん使う時は活躍しそう
* <a href="http://www.cyokodog.net/blog/backbone-js/" target="_blank">Backbone.js ではじめるクライアントサイド MVC プログラミング</a>

### 課題
* （IE対応を抜きにして）同じMVCならAngular.jsでの開発ができればスキルセット的には十分なのではないか=>IEのためにBackbone.jsを学習する意味はあるのか

### 参考
* <a href="http://qiita.com/takuhito-h/items/15655309aef0889cfb62#1-3" target="_blank">angular・backbone・knockoutの比較／印象まとめ - Qiita</a>
* <a href="http://backbonejs.org/" target="_blank">Backbone.js｜公式</a>



## **Knockout.js**

* IE6でも動作する。
* Bindingに特化したフレームワーク
* 機能は少ないが、導入するのが容易
* jQueryだけでやるならKnockout.jsをいれたほうがよい、というレベル

### 課題
* Routerなど、フルスタックな機能がない
* Vue.jsよりもさらに自由度が高いので、設計が必要
* 2016/1以降に薄いフレームワークを使う時は、<a href="http://qiita.com/okmttdhr/items/58be840c3cc64c5ff460" target="_blank">Knockout.jsではなくVue.jsを使う</a>予定なので、IE対応でしか使うことがない

### 参考
* <a href="http://qiita.com/takuhito-h/items/15655309aef0889cfb62#1-4" target="_blank">angular・backbone・knockoutの比較／印象まとめ - Qiita</a>
* <a href="http://knockoutjs.com/documentation/browser-support.html" target="_blank">Knockout : Browser support</a>



## **~~React.js~~**

* ~~<a href="http://facebook.github.io/react/docs/working-with-the-browser.html#browser-support-and-polyfills" target="_blank">こちら</a>にあるPolyfillsを使用すればIE8にも対応可能。~~
    * =>**React.jsをIE8に対応させるPolyfillsのひとつである、<a href="https://github.com/es-shims/es5-shim/issues/249" target="_blank">es5-shimのissue</a>により、React.jsをIE8に対応するのは現状不可能、または、大きなコストがかかる。**
* JSXでComponent志向
* Not MVC But **Flux**
* 今後のためにも一度はやっておきたい
* <a href="http://qiita.com/icoxfog417/items/5d79b3336226aa51e30d" target="_blank">React.js 実戦投入への道 - Qiita</a>


### 参考
* <a href="http://d.hatena.ne.jp/ugon105/20150317/1426563848" target="_blank">おじさんがIE8でReact.jsを使うために頑張った話 - ugon105の日記</a>
* <a href="http://facebook.github.io/react/docs/working-with-the-browser.html#browser-support-and-polyfills" target="_blank">Working With the Browser | React</a>



## **まとめ**

結果、Angular.jsを使用するのが最もコストが低い、かつ効率的に開発ができると判断しました。ご意見お願い致します。
Vagrantで64bit OSが立ち上がらない


よくある話だが、備忘録と書いておく。

開発用のマシンが新しくなったので、旧マシンでつかっていた開発環境をpackageで書き出し、新環境で動かそうとすると、connection timeoutになって起動しない。

こういう場合の定石としてVagrantfileの以下の部分のコメントを解除してguiモードで起動したところ、VT-Xが有効ではない旨のメッセージが出た。

```
 # config.vm.provider "virtualbox" do |vb|
  #   # Don't boot with headless mode
  #   vb.gui = true
  #
  #   # Use VBoxManage to customize the VM. For example to change memory:
  #   vb.customize ["modifyvm", :id, "--memory", "1024"]
  # end
```

つまりBIOSで仮想化支援機能が有効になっていないのである。

よってBIOSで仮想化機能を有効にす。BIOSを設定する画面を表示するには、起動時に何かのキーを押し続ければいいのでけど、このキーが何なのかすぐにわからずちょっと難儀した。

今回新しく来たマシンはHP製なのでF10を押せばいいのだが、前のマシンのDELLはF2で、自宅の古いThinkPadはF1とメーカーによって異なる。最初はF2だろうと思ったら、システム検証ユーティリティの画面が表示され少し焦った。
Jekyllテンプレートの一覧表示処理。

## 投稿一覧
~~~ html
  {% for post in site.posts %}
    <li>&raquo; <a href="{{ BASE_PATH }}{{ post.url }}">{{ post.title }}</a></li>
  {% endfor %}
~~~

## カテゴリ別投稿一覧
~~~ html
    {% for category in site.categories %}
        <h3>{{ category | first }}</h3>
        <ul id="categories">
        {% for posts in category %}
            {% for post in posts %}
                <li><a href="{{ post.url }}">{{ post.title }}</a></li>
            {% endfor %}
        {% endfor %}
        </ul>
    {% endfor %}
~~~

## 固定ページ一覧
~~~ html
        {% for page in site.pages %}
          {% if page.layout == 'page' %}
          <a class="page-link" href="{{ page.url | prepend: site.baseurl }}">{{ page.link_title }}</a>
          {% endif %}
        {% endfor %}
~~~
親プロセス・子プロセス間通信


*個人的な授業のメモです*

##親プロセス·子プロセス間通信とは
####　`同じマシン上`での、`名前なしパイプ`を使った`プロセス間通信`のことである。

##### そもそもプロセス通信とはなにか？
　プロセス(処理)同士が情報のやりとりを行うための通信のこと。
　`クライアント・サーバー`という言葉をよく耳にすると思う。これも実は、`異なるマシン(コンピュータ)`同士の`プロセス間通信`の事を指している場合がほとんどだ。
	
　
##### 今回は同じマシン(コンピュター)同士が情報のやりとりを行う、`親プロセス・子プロセス間通信`を紹介する。


## C言語をつかって親子プロセス間通信のプログラムをつくる

以下の図の動きをするプログラムをつくる
![親子プロセス間通信](http://i.imgur.com/T1bIHBu.png)

##### プログラムの流れ
![名前なしパイプによるプロセス間通信](http://i.imgur.com/OwllFWF.png)

##### 実際のソースコード

```pipe1.c
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main() {
  pid_t pid;
  char buf[256];
  int pp[2];

  // (1)パイプの作成
  pipe(pp);

  pid = fork(); // (2)子プロセスの生成

  // 子プロセスの動き
  if (pid == 0) {
    close(pp[0]); // (3)読み込みディスクリプタを閉じる
    printf("Message To Parent : ");
    fgets(buf, 256, stdin);
    write(pp[1], buf, strlen(buf) + 1); // (4)パイプへの書き込み
    close(pp[1]);
  }
  // 親プロセスの動き
  else {
    close(pp[1]); // (3)書き込みディスクリプタを閉じる
    read(pp[0], buf, 256); // (4)パイプから読み込み
    printf("Message From Child : %s", buf);
    close(pp[0]);
  }

  return 0;
}

```
※エラー処理は省略

##### 実行結果

```Bash
Message To Parent : Hello World! ←子プロセスで文字列を入力
Message From Child : Hello World! ← 子プロセスから送られてきた文字列を親プロセスで出力
```

#### 無事、子プロセスから親プロセスへ文字列を送信することができた！

　ここでお気づきの人がいるかもしれない。パイプは一方通行だからこれだと親プロセスから子プロセスには文字列が送れないじゃないか、、、
しかし、パイプをもう1本増やすことで親プロセスから子プロセスへも文字列を送ることができる！

### パイプ2本の親子プロセス間通信
パイプを2本にする事で双方向のデータ送信が可能になる。
親子プロセス間で、クライアント・サーバーにみたてて以下の図をプログラムにする。

![親子プロセス間通信](http://i.imgur.com/J2PhrdD.png)

##### ソースコード

```pipe2.c
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
  pid_t pid ;
  char buffer[10], result[10];
  int pp[2], qq[2];
  int a , b, c;

  pipe(pp); // 親へデータを送るためのパイプ
  pipe(qq); // 計算結果を子に送るためのパイプ

  pid = fork();  // 親子のプロセスの生成

  // 子プロセスの動き
  if ( pid == 0 ) {
    close(pp[0]);
    close(qq[1]);

    // 1つ目の変数の代入とパイプへの書き込み
    printf("a = ");
    fgets(buffer, 10, stdin);
    write(pp[1], buffer, strlen(buffer)+1);

    // 2つ目の変数の代入とパイプへの書き込み
    printf("b = ");
    fgets(buffer, 10, stdin);
    write(pp[1], buffer, strlen(buffer)+1);

    // 計算結果を読み込む
    read(qq[0], result, 10);

    printf("a + b = %s\n", result);
    close(qq[0]);
    close(pp[1]);
  }
  // 親プロセスの動き
  else {
    close(qq[0]);
    close(pp[1]);

    // 1つ目の変数の読み込み
    read(pp[0], buffer, 256);
    a = atoi(buffer);

    // 2つ目の変数の読み込み
    read(pp[0], buffer, 256);
    b = atoi(buffer);

    c = a + b ; // 計算
    sprintf(buffer, "%d", c);

    // 計算結果をパイプへ書き込む
    write(qq[1], buffer, strlen(buffer)+1);

    close(pp[0]);
    close(qq[1]);
  }

  return 0;
}
```

##### 実行結果

```Bash
a = 5 ← 子プロセスで文字列を入力
b = 7 ← 子プロセスで文字列を入力
a + b = 12 ← 親プロセスでの計算結果を子プロセスが表示
```

#### 無事、親プロセスから子プロセスへ計算結果が帰ってきた！
　


### このようにC言語を使って親子プロセス間通信を確認することができる!
muninでunicornのプロセスの状態を確認しようとしたらPermission deniedになった

https://github.com/munin-monitoring/contrib/tree/master/plugins/unicorn

ここのプラグインを利用してunicornの状態を確認する為にしたこと　

- /etc/munin/plugin-conf.d/unicorn_ の設定

```
[unicorn_*]
env.rails_root RAILS_ROOT
user USER_NAME
group USER_NAME
```

ここのユーザ名を指定してなくてハマった。

- pidのPATHの修正

https://github.com/munin-monitoring/contrib/blob/master/plugins/unicorn/unicorn_memory_status#L21
https://github.com/munin-monitoring/contrib/blob/master/plugins/unicorn/unicorn_status#L21

以上
cocos2dx 2.2.3から2.2.6へ移行（Android Windows環境）

最近cocos2dxの習熟に集中しているのですが、
どうやらcocos2dxはiPhoneの64bit対応をしなければならないようで、
v2系は2.2.6から64bit対応らしく、移行が必須らしいです。

UI Editor系のソースがcocos2dx 2.2.3 になぜかなく（2.2にはある）、それも
含めて2.2.6にしてみました。

以下のサイトを参考にしました（ありがとうございます！）。

【cocos2d-x】v2.0.4からv2.2.6に一気に上げた際にやったことをメモ【iOS 64bit対応】 - Qiita 
http://qiita.com/kuuki_yomenaio/items/a8628ae8cdad2f644e9d
[Cocos2d-x] 2.2.3 で作ったプロジェクトを 2.2.6 で動くようにする - Qiita 
http://qiita.com/t2low/items/6db1928886bd483261aa
Cocos2d-x v3.2の開発環境を作ってみた
http://www.mnemonic.jp/shimodai/post-453/
【cocos2dx】v2.2.1からv2.2.6へバージョンをあげる | albatrus.com 
http://albatrus.com/main/cocos2d/7059

移行はまず以下の手順を経ます。

１・cocos2dx2.2.6をHDDにコピー
２・projectsの中身を2.2.3から2.2.6へコピー
３・eclipseのワークスペースをコピーして別の名前にする
一応前に動いていた環境は保存します。2.2.6環境はコピー先のワークスペースを使います。
ワークスペースはHDD上のフォルダをコピペ＆リネームでOKです。
３・新ワークスペースを開き、eclipseでlibcocos2dxプロジェクトを削除、2.2.6のを再インポート
４・同じくeclipseで制作プロジェクトも削除、2.2.6のprojectからインポート
５・eclipseのpreference>general>workspace>Linked Rresourcesで、参照しているライブラリを2.2.6にします。

で、コンパイルしますが、エラーが出ます。

* Cocos2dxActivity cannot be resolved to a type
* The import org.cocos2dx.lib cannot be resolved

いくつか、対処が日本のウェブ情報としてありますが自分の場合はうまくいかなくて、
以下のサイトの情報でうまくいきました。

Can't link to cocos2dx using eclipse for android on OSX - cocos2d-x / C   - Cocos2d-x Forum http://discuss.cocos2d-x.org/t/cant-link-to-cocos2dx-using-eclipse-for-android-on-osx/5149

Javaの参照先を追加する方法です。

それでエラーは消えますが、今度は実行時にエラー。

FATAL EXCEPTION: GLThread xxx
java.lang.IllegalArgumentException: No config chosen

これはcocos2dx導入初期にも見られたエラーですが、

プロジェクト名>src>プロジェクト名.java内を以下のように変えます。

```ja:project.java
    public Cocos2dxGLSurfaceView onCreateView() {
    	Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);
    	// xxx should create stencil buffer
//    	glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);
    	glSurfaceView.setEGLConfigChooser(8 , 8, 8, 8, 16, 0); // これに変える
    	
    	return glSurfaceView;
    }
```
こうすると実行できました。

ご参考まで。
Good luck!
ESXの情報取得

vsphereClient/vCenterで見られる情報を取得する方法。
ただし、ホスト内部でのコマンド(esxcli)ではなく、SOAP経由で外部から取得する方法。

公式のSDKとしてC#、java、perlがあるけれど、普段慣れてるrubyでやってみる。
実際はSOAPでやりとりしているので、生で書いてもいいけどgemがあったのでこれを利用。

ここではESX単体が対象だけれども、vCenterに同様の手法でアクセスすることも可能。
ただし、その際は複数のESXがvCenter配下に置かれているので、オブジェクトが配列のものは複数のESXの情報が返ってくることに注意。



#前準備
##SDK
ruby用SDKをインストール

```
gem install rbvmomi
```

モノはここ
https://github.com/vmware/rbvmomi


VMwareの人が書いてるようだけどこれって非公式なのかな？



##オブジェクトツリー
どんなオブジェクトがあるかはリファレンスから辿れる
5.5用
https://www.vmware.com/support/developer/converter-sdk/conv55_apireference/

4.1用
https://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/index.html


実際にどんな値が入っているかは実機を見た方が早いかも
https://[esx address]/mob/

ユーザ・パスワードは設定したやつで



##アクセス方法
SOAPを利用してオブジェクトを取得する。
githubにサンプルがあるけど、独特な部分もあるので概念の説明

ツリーのrootはそのまんま「ServiceInstance」

```
ServiceInstance -> ServiceContent -> rootFolder -> ...
```
という構成になっている。

```
ServiceInstance.CurrentTime
```
で今の時刻が返ってくるなど、対象のオブジェクトがメソッドを持ってるのがSOAPがSNMPやLDAPと違うところ。
メソッドとプロパティの概念はオブジェクト指向言語を触っていれば理解しやすいけれど、インフラ系のエンジニアにはとっつきにくいかもね。



#コード
##接続
```
require 'rbvmomi'
vim = RbVmomi::VIM.connect host: 'foo', user: 'bar', password: 'baz',  insecure: true
```
TLSの検証を無視するようにconnectに「insecure: true」を付与しておく


なお、SOAPの中身が必要であれば
```
debug: true
```
を追加するとSOAP(HTTP)の中身が得られる。
rubyが良きに計らってくれすぎて余計なオブジェクトを取得しているかどうかはこれを見ながらコードを修正するのが手っ取り早い。



##ホスト情報
ホストオブジェクト(hostSystem)が

```
ServiceInstance -> ServiceContent -> rootFolder - childEntity[0] -> hostFolder -> childEntity[0] -> host[0]
```
なので、
```
hostSystem = vim.root.childEntity[0].hostFolder.childEntity[0].host[0]
```

で、ホスト情報のオブジェクトまで到達

メモリとCPUの使用量は

```
hostSystem.summary.quickStats.overallMemoryUsage
hostSystem.summary.quickStats.overallCpuUsage
```

使用率は↓の実装量から計算

```
hostInfo.summary.hardware.cpuMhz
hostInfo.summary.hardware.numCpuThreads
hostInfo.summary.hardware.memorySize
```

※単位に注意


config情報、仮想ハード情報など必要なオブジェクトがあちこちにとっちらかってるので、探し出すのがちょっと大変かも。




##VM情報
サンプル

```
vms = vim.serviceContent.rootFolder.childEntity[0].hostFolder.childEntity[0].host[0].vm

vms.each do |vm|
  printf("%s: ", vm.name)
  if (vm.runtime.powerState == "poweredOn")
    printf("%d %d %d\n",
      vm.summary.quickStats.hostMemoryUsage,
      vm.summary.quickStats.guestMemoryUsage,
      vm.summary.quickStats.overallCpuUsage)
  else
    printf("power off\n")
  end
end
```

VM単位で探したいときは
```
vm = vim.serviceContent.rootFolder.childEntity[0].find_vm("vmName")
```
が簡単。




##カウンタ系
ネットワークやストレージなどのカウンタは直接取得できない。perfCounterオブジェクトを経由して取得する。




#その他
いろいろイジリ倒しながら悪戦苦闘してみたけれど、ドキュメントを探すよりirbやpry上でメソッドやプロパティを見ながら試行錯誤したほうが速い
```
vim.methods
```や

```
vim.serviceContent.rootFolder.childEntity[0].hostFolder.childEntity[0].host[0].methods
```
など。
少なくともオブジェクトのドキュメントもrdocは不親切=3
impressionist gemを使ってrailsでページビューをトラッキングする


impressionist のバージョンは1.5.1。rubyは2.2.2でRailsは4.2.1

# 導入方法

導入方法は[公式のReadme](https://github.com/charlotte-ruby/impressionist)を見れば分かる

- gem 'impressionist'
- rails g impressionist
- rake db:migrate

ちなみにrailsサーバの再起動が必要。
再起動しない場合、測定しようとしているページにアクセスした際に次のようなエラーメッセージが表示される

```
undefined local variable or method `is_impressionable' for UserController
```

# 本題

## 例えばユーザ詳細でトラッキングしたい

ユーザ詳細のページのビュー数をトラッキングしたいとする。URLは

http://example.com/users/:id

みたいな感じ。

また、閲覧者が二度も三度もリロードした際にビュー数を測定し直したくない。

そういう時は、まずControllerのshowメソッドを次のようにする

```ruby
def show
  @user = User.find(params[:id])
  impressionist(@user, nil, :unique => [:session_hash])

  @page_views = @user.impressionist_count
end  
```

Modelはメソッドis_impressionableを呼び出す。ここであｈ意味不明だが理由は後述

```ruby
class User < ActiveRecord::Base
  is_impressionable
end
```

あとはテンプレート側で表示したければする（例はerb）

```ruby
<%= number_with_delimiter(@page_views) %>
```

なぜModelであるUserにis_impressionableというメソッド呼び出しをする必要があるのかがすぐには分からなかったが、これは閲覧されたユーザを識別するため。

Controllerで呼び出しているimpressionistメソッドの第一引数に渡している@userがそれにあたる。

このis_impressionableメソッド呼び出しを追加しない場合、以下の様なエラーになる。
（例としてUserモデルをUsersControllerのshowメソッドで利用している）

```
NoMethodError in UsersController#show
undefined method `impressions' for #<User:0x007f9554b91d88>
```

処理の流れが分かりづらいので例とdbに作成されたimpressionsテーブル抜粋について記載する

動作

- user/1にFireFoxでアクセス
- user/1にFireFoxでもう一度アクセス（:unique => [:session_hash]があるので記録されない）
- user/2にSafariでアクセス

impressionsの内容

| impressionable_type | impressionable_id | session_hash|
|--------|--------|-------|
|  User    |   1    |e8223db5dacd807d1cb365f7293f94d7e53b714ec15b74a8422a61c053968307|
|  User    |    2   |a037e680be002ab5b62c9a5b00b18f4c71c4697c03fcc909f276bc630eb3e33e|


また、Controllerで@user.impressionist_countを利用しているがこれもModelでis_impressionableを利用するメリットの一つ。
Windowsの文字コードでハマった場合の対処方法


## はじめに
Windowsで日本語を含むパスを処理しているときにエラーが発生した。
文字コードはShift-JISを指定しているハズなのに、UnicodeDecodeErrorが発生。

WindowsってShift-JISじゃなかったのか?

## 対応方法
調べてみると、「WindowsはShift-JISを拡張したCP932」だとのこと。
なので、文字コードをCP932に指定したらすんなり動いた。

### サンプルコード
```:cp932_test.py
# -*- coding: utf-8 -*-

s = '①②③④'	# Shift-JISにはなく、CP932にある文字
su = unicode(s, 'utf-8')
print su.encode('cp932')
print su.encode('shift-jis')    # UnicodeEncodeErrorになる

```

## おわりに
WindowsのShift-JISは「CP932」ということを認識しましょう。
でないと、ドハマりしてしまいます。
cronでSeleniumを実行し画面をメール送信

## cron

```bash:crontab
19 16 * * * $HOME/cron/capture/main.sh
```

## シェル

```bash:$HOME/cron/capture/main.sh
#!/bin/sh
set -eu

export DISPLAY=:0

cd $HOME/cron/capture/
python work.selenium > /dev/null

for sc in moongift yahoo
do
  uuencode sc_${sc}.png sc_${sc}.png >> tmp.txt
done

cat tmp.txt | mail -s "from:myhome" hoge@fuga.com

rm -f tmp.txt
```

## selenium (python Webdriver)

```bash:$HOME/cron/capture/work.selenium
import os
from selenium import webdriver

def capture(strurl, filename):
    URL = strurl
    PNGNAME = "sc_" + filename + ".png"
    FILENAME = os.path.join(os.path.dirname(os.path.abspath(__file__)), PNGNAME)
    
    driver = webdriver.Firefox()
    driver.set_window_size(1024, 768)
    driver.get(URL)
    
    driver.save_screenshot(FILENAME)
    
    driver.quit()

if __name__ == "__main__":
    capture("http://moongift.jp","moongift")
    capture("http://yahoo.co.jp","yahoo")
```

## Javascriptを実行させたい場合

```bash:
driver.execute_script("window.print();")
```

というように呼ぶ。
アプリが終了している状態から、URLスキーマやPush通知経由でアプリを起動させる時のデバッグ方法 (Xcode6)


Xcodeのデバッグモードはアプリを終了させると終わってしまう。
なので、アプリが終了している状態からPush通知やURLスキーマ経由で起動させた時のデバッグをしようとしても一筋縄にはいかない。困った。

方法を探したら[stackoverflow](http://stackoverflow.com/questions/1239000/debugging-app-when-launched-by-push-notification)に答えがあったので、スクショを交えつつ備忘ログ。

# 「アプリを終了してもデバッグモードを維持する」のではなく「実行しても勝手に起動しないでおく」という考え方

どうやらこの考え方がキモらしい。アプリを終了させても "Finished runnning" にならない方法を探していたけど、この考え方が間違っていた。ビルドが成功しても勝手にアプリが起動されなければ、Push通知なり何なりから好きなように起動できる、というのが正解。

# 1. Edit Scheme　を開く
![スクリーンショット 2015-05-18 15.58.42.png](https://qiita-image-store.s3.amazonaws.com/222/18569/db3833f4-825d-9728-f916-0d0dca25ab47.png "スクリーンショット 2015-05-18 15.58.42.png")

# 2. Info タブの Wait for executable to be launched をチェックする
![kobito.1431932535.846723.png](https://qiita-image-store.s3.amazonaws.com/222/18569/e8871c45-cd69-f06f-64c7-bfc3066a1cbd.png "kobito.1431932535.846723.png")

# 3. 実行する
いつも通りビルドする。するとビルドが成功してもアプリは立ち上がらず、 `Waiting for HogehogeApp to launch` というステータスになる。

![kobito.1431932686.741961.png](https://qiita-image-store.s3.amazonaws.com/222/18569/4d44215e-d6eb-f5e9-7edb-5ed5eae08ebb.png "kobito.1431932686.741961.png")

ここの段階で端末を操作して、所望の方法でアプリを立ち上げればデバッグできる。
002 - Blocklyを使ったオリジナルVisual Programming Editorを作ってみる

# Blocklyから実際のソースコードを出力してみる
[公式ドキュメント](https://developers.google.com/blockly/installation/code-generators)によると、以下の言語が既に対応済みのようです。

* JavaScript
* Python
* Dart

ちなみにソースコードはblockly/generators以下にあるので、自分で他の言語への出力を作りたい場合はそこにジェネレータを書けば良さそうです。ひとまず今回は標準機能の確認をしていきます。

## 方法
ドキュメントにはあっさり一行、「どんな時でもこのコードを呼び出せばいいよ」とだけ書いてあります。そのためにはモジュールを一つ読み込む必要があります。

```html
<script src="javascript_compressed.js"></script>
```

その上で変換する関数を呼び出します。

```javascript
var code = Blockly.JavaScript.workspaceToCode(workspace);
```

つまり、ボタン押下時などのイベントハンドラで上記のコードを走らせるだけで良いようです。そして、DartやPythonを出力したい場合は、"javascript"となっている箇所を該当の言語のものに置き換えれば良いようです。ひとまずJavaScriptを出力するためにtableタグ内にボタンを置き、クリックイベントを設定します。

```html
<table>
  <tbody>
    <tr>
      <h1>おれおれエディター</h1>
    </tr>
    <tr>
      <button onclick="ShowCode()">出力</button>
    </tr>
    <tr>
      <td id="blocklyArea">Workspace</td>
    </tr>
  </tbody>
</table>
```

```js
function ShowCode(params) {
  var code = Blockly.JavaScript.workspaceToCode(workspace);
  alert(code);
}
```

これで、適当にブロックを並べた後にボタンを押すとダイアログボックスが表示され、出力されたコードが確認できるようになります。自前のジェネレーターを作る場合の道筋がぼんやりと見えてきましたね。

## リアルタイムでコードを出力
公式ページによると「コード生成は非常に高速なので頻繁に呼んでも大丈夫だよ～」とあるのでやってみます。Blocklyの更新イベントで呼び出してあげる事でリアルタイムでコードが確認できるようになるようです。まずは適当にtextareaを用意します。

```html
<textarea id="outputArea"></textarea>
```

次にBlocklyの更新通知イベントをハンドリングしてtextareaを更新します。

```js
function ShowCode(e)
{
  var code = Blockly.JavaScript.workspaceToCode(workspace);
  document.getElementById("outputArea").value = code;
}
// workspaceのリスナーへ登録を忘れずに
workspace.addChangeListener(ShowCodeRealTime);
```

これでブロックを配置したりする度にテキストエリアにソースコードが出力されます。

## 生成したJavaScriptを実行してみる
単純にeval()で評価してあげればJavaScriptがそのまま実行されますが[Googleはevalを使わない事を推奨しています](https://developers.google.com/blockly/installation/js-interpreter)。この辺はセキュリティリスクの観点で論争が起きるところではあるようですので個人の判断で実装ということで特に触れません。それに今回の最終目標はCのソースコードを出力するところなので…。

## まとめ
というわけで、標準で出力できる言語に関してはあっさりと出来てしまう事がわかりました。そして、どのあたりを作ればオレオレエディターが出来そうなのかも見えてきましたね。次回はいよいよカスタムブロックか、コードジェネレーターをいじってみたいと思います。
Cordova Pluginのテストフレームワーク(cordova-plugin-test-framework)の使い方


# Cordova Plugin Test Framework

https://github.com/apache/cordova-plugin-test-framework

## 何？
* Cordova Pluginのテストフレームワーク
* PluginのJSAPIを叩いて動作を確認することができる
* できるJasmine2を利用

## 試してみる

device pluginのテストを動かしてみる。
まずはプロジェクトにcordova-plugin-test-frameworkを入れます。

```shell-session:
$ cordova plugin add http://git-wip-us.apache.org/repos/asf/cordova-plugin-test-framework.git
```

次にdeviceプラグインとそのテストを入れます。
テストはpluginのtestsディレクトリに入っています。


```shell-session:
$ cordova plugin add add http://git-wip-us.apache.org/repos/asf/cordova-plugin-device.git
$ cordova plugin add http://git-wip-us.apache.org/repos/asf/cordova-plugin-device.git#:/tests
```

でconfig.xmlの<content>タグを

```xml:
<content src="cdvtests/index.html" />
```

に書き換えて、アプリを動かす。

以下の様な画面が表示されます。(下記はiOS)
![cordova-test1.png](https://qiita-image-store.s3.amazonaws.com/0/4044/9be83962-124e-f46d-401f-7cb820c3d86d.png "cordova-test1.png")

で、自動テストはAutoTestsの方を選択
![cordova-test2.png](https://qiita-image-store.s3.amazonaws.com/0/4044/d7995d41-8a02-cd34-022a-d5a2dac83813.png "cordova-test2.png")

Jasminでユニットテストが動作できているのが確認できます。
Manual Testsの方は

![cordova-test3.png](https://qiita-image-store.s3.amazonaws.com/0/4044/5b35ad6e-d4e4-4dd5-886d-989e5cedf960.png "cordova-test3.png")

となり、手動で操作するテストの画面が出てきます。

## テストの書き方

https://github.com/apache/cordova-plugin-device/blob/master/tests/tests.js
https://github.com/apache/cordova-plugin-camera/blob/master/tests/tests.js
を参照してマネして書いて欲しいのですが、

自動テストのほうは、

```js:tests.js
exports.defineAutoTests = function() {
    describe('test1', function() {
		it("should exist", function() {
			expect(window.foo).toBeDefined();
		})
    }
};
```

のようにdefineAutoTests内でJasmineの形式にのっとってテストを書いていけばよいです。

手動テストは

```js:tests.js
exports.defineManualTests = function(contentEl, createActionButton) {
	contentEl.innerHTML = '<div id="test"></div>';
	createActionButton('test', function() {
		//test contents
	}, "test");
};
```

のようにManualTestsにテストを書き加えていきます。

contentElのinnerHTMLでコンテンツを挿入し、
createActionButton にボタンのおしたときの振る舞いを記述できます。
createActionButtonの第３引数に指定したidの場所にボタンが表示されます。
CakePHPのTimeヘルパーで相対時刻を表示する

Twitterのように、日付時刻を『○分前』みたいな相対表示にしたい時、CakePHPではTimeヘルパーの`timeAgoInWords()`を使えば簡単にできます。

[Cookbook 2.x - TimeHelper](http://book.cakephp.org/2.0/en/core-libraries/helpers/time.html#TimeHelper::timeAgoInWords)

```php
echo $this->Time->timeAgoInWords($timestamp, array(
	'accuracy' => array(
		'hour' => "hour",
	),
	'format' => 'Y/m/d',
	'end' => '+1 day'
));
```

`end`でいつまで相対表示にするかを指定します。上記の例だと、1日(24時間)以上前のものは、`format`で指定した形式で表示されます。(デフォルトは`'+1 month'`)

`accuracy`は、どこまで細かく表示するかで、デフォルト値は

```php
array(
	'year' => "day",
	'month' => "day",
	'week' => "day",
	'day' => "hour",
	'hour' => "minute",
	'minute' => "minute",
	'second' => "second",
);
```

となっているので、適宜指定します。
上記のデフォルトのままだと、1週間以上のものは日単位まで(9 months, 2 weeks, 5 days ago等)、1日以上のものは時間単位まで、1時間以上のものは分単位まで表示されます。
最初の例だと、`'hour' => "hour"`と指定したので、1時間以上のものは時間単位まで(3 hours ago等)しか表示されません。

文字列の部分は、ソース見ると、`__d()`とか`__dn()`とかで書かれてるので、言語ファイルをちゃんと用意すれば、日本語でも出せると思います。(未確認)
pm2でプロセスを多重化しロードバランシングを行う

pm2でプロセスを多重化しロードバランシングを行う
===

## pm2のインストール

```sh
npm install pm2 -g
```

## pm2経由でアプリの起動

```sh
pm2 start pm2-bootstrap.json
```

```javascript:pm2-bootstrap.json
{
    "apps" : [
        {
            "name"        : "public-tutorial",
            "script"      : "./app.js",
            "instances"   : 2,
            "exec_mode"   : "fork_mode",
            "node_args"   : "--stack-size=10240000",
            "env"         : {
                "NODE_ENV": "localhost"
            }
        }
    ]
}
```

instance
: 起動するプロセス数を指定する

exec_mode
: fork_mode / cluster_mode
**クラスターモードはベータ版なので商用環境で使うなという警告文がでる**
Socket.IO を PM2 でロードバランシングしたい

Socket.IO を PM2 でロードバランシングしたい
===

## 目的
PM2を使って、Socket.IOのプロセスを多重化してロードバランシングする。

## 問題点
Socket.IOは接続情報をオンメモリに保存しているので、プロセスを多重化してロードバランシングを行うと、接続情報の無いプロセスに接続した場合には新規connectとなる。

## 解決策
Socket.IOの接続情報をredisに保存することにより、プロセス間はredis経由で接続情報を共有する。

## ただし！
Socket.IO 0.9系の接続しか成功しない。[^version]
Socket.IO 1.2系, 1.3系ではadapterを使うらしいが、公式[^1]のとおりに書いても動かない。
Node.jsのバージョンが0.12以上でなければならないという記載を見かけたが、0.12を使っても動かない。

## 提案
単一のポートでプロセスの多重化を行うことにこだわないのであれば、プロセス毎にポートを分けて、プロセス間で接続情報を共有する方法が確実である。
http://qiita.com/n0bisuke/items/c248af316ca3f27daf92

## Socket.IO 0.9系の書き方
```javascript:app.js
var server = app.listen(3000, function() {
	
});

//  0.9系のsocket.io
var io = require('socket.io').listen(server);

//  0.9系のredis
var redis = require('socket.io/lib/stores/redis');
var redisConf = { host: '127.0.0.1', port: 6379 };

// storeタイプをredisに変更
io.set('store', new redis({
    redisPub: redisConf,
    redisSub: redisConf,
    redisClient: redisConf
}));
```

## 情報を求む！

Socket.IO 1.2, 1.3系でPM2を使ったSocket.IOのロードバランシングに成功している人はバージョンを明記の上、記事を投稿して欲しい！

<hr/>

[^version]: ブログやQiitaにアップされている記事のほぼ全てで、どのバージョンを使った記事なのか明記されていなかった。Nodo.js界隈はバージョンアップが激しく、バージョンが変わると動かないことが多いので、バージョンを明記して欲しい。
[^1]: https://github.com/Automattic/socket.io-redis/blob/master/README.md
FuelphpのviewファイルをPC/モバイルによって振り分ける。

FuelphpのCoreクラスのViewを拡張する。

肝となるのが、`set_filename`メソッドでこれに設定された値に応じてviewファイルを決定する。

では早速拡張

ファイルの配置は以下のとおり
fuel
└app
│　└classes
│　　　└core　← フォルダ作成
│　　　　└view.php
├views
│　├common
│　├mobile
│　└pc
└bootstarp.php

## 実装

```php:view.php
class View extends \Fuel\Core\View {
    public function set_filename($file) {
	// $fileがcommonから始まるならば、commonフォルダからファイルを取得
	if(strpos($file, "common/") === 0) {
		
	} else {
　　　　　　//　エージェントがスマホだった場合 
			if ( Agent::is_smartphone() ) {
				$file = 'mobile/' . $file;
　　　　　　//　エージェントが上記以外だった場合
　　　　　　//　とりあえずPCとして扱う 
			} else {
				$file = 'pc/' . $file;			
		}
	}
             
        return parent::set_filename($file); 
    }           
}
```

ちなみに上記ファイルで`Agent::is_smartphone`を用いているが、実装は以下のリンクより。
http://btt.hatenablog.com/entry/2012/07/04/001254

Viewを拡張したので、`bootstrap.php`で設定を行います。

```php:bootstrap.php
// Autoloderに先ほどのViewを設定
Autoloader::add_classes(array(
	'View' => APPPATH.'classes/core/view.php',
));
```

## 使用方法

```php:test.php
<?php

class Controller_Test extends Controller {
    public function action_index() {
        // PCからのアクセスなら、「views/pc/test/index.php」
        // モバイルからのアクセスなら、「views/mobile/test/index.php」
        return Response::forge(View::forge('test/index'));
    }

    public function action_common() {
        // PCとモバイルで共通のファイルはこちら
        // 先頭にcommonをつけてアクセス
        return Response::forge(View::forge('common/test/index'));
    }

}
```

これで快適に振り分けが可能になります。
タブレットからの振り分けを行いたい場合はViewで分岐をしたらOKです。
Mac に waifu2x をインストールしようとして失敗した

画像の拡大とJPEGノイズ除去で話題の[waifu2x](https://github.com/nagadomi/waifu2x)を、Mac にインストールしてみようとしたけれどうまくいかなかったです。

* うまくいったら修正します
* うまくいった人コメントいただけるとありがたいです

### torch7 のインストール

```
curl -sk https://raw.githubusercontent.com/torch/ezinstall/master/install-deps | bash
git clone https://github.com/torch/distro.git ~/torch --recursive
cd ~/torch; ./install.sh
```

出てくるメッセージに従って、.bashrc / .bash_profile あたりに、登録してから実行。th コマンドが使えるようになる

### CUDA のインストール

```
brew cask install cuda
```

### waifu2x セットアップ

```
git clone https://github.com/nagadomi/waifu2x.git
cd waifu2x
luarocks install --local cudnn
find <画像ディレクトリ> -name "*.png" > data/image_list.txt
th convert_data.lua
```

残念ながらうまくいかなかった
----------------------------

```
/Users/.../torch/install/bin/luajit: .../torch/install/share/lua/5.1/trepl/init.lua:363: /tmp/luarocks_cutorch-scm-1-2376/cutorch/lib/THC/THCGeneral.c(9) : cuda runtime error : CUDA driver version is insufficient for CUDA runtime version at /tmp/luarocks_cutorch-scm-1-2376/cutorch/lib/THC/THCGeneral.c:237
stack traceback:
	[C]: in function 'error'
	.../torch/install/share/lua/5.1/trepl/init.lua:363: in function 'require'
	/Users/.../waifu2x/lib/settings.lua:2: in main chunk
	[C]: in function 'require'
	convert_data.lua:2: in main chunk
	[C]: in function 'dofile'
	.../torch/install/lib/luarocks/rocks/trepl/scm-1/bin/th:131: in main chunk
	[C]: at 0x010ee45310
```
Brightcove Player(NGP)で音量をデフォルトミュートにする方法

# Brightcove Playerとは
VideoJSのAPIやプラグインを拡張したプレイヤー
http://www.videojs.com/

Developer Docsはこちら
http://docs.brightcove.com/en/video-cloud/brightcove-player/index.html

# やりたいこと
プレイヤーロード後に音量をデフォルトミュートにしたい。

```
<script id="script" type="text/JavaScript">
        videojs("PlayerId").ready(function(){
        var player = this;
        player.muted(true);
});
</script>
```
Realm（Objective-C版をSwiftで使う）からRealmSwiftへの移行

メモです。RealmSwiftはiOS8以上でないと使えません。

```swift
// Realm
Tweet.allObjects() 
// RealmSwift
Realm().objects(Tweet)

// Realm
Tweet(forPrimaryKey: tweetId)
// RealmSwift
Realm().objectForPrimaryKey(Tweet.self, key: tweetId)

// Realm
realm.addOrUpdateObject(tweet)
// RealmSwift
realm.add(tweet, update: true)

// Realm
user.tweets.removeAllObjects()
// RealmSwift
realm.delete(user.tweets)

// Realm
user.tweets.addObject(newTweet)
// RealmSwift
user.tweets.append(newTweet) 

// Realm
if Int(tweets.indexOfObject(tweet)) == NSNotFound
// RealmSwift
tweets.indexOf(tweet) == nil

// Realm
realmToken = realm.addNotificationBlock { (note :String!, realm: RLMRealm!) -> Void in
    self.reloadData()
}
// RealmSwift
realmToken = realm.addNotificationBlock { notification, realm in
    self.reloadData()
}
```