OmniAICreator/Qiita-1.07M huggingface dataset:
ApacheでPython3+Django ~Mac~

意外とこのあたりがまとまってるものがなかったのでメモ。
Macにはデフォルトで
Python 2.7.9
がインストールされている。

# pyenvの準備
pyenvはPython環境を管理するもの。
バージョン違いのPythonを切り替えて管理することが可能。

## pyenvのインストール
Macの場合は、brewでインストールする。

```bash
$ brew install pyenv-virtualenv
```

## Pythonのインストール
3.4.3をインストール。

```bash
$ pyenv install 3.4.3
```

3.4.3をグローバルに設定する。

```bash
$ pyenv global 3.4.3
```

グローバルに設定されたか確認する

```bash
$ python -V
```

# mod_wsgi
mod_wsgiとは、Apache上でPythonを動かすためのモジュール。

## インストール

```bash
$ brew install mod_wsgi
```

## Apacheの設定
httpd.confに以下を追加。

```bash
LoadModule wsgi_module [module to path]
```

virtualhostに設定する場合は以下を参照。
http://django-project-skeleton.readthedocs.org/en/latest/apache2_vhost.html

## Daemon Mode
wsgi_modはデフォルトで「Embedded Mode」になっている。
「Embedded Mode」はApacheを再起動しないとpythonファイルが更新されない。
pythonの修正を即時に反映させるためには、「Daemon Mode」に設定する。
「WSGIDaemonProcess」に「processes=2 threads=15 display-name=%{GROUP}」を入れる。

```bash
WSGIDaemonProcess example.com processes=2 threads=15 display-name=%{GROUP}
```
[参考]
https://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Delegation_To_Daemon_Process
PayPal Vault APIについて

#PayPal Vault API
https://developer.paypal.com/docs/api/#vault

Vault という耳慣れない言葉を使ったAPIですが、クレジットカード決済を処理する上で非常に重要な言葉なので覚えておきましょう。

辞書では、アーチ、天井　貯蔵庫などを指す言葉です。
http://ejje.weblio.jp/content/vault

クレジットカードを扱う技術用語としては、「カード情報の保存場所」という文脈で使われます。

```
curl -v -X POST --insecure https://api.sandbox.paypal.com/v1/vault/credit-cards \
-H 'Content-Type:application/json' \
-H 'Authorization: Bearer <Access-Token>' \
-d '{
    "payer_id": "user12345",
    "type": "visa",
    "number": "4417119669820331",
    "expire_month": "11",
    "expire_year": "2018",
    "first_name": "Betsy",
    "last_name": "Buyer",
    "billing_address": {
        "line1": "111 First Street",
        "city": "Saratoga",
        "country_code": "US",
        "state": "CA",
        "postal_code": "95070"
    }
}'
```
このようにカード番号や有効期限などをVault APIに登録すると

>CARD-64X402443J205880LKZ4QFKQ

といったカード情報を識別するIDが取得できます。

これを以下のPayment APIのパラメータとして渡すと、決済毎にカード情報を渡さなくとも決済できるようになり、
https://developer.paypal.com/docs/api/#create-a-payment

また、自身のサーバーに顧客のカード番号を送信せずにサーバーからカード決済を実行する（アプリやウェブページのJavaScriptからVault APIをつかってPayPalにカード情報を預け、そのIDを使ってサーバー側で決済する）ようなことができます。

