OmniAICreator/Qiita-1.07M huggingface dataset:
slice のメモリ容量比較サンプル

## このページについて

go でよく話題に上がるsliceで事前に容量を渡す場合とそうでない場合で
どの程度パフォーマンスに差分があるか簡単に見れるように試してみました。


## 内容

**サンプルコード**

```go:main.go
package slices

func AllocationSlice(from []string, to []string) {
	for _, item := range from {
		to = append(to, item)
	}
}
```

**ベンチマークコード**

```go:main_test.go
package slices

import "testing"

func StrSlice(num int) []string {
	re := make([]string, num, num)
	for idx, _ := range re {
		re[idx] = "a"
	}
	return re
}

func BenchmarkAllocationSlice(b *testing.B) {
	type args struct {
		from []string
		to   []string
	}
	tests := []struct {
		name string
		args args
	}{
		{
			name: "pre_alloc_100",
			args: args{
				from: StrSlice(100),
				to:   make([]string, 0, 100),
			},
		},
		{
			name: "no_alloc_100",
			args: args{
				from: StrSlice(100),
				to:   []string{},
			},
		},
		{
			name: "pre_alloc_500",
			args: args{
				from: StrSlice(500),
				to:   make([]string, 0, 500),
			},
		},
		{
			name: "no_alloc_500",
			args: args{
				from: StrSlice(500),
				to:   []string{},
			},
		},
		{
			name: "pre_alloc_1000",
			args: args{
				from: StrSlice(1000),
				to:   make([]string, 0, 1000),
			},
		},
		{
			name: "no_alloc_1000",
			args: args{
				from: StrSlice(1000),
				to:   []string{},
			},
		},
		{
			name: "pre_alloc_3000",
			args: args{
				from: StrSlice(3000),
				to:   make([]string, 0, 3000),
			},
		},
		{
			name: "no_alloc_3000",
			args: args{
				from: StrSlice(3000),
				to:   []string{},
			},
		},
	}
	for _, tt := range tests {
		b.Run(tt.name, func(b *testing.B) {
			b.ResetTimer()
			for i := 0; i < b.N; i++ {
				AllocationSlice(tt.args.from, tt.args.to)
			}
		})
	}
}

```

**結果**

```
goos: darwin
goarch: amd64
BenchmarkAllocationSlice/pre_alloc_100-8                10442223               114 ns/op               0 B/op          0 allocs/op
BenchmarkAllocationSlice/no_alloc_100-8                   933322              1261 ns/op            4080 B/op          8 allocs/op
BenchmarkAllocationSlice/pre_alloc_500-8                 2157058               547 ns/op               0 B/op          0 allocs/op
BenchmarkAllocationSlice/no_alloc_500-8                   304494              4070 ns/op           16368 B/op         10 allocs/op
BenchmarkAllocationSlice/pre_alloc_1000-8                1000000              1076 ns/op               0 B/op          0 allocs/op
BenchmarkAllocationSlice/no_alloc_1000-8                  168874              7100 ns/op           32752 B/op         11 allocs/op
BenchmarkAllocationSlice/pre_alloc_3000-8                 362504              3205 ns/op               0 B/op          0 allocs/op
BenchmarkAllocationSlice/no_alloc_3000-8                   33088             35524 ns/op          178801 B/op         15 allocs/op
PASS
ok      github.com/smith-30/gopg/slices 13.624s
```

## まとめ

場合によっては、速度に10倍以上差が出るので細かいところだけど気を使っていきたい
MovableTypeやWorsPressから学んだDB構造を活かしたサイト構築

WordPressのサイト構築機能とMovableTypeのユーザー(Author管理)をPHPのPearによるログイン管理を利用してモバイルからの投稿、FacebookやInstagram更にYoutubeのリンクコピーを埋込データに変換してサイトを運用出来る様に作ってみました。
Qiitaに前回投稿した例のようにホームページに簡単にシェアー出来る様にすることを目的に開発していましたが、各SNSサイトの仕様が変わらなければとりあえず簡単に埋め込む事ができました。
各SNSサイトの投稿でシェアー可能な投稿はご存じのようにiframeで埋め込めるのですが良識で判断する必要はあると思います。
![スクリーンショット 2019-11-17 15.23.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/c933eb7e-df5d-0c57-0d5f-1d3194495538.png)
facebookの投稿のシェア->その他オプション->コピーでリンクがコピーされます。それを下記の様にPHPでifarameにて表示する。＄widと＄hei任意で設定デバイスの種類を検知して設定するとよい。
```php:php
<iframe src="https://www.facebook.com/plugins/post.php?href='.urlencode(facebookのコピー).'&width=250" width="'.$wid.'" height="'.$hei.'" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowTransparency="true" allow="encrypted-media"></iframe>
```
jetbotインストールSDカード利用時にaptできないときの対処

# サマリ
大容量のmicroSDカードが何枚もないので、jetbotの設定をしているmicroSDカードにいろいろなモジュールを入れたい。しかし、apt installするとエラーで落ちた。
**apt-daily系のsystemdのunitをmaskすることで解消した。**

おそらく、jetbotに限らず、developer kitやjetcardでも同じ事象が起きそう。


※過去の業務ではSysVinitユーザーであり、systemd初心者でだったので、色々と勉強しながら行ったのでそれらの備忘も兼ねます。

# 結論
systemdに登録されている下記4unitをmaskする。

```
$ sudo systemctl mask apt-daily.service
$ sudo systemctl mask apt-daily.timer
$ sudo systemctl mask apt-daily-upgrade.service
$ sudo systemctl mask apt-daily-upgrade.timer
```

上記でもエラーが発生する場合、lockファイルも削除する。

```
sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock
```

# 当時の状況

### apt install XXXすると下記のエラーが表示される。

```
E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)
E: Unable to lock directory /var/lib/apt/lists/
```

そこで、結論にあるsystemdのunitをmaskするとエラーが解消した。

mask実行前後の状態は下記コマンドで確認した。

```
$ systemctl list-units | grep apt
```

実行前はいくつかgrepにかかったが、実行後は何も引っかからない。


### dpkgのlockのエラーも引く

状態によっては、systemdのunitをmaskした後でも下記エラーを引く時があった。

```
E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
```

単純にlockファイルが邪魔しているだけなので、結論の下部のコマンドを実行してlockファイルを削除してあげるとエラーが解消する。

# 備忘

## systemdとは
SysVinitの代わりに利用されるようになった起動処理システム。

### 主な違い

最初に覚えられず何度も参照したこと3選。

- 格納パス

/etc/init.d/XXX　→　/etc/systemd/system/XXX.service

- chkconfig

chkconfig --list　→　systemctl list-unit-files -t service

- service

service XXX status　→　systemctl XXX status

