OmniAICreator/Qiita-1.07M huggingface dataset:
Sidekiqのキュー数が溢れたり死亡しまくってる場合にSlackに通知


Sidekiqのダッシュボードと同じ数値をRubyからチェックして異常値の場合、Slackに通知みたいなことをしたかった。
![スクリーンショット 2015-07-15 13.12.20.png](https://qiita-image-store.s3.amazonaws.com/0/8152/6ea439be-0dda-8d96-9ef2-5728a6d5d397.png)

とりあえず、こんな感じで通知させとく。

```rb
# 例）死亡が1以上、または待機状態が101以上でアラート
sidekiq_enqueued = sidekiq_stats(:enqueued)
sidekiq_dead = sidekiq_stats(:dead_size)
if sidekiq_enqueued > 100 || sidekiq_dead > 0
  # Slackへアラート
end

def sidekiq_stats(type)
  stats = Sidekiq::Stats.new
  case type
  when :enqueued # 待機状態
    return stats.enqueued
  when :retry_size # 再試行
    return stats.retry_size
  when :scheduled_size # 予定
    return stats.scheduled_size
  when :dead_size # 死亡
    return stats.dead_size
  end
end
```
Rails+Unifyでお手軽UIデザイン（お試し編）


# Unifyってなに？

Unifyはbootstrap3用のテンプレート（有料）です。レスポンシブで、幅広い用途をカバーしています。

https://wrapbootstrap.com/theme/unify-responsive-website-template-WB0412697

# railsから使う

ダウンロードしたUnifyを展開すると、HTML/assets下のcss,js,pluginsなどのフォルダに用途別のcssやjsがたくさん入っています。

まずは最低限のものを使ってみます。


## 置き場所


今回はrailsアプリのルートディレクトリ下のvendor/assetsにunify1.7というディレクトリをつくって、Unifyのassets下を配置。


## application.css

bootstrapとunify本体のcssを読み込むようにします。

```
*= require ../../../vendor/assets/unify1.7/plugins/bootstrap/css/bootstrap.min
*= require ../../../vendor/assets/unify1.7/css/style.css
```

## view

ためしにこんなslimを用意してみます。

```
.wrapper
  .content.space-lg-hor
    .row
                                                                                                                                                                                                                                                                                
      .col-md-6
        .tag-box.tag-box-v2.box-shadow.shadow-effect-1
          h2 ひとつめの見出しです
          p ひとつめの本文です
 
      .col-md-6
        .tag-box.tag-box-v2.box-shadow.shadow-effect-1
          h2 ふたつめの見出しです
          p ふたつめ本文です
```

# 確認

UnifyっぽいUIが確認できたら成功！

![Screen Shot 2015-07-15 at 12.48.32 PM.png](https://qiita-image-store.s3.amazonaws.com/0/14782/f6bf45bc-32f3-1f4a-5811-ef99f15c35ff.png "Screen Shot 2015-07-15 at 12.48.32 PM.png")
php Carbonと標準関数の対応表


# Carbonとは?
http://carbon.nesbot.com/
phpの日付操作を感覚的に行えるライブラリです。
特に良い点としては、直感的に記述できることと、

現在の関わる処理をテストしやすくすることです。

例えば、現在時刻を返す場合は

```php
//std
time()
//carbon
Carbon::now()->timestamp
```

となります。
標準関数を利用している場合は、現在時刻はサーバーに依存してしまいますが、
Carbonを利用すれば、

```php
$now = '2015-07-07';
Carbon::setTestNow(Carbon::parse($now));
```
とするだけで、現在時刻が指定された時刻になります。


# 比較
では実際に比較していきます。

CarbonはCarbonインスタンス、標準関数はタイムスタンプを返します。

Carbonを特定の形式に変換するには下記の方法などがあります。

```php
$carbon = Carbon::parse('2015-07-07')

$carbon->timestamp; //タイムスタンプ
$carbon->format('Y年m月d日'); //date()と同じ
```

また、strtotime関数の挙動が心配な場合はDatetimeオブジェクトを利用しましょう。

```php
$dt = new Datetime('2015-07-07');
$dt->format('Y年m月d日');
```

### 現在

```php
//Carbon
Carbon::now();

//std
time();
```

### 今日
```php
//Carbon
Carbon::today();

//std
strtotime('today');
```

### 今週月曜日(月曜日始まり)

```php
//Carbon
Carbon::now()->startOfweek();

//std
strtotime('last monday', strtotime('tomorrow'));
```

### 今週月曜日(日曜始まり)

```php
//Carbon
Carbon::parse('Monday this week');

//std
strtotime('Monday this week');
```

### 今月末
 ```php
 //Carbon
 Carbon::now()->endOfMonth()
 
 //std
 strtotime(date('Y-m-t'));
 strtotime('last day of this month');
 ```

### 先月末
```php
//Carbon
Carbon::parse('- 1 month')->endOfMonth()

//std
strtotime('last day of previous month');
```


その他、日付を加減算したり、異なるタイムゾーンでの比較もできちゃいます!
selectなどの配列の抽出・検索を行うメソッドまとめ


Rubyでは配列やハッシュに抽出や検索の機能を与えることができる[Enumerable](http://docs.ruby-lang.org/ja/2.2.0/class/Enumerable.html)というモジュールがあります。
ArrayやHashがselectメソッドを使えるのも、このモジュールのおかげです。

というわけで、Enumerableに実装されているもののうち、配列の抽出/検索系のメソッドをまとめてみました。

## select / find_all

{}ブロック内の式が **trueになる要素だけ** を抽出します。
`find_all` は `select` と同義です。

なお、trueになる要素がない場合は空の配列が返ります。

```ruby
# 2で割り切れるものを抽出する
[1, 2, 3, 4, 5, 6].select { |n| n % 2 == 0 }
# => [2, 4, 6]

# 9で割り切れるものがないので空の配列が返る
[1, 2, 3, 4, 5, 6].select { |n| n % 9 == 0 }
# => []
```

Hashでもこんな風に書けばいけます。

```ruby
# valueが1のものを抽出する
{:a => 1, :b => 2}.select { |k, v| v == 1 }
# => {:a => 1}
```

## reject

selectの反対で、{}ブロック内の式が **falseになる要素だけ** を抽出します。
これも、falseになる要素がない場合は空の配列が返ります。

```ruby
# 2で割り切れるものじゃないものを抽出する
[1, 2, 3, 4, 5, 6].reject { |n| n % 2 == 0 }
# => [1, 3, 5]

# すべて1で割り切れるので空の配列が返る
[1, 2, 3, 4, 5, 6].reject { |n| n % 1 == 0 }
# => []
```

## find / detect

{}ブロック内の式がtrueになった **最初の要素** を検索して返します。
`detect` は `find` と同義です。

trueになる要素がない場合はnilが返ります。

```ruby
# 最初の3の倍数を探す
[1, 5, 8, 2, 6, 3].find { |n| n % 3 == 0 }
# => 6

# 7で割り切れるものがないのでnilが返る
[1, 5, 8, 2, 6, 3].find { |n| n % 7 == 0 }
# => nil
```


ちなみに、要素の位置を知りたい場合は `find_index` を使えばOKです。

```ruby
# 最初の3の倍数の位置を探す
[1, 5, 8, 2, 6, 3].find_index { |n| n % 3 == 0 }
# => 4
```

## grep

grepの引数に **マッチする要素だけ** を抽出します。
引数には正規表現が使えます。

マッチする要素がない場合は空の配列が返ります。

```ruby
# 数字を含むものを抽出する
['a1', 'bb', 'c2', 'dd', '5e'].grep(/[0-9]/)
# => ["a1", "c2", "5e"]

# 大文字の英語を含むものがないので空の配列が返る
['a1', 'bb', 'c2', 'dd', '5e'].grep(/[A-Z]/)
=> []
```

## take_while

{}ブロック内の式が **falseになる手前の要素まで** を返します。

```ruby
# 3が出るまで抽出する
[1, 2, 3, 4, 5, 6].take_while { |i| i < 3 }
# => [1, 2]
```

## drop_while

take_whileの反対で、{}ブロック内の式が **falseになった以降の要素すべて** を返します。

```ruby
# 3が出たらそれ以降を抽出する
[1, 2, 3, 4, 5, 6]. drop_while { |i| i < 3 }
# => [3, 4, 5, 6]
```

## まとめ

Enumerableには配列の操作やグループ分けなど、上記以外にも様々なメソッドが用意されています（[別記事にまとめました](http://qiita.com/shibukk/items/d985d014de598d925b8b)）。
必要な場面でそれらのメソッドを思いつけるようになりたいですね。
OPアンプ > 同相信号 / 差動信号

http://www.marutsu.co.jp/pc/static/large_order/110818opamp

> 差動信号は2つの端子間に差分として加わります。
これに対し同相信号は2つの端子に同じ信号が加わる状態です。

読んでいる本に「同相信号電圧」の記載があった。
( 引用: トランジスタ技術SPECIAL No.71 > 図3-4 同相電圧入力と差動電圧入力 )

良くわかってないのは、二本の同相信号電圧に15.0Vと15.1Vがかかっていて、「同相信号電圧」の定義として15.0Vとしていたこと。
小さい方を取るのかと思いきや、他の図では10.0Vと9.98Vの入力の時は同相電圧入力が10.0Vとしている。


もともとが15V(10V)の入力を意図して、15.1V(9.98V)は誤差(オフセット?)が含まれるということか。

<hr>
(追記 15/07/15)
![schemeit-project.png](https://qiita-image-store.s3.amazonaws.com/0/32870/95e25157-013d-471e-973e-b7ca8b297e64.png)

右に出ている「=*V」が同相電圧入力です。
Django settings.py SECRET_KEYエラー

settings.pyの中でdjangoモジュールをimportするとsettingsの置き換え時にSECRET_KEY設定がなくて怒られる話．

### 背景1
settings.pyの中で `add_to_builtins('bootstrap3.templatetags.bootstrap3')` 
みたいに書いとけば templateの頭でいちいち`{% load bootstrap3 %}` を書く必要がなくなるらしい．
ということでさっそく記述．

```py
from django.template.base import add_to_builtins

add_to_builtins('bootstrap3.templatetags.bootstrap3')
```

### 背景2
djangoは`manage.py`コマンド実行時に`--settings`オプションを渡すことで使用する設定を変更できる．
これを利用して，test用の設定やdeploy用の設定を用意しておき，テスト環境や本番環境での起動時に
`$ python manage.py runserver --settings=myproject.settings_production `
のように実行する．

参考：gunicornの場合はこんな感じ
`$ gunicorn -w 2 myproject.wsgi:application --settings=myproject.settings_production --bind=unix:///tmp/myproject.sock`


本番環境用のsettingsはDEBUGフラグやDBが違うくらいなので，
下記のようにdefaultのsettingsをimportして必要な変数だけ上書き．

```py
from .settings import *

DEBUG = False
ALLOWED_HOSTS = ['*']

DATABASES = {
    'default': {
        ...
    }
}
```

### 問題
背景1(settings.pyのなかでdjango.template.baseのimport)と背景2(settingsの置き換え)をすると
以下の様なエラーが吐かれて落ちる．
`import django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.`

### 原因
settingsの中でdjangoを呼び出し，その中でさらにsettingsを呼び出していたので，
無限ループ防止でデフォルトのsettingsのimportが抑制されていたらしい．


![スクリーンショット 2015-07-15 12.31.37.png](https://qiita-image-store.s3.amazonaws.com/0/58048/14038c8f-849e-886c-6c24-c6a97cfcc21d.png)


### 対応策
settings.pyの中で`add_to_builtins`を実行するとまずいようなので `myproject/__init__.py`に移動．
ただし，gunicornで実行する場合は`myproject/__init__.py`の中のdjango import時に`DJANGO_SETTINGS_MODULE`環境変数がないと怒られる場合がある(読み込むモジュール次第)．

```
ImproperlyConfigured: Requested setting BOOTSTRAP3, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
```
\# bootstrap3は中でsettingsを読み込むらしい．

というわけで，gunicornの起動も考慮した `myproject/__init__.py`の中身はこんな感じになりました．

```py
import os

from django.template.base import add_to_builtins


os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mailer.settings")

add_to_builtins('bootstrap3.templatetags.bootstrap3')
```
Kobito on ubuntu


ubuntu 14.04 からWindows版Kobitoで書いています

# 参照
[この記事](http://qiita.com/yasunori/items/bf651a961945550b983b) ... (1)
とか
[更に親記事](http://qiita.com/daron/items/04e3d7936215568a704e)

# 手順
(1)の通りなんだけど既にNode.jsは入っている環境ではあった

# 環境
VirtualBox上のUbuntu 14.04
![Unicorn.png](https://qiita-image-store.s3.amazonaws.com/0/81847/b3db6616-3ebe-38f1-bff6-fb3eebc5ce5c.png)
社内にSlackっぽい何かを導入したい場合の候補を試してみる


# 概要
社内にSlackっぽいチャットを設置したいと思った場合に、世の中にはどんなものがあるのか探して、試してみました。
結論から言うと候補は以下の３つです。

* [RocketChat](https://github.com/RocketChat/Rocket.Chat)
* [Let's Chat](https://github.com/sdelements/lets-chat)
* [Mattermost](https://github.com/mattermost/platform)
 
# 試した環境
LAN内に置かれたLinuxマシン上で動かしてみました。

* CentOS 7
* npm v0.12.7
* Docker 1.6.2

この環境で試していきますが、エラーログや細かい操作手順等は載せずに小並感たっぷりの感想文でお届けします。

## RocketChat
[Dockerイメージがある](https://github.com/RocketChat/Docker.Official.Image)ので利用してみる。しかし、GitHubのREADME通りに手順を踏んでもコンテナが上手く起動しなかった。
ならば、ソースから起動と思い[GitHubのページ](https://github.com/RocketChat/Rocket.Chat)に書かれている手順で起動する。これは成功。しかし、このままではコンソールからログアウトすると停止してしまうので、デーモン化する方法を探す。
どうやらmeteorというのはビルドするとnodeアプリケーションとしてパッケージ化されるらしい。build.shを参考に以下のコマンドを叩く。

```bash
source build.sh production
```

しかし、ビルドは上手く通らず。一旦置いておく事に。

### 追記
既に詳細な記事を書いていらっしゃる方がいました。
http://qiita.com/yasuhiroki/items/0e06ccda1c53f616d74d
上記の手順に従えばDocker上で稼働できました。

## Let's Chat
GitHub通りに手順を踏めばnpm startで問題なく起動した。Dockerのイメージもあるが、特に試していない。あとはforeverあたりでデーモン化すれば放置プレイでいい。

## Mattermost
GitHub通りに手順に従えば問題なく起動はする。しかし、Signupしようとすると、謎のURLにリダイレクト(?)され一向にサインアップできない。[issueにも上がっている](https://github.com/mattermost/platform/issues/57)ので、まあ何か問題があるのだろう。気長に待つか、どうしても使いたければ自分で修正という感じ。

### 追記
修正されたようです。latestのイメージを使えば問題なく動作します。

```bash
docker run --name mattermost-dev -d --publish 8065:80 mattermost/platform:latest
```

# まとめ
~~インターフェイスが日本語になるRocketChatが一番よさげだが、色々と環境構築が面倒。Dockerイメージが素直に動いてくれればRocketChatを選択。Mattermostはログインできていないので評価出来ず。暫くはLet's Chatを設置してみる事にする。~~
あれから3つを一人でいじくり回してみました。正直Mattermostが一番いい感じです。細かな使用感は別途まとめます。
AtomのタブキーをEmacsライクな動作にする


なかなか苦戦したので備忘録

## 動機
Emacsでは，行の途中でtabキーを押しても行全体がインデントされるんですが，Atomではカーソルの場所にtabが挿入されます．

しかし，Atomにはオートインデントのコマンドが存在するので，これをtabキーに割り当てればいいじゃないかと思い，割り当ててみました．

確かに，上で指摘した動作にはなるのですが，カーソルが行頭にあるときはカーソルはその位置のまま留まります．

僕的にはその行の最初の文字までカーソルが動いて欲しい…！
~~ctrl-a使えばいいじゃんって話~~
てことで，そこも解決できるように練習がてら作ってみました．

練習ついでにパッケージにして作りました．
~~これがどんどんemacsのinit.elのように肥大化していくんだろうなぁ~~

## パッケージの作成

Package > Package Generator > Generate Atom Package

を選ぶだけでひな形が作成されます．

今回は，パッケージの名前を"my-package"としました．

### Keymaps

> キーバインドの設定

```coffeescript:my-package.cson
'atom-text-editor:not([mini])':
  'tab': 'unset!'
  'tab': 'my-package:indent'
```
元のキーバインドを解除，新しく定義したものをセット

### menus
> 右クリックのメニュー（コンテキストメニュー）や，メニューバーでの振る舞い？の設定のようです．

`label，command`らを適宜書き換える．
（今回は使わないので単にコメントアウトしました．）

### lib

> 本体

```coffeescript:my-package.coffee
module.exports =
  subscriptions: null

  activate: ->
    @subscriptions = new CompositeDisposable
    @subscriptions.add atom.commands.add 'atom-workspace',
      'my-package:indent': => @indent()

  deactivate: ->
    @subscriptions.dispose()

  indent: ->
    if editor = atom.workspace.getActiveTextEditor()
      for cursor in editor.getCursors()
        if cursor.getBufferPosition().column == 0
          cursor.moveToFirstCharacterOfLine()
      for selection in editor.getSelections()
        selection.autoIndentSelectedRows()
```

やってることは，

```script:こんな感じ
if カーソルが行の先頭
	then 行の最初の文字まで移動
選択行を自動インデント
```

詳しくは以下を参考に

[Atom Documentation](https://atom.io/docs)

ひぃひぃとドキュメント見ながら実装したわけだけど，各メソッドがどのクラスのメンバ関数なのかが読み取れずに苦労しました．

どこに書いてあるんだろう．
typescript 独自オブジェクトの配列と連想配列(ハッシュ)の型の書き方

よく忘れるのでメモしておきます。

公式に書いてない気がするのですが、気のせいでしょうか。

# 独自クラスの配列の型の書き方

例えばこんなやつです。

```
[{a:1234,b"1234},{a:1234,b"1234}]
```

配列の中身がオブジェクトになっているものです。

`myArray:格納されるオブジェクトの型　[]`

例

```ts
var myA:MyType[] = [];
myA.push(new MyType())
```

# オブジェクトの型の配列の型の書き方

`myHash:{[キー名: string]: オブジェクトの型;}`


こんなやつです。

```
{
a:{name:"test",body:"わー"},
a2:{name:"test",body:"わー"},
a3:{name:"test",body:"わー"}
}
```


例

```ts
var myHash:{[key: string]: MyType;} = {};;
myHash["key"] = new MyType()
```
Haroopadでのフローチャート作成

## はじめに
フローチャートをExcelで書くと、最初はいいけどメンテナンスで発狂しそうになることが多い。
矢印の付け方変えたり、箱の位置変えたり、フロー増やしたり減らしたり。
ちまちまとマウスとキーボードを行ったり来たりしながら、細かい調整しないといけないから、心の平穏を保つのが難しくなることがよくある。辛い。

なので、マークダウンで書けると楽だし、どれくらいまでできるのか試してみようと。

### Haroopad と mermaid.js
Haroopadはマークダウンエディタです。最近ちょくちょく使ってみてます。
mermaid.jsはJSでチャート作成ができるライブラリ。今回試したのはこっちの挙動。
使ってるHaroopadはv0.13.1だけど、mermaid.jsは標準で組み込まれてるので、特に設定とかいらない。
マークダウンのコード表記でmermaidを指定するだけ。（以下に例を記載）

## 試行結果
マークダウン記載例。
※"\"はQiitaのマークダウンのエスケープのために記載しているので、Haroopadで記載するときは不要。

```
\```mermaid
graph LR
	subgraph graph1
        未着手	==> switch.3branches
        switch.3branches ==> switch.4branches
        switch.3branches ==> case2-1
        switch.4branches ==> case2-2
        switch.4branches ==> case1-1
	end
    subgraph graph2
        case2-1
        case2-2
    end
\```
```


記載結果:

![2015-07-15_11h25_14.png](https://qiita-image-store.s3.amazonaws.com/0/43489/a0e3357a-0d40-b30c-47e9-31a1240f2a61.png)

## まとめ
矢印が多くなったり、あまり複雑なフローチャートになると、図形を直接いじれるExcelの方が、初期の作成は早いかも。でも、メンテナンスの回数が多くなりそうなら、こっちのが楽なケースもある気がする。
subgraphとして区分けできるのは良い。表示結果の直感的な理解に優しいし、頭で整理しながら書くのにもスムーズ。

以下に細かな挙動についてわかった事と思ったことを。

* 矢印が重なったりして位置変えたくなっても、箱と矢印の位置を自由には動かせない。若干これが痛い。使い慣れたら、subgraphとか駆使して調整できそうな気もするが。
* 表示の位置に関しては、ツリー構造のようなかたちで階層化して順番決めてそう。同一の階層であれば、上下の順番は、記述の順序を変えれば変更できる。
* （）は表示文字に使えない。記法として別名に利用される。エスケープできないのだろうかと思って、"\"とか"("とか適当に思いついたものを試したけどダメだった。
* 表示文字には太字とかのスタイルが使えない。プレーンテキストのみ。

フローチャート以外にもmermaidで書ける図があるので、どんなのかは[公式デモ](http://knsv.github.io/mermaid/demos.html)を見るとわかる。

## 参考
* mermaid.jsが素晴らしいけどなかなか使ってる人見かけないので実例晒す(追記あり)
	* http://qiita.com/uzuki_aoba/items/a01f8b0b52ced69c8092

最近特に、Webに情報残してくれている人達に助けられてます。
時間使って残してくれている皆さん、本当に凄い。自分も少しづつでも残してきたい。
日本語変換未確定文字列と確定文字列がずれないブラウザ内エディタを探した

とりあえず、ゆくゆくは書きたいものの構成要素の一つにエディタがある。そこで、まあ基本っぽいのはACEなので、ちょっと見てみた。機能的には充分なのだが……日本語がずれる。ちょっとしたことなのだが、変換作業中の文字列と、確定後の文字列の位置がずれるので、コレはアウト。日本語がメインじゃなきゃ充分なのだが、残念ながら使おうとしている目的は日本語の文章なのだ。2011年ごろにACEを元にしたエディタに移行したとみられるjsdo.itはズレないので、カヤックが自社でパッチ当てたんだと思う。くそう。パッチをプルリクしなかったっつーことだな、と一瞬かちんときたものの、まあ、なんか事情があったのかも知らんし、今はもうACE使ってなくて別に実装したのかも知らん。運用中のサイトのコード見るのはめんどくさいんで覗いてないから、確かなことは何も言えないしね。

で、その他、エディタが含まれている感じのオープンソースプロダクトを見てみると、Markdownエディタでは、Stackeditは、ずれない。なんか、オフラインウェブアプリっぽい作りなのね。まあ、自分で作りたいものもオフラインアプリにしたい感じなので、軽くコードリーディング用のフォルダに入れた。

jsdo.itみたいなやつ（なんて呼ぶんだこーゆーの、同種のWEBアプリをGithub上で探してみると、「コラボJS開発環境」あたりがいいんか？）で言うと、jsdo.itはオープンソースじゃないけど、jsbinは、オープンソースでかつ、ずれない。Stackeditを読み終えたら、たぶんもう少し勘が働くようになると思うんで、読む価値があるかどうかはそこで判断しようと思う。

そんなわけで、ACEを読む＆使うかどうかは微妙、という話。なんだかんだ言ってStackeditのまとまりが良さそうなので、切り出せば充分っぽい。切り出した部分にのりしろ作ってライブラリとして公開するかなあ、どうすっかなあ、というあたりが迷う点。

つーか、根本的な話、スマホでコード書くのはダメだ、後で書き直すとき2度手間になる、と悟ったので、スマホは読む専門にしよう、という個人的な話だったりするのだ。ちゃんちゃん。
AWSアカウントのMFA解除申請をしてみた

# 申請理由
Google Authenticatorを使用していたのですが、iPhoneを故障で端末交換をした際にアプリのデータが引き継がれなく、MFAトークンを確認することが出来なくなってしまった

# 申請方法
## 公式の申請フォームから申請
下記のURLにアクセスすると申請フォームがあるので、
必要項目を埋めてSubmitをクリックします。
https://aws.amazon.com/forms/aws-mfa-support

必要項目は
・Problem with Authentication Device
・Primary Phone Number
・Country associated with your phone number
上記３つ(*が付いている項目)とセキュリティコードです。

### Problem with Authentication Device
MFAトークンを確認するデバイスにどのような問題があって問い合わせをするのかを
プルダウンから一番近いものを選択します。

### Primary Phone Number
あとで、シアトル？から本人確認の電話がかかってくるので、
取れる電話番号を入力しておきます。
日本の場合、国際電話になるため、先頭の「0」を「+81」に変更します。
例）090-0000-0000　⇒　+8190-0000-0000

### Country associated with your phone number
どこの国の電話番号か、プルダウンから選択します。
「日本」を選択

これで入力は完了です。

Submitをクリックする前に右上の言語が「日本語」になっていることを
確認してからクリックしてください。
（稀に日本のサポートからかかってくることがあるらしい・・・）

## シアトルから電話がかかってくる
Submitをクリックしてから15分程待つと、
先ほど入力した電話番号に国際電話がかかってきます。
私の時は、番号の先頭が「+20」でした。
ここからは全て英語のやりとりになります。。。。(´・ω・｀)
英会話は苦手なので辛かった。。。

※以下、「」の中は英語を適当に訳しただけなので間違っている可能性大です。

電話を取ると、
「シアトルのAWSの問い合わせ受付センターです。あなたのチケットを受け付けました。」
的な感じで最初に言われます。
適当に反応(私は「OK！」と言っておきました)します。
以下、相手からの質問に答えていきましょう！(※人によって違う可能性があります)

#####１．「あなたのAWSアカウントのIDを教えて下さい。」
AWSアカウントの番号（12桁）を教えます。

#####２．「登録しているメールアドレスを教えて下さい。」
AWSアカウント作成時に登録したメールアドレスを教えます。

#####３．「MFAトークンを解除するのはルートですか？IAMですか？」
必要に応じて回答してください。(私の場合は、ルートアカウント)

#####４．「登録されているアドレスにメールを送信したので、本文のPINを教えて下さい。」
メールを確認し、PINを教えます。(海外から送られてくるので受信まで時間がかかります)

#####５．「MFAを解除したので、ブラウザを再起動か別のブラウザでMFA無しでログイン出来るか確認してください。」
ログインを確認し、できたことを先方に教えます。

#####６．最後に「その他ご不明点等ありますか？」と聞かれるので、
特になければ、「ナッシング」といいましょう！

これで、MFA解除申請終了です＼(^o^)／

英語できないとマジ辛いと感じた15分間でした。。。(´・ω・｀)
UISwitchのON/OFFを左右逆にする


### 単純に180°回転させるだけ


```sample.m
- (void)viewDidLoad {
    [super viewDidLoad];
    
    CGAffineTransform t1 = CGAffineTransformMakeTranslation(0, 0);
    float angle = 180.0 * M_PI / 180;
    CGAffineTransform t2 = CGAffineTransformRotate(t1, angle);
    // swと言う名前のUISwitchに対して反映
    self.sw.transform = t2;
}
```

UISwitchをやめてカスタムボタンのBackgroundを変更して押下時にアニメーションされるような事をするより遥かに簡単

斜め45°とかもできる…

AppleのUI（開発）標準的にどうなのかは不明
Google Compute Engineでssh接続、ポート開放

* https://console.developers.google.com/ にアクセスし、新しくプロジェクトを作成。なおクレジットカード登録が必要。お試し用に60日間300ドル分使える。

# プロジェクト作成後の初期設定

* コンピュート -> Compute Engine -> メタデータ
  * google-compute-default-region : asia-east1
  * google-compute-default-zone : asia-east1-a

# インスタンスを作成

* `ubuntu 14.04`を選択。
* f1-micro を選択

WebUIにお世話になるのはここまで。

# gcloudコマンドインストール

```bash:
curl https://sdk.cloud.google.com | bash
gcloud auth login    #webブラウザが起動します
gcloud config set project sandbox-project-1234
```

# GCEにssh

```bash:
gcloud compute ssh instance-1 --zone asia-east1-c
```

* 鍵は ~/.ssh/google_compute_engine に作成される。

----

# 手動でsshできるように修正する方法

## ブラウザからssh

* /etc/sshguard/whitelist
  * 接続元のIPアドレスを追加。（デフォルトでは127.0.0.1/8のみ許可）
* ~/.ssh/authorized_keys
  * 接続元の ~/.ssh/id_rsa.pub を追記

```bash:
ssh tukiyo3_gmail_com@104.155.XXX.XXX
```

----

# ファイアウォールで任意のポートを開ける

* [Google Compute Engineのファイヤーウォールを理解する #gcpja ｜ Developers.IO](http://dev.classmethod.jp/cloud/gce-firewall/)

----

# 認証情報(.json)の取得方法

* APIと認証 -> 認証情報 -> OAuth -> サービスアカウント -> クライアントIDを作成
  * .jsonがダウンロードされる。

![s1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/762c06a5-840a-24ae-19da-1dba89c79b47.png)
サルでもできるCodeCommit ssh接続でgit cloneするまで

[サルでもできるCodeCommit コピペでgit cloneするまで](http://qiita.com/shojimotio/items/901c5220759272bf5a72)でhttpsで接続できたので、
ssh接続でも接続したいと思いますよね。

# ssh-keygenで公開鍵、秘密鍵を作る

1. ec2インスタンスにログインしてコンソールから作成

```
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa): そのままEnter
/home/ec2-user/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase): そのままEnter
Enter same passphrase again: そのままEnter
Your identification has been saved in /home/ec2-user/.ssh/id_rsa.
Your public key has been saved in /home/ec2-user/.ssh/id_rsa.pub.
The key fingerprint is:
ce:97:a8:d8:3b:d4:8d:95:22:68:e0:e2:8e:58:8d:ce ec2-user@ip-x-x-x-xx
The key's randomart image is:
+--[ RSA 2048]----+
| . 省略    .     |
+-----------------+

$ cat /home/ec2-user/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAyZfh5ztQIQCwPIQAGFZD9kv1ihU9RP9WCBsfSp7JlNs0eNol
...省略
-----END RSA PRIVATE KEY-----

$ cat /home/ec2-user/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJl+HnO1AhALA8hAAYVkP2S/WKFT1E...省略

```

# 公開鍵をCodeCommitのIAMユーザに登録する

1. IAMユーザを選択する→Upload SSH keyボタン押す
2. id_rsa.pubの中身をコピペしてUpload SSH keyボタン押す
3. SSH Key ID が生成される。→.ssh/configに設定する時に必要

# ec2インスタンスにログインしてssh接続でgit cloneする

1. .ssh/congfigに以下を記述。XXXはSSH Key ID


```file:~/.ssh/config
Host git-codecommit.*.amazonaws.com
    User XXXXXXXXXXXXXXX
    IdentityFile ~/.ssh/id_rsa
```

2.　.ssh/configはパーミッション600にする。 `$ chmod 600 ~/.ssh/config`
3.　ssh接続でgit cloneする

```
$ git clone ssh://git-codecommit.us-east-1.amazonaws.com/v1/repos/samlpe_ripo ~/ssh_sample_pipo
```

## 最後に

自分の[技術ブログ](https://blog-c.cloudlance-motio.work/)ではフリーランス界隈の情報や最新のIT情報の発信していますので、よろしくお願いします。
docker loginや docker pushで 「:too many redirects 」のエラーが出た時の解決法

```
FATA[0020] Error response from daemon: Server Error: Post https://index.docker.io/v1/users/: dial tcp: lookup index.docker.io on 10.0.2.3:53: too many redirects 
```

docker-machine上の名前解決がないので、
docker-machine ssh
echo "nameserver 8.8.8.8" > /etc/resolv.conf


Stack Overflow読んで再起動（docker-machine restart）しても
うまくいかなかったので、記事を書きました。
体系的　webアプリケーション

#脆弱性のこと

今日も続きをやっていきます。

#クロスサイト・リクエストフォージュリ（CSRF)

CSRFとは？・・・・WWWにおける攻撃手法の一つであり、具体的な例としては
　　　　　　　　　　掲示板で意図しないことを書かれたり、オンラインショッピングで勝手にものを買わされたりする。

webアプリケーションにCSRF脆弱性がある場合の影響例

①利用者のアカウントによる物品の購入（オンラインショッピング）
②利用者の退会処理
③利用者のアカウントによる掲示板への書き込み
④利用者のパスワードやメールアドレスの変更

➡影響はアプリケーションの重要な処理の悪用に限られる。個人情報などを盗むことはできない。
（もしパスワードが変更されると不正にログインされる可能性も）

CSRFとXSSの違い

CSRFとはリクエストに対するサーバー側の処理を悪用する
XSSとはリクエストに含まれるスクリプトはオウム返しに返され、それがブラウザ上で実行できることで攻撃される。

よって、　①CSRFは設計段階から対策を盛り込む必要がある。
　　　　　②開発者の認知度がXSSに比べて低く、対策が進んでいない。

脆弱性が生まれる原因
①form要素のaction属性にはどのドメインのURLでも指定できる。
②クッキーに保管されたセッションIDは、対象サイトに自動的に送信される。

対策　①CSRFの対策の必要なページを区別する
　　　②正規利用者の意図したリクエストを区別できるようにする。
　　　③秘密情報（トークン）の埋め込み
　　　④パスワードの再入力
　　　⑤Refererのチェック

#セッション管理の不備

セッションハイジャックの原因と影響
①IDの推測
②IDの盗み出し
（クッキー生成の際の属性の不備、ネットワーク的にIDが盗聴される、XSSによるアプリの脆弱性、PHPやブラウザなどの脆弱性、IDをURLに保持している場合は、refererヘッダからリーク）
③IDの強制（セッションIDの固定化）

影響
①利用者の個人情報
②利用者の持つ権限での操作
③利用者のIDによるメール、ブログなどへの投稿

対策

①推測可能なID　➡　自作のものを利用せず、開発ツールの提供するセッション管理機構を利用
②IDの盗み出し　➡　盗まれないような設定、プログラミングをする
③IDの強制　　　➡　ログイン時にせっしょんID を変更する。

#リダイレクト処理にまつわる脆弱性

オープンリダイレクタ脆弱性

影響　➡　フィッシングサイトに誘導され、重要情報を入力させられる
　　　　　デバイスドライバと称してマルウェアを配布される

対策　①リダイレクト先を固定にする
　　　②あらかじめ許可されたドメインにのみリダイレクトするように制限する

HTTPヘッダ・インジェクション

影響　　なりすまし、偽ページの表示、キャッシュ汚染

対策　外部からのパラメータをHTTPレスポンスヘッダとして出力しない
　　　リダイレクトやクッキー生成の専用ライブラリあるいはAPIを使用し、パラメータ中の改行コードをチェックする
Unity 実行時に GPU 荒れまくるときの対策

何のこっちゃって思われるかもしれませんが、こういうことだす。

![2015-07-14 11.19.56.jpg](https://qiita-image-store.s3.amazonaws.com/0/25555/8f77c471-40ff-037b-a27a-2b3ef03b8869.jpeg)

再現条件は特定できていないんだけど、ThinkPad X1 Carbon Gen1 3443CTO (Intel Core i7-3667U / Intel HD Graphics 4000) で Unity 5.1 を OpenGL モードで立ち上げて特定のシェーダーを読み込ませたときに、こんな感じのノイズが画面全体に発生したりしなかったりする。

## 対策（超絶対症療法）

![Image1.png](https://qiita-image-store.s3.amazonaws.com/0/25555/1ede7898-cd83-8e2f-bb4b-395d005107aa.png)

![Image5.png](https://qiita-image-store.s3.amazonaws.com/0/25555/2bdbde35-8bb9-fee1-c8a0-2d42c1ae4d0b.png)

いろいろ試行錯誤している中で見つけた対処方法としては、Unity 立ち上げてる最中にリフレッシュレートを変更すると、現象が治まることが多い。

ポイントは、**50Hzすれば良いとか60Hzにすれば良いとかそういうことではなく**て、**Unityを立ち上げた状態で一度以上リフレッシュレートを「変更する」**と何故か現象が治まる、というところ。

## その他
垂直同期周りが怪しいのかなぁ、と思い、Edit - Project Settings - Quality メニューから開く Inspector 内で「V Sync Count」という項目を「Every V Blank」から「Don't Sync」に変更してみたりもしたけど、この設定ではそれほど現象の変化は見られなかったです。

![Image6.png](https://qiita-image-store.s3.amazonaws.com/0/25555/58c4e35a-f427-9d79-0a4a-5dad5b02ec7a.png)

![Image8.png](https://qiita-image-store.s3.amazonaws.com/0/25555/efbc8e61-6663-3e74-9aa0-cab7f499d82f.png)

## おしまい
今使ってるこの ThinkPad は2年近くけっこうヘビーに酷使されていてボロが来る頃なので何かハード面がマズい気がしないでもない。
技術英語 > Who takes what?

Who takes what?
というフレーズを思い出した。

2003年頃に出席したとある会議において、「誰が何を取るんだ」という場面で使われていた。

関連して
Who brings what? (誰が何を持ってくる？）

<hr>
githubでも見つけた。
https://github.com/YaleSTC/reservations
> Who can borrow what, for how long? (誰が何を、どれくらい借りられる?)

<hr>
take関連で思い出した @ Star trek voyager
Take it if you like. (好きならもっていけ)
pecoでzshのコマンド履歴検索を超快適にする！

peco を使うとかなり便利だということを知ったので導入メモ

注意：Mac環境です


# peco のインストール
```zsh:homebrewでインストール
brew install peco
```
Macで brew を導入している方は、 brewを使ってpecoをインストール。

>詳細は http://github.com/peco/peco を参照

# .zshrcに以下の内容を追加

```zsh:~/.zshrc
function peco-history-selection() {
    BUFFER=`history -n 1 | tail -r  | awk '!a[$0]++' | peco`
    CURSOR=$#BUFFER
    zle reset-prompt
}

zle -N peco-history-selection
bindkey '^R' peco-history-selection
```
peco-history-selection関数を記述

`exec zsh -l` でzshを再ログインすると良い


**準備完了！！**

# 使い方
zsh上で Ctrl + R を押せば以下の感じで出てくる。 
後は、インクリメンタルサーチで絞り込むだけ！
![Screen Shot 2015-07-15 at 06.47.53.png](https://qiita-image-store.s3.amazonaws.com/0/58698/eceb7009-9f29-720c-ec7b-ff09aa224704.png)

※ 画像はプライバシー保護のため、修正しているので右上のIgnoreケースの表示は標準とは少し違っています。
Botoを使ってS3のCloudTrailのLogを解析する

## 初めに
Boto(AWSのPython SDK)を使って、S3上にあるCloudTrailのlogをParseしたい、と思ったのですが、幾つかハマッた箇所があったのと、自分にずばり参考になる取っ掛かりのSample Codeがうまく見つからなかったので、ご参考までにCodeをチラシの裏しておきます。

#### ハマッた箇所
* Boto3はHTTP Proxy経由でのAccessをサポートしていない? っぽく、結局Boto2を使いました
* CloudTrailのlogはDefaultでgz圧縮されているので、中身をparseするには解凍処理が必要
* 『S3のxxってBucketのaa/bb/ccのPath以下のfileだけを対象』という場合は`bucket.list(prefix='aa/bb/cc')`

なお、CloudTrailのlogは、[Logglyを使うと解析が捗る](http://blog.serverworks.co.jp/tech/2014/10/10/loggly/)みたいです。

## Python Codeについて

### 個別に設定が必要なもの
`aws_access_key_id`, `aws_secret_access_key`,`target_path`, `proxy`, `proxy_port`が個別設定必要です。

* `aws_access_key_id`, `aws_secret_access_key`は、AWS外部アクセス用に作成したIAM Userのkeyを設定してください(作成したIAM UserにS3へのReadAccess権(`AmazonS3ReadOnlyAccess`)の付与を忘れずに!)
* `proxy`, `proxy_port`はHTTP Proxy serverの設定です
* `target_bucket`は対象のbucket名、`target_path`は解析の対象としたいS3のpathです、ここではus-west-2の2015/07のlogのみを対象としみました

### 補足
* 以下のSample codeのaccess keyなどは適当な文字列にしてます
* Python2.7, Boto v2.32.1を使っています

### Codeの大枠の流れ
以下の様な処理の流れになっています。

* `target_bucket`Bucketの`target_path`以下にあるfile(Key)をListし、それらをDownloadする
* Downloadされたfile(gz形式)を解凍し、JSONとして読み込む
* RDS関連のLogが合った場合(`['eventSource'] == 'rds.amazonaws.com'`)、中身を標準出力に出す


```py

import boto.s3.connection, gzip, StringIO, json

aws_access_key_id='AKKBUGOIU4434DDTT'
aws_secret_access_key='78oiupoiuh7++REugoiusGSEE'
target_bucket = 'your-backet-name'
target_path = 'CroudTrail/AWSLogs/1234567899999888/CloudTrail/us-west-2/2015/07'

def main():
  s3Instance = boto.s3.connection.S3Connection \
    (aws_access_key_id, aws_secret_access_key, proxy='your.proxy.server.com', proxy_port=8080)
  s3Bucket   = s3Instance.get_bucket(target_bucket)
  bucketList = s3Bucket.list(prefix=target_path)

  for count, itemOne in enumerate(bucketList):
    s3BucketKey = s3Bucket.get_key(itemOne.name)
    buffer_gz = s3BucketKey.get_contents_as_string()
    stringBuffer = StringIO.StringIO(buffer_gz)
    buffer_text = gzip.GzipFile(fileobj=stringBuffer)

    try:
      responseJSON = json.loads(buffer_text.read())
    except Exception, e:
      print e
    else:
      for count, itemTwo in enumerate(responseJSON['Records']):
        if itemTwo['eventSource'] == 'rds.amazonaws.com':
          print json.dumps(itemTwo, separators=(',', ':'), indent=2)
          print 'Event name = %s' % (itemTwo['eventName'])
          print '================================='

    stringBuffer.close()
    buffer_text.close()

if __name__ == '__main__':
  main()
```
【計算論】P,NP,無限,集合などについての解説

#はじめに
どんなに高性能なパソコンでも解ける問題と解けない問題があります。
また、解けるけど解くのに数十年もかかるような問題も現実的ではありませんよね。

今回は計算論の基本的なこと(PとNP)を勉強したので以下にまとめます。


#数学の世界に関して
数学では、
3 とか -2 とか -0.05 とか √5 とか
様々な数値を使って答えを導きます。
また、全ての数値は
自然数、整数、有理数、実数、複素数
の5つの集合のどれかに必ず含まれています。

下記のようなイメージです。

![画像3.png](https://qiita-image-store.s3.amazonaws.com/0/75241/ebcdc596-4c17-f774-470a-d6c71f5cb563.png)

N ∈ Z ∈ Q ∈ R ∈ C
と表すことが出来ます。
N: 自然数
Z: 整数
Q: 有理数
R: 実数
C: 複素数

[わかりやすく解説している動画](https://www.youtube.com/watch?v=f4e7PZHWiXs)

つまり、
全ての数字は、
複素数に含まれており、
その中で色々と式が組み合わされているわけです。

##自然数
1以上の値
例) **1**, **2**, **3**, **4**

##整数
0、負の数、正の数
例) **-2**, **-1**, **0**, **1**, **2**

##有理数
分数で表せる数
例) **-1**, **-0.02**, **0**, **0.5**, **10**, **3/5**

※整数/整数で表せる数が有理数なのですが、
分母が0の場合は存在しないので有理数に含まれません。
分子が0の場合は有理数に含まれます。

##実数
有理数と無理数(分数で表せない数)を合わせた数
無理数の例) **√2**, **√3**, **π**, **e**

##複素数
実数a,bと虚数単位iを用いてa+biと表せる数
例) 
**x^2+2=0**を解くと**x=±√-2**となる
このときルートの中のマイナスをiに置き換え、
**x=±√2i**と表すことができる。



#無限についての理解
皆さんは**無限**という言葉を数学などで一度は聞いたことがあると思います。
無限といったら数えられないとかたくさんとか...表現はたくさんあると思います。
しかし、
無限の中にもレベルがあります。
(ドラゴンボールのスーパーサイヤ人...金髪に変身するといってもスーパーサイヤ人2や3がありますよね。それと似ています。）←わかりづらかったらスミマセン(汗)

詳しくは↓
[無限を最短で紹介するよ](http://www.gizmodo.jp/2011/07/post_8960.html)

ズバリ言うと、
無限の中には、
**可算無限**と**非可算無限**の2種類が存在しています。

##可算無限とは
**自然数と1対1対応できる無限**です。
要するに、
**いつかは答えが見つかる数**です。
アレフゼロといいます。
自然数、整数、有理数が含まれます。

##非可算無限とは
**自然数と1対1対応出来ない無限**です。
要するに、
**√2のように数えても答えにたどり着かない数**です。
アレフ(記号：א)といいます。
実数と複素数が含まれます。

#P, NP, NP完全, NP困難, 対角線言語について
![画像1.png](https://qiita-image-store.s3.amazonaws.com/0/75241/af649e3b-20b2-183b-102f-11d423dab470.png)

[PとNPとNP完全とNP困難](http://d.hatena.ne.jp/Zellij/20110529/p1)
[NP完全](http://www.msc.cs.gunma-u.ac.jp/~nakano/Algo/npc.html)

P∈NPであるといえます。

問題には、
コンピュータを使用しても解ける問題と解けない問題があります。

詳しくは下記のサイトを参考にして下さい。
[意外と知らない、【階乗】の恐ろしさ](http://ncode.syosetu.com/n0050be/22/)

つまり、
2^nのように指数がnとされている場合の計算はヤバイってことです。
コンピュータの天敵です！

もっと詳しくいいますと、
指数の部分が√2のような無理数であると計算するのに一生を費やしてしまうぐらいかかってしまいます。
このような問題をNPといいます。


##クラスPとは
多項式時間
多項式時間アルゴリズム
つまり、
現実的な時間で解を求めることができます。

##クラスNPとは
非決定性多項式時間
指数関数時間アルゴリズム
つまり、
解けるけど、現実的な時間で解を求めることができません。
134^1000000000の答えを出せというような問題


###NP完全とは
NPの中で最も難しい問題
10^√2の答えを出せというような問題

###NP困難とは
NP完全と同等以上に難しい問題
NPでない問題も含まれている

##対角線言語
対角線言語とは、いかなるチューリングマシンによっても受理されません。
つまり、決して解けない問題です。
以下に、どのような値が対角線言語であるか説明します。

![画像2.png](https://qiita-image-store.s3.amazonaws.com/0/75241/b8412e50-371e-eb65-eeaa-88101bb4e300.png)
上記の画像を参考に。

画像の帰納的可能言語(帰納的可算問題)とは、
おおざっぱに言うと、
解ける問題をそう定義しているだけです。
(チューリングマシンが受理できれば解けたといえます。)

まず帰納的可算言語(0と1で表した値)をいくつか並べます。
次にその値をビット反転します。
そして、ビット反転した値の対角線の数字を取って並べた値(画像の場合は10011)が対角線言語です。
この対角線言語は絶対に帰納的可能言語の値と一致しません。

#まとめ
・無限には可算無限と非可算無限がある。
・自然数∈整数∈有理数∈実数∈複素数であり、無限の中で自然数の無限が一番小さい。
・クラスPとは時間はかかるけど解ける問題のことである。
・クラスNPとは解けるけどとてつもなく時間がかかるため現実的ではない問題のことである。
・対角線言語とはチューリングマシンで絶対に受理されない。

#おまけ
##テイラー展開とマクローリング展開
解説動画
https://www.youtube.com/watch?v=3AbiJ8cMVtU&feature=youtu.be

#おわりに
色々なサイトを見て自分なりにまとめてみました。
数学の専門家でないため、
まとめ方におかしな部分があればご指摘お願いします。
URLのクッションページを動的に生成

必要になったので作ったが、こういうTIPS投稿サイトに投稿することを念頭に入れてると、jQuery使わない方がいいような気がしてヤキモキしますね……（震え声）
特徴は、このページから飛んだ場合、飛び先でリファラが「about:blank」になるから、足が一切つかないことか。メリットとなる場合もデメリットとなる場合もありそう。
なんか怪しいサイトのために作られたような存在だな……（震え声）

```js:openCushionUrl
function openCushionUrl(url, isOpenInNewTab) {
    if (isOpenInNewTab === void 0) isOpenInNewTab = true;
    var viewUrl = (function(html){
        var elem = document.createElement('div');
        elem.appendChild(document.createTextNode(html));
        return elem.innerHTML;
    })(url);
    var html = "<!DOCTYPE html><html lang=\"ja\"><head><meta charset=\"UTF-8\" /><title>他のサイトへジャンプ</title><style></style></head><body>他のサイトにジャンプします。URLをよく確認し、注意してください。<br><a href=\""+url+"\">"+viewUrl+"</a></body></html>";
    
    var w = isOpenInNewTab ? window.open("about:blank", "_blank") : window;
    w.document.write(html);
}
```
TimeをDateにしたら日付がかわった

# はじめに

```
[1] pry(main)> Date.new(1, 1, 1).to_time.to_date
=> Mon, 03 Jan 0001
```

あ…ありのまま 今　起こった事を話すぜ！
「１月１日だと思ったら　１月３日だった」
な…　何を言っているのか　わからねーと思うが　
おれも　何をされたのか　わからなかった…
頭がどうにかなりそうだった…　催眠術だとか超スピードだとか
そんなチャチなもんじゃあ　断じてねえ
もっと恐ろしいものの片鱗を　味わったぜ…

# 起こったこと

特定のTime型をDate型に変換したら意図しない日付になった。

```
[1] pry(main)> Time.new(1, 1, 1).to_date
=> Mon, 03 Jan 0001
[2] pry(main)> Time.new(1582, 10, 14).to_date
=> Thu, 04 Oct 1582
```

謎すぎる。

# 深追いしてわかったこと

これは、**グレゴリオ暦**と**ユリウス暦**の違いが原因で起こっていた。

### グレゴリア歴とユリウス暦

グレゴリオ暦とユリウス暦はうるう年の計算方法が違う。昔はユリウス歴の計算方法だったんだけど、最近はより正確なグレゴリオ暦が使われているらしい。

Date型には、ほとんどの場合気にしなくていい`.start`というパラメータがあって、これは**グレゴリオ暦をつかい始めた日をあらわすユリウス日**を指している。デフォルトではイタリアがグレゴリア歴に変更した日(1582/10/15)が入っている。先発グレゴリオ歴を示す`Date::GREGORIAN`を指定すると、問答無用でグレゴリオ暦として考える。

```
[3] pry(main)> Date.today.start
=> 2299161.0
[4] pry(main)> Date::ITALY
=> 2299161
[5] pry(main)> Date::GREGORIAN
=> -Infinity
```

`.start`以前はユリウス暦を使って表現されている。

```
[6] pry(main)> d = Date.new(1582, 10, 15)
=> Fri, 15 Oct 1582
[7] pry(main)> d.gregorian?
=> true
[8] pry(main)> d - 1 # 一気に日付がかわる
=> Thu, 04 Oct 1582
[9] pry(main)> (d - 1).gregorian?
=> false
```

どっちの歴を基準にしてるかの違いで、**2月29日があったりなかったりする**。

```
[10] pry(main)> Date.new(1100, 2, 29) # イタリア基準で、1582/10/15以前なのでユリウス暦
=> Wed, 29 Feb 1100
[11] pry(main)> Date.new(1100, 2, 29, Date::GREGORIAN) # 先発グレゴリア歴
ArgumentError: invalid date
from (pry):5:in `new'
```

グレゴリオ歴になった日の直前は、狭間の日になることがある。
狭間の日になる組み合わせの場合エラーになる。

```
[12] pry(main)> Date.new(1582, 10, 4)
=> Thu, 04 Oct 1582
[13] pry(main)> Date.new(1582, 10, 5)
ArgumentError: invalid date
from (pry):17:in `new'
[14] pry(main)> Date.new(1582, 10, 14)
ArgumentError: invalid date
from (pry):18:in `new'
[15] pry(main)> Date.new(1582, 10, 15)
=> Fri, 15 Oct 1582
```

### Time型の歴

Time型は先発グレゴリオ暦を使用するので、問答無用でグレゴリオ暦になる。

```
[16] pry(main)> Time.new(100, 2, 29)
=> 0100-03-01 00:00:00 +0900
```

Time#to_dateの内部実装は、グレゴリオ暦としてのユリウス日を登録したあとに、イタリア基準のstartを設定している。

```lang:date_core.c
static VALUE
time_to_date(VALUE self)
{
    ...
    // GREGORIAN(先発グレゴリオ暦)としてy, m, dを登録
    ret = d_simple_new_internal(cDate,
				nth, 0,
				GREGORIAN, 
				ry, m, d,
				HAVE_CIVIL);
    {
        get_d1(ret);

        // DEFAULG_SG(イタリアのグレゴリオ暦開始日)に設定しなおしている。
        set_sg(dat, DEFAULT_SG);
    }
    return ret;
}
```

Time#to_dateのキャストによって、先発グレゴリオ暦としてのYmdにあたる日をイタリア基準の日で表現してしまっている。なので、**イタリアがグレゴリオ暦を使う以前の日付について、（本当はグレゴリオ暦で設定したのに）ユリウス暦を使うのでずれたように見えている**。日付情報が失われたわけでも壊れたわけでもない。

# けっきょく

`.new_start`を使えば基準日を変更した新しいDateインスタンスを取得できる。`Date::GREGORIAN`を指定すれば、Time型のときに見えていた値になる。

```
[17] pry(main)> d = Date.new(1,1,1).to_time.to_date
=> Mon, 03 Jan 0001
[18] pry(main)> d.new_start(Date::GREGORIAN)
=> Mon, 01 Jan 0001
```

`Time#to_date`でset_sg(dat, DEFAULG_SG)なんてしないですなおにGREGORIANのままインスタンス作ってくれればいいのに。

# 参考
http://docs.ruby-lang.org/ja/2.1.0/class/Date.html
eclipse+gulpでlessを自動コンパイル

# Sassよりlessを選んだ理由

どちらもほとんど触ったことがないのだが、lessを選んだ理由は大きく2つ。

1. Sassよりlessが学習コストが少ないというネット情報(未確認)
2. Bootstrapがlessを採用している

# eclipseでless

私の開発環境はeclipse+aptana pluginなので、これで何とか。aptanaにはSassのエディタがあるが、ここがポイントにならなかった理由は後ほど。
eclipseには幸いなことに**Eclipse plugin for LESS**というプラグインがあり、軽快に編集可能らしい。
このプラグインの利用には、更に**Xtext**というプラグインが必要。
インストール方法はいろんな方が紹介してくれていて、おそらくどれでも失敗なし。

なお、記事作成時のeclipseはluna。
Windows版はpreiades、mac版は素のeclipse。

## Xtext インストール
プラグインのインストールはどれもほぼ同じ手順。
Help -> Install New SoftwareでWork withの右端のAddで下記URLを追加。

http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/

いくつかプラグインがあるが、追加するプラグインは**Xtext**だけで問題ない。
インストール後はeclipseの再起動が必要。

## Eclipse plugin for LESS
手順は同じで下記のURLを追加して、プラグインを追加する。

http://www.normalesup.org/~simonet/soft/ow/update/

**LESS**を追加すればよい。
こちらも、インストール後は再起動を促される。

## ちょっと注意点
以上でlessの編集環境が整うのだが、プラグインがエラーを吐いてびっくりしたので記載。
既存のCSSを利用した場合など、`.less`ファイル内に`@import`と通常のLESS構文があるとエラーが出るので要注意。

# lessのコンパイルにはgulpを使う
lessのコンパイルは、プロダクト化の作業で行うパターンと、HTML送出時にjavascriptで行うパターンがある。コンパイルなしのlessの状態では確認できないため、いずれかの方法を選択することになる。これはSassも同じ。つまるところ、エディタがあろうがなかろうが、そのままではブラウザでは読めない点で、大差がない。

手軽なのは当然、javascriptでのコンパイルで、書きさえすればブラウザ上でcssになって適用される。
だが、ここで問題なのは**「lessを使えないコーダーの存在」**だ。lessのまま放置するとコードを共有できない。
プログラマはいいんだ。すぐわかる、less。すでに書きながらだいたい分かってきた。

というわけで、後でコンパイルしてもいいのだが、どうせならリアルタイムとまでは行かないまでも、保存時にコンパイルできたら便利だ。どうやらeclipseは、コンパイル用のlesscコマンドさえあれば実行モードでコンパイルができるらしい。できるらしい。

いや、わからなかった。久々にわからなかった、やり方が。
eclipseのターミナルから実行可能であれば、それほどウィンドウがとっちらかったりしないので良しとする。ので、ターミナルから起動可能なタスクランナー**gulp**を設定して保存時にコンパイルしている。
ちなみに、**grunt**を選択しなかったのは**gulp**のほうが新しいこと、githubの星の数が1.5倍ほどあること(2015-07-15現在)。
これで、lessのコンパイルだけじゃなくて、もろもろ作業もできる。

gulpのセットアップはいずれ。
なお、**atom**を使うとpluginだけでコンパイルできるあたりがちょっと悔しい。
PHPログ出力クラス


例によって、オレオレフレームワークの一部

log4php に依存しています。
http://logging.apache.org/log4php/

log4j とか log4net みたいに非同期で書き出しができればいいのに…

```php:Log.class.php
<?php

namespace common;

/**
 * Log
 */
final class Log
{

	/**
	 * ログファイルのプリフィックス
	 */
	const PREFIX = 'Message: ';

	/**
	 * Log4php オブジェクト
	 * @var Object Log4phpObject
	 */
	static private $_logger = null;

	/**
	 * ログ設定を取得する
	 * @return array
	 */
	static public function getConfig()
	{
		if (!file_exists(LOG_DIR)) {
			if (!mkdir(LOG_DIR, 0775, true)) {
				throw new SystemErrorException(ExceptionCode::SYSTEM_LOGDIR_ERR);
			}
		}
		$objDate = new \DateTime;
		$date = $objDate->format('Ymd');
		$log = LOG_DIR . "/{$date}.log";

		switch (MODE) {
			case DEVELOPPING:
				$level = 'trace';
				break;
			case TEST:
				$level = 'trace';
				break;
			case PRODUCTION:
				$level = 'info';
				break;
		}

		$option = array(
			'appenders' => array(
				'default' => array(
					'class' => 'LoggerAppenderFile',
					'layout' => array(
						'class' => 'LoggerLayoutPattern',
						'conversionPattern' => '%date{Y-m-d H:i:s,u} %-5level %msg%n'
					),
					'params' => array(
						'file' => $log,
						'append' => true
					)
				)
			),
			'rootLogger' => array(
				'appenders' => array('default'),
				'level' => $level
			)
		);

		return $option;
	}

	/**
	 * ログを書き出す
	 * @param string $strLevel
	 * @param string $strMessage
	 */
	static public function write($strLevel, $strMessage)
	{
		if ((defined('LOGGING') && !LOGGING)) {
			return false;
		}

		self::$_logger = \Logger::configure(self::getConfig());
		self::$_logger = \Logger::getLogger(self::PREFIX);

		$strLevel = strtolower($strLevel);
		if (method_exists(self::$_logger, $strLevel)) {
			call_user_func_array(
				array(self::$_logger, $strLevel)
				, array(str_replace(
					array(PHP_EOL, "\t")
					, ""
					, (is_array($strMessage) || is_object($strMessage)) ?
						serialize($strMessage) :
						$strMessage
				))
			);
		}
	}

	/**
	 * ログファイルの一覧を取得する
	 * @return array
	 */
	static public function getLogFiles()
	{
		$arr = array();
		$resDir = opendir(LOG_DIR);
		while ($fileName = readdir($resDir)) {
			if (".." != $fileName && "." != $fileName) {
				$arr[] = $fileName;
			}
		}
		closedir($resDir);
		sort($arr);
		return $arr;
	}

	/**
	 * ログを取得する
	 * @param string $file
	 * @param integer $line
	 * @param string $grep
	 * @return array
	 */
	static public function getLog($file, $line = 100, $grep = "")
	{
		$res = null;
		$match = null;

		$path = LOG_DIR . "/{$file}";
		$strCommand = "grep '{$grep}' {$path} | tail -n {$line}";
		exec($strCommand, $res);

		$arr = array();
		$resArr = array_reverse($res);
		foreach ($resArr as $log) {
			preg_match('/(TRACE|DEBUG|INFO|WARN|ERROR|FATAL)/i', $log, $match);
			$arr[] = array(
				'level' => (isset($match[0])) ? $match[0] : 'undefined'
				, 'log' => $log
			);
		}
		return $arr;
	}

}

```
CSSの属性セレクタを使ったミスの防ぎ方


以前書いた[ブラウザにガイド線を引くCSSコード](http://qiita.com/volkuwabara/items/c1c97ac2526e3effcade) と同じノリで、開発中に使う系のCSSネタで一つ紹介したいと思います。

## サンプル
ソースコードのうっかりミスやは可視化されない、またバリデーションエラーにならないことが少なくなく、気付きづらいので下図のように可視化したらどうか、という案です。


![cap_ 2015-07-15 2.12.08.png](https://qiita-image-store.s3.amazonaws.com/0/48396/004e1025-36ba-b08c-00d1-44d4156d525c.png)

**Codepenのサンプル**
http://codepen.io/skwbr/full/WvyXGV


## うっかりミスを防ぐためにまずすること

* 開発中だけ使うclassをうっかり本番想定のページにコピペした
* リンクがダミーのまま直すのを忘れた

などのミスを防ぐためにすべきことと言えば...

**TODOコメントやDUMMYを入れるようにする**
* 残タスクや要修正箇所に `<!-- TODO:直す -->` などTODOコメントを入れるようにする。WebStorm等のエディタではリストアップしてくれる。
* リンク先が未決定のところは `href="DUMMY"`と入れる。もちろんTODOコメントを残してもいいが量がいと消すのも大変なので。`href="TODO"`としてもエディタがTODOとして検出しなかったりする。
* href="#"は、JSで`return false`する系と区別つかなくなるので、ダミーという意味で使うのは避ける

**エディタの検索機能であとから洗う**
* 上記のTODOコメントやDUMMYなどの目印を残しておけば、あとからエディタでまとめて作業できます。
 
**よく見直しをする**
* ｳｵｵｵｵｵｵと作業して「できた！」と思った時にもう一度見直しをする習慣は必要です。

**バリデーションチェックする**
* 優れたエディタを使っていても閉じタグ忘れとか、必要属性の欠如とかのミスが完全になくなるわけではないし、これらは見た目に出てこなかったりするので、「[Nu Html Checker](https://validator.w3.org/nu/)」等信頼のおけるバリデーションチェックやリントチェックをする。




## CSSの属性セレクタで問題箇所を可視化する
今回の投稿は、上記の基本的な対応は前提としつつ、こんなやり方もなくはない程度の話です。
CSS3の属性セレクタを使って、

```scss
a[href*="DUMMY"] { // hrefが"DUMMY"のaタグ
}
```

のように問題視する条件に一致する場合に目立たせています。
自分の場合、開発中やサンプルコードでのみ「_sample」「_code」などアンダースコアから始まるclassを使ったりすることがあって、うっかり他のページにソースをコピペしたときに残らないように、

```scss
*[class^="_"] { // "_"から始まるclassを持つセレクタ
}
```

あとは

```css
content: attr(href);
```

のように設定値をcontentプロパティで可視化すると尚分かりやすいかも？


## コード
開発またはチェック時だけ下記のようなSCSSパーシャルをimportしておく、という想定。

```scss:_dev-alert.scss

// mixin定義
// ---------------------------------------------------
@mixin dev-alert($attr:null, $content:"問題があります") {
　$zindex-guide: 999999;
  outline: red 2px solid; //問題箇所を赤く囲む
  @if $attr != null {
    position: relative;   
    &::before {
      position: absolute;
      content: attr($attr); //属性の設定値を可視化
      top: -15px;
      left: 0;
      color: red;
      font-size: 12px;
      display: inline-block;
      z-index: $zindex-guide;
    }
  }
  &::after {
    content: $content; //問題があることを画面最上部で伝える
    display: block;
    position: fixed;
    top: 0;
    left: 0;
    background: red;
    color: white;
    font-size: 10px;
    padding: .2em .5em;
    z-index: $zindex-guide;
  }
}

// 実行
// ---------------------------------------------------
body:not(.module) { //bodyのクラスが".module"の場合は対象外

  //「_」から始まるクラスの混入可視化
  *[class^="_"] {
    @include dev-alert(class, "【注意】「_」から始まるclassが残っています");
  }

  // ダミーリンク可視化
  a[href=""],
  a[href*="DUMMY"],
  a[href*="DAMMY"],
  a[href*="dammy"], 
  a[href*="dummy"],
  a[href*="DAMY"],
  a[href*="damy"],
  a[href*="DUMY"],
  a[href*="dumy"] {
    @include dev-alert(href, "【注意】ダミーのhrefが残っています");
  }
}
```

## 最後に

[Web Developer](https://chrome.google.com/webstore/detail/web-developer/bfbameneiokkgbdmiekhjnmfkcnldhhm) みたいな拡張機能を使えば、もっと高機能なハイライティングができますし、リンク切れチェッカーのようなツールも便利です。
しかしチェックする意思や余裕がないと、これらのツールがあっても使わないだけなので、こちらが何もしなくても「CSSで否応なしに赤くされてしまう」という仕組みにしておけば、作業中に洗うことができるかなと思いました。

ただジャストアイデアなので有用性は定かではないですが、属性セレクタの使い方の応用方法の一つとして。。このスタイル自体消し忘れたら本末転倒なのでご注意ください。
Amazon API GatewayでAWS Lambda関数にクエリ文字列をパラメータとして渡す

2015年7月にAWSより新たに発表されたサービス「Amazon API Gateway」（以下、API Gateway）。
同じくAWSのサービスである「AWS Lambda」（以下、Lambda）の関数を簡単にAPIとして公開することができますが、Lambda関数にパラメータを渡す方法で少し悩んだので、メモを残しておきます。

# 0. 結論

結論から述べると、「Integration Request」の「Input mapping」を設定することで、クエリ文字列をLambda関数のパラメータとして渡すことができます。クエリ文字列の「foo」パラメータを、Lambda関数の「foo」パラメータとして渡す例は以下の通り。

```json
{
  "foo": "$input.params('foo')"
}
```

# 1. Lambda関数を準備する

結論は前述の通りですが、検証方法について以下に示します。

まず、検証用のLambda関数を作成します。今回は以下のコードを使用しました。パラメータが含まれるeventオブジェクトを、そのままレスポンスとして返すだけの簡単なコードです。

```js
exports.handler = function(event, context) {
    console.log(JSON.stringify({event: event, context: context}, null, 2));
    context.succeed({event: event});
};
```

# 2. API Gatewayのメソッドを準備する

検証用に（API Gatewayで言うところの）API、メソッドを作成します。リソース、モデルについては、今回は不要です。
Lambda関数をAPIとして公開したいので「Integration Type」は「Lambda Function」を選択し、Lambda関数が配置されているリージョン、Lambda関数の名称を入力します。

# 3. パラメータのマッピングを設定する

## 3.1. 設定前のテスト

この段階でメソッドのテストを行うと、Lambda関数は以下のレスポンスを返します。パラメータを何も渡していないため、空のオブジェクトが返ります。

```json
{
  "event": {}
}
```

## 3.2. 固定値を渡すテスト

クエリ文字列を渡す前に、固定値をパラメータとして渡すことができるかどうか確認しました。
メソッドの画面から「Integration Request」に遷移し、「Templates」の「Content-Type」に「application/json」を、「Input mapping」に以下のコードを入力します。

```json
{
  "foo": "abc"
}
```

上記の設定を行ってからメソッドのテストを行うと、Lambda関数は以下のレスポンスを返します。

```json

{
  "event": {
    "foo": "abc"
  }
}
```

無事、固定値がLambda関数のパラメータとして渡りました。

## 3.3. パラメータの追加

まずはメソッドにパラメータを追加します。メソッドの画面から「Method Request」に遷移し、「URL Query String Parameters」にてクエリ文字列として与えることができるパラメータを追加します。
今回は「foo」を追加しました。

この段階でメソッドのテストを行っても、テスト画面からは「foo」パラメータを入力することができますが、Lambda関数は相変わらず固定値を返します。

```json
{
  "event": {
    "foo": "abc"
  }
}
```

## 3.4. パラメータのマッピングの設定

メソッドの画面から「Integration Request」に遷移し、「Input mapping」に以下のコードを入力します。

```json
{
  "foo": "$input.params('foo')"
}
```

上記の設定後、メソッドのテストを行うと、テスト画面に入力した「foo」パラメータがLambda関数に渡ります。「foo」の値として「123」を入力した場合のレスポンスは以下の通り。

```json
{
  "event": {
    "foo": "123"
  }
}
```

無事、Lambda関数にクエリ文字列のパラメータを渡すことができました。

# 参考

- [how do you pass a querystring or route parameter to lambda from amazon api gateway - Stack Overflow](http://stackoverflow.com/questions/31329958/how-do-you-pass-a-querystring-or-route-parameter-to-lambda-from-amazon-api-gatew)
- [Day One with the Amazon API Gateway | Hiram Software Blog](https://blog.hiramsoftware.com/blog/day-one-aws-api-gateway/)
Windows(Win7)でGitHubのGitHub Pagesをつかう　その２

[前回](http://qiita.com/siouxcitizen/items/8e0e51fd3dd528246149)投稿したもののつづきです。 また備忘録的にメモしておきます。

###概要
jsdo.itに投稿した、
CreateJS EaselJS 0.6.1 前回コードから戦闘機能を改良　http://jsdo.it/siouxcitizen/cqW8
を GitHub Pages によるWebサイトでホストできるか試してみました。


結果としては GitHub Pages でホストすることができました。 
実際に動いているサイトのURLは　
http://siouxcitizen.github.io/CreateJS_0_6_1RPGLikeGame/CreateJS_0_6_1RPGLikeGame.html
htmlファイル、CSSファイル、Javascriptファイルのあるリポジトリは
https://github.com/siouxcitizen/siouxcitizen.github.io/tree/master/CreateJS_0_6_1RPGLikeGame
です。
参考画像
![JSRPGLikeGame.png](https://qiita-image-store.s3.amazonaws.com/0/51306/af368cea-626a-f22d-8b24-9f0ebe8654e8.png)

##作業参考情報
* jsdo.itではhtmlとCSSとJavascriptのファイルがそれぞれバラバラになっているで、GitHub Pages でホストするにあたり、htmlファイルが中心になって他のCSSファイルとJavascriptファイルをインクルードするようにコードを修正しました
<br>

* htmlファイル、CSSファイル、Javascriptファイルは
文字化けを避けるために「UTF-8(BOM無し)」という文字コードで保存しています
<br>

* 今回作業も[前回](http://qiita.com/siouxcitizen/items/8e0e51fd3dd528246149)「mkdir siouxcitizen.github.io」と「cd siouxcitizen.github.io」
のコマンドでGitHubリポジトリに関連づけつつローカルPCで作成＆使用した
「siouxcitizen.github.io」フォルダを使って行っています
<br>

* [前回](http://qiita.com/siouxcitizen/items/8e0e51fd3dd528246149)同様CUIツール「Git Shell」を使用してコマンドによる作業を行っています


##使用GitHubコマンド
以下に今回GitHubでファイルの新規作成、更新、削除を行うときに使用したコマンドを記しておきます

####ファイル新規作成時コミット　コマンド
>
git add CreateJS_0_6_1RPGLikeGame.html
git commit -m "first commit"
git push origin master

補足
↑一度 -u を設定すればその後は省略可能っぽい　「git push -u origin master」とする必要なし
↑一度 origin をGitHubのURLに関連付ける設定を行っていればその後は origin を指定するだけ
↑
[前回](http://qiita.com/siouxcitizen/items/8e0e51fd3dd528246149)ですでに
「git remote add origin git@github.com:siouxcitizen/siouxcitizen.github.io.git」
「git push -u origin master」
と指定しているので、今回は-uとoriginの設定をしなくても作業を行うことができました


####ファイル更新時コミット　コマンド
>
git add CreateJS_0_6_1RPGLikeGame.html
git commit -m "update second commit"
git push origin master

####ファイル削除時コミット　コマンド
ローカルでCreateJS_0_6_1RPGLikeGame.htmlを削除した後に
>
git rm CreateJS_0_6_1RPGLikeGame.html
git add ./
git commit -m "delete"
git push origin master

##GitHubコマンド参考サイト
commitとpushしかできない人のためのgithubの使い方まとめ
http://myuon-myon.hatenablog.com/entry/20121114/1352906438

削除についてのサイト
githubのファイル削除Add Star
http://d.hatena.ne.jp/hateka/20110804/1312470194
iwaheiもといロックソルジャーのweb(メモ||日記)
http://d.hatena.ne.jp/iwahei0813/20140722/1406030940
サルでもわかるGit入門　基本操作
http://www.backlog.jp/git-guide/reference/basic.html
gitの管理対象から特定のファイル、ディレクトリを削除する
http://qiita.com/ytkt/items/a2afd6be8e4f06c1ea25
GitHubに上げてしまったパスワードを書いたファイルを消す方法
http://qiita.com/iorionda/items/88d6329af997b5c5e748
Laravel PHP を触る


# 環境

* Mac
* Laravel 5.0.0

http://readouble.com/laravel/5/0/0/ja/installation.html を参考にインストールしていきます。


# Composer のインストール

```
$ curl -sS https://getcomposer.org/installer | php
#!/usr/bin/env php
All settings correct for using Composer
Downloading...

Composer successfully installed to: /Users/yoshiyuki_sakamoto/php/composer.phar
Use it: php composer.phar

$ mv composer.phar /usr/local/bin
$ sudo ln -s /usr/local/bin/composer.phar /usr/local/bin/composer
```

動かしてみる

```
$ composer                                                                                                              [master]
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/

...
```

# Laravelのインストール

```
composer global require "laravel/installer=~1.1"
```

`~/.composer/` というディレクトリができたと思います。 `~/.composer/vendor/bin/laravel` を実行できるようにするため、 `/usr/local/bin/laravel` にシンボリックリンクを貼ります。

```
$ sudo ln -s ~/.composer/vendor/bin/laravel /usr/local/bin/laravel
$ laravel
Laravel Installer version 1.2.1

...
```

# 使ってみる

```
$ laravel new laravel-test
Crafting application...

...

Application ready! Build something amazing.
```

これで `laravel-test` ディレクトリが出来上がる。 `public/index.php` がルーティングのphpなので、（index.pxpはpublicの中に置かれるのが一般的なようだ）以下のようにシンボリックリンク張った。

```
$ sudo ln -s /Users/.../laravel-test/public /Library/WebServer/Documents/laravel
```

私のPCにはApacheがインストール済みで、mod_rewrite も有効になっている。これらが有効になっていない場合は有効にして欲しい。
そして、 `localhost/laravel` にアクセスしてみると、真っ白だ…

`storage` ディレクトリ（おそらくログなどのディレクトリ）にApacheの書き込み権限を与えてやる必要があるようだ。Macの場合は、デフォルトのApacheのユーザー名は `_www` だ。ubuntuとかの場合は違ったはず。

```
$ sudo chown -R _www storage
```

これで `localhost/laravel/` にアクセスすると Laravel 5 とだけ書かれたページが表示される。


# 感想とか

まず、 `app` の中身を見てみたが、よくあるような `models`, `controllers` のようなディレクトリはなく、見慣れないディレクトリが存在していた。どうやらviewとかはあるようだ。

`resources/assets` の中には `sass` というディレクトリがある。 `css` ではなくいきなりsassのディレクトリが用意されているのは珍しい...プリコンパイルとかしてくれるのだろうか。

Laravel のベースは Symfony になっているらしく、Symfony を今風にしたような感じらしい。ディレクトリ構造からも、いろいろ便利そうな機能がありそうで好感触である。