OmniAICreator/Qiita-1.07M huggingface dataset:
UnityでのPHPとMySQLを使ったマップチップのマップデータの送受信

#最初に
このコードは作者がUnityでマリオメーカーのようなゲームを制作する際に、
データの送受信の方法がイマイチ分からず、
とても時間がかかってしまったのでそのような人たちを少しでも少なくするために記事を作成しました。
#使用ソフト
XAMPP(Apach,MySQL)
PHP編集ソフト（ご自由に 筆者はBrackets
#コード
```Transmission.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using LitJson;

public class network : MonoBehaviour {


    public GameObject networkmanager;

    public int[] mapchip = new int[10 * 10]//縦10横10のマップがあると仮定
      {
            1,1,1,1,1,1,1,1,1,1,
            1,0,0,0,0,0,0,0,0,1,
            1,0,0,0,0,0,0,0,0,1,
            1,0,0,0,0,0,0,0,0,1,
            1,0,0,0,0,0,0,0,0,1,
            1,0,0,0,0,0,0,0,0,1,
            1,0,0,0,0,0,0,0,0,1,
            1,0,0,0,0,0,0,0,0,1,
            1,0,0,0,0,0,0,0,0,1,
            1,0,0,0,0,0,0,0,1,1,
      };


    // Use this for initialization
    public void Start()
    {

        //Debug.Log(mapcreate_.GetArray());

        StartCoroutine(Download());
    }

    // Update is called once per frame
    void Update()
    {

    }

    public IEnumerator Download()
    {

        //データ送信準備
        WWWForm wwwForm = new WWWForm();
       
        //マップチップの送信
        for (int i = 0; i < (10 * 10); i++)
        {
　　　　　　//マップを送信
            wwwForm.AddField("chipnum" + "["  + i.ToString() + "]", mapchip[i].ToString());
        }
        WWW www = new WWW("http://localhost/php/Unity/Transmission.php", wwwForm);
        yield return www;
    }
}

```

```Transmission.php
<?php
$postData = file_get_contents("php://input");
$inputData = json_decode(stripcslashes($postData));
//データベースに接続
$mysqli=new mysqli('localhost','root','');
//データベースの設定
$mysqli->select_db('"自分で作ったデータベース"');
//文字コードの設定
$mysqli->set_charset("utf-8");
//受取リスト
//chipnum[10*10]

//文字列を結合先用の変数
$stringbond="";
$chipnumname="";

//マップチップの数だけ実行
$chipnum=filter_input(INPUT_POST,'chipnum',FILTER_DEFAULT,FILTER_REQUIRE_ARRAY)?:[];

//数を数えて連結
for($i=0;$i<count($chipnum);$i++){
 if(isset($chipnum[$i])){
        $stringbond.=$chipnum[$i].",";
    }
}

//マップチップを保存
$sql=sprintf('INSERT INTO stage SET mapchip="%s"',mysqli_real_escape_string("$stringbond"));
$mysqli->query($sql);

//ステージ番号のカウント
$checkstagenum=sprintf('SELECT MAX(stagenum) AS stagenum FROM stage');
//データベースをセット
$que=$mysqli->query($checkstagenum);
//phpを実行して変数で受け取り
$table= mysqli_fetch_assoc($que);

//変数にチェックした数が入っているので重複してなかったら追加
if($table['stagenum']==0)
{
    //NULLだったら1を入れる
    $sql=sprintf('UPDATE stage SET stagenum="1" WHERE stagenum="0"');
    $mysqli->query($sql);
}
else
{
    $tes=(int)$table['stagenum'];
    //受け取った数プラス1を入れる
    $sql=sprintf('UPDATE stage SET stagenum="%d" WHERE stagenum="0"',$tes+1);
    $mysqli->query($sql);
}

exit();
?>
```
#結果
このような感じに保存されれば成功です
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/135989/898f0332-9770-2c67-71d4-e20920fe3665.png)
#最後に
正確に書こうとするとかなり量が多くなり、
かなり限定的な部分になってしまいましたが、
少しでも役立てていただければ幸いです。
gaのイベントがiphoneから取得できなかった件

#背景
まあまずサイト運営者ならユーザーの把握のために色々な所にgaタグをつっこんで
ユーザ属性や傾向の解析に利用されていると思います。。。

自分の所のサービスでももれなくGoogleAnayticsへイベントデータを送信して
日々改善に役立てているのですが、これまたよくある話でiphoneの端末からのみ
イベントが取れなくてひっかかっちゃった所と解決はしたんだけどいいのかなこの実装ってのを
簡単にまとめてみます。。。

##問題
元々の実装はこんな感じ
`<a href="遷移先URI" onclick="ga(XXXXXXXXXXX);">うひょーiphoneとれねー</a>`

うん、簡単でも悪魔のiphoneはこの実装が嫌いみたい

でiphone以外の端末だと問題なくイベントを取得できたわけですが
iphoneだとなぜかonclickが実行されず、
そのまま遷移先へ飛んでっちゃうという問題が発生しました。
こんな感じで~~iphoneだけとれなくても僕は気にしないの~~すが
修正が必要ということでまずはgaが実行されないなら別JSに分離して
そこで実行させちまおうとなったわけですね。

んでその実装のサンプルがこんなん

```javascript:html
<a href="javascript void(0)" onclick="dummy(Link, eventCategory, eventAction, eventLabel, isTargetBlank);">うひょーiphoneとれねー</a>
```

```javascript:dummy.js
function dummy(Link, eventCategory, eventAction, eventLabel, isTargetBlank) {
		ga(
			'send',
			'event',
			eventCategory,
			eventAction,
			eventLabel,
			{
				hitCallback: function(){
					ga(
						'xxxxxxxxxxxx',
						'event',
						eventCategory,
						eventAction,
						eventLabel,
						{
							hitCallback: function(){
								if (isTargetBlank) {
									window.open(Link);
								} else {
									location.href = Link;
								}
							}
						}						
					);
				}
			}
		);
}
```

リンククリック時に上記jsが実行されてhitCallbackでgaでイベントを送信、
さらに任意のページへ遷移、となるはずでした。

私もそう思っておりました、GA!

ここでまた別の問題が。。。
ChromeなどブラウザによってはhitCallbackの処理での遷移が
ポップアップブロックによって阻まれるという。。。

落ち着け。。。まだ何か手があるはずだ、と探していましたらこちら
http://webtech-walker.com/archive/2010/06/14111405.html
先人は本当に偉大です。。。ありがとうございました。

先人のコードを参考に最終的には以下の形に！

```javascript:html
<a href="javascript void(0)" onclick="dummy(Link, eventCategory, eventAction, eventLabel, isTargetBlank);">うひょーiphoneとれねー</a>
```

```javascript:dummy.js
function dummy(Link, eventCategory, eventAction, eventLabel, isTargetBlank) {

		var w = '';
		if (isTargetBlank) {
			w = window.open('', '_blank');
		};
		ga(
			'send',
			'event',
			eventCategory,
			eventAction,
			eventLabel,
			{
				hitCallback: function(){
					ga(
						'XXXXXXXXXXX',
						'event',
						eventCategory,
						eventAction,
						eventLabel,
						{
							hitCallback: function(){
								if (isTargetBlank) {
									w.location.href = Link;
								} else {
									location.href = Link;
								}
							}
						}
					);
				}
			}
		);
}
```

まあこれで問題そのものの回避はできました、が

クリックイベントの中で非同期処理したあとに別ウィンドウで開くときに
ポップアップブロックに引っかかるのって。。。

他にスマートな回避のしかたないんですかね？

最期までご拝読ありがとうございました。
よろしければご意見等いただければ幸いです！
Windows バッチファイルの引数とパス名要素分解、対話入力、文字列置換まとめ

今更ながら Windows のバッチファイル引数と変数についてまとめました。

## バッチファイルの拡張子
引数の説明に入る前に、バッチファイルの拡張子について。
Windowsではバッチファイル用に次の2つの拡張子が用意されています。

- .BAT --- MS-DOS 時代からの伝統的な拡張子
- .CMD --- WindowsNT 系で使える拡張子

MS-DOSやMS-DOSから起動するWindows95/98/Me上では、後者の.CMD拡張子はバッチファイルとして実行できないので、MS-DOS環境でも実行したいバッチ処理は.BATを、NT環境専用のバッチ処理は.CMDをつけて使い分けます。
ただし、現時点(2016年)においてはMS-DOSやWindows95系は退役しているので、もはや意味のない使い分けになりました。好きなほうの拡張子を使えば良いです。あるいは、一時的な作業バッチと恒久的な作業バッチで拡張子を使い分ける運用をしても良いでしょう。
例: ```*.CMD```を一時作業用に割り当て、作業終了時に ```del *.CMD ``` で用済みファイルを片付ける。

## コマンドライン引数
バッチファイルを次のように呼び出した場合
```
C> バッチファイル名 引数1 引数2 引数3
```
3つの引数はバッチファイル内で ``` %1 %2 %3 ``` として参照できます。```%*``` なら3つまとめて参照できます。
```SHIFT [/n]``` によりn番目以後の引数番号をずらせます。

```bat:argtest.bat
@echo off
echo arg1: %1
echo arg2: %2
echo arg3: %3
echo arg*: %*
shift
echo arg1: %1
echo arg2: %2
echo arg3: %3
echo arg*: %*
```
``` 実行例.
C>argtest A B C
arg1: A
arg2: B
arg3: C
arg*: A B C
arg1: B
arg2: C
arg3:
arg*: A B C
```
 
