OmniAICreator/Qiita-1.07M huggingface dataset:
ダメな例：ElmでMsgの遷移だけを行いたいとき

書いてみたけど、よく考えたら、Msg遷移しなくても、そのMsgに遷移させるタイミングで該当Cmdを返してあげればいいことに気づいた。
以下で言えば、`WaitAllResponse`のlet式で次のCmdで送る`notifyGotAllResponse`を返してあげれば良い。
有効なパターンはないかも？
アンチパターン例として一応残しときます。

以下、もともと書こうとしていた内容。
-----------
()を返すTaskを作ってTask.performを呼び出す。

```elm
type Msg = GotAllResponse () -- Taskで何かしらの値を返す必要があるので()を受け取るようにしている

Task.perform GotAllResponse <| Task.succeed () -- これをupdateのCmd Msgの返り値にすればOK
```

あんまり使うパターンはないかもしれないが、
例えばCmd.batchで複数のCmdを投げて、**「成功失敗に関わらず全ての結果を取得し、その結果を使って」**次のCmdを実行する、とかに使える。
下記は複数のAPIリクエストを投げて、全てのAPIレスポンスを受け取ったあとにPortでJS側に結果を渡すイメージ例。
完全なコードではないのでイメージで。

```elm
port notifyGotAllResponse: List Response -> Cmd msg

type alias Response = { ... }

type Model = GotResponse (List Http.Error) (List Response)

type Msg
  = RequestAll
  | WaitAllResponse (Result Http.Error Response)
  | GotAllResponse ()

update msg model =
  case (msg, model) of
    (RequestAll, _) ->
       (GotResponse [] [], Cmd.batch [ ... ]) -- Cmd.batchのListにはHttp.requestや、Task.attempt WaitAllResponse <| Http.taskでCmd msgを返す

    (WaitAllResponse result, GotResponse errors responses) ->
       let
           cmd errors_ responses_ = if List.length errors_ + List.length responses_ == 4 -- 例えば4リクエスト投げていた場合
                 then Task.perform GotAllResponse <| Task.succeed () -- ここでnotifyGotAllResponseを返してしまえば良い
                 else Cmd.none
       in
       case result of
         Ok response ->
           let
              newRes = response :: responses
           in
           (GotResponse errors newRes, cmd errors newRes)

         Err e ->
           let
              newErr = e :: errors
           in
           (GotResponse newErr responses, cmd newErr response)

    (GotAllResponse _, _) ->
       (model, notifyGotAllResponse)
```

みたいな感じ。
Pycharmでpipがエラーになる（pipが古いってエラー）

#背景
Pycharmのvenv環境でyamlをインストールしようとしたらエラーになった。

#状況
PycharmのTerminalにて

```
pip install yaml
Collecting yaml
  Could not find a version that satisfies the requirement yaml (from versions: )
No matching distribution found for yaml
You are using pip version 10.0.1, however version 20.0.2 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
```

#解決まで
言われたとおりに

```
python -m pip install --upgrade pip
Requirement already up-to-date: pip in c:\pycharmprojects\autochronus\venv\lib\site-packages (20.0.2)
```
こうなる。

しかし

```
pip --version
pip 10.0.1 from c:\pycharmprojects\autochronus\venv\lib\site-packages\pip-10.0.1-py3.7.egg\pip (python 3.7)
```

#結論
```
pip xxx
```
とすると、10.0を見に行ってしまうが

```
python pip xxx
```
とすると、20.0の方を見に行ってくれた。
根本解決になっていないが

```
python pip install xxx
```
でやりたいことは出来た。
無料で使えるローコード/ノーコードツール(2020年3月現在)

# これは何？
- 無料で使えそうなローコード/ノーコードツールを調査したもの。
- 無料であっても、Webベースとなるものは、いつサービス内容が改訂されるか分からないため、対象としない。
 - 基本的にソースコードが手元に残り、独立した環境で稼働できるもの。

# Webデータベース

マイクロソフト社製Access、Cybozu社製Kintone(プラグインを利用しない状態)のようにデータの管理（データベース）を主たる目的とするもの。

## [Plesanter](https://pleasanter.org/)

- 製造元：株式会社インプリム
- 言語：C#(ASP.NET)
- ライセンス：AGPL v3
- ソースコード：公開されている
 - https://github.com/Implem/Implem.Pleasanter

## [Exment](https://exment.net/)

- 製造元：株式会社カジトリ​
- 言語：PHP
- ライセンス：GPL
- ソースコード：公開されている
 - https://github.com/exceedone/exment

# 本格派

Webデータベースの機能に加え、拡張性や業務ロジックの柔軟さなどを兼ね備えたもの。より高機能である反面、設定などが複雑になると感じる。

## [iPlass](https://iplass.org/)

- 製造元：株式会社電通国際情報サービス
- 言語：Java
- ライセンス：AGPL v3
- ソースコード：公開されている
 - https://github.com/ISID/iPLAss/

# 変わり種：アノテーションを指定するだけで画面生成（要開発環境）

## [OpenXava](https://www.openxava.org/)

- 言語：Java
- ライセンス：GPL
- ソースコード：ソースはライセンスを購入することで公開される。
MarshalJSONで任意の変数をJSON keyに使いたい

