OmniAICreator/Qiita-1.07M huggingface dataset:
Elements Alpha-Sidechain構築方法

Alpha-sidechainの構築方法です。
起動する部分までの方法を記します。

**環境**
ubuntu14.04(vagrantでOSX10.11.3上に構築)

# コンパイル
1) **build-essential**パッケージをインストールします。

```
sudo apt-get install build-essential
```

2) ツールをインストールします。

```
sudo apt-get install libtool autotools-dev autoconf pkg-config
```

3) 依存関係にあるパッケージをインストールします

```
sudo apt-get install libssl-dev libboost-all-dev libdb4.8-dev libdb4.8++-dev
```

**注意**：libdb5.1ではなくlibdb4.8を使ってください。libdb5.1では動かない可能性があります。

# Elements構築
1) gitでコードをインストールします。

```
git clone https://github.com/ElementsProject/elements && cd elements
```

2) mainchainブランチにcheckoutします。

```
git checkout mainchain
```

3) Bitcoinをコンパイルします

```
./autogen.sh && ./configure && make
```

4) 扱いやすくするために、bitcoind, bitcoin-cli, bitcoin-txコマンドを親ディレクトリに移動します。

```
mv src/bitcoin{d,-cli,-tx} ../
```

5) ブランチをalphaに変更して 2)~4)と同じ処理を行います。

```
git checkout alpha
./autogen.sh && ./configure && make
mv src/alpha{d,-cli,-tx} ../
```

# Elements起動
bitcoindを起動します。このあたりはbitcoinと同じです。

```
./bitcoind -rpcuser=$RPC_USER -rpcpassword=$RPC_PASS -testnet -txindex -daemon
```

alphadを起動します。

```
./alphad -rpcuser=$RPC_USER -rpcpassword=$RPC_PASS -testnet -rpcconnect=127.0.0.1 -rpcconnect=127.0.0.1 -rpcconnectport=18332 -tracksidechain=all -txindex -blindtrust=true -daemon
```

# API call 使い方
API callの呼び出し方です。apiコマンドについては[こちら](https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_calls_list)を参考にしてください。

bitcoind

```
./bitcoin-cli -rpcuser=$RPC_USER -rpcpassword=$RPC_PASS -testnet -txindex <type command here>
```

alphad

```
./alpha-cli -rpcuser=$RPC_USER -rpcpassword=$RPC_PASS -testnet -rpcconnect=127.0.0.1 -rpcconnect=127.0.0.1 -rpcconnectport=18332 -tracksidechain=all -txindex -blindtrust=true <type command here>
```

以上です。次回はBitcoinとAlpha(Sidechain)間でのmoney(token)の移動について記します。

