OmniAICreator/Qiita-1.07M huggingface dataset:
UnityでWindows Buildの時の引数を取得する方法

# UnityでWindows Buildの時の引数を取得する方法

必要に迫られたので忘備録

```csharp
using UnityEngine;
using System;

public class Init{

    [RuntimeInitializeOnLoadMethod]
    static void OnRuntimeMethodLoad()
    {
        string[] cmds = System.Environment.GetCommandLineArgs();
    }
}

```

これで cmdsに引数が入る  
（cmds[0]はコマンドそのものが入る)


### 応用

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using UnityEngine.UI;

public class Init :MonoBehaviour{

    static List<String> s = new List<string>();


    [RuntimeInitializeOnLoadMethod]
    static void OnRuntimeMethodLoad()
    {
        string[] cmds = System.Environment.GetCommandLineArgs();

        foreach(string cmd in cmds)
        {
            s.Add((cmd));
        }
    }

    private void Start()
    {
        Text t = GetComponent<Text>();
        if(t != null)
        {
            t.text = "";
            for(int i = 0; i < s.Count; i ++)
            {
                t.text += " " +s[i];
            }
        }
    }
}
```

適当にTextがあるUIを作ってそこに貼り付けてExeを作る  
作ったExeファイルのショートカットを作って、ショートカットのプロパティでリンク先に引数を追加する

![930cd84c25f6ca5a73b665f145fc1a05.png](https://qiita-image-store.s3.amazonaws.com/0/79067/22c18107-4bef-d422-fe84-ea0752741462.png)

実行すると

![63ced3816e2976d7654bb99dc05543cc.png](https://qiita-image-store.s3.amazonaws.com/0/79067/d43bb8b8-3ca8-0c69-7108-c496560d3f54.png)

引数取れました。
よく使うLinuxコマンドの備忘録

よく使うものを簡単なメモ書き。
覚えやすいように略語も併せて。



```bash:基本
#MANual: コマンドのhelp
$ man

#相対パス移動
$ cd ./Directry 

#LiSt: カレントディレクトリ下ファイルを一覧表示。cd → lsがまず覚える流れ。 
$ ls

#Print Work Directry:カレントディレクトリの絶対パス表示(パスワードではない)
$ pwd 

#Switch User(Substitute User): ユーザー切替
$ su ユーザー名 

#PASSWorD: パスワード設定
$ passwd ユーザー名 

#画面クリア
$ clear

#パス追加
$ export PATH=path:${PATH}
```

```bash:SSH系
#SSH
$ ssh -i "暗号鍵ファイル" ユーザー@接続先

#SCP
$ scp -i 暗号鍵ファイル ユーザー@接続先:path
```
　　

```bash:ファイル操作系
#Make DIRectry: ディレクトリ生成
$ mkdir hoge

#ReMove: ファイルを削除
$ rm hoge

#CoPy: CopyFromからCopyToへコピー
$ cp CopyFrom CopyTo

#CoPy: 上書きコピー
$ cp -r CopyFrom CopyTo

#CoPy: 全ファイル強制上書きコピー
$ \cp -f CopyFrom CopyFrom 

#Move: MoveFromからMoveToへ移動/ ファイル名変更
$ mv MoveFrom MoveTo

#ファイル名"*.txt"を検索
$ find . -name "*.txt"

#grep検索(行番号表示
$ grep -n 正規表現 パス

#ファイルがあればタイムスタンプ更新、なければ空ファイル生成
$ touch hoge

```
　　


```bash:ファイル閲覧
#conCATnate: ファイル内容を標準出力、複数ファイルなら連結して標準出力
$ cat hoge hogege

#先頭10行を標準出力
$ head

#末尾20行を標準出力(ログ監視)
$ tail -n 20 -F

#ファイルを一画面単位で閲覧(標準出力)
$ more

#ファイルを自由に閲覧(標準出力)
$ less

#T(2つに分岐): 標準出力とファイル出力
$ tee
```
　　

```bash:ファイル管理
#パーミッション確認
$ ll

#CHange MODe: 
#4:read, 2:write, 1:execute
#u+x → user + execute
$ chmod Mode hoge.txt

#CHange OWNer: ファイル所有者をOwnerNameへ変更
$ chown Owner hoge.txt

#CHange GRouP: ファイル所有グループをGroupNameへ変更
$ chgrp Group hoge

#LiNk(ハードリンク): iノード(ファイル情報を持たせたファイル)を共有。オブジェクトの参照渡しのイメージ。
$ ln aaa bbb    

#LiNk(シンボリックリンク): Windowsでいうショートカット。実体を消すと実体のないリンクになる。
$ ln -s aaa bbb 
```
　　
---
参考:
[基本的なコマンド集](https://rat.cis.k.hosei.ac.jp/article/linux/command.html)
[LPICよくある質問集第②回～コマンド由来編～その1](http://tech.pjin.jp/blog/2016/10/23/lpic%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E8%B3%AA%E5%95%8F%E9%9B%86%E7%AC%AC%E2%91%A1%E5%9B%9E%EF%BD%9E%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E7%94%B1%E6%9D%A5%E7%B7%A8%EF%BD%9E%E3%81%9D%E3%81%AE1/)
WordPressRelatedPostでpost以外の投稿タイプを表示する方法


案件で任意のおすすめ記事を表示が簡単にできるのにWordPressRelatedPostを使おうと思ったが、post以外表示されないので調べた。

以下ファイルの「'post'」部分を表示させたい投稿タイプに変更する。（||でも良かったかも）

recommendations.php
uploader.php。

無事に表示された！
Docker:STATUSがRestartingのコンテナをstopできなかった時の対処法

※CONTAINER ID、IMAGE、NAMESは実際の名前ではありません。
見やすさ、情報保護の観点で変更しております。


# つまづいたこと

今、起動中のコンテナが以下だとします。

```
hogepc$ docker ps
CONTAINER ID        IMAGE     COMMAND                  CREATED             STATUS                         PORTS                              NAMES
e925a1effaXX        hogehoge  "/bin/sh -c 'npm s..."   26 seconds ago      Up 40 seconds                  0.0.0.0:3000->3000/tcp             hogehoge_1
a3592697efXX        fugafuga  "/bin/sh -c '/go/b..."   28 seconds ago      Restarting (1) 6 seconds ago                                      fugafuga_1
f4833db08dXX        piyopiyo  "docker-entrypoint..."   2 minutes ago       Up 44 seconds                  3306/tcp                           piyopiyo_1
```

都合により、上記のfugafugaコンテナをstopする必要がありました。

```
hogepc$ docker stop a3592697efXX
a3592697efXX
```
コンテナIDが表示されたので、stopされたと思っていました。
ところが、docker psコマンドを打ってみたらまだいます。

```
hogepc$ docker ps
CONTAINER ID        IMAGE     COMMAND                  CREATED             STATUS                         PORTS                              NAMES
e925a1effaXX        hogehoge  "/bin/sh -c 'npm s..."   3 minutes ago      Up 57 seconds                  0.0.0.0:3000->3000/tcp             hogehoge_1
a3592697efXX        fugafuga  "/bin/sh -c '/go/b..."   3 minutes ago      Restarting (1) 22 seconds ago                                     fugafuga_1
f4833db08dXX        piyopiyo  "docker-entrypoint..."   6 minutes ago      Up 59 seconds                  3306/tcp                           piyopiyo_1
```

# 対処法

一度該当のコンテナをdocker startします。
その後、docker stopします。

```
hogepc$ docker start a3592697efXX
a3592697efXX
```

```
hogepc$ docker stop a3592697efXX
a3592697efXX
```

```
hogepc$ docker ps
CONTAINER ID        IMAGE     COMMAND                  CREATED             STATUS                         PORTS                              NAMES
e925a1effaXX        hogehoge  "/bin/sh -c 'npm s..."   3 minutes ago      Up 57 seconds                  0.0.0.0:3000->3000/tcp             hogehoge_1
f4833db08dXX        piyopiyo  "docker-entrypoint..."   6 minutes ago      Up 59 seconds                  3306/tcp                           piyopiyo_1
```

無事に消えました。
しかし、なぜ一度startしてからstopしたことでstopできたかについては
調べてもわかりませんでした。
もう少しDockerの仕組みを理解したいところです。
ProductFlavor、BuildType毎に出力されるAPKファイル名を変えたい（メモ）


# 概要

assembleコマンドで出力したAPKファイルが、渡した先で古いものとごっちゃにされてしまうことがまれによくあるので、出力時点でファイル名を変更してバージョンが一目でわかるようにしています。

参考：

* [buildType/productFlavorsでアプリ名を分ける方法 - Qiita](https://qiita.com/le_skamba/items/a95fc0ef12239a165dc7)
* [Android Gradle 3.0以上で出力するapkのファイル名を変更する - Qiita](https://qiita.com/yamacraft/items/301f188b2433f47669ee)

# Android Studio2系

特定のProductFlavorの全てのBuildTypeを一括で出力したり、逆に全てのProductFlavorの特定のBuildTypeを一括で出力したりすることも多いため、まとめてbuild/outputs/apkに出力するようにしています。

```groovy:build.gradle
android {
    /** 略 **/

    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            if (output.outputFile?.name?.endsWith('.apk')) {
                variant.productFlavors.each { productFlavor ->
                    // 出力ファイル名は「BuildTypeProductFlavor_versionName_versionCode.apk」
                    output.outputFile = new File(output.outputFile.parent,
                            variant.buildType.getName().capitalize() + productFlavor.name.capitalize() + '_' + variant.versionName + '_' + variant.versionCode + '.apk')
                }
            }
        }
    }
}

