OmniAICreator/Qiita-1.07M huggingface dataset:
ぬくぬくReact学習記(2)

Reactのお勉強2日め。今日もがんばる。
1日め => http://qiita.com/zutcho/items/a66245d4d365f5d75103

## controlling componentとcontrolled component
- 個々のSquareコンポーネントで別々に状態を保持すると、コードの見通しが悪くなる。Squareの親コンポーネントであるBoardコンポーネントに、配列ですべてのSquareの状態をもたせる。（BoardはSquareをコントロールしている、SquareはBoardにコントロールされている）
- Squareの状態が変更されたら、SquareはBoardへ状態変化を通知する。Boardは状態変化を受け取り、Squareの状態が格納された配列をアップデートする。
- 具体的には、親コンポーネントが子コンポーネントをrenderするときに、子コンポーネントのイベントコールバックに親コンポーネントのメソッドを指定する。
`return <Square value={this.state.squares[i]} onClick={() => this.handleClick(i)} />;`で、handleClickは親コンポーネントのプライベートメソッド。

## immutabilityについて
- オブジェクトをimmutableに扱うことのメリットはなんとなく知っていた。
- JavaScriptでimmutableにデータ変更を行う方法としては、`slice()`を使う方法、`Object.assign`を使う方法、スプレッド演算子を使う方法などがある。

## functional components
renderメソッドしか持たないステートレスなコンポーネントは、React.Componentをextendせずにfunctionとして書ける。将来的に、functional componentsに対する最適化もされるようだ。

今日はここまで。
メモ: Perl DBI mysql ROW_NUM

```perl
use DBI;

my $database = 'my_database';
my $host	= 'localhost';
my $port	= '3308';
my $db_user = 'user';
my $db_pass = 'pass';

my $dbh = DBI->connect("DBI:mysql:database=$database;host=$host;port=$port", $db_user, $db_pass);

my $sth = $dbh->prepare(
'SELECT @rownum:=@rownum+1 as ROW_NUM, TABLE_NAME '.
'FROM information_schema.TABLES A, '.
'(SELECT @rownum:=-1) B '.
'WHERE table_schema=database() '
);
$sth->execute;
for(my $i = 0; $i < $sth->rows; $i++){
	my @row = $sth->fetchrow_array;
	print "\t", $row[0], "\t", $row[1], "\n";
}
$sth->finish;
$dbh->disconnect;
```

