OmniAICreator/Qiita-1.07M huggingface dataset:
【Sophos】手動でパターンファイルのアップデート

# 概要
Sophosは、通常であれば、数時間おきに自動的にパターンファイルを取得してくるように設定できる。
しかし、自動取得とした場合、取得してきたバージョンによっては、それによって、不具合が発生してしまう場合がある。また、大きなパターンファイルがあった場合は、サーバに負荷をかけてしまう。そのため、可能であれば、手動でのパターンファイルのアップデートを推奨し、そのスクリプトを記載する。

# 環境
RHEL 5.6、　RHEL6.1
スクリプトを深夜などサービスが止まっている時間に実行されるよう、cronに登録する。

# スクリプト
sav-update.sh

```

#!/bin/bash
#
# sav-update.sh                       ver.1.0.0
#
# Author :
#      hogehoge hogehoge
#
# Usage sav-update.sh
#
# Description
#      Virus Pattern Files update.
#
# Caution
#
################################################################

# Variable
HOME=/root/Tools
DATE=date '+%Y%m%d %H:%M:%S'` 
LOG=${HOME}/log/savupdate.`hostname`.log

### LOTATION
if [ -e $LOG }; then
    :
else
    touch $LOG
fi

while [ $i -gt 1 ]
do
    if [ -e $LOG.`expr $i -1` ]; then
        mv $LOG.`expr $i - 1` $LOG.$i 2>&1 1>/dev/null
    fi
    i=`expr $i -1`
done

if [ -e $LOG ]; then
    mv $LOG $LOG.1 2>&1 1>/dev/null
fi

### Start Date
echo "------------------ Virus Pattern Files updates START ${DATE} ------------------" >> ${LOG}

### Virus Pattern Files updates
export SAVUPDATE_IS_INTERACTIVE=1
/opt/sophos-av/bin/savupdate -v5 >> ${LOG}

if [ $? -eq 0 ]; then
    :
else
    echo "${DATE} Virus Pattern Files UPDATE FAILED" >> ${LOG}
fi

### END Date
echo "------------------ Virus Pattern Files updates END ${DATE} ------------------" >> ${LOG}

```

# cronへの登録
crontab -eで登録。

# ログ出力例
ここでは記載しない。スクリプト内に記載されたものだけでなく、savupdateコマンドで出力されたログも記載される。
日次でローテーションする設定も入るため、ログには、1回分のアップデートのみが記載される。
git-new-workdir + rsync でワーキングディレクトリの Git 管理外のファイルも複製する 

割りと有名だが [git-new-workdir](https://github.com/git/git/blob/master/contrib/workdir/git-new-workdir) というコマンドで、ワーキングディレクトリを複製できる。

簡単に仕組みを説明すると、複製先には ```.git``` 内のファイルがシンボリックリンクで参照されるという、とてもわかり易い単純な原理になっている。この性質のため、リモートブランチを個別に更新する必要はなく、 stash の内容はコピー先とコピー元で共有される。

しかし、 ```git-new-workdir``` では Git で管理していないファイル (```.gitignore``` で無視しているファイル) や、
まだコミットしていないファイルまでは複製されない。

単にコミットしていないだけならば、 ```git stash``` した後に、両方のディレクトリで ```git stash apply``` すれば共有できるのだが、 ```.gitignore``` で無視しているファイルをコピーしたいケースもよくあると思う。（例えば Node のプロジェクトで ```node_modules``` を無視してる時とか）

そういう時は、 ```git-new-workdir``` した後に ```rsync``` で他のファイルもコピーすればいい。
ただし ```.git``` ディレクトリは ```git-new-workdir``` で複製した方を使ったほうが楽なので、これは rsync の複製からは除外する。

※

## シェルスクリプト化したもの

けっこうこれを何度もやっているので、シェルスクリプト化することにした。
```rsync``` の引数の ```srcdir``` には末尾に ```/``` を常に加えている。
( 冗長だが ```rsync``` 特有の「スラッシュ忘れて死亡」よりは手軽に安全 )

```bash:cp-workdir
#!/usr/bin/env bash
set -eu

if [ "$#" -ne 2 ]; then
    echo "Usage: $0 source_dir target_dir" >&2
    exit 1
fi

srcdir="$1"
dstdir="$2"

git-new-workdir "$srcdir" "$dstdir"
rsync -Hax --exclude .git "$srcdir/" "$dstdir"
```

これを適当なディレクトリに配置して PATH を通しておけば良い。
もちろん、元の ```git-new-workdir``` にも PATH を通しておく必要がある。

## 使い方

```console
$ cp-workdir コピー元ディレクトリ コピー先ディレクトリ
```

## 参考

http://subtech.g.hatena.ne.jp/secondlife/20121207/1354854068
http://qiita.com/snaka/items/2a19f5dca568329f8f8e
http://qiita.com/yuya_presto/items/dcebbebc6b3d9cf6f542
http://qiita.com/nagais/items/7403411b4aa193d0fa0d
一定時間だけ立ち上がるサーバーを書いた


一定時間だけ立ち上がって自動的に終了するサーバーをGoで書いてみた。
あんまり用途はないのかもしれないが、例えばcronで毎日0:00から5分だけ立ち上がっていてそこにアクセスしてサーバーメトリクスを収集するみたいな使い方が出来るかもしれない。

いちおうコードの解説。
main関数のところだけコードをの詳細を書いてみる。
まずはじめに、`runServer()` でサーバーを立ち上げる。
次に、 `time.Tick t` で一定時間経過後にシグナルを送るようなselectループを作成する。
`time.Tick et` はただのデバッグ用のコードなので削除しても構わない。
最後に、 `チャネル ch ` で入力を待って終了する。

``` go
func main() {
    go runServer()

	t := time.Tick(time.Duration(duration) * time.Second)
	et := time.Tick(time.Duration(1) * time.Second)
	go func() {
		for {
			select {
			case <-t:
				ch <- true
			case <-et:
                // debug code
				fmt.Printf("[%d] server running!\n", time.Now().Unix())
			}
		}
	}()
	_ = <-ch
	fmt.Println("Finished.")
}
```

試しに、3秒で終了するように動かしてた結果がこんな感じ。
3回デバッグ用のコードが出力されて終了している。

``` sh
% go run hey_server.go -duration=3
[1446923055] server running!
[1446923056] server running!
[1446923057] server running!
Finished.
```

----

以下、コード全体。


``` go
package main

import (
	"flag"
	"fmt"
	"log"
	"net/http"
	"time"
)

type BaseHandler struct {
	Name string
}

func (bh *BaseHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	if bh.Name != "" {
		fmt.Fprint(w, "Hey "+bh.Name+"!")
	} else {
		fmt.Fprint(w, "Hey World!")
	}
}

func runServer() {
	mux := http.NewServeMux()
	bh := &BaseHandler{Name: name}
	mux.Handle("/hey", bh)

	addr := fmt.Sprintf(":%d", 8080)
	err := http.ListenAndServe(addr, mux)
	if err != nil {
		log.Fatal(err)
	}
}

var ch = make(chan bool)

var name string
var duration int

func init() {
	flag.StringVar(&name, "name", "", "your name")
	flag.IntVar(&duration, "duration", 60, "working time")
	flag.Parse()
}

func main() {
    go runServer()

	t := time.Tick(time.Duration(duration) * time.Second)
	et := time.Tick(time.Duration(1) * time.Second)
	go func() {
		for {
			select {
			case <-t:
				ch <- true
			case <-et:
                // debug code
				fmt.Printf("[%d] server running!\n", time.Now().Unix())
			}
		}
	}()
	_ = <-ch
	fmt.Println("Finished.")
}

// https://gobyexample.com/select