```

# Android Studio3系

output.outputFileが操作できないためAndroid Sutdio2系とは若干異なります。
そのままだとbuild/outputs/apk/productFlavor/buildTypeにそれぞれ出力されるため2階層上に出力する用に調整していますが、ちょっと気持ち悪さがあります…

```groovy:build.gradle
android {
    /** 略 **/

    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            if (outputFileName?.endsWith('.apk')) {
                variant.productFlavors.each { productFlavor ->
                    // 出力ファイル名は「BuildTypeProductFlavor_versionName_versionCode.apk」
                    outputFileName = '../../' + variant.buildType.getName().capitalize() + productFlavor.name.capitalize() + '_' + variant.versionName + '_' + variant.versionCode + '.apk'
                }
            }
        }
    }
}

```
[JAWS-UG 磐田] ELBの作成Application Load Balancer編

# ◆[JAWS-UG 磐田] ハンズオンの補足資料 ELB作成Application Load Balancer編 #1
### Application Load Balancer(ALB)を作成します。
#### **◆マネジメントコンソールを使用してALBを作成するには**
**１．**[Amazon ELBコンソール](https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#LoadBalancers:)を開きます。

- - -
**２．**[ロードバランサーの作成]をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/195995a8-a458-96e6-934f-e044275af6f6.png)

- - -
**３．**ロードバランサーの種類の選択から「Application Load Balancer」の[作成]をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/756bd6ce-ebda-0c39-1be8-ae18233c2b3c.png)

- - -
**４．**ALB作成ウイザードのステップ１（ロードバランサーの設定）で各項目を入力して、[次の手順：セキュリティ設定の構成]をクリックします。

|設定項目|設定値|
|:--------|:--------|
|基本的な設定|***************|
|名前|ALB01|
|スキーマ|●インターネット向け|
|IPアドレスタイプ|ipv4|
|リスナー|***************|
|ロードバランサーのプロトコル|HTTP|
|ロードバランサーのポート|80|
|アベイラビリティーゾーン|***************|
|VPC|JAWS-UG IWATA VPC_Tokyo01|
|アベイラビリティーゾーン|■ap-northeast-1a、■ap-northeast-1c|
|サブネット|DMZ-A、DMZ-C|
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/fb60a303-217e-c6a9-3eee-95a7a4784c54.png)

- - -
**５．**ALB作成ウイザードのステップ２（セキュリティ設定の構成）で、[次の手順：セキュリティグループの設定]をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/5203a662-e708-4f6f-7210-a972a51d76e5.png)

- - -
**６．**ALB作成ウイザードのステップ３（セキュリティグループの設定）で各項目を入力して、[次の手順：ルーティングの設定]をクリックします。

|設定項目|設定値|
|:--------|:--------|
|セキュリティグループの割り当て|●既存のセキュリティグループを選択する|
|セキュリティグループ|■SG_ELB_ALL|
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/a7f00c66-c7bc-469c-7872-bee794dbec7d.png)

- - -
**７．**ALB作成ウイザードのステップ４（ルーティングの設定）で各項目を入力して、[次の手順：ターゲットの登録]をクリックします。

|設定項目|設定値|
|:--------|:--------|
|ターゲットグループ|***************|
|ターゲットグループ|新しいターゲットグループ|
|名前|ALBTG01|
|プロトコル|HTTP|
|ポート|80|
|ターゲットの種類|instance|
|ヘルスチェック|***************|
|プロトコル|HTTP|
|パス|/|
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/3dd15c26-21ff-1064-faca-c510d9cf5c93.png)

- - -
**８．**ALB作成ウイザードのステップ５（ターゲットの登録）で各項目を入力して、[登録済みに追加]をクリックします。

|設定項目|設定値|
|:--------|:--------|
|インスタンス|***************|
|インスタンス名|jaws-ug iwata ec2 test 01|
|ポート|80|
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/26176fa7-0795-5050-d984-32fa2852704b.png)

- - -
**９．**ALB作成ウイザードのステップ５（ターゲットの登録）で、[次の手順：確認]をクリックします。

- - -
**１０．**ALB作成ウイザードのステップ６（確認）で、[作成]をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/11ca4244-5975-5dde-77b7-c254161a0dfb.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/f6dfb357-bfff-44d5-d5e1-47682e48eb57.png)

**※公式マニュアルから抜粋**
http://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/introduction.html
puts "hoge" と print "hoge\n" のちょっとした違い

`puts "hoge"`と`print "hoge\n"`は普通、同じ動きをしますが、マルチスレッドのときは少し違うようです。

```rb
# ruby 2.4.1p111

THREAD_NUM = 3

Array.new(THREAD_NUM) do
  Thread.new do
    10.times do
      puts "hoge"
    end
  end
end.each(&:join)

puts "-"*5

Array.new(THREAD_NUM) do
  Thread.new do
    10.times do
      print "hoge\n"
    end
  end
end.each(&:join)
```

これを実行すると

```
[] % ruby sample.rb
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hogehoge

hoge
hoge
hoge
hoge
hoge
hoge
-----
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
```

`puts`はスレッドセーフでは無いようで、文字列を出力したあと、改行する前に別のスレッドが割り込んでしまうことがあります。

あんまりないと思いますが、rubyでマルチスレッドコードを書くときはお気をつけて。

## 追記

ruby 2.5.0 では再現しないっぽいです。

## 2018/06/04 追記

stackoverflowにて、密かに尊敬する @raccy さんから[詳しい解説](https://ja.stackoverflow.com/questions/44288/ruby%e3%81%ae%e7%b5%84%e3%81%bf%e8%be%bc%e3%81%bf%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e3%81%8c%e3%82%b9%e3%83%ac%e3%83%83%e3%83%89%e3%82%bb%e3%83%bc%e3%83%95%e3%81%8b%e5%90%a6%e3%81%8b%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6)を頂きました。
この場を借りて感謝を申し上げます。
Raspberry Pi コマンドライン（CLI/CUI）だけで WiFi 接続

######株式会社XSHELL　デベロッパー　植田歩
##概要
OSイメージを焼いたSDの場合、Raspberry PiにさしてOSインストール不要で起動できる。
SSHでつなぐにもRaspberry PiがWiFi接続できてないと始まらない。。
この時Raspberry Pi上でGUIを使わずに、直接接続したキーボード操作だけでWiFi接続する方法。

##環境

- mac OS X El Capitan
- Raspberry Pi 3
- OS 2017-08-16-raspbian-stretch-lite.img

##手順

```

$ sudo su -
```
まずルートユーザーになる。以下ルート権限で作業。

```

# wpa_passphrase SSID WiFiPW >> /etc/wpa_supplicant/wpa_supplicant.conf
```
これは接続したいwifiのssidとpwをwpa_supplicant.confに追記するコマンド。

```

