OmniAICreator/Qiita-1.07M huggingface dataset:
2DのオブジェクトDestroy時にSEを再生したかった話

# 忙しい人向け結論
2DオブジェクトのDestoryと共にSE再生はできない。
常設オブジェクトでSE再生させた。

#UnityでのSE再生の実装

1. AudioSourceコンポーネントを付与してAudioClipに再生したい音源を登録する
2. 鳴らしたいタイミングで以下のように呼び出す

``` c#
[SerializeField] AudioSource _audio = null;

void PlaySe()
{
	// 該当の音を1回だけ再生する
	_audio.PlayOneShot( _audio.clip );
}
```

これで音が鳴らず、ハマったときに調査した項目です。
※Unity再起動、PCの音量設定は確認済み。

##Mute Audioの設定

Gameウィンドウの「MuteAudio」が押された状態（下記画像参照）だとすべての音が鳴りません。

![2019-05-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374880/5433a79a-749d-c7bf-8459-836c0f02fa3b.png)

##AudioSourceのSpatialBlendの設定

今回作成中のゲームは2Dゲームでした。
AudioSourceコンポーネント内の「SpatialBlend」が1＝完全に3Dに寄った状態になると
SE再生時にカメラとの距離を考慮した3D空間のような立体的なサウンド再生になるようです。
この設定により、音は鳴るのですが、異常に小さい音で鳴ってました。

