OmniAICreator/Qiita-1.07M huggingface dataset:
macにApache Sparkをインストール

macにapache sparkをインストールをしてみたので手順をメモ
※macのOSはOS X 10.8.5

# ダウンロード
以下からバイナリファイルのダウンロードリンクをコピーしてくる

http://spark.apache.org/downloads.html

ダウンロードページにいくと、

```text
・sparkのバージョン
・パッケージタイプ
・ダウンロードの仕方
```
を選択するセレクトボックスがあるので、それぞれ

```text
・1.1.1
・Pre-build for Hadoop 2.4
・Direct Download
```
を選択。すると、

```text
「4. Download Spark: spark-1.1.1-bin-hadoop2.4.tgz」
```
というリンクが表示されるので、そのリンクを右クリックでコピー


次に、ターミナルを開いてさっきのリンクからバイナリファイルをダウンロードする

```bash
$ cd /tmp

# ダウンロード
$ curl -O http://d3kbcqa49mib13.cloudfront.net/spark-1.1.1-bin-hadoop2.4.tgz

# ファイルを確認
$ ls 
spark-1.1.1-bin-hadoop2.4.tgz
```

ダウンロードしたファイルを解凍して適当なところに移動

```bash
# 解凍
$ tar xzf spark-1.1.1-bin-hadoop2.4.tgz

# ファイル確認
$ ls 
spark-1.1.1-bin-hadoop2.4

# 移動
$ mv spark-1.1.1-bin-hadoop2.4 /usr/local/share/spark
```
これで完了です。
うまくダウンロードできているか実際に動かしてみます。


# apache sparkを起動してみる
起動シェルは「bin/spark-shell」です

```bash
$ cd /usr/local/share/spark

# 起動
$ bin/spark-shell

# 起動するとこんなのがでます
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.1.1
      /_/
・
・
・
xx/xx/xx xx:xx:xx INFO SparkILoop: Created spark context..
Spark context available as sc.

scala> 
```

次に簡単なサンプルを実行してみます。

公式ドキュメントにもある
apache sparkのREADME.mdファイルは何行かを取得する処理です。

※公式：https://spark.apache.org/docs/1.1.0/quick-start.html


sparkが起動している状態で以下を実行します。

```bash
scala> val textFile = sc.textFile("README.md")
textFile: org.apache.spark.rdd.RDD[String] = README.md MappedRDD[1] at textFile at <console>:12

scala> textFile.count()
res0: Long = 141
```

結果は141行でした。
実際に確認して出力内容に間違いがないか確認してみてください。


+ 注意点

```text

上記サンプル実行時に

val textFile = sc.textFile("README.md")

とファイルを読み込んでいる箇所ですが、
sparkがある場所(今回だと/usr/local/share/spark)
直下で実行しないとREADME.mdが存在しないけどどうなってんの？
って怒られますのでご注意を。

※直下で実行しない場合は絶対パスか相対パスで指定すればokです
``` 

# おわりに

まだまだサンプル実行のレベルですが、
今後スタンドアロンで実行してみたりと
いろいろやってみる予定です。

何か新しい情報、こうやっているよーってのがありましたら
情報交換して頂けると嬉しいです。
Macのアプリアイコンを変更しても更新されない場合の対処


Sublime Textのアプリアイコン（`.icns`）をオリジナルとは違うものに変えてたんだけど、OSをYosemiteにアップデートしたらアイコンが表示されなくなってしまって困ってた。

でも、Yosemiteにする前からも、アプリアイコンを変更しても反映されないことがあったので、Yosemiteに関係なくOS X共通の話かも。

Macのキャッシュ（`~/Library/Caches`の中身）を消して再起動すればいいと教えてもらったけど、なぜだかうまくいかない。

と思ってたら、キャッシュには、ユーザー（`~/Library/Caches`）とすべてのユーザー（`/Library/Caches`）の2種類があるんですね。

以下の手順により、きちんとDockアイコンに反映されました。

1. Dockからアプリを削除
2. 下記の2箇所のキャッシュを削除
	- `~/Library/Caches`
	- `/Library/Caches`
3. Macを再起動
4. Dockにアプリを追加

ちなみに、`Caches`の中身は該当のものだけ消せばいいらしいけど、よくわからないし面倒だったので、フォルダの中身全部消したけど大丈夫でした。*｡٩(ˊωˋ*)و*｡
[iOS] アプリ名を国ごと変更したい場合

言語ごとにアプリ名を変えて表示したい場合の説明です。
Swiftも、Objective-cも同じやり方です。

とりあえずアプリ名を変更したい場合はこちらの方が簡単です。
http://qiita.com/hiroo0529/private/24b027b9708d14200b56

今回はswift画面で変更してみます。
作業ステップは3つあります。

今回の目的：端末の言語が日本語で、アプリ名を「アプリ名」にする  

1. Project &gt; Info &gt; Localizations にて、Japanese(ja)を追加

2. InfoPlist.stringを作成し、LocalizationをクリックしてJapaneseをチェック

3. InfoPlist.string(Japanese)ファイルに「　<span class="s1">CFBundleDisplayName = </span><span class="s2">"</span><span class="s3">アプリ名</span><span class="s2">"</span><span class="s1">;　」を書き込む</span>  



##1. Project &gt; Info &gt; Localizations にて、Japanese(ja)を追加##

