OmniAICreator/Qiita-1.07M huggingface dataset:
GitHubでプルリクごとにプレビューするのにベストな環境

# はじめに
チーム開発しているとPRごとにプレビュー環境で動くものが常に見れるようになっているととても便利ですよね！
現在チームでExpress.jsとNext.jsを用いたOSSを開発しており、GitHub上でコードを管理しています。
GitHubと連携してPRごとにプレビュー環境を自動作成してくれるサービスには次のようなサービスがあります。

* [Netlify](https://www.netlify.com/)
* [Now.sh](https://zeit.co/now)
* [Heroku](https://devcenter.heroku.com/articles/github-integration-review-apps)

今回は**どこまで無料で使えるか**という観点でこれらのサービスを比較してみたいと思います。

# TR; DR

* サーバーレスでないアプリを実行する場合 → Heroku
* Node.jsの10.xなど新し目のバージョンを使いたい場合 → Heroku
* 静的ファイルのみのホスティングの場合 → Netlify
* サーバーレスに対応したアプリの場合 → Netlify / Now.sh
* Node 8.x系でも問題ない場合 → Netlify / Now.sh

# Netlify
## メリット
  * **静的ファイルのホスティングはPRに制限がありません。** これはかなり大きいのではないでしょうか。
  * バックエンドはサーバーレスアプリをAWS lambdaにデプロイでき、フリープランの上限も125kリクエスト/月、実行時間100時間/月といい感じ。

## デメリット
* チームで使う場合は有料。とはいってもダッシュボードや設定をチームでする場合は有料というだけなので、チームでプレビュー環境を見たいだけであれば、個人アカウントで連携など全部設定すればいいので、デメリットにはならないと思います。
* サポートされているNode.jsのバージョンが6.xと8.xのみ [^1] :cry: これは、裏ではAWS Lambdaを使っているためです。

  [^1]: https://www.netlify.com/blog/2018/04/03/node.js-8.10-now-available-in-netlify-functions/
# Now.sh
現状ではv1とv2の二種類があります。v2でユースケースをカバーできるようになったらv1はサポートを終了するらしいので、v2を使うのが推奨っぽいです。

* v1: Dockerfileにより任意の環境でサーバーを実行できる
* v2: サーバーレスのみに対応している

## メリット
* v1の場合Dockerfileにより任意の環境でサーバーを実行できます。
* v2の場合、単位がサーバーレスアプリの実行回数になったのでプレビュー環境の個数に上限はない。実行回数に上限 (1000回/日)が設けられています。画像やCSSなどの静的ファイルの取得もカウントされてしまうので、結構きつい制限なのかもしれませんね。

## デメリット
* v1ではフリープランでは3インスタンスまで(要するに3PR)しか作れず、チームで開発するにはもの足りないです。
* v2ではサポートされているNode.jsのバージョンが8.xのみ [^2] 私のチームでは開発用にオンメモリの MongoDBである[mongodb-memory-server](https://github.com/nodkz/mongodb-memory-server)を使っているのですが、内部的にNode 8.xではサポートされていないasync generatorをつかっていることがわかり、Now.shを断念しました :cry: 

  [^2]: https://zeit.co/docs/v2/deployments/official-builders/node-js-now-node)
 
# Heroku
[Review Apps](https://devcenter.heroku.com/articles/github-integration-review-apps)を設定することでプレビュー機能が使えるようになります。

## メリット
* [Dockerが使える](https://devcenter.heroku.com/articles/github-integration-review-apps#review-apps-and-docker)でどんな環境でも動かせます。
* Dockerを使わない場合でもNode.js 11.xまでサポートされているのでNode.jsのバージョンで困らないかと思います。[^3]
  [^3]: https://devcenter.heroku.com/articles/nodejs-support
* 無料だと550 dyno hoursが使え、アイドル状態になると自動的にsleep状態になる(sleep状態のインスタンスはdyno hoursにカウントされない)ので、小さなチームでは十分なのではないでしょうか。

## デメリット

* チームで使う場合はfree dynoが使えないので無料で使うことができません。これに気づかずにチームプランで使ってしまっていたのですが、ある日Herokuから請求メールが来ていて焦りました :sweat: $1ちょっとだったので大したことはなかったですが。ただ、これもNetlifyと同じで設定は個人アカウントで行えばよいので、チームで設定を管理しなくてもいいというのであれば、大きな問題にはならないかと思います。

# まとめ
どのサービスが最適かどうかは用途によって変わってくるとは思いますが、まとめると以下のようになります。最近Googleが[Cloud Run](https://cloud.google.com/run/)というサーバーレスアプリ用のサービスを公開しましたが、KnativeベースなのでGitHubと連携ができるようになるとCloud Runだけで十分になるかもしれませんね！

* サーバーレスではないアプリを実行する場合 → Heroku
* Node.jsの10.xなど新し目のバージョンを使いたい場合 → Heroku
* 静的ファイルのみのホスティングの場合 → Netlify
* サーバーレスに対応したアプリの場合 → Netlify / Now.sh
* Node 8.x系でも問題ない場合 → Netlify / Now.sh
Cannot execute queries while other unbuffered queries are active.

## 事象
```PHP
$pdo->query("drop database if exists DBNAME");
$pdo->query("create database DBNAME");
$pdo->query("use DBNAME");
```

みたいなことをしたら

`SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active.  Consider using PDOStatement::fetchAll().  Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.`

と言われてしまった。

## 原因
`PDO::MYSQL_ATTR_USE_BUFFERED_QUERY`はデフォルトで`true`になっているので、エラーメッセージが提示する修正は意味がなさそう。

よくわからないのでググったら[stack overflow](https://stackoverflow.com/questions/28066842/pdoquery-run-into-cannot-execute-queries-while-other-unbuffered-queries-are)に書いてあった。
`->query()`を`->exec()`にしたら良いらしい。

たぶん、`query()`は`PDOStatement`を返すので`PDOStatement::closeCursor()`が実行されるまで接続されっぱなしになるっぽい…？
`PDO::MYSQL_ATTR_USE_BUFFERED_QUERY`の力でわざわざ閉じなくても大丈夫なはずだと思ったけど、以下のように`query`が二つだと動いたので三重入れ子になると厳しいっぽい。

```PHP
$pdo->query("drop database if exists DBNAME");
$pdo->query("create database DBNAME");
```

## 対応
`exec()`は`PDOStatement`じゃなくて`int`を返すので、接続が維持されないからアド。

```PHP
$pdo->exec("drop database if exists DBNAME");
$pdo->exec("create database DBNAME");
$pdo->exec("use DBNAME");
```
PostgreSQLのログをlogrotate側で管理する設定

PostgreSQLのログローテションはローテーションするファイル数を設定できないみたいなので、logrotateで管理する設定が必要となった。
設定方法を備忘録として残す。

# 設定の流れ

- PostgreSQLのログをsyslogに流す設定
- syslogのログ出力設定
- logrotateのローテションの設定

## 出力先ファイル

```
/var/log/postgresql/postgresql.log
```

# PostgreSQLのログをsyslogに流す設定

## posgres.conf

```
vim /usr/local/pgsql/data/postgresql.conf
```

log_destinationを`syslog`に設定

```conf:/usr/local/pgsql/data/postgresql.conf
log_destination = 'syslog'  
```

ファシィリティの設定(syslogとの連携で必要)

```conf:/usr/local/pgsql/data/postgresql.conf
syslog_facility = 'LOCAL1'
```

ログ出力の先頭に表示するフォーマットを設定

```conf:/usr/local/pgsql/data/postgresql.conf
log_line_prefix = '[database:%d][user:%u]'  
```
%d：データベース名
%u:アクセスユーザ名

全てのログを出力

```conf:/usr/local/pgsql/data/postgresql.conf
log_statement = 'all'                   # none, ddl, mod, all
```


## postgresql.confの設定反映

`SELECT pg_reload_conf()`を実行

```bash
su postgres
/usr/local/pgsql/bin/psql 

postgres=# SELECT pg_reload_conf();
 pg_reload_conf 
----------------
 t
(1 row)

```

## syslogのログ出力設定

### 設定ファイル

```
 vim /etc/rsyslog.conf
```

以下追加する

```
# postgres
local1.*                                                /var/log/postgresql/postgresql.log
```

### 再起動

```conf
/etc/init.d/rsyslog restart
```

## logrotateのローテションの設定

### 設定ファイル

以下設定ファイル追加

```
touch /etc/logrotate.d/postgresql 
```

以下追記

```conf:etc/logrotate.d/postgresql 
/var/log/postgresql/*.log {
  daily
  compress
  delaycompress
  notifempty
  copytruncate
  missingok
  create 0640 postgres root
  rotate 30
}

```

### logrotateの設定反映

```
sudo logrotate /etc/logrotate.conf 
```

## ログが出力されているか確認

```
tail -f -n 100 /var/log/postgresql/postgresql.log
```


## 参考サイト

PostgreSQL 実行されたSQLをログに出力(システム全体の設定)
https://www.kakiro-web.com/postgresql/postgresql-sql-log-system.html

PostgreSQL で最低限設定しておくべきログ関連パラメータ＋α
https://qiita.com/ynakayama/items/d38c70dd7b61590e3f4e

PostgreSQLをlogratate側で管理する方法
https://www.postgresql.jp/document/9.1/html/logfile-maintenance.html

ログローテーションするためのlogrotate設定とちょっとしたtips
https://qiita.com/K_Yagi/items/7843429f34678e475be6


https://dev.classmethod.jp/cloud/aws/rds-postgres-log-settings/
#Mac OS A shortcut to delete a line of text at the current cursor position regardless of application (Control + A-> K)

<ul>
<li> Move to the beginning Control + A </li>
<li> Delete to the end of the line Control + K </li>
</ul>

<p> Use in combination. It would be nice if I had this in hand. </p>

<p> Even though I always thought, &quot;It&#39;s a shortcut to delete everything in one shot!&quot; Oh, please tell me if you know. </p>

<h1> You can use it anywhere </h1>

<ul>
<li> console </li>
<li> Google Chrome form input / Address bar input </li>
<li> Editors such as Sublimetext </li>
</ul>

<p> etc. You should not even interfere with application shortcuts. </p>

<h1> Ref </h1>

<p> <a href="https://support.apple.com/sl-si/HT201236">Mac keyboard shortcuts-Apple Podpora</a> </p>

<p><img src="https://user-images.githubusercontent.com/13635059/55998696-59d19e80-5cfa-11e9-87ef-f35088df187b.png" alt="image"></p>

<p> <a href="https://www.find-job.net/startup/mac-shortcut">15 Mac Shortcut Keys That Make Text Entry Dead | Find Job! Startup</a> </p>

<p><img src="https://user-images.githubusercontent.com/13635059/55998776-ac12bf80-5cfa-11e9-8a32-fe37d5945ea6.png" alt="image"></p>


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
( やばい -> dangerous ) #Google 翻訳 #API を利用して、標準入力に #JSON を与えると 翻訳結果を同じく JSON で標準出力する #python スクリプトの例

```py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os, sys, requests, json, fileinput, re

token = os.environ.get('TOKEN')
translate_json_key = os.environ.get('TRANSLATE_JSON_KEY') if os.environ.get('TRANSLATE_JSON_KEY') else 'text'

seeds = json.loads(sys.stdin.read())

results = []

for seed in seeds:
  translated = seed

  resource_message = seed[translate_json_key]
  translate_format = os.environ.get('FORMAT') if os.environ.get('FORMAT') else seed['format']
  from_language = os.environ.get('FROM') if os.environ.get('FROM') else seed['from']
  to_language = os.environ.get('TO') if os.environ.get('TO') else seed['to']

  params = {
    'q': resource_message,
    'source': from_language,
    'target': to_language,
    'format': translate_format
  }
 
  api_url = 'https://translation.googleapis.com/language/translate/v2'
 
  headers = {
   'Authorization': 'Bearer {}'.format(token),
   'Content-Type': 'application/json',
  }
 
  res = requests.post(api_url, headers=headers, json=params)

  translated_json_key = os.environ.get('TRANSLATED_JSON_KEY') if os.environ.get('TRANSLATED_JSON_KEY') else to_language + '_translated_text'
  translated[translated_json_key] = res.json()['data']['translations'][0]['translatedText']

  results.append(translated)
 
print(json.dumps(results))


```


```
$ echo '[{"text" : "やばい", "from": "ja", "to": "en", "format" : "text"}]' | TOKEN=************ ./translate-json.py | jq
[
  {
    "text": "やばい",
    "from": "ja",
    "to": "en",
    "format": "text",
    "en_translated_text": "dangerous"
  }
]
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
バイナリ名を変更した時のKubectlのコマンド補完の導入

# 概要
現在、私はkubernetesをDocker for Macのものを使用していますが、
最新版を入れてみたいなと思ったため`kubectl`の最新版をインストールしました。

その際、コマンド補完を導入したのですが、`kubectl`のバイナリ名を変えた際に、
コマンド補完の試行錯誤したため、その内容についてまとめます。
私はzshを使用しており、bashでの導入は未確認のため、zshでの導入についてのみ記述します。

# kubernetesのインストール
最新版のkubernetesはcurlにてダウンロードできます。
内容は公式ドキュメントをざっくり訳しただけです。
https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-binary-using-curl

```shell
# バイナリのダウンロード
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl

# バイナリを実行できるように権限の変更
chmod +x ./kubectl

# PATHの通ってるディレクトリにファイルを移動
sudo mv ./kubectl /usr/local/bin/kubectl
```

特定のバージョンをインストールしたい場合は、上記コマンドの`$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)`部を`v1.14.0`のようにバージョンに置き換えることで特定のバージョンをインストールできます。

```zsh:1.14.0をMacOSにインストールしたい場合
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.14.0/bin/darwin/amd64/kubectl
```

# kubectlのコマンド補完導入
bashの場合は、bash-completionを導入しないといけないようですが、
zshに関しては以下を実行して`source <(kubectl completion zsh)`を.zshrcに追記するだけです。
実行後はシェルを再起動するとコマンド補完が機能するようになります。

```zsh
echo "source <(kubectl completion zsh)" >> ~/.zshrc
```

もし、`complete:13: command not found: compdef`のようなエラーが出る場合は、
.zshrcの先頭に以下を追記してください。

```zsh:.zshrc
autoload -Uz compinit
compinit
```

# kubectlのバイナリ名を変更したい場合
kubectlはクラスタのkubernetesのバージョンに対して1マイナーバージョン以下のものを使用するように求められています。
つまり、クラスタのバージョンがv1.11の場合、v1.10, v1.11, v1.12のkubectlが使用できるわけです。
そのため、複数のバージョンのクラスタを利用している場合、複数のkubectlをインストールすることがありえます。
その際、バイナリ名を`kubectl-1.14.1`のように変更して、バイナリを保存する場合があると思います。
今回は、この場合での`kubectl-1.14.1`に対するコマンド補完の導入についてお話しします。

## 1. コマンド補完用のシェルスクリプトの生成
まず、上述の`kubectl completion zsh`コマンドを利用して、コマンド補完用のシェルスクリプトを生成します。
この際、必ずコマンド補完を導入したいバイナリで実行してください。

```zsh
kubectl-1.14.1 completion zsh > ./kubectl-1.14.1_completion.sh
```

## 2. 生成したシェルスクリプトの修正
生成したシェルスクリプトの`kubectl`を`kubectl-1.14.1`に置換します。
その際、以下の点に気をつけてください。

- `__kubectl_override_flag_list`は関数ではなく、変数のため置換しないでください
  - `kubectl-1.14.1`のようにピリオドが入るとコマンドと認識されるためエラーになります

## 3. .zshrcにシェルスクリプトを追記
以下を実行して、.zshrcにシェルスクリプトを読み込むよう追記しましょう。
これでシェルを再起動すると、バイナリ名を変更したコマンドにもコマンド補完が反映されます。

```zsh:ホームに保存した場合
echo "source ~/kubectl-1.14.1_completion.sh" >> ~/.zshrc
```

# あとがき
自分の環境でバイナリ名を変更したものにもコマンド補完効かせたいなと思い試行錯誤してみました。
自分がシェルスクリプトに慣れていないために、変数`__kubectl_override_flag_list`で、
変数にピリオドを使用するとコマンドと認識されてしまうと知らなくて、數十分ハマってしまいました。
他にも同じことをしたい、同じところでハマる（笑）人がいると思ったので、まとめてみました。
皆さんの助けになれれば幸いです。

compdef初めて触ったので、何か間違ってる箇所があればご指摘のほど、よろしくお願いいたします。

# 後記
結局、バイナリは一箇所に集約して、つどつど`/usr/local/bin`のシンボリックリンクを張り替えることにしました(笑)
その結果、シェル起動した際に張り替えた方のバイナリが呼ばれるので、`source <(kubectl completion zsh)`だけでよくなりました。
Clean my mac storage

# clean my mac storage
instead of OS reinstallation, I cleaned up my disk manually.

## homebrew cache
Problem: `~/library/Caches/Homebrew` went up to 2G
Solution: `brew cleanup -s`

## Jedi cache
Problem: `~/library/Caches/Jedi` went up to 1G
Solution: `rm -rf ~/library/Caches/Jedi`
Ref: `https://github.com/davidhalter/jedi/issues/957`

## JetBrains cache
Problem: `~/library/caches/RubyMine2018.X`
Solution: `https://www.jetbrains.com/help/ruby/working-with-projects.html#invalidate-cache`
Java ようこそ 二次元配列 の沼へ

#初めまして
保坂万里です

###初投稿です
いろいろ拙い部分あると思いますがよろしくお願いします。
あとJava駆け出し中のぺーぺーなので
レベル感としてはかなり低め設定です、ご容赦。

##早速ですが・・・
環境としては
・Windows10
・Eclipseプレアデス

##配列はお好きですか？
僕はまだそんなに好きじゃないです、まだ

##なぜハマってしまったか背景
配列をFor文で回数指定してループ処理
こんなコードを書きなさい。
んー、それなら配列自体をそもそも変数で管理できれば
見た目よくならないか？
インデックス番号で呼び出せて
結果記述量も減らせるんじゃないか？

って考えてしまったのがいけなかった、沼の扉が開く

##お待たせいたしました
さあぁて沼の紹介です、今回は配列を、配列に、ぶち込みます。
イメージできますか？僕はできません。
今回表記するのは簡略化と可読性の観点から
静的配列［　］を使用します。

でも配列は全て多次元化できるので
動的配列のArrayListや
連想配列のHashMapでも記述可能です。

##沼のサンプルコード

```java:.java

//１．まずは配列を生成していきます

String[] a = { "1", "yosiko", "kanagawa", "woman", "26" };
String[] b = { "2", "kenji", "kobe", "man", "23" };
String[] c = { "3", "vanri", "osaka", "man", "19" };

```

```java:.java
//その後、新しく配列を格納できる変数を宣言します

String[][] Lists = {a ,b ,c };

//...ん？んんむ？

```

その気持ちよくわかります

＜本当ですか？

・そもそもイメージが湧かない
・メリットを感じない

よく変数の例えで
段ボール箱とみかんを使いますよね

＜そうですね！

箱に入れておけばミカンを取り出しやすいですよね

でも箱の中にミカン以外のものが
ごっちゃり果物入ってたら
分かりずらいですよね？


、、は！

それなら果物ごとに箱に分けて入れて
大きい箱にまとめて入れてあげれば
どれに何が入ってるか把握しやすいぞ！


```java:Sample.java
//ダンボール箱1にミカン２つ入れます
//ダンボール箱2にリンゴを２つ入れます
String[] cardboardBox1 = {"mikan1", "mikan2"};
String[] cardboardBox2 = {"ringo1", "ringo2"};

/*
で、ダンボール箱をまとめる大きなダンボール箱を
用意してまとめてあげる
*/

String[][] bigCardboardBox = {cardboardBox1, cardboardBox2};

//変数宣言時の[]の数に注意

System.out.println(bigCardboardBox[0][0]);
// ="mikan1"が表示される
System.out.println(bigCardboardBox[1][1]);
// ="ringo2"が表示される

```

閉まったみかん一個食べたいなって思ったときまず開けるのは
大きい➀ダンボール箱(bigCardboardBox)
。
その後開けた中身を見ると今回は
もう一個➁ダンボール箱(cardboardBox)
がありますね。

やっとみかんが見えました。
(... .println(bigCardboardBox[X][Y]);)
(二次元配列の変数[行][列]の引数を指定します)

この流れ一つ一つの動作が
プログラミングで実行されている
というのをつかんでいただければ
幸いです。

図解があるとわかりやすいなと思ったので
リンクも載せます！

>【Java】2次元配列とは？
http://ysklog.net/java/5-18.html

##最後に

やり切った感あるけど見返すと
脈絡も起承転結もなく
お粗末な感じになりましたが書いてて
頭の中を整理できた気がしますので
やってよかったです。
Vuetifyでv-listにリンクをつける

# はじめに
Vue.jsでSPAサイトを作るときに[Vuetify](https://vuetifyjs.com/ja/)を使ってみました。
本記事に導入方法などの記述は省きます。

## 開発環境

```
$ npm -v
6.7.0
$ vue -V
2.9.6

Vuetify - v1.5.11
```

# やりたいこと
`v-list`に外部リンク(例; google.com)をつけたい。
`<a>`タグ使えば一瞬！なんですが、今回は極力Vuetifyで作りたかったのでソースをのぞいてみました。

# 方法
`v-list`の中に作っている、タイル（`v-list-tile`）にリンクを張る方法です。
外部リンクと内部リンクで書き方が若干違いました。
ここで外部リンクとは、外部ドメインのサイトで
内部リンクとはSPAの同サイト内のページを指します。
## 外部リンク
`v-list-tile`タグの中に`:href="URL"`とすればよいです。
これで外部リンクになります。

```vuejs:SPA_page1.vue
<template>
  <v-layout row>
    <v-flex mb-2>
      <v-list>
        <v-list-tile :href="http://google.co.jp">
          略
        </v-list-tile>
      </v-list>
    </v-flex>
  </v-layout>
</template>
```

## 内部リンク
同じサイト内の別のページに飛ばす場合は、`:href`ではなく`:to`を用います。
``<v-list-tile :to="page2">``
こんな感じです。
余談ですが、ルート（ / ）に飛ばしたい場合も`:to="/"`とすればOKです！

# おわりに
Vuetifyでサイト作ってますがマテリアルデザインって難しいですね！
Vuetifyの文献が少なくてもっと盛んになったらいいなって思います。
みなさまのお力添えになれば幸いです！

# 参考文献
https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/components/VList/VListTile.ts
Numpyを用いた画像生成・複製及び絶対値による比較

#Numpyを用いて画像生成・複製し、二枚の画像を比較するプログラム

##①乱数を用いて画像生成する関数を作る
np.ramdom.randint(m, n,(r,c))で、m以上6未満の数字の行列(r行c列)を作成します。

##②上で作成した画像の配列を一部ランダムに変更する関数を作る
shapeを用いて行列(r,c)を取得してshape変数に代入します。
for row .... for col...のパートでは、一行目の一列目、二列目、となめていき最終列までいったら二行目に行くようなプログラムになっています。一つずつスカラー値を取得しているわけですが、その中でif文でランダム(ここでは1/2の確率)でスカラー値を(m,n)の範囲で変更するプログラムを書いています。
変更するプログラムはmatrix[i,j]としている部分ですが、こちらはmatrix[i][j]でも変わりはないようです。
その後のrandint(m,n,l)のlは一つだけ乱数を生成することを指定する引数です。

##③ブロードキャストを用いて差分を取得
image1 - image2で行列の同じ位置にある要素同士を差し引き差分を取得します。
あとはnp.abs()で絶対値を取得し出力しております。


```py
import numpy as np

# 乱数の初期化
np.random.seed(0)

# 縦の大きさ、横の大きさを渡されたときに乱数で指定の大きさの画像を生成する関数
def make_image(m, n):
    
    # m×n行列の各成分を0~5の値でランダムに満たす
    image = np.random.randint(0,6,(m,n))
    
    return image


# 渡された行列の一部を変更する関数
def change_matrix(matrix):
    # 与えられた行列の形を取得し、shapeに代入
    shape = matrix.shape
    
    # 行列の各成分について、変更するかしないかをランダムに決めた上で
    # 変更する場合は0~5のいずれかの整数にランダムに入れ替える
   for row in range(shape[0]):
    for col in range(shape[1]):
        if np.random.randint(0,2) == 1:
            matrix[i,j] = np.random.randint(0,6,1)
    
    return matrix

# ランダムに画像を作成
image1 = make_image(3, 3)
print(image1)

# ランダムに変更を適用する
image2 = change_matrix(np.copy(image1))
print(image2)

# image1とimage2の差分を計算し、image3に代入
image3 = image1 - image2
print(image3)

# image3の各成分が絶対値である行列をもとめimage3に再代入
image3 = np.abs(image3)

# image3を出力
print(image3)

```
ファイルやメモリ内容の読み書き (Stream, Reader, Writer)

# 概念

ファイルなどからの入出力を「ストリーム」と呼び、「リーダー」で読み込み、「ライター」で書き込む。

- Stream　：　入出力
- Reader　：　ストリームの読み込み
- Writer　：　ストリームの書き込み

## Stream

ファイルの場合は FileStream、メモリの場合は MemoryStream を使う。

```
Stream
 ┣ BufferedStream
 ┣ FileStream
 ┗ MemoryStream
```

## Reader

ファイルの場合は StreamReader、文字列の場合は StringReader を使う。

```
TextReader
 ┣ StreamReader
 ┗ StringReader
BinaryReader
XmlReader
```

## Writer

ファイルの場合は StreamWriter、文字列の場合は StringWriter を使う。

```
TextWriter
 ┣ StreamWriter
 ┗ StringWriter
BinaryWriter
XmlWriter
```

# 使用例

## CSV 形式のテキストを解析
CSV 形式とは、

- 各フィールドをカンマで区切る
- 各フィールドを二重引用符で囲む (囲まなくても良いが、カンマが含まれる場合は必須)
- 二重引用符の場合は２つ続ける

```C#
using Microsoft.VisualBasic.FileIO; // Microsoft.VisualBasic.dll

var text = "abc,\"d\"\"ef\",\"gh,i\",jk";

using (var reader = new StringReader(text))
using (var parser = new TextFieldParser(reader) { TextFieldType = FieldType.Delimited, Delimiters = new[] { "," } })
{
	var fields = parser.ReadFields(); // ⇒ string[] { "abc", "d\"ef", "gh,i", "jk" }
}
```

## XML をメモリ上で XSL 変換してファイルに出力
XSLT とは、XML を異なる XML 形式などに変換するもので、ここでの説明は割愛

```C#
// カスタムクラスとそのインスタンスを用意
class Class1
{
	public string Dummy { get; set; }
}
var obj = new Class1();

// XSL ファイルを読み込む
var xslt = new XslCompiledTransform();
xslt.Load("test.xsl", new XsltSettings(true, true), null);

using (var memory = new MemoryStream())
{
	// カスタムクラスの内容を XML としてメモリに書き込む
	using (var writer = XmlWriter.Create(memory, new XmlWriterSettings() { Encoding = Encoding.UTF8, Indent = true }))
	{
		var serializer = new XmlSerializer(obj.GetType());
		serializer.Serialize(writer, obj, new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty }));
	}
	// メモリ内の XML を XSL 変換してファイルに出力
	using (var stream = new FileStream("sample.xml", FileMode.Create))
	{
		memory.Position = 0;
		xsl.Transform(memory, stream, Encoding.UTF8);
	}
}
```
Pythonで OSError: Python library not found: Python, libpython3.7m.dylib が出たときのメモ

#はじめに
pyinstallerを使って.pyファイルを実行ファイルにしようとしたときに起きたエラーに関する自分用メモ。

#環境
macOS 10.14.3(Mojave)
pyenv 1.2.10
Python 3.7.1

#エラー

```
OSError: Python library not found: Python, libpython3.7m.dylib, .Python, libpython3.7.dylib
This would mean your Python installation doesn't come with proper library files.
This usually happens by missing development package, or unsuitable build parameters of Python installation.

* On Debian/Ubuntu, you would need to install Python development packages
  * apt-get install python3-dev
  * apt-get install python-dev
* If you're building Python by yourself, please rebuild your Python with `--enable-shared` (or, `--enable-framework` on Darwin)
```

#対処
pyenvでPythonをインストールするときに enable-shared オプションを付ける。

```
$ PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.7.1
```

#補足
macOS MojaveのpyenvでPythonをインストールしようとすると、zlibがあるのに以下のようなエラーが出ることがある。

```
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] Error 1
```

##対処
Mojave用のmacOS SDK headerを手動でインストールする。

```
$ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
```
ターミナルのコマンド一覧

俗に言われる”黒い画面”

結構コマンドを忘れがちなので、書いておく。

ディレクトリ・・・フォルダ。
カレントディレクトリ・・・現在いるディレクトリ
ホームディレクトリ・・・ターミナルを起動したときのデフォルトのディレクトリのこと

<h2>cdコマンド(change directory)</h2>

ディレクトリの移動に使用

```console:
cd test.html  # testテストというファイルに移動する
cd ~/  #ホームディレクトリに移動する
cd ..  #1つ上の階層のファイルに移動する
cd ../../  #2つ上の階層のファイルに移動する
```


<h2>lsコマンド(list)</h2>

ファイル探すときによく使う。
カレントディレクトリのファイル名を表示させる

```console:
ls  #カレントディレクトリにあるファイルやディレクトリを表示する
ls -l  #ファイルやディレクトリの詳細も同時に表示する
ls -a  #隠しファイルも含めファイルやディレクトリを全て表示する
ls −la  #隠しファイルを含む全てのファイルやディレクトリの詳細を表示する
```

探したいものにもよるけど、基本よく使うのは

ls
Permission deniedが出たときなんかは
ls -l
を使う。

<h2>pdwコマンド（print working directory）</h2>
現在のディレクトリ（カレントディレクトリ）を表示

```console:
pwd  #カレントディレクトリのパスを表示する
```

<h2>touchコマンド</h2>

空のファイルの生成

```console:
touch test.html  #test.htmlという中身が空のファイルを作る
```


<h2>mkdirコマンド(make directory)</h2>
新しい空のディレクトリ（フォルダ）を作成

```console:

```

<h2>mvコマンド（move）</h2>

ファイルを移動したりファイル名の変更

公式:
`mv 対象ファイル 移動先`


```console:
mv test.html tmp/  #test.htmlというファイルを相対パスでtmp/に移動する
mv test.html test2.html  #test.htmlというファイルをtest2.htmlに名前変更する
```

<h2>cpコマンド(copy)</h2>

ファイルのコピー

```console:
cp test.html tmp/  #test.htmlを相対パスでtmp/というディレクトリの中にコピーする
cp test.html test2.html  #test.htmlをtest2.htmlという名前でコピーする
cp −r dir /tmp/  #dirというディレクトリとその中身を絶対パスで/tmp/にそっくりコピーする
```

<h2>rmコマンド(remove)</h2>

ファイルの削除

```console:
rm test.html  #test.htmlを削除する
rm -r test  #testというディレクトリとその中身を削除する
rm -f test  #testというファイルを警告なしで削除する
rm -rf test  #testというディレクトリとその中身を警告なしで削除する
```

最近よくTwitterでネタにされてますが、
本当に悲劇です。


<h2>openコマンド</h2>

ターミナルからFinderでファイルを開く

```console:
open .  #現在のターミナルのディレクトリFinderで開く
open ~/  #ホームディレトリをFinderで開く
```

全く使っていなかったので、これからは使っていこうと思います。


<h2>catコマンド</h2>

ファイルの中身を表示する

```console:
cat test.html  #test.htmlの中身を表示する
cat -n test.html  #test.htmlの中身を行番号と一緒に表示する
```

ーーーーーーーーー（追記）ーーーーーーーー

<h2>curlコマンド</h2>

HTTPやFTPでのダウンロードやアップロードに使用

```console:
curl http://www.google.com/　＃googleのサイトが表示される
```

```console:
curl -O http://img.yahoo.co.jp/images/tv/yjtv.gif　＃ファイルへの保存（-O）
curl -o google.html http://www.google.com/ #google.htmlへ出力
curl -R http://www.hoge.com/photo.jpg　＃タイムスタンプの保持
curl -L http://www.google.com/　＃リダイレクト対応
```

<h2>whichコマンド</h2>

ファイル名の検索。パスが表示される。
（もっと早く知りたかった。）

```console:
which test.html
```
Carthage の "Could not find any available simulators for iOS" というエラー対応方法

## とりあえずバージョンをあげる

```sh
$ brew upgrade carthage
```

でとりあえずCarthageを最新のバージョンにします。

## fastlaneを使う

Carthageの古いバージョンから、19/4/12現在 最新のCartahge v0.33.0 にしても、

```sh
$ carthage build --platform iOS
```

などしている最中に

```
Could not find any available simulators for iOS
```

というエラーで怒られるときは、

```sh
$ fastlane snapshot reset_simulators
```

fastlaneを使ってシミュレーターの再インストールをすると良いです。

## CI上でこのエラーが発生している場合

```sh
$ fastlane snapshot reset_simulators --force
```

のように `--force` オプションをつけると、コマンドライン上で確認が発生せず、「キー入力待ち」状態にならずに `reset_simulators` してくれます。
「キー入力待ち」状態になってしまうとJenkinsビルドが止まってしまうので、この方法がよろしいかと思います。

## 参考リンク

carthage build command complains about "Could not find any available simulators for iOS" · Issue #2602 · Carthage/Carthage · GitHub
https://github.com/Carthage/Carthage/issues/2602#issuecomment-426956743
Androidで秘匿情報をNDKで隠蔽化する

# はじめに
Androidは通常ProGuardで難読化が行われますが、暗号化ではないためにソースコードやxml内の文字列は残ってしまいます。そのため、そこにパスワードやsecret keyなどの秘匿情報を記述していると、リバースエンジニアリングによって漏洩してしまうリスクがあります。

そこで、この記事ではNDK側に秘匿情報（文字列）を持たせ、情報を隠蔽化する方法について書きます。

# 実装方法
サンプルはこちらに置いておきます
https://github.com/shcahill/NDKSample

## Nativeファイルの用意

任意の場所に`cpp`ディレクトリを用意し、Cファイルをaddします。
ここに秘匿情報を記載してください。

```c:jni-sample.c
#include <string.h>
#include <jni.h>

JNIEXPORT jstring JNICALL
Java_com_shcahill_ndksample_MainActivity_stringFromJNI(JNIEnv *env, jobject thiz) {
    return (*env)->NewStringUTF(env,
                                // 秘匿情報の文字列（ここのコメントは残ってしまうので、実際には書かない）
                                "string from JNI!");
}
```

関数名は命名規則があります。

1. 先頭に`Java_`をつける
2. パッケージ名を`_`繋ぎでつける
3. 呼び出すKotlin/Javaコードのファイル名をつける(拡張子は付けない)
4. 関数名をつける

この例だと、MainActivityからstringFromJNIという名前で呼び出せます。
また、この例の場合、`thiz`が未使用だとwarningが出ますが、消せませんのでご注意ください。
※パッケージ名にアンダースコアが含まれると、アンダースコアの後ろに`1`を付与する必要があります。
[パッケージにアンダースコアが入っていた場合にJNI関連でハマったのでメモ](https://qiita.com/HogeTatu/items/666dcaae1a94b9d04a8f)

次にMakeファイルを同じ場所に追加します。

```makefile:CMakeLists.txt
add_library(
        # library name using at Kotlin code
        jni-lib-name
        # as a shared library
        SHARED
        # relative path to C/C++ file
        jni-sample.c)
```
`add_library`の第一引数は、Kotlin側からsoファイルをloadするときのライブラリ名ですので、任意の名前を付与してください。
第三引数はC/C++ファイルの相対パスです。（ここではMakeFileと同じディレクトリに格納しているため、ファイル名だけになっています）

## gradleの設定

Cファイルを読み込むためにはgradleで指定を行い、syncする必要があります。

```gradle:app/build.gradle
android {
    ...
    externalNativeBuild {
        cmake {
            version '3.10.2'
            path "src/main/cpp/CMakeLists.txt"
        }
    }
}
```

sync後、Android Studio上にも先ほど追加したファイルが表示されるようになります。

## Kotlin側の実装

soファイルのロードします。MakeFileで指定した第一引数の名前です。
このクラス実行時の一番最初にやりたいため、companion objectのinitで実行します。

```kotlin:MainActivity.kt
companion object {
  init {
      System.loadLibrary("jni-lib-name")
  }
}
```
ここで、soファイル名をtypoしたりするとこのファイルを呼んだタイミングで、soファイルがロードできないとエラーが出てクラッシュします。

最後に、ロードしたsoファイルから呼び出しを行います。関数名、戻り値は`jni-sample.c`で定義したとおりにします。

```kotlin:MainActivity.kt
private external fun stringFromJNI(): String
```

あとは、使いたいところで普通の関数として`stringFromJNI()`を呼べます。

## .gitignore
`app/.externalNativeBuild`を追加しておくと中間生成物をignoreできます。

# References

公式ドキュメントも充実しています。
[公式ドキュメント](https://developer.android.com/ndk/samples/sample_hellojni?hl=ja)
cypher queryの使い方メモ（自分用）

#ノードの登録（CREATE）

>基本編

#####CREATE (ノード[:ラベル]{属性名:属性内容,・・・・})

**CREATE (n:Person)**
⇒ノードにPersonというラベルが付いたノードが作られる

**CREATE (n:Person:admin)**
⇒ノードにPerson,adminというラベルが付いたノードが作られる


**CREATE (n:Person{name:"taro"})**
⇒ノードにPersonというラベル、name属性にtaroを持ったノードが作られる


**CREATE (n:Person{name:"taro",age:"33"})**
⇒属性は何個でも登録できる

**CREATE (n:Person{name:"taro"}),(m:Person{name:"jiro"})**
⇒複数のノード登録

>関係

**CREATE (n:Person{name:"taro"})-[r:FRIEND]->(m:Person{name:"jiro"})**
taroとjiroが友達（taroは友達と思ってるけど、jiroは友達と思っていない。ひどい）

**MATCH  (n:Person{name:"taro"}),(m:Person{name:"jiro"}) CREATE UNIQUE (n)<-[r:FRIEND]->(m)**
⇒UNIQUEは１回だけ関係を作る。＜＞は関係を作りたい方向
【Linux】いちいちバッチおわるまでターミナル開いてじっとまっているの？【nohup】

```
./test.sh 
```

.
.
(処理が終わらない。ターミナルが落とせない。PCの電源も落とせない。帰れない。)
.
.
(帰りたい)
・
.
(1時間経過...)


あなたは人生の時間をだいぶ損してますわよ。（いいすぎ）


そんな事しているあなた。解決策は２つ。

```
$ ./aaa.sh &
[1] 1606
$
$ aaa
[1]+  Done                    ./aaa.sh
```

バックグラウンド起動
でもターミナルのセッション切れたら処理もおわっちゃう。
だからあなたは帰れないわね。


***そんなあなたに朗報よ！！！***

```
$ nohup ./aaa.sh &
[1] 1600
$ appending output to nohup.out
$
```

nohup コマンドは自分のセッションが切れても、サーバー側にプロセスが残ります。
なのでサーバを再起動かけるかkillしない限り動き続けます！

※ただ標準出力はnohup.outに取られてしますので注意。
　まあバッチで標準出力なんてしてないから気にしたことなしw

nohupでコマンド実行して5分サーバーを関しして問題なければお家に帰りましょう。
起きた頃にはおわっているわよ。

※実行後は数分は監視したほうがいいです。
間違っていたりしてサーバー負荷あがったりする可能性もあります。
翌日上司に怒られちゃうよw


ということでよい Linux 生活を！！
[javascript]5分前の日時を取得する

5分前の年月日＆日時取得の際、取得した時の時刻が0:00の場合、日付も時間(hour)も変わってしまうためのめも。

```js

var now = new Date();
var before5min_unix = now.getTime() - 300000; //ミリ秒なので(300秒*1000)
var before5min = new Date(before5min_unix);

var year = before5min.getFullYear();
var month = before5min.getMonth()+1;
var date = before5min.getDate();
var hours = before5min.getHours();
var minute = before5min.getMinutes();

console.log(year+'/'+month+'/'+date+'/ '+hours+':'+minute);
```

結果

```
2019/4/12/ 13:33
```
エンジニアのための東京おすすめ技術書店　（元書店員）



### おすすめ書店
- [渋谷ジュンク堂](https://honto.jp/store/detail_1570061_14HB320.html)★★★★★
    - 最強
    - 椅子（大体いつも埋まってしまっている印象）
    - カフェ（確か未会計の本は持ち込めない）
    - 技術書量としては池袋より多く感じる
    - エレベータが混雑するので７階まで上がるのがだるい
    - 棚一列にずらっと技術書が並び、本の位置関係を把握しやすい
    
- [池袋ジュンク堂](https://honto.jp/store/detail_1570019_14HB320.html)★★★★★
    - 最強
    - 椅子（３～７階にそれぞれ４～６脚ずつ）（ひじ掛けあり）
    - カフェ（確か未会計の本は持ち込めない）
    - とりあえず全部ある
    - 棚付近はエスカレーターが近く、人通りが少し多い
    - エスカレータは一人用（幅が狭い）なので、渋滞しがち
    
- [神保町東京書店](http://www.tokyodo-web.co.jp/)★★★
    - トレンドを抑えている　AI推し？　
    - ジュンク堂と比較して量は多くはないがポイントを押さえた本
    - カフェ（確か未会計の本は持ち込めない）
    
- [神保町三省堂書店](https://www.books-sanseido.co.jp/shop/kanda/)★★★★
    - オライリー本や設計関連多数
    - 話題本はもちろん、SE向けの棚、オライリー棚などカテゴリ分けが良い
    - フロア内の一番奥に棚が配置されているため落ち着いて書籍を吟味できる
    
- [代官山蔦屋書店](https://store.tsite.jp/daikanyama/floor/shop/tsutaya-books/)★★★
    - 棚の配置がよい、エモい本に出合える
    - 本との出会いを大切にしており、意図してジャンル分けを行っていない。
        - 新書サイズの数学の本の隣にオライリー本が置かれていたり、急に洋書がまじっていたりと、出版社別や体様を無視して、内容の関連性・結びつきをもとに独自の配置を行っている。素敵。
    - **2019.06.04 再訪**
        - スターバックス、コンビニ（ファミリーマート）が入っており、一部のエリアではコーヒー持ちながら売り場を歩ける　＆　壁面に沿って机が並んでいる個所もあり、学生や社会人が勉強をするのに適している。
        - 本屋としては素晴らしいと感じるが、**プログラミング言語に関する本は少ない。オライリー本も少なめ。**
            - Goの参考書は１冊しかなくて残念。
        - Python や統計学の本は多めでありトレンドは抑えているよう。
        - 洋書（プログラム、ソフトウェア、テクノロジー全般）がないのが残念
            - 代官山蔦屋書店は洋書が多いイメージですが、プログラミング関連の洋書はざっと見たところ見つかりませんでした。都内でプログラミングに関する洋書を扱っているお店を知っている方がいらしたら是非教えてください。
        - エンジニアにとってはもう少し、と感じることもあるかもしれない。とはいえ 広々として落ち着いた空間、独自の本・本棚の配置はとても素敵なもので、ここでしか味わえない時間を過ごせる。
            
- [秋葉原 書泉ブックタワー](https://www.shosen.co.jp/tower/)★★★★★
    - オライリー本や設計関連多数
    - 雑誌も充実していて Software Design や WEB-DBPRESS も一部バックナンバーも含め揃っている。
    - ムックも多い
    - **2019.05 再訪**
        - ジャンルの幅広さ、品揃えはジュンク堂（池袋・渋谷）と同列で都内トップレベルではないだろうか。ソフト・ハード・インフラ・クラウド・デザイン・イラスト・CG・VR・AR・電子工作・マネジメント・DevOps....**この店に行くと手ぶらで出てくることができない。**
        
- [有隣堂 ヨドバシAKIBA店](https://www.yurindo.co.jp/store/tokyo-akihabara/)★★★
    - カフェ　未会計の本読める（３冊まで持ち込み可能）
    - 文房具店と同フロアにあり、ノート・ペンの購入も可

### 書店の良しあし判断
悪い例
#### いわずもがな系
- 新しい本が少ない
- 蔵書数が少ない
    - 冊数が少なくてもよい本屋はあります。（しっかりしたリサーチを行っている）
    

#### 配置がおかしい系
- 書店員の理解不足の可能性が大きい
- Java の隣に JavaScript 本を置かないでくれ
- リーダブルコードを音楽コーナーにおかないでくれ


#### とりあえず機械学習系
- Python本をとりあえず置いておけばいいという心の声が漏れ伝わっていますよ



エンジニアに好ましい書店が今後もっとたくさん増えてくると嬉しいと感じます。
日々、更新していきます。
もしプログラミングやソフトウェア開発に関するお勧めの書店様がございましたら、東京に限らず是非教えていただけますと幸いです。
ABC - 108- A&B&C

#AtCoder ABC 108 A&B&C
[AtCoder - 108](https://atcoder.jp/contests/abc108)

#A問題

 - ループしてカウントしたパターン

```java

	private void solveA() {
		Scanner scanner = null;
		int numK = 0;
		int eqaC = 0;
		int oddC = 0;

		try {
			scanner = new Scanner(System.in);
			numK = scanner.nextInt();
			for (int i = 1; i <= numK; i++) {
				if (i % 2 == 0) {
					eqaC++;
				} else {
					oddC++;
				}
			}

			System.out.println(eqaC * oddC);

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#A問題:2

 - 数値K
    - 奇数の個数：$(K+1)/2$
    - 偶数の個数：$K/2$

```java
	private void solveA2() {
		Scanner scanner = null;
		int numK = 0;

		try {
			scanner = new Scanner(System.in);
			numK = scanner.nextInt();

			System.out.println((numK / 2) * ((numK + 1) / 2));

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#B問題

 - 頂点が反時計回りの長方形
    - 紙に実際に書いてみると頂点の算出は簡単（頭の中だけだとﾁｮｲ無理）

```java
	private void solveB() {
		Scanner scanner = null;
		int x1 = 0;
		int y1 = 0;
		int x2 = 0;
		int y2 = 0;

		try {
			scanner = new Scanner(System.in);
			x1 = scanner.nextInt();
			y1 = scanner.nextInt();
			x2 = scanner.nextInt();
			y2 = scanner.nextInt();

			int x3 = x2 - (y2 - y1);
			int y3 = y2 + (x2 - x1);
			int x4 = x3 - (y3 - y2);
			int y4 = y3 + (x3 - x2);

			System.out.println(x3 + " " + y3 + " " + x4 + " " + y4);

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#C問題

上手くまとめられないので思考過程を記述するのを放棄する

参考：これらのサイトのお世話になりました
[ARC102[Triangular Relationship]](https://qiita.com/nomikura/items/590922f179f6f6ce69c2)
[ABC108: C - Triangular Relationship](https://pyteyon.hatenablog.com/entry/2018/09/02/094228)
[AtCoder ARC 102 C - Triangular Relationship (300 点)](http://drken1215.hatenablog.com/entry/2018/09/02/011000)

```java
private void solveC() {
		Scanner scanner = null;
		int numN = 0;
		int numK = 0;

		try {
			scanner = new Scanner(System.in);
			numN = scanner.nextInt();
			numK = scanner.nextInt();

			long cnt = 0;

			if (numK % 2 != 0) {
				long numCount = 0;
				for (int i = 1; i <= numN; i++) {
					if (i % numK == 0) {
						numCount++;
					}
				}
				cnt = (long) Math.pow(numCount, 3);
			} else {
				long numCount = 0;
				long numCount2 = 0;
				for (int i = 1; i <= numN; i++) {
					if (i % numK - numK / 2 == 0) {
						numCount++;
						//						System.out.println(i + " : 0");
					} else if (i % numK == 0) {
						numCount2++;
						//						System.out.println(i + " : 1");
					}
				}
				cnt = (long) Math.pow(numCount, 3) + (long) Math.pow(numCount2, 3);
			}

			System.out.println(cnt);

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}

```
【PHP】API Keyなしで使えるGoogle翻訳ライブラリを見つけたので使ってみる

API Keyの登録をしないで使えるGoogle翻訳のPHPライブラリないかなーと探していたら、見つけたので使ってみます。

GitHub：https://github.com/ammarfaizi2/GoogleTranslate
Packagist：https://packagist.org/packages/ammarfaizi2/googletranslate

# 使ってみる

## インストール

```
>composer require ammarfaizi2/googletranslate
Using version ^0.0.1 for ammarfaizi2/googletranslate
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing ammarfaizi2/googletranslate (0.0.1): Downloading (100%)
Writing lock file
Generating autoload files
```

## テストコード

拙作の[「【随時更新】一風変わったWeb APIをまとめてみた」](https://qiita.com/danishi/items/42d8adf6291515e62284#chucknorrisio)で紹介しているチャックノリスAPIを呼び出して、戻ってきたジョークを翻訳してみます。

```php:ChuckNorrisFact.php
<?php
require "vendor/autoload.php";

use GoogleTranslate\GoogleTranslate;

// チャックノリスAPIの呼び出し
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://api.chucknorris.io/jokes/random');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
$chuckNorrisFact = json_decode($response, true);

// 結果を翻訳
$text = $chuckNorrisFact['value'];
$from = "en"; // English
$to   = "ja"; // 日本語
$st = new GoogleTranslate($text, $from, $to);
$result = $st->exec();
?>

<html>
    <body>
    <h2>翻訳前</h2>
    <p><?= $text ?></p>
    <h2>翻訳後</h2>
    <p><?= $result ?></p>
    </body>
</html>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/57bfeb22-239d-868c-c514-d0c505f5dece.png)

余計なローマ字読みがくっついてきてますがちゃんと翻訳できてます！
HttpListner.Start()でアクセス拒否された話

# 現象
下記のようなコードを書いたところ、HttpListenerException が発生した。

```C#
// string endPoint = "http://localhost:8080"; // こちらは例外でない
string endPoint = "http://<host>:8080"; // こっちは例外が出る
HttpListener server = new HttpListener();
server.Prefixes.Add(endPoint);
server.Start();
```

# 対策
ネットで調べたところ、管理者で実行しないとエラーになるらしい
参考）　http://sweep3092.hatenablog.com/entry/2014/12/27/160005

参考元の記述に従い、マニフェストファイルでプログラムを管理者権限で実行するよう、修正した。

```xml
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
```
[GAS] icsで読み込んだ外部カレンダーを新しいイベントにするプログラムを作り始めました

プログラミング入門として、Google Apps Script（GAS）をいじってみることにしました。

とりあえずやってみたいのが「Googleカレンダーが外部からics形式で読み込んでいるイベントを、Googleカレンダーにコピーする」です。なぜそんなことをしなければならないのかは、聞かないでください(>_<)。

いろいろ試しながらひどいコードを書いているのですが、このたび初めて「やったことはまとめておけ」という格言があることを知ったので、あわててまとめているという状況です。

### プログラムの概要
入門者なりに何をしなければならないのかを考えてみました。

- 外の予定表をicsで読み込む（具体的には会社のdesknet's）＝source
- Googleカレンダーに読み込んだイベントを登録するカレンダーを用意する（で、用意しました）＝destination
- 両者を比較して、読み込んだ外部カレンダーにしかないイベントをリストアップする（コピーするイベント）＝last
- lastでリストアップしたイベントを1つずつ、新しいイベントとしてdestinationに登録する
- lastを次回のインポート用に保存しておく

今まとめていて、最後のインポート用に保存しておくのって必要かなという疑問が…。実は現時点でいろいろと悩んでいるところがここらあたりなので、そもそもその処理が不要ならば悩む必要もないじゃんorz。

**なるほどまとめるのって必要だヽ(^o^)丿**

まとめることの大事さがわかったところで、今日はここまでにしておきます。
RailsでインラインJSが動作しなくなったときの対応

RailsでインラインJSを書くと下記エラーで動作しなくなりました:frowning2:

```javascript
Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self' https:". Either the 'unsafe-inline' keyword
```

原因は、Ruby on Rails 5.2の新機能にContent Security Policyが追加されたことでした。
デフォルトの設定のままではインラインJSが動作しないので
`content_security_policy.rb`ファイルの`policy.script_src`に`:unsafe_inline`をつけることが必要になります。

例

```ruby:content_security_policy.rb
policy.default_src :self, :https
policy.font_src    :self, :https, :data
policy.img_src     :self, :https, :data
policy.object_src  :none
policy.script_src  :self, :https, :unsafe_inline
policy.style_src   :self, :https, :unsafe_inline
```

今回はrailsからJS側にデータ渡す必要があったため、インラインJSをやむを得ず使いましたが、
極力はJSファイルを読み込むように気をつけたいですね:relaxed:
ActiveRecord::LockWaitTimeoutが発生したときにtransactionでハマってた

## 背景
railsでウェブサービスを作っています。ありがたいことにユーザー数も増えてきました。そこで起きたことについてのメモです。

## 結論
ActiveRecord.transactionを貼っていたことが原因でLockWaitTimeoutが発生していました。

#### before
```
ActiveRecord.transaction do
  users.each do |user|
    user.do_something
    user.profile.do_something
  end
end
```

#### after
```
users.each do |user|
  ActiveRecord.transaction do
    user.do_something
    user.profile.do_something
  end
end
```

「transactionを全体に貼るなよ」というのはあると思いますが、お金の関わるところだったので全体で処理が完了するように担保したかったという背景もあり。。

## 起きたこと
ユーザー数が増えてきたタイミングから `ActiveRecord::LockWaitTimeout` が発生するようになりました。

## 調査1（パフォーマンス・チューニング）
まずはログを見ましたが、アクセスが増えてるわけでも重い処理が走っているわけでもなさそうでした。
ということでnginx / puma / mysql の設定を疑いました。

### nginx
ワーカープロセス数は `auto` になっていたので自動でコア数に合わせて作成されます

```/etc/nginx.conf
worker_processes auto;
```

### puma
[pumaのドキュメント](https://github.com/puma/puma/blob/master/docs/deployment.md#mri)より
ワーカー数→CPUコア数 ~ 1.5倍
スレッド数→16
が良いそうです。

```.env
RAILS_MAXTHREADS = 16
WEB_CONCURRENCY = CPU_NUM * 1.5 = xx
```

```config/puma.rb
threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
threads threads_count, threads_count
workers ENV.fetch("WEB_CONCURRENCY") { 2 }
```

### mysql
```.env
RAILS_MAXTHREADS = 16
WEB_CONCURRENCY = CPU_NUM * 1.5 = xx
```

```config/database.yml
pool: <%= ENV['RAILS_MAX_THREADS'] || 5 %>
```

### 結果
ユーザーの接続数などが原因かと思っていましたがそんなこともなくLockWaitTimeoutは引き続き発生していました。

## 調査2
ログ見ても特に問題点がなさそうだったので、ダメ元で社内の人に確認すると「運用のとある処理中」にLockWaitTimeoutが発生していることが判明。
ユーザーの動きとは別のものがトリガーで起きていたようです。

該当するソースを読んだらtransactionを貼っていて、修正したら発生しなくなりました。

## 最後に
ActiveRecord::LockWaitTimeout
まわりで調べても設定まわりの話が多くメモ的に残しておこうと思いました。どなたか同じように詰まっている方のお力に慣れれば幸いです。

# ActiveRecord.transactionが何をしているか気になったので追ってみました。
[ソース](https://github.com/rails/rails/blob/a953f7f674997517c5b9580335dda3338840aa84/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb#L204)を読む。

多分データベースのトランザクションを開始してる。

mysqlのトランザクションのかかり方は以下のURLより
http://bluerabbit.hatenablog.com/entry/2013/12/07/075759
https://qiita.com/dorarep/items/d7d767e1bceb2d5649a7
SPSS Modelerの拡張Rノードの詳細ログ

SPSS Modelerでは、RやPythonをストリーム内で動かすことができる拡張ノードがあります。
拡張ノードでRを使う時 [^1] 、拡張ノード内に定義したRコードで発生したエラーがストリームメッセージには表示されません。これはとてもデバッグしづらく、通常はストリーム外のR Studioなどで開発して完成したコードを移植したりします。

しかし、以下の方法で拡張ノードのRコードで発生したエラーを、ログファイルに出力することができるようになります。

[^1]: SPSS Modeler Client, Modeler Server, Modeler Solution PublisherにR Essentialsをインストールすると使えるようになります。https://www.ibm.com/support/knowledgecenter/ja/SS3RA7_18.2.1/modeler_r_plugin_install_project_ddita/clementine/programmability_option/r_essentials_install_overview.html

### 設定方法

Rノードの設定ファイルconfig.iniに以下の行を追加します。

```
TRACE=C:\test\rLogs
TRACE_LEVEL=Data_Trace
```

TRACEはディレクトリ名です。
config.iniは、Modeler Client, Modeler Server, Modeler Solution Publisherのインストールディレクトリ配下にあります。
例：C:\Program Files\IBM\SPSS\ModelerServer\18.1\ext\bin\pasw.rstats\config.ini

拡張ノードでRを使うときはぜひお試しを。
Windows環境構築チートシート

## Windows update

## Chrome

## Ubuntu(WSL)
 ・Xming
 ・Acaconda
 ・ssh 簡略化

## Movaxterm

## VSCode

## VMware Player(CentOS7,MacOS,ESXi)

## Vertual Box

## XAMMP
　・Moodle
　・Mahara
　・WordPress

## WinSCP

## git設定
Angularで@typesがなかった時の対処法

Qiita初投稿になります。
フロントエンジニアとしてデビューしてちょうど半年経ったかなー位の初心者です٩( 'ω' )و
今回はAngularでCytoscape.jsを使って困った時の経験を書いていきます！
因みにcytoscape.jsとはグラフを良い感じに表示してくれる(と信じている)
javascriptのライブラリです。
####cytoscape.js
http://js.cytoscape.org/

####表示したいグラフデモ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311852/f8aeb6af-f991-dfb2-94e9-f551cc20741f.png)

#npmインストールしてimportしても使えない！？
今回はグラフを描くのにcytoscape.jsのcose-bilkentとというレイアウトを使いたくて
実装しようとしたんですけどドキュメント通りに
これドキュメント
https://github.com/cytoscape/cytoscape.js-cose-bilkent

```hoge.component.ts

import cytoscape from 'cytoscape';
import coseBilkent from 'cytoscape-cose-bilkent';

cytoscape.use( coseBilkent );

```

と書いてもCannot resolve definitions for module 'cytoscape-cose-bilkent' って怒られる！
#神々からの助言
んでなんでだろーってなったところで@typesが無いんじゃない？と神(職場の先輩)の声が
取り敢えず@types探してみようとコマンド打ってみるも
`npm install --save-dev @types/cytoscape-cose-bilkent`
無い！！！
また困って調べたらネットの神が残したであろう記事を発見！
[**npm module に typescript の型定義がない時に、とりあえずビルドが通るようにする**](https://medium.com/@ryutamaki/npm-module-%E3%81%AB-typescript-%E3%81%AE%E5%9E%8B%E5%AE%9A%E7%BE%A9%E3%81%8C%E3%81%AA%E3%81%84%E6%99%82%E3%81%AB-%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9A%E3%83%93%E3%83%AB%E3%83%89%E3%81%8C%E9%80%9A%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B-fcc090804b21)
これこれーーー！と思いつつ見てみたら
tsconfig.jsonに設定を追加するって書いてある( *｀ω´)

+ 1src/@types ディレクトリを作成
* 2..d.ts を1のフォルダ内に配置

との事＿φ(￣ー￣ )
早速src配下に@typesフォルダ作成してcytoscape-cose-bilkent.d.tsファイル作成！
中身はこんな感じ

```src/@types/cytoscape-cose-bilkent.d.ts
declare module 'cytoscape-cose-bilkent';
```

そして
`tsconfig には typeRoots というプロパティがあり、これは型定義を探し始める root のディレクトリを決めるオプションです。デフォルトが @types になっているので、 自分の typescriptプロジェクト内に @types を追加することで自動的に .d.ts を探しにいってくれます`
との事なのでこれも実装(☝︎ ՞ਊ ՞)☝︎
これでなんとかむりくりビルド通して理想のグラフを実装出来ました！

#まとめ
これからも出会って行くであろう@types無い問題の備忘録として残しました。
拙い記事ですが何かご指摘や他にもこんなやり方あるよ！等がありましたら
コメントお願いします！
これからも備忘録やionic,Angular記事を中心にフロントエンジニア業界の小栗旬を目指して頑張っていきます。
Android(Kotlin)とWebView(Vue.js)間でデータのやり取りをする

# はじめに

AndroidアプリにはWebサイトを表示することができるWebViewというものがあります。
そこで、AndroidとWebView間でデータをやり取りするのにどうしたらいいのかを書いていこうと思います。

## やりたいこと

- WebView から Android にデータを渡す
- Android から WebView にデータを渡す

## WebView から Android にデータを渡す

`webView.webChromeClient` の `onJsAlert` を使っていきます。
これはWebView内のJavaScriptの `alert` を検知して発火するイベントです。
`alert` に表示する文字列を `onJsAlert` の引数 `message` として受けることができます。

### Android

```kotlin:WebViewActivity.kt
// 省略
  webView.webChromeClient = object : WebChromeClient() {
    override fun onJsAlert(view: WebView, url: String, message: String, result: JsResult): Boolean {
      // 処理
      result.cancel()
      return true
    }
  }
// 省略
```

### WebView

```vue
<template>
  <div class="home">
    <button @click="callNativeFunc()">Submit</button>
  </div>
</template>

<script lang="ts">
import { Component, Vue } from "vue-property-decorator";

@Component({})
export default class Home extends Vue {
  public callNativeFunc() {
    alert(JSON.stringify({key: "test", msg: "hoge"}))
  }
}
</script>
```

## Android から WebView にデータを渡す

`webView.evaluateJavascript()` を使って WebViewのWindowオブジェクトに埋め込まれた関数を呼び出します。
下記の例では `window.testFunc` をAndroidからコールしています。
WebViewではVueコンポーネントの `mounted()` のタイミングで window オブジェクトにAndroidから呼ばれる関数を宣言しています。

### Android

```kotlin:WebViewActivity.kt
// 省略
  val text = "{key: \"test\", msg: \"Message from Native\"}"
  webView.evaluateJavascript("window.testFunc('$text')", null)
// 省略
```

### WebView

```vue
<template>
  <div class="home">
    <button @click="callNativeFunc()">Submit</button>
  </div>
</template>

<script lang="ts">
import { Component, Vue } from "vue-property-decorator";

@Component({})
export default class Home extends Vue {
  public mounted() {
    (window as any).testFunc = (text: string) => {
      // 処理
    };
  }
 
  public callNativeFunc() {
    alert(JSON.stringify({key: "test", msg: "hoge"}))
  }
}
</script>
```

## 結論

個人的には割とイレギュラーな形でデータの受け渡しをしているので、管理が大変になるというか、アプリの仕様が複雑化するなーと感じました。
WebViewは静的なサイトを表示するだけにした方が、アプリとしての治安が守られるのかなーという気がしました。
ほかにもっといい方法あるよ！という知見をお持ちの方がおられましたら、その知見をご教授ください…
ではまた！！！
Safariでinput type="search" にスタイルが当たらない

Safariで`<input type="search">` にスタイルが当たらないバグがあります[^1]。

```html:index.html
<input class="search-field" type="search" placeholder="キーワードから探す" />
```

```css:style.css
.search-field {
    box-sizing: border-box;
    width: 180px;
    height: 40px;
    padding-left: 10px;
    border: solid 2px red;
}
```
![スクリーンショット 2019-04-12 12.24.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119598/5094e815-4ab7-5792-3a18-0a7b4132b674.png)
なんでや！ 直接style属性をいじっても `!important`をつけても効果なし…。

```css:style.css
.search-field {
    box-sizing: border-box;
    width: 180px;
    height: 40px;
    padding-left: 10px;
    border: solid 2px red;
    -webkit-appearance: textfield; /*これを追加*/
}
```
`-webkit-appearance: textfield;` を書き加えてあげると、期待通りの表示になりました。
![スクリーンショット 2019-04-12 12.24.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119598/36fe15c3-5f5b-755b-de7e-d1ed35499917.png)
[この記事](https://news.mynavi.jp/article/20100910-input-type-search-on-webkit/)や[この記事](https://css-tricks.com/webkit-html5-search-inputs/)を見ると2010年から放置されてるみたいですね…
[^1]: バージョン12.1 (14607.1.40.1.4) で発生を確認
vim をおすすめする理由 【gif画像あり】

vimは覚えることがいっぱいですが、覚えるとかなり使い勝手が
いいエディタだと思います。

はるか昔、新人研修のときに日報をviで書けっていわれて、普通なら5分でかけるのに
1時間くらいかかって、ゲロゲロしながら書いた記憶がありますw

現在は、ほぼすべての開発をvimのプラグインとか使ってやっています。
なんとなくつかっているの見たことないですよね？ということでgifを作成して貼ってみました。


百聞は一見にしかずー
-----

![vim.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344266/63caa488-2e00-38cb-d9ee-86b63e346a05.gif)


これはプラグインとか入れずに素のvimです。
貼り付ける関係でスピードはちょっと早くなっています。
が本気だせばこのくらいの速度でもできます(たぶん...)

ちなみにもとのテキストは青空文庫から吾輩は猫であるを拝借しました...



### 最大のメリット
見ていたいたらわかると思いますが、マウス使っていません。
全部コマンドでやっています。
なんといってもこれが最大の魅力かと思います。

### デメリット
やはり癖があるのでなれるのに時間がかかることではないでしょうか...
あとはやり補完機能がちょっと弱いかなってところですね。

基本プラグイン入れない派なので...
いれればそうでもないのかな？



もっといろんな事できます。しらべてやってみると楽しいですよ。
※コマンドはMacを基準に書いています。windowsもほぼ一緒です。


やっていることを順番に説明書きしていきます。


[解説]gif内でやっていること
----

``` 
:set nu
```
行を表示しています。（ほとんどの方はvimの初期設定 .vimrcに入れてしまっていると思います。）

```
:set nowrap
```
画面幅で折返しするのを解除しています。
逆の場合は:set wrapです

```
：mark a
```
a(任意の一文字)という名前で場所を記憶しています。
犬のおしっこみたいな感じで目印をつけている感じです。

:mark bも同様です。

:marks でなににmarkされているか一覧出せます。
　　※ここだけ説明のために唯一マウス使っています。

```
:'a
```

さっきのa の場所に移動しています。
markさえしておけばいつでも好きな場所に戻れるわけですね。

ｂも同様にやっています。


```
shift + g
```

ファイルの最後まで移動しています。


```
:1663
```
1663行目まで移動しています。

```
/。$
/[A-Z]
```
検索しています。正規表現使えます。当然普通の文字列とかでも可能です。

/。$ → 最後が。で終わっている行を検索
/[A-Z] 大文字の英字A〜Zまでのどれかを検索

```
w
b
```
w　で次のワード移動（すすむ）です。
b　で次のワード移動（もどる）です。


```
shift + d
```

行の今いる場所から後ろの文字を全部消します。

```
dd
```
行ごと全部けします。
4dd とかだと ４行消せます。

```
ctrl + v →　移動 → shift + i
```
短形挿入しています。
gifではtestっていれていますね

```
ctrl + v → 移動 → d
```

短形削除です。
短形選択したところをまるまる削除しています。

```
:wq!
```

保存してファイルを閉じる
:q! →　保存せずにファイルを閉じる


gif内では使ってないけどおすすめコマンド
----

```
:colorscheme darkblue
```
色がきれいになります。
darkblue 以外にもいろんな種類があります。
Monokaiとかが人気？


```
ctrl + u
ctrl + d
```

画面の半分単位で上下に移動します
u が 上 up
d が　下 down


画面単位で動くのもありますが、動きすぎるので私は嫌いですw

```
d → shift + g
```
今いるところから後全部けします。
意外によく使いますw


```
Enter (ただのエンター押すだけ)
```

次の行の行頭にいきます

```
追記モードに入るときに数字を打ちます
80 → a  → #と入力
```

80個#が挿入されます。
これなにげに便利ですよw
↓こんな感じw

```
################################################################################
##  これ作るときにラクちんw
################################################################################
```


```
set list
```
行の最後が$とでたりタブが^Iとでてくれるので
へんなところにタブとかいないか探せます。
逆はset nolist



あと基本的な↓

`l 右`
`h 左`
`k 上`
`j 下`

とかは別の方の記事を参考にいただけると幸いです。


※あとここでは割愛しますが、コピーもコマンドでできますが、素のvimだと正直マウス使うのが早いです。
そこは無理せずマウス使っちゃいましょうw
でも私はtmuxのコピーモードをつかっていますのでそこもマウスレスです。


それではHappyな　vim　生活を　！！！
dockerコンテナでnpmパッケージをインストールするときに使う設定

コピペ用
CIでのインストール時間を短縮したい。無視できるエラーやwarningはそもそもでないようにしたい


## オプショナルものはスキップする

macでしかインストールされないもの（`fs-event` etc..）とか, `optionalDependencies`に登録されるものとか（`utf-8-validate`とか）

```sh
yarn --ignore-optional
```

## yarn.lockのupdateはしない

`yarn add xxx` でのみ、`yarn.lock` は更新されるようにしたい

```sh
$ yarn --frozen-lockfile
```

## devDependenciesだけインストール

CIでlintだけしたいときとか。

```sh
npm install --only=dev
```

**yarnはいまのとこできない**

- [このPR](https://github.com/yarnpkg/yarn/pull/6564)がマージされたらできるようになる

```shell
yarn install --devDependencies
```
#python でサブプロセスを起動し #shell に引数・環境変数・標準入力を与え標準出力する例

- subprocess.run で色々できる
- `.stdout` で標準出力結果を得られる

# shell

```shell
#!/usr/bin/env bash

echo "Stdin is" $(cat /dev/stdin)
echo SOME_ENV is "$SOME_ENV"

echo First arg is "$1"

echo "Stdout!"

```

# python

```py
#!/usr/bin/env python3

import subprocess

stdout_of_shell = subprocess.run(['./eg.sh', 'banana boat'], \
  stdout=subprocess.PIPE, \
   input='Water fall!', \
   env={"SOME_ENV":'Wow'}, \
   encoding='utf-8').stdout

print(stdout_of_shell)

```

# exe

```
$ ./proc.py
Stdin is Water fall!
SOME_ENV is Wow
First arg is banana boat
Stdout!

```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->