## 引数をパス名として分解、加工する
引数の引用符を外したり、さらにファイル名としてフルパス展開やドライブ名や拡張子の各要素に分解したり、属性や更新時刻やファイルサイズに置換できます。詳しくは ``` help for ``` で調べてください。

```bat:argtest.bat
@echo off
echo arg1: %1
echo arg~1: %~1
echo arg~f1: %~f1
echo arg~d1: %~d1
echo arg~p1: %~p1
echo arg~n1: %~n1
echo arg~x1: %~x1
echo arg~a1: %~a1
echo arg~t1: %~t1
echo arg~z1: %~z1
```

``` 実行例.
C>argtest "argtest.bat"
arg1: "argtest.bat"
arg~1: argtest.bat
arg~f1: C:\Users\hkuno\mybin\argtest.bat
arg~d1: C:
arg~p1: \Users\hkuno\mybin\
arg~n1: argtest
arg~x1: .bat
arg~a1: --a--------
arg~t1: 2016/12/09 10:44
arg~z1: 260
```

## 対話入力
コマンドライン引数ではなく、バッチファイル実行中に対話入力したい場合は ```SET /P 環境変数=[プロンプト文字列]``` でユーザ入力を環境変数に設定できます。

``` バッチファイル.
set /p ANS="input string:"
echo ANS: %ANS%
```

``` 実行例.
input string:hello
ANS: hello
```
## 文字列置換
引数を環境変数に代入すれば、文字列置換を行うことができます。

```bat:バッチファイル.
set /p ANS="input date:"
echo ANS               : %ANS%
echo replace / to _ ANS: %ANS:/=_%
```

``` 実行例.
input date:2016/12/9
ANS               : 2016/12/9
replace / to _ ANS: 2016_12_9
```

## 組み込み環境変数
バッチファイル内で参照できる組み込み環境変数にて、カレントディレクトリ名や日付時刻などが参照できます。
詳しくは ``` help set ``` で調べてください。

``` SETのHELP出力から抜粋.
%CD%            - 現在のディレクトリ文字列に展開します。

%DATE%          - DATE コマンドと同じフォーマットで現在の日付に展開します。

%TIME%          - TIME コマンドと同じフォーマットで現在の時刻に展開します。

%RANDOM%        - 0 から 32767 の間の任意の 10 進数に展開します。

%ERRORLEVEL%    - 現在の ERRORLEVEL の値に展開します。

%CMDEXTVERSION% - 現在のコマンド プロセッサ拡張機能のバージョン番号に
                    展開します。

%CMDCMDLINE%    - コマンド プロセッサを起動したオリジナル コマンド ライン
                    に展開します。

%HIGHESTNUMANODENUMBER%
                  - このコンピューター上の最大の NUMA ノード番号に展開します。
```

## 参照
Windowsのコマンドプロンプトから下記を実行する。

```
help set
help for
help if
help shift
help cmd
```
バッチファイルの引数や変数についての有用情報が各コマンドのhelpに分散しているので、気付いたものを随時このページにまとめていく。
GCP勉強会レポート（AWSとの比較など）

## はじめに
先日GCPの勉強会に参加したので、復習がてらレポートを書いてみました。私自身は、AWSは日常的に使っているが、GCPにちゃんとさわるのは今回の勉強会がほぼ初めてという状況です。少し前に書いたものなので、先日のAWS re:Inventの内容を反映してアップデートしたいです、、

## AWSとの比較

データ分析はGCPの方が強い、インスタンスはAWSと同程度での使いやすさで、デプロイはまだ機能が足りない、データ分析をコアとするサービスならAWSから移行する価値があるという感じでした。あと、地味にロードバランサーの機能が豊富そうです。
管理画面については、GCPの方が使いやすそうでした。（機能がまだAWSより少ないからかもしれませんが）Googleらしく、ウェブブラウザでインフラエンジニアの仕事をすべて完結させたいという思いを感じました。
コンテナに複数のバージョンを用意して、比率を指定して振り分けることができるという機能があり、A/Bテストに使えそうでした。

## 機械学習

カスタマイズのレベルに応じて、TensolFlow(OSS) / cloud machine learning / 各種API（画像認識・翻訳など）の各サービスがあります。cloud machine learning上でhyper parametersの調整をして、それをTensolFlowに渡して学習精度を上げるといったことができます。
実際に機械学習を実用するには、データを整備することと機械学習に対する理解を深めることが必要だと思いました。クレカの不正利用検知などの事例もあり、セキュリティ関連はこれからは機械学習の知見を応用する時代になりそうだと感じました。

## 各サービスについて
- Dataproc（Hadoop/Sparkサービス）・Nearline（AWSのGlacier storageのようなアーカイブストレージ）AWSにも同様なサービスはあるが、クラスタの立ち上げが速い、レイテンシが小さいというように改良されている。
- Stack driver（サーバーモニタリングツール） AWSとGCPの両方に対応している。取得できる情報が多い。
- Kubernetes（Docker管理） 運用の機能もあるDocker Composeという感じ。
- Firebase バックエンドの機能をクラウドサービスとして提供してくれる。個人的にとても面白そうでした。

## 所感
大きな技術トレンドとして、細かい単位でいかに速くプロダクトを改良していくかという流れと、機械学習のアプリケーション応用が本格的に始まるという２つの流れを感じました。GCPもそのトレンドを踏まえて開発されており、AWSと比較して動作がスピーディであること、データの蓄積や分析に強いことが印象的でした。
Redis用のWeb管理画面を調査して導入してみた