# reboot
```
再起動でつながる。再起動しない方法もあるが、めんどくさいので再起動。

---
######株式会社XSHELL　デベロッパー　植田歩
[XSHELL](https://xshell.io/)はSBCを使いやすくするソリューションを提供しています。
[isaax](https://isaax.io/)、[IoTit](https://github.com/xshellinc/iotit)ぜひご使用になってご意見を頂きたく思います。
共に素晴らしいプロジェクトを実現させましょう！

---
Jetson TX2にKerasをインストールする

# Jetson TX2にKerasをインストールする
* 環境: JetPack 3.1 introduces L4T 28.1

## レポジトリの追加
```
sudo add-apt-repository universe
sudo apt-get update
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
```

## 必要なパッケージのインストール
```
sudo apt-get install oracle-java8-installer -y
sudo apt-get install libblas-dev liblapack-dev python-dev idle nano python-pip
```

## pipのアップグレード
```
sudo pip install --upgrade pip
```

## bazelのインストール
```
wget --no-check-certificate https://github.com/bazelbuild/bazel/releases/download/0.7.0/bazel-0.7.0-dist.zip
unzip bazel-0.7.0-dist.zip -d bazel-0.7.0-dist
cd bazel-0.7.0-dist/
sudo chmod -R ug+rwx $HOME/bazel-0.7.0-dist
sudo ./compile.sh 
sudo cp output/bazel /usr/local/bin
```

## JetsonTX1/Tx2用のwhlをダウンロード
```
wget --no-check-certificate https://github.com/peterlee0127/tensorflow-tx2.git
```

## TensorFlowインストール
```
sudo pip install tensorflow-1.3.0-cp27-cp27mu-linux_aarch64.whl
```

## h5を利用する為のライブラリのインストール
```
sudo apt-get install libhdf5-dev
```

## Kerasインストール
```
sudo pip install keras
```

## 最後に
* "import keras"をしてインポートできれば完了です。
  * "ImportError: libcusolver.so.8.0: cannot open shared object file: No such file or directory"がでたら以下のやつを実行してみて下さい。

```
       export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64/
```

---
## 参考
>http://nicholaspropes.com/entries/general/installing-jetpack-3-1-on-jetson-tx2-with-tensorflow-1-3-keras---hdf5---h5-
>https://github.com/peterlee0127/tensorflow-tx2
>https://github.com/jetsonhacks/installTensorFlowTX2
>https://github.com/bazelbuild/bazel/releases
GitのSSH鍵設定をする


```
$ mkdir .ssh

$ cd .ssh

$ ssh-keygen -t rsa -C {メールアドレス}
```

ここまでやると、
`（Enter file in which to save the key (/Users/*********/.ssh/id_rsa)`
と聞かれるので、`github_id_rsa`とか、鍵情報を登録する先のサービス名で登録しておくとわかりやすくていいと思います。

そしてパスワードを設定するように要求されるので、お好きなパスワードを設定してください。

生成された`github_id_rsa.pub`の方をGitHubなどに登録します。

```
$ cat {.pubファイル} | pbcopy
```

これで.pubファイルの中身がクリップボードにコピーされました。
これをGitHubなどのSSH鍵に登録します。

登録が済んだら、ssh接続の設定をしましょう。
`~/.ssh/config`に接続情報を記述します。

```config
Host github
  HostName github.com
  User git
  Port 22
  identityFile ~/.ssh/github_id_rsa
  UseKeychain yes
  AddKeysToAgent yes
```

ここで、以下の設定をしているのは、Macでgit操作をしようとするたびにパスワードを聞かれて面倒なので、一度パスワードを入力した後は省略できるようにするためです。

```
UseKeychain yes
AddKeysToAgent yes
```

さあ、それではいよいよSSH接続をしてみます。

```
$ ssh -T github
Hi {アカウント名}! You've successfully authenticated, but GitHub does not provide shell access.
```

パスワードを入力後、このように返ってくれば成功です。

---

今回はGitHubを例にやりましたが、BitbucketやGitLabでもやることは同じです。
`config`の`HostName`をそれに変えてあげればできるはずです。

それでは良いGitライフを！
Google Apps Script使ってみた

## Google Apps Script
Googleのサービスやアプリ（スプレッドシート、ドキュメント、カレンダー、メールなど）を操作したり外部サービス（チャットなど）と連携したりすることができるやつ。
開発環境も実行環境もいわゆる「サーバーレス」というやつで、Googleアカウントがあればブラウザ上で無料で遊べます。
[Google Apps Script (公式)](https://developers.google.com/apps-script/)

## どこからできるの？
こちらが画像つきで詳しいです。
[Google Apps Scriptでログ出力](https://memordm.com/gas-log/)

大きく2種類あって

- Googleドライブメニュー「新規」から追加する（Standalone）
- スプレッドシートのメニュー「ツール -> スクリプトエディタ」（Container Bound）

となっています。
[Google Apps Script 入門](https://qiita.com/t_imagawa/items/47fc130a419b9be0b447)

※UIはちょこちょこ変わっているようで、ググって見つけた解説サイトで「そんなメニューないぞ…」みたいな状態もあったりするので適宜読み換えていくとよいでしょう。

## どんなことができるの？
色々あります。こちらを見てイメージを膨らませてみましょう。
[【保存版】初心者向け実務で使えるGoogle Apps Script完全マニュアル](https://tonari-it.com/google-apps-script-manual/)

定期的な実行機能（トリガー）もあるので、組み合わせると本当に色々できそう。

使いたいサービスのリファレンスはまずは公式でしょうか。
[Google Apps Script REFERENCE](https://developers.google.com/apps-script/reference/)

## 例えば…
上記その他を参考に、何らかの**リマインドメールを送る**スクリプトをつくります。

### スプレッドシートに件名、本文、宛先を用意
![gas_sheetsetup.PNG](https://qiita-image-store.s3.amazonaws.com/0/86958/30fca135-84e6-3502-4d0e-b0eaf8bb7caf.png)
こんな感じで、宛先は改行で複数可とします。

### スプレッドシートから情報取得し、メールを送るスクリプトを書く
```js:script
function sendMail() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var subject = sheet.getRange(2, 1).getValue();
  var body = sheet.getRange(2, 2).getValue();
  var to = sheet.getRange(2, 3).getValue().replace('\n',',');

  GmailApp.sendEmail(to, subject, body);
}
```
ごくシンプルにこんな感じ。宛先は改行をカンマ区切りに置換します。
実行ボタンから動作することを確認します。

### トリガーに登録
![gas_trigger.png](https://qiita-image-store.s3.amazonaws.com/0/86958/f802461e-ef61-6043-e14f-ba940ba5edfc.png)
スクリプト画面の時計みたいなアイコンから追加できます。
毎月/毎週/毎日/毎時/毎分など設定できます。
（スプレッドシートで何かしたとき、といったトリガーも設定できるようです）

### おしまい
他にも、チャットシステムとの連携（条件に該当するメールを自分のChatWorkに飛ばす）もやってみたので、[別途まとめました](https://qiita.com/tksnino/items/6d283860ee8cd943e792)。
PlayFrameworkでのリクエストパラメーターの受け取り方

忘れそうなのでメモ
##version
2.5.10
Java 1.8

##GETでのリクエスト
まずはFormなりなんなりリクエストを作成

```html
<form method="get" action="/request">
	<input type="text" name="name">
	<input type="submit value="送信">
</form>
```

とか

```html
<a href="/request?name=Hyu"
```


conf/routesでパスの設定

```conf/routes
GET    /request        controllers.Controller.send
```

Controllerでリクエストの受け取り

```Controller
public Result send() {
	//リクエストの値を代入してます。
	String name = request().getQueryString("name");
	//result.scala.htmlに遷移
	return ok(views.html.result.render(name));
}
```

上記の通り、
```request().getQueryString("name属性の値")```
でとりだせます。

routesに下記の記述での方法でも可能。

```routes
GET     /request        controllers.Controller.send(name: String)
```
この場合はControllerは引数でリクエストパラメーターが取得できる。

```Controller
public Result send(String name){
	return ok(views.html.result.render(name);
}
```


##POSTでのリクエスト
同じくフォーム作成

```html
<form method="POST" action="/request">
	<input type="text" name="name">
	<input type="submit" value="送信">
</form>
```
```conf/routes
POST     /request       controllers.COntroller.send
```

Controllerでリクエスト受け取り

```Controller
public Result send() {
	//リクエストパラメーターはMapに格納されてます。
	//キー = name属性の値, value = String配列です
	Map<String, String[]> requestParam = 
		request().body().asFormUrlEncoded();
	
	String[] input = requestParam.get("name");
	String name = input[0];
	
	return ok(views.html.result.render(name);
}
```

POSTの場合はMapで、そしてString配列でくるのがちょっとめんどくさいですが、フォームクラスを使わないお手軽なフォームにつかえそう。
ローカルの git リポジトリで管理しているファイルをコピーするには


「とりあえず今々の状態でプロジェクト一式 zip してくれない？」などと急に言われることがあります。

こちらはローカルの git リポジトリで作業していて、.gitignore してるものまで zip したくない。えっと、どうやって抜き出すんだっけ。というメモです。

```
git clone --local path/to/working path/to/clone
```

こうしてローカルリポジトリを別ディレクトリに clone すれば済みます。

clone なので当然そちらでも `git log` やら `git diff` やらできますし、普通に作業再開もできます。必要がなければ .git ディレクトリを消してから zip しましょう。

リモートでやっている場合でも手軽にコピーできるので覚えておきます。

## 環境
- git version 2.13.6
Ebean(Play Framework)設定

備忘録用

#設定
DB接続の設定は済んでいるとして。
まずは下記を記述。

```build.sbt
lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean)
```

```plugin.sbt
addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "3.0.2")
```

application.confも以下があるか確認

```application.conf
ebean.default = ["models.*"]
```

ここで一回clean, compileした方がいいかも
(eclipseでやってるならactivator eclipse)
後ほど使うクラスがインポートできなかったことがあり。

`activator clean`, `activator compile`
eclipseでやってる方は`activator eclipse`かな

#Modelクラス作成
Usersクラスを作ってみる。

```User.java
@Entity
public class User extends Model {
	@id
	public Long id;
	public String name;
	public Integer age;
	
