OmniAICreator/Qiita-1.07M huggingface dataset:
composer:repositoriesでPEARパッケージをインストール

[Packagist]:https://packagist.org
[composer]:https://getcomposer.org
[PEAR]:http://pear.php.net
[pyrus]:http://pear2.php.net


※2017/02/17追記
以下の記事は既に実行できない状態です。
（思い出として残しておきますが）
いまではcomposer.jsonに指定のpearライブラリを書くだけでいけます。

```json:composer.json
{
  "require": {
    "pear/pear": "@dev",
    "pear/db": "@dev",
    "pear/log": "@dev"
  }
}
```
対象のパッケージについては以下を参照ください。
https://packagist.org/search/?q=pear

----

[PEAR]についてそれはそれは大量の記事を書いてきたのは今ではいい思い出。

関連記事:

 * [composer 経由で github からインストールする方法]
[composer 経由で github からインストールする方法]:http://qiita.com/dozo/items/20ff31816ff2b7d4b299

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

------------------- ↓ 余談はここから ↓-------------------

PHPのライブラリが全部[Packagist](composerのリポジトリサーバ)にあるとは思ってはいけない。
PHPのパッケージ管理は[PEAR]から[composer]に移ったとはいえ、
全部が全部移ったわけではなく、
すでに開発者が放置したものも数多くある。

ただ、それを使うがためだけに[PEAR]をインストールするのも大掛かりすぎるし、
PEAR2こと[pyrus]はあまりに使い物にならない。

じゃあ、[composer]で[PEAR]を使う方法を考えるかという流れ。
特に難しいことはない。

------------------- ↑ 余談はここまで ↑-------------------

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------

### インストール

PEAR::Logをインストールすることをサンプルにcomposer.jsonを記述する
composer.jsonのrepositoriesとrequireは以下のようになる

```composer.json
・・・
    "repositories": [
        {
            "type": "pear",
            "url": "http://pear.php.net"
        }
    ],
    "require": {
        "pear-pear.php.net/PEAR": "*@stable",
        "pear-pear.php.net/Log": "*@stable"
    },
・・・
```
この状態で以下を実行

```shell-session
$ php composer.phar update

```
### サンプル実行

では実際に使ってみよう。
composerを使うときは冒頭にautoloadをrequireする。
個別にrequire("Log")とかは不要で、
使うとき自動で該当するライブラリを探してrequireしてくれる。

```php
<?php

require_once("vendor/autoload.php"); 

$logger = Log::factory('console', '', 'TEST');
$logger->log('Logging to the console.');

```

ね！簡単でしょ！

------------------- ↑ 本題はここまで ↑-------------------

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

------------------- ↓ 補足はここから ↓-------------------

個人的にはcomposerは「composer.jsonを編集」という工程がわかりにくい原因だと思っている。
なのですべてコマンドラインでやった場合どうなるかを見てみよう。
例のごとくインストール作業から。
pearというディレクトリを作りそこにインストールしてみる。
composerコマンドを打つたびにcomposer.jsonが変化していくので、
わからなければ確認しながらやるといいだろう。

```shell-session
$ mkdir pear
$ cd pear
$ php -r "readfile('https://getcomposer.org/installer');" | php # composer.pharのダウンロード
$ php composer.phar init -n -s stable # composer.jsonの生成
$ php composer.phar config bin-dir "bin/" # binディレクトリの指定
$ php composer.phar config repositories.0 pear http://pear.php.net  # repositoriesにpearを登録
$ php composer.phar require "pear-pear.php.net/PEAR=*"  # PEARのインストール
$ php composer.phar require "pear-pear.php.net/Log=*"  # PEAR::Logの追加

```

ちなみに以下のようにリポジトリの配列名を指定すればリポジトリを追加できる

```shell-session
$ php composer.phar config repositories.1 pear http://pear2.php.net   # repositoriesにpear2を登録
```

もうpyrusはいらない。
proxmoxでBackup failed because of "empty device list"対応

ちょっと悩んだが解決した。

