OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel】複数のクエリのwhere句を結合する

# where句をマージする関数は、クエリビルダに存在する
自作しようかと思ったがあった。

``` /vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php
    /**
     * Merge an array of where clauses and bindings.
     *
     * @param  array  $wheres
     * @param  array  $bindings
     * @return void
     */
    public function mergeWheres($wheres, $bindings)
    {
        $this->wheres = array_merge($this->wheres, (array) $wheres);

        $this->bindings['where'] = array_values(
            array_merge($this->bindings['where'], (array) $bindings)
        );
    }

```

追加したいwhere句のwheresとbindingsを渡せば、マージしてくれるらしい

# wheresを取得する方法

```
$query = app('App\Hogehoge');
$wheres = $query->getQuery()->wheres;
```

# bindingsを取得する方法

```
$query = app('App\Hogehoge');
$bindings = $query->getBindings();
```

# 複数のクエリのwhere句を結合する

```
// もとになるクエリ
$query = app('App\Hogehoge')::join('piyopiyo', 'piyopiyo.id', '=', 'hogehoge.piyopiyo_id')
    ->where('hogehoge.class', 'A');

// 結合したいクエリ
$add_query = app('App\Piyopiyo')
    ->where('piyopiyo.class', 'B');

// queryにadd_queryのwhere句を結合する
$query->getQuery()->mergeWheres(
    $add_query->getQuery()->wheres,
    $add_query->getBindings()
);
```
Proxy下のk8s環境にHarborをデプロイしたらdocker pullで詰まった話

予期せぬ辛みは大体Proxy :cry: 

## TL;DR :pencil: 

- docker daemon が Registry service を探す際のNoProxy設定を下記に追加する
    - `/etc/systemd/system/docker.service.d/http-proxy.conf`
- daemon と docker を再起動する
    -  `sudo systemctl daemon-reload` 
    -  `sudo systemctl restart docker` 

```conf:/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=<your proxy IP:Port>"
Environment="HTTPS_PROXY=<your proxy IP:Port>"
Environment="NO_PROXY=core.harbor.domain"
```

## Harborを建てた :ship: 