	public static Finder<Long, User> find 
		= new Finder<Long, User>(User.class);
}
```
@Entityは必須、あとはModelの継承。

これでページリロードするとEvolutionが発動。SQL文を発行して、テーブルを作成します。
***
**注意**
既存のテーブルを使う時は@Entityクラスの名前やフィールド名に注意。
また、同じでもEvolutionに初期化されます。

```application.conf
play.evolutions {
 db.default.enabled = false
}
```

上記でEvolutionが発動しません。

***

Evolutionを使ってテーブルを作成する場合はテーブル設計を@Entityクラスで行います。
その際は@OneToManyなんかのJPAの機能を使用します。
【Unity】TiledのImageのパフォーマンスを改善する

## TiledのImageの描画負荷について
uGUIのImageのImageTypeにTiledという描画タイプがあります。
簡単にループ画像をタイリングしてくれて、画像サイズも下がって便利なのですが
実はループ回数に応じてMeshの頂点数が膨れ上がります。
FrameDebuggerで確認するとよくわかります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/67497/0e6fd52c-95dd-18b4-7868-e00fc16b75ee.png" width=20%>
このようなdot画像をタイリングしてみました。

![スクリーンショット_2017-11-22_13_22_44.png](https://qiita-image-store.s3.amazonaws.com/0/67497/99a1dca1-fab2-bc88-7678-e9b372c9c713.png)
このように、頂点数が増えているのがわかると思います。
気をつけないと、簡単に1万を超えてしまいます...

## 改善方法
これを改善するには、Imageの代わりにRawImageを使うと良いです。

(左: Image, 右: RawImage)
<img src="https://qiita-image-store.s3.amazonaws.com/0/67497/c761220b-10fe-6e0d-4f48-7b3d92821a4d.png" width=40%> <img src="https://qiita-image-store.s3.amazonaws.com/0/67497/8d185f05-514d-8ca0-e8f8-9fbe7825435c.png" width=40%>

使用する画像のWrapModeはRepeatにする必要があります
![スクリーンショット 2017-11-22 13.35.52.png](https://qiita-image-store.s3.amazonaws.com/0/67497/db547650-033c-f8dd-b0f2-cc9aa63de968.png)


## 結果
見た目はそのままで、頂点数 1088 → 4 に!
この方法だと、何回Wrapさせても頂点数は4で済みます。
![スクリーンショット_2017-11-22_13_37_08.png](https://qiita-image-store.s3.amazonaws.com/0/67497/9ce461fb-63aa-6489-4dad-bbca88cf6f00.png)

## 注意点
この方法で改善する場合、MultipleSprite(いわゆるアトラス画像)は使えません
タイリング画像素材だけアトラスから切り離す必要があります
React+Node.js+axios+jsdomでTDDしようとしたらCORS問題にぶつかった話

`Access-Control-Allow-Origin` とかでエラーになるあれです。
React+Node.js+axios+jsdomでRequest投げた場合に発生しました。

ぱっと見の原因は、jsdomの作成時にURLが設定されていない場合、originに文字列で `"null"` が入ってしまい、jsdomのオリジンチェックで、文字列じゃない `null` で `(null !== "null")` という感じで比較してエラー判定しているからだと思いました。

[ここの関数で比較しています](https://github.com/tmpvar/jsdom/blob/11.4.0/lib/jsdom/living/xhr-utils.js#L72)

そして、文字列の `"null"` が入るのはバグじゃないか？と調べてみたのですが、[npmモジュールのwhatwg-urlのこの辺](https://github.com/jsdom/whatwg-url/blob/v6.3.0/src/url-state-machine.js#L1211)で、文字列nullが正しい的な記述がある。

[古川さんのissue](https://github.com/tmpvar/jsdom/issues/1868)でも正しいように見えると答えているので、whatwgの仕様が気になったのですが、ちょうどNode.jsが実装したみたいな記事があったため試してみた。
（原典に当たれとか言われそうですが、今回やりたいのはCORS問題の解決なのでそこは捨てました。）

確認したいのは、originが存在しない場合に文字列nullが返ってくるのかどうか？です。ローカルのファイルアクセス用URLを使えばoriginが設定されていない状況になるので、それで試しました。

```js
node -e 'const URL = require("url").URL; console.log(new URL("file://aaa.log"))'
URL {
  href: 'file://aaa.log/',
  origin: 'null',
  protocol: 'file:',
  username: '',
  password: '',
  host: 'aaa.log',
  hostname: 'aaa.log',
  port: '',
  pathname: '/',
  search: '',
  searchParams: URLSearchParams {},
  hash: '' }
```

結果、文字列`"null"`が帰ってくるという。（意外）

そもそもaxiosでエラーを投げるのは、CORS違反だからで、それ自体は正しい挙動だと思い直しました。

そして、originが設定されていないという状況がイレギュラーなんじゃないか？（Chromeの別タブ状態でXHRリクエスト投げた場合でも、originはgoogleのやつが入っていたりする。）

ということで、jsdomの生成時にURLを設定して試してみました。

```js
// setup用のjs

require('babel-register')()

var JSDOM = require('jsdom').JSDOM
var dom = new JSDOM(`...`, {
  url: `localhost:3000` // ←ここ！！
})

global.window =  dom.window
global.document = dom.window.document

var exposedProperties = ['window', 'navigator', 'document']
Object.keys(document.defaultView).forEach((property) => {
  if (typeof global[property] === 'undefined') {
    exposedProperties.push(property)
    global[property] = document.defaultView[property]
  }
})

global.navigator = {
  userAgent: 'node.js'
}
```

結果おｋ。

これで localhost:8080で立ち上がっているWebサーバにリクエストを投げてもエラーは発生しなかったです。ちなみにlocalhost指定だと駄目で、localhost:3000とかポートまで指定するとうまくいくという謎現象もありました。。。


また、`global.window.document.origin`　の値が使われていたので、そいつを上書きすれば解決か？とか思ったのですが、set出来ない書き方をしていたため、変更できずでした。（個人的に分かりづらいので、この書き方は嫌いです。）

```js
// set出来なくする書き方。。
// react-tdd/node_modules/jsdom/lib/jsdom/living/generated/Document.js#L798

Object.defineProperty(Document.prototype, "origin", {
  get() {
    if (!this || !module.exports.is(this)) {
      throw new TypeError("Illegal invocation");
    }

    return this[impl]["origin"];
  },

  enumerable: true,
  configurable: true
});
```


npm iしたあとに作成されるgeneratedフォルダ配下なので、npm iしたあとの中身で見ないと見れないかもです（jsdom@11.4.0）

githubのリンクを貼れないからそれもやだなぁとか、結構調べるのに骨が折れたので共有でした。
FuelPHPで実装したAPIを呼んだ時の基本的な流れ

### 自分用のメモ

Controller のテストを書くにあたり、インスタンスがいつ作られるのか知りたかったので、そこまでを調査

#### public/index.php

routerequest が呼ばれる

```php:index.php
try
{
    // Boot the app...
    require APPPATH.'bootstrap.php';

    // 次: ここ
    // ... and execute the main request
    $response = $routerequest();
}
```

Request::forge(\$route, false)->execute(array($e))->response() が呼ばれる

```php:index.php
$routerequest = function($route = null, $e = false)
{
    （中略）
    if ($route instanceof Closure)
    {
        （中略）
    }
    elseif ($route)
    {
        // 次: ここ
        $response = Request::forge($route, false)->execute(array($e))->response();
    }
    （中略）

    return $response;
};
```

#### core/classes/request.php

new static が呼ばれる

```php:request.php
public static function forge($uri = null, $options = true, $method = null)
{
    （中略）
    if ( ! empty($options['driver']))
    {
        （中略）
    }
    // 次: ここ
    $request = new static($uri, isset($options['route']) ? $options['route'] : true, $method);
    if (static::$active)
    {
        （中略）
    }

    // fire any request created events
    \Event::instance()->has_events('request_created') and \Event::instance()->trigger('request_created', '', 'none');

    return $request;
}
```

Router::process が呼ばれる

```php:request.php

