OmniAICreator/Qiita-1.07M huggingface dataset:
JSXを使わずにreact-jadeで仮想DOM出力


適当にReact書いていたら、`*.jsx`の中が`render()`のとこのJSXでいっぱいになる。
このJSX、エンジニア的にはそんなに苦じゃない（たぶん）
が、デザイナー（コーダー）とキャッチボールしながら作ってく際にはベストなやり方じゃないかも...と思ってチョット調べたら、react-jadeというのを使っていくやり方もあるようだ。

[jadejs/react-jade](https://github.com/jadejs/react-jade)


jade形式のファイル（文字列）をコンパイルして、仮想DOMを返す関数にしてくれるというもの。
ほぼREADMEに書いてあるとおりなんだけど、試してみる。


```
cd /path/to/app

npm init -y
npm install react react-jade --save-dev
```

HTMLに簡単な文字列出してみることにする。

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <title>Hello world</title>
  </head>
  <body>
    <div id="container"></div>
    <script src="./bundle.js"></script>
  </body>
</html>
```

`index.js`というのを書く。（あとでbrowserifyで`bundle.js`に変換する）

```javascript:index.js
var React = require('react');
var jade  = require('react-jade');

var template = jade.compileFile(__dirname + '/template.jade');

var Hoge = React.createClass({
  render: function() {
    return (
      template({ foo: 'bar' })
    );
  }
});

React.render(React.createElement(Hoge), document.getElementById('container'));
```

同じ階層にある`template.jade`に、変換したい文字列（≒ HTML）を書いて`compileFile()`で仮想DOMを返す関数にする。`compileFile`は以下の様な役割だとREADMEに書いてある

> Compile a jade file into a function that takes locals and returns a React DOM node.

ほとんど書いてないけど、jadeのファイルは以下。

```template.jade
h1(class=foo)
  | Hello, world!!
h2
  | Hello, react-jade!
```

`index.js`でtemplateの引数を渡しているが、これがjade側で使えるローカル変数。
よって、h1タグのclassは"bar"となる。

browserify。

```
browserify -t react-jade index.js -o bundle.js
```

これで`bundle.js`ができるので、最初のHTMLをブラウザで開いてみる。
以下の様な結果になる。

![Screen Shot 2015-08-03 at 11.58.26 PM.png](https://qiita-image-store.s3.amazonaws.com/0/1795/1a5b4d62-9215-75df-50ef-7798e139ff6d.png "Screen Shot 2015-08-03 at 11.58.26 PM.png")

[reactjs - react-jadeでjadeテンプレートから仮想DOMを出力する - Qiita](http://qiita.com/mizchi/items/4e17b54cd9cc70d747cc)

↑ こちらの記事を読んでいて知ったが、React側で宣言した関数を変数としてjade側に渡す、ということもできる。
これは良いなと思った  

## おわり
短いけど以上。

普段Railsを書いていてテンプレートエンジンはerbとslimしか触ったことないため、結局jadeを覚えることにはなるのだが、JSXを素直に修得する以外にも方法があるのだなと分かった。
jsのロジック部分と仮想DOMの部分が上手く分離できそうな気もするので、協業という意味では良いのかも。
VTKによるマウスイベント処理(オブジェクト上の点選択)

#VTKによるマウスイベント処理(オブジェクト上の点選択)
VTKではオブジェクト描画ウィンドウ上のマウスイベント時の処理を簡単に行う仕組みが用意されている．ここでは，描画ウィンドウ上に表示したオブジェクト上の点座標をクリックで取得する方法を[公式サンプル](http://www.vtk.org/Wiki/VTK/Examples/Cxx/Interaction/PointPicker)に基づいて説明する．

手順は以下の通り．
1. スタイルクラスを作成する．
2. スタイルをセットしてオブジェクトを描画する．

##1. スタイルクラスを作成する．

スタイルクラスを作成して，このクラスでイベント時の処理を記述する．直接オブジェクト上の点を取得するのは，```vtkPointPicker```を使う．
以下に右クリックを押したときのオブジェクト上の点の座標を取得するスタイルクラスのサンプルを示す．メンバ変数の```vtkPoints```に取得した点を格納する．([公式サンプル](http://www.vtk.org/Wiki/VTK/Examples/Cxx/Interaction/PointPicker)とほぼ同じです...)

```cpp
class MouseInteractorStylePP : public vtkInteractorStyleTrackballCamera
{
  protected:
    vtkSmartPointer<vtkPoints> PickPoints;//取得した点を格納．
  public:
    static MouseInteractorStylePP* New();
    vtkTypeMacro(MouseInteractorStylePP, vtkInteractorStyleTrackballCamera);
    vtkSmartPointer<vtkPoints> GetPickPoints(){return this->PickPoints;}

    //各関数をオーバーロードする．
    virtual void OnRightButtonDown()//右クリックした時の処理
    {
      this->Interactor->GetPicker()->Pick(
       this->Interactor->GetEventPosition()[0], 
       this->Interactor->GetEventPosition()[1], 
       0,
       this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()
       );
      //オブジェクト上の点を取得．
      double picked[3];
      this->Interactor->GetPicker()->GetPickPosition(picked);
      this->PickPoints->InsertNextPoint(picked);//点をメンバ変数に格納．
     //コンソールに表示．
     std::cout << "Picked value: " << picked[0] << " " << picked[1] << " " << picked[2] << std::endl;

      vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
    }
};
```
##2. スタイルをセットしてオブジェクトを描画する．
通常の描画処理と異なるのは2つ．
* ```vtkPointPicker```を作成して，```vtkRenderWindowInteractor ```にセットする．
* スタイルを作成して，```vtkRenderWindowInteractor ```にセットする．

```cpp

auto sphereSource = vtkSmartPointer<vtkSphereSource>::New();
sphereSource->Update();
 
auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(sphereSource->GetOutputPort());
auto actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);

auto renderer = vtkSmartPointer<vtkRenderer>::New();
auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);

auto renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();

//pointpickerを作成して，セット．
auto pointPicker = vtkSmartPointer<vtkPointPicker>::New();
renderWindowInteractor->SetPicker(pointPicker);
renderWindowInteractor->SetRenderWindow(renderWindow);

//作成したスタイルをInteractorにセットする．
auto style = vtkSmartPointer<MouseInteractorStylePP>::New();
renderWindowInteractor->SetInteractorStyle( style );
 
renderer->AddActor(actor);
renderer->SetBackground(1,1,1);
renderWindow->Render();
renderWindowInteractor->Start();

//取得した点
vtkSmartPointer<vtkPoints> pickPoints = style->GetPickPoints();
```
オプショナル型の簡単な説明

#オプショナル型について簡単にまとめてみます。#


Swiftの変数はnilをそのまま代入することはできません。

```
var a : Int = 0
var b : Int? = 10　//型の後ろに?をつける

var a = nil //コンパイルエラー
var b = nil //代入できる

```
予期せぬnilにより障害が起きることを防ぐためにそのような仕様になったのですが、
nilが入ることを予め明示することを***オプショナル***といいます。

?をつけたオプショナル型を受け取る関数に引数として渡す場合には値が空でないことをこれまた明示する必要があります。その場合はオプショナル型変数名に「!」をつけて**アンラップ**をします。

```
var name: String? = "taro"
print(name!) //taroと表示


var name: Int? = nil
print(name!) //何も表示されないがエラーではない
```

これはオプショナル型の初期値はnilとなるからです。


また下の例のようにnilに対してアンラップしてもエラーになりません。
しかし、下記のように場合はエラーが発生します。

```
var age1: Int? = 2015
var age2: Int = age1 //エラー
```
オプショナル型を明示した変数には非オプショナルな変数は代入できません。
この場合もアンラップをすればできます。

```

var age2: Int! = age1
```


#??と重ねることで演算子としても利用できます。#



```
var age: Int? = 2015

print(age ?? 2000) // 2015と表示

```

ageがnilではないので2015を返しています。
逆にnilだった場合は下のようになります。

```
var age: Int?
print(age ?? 2000) //2000と表示

