OmniAICreator/Qiita-1.07M huggingface dataset:
Windowsのコマンドプロンプトなどで永続化したaliasを設定したい！

# TL;DR

設定ファイルを設定ディレクトリに、alias命令文をalias命令ファイルに。
考え方を変換するのです。



# はじめに

簡単にコマンドを作りたい！

そう考えた時、非Windowsユーザは `.bashrc` ファイルなどにaliasを設定すれば終わりです。
しかもファイルが消えない限り、そのシステム内では永久に使うことができます。

しかしWindowsユーザは困りました。
`.bashrc` ファイルなどという便利なものはありません。

ではどうしましょうか。
先人の知恵を借りてみます。

> Windowsのコマンドプロンプトでaliasを設定する (cmderの設定含む)
> https://qiita.com/little_hand_s/items/91d6bcb680eba10da835

> Windowsのコマンドプロンプトでaliasっぽいのを登録できるようにする
> https://qiita.com/analytics-hiro/items/7c2140bfca57cddbb859

> Windows コマンドに Linux 風なエイリアスを登録して永続化させる
> http://neos21.hatenablog.com/entry/2016/01/19/031150

要約すると、次の2種類の方法だそうです。

- コマンドプロンプト起動時のショートカットで `doskey` コマンドを利用して設定ファイルを読込む
- レジストリを利用して設定ファイルを読込む

ファイルをいじればいいからLinuxライクで、確かに便利そうです。

---

一方で、問題点もあります。

- PowerShellではどうするの？
- Bash on Windowsではどうするの？
- ConEmuではどうするの？
- Nyagosではどうするの？

つまり、Windowsのコマンドプロンプトだけでは物足りないユーザは、様々な代替コマンドプロンプトを使っており、上記の手法が使えない場合があります。
しかも、新しい代替ツールを試してみたいのに、その都度上記の設定をするのは面倒この上ありません。

ここでは、全く新しい方法で、aliasっぽい挙動を設定できる仕組みを提案したいと思います。



# 提案手法

既存の手法では、どれも1つのファイル内に設定を書いていました。
つまり、その設定ファイルを更新した場合、その設定ファイルを再読込みする必要がありました。

提案手法では、パスが通っている1つのディレクトリ内に設定を書いたバッチファイルやシンボリックリンクを置くようにします。
パスの中身は、コマンド実行ごとに読込むため、設定ファイルの再読込みという概念がありません。
また、パス自体は全てのシステム（コマンドプロンプトやPowerShellなど）で利用できるため、設定ファイルを複数作る必要性がなくなります。

### バッチファイル

既存の手法によるalias設定が下記のようなものだとします。

```sh:既存の手法によるalias設定
alias original_command='command -option'
```

提案手法では、 `コマンド名.bat` をファイル名にし、コマンドをファイル内容として記述します。

```sh:original_command.bat
command -option
```

上記のファイルを、すでにパスを通したディレクトリ直下に置きます。

### シンボリックリンク

Windowsにおける「ショートカット」をもっと柔軟にしたようなもの、と考えておけば大丈夫です。

> Windowsでハードリンクやシンボリックリンクを作成する
> https://qiita.com/opengl-8080/items/c2b6a93dfca5b61f9e6a

作りたいコマンド名をファイル名（拡張子無し）として、ショートカットを使いたい実行ファイルとリンクを作成します。
その際に、作りたいコマンドは、既にパスを通したディレクトリ直下に作るようにします。

例えば、 `C:/commands` ディレクトリにパスを通していて、 `C:/Users/Owner1/Documents/OpenSSH-Win64/ssh.exe` を `ssh` コマンドとして利用したい場合、下記のようなコマンドを実行します。

```sh:コマンド
mklink C:/commands/ssh C:/Users/Owner1/Documents/OpenSSH-Win64/ssh.exe
```

すると、 `C:/commands` ディレクトリ直下に `ssh` シンボリックリンクを生成します。

---

注意点ですが、 `mklink` コマンドはコマンドプロンプト上でしか動きません。

PowerShellで利用する場合は、 `cmd` コマンドを実行後に上記のコマンドを打てば、コマンドプロンプト上で実行したことになります。
`exit` してPowerShellに戻りましょう。



# おわりに

私はConEmu + Nyagos環境で主に開発していますが、時々コマンドプロンプトやPowerShellを使うこともあるため、複数環境の設定ファイルを作るのが面倒でした。
上記の手法を用いることで、環境非依存なパス環境を構築でき、ストレスなく開発できています（個人の感想です）。
MacでPython2系と3系を同時に使えるようにする。

私の環境は以下の通り。

OS version: macOS Mojave (10.14.2)
Anaconda version: 3 (Pythonは3.7.0)

# AnacondaでPython2.7の仮想環境を作る

