OmniAICreator/Qiita-1.07M huggingface dataset:
forEach練習(その1：forEach文→forEachメソッドに書換)

4/27：ご指摘頂き記述を正しいものに修正いたしました。
      (for文→forEach文、forEach文→forEachメソッド)

#簡単な処理で練習！
forEachメソッドに慣れる為、forEach文の処理を書き換えてみます。

#Before
まずはforEach文のソース。

```java:OtamesiFizzBuzz.java
package oasobi;

import java.util.ArrayList;

/**
 * 練習。
 *
 */
public class OtamesiFizzBuzz {

	public static void main(String[] args) {
		OtamesiFizzBuzz2 main = new OtamesiFizzBuzz2();
		main.execute();
	}

	// 実行
	public void execute() {
		// 準備
		ArrayList<Integer> list = new ArrayList<>();
		for(int i = 1 ; i < 16 ; i++) {
            list.add(i);
        }

		// 回してみる
		for(int i : list) {
			outputFizzBuzz(i);
        }
	}

	// 引数が3で割りきれるならFizz、5で割りきれるならBuzz、両方で割り切れるならFizzBuzzを出力
	// どちらでも割り切れないなら"どっちでもないよー！"
	private void outputFizzBuzz(int value) {
		if (value%3 == 0 && value%5 == 0) {
			System.out.println(value + ":FizzBuzz");
		} else if (value%3 == 0 && value%5 != 0) {
			System.out.println(value + ":Fizz");
		} else if (value%3 != 0 && value%5 == 0) {
			System.out.println(value + ":Buzz");
		} else {
			System.out.println(value + ":どっちでもないよー！");
		}
	}
}
```

■実行結果
1:どっちでもないよー！
2:どっちでもないよー！
3:Fizz
4:どっちでもないよー！
5:Buzz
6:Fizz
7:どっちでもないよー！
8:どっちでもないよー！
9:Fizz
10:Buzz
11:どっちでもないよー！
12:Fizz
13:どっちでもないよー！
14:どっちでもないよー！
15:FizzBuzz

#After
これをforEachメソッドで書き直してみます。

```OtamesiFizzBuzz2.java
package oasobi;

import java.util.ArrayList;

/**
 * 練習その2。
 *
 */
public class OtamesiFizzBuzz2 {


	public static void main(String[] args) {
		OtamesiFizzBuzz2 main = new OtamesiFizzBuzz2();
		main.execute();
	}

	// 実行
	public void execute() {
		// 準備
		ArrayList<Integer> list = new ArrayList<>();
		for(int i = 1 ; i < 16 ; i++) {
            list.add(i);
        }

		// 回してみる
		list.forEach(this::outputFizzBuzz);
	}

	// 引数が3で割りきれるならFizz、5で割りきれるならBuzz、両方で割り切れるならFizzBuzzを出力
	// どちらでも割り切れないなら"どっちでもないよー！"
	private void outputFizzBuzz(int value) {
		if (value%3 == 0 && value%5 == 0) {
			System.out.println(value + ":FizzBuzz");
		} else if (value%3 == 0 && value%5 != 0) {
			System.out.println(value + ":Fizz");
		} else if (value%3 != 0 && value%5 == 0) {
			System.out.println(value + ":Buzz");
		} else {
			System.out.println(value + ":どっちでもないよー！");
		}
	}
}
```

■実行結果
1:どっちでもないよー！
2:どっちでもないよー！
3:Fizz
4:どっちでもないよー！
5:Buzz
6:Fizz
7:どっちでもないよー！
8:どっちでもないよー！
9:Fizz
10:Buzz
11:どっちでもないよー！
12:Fizz
13:どっちでもないよー！
14:どっちでもないよー！
15:FizzBuzz

同じ結果になりました。

forEachメソッドに引数をひとつ取るメソッドを渡すということが何となく分かった気がします。
ちょっとすっきり。
AWSのアカウントを消してもサービスが動き続ける話


# はじめに
AWSのサービスが動いたままアカウントを消しても、サービスが動き続けていた。
もしや課金も続いているのか！？と思いサポートに問い合わせたところ、サービスは一定期間動き続けるが、課金は止まっているよ！という返事でした。
自分みたいなAWS初心者のためにメモ...

## 背景
 お勉強のためにAWSをぽちぽち触っていたのですが、仕事が忙しくなり検証も終わったのでアカウントを削除しようとしました。いろいろとサービスが動いてましたが「アカウントを消せばサービスも消えて課金も止まるだろう」と思いアカウントを解約しました。

## ところが
「あれ、アカウント消してもサービス動いてる。やばいRedshift落としてない。課金続いてんじゃない」という感じで「ちょっとアカウント消すの待った」と思っても後の祭り。サービスを止める画面に行けません。

## オワタ...
この日から夜も寝れなくなり、食欲もなくなり「Redshiftにいくら取られるんだよ...」と死にたくなったのでAWSに問い合わせました。

## ところが
１日くらいでこんな返信が返ってきて、

> サービスが停止されていない状態でもアカウントを解約されると課金は停止します。削除されていないサービスは一定期間動き続けるけど、操作がない場合は削除されるよ。ちなみにAWSからはお客様のリソースは停止できないから、アカウントを再開して本人でやってください。アカウントの復旧もできるよ

助かった。。。。。

## まとめ
AWSしかりクラウドサービスを使うときは「止める」ことを忘れないように。ちゃんとよくマニュアルを読んだり、詳しい人に聞いたりして使いましょう。（自分のこと）
VSCodeで「有効なソース管理プロバイダーがありません」となる問題 

突如としてVSCodeで「有効なソース管理プロバイダーがありません」と表示されるようになり、gitとの連携ができなくなりました。
その他にもProject Managerが動かなくなったりと変な挙動が起きていました。

VSCodeの再インストールや設定の見直しなどを行っても改善されず... :thinking:


結局、 `~/.vscode/extensions` を削除(は怖かったので別の名前にリネーム)してVSCodeを再起動することでgitとの連携が復活しました。


...パッケージが壊れたか、変なパッケージを入れてしまっていたのかわかりませんが、同様の症状がある方は試してみると良いかもしれません。
Node.js 10.0.0でelectron-packagerエラー

# 突然のエラー
久しぶりにNode.js関連を全アップデートして、electron-packagerでパッケージングを実行したら･･･
こんなメッセージが。

```console
C:\Users\*\project>electron-packager ./sample sample --platform=win32 --arch=ia32
CANNOT RUN WITH NODE 10.0.0
Electron Packager requires Node 4.0 or above.
```


# 実行環境
- Node.js - 10.0.0
- electron - 1.8.6
- electron-packager - 12.0.1


# 大体予想はつくけれど･･･
恐らく、バージョンの桁が増えた事による弊害でしょう。
さて、どうしたものか･･･

---
2018/05/06追記
electron-packager - 12.0.2にて、Fix確認しました。
メモ：docker上のrubyでエンコードのエラーが出る場合の対処

この記事は
===

* docker上でrubyを使ってるとエンコードエラーがよく出るのでその対処
* 単なる個人メモです

環境
===

* Ubuntu16

事象
===

* 日本語の入ったCSVファイルとか読み込もうとすると下記の様なエラーが発生します

```
invalid byte sequence in US-ASCII (ArgumentError)
```

対処
===

* Rubyのエンコーディングを確認します

```
$ ruby -e 'puts Encoding.default_external'
US-ASCII
```

* 下記の様にlocaleを変更します

```
$ sudo apt-get install language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8
```

* エンコーディングが変わっていることを確認します

```
$ ruby -e 'puts Encoding.default_external'
UTF-8
```

* これでエラーはでなくなりました

参考
===

* https://qiita.com/tailak/items/77b90a4df07e4f6a1fc2
Laravelのコンソールコマンドのhandle関数の戻り値はどう使われる?

# はじめに
Laravelでコンソールコマンドを作成するときに、artisanの`make:command`を使うと思いますが、生成されたファイルをよく見ると`handle`関数の戻り値が`mixed`になっています。

```php
    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //
    }
```

