OmniAICreator/Qiita-1.07M huggingface dataset:
cap deployでちゃんとデプロイが反映されているか確認する方法

## はじめに
本来あってはならないのですが、syntaxエラーが含まれるRailsアプリをUnicornのGraceful Restartを使ってデプロイすると、アプリケーションは一見動き続けるのですが変更は反映されません。
一見デプロイそのものはエラーが出ないので成功した様に見えるのですが、ここでUnicornに通常の再起動かけたりすると当然のことながら起動すらしなくなります。
よってここでは、デプロイがちゃんと反映されているかCIで確認できるよう、cap deploy中にデプロイが反映されているか自動で確認する方法を示します。

## 仕組み
CapistranoではアプリケーションのトップディレクトリにREVISIONというファイルでデプロイしたコミットのsha1が出力されます。これをアプリケーションから返すようにし、デプロイしたコミットのsha1と比較することで、反映されているか確認します。

## 実装
### 1. 外部からsha1を読み出せるエンドポイントを追加
```rb:app/controllers/misc_controller.rb
  def revision(token: nil)
    raise ActiveRecord::RecordNotFound if token != 'password'
    render text: (File.read(Rails.root.join('REVISION')) rescue 'FILE NOT EXIST')
  end
```

```rb:config/routes.rb
get 'revision' => 'misc#revision'
```

### 2. デプロイ時、デプロイしたコミットのsha1が返されるか確認
```rb:config/deploy.rb
namespace :deploy do
  task :verify do
    require 'uri'
    require 'net/http'
    endpoint = 'http://example.com'
    key = 'password'

    reflect_revision = Net::HTTP.post_form(URI.parse(endpoint + '/revision'), 'token' => key).body.chomp
    if reflect_revision != fetch(:current_revision)
      fail "don't reflect revision. #{reflect_revision} (web) != #{fetch(:current_revision)} (deploy)"
    else
      puts "reflect #{reflect_revision} ok."
    end
  end
end
after 'deploy:finished', 'deploy:verify'
```

### 3. 動作確認
デプロイが反映されていないとCIが落ちます。
Homebrewを使ったzsh導入時に/usr/local/bin/zshを/etc/shellsに追加すべきか


結論からいうとYesです。なぜ必要か調べました。（かんたんです）

