OmniAICreator/Qiita-1.07M huggingface dataset:
【デプロイ】ゼロから始めるElixir on Phoenix Ⅲ(2019)

##注意事項
[【APIサーバ構築】ゼロから始めるElixir on Phoenix Ⅱ (2019)](https://qiita.com/kanchan-1996/items/06edf10c0d24203d6a35)の続きです。
※筆者はCloud9でやろうとしてもpipができなかったので、ローカルでgit cloneしています。


##Gigalixirについて
前々からデプロイしたい！と思っていましたが
[piacere_ex氏](https://qiita.com/piacere_ex)がGigalixirについて[記事](https://qiita.com/piacere_ex/items/1a9cbcc740ca3707eaec)を書いてくださったので
~~便乗して~~私もデプロイはGigalixirでやることにしました。

Gigalixirとは一言で言えば「Elixirのデプロイが簡単にできるHeroku」です。

##おいおい、この記事書く必要があるのか…？
手順自体は上記のpiacere_ex氏の記事①と②を読めば丸わかりです。
**この記事必要なのか？**

##ハマった\_(:3」∠)\_
前回までに作ったAPIサーバを上げると
「unhealth」とか怒られました。不健康って(´・ω・`)

ローカル（というかCloud9）では動作するのに
Gigalixirでは動作しない…**なんでや！！**

##Sapporo.BEAMとの出会い
少し前に[Sapporo.BEAM(サッポロビーム)](http://sapporo-beam.github.io/)という勉強会に参加させて頂きました。
（四年程前から週一で**「クリスマス」であろうと「正月」であろうと開催**してきたそうです!!）

ワイ「実はGigalixirにデプロイしても動かなくって……」

主催「ローカル環境で動作するなら「prod.exs」と「config.exs」に問題があると思います。」

##原因はconfigの「prod.exs」と「config.exs」でした＼(^o^)／

まずは[前回までのソース](https://github.com/k-horiuchi/PhoenixApiServer)のConfigフォルダにある「config.exs」を見てみましょう。

```config/config.exs
url: [host: "localhost"], # 15行目
```
明らかに**嘘です**。Gigalixirはローカルじゃありませんね。
この行はコメントアウトしました。
次に「prod.exs」を見てみましょう。

```config/prod.exs
config :api, ApiWeb.Endpoint,
  http: [:inet6, port: System.get_env("PORT") || 4000],
  url: [host: "example.com", port: 80],
  cache_static_manifest: "priv/static/cache_manifest.json"
```
以下のように修正します。

```config/prod.exs
config :api, ApiWeb.Endpoint,
  http: [port: {:system, "PORT"}], # 書き換える
  url: [host: "example.com", port: 80],
  cache_static_manifest: "priv/static/cache_manifest.json",
  server: true # これがないと動かない
```
**server: true**…[Gigalixir公式](https://gigalixir.readthedocs.io/en/latest/main.html)によると
> Without this line, your app will not start the web server!
> server: true is very important and is commonly left out. Make sure you have this line.

雰囲気訳（※かなりテキトーです）
「この行がないと、お前さんのアプリがウェブサーバーを開始しないぞ！」
「server: trueはとても重要なんだが、一般的には除外されてるぞ。この行があることをちゃんと確認しちくり〜」
(´°̥̥̥̥̥̥̥ω°̥̥̥̥̥̥̥｀)えぇ…


※piacere_ex氏の記事にもありますが、同ファイルの一番下の行にある`import_config "prod.secret.exs"`もコメントアウトする必要があります。

あとはGigalixirにpushすれば動くはずです！
[実際にうごいたやつ](https://cylindrical-large-noctule.gigalixirapp.com/api/datas)

もし動かない場合は下記コマンドでログを確認しましょう！(これも主催から)

```zsh
gigalixir logs -a Gigalixirのプロジェクト名
```

###まとめ
Phoenixで構築したものがローカル環境なら動くのに
Gigalixirだと動かない場合は
本番環境用の設定になってるか確認しましょう！

ログも公式も英語だけど読みましょう……

***あとコミュニテイって大事！！***
class の変更検知 MOで

-demo https://codepen.io/gnjo/pen/oOdOxp
-attributeだけ検知したい場合は多々ある。

```js
let fn={}
fn.changeAttr=function(el,caller){
 let target=el
 ,ob=new MutationObserver(mu=>{ mu.map(d=>caller(d,target) )})
 ob.observe(target,{attributes: true})
 ;
 return ob;
 /*usage
let el=document.querySelector('#frame')
fn.changeAttr(el,(ev)=>{
 if(ev.attributeName==='class') //
   console.log('class change',ev.target.classList)
}) 
 */
}
;
```

-追記 inputのvalueは改めてsetAttributeする。 この場合valueは数字に見えても文字列。

```pug
//pug
input.x(onkeyup="this.setAttribute('value',this.value)")
input.y(type="range",onchange="this.setAttribute('value',this.value)")
```
Chainerのインストールにつまづいた記録

# 記事の最終更新日 : 2019-04-20
もしこの情報が古すぎる場合には、回れ右して、他の記事を当たってください。
どうかあなたの時間を無駄に消費しないでください。

# この記事はなにか
Chainerのインストールにつまづいて、人生の残り時間を消費しました。
この記事が誰かの問題解決の参考になれれば __消費した時間にも意味があった__ と思うことができます。

# 私の環境
- Windows 10
- Nvidia GTX 1080
- Python 3.6.8 (Anaconda)

# Chainerをインストールする前に
下記を順番にインストールしていきます。

- [CUDA](https://developer.nvidia.com/cuda-toolkit)
  これはGPUアクセラレーションを使うためのライブラリです。
  あなたの実行環境にあったものをダウンロードしてインストールしましょう。

- [cuDNN](https://developer.nvidia.com/cudnn)
  DNN(Deep Neural Network)向けのGPUアクセラレーションライブラリです。
  ユーザー登録が必要です。自分でファイルを配置する必要がありました。
  インストーラーを提供してほしいところ。

# Python環境へインストール
※理由は後述しますが、この時点でpip/condaどちらにするのか決めておけばよかった

下記を順番にインストールしていきます。

- Pythonの仮想環境をあなたのお好みへ切り替えます

- CuPyのインストール
  - [CuPyのサイトはこちら](https://cupy.chainer.org/)
  - NumPyをCUDAへ最適化したライブラリ
  - 上記でインストールしたCUDAのバージョンにあわせる

```
# (For CUDA 10.1)
$ pip install cupy-cuda101
```

※1 ここで```$pip install cupy```ではインストールできませんでした
※2 インストールの確認は、```$python -c 'import cupy as cp'``` でエラーが返ってこなければOKです。
※3 私は、cuDNNがnot availableというwarningに悩まされました
※4 Anaconda Navigaterにて、**cudatoolkit**をapplyしたら解消しました
※5 cuDNNはon/offスイッチがなく、ファイルと環境変数のパスが正しくインストールされていれば、cupyが自動で認識してくれます 

# Chainerのインストール

```
$pip install chainer
```

先にcupyをインストールしておく必要があるらしいです。
こういう依存がよくない！！つまづきの元になりやすい。

# つまづく

上記の ※3 に書きましたが、ここでつまづきました。

> ※2 インストールの確認は、```$python -c 'import cupy as cp'``` でエラーが返ってこなければOKです。

これをすると、

> ※3 私は、cuDNNがnot availableというwarningに悩まされました

なのです。

結局は、下記で解決はしたのですが、

> ※4 Anaconda Navigatorにて、**cudatoolkit**をapplyしたら解消しました

pipには、cudatoolkit がないのです。(2019-04-20現在)

[https://pypi.org/search/?q=cudatoolkit](https://pypi.org/search/?q=cudatoolkit) 


# (おまけ) Chainerの実行環境をみる
```
$python -c 'import chainer; chainer.print_runtime_info()'
Platform: Windows-10-10.0.17134-SP0
Chainer: 5.3.0
NumPy: 1.16.2
CuPy:
  CuPy Version          : 4.1.0
  CUDA Root             : C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1
  CUDA Build Version    : 9000
  CUDA Driver Version   : 10010
  CUDA Runtime Version  : 9000
  cuDNN Build Version   : 7104
  cuDNN Version         : 7500
  NCCL Build Version    : None
iDeep: Not Available
```

# おわりに
pip/condaの混在はよくないかな？という印象です。やっぱりね。
依存のあるパッケージをインストールするなら、Anaconda Navigatorをonlyで使ったほうがいいかもしれませんし、
そもそも、Google Colaboratory みたいなクラウド環境を使ったほうが、
インストールやアップデートで起こるトラブルに、時間を消費しなくていいと思います。

環境構築も１つのスキルだとは思いますが、それが目的でないなら、あなたの時間を大事にしてほしいな、と思います。
AndroidもJVMで動いてると思ってた。。。

#AndroidってJVMじゃないのか！
　今までJava開発を行ってきたけど、WebアプリがメインでJava＝JVMで動いてるものと思っていた。が、今更ながら違うことが判明したのでメモ。（間違ってたら教えてくださいo^^o）

##Androidアプリは~~Dalvik~~で動いている→ARTで動いている！
　Javaをコンパイルすると.classというファイルができるというのは常識で、JVMはそれを読み込んで動かしている。
　一方、Androidアプリの場合、コンパイルすると.dexファイル(Dalvik Executable)ができる。
　.dexが.apkファイルに格納され、Android端末の~~Dalvik~~ ARTで実行される。

　ただ、.dexファイルは.classに含まれるJavaバイトコードから生成できるそうなので、これまでと同じようにJava言語で開発できるんだとか。

##そういやMulti Dexについて調べてたんだった
　というわけでDEXというのを初めて見たので今さら衝撃を受けていたわけだが、そもそもはMulti Dexって何？ってものを調べてたのを思い出した。

#Multi Dexについて
　以上のことを踏まえて、こちらの方の記事を参考にさせてもらった。
　https://qiita.com/KeithYokoma/items/385a94988beb2d7d8043

　DEXに含められる上限メソッド数は65,535です。ん？DEXってクラス単位じゃないのか！？
　Android Studioでコンパイルしてみるか。

##まとめ
　開発者としてJVMと~Dalvik~~ ARTの違いを意識する必要はなさそうなので、この辺で調査はやめておくおわり。

～追記～
　2019/4/20 RYO-4947123さんからご指摘いただき、ARTの記述を修正しました。
　2019/4/25 hurumoon_1さんからご指摘いただき、Androidのバージョンを修正しARTのコンパイラについて追記しました。

　Android4.4からART(Android RunTime)が搭載され、Android 5.0でDalvikは廃止されたもよう。
　ARTは高速・効率的な動作とバッテリー寿命の向上を目指して作られた。ARTはDEXファイルを実行する点は変わらないが、コンパイル方式が変更になっている。
　DalvikとARTの違いについても調べてみた。Dalvikはプログラム実行時に中間言語(DEX)をコンパイルするJITコンパイラ(Just In Time)を使用していたが、ARTはインストール時に中間言語をネイティブ形式にコンパイルするAOTコンパイラ(A head Of Time)を採用している。

→ Android7.0からARTにJITコンパイラが追加された。詳しくはこちら↓
　https://developer.android.com/about/versions/nougat/android-7.0.html?hl=ja

　Android開発に関する情報はここに記載されていたのか、、、。他のページも読んでおこう。
【3分入門】コピペで導入！dockerでnpm run

## code
```docker-compose.yml
version: '2'
services:
  npmrun:
    image: node
    working_dir: /app
    entrypoint: npm run
    volumes:
     - .:/app
```

## exec
```
docker-compose run npmrun build
docker-compose run -p 9000:9000 npmrun develop
```
素人エンジニアが最近Cognitoで試したことざっくりまとめ

###前提
AWSの勉強がてらcognitoを最近いじっていたので、頭の整理としてまとめます。


###1.オリジナル認証画面からCognitoユーザ登録を利用する
[AWSのCognitoを使って画面サインアップをやってみた](https://qiita.com/takaahi/items/0de865a9716fab7d0d55)
![2019-04-20_09h54_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222041/7cd83ad9-90ab-835e-c28b-d90181b32cf8.png)


###2.オリジナル認証画面からCognitoユーザ認証を利用する
[AWSのCognitoを使って画面サインインをやってみた](https://qiita.com/takaahi/items/734f8a07432b1397925f)
![2019-04-20_09h54_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222041/6e529095-b980-78ef-aecd-1e0f759be148.png)

###3.Cognito認証画面からCognitoユーザ認証を利用する
![2019-04-20_09h54_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222041/b3f9bbf7-4178-b6f1-0f57-b3ea3dfdf26b.png)

###4.パブリックホーム画面からCognitoユーザ認証後、ユーザ限定画面へ遷移する
![2019-04-21_10h28_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222041/6480035c-7fde-23a9-cfe6-8270ecd42abc.png)
Example of matching with regular expression from #JSON by #Jq command

<h1> ref </h1><p> https://stedolan.github.io/jq/manual/ </p><h1> Match from string </h1><p> Match information is returned in the object </p><pre> <code>$ echo &#39;&quot;Alice&quot;&#39; | jq &#39;match(&quot;A&quot;)&#39; { &quot;offset&quot;: 0, &quot;length&quot;: 1, &quot;string&quot;: &quot;A&quot;, &quot;captures&quot;: [] }</code> </pre><h1> Output matching character </h1><pre> <code>$ echo &#39;&quot;Alice&quot;&#39; | jq &#39;match(&quot;A&quot;).string&#39; &quot;A&quot; $ echo &#39;&quot;Alice&quot;&#39; | jq &#39;match(&quot;(A)&quot;)&#39; { &quot;offset&quot;: 0, &quot;length&quot;: 1, &quot;string&quot;: &quot;A&quot;, &quot;captures&quot;: [ { &quot;offset&quot;: 0, &quot;length&quot;: 1, &quot;string&quot;: &quot;A&quot;, &quot;name&quot;: null } ] }</code> </pre><h1> To capture </h1><pre> <code>$ echo &#39;“Alice”&#39; | jq &#39;match(“(A)(l)(i)(c)(e)“)&#39; { “offset”: 0, “length”: 5, “string”: “Alice”, “captures”: [ { “offset”: 0, “length”: 1, “string”: “A”, “name”: null }, { “offset”: 1, “length”: 1, “string”: “l”, “name”: null }, { “offset”: 2, “length”: 1, “string”: “i”, “name”: null }, { “offset”: 3, “length”: 1, “string”: “c”, “name”: null }, { “offset”: 4, “length”: 1, “string”: “e”, “name”: null } ] }</code> </pre><h1> Captured string </h1><pre> <code>$ echo &#39;“Alice”&#39; | jq &#39;match(“(A)(l)(i)(c)(e)“).captures[].string&#39; “A” “l” “i” “c” “e”</code> </pre><h1> Named Captcha </h1><p> (An especially meaningless example) </p><pre> <code>$ echo &#39;“Alice”&#39; | jq &#39;match(“(?&lt;first_letter&gt;A)(l)(i)(c)(e)“).captures[].name&#39; “first_letter” null null null null</code> </pre>

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Example of combining value with multiple keys specified from the array of #json objects with #jq command

<ul><li> Example of writing the specified key after canceling the array with <code>.[]</code> </li><li> There may be a better way <code>$ echo &#39;[{&quot;key1&quot;:&quot;value1&quot;,&quot;key2&quot;:&quot;value2&quot;}]&#39; | jq &#39;.[] | .key1 + &quot; &quot; + .key2&#39; &quot;value1 value2&quot;</code> <code>$ echo &#39;[{&quot;key1&quot;:&quot;value1&quot;,&quot;key2&quot;:&quot;value2&quot;},{&quot;key1&quot;:&quot;value3&quot;,&quot;key2&quot;:&quot;value4&quot;}]&#39; | jq &#39;.[] | .key1 + &quot; &quot; + .key2&#39; &quot;value1 value2&quot; &quot;value3 value4&quot;</code> </li></ul>

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Example of making text hashtag style of Twitter with # regular expression of # python

<ul><li> Match and replace at word boundaries <code>\b</code> </li></ul><h1> All words (roughly) </h1><pre> <code class="py">&gt;&gt;&gt; re.sub(r&#39;\b([A-Za-z][A-Za-z0-9]+)\b&#39;, &quot;#\\1&quot;, &quot;A whole new-world under_the_sea&quot;) &#39;A #whole #new-#world under_the_sea&#39;</code> </pre><h1> Specified word </h1><p> <code>perlpythonruby</code> that the string <code>perlpythonruby</code> is not replaced </p><pre> <code class="py">&gt;&gt;&gt; re.sub(r&#39;\b(ruby|perl|python)\b&#39;, &quot;#\\1&quot;, &quot;Do you like python or ruby? mixed perlpythonruby languate does not exist?&quot;) &#39;Do you like #python or #ruby? mixed perlpythonruby languate does not exist?&#39;</code> </pre><h1> Case-insensitive pattern </h1><p> You can see that the upper case Ruby is also replaced </p><pre> <code class="py">&gt;&gt;&gt; pattern = re.compile(r&#39;\b(ruby|perl|python)\b&#39;, re.IGNORECASE) &gt;&gt;&gt; re.sub(pattern, &quot;#\\1&quot;, &quot;Do you like python or Ruby? mixed perlpythonruby languate does not exist?&quot;) &#39;Do you like #python or #Ruby? mixed perlpythonruby languate does not exist?&#39;</code> </pre><h1> Example of ignoring an existing hashtag </h1><p> Use a negative look back <code>?&lt;!#</code> </p><pre> <code class="py">&gt;&gt;&gt; re.sub(r&#39;\b(?&lt;!#)(ruby|perl|python)\b&#39;, &quot;#\\1&quot;, &quot;Do you like #python or ruby? mixed perlpythonruby languate does not exist?&quot;) &#39;Do you like #python or #ruby? mixed perlpythonruby languate does not exist?&#39;</code> </pre><h1> All inclusive </h1><pre> <code class="py">&gt;&gt;&gt; pattern = re.compile(r&#39;\b(?&lt;!#)(ruby|perl|python)\b&#39;, re.IGNORECASE) &gt;&gt;&gt; re.sub(pattern, &quot;#\\1&quot;, &quot;Do you like #python or ruby or Perl? mixed perlpythonruby languate does not exist?&quot;) &#39;Do you like #python or #ruby or #Perl? mixed perlpythonruby languate does not exist?&#39;</code> </pre>

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
# By changing the shortcut settings on the Mac, it is possible to change even the troublesome human actions. (Or a little tip on how to program while leaning against a chair where a non-defective person is not good.)

<h1> #The shortcut for setting screenshots with Command + Control + Shift + 4 on Mac is set so that it can be started with one hand. </h1><p> It is a Kindle reading of a certain engineer. I found myself thinking, &quot;Please take care of the start of the screen shot.&quot; However, when I looked at the feeling delicately, I realized that the action of &quot;stretching the right hand and touching 4&quot; was very troublesome. </p><p> At that time, it was just sitting on the sofa where a man of good quality would be useless. </p><p> So I decided to appeal to the &quot;slightly physical threshold&quot; by changing the shortcut settings. This is fantastic. What does &quot;do not stretch the right hand&quot; means that the behavior of my body application has changed so far. </p><p> It&#39;s really useful so give it a try. By the way, I set it to Command + Controle + Shift + S. </p><p><img src="https://user-images.githubusercontent.com/13635059/56402428-37aac400-6298-11e9-8b59-ff61d9215cb6.png" alt="image"><img src="https://user-images.githubusercontent.com/13635059/56402430-38dbf100-6298-11e9-8ac4-fc213f42b9d5.png" alt="image"></p>

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
EV3RT を athrill に移植するまで

#概要
[TOPPERS/EV3RT](https://dev.toppers.jp/trac_user/ev3pf/wiki/WhatsEV3RT) を athrill に移植することに決めました．

EV3RT を移植したい動機は色々とあります．

1. メモリ保護対応している TOPPERS/HRP2 は，兼ねてから athrill2 の可能性を試す目標の１つだった
* ここをクリアできれば，ETロボコンでメジャー・プラットフォームである EV3RT を移植できるようになる
* さらに，ET ロボコン向けシミュレータを作って物理シミュレータ連携したい(Unity勉強したい)
* そして，TOPPERS/EV3RT && athrill2 && 物理シミュレータ上で ET ロボコン動かせるようにする

これまでの ET ロボコンシミュレータは制御レベルでの物理シミュレータ連携だったと思われます．
ですが，これが実現できれば，マイコン挙動も含めた ET ロボコンシミュレータになります．
とてもチャレンジングでわくわくしませんか？！( そこまで必要ない？(;^_^) )

#ゴール設定

* [1] TOPPERS/HRP2 を athrill2 に移植する
* [2] TOPPERS/EV3RT を athrill2 に移植する
* [3] 物理シミュレータで ET ロボコン走行に特化したシミュレータを作る
* [4] athrill2 に移植した EV3RT と 物理シミュレータを結合する
* [5] 過去の ET ロボコン走行コースで走らせてみる


#全体進捗状況
* 2019/04/20：決意表明しました．
* 2019/05/01：物理シミュレータの勉強した内容した．
* 2019/08/05：athrill2/mROS/Unity連携した
* 2019/08/24：hrp2の移植開始した
* 2019/10/13: EV3RTの移植調査を始めた
* 2019/10/20: EV3RTの移植が進み始めた(LED，ボタン，センサ系が動くようになった)
* 2019/11/04: EV3RTのサンプルコード(ラントレース)を移植してUnity上で動くようにした

#各ゴールに対する記事
* [1] TOPPERS/HRP2 を athrill2 に移植する
  * [hrp2のカーネル移植作業場所を作った](https://github.com/tmori/athrill/tree/master/sample/os/hrp2)
* [2] TOPPERS/EV3RT を athrill2 に移植する
  * [EV3RTのathrill移植調査状況](https://qiita.com/kanetugu2018/items/17da185c7e204e5ddab8)
* [3] 物理シミュレータで ET ロボコン走行に特化したシミュレータを作る
 * GW中に勉強した内容をアップしました
        * [unity で簡単な車を作ってみた](https://qiita.com/kanetugu2018/items/a6411ee86b2ed404031b)
 * athrill2/mROS/Unity連携しました
        * [ROS を使って Unity の仮想車両をマイコンシミュレータで制御する](https://qiita.com/kanetugu2018/items/86c4ee4d1f0e110857bc)

(T.B.D) その他，工事中・・(進捗状況が変わったらアップデート予定)．

#変更履歴
* 2019/05/01
    *  物理シミュレータを勉強したのでその内容を追記した
* 2019/08/24
    *  進捗状況を更新した
* 2019/10/13
    * EV3RTの移植調査状況を追加した
* 2019/11/04
    * EV3RT上でライントレース制御をathrill上で動かして，Unity上のEV3のライントレースを出来るようにした
    * 詳細は [EV3RTのathrill移植調査状況](https://qiita.com/kanetugu2018/items/17da185c7e204e5ddab8)を参照ください．
Windows のファイル拡張子の関連付け

# 概要

Windowsでは，実行形式（*.exe*）でないファイルをエクスプローラ上でダブルクリックしたり，コマンドプロンプト上で（まるでコマンドであるかのように）実行しようとした場合，そのファイルのファイル種別によって適切なアプリケーションやコマンドが起動され，そのファイルがオープンされます。たとえば，*.xlsx*ファイルの場合は，エクセルが起動され，起動したエクセル上ではそのファイルがオープンされます。

ファイル拡張子がどのアプリケーションやコマンドに紐付けられているかは，エクスプローラ上でファイルを右クリックして「プロパティ > 全般」を開き，「ファイルの種類／プログラム」の欄で確認できたり変更できたりします。ファイル拡張子からアプリケーション，コマンドへの紐付けはレジストリ *\HKEY_CLASSES_ROOT* の下に記録されています。

本稿で述べる *assoc* コマンド，*ftype* コマンドを使えば，ファイル拡張子のコマンドへの紐付けをより細かく制御できます。

# ファイル拡張子の関連付けを確認する方法

**手順1：** *assoc* コマンドでファイル種別を得ます。

```
> assoc .py
.py=Python.File
```

**手順2：** *ftype* コマンドでファイル種別に紐付けられたコマンド実行内容を確認します。

```
> ftype Python.File
Python.File="C:\WINAPP\Python\python.exe" "%L" %*
```

「%L」はファイルの名前，「%*」は残りのコマンド引数に置換されます。たとえば，上のように定義されている場合に，コマンドライン上で```hello.py foo bar baz```とタイプしたならば，```C:\WINAPP\Python\python.exe hello.py foo bar baz```が実行されることになります。

# ファイル拡張子の関連付けを定義／変更する方法

*assoc* コマンドでファイル種別を定義／変更します。

```
> assoc .py=Python.File
```

*ftype* コマンドでファイル種別に紐付けられたコマンド実行内容を定義／変更します。「%L」と「%*」については，「ファイル拡張子の関連付けを確認する方法」を参照してください。

```
> ftype Python.File="C:\WINAPP\Python\python.exe" "%L" %*
```

# ファイル拡張子の関連付けを削除する方法

*assoc* コマンドでファイル種別を削除します。

```
> assoc .py=
```

*ftype* コマンドでファイル種別に紐付けられたコマンド実行内容を削除します。

```
> ftype Python.File=
```
#jq コマンドで #json のオブジェクトの配列から複数のキーを指定して value を結合して出力する例

- いったん `.[]` で配列を解除しておいてから、指定のキーを記述する例
- もっと良いやり方があるかもしれません
```
$ echo '[{"key1":"value1","key2":"value2"}]' | jq '.[] | .key1 + " " + .key2'
"value1 value2"
```
```
$ echo '[{"key1":"value1","key2":"value2"},{"key1":"value3","key2":"value4"}]' | jq '.[] | .key1 + " "  + .key2'
"value1 value2"
"value3 value4"
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#Jq コマンドで #JSON からの正規表現でのマッチをおこなう例

# ref

https://stedolan.github.io/jq/manual/

# 文字列からのマッチ

マッチ情報がオブジェクトで返ってくる

```
$ echo '"Alice"' | jq 'match("A")'
{
  "offset": 0,
  "length": 1,
  "string": "A",
  "captures": []
}
```

# マッチした文字を出力

```
$ echo '"Alice"' | jq 'match("A").string'
"A"
$ echo '"Alice"' | jq 'match("(A)")'
{
  "offset": 0,
  "length": 1,
  "string": "A",
  "captures": [
    {
      "offset": 0,
      "length": 1,
      "string": "A",
      "name": null
    }
  ]
}
```

# キャプチャする

```
$ echo ‘“Alice”’ | jq ‘match(“(A)(l)(i)(c)(e)“)’
{
  “offset”: 0,
  “length”: 5,
  “string”: “Alice”,
  “captures”: [
    {
      “offset”: 0,
      “length”: 1,
      “string”: “A”,
      “name”: null
    },
    {
      “offset”: 1,
      “length”: 1,
      “string”: “l”,
      “name”: null
    },
    {
      “offset”: 2,
      “length”: 1,
      “string”: “i”,
      “name”: null
    },
    {
      “offset”: 3,
      “length”: 1,
      “string”: “c”,
      “name”: null
    },
    {
      “offset”: 4,
      “length”: 1,
      “string”: “e”,
      “name”: null
    }
  ]
}
```
# キャプチャした文字列

```
$ echo ‘“Alice”’ | jq ‘match(“(A)(l)(i)(c)(e)“).captures[].string’
“A”
“l”
“i”
“c”
“e”
```
# 名前付きキャプテゃ

(特に意味のない例)

```
$ echo ‘“Alice”’ | jq ‘match(“(?<first_letter>A)(l)(i)(c)(e)“).captures[].name’
“first_letter”
null
null
null
null
```




# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
SAP Analysis for Microsoft Excelで在庫一覧をつくってみた。1回目　ABAP Development Tools in Eclipseのセットアップ

#前回の記事

前回の記事はSAPとは、Analysis for Officeについて、連載予定について書きました。
詳しくは[SAP Analysis for Microsoft Excelで在庫一覧をつくってみた。0回目](https://qiita.com/ryusuke8113/items/4427f83a6a2b7af204c8)をご覧ください。
#今回のスコープ
**1回目：SAP ABAP Development Tools in Eclipseのセットアップ**
2回目：3つのView、CDSについて
3回目：MATDOCを表示してみる。
4回目：在庫数量の単位変換をしてみる。
5回目：association,aggressionについて
6回目：TBD
#SAP ABAP Development Tools in Eclipseのセットアップ
**※以下インストール方法の検証日は2019年3月末です。**

SAP Analysis for Microsoft Excelで在庫一覧を表示するためにはHANAStudioもしくはABAP Development Tools in EclipseでABAPCDSをコーディングする必要があります。
ABAPCDSに関しては[こちら](https://www.sapjp.com/blog/archives/18214)を参考にしてください。


[http://mergedoc.osdn.jp/](http://mergedoc.osdn.jp/)のサイトに飛びphotonをダウンロードする。
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361017/1309bf69-024b-42c3-3769-865498521bde.png)
各自のOS、bit数に合わせてダウンロードする。
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361017/4c848910-ab88-a623-f4c8-6550bf0522de.png)

ダウンロードが完了のち、各自の好きな場所に解凍する。
そしてEclipseを起動する。
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361017/01cfab2a-1377-280b-09cc-0d6ea6e969b1.png)
起動後　ヘルプ⇒新規ソフトウェアのインストールを押下する。
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361017/8d5d1b04-d8e1-3408-5a0e-a022ee8f515e.png)
作業対象に[http://tools.hana.ondemand.com/photon](http://tools.hana.ondemand.com/photon)を入力する。
※上記内容はEclipseのバージョンにより異なる。
そして次を押下する。
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361017/001097f6-37d4-c53d-884e-d5b419b54ab4.png)
さらに次へを押下する。
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361017/2b638f8b-ed1a-76dd-0df5-ebcae97eaeb6.png)
使用条件の条項に同意しますを選択し完了を押下する。
![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361017/2f6a5329-1e67-ca7b-14d2-9b6942827e24.png)
Eclipseを再起動しインストール完了

#次回
2回目：3つのView、CDSについて説明します。
WindowsコマンドプロンプトでのANSIエスケープシーケンスの使用

[ansicon]:http://adoxa.altervista.org/ansicon/
[Wikipedia]:https://en.wikipedia.org/wiki/ANSI_escape_code
[PruneMazui]: https://qiita.com/PruneMazui/items/8a023347772620025ad6
[stknohg]: https://blog.shibata.tech/entry/2016/02/22/195644

# 概要

ANSIエスケープシーケンスは，端末上でテキストをカラー表示したり，点滅表示したり，表示位置を制御したりするときに利用されてきた端末の機能です。エスケープ記号（\x1b）に続く一定の文法に即した文字の並びによって，そうした制御を実現することが可能になっています。Linuxの *ls* コマンドは，ディレクトリやファイルの区別やファイルモードによってファイル名の表示色を変えていますが，表示色の変更にはこのANSIエスケープシーケンスが使われています。所定の文字の並びを標準出力に出力するだけでカラー表示が実現できますので，スクリプトなどで目視のために何かを強調出力するようなときにはとてもお手軽で重宝します。ANSIエスケープシーケンスの具体的な文字の並びは文献[[Wikipedia]][[PruneMazui]]あたりを参照してください。

MS-DOSではこのANSIエスケープシーケンスが使えるようになっていたのですが，Windowsになってからサポートしなくなってしまいました。しかし，本稿で紹介する *ansicon* [[ansicon]]を利用すれば，そういった環境でもエスケープシーケンスを利用したカラー表示ができるようになります。

:warning: 文献[[stknohg]]によると，Windows 10 の Anniversary Update(1607) 以降のコマンドプロンプトでは，標準でANSIエスケープシーケンスがサポートしているようです。*ansicon* の出番は今後なくなりそうですが，会社などでは依然，Windows 7などの少し古いOSを使い続けているようなことがよくあります。そういった環境では，いまだ利用価値のあるツールと言えます。

# *ansicon* のインストール

[このリンク](https://github.com/adoxa/ansicon/releases/download/v1.88/ansi188-bin.zip)からダウンロードした *ansi188-bin.zip* を展開します。展開して得られるディレクトリ中のx64ディレクトリ（64bit版Windows使用時），またはx32ディレクトリ（32bit版Windows使用時）の内容を適当なPATHの通ったディレクトリにコピーします。

# *ansicon* の都度有効化

毎回，コマンドを実行するたびにANSIエスケープシーケンスを有効にしたい場合，以下のように *ansicon* からコマンドを実行します。

```ansicon実行の一般形式
ansicon コマンドライン
```
```ansiconの実行例
ansicon python hoge.py
```

# コマンドプロンプト起動時の *ansicon* 有効化

コマンドプロンプト起動時にANSIエスケープシーケンスを有効化する場合，以下のコマンドを実行します。このコマンドを実行することで，レジストリ *\HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun* に *ansicon* の実行が登録されます。

```
ansicon -i
```

コマンド起動時のANSICON有効化を解除する場合は，以下のコマンドを実行します。

```
ansicon -u
```

ただし，コマンドラインから直接スクリプトを実行する場合，この方法ではANSIエスケープシーケンスは有効化されません。

コマンドラインから直接スクリプトを実行するときでもANSIシーケンスを有効化したい場合，拡張子の実行内容で *ansicon* の実行を指定する方法があります。以下の例では，Pythonのスクリプトを実行する場合は，常に*ansicon*を実行するように設定しています。（*ansicon* は *C:\WINAPP\bin* に，*python.exe* は *C:\WINAPP\Python* にインストールされているものとします。）拡張子に対するファイルタイプやコマンドの紐付けがすでにされている場合はそれらが変わってしまうため注意してください。

```
assoc .py=Python.File
ftype Python.File="C:\WINAPP\bin\ansicon.exe" "C:\WINAPP\Python\python.exe" "%L" %*
```

解除したい場合は以下のようにします。

```
ftype Python.File=
```

# *ansicon* 利用時の問題

*ansicon* を起動していると一部のアプリケーションでは不具合がでる場合があります。確認されている範囲で以下のアプリケーションが該当します。

+ sqlite3

# 参考文献

[[Wikipedia]] Wikipedia, "ANSI escape code"（読み込まないとわかりにくいです。）
[[PruneMazui]] PruneMazui, "ANSIエスケープシーケンス チートシート" (qiita)
[[ansicon]] Jason Hood, "ANSICON"
[[stknohg]] stknohg, "しばたテックブログ： PowerShellでwttr.inを表示してみる"
Reversed Client ID をVimでつくる

Google Firebase を使っていたら、Client ID（1234567890-abcdefg.apps.googleusercontent.comみたいなやつ）を逆順にしたもの（com.googleusercontent.apps.1234567890-abcdefg）を入力することがあったので、それをVimからつくるメモ。

Client IDが書かれたバッファで、以下のコマンドを実行。

```
:%!cat | ruby -ane 'puts $F.first.split(".").reverse.join(".")'
```

* `%!`: フィルタ処理（詳しくは :help range! ）
* `cat |`: Vimバッファの内容をrubyにパイプで渡す
* `ruby -ane`: ワンライナーを実行する。$Fからパイプで渡された情報が配列で取れるようになる。
    * 参考: [Rubyワンライナー入門 - maeharinの日記](https://maeharin.hatenablog.com/entry/20130113/ruby_oneliner)
* `'puts $F.first.split(".").reverse.join(".")'`: Rubyスクリプトで文字列を加工する。putsした内容でVimバッファの内容を置き換える。

以上です。
Nuxt.jsで作った静的サイトをFirebase Hostingを使ってホスティング

![lockup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182399/25b27e2e-858c-34ee-20f6-2c0886250830.png)

静的サイトのホスティングとして色々な選択肢があると思いますが、今回はFirebase Hostingを利用してみました。
個人的にはAWS S3とGithub Pagesの使用経験はあるのですが、新しいことにチャレンジするという意味も込めてFirebaseを使ってみました。




# 5分後にホスティングできるまでの手順
### Firebaseプロジェクトを作成
ブラウザからFirebase consoleにアクセスして、プロジェクトを作成してください。

### Nuxt.jsでファイル群を生成
Nuxt.jsのプロジェクトに移動して、以下のコマンドを打つと/distというディレクトリに公開用ファイルが生成されます。

```
$ npm run generate
```



### Firebase CLIのインストール
Firebase CLIのインストールが済んでいない場合はインストールします。
CLIのインストールにはNode 5.10.0以降が必要とのことです。(2019.04現在)

```
$ npm install -g firebase-tools
```

### Firebaseプロジェクトにログイン
ローカルマシンをFirebaseプロジェクトに紐づけます。

```
$ firebase login
```

### NuxtプロジェクトとFirebaseを紐づける
NuxtプロジェクトとFirebaseを紐づける為に、
Nuxt.jsのプロジェクトのディレクトリに移動して、以下のコメント打ちます。

```
$ firebase init
```

コマンドを打つと、コマンドライン上で設定が始まります。

<img width="637" alt="スクリーンショット 2019-04-19 21.19.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182399/c9c33885-be9a-1525-c5c7-5f6af5514f92.png">
こんな感じに表示されるので、Hostingを選択します。
スペースキーを押せば、選択できます。

<img width="636" alt="スクリーンショット 2019-04-19 21.22.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182399/848a3298-5e57-78c6-d72c-e0bf63bec379.png">
Hostingを選択。

<img width="476" alt="スクリーンショット 2019-04-19 21.22.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182399/b25b6dfb-900b-c8b0-0b5a-389a6708fe76.png">
Firebaseのどのプロジェクトと紐づけるか聞かれるので、事前に作成したプロジェクトを選択します。

<img width="617" alt="スクリーンショット 2019-04-19 21.23.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182399/d3ca889b-1151-e51d-f62d-f150f2f27993.png">
どのディレクトリを公開するか入力を求められるので、`dist`と入力します。

### 最後にサイトをデプロイ
Nuxt.jsのプロジェクトのディレクトリで以下のコマンドを打つと、デプロイされます。

```
$ firebase deploy
```

ここまで進めると、`firebase.json`と`.firebaserc`というファイルが生成されます。


# 感想
今回はNuxt.jsのプロジェクトでしたが、他の静的サイトも簡単にホスティング出来そうですね。
個人的には、Firebaseのチュートリアルでチャットを作ったことしかなくて、ちゃんと使用したのははじめてした。まだまだ便利な機能がたくさんあるので、使っていきたいと思います。
LibertyからMySQL接続時にSSL証明書未使用のエラーを解消する

## エラー内容

IBM WebSphere Application Server Liberty (以下 Liberty) から MySQL へ Connection 確立時に SSL にしてねと言われます。

```
[err] Fri Apr 19 22:30:57 UTC 2019 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
```
[MySQL の Documentation](https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-configuration-properties.html) を見ると、JDBC ドライバーのバージョンが 8.0.13 以降では、 ``useSSL=true`` のプロパティとなっているようです。
動作環境で使用したバージョンは 8.0.12 なのでエラーは出ないのでは? となりましたが、**SSL 接続しない場合はそれを明示する**必要があるようです。

## Liberty で SSL 接続しないことを明示する

Liberty で明示する場合は、server.xml に記載します。
[Knowledge Center](https://www.ibm.com/support/knowledgecenter/en/SSAW57_liberty/com.ibm.websphere.liberty.autogen.nd.doc/ae/rwlp_config_dataSource.html) には記載方法がないですが、MySQL 用の`<dataSource> <properties>` へ記載します。

```server.xml
  <library id="MySQLLib">
    <fileset dir="${server.config.dir}/resources/mysql" includes="*.jar" />
  </library>
  <dataSource jndiName="jdbc/sample" transactional="false">
    <jdbcDriver libraryRef="MySQLLib" />
    <properties databaseName="sample" serverName="${env.MYSQL_SERVERNAME}" portNumber="${env.MYSQL_PORTNUMBER}" user="${env.MYSQL_USER}" password="${env.MYSQL_PASSWORD}" useSSL="false" />
  </dataSource>
```
Liberty のプロセスを再起動すれとエラーは出なくなります。
CloudFunctionsでPubSubイベントをnode6から8/10に上げる時

# EntryPointの仕様が変わってる
第一引数がnode6時の1段目のdataの中身になっているので、`event.data.data`が`data.data`と一段ずれる。
第二引数はcallbackではなくcontextに変更になっているので、終了時に呼び出したら怒られる。

```
export.entryPoint = (event, callback) =>{
  const data = event.data.data
  ...
  callback();
}
```
が、

```
export.entryPoint = (data, context) => {
  const data = data.data
  ...
}
```

node6がdeplecatedと言われて、慌て始めたあなたに。

https://cloud.google.com/functions/docs/tutorials/pubsub?hl=en
【Python】文字列の指定位置をある文字で置き換える

`'123456'`の`3番目と4番目の位置にある'34'`を`'ab'`で置き換えた文字列(`'12ab56'`)が取得したい時

方法は３つある(ほかにもたくさんありそうだけど...)

1. strを一度、listにしてから置き換える
2. 置き換える文字の前後をsliceで取得し、結合する
3. `replace()`で置き換える(失敗)

## strを一度、listにしてから置き換える

strで指定位置を置き換えようとするとエラーになる

```python
>>> s = '123456'
>>> s[2:4] = 'ab'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

'str' object does not support item assignment
```

> 'str'オブジェクトはアイテム割り当てをサポートしていません

だから、一度listにしてから置き換える

```python
>>> s = list('123456')
>>> s[2:4] = 'ab'
>>> s
['1', '2', 'a', 'b', '5', '6']
>>> "".join(s)
'12ab56'
```

この方法で、リストデータの内容を書き換え、文字を置き換えた新たな文字列を作り出せる。

## 置き換える文字の前後をsliceで取得し、結合する

```python
>>> s = '123456'
>>> s[:2] + 'ab' + s[4:]
'12ab56'
```

この方法でも、文字を置き換えた新たな文字列を作り出せる。

## `replace()`を使う（位置を指定した置き換えには使えない）

`replace()`を使うことでも実現できると思ってやったみた。  
でも、もし、指定位置の文字が前にあったときに、意図しない結果になってしまうため、`replace()`ではだめ

```python
# この場合はOK
>>> s = '123412'
>>> s.replace(s[:2], 'ab', 1)
'ab3412'
```

指定位置の前に同じ文字があるため、意図しない結果になる

```python
# '1234ab'となってほしかった
>>> s = '123412'
>>> s.replace(s[4:6], 'ab', 1)
'ab3412'
```

## 参考文献

- [Pythonで、文字列の一部の文字を変更する - minus9d's diary](https://minus9d.hatenablog.com/entry/20130528/1369745960)
- [Replacing a portion of a string « Python recipes « ActiveState Code](http://code.activestate.com/recipes/59890-replacing-a-portion-of-a-string/)
エンジニアは転職すべきなのか

## 軽く自己紹介
私は今の職場に新卒で入って12年目のエンジニア。33歳です。
対クライアント交渉や設計、実装と一通りをこなしています。

## この記事を書こうと思ったきっかけの話
先日、エンジニアの友人から「今の会社の体制が気に入らないから転職しようと思う」という話を聞かされました。
詳しい話を聞いてみると、
仕事は自由にやらせてもらっている。
無理矢理な仕事を押し付けられることもない。
ただ、現状の体制だと評価がされない、今の上司のやりかたが気に入らない、社内エンジニアのレベルが低いからやめるとのこと。

## エンジニアは転職すべきなのか
本題になります。
私も友人の話と似たような環境に置かれています。
ただ、友人との考え方と根本的に違うのは会社の体制や上司、社内エンジニアには何の興味もないということです。
エンジニアである以上、転職してもやるべきことは変わらず、最適なものを作り続けることでしかないですし
今の世の中、職場を変えずとも自分から動けばいくらでもコミニティが存在します。

給料をあげたいから。という理由であれば話は簡潔で終わりになってしまうのですが
そうではなく、エンジニアのキャリアパスとして私の考えが甘く環境を変えることで得られることってすごい大きいよ。ってことであれば皆様のご意見をいただきたいです。
【Swift】型を使うという意味を考える (チェック処理を書くよりも型でチェックを)

Swiftが静的型付け言語であるという特性を活かす方法として
コンパイラチェックがあります。

# 例

例えば、下記のような例を考えます。

```swift

enum UserType {
    case free
    case paying
}

struct User {
    let id: Int
    let name: String
    let type: UserType
}

func sayHello(user: User) {
    guard case .paying = user.type else { return }
    print("ようこそ！")
}

let free = User(id: 1, name: "1", type: .free)
let paying = User(id: 2, name: "2", type: .paying)

sayHello(user: free)
sayHello(user: paying)

```

sayHelloメソッドでUserTypeによるチェックをしています。

こういう風にしてしまうと

- 毎回チェック処理が走る
- コアのロジックに余計な処理な混じる
- テストを書く必要がある

などが起きます。

これを型を活かす例を考えてみます。

```swift

protocol WelcomeUser {}

struct FreeUser {
    let id: Int
    let name: String
}

struct PayingUser: WelcomeUser {
    let id: Int
    let name: String
}

func sayHello<U: WelcomeUser>(user: U) {
    print("ようこそ！")
}

let free2 = FreeUser(id: 1, name: "1") // Argument type 'FreeUser' does not conform to expected type 'WelcomeUser'
let paying2 = PayingUser(id: 2, name: "2")

sayHello(user: free2)
sayHello(user: paying2)
```

こうすることでWelcomaUser以外は引数に設定することができなくなり

- コンパイラが代わりにチェックをしてくれるのでテストを書く必要がなくなる
- メソッドがコアのロジックに集中できる


などがあります。


今回はとてもシンプルな例ですが
処理が複雑になればなるほど
チェック処理が増え
何をするものなのかがわかづらくなり
理解するのに時間がかかってしまうこともあります。

※もちろん処理を分割してシンプルにしていく必要はありますが

またテストケースも増えていくため
テストを書くコストとメンテナンスのコストも増えます。


# まとめ

型を活用するシンプルな例を紹介しました。

言語が持つ特性を活用することでより良いコードが書けるようになるのは
この言語を使用している意義が感じられて個人的には気持ちが良いなと思いました:smile:

ぜひ言語の良さをどんどん活かしていきましょう。:muscle_tone1:
Twitterから特定のユーザのつぶやきをWordCloud化する

# はじめに
これやりたーい！
そのうちCentOSに移してダッシュボードに使うけどまずはローカルでできないとね！
![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/5f1de05f-e0c8-7544-5e4c-c6eabe5b2080.png)
（※今回の完成品から）えーなにこれ、まるでニチアサの人みたいやん...これは誤解だ！:innocent:

# 参考
[Python Twitterからツイートを取得してテキスト分析(wordcloudで見える化)](https://qiita.com/kngsym2018/items/3719f8da1f129793257c)

# 環境
・Windows10
・VSCode

# tweepyのインストール
```text:\OneDrive\ドキュメント\Project\Python
> pip install tweepy
```

# APIKeyの取得
[【2019年1月最新版】新しくなったTwitterのAPIの登録方法と使い方。Developer登録をしてAPI keyを取得するまでの手順を公開！RailsもPythonも対応可能！](https://www.torikun.com/entry/twitter-developer-api/)

## 電話番号の入力欄に出てくる「+81」ってどういう意味？
[電話番号の入力欄に出てくる「+81」ってどういう意味？](https://kanntann.com/the-meaning-of-81)

## twitterの設定で電話番号を登録
認証SMSが届かないのはこれのせいだったか...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/21104b80-0603-bd6b-514e-5fc1fefa82a6.png)

## 使用目的
```text:使用目的は英語で300字を書かないといけない
TwitterのAPIの使用理由
ツイートとかユーザーを分析するんですか？もしそうならどうやってやる予定ですか
ツイート、リツイート、ファボをしますか？やるならどうやってやる予定ですか？
どうやって分析したツイッターデータを表示させますか？

I am trying to create a dashboard using a web app. I want a word cloud of tweets as one of the dashboard UI.
Morphological analysis of the user's tweets. Analysis is done in python.
I do not tweet, retweet or fav. It will be used as read only.
I analyze the user's tweet once a day and output it as a still image. Images output as Word Cloud will be displayed on the Web dashboard.
```

# Mecabのインストール
1発入れれば済むものなので省略。特に迷うものではなかった。
[64Bit版Windows10でMecabをインストールする方法](https://toolmania.info/post-9815/)

# WordCloudのインストール
```text:\OneDrive\ドキュメント\Project\Python
> pip install wordcloud
```

# tweepyでサルベージ

[ソースはGithubに](https://github.com/duri0214/Python/tree/master/Twitter)

```text:output.txt
RT @yoku01124679: 太陽の王子・・・ではなく太陽の子の仮面ライダーｂｌａｃｋに助けられたのは後の初代プリキュアのキュアブラック https://t.co/S9bGgLwcIS
@sa_ka_tu すごいタイヤのあと
だめなときはだめか　寝よう
RT @qlius: タピオカを通電させて音楽奏でてるの笑っちゃった https://t.co/gDwU5nVZgK
"大昔のサザエさん第1話ってすげぇなこれ 剥き出しの刃って感じする
https://t.co/AfMKzZ224u"
遠くに見える工場地帯（？）が興味深い https://t.co/RekEc1ZIrY
寝具選びは難しいよなあ　ちょっとやそっと寝ただけじゃわからんな
オルデンドルフ...ドイツの船の会社か
RT @IAMFREE2002: 曲が頭に入ってこない https://t.co/ZFYIXlC2aC
名古屋って蕎麦屋少ないよなぜったい...
```
![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/5f1de05f-e0c8-7544-5e4c-c6eabe5b2080.png)
引数の追加に強い呼び出し規約cdecl

今日、初めて気づいたのですが、
cdelcの関数の場合、
引数を過剰に与えて呼び出してもOKなんですね。

## cdeclとは？

https://ja.wikipedia.org/wiki/%E5%91%BC%E5%87%BA%E8%A6%8F%E7%B4%84#cdecl

1. 呼び出し側で引数をスタックに右から積む
2. call
3. 呼び出し側でスタックをポップする

右から積んでいるので、呼び出された側は、右側に引数が追加されても気づきません。

DLLのインターフェースを変更したときに、あれ？なんでこれ呼び出される側を書き換えていないのに動くんだろう？と気づきました。
grepコマンドでクォートで囲っているのってなんなんだろうと思って

# 経緯

- エンジニア3年目にしてやっとLinuxに触るようになったのですが、基本的なコマンドの一つの `grep` について一個疑問がありました。
- 全然大した話ではないのですが、 `grep` コマンドへの引数として渡している文字列について、クォートで囲っているのとそうでないのがあって、しばらくどういう使い分けなのかわからずに先人のコマンド証跡を真似ていました。
- でもいざ調べるとすぐわかりました。やはりすぐ調べないとですね…。

# 使い分け

- 以下の使い分けが必要ということでした。
  - 検索文字列に空白が含まれる場合：シングルクォートまたはダブルクォートで囲む
  - 検索文字列に空白が含まれない場合：囲む必要無し

# どういう場面が該当するか

## タイムスタンプを検索するケース
- 「空白が含まれるってどういう場面か」という話ですが、自分の実行していた `grep` コマンドの証跡を見てみると、ログファイルを検索していたんですね。
- ログファイルなので、多くの場合タイムスタンプが付いていると思いますが、それが `2019-04-20 13:30:00`みたいな形式だったため、バッチリ該当していました。

## 所有者と所有グループを検索するケース
- これはググった時にヒットしたページに記載があったのですが、 `ls -l` コマンドを打った時の出力に検索をかけるケースも該当します。
- 詳しくは参考リンクを貼りますので、そちらでご確認ください。

# 参考
- [【 grep 】コマンド（応用編その1）――空白を含む文字列を検索する／正規表現を使って検索する](https://www.atmarkit.co.jp/ait/articles/1604/13/news022.html)
GPU マイニングをはじめて 2 年経ったので振り返る(2019 年 4 月 20 日)

GPU マイニングをはじめて 2 年が経ちましたので振り返ってみます. 
振り返るのは 2018/04 ~ 2019/04 の期間です.

![1080ti-3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/ef01e454-dbfb-a958-2ba5-d5d39e16398b.jpeg)


昨年度はこちら.

GPU マイニングをはじめて 1 年経ったので振り返る(2018 年 4 月 20 日)
https://qiita.com/syoyo/items/b549c33552fd169f0ca6


> 2018 年 4 月 20 日時点では, 29 MH/s で 0.00403 ETH/day 程度と 1/10 の収益となりますが, ETH 自体の価格が 10 倍くらいになっています(1 ETH 60,000 円ほど).

2019 年 4 月 20 日時点では, 29 MH/s で 0.0023 ETH/day と, 昨年から 1/2(2017 年 4 月 20 と比べて 1/20)になってしまいました. 1 ETH 19,000 円ほどなのでかなり残念です(日本円にすると 42 円/day くらい).

参考までに, Radeon VII を 120W くらいに powerlimit で 67 MH/s で 0.2 mBTC/day(1.08 USD/day)くらいです.

ETH は ProgPoW 移行に期待でしょうか. 2018 年後半は RVN(Ravencoin), Grin/Beam が人気でしたね.

## 運用ログ


2018/4~7 月 : 6 月多少盛り返すも, 緩やかに日々下落. GPU 代, 電気代を考慮すると赤字のライン.

6 月 : 0xBitcoin ので 1080 Ti で 400~500 円/day の収益. しかしその後 FPGA mining の台等などにより, 0xBitcoin は GPU でマイニングは向かない通貨になりました.

9 月. Lyra2REv2 ASIC マイナー(Dayun Zig)が登場し, Monacoin の GPU マイニングが難しくなる 

9 月下旬: NVIDIA RTX 2080 登場.

9 ~ 10 月 : アルトコイン低迷. 1080 Ti でも１日 60 円程度に下落.
 
~ 10 月 : GPU の故障は特になし. たまに XID エラーが出るが再起動すれば治る.


10 月 15 日くらい. Raveon コインの上昇により 1080 Ti で 150 円/day くらいまで回復. AMD VEGA は loki, haven がアツイ. コイン価格が 1 日で +50 % 上昇とか.

amdgpu pro 18.30 ドライバで Linux 上でやっと Windows のようにハッシュレート低下せず効率的に Monero などがマイニングできるようになる.


2019/1~3 月. 低調が続くが, 少しずつ回復基調

2 月. 6500 円くらいの激安 RX470 GPU が市場に出回る.

冬到来! RX470 8GB マイニングエディションと ROCm TensorFlow で, GPU 機械学習をはじめよう(CIFAR10 7,600 examples/sec @ 88W)
https://qiita.com/syoyo/items/c6bc6dd4efbc10049640

3 月. 1080 Ti のファンが一つ故障. ファンを自力リプレースして修理.

3 月. raveoncoin が 5 円台に回復. 

三月後半からそれなりに収益は出るようになってきた感がある. 三月後半に ravencoin 7 円台.

Radeon VII 発売. eth で 67 MHs @ 120W 出てよい.

4/2: bitcoin 突然の 20% 近い暴騰. 47 万円 -> 55 万円くらいに.

## GPU の障害について

通年で 10 ~ 12 枚ほど運用していましたが, 2018 年は以下の障害が発生しました.

* 1 x 1080 Ti(新品)のファンが一枚故障(ファンをリプレースして解決)
* 1 x TITAN X(Pascal) (中古, 水冷運用)が故障(2019 年 4 月はじめごろ). 22 ヶ月ほど稼働してくれました.
* 1 x RX 470(新品) HDMI が出ない. チップ自体は動いて OpenCL 動作はする.

新品で調達した GPU は, チップ自体が故障にはならないので, mining など compute 用にまだまだ活用できています.
中古の TITAN X(Pascal) が, 水冷運用していたのですが故障してしまいました(全く認識しない. 自然故障?).  とはいえ, 調達したのは 2017 年 6 月ごろであり 22 ヶ月稼働したので, 元は取れたかもしれません.
 
## まとめ

* Radeon VII マイニング性能よい(が, 機械学習用途では ROCm の成熟度がまだまだで, 機械学習用途としての実戦投入はもう少し様子見)
* TITAN X(Pascal) の水冷ブロックの活用先をみつける

新品の GPU は, 少なくともチップに故障はなく 2 年は稼働しているものもあるので, 以外と最近の GPU は故障しないかなという印象でした(powerlimit して運用前提).

今年は, GPU クラスタでリアルタイムレイトレーシングしたり, 機械学習したりする案件が出てきているので, より規模を拡張したいと考えています.

GPU クラスタを設置できる土地と電気容量がほしい.
三項演算子で書いた式の戻り値を、配列の要素として追加しようとしたが、<<メソッドを使っていたために少し詰まった

# 経緯

- 配列に要素を追加するときは、 `<<` メソッドを使っていたのですが、表題の件で2~3分詰まったので投稿します。

# サンプルコード

- 一つ目の要素追加では `obj.nil?` の結果が配列に追加されてしまいます。
- 三項演算子で書いた式の戻り値を追加したい場合は、二つ目のように()で囲むか、三つ目のように `push` メソッドを使う必要があります。<br>

```sample001.rb
obj = nil
array = []

array << obj.nil? ? 'nnn' : 'aaa'
array << (obj.nil? ? 'nnn' : 'aaa')
array.push obj.nil? ? 'nnn' : 'aaa'

puts array
```

# 実行結果

```
$ ruby sample001.rb
true
nnn
nnn
```

# 参考
- [プロを目指す人のためのRuby入門](https://www.amazon.co.jp/dp/4774193976/ref=cm_sw_em_r_mt_dp_U_oQxQCbN06P698)
  - p.88 `<<` メソッド
  - p.116 `push` メソッド
How to import anaconda environment into Pycharm

*This is a reminder for my self and hopefully can be useful for other people.*

# Installation
I highly recommend you to install [Anaconda](https://www.anaconda.com/distribution/) if you want to use Python because you can barely do anything without additional packages. Anaconda has almost everything you would need in one package, so you don't need to worry about what to install.

Although Anaconda comes with [Spyder](https://docs.spyder-ide.org/index.html), a free integrated development environment (IDE) suite for scientific use, you may also want to use [Pycharm](https://www.jetbrains.com/pycharm/download/#section=mac),  which is another very popular IDE for python and other programing languages. 

My recommendation is to install Anaconda first, followed by importing its environment into Pycharm. But since it's a little tricky to do this, I left this article to remind me or other people how to do it.

**First, you have to install Anaconda followed by Pycharm following their instructions.** No worries about details, just simply install everything following their instruction which is pretty simple.

# Importing Anaconda environment into Pycharm
*This is written for Mac OS.*
1. Open Pycharm
2. On the menu bar, click **PyCharm** and open **Preferences...**
3. On the left column, select **▼ Project: untitled** [you may have different name here] > **Project Interpreter**
4. You may see very few packages are installed.
<img width="1124" alt="Screen Shot 2019-04-19 at 10.05.48 AM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345318/6967361b-ad3f-08ac-35e6-5c91a93f41eb.png">
5. Click the **gear wheel** icon on the upper right, and click **Add...**
<img width="833" alt="Screen Shot 2019-04-19 at 10.20.00 AM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345318/ec87124f-bbbb-ce5e-d8d4-ebc30d962cb9.png">
6. Select **Conda Environment** on the left column, and select **Existing environment** on the right part.
<img width="1014" alt="Screen Shot 2019-04-19 at 10.21.54 AM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345318/53314992-3ef0-d0a2-8e55-1b91eb293540.png">
7. Click the **...** icon and you can specify the location of the interpreter of Anaconda. Select the pythonw.exe file or similar anaconda exe file. If you have installed different version, the install might be different as well.
<img width="536" alt="Screen Shot 2019-04-19 at 10.25.28 AM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345318/bb7dc398-7851-2139-5714-a8a20a922b29.png">
8. Click **OK**, and you will see those packages came with Anaconda.
<img width="1124" alt="Screen Shot 2019-04-19 at 10.29.19 AM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345318/269c6031-3af5-fa62-8caf-6162e0bceb9b.png">
9. Click **OK** to close the window, and you will be able to use all these packages.
【Gang of Four】Iterator

#Iterator
**[目次](https://qiita.com/Tonkachi0620/items/03986742efbb7e3a9bbe)**
モダンな言語を使用していれば、わざわざ実装することのなさそうなパターンです。

がしかし、標準ライブラリにそのようなモジュールがなかった時代に、先人達が歩んできた足跡をなぞるつもり？で実装してみます。

##目的
集約オブジェクトが基にある内部表現を公開せずに、その要素に順にアクセスする方法を提供する。

（Listのことをしっかり定義するとこんな表現になるんですね...）

##構成要素
・Iterator 要素に順番にアクセスしたりするための抽象クラス
・ConcreteIterator Iteratorクラスの具象クラス
・Aggregate Iterator型のインスタンスを生成するための抽象クラス
・ConcreteAggregate Aggregateクラスの具象クラス

##実装
JavaのIterator的なものを実装してみます。
**Aggregate**と**ConcreteAggregate**はどんな実装をしていつ使うがやろう。
ジェネリクス型でIteratorを実装すれば不要だと考える。

###Iterator 要素に順番にアクセスしたりするための抽象クラス

```Iterator.kt
package iterator

interface Iterator<T> {
    var index: Int
    var list: ArrayList<T>

    /**
     * index番目の要素を取得する
     */
    fun elementAt(index: Int): T

    /**
     * まだ要素が残っているかを確認する
     */
    fun hasNext(): Boolean

    /**
     * 次の要素を取得する
     */
    fun next(): T

    /**
     * 要素を追加する
     */
    fun add(element: T)

    /**
     * index番目の要素を削除する
     */
    fun remove(index: Int)
}
```

###ConcreteIterator Iteratorクラスの具象クラス

```ConcreteIterator.kt
package iterator

class ConcreteIterator<T>(vararg elements: T): Iterator<T> {

    override var index = 0
    override var list = ArrayList<T>()

    init {
        list.addAll(elements)
    }

    override fun elementAt(index: Int): T {
        return list[index]
    }

    override fun hasNext(): Boolean {
        return index != list.size
    }

    override fun next(): T {
        return list[index++]
    }

    override fun add(element: T) {
        list.add(element)
    }

    override fun remove(index: Int) {
        list.removeAt(index)
    }
}s
```

###使う人

```Client.kt
package iterator

class Client {
    init {
        val strIterator = makeStrIterator()
        while(strIterator.hasNext()) {
            println(strIterator.next())
        }

        val intIterator = makeIntIterator()
        while (intIterator.hasNext()) {
            println(intIterator.next())
        }
    }

    private fun makeStrIterator(): Iterator<String> {
        val iterator = ConcreteIterator("いち", "に", "さん")
        iterator.add("よん")

        return iterator
    }

    private fun makeIntIterator(): Iterator<Int> {
        return ConcreteIterator(1, 2, 3)
    }
}
```

###出力結果
```
[out-put]
いち
に
さん
よん
1
2
3
```

以上で、先人の苦労を知ることができました。
NSubstituteのForPartsOf<>でハマったのでメモメモ。。。

# UT書いててハマった！！

UT書いてて、**Substitute.For<>**と**Substitute.ForPartsOf<>**の違いがよく分かっておらずハマりました。
##### NSubstituteって、あんまり日本語で書いた文献がなくて、スッと答えにたどり着きたいのに時間がかかるんだよなぁ。。。結局公式ドキュメントを見て、細かく仕様を理解しようとするっていう（ホントはこのやり方がが正しい←）

ということで、**NSubstitute**について少し。

# .NetにおけるMockライブラリNSubstitute

公式のドキュメントには、Nsubstituteとはなんぞやと以下のように書いてありました。

[NSubstitute](https://nsubstitute.github.io/)

> A friendly substitute for .NET mocking libraries


> 「.NETモックライブラリのフレンドリーな代替品」

※みんなの先生に訳していただきました。先生ありがとうございます。

雰囲気でなんとなく分かりましたね。とにかくフレンドリーなんです。次にいきましょう。（適当ですみません。）


**Substitute.For<>**は「[Creating a substitute](https://nsubstitute.github.io/help/creating-a-substitute/)」に
**Substitute.ForPartsOf<>**は「[Partial subs and test spies](https://nsubstitute.github.io/help/partial-subs/)」に
それぞれ記載があります。目的別に目次が分かれているんですね。


# Substitute.For<>

こんな感じで書き方が紹介されています。
>
```
var substitute = Substitute.For<ISomeInterface>();
```
This is how you’ll normally create substitutes for types. Generally this type will be an interface, but you can also substitute classes in cases of emergency.

差し替える対象は基本はInterfaceなんですが、緊急事態には普通のclassでも差し替えられるんですね。どんな時を思い描いているのでしょうか。緊急事態って。


``` cs
  // 例） IsomeInterfaceのGetIntValue()メソッドの結果を1に差し替える
  substitute.GetIntValue().Returns(1);
```
こんな感じで、Substitute.Forしたインターフェースが実装しているメンバ関数の結果を差し替えることができます。


# Substitute.ForPartsOf<>

> Partial substitutes allow us to create an object that acts like a real instance of a class, and selectively substitute for specific parts of that object. 

「部分的代替はあるクラスの実際のインスタンスかのように振る舞うオブジェクトを生成することができて、選択的にオブジェクトの一部を差し替えることができますよー。」

とな。

Substitute.For<>がクラスを丸ごと差し替えるのに対して、Substitute.ForPartsOf<>は部分的にクラスのメソッドの結果を差し替えるわけですね。

## そして、やらかす。

じゃあ、おんなじ感じっしょーと既にSubstitute.ForPartsOf<>で定義されていたインスタンスに対してメソッドの結果の差し替えを行おうとしていました。



``` cs
 // あかーん例
 var substitute = Substitute.For<ISomeInterface>();
 substitute.GetIntValue().Returns(1);
```

よしよし、コンパイルエラーも出ないしOKっしょ。とテスト実行してみると、失敗。
差し替えが行われず、実際のインスタンスが使われてしまいました。

# 改めて公式ドキュメントへ

ムムム。。。と思い、公式ドキュメントを改めて眺めてみると、

>
If we had not used Configure() here before .ReadFile()（差し替えたいメソッド） then the real ReadFile method would have executed before we had a chance to override the behaviour. In some cases this may not be a problem, but if in doubt make sure you call Configure() first so NSubstitute knows you are configuring a call and don’t want to run any real code.

「差し替えたいメソッドの前に**Configure()**ってのを書いておかないと、動作をoverrideする前に実際のメソッドが実行されちゃうかもしれないよー。問題にならないケースもあるけど、確実に差し替えたいなら、**Configure()**ってのをとりあえず付けといて。そしたらNSubstituteは実際のコードを呼んで欲しくないんだなーって分かるから！」

そうなのかぁー。**Configure()**ってのが必要だったのね。。。失敬、失敬。


と思い、実際に書いてみると「そんなメソッド知らん」とコンパイルエラー。

>
The Configure() method is only available in NSubstitute 4.0 and above. For verisons prior to 4.0 we need to use When .. DoNotCallBase described below.

「**Configure()**は、NSubstitute 4.0以降しか使えないよ。それより前のバージョンの人は**When .. DoNotCallBase**を使ってね☆」


**When .. DoNotCallBase**を使って、無事にメソッドの差し替えができましたとさ。


## つぶやき

>
partial substitutes are not generally recommended

一般的には非推奨みたいです。
**Substitute.For<>**の方を使えってことなんですね。