OmniAICreator/Qiita-1.07M huggingface dataset:
アスキーアート関連の論文を探してみた

どうも@scrpgilです
AAが好きでAAをエンジニアリングしたいAAエンジニアです。

もう2018年が終わりそうですね。私は2019年にはAAを機械学習を使って分類したいという目標があるのですが、アスキーアート関連の論文をほとんど読んだことないです。
そこで、本記事はGoogle ScholarやCinii、Google検索でアスキーアート関連の論文を探してみたのでいくつか紹介したいと思います。

### アスキーアート自動抽出法の提案(2010)
KDDO研究所による電子掲示板などテキストとアスキーアートの両方が含まれている文章からアスキーアートを抽出する研究。
行ごとにAAが含まれるか検出する→AAが含まれる行はその前後もAAである可能性が高い。という特徴から文章中からAAを抽出する技法とのこと。実験結果は抽出率97〜98%ほどと高い。
[リンク(PDFあり)](https://ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=139746&item_no=1&page_id=13&block_id=8)

### アスキーアート分類手法の比較検討(2018)
アスキーアートを文字集合として扱うか、画像として扱うか、どちらの方が分類機の特徴量として適しているか比較した研究。画像はCNNと文字画像ベクトルをFFNNで学習する手法、文字特徴量をFFNNと文字重要度で学習する手法が行われいてる。実験の結果は、文字画像ベクトルが全体的に高い成功率。画像特徴量でCNNが作品単位で最高の成功率となった。ただ、文字画像ベクトルを用いた手法は同じキャラを違う文字で作成している場合に不利だそう。
AAからどのように特徴量を抽出するか考える時に参考にしたい。
[リンク(PDFあり)](https://www.jstage.jst.go.jp/article/pjsai/JSAI2018/0/JSAI2018_2Z304/_article/-char/ja/)


### テキスト圧縮を用いた言語に依存しないテキストアート抽出法(2009) 
なんと、テキストを圧縮しアスキーアートを抽出する手法。同じ文字が2回現れる回数、行数、テキストのバイト数というのが特徴量として扱われるらしい。なるほど。
[リンク(PDFあり)](https://ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=66259&item_no=1&page_id=13&block_id=8)


### アスキーアート検索エンジンの実験的実装(2008)
類似アスキーアートを探す検索エンジンを実装した論文。方法としては縦方向、横方向、出現回数wお元にインデックスを生成しているらしい？
[リンク(PDFあり)](https://ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=137054&item_no=1&page_id=13&block_id=8)


### 形態素解析に基づくSVMを用いたアスキーアートの識別(2005)
SVMを使って文章中からAAを抽出する実験らしい。PDFがなかったので国立国会図書館とかで資料請求しないと読めない。残念。
[リンク](https://ci.nii.ac.jp/naid/110003275719)


### 画像特徴量を用いた大型アスキーアートの分類手法の提案(2017)
AAを画像化してHOG特徴量を使って分類する実験。
[リンク(PDFあり)](https://www.jstage.jst.go.jp/article/pjsai/JSAI2017/0/JSAI2017_2O3OS22b3/_pdf/-char/ja)


### アスキーアートへの挑戦 ─画像特徴量によるアプローチ─(2017)
気になるタイトルだけど有料のため読めないし内容わからなかった。
[リンク](https://ci.nii.ac.jp/naid/190000007166)


### ASCII Art Synthesis with Convolutional Networks(2017)
CNNを使ってAsciiArtを生成する研究。Qiitaの記事も話題になったやつです。
[リンク(PDFあり)](https://www.semanticscholar.org/paper/ASCII-Art-Synthesis-with-Convolutional-Networks-Akiyama/eb23e948e576e96fd138e85e13bcec9f93aacda7)


### ASCII Art Classification based on Deep Neural Networks Using Image Feature of Characters(2018)
上にあるアスキーアート分類手法の比較検討(2018)の英語版でした。
[リンク(PDFあり)](http://www.jsoftware.us/index.php?m=content&c=index&a=show&catid=199&id=2901)


### ASCII Art Classification - CUHK CSE
SIGGRAPHで発表された内容らしい。扱っているのは等幅フォントのAA。
[(注意)ppsファイルのリンク](http://www.cse.cuhk.edu.hk/~ttwong/papers/asciiart/asciiart.pps)

### Structure-based ASCII Art
上の論文の作者の別の論文。等幅フォントだけどもAA生成に関する論文。
[PDF](http://www.cse.cuhk.edu.hk/~ttwong/papers/asciiart/asciiart.pdf)


## まとめ
以上、結構たくさんありますね。AAから特徴抽出するならやはり画像化するのが良いんですかね？
しかし、文字列のままうまいこと分類できればメモリにもやさしいような気がするしその方面を探ってみたい気もあります。
それでは。
0xプロトコルv1.0とv2.0のオーダーフォーマットを比較する

# モチベーション
メモ程度に0xのv1.0からv2.0へのアップデートにより変更したオーダーフォーマットの仕様を比較する。間違い、ご意見あれば[Twitter経由](https://twitter.com/WatanabeSota?lang=en)でご連絡ください。

# オーダーの変更点

v1.0のオーダーフォーマット

```javascript:v1Order
// MakerのEthereumアドレス
maker: string;
// TakerのEthereumアドレス。指定がなければ誰でもfillできる
taker: string;
// MakerがいくらのZRXをリレイヤーに手数料として払うか
makerFee: BigNumber;
// TakerがいくらのZRXをリレイヤーに手数料として払うか
takerFee: BigNumber;
// Makerがいくら分オーダーをだすか
makerTokenAmount: BigNumber;
// TakerからMakerがいくらほしいか
takerTokenAmount: BigNumber;
// Makerが提示しているトークンのアドレス
makerTokenAddress: string;
// Makerがリターンに欲しているトークンのアドレス
takerTokenAddress: string;
// 取引をユニークにするための乱数
salt: BigNumber;
// 0xプロトコルのスマートコントラクトアドレス（ネットワークごとに違う）
exchangeContractAddress: string;
// リレイヤーが手数料をもらうアドレス
feeRecipient: string;
// 有効期限
expirationUnixTimestampSec: BigNumber;
```

v2.0のオーダー

```javascript:v2Order
// MakerのEthereumアドレス
makerAddress: string;
// TakerのEthereumアドレス。指定がなければ誰でもfillできる
takerAddress: string;
// リレイヤーが手数料をもらうアドレス
feeRecipientAddress: string;
// 後解説
senderAddress: string;
// Makerがいくら分オーダーをだすか
makerAssetAmount: BigNumber;
// Makerがいくら分リターンとして欲しているか
takerAssetAmount: BigNumber;
// Makerが手数料としていくらのZRXをリレイヤーに支払うか
makerFee: BigNumber;
// TakerがいくらのZRXをリレイヤーに手数料として払うか
takerFee: BigNumber;
// オーダーの有効期限はいつか
expirationTimeSeconds: BigNumber;
// 有効期限
salt: BigNumber;
// Asset ProxyとAsset InformationをMakerが暗号化する
makerAssetData: string;
// Asset ProxyとAsset InformationをTakerが暗号化する
takerAssetData: string;
// 0xプロトコルのスマートコントラクトアドレス（ネットワークごとに違う）
exchangeAddress: string;
// 署名。タイプに応じて暗号化することも
signature: string;
```

### 変更点の詳細

**SenderAddress**
`senderAddress`が0でなければ、指定されているアドレスのみが`Exchange`コントラクトを呼び出すことができる。つまり交換をする権限を指定するアドレスに管轄させている

**salt**
* オーダーの唯一性を担保するために使われる
* saltは現在のタイムスタンプと同じ値である
* Millisecondの値なのでMakerは1000オーダーを1秒間に作ることができる
* `cancelOrderUpTo`と併用される

**assetData**
MakerとTakerがもっているAssetのデータが入る。v2ではERC721も対応しているため、Tokenではなく、Assetと変更されたと思われる。AssetDataは暗号化されている

ERC20の場合、以下で算出される4byteのidとともにassetDataが暗号化される。

```
// 0xf47261b0はERC20Proxyのid
bytes4 ERC20_SELECTOR = bytes4(keccak256("ERC20Token(address)"));
```

# 参考
* [Up grade guide](https://quip.com/LelRAcmkQY8t)
* [0x Protocol Specification](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#senderaddress)
raspberry pi 1でtensrorflow lite その24

#概要

raspberry pi 1でtensorflow liteやってみた。
マイク入力を扱うので、alsaを叩いてみた。
ラズパイで、リアルタイム処理してみた。
波形を表示してみた。

#写真

![2018-12-23-094651_1440x900_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/18104/10831a0f-f7f5-37bd-4134-646b72a65d01.png)

#サンプルコード


```
#include <gtkmm/drawingarea.h>
#include <ctime>
#include <cmath>
#include <cairomm/context.h>
#include <glibmm/main.h>
#include <gtkmm/application.h>
#include <gtkmm/window.h>
#include <stdio.h>
#include <alsa/asoundlib.h>

#define IN_FREQ 			44100

class Clock: public Gtk::DrawingArea
{
public:
	Clock();
	virtual ~Clock();
protected:
	bool on_draw(const Cairo::RefPtr<Cairo::Context> &cr) override;
	bool on_timeout();
	double m_radius;
	double m_line_width;
	int err;
	int i;
	snd_pcm_t * in_handle;
	snd_pcm_sframes_t frames;
	char * device = "default";
	short in_buffer[IN_FREQ * 5];
};
Clock::Clock(): m_radius(0.42), m_line_width(0.05)
{
	Glib::signal_timeout().connect(sigc::mem_fun(* this, &Clock::on_timeout), 1000);
	if ((err = snd_pcm_open(&in_handle, device, SND_PCM_STREAM_CAPTURE, 0)) < 0)
	{
		fprintf (stderr, "Capture open error: %s\n", snd_strerror(err));
	}
	if ((err = snd_pcm_set_params(in_handle, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, 1, IN_FREQ, 1, 1000 * 1000)) < 0)
	{
		fprintf (stderr, "Capture open error: %s\n", snd_strerror(err));
	}
}
Clock::~Clock()
{
	snd_pcm_close(in_handle);
}
bool Clock::on_draw(const Cairo::RefPtr<Cairo::Context> &cr)
{
	Gtk::Allocation allocation = get_allocation();
	const int width = allocation.get_width();
	const int height = allocation.get_height();
	cr->set_line_width(1);
	int w;
	for (int i = 0; i < 10; i++)
	{
		
	}
	frames = snd_pcm_readi(in_handle, in_buffer, IN_FREQ);
	if (frames < 0)
	{
		frames = snd_pcm_recover(in_handle, frames, 0);
	}
	cr->move_to(0, 200);
	for (i = 0; i < 44000; i += 60)
	{
		w = (int) (in_buffer[i] / 256.) + 128.;
		cr->line_to(i / 60, w);		
	}
	cr->stroke();
	return true;
}
bool Clock::on_timeout()
{
	auto win = get_window();
	if (win)
	{
		Gdk::Rectangle r(0, 0, get_allocation().get_width(), get_allocation().get_height());
		win->invalidate_rect(r, false);
	}
	return true;
}
int main(int argc, char ** argv)
{
	auto app = Gtk::Application::create(argc, argv, "com.ohisamallc");
	Gtk::Window win;
	win.set_title("alsa");
	win.set_default_size(800, 300);
	Clock c;
	win.add(c);
	c.show();
	return app->run(win);
}



```

以上。
webRTCの世界

# はじめに

この記事は [CyberAgent 19新卒 エンジニア Advent Calendar 2018 23日目](https://adventar.org/calendars/3342)の記事です。

自分自身、昔webRTCを使った業務を任されていたのでそこに関してざっくり共有していきたいと思います。
正直レイヤーはちょっと低めですが、個人的にここら辺が自分の中で腑に落ちた頃には普段あまり気にしていなかったドメインにも知見が得られたので知っておいて損はないです。

# webRTCとは
**webRTCとはビデオチャットなどをサーバを介さずにやり取りできるAPI**

ですが実際は裏で色々なサーバが動いていたり、ビデオチャットしかできないわけじゃなかったりします。

## ビデオチャットなど

実はwebRTCは大きく分けると二つのチャンネルが存在します。
一つ目が**メディアチャネル**。いわゆるビデオチャットができるチャンネルです。
もう一つが**データチャネル**。これはバイト列を送受信できるチャンネルです。
例えば、ビデオチャットでありがちな「○○さんが入室しました」なんてメッセージを送れます。その気になれば音声データだってフーリエ変換すれば送れるので、データチャネルを使ってメディアチャネルっぽい挙動をさせることもできるはずです。

この二つの大きな違いは通信規格にあります。
メディアチャネルは**SRTP**という音声や映像情報をパケット化してsecureに送受信できるプロトコルを使っている一方、データチャネルは**SCTP**という、UDPの小さいオーバーヘッドとTCPの信頼性を融合させたハイブリッドなプロトコルwを使っています。googleが開発したQUICと似てますね。

ちなみにこのSCTP、もっと流行ってもいいと思うんですがこれが流行っていない理由としてはNATにあります。NATは基本的に自分の知らないプロトコル(トランスポート層のTCP/UDP)以外はパケットを破棄してしまう性質があるため、同じトランスポート層のSCTPはNATを超えられず使われていません。
しかしwebRTCは、UDP上にあるDTLS(データグラム指向のTLS)の上にSCTPを実装することで、NATにとってはまるでUDPであるかのように振る舞うことでこの問題を解決しています。
osi参照モデルではSCTPはトランスポート層ですが、webRTCではTLSの上なのでトランスポート層よりも上にいることになります。webRTCは必ずしもosi参照モデルに則って作られているわけではないということです。

こんなように、**webRTC = ビデオチャットではなく、ビデオチャット ∈ webRTCだよ**っていう話です。

ちなみに最近話題のライブ配信サービス系の配信基盤はHLSという、細切れの映像をwebサーバに絶えず投げることで全世界で同じ映像を視聴することができるプロトコルを使っているのでwebRTCとは違います。単純に数万人をP2P通信させるとか鬼畜。


## サーバを介さず

webRTCは、ブラウザ同士でデータのやり取りができます。これをP2P通信って言います。
確かに、データのやり取り自体はサーバを介さずにできます。ただしこれは、通信相手のglobalIPや通信経路を事前に取得している状態になって初めて可能になります。逆に言うと、通信相手のglobalIPや通信経路を取得していないとデータのやり取りができません。これらの情報を事前に取得するために裏でサーバが3台動いています。


- STUNサーバ
- TURNサーバ
- シグナリングサーバ

STUNサーバでglobalIPを取得して、TURNサーバでそのIPをもとにグローバルな世界に代理人を立てて代理人同士でやり取りができるようになります。俗に言う**NAT超え**をこの２つのサーバで実現しています。そうして得た相手のPeer情報(SDP)や通信経路(ICE Candidate)を特定し、取得した通信相手情報をシグナリングサーバでお互いに交換することでP2P通信が成立します。

実はwebRTCにはP2P通信でのやり取りだけではなくビデオ会議とか少し大人数向けのユースケースでは、参加者は映像や音声をサーバとやりとりするSFUや、サーバサイドで音声や映像を合成して参加者全員に配るMCUといったサーバを介したP2P通信っぽいこともできたりします。SFUの方がもちろんサーバ負荷は低いのでこっちの方が使われているのかな。

## まとめ

結果、最初の文をこれらを踏まえて書き換えると

**webRTCとはビデオチャットやテキストメッセージを、(サーバを介して通信相手の情報を取得した後)サーバを介さずにやり取りできるAPI**

になるかと思います。
個人開発としてのミニマムなビデオ通話くらいなら小一時間あればすぐに通話くらいはできちゃうくらい簡単なのでぜひ。
なにか不備な点などありましたらコメントにてお待ちしております。
RailsでViewをサブディレクトリわけ

#経緯
Viewを部分テンプレート化したい場合で、
モデル名のディレクトリ配下にディレクトリを作成して、その下に部分テンプレートを配置したいとなった場合

#環境
Ruby 2.4.5
Rails 5.2.2


#ディレクトリ構成(例)
- views
    - users
        - type
            - _male.html.slim
            - _female.html.slim

#対応方法

##1. 間違った設定
相対パスにすれば良いと思いましたが、違うようです・・・

```ruby:間違った設定１
= render './type/male'
```
この設定だと、/views/type/_male.html.slimを表示しようとしてしまいます。


```ruby:間違った設定２
= render 'type/male'
```
こちらの設定も、/views/type/_male.html.slimを表示しようとしてしまいます。

##2. 正しい設定
```ruby:正しい設定
= render '/users/type/male'
```
フルパスでの指定が必要なようです。
minicondaのDockerイメージをインストールする（for Mac）

# minicondaとは？
Anacondaを最小パッケージ構成に限定したディストリビューション。

## Anacondaとは？
データ分析、グラフ描画、画像処理の際によく利用するライブラリが含まれているPythonのディストリビューション。

# Dockerイメージのインストール
```
$ docker pull continuumio/miniconda3
Using default tag: latest
latest: Pulling from continuumio/miniconda3
（〜中略〜）
Status: Downloaded newer image for continuumio/miniconda3:latest
```

# Dockerイメージ起動
```
$ docker run -i -t continuumio/miniconda3 /bin/bash

# Dockerコンテナ
$ docker commit <コンテナID> miniconda3:init
$ docker run -i -t miniconda3:init /bin/bash

# Macのホームディレクトリをマウントして起動.
$ docker run -i -t -v $HOME:$HOME miniconda3:init /bin/bash


```

## 参考
https://hub.docker.com/r/continuumio/miniconda/
GCP Container Registry に Docker ImageをPushする

# はじめに

GCPでDocker Imageを管理します。Container Registry を使用します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/108052/b7806c57-d9c3-4eae-4917-27c26945db33.png)

PUSH後には、Docker Imageが参照できます

# 手順

## 1. gcloud config を確認

* gcloudが使用できる状態にします
* ImageをPUSHしたい、projectが指定されているか確認します。もし異なれば、configを変更します

```
$ gcloud config list
[core]
account = your_account@gmail.com
disable_usage_reporting = False
project = project id

Your active configuration is: [project id]
~
```

## 2. 初期設定

* 以下のコマンドで、 Container Registry に pushできるようになります
    * 裏ではDocker configを gcloudの設定をもとに書き換えてくれています


```
$ gcloud auth configure-docker
The following settings will be added to your Docker config file
located at [/Users/user/.docker/config.json]:
 {
  "credHelpers": {
    "gcr.io": "gcloud",
    "us.gcr.io": "gcloud",
    "eu.gcr.io": "gcloud",
    "asia.gcr.io": "gcloud",
    "staging-k8s.gcr.io": "gcloud",
    "marketplace.gcr.io": "gcloud"
  }
}

Do you want to continue (Y/n)?
```

## 3. docker build

* buildするときに以下のようにtagをつけます
    * gcr.io : ホストする場所を指定※1
    * [project id] : 自身のもの
    * [app] : 自身のもの
    * latest : 自由にtagをつけれます

* ビルド済みのimageにあとからtagをつけてもOKです

```
docker build -t gcr.io/[project id]/[app]:latest .
```

※1 [公式ドキュメントより](https://cloud.google.com/container-registry/docs/pushing-and-pulling?hl=en_US&_ga=2.41821922.-1740186083.1538978211)
> gcr.io は米国でイメージをホストしていますが、今後は場所が変更される可能性があります。
> us.gcr.io は米国でイメージをホストしますが、その場所は、gcr.io によってホストされるイメージからは独立したストレージ バケットです。
> eu.gcr.io は、欧州連合でイメージをホストします。
> asia.gcr.io は、アジアでイメージをホストします。

## 4. docker push

* あとは docker push するだけです

```
$ docker push gcr.io/[project id]/[app]:latest
The push refers to a repository [gcr.io/[project id]/[app]:latest]
01a52b56cea2: Pushed
91eb52a6df15: Pushed
[..]
```

# 注意：Docker の version 

* 要件 は `1.13 or higher` なので、 必要なら Update します

```
$ gcloud auth configure-docker
ERROR: (gcloud.auth.configure-docker) Invalid Docker version: The version of your Docker client is [1.12.3'
]; version [1.13] or higher is required to support Docker credential helpers.
~
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/108052/2b4fcbd7-e8d5-b292-bfea-a043806470d4.png)

私のversionは古かったので、Docker for Mac上から update しました
出発点、向き、角度って何？「猫に邪魔されるGoogleChrome拡張」の実装内容に学びたい。

#[猫に仕事を邪魔されてみたかったので技術で実現した - Qiita](https://qiita.com/ampersand/items/7180f657b3d0a0c05734)

@ampersand さん

# 図示

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/a57ed46f-178b-57ef-2154-4632415f5990.png)

# 1. 上か左右の辺どこかの位置を出発点、バッティングしない別の辺の何処かを到着点として走らせる経路を決めます

「左から右へ」
「上から下へ」
「下から右へ」

とかのパターン。

4x3=12種類。(たぶん)

「上から上へ」とかは存在しないという話。当たり前だけど。

# 2. 出発点と到着点の位置から猫の向きを算出します

「左の辺」がスタートで「右の辺」がゴールなら、猫は右向きでしょ！ってことっぽい。

# 3. 足跡を配置するときに傾ける角度を算出します

足跡にばらつきがあるということだと理解した。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/d311227c-cd3e-a0b4-0504-751562bff7b1.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/0b8c82a3-e438-1c02-8c19-325551d52d67.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/6d33a06a-6779-4aa3-1b34-26509a55cef9.png)



# 4. 猫を走らせつつ、足跡を散らします

猫と足跡は別のオブジェクト的扱い？と読んだ。


# どうでもいい話

偶然ドンキホーテで買っていた影絵シートを張って、もっと猫に邪魔されてみた。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/4bfc8bcd-7764-7de2-35f6-75c6698feb66.png)










<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ホワイトクリスマス！猫に邪魔されるGoogleChrome拡張のための白紙のHTMLページってないの？

# あった

けど重くてアクセス不可だった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/85612a93-4338-46eb-be84-0374f6267bf1.png)

[white page html - Google Search](https://www.google.co.jp/search?q=white+page+html&oq=white+page+html&aqs=chrome..69i57.8122j0j9&sourceid=chrome&ie=UTF-8)


# 仕方なくGoogleキャッシュを利用

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/c582e3f3-a639-6b1f-856c-9e9f4ff77687.png)

# できた

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/beb66c2f-b97a-4cba-70a4-978ea8046b76.png)









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
laravel session と cookie の 使い方

#Session 使おうぜ

・Controllerでもviewでもどこでも使える。
・空のセッションが読み込まれてもエラーにならない。
・もちろんページ移動しても使える。

```

//書き込み
session(['kudamono' => 'ringo']);

//読み出し
session('kudamono')
//読み出し (view)
{{session('kudamono')}}

//削除
session()->forget('kudamono');

```

#Cookie 使おうぜ

・書き込み時は、次回アクセスした時から設定したCookieが有効となる。
・削除時はlaravelの機能を使わない。


```

//書き込み (100分)
\Cookie::queue('testcookie', "たろまん",100);

//取得
$test = \Cookie::get('testcookie');
//viewで取得
{{\Cookie::get('testcookie')}}

//削除
setcookie('testcookie');


```

以上
閉じタグを考える

HTML Advent Calendarの最後ということで、閉じタグを考えてみることにしました。

## いろんな表記法

XHTMLの流行もあって、空要素の閉じ方にもいろいろ流儀が発生しました。

* `<br>`
* `<br/>`
* `<br />`
* `<br></br>`

さて、どう書けばいいのでしょうか。また、時々「閉じタグにどんなタグを閉じたか書いておく」という人がいますが、これはどうなのでしょうか。

## HTML Live Standard

かつてはHTMLの規格をW3Cが定めていましたが、ブラウザベンダーたちが「規格化が遅い」とWHATWGを立ち上げました。そして紆余曲折を経て、「WHATWGが先行してLive Standardを作って、それをあとからW3Cがバージョン番号を付けてfixする」というような分業体勢に落ち着いています。

ということで、最新版の仕様書は順次[https://html.spec.whatwg.org/](https://html.spec.whatwg.org/)に上がってきます。これをもとに考えていきましょう（以下「LS」と略します）。

## タグの開き方・閉じ方

### 空要素の場合

空要素の場合、[LS§12.1.2.1 Start tags](https://html.spec.whatwg.org/#start-tags)によれば、

* HTMLの要素の場合、最後の`/`は付けても付けなくてもいい（`name=value`という引用符なしの属性値がある場合は、スペースで区切る必要あり）
* MathMLやSVGを混ぜ込んでいる場合、XMLのルールに従ってSelf-closeで書く必要がある

とのことです。なお、規格とは関係ないですが、RiotタグをHTML文書内に書く場合は`<riot-element></riot-element>`の形である必要がある、とのことです。

### 閉じタグ単体で書く場合

閉じタグだけを書く場合については、[LS§12.1.2.2 End tags](https://html.spec.whatwg.org/#end-tags)にあります。

* `</タグ名`までは連続で書く
* `</タグ名`と`>`の間にはASCII範囲のタブ、スペース、改行が入っても構わない

ということで、`</p class="hoge">`のようなことはできません。

### 閉じタグを省略できる場合

一部の場合、閉じタグを省略することが認められています。なお、「コメントやホワイトスペースが続かない場合」に限定して省略可能となっているものもありますが、単にそれらがどっちの要素に取り込まれるかの違いしかなく、厳密にコメントやテキストノードをたどる場合以外は実用上の影響がほぼないので、その条件は基本的に省略します。

* `</html>`・`</head>`・`</body>`・`</colgroup>`・`</caption>`…ホワイトスペースやコメントを気にしなければ常に省略可
* 同種の要素が続く場合と、親要素が終わる直前に省略できるもの…`</li>`・（`</dt>`＆`</dd>`）・（`</rt>`＆`</rp>`）・`</optgroup>`・`</option>`・（`</thead>`＆`</tbody>`＆`</tfoot>`）・`</tr>`・（`</td>`＆`</th>`）
* `</p>`は`<table>`や`<ul>`など、`<p>`が入らない要素の前でも省略可能
laravel twitter oauth ログイン

laravel Socialite を使う。


```

 composer require laravel/socialite

```


app.php に以下を追記

```

'providers' => [
Laravel\Socialite\SocialiteServiceProvider::class,
]
'aliases' => [
'Socialite' => Laravel\Socialite\Facades\Socialite::class,
]

```

.env にTwitterAPIを設定

```

TWITTER_CLIENT_ID = syourATBxKYOcaIT3E
TWITTER_CLIENT_SECRET = yourCd6tubNnPNvjSWSYAi4WZIkzye
CALLBACK_URL = https://your.com/auth/twitter/callback/

```

config/service.php

```

"twitter"=>[
    "client_id"=>env("TWITTER_CLIENT_ID"),
    "client_secret"=>env("TWITTER_CLIENT_SECRET"),
    "redirect"=>env("CALLBACK_URL"),
]


```

web.php

```
Route::get('/auth/{service}', 'OAuthLoginController@getTwitterAuth')->where('service', 'twitter');
Route::get('/auth/twitter/callback', 'OAuthLoginController@authTwitterCallback');

```



コンフィグキャッシュを削除

```

php artisan config:clear


```






OAuthLoginController.php


```

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;
use Socialite;
use Auth;

class OAuthLoginController extends Controller
{
    public function getTwitterAuth($provider)
    {
        return Socialite::driver($provider)->redirect();
    }

    public function authTwitterCallback()
    {
        $data = Socialite::driver('twitter')->user();
        print_r($data);
        die;
    }
}



```

//アクセス
your.com/auth/twitter/
autoキーワードについて調べて見た

#はじめに
C++でコードを書き始めて、早半年が経ちました。
先日、autoキーワードというものに初めて出会い、勉強したので記事にしてみたいと思います。
#環境
OS: macOS High Sierra ver10.13.6
Xcode: Version 10.1
言語: C++
#autoキーワードについて簡単に説明
autoキーワードはC++ 11以降で使用することができるモノで、変数の型を初期化している値から自動的に推察してくれます。普通に変数を宣言する場合、`int i = 1;`のように「この変数名は、int型で扱いますよ！」と明示的にする必要があります。

しかし、`auto i = 1;`とすると自動的に判断されiをint型として扱うことが出来ます。([詳しくはここを参照] (https://cpprefjp.github.io/lang/cpp11/auto.html))
#基本動作
さて、もう少し詳しく動作を見ていきましょう。

- 数値を格納した変数のsizeを見てみる

```cpp:main.cpp
int main(void) {
    auto i = 1.2;
    int i_size = sizeof(i) / sizeof(double);
    std::cout << i << " is byte-size = " << i_size << std::endl;
    
    std::cout << "------" << std::endl;
    
    auto o = 23;
    int o_size = sizeof(o) / sizeof(int);
    std::cout << o << " is byte-size = " << o_size << std::endl;
    
    return 0;
}
```
```terminal:実行結果
1.2 is byte-size = 1
------
23 is byte-size = 1
```
autoキーワードの推論で設定した変数ですが、ちゃんと想定した型になっているようですね。
iはint型に、oはdouble型に。

- 文字列を格納した変数のsizeを見てみる

```cpp:main.cpp
#include <iostream>
#include <stdio.h>
int main(void) {
    auto str = "test";
    int str_size = sizeof(str) / sizeof(const char*);
    std::cout << str << " is byte-size = " << str_size << std::endl;
    
    return 0;
}
```
```terminal:実行結果
test is byte-size = 1
```
"test"はconst char*に暗黙的に型変換されるようになっているのですが、それもしっかり出来ている。

#どんなタイミングで使えるの？
今まで見て来ていただいた例だといまいち有用性がわかりにくいかと思います。
autoキーワードは、~~書くのが面倒なイテレーションの代わりを果たしてくれます。~~
(2018/12/25： 追記）
こちら間違いだったようです。正確には、「イテレーションを記述しなくてはいけない場面でも、推論をしてくれる」です。
 


```cpp:main.cpp
#include <vector>
#include <iostream>
#include <iostream>
#include <stdio.h>

using namespace std;
int main ()
{
    vector<int> tag;
    
    for( int i = 0; i < 10; ++i ){
        tag.push_back( i );
    }
    vector<int>::iterator start = tag.begin();
    std::cout << *start << std::endl;
    
    return 0;
}
```
上のCodeをautoキーワードを使用すると、、、。

```cpp.main.cpp
#include <vector>
#include <iostream>
#include <iostream>
#include <stdio.h>

using namespace std;
int main ()
{
    vector<int> tag;
    
    for( int i = 0; i < 10; ++i ){
        tag.push_back( i );
    }
    auto start = tag.begin();
    std::cout << *start << std::endl;
    
    return 0;
}
```
このように少しスッキリ書くことができるようになります！

#まとめ
- autoキーワードは、初期化値で推論して変数の型を決定してくれる
- 最大の特徴は、イテレーションでも推論をして適切なモノにしてくれること

記事化出来ないくらいの小ネタは、blogの方で情報発信していこうと思ってます！
[私のBlog] (https://hmon-k.hatenablog.com/)
ぜひ、そちらの方もよろしくお願いします。
DirectX11シェーダーでVertex Animation Texture

[Maya Advent Calendar 2018](https://qiita.com/advent-calendar/2018/maya) 12月24日の記事です。
クリスマス・イヴ、皆様どうお過ごしでしょうか？
私は残念ながら風邪でダウン…

この投稿が皆様の一助となれば幸いです。

# Vertex Animation Textureとは？
Vertex Animation TextureはVATと略して呼ばれることが多いです。

テクスチャに位置や法線の情報を保存しておき再生するようなものです。
複数のモーフターゲットをテクスチャの中に保存できると思えばわかりやすいです。

# テクスチャへのデータ保存について
VATそのものは難しいことをしているわけではありません。

一例です。
たしかHoudiniのリジッドボディー？か何かは以下のような保存だった…気がします。

- Rチャネル には 位置X
- Gチャネル には 位置Y
- Bチャネル には 位置Z
- Aチャネル には 法線

Aチャネルの法線ですがfloat3からfloatに変換して保存する必要があります。
利用するときはfloatからfloat3に戻して利用します。
pack/unpackとか呼ばれるようです。
「float3 to float pack」とかで検索するといろいろ出てきます。

pack/unpackに関しては今回の記事では触れませんが、以下の資料が参考になります。
CEDILにログインすることで、資料を閲覧することができます。

[シェーダの工夫で超えられる表現の壁がある！ -ゲームエフェクトにおけるトリッキーなシェーダ講座-](http://cedil.cesa.or.jp/cedil_sessions/view/1832)

VATというのはテクスチャに入れたい情報を入れて再生する技術です。

なので、自分でOpenCV等のライブラリから作ってもいいかもしれません。
私はPySideのQImageで自作しました。8bitだったので精度は出ませんが…。

# Mayaで再現する

Mayaで再生する方法はいくつかあります。

・MPxDefomerNode
Mayaのデフォーマーノードプラグインを作ります。
これは結構面倒くさいのでおすすめはしません。

・DirectX11Shader
シェーダー側で作れば割と簡単に作ることができます。
今回はDirectX11シェーダーで作ってみます。

## 利用したポリゴンメッシュとテクスチャ
今回は三角形のポリゴン1枚を使います。三角形なので頂点が３つ存在します。
アニメーションは3フレームを利用して作ってみます。

**3頂点 ✕ 3フレーム = 9ピクセル**
が必要になります。

![SimpleVAT_Scale.jpg](https://qiita-image-store.s3.amazonaws.com/0/328826/9a30c65f-fbdc-0860-2ec4-1db0ce00bbcb.jpeg)
※ 画像はわかりやすく大きくしているものです。3×3ピクセルと思ってください。

情報は以下のように処理されます。

|フレーム番号||||
|:--:|:--:|:--:|:--:|
| フレーム 0| 頂点ID 0| 頂点ID 1| 頂点ID 2|
| フレーム 1| 頂点ID 0| 頂点ID 1| 頂点ID 2|
| フレーム 2| 頂点ID 0| 頂点ID 1| 頂点ID 2|

例えば、
・フレーム0 の時は頂点ID0に入っているのは赤(RGB:1,0,0)
・フレーム0 の時は頂点ID1に入っているのは青(RGB:0,1,0)
・フレーム0 の時は頂点ID2に入っているのは緑(RGB:0,0,1)
入っている値をオフセットさせてみます。

## コードサンプル
以下がコードの全てです。
VertexAnimationTextureをシェーダーで作るの大変そう…
と思いきやLoad関数で一発です。

```C++

float4x4 g_WXf : World;
float4x4 g_VXf : View;
float4x4 g_PXf : Projection;

uniform int g_Location;
Texture2D g_VATexture;

struct VS_IN
{
    float4 Pos : POSITION;
    float2 TextureUV  :TEXCOORD0;
};

struct VS_OUT
{
    float4 HPos : SV_Position;
    float3 VATColor :TEXCOORD1;
};

VS_OUT VS(VS_IN In)
{
    VS_OUT Out = (VS_OUT)0;
    float3 w_pos = mul(In.Pos, g_WXf).xyz;
    float3 vat_pos = g_VATexture.Load(int3(int(In.TextureUV.x),g_Location, 0)).xyz;
    w_pos = w_pos + vat_pos;
    Out.HPos = mul(mul(float4(w_pos,1.0), g_VXf), g_PXf);
    Out.VATColor = vat_pos;
    return Out;
}

float4 PS(VS_OUT In) : SV_Target
{
  return float4(In.VATColor, 1.0);
}

technique11 VertexAnimationTexture
{
  pass p0
  {
      SetVertexShader(CompileShader(vs_4_0,VS()));
      SetGeometryShader(NULL);
      SetPixelShader(CompileShader(ps_4_0, PS()));
  }
}

```

## 注意点

今回、SV_VertexIDのセマンティクスを使うとMayaが落ちる事態になったので
頂点IDはUVに入れました。
ちなみにHoudiniからの出力もUVで出力されていますが、
頂点IDのセマンティクスが使えればそっちの方が楽かもしれません。

# 結果

わかりやすく、カラーに変位を入れてみました。
g_Location変数がフレームです。こちらを変更すると以下のような結果が得られます。

![SimpleVAT_Conclusion.jpg](https://qiita-image-store.s3.amazonaws.com/0/328826/55b22f27-8a51-3bb0-b524-06b4b90cf541.jpeg)

# おわりに

VertexAnimationTextureの再生方法を紹介しました。

私的なことですが、
個人サイト [リグログ](http://rigglog.sakura.ne.jp/db/) を今年いっぱいで閉じます。
長らく見て頂いた方、ありがとうございます。
今後は別のサービスを利用して情報発信は継続していこうとは思っています。

それでは！
BOSE QuietControl 30を買った。ピンクノイズが200円だったので、自分で作った。

iTune Storeだと200円した。だったら作るか、、ということで以下4ステップ

1. Google
1. コピペ
1. 回す
1. 聞く


## Google
「pinknoise 生成」で検索すると、以下が出てきた。ぴったり。

ピンクノイズ生成
http://marui.hatenablog.com/entry/2017/07/17/173904

## コピペ
コピペするだけ。

## 回す
(一回エラーが出た。自分の環境だと、これが入っていなかった。 pip import soundfile)

time python noise.py

real	0m46.941s
user	0m45.963s
sys	0m0.255s

pinknoise.wavというファイルができる。

## 聞く
iTunesで聞く。リピートにすると、ずっと聞ける。

## おまけ
numbaで20倍高速化
https://myenigma.hatenablog.com/entry/2017/03/02/155433

time python noise.py

real	0m1.967s
user	0m1.552s
sys	0m0.210s
ssh-keygen使い方まとめ(自分用)


#はじめに
自分用のsshの鍵の作り方のメモです。自分が使うであろうオプションの解説だけ。
ローカル(クライアント側)で実行してから公開鍵をサーバ、サービス側に送る。
実行文 : **`ssh-keygen -t ed25519 -C "ユーザー名@CP名"`**
実行したら保存場所聞かれるので変更なければ Enter
その後、鍵用パスワード入力

#-t
`-t` で暗号の種類を選ぶ。
基本的には強度が一番高い**`-t ed25519`** オプションを使う。

`-b`はビット数を指定する。ed25519は256で固定なので不要。
対応していない場合は`-t ecdsa -b 521` を使う。`-b 384`または`-b 256`もある。
さらに対応していない場合は`-t rsa -b 4096` を使う。`-b 2048`もある。

#-C
`-C "コメント"`でコメントを付ける。基本的に**`-C "ユーザー名@CP名"`**で誰がどのマシンを使ってるかわかるようにする(Cオプションがない場合自動的に付く)。
githubとか自分しか使わないサーバーとかの自分さえわかればいい場合はユーザー名削ってもいいかも(githubはssh公開鍵が公開されてるから匿名利用している場合)。

#-f
普通に鍵生成した場合、通常は次のように鍵は保存される。
秘密鍵:`[ユーザー名]/.ssh/id_[暗号種]`
公開鍵:`[ユーザー名]/.ssh/id_[暗号種].pub`

例えば`ssh-keygen -t ed25519`を実行した場合の鍵の名前は`id_ed25519`となる。

**`-f ファイル名`**で名前を変えることができる。
サービスごとに鍵を分ければセキュリティ性が高まるかもしれない。


#作り直し
もう一回実行しなおせば存在するけど上書きしますかって聞いてくる。

#コピペ
.pubの方をコピペするなりscpするなりしてサーバ側に置く。
win : `clip < ファイル場所`
mac : `pbcopy < ファイル場所`

#ssh-keygen オプション一覧
```ssh-keygen
usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa | rsa1]
                  [-N new_passphrase] [-C comment] [-f output_keyfile]
       ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
       ssh-keygen -i [-m key_format] [-f input_keyfile]
       ssh-keygen -e [-m key_format] [-f input_keyfile]
       ssh-keygen -y [-f input_keyfile]
       ssh-keygen -c [-P passphrase] [-C comment] [-f keyfile]
       ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]
       ssh-keygen -B [-f input_keyfile]
       ssh-keygen -D pkcs11
       ssh-keygen -F hostname [-f known_hosts_file] [-l]
       ssh-keygen -H [-f known_hosts_file]
       ssh-keygen -R hostname [-f known_hosts_file]
       ssh-keygen -r hostname [-f input_keyfile] [-g]
       ssh-keygen -G output_file [-v] [-b bits] [-M memory] [-S start_point]
       ssh-keygen -T output_file -f input_file [-v] [-a rounds] [-J num_lines]
                  [-j start_line] [-K checkpt] [-W generator]
       ssh-keygen -s ca_key -I certificate_identity [-h] [-n principals]
                  [-O option] [-V validity_interval] [-z serial_number] file ...
       ssh-keygen -L [-f input_keyfile]
       ssh-keygen -A
       ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number]
                  file ...
       ssh-keygen -Q -f krl_file file ...

```



#参考文献
- [SSH keys - ArchWiki - Arch Linux](https://wiki.archlinux.org/index.php/SSH_keys)
- [2017年版 SSH公開鍵認証で使用する秘密鍵ペアの作り方 - Qiita](https://qiita.com/wnoguchi/items/a72a042bb8159c35d056)
- [お前らのSSH Keysの作り方は間違っている - Qiita](https://qiita.com/suthio/items/2760e4cff0e185fe2db9)
- [GitHubでEd25519鍵をつかう - 尋常でないもふもふ](https://jnst.hateblo.jp/entry/2014/12/15/200542)
【Java】String.splitメソッドで想定通りの配列が得られなかった話

##はじめに

JavaのString型のメソッドには`split`メソッドがあります。このメソッドは例えば以下のように用いることで、文字列を任意の文字を境に分割し、分割した要素を持つ配列を生成することができます。

```Java:example1.java
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // 配列にしたい文字列
        String str = "リンゴ,ミカン,バナナ,スイカ,メロン";
        // 分割に用いる文字を指定
        String[] strArray = str.split(",");
        for(int i = 0; i < strArray.length; i++) {
            System.out.println((i + 1) + ":" + strArray[i]);
        }
    }
}
```
このソースを実行すると

>1:リンゴ
2:ミカン
3:バナナ
4:スイカ
5:メロン

という結果が得られます。
では`split`メソッドですが、次の例のように分割に用いる文字が連続していた場合どうなるでしょうか。

```Java:example2.java
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // 配列にしたい文字列
        String str = "リンゴ,ミカン,,,";
        // 分割に用いる文字を指定
        String[] strArray = str.split(",");
        for(int i = 0; i < strArray.length; i++) {
            System.out.println((i + 1) + ":" + strArray[i]);
        }
    }
}
```
このソースを実行すると
>1:リンゴ
2:ミカン
3:
4:
5:

という結果が得られると思っていたのですが、そうではなく
>1:リンゴ
2:ミカン

と表示されてしまいました。つまりどういうことかというと、`example2.java`において得られる配列のサイズが5ではなく、2になってしまうということです。上記の例において、`split`メソッドを用いれば配列のサイズが5になるだろうと思っていた私は業務で実際に用いた際に想定通りにならず面喰ってしまいました。

##解決策
ではどのようにすれば私の想定通りになったかというと、結論としては以下の例のように`split`メソッドの第二引数に-1(負の数)を指定します。

```Java:example3.java
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // 配列にしたい文字列
        String str = "リンゴ,ミカン,,,";
        // 第二引数に-1を指定
        String[] strArray = str.split(",", -1);
        for(int i = 0; i < strArray.length; i++) {
            System.out.println((i + 1) + ":" + strArray[i]);
        }
    }
}
```

第二引数に-1を指定することで、
>1:リンゴ
2:ミカン
3:
4:
5:

と結果が得られ、カンマで分割した数だけ配列のサイズを得ることができました。

##学んだこと
今回の問題を解決するにあたって、[公式ドキュメント](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html)を読んだ結果、2つのことを学ぶことができました。

1つめは`split`メソッドでは第一引数で指定した文字列で分割するのではなく、正しくは第一引数で指定した**正規表現**で分割するということです。

てっきり指定した文字列で分割すると思い込んでいた私には目から鱗で、正規表現を駆使すればより複雑な条件で文字列を分割することも可能であるということがわかりました。

2つめは上記の例のように分割したい文字列が連続している場合は`split`メソッドの第二引数に負の数を指定するということです。
`split`メソッドの第二引数は分割の閾値を表しています。そして、第二引数を指定していない場合、第二引数に0を指定したことと同じ扱いになり、この場合順番に分割した結果の後続が空文字の場合破棄する仕様になっています。
そのため、`example2.java`では、分割した配列のサイズが5ではなく、2になってしまいました。
これを防ぐためには第二引数に負の数を指定し、分割数を無制限かつ空文字を破棄しないようにする必要があるということがわかりました。

##おわりに
今回の問題解決にあたって公式ドキュメントを参照することの大切さを再認識することができました。そして、どういった処理を行っているかをきちんと理解した上でメソッドを用いることの大切さを実感することができました。
この記事が誰かのお役に立てれば幸いです。
黄色い点以外も出せる！？ARPointCloudをカスタマイズして色や形を変えてみよう

```swift
sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints]
```

を書けば、黄色い花粉のようなfeaturePointsは簡単に表示することができます。

<img src="https://github.com/kboy-silvergym/ARKit-Emperor/raw/master/images/point1.gif">

今記事では、この点群の見た目をカスタムしてみましょう。

# カスタム完成イメージ

|赤い点|赤いコーン|
|:-:|:-:|
|<img src="https://github.com/kboy-silvergym/ARKit-Emperor/raw/master/images/point2.gif">|<img src="https://github.com/kboy-silvergym/ARKit-Emperor/raw/master/images/point3.gif">|

# 赤い点のARPointCloud作り方

## Nodeを作成

### 赤い点なら

```swift
let node = SCNNode()
let geometry = SCNSphere(radius: 0.001)
geometry.firstMaterial?.diffuse.contents = UIColor.red
node.geometry = geometry
return node
```

### 赤いコーンなら

```swift
let node = SCNNode()
let geometry = SCNCone(topRadius: 0.001, bottomRadius: 0.01, height: 0.03)
geometry.firstMaterial?.diffuse.contents = UIColor.red
node.geometry = geometry
return node
```

## 点群を表示する

まずはsceneView.sesionをARSessionDelegateに準拠させる。

featurePointsを保存するために変数作っときます。

```swift
private var featurePoints: [SCNNode] = []

override func viewDidLoad() {
    super.viewDidLoad()
    
    sceneView.session.delegate = self
}
```

ARSessionDelegateの`session(didUpdate frame`メソッドで、ARFrameが毎回取得できるので、その中からrawFeaturePoints([ARPointCloud](https://developer.apple.com/documentation/arkit/arpointcloud))を取得し、そのpointsでそれぞれの点のxyz座標を取れます。

```swift
extension ARPointCloudViewController: ARSessionDelegate {
    func session(_ session: ARSession, didUpdate frame: ARFrame) {
        / ARFrameのrawFeaturePointsのpointsで座標を取得
        guard let pointPositions = frame.rawFeaturePoints?.points else {
            return
        }
        // 前の点群Nodesを取り除く
        self.featurePoints.forEach { $0.removeFromParentNode() }
        
        // 新しい点群Nodes作成
        let featurePointNodes: [SCNNode] = pointPositions.map { position in
            let node = sphereNode.clone()
            node.position = SCNVector3(position.x, position.y, position.z)
            return node
        }
        
        // 新しい点群Nodesを貼り付け
        featurePointNodes.forEach { sceneView.scene.rootNode.addChildNode($0) }
        
        // 一旦保存
        self.featurePoints = featurePointNodes
    }
}
```

# 完成

Nodeをカスタマイズして、色々な点を出してみましょう。

|赤い点|赤いコーン|
|:-:|:-:|
|<img src="https://github.com/kboy-silvergym/ARKit-Emperor/raw/master/images/point2.gif">|<img src="https://github.com/kboy-silvergym/ARKit-Emperor/raw/master/images/point3.gif">|

# サンプルコード
https://github.com/kboy-silvergym/ARKit-Emperor のARPointCloudにあります！

# 参考文献
https://developer.apple.com/documentation/arkit/arpointcloud
CADDi2018-D「Harlequin」

# D問題「[Harlequin](https://atcoder.jp/contests/caddi2018/tasks/caddi2018_b)」

# 考察

## コンテスト中の考察

- 配列の総和で偶奇を取ると、WAが3つで、あとはACだった。
- 配列の数値が全て1のとき、firstの勝利にしたらWAが2つになった。
- こんな感じでコーナーケースを探すゲームをしていました。



## 理想の考察

- ゲーム系の問題は、実験するのが有効な手段である。なので、実験してみる。

### N=1で実験する

- まず、N=1で実験してみる。
- 数が0の状態で渡されたら負けるので「L」を入れる。
- 数が1の状態は、相手に「L」を押し付けて勝てるので「W」となる
- 数が2の状態は、1つ取ると「W」になり相手を勝たせてしまうので「L」となる。
- このように埋めていくと、以下の図のようになる。
- 図を見ると、奇数個の状態で渡されたら勝てることがわかる。
- よって、N=1のとき、初期状態（a[0]）が奇数ならこちらの勝ちとなる。

<img width="163" alt="caddi2018_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/218584/2ab3bd98-e011-03f7-f511-cb66451176ce.png">


### N=2で実験する

- 今見ているマスの「左」「上」「左上」に１つでもLがあれば、相手に負けを押し付けることができるため今見ているマスはWとなる。
- 逆に、「左」「上」「左上」が全てWの場合、相手が勝つのでこちらがLとなる。
- こんな感じで埋めていくと、以下の図のようになる。
- これを見ると、それぞれの色が偶数個の状態で渡されたら負けることがわかる。

<img width="192" alt="caddi2018_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/218584/dbb9ba93-c44b-9a73-35fb-5ce37a68fad1.png">


### ちょっとした証明をする

- N=2の実験で、「自分の手番で各色の個数が偶数この場合、自分は負ける」という仮説を立てることができる。
- そこで、「いずれかの色のリンゴが奇数個」の状態をO、「どのリンゴの色の個数も偶数個」の状態をEとする。
- 現在の状態がEの場合、どのように食べてもいずれかのリンゴの個数が奇数個になる。よって現在の状態がEの場合、次の状態は必ずOになる。
- 現在の状態がOの場合、奇数個のリンゴのみを食べればEに遷移することができる。相手にEを押し付ければ勝てるので、奇数個のリンゴを食べるのが最善手となる。
- 図にすると以下のようになる。
- 以下より、初期状態がEの場合は負けて初期状態がOの場合は勝つことがわかる
  - 最善手は相手にEを押し付けることである。
  - 初期状態がEの場合、先手は後手にEを押し付けることができない。後手は奇数個のリンゴを食べることでEを押し付けることができる。よってこの場合、後手が勝利する
  - 初期状態がOの場合、先手は奇数個のリンゴを食べることで相手にEを押し付けることができる。後手はEを押し付けることができない。よってこの場合、先手が勝利する。

![caddi2018_3.png](https://qiita-image-store.s3.amazonaws.com/0/218584/eb8e9383-a859-62a1-009d-319b39f839e1.png)



## [コード](https://atcoder.jp/contests/caddi2018/submissions/3855557)

```cpp
#include <bits/stdc++.h>
using namespace std;

#define int long long

signed main() {
  int N;
  cin >> N;
  int cnt = 0;
  for (int i = 0; i < N; i++) {
    int a;
    cin >> a;
    if (a % 2 == 0) {
      cnt++;
    }
  }

  puts(cnt == N ? "second" : "first");

  return 0;
}
```



## 要点

- ゲーム系問題は実験するのが大事
- WL-Algorithm
  - 相手に押し付けたら相手が負けるような状態を探す
  - その状態を相手に押し付けるのが最善手とする
  - 多分そんな感じのアルゴリズム

## おまけ

- これ好き

<img width="584" alt="caddi2018_4.png" src="https://qiita-image-store.s3.amazonaws.com/0/218584/996a91b9-40b4-81d6-0520-8a30b3dac5ee.png">

## memo

- 番兵さんより[アリストボブ](https://atcoder.jp/contests/abc059/tasks/arc072_b)が類題。ゲーム問題で考察時に考えた方がいいこと
- [つたさんオススメ記事](http://d.hatena.ne.jp/nanikaka/20120524/1337797626)
- [似たような記事](http://n-knuu.hatenablog.jp/entry/2015/06/04/165653)見つけた
- [topcoderの記事](https://www.topcoder.com/community/competitive-programming/tutorials/algorithm-games/)が有用そう？

- Nimでも解けるらしい（嘘解法らしい）
- ほんとはN=3でも実験したかったけど、方法がわからない。
Qiitaのことは知ってるのに、なんで父親Increments株式会社のことは知らないの？ 最高なサービスミッションで社会幸福を実現。評判五つ星。

[Increments株式会社 -](https://increments.co.jp/)

# エンジニアを最高に幸せにする。

最高。

言うことなし。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/dad28693-a9fd-ffeb-7f92-b37fbd780116.png)

# 社会を支えるソフトウェアの開発

ソフトウェアは社会を支えるためにある！

心改まる思いで感動するレベル。

# それを支えるプログラマの開発効率の向上に貢献することを通して

- 「開発効率」というきわめて限定的な言葉で良いのだろうか？
- 「生産性」の方がちょっとだけ幅広い気がした
- もし僕が書くなら「プログラマの総合戦闘力の爆上げ」って書くと思う

# もしも会社が、プログラマ自身の幸福をもっと考えたなら

- 「プログラマ=人間自身の幸福」にも寄与する、とか入っていたらきっと素敵すぎて死ねる、結局は僕らプログラマも当たり前だけど、社会を構成しているわけだし
- 最近では、外の社会に向けて「貢献」を売り出すより前に、会社自体の従業員、関係者が「幸福」である必要があるよね？という社会の潮流があるようだ
- 言ってみればそうだ、もしすべての会社が従業員を幸福にしていたら、世の中から不幸な人間を根絶することだってできるだろう、外側より内側に向かう

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f0fb870c-973f-bb2c-9ce8-21f33002b44c.png)


話がそれ過ぎて閑話休題

# 社会の変化、世界の進化を加速させていきたいと考えています

- デジタルユートピア、テクノロジが僕ら人類を幸福にするなら、それを加速させたらもっと幸福に近づく？
- ただし、進化は良い進化、変化は良い変化ではなくてはいけない
- 単なるスピード感よりも「プラスの方向に向かう着実さ」とか、その方がフィットしそうな個人的感想、爆速で間違った方向に進んだときの「手戻り」の膨大なコストとか、プログラマなら誰もが経験してるでしょ？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/8106fe41-39d0-3cf7-67ae-9587da7eb4cb.png)


# まったく関係なくてnitsな枝葉だけどタイトルタグの不在が気になる

```html
<title>Increments株式会社 -</title>
```

末尾のハイフン。

WordPressとかのサービスにありがちな「トップページで個別記事のタイトル不在」「そしてハイフンだけが残されて誰もいなくなった」案件と思われる。

マイナスがあると Decrements なので プラスを入れて Increments してはどうだろうか？と勝手に述べる迷惑Qiitaユーザー @YumaInaura 。 



# Increments株式会社++

いんくりめんつかぶしきかいしゃぷらぷら

言いたくなるなる

# ところでエンジニアリング、プログラミングのモチベーションを上げるには？

会社のサービスコンセプト、ミッション、使命をいろいろと見てみると面白いかもしれない、それが最強かも

Qiitaのように素晴らしいミッションを見つけたときの喜びと、脳に走る血潮的な刺激たるや

就職転職、我が身のことを考えるのも良いけれど、僕らエンジニアはもっと大きな視点に立って働いたらきっと、もっと爽快な気持ちになれるだろう

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f8a14828-36f0-110c-df35-41202a74e854.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
夫婦でKPTしてみた

この投稿は、アジャイル開発 [Advent Calendar 2018](https://qiita.com/advent-calendar/2018/agile) の23日目です。

#はじめに
皆さんはカイゼンジャーニー(著:市谷聡啓/新井剛)という書籍をもう読みましたか？
主人公の江島が問題だらけのプロジェクトをアジャイルにおける「プラクティス」を活用してカイゼンしていく心温まるストーリーです。主人公の江島に自分を重ねて後半には泣いてしまうという方もいるようです。

本記事は、カイゼンジャーニーを読んでみてアジャイル開発のプラクティスである`KPT`を開発だけではなく日常生活に取り入れてみた、という記事です。

#KPTとは
Keep(良かったこと)、Problem(問題と感じていること)、Try(次に試してみたいこと)を紙に書き出して振り返りを行うものです。
KPTの細かい定義は割愛しますが、私がKPTの一番良いなと考えているところは「Keep」が用意されている点です。Keepを挙げることで雰囲気が良くなり、心理的安全が確保され、遠慮しがちなProblemも言いやすくなります。そうすると、本当に改善しなければならないことが可視化されてきますし、より本質的なカイゼンへ導く最初のステップだと思います。

# なぜ夫婦でKPTをしたのか?
最近、子供が生まれたのですが、初めての子育てに勝手がわからず上手く作業分担が出来なかったり、お互いの不満をいうことが以前と比べると多くなったことを実感していました。ちょうどその時通勤中に「カイゼンジャーニー」を読んでいて、「疲弊したプロジェクト」に今の家庭を重ねて、夫婦の関係も「カイゼン」できるのかな？(大げさ)と考えたのが始まりです。
そして「KPT」というフレームワークを選定したのは、前章でも書いていますがKeepがあって雰囲気も良くなると考えたからです。それに加えてシンプルで継続もしやすいと思いやってみることにしました。

#実際にやってみた
だいたい30分で実施

## 使用したツール
Trelloを使用しました。カンバン方式のタスク管理ツールですが、非常に洗練されたUIで取り組みやすいです。
他にもオンラインのサービスを探して試してみましたが自動保存されなかったり、書いたものが不定期に消えてしまうということがあったので、Trelloに決めました。

## 工夫したこと
- KPTを行う理由やきっかけを説明して納得した状態で始めること
なぜ二人でわざわざ時間を確保して振り返りをするのかということを明確にして相手に納得してもらいます。前向きに捉えてもらうことが大切です。

- 一人で一度リハーサルしておく
サービスの使い方が分からずにモタモタしてしまうと雰囲気が悪くなってしまうと思うので事前にリハーサルをしておくて円滑な振り返りができます。

- リアクションを取る
話が脱線するほどのリアクションをする必要はないですが、「ほぅ」「なるほど」「そうだったのか」などと頷くことで、リズムが生まれて振り返りが活性化します
 
## 気をつけること
- 相手がKPTを実施する意義に共感できないのであれば、キッパリとやめましょう
- 厳密になりすぎないこと

# やってみて思ったこと
- 相手が自分のいつもの生活のどこをKeep、Problemと思っているのか可視化されて、一人では分からなかった「振り返るべきポイント」が明確になった
- フレームワークに乗っかって、日常的に「感じていることを共有する機会」が増えた
  - 充分に振り返り切れないところがあったが、普段の生活の中で「あ、これはKeepだね、ありがとう」、「ん？これはProblemやん！」とKPTフレームワークがちょっとずつ浸透した

# どうなった？
我が家では、「スケジュールやToDoが二人で上手に管理されていないこと」が原因でやるべきことが間に合わないことお互いの不満を言ってしまう大きな問題という結論に至ったので、「スケジュールを管理して見える化すること」を課題にしました。
見える化とすぐに情報を更新できるようにスマホにTimeTreeとWunderListを入れ、共有カレンダーと共有ToDoを作成して、ホーム画面にガジェット追加しています。

# 最後に
ありきたりな結果だったかもしれませんが、なんとなく決め打ちで結論に至るのとKPTを通して結論を出すのでは成果物も雰囲気も変わってると思います。そして、そこには次回の振り返りのネタがたくさん転がっています。
これは今は上手く機能しているように見えますが、また1ヶ月後に振り返ってみるまで「よかったのか」「よくなかったのか」まだ分かりません。継続的な「振り返り」を行っていきたいと思います。

ぜひ普段の生活にも「振り返り」にKPTを導入してみませんか？

明日は @matsu0228 さんの「ヨーロッパ最大のアジャイル・テスト自動化カンファレンス「AgileTestingDays2018」に参加してきた」です。お楽しみに！
GAE python3.7で定期スクレイピングしてpandasでデータ処理する婚活情報収集基盤を作りたかった

これは[BrainPad Advent Calendar 2018](https://qiita.com/advent-calendar/2018/brainpad) 24日目の記事です。

今日はクリスマスイブですが皆さんはいかがお過ごしでしょうか？僕は虚無です。
なので婚活情報収集基盤を作ります。

# GAEの話

2018年12月20日、こんなニュースがありました。
[Python 3.7 for App Engine is now generally available](https://cloud.google.com/blog/products/compute/python-37-for-app-engine-is-now-generally-available)
GAEでpython3.7がGAになったとのこと。
今までのGAE standardだとpython2.7が主流で、pandas, scipyなどはflexibleにしないと使えないという状態でした。
8月9日に[ベータ版](https://cloud.google.com/blog/products/gcp/introducing-app-engine-second-generation-runtimes-and-python-3-7)が出てましたが、この辺がstandardでも使えるというのは良いニュースですね。
とはいえ実際どうなのか……その辺も試してみます。

# 作ったもの

[woody-kawagoe/advent-calendar-2018](https://github.com/woody-kawagoe/advent-calendar-2018)

# 概要

+ GAE python3.7で作成。
+ 定期ジョブでスクレイピングを行う。
    + スクレイピング先は[オミカレの街コン情報](https://party-calendar.net/area/tokyo/machicon)。
+ スクレイピングしたデータをCloud datastoreに格納。
+ 申し訳程度にpandasでデータ処理できるか確認。

# ページ

+ app/
    + datastore内のイベントデータを返す（最大100件）
+ app/task
    + スクレイピングを行うAPI
    + ここをcronで叩く
+ app/check
    + 場所ごとのイベント数を返すAPI
+ app/random
    + ランダムでデータストア内のイベントを一個返す
    + なぜかここだけhtmlを返す


# 所感

+ スケジュール管理するcron.yamlと叩くAPIを同じプロジェクト内で表記できるのは楽
+ datastoreの操作でまだndb使えないのは辛い
+ GAE standardでpandas使えるのは楽

# 言い訳

この記事とかアプリを書き始めたのが12月22日なので勘弁してください。
ぶっちゃけ作ったのはカスみたいなwebアプリだけど応用範囲は色々あって、「定期的にデータ収集する」場合は今回みたいなGAE + datastoreの構成だと楽かなと思います。

# 余談

最近出たのにCloud Schedulerというサービスがあって、これがあれば時間トリガは使えそう。
というか次のチュートリアルがまんまそれ。
[Using Cloud Scheduler and Pub/Sub to Trigger a Cloud Function](https://cloud.google.com/scheduler/docs/tut-pub-sub)

出来るだけ書くコード少なくしたいならCloud Scheduler + Pub/Sub + Cloud Function、
もうちょい色々やりたいならGAEだけでやるのが良さそうかなと思います。
HerokuにデプロイでRubyバージョンサポート外エラー

# はじめに
HerokuのStackをバージョンアップしようとして、エラーになったので、
作業記録としても、対応作業しながら投稿。

#経緯
Stackを最新バージョンのHeorku-18に更新し、デプロイしようとしたところ、次のエラーが発生。

```terminal:エラー
 !     This version of Ruby is not available on Heroku-18. The minimum supported version
 !     of Ruby on the Heroku-18 stack can found at:
 !     
 !     https://devcenter.heroku.com/articles/ruby-support#supported-runtimes
 !
 !     Push rejected, failed to compile Ruby app.
 !     Push failed
```

原因は、Rubyが2.4.1だったからの模様。
↑のURLを見るとわかるが、サポートは2.4.5

#対応手順
##1. Rubyバージョンアップ
###1-1. Ruby2.4.5インストール
私の環境では、rbenvでRubyを管理しているため、rbenvでRubyのバージョンアップを試みる。

```terminal:バージョンアップ(2.4.5インストール)
$ rbenv install 2.4.5
ruby-build: definition not found: 2.4.5

See all available versions with `rbenv install --list'.

If the version you need is missing, try upgrading ruby-build:

  brew update && brew upgrade ruby-build
```
無いと言われる？！

調べたところ、rbenvのバージョンが古いらしい。
参考：https://qiita.com/_kanacan_/items/c1499f6c13b1c41da982

###1-2. rbenvのバージョンアップ
```terminal:rbenvのバージョンアップ
$　brew upgrade rbenv ruby-build
```
```terminal:確認
＄　rbenv install -l
　　中略
  2.4.1
  2.4.2
  2.4.3
  2.4.4
  2.4.5
  2.5.0-dev
  2.5.0-preview1
  2.5.0-rc1
  2.5.0
  2.5.1
  2.5.2
  2.5.3
```
あった！！！

というわけで、再度インストール

```terminal:バージョンアップ(2.4.5インストール)
$ rbenv install 2.4.5
ruby-build: use openssl from homebrew
Downloading ruby-2.4.5.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.5.tar.bz2
Installing ruby-2.4.5...
ruby-build: use readline from homebrew
Installed ruby-2.4.5 to /Users/{user_name}/.rbenv/versions/2.4.5
```

#2. プロジェクトに適用
Rubyがインストールできたので、各プロジェクトに適用していきます。

プロジェクトのディレクトリに移動後、
##2-1. rbenvの設定変更
```terminal:プロジェクトに適用
$ rbenv local 2.4.5
```

```terminal:確認
$ rbenv versions
  system
  2.4.1
* 2.4.5 (set by /{project_dir}/.ruby-version)
```

##2-2. Railsプロジェクトに適用

```terminal:bundle_install
$ bundle install
rbenv: bundle: command not found

The `bundle' command exists in these Ruby versions:
  2.4.1
```
Rubyごとにbundleを入れ直さないと行けない模様。

```terminal:bundle入れ直し
$ gem install bundler
Fetching: bundler-1.17.2.gem (100%)

Successfully installed bundler-1.17.2
Parsing documentation for bundler-1.17.2
Installing ri documentation for bundler-1.17.2
Done installing documentation for bundler after 12 seconds
1 gem installed
```

```terminal:再度bundleinstall
$ bundle install
Your Ruby version is 2.4.5, but your Gemfile specified 2.4.1
```

Gemfileを変えなきゃいけなかったので、変更後再度！

```terminal:Gemfile変更後再度！
$ bundle install
```

完了！！！
2018年も終わり。ところで最近のQiitaってどうなの？初心者がはじめて記事を書くのは緊張するしハードルが高い？アウトプット大好きヘヴィーユーザーが教える気楽にやろうぜ！の心得とは。

[qiita yumainaura - Google Search](https://www.google.co.jp/search?q=qiita+yumainaura&oq=qiita+yumainaura&aqs=chrome..69i57j69i60l3j69i59l2.2967j0j7&sourceid=chrome&ie=UTF-8)

# 最近のQiitaって？

Qiitaのトップページがトレンド表示、人気記事が並ぶようになってから、10個ぐらいの炎上案件があったよ。でも 2018-12現在 今は落ち着いている状態

トップページがトレンドになったので、単に記事を書いてもいいねがつきにくくなった？単に僕の気のせいかも？

Google検索での強さは健在だよ、いちど記事を書いたら、Google検索からの流入も多いと思う

個人ブログを作るよりずっとおすすめだよ、書いても1回も読まれない記事より、100回は開かれる記事のほうが良いでしょ？個人ブログを軌道に乗せるのは並大抵のことじゃないよ

ブランド力に関しては前よりも弱まった？「Qiita書いてる、進んでる、すげー」感はなくなって、ありふれたインフラ的な位置づけになったかな？

サービスも1年ごと、1ヶ月ごとに歴史を積んでユーザーも変わっていくし、変わらないものなど何もないよね

# 俺がおすすめするオレ記事

[拝啓 本当は Qiita を書きたいのに、まだ迷っているあなたへ。 - Qiita](https://qiita.com/YumaInaura/items/4d2c602d59c62daa9344)

# Qiitaは人のためならず、アウトプット最強

言葉では言ってもたぶん体感してみなければわからないこと。

# 世の中に出回っている情報を重複発信して良いの？

良い。なぜなら自分の脳にアウトプットされるからだよ。

自分の脳に刻まれる効果が80%で、あとの20％はおまけみたいなもの。このスタート地点に何度でも戻って起用。

この効果を信じない人間はアウトプット量がまだまだ足りない人生の徒である。

# いいねが付かないとつらそうじゃない？自己承認欲求の虜なの？

たしかに辛い。ヘヴィー長年常連ユーザー@yumainaraだって気にしないわけじゃない。

でもPCキーボードを叩く原始的衝動、ブルーハーツ精神、初期衝動を思い出せ。

自己承認欲求に囚われたら最後。書いているときの楽しさと、いいねの赤ポチを気にしているときでは、脳の働きがまるで違う。僕らはおなじQiitaでまったく別の世界を見ている。

マインドフルネスの技術で自己客観視できるようになるのがおすすめ。

[瞑想するエンジニア - Google Search](https://www.google.co.jp/search?q=%E7%9E%91%E6%83%B3%E3%81%99%E3%82%8B%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2&oq=%E7%9E%91%E6%83%B3%E3%81%99%E3%82%8B%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2&aqs=chrome..69i57j69i61l3.11246j0j7&sourceid=chrome&ie=UTF-8)


# それでもハードルが高いならScrapBoxはいかが？

プログラマ向けサービスじゃないけど、ソーシャル性が一切排除されていているところが、むしろ気楽。

何気にすることなく書き散らしてみて、それで何かよいものができたらQiitaとかはてなブログとか、目に付きやすいプラットフォームに持ってきても良いかもしれない。

[scrapbox 始める - Google Search](https://www.google.co.jp/search?q=scrapbox+%E5%A7%8B%E3%82%81%E3%82%8B&oq=scrapbox+%E5%A7%8B%E3%82%81%E3%82%8B&aqs=chrome..69i57j69i64.3922j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
昔から大好きな地形生成について語る。

#地形生成は楽しい！

現在、[**"DungeonTemplateLibrary"**](https://github.com/Kasugaccho/DungeonTemplateLibrary)というダンジョン地形生成ライブラリを作っています。
ここでは私がなぜ地形生成を愛するのかお話します。

昔から地形生成モノが好きで
ローグライクものでいえば、
小学一年生の頃に**"ポケモン不思議のダンジョン赤の救助隊"**
小学三年生の頃に**"ポケモン不思議のダンジョン時の探検隊"**
小学五年生の頃に**"ポケモン不思議のダンジョン空の探検隊"**

![rl4.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/ef26da46-6444-e757-3e02-f96d3de1e4b9.gif)

ワールドマップ生成ものでいえば、
幼稚園年中の頃に"**どうぶつの森e+**"
小学一年生の頃に**"おいでよ どうぶつの森"**
小学四年生の頃に**"街へいこうよ どうぶつの森"**
中学二年生の頃に**"とびだせ どうぶつの森"**

中学三年生からは"**マインクラフト**"にハマりました。

![fmap.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/91b23e83-57d1-c4fa-3d34-06afb961be26.gif)

また、小学生・中学生の頃は迷路がものすごく好きでした。

そういうことで地形生成の虜になり、
大学生になった今、地形生成のアルゴリズムの研究に没頭しています。

#地形生成の日本語文献は少ない

残念ながら地形生成の日本語文献はほとんどありません。
ですので、英語文献からアルゴリズムや手法を引っ張り出してくる必要性があります。

日本はこんなにも地形生成のゲームが充実しているというのに、
文献が少ないのはなんだか悲しいですね。

そこで、私は日本語話者に地形生成の魅力を知ってもらうため、
とあるライブラリを作り始めるのであった……

#[DungeonTemplateLibrary](https://github.com/Kasugaccho/DungeonTemplateLibrary)

[![Logo-GIF](https://kasugaccho.github.io/DungeonPicture/Picture/Logo/logo_color800_2.gif)](https://github.com/Kasugaccho/DungeonTemplateLibrary)

私が開発しているダンジョン生成ライブラリです。
最終的にはこの世で最も素晴らしい地形生成ライブラリを目指しています。

ライセンスはBoost Software License 1.0です。
もっと日本でも地形生成アルゴリズムの提案者が出ることを期待しています。

## RogueLike (ローグライク)

[![rl.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/28d389da-7bf1-20f3-e99f-638c417f22e7.gif)](https://github.com/Kasugaccho/DungeonTemplateLibrary)

## Simple Voronoi Island (簡易ボロノイ島)

[![m1.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/9705715f-0d89-b585-b66a-fb6a5c778670.gif)](https://github.com/Kasugaccho/DungeonTemplateLibrary)

## Fractal Island (フラクタル島)

[![fmap.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/91b23e83-57d1-c4fa-3d34-06afb961be26.gif)](https://github.com/Kasugaccho/DungeonTemplateLibrary)

## Maze Dig (穴掘り法迷路)

[![meiro4_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/213065/34351744-f7b9-7fbc-5cd7-7bef044810b1.jpeg)](https://github.com/Kasugaccho/DungeonTemplateLibrary)

## Simple RogueLike (簡易ローグライク)

[![srl.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/c2736651-56b6-b963-e5f6-4db14d6c2fc7.gif)](https://github.com/Kasugaccho/DungeonTemplateLibrary)

皆さんもぜひ遊んでみてください。

#おわり

地形生成の沼は深い。
laravel パスワード リセットも 4桁に

パスワードリセット時 6桁じゃなくて 4桁にしたい。

```ResetsPasswordController.php

    protected function rules()
    {
        return [
            'token' => 'required',
            'email' => 'required|email',
            'password' => 'required|string|min:4|confirmed',
        ];
    }

```


これを追記しないとデフォルトのやつ使っちゃってControllerの設定がうまくいかない。
必ず追加。

```web.php

Route::match(['get', 'post'] , '/password/reset/{token}', 'Auth\ResetPasswordController@reset');
Route::match(['get', 'post'] , '/password/reset/', 'Auth\ResetPasswordController@reset');

```

しかし、
Passwords must be at least six characters and match the confirmation.
が出るのでこっちも変更

```PasswordBroker.php　168行目らへん

    protected function validatePasswordWithDefaults(array $credentials)
    {
        list($password, $confirm) = [
            $credentials['password'],
            $credentials['password_confirmation'],
        ];

        return $password === $confirm && mb_strlen($password) >= 4;
    }


```