public function __construct($uri, $route = true, $method = null)
{
    （中略）
    // check if a module was requested
    if (count($this->uri->get_segments()) and $module_path = \Module::exists($this->uri->get_segment(1)))
    {
        （中略）
    }

    // 次: ここ
    $this->route = \Router::process($this, $route);

    （中略）
}
```

#### core/classes/router.php

```php:router.php
public static function process(\Request $request, $route = true)
{
    $match = false;

    if ($route)
    {
        （中略）
    }

    if ( ! $match)
    {
        （中略）
    }

    if ($match->callable !== null)
    {
        return $match;
    }
    // 次: ここだけど面倒なので以降は端折ります
    return static::parse_match($match);
}
```

#### public/index.php

前述の Request::forge が Request オブジェクトを返すので、execute を実行

```php:index.php
$routerequest = function($route = null, $e = false)
{
    （中略）
    {
        // 次: ここの execute
        $response = Request::forge($route, false)->execute(array($e))->response();
    }
    （中略）

    return $response;
};
```

#### core/classes/request.php

```php:request.php
public function execute($method_params = null)
{
    （中略）
    try
    {
        if ($this->route->callable !== null)
        {
            （中略）
        }
        else
        {
            （中略）
            // Load the controller using reflection <- ここでクラスをロード
            $class = new \ReflectionClass($class);

            if ($class->isAbstract())
            {
                throw new \HttpNotFoundException();
            }

            // Create a new instance of the controller <- ここでインスタンスを作成
            $this->controller_instance = $class->newInstance($this);
            （中略）
        }

        （中略）
    }
    （中略）

    return $this;
}
```
【PHP】相対パスがうまくキマらん！と思ったら

あるファイルへの相対パスを指定したはずなのに中々うまく行かない、ということがありました。

実行しているファイルはここのはずなんだけどなぁ〜、、
相対パスもあってるはずなんだけどなぁ〜、、

みたいな感じで少し悩みました。

こんな時はカレントディレクトリが間違っている可能性があります。
特に色んなファイルにまたがって処理を行なっている時、結局どこからの相対パスを指定すれば良いか分からないこともあると思います。

以下のコードで、カレントディレクトリの絶対パスを確認しました。
phpunitのテストにそっと書いて、そっと実行してターミナルに表示させました。

```php
//カレントディレクトリの絶対パスを表示
echo realpath('.');
```

案の定考えていたものと異なっていたため、
上記から辿って該当ファイルへの相対パスを見つけました。

以上。
Play Framework DBへの接続


備忘録
#application.conf設定
conf/application.confに以下を追加

```application.conf
db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://localhost/playdb"
db.default.username=playdbuser
db.default.password="DBpassword"
ebean.default = ["models.*"]
```

または

```application.conf
db {
 default.driver=com.mysql.jdbc.Driver
 default.url="jdbc:mysql://localhost:3306/dbname?characterEncoding=UTF8"
 default.username=username
 default.password=password
}
ebean.default = ["models.*"]

```

１行目は接続対象のRDBMSの設定を記述する。
上記はMySQLの設定

２行目は`db.default.url="jdbc:RDBMS名://ホスト/DB名?characterEncoding=UTF8"`
な具合で?以後は文字コードの設定

３、４行目はユーザー名とパスワード
５行目は EbeanというPlay内蔵のO/Rマッパーの設定。使用するmodelクラスの設定をする。（通常はmodelsパッケージ内にmodelクラスをまとめるので上記でOK）

#build.sbt
以下の記述があるかを確認。


`libraryDependencies += javaJdbc`

デフォルトで以下のようになっているかも

```build.sbt
libraryDependencies ++= Seq(
  javaJdbc,
  cache,
  javaWs
)
```
上記の状態なら問題なし。

なければ追記しましょう。
それと下記を追記。
`libraryDependencies += "mysql" % "mysql-connector-java" % "8.0.8-dmr"`

https://mvnrepository.com/
上記でサイトで検索して`sbt`のものをコピペでOK
***
ここまでで接続自体はOK！
Play Framework プロジェクトをEclipseで開発(Mac向け)


備忘録

##バージョン
PlayFramework 2.5.10

##Eclipseへの取り込み設定
`$ activator new`で作成したプロジェクトをテキストエディタで開く。
`project/plugins.sbt`の末尾に以下を追加。

```project/plugins.sbt
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")
```

次に`build.sbt`を開き末尾に以下の３行を追加。

```build.sbt
EclipseKeys.preTasks := Seq(compile in Compile)
EclipseKeys.projectFlavor := EclipseProjectFlavor.Java
EclipseKeys.createSrc := EclipseCreateSrc.ValueSet(EclipseCreateSrc.ManagedClasses,EclipseCreateSrc.ManagedResources)
```

プロジェクトのディレクトリ内でcompile, eclipseコマンドを実行。

```
$ cd プロジェクト
$ acrivator compile
$ activator eclipse
```

あとはEclipseにインポート。
ここまでやればEclipseで開発はできます。

##アプリケーションの実行
1, Run > External Tool > External Tool Configurations
2, Program 右クリックで New
3, 設定
	・name : お好きにどうぞ
	・Location : activatorのある場所を指定する。（コンソールから`which activator`でコピペでOK）
	・Working Directory :  Variablesを選択、`Project_loc`を選択
	・Argument : run（runのみでOK）
4, ApplyしてRun
5, http://localhost:9000 にアクセスして確認

##デバッグ
1, menu, Run > External Tools > External Tools Configurations
2, proguram > new
3, 設定
　Name : 好きなの
　Location : activatorの場所を指定(which activatorで出ます)
　Arguments : -jvm-debug 9999 run
Apply

上記の設定でRunするとDebugが可能。

##参考
http://mofmof721.hatenablog.com/entry/2015/12/31/003319
https://qiita.com/yamakz5555/items/0391a9f384a248ebea2d
GTX1080Ti搭載のWindows10パソコンにUbuntu16やらCUDAやらインストールする流れ（２）

#はじめに
前回
https://qiita.com/masataka46/items/9548b70cc71248cc1456
で買ってきたパソコンにUbuntu16をインストールした。

今回はこれにCUDAやらcuDNNやらをインストールする。

スペック：
デフォルトのOS:Windows10 64ビット
CPU:Corei7 7700K
GPU:GTX1080Ti
SSD:240GB
HDD:2TB
マザーボード:ASUS H170-pro
など

#CUDAをインストールする
<font color="DeepPink">現状のTensorflow ver.1.4はCUDA9.0 に対応していない。よってTensorflow使うならCUDA8.0が必要。</font>
このサイト（１）に従って進める
https://developer.nvidia.com/cuda-downloads からCUDA 8.0をダウンロードする。各種設定は以下。Operating System: Linux, Architecture: x86_64, Distribution: Ubuntu, Version: 16.04, Installer Type: deb (network).

nvidiaダウンロードページの記述に従って以下のコマンドを打つ。

```shell-session
sudo dpkg -i cuda-repo-ubuntu1604-8-0-......_amd64.deb
sudo apt-key add /var/cuda-repo-8-0-local/......pub
sudo apt-get update
sudo apt-get install cuda
```

えらい簡単にインストールできた。昔インストールした時はCUIに切り替えたりどしたりで苦労した気がするが・・・

#PATHを設定する
ここも上記サイト（１）に従って`~/.bashrc`に以下を書き込む

```
## CUDA and cuDNN paths
export PATH=/usr/local/cuda-8.0/bin:${PATH}
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:${LD_LIBRARY_PATH}
```

以下でPATHが通ってるか確認

```shell-session
echo $PATH             # 出力に"/usr/local/cuda-8.0/bin"が含まれているか？
echo $LD_LIBRARY_PATH  # 出力に"/usr/local/cuda-8.0/lib64"が含まれているか？
which nvcc             # 出力が"/usr/local/cuda-8.0/bin/nvcc"になっているか？
nvidia-smi             # nvidiaのGPUの情報が表示されているか？
```

問題ないようだ。

#cuDNNのインストール
ここもやはり上記（３）サイトに従って進める。
https://developer.nvidia.com/rdp/cudnn-download からcuDNN 6 for CUDA 8.0のdebパッケージをダウンロードする（アクセスするにはメンバー登録が必要）。具体的には以下の３個のdebパッケージをダウンロードする。


1. cuDNN v6 Runtime Library for Ubuntu16.04 (Deb)
2. cuDNN v6 Developer Library for Ubuntu16.04 (Deb)
3. cuDNN v6 Code Samples and User Guide for Ubuntu16.04 (Deb)

次にインストールする。ダウンロードしたディレクトリに行って以下のコマンドを打つだけ。

```shell-session
# Install Runtime library
sudo dpkg -i libcudnn6_6.0.21-1+cuda8.0_amd64.deb
# Install developer library
sudo dpkg -i libcudnn6-dev_6.0.21-1+cuda8.0_amd64.deb
# Install code samples and user guide
sudo dpkg -i libcudnn6-doc_6.0.21-1+cuda8.0_amd64.deb
```

完了。以前インストールした時はファイルをコピーしたりどしたり、だったが、こちらも随分と簡単になった。
High Sierraでローカル環境（Apacheのバーチャルホスト）が動かなくなったときの対応

毎回MacOSをアップデートするとローカル環境が動かなくなります。
備忘録としてメモを残しておきます。

# 前提条件
前提としてSierraでは「/etc/apache2/users/{ユーザー名}.conf」でバーチャルホストの設定をしていることとします。

# 手順
## 1. 「/etc/apache2/httpd.conf」の修正
「/etc/apache2/httpd.conf~previous」としてバージョンアップ前のファイルが残っているが、
php5からphp7になっていたりと環境が変更されているため、単純にコピーし直すのではなく書き換えすることにしました。

151行目のコメントアウト削除

```
#LoadModule http2_module libexec/apache2/mod_http2.so
```

167行目のコメントアウト削除

```
#LoadModule vhost_alias_module libexec/apache2/mod_vhost_alias.so
```

173行目のコメントアウト削除

```
#LoadModule userdir_module libexec/apache2/mod_userdir.so
```


175行目〜177行目のコメントアウト削除

```
#LoadModule rewrite_module libexec/apache2/mod_rewrite.so
#LoadModule php7_module libexec/apache2/libphp7.so
#LoadModule perl_module libexec/apache2/mod_perl.so
```

447〜448行目のコメントアウト削除

```
    #AddType text/html .shtml
    #AddOutputFilter INCLUDES .shtml
