OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel でログインの結合テストを書く

簡単だった。さすがLaravel。

テストの無かったアプリケーションに、テストを導入した。
まずはクリティカルなログインをカバーする。

実際にテストを書くよりも、環境作ったり、 `Seeder` 作ったりする過程の方が長かった。
最初から環境が整ってれば別だが・・・。

# 環境

- Laravel 5.1
- PHP 7.0.13

# 対象コード (一部)

普通のログインフォーム。

```php:resources/views/auth/login.blade.php
<form method="POST" action="{{ url('/auth/user-login') }}">
  <input id="email" type="email" name="email" placeholder="">
  <input id="password" type="password" name="password">
  <button type="submit">ログイン</button>
</form>
```

```php:app/Http/Controllers/Auth/AuthController.php 
    // ログイン処理
    public function userLogin(Request $request)
    {
        $credentials = $request->only('email', 'password');

        if ($this->auth->attempt($credentials)) {
            return redirect()->intended('/home');
        }
    }
```

# Factory

適当なユーザーを作るやつ。これ便利だなー。

```PHP:database/factories/UserFactory.php
<?php

$factory->define(App\Models\User::class, function(Faker\Generator $faker) {
    return [
        'name'      => $faker->name,
        'email'     => $faker->unique()->companyEmail,
        'password'  => bcrypt('secret'),
    ];
});
```

# テストコード

すごく直感的。

`DatabaseTransactions` トレイトにより、作成したユーザーは、メソッド終了と同時にロールバックされる。これも便利だなー。

```PHP:tests/Integration/UserLoginTest.php
<?php

namespace Tests\Integration;

use Illuminate\Foundation\Testing\DatabaseTransactions;
use App\Models\User;
use Tests\TestCase;

class UserLoginTest extends TestCase
{

    use DatabaseTransactions;

    public function testUserLoginByEmail()
    {
        $user = factory(User::class, 'student')->create();

        $this->visit('/login')
             ->type($user->email, 'email')
             ->type('secret', 'password')
             ->press('ログイン')
             ->seePageIs('/home');
    }
}
```

```PHP:tests/TestCase.php(一部)
<?php

abstract class TestCase extends BaseTestCase
{
    public function createApplication()
    {
        // testing 環境でもlocal 環境を見に行ってしまうため
        // キャッシュを読み込まないようにしている
        if (file_exists(__DIR__.'/../bootstrap/cache/config.php'))
            unlink(__DIR__.'/../bootstrap/cache/config.php');
    }
}
```

`abstract` にしておかないとPHPUnitがテストしようとしてエラーを吐く。


なお、 `Tests\` という `namespace` は標準で付いていないので、 `composer.json` で `PSR-4` オートローダーを設定する必要がある。

```json:composer.json
    "psr-4": {
      "App\\": "app/",
      "Tests\\": "tests/"
    }
```

[追記]

`autoload-dev` に追加した方が良い。本番のパフォーマンスにわずかに影響するかも？

[/追記]

[さらに追記]

そもそも名前空間を指定しなくて良いという意見もある。指定しないと何となく不安になる、ディレクトリ構造とファイル名が対応しなくなるなどの弊害があるかもしれないが、そもそも PHPUnit がファイルを探してテストを実行するので、オートロードする必要も無い。

[/さらに追記]

# 実行

```
......                              
                                    
Time: 2.15 seconds, Memory: 22.00MB 
                                    
OK (1 tests, 5 assertions)         
```

成功すると気分がいいですね。

# 参考

- https://github.com/laracasts/Integrated/issues/96
- https://github.com/phanan/koel/
- https://github.com/Vuedo/vuedo
スマホからはてなブックマークを効率的に収集するためのRuby DSLを作った


はてブ中毒なので[RubyPico](http://qiita.com/ongaeshi/items/c8400fa49eaeaa307f90)で動くDSLを書いてみました。

[rubypico/hatebu](https://github.com/rubypico/hatebu)

![ファイル 2017-03-13 20 18 00.png](https://qiita-image-store.s3.amazonaws.com/0/3885/540dbc97-b2f6-113e-5221-c3cd8cedc3e5.png "ファイル 2017-03-13 20 18 00.png")

## 特徴
- DSL: Rubyを使って効率的にブックマークを収集
- 履歴: 同じURLを何度も表示しない

特に履歴機能が欲しくて作りました。特定のタグから情報を収集するときに何度も同じURLが表示されてしまうのを防いでくれます。

## インストール
AppStoreからRubyPicoをインストールします。

- [RubyPico - Ruby Programming Environment in iOS](http://rubypico.ongaeshi.me/ja/)

rubypico/hatebu のソースコードを全てダウンロードすればよいのですが、GitHubからソースコードをダウンロードできるライブラリがあるので先にそれをインストールします。

- [RubyPicoGems](https://github.com/rubypico/RubyPicoGems)を参考に`github_download.rb`をインストール
- `github_download.rb`を起動
- `hatebu`を指定してライブラリをダウンロード
  - rubypico/xxxx のレポジトリは xxxx でインストール可能です

## 使い方
1. 以下のスクリプトをRubyPicoの`.app`フォルダ以下に`hatebu`などの名前で置きます
2. Appタブにファイル名が表示されるのでタップして実行します
3. 実行するたびに新しいブックマークが表示されれば成功です。

```
require "hatebu/dsl"

history_file = File.join(Dir.documents, "hatebu", ".hatebu_history")

history(history_file) do
  case rand(100)
  when 0..29
    show category("総合").take(4)
    c = ["テクノロジー", "アニメとゲーム"]
    show category(c.sample).take(3)
    show category("動画").take(2)
  when 30..59
    show tag("ruby").take(3)
    show tag("mruby").take(3)
    show text("docker").take(3)
  when 60..89
    show tag("mac").take(3)
    show title("airpods").take(3)
    show title("airpods", sort: "popular").take(3)
  else
    show category("世の中").take(2)
    show category("政治と経済").take(2)
    show category("暮らし").take(2)
    show category("エンタメ").take(2)
    show category("おもしろ").take(2)
  end
end
```

コメント付きのソースコードです。

```ruby
require "hatebu/dsl"

# ヒストリファイルとして hatebu/.hatebu_history を選択
history_file = File.join(Dir.documents, "hatebu", ".hatebu_history")

# このブロック内は hatebu/.hatebu_history の影響を受ける
# 1. すでに履歴に含まれるURLは表示しない
# 2. ブロックを抜けたときに今回表示したURLを履歴ファイルに追加して保存
history(history_file) do
  # 乱数抽選して以下のどれかを表示する
  case rand(100)
  when 0..29
    # その1: 主要カテゴリから表示
    # 総合の上位4つを取り出して表示する
    show category("総合").take(4)
    # テクノロジーかアニメとゲームのどちらかの上位3つを表示
    c = ["テクノロジー", "アニメとゲーム"]
    show category(c.sample).take(3)
    # 動画の上位2つを表示 (はてブの動画カテゴリ割と好き)
    show category("動画").take(2)
  when 30..59
    # その2: テクノロジタグから表示
    # 興味の矛先はよく変わるので定期的に変更する、今だと"ディープラーニング"とか
    show tag("ruby").take(3)
    show tag("mruby").take(3)
    show text("docker").take(3)    
  when 60..89
    # その3: 趣味タグから表示
    show tag("mac").take(3)
    show title("airpods").take(3)
    # 普段は新着から表示されるがsort: popularだと人気順になる
    show title("airpods", sort: "popular").take(3)
  else
    # その4: 普段見ないカテゴリもたまに表示
    show category("世の中").take(2)
    show category("政治と経済").take(2)
    show category("暮らし").take(2)
    show category("エンタメ").take(2)
    show category("おもしろ").take(2)
  end