Rancherで構築されたk8s上にHarborを立てる手順は[こちら](https://qiita.com/t_ume/items/1df04c1b63681d3192a3)を参考にさせていただきました。

ただ、RancherのCatalogで提供されているHarborマニュフェストがやや古いので、`Manage Catalogs`ボタンから公式HelmChartRegistry（https://helm.goharbor.io） を追加しました。
![add-catalog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221423/a5d95135-1775-11b1-a4c8-84de4d6f8524.png)

追加したCatalogのHarborを選べばOK
![select-catalog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221423/c1bb4f3f-8373-fb06-ecee-0a3125cb3854.png)

また、自分はProxy環境下なので、Yamlを直接編集して下記を追加しています。

```yaml
proxy:
  httpProxy: "<your proxy IP:Port>"
  httpsProxy: "<your proxy IP:Port>"
```

Deployして完了:v:

## Docker pull で Error が出た :cry:

上記で設定完了した思って、Harborにpushされたimageを意気揚々とpullしたところ下記のエラーが発生 :sweat_drops: 

```bash
$ docker pull core.harbor.domain/library/alpine:latest
Error response from daemon: Get https://core.harbor.domain/v2/: Service Unavailable
```

## ハマった :thinking:

上記のエラーを見て、`/etc/systemd/system/docker.service.d/http-proxy.conf`にNoProxy設定を追加したのですが、下記のようにIPで設定をしてしまい、ハマりました。。。

```text:/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
・・・
Environment="NO_PROXY=<worker nodeのIP>"
```

ここIPじゃだめなんですね・・・

ちなみに`/lib/systemd/system/docker.service`でもいいみたい。

お　し　ま　い
[Firefox] 文字化けの原因をレスポンスヘッダーから確認する

# Firefoxブラウザで文字コード確認

1.Firefoxのハンバーガーアイコンから「ウェブ開発」をクリック
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/3bec101b-e228-fefe-5958-121b85d29f35.png">

2.「ネットワーク」をクリック
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/70f72ad5-c5cb-f9e3-63a2-6cf6f6f1fdde.png">

3.「キャッシュを無効化」をチェック
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/812119be-f2ee-bb0c-f637-5fc37aedc5e0.png">

4.文字化けするページをFirefoxで開く

5.該当ページのファイルをリストから選択
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/9370a805-f055-97d7-1dd8-8ab5afb90988.png">

6.右に表示されるヘッダーにある応答ヘッダーの「Content-Type」から文字コードを確認します。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/deb408ee-5d59-541d-47db-2324df6c8729.png">

以上でレスポンス（応答）ヘッダーが示す文字コードが「charset=UTF8」となっていることが確認できました。

今回のソースは Shift_JIS の文字コードを返すよう作られていたので不一致であることが分かりました。

# 対策

* Webサーバー側でレスポンスヘッダーが Shift_JIS となるよう設定する
* ソースや各データの文字コードを UTF-8 に変換・作り変える


# おわりに

レスポンスヘッダーは文字コード以外にも多くの情報が含まれるのでその他のトラブルシューティングに活用できます。
Ubuntu 20.04 LTS で Apache2 ＋ CGI エラー

CGIを動かそうとしたら、

> Service Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
> 
Apache/2.4.41 (Ubuntu) Server at 192.168.162.113 Port 80


となった。

# 環境

Ubuntu 20.04 LTS
Apache2

# cgi のためにあらかじめ行っていた設定

apache2 をインストール。
apache の cgi モジュールをインストール

```

$ sudo a2enmod cgid

```

今回は、 /var/www 以下全てで CGI が動作するようにしました。

```

$ sudo vim /etc/apache2/apache2.conf
```


```

・・・
<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>
・・・
```
↓

```

・・・
<Directory /var/www/>
        Options Indexes FollowSymLinks execCGI
        AddHandler cgi-script .cgi .pl
        AllowOverride None
        Require all granted
</Directory>
・・・
```

ディレクトリ設定の確認。

```

$ sudo vim /etc/apache2/mods-enabled/dir.conf
```
以下のように設定されていました。

```

・・・
<IfModule mod_dir.c>
        DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
</IfModule>
・・・
```
変更の反映

```

$ sudo service apache2 reload

```

# エラー

ブラウザで開くと、冒頭のエラーが発生する。
/var/log/apache2/error.log には以下のように記録されていた。

```

[Fri Jun 12 11:12:24.086021 2020] [cgid:error] [pid 3340:tid 140420103878400] (22)Invalid argument: [client 192.168.162.32:51369] AH01257: unable to connect to cgi daemon after multiple tries: /var/www/html/indexserver.cgi, referer: http://192.168.162.113/
```

# 原因

cgid が動作する時にソケットファイルを必要としますが、その作成場所にパーミッションが不足しているらしいです。

# 対応

「(13) Permission denied on Apache CGI attempt」
https://serverfault.com/questions/142801/13-permission-denied-on-apache-cgi-attempt
を参照し、同様に対処することにしました。新たにソケットファイルの保管場所を作成し、設定する方法です。

```

$ sudo vim /etc/apache2/mods-available/cgid.conf 
```
として、編集

```

# Socket for cgid communication
ScriptSock ${APACHE_RUN_DIR}/cgisock

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
```
となっているのを、↓のように書き換える

```

# Socket for cgid communication
ScriptSock /var/run/httpd/cgisock

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
```

```
                                       
$ cd /var/run
$ sudo mkdir httpd
$ sudo chown www-data:www-data httpd
```

として、apache2 を reload したら動作しました。

# その後


```

[Fri Oct 16 10:10:54.453044 2020] [cgid:error] [pid 938] (2)No such file or directory: [client 192.168.162.67:53355] AH02833: ScriptSock /var/run/httpd/cgisock.929 does not exist: /var/www/html/index.cgi

```

というエラーが発生することがありました。
この場合、 /var/run/httpd が無かったので

```

$ cd /var/run
$ sudo mkdir httpd
```

として、apache2 を reload で対処しました。
LaradockでのLaravel開発メモ

# Laradockって何だっけ
https://laradock.io/
DockerでPHP開発環境を作れるやつです。
以前使った時に楽だった記憶があるので、今回久しぶりにLaravelの調査していて使ってみようと思ったのでメモしました。


# ワークスペース作成
```
mkdir hoge
cd hoge
```

# アプリケーションのコードを置くパスを作成
```
mkdir app
```

これでこんなディレクトリ構成になります
hoge/
 |-app/


# Laradockを取ってくる
```
git clone https://github.com/laradock/laradock.git
```

これでこんなディレクトリ構成になります
hoge/
 |-app/
 |-laradock/

# .env編集
```
cd laradock/
cp env-example .env
```
env-exampleを元に.envファイルを作ります。
その後.envの編集。
とりあえず公式サイトに倣ってみます。

## アプリケーションのパスを変更
```
# Point to the path of your applications code on your host
#APP_CODE_PATH_HOST=../
APP_CODE_PATH_HOST=../app
```

## .envに以下の行を追加
```
DB_HOST=mysql
REDIS_HOST=redis
QUEUE_HOST=beanstalkd
```


# コンテナを動かす
```
docker-compose up -d nginx mysql
```

# コンテナに入ってLaravelインストール
```
docker-compose exec --user=laradock workspace bash
cd /var/www
composer create-project laravel/laravel ./
```

# .envファイル変更
```
#DB_HOST=127.0.0.1
DB_HOST=mysql
#DB_DATABASE=laravel
DB_DATABASE=default
#DB_USERNAME=root
DB_USERNAME=default
#DB_PASSWORD=
DB_PASSWORD=secret
```

# 確認
localhostをWebブラウザで開いてLaravelの画面が出るのを確認する。

# バージョン指定する場合
## PHPを7.4にしてみる
Laradockの.envを編集する時に

```
PHP_VERSION=7.4
```
と変更する。

## MySQLのバージョンを5.7にしてみる
Laradockの.envを編集する時に

```
MYSQL_VERSION=5.7
```
と変更する

## Laravelのバージョンを6(LTS)にしてみる
composerでLaravelを入れるところで指定する

```
composer create-project "laravel/laravel=6.*" ./
```
ls -l とcat コマンドの違い

これは忘備録用なので、私のためのページ。:point_up::relaxed:


# lsコマンドとは
ファイルやディレクトリの情報を表示するコマンドです。これを叩くことで現在いるディレクトリのファイルやフォルダを一覧表示してくれる。

ls -l でーlオプションを使うことで詳細に表示してくれる。
パーミッションとか。オーナーとかバイト数とか。


# catコマンド
ファイルの中身を見たい時に使用する。
ls -lとはまた違ったニュアンスである。
div のリサイズイベントを拾う方法（メモ）

div のリサイズを拾う方法のメモ。
resizeイベントは、divなどの要素では発火しません。。。windowのリサイズなら発火するのですが。。。
そこで、要素のリサイズ時にイベントを拾う方法を調べてみたら、以下のページが見つかりました。参考にさせていただきました！

参考
Divタグのresizeイベントを拾うには - souki-paranoiastのブログ https://souki-paranoiast.hatenablog.com/entry/2018/12/08/231152

``` resize.html
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <title>test</title>

  <style type="text/css" scoped>
    #resizeable{
      border: solid 3px;
      border-color: blue;
      width: 100px;
      height: 100px;
      overflow: auto;
      resize: both;
    }
  </style>
</head>

<body>
  <h1>リサイズサンプル</h1>
  <div id="main">
    <div>
      <div id="resizeable"></div>
    </div>
  </div>
  <script>
    //イベント登録
    document.addEventListener('DOMContentLoaded', () => {
      //要素のリサイズイベント取得
      const observer = new MutationObserver(() => {
        const resizeable = document.getElementById('resizeable')
        //要素のサイズ確認
        const width = resizeable.getBoundingClientRect().width
        const height = resizeable.getBoundingClientRect().height
        console.log('size(w,h): ', width, height)
      })
      observer.observe(resizeable, {
        attriblutes: true,
        attributeFilter: ["style"]
      })
    }, false)
  </script>

</body>

</html>
```

なるほど。Observerを使えばよかったのね。参考になりました！ありがとうございます m(_ _)m

![2020-06-12 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/83a0e7cf-ac39-fe0f-0065-f286e9060eb8.png)
![2020-06-12 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/0b124756-12eb-9d57-ccbe-7196942d424a.png)
RubyMineでdocker-composeをdebug


RubyMine 2019.1.2
Ruby 2.5.x

ほぼこちらの手順で実施
> RubyMine 2019.1.2でdocker compose環境でのRailsアプリのデバッグを試してみた
https://qiita.com/masaruhr/items/f6df4f5ea36a4b9af142


ハマった箇所と対応

- remote interpreter 追加時に Unable to read RBConfig from specified interpreter

Experimentail Futureのruby.docker.internal.via.execをオフにする


- デバッグ実行で「annot start debugger. Gem 'ruby-debug-ide' isn't installed or its executable script 'rdebug-ide' doesn't exist.」

Gemfileにdebaseとruby-debug-ideを追加する
RubyMineか何処かにキャッシュされているっぽい。
docker-compose down、remote interpreterを削除=>RubyMine再起動などを行い、頑張ってキャッシュを消す

- デバッグ実行でException: undefined method `chomp' for nil:NilClass

Docker debugging and sub-debugger with random port
https://github.com/ruby-debug/ruby-debug-ide/issues/107

マルチプロセスのrubyアプリだと発生するらしい。
develop環境をWEBRICKへ変更で対応
gem ruby-firebase利用時のquery optionの書き方（備忘録）

Ruby on RailsとFirebase連携時に詰まったうえ、ググっても情報が出てこなかったので備忘録も兼ねて。

FirebaseのRealtimeDataba利用時に便利なgem ruby-firebaseですが、使い方もシンプルで分かりやすいのですが、その分ドキュメントも少なく、あまりこのパターンで使っている人が少ないのか、利用方法もあまり詳しく出てこなかったです。

基本的な使い方はruby-firebaseのGitを見てもらえればOKかなと思います。
https://github.com/oscardelben/firebase-ruby

その上で厄介だったのが、query Optionの存在です。

元々RealtimeDatabaseではクエリー自体少なくあまり便利に使えないので、がっつり使いたい方はFirestoreの方がいいらしいですが（使ったことない）、今回は指定が入ったのでRealtimeDatabaseを使いました。

Firebaseのクエリーについては公式ドキュメントで使用方法が書いていますので見てください。
https://firebase.google.com/docs/database/rest/retrieve-data#section-rest-ordered-data

orderByとかequalToとかをURL的にパラメータとして渡すというのが通常の使い方のようです。
この辺でひっかかったのは、equalToとかの指定は必ずorderByとのセットで使うということ。
orderByでキーを指定してequalToでバリューを指定するので当然と言えば当然なんですが、理解するまで時間がかかりました--;

で、これをruby-firebaseで使用するための方法ですが、結論から書くと下記のような記入方法です。

<pre>
result = firebase.get("example_dir/", {orderBy: '"id"', equalTo: 100}).body
</pre>

firebase.get()は通常の使い方で、example_dirで階層を指定しています。
カンマ以降のハッシュがクエリーになりますが、ここで重要なのが、orderByの値の指定方法です。

かならずダブルクオーテーションで値を囲って、その上でシングルクオーテーションで囲ってください。
これはFirebase利用時はパラメータで渡す際にダブルクオーテーションで囲む必要があるため、それをRuby上で表現するための方法になります。

この指定をしないと下記のエラーが出てはじかれます。
<pre>
orderBy must be a valid JSON encoded path
</pre>

これが判明するまでだいぶと時間がかかったので、同じエラーに悩む人が減ったらいいなと思います。
【HTML5】Input type="time"で入力値「00:00:00」としたときのvalueの値が「00:00」になる。

メモとして残します。

Input要素で type="time"でstep属性の値「1」にした場合、
「00:00:00」の形式で秒までの入力が可能となります。
しかし、ここにトラップがありました。
結論はタイトルの通り
**入力値「00:00:00」としたときのvalueの値が「00:00」になります。**

#■対策
```javascript
  $('body').on('change','input[type="time"][step="1"]',function(){
    $(this).val($(this).val()=='00:00'?'00:00:00':$(this).val())
  });
```
今時jQueryですみません。
たまたま、発見したシステムで使用されていたので(;^ω^)


#■さいごに
step属性の値が0.1でも同様の現象になるため、注意。
【Angular】継承クラスのasyncメソッドで親クラスのメソッドを呼ぼうとすると無限ループする。。。

Angular9で開発を行っている際に、問題にぶちあたったのでメモ。

# 現象

継承クラスにて、親クラスのメソッドをオーバーライドしたら無限ループするようになった。


# テストコード

- 親クラス
    - 対象のメソッドをasyncで定義

```app.service.ts
import { Injectable } from '@angular/core';

@Injectable()
export class AppService {
    constructor() {}

    async test() {
        console.log('parent');
    }
}
```

- 子クラス
    - 親メソッドをオーバーライドし、親のメソッドを呼び出す

```app-ex.service.ts
import { Injectable } from '@angular/core';
import { AppService } from './app.service';

@Injectable()
export class AppExService extends AppService {
    constructor() {
        super();
    }

    async test() {
        console.log('child')
        super.test();
    }
}
```

- コンポーネントから子クラスのメソッドを呼びだす

```app.component.ts
import { Component, OnInit } from '@angular/core';
import { AppExService } from './app-ex.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  title = 'extends-test';

  constructor(private service: AppExService) {
  }

  ngOnInit() {
      // 子クラスのメソッド呼び出し
      this.service.test();
  }
}
```

# アクセスしてみる

## Chromeの場合

- 親／子ともにログがちゃんと出ている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/4173c8a4-fa78-02c8-1130-1b0fa8caf693.png)

## Edgeの場合

- 子クラスのtest()がめちゃめちゃ呼ばれる
- 親のログが出ない

ログを見る限りでは、自分を再帰呼び出ししているっぽい。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/56957e52-d952-6f29-2fea-b2d94f767f7f.png)


superの参照がthisに変わってるのかな。。。
誰か解決方法を教えてほしい(´Д｀)



とりあえず、オーバーライドしたメソッドでなければ親クラスのメソッド呼べそうなので、それで回避することにします。。。
Ubuntu で音の鳴り始めにノイズが聞こえる場合の対処法

Ubuntu 18.04 を使っていて、

- たまに音の鳴り始めに「トゥッ」というノイズが乗る
- 音の鳴り始めがそもそも鳴らない

これらの現象が起こったので少し調べてみると、どうやら無音が一定時間続くとサウンドカードがスリープし、復帰する際に時間がかかったり、突入電流が生じることがあるらしい。

使っているサウンドカードによって若干対処法が異なるようだが、 PulseAudio というサウンドサーバーが動いている場合は次の方法で解決できる。

出典： https://bugs.launchpad.net/ubuntu/+source/linux/+bug/381201/comments/50

/etc/pulse/default.pa を root 権限で編集する。

```
### Automatically suspend sinks/sources that become idle for too long
load-module module-suspend-on-idle
```

この行をコメントアウトする。

```
### Automatically suspend sinks/sources that become idle for too long
#load-module module-suspend-on-idle
```

pulseaudio を kill するか、ログアウトまたは再起動すると変更が反映される。

これにより、サウンドカードがそもそもスリープしなくなり、ノイズは PC 起動時およびログイン時のみにしか鳴らなくなるし、音の鳴り始めが鳴らないという現象もなくなった。
Salesforce(Lightning)で設定を変えても反映されない場合の対処法

# はじめに
Salesforce認定アドミニストレータの勉強中、項目ヘルプテキストを追加したのに、ぜんぜん反映されなくて困った。
そこで、簡単な手順で即時反映される方法を見つけたのでメモしておきます。

## 設定変更を反映する手順

### 右上のユーザーアイコンをクリック
右上のアイコンをクリックしてメニューを表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299568/019cd1bf-3f22-8c4b-df63-684f763fa093.png)

### 表示設定を切り替えて、元に戻す
1. カンファタブルの人はコンパクトに、コンパクトの人はカンファタブルに切り替える。
2. 切り替える前の状態に戻す。（コンパクトからカンファタブルに、カンファタブルからコンパクトに戻す）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299568/45c4b1cc-da31-099e-3851-cf3b161d342d.png)

これだけ！
※実際には、1の時点で反映されていますが、普通は戻すので2も記載しています。

#### さいごに
Salesforceのこういうクセ、結構引っかかる。。
メモ: 長い要素でスクロールバーを表示、ajax通信など

## スクロールバーを表示させる

```html
<div style='height:300px; overflow:auto; display:block;'>
長いコンテンツ
</div>
```

## jQuery 1.9 - sjisでajax通信

### サーバー側でheader出力する

```js:ajaxの書き方1
$.get(url, function(data, status, xhr) {
	if (status == "success") {
		$("#result").html(data);
	}
});
```

```php
<?php
// ajax用にsjis宣言
header("Content-Type: text/html; charset=Shift_JIS");
```


### IE10以降の場合

```js:ajaxの書き方2
$.ajax({
	beforeSend : function(xhr) {
		xhr.overrideMimeType("text/plain; charset=shift_jis");
	},
	url: url,
	type: "GET"
}).done(function( msg ) {
	$("#result").html(msg);
});
```
【Ubuntu】useraddとadduserの違い

# ユーザーを追加しようとしてuseraddを使ったらはまった。
ユーザーを作成(useradd)して、切り替えたところ、
以下のようなエラーが出てきました。

```sh
No directory, logging in with HOME=/
```

## useraddとadduserの違い
Fedora/CentOS系では両方は同じコマンドでDebian系だと
useraddはコマンド一発で作るタイプで、adduserは対話形式で作るタイプという風に違いがあるみたいです。

ubuntuでuseraddだとデフォルトではホームが作成されないみたいで、
なので上記のように、

```sh
No directory, logging in with HOME=/
```
と表示されます。

adduserの設定は
/etc/adduser.confで変えられます。
こちらはデフォルトでホームディレクトリを作ってくれます。

useraddのようにコマンド一発で作れるのは大量のユーザーを作る時に便利なようです。
単にユーザーを追加したい時にはadduserのほうが良さそうですね。

参考
http://ky2009.hateblo.jp/entry/20071115/1193332309
チェックしたらラベルを太字にする

チェックボックス編
html側で labelタグを書いとくだけでいい。重宝してる。

```ruby:html
<label><input name="hogehoge" id="hogehoge" type="checkbox" value="1"></label>
```

```ruby:javascript
$(function() {
 $('input[type=checkbox]').filter(":checked").each(function() {
      $(this).closest('label').css('font-weight', 'bold');
    })
    .end().on('change', function() {
      $(this).prop('checked') ? $(this).closest('label').css('font-weight', 'bold') : $(this).closest('label').css('font-weight', 'normal');
  });
});
```




ラジオボタン編
idとname をhtmlで記載しておくこと。
nameはそのグループで統一させること。

```ruby:html
<label><input type="radio" value="1" name="hogehoge" id="hogehoge1">hogehoge1</label>
<label><input type="radio" value="2" name="hogehoge" id="hogehoge2">hogehoge2</label>
```

```ruby:javascript
$(function() {
  $(":radio").click(function(){
    var ans_name = ( $( this ).attr( "name" ) );
    var ans_id = ( $( this ).attr( "id" ) );
    console.log(ans_name);//デバッグ用
    console.log(ans_id);//デバッグ用
    $('input[name=' + ans_name).closest('label').css('font-weight', 'normal');
  $('#' + ans_id).closest('label').css('font-weight', 'bold');
  });
});
```
ping-tのみでLinuC Level1を取得した学習方法の話

##はじめに
新入社員が研修も終わり、会社にも慣れてきた季節だと思います。
会社に言われた資格勉強の勉強法がわからないなど、困ることもあるかもしれません。
Linux等の資格取得を目指す際に参考になればと思い、自分の行った勉強法を書きます。
Linuc Level1程度の難易度であれば、私のようにping-tのみでも合格することが可能だと思います。
ちなみに分厚い本を買ったはいいですが、めんどくさがりな性格が原因であまり読まず、自分の中でなかったこと扱いになっています。

##目次
- 出題数は少なめに、まずは<解説>よりも<参考>を読んで理解する
- <解説>を見ながら間違いの理由も覚える
- 完璧を目指さない

以上の3つで話を進めます。

##出題数は少なめに、まずは<解説>よりも<参考>を読んで理解する
ping-tでは指定した数の問題を解いた後、解答結果が表示されます。

問題の解説のページは

解説：
～～～～～～～～～～～
～～～～～～～～～～～
参考：
～～～～～～～～～～～
～～～～～～～～～～～

という流れで記載されています。
大抵の場合、<参考>にはその問題の分野の概要が書かれています。
わからなかった問題は<参考>→<解説>の順番に読むことで理解を早めることができます。
また、正答した問題であっても、熟読せずとも目を通すようにしました。

最初は出題数を5問から始めました。
学習初めはわからないことだらけです。
この状態のときは色々な問題を多く解くよりも、演習→答え合わせの間隔をなるべく狭め、
<参考>に書かれている内容を記憶に定着させることが優先です。

正答率が上がってきたら次第に出題数を増やし、分野を切り替えたらまた5問から…
という繰り返しを全分野で行いました。

##<解説>を見ながら間違いの理由も覚える
ping-tは4~5問程度の選択問題が多いです。
何回も問題を解いていると、何となく問題の答えを頭が覚えてしまうことがあります。
問題によっては、<解説>に間違いの理由も書かれています。これを流さないようにしましょう。

正しい回答を選択すると同時に、その他の選択肢の何が間違っているのかまで考えます。
指定する順番が違う、コマンドのオプションが違うなどありますが、
コマンドのオプションに関しては、「間違っている選択肢のオプションはどのような機能なのか」まで考えながら解くことで、1題で数問を解いていることになります。お得じゃないですか？

##完璧を目指さない
本試験では65%程度の正答率があれば合格するはずです。
なので完璧を目指してping-tをやり続けないようにしましょう。
私の場合、101は模擬演習にて8割を何度も取った後に受けましたが、時間をかけ過ぎた感がありました。
その1か月後、102は模擬演習7割以上をを6，7回くらいとった時に「もう十分だろう」という気分で試験を受けました。
どちらも十分な得点で合格できましたし、正答率にそこまで大きな差もありませんでした。
100%の正答率で合格しても70%の正答率で合格しても、合格したという実績に差はありません。
しかし時間は有限です。自分の好きなことのために費やす時間もストレスを溜めないために大事です。

・何割とることができれば合格なのか
・何問間違えていいのか

を考慮した上で試験のスケジュールを立てましょう。
Gatlingで起動時にシミュレーションを指定して起動する

Gatling便利ですね。シミュレーションが対話モードで選択する必要があるのですが、それを指定して起動する方法です。

```
$ bin/gatling.sh --simulation computerdatabase.SampleSimulation

