OmniAICreator/Qiita-1.07M huggingface dataset:
Rails で erb -> haml への変換ポイント（どのgemの機能で変換するか）

## haml-rails で変換

### Gemfile

``` Gemfile
gem 'haml-rails'
```

### 使える Rake task

```
$ ./bin/rake haml:erb2haml
```

実行すると元のerbファイルを削除するかどうか、プロンプトで聞いてくる。

```
-----------------------------------------------------------
Would you like to delete the original .erb files? (This is not recommended unless you are under version control.) (y/n)
```

置き換えちゃってOKな場合、yで。

[公式リポジトリの参考箇所](https://github.com/indirect/haml-rails#converting-all-erb-views-to-haml-format)

### 蛇足

RubyMineでRake task実行したら、このプロンプト箇所でジーっと止まってた・・
回避方法がわからず、1度実行するだけのタスクなので、シェルから実行することに。


## erb2haml で変換

### Gemfile

``` Gemfile
gem "erb2haml", :group => :development
```

### 使える Rake task

変換したいだけ（erbとっておきたい）

```
$ ./bin/rake haml:convert_erbs
```

置き換え（erb削除してくれる）

```
$ ./bin/rake haml:replace_erbs
```

## 調べてみて気づいた・・

別々のgemで、同じタスクのネームスペース(？) haml が拡張されてるんだね。。
erb2haml はもういらないのかも。。。


この辺のグダグダ調べてた感をブログに。

[Rails で erb -> haml への変換ポイント（どのgemの機能で変換するか） - まりぴよこのブログ](http://mpiyok.hatenablog.com/entry/2015/09/25/085838)
委譲による継承の置き換え Replace Inheritance with Delegation


## 継承、委譲とは

そもそも継承とは、親にあたるクラスから財産を受け継ぐこと。
多くのオブジェクト指向プログラミング言語は、継承の機能を持っている。

委譲とは、「他のクラスから別のインスタンスのメソッドを呼び出し処理を実現する」こと
要するにおまかせをするということ。

## 継承と委譲の比較

継承 : クラス同士の関係
委譲 : インスタンス同士の関係

## 継承を多様する課題
- サブクラスがスーパークラスの機能の一部しか利用していない。
- サブクラスがスーパークラスとIS-A関係にない
- LSPに反している
- 契約を守っていない

## 結果
- 不適切な継承関係の解消
- クラスが必要としている機能が明確になる
- クラスの改良・機能追加が容易になる
- 以上を行うメソッドを記載する必要がある

## サンプルコード

```Another.java 
Class Another {
	void method()
	...
}

Class Something extends Another {
}
```

```Something.java
Class Something {
	Another _delegate = new Another();
	...
	void method() {
		_delegate.method();
	}
}
```

## 補足
### 相続拒否とは
継もとの大半のメソッドを使わっていない。
この相続拒否は、契約違反でもある。
リファレンス・マニュアルを見て、制約条件をまもる必要もある。

### Chain Constructors
コンストラクタを複数用意する場合、
重複したコードになる。
それを引数なしのコンストラクタから、引数ありのコンストラクタを呼び出すことで、冗長化を防ぐ。

### リスコフの置換原則
[Swift] わからない言葉をとことん調べて基礎を積み上げる 「ビット、assert」

#ビット
> ビットとは、コンピュータが扱う情報の最小単位。「binary digit」を略したものが語源と言われる。**2つの選択肢から1つを特定するのに必要な情報量が1ビット。**一般に、**nビットの情報量では2のn乗個までの選択肢からなる情報を表現することができる。**例えば、アルファベット26文字を表現するのに必要な情報量は5ビット（16<26<32なため）である。

#条件分岐とラベル
forとdo-whileは省略

```txt:code
loop1: while 条件 { //continue loop1でここに戻る
    loop2: while 条件 { //continue loop2でここに戻る
        while 条件 {
            break loop1
            continue loop1
            break loop2
            continue loop2
            }
       } //break loop2でここに行く
} //break loop1でここに行く
 loop1やloop2は区別するためのラベル
```

#assert
assertはデバッグ用の機能
- デバッグ
>コンピュータのプログラムの誤り（＝バグ）を見つけ、手直しをすること。
プログラムの実行時に指定した条件が満たされていれば何もせず、満たされていない場合その時点で停止し、停止箇所のに関するメッセージがログに書き出される


アプリ開発も記事書くのも初心者なので至らない点がありましたら助言していただけると幸いです。
参考サイト:https://ja.wikipedia.org/wiki
Master-DetailのiPhoneアプリをiPad対応してみた


典型的なMaster-Detail構成のiPhoneアプリをiPad対応した際にやったことをご紹介します。

図の左のようにPushで遷移するiPhoneアプリがあり、iPad対応に伴い図の右のようなレイアウトを実装するケースを想定しています。

![ipad_support_by_split.001.jpg](https://qiita-image-store.s3.amazonaws.com/0/38775/0c1b80a4-f1cd-3811-736a-737f8bb13b60.jpeg "ipad_support_by_split.001.jpg")

要は「どんな形でもいいからiPad対応してみたい」という人向けです。

## やり方

#### 1. UISplitViewControllerを設置

* 「master view controller」にUINavigationControllerをセット
* 「detail view controller」にDetailに対応するUIViewControllerをセット
* MasterからDetailへのSegueが「Show（e.g. Push）」だった場合、「Show Detail (e.g. Replace）」に変更
* 最初の画面ならUISplitViewControllerの「Is Initial View Controller」をチェック

Before

![storyboard_before.png](https://qiita-image-store.s3.amazonaws.com/0/38775/5ccec5f2-57b3-6b83-b99b-f0193f0443bf.png "storyboard_before.png")

After

![storyboard_splitview_setting.png](https://qiita-image-store.s3.amazonaws.com/0/38775/e6f1a53f-249c-7f55-1c16-44b9d08de3d0.png "storyboard_splitview_setting.png")


#### 2. プロジェクトの設定

* 「Devices」を「Universal」に変更
* AppIconを再作成してiPad用の画像を設定

#### 3. MasterViewControllerの修正

* クラスの宣言にUISplitViewControllerDelegateを追加

```MasterViewController.swift
class MasterViewController: UITableViewController, UISplitViewControllerDelegate {
```

* viewDidLoadにてデリゲートの設定と、常時2ペインモードへの切り替え

```MasterViewController.swift
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if let split = self.splitViewController {
            split.delegate = self // デリゲートのセット
            split.preferredDisplayMode = .AllVisible // 常時2ペイン表示に設定
        }
    }
```

* iPhoneで起動する際、初期画面をDetailではなくMasterの方にするために、次のメソッドを実装してtrueを返す

```MasterViewController.swift
    func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController: UIViewController, ontoPrimaryViewController primaryViewController: UIViewController) -> Bool {
        return true
    }
```

これで完了です。

## レイアウト調整が必要になった場合

レイアウトが崩れた場合に調整します。自分がハマったところをご紹介します。

#### Viewのwidthの取得

例えばMasterのUIViewControllerでtableViewのwidthを取得したい場合、最初のviewWillAppearまでは全画面のwidthが返ってきてしまい、実際に表示されるときのwidthが取得できません。

どうしてもviewWillAppearまでに欲しい場合はself.splitViewController!.primaryColumnWidthを使用して取得します。

#### 回転対応

iPad対応すると画面回転に対応したくなってきます（笑）

回転イベントはviewWillTransitionToSizeで取得できますが、回転後のナビゲーションバーやステータスバーのサイズが取得できません。この場合、coordinator.animateAlongsideTransitionに指定するブロックで取得・設定できました。（正攻法ではないかもしれません。ちなみに回転後の画面サイズだけならsizeから取得できます。）


```MasterViewController.swift
    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
        
        coordinator.animateAlongsideTransition(
            { (context: UIViewControllerTransitionCoordinatorContext) -> Void in
            	let width = self.navigationController!.navigationBar.bounds.height
            	// レイアウト調整
            }, completion: nil)
    }

```

## おわりに

iPhoneアプリのiPad対応でやったことをご紹介しました。
もし他によりよい方法がありましたらコメントいただけるとうれしいです。
2015-09-25 qiita > 検索 > 複数tagの指定は AND 検索っぽい

Qiitaの検索はまだよく分からない。

複数タグを指定した検索を試してみた。

「tag:stringoperation tag:myunity tag:fileIO」で検索。
すると、上記タグ全てを含む記事だけが検索結果に出てきた。

これは、（タグをきちんと覚えている時に）自分が希望する検索結果となっている。

過去のQiitaの投稿では
http://qiita.com/asahina_dev/items/9b584b0303b8ce22637b
> 先の入力が無視される。
> tag:mysql tag:php
> \# 検索結果は tag:php のみ

という記載があったが、この時から変更があり、AND検索に現在(2015/09/25)はなっているようだ。
アプリ担当者向け『アプリを作るための3ステップ』企画～開発まで【簡易版】

##モバイルコンテンツ関連市場は __4兆円規模へ__


モバイルコンテンツ関連市場は、2011年に2兆円弱だったのに対し、2014年は3兆9000億円に達したとの事です。
なんと３年間で２倍近く伸びており、2015年には４兆円規模に上ることは間違いありません。
![モバイルコンテンツ市場.PNG](https://qiita-image-store.s3.amazonaws.com/0/32732/d023e1c7-7256-32de-d156-cd459e2257c5.png)


※一般社団法人モバイル・コンテンツ・フォーラム　より
https://www.mcf.or.jp/wordpress/wp-content/uploads/2013/10/mobilecontent_market_scale2014.pdf


##そしてあなたは アプリを作ることになった

市場はこのように右肩上がりなので、例えば会社で誰かが、
__「今の時代はWebよりアプリの方が集客できるだろう。アプリを作ろう！」__
みたいに、わりとざっくりアプリを作ることが決まるかもしれません。

__そうなっても大丈夫なように、最低限の事は知っておきましょう。__
ということで、まとめておきたいと思います。

#アプリ開発の3ステップ
アプリの開発は以下の3つのステップをたどります。

||ステップ|
|------|-----|-----|
|1|企画|
|2|開発|
|3|運用|

各ステップにおいて押さえておくべきことを細かく紹介します。
今回は、第1ステップ、第2ステップである企画～開発までの流れをご紹介します。

##第1ステップ　～企画～
###●どうやってアプリでビジネスにつなげるか？

|主要なビジネスモデル|
|-----|-----|
|本業への集客|
|商品（物）の販売|
|本業のブランディング|
|アプリ自体で売上獲得|

などがあります。
まずはその目的を決める必要があります。


__(※以下のアンケートにお答えいただくと、具体例を提供いたします)__
http://bit.ly/1NPZw8U


###●なぜユーザーはそのアプリを使うのか？
ユーザーにとってアプリを使うメリットを考える必要があります。
IT業界では、システムを開発するときに「ユーザーストーリー」と呼ばれるモノ使うことがあります。



###●企画を具体化する

以上２つをふまえ、企画を具体化します。
サービス企画を1枚ペラで整理する「リーンキャンバス」と呼ばれるツールがあるので紹介しておきます。


__(※アンケートに答えて　「ユーザーストーリー」や「リーンキャンバス」のご具体例を取得)__
http://bit.ly/1NPZw8U


###●機能を洗い出す
思いつく機能を洗い出してみましょう。


###●画面と画面遷移

__※注意__
__実際のアプリに適用する画面や画面遷移は、開発会社には1からデザインしてもらうのが良いでしょう。__

それではいよいよ開発のステップに入っていきます。

##第2ステップ　〜開発〜

###●__開発手段__
最近ではアプリを開発する手段が多くなりました。
ここではいくつかアプリの開発手段についてメリット、デメリットをまとめてみます。



####__○アプリ向けCMS（コンテンツ・マネジメント・システム）サービス__
この方法はアプリを開発会社に作ってもらうのではなく、CMSが持つ機能を組み合わせて自分で作ります。
手軽にアプリを開発することができ、情報の更新も簡単なのが特徴です。

####__○開発会社にアプリを開発してもらう__

思い通りのアプリを作れることが特徴です。
一方、開発期間、金銭的、コミュニケーションのいずれのコストも高くなりがちなのも特徴です。

__※開発手段についてメリット・デメリット、開発会社の探し方、依頼前のチェック項目、開発時のやり取り、テスト、リリース作業など、
アンケートに答えて続きを読む__
http://bit.ly/1NPZw8U
※なお__日本国内のOSのシェア状況('15/09現在）の詳細__もアンケートにお答えいただくとでご提供しております。

###●リリース作業

アプリのリリース手順に関しては、Developers.IO様のサイトでよくまとめられていますので割愛します。
　iOS
　https://developer.apple.com/programs/enroll/jp/
　Android
　http://dev.classmethod.jp/smartphone/android/android-app-how-to-release/#toc-2
技術英語 > much of the + 単数名詞 > 大部分 > I still remember much of it in some detail.

引用: 冠詞マスター教本 by 石井隆之さん

> [much of the... + 単数名詞] または [much of +単数代名詞]で「大部分」の意味
(b) I still remember much of it in some detail.
(今でもその殆どをかなり詳しく覚えています)

単数名詞に much of を使うと「(ある一つの物事の）大部分」という意味になるとのこと。

以下のような much of them とは意味が異なるのだろう。

>https://www.quora.com/When-people-read-hundreds-of-books-a-year-how-much-of-them-do-they-actually-remember

> When people read hundreds of books a year, how much of them do they actually remember?

こちらは「(多くの本の）ほとんど」という意味になるのだろう。
クラウドソーシングから見たこれから勉強すべき言語


単純に某クラウドソーシングサービスをキーワード検索で集計(2015/09/25 現在)

# 集計

## 仕事が多い言語は？


|言語 | キーワード | 仕事件数 |
|--------|---|------------:|
| php | php | 8,199件 |
| JavaScript | JavaScript| 7,221件 |
| java | java | 4,724件 |
| ruby | ruby |3,476件 |
| Swift | iPhone | 1,838件 |

## 仕事が多いフレームワークは？

|言語 | キーワード | 仕事件数 |
|--------|---|------------:|
| ruby | rails | 1,404件 |
| php | cakephp | 1,248件 |
| java | Android | 805件 |
| php | Symfony | 100件 |
| php | laravel | 39件 |
| JavaScript | nodejs | 12件 |

### 備考

- 報酬を集計するのは ~~面倒だったので~~ 大差なかったので省略。ピンキリですが、だいたい平均5万...
- 集計に出してない言語、フレームワークは出す程件数がなかったので、適当に省略

# 結果

1位　php　鉄板ですね。
2位　JavaScriptフロントはほぼ必須ですからこちらも鉄板
3位　java Androidもあるけどweb系も以外とある
4位　ruby もっと上かと
5位　Swift iosアプリしか作れないのにすごいね

# まとめ

## これからプログラミングの勉強して、フリーランサーにすぐにでもなりたい人

**PHP**

保守運用系の仕事が結構あるからでしょうか、プログラマーのトレンドとは５年位ずれてる感じがします。とはいえ、これからプログラミングの勉強して、フリーランサーにすぐにでもなりたい人はphpが良さそうですね。

## 色々覚えるの無理って人

**JavaScript**

サーバー、フロント、アプリなんでもできるって理想はあるけど２年早いですかね。とはいえフロントの仕事はたくさんあるので、そこで場数を踏んでJavaScript衆の隆盛を待つのも戦略としては間違いはなさそうです

## バランスタイプな人

**ruby**

rubyはrails一強なのでキャッチアップがシンプル。プロダクトに集中しやすい環境があるし、仕事数もそこそこあるので安定。あと２年はrails + JavaScriptでweb開発がバランスいいのではないでしょうか
Pythonで実装 PRML 第1章 ベイズ推定

前回に続いて、PRML1章から「1.2.6 ベイズ推定」の実装です。
図1.17の再現ですが、M=9とした上で、予測分布の平均と±1σの範囲を示しています。

数式追ってるだけだと抽象的で、いまいちピンと来なかったんですが、
実装することで、(1.70)、(1.71)が分布を示すことが具体的に可視化されて腹に落ちました。
この予測精度が、前回の多項式曲線フィッティングとどう異なるのかは今回の例からは判断できませんが、
それぞれどのようなものかを理解する上では大変役立ちました。

##実装の大まかな流れ
①求めたいのは予測分布(1.69)。

```math
 p(t| x, {\bf x}, {\bf t}) = N(t| m(x), s^2(x)) (1.69)
```

②今回、基底関数は$\phi_i(x) = x^i$ for $i = 0,...M$ 。

③予測分布の平均、分散を求める式は下記の3つなので、これをそれぞれ実装して、予測範囲 $0.0<x<1.0$の分布を可視化する。

```math
m(x) = \beta\phi(x)^{\bf T}{\bf S} \sum_{n=1}^N \phi(x_n)t_n(1.70)]
```

```math
 s^2(x) = \beta^{-1} + \phi(x)^{\bf T} {\bf S} \phi(x)(1.71)
```

```math
{\bf S}^{-1} = \alpha {\bf I} + \beta \sum_{n=1}^N \phi(x_n)\phi(x_n)^{\bf T}(1.72)
```

##コード
```python
import numpy as np
from numpy.linalg import inv
import pandas as pd
from pylab import *
import matplotlib.pyplot as plt

#From p31 the auther define phi as following
def phi(x):
    return np.array([x**i for i in xrange(M+1)]).reshape((M+1, 1))

#(1.70) Mean of predictive distribution
def m(x, x_train, y_train, S):
    sum = np.array(zeros((M+1, 1)))
    for n in xrange(len(x_train)):
        sum += np.dot(phi(x_train[n]), y_train[n])
    return Beta * phi(x).T.dot(S).dot(sum)

    
#(1.71) Variance of predictive distribution   
def s2(x, S):
    return 1.0/Beta + phi(x).T.dot(S).dot(phi(x))

#(1.72)
def S(x_train, y_train):
    I = np.identity(M+1)
    Sigma = np.zeros((M+1, M+1))
    for n in range(len(x_train)):
        Sigma += np.dot(phi(x_train[n]), phi(x_train[n]).T)
    S_inv = alpha*I + Beta*Sigma
    S = inv(S_inv)
    return S

if __name__ == "__main__":
    alpha = 0.005
    Beta = 11.1
    M = 9
    
    #Sine curve
    x_real = np.arange(0, 1, 0.01)
    y_real = np.sin(2*np.pi*x_real)
    
    ##Training Data
    N=10
    x_train = np.linspace(0, 1, 10)
    
    #Set "small level of random noise having a Gaussian distribution"
    loc = 0
    scale = 0.3
    y_train =  np.sin(2*np.pi*x_train) + np.random.normal(loc,scale,N)
    
    
    S = S(x_train, y_train)
    
    #Seek predictive distribution corespponding to entire x
    mean = [m(x, x_train, y_train, S)[0,0] for x in x_real]
    variance = [s2(x, S)[0,0] for x in x_real]
    SD = np.sqrt(variance)
    upper = mean + SD
    lower = mean - SD
    
    
    plot(x_train, y_train, 'bo')
    plot(x_real, y_real, 'g-')
    plot(x_real, mean, 'r-')
    fill_between(x_real, upper, lower, color='pink')
    xlim(0.0, 1.0)
    ylim(-2, 2)
    title("Figure 1.17")
```

##結果
![Screen Shot 2015-09-18 at 07.22.52.png](https://qiita-image-store.s3.amazonaws.com/0/62779/5eab063a-48ea-ff52-0976-af3bf2ae44cf.png)
OpenRestyでluarocksを使う手順整理

* OpenRestyのインストール
* luarocksのインストール
* luarocksでモジュールのインストール
* インストールしたモジュールの呼び出し

の手順メモ。
環境はCentOS 6.5

## 1. OpenRestyのインストール

```bash
# 依存パッケージ
sudo yum install -y pcre
sudo yum install -y pcre-devel

sudo yum install -y openssl
sudo yum install -y gcc-c++
sudo yum install -y readline
sudo yum install -y readline-devel
sudo yum install -y openssl-devel

# OpenRestyインストール
cd /tmp
wget http://openresty.org/download/ngx_openresty-1.7.10.1.tar.gz
tar xzvf ngx_openresty-1.7.10.1.tar.gz
cd /tmp/ngx_openresty-1.7.10.1
./configure --with-luajit
sudo gmake
sudo gmake install

# nginxの起動スクリプト設置
cd /etc/init.d
sudo wget https://gist.githubusercontent.com/vdel26/8805927/raw/249f907e465e98ac099437025218a15e55a34b4c/nginx --no-check-certificate
sudo chmod a+x nginx
```

## 2. luarocksのインストール

```bash
# 依存パッケージ
sudo yum install -y unzip

#luarocksのインストール
cd /tmp
wget http://keplerproject.github.io/luarocks/releases/luarocks-2.2.2.tar.gz
tar zxvf luarocks-2.2.2.tar.gz
cd luarocks-2.2.2
./configure --prefix=/usr/local/openresty/luajit \
    --with-lua=/usr/local/openresty/luajit \
    --lua-suffix=jit-2.1.0-alpha \
    --with-lua-include=/usr/local/openresty/luajit/include/luajit-2.1
sudo make build
sudo make install
```

## 3. luarocksでモジュールのインストール
lua-resty-templateとlua-resty-httpをインストールする例。

```bash
sudo /usr/local/openresty/luajit/bin/luarocks install lua-resty-template
sudo /usr/local/openresty/luajit/bin/luarocks install lua-resty-http
```

## 4. インストールしたモジュールの呼び出し

以下を実行したときに表示されるLUA_PATHとLUA_CPATHを
それぞれlua_package_pathとlua_package_cpathに追加する

```
$ /usr/local/openresty/luajit/bin/luarocks path
```

以下はnginxのconfから関係ある箇所のみ抜粋。

```nginx:sample.conf
lua_package_path 'root/.luarocks/share/lua/5.1/?.lua;/root/.luarocks/share/lua/5.1/?/init.lua;/usr/local/openresty/luajit/share/lua/5.1/?.lua;/usr/local/openresty/luajit/share/lua/5.1/?/init.lua;./?.lua;/usr/local/openresty/luajit/share/luajit-2.1.0-alpha/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;;';

lua_package_cpath '/root/.luarocks/lib/lua/5.1/?.so;/usr/local/openresty/luajit/lib/lua/5.1/?.so;./?.so;/usr/local/lib/lua/5.1/?.so;/usr/local/lib/lua/5.1/loadall.so;;';

server {
    location / {
        content_by_lua_file /path/to/main.lua;
    }
}
```

luaで以下のようにモジュールが呼び出せる

```lua:main.lua
local http = require "resty.http"
local httpc = http.new()
local res, err = httpc:request_uri("http://google.com")
ngx.say(res.body)
```

requireする際のモジュール名はモジュールのrockspecを参照。
lua-resty-httpのrockspecには以下のように記載がある。

```rockspec:lua-resty-http-0.06-0.rockspec
build = {
  type = "builtin",
  modules = {
    ["resty.http"] = "lib/resty/http.lua",
    ["resty.http_headers"] = "lib/resty/http_headers.lua"
  }
}
```
Electronを使ってMac向けのアプリを開発する時のファイル名の扱いについて (所謂UTF-8-MAC問題)

以前Nodeで作っていたものをElectronで作り直していて、同じ問題にまたハマったので書いておく。
所謂、UTF-8-MAC問題である。もう遥か昔にNodeでハマった時の記事がある。
[node.jsでUTF-8-MACを扱う - joker1007の日記](http://d.hatena.ne.jp/joker1007/20110723/1311406670 "node.jsでUTF-8-MACを扱う - joker1007の日記")

Macのファイルシステムはファイル名に対してNFDとかいう正規化を行っていて、ファイルシステムにアクセスする時に勝手に変換しやがる仕組みになっている。
このせいで、濁点が入ると急に死ぬとか、本当辛い問題が起きる。何の嫌がらせなんだと……。この世界は文字が8ビットで済む様な国ばっかじゃねえんだよ！
とりあえず`Mac NFD`でググると辛いのは俺だけじゃない気持ちになれる。

で、昔は上で貼ったブログに書いたような方法で解決していたのだが、正直、この解決策は2015年にもなって面倒過ぎるだろと思っていた。
(マジかよーってググって自分の記事が一番上に出てきて、軽く絶望した)

幸いなことにiojsはちゃんとこの問題について認識していたらしく、`String.prototype.normalize()`なるものが実装されていた。
もちろんElectronでも使える。本当、良かった……。
[String.prototype.normalize() - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize "String.prototype.normalize() - JavaScript | MDN")
(なんか、nodeのリポジトリに同種のissueがまだオープンされてるんだが、iojsと統合された後のNodeでちゃんと使えるのか不安……。まだ試してない。)

後、昔は見つけられなかったが、こんなnpmパッケージもあった。
[walling/unorm](https://github.com/walling/unorm "walling/unorm")

というわけで、ファイルシステムからfsモジュール等で取ってきたファイル名の文字列を扱う際には、一旦`normalize()`でNFCに戻しておいた方が安全です。
特にDBに書き込んだり、フォームから入力した文字列と付き合わせる場合です。
でないと、濁音等が混じっただけで、目に見えないけど違う文字扱いされて死にます。

割と簡単に解決できる世の中になってて良かったけど、またiconvをコンパイルしたり、もしくはNFD->NFC変換を自分で書かなきゃいけないのかと絶望する所だった。
もう、El Capitanとかどうでもいいから、NFDを止めて欲しい……。忘れたころに地雷が……。
しかし、実はNode界隈に自分が疎いだけで、JSerにとってはこの問題は常識だったりするのかも。
新圧縮アルゴリズムBrotliについて

[Google、新しい圧縮アルゴリズム「Brotli」公開](http://news.mynavi.jp/news/2015/09/24/127/)　だそうです。

##詳しく書いてある記事
http://textslashplain.com/2015/09/10/brotli/
http://www.cnx-software.com/2015/09/24/brotli-compression-algorithm-combines-high-compression-ratio-and-fast-decompression/

##理解したこと
BrotliはHTTPでやり取りするデータを圧縮する目的で作られている。
このため、伸張が高速になるように設計されている。
圧縮率は高いが必ずしも高速ではない。
大きいバイナリファイルなどの圧縮はかなり時間がかかる。
gzipともLZ4とも用途が異なる。
swiftのクロージャで多重ループを簡単に書いてみる

Cで多重ループを簡単に書こうとすると以下のようにマクロでfor文を定義することができました。
これは多重ループを多用するような3Dの処理などでは、このようなソースをよく見ます。
ただし、C90ではコンパイルできなかったり、最近のswiftをはじめとしたナウでヤングな言語ではマクロで処理を記述できないのが一般的になっていると思います。

```c:nested_loop.c
#include <stdio.h>
#include <stdlib.h>

#define N 10
#define START_LOOP for(int i=0; i < N; i++){\
				   for(int j=0; j < N; j++){\
				   for(int k=0; k < N; k++){
#define END_LOOP }}}

int main(){
	START_LOOP
		printf("%d %d %d\n",i,j,k);
	END_LOOP
}
```

これをswiftのクロージャで書くとこんな感じに定義することができます。

```swift:nested_loop.swift
let N = 10;

func nested_loop(closure:(Int,Int,Int)->()){
  for i in 0..<N {
    for j in 0..<N{
      for k in 0..<N{
        closure(i,j,k)
      }
    }
  }
}

nested_loop({(i,j,k) in
  print(i,j,k)
})

nested_loop({
  print($0,$1,$2)
})

```

これと同じようにC#のParallel.For文のようなこともできるかもしれません。(使ったことないけど)
関数型言語はよくわかりませんが、こういう感じに今までの処理を置き換えていくと見えてくるものがあるかもしれないですね。
WindowsServer2012のディスク拡張


VMマシンで仮想ファイルのサイズを拡張後の作業について確認したのでログとして残します。

![kobito.1443110684.456456.png](https://qiita-image-store.s3.amazonaws.com/0/33479/7ed58904-0d25-fd2c-13f1-109e7c719a98.png "kobito.1443110684.456456.png")


![kobito.1443111330.190529.png](https://qiita-image-store.s3.amazonaws.com/0/33479/8fa15324-1c13-55e9-1863-ac6adb8d4734.png "kobito.1443111330.190529.png")


![kobito.1443111375.816425.png](https://qiita-image-store.s3.amazonaws.com/0/33479/66e86dfa-7c32-6e4a-16f6-bf8737cb01aa.png "kobito.1443111375.816425.png")


![kobito.1443111449.406754.png](https://qiita-image-store.s3.amazonaws.com/0/33479/9381e1aa-6633-2f89-4231-973400a77a55.png "kobito.1443111449.406754.png")


![kobito.1443111497.585981.png](https://qiita-image-store.s3.amazonaws.com/0/33479/bbf35273-75aa-6bf5-310c-0fedd15918a2.png "kobito.1443111497.585981.png")


![kobito.1443111522.809432.png](https://qiita-image-store.s3.amazonaws.com/0/33479/298c4386-b3b7-aa42-3fd6-95b082851109.png "kobito.1443111522.809432.png")


![kobito.1443111543.348005.png](https://qiita-image-store.s3.amazonaws.com/0/33479/43c102bc-77c6-70b2-80d1-75f51eefa5dd.png "kobito.1443111543.348005.png")
タスクスケジューラに登録したタスクの無効化と停止方法


ちょっと仕事で使うのでまとめる。

## 1. タスクの無効化方法
検証用に簡単なタスクを準備。
![kobito.1443109817.607206.png](https://qiita-image-store.s3.amazonaws.com/0/33479/97ae45cd-7297-cf86-eb45-b85775078148.png "kobito.1443109817.607206.png")

### 1.1 コマンドで操作
![kobito.1443109969.152723.png](https://qiita-image-store.s3.amazonaws.com/0/33479/b947ce1b-7b46-3ea6-f6aa-dd02f1420042.png "kobito.1443109969.152723.png")

![kobito.1443109991.623582.png](https://qiita-image-store.s3.amazonaws.com/0/33479/14e47291-e7ab-bf2b-ca65-ec24ae319ff8.png "kobito.1443109991.623582.png")


### 1,2  GUIで操作
①タスクを選択し、右クリック。
②プロパティを押下。
③一番下の「実行する」のチェックを外す。
④「OK」を押下して終了する。

![kobito.1443110110.189269.png](https://qiita-image-store.s3.amazonaws.com/0/33479/d14027fd-0f02-1556-276b-89a293236d1d.png "kobito.1443110110.189269.png")

![kobito.1443110129.899031.png](https://qiita-image-store.s3.amazonaws.com/0/33479/efcd48e2-216a-03b6-bd53-3e1d63d4ca43.png "kobito.1443110129.899031.png")

![kobito.1443110151.225363.png](https://qiita-image-store.s3.amazonaws.com/0/33479/74a476b2-2098-2d25-75f6-a16e3d4e144a.png "kobito.1443110151.225363.png")


## 2. タスクの削除方法

### 2.1 コマンドで操作
![kobito.1443110233.052176.png](https://qiita-image-store.s3.amazonaws.com/0/33479/0dafa5e4-9a39-18e3-c0a1-3c2e75ea8396.png "kobito.1443110233.052176.png")

### 2.2 GUIで削除
①タスクを選択し、右クリック。
②「削除」を押下。

![kobito.1443110308.493165.png](https://qiita-image-store.s3.amazonaws.com/0/33479/4ad56f00-1ffa-368a-1d57-ffcf73136a34.png "kobito.1443110308.493165.png")
![kobito.1443110325.696773.png](https://qiita-image-store.s3.amazonaws.com/0/33479/99fbc2a5-b6ab-fbb8-194a-572e24d93e16.png "kobito.1443110325.696773.png")
[WordPress + MySQL] DBからサイトURLを変更

# 概要
管理画面からURLを間違って設定してログインできなくなった時や、既存のサイトをコピーして別サイトを立ち上げる時、データベースからURLを修正・変更することができます。
※記事内にサイトアドレスが含まれている場合は別途、データ変更が必要になるかもしれません。

### ※コメントをいただいたので追記
wp-config.phpでURL変更できるようですが、管理画面の一般設定からURLの変更ができなくなる（変更が効かない？）ようです。検証していないので推測になりますが、管理画面のURL設定はDBでデータを持っていて、config.phpでURLを設定した場合にconfigを優先して設定を読み込むからかもしれません。

https://wpdocs.osdn.jp/%E3%82%B5%E3%82%A4%E3%83%88_URL_%E3%81%AE%E5%A4%89%E6%9B%B4
```これは最適な方法とは言えないかもしれません。サイトの値を決め打ちしているだけです。この方法を使うと、サイトの一般設定ページで値を変更することはできなくなります。
```

# 環境（筆者が実施した）
- WordPress 3.9.9
- MySQL 5.6

他バージョンで実施する場合は適せん読み替えしてください。

# 手順
WordPressアドレスとサイトアドレスを同じURLに変更します。

- WordPressアドレスとサイトアドレスを確認

パラメータ名からして、
 - WordPressアドレス→home
 - サイトアドレス→siteurl
と思いますが未確認です。それぞれ別のURLを設定する場合は```siteurl```だけ設定してログインできるか確認してみてください。

```mysql
SELECT * FROM wp_options WHERE option_name IN ('home','siteurl');
```

- WordPressアドレスとサイトアドレスを変更

```mysql
UPDATE wp_options SET option_value = 'http://example.com' where option_name IN ('home','siteurl');
```

- 変更されたか確認

```mysql
SELECT * FROM wp_options WHERE option_name IN ('home','siteurl');
```

- WordPressの管理画面にログインして「一般設定」からURLが変更されたか確認
 - WordPress アドレス (URL)
 - サイトアドレス (URL)

# あとがき

仕様なんでしょうが、URLをDBに設定している意味があまり感じられません。
管理画面のURL変更してログインできなくなるというのはメンテナンス性が悪いので、E●−CUBEみたいにconfig用PHPで設定できるようにして欲しいです。

### コメントをいただいたので追記
wp-config.phpでもURLを設定できるようですが、管理画面からのURL変更ができなくなるなどデメリットが発生します。それを考えたらURL変更はDBでやる必要がありますね。
rbenvでRubyのバージョン管理


Xcodeに付随しているRubyを使わずに、rbenvでRubyを管理します。

## brewでrbenvをインストール

```console:Command
brew install rbenv
brew install ruby-build
```

## rbenvを使用してrubyをインストール

### インストール可能なRubyのバージョン一覧を表示する

```console:Command
rbenv install --list
```

```console:内容
Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
  1.8.7-p302
  .
  .
  .
  ree-1.8.7-2012.01
  ree-1.8.7-2012.02
  topaz-dev
```

#### Rubyのインストール

現在の安定版である「ver: 2.2.0」をインストールをします。

```console:Command
rbenv install 2.2.0
```

#### rbenvで管理しているRubyの一覧を確認する

```console:Command
rbenv versions
```

```console:表示される内容
* system
  2.2.0 (set by /Users/xxxxx/.rbenv/version)
```

#### Rubyバージョンの切り替え

```console:Command
rbenv global 2.2.0
```

#### RubyのPATHを設定する

```console:Command
vim ~/.bash_profile
```

```console:追加する内容
# ruby setting
if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi
```

#### 設定ファイルを読み込む

```console:Command
source ~/.bash_profile
```

#### RubyのPATHが正しいことを確認する

```console:Command
which ruby
```

```console:表示内容
/Users/xxxxx/.rbenv/shims/ruby
```
Sprockets::FileNotFound: couldn't find file 'select2_locale_ja' with type 'application/javascript'



* select2-railsのバージョンがv4になっていた。
* 以下のようにGemfileを変更して`bundle install`

```Gemfile
gem 'select2-rails', '~> 3.5.9'
```

[Releases · argerim/select2-rails](https://github.com/argerim/select2-rails/releases)
head内の記述

header内での記述


##解説

```html:文字コード
<meta charset="UTF-8">
```

HTMLの記述形式（文字コード）を正しく設定することによって、ページが読み込まれたときの文字化けを防ぎます。

```html:TDK
<title>【サイト名】-【軽い説明文】</title>
<meta name="description" content="【情報の説明文50～100文字で書く。（英語の場合、カタカナ、読みも書く）】">
<meta name="keywords" content="【伝えたい、情報を、約5つ、ほど、単語で書く】">
```

ページの【title(題名)】、【description(説明文)】、【keywords(関連する単語)】を設定します。

```html:スマホ
<meta name="viewport" content="width=device-width">
```

携帯端末でのウェブページの表示方法を制御します。viewportを設定すると、ページの幅や拡大縮小を制御できるようになります。

```html:外部リンク
<link rel="stylesheet" href="【cssのパスを書く】">
<script src="【jsのパスを書く】"></script>

```

外部のCSSファイルやJSファイルを読み込みます。

<link rel="canonical" href="">

```html:オルタネイト
<link rel="alternate" media="" href="">
```

デスクトップ用ページに対し、代替のURLが存在することを示すのに使われます。
(スマホサイト用のページなどがある場合に、PC用ページにスマホサイト用のページのURLを書く)

```html:評価
<link rel="canonical" href="http://hoge.com/hoge.html">
```

マイナス評価を避けるために必要。同じようなページがいくつもある場合に書く。
(スマホ用のページなどがある場合、スマホ用ページにはPC用のページURLを書く。)

```html:評価
<meta name="robots" content="noindex">
```

検索エンジンにさまざまな指示を与えることができるタグです。

```html:ファビコン
<link rel="shortcut icon" href="favicon.ico"> 
```

ファビコンの設定を行う 拡張子は.icoでなければいけない。
(ファビコン(Favicon)とは、Webブラウザのアドレスバーやタブに表示されるアイコンのことです。)

```html:OGP
<meta property="og:type" content="article"/>
<meta property="og:image" content="【見せたい画像URL】">
<meta property="og:title" content="【ページのタイトル】">
<meta property="og:description" content="【ページの説明】">
<meta property="og:url" content="【ページのURL】">
<meta property="og:site_name" content="【サイト名(トップページに合わせる)】">
<meta property="og:locale" content="ja_JP">
<meta property="fb:admins" content="FBのユーザーID">
```

OGPとは、FacebookやmixiなどにWebページをシェアするとき
そのページの記事のタイトル、URL、代表する画像、サマリーなどを正しく各ソーシャルメディアに伝えるためのメタ要素。

```html:Twitter
<meta content="summary" name="twitter:card">
<meta content="@twitter_acount" name="twitter:site">
```

ツイート内にURLが含まれている場合に、そのページのタイトルや概要、アイコン写真などを表示する。

1行目はカードのタイプを示すもので、
2行目はそのサイトに対応するTwitterアカウント名を「@」込みで入れます。
あとはOGPの「og:url」「og:title」「og:description」「og:image」を参照してくれます。

※Twitter Cardsを利用するためには申請が必要です。

##まとめ

head内の記述は【 meta 】、【 title 】、 【 link 】の順に書く

```html:まとめ
<meta charset="UTF-8">
<meta property="og:type" content="article"/>
<meta property="og:image" content="【見せたい画像URL】">
<meta property="og:title" content="【ページのタイトル】">
<meta property="og:description" content="【ページの説明】">
<meta property="og:url" content="【ページのURL】">
<meta property="og:site_name" content="【サイト名(トップページに合わせる)】">
<meta property="og:locale" content="ja_JP">
<meta property="fb:admins" content="FBのユーザーID">
<meta content="summary" name="twitter:card">
<meta content="@twitter_acount" name="twitter:site">
<meta name="description" content="【情報の説明文50～100文字で書く。（英語の場合、カタカナ、読みも書く）】">
<meta name="keywords" content="【伝えたい、情報を、約5つ、ほど、単語で書く】">
<meta name="viewport" content="width=device-width">
<meta name="robots" content="noindex">
<title>【サイト名】-【軽い説明文】</title>
<link rel="stylesheet" href="【cssのパスを書く】">
<link rel="alternate" media="" href="">
<link rel="canonical" href="http://hoge.com/hoge.html">
<link rel="shortcut icon" href="favicon.ico">
<script src="【jsのパスを書く】"></script>
```
CakePHP3のORMにおけるIN句とNOT句の記述方法

INだけだとググラビリティ低くて情報に行き着くまで時間がかかったのでQiitaにも載せておきます。
今後こういう記事を幾つか書くと思います。

# Where In
_http://book.cakephp.org/3.0/en/orm/query-builder.html#automatically-creating-in-clauses_

```php
use Cake\ORM\TableRegistry;

$users = TableRegistry::get('User')->find()
    ->where(['User.id IN' => [1, 2, 3]])
    ->all();
```

CakePHP2.x系までは条件式のvalueに配列を指定すると自動的にINに切り替わりましたが、
CakePHP3.x系ではbooleanとして解釈され1に変換されます。
idが1のデータが存在するとデータが取れてしまうため案外気付きにくい箇所かもしれません。

# Where Not
_http://book.cakephp.org/3.0/en/orm/query-builder.html#automatic-is-not-null-creation_

```php
use Cake\ORM\TableRegistry;

// IS NOT
$users = TableRegistry::get('User')->find()
    ->where(['User.id IS NOT' => 1])
    ->all();

// !=
$users = TableRegistry::get('User')->find()
    ->where(['User.id !=' => 1])
    ->all();

// INの時
$users = TableRegistry::get('User')->find()
    ->where([
        'NOT' => ['User.id IN' => [1, 2, 3]]
    ])
    ->all();
```

CakePHP2.x系と同じような否定式が使えます。
INの時はNOTをキーにしてその下に条件式を配置してあげれば上手くいきます。
wkhtmltopdfでテキストとhtmlをPDFに変換する

### インストール

* http://wkhtmltopdf.org/downloads.html
* CentOS6にver 0.12.2.1をインストール

```
sudo wget http://download.gna.org/wkhtmltopdf/0.12/0.12.2.1/wkhtmltox-0.12.2.1_linux-centos6-amd64.rpm
# インストールしないと「error: Failed dependencies」
sudo yum install xorg-x11-fonts-75dpi.noarch
sudo rpm -ivh wkhtmltox-0.12.2.1_linux-centos6-amd64.rpm
```


### ローカルのhtmlファイルを変換
```
wkhtmltopdf input.html output.pdf
```

### ローカルのtextファイルを変換
```
wkhtmltopdf input.txt output.pdf
```

### URLを指定して変換
```
wkhtmltopdf http://google.com google.pdf
```

### URLを指定して変換(proxy指定)
```
wkhtmltopdf --proxy http://user:password@proxyhost.com https://www.google.com google.pdf
```

### 文字コードを指定(--encoding)
```
wkhtmltopdf --encoding shift_jis input.txt output.pdf
```

### 用紙サイズ(--page-size)と向き(--orientation)を指定
```
wkhtmltopdf --page-size A3 --orientation landscape input.txt output.pdf
```
### フォントサイズ(--minimum-font-size)を指定
```
wkhtmltopdf --minimum-font-size 30 input.txt output.pdf
```
 * minimumはあるけどmaxは無い模様

### 印刷CSSを使用(--print-media-type)
```
wkhtmltopdf --print-media-type http://google.com google_print.pdf
```

### javascriptを無効(--disable-javascript)
```
wkhtmltopdf --disable-javascript http://google.com google.pdf
```
config.rbについて

config.rbの中身について解説します

```rb:config.rb

http_path = "/"
css_dir = "css"
sass_dir = "_scss"
images_dir = "/"
javascripts_dir = "js"
output_style = :expanded
line_comments = false
relative_assets = true

```

【 http_path 】サイトのパス

【 css_dir 】CSSファイルが書き出される場所

【 sass_dir 】SCSSファイルの場所

【 images_dir 】画像ファイルの場所

【 javascript_dir 】JavaScriptファイルの場所

【 output_style 】SASS の書き出し方の設定
「:expanded」　 　{} で改行する形。よくみる CSS の記述形式。可読性が良い。
「:nested」　　 　ネストっぽくインデントを無理やり入れて表示。 (ただし、実際にはネストされて無くて全て独立。)
「:compact」 　 　セレクタと属性を 1 行にまとめて出力。
「:compressed」　圧縮して出力（全ての改行・コメントを削除）。可読性が悪い。

【 line_comments 】CSS に SCSS での行番号を出力するかどうか。trueかfalse

【 relative_assets 】：trueにすると相対パスにしてくれます


##参考

- http://wp-d.org/2013/01/03/1732/
- http://dev.classmethod.jp/ria/html5/web-desiner-corder-scss-config/
- http://kanapple.net/study/archives/15
CakePHP3.0でプラグイン読み込みの方法がわからなかった


## 背景

ひよっこエンジニアの自分が、PHPのことを何も知らずにCakePHP3でwebアプリ開発を始めてしまい、思ってるよりドキュメントが少なくて苦しい…

ので、自分の学びをシェアします。

参考までに環境は以下。

- Vagrant 1.7.2
- CentOS 6.5
- PHP 5.4.45
- CakePHP 3.0    <- ここ大切

## vendor配下のプラグイン使用

Composerを使ってプラグインを読み込む方法はどこにでも書いてあるのだが、それをController内で使用する方法が見つからない…。

[プラグイン(公式ドキュメント)](http://book.cakephp.org/3.0/ja/plugins.html)を見て試してみてもうまいこといかない。

が、[この記事](http://blog.cnizz.com/2015/02/11/vendors-packagist-and-composer-in-cakephp-3/)のおかげで打開できた…！

その方法が以下。

```javascript:composer.json
autoload: {
    psr-4: {
        "App\\": "src",
        "Facebook\\": "vendor/facebook/php-sdk-v4"    // これを追記
    }
}
```

```php:SomeController.php
use Facebook;

// ...


public function index() {
    $fb = new Facebook\Facebook(['app_id' => /* ... */]);
}
```

まだまだ勉強。

## 参考資料

- [プラグイン | Cookbook 3.x](http://book.cakephp.org/3.0/ja/plugins.html)
- [Vendors, Packagist, and Composer in CakePHP 3 | Chris Nizzardini](http://blog.cnizz.com/2015/02/11/vendors-packagist-and-composer-in-cakephp-3/)
django-modelsのsaveメソッドを上書きする

データベースにinsertする直前になにか処理をしてほしい場合にはModelのsaveメソッドを上書きする

```python
class Event(models.Model):

    class Meta:
        unique_together = ('name', 'held_date')

    id = models.CharField(primary_key=True, max_length=20)
    name = models.CharField(max_length=8)
    held_date = models.DateField()

    def save(self, **kwargs):
        u"""insertする直前に主キーの値をつくる"""
        self.id = "%s@%s" % (str(self.held_date), self.name)
        super(Event, self).save(**kwargs)
```

djangoのsave()を上書きしたとき、マネージャのメソッドでは呼んでくれるのと呼んでくれないのがある

### 呼んでくれる

- `create`
- `get_or_create`
- `update_or_create`

### 呼んでくれない

- `bulk_create`
  - `This does *not* call save() on each of the instances`

意外と呼んでくれる。  
[`signals.pre_save`](https://docs.djangoproject.com/en/1.8/topics/signals/)というのもあるが、やってること同じだし`save`上書きのほうが明示的で良い。
GoogleSpreadSheetにGitHub Issueの一覧を表示させる方法 - 連携の仕方

## GitHub API Issue x Google SpreadSheetの連携

![Google_スプレッドシート.png](https://qiita-image-store.s3.amazonaws.com/0/41657/b8f38935-e9e0-0e76-1f27-afcf1b585832.png)

任意のレポジトリのissue一覧を表示してくれます。
レポジトリ名のシートがあればそこに、なければ追加してくれます。
スプレッドシート側の機能で条件付き書式で閉じたissueを暗くしたりとか、
GitHubのAPIで閉じたやつを表示しない、直近1カ月のだけ表示とか、
いろいろ試してみてください。

GitHub API
https://developer.github.com/v3/

## 入れ方
スプレッドシートをひらく
↓
ツール
↓
スクリプトエディタ
↓
以下のコードを入れる
↓
保存＆実行、権限許可してください

トリガーも設定できます。

## code

※access_tokenはここで発行してください
https://github.com/settings/tokens

```js
function myFunction() {

  var GITHUB_OWNER = 'owner_name'; // レポジトリのオーナー名を入れてください
  var GITHUB_ACCESS_TOKEN = 'access_token'; // 上記で発行したaccess tokenを入れてください
  var REPOSITORIES = ['repository_name'] // 出したいレポジトリ名を入れてください

  // APIからissueのjsonを取得
  var getIssues = function(repository){
    var url = 'https://api.github.com/repos/' + GITHUB_OWNER + '/' + repository + '/issues?state=all&sort=created&direction=asc&access_token=' + GITHUB_ACCESS_TOKEN;
    var response = UrlFetchApp.fetch(url);
  
    var json = response.getContentText();
    return JSON.parse(json);
  }

  // issueのjsonから中身を取得
  var getAttributesOfIssue = function(issue){
    var milestone = "";
    if(issue["milestone"]){
      milestone = issue["milestone"]["title"];
    }
  
    var labels = "";
    if(issue["labels"]){
      labels = issue["labels"].map(function(label){
        return label["name"]
      }).join(",");
    }
  
    var assignee = "";
    if(issue["assignee"]){
      assignee = issue["assignee"]["login"];
    }
  
    var due_on = "";
    if(issue["milestone"] && issue["milestone"]["due_on"]){
      due_on = issue["milestone"]["due_on"].substring(0, 10);
    }
  
    var opend_at = "";
    if(issue["created_at"]){
      opend_at = issue["created_at"].substring(0, 10);
    }
  
    var closed_at = "";
    if(issue["closed_at"]){
      closed_at = issue["closed_at"].substring(0, 10);
    }
  
    var url = '=HYPERLINK("' + issue["html_url"] + '","' + issue["number"] + '")';
  
    return [
      milestone,
      issue["title"],
      assignee,
      issue["state"],
      labels,
      due_on,
      opend_at,
      closed_at,
      url
    ]
  }
  
  var sortByValueOfIndex = function(ary, index){
    return ary.sort(function(a,b){
      if( a[index] < b[index] ) return -1;
      if( a[index] > b[index] ) return 1;
      return 0;
    });
  }

  // スプレッドシートを取得
  var ss = SpreadsheetApp.getActive()

  // 指定したレポジトリでシートに反映していく
  REPOSITORIES.forEach(function(repository){
    var issues = getIssues(repository).map(function(issue){
      return getAttributesOfIssue(issue);
    });

    // due on でソートしています
    issues = sortByValueOfIndex(issues, 5);
    var titles = ["Milestone", "Title", "Assignee", "Status", "Labels", "due_on", "opened_at", "closed_at", "Issue URL"];
    issues.unshift(titles);
    
    var sheet = ss.getSheetByName(repository);
    if(sheet == null) {
      ss.insertSheet(repository);
      sheet = ss.getSheetByName(repository);
    }
    sheet.getRange("A1:I" + (issues.length).toString()).setValues(issues);
  });
}
```


すっごく気が向いたら、適当に済ませている部分とかを直します。
編集リクエストも大歓迎です。
unixtime←→datetime変換を簡単に行うクラスを作ってみた

#unixtimeとdatetime（string型）の変換を行うclassを作ってみた

unixtime←→datetimeの変換は結構手間なので簡単に変換できるクラスを作った。

unixtimeは1970年１月１日午前０時を０秒とし、そこから何秒経過したかを示すのに対しdatetimeは人間の目で見慣れたUTC（世界標準時）で表記されるものである。
例えば2015年9月24日23:00分はunixtimeで表記すると「1441303200」で、datetimeで「201509242300」である。

~~unixtimeをdatetime型への変換はdatetimeモジュールを使えばできるが、datetimeをstring型に変換するのは調べても見つからないので書いてみた。~~
[strftime](http://docs.python.jp/2/library/datetime.html#datetime.date.strftime)を使うとできるそうです。ってことでこのクラスの位置づけは変換を便利にしてみることとしました。

```lang:convertTime.py

import datetime
import time


class convertTime:
	
	def __init__(self,time):
		self.time = time

	def dtime(self):
		date_time =  datetime.datetime.fromtimestamp(self.time)
		date_time = date_time.strftime('%Y%m%d%H%M%S')
		return date_time


	def utime(self):
		self.time = str(self.time)
		assert len(self.time) == 14,"Argument must be 14 character"
		date_time = datetime.datetime(int(self.time[0:4]),int(self.time[4:6]),int(self.time[6:8]),int(self.time[8:10]),int(self.time[10:12]),int(self.time[12:14]))
		return int(time.mktime(date_time.timetuple()))


if __name__ == "__main__":


	d = convertTime(time = 1443103200)
	print "-----------datetime(dtime) to unixtime(utime)----------"
	print d.dtime()

	u =  convertTime(time = 20150924230000)
	print "-----------unixtime(utime) to datetime(dtime)----------"
	print u.utime()



```

```lang:実行結果
-----------datetime(dtime) to unixtime(utime)----------
201509242300
-----------unixtime(utime) to datetime(dtime)----------
1443103200
```

convertTimeクラスに変換したい時間を投げてやり、.utimeメソッドか.dtimeメソッドで変換する。
今後時間があったらdatetimeでの加算減算が簡単にできる機能を追加したいと思う。

※2015.9.25に訂正しました。ご指摘ありがとうございます。

>参考
[python2.7 datetime](http://docs.python.jp/2/library/datetime.html)
コマンドを触り始める(CentOS7)

最近CentOS7で~ctlコマンドを使い始めました。使用方法に手間取ったのでメモする。
man(1),Tabキー,--helpの有用性に気づかされました。
今後も追記予定
#調べたコマンド一覧#
hostdatectl--ホスト名関連
timedatectl--システム時刻関連

#実行環境
OS:CentOS Linux release 7.1.1503 (Core)
HW:VMware Workstation 12 Player

##*hostnamectl*##
ホスト名の確認
`[root@localhost ~]# hostnamectl status
   Static hostname: localhost.localdomain
         Icon name: computer-vm
           Chassis: vm
        Machine ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
           Boot ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    Virtualization: vmware
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-229.11.1.el7.x86_64
      Architecture: x86_64`

ホスト名を変更
`[root@localhost ~]# hostnamectl set-hostname TestServer`

確認手順1
`[root@localhost ~]# hostnamectl status
   Static hostname: testserver
   Pretty hostname: TestServer
         Icon name: computer-vm
           Chassis: vm
        Machine ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
           Boot ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    Virtualization: vmware
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-229.11.1.el7.x86_64
      Architecture: x86_64`
確認手順2
`[root@localhost ~]# cat /etc/hostname
testserver`
リブートすればroot@testserver


・用語
Static hostname--システム管理者が付けた静的なホスト名
Pretty hostname--不明..ご存知の方がいればご教示くださると助かります。
Transient hostname --DHCP又はDNSで割り当てられたホスト名

##*timedatectl*
・現在のシステム時刻の確認
`[root@testserver ~]# timedatectl
      Local time: 木 2015-09-24 21:54:27 JST
  Universal time: 木 2015-09-24 12:54:27 UTC
        RTC time: 木 2015-09-24 12:54:27
        Timezone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a`

・利用可能なタイムゾーンの確認
`[root@testserver ~]# timedatectl list-timezones
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Bamako
Africa/Bangui
Africa/Banjul
・・・・
`

・タイムゾーンの変更
`
[root@testserver ~]# timedatectl set-timezone Africa/Malabo
[root@testserver ~]# timedatectl
      Local time: 木 2015-09-24 13:53:57 WAT
  Universal time: 木 2015-09-24 12:53:57 UTC
        RTC time: 木 2015-09-24 12:53:56
        Timezone: Africa/Malabo (WAT, +0100)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
`

・現在の時刻と日付の設定変更
`
[root@testserver ~]# timedatectl set-time 6:00:00
[root@testserver ~]# timedatectl
      Local time: 木 2015-09-24 06:00:02 JST
  Universal time: 水 2015-09-23 21:00:02 UTC
        RTC time: 水 2015-09-23 21:00:02
        Timezone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a`

##*最後に*##
今後は以下も追記予定
systemctl--サービス関連
nmcli--ネットワーク・デバイス関連
journalctl--ログ関連
google spread sheetでcsvのexport urlを出力する

google spreadsheetを表示している時のURLは以下のようになっている

https://docs.google.com/spreadsheets/d/{sheet_id}/edit#gid={page_id}

csvでexportした時のurlを表示する時には、以下のように``export?format=csv``を追加する

https://docs.google.com/spreadsheets/d/{sheet_id}/export?format=csv&gid={page_id}

シートを限定公開すると、コンソールからcsvを簡単に取り込める

```
CSV.parse(open("https://docs.google.com/spreadsheets/d/{sheet_id}/export?format=csv&gid={page_id}", "r:UTF-8"))
```
Typescript  React 簡易 Redux ( redux, react-redux ライブラリ　使用せず）

Typescript 1.6から React　がサポートされました。　　

reduxが最近注目されているので、この機能を使用したいと思います。

以前は fluxxorを使用して　[React.js, Flux, CofeeScriptで試作したメモ](http://qiita.com/mikeshimura/items/ccc225f2fc64f20fe656)の記事を書きましたが、　　
Dispacherのあたりが冗長に感じていました。

reduxは、特に　reducerがテストし易いので、大変良いと思います。

今回は、下記の様にライブラリを使用せず　機能を開発してみました。

* reduxの Store機能は、ReactのTop Componentのstateをそのまま使用する。
* Dispacherに複数のreducerを登録すると、stateが変わるまで順次処理される。
* Stateの取得、Dispachの容易さを考え、Top ComponentのインスタンスをGlobal変数に設定する。　　
* 具体的には今回の例では、$w.appがTop Component, $w.dispatcher がDispacherなど。

Herokuで実際に動く所が見れます。[http://typeredux.herokuapp.com/](http://typeredux.herokuapp.com/)

それでは　ToDo　アプリを見てみます。
Stateの初期値は下記の通りです。

```js:main.tsx
    state: any =
    {
        todoList:[],
        newItem:{
            description:""
        }
    };
```

例えば、inputの onChange イベントの処理は、name属性に、stateのPathを #　区切りで下記の様に指定します。

```html
  <input type="text" placeholder="input new item" 
     name="newItem#description"
     value={this.state.newItem.description} onChange={$w.onChange} />
```
$w.onChangeは、下記のCodeです。

```js:common.ts
$w.onChange = (e: any) => {
    var action =cmn_set_value(
        e.target.name.split("#"),
         e.target.value)
    $w.dispatcher.dispatch(action)
}
```
action の　cmn_set_valueは、

```js:common.ts
export function cmn_set_value(keys:string[],value:any):any{
    var action = {
        type: CMN_SET_VALUE,
        keys: keys,
        value: value
    }
    return action;
}
```

reducerのSample

```js:common.ts
  export function CMN_Reducer(state: any, action: any) {
    switch (action.type) {
        case CMN_SET_VALUE:
            return Immutable.fromJS(state).updateIn(
                action.keys, (value) => action.value).toJS()
                default:
            return state;
    }
  }
```

dispatcherは

```js:common.ts
export class Dispatcher {
    reducers: any;
    constructor(reducers) {
        this.reducers = reducers;
    }

    dispatch(action: any) {
        var state = $w.app.state;
        for (var no in this.reducers) {
            var newState = this.reducers[no](state, action);
            if (state !== newState) {
                $w.app.setState(newState);
                return;
            }
        }
        return;
    }
}
```

ソースコードは、[https://github.com/mikeshimura/typeredux](https://github.com/mikeshimura/typeredux)で見られます。
node.js fs.watchの動き

動きが多少変わっていました

```
fs.watchの動き(windows 10, node 5.1.1)
  dir/ 監視(event, name)
  ↓
    /tmp.txt 作成
      event = rename, name = tmp.txt
      event = change, name = tmp.txt #発火しなくなった
    ↓
    /tmp.txt 編集
      event = change, name = tmp.txt
      event = change, name = tmp.txt
    ↓
    /tmp.txt 名前変更 -> tmp2.txt
    event = rename, name = null
    event = rename, name = tmp2.txt
    event = change, name = tmp2.txt #発火しなくなった
    ↓
    /dir2/ 作成
      event = rename, name = dir2
    ↓
    /dir2/ -> /dir3/
      event = rename, name = null
      event = rename, name = dir3
    ↓
    /dir2/test3.txt 作成
      event = change, name = dir2
    ↓
    /dir2/test3.txt 編集
      #イベント発火せず
    ↓
    /dir2/test3.txt -> test4.txt
      event = change, name = dir2
      #dir名変更も同様
    ↓
    /dir2/dir3/*
      #何をしてもイベント発火せず
```

```
  fs.watchの動き (windows 7で確認です・・)
    dir/ 監視(event, name)
    ↓
      /tmp.txt 作成
        event = rename, name = tmp.txt
        event = change, name = tmp.txt
      ↓
      /tmp.txt 編集
        event = change, name = tmp.txt
        event = change, name = tmp.txt
      ↓
      /tmp.txt 名前変更 -> tmp2.txt
        event = rename, name = null
        event = rename, name = tmp2.txt
        event = change, name = tmp2.txt
      ↓
      /dir2/ 作成
        event = rename, name = dir2
      ↓
      /dir2/ -> /dir3/
        event = rename, name = null
        event = rename, name = dir3
      ↓
      /dir2/test3.txt 作成
        event = change, name = dir2
      ↓
      /dir2/test3.txt 編集
        #イベント発火せず
      ↓
      /dir2/test3.txt -> test4.txt
        event = change, name = dir2
        #dir名変更も同様
      ↓
      /dir2/dir3/*
        #何をしてもイベント発火せず
```
Brackets上からgulp実行


### やりたいこと

エディタとしてBracketsを利用することを前提として...

- Brackets上でgulpのタスク (gulpfile.js) を修正。
- Brackets上から実行させたい。

※ Bracketsとは、Adobeが提供しているWebデザインに特化したテキストエディタです。（関連: [Bracketsメモ](http://qiita.com/akiko-pusu/items/ec408415123792bfbc8c))

### 追加するパッケージ

- Brackets-Gulp
 - https://github.com/dalcib/brackets-gulp

Bracketsの拡張機能マネージャーから追加できますが、これだけではダメでした。以下も合わせてインストールしています。

- Brackets Shell
 - https://github.com/johnhidey/hdy.brackets-shell/
- Node.js bindings
 - https://github.com/Acconut/brackets-nodejs

### 実際の画面

パッケージ追加後、開いているプロジェクトのフォルダに、gulpfile.jsがあればGulpのタスクがメニューバーに表示されます。

- メニューバー -> Gulp -> タスクを選択して実行。
- 下記のように実行結果が表示される。

![brackets-gulp.jpg](https://qiita-image-store.s3.amazonaws.com/0/27976/8789420a-2602-10b5-ee6b-c89d4421e4bb.jpeg "brackets-gulp.jpg")

### うまくGulpのタスクが認識されない場合

- BracketsからGulpのパスが見えていない場合、メニューにタスクが表示されません。
- プラグインが不足しているとメニューにタスクが表示されません。
Hue をリモコンから操作する


学習リモコンが大好きで、リモコンを一つにまとめられることはもちろんのこと、夜暗いとき等ささっと操作したい時なんかに物理ボタンを押したときの安心感がとても良い。スマフォのロックを外してアプリ立ち上げて画面タッチ…は面倒。

というわけでオーディオもiTunesもテレビも照明も扇風機もエアコンも学習リモコンで操作してるので、hue も学習リモコンで操作したい。

## Arduino + IR レシーバ

まず家のリビングにある、常時立ち上げてある Mac mini の IR レシーバを使おうと思ったけど、割と面倒くさそうだったのでささっと Arduino + IR レシーバ で IR のメッセージを受け取ることにした。

Arduino は [ebay の安いほぼ nano V3.0 互換品](http://www.ebay.com/sch/i.html?_nkw=arduino+nano) を使った(一個2.25$ -> 270円!!)。IR レシーバもなんかその辺にころがってたやつ。一個50~100円ぐらいで買えるので、合計 400 円しない。一番困ったのは nano の USB 接続が mini-B なのでケーブルを探すことだった…。

![20150924-DSC04477.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/f8add2dd-5d8c-5427-5c63-db4a535681a0.jpeg "20150924-DSC04477.jpg")


Arduino での IR 周りは [Arduino-IRremote](https://github.com/z3t0/Arduino-IRremote) が良くできてるのでこいつでメッセージを受け取って、Serialport にメッセージを流すだけのシンプルなスケッチを書いた。

- https://github.com/hotchpotch/hue_ir_receiver/blob/master/arduino/src/IRrecvSerial.ino

IR のメッセージを受け取ったらシリアルポートに

```
IR,A95C6BFB
IR,B368778E
```

みたいなメッセージが出力されるので、これをシリアル通信で使えばおｋ。

## 学習リモコンの IR データ

今、学習リモコンは Sony の PLZ530D を使っている。PLZ530D はカテゴリー(カメラとか照明とか)に既存のメーカーのリモコンをささっとマッピングする事ができる。自分で IR を出力して学習リモコンに記録させた方がシンプルなメッセージでかつ被らなくて良いんだけど、面倒くさいので既存のメーカーリモコンをマッピングする。今回は 0607 (シャープのBDレコーダ)を照明カテゴリーにマッピングした。

Arduino 経由で IR のデータの受け取りには USB シリアル経由で行う。今回は [serialport gem](https://github.com/hparra/ruby-serialport) 使った。あとは学習リモコンで押されたボタンのIRデータをマッピングしていって適当にメソッドを呼ぶようにした。

- https://github.com/hotchpotch/hue_ir_receiver/blob/master/ruby/ir_recv.rb

↑の例だと1,4ch で色相弄って、2,5ch で明るさを、3,6 ch で彩度を、他のボタンでランダム点灯だったり赤青緑点灯だったり。もっとちゃんと実装すれば現在の hue の色を学習してボタンにマッピングとかも作れる。

なお別に学習リモコンである必要は無く、余ってるリモコンでも問題なく使える。

## hue の API

今回 hue の API いろいろ叩いて雑に扱ってるんだけど、今のところ hue 電球もブリッジも全くおかしくならなくてすごいなー感。

## IR 便利、互換品 nano 安くて便利

部屋で操作するとき、リモコンの出力が強ければ壁反射して結構届くし、IR 送信機もレシーバも安いし、IR 便利だなぁと改めて思った。

あと(ほぼ)互換品 nano 安すぎる(国内だと ATmega328 チップ単体で買った方が高いぐらい…)ので、[USBシリアルがCH340G](http://qiita.com/hnw/items/f5272421292eb5420546)でも問題ないという人は、10個ぐらい買っておいても損は無い気がする。