OmniAICreator/Qiita-1.07M huggingface dataset:
ActiveXObjectを利用してJavaScriptでのファイル出力

このご時世にまだそんなことしているんだと突っ込まれそうですが、
IE8(互換モード)でJavaScriptからファイル出力をする必要がありそこでめちゃくちゃ嵌ってしまったので備忘録を兼ねて記事書きます。

ActiveXObjectを利用してファイル出力できますというのは色々な方が記載されていますが、いちお記載すると以下の感じ。

```JavaScript:sample1.js
var fso = new ActiveXObject('Scripting.FileSystemObject');
// fileName,addTextは適宜設定
var output = fso.createTextFile(fileName, true, false);
output.Write(addText);
output.close();
```

またActiveXを利用するために、
IEの設定でインターネットオプション→セキュリティタグ→レベルのカスタマイズから
「スクリプトを実行しても安全だとマークされていないActiveXコントロールの初期化とスクリプトの実行」のラジオボタンを有効に設定。
ここが有効になっていないと「オートメ―ションサーバはオブジェクトを作成できません」のエラーがでます。
![6616fad8-fd7c-4391-985f-8f1f5941ad22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369864/a3e7d285-4054-6676-4720-54c9c2a3c1a5.jpeg)

ここまでは良かったのですが、上記の通り記載してもファイル作成ができず、
「ファイルが見つかりません。」のエラーメッセージがでました。
エラーメッセージで検索かけても全くヒットせず、解決策が全く見つからなかったのですが、
同じことをやってファイル出力が上手くいっている人がいたので環境の差分チェックしたら、
保護モードがオンになっていることが不具合の原因でした。

保護モードのチェックを外して同じことを実行したら無事にファイル出力できました。
![保護モード.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369864/6b1a9b94-dae1-d947-19cb-f435f1bbd0d8.png)
iPhoneショートカットで荷物の追跡を行う

## 配送状況をもっと簡単に確認したい。

ネットショッピングは今や日常生活には欠かせないものとなっています。
みなさんも月に1回は何かネットで購入しているのではないでしょうか？

さて、ネットでショッピングを行った数日後、販売店さんから発送完了メールが送られてくると思います。
そのメールには荷物の配送業者および追跡番号が記載されているのが一般的です。
親切な販売店さんはより簡単に荷物の状況が確認できるように配送業者のサイトリンクを記載してくれている場合もあります。
稀にリンク内に追跡番号が書き込まれており、すぐ自分の荷物がどうなっているか確認できる場合もあります、神。

とはいえ、そんな神対応をしてくれる店舗もあまり多くないので、大半の場合、**追跡番号コピー -> 荷物追跡サイトへアクセス -> 入力 -> 結果の表示**という非常に面倒くさいステップを踏むことになります。

もっと楽に荷物の発送状況を確認できる様にしたい…

**「そんな面倒なことでも簡単にできます、iPhoneならね。」**

## ショートカットの概要

というわけで、iPhoneでショートカットを作成しました。
中身はこんな感じです。

1. 追跡番号のみを選択し、共有をタップする
2. リストからどの配送業者か選択する(日本郵便・佐川急便・クロネコヤマトの3択)
3. 追跡番号を荷物追跡サイトのリンク内に挿入する
4. カスタムしたリンクをSafariで開く

これだけです。

## 要所解説

### 1. 追跡番号を選択し、共有をタップ
選択した文字をショートカットに渡す時のアクションはショートカットアクションの一覧にはありません、**ショートカット右上の詳細 > 共有シートに表示をオンにできます。**
今回の場合は共有シートタイプをテキストにします。あまり必要ありませんが、念のため追跡番号と称して変数に変換しています。

### 2. リストからどの配送業者か選択する(日本郵便・佐川急便・クロネコヤマトの3択)
"メニューから選択"アクションで業者を分けます。

### 3. 追跡番号を荷物追跡サイトのリンク内に挿入する
日本郵便・佐川急便はリンクに追跡番号を加えると直接その荷物の配送状況を確認できます。
>日本郵便: https://trackings.post.japanpost.jp/services/srv/search/?requestNo1=[追跡番号]&search=1
佐川急便: http://k2k.sagawa-exp.co.jp/cgi-bin/mole.mcgi?oku01=[追跡番号]

直接確認できるよう、リストを組んで結合させることでカスタムリンクを作成します。
クロネコヤマトはそれができません。そのため、クリップボードに追跡番号をコピーして、自動的にクロネコヤマトアプリを開くようにしました。

### 4. カスタムしたリンクをSafariで開く
リンク先を"Safariで開く"に投げるだけです。

## ショートカットの全貌

スクリーンショットを載せます。
<img width="350" alt="Screenshot at Oct 27 18-00-47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330454/26861f65-4f2e-c755-29fa-f9d5238a3be8.jpeg">

## 使い方

例えばAmazonから荷物が送られてくるとします。その場合、以下のようなメールが届くはずです。
<img width="350" alt="Screenshot at Oct 27 18-00-47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330454/1fce0f2c-7025-f20a-5fd9-d2149e2df3f0.jpeg">
ここで、問い合わせ番号を"選択" -> "共有" -> "荷物追跡ショートカット"の順でタップすることで、現在の荷物の状況を確認することができます。

## ショートカットの共有

以下にショートカットのダウンロードリンクを貼っておきます。ダウンロードにはiPhoneの設定->ショートカット->信頼されていないショートカットを許可をオンにする必要があるので各自設定の変更が必要です。

https://www.icloud.com/shortcuts/9064256f0d5549cebd30fbe2cc0f263f
FileMakerProでのFTPeekプラグイン導入エラーを解消

# はじめに
## 対象読者
* Claris FileMaker Pro ユーザ
* [360Works](https://360works.com/) の [FTPeek](https://360works.com/ftp-plugin/) をプラグインとして導入している／したい

## 環境
* Windows 10 Home / Pro
* FileMaker Pro 18 / 19
* FTPeek 2.2 / 2.3

## 問題
* 以下のエラーが出てプラグイン導入できない

> Unable to launch plug-in child process JVM

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/ac3b7400-a0c9-75a2-94f5-232a4160f733.png)


# 原因と対処法
## 原因
* 過去に 360Works のプラグインを導入している場合、以下ディレクトリに既に jre ディレクトリが存在している（……はず）

```
C:\Users\username\AppData\Local\360Works\Plug-ins
```

* プラグインファイルを設置した後の初回 FileMaker Pro 起動時に JRE ( 
Java Runtime Environment ) をダウンロードしようとするが、その際、既に上記ディレクトリに jre が存在していると、かち合ってしまい冒頭のエラーが発生する（……と思われる）


## 対処法
* `C:\Users\username\AppData\Local\360Works\Plug-ins\jre` ディレクトリを削除


# おわりに
## 感想
* すごいニッチな記事ですが、ちょっとハマりかけたので記録つけておきます
* 参考に貼りましたが 360Works の他のプラグインでも、同様かもしれません