./bin/gatling.sh --simulation computerdatabase.SampleSimulation
GATLING_HOME is set to /Users/yousan/gatling-charts-highcharts-bundle-3.3.1
Simulation computerdatabase.SampleSimulation started...
...
```

# オプション一覧


| Option (short) | Option (long) | 概要 |
|:--|:--|:--|
| -h | --help | ヘルプ |
| -nr | --no-reports | レポートを生成しない |
| -ro `folderName` | –reports-only `<folderName>` |  `gatling_home`/results/`folderName` にあるログからレポート作成のみを行う |
| -rf <path> | --results-folder `<path>` | Uses `<path>` as the folder where results are stored |
| -rsf <path> | --resources-folder `<path>` | `<path>` をリソースフォルダの指定とする |
| -sf <path> | --simulations-folder <path> | `<path>` でシミュレーションファイルがあるフォルダの指定を行う |
| -bf <path> | --binaries-folder <path> | `<path>` にシミュレーションバイナリの指定とする |
| -s `<className>` | --simulation `<className>` | 実行するシミュレーションの `<className>` を指定する |
| -rd `<description>` | --run-description `<description>` | レポート用の <description> を指定する |


https://gatling.io/docs/current/general/configuration#command-line-options
Wordpress Gutenberg 色々データ取得・変換

この記事は？
---

Wordpressの新エディタGutenberのブロック開発で使った・使いそうな
データ取得・変換のメソッドとか関数とかをメモしていきます


WP AjaxのURLを取得する
---
```js
wp.ajax.settings.url;
```


投稿IDを取得する
---
```jsx
wp.data.select('core/editor').getCurrentPostId();
```
[getCurrentPostId](https://developer.wordpress.org/block-editor/reference-guides/data/data-core-editor/#getcurrentpostid)


投稿タイプを取得する
---
```jsx
wp.data.select('core/editor').getCurrentPostType();
```
[getCurrentPostType](https://developer.wordpress.org/block-editor/reference-guides/data/data-core-editor/#getcurrentposttype)


投稿オブジェクトを取得する
---
```jsx
wp.data.select('core/editor').getCurrentPost();
```
[getCurrentPost](https://developer.wordpress.org/block-editor/reference-guides/data/data-core-editor/#getcurrentpost)


登録されているBlockTypeを取得する
----
```jsx
wp.data.select('core/blocks').getBlockTypes();
```
[getblocktypes](https://developer.wordpress.org/block-editor/reference-guides/data/data-core-blocks/#getblocktypes)


指定のBlockTypeを取得する
----

```jsx
wp.data.select('core/blocks').getBlockType('my/block_type');
```
[getblocktype](https://developer.wordpress.org/block-editor/reference-guides/data/data-core-blocks/#getblocktype)


選択中のBlockのAttributesを取得する
----
```jsx
wp.data.select('core/block-editor').getSelectedBlock().attributes;
```
[getSelectedBlock](https://developer.wordpress.org/block-editor/reference-guides/data/data-core-block-editor/#getselectedblock)



clientIdからBlockの情報を取得する
----
```jsx
wp.data.select('core/block-editor').getBlock(clientId);
```
[getBlock](https://developer.wordpress.org/block-editor/reference-guides/data/data-core-block-editor/#getblock)


指定のタイプの親ブロックのclientIdを取得する
----
```jsx
wp.data.select('core/block-editor').getBlockParentsByBlockName(clientId,'my/block_type')[0];
```
[getBlockParentsByBlockName](https://developer.wordpress.org/block-editor/reference-guides/data/data-core-block-editor/#getblockparentsbyblockname)


HTML文字列をsource:"children"のAttributesの値に変換する
----
```jsx
wp.blocks.parseWithAttributeSchema('<p>some HTML string</p>',{source:'children'});
```
GitBookでドキュメントをPDF書き出し

GitBookしてドキュメント書き出ししたくていろいろ調べ必要と感じた情報をまとめメモ

##環境

VSCodeターミナル

```
node -v
v10.16.3
npm -v
6.14.5
```

##動作確認までの手順

### npmでインストール

``` 
npm install -g gitbook-cli
```

###書籍言語を日本語へ

いろいろ設定はあるようです
https://gitbookio.gitbooks.io/documentation/format/configuration.html

``` book.json
{
  "language": "ja"
}
```

###実行してブラウザで確認

```
gitbook serve
```

##PDF書き出し

###calibreインストール
https://calibre-ebook.com/download
PCは再起動すると良さそうPATH通らないかも
![NoName_2020-6-12_11-35-41_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/0494d06d-86db-c935-e3de-e45927adff79.png)

###PDF書き出しを実行

```
gitbook pdf
```

##その他

###npm起動にする場合メモ

``` package.json
{
  "scripts": {
    "build": "gitbook build",
    "pdf": "gitbook pdf",
    "dev": "gitbook serve"
  }
}