![スクリーンショット 2014-12-15 12.16.56.png](https://qiita-image-store.s3.amazonaws.com/0/61148/420e739c-9e09-e7d1-036f-c2023cc7c097.png)&nbsp;&nbsp;&nbsp;  

##2. InfoPlist.stringを作成し、LocalizationをクリックしてJapaneseをチェック##

![スクリーンショット 2014-12-15 12.17.48.png](https://qiita-image-store.s3.amazonaws.com/0/61148/a749f55e-60ce-19ac-1260-22063ee160ec.png)  


![スクリーンショット 2014-12-15 12.19.24.png](https://qiita-image-store.s3.amazonaws.com/0/61148/549c60a6-628d-313e-9064-f2dd551245c9.png)&nbsp;&nbsp;  

##3. InfoPlist.string(Japanese)ファイルに「CFBundleDisplayName = アプリ名」を書き込む
![スクリーンショット 2014-12-15 16.00.22.png](https://qiita-image-store.s3.amazonaws.com/0/61148/0d373a2a-9691-1615-58fb-d98c630b9615.png)

![スクリーンショット 2014-12-15 12.22.47.png](https://qiita-image-store.s3.amazonaws.com/0/61148/21cd9652-38a3-7042-3749-8ad9db75ac4a.png)
文字列内の'.'(ドット)が3個以外の場合に文字列'False'を返す

## コード

```php:tekito.php
<?php

$str = "hoge.hoge.hoge.hoge";
$dotcount = substr_count($str, '.');

if ($dotcount !== 3) {
    echo "False" . PHP_EOL;
}

?>
```

## 使用例
ドットの数が3

```shell-session
$ php tekito.php
$
```

ドットの数が4

```shell-session
$ php tekito.php
False
$
```


## 使った関数
- substr_count
Vagrant内のデータベースにGUIでアクセスするには


Vagrant環境で開発中のシステムについて、DBの中身を確認したいことがあります。もちろん、VagrantをPublic(Bridge)ネットワークに設定しておけば、通常のサーバのように外部のアプリケーションからアクセス可能です。ただ、MacBookなどで使う場合、`en0: Wi-Fi (AirPort)`をブリッジ先に設定していると思いますが、出先ではWiFiに繋がっていない限り、このNICを使うことはできず非常に不便です。

![Navicat for MySQL.png](https://qiita-image-store.s3.amazonaws.com/0/1858/c41c35be-0115-6a28-5d9d-1b35140aaa9a.png "Navicat for MySQL.png")

## Vagrantは共有の秘密鍵を使っている

`$ vagrant ssh`だけで簡単に仮想マシンに入れるのは、Vagrantの便利な点です。残念ながら、GUIアプリケーションから、この恩恵を得ることは出来ませんので、手動で繋ぐ必要があります。デフォルトであれば次が接続情報です。

- 接続先: localhost
- ポート番号: 2222
- 秘密鍵: `~/.vagrant/insecure_private_key`
- パスフレーズ: なし

Vagrantは上記コマンドで簡単にログインできるよう、Vagrant Boxの作成者に[共通の秘密鍵](https://github.com/mitchellh/vagrant/tree/master/keys)を使うように推奨しています。同じものが、`~/.vagrant/`内に配置されているはずです。

※ローカルのVagrant Box以外でこの鍵を使うのは危険です。VagrantをLANからアクセスできるようにする場合も、[別の鍵にした方が良い](https://docs.vagrantup.com/v2/vagrantfile/ssh_settings.html)でしょう。念のため。


## SSHでVagrant内にトンネルする

それでは、実際にアプリケーションからアクセスしてみましょう。ここでは、[Navicat for MySQL](http://www.navicat.com/products/navicat-for-mysql)を使って説明します。[Navicat Essentials](http://www.navicat.com/products/navicat-essentials)でも同様のことが可能なはずです。

まず、Vagrant内でデータベースにアクセスするための設定を、Generalタブで。ポートを変更している場合は、それを指定します。

- User Name: 設定したユーザ名 or `root`
- Password: 設定したパスワード

![Connection Properties - General](https://qiita-image-store.s3.amazonaws.com/0/1858/4b2bbddf-9aeb-97f7-3940-b1c0fd68221c.png "Connection Properties - MySQL.png")

Navicatは単体でSSHトンネルの機能を持っているので、Terminalから別途コマンドを叩いておく必要はありません。続けて、SSHタブで前述の接続情報を入力します。Private Keyにはパスを直接キーボードから入力しましょう。パスフレーズは空欄のままでOKです。

![Connection Properties - SSH](https://qiita-image-store.s3.amazonaws.com/0/1858/1d418e0f-4273-fafd-e718-274a418d2f21.png "Connection Properties - MySQL.png")

設定できたら、Test Connectionを実行して確認します。うまく接続できると、冒頭の画面のようにDBの一覧が表示されます。
The XSS Auditor refused to execute a script in~というエラーについて

こんなエラーがでた。

```
The XSS Auditor refused to execute a script in 'URL' because its source code was found within the request. The auditor was enabled as the server sent neither an 'X-XSS-Protection' nor 'Content-Security-Policy' header.
```


## 発生状況

とあるCMSで、登録したコンテンツの編集を行い、登録ボタンを押したとき、`data:,`というURLで真っ白な画面になる。

Consoleを見てみると、登録ボタンを押した時ではなく、画像のアップロードボタン・画像の取り消しボタンを押したときにエラーをはいている。

ちなみに、どの画像をアップロードしようとしてもダメで、他の投稿にアップロードすることは出来た。
画像を登録してから、コンテンツ内容を登録することは出来た。

よって、ある特定の条件でエラーが発生することを確認。

## 原因

調べたところ、GoogleChromeのXSS対策の仕様に関係しているみたいでした。
様々なところで、ChromeのXSSフィルターを無効化すれば良いように書かれていた。

しかし、フィルターを無効化していいのか判断が微妙…

このページを参考にしたら解決しました。

[Google Chrome のXSS仕様にはまる。](http://gqevu6bsiz.chicappa.jp/google-chrome-%E3%81%AExss%E4%BB%95%E6%A7%98%E3%81%AB%E3%81%AF%E3%81%BE%E3%82%8B%E3%80%82/)

>どうも、`<form>`タグ関係の場合だけ、バグが出るという症状でした。

>どんどん調べていくと、結論としては、Google ChromeのXSS対策の仕様？と判断しました。
正確にはプラグインの影響ではなく、そのプラグインの影響を可能にした場合の`<form>`タグ関連の影響でした。
(WordPressを一切使わず、シンプルなHTMLだけの場合でも試してみました）

>これはプラグインうんぬんではなく、様々な場合に影響があると思っています。
（「投稿」や「固定ページ」等も含まれます。でも公開はできますが）

みたいです。

実際、コンテンツ内容に`<form>`が含まれていました。

## 解決方法

```html
<form name="testform1" action="test1.html">
	<input type="text" name="text1" />
	<input type="text" name="text2" />
	<input type="submit" value="送信" />
</form>
```

を

```html
<form name="testform1" action='test1.html'>
	<input type="text" name="text1" />
	<input type="text" name="text2" />
	<input type="submit" value="送信" />
</form>
```

にする。

（　゜Д゜）
って、感じだと思いますが、これで解決しました。

間違い探しが追いついていない方へ。

`action="test1.html"`を`action='test1.html'`に変えたのです。

`action="`この並びがどうやらダメみたいです。

ダブルクォーテーションかシングルクォーテーションかでこんなに変わるとは・・・

抜本的な解決方法ではないかもしれませんが、今回みたいな場合は、これでokです！

システムとして作る場合は、しっかりとした対策を！
CakePHPでAPI（JSONで）

jsonでAPIを返す最小限必要な構成を示す。

`routes.php`に以下を追加。

```php:app/Config/routes.php
Router::parseExtensions('json');
```

APIを出力するコントローラに以下を追加。

```php:app/Controller/ApiController.php
public $components = array('RequestHandler');
```

コントローラにメソッドを書く。

```php:app/Controller/ApiController.php
public function getData() {
	// 例えばなにがしかのモデルからファインド
	$data = $this->Model->find('all');
	// JSON出力にセット
	$this->set('raw_data', $data);
	$this->set(array(
		'_serialize' => array('raw_data'),
		'_jsonp' => true
	));
}
```

これを`/Api/getData.json`というURLで呼ぶ。
atomic.Valueの実装に見るGoのポインタの話


こんにちは、GoAdventCalendarの記事を書き忘れておりましたので急いで書きました。

## atomic.Valueとは
こちらGo 1.4より追加されました。

Goの公式ドキュメントでは `Do not communicate by sharing memory.`とよく書かれていますが、複数のGoroutineからひとつの変数を参照・更新するというのは標準パッケージを眺めていても割と頻繁に登場します。
その際にsyncパッケージ等を使い値のrace conditionを解消するのですが、共有する変数への変更処理(mapに新しい値を追加する、など)をよりatomicな形で提供するのがatomic.Valueになります。
使い方はatomic.ValueのExampleを見てみて下さい。

http://golang.org/pkg/sync/atomic/#Value

## 実装を見てみる
では何故こういったパッケージを利用する必要があるのか内部実装を見ながら考えてみよう、と思いたったので読んでみます。

```go
package atomic

import (
	"unsafe"
)

type Value struct {
	v interface{}
}
```

このへんは普通の宣言になりますね。

```go
// interface{}の内部的な表現、形と値それぞれのポインタを持つ
type ifaceWords struct {
	typ  unsafe.Pointer
	data unsafe.Pointer
}
```

上記を見ると、形と値をそれぞれ別のポインタとして保持しています。
Goのinterface{}は2つ分のwordを一方は形、一方は指し示す値として別々に保持しているため、このような形が必要になります。
参考: InterfaceSlice https://github.com/golang/go/wiki/InterfaceSlice

```go
// 値の読み込み
func (v *Value) Load() (x interface{}) {
	vp := (*ifaceWords)(unsafe.Pointer(v))
	typ := LoadPointer(&vp.typ)
	if typ == nil || uintptr(typ) == ^uintptr(0) {
		// 型のポインタが定義されていない場合、最初のデータ追加が終わっていないとみなす。
		return nil
	}
	data := LoadPointer(&vp.data)
	// 返り値xのポインタに対してinterfaceの型情報と値情報のポインタを設定する
	xp := (*ifaceWords)(unsafe.Pointer(&x))
	xp.typ = typ
	xp.data = data
	return
}
```

上記ではatomic.LoadPointerが多用されています。
データをatomic.Valueが保持している場合、値のポインタをatomicに読み込み、返り値に渡しています。

```go
// 値の追加
func (v *Value) Store(x interface{}) {
	if x == nil {
		panic("sync/atomic: store of nil value into Value")
	}
	vp := (*ifaceWords)(unsafe.Pointer(v))
	xp := (*ifaceWords)(unsafe.Pointer(&x))
	for {
		typ := LoadPointer(&vp.typ)
		if typ == nil {
			runtime_procPin() // これを呼ぶことでコンテキストスイッチを停止し、他のgoroutineなどを待たせる
			// typのポインタに初期書き込み中の旨を割り当てる
			if !CompareAndSwapPointer(&vp.typ, nil, unsafe.Pointer(^uintptr(0))) {
				runtime_procUnpin()
				continue
			}
			// 最初の書き込み処理をポインタに対して実施する。
			StorePointer(&vp.data, xp.data)
			StorePointer(&vp.typ, xp.typ)
			runtime_procUnpin()
			return
		}
		if uintptr(typ) == ^uintptr(0) {
			// typのポインタが上記の書き込み処理中のflagと同値なら先頭に戻る
			continue
		}
		// 違う型を見ている場合はエラー
		if typ != xp.typ {
			panic("sync/atomic: store of inconsistently typed value into Value")
		}
		StorePointer(&vp.data, xp.data)
		return
	}
}

```

書き込み時には、コンテキストスイッチを停止し、初期書き込み中である旨を`^uintptr(0)`という値をフラグとしてtypに渡し、その後形と値それぞれのポインタを入れ替えています。

```go
func runtime_procPin()
func runtime_procUnpin()
```
これを宣言しておくと、runtime側でコンテキストスイッチを停止・再開可能なようです。

[こちらの資料](http://preshing.com/20130618/atomic-vs-non-atomic-operations/)なども参考にすると、interfaceのpointer入れ替え処理はwordサイズを超えるnon-atomicな処理であるので、コンテキストスイッチを停止しつつ値を書き換え、読み込み中である旨を明示するなど、単なるポインタの入れ替え処理をしようとするにも、様々な注意が必要なようです。

## 最後に
Global変数を各所で見て回るというのを自分で安全に実装しようとすると、unsafeパッケージで面倒な実装をすることになるのでatomicパッケージをうまく使うか、channelに頼りましょう。

三ʕ◔ϖ◔ʔ

## その他参考
Go memory specification https://golang.org/ref/mem
Go FAQ https://golang.org/doc/faq#What_operations_are_atomic_What_about_mutexes
http://play.golang.org/p/OrJvbN4iYK
WindowsでSSHの鍵を作る

# これは何？

* WindowsでSSHの秘密鍵を生成した方法を記録したもの
* Gitをインストールすると、ssh-keygenのexeがあるのでそれを利用して、鍵を作る。

# 事前準備

* バージョン管理ツールである[Git](http://git-scm.com/)をインストールする。
* インストールしたGitのbinフォルダを環境変数PATHに追加する。（例）```C:\Program Files (x86)\Git\bin```　を環境変数PATHに追加する。（意図としては、binの中にあるssh-keygenを使いたい）
 * あるバージョンから ```C:\Program Files(x86)\Git\usr\bin``` 配下にssh-keygenが移動した模様です。  

# 手順

### ssh用のフォルダを作る。
   
```
mkdir c:\Users\XXXXX\.ssh
```

### 鍵を生成する。

```
PS C:\Users\XXXXX> ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (//.ssh/id_rsa): c:/Users/XXXXX/.ssh/id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in c:/Users/XXXXX/.ssh/id_rsa.
Your public key has been saved in c:/Users/XXXXX/.ssh/id_rsa.pub.
The key fingerprint is:
48:--:--:--:0b:bf:0a:fd:ff:--:--:--:--:--:--:-- XXXXX@YOUR SERVER NAME
The key's randomart image is:
+--[ RSA 2048]----+
|        略       |
+-----------------+
```

### キーの生成確認
* sshのキー(```id_rsa```と```id_rsa.pub```）が```c:/Users/XXXXX/.ssh```　以下にあるかどうか確認する。

# 補足
* ```id_rsa.pub``` は誰かに教えても大丈夫。
* ```id_rsa``` は絶対誰にも教えてはいけない。盗み見られてもいけない。
[iOS] Multitask Switcher に表示される画像を差し替える方法

# Multitask Switcher
iOS7 から Multitask Switcher 画面（ホームボタンを二回連続して押すと iOS デバイス下部に表示される領域）にアプリのスナップショット画像が表示されるようになった。これは、アプリを切り替える際に非常に便利である。しかし、拙作の写真メモアプリ [SnapNotes](https://itunes.apple.com/jp/app/id935326947?mt=8&uo=4) では、メモ代りに写真を使っているので、Multitask Switcher では見えないようにしたかった。（iPhone の画面が大きいので結構まる見え状態になるのよね。）
ドキュメントを眺めていたら、UIApplication の ignoreSnapshotOnNextApplicationLaunch が使えそうなので、ソースコードに組み込んでみた。しかし、何も変わらずアプリ画面がまる見えのスナップショットが表示された。アプリ起動後に呼び出すだけじゃダメなのか?

## Multitask Switcher 画面に任意の画像を表示させる
調べたところ Multitask Switcher に表示されるスナップショットは、アプリの状態が Resign になった時の画面らしい。それならば、UIApplicationDelegate の applicationWillResignActive: 内で UIWindow の画像を変更すればよい。今回は、写真画像なので、画面一面を真っ黒にしないで、すりガラス越しの画像っぽくした。理由は、iOS8 から導入された UIVisualEffectView を使いたかったからである。あと、写真メモなので真っ黒画面は嫌だったので。

以下、AppDelegate.m に追加するコードである。

```objectivec
@property (nonatomic,strong) UIImageView * imageView;

#pragma mark - UIApplicationDelegate
-(void)applicationDidBecomeActive:(UIApplication *)application
{
  if (self.imageView.superview) {
    [self.imageView removeFromSuperview];
    self.imageView = nil;
  }
}

#pragma mark - UIApplicationDelegate
-(void)applicationWillResignActive:(UIApplication *)application
{
  [self coverMainWindowForPrivacy]; // ここで Multitask Switcher 用の画像に差し替える
}
```

すりガラス越しの画像作成は、汎用的に利用できるように独立したメソッドにしてある。他のソースコードに簡単に取り込めるよ。

```objectivec
-(void)coverMainWindowForPrivacy
{
  CGSize  size     = self.window.bounds.size;
  BOOL    opacity  = YES;
  CGFloat scale    = 0.0f;

  // 現在表示中のアプリの画像を UIImage に変換して、UIImageView を作成。
  UIGraphicsBeginImageContextWithOptions(size, opacity, scale);
  [self.window.layer renderInContext:UIGraphicsGetCurrentContext()];
  UIImage * image = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  UIImageView * imageView;
  imageView = [[UIImageView alloc] initWithImage:image];

  // すりガラス越しの効果を表現する View を作成。
  UIVisualEffect * blurEffect;
  blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
  UIVisualEffectView * blurView;
  blurView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
  blurView.frame = imageView.bounds;

  [imageView addSubview:blurView]; // UIImageView の画像にすりガラス効果
  [self.window addSubview:imageView]; // 表示中のアプリの画面を差し替え
  self.imageView = imageView; // BecomeActive 時で画像を取り除くので必須
}
```

UIVisualEffect の Style は他にもあるので、クラスリファレンスを読んでね。

上記ソースコードの coverMainWindowForPrivacy メソッド内の UIImage を好きな画像に置き換えれば、任意のスナップショットを Multitask Switcher の画面に表示できる。その場合は、上記ソースコード内のアプリ画面のキャプチャとすりガラス効果のコードは不要である。

たとえば、アプリ起動時にパスコードの入力が必須な場合は、そのパスコード入力の画像で置き換えれば良い。
ソースコードは次のような感じかな。

```objectivec
-(void)coverMainWindowWithPasscodeLockScreen
{
  UIImage * image = [UIImage imageNamed:@"パスコード入力画面の画像"];
  UIImageView * imageView;
  imageView = [[UIImageView alloc] initWithImage:image];
  [self.window addSubview:imageView];
  self.imageView = imageView;
}
```

以上、Multitask Switcher に表示される画像を差し替える方法でした。
centos 7 向け EPEL リポジトリ

# ファイル
[ftp://ftp.riken.jp/Linux/centos/7/extras/x86_64/Packages/epel-release-7-5.noarch.rpm][1]

# ディレクトリー
[ftp://ftp.riken.jp/Linux/centos/7/extras/x86_64/Packages/][2]

[1]: ftp://ftp.riken.jp/Linux/centos/7/extras/x86_64/Packages/epel-release-7-5.noarch.rpm
[2]: ftp://ftp.riken.jp/Linux/centos/7/extras/x86_64/Packages/


# ファイル ( epel-release-*.noarch.rpm )

Packages/epel-release-7-5.noarch.rpm

# コマンド一発・ｑ・

```bash
sudo yum install epel-release
```
Homebrewで入れたパッケージをアップグレードする

```bash
brew upgrade
```

これでアップグレードできますが、
更新があったパッケージすべてが対象になってしまうので、
特定のものだけアップグレードしたい場合は以下で。

```bash
# コマンドフォーマット
brew upgrade [FORMULA...]

# 例えばansible
brew upgrade ansible
```
ノードをMasterにする

指定したノードをクラスタのmasterにする

以下3ノードがある。

* n1
* n2
* n3

# pcsの場合

## n1をMasterにする

```bash:
pcs cluster standby n2
pcs cluster standby n3
pcs cluster unstandby --all
```

## n2をMasterにする

```bash:
pcs cluster standby n1
pcs cluster standby n3
pcs cluster unstandby --all
```

## n3をMasterにする

```bash:
pcs cluster standby n1
pcs cluster standby n2
pcs cluster unstandby --all
```

もしくは crm_resourceコマンドを使う

* [Pacemaker/Heartbeat で Master/Slave の migration - ngの日記](http://ngyuki.hatenablog.com/entry/20110818/p1)


# crmの場合

```bash:
# /usr/sbin/crm node standby www-primary.local
```

> cibadmin not available, check your installation

/usr/sbin/cibadminにPATHが通っていない場合上記エラーが出る。

```bash:
# export PATH=$PATH:/usr/sbin:/sbin
# /usr/sbin/crm node standby www-primary.local
```

## n1をMasterにする

```bash:
crm node standby n2
crm node standby n3
crm node online n2
crm node online n3
```
ファイル権限について


ファイル一覧を開くと、左側に権限が記載されています。今回はその権限について調べたのでメモ。

```
ls -la  # ファイルを開く
drwx------  2 sample sample       4096 2014-12-10 17:13 .ssh
...
```

`d` ←ファイルの種類（-: ファイル、d: ディレクトリ、l: リンクファイル）
`rwx------` ←ファイル権限箇所

ファイル権限の種類
--
- 権限は大きく3つの分類に分かれている
- 権限にそれぞれ数値がついている

| 権限　　 | 分類１             |分類２    |分類３|
|:-----------|:----------------|:----------------:|:----------------:|
|3つの権限分類 |rw- | --- | --- | 
|権限者 |所有者| グループ| その他のユーザー|
|数値例 |6| 0| 0|


```権限表記例

0	---
1	--x
2	-w-
3	-wx
4	r--
5	r-x
6	rw-
7	rwx
```

```権限解説
u	所有者の権限
g	グループの権限
o	その他のユーザーの権限
a	すべての権限
+	後に記述した権限を付加する
-	後に記述した権限を削除する
=	後に記述した権限にする
r	読み込み権限
w	書き込み権限
x	実行権限
s	セットID
t	スティッキ・ビット
```

数字の組み合わせ例
--
| 権限　　 | 数値             |説明    |
|:-----------|:----------------|:----------------:|
|rwx |	7 (4+2+1)|読み出し可＋書き込み可＋実行可能|
|rw- |	6 (4+2) |	読み出し可＋書き込み可|
|r-x |	5 (4+1)	 |読み出し可＋実行可能|
|-wx |	3 (2+1)	 |書き込み可＋実行可能|

所有者変更コマンド
--
```形式
chmod (option) [a+w] [file name]
例：chmode u+rw sample.txt      ←── sample.txt ファイルの所有者に対して設定

chmod (option) [644] [file name]
例：chmode 755 sample.txt
↑ 所有者には全ての権限を、グループユーザーとその他のユーザーには読み込みと実行権限を設定
```

```例
chmod a+w file1	全てのユーザーに書き込み権限を付加
chmod 644 file2	file2を644（rw-r--r--）に変更
chmod 701 *.cgi	拡張子がcgiのファイルを全て701（rwx-----x）に変更
```

数値によるアクセス権の指定
---
| 権限　　 | 数値             |
|:-----------|:----------------|
|所有者の読み込み権限	 |+ 400|
|所有者の書き込み権限	 |+ 200|
|所有者の実行権限	 |+ 100|
|グループの読み込み権限 |	 + 40|
|グループの書き込み権限 |	 + 20|
|グループの実行権限 |	 + 10|
|その他のユーザーの読み込み権限 |	 + 4|
|その他のユーザーの書き込み権限 |	 + 2|
|その他のユーザーの実行権限 |	 + 1|


参考:
 [コマンドの機能と使用方法](http://www.k-tanaka.net/unix/chmod.php)
[UNIX COURSE](http://cmd.misty.ne.jp/user/03.html)
何の shell を使っているか確認する方法


## 確認方法
`$ set | grep -ai  version`

### csh / tcshの出力例
`version tcsh 6.17.00 (Astron) 2009-07-10 (i386-intel-FreeBSD) options wide,nls,dl,al,kan,sm,rh,color,filec
...`
### bashの出力例
`BASH_VERSION='4.3.11(1)-release'`

### zshの出力例
`ZSH_VERSION=4.3.14`

### grep memo

|option|意味|
|:------|:------|
|-a| バイナリファイルであってもテキストとして処理する。|
|-i| 大文字小文字を区別しない。|

* 「grep」コマンドや「sed」コマンドなどで語句を探すときに正規表現を使うと，複雑なパターンが簡潔に記述できる。grepやsedコマンドで利用できる代表的な正規表現を以下の表に示した。

記号	意味

```
.	改行文字以外の任意の1文字
*	直前の1文字の0回以上の繰り返しに一致。直前の文字は正規表現でも構わない
^	行の先頭
$	行の末尾
[ ]	かっこ内の任意の1文字に一致。ハイフン（-）で範囲指定もできる
[^ ]	かっこ内の任意の1文字に不一致。ハイフン（-）で範囲指定もできる
\+	直前の文字の1個以上の繰り返しに一致
\?	直前の文字の0または1文字に一致
\{n\}	直前の文字のn個の繰り返しに一致
\{n,\}	直前の文字のn個以上の繰り返しに一致
\{,m\}	直前の文字のm個以下の繰り返しに一致
\{n,m\}	直前の文字のn個以上，m個以下の繰り返しに一致
pattern1\|pattern2	pattern1またはpattern2のいずれかに一致
\(pattern\)	patternをグループ化する。マッチした内容は参照できる
\	正規表現に使われる記号を普通の文字として扱う
```

参考
http://server-setting.info/freebsd/what-shell.html
http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231171/
GeoGebraの使い方


グラフィカルに関数の意味や形状とか，積分の意味を見せることができたら，教育に役立つのではないかと思い．．．

[GeoGebra](http://www.geogebra.org)

## 関数の範囲指定
```
f(x)= if[0<x<=1,x,1/x^2]
```
のようにすると，下のようになる．
![スクリーンショット 2014-12-15 10.58.17.png](https://qiita-image-store.s3.amazonaws.com/0/41830/cf235490-ee4a-c26b-af15-6167f8db9552.png "スクリーンショット 2014-12-15 10.58.17.png")

## 積分
```
integral[f(x),infinity,a]
```
のようにすると，aというスライダーを作成するように言われ，「OK」すると自動的に作られる．このスライダーを動かしていくと，積分の値やその面積が表示される．

その値を，点Aのy座標，aの値を点Aのx座標と指定すれば，積分値が描く曲線が分かる．

![スクリーンショット 2014-12-15 11.21.41.png](https://qiita-image-store.s3.amazonaws.com/0/41830/debdb7c7-94ce-3a93-47a5-49ac77267dc8.png "スクリーンショット 2014-12-15 11.21.41.png")

ちなみに，このグラフは，球内に一様密度の電荷がある場合の電場と電位の関係を理解するためのもの．
CircleCIからAWS Elastic Beanstalkにpush(Deploy)


> こっちのほうがスマートなのでおすすめする。 > [CircleCI経由でElasticBeanstalkにデプロイする方法 - Qiita](http://qiita.com/mikamix/items/31849dc94a3e39575240 "CircleCI経由でElasticBeanstalkにデプロイする方法 - Qiita")
> ここの記事は参考程度に。

背景はさておき、PRをマージしたらさっさとElastic Beanstalkを更新しておいてもいいアプリもあるでしょう。
じゃあCircleCIからpushしておこう。

## circle.yml

circle.ymlはこんな感じ。
関連ツールのセットアップ＆キャッシュ、デプロイコマンドの組み合わせです。

```circle.yml
---
dependencies:
  pre:
    - ci/01_eb_command.sh
    - ci/02_credencial_for_eb.sh
  cache_directories:
    - ~/awstools
deployment:
  my_environment:
    branch: master
    commands:
      - git aws.push
```



## ebコマンドをインストールする (`01_eb_command.sh`)

> [更新]
> sudo pip install awsebcliで良かった模様。これはナイス。
> 参考： [CircleCI経由でElasticBeanstalkにデプロイする方法 - Qiita](http://qiita.com/mikamix/items/31849dc94a3e39575240 "CircleCI経由でElasticBeanstalkにデプロイする方法 - Qiita")

ツールのセットアップその、ebコマンド。良くある外部ツールの導入ですね。
Elastic Beanstalk的には`RepositorySetup`が大事。
このあたり、ビルドで毎回やることとキャッシュしておきたいこと、環境変数から取りたいことの住み分けで色々工夫の余地はあります。

```ci/01_eb_command.sh 
#!/usr/bin/env bash
set -ex

EB_VERSION="2.6.4"
EB_BASE="AWS-ElasticBeanstalk-CLI-${EB_VERSION}"
HOME=${HOME:-/home/ubuntu}

## botoがいるので入れておく
sudo pip install boto

mkdir -p ${HOME}/awstools
cd $HOME/awstools

## ebダウンロード済みならスキップ
if ! [ -d ${HOME}/awstools/${EB_BASE} ]; then
  wget https://s3.amazonaws.com/elasticbeanstalk/cli/${EB_BASE}.zip
  unzip ${EB_BASE}.zip
fi

## ebコマンドをパスが通っている場所にリンク
sudo ln -fs ${HOME}/awstools/${EB_BASE}/eb/linux/python2.7/eb ${HOME}/bin/

## gitのプラグインを`.git/AWSDevTools/`に入れる(eb init相当)
cd $HOME/${CIRCLE_PROJECT_REPONAME}
bash -ex ${HOME}/awstools/${EB_BASE}/AWSDevTools/Linux/AWSDevTools-RepositorySetup.sh
```

## eb用のcredentialsファイルを生成する (`02_credencial_for_eb.sh`)

CircleCIのプロジェクト設定にはAWSキーを入れるところがあり、`~/.aws/config`,`~/.aws/credentials`を自動で置いてくれる。
ですが、ebコマンドからは直接読めない(..はず)、環境変数にも入らない。

今回はありもの(`~/.aws/credentials`)を流用、整形することにしました。

```ci/02_credencial_for_eb.sh 
#!/usr/bin/env bash
set -ex

if [ -f ~/.aws/credentials ]; then
  sed -e 's/\[default\]//' -e 's/aws_access_key_id = /AWSAccessKeyId=/' -e 's/aws_secret_access_key = /AWSSecretKey=/' ~/.aws/credentials | sed ':loop; N; $!b loop; ;s/^\s*\n//' > ~/.aws/eb_credentials.txt
  chmod 0600 ~/.aws/eb_credentials.txt
fi
```

キー側を変更、余分な改行とスペースを消しています。


### 環境変数の`AWS_CREDENTIAL_FILE`をセットしておく

ebは環境変数の`AWS_CREDENTIAL_FILE`があればそのファイルからcredentialsを取り込むので、プロジェクトの設定に１つ追加しておきます。

```Environment_variables_on_CircleCI
AWS_CREDENTIAL_FILE=/home/ubuntu/.aws/eb_credentials.txt
```

## git aws.push

この場合、デフォルトではignoreされる`./.elasticbeanstalk/config`はGitリポジトリに含めています。

含めたくない場合でもブランチ名とEnvironmentの対応があればいいので、CircleCI上で生成してもかまいません。

参考: [Git ブランチを特定の環境にデプロイする - AWS Elastic Beanstalk](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/command-reference-branch-environment.html "Git ブランチを特定の環境にデプロイする - AWS Elastic Beanstalk")

これで任意のブランチがすぐEBにpushされるようになりました。

![circleci_eb_png.png](https://qiita-image-store.s3.amazonaws.com/0/7454/be989638-2116-2713-bdad-c50c343b29c4.png "circleci_eb_png.png")
Rails + Mongoid で Timestamps を更新せずに保存

## Rails + Mongoid でTimestampを更新したくない
ActiveRecord 使ってると```Model.record_timestamps = false```で対処できるのだけど、
Mongoidの場合がちょっと検索しても出てこなかったのでまとめ。

## 実装
```Person``` クラスのインスタンスの ```person``` というオブジェクトを例にすると以下のように、

```ruby
if person.timelss.save
 person.clear_timeless_option
end
```
という感じでインスタンス毎に使うようです。
簡単。

## ドキュメント
詳しくは以下参照。
http://mongoid.org/en/mongoid/v3/extras.html#timestamps
NiftyCloud（MBaaS）のiOSクイックスタートをObjective-CからSwiftに書き換えてみた


##はじめに

Nifty CloudのMBaaSを利用してみようとクイックスタートを少し触ってみました。
http://mb.cloud.nifty.com/doc/quickstart_ios.html

ただ、サンプルがObjective-Cだったので、Swiftに書き換えてみました。
Objective-Cも、Swiftも初心者故、書き方がなんともよくわからないが、そのへんはご了承下さい。

##Objective-C（サンプル）

```AppDelegate.m
[NCMB setApplicationKey:@"YOUR_APPLICATION_KEY" clientKey:@"YOUR_CLIENT_KEY"];

NCMBQuery *query = [NCMBQuery queryWithClassName:@"TestClass"];
[query whereKey:@"message" equalTo:@"test"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (error == nil) {
        if ([objects count] > 0) {
            NSLog(@"[FIND] %@", [[objects objectAtIndex:0] objectForKey:@"message"]);
        } else {
            NSError *saveError = nil;
            NCMBObject *obj = [NCMBObject objectWithClassName:@"TestClass"];
            [obj setObject:@"Hello, NCMB!" forKey:@"message"];
            [obj save:&saveError];
            if (saveError == nil) {
                NSLog(@"[SAVE] Done");
            } else {
                NSLog(@"[SAVE-ERROR] %@", saveError);
            }
        }
    } else {
        NSLog(@"[ERROR] %@", error);
    }
}];
```


##Swiftに書き換える


* クイックスタートの`NCMB.framework`はBuild Phasesから登録しておきます。
* `NCMB.framework`をSwiftから利用できるようにヘッダファイルを作成しておきます。

```XXXXXXX-Bridging-Header.h
#import <NCMB/NCMB.h>
```
> XXXXXXXは、任意で問題無いと思います。（Defaultで、作成されているんではないかと思います。）

> 以下、参考にさせていただきました。
> http://qiita.com/skatata/items/1facd024d239b9545031


* AppDelegate.swiftのdidFinishLaunchingWithOptionsで以下のコードに書き換えます。

```AppDelegate.swift

NCMB.setApplicationKey("<YOUR_APPLICATION_KEY>",
						clientKey: "<YOUR_CLIENT_KEY>")
var query: NCMBQuery = NCMBQuery(className: "TestClass")
query.whereKey("message", equalTo: "test")
query.findObjectsInBackgroundWithBlock({(NSArray objects, NSError error) in
	if (error == nil) {
		if(objects.count > 0)
		{
			var msg: AnyObject? = objects[0].objectForKey("message")
			var msgStr: String = msg as NSString
			Logger.debug("[FIND] \(msgStr)")
		} else {
			var saveError : NSError? = nil
			var obj : NCMBObject = NCMBObject.objectWithClassName("TestClass")
			obj.setObject("Hello, NCMB!", forKey: "message")
			obj.save(&saveError)
                    
			if(saveError == nil){
				Logger.debug("[SAVE] Done.")
			} else {
				Logger.error("[SAVE ERROR] \(saveError)")
			}             
		}
	} else {
		Logger.error(error.localizedDescription)
	}
})
```


##まとめ
一応動いている感じはしますが、Arrayあたりの書き方は少し勉強し直します。
figを使ってDockerのクラスタを作り出す

複数のDockerコンテナを起動し、アプリケーションを動作させたりスケーリングを実現する場合にコンテナ間のリンクやスケーリングは[Fig](http://www.fig.sh/)を利用することでお手軽に実現できます。

## fig.yml

figのための設定ファイルは`fig.yml`に記述をします。yml形式なので新しいDSLを覚えたりすることがなく、シンプルに必要な事を記述できるようです。今回はよくある「フロントのnginxでリバースプロキシをして、バックエンドのアプリケーションにアクセスを振り分け」のパターンをやってみます。


```yml
 ap1:
  image: localhost:5000/application/run # localhostに立てたinsecureなregistryからimageをpullする
  volumes:
    - /usr/local/etc/application/app.httpd.conf:/etc/httpd/conf/httpd.conf:ro
    - /usr/local/etc/application/app.config.ini:/var/www/application/common/config/config.ini:ro
 ap2:
  image: localhost:5000/application/run
  volumes:
    - /usr/local/etc/application/app.httpd.conf:/etc/httpd/conf/httpd.conf:ro
    - /usr/local/etc/application/app.config.ini:/var/www/application/common/config/config.ini:ro
 ap3:
  image: localhost:5000/application/run
  volumes:
    - /usr/local/etc/application/app.httpd.conf:/etc/httpd/conf/httpd.conf:ro
    - /usr/local/etc/application/app.config.ini:/var/www/application/common/config/config.ini:ro
 ap4:
  image: localhost:5000/application/run
  volumes:
    - /usr/local/etc/application/app.httpd.conf:/etc/httpd/conf/httpd.conf:ro
    - /usr/local/etc/application/app.config.ini:/var/www/application/common/config/config.ini:ro
 ap5:
  image: localhost:5000/application/run
  volumes:
    - /usr/local/etc/application/app.httpd.conf:/etc/httpd/conf/httpd.conf:ro
    - /usr/local/etc/application/app.config.ini:/var/www/application/common/config/config.ini:ro

nginx:
  image: nginx
  volumes:
    - /usr/local/etc/application/nginx/nginx.conf:/etc/nginx/nginx.conf
    - /usr/local/etc/application/nginx/cond.d:/etc/nginx/conf.d
  links:
    - ap1
    - ap2
    - ap3
    - ap4
    - ap5
  ports:
    - "80:80"
```

nginxやアプリケーションの設定については割愛。

fig.ymlを保存した場所で

```bash
fig up --allow-insecure-ssl # insecureなregistryを使うのでオプションが必要
```

## あふれるお手軽感

むっちゃお手軽。
Greasemonkey で タイトルに対してファビコンをつける

ファビコンをつけるだけなら既にあります。
[Faviconを無理やり設定する GreaseMonkeyスクリプト](http://d.hatena.ne.jp/rizenback000/20140623)
[ページに強制的に favicon をつける Greasemonkey スクリプト](http://zisakuzien.exblog.jp/11966290/)

参考にしたのは[ページに強制的に favicon をつける Greasemonkey スクリプト](http://zisakuzien.exblog.jp/11966290/)こっち（もう片方は難しい…）

必要になった理由は

* ローカルIP(192.168.4.*)上に同じシステムがn個、開発用やバージョン違いが無秩序に乱立している
* 同192.168.4.* には同様に別のシステムも乱立している
* タブ魔なので良く使う環境はピン留めしている
* ファビコンが無く、タイトルも見えないので開くまでどの環境かわからない
* 最低でもシステム種別程度は識別したい
* タイトルは 「システム名 | ページ名」である。

ということでURLではなくタイトルを参照してピン留めからでもシステム種別が判別できるようにします。

ファビコンはここでBase64に変換しました
[画像をBase64に変換するツール (data URI scheme) ](http://blog.thingslabo.com/archives/000058.html)

```
// ==UserScript==
// @include     http://192.168.4.*
// @version     1
// @grant       none
// ==/UserScript==
var title = document.getElementsByTagName('title') [0];
if(title.text.indexOf("システム名") != -1){
  var favicon = document.createElement('link');
  favicon.setAttribute('rel', 'icon');
  favicon.setAttribute('href', '変換したファビコン');
  document.getElementsByTagName('head')[0].appendChild(favicon);
}
```

システム種別は片手分もないのでelse if でコピペしています…

ランダムな模様とか作れるなら第4オクテットごとに固有の模様が作れそう
コマンド実行ランキングを算出して日頃の行いを振り返ってみる


この記事は[「1分で実現できる有用な技術 Advent Calendar 2014」](http://qiita.com/advent-calendar/2014/one-minute)の15日目の記事です。

##はじめに
これは[@namikawa](https://twitter.com/namikawa)さんの以下のスライドで紹介されていて知ったワンライナーです。
[bash(set)コマンドのオプション3選
](http://www.slideshare.net/namikawa/bash-options)

年の瀬にこれで日頃の行いを振り返ってみては如何でしょうかm(_ _)m

##コマンド
	$history | awk '{print $2}' | sort | uniq -c | sort -nr

##こんな感じでした
1488 cd
1390 ll
1006 vagrant
 930 ssh
 506 vi
 384 scp
 341 git
 334 gst
 264 ga
 233 ggpush
 209 gc
 176 brew
 169 sudo
 153 sh
 128 rm
 117 gco
 116 python
  91 heroku
  69 source
  68 php
  67 la
  66 gc!
  61 gem
  58 pwd
  56 npm
  54 pip
  52 nkf
  52 gcb
  46 rbenv
  46 ggpull
  41 curl
　・
　・
　・
AWS にて、root権限だとカラースキームが割り当てられない事への対処

http://blog.dacelo.info/linux/entry-759.html
こちらを参照にしたけど**出来ず**…orz

色が付いているのはviがvimへのaliasになっているからなんですが、rootの場合はviのままになっているのが原因です。
これを変えるためには /etc/profile.d/vim.sh を編集し3行目をコメントアウトします。
```
if [ -n "$BASH_VERSION" -o -n "$KSH_VERSION" -o -n "$ZSH_VERSION" ]; then
　[ -x /usr/bin/id ] || return
　[ `/usr/bin/id -u` -le 100 ] && return　
　# for bash and zsh, only if no alias is already set
　alias vi >/dev/null 2>&1 || alias vi=vim
fi
```
Homebrewでインストールしたghc 7.8.3がOSX10.9にしてからおかしい

`-lgmp`が見つからないと言われる、ぐぐっても特に出てこないので次のような場当たり的対処で無理やり解決。

```shell-session
user@ ~% brew info ghc 
ghc: stable 7.8.3 (bottled)
http://haskell.org/ghc/
/usr/local/Cellar/ghc/7.8.3 (5742 files, 716M) *
  Poured from bottle
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/ghc.rb
==> Dependencies
Build: xz ✔, xz ✔, xz ✔
Required: gmp ✔
==> Options
--32-bit
        Build 32-bit only
--tests
        Verify the build using the testsuite
user@ ~% ll /usr/local/Cellar/ghc/7.8.3/lib/ghc-7.8.3/integer-gmp-0.5.1.0/
total 1384
drwxr-xr-x  6 user  admin   204B  9  9 03:37 GHC
drwxr-xr-x  3 user  admin   102B  9  9 03:37 include
-r--r--r--  1 user  admin   132K  9 22 18:39 libHSinteger-gmp-0.5.1.0-ghc7.8.3.dylib
-r--r--r--  1 user  admin   237K  9  9 03:37 libHSinteger-gmp-0.5.1.0.a
-r--r--r--  1 user  admin   306K  9  9 03:37 libHSinteger-gmp-0.5.1.0_p.a
lrwxr-xr-x  1 user  admin    37B 12 12 21:02 libgmp.10.dylib -> ../../../../../../lib/libgmp.10.dylib
lrwxr-xr-x  1 user  admin    30B 12 12 21:02 libgmp.a -> ../../../../../../lib/libgmp.a
lrwxr-xr-x  1 user  admin    34B 12 12 21:02 libgmp.dylib -> ../../../../../../lib/libgmp.dylib
```

とりあえずここがリンクパス通ってそうだからこう書いたんだけどちょっとあれすぎるので正解があれば教えて下さい。
Tomcatのセッションクッキー名(jsessionid)を変更する

Tomcat 6.0.28以上の場合、セッションクッキー名をデフォルトのjsessionidから変えることができます。Tomcat全体で変更する場合は、$CATALINA_HOME/conf/context.xmlのContextタグにsessionCookieName属性を追加するだけです。

```bash
vi $CATALINA_HOME/conf/context.xml

<!-- <Context> -->
<Context sessionCookieName="yourCookieName">
```

![cookieName.png](https://qiita-image-store.s3.amazonaws.com/0/43869/2c086375-e48b-d562-c978-a5afcf9483a9.png)

[参考]
Apache Tomcat 7 documentation
http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Attributes

Bug 45951 - Provide support for renaming JSESSIONID 
https://issues.apache.org/bugzilla/show_bug.cgi?id=45951
Symfony Best Practicesを読んで感じたこと

[Symfony Best Practices](http://symfony.com/doc/current/best_practices/index.html)を読んで、「なるほどなぁ」と感じたり、「えー！？」と感じたりがいくつかあったので、自分なりの感想をまとめてみました。

作成にあたり、[日本語訳](http://docs.symfony.gr.jp/symfony2/best_practices/index.html)には大変お世話になりました。翻訳者の方々、ありがとうございます。

## The Symfony Framework Best Practices ##

>Keep in mind that these are *optional recommendations* that you and your team may or may not follow to develop Symfony applications.

>you should not refactor your existing applications to comply with these best practices.

まず最初に、ベストプラクティスとはの説明です。**recommendations**というのが重要で、mustではありません。
既存のアプリケーションをリファクタリングすべきでもありません。
ただ、"Best Practices"を読む前と後では、少なからずアプリケーションの設計・実装方針が変わってくることでしょう。

## Creating the Project ##
>Create only one bundle called AppBundle for your application logic

アプリケーションのバンドルは"AppBundle"ひとつにしましょう、ですか！
ユーザー登録画面など、機能ごとにバンドルにした経験があります。
>But a bundle is meant to be something that can be reused as a stand-alone piece of software.

バンドルは単体で再利用できるものですよ、と。この方針を意識していればバンドルを乱立せずに済みそうです。

## Configuration ##

>Define all your application's parameters in the app/config/parameters.yml.dist file.

アプリケーションのふるまいに関係ないパラメータはapp/config/parameters.yml.distに記述しましょう、とあります。
symfony2.3のデフォルトでは、データベースの接続設定、メールサーバの接続設定、ロケール、シークレットが記載されています。
parameters.yml.distにあってparameters.ymlにないパラメータはsymfonyがプロンプトを出して設定を促します。
なので、parameters.ymlはバージョン管理外にしてparameters.yml.distを管理するのがsymfonyの流儀になります。

>Define the application behavior related configuration options in theapp/config/config.yml file.

アプリケーションのふるまいに関する設定はapp/config/config.ymlに定義しましょう。
私は以前バンドルを乱立させたアプリケーションを作ったがために、config.ymlがバンドル内にあったり、app/configにあったりと、自ら見通しを悪くさせていました。

AppBundle + app/config/config.ymlで、どんな設定があるのかの見通しがよくなるでしょう。

>Use constants to define configuration options that rarely change.

めったに変わらない設定は定数を使いましょう。これは自然とできているかなぁ。例のようにnum_itemsを10に設定しようと思いません。ただ、constを書くファイルは気にしています。クラス内の閉じている定数であればクラス内、共通で使用するような定数は専用のクラスを作ってその中でconst定義をしています。

## Organizing Your Business Logic ##

>Use the YAML format to define your own services.

はい。サービス名に限らず設定はすべてyamlを選んでいます。xmlはパッと見がわかりづらいです。

>Don't define parameters for the classes of your services.

クラス名をパラメータとして別定義するなと。たしかに、クラス名の定義をパラメータから探して…は、効率が悪いです。私は過去に、複数のクラスが名前空間が共通のために、名前空間をパラメータ定義したことがあります。これも推奨されないのでしょうね。サービス定義には、名前空間含めてパラメータを使わないクラスそのままを使用する。

## Controllers ##

>Make your controller extend the FrameworkBundle base Controller and use annotations to configure routing, caching and security whenever possible.

ルーティングの設定はアノテーションを使いましょう、と。私はパラメータとして別ファイルでまとめて管理していたのですが、クラスを見るだけでルーティングがわかるのは見通しがいいかもしれません。一覧が見たければコマンドがありますからね。

## Templates ##

>Use Twig templating format for your templates.

はい。Twig以外考えられません。

>Store all your application's templates in app/Resources/views/ directory.

バンドル以下じゃないのですね。たしかにapp以下であればテンプレートを指定する際にバンドル名を指定する必要がありません。これもアプリケーションをAppBundleのみにする方針と連動していますね。

## Forms ##

symfonyのフォームは強力です。自前でタグを書くことがないよう、ドキュメントで説明されている流儀に従いましょう。

## さいごに ##

以上、ざっと書いてきましたがsymfonyを使っていて感じることは、柔軟性もさることながら流儀に乗っていると感じているときの開発効率の高さです。

逆に、「なにかややこしいことになってきたなぁ」と感じるときは、たいていsymfonyの流儀に逆らっています。
難しくなる前に一度踏みとどまって、シンプルに流儀に乗ることがsymfonyで快適に開発するコツだと思っています。
Viewの構造を丸見えにするHierarchy Viewerの使い方

Android SDKにはViewの階層を確認できる[Hierarchy Viewer](http://developer.android.com/tools/help/hierarchy-viewer.html)というツールが入っています。

Activityの中にViewPagerが入っててFragmentがあって中にListViewがあってアイテムのレイアウトがあって中にはpartialレイアウトがあって、実際今見ている画面のレイアウトどうなってんの？みたいな時も一目で階層構造がわかります。

Viewの中でどこがどのくらいの時間でレンダリングされたかも確認できるので、ボトルネックを探す時にも役立ちます。そんなHierarchy Viewerの使い方メモです。

#ViewerServerの導入

Hierarchy Viewerは、ルート化された端末 or エミュレータじゃないと動きません。最新のAndroid SDKのツールだと動くらしいんですが、自分のGalaxy Note3だと動きませんでした。

そういう時は、[ViewServer](https://github.com/romainguy/ViewServer)を入れると動きます。導入の仕方はこちらの記事がわかりやすかったです。 ⇒ [非rootなAndroid端末でHierarchy Viewerを使う方法](http://yuyakaido.hatenablog.com/entry/2014/02/19/184607)


#起動
公式ドキュメントには`AndroidSdk/tools/hierarchyviewer                      `で起動すると書いてあるんですが、実際に打ってみるとそれは古いからAndroid Device Monitorを使えと言われます。

```
% ~/AndroidSdk/tools/monitor
```

Android Studioを使っている場合は、ツールバーのアイコンをクリックします。

![fragment_home_timeline_shallow_xml_-__app__-_android-layout-performance_-____work_android-layout-performance__-_Android_Studio__Beta__0_8_14.png](https://qiita-image-store.s3.amazonaws.com/0/15267/faaca8a9-4ff4-7494-8220-8b4642178212.png "fragment_home_timeline_shallow_xml_-__app__-_android-layout-performance_-____work_android-layout-performance__-_Android_Studio__Beta__0_8_14.png")

起動直後はHierarchyViewが表示されていないので、右上の方のアイコンから起動します。

![Android_Device_Monitor.png](https://qiita-image-store.s3.amazonaws.com/0/15267/253a1e8c-1d4c-267d-5445-52e2214f0ca3.png "Android_Device_Monitor.png")

#端末に表示されているView階層を見る
端末をUSBでつないで、接続が確認できると、右側にアプリが表示されます。

![Android_Device_Monitor.png](https://qiita-image-store.s3.amazonaws.com/0/15267/546301c9-e59a-4483-27a1-6f95f943494a.png "Android_Device_Monitor.png")

最初は何も表示されていないので、手動でリロードしてやる必要があります。

![Android_Device_Monitor_と_Android_Tools_Updated.png](https://qiita-image-store.s3.amazonaws.com/0/15267/3b403921-20e0-4cad-bab8-73068a24cff8.png "Android_Device_Monitor_と_Android_Tools_Updated.png")

表示はできてもこんな感じでMeasureやLayoutにかかった時間が表示されないことがあります。

![Android_Device_Monitor.png](https://qiita-image-store.s3.amazonaws.com/0/15267/880e12e2-6204-8efc-e3fc-6fbf98365219.png "Android_Device_Monitor.png")

そういう時は、このアイコンをクリックして少し待つと表示されるようになります。

![Android_Device_Monitor_と_Android_Tools_Updated.png](https://qiita-image-store.s3.amazonaws.com/0/15267/049e742d-159e-647d-6c82-c3f776fdfc15.png "Android_Device_Monitor_と_Android_Tools_Updated.png")

# ビューの簡単な説明
## Tree Overview
オーバービューには全体の階層が表示されています。□でかこまれた領域がTreeViewに表示されます。

## Layout View
現在のレイアウトが表示されています。ここを見たい、というレイアウトを選択すると、その位置にTreeViewが移動します。

## Tree View
各レイアウトの要素の詳しい情報が表示されます。Measure、Layout、Drawにかかった時間や、どこが遅いか等が視覚的にわかります。

![Android_Device_Monitor.png](https://qiita-image-store.s3.amazonaws.com/0/15267/6ef99db2-f6c1-b738-239c-efb62e2e01e3.png "Android_Device_Monitor.png")


----
[Googleの提唱するパフォーマンスTips](http://developer.android.com/training/improving-layouts/optimizing-layout.html)では、Viewの構成は浅く広く作るのがよいとされています。

Hierarchy Viewで言えば、Tree Overviewを見た時に横に長くなるレイアウトよりも縦に長くなるレイアウトの方が望ましいということです。

結構動きが重くて若干使いづらいツールですが、Viewの最適化の第一歩として現状のレイアウトの状態を知るのにはとてもよいと思うので、参考にどうぞ！
solr + banana 始め方

昨今検索ログの可視化が流行っています。
ElasticsearchではElasticsearch+kibana(+fluentd)が注目されていますが、
Solrではそれに対抗するように、Solr + bananaというものが作られました。
**模擬的なアクセスログを可視化すること目的**にSolr + banana を簡単に説明したいと思います。

#Solr
solrは最新の4.10.2を使いました。
http://ftp.riken.jp/net/apache/lucene/solr/4.10.2/

#banana
bananaはここからダウンロード。
https://github.com/LucidWorks/banana
(->Download Zip)

#Java
jdkは1.8.0_25を使いました。

#Solr起動
パッケージを解凍後、Solrを起動します。

```
unzip solr-4.10.2.zip
cd solr-4.10.2/example/
java -jar start.jar
```
起動後下記アドレスでSolrを確認できます。
http://localhost:8983/solr/

#bananaの配置
Gitの説明通りにやってみます。
https://github.com/LucidWorks/banana

Gitからダウンロードしてきたものを解凍し、solrに配置します。

```
unzip banana-release.zip
mv banana-release solr-4.10.2/example/solr-webapp/webapp/
```
下記のアドレスで確認してみましょう。
http://localhost:8983/solr/banana-release/src/index.html#/dashboard

こんな感じに表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/17698/f3e8a2f8-6403-c2fb-30a5-10759697087d.png)

ちょこちょこ使ってみた感じ思ったのは

**kibanaと(ほとんど)同じだ！**
と思いました。(当たり前か。)

* パネルの追加方法がkibanaと同じ。
* Timepickerやテキスト表示などkibanaと同じ。

......などなど細かいところの使い方がkibanaと同じで取っ付きやすいです。


#ヒストグラムを使ってみる。
普段kibanaのヒストグラムパネルを使っているので、bananaのヒストグラムを使ってみたいと思います。

**ドキュメント**
下記のようなサンプルのドキュメントを入れてみます。
long型とdate型のフィールドを用意し、1秒ごとのランダムで数値を入れ、
模擬的に時間ごとのアクセス数を作成し可視化してみます。
(3600秒(doc分)=1時間分入れました)

```docs.xml
<add>
<doc>
<field name="id">test-0001</field>
<field name="count_l">13</field>
<field name="date_dt">2014-12-13T10:00:01Z</field>
</doc>
<doc>
<field name="id">test-0002</field>
<field name="count_l">17</field>
<field name="date_dt">2014-12-13T10:00:02Z</field>
</doc>
.....
```

**更新**

```
curl 'http://localhost:8983/solr/collection1/update?indent=true' --data-binary @docs.xml -H 'Content-Type: text/xml'
curl 'http://localhost:8983/solr/collection1/update?indent=true' --data-binary '<commit />' -H 'Content-Type: text/xml'
```

**Timepickerの設定**
Timepickerウインドウで、Absoluteを選択し12(月)/13(日)/2014(年)19:00-20:00に設定します。(時差９時間のため。日本時間に合わせるのはちょっとまだわかってません。。。)
![image](https://qiita-image-store.s3.amazonaws.com/0/17698/d393b8c0-af60-42c3-5867-65b97913a7dd.png)

右上の右から3番目のconfigureボタンを押して日付フィールドを設定します。
Time Fieldをdate_dtにします。
![image](https://qiita-image-store.s3.amazonaws.com/0/17698/7d22c601-3874-070f-1bb5-6e4730360b0d.png)

**Histogramの追加**
別のrowでHistogramパネルを追加します。Timepickerと同じように右上の右から3番目のconfigureボタンを押して設定します。
Mode:values、Value Field:count_l、右下のinterval：1sにします。

![image](https://qiita-image-store.s3.amazonaws.com/0/17698/ef2915a4-4489-96e3-c0bc-dc19f1620959.png)

こんな感じのヒストグラムができました。
![image](https://qiita-image-store.s3.amazonaws.com/0/17698/c2713ba2-d2ac-52ea-bea7-114dd41f6ca9.png)

(1秒間隔で表示してるためか草が生えてるようにしか見えないですね。)
ヒストグラムなので、折れ線グラフ、ドットグラフも使えます。
応用すればログをパースしてさまざまなデータを表示できるでしょう。

#感想
使ってみた感想ですが、
メリットとして

* kibanaよりさくさく動くのがメリット。
* 時間を広い時間にしても1秒間隔で表示できる。
(kibanaは5分などいい感じの単位でまとめられてしまう。bananaも24時間などかなり広くすると線が細すぎて見えなくなってしまいますが、その都度調整必要。)
* Solrを使ってる人には使いやすい。(当たり前ですが。。)

デメリットとして

* インデックスが分けられない。(elasticの場合はその度ごとにインデックスが分けられていいですね。collectionを分ければいいのかな？)

ちょっと簡単にしかメリットデメリットあげられませんでした。
LXCコンテナからのgit cloneでハマるの巻

## Github からcloneするときにSSLエラーが出る。
※自分への戒め。安易に責任を他に求めてはダメというネタ。

新しく卸したサーバーにおいて、複数の人間が触ることが判明したので、
ファイルの削除にrmコマンドは「使用出来ない様に仕様変更しよう」
と思った今日この頃。環境はLXCコンテナのCentOSです。

### trash-cliを使ってrmコマンドをゴミ箱に置き換える方法を採用する事に。

```shell
git clone https://github.com/andreafrancia/trash-cli.git

fatal: unable to access
~~
Failed connect to github.com:443
```

Oh...繋がらない。

エラーメッセでぐぐると
[GitのSSL検証を無効にすれば正常にupdate出来る。](http://origami-works.com/2014/05/04/githubでssl証明書のエラーが出た時の対処法/)
を試してみるけど違うっぽい。

gitでSSL証明書チェックをしない設定して試すとか

```shell
git config --global http.sslVerify false

# vim ~/.gitconfig

[http]
    sslVerify = false
```

SSL証明書のチェックをスキップすらしない＾＾

gitプロトコルを強制的にhttpに変更

```shell
# vim ~/.gitconfig

[url "git@github.com:"]
  insteadOf = git://github.com/
  insteadOf = https://github.com/
  insteadOf = http://github.com/
```
接続できない風のメッセージにチェンジ。

もしや名前解決出来てないとかー

```shell
# less /etc/resolv.conf

nameserver 8.8.8.8
nameserver 8.8.4.4

# dig github.com
```

問題無

```shell
# traceroute github.com
traceroute to github.com (192.30.252.131), 30 hops max, 60 byte packets
```
？あら？まさか

```shell
# route

192.0.0.0     *               255.255.0.0   U     0      0        0 eth1
```
うほっ＾ｗ＾
192.30.252.131がローカルIP扱い

ホスト側で

```shell
# vim /var/lib/lxc/vmxxxxx/config
```
configに次の行を追加

```shell
lxc.network.ipv4 = xxx.xxx.xxx.xxx/prefix_length
```
prefix_lengthにnetmaskをしかと入れてコンテナの再起動で完。

これで小一時間ハマるとか。死んだ方が良いと思った。
いや死なんけど。
Amazon LinuxでPostfix/PostgreSQLを用いたPostfixAdmin構築

# Amazon LinuxでPostfixを用いたPostfixAdmin構築ログ

## インストール パッチ適用
Amazon LinuxのPostfix RPMはPostgreSQLを組み込まれてないので
src-rpmでビルドする。

* 停止
$ sudo /etc/init.d/postfix stop

* 削除
$ sudo rpm -e postfix

* SRPM取得
※amazon linuxのrpm取得方法はその都度確認
$ get_reference_source -d -p postfix

* specファイル編集
` $ cd /usr/src/srpm/debug
$ sudo rpm -ivh postfix-2.6.6-2.14.amzn1.src.rpm
$ su - `
` # cd /root/rpmbuild/SPECS `
` # cp -p postfix.spec postfix.spec.`date +%Y%m%d` `
` # vim postfix.spec
` # diff postfix.spec  postfix.spec.`date +%Y%m%d` `
` 3,4c3,4 `
` < %{?!MYSQL: %define MYSQL 0} `
` < %{?!PGSQL: %define PGSQL 1} `
` --- `
` > %{?!MYSQL: %define MYSQL 1} `
` > %{?!PGSQL: %define PGSQL 0} `

` # yum install rpm-build `
` # yum install dovecot  dovecot-pgsql php httpd postgresql-server postgresql-libs postgresql-devel openldap-devel cyrus-sasl-devel pcre-devel db4-devel zlib-devel openssl-devel `

* パッチ適用

` # cd ../SOURCES/`
` # wget http://patches.netspiders.net/postfix/postfix-2.6.6-linux3.patch `
` # cd ../SPECS/ `
` # wget http://patches.netspiders.net/postfix/postfix-2.6.6-linux3.spec.patch `
` # patch -p0 < postfix-2.6.6-linux3.spec.patch
`

* ビルド
 `# rpmbuild -ba postfix.spec `

* インストール
` # cd /root/rpmbuild/RPMS/x86_64 ` 
` # rpm -ivh postfix-2.6.6-2.14.amzn1.x86_64.rpm `

* pgsqlモジュール確認
` # postconf -m `

あとはmysqlの連携と変わらず。

### 備考
* PostfixAdmin使用時のmain.cf例

`# Postfix admin settings
local_transport = local
virtual_transport = virtual
virtual_mailbox_base = /home/mailuser
virtual_alias_maps = pgsql:/etc/postfix/pgsql_virtual_alias_maps.cf
virtual_alias_domains = $virtual_alias_maps
virtual_mailbox_domains = pgsql:/etc/postfix/pgsql_virtual_domains_maps.cf
virtual_mailbox_maps = pgsql:/etc/postfix/pgsql_virtual_mailbox_maps.cf
virtual_minimum_uid = 5000
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000`
autolayout - UITableView - heightをcontentSizeに一致させる方法

　実際に試しているのは「UIScrollViewのなかに置いたUITableViewのheightをcontentSizeに一致させる方法」です。特に検証もしてないので備忘録的メモ…

# 要旨
* Storyboardにて、UITableViewにHeight Constraintを設定 (適当な値でよい)
* `@IBOutlet weak var tableView: UITableView!` `@IBOutlet weak var tableHeight: NSLayoutConstraint!` などとアウトレットを設定
* viewDidAppearで `tableHeight.constant = tableView.contentSize.height` と書く

　これで(UIScrollViewの中に置いた)UITableViewがコンテンツのサイズぴったりのheightになるようです。
　Autolayout下ではframeを直接書き換えてもダメっぽい？
たった1行！jQueryで指定箇所までアニメーションつきで自動スクロールさせる方法

#　jQueryで指定したセレクタの箇所まで自動でスクロールする方法を紹介します。

次のように1行で書くことができます。

```lang:sample.js
$("html,body").animate({scrollTop:$('セレクタ').offset().top});
```

たとえばheaderのidをheaderとしたならば

```lang:sample.js
$("html,body").animate({scrollTop:$('#header').offset().top});
```

を呼んであげるだけでheaderまで自動でスクロールしてくれます。

この１行を少し分割して説明します。

```lang:
$('セレクタ')
```

* 指定したセレクタのオブジェクトが得られます。

```lang:
.offset()
```
* ドキュメント上での表示位置を取得します。簡単にいうとウィンドウの左上を基準とした位置が得られます。

```lang:
.top
```
* .offset()にはtopとleftが入っています。

ここまでで、

```lang:
$('セレクタ').offset().top
```

で指定したセレクタの上からの位置が数字で取得できます。


* 最後に。

```lang:
$("html,body").animate({scrollTop:数字});
```

で数字の位置までアニメーションをしながら自動でスクロールします。
数字が0ならば一番上まで戻る、ということもできます。
【Android】Google Driveはパーミッションに気をつけろ！

## 序章 ##
Google Drive APIが新しくなって便利になってますね〜！
昔ちょっとやったことがあったのですが、もうそりゃ苦労した記憶があります。

APIが新しくなってから初めてGoogle DriveのAPIを使用してみましたが、
少しはまったので、はまりポイントをご紹介します。

## 本題 ##
ご存じのようにGoogle Driveを使用するときは、SDカードのリードライト権限をマニフェストに
記載します。

	<permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

まず、これじゃダメです。

	<user-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

じゃないとダメです。
次に、

	<manifest xmlns:android="http://schemas.android.com/apk/res/android">

	    <application　・・・>
	    	<uses-permission android:name="android.permission.INTERNET"/>
	    	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
	    ・
	    ・
	    ・
	    </application>
	</manifest>

これ一見良いように見えるのですが・・・
いや、実際これで、SDの中のリードは出来るようです。
でもこれじゃダメです。

	<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    	<uses-permission android:name="android.permission.INTERNET"/>
    	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

	    <application　・・・>
	    ・
	    ・
	    ・
	    </application>
	</manifest>

こうじゃないとSDへの書き込みがダメです。
**要はパーミッションはapplicationの外で記載しないとダメだよってことです。**
**大事なのでもう一回言います**
**パーミッションはapplicationの外で！**


## まとめ ##
パーミッションはapplicationタグの外で宣言しよう！
そうしないと意外なところではまっちゃうよというお話でした。


Google Drive APIの使い方については、後ほど（気が向いたら）書きます。
収納場所について

##心がけてほしいこと

・机を拭く
・炊飯器、ケトルは使ったらキッチンの上の棚に片付ける
・サッカーボールを放置しない
・物が届いたら、段ボールはまとめる、開けっ放しのままにしない
・ペットボトルを出しっ放し、飲みっぱなしにしない

##収納場所
・キッチンの上の棚…炊飯器、ケトル、排水口のネット、コーヒー
・キッチンの引き出し…おはし、スプーンなど
・キッチンの下の棚…お米、スープなど保存食
・トイレの棚…激落ちくんなど、掃除用品
・茶色の棚右上…名刺、付箋など文房具系、工具
・茶色の棚左上…お菓子、ミルク、砂糖、ランチパスポート
・茶色の棚右下…寝袋、mikanTシャツ
・茶色の棚左下…うさの書類、郵便物、本など

###みんなで協力して快適なオフィスにしましょう！
Swiftでスクリーンサイズを取得する（特にLandscape対応）

Landscape（横向き）でスタートするアプリの場合、ios7では正しいスクリーンサイズを取得出来ない場合があります。そこでスクリーンサイズを取得するメソッドを用意しておきます。

```swift
    class func screenSize() -> CGSize {
        let screenSize = UIScreen.mainScreen().bounds.size;
        if NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1
            && UIInterfaceOrientationIsLandscape(UIApplication.sharedApplication().statusBarOrientation) {
                return CGSizeMake(screenSize.height, screenSize.width)
        }
        return screenSize
    }
```
クラスメソッドとして、簡単に呼び出せるようにしています。

またUIViewなど生成するのに、frameについても同様のため、下記のメソッドを同じクラスに追加しておくと便利です。

```swift
    class func screenFrame() -> CGRect {
        return CGRectMake(0, 0, screenSize().width, screenSize().height)
    }
```
PHP 製デプロイツール Rocketeer で簡単デプロイ

1年越しに書きました。[デプロイツールを使ってLaravelをデプロイする](http://localdisk.hatenablog.com/entry/2015/12/24/153622) Rocketeer より Deployer のほうが簡単でカスタマイズがききます。

という話を書く予定だったのですが、色々とあってまとまった時間がとれていません。近日中には…！