OmniAICreator/Qiita-1.07M huggingface dataset:
[jQuery]Uncaught TypeError: $ is not a functionエラーが出た時の対処[備忘録]

<pre>$(function(){
$("#buttton").click(function () {
    jQuery("#form").slideToggle();
  });
});
</pre>
アコーディオンメニューを作成すべく上記のように記載し、
ブラウザで確認したところ
Uncaught TypeError: $ is not a function
というエラーが表示されたため

以下のように
$をjQueryに置換したところ解消。
<pre>
jQuery(function(){
jQuery("#buttton").click(function () {
    jQuery("#form").slideToggle();
  });
});
</pre>
使用ブラウザ: chrome
使用CMS: WordPress
参考にしたサイト: 
https://command-f.tech/jquery/44
Dockerコンテナ内でDockerを実行したい！

## ことの発端

僕の所属するPJでjenkisがDockerによって立てられているのだが、
このjenkinsからDocker実行しようとすると、DockerからDockerを使用することになり、
うまく動かない。

### 対策

すません、決して美しいやり方ではないが、、、  
ホストマシン側のDockerのパスとDockerのパスをマウントして、
コンテナからホストマシン側のDockerを使用するようにした。。。。


### 修正内容
docker-composeを使っている場合、docker-compose.ymlのvolumesに以下を追記する。

```
volumes:
    - jenkins-home:/var/jenkins_home/
    - /var/run/docker.sock:/var/run/docker.sock # これ
    - /usr/bin/docker:/usr/bin/docker # これ
```

次に、Dockerfileに以下を追記

```
RUN sudo apt-get update && \
    sudo apt-get install -y --no-install-recommends libltdl7
```
[ React / Preact ] JSX内のイベントハンドラと引数について (恐怖の無限ループ)

> 守秘義務のため記載してあるソースコードは問題が起きたものを再現したもので，そのものではありません。

=

> 社員さんからはこの記事を書くための了承は得ています。

## 何が起こったの??
これはインターン中に起こった悲劇です。
自分のアサインされているプロジェクトでは `Preact` と呼ばれる **軽量化版React** のようなものを使って開発を行なっています。機能面で言えば些細な違いはありますがほぼほぼ `React` です。

そこで以下のようなJSXを書きました。

```jsx
<div onClick={props.switchToggle(props.list)}>
  <Notification />
</div>
```

この `this.props.switchToggle` と呼ばれるメソッドは `Unistore` と呼ばれる `redux` のような状態管理ツールの state をいじっています。

これを実行したところ、なぜかブラウザ超重くなり動かなくなっちゃいました。

原因を究明するために `this.props.switchToggle` 内に `console.log("test")` を記載するとおびただしい量の test という文字列が出力され続けました。
この挙動を見る限り「無限ループ」起きてるじゃんということに気づきました。

メソッド内に問題があるか否かを検証するために `console.log("test")` で置き換える。

```jsx
<div onClick={console.log("test")}>
  <Notification />
</div>
```

その結果、レンダリング時にクリックしていないのにも関わらず `test` が表示されました。。
訳がわかりません。

そこでダメ元でアロー演算子を使ってみた..。

```jsx
<div onClick={() => console.log("test")}>
  <Notification />
</div>
```

すると正常に動く...。
なので、最初の構文もアロー演算子で実装すると...。

```jsx
<div onClick={() => props.switchToggle(props.list)}>
  <Notification />
</div>
```

これも正常に動く...。

ただ、自分たちのプロジェクトだとJSX内にアロー関数を書くと eslint error になるので代案が必要です。

まず、解決の前にこの原因をとりあえずこの状態で色々試したみた所、

**「JSX内の関数に引数をつけると即時関数になっているのでは」**

という結論に至りました。
これを解決する為、もともと `functional Component` で作成したいましたが，それを `Class Compoent` に置き換えて以下のようなメソッドを定義。

```jsx
class Header extends Component {

  switchToggle = () => this.props.switchToggle(this.props.list);
```

こうすることでJSX内では引数なしで関数を呼び出すことができます。
こんな感じです。

```jsx
class Header extends Component {
  switchToggle = () => this.props.switchToggle(this.props.list);
  render() {
    return (
      <div onClick={this.switchToggle}>
        <Notification />
      </div>
    );
  }
}
```

## 結局，何が起こっていたのか??
この記事を書くにあたって色々調べていたら公式でも説明がありました。
https://reactjs.org/docs/handling-events.html#passing-arguments-to-event-handlers

要約すると関数に引数を渡すとレンダリング時にそのまま実行しちゃうので アロー関数 を使うか bind させるかする必要があるようです。

### けど，それだと無限ループ起こらんくない??

確かに普通の関数をが即時実行されているのであれば起こりません。
ただ，今回の場合は即時実行されていたのは `uniStore` の `store` の状態をいじっていたメソッドです。

つまり

1. コンポーネントがレンダリングされる
2. 問題のメソッドが実行される
3. `Store`内の値が書き換わる
4. `Store`内の値が変更されたのでそれに合わせて再レンダリングが走る
5. レンダリングされたので 2. に戻る

という感じでループが発生していたようです。

## 追記
自分は `Class Component` を使用して実装しましたが他のパターンでの実装も教えてもらったので共有します！
### functional Component
```jsx
const Header = props => {
  const { list, switchToggle } = props;
  const handleClick = () => switchToggle(list);
  return (
    <div onClick={handleClick}>
      <Notification />
    </div>
  );
}
```

### Hooks
Preactはv10からHooksに対応します。
https://github.com/preactjs/preact/releases

```jsx
const Header = ({ list, switchToggle }) => {
  const toggle = useCallback(() => {
    switchToggle(list);
  }, [list, switchToggle]);
​
  return (
    <div onClick={toggle}>
      <Notification />
    </div>
  );
}
```

## 最後に
あんまり知られていないであろう知識なので共有しました。
僕自身，このバグで１時間以上費やしたのでこの記事が同じ問題に遭遇した誰かの役に立てれば嬉しいです...。

自分もまだまだ勉強中の身なのでこの記事に技術的な間違いや誤字があるかもしれないので，その時は優しくコメントで指摘してもらえると幸いです。
それでは最後までお付き合いありがとうございました！！
知っ得ハンズオンシリーズ はじめてのIoT AWS IoT Core 参加記 @目黒セントラルスクウェア

# はじめに
[9/13 (金) 18:00-21:00 知っ得ハンズオン-はじめてのIoT ~AWS IoT Core~](https://iotawsiotcore.splashthat.com/)に参加しましたので、質問等をメモしました。

# プログラム
## 最初の挨拶
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/82a23e8e-7f01-46ac-b61a-7b3522f240e1.png)

亀田 治伸（プロダクトマーケティング, エバンジェリスト）さんから趣旨説明。

AWS IoT の日本語チュートリアルは Raspberry Pi に SDK をインストールするところから始まるのでハードルが高いとよく言われる。今日はデバイスはダミーを使用して、IoT Core のハンズオンを実施する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/fff904e8-f8a1-8d48-69b4-2a5d30281954.png)


AWS IoT には様々な機能があるが、今日は図の真ん中のサービスを使う。
IoT Device Management はデバイスのグループ管理をしてくれる。今まではSDKなどでデバイスを管理するDBを作っておく必要があった。
IoT Device Defender はデバイスの乗っ取りを対策する。

AWS IoT には大きく二つの利用用途がある。

1. デバイスデータの可視化・故障予知・異常検知
2. ファームのアップデート・リモート機器制御

AWS IoT を データ収集・配信サービスである Amazon Kinesis と比較してみる。

|サービス|プロトコル|認証|通信|
|:---:|:---:|:---:|:---:|
|Amazon Kinesis|HTTP|専用ライブラリ|データストリーム|
|AWS IoT|HTTP, WebSocket, MQTT|証明書, SigV4, カスタム認証トーク, Cognitoz(MQTTの場合は証明書が必須)|双方向制御|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/58656bdb-6267-f041-1c7f-bb318810387e.png)

AWS IoT Core ではQoS0とQoS1をサポート。

証明書の有効期限は2050年。期限が切れるまで長いのでアクセス制御をポリシーで設定する。

このハンズオンではデバイスを用いず、VPS相当のサービスであるAmazon LightsailにAWS Cloud9及びAWS IoT SDKをインストールしてダミーのデバイスプログラムを用意する。Light Sail ではデフォルト VPC のみに VPC Peering の通信が可能。下り通信が1TBまで価格に含まれている(3.5ドル)のでお得。同じことをEC2 でやると 116 ドルくらいかかる。

## ハンズオン
ハンズオンは手順書を配布して各自自習、AWSの方が質問等を受け付けるという形式でした。
やったことは下記です。

- Light Sail でサーバを立て、Cloud9からsshで接続。AWS IoT SDKをインストールしてダミーデバイスのプログラムを実行する。
- IoT Core を設定し、S3にデータを格納する。
- Shadowを使ってデバイスの設定を変更する。