```

510行目のコメントアウト削除
※これで「/etc/apache2/extra/httpd-userdir.conf」が読み込まれるようになる

```
#Include /private/etc/apache2/extra/httpd-userdir.conf
```

httpd-vhosts.confで設定している人は516行目の以下もコメントアウト削除
※自分はコメントアウトのままです

```
#Include /private/etc/apache2/extra/httpd-vhosts.conf
```

## 2. 「/etc/apache2/extra/httpd-userdir.conf」の修正
16行目のコメントアウト削除
※これで「/etc/apache2/users/{ユーザー名}.conf」が読み込まれるようになる

```
#Include /private/etc/apache2/users/*.conf
```

## 3. 完了

Apacheを再起動して確認

```
sudo apachectl restart
```

# 余談
デフォルトで表示される「It Works!!」は「/Library/WebServer/Documents」のファイルが読み込まれているみたいです。

ちなみに自分の「/etc/apache2/users/{ユーザー名}.conf」の設定は以下のような感じです。
ポート番号は[予約されていない番号](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7#.E3.83.9D.E3.83.BC.E3.83.88.E7.95.AA.E5.8F.B7.E3.81.AE.E7.A8.AE.E9.A1.9E)を使っています。

```
Listen 60000
<VirtualHost *:60000>
	DocumentRoot "/Users/{ユーザー名}/Sites/test"
	ServerName test
	<Directory "/Users/{ユーザー名}/Sites/test">
		AddType text/html .shtml .html
		AddHandler server-parsed .shtml .html
		Options Indexes MultiViews FollowSymlinks Includes
		AllowOverride all
		Require all granted
	</Directory>
</VirtualHost>

#
# 以下省略
#
```
Element.closestで作る簡単Event Delegation


# やりたいこと

jQueryの[on](http://api.jquery.com/on/)関数に代表される、子孫Elementのイベント監視をブラウザのNativeなWeb APIだけで実現したいです。

[JSFiddle](https://jsfiddle.net/yjv7g441/)

なお、この記事の想定読者は、2年半前の自分です。

[jQuery Event Delegation の代替えを考える - Qiita](https://qiita.com/ledsun/items/e27f89939751a3becaba)


# 設計
## 引数
jQueryでは

- 親Element
- イベント
- 要素を特定するselector文字列

で監視したいイベントを特定します。
引数はこのまま使います。


## Element.closest
現代的なブラウザは[Element.closest](https://developer.mozilla.org/ja/docs/Web/API/Element/closest) APIをサポートしています。
IEはサポートしていません。

このAPIは、自Elementまたは祖先Elementのうちで、selecotrに合致する、もっとも近いElementを返します。


## 仕組み

子Elementで発生したイベントはバブリングフェーズで親Elementに渡ってきます。
その時[Event.target](https://developer.mozilla.org/ja/docs/Web/API/Event/target)プロパティに、イベントが発生したElementが格納されています。
そのElementのclosestメソッドを使ってselectorと一致するか確認します。


# 実装



```js
function delegate(element, event, selector, callback) {
  element.addEventListener(event, (e) => {
    if (e.target.closest(selector)) {
      callback(e)
    }
  })
}
```

## 使い方

```js
delegate(document, 'mouseover', 'h2', e => console.log('hi', e))
```

# jQuery.onとの挙動の違い

Element.closestを使っているためのjQuery.onと微妙な違いがあります。
個人的には、Elementの子にSpanなどのElementが入っていても、イベントが発火してほしいので、今の実装が気に入っています。

次のElementで

```html
<div class="class1">
  Hello <span>World</span>!
</div>
```

`Hello`でも`World`でもイベントが発火します。

## selectorの子要素を除外する場合
個別のcallback関数で除外したい場合は、callback関数内で

```js
event.target.classList.contains(.class1)
```

などで、フィルタリングしましょう。

## 完全なjQuery互換にしたい場合

Element.closestの代わりに[Element.mathces](https://developer.mozilla.org/en-US/docs/Web/API/Element/matches)を使って実装しましょう。




# 参考
- [DOMイベントのキャプチャ/バブリングを整理する 〜 JSおくのほそ道 #017 - Qiita](https://qiita.com/hosomichi/items/49500fea5fdf43f59c58)
Intellij IDEA with Ruby plugin で bundle exec foreman start を Run 機能を使って実現する

# 環境
* Intellij IDEA 2017.2.6
* rbenv

# 手順
## Run -> Edit configurations に行き、 + をクリックして Ruby を選択
<img width="1079" alt="Screen Shot 2017-11-22 at 12.06.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/68213/4be6fe46-2789-bf1c-2d16-e2acd7c172e1.png">

## Configuration を下記画像のように設定
`user_name`は適宜変更してください。`project_folder`はrailsアプリのルートフォルダにします。Nameは表示名なのでなんでも大丈夫です。
<img width="1062" alt="Screen Shot 2017-11-22 at 12.48.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/68213/22a1e397-8ef8-5858-d890-d06a31f3a62f.png">

`Ruby script` を設定するところで、Finderが出てくるので `Command shift .` で隠しファイル・フォルダを表示して選択するか、 `Command shift g` で直接PATHを入力して設定する。 

注意：ここで、Ruby scriptを`which foreman`で出てくる`/Users/user_name/.rbenv/shims/foreman`にするとIntellij IDEAがシェルスクリプトを実行するところでこけるので、元の実行ファイルを指定します。

## Bundlerにチェックを入れる
<img width="1068" alt="Screen Shot 2017-11-22 at 12.48.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/68213/71dc8ad9-2a7d-c8b7-1824-9f46ea82e3ae.png">

以上です。

# 参考
[RUBY-12023 how to run foreman within rubymine debug mode](https://youtrack.jetbrains.com/issue/RUBY-12023)
[rbenvの切り替えの仕組み…と、他言語での実験 - すぎゃーんメモ](http://memo.sugyan.com/entry/20111128/1322420500)

# 今後調査
`bundle`コマンドは`/Users/user_name/.rbenv/shims/bundle`で実行できてるのに、なぜ`foreman`はこけるのか。
出てくるエラー

```
-e:1:in `load': /Users/user_name/.rbenv/shims/foreman:3: syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '(' (SyntaxError)
[ -n "$RBENV_DEBUG" ] && set -x
      ^
/Users/user_name/.rbenv/shims/foreman:3: syntax error, unexpected ']', expecting end-of-input
[ -n "$RBENV_DEBUG" ] && set -x
                     ^
	from -e:1:in `<main>'