```
Mac（El Capitan）でNode.js 5.0.0を使ってサクッとWunderline導入

[Wunderlist](https://www.wunderlist.com/ja/)のCLIであると見かけた[Wunderline](http://www.wunderline.rocks)。

準備します。自分メモ残します。anyenv導入済み前提です。

# 環境
- OSX El Capitan Version 10.11.1

# インストール
```bash
$ anyenv update
$ ndenv install v5.0.0
$ ndenv global v5.0.0
$ npm install -g wunderline
```

# CLIENT ID/access tokenの取得
[ここ](https://developer.wunderlist.com/apps/new)で下記を入力して`CREATE ACCESS TOKEN`ボタンをクリックしてCLIENT IDとaccess tokenを取得。
    1. `NAME`
    2. `APP URL`
    3. `AUTH CALLBACK URL`

なお、2と3に関しては、validation通すためにも適当なURLが必須なようです。

# CLIENT ID/ACCESS TOKENを配置
```bash
$ vim ~/.wunderline
$ wunderline auth
Please create a Wunderlist Application before you proceed, you can do so over
here: https://developer.wunderlist.com/apps/new, once that is done please enter
your access token and client id below.
? CLIENT ID xxxxxxxxxxxxxxxxxxxx
? ACCESS TOKEN xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Thanks maosanhioro, Wunderline has been authenticated.
```
サブコマンド`auth`を実行するとCLIENT IDとACCESS TOKENを聞いてくれるので先ほど得られたIDなりTOKENなりを入力します。
これの実体は`~/.wunderline`にあります。

# 使う
```bash
$ wunderline -h

  Usage: wunderline [options] [command]


  Commands:

    auth            Authenticate Wunderline
    add [task]      Add a task to your inbox
    inbox           View your inbox
    starred         View starred tasks
    today           View tasks due today
    week            View tasks due this week
    all             View all of your tasks
    overdue         View overdue tasks
    search [query]  Search your tasks
    list [query]    Search your lists
    open            Open Wunderlist
    export          Export your data
    whoami          Display effective user
    gc              Delete completed tasks
    set-platform    Set your preferred application platform
    flush           Flush the application cache
    help [cmd]      display help for [cmd]

  Options:

    -h, --help     output usage information
    -V, --version  output the version number

$ wunderline add -h

  Usage: wunderline-add [task]

  Add a task to your inbox

  Options:

    -h, --help         output usage information
    -l, --list [name]  Specify a list other than your inbox
    --today            Set the due date to today
    --tomorrow         Set the due date to tomorrow
    --due [date]       Set a specific due date
    --note [note]      Attach a note to the new task
    -o, --open         Open Wunderlist on completion
    -s, --stdin        Create tasks from stdin
```

```bash
$ wunderline add 新規タスク --today
$ wunderline today
INBOX (1)
新規タスク                                                   Today        ☆
```
期日を今日にして登録してすぐ表示した、という確認。よさそう。

# 感想
`wunderline`コマンド実行してから認証経由してAPI叩くまでの時間が少しかかる模様。

しかし登録と表示はこれで十分そうなので他の便利用途を見つけていきたい。
GitHub Pagesでga-beaconを使ってリアルタイムアクセス解析

# はじめに
Github Pagesのリアルタイムアクセス解析をするため，ga-beaconを使ってみようと思いました．

# ga-beaconとは
Google Analyticsと連携する，Webビーコン型リアルタイム解析ツールです．

# ga-beaconの導入方法
1. Google Analytics に登録
1. 新しいプロパティの作成
1. Websiteを選択
1. Website name  
識別できればいいので何でも良いです．
1. WebSite URL  
`https://ga-beacon.appspot.com/` と入力．
1. Get Tracking ID  
`Get Tracking ID` をクリックし，ID( `UA-XXXXXXXX-X` という形式のもの)を控える．
1. アクセス解析を行いたいページに以下のようなHTMLを追加  
Tracking IDとURLはご自身のものに変更してください．ページ内であれば，貼り付け箇所はどこでも構いません．ただし，解析したい全ページに貼り付ける必要があります．

```
<a href="http://yourusername.github.io/index.html">
  <img src="https://ga-beacon.appspot.com/UA-XXXXXXXX-X/yourusername.github.io/index.html"/>
</a>
```