こうしたカード情報を自身で保持しない運用をすることで、[PCIDSS](http://www.jcdsc.org/pci_dss.php)の適用レベルを下げるなどのセキュリティ対策も実現できます。
フリーランスの健康管理

フリーランスって会社員と違い、何かあったら速攻無職かつ無収入に陥るので、
健康管理は大切だよって話。


# 健康管理の基本は、稼働時間の管理から

案件ベースや在宅で仕事をしていると、ついついだらだらと仕事をしてしまいがちですが、
いくら徹夜をしたって、いくら深夜作業をしたって、いくら休日作業をしても、追加料金や残業代なんか
無いのが、フリーランスのお仕事です。

そうなると、**だらだら働くだけ負け**なのです。

となると、稼働時間を決めて作業をしましょう！

だいたい、10時から18時。これだけでも8時間労働です。
この原則から、見積をすれば良いし、それ以外はならべく働かない。電話にも出ない。ことを
心がけるだけで、メリハリの付く生活になると思います。

# 朝活より朝の散歩

意識高い系が朝活なんていう、早朝残業を普及させようとしていますが、自分は反朝活主義者ですｗ

早朝残業するより、朝の散歩をしようぜ！！

散歩という単純作業を行うことにより、思考の整理って意外に捗ります。

あと、散歩って有酸素運動なので、ランニングより消費カロリーが多かったり、
運動後の疲労が少ないので、散歩後に作業をすることも楽に出来ます。

まあ、散歩のついでに買い物をして来たり、途中でカフェに入ってしまうものアリです。

ランニングより、散歩がオススメ。

# 昼食後は寝る！

昼食後は、眠くなってしまい作業効率が落ちてしまいます。

フリーランスなんだから、むりせず我慢せず、30分寝ましょう！
ただし、30分だけですよ。

30分だけ寝る効用は、Google先生に聞いてくださいｗ 確か、医学的に検証されていたような。。。

すっきりした頭で午後の作業に取り組めばいいじゃないっすか。

会社員だと出来ない、午後の昼寝をするという特典も、フリーランスに与えられた特権だと思います。

# 栄養ドリンク、エナジードリンクはほどほどに

カフェイン中毒死の方が日本で初めて出ましたね。

確かに、栄養ドリンクやエナジードリンク、カフェインの錠剤で眠気が取れたり、頑張れたり出来る
気がしますが、それって体に負担が大きいですよ。

まあ、その頑張った後できちんと休養が取れるのであれば良いですがね。。。

無理せず、疲れたら寝る。
徹夜をしたら、翌日は寝る。

無理して頑張ったら、きちんと休養しましょう！！


当たり前のことを当たり前にできなくなっているので、あえて書いてみました。
フリーランスは誰も保障してくれないので、健康管理も業務の一つとして考えてみては？
githookでmasterにpush禁止のスクリプトをプロジェクトで共有

.git以下はgit管理できないので、仕方なくシェルを実行してもらうところに落ち着いた。
gitルートディレクトリ以下にbin/git_hook_setting.shとbin/hooks/pre-pushを書く。
pullした後に, sh bin/git_hook_setting.shを実行してもらう。

```bash:git_root_dir/bin/git_hook_setting.sh

echo "setting hooks"
cd `dirname ${0}`
ln -sf ../../bin/hooks/pre-push ../.git/hooks/pre-push 
chmod 755 ../.git/hooks/pre-push
```

```bash:git_root_dir/bin/hooks/pre-push
#!/bin/bash

while read local_ref local_sha1 remote_ref remote_sha1
do
    ref="${remote_ref##refs/heads/}"
    if [ "$ref" = "master" ]; then
        echo "Do not push to master/dev branch!!!"
        exit 1
    fi
done
```

参考: http://d.hatena.ne.jp/thinca/20150306/1425639218
意識高くないエンジニア入門

意識高い系って奴らいますよね。

まあ、自分は意識高くないので、どうでもよいですけどｗ

意識高く無いエンジニアとして生きていく戦略のポエムです。

# 好きなことを好きなペースで

今まで、いろんなスタートアップ（昔はベンチャー企業って言ったのにね）の会社の話を聞いていると、
「今はがんばりどころなので、開発負荷が高い」
「今がんばれば、業界でトップになれる」
「今がんばれば、市場を押さえられる」
と、「今がんばれば」なんていうフレーズを聞き飽きてます。正直。

今がんばって、後から力を抜けるのであれば良いけど、多分そんなことは無い。

だって、**進化のないシステムやサービスって、陳腐化して廃れるだけだもの**

なので、好きなことを好きなペースで行える環境こそが、エンジニアにとって天国なのかもしれない。

# 最先端の弐番手を追いかけて

最先端って追従している人いますよね。お疲れ様です。頑張って下さい（他人事ｗ）

最先端の技術って、一見カッコイイように見えるけど、実は非常にリスキーかつ体力がいる行為です。

昔と違って、雨後の竹の子というか、無数に「新技術」というモノが生まれては廃れているこのIT業界。
最先端を全部追いかけている暇があったら、ひとつのことに専念した方が良いし、
その最先端の技術が３年後、５年後、１０年後にいくつ生き残っているかどうか。。。

まあ、一番良いのは最先端の弐番目あたりを追いかける心構え。
最先端の技術で問題があったり、未成熟だったり、文献が少なかった部分がある程度洗練された状態が、
弐番目の技術。
Google先生で、某Ｃ社のブログ以外の日本語のブログが作成されたり、Qiitaで解説や入門の記事が３本以上アップされた時点が弐番目。

そういう技術をしっかりと検証や導入検討が出来るエンジニアが一番良いと思います。

# 休む時は休む

勉強会とかカンファレンスとかって、土日や平日夜間が多いですよね。

でも、疲れません？

休むときはしっかり休もうよ！と、言いたい訳です。

なので、勉強会はなるべく平日に開催して欲しいのが本音だったり、
あと似たようなジャンルの勉強会は、同じ日に開催してほしくなかったり。

平日、稼働しているんだから、土日祝日はしっかり休みたい。
深夜作業があるなら、その前の昼間は休養を取りたい。その後は寝たい。

そんな感じｗ


まあ、スタートアップで頑張るのも、最先端の技術を追いかけるのも、土日も働くのも
その人本人の自由ですが、それをやりたくないエンジニアもいることだけは忘れないでくださいな。

自分は、後者のエンジニアですが、何か？
【Swift/php】Alamofireで画像upload&パラメータをPOST

Alamofireで画像やファイルをアップロードしつつ、パラメータを渡す方法がわからなかったところ
下記を参考にすることでクライアント側の対応は行うことが出来ました。
ありがとうございます。


[1,AlamofireでMultipartFormDataをパラメータ付きでポストする - Qiita](http://qiita.com/wmoai/items/4826817fe4f9bd10e880)
[2,Alamofireでmultipart/form-dataリクエスト - Qiita](http://qiita.com/gologo13/items/e7b1ed56b6692e388d4d)


しかし、PHP側での受け取り方で手こずったのでメモしておきます。
※Swift側の記述は2,の記事を参考に用意済みという前提で進みます

```swift:Viewcontrolller.swift
// POSTしたいパラメータ POST値を受け取る際にkeyになるのがnameのstringです。今回はuserIdという文字列でやっていきます
multipartFormData.appendBodyPart(data: "お好きな文字列".dataUsingEncoding(NSUTF8StringEncoding)!, name: "userId" )
// 画像データ nameが受け取る際のkeyになるので重要です(値はなんでもいいけどわかりやすくimgにしておきます)
multipartFormData.appendBodyPart(data: data, name: "img", fileName: "test.png", mimeType: "image/png")

```


画像、ファイルの受け取り方

```php:get.php

//アップロードが成功されていれば一時保存されている箇所が「tmp_name」に格納されています(自動)
$filePath = $_FILES['img']['tmp_name'];
//そのtmpパスからfileGetContentsで取得！後はお好きなようにどうぞ
$fileData = file_get_contents($filePath);

//自分の場合はGDライブラリを使用していたので下記のような記載で保存しました
//※GDライブラリはPHP4.3以上であれば特にインストールせず使えるようです
$tmpImg = imagecreatefromstring($fileData);

// 圧縮処理、リネームなど処理行う

//サーバー上の格納場所に保存する
$result = ImageJPEG($tmpImg, "サーバー上の保存パス");

```

POSTパラメータの受け取り方

```php:get.php

//普通にPOSTの値受け取りでいけます
$userId = $_POST['userId'];

```


以上になります。
Unityを5.3.xにアップデートしたらInspectorの変更が保存されなくなってしまった…。 (´・ω・｀)

# 概要
[Editor拡張してInspectorの表示をカスタム](http://qiita.com/sango/items/b705980ada56ba8ffa04)していたのですが、Unityを5.3.xにアップデートしたらその値が保存されなくなってしまった、というお話を綴ります。

※尚、まだ充分な調査/検証ができていないです。

# 事例
## サンプルコード : 保存されない(旧来)Ver.

```csharp:TestClass.cs
using UnityEngine;
using System.Collections;
#if UNITY_EDITOR
using UnityEditor;
#endif

/* -- 基礎クラス -- */
public class TestClass : MonoBehaviour
{
	[SerializeField]
	int		myInt	= 0;


#if UNITY_EDITOR
	/* -- Editor拡張クラス -- */
	[CustomEditor(typeof(TestClass))]
	public class TestClassEditor : Editor
	{
		public override void OnInspectorGUI()
		{
			TestClass tc = target as TestClass;

			tc.myInt = EditorGUILayout.IntField( tc.myInt );
		}
	}
#endif
}

```

## サンプルコード : 保存される(模索)Ver.

```csharp:TestClass.cs
using UnityEngine;
using System.Collections;
#if UNITY_EDITOR
using UnityEditor;
#endif

/* -- 基礎クラス -- */
public class TestClass : MonoBehaviour
{
	[SerializeField]
	int		myInt	= 0;


#if UNITY_EDITOR
	/* -- Editor拡張クラス -- */
	[CustomEditor(typeof(TestClass))]
	public class TestClassEditor : Editor
	{
		// 経由用
		SerializedProperty intProperty;

		void OnEnable()
		{
			// 基礎クラスからmyIntをSerializedPropertyで受け取る
			intProperty = serializedObject.FindProperty( "myInt" );
		}
		public override void OnInspectorGUI()
		{
			serializedObject.Update();

			// 編集中はSerializedProperty経由で
			intProperty.intValue = EditorGUILayout.IntField( intProperty.intValue );

			serializedObject.ApplyModifiedProperties();
		}
	}
#endif
}
```

基礎クラスのパラメタを `SerializedProperty` 経由で取り扱い、 `ApplyModifiedProperties()` することで保存されるようになるみたい。

もしかしてEditor拡張ってこの手法がメジャーなのかな…？

これ使うと、パラメタの変更がUnity側に検知される(閉じるときにセーブするか訊かれる)し、Undoもできる…！


# 問題点/懸念点

- 拡張パラメタが多いとリプレイスするのがしんどい
- そもそもこの現象が仕様なのかバグなのか判らない


# ↑に対するとりあえずの打開案
色々手探りしているうちに、 `SaveScene()` 呼ぶとちゃんと保存されることに気が付いたので、セーブボタンつけてみたよ。

## サンプルコード : 旧来Ver.向け打開案
```csharp:TestClass.cs
using UnityEngine;
using System.Collections;
#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.SceneManagement;	//!< 追加
#endif

public class TestClass : MonoBehaviour
{
	[SerializeField]
	int		myInt	= 0;


#if UNITY_EDITOR
	/** -- Editor拡張クラス -- */
	[CustomEditor(typeof(TestClass))]
	public class TestClassEditor : Editor
	{
		public override void OnInspectorGUI()
		{
			TestClass tc = target as TestClass;

			tc.myInt = EditorGUILayout.IntField( tc.myInt );

			// セーブボタン (マルチシーン？知らない子ですね。)
			if( GUILayout.Button( "Save!!" ) )
				EditorSceneManager.SaveScene( EditorSceneManager.GetActiveScene() );
		}
	}
#endif
}
```

結局、`Ctrl`+`S`とかではセーブできていないんだけど、
既にいっぱいあるパラメタを全部`SerializedProperty`に置き換えるよりは簡単かなって…。

(書いてて思ったけど、このSceneManager辺りの改修が影響してたりするのかな…？)

何かわかったらまた追記する(かも)よ！
Charismaというbootstrapベースの管理画面用テンプレートを利用したのでメリデメを

仕事でCharismaという管理画面用テンプレートを利用したので、使ってみた感想を書いてみます。
ざっくり言うと、ある程度表示速度が遅くてもよくて、そのままCharismaを使うのであれば便利なものだとは思います。

公式ページ
https://usman.it/themes/charisma/


# 使い方

ダウンロード用のサイトから一式ダウンロードします。

http://usman.it/free-responsive-admin-template/


もしくは、githubからもで取得可能です

https://github.com/usmanhalalit/charisma


で、中に入っている、jsディレクトリの中身と、cssディレクトリの中身を全て読み込むようにします。
※全て読み込まないとエラーします


# メリット

## オールインワン

基本的に色々なライセンスフリーのライブラリを取り込みまくって作られているので、だいたいなんでも揃ってます。シンプルな管理画面であれば自分でプラグインやらライブラリ探して入れて、みたいなのしなくて大丈夫です。

## 割とキレイ
カラースキームがまぁまぁな種類あるので、サイトイメージに合わせてそれなりにキレイなUIの管理画面がつくれます。


# デメリット

## とにかくロードが重い（これが一番きつい）

jsとcssのライブラリを相当量読み込む上に、charisma.jsというjsファイルが、その画面に使うか使わないか関係なくライブラリを使いたがるので、とても重いです。jsファイルのロードがタイムアウトとかざらです。

## bootstrap感
bootstrapベースだとわかりやすいぐらいにはbootstrap感あります。
ASP.net MVC + VB.net Oracle　チェックボックスに変更

#概要
[前回](http://qiita.com/khashimoto/items/e4b391968c3aa8e2d005)処理結果で、
MARRIEDの表示内容が数値になっていた。
ASP.netMVC5実践プログラミング のように、チェックボックスに変更する。

#環境
[前回](http://qiita.com/khashimoto/items/e4b391968c3aa8e2d005)参照

#手順
1.Membersテーブルのカラムの型を変更
Oracle
MARRIED CHAR(1) ⇒ MARRIED NUMBER(1)

既存データをNULLに
`UPDATE MEMBERS SET MARRIED = NULL;`
型を変更
`ALTER TABLE MEMBERS MODIFY (MARRIED NUMBER(1));`
MARRIED列に ランダムに 1 OR 0 を更新

2.データベースからモデルを更新
VS2013のプロジェクトに戻り、MemberModel.edmxを開く
MEMBERSモデルを右クリックし、データベースからモデルを更新を選択
更新タブを選択後、手順1で修正したテーブルを選択して完了ボタン

3.型を変更
引き続き、MemberModel.edmx
MARRIED列を右クリック⇒プロパティで プロパティ画面を開く
型を Boolean に変更

4.ビルド

5.実行

6.結果
![結果2.png](https://qiita-image-store.s3.amazonaws.com/0/101511/a42a1472-601b-5dab-ddee-4ad2f208b040.png)
巡回冗長検査(CRC-32)のHaskellでの実装

巡回冗長検査(CRC-32)のHaskellでの実装
==================================

計算方法
-------

[巡回冗長検査(CRC)のよくある計算方法の説明](http://qiita.com/YoshikuniJujo/items/d5c2f28a1329076584dc)

### テーブルを作る

1. はじめにtにeを代入する
2. 3から6を8回くりかえす
3. tを最下位ビットbと残りrにわける
4. rを右シフトする
5. bが0ならばrをtとする
6. bが1ならばrとわる数'とをxorしてtとする

eに0から255までを代入し結果をテーブルに保存する。

### CRCを求める

1. tに2 ^ n - 1を代入する
2. tを先頭8ビットeと残りrにわける
3. rを8ビット右シフトする
4. 8ビット読みだしeとのxorをとりe'とする
    1. ただし、読みこめなければtが結果となる
5. e'に対応する値をテーブルから読みこみsとする
6. sとrとをxorしtに代入する
7. 2へもどる

コード
-----

### 必要なモジュール

```hs:crc32.hs
import Control.Arrow
import Data.Array
import Data.Bits
import Data.Bool
import Data.Word
import qualified Data.ByteString.Lazy as LBS
```

### テーブルの作成

#### 補助関数

最下位ビットと残りのビット列とにわける。

```hs:crc32.hs
popBit :: Bits a => a -> (Bool, a)
popBit n = (n `testBit` 0, n `shiftR` 1)
```

#### 1ビットぶんの計算

```hs:crc32.hs
crc1 :: Word32 -> Word32
crc1 = uncurry (bool id (`xor` 0xedb88320)) . popBit
```

最下位ビットが0ならば残りのビット列そのままとし、1ならば残りのビット列と定数値とをxorする。

#### 8ビットぶんの計算

```hs:crc32.hs
crc8 :: Word8 -> Word32
crc8 n = iterate crc1 (fromIntegral n) !! 8
```

返り値は8ビットを読みこんだときの続くビット列に対する「変換」を表す。

#### テーブルの作成

```hs:crc32.hs
table :: Array Word8 Word32
table = listArray (0, 255) $ map crc8 [0 .. 255]
```

### CRCを求める

#### 補助関数

```hs:crc32.hs
popByte :: (Integral a, Bits a) => a -> (Word8, a)
popByte n = (fromIntegral n, n `shiftR` 8)
```

#### 1バイトぶんの計算

```hs:crc32.hs
step :: Word32 -> Word8 -> Word32
step n b = uncurry xor . (first $ (table !) . (`xor` b)) $ popByte n
```

「変換」を下位8ビットと残りのビット列とにわける。下位8ビットと読みこんだ1バイトとをxorする。それに対応する「変換」をテーブルから読みこみ残りのビット列とのxorをとる。これが新しい「変換」となる。
バイト列に対する計算

```hs:crc32.hs
crc :: LBS.ByteString -> Word32
crc = complement . LBS.foldl' step 0xffffffff
```

「変換」の初期値はすべてのビットが1の4バイトの値である。またCRCは最後に補数をとる。

### CRCをチェックする

CRCのチェックはCRCを求めて同値性を比較しても良いがもっとスマートなやりかたがある。もとデータの末尾にCRCの値を追加したもののCRCをとると定数になるという性質を利用する。

#### 補助関数

```hs:crc32.hs
word32ToBytes :: Word32 -> [Word8]
word32ToBytes = wtl (4 :: Int)
        where
        wtl i | i < 1 = const []
        wtl i = uncurry (:) . (wtl (i - 1) `second`) . popByte
```

Word32の値をリトルエンディアンでバイト値のリストにする。

#### チェック

```hs:crc32.hs
check :: LBS.ByteString -> Word32 -> Bool
check bs n = crc (bs `LBS.append` (LBS.pack $ word32ToBytes n)) == 0x2144df1c
```
PHPUnit の拡張 DBUnitで初期データ等の扱いについて

PHPUnitで考察中。

デフォルトで共通にデータを入れたい部分の考えがあり。そのデータを外部ファイルで読み込む形にしました。ただし、xmlやymlで読み込むのでなく、配列で定義して読む感じで行こうかと思ってます。これはマジックナンバーのお話が記事にあり同感だなと思いそうしました。

まだ試してないですがソースを以下のような感じで書いてみようかと・・・
$_dataで配列に読み込むファイルを定義するとそのデータをマージしてデータとして登録するような感じにする想定です。

```php
class TestsBase extends \PHPUnit_Extensions_Database_TestCase {
	protected $_data	= array();
	protected function getConnection() {
        $db = \Database_Connection::instance();
        return $this->createDefaultDBConnection($db->connection(), 'xxxx');
    }

    protected function getDataSet() {
    	$work	= array();
    	foreach($this->_data	as $data) {
    		$work	= array_merge($work,include(APPPATH."/tests/fixture".$data));
    	}
    	return $this->createArrayDataSet($work);
    }
} 
```

上記のクラスを継承して継承元で以下のように定義すれば読まれるかなぁと思ってます。

```php
class Test_XXXXXXX extends TestsBase {
	/**
	 * データベース初期値
	 */
	protected $_data	= array(
			"/file1.php"
		,	"/file2.php"
	);
```

file1.phpにはテーブル毎のデータを格納しとこうかと。こうすれば組み合わせで読み込むの変更できるかなーっと思ってます。うまくいくかなぁ・・・

```php:file1.php
return [
	'table名'	=> [
		[
			'id'    =>  1
		,	'nname'	=>  '名前１'
		]

```
Laravelを試してみる(環境構築編)

最近はCakePHPばかり使っていますが、これからはLaravelだ！みたいなのを読んだので、ちょっと試してみようと思います。

# VagrantでLaravel Homesteadというboxを使って環境構築する

参考：[Laravel 5.1 Laravel Homestead](http://readouble.com/laravel/5/1/ja/homestead.html)
Laravelは日本語のドキュメントがあって読みやすいですね。 :blush: 

Vagrantは入れてあったのでVagrantのインストールについては割愛します。ちなみにMacです。

```bash
$ vagrant box add laravel/homestead
```

VMwareが入ってるから？なのか、選択肢が出ました。

```
1) virtualbox
2) vmware_desktop
```

1を選びました。

```
==> box: Successfully added box 'laravel/homestead' (v0.3.3) for 'virtualbox'!
```

と出たので成功らしい。

```bash
$ git clone https://github.com/laravel/homestead.git Homestead
```

カレントディレクトリにHomesteadディレクトリができます。

```bash
$ cd Homestead
$ bash init.sh
```

`~/.homestead/Homestead.yaml` を編集します。
ip, folders, sitesを変えました。
ホストマシンで使っているEclipseのworkspaceを仮想マシンと共有できるようにし、その中に`laravel-test`を作ることにして、その中のpublicをdocument rootに設定します。(この時点では`laravel-test`はまだありません。)

```yaml:変更点
ip: "192.168.33.20"

folders:
    - map: ~/workspace
      to: /home/vagrant/workspace

sites:
    - map: homestead.app
      to: /home/vagrant/workspace/laravel-test/public
```

`/etc/hosts`にhomestead.appを追加。

```
192.168.33.20	homestead.app
```

```bash
$ vagrant up
$ vagrant ssh
```

仮想マシンが構築され、sshできました。
仮想マシンで`laravel-test`を作ります。

```bash
$ .composer/vendor/bin/laravel new workspace/laravel-test
```

ホストマシンのブラウザで `http://homestead.app`を開くと『Laravel 5』と表示されました。 :raised_hands: 

長くなっちゃったので、続きは別で。
terraform で 各 Iaas の仮想インスタンスを作成 (DigitalOcean)

# 概要
terraform で各 IaaS ベンダーの仮想マシンを作成する

今回は DigitalOcean のベースとなる tf ファイルを作成

対象ベンダー
- [Microsoft Azure](http://qiita.com/quickguard/items/e6a740baa0de0f35d877)
- Google Cloud
- DigitalOsean
- [CloudStack](http://qiita.com/quickguard/items/7d1f8e6eee3ea21f289e)

※AWSは今更なので割愛


#事前準備
- まずは[サインアップ](https://cloud.digitalocean.com/registrations/new)
- 上メニューの [API] リンクより、token を作成 
- SSH公開鍵(id_rsa.pub)を tf ファイルと同じ場所に設置

#手順
tf ファイルを作成

```:provider.tf
provider "digitalocean" {
  token = "${var.token}"
}
```

```:ssh_key.tf
resource "digitalocean_ssh_key" "default" {
    name = "default"
    public_key = "${file("id_rsa.pub")}"
}
```

```:floating_ip.tf
resource "digitalocean_floating_ip" "default" {
    droplet_id = "${digitalocean_droplet.default.id}"
    region = "${digitalocean_droplet.default.region}"
}
```

```:droplet.tf
resource "digitalocean_droplet" "default" {
  region = "${var.region}"
  name = "${var.droplet_name}"
  image = "${var.image}"
  size = "${var.size}"
  private_networking = true
  ssh_keys = ["${digitalocean_ssh_key.default.id}"]
}

```

```:domain.tf
resource "digitalocean_domain" "default" {
    name = "${var.domain_name}"
    ip_address = "${digitalocean_floating_ip.default.ip_address}"
}

resource "digitalocean_record" "default" {
    domain = "${digitalocean_domain.default.name}"
    type = "A"
    name = "${var.subdomain}"
    value = "${digitalocean_floating_ip.default.ip_address}"
}
```

```output.tf
output "digitalocean_floating_ip_address" {
  value = "${digitalocean_floating_ip.default.ip_address}"
}
```

```variables.tf
variable "token" {}
variable "region" {
  default = "sgp1"
}
variable "droplet_name" {}
variable "image" {}
variable "size" {}
variable "domain_name" {}
variable "subdomain" {}
```

tfvars は以下の通り

```:terraform.tfvars
## token
token = "**********************"

## droplet
region = "sgp1"
droplet_name = "********"
image = "centos-6-5-x64"
size = "512mb"

## domain
domain_name = "example.com"
subdomain = "www"
```

#結果
```
$ terraform apply

Outputs:

  digitalocean_floating_ip_address = ***.***.***.***
```

**作成されたリソース**

```
$ terraform graph | dot -Tpng > graph.png
```

![graph.png](https://qiita-image-store.s3.amazonaws.com/0/105824/842ea6c1-f1b7-cbbe-0c8a-7d77a8147ca6.png)
laravel4、5で、app.debugによって、DEBUGログを出力するかどうかの制御をする

api見たらすぐわかると思いますが、apiを見ずにソースコードを漁って解決した自分のような人のために。

## app.debugがfalseでもログレベルがDEBUGのログが普通にファイル出力される

laravel4も5もですが、てっきりapp.phpのdebugをfalseにしてればDEBUGログは出力されないものだろうと思ってたんですが、普通に出力されるんですね、っていう。

なので、自前でapp.debugがfalseの場合はinfo以上のログのみ出力するようにしました。

こんな感じで。

```app/start/global.php
Log::useFiles(storage_path(). '/logs/laravel.log');
```

これを

```app/start/global.php
$is_debug = Config::get('app.debug');

// debugがfalseの環境ではログレベルinfo以上しか出力しない
if ($is_debug) {
    // debugがtrueなら今まで通り
    Log::useFiles(storage_path() . '/logs/laravel.log');
} else {
    // debugがfalseならinfo以上
    Log::useFiles(storage_path() . '/logs/laravel.log', 'info');
}
```

こんな感じに変更。
DEBUGログが出なくなりました。
Windowsに誰かがログオンしたらそのユーザ名をメールで送信する

わりと機密度が高いＰＣがあってそこに誰かがログインしたらメールで教えてほしいときに、
以下の手順でメールを送信する。

- powershellでメールを送信する
- タスクスケジューラでタスクを作成する

# powershellでメールを送信する


以下を参照しました。
http://www.atmarkit.co.jp/ait/articles/1407/01/news018.html

```param($msgTo,$msgSubject,$msgBody)
#SMTPサーバーの設定
$smtpHost = "ホストorIP"
$msgFrom = "送信元アドレス"
$accountName = "メールアカウントユーザ名"
$accountPass = "メールアカウントパスワード"
$smtpPort = 587	  #SMTPポート番号
$smtpSSL = $false	  #SSL暗号化（$trueまたは$false）
#SMTPクライアントの設定
$objEmail = new-object System.Net.Mail.SmtpClient
$objEmail.Host = $smtpHost
$objEmail.Port = $smtpPort
$objEmail.EnableSSL = $smtpSSL
$objEmail.Credentials = New-Object Net.NetworkCredential
$objEmail.Credentials.UserName = $accountName
$objEmail.Credentials.Password = $accountPass
#メッセージ送信
$objEmail.Send($msgFrom,$msgTo,$msgSubject,$msgBody)
```
このスクリプトをsndmsg.ps1としてc:\scriptsに保存しました。

次にこのスクリプトでメール送信できるか確認します。

powershellを起動します。
```c:\scripts\sndmsg.ps1 -msgTo '送り先' -msgSubject '件名' -msgBody '本文'```

エラーなくスクリプトが終了すれば送信できているはずです。

# タスクスケジューラでタスクを作成する

## 新しいタスクの作成

![1.png](https://qiita-image-store.s3.amazonaws.com/0/35364/1d10cb9b-d7b7-3f05-617f-2793b9897f68.png)

### 「全般」タブ
- 名前に適切な文字列を入力
- 「セキュリティオプション」の「ユーザーがログオンしているかどうかにかかわらず実行する」をオンする
![2.png](https://qiita-image-store.s3.amazonaws.com/0/35364/bd8840ac-948e-3908-4dc8-4b2eaf22e6bd.png)

### 「トリガー」タブ
- 「新規」ボタンをクリック
- 「タスクの開始」を「ログオン時」に変更

![3.png](https://qiita-image-store.s3.amazonaws.com/0/35364/76046f9a-f65b-0630-8edf-d7d9bcf4b869.png)


### 「操作」タブ
- 「新規」ボタンをクリック
- 「操作」を「プログラムの開始」に変更
- 「プログラム/スクリプト」に```powershell.exe```
- 「引数の追加」に
```
-Command "c:\scripts\sndmsg.ps1 -msgTo '送り先メールアドレス' -msgSubject '題名' -msgBody '本文'"
```
- 送り先メールアドレス、題名、本文は適切に書き換えてください

![4.png](https://qiita-image-store.s3.amazonaws.com/0/35364/213909e4-7997-e6f2-fd4d-ce46e86d059d.png)


### 「条件」タブ
![5.png](https://qiita-image-store.s3.amazonaws.com/0/35364/17b7d5c5-480c-6628-11ae-da62763d94fd.png)

### 「設定」タブ
![6.png](https://qiita-image-store.s3.amazonaws.com/0/35364/dc2b5d37-a34c-140e-0f30-b426a1e70fbc.png)

***
以上で誰かがＰＣにログオンしたことをメールで知らせてくれます。
IEでtableのborderが消えた話

# IEでtableのborderが消えた話

## 症状

- table の td ないし th にbackground-color と border を一緒に設定すると、borderが見えなくなる。
- しかし開発者ツールなどでbackground-colorを消してやるとborderが見えるようになる

### 参考コード

```html:html
<table>
	<tbody>
		<tr>
			<th>見出し1</th>
			<th>見出し2</th>
		</tr>
		<tr>
			<td>内容1</td>
			<td>内容2</td>
		</tr>
	</tbody>
</table>
```

```scss:sample.scss(SCSS記法)
tr {
	th {
		background-color: #f00;
		border: 1px solid #000;
		color: #fff;
	}
	td {
		border: 1px solid #000;
	}
}

```

## 確認機種
- IE9 - 11。
- Firefox47(情報提供ありがとうございます！)

## 解決策

- td ないし th に position: relative;がかかってないかを確認する。
- かかってたら無効化すると治る。


別担当が ``*{position: relative;}`` とかやってくれてたおかげで引き起こされたようでした。
他の人に迷惑かけちゃダメ絶対。

参考：http://stackoverflow.com/questions/31030579/css-background-color-overlapses-with-border-on-table-cell-in-ie
PHPポイントフリースタイル入門

参考：http://d.hatena.ne.jp/melpon/20111031/1320024473

例えば

```php
class X {}
class Y {}
class Z {}
class ZA {}

function f0(Y $b){ return new Z; }
function g0(X $a){ return new Y; }
function foo($x){ return f0(g0($x)); }
var_dump(foo(new X));
```

こういう foo 関数があったとして、foo(\$x) の \$x をポイントと言い、ここで \$x を除いてプログラミングすることをHaskellではポイントフリースタイルと言うらしいです。


素のPHPではどう頑張っても$xを消せないので、 https://github.com/nishimura/laiz-monad を取得して f と g をカリー化します。

```php
require 'vendor/autoload.php';
Laiz\Monad\Func::importUtil();

function f1(...$args){
    return f(function(Y $b){
        return new Z;
    }, ...$args);
}
function g1(...$args){
    return f(function(X $a){
        return new Y;
    }, ...$args);
}
function foo1($x){ return f1(g1($x)); }
var_dump(foo1(new X));
```

これで準備が整いました。
PHPでは演算子を定義できないので、ドットの代わりにcompose関数を使います。

```php

function foo1_(){ return f1()->compose(g1()); }
$foo1 = foo1_();
var_dump($foo1(new X));
```

簡単ですね！



参考URLの問題１に行きましょう。

```php
function f2(...$args){
    return f(function(Z $z){
        return new ZA;
    }, ...$args);
}
function g2(...$args){
    return f(function(X $x, Y $y){
        return new Z;
    }, ...$args);
}

function foo2 ($x, $y){ return f2(g2($x, $y)); }
var_dump(foo2(new X, new Y));
```

Haskellでは

```hs
foo = (f.).g
```

こう書くらしいです。
PHPでは

```php
function foo2_($x){ return f2()->compose(g2($x)); }
$foo2 = foo2_(new X);
var_dump($foo2(new Y));

function foo2__(){ return f2()->compose()->compose(g2()); }
$foo2 = foo2__();
var_dump($foo2(new X, new Y));
```

こうです。文法の差が大きいですね。

flipも使ってみましょう。
問題３です。

Haskellでの (. flip) ができないので作ります。

```php
function compose(...$args){
    return f(function($b, $a){
        return $a->compose($b);
    }, ...$args);
}
```

あとはこれを使って

```php
function f3(...$args){
    return f(function(Z $z, Y $y, X $x){
        return new ZA;
    }, ...$args);
}
function foo3($x, $y, $z){ return f3($z, $y, $x); }
var_dump(foo3(new X, new Y, new Z));


function foo3_(){ return compose(flip(f3()))->compose(flip(flip())); }
$foo3 = foo3_();
var_dump($foo3(new X, new Y, new Z));
```

いい感じになりましたね！
laravel5のroutes.phpにwhere(['id' => '[0-9]+')って延々書きたくない時の備忘録

laravel5で、routes.phpにwhereを書きまくってて、これまとめられないかな？ってなったときに調べるのに手間取ったので、備忘としてまとめておく。

``` routes.php
// こういうやつ
Route::get('/hoge/{id}/', 'HogehogeController@index')
         ->where(['id' => '[0-9]+']);
Route::get('/hoge2/{id}/', 'HogehogeController@index2')
         ->where(['id' => '[0-9]+']);
Route::get('/hoge3/{id}/', 'HogehogeController@index3')
         ->where(['id' => '[0-9]+']);
```

## 同じkeyのパラメータならまとめられる

app/Providers/RouteServiceProvider.phpでまとめることが可能。

``` RouteServiceProvider.php

// このメソッドに追記
public function boot(Router $router) {
    // こんな感じでwhereの内容を追記
    $router->pattern('id', '[0-9]+');

    parent::boot($router);
}
```
巡回冗長検査(CRC)のよくある実装の説明

巡回冗長検査(CRC)
===============

計算方法
-------

### 一言でいうと

特殊な剰余。

### 2進数のわり算

2進数のわり算の余りを考えてみよう。たとえば10011010 / 1010を考える。まずはじめの4ビット1001は1010より小さい。次の1ビットを追加して10011から1010を引く。結果は1001となる。次の1ビットを追加して10010から1010を引く。すると1000となる。同様に10001から1010を引いて111、さらに1110から1010を引いて100となる。

これは10進数で考えると154 / 10のあまりが4ということだ。

### 引き算のかわりにxorを

2進数での計算では「1ビットずらして引き算」をくりかえしていた。この「引き算」をxorとしてみよう。

上の例の10011010 / 1010では以下のようになる。1001と1010のxorで0011となる。2ビットずらして1110と1010のxorで0100となる。1ビットずらして1001と1010のxorで0011となる。1ビットずらして110が答えとなる。

        10011010
    xor 1010
    ------------
        00111010
    xor   1010
    ------------
        00010010
    xor    1010
    ------------
        00000110

この計算をmodulo 2と呼ぶ。

すなおな実装
-----------

modulo 2の計算のすすめかたは以下のようになる。

1. わられる数の1となっている最上位のビットを探す
2. そのビットとわる数の最上位ビットの位置をあわせる
3. わられる数とわる数のそれぞれのビットについてxorをしたものでわられる数を更新
4. わる数とわられる数の最下位ビットの位置があっていれば終了
5. そうでなければ1へもどる

わる数の最上位ビットはいらない
---------------------------

わる数の最上位ビットは1だ。そしてxorをするときには必ずわられる数の対応する位置のビットも1だ。つまりxorした結果その位置のビットは必ず0となる。よってxorする必要はなく単に捨ててしまえば良い。これを考慮すると計算のしかたは以下のようになる。

ここでは「わる数'」を今まで考えてきた「わる数」の最上位ビットを捨てたものとする。

1. わられる数を最上位ビットbとその残りrにわける
2. bが0ならばrをわられる数とする
3. bが1ならばrとわる数'とを先頭をあわせてxorしたものをわられる数とする
4. 最下位ビットの位置がそろっていればわられる数を結果とする
5. そうでなければ1へもどる

### 持ちまわる値を小さく

実用的には「わられる数」は非常に大きな値となる。これを状態として持ちまわるのは非効率的だ。持ちまわる必要があるのは実際にはわる数'がnビットであるならば「わられる数」のうち先頭nビットだけでいい。「わられる数」の残りは必要に応じて読みこんでいく。

1. 先頭nビットを読みこむ
2. 先頭nビットを最上位ビットbと残りrにわける
3. わられる数から1ビット読みこみ残りrの最下位に追加しsとする
    1. ただし、読みこめなければ先頭nビットが結果となる
4. bが0ならばsを新しい先頭nビットとする
5. bが1ならばsとわる数'をxorしたものを新しい先頭nビットとする
6. 2へもどる

テーブルを使う
------------

わる数'がnビットであり、わられる数をたとえば8ビットずつ読みこむとする。8ビット読みこんだところでわかるのは続くnビットがこの8ビットに対する操作によってどう変換されるか、だ。テーブルを作成するために0から255の256通りの8ビット値eに対して続くnビットに対して何をxorすることになるかを求める必要がある。続くnビットに対してxorする値をtとする。

1. はじめにtにeを代入する
2. 3から6を8回くりかえす
3. tを最上位ビットbと残りrにわける
4. rを左シフトする
5. bが0ならばrをtとする
6. bが1ならばrとわる数'とをxorしてtとする

テーブルが作れたら以下のようにする。

1. 8ビット読みだす
2. テーブルから対応する値を読みこみtに代入
3. tを先頭8ビットeと残りrにわける
4. rを8ビット左シフトする
5. 8ビット読みだしeとのxorをとりe'とする
6. e'に対応する値をテーブルから読みこみsとする
7. sとrとをxorしtに代入する
8. 3へもどる

上記では終了条件が省略されている。今までの計算と同じ結果とするにはわられる数の残りがnビットになった時点でtとその残りとをxorすることになる。

わられる数の末尾にnビットの0を追加
------------------------------

上記の終了条件よりも「読みこめなくなった時点でtを結果とする」のほうがコードがシンプルになる。このようにすると意味的にはわられる数の末尾にnビットの0を追加したのと同じことになる。

先頭nビットを補数にする
--------------------

上記の手続きは以下のように単純化することができる。

1. tに0を代入する
2. tを先頭8ビットeと残りrにわける
3. rを8ビット左シフトする
4. 8ビット読みだしeとのxorをとりe'とする
5. e'に対応する値をテーブルから読みこみsとする
6. sとrとをxorしtに代入する
7. 2へもどる

ここでtの初期値を0ではなく2 ^ n - 1(つまりすべてのビットが1)とする。そうするとわられる数の先頭の0の個数によってチェックサムが変わってくる。データの先頭に0が追加または削除されてしまうといったエラーを検出可能となる。

この操作は数学的な意味としてはわられる数の先頭のnビットのそれぞれのビット値を反転(0 -> 1, 1 -> 0)するということになる。

リトルエンディアン
----------------

実際のCRCはリトルエンディアンで実装しやすい規格になっている。つまり今までは最上位ビットから計算していたのを、最下位ビットから順に計算していくようにすれば良い。
ReactiveExtensionsでstreamを分割する

**この記事は[モバイルファクトリー Advent Calendar](http://qiita.com/advent-calendar/2015/mobilefactory) 22日目の記事です。**

昨日は@morigamixさんの[Material Designに従ってリスト周りのUIを考えてみた](http://qiita.com/morigamix/items/4233e8be4ed344bd163a)でした。

今日は@yashims85がお送りします。

# 前提
* RxJavaとKotlinを使って今回はお話させて頂きます。

# 突然ですが問題です
```kotlin
val subject = PublishSubject.create<Int>()
val stream = subject.doOnNext {
    Log.d("yashims85", "value ${it.toString()} on stream")
}
stream.filter({ it > 10 }).subscribe {
    Log.d("yashims85", "${it.toString()} is bigger then 10")
}
stream.filter({ it % 4 == 0 }).subscribe {
    Log.d("yashims85", "${it.toString()} surplus 4 is zero")
}
subject.onNext(12)
```

上記のコードからは共通のstreamを
* メッセージが10より大きければ流れるstream
* メッセージが4で割り切れたら流れるstream

の2つに分割したい意図が感じ取れますが、共通部分の`value 12 on stream`は何回出力されるでしょうか？

## 答え
```logs:結果
12-22 14:39:39.654 22766-22766/? D/yashims85: value 12 on stream
12-22 14:39:39.654 22766-22766/? D/yashims85: 12 is bigger then 10
12-22 14:39:39.654 22766-22766/? D/yashims85: value 12 on stream
12-22 14:39:39.654 22766-22766/? D/yashims85: 12 surplus 4 is zero
```

というわけで2回出力されてしましました。これはobservableのチェーンがsubscribe毎に作られるためです。

しかし、本来は共通部分は1回だけ処理して欲しところですね。。。

そんな時役立つのが、Observable.share()です。

# Observable.share

上流のObservableをHot変換し、上流から来たデータを流す別のObservableを下流に提供します。
また、shareで生成されたObservableをObserveする人がいなくなると、上流のObserveも停止します。

つまりは、share()の戻り値のObservableは上流のObservableとは別物なので、streamを共通化出来ます。

# 試してみよう
## share()を追加してみる
```kotlin
val subject = PublishSubject.create<Int>()
val stream = subject.doOnNext {
    Log.d("yashims85", "value ${it.toString()} on stream")
}.share()
stream.filter({ it > 10 }).subscribe {
    Log.d("yashims85", "${it.toString()} is bigger then 10")
}
stream.filter({ it % 4 == 0 }).subscribe {
    Log.d("yashims85", "${it.toString()} surplus 4 is zero")
}
subject.onNext(12)
```

最初のコードのdoOnNextの後にshare()を追加しただけです。
さて、結果はどうなるでしょうか？

```logs:結果
12-22 14:52:04.414 9325-9325/? D/yashims85: value 12 on stream
12-22 14:52:04.414 9325-9325/? D/yashims85: 12 is bigger then 10
12-22 14:52:04.414 9325-9325/? D/yashims85: 12 surplus 4 is zero
```

はい！共通化できました！

# まとめ
streamを分割したい時はshareするとよい。

明日の担当は、採用担当でジンジニアの二つ名を持つjinjineerさんです。わたし気になります！
エフェクト作成ツール「Effekseer」の魅力

この記事は[Effekseer Advent Calender](http://www.adventar.org/calendars/927)の22日目です！
エフェクトや演出アニメーションを試しに作ってみたいという人に向けて、[エフェクト制作ツール「Effekseer」](http://effekseer.github.io/jp/index.html)の魅力をお伝えします。(エフェクシアーと読むらしいです。) Effekseerで作成したエフェクトは、Unityに読み込んで使用したり、連番画像ファイルに出力することでWebGLやFlash等にも利用できます。

[![effects.png](https://qiita-image-store.s3.amazonaws.com/0/16944/1f34e62c-ab1a-c375-47be-42517cd0d1f4.png)](http://effekseer.github.io/jp/index.html)
こんなエフェクトが作れます。

# Effekseerの魅力

## その1：起動が軽い
試そうと思い立ってから、エディターをダウンロードして起動するまでが早い :sparkles: 

高機能なゲームエンジンを試そうとすると、最初にどうしてもダウンロードに時間がかかってしまいます。
(数GBのダウンロードとインストール、場合によってはサインアップなども必要)

その点、Effekseerでは最初にダウンロードする容量が10MBのZIPファイルのみです :exclamation:
(※サンプルファイルが含まれているので実行ファイルはさらに小さい容量です)
思い立ったらすぐに始められるところは大きな魅力だと思います。

## その2：無料
最近では基本無料のエディターが増えてきましたが、ちょっと試してみたいという人には大きな魅力だと思います。

## その3：サポートが早い
公式Twitter([@Effekseer](https://twitter.com/Effekseer))に直接聞いてみたり、[ユーザー掲示板](http://effekseer.sakura.ne.jp/bbs/patio.cgi)に投稿するとわりとすぐにお返事をいただけます。
- [公式Twitterアカウント](https://twitter.com/Effekseer)
- [ユーザー掲示板](http://effekseer.sakura.ne.jp/bbs/patio.cgi)

## その4：作った作品をすぐにSNSにシェアできる
GIFアニメ録画機能などを使うと作ったエフェクトを録画できます。
何かエフェクトを作ったらぜひツイートしてみてください。公式TwitterがRTしてくれるはずです :sunglasses: 


## その5：更新が活発で今後のアップデートが楽しみ
こんな機能が欲しいと思ったら公式Twitterアカウントにツイートしてみましょう。多くの要望が集まれば次回のバージョンアップに取り入れてくれるでしょう。

# デモ動画(YouTube)
[![Effekseerツールデモ1 (0.502)](http://img.youtube.com/vi/51LtnZgVzA4/0.jpg)](http://www.youtube.com/watch?v=51LtnZgVzA4)
[Effekseerツールデモ1 (0.502)](https://www.youtube.com/watch?v=51LtnZgVzA4) (YouTube)

[![マグマエフェクト](http://img.youtube.com/vi/PYAHXZqjGJE/0.jpg)](http://www.youtube.com/watch?v=PYAHXZqjGJE)
[マグマエフェクト](https://www.youtube.com/watch?v=PYAHXZqjGJE) (YouTube)

[![乱れ斬りエフェクト](http://img.youtube.com/vi/Em7ww9vdK2k/0.jpg)](http://www.youtube.com/watch?v=Em7ww9vdK2k)
[乱れ斬りエフェクト](https://www.youtube.com/watch?v=Em7ww9vdK2k) (YouTube)

[![吹雪エフェクト](http://img.youtube.com/vi/qr7xCzSt2KU/0.jpg)](http://www.youtube.com/watch?v=qr7xCzSt2KU)
[吹雪エフェクト](https://www.youtube.com/watch?v=qr7xCzSt2KU) (YouTube)

やってみようかなと思った方はこちらからどうぞ :santa: 
※今のところWindowsのみのサポートですが、Macにも対応できる見込みはあるそうです。
- [公式サイト エフェクト制作ツール「Effekseer」](http://effekseer.github.io/jp/index.html)
[![150818_effect_logo.png](https://qiita-image-store.s3.amazonaws.com/0/16944/a9bb3959-6b42-9753-7b15-5c28636c9f34.png)](http://effekseer.github.io/jp/index.html)

## エフェクトのチュートリアル集
- [UVスクロールを使ったマグマエフェクトの作成](https://ics.media/entry/8674)
- [リング描画を使った乱れ斬りエフェクトの作成](https://ics.media/entry/9270)
- [Fカーブを使った吹雪エフェクトの作成](https://ics.media/entry/10377)
NullクライアントのPostfix環境の作成

#概要
Postfixでメール送信が出来るまでの環境設定を記します。Nullクライアントとは送信だけしかせず，受信や中継を行わないSMTPサーバーのことです。
#環境
OS: Amazon Linux AMI release 2015.09
Postfix: 2.6.6
#手順
これらの作業はすべてrootで行う必要がある。

```bash
$ sudo -s
```

1.SendMailのアンインストール
デフォルトでインストールされているSendMailは利用しないため，アンインストールする。

```bash
$ service sendmail stop
$ chkconfig sendmail off
$ yum remove sendmail
```

2.Postfixのインストール

```bash
$ yum install postfix
$ chkconfig postfix on
$ alternatives --config mta    #choose postfix
$ vi /etc/postfix/main.cf
```
```bash:/etc/postfix/main.cf
+ myhostname = your.hostname
+ mydomain = your.domain
+ myorigin = $myhostname
+ inet_interfaces = localhost
+ inet_protocols = IPv4
- mydestination = $myhostname, localhost.$mydomain, localhost
+ mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
+ home_mailbox = Maindir/

+ smtpd_banner = $myhostname ESMTP unknown
+ smtpd_sasl_auth_enable = yes
+ smtpd_sasl_local_domain = your.domain
+ smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination
```

```bash
$ service postfix start
```
3.SASL認証の有効化
SASL認証を有効にすることで，サーバーを踏み台にされてスパムメールを送信されたりすることを防ぐことが出来ます。ここではCyrus SASLパッケージを利用します。

```bash
$ yum install cyrus-sasl*
$ chkconfig saslauthd on
$ vi /etc/sasl2/smtp.conf    #old version: /usr/libb64/sasl2/smtp.conf
```
```bash:/etc/sasl2/smtp.conf
- pwcheck_method: saslauthd
+ pwcheck_method: auxprop
```
```bash
$ saslpasswd2 -c -u your.domain your.username
```
your.domainは認証を行うメールサーバー名で，postfixで設定したsmtpd_sasl_local_domainと一致する必要があります。your.usernameは自由に決定することが出来ます。

4.その他
もし，ドメイン名を取得しているのであれば，/etc/hostsに追記するのも忘れずに。

```bash
$vi /etc/hosts
```
```bash:/etc/hosts
- 127.0.0.1 localhost localhost.localdomain
+ 127.0.0.1 localhost localhost.localdomain your.domain
```

#Send Policy Framework への対応（追記予定）
上記の設定でも良いのですが、他の人に送る場合、PCメールは迷惑メールフォルダに入ってしまいます。
迷惑メールフォルダに入るだけなら、 送信者に迷惑メールフォルダも確認するように注意を促せばいいのですが、携帯のメールアドレスに送る場合はなりすまし規制が厳しいので弾かれてしまい、メールが届かない場合があります。しかも、弾くのは携帯キャリア側なので、送る側のメールログを見ても正常に送信できていることがあるので事象を把握するのが難しいです。
そのまますんなり受信してくれればありがたいのですが、近年増加するスパムメールやなりすましメールのせいでメール事業者や携帯キャリアも対策を取らざるを得ないのです。まったく迷惑な話です。
では、どう対策するかというと、SPF(Sender Policy Framework)を利用します。
これは、メールの送信元アドレスの偽装を防ぐ技術で、つまり「あるドメインから送られてきたメールがちゃんとしたところから送られてきたかを判断する技術」です。このSPFを利用することで、正しい(差出人を偽装していない)メールを送ることができ、なりすまし規制などにも対策することができます。
実際にSPFを利用したメール送信ができるようにしていきます。
https://ja.wikipedia.org/wiki/Sender_Policy_Framework
http://d.hatena.ne.jp/rx7/20100319/p1
http://blog.jicoman.info/2013/08/postfix_spf_record

#参考文献
- http://www.postfix-jp.info/trans-2.2/jhtml/STANDARD_CONFIGURATION_README.html
- http://www.1x1.jp/blog/2012/10/postfix_and_cyrus_sasl2_stmp_auth.html
- http://www.hi-ho.ne.jp/~takahachi/computer/open/5postfix.html
IDが重複してもページ内ジャンプできるようにする方法

HTML上に複数の同じようなコンテンツを置かざるを得ないケースに遭遇することってたまにあると思います。

たとえば

- PCとスマホのコンテンツを同一ページ別DOMで用意するとき
- 多言語のコンテンツを同一ページに複数DOMで用意するとき
- テンプレートを作って中身を変えずにクローンしまくるとき

本来サーバーサイドで出し分けるべきものの場合が多いですが、
訳あってフロントサイドしか触れないなど、やむを得ないケースはあるかと思われます。

そして、何かの手違いだったりやむを得ない事情で、IDも一緒にコピーしてしまうことがあるかと思われます。
要素のIDは重複してはならないのがルールですが、
実はCSSやJavaScriptではある程度許容されているような動作をします（おそらく仕様にない挙動ですので濫用はしないように）。


## 複数IDのフィルタリング

```html:sample.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>has duplicated</title>
  <style>
.env-1 {
  display: none;
}
  </style>
</head>
<body>
  <a href="#p1"></a>
  <a href="#p2"></a>
  <div class="env-1">
    <p id="p1">この親のdivはPCだとか。</p>
    <p id="p2">この親のdivはenだとか。</p>
  </div>
  <div class="env-2">
    <p id="p1">この親のdivはSPだとか。</p>
    <p id="p2">この親のdivはjaだとか</p>
  </div>

  <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
</body>
</html>
```

このHTMLの2番目の``<p id="p1">``を取得する方法をいくつか。（※要jQuery）

↓こういうのは無理です。

```
$('.env-2#p')
```

↓これなら大丈夫みたいです。

```
$('.env-2').find('#p2');
```

↓これなら大丈夫（重複しているIDの2番目）

```
$('[id="p2"]').eq(1)
```

↓これでも大丈夫（重複しているIDの最後）

```
$('[id="p2"]').eq(-1)
```

↓これが実用的（DOMの可視／不可視をまるごと切り替えてるとき）

```
$('[id="p2"]:visible')
```


## ページ内ジャンプの実装

最後の``:visible``セレクタを用い、見えている方のIDの元へ飛んでいってくれるページ内ジャンプを書いてみました。

```js:internal_link_with_duplicate_id.js
$('a[href^=#]').on('click', function() {
    var targetId = $(this).attr('href').slice(1);
    var selector = targetId ? '[id="' + targetId + '"]:visible' : 'html';
    var $target = $(selector);
    
    var dist = $target.offset().top;

    $('html, body').animate({scrollTop: dist});
});
```

デモ:
[ID重複ページ内リンク - jsdo.it](http://jsdo.it/butchi/QRKo)


## 補足

このように、属性セレクタ等を用いて重複したIDを取得できることがわかりましたが、
重ね重ねIDの重複はHTMLとしてはinvalidのため、出来る限り別IDにするか、クラスやデータ属性を使って回避しましょう。
（僕は基本的に実務でのIDの使用は極力避けてます。）

ちなみに、IDの重複チェッカーを作ったので、Validatorに通す前に軽くチェックするフローを挟むなど活用して頂ければ幸いです。
[JavaScript - DOM上のIDの重複を検出する - Qiita](http://qiita.com/butchi_y/items/8e1312a47826e5ca95a2)
Laravel5にcomposerでchromephp入れたら捗った

便利だと聞いたのでchromephp入れてみよう！ってなって、laravel5に入れた話です。

結論、超簡単に入れられた！

composer.jsonに

```composer.json
{
    "require": {
        "laravel/framework": "5.1.*",
        "ccampbell/chromephp": "4.1.0"
    }
}
```

って書いてcomposer upして、
使いたいクラスで、

```hoge.php
use ChromePhp;

function hoge() {
    ChromePhp.log([1, 2, 3]);
}
```

とするだけでした。
S3アクセスコントロール

S3に対するアクセス制限方法についてまとめました。


# 今回の環境について
S3バケット名は、「hogefuga」として説明させて頂きます。


# 1.特定S3バケットの中身を、全てのユーザーに見せる
下記の設定をする事により、hogefugaのS3バケット内にあるものは全て外部から見る事ができます。
S3バケットのWebホスティングを有効にしている場合などで利用します。

```
{
	"Version": "2012-10-17",
	"Id": "Policy1450760425940",
	"Statement": [
		{
			"Sid": "Stmt1450760424377",
			"Effect": "Allow",
			"Principal": {
				"AWS": "*"
			},
			"Action": "s3:GetObject",
			"Resource": [
				"arn:aws:s3:::hogefuga/*"
			]
		}
	]
}
```
主要な項目について説明します。
＜Effect＞
　許可・拒否するかをここで指定します。
　今回はAllowなので、続くPrincipal・Action・Resourceで指定した行為を許可します。
　拒否する場合は、Allowの代わりにDenyを記述します。
＜Principal＞
　アクセス許可・拒否したい対象。
＜Action＞
　S3に対して許可・拒否するアクション。
＜Resource＞
　アクセス許可・拒否させたいS3バケット。


# 2.特定の階層にあるフォルダ以下にあるファイルを、全てのユーザーに見せる
「1」ではS3バケット以下を指定しましたが、下記のようにS3バケット内にあるフォルダを指定してアクセス許可させることもできます。

```
{
    "Version": "2012-10-17",
    "Id": "Policy1450760425940",
    "Statement": [
        {
            "Sid": "Stmt1450760424377",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::hogefuga/folder/*"
            ]
        }
    ]
}
```


# 3.IPアドレス制限を掛けてみる
特定の拠点にいる人からのみ、S3バケットを閲覧する事ができます。
aws:SourceIpにアクセスさせたい拠点のIPを記入します。

```
{
	"Version": "2012-10-17",
	"Id": "Policy1450760425940",
	"Statement": [
		{
			"Sid": "Stmt1450760424377",
			"Effect": "Allow",
			"Principal": {
				"AWS": "*"
			},
			"Action": "s3:GetObject",
			"Resource": [
				"arn:aws:s3:::hogefuga/*"
			],
			"Condition": {
				"IpAddress": {
					"aws:SourceIp": [
						"52.XX.XX.XX/32",
						"52.XX.XX.XX/32"
					]
				}
			}
		}
	]
}
```

逆にアクセス拒否したい拠点を記入することも出来ます。

```
{
	"Version": "2012-10-17",
	"Id": "Policy1450760425940",
	"Statement": [
		{
			"Sid": "Stmt1450760424377",
			"Effect": "Allow",
			"Principal": {
				"AWS": "*"
			},
			"Action": "s3:GetObject",
			"Resource": [
				"arn:aws:s3:::hogefuga/*"
			],
			"Condition": {
				"NotIpAddress": {
					"aws:SourceIp": [
						"52.XX.XX.XX/32",
						"52.XX.XX.XX/32"
					]
				}
			}
		}
	]
}
```

# 4.応用

```
{
	"Version": "2012-10-17",
	"Id": "Policy1450760425940",
	"Statement": [
		{
			"Sid": "Stmt1450760424377",
			"Effect": "Deny",
			"Principal": {
				"AWS": "*"
			},
			"Action": "s3:GetObject",
			"Resource": [
				"arn:aws:s3:::hogefuga/*"
			],
			"Condition": {
				"IpAddress": {
					"aws:SourceIp": [
						"52.XX.XX.XX/32",
						"52.XX.XX.XX/32"
					]
				}
			}
		},
		{
			"Sid": "Stmt1450760424377",
			"Effect": "Allow",
			"Principal": {
				"AWS": "*"
			},
			"Action": "s3:GetObject",
			"Resource": [
				"arn:aws:s3:::hogefuga/folder/*"
			],
			"Condition": {
				"IpAddress": {
					"aws:SourceIp": [
						"52.XX.XX.XX/32",
						"52.XX.XX.XX/32"
					]
				}
			}
		}
	]
}
```

最初の"Effect": "Deny"から次の"aws:SourceIp"までで、hogefuga以下のデータにアクセスできないようにして
"Effect": "Allow"以降の記述で、hogefuga/folderにアクセスできるよう設定してます。

S3のバケットポリシーは、基本的に上から下に処理されていくようなので、アクセスさせたくないものを最初に書いておき、アクセスさせたいものは最後に書くと良いでしょう。
Dart x Flutter で作成したアプリを、Linux上で動作させてみた

Flutter x Dart を利用して複数のプラットフォームで動作するアプリを作成してみましょう。

今までに、Android 、 iOS で動作するアプリを作成しました。今回はLinux上で動作させて見たいと思います。


# Mojo上で動作させる
FlutterはMojoを利用しています。Mojo上で動作させる事ができます。
Mojoは、Linux上で動作するので、Mojo上で通せば、"Dart x Flutter" で作成したアプリのを、Linux上で動作させる事ができます。


# 試してみよう
## Mojoをビルドする。
今回試した手順では、Mojoをいちからビルドしました。

```
## Download and Setup depot_tools 
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
$ export PATH=pwd/depot_tools:"$PATH"

## Checkout Code
$ fetch mojo
$ cd src
$ sudo ./build/install-build-deps.sh
$ mojo/tools/mojob.py gn
$ ninja -C out/Release -j 10

## Test Mojo is making
$ out/Debug/mojo_shell mojo:spinning_cube
```

# Flutter をインストール
```
## 適当なフォルダー上で
$ git clone https://github.com/flutter/flutter.git .
$ export PATH=`pwd`/bin:$PATH
```

# Hello World アプリを生成
```
$ flutter init -o myapp
$ cd myapp
$ pub get
$ flutter build
```

# Mojo上で実行
```
$ flutter run_mojo --mojo-path <mojo build dir>/src/
```

![スクリーンショット 2015-12-22 13.28.46.png](https://qiita-image-store.s3.amazonaws.com/0/54192/5cb0a974-79d1-8858-0e01-fc1e7ebeeda0.png)


# ほそく
#### 公式
http://flutter.io/
https://github.com/domokit/mojo
https://dart-atom.github.io/dartlang/

#### Memo : Flutter x Dart 
kyorohiroがFlutterについて、学習した事を記載しているメモ
https://kyorohiro.gitbooks.io/hello_skyengine

#### Umiuni2D
http://kyorohiro.github.io/umiuni2d/web/index.html
https://github.com/kyorohiro/doc_2dgame


#### QiitaのFlutter 関連の記事
http://qiita.com/tags/Flutter


<br>
<br>

# 感想

"flutter ios" "flutter apk" コマンドは、実現されています。

"flutter mac" "flutter linux"とかも、できたらいいなぁ。　
https://github.com/flutter/flutter/blob/master/packages/flutter_tools/lib/src/build_configuration.dart


# Thanks!

![umiuni2d_demo_2.png](https://qiita-image-store.s3.amazonaws.com/0/54192/7f222229-4b76-657d-11b4-3c1ff588eb15.png)

最後まで、読んでいただきまして、ありがとうございました。
(ref http://pixiv.me/kyorohiro)
(ref https://play.google.com/store/apps/details?id=info.kyorohiro.umiuni2d.demo.mino)

<br>
<br>
-------
Kyorohiro Work
http://kyorohiro.strikingly.com/




作業に没頭したい時に聴いてるBGM

この記事は [作業用BGM(個人or社内) Advent Calendar 2015](http://qiita.com/advent-calendar/2015/bgm) の22日目です。

22日にこのアドベントカレンダーを見つけて、空いてる日が22日しか無い状態だったり、この記事がQiita初投稿だったり、なかなかアレな記事ですが作業用BGMについてボンヤリ書いていこうと思います。
少しでもご参考になれば。
# 会社で聞く曲

構想を練っている時と実作業をしている時とで聴く音楽が違うんですが
今回は実作業（プログラムとか）をやっている時によく聴くBGMを。
（邦楽を聴いてるとそちらに意識が集中してしまうので、基本的に洋楽中心です）

[Pentatonix-Full Album Set](https://www.youtube.com/watch?v=6rB86K5kKCg)
ステキ音楽をステキにカヴァーする集団、Pentatonix。
2時間以上の動画なので、長時間集中する時に。  

---

[Linkin Park-BestSongs 1hour](https://www.youtube.com/watch?v=O-I0NUAlOn0)
私見ですが「どこかで聴いた事はあるけど、誰かは知らなかった曲」が多め。
個人的に、作業用BGMとして大事な事は「耳馴染みはあるけど、そんなに知らない曲」という事が重要だと思っているので、Linkin Parkをあまり知らない人にオススメです。

---

[Andy Mckee](https://www.youtube.com/watch?v=RlDdzNuJto4&list=PL6BCF5CD098C06900)（MusicList）
異色のギター使い、Andy Mckee。
歌は無いので、インストが好みの方は是非。
[Drifting](https://www.youtube.com/watch?v=Ddn4MGaS3N4)がオススメです。

---

[1 hour of Jazz music - Relax and enjoy](https://www.youtube.com/watch?v=UsYrSrvhtpo)
ジャズとかあまり詳しくありませんが、なんとなくジャズの雰囲気に浸りながら仕事をしてると
**デキる気になったりする**ので、最近よく聞く曲の１つです。

---

[MOON サウンドトラック](http://www.nicovideo.jp/watch/sm597313)
昔好きだったゲームのサントラ。ラブデリック好きなら。

---

ジャンルが似たやつを省いたら５つになってしまった(ﾟдﾟ；)  
今回は実作業中によく聴く曲を上げましたが、構想を練っている時は日本語が耳に入っていた方がいろいろ思いついたりする事が多いので、あまり曲にこだわり無く聞いています。  
深夜ラジオなんか聞くのも良いかも知れませんね。


# オススメキーワード「1hour」
改めてYoutubeの履歴を見てみたら、結構な数の履歴に「**[1hour](https://www.youtube.com/results?search_query=1hour)**」とありました。  
文字通り１時間超の詰め合わせになっている物が多いので、作業用BGMとしては最適なんじゃないでしょうか。

# 異色系
音楽とは少し違いますが、[Rainy Cafe](http://rainycafe.com/)がオススメです。  
ただひたすら雨の音とカフェの音が聞こえるだけのWebServiceですが、本当に集中したい時なんかは重宝します。
それぞれの音量を調節できたりするので、お好みの設定を見つけてみてください。

# 家で聴く曲
家ではマキシマム ザ ホルモンくらいしか聴いてないので割愛。
みんなもホルモン聴こうよ。
apacheメモ

文法チェック

* httpd -t
    * 環境変数を読み込まない
* apachectl configtest
    * 環境変数を読み込む

再起動

* service httpd restart
    * プロセスを完全に停止してから再起動
* service httpd graceful
    * プロセスの通信が終わるのを待ってから設定を反映し httpd を起動
rotate photos based on exif orientation

```py3
from PIL import Image
import piexif

def rotate_img(img, rotate_param):
    e = piexif.load(img.info["exif"])
    e['0th'][274] = 1 # no rotate
    if rotate_param in [Image.ROTATE_90, Image.ROTATE_270]:
        e['Exif'][40962], e['Exif'][40963] \
            = e['Exif'][40963], e['Exif'][40962] # swap width, height

    img = img.transpose(rotate_param)
    output = BytesIO()
    img.save(output, 'JPEG', quality=90, exif=piexif.dump(e))
    length = output.tell()
    output.seek(0)
    return img, output, length

img = Image.open('file')
e = piexif.load(img.info["exif"])
if self.exif and 'Orientation' in self.exif:
    if self.exif['Orientation'] == 3:
        img, output, length = rotate_img(self, img, Image.ROTATE_180)
    elif self.exif['Orientation'] == 6:
        img, output, length = rotate_img(self, img, Image.ROTATE_270)
    elif self.exif['Orientation'] == 8:
        img, output, length = rotate_img(self, img, Image.ROTATE_90)
```
Amazon ECR使い方簡易版

## 追記
東京リージョンリリースされたので、追記
`s/us-east-1/ap-northeast-1/g`

リポジトリ作成
--
リポジトリ作るAPI調べる前に手で作っちゃった。下記ページでとりあえず、create repositryしちゃう。
https://console.aws.amazon.com/ecs/home?region=ap-northeast-1#/repositories


IAMで権限設定
--
IAMで権限降ってね `AmazonEC2ContainerRegistryFullAccess`

https://console.aws.amazon.com/iam/home?region=ap-northeast-1#home


awscliをアップデート
--


```
% pip install --upgrade awscli
```



docker-login
--
__docker-pushの時にログインを促されるから事前にやっとく__

```
% $(aws ecr get-login --region ap-northeast-1)
```


configファイルをからリポジトリ確認しましょう。

```
% cat ~/.docker/config.json
{
        "auths": {
                "https://1234567890.dkr.ecr.ap-northeast-1.amazonaws.com": {   <= これな！

```


あとはdocker-build & push！
---

```
# ECR_REPOSしっかり確認
export ECR_REPOS=1234567890.dkr.ecr.ap-northeast-1.amazonaws.com
export REPOS_NAME=my-app:latest
docker build -t $ECR_REPOS/$REPOS_NAME .
docker push $ECR_REPOS/$REPOS_NAME
```


メモ
----

こういうのが出たら、認証キーの有効期限が切れてるかも。

```
Error pushing to registry: Server error: unexpected 403 response status trying to initiate upload of ur-app
```

もっかいログインすればOK
```
$(aws ecr get-login --region ap-northeast-1)
```
ParaViewでCSVを読ませて連番アニメーションする

#TimeStep
TimeStepはParaViewで連番アニメーションをする基本的な機構です。

#基本的な表示のさせかた
http://qiita.com/noppefoxwolf/items/e2c98ab3e6550bf091d5
を参照してください。

#連番csvを読みこませる

* file_name.csv.0
* file_name.csv.1
* file_name.csv.2
* file_name.csv.3
* .....

のようなフォーマットのcsvを用意します。
それぞれ、csv.のあとの数値が時間の点になります。
それぞれのファイルはカラム名や種類は全てそろえておく必要があります。

ParaViewへ連番ファイルを複数選択し、ドラッグアンドドロップすると以下のようにfile_name.csv.*という表現でロードされます。
これで単一のファイル同様の処理ができるので、上記URLと同じようにTableToPointを指定します。

<img width="345" alt="スクリーンショット 2015-12-22 13.34.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/dc74f333-5fe6-58b7-cb47-217404f9fb11.png">

読み込み完了後、GUI上のコントロールパネルから動画のように再生停止を行う事ができます。
<img width="543" alt="スクリーンショット 2015-12-22 13.37.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/e408d4bf-89a7-0110-4caa-92d003c10caf.png">

#動作の様子

![sample.gif](https://qiita-image-store.s3.amazonaws.com/0/24979/06d9cf62-0ac2-d53b-9044-a7d651752f8c.gif)
単独IPでの複数VirtualHostの罠にはまる

#環境
CentOS6系
Apache2.2

#はじまり
リリース済みWebサービスの本番環境と同居する形で開発環境をVirtualHostで設定。
ふと思ってIPなど、Apacheに未定義の名称でサーバにブラウザアクセスした際に
開発環境が出てきちゃったから、さあ大変という話。

#調査方法
コンソールで以下を発行するとVirtalHostの設定が表示される

`$ httpd -S`

結果はこうなった。(hoge.comは当然仮)
なお、dev.が開発環境。e.が本番環境。www.は別の本番環境として読んでね。

```
$ httpd -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server dev.hoge.com (/etc/httpd/conf.d/dev.conf:15)
         port 80 namevhost dev.hoge.com (/etc/httpd/conf.d/dev.conf:15)
         port 80 namevhost e.hoge.com(/etc/httpd/conf.d/e.conf:15)
         port 80 namevhost www.hoge.com (/etc/httpd/conf.d/www.conf:15)
```

要は前述のような形でアクセスするとdefaultが真っ先に表示されるということ。

しかしこちらはdefaultとか切った覚えはないわけで…。

#httpd.confを見直そう
簡潔に結論だけ
Apache2.2ではデフォルトで

```conf/httpd.conf
Include conf.d/*.conf
```
という形でconf.d以下の.confファイルを全てIncludeする。
前述のdefaultは要するに一番最初にIncludeされたconfファイルに記載された
VirtualHostになってしまうとのこと。

で、conf.d以下のファイルがどういう順番でロードされるかですが

***d***ev.conf->***e***.conf->***w***ww.confと
…あっ(察し)

いや分かるけどさ…なんか釈然とせんわ。

#で、どうしたの?
とりあえず開発環境が表示されることは避けたかったので泥臭くいきました。

```
$mv dev.conf 03_dev.conf
$mv e.conf   02_e.conf
$mv www.conf 01_www.conf
$
$sudo service httpd restart
$
$ httpd -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server www.hoge.com (/etc/httpd/conf.d/01_www.conf:15)
         port 80 namevhost www.hoge.com (/etc/httpd/conf.d/01_www.conf:15)
         port 80 namevhost e.hoge.com (/etc/httpd/conf.d/02_e.conf:15)
         port 80 namevhost dev.hoge.com (/etc/httpd/conf.d/03_dev.conf:15)
```

こうして悪は滅びた…だがこれで良かったのだろうか……。