OmniAICreator/Qiita-1.07M huggingface dataset:
Debian 10.2 buster に nvidia-dockerを入れたときのメモ

# 初期状態

+ 使ってるGPU: Geforce GTX 1060
+ busterで提供されているnvidia-driverをすでに入れた状態
   + 418.74が入っていた
+ nvidia-dockerもすでに入れた状態
  + でもエラーでうまくgpuがdocker経由で呼べないので実質意味なし

+ エラー:

```
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].
ERRO[0000] error waiting for container: context canceled 
```

# 1. nvidia提供のもっと新しいドライバーを手に入れる

+ 410系が入ってしまっている状態なのでもっと新しいのを入れる
  + 430系以上じゃないとだめらしい?(どこで書いてあったか失念) 
+ 440.44をとってくる (2020/02/02現在)
  + https://www.nvidia.co.jp/Download/driverResults.aspx/156090/jp

# 2. リカバリーモードでdebianを起動し、440.44をインストール
+ リカバリーモードは起動時にgrubのメニューのAdvanced Optionsから選択できる
+ ターミナルに入ったら管理者パスワードを入力する
+ とりえあずnvidia系のものを全部一旦消す

```
# apt purge nvidia-*
```

+ 440.44を入れる 
  + 選択肢は全部YESにした

```
# bash NVIDIA-Linux-x86_64-440.44.run
```

+ インストールできたら通常モードで立ち上げ直す

# 3. NVIDIA Container Runtimeをインストール

+ container.shというスクリプトを作成:

```
curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | \
  sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list
sudo apt-get update
```

+ インストール

```
$ sudo bash container.sh
```

+ dockerも再起動

```
$ sudo systemctl restart docker
```

# 4. docker上でgpuが呼べるかチェック

```
$ docker run --gpus all nvidia/cuda:10.2-base nvidia-smi
Sun Feb  2 04:52:15 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.44       Driver Version: 440.44       CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 106...  Off  | 00000000:1F:00.0  On |                  N/A |
|  0%   51C    P8     7W / 200W |    322MiB /  6077MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+
```

# Appendix: Tensorflow 2.1のjupyterを起動する

+ latestは2.1.0 (2020/02/08現在)
+ py3指定も必須なので注意

```
$ docker run --gpus all -it -p 8888:8888 tensorflow/tensorflow:latest-gpu-py3-jupyter
```

+ 一部gitが入ってなくて動かないチュートリアルがありますが、すでにPRが投げられていました (2020/02/08現在)
  + https://github.com/tensorflow/tensorflow/pull/36450 

# おわりに

+ インストール作業の実行は自己責任でお願いします
Reactのhooksで最初の一回目をスキップするCustom Hooksを作る

