OmniAICreator/Qiita-1.07M huggingface dataset:
適当なサイトのTABLEを並び替え可にする

サイトを見ていてTABLE形式になっている表の並び順を変えたくなることがある。
ブラウザのコンソールでうまいこと出来ないかなと思ってたら、
[JavaScriptコンソールからjQuery をページにロードする方法。](http://takuya-1st.hatenablog.jp/entry/20110429/1304101781)
で、コンソールからjqueryを使えるので、tableソート用のプラグインも読み込めばできると思って試した。


まず、コンソールに下記を打ち込んでJqueryを使用可にする。

```js:
document.body.appendChild(function(){
src="https://code.jquery.com/jquery-latest.min.js";
sc = document.createElement("script");
sc.type="text/javascript";
sc.src=src;
sc.onload = function() {};
return sc;
}()
);
```

次に、tableソート用のプラグイン[tsort.min.js](http://www.jqueryscript.net/table/Animated-Table-Sorting-Plugin-For-jQuery.html)を読み込ませる。

```js:
document.body.appendChild(function(){
src="http://www.jqueryscript.net/demo/Animated-Table-Sorting-Plugin-For-jQuery/tsort.min.js";
sc = document.createElement("script");
sc.type="text/javascript";
sc.src=src;
sc.onload = function() {};
return sc;
}()
);

```

次に並び替えを設定したTABLEを指定して実行する。

```js:
$('table').tableSort( {animation :'slide',speed:500} );
```

これでTABLEのヘッダをクリックするとソートが行われる。
３回コンソールにコピペするのはめんどくさい。これ一回のコピペで実行できないものか。
Large-Scale Distributed Bayesian Matrix Factorization using Stochastic Gradient MCMCを読んだ

# KDD2015 Large-Scale Distributed Bayesian Matrix Factorization using Stochastic Gradient MCMCを読んだ
## どんなもの？
ベイズ行列分解はその有効性にも関わらず、計算コストがネックになりあまり使われていない。
ギブスサンプリングを使った場合と同程度の精度を高速に出せる手法を提案する。

## 先行研究と比べると？
stochastic gradient langevin dynamics(SGLD)を分散環境で使えるようにした

## 技術や手法のキモはどこ？
SGDをDSGDにしたときの考え方をSGLDに適用した？

## どうやって有効だと検証した？
netflixとyahooのデータセットで精度と速度を比較した。
比較対象はSGD,DSGD,SGLD,DSGLD,gibbs sampler

## 議論はある？
## 次に読むべき論文は？
- Bayesian probabilistic matrix factorization using markov chain monte carlo
- Largescale matrix factorization with distributed stochastic gradient descent
- Bayesian learning via stochastic gradient langevin dynamics
逆関数, 逆三角関数について

# inverse function ( 逆関数 )
* $x$ の関数 $y=f(x)$ において, $y$ の値を定めると, $x$ の値がただ $1$ つ定まるとき, すなわち, $x$ が $y$ の関数として $x=g(y)$ と表されるとき, $g(x)$ を $f(x)$ の逆関数といい, $f^{-1}(x)$ で表す.
* 逆関数とは，$x$ と $y$ の「役割」を交換し,同じ対応を逆から見た関数のこと.

## 逆関数の求め方  
1. $y = f(x)$ という関係式を，独立変数 $x$ について解き, $x = g(y)$ の形にする.
2. 独立変数が $x$，従属変数が $y$ になるように書きかえて  
(つまり，多くの場合，$x$ を $y$ に，$y$ を $x$ に書きかえて)  
$y = g(x)$ とする.

### 独立変数が x ，従属変数が y になるように書きかえる理由
[進研ゼミ高校講座 高校生の苦手解決Q&A](http://kou.benesse.co.jp/nigate/math/a14m2102.html)によると...
> 数学のルールでは,一般に,関数を「$x$の関数」で表すから.

(そう言われても,いまいち納得出来ない...理由を知っている方がいらっしゃったら教えて下さい.)

## 逆関数の性質
* 逆関数では，もとの関数の定義域，値域が，値域，定義域となる.  
(このことを「定義域と値域が入れかわる」と表現される場合もある.)
* $y = f(x)$ のグラフとその逆関数 $y=g(x)$ のグラフは，  
直線 $y=x$ に関して対称である.

### 例

$ y = x-1$ があるとして,この関数を $ x $ について解くと, $ x = y+1$ となる.
つまり, この関数は, $x$ が $y$ の関数であるのと同時に, $y$ も $x$ の関数である.

このように,
$y = f(x)$ において
$x$ が $y$ の関数であるのと同時に,
$y$ もまた $x$ の関数であるとき,
$x$ について解いた式を
$$x＝g(y)$$ とし,  
$x$ と $y$ の値を入れ替えた関数 $$y = g(x)$$ を $f(x)$ の逆関数といい,  
$$f^{-1}(x)$$ で表す.

$y= x-1$ の逆の操作を言葉で表すと,「ある数 $x$ に $1$ を足す関数( $y = x+1$ )」 
つまり,　逆関数 $f^{-1}(x) = x+1$ となる.

***

どんな関数でも逆関数をもつわけではない.
例えば, 関数 $y=x^{2}$ において, $y=1$ に対応する $x$ の値は $1$ と $-1$ の $2$ つあるから, 関数 $y=x^{2}$ の逆関数は存在しない.
ところが, 関数 $y=x^{2}　(x\geqq0)$ については, $y$ の値を定めると $x$ の値がただ $1$ つ定まるので,逆関数が存在する.
***
# inverse trigonometric function (逆三角関数)

$$ y= \sin x $$
$$ y= \cos x $$
$$ y= \tan x $$
の逆関数はそれぞれ  
$$ y= \sin^{-1}x = arcsin x $$
$$ y= \cos^{-1}x = arccos x $$
$$ y= \tan^{-1}x = arctan x $$

と表す.

逆三角関数の値を求めると,例えば
$$ \sin^{-1}1 = arcsin 1 = \frac{π}{2}$$

$$ \cos^{-1}\left(-\frac{1}{2}\right) = arccos \left(-\frac{1}{2}\right) = \frac{2π}{3}$$
$$ \tan^{-1}\left(-\frac{1}{\sqrt{3}}\right) = arctan \left(-\frac{1}{\sqrt{3}}\right) = -\frac{6}{π}$$


逆三角関数のグラフは三角関数のグラフと,直線 $y=x$ に関して対称である.
(逆関数のグラフはもとの関数のグラフと, 直線 $y=x$ に関して対称)

## 参考文献
 
1) 今井 勧 (監修, 監修):『[大学生のための なんとかなる微分積分](http://amzn.to/1QoH2ve)』ナツメ社, 2009.
2) [進研ゼミ高校講座 高校生の苦手解決Q&A](http://kou.benesse.co.jp/nigate/math/a14m2102.html)
3) [逆関数とは何？](http://manapedia.jp/text/939)
redux使うまでもないときに軽いモドキを作る


「最初からreduxいれんのめんどくさいな〜。かといって後でcomponent書き換えるのもだるいんだよなー」みたいな微妙な感じの時にこんなの考えた。

# 考え方
- 結局`actions`を通じてなんかstateが変更される関数である
- componentsは`actions`のことを基本的に気にしていれば良い
- データとしてのpropsは、親元のstateを受け取れば良い

# コード
だいたい３つで動いた。
メインは`App.jsx`

```index.js
import React from 'react';
import App from './containers/App.jsx';

React.render(
  <App />,
  document.getElementById('root')
);
```

```containers/App.jsx
import React, { Component } from "react"
import Counter from '../components/Counter.jsx';

export default class App extends Component{
  constructor(){
    super()
    this.state = {
      counter: 0
    }
  }
  get actions(){
    // actionCreator + reducerでやってることをさらっとやる。
    return {
      increment : () => {
        this.setState({
          counter: this.state.counter + 1
        })
      }, 
      decrement : () => {
        this.setState({
          counter: this.state.counter - 1
        })
      }
    }
  }
  render(){
    let props = {
      counter: this.state.counter,
      ...this.actions
    }
    return <Counter { ...props }/>
  }
```

Counterはreduxのサンプルから拝借

```components/Counter.jsx
mport React, { Component, PropTypes } from 'react';

class Counter extends Component {
  render() {
    const { increment, decrement, counter } = this.props;
    return (
      <p>
        Clicked: {counter} times
        {' '}
        <button onClick={increment}>+</button>
        {' '}
        <button onClick={decrement}>-</button>
      </p>
    );
  }
}

export default Counter;
```

# まとめ
サンプル: http://inuscript.github.io/example-modoki-redux/
ソース: https://github.com/inuscript/example-modoki-redux

## 感想
- そんなに悪くない
- とはいえ場当たり的。わりと早い段階でめんどくさくなる。
- actionだけ通じてstateの変更するってことだけ考えるのはシンプルで良いかもしれない
Sassでメディアクエリを効率的に管理するマップとmixin

使用するのはSass3.3から追加された新しいデータタイプのマップ。これはkeyとvalueのペアを定義できるものです。マップでvalueを取得するには`map-get()`関数を使用します。

```scss
map-get($map, $key)
```

詳しくはこちらの記事を参照してください。

[Sass 3.3で追加された新しいデータタイプ「マップ」まとめ解説 | HTML5Experts.jp](https://html5experts.jp/kosei27/3727/)

マップはこのように定義しておきます。

```scss
$breakpoints: (
    'sm': 'screen and (min-width: 400px)',
    'md': 'screen and (min-width: 768px)',
    'lg': 'screen and (min-width: 1000px)',
    'xl': 'screen and (min-width: 1200px)',
) !default;
```

例えば`sm`がkeyで`screen and (min-width: 400px)`がvalueになります。valueをクウォートで囲んで文字列として明示的に定義しておきます。

上述した`map-get()`関数の`$map`は定義したマップの`$breakpoints`にあたり、`$key`は`sm`や`md`などにあたります。mixinは以下のように定義します。引数にkeyを渡してvalueをブレイクポイントとして取得できるようにしています。

```scss
@mixin media-query($breakpoint) {
    @if map-has-key($breakpoints, $breakpoint) {
        @media #{inspect(map-get($breakpoints, $breakpoint))} {
            @content;
        }
    } @else {
        @warn "Unfortunately, no value could be retrieved from `#{$breakpoint}`. "
        + "Please make sure it is defined in `$breakpoints` map.";
    }
}
```

`map-has-key()`はマップが存在しているかを判定（これはなくてもOKです）、`unquote()`でvalueで囲んでいるクウォートを取り除きます。

実際にメディアクエリを呼び出す時にはこのようにします。

```scss
.foo {
  color: red;
  @include media-query(sm) {
    color: blue;
  }
}
```

コンパイル結果はこのようになります。

```scss
.foo {
  color: red;
}
@media screen and (min-width: 400px) {
  .foo {
    color: blue;
  }
}
```

この方法を使えば、1つのmixinとマップだけで様々な条件のブレイクポイントに対応ができ、それによってブレイクポイントの管理が分かりやすく変更しやすくなります。

以下の記事を参考にさせていただきました。


* [Using Sass Maps](http://www.sitepoint.com/using-sass-maps/)
* [Sass Guidelines](http://sass-guidelin.es/#maps)
* [Sass 3.3で追加された新しいデータタイプ「マップ」まとめ解説 | HTML5Experts.jp](https://html5experts.jp/kosei27/3727/)
変数のスコープを少しでも狭める

リファクタリングに関するささやかなメモです。
今の時代には常識的なことにすぎないことです。

####推奨する指針
・変数の宣言は、その変数を使う直前まで遅くする。変数を宣言するときに同時に初期化する。
・ループの中でしか使わない変数の宣言は、ループの中で行う。


####推奨する形式のコード例

```cpp:
if(条件1){
	cv::Mat mat;
	somefunc1(mat);
}

if(条件2){
	cv::Mat mat;
	somefunc2(mat);
}
```

と書いてあれば、最初のif文のcv::Mat型の変数 matと2度目のif文のmat型は別物であることが明確にわかります。しかも2つのif文の後にmatの値を利用していないことがわかります(理由：文法的に利用できない)。


####推奨しない形式のコード例

しかし

```cpp:
IplImage *img;
if(条件1){
	somefunc1(img);
}
if(条件2){
	somefunc2(img);
}
//長い記述
//imgを使う記述があるかどうかは不明
```

と書いてあれば、条件1の処理後のimgが条件2で使われて、それが
2つのif文の後にも意味を保ち続けている。どこかで使われているかもしれないことを考えなくてはなりません。スコープが広がったこととIplImage型がポインタ渡しになっていることによって、コードの意味合いの可能性は格段に広がってしまっています。

　変数のスコープを地道に狭めることも、ソースコードの理解を助けます。関数の抽出をする際には、関数の引数となる変数と関数内部での変数とに区別します。そのためにも、スコープが狭い方がよい。



###追記：for文を含むまとまりの関数化のヒント
　変数のスコープを短くしていって、あるfor文の前と後で参照される値、for文の中でだけ参照される値が明確になったら、そのfor文を含むブロックの役割が明確になります。まずは、関数にしたらどういう関数になるか、コメント行で書いて見ましょう。
// double someFunction(const cv::Mat &img, cv::Mat &outImg);
みたいな感じで、書いてみて、@brief, @param[in], @param[out]などを含めて書いてみます。聞くだけで理解できる程度の意味合いの機能としてまとめて、その部分を関数化していきます。


###追記："{"を使ってスクープを狭める

```.cpp:example.cpp
double r;
{
    double sum=0.0;
    int n=0;
    for(int i=0; i<10; i++){
        sum += x[i];
        n += 1;
    }
    r = sum/static_cast<double>(n);
}
```

などとすれば、変数sum, n のスコープを{}の中に狭めることができます。
変数のスコープを狭めたときに、プログラムがコンパイルできて同じように実行できるならば、変数sum,nは、その後のコードで利用されていないことが確認できます。
　関数化しないまでも{}を使って変数のスコープを狭めれば、ソースコードの理解がしやすくなって、メンテナンスも容易になります。


####**こんなツールがほしい：**
　C++の各関数（メソッド）の中で、変数のスコープを可能なかぎり狭くするツール。
C++の関数の範囲の中でfor文、while文、if文、switch文などがあったときに、
・それぞれの文のブロックの**前後で使用されていなければ**、ブロックの中に押し込む。
・それぞれの文のブロックの**中と後でしか使われていなければ**、抽出すべき関数の戻り値として提案する。
・それぞれの文のブロックの**中と前でしか使われていなければ**、抽出すべき関数のinの引数として提案する。
・それぞれの文のブロックの**中と前後で全て使われていれば**、抽出すべき関数のin,outの引数として提案する。

だれか、そんなツール知りませんか？

参考URL
[レガシープログラマかどうかを判断する10項目]
(http://blog.jnito.com/entry/20110218/1297983647)
AWS CLI 環境変数&リージョンチートシート

よく忘れるのでメモ。

# AWS CLI チートシート
## AWS CLI 環境変数

```bash
export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxx     # アクセスキー
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxx  # シークレットアクセスキー
export AWS_SESSION_TOKEN=xxxxxxxxxxxxxxxxxxx  # セッショントークン

export AWS_DEFAULT_REGION=ap-northeast-1      # デフォルトリージョン   
export AWS_DEFAULT_OUTPUT=json                # 出力形式 (json|text|table)
export AWS_PROFILE=default                    # プロファイル名

export AWS_CONFIG_FILE=~/.aws/config          # コンフィグファイルパス
export AWS_SHARED_CREDENTIALS_FILE=~/.aws/credentials # クレデンシャルファイルパス
export AWS_CA_BUNDLE=<AWS_CA_BUNDLE_PATH>     # 証明書バンドルへのパス
```

* [Configuring the AWS Command Line Interface - AWS Command Line Interface](http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)
* [Environment Variables - AWS Command Line Interface](http://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-environment.html)



## リージョン一覧

### 東京リージョン

```bash
# アジアパシフィック（東京）
ap-northeast-1
```

### 利用可能なリージョン

```bash
us-east-1      # 米国東部（バージニア北部）
us-east-2      # 米国東部（オハイオ）
us-west-1      # 米国西部（北カリフォルニア）
us-west-2      # 米国西部（オレゴン）
ca-central-1   # カナダ (中部)
eu-central-1   # 欧州（フランクフルト）
eu-west-1      # 欧州（アイルランド）
eu-west-2      # 欧州（ロンドン）
eu-west-3      # 欧州（パリ）
eu-north-1     # 欧州（ストックホルム）
eu-south-1     # ヨーロッパ（ミラノ）
af-south-1     # アフリカ（ケープタウン）※要オプトイン
ap-east-1      # アジアパシフィック（香港）※要オプトイン
ap-northeast-1 # アジアパシフィック（東京）
ap-northeast-2 # アジアパシフィック（ソウル）
ap-northeast-3 # アジアパシフィック（大阪: ローカル）
ap-southeast-1 # アジアパシフィック（シンガポール）
ap-southeast-2 # アジアパシフィック（シドニー）
ap-south-1     # アジアパシフィック (ムンバイ)
me-south-1     # 中東（バーレーン）※要オプトイン
sa-east-1      # 南米（サンパウロ）
```

[from: リージョンとアベイラビリティーゾーン - Amazon Elastic Compute Cloud](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html)

### リージョンの有効化

> 2019 年 3 月 20 日より前に導入された AWS リージョンはデフォルトで有効になっています。これらのリージョンでは、すぐに使用を開始できます。2019 年 3 月 20 日以降に導入された アジアパシフィック (香港) などのリージョンはデフォルトでは無効になっています。これらのリージョンを使用するには、有効にする必要があります。

from: AWS リージョンの管理 - AWS 全般のリファレンス - https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande-manage.html


## リンク

- [AWS コマンドラインインターフェイス](https://aws.amazon.com/jp/cli/)
[Wordpress]月別アーカイブを過去12ヶ月（任意の月数）にし、年別アーカイブと併用する方法


Wordpressの記事が増えてくると、デフォルトのテーマではサイドバーに表示される月別アーカイブのリストがどんどん増え、サイドバーがやけに長い残念なページになってしまいます。

なので月別アーカイブは過去12ヶ月（任意の月数）のみ表示し、それより過去は年別アーカイブにしてスペースの節約をします。

テンプレートタグ「wp_get_archives()」を使った簡単なコードで実現できるのですが毎回忘れるので備忘録です。

## 表示イメージ

- 月別アーカイブ
    - 2015年9月
    - 2015年8月
    - 2015年7月
    - 2015年6月
    - 2015年5月<br>（略）

- 年別
    - 2015年
    - 2014年
    - 2013年

## コード

sidebar.php などのテンプレートファイルに以下のコードを記入します。

```php
<div>月別一覧</div>
<u>
<?php wp_get_archives('limit=12'); /* limit=12 ←月数(12ヶ月=1年) */ ?>
</ul>

<div>年別一覧</div>
<ul>
<?php wp_get_archives('type=yearly'); /* 月別か年別かを指定。デフォルトは type=monthly（月別） */ ?>
</ul>
```

以上です。

 wp_get_archives()の詳しい使い方はこちらで以下のページでご確認ください。
 
▼テンプレートタグ/wp get archives
[https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/wp_get_archives](https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/wp_get_archives)
unity > uGUI > パスワード入力用のInputField > Content Type = Passwordにする

```txt:動作確認
Unity 5.1.3-f1 on MacOS X 10.8.5
```

plotlyのAPI Keyを使用する時、パスワード入力用のInput Fieldがあればいい。

Input Fieldを作成してContent TypeをPasswordにすればいい。

![Main_unity_-_150919-unity-plotlyPrimer_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/47d315e2-c4a9-0c62-070d-5eae10349194.jpeg)

なお、プレイモードの場合、上記のように入力した文字列はTextに表示されるようなので、他の人が見ている場合にはバレてしまう。
バグレポートに最低限欲しい情報

# 概要
何をして、何が起きたかを簡潔に説明して欲しい。
ただし、詳細があればいい場合も多々あるため、これが必須というわけではない。

e.g.

> ```
> iOS 9.0のホーム画面から、アイコンをタップしてアプリを起動しようとすると、ホーム画面に戻ってしまい、アプリが起動しない。
> ```

# 詳細
最低限は以下の情報が欲しい
- どういう手順で何を行ったか？（再現手順）
- その手順で、何が発生したか？（発生事象）
- 本来は、どうあるべきなどの期待値（本来の想定）
- バージョン、プラットフォームなど（発生環境）
- 発生頻度

e.g.

> ```
> iOS 9.0のホーム画面から、アイコンをタップしてアプリを起動しようとすると、
> 一瞬、アプリの画面が表示された後にホーム画面に戻ってしまい、アプリが起動しない。
> アプリバージョンは「1.2.3」
> 
> 発生回数：10/10 (100%)
> 検証プラットフォーム：iOS 9を適用した全デバイス
>
> 補足
> 当該事象発生後、ホームボタンを2回タップして、タスクリストを表示すると、アプリ自体は黒い画面で表示される。
> ```

これくらいは書いて欲しい。
まぁ、「詳細」に書いた内容がわかれば、書式なんかはどうでもいい。
Python Pandasでのデータ操作の初歩まとめ − 後半：データ集計編

# はじめに
Pythonでデータ分析を扱う上で必須となる、Pandasでのデータ操作方法の
初歩についてまとめました。

ついつい忘れてしまう重要文法から、ちょっとしたTipsなどを盛り込んでいます。

こんな人にオススメ
→ Pandasを初めて触ってみたい！
→ Rが使えることをPythonでもやってみてーなー
→ Pandasの文法覚えきれねー どっかに一覧があれば便利なのに...
→ そもそもPythonでデータハンドリングってどれくらいできるものなのさ


データの操作についても知りたい方は前半からどうぞ

◆ Python Pandasでのデータ操作の初歩まとめ − 前半：データ作成＆操作編
http://qiita.com/hik0107/items/d991cc44c2d1778bb82e


# 計算をしてみよう 

###◆統計量演算
    データフレームの行、もしくは列ごとの統計量を求める 
```math.py
 
#列方向の合計 
df_sample["score1"].sum(axis=0) # Score1の値の合計を計算
        #axis=0は縦方向にSumするという意味。デフォルトで０なので、省略可能
 
df_sample[["score1","score2"]].sum(axis=0)  #score1,score2をそれぞれ合計。結果は2つ出力
 
 
#行方向の合計
df_sample[["score1","score2"]].sum(axis=1)  
        #各行のscore1とscore2の値を合計。結果は列数ごとに出力される
        #axis=1は横方向にSumするという意味。PandasではAxisでRow方向と」
         Column方向を区別することが多いので覚えておくべし
```

###◆Pivoting
    ピボットテーブル的なクロス集計と、データ構造の変換を行う

```pivot.py
 
df_sample.pivot_table("score1",     #集計する変数の指定
                       aggfunc="sum",  # 集計の仕方の指定
                       fill_value=0,   # 該当する値がない場合の埋め値の指定
                       rows="class",     # 行方向に残す変数の指定
                       columns="day_no")   #列方向に展開する変数の指定

```

###◆Group_by 操作
```groupby.py
# Pandasでは、Groupbyの操作と、それにともなうAggregationを別々に行います。 
# groupbyメソッドを使うと、見た目は普通のデータフレームですが、Group_ByのKey情報を持ったオブジェクトが生成されます。
# これはRでも同様です。Dplyrではgroupby()によってキーが設定され、そのKeyにともなって、Summariseで集計を行います。
 
df_sample_grouped = df_sample.groupby("day_no")  # day_noでGroup_byを行う。
df_sample_grouped[["score1","score2"]].sum()          
  # Group化されたされたオブジェクトに対してSumを行う。
  # 必要であれば、Sumを行う変数を指定できる。
 
# Group_byのKeyは強制的にIndexとして扱われる
# そのため、Group_byを行う前のように、カラム変数として扱うことができない

df_sample_grouped = df_sample.groupby("day_no", as_index=false)
   #   as_index=falseを指定すると、indexとして扱うのをやめてくれる。
```


# データの読みだし、書き出しをしよう 


### ◆データインポート、エクスポート
    csvファイルからDFを作成、またはDFをcsvに書き出し

```file.py
 
#csvデータのインポート
pd.read_csv("path_of_data")
 
#csvデータのエクスポート
 
pd.to_csv("path_of_exported_file")
```
unity / plotly > REST API入門 > サンプルは動いた

```txt:動作確認
Unity 5.1.3-f1 on MacOS X 10.8.5
```

##入門

https://plot.ly/
というグラフ描画サービスをUnityからアクセスしたい。

でも、RESTなんたらはよく分からない。
とりあえず、入門してみた。

UnityでRESTを使った例は以下で見つかった。
http://enpel.hateblo.jp/entry/2012/10/15/200048

実際のAPIについては
https://plot.ly/rest/
の 「`POST/clientresp`」をクリックすると表示される例を元にコーディングした。


##code

```csharp
using UnityEngine;
using System.Collections;

public class restTestCS : MonoBehaviour {


	IEnumerator getRestResponse()
	{
		string url = "https://plot.ly/clientresp";
		string dataStr = 
			"un=7of9&" +
			"key=bkzm2ze0iz&" +
			"origin=plot&" +
			"platform=lisp&" +
			"args=[[0, 1, 2], [3, 4, 5], [1, 2, 3], [6, 6, 5]]&" +
			"kwargs={\"filename\": \"plot from api\"," +
			"\"fileopt\": \"overwrite\"," + 
			"\"style\": {" + 
			"\"type\": \"bar\"" +
			"}," + 
			"\"traces\": [1]," + 
			"\"layout\": {" +
			"\"title\": \"experimental data\"" +
			"}," + 
			"\"world_readable\": true" +
			"}";

		byte [] data = System.Text.Encoding.UTF8.GetBytes (dataStr);

		WWW www = new WWW (url, data);
		yield return www;

		int nop = 1; // for breakpoint
	}

	void Start () {
		StartCoroutine ("getRestResponse");
	}
	
	void Update () {
	
	}
}
```

`int nop = 1`の行でブレーク設定して上記を実行して、イミディエイトにてwww.textを見ると以下の文字列が取得できた。

```
> www.text
"{\"url\": \"https://plot.ly/~7of9/127\", \"message\": \"\", \"warning\": \"\", \"filename\": \"plot from api\", \"error\": \"\"}"
```

とりあえず成功したようだ。

## 補足

なお、上記のコードを現時点で実行すると、以下のエラーが出るようになっている。理由としては、API Keyを`bkzm2ze0iz`から変更済みだから。

```
> www.text
"{\"url\": \"\", \"message\": \"\", \"warning\": \"\", \"filename\": \"\", \"error\": \"Aw, snap! You tried to use our API as the user '7of9', but the supplied API key doesn't match our records. You can view your API key at plot.ly/settings.\\n\\nYou're most likely getting this message because your local credentials file isn't synced with the Plotly server you're communicating with.\\n\\nGo to plot.ly/<language>/getting-started (e.g., plot.ly/python/getting-started) for more information.\\n\\nMake sure that you're logged in as 7of9.\\n\\nNeed help? Feedback? Write support@plot.ly.\"}"
```

API Keyはplot.lyでログインして Setting -> API settingsの画面で表示される。

`Generate a new key`でAPI Keyを変更可能。

コードの以下の部分は、それぞれのユーザのidとAPI Keyを設定して使う。

```
"un=7of9&" +
"key=bkzm2ze0iz&" +
```

## やっていること

上記のコードでやっているのは、データのx,y座標を指定して、グラフを作成しているようだ。
既存データの読込みをやろうとしていたら、データの追加(とグラフの作成)ができていた。

実際に追加されたデータとグラフは以下で見ることが出来る。
https://plot.ly/128/~7of9/
https://plot.ly/127/~7of9/

`www.text`で戻ってくるurl (`https://plot.ly/~7of9/127`)を開くとグラフが見えるということらしい。
「ターミナルに画像を表示する」の画質向上を試みる

# ソース全文
[Gist - display image in Terminal](https://gist.github.com/zakuroishikuro/024e5c45c50543228e64)

※高度な技術は持ち合わせてないので期待しないでください。

# 元ネタ

[ターミナルに画像を表示する](http://qiita.com/woxtu/items/f049bf5f89003fb52fdd)
# 1: サイズ変更のメソッドを「resize」にする

before: (sampleメソッド使用)
![スクリーンショット 2015-09-19 17.31.19.png](https://qiita-image-store.s3.amazonaws.com/0/18902/0d9329de-6f12-2c6a-d530-38851f1afe54.png)

after: (resizeメソッド使用)
![スクリーンショット 2015-09-19 17.31.24.png](https://qiita-image-store.s3.amazonaws.com/0/18902/b95b4902-780a-f5c4-3dd4-c957a4f6f366.png)

ただ、sampleのほうがクッキリしてる感じもします。
resizeかsampleかは好みの問題なので「-s」オプションを付ければsampleメソッドを使うようにしました。

# 2: 1ピクセルを行でなく列に合わせる

after: (1ピクセル = 1列)
![スクリーンショット 2015-09-19 17.31.50.png](https://qiita-image-store.s3.amazonaws.com/0/18902/f90978ce-eb2f-c533-1f06-3688cb7604d3.png)

等幅フォント前提ですが、ターミナルの1行の高さはだいたい2文字の幅と同じです。
1ピクセルを1文字で表示するか2文字で表示することになります。
2文字のほうが手軽ですが、1文字にすると横の解像度が倍になります。

# 3: 色の幅が狭い場合はモノクロにする

変な色が減ったりモノクロ部分が引き締まったりすると~~いいなぁ~~思います。
ここまでの画像では全てこの処理をやってます。

before: ![スクリーンショット 2015-09-19 17.32.14.png](https://qiita-image-store.s3.amazonaws.com/0/18902/a938d5fd-2d0b-7138-67c6-944151eec482.png)

after: ![スクリーンショット 2015-09-19 17.31.50.png](https://qiita-image-store.s3.amazonaws.com/0/18902/90a45e86-0c7d-e791-f7e3-d3c787d55849.png)

肌色に見えますが、顔の部分は灰色です。

ANSIカラーについてはここを読めばよく分かります。まじおすすめ。
→ [エスケープシーケンスを体感する - ザリガニが見ていた...。](http://d.hatena.ne.jp/zariganitosh/20150224/escape_sequence)

## ANSIカラーについて必要なことだけ説明

`\e[48:5:XXXm`のXXXの数値によって文字列の背景色を変更できます。
変更を解除しなければその後の文字もずっと色が変わったままになるので`\e[m`で解除します。

表示可能な色は256種類あります。

|XXXの値|色数|説明|
|:-:|:-:|:--|
|0〜15|16色|基本の16色|
|16〜231|216色|RGBそれぞれ6階調の6*6*6=216色|
|232〜255|24色|グレイスケール|

となってます。
基本の16色、というのはこれの「ANSIカラー」のことです。(たぶん)
![3c5c7bdd-b2d1-ee69-24e5-90dec0aa5c01.jpg](https://qiita-image-store.s3.amazonaws.com/0/18902/8ce02d22-d8f0-a501-0221-a8f8e974115c.jpeg)



例えば`#AABBCC`という色の近似色を探したい場合はこんな感じで変換します。

```rb
color = "#AABBCC"

# 赤緑青それぞれを16進数から10進数にする
rgb = color.scan(/[0-9a-f]{2}/i).map{|c| c.to_i(16) }
#=> [170, 187, 204]

# 256階調を　0〜5　の6階調にする
rgb_base6 = rgb.map{|c| (c / 255r * 5).round }
#=> [3, 4, 4]

# 結合して6進数として扱い、10進数にして基本色の数16を足す
xxx = rgb_base6.join.to_i(6) + 16
#=> 152

# 表示
puts "あいうえお \e[48;5;#{xxx}m かきくけこ \e[m さしすせそ"
```

で、RGBがそれぞれたった6階調なので、変な色になったりします。
RGB3色の差が狭い場合はグレイスケールの24階調にすればすこし改善します。
白黒の表現の幅も少し広がります。

# 4: フォントサイズを「1」にする

チート。

after: (フォントサイズ 1)
![スクリーンショット 2015-09-19 17.33.28.png](https://qiita-image-store.s3.amazonaws.com/0/18902/f4c01528-2d95-43e6-5c3d-23c463f8391a.png)

めちゃくちゃ重いです。
実用性は皆無です。
※スクリプトには含めてません。手動です。

以上です。

# 追記: あえて背景色じゃなくて文字色だけ変える

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/18902/9fb315ea-8fd6-9763-9413-c2d067cab203.png)

(結局ターミナルじゃ1文字分よりも解像度を上げることはできないので、表示しない空間をあえて増やすことにより人類の脳内補完による画質向上を期待)

# 参考
- [エスケープシーケンスを体感する - ザリガニが見ていた...。](http://d.hatena.ne.jp/zariganitosh/20150224/escape_sequence)
- [ASCIIコードの秘密 - ザリガニが見ていた...。](http://d.hatena.ne.jp/zariganitosh/20150209/ascii_code_secrets)
- [ANSI escape code - Wikipedia](https://en.wikipedia.org/wiki/ANSI_escape_code)
Railsでpublicフォルダ含む全てのページにBasic認証やDigest認証をかける

# Railsで認証をかける

RailsでBasic認証やDigest認証をかける方法としてよく紹介されるのは、以下の様な`application_controller`に認証処理を書く方法ですね。

```rb:Basic認証
http_basic_authenticate_with name: ENV['USER'], password: ENV['PASS']
```

```rb:digest認証
USERS = { ENV['USER'] => ENV['PASS'] }

before_action :digest_auth

def digest_auth
  authenticate_or_request_with_http_digest do |user|
    USERS[user]
  end
end
```

# Rackで認証をかける

Railsで認証をかける場合、処理が`application_controller`を実行することが前提となるため、
アクセスされたら直接データを返す`public`フォルダ以下のリソースには認証がかかりません。

コントローラ単位や、アクションメソッド単位で認証をかけるにはとても便利な方法ですが、
全てのページに対して認証をかけたいという場合には少し力不足です。

アクセス全体に対して認証を書けたい場合は、Rackアプリケーションに認証処理をまかせることでアクセス全体に認証をかけることが出来るようになります。

具体的には、認証処理を`configu.ru`に書いてあげれば良いだけです。

```rb:Basic認証
use Rack::Auth::Basic do |user, pass|
  user == ENV['USER'] && pass == ENV['PASS']
end
```

```rb:Digest認証
USERS = { ENV['USER'] => ENV['PASS'] }

use Rack::Auth::Digest::MD5, '', '' do |user|
  USERS[user]
end
```
[BrowserStack]テスト結果の動画がmp4でダウンロードできるようになってた

##前置き##
最近browserstackでE2Eのテストをやっております。
勝手にスクリーンショットを撮ってくれたり、クロスブラウザのテストが気楽にできるのでちょうほうしているのですが、「実行結果のスクリーンショットをいちいち眺めるのはめんどくさいなー」と思っていました。
「スクリーンショットをアニGifにして〜」という助言もいただいたのですが、、、

![image](https://qiita-image-store.s3.amazonaws.com/0/70976/c6ecafaf-1f20-a176-d74c-352d4a06e87b.png)
「↓Download」ですって？！

これは便利！是非お試しあれ。

##参考##
・http://qiita.com/imunew/items/8806cd68a401c6975d44
aaa
Pythonでのデータ操作 - Pandas_plyrを使ってみる

## 一般的なPandasでのデータ操作方法

以前こんな記事を書きました

◆ Python Pandasでのデータ操作の初歩まとめ メソッド一覧表
http://qiita.com/hik0107/items/d991cc44c2d1778bb82e

Pandasでデータを操作する場合には上記のようなやり方が一般的なのですが、
ややコードが冗長になったり、可読性が低いと感じる時があります。

そんな方のために「pandas_ply」というパッケージを紹介します。
RのDplyrに似た記法でデータを扱えるため、Dplyrを使ったことがある人には特におススメです。
※ まさにPandas版のDplyrという感じです。

使ったことが無い方でも、ネイティブのPandasより使いやすいと思いますので、
是非試してみてください。

## Pandas_plyを使いはじめる

◆pandas_plyパッケージ
https://pypi.python.org/pypi/pandas-ply

pandas_plyをインストールします

```shell-session
pip install pandas_ply
```

パッケージの準備

```py:setup.py
import pandas as pd
from pandas_ply import install_ply, X, sym_call

install_ply(pd)
```

pandasを呼び出し、そのあとにpandas_plyからinstall_plyをおこなうと、
pandas_plyのメソッドがpandasに付与される仕様になっています

これで準備完了です。

##　実際に使ってみる

詳しい使い方はこちら（英語）
http://pythonhosted.org/pandas-ply/

データはこちらを使ってみます。Kaggleで有名なデータですね。
titanic - train.csv
https://www.kaggle.com/c/titanic/data


```py:load.py
csv_path = "/files_dir/train.csv" ##csvファイルの場所を指定
data = pd.read_csv(csv_path, delimiter=",")

##データを簡単に確認 ： 新しいデータセットの場合は必須ですね
print data.head(10)
print data.shape
data.describe()
print data.columns
```


### データの選択 ply_select
カラムへのアクセスは "column_name" もしくは X.column_nameで行うことが出来ます。
また、新しいカラムの作成（Dplyrでいうところのmutate的な使い方）

```py:select.py
data.ply_select("Name", "Age",
                gender = X.Sex,  ## カラム名を変更できる
                is_adult = (X.Age >= 20)  ## 新しいカラムを定義することも可能になる
                )
```


### データの選択 ply_where
特定の条件を満たすデータだけをサブセッティングしたい時にはply_whereを使う

```py:where.py
data.ply_where(X.Age>10, 
               X.Sex == "male",
               X.Embarked == "S"
               )  #全ての条件にAndで満たすデータだけが選択される
```

これと同じことをPandasのネイティブな方法で書く場合には下記のようになります。

```py:where_equivalent.py
data.query(" Age>10 & Sex=='male' & Embarked == 'S' ") 
##文字列が入り乱れてやや紛らわしい

data.ix[(data.Age>10) & (data.Sex =='male') & (data.Embarked=='S')] 
##df名を何度も書く必要がある
```

個々の好みはあると思いますが、pandas_plyだと割りと可読性高くかけると思います。


### フラグの追加 - この場合はapplyを使ったほうがいいかも

上記で新しいカラムの追加（ply_select）の方法を書きましたが、
新しいカラムを複雑な条件で生成したい場合などには、素直にPandasのapplyメソッドを使ったほうが
よいかもしれません。

例えば上記データで年齢と性別を使って新たな属性を "demographic"というカラムに追加したい場合は
下記のようにかけます。
新カラムの生成条件が関数として見やすく残るので安心

```py:apply.py
def add_demographic(data_input):
    if data_input.Age >=20:
        demo = "adut_m" if data_input.Sex == "male" else "adult_f"
    else:
        demo = "boy_and_girl"
    
    return demo

data.ix[ : , "Demographic"] = data.apply(add_demographic, axis=1)
```

## 終わりに
pandas_plyはまだまだ開発途中のパッケージのようですので、ご利用は計画的に。
あまり情報が多くないパッケージですので、詳しい方いたら是非コメント下さい。
deeplearning4jをbuildして動かしてみるまで

jvmで並列分散処理できるdeeplearning tool [deeplearning4j](https://github.com/shoe116/deeplearning4j)をbuildして動かしてみるまでの作業ログ

## buildまで
```bash
## git clone
$ git clone git@github.com:shoe116/deeplearning4j.git

## set up
$ cd deeplearning4j
$ bash ./setup.sh
```

## 動かしてみる
まさかの、「exampleは別リポジトリ」なので（しかもver情報付き、いみわからん）[dl4j-0.4-examples](git@github.com:deeplearning4j/dl4j-0.4-examples.git)を落としてくる。同じディレクトリだと.gitが喧嘩するので、deeplearning4jと同階層にしておこう。

とりあえず、deeplearningにおけるhallo world, Mnistの手書き文字データを学習させてみよう。

```bash
## git clone examples
$ cd ..
$ git clone git@github.com:deeplearning4j/dl4j-0.4-examples.git
$ cd dl4j-0.4-examples

## install
$ mvn clean install -DskipTest

## run mnist
mvn exec:java -Dexec.mainClass=org.deeplearning4j.examples.deepbelief.DBNMnistFullExample
```
GitPythonでSSH鍵を指定してGithubにアクセスする


プログラム内からGithub上のリポジトリにアクセスする必要がでたため、[GitPython](http://gitpython.readthedocs.org/en/stable/index.html)を使用した。
大部分は[チュートリアル](http://gitpython.readthedocs.org/en/stable/tutorial.html)を見て解決できたが、SSH鍵を指定しての操作で少し手間取った箇所があるため記載する。

## GitでSSH鍵を指定する

今回取り組んだケースでは、まず以下の前提・要求が存在する。

- 2つのGithubアカウントを持っている。以降、それぞれをアカウントA、アカウントBと表記する。
- それぞれのアカウントに異なる鍵が紐付いている。以降、アカウントAの鍵を`~/.ssh/id_rsa`が、アカウントBの鍵を`~/.ssh/id_rsa_new`とする。
- プログラム内でアカウントBのリポジトリをClone、幾つかの変更を加えた後にPushする。なおPublicリポジトリであるため、Cloneは誰でもできる。

この場合、環境に依るので一概には言えないが、アカウントAの持つリポジトリへのアクセスは問題ないことが多い。アカウントAはデフォルトのSSH鍵(`~/.ssh/id_rsa`)に紐付いており、Gitはデフォルトでこの鍵を使用するからだ。

一方、アカウントBを使用する場合、`~/.ssh/id_rsa_new`を使用することをGitに教えてやる必要がある。そのための一つの方法は、`~/.ssh/config`に以下のように設定することだ。

```:~/.ssh/config
host github-new
  user git
  hostname github.com
  identityfile ~/.ssh/id_rsa_new
  identitiesonly yes
```

その後、`host`で指定した値をgithub.com(`hostname`で指定する)の代わりに使えば、`~/.ssh/id_rsa_new`を使ってアクセスできる。

```bash:~/.ssh/id_rsa_newを使ってcloneする
$ git clone git@github-new:<AccountB>/<repository>.git
```
自分の環境で動かすだけならばこれで問題ないが、今回のプログラムは自分以外の環境でも動かす必要がある。そのため、設定よりも実行時オプションで指定できた方が良い。

Gitは`GIT_SSH`、`GIT_SSH_COMMAND`(`GIT_SSH_COMMAND`は2.3以降)という環境変数を持っている。これらはGitが使うSSHコマンドを指定することができる。実行するSSHコマンドに、上の設定ファイルと同じ内容のオプションを指定すれば、問題を解決できる。

```bash:GIT_SSH,GIT_SSH_COMMAND
# GIT_SSH
$ GIT_SSH='~/ssh_cmd' git push origin master
$ cat ~/ssh_cmd
ssh -i ~/.ssh/id_rsa_new -oIdentitiesOnly=yes "$@"

# GIT_SSH_COMMAND
$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa_new -oIdentitiesOnly=yes' git push origin master
```

(参考)http://git-scm.com/docs/git#_other

## GitPythonでSSH鍵を指定する

GitPythonは、`GIT_SSH`、`GIT_SSH_COMMAND`をサポートするコンテキストマネージャを定義している。

(参考)http://gitpython.readthedocs.org/en/stable/tutorial.html#handling-remotes

実行環境のGitのバージョンが2.3以上であることを前提とできなかったため、今回は`GIT_SSH`を使用した。
また、SSH鍵の内容を設定に既に持っていたため、鍵とコマンドをファイルに書き出して指定している。


```python:GitPythonでのGIT_SSH,GIT_SSH_COMMAND
import git

# SSH鍵の書き出し
with open('./id_rsa_tmp', 'w') as f:
    f.write('<SSH Key>')
    os.chmod('./id_rsa_tmp', 0o600)
# SSHコマンドの書き出し
with open('./ssh_cmd', 'w') as f:
    f.write('ssh -i ../id_rsa_tmp -oIdentitiesOnly=yes "$@"')
    os.chmod('./ssh_cmd', 0o777)

# リポジトリのClone
repo = git.Repo.clone_from('accountB_repo')

# リポジトリのPush
ssh_executable = '../ssh_cmd'
with repo.git.custom_environment(GIT_SSH=ssh_executable):
    repo.remote().push('master')
```

注意したいのが、`repo.gitcustom_environment`実行時は、リポジトリのワーキングディレクトリにいるということ。
上記のコードでは、Cloneしたリポジトリ(`accountB_repo`)、鍵(`id_rsa_tmp`)、コマンド(`ssh_cmd`)が同一ディレクトリにある。
`repo.gitcustom_environment`実行時は、`accountB_repo`ディレクトリ以下にいるため、鍵とコマンドは親ディレクトリにあることを意識して指定する。

```python:鍵とコマンドの指定
with open('./ssh_cmd', 'w') as f:
    # 鍵は親ディクレトリにある
    f.write('ssh -i ../id_rsa_tmp -oIdentitiesOnly=yes "$@"')

# コマンドは親ディレクトリにある
ssh_executable = '../ssh_cmd'
with repo.git.custom_environment(GIT_SSH=ssh_executable):
...
```
Azure VMで予約IPを使用する方法

メールサーバなどを構築する場合、固定IPであると何かと便利であるという考えは僕だけなのかもしれないが、
もしも似たようなことを考えているかたのためにメモを残します。
予約IPに関する概念はMSDNのドキュメントを漁っていただければ幸いです。

1.予約IPの取得
`New-AzureReservedIP -ReservedIPName "予約IPのラベル" -Location "対象サーバのLocation"`

2.予約IPの確認
`Get-AzureReservedIP -ReservedIPName "予約IPのラベル"`
以下で全予約IPが取得できる
`Get-AzureReservedIP`

3.予約IPをVMへ割当
`Set-AzureReservedIPAssociation -ServiceName "対象VM名" -ReservedIPName "予約IPのラベル"`

以下で予約IPの開放も可能なはず。(未検証)
`Remove-AzureReservedIPAssociation`

予約IPの削除
`Remove-AzureReservedIP -ReservedIPName "予約IPのラベル" -Force`
Layer-rubyでLayerを使う

#Layerとは
[Layer](https://layer.com/)はさまざまなプラットフォーム間を自動で同期できるチャットプラットフォームサービスです。

iOSとAndroidのサンプルアプリでカンタンに試すことができます。
また、それ以外でもREST APIを通してメッセージを送信することができます。
公式ページのDocumentationからたどると、クライアントライブラリが公式にJS用と3rdパーティでRuby向けがあるようなので、使ってみました。

2015/09/19時点では、以下のライブラリがあるようです。

- [layer-ruby](https://github.com/benedikt/layer-ruby)
- [layer-api](https://github.com/cakejelly/layer-api)

ここでは、[layer-ruby](https://github.com/benedikt/layer-ruby)を使ってみます。

#インストール
bundleを使ってgemをインストールしましょう。bundlerは先にインストールしておきましょう。

`bundle init`したあと、生成されたGemfileに以下を追加します。、

```Gemfile
gem 'layer-ruby', require: 'layer'
```

`bundle install`でgemがインストールされます。

#IDとTokenの取得
Layerにログインしたあと、[Dashboard](https://developer.layer.com/projects
)からKeysをクリックします。

__Staging app ID__ と __Platform API tokens__ を取得します。
##AppID
`layer:///apps/staging/XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX`といった形式で、`Layer://`から始まるURL schemeのような文字列です。
##Platform API Tokens
Name Your Tokenに名前を入れて、 __[Generate a new Token]__　を押してTokenを取得します。

#Conversation IDの取得
Quick Setup時にメッセージを一回送ってるはずなので、その会話宛にメッセージを送ることにしましょう。
Dashboard -> Logを漁って `conversation with identifier XXXXXX-XXXXXXXX-XXXXXX-XXXX` みたいな文字列をみつけ、ID部をメモっておきましょう。

#サンプルアプリ
ざっと、こんな感じで試してみましょう。
__[App ID],[Platform API Token],[Conversation ID]__ をそれぞれ先ほどメモしたものに書き換えてください。

```ruby:app.rb
require 'bundler'
Bundler.require


Layer::Client.configure do |config|
  config.app_id = '[App ID]'
  config.token = '[Platform API Token]'
end

conversation = Layer::Conversation.find('[Conversation ID]')

loop do
  print ">> "
  a = gets.chop 
  conversation.messages.create({ sender: { name: 'Server' }, parts: [{ body: a, mime_type: 'text/plain' }]})
end
```

`bundle exec ruby app.rb`とシェルで実行すると、">>"と表示さます。
なにかメッセージを入力して改行すると、サンプルアプリの会話宛にメッセージが送信されるはずです。

#結論
LayerはカンタンにチャットUIを実装できます。
ただ外部のサーバと連携する場合、セキュリティの問題なのか、直にLayerのサーバから既に発言されたメッセージを取得することができません。
ユーザーの発言をキーにしてなにか動作をする場合、iOSやAndroidのアプリ側でなにかワードをフックして外部サーバに送信する方法を別途実装する必要があります。
お試しあれ。
print()の出力をカスタマイズする


# 概要
Swiftにはprintというログ出力ができるグローバル関数がありますが、実行タイミングや内容について、以下の目的を達成したいためちょっと頑張ってみました :muscle: 

# 目的
* Debugビルドの時以外はprintの出力を無効にする
* Optional<T>がprint関数の引数に含まれる場合は、Optional()という表記を削除する

# アプローチ
### print関数をオーバーライドして、デバッグ時のみ有効になるようにする。

```:Swift
func print(value:Any...) {
#if DEBUG
	Swift.print(value)
#endif
}
```

### 一度Stringにして、Optional()の部分が出力されないよう置換する

```:Swift
let pattern = "Optional\\((.+)\\)"
eachMessage = eachMessage
              .stringByReplacingOccurrencesOfString(pattern,
              withString:"$1",
              options:.RegularExpressionSearch,
              range: nil)
```

この２つを使って最終的に以下のように作りました :star: 

```:Swift
public func print(value:Any...){
#if DEBUG
    var message = ""
    for element in value {
        var eachMessage = "\(element)"
        let pattern = "Optional\\((.+)\\)"
        eachMessage = eachMessage
            .stringByReplacingOccurrencesOfString(pattern,
                withString:"$1",
                options:.RegularExpressionSearch,
                range: nil)
        message += eachMessage
    }
    Swift.print(message)
#endif
}
```

### 結果
* DEBUG時のみログが出るようにする  
※ `Other Swift Flags`にある`Debug`に対して、`-D DEBUG`が設定されている必要があります

Debug時のみDEBUGマクロが定義されているはずなので、print関数を呼んでいてもリリース時などは無効にすることができました。

* Optional()表記をなくす
Swift標準の`print`関数と今回オーバーライドした関数を呼び出すとそれぞれ以下のように出力が異なることがわかります。

```Swift
	let integer:Int? = 123456
	let string:String? = nil
	let boolean:Bool? = false
	Swift.print("integer: \(integer)\nstring: \(string) \nboolean: \(boolean)")
	print("integer: \(integer)\nstring: \(string) \nboolean: \(boolean)")
```

```txt
	# 通常の出力
	integer: Optional(123456)
	string: nil 
	boolean: Optional(false)
	# オーバーライドしたprint()の出力
	integer: 123456
    string: nil 
	boolean: false
```
オーバーライドした方は`Optional()`の部分が表示されなくなってます！見やすい!!

# まとめ
オーバーライドして頑張ることで、以下の目的を達成することができました :apple: 

* Debugビルドの時以外はprintの出力を無効にする
* Optional<T>がprint関数の引数に含まれる場合は、Optional()という表記を削除する

ソースコードはこちらにあげてあります。
https://github.com/totomo/SSLogger

出力行番号や、クラス名を出したい場合は修正が入りますが、単純にprint関数を使ってログを出しているプロジェクトでは使えるかもしれません :bow:
【俺メモ】CentOS7をVagrant + VirtualBoxで初期構築


# 1. 前提
1. ホストOSはMAC。
2. VirtualBox,Vagrantはインストール済み。

# 2.BOXファイルの入手
## 下記URLから入手


``` URL
http://www.vagrantbox.es/
```

## boxの取得方法

``` コンソール
cd [仮想サーバの置き場所へ移動]
vagrant box add [title] [boxのURL]
```

## イニシャライズ

``` コンソール
vagrant init [title] #Vagrantfileの作成
ls -la #Vagrantfileが作られていることを確認
```

## 起動

``` コンソール
vagrant up #起動コマンド
```

* これでいろいろコンソール上にログが流れ問題なければ仮想サーバが立ち上がります。
* 二回目以降の仮想サーバ起動は該当フォルダまで移ったあと、vagrant upでOK

## 起動した仮想サーバへの接続

``` コンソール
vagrant ssh #ssh接続
```

* Macはsshコマンドが使えるので上記コマンドで接続できます。
* windowsの場合はsshコマンドが入ってないのでCgwinを入れて使えるようにするか、Puttyなどのsshクライアントで接続してください。
* sshクライアントで接続する場合のID,Passはvagrant

# vagrantの便利機能
* vagrantfileへの記載でいろいろ設定が弄れる見たいです。

## いちいちadd,initしないようにする。
* Vagrantfileを予め用意できていればvagrant upだけでOK
* 周りに配布する場合は下記設定をVagrantfileへ記載することでvagrant upだけで起動してくれる。

``` Vagrantfile
config.vm.box = [title]
config.vm.box_url = [BOXファイルのURL]
```
 
## ホスト、ゲスト間での共有フォルダ設定

``` Vagrantfile
config.vm.synced_folder "ホストOSの側のディレクトリパス", "ゲストOS側のディレクトリパス"
```

## http接続のポートフォワーディング

``` Vagrantfile
config.vm.network "forwarded_port", guest: 80, host: 8080
```

## 初回起動時にシェルを叩く。

``` Vagrantfile
onfig.vm.provision :shell, :path => "シェル名"
```

* シェルはVagrantfileと一緒の場所じゃなくてもフルパス指定すれば実行可能


以上
Azure Location 一覧

## 現在このリストは、古くなっています。
現在、私自身Azureを使用していないため、新しいリージョンに対応できていません。
詳しくは、以下をご確認ください
https://azure.microsoft.com/ja-jp/global-infrastructure/data-residency/

また、この記事は、今後アップデート予定は、ありません。
---
Azureで固定IP設定をするときにLocation設定で困ったため、
2015年9月19日現在のリストを残します。

Get-AzureVMでLocationが見つけられず、何か良い方法があれば、みなさんご教授願えれば幸いです。

| 日本語名 | AZURE REGION | LOCATION |
|:-----------|------------:|:------------:|
|米国中央部| Central US|Iowa|
|米国中南部| South Central US|Texas|
|米国東部| East US|Virginia|
|米国東部 2| East US 2|Virginia|
|米国中北部| West US|California|
|米国西部| North Europe|Illinois|
|北ヨーロッパ|North Europe|Ireland|
|西ヨーロッパ|West Europe|Netherlands|
|東南アジア|Southeast Asia|Singapore|
|東アジア|East Asia|Hong Kong|
|東日本|Japan East|Tokyo, Saitama|
|西日本|Japan West|Osaka|
stack new した時に出てくるファイルのテンプレートの設定

[前回の記事](http://qiita.com/igrep/items/da1d8df6d40eb001a561)では、
`stack new`してとりあえず簡単なHaskell製のプログラムを書き始める方法をお伝えしました。
今回は、前回の記事でTODOになっていた、`stack new`して作られるファイルのテンプレートの設定を変えて、もうちょっと始めやすくしたいと思います。
ちょうど僕が新しいプロジェクトを作りたくなったので、その作業記録です。

# ハマりどころ: stackのバージョンが古かったorz

いきなりですがハマりました... :sweat_smile:
下記の通りに動かすには、**stackを0.1.4.0以降に上げる**必要があります。
更新する場合は、やはりOSによって方法が異なってしまいますが、
`stack upgrade`と実行すると、よしなにやってくれる**かも**しれません。
(EXPERIMENTALな機能だそうなのでご利用は計画的に。）

私の場合は、Arch Linuxなので普通に`yaourt -S haskell-stack`しました :innocent:

# テンプレートの正体を追え！

:relieved: それでは気を取り直して。

そもそも、前回`stack new`してできたテンプレートの内容はどこから来ているのでしょう？
ググったらすぐ見つかりました。[commercialhaskell/stack-templates](https://github.com/commercialhaskell/stack-templates)です。

で、こちらのREADME曰く、`~/.stack/stack.yaml`（:warning: 重要な変更あり[^v0.1.6.0]）をいじれ、とのこと。
私の場合は以下の通り。

[^v0.1.6.0]: [stack v0.1.6.0](https://github.com/commercialhaskell/stack/releases/tag/v0.1.6.0)以降、`~/.stack/stack.yaml`は`~/.stack/config.yaml`となったそうです。ご利用の方はご注意ください。

```yaml:~/.stack/stack.yaml(v0.1.6.0以降は~/.stack/config.yaml)
templates:
  params:
    author-name: Yuji Yamamoto
    author-email: whosekiteneverfly@gmail.com
    copyright: 2015 Yuji Yamamoto
    github-username: igrep
    category: Development
```

で、保存したら後はこの間と同様、

```shell-session
$ stack new foobar
```

するだけです。
LICENSEファイルなどを確認してみましょう。

# もっと違うテンプレートも使いたい！

私が調べた限り、今のところ[commercialhaskell/stack-templates](https://github.com/commercialhaskell/stack-templates)にあるテンプレートのみが使えるみたいです。
`*.hsfiles`となっているファイルがそれです。デフォルトでは`simple.hsfiles`というのが使われます。
他のテンプレートを使いたいときは、

```shell-session
$ stack new foobar hakyll-template
```

などと実行しましょう。これですぐに新しいブログを始められますね！

# git initも自動化したい！！！！！！！１

ちなみに、上述ハマった件でstackのソースを調べていたところ、下記のようなオプションを見つけました。

```yaml:~/.stack/stack.yaml(v0.1.6.0以降は~/.stack/config.yaml)
templates:
  scm-init: git # <- コレ！
  params:
    ...
```

文字通りです。

`stack new foobar`すれば、`foobar/`以下にテンプレートの内容だけでなく、`.git`も作られます。
便利！ :smile:
delegateをweakで宣言する際にprotocolにclassを継承する理由

Swiftでコードを書く際、任意のクラスを`delegate`として`weak`にしたい場合は、`class`プロトコルを採用するコードを書かなければ ‘weak’ cannot be applied to non-class type というコンパイルエラーとなる。

（言い換えると、`class`プロトコルに準拠したクラスは`weak`にできるようになり`delegate`として扱える）

例がこれ

```swift
protocol SomeProtocolOne {
  func run() -> Void
}

protocol SomeProtocolTwo : class {
  func run() -> Void
}

class SomeView {
  weak var delegate: SomeProtocolOne? // これはコンパイルエラー ‘weak’ cannot be applied to non-class type
  weak var delegate: SomeProtocolTwo? // これは大丈夫
}
```

この理由は何か、「そういうものと覚えておけばいい」と思っていたんだけど納得できる理由のためにおさらいしてみる。

## おさらい

まず、キーワード `: class` は見た目通り`class`プロトコルを採用していると言ってもいい。

また、プロトコルの採用をクラス限定に出来ることも意味していて、["class-only protocol"](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-ID281)と名付けられている。つまり 構造体の`Struct` や 列挙体の`Enum` でこのプロトコル（`SomeProtocolTwo`）を採用することは出来なくなるということ。

## 前提

Swiftでは参照型と値型に分かれている。

Swiftの公式ブログから引用

> Types in Swift fall into one of two categories: first, “value types”, where each instance keeps a unique copy of its data, usually defined as a struct, enum, or tuple. The second, “reference types”, where instances share a single copy of the data, and the type is usually defined as a class. In this post we explore the merits of value and reference types, and how to choose between them. 

最近できたアクターも参照型なので箇条書きにしてみると次のようになる。

- 参照型
    - クラス
    - アクター
- 値型
    - 構造体
    - 列挙体
    - タプル

ここで参照型は3つの参照の仕方に分かれる

- 参照型
    - 参照の仕方
        - 強参照
            - strong
                - デフォルトでstrong
        - 弱参照
            - weak
                - 参照先が存在しない場合に参照しようとされると自動でnilになってる
        - 非所有参照
            - unowned
                - 参照先が存在しない場合に参照しようとされると解放済みへのアクセスとなりクラッシュする

:::note info
もちろん値型は別の変数に代入されると参照されずコピーされるので参照の仕方という分類はない（日本語の意味で「参照」というのは閲覧する的な意味があるが、プログラミング的な意味でのオブジェクトの参照とは、単一のオブジェクト自身を複数間で共有するというような意味）。どうでもいいけどリファレンスされるという変な言い方のほうが日本語に邪魔されなくていいかもしれない。
:::

:::note info
非所有参照というのは解放されたらアクセスしてはいけないので危険なのに、なぜそんなものがあるのだろうかと考えてしまうのは無理もない。それはたとえば「世の中の車はなぜ全部オートマ車じゃないんだろう？」と思うのに似ているのかもしれない。もしくは「パンがなければケーキを食べればいいじゃない」かもしれない。
:::

## 考察

つまり、弱参照にできるのは参照型である必要があり、クラスやアクターでなければいけない。言い換えると構造体や列挙体やタプルで弱参照にしようとすると困るのでエラーになり、プロトコル側で今回の"class-only protocol"を使う必要が出てくる。

また言い換えてみると、そのプロトコルは参照が確か使えないということを"class-only protocol"へプロトコルが準拠することでプロトコルの制約を表現している。

## 備考

### すごい昔のベータの頃

逆にそのプロトコルは参照が使えないということを"class-only protocol"への準拠で表現したら賢すぎるやろ、もっと長い記述で説明してくれたらわかりやすいかな、と思ったら、Swift Beta4以前は長いアトリビュートが必要だったのが、Beta5から簡潔になったらしい。

```swift
// Beta5以降
protocol ProtocolNameDelegate: class {
}
// Beta4以前
@class_protocol protocol ProtocolNameDelegate {
}
```

## 現在は`class`を指定するのではなく`AnyObject`を指定することが推奨されている

```swift
protocol ProtocolNameDelegate: AnyObject {
}
```

理由は下記

https://qiita.com/lovee/items/a686e11f00b31323e683#20181106-%E8%BF%BD%E8%A8%98

# 参考URL

http://stackoverflow.com/questions/24066304/how-can-i-make-a-weak-protocol-reference-in-pure-swift-w-o-objc
ドロワーメニュー(MMDrawerController)を、Swiftで使う


画面をスワイプして、右や左から出てくるメニュー。
Androidでいう、NavagationDrawer。
iOS,Android両方の開発を行っていると、片方ではOS自体がサポートしているので実装が簡単だけど、もう片方では、サポートしていないなんてことがよくあります。

□[MMDrawerController](https://github.com/mutualmobile/MMDrawerController)
Objective-Cで利用するなら、このライブラリが使いやすいのですが、Swiftで使おうとすると、Bridging-Header.hを噛ませても、動きません……。

代換として、
□[DrawerController](https://github.com/sascha/DrawerController)
を利用してみます。CocoaPodsからのインストールをしてみましたが、動きません……。
ままならないものです。

どうやら、プログラム自体の問題ではなさそうなので、下記のファイルを直接配置してみます。

* AnimatedMenuButton.swift
* DrawerBarButtonItem.swift
* DrawerController.swift
* DrawerVisualState.swift


で、AppDelegeteに以下のように書きます。

```Swift:AppDelegate.swift
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    var drawerViewController: DrawerViewController!
    var drawerController: DrawerController!
    var noteMainViewController: NoteMainViewController!

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // 中央に表示するビューコントローラー
        noteMainViewController = NoteMainViewController()

        // 左メニューに表示するビューコンローラー（Drawer）
        drawerViewController = DrawerViewController()
        
        // ドロワーコントローラーに、左メニューと中央画面をセット
        self.drawerController = DrawerController(centerViewController: noteMainViewController, leftDrawerViewController: drawerViewController)
        
        self.drawerController.showsShadows = true // 影付き
        self.drawerController.restorationIdentifier = "Drawer"
        self.drawerController.maximumLeftDrawerWidth = 240.0 // 幅240
        self.drawerController.openDrawerGestureModeMask = .All // タッチ操作を全て受け付ける
        self.drawerController.closeDrawerGestureModeMask = .All
        
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        let tintColor = UIColor(red: 29 / 255, green: 173 / 255, blue: 234 / 255, alpha: 1.0) // 文字色
        self.window!.tintColor = tintColor
        
        // ルートビューにセット
        self.window!.rootViewController = self.drawerController
        self.window?.makeKeyAndVisible()
        return true
    }
```

※検証環境が、iOS8 + Swift1.2と少し古いので、参考までに。

###参照
- [CocoaPods](http://cocoapods.org/)
- [NavigationDrawer(Android)](https://developer.android.com/design/patterns/navigation-drawer.html)
ローカルでGithubのレポジトリを作成するコマンドライン(Elixir)

Githubのレポジトリを作成するときにいつもブラウザー立ち上げるのはめんどくさいので，Elixirを使って，ローカルでレポジトリを作成するコマンドを作ってみました．

https://github.com/ColdFreak/mygit

レポジトリを作成するこの一つの機能だけです．削除の機能はほしいですか，ちょっと危険なので，やめときました．

コマンドラインのプログラムの書き方はここに載っているので，非常にシンプルです．

http://asquera.de/blog/2015-04-10/writing-a-commandline-app-in-elixir/
gitの便利操作（中級者向け）

便利なgit操作集です。
初心者の方は、こちらを学ぶ前に基本的な操作から覚えたほうが、便利さが分かると思います。

# rebert
# diff
# stash
# add


git diff —cached
git diff HEAD

git stash
git stash pop すると、一番最新のgit stashの内容をとってくることができる

git add -p
MultiConfigを書いてみた

# MultiConfig

https://github.com/PharaohKJ/multi_config

追記) RubyGem化しました。公開はしていないので上記URLよりお好きに。

設定をどこから読むのか？ということが多い、主に考えられるものとして

1. 環境変数
2. コマンドラインパラメータ
3. プロセス実行中に動的されない設定ファイル
4. プロセス実行中に動的に更新される設定ファイル、Databaseなど
5. 設定されてない場合のデフォルト値

などがあげられる。これらの値をそれぞれ管理(読み込み、参照)し、使う方としては
その優先度を意識しなくてすむ設定classが欲しかった。


# HOW TO USE

## 1. `MultiConfig::EachConfig`を`include`したclassを作成する

```ruby
  # Hashを用いた設定のConfig例
  class SimpleConfig < Hash
    include EachConfig
    def initialize(conf)
      @my_conf = conf
    end

    # refreshをoverrideする例
    def refresh
      puts 'override refresh!'
    end
  end

  # 環境変数を参照するConfigの例
  class EnvConfig
    include EachConfig

    # []をoverrideしてrubyのENV[]を返す
    def [](k)
      ENV[k]
    end

    def []=(k, v)
      ENV[k] = v
    end
  end
```

## 2. MultiConfig.instance.addで名前を指定して追加する

最初に追加したほうが優先度が高い。

```ruby
#config設定
config = MultiConfig::MultiConfig.instance.add(
  configs: {
    simple1: MultiConfig::SimpleConfig.new('key1' => '1of1', 'key2' =>  '2of1'),
    simple2: MultiConfig::SimpleConfig.new('key1' => 'two of one', 'key2' => 'two of two'),
    env:     MultiConfig::EnvConfig.new
  })

```


## 3. アクセッサ[]でアクセスする

```ruby
puts config['key1']
```


## その他

```ruby
# env一覧を表示
puts config.names

# :key1は先頭が:simple1のkey1なので'value1'
puts config['key1']

# :key2も同様なので2
puts config['key2']

# HOMEはenvにしかないので、:envのものが表示される
puts config['HOME']

# 'HOME'がどのように取得されているかみてみる
puts config.values('HOME')

# 順序を変えてみる
config.change_order(names: [:env, :simple2, :simple1])

# 参照してみる(3, value4となる)
puts config['key1']
puts config['key2']

# 自分で順序を指定してとる
puts config.value(:simple1)['key1']
puts config.value(:env)['key1']
```
[WordPress] add_action, add_filterなどはそろそろ無名関数で書いてもよい

**※ ただし、PHP5.3以上に限る**

とはいえ、PHP5.2以下サポート終了してるので、そろそろ・・・ということで


## 使い方
よくサンプルコードでアクションフックは以下の様に書かれているが

```php
add_action('init', 'hoge');

function hoge(){
    //処理
});
```

やっぱりこっちのほうが見通しよくてcool

```php
add_action('init', function(){
    //処理
});
```

WordPressはカスタマイズしだすとコールバックまみれになるので
これで書いたほうが圧倒的によいと思ってます。

**※ ただし、PHP5.3以上に限る**

大事なことなので2回
動作させるサーバーのPHPのバージョン確認はしっかり行いましょう。
ObjC to Swift : [NSFileManager createDirectoryAtPath:...]


Objective-C

```Objective-C
NSFileManager * fileManager = [NSFileManager defaultManager];

[fileManager createDirectoryAtPath: self.appSupportFolderPath
       withIntermediateDirectories: YES
                        attributes: nil
                             error: NULL];
```

Swift 2.0

```Swift
let fileManager = NSFileManager.defaultManager()

_ = try? fileManager.createDirectoryAtPath( path,
               withIntermediateDirectories: true,
                                attributes: nil )
```

Swift 1.2

```Swift
let fileManager = NSFileManager.defaultManager()

fileManager.createDirectoryAtPath( path,
      withIntermediateDirectories: true,
                       attributes: nil,
                            error: nil )
```
iTerm2で右CommandキーをESCキーに割り当ててbashで単語単位で移動する


# はじめに
MacでiTerm2使ってると、bashでの行内でのカーソル移動するのに行頭 `Ctrl + A` と行末 `Ctrl + E` は押しやすいんですが、単語単位で進む `ESC + F` と 単語単位で戻る `ESC + F` がすごく押しにくくて、なんとかならんかと思ったのだけど、個人的にほとんど使ってない右CommandキーにESCキーを割り当ててみたら快適になった。すごい初歩的なことかもしれないけど、自分用のメモも兼ねて設定方法を書いておきます。

シェル設定でもなんとなくできそうな気がするけど、シェルの設定に頼らないのは、カスタマイズできない色んなサーバにログインすることが多く、iTerm2側でキーバインドを変えるとどこでも使えるという算段です。

# 設定方法
MacBookProだとiTerm2で右Commandを直接ESCに割り当てる方法がなかったので、右Commandを右Optionに割り当てて、右OptionをESCに割り当てます。

## 右Commandを右Optionに割り当てる
「Preferences」>「Keys」で右Commandを右Optionに割り当てる
![Preferences 2015-09-19 14-56-00.png](https://qiita-image-store.s3.amazonaws.com/0/61152/4adfd2fd-ef8f-7f43-add4-a569e43122e5.png "Preferences 2015-09-19 14-56-00.png")

## 右OptionをESCに割り当てる
「Preferences」>「Profiles」>「Keys」で右OptionをESCに割り当てる
![Preferences 2015-09-19 14-49-28.png](https://qiita-image-store.s3.amazonaws.com/0/61152/1e1d5959-1b60-e8e0-279d-c76f23be2c2b.png "Preferences 2015-09-19 14-49-28.png")