```
「概念モデリング再入門 ～今さら人に聞けない人のための基礎講座～ ＋ ちょっとだけDDDの話も」に参加したよ

https://hiroshima-jug.doorkeeper.jp/events/27797

Hiroshima Java User Group の勉強会に参加しました。

![20150803-modeling.png](https://qiita-image-store.s3.amazonaws.com/0/53620/94b37116-dc7a-36a0-42c2-5f841a49b9c8.png)

ためになる言葉が多々ありました。

* 業務を理解するために書く
* テーマを決める（粒度を決める）
* 正解にこだわらない
* 綺麗に書こうとしすぎない

が、、、
「お客様に UML とか、概念モデルとは、を教えるのではなく、お客様から業務を聞きをそれをホワイトボードへ概念モデルを書き、自分が理解した業務を説明する。」
っとの言葉が一番記憶に残りました。

渡辺幸三さんの記事／本を思い出しました。
この流れがうまく回ると、とても充実した打ち合わせになると思いました。

MindMap, 概念モデルと打ち合わせで利用できるツールを増やしていきたいと思いました。

DDD についても、ためになりました。

Plain なオブジェクト（Service とか Business と言ったりして、、、）にこだわり、データの入れ替えばかりをしていたり（それを支援するUtilをすごく作りんでたり、、、）するやり方には、疲れました。

Entity と Value Object に業務ロジックを持っていくというのは、今、自分が一番したいことでした。同じ考えであることに背中を押してもらえた気がしました。

追求すると Fat な Entity になるかもしれません。でも、そこでいろいろなテクニックを施す前に

* 役割が異なるのに１つの Entity にしていないか
* 中心に置いている Entity が適切か

を考え、モデルを見直すきっかけになるのではないかと思っています。

Value Object は、やっぱり大切です。
もし、たくさんの static メソッド／クラスメソッドのみの Util が溢れているのであれば Value Object に抜き出せる箇所かもしれません。
Value Object を使うと、ちょっとした処理でも、業務ロジックで重要な処理であることを再認識できる気がします。

2H を一人で話続けて、たくさんの気づきを与えてくれた 河野 正幸さんに、本当に感謝します。
vimで複数選択を可能にするプラグイン


##マルチカーソル
Sublime Textの機能。
複数の文字列を同時に選択し、全ての選択箇所を一度に編集できる機能です。
これがあるから離れられない人も多いはず。


##vim-multiple-cursors
そんな便利なものvimにもありました。作成者の方には本当に感謝です。


 [terryma/vim-multiple-cursorsから引用](https://github.com/terryma/vim-multiple-cursors)
![Qiita](https://github.com/terryma/vim-multiple-cursors/blob/master/assets/example1.gif?raw=true)


##問題点
リファクタリングをする際などにとても便利なプラグインですが、問題点があります。

まず ctrl+n で複数行選択したい単語を選択するのですが、 
その選択区間は単語単位に限られていて、選択後に単語の末尾以外に選択範囲を変えると複数選択を実行できません。

つまり `.` や `->` を間に挟んだ選択や、 `(` を含んだ複数選択を実行できないことがあります。


##解決策

最初の文字列選択をデフォルトのビジュアルモードで行うと上手く動作します。

私は以下のように単語を選択します。

* 単語の先頭にカーソル : `ve`
* 単語の途中にカーソル : `viw`

`de` や `diw` 、 `ce` や `ciw` などにも応用が効くのでvimに出来るだけ慣れるためにも使っています。

##謝辞
最後まで読んでいただき、誠にありがとうございます。
Google Apps Scriptアプリローカル開発用Gulpテンプレート

GAS（Google Apps Script）アプリをローカルで開発するためのGulpテンプレートです。
scriptタグ（JS）、linkタグ（CSS）を一つのHTMLに結合し、
gas-managerを使用してアップロードまで自動化します。
このテンプレートは以前投稿した
[タスクランナー空テンプレート（Grunt・Gulp)]
(http://qiita.com/nowri/items/98cbc66bde78d1ae19f1)をベースにしています。

#テンプレート
https://github.com/nowri/gulp-gas-nxw

#利用手順
1. 上記テンプレートをダウンロード
2. `npm install`
3. [Google API OAuth2.0のアクセストークン&リフレッシュトークン取得手順メモ](http://qiita.com/kossacks/items/8d279bcc1acc2c2153ab)を参考に
 * client_id
 * client_secret
 * refresh_token  
を取得。  
ただし  
[[５、クエリパラメータを追加したURLにブラウザでアクセス]](http://qiita.com/kossacks/items/8d279bcc1acc2c2153ab#%EF%BC%95%E3%82%AF%E3%82%A8%E3%83%AA%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%9Furl%E3%81%AB%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%A7%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9)  
は、以下のようにアクセスURLを変更  
https://accounts.google.com/o/oauth2/auth?client_id=[4で取得したクライアントID]&redirect_uri=[４で設定したリダイレクトURI]&scope=https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/drive.scripts&response_type=code&approval_prompt=force&access_type=offline    
  scopeにApps Scriptアクセス権限を追加する必要があるためです。  
参考：[ Choose Auth Scopes | Drive REST API | Google Developers](https://developers.google.com/drive/web/scopes)
4. [Google Drive](https://drive.google.com/)よりGoogle Apps Scriptを作成   
※スプレッドシートから作成するスクリプトは使えません。ドライブ上で作成する必要があります  
参考：[Google Apps Scriptの開発手法まとめ](http://qiita.com/soundTricker/items/4d04c97c499b22886dfd#2-3)
5. 上記スクリプトのfileIDを取得します。  
fileIDは上記にアクセスしたURLの  
` /d/[FILE ID]/edit?`  
`[FILE ID]`部分です。
6. 3、5で取得した
 * fileID
 * client_id
 * client_secret
 * refresh_token  
をテンプレート[`gulpfile.js`](https://github.com/nowri/gulp-gas-nxw/blob/master/gulpfile.js)43〜46行に記述
7. 4で作成したGoogle Apps Scriptに必要なファイルを追加
8. `_syncgas`ディレクトリに7で追加したファイルと同名のファイルが作成されるように開発する

#テンプレートのディレクトリ・タスクリスト
| ディレクトリ| 説明         |
|:-----------|:------------|
| _syncgas   |  GAS同期用 |
| _release   |  納品用 |
| deploy     |  開発用 |
| libs       |  ライブラリ等置き場（ex. `libs/js/jquery-1.11.3.min.js`） |
| src        |  コンパイル前データ等置き場（ex. `src/scss/style.scss`） |

| タスク名    | 説明         |
|:-----------|:------------|
| `common:before` |  共通タスク。専用タスクの一番最初に実行させる |
| `deploy`        |  開発時専用タスク |
| `release`       |  納品時専用タスク |
| `gas-render`    | `release`タスク実行後、\_release ディレクトリのHTMLファイルをHTMLファイル内に記述されているscript・linkタグリンク先と共にGAS用にひとつにまとめ、_syncgasディレクトリに書き出し |
| `gas-upload`    | _syncgasディレクトリ内のファイルをGoogle Apps Scriptにアップロード。_syncgasとGoogle Apps Scriptで同名のファイルが有る場合のみアップロードされそれ以外は無視される |
| `render-and-upload`| `gas-render` +  `gas-upload`
| `watch:render-and-upload`| ファイルを監視し更新時`render-and-upload`タスクを実行 |
MacBookをEl Capitanにして新しくセットアップする


## 目的
新しくMacBook Pro '15 Mid2015を購入するにあたって、
いままで雑然としていた環境を整理するために一からセットアップし直す。
ちょうどMac OS X El Capitanのpublic beta版をインストールする権利をもらったので、
それにアップデートしてから行う。

## 方針
アプリケーションは今まで色々使ってこれからも使うもののみを入れる。
データは現在使用するもののみを本体のストレージに入れ、
古いものはアーカイブ化して外部ストレージに保存する。

## 目標

### アプリケーション

#### OS付属でついてくるもの
* Finder
* Safari
* ターミナル
* iWorks (Pages, Numbers, Keynote)
* GarageBand
* Photo
* iTunes
* App Store
* XCode（必須なのでApp Storeからダウンロード）
* メール
* メッセージ
* カレンダー
* プレビュー
* iBooks
* 辞書
* Font Book
* アクティビティモニタ
* システム環境設定 (Preferences)
* その他ユーティリティー

#### エディタ

* Atom
* GNU Emacs
* MacVim
* mi3
* OmmWriter

#### ブラウザ

* (Safari)
* Firefox Developer Edition
* Google Chrome
* Opera

#### Adobe CS6
懐に余裕ができたらCCを購入することを検討する

* Illustrator
* Photoshop
* InDesign

#### 端末

* iTerm 2
* MAMP

#### クラウドサービス系

* Evernote
* Wunderlist
* Dropbox
* Skydrive
* Google drive

#### SNS/コミュニケーション

* Slack
* Tweet Deck
* LINE
* Skype

#### その他ユーティリティー

* Alfred
* Karabiner
* BetterTouchTool
* ATOK（新生ことえりが使えなかったら購入）
* ClipMenu
* Skitch


### Homebrew

#### 開発環境

* zsh
* Virtualbox
* Vagrant
* git

## 記事分割先
全部を一つの記事にまとめてしまうとあまりに長くなってしまうので、記事を分割する。
強化学習で迷路を探索する


#はじめに
今回は強化学習，その中でもQ学習を使って迷路を探索したいと思います．

#Q学習
##概要
簡単に言うと，「状態」と「行動」のペア毎にQ値という値を保持しておき，「報酬」などを使ってQ値を更新していきます．正の報酬を得られる可能性が高い行動ほど高いQ値に収束していきます．迷路で言えば，通路のマスが状態に相当し，上下左右に移動することが行動に相当します．つまり，Q値は通路のマスの数*行動パターン数(上下左右なら4)分だけメモリに保持しておく必要があります．そのため「状態」と「行動」のペアがたくさんある，つまり状態行動空間(state and action space)が爆発してしまうような場合には簡単に適応できません．

今回は通路のマス数が60，行動可能な行動数が上下左右の4つの240ほどのQ値を保持しておけばよい問題を取り扱います．

##アルゴリズム
###Q値の更新
はじめQ値は全て0で初期化します．
状態$s_t$で行動$a$を取る毎にQ値を更新します．

$$Q(s_t, a) \leftarrow Q(s_t, a) + \alpha(r_{t+1} + \gamma \max_{p}{Q(s_{t+1}, p)} -Q(s_t, a))$$

###行動選択
今回はε-greedyを使います．小さい確率εでランダムな行動を，1-εの確率でQ値が最大の行動を選択します．

#ソースコード
コードは[Github](https://github.com/hogefugabar/RL/tree/master/qlearnpy)に上げました．`python map.py`としてやってくだい．2年位まえに書いたのですが，なかなかひどい．

#実験
##環境
実験環境は以下の写真のようになっていて，右下の水色のマスがゴール，一番左上のマスがスタート，青い4角が学習エージェントとなっています．ゴールに到達すると，正の報酬がもらえます．また，黒い部分が壁でエージェントが入り込むことができません．なのでエージェントは白い通路の部分を通るしかありません．各マスのQ値は0で初期化されていますが，Q値が0より大きくなったとき，そのマスにおける4つのQ値の一番大きいQ値が色の濃淡で，行動が矢印で表示される仕組みになっています．
<img src="https://dl.dropboxusercontent.com/u/38631959/env.png" width=500>


##結果
実験結果は[youtube](http://www.youtube.com/watch?v=-JXxYZ5HB8U)に上げました．エージェントがゴールに到達するにつれてQ値が伝搬されていくのがわかるかと思います．
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/-JXxYZ5HB8U/0.jpg)](http://www.youtube.com/watch?v=-JXxYZ5HB8U)

#おわりに
Q学習+ニューラルネットやってみたい
GlassFishにデプロイしたアプリでNoSuchMethodErrorが発生した時の対応方法


# 概要
GlassfishにデプロイしたアプリでFluentIterableを使用した時に、NoSuchMethodが発生。よくよく調べて見ると、GlassfishがバンドルしているGuavaのversionが古いことが判明したので、調べた内容と対応方法をまとめる。

# 環境
- Java : 1.7
- Guava : ver.18
- IDE : NetBeans 8.0.2
- WebServer : Glassfish 4.1
- OS : Windows7

# 現象
下記のようなコードをGlassfishにデプロイし、Webserviceでメソッドが呼び出された時にNoSuchMethodErrorが発生した。

```java:sample.java
        List<Person> personList = new ArrayList<>();

        Person p = new Person();

        p.setFirstName("Miyamoto");
        p.setLastName("Taro");
        p.setSex("Male");

        personList.add(p);

        p = new Person();

        p.setFirstName("Miyamoto");
        p.setLastName("Hanako");
        p.setSex("Female");

        personList.add(p);

        Predicate<Person> filter = new Predicate<Person>() {

            @Override
            public boolean apply(Person t) {
                return t.getFirstName().contains("Miyamoto");
            }
        };

        List<Person> toList = FluentIterable.from(personList).filter(filter).toList();

```


Exceptionには「com.google.common.collect.FluentIterable」なんて無いよとのメッセージが。

```Exceptionを一部抜粋
java.lang.NoSuchMethodError: com.google.common.collect.FluentIterable.toList()Lcom/google/common/collect/ImmutableList; at org.me.calculator.CalculatorWS.add(CalculatorWS.java:75) 
```

# 対応
stackoverflowを調べると複数の対応発見したが、一番お手軽なglassfish -> moduleのguava.jarをversion18で置き換える方法を採用。

1. Glassfishを停止しておく
2. Glassfishがインストールされているフォルダから`glassfish -> modules`に移動
3. 必要であれば、guava.jarをバックアップ
4. ダウンロードした最新版(2015.08.03時点でver18)guavaをmodulesフォルダにコピー
5. `domain1 -> osgi-cache以下のfelix`フォルダを丸っと削除し、キャッシュをクリア
6. Glassfishを起動
7. 終了

※ 2,5はNetBeansであれば、サービスのタブにあるGlassFish Server4.1のプロパティを選択し、`インストール場所`と`ドメインフォルダ`で確認可能。

# ポイント
modules内のguava.jarを置き換えたものの、例外が継続する場合はキャッシュ(osgi-cache以下のfelixフォルダ)をクリアする事で解決するはず。
実際、私はここではまりました。。。


# 参考サイト
- [java.lang.NoSuchMethodError: com.google.common.collect.FluentIterable.toList()Lcom/google/common/collect/ImmutableList;](http://stackoverflow.com/questions/26476149/java-lang-nosuchmethoderror-com-google-common-collect-fluentiterable-tolistlc)

- [Glassfishでバンドルされるライブラリを置き換える](http://qiita.com/hikaruworld@github/items/44173fad28fdc0318684)
Elixir のライブラリのドキュメントを Dash docset に変換する・暫定版

追記：Dash 3.1.1 あたりから Hex Docsets に対応しているので以下は不要。

[ExDocDash](https://github.com/JonGretar/ExDocDash) を使うと [Elixir](https://kapeli.com/dash) のライブラリのドキュメントを Dash 向けに変換することができる。コマンドで一発というわけにはいかず手作業が必要なので暫定版としておく。

## 1. ライブラリのソースコードを取得する

ここでは [Phoenix](http://www.phoenixframework.org) を例に取る。 GitHub からリポジトリをクローンする。必要ならドキュメントを生成したいリビジョンをチェックアウトする。

```bash
git clone https://github.com/phoenixframework/phoenix
cd phoenix
git checkout v0.15.0  # 必要に応じて
```

## 2. mix.exs を書き換える

mix.exs を開き、依存関係に `{:ex_doc_dash, "~> 0.0", only: :docs}` を追加する。

```ex:mix.exs
defmodule Phoenix.Mixfile do
  use Mix.Project
  # ...

  defp deps do
    [{:cowboy, "~> 1.0", optional: true},
     {:plug, ">= 0.13.1 and < 2.0.0"},
     {:poison, "~> 1.3"},

     # Docs dependencies
     {:earmark, "~> 0.1", only: :docs},
     {:ex_doc, "~> 0.7.1", only: :docs},
     {:inch_ex, "~> 0.2", only: :docs},
     {:ex_doc_dash, "~> 0.0", only: :docs},  # これを追加する

     # Test dependencies
     {:phoenix_html, "~> 1.2", only: :test},
     {:websocket_client, github: "jeremyong/websocket_client", only: :test}]
  end

  # ...
end
```

## 3. 依存モジュールを取得する

```bash
MIX_ENV=docs mix deps.get
```

ドキュメントに関する依存関係を取得するため `MIX_ENV=docs` を指定しておく。

## 4. Dash の docset を生成する

ExDocDash が入っていれば `mix docs.dash` コマンドが使えるようになる。これを実行すると docset を生成できる。

```bash
MIX_ENV=docs mix docs.dash
```

```text:出力
Compiled lib/mix/tasks/phoenix.routes.ex
Compiled lib/mix/tasks/compile.phoenix.ex
# ...
Generated phoenix app
Docs successfully generated.
Open with the command: open -a Dash "/path/to/phoenix/doc/Phoenix 0.15.0.docset"
```

生成が完了すると docset を Dash にインストールするコマンドを指示される。指示どおり実行すればインストールできる。
ImageViewで2つの状態の画像を切り替える

# 前置き

iOSでは imageとhightlightedImageの２種類を設定できて、2ステートの画像を切り替えるのが簡単だ。
Androidでのやりかたがぴんとこなかったのでメモ

# selector作成

selectorを作成する.
たとえば、`something_default.png` と `something_selected.png` がある場合は以下のように設定する。

```xml:drawable/something_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/something_default" android:state_selected="true" />
    <item android:drawable="@drawable/something_selected" android:state_selected="false" />
</selector>
```

これをImageViewに設定する

```xml
<ImageView
    android:id="@+id/something"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/something_selector" />
```

好きなようにコードで状態を変化させればOK

```java
ImageView view = findViewById(R.id.something);
view.setSelected(true); // -> something_selected.pngに切り替わる
view.setSelected(false); // -> something_default.pngに切り替わる
```
[してはいけないシリーズ] 誤ったcommitを消すためにブランチを消す


## してはいけない例

pushしてしまったcommitを消すためのHackとして、リモートブランチを消して再度pushするという方法が推奨されていたりするんですが、これは**絶対にやめてください**。

```sh
# 不要なcommit1と不要なcommit2を消したい
$ git log --oneline
hash789 不要なcommit2
67hash8 不要なcommit1
ha567sh 正しいcommit

# 正しいcommitまで戻す
$ git reset --hard ha777sh

# リモートのブランチを消す
$ git push origin :develop

# ローカルをリモートにpushする
$ git push origin develop
```

確かに消すことはできるんですが、そのリモートのブランチに紐付いているPull Requestが全部closeされてしまいます。

## していい例

なので、たとえ誰にもバレてなかったとしても、おとなしくrevertしてcommitに記録を残しましょう。

```sh
# 不要なcommitを打ち消す
$ git revert hash789
$ git revert 67hash8

# commitをまとめる
$ git rebase -i HEAD~2
```

rebaseコマンドを打つとcommitをどうするかのエディタが開きますので、一番上だけ残してsquashに書き換えます。

```diff
pick hash789 Revert "不要なcommit2"
- pick 67hash8 Revert "不要なcommit1"
+ squash 67hash8 Revert "不要なcommit1"

# Rebase hash789..67hash8 onto hash789
```

エディタを閉じるとメッセージをまとめるかどうか聞かれますので、まとめたメッセージを記入して閉じます。

```diff
- # This is a combination of 2 commits.
- # The first commit's message is:
-
- 不要なcommit2
- This reverts commit hash789hash789hash789hash789hash789.
-
- # This is the 2nd commit message:
-
- 不要なcommit1
- This reverts commit 67hash867hash867hash867hash867hash8.
+ 不要なcommitをRevert

# Please enter the commit message for your changes. Lines starting
```

あとはpushすればOKです。

```sh
$ git push origin master
```

シリーズと言いつつ続編は考えてません。
wordpressのユーザーページに入力項目を追加する

ユーザー→ユーザーについて→プロフィール情報の下に入力項目を追加する

#テキストエリアを追加する場合

```php:function.php
<?php 
//ユーザーのプロフィール情報下にテキストエリアを追加
function add_user_essay_form( $bool ) {
    global $profileuser;
    if ( preg_match( '/^(profile\.php|user-edit\.php)/', basename( $_SERVER['REQUEST_URI'] ) ) ) {
?>
    <tr>
        <th scope="row"><label for="user_essay">肩書き</label></th>
            <td>
				<textarea name="user_essay" rows="5" cols="30" onfocus="this.select()"><?php echo esc_attr( $profileuser->user_essay ); ?></textarea>
                <p>職務や経歴などを記入してください。</p>
            </td>
        </tr>
<?php
    }
    return $bool;
}
add_action( 'show_password_fields', 'add_user_essay_form' );

function update_user_essay( $user_id, $old_user_data ) {
    if ( isset( $_POST['user_essay'] ) && $old_user_data->user_essay != $_POST['user_essay'] ) {
        $user_essay = wp_filter_kses( $_POST['user_essay'] );
        update_user_meta( $user_id, 'user_essay', $user_essay );
    }
}
add_action( 'profile_update', 'update_user_essay', 10, 2 );
?>

```

#テキスト項目を追加する場合

```php:function.php
<?php

function add_user_data_form($bool)
{
	global $profileuser;
	if ( preg_match('/^(profile\.php|user-edit\.php)/', basename($_SERVER['REQUEST_URI'])) )
	{ ?>

<tr>
	<th scope="row">項目１</th>
	<td>
		<input type="text" name="user_data1" id="user_data1" value="<?php echo esc_html($profileuser->user_data1); ?>" />
	</td>
</tr>

<?php }
	return $bool;
}
add_action('show_password_fields', 'add_user_data_form');

function update_user_data($user_id, $old_user_data)
{
	if ( isset($_POST['user_data1']) && $old_user_data->user_data1 != $_POST['user_data1'] )
	{
		$user_data1 = sanitize_text_field($_POST['user_data1']);
		$user_data1 = wp_filter_kses($user_data1);
		$user_data1 = _wp_specialchars($user_data1);

		update_user_meta($user_id, 'user_data1', $user_data1);
	}
}
add_action('profile_update', 'update_user_data', 10, 2);

?>
```

#出力する

テキストエリア

```php
echo nl2br($userdata->user_essay);
```

テキスト

```php
<?php $userdata = get_userdata('ユーザーID'); ?>
<?php echo esc_html($userdata->user_data1); ?>
```
https://ja.forums.wordpress.org/topic/8406
http://wordpress-design.net/archives/1927
http://aroun-d.com/2012/06/04/3917/
Laravel5でオリジナルの404を表示させる


ずっと気になってはいたが、そのやり方。

##やりたいこと

404の時に、カスタムページ（エラー）を表示したい。

##やること

下記のファイルを作って好きなように記述する。

>resource/views/errors/404.blade.php

お察しの通り、404以外もOK。

##その他

コードの中で、

```php
abort(404)
```
とすることで、エラーを発生されることもできる。
言語処理100本ノック 03 ~ 05

*03. 円周率*
"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し，各単語の（アルファベットの）文字数を先頭から出現順に並べたリストを作成せよ．

```nlp03.py
#! usr/bin/env python
from collections import Counter 
str = 'Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics'
li = []
count = Counter(map(len,str.split())).most_common()
for i in range(len(count)):
    li.append(count[i][0])
print(li)
```
実行結果
[9, 1, 3, 5, 7, 2, 4, 6, 8]

forループを使わずに実装する方法がわかりませんでした。

*03円周率 変更*
ご指摘をいただいた間違えている部分を訂正します。ご指摘ありがとうございます。
問題を読み間違えて、文字数の出現率が高い文字数を出力するプログラムを書いてしまいました。それと、,や.も文から削除していませんでした。

```nlp03re.py
#!usr/bin/env python
seq = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
seq = seq.replace(",","").replace(".","")
words = seq.split()
count =[]
for i in words:
    count.append(len(i))
print count 
```
実行結果
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]

円周率になりました。
","や"."を省く部分がもっといい書き方があると思うんですが、、、

*04. 元素記号*
"Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."という文を単語に分解し，1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字，それ以外の単語は先頭に2文字を取り出し，取り出した文字列から単語の位置（先頭から何番目の単語か）への連想配列（辞書型もしくはマップ型）を作成せよ．

```nlp04.py
#!usr/bin/env python
str = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
number = [1, 5, 6, 7, 8, 9, 15, 16, 19]
dict = {}
strsp = str.split()
for i in range(len(strsp)):
    word = strsp[i]
    if i in number:
        dict[word[0:2]] = i
    else:
        dict[word[0:1]] = i
print(dict)
```
実行結果
{'A': 17, 'B': 4, 'Co': 5, 'No': 6, 'H': 0, 'K': 18, 'Cl': 16, 'M': 11, 'L': 2, 'Ne': 9, 'P': 14, 'S': 13, 'Ox': 7, 'N': 10, 'Fl': 8, 'Ca': 19, 'Se': 15, 'He': 1}

*04元素記号 修正*
ご指摘をいただいた部分を修正しました。
この課題も,と.を省かなければいけなかったことと、順番のカウントが0ベースになっていた部分を修正しました。
さらに、位置情報をdictの値としなければならないところが単語の長さになっていた部分を修正しました。

```nlp04.py
#!usr/bin/env python
str = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
number = [1, 5, 6, 7, 8, 9, 15, 16, 19]
dict = {}
words = str.replace(","," ").replace("."," ").split()
for (i,word) in enumerate(words,1):
    if i in number:
        dict[word[0:1]] = i
    else:
        dict[word[0:2]] = i
print(dict)
```
実行結果
{'Be': 7, 'C': 5, 'B': 5, 'Ca': 3, 'F': 8, 'S': 8, 'H': 2, 'K': 4, 'Al': 4, 'Mi': 5, 'Ne': 3, 'O': 7, 'Li': 4, 'P': 5, 'Si': 4, 'Ar': 6, 'Na': 7, 'N': 3, 'Cl': 6, 'He': 2}

*05. n-gram*
与えられたシーケンス（文字列やリストなど）からn-gramを作る関数を作成せよ．この関数を用い，"I am an NLPer"という文から単語bi-gram，文字bi-gramを得よ．

```nlp05.py
#! usr/bin/env python
def word_ngram(n,seq):
    li = []
    for i in range(len(seq.split())+1-n):
        li.append(seq.split()[i:i+n])
    return li
def char_ngram(n,seq):
    li = []
    for i in range(len(seq)):
        li.append(seq[i:i+n])
    return li
str = "I am an NLPer"
print(word_ngram(2,str))
print(char_ngram(2,str))
```
実行結果
[['I', 'am'], ['am', 'an'], ['an', 'NLPer']]
['I ', ' a', 'am', 'm ', ' a', 'an', 'n ', ' N', 'NL', 'LP', 'Pe', 'er', 'r']

文字bigramは空白も一文字と考えてます。
Swiftで型安全なFluxアーキテクチャを実現する

# iOSアプリ開発でもFluxしたい
Webアプリケーションのフロントエンドを[React](http://facebook.github.io/react/) + [Flux](https://facebook.github.io/flux/)な構成で開発すると、若干コードが増えて面倒にはなりつつも、
ビューの状態やデータの流れが明示的になってとてもわかりやすいなと改めて感じてます。
iOSアプリでもこういうことがやりたいのですが、基本的にFluxは考え方に過ぎないので必要な実装は自分でやらないといけません。

なので作ってみました。
https://github.com/yonekawa/SwiftFlux

# 使い方

基本的には必要なAction protocolとStore protocolを実装したクラスを作り、DispatcherとEventEmitterを使ってView - Action - Store - View の単方向データフローを作るだけです。詳しくは[README](https://github.com/yonekawa/SwiftFlux/blob/master/README.md)をご覧ください。


```swift
//: Step 1: Actionを定義
class TodoAction {
    class Create : Action {
        typealias Payload = Todo
        func invoke() {
            let todo = Todo(title: "New ToDo")
            Dispatcher.dispatch(self, result: Result(value: todo))
        }
    }
}

//: Step 2: Storeを定義してdispatchされたいActionにDispatcher.registerする
class TodoStore : Store {
    static let instance = TodoStore()

    enum TodoEvent {
        case Created
    }
    typealias Event = TodoEvent

    var todos = [Todo]()
    var list: Array<Todo> {
        get {
            return todos;
        }
    }

    init() {
        Dispatcher.register(TodoAction.List()) { (result) -> Void in
            switch result {
            case .Success(let box):
                self.todo = box.value
                EventEmitter.emit(self, event: TodoEvent.Created)
            case .Failure(let box):
                break;
            }
        }
    }
}

//: Step 3: ViewController側でEventをlistenする
EventEmitter.listen(TodoStore.instance, event: TodoStore.Event.List) { () -> Void in
    for todo in TodoStore.instance.list {
        plintln(todo.title)
    }
}

//: Step4: ユーザーのインタラクションに応じてActionをinvokeする
TodoAction.List().invoke()
```

# 何が嬉しいの？

JavaScriptのように型が無い言語におけるFlux実装では、Actionから何がStoreに流れてくるのかは実装を見ないとわからず、
SwiftFluxではSwiftのジェネリクスやenumを使って、型安全なFluxを実現するように設計されています。
例えば上記のコード例だと、`TodoAction.Create`アクションが実行されて、Storeに渡ってくる値は`typealias`とジェネリクスによって必ず`Todo`オブジェクトであることが示されます。
型安全であることにより、Xcodeのコード補間が強力に動作します。`Dispatcher.dispatch`に渡す値は`Todo`であることがわかるため、コード補間やコンパイラによるチェックによって迷うことなくコードを書くことができます。

また、よくあるFlux実装ではdispatchされたブロックでActionのTypeによってswitchで処理を分岐することが多いですが、registerするActionを指定するようなインタフェースにすることでブロックに渡ってくる結果が自明になりました。
結果には[antitypical/Result](https://github.com/antitypical/Result)を使うことで、アクションが成功した時と失敗した時の型をより明確に示すことができます。

実装にあたっては[APIKit](https://github.com/ishkawa/APIKit)の設計を大いに参考にしました。

# 今後の予定
直近では、Swift2 にすれば `Dispatcher` もプロトコルベースにしてデフォルト実装を提供すればアプリの性質によって実装を差しかえることもやりやすくなりそうなので対応したいなと思っています。
また、`EventEmitter`は型を重視してStoreのEventしかlistenできなくしてあるので、Swift2化したらこれはStoreのデフォルト実装にしたいです。
`Dispatcher.register`に対してActionのインスタンスが必要になるのが微妙だと思っていて、ここはなんとかしたいところです。

とりあえず自分で使いたいがために作ったので、まずはこれをベースにアプリを書いてみて徐々に改善していきたいと思ってます。
AngularJS の template 管理についてまとめてみた

# はじめに

AngularJS の template をどう管理していますか？

AngularJS の template とぼくが呼ぶのは AngularJS の Directive の `template` あるいは `templateUrl` で指定するものです。

この AngularJS の template の管理についてはドキュメントやサンプルコードあるいはブログ記事ではあまり大きく取り上げられたところを見ないのですが、実用上は重要な問題だとぼくは考えています。

そこで今回はいくつかの方法とともにぼくの採用している `gulp-angular-templatecache` を使った方法を紹介しようと思います。

(サンプルコードはすべて CoffeeScript で記載します)

# AngularJS template を指定する 3 つの方法

Directive の template と templateUrl についておさらいします。 3 つの方法があります。

1. template : template 文字列を指定します。
2. templateUrl (1) : template 文字列を指す URL 文字列を指定します。
3. templateUrl (2) : template 文字列を指す URL 文字列を返す関数を指定します。

1 つめの方法は template 文字列を直接指定することを想定しています。例えば `'<p>{{value}}</p>'` のように直接 template 文字列を指定します。

2 つめの方法は template 文字列を別ファイルに分離することを想定しています。例えば `'index.html'` のように templateUrl 文字列を指定します。この方法に関しては次節でもうすこし掘り下げようと思います。

3 つめの方法はぼくは使ったことがないのですが、例えば `(el, attrs) -> 'index.html'` のように指定します。

このあたりの情報は https://docs.angularjs.org/guide/directive を参照すると良いと思います。(個人的にはこのドキュメントもリファレンスも使いづらくて大嫌いです。)

# templateUrl に指定する値を準備するための 2 つの方法

templateUrl は template 文字列を別ファイルに分離することを想定した推奨される方法です。具体的にどう分離するのかを見てみましょう。

まず HTML に書いてしまう方法です。

```html
<script type="text/ng-template" id="index.html">
  <p>{{value}}</p>
</script>
```

AngularJS は `<script type="text/ng-template">` を見つけるとその内容を `$templateCache` に取り込みます。`id` 属性で指定した値を `templateUrl` に指定できます。

詳細は https://docs.angularjs.org/api/ng/directive/script を参照すると良いと思います。

次に `$templateCache` を直接使う方法です。

例で示します。これは上記とほとんど同じ動きをします。

```coffeescript
angular.module 'myApp', []
.run [
  '$templateCache'
  ($templateCache) ->
    $temlateCache.put 'index.html', '<p>{{value}}</p>'
]
```

この方法では `template` に直接指定していたときと何も変わりません。そこでいくつかの対策があります。これは後述します。

ちなみに $templateCache の詳細は https://docs.angularjs.org/api/ng/service/$templateCache を参照すると良いと思います。

# 本題

ここまでが前提知識です。

ここからが冒頭の「AngularJS の template をどう管理していますか？」のぼくの答えです。

まず JavaScript 内に HTML を埋め込むことは考えられません。なぜなら多くのテキストエディタではそれは JavaScript の文字列として扱われてしまうため、ハイライトや補完などの入力支援を受けることができないからです。

つまり `*.html` として作成したものを変換して取り込みたいというわけです。

いろいろ方法はありますがいくつかの案を挙げます。

- `template` に JavaScript 文字列に変換した `*.html` を指定する
- `$templateCache` に JavaScript 文字列に変換した `*.html` を指定する

どちらでも大差ないと思います。ぼくは後者を利用しています。後述のツールの支援を受けているからです。

それが [gulp-angular-templatecache](https://www.npmjs.com/package/gulp-angular-templatecache) という gulp plugin です。詳細はリンクを参照ください。

簡単に使い方を README から引用しておきます。

gulpfile sample:

```coffeescript
templateCache = require 'gulp-angular-templatecache' 

gulp.task 'default', ->
  gulp.src 'templates/**/*.html'
    .pipe templateCache()
    .pipe gulp.dest('public')
```

output sample:

```javascript
angular.module("templates").run([$templateCache,
  function($templateCache) {
    $templateCache.put("template1.html",
      // template1.html content (escaped) 
    );
    $templateCache.put("template2.html",
      // template2.html content (escaped) 
    );
    // etc. 
  }
]);
```

さきほど期待していた出力が得られたと思います。これを使ってぼくの環境ではうまく管理できています。

## 最後に

この文書を作成した動機として[b-html/b-html](https://github.com/b-html/b-html) で HTML より効率的に書く方法の紹介があるのですが、長くなりそうなのでそれは別の機会にします。

以上。
[Webstorm] GruntfileがルートにないときにGruntパネルを出す方法

WebStormで、GUIでGruntを回したいときの話です。
(おそらくGulpの時も同じ)

## Gruntfileがルート以外だとGruntパネルがいなくなる
Gruntfile.js がWebstormのProjectルートに居ない場合、
WebStormの「Grunt」パネルがデフォルトで出ません。


![cap_ 2015-08-03 19.49.32.png](https://qiita-image-store.s3.amazonaws.com/0/48396/f074e0db-774b-03c9-6a82-da9928d77ae8.png)


↑ Gruntfileがルートにいればここに出てくるはず


## Gruntfileの場所を明示する必要がある

Projectパネルから、Gruntfileを右クリックすると、コンテキストメニューの下の方に「Show Grunt Tasks」があるのでクリック

![cap_ 2015-08-03 19.53.48.png](https://qiita-image-store.s3.amazonaws.com/0/48396/47c59c9a-1a9c-a7ea-25dc-4edf05f3815e.png)


　　↓
するとパネルがでます。

![cap_ 2015-08-03 19.58.00.png](https://qiita-image-store.s3.amazonaws.com/0/48396/3cb6af85-875b-5956-9895-9b59a82df88a.png)

あとはダブルクリックでタスクを回すだけです。
Apache 2.2.xでネームベースのVirtual Hostの設定


ここのところDocumentRootじゃないと動かない環境をテストすることが多いのでVirtual Hostの設定メモ。

##前提

* CentOS 6.x。別に他の環境でも同じ。
* Apacheはもう入ってるということで。

##やること

大きくは2つ。

* /etc/httpd/conf/httpd.confの編集（1行）
* /etc/httpd/conf.d/virtual.confの編集（ファイル名は何でも良い）

###httpd.confの設定

まず、そもそもVirtualHostを使いますよ！という宣言をApacheの設定ファイルであるhttpd.confにする。
と入っても簡単。ServerName www.example.com:80 （変わってるかも）

```bash
ServerName www.example.com:80
↓
#ServerName www.example.com:80
```

となっているところをコメントアウト。NameVirtualHost *:80

```bash
#NameVirtualHost *:80
↓
NameVirtualHost *:80
```
となっているところをコメントイン。httpd.confの設定は以上。
これで、Apacheは、俺はVirtualHostを運用している！と認識します。

>既に運用していたサーバに上記の設定をすると、今までのDocumentRootは原則無効になります。
新しくVirtualHostとして、既存のサイトも設定してあげる必要があります。

###virtual.confの設定

ファイルの名前はなんでもいい。
Apacheは起動時に/etc/httpd/conf.d/以下にある*.confファイルを全て読み込む。
なので、ファイル名はhoge.confとしても、foo.confとしてもいい。ここではvirtual.confとする。
なお、バーチャルホストが増えるようなら、www.aaa.com.conf, www.bbb.com.conf という感じで、ドメイン毎にファイルを用意するもの良い。

そこに、こんな感じで書く。

```bash
#1つめのサイト
<VirtualHost *:80>
  ServerName www.hoge.com
  ServerAlias main.com
  DirectoryIndex index.html index.php
  AddDefaultCharset UTF-8
  DocumentRoot /var/www/html/
  <Directory "/var/www/html/">
    AllowOverride All
    Options FollowSymLinks -Indexes
  </Directory>
</VirtualHost>

#2つ目のサイト
<VirtualHost *:80>
  ServerName test.hoge.com
  DirectoryIndex index.html index.php
  AddDefaultCharset UTF-8
  DocumentRoot /var/www/test/
  <Directory "/var/www/test/">
    AllowOverride All
    Options FollowSymLinks -Indexes
  </Directory>
</VirtualHost>
```

という感じ。後は3つあっても、4つあっても同じ。
必要に応じて、各種Logの位置などもいじります。Override等は\<Directory>\</Directory>で設定します。

###コンテンツの準備

DocumentRootに指定したディレクトリが無いと、Apacheが起動時（再起動時）に怒ります。
先に、ディレクトリを作成し、適切なパーミッションを設定の上、index.htmlファイルを用意しておきます。

###Apacheの（再）起動

```bash
sudo service httpd restart
```
起動してないならstartで。

###テスト
DNSを適切に設定し、しばらく経ってアクセスして、それぞれのコンテンツが見えればOK。
DNSが無い。もしくは持ちきれない人は、ローカル環境の/etc/hostsなどを設定すればいいでしょう。

* windowsだと、windows¥system32¥drivers¥etc¥hosts（うろ覚え。確かその辺）。
* Macだと、[hoster](http://www.redwinder.com/macapp/hoster/)を使ったほうが早いでしょう。

以上。
zshでD言語(とC言語とC++)をスクリプトのように扱う。

D言語はコンパイルが速くて、正直bashより慣れています。少し難しい処理とかはついついD言語で書いてしまうことが多いです。(本当はpythonとか使うべきなのでしょうが...)。
しかしD言語は静的言語。コンパイル -> 実行としなくてはいけないわけです。
そこで、D言語のソースファイルをまるでスクリプトのように扱おうというのが今回の記事です。
#Zshのalias -sを使う。
自分は一応Zsh使いなので、Zshの機能を使います。と言うか、この機能に関する他の方の記事をみて改良?いしました。
alias -sを使うと、特定の拡張子の時に、コマンドを省略して実行できます。

```bash:.zshrc
alias -s py=python
```

```py:test.py
print("Test")
```
zshの設定に反映した上で、

```bash:result
namachan-PC% ./test.py
Test
```
こんな感じに出来ます。便利ですね。
これを応用して、

```bash:.zshrc
function rundmd(){
    dmd $1
    base=$1
    file=${base%.*}
    file
    rm -f ${file}
    rm -f ${file}".o"
}

alias -s d=rundmd
```
こうすれば、D言語のソースファイルをDMD(公式コンパイラ)を使って、Pythonの例のように実行できます!やったー!
~~**と、思ったんですが、**~~
~~rdmdというのがあったのを思い出しました...。これを使うと、rundmd関数が要らないみたいです...
先に気づけ自分。~~
*追記*
恐るべきことに、`alias -s`すら要らなかったようです。
tm_tnさんにコメントで教えて頂いたのですが、D言語の場合、
`#!/use/bin/rdmd`(`/usr/bin/rdmd`のところはインストールした場所)
で同じように出来てしまいます。
ま、まあ、Zshなら`#!/usr/bin/rdmd`の手間が省けるよーってことで...

##GCC
一応置いときます。

```bash:.zshrc
function rungcc(){
    gcc $1
    base=$1
    file=${base%.*}
    ./a.out
    rm -f a.out
}

alias -s {c,cpp}=rungcc
```
上記のDMDの例を改造したら大体の静的言語でも同じように出来ると思います。
シェルスクリプトを使っているので、多少複雑なコンパイルでもいけるのが強みです。
bashスクリプトは完全に初心者なので、効率化出来る部分とかあったら教えていただけると嬉しいです。
MacのiTerm2でOptionキーをmetaとして認識させる方法

iTerm2でEmacsやshellを操作するとき、デフォルトではOptionキーをmetaとして認識してくれませんでした。

## 解決方法

iTerm2のPreference -> Profiles -> keys の設定画面で、
Left Option key acts as `+Esc` にチェック
Right Option key acts as `+Esc` にチェック

![スクリーンショット 2015-08-03 19.35.25.png](https://qiita-image-store.s3.amazonaws.com/0/18740/d08e77cb-838e-f40c-2090-0cbc5956fbb0.png)
Elastic Load BalancerにSSL証明書を入れる時ハマったこと

本番サーバにSSL証明書を入れる作業がありました。AWSのページを見ると、簡単の作業だと思ってしまったが、２つのところにはまってしまった。

基本的にこれを参照しました。http://www.nczonline.net/blog/2012/08/15/setting-up-ssl-on-an-amazon-elastic-load-balancer/

###中間証明書チェーン
AWSのコンソールページにOptionを書いてあるけど、要ります。

今回RapidSSL証明書を買って、まず証明書のハッシュアルゴリズムを確認して下さい。

* SHA2(256bits)
* SHA1

SHA1は古いので、デフォルトはSHA2です。中間証明書チェーンを選ぶ時知っておくべきです。

中間証明書の順番は大事！Root証明書は必ず最後置いとく
![Screen Shot 2015-08-03 at 19.19.52.png](https://qiita-image-store.s3.amazonaws.com/0/37718/32f33ea3-b946-5af7-fbc0-481fb42a31b9.png)

RapidSSL証明書なら、すでに用意してくれるものがあるので、使えばいいと思います。
https://www.slogical.co.jp/ssl/details/rapidssl

###Security Group
Load Balancerにhttpsを追加するだけではなく、**Load Balancerのsecurity groupにport 443にのアクセス**が許可されているかどうかも確認して下さい。
ggplot2 で qplot() と ggplot() のどちらを選びますか？ #rstatsj

> 本記事は [ggplot2逆引き](http://qiita.com/tags/ggplot2%E9%80%86%E5%BC%95%E3%81%8D/items) プロジェクトの一環として、Stack Oveflow の下記記事を翻訳したものです。
> [Choosing between qplot() and ggplot() in ggplot2](http://stackoverflow.com/questions/5322836/choosing-between-qplot-and-ggplot-in-ggplot2)

## 質問

私は R でのプロットに、素晴らしい `ggplot2` パッケージを使い始めた者です。
`ggplot2` でプロットを作成しようとするとき、まず最初に自分に問いかける質問があります。
「うーむ、`qplot` と `ggplot` のどちらを使おうか」

私の理解では、`qplot` 関数はシンプルな文法を提供するものであり、一方 `ggplot` 関数はより柔軟に全ての機能を利用可能にするものだと思っています。
ここで質問したいのは、みなさんはどちらかの関数を重点的に使用しているのでしょうか？
もしくは、「こういう場合にはこっちを使う」という明確な基準を持っているのでしょうか？

普段は `qplot` を使用して、複雑なプロットを描くときだけ `ggplot` を使用しているのでしょうか？
それとも常に `ggplot` を使用しているのでしょうか？

ご回答いただけると幸いです！

## 回答

私の場合、もし `qplot` と `ggplot` の両方が使用可能である場合は、データが `data.frame` に格納されているのか、それとも別々の変数になっているのかというのが使い分けの基準になります。

```r:R
x <- 1:10
y <- rnorm(10)

qplot(x, y, geom="line") # こっちを使う
ggplot(data.frame(x, y), aes(x, y)) + geom_line() # くどい

d <- data.frame(x, y)

qplot(x, y, data=d, geom="line") 
ggplot(d, aes(x, y)) + geom_line() # こっちを使う
```

もちろん、もっと複雑なプロットを描くには、`ggplot()` が必要になります。
そして私は普段からデータを `data.frame` に格納するようにしているので、経験上、`qplot` を使用するのは稀です。

私は常に `ggplot()` を使うのが良いように思います。
`qplot` を使えばタイプ量は減るかもしれませんが、多くの機能が使えないわけですから。
[JAWS-UG CLI] AutoScaling:#4 インスタンスの増強


前提条件
========


AutoScalingへの権限
-------------------

AutoScalingに対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

* AWS CLI 1.10.58

```bash:コマンド:
aws --version
```

結果(例):

      aws-cli/1.10.58 Python/2.7.11 Darwin/15.6.0 botocore/1.4.48


0. 準備
=======


0.1. リージョンの決定
---------------------

```bash:変数の設定:
AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. 変数の確認:
----------------

プロファイルが想定のものになっていることを確認します。

```bash:変数の確認:
aws configure list
```

結果(例):

            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile       ec2as_full-prjZ-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region        ap-northeast-1        env    AWS_DEFAULT_REGION


1. 事前作業
===========

```bash:変数の設定:
AS_DESIRED_CAPACITY='2'
```


2. インスタンスの増強
=====================

```bash:変数の確認:
cat << ETX

        AS_GROUP_NAME:       ${AS_GROUP_NAME}
        AS_DESIRED_CAPACITY: ${AS_DESIRED_CAPACITY}

ETX
```

```bash:コマンド:
aws autoscaling set-desired-capacity \
        --auto-scaling-group-name ${AS_GROUP_NAME} \
        --desired-capacity ${AS_DESIRED_CAPACITY}
```

結果(例):

      (戻り値なし)


3. 事後作業
===========

```bash:コマンド:
aws autoscaling describe-auto-scaling-instances 
```

結果(例):

      {
        "AutoScalingInstances": [
          {
              "ProtectedFromScaleIn": false,
              "AvailabilityZone": "ap-northeast-1a",
              "InstanceId": "i-xxxxxxxx",
              "AutoScalingGroupName": "asgroup-handson-20160829",
              "HealthStatus": "HEALTHY",
              "LifecycleState": "InService",
              "LaunchConfigurationName": "launchcongig-handson-20160829"
          },
          {
              "ProtectedFromScaleIn": false,
              "AvailabilityZone": "ap-northeast-1c",
              "InstanceId": "i-xxxxxxxx",
              "AutoScalingGroupName": "asgroup-handson-20160829",
              "HealthStatus": "HEALTHY",
              "LifecycleState": "InService",
              "LaunchConfigurationName": "launchcongig-handson-20160829"
          }
        ]
      }

```bash:コマンド:
aws ec2 describe-instances \
        --filters Name=instance-state-name,Values=${EC2_INSTANCE_STATUS} \
        --query 'Reservations[].Instances[].InstanceId'
```

結果(例):

      [
        "i-xxxxxxxx",
        "i-xxxxxxxx"
      ]


完了
====
デフォルトのテキストエディタをXCodeから変更する方法


最近Atomを使い始めたので、ファイル開くときにデフォルトでAtomを開きたかったので調べてみました。


1.Finderで任意の拡張子のファイル(何でもいい。ここでは.rbを選択)を選んで右クリック
2.「情報を見る」をクリック
3.「このアプリケーションで開く」でAtom(とか他のエディタ)を選択
4.そのすぐ下の「すべてを変更」にチェック

これですべての.rbファイルがAtomで開くようになりました。
Androidでサロゲートペアを削除する

#Androidでサロゲートペア文字列を排除するコード

サーバー側でutf8mb4に対応しておらずAndroid側で絵文字などを排除したい場合に。

```java

package jp.hoge.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * マルチバイト文字
 * Created by y_hoshi on 2015/07/03.
 */
public class MultiByteString {

    /**
     * サロゲートペアが含まれる文字を削除した文字列をレスポンスする
     * @param src
     * @return
     */
    static public String deleteSurrogateChar(String src){
        Pattern pattern = Pattern.compile("[\\u0000-\\uFFFF]*");
        Matcher matcher = pattern.matcher(src);
        String outString = "";

        if(!matcher.matches()){
            for(int i =0; src.length() > i; i++){
                if(MultiByteString.isSurrogate(src.substring(i, i+1))){
                    i++;
                }
                else{
                    outString = outString + src.charAt(i);
                }
            }

        }
        else{
            outString = src;
        }

        return outString;
    }

    /**
     * サロゲートペアが含まれているかチェックする
     * @param text
     * @return
     */
    static public boolean isSurrogate(String text) {
        for (int i = 0; i < text.length(); i++) {
            if (text.charAt(i) >= '\uD800' && text.charAt(i) < ('\uDFFF' + 1)) {
                return true;
            }
        }
        return false;
    }

}

```
[JAWS-UG CLI] AutoScaling:#8 起動設定の削除


前提条件
========


AutoScalingへの権限
-------------------

* AutoScalingに対してフル権限があること。


EC2への権限
-----------

* EC2に対してフル権限があること。


AWS CLIのバージョン
-------------------

* 以下のバージョンで動作確認済

  * AWS CLI 1.7.42

```bash:コマンド:
aws --version
```

```text:結果(例):
      aws-cli/1.7.42 Python/2.7.5 Darwin/13.4.0
```


0. 準備
=======


0.1. リージョンの決定
---------------------

```bash:変数の設定:
AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. 変数の確認
---------------

```bash:変数の確認:
aws configure list
```

```text:結果(例):
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile    ec2as_full-prjZ-mbp13              env    AWS_DEFAULT_PROFILE
      access_key     ****************LOAQ shared-credentials-file
      secret_key     ****************I1O1 shared-credentials-file
          region           ap-northeast-1              env    AWS_DEFAULT_REGION
```


0.3. 稼動インスタンスを確認
---------------------------

同一リージョンでインスタンスが起動していることを確認します。

```bash:コマンド:
aws ec2 describe-instances \
        --filters Name=instance-state-name,Values=running
```

```json:結果:
      {
          "Reservations": []
      }
```


0.4. 起動設定名の指定
---------------------

```bash:変数の設定:
AS_GROUP_NAME=''
```

1. 事前作業
===========



設定内容を確認します。

```bash:コマンド:
aws autoscaling describe-launch-configurations \
        --launch-configuration-names ${AS_LAUNCH_CONFIG_NAME} 
```

```json:結果(例):
      {
        "LaunchConfigurations": [
          {
              "UserData": "",
              "EbsOptimized": false,
              "LaunchConfigurationARN": "arn:aws:autoscaling:us-west-2:XXXXXXXXXXXX:launchConfiguration:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:launchConfigurationName/my-first-lc",
              "InstanceMonitoring": {
                  "Enabled": true
              },
              "ClassicLinkVPCSecurityGroups": [],
              "CreatedTime": "2015-08-01T01:23:45.678Z",
              "BlockDeviceMappings": [],
              "KeyName": "prjx-us-west-2-ec2",
              "SecurityGroups": [
                  "sg-xxxxxxxx"
              ],
              "LaunchConfigurationName": "my-first-lc",
              "KernelId": "",
              "RamdiskId": "",
              "ImageId": "ami-xxxxxxxx",
              "InstanceType": "t2.micro",
              "AssociatePublicIpAddress": true
          }
        ]
      }
```


2. 起動設定の削除
=================


2.1. 起動設定の削除
-------------------

```bash:変数の確認:
cat << ETX

        AS_LAUNCH_CONFIG_NAME: ${AS_LAUNCH_CONFIG_NAME}

ETX
```

```bash:コマンド:
aws autoscaling delete-launch-configuration \
        --launch-configuration-name ${AS_LAUNCH_CONFIG_NAME}
```

```text:結果:
      (戻り値なし)
```


2.2. 起動設定の確認
-------------------

```bash:コマンド:
aws autoscaling describe-launch-configurations \
        --launch-configuration-names ${AS_LAUNCH_CONFIG_NAME} 
```

```json:結果:
      {
          "LaunchConfigurations": []
      }
```




完了
====
【AWS】【S3】エラー: The bucket you are attempting to access must be addressed using the specified endpoint..が出たら

AWS SDK for PHPを使ってS3にファイルをアップロードしようとした際に下記のようなエラーが出ました。

```
AWS Error Message: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint: "sub.domain.com.s3.amazonaws.com".
```

結論から言うとRegionを使用しているものに変更することで解決できました。
（デフォルトではUS Regionらしいです。）

以下のように設定します。

```
$s3 = S3Client::factory(array(
	'region' => 'ap-northeast-1'
));
```
IISの設定でサーバーの制限を上げる

IISを使っていてファイルの大きなものやPostで大きいもの、大量なTextboxとかもですが、アップロードしたときにサーバーでの上限というものがあります。apacheにもありますがIISにももちろんあります。

いまいちわかりづらいのですが、以下のサイトに詳しくありました。

[【Azure】PHPのフォームでファイルサイズの大きいファイルをアップロードすると404がでる件](http://unvent.jp/dev/php/%E3%80%90azure%E3%80%91php%E3%81%AE%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AE%E5%A4%A7%E3%81%8D%E3%81%84%E3%83%95%E3%82%A1/)

[Request Filttering]の[Edit Feature Settings...]でMaximum...というところを大きくして設定完了。
AzureのIISをIISマネージャで管理する方法

IISマネージャでAzureのWebアプリの動いているIISを管理する方法

そもそも管理できるのか？というところから検索していましたがようやく見つけました。忘れないようにメモついでに書いておきます。
以下の記事を見ればわかるのですが、同じことを簡単に書いておきます。
[IIS マネージャーによる Windows Azure Web サイトのリモート管理]
http://blogs.msdn.com/b/windowsazurej/archive/2014/03/05/blog-remote-administration-of-windows-azure-websites-using-iis-manager.aspx

1. IISマネージャが古かったら新しくしておく
2. Windows Azure Web サイトへ接続する。
    3. 接続方法は[File] - [ウェブサイト接続]です。サーバーには接続できません。***サイト***です。
4.  contoso.scm.azurewebsites.net:443
    5.  Azure Web サイトの URL が contoso.azurewebsites.net の場合、SCM サイトの URL は contoso.scm.azurewebsites.netとなります。間に[scm]が入ります。さらにポート番号SSLの443を指定です。
    6.  site nameは、contosoですね。 
7.  ID,WPは、$ユーザ名、パスワードです。Azureのportalからデプロイメントの認証情報を取得するとファイル内に書いてあります。
8.  最後に管理用のコンポーネントが足りない場合はダウンロードしますか？と聞いてきていますがこれをダウンロードしないとほとんど何も表示されないのですべて選択してダウンロードします。かなり時間がかかる場合があります。

以上です。
上記リンク先がなくなってもよいように簡単に書いておきます。
cakePHP CakeDCのsoftDelete

cakePHPにおいてfindやadd,view,deleteといったものはデフォルトで用意されていますが、deleteについては、delete_flagやdeletedやisDeleteといった削除フラグ的なもので物理削除ではなく論理削除をしたいところです。

単純にdeleteの代わりを用意してdelete SQLではなくupdate SQLを実行するように書けばわかりやすいかと思います。ですがその場合は、find出の検索時もいちいち削除フラグがonではない（削除されていない）という条件を付けなければなりません。まあ、それだけなのですが。。

せっかくcakePHPやっているのでdeleteの動きを変更してやることができるので使ってみましょう。
behaviorの機能を使うことになります。

CakeDCというところから出ているsoftDeleteというbehaviorを利用します。
[Utils Plugin for CakePHP http://cakedc.com](http://cakedc.com)


説明にありますが、appModelにそれぞれ追加が必要です。
※検索しててもappModelに追加する記述がなくてうまくいきませんでした。追加するとばっちりです。

あとは、
http://www.tailtension.com/cakephp/398/
こちらが参考になります。


* **テーブルに論理削除用のカラムを作成**

 **削除フラグ**
> 名前：deleted
> 型：tinyint(1)
> ※デフォルト値：0

 **削除日**
> 名前：deleted_date
> 型：datetime

* **モデルに追加**

```php:model/hogehoge.php
public $actsAs = array( 'SoftDelete' );
```

 *以下説明です。*

> **SoftDelete Behavior**

> *The SoftDelete behavior allows you to keep records on database and do not show them to users having a "deleted" flag. By default you should have "deleted" and "deleted_date" fields on your database table.
> Since "exists" method in Model disable callbacks you may experience problems using it. To avoid these problems you can use the "existsAndNotDeleted" method from the behavior and we provide the following code to be put into AppModel to make this transparent:*

```php:AppModel.php
 <?php
public function exists($id = null) {
    if ($this->Behaviors->attached('SoftDelete')) {
        return $this->existsAndNotDeleted($id);
    } else {
        return parent::exists($id);
    }
}
```
> *It will call SoftDelete::existsAndNotDeleted() for models that use SoftDelete Behavior and Model:exists for models that do not use it
When deleting an item the SoftDelete behavior will override the delete() and update the record instead. This means that the response to the delete() will be false. In order to override this and return true, you will need to include the following in your AppModel.php file.*

```php:AppModel.php
<?php
public function delete($id = null, $cascade = true) {
    $result = parent::delete($id, $cascade);
    if ($result === false && $this->Behaviors->enabled('SoftDelete')) {
       return (bool)$this->field('deleted', array('deleted' => 1));
    }
    return $result;
}
```
tmux で attach したら ssh-agent が切れる場合

ForwardAgent が有効な状態で、ssh ログインしなおすと、環境変数SSH_AUTH_SOCK が新しいパスをさすようになる。ここで tmux attach すると、tmux セッション上のシェルは以前の SSH_AUTH_SOCK の値を保持し続けていて、別の所を指しているのでうまくいかない。

~/.bashrc に

```bash
agent="$HOME/.ssh/agent"
if [ -S "$SSH_AUTH_SOCK" ]; then
	case $SSH_AUTH_SOCK in
	/tmp/*/agent.[0-9]*)
		ln -snf "$SSH_AUTH_SOCK" $agent && export SSH_AUTH_SOCK=$agent
	esac
elif [ -S $agent ]; then
	export SSH_AUTH_SOCK=$agent
else
	echo "no ssh-agent"
fi
```

のようなものを追加しておくと、ログインするたびに `$HOME/.ssh/agent` に symlink を貼るようになる。そして `SSH_AUTH_SOCK` は常に `$HOME/.ssh/agent` を見るようにしているので、古い tmux セッションでも最新の `SSH_AUTH_SOCK` の場所を指せるようになる。

`$HOME/.ssh` は通常 700 になっているので、他の人に盗まれることもなくて安心。