```


##参考サイト
Markdownで書いたテキストをGitBookでまとめる
https://www.little-cuckoo.jp/entry/2018/01/04/173000
GitBookによるドキュメント作成
https://qiita.com/mebiusbox2/items/938af4b0d0bf7a4d3e33
gitbook で Markdown から PDF を生成する
https://1000ch.net/posts/2018/gitbook.html
ASP.net core 3.1で Web API の Validateを試してみる

core 3.1で
ActionFilterAttributeを使ってみたのですが
ずいぶん変わっているようですね？

```C#:ValidateIdAttribute.cs

using System.Linq;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.Extensions.Logging;

namespace FiltersSample.Filters
{
    public class ValidateIdAttribute : ActionFilterAttribute
    {
        // パラメータのnullチェックをするかどうか
        public string ParameterName { get; set; }
        private readonly ILogger<ValidateIdAttribute> _logger;

        public ValidateIdAttribute()
        {
            _logger = new LoggerFactory().CreateLogger<ValidateIdAttribute>();
            ParameterName = "id";
        }

        public override void OnActionExecuting(ActionExecutingContext actionContext)
        {
            if (!actionContext.ActionArguments.All(x => x.Key != ParameterName || checkValue(x.Value as string ?? string.Empty)))
            {
                // 数字じゃない
                string message = $"バリデート:{ParameterName}に数字以外が含まれます。";
                actionContext.ModelState[ParameterName].Errors.Add(message);
                actionContext.ModelState[ParameterName].ValidationState = ModelValidationState.Invalid;
                _logger.LogError(message);
                actionContext.Result = new BadRequestObjectResult(actionContext.ModelState);
                //actionContext.Result = new BadRequestResult();// こっちだと既定のbodyが返る
            }
            else if (!actionContext.ModelState.IsValid)
            {
                // Data Annotationsでひっかかった
                string message = string.Join("; ", actionContext.ModelState.Select(pair=>$"{pair.Key} = {pair.Value.RawValue.ToString()} "));
                _logger.LogError($"バリデート:{message}");
                actionContext.Result = new BadRequestObjectResult(actionContext.ModelState);
                //actionContext.Result = new BadRequestResult();// こっちだと既定のbodyが返る
            }

            // その他チェックすべきものがあれば実装

            base.OnActionExecuting(actionContext);
        }


