OmniAICreator/Qiita-1.07M huggingface dataset:
Scala と Play flamework 入門

## 対象読者

- 何かしらWebフレームワークで一通りアプリを作ったことがあるけど Scala, Playflamework が気になる人。
- コピペではなくドキュメントを遡って読んでバージョンの変化などに対応できる人
- ***Scalaをオワコンだと思っていない人***

## 環境

- Play flamework 2.7
- intellij IDEA
- sbt
- MySQL


上記の通りある程度基本的に知識はある人向けに、自分的にサクサク進む順序で進めていきます。

## プロジェクトの作成

brewからsbtをインストールします

```
$ brew install sbt
```

***intellij*** に`sbt`と`scala`のプラグインを追加します。
再度intellijを開き、 `create new project > (左)scala > (右)play` 
で 右下の `create` ポチで出来上がり。


## DBまわり

### ORM(Skinny)、DBの設定

ebeanよりSkinnyORMのほうがよさげなので後者を導入します。
ついでにしれっと MySQL の ***ドライバ*** も必要なので追加。

参照 :
 
- [Scala PlayFramework でアプリケーション作ってみた ③ 【モデル（Skinny-ORM）編】](http://bamboo-yujiro.hatenablog.com/entry/2017/09/17/201102)
- [skinny ORM](http://skinny-framework.org/documentation/orm.html)
- [Play Framework 2でMySQLを利用する](https://53ningen.com/play-framework-2-mysql/)

`conf/application.conf` と `build.sbt` に設定を追加します。

```conf/application.conf

db {
　default {
    driver="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:[port]/[dbname]"
    user="[username]"
    password="[password]"
    logSql=true
  }
}
```

```build.sbt
libraryDependencies ++= Seq( jdbc , ehcache , ws , specs2 % Test , guice ,
  "org.skinny-framework" % "skinny-orm" % "3.0.0",
  "mysql" % "mysql-connector-java" % "5.1.27",
  "ch.qos.logback" %  "logback-classic" % "1.1.+"
)
```

### migration
使い勝手がいいのがこいつ 

[flyway-play](https://github.com/flyway/flyway-play)

`./conf/db` 配下に sql を置いていけば勝手に　migration　してくれる。

```
playapp
├── app
│   ├── controllers
│   ├── models
│   └── views
├── conf
│   ├── application.conf
│   ├── db
│   │   └── migration
│   │       ├── development
│   │       │   ├── migration.sql
│   │       │   └── seed.sql
│   │       └── deploy
│   │           ├── migration.sql
│   │           └── dump.sql
│   ├── play.plugins
│   └── routes
```

## Authまわり　(ユーザー管理)

これ良さげなんだけど。
参照 : https://github.com/joscha/play-authenticate

### パスワードのハッシュ化

残念ながらScala向けのハッシュ化ライブラリがなかったので、(最近Springを触っている俺的に)安定している Spring Flamework の `BCyptPasswordEncoder` を使います。


## ルーティング
app/conf直下の `route` ファイルに書いていきます。
*ベタ書きで自由自在に定義できる神仕様。
これならクラスの構成を考えればアクションの所在が単純明快。*
***最高。***

```app/conf/routes.
# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~

# An example controller showing a sample home page
GET     /                           controllers.HomeController.index
# ログイン画面
GET     /login                      controllers.AuthController.loginPage
# ユーザー登録画面
GET     /signup                     controllers.AuthController.signUpPage

# ログインAPI
POST    /login                      controllers.AuthController.login
```

## アクション
`request => result` 型の関数 ***Action***を定義するとcontrollerの役割を果たします。

```echo.scala
class Echo @Inject()(cc: ControllerComponents) 
  extends AbstructController(cc)
{
  def echo = Action { request =>
    Ok("Got request [" + request + "]")
  }
}
```
ここで言う ***request*** は HTTPリクエスト、***result*** は HTTPレスポンスと捉えて勝手にスッキリしています。厳密には [こちら](https://www.playframework.com/documentation/2.6.x/ScalaActions)。


### requestの扱い (body parser)
参照：https://www.playframework.com/documentation/2.6.x/ScalaBodyParsers
大抵 API通信の場合` asFormUrlEncoded`を使ってリクエストの body を parse します。
ファイル名が強制的に大文字になるときの対処

# ファイル名が強制的に大文字になるときの対処

**[【ぜんぶポータブル】ポータル](https://qiita.com/jtFuruhata/items/f9788da8e480c646a2a9)**

**最終更新:2019年2月20日**

複数のOSで同一のポータブルデバイスを使っていると、Windowsでファイル名やフォルダ名を変更したときに、なぜか**強制的に全て大文字に変更されてしまってイラッ**とすることがあるんですよね。

だいぶ古い記事ですが症状の出る理由としては[こちら](#参考文献)。なってしまったら**コピーしてコピー先の名前を変更し、コピー元を削除**すればよいのですが、フォルダでファイル数が多いとえらい時間がかかります。

そんな訳で、「コマンド プロンプト」から`move`コマンドを叩いてあげるとディレクトリ属性だけを変更してくれるので**一瞬で**終わります。以下はファイル/フォルダ名が「OOMOJI」になってしまったものを「komoji」に変更するサンプルです。ちなみに`cd /d`は「**パスにドライブレターが含まれる場合はカレントドライブを変更**してcd」、です。コマンドプロンプトの起動は`Windowsキー+R`から`cmd`です。

```powershell:コマンドプロンプト
> cd /d D:\OrePortable   &rem パスはアドレスバーからコピペが吉　\は￥
> move OOMOJI komoji     &rem 「OOMOJI」を「komoji」に変更する
```

一度これで変更すれば、以降は普通にWindowsエクスプローラーから名前を変更しても大丈夫です。

## 参考文献
ITメディアエンタープライズ「小文字のファイル名が大文字に勝手に変換される」
https://www.itmedia.co.jp/help/tips/windows/w0490.html
2019年2月20日閲覧
AWSでEC2インスタンス作成してElasticIPを割り当てようとしたら怒られた話

Elastic IPを割り当てようとしたら怒られた。

<img width="972" alt="スクリーンショット 2019-02-20 15.25.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/218879/d3b5cb20-68b1-ec5b-09a0-23163ae17b76.png">

```
The maximum number of addresses has been reached.
```

調べたら**Amazon Elastic Compute Cloud Linux インスタンス用ユーザーガイド**の[Elastic IP アドレスの一番下](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)に対処法（問い合わせ）が記載されていました。

なんでも、デフォルトではリージョンあたり5つまでと制限されているそうで。

[Amazon EC2 Elastic IP アドレスリクエストフォーム](https://console.aws.amazon.com/support/cases#/create?issueType=service-limit-increase&limitType=service-code-elastic-ips)でリクエストを送ったら５分と経たずに返信が来てびっくり(*´∀｀)



| 項目 | 記載内容 |
| :--- | :--- |
| Create case | Service limit increase |
| Case classification | Elastic IPs |
| Requests | 上限を上げたいリージョンを選択<br>新たな上限を設定 |
| Case description | なぜ必要なのか簡単に説明 |
| Contact options | WEBを選択<br>連絡を受け取るメールアドレスを入力 |


反映されるまでに30分ほどかかる場合があるそうなので、コーヒーでも飲んで小休憩して待ちます。
JSFでコンボボックスを作る

JSFで画面を製造していてコンボボックスが必要になったのですが、JSFにはコンボボックスがない。
ということで力技で作ってもらったので、方法をメモ。

```ruby:xhtml
<h:inputText value="#{m.name}" maxlength="25" />
<datalist>
  <ui:repeat value="#{m.nameList}" var="item">
    <option value="#{item.getLabel()}" />
  </ui:repeat>
</datalist>
```
inputTextの直後にdatalistを設定します。
本当はここで要素にidとlistを追加できれば楽なのですが、できないのでjs側で無理矢理埋め込みます。

```ruby:js
$("datalist").each(function(i) {
  var keywords = "keywords" + i;
  $(this).attr("id", keywords);
  $(this).prev("input").attr("list", keywords);
});
```
ここで、datalistの要素にid、
inputTextの要素にlist（ここでは直前のinputに要素を追加するよう指定している）を追加しています。
keywordはただの名前なので、あまり気にしなくて大丈夫です。
inputTextとdatalistを紐付けるためのものらしい。jsはわたしも詳しくないのですが……。
Pythonでデータ操作をするための環境準備

Created by Kenneth Kim on Feb 20, 2019

データ操作の自動化を図るため、Pythonによるプログラミングをしようとする。
データベースはMySQL、編集はExcelを想定する。
MySQLインストール時にPythonのインストールが求められ、Pythonを入れるが、バージョンは3.7.*が必要になる。よって、下記のステップで、Python、MySQLをインストールする。また、Excel操作に必要なパッケージ(openpyxl)をインストールする。

#■ PC環境
- Window 10 (64bit)
- インターネット接続

#■ 手順
1. Pythonをインストールする
[https://www.python.org/downloads/windows/](https://www.python.org/downloads/windows/)
Python 3.7.2 - 2018-12-24
Download Windows x86 executable installer

2. 環境変数にPythonのパスを通しておく
Path
C:\Users\\{UserName}\AppData\Local\Programs\Python\Python37\

3. Pythonのインストール結果を確認する
\> python -V
> Python 3.7.2

4. MySQLをインストール
[https://dev.mysql.com/downloads/windows/installer/8.0.html]
(https://dev.mysql.com/downloads/windows/installer/8.0.html)
mysql-installer-community-8.0.15.0.msi

5. mysql-connector-pythonがインストールされたかを確認する
\> python -m pip list
> mysql-connector-python 8.0.15

6. ついでにpipをアップグレードする
\> python -m pip install --upgrade pip

7. PythonでExcelを操作するためのパッケージopenpyxlをインストールする
\> python -m pip install openpyxl

8. openpyxlのインストール結果を確認する
\>python -m pip list
>et-xmlfile             1.0.1
jdcal                  1.4
openpyxl               2.6.0

以上で環境の準備が完了した。
Ansibleでdocker使用可能ユーザーを一挙に作成する

# 概要

dockerをインストールした直後は、root以外のユーザーは`docker`コマンドを管理者権限`sudo`付きでないと使用できない。
これを構成管理ツールAnsibleによって、root以外のユーザーでも`sudo`なしで`docker`コマンドを実行できるよう自動設定する。


# 背景
docker上で色々動かすプロトタイプなマシンサーバーをAnsibleで構成管理したい。
ところが、単にdockerを入れただけでは、`docker`コマンドを実行時に面倒な事が起こる。
具体的には、`sudo`付きで`docker`コマンドを実行したり、rootユーザーになったりしなければならない。

そこで、Ansibleでこれも自動設定もしてしまいたいと考えた。


# 具体と解説

## 動作検証環境

* python version：2.7.15
* ansible-playbook：2.6.3
* ホストOS：CentOS 7.5.1804

## ディレクトリ構造

再利用できるよう、タスクはユーザー設定とdocker関係設定に分割してロール内に記述しました。

```
ansible/
　├ hosts/
　├ roles/
　│　├ docker/
　│　│　├ files/
　│　│　│　└ docker.repo
　│　│　└ tasks/
　│　│　 　└ main.yml
　│　└ user/
　│　 　└ tasks/
　│　　　　　└ main.yml
　└ site.yml
```

## 各ファイルの中身

dockerはyumでインストールすることとします。
また、ホストOSはCentOSを想定しています。
（掲題の件の部分に関しては、他の大半のLinux OSでも同様のソースで動作するかと思います。）

```roles/docker/tasks/main.yml
- name: Yum update packages
  yum:
    name: "*"
    state: latest
- name: Set docker repo
  copy:
    src: "{{ role_path }}/files/docker.repo"
    dest: /etc/yum.repos.d/docker.repo
    owner: root
    group: root
    mode: 0755
- name: Install docker
  yum:
    name: docker-engine
    state: present
- name: docker setting mkdir
  file: 
    path: /etc/systemd/system/docker.service.d
    state: directory
    owner: root
    group: root
    mode: 0755
- name: Add to docker group
  user:
    name: "{{ item }}"
    groups: docker
    append: yes
  with_items: "{{ docker_users }}"
- name: Start docker
  systemd:
    name: docker
    state: started
    enabled: yes
```

```roles/docker/files/docker.repo
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
```

`roles/docker/tasks/main.yml` 内の `Add to docker group` というタスクで、実行したいユーザー群`docker_users`を`docker`グループへ入れます。
これによって、`docker_users`に登録されているユーザーは、`sudo`なしで`docker`コマンドを実行できるようになります。

`docker_users` は、Ansibleの実行ファイル`site.yml`等で変数として設定します。


```site.yml
- hosts: all
  user: user1
  become: true
  vars:
    docker_users:
      - user1
      - user2
  roles:
    - role: user
    - role: docker
```

`docker`実行したいユーザー群のユーザーアカウントが存在しておく必要があるため、タスク`docker`の実行前にタスク`user`にてユーザー作成を行います。

```roles/user/tasks/main.yml
- name: Add users
  user:
    name: "{{ item }}"
  with_items: "{{ docker_users }}"
```

ファイル`hosts`には、ホストサーバー（デプロイ先の）アドレスを記述します。

```hosts
127.0.0.1
127.0.0.2
127.0.0.3
```


## 実行

```
$ ansible-playbook -i hosts site.yml
```

実行は、ホスト側で`sudo`が利用可能な環境で。

上記は、ゲストにおいて秘密鍵を`ssh-agent`で登録している場合で、
そうでない場合は、`--private-key`など適切なオプションをつけて実行ください。
Kotlinで文字列が部分一致かどうかを判別

文章中に特定の文字「TEXT」があるかどうか判別する。


このときトリプルクォート("""文字列""")にすると、エスケープせずにそのままの文字列を探せる。


###部分一致(返り値はBoolean)

```kotlin
val regex = Regex("TEXT")

val result = regex.containsMatchIn("aaa")
// --> false
val result = regex.containsMatchIn("aaaTEXT")
// --> true
```

###全文一致(返り値はBoolean)

```kotlin
val regex = Regex("TEXT")

val result = regex.matches("aaaTEXT")
// --> false
val result = regex.matches("TEXT")
// --> true
```

###前方一致

startsWithを使う。

```kotlin

val text1 = "aaaTEST"
val text2 = "TESTaaa"

result = text1.startsWith("TEST")
// -> false
result = text2.startsWith("TEST")
// -> true
```

###後方一致

endsWithを使う。

```kotlin

val text1 = "aaaTEST"
val text2 = "TESTaaa"

result = text1.endsWith("TEST")
// -> true
result = text2.endsWith("TEST")
// -> false
```
XGBoostでOptunaを使う

## 概要
[Optuna](https://optuna.org/)を使ってXGBoostのハイパーパラメータ探索をしてみる。

### インストール
```
pip install optuna
```

### コード概要
```
import xgboost as xgb
import sklearn.metrics import accuracy_score
import optuna
import functools

# ポイント１
def opt(X_train, y_train, X_test, y_test, trial):
    """ optunaでのハイパーパラメータ探索用関数 """
    n_estimators = trial.suggest_int('n_estimators', 0, 1000)
    max_depth = trial.suggest_int('max_depth', 1, 20)
    min_child_weight = trial.suggest_int('min_child_weight', 1, 20)
    learning_rate = trial.suggest_discrete_uniform('learning_rate', 0.001, 0.01, 0.001)
    scale_pos_weight = trial.suggest_int('scale_pos_weight', 1, 100)
    subsample = trial.suggest_discrete_uniform('subsample', 0.5, 0.9, 0.1)
    colsample_bytree = trial.suggest_discrete_uniform('colsample_bytree', 0.5, 0.9, 0.1)

    xgboost_tuna = xgb.XGBClassifier(
        random_state=42, # ここは固定の数値
        n_estimators = n_estimators,
        max_depth = max_depth,
        min_child_weight = min_child_weight,
        learning_rate = learning_rate,
        scale_pos_weight = scale_pos_weight,
        subsample = subsample,
        colsample_bytree = colsample_bytree,
    )
    xgboost_tuna.fit(X_train, y_train)
    tuna_pred_test = xgboost_tuna.predict(X_test)
    # ポイント２
    return (1.0 - (accuracy_score(y_test, tuna_pred_test)))

def main():
    # data preparing
    X_train, y_train = foo()
    X_test, y_test = bar()
    
    clf = xgb.XGBClassifier()
    # ポイント３
    study = optuna.create_study()
    study.optimize(functools.partial(opt, feature_train, result_train, teature_test, result_test), n_trials=100)

    # ポイント４
    # study.optimizeで得られたパラメータをxgb_paramのdictに格納して、学習開始。
    clf = xgb.XGBClassifier(**study.best_params)
    clf.fit(feature_train, result_train)
```

### ポイントメモ
#### ポイント１
optinaで利用する関数の箇所で、作るMLのモデルのハイパーパラメータの型や探索レンジを設定する。
suggest_intで整数型のハイパーパラメータを、suggest_discrete_uniformでfloat型のハイパーパラメータを指定。

他にどんなものを指定できるかは、[ここ](https://optuna.readthedocs.io/en/stable/reference/trial.html?highlight=suggest)参照。

#### ポイント２
最小にしたいものをreturnに設定。
今回は正解と予測の差を最小にしたいため、accuracyを1から引いて表現。
もし、weight付きで最小にしたいなどのやりたいことがあれば、ここの式をいじってあげればそれに沿った探索が走る。

#### ポイント３
ポイント１で作成した関数を用いて探索。n_trialsで探索回数を指定。

#### ポイント４
探索した結果もっとも良いハイパーパラメータは、study.best_ best_paramsに格納されるため、これをxgboostのハイパーパラメータとしてセットして、fitをかければOK。
tsでのreactのimportの仕方でちょっと詰まった

jsの時はこうimportしていた。

```
import React, { Component } from 'react';
```

tsにするとこういうエラーが出た。

```
uncaught at syncUserInfo TypeError: Cannot read property 'createElement' of undefined
```

こうすることでちゃんと動くようになった。

```
import * as React from 'react';
```
MacOSにHomebrewをインストールします

# Homebrewの仕組み

Homebrewは、Macシステムには用意されていないパッケージをインストールする時によく使う管理ツールの一つです。
Macシステムにパッケージのインストールやアンインストールなどを一元的に管理するものです。パッケージやライブラリの依存関係などが管理できます。
Homebrewは、個別のディレクトリにパッケージをインストールし、それらへのシンボリックリンクを/usr/localに作ります。

# Homebrewのインストール
以下のスクリプトをMacのターミナルに貼り付け実行します。

```bash
# インストール
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# インストール結果
Tapped 2 commands and 4723 formulae (4,982 files, 12.3MB).
Already up-to-date.
==> Installation successful!
==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
Read the analytics documentation (and how to opt-out) here:
  https://docs.brew.sh/Analytics
==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations
==> Next steps:
- Run `brew help` to get started
- Further documentation: 
    https://docs.brew.sh
```
インストールされたHomebrewの場所は以下で確認してみます。

```bash
ls /usr/local/Homebrew/
# 結果
CHANGELOG.md		LICENSE.txt		completions
CODE_OF_CONDUCT.md	Library			docs
CONTRIBUTING.md		README.md		manpages
Dockerfile		azure-pipelines.yml
Dockerfile.test.yml	bin
```

# Homebrew使い方
Homebrewを使ってwgetをインストールすることを通して、Homebrewの使い方を説明してみます。

```bash
# インストール
brew install wget
# 結果
==> Installing dependencies for wget: gettext, libunistring, libidn2 and openssl
==> Installing wget dependency: gettext
==> Downloading https://homebrew.bintray.com/bottles/gettext-0.19.8.1.mojave.bot
######################################################################## 100.0%
......
```
wgetの置き場所とシンポリックを確認します。

```bash
ls -la /usr/local/bin/wget
# 表示
lrwxr-xr-x  1 usernane  groupname  32  2 20 14:55 /usr/local/bin/wget -> ../Cellar/wget/1.20.1_4/bin/wget
```
Wagby開発で調査したことメモ1

# はじめに
仕事でWagbyを使っていて情報が少なかったので書いていこう思いました。
調べていて解決したことを記載していこうと思います。

# Wagbyとは
下記投稿に記載してありますので、そちらを参照してください。
[Wagby概観](https://qiita.com/haseesah/items/6ec8237e68ec6be5be79)

# 自分の環境
OS:Windows10
Wagby:8.2.0

# どこをカスタマイズできるの？
### javascript
 - 各画面のフロント（ブラウザで動作する)
     - 割と自由に書ける
     - DOM操作とか、イベント処理とか
     - 標準で[dojo Toolkit](https://dojotoolkit.org/)フレームワークを採用していて_onload_とかのライフサイクルイベントはフレームワークに合わせる必要がある。
 - サーバサイド
     - サーバで実行するJavaから呼ばれる
     - 特定のタイミングにしか呼ばれない（任意のタイミングには実行できない）
     - [Nashorn](https://openjdk.java.net/projects/nashorn/)上で動作する

### Java
  - wagbyが自動生成するJava
     - 継承して処理の書き換えができる
     - wagby標準の自動生成でないクラスは継承したものを作成しても利用されない
     - メンテめんどくさそう
  - 完全独自に作成したJava
     - 独自のUtilクラスとかを作成して任意に呼び出せる

### JSP
  - 要素を追加することができる
  - メンテめんどくさそう

### CSS
  - 独自の書式が書けるが基本書かない
  - 標準の書式で物足りないときは書くかもしれない

# 所感
基本的にjavascript以外のカスタマイズはバージョンアップ時の対応がめんどくさそう。

カスタマイズしすぎるとjavascriptでも大変

フロントのカスタマイズはdojo toolkitに慣れる必要がある

Java8のNashornがes6に対応してないから注意が必要

**標準機能のAPI一覧が欲しくなる。**
common lisp でマクロの習作

# まずは目標

```text:
"abc" と `(:tag ,aa)  -> (:tag "abc")
```

としたい。
簡単には

```common-lisp:test.lisp
(defun f (arg) `(:tag ,arg))
```
これでいいのか、、、。でも defun とかが冗長。

```common-lisp:test.lisp
(defmacro m0 (name arg tlst) `(defun ,name (,arg) ,tlst))

 (m0 ff arg `(:tag ,arg))

 (ff "abc")
(:TAG "abc")
```
なんとなく関数を作るマクロが出来た。lambda にしてみる。

```common-lisp:test1.lisp
(defmacro m00 (arg tlst) `#'(lambda (,arg) ,tlst))

 (funcall (m00 arg `(:tag ,arg)) "abc")
(:TAG "abc")
```
できた。arg が冗長。

```common-lisp:test2.isp
(defmacro m00 (tlst) `#'(lambda ,(remove nil (mapcar #'(lambda (i) (if (and (listp i) (eq (car i) 'SYSTEM::UNQUOTE)) (cadr i))) (cadr tlst))) ,tlst))

(m00 `(:tag ,arg))
#<FUNCTION :LAMBDA (ARG) `(:TAG ,ARG)>

(funcall (m00 `(:tag ,arg)) "abc")
(:TAG "abc")
```
より複雑なのが出来た。SYSTEM::UNIQUOTE は他の lisp で他の大丈夫か不安。
データを作る。

```lisp:data.lisp
(defparameter *my-list*
   '((:tag . (m00 `(:tag ,arg)))
     (:tag2 . (m00 `(:tag2 :local-tag "local" ,arg)))))

(setf input-data '(("abc" . :tag) ("def" . :tag2)))

(funcall (eval (cdr (assoc :tag *my-list*))) "abc")
(:TAG "abc")
```

input-data を評価する関数を作る。

```lisp:input-data.lisp
(defun eval-input-data (lst) (mapcar #'(lambda (x) (let ((word (car x)) (
tag (cdr x))) (funcall (eval (cdr (assoc tag *my-list*))) word))) lst))

(eval-input-data input-data )
((:TAG "abc") (:TAG2 :LOCAL-TAG "local" "def"))
```
なんとなくできた。毎回 eval するのは馬鹿らしいので cache する。

```common-lisp:test.lisp
(defun eval-input-data (lst) (mapcar #'(lambda (x) (let ((word (car x)) (
tag (cdr x))) (let* ((func (cdr (assoc tag *cached-my-list*))) (new-func (if fun
c func (eval (cdr (assoc tag *my-list*)))))) (if (null func) (push `(,tag . ,new
-func) *cached-my-list*)) (funcall new-func word)))) lst))

(defparameter *cached-my-list* nil)

*cached-my-list*
NIL

(eval-input-data input-data )
((:TAG "abc") (:TAG2 :LOCAL-TAG "local" "def"))

 *cached-my-list*
((:TAG2 . #<FUNCTION :LAMBDA (ARG) `(:TAG2 :LOCAL-TAG "local" ,ARG)>)
 (:TAG . #<FUNCTION :LAMBDA (ARG) `(:TAG ,ARG)>))

(eval-input-data '(("fff" . :tag)))
((:TAG "fff"))
```

なんかできている気がする。
 \*my-list* の m00 が余計だ。なんとかならないのか？これはまた考える。

## おまけ
eval と関数使ってできたけど、ちゃんとした関数がありそうなんだけど、、、

```common-lisp:test.lisp
(defun do-m00 (lst) `(m00 ,lst))

(defun eval-input-data (lst) (mapcar #'(lambda (x) (let ((word (car x)) (
tag (cdr x))) (let* ((func (cdr (assoc tag *cached-my-list*))) (new-func (if fun
c func (eval (do-m00 (cdr (assoc tag *my-list*))))))) (if (null func) (push `(,t
ag . ,new-func) *cached-my-list*)) (funcall new-func word)))) lst))
```

埋め込んじゃえばいいのか。

```common-lisp:
(defun eval-input-data (lst) (mapcar #'(lambda (x) (let ((word (car x)) (tag (cd
r x))) (let* ((func (cdr (assoc tag *cached-my-list*))) (new-func (if func func
(eval `(m00 ,(cdr (assoc tag *my-list*))))))) (if (null func) (push `(,tag . ,ne
w-func) *cached-my-list*)) (funcall new-func word)))) lst))
```

```
(defparameter *cached-my-list* nil)
*CACHED-MY-LIST*

(eval-input-data input-data )
((:TAG "abc") (:TAG2 :LOCAL-TAG "local" "def"))

*cached-my-list*
((:TAG2 . #<FUNCTION :LAMBDA (ARG) `(:TAG2 :LOCAL-TAG "local" ,ARG)>)
 (:TAG . #<FUNCTION :LAMBDA (ARG) `(:TAG ,ARG)>))
```

できた。ことにしておく。
画像を枠のなかで揺らす方法

[神曲] Kawaii EDMオススメ10曲 [まとめ]
https://www.youtube.com/watch?v=lN04a48Ba9I

を見ていたら、気づかない程度に画像が動いていて、WEBでもなんかのときに適用できたら面白いんじゃないかと思い、CSSで行う方法を調べてみました。

<p class="codepen" data-height="880" data-theme-id="0" data-default-tab="result" data-user="akicho8" data-slug-hash="exXQNd" style="height: 861px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="Image Swing CSS">
  <span>See the Pen <a href="https://codepen.io/akicho8/pen/exXQNd/">
  Image Swing CSS</a> by Akira Ikeda (<a href="https://codepen.io/akicho8">@akicho8</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


```sass:HTML(slim)
.swing_container
  .swing_v
    .swing_h
      .swing_rotate
        img(src="path/to/image.png")
```

```sass:CSS(sass)
$swing_level: 10px    // 縦横の移動幅
$swing_rotate: 1deg   // Z軸の回転幅
$swing_scale: 1.15     // 画像の拡大率

.swing_container
  overflow: hidden
  width: 256px

  .swing_v
    animation: kf_translate_x 0.7s ease-in-out infinite alternate

  .swing_h
    animation: kf_translate_y 0.8s ease-in-out infinite alternate

  .swing_rotate
    animation: kf_rotate_z 0.9s ease-in-out infinite alternate

  img
    display: block
    width: 100%
    transform: scale($swing_scale)

@keyframes kf_translate_x
  0%
    transform: translateX(-$swing_level)
  100%
    transform: translateX($swing_level)

@keyframes kf_translate_y
  0%
    transform: translateY(-$swing_level)
  100%
    transform: translateY($swing_level)

@keyframes kf_rotate_z
  0%
    transform: rotateZ(-$swing_rotate)
  100%
    transform: rotateZ($swing_rotate)
```

まとめると次のようになります。

1. 周期をずらしてX座標、Y座標、Z軸を動かす
2. 画像を少し拡大しておく
3. 親要素で子要素(画像)をクリップする
Kasperskyが動いているWindows上のWSL UbuntuでPPAを追加できない

表題の通り、Kasperskyがインストールされている状態のWSL上のUbuntuでPPAを追加しようとすると

```bash:install_ansible_ppa
$ sudo apt-add-repository ppa:ansible/ansible
Cannot add PPA: 'ppa:~ansible/ubuntu/ansible'.
ERROR: '~ansible' user or team does not exist.
```
のようなエラーが出る。

ググってもProxy関連のエラーである、`sudo -E`を使えば解決するなどの情報が出るが、
そもそもプロキシは使っていないし試しても解決しない。

解決策はKasperskyを終了することである。
gatsby Environment Variables まとめ

# 問題

### [Environment Variables][1]

ここで説明されている`.env`の指定方法が不明瞭。どういう設定で、クライアント側（ブラウザ）で使えるのか、使えないのか、ぱっと見よく分からない。


# 対応表

||.env.development|.env.production|.env.*|
|---|---|---|---|
|client side|設定の変数が使える|設定の変数が使える|[**GATSBY_** prefixがあれば使える][2]|
|server side|設定の変数が使える|設定の変数が使える|設定の変数が使える|

||.env.development|.env.production|.env.*|
|---|---|---|---|
|`gatsby develop`|自動的に読み込まれる|| dotenvで各自が読み込む設定が要る |
|`gatsby build`||自動的に読み込まれる| dotenvで各自が読み込む設定が要る |

# 例

1. 別々の条件がある2つのサイトを1つのgatsbyで作る必要がある。
2. 2つのサイトに共通する変数がある
3. サイトそれぞれに固有の変数がある

```bash:.env.development
BASIC_VAR=両方のサイトに必要な何らかの基本的な変数
```

```bash:.env.site-a
ONLY_AVAILABLE_ON_SERVER=prefixが無いのでこの変数はserver側でのみ有効
GATSBY_GOOGLE_ANALYTICS_ID=42424242
GATSBY_NAME=サイト名A
```

```bash:.env.site-b
GATSBY_GOOGLE_ANALYTICS_ID=11111111
GATSBY_NAME=サイト名B
```

`.env.*`が読み込まれるように`gatsby-config.js`の頭に下のような`dotenv`読み込みコードを入れる。

```js:gatsby-config.js
// https://www.gatsbyjs.org/docs/environment-variables/
let activeEnv = process.env.ACTIVE_ENV || process.env.NODE_ENV || "development"
require("dotenv").config({
  path: `.env.${activeEnv}`
})
```

`package.json`の`scripts`を下のようなものに変える。

```json:package.json
{
  "scripts": {
    "site-a.build": "ACTIVE_ENV=site-a gatsby build",
    "site-b.build": "ACTIVE_ENV=site-b gatsby build",
    "site-a.develop": "ACTIVE_ENV=site-a gatsby develop",
    "site-b.develop": "ACTIVE_ENV=site-b gatsby develop",
  }
}
```

`gatsby build` => `.env.production`を自動的に読み込む
`gatsby develop` => `.env.development`を自動的に読み込む
`ACTIVE_ENV` => `.env.???`を読み込む

# 結果

`yarn site-a.develop`を打てば、`.env.development`と`.env.site-a`を読み込む。

||BASIC_VAR|ONLY_AVAILABLE_ON_SERVER|GATSBY_GOOGLE_ANALYTICS_ID|GATSBY_NAME|
|---|---|---|---|---|---|
|from|.env.development|.env.site-a|.env.site-a|.env.site-a|
|server side|有効|有効|有効|有効|
|client side|有効||有効|有効|


[1]: https://www.gatsbyjs.org/docs/environment-variables/
[2]: https://www.gatsbyjs.org/docs/environment-variables/#client-side-javascript
PowerShellで7zを扱うCmdletsをご紹介

#はじめに
何気なく調べていたらexeを頑張って呼び出している人がいたのでメモ。

これを入れても結局7z.dllが入るのですが。

標準のCompress-Archiveではパスワードzipが作成できませんがこちらは作成できるので、
インストールできる環境であればこちらを使用したほうが良さそうです。

##紹介
7Zip4Powershellを使おう！
https://www.powershellgallery.com/packages/7Zip4Powershell/1.9.0

##インストール方法
リンク先に書かれていますが一応書いておきます。

```powershell
Install-Module -Name 7Zip4Powershell
```

#Cmdletsの簡単な説明
ざっくりサンプルのため詳細はGet-Helpで確認しましょう。

##Expand-7Zip
7Zipファイルを展開する

```powershell:Expand-7Zip

Expand-7Zip -ArchiveFileName "D:\temp.7z" -Path "D:\test-folder"
```



##Compress-7Zip
7Zipファイルを作成する
Pathにはファイルを指定してもフォルダを指定しても良いです。

```powershell:Compress-7Zip

Compress-7Zip -ArchiveFileName "D:\test.7z" -Path "D:\7ztest-folder"
```

パスワードも付けられます

```powershell:Compress-7Zip

Compress-7Zip -ArchiveFileName "D:\test.7z" -Path "D:\test-folder" -Password 'p@ssw0rd'
```

##Get-7Zip
7Zipファイル内のファイルリストが取得できます。

```powershell:Get-7Zip

Get-7Zip -ArchiveFileName "D:\test.7z"


Index          : 0
FileName       : a01.csv
LastWriteTime  : 2018/08/31 10:28:24
CreationTime   : 2019/02/20 14:11:52
LastAccessTime : 2019/02/20 14:11:52
Size           : 84932475
Crc            : 1549341964
Attributes     : 32
IsDirectory    : False
Encrypted      : False
Comment        :
```

ArchiveFileInfo型の配列で結果が返るようです。

```powershell:GetType

(Get-7Zip -ArchiveFileName "D:\test.7z")[0].GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    ArchiveFileInfo                          System.ValueType
```



##Get-7ZipInformation

7Zipファイルの情報が取得できます。

```powershell:Get-7ZipInformation
Get-7ZipInformation -ArchiveFileName "D:\test.7z"


FileName     : test.7z
PackedSize   : 2960164
UnpackedSize : 84932475
FilesCount   : 1
FullPath     : D:\test.7z
Format       : SevenZip
Method       : LZMA2:26
```

こちらはArchiveInformation型で返される様子

```powershell:GetType

(Get-7ZipInformation -ArchiveFileName "D:\test.7z").GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    ArchiveInformation                       System.Object
```



#「この記事は以下の記事からリンクされています」に出したいがためのリンク集
https://qiita.com/Q11Q/items/c309ff435d59413808d6
https://qiita.com/arachan@github/items/1147915cd0bcc011872f
https://qiita.com/kmr_hryk/items/5dfe87c0035887cbd8e4
https://qiita.com/arai-wa/items/2e4b1de0f9a3af7f1f9d
https://qiita.com/kurukurupapa@github/items/99f739f0c0dd402e03ea
https://qiita.com/Fushihara/items/5834b1f1d94ca72ebef4
lemonadeにてsshのリモートとホストでのクリップボードを共有 

vagrantでnvimを使い開発を行うにあたって
windowsのブラウザで調べたものをソースに張り付け、slackへソースを貼り付けなどをするときに
クリップボードの共有がされていないと不便。

そこでこちら [lemonade](https://github.com/lemonade-command/lemonade)

TCPにてクリップボードの内容を共有するものです。

## インストール

lemonadeはgo言語にてインストールを行います。
また、リモート・ホストの双方向でのやりとりとなるため、どちらにもそれぞれlemonadeをいれます。

#### 手順

1. windowsにgoをインストール
2. windowsでlemonadeをインストール
3. linuxにgoをインストール
4. linuxでlemonadeをインストール
5. windowsに設定ファイルを設置
6. linuxに設定ファイルを設置
7. windowsで起動時にlemonade.exeが実行されるようにする（lemonadeサーバーをたてる）
8. linuxで起動時にlemonadeが実行されるようにする

作者のpockeさんの解説
https://pocke.hatenablog.com/entry/2015/07/04/235118
まとめ
https://you84815.blogspot.com/2018/08/virtualboxvim-2.html

#### goのインストール

linuxはこちらを参考にさせていただきました
https://qiita.com/pukka/items/ad1212ca16db2698a576

windowsはこちらよりzipでもダウンロードすればOK
https://golang.org/dl/

#### lemonadeのインストール

go getでのインストールにつまづいたので直接ダウンロード・・
https://github.com/lemonade-command/lemonade/releases/tag/v1.1.1
よりリンクを確認し下記でダウンロード

```
curl -L -O https://github.com/lemonade-command/lemonade/releases/download/v1.1.1/lemonade_linux_amd64.tar.gz
```

展開

```
tar -zxvf lemonade_linux_amd64.tar.gz
```

#### windows側の設定ファイル

下記のIPはwindows側のipアドレス

```~/.config/lemonade.toml
port = 2489
allow = '192.168.56.1'
```

#### linux側の設定ファイル

```~/.config/lemonade.toml
port = 2489
host = '192.168.56.1'
trans-loopback = true
trans-localfile = true
```


#### ※windowsでlemonadeサーバーを立てるに当たって

そのままexe実行するとコマンドプロンプトがずっと開かれてしまう・・・

そのため、下記の手順でコマンドプロンプトなしでバックグラウンド起動する
https://amaotolog.com/pc-benri/33

```lemonade_hide.vbs
Set ws = CreateObject("Wscript.Shell") 
Set fso = createObject("Scripting.FileSystemObject")
ws.run "cmd /c " & fso.getParentFolderName(WScript.ScriptFullName) &"\lemonade.exe server", vbhide
```

また、windowsを起動したときに自動起動してほしい

こちらの手順より、先ほどのvbsファイルを発火させるショートカットを作成し、所定のディレクトリへ設置する
https://pc-karuma.net/windows-10-app-startup/

#### 確認

##### lemonadeが動作するかをまず見てみる

```
lemonade open --host '<Windows の IP アドレス>' 'http://example.com'
```

windows側のブラウザが立ち上がった！成功！

```
echo 'aiueo' | lemonade --host='192.168.56.1' copy
```

windows側のクリップボードに入った！成功！

##### linux側でvimよりコピーを試してみる

すると・・・

```:error
clipboard: error invoking lemonade: No clipboard utilities available. Please install xsel, xclip, or Termux:API add-on
for termux-clipboard-get/set.
```

```
yum install xsel
```

もう一度vimより試すと・・・

```:error
error invoking lemonade: exit status 1
```

？？？

と思ったら、linux側でのlemonade.tomlを設置していなかった。
設置すると正常に動きました。
lite-server(Browsersync)のアクセスログフォーマットを変更する

## lite-serverとは

`lite-server`は`Browsersync`のラッパーで、軽量な開発用WebServerとして使われています。
https://github.com/johnpapa/lite-server

## ログの仕組み

標準ではページ表示時に下記のようなログが出ます。

```text
[0] 19.02.17 01:26:53 200 GET /index.html
[0] 19.02.17 01:26:53 200 GET /index.html
[0] 19.02.17 01:26:54 200 GET /index.html
```

物足りないのでApacheのアクセスログと同じフォーマットにしてみましょう。

以下を参照すると、`connect-logger`を使っているようです。
https://github.com/johnpapa/lite-server/blob/master/lib/config-defaults.js

```javascript:config-defaults.js
var log = require('connect-logger');
 :
 log({ format: '%date %status %method %url' }),
```

### connect-logger

https://github.com/geta6/connect-logger

`connect-logger`で使えるフォーマットは下記だけのようです。

```
%date, %status, %method, %url, %route, %time
```

### morgan

`Express.js`で使っている`morgan`に変更します。
https://github.com/expressjs/morgan

## 変更手順

`bs-config.js`の`middleware`を変更します。他の項目は各自で自由にどうぞ。
`morgan`をインストールしていない場合は、`npm install --save-dev morgan`で入れて下さい。

```javascript:bs-config.js
//var log = require('connect-logger');
var log = require('morgan');

module.exports = {
  "injectChanges": "true",
  "files": ["./app/**/*.{html,htm,css,js}"],
  "watchOptions": { "ignored": "node_modules" },
  "server": {
    "baseDir": "./app",
    "middleware": [
      //log({ format: '%date %status %method %url %route %time' })
      log("combined")
    ]
  },
  "notify": false
};
```

## 変更完了

`lite-server`を再起動して完了。

```text
[0] ::ffff:127.0.0.1 - - [17/Sun/2019:04:13:26 +0000] "GET /favicon.ico HTTP/1.1" 200 24358 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0"
[0] ::ffff:127.0.0.1 - - [17/Sun/2019:04:13:27 +0000] "GET /favicon.ico HTTP/1.1" 200 24358 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0"
[0] ::ffff:127.0.0.1 - - [17/Sun/2019:04:47:11 +0000] "GET /index.html HTTP/1.1" 200 7081 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0"
```

`morgan`のログフォーマット形式については、[公式](https://github.com/expressjs/morgan)にあるのでそちらを参照してください。
Androidの端末がサポートするOpenGL ESのバージョンの調べ方

AndroidManifest.xmlの`android:glEsVersion`によると次にように定義されている。

> アプリに必要な OpenGL ES のバージョン。上位 16 ビットはメジャー番号、下位 16 ビットはマイナー番号を表します。 たとえば、OpenGL ES バージョン 2.0 を指定するには、値に "0x00020000" を設定します。また、OpenGL ES 3.2 を指定する場合は、値に "0x00030002" を設定します。

この値はbuild.propの`ro.opengles.version`で調べられる。

```
adb shell getprop ro.opengles.version
```

この値は10進数なので16進数に変換すると分かりやすい。

|OpenGL ESのバージョン|android:glEsVersion|ro.opengles.version|
|---|---|---|
| OpenGL ES 1.0 | 0x00010000 |  65536 |
| OpenGL ES 1.1 | 0x00010001 |  65537 |
| OpenGL ES 2.0 | 0x00020000 | 131072 |
| OpenGL ES 3.0 | 0x00030000 | 196608 |
| OpenGL ES 3.1 | 0x00030001 | 196609 |
| OpenGL ES 3.2 | 0x00030002 | 196610 |


## 参考

* [&lt;uses-feature&gt;  |  Android Developers](https://developer.android.com/guide/topics/manifest/uses-feature-element#glEsVersion)
* [Experiment OpenGL to OpenGL ES](https://www.facebook.com/notes/remix-os-fans-indonesia/experiment-opengl-to-opengl-es/318468448503127)
Egret EngineのEgret Wing廃止後のEgret Coderはどのように使うのか？



以前かいたこの記事[EgretWingの UIエディタが大きくバージョンアップ](https://qiita.com/motoyasu-yamada/items/5f62b3fea46c369133c5)のタイミングのバージョンから、`Egret Wing`(VS Codeにガワをかぶせたエディター)ではなくVS Codeを直接起動する形式に代わりました。

このバージョンの更新情報を見ると「Egret UI Editor」と 「Egret Coder」に分かれたとなっています。

しかしながら Egret Launcherに項目はありますが、起動することはできません・・・

![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/c44cff2f-ff45-0684-0682-c129b11bd654.png)

そのためにデバッグするためには、構成をlaunch.jsonに追加して、デバッグ起動していました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/43e8de6e-ff4b-b397-e6f5-0b83211bde5e.png)

そうなるとこんな感じでChromeでのデバッグになりむちゃくちゃ不便です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/f825a23f-faac-bf83-5ddf-95fcffc38423.png)

なんと`Egret Coder`は、VS Codeの拡張機能であったようです！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/2dbfccf9-2ffa-ae4e-c681-dff289de77d5.png)

さっそくインストール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/1e0503f3-4ed7-1e33-7d14-4974bca267dd.png)

やったーこれで！以前のEgret Wingのような簡易エミュレータが使えると思ったら・・・・

単にコマンドパレットからビルド・実行などができるだけみたい。実行したら結局Chromeでした
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/4687715d-15b2-9c05-9f20-2e84776de104.png)
unity5.2の作法 その3 Instantiate

#概要

unity5.2の作法、調べてみた。

#写真


![20190220_121737.gif](https://qiita-image-store.s3.amazonaws.com/0/18104/1d3ff500-b346-e9a3-21f7-707c1a87570f.gif)


#ぶつかったら爆発


```
using UnityEngine;
using System.Collections;

public class tama3 : MonoBehaviour
{
    public Transform target;
    public float speed;
    public GameObject explosion;
    void Start()
    {

    }
    void Update()
    {
        
    }
    void FixedUpdate()
    {
        float step = speed * Time.deltaTime;
        transform.position = Vector3.MoveTowards(transform.position, target.position, step);
    }
    void OnCollisionEnter(Collision col)
    {
        if (col.gameObject == target.gameObject)
        {
            Instantiate(explosion, transform.position, transform.rotation);
            Destroy(col.gameObject);
            Destroy(this.gameObject);
        }
    }
}
```


以上。
unity5.2の作法 その2 MoveTowards

#概要

unity5.2の作法、調べてみた。

#写真

![20190220_121047.gif](https://qiita-image-store.s3.amazonaws.com/0/18104/1be4bb4a-7125-fef9-2dcc-2c677dfdf734.gif)

#飛んでくる球に球をぶつける。


```
using UnityEngine;
using System.Collections;

public class tama3 : MonoBehaviour
{
    public Transform target;
    public float speed;
    void Start()
    {

    }
    void Update()
    {
        
    }
    void FixedUpdate()
    {
        float step = speed * Time.deltaTime;
        transform.position = Vector3.MoveTowards(transform.position, target.position, step);
    }
    void OnCollisionEnter(Collision col)
    {
        if (col.gameObject == target.gameObject)
        {
            Destroy(col.gameObject);
            Destroy(this.gameObject);
        }
    }
}
```

以上。
Laravel5.5でEventの使用方法に関する調査

#概要
Laravel5.5でイベントを用いた実装をするにあたり、調査した内容を共有致します。

イベントの概要については公式Docを参照して頂ければと思います。

https://readouble.com/laravel/5.5/ja/events.html



基本的に登場人物は以下の4つになります。

①イベント

②イベントリスナー

③上記２つを紐づけるサービスプロバイダー

④イベントを発火するクラス



#利用方法
①App\Providers\EventServiceProviderにイベントとイベントリスナーを$listenに定義します。

　例として"TestEvent"というイベントに対して"TestListener1"と"TestListner2"の二つのリスナーを定義します。

```php:EventServiceProvider
protected $listen = [
    'App\Events\TestEvent' => [
        'App\Listeners\TestListner1',
        'App\Listeners\TestListner2',
    ],
];
```

②artisanコマンドで上記で定義したリスナーを作成します。

　これでイベントファイル1つとイベントリスナーファイル2つが自動作成されたはずです。

```
php artisan event:generate
```

③これでコントローラなどからイベントを発火できます。

　イベントが発火されるとそのイベントに紐づいたリスナーのhandleメソッドが呼ばれます。

　リスナーのhandleメソッドでreturnした値はeventヘルパの返り値として取得できます。

```php:TestController
$response = event(new TestEvent());
```

#調査事項① イベントにパラメタを渡し、リスナーから値を返却できるか
【結論】下記の要領で出来る。



①コントローラで、イベントを発火するときにパラメタを渡す

```php:TestController
$response = event(new TestEvent("test parameter"));
```
②イベントで、コンストラクタとpublicなプロパティを設定する

```php:TestEvent
class TestEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
 
    public $parameter;
 
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($parameter)
    {
        $this->parameter= $parameter;
    }
}
```
③リスナーで、イベントのプロパティにアクセスする

```php:TestListener1
class TestListener1
{
    public function handle(TestEvent $event)
    {
        return $event->parameter; //これでイベントのプロパティにアクセス可能
    }
}
```

④これでeventヘルパの返却値に配列で値が返ってきます。

```
array:1 [▼
  0 => "test parameter"
]
```

#調査事項② 複数リスナー時の実行順番と返却値がどうなるか
【結論】複数リスナーの実行をするとき、キューを使用しない場合、EventServiceProviderに設定した順番通りに"同期実行"される



```php:EventServiceProvider
protected $listen = [
    'App\Events\TestEvent' => [
        'App\Listeners\TestListner1',　// 先に実行される、　return "listen 1"を記述してある
        'App\Listeners\TestListner2',  // 後に実行される、　return "listen 2"を記述してある
    ],
];
```
この状態でイベントを発火する

```php:TestController
$response = event(new TestEvent());
```
$responseの中身は下記のようになる。 

```
array:2 [▼
  0 => "listen 1"
  1 => "listen 2"
]
```
同期処理のため、TestListner1の処理をsleep等で遅らせてもこの順番で返却された。


#調査事項③ トランザクション制御できるか
【結論】できる



試したこと

①リスナーで適当なテーブルにInsertする処理を記述

```php:TestListner1
public function handle(TestEventInaba $event)
{
    $account = new Account;
    $account->id = 999;
    $account->is_available = 1;
    $account->login_id = "user9999";
    $account->name = "SampleName";
    $account->password = "SamplePass";
    $account->save();
}
```

②コントローラ側でイベント発火時にトランザクション制御を記述して実験

```php:TestController
DB::beginTransaction();
$response = event(new TestEvent());
DB::rollback(); //またはDB::commit();
```
③コミットもロールバックも正常に動作することを確認
取得に失敗した画像を再取得するAngularのDirective

ネットワーク環境が常にいいとは限らず、ユーザが移動中にWebを利用している時、画像のレンダリングが終わる前にネットワークがつながらなくなることもあります。そうすると、レンダリングしようとした画像が表示されないままWebを使ってもらうことになるので、再取得のDirectiveを書きました。

```ts
import { Directive, Input, HostBinding, HostListener } from '@angular/core';

@Directive({
  selector: 'img[appDefaultImg]',
})
export class DefaultImgDirective {
  @HostBinding('attr.src') @Input() src;
  @HostListener('error') retryGetImage() {
    setTimeout(() => {
      const dd = new Date();
      if (this.src.match(/\?/)) {
        this.src = this.src + '&t=' + dd.getTime();
      } else {
        this.src = this.src + '?t=' + dd.getTime();
      }
    }, 5000);
  }
}

```

errorイベントをハンドリングして、srcに格納されている画像を5秒おきに見にいきます。 `<img src='' appDefaultImg />` のように使ってください。

それではまた。
CentOS 6.x  ffmpeg インストール

## レポジトリ追加

```
[root@localhost ~]# rpm -Uvh http://li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm
```

## インストール

```
[root@localhost ~]# yum install ffmpeg ffmpeg-devel
```

## 動作確認
youtube-dlを使って動作確認する例

```
[root@localhost ~]# pip install youtube-dl
[root@localhost ~]# youtube-dl https://twitter.com/kanett3/status/1097903124637859845 -o test.mp4
[twitter] 1097637712230789123: Downloading webpage
[twitter:card] 1097637712230789123: Downloading webpage
[twitter:card] 1097637712230789123: Downloading guest token
[twitter:card] 1097637712230789123: Downloading JSON metadata
[twitter:card] 1097637712230789123: Downloading m3u8 information
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 47
[download] Destination: test.mp4
[download] 100% of 4.37MiB in 00:09
[ffmpeg] Fixing malformed AAC bitstream in "test.mp4"
```

ちゃんとffmpegを使って変換してることが確認できる。
ffmpegが使えないとこんなエラーが出る。

```
WARNING: 1097637712230789123: malformed AAC bitstream detected. Install ffmpeg or avconv to fix this automatically.
```

## ガラケーの頃はこんな風にして使ってた
PHPで行う動画変換
https://codezine.jp/article/detail/5173
https://codezine.jp/article/detail/5289
unity5.2の作法

#概要

unity5.2の作法、調べてみた。

#sceneを作る

file-new scene

cameraとlightが出来る。

#3ｄオブジェクトを配置

gameobject-3dobject-sphele

球ができる。

#位置を変更

transform-xを-10にする。

#重力を効かせる

addcomponent-physics-rigidbody

#ゲームを起動

三角ボタンを押す。

#ゲームを停止

三角ボタンを押す。

#床を設置

gameobject-3dobject-plane

#広げる

scale -x,y,zを10,10,10にする。

#名前をつける

sphereをtamaにする。

#スクリプトを書く

assets-create-c#script
tamaにする。

```
using System.Collections;

public class tama : MonoBehaviour 
{
	void Start()
    {
	    Rigidbody rigid;
        Vector3 d = new Vector3(10, 10, 0);
        rigid = this.GetComponent<Rigidbody>();
        rigid.AddForce(d, ForceMode.Impulse);
	}
	void Update() 
    {
	
	}
}

```

#スクリプトを適用する。

addcomponent-scripts-tama


#gif化した。


![20190220_132215.gif](https://qiita-image-store.s3.amazonaws.com/0/18104/3dc3e886-ba8e-7316-4366-a1c670530793.gif)



以上。
チェックボックスをチェックしたらsubmitを有効にメモ

# チェックボックスをチェックしたら送信ボタンを有効にする

```javascript:js.rb
// チェックボックスのハンドラーが働いたら
$('.checbox').on('change hoge', function() {
 // チェックボックスとsubmit有効の処理
 var target = $('セレクター');
 var btnTarget = $('.submit input');
//targetがチェックされたら
 if (target.is(':checked')) {
    //submitを有効
    btnTarget.removeClass('disabled');
    btnTarget.prop('disabled', false);
 } else {
    //submitを無効
    btnTarget.addClass('disabled');
    btnTarget.prop('disabled', true);
 }
});

//チェックボックスのハンドラーをhogeに
$('.checbox').triggerHandler('hoge');
```

## triggerHandler とは
簡単にいうと、イベント発生時の処理を実行するけど、
ブラウザの機能は実行されない。
※inputを選択したときに枠がつくのはブラウザの機能だが、
ハンドラーで実行することで、ブラウザの機能は実行されないけど、選択されている。
>[参照](http://www.jquerystudy.info/reference/events/triggerHandler.html)
[PhpStorm]PHPDOCのException記載漏れエラーをエディタに無視させる

PHPDOCを書く際、paramとreturnは書くけど、throwは書いていない
すると、すぐに関数の呼び出し元が黄色くなる(エディタに怒られる)ので回避したい

<img width="1011" alt="スクリーンショット 2019-02-20 12.58.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/298813/a37c89c6-c82f-0754-f85f-c744bbc92612.png">

↑ここに無視する例外クラスを追記すればOK

参考
https://blog.jetbrains.com/phpstorm/2018/04/configurable-unchecked-exceptions/

※本当は全部ちゃんと書けという話かもしれない

追記
無視する例外クラスとか設定せずとも、そもそもthrowやreturnを記載しなくても怒られなくて済む設定があった
<img width="1014" alt="スクリーンショット 2019-04-24 16.33.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298813/280a4c46-3a2d-0f5e-5f18-6077e1523721.png">
Emacsでgrepした結果を一括置換


半年に1回ぐらいやりたくなってその都度ググるので書いておく


1. M-x grep(or rgrep) で対象をgrep
1. eでwgrep-modeにする
1. *grep*バッファを編集する
1. C-c C-c (C-x C-s)でファイルに反映 ※もしくはwgrep-save-all-buffers実行


参考：http://emacs.rubikitch.com/wgrep/
Prettier と ESLintの違い

「コードをきれいにするんじゃ〜」
「コードのどこが間違っているんや〜」
といった作業に時間を使わなくて良くなる便利なツール「**Prettier**」の存在を知ったので、早速学習します。

### ◇Prettierとは
フロントエンド開発に役立つコード整形ツール。
Node.js上で動作する。
ReactやBabel,Material-UIなどの有名なプロダクトでも採用されている。

なぜPrettierのようなコード整形ツールが必要かというと、複数人で開発していると、どうしてもそれぞれのコードに個人の色が出てしまいます。
これだと、gitで統一した時にコードの書き方が整っていなくて混乱してしまいます。
そこで、Prettierなどのコード整形ツールを使えば、コードスタイルを意識することなく、コーディングに集中できるわけですね。

また、Prettierには次のメリットがあります。
①コードが読みやすくなる
②Node.js上で動作するため、ユーザー環境に依存しない
③プロジェクト単位でコードフォーマットを統一できる

次の記事を参考にさせていただきました。
＊ 参考
https://qiita.com/soarflat/items/06377f3b96964964a65d
https://ics.media/entry/17030


### ESLintじゃダメなのか？

[こちら](https://qiita.com/howdy39/items/6e2c75861bc5a14b2acf)
でESLintを学習した時に、
```javascript
eslint --fix
```
でコードをきれいにできた。
しかし、これでは整形できないコードがあるらしい。
例えば、
```js
foo(reallyLongArg(), omgSoManyParameters(), IShouldRefactorThis(), isThereSeriouslyAnotherOne());
```
1行がめちゃくちゃ長いコードはESLintでは扱えない。

これが、Prettierではきれいにできる。
また、Prettierには、ESLintと比べて手軽で確実に実装できる、というメリットもある。
ESLintではルールを設定しないといけない場合がある。
しかし、Prettierには構文チェック機能がなし(;や空白のチェックなど)。
そのため、両方を併用するのがベストなのかと。
ubuntu 18.04 で rc.local を使う

ubuntu 18.04 で rc.local を使うには、/etc/rc.local を作成し、chmod u+x する。

```/etc/rc.local
$ ls -l /etc/rc.local
-rwxr--r-- 1 root root 60 Feb 20 13:25 /etc/rc.local
$ cat /etc/rc.local
#!/bin/sh

echo hogehoge...

$
```

systemd で管理されていていて、その内容は以下の通り。


```/lib/systemd/system/rc-local.service

#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.
[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no
```
[Unity]Scriptで複製したオブジェクトのマテリアルを別々に変更する


同じマテリアルが当たっているオブジェクトを複製して色を変えた時に色がシンクロしてしまうのが嫌だったので、マテリアルをスクリプトで複製して当てなおす処理で回避しました。

#コード

	//===色変更処理===
	//targetA : コピー元
	//targetB : コピーしたオブジェクト
	//setColor : 設定したい色
```
	//変更したい色
	Color setColor = new Color(0f, 0f, 0f);

	//Aをコピー
	GameObject targetB = Instantiate(targetA);

	//対象のシェーダー情報を取得
        Shader sh = targetObjA.GetComponent<MeshRenderer>().material.shader;

	//取得したシェーダーを元に新しいマテリアルを作成
        Material mat = new Material(sh);
	
	//作成したマテリアルの色を変更
        mat.color = setColor;
	
	//対象オブジェクトに割り当てる
        targetObjB.GetComponent<MeshRenderer>().material = mat;
```
Kotlinで「error:java.lang.IllegalArgumentException: Unable to create call adapter for io.reactivex.Observable」というエラーがでるようになったら

Androidアプリのアプデで、下記エラーに遭遇。（いままで動いていた

```:logcat
2019-02-20 10:20:50.638 26755-26954/hogehogehoge E/MainActivity: error:java.lang.IllegalArgumentException: Unable to create call adapter for io.reactivex.Observable<hogehogehoge.hoge.model.Api$CalculatorJson>
        for method CalculatorService.json
```

build.gradleの

```:build.gradle
implementation 'com.squareup.retrofit2:adapter-rxjava:2.3.0'
```

↓

```
implementation 'com.squareup.retrofit2:adapter-rxjava:2.4.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
```

に変更し、Sync。



```kotlin:Api.kt
val adapter = Retrofit.Builder()
        .client(client)
        .baseUrl("https://cdn.cgate.jp")
//        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .addConverterFactory(GsonConverterFactory.create(aaa))
        .build()
```

``` RxJava2CallAdapterFactory ``` に差し替え

これで、無事解決しました。
メモメモ。
Kotlin今日ハジメテ触ったばかりで全然理解できていないですが、
swiftっぽくていいかも。



### 参考にさせて頂いたサイト
https://stackoverflow.com/questions/43434073/unable-to-create-call-adapter-for-io-reactivex-observable
「Cannot delete instance, resource keys must first be deleted.」のデバッグ方法【Bluemix】

はじめまして、ますみです！

[![自己紹介.png](https://www.umi-mori.jp/wp-content/uploads/2023/02/introduction_banner_2-2048x533.png)](https://bit.ly/banner_intro_masumi_creator_qiita)


# バグ内容
サービス（今回の場合**Visual Recognition**）の削除を行おうとしたが、次のようなエラーが出てきた。
>`An unexpected error occurred while attempting to delete service instance: Unexpected response code: 500 (Cannot delete instance, resource keys must first be deleted.).`
<img width="1000" alt="Screen Shot 2019-02-20 at 12.11.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/240280/57eec775-7dd2-3554-d736-bbbc1c406a96.png">

# エラーコードについて
**リソースキーの削除を行わないと、インスタンスの削除は行えません。**
簡単に言うと、インスタンス（このファイルのような物）の中で自動生成された鍵のような物を削除しないと、インスタンスは削除できないということ。

# デバッグ方法
1. インスタンスの中の`Service Credentials`からKeyの削除（Actions < Delete）を行う。
<img width="1000" alt="Screen Shot 2019-02-20 at 12.18.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/240280/fe16c81d-f8e7-938f-45ed-35e914b023ff.png">

2. Watson Servicesへ行き、もう一度削除を試みる。

3. すると、次のように削除に成功する。
<img width="400" alt="Screen Shot 2019-02-20 at 11.45.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/240280/00c6cb2d-270e-68e9-136e-87af98273f52.png">

# 補足 / 注意
海外のサーバーを使っているせいか、削除しても反映されるまで少し時間がかかることがあります。

# 最後に
最後まで読んでくださり、ありがとうございました！
いかがだったでしょうか？

この記事を通して、少しでもあなたの学びに役立てば幸いです！

:::note info
【仕事の相談はこちら】
お仕事の相談のある方は、下記のフォームよりお気軽にご相談ください。

[問い合わせフォームはこちら](https://forms.gle/G5g1SJ7BBZw7oXYA7)

もしもメールでの問い合わせの方がよろしければ、下記のメールアドレスへご連絡ください。

info*galirage.com（*を@に変えてご送付ください）

🎁 「生成AI活用の無料相談券」もしくは「生成AIの社内ガイドライン（無料PDF）」を『公式LINE』で配布中 🎁
『生成AIを業務に活用したいけど、どうしたらいいかわからない』といった声を多くいただきます。

Galirageでは公式LINEにて、チャットやオンライン会議で「完全個別の生成AI活用無料相談会」を実施しております！
（期間限定で実施しているため、ご興味ある方はお早めに以下のLINE公式アカウントをご登録ください^^）
https://lin.ee/rvz6lMN

※ 予告なく、キャンペーンを終了する可能性がございますが、ご了承ください。

【業務内容】
具体的には、以下のお仕事を中心に受け付けております！（[詳しくはこちら](https://galirage.notion.site/Galirage-AI-c2f3945fafb0433d8d2fd03e56927fd8)）
1. 受託開発（例：生成AIを使った社内システムの開発）
2. コンサルティング（例：技術戦略のアドバイス）
3. 講演（例：社内研修、イベント登壇）

※ 特に「生成AIを使ったシステム開発のご依頼」が多く、ご好評いただいております。

【これまでの相談事例】
以下のようなご相談が多くあります。

🔑 機密情報を漏洩させないための、生成AIのシステム構築をお願いしたい。
🤖 自社データを用いたFAQチャットボットの作り方を知りたい。
💡 ChatGPTを、自分たちの事業にどのように活かせるか、アドバイスやアイデアが欲しい。
:::
# おまけ
エンジニアの仲間（データサイエンティストも含む）を増やしたいため、公式LINEを始めました🎉

「**一緒に仕事をしてくれる方**」「**友だちとして仲良くしてくれる方**」は、友だち追加をしていただけますと嬉しいです！（仲良くなった人たちを集めて、「ボードゲーム会」や「ハッカソン」や「もくもく会」もやりたいなと考えています😆）

とはいえ、みなさんにもメリットがないと申し訳ないので、特典を用意しました！

友だち追加後に、アンケートに回答してくれた方へ「**エンジニア図鑑（職種20選）**」のPDFをお送りします◎

https://lin.ee/hFUN4TL

[![](https://www.umi-mori.jp/wp-content/uploads/2023/10/line_banner_v2.png)](https://lin.ee/hFUN4TL)
なぜ React Native で Parallelize Build のチェックを外すのか

React Native でビルドに失敗するとき、よくイシューを見ると、下記のように Parallelize Build のチェックを外せ、というアドバイスを見る。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103885/943ef430-ac1f-3b3a-641c-3e37d7f260c8.png)

これは、 `AppDelegate.m` において、下記を記述しているため

```
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
```

ビルド時に、このヘッダーファイルが作成されるので、 Parallelize Build をしていると、 上記のヘッダーが参照できなくなり、エラーになる。