OmniAICreator/Qiita-1.07M huggingface dataset:
PythonでHadoopを実行するラッパー

# Hadoopの機械学習をPythonでやりたい

Java以外でもHadoopのJobを書くことが出来るので、
機械学習に強いPythonをHadoopで実装できるようなSkipJackというラッパーを[Pythonもくもく会](http://mokupy.connpass.com/)と正月で作りました。

GitHubは以下においています。(pipは無し)
[GitHub-SkipJack](https://github.com/mrasu/SkipJack)

以下、詳細

1. HadoopStreaming
2. Scikit-learn
3. SkipJack

# HadoopStreaming

Hadoopでは、

- スレーブ部分でJavaを実行する([Haoop MR Tutorial](http://hadoop.apache.org/docs/r1.2.1/mapred_tutorial.html))
- スレーブ部分で標準入出力を介してファイルを実行する([Hadoop Streaming Tutorial](http://hadoop.apache.org/docs/r1.2.1/streaming.html))

という２つの実行方法があり、
標準入出力を扱える全ての言語でHadoopが使えます。(Hadoop Streaming)

なので、Hadoopで機械学習をするという理由だけでMahoutを使用する必要はなく、
機械学習に強いPythonを使って好きなライブラリで実装することができます。

Hadoopを用意する一通りの流れは[Hadoop導入とPythonによるMapReduce](http://qiita.com/pika_shi/items/7fc686a55a3ac6399b04)が参考になります。

# [Scikit-learn](http://scikit-learn.org/stable/)

Pythonで実装された一番メジャーな機械学習ライブラリです。
これを使用するためにはNumpy, Scipyもインストールする必要がありますが、pipだけでは簡単にインストールすることが出来ないので、
一通りのライブラリが元から入っている[Anaconda](https://store.continuum.io/cshop/anaconda/)の3系をダウンロードして、全スレーブに設置しました。

# SkipJack

Hadoop Streaming ではhadoopの実行コマンドは手で打つ必要があり、面倒だったので
pythonを実行することで、

**実行するJobを決定→Hadoop実行→結果評価→次に実行するJobを決定→以下、停止までループ**

が出来るようなラッパーを作成しました。
mapperとreducer、結果評価の方法を実装すれば、定型作業を書く必要はありません。

中身は、
Hadoopコマンド(実行(run)、ファイル配置(put)、結果読み出し(cat))を実行しているだけの簡単なものです。

サンプルには、

- WordCount+アルファ
- グリッドサーチを使用した絞り込み

の２つを用意しています。
Rails4:自力でControllerからAPIを叩くシンプルな実装


##やりたい事
HTMLのform（form_for）から特定のmodelデータ（ここではUser）を受信して追加（create）する時に、業務管理のAPでプロセスをキックさせたい。
そこで業務管理のAPで提供しているAPIに、データsave後任意のパラメータを設定したHTTPリクエスト（GET）を送る実装をしてみた。
ControllerからAPI叩く時には似たような流れで応用出来ると思います。
※なお、今回はレスポンスのチェックなどは行いません。

##Modelの実装
Modelに紐づく値をGETメソッドのパラメータとして渡したい（特定のURLでのHTTPリクエストを行いたい）ので、ModelでURLの組み立てを行う。
データ名は各種API仕様書を参考のこと。

```ruby:app/models/user.rb
class User < ActiveRecord::Base
  BASE_API_URL = "https://example.com".freeze

  # ...

  # API実行用のURLを返却
  def api_url
    h = {
      "data[0]" =>      name,
      "data[1]" =>      tel,
      "data[2]" =>      email.downcase
    }
    BASE_API_URL + "?" + h.map{|k,v| URI.encode(k.to_s) + "=" + URI.encode(v.to_s)}.join("&")
  end
end
```


* ハッシュでパラメータ名と該当のする値を作成
* 各データをURLエンコードした文字列を、ハッシュのmap等で連結（&がセパレータ）

URL例：
https://example.com?data[0]=nameの値&data[1]=telの値&data[2]=emailの値

##Controllerの実装

ModelでURLを返却するメソッドを実装したので、
Controllerでそれを呼んで、Net::HTTPでgetリクエストを飛ばします。
（require 'net/http'の記述が必要）

```ruby:app/controllers/users_controller.rb
class UsersController < ApplicationController
  require 'net/http'

  # ...

  def create
    @user = User.new(user_params)
    if @user.save

      # ...

      # 新規データ作成成功時にNet::HTTPでリクエストしてAPI叩く
      Net::HTTP.get_response(URI.parse(@user.api_url))
      redirect_to action: :thanks
  	else
  	  render action: :new
    end
  end

  # ...

end
```

ブラウザ側から（Ajax等で）アクセスしなくてよいAPIなら、この流れが分かりやすいかなと思います。
ActiveRecord findメソッドにidを配列で渡した結果はRelationではない


Rails4でfindにidの配列を渡すと、

```rb
profiles = Profile.find [1,2,3,4,5]
  # =>  SELECT "profiles".* FROM "profiles"  WHERE "profiles"."id" IN (1, 2, 3, 4, 5)
profiles.class
  # => Array
```

となり、結果はただの配列でActiveRecordの恩恵を受けられません。
素直にwhereで取得したほうがいいです。SQLも同じなので特に問題なさそうです。

```rb
profiles = Profile.where id: [1,2,3,4,5]
  # =>  SELECT "profiles".* FROM "profiles"  WHERE "profiles"."id" IN (1, 2, 3, 4, 5)
profiles.class
  # => Profile::ActiveRecord_Relation
```

# Environment

```
pry(main)> Rails.version
=> "4.1.6"
```
cocos2d-x fbx-convをVisualStuido2013+FBX SDK 2015.1でビルドする

cocos2d-x v3.1以降は3Dモデルを表示できます。
3Dモデルのフォーマットはc3b,c3tという独自フォーマット。c3bがバイナリ、c3tがテキスト。
c3bはfbxからコンバートして生成する。コンバートにはcocos2d-x付属のfbx-convを使用する。

fbx-convをちょっと改変したいなーと思ったので、その辺の導入メモ。
基本的にSDK導入してビルドするだけ。ただしプロジェクト生成にpremakeが必要。
[2015.01.13] fbx-convの情報が古かったのを修正しました。

##fbx-sdkをインストール
http://usa.autodesk.com/adsk/servlet/pc/item?siteID=123112&id=10775847
fbx-sdkのルートパスを環境変数に設定。
FBX_SDK_ROOT=C:\Program Files\Autodesk\FBX\FBX SDK\2015.1
など。

##fbx-convのソースを入手
https://github.com/cocos2d-x/fbx-conv

##premakeをインストール
http://industriousone.com/premake/download

##Visual Studio 2010用プロジェクトを生成
generate_vs2010.batを実行。これでfbx-convのVisual Studio 2010用プロジェクトが生成される。
[2015.01.13] 最新版では2012用プロジェクトも生成されました。2012をベースにしてもOK。

##2010 -> 2013に変換
build\vs2010\fbx-conv.slnがあるので、Visual Studio2013で開く。2010 -> 2013に変換される。
libのパスが間違っているのを修正。debug版の場合、
$(FBX_SDK_ROOT)\lib\vs2010\x86;
$(FBX_SDK_ROOT)\lib\vs2010\x86\debug;
を
$(FBX_SDK_ROOT)\lib\vs2013\x86;
$(FBX_SDK_ROOT)\lib\vs2013\x86\debug;
にすればOK。

上記でfbx-conv.exeがビルドされるはず。
ごく最低限のscreenコマンドまとめ

#screenコマンドがない場合
$ sudo yum install screen

#よく使うscreenコマンド
screen : 起動
screen -ls : 起動中のプロセスを表示
screen -r プロセス名: 指定プロセスへ復帰

プロセス名は screen -lsで確認できる。
ex:
>There is a screen on:
>**18598.pts-0.ip-xx-x-x-xx**     (Detached)
>1 Socket in /var/run/screen/hoge.

#screen内で使うコマンド
ctrl+a d : screenからdetachする
ctrl+a w : ウィンドウ一覧を表示
ctrl+a k : 現在のプロセスをkill
ctrl+a c : 新しいウインドウを作成する
ctrl+a n : 前方のウインドウに移動
ctrl+a p : 後方のウインドウに移動


なお**ctrl+a k**はcontrolキーとaを同時押しして離してからkを押すことを表す。
controlキーとaを離す前に押しても動くコマンドもある模様。注意。
さくらレンタルサーバーにWordPressをクイックインストールするポイント

さくらレンタルサーバー（スタンダードプラン）でWordPressをクイックインストールしました。いくつか気づいたポイントがあったのでその点を記事にしました。

# 事前準備
さくらレンタルサーバーの契約と、ドメインの設定を済ましてあります。私の設定では、Value-Domain使用していますので、[Value-Domainからさくらレンタルサーバーにドメインを設定する](http://qiita.com/pugiemonn/items/a9e453b3b0542ddf1476)のように設定してあります。


## さくらインターネットサーバコントロールパネルへログイン
まずは[さくらインターネットサーバコントロールパネル](https://secure.sakura.ad.jp/rscontrol/)からログインします。

# WordPressをクイックインストールする
運用に便利なツール >> [クイックインストール](https://secure.sakura.ad.jp/rscontrol/rs/cgilib) >> [ブログ](https://secure.sakura.ad.jp/rscontrol/rs/cgilib?category=sakura-blog) >> [WordPress](https://secure.sakura.ad.jp/rscontrol/rs/install?package=wordpress) を選択します。

ここでMySQLは[データベースの設定](https://secure.sakura.ad.jp/rscontrol/rs/db)からすでに設定済みとします。

## 確認にチェックを入れる
**ライセンス、インストール規約、注意事項の内容に同意する**へチェックを忘れやすいです。

チェックを入れないと以下のメッセージがでます。

```
内容に同意する必要があります
```
## インストール先
さくらレンタルサーバーに割り当てている、ドメインが一覧で表示されます。

ココでディレクトリを設定するとディレクトリが自動的に生成され、そこにWordPressのファイルがインストールされます。

自動生成がわかりにくい場合は、各ドメインがどこに割り当てられているかを[ドメイン](https://secure.sakura.ad.jp/rscontrol/rs/domain)から確認するといいかもしれません。

## テーブルの接頭語を入力
**テーブルの接頭語を入力してください**という項目がありますので、よりテーブル名をわかりやすくするために、これから作成するWordPressの名前やドメイン名を接頭語に入力しておくと良いと思いました。

例えば、example.comというドメインでWordPressを開始しようとするなら、最初から設定されているランダムな文字列、**wpaf52fb**のような文字とドメインをくっつけて、**example_com_wpaf52fb**のようにします。

**example_com_wpaf52fb**にしたのは、テーブル名に**.**が使用できないので、**_**にしています。

## 最後にインストール
インストールボタンを押すとインストールが始まります。

# 完了
さくらレンタルサーバーの動きがめっちゃ遅いですけど諦めましょう＼(^o^)／
RecyclerViewでスクロールが一番下まで行ったらロードする実装

スクロールが一番下まで行ったら次のデータをロードするというよくある動作を実装してみました。`OnScrollListener`を拡張して実現していますが、ListViewの時とは少し勝手が違ったのでメモしておきます。

`EndlessScrollListener`というListenerを作ります。


```EndlessScrollListener.java
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

public abstract class EndlessScrollListener extends RecyclerView.OnScrollListener {

    int firstVisibleItem, visibleItemCount, totalItemCount;
    private int previousTotal = 0;
    private boolean loading = true;
    private int current_page = 1;

    private LinearLayoutManager mLinearLayoutManager;

    public EndlessScrollListener(LinearLayoutManager linearLayoutManager) {
        this.mLinearLayoutManager = linearLayoutManager;
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        visibleItemCount = recyclerView.getChildCount();
        totalItemCount = mLinearLayoutManager.getItemCount();
        firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();

        if (loading) {
            if (totalItemCount > previousTotal) {
                loading = false;
                previousTotal = totalItemCount;
            }
        }

        if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
            current_page++;

            onLoadMore(current_page);

            loading = true;
        }
    }

    public abstract void onLoadMore(int current_page);
}
```

これを、RecyclerViewにセットしてあげるだけです。

```java
mRecyclerView.addOnScrollListener(new EndlessScrollListener((LinearLayoutManager) mRecyclerView.getLayoutManager()) {
    @Override
    public void onLoadMore(int page) {
        // Load
    }
});
```

以上！
__get()、__set()メソッドをできるまで（想像）



```php 
class Hoge
{
   public $a;
}

$hoge = new Hoge;
$a = $hoge->a;
```

（この方法だとカプセル化の観点から問題だな）
（プロパティをprivateにしてゲッタ、セッタをつけよう）

```php
class Hoge
{
   private $a;

   public function setA($a)
   {
      $this->a = $a;
   }

   public function getA()
   {
      return $this->a;
   }
}

$hoge = new Hoge;
$a = $hoge->getA();
```

（全部のメソッドに対してゲッタ、セッタ書くのめんどくさいな）
（プロパティを一個にしてしまおう）
（ついでにいちいちsetHoge()、getHoge()とかかなくてもいいようにプロパティに直接アクセスしようとしたら必ずよばれる\__set()、\__get()メソッドというものをつくろう）

```php
class Hoge
{
   private static $property = ['a']; 
   private $a;

   function __set($name, $value)
   { 
      if(in_array($name, static::$property)){
         $this->a = $value;
      }
   }

   function __get($name)
   {
      if(in_array($name, static::$property)){
         return $this->a;
      }
   }
}

$hoge = new Hoge;
$a = $hoge->$a;
```

（うん、だいぶ良くなった。）
（このクラスよく使うから再利用可能なようにtrait化しておこう）

```php
// file1
trait Hoge
{
   function __set($name, $value)
   { 
      if(in_array($name, static::$property)){
         $this->a = $value;
      }
   }

   function __get($name)
   {
      if(in_array($name, static::$property)){
         return $this->a;
      }
   }
}

$hoge = new Hoge;
$a = $hoge->$a;

// file2
use Hoge;
protected static $property = ['a'];
protected $a;

```

・・こんなかんじかな？

参考:http://masutaka.net/chalow/2012-05-13-1.html
BlenderでPythonをはじめる


・Blenderを起動して「Scripting」レイアウトにする.
　そうすると、左上にテキストエディタ、pythonの対話モードが下部にあるレイアウトになります。

・スクリプトの記述
　対話モードで書いても実行してもいいのですが、今回はエディタでやります.
左上のテキストエディタで新規(日本語にしていない場合はNew)を押してつくります.

```py3
import bpy
```

と書きます.

・スクリプトの実行
　テキストエディタ内でAlt-P （[Alt] キーを押しながら P）で実行します.
実行結果が上部のウィンドウ内にでます.

-----
とここまでがとりあえずの実行方法です.
Blenderでは得意のPythonが使えるので今後いろいろやりたいと思います.
Bitcoin ブロックチェーンのブロックの同期状態を調べる方法

以下に移行しました<br><a href="http://block-chain.jp/tech/bitcoin-blockchain-sync/" title="Bitcoin ブロックチェーンのブロックの同期状態を調べる方法">Bitcoin ブロックチェーンのブロックの同期状態を調べる方法</a>
UILabelで金額(例：¥1,003)を表示したい


危うくStringの足し算するところでした。。
Swiftになる前から`NSNumberFormatter`という便利なクラスがあったんですねー。

下記のようにすればOK

```swift:金額をイイカンジに表示するヤツ.swift
var formatter = NSNumberFormatter()
formatter.numberStyle = .CurrencyStyle

let price = 1003

priceLabel.text = formatter.stringFromNumber(price)
// きっと¥1,003と表示されます。私はされました。
```

NSNumberFormatterインスタンスで3桁毎に`,`を追加する方法でも良いです。
`.CurrencyStyle`だと`¥`を金額のアタマに付けてくれて助かるし、私はこちらで。
データフレーム ⇔ リスト の変換

データフレームは「各**列**を要素とするリスト」として振る舞いますが「各**行**を要素とするリスト」として扱いたい場合もあります．そこで，データフレームを「各行を要素とするリスト」に変換します．また，変換したリストをデータフレームに戻します．

ここでは `iris` データセットを例に説明するので，先に読み込んでおきます．

```r
data(iris)
```

```
> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
```
# データフレーム ⇒ リスト

データフレームの各行を要素とするリストに変換します．

```r
Zip <- function(...) Map(list, ...)
iris.list <- do.call(Zip, iris)
```

それぞれの行は異なる型の値から構成されているので，行自身もリストで表現しています．そのため，`iris.list` にはリストのリストが代入されます．

```
> iris.list[[1]]
$Sepal.Length
[1] 5.1

$Sepal.Width
[1] 3.5

$Petal.Length
[1] 1.4

$Petal.Width
[1] 0.2

$Species
[1] setosa
Levels: setosa versicolor virginica
```

この方法でリスト化すると，列名は保存されますが，行名は失われます．
# リスト ⇒ データフレーム

リストに変換したデータフレームを，元に戻します．

```r
Unzip <- function(...) rbind(data.frame(), ...)
iris.frame <- do.call(Unzip, iris.list)
```

単純に `do.call(rbind, iris.list)` とすると，データフレームではなく，行列（リストに `dim` 属性を与えて行列にしたもの）になります．今回はデータフレームとして扱いたいので，空のデータフレームに `rbind` しています．

この方法でデータフレーム化すると行名が自動的に割り振られてしまうので，必要ない場合は `rawnames(iris.frame) <- NULL` で削除してください．

# 動機

関数型プログラミング？を少し勉強したので「R でも高階関数を使ってそれっぽくコーディングするぜ！」と思ったのですが，サンプル（データフレームの各行）をフィルタリングする処理を書こうとするとデータフレームのままではやりづらかったのでリストに変換しました．

```r
data(iris)

Zip <- function(...) Map(list, ...)
iris.list <- do.call(Zip, iris)

f <- function(sample) sample[["Sepal.Length"]] > 6
iris.list.sub <- Filter(f, iris.list)

Unzip <- function(...) rbind(data.frame(), ...)
iris.sub <- do.call(Unzip, iris.list.sub)
```

が，無理せずデータフレームの機能を使うほうが簡単ですね．

```r
iris.sub <- iris[which(iris[["Sepal.Length"]] > 6), ]
```

今まで通り書くか（´・ω・｀）
CentOSにdockerをインストールして、ssh接続できるようにするまで

docker構築時の手順メモ。

■2015/02/17修正
docker run時の実行コマンドに/sbin/initを指定していたが、
sshdのゾンビプロセスが大量に残り、実行可能プロセス数を超えてコマンド実行が出来なくなる事象が発生。
そのため、monitを用いてsshdを起動するように修正。

# やりたいこと
・CentOSにdockerをインストール
・外部からSSH接続できるようなコンテナを作成する

# 手順

## dockerのインストール
インストール先のサーバはCentOS6.3、dockerはCentOS6.5以上がサポートだったので、アップデートしてインストール。

```
# yum update
# yum install docker-io
# service docker status
# service docker start
```

### docker imageの取得

1.docker pull {イメージ名}:{タグ名} でイメージを取得。
デフォルトだと、[Docker Hub Registry](https://registry.hub.docker.com/)から取得される。
2.取得したイメージの一覧を確認

```
# docker pull centos:centos6
# docker images
```

### コンテナの起動

```
# docker run -t -i -d --name hoge centos:centos6 /bin/bash
```

docker runコマンド引数説明

```
 -t ・・・ttyを確保。/bin/bashなどでコンテナを操作する際に指定。
 -i ・・・コンテナの標準入力を開く。/bin/bashなどでコンテナーを操作する際に指定
 -d ・・・バックグラウンドで実行。WebやAPサーバなど常時実行するコンテナーで指定
 --name・・・｛コンテナ名｝
 ｛イメージ名｝:｛タグ名｝
 コンテナで実行するコマンド
```

### コンテナへの接続

1.コンテナ一覧からコンテナIDを確認
2.コンテナに接続

```
# docker ps
# docker attach [コンテナID]
```

## sshdのインストール

1.コンテナ内にsshをインストール
2.sshd_configをバックアップし、PAMの設定
3.sshdのサービス起動

``` 
# yum install openssh
# yum install openssh-server
# 
# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.orig
# 
# sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
# sed -ri 's/#UsePAM no/UsePAM no/g' /etc/ssh/sshd_config
# 
# /etc/init.d/sshd start
```

# monitのインストール

1.monitをインストールする。
2.インストール確認
3.sshdの監視設定を追加
4.monitサービス再起動

```
# yum install monit
# 
# service monit --version
service ver. 0.91
# 
# vi /etc/monit.d/sshd
check process sshd
    with pidfile "/var/run/sshd.pid"
    start program "/etc/init.d/sshd start"
    stop program "/etc/init.d/sshd stop"
    if failed port 22 protocol ssh then restart
    if 5 restart within 5 cycles then alert
# 
# /etc/init.d/monit restart
Shutting down monit:
Starting monit:
# 
# exit
```


## コンテナイメージのコミット

1.コンテナ一覧からコンテナIDを取得
2.コミット(今回はcentos6_sshという名前)
3.docker imageの作成確認
4.作成したコンテナを停止
5.作成したコンテナを削除

```
# docker ps -a
# docker commit コンテナID centos6_ssh
# docker images
# docker stop コンテナID
# docker rm コンテナID
```

# コンテナの起動

サーバの50022ポートをコンテナの22ポートに対応させてコンテナ立ち上げる。

```
# docker run -t -i -d -p 50022:22 --name centos6_ssh centos6_ssh /bin/bash
# ssh root@localhost -p 50022
```

※monitを入れる前
以下のように実行コマンドに/sbin/initをしていた。
sshdのゾンビプロセスが大量に残る事象が出ていたので、monit経由してsshdを起動するように修正した。

原因はこれかも？
http://blog.phusion.nl/2015/01/20/docker-and-the-pid-1-zombie-reaping-problem/

```
# docker run -t -i -d -p 50022:22 --name centos6_ssh centos6_ssh /sbin/init
# ssh root@localhost -p 50022
```
[作業中] 静的サイトジェネレーターHugoでgithubページ

#なぜ、Hugo
- [静的サイトジェネレーターを集めたサイト](https://staticsitegenerators.net) で割合人気があった(スターが多かった)
- 本家のサイトは今風(色使いとかさておき)。
http://gohugo.io/
- [サイト構築例](http://gohugo.io/showcase/)
# gohugoサイトの文書もしっかりしている
- [使いこなせればよさ気との先達のブログ](http://keens.github.io/blog/2014/12/30/migration-from-octopress-to-hugo/)

# Installing Hugo

[Hugo github](https://github.com/spf13/hugo)のInstalling Hugo (binary)からインストールするのが一番早そう。
Goらしくバイナリひとつなので指示通り、ダウンロード後解凍したバイナリを/usr/local/binに移動。
今日時点では:
> sudo mv hugo_0.12_linux_386 /usr/local/bin
> alias hugo=hugo_0.12_linux_38
> hugo help

# Hugo Themes
http://themes.gohugo.io (coming soon)とのことなので、

- とりあえず一括でテーマをインストール。
> git clone --recursive https://github.com/spf13/hugoThemes.git themes

- テーマlanyonのフォルダ構成例

$ tree lanyon

```
lanyon
	├── CONTRIBUTING.md
	├── LICENSE.md
	├── README.md
	├── config.json
	├── content
	│   ├── fixed
	│   │   ├── 404.md
	│   │   ├── about.md
	│   │   └── altab.md
	│   └── post
	│       ├── 2013-12-31-whats-jekyll.md
	│       ├── 2014-01-01-example-content.md
	│       └── 2014-01-02-introducing-lanyon.md
	├── layouts
	│   ├── fixed
	│   │   └── single.html
	│   ├── index.html
	│   ├── indexes
	│   │   └── post.html
	│   ├── partials
	│   │   ├── default_foot.html
	│   │   ├── default_head.html
	│   │   ├── head.html
	│   │   └── sidebar.html
	│   ├── post
	│   │   ├── li.html
	│   │   └── single.html
	│   └── rss.xml
	└── static
	    ├── assets
	    │   ├── apple-touch-icon-144-precomposed.png
	    │   └── favicon.ico
	    └── css
		├── lanyon.css
		├── poole.css
		└── syntax.css
```

# テーマの選び方。
- IEしばりとかないなら、[html5テーマ](https://github.com/simonmika/hugo-theme-html5)から出発でいいか。  

```
$ cat ./html5/layouts/single.html 
<!DOCTYPE html>
<html>
	{{ template "theme/parts/head.html" . }}
	<body>
		{{ template "theme/parts/header.html" . }}
		{{ template "theme/parts/nav.html" . }}
		<main>
			<header>
				<h1>{{ .Title }}</h1>
			</header>
			{{ .TableOfContents }}
			<article>
				{{ .Content }}
			</article>
			<footer>
				<p><span id="footer-copyright">{{ .Params.copyright }}</span><span id="footer-license">{{ .Params.license }}</span></p>
			</footer>
		</main>
		{{ template "theme/parts/footer.html" . }}
	</body>
</html>
```

- あとは、まずは、全体構成を決めてるっぽい、partial　のHTMLを眺めて考える、とか。

```
 $ find . -name partials
./hugo-uno/layouts/partials
./tinyce/layouts/partials
./stou-dk-theme/layouts/partials
./redlounge/layouts/partials
./persona/layouts/partials
./journal/layouts/partials
./herring-cove/layouts/partials
./lanyon/layouts/partials
./hugo-incorporated/layouts/partials
./liquorice/layouts/partials
./hyde/layouts/partials
./hyde-x/layouts/partials
./purehugo/layouts/partials
./hugoscroll/layouts/partials
```
# この先は・・
[冷静な意見付きの作業記録](http://syui.github.io/blog/2015/01/08/hugo-github-pages/)をちら見しながら・・・

****************

- My alternative : 
[nanocで作成したサイトをGitHub Pagesで公開する](http://jnanoc.org/tips/applied_tips/use_github_pages/)
新TABLEを作成してから、旧テーブルを削除する手順

Windows8.1の仮想環境を手に入れたので、Oracle Database Express Edition 11gを入れて遊んでいます。

今回は、アプリリリース時によくある、
元テーブルは一時的にバックアップを取っておき、新テーブルはCREATE TABLEで作成する際の手順。

***

①変更するテーブルの、PK名・外部キー名（自分が親テーブル、子テーブルどちらも）・INDEX名を漏れ無く調べる。

②テーブル名の変更
`ALTER TABLE TABLE_NAME RENAME TO TABLE_NAME_BK;`

③PK名の変更
`ALTER TABLE TABLE_NAME_BK RENAME CONSTRAINT PKXXX TO PKXXX_BK;`

④外部キー名の変更
（自分が子テーブルとして他テーブルを参照している外部キー）
`ALTER TABLE TABLE_NAME_BK RENAME CONSTRAINT FKXXX TO FKXXX_BK;`

⑤外部キーの削除
（自分が親テーブルとして他テーブルから参照されている外部キー）
'ALTER TABLE REF_TABLE_NAME DROP CONSTRAINT FKXXX;'

⑤INDEX名の変更
（名前付きPKを作成していた場合は、自動で名前付きINDEXが作成されているため、それも変更する）
`ALTER INDEX IDXXXX RENAME TO IDXXXX_BK;`

⑥新定義テーブルの作成
`CREATE TABLE TABLE_NAME(
　~
　CONSTRAINT PKXXX PRIMARY KEY(COLUMN)
);`

⑦外部キーの作成
（自分が親テーブルと子テーブルのどちらも作成）
`ALTER TABLE TABLE_NAME ADD CONSTRAINT FKXXX
FOREIGN KEY (COLUMN) REFERENCES REF_TABLE_NAME(COLUMN);`

⑧INDEXの作成
`CREATE INDEX IDXXXX ON TABLE_NAME (COLUMN);`

⑨旧テーブルから新テーブルへのデータ移行
（テーブル定義変更内容に合わせてデータを加工する）
`INSERT INTO TABLE_NAME SELECT COLUMN FROM TABLE_NAME_BK;`
`COMMIT;`

⑩旧テーブルの削除
（CASCADE CONSTRAINTを付けると、旧テーブルが外部キーで参照されている場合、該当する外部キーが削除されるため注意）
`DROP TABLE TABLE_NAME_BK;`

***

全体を通して、手順①の調査の正確性が重要となります。
手順①での抜け漏れを防ぐためにも、テーブル定義書やDB構築スクリプトのメンテナンスはしっかりと行いたいですね。
Node.js上で存在するかわからない外部コマンド(peco)を実行する


インターネッツの海を泳ぎまくっても解決しなかったので自分なりの対応を考えここにまとめておく。
もし、何かアホな事を書いていて、もっと簡単にできるねんで！とかあったら教えていただけると大変ありがたいです。

## モチベーション

[dtsm](http://qiita.com/vvakame/items/38b953ab0f4de63cce8b)を使う時に、何で検索するべきかわからない時が結構ある。
例えば、`dtsm install angular`とかやると、`angular could not be identified. found: 38`とか言われてしまいます※1。
こうなると、`dtsm search angular`などとして候補一覧を確認し、`dtsm install angularjs/angular.d.ts`とする必要があります。
だるいですね。
そこで、[peco](https://github.com/peco/peco)を使ってインクリメンタルにファイルの指定を行えるようにしたいな！となるわけです。

![インクリメンタルに検索の様子](https://cloud.githubusercontent.com/assets/125332/5699331/88f612da-9a68-11e4-89c4-eaebaa4cb21b.gif)

※1 これは、DefinitelyTyped上で`angularjs/angular.d.ts`というファイル名になっているためです。jqueryの場合は`jquery/jquery.d.ts`という名前なので、`dtsm install jquery`でファイルを同定することができます。

## 簡単な実装(ただし動かない時がある)

```js
var spawn = require("child_process").spawn;

var cmd = spawn("peco");
var result = [];

cmd.stdout.on("data", function (data) {
    var str = data.toString();
    var newResult = str.split("\n").filter(function (str) { return !!str; });
    result = result.concat(newResult);
});
cmd.stdout.on("end", function () {
    console.log(result);
});
cmd.stdin.write("abc\ndef\nghi\n");
```

これでOKです。
**pecoが存在**している環境では、これで正しく動きます。

## pecoが存在しない場合の対応

pecoが導入されていない環境では以下のようなエラーになります。

```
events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: write EPIPE
    at errnoException (net.js:905:11)
    at Object.afterWrite (net.js:721:19)
```

厄介なのが、このエラーはtry-catchで復帰するのが難しい点です。
めんどくさいので深くは追っていませんが、`on("error", ...)`などでも捕まえることができません。

エラーの原因として、pecoが存在しないため、`ENOENT`が発生します(こちらは`on("error", ...)`でハンドリングできる)。
その状態で`cmd.stdin.write(...);`を実行すると、`EPIPE`が発生します。
これを上手くハンドリングする方法はありません。

単純に考えると、とりあえずpecoをspawnしてみてENOENTが発生したら処理を失敗させる、という流れが良さそうです。
しかし、spawnが成功したか、起動したプロセスの標準入力に書き込みができるか、プログラムから確かめる方法がないようなのです。
起動成功確認→標準入力にデータ書き込み ができなくて、とりあえずｶﾞｯと書くしかない、という状態です。

これを防ぐには、`ENOENT`が発生しないように取り計らうしかないな！

というわけで、[which](https://www.npmjs.com/package/which)を使ってpecoが存在するか調べてから実行します。
whichのAPIは[こんな感じ](https://github.com/borisyankov/DefinitelyTyped/blob/master/which/which.d.ts)で、[こういう風に](https://github.com/borisyankov/DefinitelyTyped/blob/master/which/which-tests.ts)使うことができます。

[実際の実装例](https://github.com/vvakame/dtsm/blob/master/lib/incrementalsearch.ts)

## まとめ

存在しないコマンドを実行した後にリカバリするの大変だから存在するかしないか先にチェックしてから実行しろ。
Mac で開発環境を整えるための準備メモ〜かなり自分用〜

Mac で開発する環境を整えていくにあたって、調べたことのメモを残すことにする。
Mac ユーザには基本の「き」の字なんだろうけど。

「こんな便利な機能があるよ」というのがあれば、コメント頂けると嬉しいです。

## finder の上部に フルパス を表示させたい

パスがわからないとなにかと不便なので。

[Mac Finderのタイトルバーにフォルダのフルパスを表示する裏技 / Inforati](http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-display-the-full-path-of-folder-in-macos-finder-titlebar.html)

おまけ

[Mac Finderのパスバーを使用してファイル管理する方法 / Inforati](http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-use-the-macos-finder-path-bar.html)

## ルートを使えるようにする

Linux サーバと同じノリで使おうとしたら、一瞬パニクったので。

[Mac OS X で「ルート」ユーザを有効にして使用する - Apple サポート](http://support.apple.com/ja-jp/HT1528)

## Finder から /usr/local を開けるようにする

IntelliJ IDE の設定の時に、地味にパニクったので。

[FinderやXcodeから/usr/localを開けるようにする - testnodaの日記](http://d.hatena.ne.jp/testnoda/20120515/1337069061)


今後も新たなネタが見つかれば、追記していくことにする。


以上、おわり。
AppleWatch開発記


## 前準備

Xcode6.2-betaをインストールしましょう。
https://developer.apple.com/xcode/downloads/


## 起動まで

Xcodeを立ち上げ、iPhoneアプリを作成。
その後、File → New → Target → Watch Appを選択。

選択後、下記画像のようにWatch Appを選択する。

![スクリーンショット 2014-11-20 13.07.52.png](https://qiita-image-store.s3.amazonaws.com/0/39382/735b156b-1ca5-98ec-9bff-eb9d170ac931.png "スクリーンショット 2014-11-20 13.07.52.png")

次に、iPhoneシミュレータを起動し、下記のApple Watchを選択。

![スクリーンショット_2014-11-20_13_09_04.png](https://qiita-image-store.s3.amazonaws.com/0/39382/7303b45d-9c53-16b5-1a51-8d14b64cdb9d.png "スクリーンショット_2014-11-20_13_09_04.png")

Xcodeに戻り、Apple WatchをRunすれば完了。


## WKInterfaceTimerの謎仕様

- Units設定を何も指定しない場合、何故かカウントしない
- Labelに値が無い場合は表示すらしない
→最初何も表示させたくない場合は半角スペースかますのが吉

- Positionalに設定すると1:00を切った段階で強制的に表示が1になる→１分以下はshortを使えってこと？

|             | Positional  | Abbreviated | Short       | Full        | Spelled Out |
|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|
|表記|◯◯:◯◯|◯◯m ◯◯s|◯◯mins, ◯◯secs|◯◯minutes, ◯◯seconds（画面から見切れる|Full + 数値が文字化される|
|1分以下の表記|01（！？）|◯◯s|◯◯secs|◯◯seconds|Full + 数値が文字化される|
Keynoteのデフォルトフォントを変更する


1. textboxを選択状態にする
2. Format -> Advanced -> Set as Default Text Box Appearance


## 参考
- [Keynoteのデフォルトフォントの変更](http://d.hatena.ne.jp/seinzumtode/20141109/1415512681)
- [Change Keynote Default Fonts, Layouts](https://discussions.apple.com/thread/3932862?tstart=0)
Packer + Ansible で Playbook の指定を変数にする

サーバのロールごとに playbook を作成して、本番用途と開発用途で playbook を分けて web-app.prd.yml と web-app.dev.yml のようにして作成するAMIの対象を変数で切り替えられるようにしている。

PackerのAnsibleでは role_paths に一つ一つロールを設定しないと role がアップロードされないが、provisioners で roles ディレクトリごとまるっとアップロードするように仕込んで、いちいち指定しなくても良いようにしている。

```json
{
  "variables": {
    "role":    "",
    "env": "",
    "volume_size": "8",
    "ansible_staging_directory": "/tmp/packer-provisioner-ansible-local"
  },
  "builders": [{
    "type": "amazon-ebs",
    "access_key": "<your access_key>",
    "secret_key": "<your secret_key>",
    "region": "ap-northeast-1",
    "source_ami": "ami-4985b048",
    "instance_type": "c3.large",
    "ssh_username": "ec2-user",
    "ssh_timeout": "5m",
    "ami_name": "{{user `role`}}-{{isotime \"20060102-150405 MST\"}}",
    "user_data_file": "combined-userdata.txt",
    "ami_block_device_mappings": [
      { "device_name": "/dev/xvda", "volume_type": "gp2", "volume_size": "{{user `volume_size`}}", "delete_on_termination": true },
      { "device_name": "/dev/sdb", "virtual_name": "ephemeral0" },
      { "device_name": "/dev/sdc", "virtual_name": "ephemeral1" }
    ],
    "tags": {
      "Name": "{{user `role`}}",
      "Environment": "{{user `env`}}"
    }
  }],
  "provisioners": [
    { "type": "shell", "script": "pre-process.sh" },
    {
      "type": "shell",
      "inline": [
        "mkdir -p {{ user `ansible_staging_directory` }}"
      ]
    },
    {
      "type": "file",
      "source": "roles",
      "destination": "{{ user `ansible_staging_directory` }}"
    },
    {
       "type": "ansible-local",
       "playbook_file": "{{user `role`}}.{{user `env`}}.yml"
    }
  ]
}
```

```bash
$ packer build -var 'role=web-app' -var 'env=prd' packer.json
```
Sensu - multiple RabbitMQ brokers


## 概要

Sensu v0.15 でマージされた multiple RabbitMQ broker 機能について。

- https://github.com/sensu/sensu-transport/pull/5

これを利用すると、複数の RabbitMQ を Transport に設定できる。
接続時には、そのうちの1つが[ランダムに](https://github.com/sensu/sensu-transport/blob/008a95ad83d2832ce394b2dfe8beee0a39cb8e2d/lib/sensu/transport/rabbitmq.rb#L108)選ばれる。
接続先に失敗したり切断された場合は、[それを除いたリスト](https://github.com/sensu/sensu-transport/blob/008a95ad83d2832ce394b2dfe8beee0a39cb8e2d/lib/sensu/transport/rabbitmq.rb#L110)から再接続が行われる。
全て失敗する場合は、改めてランダムに全部試しに行く。

## 設定

`/etc/sensu/conf.d/rabbitmq.json` などで `rabbitmq` の接続設定を配列で記述。


```
{
    "rabbitmq": [
    {
        "port": 5671,
            "vhost": "/sensu",
            "user": "sensu",
            "password": "password",
            "ssl": {
                "cert_chain_file": "/etc/sensu/ssl/cert.pem",
                "private_key_file": "/etc/sensu/ssl/key.pem"
            },
            "host": "192.168.0.101"
    },
    {
        "port": 5671,
        "vhost": "/sensu",
        "user": "sensu",
        "password": "password",
        "ssl": {
            "cert_chain_file": "/etc/sensu/ssl/cert.pem",
            "private_key_file": "/etc/sensu/ssl/key.pem"
        },
        "host": "192.168.0.102"
    }
    ]
}

```

## その他

接続設定を従来通りオブジェクトで書いてあっても[内部のロジックで配列になる](https://github.com/sensu/sensu-transport/blob/008a95ad83d2832ce394b2dfe8beee0a39cb8e2d/lib/sensu/transport/rabbitmq.rb#L97)ので、バージョンアップ時に注意する必要は無い

*This change is backwards compatible and continues to support string configuration.*
関数内関数のススメ

PASCALには関数内関数というのがあって、好んで使っていたんだけど、JavaScriptならできるじゃんね。

Objective-Cには、ブロック構文というのがあって、同様のことができるらしい。他の言語でもクロージャが使えればいけるんじゃないかな。

## 即時関数で関数内を分割する

ある関数内を処理単位ごとに即時関数でブロック化する。

```js
function(){
  // 処理A。retAを生成するための処理
  var retA = (function(){
    ...
  })();
  // 処理B
  var retB = (function(retA){ // ブロック内で使う変数は、引数で取り込んでおくと分かりやすくて良い。
    ...
  })(retA);
  // 処理C
  return (function(retA, retB){
    ...
  })(retA, retB);
}
```

関数内でも関数化しておけば、関数化のメリット（ローカル変数と引数、戻り値を使って悪影響を減らす、処理の単位が明確になって可読性も上がる、など）は受けられ、将来的に分離する必要が出てきた時でも、既に関数になっているので簡単になる。

## 関数内関数のススメ

関数は小さくまとめた方がいい、と言う。うん、そうだね。だけど、関数化するかどうか悩むこともある。

例えば、その処理を、その関数内でしか使わない時。
例えば、その処理が他の関数から呼ばれてほしくない時。
ようするに独立性が低い時、かな。

関数化すると、その関数はグローバルになる。つまり、他の関数からも等しく見えてしまう。これは、オブジェクト化しても同じで、オブジェクトの内と外はあっても、オブジェクトの内部に階層はない。

内部でしか使用しないメソッドには、よくアンダースコアをつけたりして命名規則で意味付けをすることがあるけど、間違って使われてしまうことを避けられない。

さらにオブジェクト化すればいいけど、関数化も躊躇するときに、そこまでするのか？

そういう時でも、とりあえず関数でくくっとけ、と。特に開発中。

## あとがき

JavaScriptにはブロックスコープがない、という記述を見かけて、気にしたことなかったな、と。

そういえば、C言語はブロックでスコープができることは、すっかり忘れてました。使った記憶は・・・ないなぁ。

PASCALでは関数内関数を好んで使ってたので、スコープを作るだけでもメリットはあったと思うのに・・・

そんなことを、つらつら考えているうちに、気づいたことをまとめてみました。
cocos2d-xのソースをpowershellでutf-8 bom有に変換する

cocos2d-xをwin32でビルドした際の文字コード関連エラーを回避するため、まとめて文字コード変換して対処する場合のメモ。
powershellで文字コードを変換してみます。

```cnv.ps1
Get-ChildItem -Recurse -Include *.cpp,*.h,*.hpp D:\cocos2d-x-3.3 | ForEach-Object {
    $text = Get-Content $_.FullName -Encoding utf8
    $text | Out-File -FilePath $_.FullName -Encoding utf8
}
```
Get-Contentでutf8を指定すると、bomあり/なしを判別してutf8のファイルを読み取れる。
それをutf8で保存すると必ずbomありになるので、結果としてutf-8 bomありに変換できます。
GolangでXMLHttpRequestLevel2+CORSのプリフライトが通るサーバーを立てる(BasicAuth付き)

##GolangでCORS対応のHTTPサーバーを立てる

###CORSとは

ブラウザでスクリプトからXMLHttpRequest(以下XHR)などで外部サイトのリソースにアクセスする場合、セキュリティ上の問題からよく知られた同一生成元ポリシーが適用されます。

元々のXHRでは読み込み元と同一のドメインでないかぎり直接のアクセスはできず、JSONPなどを利用する必要がありました。

それでは不便なので、XMLHttpRequestLevel2ではCORSというルールを規定し、外部ドメインからアクセスを許可しています。

[詳しくはMozillaのこちら](https://developer.mozilla.org/ja/docs/HTTP_access_control)

###CORSの動作

* HTTPメソッドがGET, POST, HEADのいずれか
* HTTPヘッダにAccept, Accept-Language, Content-Language, Content-Type以外のフィールドが含まれない
* Content-Typeの値はapplication/x-www-form-urlencoded, multipart/form-data, text/plainのいずれか

以上の条件にすべて合致しない場合、
ブラウザは安全にアクセスできるかどうか、事前にOPTIONSでプリフライトを送信し確かめます。
プリフライトのレスポンスが適正な場合のみ、実際のリクエストを行います。

####具体的にサーバーはなにをレスポンスするか

* Access-Control-Allow-Originヘッダ

アクセスを許可するドメインです。
*と指定するとすべてのドメインからアクセス可能ですが、認証が必要な場合は指定できません(今回がこれです)

* Access-Control-Allow-Headers

ブラウザが使用を許可されるリクエストヘッダです。
実際のリクエストで使われるリクエストヘッダがこれに含まれない場合、ブラウザはプリフライト失敗とみなします。

* Access-Control-Allow-Methods

ブラウザが使用を許可されるメソッドです。
実際のリクエストで使われるメソッドがこれに含まれない場合、ブラウザはプリフライト失敗とみなします。

* Access-Control-Allow-Credentials

認証を使用するかの可否です。
trueの場合、Basic認証などでのアクセスが可能です。

**このヘッダをレスポンスできればCORS対応のサーバーになります**

###Golangでプリフライトをレスポンスする

以上をふまえて、こうします。
必ずBasic認証を使う場合になります。

```Golang
import (
  "net/http"
)

func routeHandler(w http.ResponseWriter, r *http.Request) {
  
  実際にはここで各ヘッダのチェックが必要です

  //リモートアドレスからのアクセスを許可する
  w.Header().Set( "Access-Control-Allow-Origin", r.RemoteAddr )
//認証を行う
  w.Header().Set( "Access-Control-Allow-Credentials", "true" )
  w.Header().Set( "Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization" )
//必要なメソッドを許可する
  w.Header().Set( "Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS" )
  
  //XMLHttpRequest Level2のpreflightをチェック
  if r.Method == "OPTIONS" {
    //ヘッダーにAuthorizationが含まれていた場合はpreflight成功
    s := r.Header.Get("Access-Control-Request-Headers")
    if strings.Contains(s, "authorization") == true || strings.Contains(s, "Authorization") == true {
    w.WriteHeader(204)
    }
    w.WriteHeader(400)
    return
  }
  ...以下、通常のレスポンス
}

func main() {    
    http.HandleFunc(パス, routeHandler)
    http.ListenAndServe(ポート, nil)
}
```
nshsを自動起動

```lang:nshs.js
var URL  = "https://www.deal.matsui.co.jp/ITS/login/MemberLogin.jsp";
var ID     = "会員ID";
var PASS = "会員パスワード";
var tPSS  = "取引暗証番号";   //簡単注文を設定しない場合は空で
/*-----------------------------------------------------------------*/

var wsh = new ActiveXObject("WScript.Shell");

//var IE = new ActiveXObject("InternetExplorer.Application")
//→ UACオンにしたら→80010108,「起動されたオブジェクトはクライアントから切断されました。」
//で
//Registry Editorで以下追加
//[HKEY_CLASSES_ROOT\InternetExplorer.ApplicationMedium] 
//[HKEY_CLASSES_ROOT\InternetExplorer.ApplicationMedium\CLSID] 
//@="{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}"
var IE = new ActiveXObject("InternetExplorer.ApplicationMedium");

IE.Navigate(URL);
IE.visible = true;

isIEbusy();
IE.document.form.clientCD.value = ID;
IE.document.form.passwd.value = PASS;
IE.document.form[(tPSS ? 4 : 3)].click();
IE.document.form.submit();

isIEbusy();
if(tPSS){
  IE.document.form.pinNo.value = tPSS;
  IE.document.form.submit();
  isIEbusy();
}

var frames = IE.Document.getElementsByTagName("frame");
for(var j in frames){
  if(frames[j].name =="LM"){
	var anodes = frames[j].contentDocument.getElementsByTagName("a");
	for(var k in anodes){
		if(anodes[k].textContent =="ネットストック・ハイスピード"){
			break;
		}
	}
  }
}
anodes[k].click();

isIEbusy();
var frames = IE.Document.getElementsByTagName("frame");
for(var j in frames){
  if(frames[j].name =="CT"){
	var anodes = frames[j].contentDocument.getElementsByTagName("a");
	for(var k in anodes){
		if(anodes[k].hasChildNodes()){
			if(anodes[k].firstChild.alt =="起動する") break;
		}
	}
  }
}
anodes[k].click();

function isIEbusy(){
	for(var i=0; i<1000; i++){
		WSH.Sleep(100);
		if(IE.busy != true && IE.ReadyState	==4) return;
	}
	if(IE.document == null) {
		WSH.Quit(WSH.echo(IE.document+"を作成できません"));
	}
}

```
Gitのアップデート方法

MacOSでgitのアップデートしたときのメモ

・こちらからダウンロードし、画面に従ってインストールを行う
http://git-scm.com/download/mac

・バージョンをチェック
`$ git --version`

これで、バージョンが以前のままだったので、
どうやら、最新バージョンのPathの指定が毎回変わるみたいので、
gitの読み込み先Pathを変更しないとダメみたいです。

・Pathを指定してバージョンをチェック
`/usr/local/git/bin/git --version`

他の人は、こちらにインストールされていたという記事も見かけました
`/usr/local/bin/git --version`

・Pathを変更する
`vim ~/.bash_profile`

※追記
>PATH=/usr/local/git/bin:$PATH
>export PATH

・.bash_profile ファイルをロードし直す
`$ source ~/.bash_profile`

・バージョンをチェック
`$ git --version`

これで最新の状態になっていました。
brew updateが失敗したが直ったメモ

正しいやり方とか知らないけど直った超適当解決メモ。。


```bash:
$ brew update
error: Your local changes to the following files would be overwritten by merge:
        file-formula.rb
        lsof.rb
        openssh.rb
        whois.rb
Please, commit your changes or stash them before you can merge.
Aborting
Error: Failed to update tap: homebrew/dupes
Already up-to-date.
```

みたいなエラーが出た。
↓この場所に移動してみたら、こんなんなっててgit pullが出来なくなってたので。

```bash:
$ cd /usr/local/Library/Taps/homebrew/homebrew-dupes
$ git status
On branch master
Your branch is behind 'origin/master' by 53 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   diffutils.rb
        modified:   fetchmail.rb
        modified:   file-formula.rb
        modified:   gdb.rb
        modified:   grep.rb
        modified:   groff.rb
        modified:   libpcap.rb
        modified:   lsof.rb
        modified:   nano.rb
        modified:   ncurses.rb
        modified:   openldap.rb
        modified:   openssh.rb
        modified:   rsync.rb
        modified:   tcl-tk.rb
        modified:   tcpdump.rb
        modified:   whois.rb
```

↓バッサリ綺麗にする。

```bash:
$ cd /usr/local/Library/Taps/homebrew/homebrew-dupes
$ git reset --hard
$ git pull
```

で、再度実行。

```bash:
$ brew update
:
Already up-to-date.
```

直った！
[備忘録] GitHub ページをそれなりに作る。

#HTMLテンプレートを入手
- 例えば、以下の、HTML5 UPを利用させてもらう。

http://www.lifehacker.jp/2014/07/140720html5_up.html


# gitが入っているマシンの場合, ワークフローは普通のgitコマンド
-
-はじめに、HTML置いたフォルダ内の登録
git init または git clone ....

git add .

-ファイルのコミットとpush(繰り返し可) 以下は、#自分の例題 
git commit -am "html commit"
 git push -u https://github.com/planteizan/planteizan.github.io.git master
(ID/pw入力)

========================

#(必要に応じ)
## Qiitaのgithub-pagesタグがついたページををちら見
http://qiita.com/tags/github-pages

## 独自ドメインの設定
- 以下の解説がわかりやすい。

http://himaratsu.hatenablog.com/entry/github/hosting

## GitHub使っていない人の前準備はここを参考に

http://liginc.co.jp/web/html-css/html/96453

##霊長類ヒト科の方々全てに向けたgitの日本語解説。
http://www.backlog.jp/git-guide/intro/intro1_4.html
concrete5.6.x 以前の記事ブロックエディタ用「オフィス」テーマの config ファイルを GitHub に上げました。


concrete5.6.x 以前のバージョンで使用している TinyMCE テキストエディターの「Office」のテンプレートをカスタムで使えるように用意しました。

concrete5 では、記事ブロックに現れる編集バーのボタンやオプションを自由に編集できる機能がありますが、そのオプションを変更するには、難しいテキストの設定を変更する必要があります。

そのため、手っ取り早い方法として「オフィス」の設定をコピーして、不要なボタンを削除していくという方法をとるために、「オフィス」の設定そのままのものをこの GitHub に用意しました。

## ご注意

この記事は Katz のブログ記事を元に作られています。2015年1月からしばらく経って見ている方は、最新の内容がブログに書かれているかもしれないので、必ず、ブログ記事をご覧頂くようお願い致します。

元記事
http://ja.katzueno.com/2015/01/3411/

## concrete5-TinyMCE-Config
https://github.com/katzueno/concrete5-TinyMCE-Office-Config


## 設定方法

1. 自分の concrete5 サイトにログイン
2. `管理画面` - `システムと設定` ページに移動
3. `基本` - `記事ブロックエディター`ページに移動
4. ツールバーセットから `オプション` を選択
4. [この Git にある `office.config`](https://github.com/katzueno/concrete5-TinyMCE-Config/blob/master/office.config) をコピー
5. テキストエリアにペースト
6. テキストを編集してボタンを追加・移動・削除。
7. 「保存」
8. 別ウインドウなどで記事ブロックを読み込みなおして変更を確認し、調整を繰り返す

TinyMCE のオプションについて詳しくは[ドキュメントページを参照のこと](http://www.tinymce.com/wiki.php/Configuration)
Macで　GLUT + OpenGL のんびりいこう#5 Draw 3DCube

#前提
Mac OSX 10.7.5
Developer Tool

#目標
立方体の描画

#cube.cpp
```cpp:cube.cpp
#include <GLUT/glut.h>

#define WIDTH 640
#define HEIGHT 480

//blue
GLfloat blue[] = { 0.0, 0.0, 1.0, 1.0 };
//ライトの位置
//GLfloat lightpos[] = { 200.0, 150.0, -500.0, 1.0 };
GLfloat lightpos[] = { 400.0, 300.0, -250.0, 1.0 };

void display(void){
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glViewport(0, 0, WIDTH, HEIGHT);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	//視野角,アスペクト比(ウィンドウの幅/高さ),描画する範囲(最も近い距離,最も遠い距離)
	//gluPerspective(30.0, (double)WIDTH / (double)HEIGHT, 1.0, 1000.0);
	gluPerspective(25.0, (double)WIDTH / (double)HEIGHT, 1.0, 1000.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	//視点の設定
	gluLookAt(150.0,100.0,-200.0, //カメラの座標
	  0.0,0.0,0.0, // 注視点の座標
	 0.0,1.0,0.0); // 画面の上方向を指すベクトル
	//ライトの設定
	glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
	//マテリアルの設定
	glMaterialfv(GL_FRONT, GL_DIFFUSE, blue);
	glutSolidCube(30.0);
	glutSwapBuffers();
}

void idle(void){
	glutPostRedisplay();
}

void Init(){
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
}

int main(int argc, char *argv[]){
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(WIDTH, HEIGHT);
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
	glutCreateWindow("cube");
	glutDisplayFunc(display);
	glutIdleFunc(idle);
	Init();
	glutMainLoop();
	return 0;
}
```

#コンパイル
framework指定が要点です。
g++ -o cube cube.cpp -framework GLUT -framework OpenGL
最近はワーニングが出るようになったので、-w 
g++ -o cube cube.cpp -framework GLUT -framework OpenGL -w
#Result
![スクリーンショット 2015-01-12 12.36.22.png](https://qiita-image-store.s3.amazonaws.com/0/33317/f21c64c7-66f7-a4cc-8451-927f5301c3e1.png "スクリーンショット 2015-01-12 12.36.22.png")
WebView にスワイプで戻る、進む機能をつける


```swift:ViewController.swift
@IBOutlet weak var webView: UIWebView!

override func viewDidLoad() {
    ...
    self.setupSwipeGestures()
}

func setupSwipeGestures() {
    // 右方向へのスワイプ
    let gestureToRight = UISwipeGestureRecognizer(target: self.webView, action: "goBack")
    gestureToRight.direction = UISwipeGestureRecognizerDirection.Right
    self.webView.addGestureRecognizer(gestureToRight)
    
    // 左方向へのスワイプ
    let gestureToLeft = UISwipeGestureRecognizer(target: self.webView, action: "goForward")
    gestureToLeft.direction = UISwipeGestureRecognizerDirection.Left
    self.webView.addGestureRecognizer(gestureToLeft)
}
```

goBack(), goForward() 以外の処理を追加したいときや、canGoBack(), canGoForward() が false のときに何か処理を加えたいとき、target を self にして呼び出すメソッドを用意する

```swift:ViewController.swift
@IBOutlet weak var webView: UIWebView!

override func viewDidLoad() {
    ...
    self.setupSwipeGestures()
}

func setupSwipeGestures() {
    // 右方向へのスワイプ
    let gestureToRight = UISwipeGestureRecognizer(target: self, action: "goBack")
    gestureToRight.direction = UISwipeGestureRecognizerDirection.Right
    self.webView.addGestureRecognizer(gestureToRight)
    
    // 左方向へのスワイプ
    let gestureToLeft = UISwipeGestureRecognizer(target: self, action: "goForward")
    gestureToLeft.direction = UISwipeGestureRecognizerDirection.Left
    self.webView.addGestureRecognizer(gestureToLeft)
}
 
func goBack() {
    if (self.webView.canGoBack) {
        self.webView.goBack()
    } else {
        // canGoBack == false の処理
    }
}

func goForward() {
    if (self.webView.canGoForward) {
        self.webView.goForward()
    } else {
        // canGoForward == false の処理
    }
}
```
@1x, @2x, @3x を一つの画像から作るスクリプト

convertコマンドを使おう

```bash:gen_image.sh

#!/bin/bash

base=${1%.*}
ext=${1##*.}
for i in 1 2 3; do
    size="$(($2 * $i))x$(($3 * i))"
    dst="$base@${i}x.$ext"
    convert -resize $size $1 $dst
done

```

使い方

```
./gen_image.sh <souce_file_path> <width> <height>
```

例えば

```
./gen_image.sh button_image.png 100 50
```

と実行すると、

* `button_image@1x.png` (サイズ100x50)
* `button_image@2x.png` (サイズ200x100)
* `button_image@3x.png` (サイズ300x150)

が生成されます。



このスニペットはMITライセンスで公開します。
pandasの表示設定の変更方法

pandasのデータ表示の設定変更方法。

表示される行・列の最大数や列名の長さなどを設定できる。

# 値の確認および設定方法

IPythonなど補完が使える環境ならば、以下のように```options```の下の値を確認および設定するのが簡単。

```pycon
>>> import pandas as pd
>>> pd.options.display.width = 300
```

# IPython起動時に設定する

```$IPYTHONDIR/profile_default/startup``` (```~/.ipython/profile_default/startup``` の場合が多い)に設定を書いたファイルを置いておくと起動時に読み込まれる。

```py:~/.ipython/profile_default/startup/startup.py
import pandas as pd
pd.options.display.width = 300
```

# 参考

設定項目等についてはドキュメント参照。

* http://pandas.pydata.org/pandas-docs/stable/options.html
CRIのawbとacb

awb
    HCAをまとめたもの
acb
    awbに含まれているHCAをどのように鳴らすのかというデータをまとめたもの
    aisacもこのデータに含まれる

例）
    awb
        XXX,YYY
    acb
        1:XXX
        2:XXX 再生速度1.5倍
        3:YYY
        4:YYY aisac
PyScribeでprintデバッグする

# PyScribeとは

PyScribeとは困ったときのpythonのprintデバッグをより簡単に実行するためのライブラリです．

# インストール方法

pip でインストールできます。

```
$ pip install pyscribe
```

# 使い方

デバッグ対象のプログラム内でpyscribeのAPIを呼び出し実行する．


## コマンド

```
$ pyscribe do_something.py
```

## 実行時オプション

|コマンド引数|内容|
|:---|:---|
|--extraargs|呼び出すプログラムに実行時引数を渡す|
|--clean|pyscribeに関連する部分を削除したファイル({name}_clean.py)を出力|
|--desugared|pyscribeの形式からpythonの標準APIに則った形式に変換|
|--log|実行時のログファイル(pyscribe_logs.txt)を出力|
|--nolines|行番号を非表示|


## API呼び出し


|API呼び出し|内容|
|:---|:---|
|pyscribe.Scriber(labels=[])|pyscribeの初期化|
|pyscribe.p(object, label=None)|オブジェクトの値を型に合った形式で出力|
|pyscribe.iterscribe(object)|forやwhileループ内のイテレータの現在の値を出力|
|pyscribe.watch(object)|指定したオブジェクトの値が変更されたときに出力|
|pyscribe.d(object, unit="*")|unitで指定した文字を区切り文字として出力|

# 例

```pyscribe_sample.py
from pyscribe import pyscribe

def main():
    ps = pyscribe.Scriber()

    x = "hogehoge"
    ps.p(x)

    y = "hello"
    ps.p(y)
    ps.watch(y)
    y = "world"
    y = "!!"

    z = 1234
    ps.d(z, unit="#")


if __name__ == "__main__":
    main()
```

- 実行

```
$ pyscribe pyscribe_sample.py
```

- 結果

```
From line 7: x is the str hogehoge
From line 10: y is the str hello
From line 11: Watching variable y, currently str hello
From line 12: y changed to world
From line 13: y changed to !!
From line 16:
########################################
z is the int 1234
########################################

```

# おわりに

シンプルなライブラリですが，困ったときのprintデバッグがより簡単になるかもしれません．
個人的には与えたオブジェクトの値の変更を監視できるwatchコマンドが便利かなと思いました．


# 参考

[pyscribe - github](https://github.com/alixander/pyscribe#planned)
AngularJS の directive の中で scope を扱う

子 scope を生成する場合
--------------------

公式のドキュメントを読めば大体書いてある。

https://docs.angularjs.org/guide/directive
https://docs.angularjs.org/api/ng/service/$compile#directive-definition-object

directive 作成時のオブジェクトに scope プロパティを指定するとあらたに子 scope が作られる。そのときの値によって、親 scope 内のプロパティとどのように対応するかを指定できる。

| 指定値    | 意味                              |
|-----------|-----------------------------------|
| @         | 属性値を値としてマッピング        |
| =         | 親 scope のプロパティとマッピング |
| &         | 属性値を評価式としてマッピング    |

実際のコードで定義してみる。

```js
app.directive('counter', function () {
    return {
        restrict: 'E',
        scope: {
            onCountup: '&',
            current: '=',
            prefix: '@'
        },
        template: '<div>click here</div>',
        link: function ($scope, element, attrs) {
            var n = 0;
            element.on('click', function () {
                $scope.onCountup();
                $scope.current = $scope.prefix + (++n).toString();
                $scope.$apply();
            });
        }
    };
});
```

こういうものがあるとき、次のように使える。

```html
<div>{{countup}}</div>
<div>{{countdown}}</div>
<counter prefix="now:" current="countup" on-countup="countdown = countdown - 1" ng-init="countup = 0; countdown = 10">
```

次の 3 点がポイント。

- prefix 属性に指定した値がそのまま directive 内の scope の prefix プロパティに入っている
- current 属性に指定したプロパティ名と directive 内の scope の current プロパティと同期する
    - directive から親の scope に値を出力できる。
- on-countup 属性に指定した式を directive 内の scope の onCountup プロパティで実行できる
    - directive に追加の挙動をもたせたり、動作する条件を指定させたりできる。

というあたりを使えば難しくない。


子 scope を生成しない場合
----------------------

restrict に "A" を含む場合、つまり属性として作用できる directive の場合、 scope を指定してしまうと、同様に scope を指定した directive を同時に適用できなくなってしまう。次はダメな例。

```html
<counter directive-with-scope>
```

同一要素に対して scope を 2 つ生成しようとしてるんだからまぁどうやって制御するんだって話しになる。

この場合、子 scope が作られないわけなので直接いじってしまえばいい。ただし、 directive が scope を変に汚染したり、既存のプロパティを上書きしないように気をつける。

```js
app.directive('sample', function () {
    return {
        restrict: 'A',
        link: function ($scope, element, attrs) {
            var propertyName = attrs.sample;
            $scope[propertyName] = 'sample attr';
            $scope.$eval(attrs.expression);
        }
    };
});
```

```html
<div>{{foo}}</div>
<div>{{sample}}</div>
<div sample="sample" expression="foo = true">
```

link に指定する関数の引数の 3 つ目 attrs に directive と一緒に指定されている属性すべてが入っているので、これを利用する。

- ある属性値がほしければ attrs のプロパティを取得する
- directive を使う側から指定されたプロパティ名を使って scope をいじるとうっかり上書きすることもない
- 式の評価には scope 内の $eval を使う

これで scope 指定と同等のことができる。
AFNetworkingで200以外のステータスコードをsuccessとして扱う

デフォでそのまま使うとステータスコード200以外は、failure扱いになってレスポンスボディが扱えないので、AFNetworking的にはsuccess扱いになるように定義する。

```swift

let manager : AFHTTPSessionManager

// NARangeでまとめて追加
var successCodes: NSMutableIndexSet = NSMutableIndexSet()
successCodes = NSMutableIndexSet(indexesInRange: NSRange(location: 200,length: 500) )
manager.responseSerializer.acceptableStatusCodes = successCodes

// addIndexで1つずつ追加
let successCodes: NSMutableIndexSet = NSMutableIndexSet(index: 200)
successCodes.addIndex(201)
successCodes.addIndex(204)
successCodes.addIndex(422)
manager.responseSerializer.acceptableStatusCodes = successCodes
```
[Objective-C] UIViewの親子関係が変化する際のイベント（デリゲート）


UIViewをサブクラス化した際に、目的のビューを生成するために中身のボタンなどのパーツをレイアウトする必要があると思います。
その場合に、サブクラス化したビュー自体の幅が未定で、親ビューに追加されるとき（インスタンス化されるとき）にサイズが決まるケースはよくあると思います。

そうなると事前にサイズを知ることができなくなり、レイアウトに問題が出る場合があります。
そんなときは、実際に親ビューに追加されたときにレイアウト処理を実行したい、という場合があります。

そんなときに使えるデリゲートメソッドです。
具体的には以下。


## viewの状態が変化したときのイベント

| メソッド名 | 意味 |
|:---------|:------------------|
| - (void)willMoveToSuperview:(UIView *)newSuperview | 自分自身が新しいSuperview以下に移動しようとしたとき（新しいSuperviewに対してaddSubview:されようとしたとき）に呼び出されます。 |
| - (void)didMoveToSuperview | 自分自身が新しいSuperview以下に移動したとき（新しいSuperviewにaddSubview:されたとき）に呼び出されます。 |
| - (void)willMoveToWindow:(UIWindow *)newWindow | 自分自身が新しいWindow以下に移動しようとしたとき（新しいWindowに対してaddSubview:されようとしたとき）に呼び出されます。 |
| - (void)didMoveToWindow | 自分自身が新しいWindow以下に移動したとき（新しいWindowに対してaddSubview:されたとき）に呼び出されます。 |
| - (void)didAddSubview:(UIView *)subview | 自分自身に他のviewがsubviewとして追加されたときに呼び出されます。 |
| - (void)willRemoveSubview:(UIView *)subview  | 自分自身のsubviewsから他のviewが取り除かれようとしているときに呼び出されます。 |

親ビューに追加されたあとにレイアウト用のメソッドを呼んでもらうようにする方法もありますが、それだとそのメソッドを呼ぶことを覚えてないとならないし、やや冗長な処理になってしまうのでこうしたデリゲートを使って追加された際に処理する、というほうがスマートです。

*（セルなどのように付け外しが頻繁に行われるビューについては処理負荷の観点から必ずしもいいとは限りませんが）*
Redisのキーに一括でExpireを設定する

# はじめに

Redisのキーが増えすぎた場合などに対して一括でExpireを付ける方法です．

以下のことに気を付けています．

- pipeline処理で複数件同時に処理する
- Redisに負荷をかけすぎないために複数件処理後に数秒sleepさせる
- expireの時間を分散させキー削除による負荷がかからないようにする


## expireをつけたいキー一覧を取得

keysで得たデータをファイルに保存する

```
$ redis-cli -h {host} -n {database} keys "*" > keys
```

## Redisのキーにexpireを付与

ファイルから特定のキーをgrepしてexpireをつける

```
$ grep {expire_key_name} keys | python set_expires.py
```

```set_expires.py
 # -*- coding: utf-8 -*-

import redis
import time
import sys
import random

EXPIRATION_SECONDS_MIN = 86400 * 10  # 10日
EXPIRATION_SECONDS_MAX = 86400 * 20  # 20日


def main():
    set_expire_keys()


def set_expire_keys():
    redis_cli = _create_client()
    pipe = redis_cli.pipeline()
    line_num = 0
    for line in sys.stdin:
        key_name = line.strip()
        # 一度に大量のキーが消えるのを防ぐために乱数で期間をバラす
        expiration_time = random.randint(EXPIRATION_SECONDS_MIN, EXPIRATION_SECONDS_MAX)
        pipe.expire(key_name, expiration_time)
        # 1万キーごとにexecute
        if line_num % 10000 == 0:
            print("{} lines proceeded.".format(line_num))
            pipe.execute()
            # Redisへの負荷を考慮して3秒停止
            time.sleep(3)
            pipe = redis_cli.pipeline()
        line_num += 1
    pipe.execute()
    print("{} lines proceeded.".format(line_num))
    print("complete!!")


def _create_client():
    redis_cli = redis.Redis(
        host="localhost",
        port=6379,
        db=1
        )
    return redis_cli


if __name__ == "__main__":
    main()
```