        private bool checkValue(string id)
        {
            return id.Length == 12 && id.All(char.IsDigit);
        }
    }
}

```

と書いて
呼び出すのは

```C#:IdController.cs

using FiltersSample.Filters;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System.Collections.Generic;

// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860

namespace FiltersSample.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class IdController : ControllerBase
    {
        // GET: api/<IdController>
        [HttpGet]
        [ValidateId(ParameterName = "id")]
        public IEnumerable<string> Get(string id)
        {
            return new string[] { "id", id };
        }
    }
}

```
な感じでいいいみたいです

https://localhost:xxxx/api/Id?id=12345678
な感じでリクエストしてみてください

サンプル
https://dev.azure.com/lowguy/_git/sample?path=%2F3.1sample
RAD Studio 10.4で「支援機能」のメニューが移動している件

RAD Studio 10.4 Sydney をインストールして、支援機能の設定を行おうと「ツール｜オプション」でオプションダイアログを開いたら「ユーザーインターフェース｜エディタ」の下に今まであった「支援機能」のメニューが無い！

よく見たら「ユーザーインターフェース｜エディタ｜ソース」の中にタブが新設されていて、そこの中にありました！
![104option.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164551/f82a0f3e-8bc0-385b-cb64-59e05707deeb.png)
UE4でVRとSceneCaptureを使って重くなる場合にすること

UE4.25.1でVRとSceneCaptureを使っていると激重になっていたがDefaultEngine.iniに以下の設定を入れると解消された。

```ini
[/Script/Engine.RendererSettings]
r.SceneRenderTargetResizeMethod=2
```

# 参照サイト

* [Mixed Reality Capture のトラブルシューティング | Unreal Engine Documentation](https://docs.unrealengine.com/ja/Platforms/MR/MRTroubleshooting/index.html)
 * Mixed Reality Captureの話だけど問題がある場合r.SceneRenderTargetResizeMethodを2にとある。
* [SceneCapture2D is very low performance in UE 4.25 - Oculus開発者センター | 不具合](https://developer.oculus.com/bugs/bug/254164222508527/)
 * r.SceneRenderTargetResizeMethodが2で解消されるとある。
* [User Guide FAQ - Infinite Studio](http://infinitestudio.software/user-guide/User_Guide_FAQ.html)
 * r.SceneRenderTargetResizeMethodが2になっている。
* [Configuring your Unreal Project for AR/MR | Stereolabs](https://www.stereolabs.com/docs/unreal/configuring-your-project/)
 * r.SceneRenderTargetResizeMethodが2になっている。
* [Framerate drops when using SceneCaptureComponents with a RenderTarget in VR - UE-59090](https://unreal-engine-issues.herokuapp.com/issue/UE-59090) 
 * Developer NotesでThe correct solution for this is to simply set r.SceneRenderTargetResizeMethod to 2 instead of the default of 0 when there are intermediate render targets used for scene captures.と言われている。
「◯◯をサポートしていますか？」という質問をなくしたい

# 概要

ソフトウェアアプリケーションを提供していると、しばしば「このアプリケーションは◯◯という環境での利用をサポートしていますか？」といった質問を受ける。

しかし、関係者の「サポート」という言葉の認識がずれていた場合、「サポートするって言ったのに、問題が起きても解決してくれない」のような、トラブルが発生しかねないリスクを抱えている。

この認識の相違による問題を未然に防ぐため、アプリケーションの「サポート」という言葉の意味をあらためて定義する。

なお、記事の内容は筆者の個人的な見解であり、特定の企業・団体などを代表するものではない。

# サポートのレベル

「◯◯という環境をサポートしていますか？」という質問を受けたときには、下記の4段階のどれに当てはまるのかを回答するのがよい。

<dl>
  <dt>:weary: Level -1: 利用不可</dt>
  <dd>その組み合わせで使ってはいけない。絶対にできない、ダメ。</dd>
  <dt>:worried: Level 0: 提供元では責任を取れない(own risk)</dt>
  <dd>動作するかどうかは不明。何か問題があっても助けられないこともある。</dd>
  <dt>:smile: Level 1: 対応する、未検証</dt>
  <dd>その組み合わせでの検証実績はないが、対応する機能はある。何か問題があったらできる限り助けられる。</dd>
  <dt>:satisfied: Level 2: 対応する、検証済<dt>
  <dd>事前または定期的に、その組み合わせで正常利用できることを検証している。</dd>
</dl>

# 組み合わせの「動作保証」はできない

なぜ、上記のような段階にわけて説明する必要があるのか。

この疑問に回答するためには、前提として、アプリケーションの「サポート」と、一般的な「保証」の違いを説明する必要がある。

アプリケーションは動作環境、つまり動作するハードウェア・OS・ミドルウェア・共存するソフトウェアやそのバージョンがバラバラである。このため、何かしらの問題が起きたときに「対応≒サポート」することはできるが、事前に「故障が起きないこと＝欠陥がないこと」の保証はできない。

このため、現実的には、その組み合わせについて「対応する機能を提供しているか(動作することを想定しているか)」「検証済か」という事実が存在しているだけだからだ。

# 「サポート」という言葉を使って質問するのをやめよう

そもそも、認識の相違が発生してしまうのは、日本語の「サポート」という言葉が曖昧であることが原因である。このため、「サポート」という言葉を使って質問をするのをやめよう。

その代わりに、具体的に「対応する機能があるか」「検証済みかどうか」を質問しよう。

# 参考記事

- [「サポート」という言葉の意味を誤解してませんか? | Windowsインフラ管理者への道](https://windowsadmin.ebisuda.com/2010/09/02/%E3%80%8C%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%80%8D%E3%81%A8%E3%81%84%E3%81%86%E8%A8%80%E8%91%89%E3%81%AE%E6%84%8F%E5%91%B3%E3%82%92%E8%AA%A4%E8%A7%A3%E3%81%97%E3%81%A6%E3%81%BE%E3%81%9B%E3%82%93/)
- [第15回　「サポート、してますか？」の落とし穴 (1/2) - ITmedia エンタープライズ](https://www.itmedia.co.jp/enterprise/articles/1506/12/news016.html)
- [ソフトウェアテストは、「バグを見つけるため」に行うものではない。もうこれ以上「バグが見つけられない」ことを証明するために行うもの。｜Takashi Suda / かんた｜note](https://note.com/sudatakashi/n/n3f6528cb57af)
UE4.25ビルドのパッケージ実行で一部windows環境でVCRUNTIME140_1.dllがないエラーの表示などの問題が発生した

UE4.25.1でWin64ビルドしたパッケージを実行した際に一部のWindows10環境で問題が発生した。
ここではその内容を記録する。


# 発生した現象

パッケージを実行しようとすると以下のようにCrashReportClient.exeでVCRUNTIME140_1.dllが見つからないというエラーが表示される。
ただし、アプリを実行することはできるがOculusのHMDで音が聞こえない。
6環境中2つのWindows10環境で発生した(関係するかは不明だがUE4とVisualStudioが入っていない環境)。

![image (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/518f7324-3a05-c7bd-6ef4-e8d235862209.png)

プロジェクト設定でInclude prerequisites installerにチェックを入れていたがパッケージ実行時にVC Runtimeのインストールは求められなかった。
必要なVC Runtimeが入っていないとパッケージ実行時にインストールを求められるのでVC Runtimeはインストールされていたと思われる。

ちゃんとした確認ができていないがInclude Crash Reporterのチェックが入っていないプロジェクトのパッケージ実行ではdllエラーは表示されずに音だけ聞こえない状態になっていた。

# 原因

原因は特定できていないががVC Runtimeの特定バージョンで問題があったと推定。

# 対応方法

以下のサイトからvc_redist.x86.exeとvc_redist.x64.exeをダウンロード&インストールしてPC再起動（念のため)したら問題は起きなくなった。
https://support.microsoft.com/en-gb/help/2977003/the-latest-supported-visual-c-downloads

再現環境の作成ができていないので効果確認はできていないが、プロジェクトの設定でinclude app-local prerequisitesにチェックを入れておくとVC Runtimeを入れなおさなくても良いかもしれない。
include app-local prerequisitesにチェックをいれるとVCRUNTIME140_1.dllなどをパッケージに含むようになりパッケージ内の[プロジェクト名]/Binaries/Win64以下のexeの依存関係を調べるとそれらのdllを利用していた。
このため、dllがなかったり問題があったりしてもそれを利用してくれそう。


# 参照サイト

* [Unreal Engine 4.25 Preview - Unreal Engine Forums](https://forums.unrealengine.com/unreal-engine/announcements-and-releases/1728453-unreal-engine-4-25-preview/page7)
* [VCRUNTIME140.dll is missing error? (Solved) - UE4 AnswerHub](https://answers.unrealengine.com/questions/796216/view.html)
* ["The program can't start because VCRUNTIME140.dll is missing from your computer..." when launching Autodesk products | AutoCAD 2018 | Autodesk Knowledge Network](https://knowledge.autodesk.com/support/autocad/troubleshooting/caas/sfdcarticles/sfdcarticles/Error-The-program-can-t-start-because-VCRUNTIME140-dll-is-missing-from-your-computer.html)
* [UE4 and Visual Studio 2015 - Unreal Engine Forums](https://forums.unrealengine.com/development-discussion/c-gameplay-programming/48615-ue4-and-visual-studio-2015/page3)
ActiveRecordのモデルをキャッシュする時に関連キャッシュを取り除く

# Rails.cacheにmodelをキャッシュする...?
`Rails.cache` などを使い、ActiveRecordのモデルのインスタンスをキャッシュ(==シリアライズして保管)する、ということがある。主にパフォーマンスチューニングのために、DBクエリを減らそう、というような場合。

そのモデルが、`has_many` などの関連(association)を持っている場合、単純にキャッシュにwriteすると、これらの関連のキャッシュが書き込まれてしまう。一件問題なさそうに見えるが、たとえば、関連先のモデルに対して直接アクセスしたりして内容が書き換わる可能性があったりして不都合なこともある。

そういった場合には、モデルをシリアライズ(Ruby的には Marshal.dump) する場合に、この「関連のキャッシュ」を消去してから書いてやる必要がある。

# 結論
キャッシュに書く前に、以下のようにするとよい。

```ruby
(modelの中で)
  @association_cache.clear
  Rails.cache.write(.....)
