OmniAICreator/Qiita-1.07M huggingface dataset:
UnityでWheel Colliderを付けた車両が荒ぶるのを落ち着かせる方法

Unityで車両のモデルを動かすとき Wheel Collider を使いますが、何も問題ないように見えてもPlayを押した後に車両が荒ぶることがあります。
こんな風に。
[![NG](http://img.youtube.com/vi/zg2S_ajPWTc/0.jpg)](https://youtu.be/zg2S_ajPWTc)

この現象を止めるには、車両のルートとなるGame Objectに適当なサイズのBox Colliderを付けます。
![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39561/d2290fd7-1556-49e1-565e-eb24f3ba2417.png)

Box Colliderのサイズや位置は地面やほかのColliderに接触しないように、車両のサイズに対してごく小さ目で大丈夫です。例えば下記の画像の直方体のような感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39561/9db1cc3b-fc02-2a18-8725-b12b3d92aed2.png)

すべてうまくいくとこの動画のように安定します。
[![OK](http://img.youtube.com/vi/ZJdiIelzTVk/0.jpg)](https://youtu.be/ZJdiIelzTVk)

以上になります。
Warning: Unbrewed header files were found in〜の対処法

```
Warning: Unbrewed header files were found in ...
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected header files:
...
```
と表示されたときの対処法です。

---

1. ファイル一覧をコピー、テキストファイルにペーストして保存
2. 以下のコマンドを実行

```sh
sudo xargs rm -v < list.txt
```
`list.txt` はテキストファイルのファイル名に変更してください。

# 参考
https://discourse.brew.sh/t/unbrewed-header-files/2607/6
AndroidStudioでプロキシの設定を解除しても反映されないときの対処法 

## 目次
1. 概要
2. 環境
3. 解決方法
4. 原因
5. まとめ

## 1. 概要
一度プロキシ設定を行った後に、File->setting->System Setting->HTTP Proxyから`No proxy`を選択してもプロキシ経由でアクセスしてしまい、解決に時間が掛かったので解決方法を残しておきます。
## 2. 環境
- AndroidStudio 3.5.1

## 3. 解決方法
gradle.properties(Grobal Properties)の記述を削除したら,非プロキシ環境下でも動作しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437348/d57a0b70-2db6-8f06-6788-b29eb86047e1.png)
上の4行を削除

## 4. 原因
AndroidStudioの`setting`でプロキシの設定を行うと、自動で`gradle.properties`にプロキシの設定が追加されます。しかし、`No Proxy`を設定してもその記述は削除されないため、概要にある問題が発生しました。

## 5. まとめ
いろいろ書きましたが、`gradle.properties`の4行を削除すれば解決しました。
実際は削除よりコメント化の方がいいかと。解決しなければgit周りの設定に問題があるかも
[WSL/Ubuntu] プロキシ環境下でのgcc9.2インストールでつまずいた話

# 前提
- [このサイトの手順](https://mongonta.com/f292-howto-update-gcc-to-7-2-on-wsl/)に従って、ビルドに必要なパッケージのインストールとgccのビルド準備をする。
- （ただし、今回インストールするのはgcc9.2であることに一応注意。）

```bash
$ sudo apt install build-essential
$ wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-9.2.0/gcc-9.2.0.tar.xz
$ tar xvf gcc-9.2.0.tar.xz
$ cd gcc-9.2.0
```


# 問題
- プロキシ環境下では、上記の次に行う下記コマンドでこける。（`.bashrc`で、`export ftp_proxy="[アドレス]:[ポート]"`を設定してもなぜかこける。）

```bash
$ contrib/download_prerequisites
```

# 対処法
- ftpではなく、httpを使うように設定。

```bash
$ export http_proxy="[アドレス]:[ポート]"  # .bashrc等に書いている場合は不要
$ sed -i contrib/download_prerequisites -e '/base_url=/s/ftp/http/'
$ find -name \*.tar.\* -delete
$ contrib/download_prerequistes
```
- `make`からは[手順](https://mongonta.com/f292-howto-update-gcc-to-7-2-on-wsl/)通りでOK。

# 参考サイト
- https://mongonta.com/f292-howto-update-gcc-to-7-2-on-wsl/
- http://gcc.1065356.n8.nabble.com/Regarding-download-prerequisite-td1478724.html
量子コンピューティングを学べるQiskit Blocksをインストールしてみよう minetestインストール：macOS編

身内マイクラ鯖管理人ではあるものの、最近ログインしない間に
身内の職人たちが作ったワールドが凄すぎて尻込みしているマンのl_s_s_lです。

IBM Qの説明の中でIBM Researchの中の人（量子物理学者のゲーマーでありマッドサイエンティスト）がMinetestってminecraftクローン（オフィシャルには、Minecraft似って言ってる？）で量子コンピューティングを学べるやつを作って公開しているとのことで、早速入れてみました。

日本語化したら楽しいだろうなーと思っていたら、すでに日本語化もされていて、
これはもっとみんなで~~遊ば~~学ばねばということで手順をまとめます。

結果：minetestインストール手順になってしまった。
Qiskit BlocksはGUI側からインストールしたほうが楽なのでインストール手順割愛(ヽ´ω`)

## 前提：
MacBookです。WindowsとLinuxはそのうち

macOS 15 Catalinaをベースに書いています。
homebrewもインストールしておきましょう。

## Minetestのインストール

```
$ brew install minetest
$ ln -sfv /usr/local/opt/minetest/minetest.app /Applications
```
※２行目のsymlinkはbrew linkappsが使えなくなったので手でリンクしたよ

## Qiskit Blockのインストール

minetest起動してからGUIでインストールしたほうが簡単であったのでした

https://github.com/JavaFXpert/QiskitBlocks#installing-and-running-the-quick-and-easy-way-using-the-minetest-content-database

起動したっ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126158/1bdf4d65-01f0-f410-b498-48e288f9afb2.png)
Wordpress構築するのにおすすめな画像設定

何度かWordpressをやっていて、サムネイルの扱いにコツがあったので共有します。

# 不満な点

- 自動的に複数サイズにカットされる機能がついているが、使わないサイズも出力されるので、サーバーの容量を圧迫されやすい。
- 指定サイズ以下の画像がアップロードされると、拡大したりカットしたりしてくれない。
- (管理画面)サムネイルから記事を見つけにくい
- ダミー画像を設定してくれない

# まず、これを記入

```php:functions.php
add_theme_support( 'post-thumbnails' );
```

サムネイル機能をオンにする。

# 余計な画像を排出しないようにする

管理画面 > 設定 > メディア　で表示される
![スクリーンショット 2020-02-12 13.02.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225361/382b3380-86b1-00a5-baf1-f496a62d20d5.png)

ここのサイズを全て0にすると、余分な画像サイズの画像が出力されない。

# "アイキャッチ"を"サムネイル"に名前変更する

```php:functions.php

function custom_post_labels( $labels ) {
	$labels->featured_image = 'サムネイル画像(推奨: **px : **px)'; // アイキャッチ画像
	$labels->set_featured_image = 'サムネイル画像を設定'; // アイキャッチ画像を設定
	$labels->remove_featured_image = 'サムネイル画像を削除'; // アイキャッチ画像を削除
	$labels->use_featured_image = 'サムネイル画像として使用'; // アイキャッチ画像として使用
	return $labels;
}
add_filter( 'post_type_labels_post', 'custom_post_labels' );

```

ちなみに、`_post`の`post`を`page`にすると固定ページに適用され、カスタム投稿名にするとカスタム投稿でも適用される。

# メニューにサムネイルを挿入する

```php:functions.php
	/**
	 *  サムネイル画像表示
	 */
	function customize_manage_posts_custom_column($column_name, $post_id) {
	    if ( 'thumbnail' == $column_name) {
	        $thum = get_the_post_thumbnail($post_id, 'small', array( 'style'=>'width:100px;height:auto;' ));
	    } if ( isset($thum) && $thum ) {
	        echo $thum;
	    } else {
	        echo __('None');
	    }
	}
	add_action( 'manage_posts_custom_column', 'customize_manage_posts_custom_column', 10, 2 );
```
サムネイルがあるのと無いのとでは、該当記事を探すスピードが段違いだと思う。
[参考サイトはこちら](https://mowewave.com/web/dashboard-eyecatch/)

# 大(1200px),中(600),小(300)設定する

```php:functions.php
	add_image_size('large',1200,900);
	add_image_size('medium',600,450);
```
指定のサイズより大きくなった場合、縮小された画像を出力してくれる。
デザインにより、適宜変更。
1:1だと大きすぎるので、とりあえず4:3のにしておけば、不都合を感じることはないと思う。
近年のRetinaサイズやレスポンシブで画像サイズの変更も考慮すると、一回り大きいサイズの方が綺麗に出力される。

# ダミー画像を作る
画像がない場合のダミー画像を準備する。大体グレー背景にロゴの画像を中央に置いている。
サムネイルサイズが複数ある場合、複数サイズ分を用意する。
ここで作る名前でおすすめなのが、`dmy_post.jpg`と`dmy_カスタム投稿名.jpg`で作ること。

# 画像の有無でURLを変更する関数を作る

```php:functions.php

function post_thumbnail_set($size = 'medium', $dmy_slug = false)
{
    global $site_info;
    if (has_post_thumbnail()) {
        $url_setting = get_the_post_thumbnail_url(get_the_ID(),$size);
        return '<figure style="background-image:url('.$url_setting.');" class="imgBg"></figure>';
    } else {
        if ($dmy_id):
            return '<figure style="background-image:url('. get_stylesheet_directory_uri().'/' .'img/dmy_'.$dmy_slug.'.jpg)" class="imgBg"></figure>';
        else:
            return '<figure style="background-image:url('. get_stylesheet_directory_uri().'/' .'img/dmy_slug.jpg)" class="imgBg"></figure>';
        endif;
    }
}
```

記事ページで`<?= post_thumbnail_set() ?>`と記述すると、画像のURLを出力される。
変数を設定できて、例えば`<?= post_thumbnail_set('large','event') ?>`と記述すると、1200x900以内に収まった画像、もしくは、dmy_event.jpgが出力される。

# サムネ用のCSSを設定する
```css:style.css

figure.imgBg{
    background-repeat: no-repeat;
    background-size: cover;
    background-position: center center;
    width: 100%;
    height: 100%;
}
```

figureの周りを囲うdivに横幅と高さを設定すれば、サムネがちょうどいいサイズで表示される。
ガストで Linux で Wifi 接続

ガストで Linux で Wifi 接続ができない状況の報告です。

テストしたのは、Arch LInux です。

## 2021年1月9日の状況

```text
$ uname -a
Linux iwata 5.5.2-arch1-1 #1 SMP PREEMPT Tue, 04 Feb 2020 18:56:18 +0000 x86_64 GNU/Linux
```

```text:/etc/netctl/wlp2s0-free_at
Description='Automatically generated profile by wifi-menu'
Interface=wlp2s0
Connection=wireless
Security=none
ESSID=.Wi2_Free_at_\[SK.GROUP\]
IP=dhcp
```

使ったコマンド

```bash
sudo netctl start wlp2s0-free_at
```

Ubuntu 19.10 でも wifi の接続を試みましたが失敗しました。
Android では wifi 接続ができます。

2021年1月9日にクロムブックで試しましたが、インターネットに接続できませんでした。認証のページにリダイクレトされないのが原因に思えます。

## 2023年2月13日の状況

Wifi 接続が出来ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/a86612a8-c28e-d83d-e16c-fc94b1dceb2c.png)


次の環境で確認しました。

```text
$ uname -a
Linux shimizu 6.1.11-arch1-1 #1 SMP PREEMPT_DYNAMIC Thu, 09 Feb 2023 20:06:08 +0000 x86_64 GNU/Linux
```

## 参考
[コメダ珈琲店で Linux で Wifi 接続ができない状況](https://qiita.com/ekzemplaro/items/1173b32ccf8e58a932c5)
AWSの可視化ツールCloudMapper

#AWSの可視化ツールCloudMapperのtagsオプション

CloudMapperでオプション（tags）が障害中で使用できないが、どうしても使用したい人の用  
https://github.com/duo-labs/cloudmapper/issues/652
ご指摘の通り、Lambda関数のタグの取得に修正が必要とのこと
※早く修正していただけることを願いしますｗ


Lambda関数はいいからタグオプションで絞り込みたい人向け

prepare.pyの388行目あたりをコメントアウトすれば、とにかく動く！

```commands/prepare.py
-    # Lambda functions
-    for lambda_json in get_lambda_functions(region):
-        node = Lambda(region, lambda_json)
-        nodes[node.arn] = node
+    # # Lambda functions
+    # for lambda_json in get_lambda_functions(region):
+    #     node = Lambda(region, lambda_json)
+    #     nodes[node.arn] = node
```
HTML+JavaScript の keydown で使える特殊キーの件

# 概要

とある web アプリを書いていまして。F1 ~ F12 のどれかのキーで「書類の差替」機能を割り付けるという話がありました。
でまあレガシーな web アプリですので、IE 11 / Edge (Project Spartan) / FireFox / Chrome での対応が必要になり云々。

現状調査から手を付ける事にしました。

## charCode とブラウザーの機能との対応表

| キー | e.charCode | Chrome 79 | IE 11 | FireFox 72 |
|:-:|--:|---|---|---|
| F1 | 112 | ヘルプ | ヘルプ★ | - |
| F2 | 113 | - | - | - |
| F3 | 114 | - | ページ内検索 | ページ内検索 | 
| F4 | 115 | - | URL ドロップダウン | - |
| F5 | 116 | ページ更新 | ページ更新 | ページ更新 |
| F6 | 117 | URL 欄等フォーカス | URL 欄フォーカス | URL 欄フォーカス |
| F7 | 118 | - | カーソルブラウズ | キャレットブラウズモード★ |
| F8 | 119 | - | - | - |
| F9 | 120 | - | - | - |
| F10 | 121 | メニュー | プルダウンメニュー | プルダウンメニュー |
| F11 | 122 | Kiosk | Kiosk | Kiosk |
| F12 | 123 | 開発者コンソール | 開発者コンソール | 開発者コンソール |

### キャンセル可能性

`return false;` で既定の動作をキャンセル可能かどうか。

上の表で `★` を付けたキーの機能はキャンセルできませんでした。
WebViewでcssのvhが効かない時はLayoutParamsでheightを設定しよう

# タイトル通りなんだけど一応コード

        WebView webView = new CustomWebView(getActivity());
        parentLayout.addView(webView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

高さが設定されていないとvhは機能しない。
reactのコンポーネントの書き方メモ

## reactのコンポーネントの書き方


app.js

```react
import React from 'react';
import logo from './logo.svg';
import './App.css';

import TestComponent from './components/TestComponent.js';
import ButtonComponent from './components/ButtonComponent.js';

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload!!!!!.
        </p>
        <TestComponent text="うふふふ" />
        <TestComponent text="あははは" />
        <ButtonComponent text="あははは" bgColor="red" />
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default App;

```

TestComponent.js


```react

import React from "react";
import styled from "styled-components";


const TestComponent = props => {
  return (
    <Test>
      {props.text}
    </Test>
  );
};

const Test = styled.p`
  padding: 0 40px 40px 40px;
  font-size: 1.4rem;
`;

export default TestComponent;


```
派生開発の課題を解決するための工夫

派生開発の課題解決のために、取り組みをした。
その結果を、SQiPシンポジウムやSPI Japanで発表している。
ここに、発表資料をまとめておく。
課題と取り組み内容は、CESTの第233回技術交流会で共有している。

# 課題
## CESTの第233回技術交流会で共有した課題
http://www.ertl.jp/CEST/
![課題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243842/d259367e-ee6f-407a-6498-1b08eeb08c0e.jpeg)

### キーワード
* 影響範囲
* 仕様の組み合わせ
* 処理負荷
* 機能削除⇒早くなる影響
* どのテストに影響するか
* テスト項目構成管理
* 全テスト
* 自動化
* 検査機材（HILS）⇒揃わない
* 検査（テスト）観点
* コア資産への戻し方
* 移植性⇒他機種での使われ方（動作環境）
* メモリマップ
* ソフトウェアDRBFM
* 想定外の仕様⇒アーキテクチャ崩す⇔アーキテクチャ保つ
* 生産性⇒報告⇒しかられる
* 見積り
* 他の人が作ったもの
* ベースがいけてない

## 私が解決に取り組んだ課題
* 統合テストにおいて影響範囲に対する（回帰テストにおける）テスト漏れを防止する
* 「設計制約の変化から影響を受ける箇所」を対象に，変更箇所の特定漏れ防止を目的として，DRBFMで必要となる知識を検討したうえで，その知識を蓄積・活用可能とする
* テスト設計のレビューだけでは検出が困難な「変更箇所に対するテスト漏れ」を検出する
* 静的コード解析（影響波及パス抽出，CRUDマトリクス作成）の自動化を可能とする
* 検証の自動化が「簡単」かつ「早く」できる仕組みを構築する
* 保守開発の生産性向上のために，データ分析の結果から有効なアクションを起こし，確実に成果を出す

# 発表資料
* 統合テストにおいて影響範囲に対するテスト漏れを防止する「影響波及パス分析法」の提案  
https://www.juse.jp/sqip/symposium/archive/2017/day1/files/happyou_C1-1.pdf
* 欠陥混入メカニズムの知識を活用したDRBFMの提案  
https://www.juse.jp/sqip/symposium/archive/2018/day1/files/B2-1_happyou.pdf
* 派生開発におけるテスト漏れを防止するDifference Statement Coverage分析法の提案  
https://www.juse.jp/sqip/symposium/archive/2019/day2/files/A3-1_happyou.pdf
* 派生開発における影響分析の自動化に向けた取り組み事例 ～解析指向プログラミングアプローチの考案～  
http://www.jaspic.org/event/2018/SPIJapan/session3B/3B3_ID008.pdf
* CICI-FWの提案 ～簡単かつ早く検証自動化を進めるための手法～  
http://www.jaspic.org/event/2019/SPIJapan/session2B/2B1_ID002.pdf
* ゴールに繋がるアクションを生み出すデータ分析活動の事例 ～精度より成果～   
http://www.jaspic.org/event/2019/SPIJapan/session3C/3C3_ID019.pdf

# 参考資料
私の取り組みに最も影響を与えた書籍と講演資料
（その他の参考文献は、各論文・発表資料に記載）

* 清水吉男，「「派生開発」を成功させるプロセス改善の技術と極意」，技術評論社，2007
* 松尾谷徹，「テストから観た実体のモデリングと実装構造の評価～検証指向設計の実現に向けて～」，JaSST'15 Tokai，2015  
http://www.jasst.jp/symposium/jasst15tokai/pdf/S1.pdf

# CESTの第233回技術交流会で今回の話題提供をして再認識したこと・気づいたこと
* プロジェクトに、自動化エンジニアを配置したほうがよい（私はプロジェクトに自動化エンジニアを配置してうまくいった）
* 私が知らない・見たことがないコーディングテクニックがまだまだ多数ある（名古屋大学の高田先生はコーディングテクニックに関する引き出しをたくさんお持ちである）
* 派生開発の見積りの仕方や生産性の算出の仕方に悩んでいる方が意外といらっしゃる（私が実践したV字の左と右で生産性の計算の仕方を変えるという方法の情報展開は意外とよかった模様）
* 飛びぬけたエンジニアをどのように評価するか・どのように報酬を決めるかは課題（私は、よいアイデア・解をもっていない）
* 手法やツールを他プロジェクトや他組織に展開するのは難しい（私は、手法やツールの導入はそれなりにうまくやれていると思うが、手法やツールをうまく展開ができた成功体験がない）
* MBD・MATLAB/Simulinkに関する知見が必要だが、私は知識・経験が足りない。
* HILSなどのテスト装置・シミュレータに関する知見が必要だが、私は知識・経験が足りない。

#謝辞
発表資料に登場する自作ツールは、すべて@zarukishiさんが開発してくれました。ありがとうございます。
EasyAutocompleteを5行で日本語入力変換に対応させる

# オートコンプリート機能は日本語変換に対応していない
EasyAutocomplete:http://easyautocomplete.com/guide#sec-functions

## ドキュメント通りに実装してみる。

```js:hoge.js
  var options = {
    data: yakinikuData,
    getValue: "name",
    list: {
      match: {
        enabled: true
      },
    },
  };

  let autocomplete = $("#autoComplete");
  autocomplete.easyAutocomplete(options);
```

## ローマ字だけなら問題ない。動く。
![3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533120/3dd5be14-1445-2735-b090-5a7c96a99025.gif)


## 日本語変換してしまうと、狙い通りに動かない。

変換後の「焼肉」で検索したいのに、「やきにく」で検索される。

![4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533120/0ab270d3-8d8d-39f6-fc19-5c6e4c11723c.gif)


## 解決策

参考：https://github.com/pawelczak/EasyAutocomplete/issues/236
参考：https://developer.mozilla.org/ja/docs/Web/Reference/Events/compositionend
以下を追加する。

```js:hoge.js
  var options = {
    data: gon.gurunavis,
    getValue: "name",
    list: {
      match: {
        enabled: true
      },
    },
  };

  let autocomplete = $("#autoComplete");
  autocomplete.easyAutocomplete(options);

  // 以下を追加
  autocomplete.on('compositionend', function () {
    let evt = jQuery.Event("keyup");
    evt.keyCode = 41;
    autocomplete.trigger(evt);
  });

```

## 動いた

![5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533120/d300bf2a-2a9c-2f10-cb8c-76710dc10f23.gif)
rubyメモ

- 文字列を繋ぎ合わせる場合、+を使うことで繋ぎ合わせることが出来る。

```
input = "aaa" + "bbb" + "ccc"
puts input

"aaabbbccc"
```
- ""内で特定の記号で区切られた文字列を配列にし分割する。

```
input = "aaa;bbb;ccc;"
a = input.split(';');
a.each do |a|
  puts a
end

aaa
bbb
ccc
```
- 最初の文字を大文字にし、後の文字は小文字にする。

```
input = "aaabbbccc".capitalize
puts input

Aaabbbccc
```
- 文字列の順番を逆に並べ替える

```
input = "abcde".reverse
puts input

edcba
```
- 全ての文字列を大文字で返す。

```
input = "abcde".upcase
puts input

ABCDE
```
- 引数で渡された文字列の二乗の数を返す。

```
def aaa(input)
  input ** 2
end

bbb_input = 5
puts aaa(bbb_input)

25
```
ExoPlayerのv2.11で個人的に便利だと思ったやつ


# WakeLockを自動で取得

バックグラウンドでの安定して再生させるためにWakeLockを取得するわけですが、WakeLockは取得したままだと電池を消耗してしまうので再生状態に応じてWakeLockを自動で取得 / 開放してくれる機能が付きました。

> Add automatic WakeLock handling to SimpleExoPlayer, which can be enabled by calling SimpleExoPlayer.setHandleWakeLock (#5846). To use this feature, you must add the WAKE_LOCK permission to your application's manifest file.

使い方はかんたん。 `setHandleWakeLock` で `true` を設定するだけ

```kotlin
    SimpleExoPlayer.Builder(context).build().also {
        it.setHandleWakeLock(true)
    }
```

中を見てみると [WakeLockManager](https://github.com/google/ExoPlayer/blob/76962d50f1d80941d6768e4e765fa4ff010705e7/library/core/src/main/java/com/google/android/exoplayer2/WakeLockManager.java) という `WakeLock` を管理するクラスがいて、こいつが管理する模様。Streaming再生する場合は、 `WifiLock` も同じところで取るだろうから、 [#5846](https://github.com/google/ExoPlayer/issues/5846) のissueにかかれているように `WifiLock` も取れるオプションつけてくれるともっと嬉しかったですね。

# イヤホンが外れたら再生を止める

今まで、ブロードキャストで流れてくる `ACTION_AUDIO_BECOMING_NOISY` を受けとって自分で止める処理を書かないといけなかったですが、自動で止めてくれるオプションが入りました。

> Add automatic "audio becoming noisy" handling to SimpleExoPlayer, which can be enabled by calling SimpleExoPlayer.setHandleAudioBecomingNoisy.

使い方はかんたん。 `setHandleAudioBecomingNoisy` で `true` を設定するだけ

```kotlin
    SimpleExoPlayer.Builder(context).build().also {
        it.setHandleAudioBecomingNoisy(true)
    }
```

イヤホン外れても再生し続けるとかなかなかないと思うので、デフォルトでOnでもいいんじゃないかと思うオプションですね。BroadcastReceiverに登録・解除するのがまるっとなくなるのは良いですが、受信しているときにしている処理が停止しているだけなので、そのときに一緒に別の処理をしたい場合は自前で書くしか無いのがつらいです。
scalaのfinalとsealedの使い分け—フィールドをoverrideする場合


この記事ではScala 2.12.10を使っています。

以下のようにトレイトにフィールドを定義して、継承先でフィールドの値を固定しつつ、ファクトリメソッドでは任意の値を指定できるようにしたい時がありました。この時継承先の `case class Bar()` を `final` にするとコンパイルが通りません。もちろん `final` を外せば問題ないのですが今度はwartremoverが通りません。

```scala
trait Version { val version: Int }
final case class Bar() extends Version { override val version = 1 } // finalを使う
object Bar {
  def apply(v: Int): Bar = new Bar() { override val version = v }
}
// cmd6.sc:4: illegal inheritance from final class Bar
//  def apply(v: Int): Bar = new Bar() { override val version = v }
//                               ^
// Compilation Failed
```

そこでこのように `final` から `sealed` に変えるとコンパイルもwartremoverも通ります。[^1]

```scala
trait Version { val version: Int }
sealed case class Bar() extends Version { override val version = 1 } // sealedに変える
object Bar {
  def apply(v: Int): Bar = new Bar() { override val version = v }
}
// defined trait Version
// defined class Bar
// defined object Bar
```

### なぜ `final` ではうまくいかないのか

Scalaには `final` 指定子をクラスに適用するとサブクラス化が禁止されるのに対して、 `sealed` は _同じファイルで定義されているサブクラス以外_ は新しいサブクラスを追加できないというルールがあります。[^2]

今回前者の `final` を使ったパターンでは一見サブクラス化はしていないように見えますが、`object Bar` の `apply` 定義内でフィールドをoverrideしている箇所は内部的にサブクラスとして扱われるようです。これによって「 `final` 指定子をつけるとサブクラス化が禁止される」というルール通りの動きになっています。これは `scalac` の構文木を表示するオプションをつけて、以下のコードをコンパイルすることで確認できます。

```scala:example.scala
trait Version { val version: Int }
sealed case class Bar() extends Version { override val version = 1 }
object Bar {
  def apply(v: Int): Bar = new Bar { override val version = v }
}
```

コンパイル結果

```
$ scalac -Vprint:typer example.scala

# 一部省略...

  object Bar extends scala.AnyRef with java.io.Serializable {
    def <init>(): Bar.type = {
      Bar.super.<init>();
      ()
    };
    def apply(v: Int): Bar = {
      final class $anon extends Bar {
        def <init>(): <$anon: Bar> = {
          $anon.super.<init>();
          ()
        };
        private[this] val version: Int = v;
        override <stable> <accessor> def version: Int = $anon.this.version
      };
      new $anon()
    };
    case <synthetic> def apply(): Bar = new Bar();
```

この結果の中で `new Bar() { override val version = v }` に相当する箇所では `final class $anon extends Bar {...` と書かれているように `$anon` という新しいサブクラスが定義されているのがわかります。

というわけで一番最初に戻ると `final case class Bar()` と定義したあとに `object Bar` 内で `new Bar() { override val version = v }` と定義することで、内部的にサブクラスとして扱われます。そのためこの状況で `final` を使うとコンパイルエラーになり、 `sealed` ではサブクラス化ができるスコープが広がるためコンパイルが通るという結果になったのでした。


[^1]: ~~wartremoverのFinalCaseClassが有効になっていると `sealed` も許可されないはずなのですが…なぜか通ります。大元の状況としてはcirceの `@JsonCodec` を使っていて、プロジェクトの設定(build.sbt)ではFinalCaseClassは除外されているため、この状況のみで有効かもしれません。~~ ← FinalCaseClassでも `sealed` は許可されていました（詳細はコメントにて）
[^2]: Scalaスケーラブルプログラミング 第3版 pp. 197-198, pp. 278-279
【VSCode】ちゃんと拡張機能を入れたのに、MonoBehaviourだけ怒られる(動作には支障がない)

Code Spell Checker へホワイトリストとして登録すれば解決します。
(ちなみにVSCodeは2020/01にバージョンアップしているので、拡張機能含め諸々のアップデートの時間を考慮しましょー)
<img width="494" alt="b01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/21aeafe2-e652-364c-a8f3-b77f92216346.png">

この子が原因
<img width="321" alt="b02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/6719212b-f78b-a002-0852-d91ff4a966de.png">

---

やり方

ホワイトリストに入れたい、MonoBehaviourをマウスクリック
<img width="403" alt="b03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/29e06358-0d32-b539-231e-7ea193c19e26.png">

shift + cmd + P を押下

下図赤枠に
Add Word to User Dictionary と入力してエンター
<img width="590" alt="b04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/3b04b3ff-d81f-915a-c013-30c2cb23f2f5.png">

おしまい
角括弧[]を正規表現で置換

# 角括弧を置換したい

```

[abc]
```
を

```

"abc"
```
にしたい。

# エスケープすればいいよね？

```

$ echo [abc] | sed 's/[\[\]]/\"/g' 
[abc]
```

おや。

# 正解

こちらによると、

https://serverfault.com/questions/466118/using-sed-to-remove-both-an-opening-and-closing-square-bracket-around-a-string

```

$ echo [abc] | sed 's/[][]/\"/g' 
"abc"
```
できた。

# 理由

はこちら
https://www.gnu.org/software/sed/manual/sed.html#Character-Classes-and-Bracket-Expressions
「sed, a stream editor」
の
「5.5 Character Classes and Bracket Expressions」
によると、

> ‘]’
ends the bracket expression if it’s not the first list item. So, if you want to make the ‘]’ character a list item, you must put it first.

ということで、] は最初に配置する必要があるらしい。
SNSの緩和申請をやってみる


[前回の投稿](https://qiita.com/tomomomo/items/459ae9346928aab68bf7)にて、**SNSの緩和申請**が必要であることが判明しました。
**申請**と聞くと面倒な感じがしますが、しないとサービスとして使えないので、今回申請してみました。

## やってみる前に…
そもそも、なぜ制限があるのかといいますと、[AWSのサポートページ](https://aws.amazon.com/jp/premiumsupport/knowledge-center/sns-sms-spending-limit-increase/)では、以下に記載されています。

> Amazon SNS は、AWS アカウントがこのサービスを使って送信できるテキストメッセージ (SMS メッセージ) の量に上限を設けています。デフォルトでは、上限をひと月 1.00 USD に設定し、不正使用や悪用を防止しています。

SNSはユーザーにSMSやメールで通知します。
制限がないと、迷惑メールのように不特定多数の連絡先に通知できてしまうため、制限していると思われます。


## やってみる
実際にやってみましょう。
申請方法は[AWSのサポートページに載っている](https://aws.amazon.com/jp/premiumsupport/knowledge-center/sns-sms-spending-limit-increase/)ため、ここを参考にやってみました。

① [AWSのサポートセンターのページ](https://console.aws.amazon.com/support/home#/)にアクセスします。
　下記のページが表示されるので、 [Create case] をクリックします。
<img width="500" alt="ae9f6196-3e05-a113-b40b-08cda74b35b6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245973/03d90c7a-ca80-fdd4-a0b5-e612031b02cf.png">


</br>
</br>

② 問い合わせのケースを選択する画面が表示されます。
　今回は使用制限を引き上げるので、[Service limit increase] を選択します。
<img width="500" alt="62617f76-4107-3af8-fc9b-fa2b73a59bae.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245973/844c069e-9b89-afed-27b5-1fd986b88faf.png">


</br>
</br>

③制限を引き上げるAWSサービスについて書きます。
　「お客様はどのように選択しますか？」というのに何を書くか、わかりにくいですが、個人で使用する旨を書いておきました。
　開発者がSNS経由でユーザーに通知するにあたり、SMS・メールで通知するか、
　どうやってユーザーが電話番号、メールアドレスを開発者に連絡するかを書く項目だと認識しています。
<img width="500" alt="63775445-6118-d02f-c5be-bf4a9b59e2d2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245973/50d87628-640b-b21c-8809-45bc9f113e8e.png">


</br>
</br>

④引き上げる上限数を指定します。
　今回は検証も兼ねて、少し多めに申請しています。
<img width="500" alt="0b443f39-4800-51d0-49f9-f3a0d20939c1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245973/a13d7109-1aca-6967-6d19-4e89f0546cb7.png">

</br>
</br>

⑤ SNSを使っているサービスのユースケースを書きます。
　 書く上でのポイントは[AWSのサポートページ](https://aws.amazon.com/jp/premiumsupport/knowledge-center/sns-sms-spending-limit-increase/)に載っていますので、参考にして書きます。
<img width="500" alt="74c50eb5-97e4-c7d1-4e52-5a54f1f23cd2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245973/f2f5f958-0125-44b8-e3af-ede2fca8d6e8.png">


</br>
</br>

⑥画面下部の [Submit] をクリックします。
<img width="500" alt="26470e1a-fc9d-a467-4c33-37b67a78bc38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245973/86639588-68b7-211b-b5f2-a284ae867eec.png">


</br>
</br>

これで完了です。
先の手順で書いた内容が表示されます。
<img width="500" alt="9ea60a01-0aac-d3ca-6b44-7e5107b6cbd0.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245973/6571fec7-a3fa-178a-02e1-b17b9fec6872.png">


</br>
</br>

その後、問い合わせで使用したメールを見ると…
問い合わせから約1時間で「10$に引き上げたよ！」というメールが来てました。早い…
<img width="500" alt="703af2c7-9c66-1e2b-21e7-658adbaa7fa4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245973/8b89e417-a73f-7bd3-2b94-9bc82d0a4a54.png">

---

## まとめ

今回、SNSの緩和申請を試してみました。
これで、「上限きたから緩和申請して」と言われても、すぐ対応できるはず…はず…
**申請**と聞くと、面倒な感じがありましたが、サイトでポチポチとクリック、
入力するだけでしたので、思ってたほど面倒ではありませんでした。むしろ簡単でした:relaxed:
今回は個人であること、引き上げたい制限が小さいこともあり、すぐ申請が通りましたが、
企業の場合、引き上げたい制限が大きい場合、申請が通るのにどのくらいかかるか気になりました。:rolling_eyes::rolling_eyes:
Visual Studio Codeを用いて、Gitのbranchを視覚的に管理する

##Visual Studio CodeはGitを使うのに便利
今回使用するVSCodeのバージョンは、2019の1.41.1です。

addやcommitの操作方法などはすでにたくさんの人がアップしていたため
branchの管理という方向で記録したいと思います。

##プラグインをインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581242/4ac5c175-46c4-b24d-63a7-4c1d20355937.png)
Git Graphというプラグインをインストールします。
特別な操作は必要ありません。.gitディレクトリが存在するディレクトリを勝手に検知してくれます。

##実際に使ってみる
まずはVSCodeでファイルを編集して…
![git.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581242/f6419779-2192-dd56-06eb-a90e62f4a98e.png)
〇印の＋のところを押すことでステージングできます。
![git2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581242/45d1cb84-a6c1-b501-044b-a9cb205d542f.png)
コミットするには四角い枠のところのメッセージを入力して〇印のチェックマークを押します。

![git43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581242/0bbca16a-5a22-20d2-19d2-36f04009458c.png)
GitHubにプッシュや、逆にプルをするときは、分かりにくいですが丸印の｢・・｣マーク(なぜ二個？)
を押すと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581242/c41bc598-35bd-bf0c-48e2-5372c05fa4f5.png)
このようなプルダウンが出るのでそこからできます。
(ブランチを発行したいときはチャックアウト先というのを選びます。ブランチを発行ではなぜかうまくいかないので注意してください。) 
ブランチを切り替えるときは、グラフにあるブランチ名をダブルクリックするのが一番楽ですね。

![git3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581242/140e32ae-c25f-17ee-1533-3db2b628277a.png)
一通り手続きをこなすとこんな感じで枝が伸びていくので視覚的に今の地点が見やすくなってます。

HEADがどこかをすぐに視覚化できるところがいいですね。

##GUI管理のメリット・デメリットまとめ
###メリット
・現在のブランチの状態が非常にわかりやすい
・Gitコマンドがあまりわからない場合でもGitを使える
・コンフリクトしたときにどちらを取り込むか選択ができるので楽

###デメリット
・プル・プッシュ・ブランチあたりの操作が若干わかりにくい
・add(ステージング)が一つずつしかできない
・頼りすぎると、一生コマンドを覚えられない

こんな感じかと思います。コンフリクトした場合の画像がないのは、意図的にコンフリクトを起こすのが結構面倒なのと、出てくれば簡単にわかると思うので割愛させていただきました。

GUIでGitを管理することで開発を手軽に行えるかもしれません。
(とくに技術知識よりも管理に比重が置かれたマネジメント層の方など)

ぜひ試してみてください。
#Stripe のテストモードのアカウントで顧客にメール送信する

# メールが送信されない？

>Emails are disabled in test mode: this invoice would be sent to to user@example.com in live mode

テストモードではインヴォイスのメール送信はされないというようなことが書いてあるが？ 自動送信が無効ということだろうか。

![image](https://user-images.githubusercontent.com/13635059/74207404-d8082400-4cc2-11ea-9ec4-b04c4eb16aac.png)

# ダッシュボードから直接送信

てきとうに定期支払、インヴォイスなどを作った後に、ダッシュボードから直接のメール送信ができるようだ。

![image](https://user-images.githubusercontent.com/13635059/74206408-9bd2c480-4cbe-11ea-9041-35182a04d129.png)

![image](https://user-images.githubusercontent.com/13635059/74207383-bdce4600-4cc2-11ea-9ad6-52dabe587279.png)

# 言語設定

顧客単位で言語設定ができる。この設定がメール文面、PDFダウンロードに反映されるようだ。

![image](https://user-images.githubusercontent.com/13635059/74207480-287f8180-4cc3-11ea-8ba5-7461d01b21ba.png)


# 英語設定の場合

![image](https://user-images.githubusercontent.com/13635059/74207503-40570580-4cc3-11ea-9753-d7f529a02cc5.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2979








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Dockerでproxyサーバ

## はじめに
Dockerでsquidによるproxyサーバを構築。
特別なことはしてません。

## 対象機器および環境

### 検証環境
* CentOS8(8.1.1911)
* Docker(19.03.5)
* squid(4.4)


## 作業内容

### firewallでmasqueradeを設定

```
firewall-cmd --add-masquerade --zone=public --permanent
firewall-cmd --reload
```

### Dockerイメージの準備

再利用できるようにイメージをつくっておきます。
Dockerfileと設定ファイルを置くための適当なディレクトリを作成しておきます

```
mkdir -p /opt/docker/proxy
cd /opt/docker/proxy
```

#### Dockerfileを作成

```:/opt/docker/proxy/proxy.df
FROM centos:centos8
ENV TZ='Asia/Tokyo'
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime ; \
    dnf -y update ; dnf install -y squid ; \
    sed -i -e "s/http_port 3128/http_port 8080/" /etc/squid/squid.conf ;  \
    systemctl enable squid ; \
    dnf -y install rsyslog ;
COPY rsyslog.conf /etc
CMD [ "/usr/sbin/init" ]
```


#### syslog転送用の設定

ローカルのログファイルの変更を検知するモジュール `imfile` を利用して、リモートへsyslogを転送します。
転送先は別のエントリで作成した syslogサーバにUDP:514で指定しています。
ネットワークサービス用のDockerネットワーク `infraserv-network` に所属させているため、 `syslog` というホスト名で転送ができるようになっています。

```:/opt/docker/proxy/rsyslog.conf
module(load="imfile")
input(type="imfile"
      file="/var/log/squid/access.log"
      tag="pseudolog_squid_access_log"
      facility="local0"
      severity="notice")
:syslogtag, isequal, "pseudolog_squid_access_log" @syslog:514
```


### Dockerfileからイメージをビルドしてコンテナ作成

Dockerfileが作成できたら、ビルドします。

```
docker build --force-rm -t infraserv:proxy . -f ./proxy.df && \
docker run --cap-add sys_admin --security-opt seccomp:unconfined  -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
  --network infraserv-network -it -d --name proxy --hostname proxy  -p 8080:8080 infraserv:proxy
```


もし、dnfでコケたら、以下のコマンドが効くかもしれない。

```
# firewall-cmd --add-masquerade --permanent
# firewall-cmd --reload
```


### 動作確認

診断くん、などでチェック。
http://taruo.net/e/
【Unity】イメージエフェクトを使用しない簡易GlowShader

なるべく軽量にするため、イメージエフェクトを使用せずに光の玉を表現させる一例です。

![gif_animation_005_m.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179625/e8f667cf-da57-a1e5-25a4-9cbe5288ffa9.gif)
一枚の板で、円をぼかし拡大縮小して
光っている風に見せかけてます。
## vertex

どこから見ても同じように見せるようにビルボードにします。

```

Tags{ "Queue" = "Transparent" "RenderType" = "Transparent" }

・・・

struct appdata
{
    float4 vertex : POSITION;
    float2 uv : TEXCOORD0;
};
 
struct v2f
{
     float2 uv : TEXCOORD0;
     float4 vertex : SV_POSITION;
};

・・・

v2f vert (appdata v)
{
  v2f o;

  o.vertex = mul(UNITY_MATRIX_P,
      mul(UNITY_MATRIX_MV, float4(0.0, 0.0, 0.0, 1.0)) 
      + float4(v.vertex.x, v.vertex.y, 0.0, 0.0)
      * float4(0.5, 0.5, 1.0, 1.0)); // XYのスケーリング
}
```
ビルボードについての詳細はこちらの記事が詳しいです。
[常にカメラを向くオブジェクトをGPUで実装](https://qiita.com/hadashiA/items/2c9271f47eb70eb9eb31)

## fragment

四角形からはみ出ない程度に円を描いて良い感じにぼかし、アニメーションさせています。
形状によってはテクスチャのほうがきれいに表現できるかと思います。

```
fixed4 frag (v2f i) : SV_Target
{
    float4 col = _Color;
 
    float dist= length(i.uv - 0.5) * 2;
    // 外に行くほど薄くなるようぼかす
    col *= saturate(1 - dist);
    // 中心の光具合を強調・拡縮アニメーション
    col *= (1 - dist) * lerp(1, 3, sin(_Time.z) * 0.5 + 0.5);

    col = saturate(col);
 
    clip(col.a - 0.0001);
    return col;
}

```

## アルファブレンド

背景と馴染むようこれもよい感じに調整。
サンプルの場合は

```
Blend SrcAlpha DstAlpha
```

ちなみに確認時は以下のようにしておくとmaterialで調整ができるので便利です。

```
Properties
{
    [Enum(UnityEngine.Rendering.BlendMode)]_BlendSrc("Blend Src", Float) = 0
    [Enum(UnityEngine.Rendering.BlendMode)]_BlendDst("Blend Dst", Float) = 0
}
・・・

Blend [_BlendSrc][_BlendDst]
```

## 利用できる場面

結局板なので、角度によって他のオブジェクトに板が遮られたりすると
切れ目が不自然に見えたりしまいます。
近距離のオブジェクトとの兼ね合いでどのくらい許容できるか次第かと思います。
Dockerでtftpサーバ

## はじめに
Dockerでtftpサーバを構築。
特別なことはしてません。

## 対象機器および環境

### 検証環境
* CentOS8(8.1.1911)
* Docker(19.03.5)
* tftp-server(5.2)
* xinetd(2.3.15)


## 作業内容

### firewallでポート許可
tftpサービスを待ち受けるようにサービスを許可しておきます

```
firewall-cmd --add-service=tftp --zone=public --permanent
firewall-cmd --reload
```

### Dockerイメージの準備

再利用できるようにイメージをつくっておきます。
Dockerfileと設定ファイルを置くための適当なディレクトリを作成しておきます

```
mkdir -p /opt/docker/tftp
cd /opt/docker/tftp
```

#### Dockerfileを作成

```:/opt/docker/tftp/tftp.df
FROM centos:centos8
RUN dnf -y update ; dnf -y install tftp-server xinetd
COPY tftp /etc/xinetd.d/tftp
CMD [ "/usr/sbin/init" ]
```

#### xinetdの設定

tftpをxinetd経由で起動するために、設定ファイルを作成しておきます

```:/opt/docker/tftp/tftp
service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -c -u root -s /var/lib/tftpboot
        disable                 = no
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}
```

### Dockerfileからイメージをビルドしてコンテナ作成

Dockerfileが作成できたら、ビルドします。
tftpは最初に69/udpで接続しますが、その後ポート番号をネゴってデータ転送するので、bridgeだとポート転送しにくい。
ので、hostネットワークに接続してしまいます。

```
docker build --force-rm -t infraserv:tftp . -f ./tftp.df && \
docker run --cap-add sys_admin --security-opt seccomp:unconfined  -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
  --network host -it -d --name tftp --hostname tftp   infraserv:tftp
```



### 動作確認

手元にあったCiscoのルータで確認

```
Rdc01#copy run tftp://10.254.10.251/rdc01-config
Address or name of remote host [10.254.10.251]?
Destination filename [rdc01-config]?
!!
11944 bytes copied in 1.112 secs (10741 bytes/sec)

Rdc01#copy tftp://10.254.10.251/rdc01-config flash:
Destination filename [rdc01-config]?
Accessing tftp://10.254.10.251/rdc01-config...
Loading rdc01-config from 10.254.10.251 (via Vlan10): !
[OK - 11944 bytes]

11944 bytes copied in 0.652 secs (18319 bytes/sec)

Rdc01#
```
VRで飛行移動の開発で調べた酔い対策

## はじめに
Unityで一人称視点のVRアプリに飛行移動の機能を開発するに当たって、
主に移動・旋回機能での酔いに関して調べたことと、個人的な感想となります。

確認したデバイスは
Oculus Rift s/Oculus Quest/HTC VIVE

また基本的な対策に関しては以下を参考にさせていただいたので、
詳細は参照ください。

- [VR等のコンテンツ制作技術活用ガイドライン2018](https://www.vipo.or.jp/news/15212/)
- [VR酔い防止のための真のルール](https://qiita.com/tarosuke@github/items/673cbf8f8c1fe08f488c)
- [◆VR酔いを防ぐにはどうすればいい！？～エンジニア視点で考える原因と対策～](https://www.vr-creek.com/blog/vr_sickness)
- [『エースコンバット7』のVR酔いや違和感を排除する戦いの数々！重要な“没入ライン”を越えるためのヒントは『ギャラクシアン3』にあった!?【CEDEC 2019】](https://www.famitsu.com/news/201909/05182720.html)
- [日本列島VRとHoleLenz](https://www.slideshare.net/KeiVoxel/vrholelenz-73632672)


## 移動方法
元々アプリの移動方式は地上移動のみでテレポート型だったが
飛行移動に関してはスティックの前後操作で前進/後退する仕組み。(空間移動型)
ただやはりこの方式になると酔いに強い/弱い人で結構差が出てくる。

### 対策

##### 脳と体の同期ズレの軽減。見ているものと身体の動きが違うと感じると酔う。
速度は遅く等速直線運動であるほうが酔いにくいとのことだが、移動範囲もあるのでそこそこの速度が必要。
ということで加速度を加えて、後退速度は前進時より低速で移動するように調整。
この辺りは特に日本列島VRを参考にさせていただいた。

##### 次の動きを「予測」させて酔いを軽減
進行方向については、HMDで向いてる方向に移動という手法もあるが、
今回は既存の仕組みでVRレーザーポインターを装備していたため、上下前後ポインタの向きに合わせて進むようにした。
向きの指針として認識もしやすいため、進む方向の「予測」の役割を果たせているかと思う。

## 旋回
スティック左右操作での自分の向きを回転

### 対策
これに関しては常にスナップターン方式(スティックの左右操作一回ごとに30度ずつ回転)
<b><font color="Red">停止・低速状態でスムーズ回転はかなりきつい。</font></b>
速度がでている状態であればかなり軽減される。(ただ本当にそこそこな速度が出てる状態でないときつめ。)
機能としては旋回できた方が楽しい体験になるが、今回一番酔い影響が強いと感じたところでもあった。

## その他の対策等
今回は基本的に上記のような対策を行ったが、
さらに酔いを軽減させる方法としては

- 手前に固定のパネル・UIなどを表示。(効果高そう)
- 向きをさらに意識しやすいよう矢印を表示。
- 移動中は速度に応じて視野を狭める類のエフェクトを追加。
- 移動停止時の減速。(未検証)

など。
また当アプリは特にアクション性も低く、周りの動きも激しくないため、
アプリの特性にもよるのかとも思います。
Vue.jsでドロワーメニュー（スライドメニュー）を実装

codesandboxに書いてみたので、動きはこれを見ていただけると！（App.vue参照）
https://codesandbox.io/embed/objective-flower-kuov7?fontsize=14&hidenavigation=1&theme=dark

以下、ざっくり内容をざっくりメモ程度に。

```vuejs:template
<template>
  <div id="app">
    <div>
      <button @click="openDrawerMenu">ボタン</button>
    </div>
    <transition name="right">
      <div v-if="drawerFlg" class="drawer-menu-wrapper">
        <div class="drawer-menu">
          <!-- ここにメニューの内容を書いていく -->
        </div>
      </div>
    </transition>
  </div>
</template>
```

```vuejs:script
<script>
export default {
  name: "App",
  data() {
    return {
      drawerFlg: false
    };
  },
  methods: {
    openDrawerMenu() {
      this.drawerFlg = true;
    }
  }
};
</script>
```

``` vuejs:style
<style>
//右から出したい場合
.right-enter-active, .right-leave-active {
  transform: translate(0px, 0px);
  transition: transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms;
}
.right-enter, .right-leave-to {
  transform: translateX(100vw) translateX(0px);
}

//左から出したい場合
.left-enter-active, .left-leave-active {
  transform: translate(0px, 0px);
  transition: transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms;
}
.left-enter, .left-leave-to {
  transform: translateX(-100vw) translateX(0px);
}

//以下、メニューの形に合わせて良い具合に変更してください
.drawer-menu-wrapper {
  position: absolute;
  z-index: 10;
  top: 0;
  right: 0; //右に出す場合
  left: 0 //左に出す場合
  width: 50%;
  height: 100%;
  background-color: white;
}
.drawer-menu {
  padding: 24px;
}
</style>
```


参考: https://qiita.com/Nexus0831/items/9dbbac367a653fbd8ba4
gitの使い方を可視化して遊びながらgitの勉強ができるサービス[初心者向け]

gitを初めて触り始めた頃は今ではもう思い出せないほど、
よくいう「なにが分からないか分からない」というような状況だった気がしています。

そんな時に便利なgitのブランチや樹形図が複雑になったて理解できない時に助かるサービスがこちら

## learngitbranching

https://learngitbranching.js.org/

<img width="1383" alt="スクリーンショット 2020-02-12 12.32.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/e7065298-eb9a-8b68-c039-7dbe9c3de19b.png">

コマンド毎などに各セクションが別れていて、分からない内容をWeb上でコマンドを試しながら実行できます。
樹形図も表示されるので、いきなりコマンドやCLIツールで触り始めのが怖いって方にはおすすめかなと思います。

<img width="898" alt="スクリーンショット 2020-02-12 12.31.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/f536b9be-406b-4c32-ff51-9f2ef09db366.png">

モーダルのデザインがMacライクなスタイルになっているのもこだわりを感じて良いなと思います。
Rails6 のちょい足しな新機能を試す 120（Rails.logger in Fiber編)

# はじめに

Rails 6 に追加された新機能を試す第120段。 今回は、`Rails.logger in Fiber` 編です。
Rails 6 (と Rails 5.2.4.1) では、Fiber の中で `Rails.logger.local_level` でログレベルを変更しても、それが親(Fiber の親)に影響を与えないようになっています。

Ruby 2.6.5, Rails 6.0.2.1, Rails 5.2.4.1, Rails 5.2.3 で確認しました。 (Rails 6.0.0 でこの修正が入っています。)

```shell
$ rails --version
Rails 6.0.2.1
```

今回は、適切な利用例を思いつきませんでした。controller を1つ作って、 `index` の中で、 Fiber を使って確認します。

# Rails プロジェクトを作る

Rails プロジェクトを新たに作成します。

```shell
$ rails new rails_sandbox
$ cd rails_sandbox
```

# Home コントローラを作る

`index` ビューを持つ `Home` コントローラを作成する。

```shell
$ bin/rails g controller Home index
```

# Controller を修正する

Controller を修正し、 `index` の中で、Fiber を使います。 `Fiber#resume` を呼ぶ前後で、Rails.logger

```ruby:app/controllers/home_controller.rb
class HomeController < ApplicationController
  def index
    Rails.logger.level = 1
    Rails.logger.info("[Before] Rails.logger.debug? #{Rails.logger.debug?}")

    Fiber.new do
      Rails.logger.local_level = 0
      Rails.logger.info("[Fiber] Rails.logger.debug? #{Rails.logger.debug?}")
    end.resume

    Rails.logger.info("[After] Rails.logger.debug? #{Rails.logger.debug?}")
  end
end
```

# rails server を実行して確認する

`rails server` を実行し、 http://localhost:3000/home/index にアクセスすると以下のように出力されます。

```
[Before] Rails.logger.debug? false
[Fiber] Rails.logger.debug? true
[After] Rails.logger.debug? false
```

# Rails 5 では

5.2.4 では、Rails 6 と同様の動作をしますが、 Rails 5.2.3 では、以下のように `Fiber#resume` 実行後、元に戻りません。

```
[Before] Rails.logger.debug? false
[Fiber] Rails.logger.debug? true
[After] Rails.logger.debug? true
```


# その他

どうもよくわからない事象が1つ。
以下のように、 `Fiber.new` のブロックの中を `Rails.logger.info` から `Rails.logger.debug` に修正します。

```ruby:/app/
...
    Fiber.new do
      Rails.logger.local_level = 0
      Rails.logger.debug("[Fiber] Rails.logger.debug? #{Rails.logger.debug?}")
    end.resume
...
```

そうするとなぜか以下のようにFiberの中のログ出力が無視されてしまいました。

`Rails.logger.debug?` が `true` になるので、 `Rails.logger.debug` でも出力されるかと思ったのですが...

```
[Before] Rails.logger.debug? false
[After] Rails.logger.debug? false
```

# 試したソース

https://github.com/suketa/rails_sandbox/tree/try120_logger_in_fiber


# 参考情報

* [Make ActiveSupport::Logger Fiber-safe](https://github.com/rails/rails/pull/36753)
HTML5プロフェッショナル認定試験レベル1を受験してみた

# HTML5プロフェッショナル認定試験レベル1 受験レポート

2020/2にHTML5プロフェッショナル認定資格Level1を受験しました。

資格を受験するのはかれこれ2年ぶりくらい？ぶりで学習方法も忘れているような状態でしたが、
ちょっと新鮮な気持ちだったので忘れないうちに備忘録として残しておこうと思います。


## 業務経歴

受験時点での私の業務経歴を簡単にまとめました。

・基本的にサーバーサイドを担当
・Javaで2.5年ほど開発案件に携わってきた
・FWとしてはStruts1・Seasar2 → Springのマイグレーションで触れるもののみ

といったフロント系の知識とは疎遠の仕事をしてきたサーバーサイドエンジニアです。

## 受験経緯

2018年秋・冬頃に社内でHTML5の勉強会を開催いただいて、そのときに受験をオススメしてもらいました。
当時は業務についていくのがやっとで全く余裕がなかったため、勉強会から約1年後に受験となってしまいましたが、
「せっかく学習したのでなにか形に残るものがほしい」、「体系的なHTML・CSSの知識を身に付けたい」と思った次第です。

また、基本的に業務ではサーバーサイドを担当していますが、
少なからずHTMLの内容を修正したりする場面もあったので役立つのでは？と考えていました。

## 学習方法

合格者の方の記事を読んだりしながらいろいろ参考にさせていただきました。
私は主に以下のような順番で学習に取り組んでいました。

### 1. [HTML5プロフェッショナル認定試験 レベル1 対策テキスト＆問題集　Ver2.0対応版](https://www.amazon.co.jp/exec/obidos/ASIN/B07485SSV3/neos21-22/)

まずはじめは全般的に単語や文法を覚えるところからでした。
社内の勉強会でもこの本に沿ってカリキュラム化されていたので、それを復習しつつ頭に叩き込んでいきました。

CSSは覚えるプロパティが結構多いので、時々くじけながら頑張っていました。

### 2. Ping-t

会社で勉強用にアカウントを用意してもらいました。

問題としては約500問ほど収録されていて、
はじめは銅だったものが1回正解で銀・2回正解で金と学習の進捗が非常にわかりやすいのが良いところです。
(逆に間違えると銀や銅に戻る仕組みになっています)
覚えた要素やプロパティの知識を定着させるのに抜群の効果を発揮するのでオススメできます。
※Ping-tのまわしものではないです

![ping-t.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492152/c2e11b22-b0f3-e8b0-eb5a-52b8ba7822ff.png)


これを通勤中や夜寝る前に20問程度ずつ解いていました。

### 3. [HTML教科書 HTML5プロフェッショナル認定試験 レベル1 スピードマスター問題集 Ver2.0対応](https://www.amazon.co.jp/HTML%E6%95%99%E7%A7%91%E6%9B%B8-HTML5%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93-%E3%83%AC%E3%83%99%E3%83%AB1-%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E5%95%8F%E9%A1%8C%E9%9B%86-Ver2-0%E5%AF%BE%E5%BF%9C-ebook/dp/B079PMR94Q/)

以前受験していた方からも評判もよかったので、こちらを使っていました。
Ping-tとは少し違ったテイストの問題が収録されていたりするので、問題慣れするために効果的だったと思います。

本番の試験では予習してた問題と少し雰囲気が違う出題がされたりするという声もあったので…

## 試験概要

試験時間：80分
問題数：60問
受験料：15,000円(税別)
試験方式：コンピュータベーストテスト（CBT）
認定の有意性期限：5年間

時間としては十分すぎるくらいあるので、見直しも丸々できると思います。
口コミから予想はできていましたが、問題的にはPing-tなどよりも難しかったです。
2問程度記述式のものがあったり、見たことないような内容の問題も数問出題されます。


## 試験結果

結果：**合格**
得点：80点
※合格ラインは70点

## 実際に受験してみた感想

事前情報通り見たことない問題もあったので、はじめは面食らってしまいました。
記述式の問題に関しては全くこれといった準備はしていませんでしたが、難なく解けるようなレベルだと思います。

一旦回答が終わって見直しする前の時点では「もしかしたらやばいかも…？」と思ってしまいましたが、
問題自体を振り返るとPing-tの内容的に近いものも時々あったので、段々情緒が安定しました。
なにはともあれ無事合格できて今はホッとしています。

一旦資格学習からはなれてアマゾンプライムでアニメを見まくっているところですが、
これを機に定期的に資格受験は継続していきたいなと思っています。
また、会社から資格奨励金も出るのでそれで焼肉でも食べにいこうと思います。


おしまい
【環境構築】vagrant upでエラー

``vagrant up``でエラー

``` ruby:ターミナル
$ vagrant up
/opt/vagrant/embedded/gems/2.2.7/gems/vagrant-2.2.7/lib/vagrant/util/which.rb:37: warning: Insecure world writable dir /usr/local/opt in PATH, mode 040777
Bringing machine 'homestead' up with 'virtualbox' provider...
==> homestead: Importing base box 'laravel/homestead'...
Progress: 90%There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["import", "/Users/namari/.vagrant.d/boxes/laravel-VAGRANTSLASH-homestead/9.2.0/virtualbox/box.ovf", "--vsys", "0", "--vmname", "ubuntu-18.04-amd64_1581476571710_32924", "--vsys", "0", "--unit", "11", "--disk", "/Users/namari/VirtualBox VMs/ubuntu-18.04-amd64_1581476571710_32924/ubuntu-18.04-amd64-disk001.vmdk"]

Stderr: 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Interpreting /Users/namari/.vagrant.d/boxes/laravel-VAGRANTSLASH-homestead/9.2.0/virtualbox/box.ovf...
OK.
0%...
Progress state: NS_ERROR_INVALID_ARG
VBoxManage: error: Appliance import failed
VBoxManage: error: Code NS_ERROR_INVALID_ARG (0x80070057) - Invalid argument value (extended info not available)
VBoxManage: error: Context: "RTEXITCODE handleImportAppliance(HandlerArg *)" at line 1118 of file VBoxManageAppliance.cpp
```

# 原因
容量不足だった・・・・・
1G開けたらいけた！
Apple ScriptでMacを終了・再起動する



確認ダイヤログを表示しないでシャッタダウン

	osascript -e 'tell app "System Events" to shut down'

確認ダイアログ(1分)を表示してシャットダウン

	osascript -e 'tell app "loginwindow" to «event aevtrsdn»'

確認ダイヤログを表示しないで再起動

	osascript -e 'tell app "System Events" to restart'

確認ダイアログ(1分)を表示して再起動

	osascript -e 'tell app "loginwindow" to «event aevtrrst»'

確認ダイアログ(1分)を表示してログアウト
	
	osascript -e 'tell app "System Events" to log out'
expo-cliというかnpmでconfigure errorが出たときの対応


いつも使ってるexpo-cliを利用しようとしたら、下記のようなエラーに遭遇した。

```bash
gyp WARN EACCES current user ("nobody") does not have permission to access the dev dir "/Users/xxxxxx/Library/Caches/node-gyp/12.3.1"
gyp WARN EACCES attempting to reinstall using temporary dev dir "/Users/xxxxxx/.anyenv/envs/nodenv/versions/12.3.1/lib/node_modules/expo-cli/node_modules/chokidar/node_modules/fsevents/.node-gyp"
gyp WARN install got an error, rolling back install
gyp WARN install got an error, rolling back install
gyp ERR! configure error
gyp ERR! stack Error: EACCES: permission denied, mkdir '/Users/xxxxxx/.anyenv/envs/nodenv/versions/12.3.1/lib/node_modules/expo-cli/node_modules/chokidar/node_modules/fsevents/.node-gyp'
gyp ERR! System Darwin 19.3.0
gyp ERR! command "/Users/xxxxxx/.anyenv/envs/nodenv/versions/12.3.1/bin/node" "/Users/xxxxxx/.anyenv/envs/nodenv/versions/12.3.1/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /Users/xxxxxx/.anyenv/envs/nodenv/versions/12.3.1/lib/node_modules/expo-cli/node_modules/chokidar/node_modules/fsevents
gyp ERR! node -v v12.3.1
gyp ERR! node-gyp -v v5.0.5
gyp ERR! not ok
```


結論から言えば、下記のように--unsafe-permオプションをつけて実行すればインストール自体はできた。

```bash
sudo npm install --unsafe-perm -g expo-cli
```

基本的にroot権限でnpm installすることは推奨されていないようで、場合により--unsafe-permオプションが必要なようです。
Node.js + Express + express-session でセッション変数を使ってみる

# Express + express-session でセッション変数を試す

## 事前準備として、フォルダ作ったりパッケージインストールしたりする

```bash
mkdir exps_test
cd exps_test
npm install --save express \
                   express-session \
                   body-parser \
                   ejs
```

## http で確認したいので、 index.ejs を作っておく
index.ejs は view として作るので、views フォルダを作っておく
### views フォルダ内に index.ejs を作る

```bash
mkdir views
cd views
nano index.ejs
```

### index.ejs の内容はコレ

```html:index.ejs
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
    <p><%=message %></p>
    <form action="/" method="post">
        <input type="text" name="message">
        <button type="submit" name="button">send</button>
    </form>
    <a href="/">LastUpdateData</a>
</body>
</html>
```

### exps_test フォルダに戻って、nodeで起動するための index.js を作る

```bash
cd ../
nano index.js
```

### index.js の内容はコレ

```javascript:index.js
const express = require('express');
const ejs = require('ejs');
const bodyParser = require("body-parser");
const session = require("express-session");
const app = express();

app.set('ejs', ejs.renderFile);

app.use(bodyParser.urlencoded({ extended: false }));

app.use(session({
    secret: "secret",
    resave: false,
    saveUninitialized: true,
}));

app.get('/', (req, res) => {
    let message = 'no message';
    if (req.session.message != undefined) {
        message = "LastUpdateData：" + req.session.message;
    }
    res.render('index.ejs', {
        message: message
    });
});

app.post("/", (req, res) => {
    let message = req.body.message;
    req.session.message = message;
    res.render('index.ejs', {
        message: message
    });
});

app.listen(3000, () => {
    console.log('Example app listening on port 3000!');
});
```

## node.js で index.js を起動する

```bash
$ node index.js
Example app listening on port 3000!
```

### ブラウザでアクセスする

↓こんな感じになるはず
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194966/ade60381-d29b-bd15-f9c9-4a5891f24dbf.png)

何かしらメッセージを入力してSendすると、no message の所が変わります。
LastUpdateData をクリックすると、最後に入力した内容が表示されます。
ブラウザを閉じるとデータが消えるので no message に戻るはず。
node を再起動してもデータが消えるので no message に戻ります。

session 設定しているとこに cookie の設定を足すと、データの有効期限が付けられたりします。
↓こんな感じにすると5秒後に LastUpdateData をクリックした場合、 no message に戻ってます。

```
app.use(session({
    secret: "secret",
    resave: false,
    saveUninitialized: true,
    cookie: { maxAge: 5 * 1000 }
}));
```

# 参考
- express-sessionでセッションを利用する[Express][node.js]
  - https://noumenon-th.net/programming/2018/12/23/express-session/
緯度経度から地理院タイルをダウンロードする

国土地理院は地図や航空写真等を[地理院タイル](https://maps.gsi.go.jp/development/ichiran.html)という形で提供している
取得するにはタイル座標という緯度経度ではない座標値が必要なので，それを計算する．
[OpenStreetMapのwikiにそのコード](https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Python)があるので拝借．

``` python
#from
#https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Python

import math

#緯度経度からタイル座標を計算
def deg2num(lat_deg, lon_deg, zoom):
    lat_rad = math.radians(lat_deg)
    n = 2.0 ** zoom
    xtile = int((lon_deg + 180.0) / 360.0 * n)
    ytile = int((1.0 - math.asinh(math.tan(lat_rad)) / math.pi) / 2.0 * n)
    return (xtile, ytile)

#今回は使わないけど，タイル座標から緯度経度
def num2deg(xtile, ytile, zoom):
    n = 2.0 ** zoom
    lon_deg = xtile / n * 360.0 - 180.0
    lat_rad = math.atan(math.sinh(math.pi * (1 - 2 * ytile / n)))
    lat_deg = math.degrees(lat_rad)
    return (lat_deg, lon_deg)
```

地理院タイルからのダウンロードはこんな感じ

``` python
import requests
def download_from_gsi(z, x, y, def_url, fname):
    url = def_url.format(z,x,y)
    response = requests.get(url)
    if response.status_code == 200:
        image = response.content
        with open(fname, "wb") as f:
            f.write(image)
    else:
        raise Exception("{} returned {}".format(response.url, response.status_code))
```

使い方はこんな感じ．この例はスカイツリーの座標の航空写真です．

```python
#zはズームレベル.18が一番拡大した状態
z = 17
lat = 35.710163
lon = 139.8105428

def_url = "https://cyberjapandata.gsi.go.jp/xyz/ort/{}/{}/{}.jpg"
fname ="test.png"

x,y = deg2num(lat, lon, z)

download_from_gsi(z, x, y, def_url, fname)
```
結果このような画像が取れました．
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131387/8a092c6d-5753-0fce-4edf-853863a2ef37.png)
まだ建設途中のころの写真ですね．

def_url は[地理院タイル一覧](https://maps.gsi.go.jp/development/ichiran.html)中にあるurlを参考にしてください．
(注意点は物によってjpgだったりpngだったりするところ．)