#■これをやった経緯
* 担当プロダクトで、Redisのキャッシュデータが残ってしまい、困ることがあった
* そのデータを削除するだけで、対応できる問題が起こった
* わざわざ、会社来るのめんど(y・・・
* だったらVPNとかでも、スマホで対応できてしまえば良くない？ってことでWEBの管理画面入れてみようってことで調べてみました

#■どんなものがあるか
####その他にもあるみたいだけど、それ以外は除外しました。下記がある程度有名？みたい。
- [Redsmin](https://www.redsmin.com/)
    - なんかユーザ登録が必要？
    - 無料だと、制限があって、有料プランとかもあるけどいらない。
- [Redis-Commander](http://joeferner.github.io/redis-commander/)
    - Node.js製
    - インストールも簡単だし、CLIも使えるから便利そう
- [Redmon by steelThread](http://steelthread.github.io/redmon/)
    - Ruby製
    - こっちもインストール簡単、CLIも使えそう
- [redis-browser: Web-based Redis browser that can work as standalone app or mounted Rails engine](https://github.com/humante/redis-browser)
    - Ruby製
    - CLIが使えないみたいだが、シンプルなツール
- [phpRedisAdmin: Simple web interface to manage Redis databases.](https://github.com/ErikDubbelboer/phpRedisAdmin)
    - PHP製
    - CLI使えない
    - 開発環境ではこれを使ってた。キー数とか多くなると重い・・・ので不採用
- [Redis React](https://github.com/ServiceStackV3/mythz_blog/blob/master/pages/381.md)
    - React使ってて、ナウいけど、画面が微妙な感じ
    - CLI使えないっぽい

#■いくつか触った
##Redis-Commander
* インストール簡単だし、CLI使えるから導入してみたけど、デーモン化するとCLI使えなかった・・・デーモン化のやり方が悪い？
* なんどか試したけど、無理だったので不採用

##phpRedisAdmin
* php製で導入しやすそうだったので、入れてみたけど、やっぱりキー数が多くて重い・・・ので不採用
* CLIもないし。。。

##Redsmin
* StackOverFlowかな？で褒められてたので、入れたかったけど、ユーザ登録とか必要だし、めんど(y なので、不採用

##Redmon
* 結局、これにしました！
* インストール簡単、CLI使える、DashboardでSlowクエリも見れるし、便利！
* スマホでもなんとか動きました！

#■まとめ
* RedisのWEB管理ツール結構いっぱいあるよ！
* でも、適当に選ばず、利用する環境とか、やりたいことによって選んだほうが良い。
* キャッシュデータくらいで、会社に行かなくて良くなるなら入れた方がいいっしょ！
PHPプロジェクトにおけるCircle CIの設定


## 基本構成

circle.yml というファイルをプロジェクトルートに置いて管理する。

https://circleci.com/docs/configuration/

この設定ファイルは大きく6つのエントリからなり、それぞれ以下を担うとのこと。

- machine: adjusting the VM to your preferences and requirements
- checkout: checking out and cloning your git repo
- dependencies: setting up your project’s language-specific dependencies
- database: preparing the databases for your tests
- test: running your tests
- deployment: deploying your code to your web servers

各セクションは、`pre`/`override`/`post`のセクションで実行するbashコマンドを指定できる。 

pre: commands run before CircleCI’s inferred commands
override: CircleCIがデフォルトで実行する予定のコマンドを置き換える
post: commands run after CircleCI’s inferred commands


## PHP の設定

https://circleci.com/docs/language-php/

### Machine 

`Ubuntu`が用意される模様。

version にてPHP構成の指定が可能

````
machine:
  php:
    version: 7.0.4
````

利用可能なバージョンは https://circleci.com/docs/build-image-trusty/#php を確認

`machine.environment`の下にマップを置いて環境変数の定義も可能 

### dependencies

基本的には `composer install` が流れる。

PECL 等で拡張機能の導入が可能。

````
dependencies:
  pre:
    - pecl install mongo
````

php.iniの変更も以下の様な形で行える。

````
dependencies:
  pre:
    - cp config/custom.ini /opt/circleci/php/$(phpenv global)/etc/conf.d/
````

````
dependencies:
  pre:
    - echo "memory_limit = 64M" > /opt/circleci/php/$(phpenv global)/etc/conf.d/memory.ini  
````

### database 

色々なDatabaseが使えるとのこと。

### test

phpunit が走る。
re:dashのGoogle Analyticsデータソースを試す

re:dashの[1.0ではデータソース（接続先）としてGoogle Analyticsが追加される予定](https://github.com/getredash/redash/issues/800) なので、それの機能を一足先に試します[^1]。
[^1]: 1.0.0-rcには含まれておらずmasterにしか含まれていませんでしたが、現時点の最新版では利用できます。


### 構築手順

docker-compose を利用した構築手順は変わらないです。
ただしmasterのソースでredash Imageをビルドして、そのImageを使うようにします。

```
sudo docker build -t redash:master
```

Docker Iamgeをビルドして、docker-compose.yamlをビルドしたImageを利用するようににへの変更します。

### 設定

#### Google Developer Console

[オープンソースのデータ可視化ツールのre:dashでらくらく分析共有 その３ 〜 Google Spreadsheets編](http://qiita.com/wapa5pow/items/312686403700a8e454df) と同様に1〜3の手順を行います。

#### Google Analytics

[ユーザーの追加、変更、削除](https://support.google.com/analytics/answer/1009702?hl=ja)を参考に、Google Analyticsの管理画面にてサービスアカウントのCredential JSONのclient_emailのメールアドレスを権限を付与するユーザーとして追加します。
その際に設定するプロパティのアクセス許可は、表示と分析を設定します。


#### re:dash

現時点でのmasterではre:dashのDefaultのQuery Runnerとして設定されているため特に設定は不要で使えます。

通常通りデータソースの追加で、先ほど作成取得したサービスアカウントのCredential JSONをアップロードするだけです[^2]。

![redash_settig_ga.png](https://qiita-image-store.s3.amazonaws.com/0/17814/fdcfb2e3-29a2-29ca-2133-42ba41dcc7a9.png "redash_settig_ga.png")

[^2]: これもGoogle Spreadsheetsをデータソースとして利用する場合と同様です


### 実行

[Query Explorer](https://ga-dev-tools.appspot.com/query-explorer/?hl=ja)を利用しつつ、どんな条件のクエリを実行した良いか確認します。
Query Explorerで表示されるDirect link to this ReportのQueryString部分(?から後の文字列)を直接re:dashのクエリとしても利用できます[^3]。
![モザイク後Query画面.png](https://qiita-image-store.s3.amazonaws.com/0/17814/4f72e295-f345-cb2f-3cc6-e2797b3646be.png "モザイク後Query画面.png")
[^3]: 以降に書かれている ga:XXXXXXXX は適切なものに置き換えてください。


クエリ部分は以下のように、URLエスケープをしていない文字列でも実行可能です。

```
?ids=ga:XXXXXXXX&start-date=2016-11-01&end-date=yesterday&metrics=ga:sessionDuration,ga:pageviews,ga:exits&dimensions=ga:source&filters=ga:medium==organic
```

また、クエリはJSON形式でも記述できるため以下のように書くこともできます[^4]。

```
{"ids":"ga:XXXXXXXX",
"start_date":"2016-11-01",
"end_date":"yesterday",
"metrics":"ga:sessionDuration,ga:pageviews,ga:exits",
"dimensions":"ga:source",
"filters":"ga:medium==organic"}
```

[^4]: JSON形式の場合ではKey名に-が含まれる場合は、_に書き換える必要があります。

### まとめ

[Google Analyticsの情報をダッシュボード「Re:dash」で可視化する](http://qiita.com/KeitaMoromizato/items/fe37ed75816554a6be54)で行っていたようなことはre:dashだけで実現できるようになります。
![GA結果2.png](https://qiita-image-store.s3.amazonaws.com/0/17814/59fe69f1-1518-a9f3-7a0b-1df4a9100554.png)
FileAPIでJavascriptを使ったファイル操作


FileAPIを利用するとJavascriptを利用してファイルの中身を取得する事が出来ます。
 
各種ブラウザの実装状況は caniuse から確認可能です。

http://caniuse.com/#feat=fileapi

## File API を利用する

FileAPIに対応したブラウザでは、`input[type=file]`のHTML要素からFileオブジェクトを取得する事が出来ます。

DOMのオブジェクトにfilesというキーが生えており、ココに配列形式でFileオブジェクトが格納されている形になります。
(input[type=file]では`multiple`プロパティを指定して複数ファイルの選択が可能) 

### jQuery で利用する場合

jQuery ではinput要素を選択する事で、DOMを取得できます。

````
$("input[type='file']")[0].files
````

イベントで利用する際には、eventオブジェクトのtarget属性からデータを取得します。

````
  $("#fileForm").on("change",function(e){
    console.log(e.target.files[0])
    console.log(this,e);
  })

````

Fileオブジェクトを利用するとファイルに関する様々な情報が取得可能です。

- lastModified: 最終更新日時
- name: ファイル名
- size: ファイルサイズ
- type: mime型

Fileの中身そのものを読み取るには、非同期のFileReaderを利用する必要があります。

## File Reader でファイルを取得する

ファイルの読み込みは非同期に行われ、readerオブジェクトに登録したイベントから読み込み完了後のイベントを取得します。

````
var reader = new FileReader();
    reader.onload = function(event) {
        console.log(event.target.result)
    }
    reader.readAsDataURL(file);
````

readerオブジェクトのイベントは、onloadの他にも様々なものがあります。

- onabort : 読み込み処理が中断された際にイベントが発火
- onerror : 読込中にエラーが生じたときにイベントが発火
- onload : 読込が成功したときにイベントが発火
- onloadstart : 読込が開始されたときにイベントが発火
- onloadend : 成功・失敗に問わず読込が終了したときにイベントが発火
- onprogress : ファイルの読込中にイベントが発火

各イベントでは、targetプロパティからreaderオブジェクトを参照することができ、各種プロパティを参照することでファイルの読み込み状態を参照可能です。

- error : ファイルの読込中に発生したエラー
- readyState : 状態変数を格納するプロパティ(0: 読み込み前、1: 読込中、2:処理終了)
- result : 読み込み完了後に有効となるファイルのコンテンツを格納するプロパティ

ファイルの読み込みは`readAsDataURL()`メソドにfileオブジェクトを渡して行います。

データは`result`プロパティにdataURL形式で格納されます。

生のテキストデータを取得するための`readAsText`,生のバイナリデータを取得するための`readAsArrayBuffer`などのメソドも利用可能です。

ファイルの読み込みを中断するには`abort`メソドが利用可能です。

## 参考

- https://developer.mozilla.org/ja/docs/Web/API/FileReader
【Python入門】list sizeでリストのサイズを取得する方法

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。


参考サイト：[【Python入門】list sizeでリストのサイズを取得する方法](http://programming-study.com/technology/python-list-size/)

#【Python入門】list sizeでリストのサイズを取得する方法

Pythonでリストを扱っていると、そのリストのサイズ（長さ）を知りたくなる時があります。Pythonならリストの長さも関数を使うことで簡単に取得が可能です。今回は1次元リストおよび多次元リストのサイズを取得する方法について解説します。

目次
1 [for文でリストのサイズを取得する](##for文でリストのサイズを取得する)
2 [len関数でリストのサイズを取得する](##len関数でリストのサイズを取得する)
3 [len関数で多次元リストのサイズを取得する](##len関数で多次元リストのサイズを取得する)
4 [count関数で指定した要素の数を取得する](##count関数で指定した要素の数を取得する)

##for文でリストのサイズを取得する

リストのサイズを取得する最もオーソドックスなやり方はfor文を使ったやり方です。

```
list1 = ['python', 'list', 'length']
length = 0

for x in list1:
    length += 1
     
print('list1の長さは{}です'.format(length))
```

実行結果
>list1の長さは3です

Pythonのfor文ではリストから要素を一つずつ取り出すことができるので、カウンタ変数（この例ではlength）を用意して、そのたびにカウンタ変数の値を1プラスしていくことでリストのサイズを取得できます。

##len関数でリストのサイズを取得する

さきほどfor文を回すことでリストのサイズを取得する方法を解説しました。その方法でもサイズを取得できますが、Pythonではもっと簡単に長さを取得することができます。それがlen関数を使う方法です。len関数の構文は以下の通りです。

```
変数 = len(リスト)
```

len関数は引数で渡されるリストの長さを返す関数です。lenを使うことで、たった一行でリストの長さを取得可能です。

```
list1 = ['python', 'list', 'length']
length = len(list1)

print('list1の長さは{}です'.format(length))
```

実行結果

>list1の長さは3です

ソースコードが非常にスッキリしましたね。for文を使う方法も特別複雑ではありませんが、やはりlen関数を使ったほうがスッキリします。

##len関数で多次元リストのサイズを取得する

さきほどは1次元のリストのサイズを取得しましたが、時には2次元以上の多次元のリストのサイズを取得したいこともあります。1次元の場合はfor文を使っても問題ありませんでしたが、多次元のリストの場合はfor文だけで取り出そうとするとかなり複雑になってしまいます。

多次元リストのサイズを取得するときはlen関数とfor文を組み合わせることになります。1次元と比べると少し複雑ですが、それでもlenを使うことで比較的少ないコード量でサイズを取得することができます。

今回は例として以下のような2次元のリストの長さを取得します。

```
list1 = [['python', 'list'], ['length', 'two', ' demension']]
```

まず、このリストに普通にlen関数を適用してみます。

```
list1 = [['python', 'list'], ['length', 'two', ' demension']]
length = len(list1)
 
print('list1の長さは{}です'.format(length))
```

実行結果

>list1の長さは2です

このやり方ではサイズが2となってしまいました。list1は[‘python’, ‘list’]という要素と[‘length’, ‘two’, ‘ demension’]という要素、合わせて2つの要素を持つ1次元のリストとみなされているからです。

2次元のリストのサイズを正しく取得するには、各要素のサイズを取得し、それを足し合わせる必要があります。つまり、各要素をlen関数に渡し、その結果を足し合わせれば全体のサイズを取得できます。

```
list1 = [['python', 'list'], ['length', 'two', ' demension']]
length = 0

for x in list1:
    length += len(x)  #取り出した要素の長さを足していく

print('list1の長さは{}です'.format(length))
```

実行結果

>list1の長さは5です

これで正しく全体のサイズを取得できました。3次元以上も、基本的にはこのようにlenをfor文内で使って各要素のサイズを取得することで、全体のサイズを取得できます。

##count関数で指定した要素の数を取得する

リストのサイズを取得する方法はプログラミング言語によって異なりますが、言語によっては「count」という関数で取得するものがあります。Pythonではcount関数はリストの長さではなく「指定した特定の要素の数」を取得できます。countもよく使う関数なので、この機会に使い方を覚えてしまうとよいでしょう。countの構文は以下の通りです。

変数 = リスト.count(オブジェクト)

count関数は、引数に指定したオブジェクトがリストの中にいくつあるかを返します。

```
ist2 = [1, 3, 4, 5, 1, 2, 1]
count_one = list2.count(1)

print('list2の中に1は{}個あります'.format(count_one))
```

実行結果

>list2の中に1は3個あります

ちなみに、指定したオブジェクトがリストの中に1つもない場合は自動で0を返します。

```
list2 = [1, 3, 4, 5, 1, 2, 1]
count_one = list2.count(6)

print('list2の中に6は{}個あります'.format(count_one))
```

実行結果

>list2の中に1は0個あります
あるディレクトリ以下のファイルとディレクトリのパーミッションを一括で変更する

グループの書込権限を付与する。

```
$ find ./ -type d -print0 | xargs -0 chmod 775
$ find ./ -type f -print0 | xargs -0 chmod 664
```

いつも忘れる。
AWSのサービスでないでしょうか！

はじめて記載させて頂きます。
AWSのサービスでシステムを構築しています。
スマホ系のアプリです。

AWSの構成として、以下のサービスを利用して運用しています。
ELB
EC2×2
RDS
S3

EC2は2台で分散処理を実施しています。
EC2内にはJavaのプログラムが稼動しています。
分散処理を行っている関係で同期処理をどのように実装すべきか検討しています。
スマホの入力画面にはボタン制御ができないため、連打も可能になっています。
仮にAというボタンを押した後に続けてBというボタンを押したときに、
AボタンはEC2の1台目、BボタンはEC2の2台目と振り分けた場合にBボタンのがさきに
処理されてしまうことがあります。Javaの方でDBでロック処理を実装し、同期処理
を実装する以外にないのでしょうか。

AWSのSQSなどは有効なのでしょうか。
お知恵を拝借したいです。
よろしくお願い致します。
[iOS]MetalでGPUコンピューティング(6) MTLCommandQueue


この記事は、Metal Advent Calendar2016の9日目です。

これまで、MetalのGPUコンピューティングについて解説記事を書いてきました。
[[iOS] MetalでGPUコンピューティング (1) 最小限のコードの記述と特性の把握](http://qiita.com/yuky_az/items/ece9b64befc635e89f1a)
[[iOS] MetalでGPUコンピューティング (2) 群知能](http://qiita.com/yuky_az/items/ce5920f28c08e743418b#_reference-cc4434da198d861bba61)
[[iOS] MetalでGPUコンピューティング (3) MTLDevice](http://qiita.com/yuky_az/items/1992daff208223468e70)
[[iOS] MetalでGPUコンピューティング (4) MTKView](http://qiita.com/yuky_az/items/a2556edcfa417b7d912c)
[[iOS] MetalでGPUコンピューティング (5) MTLLibrary](http://qiita.com/yuky_az/items/fd777dfde0bdef85861e)
 本記事では、前回に引き続きAppleが提供するサンプルコードの解説を行います。

扱うサンプルコードは、前回と同じ[ライフゲーム](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0)のアプリ、MetalGameOfLifeです。
 [MetalGameOfLife](https://developer.apple.com/library/content/samplecode/MetalGameOfLife/Introduction/Intro.html)

![IMG_5933.PNG](https://qiita-image-store.s3.amazonaws.com/0/35297/fa9b4e62-91a6-83fb-c60c-3666fc44fdf1.png "IMG_5933.PNG")
（実行画面）

今回は、サンプルコード内の[MTLCommandQueue](https://developer.apple.com/reference/metal/mtlcommandqueue)について解説を行います。
MTLCommandQueueはコマンドバッファ（MTLCommandBufferのオブジェクト）の[キュー](https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A5%E3%83%BC_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF))です。また、MTLCommandBufferのオブジェクトの生成にも用いられます。
コマンドバッファはGPUに引き渡されるエンコードされた命令を格納しています。

MTLCommandQueueはクラスではなくプロトコルです。
コマンドキューはスレッドセーフで、複数のコマンドバッファを同時にエンコードすることができます。

繰り返しになるのですが、このサンプルコードは、主に以下のファイルで構成されています。

AAPLRender.h
AAPLRender.m
AAPLViewController.h
AAPLViewController.m
Sharder.metal

このうち、AAPLRender.mには並列コンピューティング及び描画のCPU側のロジックが、Shader.metalには頂点シェーダー、フラグメントシェーダー、GPUコンピューティング用のシェーダーが書かれています。

ここからは、サンプルコード内におけるMTLCommandQueueの使用箇所を解説していきます。
AAPLRender.mに以下の記述があります。

```Objective-C:AAPLRender.m
@property (nonatomic, strong) id<MTLCommandQueue> commandQueue;
...
_commandQueue = [_device newCommandQueue];
```

MTLDeviceのnewCommandQueueメソッドにより、コマンドキューオブジェクトが生成されています。コマンドキューはmakeCommandQueue(maxCommandBufferCount:)メソッドでも生成することができますが、この場合は格納される未実行のコマンドバッファ数の上限が設定されます。

コマンドバッファはその都度何度も生成しますが、コマンドキューの生成はアプリの起動時に一回行えば十分です。

また、以下のコードでは、コマンドバッファからコマンドキューの生成を行なっています。

```Objective-C:AAPLRender.m
id<MTLCommandBuffer> commandBuffer = [self.commandQueue commandBuffer];
```

コマンドバッファの生成は、commandBufferメソッド、もしくはcommandBufferWithUnretainedReferencesメソッドで行います。commandBufferメソッドは、内部で使われるリソースに対して強参照であるに対して、commandBufferWithUnretainedReferencesメソッドは強参照ではありません。たいていの場合は、commandBufferメソッドが用いられます。

コマンドバッファの生成後、これに対してGPUコンピューティングの設定、及びレンダリングの設定が為されて、コマンドバッファが実行（commit）されます。

```Objective-C:AAPLRender.m
[self encodeComputeWorkInBuffer:commandBuffer];
    
[self encodeRenderWorkInBuffer:commandBuffer];

[commandBuffer commit];
```


このように、MTLCommandQueueはコマンドバッファを管理する役割を担っています。

今回はライフゲームのサンプルコード内におけるMTLCommandQueueの解説を行いました。
次回以降、さらに他の箇所についての解説を行なっていきます。
CentOS7の仮想環境にPHP7.1とComposerを導入する

## 環境
macOS Sierra 10.12

## リポジトリ追加
```bash
yum install epel-release
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

## PHP7.1をインストール
```bash
yum install --enablerepo=remi,remi-php71 php php-devel php-mbstring php-pdo php-gd
```

## Composerをインストール
```bash
curl -sS https://getcomposer.org/installer | php
mv /usr/local/src/composer.phar /usr/local/bin/composer
```

## composerコマンドが実行できない場合
```bash
export PATH=$PATH:/usr/local/bin
echo $PATH
```
SQL Server インストール

# H/W 
## ファームウェアのバージョン
- 以下のバージョンが最新となっているかを確認。ファームが最新になっていないことで、高負荷時に SQL Server 側でエラーが発生する可能性がある。 
    - RAID コントローラーのファーム / デバイスドライバーのバージョン 
    - BIOS のバージョン 
    - ディスクのファームのバージョン

## CPU のコア数とクロックのどちらが重要になってくるか 
- 並列処理が効果的に実行されている場合は、コア数の多さが強く影響してくる 
- 単一のコアの CPU 使用率が高い場合などは、CPU のクロック数が強く影響してくる 

## NW 性能 
- 大量のデータ送信等で 1Gbps のネットワークの帯域が枯渇しないか 
 - 特にバックアップのトラフィックには注意する。必要に応じて 10Gbps 以上の N/W の準備 

## バスの帯域 
- 高速なディスクを搭載する場合、バスの帯域がディス性能以下になっているということはないか 
 
# インストールバージョン 
- インストールする SQL Server のサービスパック / 累積修正プログラムの確認 
    - [SQL Release Services Blog](http://blogs.msdn.com/b/sqlreleaseservices/)
    - WSUS でサーバーの修正プログラムの管理を実施している場合、SQL Server の最新の CU が適用対象となる 
        - SQL Server の製品の「更新」で最新の CU が適用される 
 
# インストールパラメーター 
## インスタンス
- インスタンス (既定のインスタンス / 名前付きインスタンス) が要件に合ったものとなっているか 

## ポート
- SQL Server が使用するポートが要件に合ったものとなっているか 

## 照合順序
- 照合順序が要件に合ったものとなっているか
    - OS のシステムロケールによって、SQL Server インストール時に選択されているデフォルトの照合順序が変化する
        - OS の言語ではないため、英語版 OS でもシステムロケールを日本語設定にしていると日本語の照合順序が選択された状態になる
    - 照合順序によって非 Unicode 文字列のコードページが変わるため、日本語を格納する必要な場合は Japanese を使用する
    [コード ページのアーキテクチャ](https://technet.microsoft.com/ja-jp/library/ms186356(v=sql.105).aspx)
  - 日本語の最新の照合順序は XJIS_100
   - サロゲートペアの文字列の文字列操作を最新にする場合は「SC」照合順序を使用する 
     - XJIS では、サロゲートペアの文字列操作には対応していないため、最新の文字列操作に対応するためには SC の照合順序の利用を検討する
     - SC の照合順序を使用しているとレプリケーションの設定ができない。
     [Instance Collations with Supplementary Character option lead to a failure when Trying to enable distributor in SQL Replication](https://connect.microsoft.com/SQLServer/feedback/details/833789/instance-collations-with-supplementary-character-option-lead-to-a-failure-when-trying-to-enable-distributor-in-sql-replication) 
  - SQL Server v.Next で XJIS_140 が追加されている
   - https://msdn.microsoft.com/ja-jp/library/mt788653.aspx  
  - バイナリの照合順序の最新は BIN2
     - BIN は下位互換のため使用しない 

## ディレクトリ構成 
- ユーザーデータベースディレクトリ 
- ユーザーデータベース ログディレクトリ 
- tempdb ディレクトリ 
  - CPU コア数にもよるが、tempdb のデータファイル数は 32 を上限とし、CPU コアの 1/2 ～1/4 を設定
  - SQL Server 2016 では、CPU のコア数または、8 のいずれか小さい方に自動的に分割される
  - SQL Server 2016 では ERRORLOG に tempdb の情報が出力される 
- データルートディレクトリ 
  - 以下が配置される 
   - システムデータベース 
   - ERRORLOG / デフォルトトレース等のログ 
   - インスタンス ID がディレクトリ名に含まれる 
- バックアップディレクトリ
 - バックアップファイルのデフォルトのパス
TODOは「覚えない！」デキる人ほどやっているTODO管理法「GTD」と、その応用法とは？

TODO管理って特に働いている人にとっては重要なスキルですよね。
TODO管理手法の中でも10年以上にわたって愛されている「GTD」という手法があります。
「GTD」とは一体何なのか、その解説と、実践者が語る「応用法」を教えます！

**※この記事は以前Rettyニュース内で公開された内容を、一部編集しています。**

# 「GTD」のポイントは「TODOを書き出すこと！」

GTDとはどういうものでしょうか？概要とポイントを整理してみましょう。

>心理的な負担を減らしながら個人の生産性を上げることを主眼とし、簡単な5つのステップを実行することによって成し遂げたいことを現実にするメソッドである。
>基本はなすべき仕事のリストを何かに記録しておくことで、頭の中からなすべき仕事のことを追い出すことである。
>これで頭の中はすべき仕事全部を覚えなくてもよくなりすっきりとし、リストに基づき実際の仕事をこなすことに集中できる。
>〜Wikipedia「Getting Things Done」より〜
 

つまり、TODOを覚えないことが大切なのです。 では具体的に何をするのかを見て行きましょう。

# 「GTD」はこの5ステップをやれば大丈夫！

GTDは下記の5ステップが必要です。

>収集：頭の中にある「やらなければならないこと」「気になっていること（問題）」を紙などに書き出す。作業中のメモ書きなども参照して、問題点を出していく。
>処理：書き出した内容を、手順に添って、分類しリスト化する。
>整理：リストを自身がスケジュール管理に使っているツール（PDAやシステム手帳など）に入れ込む。
>見直し：自分の状況や状態でそれらが可能かどうか見直し、検討する。
>実行：リストアップした「出来ること」を順次片付ける。
>〜Wikipedia「Getting Things Done」より〜



頭にTODOを置いておくと、ふと「あ、あれやらなきゃ」と思い出す… そういうことがストレスになってしまうんです。

なのでまずはTODOを「書き出す」。 そのあとに「分類」して「整理」をして、自分が普段使うTODO管理ツールにタスクを入れていきます。

ポイントは定期的に「見直す」ことです。 実際に見てみると「これは今日やらなくて良い」というタスクに気づいて、目の前のタスクに集中できるようになるのです。

そしてTODOを絞れたらあとは「実行」していくのみです！

# 具体的にどうやるべきか……経験者に聞いてみた！

5ステップと言われても、実際に何をやるべきなのか…？ということで、実際に「GTD」を実践しているWebディレクターのAさんにお話を聞いてみました。

### TODO管理のツールはスプレッドシートを活用！

<img src="https://img.retty.me/img_pickup_feature_old/2015/07/todo_41.png" style="width:400px;height:auto;">

>Aさん「僕はGoogle Appのスプレッドシートを活用していますね」

実際にAさんがTODO管理をつけているスプレッドシートを拝見すると 「タスク」「ステータス」「カテゴリ」「場所」「期限」という項目が。 実際にタスクが出てくると、この項目を埋めていくんだそうです。

「ステータス」では「カレンダー」（日付が確定しているタスク）「スケジュール済み」（何時にやるかが決まっているタスク）「いつかやる」「ゴミ箱」といった形で、管理していました。

また「カテゴリ」をAさんはプロジェクト名で管理していましたが、各々管理しやすいカテゴリを設定してみると良さそうです。

### タスクの見直しは1〜2時間ごと！

>Aさん「あと1〜2時間に1回くらいの頻度でタスクの見直しをします」

実際のスケジュールや空き時間を見て、今日できるタスク、明日でも大丈夫なタスクを逐次振り分けているそうです。 振り分けると言っても、「期限」の日付を変更するだけ！

### 「場所」には人の名前を入れると便利！

>Aさん「『場所』という項目は、あまり僕が外に出ないので、人の名前を入れたりしますね。」

例えば今ミーティングで居ない人に確認を取りたいといった時には、 人の名前を入れることで、それを忘れないようにできるそうです。

### ソートをすると、GTDの威力が発揮される！

<img src="https://img.retty.me/img_pickup_feature_old/2015/07/todo_5.png" style="width:400px;height:auto;">

>Aさん「もちろんスプレッドシートはソートできるようにしてあります。その人がミーティングや外出から帰ってきたら、その人の名前でソートをして、今やるべきタスクを洗い出せたりするんで便利ですよ！」

ソートによって「今日やるタスク」「カテゴリごとのタスク量」などが直感的にわかるようになるそうです。

###PCがさわれない時はメールでタスクをメモ

>Aさん「基本的に仕事はPCでやっているのでスプレッドシートで問題ないのですが、外出時にタスクが発生した場合は、自分のメールアドレス宛にタスクをメールを送っちゃいます」

タスクをメモしても忘れてしまうことがあるので、 メールで送っておくと確実に目に触れるので、タスクの漏れが防げるのだそうです。

#明日からTODO管理達人になろう！

いかがでしたか？このGTDは2002年に初めて提唱された方法なのですが、未だに様々な人に使い続けられている手法です。ぜひ皆さんもGTDを習得して、早く仕事を終わらせて、Rettyで見つけたお店でアフター5を楽しみましょう！
MeCabをUTF-8でインストールしたい。


# MeCab
[mecab](http://taku910.github.io/mecab)といえば、10年前から公開されている日本語の形態素解析エンジン。研究用途やWebサービスのNGワード抽出など、今でもバリバリ活躍しています。

## インストールしてみる
[こちら](http://taku910.github.io/mecab/#download)を参考に、インストールを進めていきます。

MacやLinuxなどで使いたいときは、`./configure`のときに`--with-charset-=utf8`するのがミソみたいです。

```
$ tar zxfv mecab-X.X.tar.gz
$ cd mecab-X.X
$ ./configure --with-charset=utf8
$ make
$ make check
$ sudo make install
```

- ここまでは良さそう。

## 辞書をインストール
MeCab本体と同様に、辞書もインストールします。ここでもやっぱり`./configure --with-charset=utf8`がミソなんですが…。

```
$ tar zxfv mecab-ipadic-2.7.0-XXXX.tar.gz
$ cd mecab-ipadic-2.7.0-XXXX
$ ./configure --with-charset=utf8
$ make
$ sudo make install
```

ところがこれがうまくいかないのだ。見事に文字化けしている。

```
$ mecab
今日もいい天気ですね
?	̾??,????,*,*,*,*,?,???????,???????
?日もいい?	????,????,*,*,*,*,*
??	̾??,????,*,*,*,*,*
?	̾??,????,*,*,*,*,*
?ですね	????,????,*,*,*,*,*
EOS
```

## 解決方法
[似たような問題](http://nymemo.com/sakura/258/)にあたっている方を発見。こちらを参考に、各種ファイルや設定を無理やりUTF-8にしていきます。

```
$ tar zxfv mecab-ipadic-2.7.0-XXXX.tar.gz
$ cd mecab-ipadic-2.7.0-XXXX
$ nkf -w --overwrite *.csv
$ nkf -w --overwrite *.def
```

dicrcを編集

``` dicrc
- config-charset = EUC-JP
+ config-charset = UTF-8
```

インストール

``` 
$ ./configure --with-charset=utf8
$ make
$ sudo make install
```

これでうまくいくはずです。

```
$ mecab
おはようございます
おはよう	感動詞,*,*,*,*,*,おはよう,オハヨウ,オハヨー
ござい	助動詞,*,*,*,五段・ラ行特殊,連用形,ござる,ゴザイ,ゴザイ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
EOS
```
Unityで動画再生

# 概要
Unityで動画再生したい
そこで、最初はUnity標準のMovieTextureだったかを使った。
シークできないことや、再生の動作が重いなどの問題多数出てきた。
そこで他の方法で動画再生させようとした話である。

# 解決方法
AV Pro なるAssetがある。
https://www.assetstore.unity3d.com/jp/#!/content/56355
これのお試し版があったので、それで実験してみた。


# 実験環境

||詳細|
|-----|-----|
|OS|Mac OSX 10.11|
|Unity|5.4.2f2|


# 実験結果
- [x] シーク移動
- [x] 絶対アドレス指定で、動画再生
- [x] 再生開始時の安定した動作

### ソースコード

```C#:source
using UnityEngine;
using System.Collections;
using RenderHeads.Media.AVProVideo;

// Media Player(Script)に、このクラスをAdd Componentしてください。
//
//
//
public class MyMediaPlayer : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	void Update () {
        if (Input.GetKeyUp("a")){
　　　　　　　//シーク移動
            MediaPlayer mediaplayer = this.gameObject.GetComponent<MediaPlayer> ();//自分のコンポーネントから
            IMediaControl control = mediaplayer.Control;
            control.Seek (200000.0f);//単位は、ミリセカンド(1000分の１秒)

            Debug.Log ("A Key UP");

         }


        if (Input.GetKeyUp("n")){
            MediaPlayer mediaplayer = this.gameObject.GetComponent<MediaPlayer> ();
            IMediaControl control = mediaplayer.Control;
            control.Stop ();
            control.CloseVideo ();

            control.OpenVideoFromFile ("/Users/”ユーザ名”/Movies/test/test2.mp4",0);//絶対アドレスで再生する動画指定
               

            //control.Play (); //ここで再生しても再生しない。しばらくたったら、再生実行すると再生される。

            Debug.Log ("N Key Down");

        }
    }
}
```

### シーク移動
シーク移動して再生継続



### 再生開始時の安定した動作
特に何か変更していないが、AV Proにしてからは特に問題になっていない


# あとでなんかできたら追加
R3 kintone js deployerを使ってkintoneカスタマイズをハッピーに！

[kintone Advent Calender](http://qiita.com/advent-calendar/2016/kintone) 9日目の記事です。

最近、社内で<font color="DeepPink">ハッピー</font>というキーワードがよく使われているようなのでタイトルに入れてみました。

kintoneでJavaScriptのカスタマイズをしていて思うのは、JavaScriptファイルをアップロードするのが面倒なんですよね。
そこで改善できるツール作りましたよ！って書こうとしたら、[前日の方](http://qiita.com/yhirochick/items/840c95f7472b90cd1491)も同様の記事を書かれていましたｗ

とは言え、もはや（時間的に）後戻りはできないので、ご紹介させて頂きたいと思います。

# JavaScriptカスタマイズの流れ

kintoneでJavaScriptを使ったカスタマイズを行う場合、だいたい以下のような流れで進めます。

1. JavaScriptプログラムを作る
2. アプリの設定画面からkintoneへJavaScriptファイルをアップロードする
3. 動作確認・デバッグする

2を行うためにはkintoneのアプリ設定画面を開いて、ファイルをアップロードする必要があり、結構面倒なわけです。

# 便利ツールを使う

## [JSEdit for kintone](https://cybozudev.zendesk.com/hc/ja/articles/205452653-JSEdit-for-kintone)

kintoneの設定画面上で直接JavaScriptを記述できる便利なプラグインがあります。
これを使うとファイルをアップロードする手間が無くなるため、非常にお手軽にJavaScriptカスタマイズができます。
が、kintoneの画面で直接コーディングするという事は、ソースが手元に残らないので、ちょっと不安になる事があります。

## [Dropbox連携](https://cybozudev.zendesk.com/hc/ja/articles/201308690-JavaScript%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%AE%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%82%92%E3%81%8B%E3%82%93%E3%81%9F%E3%82%93%E3%81%AB%E3%81%99%E3%82%8B%E3%82%A6%E3%83%A9%E3%83%AF%E3%82%B6)

Dropboxの同期機能を活用したテクがあります。
この方法でもアップロードの手間が無くなり、更にオリジナルのソースは手元で管理できるのでとても便利です。
ですが、ファイルがインターネット上に公開されている状態なので、ちょっと不安になる事があります。

# R3 kintone js deployer で万事解決！？

そこで（僕ではありませんが）作ったのが [R3 kintone js deployer](https://github.com/r3it/r3-kintone-js-deployer) (∩´∀｀)∩ﾜｰｲ

本ツールはコマンドライン形式で実行するもので、設定ファイルに記述した情報を元に、kintoneへJavaScriptファイルをアップロードしてくれます。（Rubyの実行環境が必要です）

例えば、

``$ ruby deploy.rb dev customerlist``

のような形式で、dev環境に存在するcustomerlistアプリに対してアップロードする事ができます。（devとかcustomerlistの名前は自由に定義できます）

接続先のkintone環境やアプリを細かく設定できるので、開発環境にアップロードしたり、本番環境へアップロードしたり自由自在です( ｰ`дｰ´)ｷﾘｯ

コマンドラインから実行できるという事は、他のツールと連動した使い方も可能になるわけです。
最近の弊社では、**webpack**と**gulp**と**R3 kintone js deployer**を組み合わせる事で、

- JavaScriptファイルが変更された事を自動で検知
- ソースを圧縮（Minify）
- アプリへアップロード

の一連の操作を自動化しています。

ちょっと惜しい点としては、kintoneのデプロイAPIを使っているため、反映までに数秒かかってしまうという事です。

便利なツールを組み合わせて、kintoneカスタマイズをハッピーに！！
DNSトラブルの検証ツール

DNSに障害が発生したとき、インターネット側からテストするためツールをまとめます。

### DNS Test and Check - Free DNS Tools and Report
http://www.dnssy.com/
ドメイン名を入力すると、そのドメインのDNS応答を検証し、結果を一覧表で示してくれます。

### Free Online DNS Trace Test
https://www.dotcom-tools.com/DNS-lookup-tools.aspx
選択肢からルートDNSを選び、目標サーバのURLを入力すると、名前解決がどのDNSサーバで行われているかを、経路図付きで示してくれます。

### nslookup
第二引数に、インターネット上のpublicDNS(8.8.8.8など)を指定すれば、そこに問い合わせを行うので、インターネット側からのテストができます。
```
$ nslookup [-type=A|MX] <目標サーバ名/IP番号> [<ルートDNS名/IP番号>] 
```

### 参考記事
- Tech TIPS：nslookupの基本的な使い方
http://www.atmarkit.co.jp/ait/articles/0307/19/news003.html
YesodでリクエストをフックするにはYesod Middlewareを使う

Yesod Advent Calendar 2016の2日目の記事です。Yesodに関する有用な記事が集まってきて、嬉しい限りです！

さて
JavaのServletAPIにはFilterという便利な機能があります。
これは特定のパターンのURLへのリクエストをフックし、本来の処理の前後に処理を挟んだり、場合によっては本来の処理を行わずに別の処理を実施したります。

![middleware.png](https://qiita-image-store.s3.amazonaws.com/0/10225/f08d9cd5-cad0-b14a-f935-a41c52022588.png)


これにより、業務的なロジックとWeb的なロジックを分離し、それぞれの処理をスッキリ実装することが出来るようになります。

Yesodでもこの機能はあり、``` Yesod Middleware ``` ・・・と呼ぶようです。
（syocyさんからのご指摘で Middleware → Yesod Middlewareと改めました）

ただ、URLのパターンを指定することは出来ないようで、その辺りは自分で実装する必要があるようです。

# Middlewareの作り方
Middlewareは、特に型クラスが提供されているわけではないようですが、以下のような手順で作ることが出来ます。

1. ある型の関数を作る
2. 1で作った関数を ``` Foundation.hs ``` の決まった場所に追記する

以下は例です。

```hs
customMiddleware :: HandlerT site IO res -> HandlerT site IO res
```

```Foundation.hs
    -- Yesod Middleware allows you to run code before and after each handler function.
    -- The defaultYesodMiddleware adds the response header "Vary: Accept, Accept-Language" and performs authorization checks.
    -- The defaultCsrfMiddleware:
    --   a) Sets a cookie with a CSRF token in it.
    --   b) Validates that incoming write requests include that token in either a header or POST parameter.
    -- For details, see the CSRF documentation in the Yesod.Core.Handler module of the yesod-core package.
    yesodMiddleware = defaultCsrfMiddleware . defaultYesodMiddleware . customMiddleware
```

# Middlewareの使いどころ

基本的な考え方は「Webアプリの全リクエストに挟みたい処理」となります。例えば・・・

* 特定のクッキーがセットされていることをチェックし、無ければ認証画面にリダイレクトする
* CSFR（クロスサイトリクエストフォージェリ）対策のトークンをチェックする  
  実はこのMiddlewareはYesodが標準で提供していて、Foundation.csにはデフォルトで設定されています。[Yesod Advent Calendar 2016の2日目の記事](http://qiita.com/jabaraster/items/6b02673c6fb6e509d75a)も参照してみて下さい。
  

# Middleware内でDBアクセスを行うなら型宣言に注意
Middlewareの中でDBにアクセスする場合は型宣言に追記が必要になります。

```hs
dbAccessMiddleware :: (YesodPersist site, YesodPersistBackend site ~ SqlBackend) =>
    HandlerT site IO res -> HandlerT site IO res
```
静的HTMLページの中に複数のLaravelプロジェクトを組み込む方法

前回書いたこれの続き。シンボリックリンクのやり方の応用みたいな

http://qiita.com/qwe001/items/3fcd21381b0547001557

前回はお問い合わせページ「だけ」をLaravelで組み込むので、シンボリックリンク貼るだけでサクッと組み込めました。
が、今回はそれに加え管理画面の実装も必要となりました。当然これもLaravelでの開発です。

普通に考えれば以下のようにすればできますが・・・

```
example.com/ -> TOP(HTML) /var/www/html/index.html
example.com/contact/ -> お問い合わせページ(Laravel) /var/www/program/resources/views/contact/index.blade.php
example.com/contact/admin -> 管理画面(Laravel) /var/www/program/resources/views/admin/index.blade.php
```

お問い合わせの下に管理画面があるのは違うでしょ、って話。
名前を sys とかにして、``` example.com/sys/contact ```とか
``` example.com/sys/admin ```にすればいいんじゃないのって感じなんですが、却下されました。
管理画面のURLは``` example.com/admin ```でなければいけないということです。
ので、これを実現します。

### 実装

###### シンボリックリンク

adminに対してもシンボリックリンクを貼ります。

```
ln -s /var/www/program/public /var/www/html/contact
ln -s /var/www/program/public /var/www/html/admin
```

##### ルーティング

```php:routes/web.php

if(strpos(\Request::root(),'contact')){
    // Controllerは app/Http/Controllers/ContactsController.php を読みこみます。
    Route::get('/', 'ContactsController@index')->name('index'); // example.com/contact/

    Route::get('/confirm', function () { return redirect('/'); }); // 直リン防止
    Route::post('/confirm', 'ContactsController@confirm')->name('confirm'); // example.com/contact/confirm

    Route::get('/thanks', function () { return redirect('/'); }); // 直リン防止
    Route::post('/thanks', 'ContactsController@thanks')->name('thanks'); // example.com/contact/thanks
}

if(strpos(\Request::root(),'admin')){
    Route::group(['namespace' => 'Admin'], function() {
        // Controllerは app/Http/Controllers/Admin/AdminController.php を読みこみます。
        Auth::routes(); // example.com/admin/login とかそういうAuth関連一式
        Route::get('/', 'AdminController@index')->name('admin.index'); // example.com/admin/ 管理者ログイン後表示
        Route::get('/logout', 'Auth\LoginController@logout')->name('logout'); // example.com/admin/logout
    });
}

```

ルートURLに「contact」が含まれていたらcontactに関するページを表示、
ルートURLに「admin」が含まれていたらadminに関するページを表示するようにします。
こんなことをする理由は、\Request::root() が返す内容が http://example.com/contact などであり、
そのままでは ``` if(\Request::root() == 'contact') ``` とはできないからです。
herokuボタンで簡単にec-cubeの全機能を試してみる

先日、[ぼくのかんがえたさいきょうのEC-CUBE3開発環境](http://qiita.com/kiy0taka/items/1bd6dae16c8b5c99151a)や[1行のコマンドでローカル環境にEC-CUBEを最速でインストールする](http://qiita.com/nanasess/items/debc18697a89a7ccaddb)というエントリがありましたが、さらに手軽に最速で試したい方向けです。

3クリックで、簡単にEC-CUBEの動作環境が立ち上がります。
**たぶん最速。EC-CUBEのインストールすら不要です。**

# 下準備

Herokuのアカウントを作る。

以下からHerokuのアカウントを作っておきます。

https://www.heroku.com/

# Herokuボタンを押す

- [EC-CUBEのレポジトリ](https://github.com/EC-CUBE/ec-cube)のREADMEに、`Deploy to Heroku`という紫のボタンがありますので、クリックします。
- Herokuの画面に移動するので、`Deploy`ボタンをクリックします。
- 完了したら、`View`というボタンが表示されるので、クリックします。

EC-CUBEのトップページが表示されたら、成功です。
管理画面は、/adminで、ID: admin PASS: password でログインできます。

画面キャプチャもとってみました。

![4.gif](https://qiita-image-store.s3.amazonaws.com/0/72858/99ee0116-9a53-065a-089a-7b9caaddc7cf.gif)


# 応用編

[EC-CUBEのレポジトリ](https://github.com/EC-CUBE/ec-cube)のトップページからHerokuボタンを押すと、masterブランチのEC-CUBEがインストールされますが、ブランチを切り替えた場合は、そのブランチのEC-CUBEがインストールされます。

過去のバージョンのEC-CUBEを動かしたいやPull Requestを確認したい、みたいな場合は、GitHub上でブランチを切り替えて、Herokuボタンを押す、で対応できます。

いかがでしたでしょうか。

開発環境の構築やコマンドの実行などは不要で、ボタンクリックだけで、EC-CUBEの動作確認ができると思います。

かなりお手軽なので、ぜひ試してみて下さい。
docker-compose upで立ち上げたRailsでActiveRecord::PendingMigrationError Migrations are pending

docker-composeでRailsの環境をwebとdbの2つのコンテナを立ち上げてからweb側にアクセスしたところActiveRecord::PendingMigrationErrorがでました。

# docker-compose で立ち上げ

```
docker-compose up -d

Starting pugiemonn_web_1
Starting pugiemonn_db_1
```
コンテナが立ち上がりました。

# webにアクセス
`localhost:3000`のページにアクセスしたところエラーがでました。

```bash:error
Migrations are pending
```
マイグレーションを実行しろとあります。
docker-composeの場合docker-compose.ymlに書くのかななどと考えたのですが違いました。

# docker-compose run から　db:migrate
docker-composeのページにやり方がありました。

```
docker-compose run web rake db:migrate
```
db:migrateが走りました。ここのwebがwebサーバーで、dbがdbサーバーです。実行していた環境は公式ページと同じ構成でした。

# 再度確認
PendingMigrationErrorが消えました(☝ ՞ਊ ՞)


# 参考
https://docs.docker.com/compose/rails/
D3.js　HTML要素で棒グラフを描画

### この記事でやること

* D3.jsでCSV形式のデータファイルを元に棒グラフを表示します
    * 元データ：CSVファイル
    * 描画方法：HTML（あまり良い使い方ではありませんが、今回は例として）
* 要素の追加と属性設定を行います

### ソースコード

#### HTML

```html:index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!-- 基本スタイルシート -->
<link rel="stylesheet" type="text/css" href="main.css">
<title>D3.js　CSVデータから棒グラフを表示</title>
</head>
<body>
<!-- 棒グラフの描画先-->
<div id="graph"></div>
</body>
<!-- D3.js -->
<script src="https://d3js.org/d3.v4.min.js"></script>
<!-- 本体処理 -->
<script src="main.js"></script>
</html>
```

#### JavaScript
```javascript:main.js
// 読み込みCSVファイル
var DATA_FILE_PATH = './data.csv';
// グラフ描画先
var TARGET_ELEMENT_ID = '#graph';
// 項目名：名前
var COL_NAME = 'name';
// 項目名：値
var COL_VALUE = 'value';

drawGraph();

/**
 * 棒グラフの描画
 */
function drawGraph() {
    // 第2引数のlistの中に読み込んだCSVデータがある
    d3.csv(DATA_FILE_PATH, function(error, list){
        // グラフの外枠テーブル作成
        var table = d3.select(TARGET_ELEMENT_ID)
            .append('table')
            .selectAll()
            .data(list)
            .enter();
            
        // 行作成
        var row = table.append('tr');

        // 項目名セル
        row.append('th')
            .text(function(d) {
                return d[COL_NAME];
            });
        // 値セルと棒表示
        row.append('td')
            .append('div')
            .attr('class', 'value')
            .attr('style', function(d) {
                return 'width:' + d[COL_VALUE] + 'px;';
            })
            .text(function(d) {
                return d[COL_VALUE];
            });
    });
}
```

#### CSS
```css:main.css
/* 棒グラフの棒部分 */
.value {
    background-color: #cce;
    border: solid 1px #99a;
}
```

#### データファイル（CSV）
```data.csv
name,value
A-A,200
A-B,100
A-C,150
A-D,100
```
vCenter Converter StandaloneでのP2V後にできる"___VMware_Conv_SA___"ユーザー

vCenter Converter StandaloneでP2Vした後に、対象に"\_\_\_VMware_Conv_SA\_\_\_"というユーザーが作成されていることがある。

公式ドキュメントやサイト上では、このユーザーに関する情報を見つけられていない。非公式な情報としては、communities.vmware.comへの投稿「[About：“\_\_\_VMware_Conv_SA\_\_\_” account | VMware Communities](https://communities.vmware.com/message/2557711)」に、以下の情報があった。

> This account is used for communication between Converter's services.
Once you finished with conversion and/or deinstall Converter, it's OK to delete account.

このアカウントはConverterサービスとの通信に使われるものであり、変換が終わるかConverterを削除したら、このアカウントも削除して構わない、とのこと。

----

本ページ内容は筆者が確認の便のためにある持点でまとめた個人的なメモです。内容を保証するものではありません。また筆者の所属組織等とは一切かかわりがありません。
ArchLinuxのインストールでハマった事とその解決法

この記事は[Akatsuki Advent Calendar](http://qiita.com/advent-calendar/2016/aktsk)の9日目です。

最近、新しく買ったノートPCにArch Linuxをインストールしたのですが、その時に起きた諸問題とその解決方法についてのメモをまとめておこうと思います。


# ブータブルUSBメモリが起動できない
## 概要
Arch LinuxのブータブルUSBメモリを用意し、さあインストール！と意気込んだ直後に発生した問題です。
Arch Linuxのライブ環境が全く立ち上がりませんでした。

## 解決法
この問題はUEFIのSecure Boot機能によってArh Linuxのライブ環境の立ち上げが阻止されることが原因のようで、UEFIの設定画面を開きSecure Bootを無効にすることで解決できました。

また、私のPCでは最初、UEFIの設定画面でSecure Bootの項目がEnabledのままグレーアウトしており無効にできなかったのですが、UEFIのSupervisor Passwordを設定することでSecure Bootの設定を変更できるようになりました。
（Supervisor Passwordを設定するとUEFIの設定画面を開く度にパスワードの入力が求められるので注意してください）

# ライブ環境で無線LANが使えない
## 概要
`ip link`で確認した無線LANを`ip link set XXX up`で有効にしようとしたところ、対応するドライバが見つからず、無線LANを有効化できませんでした。

## 解決法
単に使用しているライブ環境が古く、インストールしようとしているPCの無線LANに対応していなかったのが原因でした。
そこで、最新のArch Linuxのisoをインストールし、ブータブルUSBを作り直して再度試してみたところ、問題なく無線LANの有効化ができました。

当たり前っちゃ当たり前ですが、インストールに使用するArch Linuxもなるべく最新版を使ったほうがいいです。

# rEFInd入れてもArch Linuxが起動できない
## 概要
ブートローダとしてrEFIndをインストール、次のコマンドで設定をしたのですが、いくら再起動をかけてもブートローダがArch Linuxを認識しなかったり、起動しようとしてもカーネルパニックが発生しました。

```
# refind-install
# mkrlconf
```

## 解決法
`/boot/initramfs-linux.img`と`/boot/initramfs-linux-fallback.img`が存在しておらず、正常にブートできない状況にあった事が原因でした。
なので、

`# mkinitcpio -p linux`

で上記2つのファイルを生成後、再度

```
# refind-install
# mkrlconf
```

を実行することで解決しました。
LambdaにAPI Gatewayを経由してCognito Idを渡す


みなさんこんにちはsekitakaです。
API GatewayからCognito Identity IdをLambdaに渡す方法について紹介します。

# シチュエーション
以下のようなシチュエーションの場合に、この方法が使えます。

モバイルアプリでCognitoを使っていて、API Gatewayの認証をIAM認証にしている場合があるとします。
つまり正しいCognito Identity Id(以下Cognito Id)を持っているユーザー以外はAPIを実行できない状態です。
この状態でAPIのバックエンドのLambdaでCognito Idを使用したいことがあると思います。
例えば、Cognito IdをプライマリキーにしてDynamoDBにユーザーごとのデータを作成したり、S3にプロフィール画像のファイルを作成したりする場合です。

# 手順
* APIの任意のメソッドのメソッドリクエスト→認証を「AWS_IAM」に設定します。
* 統合リクエスト→本文マッピングテンプレート を以下のように指定します。
  
	```json
	{
	  "cognito_id": "$context.identity.cognitoIdentityId"
	}
	``` 
  
  `"$context.identity.cognitoIdentityId"`を指定することで、Lambdaにcognito_idというプロパティで、Cognito Idを渡すことができます。
  
* Lambdaでは以下のように使用できます。

	```python
	def lambda_handler(event, context):
	  cognito_id = event.get('cognito_id')
	  
	```
	
# まとめ
いかがでしたでしょうか。今回はAPI Gatewayを経由してLambdaにCognito Identity Idを渡す方法をご紹介しました。
AWSを利用したサーバーレスなモバイルアプリを作る場合に必要な知識の1つだと思います。
パルストランス内蔵RJ45

ジャンクルーターのパルストランス内蔵RJ45を再利用をしたところはちょっとはまったのでメモです。

目的のパルストランス内蔵RJ45は秋月で販売されているこちらのタイプでした。

![スクリーンショット（2016-12-09 7.52.40）.png](https://qiita-image-store.s3.amazonaws.com/0/104066/1e0932a6-ed22-e939-83e2-860f1e79c845.png)

現在秋月では二品目のパルストランス内蔵RJ45がありますが、両方ともこのタイプのようです。

ところが再利用のため外したパルストランス内蔵RJ45は足や固定のボッチの一が同じなのに使えないのでパターンをおってみたところ、以下のように接続されていました。


|信号|秋月|ジャンク|
|:---|:---|:---|
|TD+|1|8|
|TD-|2|7|
|RD+|3|1|
|RD-|6|2|
|TCT|4|3|
|TCT|5|3|

パターンカットとジャンパーで、どうにか使えるようなりました。

よくよく見て見ていると秋月の片方はいろいろなタイプのなかの一つのようです。

日米商事にHALO ElectronicsのHFJ11-2450E-L12RLというモジュールが108円であったので買ってきてみた。このモジュールは1から8は秋月のものと同じなのですが、LEDの10と12の位置がちょっとずれているのと、黄色のLEDの向きが逆でした。

![スクリーンショット（2019-03-28 16.48.35）.png](https://qiita-image-store.s3.amazonaws.com/0/104066/b16361a7-2051-165c-f7f3-20e958c94594.png)

LEDは引っこ抜けたので、片側は反対にして、ピンの位置をずらしてみました。
『わかった』と君はいったけど、本当はわかってない記念日

この記事は[コミュニケーション Advent Calendar 2016](http://qiita.com/advent-calendar/2016/communication)の9日目の記事になります。

本記事は内定者や新入社員に色々教えている時に感じた内容になります。
基本的には内定者や新入社員を想定して書いていますが、すべての人に当てはまる内容かとおもいます。

# 目次

- はじめに
- 本題:わかった(わかってない)
  - どうすればいいのか
- まとめ

## はじめに

何か依頼を受けた時、内容を理解したら「**わかった**」と相手に伝えるかと思います。
この「**わかった**」は、内定者や新入社員の方は実はわかってないことが多いです。
結果、依頼した内容と違うアウトプットが出てきたり、重要ではない部分に時間を使ってしまったりします。

今回は依頼を受けた側(ここで言うと内定者や新入社員)がどんなことを意識するとよいかを記載したいと思います。

依頼する側が意識すべき点は過去の[コミュニケーション Advent Calendar 2015](http://qiita.com/advent-calendar/2015/communication)を見ると色々ありますので割愛させてもらいます。

penginさんの去年の記事、[目的志向型コミュニケーションについて](http://qiita.com/pengin/items/11689c521a179070651c)はとてもよいいなぁと思いました。

## 本題:わかった(わかってない)

さて本題ですが何か依頼する時の流れは以下のような感じかと思います。

私「ここの修正だけど、XXXを考慮するとZZZやYYYも影響あるんじゃないかな？」
後輩「ふむふむ」
私「他にも色々影響出る箇所があると思うのでもう一度考えてみて」
後輩「**わかりました**」

この**「わかりました」**は前述したように内定者や新入社員の方はわかってないことが多いです。

上記の後輩にあたる人つまり依頼を受けた側は、わかったと答える前に『**伝えられた内容を、自分の言葉で説明できるか**』を確認してみてください。

逆に依頼した人は、**自分の言葉での説明**を求めてみてください。

わかっていない人は往々にして自分の言葉で説明出来ないことが多いです。
(例えば、ただ依頼内容をおうむ返しで答えたり)

### どうすればいいのか

これは私のやり方ですが、ひとつひとつのことを掘り下げていきます。
例えば先ほどの私と後輩の例で言えば

私「やることわかった？」
後輩「はい、影響範囲を調べてから修正します」
私「**ちなみにどうしてZZZやYYYに影響が出るかわかる？**」

と回答の根拠を質問していくといいかと思います。
物事は全て根拠があるはずですが、自分の言葉で説明できない人は**根拠がわからないままわかったと言っていることが多いです。**

## まとめ

- わかったと言われたら自分の言葉で説明させてみる
- 根拠を質問していく

当然のように通常の開発フローにこれを組み込むわけではなく、上記の問題が起きたら実施するで良いかと思います。

結局この辺って全て物事を繋がるように考える癖が大事なんだと思いました。
(ロジカルシンキングとか呼ばれるのかな)

良いコミュニケーションで良い開発を。