```
ただし、この方法はundocumentedなようなので注意されたし。modelの中から実行できない場合は、`instance_variable_get` などを使うとよい。

# 代替案
```ruby
(modelの中で)
def marshal_dump
    [@attributes, @new_record, @primary_keyなど適宜インスタンス変数...]
end

def marshal_load(array)
    @attributes, @new_recordなどなど... = *array
end
```
この方法でも、 @association_cache をシリアライズの対象に含めないことで同様の効果が得られる。が、逆にほかのインスタンス変数を書かないといけないのと、インスタンス変数が増えた場合にはこの両メソッドも同期して更新しなくてはならない。もっとも、モデルの中で独自に(永続化すべきような)インスタンス変数を持つことは少ないのかもしれないが。
centos8 composer を インストール


# composer を ダウンロードし、インストール。
また /usr/local/bin に composerを設置。

```

sudo dnf -y install wget
sudo wget https://getcomposer.org/installer -O composer-installer.php
sudo php composer-installer.php --filename=composer --install-dir=/usr/local/bin

```


# composerのバージョン確認

```

composer -V

```




あれ？パスが通っていない？

```

echo $PATH

```

/usr/local/bin にパスが通っていないみたい。






vim ~/.bashrc

```

//最終行に追記
export PATH=$PATH:/usr/local/bin

```

```

//再読み込み
source ~/.bashrc

//composerのバージョン確認
composer -V