例えば、[こちらの記事](http://qiita.com/ykirishima/items/f85902c6039f07d07d48)のように、いくつかのzsh導入記事では`/usr/local/bin/zsh`を`/etc/shells`に追加するような説明がされています。

`/etc/shells`にもともと記載のある`/bin/zsh`と`/usr/local/bin/zsh`の違いを見てみましょう。

```bash
$ ls /bin/zsh 
-rwxr-xr-x  1 root  wheel  573600  1 14 11:13 /bin/zsh

$ ls -l /usr/local/bin/zsh
lrwxr-xr-x  1 shoma2da  admin  25  3 12 09:57 /usr/local/bin/zsh -> ../Cellar/zsh/5.2/bin/zsh
```

`/usr/local/bin/zsh`はHombrew管理下にあるため、`Celler`ディレクトリ以下からのリンクです。
一方でもともとの`/bin/zsh`は、特にリンクなどではありません。

ですので、`/usr/local/bin/zsh`をデフォルトshellとして指定しておかないと、せっかくHomebrewを使って導入したzshを使えません。
設定を忘れると`$ brew upgrade zsh`などしても意味がなくなってしまうので、気をつけましょう。
ズンドコキヨシ with ES2015 (ES6)

前回の記事：[ズンドコキヨシ with JavaScript](http://qiita.com/liburari/items/432fd0f6e31d7367ad73)
まとめ：[ズンドコキヨシまとめ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)

ECMAScript 2015 (ECMAScript 6) の勉強がてらやってみます。前回とは違い、一回ずつ`console.log`していく方式にします。

##ジェネレータを使う

ES2015から追加されるジェネレータに関しては、こちらの記事が参考になりました。
[JavaScript の イテレータ を極める！](http://qiita.com/kura07/items/cf168a7ea20e8c2554c6)
[JavaScript の ジェネレータ を極める！](http://qiita.com/kura07/items/d1a57ea64ef5c3de8528)

ES2015の機能をバリバリ使って書いてみます。

```js:
function* zundokoGenerator() {
  const ZUN = "ズン";
  const DOKO = "ドコ";
  const KIYOSHI = "キ・ヨ・シ！";
  const ENDSTR = ZUN.repeat(4) + DOKO;
  let str = "";
  while (!str.endsWith(ENDSTR)) {
    let zd = Math.random() < 0.5 ? ZUN : DOKO;
    str += zd;
    yield zd;
  }
  yield KIYOSHI;
}

for (let i of zundokoGenerator()) {
  console.log(i);
}
```

使った機能はこちら。

|機能|説明
|---|---
|`function*`|ジェネレータ関数の定義
|`yield`|値を返しジェネレータを一時停止する
|`const`|ブロックスコープ定数宣言
|`let`|ブロックスコープ変数宣言
|`str.repeat(n)`|文字列を`n`回繰り返す
|`str.endsWith(foo)`|文字列が`foo`で終わるかどうか
|`for of`|オブジェクトに対し反復処理を行う


##コードゴルフしてみる

前回の記録は、

```js:
for(z="ズン\n",d="ドコ\n",s="";!s.match(z+z+z+z+d);)s+=Math.random()<.5?z:d;console.log(s+"キ・ヨ・シ！")
```

の95文字、`\n`を抜いても91文字でした。ES2015で苦心してやってみたところ……

```js:
p=t=>console.log(t[0]);f=n=>Math.random()<.5?f(n+1,p`ズン`):(p`ドコ`,n<4?f(0):p`キ・ヨ・シ！`);f(0)
```

89文字！完全に記録更新！

また、推奨はされませんが、`console.log`の返り値がfalsyな値であることが約束されているなら87文字になります。

```js:
p=t=>console.log(t[0]);f=n=>Math.random()<.5?f(n+1,p`ズン`):p`ドコ`|n<4?f(0):p`キ・ヨ・シ！`;f(0)
```

以下わかりやすくしたコード。

```js:
p = t => console.log(t[0])
f = n => {
  if (Math.random() < 0.5) {
    p`ズン`
    f(n+1)
  } else {
    p`ドコ`
    if (n < 4) f(0)
    else p`キ・ヨ・シ！`
  }
}
f(0)
```

ズンが出たらカウントを1増やして再起、ドコが出たら、カウントが3以下ならリセットして再起、4以上なら終了してキヨシ。関数を短く書けることによる再起や、テンプレートリテラルのタグ付けが勝因だったと思います。

使った機能はこちら。

|機能|説明
|---|---
|`=>`|アロー関数（関数の短縮記法）
|`` `foo` ``|テンプレートリテラル
|`` p`foo` ``|タグ付きテンプレートリテラル


##感想

FizzBuzzのコードゴルフをES2015でやろうとしてあまり短くならなかったことがあるのですが、今回はES2015を使って記録更新出来てとても嬉しいです。

##追記１

`f`の呼び出しにもタグ付きテンプレートリテラルを使うことで、もっと短くなりました。

通常版（86文字）

```js:
p=t=>0&console.log(t[0]);f=n=>Math.random()<.5?f(n-~p`ズン`):p`ドコ`|n<4?f``:p`キ・ヨ・シ！`;f``
```

`console.log`が確実にfalsy（84文字）

```js:
p=t=>console.log(t[0]);f=n=>Math.random()<.5?f(n-~p`ズン`):p`ドコ`|n<4?f``:p`キ・ヨ・シ！`;f``
```

##追記２

前回の記事（ES2015使わない方）で82文字、記録更新。

##追記３

コメント欄にて１文字更新。

コードゴルフについてはこちらの記事もどうぞ。
[jsでズンドコキヨシのコードゴルフ(87byte)](http://qiita.com/kikurage/items/8535e757a0cb133571d7)
BeagleBoneBlackにubuntuをインストール

#はじめに

1年ほど前に購入してちょっといじって以来放置していたBeagleBoneBlack．最近3Dプリンタでケースを制作したこともあって引っ張り出してきました．真っさらからいじるためにまずmicroSDにubuntuを入れ直します．
今後も入れ直す機会があるかもしれないので備忘録．

#インストール

windowsのPCを使います．

1. つぎのサイト( http://elinux.org/BeagleBoardUbuntu )からイメージをダウンロードしてきます．windowsからSDカードに書き込むには.imgファイルをダウンロードします．私は ```bone-ubuntu-14.04.3-console-armhf-2016-02-11-2gb.img.xz``` をダウンロードしました．

1. .xzを解凍します．7-zipを使いました．
1. Win32DiskImagerでMicroSDカードに書き込みます．

簡単ですね

#初期設定

電源を投入すると自動的にsdカードから起動する？内蔵のOSと起動時に選択できた気がしますが今回は電源を投入するとそのままubuntuが起動しました．
LANケーブルを繋いでルータのDHCPの履歴からIPアドレスを調べてsshで接続します．ubuntu/temppwdで入れます．


##ユーザアカウント
ユーザの追加 ```sudo useradd -m [ユーザ名]```
パスワードの設定 ```sudo passwd [ユーザ名]```
sudoグループに追加 ```sudo gpasswd -a [ユーザ名] sudo```

##ntpの設定
ntpを入れる ```sudo apt-get install ntp```
設定変更 ```sudo vi /etc/ntp.conf```
同期先のサーバを信頼の```ntp.nict.jp```に変更しました．
```ntpq -p```で同期状況を確認できます．
ズンドコキヨシ with はじめてのHaskell


# ズンドコキヨシとは？

流行ってるらしい
http://qiita.com/shunsugai@github/items/971a15461de29563bf90

ランダムで ズン と　ドコ　を出力し
ズン４回以上のあとドコが来たら　キ・ヨ・シ！　を出力して終了
という勉強にはもってこいの教材


## Haskellを勉強しながら書いてみる

Haskell なくね？
ってことで、HaskellをWebで勉強しながら 書いてみる

モナドってなにーーーー　アクションってなにーーーー　


```hs:zundoko
import System.IO
import System.Random

zun:: Int -> [Int] -> String
zun cnt (0:ran) = "ズン" ++ zun (cnt+1) ran
zun cnt (r:ran)
  | cnt > 3 = "ドコキ・ヨ・シ！"
  | otherwise = "ドコ" ++ zun 0 ran



main :: IO()
main = do
  gen <- getStdGen
  let ran = randomRs(0,1) gen::[Int]
  putStrLn $ zun 0 ran
```

Haskellを勉強しつつ書いているので、改善とか　他のやり方とか教えて下さい！！

## ポイント
初心者らしく背伸びせず、わかりやすい＆関数型を意識したコードを書いたつもりです

関数型を意識し、無限リストと再帰関数で実現
ラムダ等使ってもよかったかもしれないけど　読みやすさ優先です

是非　色々なHaskellコードを見せてくれるとありがたい・・


## 初心者がつまったところ
ほんと初心者で　文法に苦労した・・

まず　パターンマッチとガードのあたりが、細かく理解できず混同させてた
パターンマッチっていうより、同じ名前の特殊化された関数を作っているんですね・・

関数呼び出しは　()や, を使わないのだけど、ついくせで　書いてしまったり

最大に困ったのは
  putStrLn $ zun 0 ran
この部分を 
  putStrLn zun 0 ran
って書いてエラーが出て　エラーをみると　putStrLnに３つの引数を送っていて、かといって
  putStrLn (zun 0 ran)
と書くと怒られる
こういうときに　$ を使うみたいですね

あとは printだと文字化けしました
歌うズンドコキヨシ with Ruby

## 歌うズンドコキヨシ

気づき: キ・ヨ・シ！は歌詞ではなかった

Macのsayコマンドでズンドコ言います。

```rb
class RandomZundokoLyrics
  ZUN_DOKO = ['ズン', 'ドコ']

  include Enumerable

  def each
    loop do
      yield ZUN_DOKO.sample
    end
  end
end

class Kiyoshi
  def sing(lyrics)
    lyrics.each do |word|
      system 'say', word
      yield word
    end
  end
end

class ZundokoKiyoshiFan
  CHANT = 'キ・ヨ・シ！'
  CHANT_TIMING_LYRICS = ['ズン', 'ズン', 'ズン', 'ズン', 'ドコ']

  def initialize
    @words_buffer = []
  end

  def <<(word)
    @words_buffer << word

    if @words_buffer.size > CHANT_TIMING_LYRICS.size
      @words_buffer.shift
    end
  end

  def chant_timing?
    @words_buffer == CHANT_TIMING_LYRICS
  end

  def chant
    system 'say', CHANT
  end
end

def ズンドコ♪
  kiyoshi = Kiyoshi.new
  lyrics  = RandomZundokoLyrics.new
  fan     = ZundokoKiyoshiFan.new
  kiyoshi.sing(lyrics) do |word|
    fan << word
    fan.chant and exit if fan.chant_timing?
  end
end

ズンドコ♪

```

## 実行例

(sayコマンドから音声が聞こえてくる)

## その他のキヨシ

- [ズンドコキヨシ Quine with Ruby](http://qiita.com/hanachin_/items/856ecb53fe486c6d4a12)
- [ズンドコキヨシオートマトン with Ruby](http://qiita.com/hanachin_/items/2242c7bd33af39cc6cab)
- [ズンドコキヨシマシーン with Ruby](http://qiita.com/hanachin_/items/b037b2e602c0bdee6a89)
- [ズンドコキヨシワンライナー with Ruby](http://qiita.com/hanachin_/items/bad105e11ab707fbaf4c)
- [ズンドコキヨシ物語 with Ruby](http://qiita.com/hanachin_/items/055881be542afceca9d9)
バッチファイルでもズンドコ

我々SIerはコマンドプロンプトでもズンドコせねばならない

```bat:zundoko.bat
@echo off

set /A count=0
:here
  set /A rnd=%RANDOM% / 16324
  if "%rnd%"=="0" (
    set zd=ズン
    set /A count=%count%+1
  ) else if "%count%" lss "4" (
     set zd=ドコ
     set /A count=0
   ) else (
     echo ドコ キ・ヨ・シ！
     exit /b 0
   )
  set /p NOLINEBREAK="%zd% "<nul
  goto here
```

けどたまにはｴｽｱｲﾔｰもおまじないを唱えたくなることもある

```bat:zundoko.ps1.bat
@(more +1 "%~f0" & echo. ) | powershell -Command - & exit /b 0

for ($count=0;;) {
  if ($(get-random 2) -eq 0) {
    Write-Host -NoNewLine "ズン "
    $count++
  } elseif ($count -lt 4) {
    Write-Host -NoNewLine "ドコ "
    $count=0
  } else {
    Write-Host "ドコ キ・ヨ・シ！"
    break
  }
}
```

これだけだとそんなに違いを感じられなくてアレだ…
phpによる共通部分のパーツ化。色々試した結論

ヘッダーやフッターなど、共通部分を
includeさせ、更新を楽にしたい。

index.htmlの階層には、

```
<?php include("meta.php"); ?>
<?php include("header.html"); ?>
```

一つ下の階層に、

```php
<?php include("../meta.php"); ?>
<?php $path = "../";include("../header.html"); ?>
```

こうすることで、header.htmlは一つのファイルの更新で済む。

heder.htmlの、hrefなどリンク箇所には、$pathをつけてあげる。

```php
href="<?php echo $path;?>css/style.css"
```

たくさん試したが、一番これがよい。
これだと、local環境でも、サーバーにアップしても、そのままいけそう。


《他にやったこと》

```php
<?php $webroot = $_SERVER['DOCUMENT_ROOT'];
echo $webroot;
$file = __FILE__;
$dir = __DIR__;
$path = realpath( "." );
$dirself = dirname($_SERVER['PHP_SELF']);
echo __FILE__;
echo dirname(__FILE__);
echo dirname(__DIR__) ;
echo __DIR__ ;
echo $path;
echo $_SERVER["SCRIPT_NAME"];
echo dirname($_SERVER["SCRIPT_NAME"]);
echo $_SERVER['PHP_SELF'];
echo dirname($_SERVER['PHP_SELF']);
?>
```

手当たり次第に、パスを取得し、それを生かそうとしたが、ダメだったw

まだまだ実力不足はもちろんだが、
とりあえず一つの結論に落ち着いたので良しとしよう。

もっといいやり方があればどなかた教えて下さい。


《参考url》
http://buburinweb.wp.xdomain.jp/html-php-part
ズンドコジェネレータで、ズンドコキヨシ with PHP

[ズンドコキヨシまとめ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)

ズンドコジェネレータで、普通に実装。

```
<?php
const ZUN = 'ズン';
const DOKO = 'ドコ';

$generator = function () {
    $zundoko = [ZUN, DOKO];
    for (;;) {
        yield $zundoko[mt_rand(0, 1)];
    }
};

$actual = [];
$expected = [ZUN, ZUN, ZUN, ZUN, DOKO];
foreach ($generator() as $v) {
    echo $v;

    $actual[] = $v;
    if (count($actual) > 5) {
        array_shift($actual);
    }

    if ($actual === $expected) {
        break;
    }
}

echo 'キ・ヨ・シ！';
```

実行結果

![1__tmux.png](https://qiita-image-store.s3.amazonaws.com/0/12272/88c387d9-01bc-25f0-9286-1df503e20a4d.png "1__tmux.png")
ズンドコキヨシをJavaで

流行りのズンドコキヨシをJavaで書いてみた。

# Streamで書いてみた

> 2016-03-13追記。　@saka1029 さんの[コメント](http://qiita.com/kazurof/items/affd1e691e7e7a1fed1b#comment-13c2eae2a9d971ca8806)のやり方だと簡潔に書けます。こちらを参考にして下さい。

``` Zundoko.java
import java.util.stream.Stream;

public class Zundoko {
  public static void main(String args[]) {
    StringBuilder sb = new StringBuilder();
    Stream<String> stream = Stream.generate(() -> Math.random() > 0.5 ? "ズン" : "ドコ");
    try {
      stream.peek(s -> {
        System.out.print(s);
        sb.append(s);
        if (sb.toString().endsWith("ズンズンズンズンドコ")) {
          throw new RuntimeException();
        }
      }).forEach(s -> {
      });
    } catch (RuntimeException r) {
      System.out.print("キ・ヨ・シ！");
    }
  }
}
```

むりやりStreamで書いてみたが、終了の判定が例外処理で美しくない。それに終端処理したいがためだけに空の`forEach`をしてるし。[Eclipse Collections](https://www.eclipse.org/collections/ja/) を使えばRuby並に簡潔に行けるかなと思ってちょっと調べたが、そうでもないようだ。（私が知らないだけかもですが）


# マルチスレッドで書いてみた

``` ZundokoThread.java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ZundokoThread {
  public static void main(String args[]) {
    ExecutorService zunSer = Executors.newFixedThreadPool(1);
    ExecutorService dokoSer = Executors.newFixedThreadPool(1);
    ZundokoPool pool = new ZundokoPool(zunSer, dokoSer);

    zunSer.submit(new PutTask("ズン", pool));
    dokoSer.submit(new PutTask("ドコ", pool));
  }
}

class PutTask implements Runnable {
  String text;
  ZundokoPool pool;

  public PutTask(String text, ZundokoPool pool) {
    this.text = text;
    this.pool = pool;
  }

  @Override
  public void run() {
    while (true) {
      try {
        Thread.sleep((long) Math.random() * 100);
      } catch (InterruptedException e) {
        break;
      }
      pool.put(text);
    }
  }
}

class ZundokoPool {
  StringBuilder sb = new StringBuilder();
  ExecutorService zunSer;
  ExecutorService dokoSer;

  public ZundokoPool(ExecutorService zunSer, ExecutorService dokoSer) {
    this.zunSer = zunSer;
    this.dokoSer = dokoSer;
  }

  synchronized void put(String str) {
    if (Thread.currentThread().isInterrupted()) {
      return;
    }
    sb.append(str);
//    System.out.println("debug ->"+sb);
    if (sb.toString().endsWith("ズンズンズンズンドコ")) {
      System.out.println(sb + "キ・ヨ・シ！");
      zunSer.shutdownNow();
      dokoSer.shutdownNow();
    }
  }
}
```

本当は、`Math.random()` を使わないで書くという一発芸を狙ってスレッドで書いてみたが、各スレッドの動作頻度をバラけさせるために結局使ってしまった。重要ポイントは、`InterruptedException`をキャッチしたら　`break`するところだと思う。これをやらないと、キ・ヨ・シ！を出力した後もスレッドの処理が終わらない。また、これをやってもキ・ヨ・シ！出力後に`ZundokoPool#put()`が呼ばれる場合がある。ロックの管理をもっと丁寧に細かくやれば回避できるかな？

2016-03-16追記。`append()`する前に`isInterrupted()`をチェックするようにした。これで、キ・ヨ・シ！出力後はスレッドの処理が終わる確率が上がる。`append()`の処理途中でインタラプトされたらスレッドの処理は進んでしまうから、可能性が上がるだけ。（でも手元で軽く試した範囲では、うまく言っている様子。動作確認に依らず、原理的に解決するにはどうすればよいだろうか。アトミックな何かが必要？

もっと別の書き方ないかなあ。もっと面白い書き方ないかなあ。セミコロンレスJavaもコードゴルフ決して悪くないが新鮮味に欠ける。（実際に書いたほうが絶対的に偉いんだけど。）
ズンドコキヨシ with {k,ba,z}sh and sed

ズンドコキヨシまとめ - Qiita
http://qiita.com/shunsugai@github/items/971a15461de29563bf90

なるほど。

```sh
#!/bin/bash
# or
#!/bin/ksh
z=ズン;d=ドコ;k=($z $d);while :;do echo ${k[RANDOM%2]};done|sed "H;5,\${x;s/\n//g;/^\($z\)\{4\}$d$/{x;s/$/\nキ・ヨ・シ！/;q};s/..//;x}"
```

zsh は以下を足してね。

```sh
[[ -n ${ZSH_VERSION-} ]] && set -o KSH_ARRAYS
```

もしくはこう書き変える。

```sh
z=ズン;d=ドコ;k=($z $d $z);while :;do echo ${k[RANDOM%2+1]};done|sed "H;5,\${x;s/\n//g;/^\($z\)\{4\}$d$/{x;s/$/\nキ・ヨ・シ！/;q};s/..//;x}"
```

Blog のほうがビルドできないので初めて Qiita で書いてみた。
https://fumiyas.github.io/
PHPで使えるdebugライブラリまとめ

PHPで開発するときに画面上に変数等の値を表示してdebugすることがあると思います。
とりあえず`php-ref`、`Kint`、`VarDumper`、`debuglib`、`Chrome Logger`の5つまとめてみました。

## php-ref

マウスクリック + マウスオーバーすることで詳細を見ることが出来る
Kint、dump_r、Krumo、dBug、symfony-vardumperなどを参考に作られている

![ref.png](https://qiita-image-store.s3.amazonaws.com/0/49429/e6c89e67-080f-2fab-0e48-ef34839e9771.png)

https://github.com/digitalnature/php-ref

#### インストール方法
```
{
    "require": {
        "digitalnature/php-ref": "*"
    }
}
```

#### 使い方
```
r($this);
```

## Kint

かなり重いがスタックトレースを出力する機能もある
マウスクリックで詳細を開いていく
キーボード操作等もあり高機能

![kint.png](https://qiita-image-store.s3.amazonaws.com/0/49429/fbdef26f-94d3-dd69-9329-37e150346d98.png)

http://raveren.github.io/kint/
https://github.com/raveren/kint/

#### インストール方法
```
"require": {
    "raveren/kint": "*"
}
```

#### 使い方
```
d($this);
```


## VarDumper

Symfony ComponentsのひとつのVarDumper
機能自体はシンプル

![var_dumper.png](https://qiita-image-store.s3.amazonaws.com/0/49429/6904059d-ecd4-6d71-14a0-847761c57c0e.png)

http://symfony.com/doc/current/components/var_dumper/introduction.html

#### インストール方法
```
"require": {
    "symfony/var-dumper": "*"
}
```

#### 使い方
```
dump($this);
```

## debuglib

機能は非常にシンプル + 分かりやすいです。
ただ情報情報量は圧倒的にすくないです。
後、メンテナンスされてないです。

![debuglib.png](https://qiita-image-store.s3.amazonaws.com/0/49429/490b7e3d-5aab-1566-bf11-87219e9d734b.png)

http://trackspub.com/afa4-tp/dbg/show.htm
https://github.com/everton-ers/debuglib

#### 使い方
```
print_a($this);
```

## Chrome Logger

画面には表示せずブラウザについている開発ツールのコンソールを使用する
PHP,Ruby等様々な言語対応されている

![logger.png](https://qiita-image-store.s3.amazonaws.com/0/49429/9a018560-be6f-23f2-9b4b-c13ad69e477f.png)

https://craig.is/writing/chrome-logger

#### インストール方法
```
"require": {
    "ccampbell/chromephp": "*"
}
```

#### 使い方
```
\ChromePhp::log('Chrome Loggerテスト!!');
\ChromePhp::log($_SERVER);
```

※Chromeで使う場合は、別途エクステンションをインストールする必要があります。
https://chrome.google.com/webstore/detail/chrome-logger/noaneddfkdjfnfdakjjmocngnfkfehhd 

## その他

xdebug等のdebuggerを利用する
初めてGoを触って、スクレイピングっぽいことをしてみるまで


# Go触ってみた

遅ればせながらGoを触ってみたのでまとめてみる。
題材はとりあえずTSUTAYAさんのWebサイトからDVDレンタル情報をスクレイピング、ということにしてみた。
コードを書くトコロはすんなり行ったんだけど、環境面とかお作法的なところでところどころハマったので、自分メモも兼ねてまとめておく。

まだ触って数時間なので、いろいろ間違えてるところがあるかも。ぜひ教えていただきたいです。

# セットアップからHello Worldまで

* OSはUbuntu 14.04

# install

```shell-session
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:ubuntu-lxc/lxd-stable
$ sudo apt-get update
$ sudo apt-get install golang
```

環境変数GOPATHをセットする必要があるが、場所は自由でいいみたい。
$HOME/.goとした

```shell-session
$ mkdir $HOME/.go
$ echo 'export GOPATH=$HOME/.go' >> ~/.zshrc
```

# install vim-go

```shell-session
call dein#add('fatih/vim-go')
```

# hello world

```shell-session
mkdir ~/workspace/hello_go
cd ~/workspace/hello_go
vim main.go
```

```go
package main

import "fmt"

func main() {
  fmt.Printf("Hello world\n")
}
```

```shell-session
# run
go run main.go
=> Hello world

# build
go build
```

# スクレイピングしてみる

TSUTAYAさんのレンタル情報ページ ( http://store-tsutaya.tsite.jp/top/rels/dvd_rental.html )から、DVDのタイトルとレンタル開始日を抜いてきて標準出力に出す。

コードは長くなったのでgithub。
一応、goらしさを出そうと思ってスクレイピング処理はgoroutineで並列処理にしています。

https://github.com/douhashi/dvd_rental_scraper

# ハマったポイント

1. プロジェクトディレクトリをGOPATH以下に置かない
    * 最初GOPATH/src/以下で書いてたんですが、ファイル分けた時にGOPATH以下だとpackageのlocal importが出来ないみたいです。
2. プロジェクトディレクトリ名と同じpackage名にするとgo buildコケる
    * dvd_rental_scraperみたいなディレクトリ掘って←みたいなパッケージ名にして、go buildするとディレクトリがすでにあるよ！みたいなエラーでgo build失敗しました。なのでpackageはtsutayaに変更しています。
ズンドコキヨシ with Vim script

http://qiita.com/shunsugai@github/items/971a15461de29563bf90

ズンドコって言ったら Vim script ですよね。(意味不明)

```vim
scriptencoding utf-8

let s:seed = 0
function! s:srand(seed) abort
  let s:seed = a:seed
endfunction

function! s:rand() abort
  let s:seed = s:seed * 214013 + 2531011
  return (s:seed < 0 ? s:seed - 0x80000000 : s:seed) / 0x10000 % 0x8000
endfunction

vnew
call s:srand(localtime())
while 1
  call append('$', ['ズン', 'ドコ'][s:rand()%2])
  if getline(line('$')-4, '$') == ['ズン', 'ズン', 'ズン', 'ズン', 'ドコ']
    call append('$', 'キ・ヨ・シ！')
    break
  endif
endwhile
```
Visual Studio Codeで最近開いたファイルに移動するコマンド

軽量かつGitなどのdiffが見やすいのでVisual Studio Codeを使っています。
そこそこ大きなライブラリを開く際に開いたことのあるファイルへの移動がしたかったので調べました。

以下の"command"を修正すると自分好みのkeybindingで移動できるようになります。ちなみにデフォルトは`ctrl+tab`という近すぎて押しにくい配置・・！

```json:keyboardbindigs.json
[
  ...,

  {
    "key": "ctrl+u", // 最近開いたファイルの一覧を表示
    "command": "workbench.action.openPreviousEditor"
  },
  {
    "key": "ctrl+u", // ファイル一覧の移動
    "command": "workbench.action.quickOpenNavigateNext",
    "when": "inQuickOpen"
  }

  ...,
]
```

Visual Studio CodeはMarkdownのプレビュー機能といい、おしゃれなEditorですね！
cronでffmpeg

cronでffmpegを動かそうと下記の様な感じにした。

ffmpegの引数が多いので、シェルスクリプトにffmpegの必要なコマンドを書き込み

crontabで下記のように設定

10　10　12　03　sh ffmpeg.sh

時間になっても動いた気配が無い。。

whichコマンドでffmpegのインストール先を調べると/usr/local/binになっていた

これが原因かなと、ln -s /usr/local/bin/ffmpeg /usr/bin/ffmpegやって
シンボリックリンク作ってみたところうまく出来た。

たぶん、ユーザーの権限とかうまく設定すればもっとうまく出来ると思うのだけど。。
ズンドコキヨシ with Swift

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから<br>「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了って関数作ったら満点で単位貰ってた</p>&mdash; てくも (@kumiromilk) <a href="https://twitter.com/kumiromilk/status/707437861881180160">2016年3月9日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# Swiftで書いてみた(Xcode7.2.1&Swift2.1)

```
import Foundation

enum ズンドコ:UInt32 { case ズン,ドコ }
let expected = [ズンドコ.ズン, .ズン, .ズン, .ズン, .ドコ]
var list:[ズンドコ] = []

while(list.suffix(5) != expected.suffix(5)) {
    let val = ズンドコ(rawValue: arc4random_uniform(2))!
    print(val)
    list.append(ズンドコ(rawValue: val.rawValue)!)
}
print("キ・ヨ・シ！")
```

# 実行例

```
ズン
ドコ
ドコ
ズン
ズン
ズン
ズン
ドコ
キ・ヨ・シ！

```
ESLint v2.4.0

前 [v2.3.0] | 次 [v2.5.0]

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">ESLint v2.4.0 released: <a href="https://t.co/awoZwhYCZV">https://t.co/awoZwhYCZV</a><br><br>Includes fix for babel-eslint compatibility.</p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/708407623733813249">2016年3月11日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint v2.3.0 より`babel-eslint`パーサーを併用した時に問題が発生していた不具合への対処がメインです。

以下、機能追加です。

# [#5495](https://github.com/eslint/eslint/issues/5495) `--parser-options`コマンドライン オプション

CLI から構文解析器へ渡すオプションを指定できるようになりました。

```:例
$ eslint test.js --env es6 --parser-options ecmaVersion:7
```

再現コードを Issue に載せるとき、ES6 モジュールや JSX を利用していてもワンライナーで書けるようになるので便利です。

```:例
$ echo "/* problematic code */" | eslint --stdin --rule semi:1 --env es6 --parser-options "sourceType:'module'" --no-ignore --no-eslintrc
```

# オプションが追加されたルール

- [#5332](https://github.com/eslint/eslint/issues/5332) - [no-confusing-arrow](http://eslint.org/docs/rules/no-confusing-arrow) - 式がカッコで囲まれている場合に Arrow + 三項演算子を許可するオプションが追加されました。

[v2.3.0]: http://qiita.com/mysticatea/items/cae686a8bebdfaaa5735
[v2.5.0]: http://qiita.com/mysticatea/items/7018ca26abfa7701debc
ズンドコキヨシ with C

http://qiita.com/shunsugai@github/items/971a15461de29563bf90

C言語版がなかったので：

```C
#include <stdlib.h>
#include <stdio.h>

int main()
{
  int nlz = 0, c = 0;
  do {
    nlz = c ? (nlz + 1) : 0;
    c = (rand() >> 3) & 1;  /* DIRTY HACK */
    printf("%s ", c ? "ズン" : "ドコ");
  } while (nlz < 4 || c);
  puts("キ・ヨ・シ!");
}
```

`/* nlz == number of leading ZUN */`

# 短くしたやつ
```
int n,c;main(){while(n<4||c){n=c?(n+1):0;puts((c=rand()&1)?"ズン":"ドコ");}puts("キ・ヨ・シ!");}
```

もう一歩(-5b)

```
int n,c;main(){for(;n<4||c;puts(c?"ズン":"ドコ"))n=c?n+1:0,c=rand()&1;puts("キ・ヨ・シ!");}
```

[GCC 4.8.2とClang 3.3][wandbox]で実行可能（ただし各種警告は無視するものとする）。変数`n`,`c`は静的記憶域期間を持つため0初期化が保証される。`rand()`が返す下位1ビットで擬似乱数系列分布の質が悪いと、プログラムが終了しない可能性もある。

[wandbox]: http://melpon.org/wandbox/permlink/PvQ1CJz1yvL1Q1WB
ズンドコキヨシ with Objective-C

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから<br>「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了って関数作ったら満点で単位貰ってた</p>&mdash; てくも (@kumiromilk) <a href="https://twitter.com/kumiromilk/status/707437861881180160">2016年3月9日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# Objective-Cで書いてみた

```
    NSString *zun = @"ズン";
    NSString *doko = @"ドコ";
    NSArray *expected = @[zun,zun,zun,zun,doko];
    NSMutableArray *list = [NSMutableArray array];
    NSUInteger loc = 0;
    NSUInteger len = 0;
    
    while (![[list subarrayWithRange:NSMakeRange(loc, len)] isEqualToArray:expected]) {
        int val = arc4random_uniform(2);
        switch (val) {
            case 0:
                NSLog(@"%@",zun);
                [list addObject:zun];
                break;
            case 1:
                NSLog(@"%@",doko);
                [list addObject:doko];
            default:
                break;
        }
        
        len++;
        len = len > expected.count ? expected.count : len;
        loc = list.count > expected.count - 1 ? list.count - expected.count : 0;
    };
    
    NSLog(@"キ・ヨ・シ！");
```

こういうの書いてみるとSwiftの便利さが身に染みますね。。
Zabbixのログ監視を、CloudWatch Logs, Lambda, Chatworkで実現した話

# 概要

Zabbixのログ監視は、CloudWatch Logs, Lambda, Chatworkを組み合わせて実現できます。

DatadogとかMackerelに移行を考えているけど、機能として欠けていて、でも業務には組込まれていて、みたいなのをどうにかしました。

# 注意点

* Chatwork APIが、５分間に100回というヤバい仕様なので、これより明らかに頻度の少ないものだけにしましょう。
* 他は、目立った制約事項はない、、、はず

# 構成

![スクリーンショット 2016-03-12 22.35.07.png](https://qiita-image-store.s3.amazonaws.com/0/22947/1aff8125-52e4-8ace-e024-c65640195ac9.png)

# EC2

CloudWatch Logsエージェントをインストールします。詳細は下記。

* [CloudWatch Logs の使用開始 - Amazon CloudWatch](http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/DeveloperGuide/CWL_GettingStarted.html)

# CloudWatch Logs

ログが取り込まれていることが確認できれば、ここでやることはもう無いです。

# Lmbda

言語はpython。hello-world-python をテンプレに、ちゃちゃっとIAMロールとかも作りましょう。

```py
#coding: UTF-8
from __future__ import print_function

import json
import pycurl
import urllib
import base64
import zlib
import datetime

api_token       = "チャットワークのAPIトークン"
room_id         = "ルームID"
room_message    = "https://api.chatwork.com/v1/rooms/{0}/messages".format(room_id)

def lambda_handler(event, context):
    data = zlib.decompress(base64.b64decode(event['awslogs']['data']), 16+zlib.MAX_WBITS)
    data_json = json.loads(data)
    for log in data_json["logEvents"]:
        log_json = json.loads(json.dumps(log, ensure_ascii=False))
        message = u"[info][title]なんか出たよ！！[/title]" \
            + log_json['message'] \
            + "[/info]"
        option = {'body': message}
        c = pycurl.Curl()
        c.setopt(pycurl.URL, room_message)
        c.setopt(pycurl.HTTPHEADER, ['X-ChatWorkToken:' + api_token])
        c.setopt(pycurl.POST, 1)
        c.setopt(pycurl.POSTFIELDS, urllib.urlencode(option))
        c.perform()
```

仕上げに、LambdaファンクションのEvent sourcesを追加します。ソースはCloudwatchLogsで、お目当てのロググループ名を指定します。

フィルタパターンを設定すれば、特定のキーワードを含んたものが来た時だけ、ファンクションを起動できます。

* [フィルタとパターンの構文 - Amazon CloudWatch](http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/DeveloperGuide/FilterAndPatternSyntax.html)

# ChatWork

通知先ルームを用意するのと、APIトークンを用意する以外、やることは特にないです。

# NG集

...というのを一発で組めたわけではなく、紆余曲折あったのですよと。

## Fluentd入りのEC2 -> ChatWork

Fluentdで、in_tailと、out_chatworkの組み合わせを、最初に構築しましたが、下記の事情で諦めました。

* td-agent、1系をインストール済み。1系では、fluent-plugin-out_chatworkをインストールしてみたものの、なんだか動いてる気配がない
* td-agent、そもそもインストール出来ないやつがいた。32bit版AmazonLinux。
    * CloudWatchLogsエージェントは、32bit版AmazonLinuxにも、スパッと入った

## EC2 -> CloudWatchLogs -> Zapier -> ChatWork

* CloudWatchLogsで、メトリックフィルタとアラートを設定
* アラート発生をトリガーに、Zapierで、ChatWorkに通知します。

これをボツにしたのは、メトリックフィルタとアラートが「出たよ！」しかわからず、通知も「出たよ！CloudWatchLogsの画面を見に行ってね！」しか出せず、イケてないフローだったためです。

## EC2 -> CloudWatchLogs -> Fluentd -> ChatWork

EC2からCloudWatchLogsにログを収集するところまでは、最終形と同じ。

Fluentdに、in_cloudwatchlog、out_chatworkの組み合わせです。

これをボツにしたのは、in_cloudwatchlogは良かったのですが、そもそもCloudWatchLogsのAPIがくっそイケてなくて、更新頻度の低いロググループからだと、同じログを何度でも返してくるため、「ログ監視」みたいなことには全く使えない代物だとわかったためです。
データベースの基礎用語についてまとめ


# 概要

技術動向のトレンドであるビッグデータ、またその先のディープラーニングなどの機械学習においては膨大な情報を取り扱う技術が必要です。つまり、これからの時代、**データベースの必要性は日に日に増していくでしょう**。
この記事ではデータベース初心者の私が引っかかった用語を、他の初心者にわかるように簡単に説明します。誰にでもわかるのを目指しているので、少しでもわからない個所があればコメントください。

# 用語説明

## リレーショナル・データベース（関係データベース）とは

**データベースの構造の一種**。Excelの表のような列と行を持った"テーブル"と呼ぶデータ同士の**"関係"**を定義することで互いに紐づける構造。
データベースの構造には他にも様々なモデルがある※が、設計の簡単さや汎用性の高さからリレーショナル型のモデルが一般的になっている。現在では単に"データベース"と言ったらリレーショナル・データベースを指すことが多い。

※リレーショナル型以外には、ツリー型、ネットワーク型、分散型などのモデルがあるらしい。

## DBMSとは

DataBase Management System：データベース管理システム。**データベースの作成・管理・呼び出し等を行うシステム及びソフトウェア**のこと。

## RDBMSとは

**リレーショナル・データベースを管理するDBMS**を特にRDBMS(Rerational DataBase Management System)と呼ぶ。代表的なソフトは以下。

* Oracle database：Oracleの商品名。
* SQL Server：Windowsの商品名。
* MySQL：オープンソース。

## SQLとは

**RDBMSを操作するための言語**。データベース言語と呼んだり問い合わせ言語と呼ばれたりする。ISOやJISで標準化されているため、基本的にはどのRDBMSに対しても使える。仕様が標準化されているためプログラミング言語から操作する場合もライブラリが見つけやすい。

# 学習のために参考になりそうな情報源

* [SQL講座|Smart](http://rfs.jp/sb/sql)
* [SQLアンチパターン](http://www.amazon.co.jp/SQL%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-Bill-Karwin/dp/4873115892)
SummernoteでcodeviewモードのままSubmitしても送信されない

WYSIWYG editorのSummernote(v0.8.0)を使用した時の不具合対策。

Summernoteで、codeviewモード（HTMLコード表示）の状態のまま
FormをSubmitしても、WYSIWYG内部のデータは送信されませんでした。

GitHubでも報告されているようですが、今のところはPOST前に
一旦codeviewのモードを解除してからPOSTする必要があるみたいです。


```js:サンプル
if ($('ID or Class').summernote('codeview.isActivated')) {
    $('ID or Class').summernote('codeview.deactivate');
}
```

こんな感じで、Submitの直前にcodeview解除してから送信すれば
正しく送信されるようです。


※[Summernote](http://summernote.org/)とは、Bootstrap向けのWYSIWYG editorです。
画像の撮影日時を指定日時から一日ずつ加算するPowerShellScript

ある日付からある日付までの画像がおよぼ二年分必要になったので作った。

事前にexiftoolをインストールしておく

```ps1
choco install exiftool
```

```ps1
#ディレクトリ内の画像の日付をdefaultから一日ずつ加算するスクリプト

#日付操作開始日時
$default = [DateTime]"2015/01/01"
#対象画像ディレクトリ
$list = ls ./yotei

$i = 0
foreach($file in $list){
    $date = $default.AddDays($i).ToString("yyyy:MM:dd 10:00:00")
    $fn = $file.FullName
    exiftool -all= -overwrite_original -DateTimeOriginal="$date" "$fn"
    $i = $i + 1
}
```
Vagrant コマンドラインインターフェース LOGIN

#LOGIN

##command: vagrant login
<a href="https://www.vagrantup.com/docs/other/atlas.html">HashiCorp's Atlas</a>サーバと認証するためのコマンド。
保護されたboxへのアクセス時又は「Vagrant Share」使用時のみに必要。

<b>ログインはVagrantを使用するのに必須ではない。</b>ほとんどのVagrantでログインは不要である。保護されたbox又はVagrant Shareのような特定な機能を使用する時のみログインを必要とする。

このコマンドで利用できるオプションは以下の通り。

####オプション

<dl>
<dt>--check</dt>
<dd>ログインしているかをチェックする。ログインしているか否かを出力するのに加え、ログインしていた場合、exit status 0、ログインしていない場合、exit status 1を返す。
</dd>
<dt>--logout</dt>
<dd>ログインしていた場合、ログアウトさせる。既にログアウトしていた場合は何もしない。既にログアウトしていた場合、このコマンドをコールしてもエラーではない。</dd>
<dt>--token</dt>
<dd>Atlasログイントークンを指定した文字列へセットする。このトークンは有効なAtlasアクセストークンであるとみなされる。</dd>

####例

ユーザIDとパスワードを使い、安全にAtlasへの認証を行う。

```bat:
$ vagrant login
# ...
Atlas username:
Atlas password:
```

カレントのユーザが認証されているかをチェックする。

```bat:
$ vagrant login --check
You are already logged in.
```

トークンを使用し安全にAtlasへの認証を行う。

```bat:
$ vagrant login --token ABCD1234
The token was successfully saved.
```
Laravel nginx 500 エラー！

php artisan serveで動くコードがnginxで500エラー :scream: 
nginxのログを調べた結果、下記の様なエラーが発生。

```php
PHP message: PHP Fatal error:  Uncaught UnexpectedValueException: The stream or file "/XXXXX/laravel/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied in /XXXX/laravel/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php:87
```

ファイル権限周りか！php-fpmの設定を見たら、実行するユーザはwww-data, ユーザwww-dataはlaravel.logファイルを書き込み権限がなし！権限設定忘れ。。。

[Laravel Doc](https://laravel.com/docs/5.1)のDirectory Permissionsを見ると、権限設定について説明がある。やはりDocの勉強不足！
RからMySQLへアクセスする


# ねらい
RからMySQLにアクセスしてデータを取得する．

# 前提
データはMySQLに入れてあります．サンプルとして，平成22年国勢調査（小地域），年齢別（5歳階級，4区分），男女別人口データを使いました．データは[e-stat](http://www.e-stat.go.jp/SG1/estat/eStatTopPortal.do)からダウンロードできます．

![Kobito.yy7vk2.png](https://qiita-image-store.s3.amazonaws.com/0/116877/0c6250e1-c60c-d5d5-08fd-11fecf6e338f.png "Kobito.yy7vk2.png")

ダウンロードしたCSVファイルをMySQLにインポートしてあります．主要なカラムは以下です．

* KEY_CODE：「図形と集計データのリンクコード」とありますが，要は行政区画のコード番号です．
* HYOSHO：行政区画の階層レベルです．1は市区町村レベル，2は町レベル，3は丁目レベルです．
* CITYNAME：市区町村名です．
* NAME：行政区画名です．
* T000573001：人口総計です．

テーブルのイメージは以下です．

![Kobito.saLhUy.png](https://qiita-image-store.s3.amazonaws.com/0/116877/55bbf5b6-f2d2-bc26-bc8b-bf7a16e17cca.png "Kobito.saLhUy.png")

# データベースの諸元
* データベースのあるサーバ：bar.com
* データベース名：foo
* データベースのユーザ名：foo
* データベースのパスワード：bar

# パッケージのインストール

RからMySQLにアクセスするためにはRMySQLというパッケージが必要です．環境に応じてインストールをしてください．依存関係にあるDBIもインストールします．

```
install.packages("RMySQL")
install.packages("DBI")
```

RStudioならメニューから簡単にインストールできますね．

# スクリプト
実際にMySQLにアクセスするスクリプトは以下になります．

```test.r
require("RMySQL")
require("ggplot2")
con <- dbConnect(MySQL(), host="bar.com", port=3306, dbname="foo", user="foo", password="bar")
dataset <- dbGetQuery(con, "SELECT * FROM `tblT000573` WHERE HYOSYO=2") 
ggplot(data=dataset)+geom_histogram(aes(x=dataset$T000573001))
```

RMySQLを`require`し，`dbConnect`でデータベースへのコネクタ`con`を作成します．引数はホストのアドレス，データベース名，ユーザー名とパスワードです．

コネクタを作成したら`dbGetQuery`でクエリを発行します．この例ではテーブル"tbl000573"からHYOSHOが2のレコードを検索しています．
検索結果を`dataset`に格納します．`dataset`はデータフレームになりますので，`dataset$列名`でアクセスが可能です．

`dataset`の中身を確認するとこんな感じです．

![Kobito.YU55ka.png](https://qiita-image-store.s3.amazonaws.com/0/116877/d70e61a9-dc71-53cc-0573-f2974bcc0d2e.png "Kobito.YU55ka.png")

ggplot2でヒストグラムを書いてみました．T000573001は町内の総人口になります．


![Kobito.dzpAox.png](https://qiita-image-store.s3.amazonaws.com/0/116877/de6b43bb-f278-9b5d-4758-191838fc5098.png "Kobito.dzpAox.png")
ズンドコキヨシ with Scheme

ここ数日(というほどでもないが)「ズンドコキヨシ」なるブームが到来しているそうです。せっかくなので、ミーハー気分で参加してみようと思います。ちなみに「ズンドコキヨシ」の存在は以下の記事を見て知りました:[「ズンドコキヨシまとめ」](
http://qiita.com/shunsugai@github/items/971a15461de29563bf90)。ブームの経緯や詳しいレギュレーションなどは当該記事をご参照のほどお願いします。

というわけで意気込んでコーディングを始めたわけですが――結論から先に述べると、はじめのうちは問題文を読み間違っておりました(´・ω・`)。すなわち__「『ズン』もしくは『ドコ』のどちらかをランダムに出力し続けるが、その際ズン⇒ズン⇒ズン⇒ドコという並びが現れた瞬間『キ・ヨ・シ!』を出力して、ループを脱出する」__というように問題を誤解しており、その結果次のようなソースコードが出来上がりました。

```scm
(use srfi-27)

(define (zun-doko-stream)
  (let loop ((ls '())
             (logging 0)
             (i (random-integer 2)))
    (if (= logging 1110)
      (reverse (cons "キ・ヨ・シ!" ls))
      (loop (cons (if (zero? i) "ドコ" "ズン") ls)
            (modulo (+ i (* logging 10)) 10000)
            (random-integer 2)))))

(for-each
  (lambda (s) (begin (display s) (newline)))
  (zun-doko-stream))
```

実行結果は以下の通り。もちろん乱数を使っているので、実行するたびに結果が少しずつ変わります。

```
ズン
ドコ
ズン
ズン
ドコ
ズン
ズン
ドコ
ズン
ドコ
ドコ
ズン
ドコ
ドコ
ズン
ズン
ズン
ズン
ズン
ズン
ドコ
キ・ヨ・シ!
```

改めてながめてみると、なかなかのハードコーディングですね。ちょっと反省(´・ω・`)。もっとも本問について再利用しやすいコードを書くのは結構難しそうですが……。

さて以上のコードを作り終え、ある程度テストも済ませたあと、問題文を読み間違っていることに気がつきました。以下が題意通りの結果を示すコードです。

```scm
(use srfi-1)
(use srfi-13)
(use srfi-27)

; "ズン"と"ドコ"をランダムに並べて、大きさ4のリストを作る
; ex. (list "ズン" "ドコ" "ドコ" "ズン")
(define (make-zun-doko)
  (let loop ((ls '()) (cnt 4))
    (if (zero? cnt)
      ls
      (loop (cons (if (zero? (random-integer 2)) "ズン" "ドコ") ls)
            (- cnt 1)))))

(define (zun-doko-list)
  (let ((last-zundoko (list "ズン" "ズン" "ズン" "ドコ")))
    (let loop ((ls (list (make-zun-doko))))
      (if (list= string=? (car ls) last-zundoko)
        (reverse (cons "キ・ヨ・シ!" ls))
        (loop (cons (make-zun-doko) ls))))))

(for-each
  (lambda (ls) (begin (display ls) (newline)))
  (zun-doko-list))
```

実行結果は以下の通り。こちらも実行のたびに結果が少しずつ変わります。

```
(ドコ ドコ ズン ドコ)
(ズン ドコ ドコ ズン)
(ドコ ズン ズン ドコ)
(ドコ ドコ ズン ズン)
(ドコ ドコ ドコ ドコ)
(ドコ ドコ ドコ ズン)
(ドコ ズン ズン ドコ)
(ズン ズン ズン ドコ)
キ・ヨ・シ!
```
underscoreコードリーディング（isDate）

underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##isDateとは


###[underscorejs.orgのisDate](http://underscorejs.org/#isDate)

こんな説明。
>####__.isDate(object) 
Returns true if object is a Date.

```javascript
_.isDate(new Date());
=> true
```

------------- 
objectがDateだった場合にtrueを返します

###[underscore.isDate](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1218)
コード的にはこのあたり。

```javascript
  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
    _['is' + name] = function(obj) {
      return toString.call(obj) === '[object ' + name + ']';
    };
  });
```

引数はobj
toString.call(obj)した結果が[object Date]と合致した場合はtrueを返す
シングルテーブル継承のコレクションをrenderする

Railsには「設定より規約」の発想で、いろいろ便利な機能がありますが、複数組み合わせるとちょっと予想していなかった挙動をしました。

# シングルテーブル継承とは
Rubyに限らず、オブジェクト指向プログラミングの上で継承は欠かせない仕組みですが、RDBMSと組み合わせるとなると少し複雑となってしまいます。

ただ、RailsのActiveRecordには標準で「シングルテーブル継承（STI）」という仕組みが用意してあって、

* テーブルは親クラスで定義して、すべての子クラスが同じ列を持つ
* （デフォルトでは）テーブルの`type`列を、子クラスの識別に使う[^1]
* ActiveRecordからコレクションとして取ってきた時にも、きちんと子クラスとして取れる

という感じになります。

## コード例
```rb
# マイグレーション
create_table :smart_phones do |t|
  t.string :type
  t.integer :storage
  t.integer :frequency
  t.string :maker
  t.string :version
  t.timestamps, null: false
end

# app/models/smart_phone.rb
class SmartPhone < ActiveRecord::Base
end

# app/models/i_phone.rb
class IPhone < SmartPhone
  # 特有の処理も書ける
  default_value_for(:maker) { 'Apple' }
end

# app/models/android_phone.rb
class AndroidPhone < SmartPhone
end
```

# コレクションの`render`
ビューで使う`render`にはいろんな機能がありますが、コレクションをまとめて表示することもできます。

たとえば`DigitalBook`モデルに対して、コレクションの変数名をモデルのキャメルケース複数形（`@digital_books`）としておけば、`render @digital_books`と書くだけで、「`@digital_books`の各要素を`'digital_book'`というパーシャルで表示する。各要素はパーシャル内から`digital_book`として参照できる」という動作を実現してくれます。

# STIコレクションをまとめて`render`
STIのコレクションをまとめて表示するような場合、子クラス同士がSTIの性質上同じような構造となるので、「全部まとめて同じパーシャルでいい」というような場面もあるかもしれません（実際、そういう「よく似たもの同士」を入れるのに向いた構造ですし）。

実際に、上の`SmartPhone`のようなデータ構造を作って、`_smart_phone`パーシャルを用意した上で`render @smart_phones`としてみたところ、「`_android_phone`のパーシャルが見つかりません」とエラーになってしまいました。どうやら、STIのコレクションを`render`すると、**各クラスごとの**パーシャルを呼んでくれるようでした。

ということで、全部同じでいいような場合は、`render collection: @smart_phones, partial: 'smart_phone'`のように明示的に指定するのが必要だったようです。なお、「本来のモデルに合わせてリンク先を変えたい」ということなら、`polymorphic_path`を使えば、モデルとアクションに合わせてアドレスを設定してくれます。

[^1]: 別な目的で`type`を使いたい場合、[設定変更しておく](http://qiita.com/ryonext/items/1a813639ab2a2a00058e)必要があります。
Lambda + API Gateway で処理の実行がむちゃくちゃ遅くなるケースを調べた


## Lambda + API Gateway の実行に 10秒以上かかることがある
[この記事のコード](http://qiita.com/pm11op/items/c6c25a74fb22cb7b0a9d)、VPC 内で RDS に1行挿入してるだけなのに curl で実行してレスポンス返ってくるまでに 10秒以上かかることがザラにあります。

## どこに時間がかかってそうか
### 怪しいポイントを抑える
* 怪しいポイント1: コンテナ起動のタイミング
	* Lambda はコンテナ上で実行される
	* コールされた時にコンテナがなかったらコンテナ作成から始める
	* 1回コンテナが死んだ後の初期化のタイミングが怪しい
	* → コンテナは 1回立ち上がったら 15〜20分生きているっていう話なので、15〜25分間隔でコールする
* 怪しいポイント2: RDS 接続
	* RDS に接続する際に時間がかかっている可能性もある
	* → RDS に接続するファンクションと接続しないファンクションそれぞれで計測
* 怪しいポイント3: VPC 絡み
	* Lambda は CloudFront 使ってそうなので、VPC 使う場合に無理が出そう
	* → VPC 使うファンクションと No VPC のファンクションそれぞれで計測
* 怪しいポイント4: 言語による違い
	* 使用する言語でコンテナ初期化に有意の差が出そう
	* → ランタイムを nodejs と Python にした場合それぞれで計測

### 計測した組み合わせ・手法
上記の怪しいポイントを調べるため、下記のコードで試してみました。
個人的な親しみやすさから nodejs と Python でしかやってません。

1. nodejs, VPC, RDS 接続して 1行インサートするコード
2. nodejs, VPC, 入力値を返すだけのコード
3. nodejs, No VPC, 入力値を返すだけのコード
4. Python, VPC, RDS 接続して 1行インサートするコード
5. Python, VPC, 入力値を返すだけのコード
6. Python, No VPC, 入力値を返すだけのコード

* [実際に計測に使用したコードはこちら](https://github.com/pm11op/lambda_time_test)
* フレームワークは Serverless を使用
* 上記コードそれぞれを単体で、ある程度の期間毎時 0,15,35分 に curl からコールした 



## 計測結果

||1. nodejs/VPC/RDS|2. nodejs/VPC/No RDS|3. nodejs/No VPC|4. Python/VPC/RDS|5.Python/VPC/No RDS|6. Python/No VPC|
|:-----------:|-----------:|-----------:|-----------:|-----------:|-----------:|-----------:|
|AVG (s)|6.101391304|5.86835443|0.3762264151|1.295380165|1.415769231|0.786875|
|STDEVP|6.327611794|6.100448888|0.3658991325|3.468776883|3.516890337|1.419660767|
|MAX (s)|18.345|18.102|1.794|14.84|14.648|5.465|
|MIN (s)|0.189|0.214|0.208|0.175|0.209|0.225|

意外と明確な差が出ました。
ばらつきが大きいので平均値にあまり意味はなく、
MIN 値を大きく上回る回数が焦点になりそうです。

集計前の全データは[こちら (Google SpreadSheet)](https://docs.google.com/spreadsheets/d/12KPxnEnT46o4SnE51v9RbL15sJ8exa0uCkwBi1R6BWQ/edit#gid=583891249)

## まとめ
* VPC を利用する場合、実行にものすごく時間がかかることがある
* VPC を利用する場合、Python の方が nodejs よりも相対的に速そう
	* そもそも Lambda では非同期処理がさほど意味ない上に遅いのであれば nodejs 使う意味って
	* 単純なコードしか試してないからかもしれないが
* Python 使うにしても REST API で 10秒以上かかるのは許容しがたい
	* 平均値だけ見るとうっかり許容しそうになるけど...
* 時間かかってるタイミングとコンテナ初期化のタイミングが一致するのか調べるべき
	* ランタイムによってコンテナの寿命が違うのか
* 同一プロジェクト内に複数のファンクション作った場合にコンテナは共用されるのか
	* されるのであれば、コンテナ初期化用のファンクションを別に作っておいて、あらかじめ起こしておけば実用に耐えうるかも？
underscoreコードリーディング（isBoolean）

underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##isBooleanとは


###[underscorejs.orgのisBoolean](http://underscorejs.org/#isBoolean)

こんな説明。
>####_.isBoolean(object) 
Returns true if object is either true or false.

```javascript
_.isBoolean(null);
=> false

```

------------- 
objectがtrueもしくはfalseだった場合のみtrueを返します。

###[underscore.isBoolean](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1250)
コード的にはこのあたり。

```javascript

  // Is a given value a boolean?
  _.isBoolean = function(obj) {
    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
  };
```

obj自体がtrueかfalseに合致する、もしくはtoStringしたものが[object Boolean]に合致した場合にtrueを返す。
ズンドコキヨシ with Swift

#元ネタ
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから<br>「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了って関数作ったら満点で単位貰ってた</p>&mdash; てくも (@kumiromilk) <a href="https://twitter.com/kumiromilk/status/707437861881180160">March 9, 2016</a></blockquote>

[様々なズンドコキヨシ](http://qiita.com/B73W56H84/items/519e27a1aed5e6d5304f#あわせて読みたい)

#作ってみる
まあそのままズンドコやっても面白くないから最近お流行りの「ガルパンはいいぞ！」で作ってみたいと思います

```swift
import Foundation

let candidates = ["ガルパン", "は", "いい", "ぞ"]
var createdPhrase = [String](count: candidates.count, repeatedValue: "")

for i in 0 ..< Int.max {
	if createdPhrase != candidates {
		let randomNumber = Int(arc4random_uniform(UInt32(candidates.count)))
		let nextWord = candidates[randomNumber]
		print(nextWord)
		createdPhrase.removeFirst()
		createdPhrase.append(nextWord)
		
	} else {
		print("\(i) times")
		break
	}
}

print(createdPhrase.reduce("", combine: {$0 + $1}) + "！")
```

#出力例

```text
//前略
ガルパン
ぞ
ガルパン
ぞ
ぞ
いい
いい
ガルパン
ガルパン
ガルパン
ぞ
は
いい
ガルパン
は
いい
ぞ
462 times
ガルパンはいいぞ！
```

ガルパンはいいぞ₍₍ (ง╹◡╹)ว ⁾⁾
キヨシチェックをC#とReavtiveExtentionsで書いてみた。

Rxの勉強で[例のキヨシチェック](https://twitter.com/kumiromilk/status/707437861881180160)を書いてみた。
他の言語は[こんな感じ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)みたいです。
ColdとHotの違いがちょっとだけわかった。
もっとうまく書ける気がする(´・ω・`)

追記：
コメントでBuffer使うと良いってアドバイス貰いました。
使ってみたらけっこう良い感じに書けました。

変更後

```csharp
using System;
using System.Linq;
using System.Reactive.Concurrency;
using System.Reactive.Linq;

namespace Zundoko
{
    internal class Program
    {
        private const string Zun = "ズン";
        private const string Doko = "ドコ";
        private const string Kiyoshi = "キ・ヨ・シ！ ((└(:3」┌)┘))";

        private static void Main(string[] args)
        {
            var rm = new Random();
            Observable
                .Interval(TimeSpan.Zero, CurrentThreadScheduler.Instance)
                .Select((x, y) => rm.Next()%2 == 0 ? Zun : Doko)
                .Do(x => Console.Write($"{x} "))
                .Buffer(5, 1)
                .Where(x => x.SequenceEqual(new[] {Zun, Zun, Zun, Zun, Doko}))
                .Subscribe(x =>
                {
                    Console.WriteLine(Kiyoshi);
                    Console.Read();
                    Environment.Exit(0);
                });
        }
    }
}
```

変更前

```csharp
using System;
using System.Reactive.Disposables;
using System.Reactive.Linq;
using System.Threading;
using Reactive.Bindings.Extensions;

namespace Zundoko
{
    internal class Program
    {
        private const string Zun = "ズン";
        private const string Doko = "ドコ";
        private const string Kiyoshi = "キ・ヨ・シ！ ((└(:3」┌)┘))";

        private static void Main(string[] args)
        {
            var ms = new ManualResetEventSlim();
            var rm = new Random();
            var disposable = new CompositeDisposable();

            var zundokoRiver = Observable
                .Interval(TimeSpan.Zero)
                .Select((x, y) => rm.Next()%2 == 0 ? Zun : Doko)
                .Publish()
                ;

            zundokoRiver
                .Do(x => Console.Write($"{x} "))
                .Zip(
                    zundokoRiver.Skip(1)
                    , zundokoRiver.Skip(2)
                    , zundokoRiver.Skip(3)
                    , zundokoRiver.Skip(4)
                    , (one, two, three, four, five) => new {one, two, three, four, five})
                .Where(x => x.one == Zun && x.two == Zun && x.three == Zun && x.four == Zun && x.five == Doko)
                .Subscribe(x =>
                {
                    Console.WriteLine(Kiyoshi);
                    disposable.Dispose();
                    ms.Set();
                }).AddTo(disposable);

            zundokoRiver.Connect();
            ms.Reset();
            ms.Wait();
            Console.Read();
        }
    }
}
```
underscoreコードリーディング（isFinite）

underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##isFiniteとは


###[underscorejs.orgのisFinite](http://underscorejs.org/#isFinite)

こんな説明。
>####_.isFinite(object) 
Returns true if object is a finite Number.

```javascript
_.isFinite(-101);
=> true

_.isFinite(-Infinity);
=> false
```

------------- 
objectが有限数だった場合にtrueを返します

###[underscore.isFinite](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1240)
コード的にはこのあたり。

```javascript
 // Is a given object a finite number?
  _.isFinite = function(obj) {
    return isFinite(obj) && !isNaN(parseFloat(obj));
  };

```

トップレベル関数の[isFinite](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/isFinite)と
[isNaN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/isNaN)を用い、両方がtrueが返ってきた場合のみtrueを返す。
C# と Reactive Extensions でズンドコキヨシ


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから<br>「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了って関数作ったら満点で単位貰ってた</p>&mdash; てくも (@kumiromilk) <a href="https://twitter.com/kumiromilk/status/707437861881180160">2016年3月9日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


流行り？に乗っていくスタイル。


```csharp:Zondoko.cs
var random = new Random();
var K = "キ・ヨ・シ！";
var PATTERN = new string[] { "ずん", "ずん", "ずん", "ずん", "どこ" };

Observable.Interval(TimeSpan.FromMilliseconds(100))
    .Select(_ => (random.Next() % 2 == 0) ? "ずん" : "どこ") // ランダムに ずんorどこ
    .Scan(new List<string>(), (queue, x) => // 最大５つのQueueに貯める
        {
            queue.Add(x);
            while (queue.Count > PATTERN.Count) { queue.RemoveAt(0);}
            return queue;
        })
    .SelectMany(queue => queue.SequenceEqual(PATTERN) ? // パターンと一致したら…
        Observable.Concat(
            Observable.Return(queue.Last()),   // Queueの最後
            Observable.Return(K),              // + キ・ヨ・シ！
            Observable.Return(string.Empty)) : // + 空文字(終了判定用)
        Observable.Return(queue.Last()))
    .TakeWhile(x => !string.IsNullOrEmpty(x))  // 空文字になるまで繰り返す
    .Subscribe(
        x => Console.WriteLine(x),
        () => Console.WriteLine("complete!!"));
```

>どこ
どこ
ずん
ずん
ずん
どこ
どこ
どこ
ずん
どこ
ずん
ずん
ずん
ずん
どこ
キ・ヨ・シ！
complete!!

``SelectMany`` に頼ってるのが気に入らない。。。

* RxJava 版はこちら - [RxJava でズンドコキヨシ(window 使用)](http://qiita.com/amay077/items/2c8575753e37fcc94f87)
* [さまざまなズンドコキヨシ](http://qiita.com/B73W56H84/items/519e27a1aed5e6d5304f#%E3%81%82%E3%82%8F%E3%81%9B%E3%81%A6%E8%AA%AD%E3%81%BF%E3%81%9F%E3%81%84)
* [ズンドコキヨシまとめ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)
underscoreコードリーディング（isNumber）

underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##isNumberとは


###[underscorejs.orgのisNumber](http://underscorejs.org/#isNumber)

こんな説明。
>####_.isNumber(object) 
Returns true if object is a Number (including NaN).

```javascript
_.isNumber(8.4 * 5);
=> true
```

------------- 
objectがnumber(NaNを含む)だった場合にtrueを返します

###[underscore.isNumber](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1218)
コード的にはこのあたり。

```javascript
  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
    _['is' + name] = function(obj) {
      return toString.call(obj) === '[object ' + name + ']';
    };
  });
```

引数はobj
toString.call(obj)した結果が[object String]と合致した場合はtrueを返す
C++で後置インクリメントを演算子オーバーロードする方法

以下のように記述すると，前置インクリメントとして扱われてしまいエラーとなる．

```cpp
class Foo {
public:
    void operator ++() {
        /* code */
    }
};

int main(void) {
    Foo foo;
    foo++; // => エラー
    // ++foo; と書く必要がある!!
    return 0;
}
```

そこで，`int`型のダミーの引数をとってやることによって，後置インクリメントとして扱うことができるようになる．

```cpp
class Foo {
public:
    void operator ++(int) {
        /* code */
    }
};

int main(void) {
    Foo foo;
    foo++; // => エラーにならない!!
    return 0;
}
```

なお，デクリメントについても同様である．
Rademacher Complexityの導入

[understanding machine learning](http://www.cs.huji.ac.il/~shais/UnderstandingMachineLearning/)に出てくるrademacher complexityの導入がなんかしっくり来た。

まずある分布DよりデータSが与えられた時、representativenessという指標を次のように定義する。

```math
\sup_{f \in \mathcal{F}} (L_D (f) - L_S (f) ), \\
L_D (f) = E_{z \approx \mathcal{D}} [f(z))], L_S (f) = \frac{1}{m} \sum^{m}_{i=1} f(z_i).
```

ここで、Fは仮説クラスHが与えられている時、あるサンプルを入力として損失を出力する写像集合。
この指標が０に近いほどデータSによる損失計算が真の分布に基づく損失に迫っているため、正しい評価ができている事になる

ところで真の分布Dは分からないので、実際にこの指標を評価する場合は、交差検定と似たようなノリでデータを切り分けて以下のように近似する。

```math
\sup_{f \in \mathcal{F}} (L_{S_1} (f) - L_{S_2} (f) ), \\
```

S1とS2の切り分け方に関しては、σ1,..,σmを導入しσi=1ならS1、σi=-1ならS2とする。
さらにσの値は{1,-1}の２値一様分布からサンプルされると仮定する。
すると上の表現はもう少し一般化され、さらに期待値を取ると次のようになる。

```math
\frac{1}{m} E_{\sigma \in \{1,-1\}} \left[ \sup_{f \in \mathcal{F}} \sum^{m}_{i=1} \sigma_i f(z_i) \right]
```

これでrademacher complexityが出てくる。
MAMP(localhost)が、接続できない。httpd.conf で解決！！

ブラウザで、localhostを叩いて、でてくるエラーメッセージは下記の通り。

    Forbidden

    You don't have permission to access / on this server.


昨日は普通に使えていたのに。

《考えられる原因》
①外付けハードディスクに、アプリケーションフォルダごと、ドラックアンドドロップでバックアップをとったりしてたら、ポップアップが出ていた。どんな内容かは忘れたが、
原因はそれかな？？

②htdocs内にシンンボリックリンクを作ったりしていた



まぁ。とりあえず解決プロセスを追う。

①まず、ポート番号は問題ない。

②MAMP以外の？macのデフォのapacheが起動してるとうまくいかないことがわかり、
ターミナルから、念のため、オフにする
sudo apachectl stop

たしかにこれをスタートさせると、
MAMPが起動せず、
localhost　と叩くと、
It　works　と表示された。

まぁとりあえずオフにした。


③パーミッションも確認
/Applications/MAMP/htdocs
はもちろん、
/Applications/MAMP　も確認。
読みこみはできるようになっていた。

④httpd.conf 結論的にいうとこれ！
/Applications/MAMP/conf/apache/httpd.conf

246行目
    Order allow,deny
    Allow from None
    XSendFilePath "/Applications/MAMP/htdocs"

ここの、None を、localhost にしたら、治った！！！
ちなみに、Allでも接続できた！！

いじった記憶は全くないが、何か時に変更されてしまったのかもしれない。



《参考url》
http://www.y2sunlight.com/ground/?Apache2%2F5.httpd.conf%A4%CE%CA%D4%BD%B8
http://d.hatena.ne.jp/ema25/20110517/1305611794