## 参考
[Getting Started with the Alpha Sidechain](https://www.elementsproject.org/sidechains/alpha/getting-started.html)
routes.rbでログイン状態によってroutesを切り替える

# はじめに

ログイン状態によって飛ばしたいページが異なることは多々あると思います

 - ログインしているかどうかでrootを変えたい
 - ログインしてない場合にアクセスできるページとできないページがある

みたいな場合、Controllerでログイン状態をチェックした後適切なページにリダイレクトさせる、といった処理をさせることが多いと思うんですが、routeファイルでその辺りまでハンドリングできるとControllerがすっきりして良いなと思いました

環境は以下のとおりです
 - Rails 4.2.5
 - Warden 1.2.6

# Custom Constraints を作る

Constraintsは独自で定義できるので、ログイン状態かどうかをチェックする制約を作成します
wordenを使っている場合、以下のようになります

```rb
class NotLoginConstraint
  def matches?(request)
    !request.env['warden'].authenticated?
  end
end

class LoginConstraint
  def matches?(request)
    request.env['warden'].authenticated?
  end
end
```

# routesを定義する

あとは先程作った制約を使ってroutesを定義するだけです
各定義は例なので適当です

```rb
Rails.application.routes.dra do
  # ログインに関係なくアクセス可能なページの定義
  get 'hoge', to: 'hoge#index' 

  constraints NotLoginConstraint.new do
    # ログインしていない場合のrootの定義
    get '', to: 'welcome#index'

    # ログインしていない場合にアクセス可能なページの定義
    get 'login', to: 'session#new'
  end

  constraints LoginConstraint.new do
    # ログインしている場合のrootの定義
    get '', to: 'user#show'

    # ログインしている場合にアクセス可能なページの定義
    get 'logout', to: 'session#destroy'
  end

  # マッチしなかった場合のリダイレクト先の定義
  match '*unmatched_route', to: redirect('/'), via: :all
end
```

rootの定義は、`root`メソッドを使うと上書きできないため、`get ''`として設定しています
emacs install 手順

# インストール手順

emacsをインストール、php-mode,web-modeの設定までやる

## emacs install
```lang:command
cd /usr/local/src
curl -x http://proxy:port -O http://ftp.jaist.ac.jp/pub/GNU/emacs/emacs-24.3.tar.gz
tar -xzf emacs-24.3.tar.gz
cd emacs-24.3
yum install ncurses-devel (これやんないとコンパイルエラーになる)
./configure -without-x -without-selinux
make
make install
```

## php-mode,web-modeインストール

### setting emacs
社内環境だとproxyが入っているのでproxyの設定とmelpaの登録

```lang:~/emacs.d/init.el
(setq url-proxy-services
      '(("http" . "hostname:port")
        ("https" . "hostname:port")))

(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/"))
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(fset 'package-desc-vers 'package--ac-desc-version)
(package-initialise)
```

### php-mode,web-mode install
emacsで
`M-x package-list-package`
からインストール
Ubuntu の start-stop-daemon の起動オプションではまる

# 概要

[Ubuntu 14.04.4 の Docker でZabbix agent を static library で作る - Qiita](http://qiita.com/manabuishiirb/items/6dbef209112a8505665f)

これを作って、ほかのマシンで動いているとおもわれる、/etc/init.d/zabbix_agentd を持ってきたのだが動かなかった。

# 結論

start-stop-daemon で -u または --user しているところを -c にしたら動いた。

# 経過

最初にでていたエラー

```
# /etc/init.d/zabbix_agentd start
Starting Zabbix agent daemon: zabbix_agentd
zabbix_agentd [3611]: user zabbix does not exist
zabbix_agentd [3611]: cannot run as root!
```

その時点でのスクリプト

```
  start)
        echo "Starting $DESC: $NAME"
        start-stop-daemon --oknodo --start --pidfile $PID \
                --user $USER \
                --exec $DAEMON -- -c /etc/zabbix/zabbix_agentd.conf
        ;;
```

ここで、--userを-cにしたら

```
# /etc/init.d/zabbix_agentd start
Starting Zabbix agent daemon: zabbix_agentd
# 
```

## man start-stop-daemon より抜粋

### -u , --user についての記述

チェックするのに使うと書いてある。

```
       -u, --user username|uid
              Check  for  processes owned by the user specified by username or
              uid. Note: using this matching option alone will cause all  pro‐
              cesses matching the user to be acted on.
```

### -c についての記述

プロセスを実行する前に、username/uidに変更すると書いてある。

```
       -c, --chuid username|uid[:group|gid]
              Change to this username/uid before starting the process. You can
              also specify a group by appending a :, then the group or gid  in
              the  same way as you would for the `chown' command (user:group).
              If a user is specified without a group, the primary GID for that
              user  is used.  When using this option you must realize that the
              primary and supplemental groups are set as  well,  even  if  the
              --group  option is not specified. The --group option is only for
              groups that the user isn't normally a member of (like adding per
              process group membership for generic users like nobody).
```


# 疑問

うまく動いていると思っているところでは一体何がおこっているのか。。。
HA構成のFortigateに対するsnmpgetに失敗した場合の対処法

###概要
HA構成のFortigateからsnmpget等をする場合、通常のSNMP設定に加えて、CLIからのみ実行可能な設定も必要となる。

###設定例
具体的には以下のように、``set ha-direct enable``を該当するSNMP設定の箇所に追加する。

```bash
config system ha
    set ha-mgmt-status enable
    set ha-mgmt-interface "mgmt1"
    set ha-mgmt-interface-gateway 10.100.200.254
end

config system interface
    edit "mgmt1"
        set ip 10.100.200.1 255.255.255.0
        set allowaccess ping https ssh snmp fgfm
    next
end

config system snmp community
    edit 1
            config hosts
                edit 1
                    set ha-direct enable
                    set ip 10.100.100.0 255.255.255.0
                next
    next
end
```
###参考記事
http://kb.fortinet.com/kb/documentLink.do?externalID=FD34731
nginx 変数の値を確認したい時は add_header ディレイクティブを使うと超絶簡単


## `add_header` ディレイクティブについて

[Module ngx_http_headers_module](http://nginx.org/en/docs/http/ngx_http_headers_module.html#add_header)

> ```
> Syntax:	add_header name value [always];
> Default:	—
> Context:	http, server, location, if in location
> ```
>
> Adds the specified field to a response header provided that the response code equals 200, 201, 204, 206, 301, 302, 303, 304, or 307. A value can contain variables.

HTTP ステータスコードが、200、201、204、206、301、302、303、304、または307で提供された HTTP レスポンスヘッダーに指定されたフィールドを追加します。値は変数を含む事ができます。

## 使い方

### 前提

下記の記事内容を最低限把握している程で実証をするため、インストール手順や公開ディレクトリの作成、設定後の再起動等は省略します。

[nginx と php-fpm の仕組みをちゃんと理解しながら PHP の実行環境を構築する - Qiita](http://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc)

### 設定

`set $variable "hoge";` で `$variable` に "hoge" をセットしています。 `$request_filename` は定義済みの変数です。
`$request_filename` 以外にも定義済みの変数が多数あります。確認したい方は下記を参照して下さい。

[Module ngx_http_core_module](http://nginx.org/en/docs/http/ngx_http_core_module.html#variables)

```nginx:/etc/nginx/nginx.conf
location / {
    set $variable "hoge";
    add_header variable $variable;
    add_header request_filename $request_filename;
}
```

### 変数の値を確認

cURL コマンドに `-I` `--head` オプションをつけることで、HTTP レスポンスヘッダのみ取得する事ができます。

```console
$ curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Thu, 24 Mar 2016 08:39:04 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 04 Mar 2014 11:46:45 GMT
Connection: keep-alive
ETag: "5315bd25-264"
variable: hoge
request_filename: /usr/share/nginx/html/index.html
Accept-Ranges: bytes
```
Pepperから年齢を検出してみる

職場にPepperがきた。GetAgeという機能があるようなので、Detectした人の年齢をしゃべるようにしてみた。

##Choregrapheのキャプチャ
![cog.png](https://qiita-image-store.s3.amazonaws.com/0/60207/e2df7d80-b6f3-430d-9a87-fac50f49ec46.png)

###Set Language
しゃべらせる言語を設定するBoxです。
・設定を日本語にしました。

###Basic Awareness
イベントの監視をしてくれます。種類は「音を検知」、「顔を認識」、「顔を見失う」の3種類のようです。
・今回は顔を検知した際の処理をしたいので、上から2番目を使用しました。

###Get Age
検出した顔の年齢を識別するBoxです。
・設定は何もしていないです。


###Say Text
パラメータとして受け取った文字列をPepperにしゃべらせます。
・パラメータとして年齢が入ってくるので言葉を修正。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/60207/e53cf368-7e68-3b3b-842e-1b281e5472ec.png)



##結果
これで動きはしましたが、GetAgeの速度がいまいちなのと精度が10歳以上相違している場合がかなりありました。
調整が必要なのかもしれません。
[*Cordova*] CordovaアプリをChromeでデバッグ（Android）

# はじめに
Cordovaアプリのデバッグ方法メモ。

# 環境
* MacBook Air (OS X El Capitan 10.11.4)
* Genymotion (Nexus 5 - 4.4.4 - Chromeインストール済み)

# 手順
## Android側の設定
画像真ん中辺りの**Dev Settings**を選択し、 **USB debugging**にチェックを入れる。
または、**Settings > Developer options**で同様の画面が開ける。
（Developer optionsが見つからない時は、Settings > About phone > Build numberを連打すると出てくる）

![スクリーンショット 2016-03-24 14.22.28.png](https://qiita-image-store.s3.amazonaws.com/0/48912/0de0192e-97a8-ebcf-9fae-f5c86f0b5c99.png)
![スクリーンショット 2016-03-24 14.22.50.png](https://qiita-image-store.s3.amazonaws.com/0/48912/5c016ab8-fb64-b0b3-58f3-b48d8b40a342.png)

## ホスト側の設定
Genymotionの端末を起動したまま、ホスト側のChromeで`chrome://inspect`にアクセスする。
`Discover USB devices`にチェックを入れると以下の様になる。

![スクリーンショット 2016-03-24 15.17.44.png](https://qiita-image-store.s3.amazonaws.com/0/48912/6928be81-cea5-741f-910a-259e67e30518.png)

今回は`WebView in io.cordova.hellocordova (33.0.0.0)`と書いてあるのがデバッグしたい対象なので、`inspect`をクリックする。

![スクリーンショット 2016-03-24 15.22.22.png](https://qiita-image-store.s3.amazonaws.com/0/48912/9a3037ad-dc61-ddd7-1164-ebf35f2b5fb9.png)

あとは普通に開発者ツールを使う感じで。
Gazebo + ROS で自分だけのロボットをつくる 1.完成までの手順

# Gazeboってなんぞ？
この記事にたどり着いている方は、Gazeboって何なのか、何ができるのかはすでにご存知かと思いますが、
概要を一応説明しておきます。
Gazeboは以下のような特徴を持っています。

- オープンソース（Apache ライセンス）の3Dロボットシミュレータ
- Qtを利用した強力なGUI
- 複数の物理エンジンを切り替えられる(ODE含む)
- カメラ、LRFなどのセンサシミュレーションが豊富
- センサだけでなく、ロボットモデルも豊富(TurtleBot、PR2etc…)
- ROSとの連携も充実 **←これ大事**

という感じで、もはや使わない手はないロボットシミュレータです。

## でも、どうやって使うの？
よっしゃ、では早速と思い、[Gazeboのチュートリアル](http://gazebosim.org/tutorials)を読んだり(とりあえず[日本語訳したこともあります](http://cir-kit.github.io/blog/categories/gazebo/)...)、ROSのチュートリアルを読んだり（Gazeboチュートリアルに誘導されるだけですが...）したのですが、**イマイチ具体的にどうしたらいいのかわかりません**でした...orz
そこで本記事では、**CADでロボットを作ってから、それをGazeboで動かすところまで**、私のノウハウを詰め込みたいと思います。
ただ、分量が多くなるので、いくつかの記事に分けたいと思います。

# CAD設計からGazeboまでの流れ


0. [完成までの手順](http://qiita.com/RyodoTanaka/items/c3014fd6d0f06d12814f) **<-今ここ**
1. [好きなCADソフトを使ってSTLファイルを作る](http://qiita.com/RyodoTanaka/items/cad2cf100dd916d56717)
2. [好きなソフトを使ってCOLLADAファイルを作る](http://qiita.com/RyodoTanaka/items/b1ebd48da81669db7409)
3. [URDFファイルを作る](http://qiita.com/RyodoTanaka/items/174e82f06b10f9885265)
4. [GazeboとROSの連携](http://qiita.com/RyodoTanaka/items/6fa7e45f98b55376a95b)
5. [ros_controlについて](http://qiita.com/RyodoTanaka/items/e7feb74d0e29a8598f48)
6. [実際にlaunchしてみる](http://qiita.com/RyodoTanaka/items/af834ed767589a02e27a)

任意のモデルを作るためには、上記の手順で行います。
それぞれの手順について記事を書こうと思いますので、よろしくお願いします。
最終的には、こんな感じで、自分だけのモデルをlaunchできるようにする予定です。
![Screenshot 2016-03-25 01:26:30.png](https://qiita-image-store.s3.amazonaws.com/0/110699/548194a9-5487-85e6-be59-eebe5ff44337.png)
![Screenshot 2016-03-25 01:23:54.png](https://qiita-image-store.s3.amazonaws.com/0/110699/d5f76fe1-e565-d55c-2a75-1a17a503f263.png)

因みに、キャプチャのロボットについては、下記Githubにて公開しておりますので、よろしければご覧ください。
https://github.com/CIR-KIT/fourth_robot_pkg

# 参考
1. http://www.slideshare.net/akio19937/1rosrosgazebo
2. http://cir-kit.github.io/blog/categories/gazebo/
3. http://qiita.com/MoriKen/items/613635b90f3a98042dc5
4. http://gazebosim.org/tutorials
5. http://wiki.ros.org/urdf
6. http://wiki.ros.org/xacro
[cocos2d-x]v3.8でAudioEngineのpreloadは動くようになった？

## 概要
cocos2dで音楽を扱う場合、標準では**SimpleAudioEngine**、あるいはその後発の**AudioEngine**を使うことになると思います。
以前はSimpleAudioEngineにはpreloadがあるのにAudioEngineにはpreloadが無かったそうですが、v3.8辺りで[preloadが対応](http://discuss.cocos2d-x.org/t/release-cocos2d-x-3-8-final-please-enjoy/23479)したとのこと。

しかしこのpreload、どうやら**Androidでは動いていない**ようで。
※cocos2d-x v3.10で調べました。

## ソースを見てみる
iOSの場合、preloadの実装を辿ると以下のような実装にたどり着きます

```cpp
AudioCache* AudioEngineImpl::preload(const std::string& filePath, std::function<void(bool)> callback)
{
    AudioCache* audioCache = nullptr;
    
    auto it = _audioCaches.find(filePath);
    if (it == _audioCaches.end()) {
        audioCache = &_audioCaches[filePath];
        audioCache->_fileFullPath = FileUtils::getInstance()->fullPathForFilename(filePath);
        
        AudioEngine::addTask(std::bind(&AudioCache::readDataTask, audioCache));
    }
    else {
        audioCache = &it->second;
    }
    
    if(audioCache && callback)
    {
        audioCache->addLoadCallback(callback);
    }
    return audioCache;
}
```

iOSは大丈夫そう。
androidの方からたどり着く先は…

```cpp
void AudioEngineImpl::preload(const std::string& filePath, std::function<void(bool)> callback)
{
    CCLOG("Preload not support on Anroid");
    if (callback)
    {
        callback(false);
    }
}
```

```
Preload not support on Anroid
```

(´・ω・｀)

Android側はopenSL/ESで実装されているそうですが、preloadやcacheはできないのですかね。
android4.1以降latencyは[かなり改善](https://source.android.com/devices/audio/latency_measurements.html#how)されているそうですが…
自前で書く場合どのようにしたらいいんだろう。
【TIPS】protocol の対応は extension で！

昔「ガチで Swift でプログラム組んで1年経っての心得」という記事で[「循環参照、ダメ。絶対」](http://qiita.com/lovee/items/555a5b76097347aa2367#循環参照ダメ絶対)の章で、循環参照の代わりに所属関係をきちんと整理して `delegate` を作ったほうがいい、というような内容を書きました。その時下記のようなサンプルコードもありました：

```swift:before
class Person: CarDelegate {
	
	var car: Car?
	
	func goForADrive() {
		self.car?.drive()
	}
	
	func buyGasoline() {
		print("Go buy some gasoline")
	}
	
	func solveGasolineShortageProblem() {
		self.buyGasoline()
	}
	
}

class Car {
	
	var delegate: CarDelegate?
	
	func drive() {
		print("Drive!")
	}
	
	func outOfGasoline() {
		self.delegate?.solveGasolineShortageProblem()
	}
	
}

protocol CarDelegate {
	func solveGasolineShortageProblem()
}

let nishikinoMaki = Person()
let ferrari458Italia = Car()
nishikinoMaki.car = ferrari458Italia
ferrari458Italia.delegate = nishikinoMaki

nishikinoMaki.goForADrive()
ferrari458Italia.outOfGasoline()
```

もちろんこの記述自体に別に「これはダメ」というようなものは多分ないと思いますが…（ないよね？）ところが、最近の開発で一つ気付いたことがあります：

**対応してるプロトコルが増えてくるとプロトコルのメソッド増減するたびにそれに対応してるクラスや構造体の修正が面倒！**

まあ当然ですよね、この例で見ても、下の `protocol CarDelegate` 見るまで、`Person` はどこで `CarDelegate` を対応させてるのかわからないでしょう？しかもこれはあくまで `delegate` パターンを紹介するために作った必要最小限の機能しかないサンプルコードだからまだ比較的にわかりやすいですけど、実際の開発では `Person` も `CarDelegate` も中身が増えてくる可能性が非常に高いので、そうなってきた場合、もう宣言部で全て書いてしまったらどこにどれがあるのかが分かりづらくなってきて結果保守性の低下にもつながってしまうんですね

解決方法はもちろん複数あると思いますが、例えばコメントで「これはこのプロトコルのメソッドだ」とか書いてしまうこともいいですし、ただせっかく Swift は `extension` 機能があるので、これを使った方が Xcode にとってもも人間にとってもわかりやすいですし内容が膨れ上がってきたクラスを分割することもできますのでオススメです。それに `protocol` のところと同じ順番で書いていけばよりわかりやすいです。

まあ一応例を挙げますと、上記のコードを下記のように修正するだけです：

```swift:after

class Person {
	
	var car: Car?
	
	func goForADrive() {
		self.car?.drive()
	}
	
	func buyGasoline() {
		print("Go buy some gasoline")
	}
	
}

extension Person: CarDelegate {
	
	func solveGasolineShortageProblem() {
		self.buyGasoline()
	}
	
}

class Car {
	
	var delegate: CarDelegate?
	
	func drive() {
		print("Drive!")
	}
	
	func outOfGasoline() {
		self.delegate?.solveGasolineShortageProblem()
	}
	
}

protocol CarDelegate {
	func solveGasolineShortageProblem()
}

let nishikinoMaki = Person()
let ferrari458Italia = Car()
nishikinoMaki.car = ferrari458Italia
ferrari458Italia.delegate = nishikinoMaki

nishikinoMaki.goForADrive()
ferrari458Italia.outOfGasoline()
```

これで `extension Person: CarDelegate` を読めば `solveGasolineShortageProblem()` は `CarDelegate` の内容だとすぐ分かっちゃいますね！
nginxがunicornのソケットにアクセスできない(Permission denied)


nginxの実行ユーザはuniconのそれと同じにしてるのになんで？
と思ったら SELinux が有効になってたという罠。

とりあえず動かしたいだけなので、SELinuxを無効化

```
$ sudo setenforce 0
```

これで動くようになった。

SELinuxを有効にしつつ使えるようにする設定については後々対応のつもり

# 参考

* [【nginx/unicorn】(13: Permission denied) while connecting to upstream | COTeggのバケツ](http://www.cotegg.com/blog/?p=281)
* [Socket で Permission deniedが発生してはまってしまったのでまとめ | レンタルサーバー・自宅サーバー設定・構築のヒント](http://server-setting.info/centos/socket-permission-denied-resolve.html)
* [SELinux policy for nginx and GitLab unix socket in Fedora 19](http://axilleas.me/en/blog/2013/selinux-policy-for-nginx-and-gitlab-unix-socket-in-fedora-19/)
正規表現で住所情報から都道府県の情報のみを取り出したい



例: 以下のような住所情報が格納された配列があり、その中から都道府県の情報をのみを配列として取得したい場合。


```
["神奈川県横浜市港北区", "東京都港区赤坂", "京都府京都市右京区"].map{|address| address.match(/^(.{1,3}[府|都|道|県])/);$1}
=> ["神奈川県", "東京都", "京都府"]
```

逆に都道府県の情報を除外した住所情報が欲しい場合には以下の様にする。

```
["神奈川県横浜市港北区", "東京都港区赤坂", "京都府京都市右京区"].map{|address| address.match(/^(.{1,3}[都|道|府|県])(\S+)/);$2}
=> ["横浜市港北区", "港区赤坂", "京都市右京区"]
```
Haskellのお勉強その1-Haskell環境構築

# はじめに
- このドキュメントは，私のHaskellお勉強用メモです．
- お勉強には，[Learn You a Haskell for Great Good!](http://learnyouahaskell.com/chapters)というページを参考にさせてもらっています．

# 今回のテーマ
- Haskell プログラミングが出来る環境を整える．
- 使用環境：
    - VMWare Player 7.1.3
    - ホストOS：Windows10 64bit
    - ゲストOS：CentOS 7

# やったこと
1. Haskell のダウンロードページの確認
    2. ダウンロードページ：[https://www.haskell.org/platform/](https://www.haskell.org/platform/)
        3. 上記ページからHaskell Platformがダウンロード出来ます．
        4. [http://learnyouahaskell.com/introduction](http://learnyouahaskell.com/introduction)の”What you need to dive in”によると，Haskell PlatformにはHaskellの実行に必要なコンパイラやその他パッケージがそろっているため，Haskellをとりあえず使ってみようという場合はこれが最適のようです．
5. CentOS７上にインストールするのに必要な各種手順の確認
    6. [https://www.haskell.org/platform/#linux-redhat](https://www.haskell.org/platform/#linux-redhat)にある説明ではFedora系統には，` sudo yum install haskell-platform `でインストールできるようですが，CentOS7では標準レポジトリにhaskell-platformは用意されていません．epelレポジトリにあるようですが，epelレポジトリを自分の環境にはまだ入れていなかったので，次のステップを実行しました．
7. epelレポジトリのインストール
    8. `sudo yum install epel-release`
9. Haskell Platformのインストール
    10. `sudo yum --enablerepo=epel install haskell-platform`
    11. インストール容量が1.1GBと意外と大きいので，仮想マシンのディスク容量が少ない方は注意してください．
12. 動作確認
    13. `$ ghci`と入力．ghciとはHaskellのインタプリタのことのようです．
    14. `Prelude>`とかがコマンドラインに出てくれば成功です．
    15. ghciインタプリタから出るには，`:quit`と入力してEnterで出れます．

今回は以上です．お疲れ様でした．

## 追記
コメント欄の @ruicc 様のご指摘のように，最近stack[http://docs.haskellstack.org/en/stable/README/](http://docs.haskellstack.org/en/stable/README/)というツールが，Haskell Platformよりも主流のようです．
個人的にも，Haskellで開発をするならこちらの方が取り扱いがしやすそうだと感じました．
また今度そちらに関しても勉強したいと思います．

# 参考文献
- Learn You a Haskell for Great Good!：[http://learnyouahaskell.com/introduction](http://learnyouahaskell.com/introduction)
- Haskell Platform：[https://www.haskell.org/platform](https://www.haskell.org/platform)
- Haskell Installation Instructions, Rose-Hulman Institute of Technology 
Dept. of Computer Science and Software Engineering：[https://www.rose-hulman.edu/Users/faculty/young/CS-Classes/resources/Haskell/index.html](https://www.rose-hulman.edu/Users/faculty/young/CS-Classes/resources/Haskell/index.html)
Mac を初めて使うエンジニアにオススメする環境づくり

# はじめに

Mac で開発を行う上で自分が使っているツールや設定の紹介です。
この手の記事は多々あると思うも、
嗜好が出やすい箇所かとも思うので一例として。

## 最近の更新

2019-06-14: だいぶ時間経過してしまったので再確認 & 整理しました。

## 環境補足

* キーボードは英字配列です
* 環境設定が英語のため適宜読み替えて下さい

# Mac の設定編

* **caps lock** => **control** : caps lock を controll に変更
    * 英字配列です
    * 使うエディタにもよりますが HHK に慣れているため、control キーを変更します
    * 以下で行えます
        1. **System Preferences**
        2. **Keyboard**
        3. **Modifier Keys**
* 拡張子を表示
    * 最近は減りましたが、勘違いを防ぐために
    * 以下で行えます
        1. **Finder**
        2. **Preference**
        3. **Advanced**
        4. **Show all filename extensions**

# 共通で入れておいたほうが幸せなツール

* **Xcode** インストール
    * 開発者なら何も考えず入れておきましょう
    * [Xcode](https://itunes.apple.com/us/app/xcode/id497799835?ls=1&mt=12)
* **iTerm2** 
    * 個人的に気に入っているターミナル
    * [iTerm2](https://www.iterm2.com/)
* **Better Touch Tool**
    * 有料ですが便利なツールです
    * 別途このツールだけ切り出して記事書いても良いかも
    * [Better Touch Tool](http://www.boastr.net/)
* **brew**
    * Mac のパッケージ管理ツール
    * 便利なので入れておくと良いと思います
    * [brew](http://brew.sh/index_ja.html)
* **anyenv**
    * [anyenv](https://github.com/anyenv/anyenv)
    * 各種言語/FWのバージョン管理ツールを管理するツール
    * 各々利用する言語/FWに合わせて経由させておくと便利です (node, python, ruby ...)

# サーバー等リモートにおいてあるファイルを弄るケースが多い場合

* **sshfs**
    * ssh を利用してリモートサーバーのディレクトリをマウント出来るようになります
    * 開発環境のログディレクトリ等をマウントして置くと便利です
    * インストール手順
        1. brew install Caskroom/cask/osxfuse
        2. brew install homebrew/fuse/sshfs
systemd でサービス起動しようとしたら Access denied


こういう状態になったら一旦

```
$ sudo systemctl daemon-reexec
```

したら良いらしい。（バグなのかな?）


# 参考

[systemd in Fedora 22: Failed to restart service: Access Denied - major.io](https://major.io/2015/09/18/systemd-in-fedora-22-failed-to-restart-service-access-denied/)
スクロールイベントで要素の表示を振り分ける


## パターン1:要素がページ内に入ったら表示する

デモ：http://mo49.tokyo/qiita/20160324/fadeInDown.html

若干上から降りてくるアニメーションを定義

```css:css
.js-fadeInDown {
	animation-fill-mode:both;
	animation-duration:1s;
	animation-name: fadeInDown;
	visibility: visible !important;
}
@keyframes fadeInDown {
	0% { opacity: 0; transform: translateY(-20px); }
	100% { opacity: 1; transform: translateY(0); }
}
```

スクロールが閾値を越えたら.js-fadeInDownを追加

```javascript:javascript
$('.js-scrollTarget').css('visibility','hidden');
$(window).scroll(function(){
	var $windowHeight = $(window).height(),
		$topWindow = $(window).scrollTop();
	$('.js-scrollTarget').each(function(){
		var $targetPosition = $(this).offset().top;
		if( $topWindow > $targetPosition - $windowHeight + 100 ){
			$(this).addClass("js-fadeInDown");
		}
	});
});
```

## パターン2:閾値を境にfadein/fadeoutを切り替える

aboutセクションより下にいったら「トップに戻る」ボタンをfadein。
上に戻ったときはfadeoutする。

```javascript:javascript
$gototop.css('display','none');
$(window).scroll(function(){
    var $windowHeight = $(window).height(),
        $topWindow = $(window).scrollTop(),
        $targetPosition = $('.sec-about').offset().top;
    if( $topWindow > $targetPosition - $windowHeight ){
    	$gototop.fadeIn();
    }else{
    	$gototop.fadeOut();
    }
});
```
MongoDBで特定処理を除いてスナップショットからoplogによる差分リストアする


とりあえずAWSで動かしているとして、スナップショットによるバックアップをしている場合に復旧する手順メモ。
LVMによるスナップショットバックアップなどでも、それほど手順は変わらないはずです。

何か操作ミスが行われた前提とします。

# リストアする前に行う作業

当然ながらmongoに対してこれ以上アクセスがないようにします。
mongoを一旦停止して、直接DBを別ポートで起動してしまうのが一番安全です。
マスタに最新のoplogがあるはずなので、マスタのみで行います。

```
mongod --dbpath /path/to/db --port 37017
```

リストアにはoplogで差分を埋めることになるので、スナップショットした時間以降のすべてのoplogがあることが前提となります。そのため、必ずスナップショットの間隔がoplogに保存される時間を超えないように監視を必要とします。

* oplog監視スクリプト例(`-A oplog`)

https://github.com/sensu-plugins/sensu-plugins-mongodb/blob/master/bin/check-mongodb.py

oplogはデータサイズ固定で古いものから消えていく設定になっているので、普段は1日分取っているけどバッチ処理で一気に流れてしまうということがあり得るので注意が必要です。スナップショットの間隔を狭めるなりoplogのサイズを大きくしておくといいです。

* oplogサイズ変更手順

https://docs.mongodb.org/manual/tutorial/change-oplog-size/

### 復旧したいoplogを調べる

mongoのシェルで`use local`してから`db.oplog.rs.find()`以降にクエリをつけて差分として取り込む対象を絞っておきます。
oplogにはindexが貼られていないので、対象が多いと調べるのが難しいでしょう。直近の操作ならtsに加えて`.sort( {$natural : -1} )`をつけて条件を絞ると早かったりします。

### oplogをダンプする

下記でダンプできますが、

`mongodump --port 37017 -d local -c oplog.rs -o oplogD`

この時`--query '{ "ts" { $gt: Timestamp(1458790000, 1) } , "ts": { $ne: Timestamp(1458799147, 48) } }'`のように条件が付けることが可能です。よって、ここで操作ミスを取り除いたoplogを作成できます。操作ミスが後のクエリに影響を与えるような処理だったら、操作ミス以降のをデータをすべてダンプしないようにしましょう。

ダンプを取った時間よりちょっと前をtsで指定するとダンプ時間の短縮になります。
そのため、スナップショットを取る際に、タグに最新のoplogのタイムスタンプを入れるようにしておくと便利です。最低でも、システムの最新のタイムスタンプは入れておくべきでしょう。



oplogからの差分リストアを行う場合、リストアしようとしているmongoの最新のoplogのタイムスタンプ以前のものは実行をスキップするという処理になるため、余分にoplogを取ってしまってもも問題ありません。。
もしoplogをすべて削除してからリストアによるoplogの差分復旧を行ったら、すべてのoplogが実行されます。

### oplogをリストアできるようにしておく

ダンプしたファイルは`./oplogD/local/oplog.rs.bson`に吐き出されるので、適当な別ディレクトリを作ってファイル名をoplog.bsonにします。これは単純にmongorestoreの仕様です。

```
mkdir oplogR
mv oplogD/local/oplog.rs.bson oplogR/oplog.bson
```

# mongoをスナップショットから復旧する


データベース用のEBSとして別領域に分けてある場合には

1. mongodを終了
2. mongo用の領域をumount
3. AWSコンソールから、ボリュームをdetach
3. AWSコンソールから、スナップショットからボリュームを作ってattach
4. mongo用の領域をmount

のような手順を踏めばボリュームを交換できます。

### oplogから差分を取り込む

oplogのリストア時にレプリケーションが行われているとoplogの実行されないという仕様への対処と、通常のアクセスが来ないように別ポートで

```
mongod --dbpath /path/to/db --port 37017
```

で直接mongoを起動します。
この時起動するユーザで新規ファイルは書き込まれてしまうので、復旧後にファイルの権限を戻すようにする必要があります。

起動したら、mongorestore実行してoplogから差分を取り込みます。
この時`--oplogLimit <timestamp>`で実行するoplogを制限できますが、指定時間以降のものは全く実行しないだけです。よって、mongodumpの時にqueryで処理してあげた方がやりやすいはずです。

```
mongorestore --port 37017 --oplogReplay oplogD
```

レプリカでも同様にします。replSetを使わずに起動しているのでoplogのリストアの結果はoplogには記録されません。

### レプリケーションを再開する

接続するホスト名など変わっていなければ、元の設定から起動するだけで復旧するはずです。レプリケーションのホストの情報などもmongoはデータベースに持っているためです。
CentOS6にyumでphantomjs 2.1.1をインストール


## 概要
* CentOS6にyumでphantomjs 2.1.1をインストールする
* repo.okay.com.mxのreposを使う

## 前提
* CentOS release 6.5 (Final)

## インストール
```bash
$ sudo yum install epel-release
$ sudo rpm -ivh http://repo.okay.com.mx/centos/6/x86_64/release/okay-release-1-1.noarch.rpm
$ sudo yum search all phantomjs
=========================================== N/S Matched: phantomjs ============================================
phantomjs.x86_64 : a headless WebKit with JavaScript API
phantomjs19.x86_64 : a headless WebKit with JavaScript API

  Name and summary matches only, use "search all" for everything.
$ sudo yum install phantomjs.x86_64
Loaded plugins: fastestmirror, versionlock
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * epel: ftp.riken.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package phantomjs.x86_64 0:2.1.1-1.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

===============================================================================================================
 Package                    Arch                    Version                        Repository             Size
===============================================================================================================
Installing:
 phantomjs                  x86_64                  2.1.1-1.el6                    okay                   14 M

Transaction Summary
===============================================================================================================
Install       1 Package(s)

Total download size: 14 M
Installed size: 42 M
Is this ok [y/N]: y
Downloading Packages:
phantomjs-2.1.1-1.el6.x86_64.rpm                                                        |  14 MB     00:31
warning: rpmts_HdrFromFdno: Header V4 RSA/SHA1 Signature, key ID ac25decd: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-OKAY
Importing GPG key 0xAC25DECD:
 Userid : Luis Daniel Lucio Quiroz <dlucio@okay.com.mx>
 Package: okay-release-1-1.noarch (installed)
 From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-OKAY
Is this ok [y/N]: y
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Warning: RPMDB altered outside of yum.
  Installing : phantomjs-2.1.1-1.el6.x86_64                                                                1/1
  Verifying  : phantomjs-2.1.1-1.el6.x86_64                                                                1/1

Installed:
  phantomjs.x86_64 0:2.1.1-1.el6
$ phantomjs -v
2.1.1
```

## See also
https://okay.com.mx/en/linux/rpm-repositories-for-centos-6-and-7.html
OpenAM 13.0.0 のセットアップ

# 概要
下記、関連リンクのインストールが完了した環境について、OpenAMの初期設定を行う

# 以下、手順のみ

1. http://hostname:8080/openam/ にアクセスする。
2. 「Create New Configuration」をクリックする。
3. 「I accept the license agreement」にチェックを入れて、「Continue」をクリックする。
4. 「Step 1: General」画面で管理者アカウントのPasswordを入力して、「Next」をクリックする。
5. 「Step 2: Server Setting」画面で「Next」をクリックする。
6. 「Step 3: Configuration Data Store Setting」画面で「Next」をクリックする。
7. 「Step 4: User Data Store Setting」画面で「OpenAM User Data Store」を選択して「Next」をクリックする。
8. 「Step 5: Site Configuration」画面で「Next」をクリックする。
9. 「Step 6: Default Policy Agent User」画面でPasswordを入力して、「Next」をクリックする。
10. 「Configuration Summary Details」画面で設定内容を確認して、「Create Configuration」をクリックする
11. 「Configuration Complete!」というメッセージが出れば完了。

途中処理で失敗する場合は、/etc/hostsや/etc/sysconfig/networkの設定を確認する。

## 関連
[OpenAMをEC2にインストールする](http://qiita.com/Tom3/items/e8bbac43f776ba6bb5d1)
PrivateGemを含むRailsアプリをDockerでBuildする為に

# What
自分用メモ

# 課題
private repository にあるGemを含んでいるRailsアプリを普通に `Dockerfile` で普通に `bundle install` すると、PrivateRepositryへのアクセス件がなくて落ちる

# どうしようか

認証情報をContainer上に持っていくのも有りといえばありだが、リポジトリに含める必要があったりして面倒だし怪しい。
よって、手間はあるが、以下のようにした。

1. `.gitignore` に `vendor/cache` をついか
2. `bundle package --all` を `docker-compose build` 前に実施しておく
3. `ADD vendor/cache __user_app_vendor/cache` をDockerfileに追加する

`bundle package --all` で一通り全部 `hoge.gem` としてキャッシュされる。
これを add してあげて、基本的にはここから参照してもらう。
Bundler側で勝手にNativeExtensionのGemは再ビルドしてくれる。

# 案内

えっ、PrivateGemがNativeExtension？　ご、ごめん :bow: 

# なんでこんなことしてたの？
英語にはこういった情報結構あったけど、日本語になかったから。
あと http://haito.github.io/slide_spawn_dockerable_rails/ こういうLTを社内でするため。
FS01BU (Mass Storage)を解析してみた

# FS01BU + 格安 SIM + Zynq で IoT が最終目標

USB のホスト機能を Zynq の Standalone で実現できつつある（中途半端）。最終的には格安 SIM とつなげて IoT なことをしてみたいのだが、その前段階として FS01BU と USB のプロトコルのやり取りをしてみた。

ボードはなぜか TB-7Z-020-EMC。

## TB-7Z-02-EMC の特殊事情
なぜか最初に USB HC のリセットをしないといけない。なぜだ～～。USB デバイスへの VBUS の供給は ULPI 経由。回路図を見ると(というかUMに書いてある) JP1 と JP2 もつなぐ必要がある。ULPI の OTG のレジスタに 0x67 を書き込む。(0x20 が VBUS 供給の指示)

# FS01BU との通信
FS01BU と USB のプロトコルに従い通信してみる

## まずはスピード
ポートが Enable になると Zynq の USB ホストは自動的に USB のスピードを判断してくれる(通常の EHCI にはない便利な機能）。Linux のドライバでは chipidea が使われれているので Zynq というより chipidea の機能かな？

PORTSC1 の PSPD が 0 になったので、FS01BU は Full Speed(12Mbps) と USB2.0 だけど High Speed(480Mbps) を使ってないことがわかる。

## GET DESCRIPTOR (DEVICE)
DEVICE の情報を取得する。この段階ではまだアドレスは 0 のまま。

```text:config.txt
12
01
00 02
00
00
00
40
9e 1c (Vendor ID = 0x1c9e)
ff 98 (Product ID = 0x98ff)
00 00
03
02
04
01
```
ベンダー ID が 0x1c9e でプロダクト ID が 0x98ff であることがわかる。

## SET ADDRESS
とりあえず 2 番を付与する。以降、この USB デバイスのアドレスは2。

## SET CONFIGURATION
本当は CONFIGURATION を GET DESCRIPTOR して番号を確認しなきゃならないんだろうけど、通常は１個しかサポートしないので、1を設定。そのあと念のために GET CONFIGURATION をして 1 になったことを確認

## GET DESCRIPTOR (CONFIGURATION)
ここはあまり自信がない。FS01BU は 1 番のインデックスの CONFIGURATION を取得しようとするとエラーになる（みたい？）。自分の理解では SET CONFIGURATION した番号を GET DESCRIPTOR でも設定すると思っていたのだが、、、もう一度 USB の仕様を確認した方がよい。とにかく FS01BU は 0 番のインデックスに”のみ”反応する。

ロングバージョンの結果は次の通り

```text:configuration.txt
9
02
20 00
01
01
01
e0
fa

09
04
00
00
02 (End Point 数)
08 (クラス:Mass Storage)
06 (サブクラス)
50 (プロトコル)
00

07
05
01
02
00
02
00

07
05
81
02
00
02
00
```

# FS01BU は Mass Storage (USB メモリ) だった
ということで、購入したばかりの FS01BU は　Mass Storage になっています。この時の Product ID は 0x98ff です。代替インタフェースもないようなので、おそらくベンダー固有のコマンドで USB シリアルに切り替えるのだと思います。

FS01BU のマニュアルにも最初は「ゼロインストール機能により、、、」と書いてあるので Mass Storage で起動して自動インストールをしてアクティベーション(?)することでモデムとして(USB Serial として) 使えるようになるのでしょう。
backlogのgitからjenkinsをbuild


# 前提
* jenkinsにはjenkinsのログインとbasic認証がかかっている
* gitのリモートリポジトリはbacklogを使用
    * 諸事情によりヌーラボが提供している Jenkins Backlog Pluginは利用しない
        * https://nulab-inc.com/ja/blog/backlog/jenkins-to-pull-request/

# 注意事項
* Backlogのwebhookの仕様
    * pull-requestイベントからbranch名を取得できないっぽい
        * pull-requestからjenkinsをbuildできない
        * pushはbranch名を取得できる
    * 不要なpush(remote branchの削除)等は自前で判断する必要がある

# 完成イメージ
* gitのpushにhook(webhook)して、jenkins上の対象のbranchのbuildを実行する
    * pull-requestに対してhookしたかったが先述の理由で断念
    * branch名を渡したいのでHubotないしは何らかしらの方法で連携する必要がある
        * [BacklogでWebhookが追加されたよ!!!Hubot経由でSlackに連携してみた - Qiita](http://qiita.com/mayukojpn/items/a9a9408c21a761adb7d0)
        * 今回は自前でgolangで書きました

# jenkins側の設定
* http://yuroyoro.hatenablog.com/entry/2012/12/20/175205
    * jenkinsサーバーのapacheで.htpasswdを設定
    * [jenkins自身のログイン認証](http://blog.eiel.info/blog/2012/11/19/jenkins-build-for-trigger-script/)が有効
        * 以上二つとも設定されている場合認証機能が競合しwebhookからのリクエストが実行できない(Basic認証が通らない)ため匿名ユーザーにビルドのみ権限を与えることで回避できる。
        *  `Jenkins` > `グローバルセキュリティの設定` > `アクセス制御` から匿名ユーザーに以下の権限を付与する

|全体<br/> Read |ジョブ<br /> Read |左記以外|
| --- | --- |---|
|○  |○  |× |

* ビルド対象のジョブ設定の `リモートからビルド` にチェックを入れる
    * `認証トークン` には適当なランダム文字列を入力
* 以上でcurlコマンドでbranchを指定してbuildが可能になったことを確認する

```command
# {PASSWORD}は.htpasswdのものを使用
curl -i -u {USERNAME}:{PASSWORD} 'http://{YOUR_JENKINS_SERVER}/jenkins/job/{YOU_JENKINS_JOB_NAME}/buildWithParameters?branch={BRANCH_NAME}&token={TOKEN}'
```

# backlog側の設定
* https://{YOUR-BACKLOG-DOMAIN}.backlog.jp/settings/webhook/{YOUR-PROJECT-NAME}/create
* `WebHook URL` にwebhookを受け付けてjenkinsにリクエストするアプリのURLを書く
* `バージョン管理に関するイベント`  > `Gitプッシュ` にのみチェックを入れ、`Webhookを追加する`を押す

* 以上でpushした際にwebhookがアプリに飛び、アプリからビルドのリクエストが飛べば問題なし

# まとめ 
* .htpasswdではまったので.htpasswdはないほうが望ましいのでは
* Jenkins Backlog Pluginを使ったほうが諸々楽にできそう（未調査）
Gazebo単体で使ってみよう

皆さんはROSを良く使っていると思います。そこで出てくる,Gazebo。こいつは何かご存知でしょうか。
[Gazebo](http://gazebosim.org/)とはロボットシミュレータです。物理演算を含んでおります。さてこいつは個別で提供されており、単体でインストールできます。

##ROSに使われているバージョンは古い!?
まず今の時点でよく使われているであろうROSはおそらくindigoであると思われますが,indigoで使われているGazeboのバージョンは2.2です。
一番新しいjadeでは5.0です。
2016年で一番新しいGazeboのバージョンは**7.0**です。
それってどうなの?って感じですが,実際に起動して適当にオブジェクトを置いてみると結構違いがあるとわかると思います。

![スクリーンショット 2016-03-24 15.24.13.png](https://qiita-image-store.s3.amazonaws.com/0/90422/d57262d1-a0b7-5cdb-6946-2d4f2f33cbed.png)
gazebo2.2.6

![スクリーンショット 2016-03-24 15.48.05.png](https://qiita-image-store.s3.amazonaws.com/0/90422/32e0837e-bbba-b61c-d858-e402d120843c.png)
gazebo7.0

見た目だけではなく,色々変わっております。とは言うものの,gazeboのバージョンを差し替えはできません。別の方法で制御する必要があります。


##gazeboを単体でインストールしてみよう
さて,とはいったもののほど難しいことではありません。公式ページに書いてあります。
今回はMac,Linuxのものにします。curlが必要なので,適宜インストールしてください。

`curl -ssL http://get.gazebosim.org | sh`


起動するには

`gazebo`

と端末で入力します。

また,
`gzserver`
と
`gzclient`
と入力することで起動することもできます。
英語初心者プログラマ向け多読コンテンツ

ずばり、[**SoloLearn**](http://www.sololearn.com/)がおすすめ。
[**SoloLearn**](http://www.sololearn.com/)とは、C++,Java,JavaScriptなどといった技術系の学習コンテンツ。
マルチプラットフォーム対応で、Android/iOS/Webはもちろん、WindowsPhoneまで対応してるらしい。

### 良い点

* 短い文章の説明→簡単なクイズの繰り返しなので、ちょっとした空き時間でもできる。
* ゲーム感覚で勉強できるよう工夫されているので、モチベーションを維持しやすい。
* コードが併記されているので、意味の類推がしやすい。
* 一石二鳥な気がする。（英語＆技術）
* code playgroundで実際にコードを動かしてみることができる。
* 無料！！

英語多読したいけど、しょーもない子供向けの本だとモチベーションが続かない。
けど本格的なビジネス書とか、英語のニュースサイトとかはちょっとしんどい。
という方におすすめです。
Rails4.2でactive_record_storeの大量ログを表示しない方法

セッションの保存にactive_record_storeを選択した時、コンソール上のログに大量のセッション情報が毎回出力されて困った事がある人向けの情報です。

rails s で開発サーバーを立ち上げた時、コンソールに以下のセッションログが大量に表示されて邪魔ですよね。

```
# ↓ このログが何十行にもなる
UPDATE "sessions" SET "data" = $1, "updated_at" = $2 WHERE "sessions"."id" = $3  [["data", "BAh7EE ... 以下略
```

activerecord-session_storeのコードを見ると logger.silence_logger で囲まれているのでERRORレベル以上じゃないとログが出ないコードに見えます。

https://github.com/rails/activerecord-session_store

```rb:activerecord-session_store/lib/action_dispatch/session/active_record_store.rb

def write_session(request, sid, session_data, options)
  logger.silence_logger do
```

ログのサイレンサーが有効になっていないのかな？と思ったのですが問題なく利用できる状態でした。

```ruby
puts logger.silencer
true
```

development.logを見るとログのサイレンサーが有効になっているので、デフォルトのログ設定で標準出力でのみサイレンサーが有効にならないようです。

ちなみにログのサイレンサーはログレベルを一時的に入れ替えてログ出力を制御する仕組みです。

```rb:activesupport/lib/active_support/logger_silence.rb
  def silence(temporary_level = Logger::ERROR)
    if silencer
      begin
        old_logger_level, self.level = level, temporary_level
        yield self
      ensure
        self.level = old_logger_level
      end
    else
      yield self
    end
  end
```

問題のログはsessionsテーブルに保存されるときに出力されるログです。

そのためピンポイントでログレベルを切り替える方が logger.silence_logger で解決するよりも簡単そうだったので以下のパッチを準備しました。

initializersの下に silence_active_record_store_log.rb と付けておいてください。

development環境でのみRails.logger.levelを一時的に入れ替えています。

```rb:config/initializers/silence_active_record_store_log.rb
module ActionDispatch
  module Session
    class ActiveRecordStore

      if Rails.env.development?
        alias :_set_session :set_session
        def set_session(env, sid, session_data, options)
          level = Rails.logger.level
          Rails.logger.level = Logger::INFO
          _set_session(env, sid, session_data, options)
          ensure
          Rails.logger.level = level
        end
      end

    end
  end
end
```

Rails5では set_session が write_session に置き換わるようです。

質問などあればコメント欄にお願いします。
ldapsearch の base64 decode 用 Python スクリプト

下記の Python 版。

OpenLDAP 2.4: 格納したUTF-8データの読み出し
http://yasu-2.blogspot.jp/2009/10/openldap-24-utf-8.html

ruby が入れられない環境だったので、デフォルトで入っていることが多い Python で動くものを作りました。
30分くらいで Python 思い出しながら書いたので出来はお察しです。
書く時間よりも思い出す時間の方が長いという…

```py:lsuf.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import sys, re

for line in sys.stdin:
    if re.match(r'^\w+::\s', line):
        label, b64item = line.split()
        print label, b64item.decode('base64')
    else:
        sys.stdout.write(line)
```

（@shiracamus さんがシンプルにしてくれたので反映しました。ありがとうございます！）
ApacheでIP制限とクライアント認証をor条件で運用する

#ApacheでIP制限とクライアント認証をor条件で運用する
あるIPから来たリクエストは無条件に許可し、それ以外のIPから来たリクエストについてはクライアント認証で許可不許可を判断したい。クライアント認証についての説明はよく見るが、上記のように併用する方法がなかなか見つからなかったのでメモ。
初めはsatisfy anyにすれば良いと思っていたが効かなかった。

##httpd.confにて下記設定をする。
尚、DirectoryディレクティブやLocationディレクティブでも使用できる。
許可するクライアント認証のコモンネームは複数指定する事が可能。
SSLVerifyClientをoptionalで、SSLRequireをorで運用する事が肝。

SSLVerifyClientについて

|値|意味|
|:--|:--|
|none|クライアント証明書の検証を行わない。|
|optional|クライアント証明書の提示があった場合は検証を行う。無い場合は処理を続行する|
|require|かならずクライアント証明書の検証を行う。|
|optional_no_ca|クライアント証明書の提示があった場合は検証を行う。また、クライアント証明書はCAに登録されていなくてもよい。|

```lang:httpd.conf
        SSLCACertificateFile /etc/pki/CAフォルダ名/cacert.pem
        SSLCARevocationFile /etc/pki/CAフォルダ名/crl.pem
        SSLVerifyClient optional
        
        Order allow,deny
        allow from all
        SSLUserName SSL_CLIENT_S_DN_CN
        SSLRequire (%{SSL_CLIENT_S_DN_CN} in {"コモンネーム1", "コモンネーム2", "コモンネーム3"}) ¥
                      or ¥
                   (%{REMOTE_ADDR} =‾ m/^xxx¥.xxx¥.xxx¥.xxx$/)
```

##クライアント認証について
クライアント認証については下記が参考になりました。
http://www.webtech.co.jp/blog/optpix_labs/server/1780/
Vimで文字コードや改行コードを直す


## 変換して保存（破壊的）
変換したい文字コードを指定する。UTF-8に変換したければ `utf-8` を指定。

```
:set fenc=[utf-8|sjis|euc-jp]
:set ff=[dos|mac|unix]
:wq

# 例
:set fenc=sjis ff=dos
```

## 変換して開く（非破壊的）
実際のファイルの文字コードを指定する。

```
:e ++enc=[utf-8|sjis|euc-jp]
:e ++ff=[dos|mac|unix]

// 両方指定するときは一回で指定
:e ++enc=utf-8 ++ff=mac
```

ちなみに `ff` は `fileformat` 、 `fenc` は `fileencoding` の略です。

### 追記
[コメント](http://qiita.com/doranekohc/items/f88ae9a4122fc48dce03#comment-caa4c2a2147e3e115e0b)頂きました。ありがとうございます。

`:e ++enc=xxx` で変換できない文字はデフォルトだと `?` になるため、これを避けるためには `:e ++enc=xxx ++bad=keep` とします。


## おまけ: 現在の文字コード・改行コードを確認

```
:echo &fenc
:echo &ff
```

`:set statusline` で `%{&fenc}` `%{&ff}` を含めてあげるとステータスラインに常に表示させることもできます。
Swift 2.2 で導入された#selectorをViewControllerごとに一元管理して可読性を上げよう

# Swift2.1以前と2.2以降の比較
## Swift2.1以前の書き方

```ViewController.swift
let button = UIButton(type: .System)
button.addTarget(self, action: Selector("buttonTapped:"), forControlEvents: .TouchUpInside)

func buttonTapped(sender: UIButton) {
    //Button Tapped
}
```
セレクターは文字列を指定して生成していたのでtypoしていてもコンパイル時に気づくことができなかった

## Swift2.2の書き方

`#selector`が導入されたことで下記のような書き方に変わった

```ViewController.swift
let button = UIButton(type: .System)
button.addTarget(self, action: #selector(ViewController.buttonTapped(_:)), forControlEvents: .TouchUpInside)

func buttonTapped(sender: UIButton) {
    //Button Tapped
}
```
これによりtypoしてもエラーが出るので安全になった

# 課題
* Swift2.1以前の時よりも1行のコード量が増える

```swift
//Swift2.1以前
button.addTarget(self, action: Selector(“buttonTapped:”), forControlEvents: .TouchUpInside)

//Swift2.2以降
button.addTarget(self, action: #selector(ViewController.buttonTapped(_:)), forControlEvents: .TouchUpInside)
```

* 大きなViewControlerになると色々なイベントのアクションとしてセレクターを使うけれど、セレクターがViewControllerの様々な箇所に散らばりがち
* 複数から同じセレクターの処理を使う時にどうやってまとめるべきか

要は可読性をもっと良くしたいよね

# 解決方法
ViewControllerごとに`Selector`構造体をprivate拡張してセレクターのタイププロパティを生やしてあげる

```ViewController.swift
private extension Selector {
    static let buttonTapped = #selector(ViewController.buttonTapped(_:))
}
```

呼び出し側は下記のようになる

```ViewController.swift
let button = UIButton(type: .System)
button.addTarget(self, action: .buttonTapped, forControlEvents: .TouchUpInside)
```

* `button.addTarget(self, action: #selector(ViewController.buttonTapped(_:)), forControlEvents: .TouchUpInside)`と書いている場合よりずっと簡潔に書ける
* ViewControllerが大きくなってセレクターを使ったイベント処理が増えた時も、セレクターの生成は`Selector`構造体にタイププロパティを拡張して増やすことにより、セレクター生成処理のコードが散らばらないし、セレクターの修正とかしたい時も1箇所にまとまっているから簡単にできるし可読性が上がる気がする

# まとめ
ViewControllerごとにセレクターを一元管理することで可読性があがるよね

というようなことが [ここ](https://medium.com/swift-programming/swift-selector-syntax-sugar-81c8a8b10df3#.a2hm4l2mp) に書いてあり、良いと思ったので共有です
Goで配列に対してビットワイズに任意の関数を適用する関数

配列の要素それぞれに対してある処理をしたい時があります。Pythonなら+演算子でいけますがGoの場合は型が違うエラーが出ます。

```go
package main

import "fmt"

func main() {
	v := []float64{1,1,1,1}
	fmt.Println(v+1)
}

```

```go
prog.go:7: invalid operation: v + 1 (mismatched types []float64 and int)
```

そこで任意の型、任意の数の引数を持つ関数を配列の要素それぞれに適用する関数を考えました。

```go
func BroadcastFunc(v []float64, f func(float64, ...interface{}) float64, args ...interface{}){
	for i,_ := range v{
		v[i] = f(v[i], args...)
	}
}
```

実行例
https://play.golang.org/p/MvuCcmXvkC

メリットを考えてみましたが、for文を書かなくていいのでネストが浅くなるぐらいですかね。。。
MySQLからEmbulkを使用してGoogleBigQueryへデータをロードする


## ユースケース
RDBへ書き込んでいたログデータをBigQueryのようなDWHに取り込みたい時に
簡単にバルクインサートしてくれます。
（もちろんRDBとBigQueryだけの関係でもありませんが）

特にログデータとは限らないのですが、時間とユーザーさんの数が増えるごとに「永遠に増え続けるデータ」をRDBへ書き込んでいた。
そのまま時間が経ってしまい「単一のTBLのレコード数が数千万になってしまった」
時に利用すると良いと思います。

「最初からFluentdで送っておけば良いじゃない」というのはごもっともですが。

### Embulkを使わない方法

mysqldump -> csv -> gcs(awsのs3のような物) -> Big queryヘロード
が妥当かと思います。実際やってみましたが簡単です。

が、一回きりのロードであればこれでもいいのですが
「定期的に取り込みたい」
「バルクロードでちゃんと進捗が見たい」
「あのTBLもこのTBLも取り込みたい」

となるともう少し「設定」っぽいやり方がしたくなります。 
そこでEmbulkを利用することにしました。

## Embulkとは
本家が綺麗に図解されています。
Fluentdで最初っから送っておけばこんな思いしなくていいのに。
というのがとても感じられます。
https://github.com/embulk/embulk

EmbulkがMySQLからデータを引っ張り出してきてくれて、
一時ファイルに保存してBigQueryにデータをロードしてくれます。

## 前提
GCP, BigQueryのセットアップは済んでいること
http://heartbeats.jp/hbblog/2014/06/google-bigquery.html
参考になります。

## 環境
Amazon Linux AMI
MySQL5.6
embulk 0.8.8

### 補足
会社で利用しようとするとクレジットカード登録だったり、すでに有るGoogleAppsとの兼ね合いだったりで何やかんやと面倒な事が多いです。早めに動く事とそれなりに気長に考える事も重要。


## Embulkのインストール

### インストール（本家のコピペ）
```
curl --create-dirs -o ~/.embulk/bin/embulk -L "http://dl.embulk.org/embulk-latest.jar"
chmod +x ~/.embulk/bin/embulk
echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
```

### プラグインのインストール

```
embulk gem install embulk-input-mysql
embulk gem install embulk-output-bigquery
```
## 動かしてみる

必要なファイルは2つだけ。

* MySQLのTBL毎にymlファイル
* BigQueryのTBL毎にjsonファイル

### 例
#### IN
* MySQL
 * Database -> hoge
 * Table -> users

#### OUT
* BigQuery
  * Dataset -> foo
  * Table -> users

作成ファイル

* users.yml
* users.json

users.yml(mysqlへの接続情報、取得設定、BigQueryへの接続情報、フォーマットを記述）

```
in:
  type: mysql
  host: HOST_NAME
  user: ********
  password: ********
  database: hoge
  table: users
  select: id,user_name, created, modified
out:
  type: bigquery
  auth_method: json_key
  json_keyfile: # jsonのクレデンシャルファイル
  path_prefix: /tmp # 一時ファイル作成場所
  file_ext: .csv.gz
  source_format: CSV
  project: BigQuery側のProject
  dataset: foo
  auto_create_table: true # 自動でTBL生成
  table: users
  schema_file: users.json
  formatter: {type: csv, charset: UTF-8, delimiter: ',', header_line: false}
  encoders:
  - {type: gzip}
```

users.json(BigQueryのスキーマ情報を記述）

```
[
  {
    "name": "id",
    "type": "INTEGER"
  },
  {
    "name": "user_name",
    "type": "STRING"
  },
  {
    "name": "created",
    "type": "TIMESTAMP"
  },
  {
    "name": "modified",
    "type": "TIMESTAMP"
  }
]
```

実行
```
embulk run users.yml
```

### input(mysql)とoutput(big query)の設定オプション

https://github.com/embulk/embulk-input-jdbc/tree/master/embulk-input-mysql

https://github.com/embulk/embulk-output-bigquery

outputを見ることが多いとおもう

## crondのようなバッチで定期的にTBLを作り変える

GoogleBigQueryは行の削除や更新は想定されていないように見受けられるので、
最新のデータを毎回ロードしてやるのがいいと思う。

GoogleBigQuery標準のコマンドでTBLを毎回削除して、
毎回作り直す。

```
# TBLを削除(引数はdataset.table名)
bq rm -f foo.users 
# データをロード
embulk run users.yml
```

これをcrondに仕込んでおく。

### 参考

http://qiita.com/yuichi_komatsu/items/3aae65c362b2a57f6fbf
【Windows】Robocopyとタスクスケジューラーで定期的なバックアップ

# **やりたいこと**
WindwosServer2012 Foundationのエディションで日次バックアップの仕組みを入れたい！
しかしWindwosServer2012 Foundationのエディションにはバックアップ機能がない・・・。

# **どうするか**
標準搭載されているツール`Robocopy`を使ってバッチファイルを作りタスクスケジューラーで回して日次バックアップを取得しているという情報がちらほら。

# **やってみた**
## **やった内容**
- バッチファイルの作成
- テスト
- タスクスケジューラーの登録

### **バッチファイルの作成**
- バックアップの実施とバックアップ実行ログの取得を行う

```bat:robocopy_daily_backup.bat
set logfile="D:\backup_log\%date:~0,4%-%date:~5,2%-%date:~8,2%_robocopy.log"
robocopy C:\Users\administrator\Pictures \\192.168.1.11\Document\Pictures /R:0 /W:0 /LOG+:"%logfile%" /TEE /XJD /XJF /NP
```

### あとはバッチファイルが正常に動作するかテストしてみてタスクスケジューラーにバッチファイルを登録するだけ！
Emacsでtssとflycheckを使う

[tss](https://github.com/aki2o/emacs-tss)はemacsでtypescriptを編集する場合にauto-completeとflymakeを補助するパッケージ
他の言語でflymakeの代わりにflycheckを利用しているのでtypescriptでも同じようにしたかった
typescriptのflycheckには[flycheck-typescript-tslint](https://github.com/Simplify/flycheck-typescript-tslint)を使っている

```el
(require 'typescript)
(add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode))

(require 'tss)
(setq tss-popup-help-key "C-:")
(setq tss-jump-to-definition-key "C->")
(setq tss-implement-definition-key "C-c i")

;; (tss-config-default)は使わない
;; 中で(add-hook 'after-save-hook 'tss-run-flymake t)されているから
(defun typescript-setup ()
  (setq typescript-indent-level 2)
  (flycheck-mode t)
  (flycheck-typescript-tslint-setup)
  (tss-setup-current-buffer))

(add-hook 'typescript-mode-hook 'typescript-setup)
(add-hook 'kill-buffer-hook 'tss--delete-process t)

```
ローカルpypiリポジトリを作る

## やりたかったこと
pypiのローカルリポジトリサーバを作りたい。
`pypiserver`というパッケージで簡単に作れるみたいなので試した。

## やったこと
###`pypiserver`のインストール＆起動

CentOS7で試した。

```
# pip install pypiserver
# mkdir ~/pypi_pkg
# nohup pypi-server -p 8080 ~/pypi_pkg &
```
これで`~/pypi_pkg`ディレクトリに`tar`なり`.whl`の中のパッケージファイル入れておけば、`http://<ipaddress>:8080/simple/`で公開できます。
ディレクトリ内に複数バージョンを突っ込んでおいてもいい感じにpypiっぽく公開してくれます。
もちろんgunicornとかApacheといった他のWSGIサーバでも動かせます。


使うときはこう
httpsじゃないとエラーが出るので`--trusted-host`オプションをつけてます。
※公式のpypiと併用するとき

```
# pip install　--trusted-host <ipaddress> --extra-index-url http://<ipaddress>:8080/simple/　<package_name>
```

※ローカルで立てたpypiだけを使うとき

```
# pip install　--trusted-host <ipaddress>  --index-url http://<ipaddress>:8080/simple/ <package_name>
```

ドキュメントによると、パッケージのアップロードとか操作もできるみたいです。（未確認）


参考
--
* [pypiserver](https://pypi.python.org/pypi/pypiserver)
遠い昔、はるか彼方の銀河系の カレンダー


## 問題
https://codeiq.jp/q/2597
https://codeiq.jp/q/2598

## 概要
特殊な暦(キュラ歴・ラゲ歴)で、与えられた日の曜日を答える問題。
ABDFHIK月は31日、CEGJ月は32日。ただしラゲ歴の閏年(4000で割りきれるか、20で割り切れかつ80で割り切れない)はE月が31日になる。
問題文通りに実装すれば正解できるが、問題は、 **バッジを獲得するには短いコードを書く必要がある** (71/117バイト以下)ことにある。

## 戦略
数学的に曜日を求める式が得られれば繰り返しなしに解くことができる。つまり、コード量を大幅に削減できる。
普通の暦であれば、[ツェラーの公式](https://ja.wikipedia.org/wiki/%E3%83%84%E3%82%A7%E3%83%A9%E3%83%BC%E3%81%AE%E5%85%AC%E5%BC%8F)を使えばよいが、今回は暦が違う。よって、キュラ歴・ラゲ歴でのツェラーの公式に相当するものを求める必要がある。

## 方法

### ツェラーの公式

いきなり問題を解くのではVerifyが大変なので、まず普通の暦でツェラーの公式を求めてみることにする。

まず、配列bに当該月までの累計日数を代入する。ただし2月は閏年か否かで日付けが異なるので、最初の要素を3月とする。

```
b=[];x=0;11.times{|i|b<<(x+=30+0b011010110101[i])} # 最上位=2月
# => [31, 61, 92, 122, 153, 184, 214, 245, 275, 306, 337]
```

3月までの日数は31、4月までは61、5月までは92…といった具合である。

次に、公式を見ると、その年までの日数以外は、n*(MONTH+start)/d-diffという形になっていることがわかる(MONTHは0から始まるとする)。d、start、nを決定するとdiffは`n*start/d-b[0]`により得られるので、先述の式が0〜11のすべての場合においてbと一致するようなd、start、nを適当な閾値を設定して全探索すればよい。

コードを示します(変数mはnのことです)

```
(1..1/0.0).each{|d|
	STDERR.puts '[*] %d'%d
	(1..6).each{|st|
		m=1
		m+=1 while m*st/d<firstday
		while m*st/d<firstday+200
			diff=m*st/d-firstday
			a=b.size.times.map{|i|(m*(st+i)/d-diff)} # (i-1)月までの日数
			if a==b
				p [m,st,d,diff] # [153, 5, 5, 122]
				exit
			end
			m+=1
		end
	}
}
```

ここで、本来1年は2月始まり(0-indexed)であるが、プログラムは0月始まりとしている。月を2〜13ではなく0〜11に読み替えて処理する。

```
x,y,z=2016,3-1,24
(x-=1;y+=12)if y<2
p (31+28+365*(x-1)+x/4-x/100+x/400+z+153*((y-2-1)+5)/5-122)%7
# => 4
```

木曜日と求めることができた。

### キュラ歴

`b=[];x=0;10.times{|i|b<<(x+=31+0b01001010100[i])}`について探索すると、`[220, 1, 7, 0]`が導かれる。
よって、`(345*(x-500)+z+220*((y-1)+1)/7+6)%7`が答えとなる(+6は、u曜日開始からt曜日開始への変換)。
式を整理して入力部分を付けると以下のようになる。

```
x,y,z=gets.split(?.);putc (x.to_i*2+z.to_i+220*(y.ord-65)/7)%7+116
```

66バイトとなり、バッジ要件を満たすことができた。

### ラゲ歴

`b=[];x=0;10.times{|i|b<<(x+=31+0b00100010010[i])} # 最上位=E月`について探索すると、`[219, 3, 7, 62]`が導かれる。月を5〜15ではなく0〜10に読み替えて処理する。

`(31+31+32+31+31 + 345*(x-1600)-x/20+x/80-x/4000+z+219*((y-5-1)+3)/7-62+6)%7` (0<=y<=10)を整理すると以下のようになる(普通の暦と閏年に関する符号が逆なことに注意)。

```
x,y,z=gets.split(?.)
x=x.to_i
y=y.ord-68
(x-=1;y+=11)if y<2
putc (6+2*x-x/20+x/80-x/4000+z.to_i+219*y/7)%7+116
```

110バイトとなり、バッジ要件を満たすことができた。

## まとめ

ツェラーの公式について深く学ぶことができた問題だったと思います。しかし、昔はコンピュータがなかったので、試行錯誤が辛かっただろうなぁと思いました。

## コードリスト

https://github.com/cielavenir/codeiq_solutions/commit/5b3a59cb4a1ded089d24d4cd27b9ef775c4a20b9