```

`bashrc に記載したのでログアウトしてもパスが通ったまま！OK`
Virtual Chara開発 - その1

#Virtual Chara

環境：
Windows 10
Unity 2018.4.1
RealSense D435

筆者が、Nest+Visualでジョインされた最初のプロジェクトは、UnityとRealSense D435の深度カメラを使って、利用者の行動を3Dキャラクターのアニメーションに反映するプログラムを作ることでした。
このプロジェクトの概念は、主に店舗など向けに、バーチャルキャラクターを店頭で表示して、遠隔地で操作します。キャラクターで、期間限定のキャンペーンなど、お店の関連情報を話したり、遊び心のある気楽な態度でお客さんと対話したり、お客様の質問に答えたりすることができます。

https://qiita.com/NestVisual/items/1292f8b7d945d73b9f17
このプロジェクトでは、フェイシャルトラッキングにopenCVを使用し、利用者の入力次第にキャラクターの頭の回転や口の動きができるようにしていました。

目標は、上半身の動きや顔の表情を追加することで、このプロジェクトを拡張することでした。また、男性俳優が女性キャラクターを演じられるようにするために、ボイスチェンジャー機能も必要でした。

###ボイスチェンジャー：
必要なRealSenseカメラがまだ届いていなかったので、私の最初の仕事はボイスチェンジャー機能の開発でした。出だしにUnityのアセットストアでVoice Changer Filterというアセットを見つけ、プロジェクトに追加しました。
https://assetstore.unity.com/packages/tools/audio/voice-changer-filter-54963
しかし、プラグインはオーディオ再生にほとんど1秒の遅延を追加し、さらに不要な騒音を追加しました。問題を解決したり、別の方法を見つけたりする前に、RealSenseのカメラが届きました。

###RealSense SDK2.0をインポート：
![Unity RealSense.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626158/016dcef3-90f6-09d5-9c60-77267a2ca2ec.png)

カメラを準備して、RealSense Viewerでしばらくテストした後、RealSense SDK 2.0のUnityラッパーを見つけたので、プロジェクトにインポートしてみました。それにはいくつかサンプルシーンが含まれていますので、それらはほとんどが何らかカメラの深度データを可視化しています。

どのシーンも、どのように進めるかのヒントを見えなかったので、UnityとRealSense 2でトラッキングを使用している類似のプロジェクトをネットで探しましたが、結局見つかりませんでした。
見つけたチュートリアルと例は全て以前の元のRealSense SDKを使用していましたが、それは現在では廃止されています。Intelに連絡したところ、トラッキングはサードパーティのソフトを使って行われており、その中でGestoosとNuitrackを推奨していることを知らされました。

Nuitrackは実際に検索中に出てきて、有望そうに見えたのですが、最初はRealSense SDKのみで開発しよう思っていました。しかし、トラッキングをゼロから開発のが難しそうでした。このプロジェクトに推奨の2つの中でNuitrackが最も適切なのと思ったので、さらに使ってみることにしました。

Nuitrackに関しては次回投稿します。それではまた
Aurelia2 を使ってみる

# やったこと
- Aurelia2 の新規アプリを作成する。

## Aurelia2 is 何？
- フロントエンドクライアント作成のためのJavaScriptフレームワーク
- Web標準に準拠
- 設定より規約 convention over configuration

現在のバージョンは正式リリース前のv0.7(2020-06-12 時点)になる。Qiitaにも紹介記事のあるAureliaからAPIに一部破壊的変更が入ってる。フレームワーク本体がJavaScriptからTypeScriptで書き直されてる。公式のドキュメント類は未整理、未整備な箇所が多数ある。

## RailsチュートリアルのフロントをAurelia2 で置き換える

### Aurelia2 を使用するのに必要なもの

- 公式Doc: https://docs.aurelia.io/

- Node.js: v >= 8.9.0

### アプリケーション作成
Aurelia1と異なり、CLIツールをインストールする必要はない。npx makesコマンドで作成する。

> npx make aurelia

今回はTypeScript を使用する。
依存パッケージのインストールが完了したら、作成したディレクトリに移動して、アプリケーションをサーブする。

> cd your_app
> npm start

しばらく待つと起動する。そっけないHello World が表示されればO.K.

作成時点のひな形にテストファイルが作成ずみなので、同様に

> npm test

Jestを使用したテストが走る。

# なぜやったか
Railsチュートリアルは諸々時代遅れで使えないことがわかったから。

# 次にやること
既に作成済みのCh5の途中までの実装をAurelia2 でおこなう。
【質問】スプレッドシート　複数タブから参照する方法

プログラミングでもないですし、初心者の質問で申し訳ございません。
調べてもわからず・・QUERYやimportrangeを使用するのだろうな、というところで詰まりました。
お力添えお願い致します。

「複数のタブにある表の行に記載があれば別の表にまとめて参照する」
ということを行いたいです。

シート1の1行に記載がある
![複数タブ参照 - Google スプレッドシート - Google Chrome 2020_06_12 10_34_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509778/dd256262-470a-7e97-ada3-28a031ed0abf.png)


シート２の２行に記載がある
![複数タブ参照 - Google スプレッドシート - Google Chrome 2020_06_12 10_37_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509778/97e3864e-9cdc-44e8-4928-cee5d2ac34a0.png)

このとき
シート３にシート1とシート２の各行を参照する
![複数タブ参照 - Google スプレッドシート - Google Chrome 2020_06_12 10_37_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509778/8e7b5088-2170-ef05-4233-70bb9781424a.png)

というようなことを行いたいです。
importrangeで１つのシートから行を抽出することはできましたが、
複数のシートから・・という設計がわかりませんでした。

よろしくお願いいたします！
TestCafe（５）inputの操作についての問題点

## 記事の概要
　TestCafeについての記述の5回目です。
　現在、inputタグでtype='time'関連のパーツを作ってテストしているのですが、どうもこのあたりの操作についてはTestCafeの動作に問題があるようです。
　今回はその問題について記述しておきます。

### IEでの「×」はクリックできない
　クリック操作でカーソル位置や座標を指定してクリックできるのですが、IEのInputでテキストのクリアの為にoffsetXを使って「×」をクリックしても反応しません。他では試していないのですが、どうも本当の意味でのクリックではなさそうです。（実行時の大きなマウスはクリックしているように見えるのですが）

### 空白が入力できない
　この仕様が不明なのですが、typeTextメソッドで空白が設定できません。入力必須のエラーチェックでは結構苦労します。
　上記で書いたように入力内の「×」はクリックできないので、結局pressKeyメソッドで"ctrl+a delete"を送信する必要があります。

### type=text以外ではキー入力が制限されている
　上記の空白が入力できないの続きですが、pressKeyを利用して空白を入力しようとしても、type=timeでは動作しません。どうも、type=text以外は入力に制限をかけているようで（timeでしか試していないので、違うかもしれませんが）text以外の特殊な入力では入力フォーマットが制限されていることが絡んでいるのか、いろいろできない様です。結果、IEでは「type='time'」の入力を空にすることはできませんでした。

### IE以外ではtype=timeの空白は「--:--」
　IE以外のChromeやFireFoxではtype=timeの場合にtypeTextメソッドで「--:--」を入力すると、中身が空になるようです。IEで実行すると、値にそのまま「--:--」が入っているようです。

### type=timeの時に入力しただけではchangeイベントが発生しない
　よくわからないのですが、ChromeやFireFoxでtype=timeの時に時刻を入力しても、そのページのJavaScriptで設定しているchangeイベントが反応しません。どうもchangeイベントが発生していない様です、他の入力をクリックさせてもblurも反応しません。（IEはこちらの都合で試してません）
　いろいろ調べていくと、入力後に「pressKey」でEnterキーを送信すると反応します。deleteキーで入力を消せないのに不思議ですが...。

## 結局できないこと
　今のところ、私の作業には影響はないのですが、type=timeの場合にIEでは内容をクリアする方法が見当たりません。知っている方が居られたらコメントください。
　最近TestCafeのバージョンを確認してないので、もしかしたら改選されているかもしれませんが。
型を意識したPythonの変数命名

Pythonは動的型付言語ですから、変数宣言時に型をつける必要がありません。

これは初心者にとっては、わかりやすいという大きなメリットです。
しかし、だんだんプログラムが肥大化していくにしたがって、「あれ？これってリストなのだろうか。タプルだろうか？」とわからなくなってくることがあります。

~~チーム開発などしている場合は、チームのコーディング規則にのっとるべきですが、個人でちょっとした開発をする場合や、コンペのためにコードを書く場合だと、わざわざ静的解析のツール(MyPy)なんかを導入するのも面倒です。~~
~~今回はそんなときの変数命名で、インターン先の社員さんに聞いたちょっとしたコツをメモ。~~

~~よしあしがあるかもしれませんが、例えば、画像のリストが下にある場合、~~

```
images = [img1,img2,img3,...]
```

~~としてもいいのですが、~~

```
images_list = [img1,img2,img3,...]
```

~~とすると、tupleや辞書でもなくlistだよ！というのが伝わります。
`images_ndarray`とすれば、numpyのndarrayであることがすぐにわかります。~~


→しらかみゅさんからコメントをいただきました！
Pythonの型ヒントを駆使すれば、ややこしくなく書けます。(詳しくはコメント欄ご参照下さい。)
勉強不足でした。調べなおして、後日修正させていただきます。
非同期処理の実装（シンプルバージョン）

###  <font color='lightblue'>背景</font>
以下画面から検索を行った時、リストが表示される仕組みについて、非同期処理を実装したい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647299/76321c9b-59be-8678-aba5-875f0ab057a7.png)


###  <font color='lightblue'>環境</font>

| 項目              |               内容 | 
|:-----------------|:------------------:|
| OS.Catalina      |           v10.15.4 |      
| Ruby             |            v2.5.1 |  
| Ruby On Rails    |           v5.2.4.3 |       


###  <font color='lightblue'>内容</font>
**対応１）検索ボタン押下時に呼び出されるアクションと紐つくビューをhtml→jsに変更する**
以下、index.html画面から呼び出されるアクションについて、１行目の「remote: :true」を記述。

```erb:index.html.erb(一部抜粋)
1        <%= form_tag(wordsearch_krowns_path, method: :get ,remote: :true) do %>
2          <input class="search-box__query" name="keyword" placeholder="作品名で検索" type="text" value="">
3            <button class="search-box__btn" title="検索" type="submit">
4              <i class="fas fa-search"></i>
5            </button>
6          </input>
7        <% end %>
```

こうすることで、「wordsearch」アクション=同名のアクションが呼ばれたのち、ビュー展開が**「wordsearch.html.erb」→「wordsearch.js.erb」**となる。
<br>

元々の画面描写は以下の通りレンダリングしている。13行目で検索結果リストをテーブルにて表示。<font color='red'>**ここを非同期で再描写する。**</font>

```erb:wordseach.html.erb（非同期する前のerbファイル）
 1 <!-- 詳細画面 -->
 2 <title>subaco トップページ</title>
 3 
 4 <div class="contents">
 5   <!-- サイドコンテンツ(左側)表示 -->
 6   <%= render "./shared/sidecontents" %>
 7 
 8 <div class="main-contents">
 9   <!-- メインコンテンツヘッダ部表示 -->
