OmniAICreator/Qiita-1.07M huggingface dataset:
sinatraサブディレクトリ構成

# 前書き
webアプリケーションにて複数のアプリケーションをURLだけ変更し同一ポート（80番）で運用したい場合がある
例えば下記のような形だ

http://exsample.com         #=>アプリ1つ目
http://exsample.com/hoge1　 #=>アプリ2つ目
http://exsample.com/hoge2　 #=>アプリ3つ目

fqdn以降のURLが違う、サブディレクトリでの運用となる
今回は上記をsinatraでやる方法を紹介します。

以前別の記事↓でも紹介した方法でも可能ですがもっといい方法が見つかったため、新規で紹介します。
[nginx+puma+sinatra サブディレクトリ、unixソケット構成（ポートなんぞ使わん）](https://qiita.com/Gen_Arch/items/6ea67cc726bd1d865667)


# File構成
```
/var/www/
app/
　├ config/puma.rb
　├ log/*.log
　├ tmp/
　│　├ pids/puma.pid
　│　└ sockets/puma.sock
　├ config.ru  ★
　├ app.rb
  └ api.rb

※bundle系ファイル略
```
ファイル構成はおおよそ前回と差分はない、api用のsinatra記述はファイルを分けたかったため、別ファイルとしている、注目は★マークがついてるconfig.ruというrubyでwebサーバー機能を提供している
Rackの設定ファイルをいじることでサブディレクトリでの運用の実現が可能となる。

↓Rackについては下記記事がわかりやすかったです。
[Rack解説 - Rackの構造とRack DSL](https://qiita.com/higuma/items/838f4f58bc4a0645950a)

# アプリ構成
http://exsample.com/hoge     #=> メインページ
http://exsample.com/hoge/api #=> API用URL

上記構成を作っていきます。

# sinatra設定
sinatra側のファイルを作成します。
## メインページ
```Ruby:app.rb
require "sinatra/base"

class App < Sinatra::Base
  set :server, :puma

  get "/" do
    "hello world"
  end

  get "/redirect" do
    redirect to("dest")
  end

  get "/dest" do
    "yattaze"
  end
end
```

## API用URL

```Ruby:api.rb
require "json"
require "sinatra/base"


class Api < Sinatra::Base
  set :server, :puma
  
  get "/" do
    content_type :json
    response = {test: "hogege"}
    response.to_json
  end
end
```

今回APIページはアクセスしたらjsonを返すようにする。


# Rack設定
サブディレクトリ運用のため、Rack設定ファイルでmapを使用する

```Ruby:config.ru
require_relative "app"
require_relative "api"

root_path = '/hoge'

map(root_path){run App}          #=> メインページへのアクセス設定
map(root_path + '/api'){run Api} #=> API用URLへのアクセス設定
```

# Puma設定
特に前回と差分ないので下記参照
[nginx+puma+sinatra サブディレクトリ、unixソケット構成（ポートなんぞ使わん）](https://qiita.com/Gen_Arch/items/6ea67cc726bd1d865667)


# nginx設定

rewriteがいらなくなりました。

```
location /hoge {
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;

  #puma unix socket
  proxy_pass http://unix:/var/www/app/tmp/sockets/puma.sock;
}
```

サービス起動で無事、サブディレクトリ運用完成
ステージング環境から本番環境にデータ移行する際のテーブル定義の比較(MySQL)

業務でクライアント確認環境で修正したデータを本番に移行してほしいとの依頼があった。
しかしテーブル定義の変更を伴う修正がまだ進行しているため、
単純にテーブルダンプしてデータを持っていけない、と。

そこで、何とかしてテーブル定義を比較する方法はないかなと思ったのが最初。
実際、 `desc <テーブル名>;` で一つずつ見ていけばいいのですが、10テーブル以上になるのであきらめた。

※この方法が取れる前提として、 `information_schema.COLUMNS` の閲覧が可能なこと。
※個人的にdescで表示される内容が見慣れているので、それ合わせにしている。

```
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME AS `Field`, COLUMN_TYPE AS `Type`, IS_NULLABLE AS `Null`, COLUMN_KEY AS `Key`, COLUMN_DEFAULT AS `Default`, EXTRA AS `Extra` 
FROM COLUMNS 
WHERE TABLE_SCHEMA = '[対象のテーブルスキーマ]' AND TABLE_NAME IN ([カラムを確認したいテーブル名]) 
ORDER BY TABLE_SCHEMA ASC, TABLE_NAME ASC, ORDINAL_POSITION ASC;
```

以上！

なんてことはない、descで拾ってくる内容を自分で拾い直しただけのこと（なんか抜けもれありそうな予感）。
しかし、これでテキストベースでごっそりdescが抜けるので、
WinMergeとか比較ツールで比較すれば割と正確にサクッと確認できる。

自分の備忘メモ。
ウォーターフォール開発での典型的な失敗の流れ

# はじめに

ウォーターフォールという開発プロセス自体を否定する気はありません。
つくるものが明確でしっかり管理されていればもっとも効率よくシステムを開発できるプロセスだと思います。

しかし、どの会社やプロジェクトも同じ失敗を繰り返しています。
こんなプロジェクトがいくつも続き、破格の見積りが通ったプロジェクトで利益を得ています。
もしくは有能な管理者がいるプロジェクトで臨機応変にアジャイルやスパイラルのような手法を混ぜて進めているおかげでプロジェクトが成功を納めているケースもあるでしょう。

15年ほどいろんな会社やプロジェクトに参画させて頂きました。比較的大きなプロジェクトに参画することが多かったのでIT関係者以外の人が聞いてもみんな知ってるほどの名高い大企業がほとんどです。
そこで私がウォーターフォールと名乗るプロジェクトでも成功を見たのはすべてスパイラルやRUP(Rational Unified Process)のようにフェーズ内で設計と製造を繰り返したり推敲フェーズのようなタイミングで技術的な準備するなど、「デキる管理者」がコントロールしているプロジェクトでした。

あなたのプロジェクトが以下のどこかの段階を迎えているなら、
一度立ち止まって改善すべきではないかとよく考えてください。

# よくある失敗の流れ(フィクションではありません)

1. 要件定義が長引く(やりたいことがすべてわかるわけがない)
1. 基本設計は更に長引く(実際に整理するとやりたいことが増えてくる)
1. 納期までの工数が減ってきたので詳細設計は適当になる
1. 詳細設計終わってないのに報告上終わったことにして製造フェーズ突入
1. 時間がないので人員を増やす(短期間で一気に工数を使い果たす)
1. 急に集めた人員なのでエンジニアの能力差は当然バラバラだけど教育する時間もない
1. 設計担当はボトルネックになりてんやわんや
1. 詳細設計と製造を並行でやるので手戻りしまくり
1. 納期を守るためといういいわけでテストコード作らない
1. こんな詳細設計でオフショアやニイショアやって更に悲惨なことになる
1. オフショア・ニアショアで製造された画面がほぼ動かない
1. オフショア・ニアショアともめる
1. 結局引き取ったプログラムを修正しまくる(ほぼ作り直す)
1. 製造終わってないのに報告上終わったことにしてテストフェーズ突入
1. 単体テスト終わってないのに結合テストフェーズに突入
1. 詳細設計と製造とテストを並行でやる
1. 仕様変更も来るのでさらに工数は圧迫
1. 基本設計・詳細設計はあとで修正することにして製造だけやる
1. テストフェーズだけどやってることは不具合修正の毎日(実際には製造)
1. なんちゃって結合テストを終えてシステムテストや受け入れテストをする
1. このときはじめて動くシステムを見たユーザから指摘が大量発生
1. 終わってない製造とユーザからの指摘対応と仕様変更でもはや収拾不可能
1. 連日の残業や休日出勤は当たり前で開発メンバーは疲労困憊(メンバーもミスもうなぎのぼり)
1. なぜリスケしないのかと内部から反発出まくり
1. リリース日直前になってリリース日延期
1. リリース日延期とリリース対象を縮小する
1. たいして延期しないのでリカバリーできるわけもなく品質ぼろぼろで数を揃えただけの状態で本番開始
1. 不具合対応と緊急リリースに追われる毎日
1. プロジェクトは赤字で一旦本番を迎えたのでエンジニアを手放す(開発メンバーは9割が外注)
1. リリース対象を縮小した分すぐに二次開発がはじまる
1. やることは山ほどあるのに人が減りメンバーへの負荷はさらに上がる
1. 引継もろくにないので未開のプログラムを解析しつつ不具合対応する(デグレ発生可能性が上がる)
1. 未開の仕様を確認したくても設計書はメンテナンスされていないので謎だらけ
1. 年単位の不具合対応を経てやっと安定
1. 何年も経ってるうちに要望や世間の情勢も変わる
1. その間も仕様変更しまくる
1. そうする間にミドルウェアやフレームワークのサポート期限が間近になる
1. リプレースしましょうと提案
1. ミドルウェアやプログラム言語などバージョンがかなり変わっていて移行はかなり難航(かなり作り直し)
1. テストコードがないので手動でテストし直し(莫大な工数)

# 代表的な開発プロセス

* ウォーターフォール
* アジャイル
    * SCRUM(スクラム)
    * XP(エクストリーム・プログラミング)
    * カンバン(リーンソフトウェア開発)
* スパイラル
* プロトタイプ
* ラショナル統一プロセス(RUP)

# まとめ

システム開発のプロジェクト管理をやっている方はぜひともこの辺りを一通り確認することをおすすめします。
また、システム開発としては初心者という人も開発プロセスを意識しあなたのチームでプロジェクトの成功を勝ち取るための積極的に模索してください。

技術はほとんどが調べれば解決できると思いますが、マニュアル通りやってもうまくいかないのがプロジェクトの進め方です。一つのやり方だけではないことを知り、開発プロセスの型にはまるのではなくチームに合わせて柔軟に組み合わせる必要があると思います。
Redmineのバックアップ ～パスワード入力不要でPostgreSQLをバックアップ～

Redmineのバックアップスクリプトで、
PostgreSQLのパスワード入力をスキップする方法があったので、備忘として記載します。


### 1. ".pgpass" ファイルの作成
[公式ドキュメント](https://www.postgresql.jp/document/9.5/html/libpq-pgpass.html)によると、ユーザのホームディレクトリにパスワードを保存可能な旨記載があるので、".pgpass"ファイルに以下の書式で作成していきます。
> hostname:port:database:username:password

バックアップユーザのホームディレクトリに移動し、".pgpass" ファイルを作成します。

```
$ cd ~
$ echo "*:*:*:*:password" > .pgpass
```

権限はグループ、他のユーザアクセスをすべて拒否する必要があるため（緩くするとファイルは無視される）、必要最小限の権限（600）に変更します。

```
$ sudo chmod 0600 ~/.pgpass
```

### 2. バックアップファイル保存フォルダ作成
```
$ mkdir ~/backup
```


### 3. スクリプト作成

```
$ cat redmine_backup.sh
#!/bin/sh

pg_dump -U redmine -h localhost  -Fc -c -f ~/backup/db_redmine_`date "+%Y%m%d_%H%M%S"`.car redmine
tar -zcvf ~/backup/files_`date "+%Y%m%d_%H%M%S"`bak.tar.gz /var/lib/redmine

find -name "db_redmine_*" -mtime +30 -exec rm {} \;
find -name "files_*" -mtime +30 -exec rm {} \;
```
※別のサーバにデータを退避する必要がある場合は、rsyncコマンド等を追加してください。

### 4. 実行権付与
```
$ chmod +x redmine_backup.sh
```


### 5. cronによるスケジューリング
毎日2時にバックアップスクリプトを実行します。

```
$ crontab -e
00 2 * * * /作成したスクリプトの配置場所/.redmine_backup.sh
```


### 参考サイト
* [pg_dumpの実行時にパスワード入力を省略する](http://totutotu.hatenablog.com/entry/2016/05/13/161405)
勤務スケジューリング問題の最適解をブラウザ上で算出

#概要：
10人×１週間　程度の制約条件付き勤務シフト表の場合、１秒未満で最適解算出可能。

##必要なもの：
- ブラウザ＋ネット環境
- 制約条件の表(下記のようなCSV)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/351020/1e584db0-1c32-0ced-52a1-f0c6802d6037.png)

[入力データのCSV版はこちら](https://github.com/zaq9/test_nurse_scheduling/blob/master/sc_sample_data.csv)
[ブラウザ上で上記データをもとに最適解を計算したい方はこちら](https://colab.research.google.com/github/zaq9/test_nurse_scheduling/blob/master/test_nurse_scheduling.ipynb)


## 実行結果：

```
CPU times: user 11.2 ms, sys: 3.04 ms, total: 14.2 ms
Wall time: 31.1 ms
目的関数 0.0

   曜日 時間帯                結果
0   月   朝          従業員1従業員5
1   月   昼      従業員3従業員5従業員7
2   月   夜      従業員1従業員3従業員4
3   火   朝          従業員0従業員3
4   火   昼      従業員3従業員5従業員7
5   火   夜      従業員4従業員5従業員8
6   水   朝          従業員0従業員5
7   水   昼      従業員1従業員3従業員5
8   水   夜      従業員3従業員4従業員8
9   木   朝              従業員3
10  木   昼          従業員5従業員7
11  木   夜          従業員8従業員9
12  金   朝          従業員1従業員5
13  金   昼      従業員1従業員7従業員9
14  金   夜      従業員5従業員6従業員8
15  土   朝          従業員0従業員3
16  土   昼  従業員2従業員6従業員7従業員9
17  土   夜  従業員3従業員4従業員6従業員9
18  日   朝          従業員0従業員9
19  日   昼  従業員2従業員3従業員6従業員9
20  日   夜  従業員2従業員3従業員4従業員6
```

##CSVデータ読み込み：
今回はGitHub上にアップロードしたCSVを読み込む形式

```python 

a = pd.read_csv('https://raw.githubusercontent.com/zaq9/test_nurse_scheduling/master/sc_sample_data.csv').T

```

##コメント：

- 「スケジュール案にご不満ある方は、代替案をブラウザ上で作成し、関係者に調整の上、連絡くださいね♪　」（というパターンも可能に）
　
- 検討課題：サイズが大きい問題＆最適解がない場合への対応。多様な要望や状況を制約条件た目的関数に落とし込むための工夫。

# 参考：

- [遺伝的アルゴリズムでナーススケジューリング問題（シフト最適化）を解く](https://qiita.com/shouta-dev/items/1970c2746c3c30f6b39e)
　⇒　今回の入力データはこちらから（約２分で計算可能とのこと）

- [組合せ最適化でナーススケジューリング問題を解く](https://qiita.com/SaitoTsutomu/items/a33aba1a95828eb6bd3f)　⇒　今回はほぼこちらのソースコードを利用させていただきました
（エラーがでた表読込部分をCSV読込版に変更）

- [勤務表を解くアルゴリズム](http://www.nurse-scheduling-software.com/tutorial/newpage4.htm)

- [人間中心の勤務表スケジューリング（ナーススケジューリング）作成－池上式（１）](https://blog.goo.ne.jp/xmldtp/e/71a1de81a8bce2e8e509bc28fa7dad97)

- [我が国におけるナース・スケジューリング(池上 敦子)](http://cleo.ci.seikei.ac.jp/~atsuko/PAPER/d-ron/diss_s.pdf)
リーダブルコードを読んだ感想とすぐに実践したいこと【プログラミング学習177日目】

# はじめ
個人用メモです。

完全未経験者がプログラミングを始めてもうすぐ半年が経ちます。

ポートフォリオ制作を通して実際に手を動かし、それをコードレビューしてもらうことで、綺麗なコードを書くべき理由や重要性を感覚的に掴めてきたこともあり、このタイミングで[リーダブルコード](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655)を一気に読み進めました。

今回はリーダブルコードを読むことで得たことやすぐに実践してみたい箇所について言語化することを目的として、要点を簡単にメモしていきたいと思います。

# 要点
この本を読むことで、**美しいコードの定義、および、他人が読んでも、未来の自分が読んでも分かりやすいコードを書くべきであるという究極にシンプルな原理・原則**を学ぶことができました。

一見すると当然のことを言っていてとても簡単な話のように見えますが、シンプルに見えるものほど難しいというのがこの世の真理だと思います。

上記の原理・原則を実践するためのリファクタリングの考え方やテクニックにおいて、特に、初心者の私にとってもイメージしやすく、すぐに取り掛かりたいと感じたものを選別すると以下5つが挙げられます。

```
1. 読み手に誤解なく情報が伝わる変数名・関数名・コメントを付ける
2. パッと見で体裁が揃っていると感じられるコードを書く
3. 複雑なネストを作らない
4. コードは常に短くコンパクトに保ち、不必要な部分は断捨離する
5. 難しいロジックは一度言語化して咀嚼してみる
```

この本の最後の解説部分でも触れられているように、一朝一夕では読みやすいコードを書けるようになるはならないということを理解し、まずはイメージのしやすい上記5つを日々意識・実践し続けることで、一人前のエンジニアに着実に近づけられればと思います。

# まとめ
- リーダブルコードを通して、「美しいコードの定義」と「他人が読んでも、未来の自分が読んでも分かりやすいコードを書くべきであるという究極にシンプルな原理・原則」を学ぶことができました。
- シンプルに見えるものほど難しいということを肝に銘じ、日々意識・実践し続けることで、一人前のエンジニアに着実に近づけられればと思います。

# 参考書籍
- [リーダブルコード](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655)
AdobeXDのアートボードをUnityのPrefabに変換するツール Xd2uGUI


アートボードに配置されたノードの情報をもとにuGUIのプレハブを自動生成するツールを作りました。

![xd2ugui1.jpg](https://qiita-image-store.s3.amazonaws.com/0/113504/1381dda5-2581-9e7a-bf3f-d9d3342ecd52.jpeg "xd2ugui1.jpg")

# 環境
Unity 2018.3以降　（プレハブの仕組みが変わったため）
.Net 4.x
AdobeXD 14.0

# リポジトリ

AdobeXDからプレハブ生成用の中間ファイルを出力するためのプラグイン
[XDA Exporter](https://github.com/teach310/xda_exporter)

中間ファイルからUnityのプレハブを作り出すツール
[Xd2uGUI](https://github.com/teach310/Xd2uGUI)

# 概要

AdobeXDでゲームのUIのモックを作ってから実際にUnityで作り始めるのは完成系が早い段階で見えるという点で非常に有効です。

しかし、デザイナーが作ったモックからUnityのプレハブをまた一から作る作業は非常に面倒な上に結構工数とられます。

当時、PSDからuGUIのプレハブを自動生成するツールはあったのですが、AdobeXDから生成するツールはなかったので自作にいたりました。


同じく、AdobeXDからプレハブを生成するitouh2-i0plusさんの以下の記事があります。
https://qiita.com/itouh2-i0plus/items/6a948aa40acada879ce7

こちらの記事のプラグインは[Baum2](https://github.com/kyubuns/Baum2)用に作られているのに対して、Xd2uGUIはプレハブを作るツールでしかなく、UIの実装には全く依存しないというメリットがあります。

# 使い方手順
1. プラグインをインストールする
2. Unity側に画像素材をあらかじめ入れておく
3. AdobeXDのアートボードをXDAファイルとして出力する
4. XDAからプレハブを生成する。

# Unity、AdobeXDのプラグインをインストールする

## Xd2uGUIのインストール

[こちら](https://github.com/teach310/Xd2uGUI)からリポジトリにとぶ


![スクリーンショット 2019-02-19 20.37.58.jpg](https://qiita-image-store.s3.amazonaws.com/0/113504/41f8661c-6b07-6c95-ed26-0805afed1883.jpeg "スクリーンショット 2019-02-19 20.37.58.jpg")

![スクリーンショット 2019-02-19 20.38.30.jpg](https://qiita-image-store.s3.amazonaws.com/0/113504/ac47a878-0164-f18f-5a9a-7cf3dc9567c1.jpeg "スクリーンショット 2019-02-19 20.38.30.jpg")

Unityを開いた状態でダウンロードしたファイルを開くと以下のポップアップがでるのでInstallしたら完了です。

![スクリーンショット 2019-02-19 20.42.26.jpg](https://qiita-image-store.s3.amazonaws.com/0/113504/d7f55ec1-8b0f-6034-6e33-01b5bb73101a.jpeg "スクリーンショット 2019-02-19 20.42.26.jpg")

エラーが出た場合はUnityの環境を確認してみてください。



## XDA Exporterのインストール

![スクリーンショット 2019-02-19 20.58.43.jpg](https://qiita-image-store.s3.amazonaws.com/0/113504/562ec819-5ac9-817c-12b8-28925fe9e587.jpeg "スクリーンショット 2019-02-19 20.58.43.jpg")
ない場合はAdobeXDのバージョンを確認してみてください。

# Unity側に画像素材をあらかじめ入れておく
Xd2uGUIで画像の出力はしないので、自分であらかじめUnityにインポートします。
![あ.png](https://qiita-image-store.s3.amazonaws.com/0/113504/5ef4aeea-f7ad-1659-519f-98120a1e6237.png "あ.png")

画像ファイルの場所はどこでも大丈夫ですが、画像名とAdobeXDのノード名は一致させてください。

![スクリーンショット 2019-02-19 21.07.49.png](https://qiita-image-store.s3.amazonaws.com/0/113504/aef47057-d281-8aaa-c3d0-721f2e36325f.png "スクリーンショット 2019-02-19 21.07.49.png")

Imageとして使うので形式はSpriteにしておきます。
![スクリーンショット 2019-02-19 21.08.58.png](https://qiita-image-store.s3.amazonaws.com/0/113504/4c09f2b3-4f6f-2938-a927-62749201493c.png "スクリーンショット 2019-02-19 21.08.58.png")

# AdobeXDのアートボードをXDAファイルとして出力する
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/113504/2003ec7d-28a8-ba63-95e4-68d67e11fca1.jpeg "2.jpg")

アートボード内のノードを選択し、`プラグイン > Export XDA`で出力できます。

# XDAからプレハブを生成する。

Xd2uGUIが入っていればUnityにインポートするだけで隣にプレハブが生成されます。
手動で生成したい場合にはReimportします。

![Reimport.gif](https://qiita-image-store.s3.amazonaws.com/0/113504/95a15ea1-4c9a-0cb3-f731-a5021a8ef8ca.gif "Reimport.gif")

# まとめ
デフォルトでは非常にシンプルな生成ロジックになっています。
生成ロジックはカスタマイズ可能なので、より正確に生成されるようにしたりTextMeshProで生成できるようにするなどぜひぜひ拡張してみてください！
(プルリクしていただけるととても嬉しいです)
SHAPについてのリンク集

# 実装

[SHAP](https://github.com/slundberg/shap)

# Kaggleのエクササイズ

6番目
[Machine Learning Explainability](https://www.kaggle.com/learn/machine-learning-explainability)

Day3/4
[Machine Learning for Insights Challenge Sign-Up](https://www.kaggle.com/ml-for-insights-signup)

# 論文のまとめ
読み会
[NIPS2017読み会@PFN Lundberg and Lee, 2017: SHAP](https://www.slideshare.net/ryoinokuchi/nips2017pfn-lundberg-and-lee-2017-shap)

SHAPへの言及あり
[機械学習の公平性と解釈可能性](https://speakerdeck.com/yohrn/fairness-interpretability-and-explainability-federation-of-workshops)

arxivを日本語でまとめてくれた方のissues
[[2018] Consistent Individualized Feature Attribution for Tree Ensembles #17](https://github.com/yoheikikuta/paper-reading/issues/17)


# ブログ記事
[DataRobotの記事：SHAP を用いて機械学習モデルを説明する
]
(https://www.datarobot.com/jp/blog/explain-machine-learning-models-using-shap/)

[説明モデルSHAP概説＋説明モデルを要因分析に使う時のメモ]
(https://tebasakisan.hatenadiary.com/entry/2019/02/20/190357)

[Interpreting complex models with SHAP values](https://medium.com/@gabrieltseng/interpreting-complex-models-with-shap-values-1c187db6ec83)

[続・機械学習モデルを解釈する方法 SHAP value](https://linus-mk.hatenablog.com/entry/2018/10/28/230410)
VisualStudio2017で、Python3/OpenCVを使って画像を表示する

#はじめに
唐突に画像と動画を加工してみたくなり、VisualStudio2017でPython3/OpenCVを使ってみました。

VisualStudioでPythonを使うためには、インストーラーから変更を行う必要があるそうです。
詳細な手順は下記のドキュメントを参照。
[Windows に Visual Studio の Python サポートをインストールする方法](https://docs.microsoft.com/ja-jp/visualstudio/python/installing-python-support-in-visual-studio?view=vs-2017#visual-studio-2017)


#環境情報など
- Windows10 (1803)
- Visual Studio 2017 (Version 15.9.7)
- Python3.6
- opencv-python (4.0.0.21)


#作業手順
###1. Pythonの新規プロジェクトを作成
###2. OpenCVをインストール
1.　右クリック後に`Pythonパッケージのインストール(I)`を選択
2.　`パッケージ(PyPI)`に変更
3.　`opencv-python`を選択してインストール
![opencv_install.gif](https://qiita-image-store.s3.amazonaws.com/0/308224/57a865e1-79f2-f560-2961-d8420b0e7ba8.gif)

###3. サンプルコードを記述して実行
```Sample.py
import numpy as np
import cv2

#パスを指定して画像を読み込み
image = cv2.imread("samplepath\sample.png")

#画像の左上から 高さ100px 幅100px 分を切り取り
clipedImage = image[0:100,0:100]

#読み込んだ画像をSampleウィンドウで表示
cv2.imshow('Sample', image)

#切り取った画像をClipedSampleウィンドウに表示
cv2.imshow('ClipedSample', clipedImage)

#何かキーが押されるまで待機
cv2.waitKey()
```


#参考資料
下記のサイトを参考に実装してみました。

- [【python】VisualStudio2017のpythonでopencv](http://alpacatech.hateblo.jp/entry/2018/05/29/184225)
- [【Python/OpenCV】窓画像の作成（切り取り）](https://algorithm.joho.info/programming/python/opencv-roi-py/)
[WPF] Prism 7.1 で Prism Template Pack を使った開発

Prism6.3からの移行はすんなりできずに諦めようと思ってたけどわりと行けそうだったので最初の段階から徐々に掘り下げて書いていきたいと思います。

- [Prism 7.1 で Prism Template Pack を使った開発](#prism-71-%E3%81%A7-prism-template-pack-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E9%96%8B%E7%99%BA)
  - [開発環境](#%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83)
  - [拡張機能](#%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD)
    - [Prism Template Pack の導入](#prism-template-pack-%E3%81%AE%E5%B0%8E%E5%85%A5)
    - [ソリューションの拡張機能](#%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD)
  - [新規プロジェクトの作成](#%E6%96%B0%E8%A6%8F%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90)
  - [モジュール用プロジェクトを追加](#%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E7%94%A8%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E8%BF%BD%E5%8A%A0)
  - [モジュールを設定](#%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E8%A8%AD%E5%AE%9A)
  - [RegionManagerにViewを登録](#regionmanager%E3%81%ABview%E3%82%92%E7%99%BB%E9%8C%B2)
  - [実行](#%E5%AE%9F%E8%A1%8C)
  - [まとめ](#%E3%81%BE%E3%81%A8%E3%82%81)

## 開発環境

* Windows 10
* Visual Studio 2017

## 拡張機能

### Prism Template Pack の導入

* 「ツール」メニューの「拡張機能と更新プログラム」をクリック
* 右上の検索窓で「prism」を検索
* 「Prism Template Pack」をダウンロード

### ソリューションの拡張機能

* Prism.Wpf v7.1.0.431
* Prism.Unity v7.1.0.431

## 新規プロジェクトの作成

* Prism Blank App (WPF) を選択し、名前を入力してOK

![新しいプロジェクト](https://qiita-image-store.s3.amazonaws.com/0/256143/9687792c-21c6-f793-2d01-ce149cc85e79.png)

* Unity を選択してCREATE PROJECT

![PRISM PROJECT WIZARD](https://qiita-image-store.s3.amazonaws.com/0/256143/cf68a8b5-43ec-1a35-6446-0cc478be9640.png)

* 作成されたのでそのままF5でデバッグしてみる

![ソリューションエクスプローラー](https://qiita-image-store.s3.amazonaws.com/0/256143/8269bf32-4412-f691-28b1-b7a92a9c3d26.png)

* 無事起動できた

![初期画面](https://qiita-image-store.s3.amazonaws.com/0/256143/0717ffbe-53a5-2978-8fd0-2c21e48e6c1d.png)

## モジュール用プロジェクトを追加

* ソリューションを右クリック　⇒　追加　⇒　新しいプロジェクト

* Prism Module (WPF) を選択して名前を入力してOK

![新しいプロジェクトの追加](https://qiita-image-store.s3.amazonaws.com/0/256143/28ae0b78-303f-5068-5db4-13015f321a30.png)

* View(UserControl)とViewModelとModuleが作成される

![ソリューションエクスプローラー](https://qiita-image-store.s3.amazonaws.com/0/256143/e9ab2440-e36d-59c0-c238-4d3ff3a55b35.png)

* ソリューションを右クリックして「NuGetパッケージの復元」を実行

* 最初のプロジェクトに参照設定

![参照マネージャー](https://qiita-image-store.s3.amazonaws.com/0/256143/c81a1847-593a-fb99-2565-61adef95f875.png)

## モジュールを設定

App.xaml.csでConfigureModuleCatalogをオーバーライドしてモジュールをカタログに追加

```C#:App.xaml.cs
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
    moduleCatalog.AddModule<MainContentModule>(InitializationMode.WhenAvailable);
}
```

## RegionManagerにViewを登録

OnInitializedに↓の2行を追加してViewを登録

```C#:MainContentModule.cs
var regionManager = containerProvider.Resolve<IRegionManager>();
regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewA));
```

## 実行

![モジュール導入後画面](https://qiita-image-store.s3.amazonaws.com/0/256143/fc3fb535-356a-d065-1de1-08c2d9e4442a.png)

## まとめ

Prism Template Pack を使うとフォルダを作ったりXAMLの書き換えをしたりする最初の手間が省けました。
一応[こちら](https://github.com/noda13/PrismTemplatePack.git)にソースを置いておきます。
月が英語名のタイムスタンプをdatetimeに変換し年月日で返す

## 月が英語名のタイムスタンプをdatetimeに変換し年月日で返す

月が英語表記 Jan, Feb, ... の日付形式の時に、以下の方法で'1', '2', ... と変換できます。

```python
import datetime

def getDate():
  timestamp = "Thu, 14 Feb 2019 15:10:07 +0900"
  word = timestamp.split(" ")
  date_string = word[3] + " " + word[2] + " " + word[1] # "2019 Feb 14"の形に変換
  date = datetime.datetime.strptime(date, "%Y %b %d") # %bが'Feb'を'2'に変換してくれます
  return str(date.year) + "年" + str(date.month) + "月" + str(date.day) + "日"
  # 結果： 2019年2月14日
```

参考
https://docs.python.jp/2/library/datetime.html#strftime-strptime
Unified Memoryを使ってGPUメモリよりも大きなモデルをChainerで扱う

# tl; dr

* Chainerにおいて、以下の関数をGPUメモリを使う前に挿入することで、GPUメモリの大きさ以上の深層学習モデルを扱える。
    - ただし、パフォーマンス改善につながらないので、ミニバッチの大きさを大きくする目的では使わないこと。

```python
import cupy as cp
pool = cp.cuda.MemoryPool(cp.cuda.malloc_managed)
cp.cuda.set_allocator(pool.malloc)
```

# はじめに

```
...
cupy.cuda.memory.OutOfMemoryError: out of memory to allocate 8589934592 bytes (total 17179869184 bytes)
```

などとエラーを吐かれて泣いた記憶はないでしょうか。

最近は様々な分野で深層学習のモデルの巨大化が激しいです。学習時間が長くなるのは致し方ないとして、モデルによってはGPUメモリにのらず、そもそもまともに動かすことができないという問題に直面することがあります。特に、Graph Convolution系のアルゴリズムでは、ミニバッチ学習方法が確立されていない[^1]ため、GPUメモリの大きさの制約を受けやすいです。

[^1]: 一杯あるにはあるが、モデル自体に手を加える必要があったり、いまいち使いにくい。

本記事では、Pascal以降のNVidia GPUから機能が拡張された[^2]Unified Memoryを使って、GPUメモリよりも大きなモデルをChainerで扱う方法を紹介します。

[^2]: Keplerでも部分的にサポートされているらしいですが、CuPyから叩けるかは未知。


## 注記

CPUメモリとGPUメモリのやり取りが増えるので、もちろん効率が悪くなります。最低限モデル+1データがGPUに乗るのであれば普通にマルチGPUをしたほうが良いと思います[^3]。

[^3]: [根岸ら. 2017.]によると「ミニバッチ数の拡大はデータパラレルの導入によっても可能であるため、ミニバッチ数拡大のためにUnified Memoryの導入することに実用的な意味はない」そうです。ただし、当時よりCUDAの改善やV100によるUnified Memoryの改善があったため、状況が変わった可能性は否定できません。

以下のケースが該当する場合はここに記載のアプローチが有効だと考えられます。

* Graph Convolution Network (GCN)など、ミニバッチ学習方法が確立されておらず、モデル全体をGPUに上げる必要がある場合。
* どうしてもGPUメモリに乗らないサイズのモデルを扱うとき。
* マルチGPUが手元になく、ミニバッチサイズを1で学習すると学習が安定しないとき。

なお、本アプローチの代案としてGoogleのTPU (64GBのメモリがある)を使ったり、半精度(FP16)を使う（代替メモリ消費が80%程度に抑えられる）ことが考えられます。あと、モデルがうまくわけられるのであればマルチGPUでモデル並列化なども可能です[^4]。

[^4]: しかし、どのフレームワークでもデータ並列化に比べてドキュメンテーションが少ない。

# 方法

ChainerからGPUを使う前に以下の関数を実行(ソースコードに記載)しておきます。

```python
import cupy as cp
pool = cp.cuda.MemoryPool(cp.cuda.malloc_managed)
cp.cuda.set_allocator(pool.malloc)
```

以上です。


本当にGPUメモリ以上が扱えるかを確認するためには以下のようなコードを実行してみます。

```python
import cupy as cp

size = 32768  # 32GBのV100ならば、以下が1つあたり16GBになるよう46341にする
a = cp.ones((size, size))  # 8GB (16GB)
b = cp.ones((size, size))  # 8GB (16GB)
c = cp.ones((size, size))  # 8GB (16GB)
```

Chainerの裏ではCuPyが動いているので、CuPyで問題なければChainerも問題ないことは自明でしょう。

# 解説みたいなもの

(この分野の専門家ではなく、この記事のために軽く調べただけなので話半分くらいに聞いてください)

Unified Memoryとは、要はCPUとGPUで共通のメモリ空間（=GPUメモリ＋CPUメモリ）を使う方法です。

![tmp.png](https://qiita-image-store.s3.amazonaws.com/0/152362/d23b9786-8ff6-5541-e2dd-4f4c5d623ed3.png)
(from https://news.mynavi.jp/article/unified_memory-1/)

Pascal以前にもUnified Memory自体はあったものの、使用するデータをGPUのメモリに移動しないとデータを活用できないため今回のような用途には使えませんでした。それに対して、Pascal以降は必要なデータだけを逐次アクセスUnified Memoryから取得できるようになったため、今回のようなことができるようになったそうです。

プロによる詳しい解説は[こちら](https://news.mynavi.jp/article/20161012-gtcjapan2016_unifiedmemory/)。

# 参考文献

* [根岸ら. 2017. Unified Memoryを用いた大規模ディープラーニングモデルの性能に関する考察. 日本ソフトウェア科学会第34回大会.](http://jssst.or.jp/files/user/taikai/2017/GENERAL/general1-2.pdf)
* [奥田遼介. 2018. CuPy -NumPy互換GPUライブラリによるPythonでの高速計算-. GTC Japan.](https://www.nvidia.com/content/apac/gtc/ja/pdf/2018/1021.pdf)
* [Hisa Ando. 2016. GTC Japan 2016 - Pascalのユニファイドメモリ. マイナビニュース.](https://news.mynavi.jp/article/20161012-gtcjapan2016_unifiedmemory/)
Numpyは割り算をシフト演算に置き換えると速い

```python
img = np.arange(1000, dtype=np.uint16)

%timeit a = (img >> 3)
2.06 µs ± 9.03 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit a = (img / 8)
3.01 µs ± 27.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit a = (img / 8).astype(np.uint16)
4.55 µs ± 12.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
```

おそらく型の問題。Pythonは`int / int`の返す型が`float`なので、Numpyもそれに倣って`np.int32 / np.int32`の返す型が`np.float64`になる。

割り算をシフト演算に置き換える、というと遠い昔にコンパイラの仕事になったような話だが、2019年にもなってからゾンビのように復活した。
Androidアプリにおけるモジュラライズの進め方

社内勉強会で、[nana](https://nana-music.com/)のAndroidアプリにおけるモジュラライズの進め方について発表しました。
nanaのAndroidアプリでも少しずつモジュラライズを進めているので、進め方についてお話しました。

# 概要
- モジュール、モジュラライズとは
- モジュラライズのメリット、デメリット
- モジュラライズの方針
- Android版nanaにおけるリファクタリングの進め方

# 発表資料
[Androidアプリにおけるモジュラライズの進め方](https://speakerdeck.com/akihitookada/androidahuriniokerumosiyuraraisufalsejin-mefang)
<a href="https://speakerdeck.com/akihitookada/androidahuriniokerumosiyuraraisufalsejin-mefang" target="_blank"><img width="400" alt="スクリーンショット 2019-02-19 20.10.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/247380/2cf2d7d4-543c-c4d6-99a2-774a5d74da35.png"></a>
GitHubの全リポジトリからファイル名で絞って検索する

.Netなプロジェクトをtravis-ciで回そうとしたときに、皆どんな書き方してるんだろう、と思ってググったりしてた。しかし、内容が薄いものや、ちょっと古そうだったり「それ動くの？」という感じだった。

じゃあ実際に動いているだろうというコードを参考にすればよかろうということで、GitHubでファイル名を指定して全体から検索すると良いことに気づいた。

例えば、`dotnet`を含む`.travis.yml`ファイルを検索する場合。
（travis-ciでは`dotnet: 2.1`みたいにバージョン指定するような感じで使うので。）

```
dotnet filename:.travis.yml
```

こういったコードはGoogleに乗らなかったりノイズが乗りがちなことが多いので、ふと思い出せると便利。ありがとうGitHub。

なお結果は
【PHP7.4】PHPの新たな演算子??=ってなんぞ？

2019/01/22(JST)に[Implement ??= operator](https://github.com/php/php-src/commit/a50198d0fef652ca052cda642d6e98a9101eb73f)という謎のマージがありました。


# RFC

[RFC](https://wiki.php.net/rfc/null_coalesce_equal_operator)は賛成37、反対4の圧倒的多数で可決されています。

なお投票開始は2016/03/24で、終了が2016/04/02です。
つまり、それ以来3年弱ほったらかされていたということです。


# ??=ってなに？

RFCでは『Null Coalescing Assignment Operator』と呼ばれています。
どうも適切な日本語がないみたいなのですが、NULL合体演算子(Null Coalescing Operator)から類推すると『NULL合体代入演算子』とかになるんですかね？

名前のとおり、NULL合体演算子と代入演算子を合わせたような演算子です。


# 使い方

```php
	// NULL合体代入演算子
	$id ??= getId();
	
	// これと同じ
	$id = $id ?? getId();
	$id = @$id ?: getId();
	$id = isset($id) ? $id : getId();
```

三項演算子を省略したエルビス演算子を省略したNULL合体演算子を省略したものがNULL合体代入演算子ということですね。

上記の例ではあまり恩恵を感じられませんが、左辺が長くなりがちなフレームワークでは利点が多くなることでしょう。
RFCのサンプルでは以下のような例がありました。

```php
	// これまで
	$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value';
	
	// 今後
	$this->request->data['comments']['user_id'] ??= 'value';
```

これは確かに便利。

か？


# 導入

[PHP7.4](https://wiki.php.net/rfc#php_74)で導入されます。


# 他言語での実装

C#では2019年リリース予定の[C# 8.0](https://docs.microsoft.com/en-us/visualstudio/releases/2019/release-notes-preview#VS2019_Preview3)で[導入](https://github.com/dotnet/csharplang/issues/34)されるようです。

Rubyでは、||の自己代入演算子である、||=というイディオムが近い動きをします。
(左辺がnilまたはfalseの場合に、右辺を代入。falseも含むため、厳密には違う動きです。)

それ以外の言語では全く見当たりませんでした。


# 感想

データが入ってくるかどうかわからないというWeb出自のPHPらしい演算子だと思います。
他言語であればもっと入力をちゃんと定義しろって話ですが、Web APIなんかだとそういうことも言ってられませんからね。

ただ自分で使いたいかというとちょっと微妙ですね。
ただでさえ短縮構文多いのにこれ以上増えたら混乱しそうです。
まあ、`?:`とか`??`とかもいつの間にか普通に使っているので、そのうち`??=`も普通に使うようになっているかもしれませんが。
でも`<=>`は使う機会が無い。
jsでのプロパティの存在チェック方法をまとめてみる

## なりゆき
レビューしてるなかでプロパティチェック方法を考えてたら何個かパターンがあるのでまとめてみた

## ざっくばらん

### [Object.keys](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/keys) + [Array.prototype.indexOf](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)

```js
let user = {
  id: 1,
  name: 'hoge'
};

console.log(Object.keys(user).indexOf('name') !== -1) // true
console.log(Object.keys(user).indexOf('mailaddress') !== -1) // false
```

一度キーの配列にしてから、配列内に対象のキー名があるかを見る方法
二回メソッド呼ぶ必要があって冗長・・・

### [Object.prototype.hasOwnProperty](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty)

```js
let user = {
  id: 1,
  name: 'hoge'
};

console.log(user.hasOwnProperty('name')) // true
console.log(user.hasOwnProperty('mailaddress')) // false
```

オブジェクトの対象のプロパティの有無を返します
この時**継承されていないプロパティしか見ない**ので注意


### [in演算子](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/in)

```js
let user = {
  id: 1,
  name: 'hoge'
};

console.log('name' in user) // true
console.log('mailaddress' in user) // false
```

~~最近知った()~~
`Object.prototype.hasOwnProperty`とだいたい同様で、オブジェクトの対象のプロパティの有無を返します
こちらは**継承元までさかのぼってプロパティを見ます**
プログラミング学習記録3〜やる気激落ち〜

100DaysOfCodeを始めて、まだ３日目なのですが、朝起きてすぐにyoutubeを見てしまいなかなか勉強のスイッチが入りませんでした。

今日やったのは昨日やったProgateのRuby1~3の復習のみです。

見始めたら止まらなくなり、勉強が進まなくなることはわかっているので、最近は意識的に見ないようにしていたのですが、、、

youtubeを見るデメリットは、人によって異なると思いますが、私個人としては以下の２つが考えられます。

1. 時間を無駄に使ってしまう
2. 自分にとって不必要な情報まで取り入れてしまい、行動に迷いが出る

今回は特に２つ目の「自分にとって不必要な情報まで取り入れてしまい、行動に迷いが出る」ことで自分のやってることへの迷いが生まれてしまいました。

Chromeの拡張機能であるSiteBlockを使ったりして、youtubeと距離を取り、もう一度ノートとペンを使って自分と向き合いたいと思います。


youtubeを見れなくするアプリ（youtubeを見るまでのハードルを以上に上げるアプリ)なんかが作れたらいいなと思いました。

おわり
Kotlin/Native Multiplatform ProjectをiOS向けにAndroidSDK無しでビルドする

先日、こちらの記事[「Kotlin/Native ProjectをBitriseのiOSプラットフォームでビルドする」](https://qiita.com/Keeeeen/items/a195f756236e70ec22d1)を書いたのですが、Gradleの知識が足りなかったためすごく遠回りなことをしていました。もっと簡単にできるので書きたいと思います

# Androidの依存関係を切り離す
　上記に書いてある通り、iOSのビルドの時だけAndroidの依存関係を切り離せばAndroidSDKは不要になります。
　まず初めに思い付いたのが、タスク実行時にプロジェクトプロパティ、例えば`./gradlew packForXcode -Pis_ios`のようにして、`project.hasProperty('is_ios')`で分岐して、プロパティがなければ`include`しないという方法なのですが、そうすると_iOSのビルドなのに`is_ios`を付与する_と意味合いが矛盾してしまいます
　そこで、実行するタスク名を取得して、`packForXcode`の時だけAndroidの依存関係を切り離す、という様にします。そうすると、実行する側はプロジェクトプロパティを気にしなくていいのと、iOS実行時にはAndroidSDKは必要ない、といった自然な流れになります。
　具体的には`settings.gradle`にその処理を書きます

```groovy:settings.gradle
include ':app' ':common'
```
を

```groovy:settings.gradle
include ':common'

if (startParameter.taskNames.any { it.contains('packForXCode') } ) {
    include ':app'
}
```
の様に書き換えます。こうすることで、`packForXcode`の時は`include ':app'`が実行されなく、それ以外の時は実行されるようになります。

 実際に、元の`settings.gradle`のままで`./gradlew packForXcode`を実行すると、

```:terminal
FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':app'.
> SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 0s
```
とapp（Androidのビルド）のconfigure時にANDROID_HOMEが無いから実行できないと怒られます。

書き換えた後の`settings.gradle`で実行すると、

```:ternimal
> Configure project :common
Kotlin Multiplatform Projects are an experimental feature.

BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 up-to-date
```

無事ビルドが成功した事がわかります
これで、わざわざ毎回CI上でAndroidSDKをインストールしたりせずに済みます！

まだまだ勉強中なので良い方法があれば随時更新していきたいと思います
【Java】java.lang.NoClassDefFoundError: org/jsoup/safety/Whitelistで落ちる問題への対処

# 問題
以下のコードでアノテーションが反応しているかテストしようとした所、`validate`メソッドの呼び出し時に`java.lang.NoClassDefFoundError: org/jsoup/safety/Whitelist`で落ちました。

```java
Set<ConstraintViolation<テスト対象クラス>> set =
                    Validation.buildDefaultValidatorFactory().getValidator().validate(テスト対象インスタンス);
```

# 原因
テスト対象のクラスで`org.hibernate.validator.constraints`に定義されているアノテーションを利用しており、その内部の`jsoup`が適切に配置されていないことでした。

# 対策
Mavenに以下を追加した所正常に動作するようになりました。

```xml:pom.xml
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.11.3</version>
</dependency>
```

# 参考にさせて頂いた記事
[bean validation \- Hibernate Validator @SafeHtml: org\.jsoup\.safety\.Whitelist not found \- Stack Overflow](https://stackoverflow.com/questions/21631932/hibernate-validator-safehtml-org-jsoup-safety-whitelist-not-found)
sinatraの簡単なdebug kit作ったので使い方を紹介!


## どんなデバックキットか

models.rbで定義されている全部のモデルに対して、全検検索して中身をみることができるものです。
将来的には、

- 明示的に全件検索するモデルを選択できる
- session情報、非同期request情報、log出力、インスタンス変数あたりの情報を見れるようにする

このあたりの機能も追加して行きたいと思っています。

## install

普通にgemをinstallします

```shell:CommandLine
gem install aldy_debug_kit_sqlite3
```

## 初期設定

少し抵抗があるかもしれませんが、初期設定コマンドはこれです。

```shell:CommandLine
aldy
```

これを実行すると全件検索した結果を表示するための、erbファイルとgetリクエストを受け取れるアクションが定義されているrubyファイルが生成されます。

- views/aldy_show_sqlite3_tables.erb
- show_table_action.rb

## debug kitを使ってみる

上で作られた２つのファイルを使っていきます。

app.rbでgemとshow_table_action.rbファイルをrequireしていきます

```ruby:app.rb
require 'aldy_debug_kit_sqlite3'
require './show_table_action.rb'
```

これができれば、あとは、 /modelsにgetリクエストでアクセスすると
テーブル一覧をみることができます。
こんな感じです。
※ HiddenがHeddenになっていますが、最新バージョンではタイポ直してます。

<img width="1401" alt="スクリーンショット 2019-02-07 6.16.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/263783/6e24d821-3524-6e0b-108e-97936c10e812.png">

## ちょっと生成されたファイルがどう動いてるかを見てみる

みるべきはshow_table_action.rbですね

```ruby:show_table_action.rb
get '/models' do 
  @models = AldyDebugKitSqlite3.getTables
  erb :aldy_show_sqlite3_tables
end 
```

この*AldyDebugKitSqlite3.getTables*という関数でで全モデル情報を取得しています。
それを aldy_show_sqlite3_table.rbというtemplateファイルで表示しています。

## 最後に

機能的にそこまでではないですが、初学者の方でGUIアプリケーションを設定するのが苦手な方など、使っていただけると幸いです。
わかりにくい説明などありましたら、どんどんコメントしてください。

## 隠しコマンド

~~ぜひこれ使ってみてください。デバックしてないので、本当に動くかわかりませんが、~~
動いていないので、バージョンアップをお待ちください

```shell:CommandLine
sushi
```
モデルの関連・DBの定義を動的に取得する（関連が定義されていない外部キーを探す）

**管理画面でユーザーを削除しようとしたら `ActiveRecord::InvalidForeignKey` エラーが発生！！**

そうです、DBには外部キー制約が指定されているのに、モデルでは関連（`has_many :emails, dependent: :destroy`）を定義していなかったのです。もしかしたら、他にも関連の定義漏れがあるかもしれません。

でも、何十個もあるモデル/テーブルを１組ずつ目で見て付き合わせるのは、非効率で、信頼できません。

ここは、動的にモデル/テーブルの内容を取得して比較するスクリプトが必要です。

# モデルに定義された関連を取得する

`Model.reflections` で取得できます。

`.reflections`はハッシュで、キーが関連名（だと思う）で、値が関連を表すオブジェクトです。関連の種類（`has_many`, `belongs_to`など）は値のクラスで判別できます。

```ruby
[16] pry(main)> User.reflections['emails']
=> #<ActiveRecord::Reflection::HasManyReflection:0x00007f8295db3e08
 @active_record=
  User(...),
 @association_scope_cache={},
 @automatic_inverse_of=nil,
 @constructable=true,
 @foreign_type="emails_type",
 @klass=nil,
 @name=:emails,
 @options={:dependent=>:destroy},
 @plural_name="emails",
 @scope=nil,
 @scope_lock=#<Thread::Mutex:0x00007f8295db3c00>,
 @type=nil>
```

- https://github.com/rails/rails/blob/master//activerecord/lib/active_record/reflection.rb#L146
- https://api.rubyonrails.org/classes/ActiveRecord/Reflection/ClassMethods.html#method-i-reflections


# 外部キーを取得する

`ApplicationRecord.connection.foreign_keys(table_name)` で取得できます。

```ruby
[17] pry(main)> ApplicationRecord.connection.foreign_keys('emails')
=> [#<struct ActiveRecord::ConnectionAdapters::ForeignKeyDefinition
  from_table="emails",
  to_table="users",
  options=
   {:column=>"user_id", :name=>"fk_rails_328da208df", :primary_key=>"id", :on_delete=>nil, :on_update=>nil}>]
```

`.foreign_keys` は　api.rubyonrails.org　には載っていますが、ドキュメントはありません。

- https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/PostgreSQL/SchemaStatements.html#method-i-foreign_keys

# 両者を比較するスクリプト

上２つのメソッドを組み合わせて、以下のようなスクリプトを作りました。なお、やっつけ仕事なので、ご自分で使うときには、例えば

- テーブル名とモデル名が異なるので、変換が必要
- DBが複数あるのでDBごとに比較しなければならない
- `dependent: :destroy`が付いているかのチェックも必要

といった改良も必要かもしれません。

```ruby
conn = ApplicationRecord.connection

db_foreign_keys =
  conn.tables.map(&:to_s).flat_map do |t|
    conn.foreign_keys(t).map do |fk|
      [fk.from_table, fk.to_table]
    end
  end.sort

Rails.application.eager_load!

model_relations =
  ApplicationRecord.subclasses.flat_map do |m|
    m.reflections.map do |name, r|
      if r.is_a?(ActiveRecord::Reflection::HasManyReflection) || r.is_a?(ActiveRecord::Reflection::HasOneReflection)
        [name, m.table_name]
      else
        nil
      end
    end.compact
  end.sort

pp db_foreign_keys
pp model_relations
pp db_foreign_keys - model_relations
```
PHPの時間を弄ってページ遷移を確認する

# 時間によって変化するページ描画を確認したい

時限で公開開始／終了するページやサービスを実装する場合、<b>「未来に行って確認したいなぁ」</b>と思うことが間々あるかと思います。

DBに保存してあったり、ソース上にべた書きしたりしている時刻を書き換えるのは、何処か不格好ですし、複数の時限処理が絡み合っている場合はそれだけ多くのところを書き換えて、さらに確認後は元に戻さなくてはいけません。

なので **timecop** を利用するのが便利だと思いますが、 **timecop_freeze()** または **timecop_travel()** は、それだけではそのページを描画した際の時間認識を書き換えるだけとなり、別ページに遷移すると効果は失われます（よね……？）。

そこで、セッションを利用して、設定を維持したままページ移動が行える仕組みを考えてみました。
（きっと過去数多のエンジニアが同じことを考え実践していらっしゃったと思うのですが、軽く検索した限りまとまった記述に行き当たらなかったので、ひとつの方法として書き留めます）

# 構想

だいたい下記の仕組みです。

1. 時刻を任意に設定し、「freeze」か「travel」かを選ぶ
2. 渡された時刻とどちらを選んだかによって、異なる値をセッションに保存
3. Web描画時に必ず通るbaseコントローラでセッションの値を読んで、 **timecop_freeze()** または **timecop_travel()** を行う。セッションが消えていた場合は何もしない=元通りの時刻で扱われる

# 実装

- **timecop_freeze()** は時刻（任意に設定した値）が不変
- **timecop_travel()** は時間（設定時の時刻との差）が不変

なので、その変わらない値を持ち回って、ページ遷移の度に設定を行います。
**$smarty.now** も裏はphpなので、ちゃんとtimecopの影響を受けて時刻が変わります。

以下、バリデーション等を省略した抜粋になります。
timecopが入っていない環境にソースを反映する可能性がある場合は、 **function_exists('timecop_travel')** など噛ませればその環境での利用可否を判断できるかと。

## 時刻を登録するところ

```smarty:timeset
<form action="timecop/travel" method="post">
    <input type="text" name="date" value="{$smarty.now|date_format:'%Y/%m/%d %H:%M:%S'}">
    <button type="submit" name="type" value="freeze">時刻を固定する</button>
    <button type="submit" name="type" value="travel">時刻を移動する</button>
</form>

```

```php:Controller_Timecop
    public function action_travel()
    {
        $date = Input::post('date');

        // 「freeze」を選んだ場合
        // 設定した時刻のタイムスタンプ（int型）をセッションに保存します
        if (Input::post('type') == 'freeze') {
            \Session::set( 'timecop', strtotime($date) );

        // 「travel」を選んだ場合
        // まず時刻を元に戻し、現在時刻と設定時刻の差（string型）をセッションに保存します
        // 差は、strtotime()に渡せばきちんと計算できる形に整えています
        } else {
            timecop_return();
            $timeDiff = date_diff( date_create(), date_create( $date ) );
            \Session::set( 'timecop', $timeDiff->format( '%R%y years %R%m months %R%d days %R%h hours %R%i minutes %R%s seconds' ) );
        }

        \Response::redirect();
    }
```

## 登録された時刻を設定するところ

```php:Controller_Base
    $timecop = \Session::get( 'timecop' );
    if ( !is_null( $timecop ) ) {
        if ( is_int( $timecop ) ) {
            timecop_freeze( $timecop );
        } elseif ( is_string( $timecop ) ) {
            timecop_travel( strtotime( $timecop ) );
        }
    }
```


# 参考

- [php-timecopをPHP 7対応させてみた - hnwの日記](https://hnw.hatenablog.com/entries/2016/04/19)

- [php-timecopで時間を仮想的に変化させる - Qiita](https://qiita.com/sawadashota/items/20e627efaafa2a7b0fe3)
Octaveの書式

Stanford大CourseraのMachine Learningを受講することにしました。コース全11週中、第2週目以降、行列による機械学習の計算式を、Octaveという言語で実際に計算して行くことになります。Octaveはアルゴリズムの試作を迅速に行うのに適しており、結果的に開発時間の短縮につながるといわれています。Octaveの書式について、メモしておきます。

#行列を扱う

```Octave
r = [1 2 3 4] または [1, 2, 3, 4]
#行ベクトル

c = [1; 2; 3; 4]
#列ベクトル

m = {1 2; 3 4]
#2*2行列

A * B
#通常の行列の積。

A .* B
#通常の行列の積ではなく、各行列における同位置の数値の積を返す。

A .^2
= A .* A

A'
#行列変換

max(A)
#行列Aの最大値を含む行

magic(3)
#1-9の要素からなる3*3の行列

sum(a)
#1行行列aのgroup合計

prod(a)
#最大値

floor(a)
#小数切り捨て

ceil(a)
#小数切り上げ

rand(3)
#0.0-1.0の一様乱数からなる3*3の行列

randn(3)
#正規分布に従った乱数からなる3*3の行列

max(A, [], 1)
#各列の最大値からなる1行行列　=max(A)

max(A, [], 2)
#各行の最大値からなる1列行列

A(:)
#各列を縦に並べた1列行列

sum(A,1)
#各列の合計からなる1行行列

sum(A,2)
#各行の合計からなる1列行列

eye(9)
#9*9の単位行列（左上から右下に向け斜めに1が並ぶ）

flipud(A)
#列を右から並べ替える

pinv(A)
#行列Aの要素を正規化
```

#プロットする
```Octave
plot(t,y);
#t,yの関係をplotする

plot(t,y1);
hold on;
plot(t,y2,'r')
#y1のグラフにy2のグラフを赤色で重ねる

xlabel('time')
#x軸のラベルをtimeにする

legend('sin','cos')
#グラフ凡例

title('my plot')
#グラフのタイトル

print -dpng 'myPlot.png'
#cdにグラフ画像をファイルにする

figure(1);plot(t,y1);
#y1のグラフをfig1とする

subplot(1,2,1);
plot(t,y1);
subplot(1,2,2);
plot(t,y2)
#グラフを横に並べて表示、それぞれのグラフを指定

axis([0.5 1 -1 1])
#x, yの範囲を指定

imagesc(A)
#行列の値を色で表現する

A(1,2)
#行列Aの(1,2)の値

v=zeros(10,1)
#10行1列、要素は全てゼロ
```

#for文、while文、if文、ほか

```Octave
for i=1:10,
v(i)=2^i;
end;
v
#10行1列の各要素を2^iで定義

for i=1:10,
disp(i);
end;
#各iについてそのままiを表示する、1-10が縦に並ぶ

indices=1:10;
indices
#1-10が10行1列の行列として表示される

i=1;
while i<=5,
v(i)=100;
i=i+1;
end;
#iが1-5の間v(i)=100

pwd
#current directory表示

cd
#cdを指定、実行ファイル(.m)のある場所

addpath('c:----')
#pathを加える、current directoryの位置に関わらず実行可能になる
```
Vim8のNerdtreeのprefixに ^G がついてしまって困ったときの対応

## 対応
.vimrcに以下の一文追加

`let g:NERDTreeNodeDelimiter = "\u00a0"`

## 参考
https://www.reddit.com/r/vim/comments/a4yzyt/g_characters_prefixing_directory_and_file_names/
PowerShellでCSVのカラムを減らして、順番を入れ替える

```powershell
Import-Csv some.csv -Encoding Default -Header "ＪＡＮコード","商品コード","価格" `
 | Select-Object "価格","ＪＡＮコード" `
 | ConvertTo-Csv -NoTypeInformation -Delimiter "," | % {$_ -replace '"',''} | out-file -encoding Default .\export.csv
```
Processingで月と星空を表現

概要
---
Processingで月と星空を表現する方法メモ
コード
---
```
/////Sunny///////
Shape[] s = new Shape[10]; 
class Shape { //class
  float x;//横方向の位置座標
  float y;//縦方向の位置座標
  float dx; //横方向の移動速度
  float dy; //縦方向の異動速度
  float d; //直径
  float ds; //直径の拡大速度
  int r;//赤色
  int g;//緑色
  int b;//青色;
  int dr; //赤色の変更速度
  int dg; //緑色の変更速度
  int db; //青色の変更速度

    //オブジェクトを作る関数
    Shape(float nd,int nr, int ng, int nb,float ndx, float ndy,float nds,int ndr, int ndg,int ndb) {
        //属性の初期化. 1.直径,2-4.RGB初期値,5.x方向の移動速度,6.y方向の移動速度,7.直径の拡大速度,8-10.RGBの変更速度
        x = random(width);
        y = random(height);
        d = nd; //直径
        r = nr; //赤の初期値
        g = ng; //緑の初期値
        b = nb; //青の初期値
        dx = ndx; //横方向の移動速度
        dy = ndy; //縦方向の移動速度
        ds = nds; //直径の拡大速度
        dr = ndr; //赤の変更速度
        dg = ndg; //緑の変更速度
        db = ndb; //青の変更速度
    }

void move(float nx, float ny, float nd,int nr,int ng,int nb) { //指定位置まで移動
  //移動
  x = nx;
  y = ny;
  d = nd;
  r = nr;
  g = ng;
  b = nb;
  //もし円が画面の壁に当たったら，移動方向を逆転
  if (x > width - (d/2) || x < (d/2)) dx = -dx;
  if (y > height - (d/2) || y < (d/2)) dy = -dy;
  //もし円のサイズが大きくなったら，拡大方向を逆転
  if (d > 15.0 || d < 0.1) ds = -ds;
  //もし色のサイズが大きくなったら，拡大方向を逆転
  if(r<=252 || 255 < r) dr = -dr;
  if(g<=250 || 255 < g) dg = -dg;
  if(b<=70 || 255 < b) db = -db;
  //表現
  noStroke();
  fill(r,g,b,100);
  ellipse(x, y, d,d); 
  }
}

void setup() { //準備
  size (600,600);
  noCursor();
  s[0] = new Shape(7,255,248,226,0.1,1.0,0.1,1,1,1); //最初のオブジェクトを作る
  s[1] = new Shape(10,255,245,206,1.0,0.5,0.8,2,1,0); //2つめを作る
  s[2] = new Shape(1,253,240,221,0.3,0.5,0.1,1,2,1); //3つめを作る
  s[3] = new Shape(10,252,251,181,0.7,0.5,0.5,1,1,2); //4つめを作る
  s[4] = new Shape(10,255,250,199,0.1,0.7,0.8,1,1,3); //5つめを作る
  s[5] = new Shape(10,253,251,79,0.2,0.7,1.0,1,2,1); //6つめを作る
  s[6] = new Shape(12,255,254,132,0.1,1.7,0.9,2,1,2); //7つめを作る
  s[7] = new Shape(8,252,252,89,1.4,1.0,0.7,0,1,3); //8つめを作る
  s[8] = new Shape(12,254,241,188,1.2,0.8,0.2,1,2,1); //9つめを作る
  s[9] = new Shape(10,255,255,210,1.0,0.5,0.4,1,1,1); //10つめを作る

}

void draw() { 
     background(4,21,41);
    for (int i = 0; i < 10; i++) {    
      s[i].move(s[i].x + s[i].dx, s[i].y + s[i].dy,s[i].d + s[i].ds,s[i].r + s[i].dr,s[i].g + s[i].dg,s[i].b + s[i].db);
    }
    noStroke();
    fill(255,255,255,200);
    ellipse(width/5,height/12,180,180);
 }
```
結果
---
![processingimage](https://d3ujv22cjrxycc.cloudfront.net/items/413n2q1O3e2R410i3q2u/Screen%20Recording%202019-02-19%20at%2011.18%20AM.gif)
大規模行列の固有値計算ライブラリについて

#はじめに
様々な用途で大規模行列の固有値計算をする必要に迫られており、簡単に使えるライブラリを調べてみた結果、やっぱり課金しただけあってIntel MKLが一番だなという（ある意味）当然の結論に落ち着きました。何度も同じことで悩みそうなので備忘録を書いておきます。殴り書きに近いのでそのうち修正します。

#解きたい問題
行列の低ランク近似がやりたいだけです。
任意の実数対称行列$\mathbf{A}\in\mathbb{R}^{N\times N}$について、

$\mathbf{A}\mathbf{t}=\lambda\mathbf{t}$

を満たす固有値・固有ベクトルのペアを、固有値の絶対値が大きい順に$m\le N$個だけ取得したい。

#使えそうな方法
##べき乗法（power method）・subspace法
たぶん古典的にはsubspace法が一番有力で、70年代に作られた割に振動解析の分野など疎行列の固有値計算の世界ではまだまだ現役を誇る。でもsubspace法のライブラリが（調べた限り）不思議と見つからなかったので検討外。

##Arnodi法
超有名な手法でググると解説がたくさんでてくる。丸め誤差に弱いなどの問題があり、逐次計算の中で何度かリスタートなどの処理をする必要がある。implicit restart Arnordi法は最大の成功例であり、このアルゴリズムを使ったFORTRANライブラリARPACKがよく使われている。ただ、９０年代にできたプログラムなので今の環境では工夫しないとコンパイルが通らずインストールできない。C++のラッパーも公式が提供しているが、こいつもいかんせん古くて動かない。平成も終わるこの時期にわざわざこれに頼らなくてもいいかなと思う。

ARPACK公式
https://www.caam.rice.edu/software/ARPACK/
実対称行列の固有値問題に対するARPACKの適用事例（日本語）
http://blog.beam2d.net/2011/12/eigenarpack.html
上記著者の方によるC++ラッパー
https://github.com/beam2d/arpaca

#FEAST
正直調べるまで存在自体を知らなかった。全く内容を理解していないが、後述するMKLの解説の中では量子力学の知見から着想を得て生まれたアルゴリズムとある。何を言っているのかわからない。実際、最初にこのアルゴリズムが提案されたのはPhysical Review Bなので、おそらく本当。FEAST LIBRARYとしてオープンソースのライブラリが2009年に登場し、この移植版がIntel MKLに入っている。exampleの場所がわかりにくいが、
MKL/examples/solvers_eec/
の中に、疎行列・密行列・複素行列のそれぞれの場合での固有値計算の例がある。

FEAST公式
http://www.ecs.umass.edu/~polizzi/feast/
Intel MKL公式
https://software.intel.com/en-us/articles/introduction-to-the-intel-mkl-extended-eigensolver
pythonのproperty機能

propertyの使い方を知ったのでまとめました．

[pythonの標準ライブラリ](https://docs.python.jp/3/library/functions.html#property)を参照しました．

## 機能

ライブラリにあるとおり，@propertyには3つの機能がある．
1.@property :propertyが呼び出されるとき実行
2.@名前.setter :propertyに代入されるとき実行
3.@名前.deleter :propertyが削除されるとき実行

```py
class C:
    def __init__(self):
        self._x = 1

    @property
    def x(self):
        処理 1
    
    @x.setter
    def x(self, v):
        処理 2

    @x.deleter
    def x(self):
        処理 3
```

一般的に説明で見られるのは以下のようなコード

```py
class C:
    def __init__(self):
        self._x = 1

    @property
    def x(self):
        return self._x
    
    @x.setter
    def x(self, v):
        self._x = v

    @x.deleter
    def x(self):
        del self._x

# インスタンス生成
c = C()

# print(処理 1 の戻り値)
print(c.x)

# 処理 2
c.x = 2

print(c.x)

# 処理 3
del c.x

print(c.x)
```
実行結果

```
1
2
Traceback (most recent call last):
  File "test.py", line 49, in <module>
    print(c.x)
  File "test.py", line 32, in x
    return self._x
AttributeError: 'C' object has no attribute '_x'
```

上のように使うと意図された処理が実行される．

## 他の使い方 

処理1,2,3 は必ずしも代入や削除のような内容である必要はない．
単純にpropertyに対して値を返す要求があれば，「処理 1」が実行されるし，propertyに代入する処理が出てくれば，「処理 2」が実行されるし，delの構文が存在すれば「処理 3」が行われる．


そのため，下のようなpropertyにした場合，

```py
class C:
    def __init__(self):
        self._x = 1

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = value
        
    @x.deleter
    def x(self):
        #del self._x
        print("削除しませぇぇぇぇん！")

c = C()

print(c.x)
del c.x
print(c.x)

del c._x
print(c.x)
```

下のように削除されたと思いきや，削除されていないという現象を作成可能．ただし，直接メンバ変数を削除しにかかると当然削除される(悲しい)．

```
1
削除しませぇぇぇぇん！
1

Traceback (most recent call last):
  File "test.py", line 25, in <module>
    print(c.x)
  File "test.py", line 7, in x
    return self._x
AttributeError: 'C' object has no attribute '_x'
```

## まとめ
propertyによって，メンバ変数に対する代入や削除に対して適当な処理を与えることが可能．開発の現場では主に意図しない変数の代入を避けるために以下のようにエラーを出すような処理にしているようです．

```py
@x.setter
def x(self, value):
    raise ValueError()
```
SCPを使ってローカルからAWS EC2サーバーへファイルをアップロードするメモ

####一つのファイルをアプロード：
```scp -i [@秘密鍵のパス] [ローカルファイルのパス] ec2-user@[@public_IP]
```
例：

```terminal:ターミナル
scp -i /Users/.ssh/secretkey.pem /Users/Documents/a.txt ec2-user@ec1-11-111-111-1111.jp-south-1.compute.amazonaws.com
```

こうすると、サーバーのホームディレクトリにファイルをコピーすることができます
####コピーする場所を指定する：
```scp -i [@秘密鍵のパス] [ローカルファイルのパス] ec2-user@[@public_IP]:[@サーバーのパス]
```
例えば、サーバーの/var/www/htmlにファイルをコピーしたい場合：

```terminal:ターミナル
scp -i /Users/.ssh/secretkey.pem /Users/Documents/a.txt ec2-user@ec1-11-111-111-1111.jp-south-1.compute.amazonaws.com:/var/www/html
```

####フォルダごとにコピーしたい場合
```scp -r -i [@秘密鍵のパス] [ローカルファイルのパス] ec2-user@[@public_IP]
```
例：

```terminal:ターミナル
scp -r -i /Users/.ssh/secretkey.pem /Users/Documents/ ec2-user@ec1-11-111-111-1111.jp-south-1.compute.amazonaws.com
```
一瞬でチェックボックスすべてにチェックを入れた話

chrome使っていることを前提とします。
僕と同じ新人の方とかに「プログラミングがこんな簡単に業務に活かせたよ」というのを伝えたいです。
#経緯
業務でページ内のチェックボックスすべてにチェックを入れて保存ボタンを押下する作業が発生しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/307024/a06fd366-cf3d-a1ae-1544-c640135523e1.png)

そしてそれを10ページ分以上やらないといけませんでした。

嫌すぎる…。

#ページ内のチェックボックスすべてにチェックをするコード
ということで、JavaScriptでページ内のチェックボックスにチェックをいれます。
f12で検証を開いてConsoleタブ内に下記のJavaScriptコードを入力してEnterを押下します。

```JavaScript:
let chk = document.getElementsByTagName('input');
for (let i = 0; i < chk.length; i++) {
    if (chk[i].type=='checkbox'){
        chk[i].checked='checked';
    }
}
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/307024/a1658c67-685c-292e-414d-f89a6eaad14c.png)

すると画面が以下のようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/307024/94150db6-8994-0d2b-b106-18bd271d2a04.png)

全部にチェックがついていますね。
保存を押して終わりです。やったね。
#コードの解説
目的→実装方法の順で見ていきます。
##目的
ページ内のチェックボックスにチェックを付けたい。そのためにしないといけないことは
1. ページ内のチェックボックスをすべて取得
2. 取得したチェックボックスにチェックをつける
##実装方法
###ページ内のチェックボックスをすべて取得する方法
検証のElementからチェックボックスを見てみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/307024/9cda1b0a-c54c-7d14-11ff-d60508f8e0ef.png)

チェックボックスはすべて、inputタグの中にあり、type="checkbox"となっています。（そりゃそうだ）
つまり、inputタグの内容、[HTMLCollection](https://developer.mozilla.org/ja/docs/Web/API/HTMLCollection) を取得できればtypeを指定してチェックボックスを取得できそうです。

以下のように[document.getElementsByTagName](https://developer.mozilla.org/ja/docs/Web/API/Document/getElementsByTagName)でinputタグのHTMLCollectionを取得できます。

``` JavaScript
let chk = document.getElementsByTagName('input'); 
```

inputタグのHTMLCollectionが取得できたので、type='checkbox'だったら、チェックをつけます。

```JavaScript:
for (let i = 0; i < chk.length; i++) {
    if (chk[i].type=='checkbox'){
        // ここにチェックをつける処理
    }
}
```
###取得したチェックボックスにチェックをつける方法
[checkbox](https://developer.mozilla.org/ja/docs/Web/HTML/Element/Input/checkbox)はcheckedを付与すればチェックがつきます。

```JavaScript:
chk[i].checked='checked';
```


先ほどの処理の部分に追加して

```JavaScript:
let chk = document.getElementsByTagName('input');
for (let i = 0; i < chk.length; i++) {
    if (chk[i].type=='checkbox'){
        chk[i].checked='checked';
    }
}
```
#おまけ
もし、「参照アクセス権」の箇所だけチェックを付けたい場合はどうすればいいでしょうか。
(画像の左側のチェックボックスだけ)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/307024/64ffdb4a-c15b-1fd9-64fb-1cdc5184780a.png)
もう一度HTMLを見てみると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/307024/23cf6e0b-4cfd-237a-72c0-07d7948d46b9.png)
どうやらtitleで参照アクセス権と編集アクセス権で分けられているようです。
よって、条件文に「titleが参照アクセス権のとき」を追加すればよさそうです。

```JavaScript:
let chk = document.getElementsByTagName('input');
for (let i = 0; i < chk.length; i++) {
    if (chk[i].type=='checkbox'
        && chk[i].title=='参照アクセス権'){
        chk[i].checked='checked';
    }
}
```
実行すると以下のようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/307024/373ee080-23cd-a744-c946-3c30a8e4f83e.png)
参照アクセス権のところだけすべてチェックがつきました。
#まとめ
今回はたったの6行で2時間かかる作業が5分とかからず終わらせることができました。作成時間を含めてもおつりが来ます。
しかも、こういう自分が楽になるものを作るのって楽しいですよね。

プログラミングは自分たちのめんどくさい作業を発見するところから始まると思います。
プログラマー三大美徳の「怠慢」につながるところだと思います。
今後も自分の「めんどくさい」を見つけてそこから技術を発展させていけるように精進していきたいです。