end
```

Rubyで書けるので他にも色々できるんじゃないかと思っています。今は曜日毎に表示するタグを変えてみようかな、とか思っています。

## リファレンス
[rubypico/hatebu#reference](https://github.com/rubypico/hatebu) をどうぞ。DSL部分のソースコードは[dsl.rb](https://github.com/rubypico/hatebu/blob/master/dsl.rb)です。
URLと画像と語録だけ書き込めるリアルタイム掲示板を作った

追記　2017/12/24
放置状態だったのでサーバごと止めました。見に来ていただいた方々ありがとうございました。

---
文章を書く必要がない、気軽に使える掲示板を作りました。
名前はURL動物園です。

~~http://url-animal.net/~~

![url-animal_above3.PNG](https://qiita-image-store.s3.amazonaws.com/0/53665/3ed7cf0d-c0a2-addb-1b1f-755a5003af3a.png)

#機能
![url-animal_under2.PNG](https://qiita-image-store.s3.amazonaws.com/0/53665/f6b532c3-e699-2aa8-f624-48446afaf3de.png)
[URL動物園](http://url-animal.net/)はURLと画像と語録（ミーム）だけ書き込める掲示板です。
この掲示板には、掲示板に置いてある素材を組み合わせたものしか基本的に書き込めません。
ユーザが自由に書き込めるのはURLとスレッドのタイトルだけです。

まともな意思疎通は難しい中で、
この動物の鳴き声めいたふんわりコミュニケーションを楽しもうというのがこのサイトの趣旨です。

#使ったものリスト
| 用途 | 使ったもの |
|:-----|------------:|
| ローカル開発環境 | VagrantとVirtualbox |
| サーバサイド | Node.js |
| 静的ファイル配信 | st |
| リアルタイム通信 | Socket.io |
| Socket.ioのセッションストア | Redis |
| その他DB | Mongodb |
|-|-|
| フロントサイドMVC | Mithril |
|タスクランナー|gulp|
|トランスパイラ|webpack|
|CSSフレームワーク|Spectre.css|
他にはFont AwesomeやMoment.js、validator.js、layzr.jsなどを使いました。

#特徴
- リアルタイム感を出したかったのでSPA
- ユーザの投稿内容には素材内容そのものは含めず素材IDだけ（通信量とDB容量節約）
- 各素材を一度読み込めば、1年間キャッシュして使いまわされる（通信量節約）

#今後の課題
- http2やCDNが使えるようなホスティングサービスを利用する
- 各スレのパーマネントリンクの実装
- サイトデザインをどうにかする
- 1つのサーバにDBもアプリケーションも全部詰め込んでいるので負荷が心配

#感想
エンジニアを目指すからには1つぐらいは何か作っておこうと思い、
かねてから作りたかったこのサービスを1ヶ月ほど前から作り始めました。

たくさんあるライブラリやフレームワークを勉強するのは大変でしたが、
使えるようになると大変便利になりました。とても重要です。
特にフロントサイドのMVC。
Mithril使う前は生のJavascriptでひたすらDOM操作していたので、もうほんとに楽になりました。

~~Webサービスの作成も運用も、というかWebサイトを作るのも初めてなので至らない所ばかりだとは思いますが、
ぜひなにか好きなURLでも書き込んでみてください！~~

~~http://url-animal.net/~~
Marpを起動するシェルコマンドを自作した

# はじめに
## Marpとは

マークダウン式でスライドやノートなどの資料を作れるアプリです。
[こちら](https://yhatt.github.io/marp/)からダウンロードできます。
手軽にスライドや講義ノートを作れてとても便利です。

## シェルコマンドとは

ターミナルで入力するコマンドです。
今回は上で説明したMarpをターミナルからファイル名やオプションを指定して起動できたら便利だなぁと思ってシェルコマンドを自作しました。
初めてのbashでいろいろ調べながら実装したので穴があると思います(テンプレート(後述)が存在しないときなど)。
もっと効率的・一般的な書き方などがありましたらアドバイスいただけると嬉しいです。

# 今回作ったコマンド
## Marpを起動

```
marp <file name>
```

指定したファイル名の新しいマークダウンファイルをMarpで開きます。
ファイル名を指定しなければ`untitled`ファイルを開きます。

## `-p`オプション

```
marp -p <file name>
```

`~/templates/marp/presentation.md`に置いているファイルをテンプレートとして指定した名前のファイルをMarpで開きます。
ファイル名を指定しないと`presentation.md`という名前で作成されます。
プレゼンに使うテンプレートを上記のパスに用意しておきましょう。

## `-n`オプション

```
marp -n <file name>
```

`~/templates/marp/notebook.md`に置いてあるファイルをテンプレートとして指定した名前のファイルをMarpで開きます。
ファイル名を指定しないと`notebook.md`という名前で作成されます。
ノートに使うテンプレートを上記のパスに用意しておきましょう。

# 実際のコードと使いかた
## コード

```bash:marp
#!/bin/bash

function usage() {
  echo "Usage: marp [-p | -n] file_name"
}

while getopts "pn" OPTION; do
  case $OPTION in
    p)
      OPTION_p="TRUE"
      ;;
    n)
      OPTION_n="TRUE"
      ;;
    *)
      usage
      ;;
  esac
done

shift $(($OPTIND - 1))

