OmniAICreator/Qiita-1.07M huggingface dataset:
aliasと関数で幸せになろう(実践編)

# はじめに
[前回の記事](https://qiita.com/belion_freee/items/528ff57b920d559abf3d)で`alias`と`関数`が何であるかと使い方を解説しました。

今回の記事では実際に私が登録してるオススメの`alias`と`関数`を紹介していきます。

ソースだけ欲しい人は[Gist](https://gist.github.com/belion-freee/1b86af577702ce795c4fdf9e18699f99)に挙げてるので、こちらを丸っと`~/.bashrc`や`~/.ｚshrc`にコピーして使ってくださいね。

# alias編
先ずはaliasから紹介していきます。

## コマンド短くする系
`docker`とか`docker-compose`コマンドって長くて打つの面倒臭くないですか？
こういった長いコマンドはまとめて短くしちゃいましょう

```
alias d='docker'
alias dc='docker-compose'
alias h='heroku'
alias py='python3'
alias wi='which'
alias cl='clear'
alias to='touch'
alias g='git'
alias hi='history'
alias bu='bundle'
alias ra='rails'
```

こんな感じで1文字か2文字くらいにしてます。

## lsコマンド
頻繁に使うlsコマンドも良い感じに設定しましょう。

僕は全て表示したいので、詳細表示の`-l`オプションとドットファイルも表示する`-a`オプションを同時に使用してます。

```
alias ll='ls -G -al'
```

こんな感じで使い分けてもいいと思います。

```
alias ll='ls -G -l'
alias la='ls -G -a'
```

### カラーオプションについて
`-G`はMacで使用する際のオプションになってます。
その他のLinuxディストリビューションで使う際は`--color=auto`を使用しましょう。

## cdコマンド
超使用頻度の高い移動コマンドのcdコマンド。
例えば、プロジェクトフォルダや頻繁に移動するフォルダのaliasを登録しておくと便利。

```
alias cdh='cd ~/project/hoge/'
alias cdf='cd ~/project/fuga/'
```

### 親ディレクトリに移動
親ディレクトリに移動することって地味に多いですよね。そんな時に便利なalias。

```
alias ..='cd ..'
```

## grepコマンド
こちらも使用頻度の高いコマンドですね。カラーオプションをつけて見易くします。

```
alias gr='grep --color'
```

### aliasの`-g`オプション
因みに、シェルにzshを使用していれば、aliasの`-g`オプションを使ってパイプが使えるようになります。

```
alias -g gr='| grep --color'
```

使い方はこんな感じ。すごーい。

```
% hi gr ssh
30589  pss sshuttle
30592  pss ssh
30594  ssh-wo
30595  pss ssh 
```

## rmコマンド
ファイル削除で使うコマンドですね。
ファイルを削除する際に問い合わせる`-i`オプションを指定します。

逆に、一気に消したい時は、ディレクトリも含め再帰的に削除する`-r`オプションと、警告を表示しないで強制的に削除する`-f`オプションを使用します。

```
alias rmi='rm -i'
alias rmf='rm -fr'
```

## 設定ファイル操作系
zsh(bash)ファイルでaliasや関数を結構頻繁に追加するので、それもついでにalias書いときます。

### 書き込み時
ホームディレクトリにある`.zshrc`をvimエディタで編集します。

```
alias viz='vi ~/.zshrc'
```

### 読み込み時
設定ファイルは書き込んだ後に`source`コマンドで読み込むのを忘れないようにしてください。

```
alias sz='source ~/.zshrc'
```

## PATHの確認
環境変数のPATHを確認することも地味に多いので登録しとく。

```
alias path='echo $PATH'
```

# 関数編
次にオススメの関数を紹介します。

## プロセスの確認
プロセスの確認をするのに便利な関数。
出力結果からgrepコマンドのプロセスを除外して、ヘッダを付与します。
すごいお気に入りの関数。

```
pss () {
	ps aux | grep -E "PID|$1" | grep -v grep
}
```

使い方はこんな感じ。第一引数にgrepしたい文字列を指定する。

```
% pss ssh
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
me 45486 0.0 0.0 4297712 5716 s000 S+ 6:08PM 0:00.03 ssh wo-hoge
```

## 文字列検索
対象の文字列が記述されてるファイルを検索する関数。
これもリモートサーバで頻繁に使う。
ローカルだとAtom等のテキストエディタ使ってると、使用する機会は少ないかも。

```
gre () {
	grep -E $1 -rl $2
}
```

使い方はこんな感じ。第一引数に文字列、第二引数に検索対象のディレクトリを指定する。

```
% gre session app
app/controllers/application_controller.rb
```

## Railsのマイグレーションコマンド
これも地味に長いのでCASE式を使って使い易くしましょう。

```
db() {
        case $1 in
                "st") bundle exec rails db:migrate:status ;;
                "up") bundle exec rails db:migrate:up VERSION=$2 ;;
                "do") bundle exec rails db:migrate:down VERSION=$2 ;;
                *) echo "plese give the params st, up, do " ;;
        esac
}
```

使い方はこんな感じ。第一引数に`st`か`up`か`do`を指定、第二引数に操作したいマイグレーションファイルのバージョンを指定する。

# まとめ
思ったより登録してるコマンドが多くなかったですorz...
こんな感じで自分で使いたいコマンドをどんどん登録していくと便利になります。
参考にして見てください。
Git で差分確認するときに利用頻度が高いオプション

Git を使っていると、差分をチェックする機会には事欠かないはず（少なくとも私はそう）。

普通に `git diff` とだけすると、

* ちょっと構造だけが変わったようなのは、差分量が無駄に多く見える
    * 要は関連箇所のインデントが変わることで全部差分に見える
* コミット直前、実際に反映される予定の差分は見れない
* バージョン管理されていないファイルの差分は確認できない
* 差分のあったファイルだけを把握するには少々向かない
    * いやまぁそれは `git status` でも使えばいいやんという感じですが

等と、ちょくちょく使い勝手が悪い感じがするというか。個人的にはコミット前のチェックができないのは辛すぎる。 ~~まぁ別にコミットミスった後の微調整反映については `git commit --amend` なり `git rebase -i` なりで適宜すりゃ良いんですけど~~

ただ、当たり前ながら、その辺の要求に対しては適切に利用可能なオプションがあるので、別に諦める必要はないです。やりたいことをスマートに、 **提供された機能で** 解決するのが技能者の本懐。作り込むなら最低限に。

### `git diff -w` : ホワイトスペース差分の無視

ホワイトスペース差分、つまり「空行の追加 / 削除」とか「半角スペースのみの変更」とかを冗長視した差分確認ができます。リファクタリングで「内部挙動のインデントだけがちょっと変わった」みたいな時に重宝します。

Git と直接関係があるわけではないですが、 GitHub で差分を見るときは、URLの末尾に `?w=1` と付与してやると同じように差分が見れるので、たまに便利。他にも色々ありそうな気はしますが、あまり把握してません。 ~~そもそも差分チェック自体を行う時にいちいち指定するのは `-w` くらいな気がするし~~

### `git diff --staged` : ステージング差分の確認

ステージング差分、つまり「コミット時に実際に反映される」差分の確認ができます。コミットそのものの妥当性を事前検証（最終チェックか）する時に非常に重宝します。 ~~私は直前に3回くらい見ます~~
コミット予定の差分が見れるということは、 **バージョン管理される前のファイルの追加についても捕捉することが出来る** ので、事前に追加予定の対象ファイルを `git add` しておくことによって、そのファイルも単に同コマンドで「シームレスに変更差分として認識できるようになる」というメリットもあります。

ちなみに `git diff --cached` も同じ作用を持ち（エイリアス）、私個人は `--cached` の方をよく使っています。その辺は各人の運指とかの好みとかで好きな方を使うといいのではないでしょうか。

### `git diff --name-only` : 変更があったファイル名称だけ確認

文字通り、差分のあるファイルの名前だけが出力されます。正確には相対パスか。
…とだけ言うと「いや、何に使うねん」という話なのですが、コマンドを連結して色々やるような場面では「名称だけが取得できると便利」という場面もあるので、知っておくと便利な場合がたまにあります。

```shell
# 例えば Guard に更新を捕捉させれば、検証の自動実行を発火するように仕向けられる環境なら
# 「コミット直前の反映対象」に対して touch を実行するとか
git diff --staged --name-only | xargs touch
 
# 「結合要求先と差分があるファイル群」に対して touch を実行するとか
git diff --name-only origin/develop | xargs touch
```

~~こいつずっと `touch` ばっかやってんな~~
というかこれは実際に業務で「出来んかな」ってなってただけなんですけどね。実際できました。

今回は検証向けに `touch` がやりたかっただけで、後者は理想的には `origin/develop` みたいな指定を抜きに upstream の設定対象を起点にしてチェックできると良かったのですが、多分その辺は `git diff` じゃなくて別のコマンドを使うべきなんだろうなと予想しています。

#### というか本当に困ったら `git diff --help` を見よう

まぁ実際のところ、こういうので困ったときは、普通に公式のドキュメントを閲覧するのが一番確実なんですけどね。差分確認周りは `git diff --help` で見れますし。
Djangoで利用するコマンドまとめ

# はじめに
普段、業務でDjangoを利用していて、コマンドを度々忘れてしまうので、
ここにメモしてコピペできるよう作りました。

# 環境
macOS Mojave 10.14
Python3.x.x
Django2.x

# セットアップ編
## Djangoインストール
  
作成するアプリケーションごとにライブラリ等合わせる必要があるので、
プロジェクトディレクトリに`virtualenv(venv)`を作成

- プロジェクトのディレクトリ作成（プロジェクトに）

```
mkdir python_project
cd python_project
```

- venv作成

```
python3 -m venv myvenv
```

- `virtualenv`起動

```
source myvenv/bin/activate
```

- Djangをインストールする前にvenv環境をアップデート

```
(myvenv)~$ pip install --upgrade pip
```
- Djangoインストール

```
(myvenv) ~$ pip install django==2.1
```

# プロジェクト作成編
- プロジェクト作成

```
(myvenv)~$ django-admin startproject sample_project .
```

- 現状のファイル構造

```
python_project
├── manage.py
└── sample_project
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py
```

# app作成＆実行編
- アプリケーション作成（manage.pyが存在するディレクトリで実行）

```
(myvenv)~$ python manage.py startapp sample_app
```

- DBに入れるための移行ファイルの作成とマイグレーション

```
(myvenv)~$ python manage.py makemigrations sample_app
(myvenv)~$ python manage.py migrate
```
- サーバ起動

```
(myvenv)~$ python manage.py runserver
```

# shell編
- shell起動

```
(myvenv)~$ python manage.py shell
```

- モデルインポート

```
>>> from sample_app.models import *
```
- モデルデータ全取得

```
>>> 'モデル名'.objects.all()
```

- DBにデータ投入（saveコマンドで投入データを保存）

```
>>> data = 'モデル名'('カラム名'='値', 'カラム名'='値',...)
>>> data.save()
```
- 特定のオブジェクト取得

```
>>> data = 'モデル名'.objects.get('カラム名'='値')
>>> data.'カラム名'
'値'
```
- 特定のオブジェクト削除

```
>>> data = 'モデル名'.objects.get('カラム名'='値')
>>> data.delete()
```
# その他

- 既存DBからテーブルのモデルを出力

```
(myvenv)~$　python manage.py inspectdb　tablename 
```

- モデルからER図作成

事前にインストール

```
(myvenv)~$　brew install Graphviz
(myvenv)~$　pip install pygraphviz
(myvenv)~$　pip install django-extensions
```
ER図作成(settings.pyでextensionsを有効化)

```
(myvenv)~$　python manage.py graph_models -a -o er.png
```


# 参考
- [Djangoをインストールしよう
](https://djangogirlsjapan.gitbook.io/workshop_tutorialjp/django_installation)
- [Djangoメモ(5) : 対話型シェルでAPIを使ってみる](https://wonderwall.hatenablog.com/entry/2018/03/07/213000)
- [Python入門 Djangoの使い方（その14）PythonシェルでDBを操作する。](https://tech.pjin.jp/blog/2017/06/30/python-primer-28-django-14/)
- [【Python】Djangoで既存のデータベースの特定のテーブルのモデルを自動生成する方法](https://a-zumi.net/python-django-inspectdb-table/)
いまさらながらのSOAP処理 ruby gem Savon

# 誰向け記事
1. rubyでSOAPを扱う必要がある人
2. ちょっとrubyを触ったことがある人

# なぜいまさら、SOAP
お仕事の関係で、SOAPを扱う必要がでてきました。BtoBではまだ現役で使われているところもあるかと思います。
なお、私はSOAPについて未経験。

> SOAPとは

> SOAP（ソープ）は、コンピュータネットワーク内のWebサービスの実装において、構造化された情報を交換するための通信プロトコルの仕様である。拡張性、中立性、独立性を導入することを目的とする。XML-RPCから発展した、XML Webサービスのための、XMLベースのRPCプロトコルである。

> 出典：wikipedia

言うならば、昔のAPIプロトコルですね。RESTでやるのが現代のスタンダードだと思います。


いいGemはないかしら、と探しているとありました。

[Heavy metal SOAP client](https://github.com/savonrb/savon)

## 基本的な使い方

```
client = Savon.client(wsdl: 'http://service.example.com?wsdl')
client.operations # 使えるオペレーションの一覧がでる
response = client.call(:find_user, message: { id: 42 }) # find_userというオペレーションでid 42をとってこいみたいな。
response.body # HTTPレスポンスのボディ、hashで値が入っています。
```

## 渡すパラメータに型を明示する
SOAPではmessageで渡すパラメータに型を明示させることができるみたいで、その指定方法にはまりました。

やり方は下記のように

```型を明示する
client = Savon.client(
  wsdl: 'http://service.example.com?wsdl', 
  namespaces: { "xmlns:xs": "http://www.w3.org/2001/XMLSchema" } # 名前空間どれ使うかを指定できる。
) 
client.call(:update, message: {id: 42, attributes!: { id: "xsi:type": "xs:int" } } # idのタイプ指定を追加
```
ask-cliでalexa skillをデプロイした時に自動生成されたIAMロールで、DynamoDBを使えるようにする

絶対忘れるのでメモ。



## 課題

- alexa skill一式をask-cliでデプロイし、lambda関数が生成されたので、
alexa developer Consoleのテスト画面で呼び出してみたが、INVALID_RESPONSEになってしまう。

- AWS lambdaのManagement consoleから、「amazon alexa start session」をコピーしたテストイベントを実行してみると、「テーブルが作れません」という意味のエラーが出ていた。

```
AskSdk.DynamoDbPersistenceAdapter Error: Could not create table (テーブル名)
```
- lambda 関数を見たら、DynamoDBへのアクセス権限がなかった。omg

<img src="https://qiita-image-store.s3.amazonaws.com/0/173392/2c493d2f-b015-ab7b-f41f-aa1e2dd7cc3b.png"  width="100%">

- そういえば、lambda 関数のコード上では以下のように「セッションはDynamoDBに保存する、存在しなければ作成する」と指定していた。

```
exports.handler = skillBuilder
  .addRequestHandlers(
    LaunchRequestHandler,
　　（中略）
  )
  .withTableName("テーブル名") // セッション情報を保存するDynamoDB上のテーブル名
  .withAutoCreateTable(true) // テーブルが無ければスキルから作成する
  .addErrorHandlers(ErrorHandler)
  .lambda();

```

- しかし「ask new」でゲットしたサンプルコードの中には、DynamoDBを使う場合のIAMロールの指定箇所がみあたらない。これは一体どこで書くのだろう？



## 解決策
設定ファイルらしきものを小一時間捜索しましたが見当たらないので、AWSコンソールで直接IAMをいじって解決。

###(1) IAMコンソールで自動生成されたロールを探し、権限付与
[AWSのコンソール＞IAM＞ロール](https://console.aws.amazon.com/iam/home?region=us-east-1#/roles) を開き、該当のalexaスキル名の頭に「ask-lambda-」がついたロールを探す。

- 参考）ask-cliでデプロイした場合のスキル名とLambda関数名とロール名の関係
 - スキル名：**nightwatch_snow_cli** （skill.jsonのmanifest内のnameで指定した文字列）
 - Lambda関数名：ask-custom-nightwatch_snow_cli-default
 - ロール名：ask-lambda-**nightwatch_snow-cli**

<img src="https://qiita-image-store.s3.amazonaws.com/0/173392/fc3b5757-58f1-cbdd-b207-df3be38626f8.png" width="80%">



ロール名をクリック
＞「ポリシーをアタッチします」ボタンをクリック
＞「ポリシーのフィルタ」入力欄に「Dynamo」と入力
＞「AmazonDynamoDBFullAccess」にチェック
＞「ポリシーのアタッチ」をクリック



###(2) Lambda関数を実行し、テーブルに書き込みされるのを確認

Lambda関数のテストイベントを実行。
エラーが出なくなっていることを確認。（違うエラーは出たけど(w）
AWSのDynamoDBコンソールで、テーブルが生成されていることと、
テーブル内にセッション情報が書き込みされていることを確認。


### (3) Todo
Lambda関数のコンソールに戻って再読み込みすると、DynamoDBだけでなくEC2なども権限もついている。IAMロールで AmazonDynamoDBFullAccessを選ぶとこうなってしまう。そもそもDynamoDBについてもfullじゃなくていい。後で減らす。

以上でぃす！
高品質なSwiftチュートリアルのパート２の翻訳が終わりました


自己サイトの宣伝です。
良質なiOSチュートリアルを提供しているraywenderlich.comから、SpriteKitを使ったゲームチュートリアルの翻訳をしています。
パート２の翻訳が終わりましたのでその報告です。全部でパート３まであり、パート３を残すのみとなりました。
本当に高品質なチュートリアルなので、勉強会とかに使ってもらえたら嬉しいです。
自由にHTMLもっていってもらって構いません。
https://www.doumeishi.me/raywenderlich.com/
他の端末のファイルへアクセス時にログインユーザーを間違えてしまってアクセスできなくなった際の対応(Windows)

# 結論
Windowsのコマンドプロンプトからnet useコマンドを使用しログアウトして、やり直す

```shell
net use * /delete
```

# 説明
## アクセスするユーザを間違えた

他の端末のフォルダへエクスプローラでアクセスする際にログインを求められ、
アクセス権限のないユーザ等でログインしてしまいファイルが参照できませんでした。

ここで問題が起きます。

## フォルダを再度開きなおしても、認証画面が表示されず権限エラーが発生する

一度ログインするとそのユーザでログインした状態が保たれてしまい
アクセスできなくなります。

## 他端末へのアクセス時のユーザをログアウトする

コマンドプロンプトを開き、下記コマンドを実行する。

```shell
net use * /delete
```

参考:
[別のユーザー名で共有フォルダを利用する「net use」](https://tech.nikkeibp.co.jp/it/article/COLUMN/20080125/292051/)
Firestore Local EmulatorのScala接続サンプル

Firestoreには[Javaでのサンプルが提供されています](https://github.com/GoogleCloudPlatform/java-docs-samples/tree/master/firestore)。
とりあえずこれのQuickstart.javaをScalaかつLocal Emulatorに接続するように実装してみました。

コードは[Githubにあげてあります。](https://github.com/aono-sinya/scala-firestore-sample)

Cloud DatastoreのLocal　Emulatorはクライアントの接続時にサービスアカウントのjsonファイルを使用しなければローカルに接続可能ですが、0.79.0-beta現在ではFirestoreでは明示的に指定しなければ接続出来ないようです。
また、ScalaのMapをライブラリに渡すとPojoとして認識されてしまうようです（当然と言えば当然）。
Scalaのクラスではgetterを作らず、フィールドに直接アクセスすることが多いかと思いますが、google-cloud-firestoreライブラリにその形のクラスのインスタンスを渡すと例外を吐きます。
getterは必ず必要なようです。

で、これ書いてる時に[MVN Repository](https://mvnrepository.com/artifact/com.google.cloud/google-cloud-firestore)見たら0.80.0-betaがリリースされてるわけですが、どなたか試してもらえませんかね…。
Python基本備忘録

pythonを始めたので備忘録を残します。

# コーディング規約

[PEP 8 -- Style Guide for Python Code](https://www.python.org/dev/peps/pep-0008/)

# コンソール入力

```python
input()
```

これだけでコンソール入力が可能。
Javaだと長々書かなくちゃいけないので非常にラクですね。

```python
# コンソールに文字を出して入力を促す
input('input num : ') # => input num : 1

# split関数を用いてスペース区切りで1行の入力を受け取る
input('input num : ').split() # => input num : 1 2 3 4 5
```
Mariadb で　ユーザー定義変数を使って値をコピー

SQL　でユーザー定義変数を使って値をコピーします。

スタート時点のテーブルの状況

```text
> select * from cities;
+-------+--------+------------+------------+
| id    | name   | population | date_mod   |
+-------+--------+------------+------------+
| t3321 | 岡山   |     529176 | 2003-09-20 |
| t3322 | 倉敷   |     791835 | 2003-02-15 |
| t3323 | 津山   |     163754 | 2003-08-18 |
| t3324 | 玉野   |     369172 | 2003-01-09 |
| t3325 | 笠岡   |     237451 | 2003-03-04 |
| t3326 | 井原   |     518397 | 2003-05-21 |
| t3327 | 総社   |     248156 | 2003-07-23 |
| t3328 | 高梁   |     478294 | 2003-10-26 |
| t3329 | 新見   |     863751 | 2003-12-15 |
+-------+--------+------------+------------+
```

id が t3328 の　population を t3329 の population にコピーします。

1) @vx に値を代入します。

```text
> select population into @vx from cities where id = 't3328';
Query OK, 1 row affected (0.000 sec)
```

2) @vx の値を使って更新します。

```text
> update cities set population=@vx where id='t3329';
Query OK, 1 row affected (0.068 sec)
Rows matched: 1  Changed: 1  Warnings: 0
```

3) 結果を確認

```text
> select * from cities;
+-------+--------+------------+------------+
| id    | name   | population | date_mod   |
+-------+--------+------------+------------+
| t3321 | 岡山   |     529176 | 2003-09-20 |
| t3322 | 倉敷   |     791835 | 2003-02-15 |
| t3323 | 津山   |     163754 | 2003-08-18 |
| t3324 | 玉野   |     369172 | 2003-01-09 |
| t3325 | 笠岡   |     237451 | 2003-03-04 |
| t3326 | 井原   |     518397 | 2003-05-21 |
| t3327 | 総社   |     248156 | 2003-07-23 |
| t3328 | 高梁   |     478294 | 2003-10-26 |
| t3329 | 新見   |     478294 | 2003-12-15 |
+-------+--------+------------+------------+
```

4) @vx の値の表示

```text
> select @vx;
+--------+
| @vx    |
+--------+
| 478294 |
+--------+
```
Lambda Function の開発について悩んだところをまとめてみた

## はじめに

仕事で Serverless なアプリケーションを実装することがあり、設計や実装にあたって悩んだことをまとめてみました。
同じようなところで悩んでいる人の助けになるかな、と思い。

## LambdaFunction の大きさについて

1つの大きなLambdaFunctionにする（以後 **"Monolith"** と表記します）のと、小さなLambdaFunctionをStepFunctionsで組わせて実装する(以後 **"MicroFunctions"** と表記します)やり方の両極端が考えられます。

### **"MicroFunctions"** で実装するメリット

* 関数の影響範囲を分離しやすい
* 失敗した箇所の特定がしやすい
* 処理に失敗したときに、**失敗したところだけが再試行される**ので再試行の処理時間が平均的に短縮されることが期待できる
* 1つ1つのコードの処理時間が短くなるので、timeout するリスクが減る

### **"MicroFunctions"** で実装するデメリット

* StepFunctions は処理時間でなく**状態遷移の回数で課金される**ため、分割を小さくすればするほど、コストパフォーマンスが悪くなる。
* 分割数が増えるほど、コールスタックの解析がしにくくなるので、分散トレースのしくみを検討する必要がある

コードがある程度規模が大きくて複雑な場合は、長期的な保守のしやすさを考えて最初から **"MicroFunctions"** で設計しておくのがおくのが良いと思います。コードの規模が小さい場合や、とりあえず早く作りたい場合は**"Monolith"**で実装して、あとから**"MicroFunctions"**に移行してもいいと思います。

## Test 戦略について

まずは、[和田卓人さんのスライド][wada-takuto]に目を通してください。Lambda Function のテストについて、大切な概念がとてもわかり易くまとまっていて、さらに実践的なコードも載っています。

基本的な戦略は以下です:

* **依存性の注入(dependency injection)** によって、ローカルでテスト可能な部分を、そうでない部分と分離する。
* **ローカルでテスト可能な部分を限りなく増やす**ことで、開発サイクルを高速化する
    * 手作業によるテスト: 30分 => ローカルで実行する自動テスト: 5秒

ローカルでテストができるようになることで、 **コードを書いて実行結果を得る、というフィードバックサイクルが劇的に早くなります**。テストコードが実装されていることで、リファクタリングががんがんできるメリットもあります。

なお、このスライドの内容をもとに[サンプルコード][sample-code]を作ってみましたので、こちらも参考にしてみてください。

## 共通コードの管理について

実をいうと、上で紹介したテスト戦略を採用すると、**Lambda関数自体の中身はほぼすっからかんになる**ので、自然と独自のライブラリが成長していきます。

いまのところ、独自のライブラリを安全にデプロイする場所としては **Lambda Layer一択**かな、と思います。

## 開発ツールは何を使えばいいか？

AWS SAM, Serverless, APEX を検討しました。それぞれの特徴は以下です。

### APEX

* 3つの中だと最もシンプルなツール。必要最低限なことだけやってくれる
    * Role/Lambda Function の作成
    * zip化 & アップロード
* apex 自身は周辺リソースの作成はやってくれない
    * `apex infra` という terraform の wrapper コマンドが実装されているが、YAMLでリソース定義ができるほかの2つと比べるとインフラの定義のコストがそこそこ大きい
* メインのコミッターが最近ほかのプロジェクトをメインに開発しているせいか、コミュニティの開発スピードが緩やかになっているように感じる。

### Serverless

* Lambda関数のデプロイに加えて、周辺リソースの作成もやってくれる
* 企業でコミットしているので割と開発スピードが早い

### AWS SAM CLI

* Lambda関数のデプロイに加えて、周辺リソースの作成もやってくれる
* デプロイのフローが3つの中では最も堅牢性が高い
    * Lambda Function のビルドを docker container 上で行うオプションがある
    * デプロイ用の資材をS3に配置する(package) ことができる
* Amazon 純正のツールなので、AWS側の変更に対するキャッチアップが早いことが期待できる
* Policy Template など、リソース定義を簡単にするための便利な機能がある

ぶっちゃけ好みの問題だと思いますが、これから開発ツールを選択する場合は Serverless か AWS SAM CLI が良いと個人的には思います。

## 参考

1. [Testable Lambda: Working Effectively with Legacy Lambda][wada-takuto]
2. [billthelizard/aws-sam-localstack-example][sample-code]


[wada-takuto]: https://speakerdeck.com/twada/testable-lambda-working-effectively-with-legacy-lambda
[sample-code]: https://github.com/billthelizard/aws-sam-localstack-example
学校の先生に知っておいて欲しいOSとかブラウザのこと（Windows編）

下北沢オープンソースカフェの河村さんが書かれた[こちらの記事](https://medium.com/@cognitom/programming-in-elementary-school-9442bbea2e70)について自分も「せやな〜」と思ったのですが、学校の先生に限らずPCに詳しくない方は「OS」とか「ブラウザ」という概念を知らないことがほとんどなので（もちろん、それが悪いことだとはいいません）、最低限これだけは知っておいた方がいいかなと思うことをまとめました。ITプロフェッショナル各位のツッコミをお待ちしております。適宜修正・アップデートします（全部取り入れるとは限りません）。

# OSとは
OSとはコンピュータが動作するのに最低限必要なソフトウェア（プログラム）のこと。Windows PCにWindows、MacにはmacOS、Androidタブレット・AndroidスマートフォンにはAndroid、とコンピュータの名前がOSの名前であることがほとんどです。iPadやiPhoneはiOSというOSが搭載されています。

この記事では、Windowsについてのみ記述しています。いずれは他のOSについても書いてみたいと思います。

## Windows XP, Windows Vista
もし、これらのOSが入っているPCがあったら至急対策が必要です。これらはサポートが終了しているためです。もしかすると、インターネットに接続しないことを前提に導入されているケースがあるかもしれませんが、OS以外のソフトウェア（アプリ）が対応していないことが多いので、いずれにせよ機器の更新が必要なはずです。

## Windows 7
学校に入っているWindows PCのほとんどはWindows 7が入っているかもしれません。現時点ではこれでも問題ありませんが、サポートの終了日が2020年1月14日と決まっています。つまり、授業にプログラミングの導入が決まっている2020年度にはサポートが終了しているので、こちらも今からOSのバージョンアップか機器の更新の検討が必要です。
[ Windows のサポート終了期限](https://www.microsoft.com/ja-jp/windows/lifecycle/eos/consumer/default.aspx)

## Windows 8
Windows 8はサポートが終了していて、Windows 8.1へのバージョンアップが必要です。Windows 8のPCがあれば、Windows 8.1へバージョンアップしてください。バージョンアップにかかる費用は無料です。

## Windows 8.1
こちらも現時点ではこれでも問題ありませんが、サポートの終了日が2023年1月10日と決まっています。すぐには問題にならないかもしれませんが、学校の予算が年度単位で決まることを考えれば早めに対応を考えておいた方が良いでしょう。

## Windows 10
現時点で最新のWindowsです。ただ、Windows 10の中でもいくつかの大きなアップデートがあり、使用するソフトウェアによっては最新のアップデートが入っていなければ動作しない、というケースもあるかもしれません。

# ブラウザとは
ブラウザとは、webサイトを見るために使用するアプリです。WindowsにはInternet Explorer(IE)やEdgeが標準のブラウザとしてインストールされていますが、これらの以外のブラウザをインストールして使うこともできます。

## Internet Explorer
通称IEと呼ばれるブラウザです。現在は最新のバージョン11以外はすべてサポートが終了となっています。最新のIE11も開発元の[マイクロソフト社自身が各企業に使用をやめる](https://japanese.engadget.com/2019/02/08/internet-explorer-ie/)ように通知しています。

これは、IEが古い技術で使われているためで、一部のwebサイトではIE11では閲覧できないものもあります。例えば、今年の1月に3.0にアップデートされた[Scratch](https://scratch.mit.edu/)もそのひとつです。

## Edge
IEと同じくマイクロソフト社が開発しているブラウザでWindows 10に標準で搭載されています。Windows 10であれば、IEではなくEdgeを使うべきです。

ただし、webサイトによっては正しく動作しない場合があるかもしれません（私の経験値レベルで）

## Chrome
Google社が開発しているブラウザです。このブラウザをいれておけばほとんどのwebサイトが閲覧可能と言えます。[ここからダウンロードできます](https://www.google.co.jp/chrome/)

## Firefox
Mozilla社が開発しているブラウザです。このブラウザでもほとんどのwebサイトは閲覧可能と言えます。[ここからダウンロードできます](https://www.mozilla.org/ja/firefox/)

## その他のブラウザ
ここに挙げたブラウザ以外にもたくさんのブラウザがありますが、メジャーなブラウザは上記の通りと考えていただいて構いません。

個人的に注目しているのは[Brave](https://brave.com/)というブラウザです。

他のブラウザとの大きな違いは広告を表示させない機能などが標準で入っている点です。

中身はChromeと同じChromiumベースで作られていますので、そういう意味ではChromeの代わりに使えます。

子供達が使うには適していると考えられるのですが、webサイトによっては「個人情報保護機能」によって期待通りの動作にならない可能性がありますので現在自分で使ってみて、その影響範囲を見ているところです。
ChatworkAPIでメッセージを投稿(Ruby) 

ChatworkAPIを使用してメッセージの投稿を行ってみたのでメモ。
ChatworkAPIトークンの発行からrubyで作ったプログラムでメッセージ投稿、cronでの操作を行ってみました。
ここから改造して色々やる予定。

## 投稿方法

### ChatworkAPI公式ドキュメント
http://developer.chatwork.com/ja/

### APIトークンの発行
https://help.chatwork.com/hc/ja/articles/115000172402-API%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E7%99%BA%E8%A1%8C%E3%81%99%E3%82%8B

### メッセージ投稿プログラム

```ruby:chatwork.rb
class Chatwork
  require 'net/http'
  require 'uri'

  ROOMID = #ルームID
  POSTURL = 'https://api.chatwork.com/v2/rooms/#[ルームID]/messages'
  TOKEN = #発行したAPIトークン

  def main
    uri = URI.parse(POSTURL)
    https = Net::HTTP.new(uri.host, uri.port) 
    https.use_ssl = true

    req = Net::HTTP::Post.new(uri.request_uri)
    req['X-ChatWorkToken'] = TOKEN
    req.set_form_data({'body' => 'メッセージ', 'self_unread' => 0}) # bodyは必須

    res = https.request(req)
  end
end

Chatwork.new.main
```
### 実行
```shell
ruby ./chatwork.rb
```
### 投稿結果
ちゃんとメッセージが投稿されました！

![chatwork.png](https://qiita-image-store.s3.amazonaws.com/0/44770/5d1a7be6-e164-bb56-e167-d059abb8d7bf.png)

## cronで回してみる

### cronに追記
プログラムを配置してる場所を指定。

```cron:cron
*/1 * * * * ruby /Users/[ユーザ名]/Documents/git/chatwork/chatwork.rb
```

### 実行結果
1分ごとに投稿されることを確認。
![chatwork2.png](https://qiita-image-store.s3.amazonaws.com/0/44770/02dff26a-fc79-b353-bec9-0078b07532af.png)
ゲーム開発中に気をつけていること

## はじめに
私は数年間ゲーム会社で働いています。
主にUnityやUE4での開発経験がありますので、
今回は開発中にあった気をつけることや、あるある話をメモしておこうと思います。

## 命名
これはコードであっても使用するリソースであってもですが、
**最初に命名したものは絶対後からマネされます。**
継承したり複製されそうなものはしっかりした名前をつけていないと、
- 命名した英語の意味が誤っている
- 命名規則が間違っている
といったことが起きます。
**後から変えるのは面倒なので最初が大事です。**
プロジェクトが始まったときにある程度各セクションごとにしっかり決めれるとベストです。
（コードのお話は他の方の素晴らしい記事があるので割愛します）

## アセット
エンジンなどを使用するとアセットを扱うことになると思います。
適していない命名をしてしまうと
 - 使う人が役割をアセット名から推測できない
 - 大文字、小文字、アンダースコアなどの付け方が不統一になる
 - 保存先が適していない
といったケースが発生します。
また、アセットまでのパスが長すぎると[問題](http://office-qa.com/win/win187.htm)になったりしますので注意です。

## パラメーター
呼び方は色々ありますが、
ここではキャラクターの攻撃力を決めるデータなどのことを指します。
このデータを識別するIDや値が**間違っているとゲームが正常に動かない**ことがあります。
特に多いのが誤字と多重に定義されることによるヒューマンエラーです。
データのインポート前にIDの誤字や多重定義などをチェックする仕組みを用意しておくと不具合が減って助かります。
また、アプリ側からデータが見つからないときのエラーメッセージも早期発見に繋がります。

## エラーメッセージ
プロジェクトによっては~~全然~~あまり読んでないことがあります。
**内容を分かりやすく**、**問題を気づきやすくする**と効果が高かったです。
また、プログラマーは**何を対処すれば直るか**を意識して書いておくと、
そのエラーに対する質問が減って助かります。
（IDに誤りがあるので、◯◯というデータを修正してください　など）
- クリティカルなものは画面に表示する
- ログを色で識別する
- 見る人が使う言語（日本語）で書く
- 問題となってるリソースを書く
など試してみてはどうでしょうか。

## チュートリアル
最近のゲームは最初にゲームのチュートリアルが表示されたり、
進行中に機能を説明してくれたりします。
この機能は後から作られることが多く、
**不親切な実装をされているとチュートリアル実装の担当者が泣く**ことになります…。
- 割り込み処理ができない
- チュートリアル用操作ができない
- 最初の無料ガチャが引けない
など。
どうしても難しいところではありますが、
チュートリアルを出す場所は早めに設計できるとベストです。

## キーアサイン
コントローラーでの操作の割当です。
開発中にコロコロ変わりますので、
担当者が調整しやすいように設計してあるとベストです。
また、担当者はキーアサインが変わったときは**全体告知しないと開発の進行に影響します。**
- 移動の仕方がわからない
- チェックしたい技が出ない
- デバッグメニューの出し方が分からない
などの報告が多発します。

## テスト・デバッグ
なにか問題があったときに、
プログラマー以外の人はブレークポイントを置いて数値を見る…といったことはできません。
チームの人がデバッグしやすい環境を整えてあげれるとGoodです。
- パラメーターの表示
- 処理負荷や使用メモリの表示
- 操作の自動化
- バグ報告のフロー整備
など。
デバッガーの方に必要なものをヒアリングするのもいいと思います。

## バージョン管理
ある意味一番大事なことです。
チーム全体で**しっかり習熟しておかないと開発に大きく影響します。**
- 競合のマージ
- アップしたデータの取り消し
- データのロック
などがつまづきやすいポイントだと思います。
また、マニュアルの作成・更新は定期的に行ったほうがいいと思います。

## まとめ
ここで紹介させていただいた例は一部でしたが、
ゲーム開発以外の開発者にとってもあるある話だったのではないでしょうか。
開発では意識して気をつけないと後で大きな問題に繋がることもあります。
この記事が1ミリでも誰かのためになれたら幸いです。

こうしたら効率よく開発できたなどのご意見ありましたら、
ご共有いただけますと嬉しいです:raised_hands:
[Cinema 4D] マテリアルアサインリスト

今回は各マテリアル側から，アサインしているオブジェクトにアクセスする方法を試してみます．

マテリアルがシーン内のオブジェクトに適用されている場合は，マテリアルのAssignmentを見ればわかります．ここにアクセスするには[c4d.ID_MATERIALASSIGNMENTS]を使います．

MatAssignDataのドキュメントはこちら
[c4d.MatAssignDataクラス](https://.evelopers.maxon.net/docs/Cinema4DPythonSDK/html/modules/c4d/CustomDataType/MatAssignData/index.html?highlight=matassigndata)

ObjectFromIndex(doc, lIndex)
この戻り値はそのマテリアルが適用されているオブジェクトのテクスチャタグとなります．

tag.GetObject()を使うことでオブジェクトにアクセスできます．

```
doc = c4d.documents.GetActiveDocument()
mat = doc.GetFirstMaterial()
    
while mat:
    objLink = mat[c4d.ID_MATERIALASSIGNMENTS]
    objCnt  = objLink.GetObjectCount()
    
    if objCnt > 0:
        for i in xrange(objCnt):
            print "Material Name :", mat.GetName()
                
            tag = objLink.ObjectFromIndex(doc, i)
            print "Link index[", i, "] :", tag
                
            obj = tag.GetObject()
            print "Object name :", obj.GetName()
                
    mat = mat.GetNext()
```

そのマテリアルがシーン内で使われているかの確認や，マテリアルが適用されているオブジェクトにアクセスすることができ，こちらのほうが都合がよいこともありそうです．
はじめに

# モチベーション
社会人10年目となり、自分の知識を棚卸ししたくなりました。
また、Qiitaには個人的にお世話になっているので。。。

個人的には、元々プログラマー/エンジニアではない自分が、どのように知識を身につけ、
そして仕事に生かしてきたかを、共有したいとう気持ちもあります。

※ちなみに現在もエンジニアという立場ではなく、主にPM/PMOという立場で、
プロジェクト管理/要件定義してシステムデリバリー責任者のようなことをやっています。

そのため、習得した言語は純粋なプロダクト開発というよりは、
便利ツールの開発などに使用されていることが多いです。

# 経歴
- 2008.4 某大手ITコンサル企業に新卒として入社
- 2008.7 新人研修も終わり、某大手企業プロジェクトにSAPコンサルとしてアサインされる
- 2008.2 初めての海外出張。。外国人エンジニアとのコミュニケーションに苦労することになる
- 2008.4,5 ゴールデンウィーク直前に帰国し、終わったらまた出張。日本オフィスにはまったく出社せず。まだ二年目なのに。。。
- 2012.9  某大手ITコンサル企業を退社
- 2012.10 中小コンサル企業に転職(社員数20名以下)
- 2012.10 某大手企業プロジェクトにSAPコンサルとしてアサインされる。海外展開プロジェクト（業界ではRoll outと表現される）のため、色々な国に行って現地の人にトレーニングしたり
- 2013.5 　SAPコンサルとして、某大手企業プロジェクトにAPコンサルとしてアサインされる。こちらは、海外SAPの日本導入プロジェクト（業界ではRoll inと表現される）、ヨーロッパ人の癖に苦しめられる
- 2014.4 初めてSAP導入以外のプロジェクト、新規プロダクトの導入販売推進を実施。ここではITではなく、純粋にビジネス側の立場で管理顧客折衝を実施
- 2016.8 IT部門のBusiness Analyst/PMとして数々のプロダクト開発をリード

# IT Skill (プログラミング関連で経験したもの)
- Excel VBA
- SAP ABAP
- Google Apps Script
- Git
- Python
- Jenkins
- Node.js
- Web関連(HTML/css/javascript)
- Test automation (selenium/appium/spectron)
- bat
- bash
- AWS
勉強中に「ちょっと使い捨てのMySQLのデータベース欲しいな..」となったときのdocker-composeファイル

ドキュメント読んでる時とか、 ネットの記事を読んでいるとき、 「ちょっとこのコード試してみたいから使い捨てのデータベースサーバたてたいな..」となる時があると思います。
もちろんローカルでmysqldとか動かしていても良いと思いますが、ローカルのPCで要らないデーモンが動いているの嫌じゃないですか..？私は嫌です..。

そんな時にDockerで、`docker-compose` です。 Docker/`docker-compose` はインストール済とします。
私はWindowsで実施していますが、 wslでもネイティブなWindowsでも動くので、どこでも動くと思います。

```yaml:docker-compose.yml
version: "3"

services:
  db:
    image: mysql:5.7
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: playground
      MYSQL_ROOT_PASSWORD: password
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
```

これ↑をちらっと書いてカレントディレクトリに置き、 `docker-compose up -d` でMySQLサーバが立ち上がります。

設定は見ての通りですが

* (ローカルから見える)ポートは `3306`
* rootのパスワードは `password`
* デフォルトで作られるDB名は `playground`
* デフォルトで作られたDBのcharsetは `utf8mb4` <= **ここが書きたくてこの記事を書いた**

で動いています。

勉強が済んで要らなくなったら `docker-compose down` で廃棄です。
ubuntu18.04LTSをマウントした仮想サーバーにpyenvとpyenv-virtualenvをインストールしたのでメモ

メモ程度なので、あしからず

【環境】
macOS Mojave v10.14.2

【参考にしたサイト】
https://www.komee.org/entry/2018/10/25/120000
https://qiita.com/fotome-developer/items/4a0e2d738b33650fa819

■ubuntu18.04LTSをマウントした仮想サーバーを起動
※VirtualBox VMでサーバーを作成しました。

■「端末」を起動（コマンドプロンプトやターミナルみたいなもの）

■コンパイルに必要なライブラリとパッケージをインストール
`sudo apt -y install make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline6-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev`

■gitからpyenvのスクリプトをインストールするので、gitをインストール
`sudo apt -y install git`

■gitからpyenvをインストール
`sudo curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash`

■vim(またはvi?)コマンドで環境設定ファイルを開く（今回は.profile、人によっては.bash_profile、その他だったり？）
`sudo vim ~/.profile`
※vimが見つからない人は「`sudo apt -y install vim`」などでvimを使えるようにしてください

■開いた環境設定ファイルの末尾に以下を追記する
※vimで開かなくてもechoコマンドで同様のことができるっぽい
`export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
    export PATH=${PYENV_ROOT}/bin:$PATH
    eval "$(pyenv init -)"
    eval "$(pyenv virtualenv-init -)"
fi`

■環境設定を反映させる
`source ~/.profile`

■インストールできるpythonのバージョンを確認する
`pyenv install --list`
<img width="572" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/357470/0a8ebb85-5441-044e-06ea-a542b4c753eb.png">

■とりあえず最新のpythonをインストール（3.7.2）
'pyenv install 3.7.2'
※結構時間が掛かりました

■pythonのバージョンを3.7.2に変更する
`pyenv global 3.7.2`

■pythonのバージョンが切り替わっていること確認する
python --version
※3.7.2になっていればOK。他のバージョンをインストールしてそのバージョンに切り替えて確認し直してみてもいいかもしれません。

■pyenv-virtualenvを使用して仮想環境を作成してみる
'pyenv virtualenv 3.7.2 sampleEnvironment'

■仮想環境が作成されたか確認する
`pyenv versions`
※「3.7.2 /envs/sampleEnvironment」みたいのが表示されていれば成功

■作成した仮想環境を適用する
・適当にフォルダを作成
`mkdir /home/[ホスト名]/デスクトップ/test`

・作成したフォルダに移動
`cd /home/[ホスト名]/デスクトップ/test`

・testに作成した仮想環境を反映させる（ディレクトリ移動したまま）
`pyenv local sampleEnvironment`

・バージョンを確認してみる（ディレクトリ移動したまま）
`python --version`
※一旦testのpythonを他のバージョンにしてから試してみるといいですね。

pyenvはなんぞや、pyenv-virtualenvがなんぞやといった方は各自検索してみてください。
以上。
GitHubで別アカウントを使う時にハマった

見出しの通りにWindows環境でのGitHubの複数アカウント認証でハマった。仕事用のアカウントに上げてたリポジトリで汎用的に使えそうなやつを個人用に移そうとして、しばらく手間取ったのと、それを調べても一つの情報源で解決しなかったのでここにまとめておく次第。

## エラー内容

```
$ git push -u origin master
remote: Permission to <移行先アカウント>/<リポジトリ名>.git denied to <移行元アカウント>.
fatal: unable to access 'https://github.com/<移行先アカウント>/<リポジトリ名>.git/': The requested URL returned error: 403
```

`git config`もしたし、一通り怪しそうなファイルも見たけどどこにも元のアカウント情報は残ってない。似たような事象で検索した結果が以下。

- [GitHub \- GitHubでpushをするとPermission deniedされるエラーに関して｜teratail](https://teratail.com/questions/66582)
- [git - githubへgit pushしようとすると403エラーとなる - スタック・オーバーフロー](https://ja.stackoverflow.com/questions/23475/github%E3%81%B8git-push%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%99%E3%82%8B%E3%81%A8403%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%A8%E3%81%AA%E3%82%8B)
- [Git \- 認証情報の保存](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E3%81%AE%E4%BF%9D%E5%AD%98)
- [Git Credential Managerを無理やりMSYSでも使う \- Qiita](https://qiita.com/skkzsh/items/b9cf40b45877b72c5301)
- [Git Credential Manager for Windows \(GCM\) のアップデート\(v0\.9 Beta\) \| OPCDiary](https://opcdiary.net/?p=30485)

## 資格情報マネージャー

これまで一度も存在を意識したことがなかった、こいつが認証情報を持っていた。macOSだとキーチェーンみたいなものだろう。

- [資格情報マネージャーにアクセスする](https://support.microsoft.com/ja-jp/help/4026814/windows-accessing-credential-manager)

資格情報マネージャーを開いて、_汎用資格情報_に_git:https://github.com_の項目があり、これを削除して`git push`したら、エラーなく行けた。良かった良かった。
ipadでcapturePhoto時にcrashする問題の解決

#背景
今回初めてアプリ申請した際にrejectの洗礼を受けてしまったので記事にしてみたいと思います。
#reject内容
Your app crashed on iPad running iOS 12.1.3 on WiFi when we tapped to take a photo.
自分はipadPro(10.5inch)とiphoneXS Maxとiphone6sを所持していてそれらで実機テストしているのですがipadないので早速困りました笑
幸いcrashlogの方が送られてきていたので以下の記事を参考させてもらいに解析しました
https://qiita.com/ruwatana/items/cc470eb229d267d693b0

```swift:crashlog
Last Exception Backtrace:
0   CoreFoundation                	0x1a2ae9ea4 __exceptionPreprocess + 228
1   libobjc.A.dylib               	0x1a1cb9a50 objc_exception_throw + 55
2   AVFoundation                  	0x1a8c82b48 -[AVCapturePhotoOutput capturePhotoWithSettings:delegate:] + 751
3   camera                        	0x1041f4120 0x1041ec000 + 33056
```

やはりAVCaputurePhotoOutputが怪しい事が分かったので調べると以下の記事を発見https://qiita.com/jumperson/items/1f47e91f2fec80654b09
どうやらiPadではFlashが使えずAVCapturePhotoSettingsのflashModeをautoにしていたらcrashしてしまうとのこと。

#解決方法
カメラ起動時にFlashをサポートしていない端末の場合はFlashをoffにすることで解決

```swift:viewDidLoad()
//flashサポートしてるかの確認
        let device = AVCaptureDevice.default(
            AVCaptureDevice.DeviceType.builtInWideAngleCamera,
            for: AVMediaType.video, // ビデオ入力
            position: AVCaptureDevice.Position.back)
        if !device!.hasFlash{
            let captureSetting = AVCapturePhotoSettings()
            captureSetting.flashMode = .off
        }
```

審査通るといいですがまた別の問題でrejectくらいそうです笑
Phoenixを触ってみる その８

https://hexdocs.pm/phoenix/views.html#content

今回はViewの話です。

## Rendering Template

今までJavaをよく業務で使ってたが、まず大きく違うのがViewの存在。
Springなんかだと、Controller -> thymeleafなどのテンプレート の2つから成り立つ。
phoenixの場合、Controller -> View + template(.eex) の3要素になる。

templateはよくある、htmlなどを動的に生成する時に使うやつだ。eexという形式で書く。
よくあるように、変数や関数の実行結果を埋め込むことが出来る。

``` index.eex
<div class="jumbotron">
  <h2><%= gettext "Welcome to %{name}!", name: "Phoenix" %></h2>
  <p class="lead"><%=message()%></p>
  <p class="lead">A productive web framework that<br />does not compromise speed and maintainability.</p>
  <p><a href="<%= Routes.page_path(@conn, :index) %>">Link back to this page </a></p>
</div>
```

(eexはハイライト効かないのか・・・)

Viewはexコードだ。
ここで定義した関数は、そのままtemplate上で利用可能となる。

``` PageView.ex
defmodule HelloWeb.PageView do
  use HelloWeb, :view
  alias HelloWeb.Router.Helpers ,as: Routes

  def message do
    "Hello from the view"
  end
end

```

これが、良い。
Webの処理って、リクエストを受けて処理する部分 と 画面表示用の処理をする部分 があると思うのだが
この表示用の方の立ち位置が曖昧だったと思うのだ。
表示用の処理だから表示側に寄せたいが、テンプレートで複雑なロジックは可読性を下げるし、そもそもロジックを書くのに向いていない。
昨今のSPAのような形も一つの解だと思うが、
サーバ側の処理を明確に分けることが出来るのは、とても嬉しい。

あと以下の様な特徴がある。

- Controllerとの対応は、命名で決まってる
    - PageControllerならば、PageViewとtemplates/page/ ディレクトリ
- templateは、phoenixによってプリコンパイルされてViewの関数として組み込まれる
    - だからView上の関数はそのまま使えるし、aliasなんかもViewに追加すればtemplateで使える
    - render("index.html", _assign) のような形
        - 先にView上で定義しておけば、index.html.eexレンダリングの代わりに実行される
    - サーバ起動時点でメモリに乗ってる。リクエスト毎にファイルを読んでるわけではない
        - 代わりに、テンプレート変更時でも再コンパイルが必要

## More About Views

- .eexで変数の表示は "@"を使う
- htmlエスケープも勝手にされる
- layoutっていう外枠表示してるものも同じ仕組み(View + template)
    - templates/layout/app.html.eex見ると、中でrender/3を呼んでる
    - つまり、ふつーに.eex内でrenderすれば、画面パーツをView込で呼べる・・・！

この最後のやつ。画面をパーツ化する時に、template以外はなんのパーツを使うか知らなくて良くなるね。

結構phoenix自体の作りに踏み込んだ説明もしてくれているので、原文読んでください。

## The ErrorView

- エラーもErrorViewが使われて、templates/error/にeex置けば良い
- ステータスコード + .html.eex で呼ばれる
    - 404.html.eex みたいな
- とはいえ、ErrorViewでエラーになると良くないので、程々に
    - 手元でやった感じ、空っぽの500が返った

## Rendering JSON

json返すだけならViewやtemplate無しでもいける
けど、返却用にデータを加工するところはControllerとは分けたほうが良いよね、という内容。

Viewで複数render作れば、良い感じに階層構造が作れるので、うまく使ってね、ということらしい。

``` PageView.ex
  def render("index.json", %{pages: pages}) do
    %{data: render_many(pages, HelloWeb.PageView, "page.json")}
  end

  def render("show.json", %{page: page}) do
    %{data: render_one(page, HelloWeb.PageView, "page.json")}
  end

  def render("page.json", %{page: page}) do
    %{title: page.title}
  end
```

この例では、以下を返すことになる。

- index.jsonの中身は複数のpage情報
- show.jsonでは単一のpage情報

---

以上Viewでした。
今までのフレームワークで不満だった点が良い感じに解消されていそうで良い感じ。
かつ、一つ一つのパーツもシンプルにできているようで、とても勉強になります。
CloudFormation"Value of property SourceArn must be of type String"の解決方法

AWS LambdaFunctionPermissionの設定で、以下のようなエラーが発生した。

`Value of property SourceArn must be of type String`
このとき、原因となった部分は以下の通り。

```yaml:problem.yml
  LambdaPermission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName:
        !GetAtt MyLambda.Arn
      Action: lambda:InvokeFunction
      Principal: s3.amazonaws.com
      SourceArn:
        - !Join
          - ''
          - - 'arn:aws:s3:::'
            - !Sub ${BucketPrefix}
```
###原因と対策
`- !Join`は、`!Join`以下がリスト型であることを示している。つまり、このymlは以下のように認識されている。

```json:SourceArn.json
{
    ....,
    "Properties":{
        "SourceArn":['arn:aws:s3:::{BucketPrefix}']
    },
    ....
}

```

しかし、この項目に入力すべきはStringであり、Listではない。これがエラーの原因だったようだ。

したがって、以下のように直した。

```yml:fixed.yml
  DataDeliverAndConvertPermission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName:
        !GetAtt MyLambda.Arn
      Action: lambda:InvokeFunction
      Principal: s3.amazonaws.com
      SourceArn:
        !Join
          - ''
          - - 'arn:aws:s3:::'
            - !Sub ${BucketPrefix}
```
これで通った。

###参考
[YAML 基本記法まとめ](https://qiita.com/tfrcm/items/5f8e4c5795ce41b214d1)
Essential Phone(PH-1)にMagiskを導入した話。TWRP/ROM...etc

#はじめに
初心者向けの記事。というか毎回調べるのが面倒なので自分向けにメモ。色々調べまわると、色々書いてあるもんだから困るので丁寧に書いていく。なんだけど、間違ってたり、よりよい方法があればアドバイス求む。色々調べただけで本質理解していないです。
Markdownの使い方よくわからんから読みにくかったらごめん。

**注意事項**

 - 端末が文鎮化しても各自自己責任で。
 -  ADB、FASTBOOTは導入済み前提。
 -  事前に大事なデータはバックアップしておこう。

#必要なもの

 * Essential Phone(PH-1)
 * パソコン（僕の環境はWindows）
 * ROMの入った.zipファイル。OTAとFastbootどちらも。（ https://essential-live.herokuapp.com/developer/current-builds ）
 * TWRP（ https://twrp.me/Devices/Essential/ ）
 * Magisk（ https://forum.xda-developers.com/apps/magisk/official-magisk-v7-universal-systemless-t3473445 ）のページのDownloads>Latest StableでOK。
 * Magisk Manager（上のMagiskと同じ場所）のページのDownloads>Latest Magisk ManagerでOK。


#**1) bootloaderのアンロック**

 1. https://storage.googleapis.com/essential-static/Essential-PH1-WindowsDrivers.exe から端末用のドライバーをPCに入れる。
 - 端末の「開発オプション」を有効化。
 - 端末の「開発者オプション」内のOEMロック解除を有効化、ADBが使えるようにしておく。
 - `adb reboot bootloader`または`電源を落としたあと、電源ボタン+音量-ボタンを同時押し`でbootloaderを起動。
 - `fastboot flashing unlock`でbootloaderのアンロック完了。このときに端末のユーザーデータは初期化される。


これ以降、手こずった場合はfactory reset（脳死的判断）。

**factory reset**

1. （標準リカバリ）`adb reboot recovery`のあと、「電源ボタンを押しながら、音量+ボタンを押す」でリカバリを起動。"Apply update from ADB"を選択。
* （TWRP）TWRPのときは上記の方法はできないので、TWRP起動時に`adb shell twrp sideload`としとく。
* `adb sideload [ROM(OTA)].zip`。その後再起動で初期化できる。その場合はADBつかえなくなったはずだから再度「開発者オプション」から有効化しておこう。

#**2）TWRPの起動**

1. bootloaderを起動し`fastboot getvar current-slot`で現在aとbのスロットか確認する。
- `fastboot --set-active=a`というようにスロットを変更できる。bにしたいなら`fastboot --set-active=b`にする。
- `fastboot flash boot_a [twrp].img`でOK。スロット云々言ったけど正直良くわからんからbにも焼こうということで、`fastboot flash boot_b [twrp].img`。
- `fastboot reboot`でTWRPが起動すると思う。なんか知らんけど、TWRP（twrp-3.2.3-0-mata.img）のタッチが効かない。そのままでやった。

#3）Magisk.zip

1. TWRP起動時に`adb shell twrp sideload`。
- `adb sideload [Magisk].zip`のあと`adb reboot`で再起動。
- Androidが起動するので初期設定を済ませる。あとからでも出来るので全部スキップした。Magisk Manegerはインストールできてたけど、Root化されてない？:thinking:

#4）patched_boot.img

1. ROM（FASTBOOT）.zipを解凍してboot.imgを端末に置いとく。Magisk Managerで「インストール→Patch Boot Image File」でboot.imgを指定して、できたpatched_boot.imgをPCの方に戻す。
2. bootloaderを起動し。`fastboot flash boot_a patched_boot/img`で書き込む。

#5）終わり
おそらくこれより簡単な方法あるだろうけど、とりあえずこれで出来た。

Magiskを入れた理由はこれ。
・[QuickSwitch is a Magisk Module that enables Android Pie recent apps on supported third-party launchers](https://www.xda-developers.com/quickswitch-magisk-module-android-pie-recents-launchers/)

・[Get the OnePlus Launcher with its recent apps interface on any Android Pie device [Root]](https://www.xda-developers.com/oneplus-launcher-recent-apps-interface-android-pie/)

そこまで思ったより満足度が低かったし、勿論Root取ってるからKyashなどの金融系が使えないから戻した。遊び用の端末が欲しい。

Recents Appsのときに下にアプリを並べられるようにできるのは、デフォルトランチャーのみって問題じゃないですかね。Qでココらへんが改善されてくれればとても助かるんだけどなぁ。
JenkinsPipelineのパラメータ付きビルドで前回実行時の値を引き継ぐ

通常のパラメータ付きビルドだと前回実行時の値が初期値として入っていますが、
Pipelineジョブだと、毎回 defaultValue の値が初期値になります。

前回の値を引き継ぎたい場合は defaultValue に env.<パラメータ名>を入れます。

```groovy:Jenkinsfile
pipeline {
    agent any

    parameters {
        string(
            name: 'PARAM1',
            defaultValue: env.PARAM1,
            description: '',
        )
    }

    stages {
        stage('Build') {
            steps {
                sh "echo '${params.PARAM1}'"
            }
        }
    }
}
```

groovyのエルビス演算子を使うことにより、前回の値を引き継いだ上に初期値まで設定することもできます。

```groovy:Jenkinsfile
pipeline {
    agent any

    parameters {
        string(
            name: 'PARAM1',
            defaultValue: (env.PARAM1 ?: 'param1'),
            description: '',
        )
    }

    stages {
        stage('Build') {
            steps {
                sh "echo '${params.PARAM1}'"
            }
        }
    }
}
```

まとめると

```groovy:Jenkinsfile
pipeline {
    agent any

    parameters {
        string(
            name: 'PARAM1',
            defaultValue: env.PARAM1,
            description: '前回の値を引き継ぐ。初期値はなし。',
        )
        string(
            name: 'PARAM2',
            defaultValue: (env.PARAM2 ?: 'param2'),
            description: '前回の値を引き継ぐ。初期値もある。',
        )
    }

    stages {
        stage('Build') {
            steps {
                sh "echo '${params.PARAM1}'"
                sh "echo '${params.PARAM2}'"
            }
        }
    }
}
```
Alexa Skill一式をask-cliでローカルにバックアップする


時々忘れるのでメモ


## 環境と準備
Macを使用。ask-cliをインストールしておく。

## バックアップ
任意のディレクトリを作って、ask cloneを実行する。

```
cd workspace
mkdir alexa-skill-bkup
cd alexa-skill-bkup
ask clone 
（スキルの一覧がどっと表示されるので、コピー元のファイルを選んでエンター）
（ローカルにプロジェクトファイル一式がダウンロードされる）
```


## こういう時に使う

- skill.jsonの書き方がわからない時
 - Alexa Developer Consoleの画面で設定してCloneし、書き方のサンプル入手。
- バージョンアップ前に、すでにあるスキルをコピーして作る時。
 - alexa developer console上の設定とlambda functionの両方がコピーできるので便利。
 - なお新しいスキルを作る際、既存のスキルを上書きしてしまわないよう、skill.jsonの「name」と「uri」は書き換えること。




## 参考
いつもお世話になっております(^o^)
https://dev.classmethod.jp/cloud/ask-cli/
https://qiita.com/zono_0/items/403111918e9bc8215e82
あと、自分が以前ハマった時のページ
https://qiita.com/sitopp/items/a779da7f7c4e8c25a21b

以上です！
アプリにチャレンジ２日目

今日はHerokuでアプリ、２日目です。

前回は こちらの Web を参考に作ってみたのですが、何をやっているかさっぱりわかりませんでしたので、今日はコマンド不要で超簡単バージョンにチャレンジしてみました。

>2018-05-09
コマンド不要で超簡単！HerokuでWebアプリ開発を30分で始める【php+postgres】
http://tech-blog.rakus.co.jp/entry/2018/05/09/100346

こちら、大変分かりやすいガイドでした！
Heroku、PHP、Postgresと、Webアプリは最初の準備がめちゃくちゃハードルが高くて、あきらめる人も多いのですが、これなら始めやすくていいなーと思いました。

1.ヘロクにログインします。これは昨日作ったアカウントでOK.

2.ギットハブにログインします。
これは新たにアカウントを作りました。

3.ヘロクに PHP と Postgres のアプリを追加。
昨日あーだこーだやったので既に5個のアプリができていて、これ以上は有料というので消しました。ちなみにこの辺の解説、全部英語で出てくるのでGoogle 翻訳でコピペしながら進めました。マジで英語やんなきゃやべえなおいって感じです。

4.セッティングからアッドビルドパックを選んで「PHP」を追加。無料プランでやりますと宣言、二日目のアプリなので「Day2」という名前をつけて登録しました。

5.パソコンのデスクトップに「Day2」というフォルダを作って、その中に「index.php」というファイルを作って、簡単な文字とPHPの動作確認画面を表示するように書いておきます。

6.ギットハブデスクトップをダウンロードしてインストール。ギットハブのアカウントとつなげて、デスクトップの「Day2」フォルダを作って、アップロードします。

7.もう1回ヘロクに戻って、ギットハブを選んで「 connect to github 」を選んで、「day2」と入力してポチッとな。 ギットハブとヘロクを連携するか聞かれるのでもちろんYES。これで繋がりましたと。

8.オートマティックデプロイズにあるイネーブルオートマティックデプロイズを選んでポチッとな。

9.デプロイ1回目はマニュアルでデプロイしなきゃなので、マニュアルデプロイを選んで デプロイブランチをポチッと。そうするとギットハブにアップしたファイルを読み込んで、PHPを動かしますよーというメッセージがざざざーっとながれてきて、、、あら失敗。

```
 !     ERROR: Application not supported by this buildpack!
＜中略＞
 !     Push failed
```


ギットハブに戻って確認すると、index.phpがアップロードされてなかったので、もう1回 アップロードを選んで、念のため ギットハブのブラウザ版にアクセスしてindex.phpがあるって事を確認して、もっかいヘロクからマニュアルデプロイ、ポチッとな。 今度はできましたできましたーとメッセージがととととって出てきました。

10.下の方にビューというボタンが出てきました。こいつをポチり。そうするとindex.phpに書いておいたテスト用の文字と、動作確認画面が表示されました！バンザイ。 

https://appday2.herokuapp.com/

(所要時間60分)

今日も、なんだかよく分かりませんでしたが、まあやってるうちに分かるでしょう。 ではまた明日ーバイバーイ！

###追記
Progateでがんばったのがこちらです。
CSSがわけわかりません！
http://appdays.herokuapp.com/Day2/
MacBookPro バッテリー爆発！

仕事でSQLに没頭して頭クラクラして自宅に帰ってきて、
風呂はいって、お茶漬けを食べて、やっとゆっくり眠りについたころ、

突然「パーン！」

隣の部屋に寝ていた娘も驚いて、「え？なに？なにがおきたん？」

娘が調べていたところ、「パパ、なんかマックの裏が膨らんでる！」

バッテリーが爆発していました。

異臭がしたため、慌ててバッテリーを外したが、「シュー・・・」と音が・・・

外したバッテリーのカバーは割れていたので、そのまま強引に外して、充電回路とバッテリーのケーブルを強制切断。

家族で大騒動。

とりあえず、寝ました。

機種：MacBook Pro 15" Core 2 Duo Model A1211

![P_20190208_225304_vHDR_On.jpg](https://qiita-image-store.s3.amazonaws.com/0/355500/c3118963-9273-44f3-f08d-d227dc049870.jpeg)

![P_20190208_225309_vHDR_On.jpg](https://qiita-image-store.s3.amazonaws.com/0/355500/3b0d3456-e4e2-2a41-bc2b-c36455ddc648.jpeg)
ZYBOを使ったモータ制御 (2)


前記事「ZYBOを使ったモータ制御 (1)」の続き?
https://qiita.com/tvrcw/items/80fcada57c8ccb615166

前記事を書いて3日後にはFPGA側の結線論理の設計などが終わっていたのですが，内容を諸事情で公開することができなそうなので書くのを止めていました。ただ，今年の秋に展示する可能性があるのでデモ動画を公開しようと思います。

何をしたかというと，FPGA部分の設計を頑張って高性能で汎用的かつ拡張性のあるモーションコントローラを設計しました。結線論理なのに？という感じなのですが，工夫があって位置決め，押し込み，振動抑制，協調といろいろなことができます。全部の結線論理を用意しているわけではなく，他のことも色々できます。下の動画では振動制御と協調制御による物体把持，機械にコンプライアンスを付加して人間と安全に接触できるようにする制御を紹介しています。

https://youtu.be/qCK2zvVaI-8

ご興味を持っていただけると幸いです。

また，この開発に際して@ikwzm様より提供いただいている環境を使用させて頂きました。
開発速度が一気に上がります。
https://qiita.com/ikwzm/items/7e90f0ca2165dbb9a577
この場を借りて御礼を申し上げます。
非常に使いやすいので，これからの人も是非使ってみてください。
RDS for OracleでNLSカレンダのカスタマイズ（2019年2月）


5月から施行される新元号の和暦表示の適用に際して、
RDS for Oracleにlxegen（NLS カレンダ・ユーティリティ）を用いたカスタマイズをやりたかったのですが、やり方が分からず。

##RDSでなく、普通にOracle DataBaseに適用する場合
以下が参考になりました。
・Oracle公式
https://docs.oracle.com/cd/E57425_01/121/NLSPG/ch12custlocale.htm#GUID-8F9C2D9F-C6D0-447D-8780-33D6982D5B2C
・Qiita記事
[Oracle Database に 新しい元号(年号)「野球」を追加してみる。(NLSカレンダ・ユーティリティlxegen)](https://qiita.com/ora_gonsuke777/items/dc21ee3f2abf718098b9)
（↑と同じことをRDSでやりたかった）


##AWSのスタンス

> ・RDSでlxegenユーティリティを使用して新元号の定義追加はできない
> ・RDSに新元号対応のパッチは今後当てるかも


##現状できること
↑のようなので、
2019年2月現在、いまできることは以下と思っています。
・RDSへのパッチを待つ
・lxegenユーティリティを使用して新元号の定義追加は諦めて、別の方法で対応する

になるかと思いました。

私はパッチを待ってられないので、別方法で新元号の和暦表示対応を考えようと思います。
macOS MojaveにVirtualBoxをインストールさせたい

#VirtualBoxを導入したい
けれども、できませんでした。
どうやら、→システム環境設定→セキュリティとプライバシー→一般に行って、「ダウンロードしたアプリの実行許可」の下に表示されているところから、承認するとできるっぽいです。
Windowsを指定時間にシャットダウンさせる

意外と知られていませんが、Windowsはコマンドで簡単にシャットダウンできます！

#shutdownコマンド
Windowsにはshutdownというコマンドがあります。

| オプション     | 説明 |
|:--------------|:------------------|
| /s            |コンピューターをシャットダウンします。|
| /t xxx        |シャットダウンまでのタイムアウト期間を xxx 秒に設定します。|
| /a            |システムのシャットダウンを中止します。|

もっと詳しく知りたい方は、コマンドプロンプトから「shutdown /?」で確認してください。
時間を指定するときは秒単位であることに注意しましょう。

#実行例

```bat:1時間後にシャットダウンする（1時間=3600秒）
shutdown /s /t 3600
```

shutdownを取り消したいときは、以下のコマンドを実行します。

```bat:スケジューリングしたシャットダウンを取り消す
shutdown /a
```
Jupyter Notebookのテーマカラーをかんたんに変更できる！


Jupyter Notebookのテーマカラーが変えられることに気づき（遅い…）、
さっそく、目にやさしくダークカラーに変えましたので、やり方をご共有まで。


[こちらのページ](https://futurismo.biz/archives/6306/)をママ参考にしています、ありがとうございます！




### STEP1
コマンドプロンプトで、以下を入力し。これでインストール完了。

```
pip install jupyterthemes
```




### STEP2
どんなテーマが選べるのかなー？テーマカラー一覧が以下で出せます。

```
$ jt -l
```



### STEP3
テーマカラーを以下で変更！（評判がよい「monokai」を今回はチョイス）

```
jt -t monokai
```


### STEP4
テーマカラー以外にも、フォントやツールバー表示なども設定できます。
「-f ●●（フォント名）」：フォント名を変更
「-T」：ツールバー表示
「-N」：ノート名表示

たとえば、こんな感じで

```
jt -t monokai -f inconsolata -N -T 
```



### STEP5
さいごに、ダークカラーにすると、グラフの縦軸横軸の表示が見えなくなってしまうので、
これは都度でめんどうですが、Jupyter Notebook上で、
以下をpandasとかのimportと同じタイミングで実行させておくと解消されます。

```python
custom_style = {'axes.labelcolor': 'black',
                'xtick.color': 'black',
                'ytick.color': 'black'}
sns.set_style("darkgrid", rc=custom_style)
```


どんどんJupyter Notebookの環境を使いやすくしていきたいなー
VRoidモデルの髪をLeapMotionでさわる

##できたもの

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Leapmotionで髪をさらさらした<a href="https://twitter.com/hashtag/vroid?src=hash&amp;ref_src=twsrc%5Etfw">#vroid</a><a href="https://twitter.com/hashtag/lookingglass?src=hash&amp;ref_src=twsrc%5Etfw">#lookingglass</a> <a href="https://t.co/PIMS5fkHhn">pic.twitter.com/PIMS5fkHhn</a></p>&mdash; neku (@neku18) <a href="https://twitter.com/neku18/status/1088804762194190337?ref_src=twsrc%5Etfw">2019年1月25日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Looking Glassを使っていますが，その他の環境でも同じ設定になると思います。
VRoidのモデルの読み込みやLeapMotionのセットアップについては割愛。
VRoidの段階で髪にボーンはついていることとします。

##ボーン設定の場所

VRoidのモデルを読み込むと以下の画像のようにsecondaryという場所がある。
そこを開くとVRM Spring Boneというスクリプトがひっついている。
これがおそらくボーンの動きを制御するスクリプト。
この中のCollider Groupに髪と衝突させたいものを追加することで，好きなものを髪に衝突させ物理演算ができる。
![スクリーンショット 2019-02-09 16.57.44.png](https://qiita-image-store.s3.amazonaws.com/0/111912/6924e201-1738-e67e-882a-7719fbc642c9.png)

##衝突範囲の設定
衝突させるものには，VRM Spring Bone Collider Groupというスクリプトを引っ付けて，衝突範囲を設定。
リープモーションの場合は，動かす手のモデルのどこかにこれを設定する。
よりリアルにしたい場合は，指一つ一つに設定する。
![スクリーンショット 2019-02-09 16.57.31.png](https://qiita-image-store.s3.amazonaws.com/0/111912/338aadc0-9fc0-5640-2a9b-63284005291c.png)

設定したものを先程のVRM Spring Boneの中のCollier Groupsに追加すれば完了。
React NativeとAWSを利用した画像投稿アプリ開発記録

#アプリの概要
*カメラで撮影した写真に一言コメントをつけてAWSにアップロードする。
*アップロードした写真とコメントを一覧で表示出来、それぞれにイイネが出来るようにする。
#キャプチャ
![Screenshot_20190209-170520.png](https://qiita-image-store.s3.amazonaws.com/0/66198/8fe2c641-a036-48f6-68a2-58dcc0d034dd.png)
![Screenshot_20190208-231501.png](https://qiita-image-store.s3.amazonaws.com/0/66198/00090650-9480-29c6-f8f7-4c1a19ff2855.png)
![Screenshot_20190209-170542.png](https://qiita-image-store.s3.amazonaws.com/0/66198/697b1d24-550e-0312-dd9e-3ea30d31f0a6.png)
![Screenshot_20190209-170607.png](https://qiita-image-store.s3.amazonaws.com/0/66198/9608e906-7383-5a67-5045-29e3dba743de.png)
---------------------------------------

まだ記憶が新しいうちにこれまでの道のりと、過程で得たものを記録として残しておきたいと思い書きます。また、僕が探すのに苦労したものも記事として書いておくと誰かしらのお役に立てるかもしれないという願いも込めて。

[初めてのReact Native(開発環境篇)](https://qiita.com/hazigin/items/1edb430c97ff897a2ac8)

[React Navigationでのナビゲージョンの実現について](https://qiita.com/hazigin/items/cec1781f86b2856f1d17)

[React Nativeでのカメラ機能と画像のアップロードについて](https://qiita.com/hazigin/items/900d196fef0d85570ca8)

[React Nativeでのリスト機能とイイネ機能について](https://qiita.com/hazigin/items/237173704e09ee510f3a)

[AWSのS3をファイル置き場として利用する](https://qiita.com/hazigin/items/c191c836ac0f216802a4)

[AWS Lambda関数(画像アップロード、S3へのファイル配置、DynamoDB更新など)](https://qiita.com/hazigin/items/cd8e5a589b026ec771bf)

[あっさり味なAPI Gatewayの設定について](https://qiita.com/hazigin/items/4e802fac476efae77efc)

[DynamoDBのテーブル作成について](https://qiita.com/hazigin/items/1c1dd119a2be2df86d90)

[デバッグについて](https://qiita.com/hazigin/items/31bd7e96106ebdccab06)


##今回の開発を通じての今後の課題となる事項
__ローカル開発環境の構築__
[Amw-sam-cli](https://github.com/awslabs/aws-sam-cli) や [LocalStack](https://github.com/localstack/localstack)も試してみましたが、そもそも本物のAWSをまともに触っていない状態では扱えませんでした。ですので今回の経験をベースに再度チャレンジしたいです。

__ライフサイクル、イベントハンドラ、state/propsのキチンとした理解__
この辺はReactを使う上では上級者と言われるぐらいまでにならないとずっと付いて回るものかと思います。精進しかないですね。

__コンポーネントの作成__
こういうものがあったらな、と思うこと少々ありましたが、そういう時に自作できるようになれたらなと。

__レイアウト__
Web開発の経験がそもそも乏しいのでもう数をこなすしかないですが。見栄えのいいものをやはり作りたいので。センスは…残念な感じですけれどもw

__セキュリティの確保__
今回は試作ということに甘えてAPI-KEYすらも付けていません。ゆくゆくは外に出せるものをと思うのでセキュアなものという観点でも勉強していきたいです。



去年の12月ぐらいからReact Nativeについて調べ出して、昨日(2019/2/9時点)やっとこさ一旦完成というところになったばかりです。
本当にReact Native についてはHello Worldレベルから初めて。AWSなんて登録したの今年に入ってからで。今時の開発に必要な情報量の多さに半分絶望しつつ、なんとか形になりました。最近の新人プログラマーはどういう形から開発の現場に入っているのかなぁと想像してみるのですがイマイチ絵が描けないぐらいの敷居の高さですね。それほど凝ったことをしているわけではないアプリの開発の素描です。