OmniAICreator/Qiita-1.07M huggingface dataset:
STS ver3.9.9で新規PJの作成時にエラー407が発生する

#まえがき
今回、本記事を書くにあたり、以前の書き換え対象のファイルとver3.9.9での対象ファイルが自分の場合異なっており、環境構築で沼にはまってしまったため、私のように時間を溶かす方が一人でも減ってくださればと思い書かせていただきました。
何か誤り等ありましたら教えていただければ幸いです。
#初めに
407エラーで躓いていらっしゃる方は、以下のような画面がプロジェクト新規作成時に出ると思います。![first.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469556/ec6b01c4-8618-921e-df81-e36f1212125f.png)
そのほかにも下記のようにテンプレートが表示されず、SimpleProjectしか表示されない場合も解決する可能性が高いです。（私は解決しました）
![first2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469556/3609945f-72c7-4705-bce5-d0ee3473ebf4.png)


#環境
・StringToolSuite ver3.9.9
・jdk 11.0.2
#解決策
`-Djdk.http.auth.tunneling.disabledSchemes=""`
上記のコードを**STS.ini**というSTSの実行ファイル(.exe)と同階層にあるファイルの中に書き込んであげることによって解決いたします。
カーソルで選択しているように追加してください。
![middle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469556/39efa959-cf69-30f5-21b5-b6c7854a2db3.png)

追加し、再度STSを起動していただくと、接続できていると思います。
以下が正常に動作している状態です。