if [ $# -gt 1 ]; then
  usage
  exit 1
fi

if [ "$OPTION_p" = "TRUE" ]; then
  if [ $# -ne 0 ]; then
    FILE_NAME=$1
  fi
  cp ~/templates/marp/presentation.md ./$FILE_NAME
  open -a "/Applications/Marp.app/" ${FILE_NAME:-presentation.md}
  exit 0
fi

if [ "$OPTION_n" = "TRUE" ]; then
  if [ $# -ne 0 ]; then
    FILE_NAME=$1
  fi
  cp ~/templates/marp/notebook.md ./$FILE_NAME
  open -a "/Applications/Marp.app/" ${FILE_NAME:-notebook.md}
  exit 0
fi

if [ $# -ne 0 ]; then
  FILE_NAME=$1
  touch $FILE_NAME
fi

open -a "/Applications/Marp.app/" ${FILE_NAME:-}
```

## コマンドを有効化

- 上記のコードを書いたファイルを`~/bin/marp`に置く。
- `~/.bash_profile`に`PATH="$PATH:$HOME/bin"`の一行を追加する。
- シェルを再起動する(`export PATH="$PATH:$HOME/bin"`を実行してもOK)。
- テンプレートの例は[ここ](https://github.com/snowman-mh/templates/tree/master/marp)を参考にしてください。
Vue.js で、c3.js の Object を data に入れたら構造が変わった件

#経緯

1. c3.js でグラフを描画するComponentを作ろうとした
2. c3.js の Object を後のイベントで更新するために、component の data に入れた
3. なんか色々methodoが消えてる！！

【例えばこんな感じ】

```js
/**
 * Created by usr16001231 on 2017/03/13.
 */
Vue.component(
    'chart',
    'template' : '#chart'
    {
        props: ['chart_data'],
        data: function () {
            return {
                chartObj: null
            }
        },
        mounted: function () {
            this.chartObj = c３.generate({
                // 初期データ
            });
        },
        watch: {
            chart_data: function () {
                // Chart を更新する処理
            }
        }
        /** 以下省略 **/
    }
);
```

#原因

1. Vue.js では data にセットされた値の更新なおを検知するため、設定したObjectの中身を更新します
2. Documentにも**「オブジェクトはプレーンなものでなければなりません」**と ちゃんと記載されていました
3. ちなみに Component の Props も同じ

#教訓

1. やっぱりDocumentはちゃんと読みましょう

#その他

1. こういう時ってそうするのが一番いいんでしょうね？
Django事始め: 4_MySQL連携


# 目次
[Django事始め: 1_環境構築](http://qiita.com/roy29fuku/items/3fae6a1b474676cdb703)
[Django事始め: 2_プロジェクト作成](http://qiita.com/roy29fuku/items/306399ca5eb6f63ed691)
[Django事始め: 3_Apache連携](http://qiita.com/roy29fuku/items/578de62fbdd65f8ffbaa)
[Django事始め: 4_MySQL連携](http://qiita.com/roy29fuku/items/519becda21565e5a71a3)


前回はApacheと連携してDjangoでつくったプロジェクトを外部に公開する準備ができました。
まだまだ実際のプログラムは書かずに環境構築を続けます。
今回はDB設定を変更します。

DjangoはデフォルトでSQLiteを使用します。
非常に手軽にプロジェクトを始められる（設定要らず）メリットがある一方、
後々MySQLに移行するとなると今以上の手間がかかります。
辛いことは最初にやってしまいましょう。

[Djangoのデータベースをsqlite3からMySQLに移行したときにハマったこと](http://d.hatena.ne.jp/saitodevel01/20110102/1293986322)

特に僕はテキスト解析関連をやる予定なので、大量のデータを扱うのにSQLiteは向いていない、とどこかで読んだので設定を変更することにしました。
あとMySQLは慣れ親しんでいたので。

SQLiteとMySQLの違いについてピンとくる記事が見つけられなかったので、もし良い記事や書籍があれば紹介頂けたら幸いです。
軽くですが、こちらに違いが書いています。
[レンタルサーバーで使えるデータベース管理システム一覧](http://rentubtalk.com/server-column/list-dbms/)


# 環境
- CentOS 7.1
- Apache 2.4.6
- pyenv 1.0.7
- anaconda 3-4.3.0
- Django 1.10.5
- MariaDB 5.5.52

*CentOS組み込みのMariaDBを使っています。
MariaDBはMySQLの派生として生まれました。
5.5まではMySQLとあまり変わりないとのことで、こちらを使っています。
[長年の議論に終止符 -- MySQLとMariaDBの違い一覧](http://d.hatena.ne.jp/interdb/20130918/1379441784)


# MariaDBインストール
```
yum install mariadb mariadb-server mariadb-devel
```

# 設定ファイル編集
mysqlの設定ファイルを開きます。
日本語を扱う場合は文字コードを指定しましょう。

```
vi /etc/my.cnf
```

[mysqld]の下に以下追記

```
character-set-server = utf8
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
```

加えて以下まるまる追記

```
[client]
default-character-set = utf8
```

設定を反映するため再起動しましょう。

```
systemctl start mariadb
systemctl enable mariadb
```


# 初期設定
いろいろ聞かれるので答えていきます。

```
mysql_secure_installation
Enter current password for root (enter for none):  # 初期設定はブランク。そのままエンターを押せば良いです
Set root password? [Y/n] y
New password: # 任意のパスワード
Re-enter new password:: # パスワード確認
```

以降の質問は全て「y」でOKです。

パスワード付きでmysqlを実行します。

```
$ mysql -u root -p
Enter password: # 先ほど設定したパスワードを入力します
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 789
Server version: 5.5.47-MariaDB MariaDB Server

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
```

ではDjango用にデータベースを作成します。

```
MariaDB [(none)]> create database xxx;
MariaDB [(none)]> exit;
```

これでDB側の設定は完了です。
あとは、このDBをDjangoに認識させます。

# Django設定
設定ファイルを開きます。

```
vi settings.py
```

```
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'xxx',  # 先ほど作成したDB名
        'USER': 'root',  # mysqlのユーザ名（セキュリティ的にはrootはNGです。適宜変更しましょう）
        'PASSWORD': 'pass',  # mysqlのパスワード
        'HOST': '',  # ホストIP
        'PORT': '',  # ポート
    }
}

...

TIME_ZONE = 'Asia/Tokyo'
```

HOSTとPORTはローカルホストのDBでデフォルトのポートを使用しているなら空で問題ありません。


# モジュールを追加する

```
pip install PyMySQL
```

*python2ではpython-mysqlが使われていたが、3非対応らしいです。


manage.pyに追加したモジュールを使うよう指示します。


```
vi manage.py 
```

```
import pymysql
pymysql.install_as_MySQLdb()
```

マイグレーションを作成して実行してみましょう。

```
python manage.py makemigrations
python manage.py migrate
```



# 参考
[Python3 + Django で MySQL に接続](http://qiita.com/aeas44/items/90c867aa2d02f9047ef0)
理化学研究所脳科学総合研究センターによる，脳とディープラーニングの情報処理の違いについて

下記にありますように @hori1537 様から

> 著作権法違反の無断転載にあたるのではないでしょうか。
適切な引用とは考えにくいです。

<!-- 感想 -->

というコメントを頂きましたので，引用を削除いたしました．

つきましては，理化学研究所脳科学総合研究センター　『[つながる脳科学](http://amzn.to/2mZXn4Q)』　講談社，2016年， 161頁, 188頁 をお読みいただけたらと考えます．
network > port mapper > (IP1,2,3: Port A)を(IP4: Port C,D,E)に変換する

```txt:動作環境
ホストOS: Windows 10 Pro (64bit) Anniversary Update適用済
VMware Workstation v12.5.1
+ linux (CentOS 6.XもしくはUbuntu 14.04など)
```

![](http://yuml.me/diagram/class/[IP 0]<-->Port A[IP 1])
![](http://yuml.me/diagram/class/[IP 0]<-->Port A[IP 2])
![](http://yuml.me/diagram/class/[IP 0]<-->Port A[IP 3])

を以下に変換するとテストがしやすくなりそう。二台のゲストOSでテストができる。ここで、それぞれのIP上ではWindows 7を使う。

![](http://yuml.me/diagram/class/[IP 0]<-->Port C[IP 4])
![](http://yuml.me/diagram/class/[IP 0]<-->Port D[IP 4])
![](http://yuml.me/diagram/class/[IP 0]<-->Port E[IP 4])

下から上に変換する場合はvmwareでのThe [incomingudp(受信ポートの割当て)] を設定すればいい気がする。
http://griffonworks.net/freebsd/vmware/nat.html

上から下に変換する場合は、思いつく方法の一つはIP1,IP2,IP3に対してゲストOSをそれぞれ用意して、そこから転送する方法。
軽量linuxを立ち上げて、tinyコードを走らせることはできそう。

Pythonコードなど必要かと思ったが、netcatコマンドでもできそう。
http://stackoverflow.com/questions/11350145/are-there-simple-descriptions-on-port-forwarding-using-python

それぞれゲストOSを用意せずとも、もっと簡単に(少メモリ消費で）できる方法もありそうな気はする。

ゲストOS１つに複数のNICを追加して、それぞれの転送をすればいいような気もする。

### 転送の方法が見つかった
(追記 2017/03/14)

http://qiita.com/7of9/items/e1e6337c49d279b925e0
に記載の通り、socatを使えば転送できそう。

ゲストOS１つに対して以下のようにする。

- 複数のNICを有効にする
   - ホストオンリーでいい
- それぞれのNICに対して転送コマンドを実行する

```
$ sudo socat UDP4-RECVFROM:6000,fork,bindtodevice=eth0 UDP4-SENDTO:192.168.3.141:7000
$ sudo socat UDP4-RECVFROM:6000,fork,bindtodevice=eth1 UDP4-SENDTO:192.168.3.141:7010
$ sudo socat UDP4-RECVFROM:6000,fork,bindtodevice=eth2 UDP4-SENDTO:192.168.3.141:7020
```
Jenkins xcode-plugin の Versioning が効かない場合は

# 結論から
xcconfigファイルや pbxprojファイルに書く `INFOPLIST_FILE` で、$(SRCROOT) のような環境変数を使わない。
相対パスで書く。

# 理由
Jenkins xcode-pluginが環境変数を認識してくれず、Technical Version / Marketing Version が更新されないから。
https://issues.jenkins-ci.org/browse/JENKINS-18181

# 背景
- Info.plistをTarget毎に分ける
- 別のプロジェクトをベースに新しいプロジェクトを作った

など Info.plistの位置がデフォルトではないケースで、（おそらくXcodeが自動的に）$(SRCROOT)付きのパスが指定されていたのだが、`CFBundleVersion` がJenkinsで指定したものに変わらなかった。

# 動作環境
- Jenkins 2.48
- Xcode Plugin 1.4.11
java8 の forEach を index つきで使いたい

java8 の forEach メソッドを使う際、インデックス（連番）がほしい場合があります。そのとき、カウンタ変数を使おうとするとラムダ内で更新できないので、配列を使うなどしないといけません。

```java:こうしたいができない
int i = 1;
java.util.stream.Stream.of("a", "b", "c", "d").forEach(s -> {
  System.out.println(i + ": " + s);
  i++;
});
```

```java:こうならできる
int i[] = { 1 };
java.util.stream.Stream.of("a", "b", "c", "d").forEach(s -> {
  System.out.println(i[0] + ": " + s);
  i[0]++;
});
```

どちらにしても見通しがよくないので、こんな感じにしたい。

```java:こうしたい
java.util.stream.Stream.of("a", "b", "c", "d").forEach(withIndex((s, i) -> System.out.println(i + ": " + s)));
```

ということで、ユーティリティメソッドを作ってあげます。

```java:クラス名、メソッド名は適当
import java.util.function.Consumer;
import java.util.function.ObjIntConsumer;

public class With {
  public static <T> Consumer<T> B(int start, ObjIntConsumer<T> consumer) {
    int counter[] = { start };
    return obj -> consumer.accept(obj, counter[0]++);
  }
}
```

初期値も設定できるようにしました。

```java:できた
java.util.stream.Stream.of("a", "b", "c", "d").forEach(With.B(1, (s, i) -> System.out.println(i + ": " + s)));
```

```:実行結果
1: a
2: b
3: c
4: d
```

[注意] streamで並列実行する場合は forEachOrdered を使う等工夫してください。

以上
ProcessingでMouseListenerを使う

# MouseListenerとは

`java.awt.event.MouseListener` (引用元 : [MouseListener (Java Platform SE 8 )](https://docs.oracle.com/javase/jp/8/docs/api/java/awt/event/MouseListener.html) )

> コンポーネント上の「関連する」マウス・イベント(プレス、リリース、クリック、フォーカス取得、フォーカス喪失)を受け取るためのリスナー・インタフェースです。マウスの移動およびドラッグを追跡するには、MouseMotionListenerを使用します。

簡単に要約するとマウスのクリックや、ドラッグ等を検知してくれるインターフェイスです。

## 実装方法

> マウス・イベントの処理に関連するクラスは、このインタフェース(および含まれているすべてのメソッド)を実装するか、抽象クラスMouseAdapterを拡張します(関連するメソッドだけをオーバーライド)。

> そのクラスから作成されたリスナー・オブジェクトは、コンポーネントのaddMouseListenerメソッドを使ってコンポーネントに登録されます。

1. `MouseListener` インターフェイスを実装するか、 `MouseAdapter` を拡張する。
2. `addMouseListener` メソッドを使ってコンポーネントに登録する。

この2.の処理は『登録されます』と書いてありますが、実際には自分で記述する必要があります。

# JavaでのMouseListener

```java	
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;

public class EventTest extends Applet implements MouseListener{
  public void init(){
    addMouseListener(this);
  }

  public void mouseEntered(MouseEvent e){
  }

  public void mouseExited(MouseEvent e){
  }

  public void mousePressed(MouseEvent e){
  }

  public void mouseReleased(MouseEvent e){
  }

  public void mouseClicked(MouseEvent e){
  }
}
```

引用元 : [Javaでのイベント処理方法 - イベント処理 - Javaアプレット入門 - JavaDrive](http://www.javadrive.jp/applet/event/index1.html)

これを参考にProcessingでも `MouseListener` インターフェイスを実装したクラスを作成していきましょう。

`addMouseListener` は `java.awt.Component` のメソッドです。

> public void addMouseListener(MouseListener l)

> このコンポーネントからマウスイベントを受け取るために、指定されたマウスリスナーを追加します。

引用元 : [Component (Java Platform SE 8 )
](https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Component.html)

## Processingで書こう

`this.surface.getNative()` は `processing.awt.PSurfaceAWT.SmoothCanvas` のインスタンスを返します。これは `java.awt.Component` のサブクラスなので、 `addMouseListener` をすることができます。

```java
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.awt.Component;

void setup() {
  size(300, 300);
  Component component = (Component) this.surface.getNative();
  component.addMouseListener(new MyMouseListener());
}

void draw() {
}

class MyMouseListener implements MouseListener {
  @Override
  public void mouseClicked(MouseEvent e) {
    println("Clicked");
  }

  @Override
  public void mouseEntered(MouseEvent e) {
    println("Entered");
  }

  @Override
  public void mouseExited(MouseEvent e) {
    println("Exited");
  }

  @Override
  public void mousePressed(MouseEvent e) {
    println("Pressed");
  }

  @Override
  public void mouseReleased(MouseEvent e) {
    println("Released");
  }
}
```
administrateをtypusと比較してみた

最近、administrateという、管理画面生成のgemの噂をちらほらと聞くようになりました。
これまで、active adminやtypusなどの管理画面生成gemを使ってきて、各々問題点を感じていたので、これを解決する希望を感じて触ってみた結果の報告です。

現在はtypusを主に使用して管理画面の生成を行なっているので、これとの主な比較になりますが、結論だけ先に書いている話です。

## 結論

先に書いておくと、administrateは使用可能なgemですが、現時点では、機能の数でtypusにもactive adminにも届いていないgemですので、現時点では、typusから乗り換えるつもりは無い。

だけど、機能的に下の部分は実装されれば今後はadministrateを使っていくのが望ましいです。

* dashboardの機能
* has_one,has_manyの関連に関する作成、更新画面
* ログイン周りの作成工数を軽減してくれるdevice/cancancanなどへの連携gem
* I18nの作業漏れがなくなっている。

※ I18nに関しては、ある程度抜けがあっても比較的低い工数でこちら側でも上書き可能なので、完全は求めません。

以上。あとは細かい話なので読まなくても良いです。

## 実際の比較

実際の比較。

administrateは、そもそもコンセプトとして

* DSLを使った設定方法を使わない
* Railsの標準的なやり方に近い方法で上書きする方法を提供する
* コアな機能とそのほかを分離しておいて、機能を小さくメンテナンスしやすい形で提供する

という方針を貫いています。

ほとんどカスタマイズが効かないRailsAdminはおいておいて、これはActiveAdminやtypusのやっている領域をど真ん中で打ち抜いてきた感じですが、触って見た感想として、未実装の機能はあるが、できている範囲を見る限りそのコンセプトに対して非常に"***良い設計感***"を持って対処できていると言えます。
この辺は、オススメです。

実際にカスタマイズを行おうとすると、今までのRails"っぽい"やり方を提供しているので、機能に関して学習コストが低いですし、そもそもカスタマイズの幅に限界があって、なんとかしようとすると、本来カスタマイズしたい場所以外を巻き込んが広い変更を行うことになったり、そこで意図と腸捻転したカスタマイズが発生したりすることが発生しない様に出来ています。

ただ、現在はそもそも関連に関する機能が未実装部分が多すぎて、typusを使っていれば、カスタマイズの際にバグを踏みやすいなどの欠点を持ちつつも、一応関連の機能は実装されていて、大体の場合に使いやすいですが、
この辺り、実際いるだろ、という需要ある機能の実装が後回しにされてしまっていて、自分で実装するコストが大きいのは問題を感じています。

現在は、ダッシュボード、関連周りの機能を自分で実装するコストの方が、他のgemを採用して苦労するコストより高い状態なので、私は移行しませんが、typusには色々と**煮え湯**を飲んできた経験があるので、それをきちんと解決したAdministrateは将来的に移行するつもりで待ち構えています。

日本語のymlファイルとか、deviceとAdministrateを連携してくれるgemとか、周辺環境を他の人が整えておいてくれると早く幸せになれるので、そういうの募集中です。

あと、Administrateはpre1.0のgemなので今後も非互換な変更が着々と入る可能性などがあります。
…ですけど、経験として管理画面生成gemはそもそもカスタマイズの幅の無いRailsAdminを除いて、Railsバージョンアップに合わせて、毎度なんらかの不具合を出し続けているので、そもそも設計に関して正解の提出されていない管理画面生成gemはそういうのに付き合わされる具合はそんなに変わらないと思って良いと思いますよ。
Android SDK Tools 25.3 はどこからダウンロードされているのか

2017-03-13 現在、Android Studio を使ったり sdkmanager を使ったりして Android SDK Tools をインストールすると 25.3.1 がインストールされるけど、[SDK のダウンロードページ] を見に行っても 25.2.3 しかなく、CI 環境などでゼロからセットアップするときにどうやって 25.3.1 をインストールすればいいのか悩んだので sdkmanager がどこからダウンロードしているのか調べた。

これまでの android コマンドは https://dl.google.com/android/repository/repository-11.xml のように `repository-$N.xml` を見に行っていたが、この中に 25.3.1 は無い。そもそも Android SDK Tools 25.3.0 から [android コマンドは廃止されている]。
sdkmanager の通信を適当にキャプチャして調べると、どうやら https://dl.google.com/android/repository/repository2-1.xml に変わったようだった。ここを見ると sdkmanager がどこからダウンロードしているのか分かる。

XML だと人間には読み難いので以下のようなコードを書いた。XML をデシリアライズするのに Go は楽ですね。
`sdkmanager --verbose --list` でもある程度情報が出るけど、アーカイブについての情報は表示してくれない……
https://gist.github.com/eagletmt/73a0d33d3d9c2aeb31c30ee05fed528b

[SDK のダウンロードページ]: https://developer.android.com/studio/index.html
[android コマンドは廃止されている]: https://developer.android.com/studio/releases/sdk-tools.html
ConfigSlurperでClosureを読み出せた件

言いたい事はタイトルの通りです
実際使えたコード例を示します

```groovy
def cs=""
cs+="value={->"
cs+="println 'This is from Closure'"
cs+="}"
def obj=new ConfigSlurper().parse(cs)
println "Running Closure..."
obj.value()
```
この場合、プログラム終了時点での`cs`の値は

```groovy
value={->println 'This is from Closure'}
```
となります。`\n`は無いので改行はありません。

出力はもちろん

```
Running Closure...
This is from Closure
```
こうなります。
`println "Running Closure..."`は、Closure内部で実行されていることを確認するために入れています。
<strike>ideoneで出力を示そうと思ったのですが、なぜか使えませんでした</strike>
ConfigSlurperで一風変わった設定ファイルが作れそうですね
NoMethodError: undefined method はコントローラにメソッドがないよ、または間違ってるよ以外でもでる

#エラー発生時から解決まで
rails tutorialの10章を進めていた時、テストを回すと以下のようなエラーが発生した。

```
~/workspace/sample_app (account-activation-password-reset) $ bundle exec rake test
RubyDep: WARNING: Your Ruby is outdated/buggy.
RubyDep: WARNING: Your Ruby is: 2.3.0 (buggy). Recommendation: upgrade to 2.3.1.
RubyDep: WARNING: (To disable warnings, see:http://github.com/e2/ruby_dep/wiki/Disabling-warnings )
Run options: --seed 44584

# Running:

................................E....

Finished in 1.656746s, 22.3329 runs/s, 98.3856 assertions/s.

  1) Error:
PasswordResetsTest#test_Password_resets:
NoMethodError: undefined method `reset_sent_at=' for #<User:0x00000006d18e58>
Did you mean?  reset_token=
    app/models/user.rb:59:in `create_reset_digest'
    app/controllers/password_resets_controller.rb:13:in `create'
    test/integration/password_resets_test.rb:21:in `block in <class:PasswordResetsTest>'

37 runs, 163 assertions, 0 failures, 1 errors, 0 skips

```

メソッドが悪いよと言われたので、とりあえず該当箇所のコントローラとモデルを見てみるが、これと言って悪い事をしている所はなさそうだった。あとエラー内容に関わってくるとしたらdbのテーブルが間違っているという事位だったので、とりあえず確認してみると、、、

```
sqlite> .schema                                                                                                                                                   
CREATE TABLE "schema_migrations" ("version" varchar NOT NULL);
CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version");
CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "email" varchar, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL, "password_digest" varchar, "remember_digest" varchar, "admin" boolean DEFAULT 'f', "activation_digest" varchar, "activated" boolean DEFAULT 'f', "activated_at" datetime, "reset_digest" stringreset_sent_at);
CREATE UNIQUE INDEX "index_users_on_email" ON "users" ("email");
```

"reset_digest" の型名が意味分からないことになっていた。なので、一度dbをドロップし、修正をaddファイルに掛けて、マイグレートを行う。まず、dbをドロップする。

```
bundle exec rake db:drop
```

次にaddファイルを修正する。

```
class AddResetToUsers < ActiveRecord::Migration
  def change
    add_column :users, :reset_digest, :string
  end
end
```

次に、マイグレートを行う。

```
bundle exec rake db:migrate
```

この後、テストを回すと正常に回りました。また、dbが間違っている時、直接dbをいじろうとしたら、プロの方にそれは、センスがないと言われた。railsにはrake:dropやrake:migrateなどの便利なコマンドがあるので、それを活用するのが普通であるということである。
EC-CUBEとりあえず試してみるVagrantfile

# 概要
EC-CUBE、とりあえず試してみたくない？


# 前提
* Vagrantは使える

# できあがるもの
* EC-CUBEがインストールされている何か
* ホスト側のディレクトリ(ゲストでいう`/vagrant`)にソースコード置いてます。同期します多分。
* http://localhost:8080 でアクセスできるはず


※あ、ガチめにアホなので、おかしいとこあればばんばん指摘ほしいです、、
※Chefとかあんしぶるとかは、勉強したことなかったのでシェルにしてみました


# さあ始めよう！
* こいつを保存して `vagrant up` :clap:

```Vagrantfile.
Vagrant.configure("2") do |config|

  config.vm.box = "bento/centos-7.2"
  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "2048"]
  end
  
  config.vm.provision "shell", inline: <<-SHELL
    yum -y update

    service iptables stop
    chkconfig iptables off

    # Apache
    yum -y install httpd
    service httpd start
    chkconfig httpd on

    # MySQL
    yum -y install mysql mysql-server mysql-devel
    service mysqld start
    chkconfig mysqld on

    # PHP
    yum -y install php php-opcache php-devel php-mbstring php-mcrypt php-mysql php-phpunit-PHPUnit php-pecl-xdebug php-pecl-xhprof php-xml

    cp /etc/php.ini /etc/php.ini_org
    sed -i -e "s|expose_php = On|expose_php = Off|" /etc/php.ini
    sed -i -e "s|;date.timezone =|date.timezone = Asia/Tokyo|" /etc/php.ini
    sed -i -e "s|display_errors = Off|display_errors = On|" /etc/php.ini
    sed -i -e "s|;mbstring.language = Japanese|mbstring.language = Japanese|" /etc/php.ini

    service httpd restart

    # Git
    cd /usr/local/src/
    
    yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker
    yum install gcc
    
    wget https://www.kernel.org/pub/software/scm/git/git-2.4.0.tar.gz
    tar zxvf git-2.4.0.tar.gz
    
    cd git-2.4.0
    make prefix=/usr/local all
    make prefix=/usr/local install
    
    # Git Update
    cd /usr/local/src/
    git clone git://git.kernel.org/pub/scm/git/git.git
    
    cd git
    
    git pull
    make prefix=/usr/local all
    make prefix=/usr/local install
    
    # others
    yum install wget vim unzip zip
    
    # EC CUBE
    cd /vagrant
    wget http://downloads.ec-cube.net/src/eccube-3.0.13.zip
    unzip eccube-3.0.13.zip

  SHELL
  
  # Sync folders
  config.vm.synced_folder File.join(File.dirname(__FILE__),"/eccube-3.0.13"), "/var/www",
  type: "rsync",
  rsync_auto: true
  # rsync__exclude: [".git/"]

