OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】OpenJTalkとTalk APIを使って会話する(音声出力まで)

# はじめに
以前自作のslackbotを作った際にリクルートのTalk APIを用いて自動返信機能を作ったことがありました。それと最近環境構築したOpenJTalkを使えば実際に話してくれるじゃん！と思ってやってみました。友達がいないわけではないです
※OpenJTalkをインストールしていなくてもTalk APIを用いて会話はできます

# 環境
Windows 10
Python 3.7
OpenJTalk
pya3rt (talk apiを使う用)

# 準備
### OpenJTalk
Python からも使える音声合成ソフトです。[こちら](https://qiita.com/koichi_baseball/items/09cd984a409b3701b423)の記事に環境構築からPythonで話すまでまとめてあります。

### 会話機能
#### Talk API
文字列を送ったら返答を返してくれるAPIです。
[BOTで使える会話API・ライブラリ・サービスまとめ](https://qiita.com/kenzo0202/items/582e3a5e06b64ab24964)を参考にさせていただきました。

>Talk API  
リクルートテクノロジーがオープンイノベーションの一環で社内で用いられていた機械学習・ディープラーニング技術ををAPIとして一般公開したものの一つ。他にもA/Bテストのための画像の好ましさを判定するモデルを作成できるImage InflueｎceAPIや文章の自動生成及び入力補助をしてくれるText Suggest APIなど面白いものが公開されている。

ここからメアド登録してAPI発行できます。
[Talk API](https://a3rt.recruit-tech.co.jp/product/talkAPI/registered/)

#### pya3rt
Pythonから簡単に使えるpya3rtというライブラリが提供されています。以下のコマンドでインストールしてください。

```shell
pip install pya3rt
```

# コード
## 会話機能
会話機能の部分を関数にしました。messageはAPIに送る文字列で返り値は会話の返答です。

```Python
import pya3rt

def send_message(message):
    apikey = "api key"
    client = pya3rt.TalkClient(apikey)
    reply_message = client.talk(message)
    return reply_message['results'][0]['reply']
```

reply_messageの中身はこのようになっています。

```
{'status': 0, 'message': 'ok', 'results': [{'perplexity': 0.06766985185966182, 'reply': 'こんにちは'}]}
```

返答部分だけ抜きたかったので
`reply_message['results'][0]['reply']`
としました。

## 音声出力
次は音声出力の部分ですが、[この記事](https://qiita.com/koichi_baseball/items/09cd984a409b3701b423)で作った`jtalk.py`を呼び出します。

```Python
import jtalk

jtalk.jtalk('喋らせたい文字')
```

## 結果
これらを合わせると以下のようになります。
コンソールから文字列を受け取る⇒APIに投げる⇒音声出力するという流れです。

```Python
import pya3rt
import jtalk

def send_message(message):
    apikey = "api key"
    client = pya3rt.TalkClient(apikey)
    reply_message = client.talk(message)
    return reply_message['results'][0]['reply']

if __name__ == "__main__":
    while True:
        message = input("message : ")
        reply   = send_message(message)
        print(reply)
        jtalk.jtalk(result)
```

出力結果。OpenJTalkが使えていると返答(message : がない方)が音声出力されます。

```
message : こんにちは
こんにちは
message : 雪が降ったね
風邪ですか?
message : さむいですね
私もそう思います
message : だよねー
そうですよね
message : あなたは誰ですか？
私はまだ名前がないんです
```

# おわりに
とても簡単に実装できました。PythonとAPIはすごいですね。
あとは音声認識ができればもう人とコンピューターが会話できますね。

# 参考にさせていただいたサイト
[BOTで使える会話API・ライブラリ・サービスまとめ](https://qiita.com/kenzo0202/items/582e3a5e06b64ab24964)
[リクルートのTalk APIを用いてslack bot(python製)に会話機能を追加する](https://qiita.com/takahirono7/items/197375db24a03cbcd591)
Capistranoでの自動デプロイでエラーが起きた際の対処方法(migration error)その2

## この記事について
　この記事では、自身がRailsで開発しているアプリをCapistranoでデプロイをしようとした時にエラーが発生し、解決するまでに試した作業を書いています。
　同様のエラーが起きた際に自分が読み返すために書いていますが、他の方の参考にもなれば嬉しいです。
　前回の記事と同じような状況ながら違う原因でエラーが出ていたので、別の記事として書くことにしました。

### エラーが起こった時の状況
　Capistranoで自動デプロイを実行したがエラーのため完了でしませんでした。
　エラーの内容を確認してみると、以下のように書かれていました。

```
00:15 deploy:migrating
      01 $HOME/.rbenv/bin/rbenv exec bundle exec rake db:migrate
      01 rake aborted!
      01 StandardError: An error has occurred, all later migrations canceled:
      01
      01 Mysql2::Error: Table 'users' already exists: CREATE TABLE `users` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` var…
```

　まだまだエラー表示は続きますが、要は「migrationでuserテーブルを作成しようとしたが、userテーブルが既に存在するので実行できません」ってことですね。
　チーム開発をしている状況で、migrationファイルが変わってしまって上手くマイグレーションできなかったものと思われます。今後も開発中にチームメンバーの更新によって変更が発生する可能性も無くはないでしょうか。

### 解決までの作業

　今回のエラーはmigrationファイルと現状のデータベースで齟齬が発生してしまったため起こったものと考えられます。
　そこでデータベースを一度削除し、1からマイグレーションを行うことで解決できると考えました。

#### サーバー環境のMySQLに接続し、既存のデータベースを削除する
ターミナルからawsにアクセスし、データベースを操作するためにMySQLに接続します。

```ターミナル
mysql -u root -p
```

　パスワードを入力すればMySQLへの接続が完了します。接続できたら既存のデータベースを削除します。まずは削除するデータベースを確認します。

```rb
show databases;
# 実行結果
+--------------------+
| Database           |
+--------------------+
| information_schema |
| sample_production  |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)
```
　データベースの名前が確認できたら、そのデータベースを削除します。

```ruby
mysql> drop database`sample_production`;
# 実行結果
Query OK, 9 rows affected (0.07 sec)
```
これで既存のデータベースは削除されました。

#### データベースを再作成する
　データベースがないままだと自動デプロイができませんので、削除した後は再びデータベースを作成します。
　MySQLからの操作でも作成できそうですが、今回はawsからの操作で作成します。

```
mysql> quit

[ec2-user@ip-111-111-111-111 sample]$ rails db:create RAILS_ENV=production
```

#### マイグレーションを実行する（自動デプロイを実行）

```
bundle exec cap production deploy
```

　以上です。今回はこの作業で自動デプロイができるように復旧できました。
[Common Lisp] condでの条件分岐

## cond

複数の条件分岐を書ける。
if / elsif / else のようなイメージ。

- 最後の分岐の条件には `t` を置くのが定石らしい。

```lisp
CL-USER>
(defun cond-symbol (x)
  (cond ((eq x 'a) `(symbol is a.))
        ((eq x 'b) `(symbol is b.))
        (t '(other symbol))))
COND-SYMBOL

CL-USER> (cond-symbol 'a)
(SYMBOL IS A.)

CL-USER> (cond-symbol 'b)
(SYMBOL IS B.)

CL-USER> (cond-symbol 'c)
(OTHER SYMBOL)
```

## 参考

- Land of Lisp https://www.oreilly.co.jp/books/9784873115870/
[Julia] ルンゲクッタ法の実装 - Pythonとの比較 -

#前置き

　以前、 [pythonで作ったルンゲクッタ法](https://qiita.com/guraragu0010/items/b97ea313ed1ec0cbea61)のプログラムをJuliaでも書いてみました。使い勝手はPythonと似ていますが、ブロードキャスト構文によりnumpyなどのライブラリがなくとも簡便で速い行列計算が行えることなど、コードがPythonより計算に向いているように思われます。ちなみにJuliaはVersion 1.2.0です。

#ルンゲクッタ法について
　以前にまとめましたので、下記URLを参照ください。
　https://qiita.com/guraragu0010/items/b97ea313ed1ec0cbea61

#Juliaでのルンゲ-クッタ法のプログラム

　プログラムは以下のようになりました。Pythonのものと比較していただければ、ほとんど同じように作製できていることが分かります。違うところはPythonではnumpyライブラリのzeros()を使用していましたが、Juliaではもともと実装されたzeros()を使用しています。また、Juliaのリストの添え字は0ではなく1始まりであることには注意が必要です。

```julia:
#時間間隔h、時刻t、その時のyの値、標準形の右辺fを与えることで
#時刻t+1の値y+1のリストを返すルンゲクッタ法のアルゴリズム
function rk2(t,y,h)
    k1 = h*f(t,y)
    k2 = h*f(t+h/2,y+k1/2)
    y = y + k2
    return y
end


#初期時刻tini、終了時刻tlast、分割点数interval、初期条件list_yiniを与えると
#時刻のリストlist_t、ルンゲクッタ法の解のリストlist_yを返す
function rungekutta2(tini,tlast,interval,list_yini)
    #時間間隔hの計算
    h = (tlast-tini)/interval
    #初期条件の大きさの確認
    size = length(list_yini)
    
    #list_t, list_yの入れ物を作製
    list_t = zeros(interval+1)
    list_y = zeros(interval+1,size)
    
    #初期条件の格納
    list_t[1] = tini
    list_y[1,1:size] = list_yini
    
     #ルンゲクッタ法で随時計算し結果をlist_t, list_yに格納
    for i in 2:interval+1
        list_y[i,1:size] = rk2(list_t[i-1],list_y[i-1,1:size],h)
        list_t[i] = list_t[i-1]+h
    end
    return list_t,list_y
end

```

#ルンゲ-クッタ法のプログラムのテスト
 こちらも以前と同様に、調和振動子の運動方程式を使って確認します。調和振動子の運動方程式を標準形を用いてプログラムに落とし込むと、以下のようになりました。ここでのJuliaの特徴は”pi”や”π”という文字列が円周率を表してくれることと、積の演算子”*”を省くことも可能であるということでしょうか。そのために、より数式に近いコードを書くこともできそうです。

```julia:
km = 4pi^2

function f(t,y)
    freturn = [y[2], -km*y[1]]
end
```

　さて、時刻は0~1、分割点数を100、初期位置を0、初速を1として計算を実行してみます。

```julia:
list_t1,list_y1 = rungekutta2(0,1,100,[0,1]);
```

　結果を図としてプロットすると、以下のような図が出力されました。オレンジ色が速度、青色が位置を表しています。また、線が計算によるもので、ドットは理論的な解をプロットしたものです。計算結果と理論的な解がよく一致していることが分かります。また、実際に結果を比較しても1E-3程度まで一致していることが分かりました。Pythonでの出力と同程度の精度です。

![runge_kutta2_julia.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481391/8fd31b2a-2b89-062f-df09-5fcd73df8500.png)

# まとめ

　Pythonで作製したルンゲクッタ法のプログラムをJuliaで書き直してみました。使い勝手は似ていますがJuliaの方が計算に向いた作りであるように思いました。何か間違いがあるようでしたらお教えいただければ幸いです。
機械学習がわかるようになるステップを記録していく

# 動画3本と本1冊で大体わかるようになる
みたいなコンセプトで書いてみる

## オススメの動画
3本で1時間。これだけ見れば先ずはOK
1. [まずは動かしてみる](https://www.youtube.com/watch?v=er02CtNUZVA)：「【機械学習超入門】初心者はまず動くモデルを作る」
2. [ディープラーニングのさわりがわかる](https://www.youtube.com/watch?v=btGW8P6FcF4):「内職が要らないくらい分かりやすいディープラーニング入門」
3. [pythonのライブラリを学ぶ入り口](https://www.youtube.com/watch?v=92Z9FEs827g):「【機械学習超入門】scikit-learnについて【知っておきたいライブラリ】」

## オススメのPythonの本
毎日5本くらいノックを受けてみる。ググりながらでも多分いけるが、体系的に知っておいたほうが、結局最短距離になると思う。
1. [とにかく触ってみる](https://www.amazon.co.jp/Python実践データ分析100本ノック-下山-輝昌/dp/4798058750)「Python実践データ分析100本ノック」

# 結局何がわかるようになれば良いのか
上記をやると、以下のようなものが身につく。

- Pythonを書いてみてモデルを作って予測したという経験
- Kaggleのサイトに行けば色々なデータを入手・Tryできることを知っておくこと
- アルゴリズムってどういうイメージなのかという感覚
 - アルゴリズムは、最適化問題を解くもの。という感覚
 - 回帰とか勾配ブースティングなどのなんとなくの仕組みとユースケース
- データの前処理
 - One Hot Encodingとか、正規化とか

# 番外編

## 書き溜めていく箱てきなもの

- [活性化関数のショートムービー](https://www.youtube.com/watch?v=Mp1h3coaHgk
)
- [どんなアルゴリズムがあるか](https://qiita.com/tomomoto/items/b3fd1ec7f9b68ab6dfe2)
- [機械学習のための環境（例：AWS SageMaker）](https://www.youtube.com/watch?v=A9W20-9LCjI&feature=youtu.be)
- [Google のデータサイエンティストが語る現場で使える機械学習入門](https://www.youtube.com/watch?v=PARsDyRJMWE)

## 次にわかるようになるべきもの
- XGBoostの例
 - ハイパーパラメータのチューニング項目、カーネルとかも 

## もうあまり勉強しなくてもよくなる？かもしれない理由
- よしなに機械学習してくれる環境が増えてきている
 - AutoML
 - DataRobot
 - AWS Forecast
- よしなに機械学習してくれるライブラリ（アルゴリズムの実装）が多く出てきている
 - scikit-learnとか、XGBoost/LightGBMとかそういうの
 - アルゴリズムの仕組みというよりは、ユースケースレベルでの理解で十分

## 今後注力していきたいもの
- MLOpsみたいなデータ収集〜加工〜学習みたいな流れの効率化・自動化
 - 2020/6/8勉強したので追記：[AWSデータ分析系ツールまとめ（AI+BI=MLOps）](https://qiita.com/kounan13/items/8c51a5ab429d2b91e1ba)
- AIOpsみたいなシステム開発のプロセスにAIを
 - 2020/6/8追記：AI系のコミュニティで発表する予定がコロナ影響で中止
- IoTとかデバイス系
AWS(EC2)でNginxのrails.confを設定する方法

AWSのNginxを設定する際に、rails.confファイルの設定をします。

この方法の説明が意外とないので、説明していきます

## Nginxの設定ファイルを編集

```
[ec2-user@ip-172-31-25-189 ~]$ sudo vim /etc/nginx/conf.d/rails.conf
```

rails.confファイルが開かれたら、下記の記述をします。

```ruby:rails.conf
upstream app_server {
  # Unicornと連携させるための設定。
  # アプリケーション名を自身のアプリ名に書き換えることに注意。
 server unix:/var/〇〇〇（アプリをまとめているディレクトリ）/〇〇〇〇〇〇<アプリケーション名>/tmp/sockets/unicorn.sock;
}

# {}で囲った部分をブロックと呼ぶ。サーバの設定ができる
server {
  # このプログラムが接続を受け付けるポート番号
  listen 80;
  # 接続を受け付けるリクエストURL ここに書いていないURLではアクセスできない
  server_name 18.〇〇〇.〇〇〇.〇〇（Elastic IP）;

  # クライアントからアップロードされてくるファイルの容量の上限を2ギガに設定。デフォルトは1メガなので大きめにしておく
  client_max_body_size 2g;

# 接続が来た際のrootディレクトリ
  root /var/www/〇〇〇〇〇<アプリケーション名>/public;

# assetsファイル(CSSやJavaScriptのファイルなど)にアクセスが来た際に適用される設定
  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @unicorn;

  location @unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
  }

  error_page 500 502 503 504 /500.html;
}
```

3行目の<アプリケーション名> となっている箇所は、ご自身のものに変更してください。
11行目の＜Elastic IP＞となっている箇所も同様に、ご自身のものに変更してください。
14行目の<アプリケーション名> となっている箇所は、ご自身のものに変更してください。

これで設定ができます。
AtCoder キーエンス プログラミング コンテスト 2020 参戦記

# AtCoder キーエンス プログラミング コンテスト 2020 参戦記

## [A - Painting](https://atcoder.jp/contests/keyence2020/tasks/keyence2020_a)

9分半で突破. 縦、横長い方で何回塗ったら超えるか、それだけ. 最初勘違いして交互に塗っていくと思ったせいで時間がかかってしまって順位どん底に…….

```python
H = int(input())
W = int(input())
N = int(input())

t = max(H, W)
print((N + t - 1) // t)
```

## [C - Subarray Sum](https://atcoder.jp/contests/keyence2020/tasks/keyence2020_c)

13分?で突破. S を K 個、どう足しても S にならないものを N - K 個並べればいいだけ. 回答の数列の各値は 1～10<sup>9</sup> であることには注意.

```python
N, K, S = map(int, input().split())

result = [S % 10 ** 9 + 1] * N
for i in range(K):
    result[i] = S
print(*result)
```

## [B - Robot Arms](https://atcoder.jp/contests/keyence2020/tasks/keyence2020_b)

敗退.

追記: 解説を Python のコードに落として AC. 自分が書いた WA 食らったコードと違う部分は x でソートするか、x + l でソートするか、それだけだった…….

```python
N = int(input())
XL = [list(map(int, input().split())) for _ in range(N)]

t = [(x + l, x - l) for x, l in XL]
t.sort()
max_r = -float('inf')
result = 0
for i in range(N):
    r, l = t[i]
    if max_r <= l:
        result += 1
        max_r = r
print(result)
```
Testing LibraryのWhich query should I use?を訳す

#やること
このページを訳するのみ
https://testing-library.com/docs/guide-which-query

#guide-which-query?(どのクエリを使うべき？)



[鉄則](https://testing-library.com/docs/guiding-principles)は、ユーザーが使うみたいにテストするってこと。で、おすすめなのは、
###1.ユーザーが目印にするものをクエる
i. **getByLabelText**　:formのlabelがやっぱユーザーが一番目印にするもんだから、一番おすすめ。
ii. **getByPlaceholderText** : プレースフォルダーは別にlabelの代わりに使うもんじゃないけど、それしかなくて、labelも何もないなら、まぁ他のよりはマシ。
iii. **getByText** : formには使えねーけど、form以外なら一番おすすめ。ボタンとかね。一番ユーザーが見つける要素だからね。
iiii. **getByDisplayValue**: form要素の現在の値は、値が入力されたページをナビゲートするときに役立ちます。

###2. セマンティックにクエる（ユーザーにはわからんことだけどな）
i. **getByAltText** : 要素が代替テキスト（img、area、およびinput）をサポートしている場合、これを使用してその要素を見つけることができます。
ii. **getByTitle: title属性ってユーザーには見えんけどな。
iii. **getByRole** :これを使用して、ダイアログボックスやその他のキャプチャが困難な要素をより意味的な方法で選択できます。 

###3. Test ID
i. **getByTestId** : どうしょうもない時はこれ使う。

#Manual Queries（手でクエる）
querySelectorで普通にclass名とか取れっけど、ユーザーには見えないんだからあんまやんないでよ。やるならtestidね。


```
// @testing-library/react
const { container } = render(<MyComponent />)
const foo = container.querySelector('[data-foo="bar"]')
```
WordPressのメディアライブラリでサムネイルが表示されない

# 症状

- 投稿や固定ページに「この画像には alt 属性が指定されておらず、ファイル名は XXX です」が出る
- メディアライブラリでサムネイルが表示されない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/de415a25-684d-d40b-b1ae-924f34f34361.png)

# 結論

`設定→一般` からサイトのアドレス（スキーム）を確認する．httpsサイトのはずがhttpになっていた．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/c62d654f-44af-dd1b-bc8a-8883b2cf86b3.png)

# 調査

Google Chromeの開発者ツールでリクエストを確認した．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/81453c30-08f7-7f79-37e5-42705726a946.png)

301がレスポンスで返されている．リクエストURLをよく見ると `http://...` になっている．リダイレクトされて納得できる．

# 対処

`設定→一般` からサイトのアドレス（スキーム）を修正する．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/e8812f43-71bc-16ee-aadb-d7b71b3c70f2.png)
JetBrains_学習ノート_000

## 有料ソフト[JetBrains](https://www.jetbrains.com/ja-jp/)学習ノート
- 有料ソフトパック（複数の開発ツール）を注文しました。（個人年間契約）
![注文](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/710c098d-96d2-0d78-8cb2-eaee6e78b77c.png)

- 下記の開発ツール（IDE:10個）やプラグインなどの拡張（5個）がパックの中に含める
![IDE_10](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/f6e228ae-a8a5-4a20-819a-460624ca42b4.png)
![プラグイン_3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/67739d14-582c-b433-24e2-379bb428859e.png)

- なぜこのパックを購入するのは
    - Qiitaに新しい技術を勉強するノートを残る
    - 一緒に購入すればライセンスは安いです。
    - お金を使って無駄しないように学習の動力になります。
    - 今後仕事に利用する可能性もあります。
    - 個人ライセンスですが、仕事中にも使用可能です。（複数のPCやOSにも利用可能）
![license](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/f7537edf-c2c2-a5b0-3fee-54a4f854e2dd.png)
言語処理100本ノック-91:アナロジーデータの準備

[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の91本目「アナロジーデータの準備」の記録です。
今回は後のノックのための前処理系ということで技術的には超簡単です。

# 参考リンク

|リンク|備考|
|:--|:--|
|[091.アナロジーデータの準備.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/10.%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E7%A9%BA%E9%96%93%E6%B3%95%20(II)/091.%E3%82%A2%E3%83%8A%E3%83%AD%E3%82%B8%E3%83%BC%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E6%BA%96%E5%82%99.ipynb)|回答プログラムのGitHubリンク|
|[素人の言語処理100本ノック:91](https://qiita.com/segavvy/items/be511b97bf3be49974a3)|言語処理100本ノックで常にお世話になっています|

# 環境

|種類|バージョン|内容|
|:--|:--|:--|
|OS|Ubuntu18.04.01 LTS|仮想で動かしています|
|pyenv|1.2.15|複数Python環境を使うことがあるのでpyenv使っています|
|Python|3.6.9|pyenv上でpython3.6.9を使っています<br>3.7や3.8系を使っていないことに深い理由はありません<br>パッケージはvenvを使って管理しています|

# 課題
## [第10章: ベクトル空間法 (II)](http://www.cl.ecei.tohoku.ac.jp/nlp100/#ch10)
> 第10章では，前章に引き続き単語ベクトルの学習に取り組む．

### 91. アナロジーデータの準備
> [単語アナロジーの評価データ](https://github.com/svn2github/word2vec/blob/master/questions-words.txt)をダウンロードせよ．このデータ中で": "で始まる行はセクション名を表す．例えば，": capital-common-countries"という行は，"capital-common-countries"というセクションの開始を表している．ダウンロードした評価データの中で，"family"というセクションに含まれる評価事例を抜き出してファイルに保存せよ．

※[単語アナロジーの評価データ](https://github.com/svn2github/word2vec/blob/master/questions-words.txt)の[オリジナルのリンク](https://code.google.com/p/word2vec/)は、リンク切れなのでここでは変えています。

### 課題補足
「アナロジーデータ」とは類推のためのデータのようです。
下記に先頭10行を出しています。`: capital-common-countries`のように先頭にコロンがあるとブロックを意味していて、その後に`Athens Greece Baghdad Iraq`と首都と国の関係が2セット1行に並びます。
このようにブロックとその後に数十行何らかの関係性が2セット1行で並ぶデータです。今回は、このデータからfamilyブロックのコンテンツを抜き出します。

```questions-words.txt
: capital-common-countries
Athens Greece Baghdad Iraq
Athens Greece Bangkok Thailand
Athens Greece Beijing China
Athens Greece Berlin Germany
Athens Greece Bern Switzerland
Athens Greece Cairo Egypt
Athens Greece Canberra Australia
Athens Greece Hanoi Vietnam
Athens Greece Havana Cuba
```

# 回答
## 回答プログラム [091.アナロジーデータの準備.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/10.%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E7%A9%BA%E9%96%93%E6%B3%95%20(II)/091.%E3%82%A2%E3%83%8A%E3%83%AD%E3%82%B8%E3%83%BC%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E6%BA%96%E5%82%99.ipynb)

```python
with open('./questions-words.txt') as file_in, \
       open('./091.analogy_family.txt', 'w') as file_out:

    target = False      # 対象のデータ
    for line in file_in:

        if target:

            # 対象データの場合は別のセクションになるまで出力
            if line.startswith(': '):
                break
            print(line.strip(), file=file_out)

        elif line.startswith(': family'):

            # 対象データ発見
            target = True
```

## 回答解説
正直、技術的に特別なことをしていないので解説する点がないです。強いて言うならば9割以上が[素人の言語処理100本ノック:91](https://qiita.com/segavvy/items/be511b97bf3be49974a3)のコピペということぐらいです。
結果のテキストの先頭10行は以下の通りです。

```091.analogy_family.txt
boy girl brother sister
boy girl brothers sisters
boy girl dad mom
boy girl father mother
boy girl grandfather grandmother
boy girl grandpa grandma
boy girl grandson granddaughter
boy girl groom bride
boy girl he she
boy girl his her
以後略
```
PHPで文字を画像にするやつ

ちょっと、そういうのが必要になったので。（WEBGLで日本語フォントが通らないとか・・・）

`im.php?str=こんにちは,世界`にアクセスすると、カンマ区切りで改行して、こんな画像を生成します。

<img width="319" alt="スクリーンショット 2020-01-18 22.46.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33389/d0814a8c-35f7-c7e9-4212-0b2245ad1281.png">


```php
<?php
if( isset($_GET["str"]) ){
    $points = explode(",",$_GET["str"]);
}else{
    $str = ["Hello","World"];
}

$im = imagecreatetruecolor(400,600);
imagefilledrectangle($im, 0, 0, 599, 399, 0x101010);
$font = '/font/NotoSansCJKjp-Regular.otf';
$y = 30;
foreach($points as $point){
    imagettftext($im, 20, 0, 0, $y, 0xffffff, $font, $point);
    $y = $y + 30;
}
header('Content-Type: image/png;');
imagepng($im);
imagedestroy($im);
```
AtomのMarkdownプレビューのStyleSheetをGitHub+αにする

# 概要
## はじめに
テキストエディタであるAtomでMarkdown記法を使う際のプレビューをGitHub Styleを適用しつつ少し見やすさを改善しました。
（自分好みにいじったので備忘録として残します）

## このページの手順で最終的にできるプレビュー
<img width="1114" alt="07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273970/f1a8cccd-5e61-260f-0b10-bf8ecf02f650.png">

## Atom Theme
UI Theme/Syntax ThemaともにAtom Darkです。

<img width="618" alt="01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273970/b899d787-f862-13d5-009e-991e68e1bc57.png">



# AtomでMarkdown記法を使うためのパッケージを導入する
## 参考サイト
導入するパッケージは下記のサイトを参考にさせて頂きました。
[「Atom をMarkdownエディタとして整備」](https://qiita.com/kouichi-c-nakamura/items/5b04fb1a127aac8ba3b0)

## パッケージの導入
- markdown-writer
- markdown-scroll-sync
- tool-bar
- tool-bar-markdown-writer
- markdown-toc
- markdown-mindmap
- wordcount

# Markdown記法のプレビュー表示をGitHub風にする
## 例文

```markdown_test.txt
# aaa
## bbb
- 1
- 2
- 3

### ccc
#### ddd

1 |2  |3
--|---|--
a |b  |c
d |e  |f
g |h  |i

## eee
```sql
SELECT
  column_1,
  column_2
FROM table
```　


```



## プレビューショートカット
control + shift + mでプレビュー表示できます。

## 初期設定プレビュー

<img width="1129" alt="02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273970/6d04294a-9aa1-5e88-60a9-2bedac4836be.png">

## GitHub Styleの導入
### 設定

パッケージ > Markdown Preview >Toggle GitHub Style

<img width="489" alt="03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273970/e91bebc5-b3d1-3546-a7ae-122a89da4c84.png">

### GitHub Styleプレビュー

<img width="1122" alt="04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273970/5b83d949-2c7c-8026-5a85-ac5714c89c0e.png">


# StyleSheetをいじってもう少し見やすくする
## StyleSheetを開く
Atom > スタイルシート

<img width="231" alt="05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273970/808e4930-7802-f6da-c218-89edfd6eef5b.png">

## Styles.lessの編集

※追記部分のみ

```Styles.less
.markdown-preview {
  background: white !important;
  color: #192F60;
  p, h1, h2, h3, h4, h5, h6, li, th, td, strong {
    color: #192F60 !important;
  }
  h1 {border-bottom: solid 3px #E6E6E6; padding: 3px;}
  h2 {border-bottom: solid 2px #E6E6E6; padding: 3px;}
  h3 {border-left: solid 2px #E6E6E6; padding-left: 12px;}
}
```

<img width="1124" alt="06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273970/00858b75-acd8-7a08-94d9-7ee067f0be01.png">

# 終わりに
いかがでしたでしょうか。
みなさんもこのページを参考に自分好みのStyleSheetに編集して頂ければ幸いです。
Goclipse "could not start goclipse because java version is 0"

#はじめに
Goclipseの設定でハマったので記録を残しておきます。

# 動作確認環境
OS:
macOS Mojave Version 10.14.6 (18G84)

STS:
Spring Tool Suite 4 
Version: 4.5.0.RELEASE
Build Id: 201912171052


#1. 余計なファイルを削除
https://github.com/GoClipse/goclipse/issues/256
にWorkaroundが記載されていたので、やってみた所、プラグインが起動するようになりました。
>Note that the error message is not true, Goclipse does start successfully despite what the message says, so you can just keep using it. As a workaround, locate the plugins directory in the Eclipse installation, and delete the com.googlecode.goclipse.jvmcheck_1.0.0.v201607061938.jar file, this will prevent the error message from being shown.

STSを使っていたので、以下のPATHにありました。
/Applications/SpringToolSuite4.app/Contents/Eclipse/plugins/com.googlecode.goclipse.jvmcheck_1.0.0.v201607061938.jar

でも、使用感がイマイチだったので結局Goclipse自体を使うのは断念しました。。。

参考URL:
https://github.com/GoClipse/goclipse/issues/256
AllocHGlobal と AllocCoTaskMem で迷ったら、やっぱり AllocCoTaskMem を使え！

## はじめに

.NET のアンマネージドメモリの処理速度 について調べていたところ、以下の記事を見つけました。



[AllocHGlobalとAllocCoTaskMem　どちらを使うべきか？](https://qiita.com/Nuits/items/9dc67cb12e2dcf8d09bd)



私はこの記事に出会うまで **AllocCoTaskMem** の存在を知らなかったので、何も考えず **AllocHGlobal**  を使ってきたのですが、記事を読んだところ以下の結論になっていました。



> 「パフォーマンス的に多少の前後はあるが、AllocHGlobalとAllocCoTaskMemに大きな違いはあまりない。
> LocalAllocは互換性維持のために残されていることから、特別な理由がない限り、AllocCoTaskMemを利用したほうが好ましい。」



そ、そんな…　今日まで AllocHGlobal を使ってきたのに…　きっと **AllocHGlobal**  にも良いところがあるはずだ！



[@Nuits](https://qiita.com/Nuits) さんの処理速度ベンチマークでは 0.1msecオーダーで ぴったり同じ結果になっているが、usecオーダーなら **AllocHGlobal**  の方が高速なはずだ！　頼むから何か取り柄があってくれ！！



ってことで BenchmarkDotNet を使って、処理時間を計測しました。



## 測定方法

[@Nuits](https://qiita.com/Nuits) さんの計測で 100Byte だったメモリを10MByte に拡張してみました。

``` C#
public class AllocateMemory
{
    private const int AllocSize = 10 * 1024 * 1024;

    [Benchmark]
    public void AllocHGlobal()
    {
        IntPtr intPtr = Marshal.AllocHGlobal(AllocSize);
        Marshal.FreeHGlobal(intPtr);
    }

    [Benchmark]
    public void AllocCoTaskMem()
    {
        IntPtr intPtr = Marshal.AllocCoTaskMem(AllocSize);
        Marshal.FreeCoTaskMem(intPtr);
    }
}
```



## 測定結果

| Method         |     Mean |    Error |  StdDev |
| -------------- | -------: | -------: | ------: |
| AllocHGlobal   | 182.2 us | 56.12 us | 3.08 us |
| AllocCoTaskMem | 179.4 us | 21.47 us | 1.18 us |

元記事の通り大差はありませんでしたが、僅かに(1.5%) **AllocCoTaskMem** の方が高速でした。

互換性 だけでなく、処理速度の観点からも **AllocCoTaskMem** が優れていますので、**AllocHGlobal** の使用は今すぐ辞めましょう。

なんでこれまで AllocHGlobal を使ってたんだろうか。がっくり来ました。
hugo: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by hugo)が出た場合の原因と対策


# 特定の環境下で下記のエラーが出たときの原因

```
hugo: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by hugo)
```

## 環境

- Hugo Extend version 0.62.0
- debian:jessie

## 原因

debian:jessieのlibstdcではGLIBCXX_3.4.21が見つからないため

## 対策

debian:stretchを使う
failed to transform resource: TOCSS: failed to transform "scss/style.scss" (text/x-scss): this feature is not available in your current Hugo versionが出たときの対応

# Hugoにて下記のエラーが出たときの対応

```
Building sites … ERROR 2020/01/18 11:43:24 error: failed to transform resource: TOCSS: failed to transform "scss/style.scss" (text/x-scss): this feature is not available in your current Hugo version, see https://goo.gl/YMrWcn for more information
```

## 原因

Hugoのthemeにてscssを使用しています。
その場合は、HugoではなくHugo Extendを使用する必要があります。

## 対策

下記のようなHugo_extendedバージョンをインストールして使用しましょう。
hugo_extended_XXXXX_Linux-64bit
※ XXXXXはバージョン

みなさんのお役に立てたら、是非この記事にいいねを教えてください。
今後の記事作成のモチベーションに繋がります！
CodeIgniterでPOSTをするときのセキュリティ対策（特にAjax）について

#はじめに
POSTからデータベースを操作する動作は動的サイトやWebアプリを使うときには頻出する動作だと思います。しかし、第三者がこんなコードを作れば簡単にWebを改ざんできてしまいます。これを、<b>クロスサイトリクエストフォージェリ（CSRF) </B>と言います。

```html
<form action="hogehoge/delete" method="post">
<input type="hidden" name="id" value="2">
<input type="submit">
</form>
```

主たるPHPフレームワークにはCSRF対策があってCodeigniterでも実装されています。[公式のドキュメント](https://codeigniter.jp/user_guide/3/libraries/security.html)を見ればハッキリ書いてあるのですが、<I>application/config/config.php ファイル</I>の設定にある$config['csrf_protection'] をTrueをすれば、フォームヘルパー<B>だけ</b>を使っているならそのまま対応できるのですが、私のようにAjaxを多用してると、2～3時間で済むつもりが一日潰して対策に追われて、仕事ならまだしも趣味のプログラミングなら、休みが潰れた徒労感だけが残りますので、<b>できるだけ設計段階で気がついて対策をすることを強くお勧めします。</b>

# AjaxでCSRF対策するためのコード
フォームヘルパーなら勝手に挿入されるのですが、ajaxならかならず以下のようなコードを埋め込む必要があります。


```php:コントローラー側
$csrf = array(
        'name' => $this->security->get_csrf_token_name(),
        'hash' => $this->security->get_csrf_hash()
);
```



```php:ビュー側
<input type="hidden" id="token" name="<?=$csrf['name'];?>" value="<?=$csrf['hash'];?>" />
```

configでホワイトリストに入れない限り<B>全て</b>のPOSTが絡むajaxに上のトークンの情報を入れてやらないと基本的には動きません。設計から考えておかないと殆どマイページにPOSTが絡むajaxがあると書き換えとデバッグで大変な目に遭います。（私の場合もともと書き方が悪いので作り直したかったJSを書き替えたという事情もありましたが、なぜか動かないと堂々巡りに…。）

ajaxのコードとは普段と違ってこういう風に書いてやります。

```Javascript

function ajax_post(elm,flg_delete){
    var csrf_hash = $("#token").val();
    var csrf_name = $("#token").attr('name');
    var postdata = {
        id : {{profile.id}},
    };//←普通のデータのように書く
    postdata[csrf_name] = csrf_hash;//トークンを入れる

    $.ajax({
        url : elm,
        type: 'POST',
        data: postdata
    })
    .done(function(data) {
        alert('OK');
    }).fail(function(data) {
        alert('NG');
    });
});
```

## application/config/config.php ファイルの設定について

先ほどの設定の下の所に
$config['csrf_regenerate']
というのがありますが、これはTRUEがデフォルトです。これは何かと言えば、トークンが一回使い切りという設定です。全てのPOST絡みの動作がページ変移だけならそれで問題ありませんが、Ajaxでは毎回再読込でもする設定にしないと<u>2回目以降の動作ができなくなります。</u>Ajaxを使うときにはOFFにすることをおすすめします。

## 受け手のコントローラについて

受け側のコントローラはこういう風に作ります。


```
public function test(){
    if ( $this->input->method(TRUE) !== 'POST' ){
        show_404();
    }
    
    $res = $this->input->post('request');   
        echo $res;
    }

```

これを参考に<B>設計段階からやるか数カ所程度</B>なら簡単に対策ができるはずです。


# まとめ
もう二度と私のような目にあう人が居なくなるように。より安全で堅牢なWeb開発を。

##参考
http://web-plusplus.net/codeigniter3-csrf/ - CodeIgniter3でCSRF対策機能をONにしたらAjaxでPOSTできなかった件
[Docker知識不要]Docker上でのHugo Extend環境の作り方

# Docker上でのHugo Extend環境の作り方

こんにちは、ITエンジニアの田中です！
この記事を読むと下記の事ができるようになります。

- Docker上でHugo環境を作れる。
- Docker上のHugoのコンテナに入り新規記事を作る事ができる。
- Docker上のHugoの簡易サーバーを動かしホストOSのブラウザから閲覧できる。

下記のことが事前に完了していることが前提です。

- Dockerがインストールされている
- ホストOSでgitが使用できる

## 私の最初の失敗

Docker Hubにある下記のイメージを使用してHugo環境を作成しようとしました。
publysher/hugo

しかし、起動に失敗。理由は多分事前にHugoのコンテンツがなかったことが原因です。
事前に環境がないから作りたいと思っていていたのでハードルが高い。。。。
もっと簡単に作りたい。そして、ローカル環境にgo開発環境を作らないで、かつあたかもローカルで記事を書いたりしたいと思っていました。

事前知識もなくHugo環境をdockerで作れる！方法を見つけたので共有します。

## フォルダ構成

docker-compose用の任意箇所にフォルダを作ってください。
フォルダ名をhugoとします。

hugoフォルダ配下に下記のファイルを作成します。
- DockerFile
- docker-compose.yml

## Dockerfile内容

下記のDockerfileを作成します。

```
FROM debian:stretch
LABEL maintainer "you1978 <you1978@hotmail.com>"

# Install pygments (for syntax highlighting) 
RUN apt-get -qq update \
	&& DEBIAN_FRONTEND=noninteractive apt-get -qq install -y --no-install-recommends python-pygments git ca-certificates asciidoc \
	&& rm -rf /var/lib/apt/lists/*

# Download and install hugo
ENV HUGO_VERSION 0.69.2
ENV HUGO_BINARY hugo_extended_${HUGO_VERSION}_Linux-64bit.deb

ADD https://github.com/spf13/hugo/releases/download/v${HUGO_VERSION}/${HUGO_BINARY} /tmp/hugo.deb
RUN dpkg -i /tmp/hugo.deb \
	&& rm /tmp/hugo.deb

# Create working directory
RUN mkdir /usr/share/blog
WORKDIR /usr/share/blog

# Expose default hugo port
EXPOSE 1313

# Automatically build site
ONBUILD ADD site/ /usr/share/blog
ONBUILD RUN hugo -d /usr/share/nginx/html/

# By default, serve site
ENV HUGO_BASE_URL http://localhost:1313
CMD hugo server -b ${HUGO_BASE_URL} --bind=0.0.0.0
```

## docker-compose.yml

下記のdocker-compose.ymlファイルを作成します。

```
version: '3'
services:
  web:
    build: .
    image: my/hugo
    volumes:
      - ./site:/usr/share/blog
    ports:
      - "1313:1313"
    stdin_open: true
    tty: true
```

## Hugoの新規サイトを作成する

ターミナルにて、Hugoフォルダに移動して、下記のコマンドを実行する。

```
> docker-compose run -w /usr/share web hugo new site blog 
```

実行するとHugoフォルダ直下siteというフォルダが作成されています。

## Hugoのテーマを適用する

下記のコマンドを使用して
ホストOS上でsiteの下のthemeフォルダに移動します。
今回はanankeというテーマを例として使用します。

```
> cd themes
> git clone https://github.com/budparr/gohugo-theme-ananke.git
```

下記のファイルを移動させてください.

移動元
 site/themes/gohugo-theme-ananke/exampleSite/config.toml

移動先
 site/config.toml

config.tomlを開いて、下記の行をコメントアウトしてください。

```
 # themesDir = "../.."
```

## Hugoイメージの構築

下記のコマンドを実行しHugoイメージを構築します。

```
docker-compose build
```

## Hugoの起動

下記のコマンドを実行しサイト

```
docker-compose up -d
```

## サイトにアクセスする

ブラウズを開いて、下記のURLをアドレスバーに入れてください。

```
http://localhost:1313/
```

下記の画面が表示されたら成功です。
![page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282387/c4f56a9d-8818-b2ea-548d-caff5a2def87.png)

## 新しいページを作成する

下記のコマンドを実行すると新しいページが作成されます。

```
docker-compose run web hugo new post/page2.md
```

下記のファイルを編集するとサイトも更新されます。
hugo/site/content/page2.md

大きく変更するとサイトが更新されない時があります。
その場合は、コンテイナを再起動してください

```
docker-compose down
docker-compose up
```

以上、[Docker知識不要]Docker上でのHugo環境の作り方でした。
コメントお待ちしています。
開発規模とプログラム言語

#結論から言いますと

```
<-小規模向き                                                                大規模向き->
シェル       Ruby       C           C++                  Java                         F#
             PHP      Lua        Python                  C#                      Haskell
     VBA       Javascript              VB                Swift             
```

基本的にスクリプト言語は小規模開発が向いている模様です。Cはマクロや変数の副作用に怯えていかなくてはならないことやオブジェクト指向や関数型に対応していない(できた当初は大規模開発向けだった)ためであります。中規模開発向けとしてC++,Python,VB等あります。C++はどうしても大きなプロジェクトになればなるほど可読性や型つけの弱さの問題が出るため組み込み以外原則的に中規模開発が向いている模様。Pythonはスクリプト言語でありながらC++の力を借りてオブジェクト指向で大規模で繊細なグラフィカルユーザインタフェースのデスクトップアプリケーションや画像処理アプリケーションを作ることができる言語です。VB.netはこれまたデスクトップアプリケーションを作ることができる言語ですが、C言語系と書式が大きく異なるので困惑することでしょう。構造化プログラミングで書くことは得意ですが、オブジェクト指向や型つけが弱い気がします。次に大規模開発としてJava,C#,Swift,F#を挙げます。これらは大規模プログラムにおいて重要となる、文法の統一感があります。JavaやC#やSwiftはオブジェクト指向。F#は関数型です。大体どれも何でもできるのですがC#とF#はWindows、SwiftはMac、Javaはクロスプラットフォームという違いがあります。F#は小さなプログラムからとても大きなプログラムまで作ることができます。詳しくは[以前話したので](https://qiita.com/kawaguchi5460/items/1a7742aab0c74720fb75#comment-97a00841b899d08b49eb)それを見て頂ければありがたいです。
JSDoc Getting Started

JSDoc is auto JavaScript document tools.  
[Doc](https://jsdoc.app/about-getting-started.html)


# Install


```
npm install -g jsdoc
```

# Create file
```
touch a.js
```

```javascript:a.js
/**
 * Function to add two numbers
 * @param {number} a
 * @param {number} b
 */
function sum(a, b) {
    return a + b;
}
/**
 * Function to subtract two numbers
 * @param {number} a
 * @param {number} b
 */
function diff(a, b) {
    return a - b;
}
```

# Create Document
```
jsdoc a.js
```

Now document is created.

# Check created file

```
npm install -g http-server
http-server out/
```

Now, you can see page like this.  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200431/44748c06-b517-ac0b-e8cc-74cafe268895.png)
Visual Studio 2019 を使って Azure Stack Hub に Web App をデプロイする

## はじめに

Azure Stack Hub の App Service に対してアプリケーションをデプロイする方法や手順を纏めていきます。

※App Service それ自身のインストールではありません。App Service がインストールされている事を前提として、その上で動かすアプリケーションのデプロイ方法です。

まず最初は、Visual Studio を使って Web App をデプロイする方法を紹介します。
基本的に Azure にデプロイする場合と変わりありません。


## 環境

- Azure Stack Hub Integrated System 1907
- App Service 84.0.2.10
- Visual Studio 2019 Version 16.8.1


現時点で以下のランタイムが対応しています。
詳細は [リリースノート](https://docs.microsoft.com/ja-jp/azure-stack/operator/azure-stack-app-service-release-notes-update-seven?view=azs-1910) を参照してください。

- .NET Framework (3.5/4.7)
- .NET Core (2.0/2.1/2.2.4)
- Java
- PHP


ここでは .NET Framework 4.7 を使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/892914f3-63d0-8dc1-4e9d-79a111d8928a.png)


また、Visual Studio は 2019 を使用しますが、2017 でも可能だと思います。2013 + Azure Tools では Azure Stack Hub のサブスクリプションを認識しませんでした。


## 手順

Azure にデプロイする場合と同様に、ソリューションエクスプローラーから発行するプロジェクトを右クリックし、「発行」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/93cd5521-bf54-9433-1b70-67fc4e9caf0e.png)


ターゲットに「Azure]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/b44c429d-0e1d-6b16-03a5-e0aa153016b5.png)

特定のターゲットでは「Azure App Service (Windows)」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/e8ae6178-3ce9-f534-3132-d71d95f5e019.png)

.NET Core アプリケーションの場合は「Azure App Service (Linux)」も選択肢に登場しますが、Windows を選択してください。Azure Stack Hub の App Service は Linux に対応していません。


Azure Stack Hub のアカウントでサインインすると、サブスクリプションが選択可能になります。
選択したサブスクリプション配下にある Web App がリストアップされるので、デプロイ先を選択して「完了」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/452e8d1a-9d79-12ff-458a-0d9c0ab27e5f.png)


作成したプロファイルを選択して「発行」をクリックすればデプロイされ、Web App での動作が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/704b2a26-e6c0-db6c-91bd-4ff81a78ad65.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/1ad298dd-67a2-cf96-dfbb-c7fc7720a1c6.png)




### Web App を新規作成する場合

Visual Studio 2019 上で Web App を作成してデプロイする事も可能です。
「App Service インスタンス」で「＋」をクリックすると新規作成画面が開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/a2735ae7-aa08-f30c-632a-db550443f150.png)

それぞれの項目を入力します。リソースグループや App Service Plan を作成する事も可能です。
「作成」をクリックすると Web App が作られ、選択可能になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/4364767f-f34e-1005-ac98-6de435499f53.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/d7de77ed-c4bd-ebc5-eb91-5a17b2e7d20f.png)

後は同様に、Web App を選択して発行プロファイルを作成します。



## おわりに

Visual Studio を使って Azure Stack Hub の Web App にアプリケーションをデプロイする方法を紹介しました。
Azure Stack Hub のサブスクリプションでサインインする以外は Azure でのそれと全く同じ様にデプロイする事が出来ます。

Azure Stack Hub の特徴の一つである「Azure との開発一貫性」が体感出来る一つの例だと思います。




## 参考

- [Visual Studio で Azure に Web アプリを発行する - Microsoft Lean](https://docs.microsoft.com/ja-jp/learn/modules/publish-azure-web-app-with-visual-studio/)
Angular スターターキットを作った

# 目的

Angularの開発経験がない人向けのサンプルコードを作る必要があったため作成した。

公式のチュートリアルもあるのだが、根本からちゃんと理解させるために書かれているので、結構回りくどくて必要最低限のところにたどり着くまで時間が掛かってしまう。

今回は細かいことは良いから、基本的な画面が動けば良し、という人向けのコードを作った。
このコードを真似しながら初心者でも自分で機能を追加できるようになるのが理想。

# 構成

## Frontend
* Angular
 * https://angular.jp/
* Angular Material
 * https://material.angular.io/ 

## Backend
* Django
 * https://www.djangoproject.com/
* Django Restframework
 * https://www.django-rest-framework.org/

# コード

## Angular Sample
* https://github.com/shinno21/sk-app

## Django Restframework Sample
* https://github.com/shinno21/drf_sample

# 注意

* これから少しずつ改善させていくが、まだ簡単なデータ検索画面が１つあるだけ。

# 今後の予定

* コードのコメントやReadmeを充実させて、初心者が機能追加・改修をし易くする
* データ登録画面を開発する
* データ検索画面を Angular Material のコンポーネントを使いリッチにする
* etc...
MariaDBのクライアント用にHeidiSQLを入れてみた

# 経緯 
自宅PCにDBを直接インストールしたくないので、xamppのMySQL（MariaDB）を使っている。
以前、仕事でMySQL Workbenchを使っていたので、インストールしてMySQLにログインしようとしたらエラーになった。

```:wb.log
21:10:15 [ERR][      WBContext]: Unsupported server version: mariadb.org binary distribution 10.4.8-MariaDB
```

Workbenchのログを見てみると使っているMariaDBのバージョンがサポート対象外らしい。
使ったことのある [A5:SQL Mk-2](https://a5m2.mmatsubara.com/) でも良かったのだがせっかくなので別のものにしようと思い、`HeidiSQL`を入れることにした。

# 検証環境
* Windows10 Home
* XAMPP 7.3.11
* MariaDB 10.4.8
* MySQL Workbench 8.0.19
* HeidiSQL 10.3.0.5771

# インストーラの取得
以下が公式ページ。
[HeidiSQL - MariaDB, MySQL, MSSQL and PostgreSQL made easy](https://www.heidisql.com/)

ヘッダの「Downloads」から「Installer」をクリック。
インストーラがダウンロードされる。
<img width="1023" alt="heidi_top.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298626/2ab3288b-7f82-89ac-fb55-f35def4fdf7a.png">

# インストール
ダウンロードしたインストーラを実行する。

「同意する」を選択して「次へ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298626/33fa24f2-88d4-ad49-0e6f-7aabf8d481cc.png)

デフォルトのまま「次へ」 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298626/2ae376e2-170a-c504-52f5-2a618be5c22b.png)

デフォルトのまま「次へ」 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298626/8ddb0603-989f-dc68-9324-60fedccdffd6.png)

ここもデフォルトのまま「次へ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298626/dd2a62fb-04fa-70c6-5497-ce87d736f788.png)

「インストール」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298626/b6bd5ff9-dfef-bd3b-568b-5cc7e9f4f29c.png)

インストールはすぐ終わる。「完了」を押下して終了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298626/623f5cab-fceb-6727-3472-41ad040a32dc.png)

# 接続
上記の手順だとHeidiSQLが起動されるので下記画面になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298626/438c230e-5fb5-3796-70bd-3b51a33bf77e.png)

今回はxamppのMariaDBに接続するのでホスト名は「127.0.0.1」のままでOK。
デフォルトのままだと、ユーザ名は「root」、パスワードなし（だった気がする）なので、他の項目も変えず「開く」。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298626/9af4bd10-9ec6-a1bf-b5ae-15c3abd1fbb3.png)
接続できた。
積分画像の4点へのメモリアクセスを並列化可能にするキヤノンの特許を解説

# 概要

- 積分画像を用いた画像矩形領域の輝度値の和の計算方法について、計算のために必要な4画素の読み出しを高速に行うキヤノンの特許がある。
- 昔読んで感動したのだが最近ふと思い出して探したら見つかったので解説する。
- リンク: [JP5963566B2](https://patents.google.com/patent/JP5963566B2/ja) "パターン識別装置", キヤノン株式会社

# 内容

## 積分画像とは

画像の中の画像軸に平行な任意の矩形領域の輝度値の和を高速に計算する方法。

計算に用いるのが積分画像で、この画像の各ピクセルは自分よりも左上に位置する元画像のピクセル値の和を保持する。
<img width="470" alt="IntegralImage.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13171/6554c543-3445-cb22-3d36-61aca2586cb6.png">
(図は[1] より)

元画像におけるDの領域の輝度値の和を求めたいとする。 積分画像を使えば、これは4点の画素値から計算できる。積分画像における点$1, 2, 3, 4$の輝度値$i(1), i(2), i(3), i(4)$を使って$i(4) - i(2) - i(3) + i(1)$である。領域A+B+C+D($i(4)$)からA+B($i(2)$), A+C($i(3)$)を引いて、引きすぎたA($i(1)$)を足している。

Haar-like特徴で色々な矩形領域の輝度値の和を計算するので、この方法で高速化できた。局所特徴のHoG(Historam of Gradient)特徴ではこれが拡張されて矩形領域のヒストグラムを積分画像ライクに計算するIntegral Histogram[2] などが提案された。



## JP5963566B2 ... 4画素読み出しの並列化

積分画像を使って和の計算は高速化される。これ以上の高速化のためには、4つの画素値へのメモリアクセスがボトルネックになる可能性がある(らしい)。高速化の一案として、同じ積分画像を4つ保持し、左上、右上、左下、右下で異なるメモリを参照すればそれぞれのアクセスを並列に実行することができる。しかし、このためにはメモリが４倍必要になる。

特許JP5963566B2はこの課題を解決するもので、メモリの総量を増やすことなく、メモリアクセスを並列化できる。具体的には、ある法則にしたがって画像領域を複数の記憶領域に振り分ける。

特許的には、以下の文言がこの特許を特徴付けている。

"複数の処理対象領域が所定の次元の入力データの各次元方向毎に**定められた間隔**で配置され、各処理対象領域から所定のパターンを識別するパターン識別装置において、所定の次元のデータの入力手段と、
前記入力手段によって得られた入力データを保持するため次元毎に割り当てられた**個数の積**で構成される複数の記憶手段と、
...
前記各次元方向について**定められた間隔**と対応する前記記憶手段の**個数**との組の内、**少なくとも１組が互いに素の関係にある**ことを特徴とする。"



## 提案手法

"次に累積画像情報をメモリに分配する方法と並列読み出しの原理について説明する。〜"以降に記載されているのが提案手法によるメモリの分配方法。

メモリ分配の方法を説明すると、ある数$P1, P2$を定めて、座標値$(x, y)$を$P1, P2$で割った際の**剰余**によってピクセル値を分配(インターリーブ)していく。矩形領域の幅・高さ(ストライド)はそれぞれ$P1, P2$と**互いに素な数**で設定する。これだけである。これだけでメモリ総量一定のまま分配できて、4点のメモリアクセスは互いに異なるメモリを参照し、並列化される。

輝度値が分配される先のメモリを$M_{p_1, p_2}$で表すと、以下のようになる。
$$
p1 = x ％ P1
$$

$$
p2 = y ％ p2
$$

ただし％は剰余を表す。



これは、ある数$x_1$に対し$P$と互いに素などんな数$S$を足してもその数$x_2=x_1+S$の$P$による剰余($x_2 ％P$)は元の数の$P$による剰余($x_1％P$)と一致しないという性質を利用している。簡単な数学的性質と思うが自分にはこれ以上うまく説明できない。

例えば$P=5, S=4$とする。$x_1 = 1, 2, 3, 4, 5,  ... $に対し $x_2 = x_1 + S = 5, 6, 7, 8, 9...$であり、剰余はそれぞれ$x_1％5 = 1, 2, 3, 4, 0$と$x_2％5 = 0, 1, 2, 3, 4, ...$であり、両者はずっと一致しない。

**互いに素である**、というのが重要で、いろんな設定の仕方があること、また行方向または列方向、または両方に対して分配を設定しても良いことが本文"また、ここではストライドS1=4、メモリの個数〜"以降に書かれている。

剰余のようなシンプルな概念を使って並列化という目的を達成しているのが素晴らしいと思う。この考え方、他に活用できないかと最近思案している。

## 参考文献

- [1] Viola, Paul, and Michael Jones. "Rapid object detection using a boosted cascade of simple features." *CVPR (1)* 1.511-518 (2001): 3.
- [2] Porikli, Fatih. "Integral histogram: A fast way to extract histograms in cartesian spaces." 2005 IEEE Computer Society Conference on Computer Vision and Pattern Recognition (CVPR'05). Vol. 1. IEEE, 2005.
ActiveRecord::AdapterNotSpecified: 'production' database is not configured. が表示された場合

アセットコンパイル時に下記を実行するが


```:ターミナル（EC2)
[ec2-user@ip-172-31-23-189 <アプリ名>]$ rails assets:precompile RAILS_ENV=production
```

この際にエラーが表示される場合がある。

#### エラーが出る場合

```
ActiveRecord::AdapterNotSpecified: 'production' database is not configured. Available: ["default", "development", "test", "database", "username", "password", "socket"]
```

下記を修正してください
database.yamlに『　<<: *default　』を追記する
（もともとあるが、いらないだろうと思い消してしまうとエラーが表示される）

```ruby:config/database.yml
production:
  <<: *default　# ここが抜けているはず
  database: <%= Rails.application.credentials.db[:database] %>
  username: <%= Rails.application.credentials.db[:username] %>
  password: <%= Rails.application.credentials.db[:password] %>
  socket: <%= Rails.application.credentials.db[:socket] %>
```
追記したらpullして更新しましょう

```:ターミナル（EC2)
[ec2-user@ip-172-31-23-189 <アプリ名>] git pull origin master
```

再度

```:ターミナル（EC2)
[ec2-user@ip-172-31-23-189 <アプリ名>]$ rails assets:precompile RAILS_ENV=production
```

今度は成功するはずです
git command

ファイルを作って
mkdir

リポジトリを作って
git init

リポジトリをURLと紐づけて
git remote add origin <url>

コミットして
git commit -m "message"

プッシュすると
git push origin master

git最新版を作業ブランチにマージ
git checkout master
git pull origin master
git checkout test
git merge master
git push origin test

特定ファイルのみマージ
git checkout \<ブランチ名\> -- \<ファイル名\>

git add 取り消し
git reset HEAD

git commit 取り消し
git reset --soft HEAD^

リモートから最新版をローカルにpullする
git pull origin master

＊使用注意＊
push削除
// 直前のコミットを取り消す
git reset --hard HEAD^
// 強制的にPushする
git push -f origin master

ブランチ削除
リモート
git push origin --delete fix/authentication

ローカル
git branch -d fix/authentication

ブランチ一覧同期
git fetch -p
【ふくだ学習録】CakePHP3入門 part1【10日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

### 読了した本
[データベースエンジニア養成読本 [DBを自由自在に活用するための知識とノウハウ満載!]](https://www.amazon.co.jp/dp/4774158062/ref=cm_sw_r_tw_dp_U_x_FPphEbQFPPQRM )
[ゼロから作るDeepLearning](https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_r_tw_dp_U_x_y3UiEbF3P6EG7)

# CakePHP3入門を読んで

### CakePHPの基本構成

**「bin」フォルダ**
cakeコマンドのプログラムが収録されている。

**「config」フォルダ**
CakePHPで利用されている各種設定情報を保管する場所。
ここにあるファイル類を書き換えて設定をしていく。

**「loogs」フォルダ**
ログファイルを保存するための場所。

**「plugins」フォルダ**
機能追加するためのプラグインファイルを格納する場所。

**「src」フォルダ**
メインのソースコードを配置する場所。

**「tests」フォルダ**
テストに関するフレームワークを追加する場所。

**「tmp」フォルダ**
テンポラリーフォルダ。プログラム実行中に作成される一時ファイルの保存場所。

**「vebder」フォルダ**
ソフトウェアベンダーが用意するライブラリプログラムが保存されている場所。
つまりCakePHP本体のソースコードが格納されている。

**「webroot」フォルダ**
CakePHPでWebアプリケーションを作成した場合のルートになる。
使用する画像やCSSファイルなどは、基本的にここに入れておく。

**.htaccess、index.php**
このディレクトリのWebサーバーの設定情報と、デフォルトページのファイル。

### srcフォルダの中身

**「Console」フォルダ**
コンソールプログラミ（コマンドとして実行できるプログラム）を配置する場所。

**「Controller」フォルダ**
MVCのコントローラに相当するファイルが格納されている場所。

**「Model」フォルダ**
MVCのモデルに相当するファイルが格納されている場所。

**「Shell」フォルダ**
シェルプログラムのConsoleShell.phpが用意されている場所。

**「Template」フォルダ**
ビューで使用されるテンプレートファイルをまとめておく場所。

**「View」フォルダ**
MVCのビューで利用するプログラムを格納する場所。

**Application.php**
アプリケーション全体で必要とされる処理などを記述しておく。

この辺りは実務で覚えていった（感じ取っていった）けど、基礎中の基礎やから改めて確認しておけてよかった。

### ファイル名、クラス名の命名規則
基本的には「キャメルケース」で記載する。

### namespace
名前空間の指定の際に使用する。CakePHPの仕様ではなく、phpの仕様。
rubyでいう「モジュールを名前空間として使用する」のと似たようなもの。

[【PHP超入門】名前空間（namespace・use）について](https://qiita.com/7968/items/1e5c61128fa495358c1f)

# 今日の一言
業務ベースでCakePHP学んでたけど「一度体系的に学ばな進歩しない」ということで、CakePHP勉強する。
設定よりも規約、って言葉があるぐらいやから、CakePHPの作法を覚えていく！
と同時にRuby on Railsで身についてた変な癖を落としていきたい！

池田エライザと松屋行きたい！
"_"付きのマクロを作る（素人）

#\defができること
TeXでマクロをつくるときに使う`\def`について説明します。`\def`では，数字，－,=,(),を使うことができます。
`\def\macro1{foo}`
`\def\test-macro{foo-foo}`
`\def\test=macro{foo==foo}`
`\def\macro(2020){foo-foo2020}`
など。

また引数が入るマクロを，書き方も含めて定義することができます。

```tex

\def\fraction(#1/#2){\frac{#1}{#2}}
```

`_`は使うことができません。

#\expandafter, \csname
次のようにすると`_`入りのマクロを定義することができます。

```tex

\expandafter\def\csname TEST_macro\endcsname{TestUnderMacro}

\csname TEST_macro\endcsname
```

`\expandafter`はおまじない，`\csname`と`\endcsname`の間にマクロなまえを入れます。上記の命令は，意味としては

```tex

\def\TEST_macro{TestUnderMacro}
```
と等価です。

`-`がトークンの一部と認識されないことが原因です。`\csname`と`\endcsname`ではさまれた部分は，トークンとして認識してくれます。したがって，本文中にマクロを書く時も，`\TEST_macro`ではなく，`\csname TEST_macro\endcsname`と書く必要があります。

`\expandafter`は，その直後の命令を一旦飛ばして，その次内容から読みます。



#できること
応用範囲は広いと思います。ここでは次のような，数字を入れたマクロのつくり方を紹介します。

```tex

\tikzmath{
          int \iii;
          iii = 60;
          }

\expandafter\def\csname macro-with-number\iii\endcsname {macro-test}


\csname macro-with-number60\endcsname
```

\iii までをトークンとして見る。先に\iiiに数値を代入することで，トークンには，数字が入っていると認識させます。

こんなことができます。

```tex

\foreach \x in {1,2,3,4,5}
{
    \expandafter\def\csname macro-with-number(\x)\endcsname {macro\x 番目}
    \csname macro-with-number(\x)\endcsname
}
```

ただし，`\foreach`の外側では，マクロを忘れてしまうので，次のようにするといいかもしれません。


```tex

\foreach \x in {1,2,3,4,5}
{
    \global\expandafter\edef\csname macro-with-number(\x)\endcsname {macro\x 番目}
}

    \csname macro-with-number(3)\endcsname
```
logue-cli が KORG NTS-1 (v1.03) に接続失敗する場合の対処法

[English version](https://qiita.com/mizba/items/948f040aa228d87acd96)

# はじめに

KORG NTS-1 を v1.02 から v1.03 にアップデートしたところ、 logue-cli が NTS-1 に接続できなくなりました。このポストではその対処方法を説明します。

 - [KORG NTS-1 v1.03 download site](https://www.korg.com/us/support/download/product/0/832/) ([日本語](https://www.korg.com/jp/news/2020/0110/))

## tl;dr; 手っ取り早く

コマンドに `-i 0 -o 0` を追加します:

```sh
$ ./logue-cli probe -i 0 -o 0
...
```

もしこれで解決しない場合は、環境に応じて `0` の部分を調整する必要があるかもしれません。続きをどうぞ。

# 環境

## MacOS
```sh
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.2
BuildVersion:   19C57
```

## KORG NTS-1 / logue-cli
```sh
$ ./logue-cli probe -i 0 -o 0
> Device: nutekt digital
> System version: 1.03
> Logue API version: 1.01-0
> Available modules:
```

# 現象の詳細

KORG NTS-1 を v1.03 にアップグレードしたところ、logue-cli が次のようなエラーを表示して終了するようになりました。

```sh
$ ./logue-cli probe 
Error: Search device request timed out.
Logue handshake failed.
```

# 解決方法

この問題は MIDI インタフェース番号を明示的に指定することで解決できます。

```sh
$ ./logue-cli probe -h

Usage: logue-cli probe <options>

Detects and displays information about a connected logue device. This is the help for probe command:

Probe Command Options:
  -h [ --help ]         Display usage help.
  -m [ --module ] arg   Module specifier: modfx, delfx, revfx, osc.
  -l [ --list ]         List all available MIDI ports.
  -i [ --inport ] arg   Input MIDI port index.
  -o [ --outport ] arg  Output MIDI port index.
  -v [ --verbose ]      Print out verbose details about each step.
  -d [ --debug ]        Print out transaction details.
  -V [ --version ]      Display version information.
```

このヘルプで説明されているとおり、 `-l` オプションを使うと MIDI ポート番号の一覧を取得できます。手元の環境では次のように表示されました。

```sh
$ ./logue-cli probe -l
  Available MIDI inputs:
    in  0: nutekt digital MIDI IN
    in  1: nutekt digital KBD/KNOB

  Available MIDI ouputs:
    out 0: nutekt digital MIDI OUT
    out 1: nutekt digital SOUND
```

このうち、 `nutekt digital MIDI IN` と `nutekt digital MIDI OUT` に対応する番号を指定する必要があります。私の環境では上記の結果よりそれぞれ `0` と `0` なので、それらを `-i` と `-o` オプションに指定します。皆さんの環境では実際のコマンド実行結果に従って値を変更してください。

```sh
$ ./logue-cli probe -i 0 -o 0
> Device: nutekt digital
> System version: 1.03
> Logue API version: 1.01-0
> Available modules:
```
PowershellCore でクリップボードの画像をファイルに保存

**2020/03/13 追記**
powershell 7 で `[Windows.Forms.Clipboard]::GetImage()` が利用可能になったので下記内容は不要になりました。

----------

**結論：旧来の Windows PowerShell を使用します。**

# コード
```powershell
function Convert-ClipboardImage2File {
    <#
        .SYNOPSIS
        クリップボード内の画像をファイルに保存する
        .PARAMETER basename
        ファイル名（拡張子以外）
        .PARAMETER extension
        拡張子
    #>
    param (
        [string]$basename,
        [string]$extension = ".png"
    )
    if (-not $basename) {
        $t = Get-Date
        $basename = "{0:d4}{1:d2}{2:d2}{3:d2}{4:d2}{5:d2}" -f $t.Year, $t.Month, $t.Date, $t.Hour, $t.Minute, $t.Second
    }
    $fullpath = Join-Path $pwd.Path -ChildPath ($basename + $extension)
    if (Test-Path $fullpath) {
        Write-Host ("'{0}{1}' already exists!" -f $basename, $extension) -ForegroundColor Magenta
        return
    }
    $execute = (powershell.exe "Get-Clipboard -Format Image|Set-Variable img; if(-not `$img){return}; `$img.save('$fullpath'); return 1")
    if (-not $execute){
        Write-Host "ERROR: no image in clipboard..." -ForegroundColor Magenta
        return
    }
    Write-Host "save clipboard image as " -NoNewline
    Write-Host ("'{0}{1}'" -f $basename, $extension) -ForegroundColor Cyan
}

```

コマンド自体を文字列として powershell の引数に渡し、その標準出力を `$execute` に格納しています。

クロスプラットフォームになるなどで期待の大きい pwsh ですが、主な用途が文字列加工や検索といった事務作業だった身としてはクリップボード機能が使えなくなったのは痛いですね…。