- オプション  
上のHTMLの`img src` で指定したURLの末尾に以下のオプションをつけることができます．
オプション無しだと ![スクリーンショット 2015-11-07 10.56.31.png](https://qiita-image-store.s3.amazonaws.com/0/94551/434cf493-8af4-a71a-4efc-235b19b97a83.png)のように表示されます．  
?pixel：ビーコン画像を表示しない  
?flat：フラットなデザインに変更  ![スクリーンショット 2015-11-07 10.55.13.png](https://qiita-image-store.s3.amazonaws.com/0/94551/b3e0c7cc-28ce-b2e2-aa34-270656cca873.png)  
?flat-gif：フラットなデザインに変更  ![スクリーンショット 2015-11-07 10.56.12.png](https://qiita-image-store.s3.amazonaws.com/0/94551/f9233439-ad7b-38b8-1665-ed5f931a23f3.png)

これでおしまいです！ 
使えるようになるまで約1日待ちましょう！

# ステータス「トラッキングがインストールされていません」を解決する

正しく認識されていないと項目`トラッキングコード`に「トラッキングがインストールされていません」と表示されます．
認識されると，「ステータス: データを受信しています」と表示されます．
認識されるようになるまで24時間程度はかかるようなのですが，時間が経ってもこのように表示される場合の解決方法を書きます．

## 解決方法1
`アナリティクス設定` → `トラッキング情報` → `User-ID` と選択します．
そこに記載されている以下の項目の設定が済んでいるかどうか確認します．
`User-IDに関するポリシーの確認` → `User-IDの設定` → `User-IDレビューの作成`
これができていないと，User-IDの機能が有効化できないようです．

## 解決方法2
`トラッキング情報` → `参照元除外リスト` と選択します．
ここにURLが追加してある場合は削除しましょう．

# 補足
項目 `トラッキングコード` の `ウェブサイトのトラッキング` のソースコードを貼る必要があるのか悩みました．貼る必要はありません．

# 参考URL
- https://github.com/igrigorik/ga-beacon
- Github Pagesでリアルタイムアクセス解析を行う  
http://3100.github.io/blog/2015/04/06/analytics-for-github-pages.html
- 「トラッキングがインストールされていません」を改善する方法  
http://oxynotes.com/?p=8271
- Googleアナリティクス基礎：設定してるのに動かない時の対応  
http://www.kagua.biz/help/config/dousakakunin.html
vagrant + VirtualBox でRailsを動作させるまでにハマったところ

VagrantとViutualBoxで用意した仮想環境にRailsを導入するまでにハマったところまとめ。

# RVMでRubyをインストール出来なかった

RVMをインストールしたときの注意書きを見落としていたので、

1. 仮想環境のユーザーにRVMを追加→再度ログイン
2. パスを反映する

>
[rvmでruby をインストール出来なかったので色々やってみた。](http://qiita.com/emahiro/items/f19c48cb6304267fce70)

#railsサーバーを起動するまで

以下を参考にしました。

>
[Vagrant で Ruby on Rails 4 の環境構築](http://qiita.com/Salinger/items/20f466ffe7cc0c04b010)

ここでrails serverを起動するまでは行ったのですが、http://localhost:3000でアクセスすることができませんでした。

原因はVagrantでポートの設定を指定なかったからでrails serverを起動した際にアクセスする3000版のポートをVagrantFileで設定することが必要でした、

```rb

config.vm.network "forwarded_port", guest: 3000, host: 3000

```

ここで3000番を指定してVagrantを起動して再度rails serverを起動させると無事ブラウザ経由でRailsに繋がりました。
ChromeExtensionを作る際にちょっとしたおもてなしを添える

Chrome Extensionはユーザーのインターネット体験におもてなしを添えるのによく利用されますが、ちょっとした心遣いで更におもてないしを添えることが出来るという知見を最近いくつか得たので共有したいと思います。

## `chrome://`での挙動

- `about:blank`や`chrome://history/`などのページではcontent scriptを挿入することが出来ないので、基本的にはcontent scriptを利用するものが動かすことができません。
- 以下の例でも同様ですが、事前に`chrome.tabs.onUpdate`や`chrome.tabs.onActivated`などを利用してpopup buttonを押せなくしておくなどするとユーザーに優しいのではないでしょうか。

## インストール直後の挙動

インストール後にcontent scriptをインジェクションする場合、その前にタブをリロードする必要がありますが、これを良い感じに事前にハンドリングする方法が無いので、ちょっとした工夫があると良さそうです。
- 1つの案としては`chrome.runtime.onInstalled`などでそういう旨を出すページを表示するのも良いでしょう。
- 自分の場合は`chrome.tabs.executeScript`で挿入に失敗した際には`callback`の中で`chrome.runtime.lastError`に値が入るので、それを確認して`confirm`を出して、`chrome.tabs.reload`でreloadするという感じにしています。

## Chrome Web Storeなどでの挙動

- [Chrome Web Store](https://chrome.google.com/webstore/)でExtensionを利用してcontent scriptを挿入しようとすると、Chromeから`The extensions gallery cannot be scripted.`というerror message付きで例外が飛んできます。
    - 以前は`--allow-scripting-gallery`の起動オプションを付けることで許可できましたがChrome35で削除されました
- それとGoogleのログインページでも`The sign-in page cannot be scripted.`
という例外が同様に飛んできます。
- これらのページではリロードしても動くように出来ることはないので、前述のようにエラーを出すと不都合があります。
  - Chromeが返すエラーメッセージに`cannot be scripted`が含まれるのはこの2種類だけなので、そのあたりで比較して良い感じのalertを出してあげると親切なのではないかと思っています。


この件に関してはStack OverflowにChromiumの該当箇所へのリンク付きで詳しく載っています。[Chrome Extension Content Script on https://chrome.google.com/webstore/ - Stack Overflow](http://stackoverflow.com/questions/11613371/chrome-extension-content-script-on-https-chrome-google-com-webstore)
Ubuntu(Linux)上で、dnxを使ってASP.NET 5を実行する。

##概要
本記事は、長沢智治さんのブログ記事[dnx を用いた Linux 上での ASP.NET 5 アプリの開発・実行 ー 基本編](http://re-workstyle.com/articles/dnx-aspnet5-on-linux-01/)の写経です。元記事は、ユニットテストや継続的インテグレーションについても解説されていますので、より詳しく知りたい方は、そちらを参照された方が良いでしょう。本記事は私が躓いたり迷った部分を備忘録として補足していますので、需要があればストックお願い致します。

###DNXとは
DNX(.NET Execution Environment)とは、クロスプラットフォームで、ASP.NETを動作させるためのランタイム環境です。もの凄くざっくりいうとIISの代わりにASP.NETを実行するランタイム環境なのかな。C#とLinuxが好きな私としては、Javaのように気軽にWebサービスの開発ができるようになると嬉しいですね。
しばやんさんのブログ記事[.NET Core Runtime (CoreCLR) / .NET Compiler Platform (Roslyn) / .NET Execution Environment (DNX) の役割について理解したい](http://blog.shibayan.jp/entry/20150312/1426155199)で詳しく解説されていますので、詳しく知りたい方はこちらをどうぞ。

###検証環境
検証環境として、みんな大好きVirtualBoxを使用しました。
ゲストOSは、もうデファクト・スタンダードでしょのUbuntu-14.04-server(LTS)です。

####ポートフォワーディング設定
sshとdnxのために、VirtualBoxのポートを開けます。下記の画像を参考にしてください。
![ポートフォワーディング.png](https://qiita-image-store.s3.amazonaws.com/0/7839/939d6ca5-5aa0-7a20-11a9-80d83529c6a3.png)
Vagrantを使うと色々と楽ができるので、お薦めです。

###環境設定
####ツールインストール
あとあと必要となるツールをまとめてインストールしておきます。

```
$sudo apt-get update
$sudo apt-get install unzip curl git
```
####Monoインストール

```
$sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
$echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-$xamarin.list
$sudo apt-get update
$sudo apt-get install mono-complete
```

###DNX のインストール

```
$curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh
$sudo apt-get install libunwind8 gettext libssl-dev libcurl3-dev zlib1g libicu-dev
$dnvm upgrade -r coreclr
```
####良くわからないけどMonoを使ったDnxをインストールする

```
$dnvm list
$dnvm upgrade -r mono
$dnvm list
```
![dnx_mono画面.png](https://qiita-image-store.s3.amazonaws.com/0/7839/7171c048-2763-1f22-1b86-14337839a685.png)

###Kestrel のインストール

```
$sudo apt-get install make automake libtool
$curl -sSL https://github.com/libuv/libuv/archive/v1.4.2.tar.gz | sudo tar zxfv - -C /usr/local/src
$cd /usr/local/src/libuv-1.4.2
$sudo sh autogen.sh
$sudo ./configure
$sudo make
$sudo make install
$sudo rm -rf /usr/local/src/libuv-1.4.2 && cd ~/
$sudo ldconfig
```
####ASP.NET 5 サンプルコードの入手

```
$git clone https://github.com/aspnet/Home.git
$cd ~/Home/samples/1.0.0-beta8/HelloMvc
$dnu restore
$dnx kestrel
```

下記のアドレスにアクセスするとサンプルページが表示されます。
[http://127.0.0.1:5004](http://127.0.0.1:5004)
![ASPsample.png](https://qiita-image-store.s3.amazonaws.com/0/7839/e46a7327-ba35-66de-2b7a-f87c53f14380.png)

###最後に
まだ、実環境で利用できる安定度じゃ無いとのことですが、早く使えるようになるといいですね。
CentOS7 Jenkinsインストール 1/2


## 環境
* CentOS 7.1
* Jenkins 1.636

## Jenkinsインストール
* Jenkinsインストール

```Bash:
yum install java-1.7.0-openjdk
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
yum install jenkins
```

* 起動

```bash:
/sbin/service jenkins start
```

* FireWall設定

```bash:
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload
```

* Jenkinsへアクセス
 * http://{ドメイン}:8080

## アカウント作成
ここでアカウント作成を間違えるとやり直す羽目になります
### [Jenkinsの管理] -> [グローバルセキュリティの設定]
* "セキュリティを有効化"にチェックを入れる
 * 『ユーザー情報』の"Jenkinsのユーザーデータベース"を選択して、"ユーザーにサインアップを許可"にチェックを入れる
 * 『権限管理』の”全員に許可”を選択（この段階で"ログイン済みユーザーに許可"を選択してしまうとログインできなくなる）
* "CSRF対策"にチェックを入れる 

### 管理者アカウントの作成
* 画面右上に”サインアップ”が表示される
* ユーザー名、パスワードなど必要な情報を入力

### 再度、 [Jenkinsの管理] -> [グローバルセキュリティの設定]へ
* "セキュリティを有効化"にチェックはそのまま
 * 『ユーザー情報』の"Jenkinsのユーザーデータベース"を選択したまま、"ユーザーにサインアップを許可"のチェックを外す
 * 『権限管理』の”ログイン済みユーザーに許可”に変更する

[CentOS7 Jenkinsインストール 2/2 (VirtualHost + mod_proxy + Basic認証)](http://qiita.com/m1takahashi/items/4673cf97ec6665951e35)へ続く
PubSubHubbub + AWS LambdaでSEO対策

# PubSubHubbubとは
[Welcome to the Google PubSubHubbub Hub!](http://pubsubhubbub.appspot.com/)
[PubSubHubbub - Wikipedia](https://ja.wikipedia.org/wiki/PubSubHubbub)

## GoogleのHub
http://pubsubhubbub.appspot.com

# どうSEO対策になるのか
- Googleに素早くインデックスしてもらえるようになる。  
従来のようにGoogleにインデックスしてもらうのを待つのではなく、「インデックスしに来て♥」っていうラブコールを送るというわけ。

Wordpressなんかはプラグインとかあって便利らしい。
https://www.suzukikenichi.com/blog/using-pubsubhubbub-to-protect-against-scrapers/

# 本題
## PubSubHubbubを使ってRSSの情報更新とともにインデックスして欲しい。
やり方は以下のサイトを参照。
http://www.ipentec.com/document/document.aspx?page=csharp-notification-to-google-using-pubsubhubbub

# 仕様策定
## 前提
RSSはAWS Lambdaを使用して作成し、S3上に配置されているものとする。

[AWS Lambda](https://aws.amazon.com/jp/lambda/faqs/)

## S3へのファイルアップロードと同時に通知しちゃえ！
RSSファイルのS3へのファイルアップロードをトリガーにLambdaをキック！
gitとプルリクエストに関して思うことまとめ

※この記事は元々「Gitのこれやめて！リスト」として2015年11月に投稿したものを改訂したものです。

## この記事について
私が個人的にgitとプルリクエストについて、「こうして欲しい」とか「これはやらないで！！」とか思っていることをまとめたものです。
元々は2015年に私がコードレビューをしてる時に気になったことを、あまり推敲もせず思うがままに書いた記事でした。今改めて読み返すと稚拙な文章なのと、他に思うところとがあったりしたので、改めて書き直しました。いいね貰ってるのに書き直すのに若干後ろめたさがあるのですが、よりいい内容にできればと思います。

## コミットログがきれいだとレビューしやすい
一人で開発するときはgit使っててもブランチ切らないし、プルリクもださないしで、コミットログも"First Commit"の次が"Second Commit"とかでも支障はないです。しかし、チームで開発するときはコミットログを意識すること（コミットの粒度、メッセージ）はすごく大事だと思います。自分がそれに気づいたのは、チームメンバーの出したプルリクエストを頻繁にレビューするようになってからで、コミットログがちゃんとしてたら変更差分が多くてもレビューしやすく、逆に大量の更新を１コミットとかで作られたりすると、すごくレビューしづらいです。後述しますが、コミットログから「なんでこのファイルに修正がはいるのか？」が読み取れるので、これがないと「なんでこのファイルに修正入るの？」「それは〜」ってやりとりが発生してすごく効率が悪いです。
あとは、いい感じにコミットが切られていると、他のメンバーから「この機能に依存しているから、先にマージしたい」と言われた時なんかに対応できたりして並行開発しやすくなります。また、不幸にもバグが混入してたときに、影響箇所を切り戻すのもやりやすいです。
次に私が考えるいい感じのコミットを記述します。

### コミットメッセージにはWhyを書く
色んなところで言われていますが、私もそう思います。具体的にはこんな感じです。

* 契約エンティティに解約の機能を追加
* 会員エンティティを作成
* ユーザーIDで契約を検索した時に複数件ヒットする考慮が抜けていたので追加
* 入会できるかチェックする機能で申込者の年齢もみるようにした

など。逆に個人的に気になるコミットメッセージは以下のようなもの

* XXX.javaを作成（それは見たらわかる。なんでそのファイルが必要なのかを知りたい）
* レビューの指摘を直した（どんな指摘だったのかレビューした人じゃないとわからない）
* 一旦コミット（一旦ってなんだ？？）

ただ、いきなりきれいなコミットを作るのは難しいので、私は、まずは自分が作業しやすいようにコミット切って、プッシュする前にコミットログを綺麗にするってことをよくやります。そのときに主につかうgitのコマンドは以下です。

|コマンド|用途|
|:--|:--|
|git reset soft |resetしたあと、git addと組み合わせてコミットを切り直す。hardをつけるとコードも戻っちゃうのでやってはダメ|
|git rebase -i|コミットをまとめたりとか順番を入れ替えたりとかできる|


## コミットもプルリクもとにかく小さく
あいにくコミットとプルリクの粒度についての答えは持っていませんが、私の経験上、経験の浅い人ほどコミットもプルリクも大きくなります。変更差分が大きいとレビュー観点も多くなるので、レビュワーはとても辛いです。

### そもそもコードを始める前に設計していない
コミットとプルリクが大きくなる要因はこれだと思います。ちゃんと設計できていれば、「まずはInterfaceを作ってプルリクだして、次に実装クラスを〜」とか、そういった段取りが組めるかと思います。経験の浅い人にチケット（例：申込機能をつくる、など）を渡すと、コーディングしながら設計してるので、作業の切れ目がわからなくて大きなコミットになるのだと思います。
とはいえ、「コード書いてみないとどんな設計がいいのかわからない」って気持ちもわかる気がするので、その場合は一旦捨てるつもりで、スケルトンコードだけでも実装してみたらいいと思います。

### モブプロ・ペアプロ
上記に関連して、チームのふりかえりで「コードレビュー出してからの後戻りが大きい」という問題が挙げられたことがありました。Tryとして２〜３人で設計・実装を同じテーブルで随時共有しながら進めるようにしたのですが、これが結構よくて後戻りが減ってパフォーマンスがでました。

## その他・gitまわりでよくトラブルになるケース（随時更新）
以下は、gitの操作周りでトラブることが多いパターンを書いていきます。

### rebaseでミスる
rebaseはベースになるコミットを変更するから、それ以降のコミットがマージ元とは別になります。この仕組みをしらないと事故ります。例えば

```sh
# リリースするからmasterブランチを更新するよ
git checkout master
git merge develop

# Pushする（エラー）
git push origin master

# しまった。master更新するの忘れてた。
git pull --rebase master
```

とした場合、rebaseしたらその後のコミットはマージ元とは完全に別ものになるのでmergeされたことになっていないです（masterブランチに直接コミットしたことになる）よって、以後developをマージする際に必ずコンフリクトが起きます。
Formの入力内容を自動で取得する方法


JS側でFormの内容を自動で取得するには入力フィールドを監視することです。
今回は各フィールドの"change"イベントを監視し、入力内容を取得します。


### 監視クラスを作る

まずは、監視クラスを作ります。今回はFormModelとしました。

```FormModel.js
var FormModel = function(){

};

// クラスプロパティとして、監視対象を格納するオブジェクトと、データを入れるオブジェクトを用意。
FormModel.data = {};                         // 入力データを格納する
FormModel.listeners = {};                    // リスナー
```


次に、監視要素を登録する処理を記述します。

```FormModel.js
FormModel.prototype["addListener"] = addListener;


/**
  * リスナー登録
  *
  * @param id      フィールド名
  * @param $target jqueryオブジェクト
  */
 function addListener(id, $target){
     if(!$target.length) return;
     $target.on("change", function(){
         var value = $(this).val();
         if(this.type == "checkbox"){
             if ($(this).is(':checked')) {
                 if(!FormModel.data[id]) FormModel.data[id] = [];
                 var temp = value;
                 value = FormModel.data[id];
                 value.push(temp);
             }
             else {
                 module.FormModel.data[id].some(function(v,i){
                     if(v === value) FormModel.data[id].splice(i, 1);
                 });
                 value = FormModel.data[id]
             }
         }
         FormModel.data[id] = value;
     })
 }
```

これで準備はできました。
次は監視したいFormフィールドを登録します。

```main.js
var model = new FormModel();

// inputのnameとDOM要素を渡します。
model.addListener("company_name",   $('#form [name=company_name]'));
model.addListener("name",           $('#form [name=name]'));
model.addListener("name_kana",      $('#form [name=name_kana]'));
```

これで入力を監視できます。
値を取得したい時は、

```JavaScript
var data = FormModel.data;

console.log(data["name"]);
```

ハッシュでデータを持っているのでKeyを渡せば取得できます。
ちなみにチェックボックスの値は配列で管理しています。
音楽ファイルの情報を取得する（長さなど）

`sox`コマンドではなく、`soxi`を使います。

```
% soxi qiita.wav


Input File     : './qiita.wav'
Channels       : 1
Sample Rate    : 16000
Precision      : 16-bit
Duration       : 00:03:15.35 = 5600 samples ~ 26.25 CDDA sectors
File Size      : 11.2k
Bit Rate       : 257k
Sample Encoding: 16-bit Signed Integer PCM

```

また、`soxi`は様々なオプションがあります。そのまま引用すると、

```
Usage: soxi [-V[level]] [-T] [-t|-r|-c|-s|-d|-D|-b|-B|-p|-e|-a] infile1 ...

-V[n]	Increment or set verbosity level (default is 2)
-T	With -s, -d or -D, display the total across all given files

-t	Show detected file-type
-r	Show sample-rate
-c	Show number of channels
-s	Show number of samples (0 if unavailable)
-d	Show duration in hours, minutes and seconds (0 if unavailable)
-D	Show duration in seconds (0 if unavailable)
-b	Show number of bits per sample (0 if not applicable)
-B	Show the bitrate averaged over the whole file (0 if unavailable)
-p	Show estimated sample precision in bits
-e	Show the name of the audio encoding
-a	Show file comments (annotations) if available

With no options, as much information as is available is shown for
each given file.

```

`soxi`だけだと、全部の情報が出てきてしまうけれど、オプションをつけると欲しい分だけ情報が取れるといったところですね。
iPhone6s Plus + AWS で世界のどこにいても Rails の開発をする【Rails トラブル編】

# はじめに
iPhone6s+ と AWS を使った Rails 開発の 3 回目です。

* [iPhone6s Plus + AWS で世界のどこにいても Rails の開発をする【環境構築編】](http://qiita.com/tomohiko37_i/items/f851e52098adc1fe797b)
* [iPhone6s Plus + AWS で世界のどこにいても Rails の開発をする【SSH接続編】](http://qiita.com/tomohiko37_i/items/2f4d8b0926cd7b3db503)

これまでの流れはこの 2 つの記事を参考にしてください。今回は Rails をやっていてミスをしたところの備忘録です。

# ArgumentError (unknown encoding name: undecided):
Rails にアクションなどを追加していたら発生しました。コントローラの最上部に記述されているエンコーディングの部分が、

```rb
# -*- coding: undecided -*-
```

となっていました。正確には、

```rb
# -*- coding: utf-8 -*-
```

ですね。そもそもなんでこんな風に書いたのか記憶はありませんが・・・。

# ストロングパラメータを無効にしたときは
先の記事で記載している参考文献をベースに進めていますが、入門編ということで Rails のストロングパラメータを一旦無効にして進めます。その際に、

```rb
  class Application < Rails::Application
    config.active_record.raise_in_transactional_callbacks = true
    config.time_zone = 'Tokyo'
    config.action_controller.permit_all_parameters = true
  end
```

という感じでコントローラに `config.action_controller.permit_all_parameters = true` を追記するのですが、このとき WEBrick を再起動しないといけません。`ssh` を 2 つ起動してひとつは WEBrick を起動して、もうひとつで Rails の開発をしたりしていましたが、WEBrick が起動したまま作業できてしまうのでこの修正の時もつい起動したままにしていました。変更が反映されずに悩むので忘れず再起動しましょう。
Haskellでパスカルの三角形

```hs:pascal.hs
import Control.Applicative
import System.Environment

main :: IO ()
main = getArgs >>=
        putStr . unlines . center
                . map (unwords . map show) . (`take` triangle) . read . head

triangle :: [[Int]]
triangle = iterate (zipWith (+) <$> (++ [0]) <*> (0 :)) [1]

center :: [String] -> [String]
center ss = map (\s -> replicate ((mx - length s) `div` 2) ' ' ++ s) ss
        where mx = maximum $ map length ss
```
rbenvでrubyをインストールするシェルスクリプト

環境はUbuntu14.04ですが、いじれば別のOS、シェルでも使えるはず。

libsqlite3-devを入れているのはrails用なので必要ない場合は消してください。

gemはbundler、pry、pry-docを入れているのでこちらも必要ない場合は消してください。

```bash
#!/bin/bash

echo "install rbenv and ruby"

# 必要なライブラリをインストール
sudo apt-get install -y libreadline-dev libssl-dev libsqlite3-dev

# rbenvとプラグインを配置
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
mkdir ~/.rbenv/plugins
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

# rbenvの設定
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc

# rubyとgemのインストール
bash -lc "
rbenv install 2.2.3
rbenv global 2.2.3
gem install bundler pry pry-doc
"
```

```bash -lc```としているのは```source ~/.bashrc```としても```~/.bashrc```が反映されない(別シェルで起動するらしい)ので。

参考 [Ansibleでシェル設定の再読み込みが必要になった場合の対応 - Qiita](http://qiita.com/FGtatsuro/items/2366c93131c47aef8dfe)
JAVA コレクションのネスト

■TestNest.java

```java
import java.util.ArrayList;
import java.util.List;

class Cat {
	public String name;
}

public class TestNest {

	public static void main(String[] args) {
		Cat c = new Cat();
		Cat c2 = new Cat();
		Cat c3 = new Cat();

		c.name = "Ashley";

		List<Cat> cat = new ArrayList<Cat>();
		cat.add(c);
		cat.add(c2);
		cat.add(c3);
		c.name = "Sharrey";
		c2.name = "Monique";
		c3.name = "Choo";
		System.out.println(cat.get(0).name);
		System.out.println(cat.get(1).name);
		System.out.println(cat.get(2).name);

	}

}
```

■TestNest.java
Sharrey
Monique
Choo

■Main.java

```java
import java.util.ArrayList;
import java.util.List;

class Hero {
	public String name;
}

public class Main {
	public static void main(String[] args) {
		Hero h = new Hero();
		Hero h2 = new Hero();
		h.name = "ミナト";
		List<Hero> a = new ArrayList<Hero>();
		a.add(h);
		a.add(h2);
		h.name = "スガワラ";
		h2.name = "ネコ";
		System.out.println(a.get(0).name);
		System.out.println(a.get(1).name);

	}

}
```

■Main.java 実行結果
スガワラ
ネコ
メッセージアプリのように UITableView に下詰めで(下から順に)表示する


LINE のようなメッセージアプリのように下から新しい順に並べたいと思ったのでやり方を調べてみました。

# UITableView をそのまま表示する

まず UITableView にそのまま表示をしてみました。上から順に新しいものが並んでいます。

![110.png](https://qiita-image-store.s3.amazonaws.com/0/27210/17b7387b-423c-6278-d527-47f1d6ad2e34.png "110.png")

# UITableView を反転する

これに trasnform プロパティを使って上下反転させます。

```
    override func viewDidLoad() {
        super.viewDidLoad()
        ...
   　　　tableView.transform = CGAffineTransformMake(1, 0, 0, -1, 0, 0)
        ...
   　}
```

下から順に新しいものが並ぶようになりました。各セルも反転しちゃってますが・・

![112.png](https://qiita-image-store.s3.amazonaws.com/0/27210/1bd5df6f-b6eb-11a9-4e91-1c4498568261.png "112.png")

# UITableViewCell を反転する

さらに各セルも反転させて元に戻します。

```
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
        let cell = tableView.dequeueReusableCellWithIdentifier(..
        ...
        cell.transform = CGAffineTransformMake(1, 0, 0, -1, 0, 0)
        ...
        return cell
    }

```

これで下から順に新しいものが並ぶようになりました。

![111.png](https://qiita-image-store.s3.amazonaws.com/0/27210/adb3f99f-8c42-660e-c4f6-a026b89bff99.png "111.png")

# 注意

セルのデータソースの配列の変数には新しい順にデータが入っている(index 0 のデータが最新)ので、データを追加するときには append ではなく insert を使うようにします。
【ansible】ファイルの先頭行に文字列を追加するplaybookの例


きっとansibleに限らずなんだけども設定ファイルなどでファイルの先頭行に文字列を追加したい時があると思う。

(設定ファイルの設定の順番で挙動で変わるものとか)

今まではCentOSであんまり気にしなかったけどもどうやらOSXではうまく行かなかったのでその時のメモ

そして[@uraura](http://qiita.com/uraura)さんのやり方が一番シンプルだったことに気づいた・・・・

## 環境

* Mac OSX Yosemite(10.10.5)
	 * python 2.7.10
		* ansible 1.9.4


## ファイルの先頭行に文字列を追加するplaybook

```~/.zshrc``` に挿入したい文字列が存在しなければ ```.zshrc``` の先頭行に文字列を追加する例。[lineinfile](http://docs.ansible.com/ansible/lineinfile_module.html)モジュールを使う
(そして教えてもらった[@uraura](http://qiita.com/uraura)さんに感謝)


```yaml:/path/to/ansible-role/tasks/main.yml
- name: Add .zshrc prezto.init.sh
  lineinfile:
    dest={{ ansible_env.HOME }}/.zshrc
    line="source ~/.zsh/prezto.init.sh"
    insertbefore=BOF state=present regexp="prezto\.init\.sh"
  notify:
    - execute source .zshrc
```

## 最後に

小１時間ほどハマってしまった・・・・
IFA_F_MCAUTOJOIN issue

解決していない問題のメモ。答え募集中！

ip コマンドで multicast group に参加登録できるようになった。これは例えば openvswitch 組み込みの vxlan ポートで multicast を使うときに[便利](https://patchwork.ozlabs.org/patch/440407/)らしい。

つまり、こういう感じにコマンドを実行する。

```
ip route add 239.0.0.0/24 dev eth0
ip addr add 239.0.0.1 dev eth0 autojoin
```

無事 `ip maddr show dev eth0` で `239.0.0.1` が見えるようになる。

ところがこの状態で、普通の multicast 送信しようとすると、宛先 `239.0.0.1` がネットワークの外に出ていかない。local にも loop してこない様子。

```py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 1) # default有効なので不要
# 239.0.0.1 はパケットが送出される気配がない
s.sendto("HOGEHOGE", ("239.0.0.1", 8080))
# 239.0.0.2 は、転送されることが確認できる
s.sendto("HOGEHOGE", ("239.0.0.2", 8080)) 
```

どこで止められてるんだろうか…？
GitHub Markdown + TeX記法で白抜き文字を書きたい

GitHub Markdown + $\TeX$ 記法で数式を書く際に調べた事について覚書き
# 白抜き文字を書く方法

数の分類を白抜き文字で書きたい.

`\mathbb{ }` を使う.  

```lang:
$$ \mathbb{C, R, Q, Z, N} $$
```
$$ \mathbb{C, R, Q, Z, N} $$

[TeXで複素数C、実数R、有理数Q、整数Z、自然数Nなどの白抜き文字を使う方法](http://did2.blog64.fc2.com/blog-entry-204.html) を参考にさせてもらいました.
よりスマートな方法があれば教えていただけると嬉しいです.
UITextFieldDelegateのメソッドの呼ばれるタイミング

UITextFieldDelegateのメソッドが呼ばれるタイミングのメモ
今回は以下の4つのメソッドのタイミングを見ていきます

- textFieldShouldReturn
- textFieldDidBeginEditing
- textFieldShouldBeginEditing
- textFieldShouldEndEditing
- textFieldDidEndEditing

## コード

```swift:CiewController.swift
class ViewController: UIViewController, UITextFieldDelegate {
	private let tf:UITextField = UITextField(frame: CGRect(x: 30, y: 30, width: 100, height: 50))

	override func viewDidLoad() {
		super.viewDidLoad()
		tf.placeholder = "test"
		tf.delegate = self
		self.view.addSubview(tf)
	}

	func textFieldShouldReturn(textField: UITextField) -> Bool {
		print("textFieldShouldReturn before responder\n")
		tf.resignFirstResponder()
		print("textFieldShouldReturn\n")
		return true
	}
	
	func textFieldDidBeginEditing(textField: UITextField) {
		print("textFieldDidBeginEditing\n")
	}
	
	func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
		print("textFieldShouldBeginEditing\n")
		return true
	}
	
	func textFieldShouldEndEditing(textField: UITextField) -> Bool {
		print("textFieldShouldEndEditing\n")
		return true
	}
	
	func textFieldDidEndEditing(textField: UITextField) {
		print("textFieldDidEndEditing\n")
	}
}
```

### キーボード起動時

```
textFieldShouldBeginEditing
textFieldDidBeginEditing
```

### リターン押下時

```
textFieldShouldReturn before responder
textFieldShouldEndEditing
textFieldDidEndEditing
textFieldShouldReturn
```

textFieldShouldReturn before responder と textFieldShouldReturn の間にtextFieldShouldEndEditing, textFieldDidEndEditingが来ているので、resignFirstResponder()内でtextFieldShouldEndEditing, textFieldDidEndEditingが呼ばれているようです
El CapitanでEventMachineをインストールする

# 困った
EventMachineをインストールしようとすると次のようなエラーがでました。

```bash
$ gem install eventmachine
Building native extensions.  This could take a while...
ERROR:  Error installing eventmachine:
	ERROR: Failed to build gem native extension.

    /Users/nownabe/.anyenv/envs/rbenv/versions/2.2.2/bin/ruby -r ./siteconf20151127-59879-1tnovzf.rb extconf.rb
checking for rb_trap_immediate in ruby.h,rubysig.h... no
checking for rb_thread_blocking_region()... no
checking for ruby/thread.h... yes
checking for rb_thread_call_without_gvl() in ruby/thread.h... yes
checking for inotify_init() in sys/inotify.h... no
checking for __NR_inotify_init in sys/syscall.h... no
checking for writev() in sys/uio.h... yes
checking for rb_thread_fd_select()... yes
checking for rb_fdset_t in ruby/intern.h... yes
checking for pipe2() in unistd.h... no
checking for accept4() in sys/socket.h... no
checking for SOCK_CLOEXEC in sys/socket.h... no
checking for rb_wait_for_single_fd()... yes
checking for rb_enable_interrupt()... no
checking for rb_time_new()... yes
checking for sys/event.h... yes
checking for sys/queue.h... yes
CFLAGS= -O3 -Wno-error=shorten-64-to-32  -pipe  -Wall -Wextra -Wno-deprecated-declarations -Wno-ignored-qualifiers -Wno-unused-result
CPPFLAGS=-I/Users/nownabe/.anyenv/envs/rbenv/versions/2.2.2/include  -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT $(DEFS) $(cppflags) -Wall -Wextra -Wno-deprecated-declarations -Wno-ignored-qualifiers -Wno-unused-result
checking for clock_gettime()... no
checking for gethrtime()... no
creating Makefile

make "DESTDIR=" clean

make "DESTDIR="
compiling binder.cpp
In file included from binder.cpp:20:
./project.h:116:10: fatal error: 'openssl/ssl.h' file not found
#include <openssl/ssl.h>
         ^
1 error generated.
make: *** [binder.o] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/nownabe/.anyenv/envs/rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/eventmachine-1.0.8 for inspection.
Results logged to /Users/nownabe/.anyenv/envs/rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/extensions/x86_64-darwin-13/2.2.0-static/eventmachine-1.0.8/gem_make.out
```

# 環境
* Mac OS X El Capitan (10.11.1)
* openssl 1.0.2d
* Ruby 2.2.2
* EventMachine 1.0.8

# インストール方法
GemインストールのときにCPPFLAGSを指定してあげます。
opensslはHomebrewでインストールされている前提です。

```bash
$ gem install eventmachine -- --with-cppflags="-I/usr/local/opt/openssl/include"
Building native extensions with: '--with-cppflags=-I/usr/local/opt/openssl/include'
This could take a while...
Successfully installed eventmachine-1.0.8
```

# bundlerの場合
[El Capitanでbundle installに失敗する](http://cohakim.com/archives/6028)
Apache Jena Fuseki 2.3.0 の CORS 設定

# 問題

[Apache Jena Fuseki 2 で Readonly SPARQL Endpoint](http://qiita.com/frogcat/items/933ac85214d4943b97a0) の方法でエンドポイントを立てると Cross Origin Resource Sharing ができない。
HTTP レスポンスヘッダに ```Access-Control-Allow-Origin: *``` がついていないのでどうしょうもない。Fuseki 1 ではついていたのに。

# 原因

<https://issues.apache.org/jira/browse/JENA-1014>

ここに書いてある通り。version 1 → 2 の際に設定方法が変わった、とかではなく、そもそも実装されていない。2.3.1 でフィックスされたとのこと。

# 対策

2.3.1 がリリースされたらそちらを使うのが最良ではあるもの、現行2.3.0 では以下の手順で。

WAR版 ではなくて組み込み版を使っている場合には jetty の[org.eclipse.jetty.servlets.CrossOriginFilter](https://wiki.eclipse.org/Jetty/Feature/Cross_Origin_Filter) がビルトインで使えるので、**FUSEKI_BASE/webapp/WEB-INF/web.xml** に以下のフィルタ設定を追加することで CORS ヘッダをつけてくれるようになる。

```xml:web.xml
<!-- CORS filter-->
    <filter>
        <filter-name>cross-origin</filter-name>
        <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
        <init-param>
            <param-name>allowedOrigins</param-name>
            <param-value>*</param-value>
        </init-param>
        <init-param>
            <param-name>allowedMethods</param-name>
            <param-value>GET,POST,DELETE,PUT,HEAD,OPTIONS</param-value>
        </init-param>
        <init-param>
            <param-name>allowedHeaders</param-name>
            <param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified, Authorization</param-value>
        </init-param>
        <init-param>
            <param-name>exposedHeaders</param-name>
            <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>cross-origin</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

```

WAR 版で jetty 以外の Servlet Container を使っている場合にはこの方法は使えないのでご注意を。2.3.1 のリリースを待つか、自力で Filter を持ってくるなどしましょう。
Android Studioのエミュレータで日本語入力

Android入門本にてサンプルアプリのチャットアプリ作成中、エミュレータにて日本語入力ができなかったのでメモ。  

##　日本語入力の設定方法  

エミュレータを起動しメニュー画面を表示。  

**設定**アイコンをクリック。  

[![https://gyazo.com/2f72543db1505907030ead880f43d4bc](https://i.gyazo.com/2f72543db1505907030ead880f43d4bc.png)](https://gyazo.com/2f72543db1505907030ead880f43d4bc)  

**言語と入力**をクリック。  

[![https://gyazo.com/78bf3e536f09c8e05299e25eb5a901d5](https://i.gyazo.com/78bf3e536f09c8e05299e25eb5a901d5.png)](https://gyazo.com/78bf3e536f09c8e05299e25eb5a901d5)  

**キーボードと入力方法**を**日本語-Japanese IME**に変更。  

[![https://gyazo.com/0861f8ae7d73c01186cf143d5f399109](https://i.gyazo.com/0861f8ae7d73c01186cf143d5f399109.png)](https://gyazo.com/0861f8ae7d73c01186cf143d5f399109)  

日本語入力設定は完了です。  
サンプルアプリを起動し確認します。  

[![https://gyazo.com/63a9fcb918ee829c076d00d9505adafa](https://i.gyazo.com/63a9fcb918ee829c076d00d9505adafa.png)](https://gyazo.com/63a9fcb918ee829c076d00d9505adafa)  

##　参考  

Android Studioのエミュレータ（Android 4.4.2）で日本語入力を行う！  

<http://idea-cloud.com/dev/android_studio_jp_input.html>
Android Studioのエミュレータを日本語化

Android入門本を数冊流し読みしたが意外にも情報がなかったのでメモ  

##　日本語化の手順  

エミュレータを起動し液晶画面下部、5個並んでいるアイコンの真ん中のアイコンをクリック。  

[![https://gyazo.com/02120db2607d4aa05d3fb0eda3e7bae5](https://i.gyazo.com/02120db2607d4aa05d3fb0eda3e7bae5.png)](https://gyazo.com/02120db2607d4aa05d3fb0eda3e7bae5)  

メニュー画面が表示される。  

上から2番目、右から2番目のアイコン**Custom Locale**をクリック。  
[![https://gyazo.com/4df5b497b62a05d4eab55721ccf45447](https://i.gyazo.com/4df5b497b62a05d4eab55721ccf45447.png)](https://gyazo.com/4df5b497b62a05d4eab55721ccf45447)  

言語の一覧が表示されるので、がんばって下までスクロールして**ja_JP – Japanese**をクリック。  

左下の**SELECT'JA'**をクリック。  

日本語化完了です。  

メニュー画面に戻ると日本語化されました。  

[![https://gyazo.com/2f72543db1505907030ead880f43d4bc](https://i.gyazo.com/2f72543db1505907030ead880f43d4bc.png)](https://gyazo.com/2f72543db1505907030ead880f43d4bc)  

##　参考  

Android Studioのエミュレータ（Android 4.4.2）を日本語化！  
<http://idea-cloud.com/dev/android_studio_emu_jp.html>
【なでしこ】和暦→西暦変換

なでしこで西暦→和暦変換関数はあったのですが逆がなかったのでメモ。
変換出来なかった場合はエラーで落ちてしまうのでエラー監視もつけておきます。

```
エラー監視
	西暦=和暦に「+0/0/0」を日付加算。	
	和暦=和暦を「yyyy年mm月dd日」に日時形式変換。
エラーならば
	和暦=「」。
```
Android Studio 1.4で困ったこと

Android Studio 1.4でAndroid Studio 1.3対応のAndroid入門本を写経していたら本の通りに動かなかった。  

## 困ったこと  
本の通りにプロジェクトを「Blank Activity」で作成  
activity_main.xmlが動かない!?ンンン～!!!!  
content_main.xmlなんて本に書いてない。  

##　解決法  
[![https://gyazo.com/bf85ab745974d32bb3774f83c3143ddd](https://i.gyazo.com/bf85ab745974d32bb3774f83c3143ddd.png)](https://gyazo.com/bf85ab745974d32bb3774f83c3143ddd)  
「Blank Activity」ではなく隣の「Empty ctivity」を使いましょう。  
もっとスマートに解決する方法もあるようです。 

--- 
こちらのページを参考にしました。  
[[Android] Android Studio 1.4 変更](https://akira-watson.com/android/android-studio-1-4.html)
SeleniumをWindows環境にインストールしてExcelVBAで使うまで（初心者向け）

Webブラウザを使ったテスト自動化ツール「Selenium（WebDriver）」のインストール手順とVB Editorで使えるようにするところまで。

一応環境

```text:導入環境
OS：Windows 7
Chrome：46.0.2490.86 m
Selenium
Selenium IDE 2.4.0
selenium-2.35.0（Selenium Client & WebDriver）
ChromeDriver 2.4
```

Selenium IDEのインストール

http://docs.seleniumhq.org/download/
にアクセスし、Selenium IDEのリンクをクリックしてそのままインストール。

https://code.google.com/p/selenium/wiki/ChromeDriver
にアクセスし、ドライバを探してインストール。

Excelを開いて、A11

エディタの参照設定から"※celenium wrapper type libraly"を探して、有効化

いじょ
USBメモリー内の選択したファイルを指定したフォルダにコピーするAppleScript

#やりたいこと
　特定のUSBメモリー内に含まれるファイルを、
1. 指定したフォルダにコピーしてから、
2. ゴミ箱に移して、
3. ゴミ箱を空にして、
4. アンマウントする
　までがルーティーンになっていたので、AppleScriptで自動化したい！


#スクリプト

```applescript
tell application "Finder"
	--1. 選択ファイルを指定フォルダにコピー
	move selection to choose folder with prompt "コピー先のフォルダを選択して下さい"
	--2. 選択ファイルをゴミ箱に移動
	delete selection
	--3. ゴミ箱を空にする
	display alert "Empty trash?" buttons {"cancel", "OK"}
	set isEmpty to button returned of result
	if isEmpty = "OK" then
		empty
	end if
	--4. USBメモリーをアンマウント
	eject "USBmemory"
end tell
```

#メモ
1. USBメモリーから外付HDDへのコピーを想定しているので、moveだけで勝手にコピーされる
2. ゴミ箱を空にするのは、万が一を考えてクッションを置いた
3. USBメモリーのアンマウントは、特定のUSBメモリーしか使わないので、名前で指定
Functionによるevalの代替

evalを使わずに任意のコード文字列を実行する方法です。

デモ: http://jsdo.it/butchi/akBS

```js:my_eval.js
function myEval(expr) {
  Function(expr)();
}

myEval("alert('Thanks,'); alert('world!');");
```

- 参考1: [eval関数の代わり(javascript): 迷子の古事記](http://maigonokojiki.seesaa.net/article/389855861.html)
- 参考2: [Function - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function)


これを応用して、Math以下にある関数をメソッド名の記述だけで実行できるコードがこんな感じで書けます。

```js:math_eval.js
function mathEval(expr) {
  return Function('return Math.' + expr);
}

var f = mathEval("pow(2, 10);");
var result = f();
console.log(result);
```

ちなみに先ほどのコード、特に何にもバリデートしてないので、以下のように実行した場合あぶないです。

```js
mathEval("pow(2, 10), alert('あぶない！')")();
```

evalを使わない方法だから安全！てわけではなく、あくまでもコード文字列を引数としてクロージャを作れるという程度のものです。

- 参考3: [JS 形式の設定ファイルを読み込むときは eval の代わりに new Function を使う - たそがれ日記](http://d.hatena.ne.jp/tasogarepg/20130403/1364996453)
- 参考4: [Latest topics > evalが危険でそれ以外の方法が安全だと思ってる人へ - outsider reflex](http://piro.sakura.ne.jp/latest/blosxom/mozilla/xul/2010-02-08_eval.htm)

たぶん以下のコードと全く同じです（たぶん）。

```js:wrapped_eval.js
function wrappedEval(expr) {
  (function() {
    eval(expr);
  })();
}

wrappedEval("alert('Thanks,'); alert('world!');");
```

匿名関数を短い書き方で作る方法という程度に憶えておけばいいと思います。
Rustのインストールメモ

Rust処理系をインストールした時のメモです。

##OSバージョン
```bash:
$ uname -a
Linux chatora 3.13.0-63-generic #103-Ubuntu SMP Fri Aug 14 21:43:30 UTC 2015 i686 i686 i686 GNU/Linux
$
```

##処理系のインストール

Rust処理系のインストール先ディレクトリを作成し、`curl`コマンドでセットアップスクリプトをダウンロード & 実行します。インストール先は、`--prefix=`*インストール先*　と指定します。

```bash:処理系のインストール
$ mkdir -p <インストール先>
$ curl -s https://static.rust-lang.org/rustup.sh | sh -s -- --prefix=<インストール先>

Welcome to Rust.

This script will download the Rust compiler and its package manager, Cargo, and
install them to <インストール先>. You may install elsewhere by running this script
with the --prefix=<path> option.

The installer will run under 'sudo' and may ask you for your password. If you do
not want the script to run 'sudo' then pass it the --disable-sudo flag.

You may uninstall later by running <インストール先>/lib/rustlib/uninstall.sh,
or by running this script again with the --uninstall flag.

Continue? (y/N) y

rustup: gpg available. signatures will be verified
rustup: downloading manifest for 'stable'
rustup: downloading toolchain for 'stable'
######################################################################## 100.0%
～～～～～～～～～～～～～　中　略　～～～～～～～～～～～～～
rustup: extracting installer
rustup: installing toolchain for 'stable'
[sudo] password for yz2cm: 
install: creating uninstall script at <インストール先>/lib/rustlib/uninstall.sh
install: installing component 'rustc'
install: installing component 'rust-docs'
install: installing component 'cargo'

    Rust is ready to roll.

$
```

##パスの設定
`~/.bashrc`に、各種パスを追加します。

```bash:~/.bashrc
export PATH=${PATH}:<インストール先>/bin
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:<インストール先>/lib
```

```bash:.bashrcの読み込み
$ . ~/.bashrc
```

## 処理系のバージョン

```
$ rustc --version
rustc 1.4.0 (8ab8581f6 2015-10-27)
$
```

##サンプルコード
```sh:
$ cat main.rs
fn main()
{
	println!("Hello, world!");
}
$ rust main.rs
$ ./main
Hello, world!
$
```
ReactNativeのコンポーネントを探す

ReactNativeのコンポーネントを探すには [react.parts](https://react.parts/native) を使うとiOS/androidの対応状況などもわかって便利です。ReactNativeだけでなく、通常のReactのコンポーネントも探せます。

それにしてもpartsドメイン使ってるのって初めて見ました :smile:
mod_rewrite で指定日時でリダイレクト先を切り替える


httpd.conf や .htaccess に下記のように書く。2015年12月1日00:00:00までは / へのリクエストを /old/ に、それ以降は /new/ に飛ばす例。リダイレクト先を切り替えることを前提としているので、ステータスコードは 302 としている。

```
RewriteEngine On
RewriteCond %{TIME} <20151201000000
RewriteRule ^$ http://example.com/old/ [R=302,L]
RewriteRule ^$ http://example.com/new/ [R=302,L]
```

.htaccess に書いて DocumentRoot より下の階層に配置した場合、配置した場所へのアクセスをリダイレクトするようになる。たとえば、 http://example.com/latest/.htaccess に上記ファイルを配置した場合、 http://example.com/latest/ へのアクセスが振り分けられる。
[Swift] iOSの標準ライブラリだけで、郵便番号から住所を取得する

# 概要

`CoreLocation`ライブラリを使って、郵便番号から住所を取得することができます。(注:インターネット接続が必要です)


# Solution

## ソースコード

```swift
//: Playground - noun: a place where people can play

import UIKit
import CoreLocation
import XCPlayground

let geocoder = CLGeocoder()
geocoder.geocodeAddressString("〒100-0002", completionHandler: {(placemarks, error) -> Void in
  if error != nil {
    print("Error", error)
  }
  if let placemark = placemarks?.first {
    print("State:       \(placemark.administrativeArea!)")
    print("City:        \(placemark.locality!)")
    print("SubLocality: \(placemark.subLocality!)")
  }
})

XCPSetExecutionShouldContinueIndefinitely()
```

## playgroundでの実行結果

レスポンスが英語になります

```swift
State:       Tokyo
City:        Chiyoda
SubLocality: Kokyogaien
```


## iPhoneでの実行結果

レスポンスが日本語になりました。端末の言語設定に依存するようです。
ちなみに、機内モードで実行するとエラーになります。

```swift
State:       東京都
City:        千代田区
SubLocality: 皇居外苑
```

# Androidの場合

以下のAPIで同じようなレスポンスが返ってきた

http://maps.google.com/maps/api/geocode/json?address=%E3%80%92100-0002&sensor=false

```json

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "100-0002",
               "short_name" : "100-0002",
               "types" : [ "postal_code" ]
            },
            {
               "long_name" : "皇居外苑",
               "short_name" : "皇居外苑",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "千代田区",
               "short_name" : "千代田区",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "東京都",
               "short_name" : "東京都",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "日本",
               "short_name" : "JP",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "〒100-0002, 日本",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 35.6844641,
                  "lng" : 139.7626249
               },
               "southwest" : {
                  "lat" : 35.6753588,
                  "lng" : 139.7532534
               }
            },
            "location" : {
               "lat" : 35.6796282,
               "lng" : 139.7588189
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 35.6844641,
                  "lng" : 139.7626249
               },
               "southwest" : {
                  "lat" : 35.6753588,
                  "lng" : 139.7532534
               }
            }
         },
         "place_id" : "ChIJhfpjafGLGGARU6M89KmiydY",
         "types" : [ "postal_code" ]
      }
   ],
   "status" : "OK"
}

```

# 参考

- [CLGeocoderを使って郵便番号を住所に変換する](http://qiita.com/shobyshoby/items/b8df971254862d10b254)
- [Android geocoding not functioning as well as iOS](http://stackoverflow.com/questions/31944893/android-geocoding-not-functioning-as-well-as-ios)
td-agentが繋がらない時の対処



まずは、標準出力でエラーを確認する為に、起動コマンドを

```
sudo /opt/td-agent//usr/sbin/td-agent --log /var/log/td-agent/td-agent.log --use-v1-config
```

で実行してみる。
僕の環境 Mac (El Capitan) では、

```
#<OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed>
```
と出ました。

証明書がないっぽい。
確認してみる。

```
ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"
```

"/usr/local/etc/openssl/cert.pem"
なる。

```
ls -la /usr/local/etc/openssl/cert.pem
```

無いですね・・・。
証明書ファイルをダウンロードして、リネームする。

```
cd /usr/local/etc/openssl/
curl -O http://curl.haxx.se/ca/cacert.pem
mv cacert.pem cert.pem
```

んで、起動して、ログ確認

```
[info]: listening fluent socket on 0.0.0.0:24224
```

ぅおっけい！！