OmniAICreator/Qiita-1.07M huggingface dataset:
Real World Refinements

Ruby AdventCalendarの最終日です。
締切をオーバーしました……。orz

Refinementsの使い道が無いとか、使ったことがないという人が結構居るみたいなので、いくつかのユースケースを紹介しようと思います。

## テストコードのDSL
一つは[rspec-parameterized](https://github.com/tomykaira/rspec-parameterized "rspec-parameterized")。

```ruby
# Table Syntax Style (like Groovy spock)
# Need ruby-2.1 or later
describe "plus" do
  using RSpec::Parameterized::TableSyntax

  where(:a, :b, :answer) do
    1 | 2 | 3
    5 | 8 | 13
    0 | 0 | 0
  end

  with_them do
    it "should do additions" do
      expect(a + b).to eq answer
    end
  end
end
```

https://github.com/tomykaira/rspec-parameterized/blob/master/lib/rspec/parameterized/table_syntax.rb

こういうGroovyのspockの様にテストパラメーターを記述するDSLをRefinementsで定義しています。
RSpecの`describe`は単なるクラス定義なので、`using`を使って特定のテストケース上でだけ動くDSLが書けます。
最近は使われなくなった`should`とかも、Refinementsを使えば割と安全に実装できると思いますが、今更感はありますね。

実は[k-tsj/power_assert](https://github.com/k-tsj/power_assert "k-tsj/power_assert")でも、グローバルメソッドキャッシュを破棄するという目的のためにrefinementsを利用しているコードがあるんですが、流石に例として特殊過ぎる気はします。

## Concernモジュール
もう一つはConcernモジュールでの利用です。
例えば、ActiveRecordでレコードがcreateされた時に、fluentdにレコードの内容を送りたい場合を考えてみます。

```ruby
module FluentLoggable
  extend ActiveSupport::Concern

  module MethodDefinitions
    refine User do
      def fluentd_tag
        "user"
      end

      def fluentd_payload
        as_json.with_indifferent_access.merge(
          groups: groups.map { |g| g.fluentd_payload }
        )
      end
    end

    refine Group do
      def fluentd_tag
        "group"
      end

      def fluentd_payload
        name
      end
    end
  end

  using MethodDefinitions

  included do
    after_create :post_to_fluentd
  end

  private

  def post_to_fluentd
    Fluent::Logger.post(fluentd_tag, fluentd_payload)
  end
end

ActiveSupport.run_load_hooks :FluentLoggable, FluentLoggable
```

```ruby
class Class
  def lazy_include(hook_name)
    klass = self

    ActiveSupport.on_load hook_name do |mod|
      klass.include mod
    end
  end
end
```

```ruby
class User < ActiveRecord::Base
  lazy_include :FluentLoggable
end
```

こんな感じで書いておくと、モジュールによって定義される`post_to_fluentd`の中でだけ、refineされたメソッドが有効になります。
この書き方のメリットは、あるオブジェクトをRootとするツリー構造があった時に、各オブジェクトにpayloadの算出方法の責任を任せつつ、それを他の箇所では一切見せずにこの目的のためにしか使えないようにできる点です。
上記の例以外に考えられるケースとしては、JSON APIの返り値として階層上になったJSONを構築したい時等でしょうか。

Railsアプリケーションを書いていてFat Model化した時に困るのは、あるメソッドがどういう用途で使われてるのか良く分からなくなることです。いざ変更した時に想定外の所がぶっ壊れる可能性もあります。
Refinementsで処理内容を内側に閉じ込めておけば、その範囲でしか使われていないことを明確にできます。

ただ、この書き方には一つ大きな問題があります。
それはRailsにおけるautoloadと非常に相性が悪いことです。
`lazy_include`というハックを使っているのはそのためです。
Concernモジュールの定義が完了してからincludeしないと、`User`を定義している最中に`FluentLoggable`が読み込まれてそこで参照されている`User`というクラスに反応して再度autoloadが走ってcircular dependencyが発生し、エラーになります。
そのため、こういった微妙なハックが必要になります。

この書き方が有効なケースはそれ程多くないし、includeの際にハックを噛まさなければならないという問題もありますが、使い道の一つとしては有り得るんじゃないかと思います。
まあ、私自身、試行錯誤した結果なので、本当にこれが良い使い方か、と言われると良く分からないというのが正直な所です。

ちなみに、`refine`部分は`module_eval`したり他のモジュールをincludeしたり出来るので、各クラス向けの実装を別のファイルに分割することは可能だと思います。
電子工作 > リンク > 電流制限の回路

色々な電流制限の回路が示されていて参考になる。
http://www.geocities.jp/kuman2600/o05dengen.html

上記のページからリンクが貼られているページ。
かなりシンプルだ。
http://www.nahitech.com/nahitafu/mame/mame2/lim01.html
scikit-learnを入れるときに「/usr/bin/ld: -lcblas が見つかりません」と怒られた

2度もはまったのでメモ．

結論
----
- 解決策: `cd /usr/lib64/atlas && ln -s libtatlas.so libcblas.so`
  - 参考: [Python の機械学習環境を Docker イメージで作成](http://fits.hatenablog.com/entry/2015/10/29/212833)

状況
----
CentOSにscikit-learnをpipで入れようとしても以下のように怒られる
```
g++ -pthread -shared -Wl,-z,relro build/temp.linux-x86_64-2.7/sklearn/svm/liblinear.o build/temp.linux-x86_64-2.7/sklearn/svm/src/liblinear/tron.o build/temp.linux-x86_64-2.7/sklearn/svm/src/liblinear/linear.o -L/usr/lib64/atlas -L/usr/lib64 -Lbuild/temp.linux-x86_64-2.7 -lcblas -lm -lpython2.7 -o build/lib.linux-x86_64-2.7/sklearn/svm/liblinear.so
    /usr/bin/ld: -lcblas が見つかりません
    collect2: エラー: ld はステータス 1 で終了しました
    /usr/bin/ld: -lcblas が見つかりません
    collect2: エラー: ld はステータス 1 で終了しました
    error: Command "g++ -pthread -shared -Wl,-z,relro build/temp.linux-x86_64-2.7/sklearn/svm/liblinear.o build/temp.linux-x86_64-2.7/sklearn/svm/src/liblinear/tron.o build/temp.linux-x86_64-2.7/sklearn/svm/src/liblinear/linear.o -L/usr/lib64/atlas -L/usr/lib64 -Lbuild/temp.linux-x86_64-2.7 -lcblas -lm -lpython2.7 -o build/lib.linux-x86_64-2.7/sklearn/svm/liblinear.so" failed with exit status 1
```

atlasを入れればいいらしいのだが，入っている模様：
```
$ yum list | grep atlas
atlas.x86_64                            3.10.1-10.el7                  @base
atlas-devel.x86_64                      3.10.1-10.el7                  @base
atlas.i686                              3.10.1-10.el7                  base
atlas-devel.i686                        3.10.1-10.el7                  base
atlas-sse2.i686                         3.10.1-10.el7                  base
atlas-sse3.i686                         3.10.1-10.el7                  base
atlas-static.i686                       3.10.1-10.el7                  base
atlas-static.x86_64                     3.10.1-10.el7                  base
```
AWS lambda上でiconvを使う（コマンドじゃなくてね）

## はじめに
AWS lambda上でiconv（[node-iconv](https://github.com/bnoordhuis/node-iconv)）を使うには、少しテクニックが必要です。
[AWS Lambda内で文字コードを変換する方法](http://www.bokukoko.info/entry/2015/08/30/AWS_Lambda%E5%86%85%E3%81%A7%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)

なるほど、lambdaの実行環境にiconvコマンドがあるから、それを叩けば良いのか。
いやしかし、別のモジュールが内部的にiconvを使っている場合はどうするんだろう。

色々と調べた結果（その過程は果てしないので割愛ｗ）、iconvのように実行環境に依存するようなモジュールをlambda上で扱う場合は、ターゲット環境を用意してビルドする必要があるようです。
[Using Packages and Native nodejs Modules in AWS Lambda](https://aws.amazon.com/jp/blogs/compute/nodejs-packages-in-lambda/)

ではやってみます。
## 準備
まずはEC2（Linux）を一台用意して、nodeをインストールします。
*※上記リンクの記事では、nodeのバージョンを0.10.33にしていますが、現在のlambdaのNodeは0.10.36ですので、今回は0.10.36を用意します。*

```lang:EC2
$ sudo yum update
$ sudo yum install gcc44 gcc-c++ libgcc44 cmake –y
$ wget http://nodejs.org/dist/v0.10.36/node-v0.10.36.tar.gz
$ tar -zxvf node-v0.10.36.tar.gz
$ cd node-v0.10.36 && ./configure && make
$ sudo make install
$ node -v
v0.10.36
```
となればOKです。
makeには結構時間がかかりますので、のんびりコーヒーでもどうぞ。

###### 2015-12-31 追記
コンパイルしなくても n を使えば node のバージョン管理は簡単にできますし、複数のバージョンで環境を作りたい方にはおすすめです。

```lang:EC2
$ sudo npm install -g n
$ sudo n 0.10.36
```

## lambda用のiconvを生成
Nodeの環境ができたので、いよいよiconvを準備します。

```lang:EC2
$ mkdir iconv && cd iconv
$ npm install iconv@1.2.3
```
現在のiconvの最新バージョンは、2.1.11なのですが、これだとNodeの0.10.36で動きません（少なくともこちらの環境ではダメでした）。なので、あえて1.2.3をインストールしました。
さらに念の為に、iconvをビルドしておきます。

```lang:EC2
$ cd node_modules/iconv/
$ node-gyp configure
$ node-gyp rebuild
```
warningが結構でますが、最後に
`gyp info ok`
と出れば成功です。

```lang:EC2
$ cd ../
$ ls -l
drwxrwxr-x 3 ec2-user ec2-user 4096 12月 26 14:34 .
drwxrwxr-x 3 ec2-user ec2-user 4096 12月 26 14:34 ..
drwxrwxr-x 5 ec2-user ec2-user 4096 12月 26 14:36 iconv
```
このiconvというフォルダを、実際にlambdaにデプロイするパッケージのnode_modules内のiconvと差し替えてデプロイすればOKなはずです。
差し替えることによって、ローカルで実行時にはエラーが出るようになってしまうので、lambdaにデプロイする時に、その都度差し替えるのがよいかも知れません。ちなみに僕は、gulpを使って、lambda用のビルド環境を生成する際に、iconvフォルダだけを差し替えるようにしています。
## 忙しいあなたに
上記手順で作成したiconvを用意しておきました。
*※zipファイルなので、解凍して使ってください。なお、動かなくて責任は持ちませんのであしからず。*
[iconv.zip](https://s3.amazonaws.com/download.gij/iconv.zip)
良さげなiOSライブラリの見つけ方・管理法

~~Advent Calendarに空きがあって完走の危機だったので[今年読んだSwift関連の良記事7選 - Qiita](http://qiita.com/mono0926/items/8befa63d95045996d87f)と同じく、~~良さげなiOSライブラリの見つけ方・管理法を振り返りました。

やはり良い感じのライブラリを把握しておくのは、開発効率向上に大いに貢献するので。


# ライブラリの情報源

## [Trending Swift repositories on GitHub today](https://github.com/trending?l=swift)

定期実行のTODO管理して、週1で見ています。
基本的にStarを付けて、既読管理ぽくしてます。
Star付けられると嬉しいですしね。

僕はもうほとんど見てないですが、[Trending Objective-C repositories on GitHub today](https://github.com/trending?l=objective-c)でObjective-Cのライブラリチェックしても良いかと思います。

## メルマガ

ライブラリ紹介の項もあるので、全部見てます。

- [Swift Weekly - Free weekly Swift development newsletter for iOS and OSX](http://swiftweekly.com/?utm_expid=110868542-2.w6x3OK2cT1qDHqfOtb1lnA.0)
- [iOS Dev Weekly](https://iosdevweekly.com/)
- [iOS Cookies | iOS Cookies](http://www.ioscookies.com/)
    - こちらはライブラリ紹介に特化したメルマガが来ます
    - [Swift製のライブラリだけをまとめたサイト「iOS Cookies」 ｜ ライフハッカー［日本版］](http://www.lifehacker.jp/2015/10/151019swiftios_cookies.html)

## Awesomeシリーズ

良いライブラリが分類されていて、重宝します。
ググるより、こちらの方が良いものが早く見つかったりする気がします。

- [vsouza/awesome-ios](https://github.com/vsouza/awesome-ios)
- [matteocrippa/awesome-swift](https://github.com/matteocrippa/awesome-swift)
- [joeljfischer/awesome-apple](https://github.com/joeljfischer/awesome-apple)

## これを機に活用しようかなと思っているもの

過去にブックマークなどしていたものを掘り起こしました。
ライブラリまとめサイトみたいなのは、見つけた時は良いなと思っても忘れちゃってなかなか活用難しいですが。

- [Libraries - The Open Source Discovery Service](https://libraries.io/)
- [SwiftToolbox](http://www.swifttoolbox.io/)

## あまり使っていないところ

### [Custom Controls for iOS and OS X - Cocoa Controls](https://www.cocoacontrols.com/)

けっこう有名ですが、玉石混交な感じで、検索がんばっても今いちなので今はほとんど見ていないです。

# 管理法

頭に入れるのが一番ですね。
上の方法で見ていると、同じものを何回も目にしたりするので、それである程度頭に入ってきたりします。
とはいえ、数が多いので、ある程度工夫が必要です。

## 毎週まとめLetterを作成・配信

[MediumのSwift・iOSコラム](https://medium.com/swift-column/letters)にて、その週に見た各種情報(ライブラリに限らずですが)をまとめて配信することを始めました。
忘却曲線的に、これをすると頭への定着率が上がる気がします。
日々OmniOutlinerにストックしておいて、週末再チェックして本当に良いと思ったライブラリ・記事を配信、という感じで進めていて多少負担かかる(その分身に付いていると思います)こと以外は良い感じです。

こちら読んで購読していただけるとモチベーション上がります🙇:
[Swiftメルマガを始めました – Swift・iOSコラム – Medium](https://medium.com/swift-column/letter-814e9b15a0af#.c6v4j6ls2)

## Starで管理

基本的に、将来的に使うかもしれないくらいのライブラリを見つけるとStar付けています。
[Your stars](https://github.com/stars)で自分の一覧が見られて、フィルター・ソート・検索活用すると、「先日見かけたアレ」みたいな感じでたどり着けたりします。

Star付けすぎると多くなりすぎて収集付かなくなるかもしれない、と少し迷いましたが今は気にせずたくさんStar付けています。
1,300 Starほどになりました(　´･‿･｀)


## 今後の展望

ただ、管理法では過去に見つけたライブラリにすぐたどり着けなかったり存在自体忘れちゃったりして、まだ課題を感じています。
必要な時にすぐ引き出せて、メンテナンスも簡単な管理法無いですかね（´・ω・｀）
スプレッドシートとかが良いような、イケて無いような（´・ω・｀）

ライブラリ管理サービスなどあれば嬉しいなと思ったりします。
[開発者必見、GitHubのライブラリ専門サーチエンジン「hew.io」](http://www.softantenna.com/wp/webservice/hew-io/)良いなと思って放置してて、今見たら無くなってました(´・︵・｀)

---

本記事、[Swift - iOSアプリ開発情報の集め方 - Qiita](http://qiita.com/mono0926/items/78c5409178a9e3be0fcc) と内容が若干被っていますね(　´･‿･｀)
2.4. 透視投影


3Dの基本的な知識を理解したくて、『３次元CGの基礎と応用［新訂版］（ http://goo.gl/GKoQ4y ）』という書籍を購入しました。薄くて読みやすそうな本なのですがサンプルソースがないので、勉強がてらサンプルを作りながら読み進めようと思います。誰でもすぐに追試ができるよう、HTML + Javascriptでサンプルを作っていきます。

完全なサンプルはこちら
https://github.com/nakaken0629/3dstudy

# 2.4. 透視投影

『遠くのものは小さく見え、近くのものは大きく見える』という基本的な考え方が透視投影です。概念としてはとても簡単で、距離と見かけ上の大きさが比例するというものです。
ただしあまりに視点に近いもの、あるいは視点の後ろにあるものは見えないようにするために、前方クリッピング平面と後方クリッピング平面でクリッピングする必要があります。今回はポリゴンの表示位置を後方クリッピング平面を超えないように調整することで、後方クリッピング平面でのクリッピング処理は省略しています。

![session2_4.gif](https://qiita-image-store.s3.amazonaws.com/0/75307/b3d10628-39f9-35db-54ed-6632658a2d91.gif "session2_4.gif")

# 異なる単位同士の変換比率と、各種大きさの定義

３次元での描画をするには、ピクセル系の単位（例：600px * 400px）と現実の単位（例：15cm * 10cm）が混在するため、それらの比率を確認しておく必要があります。以下の考え方で今回は比率と、それに伴う各種大きさの設定を行いました。

まず、スクリーンの大きさです。画面上に見えるスクリーンの大きさは600px * 400pxです。これを定規で測ってみるとおおよそ15cm * 10cmでした。そのため、1cm = 40pxとなります。また、自分の目とPCのモニターの距離はおよそ30cmでした。

次に前方クリッピング平面は、特に根拠はないのですが演算誤差でおかしな画像が表示されない値を調整しながら確認したところ、自分の目とモニターの中間地点（15cm）が良さそうな値でした。

最後に後方クリッピング平面ですが、視力1.0だと7.5mmの大きさのランドルト環（視力検査で使うアルファベットの『Ｃ』のようなもの）を5mの距離から正確に見えるそうです。ここから、視力1.0で大体１メートルくらいの物体が識別できる距離として、50,000cm（＝500メートル）と定義しました。
参考：[視力](https://ja.wikipedia.org/wiki/%E8%A6%96%E5%8A%9B#.E3.83.A9.E3.83.B3.E3.83.89.E3.83.AB.E3.83.88.E7.92.B0 "視力") （Wikipediaより）

まとめたものは、以下の通りです。

* 1cm = 40px
* スクリーン平面：15cm x 10cm
* 視点からスクリーン平面までの距離：30cm
* 視点から前方クリッピング平面までの距離：15cm
* 視点から後方クリッピング平面までの距離：50,000cm

# クリッピング平面でのクリッピング処理

例えば、三角形面のポリゴンの一つの頂点だけがビューボリュームの外にあると、角が削れて四角形面になります。このようにクリッピング処理ではポリゴンの頂点の数が増える可能性があります。このクリッピング処理は次のアルゴリズムで作成しました。

1. ポリゴン内のある頂点を起点に取る
2. 起点がビューボリュームに含まれている場合、その点をクリッピング後のポリゴンの頂点として採用する
3. 起点の次の点を終点とする。起点と終点の間にクリッピング平面がある場合、その交点をクリッピング後のポリゴンの頂点として採用する
4. 上記の終点を新たな起点として、2.に戻る

# スクリーンへの投影

ある頂点(x, y, z)をスクリーンへ投影した時の座標(x', y')は、次の内容で計算できます。
x' = (視点からスクリーン平面までの距離 / z) * x
y' = (視点からスクリーン平面までの距離 / z) * y

なお今回は、視点の中心が(0, 0)となるように、スクリーン平面を(-300, -200) - (300, 200)という座標系に変換しているので、その分の補正も入っています。

# サンプルコード

```javascript:session2_4.htmlより
var fillTriangle = function(p) {
    /* 前方クリッピング平面でクリッピングする */
    var z = 600;
    var p2 = {'v': [], 'rgb': p.rgb};
    for (var i = 0; i < p.v.length; i++) {
        var j = (i + 1) % p.v.length;
        var v1 = p.v[i];
        var v2 = p.v[j];
        if (v1.z >= z) {
            /* 起点がビューボリューム内なら使用する */
            p2.v.push(v1);
        }
        if ((v1.z >= z && v2.z < z) || (v1.z < z && v2.z >= z)) {
            /* 起点と終点の間に前方クリッピング平面があれば、交点を使用する */
            var x = (z - v1.z) * (v2.x - v1.x) / (v2.z - v1.z) + v1.x;
            var y = (z - v1.z) * (v2.y - v1.y) / (v2.z - v1.z) + v1.y;
            p2.v.push({'x': x, 'y': y, 'z': z});
        }
    }
    p = p2;

    /* 実座標からスクリーン座標への変換を行う */
    var length = p.v.length;
    var sx = [];
    var sy = [];
    for (var i = 0; i < length; i++) {
        sx[i] = p.v[i].x * 1200 / p.v[i].z + 300;
        sy[i] = p.v[i].y * 1200 / p.v[i].z + 200;
    }

    /* 変換後のポリゴンの描画を行う */
    ctx.fillStyle = p.rgb;
    ctx.beginPath();
    ctx.moveTo(sx[0], sy[0]);
    for (var i = 1; i <= length; i++) {
      var index = i % length;
      ctx.lineTo(sx[index], sy[index]);
    }
    ctx.closePath();
    ctx.fill();
};
```
YARN queue ACL for Spark


昨日書いた[Spark and YARN](http://qiita.com/imaifactory/items/f35ef03bfa4f268b1b83)で、下記のようなことを書いたので少し検証してみた。

> YARNで強化するSparkのセキュリティ対策

> Spark自体が提供するセキュリティ対策のほかに、YARNのCapacity Schedulerを使うことによって、RMに対してアプリケーション登録時に認証をかけることができるようになる。ちょっと時間切れになってきたので、詳細はまたあとで追記。

## YARNのスケジューラが持つキュー

YARNのCapacity SchedulerとFair Schedulerはアプリケーションの登録を受け付けるキューをもっており、これらはUNIXユーザー/グループベースのACLを掛けることができる。このことによりSparkアプリケーションを実行するユーザーごとにアプリケーションの登録可否を制御できる。Capacity Schedulerの場合、複数のキューを持つことができるので、キュー単位でのユーザーの利用制限を掛けることもできる。

以下はCapacity Schedulerの設定例。defaultという名前のキューに対してyutaというUNIXユーザーがアプリケーションを登録したりkillできるようにするには、capacity-scheduler.xmlに以下のような設定をしてやる。

```
    <property>
      <name>yarn.scheduler.capacity.root.acl_administer_queue</name>
      <value></value>
    </property>

    <property>
      <name>yarn.scheduler.capacity.root.acl_submit_applications</name>
      <value></value>
    </property>

    <property>
      <name>yarn.scheduler.capacity.root.default.acl_administer_queue</name>
      <value>yuta</value>
    </property>

    <property>
      <name>yarn.scheduler.capacity.root.default.acl_submit_applications</name>
      <value>yuta</value>
    </property>
```

注意すべき点として`yarn.scheduler.capacity.root.acl_administer_queue`と`yarn.scheduler.capacity.root.acl_submit_applications`というより上位の設定のデフォルト値が`*(全許可)`となっており、これを上記の例のように削除してやらないと、いくらdefaultキューの設定をいじってあげても制限が効かない。この挙動はどうなのよ？っていう話は[YARN-1941](https://issues.apache.org/jira/browse/YARN-1941)で議論されているが、とりあえずこのまま放置される模様。

上記と同じ設定をAmbariで実施するならこんな感じだ。
左がrootの設定、右がdefaultキューの設定
![ambari_queue_manager.jpg](https://qiita-image-store.s3.amazonaws.com/0/10292/3207eebd-47e7-e946-ff7b-6952e92b4547.jpeg "ambari_queue_manager.jpg")



## Apache Rangerによるユーザー/グループの管理

ユーザーやグループの管理は[Apache Ranger](http://ranger.apache.org/)に移管することもできる。Apache RangerはHadoopエコシステムに対して認可と監査を提供するコンポーネントで、UNIXユーザーやLDAPからユーザーやグループの動機をうけ、それらに対してHadoopの各コンポーネントへのアクセスの認可と、オペレーションログを管理してくれる。例えばYARNとRangerを組み合わせるのであれば以下のようなUIにおいて「どのキューに誰からのアクセスを許可するのか」といった設定をしてやる。
![ranger.jpg](https://qiita-image-store.s3.amazonaws.com/0/10292/b8e916db-ca34-e246-51b5-2c6195b943a2.jpeg "ranger.jpg")

## マルチテナントなSparkクラスタの運用

昨日のポストで[SparkはYARNで動かすべきか](http://qiita.com/imaifactory/items/f35ef03bfa4f268b1b83#spark%E3%81%AFyarn%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99%E3%81%B9%E3%81%8D%E3%81%8B)というパートで「マルチテナントなSparkクラスタならYARNを使うことのメリットが出やすいのでは」というような話を書いたが、マルチテナントであれば当然ユーザーの数も増える。

そういった環境においては、capacity-scheduer.xmlの更新で利用ユーザーやグループを管理するのは運用の手間がかかる。こういったケースでは前述のApache Rangerを使って下記のような構成を取るのがベターだと言える。
![ldap_with_spark.jpg](https://qiita-image-store.s3.amazonaws.com/0/10292/d7c31f36-5318-b735-ce11-abb3d05e4416.jpeg "ldap_with_spark.jpg")


## まとめ

YARNはキューのACLを持っているので、Sparkに対して「誰がアプリケーション登録できるのか」というユーザー/グループ単位での制御を提供してくれる。更にApache Rangerと組み合わせるとユーザー/グループの管理をLDAP等に外出しできる。なので、多数のユーザーが利用するようなSparkのクラスタにマッチする。

ということで、SparkのクラスタマネージャにYARNを選択することのひとつのメリットとして「マルチテナント環境の管理がしやすい」と言える。

## Disclaimer 

これは個人の意見であり、わたしの雇用者を代表するものではありません。
nokogiriのインストールエラーはXcode command line tools更新後に規約同意をしていないのが原因かも

ある時、Mac OS X Yosemite (10.10.5)でnokogiriのインストールに失敗しました。

ターミナル出力（後述）には`You have to install development tools first.`とあります。
つい最近までインストールできていたから開発環境が無いわけがないのに・・・と思っていたら、直前にXcode command line toolsの更新をしていたのが原因でした。規約同意していないのでxcodebuildが使えなかったんですね。

```
$ sudo xcodebuild -license
（中略）
By typing 'agree' you are agreeing to the terms of the software license agreements.
Type 'print' to print them or anything else to cancel, [agree, print, cancel] agree
```

これでインストールできるようになりました。

以下nokogiriインストール失敗時の出力

```
$ bundle
Fetching gem metadata from https://rubygems.org/...........
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies........
Using rake 10.4.2
Using i18n 0.7.0
Using json 1.8.3
Using minitest 5.8.3
Using thread_safe 0.3.5
Using tzinfo 1.2.2
Using activesupport 4.2.5
Using builder 3.2.2
Using erubis 2.7.0
Using mini_portile2 2.0.0
Installing nokogiri 1.6.7.1 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /Users/<user>/.rbenv/versions/2.2.3/bin/ruby -r ./siteconf20151226-4433-1t2wmhu.rb extconf.rb --use-system-libraries
checking if the C compiler accepts ... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/<user>/.rbenv/versions/2.2.3/bin/$(RUBY_BASE_NAME)
	--help
	--clean
/Users/<user>/.rbenv/versions/2.2.3/lib/ruby/2.2.0/mkmf.rb:456:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
	from /Users/<user>/.rbenv/versions/2.2.3/lib/ruby/2.2.0/mkmf.rb:571:in `block in try_compile'
	from /Users/<user>/.rbenv/versions/2.2.3/lib/ruby/2.2.0/mkmf.rb:522:in `with_werror'
	from /Users/<user>/.rbenv/versions/2.2.3/lib/ruby/2.2.0/mkmf.rb:571:in `try_compile'
	from extconf.rb:80:in `nokogiri_try_compile'
	from extconf.rb:87:in `block in add_cflags'
	from /Users/<user>/.rbenv/versions/2.2.3/lib/ruby/2.2.0/mkmf.rb:619:in `with_cflags'
	from extconf.rb:86:in `add_cflags'
	from extconf.rb:336:in `<main>'

extconf failed, exit code 1

Gem files will remain installed in /Users/<user>/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/nokogiri-1.6.7.1 for inspection.
Results logged to /Users/<user>/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/extensions/x86_64-darwin-14/2.2.0-static/nokogiri-1.6.7.1/gem_make.out
An error occurred while installing nokogiri (1.6.7.1), and Bundler cannot
continue.
Make sure that `gem install nokogiri -v '1.6.7.1'` succeeds before bundling.
```
電子工作 > INFRA-RED EMITTING DIODE > L-53F3BT > datasheet

INFRARED EMITTING DIODEの L-53F3BT を購入してきた。

[tmeのサイト](http://www.tme.eu/en/details/l-53f3bt/transmitting-and-receiving-ir-elements/kingbright-electronic/)

[datasheet](http://www.tme.eu/en/Document/51467c482a9b32b37fc96070c60e59ba/l-53f3c.pdf)


L-53F3BT
- Lens Type: Blue Trans.
- VF : (Typ) 1.2, 1.3, 1.35, 1.4 V for IF=20mA



## try失敗

http://qiita.com/7of9/items/12ea577a999dab3b996e
で試したフォトトランジスタでのAD取込みについて、1.1kΩの抵抗とした時に１Vを越える問題がある。

その対策として、１V以上の電圧はカットするような機構がないか気になっていた。

今日教えてもらった方法が赤外LEDを並列に接続してVFの効果で上限をおさえるという方法だった。

試してみたが電圧はフラッシュライトで点灯時に、やはり３V近くになってしまった。


以下のような回路を構成しないといけないのかもしれない。
回路定数が分からない。
http://www.radio-electronics.com/info/circuits/diode_current_limiter/power_supply_current_limiter.php
認定Platformアプリケーションビルダー 移行試験の参考資料まとめ

先日認定Platformアプリケーションビルダー移行試験(WI16)に合格しました。
[Study Guide](http://www2.sfdcstatic.com/jp/assets/pdf/misc/studyguide_cert_pla_app_exam.pdf)に書いている項目の通りで1週間くらい勉強しました。それぞれの項目の参考資料は以下のようにまとめたのでぜひ参考してみてください。

**注意**
*1.これらの参考資料はアプリケーションビルダー移行試験のため、普通のアプリケーションビルダー試験に出ている内容が足りないので注意してください*
*2.これは自分が使った資料だけです。試験に100%出るわけないのでご理解ください*

| Topic & Links  |注目内容   |
|---|---|
| [項目のデータ型](https://help.salesforce.com/HTViewHelpDoc?id=notes_on_changing_custom_field_types.htm&language=en_US)（英語） | 項目のデータ型を変更する場合の考慮事項を明確にする  |
| [グローバルアクション](https://help.salesforce.com/HTViewHelpDoc?id=actions_overview_global.htm&language=ja) & [オブジェクト固有のアクション](https://help.salesforce.com/HTViewHelpDoc?id=actions_overview_object_specific.htm&language=ja) | 親レコードで子レコードを作成  |
| [Lightning Connect](https://developer.salesforce.com/trailhead/module/lightning_connect) | 外部オブジェクトの機能  |
| [Sandboxes](https://help.salesforce.com/HTViewHelpDoc?id=data_sandbox_environments.htm&language=ja) | Sandboxを使用する場合の Sandbox の種類の相違点と考慮事項|
| [Lightning アプリケーションビルダー](https://developer.salesforce.com/trailhead/module/lightning_app_builder) | Lightning アプリケーションビルダーでLightningページを作成しSalesforce1に表示する方法  |
| [積み上げ集計項目とリレーション](https://developer.salesforce.com/trailhead/module/data_modeling) | 積み上げ集計項目の機能、ユースケースおよび影響  |
| [パッケージ](https://help.salesforce.com/HTViewHelpDoc?id=sharing_apps.htm&language=ja) | 未管理パッケージ,管理パッケージ  |
| [割り当てルール](https://help.salesforce.com/HTViewHelpDoc?id=customize_leadrules.htm&language=ja) | ケース、リードの割り当てルール、同時にいくつのルールを有効できるか、どれくらいルールエントリを作成できるか |
| [レコードタイプ](https://help.salesforce.com/HTViewHelpDoc?id=customize_recordtype.htm&language=ja) | ビジネス、セールプロセス、選択リスト、ページレイアウト |
| [プロセスの自動化](https://developer.salesforce.com/trailhead/module/business_process_automation) | 自動化ツール機能、使い分け方  |
| [ワークフロールールを再評価する](https://help.salesforce.com/HTViewHelpDoc?id=workflow_field_updates_reevalute_wf.htm&language=ja) |項目自動更新によって生じる問題と再帰の可能性  |
| [ソーシャルアカウント](https://help.salesforce.com/HTViewHelpDoc?id=social_networks_overview.htm&language=ja) & [個人取引先](https://help.salesforce.com/HTViewHelpDoc?id=account_person_enable.htm&language=ja) | ソーシャルの機能とユースケース  |
| [AppExchange](https://developer.salesforce.com/docs/atlas.en-us.appExchangeInstallGuide.meta/appExchangeInstallGuide/)（英語） |AppExchange を使用した組織拡張の一般的なシナリオ |
| [実行順番](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_triggers_order_of_execution.htm)(英語) | Salesforceでの入力規則、割り当てルール、自動レスポンスルール、ワークフロールール、エスカレーションルールの処理順番 |
ElixirのRangeとErlangの:lists.seqの速度比較

[演算の並列実行でCPUコアを使い切るかどうかを測定](http://qiita.com/hykw/items/c6aa5578655dd5833117) を投稿した時に、[tatsuya6502 さん](http://qiita.com/hykw/items/c6aa5578655dd5833117#comment-fe6be6a8de8cfc707d00) に、

> まず、Range from..to-1 は、プログラムの簡潔さに大きく貢献してますが、その分、Enum 内部の処理が複雑になっていると思います（ポイント１）。

というコメントを頂きました。実際どのぐらい差があるのか気になったので、簡単に比較してみました。ソースコードの差異は Enum.map/2 に渡すリストを Range と :lists.seq/2 にしただけです。

```elixir:range.exs
Enum.map(1 .. 1_000_000, fn(i) -> i end)
```

```elixir:erlang_lists.exs
Enum.map(:lists.seq(1, 1_000_000), fn(i) -> i end)
```

| 数 | 時間(Range) | 時間(:lists.seq) |
|:--|:--:|:--:|
| 1,000,000 | 0.84 | 0.87
| 10,000,000 | 3.1  | 2.6
| 20,000,000 | 6.1  | 4.4
| 30,000,000 | 7.6  | 9.2

![range.png](https://qiita-image-store.s3.amazonaws.com/0/16022/eac6623a-7ca7-2745-e52d-8be648152b85.png)


30,000,000 まで来ると、:lists.seq/2 の方はメモリを使いきって swap が出るようになってしまいました。Range の方も、35,000,000 あたりでメモリを使いきりました。

```text:erl_crash.dumpの抜粋
Slogan: eheap_alloc: Cannot allocate 1581921408 bytes of memory (of type "heap").
System version: Erlang/OTP 18 [erts-7.2.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]
```

およそ3GBの空き容量を30,000,000で割ると100bytesなので、まぁ使い果たしてもおかしくありません。

ここで Range がどのように実装されているのか気になったので、[Elixir 1.1.1 の Range の実装](https://github.com/elixir-lang/elixir/blob/v1.1/lib/elixir/lib/range.ex)を見てみました。

@moduledoc に明記されていますが、struct として実装されているんですね。なので、生成(foo = 1..100 とか）は struct を作るだけなのでコストはまったく無いに等しい一方で、Enum.map/2 とかに渡した場合は内部的には reduce() で再帰処理するため、少しコスト高になってしまうと。

ただ、（ソースを見たわけじゃありませんが）Erlangの方の :lists.seq/2 は呼ばれた時点でメモリ確保をするため、一度に大量に確保するとメモリを使いきるという動作は納得できますが、Range の reduce() はアキュムレータを指定して再帰処理しているのに、なぜメモリを使い切るんでしょうか？

・・・ Enum.map の実装を見て謎が解けました。わかってしまえば単純で、map 自体が再帰処理して Range.reduce() を呼びまくるからですね。そりゃそうだ。

```elixir:lib/elixir/lib/enum.ex
  def map(enumerable, fun)

  def map([], _fun) do
    []
  end

  def map([head | tail], fun) do
    [fun.(head) | map(tail, fun)]
  end

  def map(collection, fun) do
    reduce(collection, [], R.map(fun)) |> :lists.reverse
  end
```

# Stream 版
せっかくなので Stream.map/2 でも試してみました。

ソースコード

```elixir:Enum.map
f = fn (i) -> i end

Enum.map(1 .. 10_000_000, fn(i) -> i end)
|> f.()
```

```elixir:Stream.map
f = fn (i) -> i end

Stream.map(1 .. 10_000_000, fn(i) -> i end)
|> f.()
```

| 数 | 時間(Enum) | 時間(Stream) |
|:--|:--:|:--:|
| 1,000,000 | 0.9 | 0.84
| 10,000,000 | 2.9  | 0.7
| 20,000,000 | 6.1  | 0.69
| 30,000,000 | 8.3  | 0.6
| 100,000,000 | 56.0 | 0.6
| 1,000,000,000 | -  | 0.5
| 10,000,000,000 | -  | 0.6
| 10,000,000,000 | -  | 0.7
| 100,000,000,000 | -  | 0.6

Stream.map/2 の速度がO(1)なのは、何の演算もしてないからなんでしょうね。ちなみに 100000000000000000000000000000000000000000000000000000000000 を指定しても、0.7秒でした。
Loopbackの関係モデル

メモ書きです。内容はまだ検証してません。

この種の情報が必要な方は、公式を参照してください。

https://docs.strongloop.com/display/public/LB/Creating+model+relations


## belongsTo

　多対１または１対１関係を記述する。
　例１：オーダとカスタマー（オーダはカスタマーIDを持つ）…hasMany関係
　例２：住所とカスタマー（住所はカスタマーIDを持つ）…hasOne関係

　hasOne, hasManyはbelongsToの限定的な形式で、利用すると便利メソッドが生えるみたい。


## hasManyThrough

　中間テーブルを用いた多対多関係を記述する。
　例：内科医と患者と面会モデル（面会モデルは、内科医IDと患者IDを持つ）

## hasAndBelongsToMany

　中間テーブルを用いず、直接多対多関係を記述する。

## polymorphic

　LoopBackは、一つ以上のモデルに属することができる、ポリモーフィックモデルをサポートしている。
　例）AuthorモデルとReaderモデル両方に属するPictureモデル


## Embedded model

　埋め込みモデルをサポートしている。

  * EmbedsOne … 一つのモデルに埋め込まれているパターン。例：カスタマーは支払先住所を埋め込んでいる。
  * EmbedsMany … 他のモデルを複数個埋め込んでいるモデル。例：カスタマーは複数のEメールアドレス（ラベルとアドレスを含むなど、複雑なもの）を埋め込んでいる。
  * EmbedsMany with belongsTo … たくさんの関係者へのリンクを埋め込んだモデル。例：bookモデルは多数の関係者（著者と読者）へのリンクを含む。それぞれのリンクはポリモーフィックである。
  * ReferencesMany … 特に説明がない
Pythonエラー一覧（日本語）

#英語が分からないからエラーを読まない。
はい、私です。
反省します。
日々ここにpythonエラーを(正確性より分かりやすさ重視）をストックしていきます。
皆さんの力もお貸しいただいて、猿でも分かるエラー辞典を作りたいと思います。
カテゴリーはエラー内容で分けます。ページ内検索を使ってエラーをコピペしたら飛べるようにしたい。
エラーを制するものはプログラミングを制する。

##Syntax系(SyntaxError)
`SyntaxError: invalid syntax`
構文間違ってるよ・・。
（'がなかったりそもそも構文を勘違いしてたりの単純な間違いが多い）

`SyntaxError: duplicate argument 'x' in function definition`
関数の引数'x'が重複してるよ！確認してみて

`SyntaxError: keyword argument repeated`
(関数呼び出し時など)引数のキーワードが重複してるよ！

`SyntaxError: EOL while scanning string literal`
'や"で締められてないよ！ちゃんと'や”を入力しよう！
例）`print('x)`

`SyntaxError: Missing parentheses in call to 'x'`
'x'を呼び出すのには括弧が必要です。括弧を付けてください。
よくあるのはpython2.X系ではステートメントだったprintやexecなどがpython3.x系では関数になっているので、その間違いで怒られる事があります。



##Name系(NameError)
`NameError: name 'X' is not defined`
そんな名前で定義されてるものなんてないよ！綴り間違ってるかもよ。

##Indentation系（IndentationError)
`IndentationError: unexpected indent`
いらない所にインデント（行頭に空白で字下げすること）がある。

`IndentationError: unindent does not match any outer indentation level`
インデント（行頭に空白で字下げすること）が一致してないでしょ！
ちゃんと上のインデントと見比べてみてよ。

`IndentationError: expected an indented block`
インデント（行頭に空白で字下げすること）がない。。。
ちゃんとインデント入れて！！！！！！！！！！

##Type系(TypeError)
`TypeError: 'x' object is not callable`
'x'オブジェクトが呼び出せない！！
listやstrなどの名前を変数に使ってしまいその後list(X)という感じでリスト化しようとしたら怒られるありがちなエラー。

`TypeError: f() takes exactly 'x' arguments ('y' given)`
f関数はx個引数設定されているのにy個指定して呼び出してるぞ！（引数の数が合ってない）

`TypeError: ord() expected string of length 1, but int found`
ord関数は文字に使う物なのに数字が引数に使われてるよ！（英語から推察）

`TypeError: unhashable type`
可変オブジェクト(listなど）をディクショナリーオブジェクトのKeyに入力した時などに現れるエラー

##Import系(ImportError)
`ImportError: No module named`
そんなモジュールねーよ！どうなってんだ！

##Attribute系(AttributeError)
`AttributeError: 'X' object has no attribute 'Y'`
'X'オブジェクト(Xにはstrやmoduleなどの型名が入ります)は'Y'という属性なんて持ってないよ！
本当にXはYという属性を持っているか、スペルミスしていないか確認しましょう。

##UnboundLocal系(UnboundLocalError)
`UnboundLocalError: local variable 'X' referenced before assignment`
ローカル変数'X'が定義される前に使用されてるよ！
関数内で値の代入が行なわれている場合は代入式がどこに記述されていてもその変数はローカル変数とみなされるので注意が必要です。
El CapitanのVMでJISキーボードを認識させる

VMware Fusion 8.1でEl Capitanの仮想マシンをインストールしたら101キーボードとして認識されてしまったので、JISキーボードとして認識させるためのメモ。

1.編集対象のVMをシャットダウンする。
2.VMのパッケージ内にある、拡張子がvmxのファイルに下記を追記して保存する。
`keyboard.vusb.enable = "TRUE"
keyboard.vusb.idVendor = "0x0000"
keyboard.vusb.idProduct = "0x0000"`
3.VMを起動するとキーボード設定アシスタンスが起動するので、指示に従って操作する。

以上でJISキーボードとして認識されます。ただ、英数キーとかなキーで入力モードの切り替えができないでいます。

ご参考になれば。
今年読んだSwift関連の良記事7選

~~Advent Calendarに空きがあって完走の危機だったので、~~今年読んだSwift周りで良かった記事(資料)7選を一言コメント付きでご紹介します。

せっかくなので、Qiita以外から選びます(　´･‿･｀)

# [Swiftオープンソース化の衝撃 - Hatena Developer Blog](http://developer.hatenastaff.com/entry/swift-goes-open-source)

今月オープンソースとして公開されたことや、Swift 3についてとてもよくまとまっています。

# [RxSwift/Rx.playground](https://github.com/ReactiveX/RxSwift/tree/master/Rx.playground)

記事じゃ無いですが(　´･‿･｀)

11月くらいに[ReactiveX/RxSwift](https://github.com/ReactiveX/RxSwift)への乗り換え(それまでは[ReactKit/SwiftTask](https://github.com/ReactKit/SwiftTask)でそれも良かったです)をしたのですが、このPlaygroundが[Reactive Extensions](http://reactivex.io)の理解にとても役立ちました。

以前C#メインだったときも少しかじってたものの、今いち理解出来ていないところがあったのですが、それを乗り越えられた気がしています。

<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr">RxSwiftのPlaygroundドキュメントありがたや(　´･‿･｀)&#10;&#10;<a href="https://t.co/xrVFQuXfpX">https://t.co/xrVFQuXfpX</a> <a href="https://t.co/es8KjB21Kz">pic.twitter.com/es8KjB21Kz</a></p>&mdash; M Ono (@_mono) <a href="https://twitter.com/_mono/status/673718293266497536">December 7, 2015</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# [Reference vs Value Types in Swift: Part 1/2 - Ray Wenderlich](http://www.raywenderlich.com/112027/reference-value-types-in-swift-part-1)

値型について良くまとまっています。
`copy-on-write`についても触れられてて良いです。
[Part2](http://www.raywenderlich.com/112029/reference-value-types-in-swift-part-2)もありますヽ(・ω・｀）

~~多分こちらと同じようなこと書いてあるはずです(ざっとしか観てない)~~内容はほぼ一緒なものの説明の仕方が少し違っていました:
[Building Better Apps with Value Types in Swift - WWDC 2015 - Videos - Apple Developer](https://developer.apple.com/videos/play/wwdc2015-414/)

# [Swift および Objective-C を使用した iOS メモリー管理で絶対に失敗しないための 7 つのヒント](http://www.ibm.com/developerworks/jp/mobile/library/mo-ios-memory/)

メモリ管理周りの説明やそのデバッグ法など、これまで見た中ですごく良くまとまっていると思いました。

[エキスパートObjective-Cプログラミング](https://www.amazon.co.jp/dp/4844331094?tag=mono0926-22)も、SwiftではなくObjective-Cの本ですが、より詳しく説明されていて、メモリ管理の概念については一緒なのでオススメです。

# [swift/docs at master · apple/swift](https://github.com/apple/swift/tree/master/docs)

@koher さんのつぶやきで知りましたが、これは良い情報が詰まってそうです。
まだほとんど見られてないですが（´・ω・｀）
例えばArrayの仕様はこちらに書かれています:
[swift/Arrays.rst at master · apple/swift](https://github.com/apple/swift/blob/master/docs/Arrays.rst)

<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr">今まで気付いてなかったけど、↓にこれまで秘密に包まれていた、 Swift の言語仕様がなんでそうなっているのかが書かれている？！&#10;<a href="https://t.co/8ghmsVMNaD">https://t.co/8ghmsVMNaD</a></p>&mdash; koher (@koher) <a href="https://twitter.com/koher/status/676928612227022848">December 16, 2015</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


# [Swift 2.0 大域関数の行方から #swift2symposium](http://www.slideshare.net/tomohirokumagai54/swift-20-49927701)

Swift 2発表後わりとすぐに上がってきた資料なのに、Protocol Extensions周りがすごくまとまっていて、ありがたかったです。こういうのあるとキャッチアップ捗りますね。

---

# 終わりに

> せっかくなので、Qiita以外から選びます(　´･‿･｀)

この縛りがつらい、と思うくらいQiitaに良記事がたくさんあったなあと思いました(　´･‿･｀)
ただ、それは[Swiftタグ](http://qiita.com/tags/Swift)の人気のものなど見れば追いやすいので除きました。
Qiitaは日本語オンリーなのに、[MediumのSwiftタグ](https://medium.com/tag/swift)などにも質・量ともに引けを取らない感じで素晴らしいですね :tada:
null + null は "nullnull"

```java:Main.java
public class Main {
    public static void main(String... args) {
        String a = null;
        String b = null;

        Object c = a + b;
        
        System.out.println(c);
        System.out.println(c.getClass());
    }
}
```

```text:実行結果
nullnull
class java.lang.String
```

逆コンパイルすると、理由が分かる。

```java:Main.jad
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   Main.java

import java.io.PrintStream;

public class Main
{

    public Main()
    {
    }

    public static transient void main(String args[])
    {
        String s = null;
        String s1 = null;
        String s2 = (new StringBuilder()).append(s).append(s1).toString();
        System.out.println(s2);
        System.out.println(s2.getClass());
    }
}
```

`StringBuilder` の `append()` に置き換えられているからですね。

ちなみに、以下はコンパイルエラー。

```java:Main.java
public class Main {
    public static void main(String... args) {
        Object c = null + null;

        System.out.println(c);
        System.out.println(c.getClass());
    }
}
```

```text:コンパイル結果
> javac Main.java
Main.java:3: エラー: 二項演算子'+'のオペランド型が不正です
        Object c = null + null;
                   ^
  最初の型: <null>
  2番目の型: <null>
エラー1個
```

以下ならコンパイルは通る（結果は同じ）。

```java:Main.java
public class Main {
    public static void main(String... args) {
        Object c = (String)null + null;

        System.out.println(c);
        System.out.println(c.getClass());
    }
}
```
if文の評価結果がfalseでもif文内部で定義した変数は作られる


この動き知らなかった。

```ruby
if false
  var = 'var'
end

p var
# => nil
```

if文の評価結果がfalseの場合、if文内部は実行されないので`NameError（undefined local variable or method..）`が発生すると思っていた。

少し調べてみたところ、『[プログラミング言語 Ruby](https://www.oreilly.co.jp/books/9784873113944/)』の第4章（P92）に該当する部分が書かれていたので引用する。

> Rubyインタープリタが変数に対する代入式を検出すると、その変数は存在するようになる。
> 実際にその代入が行われなくても、変数は作られるのである。
> 作られたが代入されていない変数には、デフォルトの値としてnilが与えられる。例えば次の通り。
> 
> a = 0.0 if false # この代入は絶対実行されない
> print a          # nilを表示: 変数は存在するが代入されていない
> print b          # NameError: bという名前の変数、メソッドは存在しない

インタープリタに検出されているかどうか、という話のよう。

ちなみに、if文の評価結果がtrueの場合は値が代入された状態の変数ができる。この動きは個人的には直感的というか理解して使っていたと思う（しかし、Perlとかだとif文が変数スコープを作るのでまた違うみたい）。

```ruby
if true
  var = 'var'
end

p var
# => "var"
```

ついでにPHPではどうなるか見てみた（PHP5.4.43なので少し古い）。

```php
<?php
if (false) {
    $var = 'var';
}

echo $var;
# => PHP Notice:  Undefined variable: var in ...
```

```php
<?php
if (true) {
    $var = 'var';
}

echo $var;
# => "var"
```

PHPの動きは、これまでの自分のイメージ通りだった。
ownCloud と Libreoffice Online 

結構あちこちで話題？になっていますが、Collabora office で ownCloud とLibreoffice Online の開発版が出ているので、ちょっと動かしてみました。

Collabora Online Development Edition (CODE) - Collabora Productivity
https://www.collaboraoffice.com/code/

Webブラウザ上で動作するLibreOffice「CODE」、初期バージョンがリリースされる | OSDN Magazine
https://osdn.jp/magazine/15/12/18/065700

Webブラウザでワープロや表計算が使えるオープンソースの「LibreOffice Online」、開発者向けディストリビューションが公開。ownCloudもバンドル － Publickey
http://www.publickey1.jp/blog/15/weblibreoffice_onlineowncloud.html

英国政府、LibreOffice導入へ | スラド オープンソース
http://opensource.srad.jp/story/15/10/24/1656200/

新しいスプレッドシートを開いて、日本語を入力、閉じるまでをgifアニメにしました。

![2015-12-26_12-55-01.gif](https://qiita-image-store.s3.amazonaws.com/0/15176/e61d0d4b-7952-61a8-b399-4c1150b607d4.gif)
instanceOfとgetClassの比較

# 初めに
instanceOfは知っているが、やりたいことができるか検証してみたときの残骸です。
ついでに、equalsのオーバーライド時に、instanceOfとgetClass()のどちらで実装しようか、考える機会があったので比較してみました。
我ながら、instanceOfなんて今更だな－、と思いつつ。

# クラスの定義

```java:InstanceOfTest.java
private interface Interface{}

private class ClassBase{}

private class ClassSub extends ClassBase{}

private class ClassInterface extends ClassBase implements Interface{}

//    ClassBase     Inferface
//    ↑       ↑        ↑
// ClassSub   ClassInterface


```

# 結果
```java:InstanceOfTest.java
@Test
public void instanceOf(){
	// 同じClassBase型として、宣言する
	ClassBase base = new ClassBase();
	ClassBase sub = new ClassSub();
	ClassBase inter = new ClassInterface();

	assertThat(base instanceof Interface, is(false));
	assertThat(sub instanceof Interface, is(false));
	assertThat(inter instanceof Interface, is(true));

	Class classTest = sub.getClass();
	assertThat(classTest.isInstance(base), is(false));
	assertThat(classTest.isInstance(sub), is(true));
	assertThat(classTest.isInstance(inter), is(false));

	assertThat(sub.getClass() == ClassSub.class, is(true));
	assertThat(sub.getClass() == ClassBase.class, is(false));
	assertThat(sub instanceof ClassBase, is(true));
	assertThat(sub instanceof ClassSub, is(true));

	assertThat(iClass instanceof Interface, is(true));
	assertThat(iClass instanceof ClassInterface, is(true));
	assertThat(iClass instanceof ClassBase, is(true));
	assertThat(iInter instanceof Interface, is(true));
	assertThat(iInter instanceof ClassBase, is(false));
}
```

# で、何をやりたかったかというと
データの内容に問題がないか検証するメソッドをChain of Responsibilityパターン(以下、CoRと略す)で実装した。基本データの内容だけで検討するのだが、後の要件でデータの生成方法によって、チェック項目が追加されることになった。できれば今更データの型を修正したくないので、生成時にチェックする内容をデータ自体にもCoRのチェックとして使用しているinterfaceの実装として持たせました。そして「チェックする内容が追加されたクラス」かを判断し内容を検証するResponsibilityを追加しました。
kicadで名刺基板をつくってみた！

kicadで名刺を作る？？と思ったあなた！

基板名刺を作ってみませんか？

#kicadとは？
基板の回路をつくるためのソフトウェアです。
オープンソースで開発されていて現在kicad 4.0のバージョンが最新で、押しのけ配線など有料のソフトウェアと引けを取らないくらい複雑なことでもできます。
ほかにもフリーのソフトウェアでEagleなどがあります。

#kicadで名刺をつくるまで
あくまで個人的な作り方です。自分にあったやり方でやってみる方はやってみてください。
##名刺のイラストと回路のアイデア
光らせたいなとか、こんなことしたいなとアイデアを出してこんな配線すればいけるかな？と試行錯誤を紙でするのがおすすめ
![IMG_20151226_124039.jpg](https://qiita-image-store.s3.amazonaws.com/0/97208/22c5b9c4-85ae-204b-f609-d5f180ef8f7c.jpeg)

##名刺のイラストをkicadに変換
イラレやペイントなどで名刺のイラストをかいてみてください！
イラストを描いたらそれをはやしよのすけさん@YonosukeHayashi　さんが作っている、ビットマップからkicadで読み込めるようにしてくれるツールを使ってkicadで読み込みます。
使い方は[はやしよのすけさんのブログ](http://ameblo.jp/aretaumitohirunosunahama/entry-11980985960.html)を読んでみてください。

##kicadで回路を作る
ここの部分はkicadの本 	[Amazon](http://www.amazon.co.jp/dp/4789849279/ref=as_sl_pc_tf_lc?tag=yoneken05-22&camp=1027&creative=7407&linkCode=as4&creativeASIN=4789849279&adid=18RMJVPZW8RTMNTNB9NF&&ref-refURL=http%3A%2F%2Fkicad.jp%2F)こちらを参考にしてみてください！
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/97208/59c91be4-c086-0ca2-c6c4-292fc7fdf91a.png)

##基板を発注する！
初めての方は[スイッチサイエンス](https://www.switch-science.com/pcborder/)さんあたりでやるのがお勧め

#完成！
努力して完成した作品がこちら！
名刺基板はそれ単体でもネタになるので面白いですし、ちゃんと回路を考えれば光る名刺を作れたり、音が鳴る名刺が作れたりするので、ぜひ作って遊んでみてください！![IMG_20151226_124351.jpg](https://qiita-image-store.s3.amazonaws.com/0/97208/82104936-34b5-42f2-f910-dedb6f0b5d7c.jpeg)
自宅サーバのDockerでDNSを運用する

自宅サーバを持っていると、外では自宅のIPアドレス、家ではローカルIPアドレスでアクセスなければならず、今まではhostsを直接書き換えるスクリプトを運用していた。しかし、それではiPadなどのモバイル端末では通用しないこともあって、DNSサーバを立てることにした。

Bind9のDockerイメージを作っている人もいたが、うまくいかなかったので、Debianのイメージから作ることにした。

```Dockerfile:Dockerfile
FROM debian:8.1
RUN apt-get update
RUN apt-get install -y bind9
ADD * /etc/bind/
ENTRYPOINT service bind9 start;tail -f cat /var/log/faillog
```

dockerコマンドはMakefileに記述して、直接入力しないようにしている。毎回buildし直すのはだるいので、トライアンドエラーをやっているときは、cpでファイルを入れてrestartで起動するようにしている。

```Makefile:Makefile
build:
	docker build -t bind .
run:
	docker run -d --name bind --restart=always --publish 53:53/udp bind
bash:
	docker exec -it bind bash
rm:
	docker rm -f bind
pushconf:
	docker cp ./named.conf bind:/etc/bind/
	docker cp ./named.conf.default-zones bind:/etc/bind/
	docker cp ./named.conf.local bind:/etc/bind/
	docker cp ./named.conf.options bind:/etc/bind/
	docker cp ./db.house.j74th.com bind:/etc/bind/
start: pushconf
	docker start bind
stop:
	docker stop bind
restart: pushconf
	docker restart bind
testyahoo:
	nslookup www.yahoo.co.jp 127.0.0.1
testhouse:
	nslookup house 127.0.0.1
```

まず、`named.conf.local`にzoneを定義する。

```:named.conf.local
zone "house.j74th.com" {
	type master;
	file "/etc/bind/db.house.j74th.com";
};
```

`db.house.j74th.com`にDNSレコードを記述する。

```:db.house.j74th.com
$TTL	604800
@	IN	SOA	house.j74th.com. root.house.j74th.com. (
			      2		; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			 604800 )	; Negative Cache TTL
;
@	IN	NS	house.j74th.com.
@	IN	A	192.168.1.65
```

次に、`named.conf.options`にいかの設定をする。

* 自宅サーバ以外のドメインでは、プロバイダのDNSを見に行くように`forwarders`に記述する。
* `allow-query`にクエリを許可するアドレスとして、自宅内のアドレスを指定する。

```:named.conf.options
options {
	directory "/var/cache/bind";

	allow-query {
		127.0.0.1;
		192.168.1.0/24;
	};

	forwarders {
		プロバイダのプライマリDNS;
		プロバイダのセカンダリDNS;
	};

	dnssec-validation auto;

	auth-nxdomain no;    # conform to RFC1035
		listen-on-v6 { any; };
};
```

これで、あとはdockerコマンドを叩く。

```bash
make build
make run
```

なぜか、一度リスタートしなければうまく動かなかった。

```bash
make bash
service bind9 restart
```

これで後は、ルータが見に行くDNSをこのDockerサーバのDNSに変更する。すると、家の中にある全ての機器で自宅サーバにアクセスできるようになった！
編集距離 (Levenshtein Distance)をpython で求める


編集距離については、ちょっと古いですが伊藤直也さんの記事が参考になります。
簡単にいうと、２つの文字列の近さを数値として表す方法です。

参考: [編集距離 (Levenshtein Distance) - naoyaのはてなダイアリー](http://d.hatena.ne.jp/naoya/20090329/1238307757)

## 準備
python-Levenshtein というパッケージがあったのでそれを入れてみます。

```
$ sudo pip install python-Levenshtein
```

## やってみる

こんな感じのコードを書いてみます。

```python
#!/usr/bin/env python
# coding: utf8

import Levenshtein

string1 = "井上泰治"
string2 = "井上泰次"

string1 = string1.decode('utf-8')
string2 = string2.decode('utf-8')

print Levenshtein.distance(string1, string2)
```

```
$ python levenshtein.py
1
```

日本語でもOKですね。
1文字取り替えれば正解の文字になるので、編集距離は1になります。

僕はpython という文字を入力するのが苦手で気づくとpyhtonとかになってしまっているのですが、
pyhton と python の編集距離は 2になります。(2つの文字を入れ替えると同じになるので）


## おまけ

[ドキュメント](https://rawgit.com/ztane/python-Levenshtein/master/docs/Levenshtein.html) を見ると、他にも、 Jaro-Winkler 距離 の計算とかいろいろできるようですね。

## おまけ2

下記のような感じでMySQLのストアドとして登録しておくと、ORDER BY LEVENSHTEIN(title, "ほげほげ") みたいに
文字の近い順に出してくれるので便利です。
ただし、インデックスは効かないので、全レコード捜査になってレコード数が多いとかなり重いクエリになります。

https://github.com/fza/mysql-doctrine-levenshtein-function



## 関連

[PHP - [マルチバイト対応] レーベンシュタイン距離を求める - Qiita](http://qiita.com/mpyw/items/2b636827730e06c71e3d)
MySQLに割り当てるバッファサイズの計算方法

## 概要
- [このへんの本](https://eure.qiita.com/takuya599/items/c3bca5ae33170f5b4b47#%E8%AA%AD%E3%81%BF%E3%81%AA%E3%81%8A%E3%81%97)を読んで復習がてらに書いてく

## 計算式
- (物理RAMの合計) ― {max_connections x (スレッドバッファによる消費) + グローバルバッファによる消費} > 0
- グローバルバッファ + スレッドバッファで消費されるであろうメモリサイズが物理メモリサイズを超えないようにする
- 物理RAM：[r3.2xlargeで61GB](https://aws.amazon.com/jp/ec2/instance-types/)

## グローバルバッファ(サーバ全体に設定されるオプション)
- すべての接続とクエリに影響する
- mysqldが獲得できるRAMの量を計算し、バッファサイズの合計がこれを超えないようにする

#### オプション
- query_cache_size
- innodb_additional_mem_pool_size
- innodb_buffer_pool_size
- innodb_log_buffer_size
- key_buffer_size

#### 消費メモリ計算式(GB表示)
```
SELECT(@@query_cache_size + @@innodb_additional_mem_pool_size + @@innodb_buffer_pool_size + @@innodb_log_buffer_size + @@key_buffer_size)/(1024*1024*1024);
```

## スレッドバッファ(特定の処理に割り当てられるバッファ)
- サーバが特定の処理を実行しなければならないときに必要に応じて割り当てられる
- 割り当て可能なRAMの量を正確に計算するのは難しい。
- クエリを分析して、どれが大量のリソースを要求しているか調べ、すべての変数の合計結果を計算する

#### オプション(1スレッド1回割り当て)
- read_rnd_buffer_size
- sort_buffer_size
- myisam_mmap_size
- myisam_sort_buffer_size
- bulk_insert_buffer_size
- preload_buffer_size

#### オプション(スレッドごとに複数回割り当てられるもの)
- join_buffer_size
- read buffer size
- tmp_table_size

#### 消費メモリ計算式(GB表示)
- (バッファサイズ)*(特定のクエリに割り当てられたバッファの数)*(並行して実行されるクエリの数)

```
Set @join_tables = スレッド毎にjoinされるテーブル数の平均
Set @scan_tables = スレッド毎に読まれるテーブル数の平均
Set @tmp_tables  = スレッド毎に読まれるtmpテーブル数の平均

SELECT @@max_connections * (@@global.read_rnd_buffer_size +
@@global.sort_buffer_size + @@myisam_mmap_size +
@@global.myisam_sort_buffer_size + @@global.bulk_insert_buffer_size +
@@global.preload_buffer_size + @@global.join_buffer_size * IFNULL(@join_tables,
1)+@@global.read_buffer_size * IFNULL(@scan_tables,1)+
@@global.tmp_table_size * IFNULL(@tmp_tables,1))/(1024*1024＊1024);
```
仮面ライダーゴースト　アイコンピンパターン


##解説

サンタさんが息子に持ってきたので、簡単にピン配列を解析してみました。割り箸の先を削ったツールが便利です。

ピンを押しカチャッと閉めます。複数のピンの場合は同時に押す必要があります。カチっと閉めたらピンは押さえなくても大丈夫です。

##ピン配列

ピン番号は以下になります。

![IMG_0470.jpg](https://qiita-image-store.s3.amazonaws.com/0/14768/be61f408-8918-ef40-886e-f425898ce336.jpeg "IMG_0470.jpg")

##パターン

|123456|ゴースト|
|:--|:--|
|100000|オレ|
|010000|ニュートン|
|001000|ムサシ|
|000100|エジソン|
|000010|ロビンフッド|
|000001|スペクター|
|110000|ノブナガ|
|101000|ツタンカーメン|
|100100|ビリーザキッド|
|100010|ベートーベン|
|100001|ベンケイ|

などなど。

##むにゃむにゃ

やりすぎると息子からのリクエストがめんどくさいので、適当にこの辺にしておきます（笑。
FileMaker - フィールド内容をポップアップヘルプに表示する

今回はポップアップヘルプにフィールド内容を表示する方法です。
標準機能ですので、今回は短めに。

![ポップアップヘルプ.png](https://qiita-image-store.s3.amazonaws.com/0/68589/15afe008-1b8f-7d95-9a1c-0ac964f98e3b.png "ポップアップヘルプ.png")

一覧表示などで、フィールド内容が長い場合に全内容をレイアウト上に表示しきれない場合などに利用しています。
長文が入力されている場合も、画面内に表示出来る量であれば正常に表示できます。

![ポップアップヘルプ2.png](https://qiita-image-store.s3.amazonaws.com/0/68589/fe37a5d6-2ade-12ec-62e8-3805e0e1ad82.png "ポップアップヘルプ2.png")

#設定方法
ポップアップヘルプ欄には計算式を入力できますので、固定のテキスト以外も設定可能です。
これを利用して情報を表示します。

##固定テキストの設定方法
ますは基本的な固定テキストの設定。
インスペクタの「ポップアップヘルプ」欄にテキストを入力すれば、その内容が表示されます。

![基本設定.png](https://qiita-image-store.s3.amazonaws.com/0/68589/38421258-db27-34f6-7b25-5c498bd90845.png "基本設定.png")

##フィールド内容の設定方法
フィールド内容を表示する場合は、Selfを設定することで表示できます。
Selfを使用することで、フィールドのコピーをした場合もそれぞれの項目に合わせた内容が表示されるので再利用しやすくなります。

![項目内容を表示する設定.png](https://qiita-image-store.s3.amazonaws.com/0/68589/e51b3c1a-3cd3-c3a1-f07f-283e4d31cb9a.png "項目内容を表示する設定.png")


説明としては以上です。
計算結果を表示可能なので、その他の項目内容と組み合わせた表示なども可能ですので試してみて下さい。


今回のサンプルは以下の場所に置きましたので、詳しくはファイルを参照して下さい。
記述ミスやバグなど見つけましたら是非お知らせ下さい。
[サンプルファイル](http://it-komons.jp/filemaker/samples/PopupHelp.zip)
Swiftでのthread-safeなデータ操作

# atomic

最近Swiftでもっぱら書くことが多くなり
AtomicReference的なライブラリが欲しく作成してみました。

```langname:Lock.swift
class locker {
	private var l = NSRecursiveLock()
	
	func lock() -> Bool {
		self.l.lock()
		return true
	}
	
	func unlock() {
		self.l.unlock()
	}
	
	func safeCall<R>(f: () -> R) -> R {
		var r: R
		self.lock()
		r = f()
		self.unlock()
		return r
	}
}

```

```langname:Atomic.swift
// lockerを継承して、safeCallで安全に値を扱う。
class AtomicValue <T> : locker {
	private var value: T?

	init(v: T?) {
		self.value = v
	}

	func setV(v: T?) {
		self.safeCall(
			{() in
				self.value = v
			}
		)
	}

	func setV(f: (T?) -> T?) {
		self.safeCall(
			{() in
				self.value = f(self.value)
			}
		)
	}

	func getV() -> T? {
		return self.safeCall(
			{() -> T? in
				return self.value
			}
		)
	}

	func getV_and_SetV(v: T?) -> T? {
		return self.safeCall(
			{() -> T? in
				let r = self.value
				self.value = v
				return r
			}
		)
	}
}
```

# 使い方

```langname:Sample.swift
private var value = AtomicValue <Int> (v: 0)
private var counter: Int {
	get {
		return value.getV()!
	}

	set {
		value.setV(
			{(v: Int?) -> Int? in
				if let vv = v {
					return vv + 1
				}
				return 0
			}
		)
	}
}
```

safeCallの中でlockをすると、dead lockになってしまうので
NSRecursiveLockを使っています。

しかし、Swiftは中々慣れない(。。
失敗しないプロジェクト管理：1.遠くまで見通す


プロジェクトを成功させるにはどうすべきか。プロジェクトを失敗しないようにすればいいのです。ではそもそもプロジェクトの失敗とは何か 
•コスト超過
•スケジュール遅延
•ビジネス目標に達しない
•完成物が使いものにならない

では、何に対しての超過や遅延かというと”当初の見込みと依頼者(以下プロジェクトオーナー)が認識していたこと”からです。 つまり、プロジェクトオーナーの見込みから悪いほうへのギャップがあったプロジェクトを“失敗”とすることに注意してください。忘れてはいけないのは、プロジェクトの成功と失敗を決めのはプロジェクトマネジャーの"あなた"ではなくプロジェクトオーナー（顧客、上司、経営層など)である、ということ。

だから まず大切なのは、判断基準（コストとスケジュール、ビジネス目標とは何か)をまず明確にしてプロジェクトオーナーと合意すること。 意外と実はこれが明確になっていない、優先度が見えてないプロジェクトは多い。 そもそも“当初の見込み”というものを合意してないと、何をやっても「思ってたのと違う！」 ということになりかねないのです。マーケティングの考え方でこんな式があります。

顧客満足度 = 顧客が感じた価値 ―(マイナス) 事前期待値

これはプロジェクト管理においてもあてはまり、最初の期待値を高くもちすぎると終わったあとに”あれっ"ということが往々にしてあるので注意しましょう。

この１つめのポイント"遠くまで見通す"の全体をまとめると。
•Why： 達成したいビジネス上の目標は何か
•What： どういう機能を実現して何ができるようにしたいか
•When： いつリリースして、いつ目標を達成したいか
•Who ： どんなメンバーに参加してもらってよいか
•How(much) ： お金をどれくらいつかっていいか

これらについて、プロジェクト途中での状況変化に対応して自ら正しく理解し、プロジェクトオーナーに同意してもらい、メンバーに伝えることを繰り返すことがポイントの１つめになります。

では、「遠くまで...」とはというのはどういうことでしょうか？

範囲：プロジェクトで取り組む範囲とその境界付近も含めた外側も

時間：ＩＴプロジェクトの場合、リリースではなくビジネスの目的達成もふくめたゴールまでを考える

つまり、自分が与えられた範囲の”少し外側”に届くくらいまで見ておくようにしましょう。ということです。
Condaの使い方メモ

公式サイト：http://conda.pydata.org/docs/index.html

以下は、MAC OSX用のcondaコマンドメモです。
pyenv、anaconda(miniconda)はインストール済みの前提です。

#condaって？
condaは、主にPython用に作られたパッケージ管理システムと環境マネジメントシステムです。
単体ではリリースされておらず、Anaconda、Anacondaサーバー、Minicondaに内包されているものです。
Anaconda、Anacondaサーバー、Minicondaは、Pythonの数値計算環境を構築するために、様々なパッケージをまとめたディストリビューションです。
機械学習ライブラリのパッケージ等を簡単にインストールできます。
Linux、Windows、MacOS等のOS毎のコンパイル等の手間やトラブルをスキップできます。
（参考サイト：http://morimori2008.web.fc2.com/contents/PCprograming/python/pythonAnaconda.html)

#インストール
condaを使用するためには、minicondaかAnacondaをインストールすると使えるようになる。
詳細は、以下のURLを参照

http://conda.pydata.org/docs/installation.html


#仮想環境の作成
詳細は、以下のURLを参照\<\>
http://conda.pydata.org/docs/using/envs.html

```
conda create -n <my env> <install module>
#例：
#  conda create --name snowflakes biopython
```


#作成された仮想環境を確認する

```
conda info -e
```

#作成した仮想環境を実行する
activateコマンドで仮想環境に入れるが、pyenvを使用している場合、pyenvのactivateと、condaのactivateが競合するようなので、実行時はフルパスで実行する。

```
conda info -e
# 上記のコマンド仮想環境のリストを表示して確認し
# 下記のコマンドで仮想環境を有効にする
source <実行したい仮想環境のフルパス>/bin/activate <仮想環境名>

#例：
#  condda info -e
#  # conda environments:
#  #
#  my_env                   /usr/local/opt/pyenv/versions/anaconda3-2.0.1/envs/my_env
#  root                  *  /usr/local/opt/pyenv/versions/anaconda3-2.0.1
#  source /usr/local/opt/pyenv/versions/anaconda3-2.0.1/envs/my_env/bin/activate my_env
```

#activateして実行中の仮想環境から抜けたい
既に実行環境内にいるので、フルパスは必要ない

```
source deactivate
```

#仮想環境の削除
仮想環境を完全に削除するコマンドは以下


```bash:
conda remove -n <my_env> --all
```