でもドキュメントの[Artisanコンソール](https://readouble.com/laravel/5.6/ja/artisan.html)を見ても戻り値を返している例が一つも無く説明もありません。気になるので調べて見ました。

# 調査

適当にコマンドクラスを作ってhandleの中でブレークさせて処理を追いかけてみます。

![スクリーンショット 2018-04-27 9.08.35.png](https://qiita-image-store.s3.amazonaws.com/0/41523/2e39ab30-d1cf-3c7c-5dee-f34341a8cbdf.png)

ただreturnしてるだけのような所は省略して

`Command.php`の252行:

```php

    public function run(InputInterface $input, OutputInterface $output)
    {
        # ...略...

        if ($this->code) {
            $statusCode = call_user_func($this->code, $input, $output); # ←ここ
        } else {
            $statusCode = $this->execute($input, $output);
        }

        return is_numeric($statusCode) ? (int) $statusCode : 0;
    }
```

`$statusCode`で戻り値を受けていますが、最後の`return`文で、`is_numeric`ならint型にキャスト、そうでなければ0を返しています。

この値が最終的に`artisan`スクリプトの最後の`exit($status);`で使われるようになっていました。

# まとめ
`handle`関数の戻り値はartisanコマンドの終了ステータスに使われます。値が`is_numeric`でなければ0として扱われます。
Sparkを使ったCassandraデータロードメモ

Sparkを使ったCassandraデータロードの簡単なメモです。

Cassandraクラスタの構築手順は以下参照してください。
https://qiita.com/48hands/items/05c2ad0ea89fe13afd57

まずは、keyspaceとtableを作成。

```
$ ssh nosql1

[vagrant@nosql1 ~]$ cqlsh nosql1
Connected to develop-cluster at nosql1:9042.
[cqlsh 5.0.1 | Cassandra 3.11.2 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.

cqlsh> CREATE KEYSPACE test WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 2 };

cqlsh> CREATE TABLE test.kv(key text PRIMARY KEY, value int);
```

つづいて、SparkのコードをScalaで書いていく。中身は適当。

`build.sbt`を設定して

```scala
name := "CassandraLoad"

version := "0.1"

scalaVersion := "2.11.12"

resolvers += "Spark Packages Repo" at "https://dl.bintray.com/spark-packages/maven"

libraryDependencies ++= Seq(
  "datastax" % "spark-cassandra-connector" % "2.0.1-s_2.11",
  "org.apache.spark" %% "spark-sql" % "2.2.0"
)
```

`LoadSample.scala`を作って

```scala
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{SaveMode, SparkSession}
import org.apache.spark.sql.cassandra._

object LoadSample {

  def main(args: Array[String]): Unit = {
    import spark.implicits._

    val dfs = for (i <- 1 to 100) yield {
      val rdd: RDD[Int] = spark.sparkContext.parallelize(1 to 100000)
      rdd.map(line => (s"key-$i-$line", line)).toDF("key", "value")
    }

    dfs.foreach(df =>
      df.write.cassandraFormat("kv", "test").mode(SaveMode.Overwrite).save())
  }


  private val spark = SparkSession
    .builder
    .master("local[*]") // ローカルでエグゼキュータにクライアントPCのコア数と同数のスレッドを割り当て
    .appName("Load Sample")
    .config("spark.cassandra.connection.host",
      "192.168.33.41,192.168.33.42,192.168.33.43")
    .config("spark.cassandra.output.consistency.level", "ONE") // デフォルトだとLOCAL_QUORUMなので変更した。
    .getOrCreate()
}
```

実行すると、データが`100,000 * 100 = 10,000,000`件入っているはず。

```
$ ssh nosql1

[vagrant@nosql1 ~]$ cqlsh nosql1 -k test
Connected to develop-cluster at nosql1:9042.
[cqlsh 5.0.1 | Cassandra 3.11.2 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.

cqlsh:test> select * from kv limit 100;

 key         | value
-------------+---------
 key-4-28995 |   28995
 key-4-78904 |   78904
 key-4-61524 |   61524
 key-4-13764 |   13764
 ...
```

入っていることがなんとなく確認できるはず。
Perlで整数と小数点、ゼロを含む値を数値として判定させる関数

※正規表現の箇所は、[こちら](https://suin.io/475)を参考にしました。

Perlは、数値のゼロを数値として認識してくれないので、判定関数を使って判定すると便利です。

```perl
sub is_numeric {

  # pattern     result
  # ------------------
  # 0           TRUE
  # 1           TRUE
  # 123	      TRUE
  # 0.1	      TRUE
  # 0.123	      TRUE
  # 12.345      TRUE
  # 0123	      FALSE
  # 1.a         FALSE
  # 1a          FALSE
  # 1.          FALSE
  # hoge	      FALSE
  # ""          FALSE
  # $undef      FALSE

  my $v = shift;
  
  my $result = 0;
  
  if (defined $v && $v =~ /^([1-9]\d*|0)(\.[0-9]+)?$/) {
    $result = 1;
  }
  
  return $result;
}

```
コメント部分が長くなってすいませんが。。。
rubyのaws-sdk ver. 3を使ってS3のバケットを新規作成もしくは削除する

# 概要
* aws-sdk ver. 3でS3のバケットをの新規作成 or 削除を行うだけのクラスです。
* **問答無用で実行します！！！**。本コードを利用する場合は、気をつけて使ってください。

# 環境
* ruby: 2.5.1
* [aws-sdk-s3](https://github.com/aws/aws-sdk-ruby): 1.9.0 (from aws-sdk ver 3.0.1) 

# コード

* バケットの作成は、[create_bucket](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#create_bucket-instance_method)を呼び出して行います
* バケットの削除は、[delete_bucket](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#delete_bucket-instance_method)を呼び出して行います。

```create_delete_s3_client.rb
require 'aws-sdk-s3'

class CreateDeleteS3Client
  def initialize(opts = {})
    aws_access_key_id = opts[:aws_access_key_id] # 'YOUR_AWS_ACCESS_KEY'
    aws_secret_access_key_id = opts[:aws_secret_access_key_id] # 'YOUR_AWS_SECRET_ACCESS_KEY'
    @aws_bucket_region = opts[:aws_bucket_region] # 'TARGET_AWS_BUCKET_REGION'
    @s3_resource = Aws::S3::Resource.new(region: @aws_bucket_region)
    @s3_client = Aws::S3::Client.new(access_key_id: aws_access_key_id, secret_access_key: aws_secret_access_key_id)
  end

  def create!(bucket_name)
    if bucket_exist?(bucket_name)
      p "#{bucket_name} is already existed !"
      return
    end
    @s3_client.create_bucket(
      {bucket: bucket_name,
       create_bucket_configuration: {location_constraint: @aws_bucket_region}})
    p "#{bucket_name} is created"
  end

  def delete!(bucket_name)
    unless bucket_exist?(bucket_name)
      p "#{bucket_name} is not existed !"
      return
    end
    @s3_client.delete_bucket({bucket: bucket_name})
    p "#{bucket_name} is deleted"
  end

  def bucket_exist?(bucket_name)
    @s3_resource.bucket(bucket_name).exists?
  end
end

```

# 使い方
よくある、状況を想定して、環境変数で AWS_ACCESS_KEY_ID と AWS_SECRET_ACCESS_KEYが定義されているとします。

もし、環境変数で定義していない場合は、`ENV['AWS_ACCESS_KEY_ID']`と`ENV['AWS_SECRET_ACCESS_KEY']`を実際の値に置き換えてください。

```irb
# 使いかた
s3 = CreateDeleteS3Client.new(
  {
    aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'],
    aws_secret_access_key_id: ENV['AWS_SECRET_ACCESS_KEY'],
    aws_bucket_region: 'ap-northeast-1',
  }
)

# 問答無用でバケットを作りたい場合
s3.create!('作りたいバケット名')

# 問答無用でバケットを削除したい場合
s3.delete!('削除したいバケット名')
```

以上
【AWS】Lambdaでtime out after 3.00 secondsが出たときの対処法

# はじめに
開発用のEC2やRDSの起動・停止はLambdaで行っています。安定稼働していたLambdaで急にエラーが発生するようになったので、対処方法を共有します。

## 発生したエラー

```bash
"errorMessage": "2018-04-26T08:40:15.398Z 6f404961-492d-11e8-9047-f3c59f4ef90f Task timed out after 3.00 seconds"
```

## 対処法
- Lambdaのタイムアウト値を3秒以上に変更する
  - 例30秒など

![image.png](https://qiita-image-store.s3.amazonaws.com/0/98130/6b172c80-8157-28a0-bec7-8372971ef5fb.png)


## 動作確認
無事に動いていることが確認できました

![image.png](https://qiita-image-store.s3.amazonaws.com/0/98130/4513cf3f-a2d3-32e2-f9ca-2d7b1689659d.png)
![](Lambdaでtime-out-after-3.00-secondsが出たときの対処法\a2de5e64cd5fabfb1aad72b70576da13.png)
SkyWay IoT SDKで簡単に WebRTC サーバーサイドレコーディング作ってみる

# これは何？

[SkyWay IoT SDK](https://github.com/nttcom/skyway-iot-sdk) 使うと、WebRTC を経由したサーバーサイドレコーディングが割に簡単にできちゃうんで、それの紹介

![image.png](https://qiita-image-store.s3.amazonaws.com/0/83466/887e1200-60db-5342-4214-b18d4c4c72fd.png)

# sendStream() - ブラウザから音声を送る

[SiRu-Client](https://github.com/nttcom/skyway-siru-client) の v0.0.9 から、 `sendStream()` というメソッドで、ブラウザから IoT SDKが搭載された Linux に手軽に音声を送れるようになりました。使い方は、以下の感じ。 `getUserMedia` で音声取得後、 `sendStream(uuid, stream)` を呼ぶことでターゲットの IoT SDK デバイスに送信できます。

```js
const client = new SiRuClient( 'testroom', { key: 'YOUR_API_KEY' } );

client.on('meta', profile => {
  navigator.mediaDevices.getUserMedia({ audio: true, video: false })
    .then( stream =>
       client.sendStream( profile.uuid, stream )
    )
    .then( call => console.log('start sending local stream') )
    .catch( err => console.warn(err) );
});
```

サンプルサイト https://nttcom.github.io/skyway-siru-client/examples/sendAudio.html もありますので、そちらも参考に。

# IoT SDK側でのファイル保存

SkyWay IoT SDK [^1] では、受信した音声をデフォルトで `localhost:25000/udp` あてに `rtp` で流し続けます（フォーマットはデフォルトだと `opus` に固定しています）。

なので、これを `gstreamer` で拾えばファイル保存できちゃう。以下の例だと `opus` で一旦受信した後 `wav` に変換して保存しています。

```bash
gst-launch-1.0 -v udpsrc port=25000 caps="application/x-rtp,media=(string)audio,clock-rate=(int)48000,encoding-name=(string)X-GST-OPUS-DRAFT-SPITTKA-00 " ! \
  rtpopusdepay ! \
  opusdec ! \
  wavenc ! \
  filesink location=recorded_audio.wav
```

# 受け側でそのまま再生する

保存できるんだったら、そのままリモートのスピーカーでも再生できるよね。。。。ってことで、それをやる `gstreamer` のスクリプトが以下

```bash
gst-launch-1.0 -v udpsrc port=25000 caps="application/x-rtp,media=(string)audio,clock-rate=(int)48000,encoding-name=(string)X-GST-OPUS-DRAFT-SPITTKA-00 " ! \
  rtpopusdepay ! \
  opusdec ! \
  audioconvert ! \
  audioresample ! \
  autoaudiosink
```

# それ以外には？

上の二つのパイプラインスクリプトをよく見ると分かるのですが、ようは `opusdec` 以下のパイプラインの書き方次第で、音声処理を自由に操作できます。この辺になると、正直 IoT SDK というより、gstreamer をいかに使いこなすかという話になりますが、可能性はたくさん。

今回紹介したのは、単純な録音と再生ですが、例えば `appsink` [^2] と組み合わせてあげたりすると生の音声データとして取得できちゃうんで、それに音声認識かましたあと自然言語処理をかまして通話内容の統計解析を行なう・・・なんてなことも可能になります[^3]。きっと

ちなみに今回は **録音** というところにフィーチャーして、受信側の話をしましたが、IoT SDK では、送信ストリームも gstreamer なりを使って rtp で渡す形になるので、ここの柔軟性は送信ストリームにもあてはめられます。例えば、カメラ映像に対して、顔認識とかAI/ML系をかましつつ、WebRTC配信するとか。[^4]

まぁ、この辺については、またおいおい

[^1]: SkyWay IoT SDKのインストール＆動かし方は、[以前の記事](https://qiita.com/komasshu/items/f8f3497ca4ee139437a1) を参照
[^2]: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-plugins/html/gst-plugins-base-plugins-appsink.html
[^3]: このレベルになると、 c でのコーディングの話とかになってきますが、 [node-gstreamer-superficial](https://github.com/dturing/node-gstreamer-superficial) みたいに node 版の wrapper なんかもあるんで、以外に気軽にできたりします。
[^4]: SkyWay IoT SDKは現状βリリースの実験的なものですので、その点はご注意を
【Linux】体系的な知識を学べる情報源まとめ

# はじめに
LinuxおよびUNIX likeなOSは、日々いたるところで使われていますが、なかなか体系的に学べる教材が無いかと思います。
lsやcd、加えてsudoやcatなど、日々の開発業務に必要なコマンドは覚えているけれども、その基盤となる仕組みになると理解があいまい、といった方は少なくないのではないかと思います。

そこで、Linuxの初学者向けの、体系的に学べる教材をまとめてみます。
数だけ挙げても目移りしてしまいますので、以下の観点でピックアップしてみました。

- 有償／無償を問わずオンラインで参照でる
- 体系的に整理されてまとまっている


# 情報源
## Linux標準教科書
http://www.lpi.or.jp/linuxtext/text.shtml

LPI-Japanが作成したLinuxの教科書です。
内容はよく整理されてまとまっています。コマンドを試しながら一歩ずつ理解を深めることが出来ると思います。

まずはここから勉強を始めるのが良いのではないでしょうか。
全て日本語なので、英語が苦手な方にもお勧めです。


## Introduction to Linux
https://www.edx.org/course/introduction-linux-linuxfoundationx-lfs101x-1

本当に初歩の初歩、初心者向けのコースです。
教材は、1単位あたりの分量が少なく、ポイントを抑えた記述となっています。
細切れ感がありますが、短時間の学習でも進捗が目に見えて分かるので、モチベーションに繋がるのではないでしょうか。

動画は少なく、重要な内容は文章で提供されているため、英語のリスニングが苦手でも問題なく学習できると思います。


## Linux Tutorial
https://ryanstutorials.net/linuxtutorial/

Linuxコマンドライン操作の基礎について、丁寧に解説されています。
コマンドの実行例が見やすく、丁寧に解説されています。


## The Linux Command Line
http://linuxcommand.org/tlcl.php

Linuxのコマンドラインで良く使うものを丁寧に解説したテキストです。
コマンドの実行例、実行結果が豊富で、また丁寧に解説されています。

Creative Commonsの [CC BY-NC-ND 3.0](https://creativecommons.org/licenses/by-nc-nd/3.0/) licenseに基づいてリリースされています。


## Linux Academy（有料）
Linux Academy提供コースのうち、初学者向けのものは以下の2つがあるようです。

LPI Linux Essentials
https://linuxacademy.com/linux/training/course/name/lpi-linux-essentials

基礎の基礎です。
初歩的な内容から丁寧に説明されています。

Linux+ and LPIC-1: System Administrator - Exam 101
https://linuxacademy.com/linux/training/course/name/lpic1-exam-101

LPIC試験カリキュラムに基づいたコースです。
ポイントを抑えた内容のように見えます。その分、自分でも手を動かしたり、調べたりする必要があると思います。


上記の他にも、Linuxのコースはたくさんあります。
LPIC用の講座は、Level2までそろっているようです。
https://linuxacademy.com/linux/courses


# おわりに
上記以外にも良さそうなサイト／書籍等があれば随時追加していく予定です。

日本語の教材として、体系的にまとまっているものは、やはりLPI-JapanのLinux標準教科書が唯一無二のようです。
英語であれば、良い教材は多いです。
モバイルアプリを超簡単にデバッグする方法

パソコンからInstagramに投稿する方法を調べていたら、凄い簡単にInstagramに投稿できる方法をネットで知りました。

ブラウザのChromeの拡張機能で、User-Agent Switcher for Chromeがあります。
https://chrome.google.com/webstore/detail/user-agent-switcher-for-c/djflhoibgkdhkhhcedjiklpkjnoahfmg

これを使ってウェブサイトを表示すると、スマホやタブレットで閲覧しているようになるため、ウェブサイトがスマホの時のように挙動するというものです。

今回、この拡張機能をセットしてAndroidを選択してInstagramのサイトを表示しました。
![スクリーンショット 2018-04-27 8.40.24.png](https://qiita-image-store.s3.amazonaws.com/0/20977/a572fd3c-f7f2-b580-5c18-fb8c842c4764.png)

この画面のように、Instagramのホームもスマホの画面を大きくした感じで表示できます。
事前に、ご自身のアカウントでInstagramにパソコンでログインしておいてください。
![スクリーンショット 2018-04-27 8.46.13.png](https://qiita-image-store.s3.amazonaws.com/0/20977/090d0e52-73a1-6fa3-632c-ad7243ccf50d.png)

画像の下の中央にある＋のアイコンをクリックすると、画像フォルダが選択されて開きます。
そして、ファイルを選択すると投稿できます。

満月の画像は、今回の方法で投稿したものです。

この拡張機能を活用すると、簡単にモバイルのアプリのデバッグもできると思います。
RaspberryPiの初期セッティング

#01.はじめに
会社でRaspberryPiの紹介をしましたが、セッティングの説明のリクエストがあったので
資料を作るならQiitaでやってみようと思ったものです。
慣れてくれば、技術的な報告はここでやろうかと。

#02.目標
ディスプレイでRaspberryPiのデスクトップが見れること。

#03.準備物
 - [RaspberryPi](
 https://www.amazon.co.jp/Raspberry-ボード＆専用ケースセット-ラズベリーパイ-豊富な付属品-ブラックケース【本体＋コンプリートスターターキット】/dp/B076X2H479/ref=pd_lpo_vtph_147_bs_t_1?_encoding=UTF8&psc=1&refRID=0EZWDFHXGW7G0JJ2P92H)
 - HDMIで接続できるディスプレイ
 - キーボード
 - マウス
 - OSをDownLoadする為のパソコン
 - スターターキットにあるケーブル等々、SDカードリーダー

ケーブルやSDカードを沢山持ってしまうことが余程嫌でない限りは、スターターキットを購入した方が楽です。
![s_DSC00330.JPG](https://qiita-image-store.s3.amazonaws.com/0/244043/2fe46ae4-e8c2-780c-2bcd-e78bcd16e1b5.jpeg)


#04.手順
##04-01.初期化（必要な人）
スタータキットを買った人はOSがプリインストールされていますが、事前に持っていたSDカードを利用する方もいらっしゃるかと思うので、初期化させる手順です。
ここはSDカード初期化のやり方はツール次第ですが、私は「SD Card Formatter」を利用しています。
ボリュームラベルは何でもOKですが分かりやすく「RASPBERRYPI」としました。
![スクリーンショット 2018-04-27 9.20.06.png](https://qiita-image-store.s3.amazonaws.com/0/244043/8dd71f53-de16-da35-6449-b6f2b483e119.png)

正しく初期化されたら、このようなメッセージが出ます。
![スクリーンショット 2018-04-27 9.20.56.png](https://qiita-image-store.s3.amazonaws.com/0/244043/5b0a22cc-dfbb-c3f3-08ca-7168850f61ea.png)


##04-02.OSのダウンロード
[RaspbeyyPi](https://www.raspberrypi.org/downloads/)のHPに移動し、「NOOBS」をクリックします。
![スクリーンショット 2018-04-27 9.32.19.png](https://qiita-image-store.s3.amazonaws.com/0/244043/9d372060-fad6-4959-9e8d-390f548ec716.png)

「NOOBS」と「NOOBS LITE」の２種類ありますが、「NOOBS : Download ZIP」を選択して下さい。
DownLoadは10分〜20分の時間を要します。
![スクリーンショット 2018-04-27 9.32.45.png](https://qiita-image-store.s3.amazonaws.com/0/244043/9fbe6bf7-b7b4-6977-8e95-0c7af3d2baf8.png)

DownLoad完了後のファイルを解凍しますが、圧縮ファイルのサイズが大きいためエラーになる可能性があります。エラーになった場合には
1.DownLoadが失敗
2.解凍が失敗
のどちらかを疑って下さい。解凍が失敗の場合には解凍Tool等の導入をお勧めします。
（どうやらWindows標準ではエラーとなるようです。）


##04-03.OSのインストール
ファイルを解凍をすると下記画像のようなファイルが展開されると思います。
TOPの「NOBES_v2_8_1」を除いた全ファイルをコピーして、SDカード側に貼り付けます。
![スクリーンショット 2018-04-27 9.49.08.png](https://qiita-image-store.s3.amazonaws.com/0/244043/f9d73ad9-a300-5181-e692-0866aec9aa39.png)

OSが入ったSDカードを差し込む。
![s_DSC00336.JPG](https://qiita-image-store.s3.amazonaws.com/0/244043/ec084a03-f81b-8a35-8fd0-aab01fd38e9f.jpeg)

RaspberryPiに接続するのは４つ
1.マウスをUSBで接続（右上）
2.キーボードをUSBで接続（右中）
3.電源ケーブルを接続（左下）
4.ディスプレイにはHDMIで接続（中下）
![s_DSC00338.JPG](https://qiita-image-store.s3.amazonaws.com/0/244043/e45885b5-32ae-eb20-4dbb-48f9315c241b.jpeg)

電源を入れるとセッティングが開始されます。
![s_DSC00343.JPG](https://qiita-image-store.s3.amazonaws.com/0/244043/15ab4b2f-671d-2c53-394f-42382586cded.jpeg)

しばらくすると、下記画面が表示されます
Raspbianを選択し、言語は日本語を選択し、インストールを開始します。
![s_DSC00346.JPG](https://qiita-image-store.s3.amazonaws.com/0/244043/1d16c1f9-eb5a-14ad-54e4-0833f31eaf68.jpeg)

10〜20分ぐらいでインストールは完了します。
![s_DSC00349.JPG](https://qiita-image-store.s3.amazonaws.com/0/244043/66789e8c-7f13-eb85-7077-1402667ac355.jpeg)

完了しました！
![s_DSC00352.JPG](https://qiita-image-store.s3.amazonaws.com/0/244043/5106d66c-d08b-d6d0-69af-a27828a6ba29.jpeg)
flex-boxで子要素の順番を鮮やかに（鮮やかに）入れ換える

# flex-boxで子要素の順番を入れ換える

## はじめに

JavaScriptを使わないとhtmlの中身の順番を入れ換えることはできない。

そういう風に思ってる時代が私にもありました。

### 順番を変えられる、そうdisplay: flex;ならね

```css:style.css
.ul {
    display: flex;
}

.ul li:nth-child(2) {
    order: 2;
}

.ul li:nth-child(3) {
    order: 1;
```

#### 何してんの？

親に大正義、`displaｙ: flex;`して、
順番を替えたい子要素に`order: 1;`とか`2
`とか振って...終わりっ。

**注意**すべきは、`order`のデフォルト値は`0`になります。

つまり、上の例だと指定されていない`li`は`0`になるので、その次に`1`→`2`となりますね。

#### 何に使うのこんなの

横並びに下ものをスマホレイアウトの時に順番を変えつつおとしたいことって割と多いと思います。いや、多いです。

そんな時に、これはmedia queryで消して、同じものを別の順番のとこに用意して...みたいなものはスマートではありません。

同じ記述を二つ（以上）することを許すとその箇所を修正する際に、2度でまになるし、可読性も落ちますね。
他人が読んで分かりやすいコードを書きましょう。

## 最後に

現状（2018年4月）IE11、Edge（!?）でサポートされていないようです、あぁあんん？？

ベンダープレフィックスは書いておきましょう。

```css:style.css
.ul {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-flex-wrap: wrap;
    -ms-flex-wrap: wrap;
    flex-wrap: wrap;
}

.ul li:nth-child(2) {
    -webkit-box-ordinal-group: 3;
    -webkit-order: 2;
    -ms-flex-order: 2;
    order: 2;
}

.ul li:nth-child(3) {
    -webkit-box-ordinal-group: 2;
    -webkit-order: 1;
    -ms-flex-order: 1;
    order: 1;
}
```
phanの `Phan\Exception\IssueException` に悩まされた

Travis上で、掲題のエラーが発生して静的解析を実行できない状態に陥った。
※ ver.はPhan 0.9.4

```
Phan\Exception\IssueException in phar:///home/travis/phan/phan/src/Phan/AST/ContextNode.php:1325
```
実行状態をよく観察してみると、Analysysに入る前にParseのフェーズでコケてるかな？という印象を持った。  
解析に入ったあとであれば、以前に会社のブログにも書いた内容となり「stubとか置いてないかな」で行けそうなのに・・・と感じていた。

http://tech.connehito.com/entry/docker-phan

### 原因の調査
localで `git bisect` などを用いて原因の切り分けを行うにはphanの実行が重すぎるので、 メンバーが活動していない時間帯を狙って "っぽい"コミットとその前後をpushしまくり、Travisに食わせた。

結果として、 `composer require google/cloud` を実行したコミットからこの問題が発生している

### 問題箇所の特定
backtraceをみて、var_dumpデバッグだ・・・！をローカルでやりました。

backtraceが取れているので。

```
Phan\Exception\IssueException in /opt/phan/src/Phan/AST/ContextNode.php:1311 464MB/465MB
Stack trace:
#0 /opt/phan/src/Phan/AST/UnionTypeVisitor.php(1196): Phan\AST\ContextNode->getClassConst()
#1 /opt/phan/src/Phan/AST/Visitor/Element.php(142): Phan\AST\UnionTypeVisitor->visitClassConst(Object(ast\Node))
#2 /opt/phan/src/Phan/AST/Visitor/KindVisitorImplementation.php(22): Phan\AST\Visitor\Element::acceptNodeAndKindVisitor(Object(ast\Node), Object(Phan\AST\UnionTypeVisitor))
#3 /opt/phan/src/Phan/AST/UnionTypeVisitor.php(138): Phan\AST\Visitor\KindVisitorImplementation->__invoke(Object(ast\Node))
#4 /opt/phan/src/Phan/Language/UnionType.php(174): Phan\AST\UnionTypeVisitor::unionTypeFromNode(Object(Phan\CodeBase), Object(Phan\Language\Context), Object(ast\Node), false)
#5 /opt/phan/src/Phan/Language/FutureUnionType.php(57): Phan\Language\UnionType::fromNode(Object(Phan\Language\Context), Object(Phan\CodeBase), Object(ast\Node), false)
#6 /opt/phan/src/Phan/Language/Element/ElementFutureUnionType.php(56): Phan\Language\FutureUnionType->get()
#7 /opt/phan/src/Phan/Language/Element/Property.php(82): Phan\Language\Element\Property->getFutureUnionType()
#8 /opt/phan/src/Phan/Analysis/CompositionAnalyzer.php(76): Phan\Language\Element\Property->getUnionType()
#9 /opt/phan/src/Phan/Language/Element/Clazz.php(2229): Phan\Analysis\CompositionAnalyzer::analyzeComposition(Object(Phan\CodeBase), Object(Phan\Language\Element\Clazz))
#10 /opt/phan/src/Phan/Analysis.php(305): Phan\Language\Element\Clazz->analyze(Object(Phan\CodeBase))
#11 /opt/phan/src/Phan/Phan.php(212): Phan\Analysis::analyzeClasses(Object(Phan\CodeBase), NULL)
#12 /opt/phan/src/phan.php(54): Phan\Phan::analyzeFileList(Object(Phan\CodeBase), Object(Closure))
#13 /opt/phan/phan(2): require_once('/opt/phan/src/p...')
#14 {main}
```

ので、 `/opt/phan/src/Phan/AST/ContextNode.php:1311` 付近で情報をdumpさせるように改変。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/941/05829f56-471a-e8ca-60a5-2e6422066f8b.png)

これで、最後に残された例外の情報から直接の起因がわかる。
`\Google\Cloud\Spannerというクラスがない` という事で。よろしくないですね
![image.png](https://qiita-image-store.s3.amazonaws.com/0/941/9195c20e-5d05-5dcc-7ba5-399c60259f3b.png)

### 対処
今回は使っていないクラスだったので、解析対象から外すという手段を選択可能だった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/941/7fc8597a-6409-0255-cf86-9bfe2b0a16c9.png)
これで、一旦通るようになる。

もしくは、目的としているサービスが限定されているなら(ex: big-query)、セパレートされたパッケージを利用するというのも手。

ex: `composer remove google/cloud && composer require google/cloud-bigquery`
ExcelVBAでローグライクが作れるらしい #1

最近switchを買いました。
突然ですがみなさん、VBAはご存知でしょうか。
wikipediaで検索してみると、

> **VBA**
>- Visual Basic for Applications - プログラミング言語。
>- VisualBoyAdvance - ゲームボーイ・ゲームボーイアドバンスのエミュレータ。
>- VOCAL BATTLE AUDITION - 芸能事務所LDHが主催したオーディションである。略称は「VBA」。
>

と出てきますが、今回は一番上のVisual Basic for Applicationsのお話。

## VBAとは？
簡単にいってしまうとエクセルで行われる様々な作業をマクロを組んで自動化するための言語です。
例えば毎回毎回七面倒な書類を同じ形式で作っている時とか、ひょんなことから何万件もあるデータを分類したり整理しなくてはならなくなった時に使います。
今回はエクセルのセルをマスに見立ててローグライクを実装していくといった方針でやっていきたいと思います。


## ローグライクとは？

さて、数あるゲームの中でもローグライクというものが如何なる物か。ローグライクの定義は地球の砂粒の数より多いと私の中で話題ですが、ここは国民的websiteであらせれるwikipediaさんに　「ok,google ローグライクの定義を教えて」　をしてみましょうか。。。

> ローグライクゲーム(Rogue-like games)は、ローグと同様の特徴を持っているコンピュータRPGの総称である。
ローグライクゲームでは伝統的に全ての情報を文字で表示するが(テキストユーザインタフェース)、オプションでキャラクターや地形等の情報をグラフィカルに表示できるものもある。また、チュンソフトが制作している不思議のダンジョンシリーズ等のコンシューマー用のローグライクゲームでは、グラフィック表示が標準になっている。

ん〜〜よくわかんない。下の動画みたいな感じの物だと思っていただければいいと思う。最近のだとポケモン不思議のダンジョンとかトルネコとか。

<iframe width="560" height="315" src="https://www.youtube.com/embed/aMumSgis-Jg" frameborder="0" gesture="media" allow="encrypted-media" allowfullscreen></iframe>

### 主人公の表示・移動について

どのようなゲームを作るにおいても必要となるのが、主人公の描画です。それなくしてゲームの完成はありえないといっても過言ではないくらい。ここで登場するのがVBA。とりあえず選択中のセルに主人公 @ を表示・移動してみましょう。

まずはゲームのバックグラウンド処理などをするbgシートとgameシートを作成しましょう。また、bgシートのcells(1,1)とcells(1,2)を主人公位置の変数置き場とします。別に他でもいいですけど。とりあえず初期位置として下図のように入力しておいて下さい。
![](https://i.imgur.com/DqnP6wg.png)


以下が主人公を表示するためのコードです。
gameシート関数にコードを追加していきます。

↓ここです
![](https://i.imgur.com/2dFfG8L.png)


```vb
Dim target_before As String
Dim game_sheet, bg_sheet As Worksheet

Sub Worksheet_SelectionChange(ByVal Target As Range)
    Application.ScreenUpdating = False
    Set bg_sheet = ThisWorkbook.Sheets("bg")
    Set game_sheet = ThisWorkbook.Sheets("game")
    
    Call draw_chara(Target)
    
End Sub

Sub draw_chara(ByVal Target As Range)
    target_before = bg_sheet.Cells(1, 2)
    game_sheet.Range(target_before) = ""
    bg_sheet.Cells(1, 2) = Target.Address
    
    Target = "@"
End Sub
```
![](https://i.imgur.com/dH1sDRj.gif)

動いた！！！

コードの詳細について説明すると、```Worksheet_SelectionChange```と言うのはワークシート関数の一つで、ワークシートの選択範囲を常に監視しています。選択範囲の変更が有ると実行されるので、コレをキャラ移動の実装に用いたわけです。
ローグライクにおいては、主人公の行動を一つのターンとして消費します。そのためこの移動を皮切りに```Worksheet_SelectionChange```の中にアイテム取得とかそこら辺の実装をしていけばいいというわけです。

主人公が広大なエクセル世界を探索できるようになったみたいですね。疲れたので今回はここまでにして、次回はマップの自動生成周りについて書いていこうと思います。
Node.jsクラス図(v10.0.0対応版)

2018-04-24(日本時間2018-04-25)にNode.js v10.0.0がリリース:tada:
そのクラス図（`event`付き）を（たぶん）世界最速で公開:innocent::innocent:

https://github.com/darai0512/node-class-diagram
![node-class-diagram.png](https://qiita-image-store.s3.amazonaws.com/0/100881/52744540-3acb-8532-2248-cb5416e22c68.png)

- core moduleの一部のみ
  - net, tls, udp, http, httpsとそれらの親クラスに当たるevents, stream
  - WIP
- [公式ドキュメント](https://nodejs.org/dist/latest-v10.x/docs/api/)記載分のみ
  - [Deprecated API](https://nodejs.org/dist/latest-v10.x/docs/api/deprecations.html)はDocumentation-only[^1]も含め除外
  - 図で[`http.IncomingMessage`に`'close'`イベント](https://nodejs.org/dist/latest-v10.x/docs/api/http.htmｌ)がないのは、`stream`のものを継承していることを表す（ただしoverwriteして別物になっていることもあるので注意）
- 赤字はv9以降で追加されたもの、うちv10.0.0で追加されたのは下記[^2]
  - `EventEmitter` off()
  - [`http.ClientRequest` Event: 'information'](https://nodejs.org/dist/latest-v10.x/docs/api/http.html#http_event_information)
  - [`http.ServerResponse` writeProcessing()](https://nodejs.org/dist/latest-v10.x/docs/api/http.html#http_response_writeprocessing)
  - [`stream.Readable` Symbol.asyncIterator](https://nodejs.org/dist/latest-v10.x/docs/api/stream.html#stream_readable_symbol_asynciterator)
  - [`stream.Stream` finished()](https://nodejs.org/dist/latest-v10.x/docs/api/stream.html#stream_stream_finished_stream_callback)
  - [`stream.Stream` pipeline()](https://nodejs.org/dist/latest-v10.x/docs/api/stream.html#stream_stream_pipeline_streams_callback)

最後に、取り組むきっかけとなった@shigeki さんのv0.8.12の元ネタを紹介させていただくので、
tlsとか見比べてみると面白いです

https://github.com/shigeki/node-class-diagram
![node-class-diagram-v0.8.12.png](https://qiita-image-store.s3.amazonaws.com/0/100881/0f5160ef-874e-97fd-6114-515470b19250.png)


[^1]: Deprecated APIにはDocumentation-only（codeからは消えず使えるが非推奨）、Runtime（実行するとdeprecated warning）、End-of-Life（codeから削除）の3種類がある。通常この順に落とされていくが、`require('assert')`など影響度が大きいものは下げれないので、明確な猶予期間などは定まっていない。
[^2]: 新APIは図以外にも[`fs Promises API`](https://nodejs.org/dist/latest-v10.x/docs/api/fs.html#fs_fs_promises_api)や[`util.types`](https://nodejs.org/dist/latest-v10.x/docs/api/util.html#util_util_types)などたくさん！
CentOS7にChromeをインストール

CentOS7にGoogleChromeをインストールしようとしたところ、スムーズにインストールが出来なかったので解決方法を記録しておきます。

検証環境：CentOS7.4 x64

#事前準備
まずはリポジトリファイルを登録します。

```
vi /etc/yum.repos.d/google.chrome.repo
```
ファイル内は次のように記述します。

```:google.chrome.repo
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
```
情報を反映します。

```
yum update
```
#インストール

```
yum install google-chrome-stable
```
問題が無ければ上記の記述でインストール出来るようですが私の場合は次のエラーが出てきました。

```
エラー: パッケージ: google-chrome-stable-66.0.3359.117-1.x86_64 (google-chrome)
             要求: libappindicator3.so.1()(64bit)
```
知識不足の私はlibappindicatorのインストール方法を調べても見つけることが出来ず手こずりました。
調べ方を試行錯誤しながら見つけた解決法がこちら。

```
yum install epel-release
yum install libappindicator
yum update
```
EPELというパッケージ内にlibappindicatorが含まれているようで、こちらをインストールすることでlibappindicatorがインストール可能になります(EPELについての理解があまり出来ていません)。

もっとスマートな方法もありそうですが、この方法が確実にインストール出来そうです。

libappindicatorのインストールが完了したら再度Chromeをインストールします。

```
yum install google-chrome-stable
```
今度はエラーも出ず問題なくインストールが完了され、インターネットにGoogleChromeが追加されました。
![Screenshot from 2018-04-27 01-54-35.png](https://qiita-image-store.s3.amazonaws.com/0/253556/6dac98b8-5998-f09c-c46c-097bc9e7253f.png)
ESP32でmeshを試してみた

#IDFのexampleの中にMeshがあった
**よくわからないけどとりあえず入れてみよう！！**
1.make menuconfig通らない
2.sudo make menucondig通らない
3.sudo -E make menuconfig 通った
bash_profileの設定でIDF_PATH＝$HOME/esp
としていたのですがsudo権限だとユーザーのprofileが読み込めないらしいです -Eをつけてあげると今のユーザーの環境を読み込んでくれるみたい
4.wifiの設定をする
5. serial portの設定
6. 書き込み
**通った！！！**
#何ができたか
２台のESPに書き込みシリアルポートを確認押したところ<img width="808" alt="スクリーンショット 2018-04-27 1.47.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/243994/3fab87e1-fff5-d073-64ca-fc5598aee85f.png">
メッシュ的に繋がってるっぽいです
片方落としたりしてみたらparentが変わりました
<img width="820" alt="スクリーンショット 2018-04-27 1.54.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/243994/fcd62096-146b-f603-0ef8-58ea0ba54a51.png">
#本当はBLEでメッシュがしたかったんや
**おわり**
git grepで特定のディレクトリを除外して複数文字列を検索する

# gitでファイル内の文字列を検索したい
エディタとか使ってもできるのだけど、
ささっとターミナルでコマンド打って**ポン**としたい。
`git grep`をやってみたので、備忘も兼ねて書きました！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/106459/bc6f631b-494a-d7e8-0710-b1e556659c23.png)

詳しい説明は[Gitの公式サイト](https://git-scm.com/docs/git-grep)をご確認ください。

# git grepしてみた
### **1. 文字検索**
*apple*という文字列を検索

```
git grep -e 'apple' 
```

### **2. 複数文字列を検索**
*apple*と*banana*という文字列を検索

```
git grep -e 'apple' -e 'bana
```

###  **3. 任意のフォルダを除外して、複数文字列を検索**
*animal*フォルダ配下は除外して、*apple*と*banana*という文字列を検索

```
git grep -e 'apple' -e 'banana' -- ':!animal/'
```

# 使ってよかった点
- 正規表現が使える
- 行数や該当ファイル、ファイル自体の検索などオプションがたくさんある。
- ターミナルでやっているのでテキストファイルとかにも出しやすい。
- grepの結果は、わかりやすくハイライトされる。

簡単にgrepできるので皆さんも試してみてください。
MySQLのPOINT型を用いて距離が近いレコードを検索する

# 概要
mysqlで位置を表すレコードを検索する場合は、[Spatial Data Types](https://dev.mysql.com/doc/refman/5.7/en/spatial-type-overview.html)のPOINT型を使うのが良いです。
その説明をします。

# なぜSpatial Data Typesを使う必要があるのか
例えばこんなテーブルがあったとするじゃないですか

```
CREATE TABLE `location_lat_lng` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `lat` double NOT NULL,
  `lng` double NOT NULL,
  PRIMARY KEY (`id`),
  KEY `lat` (`lat`,`lng`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
```

latitudeとlongtitudeを表した位置情報のテーブルです。
でこういうクエリを投げるじゃないですか

```sql
select * from location_lat_lng 
where lat between 35.681  and 35.691
  and lng between 139.757 and 139.767;
```

で、これ、インデックスがそこまで有効に使われません。MySQLは普通のインデックスの複数の範囲指定には弱いのです。詳しくは実践ハイパフォーマンスMySQLの5.4.2とか読むと良いです。

で、こういう要件の検索を高速に行うにはSpatial Data Typesが有効です。こいつらのインデックスはR-Treeインデックスと言って、上記のようなユースケースの検索に強いです。

# Spatial Data Typesとは
MySQLの型で、位置、線、図形のような概念のためのデータ型です。でSpatial Data Typesはオブジェクト指向言語のクラス階層のようになっていて、一番上がGEOMETRY型、その下にPOINT型があったりとか、そんな感じになってます。

* https://dev.mysql.com/doc/refman/5.7/en/gis-geometry-class-hierarchy.html

で、位置の検索する場合はPOINT型を使います。

# POINT型を使う
POINT型は上で使ったテーブルのlatとlngを合わせて1つにしたようなデータ型です。
これを使って上記テーブルを書き換えるとこんな感じ

```
CREATE TABLE `location` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `loc` point NOT NULL,
  PRIMARY KEY (`id`),
  SPATIAL KEY `loc` (`loc`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
```

locというPOINT型のカラムになっています。
で、例えば、35.685, 139.762の地点から1kmメートル以内の地点を探す、ってなるとこんな感じ

```
select id, ST_X(loc), ST_Y(loc) from location where ST_Within(loc, ST_Buffer(POINT(35.685, 139.762), 0.009));
```

一つずつ解説すると、

* POINT型のインスタンスはPOINT(x, y)な感じで作ります。
* ST_Buffer(g, d)で、gから距離dの図形、つまり今回の場合POINT(35.685, 139.762)を中心とした半径0.009の円。
    * で、この距離0.009というのが緯度経度と同じ度数で、地球１周が40,075kmなので 40,075km * (0.009/360) ≒ 1km。
* ST_Within(g1, g2)が、g1がg2に含まれていたらtrueになる関数。
    * よって、今回の場合POINT(35.685, 139.762)から半径1kmの円の中に入っていればtrue
* locを直接selectするとlocのバイナリ表現がそのまま出力されるらしく、わけがわからない。なので、selectの部分でPOINTからlat, lngを取り出すST_X, ST_Y関数を使っている。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94/fa12e2c2-6073-58b2-ae5e-975285905398.png)

参考: https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html

このままだと距離順にソートされてないので、近い順で取得するにはどこかでソートする必要があるが、これはmysql側でやってもアプリケーション側でやっても変わらないので、保守性・スケール性から考えてアプリケーションでやった方がいいと思う。

あと、ここら辺はだいたいquery dsl的なやつで書けないから、生SQLを書くことになりそう。
rubyで多重配列の総当たり(直積/デカルト積)をワンライナーで作成する

# やりたいこと

```ruby
[
  ['1', '2'],
  ['a', 'b'],
  ['x', 'y']
]
```
のような配列から

```ruby
[
  ['1', 'a', 'x'],
  ['1', 'a', 'y'],
  ['1', 'b', 'x'],
  ['1', 'b', 'y'],
  ['2', 'a', 'x'],
  ['2', 'a', 'y'],
  ['2', 'b', 'x'],
  ['2', 'b', 'y'],
]
```
といった総当たりの組み合わせ(デカルト積/直積)を求めたい

# 実装コード
※要ruby1.8.7以降

```ruby
arr = [
  ['1', '2'],
  ['a', 'b'],
  ['x', 'y']
]

arr.inject(:product).map(&:flatten)
```
もしくは

```ruby
arr.inject(&:product).map(&:flatten)
arr.reduce(:product).map(&:flatten)
arr.reduce(&:product).map(&:flatten)
```
のいずれか

# 以下解説
今回の要になるのは「inject」「product」「&:」の3要素です

## enum.inject
繰り返しの計算を行うメソッドになります。

前回の返り値と、次の配列の要素のペアでブロック内を計算していきます。
イメージとしては下記のような感じです

```
((((要素1 + 要素2) + 要素3) + 要素4 ) + 要素5 ) + ...
```
実際に使用する際は下記のように記載します。

```ruby
arr = [1, 2, 3, 4]
p arr.inject{|sum, n| sum + n } #=> 10
p arr.inject{|mul, n| mul * n } #=> 24
```

inject(reduce)のすごいところはsymbolでメソッド名を渡すことで、そのメソッドをブロック内にて演算してくれます。

その為上記はこのようにも書けます

```ruby
arr = [1, 2, 3, 4]
p arr.inject(:+) #=> 10
p arr.inject(:*) #=> 24
```
ものすごくスマートになりましたね


## array.product
今回の最重要メソッドです。これがいないと何も始まらない
元となる配列と引数の配列の要素の組み合わせの多重配列を作成して返してくれます。

総組み合わせを作りたい配列達が今回のように一つの配列に入ってなければでなければ以下のようにして求められます

```ruby
arr1 = ['1', '2']
arr2 = ['a', 'b']
arr3 = ['x', 'y']

arr1.product(arr2, arr3) #=> [['1', 'a', 'x'],['1', 'a', 'y'], ...]
```

しかし今回は連想配列の為、上記方法がそのまま使用できません。
injectをでproductを呼んでやってみると下記のようになってしまいます

```ruby
arr = [
  ['1', '2'],
  ['a', 'b'],
  ['x', 'y']
]

arr.inject(:product) #=> [[['1', 'a'], 'x'],[['1', 'a'], 'y'], ...]
```
ただ、一つの配列の中にまとまってくれているのでflattenしてあげれば綺麗になってくれそうです。
mapでflattenしてあげましょう

```ruby
arr = [
  ['1', '2'],
  ['a', 'b'],
  ['x', 'y']
]

p arr.inject(:product).map{|e| e.flatten} #=> [['1', 'a', 'x'],['1', 'a', 'y'], ...]
```
これでひとますは完成です。
ちなみにproductだけでやろうとすると下記のような感じでできます。

```ruby
arr = [
  ['1', '2'],
  ['a', 'b'],
  ['x', 'y']
]

first_arr = arr.shift()
first_arr.product(*arr)
```

下記のように記載すると簡単に書けるのではないかと思うかもしれませんが、これはNGです。
productは空配列があると返り値も空配列になってしまう為、全てが無に帰してしまいます。

```ruby
p [].product(*arr) #=> []
```

## &:
知ってて損はない便利記法

簡単に言うと

```ruby
{|e| e.hoge }
```

をこういうふうに書けますよっていう記法です。

```ruby
(&:hoge)
```

そのために`map{|e| e.flatten}`は下記のように書き直せます。

```ruby
map(&:flatten)
```

詳しく知りたい人は下記の記事などを読むといいかもしれない

https://qiita.com/kasei-san/items/0392097791d3a5998216

# 余談

Array#productを知らないときにノリと勢いだけで書いたクソコードの供養

```ruby
arr = [[1,2],['a','b','c'],['x','y']]

x = arr.map{|a| a.length}.inject(:*)
y = x

ans = arr.map do |a|
  x /= a.length
  tmp = a.map{|b| Array.new(x) { b }}.flatten
  Array.new(y/tmp.length){ tmp }.flatten
end

p ans.transpose
```

完成させた後にproductの存在を知って悔しかったのでこの記事を書いた
PHPでシンプルな掲示板を製作

PHPで単純な掲示板を製作。idで降順(最新が上位にくる)になるように、またリロード時の二重投稿への対策はしています。

データベースlocaldbのuserテーブルのデータはid(A_I), name, commentのみです。

```html:index.php
<!DOCTYPE HTML>
<html lang="ja">

<head>
</head>

<body>
	<form method="post" action="">
		<input type="text" name="name" value="">
		<input type="text" name="comment" value="">
		<input type="submit" name="regist" value="登録">
	</form>
</body>
<?php
?>
</html>
```

```php:php
<?php
	$host = 'localhost:8889';
	$dbname = 'localdb';
	$dbuser = 'root';
	$dbpassword = 'root';
	$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8","$dbuser","$dbpassword");
	#データベースへの登録
	if( isset($_POST['regist']) ){
    	$name = $_POST['name'];
		$comment = $_POST['comment'];
		$sql = "INSERT INTO user (name, comment) VALUES ('$name', '$comment')";
		$res = $pdo->query($sql);
	}
	#テーブル内容の表示
	$sql = "SELECT * FROM user ORDER BY id DESC";
	$stmt = $pdo->query($sql);
	foreach ($stmt as $row) {
		echo $row['name'].' '.$row['comment'];
		echo '<br>';
	}
	#リロード時の二重投稿を防止
	if($_SERVER['REQUEST_METHOD'] === 'POST') {
    header('Location:http://localhost:8888/index.php', true, 303);
	}
	#終了
	$stmt = null;
	$pdo = null;
?>
```

---
php部分を改訂してみました。 vol.1

```php:php
<?php
	$host = 'localhost:8889';
	$dbname = 'localdb';
	$dbuser = 'root';
	$dbpassword = 'root';
	$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8","$dbuser","$dbpassword");
	#データベースへの登録
	if( isset($_POST['regist']) ){
    	$name = $_POST['name'];
		$comment = $_POST['comment'];
		$stmt = $pdo -> prepare("INSERT INTO user (name, comment) VALUES (:name, :comment)");
		$stmt->bindParam(':name', $name, PDO::PARAM_STR);
		$stmt->bindParam(':comment', $comment, PDO::PARAM_STR);
		$stmt->execute();
		$pdo->query($stmt);
		header("Location: " . $_SERVER['PHP_SELF']);
	}
	#テーブル内容の表示
	$sql = "SELECT * FROM user ORDER BY id DESC";
	$stmt = $pdo->query($sql);
	foreach ($stmt as $row) {
		echo htmlspecialchars($row['name'], ENT_QUOTES|ENT_HTML5).' '.htmlspecialchars($row['comment'], ENT_QUOTES|ENT_HTML5);
		echo '<br>';
	}
?>
```
2千円台オシロスコープ DSO150のレビュー

## はじめに
UART関連で不具合に苦しんだ筆者は、原因調査のためオシロスコープを欲した。
しかしながら、巷で売られているまともなオシロは数万円と極めて高価である。
そこで、ebayで2500円程度の安物オシロを購入してみた。
[Orignal Tech DS0150 15001K DSO-SHELL (DSO150) Digital Oscilloscope With Housing](https://www.ebay.com/itm/172709889866)
本記事では、こいつの使用感をレビューする。

## 外観
到着時の外観は、このようである。
![到着時の外観](https://qiita-image-store.s3.amazonaws.com/0/127392/c75d2253-0d8c-ac9e-5c56-a7d5d21ff7eb.jpeg)
DIYキットのため、スルーホール部品は全て自分ではんだ付けしなければならない。
ネットでは抵抗の値が読みにくくて辛かったというレビューがあるが、**現行版では全てチップに置き換わっているため、抵抗を自分ではんだ付けする必要はない**。
このため、実装作業は手順書に従いつつ特に苦労もなく完了するはずである。

はんだ付けおよび組み立て後の外観は、このようである。
<img src=https://qiita-image-store.s3.amazonaws.com/0/127392/9b9b58db-7095-3375-3f17-ec6135e96ed6.jpeg width=50%>

なお、組み立て完成品も販売されており、ebayで[3800円](https://www.ebay.com/itm/Fully-Assembled-Orignal-Tech-DS0150-15001K-DSO-SHELL-DSO150-DIY-Digital-Oscill-/263545968191?hash=item3d5c90563f)、秋月では[3450円](http://akizukidenshi.com/catalog/g/gM-12972/)である。
悲しいことだが、今や日本よりも中国の方が人件費が高いのだ（嘘）。

また、[組み立て説明書](http://akizukidenshi.com/download/ds/jye/UserManual_Shell_light.pdf)を見て分かる通り、Step4やStep5で動作確認やキャリブレーションの工程がある。
それほどいい加減な製品ではないことは想像できるだろう。


## ハードウェア仕様
主なハードウェアの仕様は下記の通りである：
![spec.png](https://qiita-image-store.s3.amazonaws.com/0/127392/2263a00c-8da8-6d6d-7930-45f4c3d1f545.png)
明記はされてないが、**入力は1CHのみ**である。
電源は9V。USBポートから9V電源を得られるデバイスを買えば、重宝する。
[DC-DC USB 5V to 9V DC Jack 5.5mmx2.1mm Step-up Power Module Converter Cable Cord](
https://www.ebay.com/itm/201592649055)

## ソフトウェア仕様
ソフトウェアの機能として次が挙げられる：

* 電圧分解能の調整機能
    * 1DIVの電圧を下記から選択可能
        * `5mV, 10mV, 20mV, 50mV, 0.1V, 0.2V, 0.5V, 1V, 2V, 5V, 10V, 20V`
* 時間分解能の調整機能
    * 1DIVの時間幅を下記から選択可能
        * $t\times 10^{n} \;\mathrm{ms}$ where $t=1,2,5$ and $-2\leq n\leq 5$
        * つまり、`10us, 20us, ..., 200s, 500s`
* **トリガー機能**
    * 電圧レベルを指定し、立ち上がり/立ち下がりの好きな方でトリガーをかけることができる
    * トリガー位置前後で40DIV程度の時間幅を記録できるので、多くの用途で事足りる
    * 2つの動作モードを利用可能
        * Normal mode: 連続してトリガーが掛かる
        * Single shot: 1回掛かったら、リセットするまでHoldされる
    * まあこれさえあればオシロとしては十分機能を果たせるだろう
* 波形の記録機能
    * 1画面分だけ、波形を内部EEPROMに保存できる
    * 保存した波形は、いつでも画面上に呼び出せる
    * あまり使い途は思い浮かばない

## 使用感
え、普通に使える……
<img src=https://qiita-image-store.s3.amazonaws.com/0/127392/ea3e5cc1-20cf-7a48-0162-eefc658f089e.jpeg width=70%>

自分はデジタル工作しかしないので、その観点からのみ言えば：

* 38400bpsくらいの信号なら、まあキレイに観測できる
* それ以上いくと、ちょっと波形が怪しくなる（でも信号があることは見える）
    * なぜか1DIVを20us以下にすると、うまくトリガーにかからなくなってしまうため……
        * 原因不明（下図は115200bps）
       
<img src=https://qiita-image-store.s3.amazonaws.com/0/127392/54835a06-6660-bb21-6eae-697b80b2722d.jpeg width=70%>

* 一応921600bps(921kbps)でもなにか信号が出ていることは観測できる
* それ以上はTeraTermの上限を超えるので試せていないが、サンプル周波数が1MS/sであることを考えれば、難しいだろう

マイコン工作をしていて、なんかうまくいかない、そもそもUART信号出てるのかコレ……というシチュエーションには十分使えると思われる。

## まとめ
* 3千円オシロスコープを購入して組み立てた 簡単だった
* 趣味のマイコン工作には十分実用に耐えうる性能を持っている
* 買い！
【PHP】arrayとforeachでテーブルタグをスマートに組む

改めてPHPの復習がてらに書き起こし。
プログラム初心者の方は是非ご覧ください。

##$tableに配列を入れ込む

```tbl.php
<?php

$table= array(
	array("a1","a2"),
	array("b1","b2")
);

?>
```
これで行＋列の二次元配列が、$tableの中に入りました。

##$tableを出力しよう

```tbl.php
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title></title>
</head>
<body>

<table border=1>
	<?php foreach($table as $row){ ?>
	<tr>
		<?php foreach($row as $cel){ ?>
			<td><?= $cel?></td>
		<?php } ?>
	</tr>
	<?php } ?>
</table>

</body>
</html>
```

##以上
tableタグを文字列にして、変数と結合して...ってやるよりもスマートに書けます。
数が増えても、HTML側は編集しなくて済むので楽チンです。
CentOS7にRubyとRuby on Rails環境構築

# はじめに
できるだけ環境を汚さないようにRuby on Rails環境を構築する手順をまとめました。
RubyとRuby on Railsのバージョン管理ができるだけやり易いように配慮しています。
実施した環境はCentOS 7.4です。Ubuntuなどでもほぼ同じ手順でできる思います。

# 事前準備
GitとRubyのビルドに必要なものをインストール

```console
$ sudo yum update
$ sudo yum install -y git
$ sudo yum install -y bzip2 gcc openssl-devel readline-devel zlib-devel
```

# [^rbenv]rbenvのインストール
ホームディレクトリにインストールし、さらに[^ruby-build]ruby-buildも入れます。

```console
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

`~/.bashrc`(または`~/.bash_profile`)に以下を追記します。

```shell:~/.bashrc
# rbenv
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

反映させ、確認します。

```console
$ source ~/.bashrc
$ rbenv -v # バージョンが表示される。
```

# Rubyのインストール
Rubyのインストール可能なバージョンを確認します。

```console
$ rbenv install --list
```
任意のバージョンのRubyをインストールします。(今回は2.5.1を指定しました）

```console
$ rbenv install 2.5.1 # 時間かかります
```
インストールしたバージョンのRubyをrbenvに設定し、確認します。

```console
$ rbenv global 2.5.1 # ※インストールしたバージョンを指定
$ ruby -v # Rubyが実行できることを確認
```

# Rails環境の作成（ディレクトリに隔離）
[^bundler]bundlerをインストール

```console
$ gem install bundler
```
Railsの利用可能なバージョンを確認します。

```console
$ gem query -ra -n  "^rails$"
```
Railsの任意のバージョンの環境をディレクトリにまとめます。
(今回は5.2.0を指定しました）

```console
$ mkdir rails_v5.2.0 # お好きな名前を
$ cd rails_v5.2.0
$ bundle init # カレントディレクトリにGemfileを作成
$ echo 'gem "rails", "5.2.0"' >> Gemfile # ※ 任意のバージョンを指定
$ bundle install --path vendor/bundle # ./vendor/bundleにRails関連のGemが入る
```

## 「bundle exec」省略設定
今のままだとrailsコマンドを実行するときに、`bundle exec rails`と入力しないといけないので、これを省略できるようにする設定をします。(参考: [bundle execを省略してみる - Qiita](https://qiita.com/etsracas/items/42ce27f04af462e2591b))

便利なスクリプトをダウンロード

```console
$ curl -L https://github.com/gma/bundler-exec/raw/master/bundler-exec.sh > ~/.bundler-exec.sh
```
`~/.bundler-exec.sh`を編集します（下の方のリストにrailsを追記）

```shell:~/.bundler-exec.sh
<<< 省略 >>>
unicorn
unicorn_rails
wagon
rails   <-これを追記
}"

define-bundler-aliases

unset -f define-bundler-aliases
```
`~/.bashrc`（または`~/.bash_profile`）に以下を追記します。

```shell:~/.bashrc
# "bundle exec" shortcut setting
[ -f ~/.bundler-exec.sh ] && source ~/.bundler-exec.sh
```
反映します。

```console
$ source ~/.bashrc
```

# Railsプロジェクトの作成
Railsのプロジェクトは、上記で作成したRailsディレクトリの中で作成します。
Gemはプロジェクトごとのディレクトリにインストールするようにします。

```console
$ cd ~/rails_v5.2.0 # 上記で作成したRailsディレクトリに移動
$ rails new <プロジェクト名> --skip-bundle # プロジェクトの作成
```
`--skip-bundle`は[^bunins]`bundle install`を自動で行わないようにするオプションです。これをしないと、Ruby自体にGemがインストールされてしまいます。
今回はそうではなく、プロジェクトフォルダ内の`vendor/bundle`内に、プロジェクトで必要なGemをインストールしたいと思います。

```console
$ cd <プロジェクトフォルダへのPath>
$ bundle install --path vendor/bundle # ./vendor/bundleにGemをインストール
$ echo '/vendor/bundle' >> .gitignore # Gitの管理対象から外す
```

# MySQL(MariaDB)の設定
別記事にまとめています。
[MariaDBのインストール/初期設定 [CentOS7] - Qiita](https://qiita.com/ponsea/items/9578659009b434c60959)

# まとめ
本記事のやり方で、RubyとRailsのバージョンを簡単に管理することができます。また、できるだけ環境を汚したくない方にとっても良い方法だと思います。

[^rbenv]: Rubyのバージョン管理ツール
[^ruby-build]: Rubyのビルドスクリプト
[^bundler]: Rubyの[^gem]Gemを束ねて管理することができるツール
[^bunins]: bundlerがGemfileを元に一括でGemをインストールするコマンド
[^gem]: Rubyの拡張パッケージ
macports環境でLightGBMのインストール

macportsベースでインストールしたのでメモ。

# いろいろインストール

```txt
$sudo port install gcc6 openmpi-gcc6
```

# LightBGMのビルド

```txt
$git clone --recursive https://github.com/Microsoft/LightGBM; cd LightGBM
$mkdir build
$cd build
$cmake -DCMAKE_CXX_COMPILER=g++-mp6 -DCMAKE_C_COMPILER=gcc-mp-6 ..
$make -j4
```

この状態でpipからlightgbmをインストールすると、うまく関連付けできなくて動かないので、自分で入れる。情報はLightGBMのgithubのissueにあった。

- https://github.com/Microsoft/LightGBM/issues/710


今回はMacPortsでインストールしたg++-mp-6/gcc-mp-6を使っているので、それベースでsetup.pyからインストールする。


```python
# at setup.py
cmake_cmd.append("-DCMAKE_CXX_COMPILER=clang++-mp-5.0")
cmake_cmd.append("-DCMAKE_C_COMPILER=clang-mp-5.0")
```

あとはsudo python setup.py installを実行する。
たかがシャッフル、されどシャッフル 〜"permute-with-all" order biasの検証〜

先日、
[【Swift4】 ArrayをShuffleする](https://qiita.com/BMJr/items/c066b4b55bbd01f74495)
というタイトルで投稿しました。

```swift
var anArray = ["阿部","伊東","佐藤","鈴木","田中","中村","藤井","松井","村田","吉田"]
for i in 0 ..< anArray.count{
            let r = Int(arc4random_uniform(UInt32(anArray.count)))
            anArray.swapAt(i, r)
        }
```
上記の方法では、結果に偏りが生じるというコメントを頂き、以下のサイトを教えて頂きました。
[フィッシャー–イェーツのシャッフル：誤った実装による順序の偏り](https://ja.wikipedia.org/wiki/フィッシャー–イェーツのシャッフル)
それを踏まえて、"permute-with-all" order biasを検証してみました。

```swift
        //要素数 = n,試行回数 = repeatCount (自由に変更して下さい)
        let n = 5
        let repeatCount = 100000
        //twoDimArray[要素番号][試行回数何回目か] = 移動先の番号
        var twoDimArray = [[Int]]()
        let originalArray = Array<Int>(0 ..< n)
        for _ in 0 ..< n{
            twoDimArray.append([])
        }
        for _ in 0 ..< repeatCount{
            var anArray = originalArray
            for i in 0 ..< n{
                let r = Int(arc4random_uniform(UInt32(n)))
                anArray.swapAt(i, r)
                }
            for i in 0 ..< n{
                twoDimArray[i].append(anArray.index(of: i)!)
                }
        }
        for i in 0 ..< n{
            var postShuffleCite = [Int](repeating: 0, count: n)
            for j in 0 ..< repeatCount{
                postShuffleCite[twoDimArray[i][j]] += 1
            }
            for k in 0 ..< n{
                let probability = Double(postShuffleCite[k]) / Double(repeatCount) * 100.0
                print("\(i)が\(k)番目に移動する確率は、\(probability)%")
            }
            print("\n")
        }
```
n = 5、試行回数10万回で検証して以下のような結果を得ました。

0が0番目に移動する確率は、19.839%
0が1番目に移動する確率は、20.138%
0が2番目に移動する確率は、20.078%
0が3番目に移動する確率は、19.942%
0が4番目に移動する確率は、20.003%


1が0番目に移動する確率は、24.255%
1が1番目に移動する確率は、18.19%
1が2番目に移動する確率は、18.485%
1が3番目に移動する確率は、19.104%
1が4番目に移動する確率は、19.966%


2が0番目に移動する確率は、20.902%
2が1番目に移動する確率は、22.843%
2が2番目に移動する確率は、17.436%
2が3番目に移動する確率は、18.719%
2が4番目に移動する確率は、20.1%


3が0番目に移動する確率は、18.423%
3が1番目に移動する確率は、20.351%
3が2番目に移動する確率は、23.144%
3が3番目に移動する確率は、18.018%
3が4番目に移動する確率は、20.064%


4が0番目に移動する確率は、16.581%
4が1番目に移動する確率は、18.478%
4が2番目に移動する確率は、20.857%
4が3番目に移動する確率は、24.217%
4が4番目に移動する確率は、19.867%

・・・かなり大きな偏りが出るようです。
ちなみにn = 7にすると「フィッシャー–イェーツのシャッフル (Wikipedia)」の["permute-with-all" order biasのサンプル](https://upload.wikimedia.org/wikipedia/commons/9/90/Probabilities7.svg)とほぼ同様の結果が得られました。

※※偏りをなくす方法※※

```swift
let r = Int(arc4random_uniform(UInt32(n)))
```
を以下のように書き換えます。

```swift
let r = Int(arc4random_uniform(UInt32(n - i))) + i
```
上記により、シャッフル後の移動確率が均一になります。

※以下のように、extensionにする方法もあります。

```swift
extension Array{
    mutating func shuffle(){
        let n = self.count
        for i in 0 ..< n{
            let r = Int(arc4random_uniform(UInt32(n - i))) + i
            self.swapAt(i, r)
        }
    }
}
```
それから、

```swift
for i in 0 ..< n{
                let r = Int(arc4random_uniform(UInt32(n)))
                anArray.swapAt(i, r)
                }
```
の部分を

```swift
anArray.shuffle()
```
と書き換えます。
extensionの中身を色々書き換えて上記コードを用いれば、shuffle後の偏りの検証に使えますので皆様ご利用下さい。