# 一回目をスキップするCustom Hooks
## はじめに
そろそろReactでhooksが使えるようになって一年が経ちます。主要なライブラリなどはClassコンポーネントからhooksを利用したFunctionalコンポーネントに置き換わっています。
弊社[hokan](https://www.corp.hkn.jp/)でもhooksを積極的に採用しています。
さてそんな中、Classコンポーネントにはあった`componentDidUpdate`に該当するhooksはないという壁にぶつかりました。
初回は何もしないが2回目以降はなにか処理をはさみたいなどがユースケースにあると思います。そんな便利なCustom Hooksを作成したので紹介します。

## 実装
```javascript
import {DependencyList, useEffect, useState} from 'react';

export default function useSkip(effect: Function, deps: DependencyList, times: number = 1) {
  const [_times, setTimes] = useState(0);
  useEffect(() => {
    if (_times >= times) {
      return effect();
    } else {
      setTimes(_times + 1);
    }
  }, deps);
}

```
## 解説
hooks名は`useSkip`としました。

### 引数
基本的な使い方は、`useEffect`と変わりません。第一引数にコールバック関数、第二引数にDependencyListを渡します。
第三引数で何回処理を飛ばすかを渡すことができます。多くの場合、1回しかとばす需要がなさそうなのでデフォルトで`times=1`としておきます。


### 実行回数の管理
```javascript
  const [_times, setTimes] = useState(0);
```
この部分で実行回数を管理する状態を保持します。

```javascript
    if (_times >= times) {
      return effect();
    } else {
      setTimes(_times + 1);
    }
```
この部分で引数の回数に到達していない場合は、コールバックを発火させず、実行回数をインクリメントします。
指定の回数に到達した時点でコールバックが発火し始めます。

## 動作確認
以下のプログラムで動作を確認します。
ボタンを押したときの`useEffect`や`useSkip`で渡しているコールバックが発火するかを観察します。

```jsx


import React, {useEffect, useState} from 'react';
import useSkip from '@hooks/useSkip';

function App() {
  const [num, setNum] = useState(0);

  useEffect(() => {
    console.debug(`num: ${num}`);
    console.debug('fire useEffect');
  }, [num]);

  useSkip(() => {
    console.debug('fire useSkip');
  }, [num]);

  useSkip(
    () => {
      console.debug('fire useSkip 5 times skipped');
    },
    [num],
    5
  );

  return <button onClick={() => setNum(num + 1)}>increment</button>;
}

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235240/52f71b7d-469a-6ee5-848d-3747d49bab05.png)
初回は`useEffect`のみですが、2回目から１つ目の`useSkip`、5回目からは2つ目の`useSkip`が発火しています。
いい感じですね。`componentDidMount`に等しい処理もできそうです。

## 参考
https://dev.to/savagepixie/how-to-mimic-componentdidupdate-with-react-hooks-3j8c
jupyter notebook のホームディレクトリを変更する方法

jupyter-notebookでホームディレクトリから上階層にディレクトリ変更できなく困ったので、ホームディレクトリを一時的に変更したい時に。

###解決法
```cmd:Anaconda&nbsp;Prompt&nbsp;(Anaconda3)
(base)***>jupyter notebook --notebook-dir=<ホームフォルダ>

例 Zドライブのトップフォルダをホームディレクトリにする
(base)***>jupyter notebook --notebook-dir=Z:\
```
#### 参考
[Jupyter Notebookの初期ディレクトリを変更する](https://qiita.com/mitama/items/a8129e50afcc462e02d6)
[Jupyter Notebookを開くいてでてくるフォルダ一覧について]
(https://teratail.com/questions/61876)

#### あとがき
普通にjupyter notebook -h で詳細よめます。
上階層にcdできる方法あったら教えてください。
php artisan migrateで指定したDBにテーブルを作成する方法


#
愛用していたmacbookが故障してwindowsで環境を再構築している最中にmigrateでテーブルを作成したはいいが希望していた作成先であるmysqlではなくsqlite側に作成されていたのでテーブルの作成の際指定したDBにする方法をまとめます。

#結論
.envファイルの中身を書き換える

#やり方

```
#DB_CONNECTION=sqlite //今まではここを使用していた

DB_CONNECTION=mysql
DB_HOST=127.0.0.1 
DB_PORT=3306
DB_DATABASE=myblog
DB_USERNAME=root
DB_PASSWORD=
```

php artisan config:cacheで反映を実行させよう

これで実行できるはず途中yes/no聞かれますがyes打ち込んでエンターでOK!
![コメント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543413/f066f219-416f-90a2-985a-e00a9c29d997.png)
Windows上で、Donkey Car のシミュレータが Web Controller で操作できない件

#はじめに

Donkey Car のシミュレータ環境は Windows でも動くことになってますが、[ドキュメント](http://docs.donkeycar.com/guide/simulator/)通りにインストールしても正常動作しません。

Web Controller の表示まではいくのですが、操縦できません。

![donkeyweb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104360/094ee69d-7fb5-1c81-fcd5-227593db99e6.png)

```Click/touch to use joystic``` のところをドラッグすると動くはずなのですが、正常動作ならマウスポインタを中心とした円が描画されるところ、それが動かずテキストの選択モードになってしまいます。

Control Mode のボタンの色もなんか変です。

#原因

先に結論を。
```git clone``` をしたときに、改行コードが自動変換されてしまっているためです。

#対策

**git 改行コード 自動変換** などでググってどうにかしてください・・・

（自動変換しないことを、環境全部に対して行うか、本環境だけに対して行うかでやり方が変わってきます。また、ローカルファイルの改行コードを変換かけて戻すという対策もあると思います）

#調査

以下、興味なければ読まなくていいです。

デベロッパーツールでコンソールを見ると js の読み込みでエラーが出てます。

![SRIerror.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104360/19c8b2ac-97cf-ad3f-b689-b7e4890e0949.png)
```Failed to find a valid digest in the 'integrity' attribute for resource 'http://localhost:8887/static/jquery-3.1.1.min.js' with computed SHA-256 integrity 'HPMOWdIdSuVgr3FD9ZE+/MgiK8qk/MdQjrgCtfqp6U4='. The resource has been blocked.```

検索してみると、**サブリソース完全性**(Subresource Integrity) (SRI) による検証で跳ねられているようです。

js ファイルが改ざんされていると判断されてしまっています。

ローカルで動いてるのに誰が改ざんするんだよ？？？

勘で、改行コードの自動変換があやしいと思いました。

#感想

git の改行コード自動変換の設定を切るのって、インストールマニュアルに盛り込まないぐらいに当たり前のことなんですかね・・・
Xcode でクリーンビルドでも解消しないエラー "The repository could not be found. Make sure a valid repository exists at the specified location and try again." をなんとか解消した話

## 忙しい人向けの結論
- `File > Swift Packages > Reset Package Caches`
    - Swift Package の中で問題がある場合はこれで解決するはずです
    - もし、repository 自体に問題がある場合はこれでは解決しません

## 対象
- **Xcode のエラーをとにかく解消したい人**
    - `Command + Shift + Option + K` **でも解消せずに困っている人**
    - 本質的な原因までは書けていません(すみません)
- Xcode 初心者

## 背景
0. (前提)筆者はXcodeもSwift PackageもSwiftもずぶずぶの素人です(すみません)
    - ただ、ググってもなかなか解決できなかったのでこちらに残すことに意義を感じたため記事を書きました
1. Xcode の開発を始めたが、以下のエラーで **ビルドが失敗**
    - `The repository could not be found. Make sure a valid repository exists at the specified location and try again.`

2. よく効くと言われた Clean Build Folder(`Command + Shift + Option + K`) でも改善できず

3. 色々ググってみたが、自分の手元のビルドは通ることがなく。。。

## 原因
- Swift Package 内で git の状態が壊れていた模様

## 解決策
- `File > Swift Packages > Reset Package Caches` で Swift Package の Cache 削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150399/bb73188e-ad39-6f8a-0f4c-f89b2e050be8.png)

## まとめ
- 「Xcode で困ったら `Command + Shift + Option + K` 」に加えて「Swift Package で困ったら `Reset Package Caches`」も頭に入れる
    - 情けないお話ですが、Xcodeを使い始めて2週間くらいの私からするとこれくらいの理解で進めていくしかないかなと思いました

## 追記
実際には、このエラーが解消された後も別原因でエラーが出ていました。以下の記事のようにキャッシュを消すなどしてうまくいくケースも多かったのでご参考ください。
https://qiita.com/shtnkgm/items/c96a58579ec406194fa8

※ 経験的には、このエラーが出ている場合はキャッシュ周りにも問題を抱えていることが多いので、タイトルのエラーが出た場合には、本記事の内容 + 上記の記事の内容を実行していただくことで、「脳死解決」が可能かもしれません。
Laravel で feature test するときの database について

# 概要

Laravel で feature test をしたい。
ローカルは mysql で、phpunit.xml で テスト時の db は sqlite にしている。
なのに、なぜか `vendor/bin/phpunit` を叩いてもローカルの mysql を見に行ってします。
結論、`php artisan config:clear` をしたら、sqlite を見るようになった。

# 詳細

dd(env('DB_CONNECTION'));

```php
public function testHoge()
{
    dd(env('DB_CONNECTION'));
}
```

これで見ると、たしかに 'sqlite' になっているのに、なぜか

- use PHPUnit\Framework\TestCase;

だと、sqlite を見てくれるのに

- use Tests\TestCase;

だと、ローカルの mysql データベースを見てしまうという現象が起きていた。

```php
dd(DB::connection()->getPdo());
```

で確認してみた。

```php
Doctrine\DBAL\Driver\PDOConnection^ {#12
  inTransaction: false
  attributes: {
    CASE: NATURAL
    ERRMODE: EXCEPTION
    AUTOCOMMIT: 1
    PERSISTENT: false
    DRIVER_NAME: "mysql"
    SERVER_INFO: "Uptime: 61934  Threads: 3  Questions: 1852  Slow queries: 0  Opens: 151  Flush tables: 1  Open tables: 104  Queries per second avg: 0.029"
    ORACLE_NULLS: NATURAL
    CLIENT_VERSION: "mysqlnd 7.4.1"
    SERVER_VERSION: "5.6.46"
    STATEMENT_CLASS: array:2 [
      0 => "Doctrine\DBAL\Driver\PDOStatement"
      1 => []
    ]
    EMULATE_PREPARES: 0
    CONNECTION_STATUS: "db via TCP/IP"
    DEFAULT_FETCH_MODE: BOTH
  }
}
```

たしかに mysql を見ている。

なので、

`php artisan config:clear`

してみた。そしたら、無事 sqlite に繋がった。

```php
Doctrine\DBAL\Driver\PDOConnection^ {#11
  inTransaction: false
  attributes: {
    CASE: NATURAL
    ERRMODE: EXCEPTION
    PERSISTENT: false
    DRIVER_NAME: "sqlite"
    ORACLE_NULLS: NATURAL
    CLIENT_VERSION: "3.27.2"
    SERVER_VERSION: "3.27.2"
    STATEMENT_CLASS: array:2 [
      0 => "Doctrine\DBAL\Driver\PDOStatement"
      1 => []
    ]
    DEFAULT_FETCH_MODE: BOTH
  }
}
```
CentOS8系メモ

CentOS6で思考が停止していて、7でもさっぱり慣れん！
とかいってたら、新規で契約するVPSとかクラウドのインスタンスはもはや8系になることが多くなったので、メモ。

### Network周り

service network restart は死んだ
時代は systemctl restart NetworkManager
https://server.etutsplus.com/centos-7-network-configuration/

### デフォのPHPがCGI版に

インストール手順、設定、運用時のパーミッション周り等々が大きく変わってるので注意
多接続を考える場合、メモリ周りがネックになりやすいので、モジュール版を検討するかメモリをふゆぅ的に積む
https://www.rem-system.com/centos8-apache-install/
https://www.rem-system.com/centos8-php-install/

### iptablesはもういない

いや、いるけど。
Firewallの設定がfirewall-cmdになった。
https://www.server-world.info/query?os=CentOS_8&p=firewalld&f=1
Unity2019.XでAndroid IL2CPPビルドする

# 概要

　最近業務でAndroid IL2CPPビルドすることになったんですけど滅茶苦茶手こずったので同じ被害者を出さないためにメモ

20200823追記)最近のバージョンだとこれやらなくてもAndroidBuildSupportにチェック入れるだけで子要素もチェック入ります。

# 解決法

　UnityHubでAndroid Build Supportをインストールする時に子要素のAndroid SDK & NDK ToolsとOpenJDKにもチェック入れてインストールするだけ。あとはUnityが勝手にパス参照とかしてくれるので一切設定する必要なし。![Screenshot 2020-01-31_23-30-54-140.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483991/6140194a-da25-922c-8203-b30b0c33b3c4.png)

# 愚痴

　Unity2017.XとかだとAndroid SDKとか全部自前でDLして設定する必要あったじゃないですか。公式にも[こんなの](https://docs.unity3d.com/jp/460/Manual/android-sdksetup.html)があるし。ただそうすると今公式から落とせるSDKとNDKのバージョンが微妙に違うみたいでそこで一生エラー吐かれました。
　それはそれとしてIL2CPPくん、ビルドエラーで「One or more errors occurred」とか言って終わるのほんとギルティ、「犯人は10代～20代、もしくは30代～40代、または50代以上の人物」みたいなもんでしょ……
Amazon Transcribe のすべての書き起こしをダウンロードする

# 雑感
- 話の流れを追うだけであれば実用レベル
    - 特殊な単語(AWSやGCPなどの単語は拾えない）
    - 単語や接頭辞は頻繁に間違っているため精読しようとすると脳内で補完が必須（めっちゃ疲れる）
- 無料枠が1ヶ月あたり60分ある。1時間くらいのテキストで1.44ドル。安い
- 完全な書き起こしとしてはまだまだだが、これがあることで書き起こし作業は激減する

# 活用どころ
- 飲み会やカフェスペースでの話し合いを記録して Amazon Transcribe に投げておいてあとで流れを起こす
    - 当時の記憶と書き起こしがあればほとんど漏れがなく記憶を呼び起こせる

# 実際にやった
47分のZOOM会議音声ファイルを、Amazon Transcribeで変換すると30分程度でテキスト起こしができた。これで日本円だとおおよそ200円くらい。

- 入力：47分
- 処理時間: 30分くらい
- かかった費用（料金）：200円くらい（無料枠で補える）
- 録音環境： MacBook Pro, QuickTimeで記録し、 ffmpeg(`ffmpeg -i ~/Downloads/hogehoge.m4a -ab 256k hogehoge.mp3`) で変換

# イライラポイント
デフォルトだと Output data locationのリンクは、 Access Denied になっている。 当然 `aws s3 cp` でもダウンロードできない。

上の `Download full transcript` をクリックすることでダウンロードできた。

![貼り付けた画像_2020_02_02_13_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38967/36f584e1-e069-adf9-9d78-d26e94a45875.png)

# 精度雑感
- 話した内容の流れは追える程度
- AWSとかGCPとか特殊な単語は拾えない
- 手直しは必要

# 無料枠
> 無料利用枠
> 12 か月間、1 か月あたり 60 分
> Amazon Transcribe の無料利用枠は、最初の文字起こしリクエストを作成した日から 12 か月間利用できます。無料使用の有効期限が切れた場合、またはアプリケーションでの使用量が無料利用枠を超えた場合は、従量課金制での標準料金が発生します。

https://aws.amazon.com/jp/transcribe/pricing/?trk=transcribe_landing
Swift学習記＃１「変数の定義、配列の定義、データ型について」

#はじめに
こんにちは！
今回は、前回の最後に言った通りSwiftの基礎文法についてで、
その中でも基礎中の基礎である**変数の定義**、 **型の明示**、**配列の定義**について
アウトプットしていきます！

#まずは
[前回と同じように](https://qiita.com/Worker_Books/items/06364663aa4b0d011bf9)XcodeのPlaygroundを開きましょう！

#変数の定義
変数の定義には、他言語でもおなじみの`let`や`var`を使用します。

- `let`

イミュータブルな関数を定義する。
＊ イミュータブル・・・成後に変数の状態を変更できない

```swift:test.Playground
//letでイミュータブルな変数の定義
let immutablevariable = "hello"
immutablevariable += " world"  // => error
```
このように`let`で定義した変数は、
値を追加したり、変更したりすることはできない。

- `var`

`let`とは反対にミュータブルな変数を定義する。
＊　ミュータブル・・・成後に変数の状態を変更することができる

```swift:test.Playground
//varでミュータブルな変数
var mutablevariable = "hello"
mutablevariable += " world"
print(mutableStr)  // => hello world
```
このように、 `var`で定義した変数は、
値を追加したり、変更したりすることができる。

#型の明示
[前回](https://qiita.com/Worker_Books/items/06364663aa4b0d011bf9)、Swiftの変数の型は型推論によって自動的に決まると説明しましたが、
**暗黙の型変換**は行われません。

```swift:test.Playground
let labelStr = "This year is "
let thisYear = labelStr + 2017 // => error
```
このように、`String型 ＋ Int型`のような場合でも
`Int型`は変換されずに計算されるためエラーが発生します。

なので、

```swift:test.Playground
let labelStr = "This year is "
let thisYear = labelStr + String(2017)
print(thisYear)  // => This year is 2017
```
`String(2017)`のように変数の型を明示せねばなりません。

また、文字列中で計算をする必要のある場合は**式展開**をする必要があります。

```swift:test.Playground
let yearInt = 2017
let nextYear = "Next year is \(yearInt + 1)"
print(nextYear)  // => Next year is 2018
```
このように、式展開を使用することで文字列中でも
Int型の計算が可能になります。

#配列の定義
配列型の定義の基本は他言語とそれほど変わりません。

```swift:test.Playground
//配列の定義
var items = ["red", "green", "black"]
//型を明示したい場合
var items: [String] = ["red", "green", "black"]
```
このように、簡単に定義することができます！

#ディクショナリの定義
これも同じ配列型の１つなのですが、
配列の中でも先ほどのものは**Array型**、こちらを**Dictionary型**といいます。
このDictionary型は、配列内の値を**["キー": "値"]**の形で保存します。

```swift:test.Playground
var items = [
  "red": "RED",
  "green": "GREEN",
  "black": "BLACK"
]
// 型を明示
var items: [String: String] = [
  "red": "RED",
  "green": "GREEN",
  "black": "BLACK"
]
```
このように配列の１つの値に対して、"キー"と"値"の２つのセットが割り当てられます。

#これまで
今回は、基礎文法の中でも基礎中の基礎である**変数の定義**、 **型の明示**、
**配列の定義**についてアウトプットしていきました。
ここでつまづいてしまうとこの後の学習がすごく辛くなります！
十分復習しアウトプットをして万全の体制で次に進みましょう。

次回はこの続き、繰り返し分などの基礎文法についてのアウトプットです！
ではまた。
docker-compose runとdocker-compose execの違い

自分へのリマインドと超初心者に向けて
    docker-compose run
と
    docker-compose exec
の違いについて僕の理解を残しておきます。はじめdockerを触ったころは全く理解できなかったのが少しはわかるようになったので参考になればなと思います。
#docker-compose run
まずそもそもDockerとはコンテナーという仮想サーバーに自身のサービスを作り、個別のサーバーのように使うことができるサービスで、
dockerをインストールしたらまず最初に基礎となるコンテナを立ち上げなければなりません。
そのコンテナを立ち上げるためのコマンドが
    docker-compose run
でそのあとに続くコマンドでどんな名前のコンテナを立ち上げるかを決めます
#docker-compose exec
対してexecのほうはrunで立ち上げたコンテナーが起動している場合に操作するコマンドで、
例えば
    docker-compose run web
このコマンドでwebという名前のコンテナが立ち上がり、起動されます。そしてこのwebコンテナが起動しているときになにかしらの操作をコマンドでしたいときに
    docker-compose exec
を使うという流れになります。参考になれば幸いです。
Android リリースメモ

# ビルドバリアント
debug releaseの切り替えとか
Android Studioの左下あたりの`Build Variants`からdebugとリリースを切り替えできる。
設定はこの辺を参考に
https://developer.android.com/studio/build/build-variants?hl=ja#signing
https://developer.android.com/studio/publish/app-signing.html?hl=ja#sign-auto

### 設定画面までの行き方
[Project] ウィンドウでアプリを右クリックし、[Open Module Settings] をクリック

# アプリの署名周り
ここの最初の1~5を順番にやる
https://developer.android.com/studio/publish/app-signing?hl=ja

# リリース時のビルド
ここを参考にビルドしたら `app/release` にaapファイルができる。
https://developer.android.com/studio/publish/app-signing?hl=ja#sign_release

### 設定画面までの行き方
メニューバーで、[Build] > [Build] > [Generate Signed Bundle/APK] をクリック
Azure Media Services のチュートリアルでストリーミング エンドポイントが開始できなかった

# 結論

CDN を無効化したら解決しました


```bash
az ams streaming-endpoint update -n default -a amsaccount -g amsResourceGroup --disable-cdn
```
stackoverflow の3年前の投稿で解決しました。
初心者に優しくないので、早く修正して欲しい。

Azure media services live streaming endpoint hangs in “starting” status
https://stackoverflow.com/questions/38578026/azure-media-services-live-streaming-endpoint-hangs-in-starting-status

# チュートリアルの全体

やってみたチュートリアルはこちら

チュートリアル:リモート ファイルを URL に基づいてエンコードし、ビデオをストリーム配信する - CLI
https://docs.microsoft.com/ja-jp/azure/media-services/latest/stream-files-cli-quickstart

CDN 以外はメディアサービスとストレージのアカウント名を変更するだけで、悩むところはありませんでした。

## サブスクリプションを確認する

```bash
az account list --output table
```

## リソース グループを作成する

```bash
az group create -n amsResourceGroup -l westus2
```

## ストレージ アカウントの作成

```bash
az storage account create -n amsstorageaccount --kind StorageV2 --sku Standard_LRS -l westus2 -g amsResourceGroup
```

## Media Services アカウントの作成

```bash
az ams account create --n amsaccount -g amsResourceGroup --storage-account amsstorageaccount -l westus2
```

## ストリーミング エンドポイントを開始（問題あり）

```bash
az ams streaming-endpoint start  -n default -a amsaccount -g amsResourceGroup
```

処理が終わらない・・・

```bash
az ams streaming-endpoint show -n default -a amsaccount -g amsResourceGroup
```

ステータスが "starting" から進まない。
15~20分程放置すると異常終了します。

CDN が問題らしくCDN を無効化したら動きました。

```bash
az ams streaming-endpoint update -n default -a amsaccount -g amsResourceGroup --disable-cdn
```
## アダプティブ ビットレート エンコードのための変換を作成

```bash
az ams transform create --name testEncodingTransform --preset AdaptiveStreaming --description 'a simple Transform for Adaptive Bitrate Encoding' -g amsResourceGroup -a amsaccount
```

## 出力アセットを作成

```bash
az ams asset create -n testOutputAssetName -a amsaccount -g amsResourceGroup
```

## HTTPS 入力を使用してジョブを開始

```bash
az ams job start --name testJob001 --transform-name testEncodingTransform --base-uri 'https://nimbuscdn-nimbuspm.streaming.mediaservices.windows.net/2b533311-b215-4409-80af-529c3e853622/' --files 'Ignite-short.mp4' --output-assets testOutputAssetName= -a amsaccount -g amsResourceGroup
```

状態の確認

```bash
az ams job show -a amsaccount -g amsResourceGroup -t testEncodingTransform -n testJob001
```

## ストリーミング ロケーターを作成し、パスを取得する

```bash
az ams streaming-locator create -n testStreamingLocator --asset-name testOutputAssetName --streaming-policy-name Predefined_ClearStreamingOnly  -g amsResourceGroup -a amsaccount
```

ストリーミング ロケーターのパスを取得する。
HTTP ライブ ストリーミング (HLS) パスをコピーします。

```bash
az ams streaming-locator get-paths -a amsaccount -g amsResourceGroup -n testStreamingLocator
```

## ストリーミング エンドポイントのホスト名を取得

チュートリアルのコマンドにある "-n default" パラメータは不要です。

```bash
az ams streaming-endpoint list -a amsaccount -g amsResourceGroup
```

## Azure Media Player を使用して再生をテスト
[Setup] の [URL] に"https:// " + <hostName の値> + <Hls パスの値> を貼り付けて [Update Player] で再生できました。

# 補足

CDN プロバイダーを "Verizon" から "Akamai" へ変更しても解決しませんでした。

```bash
az ams streaming-endpoint update -n default -a amsaccount -g amsResourceGroup --cdn-provider StandardAkamai
```
APIから取得してきたデータがvue-chartjsに反映されなかった

#はじめに
〜**なぜvue-chartjsを使用したのか**〜
「`Chart.js`か`D3.js`を使おう！」と思っていたのですが、いろんなサイトで`vue-chartjs`使った方が楽みたいなことが開かれていたので使ってみました。

**※修正などがあればコメント欄に書いていただけると嬉しいです！**

#vue-chartjsとは
>vue-chartjs は Chart.js をvueで使用するためのラッパーです。 再利用可能なチャートコンポーネントを簡単に作成できます。

[公式参照](https://vue-chartjs.org/ja/guide/#%E5%88%9D%E3%82%81%E3%81%AB)


#最初のコード

```javascript

<script>
import { Line } from 'vue-chartjs'

export default {
  extends: Line,
  props: {
    chartData: Object,
    options: Object
  },
  mounted () {
    this.renderChart(this.chartData, this.options)
  }
}
</script>
```

ここで、chartDataがnullで渡されて変更が聞いていない！と気づく。


##対応⑴ watchで監視する

```javascript
<script>
import { Line } from 'vue-chartjs'

export default {
  extends: Line,
  props: {
    chartData: Object
  },
  data() {
   data: this.chartData
  },
  // dataプロパティを監視
   watch: {
     data: {
         handler(val) {
             this.data
         },
         immediate: true,
         deep: true,
     }
   },
  mounted () {
    this.renderChart(this.chartData, this.options)
  }
  
}
</script>
```

`this.data`はobserverなので変更をしてもリアクティブにならない。
もしくは、chart.jsが変更できない仕様になっているので**変更されなかった。**

##対応⑵ vue-chartjsのreactivePropを使う

しっかりと公式ドキュメントに書いてある。
以下で解決した。

>Chart.js 自身ではデータセットを変更した場合に、ライブアップデートの機能を提供していません。 しかしvue-chartjsはこれを実現するために2つの mixin を提供します。(reactiveProp/reactiveData)

つまり、propsが更新されるたびに再描画されるようになる。
mixinをimportして、reactivePropを利用する

```javascript
<script>
import { Line, mixins } from 'vue-chartjs'
const { reactiveProp } = mixins // 追加

export default {
  extends: Line,
  mixins: [reactiveProp], // 追加
  props: { 
    chartData: Object,
    options: Object
  },
  mounted () {
    this.renderChart(this.chartData, this.options)
  }
  
}
</script>
```






#今後
迷ったらまず１次情報をみるのだ。
McAfeeが原因でpingが届かない

「セキュリティー」ー「ファイアウォール」ー「スマートアドバイスと高度な設定」
「ICMP ping要求を許可する」にチェックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396969/3dba57a6-d3aa-a816-50db-6a279cd20c34.png)
インターフェースの抽象化について

どうも、かまいたちの山内じゃない方のやまうちです。
現在進行系で『アジャイルソフトウェア開発の奥義』っていう本を読んでいます。
今まで読んでた本からステップアップした本を読もうと思ったわけですが、話しが難しい。。。(；・∀・)
ホントはこの本からなんか書こうと思ったんですが、どうも無理っぽいｗ

とはいえその中にあるSOLIDを読んでいたら、すこぶる刺激を受けました。
**「プログラミングするなら抽象化するのが常識やん？」**
こんな感じで。
そんなわけで、インターフェースによる抽象化をアウトプットしていきます。

## Aボタンでパンチ
![Untitled Diagram (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281895/a2b223c2-8121-41b4-008f-81c52c64ed41.png)

こんな感じです。

これは**使う側(Aボタン)から使われる側(パンチ)への依存**が発生してます。
パンチ側から見ると誰かに呼ばれたらパンチするだけですが、Aボタン側から見るとボタンを押したらパンチしてほしいからですね。
パンチ側の気が変わって
「今日から俺、キックするわ」
こうなってしまっては、Aボタン側としてはボタンを押したらパンチして欲しいのにキックをしてしまうため非常に困ります。
ゴリゴリの依存です。

## インターフェース登場
ではAボタンがパンチにゴリゴリ依存してしまっている状況を打破しましょう！
![Untitled Diagram (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281895/c855647a-e5c2-b56d-b16a-9178b1ecf12c.png)

パンチインターフェースがAボタンとパンチの間に入りました。
こうなることで、Aボタンとしてはパンチインターフェースを呼び出すことで、パンチをすることができるようになります。

**インターフェースは、パンチが実装されていることを保証する**役目もあります。
ですので、パンチを呼び出したのにキックをするということも発生しなくなります。
要するにAボタンとしては、パンチがどういう状態にあるかというのは全く気にする必要はなく、
ただインターフェースに「ボタン押したからパンチ呼び出して」。
こう告げるだけパンチが可能です。

**依存するなら抽象に依存しよう！**

## もっとすごいパンチがしたい！

さて、なんかもっとすごいパンチがしたくなりました。
![Untitled Diagram (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281895/9ced9b2e-2a50-2866-44c2-3575bbb5da9a.png)
今度はこんな設計。
すごいパンチが新しく加わりました。
**すごいパンチは、パンチを継承してパンチインターフェースを実装**しています。
あくまでAボタンは抽象であるインターフェースに依存しているので、パンチがふつうのパンチでもすごいパンチでも、はたまたヘナヘナパンチでも関係なく、AボタンはAボタンをポチッとするだけです。

これが抽象であるインターフェースに依存するメリットです。

---

簡単な例ですが、インターフェースによる抽象化はこんな感じです。
他にも設計思想がたくさんあって、全然勉強が追いつかないのですが、SOLIDだとかGoFのデザインパターンとか多分他にも色々あると思いますが、焦らず少しづつ学んで行きます。
OSSのバグ修正のプルリクエスト備忘録

##1. はじめに
[M5Stack](https://www.switch-science.com/catalog/3647/)の温湿度センサ[DHT12](https://www.switch-science.com/catalog/3651/)のドライバの[バグ修正](https://qiita.com/pbjpkas/items/6a6a85d2c48d4e6c5c65#x2-dht12readtemperature%E3%81%AE%E4%BF%AE%E6%AD%A3)[^1]を[本家](https://github.com/m5stack/M5Stack)に[プルリクエスト](https://github.com/m5stack/M5Stack/pull/200)したときの手順など忘れないうちにメモ。

##2. 手順
![git-contribute.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221758/8ff9b25e-8fb4-6082-8af6-33254cce34bd.png)

1. 本家のリポジトリをforkする
2. 本家からフォークしたリモートリポジトリをローカルにcloneする
3. ローカルリポジトリの修正対象のソースコードを修正&テストする
4. ローカルリポジトリへcommitする
5. ローカルリポジトリからリモートリポジトリへpushする
6. 本家へプルリクエストを発行する

##3. コミットメッセージ
「何を」「どのように」を簡潔に記述します[^2]。

- Summaryはユーザ目線で概要を記述[^3]
  - Fixed incorrect value when temperature is negative.
  - (温度が負の時に値が誤るのを修正)
- Descriptionは開発者目線で内容、詳細を記述
  - Corrected calculation by referring to the bit indicating whether the temperature is positive or negative (byte address 0x03, bit 8).
  - (温度が正か負かを示すビット(バイトアドレス0x03、ビット8)を参照して計算するように修正)

##4. プルリクエストの作成
プルリクエストの[履歴](https://github.com/m5stack/M5Stack/pulls?q=is%3Apr+is%3Aclosed)を一通り眺めてからコミットメッセージを転記して作成したのですがマージの際にタイトルが "Fixed: DHT12 incorrect value when temperature is negative. (#200)" と修正されました。

タイトルはリポジトリの[トップページ](https://github.com/m5stack/M5Stack)や[コミット一覧](https://github.com/m5stack/M5Stack/commits/master)に表示されるのでマージ作業の手間を減らせるよう今後はそこでの見え方も踏まえて記述しようと思います。

##5. おわりに
OSSへのコントリビュートはこれが初で見よう見まねだったのですが次回からあまり戸惑わずにできそうです。

[^1]: 0℃未満の温度が意図しない値になる(温度を下げてゆくと … 0.2 → 0.1 → 0.0 → 12.9 → 13.0 → 13.1 … という値が返ってくる)バグを修正しました。
[^2]: コミットメッセージの書き方は「[Gitのコミットメッセージの書き方](https://qiita.com/itosho/items/9565c6ad2ffc24c09364)」という記事が参考になると思いました。
[^3]: 筆者はGitHub Desktopを使用していてコミットメッセージがSummaryとDescriptionの2つあります。
Webの画像を使って #Slack に一瞬で絵文字をアップロードできる #GoogleChrome 拡張はこれだ！

https://chrome.google.com/webstore/detail/slack-emoji-uploader/jfacjbibcobdehekkieokkloinlfdomg

# Google検索で犬を追加する例

こんなことができます。

![image](https://user-images.githubusercontent.com/13635059/73585489-3e33c080-44e5-11ea-904d-463e780eb8fd.png)


# 設定

WorkSpace = Team を設定しておく

![image](https://user-images.githubusercontent.com/13635059/73585570-b39f9100-44e5-11ea-827a-7c3db46944a1.png)

# 使い方

Webの画像を見つけて右クリック

![image](https://user-images.githubusercontent.com/13635059/73585443-c9f91d00-44e4-11ea-96f9-d7e21d8f2c6a.png)

絵文字の名前を決める

![image](https://user-images.githubusercontent.com/13635059/73585480-29572d00-44e5-11ea-97bc-9eb0d31f61c4.png)

以上！

# 一瞬で利用可能になった！


![image](https://user-images.githubusercontent.com/13635059/73585474-12183f80-44e5-11ea-90cf-33fba691c885.png)

# Slackのプロフィール画像を絵文字にする例

画像のURLを取得してChromeのアドレスバーにコピペするとやりやすい

![image](https://user-images.githubusercontent.com/13635059/73585590-e21d6c00-44e5-11ea-8b07-d7e44c6dc074.png)

# 文字絵文字・日本語絵文字を登録する例

絵文字ジェネレーターと組み合わせて使えば爆速

https://emoji-gen.ninja/

![image](https://user-images.githubusercontent.com/13635059/73585631-6d96fd00-44e6-11ea-89c6-47e14cec5b03.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
はじめてLTをして学んだこと

#### TL;DR
- LTは自分のファンを１人でも増やすことができたら成功．出だしで対象にしたい人の興味を引け
- LT終了後の懇親会は，簡単にコミュニケーションができるチャンス．フィードバックをもらいにいけ
- ファンが多いことは自信につながる．ファンが少ない間は信頼できる先輩や同僚に直接フィードバックをもらいにいけ


#### 背景
先日，会社のイベントでLT(Lightning talk)を半強制的にする機会がありました．最初は正直なところ笑いが取れればいいやと考えていたのですが，発表終了後に大量のフィードバックが得られたので，学んだことを備忘録がてらこちらに残しておきたいと思います．
ちなみに，発表内容としては「部長に怒られた話」として，日常的な発見と機械学習のモデルについて発表しました笑．

#### LTは自分のファンを１人でも増やすことができたら成功．出だしで対象にしたい人の興味を引け
LTとは，勉強会やカンファレンスの終盤の方で開催される5分ほどのプレゼン大会です．僕を含めて完璧主義な人間は，全員に刺さるようなプレゼンをしようと思います．しかし発表時間は5分なので全員に刺さるプレゼンをすることはほぼ不可能と言っても過言ではありません．なのでメッセージを刺したい人を選んで大丈夫なんです．出だしで自分の経験を話し，同じような経験をした/していない人に手を挙げさせてみてください．必ず１人はいると思います．あとはその人に向けたプレゼンをすればいいのです．


#### LT終了後の懇親会は，簡単にコミュニケーションができるチャンス．フィードバックをもらいにいけ
勉強会終了後の懇親会ってありますよね？私は席で隣だった人とかと社交辞令的な会話をしたり，スマホいじったり，作業したりしてすごしていることが多いのですが，LT終了直後は，ほぼ全ての人に「僕の発表どうでした？」で話しかけに行くことができます．
これってすごくないですか．しかもありがたいことに，相手から勝手に感想を言ってきてくれます．そこで相手に質問すれば自然にコミュニケーションもできます．ありがたいですね，LTをすることは．


#### ファンが多いことは自信につながる．ファンが少ない間は信頼できる先輩や同僚に直接フィードバックをもらいにいけ
LTをしている人って，自信があるのかわかりませんが物凄い肝っ玉を持っていると思っています．なぜその肝っ玉があるのかというとその人のファンが多いからと思っていました．なので，ファンが少ないうちは肝っ玉がどれだけあってもなかなかその一歩を踏み出すことはできません．そう言う時は，直接会える人に直接フィードバックをもらいにいきましょう．少しずつ自信をつけていくことが最初は肝心です．


#### おわりに
ということで，私が学んだことを書いてみました．LTをやったことがない人，やるのが怖い人に対して何か刺さることがあれば幸いです！
AVA 3 にアップデートした時に "Enhancement compilation must be configured in AVA’s Babel options." エラーが出る問題の対処法

# 問題

- 2020年1月に AVA 3 がリリースされました 🎉
    - https://github.com/avajs/ava/releases/tag/v3.0.0
- デフォルトで ESM をロード出来るようになったりと、セットアップが今まで以上に簡単になりました
- ぜひ利用したいですが、メジャーバージョンのアップデートということで config などに若干の変更がありました
- その１つが、 `compileEnhancements` フラグです。これまで AVA で TypeScript のソースコードをテストするために必須のフラグでした
- ところが、このフラグを AVA 3 で使うと、`Enhancement compilation must be configured in AVA’s Babel options.` という実行時エラーが発生します
- 詳しい経緯が知りたい方は Issue [#2376](https://github.com/avajs/ava/issues/2376) をご覧ください

# 対処法

- 結論から言うと、 `compileEnhancements` フラグは、 **TypeScript を利用したいだけのユーザーには不要**になりました
  - なので、 config からフラグを消すことでエラーが消える可能性があります
  - 既に TypeScript レシピは修正されているので、そこで [diff](https://github.com/avajs/ava/commit/91a00864f7f113dd63a2c4ecc383fc8c45f79665) を確認できます

# AVA 3.1 の Pre compiled TypeScript のテストを検討する

- その後すぐにリリースされた AVA 3.1 で、TypeScript サポートに新たな選択肢が生まれました
- 今まで TypeScript のソースコードを型情報も含めてテストするには、 `ts-node` などを使ってコンパイルしながらテストを走らせる必要がありましたが、ビルドとテストで二度コンパイルが走ることになり、冗長になりがちでした
- この方法では予めコンパイルされた情報を元にテストを実行するので、より時間を短縮出来る可能性があります
- 詳しいやり方は [@ava/typescript](https://github.com/avajs/typescript) に載っています

# 参考

- ["Enhancement compilation must be configured in AVA’s Babel options" error with TypeScript. #2376](https://github.com/avajs/ava/issues/2376)
- [@ava/typescript](https://github.com/avajs/typescript)
マークアップ記法の備忘録

物忘れがほんとうに激しいので
いつ何時忘れないようにマークアップ記法のよく使うものを記載しておく

まーググれば出てくるのですが
見づらかったり、わかりづらかったりしますので
自分専用としてｗ

#見出しタグ
見出しはWordPressでブログ書いているような感じです。

＃・・・H１タグ
＃＃・・・H2タグ
＃＃＃・・・H3タグ

これ以上はいらないかも

#リストタグ

「ー」を文頭につけるだけです。「ーー」や「ーーー」まであります。

例えば
「ー リスト」と入力すると（「ー」はもちろん半角）

- リスト


続けてリスト１、リスト２、リスト３と入力していくと

- リスト１
- リスト２
- リスト３


また「ー」の前に「半角スペース」を複数いれると
下記のようにもできる。

- リスト１
 - リスト１−１
 - リスト1-2
     - リスト１−2-1
     - リスト１−2-2
     - リスト１−2-3
- リスト２
- リスト３

#強調タグ・斜体タグ

「＊」で囲むと斜体や太字になります。「＊」の数で変わります。

例えばこんな記入になります　→　**＊＊文字を装飾したい＊＊**

注意：「＊」は半角にしてください。

- 「＊」が１つの場合　→　*強調したい*　斜体
- 「＊」が2つの場合　→　**強調したい**　太字
- 「＊」が3つの場合　→　***強調したい***　太字＋斜体

# 水平線

これはいくつか週類があるらしいですが「ーーー」とすると水平線を記載できる。
↓↓↓

---
↑↑↑

こんな感じの水平線。

ほかにも出てきそうなので、つど追記していきます。
【Android Studio】【Java】画面を縦で固定する方法

#使用するファイル
・AndroidManifest.xml

#追加するコード
13行目のみ

<img width="1402" alt="スクリーンショット 2020-02-02 12.14.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317272/0a3fe64d-2aa5-56e7-9074-47d30a9adfdc.png">

```
android:screenOrientation="portrait"
```
JavaScript　基礎文法　2

#はじめに
[前回の続きです。](https://qiita.com/raigakun/items/4e9a4e6ae4117ecc5917)
JavaScript(以下、JS)を学んでいく上で、1つずつ整理していきます。
私はVScodeでコードを書き、ブラウザでHTMLファイルを開いております。
そして、検証（ブラウザ上で右クリック）のconsole項目に反映されているのか確認しております。
もうすでにご存知の方、省略の仕方等ご存知でしたら、ご教授願います。

#条件分岐
Rubyと同様に、「if文」を使用します。
但し、以下4つの注意点を記載いたします。
①Rubyでは「elsif」でしたが、JSでは「else if」と使用します。
②Rubyでは( )で条件式をくくる必要はありませんでしたが、JSでは( )で条件式をくくります。
③条件式の後に続く{ }内の処理が実行される。
④Rubyのように、if文の終わりにendは必要ない。

```qiita.js
//使用するif文
if (条件式1) {
  // 条件式1がtrueのときの処理
} else if (条件式2) {
  // 条件式1がfalseで条件式2がtrueのときの処理
} else {
  // 条件式1も条件式2もfalseのときの処理
}


//実践してみます。
let num = 50
if (num % 15 == 0) {
  console.log(num + "は３と５の倍数です");
}
else if (num % 3 == 0) {
  console.log(num + "は３の倍数です");
}
else if (num % 5 == 0) {
  console.log(num + "は５の倍数です");
}
else {
  console.log(num + "は３の倍数でも、５の倍数でもありません");
}
```

【結果】
コンソール上に［50は5の倍数です］と表示されていれば、成功です。


#配列について

配列と配列に対する操作（追加、削除）をまとめます。

```qiita.js
//配列
let 変数 = ["要素", "要素", "要素"];

//要素の追加
変数.push("追加したい要素");

//配列の最後の要素を削除
変数.pop();            //Rubyでは削除したい要素を指定できたが、JSではできない。

//配列の最初の要素を削除
変数.shift();         //.pop()と同じく、JSでは指定できない。

//取得したい要素の取得
console.log(変数[取得したい要素の配列番号]);

//要素数の取得
console.log(変数.length);


//実践してみます。変数sportsの配列にfootballを追加＋配列の要素数を確認します。
let sports = ["tennis", "baseball", "rugby"];
 sports.push("football");
   console.log(sports);
   console.log(sports.length);
```

【結果】
写真の通り、配列の最後にfootballの要素が追加されており、次の行では配列の中の要素の数が表示されていれば、成功です。
<img width="1276" alt="d371368c831fb7d18f35bfce80744341.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576541/bd48c205-96c4-1cc7-c3fd-19a4717678b8.png">


#さいごに
日々勉強中ですので、随時更新します。
皆様の復習にご活用頂けますと幸いです。
Ruby　コーティング規約について　レイアウト編　3

# はじめに
[前回の続きです。](https://qiita.com/raigakun/items/56716198f42915c66f90)
Rubyの基礎を学習中の方に向けて記載致します。
私自身これからチーム開発を行う上で大事にしたい。知っておきたいことをOutputします。

#レイアウトについて
① メソッドの引数に値を入れる時、 =の周りにはスペースを入れる。 

```qiita.rb
# 悪い例
def some_power(action1=:punch, action2=kick, action3=jump)
  # do something...
end

# 良い例
def some_power(action1 = :punch, action2 = kick, action3 = jump)
  # do something...
end
```

② 可読性のため、大きな数値にはアンダースコアをつける。 

```ruby:qiita.rb
# 0はいくつありますか？

# 悪い例 
num = 1000000

# 良い例 
num = 1_000_000
```

#さいごに
毎日更新します。
皆様の復習等にご活用頂けますと幸いです。
JavaScript: クラス（とメソッド）を理解する

プログラムにおいて、何かの処理を実行させるには、命令を書きます。

例：

```js
new Search('panda');
```

解説：
クラスとは、処理を実行する順序が書かれたテンプレートのこと。
似たような処理を何度も個別に書くより、テンプレートを呼び出して異なる値だけを（カッコ内に書いて）入力させる事で、コードを短くできる。

ここで「Search」は呼び出すクラスの名前、「panda」はクラスに対し入力する値です。

1. Searchを呼び出し、pandaを渡す
2. Searchクラスが呼び出されると、クラスを元にして、コンピューターのメモリ内にインスタンスという処理オブジェクトが作られる。
3. このインスタンスのコンストラクタ（初期化処理の手続き）部分に、pandaという値が入力され、一定の処理がされる。
4. 処理終了。


クラスの呼び出し方：

```js
new Search('panda');
```


クラス（処理の設計書）の書き方の例：

```js
class Search {
    constructor (text) { // 標準装備されているconstructor関数。受け皿となる箱の名前は「text」。ここで「panda」が「text」に入力される。
      this.text = text; // this はインスタンス（クラスを元に作られた処理オブジェクト）のこと。
      this.counter = 0;
      console.log(text);
    }
    displayResult() { //メソッド。
      console.log('I like it.');
    }
  }
```

以下のように書くだけで、

```js
new Search('panda');
new Search('dog').displayResult();
```

Consoleにこんな結果が出ます。

```js
panda
dog
I like it.
```
【powershell】 pywin32 経由で現在開いている Word 文書を操作する


powershell では python の標準出力を受け取ることができるので（[過去記事](https://qiita.com/AWtnb/items/d80ba79cf198e4cb5b74)） pywin32 で処理します。


# コード

## powershell
とりあえず今回は現在開いている Word 文書のテキスト情報を取得します。

```activeWord.ps1
function Get-ActiveWordDocumentTextContent {
    <#
        .SYNOPSIS
        pywin32 を利用して現在開いている Word 文書からテキストを抽出する
    #>
    if ((Get-Process | Where-Object ProcessName -EQ "winword").Count -lt 1) {
        # Word が開かれていた場合にのみ起動する
        return
    }
    $pyCodePath = "{0}\activeword2text.py" -f $PSScriptRoot
    $command = 'python -B "{0}"' -f $pyCodePath
    $result = (Invoke-Expression -Command $command)
    return $result
}
```

## python
pip で pywin32 を取り込んでおきます。

```
pip install pywin32
```

メイン処理としては呼び出し側の `.ps1` スクリプトと同じディレクトリに下記スクリプトを配置します。

```activeword2text.py
"""
pywin32を使用して現在開いている Microsoft Word 文書からテキスト情報を抽出する
"""
import win32com.client
import codecs

def main():
    wdApp = win32com.client.Dispatch("Word.Application")

    if wdApp.Documents.Count < 1:
        if not wdApp.Visible:
            # 不可視のゾンビプロセスを捕まえてしまった場合は終了させる
            wdApp.Quit()
        return 0

    lines_list = []
    content = str(wdApp.ActiveDocument.Content.Text).replace(chr(12),"\r") # 改ページ／改セクションの処理
    content_without_BEL = content.replace(chr(7), "") # 表のセル区切りがBEL文字になるので削除
    for para in content_without_BEL.split("\r"):
        line = str(para).replace(chr(11), "") # 改行（≠改段落）処理
        lines_list.append(line)
    
    lines = "\n".join(lines_list)

    # コンソール出力時に windows の文字コード（cp932）に変換できない文字を無視しておく
    byte = lines.encode("cp932", "ignore")
    decoded = byte.decode("cp932")
    return decoded

if __name__ == '__main__': 
    print(main(), end="")
```

# 実行

powershell 側から呼び出します。

```
PS > Get-ActiveWordDocumentTextContent

寿限無寿限無
五劫の擦り切れ
海砂利水魚の
水行末雲来末風来末
……

PS > Get-ActiveWordDocumentTextContent | sv t
PS > $t | where {$_ -match "[ぁ-ん]"}

五劫の擦り切れ
海砂利水魚の

```


-------


powershell 6 では基盤の .Net Core に `[System.Runtime.InteropServices.Marshal]::GetActiveObject()` のメソッドが含まれていないようで困っていました。今回の内容で対処できて一安心です。

（WindowsPowerShell では上記のメソッドで現在開いている Office ソフトを捕まえて処理することができていました→[過去記事](https://qiita.com/AWtnb/items/b0742a26c622b81248c6)）

以下、今回の学び：

+ pywin32 で Word インスタンスを作成するとき、その時点ですでに文書が開いている場合はその文書がインスタンスとして割り当てられる。
    + なので、 `ActiveDocument` で捕まえて VBA 文法でアレコレ操作できる。
    + スクリプト経由で一通り操作してから手動で Word のウィンドウを閉じるだけでプロセスは解放される。
    + `New-Object` で COM オブジェクトを操作する場合とは対照的。この場合は、インスタンス作成のたびに各インスタンスに対して新たに `ActiveDocument` が生まれるので「現在開いている文書」の処理は困難。
+ powershell から外部コマンドを `Invoke-Expression` で呼び出すと、powershell はそのプロセスが終了するのを待ってから次の処理を行う。
    + いわゆる同期処理というシロモノ？
+ powershell は外部プロセスからの標準出力を改行区切りの文字列配列として受け取る。
    + python 側で `return None` としても `None` という文字列が出力されたと powershell は解釈する。

Excel に関してはプロセスの解放などが少し異なるようで使いこなせていません。今後の課題です。
スクリプト言語の比較しながらGoのお勉強 〜 Hello World編

# 前回からのおさらい
前回、[環境構築編(MacOS)](https://qiita.com/kuroseets/items/2e044a4d0fb95b680bd8)で各スクリプトを動かすための環境を作りました。
今回から実際にプログラムの動きを確認していきます。

# Hello World
プログラムの勉強をするのに最初にやること。
それは間違いなく「Hello World」の文字を画面に映し出すことで、wikipediaによると、
[Hello world](https://ja.wikipedia.org/wiki/Hello_world)
>プログラミングできるコンピュータの開発以来、小さなテストプログラムは存在してきたが、テスト文言として「Hello, World!」を使う習慣はブライアン・カーニハンとデニス・リッチーによる著書「プログラミング言語C」（1978年）[2]のC言語バージョンから始まったと言われている。同著書のプログラム例はhello, world（大文字なし、感嘆符なし）を標準出力に出力する。この例はブライアン・カーニハンがまとめたベル研究所の内部資料「Programming in C: A Tutorial」（1974年）[3]を継承したものである。

へー、そうなんだ。

## GoのHello World
ではまず、Goから。

```go:hello.go
package main

import "fmt"

func main() {
  fmt.Printf("Hello Golang\n")
}
```
そして実行

```shell
$ go run hello.go 
Hello Golang
```
表示されました❗️

どこで拾ったかもわからないくらい、どこでも入手できる、オーソドックスなスクリプトのようです。
1行目の`package`は名前空間とのこと。簡単に言えば外部から参照する際の識別子みたいなものでしょうから、当面簡単なスクリプトを作っている間は気にしなくて良さそうですね。
3行目の`import`。これは少々驚きでした。
文字列を標準出力に表示するだけの単純な処理なのに、組み込み関数に含まれていないというのは意外でした。
今後、Go触れることで、スクリプト言語Golangに対してのGoogleの設計思想が理解できてくることで、わかってくることなのでしょうね。
[Goプログラミング言語仕様 - 組み込み関数](http://golang.jp/go_spec#Built-in_functions)
４行目はエントリポイント。main関数から処理が始まるようです。
5行目が標準出力への出力処理。
[fmt パッケージ](http://golang.jp/pkg/fmt)の`Printf`の説明を読む限り、C言語でのprintf関数相当のものだそうで、format処理も含まれているということですね。
Hello Worldは単純な処理ですが、初めて触る言語に対しては色々と見えてくるものがあるのが不思議です。

それでは他の言語も見ていきましょう。
## Python
Pythonでは組み込み関数に`print`関数が実装されているため、そのまま出力処理を行えます。
[組み込み関数](https://docs.python.org/ja/3/library/functions.html)

```python:hello.py
print("Hello Python")
```
実行結果

```shell
$ python hello.py
Hello Python
```
## Ruby
Rubyではどこからでも参照されるモジュール`Kernel`にて`print`関数は組み込まれています。
改行に関しての処理は文字列に含めず、`puts`を使う方が他の言語と同じ動作になるのかもしれません。
[module Kernel](https://docs.ruby-lang.org/ja/latest/class/Kernel.html)

```ruby:hello.rb 
print "Hello Ruby\n"
```
実行結果

```shell
$ ruby hello.rb
Hello Ruby
```
## Perl
Perlでは組み込み関数`perlfunc`にて`print`関数は定義されています。
古いバージョンのドキュメントですが、[perlfunc - Perl 組み込み関数](https://perldoc.jp/docs/perl/5.26.1/perlfunc.pod)

```perl:hello.pl
print "Hello Perl\n";
```
実行結果

```shell
$ perl hello.pl
Hello Perl
```
## Bash
Bashの場合は組み込みコマンドで文字を出力しているわけではありません。
[Bashで組み込みコマンドを一覧表示する方法](https://news.mynavi.jp/article/20180125-bashshelllist/)
**<font color="Red">※bashvmで指定したbashでの組み込みコマンドの確認方法はわかりませんでした</font>**:bow_tone1:
外部コマンドのLinux系なら恐らく入っているであろう`echo`コマンドを使用して標準出力に出力しています。

```shell:hello.sh 
echo "Hello Bash"
```
実行結果

```shell
$ bash hello.sh 
Hello Bash
```

# はじめてGolangを触ってみた感想
やはり他のスクリプト言語と比べて、組み込み関数が極端に少ないということ。
返せば本体は身軽で、動かす環境次第でどのようなパーツを使うかを選別できるということかな。
この辺りは今後触って身を以て学んでいきます。
今後も使ったスクリプトは以下のGithubに残していきます。
https://github.com/kuroseets/my_stady_golang
ではでは。
VMとDockerについて比較してみた


# VMとDocker比較

## VM
１層目
PCやクラウド場のサーバーなどのインフラがまずある

２層目
Host OSが存在している(Mac OS, Windowsなど)

３層目
Hypervisorと呼ばれる各仮想マシンを実行するソフトウェア、ハードウェアがある
Hypervisorには直接ハードウェアとリンクしているものとHostOS上でアプリケーションとして動いているものの２種類がある。

４層目
Guest OSがある

５層目
バイナリーファイルやアプリケーションに必要なライブラリーなどがある

６層目
アプリケーションがある。

## Docker
２層目まではVMと同じ構造

３層目にHypervisorの代わりにDokcer Damonと呼ばれるサービスがあり仮想環境全体を制御している

４層目と５層目はライブラリーとアプリケーション

<img width="1420" alt="Screen Shot 2020-02-02 at 11.34.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273746/044de444-623d-21fa-efd2-cdf7b5b8cfc7.png">
Virtual Machines vs Docker Containers - Dive Into Docker by Nick Janetakis


DockerはGuest OSがのっからない分、余計なメモリやCPUリソースなどを節約できる。また立ち上げスピードが段違いに速い。
VMはシステムが独立、DockerはアプリがDocker imageとして独立。


参考
https://www.youtube.com/watch?v=TvnZTi_gaNc
Swift学習記＃０「swiftを始めるための環境設定」

#はじめに
Swift初心者です！インプットばかりはよくないと思い、この度アウトプットのために投稿させていただくことにしました。半分備忘録的なものなので、あまり期待しないでみていただけると幸いです。

#Swiftとは？
Swiftは、Apple社のiOSやmacOSのアプリケーション開発に用いられるプログラミング言語で、**静的型付け**と**型推論**の２つが特徴的です。

**静的型付け**：
コンパイル時に、変数や定数の型情報を決定する。
実行時エラーを事前に発見できる。

**型推論**：
変数や型を宣言しなくても、変数の型が自動的に決定される。

#開発環境
何パターンかありますが、個人的なオススメは**XcodeのPlayground**です！

**Xcodeとは？**：
エディタやデバッカ、GUIデザイナなどを揃えた、Swiftの統合開発環境。
つまり、これひとつでSwiftを使用した様々な開発が行える！

XcodeのPlaygroundを使うと、Swiftを対話的に実行できます。 
また、通常、SwiftでのiOSアプリ開発にはXcodeを使い、
ビルドして実行するので作業をスムーズに行えます。

#Xcodeの入手
XcodeはMac App Storeから簡単にインストールすることができます。
![スクリーンショット 2020-02-02 11.18.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477695/faab5c6d-470d-7bb6-79dc-76755b0e917e.png)

インストールが終わったら、Xcodeのアプリを起動。
![スクリーンショット 2020-02-02 11.23.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477695/5909a63e-ae18-0613-66db-b3ed3f83d02e.png)

Top画面でPlaygroundを選択し、開く。
![スクリーンショット 2020-02-02 11.23.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477695/6540e560-8fc5-b4eb-d58b-8cb503660b01.png)
![スクリーンショット 2020-02-02 11.25.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477695/a6d50071-8269-4166-52bf-08cda8a5a660.png)
＊どちらでも開けます。

このplaygroundでは、記入したソースコードを
その場で実行できる環境で、
コードの学習や検証などに役立ちます！

アプリの開発などは、
また違う環境設定で行うので別の機会に
解説します。

これで学習の準備は完了です！

#ここまで
今回は、Swiftを学習するための準備について
アウトプットさせていただきました。
次回からは、基礎文法の学習についてのアウトプットする予定です。

それでは、また。
sedで一斉置換

# はじめに
sedで一つ一つのファイルのある語を一斉に置換することは簡単にできるけれど、複数のファイルにそれぞれsedをかけていくのは面倒なので、一斉にできる方法を調べてみた。
# 結果
例えば、カレントディレクトリにあるすべてのhtmlファイルの http://www.ubuntu16.04 という記述を https://ubuntu18.04 に変えたいときは

```
 find . -name "*.html" | xargs sed -i 's;http://www.ubuntu16.04;https://ubuntu18.04;g'
```
でオッケー。  
find xargs sed
それぞれの使い方は各自で調べてください。

ちなみにMacでこれを使うとエラーが起きることがあるので、その時は

```
 find . -name "*.html" | xargs sed -i '' 's;http://www.ubuntu16.04;https://ubuntu18.04;g'
```

を試してみる。-iの後ろにスペースとシングルクオート2つを入れた。
Dockerでannotateがうまく起動してくれないときの対策法

#Dockerでannotateがうまく動いてくれない
開発を楽に進めるためにannotateをインストールしたけれど、起動コマンドを打っても何も反応がなく、3時間くらい詰まってしまいました。
結果解決したので、対策法をリマインドとして残しておきます。

#うまく起動しなかったDockerコマンド
    docker-compose exec web bundle exec annotate
これでうまくいくという情報がネットにあって試したのですが、自分の環境ではうまくいきませんでした。Docker toolboxだったのがいけなかったのかな？

#うまく起動したコマンド
    docker-compose exec web bundle exec rails g annotate:install
僕の場合はこれでannotateの設定ファイルがうまく作成されて、annotationを実行できました。参考になれば幸いです
圏を表現する型クラスの実装について(Rust版)

## 実装一覧

|名前|Star|Functor|Pure|Apply|Applicative|FlatMap|Monad|Empty|Semigroup|Monoid|Foldable|コメント|
|:----|:---|:----|:----|:----|:----|:----|:----|:----|:----|:----|:----|:----|
|[JasonShin/fp-core.rs](https://github.com/JasonShin/fp-core.rs)|461|○|○|○|○|○|○|○|○|○|○||
|[kitfre/Kinder](https://github.com/kitfre/Kinder)|107|○|-|-|○|-|○|-|-|○|○||
|[14427/hkt.rs](https://gist.github.com/14427/af90a21b917d2892eace)|72|○|-|-|○|-|○|-|-|○|-||
|[algermissen/rustz](https://github.com/algermissen/rustz)|49|-|-|-|-|-|-|-|-|○|-|Reader,State,Validation,Lenseあり|
|[clintonmead/haskell_bits](https://github.com/clintonmead/haskell_bits)|44|○|-|-|○|-|○|-|-|○|-|Haskellのdo構文のようなコンピュテーション式のようなサポートあり|
|[aoprisan/func](https://github.com/aoprisan/func)|12|○|-|-|○|-|○|-|-|○|○|HList, Free, Lazy, Trampolineなどもあるようだ|
|[daviswahl/rats](https://github.com/daviswahl/rats)|9|○|-|-|○|-|○|-|-|○|○|Trampoline, Traverseあり|
|[DarinM223/hkt.rs](https://gist.github.com/DarinM223/ff3b312034f95f9b8dddb3c840a7b72c)|0|○|-|-|○|-|○|-|-|○|-||

## 参考になる資料

- [Rustでもモナドは実装できるのか？](https://speakerdeck.com/helloyuk13/rust-demomonadohashi-zhuang-dekirufalseka)
- [Rustで(Either)モナドを作る](https://qiita.com/morikuni/items/8bdb39119379d60f628c)
- [Functional Programming Jargon in Rust](https://functional.works-hub.com/learn/functional-programming-jargon-in-rust-1b555)
    - JasonShin/fp-core.rs のブログ記事です

## 所感

- 高カインド型がないのでtraitの型メンバを使う方式=HKT方式？で実装されているようだ
- 利用者が多いのはJasonShin/fp-core.rs。自分で実装するなら14427/hkt.rsを読むと良さそう
【Unity】Asset Graphでアセット周りの反復作業を自動化しよう！

#Asset Graphとは
アセットの設定変更やAsset Bundleの構築など、アセット周りの反復作業をノードベースで自動化出来るエディタ拡張です。

#何が出来るの？
詳細は後にして、簡単な使用例を一つ紹介します。

#Import Settingsを自動化
Unityに画像ファイルを放り込むと、デフォルトでは以下のような設定でインポートされるので、Spriteとして使いたいファイルなどは必ずインポート後に設定を変えなければならず面倒です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283994/1fb68073-933b-3da4-1f76-367cf3e44e16.png)

というわけで、Spritesフォルダに放り込んだファイルは自動でSpriteとして使うための設定が適用されるようにしてみます。

まずは、対象のフォルダをAssetGraphウィンドウにD&Dします。
![6968f43e-3a29-4294-ac76-0d8348fd6960.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283994/c4e237e5-9955-9f42-026e-5a9a26be82c3.gif)

右クリックで「Overwrite Import Setting」ノードを作成しノードを接続、Inspecterで「Overwrite Import Setting」ノードを適用したい設定に編集します。
![c946feaf-5e17-4cce-adc2-b3db5e97d2a7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283994/80d271c3-f396-02c5-e580-512e131205ac.gif)
後は、右上の「Excute」を押すと、このAssetGraphが実行され対象のフォルダ以下のアセットに「Overwrite Import Setting」ノードの設定が適用されます。
さらに、「Load from Sprites」ノードの「Respond To Aseet Change」にチェックを入れ、「Use As Postprocessor」をオンにすると、アセットが追加されるたびに自動で実行されます。

![b5366655-4a40-4089-bfea-e6238e65578f.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283994/bce6cb5a-b881-a7f0-1cd2-862cc9a02fa9.gif)

#詳しく知りたい
参考になりそうな記事を集めました。
[【Unity】AssetGraphTool、ノーコーディングで 「指定フォルダにインポートしたアセットの設定を、指定した内容に自動更新する」 機能を作る](http://tsubakit1.hateblo.jp/entry/2018/01/11/233824)
[【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜](https://www.slideshare.net/UnityTechnologiesJapan/unityassetgraph-unity)
[AssetBundleGraph作ってみた 気持ち全国から選りすぐりのサンプル集を大公開！](http://sassembla.github.io/Public/2016:12:23%2000-00-00/2016:12:23%2000-00-00.html)
※「AssetBundleGraph」というのは旧名です。

GitHubに日本語のマニュアルがあるので、詳しくはそちらを読みましょう。
https://github.com/Unity-Technologies/AssetGraph

#まとめ
大きめのプロジェクトだとかなり役に立ちそうですね。
自作のノードを作って拡張することもできるので、いろんなことを自動化できる可能性を秘めてると思います。
辞書(dict)のキーに 0, 1, False, True を使った場合の興味深い挙動

Pythonの辞書(dict)キーにはHashableなオブジェクトが使え、hash値をキーに使用します。
Pythonの`bool`型は`int`型のサブクラスとして実装されており、`False` は `0` と、`True` は `1` と同じhash値になっています。

```py
>>> hash(0)
0
>>> hash(False)
0
>>> hash(1)
1
>>> hash(True)
1
```

では、`0`, `1`, `False`, `True` を辞書キーとして使うとどうなるかを見てみます。

```py
>>> d = { 0: 'zero', True: 'true' }
>>> d
{0: 'zero', True: 'true'}
>>> d[0]
'zero'
>>> d[True]
'true'
>>> d[False]
'zero'
>>> d[1]
'true'
```

辞書にない `False` と `1` も取得できてしまいました。
ハッシュ値が同じなので、当然といえば当然な挙動です。

辞書に代入してみます。

```py
>>> d
{0: 'zero', True: 'true'}
>>> d[False] = 'false'
>>> d[1] = 'one'
>>> d
{0: 'false', True: 'one'}
```

キーは `0` と `True` のまま、値が `'false'` と `'one'` に更新されました。

キーは最初に代入したときの値が使われ、値は最後に代入した値になることがわかりました。
当然と言えば当然ですが、興味深い結果でした。

```py
>>> d = { 0: '零', True: '真', 1: '壱', False: '偽'}
>>> d
{0: '偽', True: '壱'}
```

追記:

公式ドキュメントに書いてありました。


https://docs.python.org/ja/3/library/stdtypes.html#mapping-types-dict
>  比較した際に等しいとみなされる値 (例えば 1 と 1.0 と True) は、どれを使っても同じエントリーに関連付けられます。