end
```

# おわり
* 実際のところ、上記のシェル、かなり失敗します。
    * `unzip`がインストールされてないことがある？その場合手動で解凍お願いします、、
* なぜなのかわからない(疲れた)
* でもEC-CUBEは動いてるし、まあ良いよね(誰か助けて)
a-blog cmsの情報源

<h2>a-blog cmsに関する情報源まとめ</h2>
情報があまりないのと、情報源がいろんなところに散っているため可能な限りまとめてみました。
有益な情報が意外と転がっています。
<br>
<strong>本家サイト　制作事例集</strong>
a-blog cmsを導入した事例集
https://www.a-blogcms.jp/showcase/

<strong>本家デベロッパーサイト　ドキュメント</strong>
基本的な機能の解説はこちらで
https://developer.a-blogcms.jp/document/

<strong>本家デベロッパーサイト　開発ブログ</strong>
新機能に関する情報・開発情報など
https://developer.a-blogcms.jp/blog/

<strong>本家デベロッパーサイト　フォーラム</strong>
https://developer.a-blogcms.jp/forum.html

<strong>本家テスト環境サイト　ハンズオン事例集</strong>
※下の方にまとめてあります。
http://ablogcms.io/

<strong>本家デベロッパーサイト　カスタマイズtips</strong>
https://developer.a-blogcms.jp/tips/

<strong>Qiita　a-blog cms関連投稿記事</strong>
http://qiita.com/search?q=a-blog+cms

<strong>a-blog cms Advent Calendar 2016</strong>
ユーザーやアップルップルのスタッフによるコツ・アイディア・カスタマイズTipsなど
http://www.adventar.org/calendars/1562
2018年のカレンダー：https://adventar.org/calendars/2948
2017年のカレンダー：https://adventar.org/calendars/2570
2016年のカレンダー：https://adventar.org/calendars/1562
2015年のカレンダー：http://www.adventar.org/calendars/1057
2014年のカレンダー：http://www.adventar.org/calendars/357
2013年のカレンダー：http://www.adventar.org/calendars/204

<strong>YouTube　a-blog cmsチャンネル</strong>
https://www.youtube.com/user/ablogcmsTube

<strong>Facebook a-blog cms</strong>
https://ja-jp.facebook.com/ablogcms/

<strong>スライドシェア　a-blog cms関連スライド</strong>
わかりやすくて有益な情報が盛りだくさん
https://www.slideshare.net/search/slideshow?searchfrom=header&q=a-blog+cms&ud=any&ft=all&lang=ja&sort=

<strong>今日から始めるa-blog cms入門</strong>
http://ascii.jp/elem/000/000/891/891051/

<strong>有限会社アップルップル　スタッフ紹介</strong>
スタッフの皆さんのブログが非常に役に立ちます
https://www.appleple.com/staff/

<strong>a-blog cmsの仕組みを理解しよう　その1</strong>
株式会社ふわっと　ふわっとブログより
http://fuwhat.com/blog/entry-507.html

<strong>フォルトゥナ ブログ</strong>
a-blog cmsエバンジェリスト坂本さんのブログ
http://www.color-fortuna.com/blog/ablogcms/

<strong>ウェビンブログ</strong>
a-blog cmsエバンジェリスト口田さんのブログ
http://webbingstudio.com/weblog/
※※エバンジェリストさんたちのブログはまだまだあります。有益な情報があふれています。
Docker コマンドのショートカットをプロジェクトルートに置いたら快適になった

`Docker` を使って開発環境を作ると、手軽に自動化できて便利なのだが、 `Docker` コマンドをいちいち発行するのが面倒になる。

例)

- `php artisan serve` => `docker-compose exec web php artisan serve`
- `rails s` => `docker-compose exec web rails s`

`alias dc='docker-compose'` としても、まだ長い。

そこで、 `Docker` を使っているプロジェクトについては、下記の様な構成にした。

```
project-root/
|-- bin
|   |-- composer
|   |-- gulp
|   |-- node
|   |-- npm
|   |-- php
|   `-- yarn
|-- docker
|   |-- nodejs
|   `-- web
|-- artisan
|-- composer.json
|-- composer.lock
|-- docker-compose.yml
|-- gulpfile.js
|-- package.json
|-- phpunit.xml
`-- yarn.lock
```

