OmniAICreator/Qiita-1.07M huggingface dataset:
MacのTime Machineで、バックアップが異常に遅い場合の対応 〜ウイルスバスター編〜

# MacでTimeMachineが動作しているが、バックアップが異常に遅い

数10GBのバックアップに数十時間かかる...という場合、ウイルスバスターforMacが邪魔している可能性があります。

# 対策その1「リアルタイムスキャンを無効にする」

リアルタイムスキャンが動作を遅くしているので、これを無効にします。

![スクリーンショット 2016-04-16 4.57.54.png](https://qiita-image-store.s3.amazonaws.com/0/114240/605dc226-cc15-3c0a-b38e-894da054b70c.png)

![スクリーンショット 2016-04-16 5.06.39.png](https://qiita-image-store.s3.amazonaws.com/0/114240/30907dcb-581a-c0c4-0fc5-045d43caf359.png)

ただし、読んで字の如くウイルスがスキャンされない状態になるので、Macをネットをから切り離してバックアップ中は何も操作をせず、バックアップが終わるまで放置できる場合にお勧めです。

また、バックアップが終了したらリアルタイムスキャンを再開して下さい。

# 対策その2「スキャン対象から除外する」

Time Machineのバックアップデータをリアルタイムスキャンの対象から除外することで、バックアップ中の処理負荷を軽減することができます。

左側の「スキャン」を選択。

![スクリーンショット 2016-04-16 4.58.00.png](https://qiita-image-store.s3.amazonaws.com/0/114240/f35d74af-3085-c54c-8d2d-bc75a0575bd3.png)

スキャン設定の「設定の変更」を選択。

![スクリーンショット 2016-04-16 4.58.07.png](https://qiita-image-store.s3.amazonaws.com/0/114240/95852d3a-d69c-2227-3626-09573e902919.png)

例外設定の「リストを編集」を選択。

![スクリーンショット 2016-04-16 4.58.52.png](https://qiita-image-store.s3.amazonaws.com/0/114240/0f2780e8-8b1d-b3b2-7fcd-74f6ed9678a9.png)

フォルダタブを選択して「＋」をクリックし、バックアップに使用しているハードディスクなどを選択して「追加」をクリック。
※ここでは「HDD_1TB」ですが、お使いの環境により異なります。

![スクリーンショット 2016-04-16 4.58.29.png](https://qiita-image-store.s3.amazonaws.com/0/114240/9774f647-61f3-c16d-844e-90c1d7931827.png)

例外設定の一覧に選択したフォルダが入っていることを確認して「完了」をクリック。

![スクリーンショット 2016-04-16 4.58.19.png](https://qiita-image-store.s3.amazonaws.com/0/114240/6c93437d-e6b7-bb20-6fcf-88e99cad19c0.png)

以上です。
【jQuery】onメソッドの使用方法


## ドキュメント
[jQuery APIドキュメント（公式）](http://api.jquery.com/on/)
[jQuery APIドキュメント（日本語）](http://js.studio-kingdom.com/jquery/events/on)

  
## 基本の使用方法

```
.on( events [, selector ] [, data ], handler )
```
jQueryオブジェクトにイベント処理を紐付けることができる。

|引数|データ型|説明|
|:--|:--|:--|
|events|String|複数のイベントを設定できる。|
|selector|String|選択jQueryオブジェクトの子孫要素を設定することでイベントデリゲートできる。|
|data|Anything|イベントハンドラに渡したいデータをハッシュで指定できる。|
|handler|Function|eventsが起きたタイミングで実行されるイベントハンドラ。|

## eventsで複数のイベントを設定
### 半角スペース区切りで複数のイベントを設定
```
$('.foo').on('click blur', function(){...});
```

設定できる主なイベントは下記。
http://pentan.info/javascript/event_handler.html
http://phpjavascriptroom.com/?t=js&p=event

また、.trigger()で設定したカスタムイベントを使用することも可能。

### 連想配列にしてイベントごとに異なる処理を設定
```
$('.foo').on({
  'mouseenter': function(){...},
  'mouseleave': function(){...}
});
```

## selectorでイベントデリゲート
```
$("ul").on("click","li",function(){
	alert($(this).text());
});
```
イベントデリゲートとは子要素に対して起こしたイベントが親要素に次々と伝播していくイベントバブリングというjavascriptの特徴を利用したイベントの書き方である。
これを利用すれば、子要素に対して起こしたいイベントを親要素に対して設定できる。
メリットはスクリプトで後から追加するものに対してもイベントを書けること、メモリの節約の2つである。

```
$("li").on("click",function(){
	alert($(this).text());
});
```
先ほどのスクリプトはこう書くのと同じだが、こちらはli全てに対し処理を設定するのに対して、先ほどのスクリプトはulひとつにのみ処理を設定している。


```
$('.parent').on({
  'mouseenter': function(){...},
  'mouseleave': function(){...}
}, '.foo');
```
もちろん、eventsとselectorの合わせ技も可能。

## dataを処理したいイベントハンドラに渡す
```
for (var i = 0; i < 3; i++) {
  $('button').eq(i).on('click', { value: i + 1 }, onClick);
}
 
function onClick(e) {
  alert(e.data.value + '番目のボタンをクリックしました');
}
```
イベントが実行されたときにイベントオブジェクトを通して、event.dataにその値が格納され、イベントハンドラから扱えるようになる。

## offによる解除
```
$('button').on('click', function() {
  alert('クリックされました');
});
 
$('button').off('click');
```

## bind、live、delegateについて
bindはonと似ているがスクリプトで後から追加したものには対応できない。
liveとdelegateはスクリプトで後から追加したものに対応できる。
liveとdelegateでは書き方が若干異なる。
全てonで賄えるため、基本的には使用しない。

## 参考URL
[jQuery 便利なonを使おう（on click)](http://qiita.com/shizuma/items/d561f37f864c3ebb5096)
[jQuery の on() と off() を理解する](http://tacamy.hatenablog.com/entry/2013/03/03/213113)
[実践、jQuery 第1回 .on()と.off()を使いこなす 1](https://app.codegrid.net/entry/practical-jquery-1)
CircleCIで複数のバージョンのGo言語をテストしてみた。


```circle.yml
machine:
  environment:
    GO15VENDOREXPERIMENT: 1
    GOROOT: "/home/ubuntu/go"
    PATH: "/home/ubuntu/go/bin:$PATH"

dependencies:
  cache_directories:
    - "/home/ubuntu/.go"
  pre:
    - >
      case $CIRCLE_NODE_INDEX in 0) export GOVERSION=1.5.1 ;; 1) export GOVERSION=1.6.1 ;; esac;
      cd /home/ubuntu;
      if [[ ! -e /home/ubuntu/.go/$GOERSION/bin/go ]]; then
        curl https://storage.googleapis.com/golang/go$GOVERSION.linux-amd64.tar.gz | tar -xz;
        go get -u github.com/jstemmer/go-junit-report;
        mkdir -p ~/.go;
        cp -rp ~/go ~/.go/$GOVERSION;
      else
        cp -rp ~/.go/$GOVERSION ~/go;
      fi
    - go version



test:
  override:
    - mkdir -p $CIRCLE_TEST_REPORTS/golang:
        parallel: true    
    - go test -v $(go list ./...|grep -v vendor) | go-junit-report set-exit-code=true > $CIRCLE_TEST_REPORTS/golang/$CIRCLE_NODE_INDEX.xml:
        parallel: true
```

使うタイミングとしては、現在1.5で開発しているけど、そろそろバージョンを上げたいとか

まだ考えていないけどテストは常に行っていたいとかそういうアレかな

[詳しくはgist](https://gist.github.com/shinofara/0a2868572f227cdf2faca73ac4b44000)
地震が多いので地震の履歴を取得

昨日でしょうか、一昨日でしょうか。
大きな地震がありましたね。私はちょうどさっき二回目の地震を体験しました。
そんなことがあり、気象庁のサイトを揺れてる最中閲覧したのですが、特になにも書いてありませんでしたね。忙しかったんでしょうかね。
掲載されたのは地震が終わった数分後でした。

さて、そんな気象庁の地震速報を履歴として取得してみます。
といっても誰でも気象庁のサイトから簡単に見れるんですけどね。
[リンク](http://www.jma.go.jp/jp/quake/quake_sindo_index.html)

プログラムは関数getにて履歴を取得、その後引数path(書き込みファイルのパッチ)
へ結果を書き込みます。

このまま実行するとエラーになるか、デスクトップにinfo.textというファイルが作られ書き込まれます。

動作環境は
Python 2.7
OSX 10.10.5

ライブラリは
・urllib2(HTML取得)
・BeautifulSoup4(スクレイピング)
を使用し、
文字コードをutf-8に変換しました。(OSXのみ動作確認)

```py
#coding: utf-8

def get(path):
	import urllib2
	from bs4 import BeautifulSoup

	soup = BeautifulSoup(urllib2.urlopen("http://www.jma.go.jp/jp/quake/quake_sindo_index.html"), "lxml")
	infotable = soup.find_all("div", attrs={"id": "info", "class": "infotable"})
	body = [i.text.encode("utf-8") for i in infotable]

	with open(path, "w") as f:
		f.write("".join(body))

if __name__ == "__main__":
	path = "desktop/info.text"
	get(path)
```
CircleCIのビルド結果をデスクトップに通知する


SeaEyeを使うとCircleCIのビルド結果をMacのデスクトップに通知することができます。
https://github.com/nolaneo/SeaEye

ビルドが成功/失敗した時に以下の画像のような通知がきます。
![notification.png](https://qiita-image-store.s3.amazonaws.com/0/74551/5e0e4cab-4db8-8bc2-edae-73f4d65bf581.png "notification.png")

使い方は簡単で、CircleCIのAPIキー、組織名、プロジェクト名を指定するだけです。
![settings.png](https://qiita-image-store.s3.amazonaws.com/0/74551/954b39d9-9842-e2d3-6a76-f79e312012db.png "settings.png")

プロジェクト名は空白区切で複数個指定することができます。
また、チームで開発している時に自分のビルドだけを通知することもできます。
さらに、通知対象のブランチを正規表現で指定することもできます。
テストデータ用にランダムな日付文字列をn個生成する


# がいよう
- 先日チャットで「テストデータ用に使うランダムな日付(文字列)をn個作りたい」って流れてきたのでその時に書いたコードを晒しつつ＋αしてみる

# 仕様
- コマンドラインから実行する
- n個の日付文字列を改行コードで分割して標準出力する
- 幅はintの0から最大値まで
- 文字列さえ出力すればいいのでtimezoneはUTC+0固定
- コマンドライン引数1:生成する数
- コマンドライン引数2:日付フォーマット

# 実装

```php
<?php
date_default_timezone_set('UTC');
$start = strtotime('1970-01-01 00:00:00'); // 0
$end = strtotime('2038-01-19 03:14:07'); // 2147483647
for ($i = 0;$i < $argv[1];$i++) {
        echo date($argv[2], mt_rand($start, $end)) . PHP_EOL;
}
```

# Datetime

DatePeriodで実現しようとして諦めた

# おまけ

golangでもやってみた(100個、YY-MM-DD HH:II:SS固定)

```go
package main

import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)

func main() {
	var wg sync.WaitGroup
	date_format := "2006-01-02 15:04:05"
	rand.Seed(time.Now().UnixNano())
	for i := 0; i < 100; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			unixtime := rand.Int63n(2147483647)
			fmt.Println(time.Unix(unixtime, 0).Format(date_format))
		}()
	}
	wg.Wait()
}
```
unicornの起動スクリプトで環境変数を設定してもreload（USR2シグナル）では再読み込みされない

# 環境
Rails：4.2.0
Unicorn：5.1.0
rails env：production

# Unicornの環境変数は再読み込みされない？
lib/tasks/unicorn.rake で、unicornのstartとかstopとかrestartできるようにしてます。
バージョン管理に含めたくない定数とか、環境変数に入れますよね。たぶん。
そこで、unicorn.rake に環境変数を設定したところ、bin/rake unicorn:restart では環境変数がセットされませんでした。

該当箇所のコードは以下のようになってます。

```lib/tasks/unicorn.rake
ENV['SECRET_VALUE'] = 'abcdefg'

task(:restart) { unicorn_signal :USR2 }

def unicorn_signal signal
  Process.kill signal, unicorn_pid
end
```

# で、どうしたか？
実は、先の unicorn の起動スクリプトで、stop&start すると、環境変数が再読み込みされました（当たり前か）。
個人で勉強用にやってるものだったので、とりあえずこれで対応をしてます。


# 本当はどうするべきなのか？
gem で dotenv-rails を使うのがよいのかな、と思います。
こちらが参考になります。→ http://qiita.com/closer/items/f8d8ba00ae86d7051764

コレ間違ってる、新しいやり方がある、こっちのほうがオススメ、とかあれば教えてもらえると助かります！

# 追記
dotenvをproduction環境で使わないほうがいいよ、って話もあるようです。→ http://t-cyrill.hatenablog.jp/entry/2015/03/25/024625

ただ、バランシングして複数のウェブサーバがいたりすると、ウェブサーバ側に環境変数設定を書いていて、もし書き換える必要がでたときに、バランサから外して書き換えて、ってことをやらなきゃいけなくなりそう。
なので、できるだけunicornの起動スクリプトやRails側に置きたいなあ、と思っていたんですが、その考え方が間違ってるのでしょうか……？
【jQuery】処理実行タイミング $(document).readyと$(window).load


## HTMLが読み込まれたとき　$(document).ready
```js
$(function(){
  //処理
});

jQuery(function(){
  //処理
});

jQuery(document).ready(function(){
  //処理
});
```

これらは全て同じタイミングで処理が実行される。
実行されるタイミングは「HTML（DOM）の読み込みが終わったとき」である。
HTMLが読み込まれる前はHTMLの操作ができないので通常はこの記述を行う。


## 画像などコンテンツ全体が読み込まれたとき　$(window).load
```js
$(window).load(function(){
  //処理
});
```

ただし、HTMLの読み込みが終わったタイミングでは、まだ画像などのコンテンツは読み込まれていない。
そのため、画像が読み込まれなければ正しく動作しないような処理を行う場合は$(window).loadを使用する。

## イベントの順番
イベントの順番は下記のようになる。

1. ページの読み込みが始まる
2. HTMLの読み込みが終わる
3. $(document).readyが実行
4. 画像など含めすべてのコンテンツの読み込みが終わる
5. $(window).loadが実行


## 参考URL
[jQueryの基本 - $(document).ready](http://qiita.com/8845musign/items/88a8c693c84ba63cea1d)
[jQueryの読込み「ready」と「load」と「function」の順番について](http://web-wizardry.net/jquery/jquery%E3%81%AE%E8%AA%AD%E8%BE%BC%E3%81%BFready%E3%81%A8load%E3%81%AE%E9%A0%86%E7%95%AA%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/)
ErrbotでSlackのチャットボットにする

http://qiita.com/attakei/items/29b3f0086296345216df の続き

今回はSlackを監視して動くErrbotの初期構築をしてみます。

## 準備するもの

* Slackチーム
* ↑のチーム内で用意したbotユーザーとトークン
* 前回の記事で用意したErrbotの稼働環境


## config.pyをSlack用に編集する

```py3:config.py
# L47付近
# チャットのバックエンドを指定。今回はここにSlackを指定する
BACKEND = 'Slack'  # defaults to XMPP

# L135付近
 BOT_IDENTITY = {
     # XMPP部分はコメントアウト
     # XMPP (Jabber) mode
     # 'username': 'err@localhost',  # The JID of the user you have created for the bot
     # 'password': 'changeme',       # The corresponding password for this user

# L152付近
    # Slackの使用にはトークンが必要なので、コメントアウトされているトークンを指定する
    # Slack mode (comment the others above if using this mode)
    'token': 'xoxb-your-slack-token',

# L179付近
# このErrbotの管理権限をもつアカウントのリスト。@から始めるやつ
BOT_ADMINS = ()

# L185付近
# このErrbotが参加しているルームやチャンネル。今回は一人で会話するので空タプル
CHATROOM_PRESENCE = ()
```

## 起動してみる


```pycon:ターミナルで
$ errbot
12:34:47 INFO     errbot.err                Config check passed...
12:34:47 INFO     errbot.err                Selected backend 'Slack'.
(略)
12:34:48 INFO     errbot.main               Found Backend plugin: 'Slack'
12:34:48 INFO     errbot.backends.slack     Verifying authentication token
12:34:50 INFO     requests.packages.urllib3 Starting new HTTPS connection (1): slack.com
12:34:52 INFO     errbot.backends.slack     Connecting to Slack real-time-messaging API
12:34:52 INFO     requests.packages.urllib3 Starting new HTTPS connection (1): slack.com
12:34:56 INFO     errbot.backends.slack     Connected
(略)
12:34:57 INFO     errbot.errBot
12:34:57 INFO     errbot.errBot             Notifying connection to all the plugins...
12:34:57 INFO     errbot.plugins.ChatRoom   Callback_connect
12:34:57 INFO     errbot.errBot             Plugin activation done.
12:34:58 INFO     requests.packages.urllib3 Starting new HTTPS connection (1): slack.com
```

slackのメッセージングAPIに接続してくれます。

## 会話してみる

![I4RM7l5QoK.gif](https://qiita-image-store.s3.amazonaws.com/0/6805/37da3eef-27fb-bd75-98ea-c4308932a84d.gif)

```pycon:ターミナル側
13:05:04 INFO     errbot.plugins.ACLS       Matching ACL {} against username @attakei for command Help:help
13:05:04 INFO     errbot.plugins.ACLS       Check if help is admin only command.
13:05:04 INFO     errbot.errBot             Processing command 'help' with parameters '' from @attakei
```

ログを見ると、「誰から」「どんな命令が」を出力してくれています。


後は、herokuなりどこかにおけば、chatbotの出来上がり
[エラー] ALTER TABLE tags MODIFY name varchar(255) CHARACTER SET utf8 COLLATE utf8_bin; (ActiveRecord::StatementInvalid)ALTER TABLE tags MODIFY name varchar(255) CHARACTER SET utf8 COLLATE utf8_bin; (ActiveRecord::StatementInvalid)

既存のRailsアプリをcloneしてきてマイグレーションしたらエラーが発生。
データベースにはMySQL5.5を使用。

```
Mysql2::Error: Table '****_development.tags' doesn't exist: ALTER TABLE tags MODIFY name varchar(255) CHARACTER SET utf8 COLLATE utf8_bin; (ActiveRecord::StatementInvalid)
```

`acts-as-taggable-on`というgemが原因のようだ。

Githubの[公式](https://github.com/mbleigh/acts-as-taggable-on)によれば、MySQLユーザーは下記の設定が必要なようだ。

```rb:/config/initializes/acts_as_taggable_on.rb
ActsAsTaggableOn.force_binary_collation = true
```

上記の一文をコメントアウトしてマイグレーションを実行すればよい。
https://github.com/mbleigh/acts-as-taggable-on/issues/623#issuecomment-97640109

マイグレーションが完了したらコメントアウトを戻す。
次回からのマイグレーションは普通に実行される。
釈然としないがとりあえず解決。

以上。
Twigで独自の関数を使えるようにする

### はじめに

Twigはビューなので、ロジックをもたない、もつことができないような仕組みになっています。
原則必要なデータ（変数）のみをビューに渡して、それを表示するのみ。
計算や加工などデータの処理はコントローラやモデル側で行うことが推奨されています。

PHP標準の関数も使えません。Twigテンプレート内でecho()とか書いてもエラーになります。

しかし、ビュー側で関数を扱いたいこともあります。
たとえば、HTMLタグが冗長な表記になってしまうところをヘルパー関数でまとめたい等。

### 組み込み関数

というように基本的に関数は使いませんが、TwigでもいくつかのFunctionがデフォルトで定義されています。

http://twig.sensiolabs.org/documentation
⇒Twig Reference⇒Functions

下記はTwigにもともと用意されている関数を使うサンプルです。

```twig_sample.html.twig
<html>
    <head>
        <title>Function Sample</title>
    </head>
    <body>
        {{ random() }}
        {{ max(1,5,3) }}
        {{ range(1,10)|join('|') }}
    </body>
</html>
```

```twig_sample.php
<?php
require_once 'vendor/autoload.php';

$loader = new Twig_Loader_Filesystem('.');

$twig = new Twig_Environment($loader);

$template = $twig->loadTemplate('twig_sample.html.twig');

echo $template->render([]);
?>
```

実行してみます。

```実行結果
c:\tmp>php twig_sample.php
<html>
    <head>
        <title>Function Sample</title>
    </head>
    <body>
        1505204978
        5
        1|2|3|4|5|6|7|8|9|10
    </body>
</html>
```

上記では3つの関数を使いました。

- random()
- max()
- range()

random()はランダムな数値や文字列を返します。
http://twig.sensiolabs.org/doc/functions/random.html

max()は引数で与えられた値の中で最大値を返します。
http://twig.sensiolabs.org/doc/functions/max.html

range()は引数で与えた範囲の数値を「配列」で返します。
http://twig.sensiolabs.org/doc/functions/range.html

注）range()は配列を返すため、range()だけの結果を出力しようとするとエラーになってしまいます。
テンプレートは文字列として出力する必要があるためです。
したがって、ここではjoin()フィルターをつけて、配列の中身を結合して文字列化しています。

### 自作関数1

今度は自作の関数をTwigで使用してみます。

やり方はいくつかありますが、自作の関数をTwigに渡す必要があります。
そのためにaddFunction()という関数が用意されています。

サンプルはこんな感じです。

```twig_sample2.html.twig
<html>
    <head>
        <title>Function Sample2</title>
    </head>
    <body>
        {{ my_function() }}
    </body>
</html>
```

```twig_sample2.php
<?php
require_once 'vendor/autoload.php';

$loader = new Twig_Loader_Filesystem('.');

$twig = new Twig_Environment($loader);

$function = new Twig_SimpleFunction('my_function', function () {
    echo "This is my function!";
});
$twig->addFunction($function);

$template = $twig->loadTemplate('twig_sample2.html.twig');

echo $template->render([]);
?>
```

実行結果は下記のとおり。
echoした内容が出力されています。

```実行結果
c:\tmp>php twig_sample2.php
<html>
    <head>
        <title>Function Sample2</title>
    </head>
    <body>
        This is my function!
    </body>
</html>
```

### 自作関数2

関数を切り出して、引数を受け付けるようにしてみました。

```twig_sample3.html.twig
<html>
    <head>
        <title>Function Sample3</title>
    </head>
    <body>
        {{ my_echo("This is my echo!") }}
    </body>
</html>
```

```twig_sample3.php
<?php

function my_echo($val){
    echo $val;
}

require_once 'vendor/autoload.php';

$loader = new Twig_Loader_Filesystem('.');

$twig = new Twig_Environment($loader);

$function = new Twig_SimpleFunction('my_echo', 'my_echo');
$twig->addFunction($function);

$template = $twig->loadTemplate('twig_sample3.html.twig');

echo $template->render([]);
?>
```

実行結果は下記のとおり。
echoした内容が出力されています。

```実行結果
c:\tmp>php twig_sample3.php
<html>
    <head>
        <title>Function Sample3</title>
    </head>
    <body>
        This is my echo!
    </body>
</html>
```
Macからubuntuにsshで接続する


#目的
Macからubuntuにsshで接続する
ポート番号の設定

#環境
ubuntuバージョン：14.04LTS(サーバ用)
MacBook Pro(アクセス用)



##sshのインストールとポート番号の変更

###OpenSSHをインストール
```$ sudo apt-get install openssh-server```

###sshのポート番号の変更
その前にバックアップを取っておくと良い
```$ cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org```

###ポート番号の変更
ポート番号は1024〜65535のいずれか(使用していないポート番号)
```$ sudo vim /etc/ssh/sshd_config```

ポート番号22から使用したいポートに変更
```Port 22 → Port 使用したいポート番号```

##sshでログイン
自分のPC(Mac)からubuntuにsshで接続してみる
```$ ssh -p ポート番号 サーバ名@グローバルIPアドレス```
パスワードの入力をしてログイン完了


※あくまでメモとして書いてますので、間違っている箇所もあると思います。
今自分が勉強しないといけないこと


- Linux/UNIX
    - [Linux - Wikipedia](https://ja.wikipedia.org/wiki/Linux)
    - [Unix系 - Wikipedia](https://ja.wikipedia.org/wiki/Unix%E7%B3%BB)
- パッケージ管理システム
    - ubuntu
        - [apt-getとaptitudeって結局どう違うの(´･ω･｀)？ – もぐら王国](http://mole-kingdom.com/wpbl/2013/08/08/5854.html)
- shellとは
  - bash
       - bashrc
  - zsh
       - zshrc
  - shellスクリプト
- vi/vim
  - vimプラグイン
- tmux or screen
- バージョン管理
    - git
        - github
        - gitlab
        - dotfiles
- httpサーバー
    - httpsについて
    - nginx
    - apache
    - サーバーサイドスクリプト
        - php
        - ruby on rails←ここに入れるべきじゃないかも
        - perl←？
- Jenkins
- docker
  - dockerhub
- minecraft server

いっぱいある(；・∀・)
きっと増える。
でも学ぶ。
一応どんな環境でもQiita見れない状態は無いはずなので、
この記事にどんどん参考記事などを追記する。
※もし利用規約上問題があった場合は消す←自分への言い聞かせです。
[利用規約 - Qiita](https://qiita.com/terms)を読んだ限りでは問題無さそうでした・・・たぶん・・・。
NoSQL


自分が今使用している、またはこれから使うNoSQLサーバーをまとめてました。
## memocached

### レスポンスを早くする
基本webアプリケーションはRDBにデータを保存し、
その中から必要なデータを取り出して、ブラウザに表示しています。

データが増えたり、データが複雑化したデータ(join等)を返すとレスポンスが遅くなってしまいます。

#### 例
googleではレスポンスが0.5秒遅くなると、検索数が20%減り、
Amazonではレスポンスが0.1秒遅くなると売り上げが1%減少する
[Aberdeen Group社調べ](http://www.ini.co.jp/services/performance.html)

ユーザーはなかなか厳しいんですよ...


###  特徴

すべてメモリ上でデータが保持され、
keyに対してvalueを保持するだけなのでいたって単純。



なのでkeyを同じにするのは危険です。


そしてスピードが凄い。
メモリ上のデータにアクセスするので
ディスクIOが発生するRDBと比べて、
10万倍〜100万倍速い。

## Redis


redisもmemocachedと同じでkey-value型インメモリdbです。

## 特徴

memocachedはRDBに対するキャッシュとして、RDBと組み合わせての
用途を想定しているのでシンプルな操作に特化しています。


それに対してRedisはデータストアとして利用可能であるように設計されているので多くのコマンドでアトミックに処理することができる。



### スナップショット

メモリ上のデータをディスクに書き出す機能で、データを永続化します。


##　データ形式とアトミック処理

valueとして
文字列、リスト型、セット型、ソート済みセット型、ハッシュ型と様々な文字列を操れる。

アトミックなどそのうち追加します。

## MongoDB

そのうち書きます
Airmac ExtremeのHDDをCentOS 7からマウントする


tl;dr
---------------

```
sudo mount.cifs //192.168.xxx.xxx/airmac_usb /mnt/airmac_usb -o sec=ntlm,password=xxxxxxxxxxxxxxxxxxx
```

「共有ディスクのセキュリティを保護」ポップアップメニューで、「ディスクパスワード」または、「装置パスワード」を選択した場合は、 `user` オプションは不要。 `password` としてそこで指定したパスワードを設定する。「アカウント」を選択した場合は、そのユーザー名ももちろん必要。

カーネル 3.8以降、secオプションのデフォルトが`ntlmssp`になっているので、それまでと同じ挙動にするには、`ntlm` を指定する必要がある。 `ntlmv2` でも良いかと思っていたけど、それだと、

```
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
```

になってしまった。

経緯
-----

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">airmac extremeにcent osからつなげるの、すごい時間かかってしまった。<br>sec=ntlmが必要だったとは。。。<a href="https://t.co/d9fQd7RNRd">https://t.co/d9fQd7RNRd</a></p>&mdash; シラカワ ヒロユキ (@shrkwh) <a href="https://twitter.com/shrkwh/status/724123485501452288">2016年4月24日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ふむー、これ指定しないといけなかったのか。<br>sec=<br> Security mode. Allowed values are:<br> ntlm - Use NTLM password hashing</p>&mdash; シラカワ ヒロユキ (@shrkwh) <a href="https://twitter.com/shrkwh/status/724125521991229440">2016年4月24日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">&gt; The default in mainline kernel versions prior to v3.8 was sec=ntlm. In v3.8, the default was changed to sec=ntlmssp.<br>なるほどねー。</p>&mdash; シラカワ ヒロユキ (@shrkwh) <a href="https://twitter.com/shrkwh/status/724125893145174016">2016年4月24日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">$ uname -r<br>3.10.0-327.10.1.el7.x86_64<br>なるほどなるほど。</p>&mdash; シラカワ ヒロユキ (@shrkwh) <a href="https://twitter.com/shrkwh/status/724125928712867840">2016年4月24日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

参照
------------

- [NAS を CIFS でマウントしようとしたら Permission denied になった話 - プらチナの日記](http://pt-diary.tumblr.com/post/110943059040/mount-permission-denied)
- [Raspberry Pi • View topic - Airport Extreme USB Hard Drive](https://www.raspberrypi.org/forums/viewtopic.php?f=26&t=45632)
オンラインでプログラミングして実行できるwandboxをさくらのVPSで立ち上げる


[オンラインでプログラミングして実行できるサイト](http://qiita.com/tttamaki/items/2b009aa957cfa4895d50)の中でも優れたwandboxを自前で用意する．

使ったのは「さくらのVPS」で，「ubuntu 14.04LTS」をカスタムOSでインストール．
ちなみに，DTIのServerMan@VPSではkernelを変更できないので，setcapが実行できず，cattleshedが動かないため，wandboxには使えない．


# wandboxのインストールと設定

sudoできるユーザーで，以下のシェルスクリプトを実行．
https://gist.github.com/tttamaki/658e1e5baf0471b120a67d57736bf45c

基本は[wandboxを自前サーバに一般ユーザーで導入する方法](http://qiita.com/tttamaki/items/d8eb86d403762e33d2be)を参考．


## 追加
```diff:インデント単位を2にする

--- ./wandbox/kennel2/static/js/root.js.org 2016-05-05 17:24:21.907327940 +0900
+++ ./wandbox/kennel2/static/js/root.js	    2016-05-30 17:25:40.712037317 +0900
@@ -365,7 +365,7 @@
   var codemirror = CodeMirror(elem[0], {
     lineNumbers: true,
     theme: 'user',
-    indentUnit: 4,
+    indentUnit: 2,
     extraKeys: {
       'Ctrl-Enter': function() {
         if (self.onrun)
```


# セキュリティ設定

## iptables

wandboxがデフォルトでは3500番ポートで待っているので，それを許可

```sh:iptabesで設定
sudo iptables -A INPUT -p tcp -m tcp --dport 3500 -j ACCEPT
```

これ以外は，一般的なiptablesの設定を参考にする

## その他

- rootログイン不許可
- パスワードログインは不許可，sshは公開鍵で
- sshポートを変更

情報は検索すれば見つかります．


# 自動update

```sh:unattended-upgradesを利用
sudo apt-get instal unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
```

# DNS

どこかでDNSを利用したら，kennel.jsonの"domain"に書いておく．
Railsで親モデルを保存した時に子モデルを作る


ユーザーとプロフィールなどのhas_oneの関係にある場合にレコードを挿入したい場合があると思います。


ActiveRecordにはafter_createというコールバックがあるみたいなのでこんな感じに書いてみました。


```
class User < ActiveRecord::Base

  after_create :create_profile

  private
    def create_profile
      if self.id
        Profile.create(:name => "name", user_id: self.id)
      end
    end

end
```

ちなみに after_saveというコールバックもあるみたいですがこちらはモデル作成、更新時に毎回呼び出されるらしいです。
PosgreSQL9.5のインストール

目的：OSS-DB Silver/Goldの勉強のための環境構築のメモ


```rb:環境
OS :CentOS Linux release 7.2.1511 (Core)
CPU:Intel(R) Core(TM) i5-3317U CPU @ 1.70GHz
MEM:4GB
```

手順1：現状でインストールできるVesionの確認

```rb:コマンド
$ sudo yum list postgresql
```

手順2:最新(安定)Vesionのインストール準備（リポジトリのインストール）

```rb:コマンド
$ wget https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7-x86_64/pgdg-centos95-9.5-2.noarch.rpm

$ rpm -ivh pgdg-centos95-9.5-2.noarch.rpm
```

手順3:必要なパッケージのインストールとリポジトリの無効化

```rb:コマンド
$ sudo yum install postgresql95-server postgresql95-devel postgresql95-contrib

$ sudo vim /etc/yum.repos.d/pgdg-95-centos.repo
-enabled=1
+enabled=0
```

手順4:DBの書記セットアップ(いきなり手順5をすると怒られました、messageログを見ると詳細書いてあるよ)

```rb:コマンド
$ /usr/pgsql-9.5/bin/postgresql95-setup initdb
```

手順5:DBの起動

```rb:コマンド
$ systemctl start postgresql-9.5
```

手順6:[任意]デーモンへの登録(今回は勉強時に起動さればいいので実施せず)

```rb:コマンド
$ systemctl enable postgresql-9.5
```


参考/情報サイト
***
*  [働きたくないゆとりの備忘録](http://www.hack-log.net/entry/2015/04/26/100000) 様のブログ
* [OSS-DB Silver/Gold](http://www.oss-db.jp/outline/silver.shtml) の詳細
*  [日本 PostgreSQL ユーザ会](https://www.postgresql.jp/) ※MLに登録して情報をゲット
*  [9.5のリポジトリ](http://yum.postgresql.org/repopackages.php#pg95) ※開発で9.6あり


細かい所は気が付いたら修正していこうかと。。。
KVMでのゲストマシンをCentOS6ホストからCentOS7ホストへ移行

## はじめに
KMVを用いた仮想マシンにおけるゲストマシンをCentOS6ホストからCentOS7ホストへ移行させたときのメモをまとめます。

## 移行元マシン(CentOS6)での操作
### 現在のゲストマシンを確認
```
$ virsh list --all
```
移行対象マシンが停止していることを確認する

### 移行対象のゲストマシンのXMLを出力
```
$ virsh dumpxml guest_machine01 > guest_machine01-backup.xml
```
※ `guest_machine01`は登録されているゲストマシン名
### qcow2ファイルとXMLファイルを移行先マシンへ移動

## 移行先マシン(CentOS7)での操作
### XMLファイルの修正
XMLファイルからマシンを立ち上げるためにコピーしてきたXMLファイルを修正する

① `<address type='pci'/>`のタグを全て削除  
仮想マシンに対するPCIデバイスの割り当てはマシンで異なるので削除  
後述の`virsh define`で自動で新たに割り当てられる。


② `driver`タグ内の`cache`アトリビュートと`native`アトリビュートを削除
例

```
<driver name='qemu' type='qcow2' cache='writeback' io='native'/>
```
↓

```
<driver name='qemu' type='qcow2'/>
```
③ `source`タグ`bridge`アトリビュートを移行先マシンのブリッジに修正
例
`<source bridge='lan_br'/>`
④ `source`タグ`file`アトリビュートのqcow2ファイル保存先を移行先マシンのものへ修正
例
`<source file='/storage/qcow2/guest_machine01.qcow2'/>`

### XMLファイルからゲストマシンをドメイン登録
```
$ virsh define guest_machine01.xml
```
### XMLファイルから仮想マシンを立ち上げる
```
$ virsh create guest_machine01.xml
```
仮想マシンが起動されます
複数のプロセスによる処理

以下の書籍に載っているサンプルを実装します。
[すごいErlangゆかいに学ぼう！](https://www.amazon.co.jp/%E3%81%99%E3%81%94%E3%81%84Erlang%E3%82%86%E3%81%8B%E3%81%84%E3%81%AB%E5%AD%A6%E3%81%BC%E3%81%86%EF%BC%81-Fred-Hebert-ebook/dp/B00MLUGZIS?ie=UTF8&*Version*=1&*entries*=0)

Erlangにて、マルチプロセスで動くような機能を利用します。
機能概要は以下のような形とします。
**「冷蔵庫の中身を管理するアプリ」**
・CLI（erlシェル）で実装する
・冷蔵庫に食材（？）追加する機能
・冷蔵庫から食材を出す機能
・可能な限り抽象化する

**プログラム**

```erlang:kitchen.erl
-module (kitchen).
-compile (export_all).

fridge (FoodList) ->
  receive
    {From, {store, Food}} ->
      From ! {self (), ok},
      fridge ([Food| FoodList]);
    {From, {take, Food}} ->
      case lists:member (Food, FoodList) of
        true ->
          From ! {self (), {ok, Food}},
          fridge (lists:delete (Food, FoodList));
        false ->
          From ! {self (), not_found},
          fridge (FoodList)
        end;
    terminate ->
      ok
  end
.
store (Pid, Food) ->
  Pid ! {self (), {store, Food}},
  receive
    {Pid, Msg} -> Msg
  after 3000 ->
    timeout
  end
.
take (Pid, Food) ->
  Pid ! {self (), {take, Food}},
  receive
    {Pid, Msg} -> Msg
  after 3000 ->
    timeout
  end
.
start () ->
  FoodList = [milk, chicken, bread],
  spawn(?MODULE, fridge, [FoodList])
.
```

**実行**

```erl:kitchen_exe
1> c(kitchen).
{ok,kitchen}
2> Pid = kitchen:start().
<0.41.0>
3> kitchen:take(Pid, milk).
{ok,milk}
4> kitchen:take(Pid, milk).
not_found
5> kitchen:store(Pid, tea). 
ok
6> kitchen:take(Pid, tea). 
{ok,tea}
```

少しずつErlangの機能が見えてきました。プロセス生成、メッセージパッシング、プロセスライフサイクル、プロセスモニタ、プロセスリンクなど並列、分散処理を実現する上で、考慮しなければならないことが機能やデザインパターンでまとまっていて、凄く勉強になります。

冒頭で挙げた書籍は、Erlangの技術知識もそうですが、関数系言語の説明、複雑なプログラムの抽象化など、たくさんの知識が得られてすばらしい内容ですね（ちょっと古いですが。。）
アメリカ大統領選の候補者の情報を取得してくれる Gem

[TwentySixteen](https://github.com/debate-watch/twenty_sixteen)

2016 アメリカ大統領選の候補者の情報を取得できる Gem

# 使い方

入れる

```
gem install twenty_sixteen
```

Active Record みたいに `all` や `where` や `find` メソッドが用意されているよう

```rb
TwentySixteen::Candidate.all

TwentySixteen::Candidate.where(party: 'Democrat', campaign_status: 'active')

TwentySixteen::Candidate.find_by_url('https://www.hillaryclinton.com/')
TwentySixteen::Candidate.find_by_last_name('Trump')
```

共和党・民主党単位でも取れるみたい。

```rb
TwentySixteen::Candidate.democrat
TwentySixteen::Candidate.republican
```

いいね！

ただ、Gem 内の `candidates.json` を取ってきているだけというのと、情報が少ないのがちょっと残念。

```rb
TwentySixteen::Candidate.find_by_last_name('Trump').inspect

#=> "{:party=>\"Republican\", :first_name=>\"Donald\", :last_name=>\"Trump\", :url=>\"https://www.donaldjtrump.com/\", :campaign_name=>\"Donald J. Trump for President\", :campaign_status=>\"active\", :slogans=>[\"Make America Great Again!\"], :social_urls=>[\"https://twitter.com/realdonaldtrump\", \"https://www.facebook.com/DonaldTrump\", \"https://instagram.com/realdonaldtrump/\", \"https://www.youtube.com/user/trump\"], :support_groups=>[]}"
```

でも、情報は後からいくらでも追加できるし、こうやって気軽にチャッと Gem にして、世の中に出すことが大事だなあとしみじみ。
JavaScriptのequalsIgnoreCase（大文字小文字を無視した同値判定）


http://stackoverflow.com/questions/2140627/javascript-case-insensitive-string-comparison

どうやらバッチリあてはまるメソッドはないっぽい？？
`toUpperCase`を使って、どちらも大文字にしてから比較しているようでした。

```
var areEqual = string1.toUpperCase() === string2.toUpperCase();
```
すでに使用している Core Data を App Group で共有する

記事の内容はこちらを参照してください。
https://mishimay.github.io/74d7e768c0f7ba30d66c/
<!--

現在使用している Core Data のデータファイルを、App Group で共有するためのフォルダ (shared container) へ移動する必要があります。

# 手順
1. [App Groupでアプリ間データ共有](http://www.toyship.org/archives/1845) などを参考に App Group を有効にする
1. Core Data のデータファイルを shared container へ移動
    - `NSPersistentStoreCoordinator ` のメソッド `migratePersistentStore:toURL:options:withType:error:` で移動
    - 移動したら元のファイルは消しておく

# データファイル移動の実装例
```swift
    func migrate(from: NSURL, to: NSURL) {
        // すでに移動されているかチェック
        guard let path = from.path where NSFileManager.defaultManager().fileExistsAtPath(path) else { return }

        let managedObjectModel = NSManagedObjectModel(contentsOfURL: NSBundle.mainBundle().URLForResource("xxxxx", withExtension: "momd")!)!
        let persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)

        let options = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true]
        let oldPersistentStore = try! persistentStoreCoordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: from, options: options)
        try! persistentStoreCoordinator.migratePersistentStore(oldPersistentStore, toURL: to, options: nil, withType: NSSQLiteStoreType)

        try! NSFileManager.defaultManager().removeItemAtPath(path)
    }


    let oldStoreUrl = xxxxx
    let newStoreUrl = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.com.xxxxx")!.URLByAppendingPathComponent("xxxxx.sqlite")

    migrate(oldStoreUrl, to: newStoreUrl)
```

# 環境
Xcode 7.3
Swift 2.2

# 参考
[ios - coredata - move to app group target - Stack Overflow](http://stackoverflow.com/questions/27253566/coredata-move-to-app-group-target/27257535#27257535)


-->
pythonでquicksort

Learn You Haskell for Great Goodに出てくる`quicksort`を，リスト内包や再帰もそのままでpythonで作成。ただそれだけなんだけど，いつか何かの役に立つかもしれないので一応残しておこう。

```py3
def quicksort(x):
    if x==[]: return []
    
    smallerSorted = quicksort([a for a in x[1:] if a <= x[0]])
    biggerSorted = quicksort([a for a in x[1:] if a > x[0]])

    return(smallerSorted+[x[0]]+biggerSorted)

x = [10,2,5,3,1,6,7,4,2,3,4,8,9]
print(quicksort(x))
```

#### 実行結果
```
[1, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8, 9, 10]
```
Rubyで指定した要素の繰り返しで配列を作る方法。

以下のようにすれば、指定した文字の繰り返しで配列が作成できる。

```sample.rb
array = Array.new(10){"a"}

array[3].upcase!
p array 
#=> ["a", "a", "a", "A", "a", "a", "a", "a", "a", "a"]
```

なお、Array.newを使わないで以下のようにすると配列はできるが、要素は全て同じオブジェクトになってしまう。そのため要素に破壊的変更を加えると、全ての要素が同じ影響を受けてしまう。

特に理由がなければ上記のやり方のほうがいい。

```sample.rb
array = ["a"]*10
# => ["a", "a", "a", "a", "a", "a", "a", "a", "a", "a"]

array[3].upcase!
p array 
=> ["A", "A", "A", "A", "A", "A", "A", "A", "A", "A"]
```
Gitブランチについての基本まとめ


## ブランチとは
作業履歴を枝分かれさせて記録していくためのもの。

### 使うと何がいいのか？
- 他のブランチの影響を受けないため複数の作業を同時に進められる
- 作業単位で履歴を残すことで後で見た時にわかりやすい

つまり、複数人で開発するときにはそれぞれが他の作業者の影響を受けずに進められるし、ひとりで開発する場合でも作業履歴を綺麗に管理しておけるので使用した方がいい。

## ブランチの運用
### 統合ブランチ
リリース版がいつでも作成可能なようにしておくためのブランチ。
なので、常に安定した状態を保っておくことが重要。
通常、masterブランチを統合ブランチとする。

### トピックブランチ
機能追加やバグ修正といったある課題に関する作業を行うためのブランチ。
安定した統合ブランチから分岐する形で作成し、作業が完了したら統合ブランチに取り込むという使い方をする。

## ブランチの切り替え
ブランチを切り替えるにはチェックアウトという操作を行う。
チェックアウトすると移動先の最終コミット内容にバージョンが変わる。

### まだコミットしていない内容があるのにチェックアウトした場合
変更内容がチェックアウトしたブランチに移動する。
競合する場合はチェックアウトに失敗する。
そのような場合はスタッシュをして変更内容を退避させてからチェックアウトする。

## ブランチの統合
ブランチの統合にはマージとリベースの2つがある。

### マージ
マージは統合ブランチにチェックアウトしている状態で、トピックブランチをマージするという手順で行う。
トピックブランチが統合ブランチから分岐した状態から統合ブランチが編集されていなければ普通にマージされるだけで完了する。これを早送りマージという。
もし、統合ブランチが編集されていればそれぞれを統合した新たなコミットが統合ブランチで行われる。

### リベース
リベース元の履歴がリベース先のブランチの後ろに追加される形で一本化される。

### マージとリベースは例えば下記のように使い分ける
- トピックブランチに統合ブランチの最新のコードを取り込む場合はrebaseを使う
- 統合ブランチにトピックブランチを取り込む場合は、まずrebaseしてからmerge

## ブランチの名前づけ
### master
- リリース可能な状態だけを管理する
- 特定のブランチからマージすることによってしか更新されない
- 直接コミットしてはならないという制約をもつ
- バージョンごとのtagはここから生まれる

### develop/[バージョン番号など]
- 先のリリースに向けた普段の開発で使用する
- 後述のfeatureやreleaseブランチはここから派生

### feature/[派生元バージョン番号など]/[機能名など]
- 機能追加・改修などを行う作業ブランチ
- developブランチから、featureブランチを切る
- 完了後はdevelopブランチにマージされて、featureブランチは削除される

### その他
- release/[バージョン番号]
- fix/[バージョン番号]/[バグ識別名]
- support/[バージョン番号]
- hotfix/[バージョン番号]/[バグ識別名] or hotfix/[バグ識別名]

## 参考URL
[サルでもわかるGit入門](http://www.backlog.jp/git-guide/stepup/stepup1_1.html)
[ぼくが実際に運用していたGitブランチモデルについて](https://havelog.ayumusato.com/develop/git/e513-git_branch_model.html)
PHP の RAII なんて幻想

次のようなコードがあったとして、

```php
function main()
{
    try {
        foo(false);
    } catch (Exception $ex) {
        echo $ex->getMessage() . PHP_EOL;
    }

    try {
        foo(true);
    } catch (Exception $ex) {
        echo $ex->getMessage() . PHP_EOL;
    }
}

function foo($ok)
{
    $file = new SplFileObject(__DIR__ . '/hoge.txt', 'a');
    if ($file->flock(LOCK_EX|LOCK_NB) == false) {
        throw new RuntimeException("Unable lock file");
    }
    bar($file, $ok);

    // この関数を抜けたときにファイルは閉じられるはず
}

function bar(SplFileObject $file, $ok)
{
    // なにか処理する

    if ($ok == false) {
        // 失敗したので例外を投げる
        throw new RuntimeException("oops!!!");
    }

    echo "ok\n";
}
```

`main` 関数の１回目の `foo` は `bar` が例外を投げますが、`SplFileObject` が `foo` のスコープを抜けたときにオブジェクトが破棄されるためデストラクタでファイルも閉じられており、２回目の `foo` の実行時にはファイルのロックは解放されているはず、、、ですが、実際には２回目の `foo` が実行されるときにはファイルが開かれたままで、ロックも取られたままになっています。

```
$ php 1.php
oops!!!
Unable lock file
```

１回目の `foo` からの例外を受けた後に、例外オブジェクトを `unset` とかしてやればとりあえず大丈夫です。

```php
function main()
{
    try {
        foo(false);
    } catch (Exception $ex) {
        echo $ex->getMessage() . PHP_EOL;
        unset($ex);
    }

    :
}
```

がしかし「例外をキャッチした後は例外オブジェクトを `unset` すること」などという規約が受け入れられる人は稀だと思います。ので、RAII なんて無かったことにして `try...finally` で明示的に閉じるほうが良いでしょう。

```php
function foo($ok)
{
    $file = new SplFileObject(__DIR__ . '/hoge.txt', 'a');

    try {
        if ($file->flock(LOCK_EX|LOCK_NB) == false) {
            throw new RuntimeException("Unable lock file");
        }
        bar($file, $ok);
    } finally {
        $file->fclose();
    }
}
```

と言いたいところですが `SplFileObject` に `fclose` などというメソッドはありません。`SplFileObject` によって開かれているファイルを閉じるにはガベージコレクションでオブジェクトが破棄されるのに任せるしかありません。たぶんもう詰んでいます。

しいて言えば次のように `finally` でアンロックするとかでしょうか。ファイルは閉じれませんがロックは解放されます。ファイルは閉じれませんが。

```php
function foo($ok)
{
    $file = new SplFileObject(__DIR__ . '/hoge.txt', 'a');

    if ($file->flock(LOCK_EX|LOCK_NB) == false) {
        throw new RuntimeException("Unable lock file");
    }

    try {
        bar($file, $ok);
    } finally {
        $file->fflush();
        $file->flock(LOCK_UN);
    }
}
```

---

`SplFileObject` に `close` とか `fclose` のようなメソッドが無いのはオブジェクトが破棄されればデストラクタで勝手に閉じられるからだと思うんですけど、上記のように意図せず延命されることがあるので RAII に頼ったコードは書きにくいなーと思います。

`PDO` も明示的に切断するメソッドが無いので似たようなことで困ったことがありました。もっとも、明示的に DB から切断したいことはまず滅多ありませんけど。

---

この問題、例外のスタックトレースに呼び出し履歴の引数がそのまま含まれているためなので、`SplFileObject` のようなデストラクタでリソースの解放が行われるオブジェクトを関数の引数にしなければ回避できる問題なのですが、

- [オブジェクトが例外の呼び出し履歴に参照されてデストラクタが呼ばれない](http://ngyuki.hatenablog.com/entry/20121021/p1)

`set_error_handler` から `ErrorException` を投げるようにしていたりすると、もっと面倒なことになります。

- [カスタムエラーハンドラ（set_error_handler）から例外を投げるとスコープ内の変数が例外から参照される](http://ngyuki.hatenablog.com/entry/20121022/p1)

Notice や Warning が発生すると、関数のローカルスコープにしか存在しない変数でも関数の外まで例外に乗ってばこーんと飛んできます。
ターミナルのウィンドウとタブに自動的に名前をつける


ターミナルのウィンドウとタブの名前は全部 zsh とかになっていて、あまり意味がない。ウィンドウにはカレントディレクトリのフルパスを、タブにはディレクトリ名を表示するように設定する。

`~/.zshrc` に

```zsh
function precmd() {
  # カレントディレクトリを $HOME を ~ として表示
  local wname=`pwd | sed -e "s|$HOME|~|"`
  # カレントディレクトリ名
  local tname=`pwd | sed -e 's|^.*/||'`

  echo -ne "\033]2;$wname\007" # window title
  echo -ne "\033]1;$tname\007" # tab title
}
```

iTerm2.app だけかもしれないけど、`\033]1;` でタブの名前、`\033]2;` でウィンドウの名前が別々につけられる。

![iterm_titles.png](https://qiita-image-store.s3.amazonaws.com/0/63210/75703eb7-e5c1-b745-c82f-169a52b20811.png "iterm_titles.png")
Hubotの環境構築でつまりました。（generator-hubotがインストールできない）

こんにちは。Hubotについて質問です。
[こちら](http://qiita.com/mochidamochiko/items/29c2d77715d8a1ff062a)を参照してHubotを自前の環境で動かしてみようと思ったのですが、うまくいきません。

generator-hubotをインストールする際にwarnが出ていることがわかりました。
css-select、css-whatは双方インストールしたのですが、このWARNが消えず、
generator-hubotがインストールされません。
解決方法を教えていただけたらうれしいです。

環境
windows10
npm 3.8.8
node.js v6.0.0
yo 1.7.0


~~~
C:\Users\UserName>npm install -g generator-hubot
npm WARN deprecated CSSselect@0.4.1: the module is now available as 'css-select'
npm WARN deprecated CSSwhat@0.4.7: the module is now available as 'css-what'
C:\Users\UserName\AppData\Roaming\npm
+-- generator-hubot@0.3.1
`-- UNMET PEER DEPENDENCY yo@>=1.0.0

npm WARN generator-hubot@0.3.1 requires a peer of yo@>=1.0.0 but none was installed.

C:\Users\UserName>


~~~


ちなみにこのまま実行すると、adapterを選択したところでエラーが出ます。
~~~
C:\Users\UserName\ryobot>yo hubot
（hubotのアスキーアート・・・）
? Owner (User <user@example.com>)
? Owner User <user@example.com>
? Bot name ryobot
? Description A simple helpful robot for your Company
? Bot adapter (campfire) slackgot back false

C:\Users\UserName\AppData\Roaming\npm\node_modules\yo\node_modules\rx\dist\rx.js:77
    throw e;
    ^
 true

C:\Users\UserName\ryobot>
~~~
APIKitを利用してAPIに画像をアップロード

完全にメモ用なのですが、あまり情報が整理されてなかったので投稿。

v1.2.0ぐらいから`multipart/form-data`がサポートされているのでそれを利用する。

詳細：multipart/form-data support
https://github.com/ishkawa/APIKit/pull/128

抜粋

```swift

struct PostImageRequest: RequestType {
    typealias Response = ImageReponse

    var imageFileURL: NSURL // "file://~/image.jpg"
    var imageData: NSData
    let requestBodyBuilder: RequestBodyBuilder = .MultipartFormData
    let method: HTTPMethod = .Post
    let path = "/api/image"

    var parameters: [String : AnyObject] {
        return [
            "image1" : imageFileURL, 
            "image2" : MultipartFormDataSerialization.Parameter(data: imageData, mimeType: "image/jpeg")
            "flag" : true
        ]
    }
}

```

自分はRailsのAPIに投げたので、これをcarrierwaveを利用してアップロードしました。
ストロングパラメーターを使わないとencoding周りでエラーが出たので、同様の症状出た人は気をつけて下さい。

S3にダイレクトで上げる方法もあるみたいなので実際にやるときはそっちをやろうかな。
Twitter4JでTweetを取得してみた

大掛かりなものではなく、とりあえずTweetが取れればOKというものを作った。このプログラムは何度も作ってる気がする。[Github](https://github.com/keigohtr/twitter-crawler-scruch)に上げたので、次からは簡易版Tweet取得機は作らなくて良いはず。
clang 32bit コンパイル で  /usr/bin/ld: fatal error: failed to allocate memory

# clang 32bit コンパイル で /usr/bin/ld: fatal error: failed to allocate memory

## 問題

ubuntu 14.04 32bit で `./emsdk install clang-incoming-32bit` しようとしたところ、`emsdk_portable/clang/fastcomp/build_incoming_32/bin/clang-3.9` のリンク時に `/usr/bin/ld: fatal error: failed to allocate memory` というエラーを吐いて止まった。

## 原因

32bit OS では 4GB までしかメモリを使えないのに 32bit clang のコンパイルに 4GB 以上メモリ使っている。

## 解決策

`ld` の [-no-keep-memory](https://linuxjm.osdn.jp/html/GNU_binutils/man1/ld.1.html`) オプションを強制的に使わせるために ld　の代わりの shell script を書く。

```
mv /usr/bin/ld /usr/bin/ld.old
echo '/usr/bin/ld.old --no-keep-memory $@' > /usr/bin/ld
chmod a+x /usr/bin/ld
```

これでリンクできた。


```
rm /usr/bin/ld
mv /usr/bin/ld.old /usr/bin/ld
```

終わったら元に戻しておく。

## 参考

* http://stackoverflow.com/questions/33551473/ld-fatal-error-failed-to-allocate-memory
* http://stackoverflow.com/questions/25197570/llvm-clang-compile-error-with-memory-exhausted
* https://linuxjm.osdn.jp/html/GNU_binutils/man1/ld.1.html
CentOS7にphoenix環境を入れる

参考：http://qiita.com/yokaigundan/items/0e8da4938bd91fab400b

# この記事の目標
- erlangのインストールから始めて、phoenixで何か動かすところまで。
- yumだとElixirが上手く入らないのでyum以外で。
- Erlangはver.18を使う

# Erlang(evm)インストール

参考にした記事 + ncurses-devel で十分のよう。

```shell-session
sudo yum install -y lynx wget curl git nodejs npm redhat-lsb inotify-tools ncurses-devel
git clone https://github.com/robisonsantos/evm.git
cd evm
./install

echo 'source /home/$USER/.evm/scripts/evm' >> ~/.bashrc
source ~/.bashrc

evm list
evm install OTP_18.3
# この記事の時点での最新版
evm default OTP_18.3

cd ../

erl
```

# Elixir(kiex)

IEx (Interactive Elixir)

```shell-session
\curl -sSL https://raw.githubusercontent.com/taylor/kiex/master/install | bash -s
echo 'test -s "$HOME/.kiex/scripts/kiex" && source "$HOME/.kiex/scripts/kiex"' >> ~/.bashrc
source ~/.bashrc
kiex list known
kiex install 1.2.5
kiex use 1.2.5

iex
```

# rebar
makeみたいなツール。

```shell-session
git clone git://github.com/rebar/rebar.git
cd rebar
./bootstrap
sudo mv rebar /usr/local/bin/
rebar -V

cd ../
```

# phoenix

```shell-session
mix local.hex
mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez
```

# phoenixで何か作ってみる

```shell-session
mix phoenix.new hello_phoenix
```

## npmを更新しておく

```shell-session
sudo npm install -g npm
mix deps.get
npm install
```

## nodeのバージョン更新しておく
参考：http://parashuto.com/rriver/tools/updating-node-js-and-npm

```shell-session
sudo npm install -g n
sudo n --stable
sudo n latest
```

## 走らせてみる

```shell-session
cd hello_phoenix
mix phoenix.server
```

## アクセスしてみる
別ターミナルでcurl

```shell-session
curl localhost:4000
```
Vue.jsとanimete.cssでアニメーション

# Vue.js
vueでSPA作るならvue-routerもほぼ必須。

```bash
$ npm install vue vue-router --save
```

# コンポーネントを作る
今回はscriptタグでテンプレートを記述するがvue-loaderなどを使うと１ファイル１コンポーネントで分離して書けるので便利。

```jade
    script(id='page-1' type='x-template')
      .page
        h1 ページ１
        img(src='img/page-1.gif' alt='page-1')
```

js側でhtmlに書いたテンプレートを拾ってコンポーネントを登録する。
vue-routerを使ってroute別に表示/非表示を切り替える。

```js
components.p1 = Vue.component('page-1', {
  template: '#page-1'
});
```

# animate.css
https://github.com/daneden/animate.css
全部は入らないのでいるアニメーションだけとってくる。
今回は表示にfadeInUp、非表示にslideOutRightを使う。

デフォルトのままだと表示と非表示のアニメーションが同時に発火するため、新しく入ってくるコンポーネントが前のコンポーネントに引っかかってカクつく。

[![https://gyazo.com/d4f9bbdaeb3925397da0152575c48c93](https://i.gyazo.com/d4f9bbdaeb3925397da0152575c48c93.gif)](https://gyazo.com/d4f9bbdaeb3925397da0152575c48c93)

そこで表示のアニメーションに `animation-delay` を指定して前のコンポーネントが消えるまで表示アニメーションを遅延させる。

```scss
/* アニメーション */
// 表示: fadeInUp
@keyframes fadeInUp {
  from {
    opacity: 0;
    transform: translate3d(0, 100%, 0);
  }

  to {
    opacity: 1;
    transform: none;
  }
}

.fadeInUp {
  animation-name: fadeInUp;
  animation-delay: 0.5s; // 前のコンポーネントが消えるまで遅延させる
  animation-duration: 1s;
  animation-fill-mode: both;
}

// 非表示: slideOutRight
@keyframes slideOutRight {
  from {
    transform: translate3d(0, 0, 0);
  }

  to {
    visibility: hidden;
    transform: translate3d(100%, 0, 0);
  }
}

.slideOutRight {
  animation-name: slideOutRight;
  animation-duration: 0.5s; // fadeInUpのanimation-delayと一致させる
  animation-fill-mode: both;
}
```

# トランジションを登録する
```js
Vue.transition('page', {
  enterClass: 'fadeInUp',
  leaveClass: 'slideOutRight',
});
```

# 要素にトランジションを適用する
```jade
    script(id='page-1' type='x-template')
      .page(transition='page') //- 登録したpageトランジションを適用
        h1 ページ１
        img(src='img/page-1.gif' alt='page-1')
```

# 動作
最終的な動作がこちら。カクつきがなくなった。

[![https://gyazo.com/c7331678041345ec7db3ea2c45bf3c40](https://i.gyazo.com/c7331678041345ec7db3ea2c45bf3c40.gif)](https://gyazo.com/c7331678041345ec7db3ea2c45bf3c40)

# おまけ
作ったサンプルページとソース置き場。

- [サンプルページ](http://nukosuke.github.io/vue-transition-sample)
- [ソース](https://github.com/nukosuke/vue-transition-sample)
LinearLayoutの高さ設定・ScrollViewの高さ設定

#LinearLayoutの高さ設定

```ruby:java
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.（ｉＤを設定）);
ViewGroup.MarginLayoutParams marginLayoutParams = (ViewGroup.MarginLayoutParams)linearLayout.getLayoutParams();
marginLayoutParams.height = （高さを設定）;
linearLayout.setLayoutParams(marginLayoutParams);
```

#ScrollViewの高さ設定

```ruby:java
ScrollView scrollView = (ScrollView) findViewById(R.id.（ｉＤを設定）);
ViewGroup.MarginLayoutParams marginLayoutParams = (ViewGroup.MarginLayoutParams)scrollView.getLayoutParams();
marginLayoutParams.height = （高さを設定）;
scrollView.setLayoutParams(marginLayoutParams);
```

##高さ以外の設定
marginLayoutParams.height = （高さを設定）;
上記の　height　部分を変更すると、
WidthやMarginなども設定できます。
声に出して読みたい Java ライブラリ -TimeUnit-

# 概要
皆さんの Repository にこんな定数はありませんか？

```java:すてきな定数
/** 1日を表すミリ秒数. */
public static final int ONE_DAY = 86400000;
```

あるようでしたら以下をご覧ください。

# 指摘
```java:再掲
/** 1日を表すミリ秒数. */
public static final int ONE_DAY = 86400000;
```

見れば見るほど突っ込みどころのある素敵な定数ですね。

1. 型が long でなく int
2. 一目で見て何ミリ秒なのかわかりにくい
3. 定数名から単位がわかりにくい

## 修正案1
では、こうするのはどうでしょうか？

```java:少し修正
/** 1日を表すミリ秒数. */
public static final long ONE_DAY_MS = 86400 * 1000L;
```

1. 型を long に変更した
2. 1000 をかけてミリ秒であることをわかりやすくした
3. 定数名に単位(ms)を追加した

多少わかりやすくはなりました。~~が、最初の1回だけとはいえあまり必要性を感じない乗算が発生するのは微妙な感じですね。~~ 間違った認識でした。後述します。

## 修正案2
Java SE7 からは整数リテラルの桁区切りに _ を含めることができるようになりましたので、それを使ってみましょう。

```java:さらに少し修正
/** 1日を表すミリ秒数. */
public static final long ONE_DAY_MS = 86_400_000L;
```

指定したミリ秒数が 8,640万であることはわかりやすくなりました。ですが、そもそも 86,400 が1日の秒数だとすぐわかる方はそんなに多くないかもしれないですね。24 * 60 * 60 * 1000L と指定すれば多少わかりやすくなります~~るのかもしれませんが、乗算が復活します~~。

(追記) @shiracamus さんがコメントで指摘してくださったように、乗算でリテラルを定義した場合はコンパイル時に最適化が実施されます。定数(private static final)で定義すればインライン展開されるので、パフォーマンス上の問題はありません。

# TimeUnit
今回の場合、Java SE 1.5 で追加された [java.util.concurrent.TimeUnit](https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/TimeUnit.html) を使うといい具合に指定できます。

```java:TimeUnitで指定
/** 1日を表すミリ秒数. */
public static final long ONE_DAY_MS = TimeUnit.DAYS.toMillis(1L);
```

enumの時間単位を選択し、それを基準として各単位の duration に変換します。上記の例ですと 「1」「DAYS」を単位「Milli(Second)s」で変換しています。単に数値を記述してコメントで補うよりも、どれくらいの期間を指定しているのかコードからわかりやすくなっています。自己文書的なコードを目指す上ではよい修正です。

仮に1日が半日になった場合でも下記のようにすればOKです。

```java:TimeUnitで半日を指定
/** 半日を表すミリ秒数. */
public static final long ONE_DAY_MS = TimeUnit.HOURS.toMillis(12L);
```

## 使用できる時間単位
1日から1ナノ秒までサポートしています。

| 時間単位 | 説明 | 変換メソッド
|:---|:---|:---|
| DAYS | 1日(24時間) | toDays(duration) |
| HOURS | 1時間(60分) | toHours(duration) |
| MINUTES | 1分(60秒) | toMinutes(duration) |
| SECONDS | 1秒(1,000ミリ秒) | toSeconds(duration) |
| MILLISECONDS | 1ミリ秒(1,000マイクロ秒) | toMillis(duration) |
| MICROSECONDS | 1マイクロ秒(1,000ナノ秒) | toMicros(duration) |
| NANOSECONDS | 1ナノ秒 | toNanos(duration) |

# まとめ
ある単位での時間を整数値で保持、または指定したい場合は TimeUnit の使用を検討しましょう。コードの可読性が向上します。

(追記) ただ、パフォーマンス上では private static final の定数を乗算で定義した方が有利のようです。

# 参考

## [OpenJDK 8u40-b25 での java.util.concurrent.TimeUnit の実装](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/concurrent/TimeUnit.java/)
『Effective Java』第2版で紹介されている enum の **定数固有メソッド実装** (*constant-specific method implementation*) がされているようです。コンパイラのアシストにより必要なメソッドの実装漏れを防ぐことができるパターンですので、覚えておくと今後の開発に役立ちそうな感じがします。

# 閑話
私は下記のクラスの実装を見て今回の記事を書くに至りました。
https://github.com/playframework/play1/blob/7dcda9599d532542b17ae10d591d8a76f5e464fd/framework/src/play/libs/Time.java#L19
Docker Private Betaを早速使ってみた

## 今朝以下のようなメールが到着

![メール](https://qiita-image-store.s3.amazonaws.com/0/93976/ad4df213-b2af-39ec-346a-41ad9d860312.png)

Docker Private Betaの申し込みを4/5に申し込んだので約1か月でお試し版が利用できるようになります。

## for macをインストール

#### 通常のアプリインストールの要領で実施

**1.インストール画面**

![インストール](https://qiita-image-store.s3.amazonaws.com/0/93976/eb99e744-2bbc-78b9-2c36-fff6ae82178c.png)

#### インストール画面 4step

**2.Docker.appを起動し、メールに記載されていたTOKENをコピペ**

![初回起動](https://qiita-image-store.s3.amazonaws.com/0/93976/afd81702-ead4-465e-6004-613e9c7813ea.png)

**3.下記画面が出てくればインストール完了**

![インストール完了](https://qiita-image-store.s3.amazonaws.com/0/93976/b28f3db1-356f-a386-9cd9-6fa0ad1ab06c.png)

![管理者アクセス](https://qiita-image-store.s3.amazonaws.com/0/93976/d09d918c-e25c-44b7-3a53-9a12689c9c88.png)

<font color="red">*途中、Mac管理者のパスワードを入力する必要があります。</font>

**4.タスクバーに常駐されれば完了！**

![タスク常駐](https://qiita-image-store.s3.amazonaws.com/0/93976/7be469b7-0cf0-3861-ba28-a175ca17753b.png)


## nginxをお試し起動

**docker run実行**

<img width="500" alt="minstall6.png" src="https://qiita-image-store.s3.amazonaws.com/0/93976/d9a6905e-eaf5-8a2a-c33a-6323aa13ab68.png">

```shell-session
$ docker run -d -p 8001:80 --name webserver nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx

efd26ecc9548: Pull complete 
a3ed95caeb02: Pull complete 
a48df1751a97: Pull complete 
8ddc2d7beb91: Pull complete 
Digest: sha256:2ca2638e55319b7bc0c7d028209ea69b1368e95b01383e66dfe7e4f43780926d
Status: Downloaded newer image for nginx:latest
3c3462c4e0d473202dc2433ad75f416de5a0d029e25ea67e856057a54da3b950
```

**起動確認**

<img width="400" alt="minstall7.png" src="https://qiita-image-store.s3.amazonaws.com/0/93976/a283c469-696d-65d6-63d8-0456e73e6ac8.png">

起動成功！！

***

## 所感

今回のDocker Private BetaについてはVirtualBoxなしで手軽に利用できる！というところが凄くいいところ。
まだBeta版ではありますが、手軽に使え、今後の可能性としてはローカルWEBアプリとしても利用できるんじゃないでしょうか？


## 番外編Windows7でインストール

#### 1.メール文中にある[Get docs and download the app]からインストールサイトへ

![メール](https://qiita-image-store.s3.amazonaws.com/0/93976/1bed6571-e44a-c37d-427a-b0fcd08d63f1.png)

#### 2.for windows版をダウンロード**

![download.png](https://qiita-image-store.s3.amazonaws.com/0/93976/fe1aa789-5aed-dc28-d9ec-2fda940e198c.png)

#### 3.msiから起動して、インストール実行** 

![errorwindows10.png](https://qiita-image-store.s3.amazonaws.com/0/93976/fb037ac1-32e3-f797-ab17-60b7e90d987e.png)

**(ﾉﾟοﾟ)ﾉ ｵｵｵｵｫｫ**

Windows10から対応しているようです。。。こちらはupgrade後試してみます。


## 参考サイト

[Docker Blog](https://blog.docker.com/2016/03/docker-for-mac-windows-beta/)