下記は自分がした質問です。

### S3保存の際のキーについて
**S3のキーはyyyymmddの日付をつけられる？UNIXTIMEにしたくない。**

AWS IoT の関数を利用すれば可能。
参考：<https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-sql-functions.html>

ちなみにキーの設定を下記のようにすれば、yyyyMMddのフォルダに名前がHHmmssのファイルが生成される。

```
${parse_time("yyyyMMdd", timestamp(), "UTC")}/${parse_time("HHmmss", timestamp(), "UTC")}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/02b7ae59-0903-8a3a-d2dd-a8e27db45744.png)


### Kinesisの使用について
**Kinesisは使用したほうが良い？**

S3やDynamoDBに入れるだけのときでもKinesisを使用したほうが良い。

1. Kinesisでストリーミングデータをバルク加工することで、後ろに控えるLambdaの起動数や処理回数を減らすことができる。
2. Kinesisはストレージを持っているので、大量データが来た時でもバッファリングすることができ、データのロストを防ぐことができる。
3. メッセージブローカーとして、サブスクライブ側の好きなタイミングでのデータ配信ができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/108d374d-d0cd-9bba-e6f2-31e68772c44e.png)

### 証明書の運用について
**証明書は1デバイス1証明書が良い？**

1デバイス1証明書を推奨している。
理想的には、最初に権限が制限された共通の証明書をインストールしておき、その証明書で新しい証明書の発行を実施、各デバイスに別々の証明書をインストールしてデータの送受信を行うようにする。

参考：[AWS IoT Coreでブートストラップ証明書を使ったプロビジョニング](https://aws.amazon.com/jp/blogs/news/aws-iot-core%E3%81%A7%E3%83%96%E3%83%BC%E3%83%88%E3%82%B9%E3%83%88%E3%83%A9%E3%83%83%E3%83%97%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%97%E3%83%AD%E3%83%93%E3%82%B8/)

# おわりに
AWS IoT めっちゃ簡単で楽しかったです。
ただ、ハンズオンではデバイスの管理が大変そうだと感じたので、IoT Device Management を使って管理をできるようにしたいですね。

---

連携先がめっちゃあってすごい！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/5c104726-f030-6447-60f3-c8d57ddf2099.png)
【Swift】プログラムの制御を写す文

#プログラムの制御を移す文
今回はプログラムの処理・制御を次のフェーズに移す文を３つ紹介します。

##fallthrough文
fallthrough文はswitch文で現在のcaseの処理を終了した後に、その次のケースの処理を実行させる文です。
それではサンプルコードを見ていきましょう。

```
let a = 1

switch a {
case 1:
   print("case 1")
   //ここで次の処理を実行させるよう制御しています
   fallthrough
case 2:
   print("case2")
default:
   print("default")
}

//実行結果
case1
case2
```
上記のコードを見るとswitch文の条件はa(1)のはずなのに、実行結果はcase2までが出力されています。
これがfallthrough文の特性で、先ほども説明した通り現在のcaseの後のcaseも処理するという機能です。
これはもともとC言語に由来した機能で、 Cではデフォルトの挙動で後続のケースが実行されるようになっています。
しかしSwiftではプログラムの予期せぬ実行を避けるため、それをしないような仕様になっているます。そのため、このfallthrough文がそのCのデフォルト機能の代用機能を担っています。

##break文
break文は、switch文やfor文などの処理の実行を中断することができます。
それでは以下のサンプルコードを見てください。

```
var containsTwo = false
let array = [1, 2, 3]

for element in array {
 if element == 2 {
     containsTwo = true
     break
  }
  print("element: \(element)")
}
print("containsTwo: \(containsTwo)")

//実行結果
element: 1
containsTwo: true
```
以上の処理を見たら分かるように、for文の処理で2が回ってきた回にbreakがかかり、結果的に1しか出力されない結果になりました。


##continue文
continue文は、continue文以降の処理をスキップするし次の回に回す機能を持っています。

```
var odds = [Int]()
let array = [1, 2, 3]

for element in array {
 if element % 2 = 1 {
    odds.append(element)
    continue
  }
  print("even: \(element)")
}

print("odds: \(odds)")

//実行結果
even: 2
odds: [1, 3]
```
上記の処理のようにcontinue文を使用することで、数値が奇数の回は次の処理の偶数をプリントする処理を行なっていません。
このようにcontinueはfor文などでその回の残りの処理をスキップして、次の回に回す処理です。

##ラベル
ラベルはif文や、for文などで使うcotinue文・break文の制御の移動先を指定できます。
それでは、まずラベルを使わないパターンから見ていきましょう。

```
for element in [1, 2, 3] {
    print("element: \(element)")
    
    for nestedElement in [1, 2, 3] {
        print("nestedElement: \(nestedElement)")
        break
    }
}

//実行結果
element: 1
nestedElement: 1
element: 2
nestedElement: 1
element: 3
nestedElement: 1
```
上記のパターンを見ると、２つ目のfor文でbreak文が記述されているため残りの2と3を出力する前に処理が終わり、結果1だけ出力されています。

次にラベルを使うパターンです。

```
label: for element in [1, 2, 3] {
    print("element: \(element)")
    
    for nestedElement in [1, 2, 3] {
        print("nestedElement: \(nestedElement)")
        break label
    }
}

//実行結果
element: 1
nestedElement: 1
```
上記のコードを見るとbreakの後にlabelという記述があり、forの前にもlabelが記述されています。
この記述のおかげで、二つ目のfor文内のbreakの制御がlabelが付与されているfor文に渡され、結果１つ目のfor文が一回しか処理されず上記のような実行結果になりました。
ORCAのリストをSuperColliderに渡す

今夜は葛西スペースでのクリエイティブコーディング会。参加者それぞれ「これやります！」宣言をして、それぞれ作業を頑張っています。私は「ORCAのリストをSuperColliderに渡すサンプルを作ってQiitaにアップする」ところまでが今日の目標です。クラフトワイフのライブの準備とも言います！


まずはSuperColliderのSynthDefを定義します。好きなやつなんでもどうぞ。ライブで使っているやつを載せておきます。

```
SynthDef(\dtk_arp, { arg freq=208, amp=0.8, pan = 0, releaseTime = 0.1,filterLowFreq = 2000; 
	var osc, seq1, seq2, env;	
		osc = Pulse.ar(freq, Line.kr(0.5,0.48,0.1), amp * 0.5) + Pulse.ar(freq/2, Line.kr(0.5,0.49,0.2), 0.01) ;
		env = EnvGen.kr(Env.perc(0.0001,releaseTime * 10,1,-3), doneAction: 2);
		osc = LPF.ar(osc, XLine.kr(10000,filterLowFreq,0.1));
	Out.ar(0, Pan2.ar(osc * env, pan));
}).store;
```

次にSCのパターン、Pbindで使いたいリストを定義しておきます。

```
~test = PatternProxy(Pseq([0,2,4,6], inf));
```
上のパターンを使ったPbindを作って再生します。今はリストを音の高さに割り当てています。

```
~pt = Pbind (
	\instrument, \dtk_arp,
	\degree, ~test,
	\amp, 1.5,
	\dur, 0.5
).play;
```

ORCAちゃんに移動しましょう。４つの数字のリストをpというタグをつけてOSC送信するコードです。1番目と4番目の要素はRを使ってランダムにしてあります。ORCAソフトのOSCメニューからSuperColldier(57120)を選択しておくのを忘れずに！

```
..R4.R8
=p3241.
```

SuperColliderに戻り、pのOSCメッセージを受け取る部分を書きます。

```
(
OSCdef(\orca_osc, {|msg|

	msg.removeAt(0);
	msg.postln;
	
	~list = msg;
	~test.source = PatternProxy(Pseq(~list,inf));

}, \p);
);
```

これを実行しておけば準備完了です。

ORCAの上から２列目の=のところにbangを送ってトリガーすればOKです。このトリガー、使い道が謎だった東西南北コマンドが便利です！２列目の=の数マス左にいき大文字のEをタイプします。Eが=に当たったところで、OSCメッセージがSuperColliderに送られて、Pbindの音の高さのところが変わります！

ではまた来月！
zenkakuを常時起動に設定する

#　目的
VSCodeの拡張機能zenkakuをおすすめして頂き、非常に便利だと感じました。
しかし起動するたびに>>Enable zenkakuを入力するのは手間だったため方法について調べました。


### 参考サイト

>戯れ言葉　様
>VSCode の拡張機能zenkaku を起動時から適用
>https://blgid1974.blog.fc2.com/blog-entry-1154.html

変更手順に関する詳細は上記サイトを参考にしてください。

Macを初めて触る私が引っかかったポイントについて
#### １
上記サイトではWindows7を利用されていたため、MacでのVSCodeのフォルダの場所がわからない

#### ２
隠しフォルダの表示の仕方がわからない

### １について
MacとWindowsでは保存されているフォルダが違うと思い込んで様々なフォルダにアクセスしました。
結論としてはUserフォルダで同一階層に保存されていました。

### ２について
VSCodeは隠しフォルダに設定されていて通常では表示されていません。
そのため隠しフォルダを表示する必要がありました。

### 参考サイト
> PC設定のカルマ　様
> Mac - Finderで隠しファイル・フォルダを表示する方法
> https://pc-karuma.net/mac-finder-show-all-files/

上記サイトを参考にして隠しフォルダを表示したところユーザーフォルダにVSCodeがうっすらと…
<img width="694" alt="スクリーンショット 2019-07-03 9.27.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497069/0613fff2-3b98-d45d-8134-dbaacd236019.png">
VSCodeが表示された！
 
### まとめ
Macintosh HD→ユーザ→Username(自分で設定した名前)→.vscode→extensions→mosapride.zenkaku-0.0.3に保存されているextension.js の var enabled = false; を var enabled = true; に書き換えましょう！

以上で無事にMacにインストールされたVSCodeのzenkakuが起動時から適応されるようになりました！
mediapipeのiosチュートリアルをやってみた

## Mediapipeとは
MLシステムを構築する上で、前処理、モデルでの推論、結果の後処理、描画、など複数のコンポーネントが存在
MediaPipeは、これを各機能のノードからなるグラフとして扱い、各コンポーネントの組み合わせや切り替えでアルゴリズムのパイプラインを開発できるようにしたGoogleのフレームワーク

## iOS用MediaPipeのセットアップ
 - Xcodeのインストール
 - 開発証明書とプロビジョニングファイルの取得
 - Bazelのインストール

```
brew tap bazelbuild/tap
brew install bazelbuild/tap/bazel
```

 - MediaPipeリポジトリのclone

```
git clone https://github.com/google/mediapipe.git
```
 - `mediapipe/mediapipe/provisioning_profile.mobileprovision`にプロビジョニングプロファイルをシンボリックリンクまたはコピー

```
cd mediapipe
ln -s ~/Downloads/MyProvisioningProfile.mobileprovision mediapipe/provisioning_profile.mobileprovision
```

※`open ~/Library/MobileDevice/"Provisioning Profiles`でダウンロードしたプロビジョニングファイルを表示できます