struct tagだけでは多分無理なので[json.Marshaler interface](https://golang.org/pkg/encoding/json/#Marshaler)を自前で実装してやる。

```main.go
package main

import (
	"encoding/json"
	"fmt"
)

type RootStruct struct {
	Values []valStruct
}

type valStruct struct {
	JsonKey string `json:"-"`
	Value   string `json:"value"`
	Error   string `json:"error"`
}

func (s RootStruct) MarshalJSON() ([]byte, error) {
	data := map[string]interface{}{}

	for _, val := range s.Values {
		// json keyはvalStruct側のJsonKeyを参照する
		data[val.JsonKey] = val
	}

	return json.Marshal(data)
}

func main() {
	s := RootStruct{}

	val1 := valStruct{
		JsonKey: "key1",
		Value:   "value1",
	}

	val2 := valStruct{
		JsonKey: "awesome_key",
		Value:   "value2",
	}

	val3 := valStruct{
		JsonKey: "error_value_key",
		Value:   "",
		Error:   "error message",
	}

	s.Values = append(s.Values, val1)
	s.Values = append(s.Values, val2)
	s.Values = append(s.Values, val3)

	data, _ := json.Marshal(s)
	fmt.Println(string(data))
}
```

## 実行結果

`valStruct` のJsonKeyが利用されてるのがわかる。

```json
{
  "awesome_key": {
    "value": "value2",
    "error": ""
  },
  "error_value_key": {
    "value": "",
    "error": "error message"
  },
  "key1": {
    "value": "value1",
    "error": ""
  }
}
```
AirflowでGCSにあるCSVデータをBigQueryのテーブルにロードする

[gcs.to_bq.GoogleCloudStorageToBigQueryOperator](https://airflow.apache.org/docs/1.10.6/_api/airflow/contrib/operators/gcs_to_bq/index.html)を使うと簡単。

```py
import airflow
from airflow import DAG
from airflow.contrib.operators import gcs_to_bq
from datetime import timedelta
import pendulum

default_args = {
    "owner": "airflow",
    "depends_on_past": False,
    "start_date": airflow.utils.dates.days_ago(1),
    "execution_timeout": timedelta(minutes=30),
    "retries": 3,
    "retry_delay": timedelta(minutes=5)
}

dag = DAG(
    "test_dag",
    default_args=default_args,
    catchup=True,
    schedule_interval="0 0 * * *"
)

target_date = pendulum.now('Asia/Tokyo')

gcs_to_bq.GoogleCloudStorageToBigQueryOperator(
    task_id='test_task',
    bucket='your-bucket',
    destination_project_dataset_table='table_name${}'.format(
        target_date.strftime('%Y%m%d')
    ),
    source_objects=['some_dir/{}/*.gz'.format(target_date.to_date_string())],
    source_format='NEWLINE_DELIMITED_JSON',
    compression='GZIP',
    write_disposition='WRITE_TRUNCATE',
    dag=dag
)
```



# 参考
[How to Google Cloud Storage Operators]( https://airflow.apache.org/docs/1.10.6/howto/operator/gcp/gcs.html#howto-operator-googlecloudstoragetobigqueryoperato)
【Typescript】Union型のType Guardは分割代入するとうまく動かない件


TypescriptのType Guardはまあまあ優秀ですが、動かない時もある、というお話です。

## うまく動くコード

```typescript

interface StringValue {
  isString: true;
  value: string;
}

interface NumberValue {
  isString: false;
  value: number;
}

type ValueObject = StringValue | NumberValue;

function getString(obj: ValueObject): string {
  if (obj.isString) {
    return obj.value; // obj.valueの型はstring
  }
  return (obj.value + 10).toString(); // obj.valueの型はnumber
}
```

## うまく動かないコード

分割代入します

```typescript

interface StringValue {
  isString: true;
  value: string;
}

interface NumberValue {
  isString: false;
  value: number;
}

type ValueObject = StringValue | NumberValue;

function getString(obj: ValueObject): string {
  const { isString, value } = obj;

  if (isString) {
    return value; // obj.valueの型はstring | number
    // Type 'number' is not assignable to type 'string'.
  }
  return (value + 10).toString(); // obj.valueの型はstring | number
  // Operator '+' cannot be applied to types 'string | number' and 'number'.
}
```

分割代入は大変便利ですが、Union型を利用する場合は気をつけましょうということでした。

## なぜ？

[この件に関するIssue](https://github.com/microsoft/TypeScript/issues/10976) (3年以上前ですが)に詳細が有りました。これはバグではなく仕様です。

> once an object is destructed, the compiler can no longer make any assumptions about the relationships between the parts. Doing so requires data-flow analysis and alias tracking which is not trivial tasks.

> 一度オブジェクトが分割されると、コンパイラーはその分割された部分の関係についていかなる仮定もすることができなくなる。そのようにするには、データフローの分析とaliasの追跡が必要となり、それは簡単なタスクでは無い。

## (おまけ)ESLint Plugin Reactの[react/destructuring-assignment](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/destructuring-assignment.md)について

私が使っていたESLintの設定の一つで、Reactのpropsは利用前に必ず分割代入されなければならないというものでした。

```tsx
const Comp: React.FC<{value: string}> = ({
  value
}) => (
  <>
    {value}
  </>
);


const Comp1: React.FC<{ value: string }> = ({ value }) => <>{value}</>; // OK
const Comp2: React.FC<{ value: string }> = props => <>{props.value}</>; 
// Must use destructuring props assignment
```

普段使う分にはこのルールは問題無いのですが、propsの型がUnion型の時に上記のような問題が発生する場合があります。したがって、個人的にはOFFにすることをお勧めします。(plugin:react/recommendedを利用している方は含まれていないので心配無用です）
Laravel5でマイグレーション実行時に読み込む.envファイルを切り替える

## はじめに
Laravel5ではマイグレーション実行時にも読み込む.envファイルを切り替えることができますが、バージョンによって方法が異なります。
5.3以降の方法についての説明はいくつかありますが、5.2以前の方法があまりなかったので、以下に記載します。

## 前提
環境ごとに各.envファイルが作成されているものとします。

| 環境 | ファイル |
|---|---|
| 開発環境 | .env.dev |
| ステージ環境 | .env.stg |
| 本番環境 | .env.prod |

## 5.3以降の場合
```bash:開発環境
$ php artisan migrate --env=dev
```
```bash:ステージ環境
$ php artisan migrate --env=stg
```
```bash:本番環境
$ php artisan migrate --env=prod
```

## 5.2以前の場合
```bash:開発環境
$ export APP_ENV=dev
$ php artisan migrate
```
```bash:ステージ環境
$ export APP_ENV=stg
$ php artisan migrate
```
```bash:本番環境
$ export APP_ENV=prod
$ php artisan migrate
```

## 解説
5.2以前でもマイグレーション実行時のオプションを確認する下記コマンドを実行すると、--envオプションが使えるように見えます。

```bash
$ php artisan migrate --help
Usage:
  migrate [options]

Options:
# 中略
      --env[=ENV]            The environment the command should run under.
```

しかし、下記のIssueにあるような不具合があるため、実行しても意図したenvファイルを読み込みません（エラーにもなりません）。
https://github.com/laravel/framework/issues/14941

これは下記のPRで修正され、バージョン5.3に適用されました。
https://github.com/laravel/framework/pull/15629

そのため、5.2以前と5.3以降で実行コマンドに差異が生じます。

## まとめ
- Laravel5のマイグレーション実行コマンドはバージョンによって異なる。
- 使用できないオプションをヘルプに書いてはいけない。

## 参考
- [Laravel5 で別環境（APP_ENV）で artisan コマンドを実行](https://qiita.com/okashoi/items/92bc1b244e8efca8e67a)
CSVファイル内の特定列をsha256に変換する

### CSVの1列目をsha256ハッシュ値に変更する。

sample.csv

```
カラム1,カラム2,カラム3,カラム4
c4c2OCNF4F,aaaaa,bbbbb,ccccc
6CkAXkGmmu,aaaaa,bbbbb,ccccc
ugrjoJYbgz,aaaaa,bbbbb,ccccc
KO6U5DJwYB,aaaaa,bbbbb,ccccc
```

```sh
sha.sh

#!/bin/bash

if [ !-e $1 ]; then
    echo "$1 No such file."
    exit 1
fi

while COUNT=0 read line
do 
  # カウント
  COUNT=$(( COUNT + 1 ))
  # 切り出し
  COL1=$(echo $line| cut -d , -f 1)
  COL2_4=$(echo $line| cut -d , -f 2-4)
  # ハッシュ値生成
  SHA=$(echo -n $COL1 |openssl dgst -sha256)
  if [ $COUNT -gt 1 ];then 
    echo "$SHA","$COL2_4";
  # 1行目スキップ
  else 
    echo "$line";
  fi
done < $1
```
### 実行

```
bash sha.sh sample.csv
```

### 結果

```
カラム1,カラム2,カラム3,カラム4
b06ed88dcce303122ca92beb2af20c72aa3f34db64b20c94a70e6ecaeb7bf90e,aaaaa,bbbbb,ccccc
72a9253b280211fc1c1e62964797852b8d76cb7ecebf946ef82d4861a6866587,aaaaa,bbbbb,ccccc
d5a259a890b0dcf76ca8051914c2694c1db1fbbfdb983fd8fe547d4c58dfe3c6,aaaaa,bbbbb,ccccc
bcaaafae78828d81c2929f00d3dc8a02af2ca2c02abd9e5680fde64388f17e48,aaaaa,bbbbb,ccccc
```
FirestoreにCSVをインポートする

基本的に以下の手順に従う。

https://orangelog.site/firebase/firestore-csv-import/

Google公式のインポート・エクスポートの方法だと、エクスポートしたファイルを編集できないようで、自分で作成したExcelデータ（CSVデータ）をFirebaseに突っ込みたい時なんかには使えないようだった。

また上記だとプランをSparkからBlazeに変更しないといけないが、この方法ならたぶん変更しなくてもOK（ちなみに変更する必要があっても、インポートが終わったらSparkプランにすぐ戻せる）。

注意点としてはサービスアカウントのjsonデータは`新しい秘密鍵の生成`というボタンを押してダウンロードする形に変わっていたことと、それをローカルにダウンロードしたさいに`serviceAccount`のパスをちゃんとそのファイル名や位置に合わせて変更するくらい。

```js

var serviceAccount = require("path/to/serviceAccountKey.json");
↓
var serviceAccount = require("./[プロジェクトID]-firebase-adminsdk-[英数字]");
```
Memory不足でElasticSearchのDockerコンテナ立ち上げが「exited with code 137」で終了したときの対応方法

DockerでElasticSearchのコンテナを起動しようとしたら起動できなくて、「exited with code 137」というエラー文を吐いてて原因を調べてたら時間取られたのでメモ。

## DockerでElasticSearchのコンテナを起動しようとしてエラー

```terminal
$ docker-compose up <container名>
...
<container名> exited with code 137
```

## 原因

メモリの上限値が少ないからOut Of Memoryエラーになっているよう。
Dockerの初期設定のメモリは2GBになっているけど、ElasticSearchのコンテナはそれ以上にメモリ使うのかな。

cf. https://github.com/10up/wp-local-docker/issues/6

## 対応方法

Dockerのメモリ設定の上限値を上げる。2GBから8GBに上げたら起動できた。
（4GBでも起動できた）

<img width="1247" alt="Screen Shot 2020-03-24 at 17.10.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253272/47b2ec57-26ca-f6d9-529b-f26efb1ebc87.png">
Vue.jsでjszipとfilesaver.jsを使ってzipフォルダを作成し、ダウンロードしてみる。

#初めに
今回はjavascriptのライブラリの一つ、[jszip](https://stuk.github.io/jszip/)と[filesaver.js](https://github.com/eligrey/FileSaver.js/)というライブラリの記事を書こうと思います。
jszipというものはzipとして圧縮するためのライブラリで,filesaver.jsはファイルをダウンロードするためのライブラリです。
必要最低限(zipフォルダにファイルやフォルダ又はフォルダの中にファイルを入れる)のやり方を書きます。
##必要な技術、ライブラリ
- vue.cli(vue.js)
- jszip
- filesaver.js 
  
##やり方
必要最低限をやるために必要なメソッドは、**file()** **folder()** **generateAsync()** **saveAs()** の4つ。
**file()**の第一引数はファイル名(string型),第二引数は内容(string型,array型etc)です。
**folder()**の第一引数はファイル名(string型)。
**generateAsync()**はzipフォルダを作成するためのメソッドで、第一引数には作成するzipのタイプを指定します。
**saveAs()**はfilesaver.jsのメソッドです。第一引数にはダウンロードするzipフォルダ、第二引数はzip名。

```practice.vue
  <template>
    <div>
      <a v-on:click="make">ダウンロード</a>
    </div>
  </template>

  <script>
  import jszip from 'jszip'
  import saveAs from 'filesaver'
  export default{
    methods:{
       make(){
         let zip = new jszip(); //インスタンス作成
         zip.folder('icon').file('test.txt','hello world') //iconフォルダを作り、その中にtest.txtファイルを作っている。
         zip.file('practice.js','hello') // iconフォルダと同じ階層にjsファイルを作っている。
　
         zip.generateAsync({type:'blob'}) //blobタイプのzipを作成。
           .then(function(blob){ //zipデータを受け取る。
             saveAs(blob,"hello.zip") //第一引数は受け取ったzipデータ,第二引数はzipの名前(.zipは無くてもいい)
           })
       }
   }
</script>
```
これはjszipのページのexampleに載っているコードを少し書き直した物ですが、これだけでzipフォルダを作る事ができます。

#終わりに
また時間があったらjszipとfilesaver.jsを勉強して記事を書こうと思います。
コマンド(curl)でPushテストする方法（iOS）

## メモ書き

AuthKeyを利用して簡単にPushテストできるのが分かったのでメモしておきます。


## 事前作業

- deviceTokenはこんな感じで事前に取っておく。

```swift:AppDelegate.swift

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        var token: String = ""
        for i in 0..<deviceToken.count {
            token += String(format: "%02.2hhx", deviceToken[i] as CVarArg)
        }
        print("push token :\(token)")
    }
}
```


- AuthKey（デベロッパーページで作成）を取得

![スクリーンショット 2020-03-27 13.37.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32323/1527b8be-2462-92fb-972e-d0eb7b0729a0.png)

## スクリプト

```shell:push_test.sh
#!/bin/bash
deviceToken=dbfacf621430827771306fadb878304e9fd956f509527fc55bfd216915dxxx
authKey="./AuthKey_XXXX43J85J.p8"
authKeyId=XXXX43J85J
teamId=XXXX798F94

# distribution
# bundleId=jp.co.archive-asia.demo
# endpoint=https://api.push.apple.com

# development
bundleId=jp.co.archive-asia.demo
endpoint=https://api.development.push.apple.com

#テスト
 read -r -d '' payload <<-'EOF'
 {
    "aps": {
       "badge": 2,
       "category": "あああ",
       "alert": {
          "title": "タイトル",
          "subtitle": "サブタイトル",
          "body": "ホゲホゲ"
       }
    },
    "custom": {
       "mykey": "カスタムデータ"
    }
 }
 EOF

base64() {
   openssl base64 -e -A | tr -- '+/' '-_' | tr -d =
}
sign() {
   printf "$1"| openssl dgst -binary -sha256 -sign "$authKey" | base64
}
time=$(date +%s)
header=$(printf '{ "alg": "ES256", "kid": "%s" }' "$authKeyId" | base64)
claims=$(printf '{ "iss": "%s", "iat": %d }' "$teamId" "$time" | base64)
jwt="$header.$claims.$(sign $header.$claims)"
curl --verbose \
   --header "content-type: application/json" \
   --header "authorization: bearer $jwt" \
   --header "apns-topic: $bundleId" \
   --data "$payload" \
   $endpoint/3/device/$deviceToken

```

## 実行

スクリプト叩くだけ

```
/bin/bash push_test.sh
```
[outdated] GoogleColaboratoryでsympy(>=1.4)を使うときに数式をlatexで表示する方法

## outdated

GoogleColaboratory側がKaTeXを使うようになったため、下記の対応は不要となりました。

---

## 解決方法
```console
!pip install --upgrade sympy
```

```python
from sympy import *

def custom_latex_printer(expr, **options):
    from IPython.display import Math, HTML
    from google.colab.output._publish import javascript
    url = "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js?config=TeX-AMS_CHTML"
    javascript(content="""window.MathJax = {
        tex2jax: {
            inlineMath: [ ['$','$'] ],
            processEscapes: true
        }
        };""")
    javascript(url=url)
    return latex(expr, **options)
init_printing(use_latex="mathjax", latex_printer=custom_latex_printer)
```

## 解説

[Latex output from sympy does not correctly display in Google Colaboratory Jupyter notebooks - Stack Overflow](https://stackoverflow.com/questions/52010001/latex-output-from-sympy-does-not-correctly-display-in-google-colaboratory-jupyte)
などの、検索してよく出てくる方法は sympy1.4 以降では不十分です。

[Release Notes for 1.4 · sympy/sympy Wiki · GitHub](https://github.com/sympy/sympy/wiki/Release-Notes-for-1.4)
> * By default, LaTeX output in the Jupyter notebook is framed with \$\displaystyle ...\$. This prevents it from being centered in PDF output from nbconvert (see https://github.com/jupyter/notebook/issues/4060). (#15625 by @mgeier)

(LaTex出力のデフォルトがインライン数式モードになった。)
PowerShell の -Verbose と -Debug 引数

# 概要

PowerShellでスクリプトを作成すると、VerboseとDebug引数でスクリプトの動作が見えるようにすることが簡単にできるので、メモしておきます。
まず、PowerShellの引数に関してはわかりやすくまとまった記事があるので、参考してください。

- [引数の取り方備忘録](https://qiita.com/miyamiya/items/ffb81859771a6a847ea4)

# Verbose 引数

PowerShellの`-Verbose`スイッチ引数をつけて実行すると詳細出力ができるようになります。

### verbose-test.ps1

```powershell
[CmdletBinding()]
param()

Write-Verbose '詳細出力'
Write-Output '基本出力'
```

### 実行

```powershell
PS C:\PowerShell> .\verbose-test.ps1
基本出力

PS C:\PowerShell> .\verbose-test.ps1 -Verbose
詳細: 詳細出力
基本出力
```

# Debug 引数

PowerShellの`-Debug`スイッチ引数をつけて実行するとデバック出力と確認ができるようになります。

### debug-test.ps1

```powershell
[CmdletBinding()]
param()

Write-Output '基本出力'
Write-Debug 'デバック出力'
```

### 実行

```powershell
PS C:\PowerShell> .\debug-test.ps1
基本出力

PS C:\PowerShell> .\debug-test.ps1 -Debug
デバッグ: デバック出力

確認
この操作を続行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [H] コマンドの中止(H)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): y
基本出力
```

# VerboseとDebug 引数の組み合わせ

PowerShellの`-Verbose`と`-Debug`スイッチ引数をつけて実行すると詳細出力及びデバック出力と確認ができるようになります。

### verbose-debug-test.ps1

```powershell
[CmdletBinding()]
param()

Write-Verbose '詳細出力'
Write-Output '基本出力'
Write-Debug 'デバック出力'
```

### 実行

```powershell
PS C:\PowerShell> .\verbose-debug-test.ps1
基本出力

PS C:\PowerShell> .\verbose-debug-test.ps1 -Verbose
詳細: 詳細出力
基本出力

PS C:\PowerShell> .\verbose-debug-test.ps1 -Debug
デバッグ: デバック出力

確認
この操作を続行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [H] コマンドの中止(H)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): y
基本出力

PS C:\PowerShell> .\verbose-debug-test.ps1 -Verbose -Debug
詳細: 詳細出力
デバッグ: デバック出力

確認
この操作を続行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [H] コマンドの中止(H)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): y
基本出力
```

# 実装するには

上記のコード例で書いておきましたが、`CmdletBinding`一行を追加すれば使えるようになります。
PowerShellのコマンドレット(Cmdlet)は .NET Framework または .NET Core の C#言語で記述し、コンパイルされていますが、`CmdletBinding`を使うことによってコマンドレットのように機能させることができます。なので`-Verbose`と`Debug`以外に`-WhatIf`または`-Confirm`スイッチ引数も使うことができます。

### 例

```powershell
[cmdletbinding()]
Param(
    # パラメータ
)
# スクリプト
```
ROS MelodicでDynamixel Servoを動かす備忘録

# 概要
- 書く予定

# Ⅰ 使用するサーボの初期設定
- ここでは[Dynamixel Wizard](https://emanual.robotis.com/docs/en/software/rplus1/dynamixel_wizard/)を参考にサーボのIDと可動範囲を設定する。
- 下のように1つのサーボを初期設定した。
- CW(Clockwise Angle Limit)は最小値、CCW(Counter-Clockwise Angle Limit)は最大値を設定する。
- Baud Rateはすべてのサーボで同じにすること！

```
[AX-18A]
ID: 1
Baud Rate: 1 (1000000 bps)
CW Angle Limit: 200
CCW Angle Limit: 600
```

# Ⅱ GitHubからサーボのサンプルパッケージをダウンロード
- GitHubの[リポジトリ](https://github.com/tatsumicro5/Lumos-2.0-catkin_ws)
- 以下のコマンドでダウンロードし解凍
- 
```
$ cd catkin_ws/src
$ wget https://raw.githubusercontent.com/tatsumicro5/Lumos-2.0-catkin_ws/master/src/dynamixel_tutorials.zip
$ unzip dynamixel_tutorials.zip
$ rm dynamixel_tutorials.zip
```
- ```./basic.yaml```と```./dynamixel_controller.launch```を個人の設定に書き換える。
- ```./basic.yaml```にⅠで設定したサーボと初期位置を設定する。
- ```./dynamixel_controller.launch```にBaud RateとUSB Portを設定する。

# Ⅲ コマンドでの動かし方
- workspaceに移動し以下を実行

```
[Terminal #1]
$ cd catkin_ws
$ roslaunch dynamixel_tutorials dynamixel_controller.launch
```
- 別のターミナルを開き、```...dynamixel_command```まで入力しタブを押すと以下が出る。

```
[Terminal #2]
$ cd catkin_ws
$ rosservice call /dynamixel_workbench/dynamixel_command
"command: ''
id: 0
addr_name: ''
value: 0"
```
- ```id```は動かしたいサーボID、```addr_name```には設定したいパラメータ（GoalPositionで目標角度）、```value```でその値を設定する。

```
[Terminal #2]
$ cd catkin_ws
$ rosservice call /dynamixel_workbench/dynamixel_command
"command: ''
id: 1
addr_name: 'Goal_Position'
value: 400"
```

- 動いた！

# Ⅳ 次にpythonプログラムからserviceを送って制御する
- https://emanual.robotis.com/docs/en/dxl/ax/ax-12a/

# Ⅴ GitHubにローカルプロジェクトを送る方法
- [ローカルのプロジェクトをGitHubへアップロードする方法](https://qiita.com/devzip8/items/28ac253ea295ad6c2b73)
pythonでExcelを扱う

まあこれを見ればよいよ、というだけの話ではあるが。
https://note.nkmk.me/python-pandas-read-excel/

pandasだけではなくて、xlrdもインストールする必要があることに注意。

```sample.py
import sys
import pandas as pd 

# 読み込むXLSファイル
excel_file = sys.argv[1]
print('ファイル名⇒', sys.argv[1])


if __name__== '__main__':

	file = pd.ExcelFile(excel_file)

	# "parent"というシートを読み込む
	sheet_df = file.parse("parent")

	for j,series in sheet_df.iterrows():
		
		# 行ごとの処理
		parent_xxx(series)
```
HIDaspxライターの使い方


## HIDaspxライターとは

[瓶詰堂さん](https://www.binzume.net/library/avr_hidasp.html)が作成されたAVRライター

ドライバーが不要でMac/Winどちらで動作可能で、
回路図が公開されているため安価で自作できる

<img width="500" alt="HIDaspx.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45348/10c80e6a-c134-e7df-969f-694e80922104.png">


## ライター接続
AVR(ATmega328P)とHIDaspxライターをつなぐ

```PIN
	HIDasxp		ATmega328P
	1 Reset	---	1  Reset
	2 Vcc	---	7  Vcc
	3 GND	---	8  GND
	4 MISO	---	18 MISO
	5 MOSI	---	17 MOSI
	6 SCK	---	19 SCK 
```


## コマンド
###ターゲットのAVRデバイスの情報を読みとる
	
	$ hidspx -r

### fuse情報を読み出す
	
	$ hidspx -rf

### プログラムを読み出す	

	$ hidspx -rp

### プログラムを書き込む

	$ hidspx filename.hex

### プログラムを照合する。　

	& hidspx -v filename.hex

### fuseを書き換える

	$ hidspx -fL0xXX -fH0xXX -fx0xXX（XXは16進数）
	
	
ヒューズの設定に関してはArduino Fuse 一覧を参考に.
https://qiita.com/__S/items/c8b1ae7c7d83a94c27ba

### EEPROMを読み出す

	$ hidspx -re

### EEPROMに書き込

	$ hidspx filename.eep

### プログラムを消去する　

	$ hidspx -e

## Arduinoファームウェアの種類

Arduino Uno, ProMini, Duemilanoveとか
	
	ATmegaBOOT_168_atmega328.hex

Arduino Leonardo用

	Leonardo-prod-firmware-2012-04-26.hex



## 参考
https://www.binzume.net/library/avr_hidasp.html
http://hp.vector.co.jp/authors/VA000177/html/A3C8A3C9A3C4A3E1A3F3A3F0A3F8.html
http://psp.dip.jp/web/cgi-bin/note/index.cgi?%b7%c7%bc%a8%c8%c4
CoreOSのIgnitionをConfigDrive経由で渡す


#CoreOSのIgnitionをConfigDrive経由で渡す

CoreOSのIgnitionは、たいてい以下の方法で渡しているのではないかと想像しています。

- ISOの場合、起動後のUIで取得先のURLを渡す
- QCOW2の場合、カーネルパラメーターとして取得先のURLを渡す

QCOW2の場合、以下の方法でConfigDriveでも渡すことができました。あまり需要ないかもしれませんが、うまくいったので共有させていただきました。

##1. ConfigDrive用のISOを作る

user_dataにIgnitionを直接書き込んでおきます。
こんな感じです。

```
$ mkdir -p /tmp/new-drive/openstack/latest
$ cp user_data /tmp/new-drive/openstack/latest/user_data
$ mkisofs -R -V config-2 -o configdrive.iso /tmp/new-drive
$ rm -rf /tmp/new-drive
```

##2. ISOをマウントする

virtmanagerだとこんな感じでしょうか。
![200324-0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143277/20a1f192-f8ee-c226-a370-d7326469b175.png)

##3. QCOW2を起動する

CoreOS起動後、ISOの/openstack/latest/user_dataがIgnitionとして読み込まれます。

以上です〜。
【Laravel】テストDBとしてSQLiteを設定する

###config/database.php
config/database.phpにテスト用のDBとしてSQLiteを追加します。

```php:database.php
    'connections' => [

        'testing_sqlite' => [
            'driver' => 'sqlite',
            'database' => ':memory:',
            'prefix' => '',
        ],
    ],
```
`'database' => ':memory:'`ではインメモリの設定をしています。

###phpunit.xml
phpunit.xmlに`<server name="DB_CONNECTION" value="testing_sqlite"/>`を追加します。

```xml:phpunit.xml
                       (略)
    <php>
        <server name="APP_ENV" value="testing"/>
        <server name="DB_CONNECTION" value="testing_sqlite"/>
        <server name="BCRYPT_ROUNDS" value="4"/>
        <server name="CACHE_DRIVER" value="array"/>
        <server name="MAIL_DRIVER" value="array"/>
        <server name="QUEUE_CONNECTION" value="sync"/>
        <server name="SESSION_DRIVER" value="array"/>   
    </php>
</phpunit>
```
自分は5.8ですが、Laravelのバージョンによってはタグが`<server />`ではなく`<env />`となっている場合もあるようです。

###設定キャッシュをクリア
忘れないようにしましょう。

```shell
$ php artisan config:clear
```
これでテスト用のDBがSQLiteに設定されたと思います。
TA-Lib

[公式](https://ta-lib.org/)
[GitHub](https://github.com/mrjbq7/ta-lib)

```python:indicators.py
import talib

"""
単純移動平均(SMA: Simple Moving Average)
60日単純移動平均
timeperiod=60
"""
def SMA(price):
    sma = talib.SMA(price)
    return sma

"""加重移動平均(WMA: Weighted Moving Average)"""
def WMA(price):
    wma = talib.WMA(price)
    return wma

"""指数移動平均(EMA: Exponential Moving Average)"""
def EMA(price):
    ema = talib.EMA(price)
    return ema

"""2重指数移動平均(DEMA: Double Exponential Moving Average)"""
def DEMA(price):
    dema = talib.DEMA(price)
    return dema

"""3重指数移動平均(TEMA: Triple Exponential Moving Average)"""
def TEMA(price):
    tema = talib.T3(price)
    return tema

"""三角移動平均(TMA: Triangular Moving Average)"""
def TRIMA(price):
    trima = talib.TRIMA(price)
    return trima

"""Kaufmanの適応型移動平均(KAMA: Kaufman Adaptive Moving Average)"""
def KAMA(price):
    kama = talib.KAMA(price)
    return kama

"""MESAの適応型移動平均(MAMA: MESA Adaptive Moving Average)"""
def MAMA(price):
    mama, fama = talib.MAMA(price)
    return mama, fama

"""トレンドライン(Hilbert Transform - Instantaneous Trendline)"""
def TRENDLINE(price):
    trendline = talib.HT_TRENDLINE(price)
    return trendline

"""
ボリンジャー・バンド(Bollinger Bands)
15日ボリンジャー・バンド
timeperiod=15, nbdevup=2, nbdevdn=2, matype=0
"""
def BBANDS(price):
    upperband, middleband, lowerband = talib.BBANDS(price, timeperiod=20, nbdevup=2, nbdevdn=2, matype=0)
    return upperband, middleband, lowerband

"""MidPoint over period"""
def MIDPOINT(price):
    midpoint = talib.MIDPOINT(price)
    return midpoint

"""変化率(ROC: Rate of change Percentage)"""
def ROC(price):
    roc = talib.ROCP(price)
    return roc

"""モメンタム(Momentum)"""
def MOM(price):
    mom = talib.MOM(price)
    return mom

"""
RSI: Relative Strength Index
21日RSI
timeperiod=21
"""
def RSI(price):
    rsi = talib.RSI(price)
    return rsi

"""MACD: Moving Average Convergence/Divergence"""
def MACD(price):
    macd, signal, hist = talib.MACD(price)
    return macd, signal, hist

"""APO: Absolute Price Oscillator"""
def APO(price):
    apo = talib.APO(price)
    return apo

"""PPO: Percentage Price Oscillator"""
def PPO(price):
    ppo = talib.PPO(price)
    return ppo

"""CMO: Chande Momentum Oscillator"""
def CMO(price):
    cmo = talib.CMO(price)
    return cmo

"""ヒルベルト変換 - Dominant Cycle Period"""
def DCPERIOD(price):
    dcperiod = talib.HT_DCPERIOD(price)
    return dcperiod

"""ヒルベルト変換 - Dominant Cycle Phase"""
def DCPHASE(price):
    dcphase = talib.HT_DCPHASE(price)
    return dcphase

"""ヒルベルト変換 - Phasor Components"""
def PHASOR(price):
    inphase, quadrature = talib.HT_PHASOR(price)
    return inphase, quadrature

"""ヒルベルト変換 - SineWave"""
def SINE(price):
    sine, leadsine = talib.HT_SINE(price)
    return sine, leadsine

"""ヒルベルト変換 - Trend vs Cycle Mode"""
def TRENDMODE(price):
    trendmode = talib.HT_TRENDMODE(price)
    return trendmode
```
Mac PhpStorm をクリーン削除して初期状態に戻す

## 問題

日本語化したPhpStormを英語に戻せない問題が発生しました。
設定ファイルがどこかに残ってしまったのかなと思い綺麗にアンインストールしました。

## 手順

```
$ brew cask uninstall phpstorm
```

Homebrew で管理してない場合は普通にファイル削除

```
$ rm -rf /Applications/PhpStorm.app
```

PhpStormの設定ファイルを削除
macOSの場合は下記のディレクトリを削除すればokです。

```
$ rm -rf ~/Library/Application\ Support/PhpStorm*
$ rm -rf ~/Library/Preferences/PhpStorm*
$ rm -rf ~/Library/Caches/PhpStorm*
$ rm -rf ~/Library/Logs/PhpStorm*
```

PhpStorm を再インストールします。

```
$ brew cask install phpstorm
```

## 参考リンク

- https://pleiades.io/pages/pleiades_jetbrains_manual.html
- https://pleiades.io/help/webstorm/project-and-ide-settings.html
Optuna　チュートリアル

# Optunaの用語
- Trial
    - 目的関数の１回呼び出し
- Study
    - 試行回数
- Parameter
    - 最適化される変数

# よく使うメソッド

`study.best_params`
最適なパラメータを取得

`study.best_value`
もっともよい目的関数の値

# パラメータ
- Categorical parameter
    - SGD,Adam
- Int parameter
    - 1,3
- Uniform parameter
    - 1~3
- Discrete-uniform parameter
    - 0,0,0.2,0,4...0.8,1.0
 
# 注意
- 最適化はパラメータの数に対して指数関数的に増加する。

# RDBを用いる
- 最適化の保存と停止ができる。

# 分散最適化
```
$ optuna create-study --study-name "distributed-example" --storage "sqlite:///example.db"
[

import optuna

def objective(trial):
    x = trial.suggest_uniform('x', -10, 10)
    return (x - 2) ** 2

if __name__ == '__main__':
    study = optuna.load_study(study_name='distributed-example', storage='sqlite:///example.db')
    study.optimize(objective, n_trials=100)
```

# 改善する見込みのない試行を削除

# 参考
https://optuna.readthedocs.io/en/latest/tutorial/index.html
https://qiita.com/kenchin110100/items/ac3edb480d789481f134
【uGUI】 UI要素のサイズを別UI要素と一致させるスクリプト

# 背景
UI要素のサイズ(RectTransform.sizeDelta)を別UI要素に追従させ、見た目上で一致させたい

- 一致させる対象が直接の親の場合
    - Stretch指定でOK
- 一致させる対象が子かつ**子の数が1つ**の場合
    - 下記公式ドキュメントの実装で可能
    - https://docs.unity3d.com/ja/2018.4/Manual/HOWTO-UIFitContentSize.html
    - Horizontal/Vertical Layout Groupを使用する必要があり、自動で整列されるため子1つのみの制約あり
    - 構成が複雑でわかりづらい

上記の様なヒエラルキーや要素数に依存しないコンポーネントが欲しかったので自作しました
また、Inspector上でのサイズ変更を不可にしました

# UISizeFitter
```csharp
using UnityEngine;

[ExecuteInEditMode, RequireComponent(typeof(RectTransform))]
public class UISizeFitter : MonoBehaviour
{
    [SerializeField] RectTransform _target;

    RectTransform _selfRect;
    Vector3 _cachedTargetLossyScale;
    Vector2 _cachedTargetSizeDelta;
    Vector3 _cachedSelfLossyScale;
    bool _isDirty = true;

    void UpdateDirty()
    {
        if (_cachedTargetSizeDelta == _target.sizeDelta &&
            _cachedTargetLossyScale == _target.lossyScale &&
            _cachedSelfLossyScale == _selfRect.lossyScale)
        {
            return;
        }

        _cachedTargetSizeDelta = _target.sizeDelta;
        _cachedTargetLossyScale = _target.lossyScale;
        _cachedSelfLossyScale = _selfRect.lossyScale;

        _isDirty = true;
    }
    void AdjustSize()
    {
        if (!_isDirty)
        {
            return;
        }

        if (_selfRect.lossyScale.x != 0 && _selfRect.lossyScale.y != 0)
        {
            _selfRect.sizeDelta = _cachedTargetSizeDelta * _cachedTargetLossyScale / _selfRect.lossyScale;
        }
        _isDirty = false;
    }

    // Layout Groupみたいに「Some values driven by 〜」とInspector上の編集を禁止する
    void LockRectTransformProperty()
    {
        DrivenRectTransformTracker dt = new DrivenRectTransformTracker();
        dt.Clear();
        dt.Add(this, _selfRect, DrivenTransformProperties.SizeDelta | DrivenTransformProperties.Scale);
    }

    void FitSize()
    {
        if (_target == null)
        {
            return;
        }

        UpdateDirty();

        AdjustSize();
    }

    void Awake()
    {
        _selfRect = GetComponent<RectTransform>();
        _selfRect.transform.localScale = Vector2.one;

        LockRectTransformProperty();
    }

    void Start()
    {
        FitSize();
    }

    void Update()
    {
        FitSize();
    }
}
```

# 補足
常に追従させたかったのでUpdateで実行していますが、負荷的に問題になったり、動的に変更しないのであればStartの一度のみ実行するのが良いと思います
また、 `lossyScale` がUnity側でキャッシュしているのか毎回計算しているのかが不明だったため、とりあえずComponent側でキャッシュしていますがUnity側で毎回計算している様だと比較時の負荷が若干気になります
_cached〜でキャッシュしているのは比較の方がコピーより高速だろうという考えの下です
【AWS】Amazon WorkSpacesの作成

# はじめに
初回起動時は*高速セットアップ*で作成することも可能です。
以下で説明する方法は、通常のWorkSpaceの起動について説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/6d6befb5-76f2-d4ae-9fa2-cfbc9451f12d.png)

# 起動方法
上記の図の`WorkSpacesの起動`ボタンを押します。

## ディレクトリの選択
WorkSpaces を起動するディレクトリを選択します。ディレクトリには、ユーザーと WorkSpaces の両方が含まれます。]

ディレクトリには、既に作成してあるディレクトリが表示されるので、選択します。

設定項目の下記2点は`有効`にしておきます。

- セルフサービスアクセス許可の有効化
- Amazon WorkDocs の有効化

`次のステップ`をクリックします。

## ユーザーの特定
新規ユーザーを作成する場合は必要事項を記載し、`ユーザーの作成`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/7d1e4c76-b214-ba31-5b23-d16a131e8f97.png)

既存のユーザーから選択したい場合は、検索を実行し、追加したいユーザーを選択して、`選択項目を追加`を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/b3345f3e-bed1-c110-3c90-4e884dead5ed.png)

ユーザーの特定が完了したら、`次のステップ`を選択してください。

## バンドルの選択
起動したいバンドルを選択して、起動します。
目的がテストの場合は、*無料利用枠の対象*のマシンを選択すると、無料利用枠を利用できます。

## WorkSpacesの設定

### 実行モード
`AlwaysOn`と`Auto Stop`がありますが、今回は`Auto Stop`を利用します。

### 暗号化
今回はテストなので、暗号化は行いません。

### タグの管理
適宜タグを設定します。

## WorkSpaces のレビューと起動
表示されている内容を確認して、`WorkSpacesの起動`をクリックします。
起動には20分ほど時間がかかる可能性があります。
届いたメールの手順に沿ってアクセスしてください。
ApexでBlobからStringに変換しようとした時に起こったバグとその対処

# 概要

ある文字列を暗号化してURLにパラメーターとして付与し、別ページでURLのパラメーターを受け取り復号化したいという状況

この際に、BLOb(Binary Large Object)からStringに変換する際、エンコード方式に制限があるようで、
「BLOB is not a valid UTF-8 string」
というエラーが出た。
その時の対処について記載する。

## エラーの発生したソースコード

```java
    Blob key=Crypto.generateAesKey(128);
    String encodedKey=key.toString();
    system.debug(encodedKey);
    Blob data=Blob.valueOf('00000');
    Blob encryptedData=Crypto.encryptWithManagedIV('AES128', key, data);
    String encodedEncryptedData=EncodingUtil.base64Encode(encryptedData);
    system.debug(encodedEncryptedData);
    Blob decodedEncryptedData=EncodingUtil.base64Decode(encodedEncryptedData);
    Blob decrypted=Crypto.decryptWithManagedIV('AES128', key, decodedEncryptedData);
    String toStringData=decrypted.toString();
    system.debug(toStringData);
```

## 原因部分

```java
    String encodedKey=key.toString();
```

## 対処したソースコード

```java
    Blob key=Crypto.generateAesKey(128);
    String encodedKey=EncodingUtil.base64Encode(key);
    system.debug(encodedKey);
    Blob data=Blob.valueOf('00000');
    Blob encryptedData=Crypto.encryptWithManagedIV('AES128', key, data);
    String encodedEncryptedData=EncodingUtil.base64Encode(encryptedData);
    system.debug(encodedEncryptedData);
    Blob decodedEncryptedData=EncodingUtil.base64Decode(encodedEncryptedData);
    Blob decrypted=Crypto.decryptWithManagedIV('AES128', key, decodedEncryptedData);
    String toStringData=decrypted.toString();
    system.debug(toStringData);
```

## 原因の推測

個人的には、generateAesKeyで生成されるBlob内にtoStringで変換するutf-8の形式に対応していない文字列が含まれているから変換できないのかな？と考えております。
Crypto.decryptWithManagedIVでdecryptoしたBlobをStringに変換することはできているので、generateAesKeyで生成されたBlobがutf-8で対応できない文字列を含んでいるのでできていないと考えました。
このエラーの原因がわかる方、推測できる方いらっしゃいましたらコメントなどで教えていただけると嬉しいです。

## 参考文献

- [How to deal with 'BLOB is not a valid UTF-8 string' error](https://developer.salesforce.com/forums/?id=906F00000008mCnIAI)
- [Getting error of 'BLOB is not a valid UTF-8 string'.](https://www.forcetalks.com/salesforce-topic/getting-error-of-blob-is-not-a-valid-utf-8-string/)
- [セキュリティを考慮した、可逆的暗号化の相互運用の仕組みを実現する方法(Salesforce編)](https://web.plus-idea.net/2017/04/salesforce-security-crypto/)
react-native-tab-viewでJestをパスするモック作り


`react-native-tab-view`を使用したコンポーネントをjestでテストする際に以下のエラーが出て、沼ったのでメモを残します。
ちなみに、このライブラリを使用しているコンポーネントをimportするだけでjestではエラーが起こります。

```bash

 ● Test suite failed to run

    TypeError: Cannot read property 'Direction' of undefined

      at Object.<anonymous> (node_modules/react-native-gesture-handler/Directions.js:3:39)
      at Object.<anonymous> (node_modules/react-native-gesture-handler/GestureHandler.js:2:1)
```

このライブラリをラップしている`react-native-navigation`でTabViewを使用している場合にも発生すると思われます。

## 環境
ライブラリとバージョンは以下です。

```
    "react-native": "0.61.5",
    "react-native-gesture-handler": "^1.6.1",
    "react-native-reanimated": "^1.7.0",
    "react-native-tab-view": "^2.13.0",
    "@types/jest": "^25.1.4",
    "@types/react-native": "^0.61.23",
    "@types/react-test-renderer": "^16.9.2",
    "jest": "^24.9.0",
    "react-native-testing-library": "^1.13.0",
    "react-test-renderer": "16.9.0",
```

## 対応方法
以下のモックをテストに追加するだけでとりあえずエラーが起きなくなります。

```javascript

jest.mock('react-native-gesture-handler', () => {
  const {View} = require('react-native');
  return {
    GestureHandlerRootView: () => {
      return <View />;
    },
  };
});
jest.mock('react-native-reanimated', () => {
  const mocks = require('react-native-reanimated/mock');
  return {
    ...mocks,
    interpolate: true,
  };
});

```
各々モック化するときにundefined扱いになってしまうものがあり、
それらに適当にオブジェクトを設定してあげることで切り抜けることができました。


## 参考
- https://www.gitmemory.com/issue/kmagiera/react-native-reanimated/205/482113172
- https://github.com/software-mansion/react-native-reanimated/issues/355
BIOSでVT-xを有効化しているのに認識されない時にやったことリスト

BIOSでVT-xを有効化しているのに認識されない時にやったことリストです(Windows10 Pro)

VT-xが有効かどうかは[VirtualChecker](https://openlibsys.org/index-ja.html)で確認できます。

1. Hyper-Vの無効化
[アプリと機能]→[プログラムと機能]→[Windowsの機能の有効化または無効化]と進み、Hyper-V, Windowsハイパーバイザープラットフォーム, 仮想マシンプラットフォームのチェックを外して再起動

2. vEthenetの削除
ネットワークのプロパティを表示 or コマンドプロントからipconfigを打つとHyper-Vを削除したのにHyper-V Virtual Ethernet Adapter（既定のスイッチ）が残ることがある。該当ドライブを削除。

3. コア分離（メモリ整合性）をOFF
スタートメニューから「コア分離」で検索するとメモリ整合性のON/OFFを切り替えられる。ONの場合OFFにする
※メモリ整合性機能が仮想環境実行時に色々悪さをするらしく、私の環境(Win10Pro, Vagrant + VirtualBox)ではこれが原因でgzipが上手く機能しなくなったので基本OFFの方がいいかも・・・
AdobeXDでBitmap 9Slice

# NEWプラグイン　つくりました
レイヤー名にスライス情報をいれて、ボタン一発になりました
https://github.com/itouh2-i0plus/XdUnityUI/tree/develop/Documents/9SliceHelper

## 概要
ゲームでよくつかわれる、画像の9SliceをAdobeXDで(なんとか)できるようにしてみました。
手動での設定がまだ必要です。AdobeXD プラグインAPIで操作できるようになりましたら対応します。

### 参考
- Unityでの9Slice
    - https://docs.unity3d.com/ja/2018.4/Manual/9SliceSprites.html

## 仕組み

- プラグインでやっていること
    1. 元画像を9個コピー
    2. スライス領域にあわせたマスクの作成
    3. マスクグループを9個作成
- 手動で調整
    1. 「レスポンシブサイズ変更」パラメータの変更

## プラグインのインストール

1. https://github.com/itouh2-i0plus/XdUnityUI/releases
1. 最新バージョンの9SliceHelper.xdxをダウンロード
1. xdxファイルをダブルクリック、AdobeXDにインストール

## 実行方法

1. 9Slice可能な画像をAdobeXDにインポート
1. インポートした画像のレイヤー名に、上右下左、何ピクセルでスライスするか、パラメータを入力する
    - 例: 上20ピクセル、右30ピクセル、下10ピクセル、左40ピクセル
        - ```layer-name {image-slice: 20px 30px 10px 40px}```
    - 例: 上右下左、同じピクセル数
        - ```layer-name {image-slice: 100px}```
2. 画像を選択した状態で プラグインメニューより、9SliceHelper > Make 9Slice を実行
4. できたグループの「レスポンシブサイズ変更」パラメータを以下のように変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350704/54037def-c3ed-eb7e-257a-e1a49ee47a44.png)

## 関連
- XdUnityUI
    - 9Sliceしたレイヤーを、このツールでUnityにもっていけるようにしています
    - GitHub
        - https://github.com/itouh2-i0plus/XdUnityUI
    - Qiita
        - https://qiita.com/itouh2-i0plus/items/7eaf9a0a562a4573dc1c
- Adobe Forum
    - フォーラムでの9sliceへの要求
        - https://adobexd.uservoice.com/forums/353007-adobe-xd-feature-requests/suggestions/18521113-9-slice-scaling-of-bitmaps
        - AdobeXD上ビットマップでのデザインは、あまり力をいれないのかもしれないです

## 今後
AdobeXDをつかって、ゲームの制作が楽になることはどんどんやっていきたいと思っています
rails 新規アプリ作成

# はじめに
今まで学習した知識を使って、オリジナルアプリを作るカリキュラムの段階まできました。
自身のアウトプット、皆さんへの共有の目的で、これから個人アプリが完成するまでの流れを投稿していきます。

## Railsで新規アプリを作成する

ターミナルにて

```
$ rails _5.2.3_ new 〇〇　-d mysql
```
を、実行する。

railsのあとの『_5.2.3_』はrailsのバーション指定。
〇〇は作成したいアプリ名。
-dはデータベースの意味。
私の場合、データベースはmysqlを使用したかったので、-dで指定しました。

作成するアプリのディレクトリへ入り、ターミナルにて

```
rails db:create
```

を実行してデータベースを作る。

ここでひとまずアプリの大枠は完成です。
試しに

ターミナルにて

```
rails s
```
でサーバーを立ち上げ、localhost:3000へアクセスすると

![rails_welcome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560232/c1835e05-09af-d1f6-aef8-41623e0099c8.png)

こちらの画像が表示され、正常にアプリが作られていることがわかります。
Markdown でのアウトラインテキストの書き方

# 表示サンプル

# A
## A-1
### A-1-1
内容  
内容
### A-1-2
## A-2
## A-3

- # B
    ## B-1
    ### B-1-1
    内容  
    内容
    ### B-1-2
    ## B-2
    ## B-3

- # C
    - ## C-1
      内容  
      内容
        - ### C-1-1
          内容  
          内容
        - ### C-1-2
          内容  
          内容
    - ## C-2
    - ## C-3

# 表示内容説明
AはH1 H2 H3 などのタグが付属して構造的には分類可能だがインデント(字下げ)されない。
Bは1段階の箇条書きをつけた
Cは箇条書きと```#``` で対応してみた。

Cの書き方が望ましい様子。
Qiita では正常表示されないけど、VSCode だとキレイに字下げとH1などの段落タグがうまく動いているようだ。

Qiita はAしか見出しに表示されない。残念。


# コード

Markdown の字下げは4文字がよいらしい。
内容、のところを改行させるためには、行末半角スペースx2を配置すること。

```markdown
# A
## A-1
### A-1-1
内容  
内容
### A-1-2
## A-2
## A-3

- # B
    ## B-1
    ### B-1-1
    内容  
    内容
    ### B-1-2
    ## B-2
    ## B-3

- # C
    - ## C-1
      内容  
      内容
        - ### C-1-1
          内容  
          内容
        - ### C-1-2
          内容  
          内容
    - ## C-2
    - ## C-3
```

# 参考

【Markdown】改行するための書き方について徹底解説！ | 侍エンジニア塾ブログ（Samurai Blog） - プログラミング入門者向けサイト
https://www.sejuku.net/blog/77336
Swift：マルチディスプレイでもNSStatusBarButtonのアイコンの色を保つ

**メニューバーアプリ開発のTipsです．**

マルチディスプレイの状態でMacのメニューバーを眺めていると，非アクティブなディスプレイでは基本的にアイコンが色を失ってグレーアウトするのですが，たまにそのお約束を無視している子がいます．

![スクリーンショット 2020-03-24 15.07.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/48e39997-d5af-7793-d8df-3b43f9d16d51.png)

Siriのアイコンとか，LINEのアイコンとかです．

これがどうやってるのか気になって調べたり検証したところ，やり方そのものは簡単なのですが，情報が全然なかったので記しておきます．

## ポイント

- NSStatusBarButton.imageにアイコンを設定するだけだとグレーアウトする
- NSStatusBarButtonにNSViewをaddSubviewしてその中でdrawするとグレーアウトしない
- NSStatusBarButton.imageにアイコンを設定しないとボタンの大きさや位置が定まらない
- NSStatusItem.lengthで幅を設定することもできるけれどあまり賢い方法ではない

## 解決法

1. NSStatusBarButton.imageにアイコンサイズと同じサイズの透明なNSImageを設定する
2. 独自NSViewを用意して，アイコンNSImageとNSStatusBarButtonの大きさを渡す
3. NSStatusBarButtonに独自NSViewをaddSubViewしてマージンを計算して配置する

## サンプルソース

```swift:AppDelegate
import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
    var button: NSStatusBarButton!
    
    func applicationDidFinishLaunching(_ aNotification: Notification) {
        button = statusItem.button
        button.image = NSImage(size: NSSize(width: 18.0, height: 18.0))
        let icon = NSImage(imageLiteralResourceName: "SampleIcon")
        let iconView = IconView(icon, button.bounds.size)
        button.addSubview(iconView)
    }

    func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
        return true
    }

}
```

```swift:IconView
import Cocoa

class IconView: NSView {
    
    var icon: NSImage?
    
    init(_ icon: NSImage, _ size: CGSize) {
        super.init(frame: NSRect(x: 0.5 * (size.width - 18.0),
                                 y: 0.5 * (size.height - 18.0),
                                 width: 18.0, height: 18.0))
        self.icon = icon
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func draw(_ dirtyRect: NSRect) {
        icon?.draw(in: NSRect(x: 0.0, y: 0.0, width: 18.0, height: 18.0))
    }
    
}
```

## サンプルの結果

![スクリーンショット 2020-03-24 15.57.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/b5eade7b-63c8-b2a7-9b39-cd6f9abe3915.png)

ちゃんと非アクティブなディスプレイでも色を保っています．

ちなみに，メニューバーの高さ上限は22ポイントですが，22ポイントのアイコンだと窮屈なので，高さは18ポイントが良いです．横幅には制限がないです．（18ポイントということは，最近のMacはRetinaディスプレイなので綺麗に表示するなら２倍の36ピクセルが必要です．）

## 蛇足
NSStatusBarButton.titleに顔文字を指定しても色がついたままになります（色褪せますが）．
ローカル環境にintra-martを手抜きセットアップした際に一瞬だけハマった話

初めて投稿します。
ローカルPCにintra-martの環境を作ったときにうっかりハマったネタを書きます。

セットアップ時に参考にしたサイト
----

intra-martは[公式サイト][1]に詳細な内容が載っているのでかなり便利です。
[1]:https://www.intra-mart.jp/document/library/iap/public/setup/iap_setup_guide/texts/flowchart/index.html


基本的には書いてあるとおりに進めるだけでデプロイまで出来る
----
公式にしっかりと書いてあるので、慣れた人なら何も考えずにサクサクとミドルウェアをインストールできますし
ビルド、デプロイまでスムーズに出来ます。

でも本当に何も考えずに進めると…
----
「ローカルでサクッと使いたいだけだし」と思ってインストールが任意となっているApache CassandraとApache Solrのイントールを怠ると…

![20200324_cp1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263785/86cf3835-f457-2668-d215-a0d266841c13.jpeg)

セットアップ画面でCassandraやSolrの設定が出来ずに詰まることになります。

回避策
----
[ここ][2]と[ここ][3]に記載がある通り、im-jugglingでIMBoxとIM-ContentsSearchのチェックボックスを外します。
右クリック→「このモジュールを利用している機能をすべて非選択とします。」を選んで外しました。


[2]:https://www.intra-mart.jp/document/library/iap/public/setup/iap_setup_guide/texts/tenant/setup_to_tenant_cassandra.html

[3]:https://www.intra-mart.jp/document/library/iap/public/setup/iap_setup_guide/texts/tenant/setup_to_tenant_solr.html

![20200324_cp2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263785/7069e47b-78c5-a871-7e44-1c0689045691.png)

そして再びデプロイして、セットアップ画面を開くと…

![20200324_cp3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263785/b55d2faf-a1be-ff55-6b99-e7b35a371dd6.jpeg)

画面上からCassandraとSolrの設定画面が消えており、エラーが起きずにセットアップを開始することが出来ました！


簡単ですが、今回は以上です。
Animateで書き出したmovの半透過グラフィックが黒くなる問題の対策

# 問題発生
FLASHがAnimateへと名称を変え、寂しい思いをしている一方、機能も増え、AME（Adobe Media Encoder）との連携も強くなって使い勝手が良くなった。できることなら、動画作成でAnimateをもっと活用したい。

のだが！

そこでめちゃくちゃつまづいたのが「半透過状態のグラフィックが黒くなる」問題。

![理想と現実.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590293/aea9c93e-de84-440f-594e-885233616861.png)


上記の画像の通り、透過movの半透過部分（エフェクトの周囲や透明度が変化するアニメーション等）が黒くなってしまう。


# 解決策
解決できないのでAnimateでの動画書き出しは**諦める**。
代わりに、**AfterEffectsで書き出す**。

# 解説
Animateの動画書き出し設定を色々変えてみたり、AMEで書き出す際にどうにかできないかと色々やってみたけどダメ。
Google先生でも検索してみたけれど、行き着くのは**"AfterEffectsの場合"の透過部分黒くなる問題について対策している記事のみ**。

幸い、AfterEffectsはCC 2019バージョンから「**flaファイルの読み込み**」が可能になっているので、色々諦めて書き出しはAEで行う。

# 手順

1. flaデータをAEに読み込ませる。
<img width="434" alt="スクリーンショット 2020-03-24 12.23.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590293/9ae36d7e-a218-a24f-fdb9-fcdcc5d7131f.png">

「環境設定を読み込み」のウインドウが開くので、フォルダーを選択して「OK」

 <img width="1680" alt="スクリーンショット 2020-03-24 12.23.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590293/bfc46525-d912-3e03-e91d-28bb4886f70e.png">

読み込まれたデータのコンポジションを開くとこんな状態に。

2. 動画書き出し設定
<img width="1680" alt="スクリーンショット 2020-03-24 12.24.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590293/02d00d9e-644c-65c1-58d0-22bb5612e486.png">

ファイル>書き出し で「レンダーキューに追加」を選択。

<img width="842" alt="スクリーンショット 2020-03-24 12.24.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590293/a1879ca7-39a3-a8d9-da59-406fc3ef70b8.png">

<img width="606" alt="スクリーンショット 2020-03-24 12.26.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590293/14fbccec-7e83-5cd8-b60b-5ae519c4441c.png">

出力モジュールの設定を下記の内容に変更。

- **チャンネル：RGB＋アルファ**
- **カラー：ストレート（マットなし）**

これで書き出す。

この設定が（自分が試した限りでは）Animateで出来なかった・・・

書き出したmovを試しに重ねてみる。

<img width="843" alt="スクリーンショット 2020-03-24 12.29.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590293/df47273e-53aa-5ab7-832d-3f596a91384f.png">
<img width="1680" alt="スクリーンショット 2020-03-24 12.29.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590293/b48b0422-2c62-a9d7-cf91-0c6200b12720.png">

よし、バッチリ。

# あとがき
もっと良い対処方法（Animateでもマットなし状態で書き出せるよ！っていう情報）があれば教えてください。。。
deviseでログイン機能を実装したものの、データベースへ書き込めない問題

##起きた問題
deviseにてユーザーのログイン機能やユーザー編集機能などを実装したが、ユーザー編集機能のページedit.html.erbにて入力した内容がうまくデータベースに反映されない。

具体的にいうと**nameのカラムだけなぜかdbに反映されなかった**ので、調べてみた。

schema.rbを見てもちゃんとカラムが追加されている。。。

##解決した方法とソース

まず、解決した方法は簡単で、application_controller.rbに以下のコードを追加するだけ。

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    # 「登録時（sign_up）」に許可するパラメータを追加
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])

    # 「更新時（account_update）」に許可するパラメータを追加
    devise_parameter_sanitizer.permit(:account_update, keys: [:name])
  end
end

```

deviseではどうやら**デフォルトでemail、password以外は許可しない設定になっている**らしく、上記のようなコードを追加することで許可してあげないといけないようだった。

以下のURLはdeviseのGithub READMEから。

https://github.com/heartcombo/devise#strong-parameters