<span class='label label-default'>参考ページ</span>
[MySQLのSELECT結果に行番号を振る。](http://qiita.com/koitatu3/items/851f08a36381a4f01b75)

``SET @rownum := -1;``使うと怒られるんじゃー！

C#だと``"Allow User Variables=True"``で``SET``が使えるんだそうな。
YesodでDBアクセスするときのトランザクション境界

Yesod Advent Calendar 2016の16日目です。
YesodでのDB操作についての話題です。

# トランザクションの境界

```runDB ```関数でまとめた操作は同一トランザクションで実行されます。

```hs
_ <- runDB $
         insert ...
         >> insert ...
         >> update ...
         >> delete ...
```

ですので、runDBから複数の戻り値を返すには少し工夫が必要です。

一番簡単なのはタプルを使うことでしょう。

```hs
tuple <- runDB $ do
             retA <- selectList ...
             retB <- selectList ...
             return (retA, retB)
```
RFIDという技術について

この記事は[WHITEPLUS Advent Calendar 2016](http://qiita.com/advent-calendar/2016/whiteplus) 16日目になります。

こんにちは。株式会社ホワイトプラス、エンジニアインターンの @ksbababa  です。

ホワイトプラスでは主にAndroidアプリ開発や新規技術調査に関わらせていただいております。

今回はRFIDという技術についてざっくりと説明したいと思います。

#RFIDとは

>RFID（英: radio frequency identifier）とは、ID情報を埋め込んだRFタグから、電磁界や電波などを用いた近距離（周波数帯によって数cm～数m）の無線通信によって情報をやりとりするもの、および技術全般を指す。 
(wikipediaより)

すごくあやふやですね。
ご存知の方は多いと思いますが、RFIDという技術は決して新しい技術ではありません。

しかし、スマートフォンが普及した現在、RFIDタグのリーダとスマートフォンを接続することによって、以前とは違った利用の可能性が出てくるのではないかという期待があります。

#RFIDの歴史
第2次世界大戦中、イギリスで敵機と味方機を識別する為に生まれたのが始まりだと言われており、日本では1980年代から工場の自動化を目的として利用され始めました。
2000年以降ではETCやSuicaなどが登場し、身近な技術となりました。
ウォルマートの商品管理にRFIDタグが導入されたという話は有名なので聞いたことがある方もいると思います。

#RFIDの種類
##アクティブタグかパッシブタグか
アクティブタグは自ら電波を発するタグを指し、パッシブタグというのはリーダ等の電波を受け、その電力によって動作し、通信を行うタグを指します。
アクティブタグの方が通信距離は伸びますが、パッシブタグの方がコスト面で有利という特徴があります。

##利用する周波数の違い
###代表的な周波数帯
+ 130～135kHz帯
+ 13.56MHz前後：　Suicaはこの周波数帯に当たります。
+ 900MHz帯・2.45GHz：　UHF帯とも呼ばれ、利用が注目されていました。

以下では主にUHF帯を利用するパッシブタグについて考えます。

#類似の技術
###バーコード
現代において情報識別タグとして最もよく使われているのはバーコードだと思います。
紙に印刷できるのでコストは低く抑えられ、使い捨ての識別タグとしても優秀です。
ただし、情報を読み取るにはバーコードが表示されている面をこちらに向ける必要があります。

###iBeacon(Bluetooth)
また、iBeaconという技術があります。
これはBluethoothを利用した技術で、RFIDタグと同じように無線で情報通信を行います。
アクティブタグでありながら、消費電力は低く抑えることができるのも魅力です。

##RFIDの優位点
パッシブタグの場合だとiBeaconに比べて当然RFIDタグは安価に製造できます。（大量に導入すれば尚更）
それでいてバーコードとは違い電波が届きさえすれば通信を行うことができます。

##RFIDの欠点
まずUHF帯を利用していると金属や水の干渉に弱いです。
その為、設置箇所、利用環境に配慮をしなければ思ったような動作をしないことがあります。
また、倉庫管理など大規模なシステムに利用されることが多いため、あまりホビー向けの情報や商品が出回っておらず、気軽に試せません。
リーダも出力を上げようとすれば無線局の申請が必要だったりと面倒なことが多いですね。

#まとめ
以上、本当にざっくりとRFIDの話をさせて頂きました。話が散らかってしまって申し訳ないです。
冒頭で述べた通り、新しい技術ではありませんが、新しい技術と組み合わせることで色々な可能性が生まれる気がするので、興味を持った方、何か思いついた方は是非詳しく調べてみて下さい。

#ホワイトプラスではエンジニアを募集しています
ホワイトプラスでは、[新しい技術にどんどん挑戦したい！という技術で事業に貢献したいエンジニアを募集](https://www.wantedly.com/projects/69257)しております。
技術英語 > You can never be sure about the effect of an optimization [until you measure the effect]. / half measure

@ Code Complete (No. 19561 / 36077)

> You can never be sure about the effect of an optimization <font color=red>until you measure the effect</font>.

最近読んだブログで「部分最適化」と「全体最適化」の話があった。
部分最適化にこだわって、パフォーマンスに大きな影響を与える全体最適化に躊躇する、というようなことが書かれていた。

<hr>
measure関連で見つけたのは
half measure

https://www.merriam-webster.com/dictionary/half%20measure

> :  a partial, halfhearted, or weak line of action <victory is seldom won by half measures>

下にコメントがあり
> Bhagwat Adhikari · Tribhuvan University
> Heard while watching "An inconvinient truth" by Al. Ghor.

アル・ゴアの映画「不都合な真実」で使われていたようだ。

上記の意訳「部分的、気乗りしない、弱い作用線???」
PhanでPHPのコーディング規約を自動チェックしよう


[再演: 「PHP7で堅牢なコードを書く - 例外処理、表明プログラミング、契約による設計」 + α](https://saien.connpass.com/event/45318/)という勉強会で、「assertぐらいでエバルんじゃねえ！」というふざけたタイトルで発表してきました。

資料はこちら。

https://speakerdeck.com/edvakf/assertguraideebarunziyanee

PHP7では内部的にASTを作るようになりまして、それをPHP側から使えるようにする[php-ast](https://github.com/nikic/php-ast)というC拡張があります。これを使って型推論つきの静的解析をするツールが[Phan](https://github.com/etsy/phan)です。

Phanでは未定義変数や型に関する間違いを警告してくれるのですが、そういう明らかなバグの他にも自前のプラグインを作ってエラーをチェックすることができます。

スライドの趣旨としては、assertの話から入るものの、assertのことが主題ではなく、Phanを使ってコードの自動チェックを充実させようという内容です。

## Phanプラグインの作り方

Phanプラグインの書き方は一応[ドキュメント](https://github.com/etsy/phan/wiki/Writing-Plugins-for-Phan)があるのですが、詳しくないのでコードを読む必要があります。

今回のスライドで使ったプラグインの場合は、プロジェクトの `.phan/plugins` ディレクトリに次のようなファイルを置いて、

```php
<?php declare(strict_types=1);
# .phan/plugins/NonBoolAssertPlugin.php

use Phan\AST\AnalysisVisitor;
use Phan\CodeBase;
use Phan\Language\Context;
use Phan\Language\UnionType;
use Phan\Plugin;
use Phan\Plugin\PluginImplementation;
use ast\Node;
use Phan\Issue;

class NonBoolAssertPlugin extends PluginImplementation {

     public function analyzeNode(
         CodeBase $code_base,
         Context $context,
         Node $node,
         Node $parent_node = null
     ) {
         (new NonBoolAssertVisitor($code_base, $context, $this))(
             $node
         );
     }
}

class NonBoolAssertVisitor extends AnalysisVisitor {

    /** @var Plugin */
    private $plugin;

    public function __construct(
        CodeBase $code_base,
        Context $context,
        Plugin $plugin
    ) {
        parent::__construct($code_base, $context);

        $this->plugin = $plugin;
    }

    public function visit(Node $node)
    {
    }

    public function visitCall(Node $node) : Context
    {
        $expression = $node->children['expr'];

        if ($expression->kind === \ast\AST_NAME &&
            $expression->children['name'] === 'assert'
        ) {
            $union_type = UnionType::fromNode($this->context, $this->code_base, $node->children['args']->children[0]);
            if ($union_type->serialize() !== "bool") {
                $this->plugin->emitIssue(
                    $this->code_base,
                    $this->context,
                    'PhanPluginNonBoolAssert',
                    "Non bool value passed to assert"
                );
            }
        }

        return $this->context;
    }
}

return new NonBoolAssertPlugin;
```

`.phan/config.php` にこのような記述を追加すれば良いです。

```
    'plugins' => [
        '.phan/plugins/NonBoolAssertPlugin.php',
    ],
```
dockerコンテナ(alpine)からwindowsの共有フォルダをmount

* [Docker run reference - Docker](https://docs.docker.com/engine/reference/run/)
* [windowsの共有フォルダをマウント - Qiita](http://qiita.com/tukiyo3/items/ff352d45e56e13a39a74)

```bash
docker run --rm \
 --cap-add DAC_READ_SEARCH \
 --security-opt apparmor:unconfined \
 -it alpine:3.4 /bin/sh
```

```bash:cifs-utils
apk update && apk add cifs-utils
mount -t cifs -o username=ユーザ名,ro //192.168.1.3/shared /mnt
ls /mnt
```
Pythonでオイラーの公式を読み解く


## はじめに
遅くなりましたがこの記事は、[数学 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/math) 12日目の記事です。

## オイラーの公式とは

```math
e^{i\theta} =\cos\theta +i\sin\theta
```

出典: [オイラーの公式 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%A4%E3%83%A9%E3%83%BC%E3%81%AE%E5%85%AC%E5%BC%8F)

> ここで e は指数関数、i は虚数単位、cos, sin はそれぞれ余弦関数および正弦関数である。任意の複素数 θ に対して成り立つ等式であるが、特に θ が実数である場合が重要でありよく使われる。θ が実数のとき、θ は複素数 eiθ がなす複素平面上の偏角（角度 θ の単位はラジアン）に対応する。

オイラーの公式の証明に関しては、割愛しますがこの記事などがわかりやすいかと思います。
[オイラーの公式とは何か？オイラーの等式の求め方の流れを紹介します](http://atarimae.biz/archives/10492)

## 複素平面での比較

ここではPythonを用いて両辺を複素平面上に描写して、等しい単位円になるか比較します。

複素平面への描写に関しては、[行列プログラマー](https://www.oreilly.co.jp/books/9784873117775/)で紹介されている[plotting.py](http://resources.codingthematrix.com/plotting.py)を利用しました。

ちなみに虚数iはPythonでは`j`と表現します。

```
>>> j
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'j' is not defined
>>> 1j
1j
>>> type(1j)
<type 'complex'>
```

それではオイラーの公式の両辺を、複素平面に落とし込みます。

```左辺
>>> from plotting import plot
>>> from math import e, pi
>>> L1 = {e**(1j*theta) for theta in range(0, 360)}
>>> plot(L1)
```

```右辺
>>> from plotting import plot
>>> from math import sin, cos
>>> L2 = {cos(theta) + 1j * sin(theta) for theta in range(0, 360)}
>>> plot(L2)
```

plotしてみると左辺・右辺どちらも次のような単位円となり、等しいことが見てわかりました！

![スクリーンショット 2016-12-16 4.08.58.png](https://qiita-image-store.s3.amazonaws.com/0/19111/3cdc5a29-00e8-2431-22e9-cda82f4a9ab5.png "スクリーンショット 2016-12-16 4.08.58.png")

## おわりに

この話は[行列プログラマー](https://www.oreilly.co.jp/books/9784873117775/)第1章のなかで取り上げられています。
PDF版: http://codingthematrix.com/slides/The_Field.pdf

この本は物理的にも内容的にも重いですw
[公式サイト](http://codingthematrix.com/)でもPDF版が公開されているので、興味ある方は一度覗いてみてはいかがでしょうか。
無名関数(Closure)をプロパティで持つ時に気をつけないといけない話

# 問題

例えばこういうコード。

```php:1
class Klass {
  public function __construct() {
    $this->f = function(){};
  }
}
```

PHPのクロージャではuseで指定したものしか基本的には束縛されないんですが、PHP5.4以降では[$thisは敢えてuseしなくても暗黙的に束縛される](http://php.net/manual/ja/functions.anonymous.php)ようになっています。

```php:1の明示的なコード
class Klass {
  public function __construct() {
    $this->f = function() use ($this) {};
  }
}
```

このコードで問題になりうるのは、クロージャが\$thisへの強参照を持ち\$thisもクロージャへの強参照をもっていて、循環参照になってしまう事です。これによって

1. [循環参照コレクタ(PHP5.3以降)](http://tanakahisateru.hatenablog.jp/entry/2016/06/28/151938)がいつか動き出すまで開放されず、それまでメモリを圧迫してしまう(大きなサイズのオブジェクトが循環参照になっているとGC_ROOT_BUFFER_MAX_ENTRIESへ達する前にallocate失敗して死ぬ？)
2. 循環参照コレクタがいつか動き出すまで開放されず、それまで[デストラクタの起動が遅れる](http://blog.tojiru.net/article/294530614.html)

といった問題が起こりえます。

ところでPHP5.5以下は2016/07/10に[公式のセキュリティサポートが終わっていて](http://php.net/supported-versions.php)使っている人も少ないと思うので、ここでは考慮しません。

# 対策

## 弱参照を使い強参照を片方向にする

http://php.net/manual/ja/book.weakref.php

SwiftやObjective-Cにおけるweakプロパティとかunsafe_unretainedプロパティとかみたいなやつですねたぶん。中身読んでないのでよくわかりません。[PECL](http://php.net/manual/ja/weakref.installation.php)なので別途インストールが必要みたいなんですが使ってる人どれぐらいいるんでしょうかよくわかりません。

## 必要がなければ$thisを束縛しない

```php
class Klass {
  public function __construct() {
    $this->f = static function(){};
  }
}
```

とstaticキーワードを使えば暗黙的な\$this束縛を行わないクロージャも作れるんですが、ただでさえfunctionキーワードが長いのにさらにstaticを付けないといけないとかちょっと嫌ですね。

```php
public function __construct(int $n, callable $f) {
  $this->n = $n;
  $this->f = $f->bindTo(null);
}

public static function of(int $n) {
  return new self($n, function () {});
}
```

もしくは、外から(あるいは内の別メソッドから)貰う場合、プロパティへ入れる前に[Closure Closure::bindTo ( object $newthis [, mixed $newscope = "static" ] )](http://php.net/manual/ja/closure.bindto.php)メソッドで\$thisを剥がしてstatic化した複製を作る事も出来ます。(外から付いてくるのは\$thisではなく\$thatと呼ぶべき？)

## $thisを複製して束縛する

```php
public function __construct(int $n, callable $f) {
  $this->n = $n;
  $that = clone $this;
  $this->f = $f->bindTo($that);
}
```

複製してしまうと以降の\$thisの変化は反映されなくなりますが、それでも大丈夫な用途であれば。

## Stored PropertyではなくComputed Propertyを使う

```php
    public function __construct($n)
    {
        $this->n = $n;
    }

    public function f()
    {
        // Klass への参照が必要ならここで use する
        // ただし直接 $this を渡すことはできない
        $instance = $this;
        return function () use ($instance) {
            //
        };
    }
```

コメント欄より。外からアドホックなクロージャをもらって保持しておく用途では使えませんが、ビルトインなクロージャを使いたい時などに。

## プロパティを使わない

Klass内で保持せずに、必要になったら都度毎回クロージャを渡してやるとか。

## クロージャを使わない

例えば、クロージャを避ける

# まとめ

実際の所、PHPはリクエスト終了時に全てを洗い流して世界を作り直すのでバッチは別としてあんまりまじめに気にしなくても良いケースが多いんじゃないかなという気はします。私が問題に遭遇したのはPHPUnitででかい環境をもったクロージャをぶん回すベンチコードでの事です。あまり詳しくないので、誤りがあればご指摘下さい。
MacにHomebrewでAndroid開発環境を整備する

はじめに
====================

タイトルの通り、MacにHomebrewでAndroidの開発環境を作ったときのメモです。


この記事の内容
--------------------

- JDK インストール (homebrew)
- ~~Android SDK インストール (homebrew + GUI操作)~~
- Android Studio インストール (homebrew)
- 環境変数設定

**2016/12/19 修正** Android SDKについては、Android Studioに付属してくるみたいなので、特に入れる必要ありませんでした。

手順
====================

参考
--------------------

下記サイトを参考にさせていただきました。

- [[Mac OS X]Android開発環境を構築する - Qiita](http://qiita.com/shuntaro_tamura/items/371b7b6427734355f3bd)
- [brew caskでJava8をインストール - Qiita](http://qiita.com/shuntaro_tamura/items/60b8c19f62edfd942c2e)
- [橋本商会 » Android開発環境をインストールしなおした](http://shokai.org/blog/archives/6407)
- [OS X に Android Studio をインストールする | CUBE SUGAR STORAGE](http://momijiame.tumblr.com/post/109583268386/os-x-%E3%81%AB-android-studio-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B)


インストール
--------------------

**2016/12/19 修正後**

```sh-session
$ brew cask install java
$ brew cask install android-studio
```

**2016/12/19 修正前**

```sh-session
$ brew cask install java
$ brew install android
$ brew cask install android-studio
```


~~Android SDKのインストール(GUI操作)~~
--------------------

**2016/12/19 修正** 本節不要です。

```sh-session
$ android
```

GUIが起動するので以下をインストールしました。

- Tools
- Extras
- 最新バージョン : Android 7.1.1 (API 25)
- 自端末のバージョン : Android 4.4.2 (API 19)


環境変数の設定
--------------------

環境変数の設定をシェルの設定ファイルに記載し、読み込みます。

```sh-session
$ vi ~/.zshrc
$ source ~/.zshrc
```

```txt:.zshrc
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
export STUDIO_JDK=${JAVA_HOME%/*/*}
```

確認
--------------------

```sh-session
$ java -version
java version "1.8.0_112"
Java(TM) SE Runtime Environment (build 1.8.0_112-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.112-b16, mixed mode)
```
前回作ったHeapArrayを使ってみた

#はじめに
[前回の記事](http://qiita.com/sugunisu/items/5768313e978c64a27268)で配列より高速に動作するpriority queueを作りました
使用例としてdijkstra法の中に実装してみました
今回は**行先とコストをデータとして持つエッジクラスのコストが最小の順で取り出したいので比較式をオーバーロードしなければなりません**
ですが比較式は全て(<,<=,>,>=,==,!=など)を定義する必要は無く
**<=>だけをオーバーロードすればそのすべてに適用されるみたいです**
返り値が負だと「<」,同じだと「==」,正だと「>」に該当します

#実装
```ruby:dijkstra.rb
require './heap'

class Edge
  include Comparable
  attr :to, :cost
  def initialize e
    @to = e[0]
    @cost = e[1]
  end
  def <=>(other)
    return @cost - other.cost
  end
end

pq = HeapArray.new
node=[]
dist=[]

#initialize
n=gets.to_i
n.times do |i| 
  node[i]=[]
  dist<<nil
end
s,g =gets.split(" ").map{|num| num.to_i}

while e=gets 
  e=e.gsub("->"," ").split(" ").map{|num| num.to_i}
  node[e[0]] << Edge.new([e[1],e[2]])
end


dist[s]=0
pq.push Edge.new([0,s])

#dijkstra main loop
while !pq.empty?
  v = pq.pop
  unless dist[v.to].nil?
    next if dist[v.to] < v.cost
  end

  node[v.to].each do |e|
    unless dist[e.to].nil?
      next if dist[e.to] < dist[v.to] + e.cost
    end
#    puts "#{e.to}:#{dist[e.to]} <= #{dist[v.to] + e.cost} = #{dist[v.to]} + #{e.cost} (#{v.to}->#{e.to})"
    dist[e.to] = dist[v.to] + e.cost
    pq.push Edge.new([e.to,dist[e.to]])
  end
#  print "Best Distance (Temporary) : #{dist}\n"
end

puts "The distance using best way of #{s} -> #{g} is ... #{dist[g]}"

=begin
#input example
## first row is a number of node
## second row is a start and end node separated by a space
## and the rest is edge information (<sorce>-><dist> <cost>)
6
0 4
0->1 5
0->2 4
0->3 2
1->0 5
1->2 2
1->4 6
2->0 4
2->1 2
2->3 3
2->5 2
3->0 2
3->2 3
3->5 6
4->1 6
4->5 4
5->2 2
5->3 6
5->4 4
=end
```
作業ディレクトリに[前回の"heap.rb"](http://qiita.com/sugunisu/items/5768313e978c64a27268#プログラム)を入れて動かしてみてください
**empty?メソッドも必要なのでそれも追加してください**

```ruby:heap.rb
  def empty?
    return @heapArr.empty?
  end
```
一応効率が悪いですがpqを配列に書き換えても動きます

HeapArrayクラスが比較演算子を持つにもかかわらずちゃんと動いていることがわかりました
TSUBAME2.5でtheano with cuDNN5

theano 0.8以上でcuDNNを利用する場合、一部においてcuDNNv5以上が必須となります
ex) theano.tensor.nnet.bn.batch_normalization

ところがtsubame上のcuda7.5にinstallされているcuDNNはv4となっています。
この件についてgsicの方にお問い合わせしたところ、以下にCUDA7.5用cuDNN v5がinstallされているとのことです


/usr/apps.sp3/nosupport/gsic/cudnn/5.1-cuda7.5/cuda/


というわけでCUDA7.5を使いながらcuDNNv5の利用ができるっぽいのですが、pathの設定が問題です。cuDNNv5の方が優先されるようにPATHを通しても、TheanoはCUDA側を優先するようです。
探し回った結果、


```pyton:Theano-0.9.0.dev2-py3.5.egg/theano/sandbox/cuda/__init__.py

# 350行目付近
class DnnVersion(GpuOp):                                                                                
    def c_compiler(self):                                                               
        return nvcc_compiler.NVCC_compiler                                                              
                                                                                                        
    def c_headers(self):                                                                                
        return ['cudnn.h']                                                                              
                                                                                                        
    def c_header_dirs(self):                                                                            
        return [config.dnn.include_path]                                                                
                                                                                                        
    def c_libraries(self):                                                                              
        return ['cudnn']                                                                                
                                                                                                        
    def c_lib_dirs(self):                                                                               
        return [config.dnn.library_path]                                                                
                                                                                                        
    def c_compile_args(self):                                                                           
        return ['-Wl,-rpath,' + config.dnn.library_path]
```


なるほどー。というわけで

```bash:.theanorc
[dnn]
include_path=/usr/apps.sp3/nosupport/gsic/cudnn/5.1-cuda7.5/cuda/include                                
library_path=/usr/apps.sp3/nosupport/gsic/cudnn/5.1-cuda7.5/cuda/lib64                                 
enabled=True
```

```python
from keras.layers import Dense,Input,BatchNormalization
BatchNormalization()(Dense(32)(Input(shape=(32,))))

# Elemwise{switch,no_inplace}.0
```
めでたしめでたし
js 文章の切り捨てかた

##お題
・文章(第一引数)が指定された数（第二引数）より長い場合、指定された数で文字を切り捨てる。
・切り捨てた文章には"..."を末尾に付け足す。("..."は文字数に含まれる)
切り捨てる文字が3以下の場合はそのまま"..."を付け足す。

```script.js
function truncateString(str, num) {
 //write your code
}
truncateString("A-tisket a-tasket A green and yellow basket", 11) // "A-tisket..."
```


##出力結果　例

```script.js
("A-tisket a-tasket A green and yellow basket", 11) // "A-tisket..."
("Peter Piper picked a peck of pickled peppers", 14) //"Peter Piper..."
("A-tisket a-tasket A green and yellow basket", "A-tisket a-tasket A green and yellow basket".length) // "A-tisket a-tasket A green and yellow basket"
("A-tisket a-tasket A green and yellow basket", "A-tisket a-tasket A green and yellow basket".length + 2)// "A-tisket a-tasket A green and yellow basket"
("A-", 1)//"A..."
("Absolutely Longer", 2)//"Ab..."
```

##使った関数
[slice()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/slice)


##何も考えずに書いたコード

```script.js
function truncateString(str, num) {
 var j = str.length;
 var l = str.slice(0,num);
 var k = num - 3;
 var m = str.slice(0,k);

  
  if(str.length<=3){
    return l+= "...";
  }else if(str.length<=num){
    return str;
  }else if(num<3){
    return str.slice(0,2) + "...";
  }else{
    m += "...";
    return m;
  }
}
```

```script.js
function truncateString(str, num) {
  if (str.length > num && num > 3) {
    return str.slice(0, (num - 3)) + '...';
  } else if (str.length > num && num <= 3) {
    return str.slice(0, num) + '...';
  } else {
    return str;
  }

}
```

##工夫したコード

```script.js
function truncateString(str, num) {
  if (str.length <= num) {
    return str;
  } else {
    return str.slice(0, num > 3 ? num - 3 : num) + '...';
  }
}
```

##考え方
ひとつめのif　切り捨てる数が文字数と同じ以上の場合は文字列をそのまま返す。
else以下　三項演算子の条件をslice()の終点（第二引数）に設定する。
切り捨てる数が3より大きい場合、　num-3 で文字を切り捨てる。
3より小さい場合、numで切り捨てる。
最後に'...'を付け足す。


####他にもコードが浮かんだ方、コメントお待ちしてます。
OpalでElectronのアプリをつくる(その2)

この記事は[Opal Advent Calendar 2016](http://qiita.com/advent-calendar/2016/opal)の15日目の投稿として書いています。

今日も遅刻ですが、昨日のつづきです。

ここでお詫びがあります。昨日の記事は大分間違いがありました。http://qiita.com/youchan@github/items/d5fda4c6c9b6be4bc2e9#here から後はOpalの本体がコンパイルされたjsファイルに含まれていなくて、いろいろとソースを弄っていますが、これは不要でした。単に

```ruby
require 'opal'
```

とすればよかったというだけでした。
そういうわけで、electron_opalのソースの変更は必要なく、*app/main.rb*に`require 'opal'`という行を追加するだけでよかったということでした。

それを踏まえての今日はウィンドウを表示するようにしましょう。

Qiitaから[このあたり](http://qiita.com/carat_yoshizaki/items/8917fc4350d17a44773d#%E3%82%A2%E3%83%97%E3%83%AA%E5%88%B6%E5%BE%A1%E9%83%A8%E5%88%86%E3%81%AEmainjs%E3%82%92%E4%BD%9C%E6%88%90)の記事を参考にウィンドウを表示するようにしてみましょう。

```ruby:app/main.rb
require 'opal'
require 'native'

electron = Native(`require('electron')`)
app = electron.app

app.on('window-all-closed') {  app.quit unless $$.process.platform == 'darwin' }
app.on('ready') do
  main_window = Native(`new electron.native.BrowserWindow({width: 800, height: 600})`)
  main_window.loadURL("file://#{`__dirname`}/main_window.html")
  main_window.on('closed') { main_window = nil }
end
```

余談ですが、JavaScriptのコードに比べてRubyのコードのほうが気持ちよく書けると思うのは私だけでしょうか?JavaScriptと同等のコードを書くとOpalの書きやすさが体現できるように思います。

electron_opalは**_window.rb*というファイルはコンパイルして*.html*ファイルを用意してくれるようです。

```ruby:app/main_window.rb
require 'opal'
require 'native'

$$.alert("Hello world")
```

とりあえずアラートを表示するプログラムを作ります。

    $ bundle exec rake build
    $ bundle exec rake

![スクリーンショット 2016-12-16 1.10.36.png](https://qiita-image-store.s3.amazonaws.com/0/15093/ab27d68d-e968-87e8-ba3c-31163755b147.png)

どうでしょうか?ウィンドウが表示されましたか?

OKボタンを押して、ウィンドウを閉じてみます。
わたしのマシンはMacなので、`$$.process.platform == 'darwin'`は`true`になります。
`app.quit`が呼ばれないので、コンソールはブロックされたままの状態です。
この判定のロジックはコンソールからの実行を考慮していないためなのか、そもそも`darwin`で`app.quit`を呼んでいけないのかが良くわかりません。この手のサンプルには大体このように書かれているのですが、もとネタがどこなのかもよくわかりませんでした。
今回はここはElectronに関することなので無視しておきましょう。単純に`app.quit`することにします。

今回はここまでです。次回はelectron_opalをOpalの最新のバージョンで動かせるようにしましょう。

**追記**

Electronの[quick start](http://electron.atom.io/docs/tutorial/quick-start/)を見つけました。もとネタはこのへんのようです。
こちらも更新されているようなので、次回は公式のものに合わせて書こうと思います。
文系出身の未経験2年目エンジニアが1年目にやっておくべきだったなと感じた諸々

こんばんは。

全くのど素人から業界に入って2年目、来年の春から未経験で同じ業界に入る方に向けた記事を書かせていただきます。  

アジェンダです。
1. Unix(コマンドライン)触れるようになっとく
2. 仕事で使ってる以外の言語を触っとく
3. 勉強会に顔出す
4. 資格を取れるだけ取っておく


### 1. Unix(コマンドライン)触れるようになっとく
に関しては、普段はIDEで開発することが多くても、いざデプロイしますとか、サーバ上のファイル触ってねってなる機会が増えてきます。必要に迫られます。そんな時にさらっと鮮やかにサーバ触れるとかっこいいです。ただそれだけだけど、大事です。
新米エンジニアは、自分のPCがWindowsの人もMacの人も、仮想環境作って(仮想だからいつぶっ壊れてもいいと思って)遊んでおくといいと思います。
※Macユーザですが、最初にsshコマンドで仮想環境にアクセスした時の感動はひとしおでした。

### 2. 仕事で使ってる以外の言語を触っとく
1年目の人はJava、PHPが多いんでしょうか？私の場合はJavaでした。
普段仕事で使ってる言語とはまた違うものを触ると、知ってる言語のいいとこそうでないとこが見えてくるし、使ってる言語内での表現力の幅も広がります。
(再帰がどうしても嫌で…Haskellの勉強して初めてJavaでも再帰書けるようになりました)
小耳に挟んだ言語をかじるもよし、知らない言語の勉強会にふらっと行ってみるもよし、とにかく取り入れて遊んでみてください。

### 3. 勉強会に顔出す
勉強会に行くと、少なくとも一つは、自分が知らなかった知識を得られます。
これって何でもないように聞こえますが、勉強会に行かずに家で寝てたらその日に知られなかったこと。その知識はその日の運命の相手です。
また、勉強会に行くことで、誰かしらと顔を合わせます。
それで仲良くなった人から、別の勉強会のお誘いいただけたり、思いもよらぬ情報がもらえたり。
業界柄、男性が多いですが、女性向けコミュニティもたくさんあります。Javaやってる女性は[Java女子部](https://javajo.doorkeeper.jp)おすすめです。

### 4. 資格を取れるだけ取っておく
エンジニアはお医者さんとか先生とかと違って免許なくてもできるお仕事です。
誰でもできる仕事だからこそ、資格を持っているということはそのエンジニアの前向きな姿勢と実力の証です。会社によっては資格手当があるところもあります。

あとは、私のように基本自堕落でグダグダな人は、勉強するために資格申し込むのがいいです。
自腹切って(ベンダー試験はペーペーには辛いくらい高い)試験申し込んだら、そりゃ勉強にも力が入ります。
今の会社は受かった時だけ受験費用負担してもらえるので、申し込んだからにはお勉強頑張ります。
最初はそれでもいいと思うんです。勉強してるうちにいろいろな点と点がちょっとずつ繋がってきます。
  
  
  
  
偉そうなことばっかり並べましたが、私とてほぼ何も知らないペーペーです。身の回りの目標とするエンジニアの皆さんに近づけるよう、勉強と経験を重ねていきたいです。

お付き合いいただきありがとうございました。
12月23日code for kohoku 保育園幼稚園検索アプリ実装がんばろう


子育て支援拠点で、非エンジニアがひーひーしながら、バリバリのエンジニアさんに
教えてもらいながら、GITHUBと格闘しています。

横浜市港北区は日本有数の＃保育園入れなかったの私だ！的場所です。

そんなところで、＃保育園アプリつくるの私だ！
をかかげてがんばっています。

オープンデータ化できたら、そういうこともできますよね、でも今横浜市はオープンデータ化が
止まってしまっていて、うんぬんかんぬん・・・待ってられねーから。
こどもすぐおっきくなるから。。
とないものはつくるから、と勝手にやっています。

よかったら、ぜひ12月23日　18時から、横浜市港北区大倉山というところ、
腕に覚えのエンジニアさんたち、港北のママパパにクリスマスプレゼント！
ということでお集まりいただけたらうれしいです。

https://www.facebook.com/events/686862081477255/

港北区地域子育て支援拠点どろっぷ
畑中祐美子
エンジニア組織を創るということについて　～アジャイル論を添えて～

この記事は[フロムスクラッチ Advent Calendar 2016](http://qiita.com/advent-calendar/2016/fromscratch)の15日目の記事です。

#想定読者
このエントリーは、以下のような人を対象にしています。
他のメンバーが、「～やってみた系」のQiitaらしい記事を書いている一方で、
前回よりも更にニッチな想定読者で、誰が読むんだこれ？という記事を書きます（笑）
どなたか参考になれば幸いです。

 - ベンチャーへの転職って、おいしいの？と思っている方。
 - 100人以下の少数ベンチャーでエンジニアをしている方。
 - エンジニアの組織づくりに悩んでいる方。

#自己紹介
フロムスクラッチというベンチャーで、エンジニアリング部門のマネージャーを務めております。
自社プロダクト[B→Dash](https://mieruka-b-dash.com/)において、プロダクトの要件定義、テスティングや開発プロセスの設計、
プラスアルファで採用や広報などを担当しています。前職は、NTTDADで働いておりました。

#"A lot of design information lives in tribal memory." - Grady Booch
いきなりですが、ソフトウェア開発方法論者の[グラディ・ブーチさん](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%83%87%E3%82%A3%E3%83%BB%E3%83%96%E3%83%BC%E3%83%81)の言葉です。
すなわち、設計情報の多くは**部族の記憶(trinbal memory)**の中にあると。
チームメンバーの記憶の中で共有されているが、明文化はされていないと。
この言葉の意味について、考察してみます。

#式年遷宮の比喩
私がこの言葉に出会ったのは、アジャイル普及に尽力されている平鍋健児さんの[講演](http://www.slideshare.net/hiranabe/modeling-in-the-agile-age-jp?ref=http://taityo-diary.hatenablog.jp/entry/2015/03/23/064720)からです。

平鍋さんは、発表の中で、アジャイルにおけるモデリングの重要性について言及しています。
つまり、アジャイルは”包括的なドキュメントよりも、動くソフトウェア”を重視することには変わりないが、
チームに必要なドキュメントはメンテナンスし続ける必要があると伝えています。その一つが、モデリングであると。

さらに、モデリングと同様に重要なことは、”人（People）”であり、式年遷宮の比喩を紹介していました。

>式年遷宮はペアプログラミングのようなもの。ノウハウと暗黙知の共有。
ソフトウェア開発でも暗黙知の共有で成り立っている。
暗黙知を排除しようとしたのがソフトウェア工学だが、その揺り戻しとしてアジャイルが生まれた。

この記事を書くタイミングで思い出したのですが、私の前職NTTDATA
で統括部長を務めている方も、この式年遷宮の比喩を用いて会社を
表現されていたことがありました。
（偶然なのか、平鍋さんのことを知っているのかは、今となってはわからないのですが）

>NTTDATAは、宮大工の会社だ。
プロジェクトマネージャーが、何億円という案件を受注、何百人というエンジニアを動員する。
そこには、言葉では言い表すことの難しい、マネジメント力・PM力が存在する。
式年遷宮のように、社会インフラ立て直し続ける過程において、PM力という暗黙知が受け継がれてゆくのだ。

ここからわかることは、NTTDATAのように強く組織化された組織であっても、
やはり、暗黙知、**部族の記憶(trinbal memory)**が存在していて、
それが競争力の源泉になっている（そう認識されている）ことかと思います。

#部族の記憶≒文化
私は、この**部族の記憶(trinbal memory)**が、組織を創る上で重要ではないかと考えています。
そして、成果を出しているカッコイイ組織こそ、明文化がしっかりとされているのではないかと。
※なお、NTTDATAの内部でも、PM力を明文化する営みをされています。

 - [Increments：QiitaやKobitoを作る開発チームの文化](http://blog.qiita.com/post/74997115585/increments-dev-team-culture)
 - [UZABACE：7つのルール](http://www.uzabase.com/company/#company-sec2)
 - [ソラコム：リーダーシップステートメント](https://blog.soracom.jp/blog/2016/09/30/leadership-statement/)



#創れる側にいることの楽しさ
上記のようなポリシーをしっかりと持ったチームに所属することは、とても楽しいことだと思います。
一方で、この記憶を創る側に立つということは、挑戦的で、創造的で、とても楽しいことだと思います。

もちろん、弊社も明確にミッション・ビジョン、クレドを定義しています。
しかし、日々社員が増えてゆく中で、暗黙知というか、共通の体験というか、
**部族の記憶(trinbal memory)**といえる部分を、もっともっと作っていきたい。
そして、明文化することは目指しながらも、まずは共有していきたい。
そうすることで、私達のプロダクトが、今よりもさらに社会に価値を出せるのではないかと。
そう、信じています。

#おわりに
転職を考えている方は、「この人達は、どんな部族なんだろう。自分と同じかな？」って目で会社を見てみると良いかもしれません。
小さな組織にいる方は、これからどんな記憶を創るのか、考えてみてください。きっとわくわくするはずです。
大きな組織にいる方は、上司や先輩から、どんな記憶が残っているのか聞いて、しっかりと受け継ぐことをおすすめします。

おしまい。
Swift3でコードからアプリ名を取得

ググってもObjective-Cのやり方が多かったのでSwift用のものをメモ。


# Bundle nameを取得する
```swift:Swift
Bundle.main.infoDictionary?[kCFBundleNameKey as String] as? String
```
Bundle nameはデフォルトでのアプリ名。
意図的にいじっていなければ$(PRODUCT_NAME)が設定されていて、
$(PRODUCT_NAME)はプロジェクト作成時に設定するProduct Nameになっている。


# CFBundleDisplayNameを取得する
```swift:Swift
Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String
```
CFBundleDisplayNameはホーム画面で表示される、ローカライズされたアプリの名前。
言語設定によって表示するアプリ名を変えている場合はこちらを使うとよい。
設定していなければnilとなる。
オバンギャエンジニアがチケット譲渡サービス作ってみる

この記事は [dots girls Advent Calendar 2016](http://qiita.com/advent-calendar/2016/dots_girls)の16日目です！

# オバンギャとは

オバンギャとは、主にヴィジュアル系を追っかけているオバサンのことを指します。
ビジュアル系を追っかける女性をバンギャルと称しますが、その派生系です。
自虐要素強めなので、他人に向かって言ってはいけません。

そもそもオバンギャの説明から入るのQiita記事としてどうなの？



# そもそもの思い

- 転売ヤー滅びろ
- チケットのやりとりをできるアーティスト公式があれば多少はマシ？
- 大手じゃないと手出せないよね。お金かけて失敗できないよね。
- じゃあチケット譲渡サービス作ってソースコード公開して、ちょっとでも貢献できないかな？
- ベースになるコードがあれば楽じゃない？
- これでドッグフーディングさせてくれるところがあったら嬉しいな

というわけで作ってみようと思いたったわけです。

# 仕様

- 既存のファンクラブIDなどと連携できること
- 本人認証必須
- 正規の価格以上の価格設定ができないように
- なるべく操作が簡単
- カード決済必須

# Githubはこちら

[https://github.com/chikubasayaka/ticket_base](https://github.com/chikubasayaka/ticket_base)

順次機能開発していく予定なので、レビューしてくれたり、見守っていただけると嬉しいです。
Bitbucket プルリクエストのマージで Squash マージを使う

## はじめに

この記事は [Atlassian User Group Tokyo Advent Calendar 2016](http://qiita.com/advent-calendar/2016/augtokyo) 16日目の記事です。

アトラシアン 長阪です。
[Bitbucket](https://bitbucket.org) のLabs機能に Beta版の機能ですが「Squash merge your branches」 という機能があるのをご存知でしょうか。
この機能を有効にすると プルリクエストのマージの際に Squash マージが出来るようになります。

## Squash マージとは
ブランチからのプルリクエストをマージする時、送られてきたプルリクエストに複数のコミットが含まれている場合に、複数のコミットのまま マージしないで ブランチのコミットをまとめて、一つのコミットとしてマージしたい時がありますよね。
その時に使用できるのが Squash マージです。

下の図のような 流れです。
![Stash merge](https://qiita-image-store.s3.amazonaws.com/0/127299/8d14837e-98a0-76fe-af0b-fee71999f3e2.png)

Bitbucket でも、現在 Beta版の実験的扱いながら機能を有効にすることで使用することができます。
おかしい動作がありましたら是非フィードバック下さい。:pray:


## 機能を有効にするには
1. Bitbucket の画面右上のアイコンをクリックし、「アカウントの管理」を選択します。
![ アカウントの管理](https://qiita-image-store.s3.amazonaws.com/0/127299/f8af09ae-e159-384d-a786-e5abeeb23211.png)

1. **INTEGRATIONS AND FEATURES** の Labs を選択します。
![Labs](https://qiita-image-store.s3.amazonaws.com/0/127299/5c5ba53d-1e22-0f45-c36a-bbc824088d26.png)

1. 「Squash mearge your branches」 を有効にします。
![ labs — Bitbucket 2016-12-14 午後6時-15-55.png](https://qiita-image-store.s3.amazonaws.com/0/127299/76dd387a-bd50-34ac-78c6-b8715a8a1e95.png)

これだけです。


## Squash マージする
では 有効にした後で実際に マージの際に Squash マージを使ってみましょう。

下の画像のような 二つのコミットがある プルリクエストを作成しました。 プルリクエストを作る側はあえてコミットをまとめてません。 こちらのプルリクエストをマージしてみたいと思います。

![プルリクエスト１](https://qiita-image-store.s3.amazonaws.com/0/127299/00e18742-8722-5d6e-2bd8-ef2e9c175ccd.png)

「Squash mearge your branches」が有効になっていると プルリクエストをマージのダイアログで以下の画像のように 「Merge strategy」 という項目が表示され、"Merge commit" と "Squash" が選択できるようになります。
Squash を選択しマージします。

![マージ１](https://qiita-image-store.s3.amazonaws.com/0/127299/4b928cf1-a1ba-236a-4184-565350e126b2.png)

マージされると そのコミットは下の画像のように 一つのコミットとしてマージされます。
![マージ２](https://qiita-image-store.s3.amazonaws.com/0/127299/d4759379-770e-03fd-3e88-58e2e317a7ff.png)

これで 簡単にコミットをまとめてマージすることができます。

## まとめ
「Squash mearge your branches」 を有効にするとマージの「Merge strategy」 として 

- 複数コミットのままマージする(Merge commit)
- 一つのコミットにまとめてマージ(Squash)

を選択することが出来るようになり Squash マージも使えます。

## さいごに

Bitbucket は Pipelines というCI機能も使用できるようになりました。 みなさん是非活用ください。
明日は ヒゲで有名な Atlassian の岡本さんです。

**Atlassian 製品は日本語でもサポートしています**。 
- Atlassian製品の日本語サポート情報は[こちら](https://confluence.atlassian.com/jpns)にございます。
Xcode 8.1 -> 8.2でSwiftバージョンエラーが出る問題

追記: この問題はXcode8.2.1アップデートで修正されました(Xcode Release Notesより)


---------------------------------------

```
“Use Legacy Swift Language Version” (SWIFT_VERSION) is required to be configured correctly for targets which use Swift. Use the [Edit > Convert > To Current Swift Syntax…] menu to choose a Swift version or use the Build Settings editor to configure the build setting directly."
```

これまでXcode 8.1 (macOS Sierra)までは`Use Legacy Swift Language Version`を`NO`にしてSwift 3.0をビルドしていました。しかしXcode 8.2へアップデートしたところ上記エラーでビルドできなくなりました。

## 対処法

[Apple Developer Forums - XCode 8.2, does not detect that my project already is migrated to Swift 3](https://forums.developer.apple.com/thread/69340)

### 手順
1. .xcodeprojフォルダ内やPodsフォルダ内にある.pbxprojファイルの`SWIFT_VERSION`が`3.0.1`となっていた場合、すべて`3.0`に書き換える
2. 対象プロジェクトの`Use Legacy Swift Language Version`を`No`から`Yes`にしてビルドを失敗させる
3. 対象プロジェクトの`Use Legacy Swift Language Version`を再び`No`に戻してビルドすることで解消する

アップデート後のXcode 8.2はSwift 3.0.1を2.3として認識しエラーを出すようです。

同じくXcode 8.1 -> 8.2とした別Mac(Mac OS X El Captan)ではこの問題は発生しませんでした。
巷に溢れかえるCGI::Session ip-match の罠

Perl CGI::Sessionでセッション管理している方、今一度ソースコードを見返して下さい。

![image](https://qiita-image-store.s3.amazonaws.com/0/102207/c8d98980-f418-08c3-fc03-aea0ca0d5c76.png)

```perl:
use CGI::Session qw/-ip-match/;
```

**もしこうなっていたら、貴方のCGIはIPアドレスチェックなんかしていません。**

**本当はこうです！！！**

```perl:
use CGI::Session qw/-ip_match/;
```

マイナスではなく、**アンダースコアです！！！**

<span class='label label-default'>追記</span>
Session.pm の説明文が初期の頃 -ip-match になってたらしく、2年間そのまま放置。
後から気付いて、-ip_match に変更したのですが、後の祭りだったという顛末みたいです。

[たぶんここらへんが元](http://perldoc.jp/docs/modules/CGI-Session-3.11/Tutorial.pod#SESSION32ID)
![image](https://qiita-image-store.s3.amazonaws.com/0/102207/6f857cbc-ecc0-dd43-96bf-e84133809d94.png)

検索すると他にも、古いTutorial.pod のサンプルコードをそのまま紹介しているサイトがわんさか出てきます。
ぜひ、管理人様に教えて修正依頼を掛けて下さい。
HomebrewのFormulaのソースコードを確認する

HomebrewのFormulaのコードを読みたい時には以下のコマンドで元のコードをカレントディレクトリに展開できる。

`$ brew unpack <パッケージの名前>`

実例

```zsh
$ brew unpack tree
==> Unpacking tree to: /Users/metroid/tmp/tree-1.7.0
==> Downloading http://mama.indstate.edu/users/ice/tree/src/tree-1.7.0.tgz
Already downloaded: /Users/metroid/Library/Caches/Homebrew/tree-1.7.0.tgz
==> Verifying tree-1.7.0.tgz checksum
tar xzf /Users/metroid/Library/Caches/Homebrew/tree-1.7.0.tgz

$ ll
total 0
drwxr-xr-x   3 metroid  staff   102B 12 16 00:42 ./
drwxr-xr-x+ 78 metroid  staff   2.6K 12 16 00:42 ../
drwxr-xr-x  19 metroid  admin   646B 12 16 00:42 tree-1.7.0/
```

helpによると以下のオプションがあるが、

```zsh
$ brew help unpack
brew unpack [--git|--patch] [--destdir=path] formulae:
    Unpack the source files for formulae into subdirectories of the current
    working directory. If --destdir=path is given, the subdirectories will
    be created in the directory named by path instead.

    If --patch is passed, patches for formulae will be applied to the
    unpacked source.

    If --git is passed, a Git repository will be initialized in the unpacked
    source. This is useful for creating patches for the software.
```

どちらもpatch作成用のオプションの為、ソースコードを確認する為には特に必要ない。
HTMLメールをASP.net の razor とかで処理しようとした件

昨晩結構重めのリリースがあり、想定より時間とれずにアドベントできてねーじゃんってなり他の方々に非常に申し訳ないですが、何とかネタを振り絞って書きます。
ちょうど最近周りからHTMLメールに関する話を聞くのでHTMLメールについての話を書きます。
といってもHTMLメール一般的なのじゃなくて .net に限った話です。

## razor って?

.NetFramework のwebフレームワークの ASP.net MVC の3から登場したビュー・エンジンです。

```cshtml
@using System.Globalization
<div>
  <p>@Model.Description</p>
</div>
```
みたいな感じに `@` と書く事で namesapce の using や ViewModel の値を html に埋め込む事ができます。
今時 ASP.net MVC で開発していれば View は大体この記法で書いているかと思います。

この辺りが入門にはいいかもしれません。
[新しいビュー・エンジン「Razor」の基本を理解しよう](http://www.atmarkit.co.jp/fdotnet/aspnetmvc3/aspnetmvc3_06/aspnetmvc3_06_01.html)

## razor で HTMLメール..?

で、普段から razor で Web の開発をやっていると 「HTML メールのテンプレートもできたら使い慣れた razor で管理できねーかな」って思うわけです。
そこで登場するのが [Razoer Engine](https://github.com/Antaris/RazorEngine) です。

> A templating engine built on Microsoft's Razor parsing engine, RazorEngine allows you to use Razor syntax to build dynamic templates. You can find an introduction here. All you need to do is use the static Engine class (the Engine.Razor instance) in the 'RazorEngine' namespace:

って書いてあるように razor のシンタックスでテンプレートを利用できます。
これでHTMLメールも結局は htmlBody を string で渡せればいいので何とかできます。

## 利用方法

実際は大分簡略化しましたが、こんな感じでやりました。
まずは rezor で書かれた cshtml　を作りコード内で扱うために Resouce 形式にしました。(直接File.IO使って読み取ってもいいけど同じ csproj 内で管理したかったため)
Resourceファイルを作成し、左上のメニューからファイルに変更します。
![20161216-01704.jpg](https://qiita-image-store.s3.amazonaws.com/0/11493/4b84b57a-35d0-94da-cc7c-a8e0fc265599.jpeg)

その後、cshtml をドラッグアンドドロップで下の領域に置き保存すれば Resource として扱えます。
![20161216-02227.jpg](https://qiita-image-store.s3.amazonaws.com/0/11493/d78c7b9d-7471-f2c2-9e35-6fe39605b672.jpeg)

で実際に RazorEngine を使ってパースするのは以下のような感じになります。

```csharp
using System.Text;
using RazorEngine.Templating;

namespace Sansan.Mails
{
	public class HtmlMail
	{
		public string ParseHtmlMail()
		{
			var templateService = new TemplateService();
			var template = Resources.Template.htmlMail;
			var viewModel = new ViewModel();

			return templateService.Parse(Encoding.UTF8.GetString(template), viewModel, null, null);
		}
	}

	public class ViewModel
	{
		public string Hoge { get; set; }
	}
}
```
これで戻ってくる string は ViewModel の値の適用された html が string として返ってきます。
あとはこれをsmtpClient などに投げ込めば Htmlメールが投げれますね。

実際には他にも Culture の適用や、Template のキャッシングなんかもやってたりしますが、一旦今回は一旦こんな感じで締めておきます。(雑...)
windows10 pycuda install

windows10, anaconda4.2.0, VisualStudio2015で
```
pip install pycuda
```
すると以下のエラー。

```
      File "C:\Users\o-kei\Anaconda3\lib\distutils\cygwinccompiler.py", line 157, in __init__
        self.dll_libraries = get_msvcr()
      File "C:\Users\o-kei\Anaconda3\lib\distutils\cygwinccompiler.py", line 86, in get_msvcr
        raise ValueError("Unknown MS Compiler version %s " % msc_ver)
    ValueError: Unknown MS Compiler version 1900
```


![image](https://qiita-image-store.s3.amazonaws.com/0/122102/6982f63c-9b1d-36b9-b3c5-0251d8b62c7f.png)

ここが問題らしい。

https://groups.google.com/a/continuum.io/forum/#!topic/anaconda/yLH46ilPQeo

にもあるのを参考にするが、C:\Windows\System32にはmsvcr140がないのでmsvcr120にへんこうして

```
elif msc_ver == '1900':
    return ['msvcr140']
```
を追記しちゃう。
ついでに
C:\Windows\System32
を環境変数に追加する。ダメ。コマンドプロンプト再起動したらなぜか通る。
pip uninstall pycudaして、pip install pycuda --no-cache-dirすると通らない。
とりあえずこの理解できないインストール状態で

```
import pycuda.gpuarray as gpuarray
import pycuda.driver as cuda
import pycuda.autoinit
import numpy

a_gpu = gpuarray.to_gpu(numpy.random.randn(4,4).astype(numpy.float32))
a_doubled = (2*a_gpu).get()
print (a_doubled)
print (a_gpu)
```

は実行できた。
Vim 8で便利になった組み込みMRU

この記事は [Vim Advent Calendar 2016](http://qiita.com/advent-calendar/2016/vim) の 16 日目の記事です。

みなさん、VimのMRUといえば、mru.vimとかctrlpとかunite/neomruでしょうか？あまり知られていませんが、Vim自体にも、最近開いたファイルを記録してくれる機能(MRU)があります。

## `:oldfiles`

まずは、`:oldfiles`コマンド。実行すると、番号とファイルパスの一覧が出力されます。

__`:oldfiles`実行例:__

```
1: ~/.vimrc
2: ~/.vimplugins/vimdoc-ja/doc/tagsrch.jax
3: /usr/share/vim/vim74/doc/syntax.txt
4: ~/Dropbox/memo/2016-12-14.md
5: ~/Dropbox/config_swx-04.txt
6: ~/.vimplugins/vimdoc-ja/doc/options.jax

続けるにはENTERを押すかコマンドを入力してください
```

この出力のファイル名の左の数字を使うことで、該当するファイルを開くことができます。

### `:oldfiles`の結果に基づいてファイルを開く例

```vim
" 2番のファイルを開く
:e #<2

" ウインドウを分割して3番のファイルを開く
:split #<3

" 新しいタブで5番のファイルを開く
:tabe #<5
```

## `:browse oldfiles`

数字を指定するのはちょっと面倒ですよね。単に開くだけならもっと簡単な方法があります。`:browse oldfiles`です。このコマンドも`:oldfiles`と同じ一覧が表示されますが、最後に番号を入力するプロンプトが表示されるという違いがあります。

__`:browse oldfiles`実行例:__

```
1: ~/.vimrc
2: ~/.vimplugins/vimdoc-ja/doc/tagsrch.jax
3: /usr/share/vim/vim74/doc/syntax.txt
4: ~/Dropbox/memo/2016-12-14.md
5: ~/Dropbox/config_swx-04.txt
6: ~/.vimplugins/vimdoc-ja/doc/options.jax
番号と<Enter>を入力してください (空でキャンセル): _
```

## Vim 8の`:filter`コマンドと組み合わせる

...前置きが長くなりましたが、ここからが本題のVim 8ネタです。上記の`:browse oldfiles`ですが、Vim 8で追加された`:filter`コマンドと組み合わせると、Vimの正規表現で事前に一覧を絞り込んでおくことができます。oldfilesの結果が多くなっているときに便利度が上がります。

__使い方:__

```vim
:browse filter /パターン/ oldfiles
```

__`:browse filter /\.jax$/ oldfiles`実行例:__

```
2: ~/.vimplugins/vimdoc-ja/doc/tagsrch.jax
6: ~/.vimplugins/vimdoc-ja/doc/options.jax
番号と<Enter>を入力してください (空でキャンセル): _
```

こういうマッピングを定義しておくと便利かな。

```vim
nnoremap <Leader>e  :<C-u>/ oldfiles<Home>browse filter /
```

注意：`:filter`による絞り込みは出力が絞り込まれるだけなので、選択時に入力する数字は絞り込み前のものと同じです(番号が振り直されるわけではないです)。また、絞り込み後に表示されていなくて元の一覧にある別の番号でも開けます。

以上、`:browse oldfiles`と`:filter`を組み合わせたお手軽MRUの紹介でした。
[Elm] Web API サポート状況

Elm Advent Calendar 2016 の16日目です。

# Web API のサポート状況

[A Farewell to FRP](http://elm-lang.org/blog/farewell-to-frp#what-is-next-) で触れられている通り、Elm は Web API を使ったライブラリの公開をコミュニティに許していません。（これについては議論すると長くなるので、詳しくは読みにいってください。）

そこで、よく知られている Web API のサポート状況をざっくり表にまとめました。該当パッケージがない場合は、[Port](https://guide.elm-lang.org/interop/javascript.html) を使いましょう。

|API|該当パッケージ|補足|
|:--|:--|:--|
|History|[elm-lang/navigation](http://package.elm-lang.org/packages/elm-lang/navigation/latest)|いわゆる SPA のためのルーティング。|
|DOM|[elm-lang/dom](http://package.elm-lang.org/packages/elm-lang/dom/latest)|フォーカス・スクロール・要素のサイズ取得。caret position や mesureText なども候補には上がっている。|
|HTML|[elm-lang/html](http://package.elm-lang.org/packages/elm-lang/html/latest/)|Virtual DOM。|
|SVG|[elm-lang/svg](http://package.elm-lang.org/packages/elm-lang/svg/latest)|Virtual DOM。|
|Canvas|(非推奨) [evancz/elm-graphics](http://package.elm-lang.org/packages/evancz/elm-graphics/latest)|最終的にはもっと機能を増やしたAPIを公開するとのこと。<blockquote> ... I expect we will eventually have an API specifically targetted at canvas that covers more features.</blockquote> |
|WebGL|[elm-community/webgl](http://package.elm-lang.org/packages/elm-community/webgl/latest)|API改善に向けて elm-dev にて議論中。|
|HTTP|[elm-lang/http](http://package.elm-lang.org/packages/elm-lang/http/latest)||
|Web Socket|[elm-lang/websocket](http://package.elm-lang.org/packages/elm-lang/websocket/latest)||
|Geolocation|[elm-lang/geolocation](http://package.elm-lang.org/packages/elm-lang/geolocation/latest)||
|Page Visibility|[elm-lang/page-visibility](http://package.elm-lang.org/packages/elm-lang/page-visibility/latest)||
|Web Storage|N/A|[パッケージ未公開](https://github.com/elm-lang/persistent-cache)。キャッシュとして使うことを前提に　LocalStorage をラップ。 |
|Cookie|N/A|[パッケージ非公開](https://github.com/elm-lang/cookie)。セキュリティ上の問題からサポートしない事にした（[Maybe the Cookies API should not exist](http://tech.noredink.com/post/147676730053/maybe-the-cookies-api-should-not-exist)）。|
|File / Binaries|N/A|ファイルのアップロードはよく議題に登る。バイナリ一般は先が遠そう。|
|Web Audio API|N/A|かなり先は遠そう。|
|Web RTC|N/A|かなり先は遠そう。|
|Web Worker|N/A|[POC](https://github.com/rtfeldman/elm-web-workers)があるので可能ではありそう。|
|Service Worker|N/A||
|その他|N/A|

見ての通りオーディオなどは本当に弱いです。もし使う予定があれば、**最初から Port 前提で設計を考える**のが良いでしょう。Native Module は非サポートなので、がっつり依存すると何が起こるか分かりません。

Port は公式ドキュメントにある通り "JavaScript as a Service" と考えるのが妥当です。関数の代用として考えるときついと思います。ちなみに、Elm 0.17で Port の使い方が変わりました。定数が使えなくなっていますが、Mainモジュール以外からでも`port module`と宣言すれば Port が使えるようになっています。
EFK(Elasticsearch,Fluentd,Kibana)で簡単ログ基盤をdocker-compose使って立ち上げる

## 簡単ログ基盤

GoogleAnalytics一辺倒のWeb運用から自前のDWHなんかを立てる運用にWeb運用の主戦場が移り変わってきてると感じる今日このごろ。
Web界隈に生きるエンジニアとしてはログ基盤くらいちょろっと調達できなければいけません。
とはいえ何を使っていいのやらと悩むことも多いことでしょう。

## 勝手に鉄板構成

いろんな選択肢がある中から、下記の選定をしてしまうと楽な気がします。

- ログ集める：Fluentd
- ログためとく：Elasticsearch
- ログ見る：Kibana

Elasticsearchはけしてためとくのが得意じゃないので、ちゃんとためておきたい場合はS3とかファイルとかに出しておきましょう。今回紹介するFluentdではファイルにも出力してるので安心してください。

## 本題

次のような感じで立ち上げられます。

```
$ git clone https://github.com/foursue/efk.git
$ cd efk
$ docker-compose up
```

暫く待って起動したら…`http://localhost:5601/`にアクセスしましょう
こんな画面が開きます。

![Kibana.png](https://qiita-image-store.s3.amazonaws.com/0/75613/79a6013a-6dba-ab3f-a0d5-6a771af31567.png)

あとは好きなようにFluentdにログを投げ込むもよし、Elasticsearchに直接ログを投げ込むもよしです。

## 解説

今回はdocker-composeでEFKを立ち上げています。
docker-compose.ymlは次のような感じです。

```docker-compose.yml
fluentd:
  build: ./fluentd
  volumes:
    - ./log:/fluentd/log
    - ./fluentd/conf:/fluentd/etc
  links:
    - "elasticsearch"
  ports:
    - "24224:24224"
    - "24224:24224/udp"
elasticsearch:
  image: elasticsearch
  expose:
    - 9200
  ports:
    - "9200:9200"
kibana:
  image: kibana
  links:
    - "elasticsearch"
  ports:
    - "5601:5601"
```

この構成だと、ホストの外から直接Elasticsearchへログを投げ込むこともできますし、Fluentdコンテナに集約してからElasticsearchへ投げ込むこともできます。

### fluentd
Fluentdのconfは下記のような感じです。

```fluent.conf
<source>
  type forward
  port 24224
  bind 0.0.0.0
</source>
<match *.**>
  type copy
  <store>
    type elasticsearch
    host elasticsearch
    port 9200
    logstash_format true
    logstash_prefix logstash
    logstash_dateformat %Y%m%d
    include_tag_key true
    type_name access_log
    tag_key @log_name
    flush_interval 20
  </store>
  <store>
    type file
    path /fluentd/log/access_log
  </store>
</match>
```

dockerの内部名前解決のlinkを使ってelasticsearchのIPアドレスを解決して投げ込む構成です。いちおうaccess_logとして投げ込んでますが、このあたりは好きなようにすると良いです。
一応Elasticsearchに投げる他に「/fluentd/log/access_log」とかにも出力してます。これだと高負荷系チューニングがしんどくなるので慣れたら外してしまうかコンテナから出して考えましょう。

## まとめ
ソースはすごい短いので、githubも御覧ください。
https://github.com/foursue/efk
素人の言語処理100本ノック:51

[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第6章: 英語テキストの処理
>英語のテキスト（nlp.txt）に対して，以下の処理を実行せよ．

###51. 単語の切り出し
>空白を単語の区切りとみなし，50の出力を入力として受け取り，1行1単語の形式で出力せよ．ただし，文の終端では空行を出力せよ．

####出来上がったコード：

```python:main.py
# coding: utf-8
import re

fname = 'nlp.txt'


def nlp_lines():
	'''nlp.txtを1文ずつ読み込むジェネレータ
	nlp.txtを順次読み込んで1文ずつ返す

	戻り値：
	1文の文字列
	'''
	with open(fname) as lines:

		# 文切り出しの正規表現コンパイル
		pattern = re.compile(r'''
			(
				^					# 行頭
				.*?					# 任意のn文字、最少マッチ
				[\.|\;|\:|\?|\!]	# . or ; or : or ? or !
			)
			\s						# 空白文字
			(
				[A-Z].*				# 英大文字以降（＝次の文以降)

			)
		''', re.MULTILINE + re.VERBOSE + re.DOTALL)

		for line in lines:

			line = line.strip()		# 前後の空白文字除去
			while len(line) > 0:

				# 行から1文を取得
				match = pattern.match(line)
				if match:

					# 切り出した文を返す
					yield match.group(1)		# 先頭の文
					line = match.group(2)		# 次の文以降

				else:

					# 区切りがないので、最後までが1文
					yield line
					line = ''


def nlp_words():
	'''nlp.txtを1単語ずつ返すジェネレータ
	文の終わりでは空文字を返す。

	戻り値：
	1単語、ただし文の終わりでは空文字を返す
	'''
	for line in nlp_lines():

		# 単語に分解、終端の区切り文字は除去して返す
		for word in line.split(' '):
			yield word.rstrip('.,;:?!')

		# 文の終わりは空文字
		yield ''


# 読み込み
for word in nlp_words():
	print(word)
```

####実行結果：

長いので先頭部分の抜粋です。

```console:端末：先頭部分
Natural
language
processing

From
Wikipedia
the
free
encyclopedia

Natural
language
processing
(NLP)
is
a
field
of
computer
science
artificial
intelligence
and
linguistics
concerned
with
the
interactions
between
computers
and
human
(natural)
languages

As
such
NLP
is
related
to
the
area
of
humani-computer
interaction

Many
challenges
in
NLP
involve
natural
language
understanding
that
is
enabling
computers
to
derive
meaning
from
human
or
natural
language
input
and
others
involve
natural
language
generation
```

全体の結果は[GitHub](https://github.com/segavvy/nlp100_Python/tree/master/51)にアップしています。


###さらにジェネレータ
[前問](http://qiita.com/segavvy/items/05d5846bb77c6829f76f)で1文ずつ取得するジェネレータ`nlp_lines()`を作りましたが、さらに1単語ずつ取得するジェネレータ`nlp_words()`を作ってみました。

*（2016/12/17更新）　
[前問](http://qiita.com/segavvy/items/05d5846bb77c6829f76f)の`nlp_lines()`の修正を反映しました。*

　
52本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
<hr>

*実行結果には、[100本ノックで用いるコーパス・データ](http://www.cl.ecei.tohoku.ac.jp/nlp100/#data)で配布されているデータの一部が含まれます。この第6章で用いているデータのライセンスは[クリエイティブ・コモンズ 表示-継承 3.0 非移植](https://creativecommons.org/licenses/by-sa/3.0/legalcode)（[日本語訳](https://creativecommons.org/licenses/by-sa/3.0/deed.ja)）です。*
tmuxで「ssh接続時」「ssh切断時」に対象windowを指定した上で、自動でwindow名を変更する

- [tmuxで色んなホストにsshする時に便利な.ssh/config - Qiita](http://qiita.com/catatsuy/items/631d1d5d0b357082ba74)
- [tmuxでSSH時に変更したwindow-nameを自動でもとに戻す - Qiita](http://qiita.com/yuku_t/items/4ffaa516914e7426419a)

上記の記事を参考に私の環境でも設定を行ってみたのですが、window名がうまく復元できない場合がありました。

# 以下のようなケース（window名については適当です）

1. windowを複数（`window1`,`window2`）を開いている
    - `window1`は「**ECサイト開発**」、`window2`は「**Androidアプリ開発**」というwindow名を設定しておく
2. `window1`で開発用サーバへssh接続
    - `window1`が「**dev_server0001**」というwindow名に切り替わる
3. `window2`に切り替えて別の作業
4. タイムアウトが原因で`window1`のsshがいつの間にか切断されている
    - `window1`は「**dev_server0001**」のままで、`window2`が「**ECサイト開発**」というwindow名に切り替わる


# 理想の動き

4のタイミングでこうなるのが理想です。


- 操作しているwindowは`window2`だが、`window1`のwindow名が「**ECサイト開発に戻る**」
 
# いろいろ試行錯誤

renameする対象windowを指定することが出来ないかなーと公式のマニュアルを見てみる。

## rename-windowコマンド
なにやら使えそうなオプションを発見。`tmux rename-window -t`で指定できそう
[http://man.openbsd.org/OpenBSD-current/man1/tmux.1](http://man.openbsd.org/OpenBSD-current/man1/tmux.1)
>rename-window [-t target-window] new-name
>(alias: renamew)
>Rename the current window, or the window at target-window if specified, to new-name.

## display-messageコマンド
`dispaly`ってaliasだったんですね。
[http://man.openbsd.org/OpenBSD-current/man1/tmux.1](http://man.openbsd.org/OpenBSD-current/man1/tmux.1)
>display-message [-p] [-c target-client] [-t target-pane] [message]
>
>(alias: display)
>Display a message. If -p is given, the output is printed to stdout, otherwise it is displayed in the target-client status line. The format of message is described in the FORMATS section; information is taken from target-pane if -t is given, otherwise the active pane for the session attached to target-client.

更に引数でどの情報を表示するのか？を指定できるらしい。
[http://man.openbsd.org/OpenBSD-current/man1/tmux.1#FORMATS](http://man.openbsd.org/OpenBSD-current/man1/tmux.1#FORMATS)
>window_id		Unique window ID
>window_name	#W	Name of window

ということは`tmux display -p '#{window_id}'`でwindow_idを退避しておけば、window名復元時に対象を指定できるはず！！


## 上記調査を基に.bashrcを修正
```Bash:.bashrc
# ssh接続、切断時にtmuxウィンドウ名を動的に変更する
function ssh() {
        # tmux起動時
        if [[ -n $(printenv TMUX) ]]
        then
                # 現在のwindow名を退避
                local window_name=$(tmux display -p '#{window_name}' )
                local window_id=$(tmux display -p '#{window_id}' )
                # 通常通りssh続行
                command ssh $@
                # 退避していたwindow名を復元
                tmux rename-window -t $window_id $window_name
        else
                command ssh $@
        fi
}
```

これで[理想の動き](#理想の動き)を実現できました。