OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Pi3 や Zero Wで オンボードのシリアル (UART) を使う (DietPiでの方法も補足)

# Overview

Raspberry Pi Zero WやRaspberry Pi3は、Bluetoothを搭載され、UARTで結線されてる関係で、使うのに手間がかかります。

* SoC内のUARTの切り替え (pinヘッダーに出ているTXD/RXDを使えるように) が 必要
 * https://www.raspberrypi.org/documentation/configuration/uart.md を見るとわかりますが、
    * PL011というARMのUARTのIPが１つ (BTにはdefaultで利用. FIFO bufferのサイズが多い、また6線UART (TXD/RXD/RS/CSやDTR/DSR)などにも対応など多機能)
    * Tiny UARTというIPが1つ

簡易UARTに切り替えることもでき、Raspberry Pi3やZero Wで、BluetoothとUARTの併用が可能です。

* シリアルコンソールの無効化が必要
 * ```/dev/ttyAMA0``` や ```/dev/ttyS0``` は、 consoleとししても使われているため、無効化しないと、オンチップのUARTを、自分用途で利用できないので、無効化が必要

* TXD/RXD の ピンレイアウトは、
    * Raspberry Pi Zero / Zero Wは、TXD: 8pin / RXD : 10 pin です。
    * https://cdn.sparkfun.com/assets/learn_tutorials/6/7/6/PiZero_1.pdf
    などご参考

* Diet Pi特記事項
 * DietPi は特殊なdistributionでDTのoverrideが /boot直接では、できないので注意が必要


# やり方

## オンボードシリアルの有効化

```/boot/config.txt
enable_uart=1
```

以下が、Tiny UARTとPL011の切り替えです。


```/boot/config.txt
dtoverlay=pi3-miniuart-bt
```

を追加 (pi3となっていますが、Zero Wでも有効)

### baurdrateを115200よりも使う時。

ATmega32u4などでUSBで使う場合には、baurdateを500000bpsとかに設定するかと思いますが、
その時は、

```/boot/config.txt
init_uart_clock=8000000
```

も追加しておきましょう。

なお、
/boot/config.txtは、DietPi上では、直接編集しても無意味です。
/DietPi/config.txt
を代わりに編集しましょう

## UART ttyの無効化

```/boot/cmdline.txt
-dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
+dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
```

/boot/cmdlineでconsole=serial0,1152000が入っているかと思いますが、上のように
除去しましょう。


```
sudo systemctl stop serial-getty@ttyAMA0.service
sudo systemctl disable serial-getty@ttyAMA0.service
```

のように、gettyが/dev/ttyAMA0や/dev/ttyS0を取ろうとしているので、無効化します。

これで使えるはずです。
Chrome 61.0.3163.100 めちゃ重い on Win10 & Ubuntu

マウススホイールのスクロールが引っかかる
動画再生時、最大化するとマウスを移動させてもカーソルが表示されないのでESCするしか無い
デュアルディスプレイで片側の表示内容がチカチカと点滅する(Ubuntuのみ？)
複数ウィンドウで放っておいたほうのウィンドウがCPUMAX
日本語変換時に引っかかる

Core i7 6700HQ Mem:8GB なのでスペックが原因ではないはず

まだ61にアップデートしてない人は次のアップデートまで更新しないほうが吉
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第六章 ドメインオブジェクトのライフサイクル7(リポジトリ)

# リポジトリ

冒頭のおばさんの写真は図書館の司書ってことでいいんですよね。。。（もちろんリポジトリのメタファ)

## オブジェクトの参照の手に入れ方

すごく、とてもすごく当然のことだけど、オブジェクトを使って何かしようとするならば、そのオブジェクトの参照をもっていなければならない。それをどう手に入れるか？

**1. オブジェクトを生成する**
**2. 既に持っているオブジェクトの関連を辿る**

Evansのこのあとの体験が面白いのですが、すべてのオブジェクトを上記1,2のやり方だけで対応しようとしていたプロジェクトがあったと。なかなか興味をそそられるプロジェクトですよね。

ただ、Evansも言っているように、一般的には、ほとんどのオブジェクトをRDBに格納する。よって、３つ目の方法が必要となります。

**3.クエリを実行して、データベース内でオブジェクトを見つける。または、オブジェクトの各構成要素を見つけて、再構成する。**

## 関連と検索

上記３の方法が出てくると、設計において考えるべき点ができる。

例えば、"顧客オブジェクト"は"注文のすべてのコレクション"を保持して、関連で辿れるようにすべきか、注文はデータベースに入れて、顧客IDで検索すべきか？

これは、検索の疎結合と関連の高凝集との間のトレードオフを考えて決定すべき。いずれにしても、検索と関連を組み合わせることで、設計はわかりやすくなります。

## 格納されたオブジェクトはライフサイクル上"中期"

格納されたオブジェクトを取り出す場合、[前回](https://qiita.com/YasuhiroKimesawa/items/dfd8b7ef451d247475b6)読んだようにオブジェクトを組み立てる必要があります。なので、格納された時点でオブジェクトは消えてしまうように見えますが、**概念上は、エンティティのライフサイクル上、"中期"**であることを忘れないようにしたいです。

例えば、新規の顧客をRDBに格納しても、当然、顧客は退会していなくなるわけではないですよね。
なので、格納されたオブジェクトを取り出すことを**再構成**すると呼んでいます。

> ドメイン駆動設計の目標は、技術ではなく、ドメインについてのモデルに焦点を合わせることによって、よりよいソフトウェアを作ることである。(第二部第六章より)

この後、何回かに分けてリポジトリの章を読みますが、まずこの大前提を忘れないようにしたいですね。
UNIX domain socketでpostgresqlにアクセスする

postgresqlの認証周りも含めると面倒なのでpostgresユーザーでアクセス。


```bash
// dockerコンテナでpostgresqlを構築versionはCentOS標準の9.2
$ docker run --privileged=true -d --name testpg -v `pwd`/pg:/run/uds -i -t docker.io/centos:7.4.1708  /sbin/init
$ docker exec -i -t testpg /bin/bash
# yum install -y postgresql-server perl-DBD-Pg bash-completion

// bash-completion便利なので入れておく
# source /root/.bashrc

// initdbはこう呼ぶらしい
# export PGSETUP_INITDB_OPTIONS="--encoding=UTF-8 --locale=C"
# postgresql-setup initdb

# systemctl start postgresql.service
# su - postgres
$ createdb company
$ psql company -c "CREATE TABLE employee (id serial primary key, name text);"
$ psql company -c "INSERT INTO employee (name) VALUES ('社長')"
$ psql company -c "INSERT INTO employee (name) VALUES ('秘書')"
$ psql company -c "INSERT INTO employee (name) VALUES ('愛人')"
$ psql company -c "SELECT * FROM employee"
 id |  name
----+--------
  1 | 社長
  2 | 秘書
  3 | 愛人
(3 rows)

$ cat a.pl
use v5.10;
use warnings;
use DBI;
use Data::Dumper;

my $dbh = DBI->connect("dbi:Pg:host=/var/run/postgresql;dbname=company");
my $sth = $dbh->prepare("SELECT id,name FROM employee");
$sth->execute();
while( my $aryref = $sth->fetch) {
        my ($id, $name) = @$aryref;
        say "$id $name";
}
$dbh->disconnect;
$ perl a.pl
1 社長
2 秘書
3 愛人
```

# おまけ

ソケットファイルの場所を/tmpから変えるには`/var/lib/pgsql/data/postgresql.conf`の`unix_socket_directories`のように変える
unix_socket_directories = '/run/uds'
unix_socket_directoryは×

# 参考

Perl - Connect to PostgreSQL Database - Failing to find proper socket - Stack Overflow
https://stackoverflow.com/questions/16427356/perl-connect-to-postgresql-database-failing-to-find-proper-socket

sql - How to set auto increment primary key in PostgreSQL? - Stack Overflow
https://stackoverflow.com/questions/7718585/how-to-set-auto-increment-primary-key-in-postgresql

DBD::Pg - search.cpan.org
http://search.cpan.org/~turnstep/DBD-Pg/Pg.pm
Processingをjdk-9で実行できなかったのでjdk-1.8に戻したら動いた on Eclipse OXYGEN

先日Macのクリーンインストールをして色々と変更していたら、EclipseからProcessingライブラリが使えなくなったのでメモがてらその解決法をメモ。

Processingをjdk-9を使っているEclipse Oxygen上で動かそうとしたらinitialize errorがでたので、jdkの1.8に戻した。すると無事解決した。
ipod touch からandroid のpowerampで特定のプレイリストを再生する方法。

# ipod touch からandroid のpowerampで特定のプレイリストを再生する方法。

## 概要

手に持ってるのはiPod touch 。耳にはAndroid とペアリングしたヘッドセット。この状態で手元のiPodから聞きたいものを素早く切り替えたい。

## 用意するもの

* ifttt (ios)
* Poweramp (android)
* pushbullet(android)
* tasker (android)
* AutoNotifycation(tasker plugin )
* secure settings (tasker plugin)

## 事前準備

* 用意したアプリは認証や通知設定が出来ている状態にする
* Poweramp にプレイリストが存在する

## tasker のタスクを作成

play hogeというタスクを新規作成

1. plugin →Secure Setting →Configuration →Actions→Execute Shortcut→目当てのプレイリストを指定
1. lugin →Secure Setting →Configuration →Actions→launch activity→Poweramp 
Select App First → [Poweramp].StartupActivity

# taskerのプロファイルを作成

1. +→Event→plugin →Pushbullet→Configuration 
1. テキストを含む→"hoge"
1. 差出人→友だち
1. Then→削除
1. 以上で出来たプロファイルに前述のタスク(play hoge)を割り当てる。

## iosでボタンを作成

1. ifttt if button push then pushbullet 
1. pushbullet の形式はnote。タイトルと本文は"hoge"(tasker プロファイルのテキストと合ってることが大事)
1. ボタン名をplay hogeなど。
1. ホームにボタンを設置する。

## 操作

1. bluetooth ヘッドセットをAndroidとペアリングした状態。
1. ios側はインターネットに通じてる。
1. iosから再生したいプレイリストボタンをポチッと押す。
1. 曲が流れる。

enjoy :-)
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第六章 ドメインオブジェクトのライフサイクル6(ファクトリ3)