* [Backup failed because of "empty device list"](http://forum.proxmox.com/threads/16573-Backup-failed-because-of-quot-empty-device-list-quot)

![スクリーンショット 2014-11-04 5.14.06.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a847f1ec-a737-45fb-fe1d-84770f212d43.png)

`No backup`のチェックがついているものをbackupしようとした時に表示された。
言われてみればそうだ。
developmentでWEBrick起動のRailsはbindオプションでanyアクセスを受け付けるようになる

VirtualBox で起動した guest OS の Rails アプリにアクセスしようとしてハマったのですが development のデフォルト設定では localhost からのアクセスしか受け付けません(この場合もちろん guest OS にとっての localhost)。WEBRick だと bind オプションで binding IP Address を指定して host OS からアクセスできるようになります。

```bash
bundle exec rails s --bind=0.0.0.0
```

host only network 設定してある guest OS の Rails アプリに host OS からアクセスできなくて iptables を無効にしてるのになんで？と思いしばらく格闘していたのですが…一旦あきらめて JavaScript で遊んでて node で http-server を立ち上げてダメ元でアクセスしたらすんなりいけたもので気が付きました…なるほどこういうときは `netstat -an` で Local Address を調べるとよいのか。

```:指定なし
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 127.0.0.1:3000              0.0.0.0:*                   LISTEN
```

```:--bind=0.0.0.0
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 0.0.0.0:3000                0.0.0.0:*                   LISTEN
```

参考

* [Sinatraがデフォルトでは外部から繋がらなくなってたよ](http://qiita.com/u1_fukui/items/b86b21f6ed39f4c10d5d)
* [How to bind WEBrick to any IP address](http://smyck.net/2007/03/11/how-to-bind-webrick-to-any-ip-address/)
Jenkinsのキューに入っているビルドのキャンセル結果

以下を参考にしました。

"How to stop a build in Jenkins via the REST api ?"
http://stackoverflow.com/questions/21021905/how-to-stop-a-build-in-jenkins-via-the-rest-api

> If the build has not started, you have the queueItem, then POST on:
> `http://<Jenkins_URL>/queue/cancelItem?id=<queueItem>`

以下は `curl` で試してみた結果です。

```
$ curl -X POST -v 'http://ayweak:password@localhost:8080/queue/cancelItem?id=1'
* About to connect() to localhost port 8080
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 8080
* Server auth using Basic with user 'ayweak'
> POST /queue/cancelItem?id=1 HTTP/1.1
> Authorization: Basic YXl3ZWFrOnBhc3N3b3Jk
> User-Agent: curl/7.15.5 (i386-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
> Host: localhost:8080
> Accept: */*
> 
< HTTP/1.1 302 Found
< Location: http://localhost:8080/queue/
< Content-Length: 0
< Server: Jetty(winstone-2.8)
* Connection #0 to host localhost left intact
* Closing connection #0
```

指定した id のアイテムの有無に関係なく 302 が返ってきます。

キャンセルが間に合ったかどうかは続けて lastBuild を確認すれば良いのでしょうか。

* * *

追記です。

以下のようにジョブの REST API のページに説明がありました。

```
http://<Jeknins_URL>/job/<job_name>/api/
```

> Perform a build
> 
> To programmatically schedule a new build, post to this URL. If the build has parameters, post to this URL and provide the parameters as form data. Either way, the successful queueing will result in 201 status code with Location HTTP header pointing the URL of the item in the queue. By polling the api/xml sub-URL of the queue item, you can track the status of the queued task. Generally, the task will go through some state transitions, then eventually it becomes either cancelled (look for the "cancelled" boolean property), or gets executed (look for the "executable" property that typically points to the AbstractBuild object.)

キューアイテムの `cancelled` か `executable` の有無や値を確認することで、キャンセルの結果を判断できるようです。

以下のようにしてキューアイテムのデータを参照できました。

```
http://<Jenkins_URL>/queue/item/<id>/api/json?pretty=true
```

以下はキューに追加した状態です。`cancelled` と `executable` はありません。

```json
{
  "actions" : [
    {
      "parameters" : [
        {
          "name" : "param1",
          "value" : "7"
        }
      ]
    },
    {
      "causes" : [
        {
          "shortDescription" : "ユーザーJenkins Ayweakが実行",
          "userId" : "ayweak",
          "userName" : "Jenkins Ayweak"
        }
      ]
    }
  ],
  "blocked" : false,
  "buildable" : false,
  "id" : 7,
  "inQueueSince" : 1415119577407,
  "params" : "\nparam1=7",
  "stuck" : false,
  "task" : {
    "name" : "Test1",
    "url" : "http://<Jenkins_URL>/job/Test1/",
    "color" : "blue"
  },
  "url" : "queue/item/7/",
  "why" : "ビルド #27 は既に実行中です。 (予定時間:59 秒)",
  "timestamp" : 1415119582406
}
```

以下はキャンセルした場合です。`cancelled` は `true` に、`executable` は `null` になりました。

```json
{
  ... 省略 ...
  "cancelled" : true,
  "executable" : null
}
```

以下はビルドが開始された場合です。`cancelled` は `false` に、`executable` はビルドのデータが入りました。

```json
{
  ... 省略 ...
  "cancelled" : false,
  "executable" : {
    "number" : 21,
    "url" : "http://<Jenkins_URL>/job/Test1/21/"
  }
}
```
[WIP] どこに置くprivateなruby gem₍₍ (̨̡ ‾᷄⌂‾᷅)̧̢ ₎₎

:warning: 生煮えQiita記事です :warning: 

# 課題

rubygemsに公開したくないgem:sparkles::gem::sparkles:がある。
例えば、社外秘のドメインのためのgem(以後private gemと呼んだりする)や、フォークしてメンテナンスし続けているgemなど。
そういうgemをどこで公開するのがよいのだろうか。
公開する場所はもちろん、gemを開発するためのリポジトリやコードレビューのツールも欲しい。

# gem serverをたてる

RubyGems Guidesの[Run your own gem server](http://guides.rubygems.org/run-your-own-gem-server/)が参考になる。

## gem server

`gem server`でローカルのgemを公開することができる。

前述の[Run your own gem server](http://guides.rubygems.org/run-your-own-gem-server/)で紹介されている。

## [WIP] Gem in a Box
使ったことがないのであとで試したい
[geminabox/geminabox](https://github.com/geminabox/geminabox)

## [WIP] Gemfury
使ったことがないのであとで試したい
[Private Gem Server, npm Registry, PyPI Repository & more • Gemfury](https://gemfury.com/)

# Git
BundlerのGemfileで使うgemを記述する際`git`オプションを使うとGitリポジトリをgemとして使えるようになる。
開発用のGitリポジトリをそのまま公開して使えるのでポピュラーだと思う。

## GitHub

[GitHub · Build software better, together.](https://github.com/pricing)を見ると、一番安い個人用アカウントのmicro planだと$7〜で5つまでプライベートリポジトリが持てる。
次のような問題がある

- gem:sparkles::gem::sparkles:が大量にあるので1つ1つprivate repositoryを使うとお金が飛ぶ :money_with_wings: 
  - gemごとにブランチを切れば1つのリポジトリで無限に非公開gemがつくれる(例: [blockgiven/gems](https://github.com/blockgiven/gems))
    - ただし細かいアクセス制限ができない
    - 大量にブランチあると混乱する、プルリクが出しづらい、タグうつとき名前に困りそう
- 課金してもOrganizationプランのプラチナムだと125リポジトリまでしか持てない

## Secret Gist :secret:
[GistでGemを公開する](http://qiita.com/r7kamura/items/5e7d082d8e0d0471d71d)方法を使えばsecret gistで無料で無限に非公開gemがつくれる。
この場合次のような問題がある

- ForkできるがPull Requestが出せない:arrow_heading_down:
- URLが漏れると誰でも見れてしまう:free:
- 上記の問題のためsecret gist:secret:のgemを使っているリポジトリを外部に公開できない:ng:

## Bitbucket
[Bitbucket](https://bitbucket.org/plans)では無料で無制限のプライベートリポジトリが持てる。なので無料で無限に非公開gemがつくれる。
しかし次のような問題がある

- GitHubではない
- 無料プランでは:five:人チームまでしか使うことができない
  - 上位のプラン:moneybag:でも人数制限がある

## GitLab/GitBucket/etc...
オープンソースで開発されているGitHubクローンを使えば無料で無制限のプライベートリポジトリが持てる。レビューなどもできる。なので無料で無限に非公開gemがつくれる。
しかし次のような問題がある

- 無料ではない
  - サーバーの維持費
  - 人間が面倒を見る回数・時間の分だけ運用するのに費用がかかる
  - BitBucketの$200/month無制限と人件費を天秤にかけるとどちらが重いか⚖
Redmineのチケット作成、更新時のパラメータメモ

ログに書いてある内容を持ってきただけです。

以下は作成時のパラメータ。

```text
Processing by IssuesController#create as HTML
  Parameters: {
    "utf8"=>"✓",
    "authenticity_token"=>"abcdefghijklmnopqrstuvwxyz...",
    "issue"=>{
      "is_private"=>"0",
      "tracker_id"=>"1",
      "subject"=>"test",
      "description"=>"テスト",
      "status_id"=>"1",
      "priority_id"=>"2",
      "assigned_to_id"=>"7",
      "parent_issue_id"=>"",
      "start_date"=>"2014-11-03",
      "due_date"=>"",
      "estimated_hours"=>"",
      "done_ratio"=>"0",
      "custom_field_values"=>{
        "1"=>"abc",
        "2"=>"http://www.example.co.jp/"
      }
      "watcher_user_ids"=>["6", "7"]
    },
    "commit"=>"作成",
    "project_id"=>"test1"
  }
```

以下は更新時のパラメータ。

```text
Processing by IssuesController#update as HTML
  Parameters: {
    "utf8"=>"✓",
    "authenticity_token"=>"abcdefghijklmnopqrstuvwxyz...",
    "issue"=>{
      "is_private"=>"0",
      "tracker_id"=>"1",
      "subject"=>"test",
      "description"=>"テスト\r\ntest1",
      "status_id"=>"1",
      "priority_id"=>"2",
      "assigned_to_id"=>"6",
      "parent_issue_id"=>"",
      "start_date"=>"2014-11-03",
      "due_date"=>"",
      "estimated_hours"=>"",
      "done_ratio"=>"0",
      "custom_field_values"=>{
        "1"=>"abcxyz",
        "2"=>"http://www.example.co.jp/"
      },
      "notes"=>"あいうえお",
      "private_notes"=>"0",
      "lock_version"=>"0"
    },
    "time_entry"=>{
      "hours"=>"",
      "activity_id"=>"",
      "comments"=>""
    },
    "last_journal_id"=>"",
    "commit"=>"送信",
    "id"=>"8"
  }
```
Cocos2d-x の GLView を取得して addSubview とか

Cocos2d-x の iOS 版で ルートの GLView を取得して iOS ネイティブのビューを貼り付けたりする方法

Director から以下のようにして取得できます：

```cpp
UIView* rootView = (UIView*)Director::getInstance()->getOpenGLView()->getEAGLView();
```

これが取れさえすれば、あとは Objective-C のコードで好き勝手できます。たとえば Facebook SDK のログインビューを貼り付けたり。

（Objective-C++ を使うためソースファイルの拡張子を .mm にする必要があります。）

```cpp
UIView* rootView = (UIView*)Director::getInstance()->getOpenGLView()->getEAGLView();
FBLoginView* loginView = [[FBLoginView alloc] init];
loginView.center = CGPointMake(284, 50);
[rootView addSubview:loginView];
```
![Screen Shot 2014-11-04 at 2.15.49.png](https://qiita-image-store.s3.amazonaws.com/0/28313/2723a92a-60ce-12fd-fb77-28d2fcfe040b.png)
ibus-mozcで変換候補の位置が下の方に出てしまう場合の対策

Ubuntu14.10を導入していた時のメモ．

環境構築は基本的に僕の以前の記事のままです．
[ThinkPad T440sにUbuntu13.10をインストールしてからやったこと](http://qiita.com/ayihis@github/items/6604c191c7f6e3df4195)

#ibus-mozcの変換候補が変な位置に出てしまう問題

入力してる場所のすぐ下に出てほしいのに，画面の下の方とかに出てきて辛い

以下のパッケージをインストールして解決出来ました．

```zsh
sudo apt-get install ibus-gtk ibus-gtk3 ibus-qt4
```
Redmineプラグインのロードの順番を制御できない

Redmine 2.6.0 でプラグインのロード順を制御できません。

正確には 2 つのプラグインでフックの `:controller_issues_new_before_save` を使っていて、その実行順を制御できません。
必ずプラグイン名の順に実行されます。

試したのは以下のチケットで報告されている方法と同じでした。

"config.plugins setting does not works"
http://www.redmine.org/issues/12253

上記のチケットのコメントで

> config.plugins option is a Rails thing, it is not supposed to work for Redmine plugins.

だそうです。

Redmine のプラグインのロード処理をまったく理解していませんが、ソースコードを眺めると

http://www.redmine.org/projects/redmine/repository/entry/tags/2.6.0/config/initializers/30-redmine.rb#L19

```rb
Redmine::Plugin.load
```

でロードしていて、`Redmine::Plugin` では

http://www.redmine.org/projects/redmine/repository/entry/tags/2.6.0/lib/redmine/plugin.rb#L47

```rb
    self.directory = File.join(Rails.root, 'plugins')
```

でパスを追加していて、

http://www.redmine.org/projects/redmine/repository/entry/tags/2.6.0/lib/redmine/plugin.rb#L140

```rb
    def self.load
      Dir.glob(File.join(self.directory, '*')).sort.each do |directory|
      # 以下省略
```

で単純にソートしていて `config.plugins` は使っていないように見えます。

とりあえず `sort.each` を `sort.reverse.each` にしてみると実行順が逆になることはわかりました。
swiftとParseでアプリ内課金実装したメモ

アプリ内課金実装した際のメモ

* まずAppleのデベロッパーサイトに行って該当のIdentifiersにIn-App PurchaseがEnableになっているか確認。
https://developer.apple.com/account/ios/identifiers/bundle/bundleList.action
* * * 

* itunes connect > My app > App 内課金 > Create new で課金アイテムを作成
* * * 

* Parseのサイトに行ってサインイン > アプリを作成
https://www.parse.com
* * * 
* Install the SDKの指示に従い、SDKをダウンロード。指定されているライブラリをXCodeのGeneral > Linked Frameworks & Librariesから読み込む。
* * * 
* ダウンロードしたディレクトリに入っている下記3つのファイルをXcodeのプロジェクト内にドラッグ&ドロップで読み込む
Bolts.framework
Parse.framework
ParseFacebookUtils.framework
* * * 
* ヘッダファイル、<プロジェクト名>-Bridging-Header.hを作成し、下記のようにParseライブラリを読み込み、プロジェクト内に配置
`#import <Parse/Parse.h>`

* * *
* あとはメソッド二つ書くだけ


```lang:AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
        Parse.setApplicationId(<Your ApplicationId>, clientKey: <Your ClientKey>)
        PFPurchase.addObserverForProduct(<Item Id>, block: { (transaction: SKPaymentTransaction!) -> Void in
// Do Something
        })
        
        return true
    }
```

```lang:mainViewController.swift
PFPurchase.buyProduct(<Item Id>, block: { (error: NSError?) -> Void in
                    if error != nil {
                        // error!
                        return
                    }
                    println("You purchased awesome item!")
                })
```

* * *
**ハマったところ**
AdMobやらなんやらとぶつかって下記のようなエラーに悩まされた
http://stackoverflow.com/questions/15457136/parse-for-ios-errors-when-trying-to-run-the-app

**解決策**
Build Settings > Linking > Other Linker Flagで -ObjC と設定していたが、
-force_load $(SRCROOT)/GoogleMobileAdsSdkiOS-6.12.0/libGoogleAdMobAds.a
として個別に読み込むように変更した。
FacebookSDKをプロジェクトに追加した。

以上でうまく動くようになりました。

* * *
**参考**

*iOS Swift Tutorial: inApp Purchases - Setup and Integration*
https://www.youtube.com/watch?v=NMdVZ592ZZE
Elixir Functions with Guard Clauses

# Elixir Functions with Guard Clauses

## 概要
Elixir の Functions と Guard Clauses について。

Function の呼び出し時に、引数の型によって処理を分けたい場合、
Guard Clauses を利用します。

## サンプル

~~~
defmodule MultiModuleDouble do
  def double(x) when is_number(x) do
    x * 2
  end

  def double(x) when is_list(x) do
    x ++ x
  end

  def double(x) when is_binary(x) do
    try do
      double(String.to_integer(x))
    rescue
      e in ArgumentError -> x <> x
    end
  end
end

IO.inspect MultiModuleDouble.double(2)
IO.inspect MultiModuleDouble.double([1, 2, 3])
IO.inspect MultiModuleDouble.double("2")
IO.inspect MultiModuleDouble.double("a")
~~~

* 出力

~~~
4
[1, 2, 3, 1, 2, 3]
4
"aa"
~~~
Macで動画をアスキーアートに変換した話


下記のサイトを参考にしながら
http://qiita.com/asakasa/items/5fea615837191ab03cd8

```
brew install aalib
brew install libcaca
brew install mplayer --with-libcaca
```

でlibcacaと対応したmplayerをインストールします。
サイトでは

```
mplayer -vo aa   videofile
mplayer -vo caca videofile
```

とすればAA動画が再生できると書いてあるのですが、僕はここで詰まりました。
画面が真っ暗になってしまったのです。

探してみたところ、
http://helpful.knobs-dials.com/index.php/Aalib,_caca
にあるコマンド

```
mplayer -monitorpixelaspect 0.5 -nosub -contrast 25 -framedrop -vo aa -quiet  videofile  2>/dev/null
```

を試したところ動きました。


試した結果、`-quiet`オプションを加えれば良かったみたいです。
`mplayer -vo caca -quiet videofile`　とすれば無事動きました。

![スクリーンショット 2014-11-04 0.24.28.png](https://qiita-image-store.s3.amazonaws.com/0/53766/cc6ca9c4-c93a-5531-b2b1-89c54e9531d4.png)

`-quiet`オプションを調べてみると

http://www.areanine.gr.jp/~nyano/mplayer.html
>
 -quiet
 ターミナルへの無駄な出力を抑えて負荷を軽くする。ただし、MP3 再生時などの曲名表 示（ID3 タグ表示）は行われるが、現在の再生時間の表示等は行われなくなる。

とのことですので、コンソール上でのmplayer出力とlibcacaの映像出力(テキスト形式)が混ざって変になっていたのかもしれません。
(o1, o2) -> o1 - o2 なんて呪文はもうやめて！ - Java8でのComparatorの使い方

Java8といえばSteamAPIとラムダ式ばかりが注目されていて紹介記事もよく見かける。
そういった記事に出てくるサンプルの中では、ソートをこんな風に書いているものが多い。

```java:従来の比較処理をラムダ式に置き換えただけの書き方
persons.stream()
        .sorted((o1, o2) -> o2.getAge() - o1.getAge())
```

これは従来Comparatorインターフェースのcompare()で実装していたコードをそのままラムダ式に置き換えただけのあまり好ましくない書き方だ。

Java8ではComparatorインターフェースにいくつかのstaticメソッドとdefaultメソッドが追加されていて、これらを使うとComparatorを宣言的で明快な記述に変える事ができる。

```java:Comparatorの新規メソッドを使った書き方
import static java.util.Comparator.*;

persons.stream()
        .sorted(comparing(Person::getAge).reversed())
```

Comparatorの新しい使い方をちゃんと覚えて明快なソートが書けるようにしよう！

# 従来の書き方がダメな理由

- `o1 - o2`と`o2 - o1`、昇順ソートの呪文はどっちだっけ？
- 左辺と右辺で同じコード書くのってどうよ？
- 要素がnullだったらどうすんの？
- 要素のキーがnullだったらどうすんの？
- 複合ソートの場合は１つ目のキーを比較して、同じだったら２つ目のキーを比較して、２つ目も同じだったら...

例えばnullを考慮する場合、こんなコードを書く必要がある。

```java
if (o1 == null && o2 == null) return 0;
else if (o1 != null && o2 == null) return -1;
else if (o1 == null && o2 != null) return 1;
else o1 - o2;
```
上のコードを見て、nullは先頭になるのか末尾になるのかぱっと見では分からないよね？

今までに何百回もComparatorを実装してきたソート職人にとってこんな呪文はすぐに唱えられるかもしれないけど、一般庶民にとっては結構しんどいよね？

だけどJava8でComparatorに追加されたメソッドを使えば、誰でも簡単にComparatorを書けるようになる。

それではComparatorに追加されたメソッドを見てみよう。

尚、ここからのコードは全てComparatorをstaticインポートしているものとする。

```java
import static java.util.Comparator.*;
```

# 自然順/逆順ソート

`naturalOrder()`と`reverseOrder()`でそれぞれ自然順/逆順のComparatorが取得できるので、ソート対象がComparableを実装している場合はこれらを使用してソートできる。

```java:自然順ソート
list.sort(naturalOrder())
```
```java:逆順ソート
list.sort(reverseOrder())
```

これでもう`(o1, o2) -> o1 - o2`というお決まりの呪文とはオサラバできる。

# Comparatorを逆順にする

`comparator.reversed()`を使用すると既存のComparatorの逆順を取得できる。

```java:文字列の大文字小文字を区別せずに逆順ソートする
list.sort(String.CASE_INSENSITIVE_ORDER.reversed());
```

# nullを含んだソート

nullの要素を含むリストをソートする場合は、`nullsFirst()`と`nullsLast()`でnull要素を先頭または末尾にするComparatorが取得できる。
第一引数にはnull以外の要素の比較方法を指定する。

```java:nullを先頭、null以外を自然順ソート
list.sort(nullsFirst(naturalOrder()))
```
```java:nullを末尾、null以外を逆順ソート
list.sort(nullsLast(reverseOrder()))
```

# キーを指定したソート

ソート対象クラスがComparableを実装していない場合や、Comparableとは別のキーでソートしたい時には`comparing()`を使用する。
`comparing()`の第一引数はFunctionで、要素からキーを取り出す関数を指定する。

```java:Stringリストを文字列長の昇順でソート
list.sort(comparing(String::length))
```

Functionをラムダ式で書く事もできるが、Comparatorをラムダ式で書くときのように同じ式を２回書く必要はない。

```java:Stringリストを文字列長の昇順でソート
list.sort(comparing(x -> x.length()))
```

第二引数でComparatorを指定する事もできる。

```java:Stringリストを文字列長の降順でソート
list.sort(comparing(String::length, reverseOrder()))
```

# キーがnullの可能性がある場合のソート

`nulls***`と`comparing`を組み合わせて使う。

```java:Personリストを年齢でソート、年齢がnullの場合は末尾にする。
list.sort(comparing(Person::getAge, nullsLast(naturalOrder())))
```

# 複合ソート

複数のキーでソートするには`thenComparing()`を使用する。

```java:文字列リストを長さでソート、同じ長さなら文字列の逆順でソートする
list.sort(comparing(String::length).thenComparing(reverseOrder()))
```

# まとめ

今までの書き方では煩雑になる比較処理を、Comparatorに追加されたメソッドを使う事で宣言的でシンプルに書けるようになる事が分かったと思う。

宣言的なコードを書くメリットは

- 一時変数や制御文などを使わないので、バグが入り込む余地が小さくなる。
- 可読性が高く要求仕様をそのまま写したようなコードが書ける。

というのもあるので、Comparatorを使う際はぜひ新しい書き方を使ってほしい。
Redmineプラグインでチケットの作成、更新時に内容を書き換える試行

コントローラフックの `:controller_issues_new_before_save` と `:controller_issues_edit_before_save` を使用しました。

```rb:plugins/redmine_plugin_test1/lib/redmine_plugin_test1/hooks.rb
module PluginTest1
  class Hooks < Redmine::Hook::Listener
    def controller_issues_new_before_save(context={})
      issue = context[:issue]
      params = context[:params]
      issue.description << "\r\n"
      issue.description << params[:project_id]  # 番号ではなく識別子 (ここでは test1 が入っている)
      issue.description << "\r\n"
      issue.description << issue.inspect
      issue.custom_field_values.each do |cfv|
        if cfv.custom_field.name == 'カスタムフィールド' then  # カスタムフィールドを名前で特定
          cfv.value << 'xyz'
        end
      end
    end

    def controller_issues_edit_before_save(context={})
      issue = context[:issue]
      params = context[:params]
      issue.notes << "\r\n"
      issue.notes << params[:issue][:notes]
      issue.custom_field_values.each do |cfv|
        if cfv.custom_field.name == 'かすたむふぃーるど' then  # カスタムフィールドを名前で特定
          cfv.value = 'https://www.google.co.jp/'
        end
      end
    end
  end
end
```

上記の処理でとりあえず書き換えできて、通知メールの内容も書き換え後のものになりました。

以下は作成時の通知メール。

```text
Issue #10 has been reported by Redmine Ayweak.

----------------------------------------
バグ #10: test
http://localhost:3000/issues/10

* Author: Redmine Ayweak
* Status: 新規
* Priority: 通常
* Assignee: 
* Category: 
* Target version: 
* カスタムフィールド: xyz
* かすたむふぃーるど: http://www.example.co.jp/
----------------------------------------
テスト
test1
#<Issue id: nil, tracker_id: 1, project_id: 1, subject: "test", description: "テスト\r\ntest1\r\n", due_date: nil, category_id: nil, status_id: 1, assigned_to_id: nil, priority_id: 2, fixed_version_id: nil, author_id: 5, lock_version: 0, created_on: nil, updated_on: nil, start_date: "2014-11-03", done_ratio: 0, estimated_hours: nil, parent_id: nil, root_id: nil, lft: nil, rgt: nil, is_private: false, closed_on: nil>
```

以下は更新時の通知メール。

```text
Issue #10 has been updated by Redmine Ayweak.

かすたむふぃーるど changed from http://www.example.co.jp/ to https://www.google.co.jp/

あいうえお
あいうえお


----------------------------------------
バグ #10: test
http://localhost:3000/issues/10#change-6

* Author: Redmine Ayweak
* Status: 新規
* Priority: 通常
* Assignee: 
* Category: 
* Target version: 
* カスタムフィールド: xyz
* かすたむふぃーるど: https://www.google.co.jp/
----------------------------------------
テスト
test1
#<Issue id: nil, tracker_id: 1, project_id: 1, subject: "test", description: "テスト\r\ntest1\r\n", due_date: nil, category_id: nil, status_id: 1, assigned_to_id: nil, priority_id: 2, fixed_version_id: nil, author_id: 5, lock_version: 0, created_on: nil, updated_on: nil, start_date: "2014-11-03", done_ratio: 0, estimated_hours: nil, parent_id: nil, root_id: nil, lft: nil, rgt: nil, is_private: false, closed_on: nil>
```
Vagrant + docker + Parallelsを試す



# Vagrantのダウンロード

以下からダウンロードできるのでこれをダウンロードしてインストールする。
https://www.vagrantup.com/downloads.html


念のために、以下のコマンドでVersionを確認。

```
$ vagrant version                                                          [~/Develop/vagrant]
Installed Version: 1.6.5
Latest Version: 1.6.5

You're running an up-to-date version of Vagrant!
```

引き続き、```Parallels```用のPluginをインストールする

```
$ vagrant plugin install vagrant-parallels
```

# dockerクライアントのインストール

brewを使ってインストールできるので、以下のコマンドで入れる。

```
$ brew install docker
```

# boot2dockerの環境を作成する

以下のコマンドで、```boot2docker```用の```Vagrantfile```が作成される

```
$ vagrant init parallels/boot2docker
```

直下に作成されるので任意のフォルダで実行することをおすすめする


# 起動

以下のコマンドで起動できる。

```
$ vagrant up --provider parallels
```

そして、以下のコマンドで```DOCKER_HOST```を指定してやり、```Docker```のコマンドから接続する

```
$ export DOCKER_HOST="tcp://`vagrant ssh-config | sed -n "s/[ ]*HostName[ ]*//gp"`:2375"
```

以下でクライアントから、サーバーに接続できていることが確認できた。

```
$ docker version
Client version: 1.3.1
Client API version: 1.15
Go version (client): go1.3.3
Git commit (client): 4e9bbfa
OS/Arch (client): darwin/amd64
Server version: 1.3.1
Server API version: 1.15
Go version (server): go1.3.3
Git commit (server): 4e9bbfa
```
YosemiteでIntelliJを起動するためにJava SE 6が必要だと言われた時の対処法

![Screen Shot 2014-11-03 at 11.23.25 PM.png](https://qiita-image-store.s3.amazonaws.com/0/5559/0c31c8e7-daef-8feb-bdb4-2c20fee9a25e.png)

上の画像のようになったらApple JDK 1.6をダウンロードすれば問題解決。

Apple JDK 1.6 download: http://support.apple.com/kb/DL1572

## 参照リンク

- [IDE doesn't start after updating to Mac OS Yosemite or Mavericks](https://intellij-support.jetbrains.com/entries/27854363-IDE-doesn-t-start-after-updating-to-Mac-OS-Yosemite-or-Mavericks)
コマンドのhistoryログ数を増やす

コマンドのhistory数が多いと、Ctrl+rでコマンドログを検索したときに便利なので、保存されるhistory数を増やしました。環境はMacです。

# history数を増やす
bash_profileにhistory数を設定しました。

```bash:history数を増やす
vi ~/.bash_profile

# historyの数を50000に指定
HISTSIZE=50000
```
試しに50000件にしてみました。

# bash_profileを読み込み

```bash:bash_profileを読み込み
source ~/.bash_profile
```
これでhistoryの検索がやりやすくなりました。

# おまけ
聞いたところによると、Emacsが好きな人はHISTORYを増やして検索する傾向があって、vimが好きな人はエイリアスなどでコマンドタイプ数を減らす傾向があるそうです。そうなんですか？知らなかった(☝ ՞ਊ ՞)
4インチの画面に配置したオブジェクトを、AutoLayoutでiPhone6に対応する一番簡単な方法


前提。ストーリーボード使用。SizeClasses解除。

長いので3行で。

1.PINメニューでWidthとHeightをチェックマークを選択
2.Alignメニューで、Horizontal Center,Vertical Centerをチェックマークを選択
3.UtilityのLayout Constraints で、Constantから、use Canvas valueを選択。

こんだけ。

細かい詳細の確認と画像による解説は、ぜひ私のサイトからどうぞ。

http://adl.jpn.com/?p=320
勉強会運営で用意する物品の一覧

#はじめに
IT界隈では、有志の勉強会がよく開かれます。
IT勉強会の代表的な形式がセミナー型で、技術に関する知見を発表しあい、質問・意見を共有するものです。
セミナー型のIT勉強会を開催する時に、事前に用意する物品の一覧を書きます。

#勉強会向けの物品一覧
##必須
 * 筆記用具・参加者一覧  
　←参加者の出欠を管理する。
 * お金を入れる箱・袋  
　←参加費や懇親会のカンパを入れる。
 * お釣り（1000円札・500円玉）  
　←参加費のお釣りに使う。
 * 名刺  
　←会場をご提供頂いた企業様や参加者の方へお渡しする。
 * ノートPC・携帯電話  
　←参加者との連絡に使う。

##推奨
 * お菓子・飲み物・紙コップ  
　←参加者間の交流を助ける。又、参加者が発表に集中できるようになる。※飲食の可否は事前確認必須
 * ホワイトボード（小型）・マジック・ホワイトボードイレーザー  
　←会場案内や参加受付の看板に使える。他にもワークショップで活用できる。
 * 名札・ネームペン  
　←参加者間の交流を助ける。
 * 付箋紙・ボールペン  
　←ワークショップに使える。イベントの改善点を書いてもらい、ホワイトボードに貼り付けておくアプローチを見た。
 * メモ用紙・メモ用紙を入れる箱・ボールペン  
　←アンケートに使える。又、発表の感想・質問を随時書いて貰い、発表後に紹介するアプローチで使った。
 * 胃痛・下痢対策の薬  
　←最初は緊張するので、用意しておくと安心できる。
 * タオル  
　←雨の日に濡れている参加者へ貸す。 
 * [sekicoco イベント座席表サービス「セキココ」](http://sekico.co/)  
　←インターネット上で座席表を作るサービス。参加者間の交流を助ける。

#懇親会向けの物品一覧
##必須
 * お酒・つまみ  
　←参加者間の交流を助ける。※飲酒の可否は事前確認必須
 * 割り箸・紙皿・紙コップ  
　←懇親会参加者の数よりも多めに買っておきましょう。
 * ウェットティッシュ  
　←手や机を拭くために使う。
 * ゴミ袋・ガムテープ  
　←ゴミ袋をガムテープで机の横に貼り付けます。燃えるゴミと缶瓶は分別しましょう。

##推奨
 * バケツ（小型）    
　←飲み残しを入れる。
 * 雑巾  
　←床を拭く。
 * ホウキ・ちり取り（小型）  
　←床を掃く。
 * 酔い止めの薬  
　←後片付けの指揮を取る為、あまり酔えない。

#関連ページ
* [勉強会運営の事前作業一覧](http://qiita.com/nezuq/items/2baca138da93ede60186)
* [勉強会運営の当日作業一覧](http://qiita.com/nezuq/items/ccc8a47d69b726b128e4)


#本記事のライセンス
![by.png](https://qiita-image-store.s3.amazonaws.com/0/38787/58988831-a30c-99ac-d80d-a25c0c674766.png)
rails consoleを再読み込みしたい

rails consoleを再読み込みしたい場合、reload!を使います。

```bash:reload!で再読み込み
rails c # rails consoleを起動　

# コードやデータなどを変更

reload!  # 再読み込み
```
これで最新のモデルデータが読み込まれます。

rails consoleを立ち上げている最中に、モデルの値をGUIから変更した場合、consoleへは即時反映されないです。そのため、値を変更した場合、その度にrails consoleを一旦抜けて再起動をしていました。

再起動なんてしなくていいんですね(;´д｀)
【イラレ・フォトショ】CCの新機能、「ライブラリ」を使ってみたメモ

イラレとphotoshop間で素材の共有が楽になると聞き、早速試してみた。。凄い便利そうだけど、チュートリアル動画であるような夢のようなことにはなってないような。。同期に時間がかかる＋RGBで共有したいのになぜかCMYKになってるとか。。

色々問題はありますが、スマホとも連携できるらしく、
私は手書きのイラストを今まで以下のような手順でベクター化していました。

①紙に絵を描く→②スキャンorカメラ撮影してdropboxなどに放り込む③イラストをイラレで開いてライブとレース

が、このライブラリ機能をつかえば、スマホで撮影してライブとレースしてライブラリに同期するところまでやってくれるので、②③の行程がなくなるようです。素敵！

ライブラリのチュートリアルはこちら
https://helpx.adobe.com/jp/illustrator/how-to/illustrator-creative-cloud-libraries.html
<hr>
![スクリーンショット 2014-11-03 22.53.58.png](https://qiita-image-store.s3.amazonaws.com/0/38077/309a70e5-629f-a485-b9aa-d712adcf9e24.png)
![スクリーンショット 2014-11-03 22.54.20.png](https://qiita-image-store.s3.amazonaws.com/0/38077/25fa8b40-8da9-7759-7e6c-70c3531a4cd3.png)
![スクリーンショット 2014-11-03 22.54.51.png](https://qiita-image-store.s3.amazonaws.com/0/38077/6611d693-7018-d247-2b5c-da804dfd3b4b.png)
どこかで心の叫びが聞こえた気がするので Brainf*ck の派生言語作成ツール orenono gem で「ホモ言語」を作ってみる

# どこかで心の叫びが聞こえた気がするので Brainf*ck の派生言語作成ツール orenono gem で「ホモ言語」を作ってみる

## 概要
どこかで心の叫びが聞こえた気がするので Brainf*ck の派生言語作成ツール orenono gem で「ホモ言語」を作ってみます。
どこかの心の叫びとはちょっと仕様が異なるけどご了承ください。

orenono gem については下記記事参照。
[Ruby で Brainf*ck の派生言語を作成するための gem 『orenono』を作成してみた](http://qiita.com/tbpgr/items/9d68fdb0d0e7bbccdd2c)

## 前提

orenono gem をインストール済み

## 文法定義

orenono init で Orenonofile を生成し、中身を編集して文法を定義します。

* Orenonofile を生成する

~~~bash
$ orenono i
$ ls Orenonofile
Orenonofile
~~~

* Orenonofile を編集する

~~~
# encoding: utf-8

increment "ホモ"
decrement "ノンケ"
start_loop "やらないか？"
end_loop "もうおわりかい？"
next_cursol "筋肉"
previous_cursol "贅肉"
display "アーッ！"
read "菊"
~~~

## ホモ言語 プログラム

~~~text:hello_world.homo
ホモホモホモホモホモ
ホモホモホモホモ
やらないか？
	筋肉
		ホモホモホモホモホモ
		ホモホモホモ

	筋肉
		ホモホモホモホモホモ
		ホモホモホモホモホモ
		ホモ

	筋肉
		ホモホモホモホモホモ
	贅肉
	贅肉
	贅肉
		ノンケ
もうおわりかい？

筋肉
	アーッ！ # => H
筋肉
	ホモホモ
		アーッ！ # => e
	ホモホモホモホモホモ
	ホモホモ
		アーッ！ # => l
		アーッ！ # => l
	ホモホモホモ
		アーッ！ # => o
筋肉
	ノンケ
		アーッ！ # => ,
	ノンケノンケノンケノンケノンケ
	ノンケノンケノンケノンケノンケ
	ノンケノンケ
		アーッ！ # => space
贅肉
	ホモホモホモホモホモ
	ホモホモホモ
		アーッ！ # => w
	ノンケノンケノンケノンケノンケ
	ノンケノンケノンケ
		アーッ！ # => o
	ホモホモホモ
		アーッ！ # => r
	ノンケノンケノンケノンケノンケ
	ノンケ
		アーッ！ # => l
	ノンケノンケノンケノンケノンケ
	ノンケノンケノンケ
		アーッ！ # => d
	筋肉
	ホモ
		アーッ！ # => !
~~~

* インデントは読みやすさのために追加しているだけで、処理には不要です。
* 8つの用語以外は無視されるので、コメント扱いになっています。 ` #=> H` などはコメント。

## 実行結果

~~~bash
$ orenono e hello_world.homo
Hello, world!
~~~

## 参考
サンプルと等価な Brainf*ck のソースコード

~~~
+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.
------------.<++++++++.--------.+++.------.--------.>+.
~~~

### orenonoスライドショー
http://tbpgr.github.io/orenono_slide/#/

## 参照
* [Ruby で Brainf*ck の派生言語を作成するための gem 『orenono』を作成してみた](http://qiita.com/tbpgr/items/9d68fdb0d0e7bbccdd2c)
* [orenono gem GitHub](https://github.com/tbpgr/orenono)
* [orenono gem RubyGems](http://rubygems.org/gems/orenono)
SwiftでTinderUIのプロトタイプ


ライブラリとして、[modocache/MDCSwipeToChoose](https://github.com/modocache/MDCSwipeToChoose)を使う。

## 環境
- Xcode 6.1
- cocoapods v0.34.4
- MDCSwipeToChoose v0.2.1

MDCSwipeToChooseを`pod install`。

## 準備
Bridging Headerを作成して、XcodeのBuild Settingの方にも設定。

```objectivec:Test-Bridging-Header
#import <UIKit/UIKit.h>
#import <MDCSwipeToChoose/MDCSwipeToChoose.h>
```

2行目だけが必要かと思っていたら、1行目も必要で最初分からなかった。

参考: https://github.com/modocache/MDCSwipeToChoose/issues/23

## 実装
ビューとかは適当なのであしからず。。

`MDCSwipeToChooseDelegate`を継承したViewControllerを作成。
あとは、[README](https://github.com/modocache/MDCSwipeToChoose/blob/master/README.md)で説明してあるのに習って書いていく。(Swiftに書き直すのが個人的には難しい。。)

```swift:ViewController.swift
import UIKit

class SwipeViewController: UIViewController, MDCSwipeToChooseDelegate {
    var swipeCount = 0
    var photoURL = [
        "http://up.gc-img.net/post_img_web/2013/03/a3a43755438b42d881929eefc7161191_0.jpeg",
        "http://pic.prepics-cdn.com/pib1298076039/5731792_218x291.gif",
        "http://omosoku.com/wp-content/uploads/misawa-225x300.gif"
    ]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let swipeView1 = createSwipeView(photoURL[0])
        self.view.addSubview(swipeView1)
        
        let swipeView2 = createSwipeView(photoURL[1])
        self.view.insertSubview(swipeView2, belowSubview: swipeView1)
        
        let swipeView3 = createSwipeView(photoURL[2])
        self.view.insertSubview(swipeView3, belowSubview: swipeView2)
    }
    
    func createSwipeView(url: String) -> UIView {
        let options = MDCSwipeToChooseViewOptions()
        options.delegate = self
        options.likedText = "Like"
        options.likedColor = UIColor.greenColor()
        options.nopeText = "Later"
        options.nopeColor = UIColor.lightGrayColor()
        
        let swipeView = MDCSwipeToChooseView(
            frame: CGRect(
                x: 0,
                y: 100,
                width: self.view.bounds.size.width,
                height: self.view.bounds.size.height - 300
            ),
            options: options
        )
        let imageURL = NSURL(string: url)
        swipeView.imageView.image = UIImage(data: NSData(contentsOfURL: imageURL!)!)
        
        return swipeView
    }
        
    func view(view: UIView!, wasChosenWithDirection direction: MDCSwipeDirection) {
        if (direction == MDCSwipeDirection.Left) {
            println("Later")
        } else {
            println("Like")
        }
        swipeCount++
    }
}
```

これで、適当な大きさのミサワの画像が3枚スワイプできるだけの超簡易Tinder UIができた。。。

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/1795/fd483a89-c116-2dd2-7888-58f4fd981873.gif "test.gif")
Ruby の モジュール(Module)

## 用途
クラスにメソッドを追加する。

## 特徴

* モジュールはインスタンス化できない。
* モジュールは何かのクラスを継承できない。

## 書き方

```rb
module Hoge
  
  def hello
    p "Hello"
  end

end
```

## モジュールの読み込み

#### include モジュール名

モジュールのメソッドをインスタンスメソッドとして取り込む。

```rb
class Fuga
  include Hoge
end

Fuga.new.hello
``` 
=> "Hello"

#### extend モジュール名
モジュールのメソッドをクラスメソッドとして取り込む。

```rb
class Fuga
  extend Hoge
end

Fuga.hello
``` 
=> "Hello"

## モジュール関数
モジュールに定義されているメソッドを、モジュールから直接呼び出せるようにする。

`module_function`の引数にメソッド名が指定された場合はそのメソッドが、指定されなければそれ以降に定義されたメソッドがモジュール関数となる。

```rb
module Hoge

  def hello
    p "Hello"
  end

  module_function :hello

end

Hoge.hello
```
=> "Hello"
Canvasをポップアップでプレビュー表示する

Canvasにマウスカーソルを合わせた際にポップアップで拡大して表示する手順。
Popupでポップアップを表示、VisualBrushでCanvasの内容を表示させる。
VisualBrushのStrechをUniformにすることで親要素のサイズで拡大・縮小表示ができる。

```XAML:MainWindow.xaml
<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Canvas x:Name="test" HorizontalAlignment="Left" Height="225" Width="300" Background="AliceBlue">
            <TextBlock>
                写真<LineBreak/>
                マウスカーソルで拡大
            </TextBlock>
            <Image Name="image1" Source="C:\Users\hoge\Pictures\cat.jpg" Width="140" Height="210" Canvas.Left="150" Canvas.Top="5" MouseEnter="Image_MouseEnter" MouseLeave="Image_MouseLeave"/>
        </Canvas>
        <Popup Name="popup" PopupAnimation="Fade" Placement="MousePoint">
            <Rectangle Width="900" Height="675">
                <Rectangle.Fill>
                    <VisualBrush x:Name="visualBrush" Stretch="Uniform" Visual="{Binding ElementName=test}" />
                </Rectangle.Fill>
            </Rectangle>
        </Popup>
    </Grid>
</Window>
```

画像を選択してすぐ離した場合にポップアップが表示されないようにSleepで0.5秒待ってから表示するようにした。
MouseHoverというイベントがあるらしいがやり方は確認中。

```C#:MainWindows.xaml.cs
using System.Windows;
using System.Windows.Input;

namespace WpfApplication3
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Image_MouseEnter(object sender, MouseEventArgs e)
        {
            //プレビュー表示まで0.5秒待つ
            System.Threading.Thread.Sleep(500);
			//ポップアップ表示
            popup.IsOpen = true;
        }

        private void Image_MouseLeave(object sender, MouseEventArgs e)
        {
			//ポップアップ非表示
            popup.IsOpen = false;
        }
    }
}

```
Guzzle3でgetしたりputしたりする


前回の、[Guzzle3でResource Owner Password Credentials Grantでトークンを取得する](http://mapyo.hatenablog.com/entry/2014/11/02/Guzzle3%E3%81%A7Resource_Owner_Password_Credentials_Grant%E3%81%A7%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B)の続きです。

前回はアクセストークンを取得する所まで終わった。
今回は、トークンを使ってgetしたり、putしたりする事にする。


以下のような感じで書けます。

```php
<?php
require 'vendor/autoload.php';
 
use Guzzle\Http\Client;
 
$settings = parse_ini_file('config/settings.ini');
 
$client = new Client($settings['base_url']);
$client->setDefaultOption('headers',
    array(
        'Content-Type' => 'application/json',
        'Authorization' => "Bearer ${settings['token']}",
    )
);
 
# get
$response = $client->get(
    $settings['api_path'],
    null # header だが、setDefaultOptionで既に設定している。
)->send()->json();
 
var_dump($response);
 
# 金額を+100円する
$response['product']['price'] += 100;
 
$response = $client->put(
    $settings['api_path'],
    null, # header だが、setDefaultOptionで既に設定している。
    json_encode($response)
)->send()->json();
 
var_dump($response);
```


https://gist.github.com/mapyo/02cdbf68d050334a8369



githubに動くやつを上げてます。
https://github.com/mapyo/php-client-sample/tree/0.1.2


## 所感
なんか、これつかってActive Recordみたくかけるといいなぁ
SPIについて(その１

SPIについて勉強を始めたばかりなので、その１

# SPI＝ソフトウェア改善プロセス

## 主要な手法
* [プロセス改善サイクル](http://qiita.com/hayabusa333/items/faed3041a382741d8f82)
* [プロセス改善評価モデル](http://qiita.com/hayabusa333/items/faed3041a382741d8f82)
* [ソフトウェア・プロセス表記法](http://qiita.com/hayabusa333/items/6d191fac369b642a4d30)
* [ソフトウェア・ライフサイクル](http://qiita.com/hayabusa333/items/6d191fac369b642a4d30)
* ソフトウェア方法論
* ソフトウェア表記法
* ソフトウェア・プロセス
* ソフトウェアツール
* ソフトウェア・メトリクス
* プログラム言語

## SPIは統計的工程管理などのツールを使用して新しく改善されたプロセスの実績を測定することによって決まる。
* 古いソフトウェアプロセスの測定・分析
* 新しいソフトウェアプロセスの測定・分析
* 古いソフトウェアプロセスと新しいソフトウェアプロセスの比較

**ソフトウェアプロセスには作業工程、コスト、サイクルタイム、生産性、品質、信頼性、精度、予測可能性、効率、単純さ、顧客満足度、自動化、一貫性、反復性、測定可能性、多様性、革新度がある**
Windows 7にVM Playerをインストールして、LAMP環境を構築(1)

# VM Playerのインストール
- VM Playerを下記サイトよりダウンロード
https://my.vmware.com/jp/web/vmware/free#desktop_end_user_computing/vmware_player/6_0

- VMware-player-6.0.4-2249910.exeファイルを実行

- あとはinstallerの指示通りで完了

# Cent OSのダウンロード
- 下記よりCent OSをダウンロード。今回はCentOS-7.0-1406-x86_64-DVD.isoを取得
http://www.centos.org/

# 仮想マシンの作成
- VM Playerの起動する
- 新規仮想マシンの作成をクリックする
- インストール元はインストーラディスクイメージファイル(M)(iso)を選択し、上でDLしたファイルを指定する
- ゲストOSはLinuxを選択する
- バージョンはCentOS64bitを選択する
- ディスク最大サイズ20GBに指定する
- 仮想ディスクを複数のファイルに分割を選択する

#Cent OSのインストール
- 上記で作成した仮想マシンを選択して、仮想マシンの再生をクリックする
- 初回なので、VMWare Tools Linux版をインストールを聞かれるのでインストールする
- GUIのインストール画面になるので、日本語を選択する
- インストール先(D)にアラート表示が出ているので、一旦開く
- 完了をクリックする
- ソフトウェアの選択は、最小限のインストール->開発ツールを選択
- ネットワークとホスト名(N) は、EternetをONにする。host名はmnrck07
- インストールの開始をクリック
- rootパスワードの設定を求められるので、設定する
- あとはインストール完了したら、再起動するだけ
Sinatra::ConfigFileでYAMLの中でERBの記法を使いたい




概要
=====


問題
-----
config.yml内にerb記法を書いたが、そのままの文字列で返ってきて困った。

```env
FOO=hello
```
```config.yml
foo: <%= ENV['FOO'] %>
```
```ruby
settings.foo # => '<%= ENV['FOO'] %>'
```


解決策
-----
読み込むファイルの名称に`.erb`を含める。

```env
FOO=hello
```
```config.yml.erb
foo: <%= ENV['FOO'] %>
```
```ruby
settings.foo # => 'hello'
```


参考資料
-----
Sinatra::ConfigFile自体の使い方は下記。
http://www.sinatrarb.com/contrib/config_file.html

ソースのコメントのほうがより詳細かもしれない。
https://github.com/sinatra/sinatra-contrib/blob/master/lib/sinatra/config_file.rb



詳細
=====


> 以下自分が調べた際の覚書なので、長々書いたけど結論はもう上に書いたので充分


Herokuとか使ってるとmongoidのmonogoid.ymlとかでデータベース接続の情報を環境変数に設定するので`<%= ENV['MONGOHQ_URL'] %>`とか書く。
似たようなことをSinatra::ConfigFileでそのままやってみると下記のようになる。

```config.yml
development:
  foo: <%= ENV['FOO'] %>
```

と、なるのだが、実際`settings.foo`とした際に帰ってくる値はまんま文字列として`<%= ENV['FOO'] %>`が返ってくる。


いやいや、そうじゃなく、展開した値を返して欲しいのさ、という場合は下記のようにする。

```config.yml.erb
development:
  foo: <%= ENV['FOO'] %>
```

一緒に見えるけど、実はファイル名に`.erb`を足している。
[ソース](https://github.com/sinatra/sinatra-contrib/blob/master/lib/sinatra/config_file.rb)よく見りゃ書いてあるんだけど、`config_file`メソッドの中で下記のようにしている。

```ruby
document = IO.read(file)
document = ERB.new(document).result if file.split('.').include?('erb')
yaml = config_for_env(YAML.load(document)) || {}
```

つまりファイル名を`.`で分割した配列（今回なら`['config', 'yml', 'erb']`）中に`'erb'`があればファイルの内容をERBで処理するけど、含まないならERBで処理しない。

仮にERBの記法で書いてもそのままYAML.loadされるので展開されることなくそのまま文字列として返ってくる。
そりゃまあ、YAMLの記法ではないのだから当たり前といえば当たり前で、Railsとかmongoidがある意味気を利かせてYAMLファイル内にerbが使えるようになっている。

たとえばmongoidの`load!`メソッドでは下記のように。

```ruby
YAML.load(ERB.new(File.new(path).read).result)[env]
```

なんでSinatra::ConfigFileじゃ上記のようにしていないのか、というのは下記のPull Requestsがまさにのもの。
https://github.com/sinatra/sinatra-contrib/pull/54

英語よくわかんないけど、ファイル名はconfig.erb.ymlよりもconfig.yml.erbがいいよね、というようなことが会話されている。
また、当初は上記のmongoidの例のように問答無用でERB噛ませようとしたみたいだけど、無駄にERBで処理しないほうがよいよね、的なことも会話されてる。

けども下記のIssuesもあったりする。
https://github.com/sinatra/sinatra-contrib/issues/116
sbt のマルチプロジェクトを生成するための giter8 テンプレート

を作りました。

* アプリケーションからはライブラリを参照できる
* ライブラリからはアプリケーションを参照できない

というよくある二層構成を想定したものです。

##使い方

例として `sample` ディレクトリを用意します。

```
mkdir sample
cd ./sample
git clone https://github.com/x7c1/Slate.git
```

現在のディレクトリ構成はこんな感じです。

* /sample
  * /Slate

あとはこのテンプレートを g8 に指定してプロジェクトの情報を入力すれば

```
g8 file://Slate/slate-template/

organization [org.example]: beerlover         
name [Slate Application]: Beer Apps       
app_prefix [slate]: malt

Template applied in ./beer-apps
```

もうプロジェクトの生成完了です。

```
find ./beer-apps -type f
./beer-apps/.gitignore
./beer-apps/malt-app/src/main/scala/beerlover/malt/app/BeerApps.scala
./beer-apps/malt-lib/src/main/scala/beerlover/malt/lib/MaltLibrary.scala
./beer-apps/malt-lib/src/test/scala/beerlover/malt/lib/MaltLibraryTest.scala
./beer-apps/project/MaltBuild.scala
```

テストもきちんと通ります。

```
cd beer-apps
sbt malt-lib/test
...
[info] MaltLibrary$ should
[info] + create message
[info] 
[info] Total for specification MaltLibraryTest
[info] Finished in 17 ms
[info] 1 example, 0 failure, 0 error
[info] Passed: Total 1, Failed 0, Errors 0, Passed 1
[success] Total time: 7 s, completed 2014/11/03 19:36:49
```

もちろんこのライブラリを呼ぶアプリケーションも問題なく実行できます。

```
sbt malt-app/run
...
hello, BeerApps!
[success] Total time: 5 s, completed 2014/11/03 19:40:20
```

### サブプロジェクトを追加するときは

さっきの `sample` ディレクトリで `slate-template-sub` を指定すればおkです。

```
g8 file://Slate/slate-template-sub/
Create sub-project for sbt

organization [org.example]: beerlover
name [Slate Application]: Beer Apps
sub_project [sub]: stout
app_prefix [slate]: malt

Template applied in ./beer-apps
```

これで（ビルド定義以外は）同じように作られてるのを確認できます。

```
find ./beer-apps/malt-stout -type f
./beer-apps/malt-stout/src/main/scala/beerlover/malt/stout/MaltStout.scala
./beer-apps/malt-stout/src/test/scala/beerlover/malt/stout/MaltStoutTest.scala
```

### 注意

* サブプロジェクトを追加したらビルド定義にも更新が必要です。
  * 残念ながらここは手動で追記する必要があります…。

## リポジトリ

* https://github.com/x7c1/Slate
IT勉強会を始めよう！ IT勉強会の開催理由と開催に必要なもの。

#はじめに
IT界隈では、同じ技術に興味がある方々で学び合うIT勉強会がよく開かれます。
IT勉強会の代表的な形式がセミナー型で、技術に関する知見を発表しあい、質問・意見を共有するものです。
セミナー型のIT勉強会を開催させて頂いた経験を元に、IT勉強会の始め方を備忘録代わりに書いていきます。

##主催(又は共同主催）させて頂いたIT勉強会
* [Webスクレイピング勉強会@東京（完了）](http://tokyoscrapper.connpass.com/event/6809/)
* [NLP勉強会@東京（継続中）](http://tokyoscrapper.connpass.com/event/9021/)

#なぜIT勉強会を始めるのか？
私がIT勉強会を開催した時の理由は、以下の３点です。
* 暗黙知を知りたい。
　→インターネットや書籍で公開できる知識には限界があります。
　　記録に残るメディアでは、事業に関わる話や炎上リスクのある話をする事ができません。
　　しかし、IT勉強会という密室の中ならば公開できます。
* 勉強仲間が欲しい。
　→自分にない視点の意見を頂く事で、
　　疑問に思っていた点や疑問にすら思っていなかった点への解決策を得られる事が多いです。
　　特に、その場で議論できるのはとても助かります。
* 自分を認知されたい。
　→勉強会を開催した事でフォロワー数が増えました。
　　また、お仕事のご依頼を頂くという貴重な体験をさせて頂きました。
　　私自身ではありませんが、書籍の出版に繋がった方もいます。　

詳しいメリット（及びデメリット）は、次の記事が参考になります。
[ → IT勉強会を自分で主催するメリット・デメリットと、それらを有料or無料で開く判断。 | WP-D](http://wp-d.org/2012/09/11/420/)

#IT勉強会を始める為に必要なものは？
IT勉強会を始めるにあたって必要なものは「好奇心」だけです。
自分自身が何かの技術を強く知りたいと思っている事は必須です。
勉強会運営は労力がかかり、休日が潰れる事も多いです。
それでも続けるのは、知的好奇心がうずくからです。
逆に、あなた自身が技術の専門家や誰もが知っている有名人である必要はありません。
安心して始めてみて下さい。何とかなります。

#IT勉強会開催はどれ位の労力がかかる？
最初のうちは、勉強会前の休日は全て潰れると思った方が良いと思います。
会場・日程の調整や発表資料の作成、宣伝活動、発表者・参加者とのコミュニケーションなどで忙しくなります。
ただ、慣れてくる内に楽になっていきます。
推奨はしませんが、勉強会当日の準備だけでも何とかなるようになります。

#続き
IT勉強会は「好奇心」さえあれば始められますが、
勉強会当日までに用意しなくてはならない物品があるのも事実です。
まとめました。

[ → 勉強会運営で用意する物品の一覧](http://qiita.com/nezuq/items/d92df588dedb9b228938)

また、勉強会開催前にどのような作業をしなくてはいけないのか？
まとめました。

[ → 勉強会運営の事前作業一覧](http://qiita.com/nezuq/items/2baca138da93ede60186)

そして、当日は？
まとめました。

[ → 勉強会運営の当日作業一覧](http://qiita.com/nezuq/items/ccc8a47d69b726b128e4)


#本記事のライセンス
![by.png](https://qiita-image-store.s3.amazonaws.com/0/38787/db01d4d0-6f81-9e99-01e0-a76a17291903.png)
オフラインでWebAudio APIを再生する

Javascriptで音を鳴らすにはどうしたらいいかなぁと
色々調べてみました
いくつか方法がありますが

①audioタグをJavaScriptで制御する
②WebAudio APIで再生する

今回はローカルの音を鳴らすにはどうしたらいいか考えました。
①はローカルのリソースをaudioタグのsrcに指定すれば鳴らせます
②はXHRもしくはinputタグのfile属性からのファイル取得（File API）限定なため、
ブラウザの仕様上結構難しい

①でいいじゃないかという声が上がってくると思いますが
iPhoneやAndroidではaudioタグの複数同時再生ができなかったりします
逆にWebAudio APIなら複数音同時再生できます。
（上記とは別にスマホブラウザでは①、②ともに
ユーザアクションがないと再生できないという制限があります）
ちなみに②のinputタグから取得する方法だと、ページ表示時に鳴らせないため
別の方法を使います。
あっ、HTML5前提です。

パクｒｙ・・・参考元
（英語わかる人はこっち見た方が早いかも）
http://html5doctor.com/taking-web-audio-offline-in-ios-6-safari/

流れとしては次のように行います
・opensslでオーディオファイルをbase64化
・base64データをArrayBuffer化
・後はWebAudioAPIにロードさせる

MacOSX 前提ですが次のOpenSSLコマンドでオーディオファイルをbase64ファイル化します
<pre>
openssl base64 -in [infile] -out [outfile]
</pre>

今回はjump.wavでやってみました
（適当なオーディオファイルをご準備ください）
<pre>
openssl base64 -in jump.wav -out jump.txt
</pre>

base64に変換でき・・・んん？改行入っているぞ
ということで、改行も次のコマンドで除外します(※ここ重要)
<pre>
cat jump.txt | tr -d '\n' > out.txt
</pre>

base64→ArrayBuffer変換ですが
base64-binary.jsを使います

https://github.com/danguer/blog-examples/blob/master/js/base64-binary.js

使い方は下みたいに使います

<pre>
var sound = "base64データ";
var arrayBuff = Base64Binary.decodeArrayBuffer(sound);
</pre>

後はArrayBufferからデータを取得してWebAudio APIで鳴らすだけです。

全ソースコードです。

```js:offline_webaudio.html
<!DOCTYPE html>
<html lang="en" manifest="web.appcache"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<title>Offline Audio Example</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="./js/jump.js"></script>
<script src="./js/base64-binary.js"></script>
<script type="text/javascript">

var myAudioContext, mySource, myBuffer;

if ('AudioContext' in window) {
	myAudioContext = new AudioContext();
} else if ('webkitAudioContext' in window) {
	myAudioContext = new webkitAudioContext();
} else {
	alert('Your browser does not support yet Web Audio API');
}

function play () {

	mySource = myAudioContext.createBufferSource();
	mySource.buffer = myBuffer;
	mySource.connect(myAudioContext.destination);

	if ('AudioContext' in window) {
		mySource.start(0);
	} else if ('webkitAudioContext' in window) {
		mySource.noteOn(0);
	} 
	
}

    
window.onload = function(){

    var arrayBuff = Base64Binary.decodeArrayBuffer(sound);

	myAudioContext.decodeAudioData(arrayBuff, function(audioData) {
        // データ取得
		myBuffer = audioData;
        
        // 再生
        play();
	});

};
    
</script>
</head>

<body>
<h1>Offline Web Audio Demo</h1>
<button onclick="play();" style="height: 44px; width: 75px;">Play</button>

</body>
</html>
```

base64データが長いので別ファイルにしてます。
今回はjump.jsに分離しました
jump.jsにはout.txtで出力したbase64データをコピペします

<pre>
 var sound="base64データ(out.txtの中身)";
</pre>
DataGridの内容をCSVファイルに出力するボタンを作る


データを定義する名前と場所だけのUserクラスを作成。

```C#:User.cs
namespace WpfApplication2
{
    class User
    {
        public string Name { get; set; }
        public string Place { get; set; }

        public User(string name, string place)
        {
            this.Name = name;
            this.Place = place;
        }
    }
}
```

WPFはCSV出力ボタンとDataGridの内容を表示するだけのシンプルなもの。

```XAML:MainWindow.xaml
<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <DataGrid Name="dataGrid" />
        </StackPanel>
        <StackPanel>
            <Button Name="CSV" Content="CSV出力" Click="ExportCSV"/>
        </StackPanel>
    </Grid>
</Window>
```

```C#:MainWindows.xaml.cs
using System;
using System.Collections.ObjectModel;
using System.Windows;

namespace WpfApplication2
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
			//サンプルデータ
            data.Add(new User("太郎", "北海道"));
            data.Add(new User("次\"郎", "岩手"));
            data.Add(new User("三郎", "宮城"));
            dataGrid.ItemsSource = data;
        }

        ObservableCollection<User> data = new ObservableCollection<User>();

	//CSV出力ボタン押下時のイベント
	private void ExportCSV(object sender, RoutedEventArgs e)
	{
		Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
		//保存先の初期値（マイドキュメント）
 		dlg.InitialDirectory = System.Environment.GetFolderPath(Environment.SpecialFolder.Personal);
		dlg.Title = "保存先のファイルを選択してください";
		dlg.Filter = "CSVファイル(*.csv)|*.csv";
		if(dlg.ShowDialog() == true){
  	  		try
       		{
				using (var sw = new System.IO.StreamWriter(dlg.FileName, false, System.Text.Encoding.GetEncoding("Shift_JIS")))
				{
					//ダブルクォーテーションで囲む
           			Func<string, string> dqot = (str) => { return  "\"" + str.Replace("\"", "\"\"") + "\""; };
         	     	foreach (User d in data)
						sw.WriteLine(dqot(d.Name) + "," + dqot(d.Place));
             	}
				MessageBox.Show("保存しました");
         	}
        	catch (SystemException ex)
         	{
			System.Console.WriteLine(ex.Message);
			}
		}
	}
}
```
proxmoxホスト側でsquidを動かす

# パッケージインストール

```bash:squid3インストール
apt-get install -y squid3
```

# squidの設定

3128ポートがspiceproxyで既に使われているのでポート番号を変える。

```diff:/etc/squid3/squid.conf
- http_port 3128
+ http_port 13128
+ acl localnet src 192.168.11.0/24
+ http_access allow localnet
```

# OpenVz側の設定

```diff:$HOME/.bashrc
PROXY="192.168.11.4:13128"
export http_proxy="http://$PROXY"
export https_proxy="https://$PROXY"
export ftp_proxy="ftp://$PROXY"
```

# ログ

* /var/log/squid3/access.log