OmniAICreator/Qiita-1.07M huggingface dataset:
PlayFramework2.6 + IntelliJ で開発しようとしたら、パッケージダウンロードで失敗した

# 概要
Scala + Play でアプリを作ってみようとしたら、

```terminal

[warn] 	::::::::::::::::::::::::::::::::::::::::::::::
[warn] 	::              FAILED DOWNLOADS            ::
[warn] 	:: ^ see resolution messages for details  ^ ::
[warn] 	::::::::::::::::::::::::::::::::::::::::::::::
[warn] 	:: com.typesafe.sbt#sbt-web;1.4.3!sbt-web.jar(doc)
[warn] 	:: com.typesafe.sbt#sbt-web;1.4.3!sbt-web.jar(src)
[warn] 	:: com.typesafe.sbt#sbt-native-packager;1.3.2!sbt-native-packager.jar(src)
[warn] 	:: com.typesafe.sbt#sbt-native-packager;1.3.2!sbt-native-packager.jar(doc)
[warn] 	::::::::::::::::::::::::::::::::::::::::::::::
[error] sbt.librarymanagement.ResolveException: download failed: com.typesafe.sbt#sbt-web;1.4.3!sbt-web.jar(doc)
[error] download failed: com.typesafe.sbt#sbt-web;1.4.3!sbt-web.jar(src)
[error] download failed: com.typesafe.sbt#sbt-native-packager;1.3.2!sbt-native-packager.jar(src)
[error] download failed: com.typesafe.sbt#sbt-native-packager;1.3.2!sbt-native-packager.jar(doc)
```
↑みたいなエラーが出て、最初の依存関係解決に失敗し、2日ほどハマった。
以下、今回のケースでの解決手順。

# 環境およびバージョン情報
- OS: OS X Yosemite
- sbt: 1.1.2
- scala: 2.12.4
- play: 2.6.12
- IntelliJ: IntelliJ Community 2017.3.5

# 環境構築でやったこと
各種ツールのインストール手順は省略。

1. sbtインストール
1. IntelliJインストール
1. `sbt new playframework/play-scala-seed.g8`[^1]で、playアプリの雛形を作成
1. IntelliJで、作成した雛形をプロジェクトとしてインポート
1. 概要のエラーが発生し、プロジェクトのインポート失敗