## Xcodeプロジェクトを作成しアプリ実行
 - 1, Tulsiの取得
 
Tulsiには少し問題があり、Xcode 10.3でビルドできません。

・ Xcode 10.3以外の時

```
# cd out of the mediapipe directory, then:
git clone https://github.com/bazelbuild/tulsi.git
cd tulsi
# Now we can build Tulsi.
sh build_and_run.sh
```


・ Xcode 10.3の時


```
# cd out of the mediapipe directory, then:
git clone https://github.com/bazelbuild/tulsi.git
cd tulsi
# Apply the fix for Xcode 10.3 compatibility:
git fetch origin pull/99/head:xcodefix
git checkout xcodefix
# Now we can build Tulsi.
sh build_and_run.sh
```

これにより、ホームディレクトリ内のアプリケーションディレクトリ内にTulsi.appがインストールされます。

 - 2, Tulsiアプリを使用して`mediapipe/Mediapipe.tulsiproj`を開く

 - 3, [構成]タブで`MediaPipe`を選択し、下の[生成]ボタンを押します。プロジェクトが生成されると、Xcodeで開かれます。

 - 4, Xcodeのターゲットメニューで任意のMediaPipeデモを選択し、通常どおりビルドおよび実行できます。

※Xcodeにアプリの実行を要求すると、デフォルトでデバッグ構成が使用されます。パフォーマンスを向上させるために、リリース構成を使用することもできます。