### 学びが多かったサイト集
- [「Systemd」を理解する](http://equj65.net/tech/systemd-boot/)
- [Systemdを用いた自動起動の良いサンプル](https://qiita.com/tkato/items/6a227e7c2c2bde19521c)
- [CentOS7系と6系のコマンドの違い](https://qiita.com/shotaTsuge/items/9f337bad9f73c3953af1)

# apt-daily系のunit

自動アップデート/アップグレード系のunit。
本記事内では、それを解除している。
定期的に手動実行やらservice登録することを忘れないこと。
CoreText でルビを付けたら謎の挙動をした

ルビ付きのテキストをいい感じに表示させたくて色々試していたところ謎の挙動を発見したのでメモ

行をまたぐルビ付きのセグメントの処理が CoreText は該当するセグメント全体を次の行に送るように処理するようになっていて、その挙動自体自体は問題ないのですが後続する行の内容によって行を送る処理が発生したりしなかったりするようです

原因を探ろうと発生する/しないを切り分けてみたところ、以下のように後続する行に付くルビが短いと該当の処理が発生しないようでした

<img width="375" alt="Simulator_Screen_Shot_-_iPhone_11_Pro_-_2019-11-17_at_15_11_06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12653/1a34609e-624e-84d6-7554-d2f90a20baee.png">

(ちなみに該当の行と後続する行との間には別の行が挟まっても同様の挙動をします)

解決しようと、いくつか思いつく手法を試してみましたが、結局 straightforward に解決することは断念し、
文字と glyph の対応関係は CoreText から取得できるので、ルビ付きのセグメントが行をまたいでいる場合は手動で改行を挟むようにすることで対応しました。

再現用のミニマムなプロジェクトを [上げておきます](https://github.com/funnything/CoreTextRubyIssue)
Linuxでユーザーを追加する

何も考えずただユーザーを追加する方法です
#コンソールでこの通りに実行しよう
今回は一般ユーザーがaliceというユーザーを追加します。

```bash
~$ sudo useradd -D -s /bin/bash
~$ sudo useradd -m -k alice
~$ sudo passwd alice
```

以上のコマンドで`/home/alice`をホームディレクトリにもつ一般ユーザーのaliceが作られます。

ちなみにユーザーをaliceに切り替える場合には以下のコマンドを実行します。

```bash
~$ su alice
```
ユーザーを変更してもカレントディレクトリは変わらなので、オプション無しの`cd`コマンドでホームディレクトリに移動することをおすすめします。

##かんたんな解説
一行ずつ解説します。
###ログインシェルの設定
1行目でuseraddの設定ファイルのログインシェルをshからbashに変更しています。これは無くてもいいですがあえてシェルをshにする必要もないのでやっときましょう。一回やったら以降のユーザー追加では必要ないです。
###ユーザーの作成
次に2行目で新規ユーザーaliceを作成しています。-mで/home/にホームディレクトリを作成しています。-kは/home/alice/に/etc/skel/をコピーします。僕は/etc/skel/は空っぽなので無くてもいいですが、そこんとこきっちり整備してある企業とかがあると聞きます。コマンドの意味だけでも知っといて損はないでしょう。
###パスワードの設定
最後に3行目で新規作成したユーザーのパスワードを設定しています。`useradd -p`でもユーザー作成時にパスワードを設定できるのですが、暗号化したパスワードを入力しなきゃいけないのできっついです。
dockerでhanami

hanami(1.3.3)をインストールしようとすると

```
% docker-compose build                                                                      (master #%) [~/develop/chat-memo]
db uses an image, skipping
Building app
Step 1/8 : FROM ruby:2.6.5
 ---> d98e4013532b
Step 2/8 : RUN apt-get update -qq && apt-get install -y nodejs mariadb-client
 ---> Using cache
 ---> a78142bbe439
Step 3/8 : RUN mkdir /chat-memo
 ---> Running in e0eb9d958b18
Removing intermediate container e0eb9d958b18
 ---> 9d9a0fd16da0
Step 4/8 : WORKDIR /chat-memo
 ---> Running in 7f4da86a7bc3
Removing intermediate container 7f4da86a7bc3
 ---> e8f1bfd1e331
Step 5/8 : COPY Gemfile /chat-memo/Gemfile
 ---> 7037872d4424
Step 6/8 : COPY Gemfile.lock /chat-memo/Gemfile.lock
 ---> 50102ed83eae
Step 7/8 : RUN bundle install
 ---> Running in 1031b7632c10
Fetching gem metadata from https://rubygems.org/............
Fetching gem metadata from https://rubygems.org/..
Resolving dependencies...
Bundler could not find compatible versions for gem "dry-types":
  In snapshot (Gemfile.lock):
    dry-types (= 0.12.3)

  In Gemfile:
    hanami (~> 1.3) was resolved to 1.3.3, which depends on
      hanami-validations (>= 1.3, < 3) was resolved to 1.3.5, which depends on
dry-validation (~> 0.11, < 0.12) was resolved to 0.11.2, which depends
on
          dry-types (~> 0.12.0)

    hanami-model (~> 1.3) was resolved to 1.3.2, which depends on
      dry-types (~> 0.11.0)

Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
ERROR: Service 'app' failed to build: The command '/bin/sh -c bundle install' returned a non-zero code: 6
```

というエラーになる。どうやら`hanami-validations`と`hanami-model`が依存している`dry-types`のバージョンが異なるらしい。ので`~> 0.11.0`をあらかじめ指定したらうまくいった。
MySQLのコマンドまとめ

##データベースの確認
```
SHOW DATABASES;
```

##データベースの作成
```
CREATE DATABASE データベース名;
```

##データベースを指定
```
USE データベース名
```

##テーブルを作成
```
CREATE TABLE テーブル名 (カラム名1 カラム型,カラム名2, カラム型,カラム名n, カラム型);
```

##テーブルを確認
```
SHOW TABLES;
```

##テーブルのカラムを確認
```
DESC meibo;
```

##テーブルにデータを挿入
```
INSERT INTO テーブル名 (カラム名1, カラム名2, ...) VALUES (値1, 値2, ...); 
```

##テーブルのデータを検索して表示(全カラム)
```
SELECT * FROM テーブル名; 
```

##必要なカラムのデータのみ抽出
```
SELECT カラム名1, カラム名2, ..., カラム名n FROM テーブル名; 
```

##条件を指定してデータを表示(WHERE句を用いる）
```
SELECT * FROM テーブル名 WHERE カラム >= 値;
```

##データを更新する
```
UPDATE テーブル名 SET カラム名1 = 値1, カラム名2 = 値2, ..., カラム名n = 値n WHERE 条件文; 
```

##データを削除する
```
DELETE FROM テーブル名 WHERE 条件文; 
```
NumPyのユニバーサル関数

ユニバーサル関数とはndarray配列の各要素に対して演算した結果を返す関数のこと

引数が1つの関数

・要素の絶対値を返すnp.abs()
・要素の ee (自然対数の底)のべき乗を返すnp.exp()
・要素の平方根を返すnp.sqrt() など

引数が2つの関数

・要素同士の和を返すnp.add()
・要素同士の差を返すnp.subtract()
・要素同士の最大値を格納した配列を返すnp.maximum() など
Vimiumの設定を晒す

##Vimiumとは
ブラウザ上でvim風の操作を可能にする拡張機能です。
私はChromeで使っていて、他にも主要なモダンブラウザでは大体サポートされています。
普段Vimを使っていない人にもおすすめ。

##私の設定ファイル
設定ファイルの内容を公開します。
かなりカスタマイズしているので、もはやVimとかあんまり関係無くなってます。
####Excluded URLs and keys
```
https?://mail.google.com/*                  #gmailで無効化
https?://us-east-1.console.aws.amazon.com/* #awsで無効化
```

####Custom keymappings
```　
unmapAll #デフォルトの設定を解除する
map ? showHelp #ヘルプを表示

map j scrollDown            #下に移動
map k scrollUp              #上に移動
map h previousTab           #左のタブに移動
map l nextTab               #右のタブに移動
map gg scrollToTop          #最上部に移動
map G scrollToBottom        #最下部に移動
map t createTab             #新しいタブを開く
map nn removeTab            #タブを閉じる
map N restoreTab            #閉じたタブを復元
map p openCopiedUrlInNewTab #コピーした文字列、URLを別タブで開く
map yy copyCurrentUrl       #現在のページのURLをコピー
map d scrollPageDown        #画面半分下に移動
map u scrollPageUp          #画面半分上に移動
```

##おまけ

[Long Press New Tab]([title](http://...))という別の拡張機能を使って、リンクをクリックした時に別タブで開くように設定しています。もともと「タップ」で同じタブで開くように設定しているので、使い分けができて便利です。
fish shellのlsコマンドの色を変更する

## はじめに
[fish shell](https://fishshell.com/ "fishshell")が結構便利なので使っているのですが、デフォルトのlsコマンドが激しく見づらいので色の変更方法をメモ
なおfish shellをインストールしたい方は以下のコマンドで

```shell
$ brew install fish
$ fish -v
```

## lsコマンドの色の変更方法
1.fishshell用の設定ファイルを作成

```
$ touch ~/.config/fish/config.fish
```

2.作成したファイルに下記コマンドを記述

```
export LSCOLORS=gxfxcxdxbxegedabagacad
```

3.終わり
shellを再起動してfishのlsコマンドを確認すると色がシアンになっている


## 色を変更したい場合
色を変更したい場合は"LSCOLORS"の最初の一文字を変更する
例えば緑にしたい場合は下記の様に記述する

```
export LSCOLORS=cxfxcxdxbxegedabagacad
```

使用可能な色は下記エントリ参考
[ls の結果に色をつける](http://nemoplus.hateblo.jp/entry/20090119/1232373540)

# 参考資料

 - [fishのディレクトリの色が見にくい](http://gamenegi.seesaa.net/article/462996518.html)
 - [ls の結果に色をつける](http://nemoplus.hateblo.jp/entry/20090119/1232373540)
#Rails + #rspec : How to use "change" syntax with not_to condition Trick

One idea. use change syntax and expect "not to change".


# BAD

```rb
it do
  expect { subject }.to change { some }.to(true).and_not_to change {
    some.count
  }.by(0)
end
```

# GOOD

```rb
it do
  expect { subject }.to change { some }.to(true).and change {
    some.count
  }.by(0)
end
```


# Rspec の change 記法で not_to の否定文をチェーンできない or しづらいので無理やり肯定系で書いてみるのはいかが？




# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
np.arrayとnp.arangeの違い


arrayとarangeの違いをメモ
arrayの後ろにはリストがくる

```ruby:filename.rb
import numpy as np
np.array([1,2,3])
>>> 出力結果
array([1, 2, 3])
```
arrangeの後ろには数字を一つ指定し、その数字の個数分等間隔に増幅させた要素を作る。

```ruby:filename.rb
import numpy as np
np.arange(4)
>>> 出力結果
array([0, 1, 2, 3])
```
改行コードについて

#改行コードとは
改行を表す制御文字のこと。

#改行コードの種類

|改行コード名|意味|改行コード|OS|
|:---|:---|:---|:---|:---|:---|
|CR(Carriage Return)|復帰、カーソルを左端の位置に戻すこと|\r|Mac OS(9以前)|
|LF(Line Feed)|改行、カーソルを新しい行に移動すること、縦移動|\n|UNIX系全般|
|CRLF|カーソルを左端の位置に戻して改行すること|\r\n|Windows系全般|

# 動画でみるキャリッジリターン
タイプライターのキャリッジが文字を打つごとに移動し、最終位置になるとベルがなる。
キャリッジを元の位置に戻す動作がわかる。

【Typewriter - Brandenburger Symphoniker】
https://www.youtube.com/watch?v=nW8dGwa2zRw
macOSにAnacondaをインストールして、fishやzshなどの設定（2019）

## Anacondaのインストール
pythonは僕のメイン言語じゃないので、pyenvなどを省略（絶対使い方忘れるから）
condaのダウンロードは公式HPから：[https://www.anaconda.com/distribution/](https://www.anaconda.com/distribution/)

## 各種shellの設定
`conda init [shell]`を利用する。
### bash
```shell
/opt/anaconda3/bin/conda init bash
```
### zsh
```shell
/opt/anaconda3/bin/conda init zsh
```

### fish
```shell
/opt/anaconda3/bin/conda init fish
```

## 要注意
`conda init`はまだテストバージョンなので、バグが多い感じ
例えば、もし今のpathは`/opt/anaconda3/bin/`のままで、`conda init`を実行すると、次のようなエラーが出る（2019/11/17時点）。

```shell
- (line 1): 
begin; [y/N]:  
       ^
from sourcing file -
	called on line 61 of file /usr/local/Cellar/fish/3.0.2/share/fish/functions/eval.fish

in function 'eval'
	called on line 140 of file -

in function 'conda'
	called on line 145 of file -
	with parameter list 'activate base'

from sourcing file -
	called on line 6 of file ~/.config/fish/config.fish

from sourcing file ~/.config/fish/config.fish
	called during startup

Welcome to fish, the friendly interactive shell
```

ま、ターミナルを再起動したら治る。

## おまけに
実はfishのプロファイルに追加されたのは

```fish
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
eval /opt/anaconda3/bin/conda "shell.fish" "hook" $argv | source
# <<< conda initialize <<<
```
だけだ。
引数と戻り値の関係は、◯◯と◯◯だ。

#引数と戻り値ってなんだよ

数学とか高校で嫌いになった文系勢には、数って聞くだけで抵抗感あるわ...

関数に入れる値を引数、返ってくる値を戻り値っていうらしい。

#身近にある引数と戻り値は「消費税」

消費者としては、全然嬉しくない「消費税」だが教材としては身近にある優秀な例である。
2019年10月まで消費税は一律8%でした。
皆さんも普段から接してますよね。俺は払わないなんてできないんで、多分わかりやすい実例です。
100円の物を買うと108円になりますよね。これを敢えて式に起こすとこうなります。

```
100×1.08(+8%)=108円
```

これを関数化するならば、

```
X×1.08=1.08X
```
という式になりますよね。

この時、関数に入れるXは引数、1.08Xというのは戻り値になるわけです。

```
引数 ×　1.08 =　戻り値
```

ってなわけですな。
これはとてもわかりやすい。

#もっとわかりやすくしてくれ

飯食ったら、うんこになるだろう？
それくらいはわかるだろう。

関数っていうのはルールなんだ。
人間の体もルールに基づいてできている。
飯食ってうんこしない奴はいない。

```
飯　×　消化　=　うんこ
```

![名称未設定ファイル (56).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453260/3b741f26-0b9c-acf5-fe19-8eba9001e095.jpeg)


消化するっていう関数に、飯を入れたらうんこになるだろうってこと。
これならわかりやすい。小学生にでも伝わる。
コメントアウト（コメントブロック）を1文字加えたり消したりして楽に切り替える書き方


## はじめに

 * エディタやIDEの機能を使用して、コメントアウトをされている方や、イケている言語やデバッガをお使いの方には不要な知識だと思います。

 * PHPのコードで説明していますが、CやJavaScriptなどのように、「//」で１行のコメントアウト、「/* 〜 */」で複数行のコメントアウトができる言語であれば使えると思います。

 * もう少し「賢いやり方」を以前誰かに教えてもらった気がするのですが、忘れてしまいました。もしこの記事内容のような原始的なエディタで使えるテクニックをお持ちの方がいたら教えてください。

 * なお、複数行のコードをコメントアウトすることをコメントブロックと呼んでいます。

## コメントブロックの問題点

みなさんは、下記のようにコメントアウトされたコードがあり、コメントアウトを外したいとした場合（コメントを外した後、再度コメントアウトをし直したい場合）、エディタの機能に頼らずにどのようにしてコメントアウトを外しますか？

個人でデバッグしているようなコードだと、こういったシーンが多いと思うのですが、、、

少なくとも私が今している仕事では多い状態です。

```php
/*
echo "bfx 1";
echo count($fx);
foreach($fx as $val){
  echo count($val);
}
exit;
*/
```

脳死状態でやるのならば、単純に前後のコメントアウトを消せばよいでしょう。

```php
echo "bfx 1";
echo count($fx);
foreach($fx as $val){
  echo count($val);
}
exit;
```

しかし、これだと改めてコメントアウトしたくなった場合を想定すると何だか面倒な気がします。

## コメントブロックの改善点

では、どうするか。

コメントにしたりしなかったりを切り替えたいならば、こんなふうにコメントアウトしておくとよいのではないでしょうか？

```php
/*
echo "bfx 1";
echo count($fx);
foreach($fx as $val){
  echo count($val);
}
exit;
//*/
```

もし、コメントを外したくなったら…コメントアウトのはじめの/*を//*にすればコメントブロックが解除されます。

```php
//*
echo "bfx 1";
echo count($fx);
foreach($fx as $val){
  echo count($val);
}
exit;
//*/
```

また、コメントアウトしたくなったら、//*を/*に1文字削ればコメントブロックされます。

```php
/*
echo "bfx 1";
echo count($fx);
foreach($fx as $val){
  echo count($val);
}
exit;
//*/
```

１文字消したり１文字書き加えたりするだけで、ブロック単位でコメントのON/OFFを切り替えられるようになりました。

以上、なにかの参考になれば幸いです。
スプレッドシートのデータをダブルコーテ“”で囲ってエクスポートする（Google Apps Script）

#やりたい事
この2週間であまりにも多用する必要があった為…
スプレッドシートのデータをダブルコーテで囲ってエクスポートする

<img width="458" alt="2DB11F4C-205F-4E74-93D5-8AD2D16BB01C.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87715/d83d03d4-98b6-db4d-5067-f259f82a0d8e.jpeg">

↓ ↓ ↓コレをこうする↓ ↓ ↓ 

“Title1”, “Title2”, “Title3”
“hoge”, “hogehoge”, “hogehogehoge”


#背景
いろいろなシステムの修正を手でやるの面倒いから自動化したいけど、いうても作ってる時間もそんなにないから取り敢えずcsvエクスポートインポートで片付けたい！
でもよく考えたらExcelでダブルコーテで囲ってエクスポートできない？し、うちMacしかないからAccessもないし、1番簡単そうなのがGoogleのスプレッドシートやったから、GASでダブルコーテで囲ってエクスポートするやつを書きましたよ

#やった事
スプレッドシートのメニューにエクスポート用のメニューを追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87715/86b89e5a-d723-72e2-9e3c-49ebeffee5a5.png)

エクスポートメニューを実行すると、GoogleDriveの指定のフォルダへデータが保存される。


書いたスクリプト。

```js:CSVexport.gas

// メニューバーにカスタムメニューを追加
function onOpen() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "ダブルコーテで囲ってCSV出力",
    functionName : "createCsv"
  }];
  spreadsheet.addMenu("管理ツール", entries);
};

//csvを出力したいフォルダのIDをXXXへ入れてください。
var folderId = 'XXXXXXXXXXXXXXXXXXXXXXXXXX';
 
function createCsv() {
  var csvData = loadData();
  writeDrive(csvData);
}
 
function loadData() {
  var data = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
  var csv = '';
  for(var i = 0; i < data.length; i++) {
    csv += '"' + data[i].join('","') + '"\r\n';
  }
  return csv;
}
 
function writeDrive(csv) {
  var drive = DriveApp.getFolderById(folderId);
  var fileName = 'export.csv'
  var contentType = 'text/csv';
  var charset = 'utf-8';
  var blob = Utilities.newBlob('', contentType, fileName).setDataFromString(csv, charset);
  drive.createFile(blob);
}

```
GCEでインスタンスを作るときにやることリスト

今更ながらGoogle Compute Engine(GCE)を使ってみたいなと思い、
インスタンス作るときにやった手順をまとめてみた。

ほぼ、以下の2つの記事を見てやった手順をまとめただけの備忘録。
・ [GCE の無料枠のサーバを立るときに、初見でハマりそうなところ - Qiita](https://qiita.com/ndxbn/items/7ef0a96e409a5b5837bd#ip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%82%92%E5%9B%BA%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%8A%E3%81%8F)
・ [GCPで永久無料枠を利用してサービスを立ち上げたときにしたことの備忘録 - Qiita](https://qiita.com/riku-shiru/items/a870edd9dc0b132e092c#80443%E3%83%9D%E3%83%BC%E3%83%88%E3%82%92%E8%A7%A3%E6%94%BE%E3%81%99%E3%82%8B)

### 1. インスタンス作成

imageはUbuntu 18.04(Minimal)を選択

- f1-microにする
- 80, 433ポートを開放する
  - 「HTTPトラフィックを許可する」にチェック
  - 「HTTPSトラフィックを許可する」にチェック
- IPを固定にする
  - 「ネットワーキング」>「ネットワークインターフェース」>「外部IP」
  - **「プライマリ内部IP」とは違うので注意**

### 2. SSHの設定

#### 2-1. ポート変更

- メニューの「VPCネットワーク」>「ファイアウォールルール」から
- 「ファイアウォール ルールの作成」を押して作成
  - ターゲットタグ: original-allow-ssh
  - ソースIPの範囲: 0.0.0.0/0
  - プロトコルとポート: tcp 40022
- VMの「ネットワークタグ」に「ターゲットタグ」をつける
- 「VMインスタンス」にある該当のVMの「接続」＞「SSH」を押してブラウザでログイン

```shell
# apt updateしないとvimをインストールできない
$ sudo apt update
$ sudo apt install -y vim

$ sudo vim /etc/ssh/sshd_config
$ sudo systemctl restart sshd
```


```diff
  #Port 22
+ Port XXXX （XXXX は さっき開けたポート番号）
  #AddressFamily any
  #ListenAddress 0.0.0.0
  #ListenAddress ::
```


sshdを再起動したら、**編集したブラウザは閉じずに**、
「接続」>「ブラウザからカスタムポートで SSH を開く」から
変更したポートで接続してみて、つながるかどうかを確認


うまくできたらポートを閉じる

- 「ファイアウォールルール」に移動
- 「ファイアウォール ルールの作成」を押して作成
  - ターゲットタグ: disallow-ssh22
  - 一致したときのアクション: 拒否
  - ソースIPの範囲: 0.0.0.0/0
  - プロトコルとポート: tcp 22
- VMの「ネットワークタグ」に「ターゲットタグ」をつける

#### 2-2. 公開鍵の認証

```shell
# 鍵を生成。アカウント名はmemorylovers
$ ssh-keygen -t rsa -f ~/.ssh/gcp_key -C memorylovers

$ chmod 400 ~/.ssh/gcp_key 

# 公開鍵をコピー
$ cat ~/.ssh/gcp_key.pub | pbcopy
```

- メニューの「VMインスタンス」から該当のVMを選択し、編集画面へ
- SSHキーに貼り付けて、保存


接続確認をしてみる

```shell
$ ssh memorylovers@<IPアドレス> -p <指定したポート> -i ~/.ssh/gcp_key
```

#### 2-3. SSHの設定を変更

ポート番号以外について、確認・設定していく

```diff
  # プロトコルを2にする
+ Protocol 2

  # rootログインを無効にする
  #PermitRootLogin prohibit-password
+ PermitRootLogin no

  # パスワード認証を無効にする
  PasswordAuthentication no
  ChallengeResponseAuthentication no

  # 認証の試行回数を制限する
  #MaxAuthTries 6
+ MaxAuthTries 5
```

設定が終わったらsshdを再起動して設定を反映

```shell
$ sudo systemctl restart sshd
```

以上!! これでインスタンスが作成できた！

## こんなのつくってます!!

積読用の読書管理アプリ 『積読ハウマッチ』をリリースしました！
[積読ハウマッチ](https://tsundoku.site)は、Nuxt.js+Firebaseで開発してます!

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/572d4947-f40b-e4dc-1c9c-bc584cd2a66c.png" width="200"/>

もしよかったら、遊んでみてくださいヽ(=´▽`=)ﾉ

要望・感想・アドバイスなどあれば、
公式アカウント([@MemoryLoverz](https://twitter.com/MemoryLoverz))や開発者([@kira_puka](https://twitter.com/kira_puka))まで♪

# 参考にしたサイト
- [GCE の無料枠のサーバを立るときに、初見でハマりそうなところ - Qiita](https://qiita.com/ndxbn/items/7ef0a96e409a5b5837bd#ip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%82%92%E5%9B%BA%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%8A%E3%81%8F)
- [GCPで永久無料枠を利用してサービスを立ち上げたときにしたことの備忘録 - Qiita](https://qiita.com/riku-shiru/items/a870edd9dc0b132e092c#80443%E3%83%9D%E3%83%BC%E3%83%88%E3%82%92%E8%A7%A3%E6%94%BE%E3%81%99%E3%82%8B)
OpenGLについてしらべてみた

OpoenGL5年ぶりくらいなんで思い出す作業も兼ねてここに記しておこうかと思う。思うだけ。
[この記事](https://qiita.com/tontkaimo/items/27b8307c2d94e3d18539)の続き物みたいなものなんでSDLを使用する。

# 調べたこと
### OpenGLについての勘違い
自分は今まで、世にあるグラフィックボードをOpenGL側がサポートして描画のあれこれを管理していると思っていた。
しかし、実際にはOpenGL側が定めた仕様に対してハードウェア側が対応するというかたちになっているらしい
一応覚えておいて損はないと思うのでφ(..)メモメモ

---------------------------------------------------------------------------

### OpenGLのプロファイルについて  
参考URL [OpenGL Context](https://www.khronos.org/opengl/wiki/OpenGL_Context)
OpenGLは3.0まで下位互換があったらしい。
OpenGL1.1の環境で2.1の実装コードを動かしても問題なく動作するが、3.1以降は機能の廃止という概念が存在し、一部機能が廃止された。
Profileを指定することによって3.1以降でも廃止された機能使えるようにできるするのがOpenGLのプロファイルという概念
Core ProfileとCompatibilityの２つが存在し、それぞれ

|種類|概要|
|---|---|
|Core Profile|廃止された機能は無効|
|Compatibility Profile|廃止された機能も許可|

という意味合いになっている

---------------------------------------------------------------------------

## 周辺のライブラリとか
### GLFW
OpenGL Framework
ライセンス
zlib/libpng license

オープンソースでマルチプラットフォームなOpenGLのフレームワーク
OpenGL,OpenGL ES, Vulkanに対応していて、ウィンドウ・コンテキスト・入力・イベント・サーフェスの作成用APIを提供してくれる

#### 余談 サーフェスについて
以下のURLが参考になった
http://glassonion.hatenablog.com/entry/20150831/1441027769
> OpenGL では描画処理を行うバックバッファのことをフレームバッファ、描画処理結果を表示するフロントバッファのことをレンダーバッファといいます。またグラフィックが表示されている空間のことをサーフィス(Surface)と呼びます。

バッファ周りの理解は結構ぼんやりとした感じだったので、図解してくれていてとてもイメージしやすかった

---------------------------------------------------------------------------

### GLEW
OpenGL Extension Wrangler Library
ライセンス
Modified BSD License/Mesa 3-D License（MIT）/Khronos License（MIT）

C/C++で構成されたオープンソースでクロスプラットフォームなOpenGLの拡張機能をロードするためのライブラリ
拡張機能の読み込みが非常に簡単にできる
2019/11/17時点ではOpenGL4.6(最新バージョン)に対応している
とりあえずglewInitしておけばおｋ

#### glewExperimental
```cpp
glewExperimental = GL_TRUE;
```
部分的にサポートを有効にすることができる
コアプロファイルを指定した時に使う？

[glew 公式ページ](http://glew.sourceforge.net/)

---------------------------------------------------------------------------

### GLM
OpenGL Mathematics
ライセンス
Happy Bunny License/MIT License
http://glm.g-truc.net/copying.txt

C++で構成されたヘッダーオンリーの数学ライブラリ（ヘッダーオンリーすごいなぁ）
GLSLライクな文法になっているらしい

---------------------------------------------------------------------------

# 参考にしたサイトとか
OpenGLに入門する前に知っておきたかったこと
https://kamino.hatenablog.com/entry/opengl-prior-knowledge
OpenGLプログラミング
https://ja.wikibooks.org/wiki/OpenGLプログラミング
OpenGL ES入門 その1 -描画の仕組みとバッファ-
http://glassonion.hatenablog.com/entry/20150831/1441027769


本当はポリゴン描画のところまで書き留めておきたかったのだけど、コードの量が結構多くなりそうだったのでやめた
Vue CLIのインストール失敗はsudoコマンドで回避できる

qiita投稿2本目です。

今日ふと`Vue CLI`でプロジェクトを開始しようと思い、まずVue CLIをグローバルにインストール（```npm i -g @vue/cli@3.9.3```）しようとしたら、以下のような状態に。

![スクリーンショット 2019-11-17 10.36.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472701/971a1bc2-61cc-5ecc-d383-36005329acb3.png)

##Vue CLIのインストール失敗

エラーを見てみましょう。

```
npm WARN checkPermissions Missing write access to /user/local/lib/node_modules
```
なるほど、`/user/local/lib/node_modules`にアクセス権がないのかな🤔？

そこでコマンドでlibディレクトリ以下のフォルダ、ファイルへの権限を確認してみる。

```
$ ls -l /usr/local/lib
```

`ちなみに、ls -lコマンドは、ファイルやフォルダ一覧を詳細情報付きで一覧表示してくれるコマンド。`

左から順に、

1.ファイルタイプ
2.パーミション
3.ハードリンクの数
4.権限ユーザー名
5.グループ名
6.バイトサイズ
7.タイムスタンプ
8.ファイル名
の順になっている。

すると、
![スクリーンショット 2019-11-17 10.37.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472701/33f772db-d32c-d5ac-55a4-ec6639814c35.png)

...node_modulesだけ権限ユーザー違うやんけ！
`＊この場合rootです`

##sudoでroot権限を実行する

LinuxのrootユーザとはLinuxの管理者のことですね。

rootユーザーでしかアクセスできないので、root権限でアクセスできる魔法のコマンド、`sudo`を召喚します。

>sudoはroot権限を一時的に借りて、権限を実行します。

ということで、ここはsudoコマンドで突破します。

```
sudo npm i -g @vue/cli@3.9.3
```

その後パスワードが求められるので、入力してください。

![スクリーンショット 2019-11-17 10.40.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472701/b6db3ddd-ebed-841d-76e0-0934f131ebac.png)

インストールできました☺️

*`ちなみに今回の問題は、NPMパッケージをグローバルにインストールするときは頻繁に遭遇するので、慣れておくとヨロシ。`*
[Android][AdMob] アダプティブ バナー

最近見聞きするようになったAdMobのアダプティブバナー (Adaptive Banners) について説明します。

# アダプティブバナーとは？

スマートバナーと何が違うの？ってすぐに思うと思います。公式サイトの説明読んでも、イマイチ分かりません。動きを見ていると、同一スマホでもバナーやスマートバナーの広告が両方表示されるハイブリッドな広告表示になっているようにしか見えない…。

|バナー|スマートバナー|アダプティブバナー|
|:-----|:-----------|:----------------|
|<img width="320" alt="Android_banner.png" src="https://developers.google.com/admob/images/Android_banner.png">|<img width="320" alt="Android_adaptive.png" src="https://developers.google.com/admob/images/Android_smart.png">|<img width="320" alt="Android_adaptive.png" src="https://developers.google.com/admob/images/Android_adaptive.png">|


# サンプルコード

サンプルコード自体は[Mobile Ads SDK (Android)](https://developers.google.com/admob/android/banner/adaptive)にあります。

基本的に、通常のバナー広告を表示する方法と同じです。AdSizeにAdSize.SMART_BANNERを指定するのではなく、以下のようにデバイスのdensity (論理密度) と広告表示エリアのサイズから計算したDPに基づいたAdSizeを指定する点が異なるだけで、簡単に対応できます。

DPとは？とかDPとPixelの変換方法などについては、[こちら](https://qiita.com/SnowMonkey/items/6edcd875d78913c50d62)を参照して下さい。

注意点としては、[日本語サイトのサンプルプログラム](https://developers.google.com/admob/android/banner/adaptive)ではAdSize.getCurrentOrientationBannerAdSizeWithWidthが利用されていますが、これは、18.3.0から名前が変更されて非推奨なAPIになっているため、英語ページのサンプルプログラムのAdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSizeを利用して下さい。

|API|説明|
|:-------------------------------------------------------|:------------------|
|AdSize.getLandscapeAnchoredAdaptiveBannerAdSize         |横画面用            |
|AdSize.getPortraitAnchoredAdaptiveBannerAdSize          |縦画面用            |
|AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize|現在の画面用 (自動) |

```kotlin
private val adSize: AdSize get() {
   val display = windowManager.defaultDisplay
   val outMetrics = DisplayMetrics()
   display.getMetrics(outMetrics)

   val density = outMetrics.density
   var adWidthPixels = ad_view_container.width.toFloat()
   if (adWidthPixels == 0f)
     adWidthPixels = outMetrics.widthPixels.toFloat()

   val adWidth = (adWidthPixels / density).toInt()
   return AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(this, adWidth)
}
```

# その他

AdSize.ADAPTIVE_BANNERとか用意して、AdMob SDK側で上記のサンプルコードのような事を対応してくれても良いような気がしますが…。

# 参考文献

* [Home/Products/Google AdMob/Mobile Ads SDK (Android)/GuidesAdaptive Banners](https://developers.google.com/admob/android/banner/adaptive)
* [Upgrade your banner ads with new adaptive anchor banners](https://www.blog.google/products/admob/upgrade-your-banner-ads-new-adaptive-anchor-banners/)
atcoderで使えそうなpythonスニペット(随時追加していきます)

# atcoderで使えそうなpythonスニペット
こう言う細かいのも自分で書くのだるいな、と思ったので記事にまとめていきます。

入力各種。

```python
import sys

def LI(): return list(map(int, sys.stdin.buffer.readline().split()))
def I(): return int(sys.stdin.buffer.readline())
def LS(): return sys.stdin.buffer.readline().rstrip().decode('utf-8').split()
def S(): return sys.stdin.buffer.readline().rstrip().decode('utf-8')
def IR(n): return [I() for i in range(n)]
def LIR(n): return [LI() for i in range(n)]
def SR(n): return [S() for i in range(n)]
def LSR(n): return [LS() for i in range(n)]
def SRL(n): return [list(S()) for i in range(n)]
def MSRL(n): return [[int(j) for j in list(S())] for i in range(n)]
mod = 10 ** 9 + 7
```

# 木の入力

```python
n, q = LI()
G = [[] for _ in range(n)]
for a, b in LIR(n - 1):
    G[a - 1] += [b - 1]
    G[b - 1] += [a - 1]
```
一般のグラフの場合はLIR(n-1)の部分のn-1をmに変えます。

```python
n = I()
G = []
for _ in range(n):
    G += [LI()]
```
隣接行列。こんぐらいその場でかけよとも思うが。


グラフ生成
どのようなグラフかをパッと把握するのに便利なライブラリ。

```python
n = I()
G = nx.DiGraph() #無向グラフの時はnx.Graph()
for a, b in LIR(n - 1):
    G.add_edge(a-1, b-1)

nx.draw_networkx(G)
# 画像を保存する場合はplt.savefig('hoge.png')を追加
plt.show()
```
下の図のようになる。
![graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275145/2325d4d7-35c4-d954-5e80-6a2236429c53.png)
VSCodeでファイルを開くならSimple Dialogが便利


個人的に便利だと思った機能の紹介です。

VSCodeでファイルを開くときにウィンドウが出てくるのが鬱陶しいと思っている人は、コマンドラインやクイックオープンを活用していると思います。Simple Dialogは、（クイックオープンのように）ウィンドウ上部中央に表示され、そこからファイルをたどれるというものです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44208/b93bb502-2bc9-8aa6-4600-ef4d6c822c97.gif" width=75% alt="スクリーンショット" />


## 機能の有効化
**ファイル > 基本設定 > 設定**からsimple dialogで検索すると`Files > Simple Dialog`という項目が出てくるので、チェックを入れてください。

settings.jsonであれば次のようにしてください。

```json
"files.simpleDialog.enable": true
```

## 利用
通常ファイルを開く場合と同様で、<kbd>Ctrl-O</kbd>などから使うことができます。<kbd>ESC</kbd>で閉じることができます。名前を付けて保存する場合や、フォルダを開く場合もSimple Dialogが表示されます。また、パス区切り文字を間違えてもそこそこ面倒を見てくれるようです。
Firebaseでログイン画面を作る

# やりたいこと
Firebaseでログイン画面を実装する（簡単に）


# 前提
- Firebaseページのデプロイができる
- [Firebaseコンソール](https://console.firebase.google.com/)のAuthentificationでEメール、Googleアカウントを有効にしている
- ファイルの構造はこんな感じのツリーになっている

```:tree
project
|___functionsなど
|
|___public
| |
| |___login.html #ログインコードを書く場所
| |
| |___success.html #ログイン成功後のページ
| |
| |___terms-of-services.html #利用規約のページ
| |
| |___privacy-policy.html #プライバシーポリシーのページ
...
```


# 参考
https://github.com/firebase/firebaseui-web/blob/master/README.md

# Next Step
[ユーザー管理](https://firebase.google.com/docs/auth/web/manage-users?hl=ja)

# コード

```html:login.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Login</title>

    <!-- *******************************************************************************************
       * Firebaseコンソール→全般からWebアプリの初期化に必要なスニペットを貼り付ける*
       ***************************************************************************************** -->

    <!--
    authentificationに必要なライブラリを読み込む
    参考：https://firebase.google.com/docs/web/setup#available-libraries
    -->
    <script src="/__/firebase/6.2.0/firebase-auth.js"></script>

    <!--firebase UIの読み込み-->
    <script src="https://cdn.firebase.com/libs/firebaseui/3.5.2/firebaseui.js"></script>
    <link type="text/css" rel="stylesheet" href="https://cdn.firebase.com/libs/firebaseui/3.5.2/firebaseui.css" />

    <script type="text/javascript">
        var uiConfig = {
          callbacks: {
            signInSuccessWithAuthResult: function(authResult, redirectUrl) {
              //trueにするとsignInSuccessUrlで定めた場所にリダイレクトされる
              //falseにするとページは遷移しない
              return true;
            },
            uiShown: function() {
              // ログイン画面が出たときに行う作業
            }
          },
          signInFlow: 'popup',
          //認証成功後のページ
          signInSuccessUrl: './success.html',
          signInOptions: [
            firebase.auth.EmailAuthProvider.PROVIDER_ID,
            firebase.auth.GoogleAuthProvider.PROVIDER_ID
          ],
          // 利用規約のページ
          tosUrl: './terms-of-services.html',
          // プライバシーポリシーのページ
          privacyPolicyUrl: './privacy-pocily.html'
        };

        // FirebaseUI ウィジェットの初期化と上のConfigの登録
        // headでauthentification用のライブラリを読み込まないとfirebase.auth()でエラーが出ます。
        var ui = new firebaseui.auth.AuthUI(firebase.auth());
        ui.start('#firebaseui-auth-container', uiConfig);
    </script>
</head>
<body>
    <div id="firebaseui-auth-container"></div>
</body>
</html>
```


## ログインページ

<img width="669" alt="ログインページ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186209/108ec2ac-0b5c-0ba3-f4ef-cf6355b1c039.png">

Terms of Service部分は`./privacy-pocily.html`, Privacy Policy部分は`./terms-of-services.html`で設定したページです。

ちなみに言語の変更も可能です。


## 認証画面

<img width="627" alt="認証画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186209/152dc944-d5bf-5104-d86a-28161b4b520e.png">

簡単に認証画面ができました。
【DBMS_CLOUD】使用可能なソースファイルの圧縮形式

### 指定可能な3種類

* gzip
* zlib
* bzip2

### 指定の仕方（例）

```bash

format => '{"compression" : “gzip” }'  
もしくは
format => json_object('compression' value 'gzip'))

※autoを指定すると、自動チェック。nullを指定すると圧縮されていない形式として認識。
```


### 参考
* [DBMS_CLOUDパッケージ・フォーマット・オプション](https://docs.oracle.com/cd/E83857_01/paas/autonomous-data-warehouse-cloud/user/format-options.html#GUID-08C44CDA-7C81-481A-BA0A-F7346473B703)
【OCI CLI】WindowsでOCI-CLIをインストールした場合の関連パス

OCI-CLIインストール時に、各種ソフトウェア（ファイル）がデフォルトでどこに配置されるかのメモ。


### インストール先
```bash

===> In what directory would you like to place the install? (leave blank to use 'C:\Users\ユーザ名\lib\oracle-cli'):
-- Creating directory 'C:\Users\ユーザ名\lib\oracle-cli'.
-- We will install at 'C:\Users\ユーザ名\lib\oracle-cli'.
```

### oci.exe配置先
```bash
===> In what directory would you like to place the 'oci.exe' executable? (leave blank to use 'C:\Users\ユーザ名\bin'):
-- Creating directory 'C:\Users\ユーザ名\bin'.
-- The executable will be in 'C:\Users\ユーザ名\bin'.
```

### OCI scripts配置先

```bash
===> In what directory would you like to place the OCI scripts? (leave blank to use 'C:\Users\ユーザ名\bin\oci-cli-scripts'):
-- Creating directory 'C:\Users\ユーザ名\bin\oci-cli-scripts'.
-- The scripts will be in 'C:\Users\ユーザ名\bin\oci-cli-scripts'.
```

#oci setup config

### RSA鍵の作成場所
```bash

Do you want to generate a new RSA key pair? (If you decline you will be asked to supply the path to an existing key.) [Y/n]: Y
Enter a directory for your keys to be created [C:\Users\ユーザ名\.oci]:

Public key written to: C:\Users\ユーザ名\.oci\公開鍵名.pem

```

### 参考
* [クイックスタート](https://docs.oracle.com/cd/E97706_01/Content/API/SDKDocs/cliinstall.htm)
centos7 フォルダコピー

centosでフォルダをコピー。
パーミッションやら、アクセス権をそのままの状態でコピーする。
フォルダ階層がずれるので絶対パスで指定。

```

cp -pr /var/www/html/copy_moto_dir /var/www/html/copy_saki_dir

```
ReactNative (0.54+) で HTTP/2.0 を無効にする


ReactNative (0.54+) で、サーバサイドに AWS ALB で HTTP/2.0 を使っていた時に、HTTP/1.1 と HTTP/2.0 で挙動が変わっているっぽかったので、調査のために RN (android) からの HTTP/2.0 接続を無効にしてみました。

- メインのReactActivity.onCreate() で OkHttpClientProvider.setOkHttpClientFactory() を呼びます。
- OkHttpClient を返す任意のCustomClientFactoryを定義します。

```[path_to_RN_proj]/android/src/main/java/your/domain/MainActivity.java
package your.domain
    :
import com.facebook.react.modules.network.OkHttpClientProvider;
    :

public class MainActivity extends ReactActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    OkHttpClientProvider.setOkHttpClientFactory(new CustomClientFactory());
    super.onCreate(savedInstanceState);
  }
    :
```

```[path_to_RN_proj]/android/src/main/java/your/domain/CustomClientFactory.java
package your.domain

import java.util.List;
import java.util.ArrayList;

import com.facebook.react.modules.network.OkHttpClientFactory;
import com.facebook.react.modules.network.OkHttpClientProvider;
import com.facebook.react.modules.network.ReactCookieJarContainer;

import okhttp3.OkHttpClient;
import okhttp3.Protocol;

public class CustomClientFactory implements OkHttpClientFactory {
  @Override
  public OkHttpClient createNewNetworkModuleClient() {

    List<Protocol> protocolList = new ArrayList<>();
    protocolList.add(Protocol.SPDY_3);
    protocolList.add(Protocol.HTTP_1_1);

    return OkHttpClientProvider.createClientBuilder()
      .cookieJar(new ReactCookieJarContainer())
      .protocols(protocolList)
      // .followRedirects(false)
      // .followSslRedirects(false)
      .build();
  }
}
```

それから react-native run android。
すると、Charlesなどで監視してみると Protocol: HTTP/1.1 に落ちている。

see also:

- Provide a interface to allow users to disable android http2, if they
https://github.com/facebook/react-native/pull/11372

- how to use my own OkHttp client in react-native (0.54 + )
https://stackoverflow.com/questions/49722981/how-to-use-my-own-okhttp-client-in-react-native-0-54

- Is it possible to disable following redirects in OkHttp 2.0?
https://stackoverflow.com/questions/23996680/is-it-possible-to-disable-following-redirects-in-okhttp-2-0

__END__
linuxカーネルとシェルについて

#コマンド実行の流れ
例えばlinuxで `date` というコマンドを実行した場合、実行結果は以下のようになります。

```bash
$ date
2019年 11月 17日 日曜日 12:42:31 JST
```
なんてことないコマンドですが、このコマンドを例にしてLinuxが実際どのような流れでコマンドを実行しているかを確認したいと思います。

1. キーボードに `date` コマンドを打ち込む
2. `date` コマンドを探す
3. 見つかったコマンドを実行する<br>
3.1 日時が表示される

上記の中で、**シェルの仕事は『カーネルにプログラム実行を依頼する』こと**です。つまり1と2がシェルの仕事ということになります。
一方**カーネルの仕事が、コマンドを実行すること**で、上記の3と3.1にあたります。日時の表示まで含めてコマンドの機能なので、日時が表示されるは3.1としています。

Linuxは本体がLinuxカーネルとシェルに分かれていることで、シェルを自在にカスタマイズしたり逆に同じシェルの移植されている別のOSを自由に扱えたりするのです。

#あとがき
コメントで特にシェルの役割について指導を頂いたのでがっつり引用してその他気になった場所を訂正しました。(がっつり引用は『』の文)
特に[こちらの記事](https://qiita.com/angel_p_57/items/03582181e9f7a69f8168#%E3%82%B7%E3%82%A7%E3%83%AB%E4%B8%8A%E3%81%A7%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E5%AE%9F%E8%A1%8C)を参考にさせていただきました。
DeepChemのマルチタスク学習においてタスク毎の評価スコアをゲットする

#はじめに
DeepChemでマルチタスク学習をさせた時に、deepchem.models.Modelクラスのevaluateメソッドでは各タスクのスコアの平均が得られる。しかし、それぞれのタスクのスコアがどうなったのかが知りたいのが人情である。今回その方法を調べてたのでメモっておく。

#環境
- python 3.6
- deepchem  2.2.1.dev54
- rdkit 2019.03.3.0  

#方法
evaluateメソッドを実行する際にper_task_metrics=Trueを指定すればいいだけ。
そうすると二番目の戻り値として、タスク毎のスコア得られる。


```python
validation_score, validation_par_task_score = model.evaluate(validation_set, metrics, transformers, per_task_metrics=True)
print(validation_par_task_score)
```

例えば評価指標がroc_aucでタスクが9つある場合、以下のような形式で各タスクのroc_aucが得られる。

```python
{'mean-roc_auc_score': array([0.77601105, 0.80917502, 0.85473596, 0.8459161 , 0.73406951,
       0.77492466, 0.65670436, 0.7812783 , 0.80639215])}
```

# おわりに
DeepChem は、最初はとっつきにくいが、色々試行錯誤すればそれなりにやりたいことができるようになる奥が深いライブラリだ。
シェルスクリプト コマンド

単純コマンドまたは複合コマンドのことを”コマンド”と呼ぶ。

#### 単純コマンド
コマンド名と引数を並べたもの

```bash:simple.sh
# 内部コマンド（OSやシェルに組み込まれているコマンド）
# 組み込まれているため、コマンドの実体はない
# 一般的に使用頻度が高く、サイズが小さい
cd directory1
echo 'Hello!'

# help コマンドで出力されるのが組み込みコマンド
$ help
....
 alias [-p] [name[=value] ... ]                                            logout [n]
 bg [job_spec ...]                                                         mapfile [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C >
 bind [-lpsvPSVX] [-m keymap] [-f filename] [-q name] [-u name] [-r keys>  popd [-n] [+N | -N]
....

# 外部コマンド（OSやシェルに組み込まれていないコマンド)
# 一般的に /usr/sbin や /usr/bin に存在する
# 一般的に使用頻度が低く、サイズが大きい
ls -alt
cp file1 file2
```

#### 複合コマンド
if, case, for, while, シェル関数, グループコマンド, サブシェル

```bash:composite.sh
for n in {1..5}
do
  echo "Hello ${n}"
done
```

#### type コマンド
type コマンドでそのコマンドの存在を確認できる

```bash:type
$ type echo
echo is a shell builtin # 内部コマンド

$ type type
type is a shell builtin # 内部コマンド

$ type dummy
bash: type: dummy: not found # 存在しないコマンド

$ type ls
ls is aliased to `ls --color=auto' # 外部コマンド
```
【Fire base+swift】学習記録（２）チャットアプリを作る

[【Swift】Firebase Realtime Database を用いてチャットアプリを爆速コーディングしてみた。](https://qiita.com/tetsukick/items/638501babc692ec55858)
こちらを参考にチャットアプリを作成しました。
細かいデザインに関してはガン無視して、とりあえず動くものを作って、Firebaseを理解しようというものです。
自分なりの理解をコメントに入れています。

```swift:sample.swift
import UIKit
import FirebaseDatabase

class ViewController: UIViewController {
    @IBOutlet weak var textView: UITextView!
    @IBOutlet weak var nameInputView: UITextField!
    @IBOutlet weak var messageInputView: UITextField!
    
    //Databaseのインスタンス作成
    var databaseRef: DatabaseReference!

       override func viewDidLoad() {
           super.viewDidLoad()
        //Databaseのインスタンス作成
        databaseRef = Database.database().reference()
        
        //databaseRef.observe(.childAdded, with: { snapshot in〜~}でイベントを表示させる
        databaseRef.observe(.childAdded, with: { snapshot in
            if let obj = snapshot.value as? [String : AnyObject], let name = obj["name"] as? String, let message = obj["message"] {
                //currentTextを定義
                let currentText = self.textView.text
                //textViewにcurrentTextを表示
                self.textView.text = (currentText ?? "") + "\n\(name) : \(message)"
            }
        })

       }
    @IBAction func tappedSendButton(_ sender: Any) {
    //ボタンを押した時に、UITextField２つに入力されている値を送信します。
       view.endEditing(true)
        
        //nameInputViewとmessageInputViewに値がある場合のif文
       if let name = nameInputView.text, let message = messageInputView.text {
        //messageDataを定義
           let messageData = ["name": name, "message": message]
        //databaseに保存
           databaseRef.childByAutoId().setValue(messageData)
        //text欄を空欄にする
           messageInputView.text = ""
       }
    }


}
```

動いた！Firebaseにもデータ保存できている！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Firebaseでデータ保存できたぜ！<br>一人のチャットアプリ完成したぜ！<br>無限に自分と語り合える！ <a href="https://t.co/4kY5zWSr7V">pic.twitter.com/4kY5zWSr7V</a></p>&mdash; 中村幹 (@nakamurasssey) <a href="https://twitter.com/nakamurasssey/status/1195906443385245696?ref_src=twsrc%5Etfw">November 17, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>




GitHubは[こちら](https://github.com/NAKAMURAAAAAAAAAA/fireapp)
pythonでfor文の例文を集める

#実行環境
- python 3.7.5
- Windows PowerShell

#rangeを用いる

- 昇順
- 降順
- 逆順

```python:range.py
>>> for i in range(0, 6):
...     print(i)
...
0
1
2
3
4
5
```
```python:decreasing.py
>>> for i in range(6, 0, -1):
...     print(i)
...
6
5
4
3
2
1
```
```python:reversed.py
>>> for i in reversed(range(0, 6)):
...     print(i)
...
5
4
3
2
1
0
```


#listを用いる
```python:list.py
>>> for i in [3.14, "Hello", (1, 2, 3)]:
...     print(i)
...
3.14
Hello
(1, 2, 3)
```

#未分類のもの
- 文字列を扱う[^1]

```python:string.py
>>> for i in "abc":
...     print(i)
...
a
b
c
```

編集途中…（rangeとlistについてもまとめたい…）

[^1]: [shiracamus](https://qiita.com/shiracamus)さんのコメントより引用

#参考文献
- [Decreasing for loops in Python impossible?](https://stackoverflow.com/questions/4294082/decreasing-for-loops-in-python-impossible)
    - サイト名 : stackoverflow (2019/11/17)
- [Pythonのrange関数の使い方](https://note.nkmk.me/python-range-usage/)
    - サイト名 : note.nkmk.me (2019/11/17)
- [Pythonのfor文によるループ処理（range, enumerate, zipなど）](https://note.nkmk.me/python-for-usage/)
    - サイト名 : note.nkmk.me (2019/11/17)
Angular アプリで最初のHelloWorldを表示するまでの経緯

## Let's Angular

こんにちわ。本日は、`Angular` アプリの最初のHelloWorldを作ってみようと思います。最終的には、`Angular` をフロントエンドアプリとし、`apiアプリ`を`ruby` やその他言語で作って、スケーラブルでモダンなウェブアプリの完成を目指したいと思います。今回は、Angularを使いAngularCLIの導入から実際にブラウザへHelloWorldを表示します。参考にしたurlは本家が出しているドキュメントです。深く、`Angular` を使いこなすには、`TypeScript` の知見が必要なので、それも覚えましょう〜。

## ローカルの環境
```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14.5
BuildVersion:	18F132
```


## 実装

最新のAngularを使うにはnodeのバージョンで10.9.0以上が必要になるようです。

```
$ nodebrew use 10.9.0
use v10.9.0

$ node -v
v10.9.0

$ npm -v
6.1.0
```

ステップ1: Angular CLIをインストールする

```
$ npm install -g @angular/cli
```

アプリを作る
```
ng new my-app
```

ワークスペースと初期アプリケーションを作成する。ここでプログラムから質問を聞かれますがエンターしていいです。ここでくれば、もうアプリの雛形はできているので（rails的な）ngコマンドでアプリを立ち上げます。

```
$ cd my-app
$ ng serve --open  --port 3005
```

そうすると、自動で生成されたviewが出現します。今回は、ブラウザにHelloWorldを表示させることがゴールなので、ファイルを少し丸っと書き換えます。 ` /my-app/src/app/app.component.html ` のファイルをを下記のように変更すると画面が自動的に変わります。

```
<h1>Hello World</h1>
```

以上になります。最後に、Angularでバージョンを確認してみましょう。


```
$ ng version

     _                      _                 ____ _     ___
    / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
   / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
  / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
 /_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
                |___/
    

Angular CLI: 8.3.19
Node: 10.9.0
OS: darwin x64
Angular: 8.2.14

```

次回は、APIモードでrails（それか他の言語で）を作り、スケーラブルでモダンな開発環境を完成させていきたいと思います。

## 参考にしたドキュメント

[ローカル環境とワークスペースのセットアップ](https://angular.jp/guide/setup-local)
余っているPCをファイルサーバー化

備忘録
環境：ubuntu 16.04

■sambaインストール
sudo apt install samba
↓
■共有するディレクトリの作成
sudo mkdir /home/share
↓
■パーミッション変更
sudo chmod 777 /home/share
↓
■設定ファイルにセクション追加
/etc/samba/smb.conf
に[share]セクションを追加

[share]
   path = /home/share
   writable = yes
   guest ok = yes
   guest only = yes
   create mode = 0777
   directory mode = 0777
↓
■linuxのユーザー追加
useradd ユーザ名 -p パスワード
↓
■sambaのユーザー追加
sudo pdbedit -a ユーザー名
↓
■firewallの無効化
sudo ufw disable
↓
■sambaの再起動
sudo systemctl restart smbd nmbd
↓
■導通確認
サーバー化するPC、接続したいPC、デフォルトゲートウェイそれぞれのIPアドレスを確認し
ping ***.***.***.***
で導通確認
↓
■ネットワークドライブの割り当て
サーバー化するPCのIPアドレスを
\\***.***.***.***\share
を割り当て
↓
■user name、passwardを記入し接続完了
備忘録　MetaTrader5

MetaTrader5に関するメモ書き

#python MetaTrader5モジュールから呼び出しが出来ない件について
##事象
python3にMetaTrader5のモジュールをインストールし、Tick情報を定期的に取得するスクリプトを作成したら、下記エラーが発報してMetaTrader５が取得出来なかった。

```
Traceback (most recent call last):
  File ".\get_tick_sub.py", line 22, in <module>
    MT5WaitForTerminal()
RuntimeError: No IPC connection
```

## 原因
私のMetaTrader５アプリはTitanFXが提供している物を利用している。
TitanFXのMetaTraderのアプリ名がMetaTrader5オリジナルの名前と違っていた為、
アプリが見つからず参照エラーを発報していた。

##対処方法
TitanFXのMetaTrader5アプリ格納ディレクトリをMetaTrader5オリジナルと同じにする。

TitanFX　デフォルトパス

```
C:\Program Files\Titan FX MetaTrader 5
```

MetaTrader5 オリジナルパス

```
C:\Program Files\MetaTrader 5
```


###愚痴
アプリの指定ぐらい引数でいける様にしてほしい
てか設定ファイルとかあればいいのに、、、、
→Python側のMetaTraderモジュールを確認した所、そんなのなかった、、
　てかpydをリバースコンパイルしたい。。
TypeScriptでFizzBuzzしてみた

TypeScriptでFizzBuzzがしたいと思い立ち、やってみた。

### 環境設定
```bash
npm init
npm install typescript -s
npm run tsc -- --init
npm install lodash
npm install --save @types/lodash
```
関数型で書きたいのでlodashもインストール。

### 実装
```typescript
import * as _ from "lodash";
  
const ori = _.range(1,100)
const ret = ori.map(fizzbuzz)

ret.map((val)=>console.log(val))

function fizzbuzz(val: number) {
	if((val % 3 == 0) && (val % 2 == 0)){
		return "fizzbuss"
	}else if(val % 3 == 0){
		return "fizz"
	}else if(val % 2 == 0){
		return "buzz"
	}else{
		return String(val)
	}
}
```
関数型では変数はconstで作れ、とのことなのでconstで定義。

### 実行
```bash
tsc app.ts
node app.js
```

### 所感
- 以下の辺りが、もっときれいに書ける気がするが知識不足
const ret = ori.map(fizzbuzz)
ret.map((val)=>console.log(val))

- console.logを使用すると非純粋になってしまうので、
モナド？を使いたいが知識不足

分かる人いたらコメントください
ITエンジニアの基礎　コード・リファクタリング編


　ここでは読みやすいコードについて書こうと思います。

　又文中の内容でAPIとライブラリ理解は必須と行っても過言ではないと言えます。

# コードの基本
## 命名規則
   命名のポイントは以下のようになります。

* 具体的単語を選ぶ・・・getなど何をしているか❓
* 汎用な名前を避ける・・・sum(合計)など用途を限定した変数にする。
* 情報を含める・・・update_nameのように更新したなど情報を含める。
* 誤解のないように・・・pageと付けたのに何の関連性もないと混乱するため
* 開発者の期待に合わせる。・・・チームでやる場合全体の意向にそう形にする

## コードのレイアウト
   * 整列(縦位置揃え)・・・縦の位置を揃えることです。スペースを使って=（イコール）などの位置を揃えることで可読性を高めることができます。
   * 一貫性(コードの記述フォーマットを設定)・・・似たようなコードのフォーマットを揃えることです
   * ブロック化(近似内容でまとめる)・・・同じ系統の変数などをまとめてグループ化することです。
   
## コメント
* 「Why」をコメントする・・・何故書いたかの理由
* 他の開発者へのメモを残す・・・引付きや機能についての説明のため
* 実際の例を記入する・・・改善例や動作例を書く

# リファクタリング
処理の内容を変えずに冗長なコードを削除や改善することです。
読み手が最短時間でコードを理解できるようになり、修正がしやすくなります。
要素は以下のようになります

##制御フロー
　条件分岐や繰り返し処理などの制御フローがあると他の場所に処理が飛んだり
 枝分かれしたりとコードがわかりにくくなりがちです。

 pointとしては
　　条件式(if/else)の並び順
　　条件式は肯定形を使う・・・ =!ではなく==を使う
　　単純な条件を先に書く・・・a=bなど一眼でわかるように
　　関心を引く条件を先に書く・・・要点こと重要なことを先に書く
　　ネストを浅くする
　　関数から早く返すなど。
 
## 式の分割

コードを短くして変数を使用することによって
わかりやすくする。

例をあげると

```ruby
  if @coments.user.nickname.nil?
  # 処理
 end

# 説明変数を使った場合の方がわかりやすい
is_nickname = currnent_user.nickname.nil?
if  is_nickname
  #処理
end
```

## 変数
下手な使用をすると以下のような問題が起こります。
よって対処を事前に考えておくべきです。

* 変数が多いと追跡するのが難しくなる
  => 邪魔な変数を削除する

* 変数のスコープが大きいと把握する時間が長くなる
  => 変数のスコープをできるだけ小さくする

* 変数が頻繁に変わると現在値を把握するのが難しくなる
  => 変数は1度だけ使う

## メソッドの抽象化(直接的に関係ないものは別の関数にしてまとめるようにする)
   役割によって処置を分けること
　　通販でものを買う場合
　　通販で買う処理 = ものを選ぶ + 買う処理　がある 
　　この処理の時ものを選ぶと買う処理を一つにするのではなく
　　それぞれ独立したメソッドでコードを書いた方がいいということ。

```ruby:
  #悪い例
def show_item
  index = 0
  @items.each_with_index { |val, index|
    puts "#{index + 1}：#{book.title}"
   }
  item = @items[select]
  puts "#{item.name}"
  puts "#{item.image}" 
end

# いい例
def chose_item
  index = 0
  @items.each do |item|
    puts "#{index} : #{item.name}"
  end
  select = gets.to_i
  show_item(select)
end

def show_item(select) # 結果の処理
  item = @items[select]
  puts "#{item.name}"
  puts "#{item.image}" 
end
 
```

## 関心の分離(処理することは1つの機能だけ)
　　def~ endなど
　　メソッドの記述を短めに書いてわかりやすくする。

```ruby
   # 悪い例

     def book
       # 30行
     end

   # いい例
   
     def book_show
       # 5行
     end
  
     def library
       # 5行
     end
  
  # ざっくり書くとこのような形です。
   
```
## 短いコードを書く
　　できるだけ短くかけばわかりやすく、負担も小さいプログラムになります。
   特に4行目が超重要です。

* 汎用的なコードを作り、重複コードを削除する
* 未使用コードや無用の機能は削除する
* 最も簡単に問題を解決できるような要求を考える
* 定期的にすべてのAPIを読んで、標準ライブラリに慣れ親しんでおく。