[Unityリファレンス：AudioSource.spatialBlend](https://docs.unity3d.com/ja/current/ScriptReference/AudioSource-spatialBlend.html)

2Dの場合この考慮は不要になるので、常に一定の音量で鳴らせるように0＝完全に2Dに寄った状態にします。

![2019-05-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374880/e462073d-82c4-2b6a-bded-0c6dfc39bd92.png)


##音を鳴らすタイミング

「ブロック崩しゲームのブロックが消えるときにSEを鳴らす」ことを目的としていました。
オブジェクトに任意のスクリプトとAudioSourceコンポーネントが付与されていて、
オブジェクト削除時に自身のAudioSourceコンポーネントを再生しようとします。

``` c#
[SerializeField] AudioSource _audio = null;

void DestroyObject()
{
	// 該当の音を1回だけ再生する
	_audio.PlayOneShot( _audio.clip );

	// オブジェクトを削除する
	Destroy( this.gameObject );
}
```

この場合、再生した直後にオブジェクト本体が消えてしまうため、SEは再生されません。

###PlayClipAtPointによる再生

PlayClipAtPointを利用すると、AudioSourceコンポーネントを動的にシーンに配置して、
なおかつSE再生が終了すると自滅してくれます。
[Unityリファレンス：AudioSource.PlayClipAtPoint](https://docs.unity3d.com/ja/current/ScriptReference/AudioSource.PlayClipAtPoint.html)


``` c#
[SerializeField] AudioSource _audio = null;

void DestroyObject()
{
	// // 該当の音を1回だけ再生する
	// _audio.PlayOneShot( _audio.clip );

	// SE再生専用オブジェクトが一時的に作られるので、音が鳴る
	AudioSource.PlayClipAtPoint( _audio.clip, transform.position);

	// オブジェクトを削除する
	Destroy( this.gameObject );
}
```

3Dゲームなら、この方法で問題ないと思います。
この方法で作成されたAudioSourceの設定がAudioSource.spatialBlend=1になっています。

前述したように、2Dゲームの場合、このパラメータは0であって欲しいのですが、
PlayClipAtPointからこの値を設定する術がありません。（2018.3.2f1利用しています）
PlayClipAtPointにて作成されたオブジェクトにアクセスして～というのもFindで重い検索をするわけにもいかず…


###別のSEオブジェクトを用意して再生した

ここまでの実装はオブジェクトAが自身がDestroyされる直前にSEを再生しようとしていました。
実装を変更して、オブジェクトB（常設）がオブジェクトAのDestroy呼び出し時に、オブジェクトBがSEを再生する形で対応しました。

これで今回のケースは解決しました。
PlayClipAtPointの2D版ないんですかね？？？
LaravelのRelationshipsを取得する際の注意点(selectで外部キーも指定しないとnull）

LaravelでCityモデルにPrefectureモデルへの関連が定義されているとします。

```
<?php
declare(strict_types=1);

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class City extends Model
{
    // 略

    public function prefecture()
    {
        return $this->belongsTo('App\Models\Prefecture')->open();
    }
}
```

以下のように、データを取得した後で関連データを参照すると、参照のたびにSQLが発行されます。
N+1問題というやつですね。

```
$cities = City::get();
foreach($cities as $city) {
    var_dump($city->prefecture);
}
```

対応として、Eager Loadingと呼ばれる事前データ取得処理をおこないます。
Laravelではwithメソッドでモデルを指定します。

```
$cities = City::with('Prefecture')->get();
foreach($cities as $city) {
    var_dump($city->prefecture);
}

// 複数の場合は配列もしくは複数回withメソッドを呼び出します。
$cities = City::with(['Prefecture', 'Towns'])->get();
$cities = City::with('Prefecture')->with('Towns')->get();
```

さらに、不要なカラムはいらないので、selectメソッドを追加してみます。

```
$cities = City::select('code')->with('Prefecture')->get();
foreach($cities as $city) {
    var_dump($city->prefecture);
}
```

ぎゃー

```
NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL （略）
```

外部キーも指定しないとダメなようです

```
$cities = City::select(['code', 'prefecture_id'])->with('Prefecture')->get();
foreach($cities as $city) {
    var_dump($city->prefecture);
}
```

ということで、関連テーブルをEagar Lodingで取得する際にselectメソッドを組み合わせる場合は、外部キーもselectに指定する必要があるという覚書でした。
プログラミング学習記録79〜詳解JavaScript オブジェクト編〜

##今日やったこと
- ドットインストール「詳解JavaScript オブジェクト編」

コードは書かずにざっと動画を見てみました。

配列やオブジェクト、クラスの基礎について学びました。

後半は主に配列の操作方法についてですね。

Mathオブジェクト、Dateオブジェクトはドットインストールの他の講義でも出てきました。

オブジェクトの最後の要素にも,（カンマ）をつけてもエラーにならないのは知りませんでした。

後から他の要素を付け足したいときに手間が減るので、オブジェクトの最後で,(カンマ)で終わるようにした方がいいですね。
<br>

あと、setTimeout()とsetInterval()の違いについても確認しました。
システムに負荷をかけたくない場合は、setTimeout()を使うといいみたいです。

まだ理解しきれていない部分もありますが、アプリやゲームを作ってみない限りはなかなか理解しきれないので、あと１、２回見たら実践に入りたいと思います。

明日からも引き続き頑張ります。

おわり
【git】よく使うコマンド集（リモートレポジトリへのプッシュ）


#趣旨

毎回、あれ？ここで使うgitコマンドなんだったっけ？となるので自分の忘備録としての役割も含めて記載します。
今回はリモートレポジトリへのプッシュです。

#リモートレポジトリにプッシュしたい時
ここではリモートレポジトリはgithub使っています。


##git add

まず、ファイルなどを管理の対象として追加する必要があります。
エディターにコードを書いたのみだと「ワーキングツリー」に存在しているだけなので、
ワーキングツリーからステージエリア（インデックス）に追加します。
（ワーキングツリー→ステージエリア）

```
$ git add .
```

上記ならルートファイル以下全てのファイルをaddできます。

```
$ git add　＜ファイル名＞
```

特定のファイルならこちら

ex)

```
$ git add　index.html
```

##git commit

ステージエリアにあげられたファイルをローカルレポジトリに追加登録します。
このことをコミットすると言います。
（ステージエリア→ローカルレポジトリ）

vimを使いたくない人は-mでメッセージの中身を記入

```
$ git commit -m "コメントの中身"
```
vimを使う人は

```
$ git commit
```

vimが立ち上がるので、
「i」を押してインサートモードにしてからコメントを入力します。
入力したあとは、ESCを押した後に
「：」「w」「q」で保存するか、
「：」「q」「！」で保存せずに戻ることができます。


git commit したあとは、
git log　でコミットしたメッセージを確認できます。

```
$ git log
```

## git push


最後にリモートレポジトリ（github）にプッシュします。
（ローカルレポジトリ→リモートレポジトリ）

$ git push origin ＜ブランチ名＞　なので

```:masterにプッシュする時
$ git push origin master
```

##ワーキングツリーの変更内容を取り消しする時

git addしていない変更を全部消すことができます。

```
$ git checkout .
```
変更の取り消しができますが、新規追加したファイルは削除対象にならないので、別途削除しましょう。

特定のファイルのみ指定して取り消しならこちらです。

```
$ git checkout <ファイル名>
```


##プッシュした後にやり直ししたい時

git resetで対応する人もいますが、コミット履歴操作には危険が伴うので、
revertで対応するケースも多いようです。
直前のコミットを打ち消すコミットとなります。


```
$ git revert HEAD
```
その後にpushします。


##ワーキングツリーの変更を一時退避させる方法

ローカル(ワーキングツリー)の変更内容を退避させます。
退避させて別ブランチで一時的に作業する場合などで使います。

```
$ git stash
```

退避を元に戻すには以下のコマンドです。

```
$ git stash pop
```


##最後に

git resetについてはこの方の記事がとても参考になります。
https://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe

別の記事で他のgitコマンドについて書いていきます。
Pythonライブラリ sys

# sys とは
`sys`はPythonのインタプリタや実行環境に関する情報を扱うためのライブラリです。
使用しているプラットフォームを調べる時や、
スクリプトの起動パラメータを取得する場合などに利用します。
# インストール
標準ライブラリなので、はじめから入っています。
pipなどでインストールする必要はありません。

##sys.version
使用しているPythonのバージョンを文字列型で。

```python
> sys.version
'3.7.3 (default, Mar 27 2019, 23:40:30) \n[GCC 6.3.0 20170516]'
```
## sys.platform
```python
sys.platform
```
`sys,platform`はスクリプトを実行したOSを表示します。
私の場合は`linux`と表示されました。

例えば、カレントディレクトリ/home/user1に、test.pyとPython packageディレクトリtestがあるとします。
## sys.argv
`sys.argv`はコマンドライン引数を扱います。
コマンドライン引数とは名前の通り、コマンドラインで指定した引数のことです。

Pythonでプログラムを作成し利用する場合、
条件に応じた値を引数で指定する場合があります。
その時に`sys.argv`が役に立ちます。

```bash:これのことです。
jovyan@bb26596c4f15:~$ python hoge.py koko kore
```
上記のプログラムでは`hoge.py`というPythonプログラムに対して、
`koko`と`kore`というコマンドライン引数が指定されています。
`sys.argv`を使用することで、これらの引数をPythonプログラム内で扱うことができます。


これから`sys.argv`を使用してコマンド引数の扱いを確認します。
はじめに`hoge.py`というPythonファイルを下記のように作成します。

```python:hoge.py
import sys

#↓ここでコマンドライン引数をargsという変数に格納
args = sys.argv

if len(args) == 3 :
    print(args) #コマンドライン引数を出力
    print(type(args)) #コマンドライン引数のデータ型を出力
    print(type(args[2])) #コマンドライン第一引数のデータ型
    print(len(args))

    print("-"*30) #区切ってるだけ。意味はないです。

    print("コマンドライン引数の第一引数は " + args[1] )
    print(float(args[2])*3.14) #floatの意味は下に書きます。
    
else:
    print("コマンドライン引数を２つ入力してください \n 第一引数はstr型、第二引数はfloat型です。")

```
そして実行してみると……

```bash":bash
jovyan@bb26596c4f15:~$ python hoge.py hello 10
['sys.py', 'hello', '10']
<class 'list'>
<class 'str'>
3
------------------------------
コマンドライン引数の第一引数は hello
31.400000000000002
```
出力の一行目から見ていきましょう。
`args`は`sys.argv`によってコマンドライン引数を格納したものです。
リストの０番目はスクリプトのファイル名が入っています。
そして１番目以降はコマンドライン引数が順番に入っています。

出力の二行目は`args`の、つまり`sys.argv`のデータ型を確認しています。
`<class 'list'>`と出力されているのでリスト型です。

出力の三行目は`args[2]`、つまり２番目のコマンドライン引数のデータ型を確認しています。
２番目の引数は`10`ですが……`<class 'str'>`と出力されています。
数字を入れているので、整数型か浮動小数点数型になりそうな気がしますが、
コマンドライン引数は全て文字型になるようです。

出力の四行目は`args`の長さを出力しています。
スクリプト名 + コマンドライン引数 なので`3`と出力されます。

## sys.exit
このメソッドは`SystemExit`例外を発生させます。
この例外は特に処理をしない限り、スタックトレースを表示しません。
例えば、下記のようなpythonコードを書くと……

```python:exit.py
import sys

for i in range(100):
  print(i)
  if i == 10:
    sys.exit()

```
```bash
jovyan@bb26596c4f15:~$ python exit.py 
0
1
2
3
4
5
6
7
8
9
10
```
このように`exit()`到達時点でプログラムが終了します。

# 参考文献&参考サイト
今回の記事制作にあたり参考にさせていただいた記事や書籍です。
とても勉強になりました。ありがとうございました。

[色々なPythonのライブラリを「知る」ための本](https://www.amazon.co.jp/%E8%89%B2%E3%80%85%E3%81%AAPython%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E3%80%8C%E7%9F%A5%E3%82%8B%E3%80%8D%E3%81%9F%E3%82%81%E3%81%AE%E6%9C%AC-%E5%A4%A9%E7%94%B0%E5%A3%AB%E9%83%8E-ebook/dp/B078ZGBJNQ)
今回の記事を書いたきっかけ。今後もこの書籍を参考に記事を書きます。(Primeなら無料で読めます！)
[LIFE WITH PYTHON 「ライブラリ：sys」](https://www.lifewithpython.com/2013/03/sys.html)
基本的な構成を参考にしました。とてもわかりやすいです。
[python公式ドキュメント   sys --- システムパラメータと関数](https://docs.python.org/ja/3/library/sys.html)
THE 本家。
[Python学習講座　コマンドライン引数](https://www.python.ambitious-engineer.com/archives/40)
`sys.argv`に関する記述が非常にわかりやすい。
機械学習でよく出てくる関数のオーバーフローを防ぐ

# はじめに
シグモイドやソフトプラス等の指数関数を含む関数を自分で実装すると，指数関数部でオーバーフローになり正しく計算できなくなることがあります。

関数によっては簡単な工夫で防げる場合があるので紹介します。

# シグモイド関数
シグモイド関数は

```math
f(x) = \frac{1}{1+\exp(-x)}
```

で表され，$(-1,1)$の値域をとります。
![sigmoid](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259761/dfa80b31-c015-0697-1c13-0e40f9e5e7e6.png)
（画像は[Wikipedia](https://ja.wikipedia.org/wiki/シグモイド)より引用）

$x$がマイナス方向に行きすぎると，理論的には$f(x)\simeq 0$ですが$\exp(-x)$がオーバーフローします。

$x< 0$のときは分母分子に$\exp(x)$を掛けて変形し，

```math
f(x)=
\begin{cases}
\displaystyle\frac{1}{1+\exp(-x)} & \text{if $x\geq 0$} \\
\displaystyle\frac{\exp(x)}{\exp(x)+1} & \text{if $x< 0$}
\end{cases}
```

と場合分けすれば常に正しく計算できます。
また，場合分けをまとめると

```math
f(x) = \frac{\exp(\min(0,x))}{1+\exp(-|x|)}
```
とできます。

# ソフトプラス関数
ソフトプラス関数は

```math
f(x) = \log \left( 1+\exp(x) \right)
```

で表されます。
![softplus](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259761/2dc843fb-722d-ef39-6f76-8ed5ac836bd1.png)
（画像は[Wikipedia](https://ja.wikipedia.org/wiki/活性化関数)より引用）

この関数も$x$が大きくなりすぎると$\exp(x)$がオーバーフローします。

$x\geq 0$のときは$\log$の中身を$\exp(x)$で括り，$\log\exp(x)=x$であることを利用して$\exp(x)$を消します。

```math
\begin{align}
f(x) &= \log\left\{ \exp(x)(\exp(-x)+1) \right\} \\
&= \log\exp(x) + \log(\exp(-x)+1) \\
&= x+\log(\exp(-x)+1)
\end{align}
```

つまり，

```math
f(x) = 
\begin{cases}
\log(1+\exp(x)) & \text{if $x<0$} \\
x+\log(\exp(-x)+1) & \text{if $x\geq 0$}
\end{cases}
```
を計算すれば良いことになります。

また，場合分けを上手くまとめると

```math
f(x) = \max (0,x) + \log(1+\exp(-|x|))
```
と書けます。

# ソフトマックス関数
ソフトマックス関数は上記とは異なりベクトルを受け取ってベクトルを返します。
入力を${\bf x} = [x\_1, \ldots, x\_N]$とすると

```math
{\bf f}({\bf x}) = \left[ \frac{\exp(x_i)}{\sum_j \exp(x_j)} \right]_{i=1}^N
```
で表されます。

入力${\bf x}$の中で最大の値を持つ要素を

```math
x^{\rm m}=\max(x_1,\ldots,x_N)
```
とし，分母分子を$\exp(x^{\rm m})$で割った

```math
{\bf f}({\bf x}) = \left[ \frac{\exp(x_i-x^{\rm m})}{\sum_j \exp(x_j - x^{\rm m})} \right]_{i=1}^N
```

を計算することでオーバーフローを回避できます。

# おわりに
いずれも指数関数の引数が0以下になるようにするのがポイントです。
LINE Message APIのリッチメニューを使ってLIFFのアプリを呼び出す

# はじめに
この[LIFF](https://qiita.com/teramotodaiki/items/a8955840aa23ec68e6fe)を試してみたかったのでサンプルコードを実行してみました。その際に「リッチメニュー」という機能を使って、メニュー画面からLIFFのアプリを呼び出してみました。

# LIFFを使う
[LINE Developers](https://developers.line.biz/ja/)より設定できます。[公式のガイド](https://developers.line.biz/ja/docs/liff/getting-started/)を参考にすれば普通に設定が可能です。
今回LIFFのアプリは[公式のサンプルコード](https://github.com/line/line-liff-starter)をForkしました。ここで、公式ガイドでは「Heroku」を使ってサーバを立ててエントリーポイントを取得していますが、私は直接に「GitHub Pages」を使ってGitHub上でエントリーポイントを取得しました。方法は[こんな感じ](https://www.tam-tam.co.jp/tipsnote/html_css/post11245.html)です。
URLを取得できれば[ここ](https://developers.line.biz/ja/docs/liff/registering-liff-apps/)を参考にLIFFを追加します。このとき、`curl`コマンドを使って`liffid`を取得する方法も書いてありますが、別にサイト上で登録すれば`LIFF URL`が発行されるので「LINE Things」を使わない場合はターミナルでの操作は不要だと思います。また、この`LIFF URL`がLINEアカウントとLIFFを連携させるためのURLです。この`LIFF URL`をスマートフォンのブラウザで開けばLIFFのアプリを立ち上げることができます。

# リッチメニューでLIFFを起動する
リッチメニューの説明と設定方法は[公式ガイド](https://developers.line.biz/ja/docs/messaging-api/using-rich-menus/)を参照してください。今回は、「メニューをタッチすることでLIFFが起動する」までを設定してみました。リッチメニューの説明は`curl`コマンドを用いて行います。
まずはリッチメニューのレイアウトやメニュー名などの作成です。

```shell

 curl -v -X POST https://api.line.me/v2/bot/richmenu \
  -H 'Authorization: Bearer  {channel access token}' \
  -H 'Content-Type:application/json' \
  -d \
  '{
    "size":{
        "width":2500,
        "height":1686
    },
    "selected":false,
    "name":"Controller",
    "chatBarText":"Controller",
    "areas":[
        {
          "bounds":{
              "x":0,
              "y":0,
              "width":2500,
              "height":1686
          },
          "action":{  
            "type":"uri",
            "label":"View map",
            "uri":"{LINE URL}"
            }
        }
    ]
  }'
```

`{channel access token}`に「アクセストークン」を、`{LINE URL}`にはそのまま「LINE URL」を設定してください。送信が成功すると`{"richMenuId": "{richmenu-id}"}`の形で`richMenuId`が返ってきます。
次に画像を設定します。このとき画像サイズは2500×1686または2500×843ピクセルに調整する必要があるので[ここ](https://bulkresizephotos.com/)とかでリサイズするといいと思います。画像を用意したらそれをカレントディレクトリに置いて以下のようにコマンドを打ちます。

```shell
curl -v -X POST https://api.line.me/v2/bot/richmenu/{richMenuId}/content \
-H "Authorization: Bearer {channel access token}" \
-H "Content-Type: image/jpeg" \
-T image.jpg
```

`image.jpg`を自分の画像ファイル名に変換して、`{richMenuId}`に先ほど取得したIDを「richmenu-」の形でそのまま入力します。
最後に以下のコマンドでリッチメニューを適用します。

```shell
curl -v -X POST https://api.line.me/v2/bot/user/all/richmenu/{richMenuId} \
-H "Authorization: Bearer {channel access token}"
```

# さいごに
リッチメニューの他にもMessageAPIには[色んな機能](https://qiita.com/kakakaori830/items/52e52d969800de61ce28)があるのでそれも試していきたいです。
#python の b とシングルクォートで書かれたアイツって何なの？誰なの？

bytes オブジェクトを生成できるらしい。

```py
>>> b'\xe3\x81\x82'
b'\xe3\x81\x82'

>>> b'\xe3\x81\x82'.decode('UTF-8')
'あ'

>>> 'あ'.encode('UTF-8')
b'\xe3\x81\x82'


>>> b'A' == b'\x41'
True

>>> b'A' == b'A'
True

>>> type(b'A')
<class 'bytes'>

>>> type('A')
<class 'str'>

```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Hello. World!をブラウザに喋らせてみよう！Web Speech API Speech Synthesis

## Hello. World!をブラウザに喋らせてみよう！
`Web Speech API Speech Synthesis`をご存知でしょうか。
テキストから音声を生成することの出来るブラウザAPIです。
ChromeではこのAPIを使うことが出来ます。

以下のコードを実行して見てください。3行ですみますa

```javascript
const ssu = new SpeechSynthesisUtterance();
ssu.text = 'Hello, World!';
speechSynthesis.speak(ssu);
```

`Hello, World!`という流暢な英語が聞こえましたね？

他にも日本語を喋らせたり出来るので、ぜひこのAPIを使って遊んでみてください。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Homebrew on Linuxでターゲットアーキテクチャを指定する

# はじめに

Linux環境でHomebrewを使うとき、世代の異なるCPUのマシン同士でhomeを共有していたりするとHomebrewでインストールしたコマンドがうまく動かないことがあります。
例えば、Skylake世代のマシンで`brew install python3`として、Nehalem世代のマシンで`python3`とすると

```
[1]    106302 illegal hardware instruction (core dumped)  python3
```

となります。
Nehalemは10年前なので多少はしょうがない感じもしますが、Skylake vs Ryzen Threadripperでも同様なのでさすがに困ります。

macOSでも原理的には同じことが起こるはずですが、homeを共有したりするような使い方がされないということか、あまり問題になっていないようです。

# 原因

現在のHomebrewはLinux環境下では、バイナリ生成時にコンパイラに渡す`-march`オプションが`-march=native`となっています。`-march`オプションはターゲットのCPUアーキテクチャを指定するオプションで、これによってアーキテクチャ固有の命令が使われたりします。

`-march=native`を指定した場合、コンパイルを実行したマシンのアーキテクチャが選択されます。そのためSkylake世代のマシンで`brew install`すると`-march=skylake`相当でコンパイルされ、最近のIntel CPU固有の命令が入ったバイナリが生成されて古いマシンでエラーになる、ということです。

# 対策

アーキテクチャを指定する環境変数`HOMEBREW_ARCH`を設定した場合に`-march`の値を上書きできるような[PR](https://github.com/Homebrew/brew/pull/6098)を出して取り込んでもらいました。
（実は同様のPRがLinuxbrew時代に一度マージされているのですが、Homebrew本家に合流するタイミングでrevertされたまま放置されていたようです）

「はじめに」で挙げた環境なら`brew update`で最新版を取り込んで

```
export HOMEBREW_ARCH=nehalem
```

とすれば、以降はコンパイル時に`-march=nehalem`となってSkylakeでもNehalemでも実行可能なバイナリが生成されます。（もちろんSkylakeに最適化されたものよりは遅くなるはずですが）

指定可能なmarchの一覧は例えばx86系なら以下にあります。

https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html#index-march-14
【Android】外部から取得した画像をデコードする時に気をつけること

APIなどを叩いて外部から取得した画像データを利用する場合、エラー等のデコードできない可能性や大きすぎる画像である可能性などを考慮する必要がある。
かなり大きな画像をデコードしてしまうと、Out of Memoryでクラッシュする可能性もあるため、直接ピクセルデータをデコードするのではなく、最初にサイズ情報のみをデコードし、必要なサンプリング数を設定してからデコードすることが必要になる。
こうしたことを考慮すると、以下のようなメソッドをutilメソッドとして定義しておき、使い回すのが好ましい。

```Kotlin
    fun decodeBitmapFromByteArray(
        data: ByteArray,
        @Dimension requestWidth: Int,
        @Dimension requestHeight: Int
    ): Bitmap {
        val options = BitmapFactory.Options()

        options.inJustDecodeBounds = true
        BitmapFactory.decodeByteArray(data, 0, data.size, options)

        options.inSampleSize = sampleSize(
            options.outWidth, options.outHeight, requestWidth, requestHeight
        )
        options.inJustDecodeBounds = false
        return BitmapFactory.decodeByteArray(data, 0, data.size, options)
    }

    private fun sampleSize(
        sourceWidth: Int, sourceHeight: Int,
        requestWidth: Int, requestHeight: Int
    ): Int {
        if (requestWidth <= 0 || requestHeight <= 0) {
            return 1
        }
        if (sourceWidth * requestHeight < requestWidth * sourceHeight) {
            return if (sourceWidth > requestWidth) sourceWidth / requestWidth else 1
        }
        return if (sourceHeight > requestHeight) sourceHeight / requestHeight else 1
    }
```

`inJustDecodeBounds`をtrueにしてdecodeByteArrayを呼び出すと、画像をメモリに展開せずに画像サイズを取得することができる。これを利用して画像サイズからサンプリングのサイズを決定し、optionsのinSampleSizeに設定した後に、`inJustDecodeBounds`をfalseにして実際にdecodeを行う。
Excel VBAコース第5回内容

全12回 Excel VBAコースの第5回の内容です。

#配列とは
・同じ型の変数を、番号を付けた1つの塊として扱える機能
・付ける番号は「添え字」と呼ぶ
・添え字は0から始まる

#配列の宣言
```
Dim 配列名(添え字) As データ型
```
・宣言時の添え字の数字まで、配列が作成される
（配列名(5)の場合、0～5までを作成）

・添え字を記載しない場合は「動的配列」（個数が可変の配列）となる

#配列の初期化
```
Erase 配列名
```
・添え字は記載しない
・配列の全ての要素が、データ型に応じた初期値に設定される

#【おまけ】配列を使用する際に知っておくと便利なVBA関数
・Array
・UBound
・Split

#【おまけ】動的配列
・要素数が固定の場合「静的配列」（宣言時に添え字を記載）
・要素数が可変の場合「動的配列」（宣言時に添え字なし）

```
Dim i As Integer
Dim Array() As String     '動的配列の宣言

Redim Array(0)            '要素数を設定

For i = 0 to 3
   Redim Preserve Array(i)     　 '値を保持したまま、要素数を設定
   Array(i) = Cells(i,2).Value 　 '配列にセルの値を代入
Next i

```
デザインパターンについてまとめた

デザインパターンについて勉強しようと思い、自分の言葉でまとめました！
何かおかしいところなどありましたらコメントお願いします！

|パターン名|種別|実装|使うのは|概要|
|:-----------|:-----------|:-----------|:-----------|:-----------|
|Adapter|構造|普通|簡単|Adapter(適合)パターン。元となるクラスに手を加えずにインターフェースを変更するパターン。実装方法は継承と移譲の2パターンある。|
|Bridge|構造|簡単|簡単|Bridge(橋)パターン。DIによって継承の階層を減らすパターン。継承を正しく使おうとすればこのパターンに行き着く気がする。|
|Composite|構造|簡単|簡単|Composite(複合)パターン。木構造を伴う再帰的なデータ構造を実装する際に用いるパターン。Componentインターフェース、Leafクラス、Compositeクラスを作成する。入れ子集合モデルの実装を実装したものに当たる(はず)。|
|Decorator|構造|簡単|簡単|Decorator(装飾者)パターン。既存クラスの振る舞いを変更せずに拡張(Decorate)するパターン。拡張したいクラスをDIする。|
|Facade|構造|簡単|簡単|Facade(建物の正面)パターン。シンプルなインタフェースを定義することで複雑な処理を利用しやすくするパターン。Railsのserviceクラスはこのパターンを用いることが多い。|
|Flyweight|構造|普通|難しい|Flyweight(フライ級)パターン。生成したオブジェクトを再利用するパターン。インスタンス生成に時間がかかる場合、メモリを節約したい場合に有効。生成したオブジェクトの状態が変わってしまうと再利用できないため、適用できるのはイミュータブルなオブジェクトに限られる。|
|Proxy|構造|簡単|簡単|Proxy(代理人)パターン。「そのクラス」の代わりに処理を受け持つクラス(Proxy)を作成するパターン。Proxyでまかないきれない場合に、「そのクラス」のインスタンスを生成して処理を委任する。|
|Chain of Responsibility|振る舞い|普通|普通|Chain of Responsibility(責任の連鎖)パターン。自身が処理を実行できない時に次のオブジェクトに処理の実行を任せるパターン。どこまで責任を連鎖させるかはあらかじめ定義しておく。|
|Command|振る舞い|難しい|難しい|Command(命令)パターン。Commandオブジェクトによって処理をカプセル化し、Invoker(起動者)からCommandsを実行するパターン。クライアント(利用者)はInvokerに実行の依頼をするだけでよいので、実際の処理(Command)を柔軟に変更することができる。|
|Interpreter|振る舞い|難しい|簡単|Interpreter(通訳)パターン。なんらかのフォーマットに基づいて記述された文を解釈するパターン。たぶん、DSLの実装はこれ。|
|Iterator|振る舞い|難しい|簡単|Iterator(反復)パターン。配列など要素の集合に対して繰り返し処理を行うパターン。要素の集合に対して順番に処理を行うので、要素の大きさがわからなくても処理を実行(実装)することができる。|
|Mediator|振る舞い|普通|普通|Mediator(仲裁人)パターン。複数のクラスが相互の参照し合う時にその仲介(Mediator)を作成するパターン。Facadeは一方的に利用するのに対して、Mediatorは相互に参照し合う点が異なる。|
|Memento|振る舞い|普通|普通|Memento(形見)パターン。その時のインスタンスの状態を保存しておいて、後から利用できるようにするパターン。Originator(作成者)がMemento(形見)を作成し、Caretaker(世話人)がMementoのリストを保持する。|
|Observer|振る舞い|普通|普通|Observer(観察者)パターン。通知者となるオブジェクトが発信する通知を受けて観察者(Observer)が処理を行うパターン。通知者オブジェクトに観察者オブジェクトを設定(複数可)する。通知者と観察者はお互いにインターフェースを通じてやりとりするため、具体的な実装を意識しなくてよくなる。|
|State|振る舞い|簡単|普通|State(状態)パターン。インスタンスが状態を持つ場合に状態による振る舞いの違いを状態インスタンスに移譲するパターン。状態による振る舞いの違いを移譲するので、条件分岐を減らすことができる。|
|Strategy|振る舞い|簡単|簡単|Strategy(戦略)パターン。ロジックをコンテキストによって切り替えたい時に用いるパターン。クラス図はBridgeパターンと同様だが、その目的が異なる。Bridgeパターンは構造に関するパターンで、Strategyパターンは振る舞いに関するパターン。|
|TemplateMethod|振る舞い|簡単|簡単|Template(ひな型)Methodパターン。スーパークラスでテンプレートとなるメソッドを定義し、サブクラスで処理の詳細を実装するパターン。|
|Visitor|振る舞い|普通|難しい|Visitor (訪問者)パターン。構造と処理を分離するパターン。構造(Acceptor)が処理(Visitor)を呼び出し、Visitorが構造に依存した処理を実行する。|
|AbstractFactory|生成|普通|難しい|複数オブジェクトを生成する際、生成するオブジェクトに複数の組み合わせが存在する場合、その組み合わせをを抽象化して利用しやすくするパターン。FactoryMethodを複数の関連するオブジェクトに適用するようなイメージ。|
|Builder|生成|普通|難しい|オブジェクトの生成過程を抽象化するパターン。インスタンス生成の引数が動的に変わる場合に有効。実装方法はいくつかある。①DI + TemplateMethod ②メソッドチェイン|
|FactoryMethod|生成|普通|難しい|Factory(工場)Methodパターン。インスタンス生成をFactoryクラスに行わせるパターン。これにより抽象クラスを抽象クラスのまま扱えるので、抽象クラスを具象クラスにする必要がなくなる。|
|Prototype|生成|普通|簡単|Prototype(原型)パターン。プロトタイプとなるインスタンスを流用するパターン。インスタンス生成を挟まないことでインスタンスが持つ状態をコピーして使うことができる。|
|Singleton|生成|簡単|難しい|生成できるインスタンスの数を1つに制限するパターン。|

# 参考にしたサイト
「Googleで検索して1ページ目に表示された結果を全部読む」という方法で勉強したのですが、[IT専科さん](http://www.itsenka.com/contents/development/designpattern/)の解説がとても参考になりました。
備忘録 Coursera 1Week

courseraでせっかく受けた授業も受けたっきりでは忘れてしまいそうなので、今まで受けた授業をまとめてみようと思います。数式メイン、しかも理解しきれてないところもあります。何かあったらご指摘して頂けるとありがたいです。備忘録はあまり書いたことがないのでそこらへんはご了承ください。
（あと3,4週分一気にまとめようとしてるので抜けがいっぱいあるかもorz）

#1 Week
はじめに大まかな機械学習の説明から始まりました。例えば何に使われているとか、機械学習の種類とか。
その部分いついては省かせていただきます。

##Linear regression with one variable
手始めに単回帰分析から。

```math
h_\theta(x) = \theta_0 + \theta_1x \\
J(\theta_0,\theta_1) = \frac{1}{2m} \sum_{i=1}^m ( h_\theta(x^{(i)}) - y^{(i)} )^2
```

$h_\theta(x)$はHypothesis functionで特徴量から予測値を計算するための関数です。
特徴量っていうのは、例えば家賃を予測するときに家の大きさだったり駅からの近さだったりです。
単回帰分析はこの特徴量が1個です。
一方、$J(\theta_0,\theta_1)$はCost functinで、別名は目的関数とか損失関数とかだった気がします。
単回帰分析はこの$J(\theta_0,\theta_1)$の値が一番小さくなるように$\theta_0,\theta_1$を更新していくものです。
目的関数は見ればわかる通り、予測値と実数値の差の二乗をとっています。これは、どれくらい予測値と実数値に差があるかを表します。なので、それが小さくなれば、関数の予測が上手くいくわけです。この方法をGradient descent algorithm(勾配降下法)と言います。
で肝心の$\theta_0,\theta_1$の更新方法はこちらです。

```math
\theta_0 := \theta_0 - \alpha\frac{\partial}{\partial \theta_0}J(\theta_0,\theta_1) \\
\theta_1 := \theta_1 - \alpha\frac{\partial}{\partial \theta_1}J(\theta_0,\theta_1)
```
偏微分を用いて更新する$\theta$から引いていきます。
これは、イメージ的に先に進んだら値が上がるなら引いて、値が下がるなら足すってことなんですかね。
これでそれぞれの$\theta$に対しての極小値が求められる…はず？

![名称未設定2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409402/cfe505fc-2442-8d59-eff6-643303b5068b.png)

しかしどうやらそんなこともないらしい。
図の通り、小さい値を求めることはできるがその部分が全体を見たときの最小の値かはわからない。局所的最適解ではあるけど大域的最適解かどうかは分からないわけです。

あとは線形代数の基礎的な勉強だったのでパスします。
この行列を使って次に重回帰分析の講義に移ります。
とりあえず1 Weekはこんな感じで終わりです。

#まとめ
なんか間違ってる部分もある気がしますがとりあえずここまで。
ご飯食べたら2Week分をまとめます。
はぁ、しんどいなぁ。勉強以外にも就活もちゃんとしなきゃ
ではではノシ
【これだけは】よく使う便利なツール【入れる】

インターネットの中には様々なツールがありますよね。
今日は、その中でよく使っているツールの紹介をします！

##キャプチャ
####FastStone Capture (Windows)
https://www.vector.co.jp/soft/win95/art/se492849.html

####Skitch - 撮る。描き込む。共有する (Mac)
https://itunes.apple.com/jp/app/skitch-%E6%92%AE%E3%82%8B-%E6%8F%8F%E3%81%8D%E8%BE%BC%E3%82%80-%E5%85%B1%E6%9C%89%E3%81%99%E3%82%8B/id425955336?mt=12

どちらも直感的に使用できるUIで、使い勝手が良いです。
エビデンス取得に愛用しています^^

##差分表示
####WinMerge (Windows)
http://winmerge.org/downloads/?lang=ja
![2019-05-06_190514.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/51fd73c0-25c9-23f3-a02e-b40dff69bdef.jpeg)


####FileMerge (Mac)
https://itunes.apple.com/jp/app/xcode/id497799835?mt=12
FileMergeはXcodeの機能の一部です。
<img width="840" alt="skitch.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/70c513f9-1759-3101-c8b4-6983a13d53d8.png">

ソースのコミット、レビュー時に活用しています。

##リモートデスクトップ
####TeamViewer 
https://www.teamviewer.com/ja/
<img width="259" alt="skitch (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/00c13763-b49b-2159-120f-a4070e20ecf1.png">
遠隔操作のツールです。
Windows→Mac、Mac→Windowsの操作にも対応しています。
何気に便利な機能。

##画像加工
####Ralpha
https://forest.watch.impress.co.jp/library/software/ralpha/
![2019-05-06_190425.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/65e7dfdb-d597-30ef-2477-102d5ad28a4d.jpeg)


画像のリサイズからロゴの透かし挿入まであらゆる加工が可能です。
フォトショより気軽にそれっぽい画像が作成できます。

##トラックパッド操作
####BetterTouchTool (Mac)
https://folivora.ai/downloads/
<img width="1002" alt="skitch (2).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/28cbbc4f-3742-d4b5-1c5f-92484315a05e.png">

トラックパッドジェスチャーでショートカットの設定ができます。
「新規タブで開く」や「タブ移動」などブラウジング操作などなど
いろいろなショートカットを設定して置くことができます。

ぶっちゃけこれが一番使用しています！

##便利なサイト
####Thimble
https://thimble.mozilla.org/ja/
<img width="1226" alt="skitch (2).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/05edc896-81b7-0499-b689-30482df60b86.png">

オンラインHTMLエディタです。
コード記入後に即、結果を確認できます。

---
####カラーコード一覧表
http://www.netyasun.com/home/color.html
<img width="925" alt="skitch (3).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/475e5ef2-ef3c-efd7-757c-c01c8ece27d4.png">
CSS、その他エクセル等のカラーコード調整に使用します。
なかなかコードだけで色をイメージすることって難しいですよねー

---
####ネーミング
https://codic.jp/engine
<img width="770" alt="skitch (9).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/96458af0-a527-49f6-1a91-c900ebdbe488.png">
変数名、メソッド名の手助けになります。
日本語→英語に変換し、キャメルケース等に変換してくれます。
メソッド名は、全てこれを使用しています。

---
####URLエンコード・デコードフォーム
https://www.tagindex.com/tool/url.html
<img width="669" alt="skitch (12).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/1c8ef509-a044-5420-43f0-4580e36cd84a.png">
文字列をデコード、エンコードしてくれます。
パラメータとかエンコードされていることが多いので、デバッグ中によく使用します。

---
あとはChromeやeclipseとかもよく使用しますね。
もはや当たり前の存在になって来ていますので、省略しますm(_ _)m


コメントでも普段使っているツールを教えていただけるとありがたいです。

~~Windowsの方が便利なツールが揃っている気が…😣~~
#python のインタラクティブモードで事前に走らせるスクリプトを指定して Ruby の binding.pry みたいに途中から操作してみる ( python -i ) ( + #django shell の例も )

- `python -i ` で インタラクティブモードで起動し、なおかつ事前に特定のスクリプトを走らせられる模様
- IPython とかかいろいろと面倒な場合もあるので、シェルを立ち上げてからファイルを読むこむ方式でやってみる。
```
-i     : inspect interactively after running script; forces a prompt even
```

# import file example
```
import re
print('OK!')
alices = re.findall(r'Alice', 'AliceAliceAlice')
```
# python の場合
```
$ python -i tmp/import.py
```
```
OK!
>>> alices
['Alice', 'Alice', 'Alice']
```
# django の場合
- 途中から exec で読み込めば良さげ
- 他の方法は未発見

```
$ ./manage.py shell
```

```
In [1]: exec(open('./tmp/import.py').read())
OK!
In [2]: alices
Out[2]: ['Alice', 'Alice', 'Alice']
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
npmでsimplemdeを使いたい！

# 前提：simplemde とは
[SimpleMDE - Markdown Editor](https://github.com/sparksuite/simplemde-markdown-editor)

[簡単に組み込めるマークダウンエディタとして紹介されてる記事](http://unitopi.com/markdown-editor/)がいくつか上がってるライブラリ。

# npm経由で使おうとした
```shell
$ npm i simplemde
```

```app.js
import SimpleMDE from 'simplemde'

const simplemde = new SimpleMDE()
```
ら、
<img width="279" alt="スクリーンショット 2019-05-06 18.51.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124742/16b8f307-4e7d-5175-a7d4-c8d5bd56d5b8.png">
崩れた。

どうみてもスタイルがあたってない。

# 対処：直接CSSをimportする
```app.js
import SimpleMDE from 'simplemde'
import 'simplemde/dist/simplemde.min.css'

const simplemde = new SimpleMDE()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124742/a01d728d-3dfa-3d0e-3e2c-19e71b09a70d.png)
本当に一瞬で実装できました。
esaあたりで見覚えあるこの画面。

おすすめです。
Canvasを使ってあるBitmapから正円のBitmapを作成する処理を書いた話

## やりたいこと
ある画像から、サムネイルのアイコンを作って表示する処理が必要になったので、Canvasを使って実装してみました。

<img width="109" alt="スクリーンショット 2019-05-06 18.38.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/094a13af-e1c8-3f61-c78c-8e004405bcd1.png">
例えばこういうネクタイの画像があったとすると、欲しいのは以下のようなアイコンになります。
<img width="158" alt="スクリーンショット 2019-05-06 18.39.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/dbb38b8c-6886-2a21-fb14-e71326da708d.png">
拡大縮小はせず、中心部分をうまく丸く切り取る処理をする場合、以下のような実装になります。

## 実際のソースコード
```
    private fun getCroppedBitmap(bitmap: Bitmap): Bitmap {
        val size = Math.min(bitmap.width, bitmap.height)
        val output = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888)
        val canvas = Canvas(output)

        val paint = Paint()

        paint.isAntiAlias = true
        canvas.drawARGB(0, 0, 0, 0)
        canvas.drawCircle(size / 2f, size / 2f, size / 2f, paint)
        paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
        val max = Math.max(bitmap.width, bitmap.height)
        val start = (size - max) / 2
        val left = if (bitmap.width < bitmap.height) 0 else start
        val top = if (bitmap.height < bitmap.width) 0 else start
        val rect = Rect(left, top, bitmap.width + left, bitmap.height + top)
        canvas.drawBitmap(bitmap, Rect(0, 0, bitmap.width, bitmap.height), rect, paint)
        return output
    }
```

## 解説
やっていることはそんなに難しくはありません。
まず、出力先のBitmapをsize指定で作成します。この時、sizeは元画像の幅/高さのうち小さい方を指定します。
次にCanvasとPaintを用意します。
今回は円形に画像を切り抜くので、Paintにはジャギーが目立たなくなるようにisAntiAliasをtrueに設定します（詳細は[アンチエイリアス](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%B3%E3%83%81%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9)を参照のこと）。
canvasは透明で塗りつぶしてから、`drawCircle(中心点のx座標,中心点のy座標,半径,paint)`でsizeの半分の半径でちょうど中央に円を描きます。
`paint.xfermode`を設定する前のdrawCircleがDST、その後のdrawBitmapがSRCなので、画像が丸の中に入るようにするには`PorterDuffXfermode(PorterDuff.Mode.SRC_IN)`を`paint.xfermode`に設定します。
最後に切り抜くrectを決めてdrawBitmapすることで、描画処理は完了です。
centos6.9にpython3.7.3インストール

下記のエラーがでてpyenvからインストールできなかった

ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

下記は公式のトラブルシューティングガイド
https://github.com/pyenv/pyenv/wiki/Common-build-problems

下記を実行したらできた
https://tecadmin.net/install-python-3-7-on-centos/

```
# cd Python-3.7.3
# ./configure --enable-optimizations
# make altinstall
```

シンボリックリンクつくったりpath通したりするのは自分でやる必要あり

またやりそうな感じありありなのでメモ
Docker for mac のエラー「unauthorized: incorrect username or password.」対処法

Docker Desktop for mac をインストール後のPullで「unauthorized: incorrect username or password.」が発生。少しハマったので備忘として共有します。

Docker Hubより「pull」時にエラー発生
---

```
$docker run hello-world

Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Get https://registry-1.docker.io/v2/library/hello-world/manifests/latest: unauthorized: incorrect username or password.
See 'docker run --help'.
```

ID/PWDが異なるとの警告。原因はDockerHub登録時に利用したメールアドレスでログインしていたことでした。
メールアドレスで、DockerHubにログインする必要があります。



[対応]Docker HubにユーザIDでログインする。
---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319276/320f17c1-a3a7-282c-20c8-81d5152c3473.png)

**メールアドレスではなくユーザIDでログインしてください!!**

確認
---
DockerHubからPull出来ることを確認。

```
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:92695bc579f31df7a63da6922075d0666e565ceccad16b59c3374d2cf4e8e50e
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:

```
#プログラミング 学習では決して真面目に写経してはいけない ( #python #django の例 )

- 特に中級者は。
- ｢写経にかけるコスト｣は戦略的に見計らおう。

# たとえば

https://www.django-rest-framework.org/tutorial/1-serialization/

これ。

シェルを立ち上げて一行一行書けという。

![image](https://user-images.githubusercontent.com/13635059/57210745-c51c4100-7018-11e9-8473-edcb055445ca.png)

# やってられるか！！

これが死ぬほどハードルになって前に進めなかった。

# 解決策

- プログラム全体をスクリプトに書いて、シェルからファイルを直接実行することで、かなりやりやすくなった。
- ファイル全体を眺めていると見通しが良くなり、少しいじって動作を変えることなどもしやすくなった。

```
./manage.py shell < ./snippets/codes/serialize.py
```

```py
# https://www.django-rest-framework.org/tutorial/1-serialization/

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser

snippet = Snippet(code='foo = "bar"\n')
snippet.save()

snippet = Snippet(code='print("hello, world")\n')
snippet.save()

serializer = SnippetSerializer(snippet)
print(serializer.data)
# {'id': 7, 'title': '', 'code': 'print("hello, world")\n', 'linenos': False, 'language': 'python', 'style': 'friendly'}


content = JSONRenderer().render(serializer.data)
print(content)
# b'{"id": 2, "title": "", "code": "print(\\"hello, world\\")\\n", "linenos": false, "language": "python", "style": "friendly"}'

import io

stream = io.BytesIO(content)
data = JSONParser().parse(stream)

serializer = SnippetSerializer(data=data)

serializer.is_valid()
# True

serializer.validated_data
# OrderedDict([('title', ''), ('code', 'print("hello, world")\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')])

serializer.save()
# <Snippet: Snippet object>

serializer = SnippetSerializer(Snippet.objects.all(), many=True)
serializer.data
# [OrderedDict([('id', 1), ('title', ''), ('code', 'foo = "bar"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]), OrderedDict([('id', 2), ('title', ''), ('code', 'print("hello, world")\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]), OrderedDict([('id', 3), ('title', ''), ('code', 'print("hello, world")'), ('linenos', False), ('language', 'python'), ('style', 'friendly')])]


```

# 教訓

- チュートリアルが本当にやりやすく作られているとは限らない
- チュートリアルの指示通りに進めるのが馬鹿らしいことだってある
- チュートリアルはあくまで素材なので料理の腕があるなら、自分で調理しよう



# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#github に issue をピンどめしてトップ表示する機能があるよ！

重宝するかも。

現場からは以上です。

# 例

一番上に来るかと思いきや、別枠で表示される。

![image](https://user-images.githubusercontent.com/13635059/57211045-d87bdc00-7019-11e9-9c8b-b84465612fb5.png)

# サイドバーに Pin Issue の文字が


![image](https://user-images.githubusercontent.com/13635059/57211044-d74aaf00-7019-11e9-857d-564bd964a3a1.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
KotlinMPPでAndroid/iOS両対応のHTTPクライアントライブラリを作る

# はじめに　

　Android/iOS、両プラットフォーム上で同じようなアプリを開発する際、明らかに同じような処理をKotlin/Swiftで実装することがあり、共通化したいなと思うところがありました。
例えば、通信部分やEntity、ValueObjectなど、OSが違っても共通になる処理については尚更です。こういった部分を二度も違う言語で実装するのは明らかに二度手間で余計な工数がかかりますし、バグが発生する可能性も増します。
なんとかこういった部分を共通化し、一度コードを書けば両デバイスで動かせる、それによって工数の削減をしたい。そういったモチベーションがあったため、`KotlinMPP`について調査を行い、実際にそれを用いて両プラットフォームに一度で対応できるHTTPクライアントを作ってみました。

# KotlinMPPとは

正式名称 `Kotlin Multiplatform Project`
Kotlin1.2及び1.3で実験的に提供されている機能です。Gradleでターゲットとなるプラットフォームにどんな方法でビルドをするかを記述することで、一つのKotlinのソースを各プラットフォーム向けに動作する形でビルドすることが出来ます。
例えば、AndroidではJVMで動作するようにビルドする、iOSではネイティブで動作するようにビルドする、といった次第です。
Android,iOSはもちろん、mac,Windows,JSをターゲットとすることが出来ます。

# KotlinMPPを使ったHTTPクライアントライブラリ

サンプルプロジェクトを作ってみました。
[5hyn3/KotlinMPPHttpClientSample](https://github.com/5hyn3/KotlinMPPHttpClientSample)

以下のような言語やビルドツール、ライブラリを組み合わせて作られています


- kotlin
  - 1.3.31

- gradle
  - 5.4.1

- ktor-client
  - 1.1.5
 
- kotlinx.serialization
  - 0.11.0

- kotlinx.coroutin
  - 1.2.1

テストが一つ記述されており、実際にAPIからjsonを取得し、パースしてkotlinのオブジェクトとして取得する部分までの動作を確認することが出来ます。実際にアプリに組み込んで動作を確認したい場合は以下を参考にしてください。  
[Multiplatform Project: iOS and Android](https://kotlinlang.org/docs/tutorials/native/mpp-ios-android.html)  
ビルド成果物としてjarとframeworkができるので、それらを扱う形になります。

現状、AndroidとiOSのみをターゲットに作っていますが、gradleに手を入れることでJSなどにも対応させることが出来ます。



# 苦労した点
以下サンプルプロジェクトを作った際に遭遇した大変だった点を書いていきます

## バージョンごとにビルド時の挙動が違っており適切なバージョンの組み合わせを見つけるのが大変だった
 主にGradleによるものです。色々なプロジェクトを参考にしてサンプルプロジェクトを作りましたが、バージョンがちょっとでも違うと全くビルドすら出来ませんでした。また、ライブラリが要求するGradleのバージョンが食い違っていたりして悩んだこともありました。
最終的に、現時点での最新版である`5.4.1`を採用することで解決しました。本プロジェクト作成に費やした時間の8割くらいはここで適切なライブラリを選定することで消費されています。まだexperimentalなのでこのあたりはどうしてもしょうがないですね。

## `suspend`なmethodをSwiftから呼び出せない
 現状Kotlin/Nativeは`suspend`なmethodをswiftから呼び出せるインターフェースを作ってくれないようです。`suspend`をやめ、`Deferred`インスタンスを返すようにすることでSwiftからもきちんと扱えるようになりました。こちらであればSwift側からも扱えるインターフェースが提供されており、問題なく呼び出すことが出来ます。

## Kotlin/Nativeでビルドした際にランタイムで`IncorrectDereferenceException`が発生する
　本プロジェクトでは非プリミティブ型のトップレベル変数をメインスレッド外から触ろうとしたために発生しました。具体的にどこで発生したかというと、[ここ](https://github.com/5hyn3/KotlinMPPHttpClientSample/blob/master/KotlinMPPHttpClientSample/src/commonMain/kotlin/com/example/lib/httpClient/MyHttpClient.kt)です。対処法としては`@ThreadLocal`を付与して、スレッドローカルとして扱うことで対応を行いました。

# 終わりに 

　これでKotlinでコードを一つ書けばAndroid/iOS両方で動くライブラリを作ることが出来ました。これでより業務を加速し、同じことを二回も書くようなつまらない作業は減らして、もっと本質の部分に時間を使うことが出来るようになるといいなぁと思います。

# 参考

[JetBrains/kotlin-mpp-example](https://github.com/JetBrains/kotlin-mpp-example)
[Multiplatform Project: iOS and Android](https://kotlinlang.org/docs/tutorials/native/mpp-ios-android.html)
[kotlin-native /IMMUTABILITY.md](https://github.com/JetBrains/kotlin-native/blob/master/IMMUTABILITY.md)
[DroidKaigi/conference-app-2019](https://github.com/DroidKaigi/conference-app-2019)
[SimonSchubert/Newsout](https://github.com/SimonSchubert/Newsout)
ずんだのポップル錯視問題 Brainf**k版

# はじめに
[てぃーびーさん](/tbpgr)の[ずんだのポップル錯視問題](/tbpgr/items/7530fda4725384c897c6)をBrainf**kで実装しました。

# 問題
詳細は上記リンクからご参照ください。概要としては次の通りです。

* 特定の単語を標準入力から入力する。( コード中にハードコーディングしてもよい )
* その単語の(正順に4回出力→改行)×2セット→改行→(逆順に4回出力→改行)×2セットを2セット行う
* 2セットの間には改行出力を1回行う

# 実装
以下のような実装になります。( 283文字 )
※なお、実行環境としては[ideone](https://ideone.com)のbffを想定しています

ポイントとしては以下の通り

* UTF-8マルチバイト文字を想定し、複数バイトで1文字の場合はまとめて扱えるようにした
  * UTF-8の2文字目以降は、0x80-0xbfの範囲になることから、バイトの数値を32で割り、商が4,5の場合複数バイトの継続と判断するようにした
  * なお、改行文字はこの判断の延長で「商が0の場合」とした。( なので改行以外の特殊文字を読み込んでも単語の終わりと判断する )
  * 文字の区切りは0とし、正順・逆順どちらの場合も、同一文字は塊として正順に出力するようにした

詳細は、コード中のコメントをご覧ください。

```txt:zunda-popple.bf
** 改行文字とループカウンタをセット **
++++++++++>++
** 終端(マイナス1)をセットし、単語入力ループ **
>>>->>>+[
 ,+[
  ** 1増えた状態でdivmod 32 **
  [>[->>>]<[>->+>++++[-<<++++++++>>]]<<<<+>-]
  >>-[
   ** 余りのクリア等行いUTF8の2文字目以降(divmod 32での商が4か5)かの判断 **
   <[-]<<->>>-[-[-[-[-[[-]<->]]<+>]]]
   ** UTF8の2文字目以降の場合は文字の記憶位置をずらし塊にする **
   <[-<<[-<+>]>]
  >+>>] ** 入力ループ継続フラグセット **
  ** 改行(実際はdivmod 32での商が0)の場合は文字クリア **
  <[[-]<<[-]>]
 ]
<]
** 終端をセットし、メインループ開始 **
-<+[-<+]-<<<[-#
 ** 正順に4回単語出力×2行 **
 >++[-
  >++++[->>>+[-[.>]>+]-<+[-<+]-<]
 <<<.>>]
 ** 逆順に4回単語出力×2行(改行が先) **
 ++[-
  <<.>>>>>+[->+]-
  >++++[-<<<+[-[<]>[.>]<[<]<+]->+[->+]->]
  <<+[-<+]-
 <<]
 ** 次のループもあるなら改行2回、さもなくば改行1回
 <[<..<]<[.<<]
>>>]
```

# 実行例
ideoneの以下のページで確認できます。

https://ideone.com/Nf7jeI

# 参考

* AzicoreさんのオンラインBFインタプリタ  
  https://azisava.sakura.ne.jp/js/bf/  
  ※動作環境をbffと合わせるには、オプションで、「バッファの型」を4バイト符号付き整数、「標準入力の終端」を-1に設定してください
* [Brainf**k講座](/angel_p_57/items/618bed4e96c5e96778a5)
まさかのCPUでの動画デコードがボトルネックだった動画エンコードを爆速にした話

#NVDecを有効活用したかった
##Core i7 4770ではもはや役者不足
筆者の環境を書くと、CPUはCore i7 4770、メモリはDDR3の16GB、GPUはGeForce 1050Tiです。これでAviUtlを使いFullHD、60Pの動画をNVEncでエンコードしようとしてもタスクマネージャのGPUのところのVideo Encodeが100％にならないのです。なんでかと思ってたら前段階の動画デコードにCPUを使用していて、それがずっと100％に張り付いていた。どうもここがボトルネックみたいだったのです。もう5年も6年も前のCPUで、いくらCore i7といえどもはや役者不足になっていたのでした。

##試しにrigaya氏のNVEncCでデコードをGPUに任せてみる
CPUデコードではGPUのVideo Encodeが40％行かないくらいしか有効活用できなく、20分の動画エンコードにかかった時間がMUX合わせて10分かかりました。それがデコードもGPUに任せると、Video Decodeが50％程度になり、Video Encodeが100％にほぼ張り付き、総エンコード時間は約2分に短縮されました。コマンドとしては、
`NVEncC64.exe  --avhw --fps 60 -i file1.mp4 --audio-copy -o file2.mp4`
です。`--avhw`がキモ。これでデコードをGPUに任せることができます。

![2019-05-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145502/37bcf156-065c-a532-6d95-4bf7ce57f2dd.png)

AviUtlでNVencを使った場合の、こんなしょぼいVideo Encodeの使い方ぶり、そしてVideo Decodeを使わない状況から、

![2019-05-06 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145502/83c08a42-8c1f-279a-8975-9fa24b7f8834.png)

このようにキッチリ回してくれます。CPUもさほど使わなくなります。

##AviUtlで恩恵を受けることはできるか
できます。L-SMASH Works r935からNVDecを利用できるようになりました。AviUtlの「ファイル」→「環境設定」→「入力プラグインの設定」→「L-SMASH Works File Readerの設定」を選びます。
そうすると、
![2019-05-06 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145502/c84d16dd-3ec8-e434-9f39-e583e68cbd5e.png)

こんな画面がでますので「Preferred decoders」のところに`h264_cuvid,hevc_cuvid`と入力します。そうすることでGPUでデコードを処理できるようになります。このように。

![2019-05-06 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145502/86a85fc1-ab11-aa07-c1f6-153a67b8d853.png)

思ったほど使ってはいませんが、CPUが100％べったり張り付きではないことはわかります。総エンコード時間は11分。あれ？

##総括
無編集で良いのならばrigaya氏のNVEncCで5倍くらい速くできる。AviUtlで編集するのだとL-SMASH Worksで一応GPUデコードはできるものの、恩恵はあんまりない？という結果に。L-SMASH Works r935 Release2では「h264_nvdec」オプションができたものの利用できないです。なんででしょうね…。

##参考にしたところ
[NVEncC オプションリスト](https://github.com/rigaya/NVEnc/blob/master/NVEncC_Options.ja.md)
[L-SMASH Works r935 で何が変わったの？](https://pop.4-bit.jp/?p=8425)
[L-SMASH Works r935 release2 の更新内容](https://pop.4-bit.jp/?p=8578)
Django & Apahce2 アプリケーションにアクセスしても response が来ない。

# 問題
Azure Virtual machine 上にある Django & Apahce2 アプリケーションにアクセスしても response が来ない。（ブラウザが更新中のまま動かない。）

処理過程でpytorchを使っている。

# 原因
C/C++の拡張モジュールを使っていた事が理由らしい。

# 対処
Apache2の設定ファイルに以下を追記すればよいらしい。

```conf:○○.conf
<VirtualHost>
    ...

　　# 以下を追記
    WSGIApplicationGroup %{GLOBAL}
</VirtualHost>
```

# 参考
[django - WSGI : Truncated or oversized response headers received from daemon process - Server Fault](https://serverfault.com/questions/844761/wsgi-truncated-or-oversized-response-headers-received-from-daemon-process)
[scipyをDjangoで使おうとしたらアプリ自体が動かなくなった | The Brave Penguin Lab.](http://www.mobile4children.com/?p=1284)
[using scipy in django with apache and mod_wsgi - Stack Overflow](https://stackoverflow.com/questions/16823388/using-scipy-in-django-with-apache-and-mod-wsgi)
Amazon Connectにおけるユーザーとオペレータ―との間の音声を取得する方法

#はじめに
Amazon Connectで通話した音声を保存したいということで、Amazon Connectを介してユーザーとエージェントとの間の音声を取得する方法について確認してみました。

#音声取得方法
現状では次の二つの方法で音声を取得することが可能でした。

1.通話録音機能
2.Kinesis Video Stream

##１．通話録音機能
コンタクトフローに[通話記録動作の設定]ブロックを設定することで通話を録音することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321760/0ba60ad4-c6e3-4750-49e8-b1ea01870182.png)

オプションとしては次の４つを指定することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321760/07d427ec-3846-bd43-02de-7a66ce0a1e84.png)

顧客とエージェントの**通話が終了した後**に、wav形式の音声データがS3に保存されます。
構成は次のような感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321760/32e10bfe-fda2-031e-44f2-b00394e078b0.png)

数分程度の短い通話であればほぼ即時で作成されました。通話時間に比例して作成時間も長くなるようです。

通話記録機能のオプションで「エージェント AND 顧客」を選択した場合は１つのファイルとして保存されました。
採取した音声データを視聴したところ、ステレオ音声として保存されており、左チャネルに顧客側の音声が、右チャネルにエージェントの音声が保存されましたので[AWSドキュメント](https://aws.amazon.com/jp/connect/faqs/)の通りでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321760/20e4b2c1-f0da-948e-6b42-16babb459c7a.png)

片方が会話している際は基本的には（せっかちな方でなければ）もう片方の音声は保存されませんので音声のデータとしては長時間になると思われます。また、分析などを行う際はチャネルがどちらの会話を扱っているのか、会話の流れを正しく把握する部分に注意したほうがよさそうです。

##２．Kinesis Video Stream
[Amazon Kinesis Video Streams](https://aws.amazon.com/jp/kinesis/video-streams/) を使用すると、分析、機械学習 (ML)、再生、およびその他の処理のために、接続されたデバイスから AWS へ動画を簡単かつ安全にストリーミングできるようになります。

Amazon Connectでは、コンタクトフローに[メディアストリーミングの開始]ブロックを設定することで通話をリアルタイムでストリーミングできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321760/0bb8084d-bb6f-13ce-d39b-99ba6cdbec17.png)

ユーザーとオペレータ―間の通話ごとにストリームが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321760/306b0661-2f9d-23a0-5942-47d8b80e5d87.png)


AWSマネジメントコンソールでは視聴することができませんでした。[AWSドキュメント](https://docs.aws.amazon.com/ja_jp/connect/latest/userguide/customer-voice-streams.html)に従い、コンシューマで音声データを取得します。
構成は次のような感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321760/9d00fda1-098a-8ead-1bff-94ebb8c10c5c.png)

コンシューマで取得した音声ファイルはRAW形式のファイルとなり、最小単位は1024バイトでした。ストリームされる音声データは、Single 16bit PCM 8000HzのRAWデータで、バイトオーダーはリトルエンディアンでした。
動作確認では通話開始からおおよそ20sec後にストリームが流れ始めたためリアルタイムに状況を分析してフィードバックするような処理には向いていないと考えられ、扱い方は検討が必要そうです。

#まとめ
Amazon Connectにおけるユーザーとオペレータ―との間の音声の取得方法の確認結果は次の通りです。

**通話録音機能**
- 通話が完了した後にwavファイルが保存される
- 通話の時間に比例してwavファイルが保存される時間が長くなる（実測60secの通話でファイル作成まで10sec）
- 顧客とオペレータ両方の通話を保存する場合
    - wavファイルは1つ作成される
    - ステレオ音声の左チャネルに顧客側の音声が保存され、右チャネルにエージェントの音声が保存される

**Kinesis Video Stream**
- 音声データはコンシューマ（SDK開発が必要）を介してRAWファイルとして採取可能
- 通話が開始してからおおよそ20sec後に音声データが取得できる
- 取得できる音声データ
    - Single 16bit PCM 8000HzのRAWデータ
    - バイトオーダーはリトルエンディアン
    - 最小単位は1024バイト
部屋の中で見失ったスマホに着信させる

## やったこと
- 部屋の中で頻繁にスマホを見失うので、自分のスマホに通話を発信したかった

## 使ったもの
- twillioのProgrammable Voiceという機能
- Raspy

## 準備
- twillioに新規登録
- 電話番号を購入
    - まだ完全に理解できていないが、日本の電話番号を購入しないと発信ができなかった
    - 050で始まる電話番号を購入（月額108円=>高い）
- Raspy上でtwillioをinstall

## ソースコード

```python:call.py

from twilio.rest import Client

account_sid = 'ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
auth_token = 'your_auth_token'
client = Client(account_sid, auth_token)

call = client.calls.create(
                        url='http://demo.twilio.com/docs/voice.xml',
                        to='+14155551212', // これはサンプル番号です
                        from_='+15017122661' // これはサンプル番号です
                    )

print(call.sid)
```

## 実行
```terminal
pi@raspberrypi:~ $ python call.py
CA0bed0bfecc49603b56590fef736cdff3
```
sidが表示されれば一旦は完了していそうだが、twillioコンソール上のデバッガーを確認するとエラーを表示している場合もあるので何回も連打しないようにしないと料金がかかってしまう。（1発信16円くらい）
僕はアメリカの電話番号（SMS送信の為に購入した電話番号）で通話発信を試しまくった結果、160円無駄に使ってしまったので要注意。

## twillioコンソールで通話ログの確認
<img width="989" alt="スクリーンショット 2019-05-06 17.46.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174991/2a4a826f-26ef-576b-01ad-8ec02575cec2.png">

発信ファイルを実行した際は、画像の[STATUS]部分がRINGINGとなっています。
その間に部屋の中で着信音がなってそれで見つけるわけでございます。

バイブレーションも着信音の設定もきっている場合は、部屋でスマホを無くさないでください。
Armbianチートシート

# /dev/ttyS1 を利用可能にする

NanoPi NEO2 で`cat /dev/ttyS1`したら、`/dev/ttyS1: Input/output error`と出てきたのでかなり焦ってしまったのだが、`/boot/armbianEnv.txt`にoverlayを追加したら使えるようになった。

```diff:/boot/armbianEnv.txt
verbosity=1
console=serial
overlay_prefix=sun50i-h5
-overlays=usbhost1 usbhost2
+overlays=usbhost1 usbhost2 uart1
rootdev=UUID=1cd9a19b-7231-4cf7-b8db-433393ce67f9
rootfstype=ext4
usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u
```

参考:

- https://forum.odroid.com/viewtopic.php?t=34289
- https://forum.armbian.com/topic/9964-odroid-c2-devttys1-inputoutput-error/
- https://docs.armbian.com/User-Guide_Allwinner_overlays/


# mDNSで名前解決したい

```sh
apt-get install avahi-daemon libnss-mdns libnss-mymachines
```

`libnss-mymachines`はmDNSにはあんまり関係ないんだけど、`/etc/nsswitch.conf`から参照されているので、入れておかないと名前解決でコケる。
入れたくない場合は、`/etc/nsswitch.conf`のほうを編集してもいいと思う。

参考: https://www.linuxquestions.org/questions/linux-networking-3/armbian-ping-to-mdns-host-system-error-4175652995/


# ネットワークインターフェースにIPv6アドレスを設定（追加）する

```sh
nmcli dev mod eth0 +ipv6.addresses "fd00:5043::62b:bbff:fef0:2001/64"
```

↓ helpには`ipv6.addr`という省略表記が記載されているのだが、`ipv6.addr-gen-mode`と被ってしまうので省略表記は使えないっぽい。

```shell-session
$ nmcli dev mod eth0 +ipv6.addr "fd00:5043::62b:bbff:fef0:2001/64"
Error: invalid property 'addr': 'addr' is ambiguous (addresses x addr-gen-mode).
```

これでIPv6アドレス設定できたと思いきや、再起動したりEthernetケーブル抜き差ししたら設定が消えてしまった。

```sh
nmcli connection mod d54d106b-1a5c-3dcc-955e-4091aa488392 ipv6.method manual ipv6.addresses  "fd00:5043::62b:bbff:fef0:2001/64"
```

とするのが正解だったぽい。