## 参照
[Mediapipe 公式](https://mediapipe.readthedocs.io/en/latest/mediapipe_ios_setup.html)
[GoogleのMediaPipeでMLアプリ開発が楽になる](https://tkat0.github.io/posts/mediapipe/)
【社内LT用資料転載】純粋関数 

## はじめに
社内LTシリーズ第三弾です。
LTは2019年9月13日に行い資料はその時点での情報となります。
今回は純粋関数(pure function)についてです。
5分くらいの軽い発表になります。

第一弾： [PHP7移行概要](https://qiita.com/hayashi-ay/items/8c2823d212a29f16f716)
第二弾： [そうだゴルフをしよう⛳](https://qiita.com/hayashi-ay/items/be1f358a9d930ba312a0)

---

## 純粋関数とは
以下の条件を満たすものを純粋関数という。
 - 参照透過性
 - 副作用がない

---

## 参照透過性
同じ引数に対して常に同じ値を返す。

---

## 参照透過でない例

```javascript

let PI = 3.14;
const calculateArea = radius => radius * radius * PI;

calculateArea(10); // returns 314.0
```

---

## 参照透過である例
```javascript
let PI = 3.14;
const calculateArea = (radius, pi) => radius * radius * pi;

calculateArea(10, PI); // returns 314.0
```

---

## 副作用がない
関数外部の変数を書き換えない

---

## 副作用がある例
```javascript
let counter = 1;

function increaseCounter(value) {
 counter = value + 1;
}

increaseCounter(counter);
console.log(counter); // 2
```

---

## 副作用がない例
```javascript
let counter = 1;

const increaseCounter = value => value + 1;

increaseCounter(counter); // 2
console.log(counter); // 1
```

---

## メリット
-  テストが容易
- ソースを読みやすくなる
Mozilla TTS(Text-To-Speech) のメモ

Deep learning for Text to Speech
https://github.com/mozilla/TTS

Mozilla による neural text-to-speech の実装です. 現状(2019 年 09 月 12 日時点)ではなかなかアクティブに開発されている実験的なプロジェクトな感じです.

実験的ではありますが, Tacotron2 + WaveRNN の組み合わせでなかなかいい感じの結果が得られています.

https://soundcloud.com/user-565970875/ljspeech-logistic-wavernn

上と同じ?かは不明ですが, TTS Tacotron2 + WaveRNN の colab ノート

https://colab.research.google.com/github/tugstugi/dl-colab-notebooks/blob/master/notebooks/Mozilla_TTS_WaveRNN.ipynb


## TTS

TTS という名前がよくないですが, 中身的には基本的に Tacotron/Tacotron2 ベースでの text-to-speech 実装を行っています.


`server/` にあるデモは Tacotron ベース単体なので, 動かしてみても, 他の Tacotron 実装のようにいくらか機械的なスピーチ結果になっています.

WaveRNN と組み合わせることで, 処理に時間はかかりますがより自然な発音がえられます.
WaveRNN との組み合わせは,

https://github.com/mozilla/TTS/issues/272

にある, Colab ファイル(最初のほうで示したものと同じもの)を見てみてください.

https://colab.research.google.com/github/tugstugi/dl-colab-notebooks/blob/master/notebooks/Mozilla_TTS_WaveRNN.ipynb

### SST

ちなみに, Mozilla では, Speech-to-text のほうは DeepSpeech というのがあって, こちらもややこしい名称になっています

https://github.com/mozilla/DeepSpeech

Mozilla deepspeech で speech-to-text する(English). アン・ハサウェイさんのスピーチの文字起こしにもチャレンジ
https://qiita.com/syoyo/items/9e5898344403b896bf04

### Server デモ

Tacotron2 モデルを使うのを想定します.

TTS README にあるやりかた(requirements.txt を利用)だと, ライブラリが古かったりとかでうまく動きません.

上記 Colab にあるように
 
```
$ git checkout Tacotron2-iter-260K-824c091
$ pip install -q gdown lws librosa Unidecode==0.4.20 tensorboardX git+git://github.com/bootphon/phonemizer@master localimport
$ apt-get install -y espeak
```

として `Tacotron2-iter-260K-824c091` branch を利用し,
pip で依存ライブラリをインストールしてあげてください. pytorch は 0.4.1 以上であれば動くようです.

espeak は phonemizer で利用します. espeak がインストールされていないと, phonemize をうごかしたときにエラーがでます.

それ以外は README 通りに checkpoint, config.json をダウンロードして設定すれば動くはずです.

## Pretrained model(checkpoint file)

学習済みモデルが以下から取得できます.

https://github.com/mozilla/TTS/wiki/Released-Models


## Mean Opinion Score Results

https://github.com/mozilla/TTS/wiki/Mean-Opinion-Score-Results

Judy という Mozilla 内部のデータセットではなかなかいい感じの結果が得られています.
(ただ, Judy を使って学習した pretrained model は公開されていない)

## TODO

* [ ] 学習を試す.
* [ ] ROCm PyTorch で学習, 推論ができるか試す
* [ ] 日本語や中国語で学習をためす
vscodeでVeturのScaffoldが効かなくなってしまった→自作snippetをしよう！

# はじめに
vscodeでVueを使っている人は入れている人も多いであろうVetur、このsnippetが使えなくなってしまいました。
なので、渋々自作snippetを作っていきたいと思います。

# scaffoldを作ってみよう！

まずvscodeを開き、File→Preferences→Usersnippetsをを選択、そこからVueを検索してあげます。
vue.jsonが出てくると思うので開きます。

![vscode1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496421/0728c379-14c2-b419-ab3e-e994cb0bd507.gif)

vue.json内でsnippetを書いていきます。

```json:vue.json
 {

  ///いらないところは省略

  "scaffold": {
    "prefix": "scaffold",

    "body": [
      "<template>",
      "$1    ",

      "</template>",
      "    ",
      "<script>",
      "export default {",
      "   ",
      "}",
      "</script>",
      "    ",
      "<style>",
      "     ",
      "</style>"
    ],
    "description": "scaffold"
  }
}
```

prefixはvscodeで補完するときに使う名前、
descriptionはsnippetの説明文です。(descriptionは適当でいいと思う)

bodyが実際使われるところで、今回のscafflodの場合は単純に一行ごとに書いていけばいいだけです。
間に空行を挟みたいときは"　　　",としてあげます。

謎の$1ですがこれはsnippet展開後のカーソルの位置です。何もしてないとsnippetの終わりに来てしまいます。

$1が使われている様子をgifにして終わろうと思います。

![vscode2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496421/95907fcb-81f6-9ab3-3c43-c94f7dfa8f74.gif)
Code Climate を Macのローカル環境で動かす

## Code Climate とは

[https://codeclimate.com](https://codeclimate.com)

- コードの品質を測るためのサービス
- OSS で使う分には無料
- docker を使って動作環境を自分で作ることもできる

今参加しているプロジェクトでは CI で Code Climate の実行結果を見れるようにしているのですが、たまにプッシュする前に Code Climate の結果を見たいことがあり、手元で動かせるようにしてみました。

## 環境構築

環境構築とはいっても、Homebrew から導入してゴニョゴニョするだけで済みます。

### Docker image を pull する

\*Docker for Mac が導入されている前提

```
$ docker pull codeclimate/codeclimate
```

### Homebrew から Code Climate を導入する

```
$ brew tap codeclimate/formulae
$ brew install codeclimate
```


### global に Code Climate を実行できるようにする

brew install が完了した段階で、shell を叩けば Code Climate は動くようになるのですが、一々入力をするのも面倒くさいので、以下の内容で `.sh` ファイルを作成しておきます。

```
sudo docker run \
--interactive --tty --rm \
--env CODECLIMATE_CODE="$PWD" \
--volume "$PWD":/code \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume /tmp/cc:/tmp/cc \
--volume /code/node_modules \
codeclimate/codeclimate analyze -f html > output.html
```

`codeclimate analyze` コマンドは `-f` というオプションを受け取ることができます。コードの解析結果の出力形式を指定するためのオプションです。今回は html 形式で出力して、output.html というファイルに書き込むように設定しています。

作成した　`.sh` ファイルを`/usr/local/bin` 以下に配置し、権限を弄れば準備完了です。

```
$ cd /usr/local/bin/ && sudo chmod 755 codeclimate
```

後は、Code Climate の設定ファイルのあるディレクトリで、`codeclimate` コマンドを叩けば、解析結果が `実行したディレクトリ/output.html` に出力されます。

## 解析が中々始まらない場合
[このissue](https://github.com/codeclimate/codeclimate/issues/912)を参考に`--volume /code/node_modules \`をdocker 起動時のフラグに追加したところ、スムーズに解析を行ってくれるようになりました。

```
sudo docker run \
--interactive --tty --rm \
--env CODECLIMATE_CODE="$PWD" \
--volume "$PWD":/code \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume /tmp/cc:/tmp/cc \
--volume /code/node_modules \
codeclimate/codeclimate analyze -f html > output.html
```

## 参考

- [Github](https://github.com/codeclimate/codeclimate)
- [Run Code Climate Locally](https://medium.com/@empressia/run-code-climate-locally-e30635321e18) この記事の手順を参考にシェルをちょこちょこ書き換えています。
ConoHa VPSのUbuntuにユーザを追加してSSHを公開鍵認証にする最も簡単な方法

ユーザを作って権限付与して、ローカルで鍵生成して転送して・・・と面倒な解説ばかりだしCentOSでの解説しか無かったので、UbuntuのVPSで、一般ユーザで公開鍵認証のSSHをする方法です。とっても簡単にしました。

認証用のKeyを、rootと一般ユーザで同じものを使うことにして、`ssh-keygen`やscpも使いません。

一般ユーザ`user`を作ります。

# 前提条件

* 今からConohaでUbuntuのVPSを立てる
* SSHのクライアントはローカルに入っている

# ConoHaでの準備

## ConoHaでSSHキーを作る

ConoHaのセキュリティタブから、SSHセットを予め作ってしまいます。
このとき秘密鍵を一度だけダウンロードできるので、`~/.ssh/UbuntuVPS_PrivateKey.pem`とでもして保存します。
![2019-09-13_19h22_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488658/02b70c5c-3771-6761-c437-4facacca2a7f.png)

## VPSを作る

オプションのSSH Keyを、”キーを選択”として、さっき作ったキーを指定します。

![2019-09-13_19h27_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488658/0e24e482-c4f2-0a3a-bd86-4decd837de31.png)

ここでSSHを指定すると、VPSの認証の設定が勝手に以下のようになります。
公開鍵認証しかするつもりがないなら、`/etc/ssh/sshd_config`は触る必要がありません。

* 認証は公開鍵のみ：`~/.ssh/authorized_keys`を参照する
* パスワードでの認証は許さない
* パスフレーズのないキーは許す
* rootは指定したRSAキーを公開鍵にもつ

とにかく、これで”追加”を押せばVPSが作られます。


# ローカルでの準備

先にSSH接続用の設定を作ってしまいます。
`~/.ssh/config`を、なければ生成して編集する。

```config:~/.ssh/config
Host root
	HostName VPS_IP
	Port 22
	User root
	IdentityFile path\to\.ssh\UbuntuVPS_PrivateKey.pem

Host user
	HostName VPS_IP
	Port 22
	User user
	IdentityFile path\to\.ssh\UbuntuVPS_PrivateKey.pem
```

User以外はすべて同じです。お手軽ですね。
`IdentityFile`には、ConoHaからダウンロードした秘密鍵：pemファイルを指定します。

この段階で、rootには以下のコマンドでssh接続できるハズです。

```
ssh root
```

そのrootのまま進みます。

# VPSの操作

rootでssh接続できたら、一般ユーザを追加して、sudo権限を与え、sshはrootと同じ用にします。
以下のコマンドでいっぺんに完了します。
※CentOSで言うところの`wheel`グループがubuntuの`sudo`グループになります。

```bash
# パスワードやらプロフィールやら求められる
adduser user

gpasswd -a user sudo
ls /home/
mkdir /home/user/.ssh
cp .ssh/authorized_keys /home/user/.ssh/
chmod 700 /home/user/.ssh
chmod 600 /home/user/.ssh/authorized_keys
chown -R user /home/user
```

完了したら一度`exit`する。

# たしかめる

次のコマンドでrootで入れることを確認したら、

```
ssh root
```

次のコマンドでuserで入れることを確認。

```
ssh user
```
VisualStudio2015 C++ エクセル #import エラー



```
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <iostream>
#include <string>
#include <windows.h>

//Excelを操作するためのタイプライブラリを読みこむ (Excel2010(32bit))
#import "C:\Program Files\Common Files\microsoft shared\OFFICE14\MSO.DLL"
#import "C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" rename("CommandBars", "ExcelCommandBars")
#import "C:\Program Files\Microsoft Office\Office14\EXCEL.EXE" rename("RGB", "Excel2010RGB") rename("DialogBox", "ExcelDialogBox") rename("CopyFile", "ExcelCopyFile") rename("ReplaceText", "ExcelReplaceText6")

void main(void)
{

	getchar();
}

```

余計なインクルードは気にしないでください。そもそもC++でエクセル扱うのは相性悪いのでおとなしくC#にしましょう。
とはいえそれでも使わないと行けない状況であれば頑張りましょう。（C#にしたい）

やりたい事：C++でエクセルを操作したい。その前に#importが通らない

調べると#importでどの記事も３つぐらいのなにかをインポートしてました。
思考指定でコピペして持ってくるとエラーで通りません。
厄介な所はエクセルのバージョンによってフォルダ名やフォルダの場所が違うので見つけた記事と完全一致の環境でないとサンプルは通らないと思います。Office14やOffice17とかC:\Program Files (x86)とかC:\Program Filesなど違うので注意

######罠１：インストールしたエクセルによってインポートするファイルや場所が違う

とりあえず必要なのは以下３つ
MSO.DLL
VBE6EXT.OLB
EXCEL.EXE

Everithingを使って探すかCフォルダのプログラムファイルの中を走り回ってさがすかしてください。
https://forest.watch.impress.co.jp/library/software/everything/

見つけたら１ファイルずつ読み込みましょう。上の順番通りにしましょう。

自分の場合はMSO.DLLは問題なく読み込めました。
ひかかった所
　#include って書いた瞬間にファイルが無いとかエラーでると思います。
　#importはコンパイルして展開されたあとにエラーを出力するので書いた瞬間はエラーのままだったりします。

次にVBE6EXT.OLBは rename がないとエラーでした。
おそらくVisualStudioがすでに読み込んでるクラスと競合してエラーになるんだと思います。
なのでエラーで　rename　しろ！といわれるか、二重定義されてるとかいわれるます。
リネームしましょう。（初めて使った）
rename("CommandBars", "ExcelCommandBars")
ExcelCommandBarsというのは別に被らなさそうな名前であればなんでも良いと思います。

最後のEXCEL.EXE
めちゃくちゃエラーでたので１個づつリネームしていったら治りました。

とりあえず最低の準備はできました。

次はエクセルにアクセスしてみたいと思います。来週書きます。
ExcelからRedmineのWikiを更新してみた

ExcelからRedmineのWikiを更新してみたので。
今更ですが。

# 前提条件

* Redmineに対する知識
* ExcelおよびVBAに対する知識

# コード

これは**base_url**で運用しているRedmineのプロジェクト**project_id**下のWikiをAPIアクセスキー**acc_key**を使ってTextile形式のテキスト**wiki_text**でガツンと書き換えます。

※APIアクセスキーはRedmineのユーザー設定から取得しておくこと。

Excel表をTextile形式に変換するのは[拙稿](https://qiita.com/acknpop/items/2c5e3aee4edfee197625)をご参考に。


```vb

'Wiki更新
Sub UpdateWiki(base_url as String, project_id as String, acc_key as String, wiki_text as String)

    Dim uri As String
    uri = base_url & "/projects/" & project_id & "/wiki/Wiki.xml?key=" & acc_key

    Dim http As Object
    Set http = CreateObject("MSXML2.XMLHTTP")

    http.Open "PUT", uri, False

    http.setRequestHeader "Accept", "application/xml"
    http.setRequestHeader "Content-Type", "text/xml"
    http.send CVar("<?xml version=""1.0""?><wiki_page><text>" & wiki_text & "</text></wiki_page>")

    Set http = Nothing

End Sub
```

Wiki以外を書き換える場合は、uriに指定しているWiki.xmlの部分を変更してください。
部分修正する場合はxmlでGETしてtext要素をパースしてから対応することになります。

# 参考

- [Redmine REST API - Wiki pages](http://www.redmine.org/projects/redmine/wiki/Rest_WikiPages)

# あとがき

ログインせずにボタン一発で更新できるってとっても便利。

あと、どなたかユーザー一覧の取得方法をご教示ください。できればVBAで。

```
GET /users.xml
```

だと表示数制限にかかってしまって、全員(100名超)は取れないんです。

# 追記

引数wiki_textに"<"や">"が混入していると、sendした後に

```
400 Bad Request
```

のエラーを突きつけられるので、

```vb
Private Function EscapeHTML(Text) As String
    Dim Result As String
    Result = Replace(Text, "&", "&amp;")
    Result = Replace(Result, "<", "&lt;")
    Result = Replace(Result, ">", "&gt;")
    EscapeHTML = Result
End Function
```

(出典： https://gist.github.com/nanbu/1183384)

などを使ってwiki_textをエスケープしてやる必要があります。
Apexでcookieを扱う

#ちょっと普通のcookieと違う

apexでcookieを扱う際にはちょっとした注意が必要になります。

<img width="616" alt="スクリーンショット 2019-09-13 19.39.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/c50076fe-52fd-c369-f6c9-52cf5c4195a3.png">

<img width="564" alt="スクリーンショット 2019-09-13 19.40.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/947dddcc-f0e4-7408-acbd-da85ab7eab7b.png">

こんな感じでapex__がつきます。

保存の仕方としてはapexで保存する方法と、Javascriptを使う方法があります。

今回はjavascriptで保存し、apex側で呼び出してセットしてみました。

```ruby:sample.js
function hoge(){
            actfun();
            //入力内容を取得
            var pname = $("[id*=pname]").val();
            var pfamily = $("[id*=pfamily] option:selected").val();
            var pcode = $("[id*=pcode]").val();
            //パスの指定
            var path = "path=/";
            document.cookie = 'apex__conditions.Name='+pname;
            document.cookie = 'apex__conditions.Family=' + pfamily;
            document.cookie = 'apex__conditions.ProductCode=' + pcode;
        }
```

```ruby:sample.apex
    public String getNameval() {
        //'apex__'を外したcookie名を指定して取得する
        Cookie Name = ApexPages.currentPage().getCookies().get('conditions.Name');
        return Name == null ? '' : Name.getValue();
    }
```

こんな感じで取得します。

それ以外は他のcookieとほとんど変わらない挙動かと思います。

注意点は**apex__**こいつってことですね。
outsystemsで、リスト型のストラクチャを子に持つリストに、For eachで値を突っ込んでいく方法

#記事作成の動機
簡単そうなのにちょっと悩んだので書きます
#やりたいこと
以下のような型のストラクチャ"DataRow"をつかって
<img width="194" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/3489ca21-5ee4-299f-9eca-c562e4ec38f6.png">


その型のリスト型ローカル変数を作成
<img width="190" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/1c4f0892-013b-b5d6-e53c-1f743e7d1579.png">

このDataRowListのリストをFor eachで回しながら、ErrorCellsリストに値を入れていきたい


#方法
以下のようにwidgetの配置を行う

<img width="221" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/303723ad-1aa0-e1ee-86d1-9399ea9873b7.png">

* フィルターのところでは、ErrorCellsに入れる値をとってきてるだけ
* Assignのところで、ErrorCellのリスト型ローカル変数にさっきフィルターでとってきたErrorCellsを一旦入れてあげる
* ListAppendのところで、以下のようにAppendしてあげる（※SourceListのところは、さっき一旦代入したErrorCellリスト型のローカル変数）
 
<img width="389" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/147a84c2-425a-d526-3982-b4d34f2cd2b8.png">




#ハマりどころ
最初、ListAppendではなく、AssignでErrorCellsを入れてたので、ErrorCellsの値が変わるごとに
DataRowList全ての行のErrorCellsが毎回変わっちゃって大変だった
冷静に考えたら当たり前かもしれないけど…
VHDLのfunctionとprocedureについて

# はじめに
VHDLではprocedureとfunctionによってsubprogramを定義できます。
それぞれの使い分けを把握していなかったのでまとめました。

functionのほうが制約が厳しいのでどちらでもいい場合はfunctionを使うほうがよさそうです。

# function

functionは以下の特徴を持ちます。

* ディレイやイベント制御は使えない(wait文は使えない)
* 常に1つの値を返す
* inputの引数をもてる(もたなくてもよい)
* outputやinoutの引数はもてない
* non-blockingは使用できない

以上の特徴からfunctionは主に組合せ回路の実装に使用できます。

例えば以下のようにandリダクション演算をfunctionで定義できます。


```vhdl
function and_reduce (arg : std_logic_vector ) return std_logic is
    variable var : std_logic;
begin
    var = '1';
    for i in arg'range loop
        var := var and arg(i);
    end loop;
    return var;
end function;
```

# procedure

procedureは以下の特徴を持ちます

* ディレイやイベント制御ができる(wait文が使える)
* 複数の値を返すことができる
* inputの引数をもてる(もたなくてもよい)
* outputやinoutの引数をもてる
* ノンブロッキング代入も使用できる

以上のようにfunctionでできなかったことができるようになっています。

procedureでは複数の出力とwait文を使うことができるため
以下のようにSPI通信のマスタの動作を定義できます。

ただし、wait文を使った場合は回路として論理合成することはできません
wait文を使わない場合は[こちらの記事](https://qiita.com/ikwzm/items/c02f1e4e326e872b4d65)のように論理合成することもできます。

```vhdl
constant data_bits : natural := 8;

procedure send_spi (
    signal data : in std_logic_vector(data_bits - 1 downto 0);
    signal sdo : out std_logic;
    signal sclk : out std_logic;
    signal ss : out std_logic
) is
    constant sclk_period : time := 1 us; -- 1MHz
begin
    ss <= '0';
    for i in 0 to data'length - 1 loop
        sclk <= '0';
        wait for sclk_period / 2;
        sclk <= '1';
        sdo <= data(i);
        wait for sclk_period / 2;
    end loop;
    sclk <= '0';
    ss <= '1';
end procedure;
```

上記のprocedureを使えばスレーブのテストコードは以下のように簡単になります。
この処理をさらにprocedureとして定義することもできます。

```vhdl
master_data := X"AC";
send_spi (data => master_data, sdo => sdi, sclk => sclk, ss => ss);
wait for clk_period;
check_equal(receive_data, master_data, "data error"); -- VUnit
```

# 並列procedure？順次procedure？

[FPGAの部屋](http://marsee101.blog.fc2.com/blog-entry-1651.html)では入力信号にsignal宣言を書かないことで順次procedureとして扱うことができるとされている。

内容を読む限りはsignal宣言の有無ではなく
wait文の有無で並列procedureか順次procedureが決まるように思えますが
参考にされている図書を持っていないので詳細については不明です。

# 参考
[[pdf] Functions, Procedures, and Testbenches - Xilinx](https://www.xilinx.com/support/documentation/university/Vivado-Teaching/HDL-Design/2015x/VHDL/docs-pdf/lab4.pdf)
[vhdlwhiz.com - HOW TO USE A PROCEDURE IN VHDL](https://vhdlwhiz.com/using-procedure/)
[vhdlwhiz.com - HOW TO USE A FUNCTION IN VHDL](https://vhdlwhiz.com/function/)
[Qiita - VHDL で ビット幅を可変にできる Priority Encoder を書く](https://qiita.com/ikwzm/items/c02f1e4e326e872b4d65)
[FPGAの部屋 - procedureを使うときの注意点](http://marsee101.blog.fc2.com/blog-entry-1651.html)
[Rails] メールの送信の仕組みを理解する

最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#mailの送信方法
今回はRailsでどうやってmailを送信しているのか仕組みを知りたいと思い、調べた事とかメモした事をまとめていきます。

（１）[【Rails】Action Mailer でメール送信機能をつくる](https://qiita.com/annaaida/items/81d8a3f1b7ae3b52dc2b)

これを元に色々と調べていきました！詳しく説明してくれているので分かりやすかったです。

手順は最初にメイラー作成する。

```
$ rails generate mailer ContactMailer
```

次に、メールを送信するときは、送信するサーバーが必要。と言うことで、設定を
`config/environments/development.rb`に記述

```development.rb
Rails.application.configure do
#--- 中略 ---#
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    port:                 587,
    address:              'smtp.gmail.com',
    domain:               'gmail.com',
    user_name:            '<YOUR EMAIL ADDRESS>',
    password:             '<YOUR EMAIL PASSWORD>',
    authentication:       'login',
    enable_starttls_auto: true
  }
end
```
こんな感じになっている
`smtp_settings`がsmtpの詳細設定である

`address => SMTPサーバーのホスト名`
ここではgmailになっているが、それ以外にもSendGrid、Amazon SES、Mailchimp、Mandrillなどクラウド型のメール配送システムが台頭し自身でメールサーバーを運用しなくても簡単にメール配信できる。

(2)[メール運用がロストテクノロジーになっていく話
](https://qiita.com/koichiro/items/d65ac1af03b9063f0592)

(3)[SendGridでメール配送を始めるためのまとめ
](https://qiita.com/shiru/items/0dbc48df217ffe51b1f3)

-トランザクションメールサービスの中にsendgridが使いやすく管理もしやすい
-デリバリー率も良さそう

しかし、このような便利なメール運用サービスがある事で設定が簡単に行えるようになった反面、どこにハマりどころがあるのか分かりにくくなっているという問題もある。

SMTP AUTH の設定
`authentication => 認証方法`login以外にも複数種類があるようです。

(4)[SMTP AUTH の設定
](http://www.turbolinux.com/products/server/11s/user_guide/smtpauth.html)

`enable_starttls_auto => メールの送信にTLS認証を使用するか`
SSL/TLS1とは、HTTPS ( Webサービスに関わるプロトコルHTTPのセキュア版 ) に使われる暗号技術であるようです。

(4)[SSL/TLSの見落とされがちな「認証」という基本機能
](https://qiita.com/angel_p_57/items/dcb12a6a864f9aeba427)
AWSのアカウントを手軽に切り替える方法

2022年12月23日更新
今は絶対に[AWS Organization](https://aws.amazon.com/jp/organizations/)と[AWS IAMアイデンティティセンター](https://aws.amazon.com/jp/iam/identity-center/)の組み合わせ一択です
以下の方法は大人の事情で上記のサービスを導入できないときのためのワークアラウンドです

Google Chromeが前提です

# 動作サンプル

![preview.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113969/5e17c944-71f4-d7d2-02be-402cce3917a4.gif)

# おおまかな流れ

1. Chromeのアカウントを追加
2. 初めに開くページにログインページを指定
3. ログイン情報を記録させる

# 詳しく

## Chromeのアカウントを追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113969/eabc5495-9944-54a0-7892-0b3e5eef0761.png)

ユーザ管理画面から

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113969/1836428b-0bda-86b3-b1cf-a12d2344424b.png)

ユーザを追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113969/ba7cd49f-a7ad-98c9-c5ef-901ae0a92f5e.png)

分かりやすい名前を付けて追加

## 初めに開くページにログインページを指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113969/f23d7c7f-345b-197a-6c3b-655db78f263c.png)

同期は不要ですね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113969/d7336a85-3c60-d026-b83c-3a035d54dc9c.png)

メニューから設定を開き

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113969/9d5dc894-425d-e027-03c0-55421026f706.png)

一番下の「起動時」で「特定のページまたはページセットを開く」を選択し「新しいページを追加」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113969/13098b48-c5c8-a76e-c156-1a68184b5f2e.png)

ここは `https://console.aws.amazon.com` に設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113969/2a715c5d-9bda-3df4-5a26-8827c920957d.png)

これで設定は完了

## ログイン情報を記録させる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113969/8004e9d6-9d40-7eec-911f-9a24471b6345.png)

まずはログイン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113969/f3de3f16-ef27-3718-ea74-ef532c3e109c.png)

ここで保存すると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113969/8a7913b3-f91e-b95e-b768-b9daea496a7b.png)

Chromeを切り替えた直後にログインページが記憶された情報とともに開くのでボタンを押すだけでAWSアカウントが切り替えられる！
特定コマンドを実行したらディレクトリを変更してほしい

# 概要
作業ディレクトリが深くなってしまい

「ssh実行時後任意のタイミングですぐに接続したい!!」

という阿呆な考えのもと。。。

「シェルでいけんぢゃね？！」
とやってみました。

- 全ユーザ対応
- 一言でディレクトリ移動

もしもっと良い方法などあれば、教えてください。

# 方法
1. shell を書く
2. alias を設定する

# 1. shellを書く

```/usr/bin``` でシェルを書きます。
理由：パスの設定が不要なため

```
$ cd /usr/bin
$ sudo vi hoge
```

hoge ファイルを作成します。 以下のようにディレクトリ変更のシェルを書く

```shell:hoge
#!/bin/bash
echo "----------ディレクトリを移動します--------"
cd '/var/test/hoge/hoge/hoge'
ls '/var/test/hoge/hoge/hoge'
pwd
```

実行権限の追加

```
$ sudo chmod u+x hoge
```

### 注意
```hoge``` と実行しても、ディレクトリは移動されません。
```source hoge``` としないと、ローカルユーザが移動されません。

テスト実行時は、以下のようにします。

```
$ source hoge
```

# alias を書く
[こちらのサイト](https://oxynotes.com/?p=5418)のファイルの読み込み順番を確認したところ、```/etc/profile```が、全ユーザ対応だったので、このファイルに書きます。

★ローカルユーザのみの場合は、```~/.bash_profile```に書き込みをしてください。

```
$ sudo vi /etc/profile
```

最終行に以下を追加

```shell:/etc/profile
alias accord='source hoge'
```

設定を反映させる

```
$ source /etc/profile
```

実行確認

```
$ hoge
----------ディレクトリを移動します--------
hoge.txt test.txt
/var/test/hoge/hoge/hoge
$
```

というように実行されます。

# 感想
シェルが初めてだったので、苦労。
- シェルはコマンドがそのままかけるのか？？
- A: YES
- ローカルユーザがそのままコマンド実行できてない！どうやるの？
- A: ```source *.sh```で実行する(今回拡張子なしで設定しちゃいましたけど)

という苦労と苦闘がございました。
逆強化学習の評価指標

逆強化学習(IRL)の評価指標に何があるか調べた（雑な）メモ。問題特化型の指標は扱わない。随時追加。

# Reward Loss

- Ramachandran, D. and Amir, E. [2007]. [Bayesian Inverse Reinforcement Learning.](https://www.aaai.org/Papers/IJCAI/2007/IJCAI07-416.pdf)

真の報酬$R$と推定した報酬$\tilde{R}$の差のノルム。

```math
L(\pi) = \|R - \tilde{R} \|_{n}
```


IRLは不良設定(ill-posed)問題なので、**このような指標は(多くの場合)意味がない**。報酬を正確に推定したいときに。
時折出てくる「重み$w$の差」とか「特徴量の差」とかも同類の気がする。

# エキスパートと学習者の距離
エキスパート軌跡と学習者の方策の距離，となりそうなもの．

## Expected Value Difference (EVD)

「期待価値差」。Value（価値）とは状態価値のことか。

- Levine, S., Popovic, Z., and Koltun, V. [2011] [Nonlinear Inverse Reinforcement Learning with Gaussian Processes.](http://papers.nips.cc/paper/4420-nonlinear-inverse-reinforcement-learning-with-gaussian-processes)
- Abbeel, P., and Ng, A. Y. [2004] [Apprenticeship learning via inverse reinforcement learning.](http://www.eecs.harvard.edu/cs286r/courses/spring06/papers/abeelng.pdf)

後者ではEVDとは呼ばれていないが、同じ定式化が見られる。論文式(6)-式(9)を参照。


IRLではよく出てくる指標。非負（0でエキスパートと一致）であり，小さいほどエキスパートに近い。

```math
\operatorname{EVD}(\pi) = {V^{*}}_{R} - {V^{\pi}}_{R} \\
= \mathbb{E} \Bigl [ \sum_{t=0}^{\infty} \gamma^{t} R(s_t) | {\pi^{*}} \Bigr ] - \mathbb{E} \Bigl [ \sum_{t=0}^{\infty} \gamma^{t} R(s_t) | \pi \Bigr ]
```

ここで，
- <font color="Red">$R$ : **真の**報酬</font>
- $\pi^{*}$ : 真の報酬$R$に従って学習した最適方策
- $\pi$ : 推定報酬$\tilde{R}$に従って学習した最適方策

注意されたいのは、「<font color="Red">**真の報酬$R$**</font>のもとで，最適方策$\pi^{*}$と調べたい方策$π$との状態価値（＝割引累積報酬の期待値）の差」である。真の報酬が未知の場合は使えない。正確に計算する場合は、方策反復(Policy Iteration)の方策評価(Policy Evaluation)を使って求める方法がある。

### Policy Loss

- Ramachandran, D. and Amir, E. [2007]. [Bayesian Inverse Reinforcement Learning.](https://www.aaai.org/Papers/IJCAI/2007/IJCAI07-416.pdf)


EVDよりもうちょい一般的な形。

```math
L(\pi) = \|{V^{*}}_{R} - {V^{\pi}}_{R}\|_{p}
```

## Negative Log Likelihood (NLL)

「負の対数尤度」。「交差エントロピー」（cross entropy）とも言う。

### Kitani版

- Kitani, K. M., Ziebart, B. D., Bagnell, J. A., and Hebert, M. [2012] [Activity Forecasting.](https://link.springer.com/chapter/10.1007/978-3-642-33765-9_15)


推定した報酬に従って学習した方策$\pi$のもとでの軌跡の（？）NLL。

```math
\operatorname{NLL}(\pi) = \mathbb{E}_{\pi} \Bigl [ - \ln \prod_t \pi (a_t|s_t) \Bigr ]
```

Kitani先生が関わっている論文で使われている。

### Uchibe版

- Uchibe, E., and Doya, K. [2014] [Inverse Reinforcement Learning Using Dynamic Policy Programming.](https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6982985)


真の報酬$R$のもとでの最適方策からサンプリングした状態行動対$(s,a)$のデータセットを$\mathcal{D}^{*}$とするとき、推定した報酬$\tilde{R}$のもとで学習した方策$\pi$のNLL。

```math
\operatorname{NLL}(\pi) = - \frac{1}{\mathcal{D}^{*}} \sum_{(s,a) \in \mathcal{D}^{*}} \ln \pi(a|s) 
```


## Wasserstein距離
- Dadashi, R., Hussenot, L., Geist, M., and Pietquin, O. [2020]. [Primal Wasserstein Imitation Learning.](https://arxiv.org/abs/2006.04678)
- [OpenReview版](https://openreview.net/forum?id=TtYSU29zgR)
- 参考: [Imitation Learning in the Low-Data Regime](https://ai.googleblog.com/2020/09/imitation-learning-in-low-data-regime.html)

詳細は目下確認中．真の報酬にアクセスできない場合の，逆強化学習にも使えそうな尺度だと思います．

# 累積報酬の期待値

推定した報酬$\tilde{R}$のもとで学習した方策$\pi$ が1エピソードで獲得する真の報酬$R$の合計の平均．

```math
R_{\pi} = \mathbb{E}_{\pi} \Bigl [\sum_{t=0}^{\infty} R(s_{t}) \Bigr ]
```

MujocoタスクなどでEVDを計算するのは難しいので，最近はこれが多い．
Android9とunity2019とlibrealsenseでD435

#導入
1.OculusQuestとMirageSoloではlibrealsense.aar使用自作アプリでD435が動いている
2.GalaxyS9でRealSense公式アプリでD435が動いている

3.何故かGalaxyS9でlibrealsense.aar使用自作アプリでD435が動かない

#調査

超参考1
[UVC機器へアクセスするtargetSdkVersion=28のアプリをAndroid9端末で動かす時ぃ〜](https://serenegiant.com/blog/?p=3553)

超参考2
[ARcoreをUnity2019で開発しようと思ったらエラーが出た【解決】](http://bibinbaleo.hatenablog.com/entry/2019/06/01/204834)

##androidバージョン(2019.9.11現在)
・OculusQuest→android7.1.1
・MirageSolo→android8.0.0
・GalaxyS9→android9

##検証中ながら動いてるので現時点纏め（随時追加整理したい）
targetapiがhighestで28になってて、android8以前なら問題ないけど
android9で挙動がおかしくなるっぽくて
unity2019でtargetapi下げようとすると『おまえsdkバージョン持ってねーじゃん』と煽られ
unity内包のandroid-sdkどこにあるかわからなくて自前のに差し替えた。
targetapiを27にして動いた

##2020.06.15追記
・Android9,10でも自作アプリは動いているが公式アプリは動いていない。
Google Groupsで毎回ハマる、新規作成したグループのメールアドレスにメールが届かない問題

自分用の備忘録です。

2020-11-09 group.google.com　からできなくなったので、 [admin.google.com](https://admin.google.com/ac/groups) から設定するように修正しました。

# TL;DR

設定から External の Publish posts をチェックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96286/7ae2658c-fc2b-4a53-5c03-908ca73754ff.png)

# Step by step

## 1. グループ管理者のロールを持っていることを確認します。

https://admin.google.com/ac/groups にログインします。

管理者ロール > グループ管理者 > 管理者 に指定されていることを確認してもらいます。

## 2. グループの詳細を開き、 Seetingsを編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96286/49f8577c-2bad-5ffe-2363-84c312f35b59.png)


## 3. External の Publish posts をチェックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96286/7ae2658c-fc2b-4a53-5c03-908ca73754ff.png)



以上です。
Rubyのnilチェックまとめ

### 要約
- rubyのnilチェック方法のまとめ

### どうやるか
- ロジックが想定するクラスに変換する(例：to_s, to_i, Array(nilable_object))
- 特定の値を拒否する(return unless object)

##### ロジックが想定するクラスに変換する
- to_a, to_i, to_h, to_sなど
- conversion methodと呼ばれる
- Array("test_string")など
- 複数の入力クラスを想定するならrespond_to?/is_a?で条件分岐させてconversion methodを呼ぶ

##### 特定の値を拒否する(return unless object)
- その値がないとメソッドの意図する処理ができないとき
- 想定する入力クラスに上記のような変換メソッドがないとき
- railsのmodelを引数にとるときにありそう

### なぜやるか
- Rubyは型チェックがないのでどんなクラスでも引数に取れるため
- メソッドがないと落ちるため
- 複数のクラスを想定するため

### いつやるか
- すべての入力に対してやるのは大変すぎるのでやらない
  - たとえばprivateなメソッドの入力時にやってるとコストが高すぎる
- publicなメソッドの引数に対してできるだけチェック
- 落としたくないメソッドの入力に対してチェック
- railsのmodelのインスタンスはnilになりやすい＆conversionメソッドがないのでチェック
- railsのmodelのカラムやassociationで必須じゃないものはチェックする(nilになるのが想定内なもの)

### 参考文献
https://www.confidentruby.com
PythonでLeague of Legendsの試合情報等を取得する方法

League of Legends(以下LoL)ではRiotGames APIを使って試合結果やプレイヤーのデータを取得することができます。
代表的なのはOP.GG([https://jp.op.gg/l=ja](https://jp.op.gg/l=ja))というLoLのデータサイトで、APIを使ってサモナー個人のデータやチャンプの勝率などを表示しています。

今回は**Python**でデータを取得するための準備や方法について記していきます。
（他の言語については扱っていないですが、検索してみればやられている方もいると思うので探してみてください）

# 実行環境
- Python3 (ver: 3.7.3)
- Anaconda (ver: 2019.07)
    - Jupyter Notebook (ver: 6.0.0)

# 準備
予めAPIキーの取得と、Pythonでデータを取得できるライブラリRiot-Watcherをインストールする必要があります。

### 1. APIキーの取得
まずは、以下のサイトに行ってお持ちのアカウントでログインしてください。日本サーバーのアカウントでも大丈夫です。（アカウントを持ってない方はLoLの公式アカウントから作成してください。）
[https://developer.riotgames.com/](https://developer.riotgames.com/)

できましたら、ページの下の方にある「私はロボットではありません」にチェックを入れ、「REGENERATE API KEY」というボタンをクリックします。
![APIキー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493197/607b2b8d-ce59-8afb-58f3-6d2302b21c26.png)
これでAPIキーが作成できました！画像の赤い丸で囲ったものが実際のAPIキーです。（頭文字が「RGAPI」で始まる）

※注意※
発行される開発用APIは有効期限が発行してから24時間以内なので、期限を過ぎたら同じ手順で新しくAPIキーを発行する必要があります。ただし、アプリの申請をして承認されると有効期限のないAPIがもらえるみたいです。詳しくは以下のページを参照してください。
[http://orolog.hatenablog.jp/entry/2018/02/19/221553](http://orolog.hatenablog.jp/entry/2018/02/19/221553)

### 2. Riot-Watcherのインストール
続いて、Pythonで試合データを扱えるライブラリRiot-Watcherをインストールします。コマンドプロンプトで以下のコマンドを入力してインストールしてください。

```
pip install riotwatcher
```

Riot-Watcherのgithubは以下にあります。
[https://github.com/pseudonym117/Riot-Watcher](https://github.com/pseudonym117/Riot-Watcher)

# データの取得
準備が整ったら早速データを取得してみましょう。

```
from riotwatcher import RiotWatcher

API_KEY = '[APIキー]'
watcher = RiotWatcher(API_KEY)
```

RiotWatcherに先ほどの自身のAPIキーを渡すことでデータを取得できます。
試しに韓国のLoLプロプレイヤー、Faker選手（OPGG: [https://www.op.gg/summoner/userName=Hide%20on%20bush](https://www.op.gg/summoner/userName=Hide%20on%20bush)）のサモナーデータを見てみましょう。

```
region = 'kr' # 鯖
name = 'Hide on bush' # サモナーネーム

summoner = watcher.summoner.by_name(region, name)
summoner
```

実行結果はこちらです。（ID等はあらかじめ暗号化されていますが、念のため隠しています）
![サモナー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493197/f1d06f6b-6fe0-e0ad-5fc1-4855873929d5.png)

日本サーバーのサモナーを調べたい場合は、regionを'jp1'に変えてください。

続いて、最新のマッチリストを見てみましょう。

```
match = watcher.match.matchlist_by_account(region, summoner['accountId'])
match
```

![マッチ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493197/9d219ec9-2acc-8d6e-d589-84c4bf799d68.png)

このようにして様々なデータを取得することができます。

その他に関しては以下のRiotWatcherのドキュメンテーションを参考にしてください。
[https://riot-watcher.readthedocs.io/en/latest/index.html](https://riot-watcher.readthedocs.io/en/latest/index.html)

# 最後に
わからないところや間違っている箇所がありましたら、ご指摘いただけるとありがたいです。

次回はRiotWatcherの様々なパッケージがどのような役割を果たしているのかについて投稿したいと思います。
PDFDocumentからAirPrintでA4サイズ印刷する

## 概要
PDFを印刷したかったのですが、
元データがPDFDocumentで少し詰まったのでまとめておきます。

## コード
ボタンを押したら印刷画面が出てくるようになっています。

```swift
@objc private func tapPrintingButton(_ sender: UIBarButtonItem) {
    let printController = UIPrintInteractionController.shared
        
    let printInfo = UIPrintInfo(dictionary:nil)
    printInfo.outputType = .general
    printInfo.orientation = .landscape
        
    printController.printInfo = printInfo
    printController.printingItem = self.resizePrintingPaper()
        
    printController.present(animated: true, completionHandler: nil)
}

private func resizePrintingPaper() -> NSData? {
    // CGPDFDocumentを取得
    guard let documentRef = self.PDFView.document?.documentRef else { return nil }
        
    var pageImages: [UIImage] = []
        
    // 表示しているPDFPageをUIImageに変換
    for pageCount in 0 ..< documentRef.numberOfPages {
        // CGPDFDocument -> CGPDFPage -> UIImage
        if let page = documentRef.page(at: pageCount + 1) {
            let pageRect = page.getBoxRect(.mediaBox)
            let renderer = UIGraphicsImageRenderer(size: pageRect.size)
            let pageImage = renderer.image { context in
                UIColor.white.set()
                context.fill(pageRect)
                    
                context.cgContext.translateBy(x: 0.0, y: pageRect.size.height)
                context.cgContext.scaleBy(x: 1.0, y: -1.0)
                    
                context.cgContext.drawPDFPage(page)
            }
            // Image配列に格納
            pageImages.append(pageImage)
        }
    }

    // UIImageにしたPDFPageをNSDataに変換
    let pdfData: NSMutableData = NSMutableData()
    let pdfConsumer: CGDataConsumer = CGDataConsumer(data: pdfData as CFMutableData)!
    var size: CGSize // ここに印刷したいサイズを入れる

    var mediaBox: CGRect = CGRect(origin: .zero, size: size)
    let pdfContext: CGContext = CGContext(consumer: pdfConsumer, mediaBox: &mediaBox, nil)!
    
    pageImages.forEach { image in
        pdfContext.beginPage(mediaBox: &mediaBox)
        pdfContext.draw(image.cgImage!, in: mediaBox)
        pdfContext.endPage()
    }
        
    return pdfData
    }
}
```


## まとめ
PDFDocumentにはdocumentRefプロパティが存在し、CGPDFDocumentが取得できる。
CGPDFDocumentからpageを取得しUIImageに変換する。
CGContext生成時に任意のサイズを指定してやることで任意のサイズで印刷することができました。

もう少しいいやり方がありましたら、教えていただけますと幸いです。
Xcode10.3のKey BindingsでArchiveを設定するとArchive...まで設定されてしまう現象の対応方法

## 環境
Xcode 10.3

## トリガー
Key BindingsにArchiveを設定しようとしたところ、タイトルの現象に遭遇。
10.2とかでは動作していた気がする（確証ではない）。

## 内容
まずは普通に設定してみる。`command`+`shift`+`@`で設定してみる。
![スクリーンショット 2019-09-13 18.21.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307526/f527acf0-0190-20c5-0ee3-b224a3e54348.png)
**勝手に`Archive...`が設定された。謎機能。**

## 対応方法
どこか設定ファイルがあるはずと思って探したらあった。
`/Users/ユーザー名/Library/Developer/Xcode/UserData/KeyBindings/Default.idekeybindings`

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Menu Key Bindings</key>
	<dict>
		<key>Key Bindings</key>
		<array>
			<dict>
				<key>Action</key>
				<string>buildAndArchiveActiveRunContext:</string>
				<key>Alternate</key>
				<string>NO</string>
				<key>CommandID</key>
				<string>Xcode.IDEKit.CmdDefinition.BuildAndArchive</string>
				<key>Group</key>
				<string>Product Menu</string>
				<key>GroupID</key>
				<string>Xcode.IDEKit.MenuDefinition.Main</string>
				<key>GroupedAlternate</key>
				<string>NO</string>
				<key>Keyboard Shortcut</key>
				<string>$@`</string>
				<key>Navigation</key>
				<string>NO</string>
				<key>Title</key>
				<string>Archive</string>
			</dict>
            // ----------ここから削除----------
			<dict>
				<key>Action</key>
				<string>editBuildAndArchiveActiveRunContext:</string>
				<key>Alternate</key>
				<string>YES</string>
				<key>CommandID</key>
				<string>Xcode.IDEKit.CmdDefinition.EditBuildAndArchive</string>
				<key>Group</key>
				<string>Product Menu</string>
				<key>GroupID</key>
				<string>Xcode.IDEKit.MenuDefinition.Main</string>
				<key>GroupedAlternate</key>
				<string>NO</string>
				<key>Keyboard Shortcut</key>
				<string>~@\~</string>
				<key>Navigation</key>
				<string>NO</string>
				<key>Title</key>
				<string>Archiveâ€¦</string>
			</dict>
            // ----------ここまで----------
		</array>
		<key>Version</key>
		<integer>3</integer>
	</dict>
</dict>
</plist>

```

## 結果
**消えた！**
![スクリーンショット 2019-09-13 18.41.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307526/d9b6bbd4-e10b-8ee9-8f36-359f2d1fc93e.png)