OmniAICreator/Qiita-1.07M huggingface dataset:
iOSエンジニアのためのAndroid開発における学習ガイドライン

# おれ的Android開発の勉強方法
念のため、僕の実務経験はiOSを4年ほど経験を積んでいるiOSエンジニアです。  
4年ぐらい前にiOSの開発でこの世界に参入した初心者プログラマでした。  
現地点でのスキルセットは
- Objective-C: 4年
- Swift: 3年ぐらい (Swift1.2時代に参入)
- Ruby: 半年間(趣味でのAPI開発)
- Java: 3ヶ月(Android Studio1.0時代)

といった感じです。
そんなiOSエンジニアが最近Android開発で勉強するようになりました。  
今後、同じようなキャリアを歩む方のための備忘録として残します。

## 購入した書物(Kindle)
紙の本は管理が面倒なので僕は基本iPad miniでキンドルアプリを開いて
1日辺り1~2時間の読書しているだけです。  
iOSの開発経験があれば、意外と流し読み程度でも実務で通用することが最近分かってきました。
人によっては今更感あるかもしれませんけどね。
学習にはインプットだけでなくアウトプットも必要だから  
Qiitaに投稿するというスタイルをとっています。


1.
[Java本格入門 ~モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで](https://www.amazon.co.jp/Java%E6%9C%AC%E6%A0%BC%E5%85%A5%E9%96%80-%E3%83%A2%E3%83%80%E3%83%B3%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%83%BB%E5%AE%9F%E7%94%A8%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%BE%E3%81%A7-%E8%B0%B7%E6%9C%AC-%E5%BF%83/dp/477418909X/ref=sr_1_1?s=books&ie=UTF8&qid=1527666085&sr=1-1&keywords=java+%E6%9C%AC%E6%A0%BC%E5%85%A5%E9%96%80)


僕のとってはJavaのまとまった情報が得られたという意味で非常に使えました。  
Javaの文法を始めてから丁寧に、って感じで体系的に書き方を学べました。

2.
[増補改訂版Java言語で学ぶデザインパターン入門](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030/ref=sr_1_1?s=books&ie=UTF8&qid=1527666221&sr=1-1&keywords=java+%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)

まだ使えるかは分かりませんが、  
AndroidでadapterとかBuilderとかiOSでそんな概念のある設計に  
出会ったことがありませんでしたので、そういったクラスがどう役に立っているのかを理解したいために購入しました。  
今はまだ積ん読。


3.
[基礎&応用力をしっかり育成! Androidアプリ開発の教科書 なんちゃって開発者にならないための実践ハンズオン](https://www.amazon.co.jp/%E5%BF%9C%E7%94%A8%E5%8A%9B%E3%82%92%E3%81%97%E3%81%A3%E3%81%8B%E3%82%8A%E8%82%B2%E6%88%90-Android%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E3%81%AA%E3%82%93%E3%81%A1%E3%82%83%E3%81%A3%E3%81%A6%E9%96%8B%E7%99%BA%E8%80%85%E3%81%AB%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%81%AE%E5%AE%9F%E8%B7%B5%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3-CodeZine-BOOKS/dp/4798152021/ref=sr_1_1?s=books&ie=UTF8&qid=1527666317&sr=1-1&keywords=android+studio)

Javaの文法を一通り学んだらあとは  
最新のAndroid Studioで使えるUIやらSDKを学びたいと思い、購入に至りました。  
まあ、ネット上の情報でおすすめの本が紹介されているのですが、  
大体の本が3,4年前の本なのでSDKの内容が古くなっているはずです。  
iOS初心者がSwift4の時代にSwift1を学んでも仕方ないことと  
同じだと思っているので最新の本を購入しました。

これら3冊の本を流し読みしたら当面は開発で困らないかなと強気で思っています。

## 上記３冊を理解できたらやりたいこと

[Ray Wenderlich](https://www.raywenderlich.com/)
のAndroidのチュートリアルでAndroid用の設計について学びたいと思っています。  

Kotlin
を勉強したいですね。JavaとKotlinができるようになったら当面は仕事に困らないでしょう。

Kotlinサーバーサイド
本命はこれですね。本当は趣味でJavaとかでECサイトを作りたいと思ってAndroid開発に着手しましたが、
本命はECサイトが作りたいだけのエンジニアです。はい。
KotlinでECサイトが作れるのかどうかは別の話ですけど・・・。

## 備考

僕みたいにiOS開発がある程度まで慣れてきて仕事が退屈になったらAndroidだったり、
機械学習に手を出してみたらいい刺激になるのではないかなと思います。
で、周りにそういった人がいなかったのし情報量が少ないので、
今後こういう人のために情報を残しておくのはありかなと思いました。
Nimでゼロ埋め

# Nimでゼロ埋めしたいと思っただけ。

```nim
import strformat, strutils
let
  n = 6
  s = "5"

# int型
doAssert fmt"{n:04}" == "0006"

# string型の場合parseIntする
doAssert fmt"{s.parseInt:03}" == "005"
```

string型はformat関数でも出来そうでしたが，ゼロ埋めだけならintに変換してしまう方が楽だと思いました。(ドキュメントの英語がよくわからなかった)

詳しくはstrformatの[公式ドキュメント](https://nim-lang.org/docs/strformat.html#fmt.t,string)へ

18/06/01追記
@2vgさんに`align`を使う方法を教えていただきました。ありがとうございます。

```nim
import strutils

var a: string = ""
doAssert a.align(5, '0') == "00000"

a = "123"
doAssert a.align(5, '0') == "00123"
doAssert a.align(6, '#') == "###123"
```

もとの値がint型で0またはスペースで埋めたいだけなら`fmt`の上の方法,
もとの値がstring型で0やスペース以外で埋めたい場合は`align`を使うのが良さそうですね。
Timerスレッドを使わずに、スレッドが走り始めて一定時間以上たってからフラグを確認する

# やりたかったこと
外からキャンセルされない限り動き続けるスレッドにおいて、走り始めてから1秒以上たっても自スレッド内のフラグが立っていなかった場合、特別な動作をしたい。
#Before

タイマータスクで1秒後にフラグを確認しに行く

- タイマースレッドもたつのでスレッドが乱立し何となくぐちゃぐちゃに
- フラグとかフィールドとか増えてくるといちいち排他処理とか考えなくてはならなくなってきて大変

```java

public class AClass {
    private AThread aThread=new AThread();
    private volatile Handler mHandler;
    public void start(){
        aThread.start();
    }
    public void stop(){
        aThread.mIsStopThread=true;
    }
    private class AThread extends Thread{
        public volatile boolean mIsStopThread = false;
        volatile private boolean mIsGot=false;

        @Override
        public void run() {
           

            Timer mTimer = new Timer();
            mTimer.schedule(new TimerTask() {
                @Override
                public void run() {
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            if ( !mIsGot&&!mIsStopThread) {
                                //1秒たってもほしいデータが取れてなくて、スレッドもキャンセルされてなかったら

                            }
                        }
                    });
                }
            }, 1000);

            while (!mIsStopThread){
                //外からスレッドをキャンセルされない限り動き続ける
                //ほしいデータが取れたら、mIsGotフラグを立てる
            }
        }
    }
}
```

#After
タイマースレッドは立てずに、スレッドの走りはじめの時間を記録しておいて現在時刻との差分を見て1秒経っているか判断。

- これにより余分なスレッドを立てるのを防止してコードすっきり

```java
public class AClass {
    private AThread aThread=new AThread();
    private volatile Handler mHandler;
    public void start(){
        aThread.start();
    }
    public void stop(){
        aThread.mIsStopThread=true;
    }
    private class AThread extends Thread{
        public volatile boolean mIsStopThread = false;
        volatile private boolean mIsGot=false;
        private long startTime;

        @Override
        public void run() {
            super.run();
            // RecordThreadの走りはじめの時間を記録
            startTime = SystemClock.elapsedRealtime();

            while (!mIsStopThread){
                if (!mIsGot && (SystemClock.elapsedRealtime() - startTime) > 1000) {
                    //1秒たってもほしいデータが取れてなくて、スレッドもキャンセルされてなかったら
                }
                //外からスレッドをキャンセルされない限り動き続ける
                //ほしいデータが取れたら、mIsGotフラグを立てる
                if(!mIsGot){
                //もしまだとれてなかったらいったん寝かす
                   try {
                          Thread.sleep(100); 
                        } catch(InterruptedException e){
                          e.printStackTrace();
                        }  
                 }
            }
        }
    }
}
```
Golang ポインタメモ

## ポインタの基礎関する記事：
https://qiita.com/To_BB/items/5b3625f8eca4f1c88574

##ポインタメモ整理：

&Personとは？  personのアドレス
*Personとは？ Personのアドレスを指す、！！&Personを使いたいなら p *Personの宣言が必要

```
 p = &Person{
        Name: "太郎",
        Age:  20,
    }
```

![121.gif](https://qiita-image-store.s3.amazonaws.com/0/190518/e73d43a9-83fe-c584-192b-543d3bc5caae.gif)

ここの `p` は自分のアドレスあり -> `0x00020`、`pの中身(アドレスの中身)`を（例：図のA）`Person`のアドレスを指す、`Person`のアドレスの書き方は `&` をつけるなので`&Person`

こうすると、pの中身にすごい軽量のアドレスだけ入れる、Person構造体のデータ入れなくていい、

メリット：
- pにPersonの構造体データ量多いので重い、効率よくない
- pにアドレスだけを入れることで使うメモリ空間が軽い、効率がいい
TypeScript Sampleをやってみるその６


## はじめに
[前回](https://qiita.com/pooshikin/items/c7dc6a2bcafd55412a09)のJqueryライブラリを利用した懐かしいゲームサンプルの備忘録を投稿します。
日本ではタカラトミー（昔はタカラ）が販売していた[レーダー作戦ゲーム](https://www.amazon.co.jp/%E3%82%BF%E3%82%AB%E3%83%A9%E3%83%88%E3%83%9F%E3%83%BC-TAKARA-TOMY-%E3%83%AC%E3%83%BC%E3%83%80%E3%83%BC%E4%BD%9C%E6%88%A6%E3%82%B2%E3%83%BC%E3%83%A0/dp/B0002YMD4A)を彷彿させます。
[海戦ゲーム](https://ja.wikipedia.org/wiki/%E6%B5%B7%E6%88%A6%E3%82%B2%E3%83%BC%E3%83%A0)がボードゲームの正式名称です。
ブラウザでゲームアプリ開発のファーストステップサンプルをお楽しみください。

## 前提
* [Visual Studio Code](https://code.visualstudio.com/download)がインストール済み
* [Node.js/npm](https://qiita.com/taiponrock/items/9001ae194571feb63a5e)がインストール済み
* gitから[Sampleをダウンロードして](https://github.com/Microsoft/TypeScriptSamples/archive/master.zip)任意のディレクトリに解凍済み
* View In Browserがインストール済み(Market Placeより)
* OSはWindows7/10を想定

## サンプル warship
古典的なグリッドベースの軍艦戦闘ゲーム

## ディレクトリ構成
```
./
└───img/
```
## ファイル構成
|パス|ファイル名|説明|
|:--|:--|:--| 
|.|default.html|warship画面のhtml|
|.|jquery.d.ts|Jqueryライブラリ型定義ファイル|
|.|jqueryui.d.ts|Jqueryドラッグ&ドロップ型定義ファイル|
|.|README.md|このサンプルの説明と使用方法|
|.|styles.css|スタイルシート|
|.|tsconfig.json|TypeScriptのコンパイルコンフィグファイル|
|.|warship.js|warship.tsのコンパイルにて作成されたJavaScriptファイル|
|.|warship.js.map|warship.tsのコンパイルにて作成されたmapファイル|
|.|warship.ts|warshipのTypeScriptファイル|
|img|bg.jpg|ブルーボックスイメージファイル|
|img|bg2.jpg|イエローボックスイメージファイル|

## クラス図
![TS_029.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/0da7ccca-5e3a-7880-95ec-493b8c764338.jpeg)

## 実行
```
cd ./warship
tsc --sourcemap --target ES5 warship.ts
``````
`default.html`をエディターで表示<kbd>Ctrl+F1</kbd> 

## 結果
![prpur-lx68z.gif](https://qiita-image-store.s3.amazonaws.com/0/239597/8b1b160e-53c5-979e-161f-fbbca827cbad.gif)

【遊び方】
左ボードが敵陣、右ボードが自陣
敵艦並びに自艦の配置はランダムに配置されます。
左ボードのマスをクリックしてひっくり返します。
1ターンずつ攻撃を交互に行います。
敵陣クリックで開始します。
敵艦船に命中すると赤、海面であれば緑に反転します。
艦船でマスの長さが決まっています。

空母:5マス　× 1 隻
戦艦:4マス　× 1 隻
巡洋艦:3マス　× 1 隻
潜水艦:3マス　× 1 隻 
駆逐艦:2マス × 1 隻

敵艦船または自艦船すべてに命中でゲーム終了です。

## ポイント
ゲームを構成するリソースをクラス化することで無駄のない教科書通りのコーディングです。
ボードクラスはセルクラスと船クラスから成り立ち、このボードクラスからゲームクラスが構成されます。そしてゲームクラスのインスタンスを作成しています。
もちろんボードクラスのマウスイベントはJqueryライブラリを使用しています。
TypeScriptのクラス機能がゲーム開発でいかんなく発揮出ることを証明しています。

## ノート
勝ち方のコツ、残りの艦船のマス数を意識し、連続してマスを開けるより飛び飛びで開けるほうが戦功できます。実ボードゲームで培った経験則ですが。

## まとめ
成功体験は人間のやる気を高めます。TypeScriptを勉強する初学者は、最初に「はじめてのTypeScipt」みたいな文法の参考書から学習するのが世間の常識みたいです。ほぼ退屈な無味乾燥な言葉の羅列でまったく頭に記憶されないのが常ではないでしょうか？別の視点から入ったていいはず。まったく別の方法、結果から学ぶ方法。このwarshipをとことん調べるだけでTypeScriptは制覇できる予感。文法など必要な時覚えればいいのさぐらいでどうでしょう。

以上、おそまつ
2. cromwell でCWLを実行してみる

# cwlが実行可能はcromwellのイメージを作成する

[1. cromwell でCWLを実行してみる](https://qiita.com/percipere/items/9a9c694cc7ef9fd4a67a)の環境のDocker imageを作成する

cwlが実行可能なdocker imageを作成するためのDockerfile

```dockerfile:Dockerfile
From ubuntu
MAINTAINER Percipere
RUN apt-get update
RUN apt -y upgrade
RUN apt-get -y install openjdk-8-jre
RUN apt-get -y install curl
RUN apt-get -y install python3
RUN apt-get -y install python3-pip
RUN apt-get -y install git
RUN git clone https://github.com/common-workflow-language/cwltool.git
RUN pip3 install ./cwltool 
RUN apt-get -y install vim

RUN useradd -ms /bin/bash cromwell
USER cromwell
WORKDIR /home/cromwell

RUN curl -LO https://github.com/broadinstitute/cromwell/releases/download/32/cromwell-32.jar
RUN ln -s ./cromwell-32.jar ./cromwell.jar

CMD /bin/bash
```

## docker imageの作成

上記のDockerfileを作成したディレクトリでdocker buildを実行する

```terminal
$ docker build -t cromwell .
```

## dockerコンテナの実行

作成されたイメージをもとにcrowmellを実行する

```terminal
$ docker run -it cromwell
```

以下はDocker内部での作業

## cromwellの動作を確認

```terminal
cromwell@4095de5a46e4:~$ pwd
/home/cromwell
cromwell@4095de5a46e4:~$ java -jar cromwell.jar --version
cromwell 32
```

[cromwell でCWLを実行してみる その1](https://qiita.com/percipere/items/9a9c694cc7ef9fd4a67a#_reference-f0edc8d7152a4a5a9c95)
で利用したcwlのファイルを利用して、cwlのワークフローを実行
(一部省略...)

```
cromwell@4095de5a46e4:~$ java -jar cromwell.jar run --type cwl --inputs echo-job.yml 1st-tool.cwl 
...
[2018-05-30 08:47:57,44] [info] SingleWorkflowRunnerActor workflow finished with status 'Succeeded'.
{
  "outputs": {

  },
  "id": "00866459-8bbc-454c-9954-fa9f5a6548a6"
}
...
[2018-05-30 08:48:00,61] [info] Shutdown finished.
```

ワークフローの動作を確認

今回はここまで:smiley:
PHP+MySQL+ApacheでさくっとDocker開発立ち上げる

フレームワークなしのPHPとMysqlだけのApache開発環境を作る機会があったので作成しました。
PHPやMySQLから始めたいプログラミング初心者の方、XAMPP卒業したいDocker初心者の方は是非参考にして見て下さい。

# ファイル構成イメージ

```
.
├── Dockerfile
├── docker-compose.yml
└── index.php
```

# docker-compose.yml

```docker-compose.yml
version: "2"

services:
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    volumes:
      - ./:/var/www/html
    ports:
      - 80:80
    links:
      - mysql
    depends_on:
      - mysql
  mysql:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=pass
      - MYSQL_DATABASE=php
```

# Dockerfile

```:Dockerfile
FROM php:7.2-apache

RUN docker-php-ext-install pdo_mysql
```

# index.php

```php:index.php
<?php
    phpinfo();
```

# Docker立ち上げ

`docker-compose up -d`

どーん！

# アクセス

こんにちわんこ！
http://localhost/

# MYSQLなど

```
dbname php
host mysql
user root
password pass
```

`docker-compose exec mysql mysql -p pass php`
forceCLIでSystem.debug()の結果だけ抜き出す

[forceCLI](http://force-cli.herokuapp.com/)だとローカルでApexコードが実行できます。

```
$ force apex anonymus.cls
```

開発者コンソールだと`Debug Only`のチェックボックスがあって`System.debug()`の結果だけ抜き出せるのですが、どうやらforceCLIにはそんなオプションはないみたいなので、`cut`コマンドでやってみました。

```
$ force apex anonymus.cls | grep USER_DEBUG | cut -d "[" -f2 | cut -d "]" -f2 | cut -d "|" -f3
```

`sed`でもいいけど、`cut`だと動きがわかりやすい。
React Sketch.appについて

デザイン自動化のお仕事をしてる中でSketchについて知らなかったので纏めました。
デザインに詳しくないですが、PhotoShopはWEBに便利で、Sketchはモバイルアプリに便利だという意見あり。

#React Sketch.app

React.jsからSketchファイル出力するツール。
Airbnbではデザインシステムの一貫で使ってる？
コード書いてスケッチに落として保存してるそうな。

コードと設定ファイルを書いて　→　Sketchファイルに変換。

<img width="807" alt="スクリーンショット 2018-05-30 17.20.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/bbded86d-0be6-57cb-95ed-84c8384875f4.png">

サンプルたち
http://airbnb.io/react-sketchapp/docs/examples.html

# 環境構築

Sketchはmacしか使えない。

Sketchを入手 [Try Free]で１ヶ月使えるみたい
https://www.sketchapp.com/

.appファイルはapplicationフォルダ以下に落としておく。

スケッチの空のプロジェクトを開いておく。
New Document押してくださいませ

<img width="687" alt="スクリーンショット 2018-05-30 17.36.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/7c20f296-adfc-9f17-14e3-e308148ec1f9.png">


npmのバージョンとSketchのバージョンが合わないで死ぬことも想定されるそうな。
まずはbasic-setupを動かす。

```
git clone https://github.com/airbnb/react-sketchapp.git
cd react-sketchapp/examples/basic-setup && npm install

npm run render
```

パソコン シューシュー言い出して
スケッチの画面が反映されたらOK



<img width="900" alt="スクリーンショット 2018-05-30 17.35.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/e9bd008f-3616-daae-c1f1-7bc1c91fe92c.png">


#Profile Cards

```
cd profile-cards
npm install
npm run render
```

<img width="1190" alt="スクリーンショット 2018-05-30 17.54.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/a09c434f-dc80-b51e-30f5-815a22706796.png">

//#timeline-airtable




#参考

https://namikuguri.hatenablog.com/entry/2018/04/22/120923

その他日本語資料

React Sketch.app でコードからデザインファイルを作ってみる
https://dev.classmethod.jp/visual-design/react-sketch-app/
react-sketchappを使った開発ワークフロー
https://persol-pt.github.io/posts/react-sketchapp/
アービトラージを起動できました

こちらのアービトラージのソースを見つけたので、起動を試みていました。
https://qiita.com/bitrinjani/items/3ed756da9baf7d171306

Node.jsのバージョンですが、最新のV10では、動かないです。
スタートしても、エラーになります。

それで先に投稿したバージョン管理のnodebrewで、V8.5.0をインストールしたら、起動できました。
![スクリーンショット 2018-05-30 17.10.29.png](https://qiita-image-store.s3.amazonaws.com/0/20977/9dfda754-deba-a9db-3dbc-f38fec1e0d1f.png)

nodebrewについては、こちらの記事を読んでください。
https://qiita.com/sawapi/items/adfc11465d034f4f2cf9

私は、今の段階では、ブラウザでのモニタリングができていないです。
http://127.0.0.1:8720/
にアクセスすると、接続が拒否されてしまうので。
セキュリティソフトをOFFにしても、ダメでした。
ポートが開いてないのか、確認をしている最中です。

#念のため
r2のインストールが終わると、
```
npm WARN deprecated @types/chalk@2.2.0: This is a stub types definition for chalk (https://github.com/chalk/chalk). chalk provides its own type definitions, so you don't need @types/chalk installed!
```
出るのが気になったので、下記のコードで、追加してみました。
不要なのかもしれません。
```
 git clone https://github.com/chalk/chalk.git
```
また
```
npm WARN r2@2.4.0 No repository field.
```
と出ますが、スルーしました。

#ブラウザでモニタリングする場合
初期のconfig.jsonでは、webGatewayがfalseになっていますので、trueに変更します。
私も、起動できました。
![スクリーンショット 2018-05-30 17.49.06.png](https://qiita-image-store.s3.amazonaws.com/0/20977/d985b966-8885-eed6-d3a3-9ebcdd9f17ea.png)



```json
 },
  "webGateway": {
    "enabled": true,
    "host": "127.0.0.1",
    "openBrowser": true
  },
```
この質問の回答を参考にしました。
https://github.com/bitrinjani/r2/issues/128
laravelでDBレコードの存在チェック方法

現プロジェクトでよく使うけど書いとかないと忘れそうなので備忘録メモ

## 環境
Laravel Framework 5.5

## DBの存在チェック方法

```php:Controller
DB::table(table_name)->where(column, $data)->exists();
```

戻り値：bool

とても簡単。

## sql直書きしてDBの存在チェック
ほとんどないけどたまに「date_fomat()」使って日付を文字列にして比較したい！ということがあった。

```php:Controller
$ym = '201805';
DB::table(table_name)->whereRaw('date_format(date_column, "%Y%m") = ?', [$ym])->exists();
```

公式読めばわかるけど第3引数にバインド値の配列が指定できるよ。
参考：[Laravel 5.5 データベース：クエリビルダ
](https://readouble.com/laravel/5.5/ja/queries.html)

ちなみにつなげて書く方法でもできる。推奨しない。

```php:Controller
$ym = '201805';
DB::table(table_name)->whereRaw('date_format(date_column, "%Y%m") = ' . $ym)->exists();
```


## 余談

```php:Controller
DB::table(table_name)->where(DB::raw('date_format(date_column, "%Y%m") = 201805'))->exists();
```

sql直書きするとき`DB::raw()`を使って書いてたけど実行するとなぜか`is null`がついてくる。
調べてみたけど全然わからなかったので誰かご存知でしたら教えてください。
グローバルを汚さないHanami環境の立ち上げ

# グローバルを汚さないHanami環境の立ち上げ

## About

rbenv-binstubの使い方とhanamiをプロジェクトごとで分割するための備忘録として:pencil2:

## Requirement

- bundler
- rbenv-binstubs(おすすめ)

## Operation

### Init project (file)

```sh:shell
mkdir project && cd project
bundle init
```

```ruby:Gemfile
source 'https://rubygems.org'

gem 'hanami'
```

### Installation

```sh:shell
# install with binstubs
bundle install --path=vendor/bundle --binstubs=/vendor/bin

# or not
bundle install --path=vendor/bundle
```

### Create & Run app

```sh:shell
hanami new yourapp
mv yourapp/* ./ && mv yourapp/.* ./
rm -rf yourapp
bundle update
```

```sh:shell
# if set binstubs
hanami s

# or not
bundle exec hanami s
```

---

## アプリケーション作成について

Create & Run app における以下のコマンド

```sh:shell
hanami new yourapp
mv yourapp/* ./ && mv yourapp/.* ./
```

は、`rails new .`のような動作をHanamiで同様に`hanami new .`とするとうまくいかない（[参考1](https://github.com/hanami/hanami/issues/936), [参考2](https://github.com/hanami/hanami/issues/736)）ので、ファイル移動にて無理やり同等の動作を実現します（project と yourappで違ってるけど）。

`.git`など`.`から始まるファイル・ディレクトリをワイルドカード`*`で指定させるためには

```sh:zsh
# zsh
setopt -s dotglob

# bash
shopt -s dotglob
```

を行うと

```sh:shell
mv yourapp/* ./
```

のように簡素に書くことができます。

## 参考

[bundle exec はもういやだ](https://qiita.com/circled9/items/1a3c6c38ee40de4cf5e3)
[How can I get mv (or the * wildcard) to move hidden files?](https://askubuntu.com/questions/259383/how-can-i-get-mv-or-the-wildcard-to-move-hidden-files/399632?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa)
[shopt command in zsh](https://www.linuxquestions.org/questions/linux-software-2/shopt-command-in-zsh-446255/)
最強しつけアプリを作った

## 自己紹介
1児の父です。
子供が3歳になりました。
最近子供に好かれていてとても楽しい日々を過ごしています。
でも、大変なこともいろいろある。

----
## 子育ては大変1
こどもがなかなか寝ない。

お父さんが帰ってくると興奮して寝てくれないんです。

----
## 子育ては大変2
子供がうんちをしてくれない！！！

これが一番深刻。1週間うんちをしてくれない。
↓
するときは硬すぎて痛い。
↓
我慢する

----
## 対策
* [鬼から電話](https://www.youtube.com/watch?v=zXgkW1zvW1U&feature=youtu.be&t=67s)

----
## 結果
* 怖がりすぎてヤバイ。
* トラウマレベル。

----
## なければ作ればいいじゃない
* [しつけアプリ(鳩時計)](https://rico-clock.arukascloud.io/)作った
* カッコウが鳴く
   * 1時間に時刻の数だけ
   * 30分に1回
* 夜の10時になると、「鬼が来るぞ」ってしゃべる
* 任意のテキストや鬼の声もしゃべる
* 天気も見える

----
## なぜ鳩時計？
* 時間を気にしてほしかった
* 興味を持たせたかった
* カッコウなので怖すぎない

----
## アーキテクチャ
<img src="https://docs.google.com/drawings/d/e/2PACX-1vQ4exaLiXb0v9gA_fbNDBHN660w4moNbdMiX5IetuU7-WuWacBqQ_zjpZfKJOyUNc_f3gw1KTLn9DKy/pub?w=960&amp;h=720">

----
## 利用技術
* フロントエンド
    * View:[vue.js](https://jp.vuejs.org/index.html)
    * サウンド:[howlerjs](https://howlerjs.com/)
* バックエンド
    * Docker Container: [Arukas](https://arukas.io/)
    * 言語: [node.js](https://nodejs.org/ja/)
    * サーバプッシュ: [socket.io](https://socket.io/)
* API
    * テキスト読上: [Amazon Polly](https://aws.amazon.com/jp/polly/)
    * 天気API: [Dark Sky API](https://darksky.net/dev)

----
## Vue.jsについて
勉強のために利用してみたが、あまりにもライトな利用だったために、あまりためにならなかった。

----
## Webアプリ故に気をつける部分
* 音声再生
    * [ユーザインタラクションでないと再生できない](https://qiita.com/uupaa/items/e5856e3cb2a9fc8c5507#ios-safari-%E3%81%AE%E5%88%B6%E9%99%90%E3%81%8A%E3%81%95%E3%82%89%E3%81%84)
    * 初期状態で音は無効状態にしておくことで回避
* アプリっぽく表示するためホームスクリーンに追加
    * [apple-mobile-web-app-capable](http://www.gl0ssy.net/apple-mobile-web-app-capable/)をつけてアドレスバー非表示
    * プロセスがブラウザから独立
* 画面がスリープしてしまう
    * iPadの設定でスリープしないように

----
## ちょっと脱線。PWAについて
PWAがあればアプリいらないんじゃない？

* AppleStoreを経由せずに配布可能
* ServiceWorkerでオフラインでも利用可能
* でもやっぱりiOSで通知ができない（そりゃそうだよね）

----
## Arukasの特徴
* 純日本製のさくらインターネットが運営
* 1コンテナまで無償で利用可能
* Docker HUBに登録してあるイメージを利用可
* 再起動するとhttpに繋がらなくなることがある
    * 何回か再起動するとなおる

----
## Amazon Polly
音声の取得は至って簡単

```javascript
    socket.on('speak', async (params) => {
        const speechParams = {
            OutputFormat: 'mp3',
            VoiceId: params.speaker,
            Text: params.text,
            SampleRate: '22050',
            TextType: 'text'
        };

        let polly = new aws.Polly({apiVersion: '2016-06-10',region:'ap-northeast-1'});
        const data = await polly.synthesizeSpeech(speechParams).promise();
        io.emit('receivePolly', data);
    });
```

socket.ioを通してのクライアントサイドでの再生は一工夫が必要。
ArrayBufferはそのまま再生できないので一度base64で変換してから再生する。

```javascript
const socket = io();
socket.on('receivePolly', (data) => {
  // array bufferなのでbase64に変換
  howlSource = ["data:audio/mp3;base64," + base64ArrayBuffer(data.AudioStream)];
  const snd = new Howl({
    src: howlSource,
  });
  snd.play();
});
```

----
## 天気API
フリーで使える天気予報APIはいくつかあるがその中でDarkSky.netのものを利用。
理由: ググったら上に出てきたから。

----
## まとめ
Webアプリでも役に立つアプリを作れます。
子育てでもアプリを作ろう！
railsで検索フォームを作ろう！！

Railsで検索フォームを作りましょう。
個人的には、下記の記事を参考にしました。わかりやすいと思います。

Ruby on Rails 検索機能拡張 (railsチュートリアル) https://qiita.com/mochikichi321/items/5c9630c5d87b47130942

検索の流れについて
1.検索formの表示
2.formにて検索ワードを入力(ユーザーが入力する)
3.formから検索ワードを受け取る(Controller)
4.Controller(とModelを使い)で、検索ワードを含むデータを出力。
5.そのデータをViewに渡す。

以上が検索の流れです。
思っていたよりはかなり単純ですね。では、実際の流れについて見ていきます。

### 1.検索formの表示 



```erb:search.html.erb
<p>検索</p>
<%= form_tag(search_path,:method => 'get') do %>
  <%= text_field_tag :search %>
  <%= submit_tag 'Search', :name => nil %>
<% end %>
```

上記が検索フォームとなります。
ポイントは

 - form_tagを使う
 - methodをgetにする
 
form_tagはDBの変更に関わらない時に使うものです。
詳しくはこちらを参照ください。https://arrown-blog.com/rails-formfor-formtag/

methodはgetにしておくこと。検索フォームでは、検索結果がすぐ表示された方がいいので(当然ですが)、methodはgetにしておきましょう。

### 2.formにて検索ワードを渡す(ユーザーが検索する)
これは勝手にユーザーが行ってくれますね。

### 3.formから検索ワードを受け取る(Controller)
`(params[:search])`で検索フォームに入力したものを受け取ります。

### 4.Controller(とModelを使い)で、検索ワードを含むデータを出力。

メイン処理

```ruby:posts_controller.rb
  def search
    #Viewのformで取得したパラメータをモデルに渡す
    @posts = Post.search(params[:search])
  end
```
searchメソッドの定義

```ruby:post.rb
    def self.search(search)
      return Post.all unless search
      Post.where(['content LIKE ?', "%#{search}%"])
    end
```

上記が少しわかりにくい人は下の書き方でもOKです！

```ruby:post.rb
    def self.search(search)
      if search
        Post.where(['content LIKE ?', "%#{search}%"])
      else
        Post.all
      end
    end
```

上記が4の処理です。
メイン処理から説明すると、searchメソッドを使って@postsを出力します。
しかし、searchメソッドを定義しなくてはいけません。ここはモデルに書いていきます。
基本的には、検索というのは whereメソッドを使います。find_byメソッドと似ていますが、whereメソッドは条件にあるものすべてを取得してくるメソッドです。
where(['content LIKE ?', "%#{search}%"])の contentとはPostモデル(データベース)のプロパティです。ここはSQLを学ぶとしっくりくるかと思います。

ちなみに検索ワードがない時（空検索の時)は、全データを持ってくるようにしました。

### 5.そのデータをViewに渡す。
最後です。あとは、@postsをViewに描くだけですね。

```erb:search.html.erb
<p>検索</p>
<%= form_tag(search_path,:method => 'get') do %>
  <%= text_field_tag :search %>
  <%= submit_tag 'Search', :name => nil %>
<% end %>

<ul><% @posts.each do |post| %>
  <li>
    <%= link_to post.title, post %>
    <%= post.created_at %>
    <%= post.status %>
  </li>
  <%= link_to "編集",edit_post_path(post) %>
  <%= link_to "削除",post, method: :delete %>
  <% end %>
</ul>
```

先ほどの検索フォーム部分に加えて、検索結果の表示部分も加えました。
インテンドとかぐちゃぐちゃかもですが、見落としてください笑。
あとは、 <%= render @posts %>とかでリファクタリングすると見やすくなるかと思います。ただ私同じぐらいの初心者向けに書いたので、それは次のSTEPということで。

以上で、検索フォームの実装は終了です。
読んでいただきありがとうございました。
プレゼンテーションの概要（軽）

授業でした内容を自分のメモとして書き残します。

---

2018/05/28（月）午後の授業内容

1 ) [プロジェクトの目的](https://qiita.com/112231/items/9859291a1c93af5032fa)
2 ) [カスタマージャーニーの目的](https://qiita.com/112231/items/20569e2e8202229b3c8e)

---

■ プレゼンテーションの概要

今回は、

・ PowerPoint
・ [prott](https://prottapp.com/ja/) で作成したプロトタイピング

を利用し、プレゼンテーションのための資料を作成する


■ PowerPoint 作成

大体、8枚程度のスライドを作成する
以下各スライドの内容

1. 表紙<br>
取り組んだテーマなど
2. ターゲット<br>
今回のターゲットを詳しく説明<br>
（ ペルソナ設定 ）
3. カスタマージャーニーマップ<br>
ターゲットが進路を決定するまでの流れを説明
（ カスタマージャーニーマップ ）
4. 問題抽出<br>
カスタマージャーニーマップからポイントを決定し、問題やニーズを抽出する
5. 解決案<br>
4 であげた問題を解決するポイントを明記
6. セールスポイント<br>
他のサービスと比べ、勝っている点を強調
7. 成果目標
8. プロトタイプの説明


〇 作成時のポイント

・ 文字を大きくする、文字だらけにしない
・ 誤字脱字に注意する
・ 内容は正しく


■ プレゼンテーションのフェーズ

プレゼンテーション全体の流れを知っておく


1. テーマ、問題提起
2. 結論<br>
・ 解決案<br>
・ プロダクト
3. 根拠、理由<br>
・ データ<br>
・ ターゲット、ペルソナ<br>
・ ジャーニーマップ<br>
・ 時代洞察<br>
・ 現状認識<br>
・ 他サービスとの比較<br>
・ アンケート　等

---

最後までお読みいただきありがとうございました。
jestで同一ファイル内でexportされた関数をテストしたい

jestの使い方でかなり詰まっていた箇所のメモです。jestのバージョンは23です。

同一ファイルに複数のexportがありかつ一つがWrapperとしているような構成のモジュールをテストしたい場合のお話。

例えば

exModule

```
export const hoge = () => {
 console.log('huga');
}

export const fuga = () => {
 hoge();
}
```

というようなモジュールをテストする場合、`hoge`がコールされるかテストするため 下記のようなモックを作ってみてテストしてみた。

__mocks__/exModule

```
export const hoge = jest.fn();

export const fuga = requre.requireActual('../exModule')
```

テスト（所々省いて書いてます）

```
import * as module from 'exModule'l;

jest.mock('exModule');

module.fuga();

expect(module.hoge).toBeCalled(); //通ることを期待

```

module.hogeが呼ばれない。どうも同じファイルでexportされているものはモックされないらしい。

だいぶ長い間悩んだ結果、以下の方法にたどり着いた。
https://stackoverflow.com/questions/45111198/how-to-mock-functions-in-the-same-module-using-jest

mockを作らず　`jest.spyOn` を使う、だと！

先のモックのコードは捨てて、以下のようにテスト書き直し。

```
const mockHoge = jest.spyOn(module, 'hoge');
module.fuga()
expect(mockHoge).toBeCalled();
```

しかし、これだけではダメだった。。。
いろいろ試した結果、元のコードを以下のようにしたら通った。

```
export const hoge = () => {
 console.log('huga');
}

export const fuga = () => {
 exports.hoge();
}
```

` exports ` をつけて明示的にしたところ動きました。

結構トリッキーにテストを書かざる得ないのが辛いです。でも結構クリティカルな事案だし、そもそも「ファイル構成構造変えろよ」というのがもっともな意見。jestはall in oneなテストフレームワークなので便利な方だなと。フロントエンドでもテスト大事！
UE4でC++の新規プロジェクト作成時にlambda captureのエラーが発生する


# 現象
UnrealEngine4のチュートリアルを進めようとしたところ
プロジェクトの新規作成時にいきなり表題のエラーでつまずいてしまったので
回避方法を残しておきます。

# 開発環境
- MacBook Pro (Early 2015)
- Unreal Engine 4.18.3
- Xcode Version 9.3.1 (9E501)

# エラー内容

```terminal
プロジェクトがコンパイルできませんでした。Xcode で開きますか？

Running Mono...

Setting up Mono
/Users/Shared/Epic Games/UE_4.18/Engine /Users/Shared/Epic Games/UE_4.18/Engine/Binaries/Mac
@progress push 5%
Parsing headers for BatteryCollectorEditor
  Running UnrealHeaderTool "/Users/******/GitHub/BatteryCollector/BatteryCollector.uproject" "/Users/******/GitHub/BatteryCollector/Intermediate/Build/Mac/BatteryCollectorEditor/Development/BatteryCollectorEditor.uhtmanifest" -LogCmds="loginit warning, logexit warning, logdatabase error" -Unattended -WarningsAsErrors -installed
Reflection code generated for BatteryCollectorEditor in 14.819749 seconds
@progress pop
Performing 8 actions (4 in parallel)
[1/8] Compile SharedPCH.Engine.h
In file included from /Users/Shared/Epic Games/UE_4.18/Engine/Intermediate/Build/Mac/UE4Editor/Development/Engine/SharedPCH.Engine.h:138:
In file included from /Users/Shared/Epic Games/UE_4.18/Engine/Source/Runtime/Engine/Public/EngineSharedPCH.h:300:
Runtime/CoreUObject/Public/UObject/UnrealType.h:3285:37: error: lambda capture 'LocalMapLayoutForCapture' is not used [-Werror,-Wunused-lambda-capture]
                        [LocalKeyPropForCapture, KeyPtr, LocalMapLayoutForCapture](void* NewElementKey)
                                                         ^
Runtime/CoreUObject/Public/UObject/UnrealType.h:3298:41: error: lambda capture 'LocalMapLayoutForCapture' is not used [-Werror,-Wunused-lambda-capture]
                        [LocalValuePropForCapture, ValuePtr, LocalMapLayoutForCapture](void* NewElementValue)
                                                             ^
Runtime/CoreUObject/Public/UObject/UnrealType.h:3808:47: error: lambda capture 'LocalSetLayoutForCapture' is not used [-Werror,-Wunused-lambda-capture]
                        [LocalElementPropForCapture, ElementToAdd, LocalSetLayoutForCapture](void* NewElement)
                                                                   ^
3 errors generated.
ERROR: UBT ERROR: Failed to produce item: /Users/******/GitHub/BatteryCollector/Binaries/Mac/UE4Editor-BatteryCollector.dylib
Total build time: 43.13 seconds (Local executor: 0.00 seconds)
```

# 回避方法

[公式フォーラム](https://answers.unrealengine.com/questions/779733/xcode-build-errors-lambda-capturenot-used.html?sort=oldest)で同様の現象について言及されていました。

(1) MacToolChain.csに下記の一行を加える
`/Users/Shared/Epic Games/UE_4.18/Engine/Source/Programs/UnrealBuildTool/Platform/Mac/MacToolChain.cs`

```C#:MacToolChain.cs
	Result += " -Wno-unused-value";          // この一行の下に
	Result += " -Wno-unused-lambda-capture"; // 追加
```

(2) terminalからリビルトする
 
```terminal
$ cd /Users/Shared/Epic Games/UE_4.18/Engine/Source/Programs/UnrealBuildTool/

$ xbuild UnrealBuildTool.csproj
```

以上で改善しました。
Azure Cosmos DBの不満なこと

## こんな人に向けた記事

Azure Cosmos DBを使って踏むだろう地雷を事前に知りたい人向け。

## Cosmos DBの現在の仕様で不満なこと（2018/5末時点）
Cosmos DBの中の人に伝えるために作成したメモ。

### コンテナー セットの価格が高すぎる
課金単位を「コンテナー」ではなく「データベース」にした場合の最少スループットが50K RU（約36.8万円＝$3,700+）と高額である。
開発環境を複数立てて検証しなければいけない、といった事情もあり、私が提案する案件のほとんどのケースで採用を見送ることになる。本当は使いたい。

性能的な意味で比較対象としてSQL DatabaseのP1シリーズがあるが、¥57,743/月=$580+ と、半額以下の価格で良好な性能な機能が利用できてしまう。

上記の理由で、１つのコレクションを設計上の工夫で汎用的に使いまわすしか費用を下げる手立てがない。
「汚い」設計をせざるえないため、せっかくのCosmosDBの利点を生かし切れない。

### データサイズ「固定」「無制限」の設定が、コレクションCreate時にわかりにくい
APIでコレクション作成時、RU設定が2500以上以下で制御されている。
ポータルから手でコレクションを作成する場合は困らないが、C#からプログラムで指定する場合、具体的に RU=1000、DataSize=Unlimited という指定を行いたいが今はできないのでRU＝2500で指定してコレクション作成してから、わざわざポータルでRU=1000に手で変更している。
そしてRU下げ忘れて、あとで怒られるところまでがセット。

### データサイズ「固定」から「無制限」にアップグレードできない
利用頻度は少ないがデータ量がある場合、最初はFIXED=10GBで利用しておき、大きくなった際にUnlimitedに移行する、といった利用法ができない。
git

git fetch origin
git reset --hard origin/master

* gitリポジトリ作成

cd xxxxxxxx.git
git --bare init --shared

C:\git> git config --global user.email xxxxxx@xxxxxx"
C:\git> git config --global user.name "xxxxxx"

C:\git>git init
Initialized empty Git repository in C:/git/.git/
C:\git> git remote add origin /c/xxxxxxxx.git

C:\git>git remote -v
origin  /c/xxxxxxxx.git (fetch)
origin  /c/xxxxxxxx.git (push)
`
クラスの宣言、設定データの目的

今日はクラスの宣言、データの処理をやった。
そもそもクラスとは何か？
他の型、メソッド、およびイベントの変数をまとめてグループ化することで独自のカスタム型を作成できる構成要素です。 クラスは設計図に似ています。 型の動作とデータを定義します。 クラスが static と宣言されていない場合、クライアント コードはそのクラスの "インスタンス" を作成できます。 これらのインスタンスは、変数に割り当てられる "オブジェクト" です。 クラスのインスタンスは、その変数への参照がすべてスコープ外になるまで、メモリ内に保持されます。 すべてスコープ外になったとき、CLR により、ガベージ コレクションの対象となるようにマークされます。 クラスが static として宣言されている場合は、インスタンスを作成できず、クライアント コードはクラス自体を介してのみクラスにアクセスできます。

クラスの宣言
クラスは、次の例に示すように、class キーワードを使用して宣言します。
C#

コピー
public class Customer
{
   // Fields, properties, methods and events go here...
}
class キーワードは、アクセス レベルの後に配置します。 この例では、public が使用されているため、誰でもこのクラスのインスタンスを作成できます。 class キーワードの後にクラスの名前を記述します。 定義の残りの部分がクラス本体で、そこで動作とデータを定義します。 クラスのフィールド、プロパティ、メソッド、およびイベントはクラス メンバーと総称されます。

<h1>設定データの目的</h1>
設定データとは何か？
アプリケーションの動作に関わる基本的な情報を指します。これらを集中管理しておいて、必要に応じて値を変更することで、プログラムを直接変更することなくアプリケーションの挙動や見た目などを変更することができます。
merge commitをrevertする方法


git revertする時に、
revert元がmerge commitだった場合の対応メモ。


エラーメッセージ

```
error: commit コミットID is a merge but no -m option was given.
```

-mオプションが指定されていません。との事。


revert元がmerge commitだった場合、
-mオプションを使ってマージ元を指定してあげる必要がある。

まずはgit show、もしくはgit logでmerge commitの確認

```
Merge: コミットID コミットID
```

左のコミットIDが1、右が2となる。
これを使ってrevertの際に-mオプションで数字を指定する。

```
git revert -m 1 コミットID
```

これで無事revert出来ました。

おわり。

##コミットを元に戻したい時に注意したい事
reset、revert、rebaseは名前が似ていて間違えやすいので、注意！
resetはログごと消えるので履歴が残らず、
rebaseは履歴が改変、一本化されてしまう。
UnityPackageManagerで導入したパッケージにパッチを当てる方法

# はじめに

Unity Package Manager(UPM)で導入したパッケージを直接弄りたかったので、方法を調べてみました。

## 関連記事

- [Unity Package Managerについて](https://qiita.com/k7a/items/cc5d09bc1000551b203f)

# 方法

UPMでインストールしたパッケージは通常マシン上のグローバルな場所にインストールされますが、**`Packages`ディレクトリ以下にパッケージを配置することで、そのパッケージを優先的に利用することが可能**なようです。
これを利用することで、UPMで導入したパッケージのソースコードに独自に手を入れることが可能です。

## 手順

1. パッケージをインストールする
2. インストールされたパッケージを複製する
3. 複製したものを`<project directory>/Packages` 以下に配置する
4. 配置したものをよしなに編集する

## パッケージのインストール先について

PackageManagerでインストールされたパッケージは以下の場所に配置されています。

- Mac: `/Users/<your usrname>/Library/Unity/cache/packages`
- Windows: `C:\ProgramData\Unity\cache\packages`

ここにあるパッケージをディレクトリごとPackages以下に複製すれば良いです。

## ローカルにインストールしたパッケージと依存関係について

パッケージの依存関係の解決は、以下のように行われるようです。

1. `<project directory>/Packages` 以下に該当するパッケージが存在する場合、それを用いる
2. 1.が該当しない場合、マシン上のグローバルな場所に既にインストール済みの場合、それを用いる
3. 2.が該当しない場合、リポジトリからパッケージDLし、グローバルな場所にインストールし、それを用いる

例えば `com.unity.addressables@0.0.22-preview` は以下の依存関係を持っていますが、

```package.json
"dependencies": {
	"com.unity.resourcemanager": "2.0.16-preview",
	"com.unity.scriptablebuildpipeline": "0.0.14-preview"
}
```

ResourceManagerだけを弄りたいという場合は、全てのパッケージをローカルに配置する必要ななく、ResourceManagerのパッケージだけをローカルに配置すれば良いです。

# 参考リンク

- [How to move packages to an offline installation? \- Unity Forum](https://forum.unity.com/threads/how-to-move-packages-to-an-offline-installation.529318/#post-3480715)

> Copying packages under the Packages folder is what we call *embedding* a package. This feature is not officially supported and has some limitations and potential bugs. Use with caution. This will officially be supported in 2018.3 (if everything goes well).

この機能は暫定的な機能で、2018.3で正式サポート予定とのこと。

- [\(How\) can you apply patches to packaged assets? \- Unity Forum](https://forum.unity.com/threads/how-can-you-apply-patches-to-packaged-assets.531795/)
- [UPM: How to make a custom package](https://gist.github.com/LotteMakesStuff/6e02e0ea303030517a071a1c81eb016e)

manifest.jsonにはローカルの場所も記載できるという話。

また、コメントを読んでいくと、下の方でUnityの中の人が

> Git URL will be supported at some point in the future. I cannot give an ETA though :)

と言っているので、npmみたいにgitのリポジトリ指定も将来的にできるようになりそう。これができるようになれば、パッチはforkしたGithubのリポジトリを使うのが良さそうですね。
C#プログラミング

※自分のメモ用に書いています
環境:windows10 VisualStudio2012
前回からの続き
最初に一ヶ月分のデータを保管・提供するクラスを作成する。
クラスを作成し使用する名前空間のインポートと別名設定
変数宣言とコンストラクター宣言、最新状態にするメソッド宣言を行い、
プロパティの実装をこのクラスでは行い
その後イベントハンドラーを使用するための名前空間のインポートと
イベントハンドラーを追加している。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/d8ff4b7a-9839-58ab-6d24-6acc5e63a808.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/ed597df4-d97b-20e3-7145-f6ea1dadcfbc.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/29742629-bb88-4279-847d-c797d9526be8.png)
次にインスタンスの生成プロパティの提供するクラスを作成する。
初めに使用する空間のインポートと静的クラス宣言、
インスタンスを生成するメソッドの記入を行う。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/9ceace9b-f699-9e51-a546-43ddbac2dae5.png)
次に忘れていた設定とタイプミスの修正をしておく。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/3cdcaaa1-f1d5-62dd-01ef-6eaff7fdfd33.png)
次に設定データの準備とそのデータを使用する構文の手直しを行う。
型はそれぞれで使用するものでスコープはアプリケーションにしておく。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/e43c8ade-4092-4b56-6d72-9fab782d684a.png)
次にこの先必要になるEntityFrameworkをインストールする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/70256c5a-4077-6170-45b9-2360f42b0fd9.png)
次にコードファーストを使用のための準備をする。
使用する空間のインポートと継承を行う
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/29524434-6343-ed3d-bcf3-5814988cd963.png)
設定画面で接続文字列を作成する。
設定で型を接続文字列を選択し、スコープをアプリケーションにする。
データソースので先ほどインストールしたのを使用する。
ファイルをソリューションを保存している場所に置いておく
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/ede46f40-1c52-6f00-22f5-0d5453bf53c2.png)
次に接続文字列の設定を変更するためにApp.configを開いて
接続文字列の設定が書いてある部分を探し名前部分を変更する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/8c7440aa-98c8-ebe3-9099-8c54969ee796.png)
次にデータベース作成されるかどうかの確認のためのコードを入力してチェックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/1e02ff65-ea9a-5f4d-61e5-b4c38a10b2e1.png)
~~失敗したので次回に修正する。~~
【Laravel】クエリビルダとORMの違い

Laravelを勉強していたら、クエリビルダとEloquent ORM(LaravelのORM)が出てきて、違いが分からなかったので調べて見た。

#クエリビルダとは
SQLのクエリ文を生成するために用意された一連のメソッド。
##使い方
productsテーブルのレコードを全件取得する場合
```DB::table('products')->get();```

#ORMとは
データベースとオブジェクトの間の橋渡しをしてくれる仕組みのこと。
##使い方
productsテーブルのレコードを全件取得する場合
```Product:all();```

#クエリビルダとORMの違い
クエリビルダとORMが決定的に違うのは「コレクションにまとめられているのは配列などではなく、モデルクラスのインスタンスである」という点、、、らしい。
コレクションとは、配列データを操作するための書きやすく使いやすいラッパーのこと。

##実際に見てみる
Laravelに用意されているtinkerを使って結果を見てみた。

**クエリビルダの出力結果**
<img width="482" alt="スクリーンショット 2018-05-30 15.50.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/246714/5aa97c0a-015d-ab54-b93d-74c9dee844f4.png">

**ORMの出力結果**
<img width="525" alt="スクリーンショット 2018-05-30 15.50.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/246714/ed9aa6af-19a5-636b-ccf1-181b7002ed5b.png">


クエリビルダの場合はコレクションの中に連想配列が入っており、ORMの場合はモデルクラスのインスタンスが入っているのがわかる。
てことは、ORMの場合は取得した結果をクラスのインスタンスとして扱うことができるので、DBの構造や連想配列を全く意識しないでゴニョゴニョできて便利。

ORMすごい。。。
AWS ソリューションアーキテクト試験当日の注意事項

###概要

AWS SAP試験当日の記事があまりなかったので忘れないうちに残しておきます。
受験中に少しトラブルがあったので、参考になればと

###受験会場

池袋の会場で受験しました。
住所では分かりにく事があるので、会場の企業名で場所を確認することをお勧めします。

池袋コミュニティカレッジの場合↓
http://www.pc-ikebukuro.jp/map/


###試験官とのやりとり

チャットで行います。英字キーボードのため日本語入力への切り替えは`+altでした。
日本語でのやりとりが可能でした。

###身分証明

運転免許証がないのでパスポート＋クレカで。
池袋会場の場合はリーダがモニタ下にあるので、パスポートを手で押さえて読み取らせます。
クレカはカメラがあるので、チャットでの指示に従い提示します。

###試験中の注意

悩んで頭を抱えていたら「手で顔や口を隠さないでください」とチャットで注意されました。気をつけましょう。

### トラブル

受験中3回、受験用のクライアントが動作を停止しました。
チャットでその旨を試験官に伝えるとリモート操作でクライアントを再起動してくれます。
逆にチャットで伝えない限り対応してもらえない可能性があります(10分待ったままの時もありました)。
トラブル時は早めにお伝えしましょう。

停止した時点で回答時間は停止するようなので、ロスはなかったです。
本番で止まってしまった場合は、その時点の残り時間を控えておくことをオススメします。

###トイレ

トイレ退席をチャットでお願いしましたが禁止と言われました。
クライアントの停止により1時間40分経過しさすがに体調悪くなったのでその旨伝えましたが、
やはりトイレ禁止と言われました。
そのあたりの運用は厳しくなっているのかもしれないです。

ちなみにクライアント停止して50分ほど何も試験官側のアクションがなかったのですが体調悪い旨伝えたタイミングですぐに再起動が始まりました。
考慮してくれたのかどうかは分かりませんが、、、

###終わりに

技術的な記事ではありませんが、どなたかの参考になれば良いかと。
以上です。
Node.jsをバージョンアップ

MacにインストールしているNode.jsのバージョンを上げる必要があり、ググっていたら、nodebrewというバージョン管理ツールを知りました。
こちらの記事を参考にしました。
https://qiita.com/sawapi/items/adfc11465d034f4f2cf9

PATHを通す時は、こちらを参考にしました。
https://qiita.com/nbkn/items/01a11392921119fa0153

私のシステムは、.bash_profileにPATHが記録されているので、最初にご紹介した記事の中にあるPATHの通し方ではできなかったので。
Railsで新しくテーブルをつくるときの手順メモ

## modelをつくる

```sh
$ bin/rails generate model Hoge

      invoke  active_record
      create    db/migrate/20180530064027_create_hoges.rb
      create    app/models/hoge.rb
      invoke    rspec
      create    spec/models/hoge_spec.rb
      invoke    factory_bot
      create    spec/factories/hoges.rb
```
modelをつくると、migrationとテスト（ここではspec）も自動で生成される。

## modelにリレーションを貼る

```ruby
class Hoge < ApplicationRecord
	belongs_to :fuga
	has_many :piyos // has_manyの場合は複数形(piyos)を使う

	validates :fuga_id
end
```

## rails consoleで確認する

```sh
$ rails c


// Hogeモデルのオブジェクトを生成する
h = Hoge.new

id: nil,
fuga_id: nil


// Hogeモデルのオブジェクトからpiyoメソッドを呼び出す（今は空の状態）
h.piyos
=> []
```
NativeScriptで、未定義の外部Javaクラスをextendsして新しいクラスを作る

NativeScriptでAndroidのSDKに含まれていない外部Javaクラスを使う方法は前に述べましたが、今回は、外部のJavaクラスをextendsして新しいクラスを作る方法になります。

たとえば、`com.socdm.d.adgeneration.ADGListener` というパッケージのクラスを基底クラスとして `AdListener` という新しいクラスを作るときのことを考えてみましょう。

まず以下のような記述をおこないます。

```ts
declare let com:any;
```
comパッケージをany型で宣言しています。これは、TypeScriptで`com.socdm.d.adgeneration.ADGListener`をコンパイルエラーにさせないために必要です。

次に以下のように書きます。

```ts
class AdListener extends com.socdm.d.adgeneration.ADGListener {

			onReceiveAd() {
				console.log("onReceiveAd");
			}

			constructor(){
				super(); // ここでエラー！
				return global.__native(this);
			}
}
```

通常はこれで完成。なのですが...`super();` の行で、下記のようなエラーが発生します。

```
 TS2346: Call target does not contain any signatures
```

これは、super() で呼ぶ先の親のコンストラクタに関する情報が全く無いから、呼べないよ！ということになります。any型なんだから、とにかく呼んでくれよ！と思うわけですが、どうやらコンストラクタについては引数や戻り値の最低限の定義が必要なようです。

そこで以下のようにextendsのあとを書き換えます。

```ts
class AdListener extends (com.socdm.d.adgeneration.ADGListener as { new(): any; }) {

			onReceiveAd() {
				console.log("onReceiveAd");
			}

			constructor(){
				super();
				return global.__native(this);
			}
}
```

{ new(): any; }　の部分で コンストラクタの形を定義しています。引数なしで、戻り値はany型である、という定義をしていますね。これでコンパイルが通るようになります。

# 参考
https://github.com/Microsoft/TypeScript/issues/17032
コツコツCodilityの挑戦

#Codilityとは
[Codility](https://www.codility.com/)はオンラインプログラミング試験とも言われており、オンライン上で時間内に与えられた問題を解くとスコアリングされるものです。

【対応言語】
C,C++,C#,Go,Java,JavaScript,Lua,Object
ive-C,Pascal,PHP,Peal,Python,Ruby,Scala,Swift 2,Swift 3,VB.NET


#Codilityの挑戦
1年くらい全然コードを書いてなかったが、短期一本集中してC++でCodilityに挑戦
「PAINLESS」からしっかり向き合います。

#Codilityの問題について
Codilityは、Lesson1からLesson17まであり、それぞれテーマがある。
各Lessonは1～4問程度あり、「PAINLESS」「RESPECTABLE」「AMBITIOUS」と難易度が分れている。

#Codilityの各Lessonと問題
**Lesson 1: Iterations**
-[[Painless] BinaryGap](https://qiita.com/divaco5/items/4469e333c6ba7e83827a) 　6/1update

**Lesson 2: Arrays**
- [[Painless] OddOccurrencesInArray](https://qiita.com/divaco5/items/e1cbc466211902514267) 6/3update
- [[Painless] CyclicRotation](https://qiita.com/divaco5/items/e14d7363386f0907e01b) 6/2update

**Lesson 3: Time Complexity**
-[[Painless] PermMissingElem](https://qiita.com/divaco5/items/b41caf66825923853b8e) 6/4update
-[[Painless] FrogJmp](https://qiita.com/divaco5/items/c522b442c6b55309a01f) 6/4update
-[[Painless] TapeEquilibrium](https://qiita.com/divaco5/items/9b23e936a70a7ee08a2b) 6/5update

**Lesson 4: Counting Elements**
-[[Painless] PermCheck](https://qiita.com/divaco5/items/1769ced2d93a125a0cc0) 6/6update
-[Painless] FrogRiverOne
-[[Painless] MissingInteger](https://qiita.com/divaco5/items/46b1123c880f5abc1bc9)7/6update
-[Respectable] MaxCounters

**Lesson 5: Prefix Sums**
-[Painless] CountDiv
-[Painless] PassingCars
-[Respectable] GenomicRangeQuery
-[Respectable] MinAvgTwoSlice

**Lesson 6: Sorting**
-[Painless] Distinct
-[Painless] Triangle
-[Painless] MaxProductOfThree
-[Respectable] NumberOfDiscIntersections

**Lesson 7: Stacks and Queues**
-[Painless] StoneWall
-[Painless] Brackets
-[Painless] Nesting
-[Painless] Fish

**Lesson 8: Leader**
-[Painless] Equileader
-[Painless] Dominator

**Lesson 9: Maximum slice problem**
-[Painless] MaxDoubleSliceSum
-[Painless] MaxSliceSum
-[Painless] MaxProfit

**Lesson 10: Prime and composite numbers**
-[Painless] MinPerimeterRectangle
-[Painless] CountFactors
-[Respectable] Peaks
-[Respectable] Flags

**Lesson 11: Sieve of Eratosthenes**
-[Painless] CountSemiprimes
-[Respectable] CountNonDivisible

**Lesson 12: Euclidean algorithm**
-[Painless] ChocolatesByNumbers
-[Respectable] CommonPrimeDivisors

**Lesson 13: Fibonacci numbers**
-[Respectable] Ladder
-[Respectable] FibFrog

**Lesson 14: Binary search algorithm**
-[Respectable] MinMaxDivision
-[Respectable] NailingPlanks

**Lesson 15: Caterpillar method**
-[Painless] AbsDistinct
-[Painless] CountDistinctSlices
-[Painless] CountTriangles
-[Respectable] MinAbsSumOfTwo

**Lesson 16: Greedy algorithms**
-[Painless] MaxNonoverlappingSegments
-[Painless] TieRopes

**Lesson 17: Dynamic programming**
-[Respectable] NumberSolitaire
-[Ambitious] MinAbsSum
ソフトウェア業界が抱える黒歴史 - 製造の誤解と建築メタファー

# TL;DR

プログラミング、ソフトウェアエンジニアリングって本当はとてもとても楽しいです。

……のはずですが、過去、その楽しいはずのこの道を踏み外してしまった、大きな過ちがあったと思っているので、誰かが同じ過ちを繰り返さないためにも、過去に書かれた文献を見て真に受けてしまわないように。

なにが言いたかというと、いまだに一部のソフトウェアエンジニアは黒歴史から抜け出すことが出来ていない気がします。 あと、プログラミング教育とかも、同じ過ちを踏まないか大分気になってます。  ということで、誰かのお役に立てるのであれば、誰か共感してくれる人が一人でもいないか、とまとめてみました。

# 黒歴史を巻き起こした2大事件

ということでわたしが考えるソフトウェアの黒歴史を迎えることになった「２大事件」です。

## 1. "コーディング"を"製造"に置き換えてしまった

一般的に、システムでも製品でも建築でもなんであってもモノを作る場合には次のような工程をとります。

1. 要件定義（なにを作るかを決める - What）
2. 設計（どうやって作るかを決める - How）
3. 製造（実際に作る）

ソフトウェアという新たな分野が出てきたときにも、同じように、昔の偉人たちは、次のように考えました。

1. 要件定義
2. 設計
3. 製造 **← コーディング**

コーディングの位置がとても重要です。
ひょっとしたら今でもこういう考えを持ってる人がいるかもしれませんが、これは致命的な間違いです。

### **コーディング以前に、そもそも"製造"とは？**

与えらえた設計図や原材料にたいして、ものを作るのが製造。
原材料を加工して製品にすることです。 イメージとしては大量生産の工場ラインです。
誰が作っても同じものができあがるのが製造です。

### **"プログラミング" は "製造" ではない？**

ないです。
まったく違います。

設計工程のインプットを受けて、それを実際にソースコードにするためには、プログラマの様々な独創的なアイディアが入ります。 コーディングは、100人いたら100通りのソースコードが出てくる工程です。

> 以前に実験で、とても簡単な要件でプログラマ5名くらいに同じコーディングを依頼したことがあります。
> 結果としては、単純にコード量で比較しても5倍くらいの差はありました。 もちろんロジックも人それぞれ。 つまり、それくらいには独創的な世界です。

### **では... コーディングって何？ 製造って何？**

答えは明快で、"コーディング" は "設計" の一部です。 より厳密で詳細な設計です。 プロダクトの世界で言えば、CADを使った電気回路や金型の設計とかに近いものです。

では、ソフトウェアの世界における "製造" は何かといえば何かというと、例えばコンパイル、例えばリリースパッケージの作成です。これは基本的に誰がやっても同じものできるようになっていてる工程です。

決して、"コーディング"　は "製造" ではありません。

### **なにが黒歴史？**

"コーディング" を "製造" としてしまったせいで、"製造" → "誰がやっても一緒" → "人件費が安いところでやった方がいい" という構図ができあがってきたのだと思います。

その結果、ソフトウェアエンジニアは、誰がやっても一緒の結果になる簡単な作業をしているという理解が進み、だから設計をする人より格下、安く買いたたかれたり、そのための子請け孫請けの商売の乱立、という、黒歴史にまっしぐらです。


## 2. "建築"のメタファーを採用してしまった

これが2つの目の大きな問題です。

ソフトウェアというとても複雑な分野が出てきて、何か歴史上の今までの分野で似ているものを探そう、としました。 その分野のベストプラクティスを流用することでソフトウェアの世界もより良いものにしようという考え方です。

そこで "建築" というメタファーが選ばれました。

### **建築のメタファー**

決して全て悪いとは言いませんし、このメタファー(比喩)のおかげで様々な発展を遂げたのも事実です。

参考までに、建築のメタファーの結果生まれた言葉としては「アーキテクチャー（アーキテクト）」「デザインパターン」等、今のソフトウェア開発を決定づけた単語は建築のメタファーのおかげだと思います。

### **建築のメタファーの弊害**

ただ "建築" という概念に近づきすぎたせいで弊害が出てきます。

開発プロセスが、上流工程 → 下流工程 と別れること。 あわせて組織的な構造も クライアント → SI と流れ、実際の製造作業（建築作業）は下請けへ流すという、上流偏重の構造。 指揮系統もお金も。

建物を作るところまでを一つの仕事として、作った後にはメンテナンス会社への受け渡すという構造。

最初にほぼ完璧な最終形を設計してから、工程にしたがっての計画的に作業していくという工程重視の作業手法。

> メタファー（比喩）は、とても優れた思考ツールですが、その反面、大きな欠点があります。
> あるメタファーを採用することで気づけなかった色々なことに気づくことが出来ますが、同時に、他の側面が見えづらくなってしまうのです。
> 「何かを見えるようにすることは、なにかを見えなくしている」ということです。

上にあげたような建築的な手法は、どれも、今のソフトウェア開発では似つかわしくないことです。

上流・下流なんて分ける必要はなく、考えた人がそのままプログラミングした方がよいです。 プログラミングしながら何か気づきを得たらそれを自分自身にFeedbackした方がいい。
ソフトウェアは、建築やハードウェアと違って、作った後もどんどんアップデートが可能なものです。
最初から、最終形なんてわかるわけがないし、そもそも最終形を最初に決める必要がない。建築物みたいに最初に決めておかないと手戻りが大変なものや、大量生産が必要なものであれば、最初に最終形態を作らないといけないですが、ソフトウェアはどんどん形が変わっていいもののはずです。

> 組み込みソフトとか、パッケージリリースするソフトウェアは、ちょっと話は別です。
> それは、ソフトウェアという文脈ではなく「プロダクト」という文脈での制約のためにソフトウェアの利点が使えなくなっている例です。

### **では、何のメタファーが良かったのか？**

結果論ですが、**何のメタファーも採用しない**のがよかったと思います。 または、もっと早くに建築のメタファーから抜け出せばよかったと思います。

プログラミング、ソフトウェア開発というのは、他の何にも似ていない、特殊な分野だと思います。

# さいごに

なにが言いたかったかというと、いまだに一部のソフトウェアエンジニアは黒歴史から抜け出すことが出来ていないです。 あと、プログラミング教育とかも、大分気になってます。 単なる安い労働力として製造工程を担うだけのプログラマが増えてしまったらとても悲しいことです。

せっかく楽しい世界に身を置いているのであれば、楽しくいきましょう。

そのためのきっかけか、誰かを説得するときの何かの材料になればいいかな、くらいの気持ちで書いておきました。

なにかお役に立てたり、１つでも共感できることあったら、いいね でも コメント でも足跡残していってくださいませ　m__m
Perfumeのモーションキャプチャデータで踊らせてみる


http://www.perfume-global.com/
こちらからDOWNLOADボタンを押し、
`BVH`と`SOUND`を取得する

## Blender -> Unity

- Blenderでbvhファイルをインポートする
- fbxファイルとしてエクスポートする
- Unityにfbxファイルをインポートする
- Animation TypeをHumanoidに変更

[![デモ動画](https://img.youtube.com/vi/jRzI7aA-kIg/0.jpg)](http://www.youtube.com/watch?v=jRzI7aA-kIg)

特に記事にする必要もなかったか...



> 参考
[Unity-CHANを躍らせる](http://shigekix5.wp.xdomain.jp/?p=485)
[UnityでPerfumeを踊らせる](http://nn-hokuson.hatenablog.com/entry/2016/07/21/212313)
【ほぼリンク集】ボクセルベースの3Dキャラ作成からVRChatにアップロードするまで


## 全体の流れ

MagicaVoxel -> Blender -> Unity

> 参考
[MagicVoxelを使って、うちの子を作ってUnityで動かした](http://bibinbaleo.hatenablog.com/entry/2017/09/11/122230)
[MagicaVoxel→Blender→Unityでボクセルモデルを動かす①](http://urkgdmp.hatenadiary.jp/entry/2016/07/19/151539)


## MagicaVoxel | キャラ作成

![スクリーンショット 2018-05-26 18.53.38.png](https://qiita-image-store.s3.amazonaws.com/0/136286/a5bd7544-4b02-6179-3401-78d86bce0a4d.png "スクリーンショット 2018-05-26 18.53.38.png")


> 参考
[【MagicaVoxel】お絵描き初心者でも簡単な３Dドット絵 - 使い方 -](http://megumisoft.hatenablog.com/entry/2015/09/16/230139)
[daishi blog](http://github.dev7.jp/b/tags/MagicaVoxel/)


## Blender | ボーンを入れる

Blenderではアーマチュアと呼ぶ

> 参考
[MagicaVoxelの3DモデルをBlenderに持っていく](http://b00.sakura.ne.jp/main/gamecreate/2015/10/25/post-130/)
[オリジナルアバターを簡単に作りたい人向けチュートリアル　リギング編](http://kumanoya.blogspot.jp/2017/12/blog-post_11.html)




## Blender | UV展開について

- MagicaVoxelのモデルを頂点カラーの情報を持っているply形式で出力する
- Blenderに取り込む
- 重複頂点を削除
- UV展開
- 頂点カラーをテクスチャにベイクする（テクスチャを保存）
- テクスチャをモデルに貼り、頂点カラー情報を削除

![uv_editing.png](https://qiita-image-store.s3.amazonaws.com/0/136286/0d4ef536-f2a5-a50b-2fd1-0df865e58f7e.png "uv_editing.png")

### UV展開なし
エッジが目立たずボクセル感がない

![no_edge.png](https://qiita-image-store.s3.amazonaws.com/0/136286/9cc87ffd-e6ab-b161-4b0e-527fd9ef5ca1.png "no_edge.png")

### UV展開あり
エッジが目立ってボクセル感がある

![スクリーンショット 2018-05-28 18.47.45.png](https://qiita-image-store.s3.amazonaws.com/0/136286/0753b77f-7120-90fb-d4fe-268df90a5684.png "スクリーンショット 2018-05-28 18.47.45.png")

> 参考
[MagicaVoxelで作ったデータの頂点数を減らす](http://github.dev7.jp/b/2016/07/16/mgopt/)
[かんたんBlender講座 テクスチャの適用](http://krlab.info.kochi-tech.ac.jp/kurihara/lecture/cg/BlenderWeb_Hayashi/html/materialAndTexture.html)




## Unity | アップロード

### VRChat

[アバターの作成](http://vrchatjp.playing.wiki/d/%A5%A2%A5%D0%A5%BF%A1%BC%A4%CE%BA%EE%C0%AE)
^こちらを参考に、問題があれば[Discord](http://vrchatjp.playing.wiki/)に入って質問する

### cluster.

[cluster. SDK ドキュメント](https://clustervr.gitbook.io/sdk/getting_started)
^こちらを参考に、問題があれば[Discord](https://clustervr.gitbook.io/sdk/community)に入って質問する
正規表現可視化サイト Regexper

# 正規表現可視化サイト([Regexper](https://regexper.com/ "Regexper"))

私は正規表現が苦手です。サル以下なのかもしれません。
[サルにもわかる正規表現入門](http://www.mnet.ne.jp/~nakama/ "サルにもわかる正規表現入門")

[Regexper](https://regexper.com/ "Regexper")は、正規表現を入力すると、チェックの流れを可視化してくれます。
以下はメールアドレスチェックの正規表現を可視化してみたの図
![Regexper.png](https://qiita-image-store.s3.amazonaws.com/0/182837/f317be83-f4c1-66d0-2fcd-f0ce5862f55a.png)


この図から読み取るに、

```
英数字記号が最低1文字あって、
@があって、
1文字英数字があって、
そのまま終わってもいいし、なんかいろいろ繰り返してもいいよ
```

っていう感じの正規表源であることがわかりました。なんとなく。

とにかく左から右までちゃんと通るルートが一つでもあれば`ture`,そうじゃなかったら`false`やで！ということです。