[^1]: [activatorはEOLを迎えた](https://qiita.com/TKR/items/9200ca19e14376b305b5)らしいので、sbt + giter8テンプレートで生成している。

# 解決方法
`download failed: com.typesafe.sbt`というエラーメッセージを見る限り、依存関係の衝突とかややこしい問題ではなく、単純にダウンロード失敗しているっぽい。
ネットワークの問題ではなさそうだった(ブラウザとかcurlとかは使えた)ので、何かしらツールの問題を疑った。

上記エラーメッセージでググってみたところ、まさに同じエラー内容でIssueが上がっていた。
https://github.com/sbt/sbt-native-packager/issues/1063

内容をおっかけたところ、どうやら[sbt側にバグがあって、それを解消するためのワークアラウンドが必要](https://github.com/sbt/sbt/issues/3432)っぽい。

sbt-native-packagerのIssueでは「`resolvers += Resolver.sbtPluginRepo("releases")`を入れればおk」的なことが書かれているが、「どこに書けば良いのか」が明記されていない。
→どうやら、build.sbtに入れれば良さげ。

```scala:build.sbt
lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.12.4"
resolvers += Resolver.sbtPluginRepo("releases") // ←追加部分

libraryDependencies += guice
libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "3.1.2" % Test
```
自分の場合は、`scalaVersion`の直後に入れたら、IntelliJでのインポートが成功した。
この場所じゃないとダメなのか、どこでも良いのかまでは確認していない。
AWSでIAMを設定する。

AWSのIAMの設定方法を記します。

<img width="309" alt="スクリーンショット 2018-03-29 1.21.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/7cdf901a-c81f-5b79-77f0-a8b914195034.png">
AWSのサービス一覧からIAMを探します。


<img width="197" alt="スクリーンショット 2018-03-29 1.45.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/9abe56f8-4f97-6337-5a73-5b026375282b.png">

左カラムからユーザーを選択します。

<img width="438" alt="スクリーンショット 2018-03-29 1.57.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/cd5c1704-c75b-9919-e228-364991e197e6.png">
ユーザー追加を選択します。

<img width="608" alt="スクリーンショット 2018-03-29 1.58.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/fa62d94e-5599-3e0d-3d5a-30200b660284.png">
ユーザー名を設定します。



<img width="879" alt="スクリーンショット 2018-03-29 2.00.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/965c5d0c-8cb0-b971-d243-26cf589f067b.png">

アクセスの種類を選択します。
Dockerでコンテナの内部IPを調べる

追記 (2018/10/30)
コメントいただいてるやり方が一番よさそうです

#前提
以下のdocker-compose.ymlのように、"app-tier"ネットワークにPHP(Laravel)コンテナとMariaDBコンテナが作られる設定。
PHPコンテナ内のDB接続情報ファイル(私の場合Laravelだったので.env)にMariaDBコンテナの情報を書かなきゃいけないが、DBユーザ名とパスワードはdocker-compose.ymlに書いてる通りrootでいいが、IPアドレスがわからず詰まったのでメモ。

```docker-compose.yml
version: '3'

networks:
  app-tier:
    driver: bridge

services:

  php:
    build: ./php
    volumes:
      - ./php/src/:/var/www/html/
      - ./php/vhost.conf:/etc/httpd/conf.d/vhost.conf
      - ./php/php.ini:/usr/local/etc/php/php.ini
    ports:
      - '80:80'
    command: cd /var/www/html && composer install
    command: /usr/sbin/httpd -D FOREGROUND
    networks:
      - app-tier

  my-mariadb:
    image: mariadb:latest
    restart: always
    volumes:
      - ./db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: root
      MYSQL_PASSWORD: root
    ports:
      - "3306:3306"
    networks:
      - app-tier
    
```

##手順１
普通にdockerコンテナ起動

```:shell
docker-compose up -d
```

##手順2
コンテナID取得

```:shell
docker ps

CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                    NAMES
5a329e211caf        laravel5_php                "/usr/sbin/httpd -D …"   13 minutes ago      Up 13 minutes       0.0.0.0:80->80/tcp       laravel5_php_1
c7abb13d9a8b        mariadb:latest              "docker-entrypoint.s…"   13 minutes ago      Up 13 minutes       0.0.0.0:3306->3306/tcp   laravel5_my-mariadb_1
```

##手順3
DBサーバーにbashで入る

```:shell
docker exec -it c7abb /bin/bash
```

##手順4
DBサーバー上のシェルで自身のIP取得

```:DBコンテナ内のshell
root@c7abb13d9a8b:/# hostname -i
172.20.0.3
```
または

```:DBコンテナ内のshell
root@c7abb13d9a8b:/# cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.20.0.3	c7abb13d9a8b
```

DBコンテナの内部IPが172.20.0.3とわかったので、PHPコンテナから接続先のDBコンテナを指定できる。


ただしdocker-compose downでコンテナを削除したあと再度コンテナを生成するとIPが変わる気がする。
「dockerのコンテナに固定IPを振る」https://qiita.com/reflet/items/e10442c16834a9ce15b3
で解決ですね

(追記)コメントにある解決方法の方がスマートです
numpy.savetxtで標準出力

何かしらの処理の結果得られたnumpy配列を標準出力に流したい、という時の方法。
Python2系と3系で微妙に違ったので両方書きます。

# Python2系
numpy配列をファイルに保存する関数として``numpy.savetxt()``がありますが、
引数の保存先に``sys.stdout``を指定することでnumpy配列を標準出力に流すことができます。

- サンプルコード

```python:save_stdout_2.py
import sys
import numpy as np

X = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
np.savetxt(sys.stdout, X)
```

- 実行

```shell
$ python save_stdout_2.py
1.000000000000000000e+00 2.000000000000000000e+00 3.000000000000000000e+00
4.000000000000000000e+00 5.000000000000000000e+00 6.000000000000000000e+00
```

# Python3系
基本的には2系と同じなのですが、そのまま``save_stdout_2.py``を実行すると次のようなエラーが出ます。

```shell
$ python save_stdout_2.py
...
TypeError: Mismatch between array dtype ('float64') and format specifier ('%.18e %.18e %.18e')
```

以下によると、どうやらPython3系において``numpy.savetxt()``はバイナリモードで書き込むことを前提としているらしいです。
https://stackoverflow.com/questions/35372829/numpy-savetxt-resulting-a-formatting-mismatch-error-in-python-3-5
> savetxt opens the file in wb mode, and thus writes everything as bytes.

そこで出力先を``sys.stdout.buffer``に変更します。これはバイナリデータの読み書きを行うオブジェクトです。

- サンプルコード

```python:save_stdout_3.py
import sys
import numpy as np

X = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
np.savetxt(sys.stdout.buffer, X)
```

- 実行

```shell
$ python save_stdout_3.py
1.000000000000000000e+00 2.000000000000000000e+00 3.000000000000000000e+00
4.000000000000000000e+00 5.000000000000000000e+00 6.000000000000000000e+00
```

Python2系と同じ出力を得ることができました。

# おまけ－標準入力
``np.loadtxt()``の読み込み先を``sys.stdin``にすることで標準入力の文字列をnumpy配列に入れることができます。

- サンプルコード

```python:load_stdin.py
import sys
import numpy as np

X = np.loadtxt(sys.stdin)
```

これを使えばシェルのフィルタコマンドでは困難な処理もPythonで書くことができます。
AngularやIonicでVSCodeでの開発効率をあげるAngular Switchの使い方

# はじめに

Xcodeでヘッダファイルとソースコードを切り替えるのにショートカットがありますね。
`Cmd` + `Ctrl` + `↓` or `↑`

それをVSCodeでソースコードの`.ts`と`.html`をささっと切り替えを行いたいですね。

# インストール

https://marketplace.visualstudio.com/items?itemName=shinriyo.ionic-switch

ここへ遷移し、Installボタンを押下してインストールをしましょう。

# 設定

インストールをしたら`command` + `Shift` + `P`　を押下すると、上方に枠が出てきますので、

<img width="605" alt="Screen Shot 2018-03-29 at 1.43.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/11951/48e3eee3-1d59-1771-f9aa-9258f8d9cebc.png">

`>keyb`を入力すると、上に出て行きます。

以下のコマンドをキーバインドに設定しましょう。

```
 { "key": "cmd+ctrl+up", "command": "extension.ionSwitchHTML", "when": "editorTextFocus" },
    { "key": "cmd+ctrl+down", "command": "extension.ionSwitchTS", "when": "editorTextFocus" },
```

<img width="1050" alt="Screen Shot 2018-03-29 at 1.43.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/11951/6ca7b962-d6af-0a97-1388-fbddb40fbead.png">

## 使用方法

例えば`list.html`のファイルを開いた状態。

<img width="627" alt="Screen Shot 2018-03-29 at 1.46.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/11951/e2bf0496-6393-ddca-e337-05640ed1cf6f.png">

この状態で、
`Cmd` + `Ctrl` + `↓`を押下します。

するとパッと`list.ts`のファイルにスイッチします。

<img width="552" alt="Screen Shot 2018-03-29 at 1.46.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/11951/89bac7e2-0c9e-e60c-747f-e41b9a41262a.png">

逆にこの状態で、`Cmd` + `Ctrl` + `↑`を押下します。
すると、`list.html`にいけます。
Google Chromeでの多言語対応Webページのテスト方法

# 当記事について
## 経緯
個人で開発して運営しているWebサービスの多言語対応を行った際に、英語圏のブラウザから閲覧した際の挙動をテストした。
## バージョン情報

- Google Chrome
    - Google Chrome 65.0.3325.181

# 手順
1. Google Chrome右上の縦三点リーダーメニューから`設定`を押下
1. 設定ページの検索バーにテストしたい言語を入力して検索
1. テストしたい言語の右にある縦三点リーダーメニューから`トップに移動`を押下 (言語がない場合は、`言語を追加`を押下)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215954/689bc38b-6786-bf97-1632-10b18e2bea63.png)
エンジニアによるエンジニアのための UX デザイン開発実践ガイド 導入編

# はじめに
僕はエンジニア歴2年ちょっとのベンチャーで働く Rails エンジニアです。ひょんなことから、上司に勧められて UX の専門大学院に半年間通って UX デザインを体系的に学びました。
なので、エンジニア目線から見た UX デザインを少しでもエンジニアの人っぽく伝えるために、この記事を書きました。内容は初歩的なことが多いですが、エンジニアの人が参考にしてもらえると嬉しいです。
あと、長くなってしまったので、結論・要点を各章の前半まとめました。サマったものだけ読みたい人はどんどん飛ばし読みしちゃって下さい。

# デザインとは
まずは「デザイン」とは何かを注意する必要があります。

デザインとは**問題をどう捉えるかであり、どうやって解くかを考えることである**と学びました。

エンジニアをやっていると、「デザイン」と聞くと「UI」とか「見た目」っていうのを自然と想像しちゃうと思います。（僕がそうでした。。。）
しかし、ここで扱っている「デザイン」とは、直訳の「設計」っていう言葉の方がよりしっくりきます。その「設計」をするために UX のデザインをしたり、 UI のデザインをしたりし、 IA のデザインをしたりします。つまり、 UX, UI, IA などは問題を解決する1つのアプローチにすぎないということです。
そして、デザインが完璧な状態にになることはほぼないのです。それは、デザインの対象は刻々と変わってしまうからです。どういうことかと言うと、時間が経てばユーザーのセグメントも変わるし、ユーザーの求めていることも変わっていくということです。そして、その中で新たな問題と解決方法を考える必要があるのです。

なので、デザインこそ、エンジニアの大好きなリーン開発やアジャイル開発などの細かいイテレーションの改善と相性が良いのです。

# 結論
実際のプロセスの説明に入る前に結論から話します。 「UXD(UX デザイン)って簡単に言うと何よ？」って人は、ここだけ読んでなんとなく理解して下さい。

簡単に言うと、 UXD は**体験価値 = 提供価値**を目指しています。

そのためには、ユーザーの利用状況を把握ながら作ることがとても重要です。単純な画面やプロダクトをデザインするのではなく、ユーザーが使っている「時間」と「空間」を考慮に入れるてデザインし、改善を回していくことが UXD であるといえると思います。
下記に UX, UXD　の簡単な説明を箇条書きにしておきます。

- UX
    - ユーザーの主観的な知覚（体験、感情） = 体験価値
    - 利用状況に強く影響される
    - 時間軸があり、サービスの使用中だけにとどまらない

- UXD
    - 「ユーザーにどんな体験をしてもらうか」（= 提供価値）をデザインする
    - 提供価値が繰り返し量産される仕組みをデザインする
    - デザインすることはサービスの使用中だけにとどまらない
    - UXD には「調査」、「分析」、「製作」、「検証」のプロセスがあり、それを繰り返す

# あわせて読みたい

1. [エンジニアによるエンジニアのための UX デザイン開発実践ガイド 導入編](https://qiita.com/Atsss/items/3b610e20fa8d5f830b40)
2. [エンジニアによるエンジニアのための UX デザイン開発実践ガイド 調査編](https://qiita.com/Atsss/items/fa831ec9f6219d182ee5)
3. [エンジニアによるエンジニアのための UX デザイン開発実践ガイド 分析編](https://qiita.com/Atsss/items/bd9fa365c4db54bd7fe6)
4. [エンジニアによるエンジニアのための UX デザイン開発実践ガイド 製作編](https://qiita.com/Atsss/items/09d9b011bfe56855c991)
5. [エンジニアによるエンジニアのための UX デザイン開発実践ガイド 検証編](https://qiita.com/Atsss/items/f17e00493b62d3439412)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134569/23457b2f-8501-6901-038e-fdbf661a6539.png)
addEventListenerで関数に引数を追加してもうまく動かない

#.addEventListenerとは？

ボタンなどの要素にイベントを登録するメソッドのことです。

#使い方

こんな感じで使います。
``要素. addEventListener(イベント名,関数名);``

```index.html
        <button id="add">追加</button>
        <script>
            function addTextNode() {
                var tag = document.createElement('p'),
                    text  = document.createTextNode('OK!');
                document.body.appendChild(tag).appendChild(text);
            }
            var el = document.getElementById('add');
            el.addEventListener('click',addTextNode());
        </script>
```

これを実行すると、
![sample.gif](https://qiita-image-store.s3.amazonaws.com/0/77287/33ff3d09-3a1f-5c1f-9aa4-c330cdefbc9a.gif)

リロードしても、追加ボタンを押下してもOK！が追加されていきませんでした。

```before.html
  var el = document.getElementById('add');
  el.addEventListener('click',addTextNode());
```

```after.html
  var el = document.getElementById('add');
  el.addEventListener('click',addTextNode);
```
addEventListenerの第２引数にある関数のカッコを無くすと、

![sample1.gif](https://qiita-image-store.s3.amazonaws.com/0/77287/f96c3bc3-ce94-ae74-361b-f02707b3a2a9.gif)

何故かうまくいく・・・
VSCodeのフォントにMigMix 1Mを指定しても反映されないときの対処

フォントに「MigMix 1M」を指定しても効かないときは、シングルクオーテーションで囲む。

> "editor.fontFamily": "'MigMix 1M'",

# 参考
[VSCodeのフォントにMigu 1Mを使う - Qiita](https://qiita.com/b2ox/items/2babce6e8c053fc4a0d6)
PHPでURLの文字列操作

スクレイピング周りの作業をしていてURLの文字列操作が面倒で調べてみたところ、
[parse_url](http://php.net/manual/ja/function.parse-url.php)がというのを知りました、[pathinfo](http://php.net/manual/ja/function.pathinfo.php)みたいで便利でした。

# ルートURLを取得する

```php
$url = 'http://example.com/test/test.txt';
$url_info = parse_url($url);
$root_url = $url_info['scheme'].'://'.$url_info['host'];

var_dump($root_url);
var_dump($url_info);
```

```
string(18) "http://example.com"
array(3) {
  ["scheme"]=>
  string(4) "http"
  ["host"]=>
  string(11) "example.com"
  ["path"]=>
  string(14) "/test/test.txt"
}
```

# ベースURLを取得する

こっちはpathinfoを使用

```php
$url = 'http://example.com/test/test.txt';
$url_info = pathinfo($url);
$base_url = $url_info['dirname'];

var_dump($base_url);
var_dump($url_info);
```

```
string(23) "http://example.com/test"
array(4) {
  ["dirname"]=> string(23) "http://example.com/test"
  ["basename"]=> string(8) "test.txt"
  ["extension"]=> string(3) "txt"
  ["filename"]=> string(4) "test"
}
```

## /で終わる場合

```php
$url = 'http://example.com/test/';
$url_info = pathinfo($url);
$base_url = $url_info['dirname'];

var_dump($base_url);
var_dump($url_info);
```

```
string(18) "http://example.com"
array(3) {
  ["dirname"]=>
  string(18) "http://example.com"
  ["basename"]=>
  string(4) "test"
  ["filename"]=>
  string(4) "test"
}
```

**この場合は$urlをそのまま使うこと**

```php
$base_url = (preg_match('/\/$/u', $url) === 1) ? $url : pathinfo($url)['dirname'];
```
WEBページでArtisanコマンドを実行する

Artisanコマンドで作成したバッチをコントローラ等で実行したい。
[Queue](https://readouble.com/laravel/5.5/ja/queues.html)という手段もありますが、そこまで設定する必要がない場合。

```php
exec('php "'.base_path('artisan').'" command:test --env=production > /dev/null &');
```

`--env=production`は参照しているDB等を設定している。
コマンドから実行する場合はWEBサーバーを通さないのでconfigのenv設定が使用されてしまう。

```php
use Artisan;

Artisan::call('command:test', $argument_map_list);
```

はバックグラウンド実行にならないのでタイムアウトの可能性

# 参考

[Artisanコマンドへ--env=testingオプションを指定した場合に、.envファイルをオーバーライドします。](https://readouble.com/laravel/5.5/ja/configuration.html#environment-configuration)
[プログラムによるコマンド実行](https://readouble.com/laravel/5.5/ja/artisan.html#programmatically-executing-commands)
docker上で動かしたwebpack-dev-serverに変更が反映されない

## 発生した問題
Reactのプロジェクトをdocker上でwebpack-dev-serverを起動して動かしていたのだが、ローカルでの更新を行ってもwebpackのコンパイルが走らなかった。コンテナー内のファイルを見ると更新が反映されているようだったので結構ハマった。。

## 解決法
webpackのwatchはファイルシステムが違うとうまく動いてくれない模様。なのでオプションでポーリングを行うように指定する必要がある。

```JS:webpack.config.js
watchOptions: {
  poll: 1000
}
```

## 参考
http://d.hatena.ne.jp/hiro_nemu/20170909/1504966556
ベイズ推定とグラフィカルモデルを受講して思ったこと  2  (DeepLearning)

# さらに考えて思ったこと

1 今の自弁の理解やこの本だとグラフィカルモデルは単純だが、会社や団体の社会の構造みたいに、複数のノードをまとめるTree構造みたいなものを加えると面白い。3次元からN次元。もともとグラフィカルモデルってそういうものなのか？
2 さらに、構造も一定でなく、学校が席替え、会社が組織変更するように、学習の間にランダムまたはある規則で、例えばTreeの重要部分を変えていい推論につながる？

Qiita始めて、やるきあがった。続けていきたい。

[前回はこちらへ](https://qiita.com/rmlhello/items/983ee5b84e59009bc05f) 
[次回はこちらへ](https://qiita.com/rmlhello/items/d0b32258ea1196823260)
moment.jsで開始日～終了日のカレンダー配列を作る

## やりたかったこと
開始日と終了日とを指定して、
各要素が　開始日 <= 要素 <= 終了日　となるようなカレンダー的な配列を作る。

## 最初に書いたコード

```javascript
import moment from 'moment';

const startDate = moment('2020-07-24T15:00:00Z');
const endDate = moment('2020-08-09T08:00:00Z');
const days = moment.duration(endDate - startDate).days() + 1;

const dates = [...Array(days).keys()].map(v => startDate.add(v, 'days'));
console.log(dates);
```
このコードは2箇所ダメなところがある。
1. `moment().add(Number, Object)` は、返り値に計算結果を返すだけでなく、自身の日時も変更する
2. 時刻に関わらず開始日と終了日でその間の日数を計算したいが、開始日の時刻＞終了日の時刻のとき、日数が1日少なくなる

1については公式ドキュメントにきちんと以下のように記述してあった。
>Mutates the original moment by adding time.
https://momentjs.com/docs/#/manipulating/add/

対応策として、`moment().clone()` を使ってオブジェクトをコピーし、`startDate` の日時が変わらないようにする。

2については時刻を切り捨てることで対処する。
`moment().startOf('day')` を使うと、時刻を00:00:00にすることが出来るのでこれを利用する。
https://momentjs.com/docs/#/manipulating/start-of/


## 解決したコード
```javascript
import moment from 'moment';

const startDate = moment('2020-07-24T15:00:00Z').startOf('day');
const endDate = moment('2020-08-09T08:00:00Z').startOf('day');
const days = moment.duration(endDate - startDate).days() + 1;

const dates = [...Array(days).keys()].map(v => startDate.clone().add(v, 'days'));
console.log(dates);
```

```text:実行結果
[ moment("2020-07-24T00:00:00.000"),
  moment("2020-07-25T00:00:00.000"),
  moment("2020-07-26T00:00:00.000"),
  moment("2020-07-27T00:00:00.000"),
  moment("2020-07-28T00:00:00.000"),
  moment("2020-07-29T00:00:00.000"),
  moment("2020-07-30T00:00:00.000"),
  moment("2020-07-31T00:00:00.000"),
  moment("2020-08-01T00:00:00.000"),
  moment("2020-08-02T00:00:00.000"),
  moment("2020-08-03T00:00:00.000"),
  moment("2020-08-04T00:00:00.000"),
  moment("2020-08-05T00:00:00.000"),
  moment("2020-08-06T00:00:00.000"),
  moment("2020-08-07T00:00:00.000"),
  moment("2020-08-08T00:00:00.000"),
  moment("2020-08-09T00:00:00.000") ]
```

無事に所望の配列を得ることが出来ました。
ちなみに、2020/7/24～8/9は東京オリンピックの開催日です。
Node.js スレッドモデルとイベントループとは

# スレッドモデルとイベントループ
大量のリクエストをさばくための処理形式

## スレッドモデル
Requestに対し、Threadを立ち上げて対応
大量に来ると、Request処理待ちが発生する

## イベントループ（Node.js）
QueueでEventLoopを回す（メインのスレッド）
　→Requestをためる
I/O（バックグラウンドのスレッド）

メリット：
前の処理が終わるまで待つ必要がない
デメリット：
処理の終了順番が把握できない
ループをブロックしないプログラミング（NON-Blocking）が必要

#ノンブロッキングな書き方とは
時間の掛かりそうな処理はコールバック関数で書く

```javascript:test1.js
//non blocking
setTimeout(function() {
	console.log("hello");
}, 1000);
console.log("world");
```
結果：helloの処理（表示）を待たずにworldが表示される

```javascript:test2.js
//blocking
var start = new Date.getDate()
while (new Date.getDate() < start + 1000);
console.log("world");
```

結果：helloの処理（表示）を待ってworldが表示される
Selenium-webdriverでブラウザ用ドライバーを指定して動かすよ


# まえがき
Web系システムをテストする際、各ブラウザでテストしないといけず、メンドくさい。。
なので、node.jsを使ってSeleniumによる自動テストを作成中です。

Selenium-webdriverでテストを実行するとき、ブラウザのドライバーを用意しなければならない（ぽい）。
で、用意したものは使わないと意味がないんだけど、どうもググると「インストールする」と書いてばかり・・・・(´・ω・｀)

Selenium-Serverを使う場合はオプションで指定できたと思ったんだけど、Selenium-webdriverだけだとダメなのか？

そう思って色々試したら、ドライバーを指定して利用することが出来たので、その備忘です。

ちなみに、なんでインストールを渋るのかというと、
誰か別の人が作る際に「これ使ってテストしてね」て言うと思うんだけど、
そのときにやってもらう手間を少しでも省きたかったからです。
手順がひとつ増えるごとにやるのがメンドくさくなるじゃないですか・・・・
メンドくさいことは誰しもやりたくないもんね。。。


# ブラウザ用ドライバーをオプションで読み出す
ディレクトリ構成は↓

```
selenium
|   package.json
|   
+---drivers
|       chromedriver.exe
|       geckodriver.exe
|       
+---node_modules
|
\---test
        index.js
```

`chromedriver.exe`はChrome用のドライバー、`geckodriver.exe`はFirefox用のドライバーです。
`node_modules`はさすがに深いので割愛・・・・。

```js:selenium/test/index.js(chromedriver)
const webdriver = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');

let driver = new webdriver.Builder()
    .withCapabilities(webdriver.Capabilities.chrome())
    .setChromeService(new chrome.ServiceBuilder(__dirname+"/../drivers/chromedriver.exe"))
    .build();
```

通常はシステムに設定されたパスからドライバーを探すようですが、
インストールしていないとそのパス上にはドライバーが存在しないので、見つけられずにエラーとなる。

なので、`selenium-webdriver/chrome`の中にある`ServiceBuilder`クラスを生成して、
`setChromeService`で渡してやることで指定したドライバーを使ってくれます。

Firefoxの場合も同様に出来ます。

```js:selenium/test/index.js(geckodriver)
const webdriver = require('selenium-webdriver');
const firefox = require('selenium-webdriver/firefox');

let driver = new webdriver.Builder()
    .withCapabilities(webdriver.Capabilities.firefox())
    .setFirefoxService(new firefox.ServiceBuilder(__dirname+"/../drivers/geckodriver.exe"))
    .build();
```

# IEの場合
IEだと`setChromeService`に該当するようなメソッドがなく、どう指定したらいいものか思考錯誤していたところ、結局PATHに追加するしかないかな、というところに。。(´・ω・｀)

とはいえ、やはりインストールはさせたくない。。

そこで、呼び出し用のファイルを1枚かませることにしました。

```js:selenium/test/ie.js
// ドライバーを設定
process.env['PATH'] = `${process.env['PATH']};${__dirname}/../drivers/;`
```

```bash:呼び出し
mocha test/ie.js test/*.js
```

最初に設定ファイルである`selenium/test/ie.js`を呼び出して、その後に各テストファイルを呼び出す感じに。

これでドライバーを動的に呼び出せるようになりました。

まぁ、実はまだ別のエラーが出てまして動いてはいないんですけど・・・・('A`)
そちらも解決出来たらまた追記します。。。

あと、IE側でやらないといけない設定まわりの記事がありましたので、メモ。

[Selenium (webDriver) と IE11の組み合わせについて](https://qiita.com/gluelan2013/items/6977cde545e2bcf08081)


# あとがき
今回はこれだけ。

Seleniumは何度か挑戦してみたものの、書き方がよく分からなかったり、
そもそもSelenium-serverがうまく動かなかったりで頓挫していました。

今度はちゃんと出来るといいなぁ。。。


# 余談
~~IEドライバーの指定方法がまだ分かってません。。。(；´Д｀)~~
~~`setChromeService`に該当するようなメソッドがなく、どう指定したらいいものかまだソースを漁り中です。。。~~
~~一番問題起こしてくるヤツなのに、、、~~

とりあえず呼び出しができたので追記しました！(/ω＼)
SVAを使い始めるための参考書

# SVAを使い始めるにあたっての参考書
私がAssertionを使い始めた時に参考になったものをリストしておきます

<dl>
<dt>SystemVerilogアサーション・ハンドブック</dt>
Ben Cohenさんの著作の日本語版ですが丸善から出版されてましたが残念ながら絶版です。

SystemVerilogアサーション・ハンドブック   Ben Cohen [Amazon.co.jp](https://www.amazon.co.jp/dp/4621076124/ref=cm_sw_r_tw_dp_U_x_V76UAbTBCMYHR) 

英語版だと4版が出ているようです
SystemVerilog Assertions Handbook, 4th Edition: . for Dynamic and Formal Verification [AbeBooks.com](https://www.abebooks.com/servlet/BookDetailsPL?bi=17812288554&searchurl=tn%3Dsystemverilog%2Bassertions%2Bhandbook%2B4th%2Bedition%26sortby%3D17%26an%3Dajeetha%2Bkumari%2Bben%2Bcohen%2Blisa&cm_sp=snippet-_-srp1-_-title1)

SystemVerilogアサーション・ハンドブックの訳者の一人の方に聞いたら新しい版の訳本を出す予定は無いって言ってました。別の訳者の方がが一時期新しい版の訳本を準備していたらしいけど計画は頓挫したようで現在に至っています。

他にも参考になるものがありますのでまた追加します。

今日はここまで。
サブディレクトリに設置したfuelphpにアクセスできるようにNginxを設定する

`http://example.com/subdir`にアクセスした時に、`/var/www/html/subdir`に設置したfuelphpを動かせるようにしたいと思った時のメモ。

```nginx
   server {
       listen       80 default_server;
       access_log   /var/log/nginx/development.access.log;
       index     index.php index.html;

       # main
       location / {
            root      /var/www/html/;
            try_files $uri $uri/ /index.php;
       }

       # sub
       location ^~ /subdir {
            alias     /var/www/html/subdir/public;
            try_files $uri $uri/ /index.php;

            if (!-e $request_filename) { rewrite ^ /subdir/index.php last; }

            location ~ \.php$ {
                if (!-f $request_filename) { return 404; }
                fastcgi_pass 127.0.0.1:9000;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $request_filename;
            }
        }
   }
```
iOSシュミレーターで通話中などステータスバーを変えたい時のメモ

# はじめに
テザリング時のバグの修正があり実機でテザリングをしなければデバッグできないと思っていたのですが、シュミレーターでもできたのでそれのメモ

# こんな感じになる
これは通話中の時ステータスバーが緑色になるのをシュミレーター上で確認できる
ステータスバーの高さが二倍になる
<img width="368" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/176479/87b60faf-33de-9848-bcad-15a31a04a3cc.png">

# 設定のしかた
一番上のツールバーの中の`Hardware`->`Toggle In-call Status bar`をクリックするだけ
SCNTextのPivotPointを中心に持って来る


### 困ったこと
SCNTextをSCNNodeとして表示したときに思った場所に表示されず、若干のズレが生じた。
その理由はSCNTextを表示させた場合のSCNNodeのPivotPointは底面の中心では無く左下にあるかららしい。
この座標に文字を表示させたいという場合にはちょっと不便・・・。

![IMG_0132.png](https://qiita-image-store.s3.amazonaws.com/0/200963/c7126f4c-601d-a796-ad80-47ccbf0c31c4.png "IMG_0132.png")
この様にデフォルトのまま配置すると原点の右上に文字が表示させる。


### 文字の中心にPivotPointを置きたい
デフォルトのPivotPointは(0,0,0)なのでこれを文字の中心に持って行く。
表示されるテキストの左下の座標はBoudingBoxのmin、右上はBoundingBoxのmaxで取得できる。
SCNNodeのメンバであるpivotはMatrixオブジェクトのためSCNMatrix4MakeTranslationでPivotPointを変更する。

![IMG_0133.png](https://qiita-image-store.s3.amazonaws.com/0/200963/dc93d6a1-37d7-217e-5440-37223d25b7e8.png "IMG_0133.png")

実際のコード

``` Swift
let text = SCNText(string: "Hello", extrusionDepth: 0)
text.font = UIFont(name: "San Francisco", size: 5 )
text.firstMaterial?.diffuse.contents = UIColor.green
let textNode = SCNNode(geometry: text)
        
let (min, max) = (textNode.boundingBox)
let w = Float(max.x - min.x)
let h = Float(max.y - min.y)
textNode.pivot = SCNMatrix4MakeTranslation(w/2 + min.x, h/2 + min.y, 0)
        
scene.rootNode.addChildNode(textNode)
```

### 変更後

変更後は思い通りの位置に表示される様になった。

![IMG_0135.png](https://qiita-image-store.s3.amazonaws.com/0/200963/83565def-c1ec-ff9a-31e9-19e0f9d1c0d2.png "IMG_0135.png")
![IMG_0134.png](https://qiita-image-store.s3.amazonaws.com/0/200963/16d312ce-d39b-2b8b-86ea-73ccef76f225.png "IMG_0134.png")
getMonthで取得したとき、値が少ない！？

#まず、Javascriptで月を取得するとき

Javascriptで現在月を取得するとき、こんな感じになるかと思います。         

```index.html
var d = new Date();
console.log(d.getMonth());
```

ただこれだと、`2`が出力されます。
なんでだろうと思ったら、MDNに書いてありました。


>地方時に基づき、与えた日付の「月」を表す 0 から 11 までの間の整数値。
>0 は 1 月、1 は 2 月、11 は 12 月に対応します。

>[MSD:Date.prototype.getMonth()]
(https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/getMonth "Date.prototype.getMonth()")


ということなので、**getMonth()取得した月に`+1`しないと、現在月が表示されないみたいです。**
【育児用】Slack活用のすすめ

# 要約
Slackの育児用botアイディアです

- 子供の生後日数を数えると便利！
- 発語を記録していくと便利！

技術的な点は概略のみ紹介

# 家庭用のSlackチャンネルでどんなbotを作ったら便利だろうか?
家庭用のSlackチャンネルを作ってさあbotもつくろうか、と思ったときに何をつくったらいいか悩みますよね（僕は悩みました）。
実際に実装して運用し、娘の成長記録におすすめのアイディア(育児用)を2個紹介します。
実装は好きな言語、フレームワークでどうぞ。

# (i) 生後日数カウンター
![counter.png](https://qiita-image-store.s3.amazonaws.com/0/66517/0c1f96d6-1bf4-b77d-e5fb-6bb939900b5e.png)
生後何日目なのかを毎朝投稿してくれます。

当初は[はてなカウンティング](http://counting.hatelabo.jp/)を使って実装フリーで毎朝投稿させていましたが、日数しか出ないので100日を超えたあたりから月齢がすぐにわからなくて不便でした。
赤ちゃんの成長具合は月齢で話をすることが多いので、月の表示があるのは結構重要です。
現在はPythonのライブラリに月日の計算をさせて出力・投稿するのをcronで実行させています。

# (ii) 娘語録
![語録.png](https://qiita-image-store.s3.amazonaws.com/0/66517/39cd912e-595f-1084-ac3c-ec9cc4a9f8f0.png)
見ての通り、娘の発語録をつくりました。
いつ発語したかも記録されているので成長の過程が見やすいと思います。

問題があるとすると、うちの娘はおしゃべりな方だと思いますが喋る内容がいわゆる喃語といわれるような、はっきりと文字に落とせるような発声ではないものが大半なので、記録しかねて内容がなかなか増えないことですね...

もう少し大きくなったら記録ペースもすぐ増えると期待しています。

![Screenshot_20180215-230959.png](https://qiita-image-store.s3.amazonaws.com/0/66517/c18f079c-7bf3-fdf2-1059-c6110e8e062b.png)
記録用、削除用の命令も用意しました。

語録の例ではhttps://qiita.com/sukesuke/items/1ac92251def87357fdf6 に従って、裏側ではPython3系が動いています。
語録のデータを蓄えるためにDBMSとしては軽量なもので良いだろうということでSQLiteを使っています。

# 感想
仕事で使う言語とかミドルウェアとかではない技術をさっと試す場としても便利です!

# 付録
こういうのがあると奥さんも喜んでくれてハッピー :hugging:
CREATE USER 文を省略して GRANT 文のみでユーザを作成する

わざわざ CREATE USER を実行しなくても、GRANT 文のみでユーザ作成＋ロール付与が可能。

```sql
SQL> grant dba to TEST identified by oracle;

権限付与が成功しました。

SQL> select * from DBA_ROLE_PRIVS where GRANTEE = 'TEST';

GRANTEE    GRANTED_ROLE         ADMIN_OPT DEFAULT_R
---------- -------------------- --------- ---------
TEST     DBA                  NO        YES
```
検証で取り敢えず DBA ロール付与したユーザを作成したい場合なんかで手間が省ける。
GBDKによるゲームボーイソフト制作-1回 Hello World!-

前回：[GBDKによるゲームボーイソフト制作-0.5回 やっておくと便利なこと-](https://qiita.com/blackpman/items/b9c680ddb82c3b68525f)
次回：[GBDKによるゲームボーイソフト制作-2回 文字を出してみる-](https://qiita.com/blackpman/items/40a933c6b77db554e4ad)
## 入門の定番をやってみる
### コードを書く
適当なテキストエディタで、以下のプログラムを書いてみる。

```C++:helloworld.c
#include <stdio.h>

void main() {
    printf("Hello World!");
}
```

自分のわかりやすい場所に、ファイル名を「helloworld.c」として保存。
（筆者は「C:\Files\gameboy」というディレクトリを作りそこに置いてます）
### コンパイル
コマンドプロンプトで、プログラムファイルを保存した場所に移動。
（以下、筆者の場合）
`cd c:\Files\gameboy`

以下のコマンドを入力し、ゲームボーイ用の実行ファイルを作る。
`lcc -o helloworld.gb helloworld.c`
_※環境変数の設定をしていない場合は[C:\gbdk\bin\lcc -o helloworld.gb helloworld.c]_

実際のコマンド入力画面はこんな感じ。
![compile.png](https://qiita-image-store.s3.amazonaws.com/0/246149/92420703-93a9-85ec-2f05-e8090b4ca819.png)

こうすると同じディレクトリに「helloworld.gb」ができる
### 実行してみる
サンプルを実行したときと同じように「helloworld.gb」をエミュレータにドーン。
以下のような画面が出たら成功です。おめでとう。
![helloworld.png](https://qiita-image-store.s3.amazonaws.com/0/246149/d770a6b6-a1b4-520c-553f-c4512c88c45f.png)
作業中のブランチをHerokuにデプロイする

# 開発ブランチをHerokuにデプロイ
作業中の開発ブランチをHerokuにデプロイしようとしたら意外とうまくかなかったので、手順を記録しました。

## 環境&前提的なところ
- mac
- ruby 2.5.0p0
- Rails 5.1.5
- mainブランチと開発ブランチ(develop)がある想定。
- mainブランチをHerokuにデプロイ済みでこれから開発ブランチをデプロイしたい。

## 1. mainブランチと開発ブランチを最新の状態にする
mainブランチ、開発ブランチ（develop）共に最新の状態かつローカル上にdiffがない状態にします。

### developを最新にする
```
$ git checkout develop
$ git fetch
$ git pull origin develop
```

### mainを最新にする
```
$ git checkout main
$ git fetch
$ git pull origin main
```

## 2. Herokuにpushする

### mainブランチをherokuにpushする
`$ git push heroku main`

### 開発ブランチ（develop）をherokuのmainブランチにpushする
`$ git push heroku develop:main`
※git lfsはサポートされないそうですのでご注意ください。

ちなみに、最新なのに「最新じゃないよ」的なエラーが出ました。エラーの指示にしたがって確認を行なって尚エラーが解消されない場合は、`-f`で強制的にpushするという技もあるとかないとか…。

## 3. データベース周りを更新する

ここからは必要に応じてどうぞ;

### データベースをリセットする 
`$ heroku pg:reset DATABASE_URL`
※リセットしない場合は実行する必要がありません。実行すると確認のためにプロジェクト名の入力を求められるので指示に従って入力します。

### データベースをマイグレーション
`$ heroku run rails db:migrate`

### 初期データを投入
`$ heroku run rails db:seed`

## 参考サイト
[Deploying with Git - Heroku Dev Center](https://devcenter.heroku.com/articles/git)
ServiceNow Studio IDEで作成したアプリケーションを削除する

#はじめに
表題通りの内容です。
ServiceNow　Studio IDEで作成したアプリケーションを削除する方法がわからなかったのでまとめてみた。

#インスタンスホーム画面
![skitch-1.png](https://qiita-image-store.s3.amazonaws.com/0/240320/c8fba543-a7ba-4a3e-1891-a72d73edb11d.png)
`System Applications->Applications`をクリック。
フィルタ欄に`applications`と入力すると辿り着きやすいです。

#アプリケーション一覧画面
![skitch-3.png](https://qiita-image-store.s3.amazonaws.com/0/240320/f10754b1-fd39-f3bc-a85c-805cc8bce487.png)
削除対象のアプリケーション名をクリックする。

#アプリケーションの詳細画面
![skitch-4.png](https://qiita-image-store.s3.amazonaws.com/0/240320/9dc73504-91e6-c977-f0d3-12a8324da69f.png)
右上にある`Delete`をクリック
![skitch-5.png](https://qiita-image-store.s3.amazonaws.com/0/240320/7bba78c2-a644-5c13-1d7a-46d147a43b8f.png)
確認のモーダル画面が表示されます。
`Delete`を押下。

![skitch-6.png](https://qiita-image-store.s3.amazonaws.com/0/240320/f34a91ff-4452-62c0-b473-54579e898741.png)
もう一度確認画面が表示される。
テキストボックスに`Delete`を入力して`OK`を押下。

![skitch-7.png](https://qiita-image-store.s3.amazonaws.com/0/240320/da121e00-d730-825b-899f-e75102ef350b.png)
削除完了です。
HyperappのLazy Components

[hyperapp](https://github.com/hyperapp/hyperapp)にはv.1.2.0からLazy Componentsという機能が入りました。結構よさげなので紹介します。

コンポーネントは普通に親からpropsを受け取ることができるわけですが、LazyComponentsでは、トップレベルビューと同じようにグローバルステートとグローバルアクションを受け取ることができます。LazyComponentsを作成するには、通常のコンポーネントからビュー関数を返します。

```jsx
import { h } from "hyperapp"

export const Up = ({ by }) => (state, actions) => (
  <button onclick={() => actions.up(by)}>+ {by}</button>
)

export const Down = ({ by }) => (state, actions) => (
  <button onclick={() => actions.down(by)}>- {by}</button>
)

export const Double = () => (state, actions) => (
  <button onclick={() => actions.up(state.count)}>+ {state.count}</button>
)

export const view = (state, actions) => (
  <main>
    <h1>{state.count}</h1>
    <Up by={2} />
    <Down by={1} />
    <Double />
  </main>
)
```
これはHyperappのREADMEにある例ですが、この内`Up`、`Down`、`Double`がLazyComponentsで、`view`が通常のコンポーネントで、トップレベルコンポーネントです。v.1.1.xまではstateやactionsをpropsバケツ渡しをする必要があったんですが、これでそのあたりを気にすることなく、直接stateやactionsにアクセスできるようになりました。便利。
vscode「有効なソース管理プロバイダーがありません」

vscode で git for windows 導入した。


vscode＞左のソース管理ボタンを押す
＞「有効なソース管理プロバイダーがありません」
と出る

vscode＞設定＞
"git.path": "C:\\\\Program Files\\\\Git\\\\bin\\\\git.exe"
＞リポジトリフォルダ（.gitのあるフォルダ）でvscode開く
＞左のソース管理ボタンを何度か押したり幼かったりする＞「有効なソース管理プロバイダーがありません」が消える（消えた）。
カレント・セッションのSIDを確認する


SYS_CONTEXT 関数の USERENV を使う。

```sql
SQL> select SYS_CONTEXT('USERENV', 'SID') from dual;

SYS_CONTEXT('USERENV','SID')
--------------------------------------------------------------------------------
149
```

昔からある USERENV 関数は現在も使えるが、下位互換用のレガシー・ファンクションとなっている模様。

```sql
SQL> select USERENV('SID') from dual;       

USERENV('SID')
--------------
           149
```
VS Code で特定行の Pull Request を開く機能拡張「VS Code TOSA」

# はじめに
タイトルそのままの VS Code 機能拡張を作成しました。

[kyoshidajp/vscode\-tosa: VS Code extension which opens pull request page from commit hash](https://github.com/kyoshidajp/vscode-tosa)

# 使い方

Github で管理されているコードで、右クリックで表示されるメニュー「**Open Pull Request**」から、該当行がマージされた PR を開く事ができます。

![37556973-ef60fe02-2a40-11e8-9898-8f333921702b.gif](https://qiita-image-store.s3.amazonaws.com/0/36122/35156167-e707-ae5c-4b4d-30e0572b3509.gif)

チーム開発で、なぜ今の実装になったのか知りたい場合に便利ではないでしょうか。また、将来のために PR にはこのような変更時のログをきちんと残そうという文化をチームに根付かせる動機づけになると思います。

# インストール
機能拡張の検索ボックスに「**tosa**」と入力するとヒットするので、インストール、再起動します。

![install_vscode_tosa.png](https://qiita-image-store.s3.amazonaws.com/0/36122/a21f5773-6f75-8eb4-13aa-5121fbd4b076.png)

# どうやって PR の URL を探しているか
カレントディレクトリのリポジトリ名と右クリックされた行のコミットハッシュを元に Github API から次のクエリで検索しています。

```
<コミットハッシュ> type:pr is:merged repo:<リポジトリ名>
```

なぜ issue の検索 API？と思われるかもしれませんが、PR のみを検索するエンドポイントがなく、PR は issue の一部となるためです（`type:pr` で PR に絞っている）。

また、検索の条件として作成日の降順で取得し、その最後の値が期待する PR であると想定しています。これは例えばリリース時に release ブランチの PR を作っている場合に複数ヒットするので、最初に作成された PR を取得するためです。

例えばこの機能拡張のコミット `aa18a09` の場合、リクエスト URL は次になります。

```
https://api.github.com/search/issues?q=aa18a09+type%3Apr+is%3Amerged+repo%3Akyoshidajp%2Fvscode-tosa&sort=created&order=desc
```

取得したレスポンスを一部省略した結果です。

```json
{
 "total_count": 1,
 "incomplete_results": false,
 "items": [
   {
     "url": "https://api.github.com/repos/kyoshidajp/vscode-tosa/issues/7",
     "repository_url": "https://api.github.com/repos/kyoshidajp/vscode-tosa",
     "labels_url": "https://api.github.com/repos/kyoshidajp/vscode-tosa/issues/7/labels{/name}",
     "comments_url": "https://api.github.com/repos/kyoshidajp/vscode-tosa/issues/7/comments",
     "events_url": "https://api.github.com/repos/kyoshidajp/vscode-tosa/issues/7/events",
     "html_url": "https://github.com/kyoshidajp/vscode-tosa/pull/7",
     "id": 304157764,
     "number": 7,
     "title": "Add search terms to identify a PR",
     "user": {
       "login": "kyoshidajp", ...
     }
   }
  ]
}
```

この `html_url` が期待する PR の URL になります。

また、fork したリポジトリで fork 元のコミットについては1回目のアクセスで取得できないので、fork 元のリポジトリに対して再度検索しています。ここがイマイチ。

ちなみに簡易化のため API と取得したデータへのアクセスは [rest.js](https://github.com/octokit/rest.js) というライブラリから行っています。

# コマンドラインで使いたい場合

こちらをどうぞ。

- [kyoshidajp/tosa: Open pull request page from commit hash tool](https://github.com/kyoshidajp/tosa)
- [コミットハッシュから pull request ページを開いたり取得するコマンドラインツール tosa - Qiita](https://qiita.com/kyoshidajp/items/18d5385ef8375c7bcd14)

もともと CLI で作成していたのですが、チーム内で VS Code を使うメンバーが増えてきたため移植してみました。

![thanks.png](https://qiita-image-store.s3.amazonaws.com/0/36122/c2078453-ecca-e7ef-ca50-c79fcd6a89b4.png)

良かった！

# 最後に
不具合やご意見があればコメントまたは [Issue](https://github.com/kyoshidajp/vscode-tosa/issues) をあげていただければうれしいです。
primary key用のEcto.Changeset.unique_constraintラッパーを書いた

# まとめ
- 複合primaryキーでも単数でもindex名としては:PRIMARYなので書き方は同じ
- primaryキーにunique_constraintを使ったときのエラー表示が分かりにくいので、ラッパーを書いた


# 調査

## 調査用スキーマ
```exs
  @primary_key false
  schema "profiles" do
    field :user_id, :integer, primary_key: true
    field :email,   :string, primary_key: true
    field :token,   :string, primary_key: true
  end
```

## Primaryキーのconstraintの書き方

単数でも複合でもindex名は:PRIMAYなので書き方は同じです。
`changeset |> Changeset.unique_constraint(:user_id, [name: :PRIMARY])`

## 調査結果
### エラーメッセージがわかりにくい

` changeset.errors #=> [user_id: {"has already been taken", []}] `

primaryキーはuser_id, email, tokenなのにuser_idについてしか言及されていない。


### エラーメッセージを変更する

Changeset.unique_constraintの第2引数に渡すfield名は、デフォルトindex名の生成とerrorsのキー名にしか使われていないように見えるため、nameオプションでindex名を指定している場合は好きな名前を指定できそうです。

```
changeset |> Changeset.unique_constraint(:primary_keys, [name: :PRIMARY])
changeset.errors #=> [primary_keys: {"has already been taken", []}]
```

しかし慣例として、field名を入れたほうが良さそうに見えます。
documentには以下のように記載されており、実装も変数名はfieldとなっています。
> Notice that the first param is just one of the unique index fields, this will be used as the error key to the changeset errors keyword list.

このため、ライブラリ側が想定していない使い方は控え、messageオプションに全ての対象field名を記載することにしました。


# primary_constraintの実装

## 目標

- 調査用スキーマを使って、以下のエラーメッセージを得る
    - errorsのキー名は複合キーの先頭field

`# changeset.errors => [user_id: {"Duplicate primary key [:user_id, :email, :token]", []}]`

```exs
# 使い方
def changeset(struct, params \\ %{}) do
  struct
  |> Changeset.cast(params, @required_fields)
  |> primary_constraint() 
end
```

## 実装

```exs
  defmacro primary_constraint(changeset) do
    quote do
      alias Ecto.Changeset
      pkeys = __MODULE__.__schema__(:primary_key)
      first_field = hd pkeys
      Changeset.unique_constraint(unquote(changeset), first_field, [name: :PRIMARY, message: "Duplicate primary key #{inspect(pkeys)}"])
    end
  end
```

以上です。プロダクトに投入して使っています。
RStudioは起動時に一度、素のRを呼ぶ？

.Rprofileで起動時に素のRかRStudioどちらが起動されたか判定したいのですが、うまくいっていません。
どなたかうまい解決方法ご存知でしたら一報下さい。

Rでは、実行環境を、

```r
.Platform$GUI
```
で知ることができます。

Windowsで素のRを起動すると、RguiないしRtermが、
Linuxで素のRを起動すると、X11が、
WindowsでもLinuxでもRStudioを起動すると、RStudioが返ります。

基本的には……!

これを利用すると、素のRの時とRStudioの時で.Rprofileを使い分けることが可能なのではないかと期待したのですが、実はそうはなりません。

.Rprofileに

```r
.Platform$GUI
```

を書いてRStudioを起動すると、

```
[1] "X11" #私はLinuxユーザーです
```

と返ります。
残念!

一度、素のRを呼んでいるのでしょうか？
ちょっとどうしてこうなっているのか分かりません。
GBDKによるゲームボーイソフト制作-0.5回 やっておくと便利なこと-

前回：[GBDKによるゲームボーイソフト制作-0回 準備編-](https://qiita.com/blackpman/items/fc52cf8d9c7b1408d438)
次回：[GBDKによるゲームボーイソフト制作-1回 Hello World!-](https://qiita.com/blackpman/items/621d6967b190eeb6f2f9)

環境変数を設定してパスを通しておくと便利（かも）。
下記はWindows8.1の場合の手順。

マイコンピュータで右クリックしてプロパティを開く。
![open_computer_proterty.png](https://qiita-image-store.s3.amazonaws.com/0/246149/a9f0d27e-4e2c-7275-2987-cd75a20a6875.png)

システムの詳細設定を開く。
![open_system_setting.png](https://qiita-image-store.s3.amazonaws.com/0/246149/7a2d37ab-2aca-39b8-917e-f3fec29f9784.png)

詳細設定タブより環境変数の設定を開く。
![system_setting.png](https://qiita-image-store.s3.amazonaws.com/0/246149/c60ecd1f-e418-b9ff-5231-7df5726d666c.png)

ユーザの環境変数Pathの編集画面を開く。
![edit_path.png](https://qiita-image-store.s3.amazonaws.com/0/246149/1022951c-cb22-acab-aa02-0b5b22739871.png)

末尾に「c:\gbdk\bin」を追加。
![add_path.png](https://qiita-image-store.s3.amazonaws.com/0/246149/c06a0367-9b18-ebf5-c59c-2b9284be09e3.png)

とりあえず以上。
VisualStudio上であれこれできるようにもしたい・・・。
hyperapp + parcel


## インストール

```shell
npm init -y && npm i hyperapp parcel-bundler babel-plugin-transform-react-jsx babel-preset-env
```

## package.json

```json
{
...
  "scripts": {
    "start": "parcel index.html",
    "build": "parcel build index.html --public-url ./"
  }
...
}
```

## .babelrc

```json
{
  "presets": ["env"],
  "plugins": [
    [
      "transform-react-jsx",
      {
        "pragma": "h"
      }
    ]
  ]
}
```

## index.js

```javascript
import { h, app } from 'hyperapp'
const view = () =>
  <div>
    hello hyperapp
  </div>
app({}, {}, view, document.body)
```

## index.html

```html
<html>
  <body>
    <script src="./index.js"></script>
  </body>
</html>
```

## 参考

[Hyperapp + Parcel = 😎](https://blog.daftcode.pl/hyperapp-parcel-71823bd93f1c)
kaggleのkernelを読んでみる（TalkingData AdTracking Fraud Detection Challenge）

# コンペ内容について
https://www.kaggle.com/c/talkingdata-adtracking-fraud-detection

- オンライン広告のクリックの内90％以上は不正であり、その人たちがアプリをインストールすることはない
- 広告主にとっては無駄な浪費になっている
- ユーザーがアプリをダウンロードするかどうかの予測をして欲しい

# 本題
- https://www.kaggle.com/anokas/talkingdata-adtracking-eda/notebook を理解する   
- やってることは基礎集計っぽい
- （）内は私の意見です

## 冒頭部分
- データが2億4000万行と今までで一番多い
- 評価方法はROC-AUCである
- この問題はbinary分類問題である。正しい or 不正   
（→提出するのは0 or 1でなくて確率と書いてあるんだけども）

> AUCスコアは2つのクラスをどれだけうまく分離できるかによって異なります。実際には、これは予測の順序だけが重要であることを意味し、
この結果、モデルの出力確率に対して行われた再スケーリングはスコアに影響しません。他の競技では、ディメンションに定数や乗数を加えてディストリビューションにリサイズすることができますが、ここでは該当しません。   

（→よくわからん。。。）

## Data overview
- 2億4000万行のうち100万行だけ取り出してる
- それぞれの特徴ごとのユニーク数をカウント   
（→ipのユニーク数が多いのはわかるが、deviceやosもこんなに種類あるんですね）

## Encoded variables statistics

### ip別クリック数
- x軸はクリック数の少ない順にipにindexを振ってる
- 多いのだとひとつのipで6000くらいクリックしてる

### クリック数別ip数
1クリックが最も多く、10000種類を超える。（逆に同一ipで数千クリックとかは明らかに不正なのだろう）

### app id別クリック数
（このアプリは不正されやすいみたいなのがあるのだろうか？）
### クリック数別app id数
（140000クリックされてるapp idもあるが、広告をたくさん出してれば不自然ではないのかな？
いやでも14%がそのapp idになってしまうわけだからそれはないか）

### device別クリック数
最も多いdeviceで100万クリックある
### クリック数別device数
クリック数100万の次が数万だがそれでも一種類のdeviceだけ。（よってこの100万と数万クリックある二種類のdeviceは外れ値っぽいので不正？）

### os別クリック数
（同じく指数関数的な推移だが、ip、app id、deviceに比べると緩やか）
### クリック数別os数
（二種類のosが飛び抜けているが主流のosならば別に不自然ではないのだろうか？一般的なOSの分布がどんなもんなのかわからないので考察しようがない。また、osの値もただの数値なので、実際のos名やversionがどれくらいの細かさで振られているのかわからないと参考にならない気がする。）

### channel別クリック数
（publisherによって不正が多いというのはありそう。）
### クリック数別channel数
（今までと比べるとまんべんなく分布している気がする。publisherによって不正が多いというのはないのかも？）

## What we're trying to predict
 - 不正とそうでないデータの割合を表示している
 - 不正が99.83％とかなり不均衡なデータであので、モデルが堅牢であるかもしくはデータの再サンプリングが必要になります


# 感想
- データ量が多い
 - 全データ（train.csv.zip）は1.21Gあるので、10万件データ（train_sample.csv.zip）を使ってある程度モデルを作って、精度を上げる時に全データ使えば良いのかな？
- 不正とそうでないデータが不均衡
 - こういう場合どうすればいんだろう？それぞれが同じデータ量でモデル作らないと偏る？
- マスクされたデータ
 - click_id	ip	app	device	os	channelが数値に置き換えられてるので扱いづらい（ipの範囲で弾くとかできない）
 - click_timeを使えということなのだろうか。
- 分布の意味
 - それぞれのパラメータの分布を見たが、結局グラフが不自然なのか自然なのかわからないのであんま意味なかった。。。
 - それぞれのパラメータの一般的な分布を知っておいたほうが良さそう

# [この記事の続き](https://qiita.com/masleisii/items/9a3f32ba13a84758c006)
リストを*したときの挙動

# はじめに

先日見かけたツイート。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Pythonで<br><br>&gt; a = [[0]*3]*3<br>&gt; a[0][0] = 1<br><br>が<br><br>&gt; [[1,0,0],[0,0,0],[0,0,0]]<br><br>でも<br><br>&gt; [[1,1,1],[1,1,1],[1,1,1]]<br><br>でもなく、<br><br>&gt; [[1,0,0],[1,0,0],[1,0,0]]<br><br>になるのは最高にｸｯｿって感じはする。</p>&mdash; Hideyuki Tanaka (@tanakh) <a href="https://twitter.com/tanakh/status/978245874126958592?ref_src=twsrc%5Etfw">2018年3月26日</a></blockquote>

こうなる理由を解説します。

# [0]

まず単に`[0]`と書くとどういう意味なのか。図で書くとこういう意味です。

![one_elem.png](https://qiita-image-store.s3.amazonaws.com/0/141091/81e59af4-c15b-659b-8598-d2466dc0ab85.png)

「こうじゃない」という図も書こうと思ったけどめんどくさいのでやめ。
つまり、[0]とは箱があってその中に0が入っているのではなく、箱の中には0という実体への参照情報が入ってます。

# [0]\*3

次に[0]\*3とした場合にできるもの。

![tree_elems.png](https://qiita-image-store.s3.amazonaws.com/0/141091/e66b448a-ab4b-dde7-8ac9-f3ae5abfc143.png)

はいここ重要。1要素目、2要素目、3要素目は全て同じ0の実体を指します。

# [[0]\*3]\*3

では問題の[[0]\*3]\*3。

![three_lists.png](https://qiita-image-store.s3.amazonaws.com/0/141091/739aa3c0-dfa2-3201-3f23-97f6c2d7a460.png)

3要素のリストで、それぞれが[0]*3というリストの実体を指すものが作られます。

# a[0][0]=1

で、a[0][0]=1するとどうなるか。こうなります。

![point_other.png](https://qiita-image-store.s3.amazonaws.com/0/141091/76b66843-9595-f9f8-8410-2971b624934b.png)

つまり、元々は3要素とも0を指していた内側のリストが先頭要素だけ1を指すようになります。
一方、外側のリストは実体が一つしかない内側のリストを各要素が指している状態のままです。というわけで、

```py
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
```

となります。

# まとめ

リストを*した場合、参照情報がコピーされます。指しているものがコピーされるわけではありません。ここら辺の挙動を理解しないでプログラム書くと不幸になるかもしれません。
[UE4] UE4に自作Moduleを追加する手順 [UE4.18]

# 概要
UE4に自作Moduleを追加する手順をまとめました。
手順を簡略化するために、バッチファイルを用いてModuleを生成しています。
バッチファイルを含むフォルダ（UEMG）は以下からダウンロード可能です。
https://github.com/KanuraPoison/UE_PRA01

動作環境：Windows 10, UE4.18.3, VisualStudio 2017

# 1. UEを起動し、新規プロジェクトを作成。
既にプロジェクト作成済みなら2. へ。
※今回はプロジェクト名は"MyProject"とし、C++のThirdPersonテンプレートを使用しました。
プロジェクトが作成されたらUEが起動するので、一旦閉じる。VisualStudioも閉じる。

![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/245572/d6346e5d-6c35-d312-ccdd-904d845df3a6.jpeg)

# 2. 追加するModuleを作成
UEMGフォルダ内の"UEModuleGenerator.bat"を実行し、作成したいModule名を入力（今回は"MyModule"）

![02.jpg](https://qiita-image-store.s3.amazonaws.com/0/245572/afc97136-38a4-e762-cd2b-7378038ee759.jpeg)


# 3. 作成したModuleをMyProjectへ
Outputフォルダ内に、入力したModule名と同名のフォルダが生成されるので、それをMyProject\Source\にコピペする。

![03.jpg](https://qiita-image-store.s3.amazonaws.com/0/245572/4a091e05-7944-3e1b-5d3d-30012ee095d7.jpeg)

# 4. ファイル内容修正
以下の３つのファイル内容を修正（追記）し、MyModuleが反映されるようにする。
 - MyProject\MyProject.uproject
 - MyProject.Target.cs
 - MyProject.Build.cs
※Editor用のModuleを追加する場合はMyProject.Target.cs -> MyProjectEditor.Target.csに。

![04.jpg](https://qiita-image-store.s3.amazonaws.com/0/245572/1fd90ea5-db37-bfc3-dcab-72d1170f0b82.jpeg)

# 5. Module反映
MyProject.uprojectを右クリックし"Generate Visual Studio project files"を実行し、MyModuleが追加・反映されていることを確認。

![05.jpg](https://qiita-image-store.s3.amazonaws.com/0/245572/6170c604-6236-332e-cd2d-21d871e09fac.jpeg)

# 6. UE上で確認
MyProject.slnをVSで開き、ソリューションをビルドしデバッグありorなしで開始する（どちらでもok）。ビルド確認メッセージが出たら”はい”を選択し続行。
UEが起動し、MyModuleが追加されていれば成功。やったね！

![06.jpg](https://qiita-image-store.s3.amazonaws.com/0/245572/7f418af1-a49e-49bc-2607-c02efad69468.jpeg)

# 参考サイト
http://historia.co.jp/archives/3097/
https://qiita.com/go_astrayer/items/5d001a9cde182488f9f3
Fitbit ionic 「document.onkeypress」が「back」しかハンドリングしてくれない！

# 環境
Fitbit ionic
Fitbit OS 2.0(27.32.4.19)

# 起きたこと
「document.onkeypress」でボタンの動作をハンドリングするも、「back」しか反応しない。

# コード

```
  document.onkeypress = function(evt) {
    console.log("Key pressed: " + evt.key);
    if (evt.key === "back") {
      evt.preventDefault();
    }
  }
```

# 原因
guiファイルでコンボボタンを定義していたのが原因でした、

```
※抜粋
<use id="btn-tr" href="#combo-button-upper-right" fill="fb-red">
    <set href="combo-button-icon" attributeName="href" to="btn_combo_pause_p.png"/>
    <set href="combo-button-icon-press" attributeName="href" to="btn_combo_pause_press_p.png"/>
    <set href="combo-button-stroke" attributeName="display" to="inline"/>
  </use>
  <use id="btn-br" href="#combo-button-lower-right" fill="fb-peach">
    <set href="combo-button-icon" attributeName="href" to="btn_combo_play_p.png"/>
    <set href="combo-button-icon-press" attributeName="href" to="btn_combo_play_press_p.png"/>
    <set href="combo-button-stroke" attributeName="display" to="inline"/>
  </use>
</svg> 
```

上記コードを削除すると、upもdownもハンドリングされました。
自宅でXeonサーバ構築メモ(Skylake-SP)

OPNFVのインストールなどを目的に、Intel Xeon搭載のサーバを自宅で構築した。ここに記録する。

【サーバ構築の目的】
・OPNFVのディストリビューション(Euphrates)をVM Deploymentタイプにてインストールする。
・様々なことを試す(何を試せるのか、別途列挙する予定)

【サーバ台数】
1台

【サーバ構成】
Intel Xeon Gold 6130 (16C/?GHz)×1
Supermicro 

【】
excelの「セルの値と書式」を別シートにコピーするvba

(参考)他のシートのセル範囲を変数で指定して罫線を引くには？
http://www.max.hi-ho.ne.jp/happy/YNxv9622.html
(参考)『ＶＢＡで Range の指定』（とんとん）
http://www.excel.studio-kazu.jp/kw/20041121004147.html

```vb
Sub セルの値と書式を別シートにコピー(myInput As String, myOutput As String, _
                                  上 As Long, 左 As Long, 下 As Long, 右 As Long, _
                                     上2 As Long, 左2 As Long)
    下2 = 上2 + (下 - 上)
    右2 = 左2 + (右 - 左)
    With Worksheets(myInput)
        .Range(.Cells(上, 左), .Cells(下, 右)).Copy
    End With
    With Worksheets(myOutput)
        .Range(.Cells(上2, 左2), .Cells(下2, 右2)).PasteSpecial Paste:=xlPasteValues
        .Range(.Cells(上2, 左2), .Cells(下2, 右2)).PasteSpecial Paste:=xlPasteFormats
    End With
End Sub
```
マイナス番地及び番地の大小判定をしていません。おすすめのページを教えて下さい。よろしくお願いします。
引数、argument0 と argument[0] の違いは？

環境 : Gamemaker Studio 2 (platform : HTML5)
結論 : argument0 必須の引数。argument[0] 任意の引数のとき。


こんばんは。Aki [@aki_0o0_](https://twitter.com/aki_0o0_)です。スクリプトで関数を定義した時に、引数を受取る書き方が2種類あったので、なにが違うのか調べました。

## 違い
### argument[0] 
値を渡し忘れたら、実行するまでエラーにならない。ので気づくのが遅れる。

例えば、こういう関数を用意します。

```draw_score_optional.gml
///@param posx
///@param posy
///@param num

var posx = argument[0];
var posy = argument[1];
var num = argument[2];

```


`draw_score_optional(x, y, 999);`
こう呼ぶとするとき、

`draw_score_optional();`
引数を書き忘れても、
特に何も表示されずに、コンパイルも通って、
実際その処理の呼び出しが実行されるまでエラーにならないんですね。



### argument0 
値を渡し忘れたら、エディタで書きながらエラーが表示されるので、分かりやすい。
そのままコンパイルすると、コンパイルエラーにしてくれる。親切！

例えば、

```draw_score_required.gml
///@param posx
///@param posy
///@param num

var posx = argument0;
var posy = argument1;
var num = argument2;
```


`draw_score_required(x, y, 999);`
こう呼ぶとするとき、

`draw_score_required();`
引数を書き忘れたら、エディタで赤くなるからすぐわかる。
もしそのままコンパイルしても、エラーになって修正するまでは実行されないから、すぐに気づけますね。

## デフォルト引数を使って省略できる
じゃあこっち（argument[0]）は要らない子なのかというと、そんなこと無いです
どんな時に使うかというと、デフォルト引数を使いたい時です。

```draw_score_default_argument.gml
///@param posx
///@param posy
///@param num
///@param color

var posx = argument[0];
var posy = argument[1];
var num = argument[2];

var color = c_white;
if (argument_count >= 4) {
    color = argument[3];
}
```


`draw_score_default_argument(x, y, 999);`
白色で良い時、

`draw_score_default_argument(x, y, 999, c_red);`
色を指定したい時

## 終わり
というわけで、
必須の引数は、argument0 
任意の引数は、argument[0] 
を使うと良いと思います
GBDKによるゲームボーイソフト制作-0回 準備編-

次回：[GBDKによるゲームボーイソフト制作-0.5回 やっておくと便利なこと-](https://qiita.com/blackpman/items/b9c680ddb82c3b68525f)
## これなに？
かねてより興味があったゲームボーイソフト開発についての学習を始めたため、
主に自分用の備忘録として書き記していきます。
## GBDKとは
公式
[http://gbdk.sourceforge.net/](http://gbdk.sourceforge.net/)

C言語及びアセンブリ言語で「ゲームボーイ」及び「ゲームボーイカラー」用のプログラムを開発するための開発キットである。
## 開発環境
1. Windows8.1（Windowsなら何でも）
2. GBDK バージョン2.95-3
3. VisualBoyAdvance バージョン1.7.2（エミュレータ　何でも良い）
4. 何らかのテキストエディタ（本項記述時点では「サクラエディタ」を使用）

## 環境構築
### GBDKの入手
sourceforge（[https://sourceforge.net/projects/gbdk/files/gbdk-win32/2.95-3/](https://sourceforge.net/projects/gbdk/files/gbdk-win32/2.95-3/)）より「gbdk-2.95-3-win32.zip」をダウンロード。
~~解凍（死語？）~~展開すると「gbdk」というディレクトリがあるので、丸ごとわかりやすいところに移動ないしコピー。
（筆者はCドライブ直下に設置）
### エミュレータの入手
OSDN（[https://ja.osdn.net/projects/sfnet_vba/releases/](https://ja.osdn.net/projects/sfnet_vba/releases/)）より「VisualBoyAdvance-1.7.2.zip」をダウンロード。
展開して適当なところに置く。
（筆者はとりあえずデスクトップに置いた）
### サンプルプログラムを動かしてみる
C:\gbdk\examples\gbの中にある「make.bat」を実行。
「*.gb」なファイルが色々と吐き出されるので、試しにどれかをエミュレータにぶち込む。
（今回は「paint.gb」にしてみた）
![gb_into_emulator.png](https://qiita-image-store.s3.amazonaws.com/0/246149/0f69b3ea-909c-b6a4-26c4-87af694e2fbc.png)
こんな感じでD&D。

以下のような画面が出れば成功。
![paint_exec.png](https://qiita-image-store.s3.amazonaws.com/0/246149/4d7d7f07-f2df-d940-c473-07e269803fdb.png)
方向キーとかで実際にお絵かきできるよ！

最低限の準備はひとまず以上。