[その１](https://qiita.com/YasuhiroKimesawa/items/f6fc33a46709cc0abe39)、[その２](https://qiita.com/YasuhiroKimesawa/items/c9e0cdb52f02d03a8a86)の続き

# 永続化したオブジェクトの再構成

RDBに格納されたオブジェクトを再構成する。
RDBでは、オブジェクトをより制限された表現に平坦化しているので、それを元のオブジェクトに戻す複雑な過程が必要になります。

オブジェクトの生成と異なる点は、
1. 新しいIDを割り当てる必要はない
2. 不変条件の違反の制御を異なる形にする必要があるかもしれない。

2については、必要なオブジェクトがデータベース上などにあるかもしれず、不変条件が満たされなければ、単にファクトリを中止するだけというわけにはいかないかもしれないということですね。


３回に渡ってファクトリを読んできましたが、至極当然という内容でした。
ただファクトリという要素だけで、結構考えること、これだけのことを考えてたんだなということが再認識できて良かったです。
Play Framework 2.6 (Java) の開発環境作成

「[PlayFramework2 徹底入門](http://www.shoeisha.co.jp/book/detail/9784798133928)」でModelを作成するところでimport分が全く効かなかったのでメモ

###### 環境
- windows 10
- eclipse oxygen

##### プロジェクトを作成(ディレクトリは任意)
```
c:¥hoge>activator new [作成したプロジェクトの名前] play-java
```

##### ディレクトリの移動

```
c:¥hoge>cd [作成したプロジェクト]
```

##### plugins.sbtに追記

```sbt:plugins.sbt
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.10")
addSbtPlugin("com.typesafe.sbt" % "sbt-coffeescript" % "1.0.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.1.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.4")
addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.8")
addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.1.1")
addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.1.0")
addSbtPlugin("org.irundaia.sbt" % "sbt-sassify" % "1.4.6")
# 追加
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "5.2.2")
addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0")
#addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "3.0.2")
```

###### eclipse用に変換
```
c:¥hoge¥hoge>activator eclipse
```
###### アプリケーション起動
```
c:¥hoge¥hoge>activator run
```
---------------------------------------
ここまでは順調だったが、model作成時にハマってしまった。

問題のjavaファイル

``` java:Message.java
package models;

import java.util.Date;
import javax.persistence.*;
import com.avaje.ebean.Model;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Entity
public class Message extends Model {
    @Id
    public Long id;
    public String name;
    public String mail;
    public String message;
    public Date pastDate;
}
```


plugins.sbtに追記

```sbt:plugins.sbt
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.10")
addSbtPlugin("com.typesafe.sbt" % "sbt-coffeescript" % "1.0.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.1.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.4")
addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.8")
addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.1.1")
addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.1.0")
addSbtPlugin("org.irundaia.sbt" % "sbt-sassify" % "1.4.6")
# 追加
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "5.2.2")
addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0")
# コメント解除
addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "3.0.2")
```

##### build.sbtに追記
```sbt:build.sbt
lazy val root = (project in file(".")).enablePlugins(PlayJava)
                .enablePlugins(PlayEbean) // 追記
scalaVersion := "2.11.7"

libraryDependencies ++= Seq(
  javaJdbc,
  cache,
  javaWs,
  javaJpa, // 追記
  "org.postgresql" % "postgresql" % "9.4.1212.jre7", // 追記
  "org.projectlombok" % "lombok" % "1.16.10" // 追記
)
```

##### activatorアップデート
```
c:¥hoge¥hoge>activator update
```
##### eclipseに反映
```
c:¥hoge¥hoge>activator "eclipse with-source=true"
```
##### コンパイル
```
c:¥hoge¥hoge>activator compile
```

一先ず解決。
外部js・cssファイル動的読み込み

レスポンシブでmediaQueryによって読み込むjsを振り分けたい場合があります。
今回はajaxを使わずに、head内にscript・linkタグを生成して外部ファイル読み込みするスクリプトを作ってみました。
非同期ロードとなるため、プラグインなどは呼び出しタイミングに注意する必要があります。
ロードが完了してから実行させたい時などは、jqueryの$getScriptなどコールバックが使えるajaxを利用した方が確実かと思います。

下記コードはロード時のみ動作となります。
必要な場合は適宜、resizeイベントなど追加してください。

```ruby:js
(function() {
    'use strict';
    var loadFiles = [];
    if (window.matchMedia('(max-width: 767px)').matches) {
        loadFiles = [
            '/css/hoge-sp.css',
            '/js/fuga-sp.js'
        ];
        injectFile();
    } else if (window.matchMedia('(min-width: 768px)').matches) {
        loadFiles = [
            '/css/hoge-pc.css',
            '/js/fuga-pc.js'
        ];
        injectFile();
    }

    function injectFile() {
        var tags = document.createDocumentFragment();
        for(var i=0; i<loadFiles.length; i++) {
            if(loadFiles[i].match(/\.css$/)) {
                var link  = document.createElement('link');
                link.rel  = 'stylesheet';
                link.href = loadFiles[i];
                tags.appendChild(link);
            } else if (loadFiles[i].match(/\.js$/)){
                var script = document.createElement('script');
                script.src = loadFiles[i];
                tags.appendChild(script);
            }
            document.getElementsByTagName('head')[0].appendChild(tags);
        }
    }
}).call(this);
```

以上、ありがとうございました。
VR空間移動用いす型デバイスを作成する⑥振動モーターを使うと回路駆動用５Vバッテリーの用意

#目次
１．振動モーター
２．モーター駆動用回路
３．５Vバッテリーの用意
４．ArduinoUNOプログラム
#１．振動モーター

振動モーターを用意する。おもちゃ用のやつがAmazonで売っている。
久しぶりに見たら在庫切れになっていた。
<img width=75% src=https://qiita-image-store.s3.amazonaws.com/0/184089/ca4fa77c-0b5d-8410-d7fb-a62b14c3af50.png>

とにかく5V駆動ででっかいのが良いと思う。似たようなのがいろいろ売られている。
実際に買って、測定すると300mAくらい電流を流すようだ。
二つ使うとUSB(2.0)の電流では足らない。別途電源を用意して駆動させる必要がある。
#２．モーター駆動用回路
以下のように回路を組んでみた。
<img width=75% src=https://qiita-image-store.s3.amazonaws.com/0/184089/099a0a02-f601-76e0-3ad7-25ec57747f33.png>
<font color="Red"> 修正（2017/12/03）’回路図にR5、R6追加’</font>

Arduinoの3pinと11pinを使用する。
このピンはPWMという疑似アナログ出力が出せるようになっている。PWMの詳細はググれば出てくる。
GNDも共通とする。モーターを動かすと大量のノイズが発生するため、インダクタを噛ませてArduinoと共通にする。
残念ながらオシロスコープを持っていないため、効果のほどは不明。無いよりはだいぶましなような気がするが・・・。
Arduinoからの信号をコンパレーターで整形してから、トランジスタに送る。
配線が長いとPWMの波形がなまるのではないかと気にしている。実際の効果はオシロスコープがないので不明。
NJM2903の出力はオープンコレクタのため、抵抗で吊ってやる必要がある。5kΩの抵抗を介し電源とつなげている。
また、NJM2903の出力は300mAもの電流は引き込めない。NchのパワーMOSFETで電流を流す。
なお、モータには並列に保護用のダイオードを入れてやること。モーターのサイズがそこそこ大きいため、モーターオフ時にかなりの逆電流（逆起電力の方が正確かな？）が発生するようだ。
これがArduino側に流れてしまうとArduinoが壊れる可能性がある。というか以前にひとつ壊した。

<img width=75% src=https://qiita-image-store.s3.amazonaws.com/0/184089/3202df3b-d200-a2f7-4833-e4d9b38e107c.png>
実際の回路である。
基板の上の方のDCジャックは5V電源をつなぎ、下の方のピンヘッダ3つでArduinoにつないでいます。

#３．５Vバッテリーの用意
駆動用の5Vバッテリーを用意したい。できれば充電できるものが良いのだが、最近は携帯用のモバイルバッテリーが進化してきたため、出力電流を監視するようになっている。
このため、出力電流が小さいと自動的にオフになる機能が入っている。これだと回路の電源に使えない（振動モーターを使ってないと自動的に切れる・・・）。
そこで一案だが100均で見つけた以下の携帯用の電池式充電器を使ってみる。

<img width=75% src=https://qiita-image-store.s3.amazonaws.com/0/184089/2b0b06a5-9f86-4603-fe79-e1b55e5146b2.jpeg>
珍しいことに充電式の電池（充電式の電池は普通の乾電池より電圧が低い・・・）が使える。
出力も5V程度であり、DC-DCコンバーターを買うことを考えるとかなり安い。
先端の端子を交換する。エネループとかを使えば繰り返し使える。

<img width=75% src=https://qiita-image-store.s3.amazonaws.com/0/184089/ad9808d1-35fd-556d-5bc7-57bb7520c476.png>

とがんばってみたのだが最近ダイソーで売っているのが監視機能がなく回路用に使えることを知った。
<img width=25% src=https://qiita-image-store.s3.amazonaws.com/0/184089/8687a502-4b7a-9a72-c43f-1d4aa97255b4.png>

#４．ArduinoUNOプログラム
振動モーターを動かします。
以下のようにスケッチに書き込んでみました。

```VibrationTest.ino
void setup() {
  pinMode(3,OUTPUT);
  pinMode(11,OUTPUT);
  analogWrite(3,63);
  analogWrite(11,63);
}

void loop() {
}
```
プログラムについて、
・pinMode()
3pinと11pinを出力モードにします。
・analogWrite()
3pinと11pinからPWM出力します。
最大255（8bit）に対し、63ですので最大出力の1/4の力でモーターが回転します。

以上になります。
クラウドIDEを使うメリットとデメリット

僕が[cloud9](https://c9.io)を使い始めたのはまだWebプログラマーとして駆け出しの頃、Railsチュートリアルで紹介されていたのがきっかけでした。Windowsの経験しかなかったので、環境構築一切不要で開発が始められるのは非常に魅力的で、それから2年ほど一人SEをやっていたときも基本はcloud9を使っていました。モバイル機としてChromebookを使っていたこともあり、ブラウザですべてが完結する点も気に入っていました。

しかし、その後転職しエンジニアとして開発チームにジョインした際、この「環境構築不要」というメリットはそのまま「環境構築の経験がない」というデメリットに変わってしまったのです。幸い、前職でAWSでのインフラ構築などもやっていたので、CentOSを立ち上げてLAMP環境を作れるくらいのことは出来たのですが、もしそうした経験がなかったら…と怖くなってきました。

そこで今回は、将来ITエンジニアを目指す人向けに、クラウドIDEを最初の開発環境に選ぶメリットと、クラウドIDEをメインの開発環境として使い続けるデメリットをご紹介します。

## メリット
### 環境構築不要で始められる
なんだかんだ言って、初心者が独学でWebアプリなりを作ろうとしたとき、入門書を買ってきて最初の50ページは環境構築に費やす…みたいなのは辛いです。最速でHello World!できる手段として現在採りうる最良の手段がクラウドIDEだと思っています。

### 低スペックのPCでもなんとかなる
「プログラミングを始めるためにパソコンを買いたいけど、どれを買ったらいいか分からない」というケースは結構多いと思いますが、自分が以前ぶち当たったケースとして「どれを買ったらいいか分からないから一番安いのを買った」→スペックが低くてIDEがまともに動かない、ということがありました。
その点、クラウドIDEなら最悪Androidタブレットにキーボードつけたレベルでも動きますし、動かすまでの金銭的なハードルは非常に低いのではないかと思います。

### 作って壊せる
初心者にありがちなのが「色々やっているうちにわけわからなくなってしまって最初からやり直したい」です。クラウドIDEは環境の破棄も再構築も1クリックでできるので、安全なサンドボックスとして活用できます。

### 利用環境を選ばない
基本的に最新のブラウザが入っていればどんなPCでも動くので、外出中にトラブルが発生してもとりあえずその辺のネットカフェに入ればいつものIDEで開発をスタートできます。

## デメリット
### 環境構築のノウハウを知らないままになってしまう恐れがある
初めに書いた通りです。ITエンジニアの仕事はコーディングだけとは限らず、インフラ周りも含めた環境構築も仕事のうちに含まれることが多いです。また、ローカル環境構築のためにDokerやVirtualbox、Vagrantなどの利用が推奨されている場合、（後述しますが）クラウドIDE上ではその辺のツールは利用できないため、余計な手間がかかる場合があります。

### Dockerなどの仮想環境は基本的に使えない
セキュリティの関係で、DockerやVirtualboxなどの仮想化技術は基本的に利用不可です。上記でも触れましたが、参加したチームがDockerを利用してローカル開発環境を構築しているなどの場合にはクラウドIDE単独では構築できません。

### スペックが低い
例えばcloud9のVMはメモリ1GB、CPU1コアと非常に低スペックです。データ移行などの重たいタスクには使えないので、AWSなどでハイスペックなサーバを別に立てて処理する必要があります。

### クラウドIDE特有のクセに翻弄される可能性がある
入門書片手に開発を進めていく場合、記述は基本的にローカル環境を用いる前提になっていますので、開発用サーバを立ち上げる際はたいてい`http://localhost:8000`などで立ち上げることが多いと思いますが、クラウドIDEではこのアドレスが使えず、IDE側で指定されたIP、ポートを使うことになります。
また、入門書ではツールのインストールはGUIベースで説明されていますが、クラウドIDEではGUI実行環境が用意されていないので、すべてコマンドラインで実行する必要があります。

## おわりに
個人的にクラウドIDEはすごく未来を感じる分野ですし、特に教育方面で今後活用されていくといいなと思っているのですが、クラウドIDE「だけ」で開発するのはまだまだハードルが高いです。サブスクリプションが充実して、VMを使えたり、ハイスペックな開発サーバを用意できたりすればまた違ってくるのかもしれませんが…今後に期待しましょう。
MAYA起動時にMAYA_APP_DIRが見つからないエラーが出てしまったら

## 起動時に出るエラー

_Windows10 & Maya2017 で起こったことです。_

Maya起動時にこのようなエラーが出てきて面倒だったのでちょっと調べた。Windowsに慣れている人だったらすぐに気づけたかもしれない。

![2017-10-15_01h04_48.png](https://qiita-image-store.s3.amazonaws.com/0/24041/e7f62aa9-de11-9ddc-0d35-8d9386da71b2.png)

> Unable to locate valid MAYA_APP_DIR. Please specify a writable directory where Maya can store data.

## 解決法

環境変数を変更できる設定を探して（下のほう）、

![2017-10-15_01h03_03.png](https://qiita-image-store.s3.amazonaws.com/0/24041/e979ddf3-c5c6-9efc-4113-721d34500393.png)

`MAYA_APP_DIR` を作った。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/24041/5810701e-34f8-6479-838f-57f1fafccd8f.png)

![2017-10-15_01h05_12.png](https://qiita-image-store.s3.amazonaws.com/0/24041/60793137-eae5-94a3-ba13-499c5549c558.png)

これで、Maya起動時にはとりあえずこのdefaultフォルダ下に仮のプロジェクトが作られることになり、エラーも出なくなった。

## 解決に至った経緯

公式ページに [修正方法](https://knowledge.autodesk.com/support/maya/troubleshooting/caas/sfdcarticles/sfdcarticles/Unable-to-locate-valid-MAYA-APP-DIR.html) が載っているのだが、ちょっとピンとこなかった。デフォルトが `C:\Users\%USERNAME%\Documents\maya\` に設定されているということだがそのフォルダはなかった。

きっと、Maya起動時にとりあえずのプロジェクトを作るのだが、その作り先パスが設定されていないからエラーが出てるのかなと思った。

そして、上記、解決策にたどり着いた。ちょっとしたことですが、Windows慣れていなくて検索かける人もいると思って書いてみました。
[WSL][メモ]コンソールの設定

主に色周りのバックアップです。

```HKEY_CURRENT_USER_Console_%SystemRoot%_system32_bash.exe.reg
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Console\%SystemRoot%_system32_bash.exe]
"InsertMode"=dword:00000000
"CodePage"=dword:0000fde9
"FontSize"=dword:00120009
"FontFamily"=dword:00000036
"FontWeight"=dword:00000190
"FaceName"="Osaka－等幅"
"QuickEdit"=dword:00000001
"ScreenBufferSize"=dword:270f0068
"WindowSize"=dword:001a0068
"CursorSize"=dword:00000064
"NumberOfHistoryBuffers"=dword:000003e7
"WindowAlpha"=dword:000000ce
"HistoryBufferSize"=dword:000003e7
"ColorTable00"=dword:00000000
"ColorTable01"=dword:00a46534
"ColorTable02"=dword:00069a4e
"ColorTable03"=dword:009a9806
"ColorTable04"=dword:000000cc
"ColorTable05"=dword:007b5075
"ColorTable06"=dword:0000a0c4
"ColorTable07"=dword:00cfd7d3
"ColorTable08"=dword:00535755
"ColorTable09"=dword:00cd9d72
"ColorTable10"=dword:0034e28a
"ColorTable11"=dword:00e2e234
"ColorTable12"=dword:002929ef
"ColorTable13"=dword:00a8ad7f
"ColorTable14"=dword:004fe9fc
"ColorTable15"=dword:00eceeee
"ScreenColors"=dword:00000007
"PopupColors"=dword:000000f5
```
AWSのIAMロール・ポリシーをソースコード管理するのに役立つツールライブラリ

AWS の IAM ロールとポリシーをどうやって管理していますか？

JSON ファイルでロールとポリシー定義を管理できるのに便利なツール(npmライブラリ)を作りました。
[github.com/tilfin/aws-iam-policy-tool](https://github.com/tilfin/aws-iam-policy-tool)

**できること**

- ローカルの JSON ファイルと IAM のロールとポリシー定義の相互インポート・エクスポート
- ローカルの定義ファイルに沿って IAM ロールとポリシーが構成されているかの検証
- 正規表現マッチするカスタムポリシーの複数削除（AWS Management Console では一個ずつしか消せない）

**できないこと**

- ロールのインラインポリシーはサポートしていない

### どのように使えるのか

- IAM ロールとポリシー定義を JSON ファイルでソースコード同様にGit等のリポジトリで管理できる。
- npm ライブラリなので Lambda から定期的にデプロイ環境のロールとポリシーが正しいかの検証ができる。

### 定義ファイルの仕組み

- IAM のブラウザ上で編集する JSON とほぼ同じです。
- デプロイ環境別にリソース名に prefix/suffix を付けている場合は `ENV` としておくことで、コマンド実行時に引数で指定します。
- AWS アカウント ID も `ACCOUNT_ID` でコマンド実行時に引数指定することで変えることができます。

#### ロール

```json
{
    "Role": {
        "RoleName": "yourapp-ec2-api-ENV",
        "Path": "/",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "ec2.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        }
    },
    "AttachedPolicies": [
        {
            "PolicyName": "yourapp-s3-storage-ENV",
            "PolicyArn": "arn:aws:iam::ACCOUNT_ID:policy/yourapp-s3-storage-ENV"
        }
    ]
}
```

#### ポリシー

ポリシー名は内容に含まれないため JSON ファイル名そのものが適用されます。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::yourapp-storage-ENV/*"
        }
    ]
}
```


### 導入と使い方

npm からインストールします。

```
$ npm install -g aws-iam-policy-tool
```

現状のロールを `./roles` とポリシーを `./policies` にそれぞれ書き出します。

```
$ awsiamtool export-role ./roles
$ awsiamtool export-policy ./policies
```

各ファイルの ARN 内の AWS アカウント ID の部分を `ACCOUNT_ID` に置換します。動作環境を示すもの (例. dev, staging など) が名前に含まれていれば、`ENV` に置換します。ポリシーの場合はファイル名もリネームします。

検証してみます。

```
$ awsiamtool validate-role -i 111122223333 -e dev roles
$ awsiamtool validate-policy -i 111122223333  -e dev policies
```

本番環境に定義を作成します。

```
$ AWS_PROFILE=prod awsiamtool import-policy -i 111122224444 -e prd policies
$ AWS_PROFILE=prod awsiamtool import-role -i 111122224444 -e prd roles
```

※ポリシー修正時 `import-policy` に上書きオプションを `--overwrite` を指定します。

### ライブラリとして使う（別の変数を適用するには）

現状コマンド引数ではサポートしていませんがライブラリとして使えば可能です。

```js
const awsIamPolicyLib = require('aws-iam-policy-tool');

const opts = {
  json: true,
  overwrite: true
};

const varSets = {
  ACCOUNT_ID: '000011112222',
  ENV: 'stg',
  COMMON_ACCOUNT_ID: '333344445555'
};

awsIamPolicyLib.importPolicy('./policies', varSets, opts);
.then(() => {
  return awsIamPolicyLib.importRole('./roles', varSets, opts);  
})
.then(() => { console.info('Importing done') })
.catch(err => { console.error(err) });
```

その他、コマンドの実行結果例などは [README](https://github.com/tilfin/aws-iam-policy-tool) を見てください。
無限再帰呼び出しでEXC_BAD_ACCESS

Swiftで再帰呼び出しをし続けると、**EXC_BAD_ACCESS**でプログラムが強制終了します。

```swift:サンプルコード
import UIKit

class ViewController: UIViewController {

    /// メソッドが呼ばれた回数
    var numberOfCalls: Int = 0
    
    override func viewDidLoad() {
        super.viewDidLoad()
        recursiveCall()
    }

    /// 再帰呼び出しを行うメソッド
    func recursiveCall() {
        numberOfCalls += 1
        print(numberOfCalls)
        recursiveCall()
    }
}
```

シミュレータで実行した場合には**約40000回**程度、実機のiPhone7で実行した場合には**約4000回**程度の再帰呼び出しでプログラムが強制終了しました。CPU/メモリに負荷を与える処理のため、実行環境によって最大呼び出し回数が変化しそうです。

オーバーライドしたメソッドでsuperのメソッドを実行するところをselfのメソッドを呼び出してしまった場合や、コンピューテッドプロパティ内で自身のプロパティを参照してしまった場合に意図せず無限再帰呼び出しとなってしまう場合もあります。

```swift:オーバーライドしたメソッド内で自身のメソッドを呼び出してしまった場合
override func viewDidLoad() {
    self.viewDidLoad()
}
```

```swift:コンピューテッドプロパティ内で自身のプロパティを参照してしまった場合
var computedProperty: Int {
    let some = computedProperty + 1
    return some
}
```

なお、コンピューテッドプロパティ内で自身のプロパティを参照してしまった場合は以下のようにワーニングが表示されます。
`Attempting to access 'computedProperty' within its own getter`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/113553/843190c8-25f5-6a8e-6032-3318e626a151.png)

また、コンソールのログに以下のwarningがでることもあるため、このwarningからも無限ループとなっていることを判断できます。

```bash
warning: could not execute support code to read Objective-C class data in the process. This may reduce the quality of type information available.
```
ハッシュと配列の違い

ハッシュと配列がとても大事だと気づいたので、覚書します。

#ハッシュって？
ハッシュとはどんな形をしているのかというと、

data = {a:”みかん”, 　b:”ぶどう”,　c:”りんご”}

このようなやつ。

#配列って？
一方で配列はどんな形をしているかというと

data = [1,2,3]

このようなやつ。

 

違いの一つ目は{}と[]の違い。

二つ目は中に入っているデータの形式。

ハッシュの一つ目、みかんにはaという名前がついているが、配列での最初の１は１でしかない（名前はない）。

 

#何に使うの？
データを格納し、取り出す際の箱の役割。

例で例えたほうがわかりやすいかも。。。

例えばレシピアプリとかで、スパゲッティで検索するとペペロンチーノ、アラビアータ、ボンゴレ。。。。ってでてくる。

実はその裏では、大量のデータの中からスパゲッティのジャンルに当てはまるものを探し出し、箱に入れて、その中身を羅列するという処理が必要になる。つまり箱のなかから取り出す必要がある。

そういうときに使う。

 

#使い方
##〜ハッシュ取り出し方公式〜
箱の名前[:key]

ここでいう箱の名前は、上の例でいくとdata。keyとは上でいくとa,b,cにあたる。

だからみかんを取り出したいと思うなら、data[:a]でみかんが出力される。

箱自体は{}で囲まれてるけど、取り出すときは[]だから注意！！

ちなみに上のスパゲッティみたいに羅列するときはeachメソッドを使う。

data.each do |key,value|

こんな感じ。valueはみかんとかりんごとかのことね。

 

##〜配列取り出し方公式〜
箱の名前[取り出したい番号]

上の配列の例でいうと１番目の１を取り出したいときは、data[0]となる。

ん？と思った人がいるかもしれないけど、実は配列では０番目１番め２番めって数えるんです。

だから１番目の１を出したいときは０、２番目の２を出したいときは１を[]の中に書く。

 

以上です。基本だけど超大事！！


##個人開発をされている方へ

Moverというプロダクトを開発しています。登録していただくと、開発したプロダクトのテスト利用を依頼し、フィードバックをもらうことができます。自分のプロダクトを公開して個人開発を加速させましょう！！　現在僕のアカウントも登録されているので、そちらにテスト利用依頼をいただければ実際に使ってみた感想などをお送りさせて頂きます。(アドバイスなどではなく、一人のユーザーとしての感想となります。)　もちろん無料です。
https://mover-web.herokuapp.com/



![Screen Shot 2020-05-19 at 4.36.42 PM.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147990/40822905-5a9d-6323-4318-bb475c68e887.gif)
C言語の構造体を（少し）工夫して使ってみる

char型の配列の一部分を取り出す方法。

配列animalsから"crocodile"という文字列を取り出したい場合

```ruby:main.c
 #include <stdio.h>
 #include <string.h>
 
 typedef struct
 {
     char inu[3];
     char neko[3];
     char neko2[4];
     char wani[9];
     char tori[4];
 }ZOO;
 
 int main()
 {
     char animals[] = "dogcatlioncrocodilebird";
     char wani[10];  //コピー先配列
     memset(wani, '\0', sizeof(wani)); //初期化
     ZOO* ZooP = (ZOO*)animals;        //構造体の型に当てはめる
     memcpy(wani, ZooP->wani, sizeof(ZooP->wani));  //構造体の一部をコピー
     printf("%s\n", wani);
 
     return 0;
 }   

output:crocodile
```

char型の配列を構造体の型に当てはめるようなイメージ
構造体の型に当てはめてあげれば他の文字列も取り出すことができるため便利
LaravelのFormRequestでinputのデータを整形する

# 経緯

- Controller内でinputデータ加工してからモデルに渡していてどこかに移したかった
- FormRequestをバリデーションの為だけに使うのがなんだかしっくり来なかった(JWTAuth使ってたので認証はミドルウェア側で対応していた)

# 前提

- Laravel5.5
- JWTAuthを利用したログイン処理

# 実装内容

まず、FormRequestをこんな感じにします。
※credentialsにinputのデータを整形するメソッドを書いてます

```php:AuthenticateLogin
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class AuthenticateLogin extends FormRequest
{
    public function authorize()
    {
        // 認証はミドルウェアで行っているのでここではTrueを返す
        return true;
    }

    public function rules()
    {
        return [
            'email' => 'required',
            'password' => 'required'
        ];
    }

    /**
     * Requestから認証に必要なデータを返す
     *
     * @return array
     */
    public function credentials()
    {
        $credentials = $this->only('email', 'password');

        // 入力されたメールアドレスにドメインが含まれていなければ付加する
        if ($credentials['email'] && strpos($credentials['email'],'@') === false) {
            $credentials['email'] .= '@' . env('MAIL_DOMAIN');
        }

        return $credentials;
    }
}
```

次に、ControllerではFormRequestのメソッドを呼び出して$credentialsを取得します。

```php:AuthenticateController
<?php

namespace App\Http\Controllers;

use \Auth;
use JWTAuth;
use App\Http\Requests\AuthenticateLogin;
use App\Services\AuthenticateService;

class AuthenticateController extends Controller
{
    /**
     * ログイン
     * 
     * @param AuthenticateLogin $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function login(AuthenticateLogin $request)
    {
        // リクエストから必要な情報のみを取得
        $credentials = $request->credentials();

        if (!$token = AuthenticateService::auth($credentials)) {
            return response()->json(['errors' => ['auth' => 'auth error']], 401);
        }

        $user = Auth::user();

        return response()->json(compact(['user', 'token']));
    }
}
```

# さいごに

JWTAuthに直接渡す為ドメインモデルに書けなかったってこともあり今回の実装方法になったのですが、 `こっちのほうが良くない？` みたいなのがありましたらコメント頂けますと幸いです:bow:
webpack と HTML と CSS

## 動機
webpackはJavaScriptだけでなく、htmlやCSSの活用ができる。
例えばcssの外部読み込みなど。

## HTML Webpack Plugin
### 導入
`$ npm install html-webpack-plugin --save-dev`

### 使い方
```js:webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin');

{
  entry: 'index.js',
  output: {
    path: __dirname + '/dist',
    filename: 'index_bundle.js'
  },
  plugins: [
    new HtmlWebpackPlugin({
      inject: true,
      template: 'public/index.html'
    })
  ]
}
```

### 解説
- inject: true  
  すべてのアセットを指定されたものに挿入する
- template: path  
  指定した自作htmlに適用する。  
  pathの指定がなければ勝手にhtmlを生成する。

### 使い所
[interpolate-html-plugin](https://github.com/egoist/interpolate-html-plugin)と連携する。

## interpolate-html-plugin
### 導入
`yarn add interpolate-html-plugin --dev`

### 使い方
```js:webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin');
const InterpolateHtmlPlugin = require('interpolate-html-plugin');

{
  entry: 'index.js',
  output: {
    path: __dirname + '/dist',
    filename: 'index_bundle.js'
  },
  module: {
    rules: [
      {
        oneOf: [
          {
            test: /\.html/,
            loader: require.resolve('html-loader'),
          },
          {...}
        ]
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      inject: true,
      template: 'public/index.html'
    }),
    new InterpolateHtmlPlugin({
      'bootstrap_css_cdn': 'https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css'
    })
  ]
}
```

```html:public/index.html
<!doctype html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="description" content="sample">
    <meta httpEquiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="stylesheet" type="text/css" href="%bootstrap_css_cdn%">
    <title>SAMPLE</title>
  </head>
  <body>
    <noscript>
      You need to enable JavaScript to run this app.
    </noscript>
    <main><main>
  </body>
</html>

```

### 解説
- env: string  
  html内にある`%foo%`の記述を置き換えてくれる。

### 使い所
とりあえずindex.jsあたりでcssをimportすることを辞める手段の一つ。
Node.jsの実行時の環境変数は`procces.env: {...}`なので、うまく捌いて`procces.env`の中身を与えれば環境ごとで違う値をinjectionすることが出来るので、package.jsonのscriptsあたりでこの値を管理できる。

## 最後に
`html-loader`の記述を忘れないでください。公式には記載されて居ないので見落とすとハマると思います。
まだまだbundle.jsの容量を減らす術はあります。
NURO光でVPN

# 実現すること

NURO光でVPN。

具体的に、ここで実現することは「NURO光の自宅ネットワークにiPhoneをVPN接続してLAN上のPCのファイルを参照すること」である。

具体的には、下記のことを実現する。

 - 自宅ネットワーク内に DD-WRT化したルータを置き、VPN(OpenVPN)サーバ とする
 - 自宅ネットワーク内の Linux PC はSMB(Samba)のファイルサーバ
 - iPhoneを自宅ネットワークにVPN接続する
 - iPhoneから Linux PC 内のファイルを参照する

※自宅ネットワーク内外でiPhoneからファイルを参照する用途であれば、DropBoxとかiCloudとかGoogleDriveとかのクラウドを利用してファイル共有すれば？という意見はあると思われる。ここでは、個人情報等、クラウドには置きたくないファイルを自宅ネットワーク内に置くことを想定している。

下記の手順にて上記が実現できた。

# 手順概要

## ベース環境構築

まず、下記の通りベースとなる環境を構築する。

 - ルータにDD-WRTのファームウェアを適用する
 - DD-WRTをブリッジ相当の設定にする
 - ダイナミックDNSのサービスを利用してWAN側のIPアドレスに対応するホスト名を設定しておく
 - HGWのポートフォワーディングの設定でVPN用のポート(1194)をVPNサーバに転送する設定とする

## VPN用の証明書、鍵の作成

- vpnux PKI Manager で、OpenVPN用の認証局の設置をする
  - CA証明書／鍵、サーバ証明書／鍵、クライアント証明書／鍵、を作成する

## VPN構築(サーバ側)

次に、下記の通りサーバ側のVPN環境を構築する。

 - DD-WRTでOpenVPNの設定をする

## VPN接続環境構築(クライアント側)

次に、下記の通りクライアント側のVPN接続環境を構築する。

 - iPhone に OpenVPN Connect (OpenVPN クライアントアプリ)をインストールする
 - OpenVPNクライアント用設定ファイル(.ovpn)を作成する
 - OpenVPNクライアント用設定ファイル(.ovpn)を iTunes 経由でiPhoneに転送する
 - iPhone の OpenVPN Connect から設定ファイルをインポートする

# 手順詳細

詳細は、下記を参照。

https://document.wurlyhub.com/html/Internet_VPN_Nuro_DDWRT.html

# 最も参考になったページ

 - [DD-WRTとiPhone5sでVPNの構築（OpenVPN）](https://ameblo.jp/chocoball-muroi/entry-11788301407.html) (チョコボール室井の報告書)

間違いなく上記のページが最も参考になった。

この情報が無かったら私がOpenVPN環境を構築することはまず無理だったろうと思う。
Rの作図方法がわからなくなった時のWEB検索方法

Rという一文字のせいか、細かいことを検索しようとするとうまくWEB検索できないことがある。

+ [RjpWiki](http://www.okadajp.org/RWiki/)
    + 基本的なことならばここで検索できるし、通常のGoogle検索でも事足りる。「R t検定」とかならね。
+ [seekR](http://seekr.jp/)
    + Rにのみ特化した検索が出来る

なのだが、たとえば作図の時、関数名を知っていてその使い方を知りたいならRのHelpでもGoogle検索でもseekRでも対応出来るのだけど、図を複数並べたい、凡例を変えたい、値の大きさが異なる棒グラフを描くので2軸で表示したい、などとなるとそもそもどういう検索をしたらよいのか分からない。「R 複数の図」などの検索でもたくさんヒットするけど、どのページが自分の思う結果か1つ1つリンク先を見ないと分からない。
そういうときはGoogleの画像検索だ。

+ 「R 複数の図」でGoogle検索をする。
+  検索結果にて「画像」をクリックする。
+  ヒットした画像から自分の表示したい図に近いものをクリックする。
+  その画像を含むページのサマリーが表示されるので右側の「表示」をクリックする。
+  その画像を含むページが表示される。その図を探すとたいてい近くに、その図を表示するためのコードがある。

ggplot2の細かいオプションなどはたいていこれで探している。
1つのゲームオブジェクトから複数の同一コンポーネントを取得


unityチュートリアルの[サバイバルシューター](https://unity3d.com/jp/learn/tutorials/projects/survival-shooter-tutorial)の中身をいじっていて、1つのゲームオブジェクトにEnemyManager.csが3つアタッチされていて戸惑ったのでメモ。

![スクリーンショット 2017-10-14 21.27.17.png](https://qiita-image-store.s3.amazonaws.com/0/136286/01f4fa5a-529f-239c-96c6-a9e09e99a6f3.png "スクリーンショット 2017-10-14 21.27.17.png")

[GameObject.GetComponents](https://docs.unity3d.com/jp/540/ScriptReference/GameObject.GetComponents.html)で、コンポーネントの配列を取得する。

```c
private EnemyManager[] scripts;
private const int INTERVAL_UPDATE = 100;
private int nextTargetScore = INTERVAL_UPDATE;

void Start() {
	scripts = GameObject.Find("EnemyManager").GetComponents<EnemyManager>();
}

void Update() {
	// 100ptごとにspown率を更新
	if(score >= nextTargetScore){
	    nextTargetScore += INTERVAL_UPDATE;
	    foreach (var script in scripts)
	    {
	        script.UpdateSpown();
	    }
	}
}
```


> 参考
[同一のComponentを別々に取得](https://boccilog.wordpress.com/2015/07/06/%E5%90%8C%E4%B8%80%E3%81%AEcomponent%E3%82%92%E5%88%A5%E3%80%85%E3%81%AB%E5%8F%96%E5%BE%97/)
【Android】KotlinからJavaへ変換（デコンパイル）する手順

今更感ありますがKotlinからJavaへ変換（デコンパイル）する手順メモです。
昔はコマンドラインで変換する必要があったみたいですが今はGUIで簡単にできます。

## 環境
- Android Studio: 2.3.3
- Kotlin: 1.1.50

## GUIでデコンパイル
`tools` > `Kotlin` > `Show Kotlin Bytecode`
![](https://qiita-image-store.s3.amazonaws.com/0/123122/1a947abf-250f-d1a1-d0c8-c62584f7b499.png)

`Decompile`ボタン押下
![](https://qiita-image-store.s3.amazonaws.com/0/123122/c8125f23-7daa-e090-5d48-936f42bac832.png)

そうすると`ファイル名.decompile.java`ができます。

## 補足: CUIでデコンパイル

コンパイル

```
kotlinc foo.kt -include-runtime -d foo.jar
```

jarを解凍してclassファイルを取り出す

```
$ jar -xvf foo.jar
```

取り出したclassファイルをデコンパイル

```
$ jad -s java -d src -r **/*.class
```

## 参考
How to convert a kotlin source file to a java source file - Stack Overflow
https://stackoverflow.com/questions/34957430/how-to-convert-a-kotlin-source-file-to-a-java-source-file
Powershell とりあえずファイルのプロパティを全部出してみるスクリプト

```powershell:PS_GetWindowsFileAllPropertyValue.ps1
$Shell = New-Object -ComObject Shell.Application
$Folder = $Shell.NameSpace("C:\hoge")
$file = $folder.ParseName("hoge.txt")
$total=512
$file | Get-Item | Select-Object * | Out-Host | Out-Null
for($i = 0; $i -lt $total; $i++){
$GET = $Folder.GetDetailsOf($File,$i)
Write-Host $i,$get}
```

#解説
一説によるとウィンドウズ10あたりのファイルは全部で287のプロパティがあるそうなので、とりあえず全部コンソール画面に出力するPowershellのスクリプトです。
これで***コンソール画面に表示されたデータ***と、
一般的なプロパティの開き方エクスプローラー、ファイルを選択 ALT+Enter
で開いたプロパティと比較してプロパティ名を突き止めます。
みたとおりasfファイルでも読み取れます。

##ポイント１
まずフォルダだけ先に決めます
しかし、このとき名前空間としています。、
\$Folder = \$Shell.NameSpace("C:\hoge Documents")

##ポイント2
さらに名前空間からパースしており、Parsenameが出ます。
\$file = \$folder.parsename("hoge.asf")

まあ元がShell.Applicationを使っているとはいえ、うっかりすると忘れそうです。
検索してこのページが出なくても複数のページからこれは作れるはずです。しかしうっかりすると見落としてしまいます。
Spring Boot で Google ログイン認証を利用する

Spring Boot (Spring Social) でのログイン連携については、既に親切な方が下記の記事にまとめてくれています。

spring-socialとspringbootでSNSログインを実装する
https://qiita.com/kunikunipon/items/3a9bd6aaa2756456fe38

以下は Google ログイン認証を使おうとしてハマった点のメモです。

# OAuth 認証情報の取得とプロパティ設定
* spring.social.google.app-id: [Developer Console の「API とサービス」](https://console.developers.google.com/apis/credentials)で取得した OAuth クライアント ID
* spring.social.google.app-secret: 上記で取得したクライアントシークレット

なお「承認済みのリダイレクト URI」には「 http://localhost:8080/auth/google 」を設定します。

プロパティは通常 application.yml 等で指定して良いのですが、公開予定のあるものは誤って残すと怖いので、(自分は) STS の実行設定で指定しています。

# spring-social-google はコミュニティ版？を使う
Gradle 等の依存関係には [com.github.spring-social グループのもの](https://github.com/spring-social/spring-social-google)を指定する必要があります。
Gradleの場合:

```groovy
	// https://mvnrepository.com/artifact/com.github.spring-social/spring-social-google
	compile group: 'com.github.spring-social', name: 'spring-social-google', version: '1.1.3'
	// ログイン連携に必要
	// https://mvnrepository.com/artifact/org.springframework.social/spring-social-security
	compile group: 'org.springframework.social', name: 'spring-social-security' // , version: '1.1.4.RELEASE'
```
[Spring Social 本家の spring-social-google (v.1.0.0.RELEASE)](https://mvnrepository.com/artifact/org.springframework.social/spring-social-google) は古く、現在の Spring に対応していません。[^1]
[^1]: @EnableGoogle を付けると ClassNotFoundError を吐いて死にます。

# GoogleAutoConfiguration をインポートする

```java
@SpringBootApplication
@Import(GoogleAutoConfiguration.class)
public class SpringSocialSboxApplication {
```
Spring Boot において spring-social-google は現在外様の扱いらしく、デフォルトでは AutoConfiguration されません。
今回一番のハマりどころ。

# [Bug]STS3.9.0 では VM arguments の末尾に「-noverify」が挿入される
本題からはズレますが作業記録として。
STS3.9.0 で「Spring Boot App」として起動した場合、「VM arguments」の末尾にスペースなしで「-noverify」が追記されます。
なので、[最後に「-noverify -Ddummy=」等と書いておかないと](https://stackoverflow.com/questions/45198922/spring-sts-eclipse-noverify)、プロパティが正しく設定されません。

自分はこれで appSecret にゴミが入り、 Google に弾かれていてしばらく悩みました。今回二番目のハマりどころ。

# サンプルコード
https://github.com/kuinaein/spring-social-google-example/commit/bc7c69fe666d628be2604fd752b4eab012f94920
アラートコントローラーにテキストフィールドを入れる

今回は、管理系アプリでよく見る”テキストフィールド”を含んだアラートの実装をしてみました。

##テキストフィールド付きアラートを作成
UIAlertActionのように、アラートコントローラー作成時に追加できるようです。

```
 UIAlertController *aleartController =
    [UIAlertController
     alertControllerWithTitle:@"タイトル"
     message:@"メッセージ"
     preferredStyle:UIAlertControllerStyleAlert];
    
    UIAlertAction *cancelButton =
    [UIAlertAction
     actionWithTitle:@"キャンセル"
     style:UIAlertActionStyleDefault
     handler:^(UIAlertAction *action)
     {
         NSLog(@"キャンセル");
     }];
    
    UIAlertAction *saveButton =
    [UIAlertAction
     actionWithTitle:@"保存"
     style:UIAlertActionStyleDefault
     handler:^(UIAlertAction *action)
     {
         NSLog(@"保存");
     }];
    
    // アラートアクションを追加
    [aleartController addAction:cancelButton];
    [aleartController addAction:saveButton];
    
    // アラート内にテキストフィールドを追加
    [aleartController addTextFieldWithConfigurationHandler:^(UITextField *textField) {
        
        textField.placeholder = @"テキスト入力してください。";
        // デリゲートを宣言
        textField.delegate = self;

    }
     ];
    // アラートコントローラーを表示
    [self presentViewController:aleartController animated:true completion:nil];

```

####デリゲートメソッドの使用
アラート作成時にデリゲートを宣言することで使用できます。

```
- (BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string {

    NSLog(@"テキストを変更しました。");

    return YES;
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    NSLog(@"テキストの編集を完了しました。");
}

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    NSLog(@"テキストの編集を開始しました。");
}
```

####独自のメソッドを追加
デリゲートメソッドとは別に、テキストフィールドに独自のメソッドも設定できます。
テキストフィールド作成時に設定します。

```
 // アラート内にテキストフィールドを追加
    [aleartController addTextFieldWithConfigurationHandler:^(UITextField *textField) {
        
        textField.placeholder = @"テキスト入力してください。";
        // デリゲートを宣言
        textField.delegate = self;
        
        // テキストフィールドにメソッドを設定することも可能
        [textField addTarget:self action:@selector(didChangeTextField:)
            forControlEvents:UIControlEventEditingChanged];
        
        [textField addTarget:self action:@selector(didBeginEditingTextField:)
            forControlEvents:UIControlEventEditingDidBegin];
        
        [textField addTarget:self action:@selector(didEndEditingTextField:)
            forControlEvents:UIControlEventEditingDidEnd];
        
    }
     ];
```

設定したメソッド

```
- (void)didChangeTextField:(UITextField *)sender {
    NSLog(@"テキストを変更しました。");
}

- (void)didEndEditingTextField:(UITextField *)sender {
    NSLog(@"テキストの編集を完了しました。");
}

- (void)didBeginEditingTextField:(UITextField *)sender {
    NSLog(@"テキストの編集を開始しました。");
}

```

##まとめ
アラートコントローラーは使用頻度が多いので、使い方のバリエーションを増やしていきたいです。
ソフトウェアテストの技法

# テストに関するフレームワーク
あらゆるテストは、次に示す「テストを構成する五大要素」から成り立つ。

- テストの実施者
- 網羅性（ガバレッジ）
- 発見したい問題
- 作業内容
- 結果の判定方法

これらの要素を念頭に置き、次に述べるテスト技法を組み合わせる必要がある。
具体的な技法は次に述べる

## テストの実施者に着目したテスト技法
「誰がテストを行うのか」がポイント

- ユーザーテスト（想定ユーザーを対象）
- アルファテスト(社内のテストチームが行うテスト）
- ベータテスト（マーケティングターゲットを対象）
- バグの叩き出し
- 対象分野の専門家によるテスト
- ペアテスト

## ガバレッジテスト
「どこまでテストを行うのか」がポイント
全機能について、他の機能との組み合わせ全てが問題ないことを確認するなら、それはガバレッジ指向。
問題を予測し、それを確認するのなら、そのテストは問題指向と言える。

- 関数テスト（全ての関数を一つづつテストする）
- 機能や関数の組み合わせテスト
- メニューツアー（GUIを操作し、選択肢の全てを確認する手法）
- ドメインテスト（各関数の変数において、良い代表値を選出することで、すべての値でのテストを担保する）
- 同値クラス分類（ある変数において、同じ動作をするとみなせる値集合）
- 境界値テスト
- 最適な代表値によるテスト
- 論理テスト（プログラムにおける全ての論理関係の検証）
- 状態遷移テスト（取りうる全てのテスト状態に遷移させる）
- パステスト（状態遷移における、一連の流れについてサブテストを作成し、担保する）
- ステートメントと分岐のガバレッジ（命令文と分岐ガバレッジを高い率になるようにテストを設計する）
- 仕様や要求に基づくテスト（全ての仕様や要求に対してテスト）
- 組み合わせテスト（様々な変数の組み合わせと、その値を考慮）

## 発見したい問題に焦点をあてた技法
「どのようなリスクがあるか」がポイント

- 入力に関する制約
- 出力に関する制約
- 演算処理状の制約
- メモリに関する制約

## 作業内容に焦点を当てた技法
「どうテストするか」がポイント

- 回帰テスト（リグレッションテスト, 実行済みのテストを再度実施すること。修正が反映されているか、以前のバグに影響を与えていないか、副作用はないか）
- 手順書に従ったテスト
- スモークテスト（全面的な再テストが不要な、回帰テスト）
- 探索的テスト（新しいテスト方法の探索）
- ゲリラテスト, モンキーテスト（焦点を絞ってテストを実施し、効率的にバグを抽出する）
- シナリオテスト
- インストールテスト（いろいろな構成やバージョンのシステムに、異なるインストールを行う）
- 負荷テスト
- 長時間テスト
- 性能テスト

## 合格判定に焦点を当てた技法
「合否の判断基準」がポイント

- 検証情報の組み込みによる自己評価
- 前回の結果との比較
- 仕様書等の文章との比較
- 一貫性の確認（履歴やイメージ、競合他社、ユーザーの期待、目的等から判断する）
PlayFrameworkにEvolutionsを導入してみた話


## 動作環境
- OS OSX
- Play Framework 2.5.10(Java)
- JDK 1.8.0
- MySQL 5.7.18
- IntelliJ IDEA

## Evolutionsとは
EvolustionsとはPlay FrameworkのDBマイグレーションツール。
複数の開発者の間でDBスキーマを簡単に更新し共有することができます。

## 導入背景
ローカルでの開発においては複数の開発者がそれぞれのDBを使ってカラムやテーブルの追加をしていました。ソースコードは同じものをつかっているのに、DBスキーマはそれぞれのものだったので度々手動で更新しなければいけませんでした。DBスキーマを複数の開発者の間で一致させることがEvolutionsを使うことによって簡単になります。

## Evolutionsの使い方

### Evolutionsのセットアップ

#### build.sbtの依存ライブラリリストに`evolutions`を追加

```build.sbt
name := """play-evolutions-sample"""

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayJava)

scalaVersion := "2.11.7"

libraryDependencies ++= Seq(
  "mysql" % "mysql-connector-java" % "5.1.38",
  javaJdbc,
  cache,
  javaWs,
  evolutions
)
```

[![https://gyazo.com/c2fb3c3cd5e366c8b9e0e604334dfc26](https://i.gyazo.com/c2fb3c3cd5e366c8b9e0e604334dfc26.png)](https://gyazo.com/c2fb3c3cd5e366c8b9e0e604334dfc26)
右上のRefresh projectをクリック

#### application.confでの設定を確認

デフォルトではコメントアウトされていますが、念のためfalseになっていないことを確認

```application.conf
play.evolutions {
  # You can disable evolutions for a specific datasource if necessary
  #db.default.enabled = false
}
```
または明示的に`db.default.enabled = true`と記述する

### Evolution Scriptの記述
ディレクトリを作成します
`$ mkdir -p conf/evolutions/default`
`conf/evolutions/default`配下にデータベースを変更するSQLファイルを作成し記述していきます

UpsとDownsの2つのパートからなり記述する内容は以下の通りです

```
# --- !Ups

必要なスキーマの変換方法の記述(SQL文)


# --- !Downs 

上記の変換をもとに戻す方法の記述(SQL文)
```




dummyテーブルを新たに追加したい場合

```1.sql
# --- !Ups
create table dummy(
    id integer not null,
    name varchar(255),
    created_at datetime not null,
    updated_at datetime not null
);

# --- !Downs 
drop table dummy
```

dummyテーブルにカラムを追加したい場合

```2.sql
# --- !Ups
ALTER TABLE dummy ADD(
    deleted_at datetime not null
);

# --- !Downs
ALTER TABLE dummy DROP(
    deleted_at
);
```
#### ファイル名について
最初のスクリプトは 1.sql、2番目のスクリプトは 2.sql、…というようにファイル名をつけていきます。

#### 実行について
`$ activator run`でローカルで走らせて`http://localhost:9000/`へ飛びます
`Apply this script now!`というボタンを押すと記述したEvolution Scriptが実行されます
[![https://gyazo.com/ad537b57cd684f733522cfe19addce03](https://i.gyazo.com/ad537b57cd684f733522cfe19addce03.png)](https://gyazo.com/ad537b57cd684f733522cfe19addce03)

#### Downsについて
Downsは手動では実行されず、Upsの内容が変更された際に実行されます。Downsが実行されてからUpsが実行されるため結果としてデータベースのスキーマが更新されることになります。


## 参考文献
[Evolutions  - 2.1.x](https://www.playframework.com/documentation/ja/2.1.x/Evolutions)
ソースコードは[こちら](https://github.com/ikt2y/play-evolutions-sample)
unityの問題解決覚え書き

unityで起こった問題とその解決方法を記していくページ
通りすがりの心優しい知識人(貴方様)が直してくれたりもっといい方法を教えてくれるという優しい世界。


# unityでデータベース使いたい
ニフティモバイルバックエンドサービスを使うとすごく簡単に使い始められる
http://mb.cloud.nifty.com/
通称:mBaas かっこいいｗ

# uuid発行方法
この世界ではuuidはGuidなんだね。

```
Guid guid=System.Guid.NewGuid();
```
FYI [uuidについて](https://qiita.com/snaka/items/26d779a0e32aa49fbfbb)


# 自端末(ローカル)にデータ保存したい
PlayerPrefs使う。StringとかIntとかならMap調に保存できる
たとえばハイスコア保存するとき

```
String HighScoreKey = "highScore";
int score = 20;

//set
PlayerPrefs.SetInt (HighScoreKey, score);

//get  第二引数は取得できなかったときに返す値
PlayerPrefs.GetInt (HighScoreKey, 0);
```
かんたん

# not contain a definition のエラー、だいたいメソッド小文字説

```
<<クラス名>> does not contain a definition for <<メソッド名>> 
and no extension method <<メソッド名>> of type <<クラス名>> could be found. 
Are you missing an assembly reference?
```

ほんとにメソッドが存在しないか、メソッド名が間違っている。javaコーダーにありがちなのがメソッド小文字だと思いこんでるやつ。
Apache FlexでAdobe AIRアプリを作るための環境作成（インストーラーを利用する場合）

# はじめに

Apache FlexでAdobe AIRアプリを作るための環境作成をします。
Apache Flex SDK Installerを利用してインストールをします。

※Apache Flex SDK Installerは時々うまく動作しなくなることがあるため、zipを利用して環境作成をした方がいいかもしれません。
zipを利用する場合の手順は以下を参照
[Apache FlexでAdobe AIRアプリを作るための環境作成（zipを利用する場合）](https://qiita.com/lune1122/items/67dc781aa66fb4391736)

# 試した環境/バージョン

Windows 7
Apache Flex 4.16.0
Adobe AIR 24

# 環境作成の手順

## Apache Flex SDK Installerのインストール

以下のページにアクセス
http://flex.apache.org/installer.html

ページの一番下にある Download Apache Flex SDK Installer 3.2 (binaries) のところから
apache-flex-sdk-installer-3.2.0-bin.exe をダウンロード

ダウンロードしたexeを実行

以下、続行をクリックするとApache Flex SDK Installerがインストールされる
![1.png](https://qiita-image-store.s3.amazonaws.com/0/102121/3ae9efc1-ec77-98df-eb3a-fd6dbd6ea985.png)

もしAdobe AIRがまだインストールされていない場合は以下が表示されるので、同意するをクリック
![2.png](https://qiita-image-store.s3.amazonaws.com/0/102121/a757b56a-7f6b-ef95-db42-f3f9f89aef53.png)

## Apache Flex SDK、他のインストール

Apache Flex SDK Installer を起動

インストールしたいバージョンを選択し、NEXTをクリック
※2017/10時点では、AIR/Flash Playerのバージョン25以降を選ぶと途中で止まったので、AIR/Flash Playerのバージョン24を選んだ
![3-2.png](https://qiita-image-store.s3.amazonaws.com/0/102121/1405e154-e709-cd55-e667-1eefda243b36.png)

インストール先のフォルダーを指定し、NEXTをクリック
※選んだバージョンが分かるように、インストール先のフォルダーは Flex4.16.0_AIR24_FP24 のようなフォルダー名にするといいかも
![4-2.png](https://qiita-image-store.s3.amazonaws.com/0/102121/e2a50e57-afab-a5b3-c84f-72dfe5af5975.png)

チェックボックスにチェックを入れ、INSTALLをクリック
![5.png](https://qiita-image-store.s3.amazonaws.com/0/102121/0a123e3d-f8a6-3200-121b-97d1d164361a.png)

インストールが始まるので、しばらく待つ
![6.png](https://qiita-image-store.s3.amazonaws.com/0/102121/d408322f-6301-888e-00ba-454849c3d036.png)

完了
![7.png](https://qiita-image-store.s3.amazonaws.com/0/102121/fe897b4b-ce70-9cd2-b939-81365ac6a19b.png)

## システム環境変数の設定

システム環境変数Pathに「インストールフォルダー/bin」のパスを追加する

## 確認

コマンドプロンプトで以下のコマンドが利用できるようになったことを確認する

```
> amxmlc -version
Version 4.16.0 build 20170305
```

環境作成は以上
数式エディタのような感じでLaTeXの数式を生成するオンラインツール

Sphinxで文書を作成している時に数式を記述したい場合、[mathマークアップ] (http://www.sphinx-doc.org/en/stable/ext/math.html)を使ってLaTeXで記述することで数式を簡単に挿入できます。ただし私は肝心のLaTeXに慣れていないため、どのようにLaTeXで記述してよいか分からないことが多々あります。
そこで、ワードの数式エディタのように数式のパーツを選択して数式を作成し、LaTeX表記に変換してくれるツールがないものか探したところ、下記のサイトが見つかりました。

http://www.hostmath.com/


数式のパーツを組み合わせて、LaTeX表現を作成すると同時にレンダリングもしてくれるので、リアルタイムで正しいかどうか確認でき、すごく便利なツールです。
httpsでFacebookシェアボタンの画像が表示されない場合

サイトをhttpからhttpsに移行したところFacebookのシェアボタンが表示されない怪現象に出くわしました。
コンソールを開くと次のエラーが：

![スクリーンショット 2017-10-14 20.23.06.png](https://qiita-image-store.s3.amazonaws.com/0/73576/d166bece-3de1-eb07-c009-d526277ff74a.png)

対策ですが、facebookのスクリプトをhttps経由で呼び出すだけでした：

```
    <script>
        (function(d, s, id) {
            var js, fjs = d.getElementsByTagName(s)[0];
            if (d.getElementById(id)) return;
            js     = d.createElement(s);
            js.id  = id;
            js.src = "https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.9"; // ここをhttpsに変更
            fjs.parentNode.insertBefore(js, fjs);
        }(document, 'script', 'facebook-jssdk'));
    </script>
```
forとforeachとwhereのこと

####forとforeachとwhereのこと
最初にプログラムを作り始めたのは、9年前。
まず苦手だったのが、繰り返し処理だった。
そもそも日常生活には繰り返し処理というのがあまりない。
毎日ご飯を食べるのは、繰り返し処理のひとつだけど、タームが長く毎回違うことなので、繰り返し的な要素が少ない。
幼稚園なんかで「はーい集まって～、おやつあげるね～、はい、はい」って配るのは繰り返し処理だと思うけれど、日常的にはそういうことは少ない。大人数を集めるなんて機会はほとんどない。イベントの受付をする機会もまずないし。
そんなわけで、そもそも繰り返し処理という考え方になじまなかった。
それでも、そういうものだと思うと、foreachでめいめいに処理する、というのは、比較的すんなり入ってきた。

####for
その次の壁がforだった。foreachでは「みんなひとつずつね」という処理で、みんなもひとつずつも匿名的ないい方で済むのだが、forだと全部をカウントする必要がある。
このforのカウントが0からスタートするのか1からスタートするのか、それはもうまったくそれぞれ別個なので、そのたびに考えなければならない。まあ使い慣れてくると、細かく指定できるようになるので、それはそれで役にたつと思うけれども。たとえば25からスタートして、43までとかをカウントするのには、たしかに便利ではある。
でも、スタートもわからないし、エンドもわかりにくい。<を使うか<=を使うかでエンドが変わるわけで。<ならend-1、<=ならendでよい。見た目的には、-1しなくてよい<=endのほうがずっと好みだけれど、forの例文で<=を使うことはまれのようでぜんぜん少ない。
数学は数IIIまでとっていたので、まあそれほど苦手ではないと思うけれど、それにしても-1はないほうがわかりやすいと思う。
増えるのもむずかしい。++って田んぼみたいで。1ずつ増えるときには使うけど、2ずつ増えるときには使えないのかどうなのか。そのあたりもよくわからない。結局2ずつ増えるときにはどうしたらよいかまだ知らない。

####where
そうこうしていると、.Whereがいいと聞いた。
Whereはifなので、「どこ」を連想しているうちには、ぜんぜんちんぷんかんぷんだった。
でも、たぶん100回くらい見ているうちに、使い慣れてきた。今日なんて、すらっと.Where( => )とか書いていて、おお自分すごい、みたいな気持ちになった。たぶんWhereで「どこ」を連想するのではなくて、Whereは関係代名詞的な条件だよと連想するようになったので、使えるようになったのだと思う。
これで、foreachとforとwhereを使えるようになった。
AWSで作成したインスタンスにSSHで接続できないとき

# 環境

+ MacOS 10.12.6

AWSのインスタンス作成後にSSHコマンドで接続しようとした時に

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'my-keypair.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "my-keypair.pem": bad permissions
Permission denied (publickey).
```

となる場合がある。これは、使おうとしているキーペアのパーミッションレベルが甘すぎだよ、もっと絞って、と言っているのである。

```
$ chmod 600 my-keypair.pem
```

とすることでsshコマンドが通るようになる。
PHPからJavaScriptに配列を渡す

JavaScriptを使いこなせるようになりたい途上。

さて、表題の件、結論は**JSON**形式で受け渡しをすればOK。

```php:.php
$php_json = json_encode($php_array);
```

```js:.js
var js_array = JSON.parse('<?php echo $php_json; ?>');
```

※参考サイト消えました…

### 【2018/10/01追記】
JSON.parseをかませるとむしろXSSを許してしまうので、使わない方がよさげです。
（参考）
[PHPからJavascriptに値を渡すときの注意点(ダブルクオートとシングルクオート)](https://qiita.com/Yorinton/items/bfa08b980c7e05c68dd8)

```js:改.js
let js_array = <?php echo $php_json; ?>;
```

PHP5.4以降で使える[json_encode](http://php.net/manual/ja/function.json-encode.php)の[マルチバイト文字エスケープしないオプション](http://php.net/manual/ja/json.constants.php)がありますが、5.3以前なら(?)特に指定しなくても問題ない模様。