```
追加したプロパティの値を変更してもv-modelで関連付けた項目が変わらない

分かる人にはタイトルだけでアイタタタな内容かと思いますが
今日ハマったのでメモしておきます。

# 1. やりたいこと
ストアでリストにしてもっている項目をチェックボックス付きのリストにしたかったので、チェックボックス用のboolean項目を追加してそいつをチェックボックスのv-modelに指定しました。
全選択用のチェックボックスを作って、それが押されたら全部チェック状態が変わる、という風にしたかったのです。

## 最初のコード
コードを抜粋しつつ簡潔にしたものがこちら

``` demo:checklist.vue(template)
 <input type="checkbox" id="checkall" @change="checkAll" v-model="checkall" />
 <label for="checkall">全選択</label>
 <ul>
   <li v-for="el in list">
     <input type="checkbox" v-model="el.checked" />
   </li>
 </ul>
```

``` js:checklist.vue(script)
data(){
    return {checkall:false, list:[]}
 }
 ,methods:{
   beforeOpen(event){
     // 元のリストにcheckedプロパティを追加
     event.params.sourcelist.forEach(e =>{
       this.list.push(e);
       this.list.checked=false;
     });
   }
   ,checkAll(){
      // 全選択チェックボックスの値をすべての要素に反映するのだ！
      this.list.forEach(e =>{
        e.checked=this.checkall;
      });
   }
 }
```

本題ではないですけどvue-js-modalを使っているので、パラメータはeventで受け取ってbeforeOpenで渡してます。

これでリスト内の全項目を全選択チェックボックスと同じ値に変更しますが、画面上のチェックボックスにうまく連動できない

# 原因と修正

Vue.jsのドキュメント[ リアクティブの探求 ](https://jp.vuejs.org/v2/guide/reactivity.html)に記述されている内容をざっくりまとめると、
　後から勝手に追加したプロパティは追跡できないよ！
ということです。
言われてみればそりゃそうですよね。

## 修正
というわけで、[こちらのドキュメント](https://jp.vuejs.org/v2/guide/reactivity.html#変更検出の注意事項)に書かれている通りObject.assignを使ってプロパティの多い新しいオブジェクトを作成するよう書き直しました。

## 修正後のコード

``` js:checklist.vue(script)
   beforeOpen(event){
     // 元のリストにcheckedプロパティを追加
     event.params.sourcelist.forEach(e =>{
       this.list.push(Object.assign({}, e, {e, selected:false}));
     });
   }
```

これで無事連動するようになりました！
日本語ドキュメントありがとう！

# 参考（文中と重複しますが）
Vue.js - ガイド - 内部 - リアクティブの探求
https://jp.vuejs.org/v2/guide/reactivity.html
ループ中に行単位でファイル出力するときの速度比較


ループ中に行単位でファイル出力するときの速度比較

```iobench.ps1

if(Test-Path -Path "C:\Data\test0.txt"){ Remove-Item "C:\Data\test0.txt" }
if(Test-Path -Path "C:\Data\test1.txt"){ Remove-Item "C:\Data\test1.txt" }
if(Test-Path -Path "C:\Data\test2.txt"){ Remove-Item "C:\Data\test2.txt" }

Measure-Command{
  $fileName = "C:\Data\test0.txt"
  for($i=1;$i -lt 1000;$i++){
    Add-Content $filename "$i`n"
  }
}

Measure-Command{
  $fileName = "C:\Data\test1.txt"
  for($i=1;$i -lt 1000;$i++){
    Out-File -InputObject "$i`n" -FilePath $filename -Encoding Default -Append
  }
}

Measure-Command{
  $fileName = "C:\Data\test2.txt"
  $file = New-Object System.IO.StreamWriter($fileName, $false, [System.Text.Encoding]::GetEncoding("sjis"))
  for($i=1;$i -lt 1000;$i++){
    $file.WriteLine("$i`n")
  }
  $file.Close()
}

```

結果（抜粋）

```

#Add-Content の場合
TotalSeconds      : 7.0913288

#Out-File の場合：
TotalSeconds      : 7.4923944

#System.IO.StreamWriter の場合
TotalSeconds      : 0.0140423

```

結論：System.IO.StreamWriter の圧勝でした。
フレームワーク作成時に気を付けること

# 条件
SpringBootを利用して開発基盤を整備した際の自分用メモ

# 箇条書き
- 例外処理
    - フレームワーク独自例外
    - 例外ハンドラー
- DB接続
    - JPA
    - JDBC
- ファイルUL/DL
- MQ
    - ActiveMQ
- Controller
- Formatter（Dateなど）
- 環境毎のプロパティ
- 多言語化
- ログ出力
- 単体テスト（Junit)
- テンプレートエンジン（thymeleaf）
    - layout
- ビルド（gradle/maven）
- パッケージ構成
ディスク容量確保のために音楽制作(GarageBand)を削除する手順の備忘録

# 概要
音楽制作として表示されている「GarageBand」を削除する。

# 容量確認
以下の手順で「音楽制作」の容量を確認する。

```
Apple メニュー ()
「このMacについて」
「ストレージ」
「管理」
「音楽制作」
```
2.57 GB

# 削除
## 削除ボタンが表示されている場合
「GarageBand サウンドライブラリを削除」ボタンを押下する。

0 KB
と表示され完了。

## 削除ボタンが表示されていない場合
ターミナルから以下を実行する。

```
sudo rm -rf /Applications/GarageBand.app
sudo rm -rf /Library/Application\ Support/GarageBand
sudo rm -rf /Library/Application\ Support/Logic
sudo rm -rf /Library/Audio/Apple\ Loops
sudo rm -rf /Library/Audio/Apple\ Loops\ Index
```

0 KB
と表示され完了。
【Android】adbを使ってPCにファイルをコピー

# はじめに

## 目的
Android端末内のファイルをPCに転送したり、転送せずに閲覧したり・・・

## 利用するツール
adb.exe

## ツールの場所(あくまで私の環境の場合。)
"C:\Users\{ユーザー名}\AppData\Local\Android\sdk\platform-tools\adb.exe"

## 事前準備
adbがあるフォルダへのパスを通しておくこと。

## 私の環境
Windows 10.
Android SDK Platform Tools 26.0.2

----

# 具体的なやり方

## Android内のファイル閲覧

PCでコマンドプロンプトを起動して、以下のコマンドを実行

```command prompt
adb shell
```

あとは普通にunix系コマンドで、ファイルを閲覧できる。


## PCへのファイル転送

↓の通り。
```command prompt
adb pull {android端末上のファイルパス} {コピーしたいPC上のフォルダパス}
```

##  Permission deniedでブロックされる場合

### Android内のファイル閲覧

```command prompt
adb shell
```
を実行した後、run-asを実行。
具体的には、以下の通りに使う。

```command prompt
pm list packages| more
```

でパッケージ名を確認。確認したパッケージを指定して、run-asを実行。

```command prompt
run-as {パッケージ名}
```

### PCへのファイル転送
↑のやり方でrun-asした後、sdcardなどpermission的にOKな場所にコピー。
具体的には、以下の通り。

```command prompt
adb shell
run-as {パッケージ名}
cp {Permission的にNGなファイル} {Permission的に誰でもOKな場所}
exit
exit
adb pull {Permission的に誰でもOKな場所} {PC上のコピーしたい場所}
```
dllを使うおみくじアプリを作ってみた

# はじめに
DLLを用いたアプリケーションの作り方を覚えるため、おみくじアプリをもとに作ることにしてみた。

## プログラムの概要
+ おみくじアプリはコンソールアプリとして作成する。
+ コンソールアプリの実行名は「omikuji」とする。
+ おみくじの中身は「大吉、中吉、有吉、吉、凶、大凶」とする。
+ DLLはランダマイザー処理(乱数発生器)を行うものとする


## 手順
(1) 新しいプロジェクトを作成。

(2)VisualC#のクラスライブラリをテンプレートに選択。
![Screenshot_NoName_2017-11-27_0-12-26_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/184939/585b3725-a55a-bafe-7e9d-37843aedcafa.png)

(3)ソリューションを[右クリック]->[追加]->[新しいプロジェクト]を選択。

(4) VisualC#のコンソールアプリをテンプレートに選択し、追加。
![Screenshot_NoName_2017-11-27_0-16-55_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/184939/0a4e5795-4461-272e-1f2e-990dc9189079.png)

(5) omikujiの参照項目にて、Randomizerを追加。
![Screenshot_NoName_2017-11-27_0-51-14_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/184939/bcc66035-8470-273b-d66a-335d30c895a3.png)

(6) [omikuji]の[program.cs]におみくじの処理コードを記載

```csharp:omikuji-program.cs
        static void Main(string[] args)
        {
            Randomizer.Randomizer RDN = new Randomizer();
            int Number = RDN.GetDiceNumber(6);

            switch (NUmber)
            {
                case 0:
                    Console.WriteLine("大吉");
                    break;
                case 1:
                    Console.WriteLine("中吉");
                    break;
                case 2:
                    Console.WriteLine("有吉");
                    break;
                case 3:
                    Console.WriteLine("吉");
                    break;
                case 4:
                    Console.WriteLine("凶");
                    break;
                case 5:
                    Console.WriteLine("大凶");
                    break;
                default:
                    Console.WriteLine("吉");
                    break;
            }

        }