10   <%= render "mainheader"%>
11 
12   <!-- メインテーブル定義 -->
13   <%= render "maintable" %>
14 
15   <!-- クラウン表示 -->
16   <%= render "mainknowledge" %>
17 
18   <!-- クラウンイメージ表示 -->
19   <%= render "mainimage" %>
20 
21   <!-- main-contents 終了タグ -->
22   </div>
23 
24 <!-- contents 終了タグ -->
25 </div>
```
<br>
**対応２）非同期処理を実装する**
以下の1行のみで完了。非常にカンタン。作法は、対象となるhtmlのクラスと、レンダリングするための記述のみ。

```erb:wordseach.js.erb（非同期を行う処理）
$('.main-tab').html("<%= escape_javascript(render 'maintable' ) %>");
```

**<font color='blue'>これだけの改修で、非同期処理を実装出来るようになります。</font>**
AWS EC2 AmazonLinux2 MySQLを使えるようにする

# 目的

- 既存の記事を用いてAmazonLinux2にてMySQLでDBを作成できる様になるまでの一連の流れをまとめる。

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| AWS EC2インスタンス | AmazonLinux2 | こちらの方法を用いてイメージからインスタンスを作成→[AWS EC2 をMacで使ってみよう!](https://qiita.com/miriwo/items/a1ab84c098008e43d042) |
| MySQL バージョン | 8.0.20 for Linux on x86_64 (MySQL Community Server - GPL) | こちらの方法を用いてMySQLのインストールを行った→[AWS EC2 AmazonLinux2にMySQLを導入する。](https://qiita.com/miriwo/items/a1ab84c098008e43d042) |

# 前提情報

- 下記、または下記に準ずる方法でAmazonLinux2のインスタンスが作成されているものとする。
    - [AWS EC2 をMacで使ってみよう!](https://qiita.com/miriwo/items/a1ab84c098008e43d042)

# 説明完了時の状況

- インスタンス内のMySQLにrootユーザでログインしDBを作成することができる。

# 概要

1. MySQLのインストール
1. 初期パスワードの確認とログイン
1. パスワードの再設定
1. DBの作成

# 詳細

- ※下記説明で実行するコマンドはsshにてインスタンスに接続しインスタンス内で実行するものとする。

1. MySQLのインストール
    1. 下記のリンク先の方法を実施してインスタンスにMySQLをインストールする。
        - [AWS EC2 AmazonLinux2 MySQLをインストールする](https://qiita.com/miriwo/items/eb09c065ee9bb7e8fe06)
1. 初期パスワードの確認とログイン
    1. 下記のリンク先の方法を実施して初期パスワードを確認してMySQLにrootユーザでログインする。
        - [AWS EC2 AmazonLinux2 MySQL rootユーザの初期パスワードの確認方法](https://qiita.com/miriwo/items/457d6dbf02864f3bf296)
1. パスワードの再設定
    1. 先の方法でMySQLにrootユーザでログイン後に下記を実行する。(`ERROR 1819 (HY000): Your password does not satisfy the current policy requirements`の様なエラーが出た場合、入力されたrootユーザのパスワードが条件を満たしていない。)
    
        ```sql
        mysql> ALTER USER 'root'@'localhost' identified BY '大文字、小文字、特殊文字(アスタリスク等)を含む新しいrootユーザのパスワード';
        ```
    1. 下記を実行して一旦MySQLからログアウトする。

        ```sql
        mysql> exit
        ```
1. DBの作成
    1. 下記コマンドを実行してMySQLにrootユーザでログインする。(ログイン時のパスワードが先に設定し直したパスワードを入力する。)

        ```terminal
        mysql -u root -p
        ```
    1. MySQLログイン後下記を実行して「test」という名前のDBを作成する。
 
        ```sql
        mysql> create database test;
        ```
    1. 下記を実行して「test」データベースが作成されたことを確認する。

        ```sql
        mysql> show databases;
        ```
    1. 先の実行結果に「test」DBが存在することを確認する。

        ![ec2-user_ip-10-0-0-134__.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/0eab2990-dea7-d7a3-db07-0629a68b776e.png)

# 参考文献

- [6.4.3.2パスワード検証オプションと変数](https://dev.mysql.com/doc/refman/8.0/en/validate-password-options-variables.html#validate-password-status-variables)
macOSとWindowsのコモンパネル対応（Xamarin.Mac (cocoaアプリ) で「ファイルを開く」パネル表示方法）

#はじめに
Xamarin.MacのCocoaアプリケーションで、Windowsのコモンダイアログのような標準的パネルを取り扱えます。
Windowsとの対応、および「ファイルを開く」サンプルを記載しています。

#対応
|対象|Mac|Win|
|:---|:---|:---|
|アラート(メッセージボックス)を表示する|[NSAlert](https://developer.apple.com/documentation/appkit/nsalert)|MessageBox|
|ファイルを開く|[NSOpenPanel](https://developer.apple.com/documentation/appkit/nsopenpanel)|OpenFileDialog|
|ファイルを保存する|[NSSavePanel](https://developer.apple.com/documentation/appkit/nssavepanel)|SaveFileDialog|
|フォントを選択する|[NSFontPanel](https://developer.apple.com/documentation/appkit/nsfontpanel)|FontDialog|
|色を選択する|[NSColorPanel](https://developer.apple.com/documentation/appkit/nscolorpanel)|ColorDialog|
|PDFファイルに出力する|[NSPDFPanel](https://developer.apple.com/documentation/appkit/nspdfpanel)||

#コード例

```C#:ViewController.cs
using System;

using AppKit;
using Foundation;

namespace sample
{
    public partial class ViewController : NSViewController
    {
        public ViewController(IntPtr handle) : base(handle)
        {
        }

        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            // Do any additional setup after loading the view.
        }

        public override NSObject RepresentedObject
        {
            get
            {
                return base.RepresentedObject;
            }
            set
            {
                base.RepresentedObject = value;
                // Update the view, if already loaded.
            }
        }

        // ボタンクリックされたら呼び出されるよう Action で紐付け
        partial void ButtonClicked(Foundation.NSObject sender)
        {
            using(var pnl = NSOpenPanel.OpenPanel)
            {
                pnl.CanChooseFiles = true;
                pnl.CanChooseDirectories = false;
                if(pnl.RunModal() == 1) // OK : 1, Cancel : 0
                {
                    var path = pnl.Urls[0].Path;
                    var alert = new NSAlert();
                    alert.AlertStyle = NSAlertStyle.Informational;
                    alert.MessageText = "選択されたファイルのパスです";
                    alert.InformativeText = $"{path}";
                    alert.RunModal();
                }
            }
        }
    }
}

```
表示結果の例
![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100206/5a44aadb-1d01-4b15-6796-6cd4372c51ef.png)

#おわりに
Xamarinのおかげで、WindowsのC#(.NET)アプリケーション開発者はmacOSのアプリも容易に開発できるようになりました。嬉しい時代です。
Apatch設定、ログ確認等（※随時更新）

Linux環境にてApacheの確認。

## 有効になってるのはApacheかNginxか

```
$ netstat -lnp | grep 80 # プロセス番号を確認する

$ ps -ef | grep プロセス番号
```

**参考**
[netstat - ホストのネットワーク統計や状態を確認する](https://www.atmarkit.co.jp/fnetwork/netcom/netstat/netstat.html)
[プロセス確認コマンドpsのオプション忘備録 - Qiita](https://qiita.com/mgmgOmO/items/936bc99810834c418216)

## Apache 設定ファイルの場所を探す

```
$ find / -name httpd.conf
```

## Apache ログファイルの場所を探す

```
$ cat /path/to/httpd.conf | grep CustomLog
```

## ログの確認

```
tailf /path/to/access_log
```

## 設定の反映

```
$ /etc/init.d/httpd configtest #確認
$ /etc/init.d/httpd reload
```

[httpd.confに手を入れたら、SSHでApacheをrestartかreloadしないと反映されない | ノセノセブログ](https://2nose.com/blog/2013/01/httpdconfrestartreload.html)
【#PowerApps】Power Apps や Power Automate で環境が表示されない

# 概要
環境が表示されない場合の対処方法の解説。
また、前提条件として正しいライセンスを保有していること。

# 通常
通常であれば Power Platform 管理センターからアクセスさせたいユーザーを対象の環境に追加する形で表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/d7c0c3e0-279d-faf8-1ffa-8e847fe001c0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/fe43a794-239b-2cef-cb99-188afbf143d4.png)

しかし、環境のユーザー一覧に存在しても環境が表示されない場合も存在します。その場合の対処法を2つご紹介します。


# 1.アプリを共有する
適当なキャンバスアプリで構いません。表示されない環境でアプリを作成し、そのアプリを対象のユーザーに対して共有を行う事で、表示されます。
また、アプリの共有を外した場合環境が表示されなくなります。

例えば Power Automate では環境が表示されているのに、Power Apps で環境が表示されていないなどの場合は Power Automate のフローを共有した可能性があります。


# 2.セキュリティロールを付与する
Power Platform 管理センターの対象の環境から対象のユーザーに対して2つのセキュリティロールを付与します。

- Common Data Service User
- Environment Maker

こちらを付与し、1時間程度（こちらは状況によって伸びます。私の場合は半日程度待ちました。）待つことで環境に対してアクセスできるようになります。
Laravelの.envファイルとstorage_pathで躓いた話

Laravelを扱うときに最初にいじる設定ファイルの.envについて、少しつまったのとあまり頻繁にいじることもないだろうので備忘録も兼ねて書きます

# 状況
- .envに記述したパスの変数`LOG_DIRECTORY`とデフォルトパス`storage_path('logs/laravel.log')`でログの出力先を変えたい
- ログの出力先はstorage配下としたい

# 躓いたところ
- .envとconfig/logging.phpの対応するチャンネルに対して(今回はdaily)以下の用に記述したがうまくログを出してくれない
- デフォルトでstorage_pathを用いてるから同じ様に書いたら良くない？と思い記述

```:.env
LOG_DIRECTORY=logs/laravel.log
```

```logging.php
'daily' => [
    'driver' => 'daily',
    'path' => env(storage_path('LOG_DIRECTORY'), storage_path('logs/laravel.log')),
    'level' => env('LOG_LEVEL', 'debug'),
    'days' => 14,
],
```

# 結論
- `storage_path('LOG_DIRECTORY')`と書いてはいけない。
- `.env`に絶対パスを記述する

```:.env
LOG_DIRECTORY=/laravelのパス/logs/laravel.log
```

```logging.php
'daily' => [
    'driver' => 'daily',
    'path' => env('LOG_DIRECTORY', storage_path('logs/laravel.log')),
    'level' => env('LOG_LEVEL', 'debug'),
    'days' => 14,
],
```

# なぜログが出力されなかったか
.envには環境変数が記述されるが関数の引数として用いることができないため。
`storage_path('LOG_DIRECTORY')`と記述するとパスが`/プロジェクトのpath/'LOG_DIRECTORY'`となるらしい...