つまりはそういうことです。[Anaconda3さえインストーラで入れてしまえ](https://www.anaconda.com)ば、わざわざpyenvとか設定する必要もなく、Python2系のコードを実行するための仮想環境を整えることができます。

```
$conda create -n py27 python2.7 anaconda
```

でpy27という名前のPython2.7系が動く仮想環境を作ったことになります。
これをアクティブにしたいときは

```
$source activate py27
```
とターミナル上で打ちます。試しに

```
$python -V
```
と打つと
`Python 2.7.15 :: Anaconda, Inc.`
と出てきました。仮想環境から抜け出すときは

```
$source deactivate
```
です。ここで再び

```
$python -V
```
とすれば、(私の環境では)`Python 3.7.0`と帰ってきます。
Githubのprivate repositoryに、bitbucketのprivate repositoryをimportする

# 前提
* GitHubにて無料アカウントでも Private Repository が解禁されたので、bitbucketから移行してみた時のメモ
    * http://www.itmedia.co.jp/news/articles/1901/08/news051.html

# 手順
1. GitHubで 空のPrivate Repository を作る
    * READMEやignoreなども追加しない完全な空リポジトリを作成
2. 作った空Repository のトップから *[import code]* をクリック
    * `…or import code from another repository`の見出し下にある *[import code]* をクリック
3. bitbucketの Private Repository のURLを指定して*[Begin Import]* をクリック
    * `Your old repository’s clone URL` の下にある入力ボックスにクローン用のURLを入力
        * https://```bitbucketのアカウント名```@bitbucket.org/`bitbucketのアカウント名`/`bitbucketのRepository名`.git
4. 進まないプログレスバーを見ながら、数分～数十分待つ
5. 唐突に画面が切り替わりアカウント入力の画面になるので、bitbucketのアカウントを入力
    * GitHubの画面上でbitbucketのアカウント入力することに少し違和感を覚えるが気にしない方が吉
6. 認証が通れば自動的に再び進まないプログレスバーが現れ、import開始
7. リポジトリの規模や混雑状況にもよるが、数十分~1時間くらい進まないプログレスバー前で待機
    * 稀に進むこともあるようだが、自分の場合はImportが終わる直前まで動かず、中止しようかと思ったこと幾たび。。
8. プログレスバーが右端まで行けば終了
9. GitHubで Private Repository の内容を確認して終了

# まとめ
* プログレスバーがあまり動かない上に待ち時間も長いので、かなり不安にはなるが、気長に待てば大丈夫。
ユーザーページを探検できなかった話

Rails Tutorial 2章で沼ったのでメモ
Rails 5.1(第4版)

```
rails generate scaffold User name:string email:string
rails db:migrate
```

までうまくいったのだが、続きがうまくいかなかった。

#URLに変なのがつく
2.2のUsersリソースで
rails server
してPreviewから遷移したページのURLを見たら
```https://6b8aeab00f9f40d3b9dcc8bf7b7c212b.vfs.cloud9.us-east-2.amazonaws.com/?_c9_id=livepreview2&_c9_host=https://us-east-2.console.aws.amazon.com```
と後ろに
```?_c9_id=livepreview2&_c9_host=https://us-east-2.console.aws.amazon.com```
がついてきた。
```/users```をURLの最後に付け足しても何も遷移しない。こいつ何者。
[同じ質問](https://teratail.com/questions/144600)みっけた。
とりあえず、後ろのは消してもダイジョブみたい。

#Routing Error： No route matches [GET] "/users"
先ほどの後ろのを削除したURLに```/users```を追加してみた。
User画面に行くはず。
![エラー.PNG](https://qiita-image-store.s3.amazonaws.com/0/307024/7541bbe3-9ad1-5497-cf46-8be85a950d2a.png)


エラー。なんで。
ググったり、Twitter検索したら、どうやら config/routes.rb に/usersを指定すれば良いみたい。

```ruby:routes.rb
Rails.application.routes.draw do
  resources :users #こいつを追加した
  root 'application#hello'
end
```

この時点でチュートリアルの通りじゃなくて違和感。
#Routing Error uninitialized constant UsersController::RoutableActions
![エラー2.PNG](https://qiita-image-store.s3.amazonaws.com/0/307024/178c96aa-d393-7553-7076-e93acad62a06.png)
コントローラーがない！？
流石にチュートリアル的におかしいと勘付く。
```app/controllers``` を見ると、確かにUsersControllerは無かった。
本来であれば下の画像みたいになるはず。
![コントローラ.PNG](https://qiita-image-store.s3.amazonaws.com/0/307024/5bd58fa6-43a2-c872-74f6-d43f8131190a.png)

#魔法不発
魔法の言葉 ```rails generate scaffold User name:string email:string``` が怪しい。
ググると、こいつが ```config/routes.rb``` に ```resources :users``` を追加したりコントローラーを作ってくれるはずのようだ。
というわけでもう一回実行してみると
![Spring動かず.PNG](https://qiita-image-store.s3.amazonaws.com/0/307024/aed1b7b5-0ef5-b91f-0c51-26e4e61d4a1b.png)

動いてませんでした。
>scaffoldで生成された膨大なコードを今詳細に読む必要はありません。今の段階ではおそらく混乱するだけでしょう。

真に受けて全スルーしてた。
詳細には読まなくてもいいけど、同じかくらいは目を通しておきましょうね……。
#犯人は
scaffold 動かない でググると同じような人がいっぱいいるようで。
http://rails-learn.hatenadiary.jp/entry/2016/12/30/090531
どうやらspringというアプリケーションプリローダーが悪さをしている模様。
```rails generate```がちゃんと動かなくなるらしい。
再起動。
ターミナルで

```
$ spring stop
$ bin/spring
```

で、もう一回魔法の言葉

```
$ rails generate scaffold User name:string email:string
```

ちゃんと動きました。
で、URLの後ろに```/users```つけたらうまくいった。
疲れたが原因がちゃんとわかってよかった。一瞬飛ばそうかと思ったけど。
Google Protobuf - How to Define an Optional Field in Protobuf 3?

Answer:　In proto3, all fields are "optional".

```protobuf
import "google/protobuf/wrappers.proto";

message Foo {
    int32 bar = 1;
    google.protobuf.Int32Value baz = 2;
}
```

```golang
if(foo.hasBaz()) { ... }

```

https://matsu-chara.hatenablog.com/entry/2016/11/12/110000
https://tomasbasham.co.uk/development/2017/09/13/protocol-buffers-and-optional-values.html
https://stackoverflow.com/questions/42622015/how-to-define-an-optional-field-in-protobuf-3
無料会員にも開放されたプライベートリポジトリを試してみる

# はじめに
<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Use private repositories with three of your closest collaborators *for free* 🙌<a href="https://t.co/rSJrtvsXfS">https://t.co/rSJrtvsXfS</a> <a href="https://t.co/oRVpNP1c3r">pic.twitter.com/oRVpNP1c3r</a></p>&mdash; GitHub (@github) <a href="https://twitter.com/github/status/1082387150954512384?ref_src=twsrc%5Etfw">2019年1月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ということで今まで有料会員($7/month)しか利用することのできなかったプライベートリポジトリを無料会員でも利用することができるようになりました！
今回は既存のパブリックリポジトリをプライベートリポジトリに変更する方法についてご紹介します。

# 手順

プライベートにしたいリポジトリを開き、「Setting」タブをクリックします。
![キャプチャ1.JPG](https://qiita-image-store.s3.amazonaws.com/0/240148/33cc2eff-ca66-4901-e3b5-a4202460c512.jpeg)

「Setting」画面の最下部に「Danger Zone」という赤枠で囲われたエリアがあります。
その中の「Make this repository private」をクリックします。
![キャプチャ2.JPG](https://qiita-image-store.s3.amazonaws.com/0/240148/3ab0ab67-7ae2-09f0-30fb-0d3fd9b4fb37.jpeg)
すると以下のようなポップアップが表示されるので、
下のテキストボックスにプライベートにしたいリポジトリの名前を入力し、下のボタンをクリックします。
![キャプチャ3.JPG](https://qiita-image-store.s3.amazonaws.com/0/240148/6583cbce-c68e-c723-1e6b-eb84e09c9b1a.jpeg)
すると画面が遷移し、リポジトリ名の横に「private」と表示されます。
![キャプチャ5.JPG](https://qiita-image-store.s3.amazonaws.com/0/240148/2b255392-663f-b344-d11c-f6cb7de2f3ad.jpeg)
これで既存のパブリックリポジトリをプライベートリポジトリに変更することができました。

# 芝生について

設定によっては他人から見た芝生にプライベートリポジトリへのcommitが反映されない場合があります。
これを防ぐために芝生の上にある「Contribution Setting」をクリックすると表示される、「Private Contributions」にチェックが入ってることを確認しましょう。
![キャプチャ6.JPG](https://qiita-image-store.s3.amazonaws.com/0/240148/464d0fd7-f6b1-ed43-5a5f-a8093b4eb9c3.jpeg)
# おわりに

これからはちょっとテスト的に作ったソースだったりを気軽に管理できるようになりますね。
JavaのListで任意の件数ごとに処理

# はじめに
JavaのListで処理を実装しているとき「リストを100件ずつ処理したいー」とかあったりすると思います。DBでBulkインサートする時とかでないですか？なかったら私の頭がおかしいです。
所謂そんなBulk的な処理をJavaで実装したやつと実装してちょっとハマって同じ過ちを犯しそうなので忘れ無いようのメモです。  

# 参考
以前に参考させていただいた投稿があって、ほぼそれを使わせていただいているのですが、調べてもなかなか出てこず。。、いいねもしていなかったようで。、。、。、。、
もし「このコード見たことある」「というか私のこの投稿だ」とかあれば教えて頂けると幸いです。  

# 実装したもの

```
public interface BulkHelper<T> extends Iterable<T> {
	
	/**
	 * 第一引数で設定されているサイズのListをIterateします。
	 * @param size 一括で処理するリストのサイズ
	 * @param list 処理するリスト
	 */
	default void doMethod(int size, Consumer<? super List<T>> list) {
		final List<T> _list = new ArrayList<T>(size);
		for (T t : this) {
	        if(_list.size() == size) {
	        	list.accept(_list);
	        	_list.clear();
	        }
	        _list.add(t);
	    }
		if(_list.size() > 0) list.accept(_list);
	}
	
	/**
	 * Iterateするリストをセットします。
	 * このメソッドは呼び出し必須です。
	 * @param itr
	 * @return
	 */
	public static <T> BulkHelper<T> setList(Iterable<T> itr){
		return () -> itr.iterator();
	}
}
```

**使うとき**

```
public static void main(String[] args) {
		
　　List<String> list = Arrays.asList("AAA", "BBB", "CCC", "DDD", "EEE", "FFF","GGG");
		
　　BulkHelper.setList(list).doMethod(2, _list -> {
	　　System.out.println(_list);
　　});		
}
```

**結果**

```
[AAA, BBB]
[CCC, DDD]
[EEE, FFF]
[GGG]
```

# ハマったこと

一括処理分をListに詰め直してそれを並列処理したいと思ったときこんなことをしました。

```
public static void main(String[] args) {
	
	List<String> list = Arrays.asList("AAA", "BBB", "CCC", "DDD", "EEE", "FFF","GGG");
	
	List<List<String>> copyList = new ArrayList<>();
	BulkHelper.setList(list).doMethod(2, _list -> {
		copyList.add(_list);
	});
	
	copyList.parallelStream().forEach(System.out::println);
}
```

**結果**

```
[[GGG], [GGG], [GGG], [GGG]]
```

いやん。、

### 原因
BulkHelperインターフェースのここの処理。   

```
if(_list.size() == size) {
     list.accept(_list);
     _list.clear();
}
_list.add(t);
```

参照先は常に_listになっており、且つclear(), add()を繰り返していたためにListで最後に処理された[GGG]を全ての要素が参照してしまったというところです。凡ミスです。  

### 解決
 
```
BulkHelper.setList(list).doMethod(2, _list -> {
	ArrayList<String> clone = new ArrayList<>(_list);
	copyList.add(clone);
});
```
本当はインターフェース側で何とかしたいのですがパッと思いついたのは処理内部でnewしてあげるというところになりました。

## 追記
@Kilisameさんと@swordoneさんのご指摘のおかげでインターフェースを以下のようにスッキリ解決できました！
ありがとうございます！

```
public interface BulkHelper<T> extends Iterable<T> {
	
	/**
	 * 第一引数のListを第二引数のサイズごとに処理を行います。
	 * @param list 処理するリスト
	 * @param size 一括処理のサイズ
	 * @param bulkList 処理内容
	 */
	public static <T> void extract(List<T> list, int size, Consumer<? super List<T>> bulkList) {
	    for (int i = 0; i < list.size(); i += size) {
	        List<T> _list = new ArrayList<>(list.subList(i, Integer.min(i + size, list.size())));
	        bulkList.accept(_list);
	    }
	}
}

```

**使うとき**

```
public static void main(String[] args) {
	
	List<String> list = Arrays.asList("AAA", "BBB", "CCC", "DDD", "EEE", "FFF","GGG");
	
	List<List<String>> copyList = new ArrayList<>();
	BulkHelper.extract(list, 2, _list -> {
		copyList.add(_list);
	});
	
	copyList.parallelStream().forEach(System.out::println);
	
}
```
スッキリだ～:star2:
LaTeXで分割タイプセットをする方法

#目的
$\rm\LaTeX$で，章ごとに分割タイプセット(分割コンパイル)をしたい。

#環境
TexLive 2017
macOS Mojave
VisualStudio Code

#方法
`docmute.sty`を使って実現します。

ディレクトリ構成は以下の通りにします。
LaTeX-directory内にtexファイルを置くと，タイプセット時に自動生成されるファイルが大量に発生するため，各texファイルごとにディレクトリを分けることをお勧めします。

```:ディレクトリ構成
── LaTeX-directory
    ├── 0-abstract
    │   └── abstract.tex
    ├── 1
    │   └── 1.tex
    ├── 2
    │   └── 2.tex
    ├── 3
    │   └── 3.tex
    ├── 4
    │   └── 4.tex
    ├── 9
    │   └── 9-sankou-bunken.tex
    ├── master
    │   └── master.tex
    ├── pic
    │   └── image.png
    └──setting.tex
```

```LaTeX-directory/master/master.tex
\documentclass[a4j]{jreport}
\renewcommand{\bibname}{参考文献} %関連図書を参考文献に変える
\input{../setting.tex} %styファイルの一括管理ファイルの読み込み
\begin{document}
\maketitle %タイトル
  \input{../0-abstract/abstract.tex}
  \tableofcontents %目次
  \input{../1/1.tex}
  \input{../2/2.tex}
  \input{../3/3.tex}
  \input{../4/4.tex}
  %以下，読み込ませたいtexファイルを\input{(読み込みたいtexファイルのパスをmaster.texからの相対パスで記述)}で読み込む
  \input{../9/9-sankou-bunken.tex}
\end{document}
```

```LaTeX-directory/0-abstract/abstract.tex
\documentclass[a4j]{jreport}
\input{../setting.tex} %styファイルの一括管理ファイルの読み込み
\begin{document}
  \begin{abstract}
  （abstractを書く）
  \end{abstract}
\end{document}
```

```LaTeX-directory/1/1.tex
\documentclass[a4j]{jreport}
\input{../setting.tex} %styファイルの一括管理ファイルの読み込み
\begin{document}
  \chapter{はじめに}
  <はじめにを書く>
  \chapter{画像の入れ方}
    \centering
    \begin{figure}[h]
        \includegraphics{width=10cm}{../pic/image.png} 
%画像は画像フォルダに集約すること！
%maste.texからタイプセットした場合は，master.texからの相対パスで画像が読み込まれ，タイプセットされます。
    \end{figure}
\end{document}
```
`2.tex`以降は`1.tex`と同様に記述します。

```LaTeX-directory/9/9-sankou-bunken.tex
\documentclass[a4j]{jreport}
\input{../setting.tex} %styファイルの一括管理ファイルの読み込み
\begin{document}
  \begin{thebibliography}{9}
    \bibitem{label} 参考にしたURL名\\
    \url{qiita.com}(最終閲覧日:2019.1.1)
  \end{thebibliography}
\end{document}
```

```LaTeX-directory/setting.tex
\usepackage{docmute} %分割タイプセットに必要
%以下は任意で追加してください
\usepackage[dvipdfmx]{graphicx}
\usepackage{url}
\usepackage{here}
```
このような形で書いていきます。
章ごとにタイプセットする場合は，そのtexファイルにてタイプセットをします。
ただし，注意点として，
**分割タイプセットをした場合は，論文全体での第2章となるtexファイルであっても1章から付番されます。**

論文全体をタイプセットしpdf化するときは `LaTeX-directory/master/master.tex` をタイプセットすることで全てのtexファイルが読み込まれます。

# おまけ：BibTeXの活用
参考文献を自動的にソートしてくれるのでかなり便利になります。
https://qiita.com/ta_b0_/items/69a5e72baacaf08ba79e
是非参考にしてください。

#最後に
割とメモ書き的なノリなので、改善点があれば遠慮なくコメントにて教えてください。

#参考
https://ossyaritoori.hatenablog.com/entry/2016/12/22/%E3%80%90%E5%8D%92%E8%AB%96%E3%83%BB%E4%BF%AE%E8%AB%96%E3%80%91_%E5%88%86%E5%89%B2Tex%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%8D%98%E4%BD%93%E3%81%A7%E3%82%82%E3%82%B3%E3%83%B3%E3%83%91
SIerだからこそパスワードの要件は見直そう

# TL;DR
- 全ての文字種は基本的に使用可能にしろ（最低ASCII）
- かといって全部の種類を使うことみたいな制限はかけるな
- 1000桁とかならともかく、10文字以内みたいな制限はかけるな
- 保管方法はオレオレ実装するな
- 定期変更させるな
- 秘密の質問は捨てろ

# 始めに
SIerのような職種をしていると、当然企業がらみの新サービスを立ち上げることがままあるのですがそのような場合は基本的に”**先行事例**”という名の元に初回そんなに検討されたかもわからない仕様がそのまま引き継がれてしまうことが多いです。  
その中でもパスワードのような明らかに共通で使いまわせる機能に関しては、**要件・実装ともにそのまんま社内にあったシステムを使ってしまいがち**で、まともな議論が行なわれることは稀・・・。その結果世の中に現代とも思えないような要件がごろごろしてて、それが必要なサービスだったときに回りまわって消費者の我々がイライラするわけです。
    
どうせパスワードのような部分はSIerのお客さんもそれほど踏み込んでこないので、こちらが説明をすると受け入れてくれることがほとんどなので、草の根運動として現代のあるべきパスワード要件を広めていきたいのが投稿趣旨となります。

# ぶっちゃけ
以下の記事は全てNIST(米国立標準技術研究所)が発行したSP 800-63B（[翻訳リンク](https://www.jipdec.or.jp/sp/topics/event/u71kba0000009o56-att/nist_sp_800-63b.pdf)。
翻訳版を作ってくださる、OpenId Foundationのような組織には感謝。）の抜粋、雑感となります。該当文書にはその他認証手法の整理など有益な情報が詰まっておりますので、興味をもたれた方はぜひご覧ください。

# パスワード許容文字列の要件

1. **文字種は全部許容しよう**  
当たり前ですが、パスワードの組み合わせは```(使用可能文字種)^(文字数)```で表すことが出来るため、ブルートフォースアタックにも強くなり、ユーザーとしても思っていたパスワードが使えないことが無くなり利便性も向上します。  
当たり前ですが平文でパスワードを露出することはありえないので、SQLインジェクションなどの問題にあたることもありません。(平文保管しているならそのほうがよっぽど問題です)
2. **文字種の強制はやめよう**  
こちらに関しては、結構な数のサービスが採用しているように思えますが、下記引用のように大体の場合において強制される文字種はパスワードの強度そのものをあげることに繋がりません。
> 研究者はユーザが構成ルールで課せられた要件に対してかなり予測可能な方法で応答することを示した．例えば，パスワードとして”password”を選択したユーザは，大文字と数字を含む要件を与えると，比較的高い確率で”Password1”を選択し，記号を要件に追加すると”Password1!”を選択する．

3. **パスワードの長さに上限を設けない**  
後述の管理で記載しますが、パスワードは当然hashで保管されるものであり、元の長さに依存しません。このため明らかに処理への影響がでるレベルならともかく、パスワードに上限を設けないことが重要です。(パスフレーズとよく言いますが、シンプルな単語の羅列であっても十分な長さが確保されていれば強度は上がるため、そのような形式を受け入れられるようにすることは重要です)  
4. **ブラックリストは作ろう**  
正直これはSIerとしては、顧客とブラックリストの内容をどう決定するか（アップデートしていくか）という事に関して合意を取りにくいので面倒なのですが、例えば毎年話題になるSplash Dateの[危険なパスワード100選](https://www.teamsid.com/100-worst-passwords-top-50/)このあたりを参考にするのが手っ取り早いのではないでしょうか。(123456など本当に使うのかと驚きますね・・)

# パスワード保管要件
当たり前ですがユーザーが入れたパスワードが正解なのかを判定するために何らかの形で保管する必要がありますが、その際保管形式は万が一データベースの情報が漏れたときやシステム保守の内部犯が発生した時に現実的に復元できないようにすることが非常に重要です。  
必要な実装としては、

- 適切なhash関数 (当然暗号化ではありません)
- 十分な回数のストレッチング（繰り返しhash）
- ランダムなソルト  

このあたりが必要な事項になりますが、どれも基本的なわりにオレオレで作った結果実は1回hashして終わりだったり、ランダムといいながらリストから選ぶだけのソルトだったりと色々問題のある実装が世に溢れています。  

こんなところこそ車輪の再発明なんてしないで巨人のやることにお任せするべき事例で、手っ取り早いインターフェースが用意されているライブラリを選択すべきです。
BCryptあたりが無難かと思います。（以下Javaで使用する場合の[SpringSecurityCrypto](https://github.com/spring-projects/spring-security/tree/master/crypto/src/main/java/org/springframework/security/crypto/bcrypt)のmaven記載です。）

```maven:pom.xml
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-crypto</artifactId>
			<version>5.0.0.RELEASE</version>
		</dependency>
```

# その他要件
1. **定期変更**  
昨年にそこそこ話題になったので皆さん認識はしていると思いますが、現在パスワードの定期変更は非推奨になっています。理由としてはローテーションで結局同じのにしがちである、固定された末尾の数字を取り替えて対応するなど実は推測しやすいパスワードを選択しがちになるからというのが大きな理由です。
2. **秘密の質問**  
こちらも現代では常識になりつつありますが、個人が忘れ得ないイベント記憶を問う質問  
```出身の中学校はどこですか？```  
などはSNSの普及により、誰でもうかがい知れる”**秘密**”といえないものになったという点から絶対に使ってはいけません。

# まとめ
現代においてだれしもが使う機能に関しては専門家が必ず居て最新情報はどんどんアップデートされていっています。このような共通機能は設計ごとをするときは国外事例なども鑑みながら、１次ソースをなるべく確認して世の中動向にあった設計をして利便性・安全性を高めていきましょう。
Heroku で Rails/webpacker のコンパイルに失敗する

# 何が起きたか

Heroku にデプロイした Rails アプリが [webpacker.gem](https://github.com/rails/webpacker) の `rake assets:precompile` で失敗するようになった。こんなエラーが出る。

```
error upath@1.0.2: The engine "node" is incompatible with this module. Expected version ">=4 <=9". Got "10.14.1"
```

webpacker がどこかで依存している [upath](https://github.com/anodynos/upath/blob/a28b9a893684a51f94e8454a1a99e1200b8b962b/package.json#L43) のバージョンが古く、 Node.js の 4.x から 9.x までのサポートしかなかったので失敗していた。

# 原因

Heroku で使われるデフォルトの Node.js が2019年に入って 8.x から 10.x になってたみたい。

[Heroku Node.js Support](https://devcenter.heroku.com/articles/nodejs-support)を見ると、以下のような記述があった。

> If you don’t specify a version, the latest Long-Term-Support release will be used.

Heroku の Node は特にバージョンを指定しないと最新のLTSリリースを使うらしい。そこで[Node.js Release Working Group の LTS(Long Time Support)スケジュール](https://github.com/nodejs/Release#release-schedule)をチェックすると、以下の表があった。8.x系は2019年1月1日から Active LTS から Maintenance LTS になってる。

<img src=https://qiita-image-store.s3.amazonaws.com/0/26239/8268228f-9371-2788-65f4-72c369b254ce.png style="broder: 1px solid black;" border="1">



# 解決方法

- デプロイしたい Rails アプリで `yarn upgrade` すれば upath のバージョンも上げてくれるので Node.js 10.x 系でも動くようになる。
- もしくは Node.js のバージョンを固定する。
    - [Specifying a Node.js Version - Heroku Node.js Support](https://devcenter.heroku.com/articles/nodejs-support#specifying-a-node-js-version)

長期的には前者、短期的には後者の方法が安全かな。
Stackdriver Agent を Ubuntu 18.04 にインストールする（unstable）

# Stackdriver Agent を Ubuntu 18.04 にインストールする（unstable）

[Stackdriver Agent](https://cloud.google.com/monitoring/agent/) では長らく Ubuntu 18.04 対応がされてきませんでした。
[Logging Agent](https://cloud.google.com/logging/docs/agent/) の方は Ubuntu 18.04 にも対応しているので、もう少しだとは思うのですが・・・
何か情報ないかなーと漁っていたときに、こんなスレッドを発見しました。

[Have Stackdriver monitoring support for Ubuntu 18.04 LTS](https://issuetracker.google.com/issues/79138515)

新年のお年玉か何かですかね、unstable だけどあるっぽいみたいなことが 2019/1/1 に書いてあります。

## 前提条件

[Installing the Monitoring agent](https://cloud.google.com/monitoring/agent/install-agent#linux-install) に従って、クレデンシャルは用意しておいてください。

## インストール

```
> curl -sS -o - https://dl.google.com/cloudagents/install-monitoring-agent.sh | sudo REPO_SUFFIX=unstable bash -
```

インストールすると勝手に立ち上がります。
クレデンシャルがちゃんと設定されていれば、Stackdriver のコンソールにメトリックが送信されます。

## まとめ

まだ unstable ですが、とりあえず使えるようになったのは嬉しいですね。
早く stable になってほしいと期待しながら・・・
VBA_見出し付きデータの読み込み

#1.概要
一行目に見出し、二行目以降にデータがあるシートにおいて、
見出しとデータを別に読み込む際のサンプル。
![2019-01-08 (2).png](https://qiita-image-store.s3.amazonaws.com/0/336212/a1ea76bc-e231-f9a5-e056-4abe81e9616e.png)


#2.ソースコード
```vb

'一行目に見出し、二行目以降にデータがあるシートのセル参照
Sub データ参照_サンプル()
    
    Dim used_cells As Range  '全セルのバッファ
    Dim current_region As Range '現在regionのバッファ
    Dim firstcell As Range '左上セルのバッファ
    Dim lastcell As Range '最後のセルのバッファ
    
    Dim firstrow As Range '最初の行のバッファ
    Dim data_cells As Range 'データ部のバッファ
    
    '使用されているセル範囲を全て取得
    Set used_cells = ActiveSheet.UsedRange
    
    '範囲のセルを取得
    Set current_region = ActiveCell.CurrentRegion
    
    '最初のセルを取得
    Set firstcell = used_cells(1, 1)
    
    '最後のセルを取得
    Set lastcell = ActiveCell.SpecialCells(xlCellTypeLastCell)
    
    'used_cellsの先頭行を取得(Rows(1)だとDebug.Print時にエラー、理由は不明)
    Set firstrow = Range(used_cells(1, 1), used_cells(1, used_cells.Columns.Count))
    
    'データ部=used_cellsの二行目以降を取得
    Set data_cells = Range(used_cells(2, 1), lastcell)
    
    'デバッグ
    Call range_debugPrint(used_cells)
    Call range_debugPrint(current_region)
    Call range_debugPrint(firstcell)
    Call range_debugPrint(lastcell)
    Call range_debugPrint(firstrow)
    Call range_debugPrint(data_cells)
    
    
End Sub

'デバッグ用
Function range_debugPrint(rg_ As Range)
    Dim i, j As Long
    
    Debug.Print "--------------"
    
    For i = 1 To rg_.Rows.Count
        For j = 1 To rg_.Columns.Count
            Debug.Print rg_(i, j) + " ";
        Next
            Debug.Print
    Next
    Debug.Print "--------------"
    
End Function
```

#3.実行結果
```
--------------
見出し1 見出し2 見出し3 見出し4 
a b c d 
e f g h 
i j k l 
--------------
--------------
見出し1 見出し2 見出し3 見出し4 
a b c d 
e f g h 
i j k l 
--------------
--------------
見出し1 
--------------
--------------
l 
--------------
--------------
見出し1 見出し2 見出し3 見出し4 
--------------
--------------
a b c d 
e f g h 
i j k l 
--------------

```
【C++】streamにdouble値を最大精度の小数点表記で出力する設定

いつも忘れるので備忘に。

```C++
#include <limits>
#include <iomanip>
#include <iostream>

int main()
{
	double v = 1.2345678901234567890;

	std::cout << v << std::endl;	// 1.23457

	// doubleの出力精度設定をmaxにする。
	std::cout << std::fixed;
	std::cout << std::setprecision(std::numeric_limits<double>::max_digits10);

	std::cout << v << std::endl;	// 1.23456789012345669
}
```
Firebaseを使ったandroidのpush通知で引っかかった箇所

push通知を実装すると、今までと少し違った動きをしていたのでメモ

基本的な実装はできているとする

# 問題：onMessageReceivedが呼ばれない

バックグランドとフォアグランドで、どうやらフォアグランドでしか呼ばれないらしい。

→処理できなくない？

サーバーから送る値で制御でclick_actionっていうのを◆◆◆にしてたら

```ruby:qiita.rb
<intent-filter>
<action android:name="◆◆◆" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
```

を設定したactivityが開く
音とかも、サーバー側と連携させておかないとうまくできない。

開発の中でサーバーサイドから送ってもらう値をみて制御をする

# 問題：フォアグランドでonMessageReceivedが呼ばれない

正しく設定してるのに呼ばれない。なんで？と思うと、

serviceの起動をする→開発で再インストール→前のserviceが残ってる

受信すると、前回のserviceがコンフリクト　→動作しない

端末を再起動すると動作をした。もしかするとアプリ情報から強制的に停止をすれば動作するかもしれないけど、インストールを続けるとコンフリクトでうまく動作しないかもしれない
Androidのエミュレータをコマンドから直接起動する

Androidのエミュレータを起動するのにいちいちAndroidStudioを立ち上げてからAVDManager経由でやるのが面倒だったので、コマンドラインから直接エミュレータを起動する方法を調べたので、メモ。

※なおFlutterであれば、VSCodeで開発する場合、VSCodeの拡張機能Flutterの機能で、デバッグ時に直接エミュレータを起動できることにあとから気づきました。。
一応メモとして残しておきますがあまり有用な情報ではなさそうです。

## 環境
AndroidStudio 3.2.1
AndroidEmulator 28.0.22
Windows10 (1803)

## 方法
※下記`${ANDROID_SDK_ROOT}`は、Windowsでは`C:\Users\{UserName}\AppData\Local\Android\Sdk`です。

エミュレータ起動コマンド
`${ANDROID_SDK_ROOT}\emulator\emulator.exe "@[emulator name]"`

`[emulator name]`は、下記コマンドでリストに出てくるNameの値。
`${ANDROID_SDK_ROOT}\tools\bin\avdmanager.bat list avd`

なお、上記emulator.exeは`${ANDROID_SDK_ROOT}\tools\bin`内にもあるが、`${ANDROID_SDK_ROOT}\emulator`内のほうを起動しないと、`PANIC: Missing emulator engine program for 'x86' CPU.`というエラーが発生するので注意。

## 参考

[Update Your Path For The New Android Emulator Location](https://www.stkent.com/2017/08/10/update-your-path-for-the-new-android-emulator-location.html)
転移学習（VGG16）でマンガの作者を予測する

## 環境・ライブラリ
AWS EC2 
インスタンスタイプ：p2.xlarge
Keras

## 目的
手塚治、藤子不二雄、高橋留美子、鳥山明、宮崎駿の５名の漫画家の画像をインターネットから集めて転移学習させて、学習で利用していない未知の画像を読み込ませて作者が誰かを予測してみる。

## 手法
VGG16を利用しました。16層からなるモデルですが、14層までを凍結して、15〜16層の全結合層のみを学習しました。

## 画像データ収集
Googleから画像を一括でダウンロードできるコマンドラインツール「google-images-download」を利用しました。
参考にしたサイト：https://co.bsnws.net/article/295
```
pip install google_images_download 
```
**データセット割合**
１作者あたり
　訓練データ：300枚
　検証データ：100枚
　テストデータ：35枚
5作者分用意したので、訓練データは1,500枚用意しました。

### 苦労した点
**googleimagesdownloadの手法に行き着くのに時間が掛かった**
　・最初はBing Seach APIを使っていた。
　・googleimagesdownloadのデフォルトは100枚までしかダウンロード出来ないが、-cdのオプションを追加することで、100枚以上のデータのダウンロードができるようになった。
**画像データセットの準備に苦労した**
　・削除するデータ
　　　・重複画像データ
　　　・できる限り作者の名前が入ったデータ
　　　・作者以外の人が書いたデータ
　　　・作者本人の顔写真
　　　・キャラクターグッズのデータ
　・100枚の中から数枚しか使えるデータが無い場合もあるため、検索文字が大事
　　　例）「ドラゴンボール」ではなく「天津飯　ドラゴンボール」などキャラクター名を指定した方が良質なデータが集まる気がする
以下のようなコマンドでデータを落としてきました。

```
googleimagesdownload -k "ジャイアン　のび太" -l 500 -cd "/Users/XXXX/Downloads/chromedriver"
```

### 工夫した点
**データセットの件数はそのままで少し中身を入れ替えた**
修正前のデータセットは、コミックのデータセットも多く含まれています。
修正後のデータセットからは、コミックのデータセットを削減して、キャラクター画像に置き換えました。
その結果、オプティマイザ「Adam」を利用して、epochs:70で回した結果、accuracyが2ポイントほど上がりました。

## 実装
スクリプト、データセットはGitHubに置いてます。[GitHub](https://github.com/ttomomasa/diveintocode-term3/tree/master/Sprint26-27)

※データセットが全部上げきれていないです。中途半端で申し訳ないです。。

## 結果
オプティマイザ「SGD」はlossが下がるのに300エポック必要なのに対して、「Adam」は　７０エポックで「SGD」の精度を超えている。だいぶ低コストで学習できることが分かる。

🔷SGD
<img width="862" alt="スクリーンショット 2019-01-08 15.06.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/209049/64df7c16-8fb4-af73-d0d7-e19c8dffd8bf.png">

🔷Adam
<img width="873" alt="スクリーンショット 2019-01-08 15.05.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/209049/606e4f93-76aa-f4bf-1e04-5dbc9605f79f.png">



**データセット修正前**
epochs=100　SGD　test_acc: 0.584375
epochs=200　SGD　test_acc: 0.678125
epochs=70　 Adam test_acc: 0.80625

**データセット修正後**
epochs=300　SGD　test_acc: 0.78807946940921
epochs=70   Adam test_acc: 0.8178807939125212

ほぼほぼ当たっている。最初（左上）の画像は鳥山明ではなく宮崎駿を間違えていますが。。
<img width="972" alt="スクリーンショット 2019-01-08 13.53.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/209049/99f630fe-c895-844e-63f4-6c420318dff8.png">

## 改善点
・訓練データセットを1作者あたり500枚まで増やす／コミックデータを極力減らす
・過学習対策としてドロップアウトを追加する
・データ拡張（Data Augmentation） keras.preprocessing.image.ImageDataGeneratorでvertical_flip（画像を垂直方向にランダムに反転する。）を組み込んでみる

## 引用
ソースコードはこちらのサイトを利用させていただきました。
>https://qiita.com/God_KonaBanana/items/2cf829172087d2423f58

## 投下時間
1/5（土）午後：何か実装してみることにした。最初はくずし字データセットを使って何かモデルを作ることを考えたが、それはやめて、転移学習でマンガ作者予測とすることにした。
1/6（日）：参考になるサイトを見つけて、まずは動作することを確認するため3名の著名な画家（ゴッホ、ピカソ、ルノワール）のデータを集めて、分類できるか検証した。無事動いたので、マンガで試すべくデータ収集を開始。
1/7（月）：マンガで試すべくデータ収集を継続。一旦終わったので学習・推論して結果確認。精度を上げるべくデータ修正。
1/8（火）：修正後のデータセットで学習・推論。QiitaへUP。
業務委託で参画する前に確認すること一覧

自分が業務委託で参画する前に確認することです。(主に環境面)
他に確認することなどありましたら、コメントなどで教えて頂ければです。

##基本情報
- 契約内容
 - 請負
 - 準委任
- 常駐 / リモート
- 稼働日数
- 稼働時間
- 支払いサイト
- 単価
    - 税抜き/税込み
    - 交通費分も考慮に入れること

## 社内環境
- 基本勤務時間
- 平均稼働時間
- 休憩時間
- 勤怠について
- チームの年齢層
- イヤホンをつけて仕事してもいいのか

##  開発環境
- 端末の確認
    - 支給 / 持ち込み
    - Mac / windows
- キーボードやマウスの持ち込み
- 使用エディター
- フリーのソフトウェアインストール

## 開発スタイル
- プロジェクトの進め方
- コミュニケーション方法
    - slackなど入れている？
- テストコード
- レビュー体制
- 自分が担当する業務・技術

## その他
- Qiitaなどに業務知識外のことをメモしながら、アウトプットしてよいか
- チームリーダの考え方（リーダの考えが雰囲気を決める気がするから）
  - どのようなチームを作っているのか?
  - 工夫している点 
- 事前に準備・勉強しておくこと
Splunkのevalとifの使い方(ハマって学ぶシリーズ)

前置き
---
-  SPLを書いていてハマったポイントを中心に備忘録として残す
-  2021.1.9追加


ケース1：レコード内の特定の列に”０”があった場合に、他の列の値も”０”に置き換えたい
---
###ポイント###
- 値（文字、数字）の置き換えは**eval**と**if(又はcase)**を利用する

###元データ例###
![スクリーンショット 2019-01-08 14.31.35.png](https://qiita-image-store.s3.amazonaws.com/0/185759/53059177-d008-031c-fc60-6d56a02b1427.png)
- 上記データの赤矢印の値を"０"に置き換えたい
- そのために条件式として、`IF "ステップ(歩数)"　が "0" なら、　"消費カロリー(cal)"　を "0"に書き換える`とSPLで作成

###SPL例###
```SPL:SPL(evalとif)
|eval summary.caloriesOut=if('summary.steps' == "0","0",'summary.caloriesOut')
```

###結果###
- 無事、0に置き換えられました。
![スクリーンショット 2019-01-08 14.47.51.png](https://qiita-image-store.s3.amazonaws.com/0/185759/77929934-ce90-9e39-c406-9a1f28474d03.png)


###ハマったポイント###
- フィールド名が「summary steps」や「summary.steps」のように間にスペースが入っていたり、ドットが含まれている場合、**' (シングルコーテーション)で囲わないと認識しないので要注意**。サーチ時にエラーが出ないのでハマりました。[evalのお作法に関して”Field names”欄に説明あり](https://docs.splunk.com/Documentation/Splunk/7.2.3/SearchReference/Eval)




ケース2：異なるデータ同士をつなげてるために共通フィールドをサーチ時に作成する
---
###ポイント###
- 例として、"WAFアラートの**uri_query**"と"streamデータの**uri_path**"の値が同じものをまとめて表示したい
- 新たに**c_uri**というフィールドをevalで作成
- isnull条件を使うとお互いに存在しないフィールドに引っ張られるずにキレイにフィールド生成できる

###元データ例###
![スクリーンショット 2021-01-09 20.37.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/cc17d480-16f3-af29-61bd-5c919e6be984.png)

###SPL例###
```SPL:SPL(evalとif)
|eval c_uri = if(isnull(uri_path),uri_query,uri_path)
```

###結果###
- **c_uri**が生成できました
![スクリーンショット 2021-01-09 20.39.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/2cde9a12-186e-b5ce-e7c6-a5cd4851c537.png)

- あとはc_uriで集計するとWAFとstreamデータがうまくまとめて表示できます
![スクリーンショット 2021-01-09 20.43.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/dd8c4cde-e32d-d8ff-bcc4-6c71644399b3.png)
[Angular] テストレシピ - ルートパラメータを渡す

# これはなに？

Angularでは、URL中に含んだパラメータをコンポーネントで受け取ることができます。

例えば `http://example.com/products/cat/100/id/10020` というURLから、cat=100、id=10020のようなパラメータを受け取ることができます。

そのようなコンポーネントに対して、テスト時にパラメータを渡す方法です。

# テスト対象

以下のようなルーティングを設定していたとします。

```ts:app-routing.module.ts
// （省略）
const routes: Routes = [
  {
    path: 'detail/:id',
    component: DetailComponent,
    data: { animationState: 'detailPage' }
  }
];
// （省略）
```

コンポーネントで、以下のようにパラメータを受け取っていました。

```ts:detail.component.ts
// （省略）
@Component()
export class DetailComponent implements OnInit {
  constructor(private route: ActivatedRoute) {}

  ngOnInit() {
    // 文字列なので、数値に変換しています。
    const id = parseInt(this.route.snapshot.paramMap.get('id'), 10);
  }
}
```

# テストコード

テストコードはこのようになります。
`TestBed`の依存性注入設定で、`ActivatedRoute`を渡してあげています。値としては123を渡しています。

```ts:detail.component.spec.ts
import { ActivatedRoute, convertToParamMap } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing';
import { DetailComponent } from './detail.component';

describe('DetailComponent', () => {
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [DetailComponent],
      imports: [RouterTestingModule],
      providers: [
        {
          provide: ActivatedRoute,
          useValue: {
            snapshot: {
              paramMap: convertToParamMap({ id: 123 })
            }
          }
        }
      ]
    });
  }));
});
```

# 環境

* Angular 7.1.0
Javascript + Firebase Realtime DatabaseでSQLのWHERE IN 的なことをしたい

※タイトルにWHERE IN 的なことをしたいと書いていますが実際にはWHERE INとはほど遠く複数クエリをFirebaseに投げています
※そもそもFirebase Realtime Database自体が初心者なため、データ構造から自信がありません。 また、Promiseも理解しきれておりません。 もっと良い方法がありましたらご教示頂けると幸いです。

## 前提
React+FirebaseでSPAを開発

## 困ったこと
* あるユーザに紐付くデータ(モデル)が複数個ある
* 紐付けは以下のようにモデルのIDで持っている

```json
"users": {
  "ID-USER-abcde": {
    "username": "tanaka",
    "data": {
      "ID-DATA-ABCDE": true,
      "ID-DATA-FGHIJ": true
    }
  },
  ..snip..
},
"data": {
  "ID-DATA-ABCDE": {
     "num": 3
  },
  "ID-DATA-FGHIJ": {
     "num": 5
  },
  "ID-DATA-KLMNO": {
     "num": 8
  },
  ..snip..
}
```
* やりたいことはSQLでいう

```sql
SELECT * WHERE IN ("ID-DATA-ABCDE", "ID-DATA-FGHIJ");
```
* しかしFirebase Realtime Databaseにそのようにクエリする方法はない

## 方針
* 改めてFirebaseに用意されている関数を確認してみる。 `orderByChild()、orderByKey()、orderByValue()` / `limitToFirst()、limitToLast()、startAt()、endAt()、equalTo()` => やりたいことはできなさそう
* dataを全部持ってきてクライアントでフィルタする => 流石にネットワーク効率が非効率的な気がする
* **userに対するdataはそこまで多くなる予定はないので、 一つ一つ取得する**

## やったこと
Reactで開発しており、全てのデータを取得してからstateを更新したかった。  => `Promise.all`を使った

```javascript
firebase
  .db
  .ref("User's data")
  .once('value')
  .then(snapshot => {
    const dataObject = snapshot.val()
    // ["ID-DATA-ABCDE", "ID-DATA-FGHIJ"] にする
    const dataIds = Object.keys(dataObject)

    const promises = dataIds.map(v =>
      firebase
        .db
        .ref("data")
        .once('value')
    )
    
    // 全てのデータ取得が完了してからstateを更新する
    Promise.all(promises).then(v => {
      // [{"num": 3}, {"num": 5}]
      const data = v.map(snapshot => snapshot.val())
      this.setState({
        data
        loading: false
      })
    })
  })
```

これでやりたかったことは実現できました。

`const promises`も`Promise.all`も`.then`の外にだせる気もするんだけどjavascript力が弱い...
SpriteKitのGameSceneでUIViewControllerを操作する。

# Q.
##### SpriteKitのGameScene内でUIViewController使いたいんだけど
``.present``とかでUIViewを表示したい時って結構あるはず
今回はMFMailComposeViewController(メール作成画面)を出そうとして結構苦労したのでメモ

# A.
##### rootViewControllerを使おう
```swift
   
let currentViewController : UIViewController? = UIApplication.shared.keyWindow?.rootViewController!
```
現在の画面がcurrentViewController(変数名は任意)としてUIViewController?型で定義されるので``.present``使えるようになる

###つまりUIViewが表示できるようになる

## 例) メール作成画面を開く
```swift
import SpriteKit
import GameplayKit
import MessageUI

class GameScene: SKScene , UITableViewDelegate, UITableViewDataSource, MFMailComposeViewControllerDelegate {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if dont_touch_display {
            return
        }
        sendmail()

    //-- ここからメール送信--//
    var mailViewController = MFMailComposeViewController()
    let currentViewController : UIViewController? = UIApplication.shared.keyWindow?.rootViewController!
    
    @IBAction func sendMail() {
        //メールを送信できるかチェック
        if MFMailComposeViewController.canSendMail()==false {
            print("Email Send Failed")
            return
        }
        
        let mailViewController = MFMailComposeViewController()
        let toRecipients = ["XXXX@gmail.sampledomainX"]
        
        mailViewController.mailComposeDelegate = self
        mailViewController.setSubject("メールの件名")
        mailViewController.setToRecipients(toRecipients) //Toアドレスの表示
        mailViewController.setMessageBody("メールの本文", isHTML: false)
        currentViewController?.present(mailViewController, animated: true, completion: nil)
    }
    
    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
    
        if result == MFMailComposeResult.cancelled {
            print("メール送信がキャンセルされました")
        } else if result == MFMailComposeResult.saved {
            print("下書きとして保存されました")
        } else if result == MFMailComposeResult.sent {
            print("メール送信に成功しました")
        } else if result == MFMailComposeResult.failed {
            print("メール送信に失敗しました")
        }
        currentViewController?.dismiss(animated: true, completion: nil) //閉じる

    }
```

### 参考リンク
http://www.swift-study.com/mfmailcomposeviewcontroller-basic/
https://stackoverflow.com/questions/37366763/how-can-i-dismiss-a-viewcontroller-from-my-gamescene-swift
【Gas】GoogleHomeで有料版Gsuiteのカレンダーを読み上げるごり押し方法

#経緯
![download.jpg](https://qiita-image-store.s3.amazonaws.com/0/237388/1e8a0996-f17c-e87f-fe09-67597f7b9b0f.jpeg)

会社の上司がGoogleHomeMiniを購入したが自分のカレンダーの予定が読み上げてくれないんだけど！！！設定に来てくれない？？と呼び出されました。
設定画面を見ても全然カレンダーが出てこないので色々と検索してみた結果・・・

https://webnetforce.net/g-suite/
**どうやら有料版のGsuiteの予定は読み上げてくれないらしい。**

2017年11月27日の情報なのでもしかしたら今は読み上げてくれるかもしれない・・・。


#じゃあどうしたの？
gasに頼って読み込むことのできるカレンダーに全部コピーしちゃえばいいんじゃね？
企業用の有料アカウントのスケジュールを無料のGmailアカウントのカレンダーにコピーするだけ！！！！
**これで読み上げてくれるはずだよね！！！**
なので無料のGmailアドレスが必要になってくるのでご注意ください。
ただスケジュールを完全に持ってきてしまうので、コピペ専用のアカウントがあると混ざらなくて済むかもしれない？


#コードとかスプレッドシートの中身
こんなスプレッドシートを用意します。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/237388/ddac9b80-1392-8f04-f45b-44972380bf22.png)
取得開始日と取得する月数を設定できるようにしてみました。
あまりにもカレンダーが多い人は取得月数を少なくしないとGasの実行制限（6分？）に引っかかって途中で死ぬかもしれないので調整してください。



```java
function Getcalendar(){
  var getsheet = SpreadsheetApp.getActiveSheet();
  var getcal = CalendarApp.getCalendarById("コピー元のGmailアドレス");

  var writecal = CalendarApp.getCalendarById("コピー先のGmailアドレス");
  if(getsheet.getRange("D2").getValue() !== ""){
    DeleteEvent(getsheet,writecal);
  }
  var nowdate = new Date(getsheet.getRange("G1").getValue());
  var afterdate = new Date(nowdate);
  afterdate.setMonth(afterdate.getMonth()+getsheet.getRange("G2").getValue());
  afterdate.setDate(afterdate.getDate() + 1);
  
  var myevent = getcal.getEvents(nowdate,afterdate);
  var myeventcontents = [[]];
  var cnt = 0;
  for(var i = 0; i <myevent.length;i++){
    myeventcontents[0][0] = myevent[i].getTitle();
    myeventcontents[0][1] = myevent[i].getStartTime();
    myeventcontents[0][2] = myevent[i].getEndTime();
    var setevents = writecal.createEvent(myeventcontents[0][0],myeventcontents[0][1],myeventcontents[0][2]);
    myeventcontents[0][3] = setevents.getId();
    getsheet.getRange("A" + (i+2) + ":D" + (i+2) ).setValues(myeventcontents); 
  }
}

function DeleteEvent(getsheet,delcal){
  var delevents = [[]];
  Logger.log(delcal);
  delevents = getsheet.getRange("D2:D" + getsheet.getLastRow()).getValues();
  for(i=0;i<delevents.length;i++){
    var delid = delcal.getEventById(delevents[i]).deleteEvent();
  }
  getsheet.getRange("D2:D" + getsheet.getLastRow()).clear();
}
```
#つかいかた
1．有料版のほうのGmailアドレスで新規のスプレッドシートの作成
2．スプレッドシートのG1に取得開始日を入力
3．G2に何か月取得するか数字を入力
4．スプレッドシートからスクリプトエディタを開いて上記のスクリプトをコピペ
5．アドレスの入力する。
6．スクリプトのトリガーを毎晩走るように設定する。

#注意点
当方GoogleHomeを所持していないのでどんな風にスケジュールを読み上げるのか知りません。
そのため日時とタイトルしか取得しないようにしています。
もしタイトルすらこぴってくるのが企業のコンプラ的にNGであればgetTitle()の所を以下のように書き換えてもらえればタイトルがすべて予定ありに書き換わります。
myeventcontents[0][0] = "予定あり";
くどいようですが、当方GoogleHomeを所持していないのでどんな風に読み上げられるか、連携されるのかがわかっていないので使用に関しては完全に自己責任でお願い致します。
どんな被害を被っても私は責任はとりません。
あと細かいバグがあるかもしれないのでなんかバグったら教えてください。頑張ってつぶします。


#最後に
記事を調べていたらどうにもGoogleHomeだと読み上げられないけどアレクサとかなら有料版の物でも読み上げてくれるとかなんとか。
~~あれ？アレクサ買えば解決じゃ・・・・・・・・・・~~

あとコードについても自分の知識をフル稼働して作っていますが、無駄がかなり多いと思いますので添削大歓迎です。
むしろお願いします。

あと、こいつを持っていったらそこまでするぐらいならいいやと言われて無駄になったマクロちゃんです。
誰か供養してやってください。

つたない文章でしたがありがとうございました。
C > 配列の中から一番近い値を探索 (double型) > v0.1

```txt:動作環境
C++ Builder XE4
```

### 背景

- C++ BuilderにてTDateTime型(double型として)で近い値の要素を取得
- 二分探索でやってみよう

### 情報

そもそも自前実装でなく、すでにあるのでは?

- https://cpprefjp.github.io/reference/algorithm/binary_search.html
    - 二分探索
    - 戻り値がbool型であり、インデックスは分からない

自前実装しよう。

- https://en.wikibooks.org/wiki/Algorithm_Implementation/Search/Binary_search
    - 様々な言語での実装
    - C実装を参考にした
    - ただし、こちらはint型での探索でありdouble型ではない
        - double型へは自分で検討した

### 実装 v0.1

C++向けであるが、Cとして実装してみた。
(組込みでも使う?)

- https://ideone.com/BFUgOE

```c
#include <stdio.h>

int BinarySearch(double *vals, int size, double ref);

int main(void) {
	// list to be searched (sorted)
	double vals[] = { 2.718, 3.14, 6.022, 10.23 };
	int size = sizeof(vals)/sizeof(vals[0]);

    // list where each value is searched
	double chks[] = { 2.0, 3.13, 3.14, 3.15, 15.0 };
	int num = sizeof(chks)/sizeof(chks[0]);

	for(int idx=0; idx<num; idx++) {
		int pos = BinarySearch(vals, size, chks[idx]);
		if (pos >= 0) {
			printf("pos = %d, %f for %f\n", pos, vals[pos], chks[idx]);
		} else {
			printf("not found for %f\n", chks[idx]);
		}
	}
	return 0;
}

int BinarySearch(double *vals, int size, double target) {
	int start = 0;
	int end = size - 1;
	int mid;
	
	if (target < vals[start] || target > vals[end]) {
		return -1;
	}

	while (start <= end) {
		mid = (start + end) / 2;
		if (mid == (start+1) && (target >= vals[start]) && (target < vals[mid])) {
			return start;
		} else if (target < vals[mid]) {
			end = mid - 1;
		} else {
			start = mid + 1;
		}
	}
	
	if (end < start) {
		return end;
	}
	return start;
}
```

動作例

`{ 2.718, 3.14, 6.022, 10.23 }`に対して

```
not found for 2.000000
pos = 0, 2.718000 for 3.130000
pos = 1, 3.140000 for 3.140000
pos = 1, 3.140000 for 3.150000
not found for 15.000000
```

### 備考

それっぽいのはできた。

変数名が適当なので、実際に使う時にもう少し検討

### そもそも

C++またはC++ Builderのライブラリで目的の動作となる関数がライブラリにあるのでは?

それを見つけられていない。

### 関連

Delphi実装で見つけたのは以下

- [Searching nearest value in sorted array](http://www.delphipages.com/forum/showthread.php?t=22832)
Ecto.Repo.transaction/3 は入れ子にできる

~~PostgreSQL でのみ確認。他は分からない。~~

[公式ドキュメント](https://hexdocs.pm/ecto/3.0.6/Ecto.Repo.html#c:transaction/2)に書いてあった...

>If transaction/2 is called inside another transaction, the function is simply executed, without wrapping the new transaction call in any way. If there is an error in the inner transaction and the error is rescued, or the inner transaction is rolled back, the whole outer transaction is marked as tainted, guaranteeing nothing will be committed.

しかも、内側のトランザクションの失敗も考慮してくれるらしい。便利。

```elixir
Repo.transaction(fn ->
  Repo.transaction(fn ->
    Ecto.Adapters.SQL.query!(Repo, "INSERT INTO ...")
    raise "ERROR!"
  end)
end)
```

このときの debug ログは以下:

```
05:19:47.008 [debug] QUERY OK db=0.1ms
begin []
 
05:19:47.009 [debug] QUERY OK db=0.4ms
INSERT INTO ...
 
05:19:47.010 [debug] QUERY OK db=0.4ms
rollback []
** (RuntimeError) ERROR!
    (stdlib) erl_eval.erl:675: :erl_eval.do_apply/6
    (ecto_sql) lib/ecto/adapters/sql.ex:787: anonymous fn/3 in Ecto.Adapters.SQL.checkout_or_transaction/4
    (db_connection) lib/db_connection.ex:734: DBConnection.transaction/3
    (ecto_sql) lib/ecto/adapters/sql.ex:787: anonymous fn/3 in Ecto.Adapters.SQL.checkout_or_transaction/4
    (db_connection) lib/db_connection.ex:1341: DBConnection.run_transaction/4
```

見ての通り、`Ecto.Repo.transaction/2` を入れ子にしても、発行される `BEGIN`... は外側のひとつだけ。

`Ecto.Multi` で処理をまとめるときに、前段の処理結果を参照するために Multi の名前が決め打ちになるので悩んでたけど、複数の Multi に分割して、`Ecto.Repo.transaction/3` の関数内で実行してやるので良さそう。

```elixir
Repo.transaction(fn ->
  with {:ok, %{create_user: user}} <- Repo.transaction(create_user_multi),
       friend_requests_multi = build_friend_requests_with_user(user),
       {:ok, %{friend_requests: friend_requests} <- Repo.transaction(friend_requests_multi) do
    ...
  else
    error ->
      handle_transaction_error(error)
  end
end
```
Linux で Web サービスをデスクトップアプリ風にする

Amazon Linux WorkSpaces (Amazon Linux 2) で Microsoft Teams を使いたかったのですが、Teams のアプリには Linux 版がありません:frowning2:

Linux 版のデスクトップアプリがない Web サービスは Chrome の app mode で表示するといい感じになります。

app mode で Chrome を起動するには `--app` オプションを指定するだけです。

```
google-chrome --app=https://teams.microsoft.com
```

これで、ツールバーなしでウィンドウが表示されます。

![misc (2).png](https://qiita-image-store.s3.amazonaws.com/0/63688/4ff570e6-c632-0337-3bcb-167abab1a37d.png)

app mode では、ウィンドウリストのアイコンとして Web サイトのアイコンが勝手に使われます。単に別ウィンドウで表示するより、app mode で表示した方がどのウィンドウがどのサービスなのか識別しやすいです。

ちなみに、Chrome App Builder で Kiosk アプリを作って試してもみたのですが、 Teams の場合、ページの下側が切れてしまい、ダメでした:neutral_face:
Djangoのforms.pyのフォームバリデーションのメソッド内でidを取得

#　環境
- Django2.1

# idを取得
編集フォームでのバリデーショでidが必要になることがある。
idを取得するには[バリデーションのメソッド内](https://qiita.com/not_over_9/items/df546fdacc304f3b1c63)で
`self.instance.id`
で取得できる。

フォーム内に編集するデータのidを隠しておく必要もない。

```python:forms.py
from django.forms import ModelForm, ValidationError


class NewsEditForm(ModelForm):
    class Meta:
        model = News
        fields = ('title', 'slug')

    def clean(self):
        cleaned_data = super(NewsEditForm, self).clean()
        existing = News.objects.filter(
            ...
        ).exclude(
            id=self.instance.id
        ).exists()

        if existing:
            raise ValidationError({
                'error': ['エラーメッセージ']
            })
        return cleaned_data
```
pkg upgrade したら timed out で失敗する件

忘れないうちにメモ。

# はじめに
FreeBSD 12.0-RELEASEが公開されたということで、[FreeBSD 11.2 を FreeBSD 12.0 に更新](https://qiita.com/psaxuww/items/4f14414999fc1b31ca11) を参考にアップグレード作用していたら、困ってしまった話。

あれ、以前も似たような話がありましたね。([Firewallを入れ替えたらfreebsd-updateが失敗する件](https://qiita.com/hachiman8/items/b14ede8dcea56516fc64))

昔の自分に助けられて、作業を続けていたら、また止まってしまいました。

```
# pkg upgrade -y
(省略)

Number of packages to be installed: 5
Number of packages to be upgraded: 82
Number of packages to be reinstalled: 69

The process will require 22 MiB more space.
27 MiB to be downloaded.
pkg: http://pkg.FreeBSD.org/FreeBSD:12:amd64/quarterly/All/icu-63.1_1,1.txz: Operation timed out

```

こんな感じに。


# 結論
FETCH_TIMEOUTを増やせば多分大丈夫です。
デフォルトは30秒になっていまます。

試しにcurl で直接ダウンロードすると、48秒かかりました。

以下コメントアウトを外し、180に書き換えれば無事作業は完了しました。(念のため余裕を持って180秒に設定)

```
/usr/local/etc/pkg.conf:
#FETCH_TIMEOUT=30
```

実は、[以前の件](https://qiita.com/hachiman8/items/b14ede8dcea56516fc64)もこれで解決できたのでしょうか? あとで確認したい。
VirtualBoxにubuntuをインストール

# VirtualBoxでWindowsにLinuxの開発環境を用意

手順は、
- 仮想マシンの実行環境(Virtual Box)の用意
- 仮想マシンを作成して、Linuxをインストール
## 目的(この説は手順のメモには無関係)

Linuxマシンが必要か、というのにはいつも少し考えます。もう古いし、windows便利だし、windowsでしかできないこと(power point とか)もあるし。

- 本当に開発環境としてlinuxが必要か？
-- emacs + C/C++/python, cmake/ipython という非常に保守的な環境でプログラムしてます
-- git はまぁ普通に使います。
-- raspi 使っているので、勝手に立ててるサーバとの通信とか。
-- tex を使っていました。（もうやめようと思います）


## 準備

以下をダウンロードしました。

- [VirtualBoxのページ](https://www.virtualbox.org/wiki/Downloads)からダウンロードします。VirtualBox-6.0.0-127566-Win.exe を頂きました。
- ubuntuのページからインストールのディスクイメージ(*.iso)のファイルをダウンロードします。ubuntu-18.04.1-desktop-amd64.iso を頂きました。

## 作成

- Oracle Virtual Box Manager を立ち上げます。「新規」で仮想マシンの設定をします。仮想マシンのファイルを置くフォルダはデフォルトのまま、メモリとHDのサイズは大きめにしました。
- 作成したマシンを「開始」（違ったかな）すると、最初はディスクイメージを要求されたので、ダウンロードした*.iso を指定します。あとは、仮想マシン内で通常のlinux のインストールが進みます。
- 流れに従うとインストールが進み（普通にlocal, keyboard は日本）、再起動します。エンターキーを指示に従って押しましょう。
- ubuntu に普通にログインできました。

はまりポイント

- 再起動したつもりが止まっていた。"Remove installation disk and press enter"のようなメッセージが出ているのをずっと無視していました。1時間くらい待っていたかな。あほや。

とりあえず以上です。手順としてVMWare のときと同じでした。この後、いろいろあると思いますが。
メルカリの出品画像用に「専用」とかのバッジ合成してくれるLINE Bot作ってみた

<img width="375" alt="IMG_3123.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/164153/0757b650-13a4-0a81-0de5-13ed041395a0.png">

妻がメルカリにはまっており、年末の大掃除で相当数メルカリに出したのですが「だれそれさん専用」みたいな画像作るのがめっちゃめんどくさいとのことでLINE Botで出来るようにしてみました。

# 使い方

https://line.me/R/ti/p/%40xvu3291f から友達追加します。もしくは以下のQRコードから。

![download.png](https://qiita-image-store.s3.amazonaws.com/0/164153/d3d2037f-be03-21e1-f2fd-190296d87e4b.png)

<img width="375" alt="IMG_3131.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/164153/50a933f5-0c4f-24e3-50af-3b106544d065.png">

「画像を選択」をタップしてアルバムを開きます。

<img width="375" alt="IMG_3133.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/164153/aa89e452-3543-51a9-666b-b75c441e7a4c.png">

送信。複数枚同時も可能。

<img width="375" alt="IMG_3134.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/164153/80890201-cf8e-1fdd-9c5f-53eb80471762.png">

「専用」のバッジが追加された画像が返送されてくるのでタップ後、右下のダウンロードボタンをクリックすれば保存完了。

<img width="375" alt="IMG_3123.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/164153/0757b650-13a4-0a81-0de5-13ed041395a0.png">

文字を変えたい時は下部の「♪文字の変更はこちら♪」をタップすると変更できます。

<img width="375" alt="IMG_3124.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/164153/dc3bef9a-c094-94d8-1f21-7b47405a007c.png">

他にも追加して欲しい文字等ありましたらフォームからお願いします。

# 技術

* Python 3.6
* Pillow
* Flask
    * flask_bootstrap
* Redis
* LINE Messaging API
    * Flex Message
* LIFF
* Rich Menu API

# ソースコード
https://github.com/stachibana/mercari-bot

# まとめ

Clova多めの2018年だったので色々忘れてましたがやっぱりLINE Bot便利です。ご興味があれば。
https://developers.line.me
railsでbootstrapの導入。2019年　１月８日　自分メモ


まずGemfileを編集しinstallする。


```.rb
#gemfile

gem 'bootstrap', '~> 4.2.1'
gem 'jquery-rails'
```


```.rb
#ターミナル

$ bundle install
```

application.css ファイルを application.scss にリネームする(拡張子変更)
↓

編集したapplication.scssファイルを編集

```application.scss
@import bootstrap
```

application.jsファイルを編集

```application.js
//= require jquery3
//= require popper
//= require bootstrap-sprockets
```
JavaScript: クロージャーでメモ化してくれる関数を作ってみた

メモ化っていまいちよくわかっていなかったが、「[クロージャを使ってメモ化](http://blog.h13i32maru.jp/entry/20100924/1285346166)」を読んで初めてピンときたので、自分でわかるようにES6で書いてみました。

# まずは普通に
メモ化してないバージョンのフィボナッチ数列と階乗です。

```js
//フィボナッチ数列
const fibo = n =>
  (n === 0)? 0
  : (n === 1)? 1
  : fibo(n-1) + fibo(n-2)

//階乗
const facto = n =>
  (n === 0)? 1
  : (n === 1)? 1
  : n * facto(n-1)
```
# メモ化した

```js:
//フィボナッチ数列
const fibo2 = (
  () =>{
    const memo = [0,1]
    const a = n =>
      (n >= memo.length)? memo[n] = a(n-1) + a(n-2)
      : memo[n]
    return a
  }
)()

//階乗
const facto2 = (
  () =>{
    const memo = [1,1]
    const a = n =>
      (n >= memo.length)? memo[n] = n * a(n-1)
      : memo[n]
    return a
  }
)()
```
memoには最初初期値のみが入っていて、memo[n]がなかったら再帰的に計算してmemo[n]に代入しつつ返し、memo[n]があればそれを返す、という作戦です。


# メモ化してくれる関数
上のふたつを比べると、初期値と再帰的に計算してる部分が違うだけなので、初期値を inits 、計算規則を rule として引数にくくりだしてみます。

```js:
const memoizer = inits => rule =>{
  const memo = [...inits]
  const a = n =>
    (n >= memo.length)?  memo[n] = rule(a)(n)
    : memo[n]
  return a
}
```
これを使うとそれぞれこうなります。

```js:
//フィボナッチ数列
const fibo3 = memoizer([0,1])( a => n => a(n-1) + a(n-2) )

//階乗
const facto3 = memoizer([1,1])( a => n => n * a(n-1) )
```
それぞれ,
$ a_{0}=0,a_{1}=1,a_{n}=a_{n-1}+a_{n-2} $
や
$ a_{0}=1,a_{1}=1,a_{n}=n  a_{n-1} $
に、見えてきません? 
こうしておくと、初期値と漸化式で表わされる数列が簡単にメモ化して使える。便利かも。
# 追記：非再帰版

```js:
const memoizer = inits => rule =>{
  const memo = [...inits]
  const a = n => {
    if(n >= memo.length) {
      for(let i = memo.length; i <= n; i++) {
        memo[i] = rule( a )( i )
      }
    }
    return memo[n]  
  }
  return a
}
```