## 参考
* [360Works - common issues - Windows plugins released after 1/21/2018](http://docs.360works.com/index.php/Common_issues#Windows_plugins_released_after_1.2F21.2F2018)
* [FM Forums - Unable to launch plug-in child process JVM](https://fmforums.com/topic/105528-unable-to-launch-plug-in-child-process-jvm/)
jupyter notebookでtensorflow_federatedを動かす

# jupyter notebookでtensorflowを使えるようにする
フェデレーティッドラーニングをjupyter notebook上で使いたかったので環境構築しました。
その**手順の備忘録**です。

## 参考にしたサイト
- FLのチュートリアル
[画像分類のための連合学習  \|  TensorFlow Federated](https://www.tensorflow.org/federated/tutorials/federated_learning_for_image_classification)

- jupyter notebookにモジュールをインストールする
[Anaconda の Jupyter Notebook で ModuleNotFoundError が発生した場合のトラブルシュート \|](https://weblabo.oscasierra.net/python-anaconda-jupyter-modulenotfounderror/)



## 諸々のインストール
- tensorflow_federatedはtensorflowのバージョン2.2.0以下で動作するため、以前にインストールしたtensorflow関連のものをアンインストールしてから再インストールする

```shell:
pip uninstall tb-nightly tensorboard tensorflow tensorflow-estimator tf-estimator-nightly tf-nightly
pip install tensorflow==2.2.0rc0 
```

- jupyter notebookの環境構築手順

```sh:
conda create -n FL python=3.6
(conda init zsh)  # 以前はbashを使用していたがzshに移行したので、initしろと表示が出たのでしたがった
conda activate FL
conda install jupyter
# 上記の手順でインストールしてたら飛ばしてください
pip install tensorflow==2.2.0rc0
(最新は2.3.1だがfederatedが動くのは2.2.0以下)

jupyter notebook

# jupyter notebook上で実行
!pip install --quiet --upgrade tensorflow_federated_nightly
!pip install --quiet --upgrade nest_asyncio
```

## installが正常に行えたか確認するための処理

```python:
import nest_asyncio
nest_asyncio.apply()

%load_ext tensorboard

import collections

import numpy as np
import tensorflow as tf
import tensorflow_federated as tff

np.random.seed(0)

tff.federated_computation(lambda: 'Hello, World!')()
# print(tff.federated_computation(lambda: 'Hello, World!')())
 

 b'Hello, World!'が返ってきたら成功です
```


## チュートリアルを進めてたらエラーが発生
tensroboradを読み込む際に、**Duplicate plugins**というエラーが発生。
tensorflowを再インストールすることで解決した。

```shell:
pip uninstall tb-nightly tensorboard tensorflow tensorflow-estimator tf-estimator-nightly tf-nightly
pip install tensorflow==2.2.0rc0 
```
【#PowerApps】Power Apps で配列を作るときは注意が必要！

# 概要

Power Apps のキャンバスアプリを用いて 配列（コレクションではありません）を作る方法が２種類（厳密にはほかの関数を使えば作る方法はありますが、基本的な方法とお考え下さい）存在し、その２つとも挙動が違うのでそのまとめになります。


# 配列のカラムを作る方法

Power Apps のキャンバスアプリでは以下の２種類の方法が存在します。

```
[{id:1},{id:2},{id:3}]
```
上記のように [ ] で囲んでしまうものと

```
Table({id:1},{id:2},{id:3})
```
Table 関数を用いて作成する方法です。

実際にこちらを用いて配列をもつコレクションを作成する式が以下になります。

```
ClearCollect(a,[{id:1},{id:2},{id:3}]);
```

または

```
ClearCollect(b,Table({id:1},{id:2},{id:3}));
```

しかしこの２種類の方法では作成後の結果が変わってきます。

## Table 関数を用いた場合

実際に以下の式を使うと画像のような結果になります。

```
ClearCollect(b,Table({id:1},{id:2},{id:3}));
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/c5721c7d-f3e0-d40f-383e-637b128603c3.png)

Table 関数を使った場合は展開された状態で作成されます。

## [ ] を用いた場合

実際に以下の式を使うと画像のような結果になります。

```
ClearCollect(a,[{id:1},{id:2},{id:3}]);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/1eb2f69b-422c-c1bb-0c87-52408123d48a.png)

[ ] 画像のように 暗黙的に Value という値で入れ子のような状態で作成されます。

### 原因

@h-nagao さんがわかりやすく説明していますのでこちらをご覧ください。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">つまり [XXX, YYY]= 強制的に[{&quot;Value&quot;:XXX},{&quot;Value&quot;:YYY}]に変換される<br><br>Table(XXX, YYY) = [XXX, YYY]に変換される<br><br>みたいな感じか。<br><br>XXX, YYYは何か。データ型不問</p>&mdash; Hiro (@mofumofu_dance) <a href="https://twitter.com/mofumofu_dance/status/1318485120563646465?ref_src=twsrc%5Etfw">October 20, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# まとめ

配列を使うときは面倒なことをしたくなければ Table 関数を使いましょう。
Ruby:アカウント編集機能

【概要】
----------------------------------------
<b>1.結論</b>

<b>2.どのようにコーディングするか</b>

<b>3.開発環境</b>

<b>補足</b>



1.結論
----------------------------------------
<b>コントローラーにeditアクション・updateアクションをコーディングし、edit.html.erbに必要なヘルパーメソッドをコーディング</b>する！
<br>
2.どのようにコーディングするか
----------------------------------------
※devise gemを使用しております。

```ruby:config/roites.rb
Rails.application.routes.draw do
  devise_for :users
  root to:'XXXX#index'

  resources :users, only: [:edit, :update] #---❶
end
```
❶:usersコントローラーに編集と更新アクションのみを命令したいのでresourcesにonlyをコーディングしています。

```ruby:app/controllers/users_controller.rb
class UsersController < ApplicationController

  def edit #---❶
  end

  def update #---❶
    if current_user.update(user_params) #---❷
      redirect_to root_path　#---❸
    else
      render :edit #---❸
    end
  end

  private

  def user_params　#---❹
    params.require(:user).permit(:name, :email)
  end

end

```
❶：ルーティングでも設定したようにアカウント（今回の場合はnameとemail)を編集させたいので、編集と編集したあとの更新機能命令を受け取ってmodel,viewに命令したいのでdefを使ってアクションを定義しています。

❷：どのアカウントに対して更新させたいかが不明なので、現在ログインしているuserに対して行っています。current_userはdevise gemを導入することで使用できます。

❸：更新が成功すればトップページに、更新が失敗すれば編集画面に戻るようにしています。簡単に説明すると更新されあとはuserの情報を更新したいので(=元のインスタンス変数の値が上書きをしたい)redirect toです。失敗した場合は、userの誤った情報を更新されないまま編集画面にただ戻ればいいのでrenderを使用しています。

※render/redirect toの違いは下記URLにて自分の記事でも説明していますが、検索すればたくさん出てきます。詳細が知りたければご自分で検索されたり、下記を参照されてください！
<a href="https://qiita.com/taka_no_okapi/items/93f13e72d54ade2a770d">render と redirect_to の使い分け基準</a>

❹：ストロングパラメーターを設定し、意図しないuserの編集更新を防いだままデータを受け取ります。requireメソッドを使用し、userモデルから情報を持ってきています。さらに詳細にパラメーターを指定したいのであればカラム名をキー名にします。

```ruby
params.require(:モデル名).permit(:カラム名(キー名になる), ・・・・ ) 
```

ヘルパーメソッドのform_withを使用して現在ログインしている人の情報を送れば簡単なアカウント編集機能は完了です。

```ruby:app/views/users/edit.html.erb
<%= form_with model: current_user, local: true do |f|%>
 <%= f.text_field :name %>
 <%= f.email_field :email  %>
 <%= f.submit "更新"%>
<% end %>
```
<br>


3.開発環境
----------------------------------------
Ruby 2.6.5</br>
Rails 6.0.3.3</br>
MySQL 5.6.47
SequelPro 1.1.2</br>
VScode</br>
<br>

補足
----------------------------------------
2.❹でmergeメソッドを使用すると、ハッシュを結合させることができ、情報を追加することができます。

```ruby
params.require(:user).permit(:name, :email).merge(user_id: current_user.id)
```

<br>
MKL taints symbol table (PLT / procedure linkage table)

## はじめに

https://qiita.com/cielavenir/items/93d2b5b057bfe1383670 の関連。

A.soとB.soがあって、Aはlibmkl_rt、Bはlibblasに静的リンクしているとする。このとき、本来であれば、A.soおよびB.soを動的リンクするなら[^1]、Aはlibmkl_rt、 BはlibblasをBLAS実装に使うはず。
ところが、実際には、AがMKLのBLAS関数を呼んだ後にBをロードすると、BもMKLをBLAS実装に使うようになってしまう。もし(そうそうないことだが)BがMKL以外のBLAS実装の挙動に依存する[^2]なら、これは問題となりうる。が、今回は回避策はなさそうに思える…。

## デモ

scipy/spatial/qhull.soのバイナリパッケージはlibopenblasにリンクしているが、LD_DEBUG="libs symbols" 環境で以下を実行すると、(libopenblasでなく)MKLのdgetrf/dgetrs/dgeconがロードされることが観測される。`import scipy`ではscipy/spatial/qhull.soのロードに至らないことに注意。

```py
#!/usr/bin/python
import numpy
import scipy  # this does not guarantee scipy.spatial safety.
print(numpy.dot([[1,2]],[[3],[4]]))
points = numpy.random.rand(30, 2)  # 30 random points in 2-D

import ctypes
n=ctypes.c_int(3)
alpha=ctypes.c_double(3)
beta=ctypes.c_double(-2)
A=(ctypes.c_double*9)(1,2,9,8,10,-5,3,8,-1)
B=(ctypes.c_double*9)(9,3,-8,8,11,6,3,2.3,1)
C=(ctypes.c_double*9)(3,8,6,3,4,1,1.2,8,-2)
# this CDLL loads so using RTLD_LOCAL
ctypes.CDLL("libmkl_rt.so").cblas_dgemm(102,111,111,n,n,n,alpha,A,n,B,n,beta,C,n)
print(list(C))

print '=== check dgetrf/dgetrs/dgecon below ==='
from scipy.spatial import ConvexHull
hull = ConvexHull(points)
```

## おわりに

思うところがあって、先のデモでも複数個のモジュールを使うパターンを追加したところ、再現できた(あちらは(constructor attributeを使っているので)関数を呼ばずともロードしただけで再現する)。挙動を観測するに、libmkl_rtはあのdlopenし直すやつをやっているだけではないだろうか…?

## 新しいglibcの対策(および別解)

angel様いわく、.aを使った上で-pie -rdynamicを指定することで回避可能とのこと。

が、このようにして生成したライブラリは[glibc 2.30以降では標準ではロードできない](https://stackoverflow.com/questions/59074126/loading-executable-or-executing-a-library)。[mkexeloadable](https://gist.github.com/xieyubo/6820491646f9d01980a7eadb16564ddf)をバイナリに対して用いることでロード可能になる。

ところで、このプログラムで操作しているのはELFタグ6ffffffbであるが、これを検索すると[LLVMで-Bsymbolicをサポートしようとするパッチ](https://reviews.llvm.org/D13541)が見つかる。つまり、`-Wl,-Bsymbolic`を指定すれば良い。ただし、これも.aを使う必要がある。さらに、-sharedを使う以上は.aが-fPICでコンパイルされている必要がある。

以上のことは https://github.com/cielavenir/angel_pietest には反映している。

さて、Debian busterは、/usr/lib/x86_64-linux/gnu/blas/libblas.aが-fPICでコンパイルされているが、bullseyeはそうでない。3.8.0-5以降のパッケージは-fPICでなくなった旨の更新履歴がある。lapackのソースパッケージをコンパイルし、`lapack-3.9.0/pic32/libcblas_pic.a lapack-3.9.0/pic32/librefblas_pic.a lapack-3.9.0/pic32/libcblas_pic.a`[^3]にリンクすればよいが、実用的ではない。

…普通にmkexeloadable使ったほうが良さそうです^^;;;でもこれのおかげで6ffffffbというキーワードがわかったので感謝。

[^1]: RTLD_LOCAL
[^2]: openrave(またですね)[^4]
[^3]: libcblas_pic.aを2回指定していますがリンクの都合です、誤植ではありません
[^4]: MKLを最初から使う分には大丈夫、キャッシュが生成された後の切り替えがこわい
P5.js 日本語リファレンス(specularMaterial)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の specularMaterial関数を説明します。

## specularMaterial()

### 説明文

オブジェクトに鏡面素材を設定します。鏡面素材は光沢のある反射素材です。ambientMaterial と同様に環境光下でオブジェクトが反射する色を定義します。たとえば、
環境光に赤が含まれているとき、鏡面素材に赤が含まれていればオブジェクトは光を反射します。逆に鏡面素材に赤が含まれていなければオブジェクトは光を反射しません。
点光源(pointLight)や指向性ライト(directionalLight)など他のすべてのタイプのライトのとき、鏡面素材は光源の色をビューアに反映します。

### 構文

specularMaterial(gray, [alpha])

specularMaterial(v1, [v2], [v3], [alpha])

specularMaterial(color)

### パラメタ

- v1
gray：グレー値

- alpha
Number：不透明度(オプション)

#### RGB または HSB を指定するとき

- v1
Number：赤または色相値(Hue)

- v2
Number：緑または彩度値(Saturation)

- v3
Number：青または明度値(Brightness)

- color
Number[] | 文字列 | p5.color：color、color Array または CSS color 文字列


### 例1

```javascript
function setup() {
  createCanvas(100, 100, WEBGL);
}
function draw() {
  bacground(0);
  ambientLight(50);
  pointLight(250, 250, 250, 100, 100, 30);
  specularMaterial(250);
  sphere(40);
}
```

### 実行結果

https://editor.p5js.org/bit0101/sketches/OqM18NeZF


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(emissiveMaterial)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の emissiveMaterial関数を説明します。

## emissiveMaterial()

### 説明文

オブジェクトに使用するマテリアル(素材)の放射色を設定します。放射光があると反射光がなくてもオブジェクトは光っているように見えます。

### 構文

emissiveMaterial(v1, [v2], [v3], [a])

emissiveMaterial(color)

### パラメタ

#### gray 値を指定するとき

- v1  
Number：グレー値

#### RGB または HSB を指定するとき

- v1
Number：赤または色相値(Hue)

- v2
Number：緑または彩度値(Saturation)

- v3
Number：青または明度値(Brightness)

- a
Number：不透明度(オプション)

- color
Number[] | 文字列 | p5.color：color、color Array または CSS color 文字列



### 例1

```javascript
// 環境光などライトは無くても光っています。
function setup() {
  createCanvas(300, 300, WEBGL);
}
function draw() {
  background(0);
  noStroke() ;
//  ambientLight(100, 0, 0);

  translate(-30, 0);
  emissiveMaterial(255, 0, 0);
  box(50);

  translate(60, 0);
  emissiveMaterial(0, 255, 0);
  box(50);
}
```

### 実行結果

https://editor.p5js.org/bit0101/sketches/smoxhzTr4



### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(ambientMaterial)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の ambientMaterial関数を説明します。

## ambientMaterial()

### 説明文

オブジェクトに使用するマテリアル(素材)の反射色を定義します。環境光(ambientLight)によって反射状況が変わります。たとえば、環境光に赤が含まれているとき、マテリアルに赤が含まれていればオブジェクトは光を反射します。逆にマテリアルに赤が含まれていなければオブジェクトは光を反射しません。

### 構文

ambientMaterial(v1, [v2], [v3])

ambientMaterial(color)

### パラメタ

#### gray 値を指定するとき

- v1  
Number：グレー値

#### RGB または HSB を指定するとき

- v1
Number：赤または色相値(Hue)

- v2
Number：緑または彩度値(Saturation)

- v3
Number：青または明度値(Brightness)

- color
Number[] | 文字列 | p5.color：color、color Array または CSS color 文字列


### 例1

```javascript
// 環境光(ambientLight)は緑です。左側の box は緑を含ま
// ないので光を反射しませんが、右の box は緑を含むので
// 光を反射します。
function setup() {
  createCanvas(300, 300, WEBGL);
//  colorMode(RGB);
}

function draw() {
  background(100);
  ambientLight(0, 255, 0); // 緑の環境光

  translate(-30, 0);
  ambientMaterial(255, 0, 255); //緑色を含まない
  box(50, 50, 50); // 左側のbox

  translate(60, 0);
  ambientMaterial(255, 200, 255); //緑色を含む
  box(50, 50, 50); // 右側のbox
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/b195ihKaL


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(textureMode)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の textureMode関数を説明します。

## textureMode()

### 説明文

テクスチャマッピングの座標空間を設定します。デフォルトのモードは IMAGE で画像の実際の座標を参照します。 NORMAL は 0 〜 1 の範囲の値の正規化された空間を指します。この関数は WEBGLモードでのみ機能します。
IMAGE では画像が 100 x 200 ピクセルの場合、画像を四角形の全体のサイズにマッピングするにはポイント (0,0)(100, 0)(100,200)(0,200) になります。 NORMAL での同じマッピングは(0,0)(1,0)(1,1)(0,1) になります。

### 構文

textureMode(mode)

### パラメタ

- mode  
定数：IMAGE または NORMAL


### 例1

```javascript
let img;

function preload() {
  //画像
  img = loadImage('image.png');
}

function setup() {
  createCanvas(400, 400, WEBGL);
}

function draw() {
  // 画像空間を(0, 0)-(1, 1) で指定する
  texture(img);
  textureMode(NORMAL);
  beginShape() ;
  vertex(-150, -200, 0, 0);
  vertex( 150, -200, 1, 0);
  vertex( 150,    0, 1, 1);
  vertex(-150,    0, 0, 1);
  endShape() ;

  // 画像空間を(0, 0)-(300, 200) で指定する
  texture(img);
  textureMode(IMAGE);
  beginShape() ;
  vertex(-150,   0,   0,   0);
  vertex( 150,   0, 300,   0);
  vertex( 150, 200, 300, 200);
  vertex(-150, 200,   0, 200);
  endShape() ;
}
```

### 実行結果

https://editor.p5js.org/bit0101/sketches/S3csBXQtt


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
Ryzen内蔵GPUとArchLinuxでFolding@homeする


# きっかけ
自宅計算機の主要な計算になったFolding@home。ポイントを得るにはGPUが必要。
そういえばM75q-1のRyzen 5 PRO 3400GEにも、Vega 11が付いていた。
Ubuntuとかなら動きそうだが、ArchLinuxでは?
後から思い出して書いているので、抜け漏れあるかも。

# お品書き(環境)
* M75q-1
* ArchLinux(ローリングリリースなので、執筆時点の2020/10)
 * OpenCL
 * Folding@home

# ArchWikiを確認
[ArchWikiのFolding@home](https://wiki.archlinux.jp/index.php/Folding@home)を見ると、

> GPUに適したOpenCLパッケージが必要です

とある。
また、[ArchWikiのGPGPU](https://wiki.archlinux.jp/index.php/GPGPU)によると、AMDのGPU用にも何種類かある。
`opencl-mesa`と`opencl-amd`を試したところ、`opencl-amd`の方だと、Folding@homeでGPUも動くようだ。
なお、`opencl-amd`はAUR。

# AURに必要なパッケージのインストール
AURなので、まずは[ArchWikiのArch UserRepository](https://wiki.archlinux.jp/index.php/Arch_User_Repository)を見ながら必要なパッケージをインストール。
と言っても、何を入れたか忘れた…多分これくらいか。

```shell-session
pacman -Syu base-devel makepkg git
```

# `opencl-amd`のインストール
[`opencl-amd`](https://aur.archlinux.org/packages/opencl-amd/)を見ながらインストール。
`PKGBUILD`を見ると、Ubuntu 20.04用のものを引っ張ってくるようだ。

```shell-session
git clone https://aur.archlinux.org/opencl-amd.git
cd opencl-amd
makepkg -si
```

# Folding@homeのインストール
[ArchWikiのFolding@home]
(https://wiki.archlinux.jp/index.php/Folding@home)と[`foldingathome`](https://aur.archlinux.org/packages/foldingathome/)を見ながらインストール。
こちらもAUR。

```shell-session
git clone https://aur.archlinux.org/foldingathome.git
cd foldingathome
makepkg -si
```

# Folding@homeの設定
認証とか適当なのでご注意を。`type=GPU`の行が入っている必要がある。

```xml:/etc/foldingathome/config.xml
<config>
  <!-- HTTP Server -->
  <allow v='127.0.0.1 192.168.0.0/24'/>

  <!-- Slot Control -->
  <power v='full'/>
  <team value="0"/>
  <passkey value=""/>

  <!-- User Information -->
  <user value="anonymous"/>

  <!-- Web Server -->
  <web-allow v='127.0.0.1 192.168.0.0/24'/>

  <!-- Folding Slots -->
  <slot id='0' type='CPU'/>
  <slot id='1' type='GPU'/>
</config>
```

# 実行
```shell-session
systemctl start foldingathome
```

そして、該当ホストの7396番ポートをブラウズ。

![スクリーンショット 2020-10-20 18.24.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104225/5c37f474-ad4d-5fab-2a60-240572d2f8a1.png)

わーい。

# オチ
M75q-1の筐体では、ファンの音が苦しいいい…(知ってた)

# 宿題
内蔵GPUでROCm…はハードルが…

# 最近の`opencl-amd`での確認結果 (2021/5追記)
Folding@homeは`foldingathome-7.6.21-1-x86_64`

- `opencl-amd-21.10.1247438-1-x86_64`
    - GPUが動作するが遅い?
- `opencl-amd-20.50.1234664-5-x86_64`
    - GPUは動作するが遅い
- `opencl-amd-20.45.1164792-3-x86_64`
    - `FAHClient`がSegmentation Faultする
- `opencl-amd-20.40.1147286-1-x86_64`
    - GPUが動作する
Ruby on Rails メールの自動送信機能 設定（gmail利用）


##やる事
Googleアカウントで2段階認証用のパスワード取得する

##手順
Googleのアカウント取得が必要になります。
gmailアカウントの２段階認証をオンにして、専用の認証パスワードを取得した上で設定を行いました。

①送信用に利用するGoogleのアカウントでブラウザを開き、右上にタブを開きアカウントを開きます。
<img width="300" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666273/7ecae3c7-d5b3-f6c7-b740-fe6bc51e35da.png>

②画面左のメニューから[セキュリティ]を選択し、セキュリティの設定画面を開きます。
<img width="300" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666273/4823210c-3e31-5a51-f3ab-a2cb5e441c59.png>

③[Googleへのログイン]にある[２段階認証プロセス]を選択し、画面に沿って設定をします。
[使ってみる]⇨[パスワード]⇨[続行]⇨[携帯に確認連絡が来る]⇨[バックアップ方法を登録]⇨[携帯に届いたコードを入力]⇨[有効にする]
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666273/0ae8276e-40cf-cdd3-151b-c7650fe36620.png)

④画面を戻り[Googleへのログイン]に[アプリ パスワード]が表示されるので、画面に沿って設定をします。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666273/1d695c71-c0fe-d2c9-1bff-834523d42783.png)

⑤パスワードが発行される (1６文字)
このパスワードをメールアカウントの認証として、利用します。
<img width="300" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666273/de1cce22-7d8d-ff0c-d64d-351f6f8aa3e7.png>


##Railsのconfigファイル編集

メール送信設定はconfig/environment配下にある各環境ごとの設定ファイルに定義します。

【フォルダ構成】
　config
　　∟environments
　　　∟development.rb　・・・　開発環境
　　　∟product.rb ・・・　   本番環境

```ruby
Rails.application.configure do
  config.action_mailer.raise_delivery_errors = true  #falseからtrueに変更
 #中略#
  config.action_mailer.delivery_method = :smtp 
  config.action_mailer.smtp_settings = {
    address: 'smtp.gmail.com',
    domain: 'smtp.gmail.com',
    port: 587,
    user_name: Rails.application.credentials.gmail[:user_name],
    password: Rails.application.credentials.gmail[:password],
    authentication: 'login',
    enable_starttls_auto: true
  }
end

```

###環境変数の設定

```
$ sudo EDITOR=vim rails credentials:edit
```

環境変数に下記を追加する。

```ruby
gmail:
  user_name: test@gmail.com 
  #先ほど登録したGoogleアカウントのアドレスを入力
  password: aaaabbbbccccdddd
  #発行されたパスワードを記載する（１６文字）
```

##次回
Ruby on Railsでの実装を行っていきます。
[Ruby on Rails メールの自動送信機能 実装](https://qiita.com/kobaru1129/items/985dffbc59107a042879)
Debianパッケージのデバッグシンボルを取得する

対応するpkgnameに対し、[pkgname]-dbgsymをインストールする。

## apt-line

```
deb http://debug.mirrors.debian.org/debian-debug stretch-debug main contrib non-free
```

## 手動

1. http://debug.mirrors.debian.org/debian-debug/dists/stretch-debug/main/binary-amd64/ を確認する
2. [pkgname]-dbgsym パッケージのエントリに対し、Filenameフィールドを確認する
3. http://debug.mirrors.debian.org/debian-debug/pool/ 以下から取得する

cf: https://wiki.debian.org/DebugPackage
mindの研究 その24

#概要

mindが謎なので調べてみた。
vistaに入れた。
atcoder、やってみた。

#N個の整数の重複しない値の数を求める。


```

メインとは
　文字列１は　文字列
　合否は　変数
　数１は　変数
　数２は　変数
　Iは　変数
　Jは　変数
　Kは　変数
　Lは　変数
　Mは　変数
　配列１は　３０個の　変数
　文字列入力し　文字列１に　入れ
　文字列１を　数値変換し　数１と　合否に　入れ
　数１を　回数指定し
　　Iに　回数を　入れ
　　文字列入力し　文字列１に　入れ
　　文字列１を　数値変換し　配列１（I）と　合否に　入れ
　繰り返し
　数１から　１を　加えて　数２に　入れ
　数１を　回数指定し
　　数１から　回数を　引いて　Kに　入れ
　　Kを　回数指定し
　　　数１から　回数を　引いて　Lに　入れ
　　　Lに　１を　加えて　Iに　入れ
　　　Lに　０を　加えて　Jに　入れ
　　　もし　配列１（I）より　配列１（J）が　等しい　ならば
　　　　配列１（I）に　０を　入れ
　　　つぎに
　　繰り返し
　繰り返し
　Mに　０を　入れ
　数１を　回数指定し
　　もし　配列１（回数）が　０より　大きい　ならば
　　　Mに　１を　加え　Mに　入れ
　　つぎに
　繰り返し
　Mを　数値表示する

```


以上。
Laravel 6.x $request->img と $request->file('img') を比較してみた

#制作環境

Windows 10
Laravel : 6.18.35
Laravel/ui : 1.0
Laravel-mix : 5.0.1
Bootstrap : 4.0.0
MDBootstrap : 4.19.1
chart.js : 2.9.3
XAMPP
PHP : 7.4.3
Visual Studio Code


#はじめに

この記事はプログラミングをはじめたばかりの素人が、メモするのに利用しています。
内容には誤りがあるかもしれません。

#比較理由

画像のアップロードの仕方を検索している時、\$request->file('img')と記載していることが多かったので、$request->imgと記述する場合と何が違うのか気になった為。

#結論

結論から先にいうと。
<font color="Red">**違いがありませんでした。**</font>

#比較方法

以下の記述の代入された値を、dd()で確認しました。
※フォームより画像をアップロードして検証しています。

##比較①

```PHP
$data = $request->img;
dd($data);
```

##比較②

```PHP
$data = $request->file('img');
dd($data);
```

##比較③

```PHP
$data = $request->img->store('public/images');
dd($data);
```

##比較④

```PHP
$data = $request->file('img')->store('public/images');
dd($data);
```

#各結果

##比較①

![img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/e9e868ef-29cf-9d9c-55f9-6fea85feb7f6.jpeg)

##比較②

![fimg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/20fca13f-b1ab-080c-704a-82ee769ce90a.jpeg)

##比較③

![png1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/b15801ab-898d-f236-7e85-72ce3a86bcf0.jpeg)

##比較④

![png2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/8496036e-428e-922a-9808-a779fc511f46.jpeg)
docker-compose コマンド一覧（Rails用)

忘れないために書きます

###docker起動

``` 
 #foregroundで起動 
 docker-compose up #

 #backgroundで起動
 docker-compose up -d
```

###docker停止
``` 
 #foregroundで起動時
 Ctr + C

 #backgroundで起動時
 docker-compose stop 
```

###Gemfile変更時
```
 docker-compose build
```

###コントローラーを作成
```
docker-compose run web bundle exec rails g controller <コントローラー名> <アクション名>
```

###モデルの作成
```
docker-compose run web bundle exec rails g model <モデル名> <カラム名:型>
```

###テーブルの作成
```
docker-compose run web bundle exec rake db:migrate
```

###全部消すとき
```
docker-compose down --rmi all --volumes
```

また新しいこと覚えたときに追加します。
Amazon Linux 2にfirewalldを追加(IPアドレス制限)

# 関連URL

- [CentOS 7 firewalld よく使うコマンド - Qiita](https://qiita.com/kenjjiijjii/items/1057af2dddc34022b09e)  ← 素晴らしい！
- [AWSでIPアドレスを制限する３つの方法](https://bsblog.casareal.co.jp/archives/3370)

# Amazon Linux 2ではfirewalldは不要？

`amazon linux + firewalld`でググると上位表示される記事の多くで『Amazon Linux 2には同等の機能を持つセキュリティグループやネットワークALCがある(しかもサーバの手前でブロックしてくれる)ので`firewalld`は使用しないでよい』と記載されています。

ただ「特定のIPアドレスの接続を拒否したい場合」に以下の問題があります。

- セキュリティグループ・・・ホワイトリスト方式(設定できるのは「許可」。拒否は指定不可)
- ネットワークACL・・・「拒否」設定可能。(許可も)。設定できる数に上限(20)がある。
- ALB・・・ブラックリスト方式。HTTP/HTTPS限定

したがって20を超えるIP制限をしたい場合は`firewalld`の出番です。

# 環境/前提

- 2020年10月20日現在/東京リージョンのEC2
- OSは`Amazon Linux`で`yum update`済
- EC2に割り当てているセキュリティグループのインバウンドで利用するポートへのアクセス許可がされている
    - 本記事の場合は`ssh(22)`,`http(80)`,`https(443)`

[![Image from Gyazo](https://i.gyazo.com/2ec023c1ad11bc9b75cc526cafe9ff01.png)](https://gyazo.com/2ec023c1ad11bc9b75cc526cafe9ff01)

# 導入

インストール

```bash
yum install firewalld
```

永続化(サーバ再起動時に自動起動)

```bash
systemctl enable firewalld.service
```

開始

```bash
systemctl start firewalld.service
```

ステータス確認 => ActiveになっていればOK

```bash
systemctl status firewalld.service
```

## 利用できるサービスを限定(ssh/http/https)

`public{ゾーンに追加します。ホワイトリスト方式です。
最後にリロードを忘れずに。(`systemctl reload firewalld`は不要)

```bash
firewall-cmd --add-service=http  --zone=public --permanent
firewall-cmd --add-service=https --zone=public --permanent
firewall-cmd --add-service=ssh   --zone=public --permanent
firewall-cmd --reload
```

※`--permanent`:サーバ再起動しても有効

## IPアドレス制限

`drop`ゾーンにアドレスを指定します。ブラックリスト方式です。

```bash
firewall-cmd --zone=drop --permanent --add-source=<IPアドレス範囲/CIDR>
firewall-cmd --reload
```

# 動作確認

## `--get-active-zone`
当方の環境だと`--get-active-zone`を実行しても結果が返ってきませんでした。`--reload`しても同じ。
不安になりますが、実はこの状態でもfirewalldは動作しています。(サーバ再起動(`# reboot`)すると表示されるようになりました)

| 期待した結果 | 実際の結果 |
|:--|:--|
| # firewall-cmd --get-active-zone<br>drop<br>&nbsp; sources: <指定したIPアドレス範囲> <br>public<br>&nbsp; interfaces: eth0  | # firewall-cmd --get-active-zone<br><空>  |

## `--list-all`

こちらも`interfaces`が空になっていて不安になりますが動作していました。(こちらもサーバ再起動で表示されるようになりました)

サーバ再起動前の(不安になる)表示

```
# firewall-cmd --list-all
public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh dhcpv6-client https http
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```

## 有効なサービス確認(`firewall-cmd --list-services`)

これはサーバ再起動しないでも表示されてました。

```bash
# firewall-cmd --list-services
ssh dhcpv6-client https http
```

※`dhcpv6-client`は最初から有効化されているサービスです

# 動作確認

publicゾーン、dropゾーンに追加、削除しながら意図した動作になっているか確認します。
`ssh`をpublicから外した後に全部ログアウトしてしまうとまずい(ですよね？)ので、外さないように注意。
RDSにORM使ったけどモヤモヤが止まらないのでぜんぶ吐き出す！！！


　転職活動で**バックエンドも出来るぜ！アピール**としてポートフェリオぽいの作った方が良いかもね・・？という事で、こんなリポジトリ作ってたわけなんですけど、コード書いてて気づいた事つらつらと書きます。

<a href="https://github.com/yasutakatou/goRDStest"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/yasutakatou/goRDStest.png" width="460px"></a>

　何時もの奔放な個人開発じゃなく、気づき、ハマりのQiitaらしいアウトプットってことで。ちゃんと調べて書けーって怒られそうな気もするけどｗ

## ORMの仕様とか親切で大惨事になるかも・・？

　今回Goの代表的なORMである**gorm**を使いましたが、**Delete**投げる時に消す情報を先に取得しないまま、動かすと**テーブル内のレコードすべてが消える**のが仕様らしいんです！

```
  jsonData.Id = Ids
  DBMS.First(&jsonData) // この行無いと滅亡です！
  DBMS.Delete(&jsonData)
```

今回一番作ってて？となったとこ。ありえん。

## RDS？ORM?どっちが悪いでしょーか

　RDSが一時的に不調っぽい時に動かすとダンマリで**タイムアウトせず・・**

```
　　DB, err := gorm.Open(DBTYPE, CONNECT) // ずーーっと接続中
　　if err != nil {
　　　　fmt.Println("RDS access error!")
　　　　panic(err.Error())
　　}
```

せめてエラー応答して欲しかったなと。

## Model定義の順番で構造が崩れる！？

```
　　type test struct {
　　　　gorm.Model
　　　　Number int `gorm:"primary_key"`
　　}
```

　みたいに**先にgorm.Model**を書いて、DB側のテーブルの最初にNumberが居ると**gorm.Modelから取得した値がNumberに浸食**してきます。

```
　　type test struct {
　　　　Number int `gorm:"primary_key"`
　　　　gorm.Model
　　}
```

こんなふうにDBスキーマにもよるけど最後に書いた方が無難。

## 残るモヤ

　と、まあ学びを通じて残るモヤがまだまだありました。。

**APIサーバー自身もマネージドサービス**の方が良くね？という疑問

ORM以前から**DB叩いてきたバックエンドエンジニアにはどう映ってるの？**という疑問

VSCodeとか**エコシステムが逆に足引っ張ってねーかい？**という疑問

　こういうアンチナレッジが残る事自体が学びなんでしょうけど、技術的な選定して舵を取るという意味でテックリードって大事なんやなと改めて思った。むしろ**テックリード不在の組織ってこういうのどうオトしてんだろ？？**
俺でもわかるALB Listener Rule HTTP Header:X-Forwarded-For判定

俺です。

特定IP(proxyなど)だけTarget-Bという次期リリースのBackend向けたい。
安全にリリースするために事前チェックしたい。というニーズがあるとおもいます。

GETメインなウェッブサービスにおいてCDNを使うのはマナーかつ呼吸ってばっちゃが言ってましたが
以下のような構成のウェッブサービスがあったとき、

User App-> CDN(CF) -> ALB -> Target

ALB Listener RuleのIP判定ではCDNなどを挟んでいると判定に使えないので、[ドキュメント](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listeners.html#rule-condition-types) にもある通り http-headerを使えば世界平和という話です

実際に試すときはこんなかんじで、X-Fowarded-Forに特定IPが含まれている場合.
というルールを作ればよいです。

```
[
  {
      "Field": "http-header",
      "HttpHeaderConfig": {
          "HttpHeaderName": "X-Forwarded-For",
          "Values": ["*203.0.113.1*"]
      }
  }
]
```

ではまた！
Win10 (2004) において【CTRL+SPACE】で【IME ON/OFF】の切り替えをする

Unixなどでは日本語入力とローマ字入力の切り替えを【CTRL+SPACE】で行う設定であることが多く，
Windowsでは IME ON/OFF によって入力の切り替えができるが，このIME ON/OFFをWindowsでもUnix等と同様の設定があると操作の一貫性から大変便利である．

これまでWin10では，バージョン1903までは[ydetectiveu007さんの記事](https://qiita.com/ydetectiveu007/items/56e1bea956c55a59cc3f)であるような方法で行うことが一般的であった．

バージョン2004からはIMEアイコンからのプロパティがなくなり，Win設定からのMicrosoft IMEの設定画面が更新されており，設定画面にいくつかのよく使われるキーボードショートカットを設定できる画面が追加され，そこから【CTRL+SPACE】で【IME ON/OFF】切り替えをさせるようになった．

タスクバーのIMEアイコンより右クリックから【設定】
＞【キーとタッチのカスタマイズ】
（なおここまでは，Windowsの【設定】アプリ＞【時刻と言語】＞【言語】＞【優先する言語】の【日本語】の【オプション】＞【キーボード】の【Microsoft IME】の【オプション】でも進める）

と進み，
【キーの割り当て】セクションにて【各キーに好みの機能を割り当てる】をオンにする
その後同セクションにて【CTRL+SPACE】の機能をドロップダウンから選択する．
（下図参照）

なお，この時設定できる【CTRL+SPACE】による【IME ON/OFF】は日本語変換中では生じず，若干以前と比べて自由度がなくなったものの，文書打つにはさほど困るほどでもないし，設定がわかりやすくなってよいと思いました．

![2020-10-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265603/9f6582b7-fb27-4a27-318c-37186c083028.png)
![2020-10-20 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265603/d51e0b9e-9756-528f-5575-4af2545ab6bb.png)
![2020-10-20 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265603/1306df4a-40ee-5f26-1d46-81602fcc2a86.png)
![2020-10-20 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265603/a5f16cd1-4351-ebf3-448d-ec73506884f1.png)
![2020-10-20 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265603/ba017062-ce6a-cef8-260e-f7f897711a3f.png)
【UNITY 逆引き備忘録】キャラクターを動かす(Rigitbody.velocity)

#はじめに

本記事では、Unityでキャラクターを動かすまでの手順を備忘録として残す。
移動方法はいくつかあるが、今回はRigitbodyのvelocityを利用する。
手順通りに進めると、以下のようなものができあがる。

↑：前進
↓：後退
←：左回転
→：右回転
カメラがキャラクターを追従

#Rigitbody.velocityによる移動
Rigitbodyのvelocity(速度)を直接書き換えることで移動する

######メリット
>物理演算が適用される
一定の速度で移動するので扱いやすい
単調なゲームに向いている

######デメリット
>質量や重力を考慮していないので挙動が非現実的
リアルな動作を追求したい場合は向かない

#手順
######0.前準備
>Cube等で床を作り、ColliderをAdd Componentする
（Cube等をCreateした場合、Colliderはデフォルトでセットされている）

######1.キャラクターを設置
>キャラクターを用意する（めんどくさければとりあえずCubeでもOK）
メインカメラで見える位置に設置する

######2.RigitBodyを追加
>キャラクターにRigitBodyをAdd Compornentする
Use Gravity　 ☑
Is Kinematic　☐
※再生してキャラクターが床をすり抜けて落ちれば成功

######3.Colliderを追加
>キャラクターにColliderをAdd Compornentする
キャラクターと同じくらいの大きさを設定する
Is Trigger　　☐
※再生してキャラクターが床をすり抜けなくなれば成功

######4.スクリプトを追加
>キャラクターに下記スクリプトをAdd Compornentする
InspectorからspeedとrotateSpeedを設定する
※再生してキャラクターを操作できれば成功

```
    public float speed;
    public float rotateSpeed;

    private Transform tr;
    private Rigidbody rb;
    private Vector3 charactorForward;
    private Vector3 moveVector;
    private float vertical;
    private float horizontal;

    void Start()
    {
        tr = this.transform;
        rb = GetComponent<Rigidbody>();
    }

    private void FixedUpdate()
    {
　　　　 //上下の入力
        vertical = Input.GetAxis("Vertical");
　　　　 //左右の入力
        horizontal = Input.GetAxis("Horizontal");
　　　　 
        //回転
        if (horizontal > 0)
            transform.Rotate(0, rotateSpeed * Time.fixedDeltaTime, 0);
        if (horizontal < 0)
            transform.Rotate(0, (-1) * rotateSpeed * Time.fixedDeltaTime, 0);

        //移動ベクトル
        moveVector = tr.forward * vertical * Time.fixedDeltaTime * speed; 
        //移動
        rb.velocity = new Vector3(moveVector.x, rb.velocity.y, moveVector.z);
    }
```

######5.カメラを追従させる
>メインカメラをキャラクターの子オブジェクトにする
※再生してカメラが３人称視点になっていれば成功
mindの研究 その23

#概要

mindが謎なので調べてみた。
vistaに入れた。
atcoder、やってみた。

#N枚のカードを交互に自身の得点が最大になるように取っていった場合の、二人の得点の差分を求める。


```

メインとは
　文字列１は　文字列
　合否は　変数
　数１は　変数
　数２は　変数
　数３は　変数
　Aは　変数
　Bは　変数
　Iは　変数
　Jは　変数
　Kは　変数
　Lは　変数
　Tは　変数
　配列１は　３０個の　変数
　数３に　９９を　入れ
　文字列入力し　文字列１に　入れ
　文字列１を　数値変換し　数１と　合否に　入れ
　数１を　回数指定し
　　Iに　回数を　入れ
　　文字列入力し　文字列１に　入れ
　　文字列１を　数値変換し　配列１（I）と　合否に　入れ
　繰り返し
　数１から　１を　加えて　数２に　入れ
　数１を　回数指定し
　　数１から　回数を　引いて　Kに　入れ
　　Kを　回数指定し
　　　数１から　回数を　引いて　Lに　入れ
　　　Lに　１を　加えて　Iに　入れ
　　　Lに　０を　加えて　Jに　入れ
　　　もし　配列１（I）より　配列１（J）が　小さい　ならば
　　　　Tに　配列１（J）を　入れ
　　　　配列１（J）に　配列１（I）を　入れ
　　　　配列１（I）に　Tを　入れ
　　　つぎに
　　繰り返し
　繰り返し
　Aに　０を　入れ
　Bに　０を　入れ
　数１を　回数指定し
　　もし　回数を　２で　割った余りが　０に　等しい　ならば
　　　Aに　配列１（回数）を　加えて　Aに　入れる
　　さもなければ
　　　Bに　配列１（回数）を　加えて　Bに　入れる
　　つぎに
　繰り返し
　もし　Aより　Bが　大きい　ならば
　　Bから　Aを　引いて　数３に　入れ
　さもなければ
　　Aから　Bを　引いて　数３に　入れ
　つぎに
　数３を　数値表示する

```

以上。
AWS 全リージョンの (ほぼ)全リソースをリストアップするシェルスクリプト


各リージョンの各サービスを個別に確認しなくても、全てのリソースをリストアップすることができます。

[AWSアカウント解約時](https://aws.amazon.com/jp/premiumsupport/knowledge-center/close-aws-account/?nc1=h_ls)に、不要なアクティブリソースが残っていないかの確認にも役立つかもしれません。

> AWS アカウントを解約したときに、アクティブなリソースがすべて自動的に終了されるとは限りません。アカウントを解約する前に、アクティブなリソースがあるかどうかを確認し、それらを終了することがベストプラクティスです。

　
# スクリプト
```shell:get-resources.sh
for region in `aws ec2 describe-regions --query 'Regions[].RegionName' --region us-west-1 --output text`
do
    echo "region = ${region}"
    aws resourcegroupstaggingapi get-resources --region ${region} --query 'ResourceTagMappingList[].ResourceARN';
done

echo "global"
echo "IAM"
aws iam list-users --query 'Users[].Arn'
aws iam list-roles --query 'Roles[].Arn'
echo "S3"
aws s3 ls
echo "finished"
```

 - describe-regionsでとってきた各regionに対してresourcegroupstaggingapi get-resources してます。
 - 最初にdescribe-regionsするのはどのリージョンに対してでもOKだと思うので、とりあえずus-west-1にしています。
 - IAMなどのグローバルリソースはresourcegroupstaggingapiではとれないので「iam list-users」と「iam list-roles」を個別に記述しました。

## 前提条件

 - [aws cli](https://aws.amazon.com/jp/cli/) が入っていること


# 利用イメージ

## 実行
```shell:
export AWS_PROFILE=xxxx # デフォルトプロファイルを常に設定しているなら不要
sh get-resources.sh 
```

プロファイルを指定する以外に、権限を持っているユーザーでマネコンにログインしてCloudShellから打つという使い方もできます。

## 出力
```shell:
region = eu-north-1
[]
region = ap-south-1
[]
region = eu-west-3
[]
region = eu-west-2
[]
region = eu-west-1
[]
region = ap-northeast-2
[]
region = ap-northeast-1
[
    "arn:aws:apigateway:ap-northeast-1::/restapis/〜/stages/devA",
    "arn:aws:apigateway:ap-northeast-1::/restapis/〜/stages/devB",
〜
    "arn:aws:ec2:ap-northeast-1:111111111111:vpc/vpc-1111111a",
    "arn:aws:ec2:ap-northeast-1:111111111111:vpc/vpc-1111111b",
〜
    "arn:aws:lambda:ap-northeast-1:111111111111:function:xxxx-checker",
    "arn:aws:lambda:ap-northeast-1:111111111111:function:xxxx-deleter",
〜
global
IAM
[
    "arn:aws:iam::111111111111:user/xxxxxxx"
]
[
    "arn:aws:iam::111111111111:role/xxxxxx/yyyyy",
    "arn:aws:iam::111111111111:role/xxxxxx/zzzzz",
〜
]
finished
...
```

# 留意点

resourcegroupstaggingapiが対応していないサービスがもしあれば、それはリストアップされてこない。
このため補助的に利用ください。

# 参考
## ec2/describe-regions
https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-regions.html
リージョンのリストアップで利用

## resourcegroupstaggingapi/get-resources
https://docs.aws.amazon.com/cli/latest/reference/resourcegroupstaggingapi/get-resources.html
リソースのリストアップで利用
Resource Hints を知る


## Resource Hintsとは？

まずResource Hintsってなんですか。
[Resource Hints | W3C](https://www.w3.org/TR/resource-hints/) を見ると、

> This specification defines the dns-prefetch, preconnect, prefetch, and prerender relationships of the HTML Link Element (<link>). These primitives enable the developer, and the server generating or delivering the resources, to assist the user agent in the decision process of which origins it should connect to, and which resources it should fetch and preprocess to improve page performance.
> 
> （DeepLの日本語訳）
> この仕様では、HTMLリンク要素(\<link\>)のdns-prefetch、preconnect、prefetch、prinerの関係を定義します。これらのプリミティブは、開発者と、リソースを生成または配信するサーバが、どのオリジンに接続すべきか、どのリソースをフェッチしてページのパフォーマンスを向上させるために前処理すべきかの決定プロセスにおいて、ユーザエージェントを支援することを可能にします。

つまりは、
**Webページでこれから必要になるリソースを、ブラウザに事前に教えてあげる**
ものです。
ブラウザはそのヒントから、次に発生するリクエストに対して準備をします。

もっと簡単に言うと、**これから使うリソースを事前に読み込む**ものです。

## ブラウザのリソース取得までのフロー

Resource Hintsを使う前に、リソースをリクエストしてから評価するまでの一連の流れを知っておく必要があります。

ブラウザがリソースを取得する際、以下のようなフローで取得しています。

1. DNSルックアップ
    - URLからホスト名を解決し、IPアドレスを取得する
2. TCP接続
    - 指定されたURLに対して、コネクションを張る
3. リソースの取得
    - リソースのダウンロードを行う
4. リソースの評価
    - HTMLやJavaScript, CSSのパースを行う

この4つのプロセスそれぞれに対して、Resource Hintsで事前に準備をすることができます。

## Resource Hintsを使う

Resource Hintsは以下のような`link`タグを仕込んでおくことで、使うことができます。

### DNS Prefetch

`DNS Prefetch`は、「ブラウザのリソース取得までのフロー」の**DNSルックアップ**まで事前に行います。

```html:dns-prefetch
<link rel="dns-prefetch" href="https://example.com">
```

### Preconnect

`Preconnect`は、「ブラウザのリソース取得までのフロー」の**TCP接続**まで事前に行います。

```html:preconnect
<link rel="preconnect" href="https://example.com">
```

### Prefetch

`Prefetch`は、「ブラウザのリソース取得までのフロー」の**リソースの取得**まで事前に行います。

```html:prefetch
<link rel="prefetch" href="main.js" as="script">
<link rel="prefetch" href="image.png" as="image">
```

`as`属性は必須ではないですが、指定しておくことで、ブラウザがリソースの解析をするのを手助けすることができます。
他に、`media`, `style`, `font`, `document`などあります。

### Prerender

`Prerender`は、「ブラウザのリソース取得までのフロー」の**リソースの評価**まで事前に行います。

```html:Prerender
<link rel="prerender" href="https://example.com/next_page.html">
```

バックグラウンドで、指定したページのレンダリングを行うため、ページ遷移後のレンダリングがとても速くなります。
ただし、指定できるページは1つのみであるため、遷移確率の低いページを指定してしまうと、ユーザーに無駄なレンダリングをさせてしまう恐れがあります。

# 実際に使うならこんなふうに使うのかな？

実際に使う場合、多くのユーザーが遷移するだろうというリソースがある場合以外は、**動的に事前読み込みをする対象を決める**ことになると思います。

Resource Hintsの`link`タグは、動的に追加や削除を行っても良いため、

```js:動的にlinkを追加するサンプル.js
const hint = document.createElement("link");
hint.rel = "prefetch";
hint.as = "document";
hint.href = "/article/part3.html";
document.head.appendChild(hint);
```

のように書くことができます。
これをクリックやホバー、スクロールなどのイベントで実行することで、適切なリソースの事前読み込みができるのではないか？と思っています。

## 最後に

Resource Hintsはサイトの改善にとても強力なものだと思います。
ただ、「なんでもかんでも事前読み込みしちゃえ」のように使うと、ユーザーのネットワーク帯域やCPUなどを占領してしまう恐れがあるので、適切に使っていく必要があるものです。
また、SafariやFirefoxでは一部使うことでできないため、Can I useを確認しておくべきです。

https://caniuse.com/?search=resource%20hints


もし、記事に間違いなどありましたら、教えていただけると勉強になります！

## リンク

https://www.w3.org/TR/resource-hints/

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link

https://caniuse.com/?search=resource%20hints

https://laboradian.com/browser-process-rendering-page/
AndroidエミュレーターでVagrantで設定したドメインにアクセス

##前提
開発環境： Mac OS, Vagrant

スマホ向けサイトを、Android Studioのエミュレーター上で確認したいが、エミュレーターと開発PCのhostsファイルが共有されていないので、ネームサーバーが機能しない。エミュレーター内のhostsファイルを直接書き換える必要がある。

また、開発環境はVagrantで作られており、Vagrantfileの設定は以下。

```
config.vm.network "private_network", ip: "192.168.11.22"
config.vm.hostname = "hogehoge.local"
```

---

##手順
##① Android Studioでエミュレーターをつくる
API Level： <b>28</b>
Target： <b>Android9.0 (Google APIs)</b>

API Levelが新しいとhostsの書き換えができなかったり、
Targetが<b>Android9.0 (Google Play)</b>だと`$adb root`が使えなかったりするので注意。


##② エミュレーターの名前を確認

```
$ emulator -list-avds
Pixel_2_API_28
```

##③ 書き込み可能モードでエミュレーターを起動
起動はGUIでなくターミナルから行う。

```
$ emulator -avd Pixel_2_API_28 -writable-system
```

ターミネルが占有されるので別タブを開く。


##⑤ hostsファイルの書き換え
hostsファイルは、エミュレーター内の `/system/etc/hosts` にあるので、これを書き換える。
※最初にrootになって、remountするのが必須。

```
$ adb root
$ adb remount
$ adb shell "echo 192.168.11.22 hogehoge.local >> /system/etc/hosts"
```

##⑥ 確認

catでhostsファイルの中を確認

```
$ adb shell cat /system/etc/hosts
127.0.0.1       localhost
::1             ip6-localhost
192.168.11.22 hogehoge.local
```

これで、エミュレーター内のChromeから、`http://hogehoge.local` にアクセスして、ローカルのサイトが表示されれば成功。


--- 

##上記⑤の違う方法

hostsファイルを一度取り出して、手元で編集してから、エミュレーターに戻す方法もある。

###⑤-1' 起動中のエミュレーター名を確認
最初に確認した名前と違うので注意

```
$ adb devices
List of devices attached
emulator-5554	device
```

###⑤-2' hostsファイルの取り出し
PCの`~/Desktop/`に保存

```
$ adb -s emulator-5554 pull /system/etc/hosts ~/Desktop/
```

取り出したら、hostsファイルをPC上で編集。

###⑤-3' 編集したhostsファイルを戻す 

```
$ adb root
$ adb remount
$ adb -s emulator-5554 push ~/Desktop/hosts /system/etc/hosts
```

---

##参考にしたサイト
[[Android] Android Virtual Device の /etc/hosts を書き換えて、Vagrant Virtual Machine へ接続する]
(https://www.d-wood.com/blog/2018/05/08_9520.html)
Qiita開発チームがReactの開発で default export を使わなくなった理由

## はじめに
こんにちは、Qiita開発チームの@ohakutsuです。

現在、QiitaのフロントエンドはReact + Atomic Designで実装されています。
Atomic Designの特徴として、再利用可能な単位で分割されたコンポーネントをつくる必要があります。
しかし、分割されたコンポーネントの数は日々大きくなっていってしまい、コンポーネントの管理が難しくなってしまいます。
そこで、Qiita開発チームでは、`default export`を使い実装をしていたのをやめ、`named export`を使い実装を行うようになりました。
今回は、Qiita開発チームがなぜ`default export`を使わなくなったのかについてお話します。

## なぜ default export を使わなくなったのか

Qiita開発チームが`default export`を使わなくなった理由は、default exportだと**importする側で自由に名前を決められてしまう**ためです。

### default exportを使った場合

```jsx:.jsx
export default () => {
  ...
}
```

```jsx:index.jsx
import Button from './Button'
// ↑↓自由に名前をつけることができてしまう
import SubmitButton from './SubmitButton'

...
```

このように、default exportにしてしまうと、import側で自由に名前をつけることができてしまい、コンポーネント名が統一されなくなってしまいます。

また、例に出した`SubmitButton`を抽象化し、`Button`にした場合、ファイルパスはVSCodeなどで自動的に修正をしてくれますが、`SubmitButton`→`Button`にはなりません。ここで、実際の実装と定義名が異なってしまいます。また、それだけではなく、異なっていたとしても動いてしまうため、発見が難しくなるといったこともあります。

### named exportを使った場合

```jsx:SubmitButton.jsx
export const SubmitButton = () => {
  ...
}
```

```jsx:index.jsx
import { SubmitButton } from './SubmitButton'

...
```

named exportの場合、importする側ではexport側で定義された名前をそのまま使うことになります。
また、以下のようにコンポーネント名を変更した場合、

```jsx:Button.jsx
export const Button = () => {
  ...
}
```

`Submitbutton`をインポートしている側でエラーが起きます。

```jsx:index.jsx
import { SubmitButton } from './Button' // ←エラーになる

...
```

エラーが起きるため、インポート側でのコンポーネント名の変更忘れに気づくことができます。

冒頭でもお話しましたが、Atomic Designでは、部品ごとにパーツを作り、さらに組み立てたコンポーネントをつくっていくため、どうしてもコンポーネントの数が多くなってしまいます。そこで`default export`を使うと、コードを書く人によってコンポーネント名が変わる可能性があり、コンポーネントの管理が難しくなるといった問題が考えられます。
そのため、`named export`でインポートするコンポーネント名に制限をし、コンポーネントの管理をしやすくしたというのも1つの理由です。

## named exportにしたときの問題点
### `React.lazy`はdefault exportでないと使えない

[Code-Splitting – React](https://reactjs.org/docs/code-splitting.html) によると、`React.lazy`はnamed exportには対応しておらず、

```js:ManyComponents.js
export const MyComponent = /* ... */;
export const MyUnusedComponent = /* ... */;
```
```js:MyComponent.js
export { MyComponent as default } from "./ManyComponents.js";
```
```js:MyApp.js
import React, { lazy } from 'react';
const MyComponent = lazy(() => import("./MyComponent.js"));
```

のように、`named export` -> `default export`にするための中間コンポーネントが必要になります。
`React.lazy`を使う必要のあるコンポーネントの場合は、例外としてディレクトリを分けるなどして、`default export`で実装するのもアリだと思います。

## さいごに

Qiita開発チームでAtomic Designを行う際に、`default export`を使わなくなった理由について書いてきました。
僕はまだQiita開発チームに来て4ヶ月程度しかたっておらず、まだまだ力不足ですが、これからもQiitaをよりよいものにしていくために、開発・改善を行っていきます。

また、Qiitaの質問に`default export` / `named export`についての意見交換を投稿しているので、ぜひ、ご意見をお聞かせください。

https://qiita.com/ohakutsu/questions/d0a7c1c91be2540bb381
[Rust] Cの静的ライブラリをリンクしたRust製動的ライブラリのSymbolのVisibility

# TL; DR

```rust
#[link(name = "example_c")]
extern {
    pub fn some_c_func(); // pubによってsome_c_funcはGLOBALになる
}
```
と，陽にpub付のexternをしてC側の関数のVisibilityを設定するとGLOBALになる．
上の記述がないとLOCALになる．

# やりたいこと
Cのコードを含むRustの動的ライブラリでC側のSymbolにアクセスできるようにしたいとします．

例えば， Cのコードから`libexample_c.a` （静的ライブラリ）を生成し，Rustでそれをリンクした`libexample.so`を作ります．
この時，元となるCのコードに`libexample.so`の利用者がアクセスするためには`libexample.so`で元のCのコードに記述されたsymbolがGLOBALになっていないといけません．

例えば以下のリンクのように，PostgreSQLのFDWをRustで書いてみる，なんて際にこう言うケースに出会うかもしれません．
https://github.com/durch/google-bigtable-postgres-fdw

# toy model

```C:example.c
int add_c(int a, int b) {
    return a+b;
}
```

```rust:lib.rs
#[no_mangle]
pub unsafe extern "C" fn add_rs(a: i32, b: i32) -> i32 {
    a+b
}
```

の両方を使える動的ライブラリ`libexample.so`を作ることを考えます．

Rustを含むのでcargoをうまく使ってbuildするのが良さそうです．
そこで，以下のようなCargo.tomlとビルドスクリプトを用意します．

```toml:Cargo.toml
[package]
name = "ffi_example"
version = "0.1.0"
authors = ["fujinochan"]
edition = "2018"
build = "build.rs"

[lib]
name = "example"
crate-type = ["dylib"]

[dependencies]

[build-dependencies]
cc = "*"
```

```rust:build.rs
extern crate cc;
use std::path::PathBuf;

fn main() {
    let path = PathBuf::from("src");

    cc::Build::new()
        .file(path.join("example.c"))
        .compile("libexample_c.a");
}
```

さあ，`cargo build`してみましょう．ビルドは通るはずです．

# symbol tableをみてみる
`libexample.so`のsymbol tableをみてみます．(target/debugにあると思います)

```
$ readelf -s libexample.so | grep add_c
955: 000000000004b2b5    24 FUNC    LOCAL  DEFAULT   12 add_c

$ readelf -s libexample.so | grep add_rs
1995: 000000000004b240    64 FUNC    GLOBAL DEFAULT   12 add_rs
1964: 000000000004b240    64 FUNC    GLOBAL DEFAULT   12 add_rs
```

C側の関数`add_c()`はLOCALになっています．では静的ライブラリのsymbolはどうでしょうか．
（`libexample_c.a`はtarget/debug/build/(package name)-xxxxxxx/out的なディレクトリにあります）

```
$ readelf -s libexample_c.a | grep add_c
16: 0000000000000000    24 FUNC    GLOBAL DEFAULT    4 add_c
```

ここではGLOBALです．

動的ライブラリにおいてLOCALなsymbolにはアクセスすることができません．Rustの関数`add_rs()`のみ利用したい場合にはむしろ変な使われ方をしない分良いのですが，Cの関数`add_c()`も公開したい場合はどうしたら良いでしょうか？

# 解決方法
冒頭に書いた通りです．陽にpubを付けたexternを書いてあげることで公開することができます．

```rust:lib.rs
#[no_mangle]
pub unsafe extern "C" fn add_rs(a: i32, b: i32) -> i32 {
    a+b
}

// ここから追加

#[link(name = "example_c")]
extern {
    pub fn add_c(a: i32, b: i32) -> i32;
}
```

確認してみましょう．

```
$ readelf -s libexample.so | grep add_c
2009: 000000000004b2b5    24 FUNC    GLOBAL DEFAULT   12 add_c
2011: 000000000004b2b5    24 FUNC    GLOBAL DEFAULT   12 add_c
```

今度はGLOBALになってます．これでライブラリとしてアクセスできます！
やったね！
Phalcon3.4をLaradockで環境構築

案件で使うのでお勉強のため構築。

LaravelやSymfonyと違って、理解しないとちょっと手こずるのでメモ残し。

今回インストールするのはPhalcon3.4

[公式のドキュメント](https://docs.phalcon.io/3.4/ja-jp/introduction)で日本語があるけど、中途半端なので個人的には英語がおすすめ。

## 環境構築の方法

やり方は色々あるので公式を参照したらいい。
今回はローカルを汚したくないなのでdockerで構築。

[公式Docker](https://hub.docker.com/r/mileschou/phalcon)もあったが、今回はサクッと試したかったので[Laradock](https://laradock.io/)を採用

ルートにlaradockをインストール

```
git clone https://github.com/laradock/laradock.git
```

運用の事を考慮するとサブモジュールにした方がいいかも。

```
git submodule add https://github.com/Laradock/laradock.git
```

Laradockのenvファイルをコピーする

```
cd laradock
cp env-example .env
```

### envファイルの以下項目を変更

ContainerにPhalconをインストールするかの設定

```
PHP_FPM_INSTALL_PHALCON=true
WORKSPACE_INSTALL_PHALCON=true
```

Phalconのバージョンを指定する

```
### Phalcon Version ###########################################
# Select a Phalcon version of the Workspace and PHP-FPM containers (Does not apply to HHVM). Accepted values: 3.4.0+
PHALCON_VERSION=3.4.5
```

MySqlのバージョンの指定
8でもいいかと思うが、動作確認が目的なので実運用を考慮して5.7に変更

```
### MYSQL #################################################

MYSQL_VERSION=5.7
```

### dockerコマンド

ここからはPhalconの雛形を作成する作業に入る。

workspaceのContainerを起動させる。

```
docker-compose up -d workspace
```

phalcon/devtoolsをインストールする。
これを使うとartisanコマンドやsymfonyCliコマンドのようにControllerやMigrationなど開発を便利にするためのコマンドが使えるようになる。


```
docker-compose exec --user=laradock workspace bash
composer require --dev phalcon/devtools:3.4.12

## Projectファイルを作成 appの部分は好きな名前でOK
phalcon create-project app
```
これでlaradockフォルダと並列でappフォルダが作成される。


```
## dockerを落とす
docker-compose down
```

envファイルのAPP_CODE_PATH_HOSTを変更する。

```.env
APP_CODE_PATH_HOST=../app
```

envを変更したら再度Containerを立ち上げる。
今度はmysqlやnginxも一緒に。

```
docker-compose up -d workspace nginx mysql
```

最後にphalcon-devtoolsを使っていけるようにProjectにインストールして終わり。

さっきインストールしたのは雛形ファイルを作るためにインストールしたけど、こっちは開発していく時にコマンドを使うためにインストールする。

```
laradock@355d8e7286c2:/var/www$ composer require --dev phalcon/devtools:3.4.12

```

Laradockに感謝！

### 参考
[LaradockでPhalconに入門する](https://qiita.com/halnique/items/c583507a7bf99a914bb2)