`bin/` 配下のスクリプトはこんな感じ

もちろん `chmod +x bin/*` をしている。

```bash:bin/composer
#!/bin/bash

set -eux

if docker-compose ps | grep web_ | grep -q Up; then
    docker-compose exec web composer $@
else
    docker-compose run --rm web composer $@
fi
```

こうしておけば、 `bin/php artisan serve` みたいにできる。


工夫点としては、コンテナの起動有無によって `exec` と `run` を使い分けているところ。

`exec` の方がコンテナを起動しない分、コストが低い。
デスクトップブラウザでFlash Playerを有効にする方法まとめ

# Google Chromeの設定方法

##すべてのサイトでFlash Playerを許可したい場合

[chrome://flags/#prefer-html-over-flash](chrome://flags/#prefer-html-over-flash)

1. 上記のアドレスにChromeでアクセス
2. ［規定］を［有効］に設定します
3. これで全てのサイトでFlash Playerで表示されます

## 特定のサイトのみFlash Playerを許可したい場合

[chrome://settings/contentExceptions#plugins](chrome://settings/contentExceptions#plugins)

1. 上記のアドレスにChromeでアクセス
2. ［ホスト名の設定］にドメインを追加
3. これで特定のドメインでFlash Playerを有効にできます


# Firefoxの設定方法

Firefox で Flash Player を有効にする方法
https://helpx.adobe.com/jp/flash-player/kb/cq09051618.html

# Safariの設定方法

Safari で Flash Player を有効にする方法
https://helpx.adobe.com/jp/flash-player/kb/cq090418361.html


# Internet Explorerの設定方法

Internet Explorer で Flash Player を有効にする方法
https://helpx.adobe.com/jp/flash-player/kb/cq09041836.html
コードの納品


## 差分なし（初回）

### .DSファイルを含めずカレントディレクトリ以下をzipに圧縮

`zipper ${FILE_NAME}`

```bash:.zshrcに登録
function zipper() {
	zip -r $@.zip * -x *.DS_Store
}
```

WinArchiverでまとめてもよい
https://ideacloud.co.jp/dev/macwinzipper.html

## 差分あり（２回目以降）

### 差分ファイルの用意
gitが管理しているディレクトリ内で `git diff ${COMMIT_ID}（納品したcommitの次）`

```bash:差分ファイルを確認
$ git diff ${COMMIT_ID} --name-only
public/css/menu.css
public/css/style.css
public/index.html
```

> 参考
http://qiita.com/imai/items/09b8a72e5f8c34b432e8  


### .DSファイルを含めずカレントディレクトリ以下の差分をzipに圧縮

めんどくさいのでこっちだけでいい。

`diffzip ${COMMIT_ID} ${FILE_NAME}`

```bash:.zshrcに登録
function diffzip(){
	git diff $1 --name-only | xargs -I {} zip $2.zip {} -x .DS_Store
}
```


> 参考
[git-archive Documentation](https://git-scm.com/docs/git-archive)
[git archive 使い方](http://transitive.info/article/git/command/archive/)
[gitで差分ファイルを抽出する](http://qiita.com/kaminaly/items/28f9cb4e680deb700833)
Excel VBAで納品物ヘッダ作成自動化

#やりたかったこと
大量のEXCEL納品物があって、各シートの1行目にロゴと日付を入れなければいけなかったのでVBAでマクロ化しました。個人用マクロブックに保存して、ショートカットキーを割り当てて使いました。備忘録として投稿です。

#機能
##1. 1行目に24ピクセルの行を入れる
```vbnet:InsertLine.bas
Sub Insert_1st_Line()
'
' Insert_1st_Line Macro
' Insert 1st Line
'
' Keyboard Shortcut: Ctrl+i
'   全ワークシート選択
    Worksheets.Select

'   1行目を挿入
    Rows(1).Select
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

'   1行目の高さを24ピクセルに設定
    Rows(1).Select
    Selection.RowHeight = 24
    

End Sub

```

##2. 1行目にロゴ(画像)と日付を入れる
```vbnet:InsertLine.bas
Sub AddHeader()
'
'
' Add Picture and Date Macro
' Keyboard Shortcut: Ctrl+u
'
    Dim objFileName As String
    Dim objShape    As Shape
    Dim i           As Integer
    objFileName = "C:\tmp\header.jpg"

'   全ワークシートに対して作業
    For i = 1 To Worksheets.Count
    
      Sheets(i).Select
      Sheets(i).Activate

'     ロゴ画像貼付け
      Range("A1").Select
      Set objShape = ActiveSheet.Shapes.AddPicture( _
        Filename:=objFileName, _
        LinkToFile:=False, _
        SaveWithDocument:=True, _
        Left:=Selection.Left, _
        Top:=Selection.Top, _
        Width:=0, _
        Height:=0)

'     画像を元のファイル上サイズに戻す    
      With objShape
        .ScaleHeight 1, msoTrue
        .ScaleWidth 1, msoTrue
      End With

'     左から400ピクセル以降のセルに日付を挿入
      For Each r In Range("A1", "CA1")
        If r.Left > 400 Then
            r.Value = "2017.03.30"
            r.HorizontalAlignment = xlLeft
            r.VerticalAlignment = xlCenter
            r.Font.Bold = True
            Exit For
        End If
      Next

'     左上セルにカーソルをあわせる   
      ActiveCell.Activate         ' Excel97対策
      ' スクロール列の設定
      ActiveWindow.ScrollColumn = 1
      ' スクロール行の設定
      ActiveWindow.ScrollRow = 1

    Next

End Sub

```

#実現できていないこと
下記2点は少し不便な点で時間の制約上、対処法を調べませんでした。

* 非表示シートがあると動きません。

* 非表示列に「日付」が入力されることがある。

#感想
ただ、単純作業するのも嫌だったので、VBAを少しだけ勉強しました。普段何気なく使っているEXCELの裏側が見えたような気もします。VBAなんて今までほとんど使ったことがないので、ツッコミどころ満載のしょぼいコードです。
Swift 3 で文字列を sha1、MD5 でハッシュ化する

色々調べてみたけど、Swift3系でそのまま動かなかったので、メモとして残します。

# 準備

Objective-C のライブラリを使うので、Swift で使う場合は、`Bridging-Header.h` に下記の行を追加

```objc:Bridging-Header.h
#import <CommonCrypto/CommonCrypto.h>
```

# sha1 の場合

```swift
let data = "文字列".data(using: .utf8)!
let length = Int(CC_SHA1_DIGEST_LENGTH)
var digest = [UInt8](repeating: 0, count: length)
_ = data.withUnsafeBytes { CC_SHA1($0, CC_LONG(data.count), &digest) }
let crypt = digest.map { String(format: "%02x", $0) }.joined(separator: "")
```

# MD5 の場合

```swift
let data = "文字列".data(using: .utf8)!
let length = Int(CC_MD5_DIGEST_LENGTH)
var digest = [UInt8](repeating: 0, count: length)
_ = data.withUnsafeBytes { CC_MD5($0, CC_LONG(data.count), &digest) }
let crypt = digest.map { String(format: "%02x", $0) }.joined(separator: "")
```

# 解説

- `data.withUnsafeBytes` は戻り値を `_ =` で捨てています。
無いと `Result of call to 'withUnsafeBytes' is unused` とワーニング出ます。

- `String(format: "%02x", $0)` の箇所を、`String($0, raddix: 16)` と書いてる記事もありますが、0 が消えるので、format 指定にしています。
PHPのコーディング規約に関して（PSR-2)

コーディングルールって人によってまちまちだったりして、時として「うわ！このソース読みづらっ！」ってなったりする。

そういう事もあり、コーディング規約に関して勉強中。
今参考にしているのが現場でも採用されているPSR-2。
基本的なコーディング規約であるPSR-1にちょこちょこ追加されたものらしい。

コーディングの際の参考にして頂ければ。

```php
<?php
// 開始は「<?php」または「<?=」のみ可
// ファイルの文字コードはUTF-8（BOMなし）
// 改行コードはLF
// 行の長さをソフトリミット120字とし、80字以内におさまるようにする

// 呼んだだけで動くファイルの中で宣言系の処理を書いてはいけない（クラス定数は除く）
// define("DEF_ITEM", '定数アイテム');

// クラス名はアッパーキャメルケース
// extendsは同じ行に書く
class RulesExplain extends RulesBase
// クラス名のあとの「{」は改行する
{
// インデントは半角スペース4つ
    
    // 定数は大文字+「_」で定義する
    const DEF_ITEM = '定数アイテム';
   
    // アクセス修飾子は必ずつける
    // 関数名は（ローワー）キャメルケース 
    // 引数後のカンマの前にスペースは入れない
    // 引数後のカンマの後にはスペースを入れる
    public function getRules($rule1, $rule2)
    // 関数名のあとの「{」は改行する
    {
        // 変数名に関しては一貫性を持たせればなんでもいい（今回はキャメルケース）
        $rulesName = $rule1;
        
        // 予約語は小文字にする
        $rulesBool = true;
        
        // 「if」などと「(」の間は半角スペースを空ける
        // 「)」と「{」の間は半角スペースを空ける
        // ifなどの後の「{」は改行しない
        if ($rulesName === $rulesBool) {
            echo 'rule!';
        // elseifはつなげる
        } elseif ($rulesName === $rule2) {        
        
        }
        
        //「;」の前の空白は不要
        for ($i = 0; $i < 5; $i++) {
            echo 'rule' . $i;
        }
    }
    
    public function tooMuchArgument(
        // 複数行になる場合、1行につき引数は1つまで
        $itemOne,
        $itemTwo,
        $itemThree,
        $itemFour,
        $itemFive,
    ) {
        $itemTemp = $itemOne;
        
        switch ($itemTemp) {
            case 1:
                echo '1以上';
                // no break
                // 空でないcaseで意図的にbreakしない場合その旨のコメントを使う
            case 2:
            case 3:
                echo '2以上';
                break;
        }
       
    }
}
// [EOF]
// ファイルの末尾は改行し空行をいれる
/* 「?>」は省略する */
```

説明部分をコメントとして残してみたけどえらく見づらい・・・

コーディング規約を手短に伝えるためソースの中身は適当です（笑）
switch文で文字列を比較対象にする際の注意点

PHPのswitch文は比較を「==」で行っている。
従って、比較対象を文字列にした場合想定外の動作が起こる。

```
<?php
$arr = array('怠惰', 'ゼロ', 0);

foreach ($arr as $val) {
    switch ($val) {
        case '怠惰':
            echo $val . '　→　怠惰ですねぇ' . '<br>';
            break;
        default :
            break;
    }
}

// 出力結果
怠惰　→　怠惰ですねぇ
0　→　怠惰ですねぇ
```

このようになってしまうので、文字列を比較対象とする場合は
下のいずれかの対応を行う事で意図しない不具合を回避することができる。

方法1

```
<?php
$arr = array('怠惰', 'ゼロ', 0);

foreach ($arr as $val) {
    switch ((string)$val) {
        case '怠惰':
            echo $val . '　→　怠惰ですねぇ' . '<br>';
            break;
        default :
            break;
    }
}

// 出力結果
怠惰　→　怠惰ですねぇ
```

方法2

```
<?php
$arr = array('怠惰', 'ゼロ', 0);

foreach ($arr as $val) {
    switch (true) {
        case $val === '怠惰':
            echo $val . '　→　怠惰ですねぇ' . '<br>';
            break;
        default :
            break;
    }
}

// 出力結果
怠惰　→　怠惰ですねぇ
```
Node.jsでファイル一覧を取得してゴニョゴニョしてみる


xlsxファイルからjsonファイルを作るのを自動化したかったので、Node.jsを使ってファイル取得をやってみた。

ファイルをNode.jsでゴニョゴニョするには`File System`というモジュールが必要。
利用するにはファイル内で`require('fs')`します。

```index.js
"use strict"

let fs = require('fs');
```

fs.readdirを使用すると非同期的にファイルを取得してくれる。
第一引数で、ファイルを取得したいディレクトリ、第二引数のコールバックでファイル名が配列で帰ってくる。


```index.js
"use strict"

let fs = require('fs');
fs.readdir('.', function(err, files){
  if (err) throw err;
  console.log(files);
});
```


これと、[node-xlsx-json](https://github.com/DataGarage/node-xlsx-json)を利用して、同じ階層にあるxlsxファイルをjsonファイルに変換して出力してみました。

```index.js
"use strict";

const fs = require('fs');
const xlsx2json = require("xlsx-to-json");


fs.readdir('.', function(err, files){
  if (err) throw err;
  files.forEach(function(file){
    if(fs.statSync(file) && /.*\.xlsx$/.test(file)){
      let fileName = file.split('.')[0];
      xlsx2json({
        input: file,
        output: `${fileName}.json`
      }, function(err, result) {
        if(err) {
          console.error(err);
        }else {
          console.log(result);
        }
      });
    }
  })
});
```

`fs.statSync`はファイルが存在するかどうかをチェックする事ができます。
いちいち文字列埋め込むのは大変なので、スプレッドシートでうまく管理して、
EJSやPugなどでうまいこと突っ込むと大量生産が捗りそうです。

### 参考資料
Node.jsでフォルダの直下にあるファイルやフォルダのリストを取得する
http://info-i.net/fs-readdir

node.js　ファイル一覧を取得する
http://qiita.com/_shimizu/items/f08eaacdbcdce0204e36
PHPの標準クラスstdClassに関して

クラスを利用する場合、通常は利用するクラスを定義しなければいけないが
内部定義されているstdClassを利用することもできる。

```
<?php
$obj = new stdClass();
$obj->name = 'Ren4';
$obj->status = '不明';

// Ren4の国籍は不明です。
echo $obj->name . 'の国籍は' . $obj->status . 'です';
?>
```
改訂版が発行されたWordPress技術書 2015年～2019年

改訂版が発行されたWordPress技術書をリストアップしていきます。あまり古い書籍は参考にならないかもしれないので、2015年1月以降に改訂版が出版されたものを古い順から並べています。
※あくまで私が調べた範囲なので、漏れがある可能性があります。コメント欄でご指摘いただければ、確認して掲載いたします。

## 2015年
WordPress Perfect GuideBook 4.x対応版
佐々木 恵
ソーテック社 (2015/1/31)
https://www.amazon.co.jp/dp/4800710669/

本格ビジネスサイトを作りながら学ぶ WordPressの教科書 Ver.4.x対応版
プライム・ストラテジー株式会社
SBクリエイティブ (2015/2/21)
https://www.amazon.co.jp/dp/4797381078/

基礎からのWordPress 改訂版 (BASIC LESSON For Web Engineers)
高橋 のり
SBクリエイティブ (2015/4/18)
https://www.amazon.co.jp/dp/4797383097/

はじめてのWordPress入門\[最新版\](BASIC MASTER SERIES)
原 久鷹
秀和システム (2015/12/7)
https://www.amazon.co.jp/dp/4798045039/

カンタン! WordPressでつくるビジネスサイト 増補改訂版
遠藤 裕司, 伊藤 みゆき
ソシム (2015/12/18)
https://www.amazon.co.jp/dp/4802610246/

##2016年

現場でかならず使われているWordPressデザインのメソッド[アップデート版]
相原 知栄子, 石川 栄和, 大串 肇, 大曲 仁, 北村 崇, 後藤 賢司, 土肥 牧人, 鳥山 優子, 服部 久純, 星野 邦敏, 松田 千尋, 吉澤 富美, 吉田 裕介, WP-D (監修)
エムディエヌコーポレーション (2016/9/2)
https://www.amazon.co.jp/dp/484436605X/

##2017年

いちばんやさしいWordPressの教本第3版 人気講師が教える本格Webサイトの作り方
石川栄和, 大串 肇, 星野邦敏
インプレス (2017/2/24)
https://www.amazon.co.jp/dp/4295000795/

WordPressユーザーのためのPHP入門 はじめから、ていねいに。[第2版] 
水野 史土
エムディエヌコーポレーション (2017/3/28)
https://www.amazon.co.jp/dp/4844366580

##2018年

改訂版は無し。

##2019年

できるＷｏｒｄＰｒｅｓｓ　ＷｏｒｄＰｒｅｓｓ　Ｖｅｒ．５．ｘ対応　本格ホームページが簡単に作れる本
星野 邦敏/相澤 奏恵/漆原 理乃/大胡 由紀/清水 久美子
インプレス (2019/6/14)https://www.amazon.co.jp/dp/B07SQDBPV2

ＷｏｒｄＰｒｅｓｓ標準デザイン講座２０ＬＥＳＳＯＮＳ （第２版）
野村 圭/石原 隆志
翔泳社(2019/6/5)
https://www.amazon.co.jp/dp/B07QP631MT/

本当によくわかるＷｏｒｄＰｒｅｓｓの教科書―はじめての人も、挫折した人も、本格サイトが必ず作れる （改訂２版）
赤司 達彦
SBクリエイティブ (2019/6/26)
https://www.amazon.co.jp/dp/B07TKH7H7R/

ＷｏｒｄＰｒｅｓｓ　Ｐｅｒｆｅｃｔ　ＧｕｉｄｅＢｏｏｋ - ５．ｘ対応版
佐々木 恵
ソーテック社 (2019/8/25)
https://www.amazon.co.jp/dp/B07WTYHMTJ/

いちばんやさしいＷｏｒｄＰｒｅｓｓの教本 - 人気講師が教える本格Ｗｅｂサイトの作り方 （第４版）
石川 栄和/大串 肇/星野 邦敏
インプレス (2019/7/25)
https://www.amazon.co.jp/dp/B07V2MJ4N1/

ＷｏｒｄＰｒｅｓｓユーザーのためのＰＨＰ入門 - はじめから、ていねいに。 （第３版）
水野史土
エムディエヌコーポレーション (2019/8/27)
https://www.amazon.co.jp/dp/4844368893/

##感想
WordPress本は多数出版されているので、結構改訂版が出版されているのかと思っていました。実際に調べてみると、出版される書籍の数と比べると意外と少ない印象を受けました。改訂版が出ている書籍のいくつかは、私の知り合いが関わっていることもあり、「改訂版が結構出ている」というイメージが先行していたようです。
名前空間

通常クラス名が重複した場合、衝突しエラーが起こるが
名前空間を設定する事によって衝突を回避することができる。

```
namespace Freedom;

class Sample
{
    function get_value()
    {
        return 1;
    }
}
```

このような場合、別ファイルからget_value()へアクセスするには

```
$sample = new Freedom\Sample();
$value  = $sample->get_value(); 
echo $value; // 1
```

と記述する。
また名前空間を設定しているファイルでグローバル空間のクラスを参照する場合は頭に\をつけてあげる必要がある。

```
namespace Freedom;

class Sample extends \DatabaseAccess

{
    function get()
    {
        return 1;
    }
}
```
PHPによる入力値チェックや加工各種

trim()　スペースを削除する

```
$string = ' JAPAN          ';
$word   = trim($string);

echo $word; // 'JAPAN'
```

get_magic_quotes_gpc()　magic_quotes_gpcによるエスケープ削除

```
if (get_magic_quotes_gpc()){ 
    $var = stripslashes($var);
}
```

NULLバイト攻撃対策

```
if (preg_match('/\0/', $var)) { 
    die('不正な入力です。');
}
```
UI > link > Guildelines > Windows > Dialog Boxes

```txt:動作環境
C++ Builder XE4
```

UIについて「標準的なUIに踏襲するほうがユーザの使用勝手が良い」と聞いたことがある。自分も従来のソフトを参考にしてUIを作ってきたつもりであるが、その背景をよく知っていなかったりする。

そういう場合、きちんと説明があるGuidelinesは参考になる。

https://msdn.microsoft.com/en-us/library/windows/desktop/dn742499(v=vs.85).aspx

にある１例として、Yes and No buttonsの欄において「OK Cancel」はIncorrectとされており、Correctが「Yes No」、Betterが「Run Don't run」とある。

なぜYes NoがIncorrectかというとユーザに考えを要求するからということらしい (以下)。

> However, confirmations usually have Yes and No buttons to make users give the confirmation [some thought](https://msdn.microsoft.com/en-us/library/windows/desktop/dn742470(v=vs.85).aspx#requirethought) before responding.

その他、Dialog Boxesに関する「良い・悪い」例が多くある。
内容は多いが、一通り目を通しておくことも大切かもしれない。
SQLServerでIdentityが設定されているテーブルをコピーする方法

SQLServerで本番環境DBのテーブルデータを、テスト環境DBのテーブルにコピーする事になった。
その際、対象テーブルにIdenityが設定されていた場合、普通にコピーすると採番が再設定されてしまうので
下記の方法で対応した。

```
table_1 → コピー元テーブル
table_2 → コピー先テーブル
field_1 → フィールド1
filed_2 → フィールド2

【作業その１ フィールド名取得】
SELECT * FROM syscolumns
WHERE id = object_id('table_1')

【作業その２ コピー先テーブルのトランケート】
TRUNCATE TABLE table_2

【作業その３ コピー】
SET IDENTITY_INSERT table_2 ON
INSERT INTO 
table_2
(
field_1,
field_2,
.
.
.
)
SELECT * FROM tabke_1;
SET IDENTITY_INSERT table_2 OFF
```
1クラス SVM（教師なし学習）を使った外れ値の検知

## 背景
課題: サンプルの中にある外れ値を抽出したい
環境: MATLAB R2017a
Toolbox: Statistics and Machine Learning Toolbox

## データの作成
多変量正規分布の乱数を <a href="https://jp.mathworks.com/help/stats/mvnrnd.html">mvnrnd</a> を使用して作成します．5% のサンプルだけ別の分布から生成されたサンプルにしています．
この例は2次元データなので，描画することで目視で外れ値を見つけることが可能ですが，多次元になると描画＆判別することが難しくなります．

```
X = [mvnrnd([0;0],[1 .95;.95 1],95); mvnrnd([2;-2],[1 .1;.1 1],5)];
Y = categorical([ones(95,1); zeros(5,1)]);

h = scatter(X(:,1), X(:,2),'.b');
h.SizeData = 150;
```
![20170313_svm01.png](https://qiita-image-store.s3.amazonaws.com/0/168437/02ac1b1d-ee06-3743-61c2-fd14e56eb7fe.png)


## 1クラスSVM によるモデルの学習（学習フェーズ）
このサンプルの中に5%の異常値サンプルが混じっていると仮定します．コード内では，<a href="https://jp.mathworks.com/help/stats/fitcsvm.html">fitcsvm</a> の OutlierFraction プロパティで，サンプル内に混じっている異常値の割合を指定します．

サポートベクタマシン (SVM) は通常2クラス（あるいは複数使用して多クラス）の分類を行う手法です．1クラスSVMは，サンプルが1クラスに属しておりそれ以外は外れ値であるという仮定を置きます．そのため，通常 SVM のモデル学習の関数 <a href="https://jp.mathworks.com/help/stats/fitcsvm.html">fitcsvm</a> の第二入力引数はターゲット（ラベル情報）になりますが，1クラスSVM の場合は1クラスであるという仮定のもと，<a href="https://jp.mathworks.com/help/matlab/ref/ones.html">ones</a> 関数を使用して全て1を入れておきます．

```
W = ones(size(X, 1), 1);
d = fitcsvm(X, W, 'KernelScale', 'auto', 'Standardize', true, 'OutlierFraction', 0.05);
```

## One Class SVMによる外れ値検出（予測フェーズ）
<a href="https://jp.mathworks.com/help/stats/compactclassificationsvm.predict.html">predict</a> 関数でクラスの分類スコアを計算します．<a href="https://jp.mathworks.com/help/stats/confusionmat.html">confusionmat</a> 関数を使用すると，実際の観測値と予測値の混合行列を表示することができます．

```
[~, score] = predict(d, X);
idx = score > 0;
Y_hat = categorical(idx, [0 1]);
confusionmat(Y, Y_hat)
ans = 
  4   1
  1  94
```

## 結果の描画 (2/3次元の場合のみ)
<a href="https://jp.mathworks.com/help/matlab/ref/gca.html">gca (get current axes)</a> 関数を使って，現在の軸からXYの座標軸の範囲を取得します．

```
XLim = get(gca, 'XLim');
YLim = get(gca, 'YLim');
```

取得した座標軸の範囲を100等分するようなグリッドを生成します．

```
X1 = linspace(XLim(1), XLim(2), 100);
X2 = linspace(YLim(1), YLim(2), 100);
[X1Grid, X2Grid] = meshgrid(X1, X2);
```

前例と同様に，predict 関数を使用してグリッドごとにSVMの分類スコアを計算します．

```
[~, scoreGrid] = predict(d, [X1Grid(:), X2Grid(:)]);
scoreGrid = reshape(scoreGrid, size(X1Grid, 1), size(X2Grid, 2));
```

スコアを等高線で描画します．

```
figure;
h = scatter(X(:, 1), X(:, 2), '.b');
h.SizeData = 150;
hold on
contour(X1Grid, X2Grid, scoreGrid, 10)
hold off
```

![20170313_svm02.png](https://qiita-image-store.s3.amazonaws.com/0/168437/75f128c9-0d8d-1c7a-2b04-999f223bd067.png)

右下のサンプルは、他のサンプルと明らかに異なる等高線上にあることが分かり、これらが外れ値となります。
PHP でファイル入出力しようとしたらパーミッションエラーが出た


## 情報
* CentOS 7.3.1611
* PHP 5.6.30
* 入出力したいディレクトリ `/var/www/logs`
* ディレクトリの所有者: `apache`
* ディレクトリのグループ: `apache`
* ディレクトリのパーミッション: `777`
* 使用した関数: `file_put_contents`, `touch`

### 出力されたエラー

```
Warning: touch(): Unable to create file /var/www/logs/test20170303.log because Permission denied in /var/www/html/log_test.php on line 2
```

`touch()`: 実行した関数(ファイルがあればタイムスタンプを更新、なければ作成)
`/var/www/logs/test20170303.log`: 操作しようとしたファイル
`/var/www/html/log_test.php`: 実行した関数が書いてあるファイル
`line 2`: Warning が発生したファイルでの該当行番号


### `Permission denied` ?
先頭に書いた通り、ディレクトリの所有者や権限は満たしているはず。

## SELinux
何かうまく動作しなかった場合、とりあえず疑ってみるのがこいつ。
`getenforce` -> `Enforcing`
稼働しているので、とりあえずこいつを停止させて ( `setenforce 0` ) から同じファイルを実行してみると、ファイルが作成された。
こやつじゃ。

### されど停止させるわけにもいかず
VirtualBox 上とかのマシンならまだしも、通常利用するサーバで SELinux の停止を即断するのはリスクがあるし、検討や対応している暇もないので他の道を探すことにする。

### ディレクトリの context を変更しちゃおう
`semanage fcontext -a -t httpd_sys_rw_content_t /var/www/logs`
このコマンドを発行することで、 Apache からディレクトリのファイルの読み書きができるようになる。
このコマンドは完了するまで時間がかかる場合があるので、返ってくるまでちょっと待つ。

次に以下のコマンドを発行し、適応する。
`restorecon /var/www/logs`

SELinux を再度動かす。
`setenforce 1`

この状態で先ほどのファイルを実行してファイルが書き出されていれば完了 ( `touch` で検証する場合は、直前のテストで作成されたファイルを削除しておくとわかりやすい )。

可能ならば念のためサーバを再起動してからファイル出力できるか確認しておくと良いかも。

## 蛇足
### `semanage` コマンドが見つかりません
`semanage` 発行時にこういうエラーが出た人もいると思う(むしろ自分が出た)。
そういう時は以下のコマンドでインストールする。
`yum install policycoreutils-python`

### SELinux を disabled にしちゃダメなの？
SELinux は基本的なセキュリティなどを提供してくれる一方で、今回のようにいろいろな不具合の原因になったりする( PHP で他によくあるのがメール送信ができない、 DB アクセスできない、など )。
検索すると disabled を推奨するページがぼちぼち出てくるけど、個人的にはあまりしたくない。
disabled にするならば、ちゃんとリスクを検討し、対処(保持も含む)しておくべきだ。
もちろん SELinux を有効にしていてもリスクの検討は必要だけど。