![last.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469556/f8da06c0-885b-87f0-dbc3-1fc7a746bbb6.png)
#参考
 - [STS(Eclipse)で新規プロジェクト作成時に407エラーが発生する](https://qiita.com/sakazoo/items/fc0559b4127159dd12d3)
 - [JavaでHTTPSのサイトに認証付きプロキシ経由でアクセスしようとすると407エラー](https://qiita.com/kaakaa_hoe/items/d4fb11a3af035a287972)
Railsチュートリアル1章まとめ

###はじめに

Railsチュートリアルで発生したエラーとか詰まったところをまとめていこうと思います。
備忘録として。
2週目の今回はbitbucketではなくgithubで進めていこうと思います。


####rails newの時点でエラー発生



```
$rails _5.1.6_ new hello_app2

#エラー発生
can't find gem railties (= 5.1.6) with executable rails (Gem::GemNotFoundException)

```

対処方法が下記コマンド

```
$gem install rails -v 5.1.6

```

こちらで再度rails newコマンドすれば無事作成できました。


####githubでのリポジトリ作成

いつもはgithubからローカルにクローンするやり方でやってたので今回はこちらで。
ローカルからプッシュするやり方で。


まずgithubでリポジトリ作成する。
名前はhello_app2にしました。

```
# ローカルリポジトリを作成するディレクトリに移動する
cd hello_app2

# ローカルリポジトリを作成する
$ git init
$ git add .
$ git commit -m "first commit

# リモートリポジトリのアクセス先を設定する
$ git remote add origin https://github.com/GitHubのユーザ名/GitHubのリポジトリ名(こちらではhello_app2).git

# pushする
$ git push -u origin master

```

####git push heroku　でエラー
エラー文

```
remote:  !
remote:  !     Could not detect rake tasks
remote:  !     ensure you can run `$ bundle exec rake -P` against your app
remote:  !     and using the production group of your Gemfile.
remote:  !     Activating bundler (2.0.1) failed:
remote:  !     Could not find 'bundler' (2.0.1) required by your /tmp/build_b85aaac02a3a812e844f20844711c628/Gemfile.lock.
remote:  !     To update to the latest version installed on your system, run `bundle update --bundler`.
remote:  !     To install the missing version, run `gem install bundler:2.0.1`
remote:  !     Checked in 'GEM_PATH=vendor/bundle/ruby/2.5.0', execute `gem env` for more information
remote:  !     
remote:  !     To install the version of bundler this project requires, run `gem install bundler -v '2.0.1'`
remote:  !
```
こちらのエラー分の中にあるように下記コマンド



```

$ gem install bundler -v 2.0.1
$ rm Gemfile.lock
$ bundle install
$ git add .
$ git commit -m 'hoge'
$ git push heroku master

```

こちらで解決し無事デプロイ完了しました。




```
"Writing An Interpreter In Go " を JavaScriptで実装してみる　その1 Lexer

なんとなく　個人的お盆休みの課題として
[Writing An Interpreter In Go](https://interpreterbook.com/)という本を読み始めた。


内容としてはMonkeyという言語のインタプリタをGo言語で実装するという内容である
ページ数としては200ページほどで、軽すぎず、重すぎず丁度いい内容。

Lexer・Parser・Evaluaterの流れですすんでいく。
ただ写経するだけではつまらないのでJavaScriptで実装し直してみている。
npmモジュールにMonkeyの日本語訳である"saru"というレポジトリで公開し始めた

[npm]
https://www.npmjs.com/package/saru

[code]
https://github.com/freddiefujiwara/saru

# インストール方法はこちら
```bash
npm i -g saru
```

# 使い方はこちら
```bash                                                                                     
  $ saru                                                                                                                                 
Hello fumikazu! This is the Monkey programming language! 
Feel free to type in commands          
* Please type 'bye' if you want to exit 
>>>                              
```

# サンプル
```bash
>>> let me know             
Token { type: 'LET', literal: 'let' }
Token { type: 'IDENT', literal: 'me' }
Token { type: 'IDENT', literal: 'know' }
>>> let str = "string";        
Token { type: 'LET', literal: 'let' }
Token { type: 'IDENT', literal: 'str' }
Token { type: '=', literal: '=' }
Token { type: 'STRING', literal: 'string' }
Token { type: ';', literal: ';' }
>>> let i = 10;                 
Token { type: 'LET', literal: 'let' }
Token { type: 'IDENT', literal: 'i' }
Token { type: '=', literal: '=' }
Token { type: 'INT', literal: '10' }
Token { type: ';', literal: ';' }
>>> !@                         
Token { type: '!', literal: '!' }
Token { type: 'ILLEGAL', literal: '@' }
```

また、始めて [jest](https://jestjs.io/)を使ってみた。
まだまだLexer部分しか作ってないが今後Parser部分やEvaluator部分も作ったら
Qiitaに投稿しようと思う
自宅用にOffice365（法人用）を契約してみた

先日[第3回Home365祭](https://togetter.com/li/1383626)、という自宅でOffice365使ってるよ！という方々の勉強会に参加してきた。

自宅で！？と思われるかもしれないけど、業務から離れて好き勝手使えると、思いもよらない使い方をされていたりして、皆さん自由な発想なんだよな・・・今まで参加した勉強会の中で一番楽しかった。


ちょうど独自ドメインのメールアドレスほしいというカミさんからのリクエストもあったし、自分でも試してみたいし、一石二鳥ということで~~あえて自分から沼に片足突っ込む~~検証することにした。




#ドメインを取得する

別にドメイン取得しなくても、法人用Office365は契約できる。ただ、どうせ法人用でとるならドメインとりたいってことでドメイン取得。

お名前.com
https://navi.onamae.com/

とりたいドメイン検索して、空いてたらポチポチ進める。

#Office365を契約する

home365初心者なので、まずはライトに…とおもい、はBusiness Essentialを選択。本当は上位ライセンスほしいけど、その時になったら買い足せばいいし。



契約だけど、このURLを開いて
https://www.microsoft.com/ja-jp/p/office-365-business-essentials/cfq7ttc0k59v

購入するを選んで、連絡先とか諸々入力するだけでOK。
この段階では、まだドメインは登録しないけどテナント固有のサブドメインは指定する。使える文字は半角英数だけで、記号は使えない。また、早い者勝ちなので、どこかの会社が使ってたらもう使えない。このへんは、そういうもんと思ってサクサク進める。


今回取得したドメインが、xxx-yyy.comのようなドメインだったのだけど、ハイフンが不可なのでxxxyyyとしたらすでに使われてたのでxxxyyycom.onmicrosoft.com、的な感じにした。


そのあと、チームを作るとか、独自ドメイン設定するとか、いろいろ聞かれるけど全部スキップしていったん終了。

#独自ドメインを追加する

メールアドレスを独自ドメインにしたいので、追加する。

ドメインの所有者確認に、Office365管理センターのセットアップ→ドメイン→ドメインの追加から、
・Office365から、ドメイン所有確認用の値を払い出す（TXT=MSxxxxxx）
・DNSにドメイン所有確認用の値を登録する
・Office365で、DNSに登録されたか確認する

自分の代わりに設定する、を選んで・・・
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/b92d8d77-537d-afda-b319-134a99140e51.png" width=50%> 
全部使うので、チェック外さず次へを選んで・・・
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/d69620fc-db61-86ab-c408-9c78ef47c8ec.png" width=50%>
いろいろインポートされるので、次へ選んで・・・
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/384b3dbe-70e6-c23a-a61e-1409d2ef3625.png" width=50%>

Office365から指定されるネームサーバーの値を、お名前.comでネームサーバーの変更から入力して、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/60452138-ab75-8627-922c-cb065ee72f9c.png" width=50%>

DNSやNS書き換えは数分待つけど、すんなり完了！


以前書いた[メールシステムを、Office365に引っ越しする](https://qiita.com/hisssa0102/items/7cf9bb161078b9214c17)だと、DNSレコードを書き換えていく方法、今回はネームサーバーを切り替える方法。確かにラクかもしれないけど、初めての方法なのでちょっと手間取った。


#UPN書き換え

365管理センターでアカウント名を変更。変更したら強制サインアウトされるので、再度サインイン。

これで完了！

#まとめ

所要時間は全部で30分ぐらい。

30日とかの検証環境が欲しいだけなら、[Office 365 開発/テスト環境](https://docs.microsoft.com/ja-jp/office365/enterprise/office-365-dev-test-environment)から申し込めばいい。

けど、独自契約しちゃうと自分のドメインがつかえるとか、継続的に利用するというメリットがある。しばらくはおもちゃ替わりにあれこれ試してみよう。

さて、カミさんにはなんて報告しようかな…。
AWSを無料でお勉強：コンソールログインを検知したい（その２）

自分自身忘れないようにコンセプトを毎回書いておこうと思います。

###コンセプト
・お金かけてまでやりたくないので基本的に無料でAWSを勉強する
　→ちょっとしたサービスを起動すると結構高額になりやすい。
・高いレベルのセキュリティ確保を目指す
　→アカウントを不正に使われるととんでもない額を請求されるので防ぐ

###デフォルトのCloudtrail
前回はデフォルトのCloudtrailについて調べていました。相変わらずクラメソさんのページがわかりやすいのですが、
https://dev.classmethod.jp/cloud/aws/aws-cloudtrail-default-vs-custom/
結論からいうとデフォルトのCloudtrailだとコンソールログインを通知することはできないようです。もちろん、コンソールにアクセスすれば見ることはできますが、他のサービスと連携できない。つまり、メールとかで受信することができないということになります。

###ならGuardDutyはどうよ？
さて、それじゃぁどうするかってことになるのですが、時代はGuardDutyでしょってことで少し調べてみました。ただ、大規模に使うのであれば良さそうですが、私のようにお勉強レベルではtoo muchな感じです。利用料も確認しましたが、
https://aws.amazon.com/jp/guardduty/pricing/
月に4.72USDかかりそうです。Cloudtrailの分析で100万件いけるみたいですが、そこまで使わないですしね。あくまでもお勉強用なので、100件単位とかで価格も0.05ドルから、みたいならいいんですが。ろくに使わないアカウントに毎月500円かかるのはもったいない。ってことでパスします。

そうなると、またしてもクラメソさんのサイトですが
https://dev.classmethod.jp/cloud/aws/aws-cloudtrail-cloudwatch-logs-badip/
このやり方になりそうです。ただ、ここでも問題があります。CloudtrailをS3に吐き出して連携するので、少なくともS3の料金とCloudWatchの料金がかかりそうです。
https://aws.amazon.com/jp/cloudwatch/pricing/
ただ、これを見る限りかなり安そうな感じはします。

とはいえですよ、そもそもの”無料”でってコンセプトに反してしまうんです。まぁ、AWSの環境を使っておいて無料でやらせろーって虫のいい話なんですが、自分としてはただ操作感を試すだけな訳で、本当はびた一文払いたくない訳ですよ（言い過ぎか（笑））勉強してるんだったら払ってもいいじゃないか、という気も少ししてしまうんですけどね。。。


###そもそも要件ってなんだっけ？
方向性が見えなくなった時には当初の目的を考えるのが一番です。ってことで考えてみます。
・AWSの勉強で使いたい
・無料でやりたい
・アカウントの不正利用を検知したい（変な請求は避けたい）
これだったらMFA＋課金アラームで十分か？という気もしますね。とはいえ、不正検知をするのも目的なのでもう少し考えます。検知するには結局Cloudtrailをトリガーにするしかないようです。デフォルトの無料のCloudtrailだと他のサービスに連携できません。Lambda連携できれば良かったんですが。で、それが無理ならCloudwatch連携するのがやはり王道で、その他の手としてはコンソールを定期的にseleniumとかでクロールする方法くらいしか思いつきません。ただ、仮にseleniumを使うにしても実行元のサーバーも必要ですし、そんなことをしたら寧ろ高コストになってしまいます。さらにMFAを導入しているので、技術的なハードルも高いです。

そう考えると、実行するならやはりCloudwatch連携するしかないかな、というのが現状の結論です。
なかなかいい方法ないけど、試してみようかな。もう既に無料縛りが達成できなくなるけど。。。
Tableau ノウハウ備忘録

過去に見かけた、またはやらかしたしくじりなど、
後から振り返った時にこうした方が良かったと思えた事柄をまとめていく。継続的に更新したい。

# Tableau Desktop
## メジャーネームの別名設定は要注意
データソースをTableauServerへパブリッシュする前は禁止。
ワークシートで別名の設定が出来なくなり、表形式の列名やグラフの凡例で致命的です。

原因はデータソースをパブリッシュすると、別名定義の場所がワークブックからデータソースへ移動する事にあります。定義が移動するとワークブック側で編集できなくなり、特にメジャーネームの別名はロックされると表計算を使用した表で列名に余計な文字が付与される事を回避できなくなります。

## データソース置換は要注意
把握する範囲で以下の設定が消失します。再設定を忘れずに。

* 別名
* 色凡例

接続先が TableauServer のデータソースである場合は、メニューバーの `[データ] - [(データソース名)] - [Tableau データサーバー] - [サーバーおよびサイトパスの編集]` も使えます。これを使うと設定欠落が起きません。

## 表形式の空白箇所へのハイフン表示
メジャーで書式設定している場合にメジャーバリュー側の書式設定が機能しなくなります。

原因はメジャーバリューを使う表で個々のメジャーの書式設定がメジャーバリューの書式設定を上書きする事にあります。対処法は以下の通り。これを行うと個々のメジャーの書式設定が拡張され、null時の任意文字列の表示設定も解放されます。

1. ハイフン表示したいメジャーをマークカードの詳細へ追加
2. 個々メジャーへハイフン表示を設定

## 千単位の表示
Excelの書式設定のフォーマット文字列と部分的に互換性があります。
千単位表示ならば次のような指定ができます。カンマ付き。

```
#,##0,
```

小数点を表示する際は`.0`を付けます。

```
#,##0.0,
```

## パブリッシュ前の選択セル解除
ワークブックをパブリッシュする際、TableauServer上で見せるシート、ダッシュボード単位に次の操作を推奨します。

1. シートのいずれかのセルを一回選択
2. ESCキーで選択解除する

選択セルがある状態でフィルタの選択を切換えてパブリッシュした場合、ブラウザ上でフィルタを元に戻し表示した際には選択セルが解除されていたが、tabcmd で PDF 出力をフィルタ指定し行った場合には選択セル情報が残ってる事がありました。

# Tableau Server

## 実行ユーザの指定
データソースの参照先にファイルがある場合、開発や運用で使っているユーザで動かしたほうがアクセス権限関係は楽です。既定ではNetwork Serviceで動きます。

## プロキシの設定
レポートに地図を使用するものがある場合、TableauServerもインターネットと通信可能である必要があります (ユーザのブラウザだけではないという事)。不通状態では地図表示が極端に遅くなる現象が生じます。

プロキシはTableauServerを動かしているアカウント(既定: NetworkService)に対して行う必要がありますが、作業アカウントで設定するとNetowrkServiceへ設定できません。この場合、設定がマシン単位で適用されるようグループポリシーの `/コンピュータの構成/管理用テンプレート/Windowsコンポーネント/InternetExplorer` から `コンピュータ別にプロキシを設定する (ユーザ別ではなく)` を `有効` にすると全体へ適用できます。
webarenaでubuntu その6

#概要

webarenaでubuntu18.04やってみた。
bindやってみた。

#インストール

```
sudo apt-get install bind
```

#ポートの開放

```
udp:53,53,ip4:0.0.0.0/0
```

#named.confの修正

```
	version "unknown";
	recursion no;
	allow-query { 
		any; 
	};
	listen-on port 53 {
		any;
	};
	listen-on-v6 { 
		none; 
	};
```

#テスト

外部から、digを打つ。

```
dig @ip address localhost
```

以上。
初めて JIRA RestAPI を使ったよ

今度は [JIRA Server platform REST API](https://docs.atlassian.com/software/jira/docs/api/REST/8.2.4/) を使用することになりました。

とりあえず基本認証をすれば使えるとのことで、英語のドキュメントを読み漁ることに。
[Basic authentication](https://developer.atlassian.com/server/jira/platform/basic-authentication/)

さぁ Google 翻訳さんの出番ですよ！
いつもありがとうございます。m(_ _)m

#基本認証に必要なこと

Token 発行したり、色々と必要になるのかと思いきや、JIRA にログインできる ID と PASS があれば API も利用できるそうです。
なんだか敷居が低くてびっくり。
ただ、ID と PASS は : で区切ってくっつけたのち、BASE64 エンコーディングしとかないといけないみたいです。
ex）`'JIRA ID' + ':' + 'JIRA PASSWAORD'` ←　これを BASE64 エンコーディングする

# Buffer クラスを利用した BASE64 エンコード

Node.js で BASE64 エンコードするには Buffer クラスを利用します。
標準ライブラリですので、そのまま使用することができます。

```js
const buffer = new Buffer('JIRA ID' + ':' + 'JIRA PASSWAORD');
const string = buffer.toString('base64');
```

JIRA API のお決まりで、エンコードした文字列の頭に `'Basic '`とつける必要があります。
半角スペースが入るので注意ですね！

あとは header に `Authorization` パラメータとして乗っければ OK です。

#API を Request する

あとは、使いたい API の URL を指定すれば JIRA の API を利用することができます。
今回は課題（issue）を検索する [SEARCH API](https://docs.atlassian.com/software/jira/docs/api/REST/8.2.4/#api/2/search-search) を利用しました。

```ex.js
const request = require('request-promise');
const buffer = new Buffer('JIRA ID' + ':' + 'JIRA PASSWAORD');
const string = buffer.toString('base64');
const options = {
    uri: 'https://myhost.com/rest/api/2/issue/search',
    headers: {
        "Content-Type": 'application/json',
        "Authorization": 'Basic ' + string
    },
    method: 'GET',
    json: true
};

request(options).then((data) => {
    console.log("200 OK");
    console.log(data);
}).catch((error) => { console.log(error)});
```

```:実行結果
> node .\ex.js

{ expand: 'schema,names',
  startAt: 0,
  maxResults: 50,
  total: 1739,
  issues:
   [ { expand: 'operations,versionedRepresentations,editmeta,changelog,renderedFields',
       id: '512802206',
       self: 'https://myhost.com/rest/api/2/issue/502802206',
       key: 'HOSTENG-5',
       fields: [Object] },
     { expand: 'operations,versionedRepresentations,editmeta,changelog,renderedFields',
       id: '512797809',
       self: 'https://myhost.com/rest/api/2/issue/502797809',
       key: 'HOSTENG-4',
       fields: [Object] }
// 省略
```

自分のが抱えている課題のリストが表示されます。
ここで id を確認して、課題の詳細を確認したり、追記したりします。

#おわりに
ここまでお付き合いいただきありがとうございました。
たぶん、英語がちゃんと読めれば公式ドキュメントを読んですぐわかる内容だったんでしょうが、なんだか凄く苦労しました。
curl のサンプルコードを node.js で再現して response を見ても、どこにもトークンっぽいものがない！('Д')
って頭抱えていましたが、そもそもトークンとか必要ない方式でした。
同じような悩みを抱えている方の助けになれば幸いです。

他にも [Cookie-based authentication](https://developer.atlassian.com/server/jira/platform/cookie-based-authentication/) とかもあるみたいで、なんだかこっちを利用している方も多いみたいなので、今度勉強したいと思います。
ではまた！(^^)/

#参考にさせていただきましたm(_ _)m

[JIRA Server platform REST API](https://docs.atlassian.com/software/jira/docs/api/REST/8.2.4/) 
[JIRA Basic authentication](https://developer.atlassian.com/server/jira/platform/basic-authentication/)
WSLからWindows側のSelenium-Standaloneを起動したい

NodeJSのライブラリ、[selenium-standalone](https://github.com/vvo/selenium-standalone)はご存知でしょうか？
NodeJSとJavaを事前にインストールしておく必要はありますが、Windowsでもコマンド一発で、Selenium + インストール済みのブラウザに対応したWebDriverを自動でインストールしてくれるのでとても便利ですね。

さて、Windowsで開発している人の多くはWSL（Windows Subsystem for Linux）を利用しているかと思いますが、Windows側にインストールしたブラウザをselenium-standaloneで自動操作するには、selenium-standaloneもWindows側でインストールしておかないといけません。
とはいえ、わざわざSeleniumを使いたい時だけPowerShellを起動するのも面倒ですし、Linux側から起動できるといいですね。

というわけで、その方法がこちらです。

```bash

cmd.exe /c selenium-standalone.cmd install  # SeleniumやWebDriverなどのダウンロード
cmd.exe /c selenium-standalone.cmd start  # Seleniumサーバの開始
```

上記を**bash上で実行**すると、Windows側のselenium-standaloneコマンドが実行されます。
PowerShellやコマンドプロンプトで `selenium-standalone` を実行する場合と同じことになります。

## 解説

WSLからWindows側のコマンドを実行するには、実行したいコマンドを **拡張子付き** で指定する必要があります。
例えば、bash上で下記のように実行すると、Windows側のselenium-standaloneが呼び出されます。

```bash
$ selenium-standalone.cmd start
```

コマンドの拡張子を知りたい場合は、PowerShellで`Get-Command`を使うと知ることができます。

```
PS C:\Users\tsemura > Get-Command selenium-standalone

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Application     selenium-standalone.cmd                            0.0.0.0    C:\Users\tsemura\AppData\Roaming\npm\sel...
```

さて、ただの実行ファイル（`.exe` ファイル）であれば単に拡張子付きで実行すればよいのですが、バッチファイルなどの場合はこのままでは実行できないので、コマンドプロンプト経由で実行する必要があります。
と言っても、Windows側でコマンドプロンプトを起動する必要はありません。bashで`cmd.exe`を実行し、実行時オプションで実行したいコマンドを渡してあげればOKです。

```bash

cmd.exe /c selenium-standalone.cmd start
```

というわけで、↑が最終的に実行するコマンドになります。
頻繁に使う人はaliasなどに登録しておくとよいでしょう。


## 参考

https://www.atmarkit.co.jp/ait/articles/1805/31/news052.html
JavaScript の 変数 まとめ ～let 変数名 = 格納する値～

# 目的

- JavaScriptの変数のふるまいを知る。

# 押さえるポイント

- 変数を定義してから値や文字列を格納する。
- 同一ステップで変数定義と値や文字列の格納を行う。
- 変数名は英数字のみ使用すること。
- ２語以上の英単語から成る変数名のとき、２語目の頭文字を大文字にする。(user nameと変数名を命名したいときの変数名は`userName`となる)
- 数字で始まるものは変数名にできない

# 書き方の例

- 下記に汎用的な変数の定義と格納方法を記したJavaScriptファイルの内容を記載する。

``` javascript
let 変数名 = 数値;
let 変数名 = "変数に格納する文字列";
```

- 下記に変数に格納された文字列をコンソールに出力する処理を記したJavaScriptファイルの内容を記載する。

``` javascript
console.log(変数名);
# ※console.log("変数名");としないこと。変数に格納された値や文字列ではなく、変数名がコンソールに出力されてしまう。
```

# より具体的な例

- 「name」という名前の変数を定義して、文字列「miriwo」を格納する。
- 下記に変数定義と変数への格納方法を記したJavaScriptファイルの内容を記載する。

``` javascript
let name = "miriwo";
```

- 定義された「name」変数に格納された文字列をコンソールに出力する。
- 下記に変数に格納された文字列をコンソールに出力する処理を記したJavaScriptファイルの内容を記載する。

``` javascript
console.loc(name);
```
HealthKitを使ってアプリがクラッシュするケース

HealthKitを使ってrequestAuthorization()の直後にアプリがクラッシュする場合、plistに追加した「使用する理由」が短すぎるのが原因かも。

#確認した環境
iOS: 12.3
Xcode: 10.2.1

#遭遇した現象
HealthKitを使うための手続き 
・HealthKitのCapabilityをONにする
・plistファイルに**NSHealthShareUsageDescription**キーを追加して理由を記載
・requestAuthorization()でHealthKitへのアクセス許可を求める
と、アプリケーションがクラッシュした。


上記だけの動作をさせてもクラッシュする＆ステップ実行しても当たりがつかず、途方にくれる。。。



#対処方法
plistファイルに追加した**NSHealthShareUsageDescription**キーの値を、
"hoge"から"hoge hhoge hoge hoge hoge hoge hoge hoge hoge hoge hoge hoge "と
とりあえず長くしてみるとクラッシュしなくなる。。。

とりあえず動かしてみようとして適当な文字列を入れてハマりました。
「文字列が短すぎるとクラッシュする」ということを聞いたのでやってみると解決。
**エラー(原因)を表示してほしい！！！**
matplotlibの設定

# 準備
まずはmatplotlibをインポートし、適当なグラフを描く

```python
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,2*np.pi)
y = np.sin(x)
plt.plot(x,y)
```
![output_4_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480831/82970023-13f4-eb52-ddbb-c02a92861620.png)


# 各種設定
## Grid線を表示

Grid線の表示


```python
plt.plot(x,y)
plt.grid()
```


![output_6_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480831/3b473d39-611a-037e-f1d2-5e065d57f1dd.png)


## 軸ラベルの設定


```python
plt.plot(x,y)
plt.xlabel("x")
plt.ylabel("y")
```


![output_8_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480831/478f5118-ea0a-8044-3717-ad65ba5978f9.png)



## 表示範囲の変更


```python
plt.plot(x,y)
plt.xlim([0,1])
plt.ylim([0,1])
```

![output_10_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480831/99ef11bb-e76a-d8fb-58b1-46c1305ad0c2.png)



## スタイルシート
matplotlibにはあらかじめ用意されたスタイルシートがあり、それらを用いることもできる。使用可能なスタイルシートを調べるには次のようにします。

```python
print(plt.style.available)
```

    ['bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark-palette', 'seaborn-dark', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'seaborn', 'Solarize_Light2', 'tableau-colorblind10', '_classic_test']
    

スタイルシートを使うときは、以下のように記述すると、全体のスタイルに影響を及ぼさないように出来ます。


```python
with plt.style.context('dark_background'):
    plt.plot(x,y)
```

![output_14_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480831/1d5247b6-e1e2-6c7e-8787-f5ca2823f441.png)
Automation Anywhere で Excel 表が取得できないときに試すこと

Automation Anywhere で Excel 内の表を取り込みたいときに忘れてしまいがちな処理について記載します。
たとえば以下のような表が記載された Excel ファイルがあります。
![aa-excel01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/8000da12-6260-e775-9422-3d1ce97a33cf.png)

表の内容

|名前|生年月日|
|:--|--:|
|山田太郎|1971/3/4|
|石川たか子|1986/12/4|
|鈴木一郎|1976/3/31|
|佐藤栄作|1980/12/31|
|西川正二|1966/2/15|

これを読み出したいときには以下のアクションリストのように `Open Spreadsheet` でExcel ファイルを開いてから、Loop処理の中で `$Excel Column(1)$` を使って1列目 (つまりA列)の値を読み出していきます。

![aa-excel02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/0345367d-297b-9819-bec5-81c3370f229f.png)

これで良いと思ってアクションリストを実行してみると...何も起こらずに終了してしまいます。デバッグをしてみると、ループ内に処理がいかずに終了してしまっているようです。さて、何が足りないでしょうか!?

# 表を 1 行ずつループで読むには Get All Cells を最初に必ず入れる
そうです、ここで足りなかったのは `Open Spreadsheet`の直後に`Get All Cells` (全セルを取得)処理を入れることです。これをしないとメモリ内にExcel表が読み込まれず、空の表を見て、ループ処理はすぐに終了してしまいます。`$Excel Column(1)$`の実行は`Get All Cells`が実行されていることが前提となっています。

![aa-excel03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/0716c922-f856-f25f-0848-849ab480e8b5.png)

`Get All Cells`を2行目に挿入すると、アクションリストは以下のようになります。

![aa-excel04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/44ca3f81-612e-ee19-915a-c42b797a9b5e.png)

これで以下の赤枠内の値がメモリ内に読み込まれ (`Open Spreadsheet`で`Contains Header` (ヘッダーを含む)オプションが指定されているので、ヘッダーの値はループに出てこない)、想定通りに値が順々に表示されていくようになりました。

![aa-excel05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/f2eaac19-34ed-7f1e-356b-e10ca720505e.png)

`Get All Cells` の挿入はよく忘れるので、うまくいかないときはチェックしてみてください。
OculusQuestNativeSDKのサンプル動かすのに詰まった

# はじめに
Oculus Quest開発はほぼほぼ皆さんUnityやらUE4やらでやられているかと思います。
すなわちNative SDKでの日本語記事が皆無です。
本記事はAndroid Studio何それから始まった私のNative SDKで詰まったところ備忘録です。
元Androidエンジニアの同期に助けてもらいました。尊敬の極み。

# 問題
Getting Startedが動かない。
https://developer.oculus.com/documentation/mobilesdk/latest/concepts/mobile-studio-basics/

とりあえず*Import Gradle Project*から*Project Overview*までは一通り済んだ。
*Select Target Configuration, Build, and Run*でドキュメントが急に不親切になり一回休み。

## Gradleのバージョンを5より下にする
まず適当にMake Projectしてみると、`leftShift`がうんたらかんたらとエラーに。
これはGradleのバージョンによるもので、.gradleにて`leftShift`もしくは`<<`は3.2以降で非推奨、5で廃止となっています。

そこでGradleのバージョンを下げます。
下げたくない人は参照記事の様に`doLast`に置き換えればよいとは思いますが、自分の時はテキトーに全部置き換えて動かなかったのでバージョンを下げることで解決しました。
File->Project StructureのProjectタブ、Gradle Versionに手打ちします。
自分はテキトーに4.10.3にしました。
Gradleはインターネットから引っ張ってくるようなので追加でダウンロードなどは必要ありません。
エラーが消え、とりあえずMake Projectは通りました。

参考：[Gradle の Task.leftShift() を Task.doLast() に置き換える](https://qiita.com/ossan_pg/items/608134f44ccf4542edf2)

## Syncする
サンプルそのままの状態だとbuild.gradleのビルド設定がプロジェクトに反映されていません。
この状態だとEdit ConfigurationsのModuleがno Moduleとなり、先に進めません。

ビルドファイルの依存関係をダウンロードするためにFile->Sync Project with Gradle Filesをします。

参考：[ビルドの設定](https://developer.android.com/studio/build?hl=JA)

## debug.keystoreをどうにかする
ここでRunしてみると、android.debug.keystoreがありませんとでてきます。

これはデフォルトであればC:/Users/ユーザー名/.androidにあるdebug.keystoreを、
プロジェクトのbuild.gradleと同じ階層(SampleならVRSample/何か/Projects/Android/)に突っ込み、
android.debug.keystoreにリネームしてやります。

参考：[debug用keystoreについて調べてみた](https://qiita.com/taka0125/items/c408df4061a0af49c9b3)

# おわりに
ここまで来てOculusQuestを被ると、ようやく実行できたようでアプリが動いていました。
普通にOculusQuestのアプリ作るだけならどう考えてもUnityやUE4の方がいいです。
が、なにかやむを得ない事情に遭遇した時参考になれば。
個人的には極力AndroidStudio触りたくないなと思いました。
【matplotlib基礎】複数のグラフを並べて表示する

#概要
前回は複数のグラフを重ねて表示しました．

[【matplotlib基礎】複数のグラフを重ねて表示する]
(https://qiita.com/trami/items/b501abe7667e55ab2c9f)

今回は，複数のグラフを並べて表示したいと思います．

#動作環境
- Windows10(64bit)
- Python 3.7.2

#コード
では，早速実装していきましょう．

```py:graph_align.py
"""複数のグラフを並べて描画するプログラム"""
import numpy as np
import matplotlib.pyplot as plt

#figure()でグラフを表示する領域をつくり，figというオブジェクトにする．
fig = plt.figure()

#add_subplot()でグラフを描画する領域を追加する．引数は行，列，場所
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)
ax4 = fig.add_subplot(2, 2, 4)

t = np.linspace(-10, 10, 1000)
y1 = np.sin(t)
y2 = np.cos(t) 
y3 = np.abs(np.sin(t))
y4 = np.sin(t)**2

c1,c2,c3,c4 = "blue","green","red","black"      # 各プロットの色
l1,l2,l3,l4 = "sin","cos","abs(sin)","sin**2"   # 各ラベル

ax1.plot(t, y1, color=c1, label=l1)
ax2.plot(t, y2, color=c2, label=l2)
ax3.plot(t, y3, color=c3, label=l3)
ax4.plot(t, y4, color=c4, label=l4)
ax1.legend(loc = 'upper right') #凡例
ax2.legend(loc = 'upper right') #凡例
ax3.legend(loc = 'upper right') #凡例
ax4.legend(loc = 'upper right') #凡例
fig.tight_layout()              #レイアウトの設定
plt.show()
```

実行結果は以下のようになります．

![graph_align.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433790/af31561a-5b6c-9e9e-d0be-6edf7a4fe324.png)

#解説

- fig, axesオブジェクトの作成

コメントにあるように，add_subplot()の引数は行，列，場所となります．

```py
fig = plt.figure()
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)
ax4 = fig.add_subplot(2, 2, 4)
```

一行で以下のように記述することもでいます．

```py
fig, axes = plt.subplots(nrows=2, ncols=2, sharex=False)
```
このようにした場合，後半部分を以下のように変更すれば同じ結果が得られます．

```py
axes[0,0].plot(t, y1, color=c1, label=l1) # ax1 = axes[0,0]
axes[0,1].plot(t, y2, color=c2, label=l2) # ax2 = axes[1,0]
axes[1,0].plot(t, y3, color=c3, label=l3) # ax3 = axes[1,0]
axes[1,1].plot(t, y4, color=c4, label=l4) # ax4 = axes[1,1]
```

あとは，前回のように各種設定を必要に応じてしてあげれば完成です．

#まとめ
いかがだったでしょうか？
グラフを並べて描画して比較したいこともよくあると思うのでそのようなときに便利だと思います．
コードに関して建設的な意見があればコメントいただけると助かります．
wasmからDOMを操作してSVGを描画する

[wasm-bindgen / DOM Hello World!](https://rustwasm.github.io/docs/wasm-bindgen/examples/dom.html)を改造してSVGを出力してみます。全体のコードは以下にあります

https://github.com/termoshtt/wasm-svg-example

準備
-----
npmとwasm-packをインストールしておきます。

```
cargo install wasm-pack
```

npmのインストール方法は環境に合わせて適当に構築してください（詳しくないので丸投げ）

web-sys
----------
web-sysは[wasm-bindgen](https://github.com/rustwasm/wasm-bindgen/tree/master/crates/web-sys)でのsubcrateで、

- DOM
- Web Audio
- 2D canvas
- Web GL
- fetch

の機能からなる低水準のAPIです。今回使うのはDOMの部分で、これによりDOMを操作してSVGを挿入する事が出来ます。ます`web-sys` crateを`Cargo.toml`に追加してみましょう：

```toml:Cargo.toml
[package]
name = "dom"
version = "0.1.0"
authors = ["The wasm-bindgen Developers"]
edition = "2018"

[lib]
crate-type = ["cdylib"]

[dependencies]
wasm-bindgen = "0.2.48"

[dependencies.web-sys]
version = "0.3.4"
features = [
  'Document',
  'Element',
  'HtmlElement',
  'SvgElement',       # 追加
  'SvgCircleElement', # 追加
  'Node',
  'Window',
]
```

これは上述のサンプルからコピペしたものですが、一応SVG周りの使う要素を`features`に追加しておきました。これは現行では非常にたくさんの`features`が設定されていますが、将来的にはまとめたのを作るという方針のようです。

SVGを挿入する
------------

まず空っぽのHTMLを用意します

```html
<html>
  <head>
    <meta content="text/html;charset=utf-8" http-equiv="Content-Type"/>
  </head>
  <body>
    <p>SVG from rust/wasm!</p>
  </body>
</html>
```

この`<p>`要素の下にSVGを追加する事を目指しましょう。

```rust
use wasm_bindgen::prelude::*;

#[wasm_bindgen(start)]
pub fn run() -> Result<(), JsValue> {
    let window = web_sys::window().expect("no global `window` exists");
    let document = window.document().expect("should have a document on window");
    let body = document.body().expect("document should have a body");

    // SVGの描画領域を作る
    let svg = document.create_element_ns(Some("http://www.w3.org/2000/svg"), "svg")?;
    svg.set_attribute("width", "100")?;
    svg.set_attribute("hight", "100")?;
    svg.set_attribute("viewBox", "0 0 100 100")?;

    // 円を描画
    let circle = document.create_element_ns(Some("http://www.w3.org/2000/svg"), "circle")?;
    circle.set_attribute("cx", "50")?;
    circle.set_attribute("cy", "50")?;
    circle.set_attribute("r", "20")?;
    circle.set_attribute("stroke", "black")?;
    circle.set_attribute("fill", "red")?;
    svg.append_child(&circle)?;
    body.append_child(&svg)?;

    Ok(())
}
```

はまりポイントとしては、`svg`と`circle`を作る際に`create_element`ではなく、`create_element_ns`を使う必要がある事です。

これをコンパイルして実行するには

```
npm run serve
```

とします。npm関係の設定はほぼ全て元のサンプルそのままですので、詳しくは[rust wasm book](https://rustwasm.github.io/docs/book/)か[wasm-bindgen guide](https://rustwasm.github.io/docs/wasm-bindgen/introduction.html)を見てください。

最後に
-------
- これは[Rustオンラインもくもく会 #4](https://rust-online.connpass.com/event/142060)の成果です
短い命だった(2020年1月4日追記)Watson Knowledge StudioでCategoryが作れるようになってるぞ！

# 2020年1月4日追記
短い命だった。Custom Categoriesはdeprecationされていた……。

[WKSのリリースノート](https://cloud.ibm.com/docs/services/watson-knowledge-studio?topic=watson-knowledge-studio-release-notes&locale=en#september-2019)より
>Custom categories deprecation: The experimental custom categories feature is deprecated and will be retired on 17 December 2019. Access to custom categories models will not be available after that date.

実験してたカスタムカテゴリ機能は廃止になりました。
2019年12月17日から出てこなくなるよ。
ということですね。無念！

# Watson Knowledge Studioに見慣れぬリンクが
Watson Knowledge Studio(WKS)を使おうと思ったら、見慣れぬリンクが。
なんとCategoryが作れるっぽい。
まだ英語のみだけど。experimental(実験的)って書いてあるけど。
**※2019-018-12追記：ダラスではリンク出てくるけど、東京では出てこない！**

![category0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25840/4b2ae00f-17e9-2a80-92af-b9a4167c79bf.png)

# 作ってみるよね、Category
とりあえずCategory用のWorkspaceをぽちり。

![category.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25840/bd0f10d3-4143-4bd6-b870-8e3b4d6215b5.png)

# csvをアップロードするだけらしいぞ

Workspace作ると、Categoryとキーフレーズのcsvファイルをアップロードしてねという画面が。シンプル。

![category2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25840/e1b49092-5945-4e2b-a483-9d14e1ab2268.png)


サンプルがあるのでダウンロード。Custom-Categories-Sample-Template.csvの中身はこんな感じ。
1列目がCategoryで、2列目以降にキーフレーズが並んでますね。

/Home & Garden,home and garden
/Home & Garden/Smart Home,smart home,home automation
/Home & Garden/Home Security,home security camera,smart lock
/Home & Garden/Landscaping,landscaping,gardening
/Computers,computers
/Computers/Web,world wide web
/Computers/Web/Browsers,firefox,internet explorer

[ドキュメント](https://cloud.ibm.com/docs/services/watson-knowledge-studio?topic=watson-knowledge-studio-create-categories-model&locale=en)によると
・Category名(1列目)と1つのキーフレーズ(2列目)は必須
・トレーニングファイルは合計で1000のカテゴリとサブカテゴリくらいが良い
・カテゴリとサブカテゴリの名前を各カテゴリレベルで64文字にするのがおススメ
・3列目以降のキーフレーズはオプションだけど、モデルの精度を高めたい場合は強くおススメ。
　カテゴリごとに少なくとも3～5個のキーフレーズで。

# モデルできた！テストと評価してみよう

そのままCustom-Categories-Sample-Template.csvをアップロードするとすぐに学習が始まって、完了するとモデルのテスト画面がでてきたので、SmartHomeに関するニュース記事をペタッと貼り付けてテスト開始。
右側に結果と、モデルの評価ボタンが出てきましたね。
![category3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25840/d8cf5092-ffb4-fac8-1242-1597f92dd6a4.png)


結果が良好なら「Deploy model」をクリックするとすぐにNLUやDiscoveryで使えるようになるみたいですね。
日本語対応いつするかな～。楽しみだな～。

ドキュメント：
https://cloud.ibm.com/docs/services/watson-knowledge-studio?topic=watson-knowledge-studio-create-categories-model&locale=en
IO.inspect が超絶便利な件

[`IO.inspect`](https://hexdocs.pm/elixir/IO.html#inspect/2) が超絶便利です。なぜなら`IO.inspect(x)` は **`x` をまんま返してくる** からです。この意味を僕はつい先ほどまで知らなかった…。

## 例
どう便利なのか例を挙げましょう。

```Elixir
defmodule A do
  def double_sum(list) do
    list
    |> Enum.map(&(&1 * 2))
    |> Enum.reduce(0, &(&1 + &2))
  end
end
```

こんなコードがあった時、`list` に何が渡されてきたか確認したいことってままあります。そういう時は

```Elixir
defmodule A do
  def double_sum(list) do
    IO.inspect(list)

    list
    |> Enum.map(&(&1 * 2))
    |> Enum.reduce(0, &(&1 + &2))
  end
end
```

とすればいいんでしょうか。まあそれでもいいんです。が、こうもできます;

```Elixir
defmodule A do
  def double_sum(list) do
    list
    |> IO.inspect # ***** ここに注目 *****
    |> Enum.map(&(&1 * 2))
    |> Enum.reduce(0, &(&1 + &2))
  end
end
```

どうしてこういうことができるかというと、`IO.inspect(x)` は **`x` をまんま返してくる** からです。

これはすなわちパイプラインの途中に `|> IO.inspect` を挟んでもコードの実行には全く影響しないことを意味します (コンソールに文字が出力されるのと幾分実行時間が長くなる点を除いては)。

さてでは、`map` した後 `reduce` 前にリストがどうなっているか見たいとしましょう。普通に泥臭いやり方だと、

```Elixir
defmodule A do
  def double_sum(list) do
    doubled_list = 
    list
    |> Enum.map(&(&1 * 2))

    IO.inspect(doubled_list)

    doubled_list
    |> Enum.reduce(0, &(&1 + &2))
  end
end
```

このように一度変数に代入してごちゃごちゃやることになりますが、もちろんこんなことをする必要はありません。こう書けます;

```Elixir
defmodule A do
  def double_sum(list) do
    list
    |> Enum.map(&(&1 * 2))
    |> IO.inspect # ***** ここに注目 *****
    |> Enum.reduce(0, &(&1 + &2))
  end
end
```

最終的にこの関数が何を返すか知りたい時はもちろん

```Elixir
defmodule A do
  def double_sum(list) do
    list
    |> Enum.map(&(&1 * 2))
    |> Enum.reduce(0, &(&1 + &2))
    |> IO.inspect # ***** ここに注目 *****
  end
end
```

と関数の末尾に `|> IO.inspect` と書いてやればいいのです。`IO.inspect(x)` は **`x` をまんま返してくる** のですから。

## 結論

どうです? `IO.inspect` は超絶便利でしょう。この感動を誰かに伝えたくて書きました。ひょっとすると半ば常識なのかもしれませんが、そんなことはどうでもいいですw

## 参考

* [inspect について調べてみた - Qiita](https://qiita.com/melpon/items/dede48ad3bbc8c4ff443) パイプラインの途中に挟んで使えることが言及されています。わたしはその意味に全く気づかなかった…。その他様々なオプションが解説されています

* [ElixirのPipeに関する7のTips - Qiita](https://qiita.com/Tsuyoshi84/items/0782c4a288cdb5d55f6a) ここにも真っ先に載っています
未知の話者のText-To-Speechを転移学習で実現

Transfer Learning from Speaker Verification to Multispeaker Text-To-Speech Synthesis
Google Inc.
[元論文](https://papers.nips.cc/paper/7700-transfer-learning-from-speaker-verification-to-multispeaker-text-to-speech-synthesis.pdf)

複数話者の音声データを元に訓練し、訓練データに含まれない話者に対してもText-to-Speechをできるようにする。

## 背景


## 提案手法
Speaker encoderで話者の特徴を抽出
Synthesizerでテキストをエンコードし、Speaker encoderで抽出された特徴を連結
その後AttentionレイヤとDecoderにより、log-mel spectrogramを生成
log-mel spectrogramをVocoderに通し、waveformに変換する

### Speaker encoder
log-melスペクトログラムを固定長の特徴ベクトルに変換
generalized end-to-end speaker verigication lossを最適化することで
同じ話者の音声の特徴ベクトルならコサイン類似度が高くなる。
訓練データは1.6秒の音声データ。
推論では音声データが800msごとに分けられ、最終的に平均を取り、正則化される。

### Synthesizer
Tacotron2の構造を拡張している。
テキストをエンコードし特徴量を抽出。
その特徴量と話者の特徴量を連結し、Attentionレイヤを通してDecoderに入れて、log-melスペクトログラムを得る。
Tacotron2を拡張し、L2損失にL1損失を加えることで、ノイズを含んだデータに対してもロバストになる。

### Neural vocoder
log-melスペクトログラムからwaveformに変換する。
Tacotron2のVocoderと同じ構造
多くの話者によるデータで学習することで、複数話者のvocoderができる。

### Inference and zero-shot speaker adaptation
テキストと音声が一致している必要はない。
音声から合成に必要な話者の特徴ベクトルが推論されるから、
学習データに推論する話者が含まれなくて良い。
学習データに含まれなくても推論できる(zero-shot learning)

## 評価
評価指標: MOS(Mean Opinion Score)
客観的な聞き取りテスト
自然さと話者の本当の音声との類似性で評価する。

学習データに含まれている話者も含まれていない話者もまずまずの評価が得られた。
create-react-appで作ったReactアプリケーションがローカルサーバでしか動かない

# どうしたの

Reactでアプリケーションを作っている時に,ディレクトリ構成をごにょごにょしてローカルサーバで動作することを確認, そのままデプロイしたら本番環境で画面が真っ白になっていました.

デプロイ先はgithub pagesのサーバです.

なんだこれと思いながら色々調べるのに時間がかかったのでメモしておきます.

# 原因

ビルドにwebpackを使っているんですが,webpackがビルドする時に相対パス指定をぶっ壊してしまっているっぽいことが原因みたい.

ただ,create-react-appだとwebpackの設定をいじれないのでここで難儀しました.

# 解決法

アプリケーションのルートディレクトリに`jsconfig.json`というファイルを作成して,そこにビルド時の設定を記述することで解決できました.

記述は以下のような感じです.React関連のJavaScriptファイルがsrcディレクトリ以下に存在することを仮定しています.

```jsconfig.json
{
    "compilerOptions": {
        "target": "es2015",
        "baseUrl": "./src/"
    }
}
```

# まとめ
github pagesにデプロイしていることもあり,ブランチを雑に弄ったりするのはやだな〜と思っていたので,簡単に解決できて良かったですね.
Reactでp5を使ってたらWarning: You must first call texture() before using vertex() with image based u and v coordinatesが出た

# なんやこいつ

React-p5-Wrapperを使ってReactでp5のコンポーネントを作って遊んでいたら,draw()が呼ばれるたびに下記のようなwarningがGoogle ChromeのConsoleに出ていました.

```console.
You must first call texture() before using vertex() with image based u and v coordinates
```

こいつのせいでConsoleがめちゃ重だし,パフォーマンスにも影響を与えてそうなので解決しました.

# 解決法
[こちら](https://github.com/processing/p5.js/issues/3498)を参考にすると,どうやら使っているp5.jsのバージョンが悪いことに起因してそう.

確認してみるとreact-p5-wrapperが依存しているp5.jsのバージョンが7.3.4でした.
というわけで,node_modulesの中にいるであろうp5のバージョンをあげます(Reactアプリケーションなので).

```terminal.
yarn upgrade p5@0.9.0 --save
```

これで解決！！

# まとめ
p5もっとメジャーになれ(なれ)
【Maya】登録したオブジェクトを１クリックで上書きエクスポートするスクリプト

　ソフト間の行き来等で何度もエクスポートしなければならないという時に便利なスクリプトを作りました。
書き出しのためのウィンドウを開かず上書きの確認もしないため効率的なエクスポートが可能です。

<font color="red">**2020/08/30 更新　不要ノード削除機能の追加とリストの仕様を改善しました。**</font>


#機能
登録したオブジェクトを１クリックで指定したフォルダに上書きエクスポートする事ができます。
リストに登録したオブジェクトを全て書き出す他、リストから選択したオブジェクトだけを書き出す事もできます。
拡張子はma、mb、fbx、obj に対応しています。
![SimpleExporter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462577/bcf7c5d2-1e8b-77d4-9486-a33d3b3f0d75.gif)

###<font color="red">不要ノードの削除機能</font>
2020/08/30の更新より命名規則に基づく不要なノードの削除機能を追加しました。
![deleteNode1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462577/7e3a9972-1fa0-a947-1556-2fccdca6dae7.jpeg)　![deleteNode2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462577/9758400e-3fc1-f93c-6af0-39001e0f97ff.jpeg)



#導入方法
###1.
以下のスクリプトファイルをダウンロードし、
https://drive.google.com/open?id=1cj_5zgtxWYWZdZ2B0VUAYljhRoPh68lA

C:\Users\ユーザー名\Documents\maya\scripts　　（Mayaの全バージョンに導入）
C:\Users\ユーザー名\Documents\maya\20XX\ja_JP\scripts　（バージョン単位の導入）

のいずれかに移動。Mayaを立ち上げていた場合再起動する。

###2.
以下のソースコードをスクリプトエディタのPythonタブに貼り付け、中ボタンでシェルフフィールドにドラッグ＆ドロップ。

```python
import SimpleExporter
SimpleExporter.Main().StartUp()
```
![SimpleExporter_ScreenShot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462577/3825dccf-2d96-05cf-7fe8-5eb8f11fa555.jpeg)


#使い方
![UI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462577/0f704e2a-106f-807c-dfcf-c8e128261acb.jpeg)
###書き出しリストの操作
・追加 → ビューポート上で選択したオブジェクトを登録。<font color="red">2020/08/30の更新により親ノードが追加されるようになりました</font>
・削除 → リスト上で選択したオブジェクトを削除
・クリア → リストをクリア

###書き出し設定
・パス → 右の「参照」でエクスポート先のフォルダを選択。直接入力でも可
・拡張子 → mayaAscii、mayaBinary、fbx、obj から選択

###書き出し方
・リストを書き出し → リストに登録されているオブジェクトを全て書き出す
・リストの選択を書き出し → リスト上で選択したオブジェクトを書き出す

###<font color="red">追加機能</font>
・末尾に次の文字が含まれるノードを削除 → 
ノードの後ろに特定の文字列が入ってるノードを自動で削除してくれます。「,」で区切る事で複数の文字列に対応します。空白は無視されます。

・元に戻す → 単純なUndoです。上機能で不要ノードが削除されるので確認後編集に戻りたい場合は一度Undoしてください。
HELLO

初めまして
直弥と申します。

初めての投稿になりますが、とりあえず自己紹介をさせていただきます。

大阪在住の２９歳のメンズです。
月の労働時間３００時間越えのブラック企業に勤務しております。
将来を考えて、プログラミングを勉強中で８月２４日よりTECH::EXPERTに参戦します。

主にアウトプットと閲覧になると思いますが、暖かく見守ってください。
ご指導ご鞭撻ご指摘はこころよりお待ちしております。
dockerコンテナ内でpermission errorが発生

# dockerコンテナ内でpermission errorが発生

### 動作環境(VM)
- CentOS Linux release 7.6.1810 (Core)
- Docker version 1.13.1, build 7f2769b/1.13.1
- docker-compose version 1.18.0, build 8dd22a9

### コンテナ内の環境

- Python 3.6.9 (FROM python:3.6)
- Flask 1.1.1
- Werkzeug 0.15.5

## 事象
`docker-compose up`を実行したところ、/root配下のファイルを操作した中でPermission deniedとなってしまいました

```
$ docker-compose up
Creating network "default" with the default driver
Creating container ... done
Attaching to container
container | python: can't open file '/root/app/run.py': [Errno 13] Permission denied
container exited with code 2
```

## 解析
dockerの再起動と、centosの再起動をしてみるが、どちらも解決せず、、
とりあえずググってみて、関連した記事を参考に解析してみる

### 1.SELinuxの無効化
https://qiita.com/koutwiring/items/10c3a67c1b58cf7d02c7
    
下記のファイルを編集して、SELinuxをオフにする

```/usr/lib/systemd/system/docker.service
~ snip ~
# 下記の１行を追記
OPTIONS=--selinux-disabled
~ snip ~
```

その後dockerを再起動して、`docker-compose up`を実行しましたが解決せず、、
    
```再起動コマンド
$ sudo systemctl restart docker
```

上記では解決できませんでした。


### 2.DockerでTCPポート80の使用をやめる
https://qiita.com/KEINOS/items/fba92ca0fb7662da0a00

flaskでコード(app.runの部分)を下記のように編集してポート5000を使用する

```python/run.py
~ snip ~

if __name__ == '__main__':
  app.run(host='0.0.0.0',port=5000,threaded=True)
```

これも解決せず、、

### 3. rootユーザでコマンドを実行する
Dockerfileの内容に下記を追記して、rootユーザでコマンド実行するようにしました

```Dockerfile
~ snip ~
USER root ←これを追記
CMD ["python", "/root/app/run.py"]
```

これも解決せず、、

### 4. dockerの最新版をインストール

dockerのversionを最新版にしてみました。

```

$ docker-compose up
Creating network "default" with the default driver
Creating container ... done
Attaching to container
container |  * Serving Flask app "run" (lazy loading)
container |  * Environment: production
container |    WARNING: This is a development server. Do not use it in a production deployment.
container |    Use a production WSGI server instead.
container |  * Debug mode: off
container |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
```
解決しました！！

## 原因
dockerのversionが古かったのでエラーを吐いていたようです
下記にバージョンアップすることで解決しました

```
$ docker --version
Docker version 19.03.1, build 74b1e89
```

---
1. [Dockerコンテナ内でのpermission denied](https://qiita.com/koutwiring/items/10c3a67c1b58cf7d02c7)
2. [Python3 + Web 80 番ポートで PermissionError: [Errno 13] Permission denied on Docker](https://qiita.com/KEINOS/items/fba92ca0fb7662da0a00)
VPSとは

## VPSとは
Virtual Private Serverの略で、仮想的な個人サーバと訳せます。
複数のユーザで１台のサーバを利用する点では共用サーバと同じですが、
VPSは仮想的に１ユーザが１台のサーバを利用できます。
そのため、共用サーバのような制限（Javaが使えない）を受けることがありません。
Anaconda環境で、Jupyter NotebookのModuleNotFoundErrorに出鼻を挫かれた

#何が起こっていたのか
Environmentsから使いたい仮想環境(Python)を選び
Anaconda NavigatorのhomeからJupyterをLaunch。
Jupyterのnew→Python3でファイルを作って
`import tensorflow as tf`を実行すると
ModuleNotFoundErrorが発生。
#最終解決
仮想環境にjupyterをインストールしていなかったので
仮想環境のターミナルを立ち上げ
`conda install jupyter`を実行、仮想環境にjupyterをインストール。


エラー時は、rootのjupyterを立ち上げていたので、tensorflowを読み込めなかった。
ウルトラハイパー超しょうもなさすぎボンボンボン凡ミス。


#エラーに行くまで
そうだ、機械学習をしよう。
唐突に湧き上がる欲求を満たすべく
anacondaでtensorflow用の仮想環境を立ち上げた。

仮想環境のターミナルを開いた後
`conda create -n tensorflow_gpuenv tensorflow-gpu`
`conda activate tensorflow_gpuenv`
を実行。

仮想環境のターミナルから、
`import tensorflow as tf`
が動くことを確認。

**仮想環境でJupyterのインストールをしないまま**
Anaconda NavigatorのhomeからJupyterをLaunch。

***「ターミナルでは動くのに、なぜjupyterでは動かないのか？」***
謎の凡ミスから始まる謎修正・謎エラーへ・・・（2時間も気付くのにかかりました）
機械に学習させる前に僕が学習するべきですね。
chromeのconsoleログで時刻を表示させる設定

chromeのログってログが出力された時刻が出ずにちょっと不便だなって思うことありませんか？
現在時刻出力させるコードを書くのもめんどいし。
実はchromeのオプションで時刻が出ることが分かったので備忘録としてqiitaに残します。
Developerツールの右上の三点ボタンをクリックしてSettingsを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331674/961e5654-945a-e3b3-662c-bb82f684e5db.png)
Preferencesの中のConsoleにShow Timestampsという項目があるのでチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331674/9fd56ac7-25b1-d9fe-4582-c336e514b7df.png)

これだけでめでたくconsoleのログに時刻が出力されました！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331674/5bd7082a-8936-81a4-8d4b-e4e23bc0d09f.png)

エンジニアに役立つ情報をTwitterでも発信していますので宜しければTwitterの方もフォローをよろしくお願いします！
[Twitterへのリンクはコチラ](https://twitter.com/mr_t_free)
UnityのAddressableで暗号化したかった…

##自己紹介
こんにちはゆずです。@Yuzu_Unity
自分はUnityエンジニア・3DCGデザイナーの学生です。（軸はエンジニア　4年ほど…）

##初めに
Addressableが正式リリースした今
暗号化をさせたかった話

Unity2019.2.01f1
Addressable v1.1.7

##Addressable Assets Systemと旧AssetBundleとの違い

内部システムでいえば正直何も変わらない
AssetBundleのワークフローを良く改善したのがAddressableであると自分は思います。
(Resourcesの代わりでもある)


##Addressableをそのまま使う(少ないデータを暗号化には…)

※すべてのアセットに行うのは面倒なので基本的に暗号化したいファイルのみに行うことになってしまう。（仕方ない…）
###・ファイルbyte[]を暗号化しTextAsset化しAdrressableで利用
ファイルごとにbyte[]から変換できる機能が必要
(VRMファイル等には有効かも？、プレファブ単位は厳しい)

###・アドレス(プレファブ)１つの単位でのアセットバンドル化をし暗号化をしたものをTextAsset化しAdrressableで利用
アドレス名がアセットバンドルのアセット名になるため実装が楽になりそう(Addressableの恩恵を受けやすい？)
個別にアセットバンドルを作る必要、Load&Unload等の実装 が必要

###・複数アドレス(プレファブ)単位でのアセットバンドル化をし暗号化をしたものをTextAsset化しAdrressableで利用
アセットバンドル内の参照を別でもつ必要がある
個別にアセットバンドルを作る必要、Load&Unload等の実装も含む
##Addressable(ResourceManager)本体を改造編

全体を暗号化することが可能！

###・Addressableからビルドされたアセットバンドルを暗号化

これはResourProviderの編集のみでできるかと思われた…

今回暗号化にはこちらを用います。
[【Unity】暗号化したAssetBundleはLoadFromStreamでロードすればメモリに優しい](http://tsubakit1.hateblo.jp/entry/2019/03/16/162138)

まずは
Addressable Assets SystemをPackageManagerからインストールします。

そのままでは改造できないため...

Library/PackageCacheフォルダからPackagesフォルダに移動します
この時移動するのは
com.unity.addressables@1.1.7
com.unity.scriptablebuildpipeline@1.5.2
の2つです
フォルダを移動しないと、‎Assembly Definition Filesの循環参照によって自作のResource Providerはつくれなさそうです。
追記 継承でOverwriteすれば問題ないです、すみません。

移動後
Assets\com.unity.addressables@1.1.7\Runtime\ResourceManager\ResourceProviders\AssetBundleProvider.cs
を開き編集します。

```c#

 m_RequestOperation = AssetBundle.LoadFromFileAsync(path, m_Options == null ? 0 : m_Options.Crc)

```

を

```c#

//暗号化したAssetBundleを取得
string password="設定したパスワード";
fileStream = new FileStream(path, FileMode.Open);
var uniqueSalt = Encoding.UTF8.GetBytes(Path.GetFileNameWithoutExtension(path)); // AssetBundle名でsoltを生成

// Streamで暗号化を解除しつつAssetBundleをロードする
var uncryptor = new SeekableAesStream(fileStream, password, uniqueSalt);
m_RequestOperation= AssetBundle.LoadFromStreamAsync(uncryptor,, m_Options == null ? 0 : m_Options.Crc);

```

に書き換え、ビルドしたアセットを暗号化しておけば
ローカルであれば動くことが確認できました！
ローカルであれば…ローカルであれば…

しかし、
リモートになるとキャッシュシステムがAssetBundleのキャッシュ機能を用いているので
ダウンロード等がそもそも行えません。(暗号化後はbyte[]なので)

キャッシュシステムを自前のシステムに変更することで可能であると思います。

###・Addressableからビルドされたアセットバンドルを暗号化しTextAsset化しアセットバンドル化

上記同様アセットバンドルのキャッシュシステムのチェックによって容易にはできず。
キャッシュシステムの変更までは必要にはならないが都度2段階ビルドを行うことにもなるので微妙


##まとめ＆感想
ResourceProviderのちょっとした編集のみで暗号化はできないみたい

今後の更新もあるので、あまり編集したくない。

公式で暗号化実装してほしい…

暗号化を除けばAddressableかなり強い…
Mac で「 ⌘⌥⇧⌃ (command, option, shift, control) 」の文字を入力する

大体のアプリケーションでは、`編集タブ → 絵文字と記号`という項目があるのでこれを使う。
なければ、別のアプリケーション（`メモ`とか）を開いて入力し、コピペしてくる。

なお、キーボードショーカットは`⌃⌘スペース`。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140384/cc004517-d071-e618-a7bf-32445dfeca69.png)

開くと、カーソル近くに以下のような入力補助的なやつが出るはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140384/8ae0927a-da11-93b9-58fd-3b23ab88f02d.png)

あとは各記号の名前が分かれば検索できる。ということで以下に名前を挙げる。

⌘ ： Place of Interest Sign
⌥ ： Option Key
⇧ ： Upwards White Arrow
⌃ ： Up Arrowhead

（参考：各文字のデータ）
⌘ ： https://unicode-table.com/en/2318/
⌥ ： https://unicode-table.com/en/2325/
⇧ ： https://unicode-table.com/en/21E7/
⌃ ： https://unicode-table.com/en/2303/

ちなみにキーボードから普通に入力できる `^` は Circumflex Accent で別物なので注意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140384/be2d64ae-7fbd-d828-12c0-d58ce1733c5c.png)

ｵﾜﾀ＼(⌃o⌃)／
php-master-changes 2019-08-10

今日は一部組み込み関数の arginfo を PHP スタブで実装するようにする修正、gen_stub.php の修正があった！


# 2019-08-10
## nikic: Add some basic_functions stubs
- https://github.com/php/php-src/commit/d9e2d185057b66e2adc9f25ce4ee60d482e086a9
- 一部組み込み関数の arginfo を PHP スタブで実装
- [前日](https://qiita.com/sj-i/items/6487dbd8eaaef4053a68#nikic-generate-arginfo-from-php-stub-files) 入れた gen_stub.php を使ってという奴

## nikic: Expand preprocessor support in gen_stubs
- https://github.com/php/php-src/commit/17987da884f8ff1147f4804ce42622a001eb7210
- gen_stub.php で、プリプロセッサマクロへの対応を追加

## stephenreay: Fallback to curl in gen_stub if wget fails
- https://github.com/php/php-src/commit/9c02c584819369b7e1fd1ab515a2e5c411355b11
- gen_stub.php で、PHP-Parser を GitHub から落としてくるのに wget でだめなら curl を使うよう修正

## nikic: Handle preprocessor conditions inside classes
- https://github.com/php/php-src/commit/ae721c488dc31c59a5a05b4220564ee8dbf8fbb0
- gen_stub.php で、クラス内でプリプロセッサマクロを扱えるよう修正
さらばEclipse, Visual Studio Codeでそこそこ軽量JavaFX開発 ～環境構築編～

# 対象読者(現状の私の状況)
## 要求
* JavaFXでGUI開発をしようとしている。
* ライトな開発環境がほしい or 宗教上の理由によりEclipseが使えない。
* お布施が払えないのでIntelliJは使えない。
* JDKの導入くらいは自分でできる
* Javaの構文と動きがざっくり分かる  
=> 最近Visual Studio CodeのJava開発がアツいらしいので試してみた。  
※なお、初学者目線での実用性なので至らない点があればご指摘ください。

## 開発環境
- Windows 10 + Visual Studio Code(1.37.0 執筆時最新)
- OpenJDK 11.0.3 + OpenJFX 11.0.2
- Visual Studio CodeのJava開発用拡張機能導入済み。  
Visual Studio CodeへのJava開発環境構築とIntelliSense等を含めた拡張機能の導入方法は他の記事に譲ります(丸投げ)。

## 余談
最近、Java開発用のVisual Studio Codeインストーラーが出ましたが、今回はこれを試していません(Javaの実行環境自体はこれ以前に作っていたため)。どうもJDKがOpenJDKではなくAdoptOpenJDKらしいですね。
# 事前準備
JavaFXを[公式サイト](https://openjfx.io/)からダウンロードします。
執筆時点ではJDK 12向けとLTSであるJDK 11向けのバージョンが公開されています。
SDKがついている方で、一通りまずは動作させることができるので、SDKの方を導入します。
DL先は[こちら](https://gluonhq.com/products/javafx/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208031/87f3a24c-5502-553f-2659-60884c57a9b0.png)

次に、DLしたファイルを任意の場所に展開しておきます。
今回は`C:\Users\myuser\Documents\jfx\`に展開したファイルを入れました。
# 設定方法
1. JavaHomeをVisual Studio Codeの`settings.json`に追加
各自の環境に合わせて追加してください。すでに環境構築済みの場合は追加されているかもしれません。(IntelliSense自体はJavaHomeの設定がなくても動いてしまうため今回はここから設定)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208031/d8c704dd-ebe3-fef1-3abf-3dacfed45399.png)

2. デバッグ構成を追加
Visual Studio Codeのデバッグ設定を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208031/e5fd8114-2db1-46a8-c3de-82d3635f65a2.png)
サイドバーの虫のマーク(バージョンによりアイコンは変動)をクリックし歯車のマークをクリックすると、`launch.json`がエディターで起動するのでここに追記を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208031/50bb2f98-3674-15ec-22bc-4098a923f41c.png)

ここに追記を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208031/400635bb-b7b7-58c9-56f0-201f54025568.png)


```json

"vmArgs": "--module-path C:\\Users\\myuser\\Documents\\jfx\\javafx-sdk-11.0.2\\lib --add-modules javafx.controls,javafx.fxml"

```
のように、先程展開したJavaFXのlibディレクトリへのPATHと利用するモジュール名を追記します。

これにより、Visual Studio CodeからF5キーでデバッグモードを利用し実行結果を確認できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208031/2e081ca6-c4b6-074c-717a-e92ce6839a0a.png)

# まとめ
ノートパソコンのCPUでEclipseを動かすのは少し厳しいときなど、この方法が役に立つと思います。ただし、Javaの拡張機能自体がそこそこに重いので、Eclipseよりも少しはマシ、位に思うと心理的にも楽です。