```

```csharp:Randomizer.cs
  /*
   * param
   * quantity : int
   * size     : int
   * result   : array
   *  1 => Total   : ex. 5
   *  2 => formula : ex. 2+3
   */
  public int getNumber(int quantity, int size)
  {
    string [] result;
    int temporary;
    for ( int i=0; i < quantity; i++) {
      System.Random Randomizer = new System.Random();
      temporary = Randomizer.Next(0, size);
      result[1] += temporary;
      result[2] += temporary;
    }
    return result;
  }
```

(7) 「omikuji」をスタートアッププロジェクトにし、「デバッグ」を実施。
おみくじとして問題なく動作することを確認できたら完成。


# デバッグ時にエラーが発生
クラスライブラリ単体ではデバッグできず、下のようなエラーが表示され、デバッグ処理は実行されない。
![Screenshot_NoName_2017-11-27_0-22-20_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/184939/6005963f-a2e1-841d-221f-4611e1d6b12d.png)

## 解決策
なんらかの出力を実行できるアプリをテンプレートとして、プロジェクトを追加し、[スタートアッププロジェクト]に設定すること。忘れないように。
ESP8266 > Link > 単3電池で340日相当の動作

https://blogs.yahoo.co.jp/bokunimowakaru/55911948.html

> 温度が変化した時にだけ送信を行う手法を用いることで、平均送信間隔140分、単3電池で340日相当の長時間動作が行えることが分かりました。引き続き、1年・365日動作の実現に向けて取り組む予定です。

「温度が変化した時にだけ」送信するという考えは面白い。

データについては毎回送信すると消費電力が大きくなる。

「あるまとまり」でデータを送信するようにして、WiFi使用回数を減らすように実装すれば、長時間動作が可能という例なのだろう。

1秒値は1秒ごとに送信するとグラフの描画などの点ではリアルタイム性が出るが、1秒のリアルタイム性を追及するか、1分ごとでいいから長時間動作する方が良いか、設計思想で異なる。

単4形(AAA)の容量は850-1,300mAhあたり。[Wikipedia](https://ja.wikipedia.org/wiki/%E4%B9%BE%E9%9B%BB%E6%B1%A0)

### リンク

[ESP8266 の消費電流と ARDUINO の 3.3V 出力電流について](https://macsbug.wordpress.com/2015/08/13/esp8266-%E3%81%AE%E6%B6%88%E8%B2%BB%E9%9B%BB%E6%B5%81%E3%81%A8-arduino-%E3%81%AE-3-3v-%E5%87%BA%E5%8A%9B%E9%9B%BB%E6%B5%81%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/) @ macsbugさん
DateTimePickerのお話


jQueryのカレンダーのやつでしょ？
と、思って蓋開けたら、外部ライブラリでした。
それも、圧縮されてるやーつ。。。

minじゃないのが良い！（わがまま）

とりあえず、どんな機能があるのか知りたいので検索するも、なかなか日本語の情報に当たらない。

仕方ないので、公式？Githubの資源より見てみる
・https://github.com/xdan/datetimepicker

ローカルに落とし、```index.html``` を動かしてみる。。。

動かないのかい！！！！

![2017-11-22_11h28_05.png](https://qiita-image-store.s3.amazonaws.com/0/214582/9a0721cf-6991-2e36-60d4-b3af79ea3165.png)

落としたファイルに```yarn.lock``` ってのがあった。

yarn 「やーん」でいいのか？お初です。

パッケージ管理ソフトか。

とりあえず、インスコしパッケージを展開

```
C:\Users\hoge\datetimepicker-master>yarn install
yarn install v1.3.2
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
Done in 1.76s.
```

動かないのかーい！！！！

![2017-11-22_11h46_57.png](https://qiita-image-store.s3.amazonaws.com/0/214582/adaeb108-8bf9-37ff-b1ec-6a16f5021687.png)

やーんっっ！！！

とりあえず、app直下の```jquery.js```を読みたいみたいなので、別ディレクトリにあった```jquery.js```をコピーして動作確認。

consoleエラーも吐いていないので、やっと動いてくれたみたい。

ん、、、

![2017-11-22_11h58_00.png](https://qiita-image-store.s3.amazonaws.com/0/214582/ce1d184a-0270-57c7-912f-8028d99c171d.png)

DateTimePicker Document
・https://xdsoft.net/jqplugins/datetimepicker/

Full options listを参考にしたら、解決しそーだ！

### 課題
・レイアウトの修正 日時大きく
→ cssで修正
・input要素が日と時間で分かれているが、カレンダーは一つで
→ ```onSelectDate``` と ```onSelectTime``` で、なんとかなりそう。
・インライン要素へ
→ ```inline:true```

、、、、``` defaultDate ``` と ``` defaultTime ``` ゆーこと聞いてくれない。

REDME読もう！
UnityからADID・IDFAを取得



■iOSの広告識別子「IDFA＝Advertising Identifier」

■Androidの広告ID「ADID=AdvertisingID」

■実機操作による確認方法
　・Android
　　「設定」->「Google」->「広告」で広告IDを確認

　・iPhone
　　わかんない

●Unity公式のサンプルスクリプト
https://docs.unity3d.com/jp/540/ScriptReference/Application.RequestAdvertisingIdentifierAsync.html


**advertisingId には広告ID**
**enabledにはユーザーが広告IDを使用させるか？の有無が返ってくる**

■自分用にソース

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GetIdfaAndAdid : MonoBehaviour {

    [SerializeField]
    public Text DisplayID;

    // ボタンが押されると呼ばれる
    public void GetID()
    {
        Debug.Log("■■■■■GetID()■■■■■");
        // IDFA
        Application.RequestAdvertisingIdentifierAsync(
                (string advertisingId, bool trackingEnabled, string error) =>
                {
                    Debug.Log("advertisingId=" + advertisingId + " enabled=" + trackingEnabled + " error=" + error);
                    DisplayID.text = "advertisingId=" + advertisingId + " enabled=" + trackingEnabled + " error=" + error;

                }
        );
    }
}

```

■参考URL
https://reviewlog.info/adid-android/
https://reviewlog.info/ios-idfa-reset/
https://stackoverflow.com/questions/34193282/apple-idfa-in-unity-via-plugin

Appleの規約
https://support.apple.com/ja-jp/HT205223
ImageMagick > mogrify > symbolic linkでなくなる

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

### テストデータ作成

100x100のgrayの画像を作成する。

```bash
$ convert -size 100x100 xc:gray gray.jpg
```

symbolic linkを作る。

```bash
$ ln -fs gray.jpg LN-gray.jpg
```

### 処理

処理結果用ファイルをコピーで用意する。

```bash
$cp LN-gray.jpg res.jpg 
```

mogrifyの実行

```bash
$mogrify LN-gray.jpg -resize 200x200 res.jpg
```

この時点でLN-gray.jpgはsymbolic linkではなくなっている。

### 困る点

どのファイルのsymbolic linkなのかの情報が消えるため、「このファイルはどのファイルを基に生成したのか」が分からなくなる。

### 修正点

```bash
$mogrify LN-gray.jpg -resize 200x200 res.jpg
```

ではなく、以下とすることでsymbolic linkのままとなる。

```bash
$mogrify -resize 200x200 res.jpg
```

mogrifyの実行時に`LN-gray.jpg`を入れる必要はなかった。

**ただし、res.jpgがsymbolic linkである場合、symbolic linkでなくなるため、いったん別ファイルにコピーして処理するのが良いだろう。**
(コピーするscriptが残っていれば、どのファイルを基に処理したかは後で追跡できる）。