OmniAICreator/Qiita-1.07M huggingface dataset:
EC2で立ち上げたWordPressで.htaccessを使えるようにする方法

# はじめに
EC2にて「WordPress Certified by Bitnami and Automattic」のAMIを使用して、WordPressを立ち上げた際、.htaccessが効かなかったので、対処法の備忘録を残します

# 結果
httpd-app.confの11行目を「AllowOverride All」に変更すればOKです

# 変更手順
1. httpd-app.confをオープンする。見慣れない場所にあるので注意

```bash

$ sudo vi /opt/bitnami/apps/wordpress/conf/httpd-app.conf
・
・
・
<Directory "/opt/bitnami/apps/wordpress/htdocs">
    Options +MultiViews +FollowSymLinks
    AllowOverride None
・
・
```

2. AllowOverride Allに書き換え、保存

```bash

・
・
<Directory "/opt/bitnami/apps/wordpress/htdocs">
    Options +MultiViews +FollowSymLinks
    AllowOverride All
・
・
```

3. Apache再起動

```bash

$ sudo /opt/bitnami/ctlscript.sh restart apache
Unmonitored apache
Syntax OK
/opt/bitnami/apache2/scripts/ctl.sh : httpd stopped
Syntax OK
/opt/bitnami/apache2/scripts/ctl.sh : httpd started at port 80
Monitored apache
```

上記のようなログが出力されれば、OKです

# 参考
[Start Or Stop Services](https://docs.bitnami.com/aws/faq/administration/control-services/)
FlutterをPixel4で実機デバッグする際の手順

# 概要

PixelをUSBでMacに接続しても認識してくれなくてハマったのでメモ。

# 詳細

## 端末側の開発者オプションをONにする

以下の動画の手順に従ってPixelの開発者モードをONにします。
https://www.youtube.com/watch?v=v2n-XJ5Oto4

ビルドNo.を7回タップすると開発者モードがONになるという裏技仕様。スーファミかよ。

参考: https://developer.android.com/studio/debug/dev-options

## Flutter側で端末を認識させる

※ VSCodeです

正しく↑が終わっていれば`flutter devices`で認識されるはず。

```bash
$ flutter devices

1 connected device:
Pixel 4  • aaaaaaaaa                       • android-arm64 • Android 10 (API 29)
```

--- 

![image.png (73.8 kB)](https://img.esa.io/uploads/production/attachments/2867/2020/01/24/40525/00bda11a-17e4-4163-b513-847d5c8e1672.png)
⌘ +⇧+Pでコマンドパレットを開いて「Flutter: Select Device」を選ぶ

--- 


![image.png (49.4 kB)](https://img.esa.io/uploads/production/attachments/2867/2020/01/24/40525/1e75d78a-bcee-4a89-95da-f3ef71c82bb8.png)
「Pixel4 (mobile)」を選択

--- 

![image.png (49.4 kB)](https://img.esa.io/uploads/production/attachments/2867/2020/01/24/40525/b16e9ce6-aa84-4664-9744-2913ac25e6a3.png)
右下にSelected DeviceとしてPixel4が表示されている。

## runする

![image.png (43.4 kB)](https://img.esa.io/uploads/production/attachments/2867/2020/01/24/40525/a197e405-14da-438b-aaff-1b9ef8af9f0b.png)

デバッグのペインから再生のマークを押す。成功すれば実機でアプリが立ち上がってくれます。

--- 

gifを上げるのがだるすぎたのでやめましたがホットリロードも効いてくれます。やったね！
メモ：ActionMailerのログにメールアドレスが出ないようにする

この記事は
===

* 意外とぱっとできなかったので個人メモです

やりたかった事
===

* ActionMailerでメールを送信する際に、下記のようにログにメールアドレスが出てしまうのですが、セキュリティのレギュレーション上、これを止めたかったです

```
INFO -- : [ActiveJob] [ActionMailer::DeliveryJob] Sent mail to test@example.com (95.4ms)
```

やり方
===

* Rails側で設定はできません
* [モンキーパッチあてればいい説](https://stackoverflow.com/questions/16270713/filter-out-email-addresses-from-actionmailer-logs)があり、やってみたのですが、これが全く反映されない
* 結局、下記のように上書き用のモジュールを作って、ActionMailerが読み込まれたあとでprependしたら反映されました

```config/initializers/log_subscriber_ext.rb
ActiveSupport.on_load(:action_mailer) do
  module CustomLogSubscriberFilter
    def deliver(event)
      info do
        recipients = Array(event.payload[:to]).join(", ")
        "Sent mail to [FILTERED] (#{event.duration.round(1)}ms)"
      end
  
      debug { event.payload[:mail] }
    end
  end
  ActionMailer::LogSubscriber.prepend CustomLogSubscriberFilter
end
```

* ちなみにメソッドの中身は```/actionmailer-5.2.0/lib/action_mailer/log_subscriber.rb```をコピーしてFILTER文字列で潰しただけです
* Railsのバージョンによって中身が異なるかもしれないので注意

終わりに
===

* Web側はfilter_parameter_loggingみたいな仕組みがあるんだから、こっちにも準備して欲しいなー

参考
===

* [blousonのこのコード](https://github.com/cookpad/blouson/blob/master/lib/blouson/engine.rb#L26)が非常に役に立ちました
Stripe のサンプルプログラムが Uncaught IntegrationError: stripe.redirectToCheckout:  になるとき

# 現象
[Stripe-samples](https://github.com/stripe-samples) の [checkout-one-time-payments](https://github.com/stripe-samples/checkout-one-time-payments) の [client-only](https://github.com/stripe-samples/checkout-one-time-payments/tree/master/client-only/client) を試してて、http://localhost:4242/ を開き Buy for $5.0 ボタンを押しても次に遷移しません
 ![スクリーンショット 2020-01-24 13.41.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46544/a983879c-d533-62ff-a5dd-f41f54d2116f.png)

Console を見てみると掲題の Error で止まってます

![スクリーンショット 2020-01-24 13.41.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46544/13fddd9a-c859-6f95-0a56-ab0f55817d7b.png)

# 調査
```
successUrl must start with either http:// or https://.
```
との事なので index.html で successUrl を探すと

```
successUrl:
  DOMAIN + "/success.html?session_id={CHECKOUT_SESSION_ID}",
```

で、DOMAIN は

```
var DOMAIN = window.location.hostname;
```
 console で見てみると

```
window.location.hostname
"localhost"
```
プロトコルないですね

# workaround

```
var DOMAIN = "http://" + window.location.hostname;
```
無事にうごきました

# おまけ
successUrl に遷移しようとしてまたエラーになるので、こっちのほうがいいかもしれません

```
var DOMAIN = "http://" + window.location.hostname + ":4242";
```
エクセルVBAでのTryCatchFinally

# エクセルVBAにTryCatchはない
エクセルVBAには、他言語にあるようなtryCatchFinallyは無いが、VBA自体の例外処理を使って、擬似的にTryCatchFinallyを表現できる。

# TryCatchFinallyのやり方
まずはコードから

```vb:TryCatchFinallyDemo
Sub TryCatchFinallyDemo()
    On Error GoTo Catch

    ' エラーが発生する可能性のある処理

    GoSub Finally

Catch:
    ' エラーの処理

    GoSub Finally

Finally:
    ' Finally処理
End Sub
```

#### 説明
On Error GoToはエラーが発生した時、ラベルの位置に処理が移るため、Tryと同義になります。
ちなみに、ラベルに0を指定すれば、直前に指定したOn Error GoToを無効化できるため、Tryブロックでコードを囲むといったことができるようになります。

```vb
On Error GoTo [ラベル]
```

On Error GoToで指定したラベルで例外処理をします。いわゆる、Catchの役割です。

```vb
Catch:
    ' エラーの処理
```

Finallyラベルでは、例外の有無に関わらず行いたい処理を書きます。
Finallyが必要でない場合も必ずラベルは書くようにしてください。理由は後述します。

```vb
Finally:
    ' Finally処理
```

今回の肝となる部分がGoSubです。
VBAのラベルは、あくまでも目次的なものであり、直前にExit Subなどを記載していない場合、実行されてしまいます。
そのため、処理の最後とCatchラベルの最後には必ず下記のコードを挿入してください。
そして、Finallyラベルは必ずEnd Subの直前に書いてください。
こうすることで、例外の有無に関わらず、Finallyラベル以下が実行されます。

```vb
GoSub Finally
```

# 最後に
もし、誰かの役に立てたなら幸いです。
PyTorch RPC を参考にしてレンダリングで非同期分散計算したいメモ

PyTorch 1.4 から RPC で非同期で分散計算(動的にノードが削除, 追加もサポート?)できるようになってきました.

https://pytorch.org/docs/stable/rpc.html

レンダリング(レイトレーシング)でも MPI や TCP/IP, RDMA で分散計算はよくやりますが, 非同期だったり動的というのはあまり考えられていません(TCP/IP が固定である. 各ノードの CPU の性能に差がある, GPU レンダリングするときに, GPU の個数がノードごとに異なる, etc.). 

今後の高まるレンダリング需要を見越して, PyTorch RPC の仕組みを流用できないか考えてみます.

## rpc backend

https://pytorch.org/docs/stable/distributed.html#torch.distributed.init_process_group

pytorch rpc では, バックエンドとして `mpi`, `nccl`, `gloo` があります.
ここで mpi と rccl は概ね同等かなと思います. 動的分散対応は pytorch 側(実質 c10d?) でやるのでしょうか.

https://github.com/pytorch/pytorch/tree/master/torch/lib/c10d

c10 は謎のコンポーネントです(https://github.com/pytorch/pytorch/issues/14850). それの distributed 版なので c10d でしょうか.

## gloo

https://github.com/facebookincubator/gloo

redis(hiredis 経由)でノードの管理や mpi っぽい通信などやるライブラリのようです. gloo 自体がさらにバックエンドとして mpi, nccl に対応しています.

通信は一段抽象化されて, backend に TCP/IP か InfiniBand(RDMA)を選択できます.

したがって, c10d と gloo あたりを参考にすればよさそうです.

## 知見

c10d + gloo を参考に, etcd(http) or redis + ピア同士バイナリ通信は websocket で, より web 標準のやりyかたで非同期分散計算する仕組みをつくれそう.
C++ 動的計画法（DP）

#問題 1　最大和問題
n個の整数 a[0],a[1],…,a[n−1]が与えられる。これらの整数から何個かの整数を選んで総和をとったときの、総和の最大値を求めよ。また、何も選ばない場合の総和は 0 であるものとする。
【制約】
・1≤n≤10000
・−1000≤a[i]≤1000

```c++
#include <iostream>
#include <algorithm>
using namespace std;

// 入力
int n;
int a[10010];  // 最大10000個ですが、少しだけ多めにとります

// DP テーブル
int dp[10010];


int main() {
    cin >> n;
    for (int i = 0; i < n; ++i) cin >> a[i];

    dp[0] = 0;//何も選んでいない初期状態
    for (int i = 0; i < n; ++i) {
                  //max(a[i]を選ばない,a[i]を選ぶ)
        dp[i + 1] = max(dp[i], dp[i] + a[i]);
    }

    cout << dp[n] << endl;
}
```
#～解法～
dp[0]=何も選ばない状態
dp[1]=0番目までの整数（a[0]のみ）の中から整数を選んで総和をとったときの、総和の最大値
dp[2]=1番目までの整数(a[0],a[1])の中から整数を選んで総和をとったときの、総和の最大値
.....
dp[i+1]=i番目までの整数（a[0],...a[i]）の中から整数を選んで総和をとったときの、総和の最大値
***求める値は、dp[n]となる！***

#問題 2　ナップサック問題
n個の品物があり、i番目の品物のそれぞれ重さと価値が weight[i],value[i]となっている (i=0,1,...,n−1)。
これらの品物から重さの総和が Wを超えないように選んだときの、価値の総和の最大値を求めよ。

【制約】
・1≤n≤100
・weight[i],value[i]は整数
・1≤weight[i],value[i]≤1000
・1≤W≤10000

```c++

#include<bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(n); i++)
using namespace std;
using ll = long long;
const ll INF = 1e9 + 7;

int dp[110][10010]={0};
int main(){
    int N,W; cin >> N >> W;
    int value[110],weight[110];
    for (int i=0; i<N; i++) cin >> value[i] >> weight[i];

    for (int i=0; i<N; i++){
        for (int j=0; j<=W; j++){
            if (weight[i]<=j) dp[i+1][j]=max(dp[i][j-weight[i]]+value[i],dp[i][j]);
            else dp[i+1][j]=dp[i][j];
        }
    }
    
    int ans=0;
    for (int i=0; i<N+1; i++){
        for (int j=0; j<=W; j++){
            ans=max(ans,dp[i][j]);
        }
    }
    cout << ans << endl;
}
```
#～解法～
***dp[i+1]=i番目までの中から選んだ時の価値の総和の最大値***
と一問目は考えたが、
これだと、あるa[i]を加えた時に***重さがWを超えてしまうのかどうかがわからない！***
そこで、**2次元配列化**して
***dp[i+1][w]=i番目までの品物の中から重さがWを超えないように選んだ時の、価値の総和の最大値***
一番理解に苦労したコードはこれ！

```c++
if (weight[i]<=j) dp[i+1][j] = max(dp[i][j-weight[i]] + value[i], dp[i][j]);
```

最初は、
なんでdp[i]**[j-weight[i]]**の処理をしているのか分からなかったが、後に***バッグにあるお菓子weight[i]を入れられる条件の下で、最大の価値をもっているバッグを指定していることが分かった！***
railsサーバーをWindows10で動かしてみる

#はじめに

railsサーバーをWindows10環境にインストールして立ち上げてみるのに結構な労力がひつようになるので備忘録として書いておく件

##railsをインストール

とにかくインストールしてみないと話にならないのでインストール。
ここは割愛。

##newしてみる

任意のディレクトリにサーバーとしてのディレクトリを作成（してもらう）にはnewする必要がある。

```

rails new test_app

```

apache等でウェブサーバーを立ち上げていた場合、ウェブデータを置く場所にディレクトリを移動して上記コマンドをコマンドラインで入力。
test_appというディレクトリが作成されてrailsサーバーに必要なデータが入っていくわけだけど…

```

rails s

Usage:
  rails new APP_PATH [options]

（割愛）
```

これでサーバーを立ち上げてみようとすると上記の表示になって動いてくれない。

これは解決法がすぐ見つかる。

https://qiita.com/Leone/items/dc7f8ef2d5329d297e72

ということでGitをインストールするとよい。

さて、ではこれでサーバーを立ち上げてみようとすると今度は

```

Could not find gem 'sqlite3 x64-mingw32' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.

```

こんな感じの表記になって今度はSQLite3関係のエラーが出てしまう。

##SQLite3周りを整える

これは結論から言うと

```

gem install sqlite3 --version 1.4.2

```

とバージョンしていしてインストールしてあげるとヨイヨイ
ƪ(•◡•ƪ)"ょぃょぃ

これで大丈夫のはずなのでbundle installしてあげるとエラーもなく終了してくれる…はず。

##サーバーを動かす

ところが、これでも動かない

```

Please run rails webpacker:install Error: No such file or directory @ rb_sysopen - /home/ubuntu/environment/test-app1/config/webpacker.yml (RuntimeError)

```

さっきのbundle installで上記エラーがでる。
なのでwebpackerをインストールしてあげようとしたんだけど、今度はyarnとNord.jsがないというエラーが出るので、どちらもインストールしてあげる

https://legacy.yarnpkg.com/ja/
https://nodejs.org/en/

順番はどちらでもいいし、オプションはそのままで動く。
コマンドプロンプトは立ち上げ直して上げないとパスが通らないので注意。

両方ともインストールしたらコマンドプロンプトを立ち上げて、先ほどのディレクトリに移動後

```

rails webpacker:install


```

を実行。
これは…ちゃんと入ってくれるはず。

ということで

```

rails s

```

と入力すると

```

=> Booting Puma
=> Rails 6.0.2.1 application starting in development
=> Run `rails server --help` for more startup options
*** SIGUSR2 not implemented, signal based restart unavailable!
*** SIGUSR1 not implemented, signal based restart unavailable!
*** SIGHUP not implemented, signal based logs reopening unavailable!
Puma starting in single mode...
* Version 4.3.1 (ruby 2.6.5-p114), codename: Mysterious Traveller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://[::1]:3000
* Listening on tcp://127.0.0.1:3000
Use Ctrl-C to stop

```

となって上記のURLでサーバーが立ち上がっているのが確認できる。

windows10でのruby on railsはサーバー立ち上げに「はまる」んで結構注意が必要みたいです。
git bashで2つのブランチ名を指示するだけで差分をzipしてくれるやつ

初投稿です．

n番煎じネタですけど，gitやshellを勉強中なので，個人的なメモとして残しておきます．
環境はWindowsを想定しています．

**git bash**では2つのブランチ間の差分ファイルをリストアップする`git diff`コマンドと，ファイルリストをzipに固めてくれる`git archive`コマンドがあります．
それらを組み合わせつつ，タイトルが日付のzipになるようにして，ついでにそれを`~/.bashrc`で関数化して，簡単に呼び出せるようにします．

`C:/Users/<ログオンユーザー>/`に`.bashrc`ファイルを作り，以下を書き込みます．

``` shell:~/.bashrc
function gitexport() {
  #引数チェック
  if [ -z "$1" -o -z "$2" ]
  then
    return
  fi
  COMMIT1=$1
  COMMIT2=$2
  #日付を取る
  NOWDATE=`date +%Y%m%d`
  #コミット間の差分リスト
  EXPORTFILES=`git diff --name-only --diff-filter=d $COMMIT1 $COMMIT2`
  #zipにする
  git archive $COMMIT1 --format=zip -o $NOWDATE.zip --prefix=$NOWDATE/ $EXPORTFILES
}
```

実行するには**git bash**で次のように指示します．

``` shell
$ gitexport V1.0.0 V0.9.0
```
> gitexport <新しいほうのコミット名> <古いほうのコミット名>
PHPの基礎知識整理

なんぞやについて

# PHPについて
HTMLに埋め込むことができる、Web開発でよく使用されるスクリプト言語

当初の名称は「Personal Home Page Tools」
個人の履歴書を公開する為の簡易ツール

### PHPとHTML・Javascriptの違い
PHP：**サーバサイド**で**動的**にWebページを生成
HTML：**静的**にWebページの表示
JS：**クライアントサイド**で**動的**にWebページを生成
→ どのようなコードが書かれているのか、誰でも見ることができる

PHPはサーバサイドであるため、サーバー側にあるMySQLなどのデータベースと連携することが可能

### できること
・HTMLソースコードを生成
→ HTMLの一部分のみPHPで生成することができる（後述）
・データベースと連携
・クライアントから送信された情報を受け取る
・ファイル操作
・API連携
・バッチ処理
・WordPress[^2]のカスタマイズ

### 作れるもの
・お問い合わせフォーム
・予約サイト
・検索機能
・ログイン機能
・ECサイト
・SNS
・グループウェア
・社内管理システム全般

### 書き方
```php:sample.php
<!DOCTYPE html>
<html>
    <head>
        <title>基本的なPHPの書き方</title>
    </head>
    <body>

        <?php
            echo "HELLO WORLD";
        ?>

     </body>
</html>
```
クライアントサイドでソースを確認すると、
`<?php echo "HELLO WORLD"; ?>`の部分は**`HELLO WORLD`**しか表示されない

また、繰り返しなどの処理もHTML内に書くことができる

```php:sample.php
<!DOCTYPE html>
<html>
    <body>

        <?php if ($a == $b): ?>
            echo "HELLO WORLD";
        <?php else: ?>
            echo "BYE";
        <?php endif; ?>

     </body>
</html>
```


# 参考
1. [超初心者向け！PHPでできること12選まとめました | エンジニアの入り口](https://eng-entrance.com/what-can-php-do)
2. [今さら聞けない！PHPとは【初心者向け】 | TechAcademyマガジン](https://techacademy.jp/magazine/6618)
3. [PHPとは？基礎知識、できることを初心者にもわかりやすく解説します | カゴヤのサーバー研究室](https://www.kagoya.jp/howto/wordpress/php/)
Tesseractのデフォルトのモデルの学習用データについて

#背景
今学生研究で調べものをしていて、メモしておきたい内容だったので記事にまとめておきます。
※自分用のメモなのでしっかりした情報が欲しい人は自分で調べたください。

タイトルが結構意味わからないと思いますが、Tesseractで使用しているjpn_best.traineddataとかって何を学習させているのかな？
って疑問が沸いてきたので、lstmベースでのモデルにおいて、jpn_bestでは何を学習対象にしていたのかについて書いておきます。
#結論
フォントベースのテキスト行をlstmベースのモデルに学習させている。
しかし、その内訳は私はわかりませんでした。

ちなみに、この記事を見て言っています。

参考文献：[LSTM training details for different languages and scripts](https://github.com/tesseract-ocr/tessdata_fast#lstm-training-details-for-different-languages-and-scripts)

この記事によると、

>
For Latin-based languages, the existing model data provided has been trained on about 400000 textlines spanning about 4500 fonts. For other scripts, not so many fonts are available, but they have still been trained on a similar number of textlines. eg. Latin ~4500 fonts, Devanagari ~50 fonts, Kannada 15.

との事で、ラテン語ベースの言語では40万行（4500種のフォントが含まれている）を学習しているみたいですね。
そして、その他の言語（日本語もここに含まれる）も同様の行数分学習しているらしいです。が、そんなにたくさんのフォントには対応していない。
例えば、Devanagari（インドの文字）では50フォント、Kannada（ドラヴィダ語族の中でもっとも古い言語の一つ？らしい）では15フォント学習データに含まれているらしい。

まあとにかく、どの言語においても40万行のフォントを学習させているって事ですね。ちなみに、
>
Japanese contains all the languages that use that script (in this case just the one) PLUS English.The resulting model is trained with a mix of both training sets, with the expectation that some of the generalization to 4500 English training fonts will also apply to the other script that has a lot less.

との事なので、日本語のデータは英語と日本語どっちも混ぜて学習させているみたいです。

また、現在（2020年1月24日）時点でまだ学習途中らしいです。

以上！間違いとか指摘があったらコメントで教えてくださるとありがたいです。
Effective c++ 読書メモ

# はじめに
C/C++を学び始めて一年にも満たない専門学生です。
Effective C++を読んだ記録を残すために細かくわかりやすくまとめていきます。
記事を書くのは初めてなので文章がおかしいところが多いです。
コードのことに触れている２項から書いていこうと思います。

# #define

\#defineは文字列の置換を行うマクロです。
置換されてからコンパイルされます。

```
#define MAX_A 100+20
#define Square(b) (b*b)

void Func()
{
 //MAX_Aが100に置換される
 int a = MAX_A;
 //Square(4)が(4*4)に置換される
 int b = Square(4);
}
```

#defineを使うことによる問題

\#defineは些細なミスや使われ方によって意図しない動作をすることがあります。

### 例1

```
#define MAX_A 100+20

void Func()
{
 //120*5でなく100+20*5
 int hp = MAX_A * 5;
}
```

このようなコードの時、
掛け算から先に行われるので
aは

- 期待値　  120 * 5 = 600
- 計算結果 100 + 20 * 5 = 200

となり期待値とは異なる値になります。

### 例2

```
#define Square(b) (b*b)

void Func()
{
 int value;
 int b = Square(++value);
}
```
このようなコードの時、
(++value * ++value)と置換されるので二回インクリメントされます。

### 例3

\#defineでマクロを定義すると#undefをしない限りソースの中では使うことができるので「privateな#define」がなく、カプセル化できないです。

```
class　Class
{
 private:
 #define MAX_A 100 + 20 
}

void Func()
{
 int a = MAX_A;//エラーが出ないのでカプセル化できていない
}
```
※まずこんなコードを書くのは間違っていますが...

# 解決策

const,enum,inlineを使おう

### 例1
const,enumで定数を宣言することによって解決することができる。

( )をつけることによっても解決できますが、( )をつけることに注意していてもミスする可能性はあるので使わなければ注意する必要もミスをすることもありません。

```
#define MAX_A (100 + 20)
```

#### const

```
//MAX_Aは定数
 const int MAX_A = 100 + 20;

void Func()
{
 int a = MAX_A * 5;
}
```

#### enum

enumはintとして扱うことが可能なので下のように使うことができます。
これを「enumハック」といいます。


```
//MAX_Aは定数
enum {MAX_A = 100 + 20};

void Func()
{
 int a = MAX_A * 5;
}
```


## 例2

inlineを使うと解決できます。
Effective　C++ではtemplateを使うことによってどんな型でも使えるようにしています。

#### inline

inlineは処理を高速化するための修飾子です。
inlineをつけた関数はインライン関数と呼ばれ、関数の呼び出し部分がインライン関数の内容に置換されて処理が高速化されます。


```
inline int Square(int b)
{
 return b*b;
}

void Func()
{
 int b = Square(++value);
}
```

## 例3

これでカプセル化できます。

```
class　Class
{
 private:
     //staticでインスタンスを一つにする
     static const int MAX_A = 100 + 20;
}
```
AWSのストレージにフラッシュコピー的な機能があるか聞かれた時の回答

# はじめに
以前、オンプレ（IBM）からクラウドへの移行を検討しているお客様との打ち合わせに参加した際、「AWSにもフラッシュコピー（ディスクのスナップショット）ってあるんだっけ？」と聞かれて、EBSのスナップショットがあるのは知っていたものの、それがフラッシュコピーと同じくオンラインで取れるかどうかが曖昧だったことを今になって急に思い出したので、備忘録がてら調べました。

# 結論としてはありました
[EBSのスナップショット](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/EBSSnapshots.html)

[よくある質問(EBSのFAQ)](https://aws.amazon.com/jp/ebs/faqs/)

>Q: スナップショットをとるために、ボリュームをアンマウントする必要がありますか?
>いいえ。スナップショットはボリュームがアタッチされ使用中の状態でもリアルタイムで実行できます。ただし、スナップショットは、お客様の Amazon EBS ボリュームに対して記述されたデータのみを捕捉します。
付帯事項はあるものの、要は「ディスクに書き込まれていないと保存されないよ」ということで、オンプレのストレージも同じですね。
始めてWebサイトを作成した時にお世話になった記事

# 初めに
プログラミングを始め、初めてWebサイトを作成した時に自分がお世話になった記事をここにあげます。
もし自分と同じようなところで悩んでいるところがあれば、参考にしていってください。

#参考にした記事一覧

**環境構築編**
[WindowsでPHP/Apache環境構築(ダウンロード～画面を起動するまで)](https://qiita.com/uriuri7610/items/df6a05ed27b65fde499c)
なぜか自分のパソコンにxamppがダウンロードできなかったので、この記事を参考にApacheサーバーを入れました。

**CSS編**
[サルワカ　ChromeでCSSが反映されない？キャッシュ消去で対処](https://saruwakakun.com/it/web/google-chrome)
CSSの変更がブラウザになかなか反映されないという問題がこれで解決しました。

**JavaScript編**
[JavaScriptに"Maximum call stack …"で怒られた1例と解決までにやったこと](https://foolean.net/p/990)
Google ChromeのデベロッパーツールのPerformanceを使ったエラーの検出方法、Maximum call stack というエラー文の意味について知ることができました。

[Samurai Blog【JavaScript入門】誰でも分かるPromiseの使い方とサンプル例まとめ！](https://www.sejuku.net/blog/52314)
実際のWebサイトには実装しませんでしたが、JavaScriptの関数を非同期で使用する方法について学べました。

**PHP編**
[【PHP】HTMLSPECIALCHARS関数でエスケープ処理をしてください【XSSの防止】](https://www.leon-tec.co.jp/blog/yoshida/8214/)
利用者の入力情報のエスケープの方法について学ぶことができました。

[Qiita PHPオブジェクト指向入門（前半）](https://qiita.com/mpyw/items/41230bec5c02142ae691#%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A8%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E4%B8%8A%E7%B4%9A)
本だけでは理解しきれなかったPHPの基本について知ることができました。

#終わりに
Webサイトを始めて作成した際にブックマークをつけた記事はもう少し多かったのですが、いくつか消してしまったので7割程度しかあげられませんでした。
Webサイトを作成して思ったことは、自分が悩んでいる問題の解決策を無料で教えてくれる現代のネット環境は素晴らしいな、ということでした。
これからも楽しみながらプログラミングに取り組んでいきたいです。
Compute Engineのvm instanceにbiocondaをインストールする

# Minicondaのインストール
Biocondaをインストールするには、まずAnacondaもしくはMinicondaをインストールする必要があります。
Minicondaのインストールの仕方は以下をご覧ください。
[Compute Engineのvm instanceにMinicondaをインストールする](https://qiita.com/amufaamo/items/29053d5ff70fe478c041)

#Biocondaのインストール
以下のように入力します。

```
conda config --add channels defaults
conda config --add channels conda-forge
conda config --add channels bioconda
```
これでBiocondaがインストールされます。

# 確認
本当にBiocondaが使えるか試してみましょう。
例として、EMBOSSをインストールしてみます。

```
conda install emboss
```

以下のように表示されればOKです。

```
Collecting package metadata (current_repodata.json): done
Solving environment: done


==> WARNING: A newer version of conda exists. <==
  current version: 4.7.12
  latest version: 4.8.1

Please update conda by running

    $ conda update -n base -c defaults conda



## Package Plan ##

  environment location: /home/masakazu_ishikawa/miniconda3

  added / updated specs:
    - emboss


The following packages will be downloaded:
```
Compute Engineのvm instanceにMinicondaをインストールする

#インストーラーのダウンロード
インストーラーは以下にあります。
https://docs.conda.io/en/latest/miniconda.html
今回はVM instanceなのでLinux用のものをインストールします。

```
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
```

#インストール
ダウンロードしたインストーラーを実行します。

```
sh Miniconda3-latest-Linux-x86_64.sh
```

そうすると以下のような画面が表示されます。

```
Welcome to Miniconda3 4.7.12
......
```
エンターを押しまくりましょう。
以下のような画面になると思います。

```
In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue
>>> 
Please answer 'yes' or 'no':'
```
そしたら、yesをタイプしましょう。


次にこのような画面になります。

```
Miniconda3 will now be installed into this location:
/home/NAME/miniconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below

[/home/NAME/miniconda3] >>>
```
インストールする場所を聞かれているので、そのままでよければエンターを押します。

最後にこのような画面になったら、またyesと入力します。

```
Do you wish the installer to initialize Miniconda3
by running conda init? [yes|no]
[no] >>> 
```

（推奨）condaのディレクトリにpathを通しておきます。

```
export PATH="$PATH:/home/NAME/miniconda3/bin"
```

これで、インストール完了ですが、**ここでいったんターミナルを閉じて、シェルを再起動する**必要があります（重要）。

再起動後、「conda」と入力して以下のようになればOKです。

```
$ conda
usage: conda [-h] [-V] command ...

conda is a tool for managing and deploying applications, environments and packages.

Options:

positional arguments:
  command
    clean        Remove unused packages and caches.
    config       Modify configuration values in .condarc. This is modeled
                 after the git config command. Writes to the user .condarc
                 file (/home/masakazu_ishikawa/.condarc) by default.
    create       Create a new conda environment from a list of specified
                 packages.
    help         Displays a list of available conda commands and their help
                 strings.
    info         Display information about current conda install.
    init         Initialize conda for shell interaction. [Experimental]
    install      Installs a list of packages into a specified conda
                 environment.
    list         List linked packages in a conda environment.
    package      Low-level conda package utility. (EXPERIMENTAL)
    remove       Remove a list of packages from a specified conda environment.
    uninstall    Alias for conda remove.
    run          Run an executable in a conda environment. [Experimental]
    search       Search for packages and display associated information. The
                 input is a MatchSpec, a query language for conda packages.
                 See examples below.
    update       Updates conda packages to the latest compatible version.
    upgrade      Alias for conda update.

optional arguments:
  -h, --help     Show this help message and exit.
  -V, --version  Show the conda version number and exit.

conda commands available from other packages:
  env


conda config --add channels defaults
conda config --add channels conda-forge
conda config --add channels bioconda
C++で動的型を作成してみた

#型推論でなく動的型を作ってみた。
```dynamic.hpp
#include<string>
#include<Windows.h>
class Dynamic {
public:

	Dynamic() {
		this->Value = nullptr;
		this->Size = 0
	}

	~Dynamic()
	{
	}

	template<typename T>
	void set(T value_t)
	{
		this->Size = sizeof(value_t);
		this->Value = (&value_t);
	}

	template<typename T> T get(void) 
	{
		return *((T *)this->Value);
	}

private:
	HANDLE Value;
	size_t Size;
};
```
```main.cpp
include<iostream>

include"dynamic.hpp"

int main(void){
	Dynamic d;
	d.set<char*>("123");
	auto s = d.get<char*>();
	d.set<char>('5');
	auto c = d.get<char>();
	d.set<int>(8);
	auto i = d.get<int>();
	d.set<float>(3.141592);
	std::cout<<i<<endl<<s<<endl<<c<<endl<<d.get<float>()<<endl;//output->"123 \n 5 \n 8 \n 3.141592"
}
```
今回の反省は難しい型になると途端に使えなくなることでしょうか、あと前に入れた型をわざわざ覚えておかないといけないのでそこが大変だった。型の記録ができる便利なものがあれば教えて頂きたいです。汎用ポインタはできないことがないけどとても危険で簡単にコンピュータ自身を壊してしまうので、JavaやC#のようなObject型があれば少々は安全なのにそれができないのも残念。
[Swift]アクセスレベル

今回はアクセスレベルについて書いていきたいと思います📝
よく変数や関数の前にPrivateといったのを見たことはありませんか？それの事です😎

対象はSwift5です。
公式ドキュメントは[こちら](https://docs.swift.org/swift-book/LanguageGuide/AccessControl.html)


##アクセスレベルとは
簡単に言うと宣言した変数やメソッドなどを何処でも使えるようにするか、又は制限した範囲でのみ使用可能にするか設定することです。

全部で5つあり、それぞれ特徴があります。

| アクセスレベル         | 説明              |
|:--------------------|:------------------|
| Private             |宣言したコードブロック内でのみアクセス可能（これの中→{}）               |
| FilePrivate           |宣言されたファイル内でのみアクセス可能 |
| Internal             |アプリのモジュール内でアクセス可能（デフォルトはこれで、設定しなかったら自動でInternalになる） |  
| Public               |他のモジュールへのアクセスが可能になるが、継承やオーバーライドは不可 |
| Open             |継承もオーバーライドも可能になる、つまり何でもできる|


##なぜアクセスレベルを使うのか
アクセスレベルを設定しないとデフォルトでInternalになるので、モジュール内でアクセス可能になってしまいます。
モジュール内で使うことを想定しているのなら問題ないのですが、特定の処理に使うことを想定した変数やメソッドを関係無いところで使われるのは問題です😱
それを防ぐためにアクセスレベルを設定し、意図しない利用を防ぎます！🙅‍♂️

このアクセスレベルはいつでも変更が可能なので、初期段階で利用範囲が決まっていないのなら、基本的にPrivateで設定して置くのが無難です。
利用範囲が大きくなったタイミングで段階的にアクセスレベルを広げていきましょう！🙆‍♂️
[Python] csvファイルの区切り文字をタブ区切りに変換

###やりたいこと
- csvファイルの区切り文字をタブ区切りに変換したい
- ファイル中に住所等、カンマが含まれている場合にタブ区切りにした方が後続処理（例えばDBに取り込む等）がしやすくなる

###ポイント
~~- csvモジュールをimportして使うと簡単~~  
~~呼び出し側のプログラムの方でcsvモジュールをimport~~

- defのファイルの最初でcsvモジュールをimport
- with openで対象ファイルの読み書きを行う
- 対象ファイルをカンマ区切りで読み込んで、タブく区切りで書き出す
　→ 対象ファイルに上書きされる
- ```csv.reader```を使って読み込んだら、行単位で配列に格納する
- 書き込みは↑で読み込んだ配列を```writer.writerrows(配列名)```で一気に書き出す
　1行づつ書き込みたい時は```writer.writerrow(行列)```で書き出せる

```python:convertTav.py

def CsvToTsv(path):
    
    #読み込み用配列
    line = []

    #読み込み
    with open(path, "r", newline="") as f:
            #読み込みオブジェクト作成（カンマ区切り）
            reader = csv.reader(f, delimiter = ",")
            #読み込み
            line = [row for row in reader]

    #書き込み
    with open(path, "w", newline="") as f:
            #書き込みオブジェクト作成（タブ区切り）
            writer = csv.writer(f, delimiter = "\t")
            #まとめて書き込み
            writer.writerows(line)

```
##追記
読み込みと書き込みでencodeを変換したい場合はopen時にencodingを指定する
（例）読み込み時　Shift-jis, 書き込み時　utf-8

```python:convertTav.py
#読み込み
with open(path, "r", newline="", encoding="cp932") as f:

#書き込み
with open(path, "w", newline="", encoding="utf_8") as f:
```

**Shift-jisではうまくいかず、cp932を指定することでうまくいった**
IntelliJでkotlin not configuredが出たときの対処法

別のSpring Bootのプロジェクトをいじって本業のプロジェクトに戻ったときにでました。
IntelliJさんの上の方に`kotlin not configured`と……。

**な　ん　で　や　！**

## 解決方法

いったんプロジェクトの**.gradle**を削除してgradleメニューからinitを実行したら治りました。

gradle initはGUIからもできます。

画面左下の四角がふたつかさなっているところにカーソルをあてるとポップアップがでるので、そこからGradleをクリック。

![スクリーンショット 2020-01-24 11.47.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486809/ed8292d3-d0ca-e5ca-bf05-f00c089fabc8.png)

そうするとGradleのメニューが出るのでTasks->build setup->initと選んでinitの上で右クリックしてRunをおせばOK!

![スクリーンショット 2020-01-24 11.49.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486809/c5817875-fbb9-85eb-f9c4-e6562ffdfc24.png)


ちなみにぐぐると[kotlin not configuredの解決方法](http://hanahanahunachi.hatenablog.com/entry/2017/12/17/005604)という記事が出てきて、Kotlinプラグインを消して入れ直せばいいとありました。ですが現在の自分のバージョン（ULTIMATE 2019.3）ではKotlinプラグインは**Disable**にはできても削除できなかったのんな。


ということでした。おつかれさまです :beer:
【備忘録】vue-cliインストールしてベースプロジェクトを作る

# 概要
久しぶりにVue.jsで新しくアプリを作ろうと思い立って、
```vue-cli``` 使ってベースのアプリを作ろうと思ったら手順を完全に忘れていた。

今後のためにも、備忘録を作っておこうと思う。

# 環境
* vue-cli 4.1.2

## vue-cliインストール（グローバル）
```sh
# インストール実行
npm install -g @vue/cli

# インストール成功したか確認
vue --version
# @vue/cli 4.1.2
```

## プロジェクト作成
```sh
# プロジェクト作成実行
vue create gtd_mock

# https://npm.taobao.org/ というnpmのミラーサーバーを利用してよいか？という内容
# 調べるとこれが原因でこける事例もあるので、使わない設定にした
?  Your connection to the default npm registry seems to be slow.
   Use https://registry.npm.taobao.org for faster installation? No
```
```sh
Vue CLI v4.1.2
# プラグイン設定
# babel,eslint のみのデフォルト設定かマニュアル設定をするか？という内容
# Vue-Routerなど利用したかったので、マニュアル設定
? Please pick a preset: Manually select features
? Check the features needed for your project: Babel, TS, Router, Vuex, CSS Pre-processors, Linter

# TypeScript 利用時に、コンポーネントをクラスで定義する構文を利用する設定
? Use class-style component syntax? Yes

# BabelをTypeScriptにも適用
? Use Babel alongside TypeScript (required for modern mode, auto-detected polyfills, transpiling JSX)? Yes

# Vue-Router の historyモードは利用しない
? Use history mode for router? (Requires proper server setup for index fallback in production) No

# 使用するCSSプリプロセッサの指定
? Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by default): Sass/SCSS (with dart-sass)

# lint と formatter の指定（ESLint + Prettier）
? Pick a linter / formatter config: Prettier

# ESLintの追加設定
? Pick additional lint features: Lint on save

# 設定内容をpackage.jsonにまとめるか、別ファイルに分けるか
? Where do you prefer placing config for Babel, ESLint, etc.? In dedicated config files

# 今回の設定を保存するか（次回作成時のため）
? Save this as a preset for future projects? Yes

```
```sh:作成時ログ（正常終了）
Vue CLI v4.1.2
✨  Creating project in C:\develop\repo\gtd_mock\gtd_mock.
⚙  Installing CLI plugins. This might take a while...


> yorkie@2.0.0 install C:\develop\repo\gtd_mock\gtd_mock\node_modules\yorkie
> node bin/install.js

setting up Git hooks
can't find .git directory, skipping Git hooks installation

> core-js@3.6.4 postinstall C:\develop\repo\gtd_mock\gtd_mock\node_modules\core-js
> node -e "try{require('./postinstall')}catch(e){}"


> ejs@2.7.4 postinstall C:\develop\repo\gtd_mock\gtd_mock\node_modules\ejs
> node ./postinstall.js

added 1155 packages from 836 contributors and audited 32980 packages in 123.389s
found 0 vulnerabilities

🚀  Invoking generators...
📦  Installing additional dependencies...

added 84 packages from 69 contributors and audited 35404 packages in 31.178s
found 0 vulnerabilities

⚓  Running completion hooks...

📄  Generating README.md...

🎉  Successfully created project gtd_mock.
👉  Get started with the following commands:

 $ cd gtd_mock
 $ npm run serve
```

## ※プロジェクト作成（GUI）
以下のコマンドを実行することで、GUIでプロジェクト作成するWeb画面が立ち上がる（コマンドでやるより簡単）

```
vue ui
```

## プロジェクト起動
```sh
# プロジェクト作成時のログの最後に出力されるコマンド
cd gtd_mock

npm run serve
```
### 起動後の画面
![2020-01-24_12h42_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220144/2029ee64-56b2-849e-376c-9eddf5967a5f.png)

# まとめ
あまり頻繁にやらないので、ふとやろうと思った時に忘れてしまっていた。
こんなことを避けるためにも備忘録として残すように習慣づけたい。。。
LinuxサーバにGitの最新バージョンを導入する

# はじめに

- Linuxで（Linuxに限らずだけれど）Gitをパッケージインストール（yum install gitなど）すると，古いものしか入らない．
- バージョンアップしやすい形で最新版をインストールする方法を記述する（他の人も同じこと書いてるけれど，参照しやすいように）．
- 参考サイト
    - http://www.task-notes.com/entry/20150622/1434942000

# 作業の手順

```
# 事前に時刻合わせをしておかないとエラーになる可能性がある

# 依存ライブラリをインストール
sudo yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker gcc

# Gitをインストール（今回はここで入れたgitは後でアンインストールする）
sudo yum -y install git

# rootにスイッチ
sudo su -

# 以下の作業はすべてrootで実行．

# ソースディレクトリまで移動
cd /usr/local/src/
# 公開されているgitのソースをインストール（この作業のために上記でGitをインストールした）
git clone git://git.kernel.org/pub/scm/git/git.git

# パッケージインストールしているgitをアンインストール
yum remove git

# ディレクトリ移動
cd git

# makeする
make prefix=/usr/local all
make prefix=/usr/local install
```

これ以降、最新バージョンが公開されるたびに、git pullしてmake～すれば最新バージョンにアップデートできる．
Linux環境でnodebrewをインストールしてyarnを使えるようにするまで（メモ）

# はじめに

- 手元でドキュメントとしてはまとめていたけれど，情報共有するのに少々不便だったので，メモ的なレベルで記載．
- ほぼどこかで調べた情報なので，探せば似たような話はいっぱいある．

# nodebrewとは

- nodebrewは，node.jsのバージョン管理ツールで，phpにおけるphpenvやrubyにおけるrbenvなどのようにnode.jsのバージョンを気軽に切り替えられるようになる（もちろん，バージョンを切り替えたら依存パッケージも切り替わるので，それぞれのバージョンで管理が必要）
- node.jsはバージョンの更新が多かったりもするので，使っておくと便利かも．（私見です．間違っていればご指摘ください）
- Windowsの場合nodebrewは利用できないが，代わりにNodistというものがある．

# なぜyarnなのか

- 単なる好み．
- npmのみを使う場合と比べて，コマンドが個人的に扱いやすかったという事情があり，自分が主導できるプロジェクトでは利用している．
- [この辺](https://qiita.com/jigengineer/items/c75ca9b8f0e9ce462e99)に良さそうな比較をしてくれている人がいる．yarnを選択する際に非常に助かった．

# yarnをインストールするまで

## 1. Linuxへのnodebrewのインストール方法

- 簡単

```
curl -L git.io/nodebrew | perl - setup

# ~/.bashrcに追記
export PATH=$HOME/.nodebrew/current/bin:$PATH

# 設定反映
source ~/.bashrc
```

これだけ．

```
nodebrew help
```

などのコマンドできちんと表示されていれば問題なし．

## 2. node.jsをインストール

- これも簡単

```
nodebrew install-binary [バージョン番号]

nodebrew use [バージョン番号]
```

- 利用できるバージョンは， nodebrew ls-remote で確認できる．
- また，インストール済みのバージョンは nodebrew ls
- npmのインストールチェックは， npm -v などで確認．

## 3. yarnをインストール

```
npm -g install yarn
```

これだけ．

## 4. 最後に，yarnでglobalに入れたパッケージにアクセス出来るようにする．

- ~/.bashrc に以下を追記しておく．

```
export PATH="$PATH:`yarn global bin`"
```

以上で完了！！

# 最後に

- Vagrantだとちらほら問題があったりもするらしいけれど，そういう話はまたいずれ．（探せば色々出てくる）
UniRxでダブルクリック判定を3種類の方法で書いてみる

UnityのUniRxは便利ですし、ネットの記事を読むことで基本的な事は理解できるでしょう
しかし、いざ応用するとなるとなかなか感覚を掴めません

そこで、ダブルクリック判定は、UniRxの扱いを入門するのにちょうどいいものだと思い、
UniRxによるシングル、ダブルクリック判定法を3つ書いてみました

今回実装するダブルクリック判定の仕様は次のようです
・シングルクリックとダブルクリックをどちらも判定できる
・ダブルクリック時に、シングルクリックは判定しない
・連打時の事も考える

### 準備
まずはクリック判定だけ取っておきましょう

```csharp
var click = this.UpdateAsObservable()
    .Where(_ => Input.GetMouseButtonDown(0));
```

先に言っておきます。シングルとダブルの判定は同じObservable内でbool型で判定します
シングルクリックならfalseを流し
ダブルクリックならtrueを流すことにします

### 1つ目
まずは、ネットで`UniRx ダブルクリック`など検索するといくらか目にする例です

``` csharp
var dClick1 = click
    .TimeInterval() // 前のイベントとの時間差
    .Select(v => v.Interval <= TimeSpan.FromSeconds(0.2f))
        // ↑ シングルならfalse、ダブルならtrue
    .Buffer(2, 1)
    .Where(b => !(b[0] && b[1]));
        // ↑ 連打時の判定 (3連打以上は無視)

// 出力
dClick1.Subscribe(b => Debug.Log(b ? "シングルクリック" : "ダブルクリック");
    // ↑ 3項演算子によるシングル、ダブルクリック出力
```

クリックをした時間差で判定する方法ですね
余計に前の状態を`Buffer`で取ってこなくてはいけませんが、UniRx初心者が理解しやすい内容と言えます。
連打時の挙動は、
最初にシングルクリック、次にダブルクリックが流れ、
後はまったく流れないです

### 2つ目
今度はストリームの合成の概念を使います

```csharp
var dClick2 = click
    .ThrottleFirst(TimeSpan.FromSeconds(0.2f))
        // シングルクリック判定の間隔。0.2秒以内に2つ以上流さない
    .SelectMany(Observable.Return(false) // シングルクリックはfalseを流す
        .Merge(click // ダブルクリック判定につなげる
        .Select(_ => true) // ダブルクリックはtrueを流す
        .Take(TimeSpan.FromSeconds(0.2f)).Take(1)));
            // ダブルクリック判定。trueを流す
```

今度は、シングルクリック判定をしたら、シングルクリック判定をやめて
ダブルクリック判定を一定時間するという方法です
・ `Return`により、一旦シングルクリック判定を流し、
・ `Merge`により、ダブルクリック判定につなげます
・ `SelectMany`は
　元々のObservbleにイベントが流れた時に、
　引数に渡したObservableからイベントを取り始めます

`ThrottleFirst`によって、シングルクリック判定を一定時間やめておき、
そのうちに、ダブルクリック判定をしています
判定時間を2回指定しなければいけないので少々気持ち悪いです

連打時の挙動は
シングルクリックとダブルクリックの判定が交互に流れます
素直な挙動です

### 3つ目
```csharp
var dClick3 = click
    .Select(_ => false).Take(1) // シングルならfalse。一つだけ通す
    .Concat(click.Select(_ => true) // ダブルクリックならtrue
        .Take(TimeSpan.FromSeconds(0.2f)).Take(1)) // ダブルクリック判定
    .RepeatSafe(); // 判定が終わったら繰り返し
```

理解の難易度が高いオペレータを使いますが、一番シンプルな実装方法です
僕はこの方法が一番好きです

`Concat`を使っていますがこれは
　直前のObservableがOnCompletedしたら、引数に渡したObservableに切り替える
というものです
また、引数を渡さないこともでき、その場合は
　直前に`Select`で指定したObservableを使う
　　(この場合は一時的に`IObservable<IObservable<T>>`という型になる）
というようになります

シングルクリック判定が起こってから、
ダブルクリック判定をはじめて、
すべて終了すれば `RepeatSafe()`により最初から判定を行う
という感じです
`RepeatSafe()`はOnCompletedが連続で流れれば繰り返しを終了します
~~`Repeat()`なんて使うな！無限ループが怖いぞ！~~

連打時には
シングルクリックとダブルクリックの判定が交互に行われるので
シングルクリックとダブルクリックが交互に出力されます

### 出力
最後にDebug.Logの出力だけ書きます(1つ目のところでもちらっと書きました）

```csharp
var doubleClick = dClick3;
doubleClick.Subscribe(b =>
    Debug.Log(b ? "ダブルクリック" : "シングルクリック");
```

doubleClickにdClick1や2をいれれば、そちらの方の実装を試せます
### 最後
ダブルクリックというのは単純なようですが、
実際に判定を取る事を考えると奥が深い処理です

この記事を書くにあたって、`Concat`を覚えられて良かったです

UniRxはまだまだ学習コストが高いですね
rails install で詰まった話


## 結論この記事を参考にしたら解決

https://qiita.com/amuyikam/items/313bc89c1de320a4257e

こんなエラーが

```
➜  ~ gem install rails
ERROR:  Error installing rails:
	zeitwerk requires Ruby version >= 2.4.4.
```

rubyのバージョンが古かった。


```ruby
➜  ~ ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin18]
```



この記事を参考にrubyのバージョンを 2.4以上にする

https://qiita.com/TAByasu/items/47c6cfbeeafad39eda07


ダメか

```
➜  ~ rails new sample
Rails is not currently installed on this system. To get the latest version, simply type:

    $ sudo gem install rails

You can then rerun your "rails" command.
```


```
# これで解決
hash -r
```


```
➜  ~ rails _5.2.2.1_ new sample
```
OCIのファイアウォール機能の違い

Oracle Cloud Infrastructure(OCI)のファイアウォール機能の設定で少しつまづいたところがありました。

# セキュリティリスト と ネットワークセキュリティグループ
OCIにはセキュリティリストとネットワークセキュリティグループ(NSG)という二つのファイアウォール機能が提供されています。

||セキュリティリスト|ネットワークセキュリティグループ(NSG)|
|:--|:--|:--|
|割当先|サブネット|インスタンス（NIC）やサービスリソース|
|ルールで使用できるソース・宛先|CIDR、サービス|CIDR、サービス、NSG|
|ステートレス・ステートフル|選択可能|選択可能|

普段はAWSをメインで使用しているため、AWSでいうとセキュリティリストはネットワークACL、NSGはセキュリティグループのようなものだと解釈していました。

AWSのネットワークACLはサブネットレベルで制御するステートレスファイアウォール、セキュリティグループはインスタンス（NIC）レベルで制御するステートフルファイアウォールです。基本はセキュリティグループで十分ですが、ネットワークACLをうまく使うことで多層防御を構築することができます。
https://aws.amazon.com/answers/networking/vpc-security-capabilities/

## OCIでは多層防御を提供する機能ではない
OCIでも両方利用することで多層防御を実装できるものと考えていたのですが、実際は異なっていました。セキュリティリストとNSGでは割当先は異なるものの、実際のファイアウォールのルール（セキュリティルール）の適用先はどちらもNICであり、両方のルールが合算されて適用されます。

> セキュリティ・リストはインスタンスの仮想ファイアウォールとして機能し、イングレス・ルールおよびエグレス・ルールで使用可能なトラフィックのタイプを指定します。 各セキュリティ・リストはVNICレベルで適用されます。 しかし、セキュリティ・リスト「サブネット・レベルで」を構成します。つまり、特定のサブネット内のすべてのVNICが同じセキュリティ・リストのセットの対象になります。

先ほどの表に追加するとこうなります。

||セキュリティリスト|ネットワークセキュリティグループ(NSG)|
|:--|:--|:--|
|割当先|サブネット|インスタンス（NIC）やサービスリソース|
|ルールで使用できるソース・宛先|CIDR、サービス|CIDR、サービス、NSG|
|ステートレス・ステートフル|選択可能|選択可能|
|**ルールの適用先**|**NIC**|**NIC**|

AWSに慣れた人がセキュリティリストをネットワークACLと同じものだと勘違いし、イングレスセキュリティルールを0.0.0.0/0で開放してしまうと重大な事故につながる可能性がありますので注意してください。

## どちらをメインで使うか
OCIのドキュメントではNSGの利用を推奨しています。
基本的にNSGを利用し、セキュリティリストは意図しないポート開放を防ぐためにルールなし。一部NSGをサポートしていないサービスのみセキュリティリストで制御する、という形が良さそうに思いました。

## 参考情報
- [セキュリティ・リスト](https://docs.oracle.com/cd/E97706_01/Content/Network/Concepts/securitylists.htm)
- [ネットワーク・セキュリティ・グループ](https://docs.oracle.com/cd/E97706_01/Content/Network/Concepts/networksecuritygroups.htm)
- [セキュリティ・リストとネットワーク・セキュリティ・グループの両方を使用する場合](https://docs.oracle.com/cd/E97706_01/Content/Network/Concepts/securityrules.htm#limits)
Noodl2.0からherokuにデプロイする

最近Noodlと出会ったニアムギ(@NearMugi )です。
[【eLV】2020年の運勢を占う！Noodl新年ハンズオン もくもく会 #4](https://elv.connpass.com/event/157706/)でNoodlの魅力を知りました。
フロントエンジニアじゃない人でも簡単にUIが作れたことに感動です。

今回ハンズオンの延長としまして、herokuにデプロイしてみたことを記事にまとめてみました。

# Noodl2.0について

[公式ページ](https://classic.getnoodl.com/download)だと1.3.1(2020年1月現在)をダウンロードできます。
2.0は"[Noodl2.0ベータ版 に参加しよう！](https://noodl-tokyo.connpass.com/event/160335/)"にて手続きすることでダウンロードできます。
herokuへのデプロイはどちらのバージョンでも同じ手順で出来ました。

# Noodlで何か作ってフォルダへ出力する

今回はハンズオンで作りました"おみくじ"を使います。
右上にある矢印マークをクリックすればプロジェクトを丸ごとフォルダに出力できます。
![noodl2_deploy.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237144/f5fd2719-c6ba-361a-0a2e-cc0143890ffb.png)

こんな感じで出力されます。
※1.3.1だと中身が異なります。が今回は気にせずに・・・
![noodl2_deploy_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237144/8e3ac6b7-a455-d039-3b77-84050cef4211.png)



# phpアプリと思わせる

このままではアプリとしては認識してもらえないので、phpアプリと思わせます。
"[HTMLとJavaScriptで作ったサイトがHerokuにデプロイできねええって時の対処法](https://qiita.com/bitcoinjpnnet/items/ee5b4064279996c4d5ad)"を参考にしました。ありがたいです。
こちらの記事の通り、同じフォルダにindex.phpとpackage.jsonを追加します。

```php:index.php
<?php include_once("index.html"); ?>
```

```:package.json
{}
```

フォルダに追加します。
![noodl2_deploy_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237144/83051aef-9ff2-6864-b1d4-84d6fe47c443.png)


# githubにデプロイ用のリポジトリを作ってherokuと連携させる

herokuへのデプロイはgithubと連携させる方法を選びました。
こちらも他の方がまとめてくれています。"[heroku 初級編 - GitHub から deploy してみよう -](https://qiita.com/sho7650/items/ebd87c5dc2c4c7abb8f0)"です。ありがたいです。

githubにデプロイ用のリポジトリを作り、上記で用意したデータを丸々入れます。
![noodl2_deploy_3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237144/77756d06-aaee-a938-c7a5-905221a73a49.png)

※herokuは[git lfsに対応していません](https://devcenter.heroku.com/articles/git)のでご注意ください。

あとはpushしてエラーがでなければOKです。

# アクセスしてみる

https://[herokuのアプリ名].herokuapp.com/にアクセスすると、スマホからもパソコンからもアプリが起動します！


# まとめ

Noodlもherokuも初めて触ってみたのですが、ここまで簡単に出来るなんてすばらしいです。


何かの参考になれば幸いです。ではでは。

# 参考URL

[HTMLとJavaScriptで作ったサイトがHerokuにデプロイできねええって時の対処法](https://qiita.com/bitcoinjpnnet/items/ee5b4064279996c4d5ad)
[heroku 初級編 - GitHub から deploy してみよう -](https://qiita.com/sho7650/items/ebd87c5dc2c4c7abb8f0)
AWS CodePipeline (CodeCommit + Codedeploy → EC2へデプロイ）

AWS認定学習のためにチュートリアルをやってみたのでメモ。
実際にやってみた方がかなりイメージがわくと思います。



#1.CodeCommit リポジトリの作成#
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d6dc5aae-bfa4-4628-7405-5c23ad9096ff.png)

以下の手順どおりに、git をインストールして、クローンを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/b74eed4a-6dd0-8ca1-8b9a-6e26adfe760d.png)

```
$ sudo yum install git -y

$ git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/MyDemoRepo

$ mkdir tmp
$ cd tmp
```



#2.CodeCommit リポジトリにサンプルコードを追加する#

サンプルコードの準備

```
$ curl -o https://s3.amazonaws.com/aws-codedeploy-us-east-1/samples/latest/SampleApp_Linux.zip

$ unzip SampleApp_Linux.zip -d MyDemoRepo/

$ ls -la MyDemoRepo/
```

ステージング→コミット→プッシュします。

```
$ git add -A

$ git commit -m "test 1"

$ git push
```



#3.デプロイするEC2インスタンスの準備#

以下のとおりロールを作成する。

 - サービス：EC2
 - ロール名： EC2InstanceRole
 - ポリシー名：AmazonEC2RoleforAWSCodeDeploy

タグは、MyCodePipelineDemo とし、ユーザデータは以下のとおりにし、EC2インスタンスを作成する。

```
#!/bin/bash
yum -y update
yum install -y ruby
yum install -y aws-cli
cd /home/ec2-user
aws s3 cp s3://aws-codedeploy-us-east-2/latest/install . --region us-east-2
chmod +x ./install
./install auto
```



#4.CodeDeploy で EC2インスタンスにデプロイする#

以下のとおりロールを作成する。

 - サービス：CodeDeploy 
 - ロール名： CodeDeployRole
 - ポリシー名：CodeDeploy 

CodeDeploy アプリケーションを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d646ab46-51b1-2252-fe91-555819dfa8fa.png)

CodeDeploy デプロイグループを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d3f98f37-1ba9-f5a0-a929-815669324267.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/2f9c779b-c21b-f5f3-52d5-46220da80cb8.png)



#5.CodePipeline パイプラインを作成する#

##Step 1 パイプラインの設定を選択する##
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/5be76f4f-7169-d7d4-ed88-fc8cdc62954e.png)

##Step 2 ソースステージを追加する##
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/8ddf886a-957f-a83e-efc7-a79c59fcce80.png)

##Step 3 ビルドステージを追加する##
今回ビルドはしないのでスキップします。

##Step 4 デプロイステージを追加する##
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/9e6bb290-4db8-e3d8-31de-c10ed66d3278.png)

##Step 5 レビュー##
内容を確認し、「パイプラインの作成」をする。

成功した場合は、パブリック DNSにアクセスして表示されるか確認。
失敗した場合は、[CodePipeline のトラブルシューティング](https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/troubleshooting.html)をする。



#5.CodeCommit リポジトリのコードを編集#

index.html のファイルを適当に編集して、変更されるか確認してみます。

```
$ git commit -am "test2"
$ git push
```
AWS EC2インスタンスにSSH接続する時のパーミッションエラー回避方法

EC2にSSH接続しようとするとこんなエラーが,,,

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
```

よくエラーを見ると、

```
Permissions 0755 for '/Users/user/Desktop/xxxxxxxxxxxx.pem' are too open.
```

パーミッションが開きすぎ！とのこと。

ググるとパーミッションを600に変更すればOKだと。

```
chmod 600 /Desktop/xxxxxxxxxxxx.pem
```
変更したのちに、

```

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
```

こうなれば成功です。
EloquentCollectionを活用するメモ

## 概要
モデルをget()後に加工しなければならないのためのメモ。
eagerロードの制約を加えた値は動的プロパティを使わないと受け取れないので、コレクションを活用して加工など行う必要がある。
備忘録。

laravel 6.X

## リレーション先の先の条件

### fillter()を使う

ビューでクエリを行わずに、制約をかけた後のデータを渡すとスマートで安心する。

```php
// ある記事に紐づく、公開中の評価がついた公開中のコメントが欲しい

// 制約をかける
$article->load([
	'comments' => function ($query) {
		$query->where('is_public', 1);
	},
	'comments.ratings' => function ($query) {
		$query->where('is_public', 1);
	}
]);

$commnts = $article->comments->filter(function ($comment, $key) {
	// 動的プロパティでアクセス
	return $comment->ratings->count() > 0;
});
```

### reject()
除去する条件を入れる

```php
$commnts = $article->comments->reject(function ($comment, $key) {
	return $comment->ratings->count() === 0;
});
```


## コレクションを合成する

### concat()で他のモデルから取得したget()と合成する

ちなみに中身はコレクションをforeachで回して、push()しているだけのようです。
なので

```php
$articles = collect(\App\Models\Article::public()->take(3)->get());
$concat = $articles->concat(
    \App\Models\Service::query()->take(5)->get()
);
```

### slice()を使ってページング 

`Illuminate\Pagination\LengthAwarePaginato` はページング対象引数をコレクションで取ることが出来るので、合成後のコレクションで独自にページネーション出来る。

```php
$offset = ($page * $limit) - $limit;
$slice = $concat->slice($offset, $limit);
$paginate = new LengthAwarePaginator($slice, count($concat), $limit, $page);
```

(仕様に従ってみましたが、これはsliceせずにどうにかならないんでしょうか....)

### 追記
@nunulk さんにコメント頂き追記
forPage()を使ってスマートになりました。

```php
$paginate = new LengthAwarePaginator($concat->forPage($page, $limit), count($concat), $limit, $page);
```
gitの現在ブランチ名を取得(*なしで)

## 答え

```shell
branch_name=$(git describe --contains --all HEAD)
```

----
## 当初の方法
```shell
git branch --contains
* master
```

だから配列で受けて[1]を取ればいけそうな……

```shell:echo_branch_name.sh
array=($(git branch --contains))
echo ${array[1]}
```

```shell
$ sh echo_branch_name.sh
api
```

……あれ？「api」はどこから出てきた？

（しばし考える）

はっ！*が展開されてるー！

```shell:echo_branch_name2.sh
array=$(git branch --contains)
branch_name=${array:2} # * を除外
echo $branch_name
```

```shell
$ sh echo_branch_name2.sh
master
```

できた!

その後、「答え」の方法に気づきました。
[Ruby] Array#find_index の複数の index を返すバージョンがほしい

# バージョン情報

```
$ ruby -v
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-darwin18]
```

# やりたいこと

[Array#find_index](https://docs.ruby-lang.org/ja/latest/method/Array/i/find_index.html) は引数に一致する最初の要素のインデックスを返す。

```rb
%w(🦜 🐟 🐁 🦄 🐁).find_index('🐁') #=> 2
```

でも一致するすべてのインデックスを返してほしいな。

```rb
%w(🦜 🐟 🐁 🦄 🐁).some_method('🐁') #=> [2, 4]
```

# 方法

```rb
module ArrayExtension
  refine Array do
    def find_indexes(val)
      filter_map.with_index { |element, i| i if element == val }

      # Ruby 2.7 未満の場合は Enumerable#filter_map がないので他の書き方で。
      # map.with_index { |element, i| i if element == val }.compact
    end
  end
end

using(ArrayExtension) # irb --context-mode=1 で起動すると irb でも using が使えるぞ。

%w(🦜 🐟 🐁 🦄 🐁).find_indexes('🐁') #=> [2, 4]
%w(🦜 🐟 🐁 🦄 🐁).find_indexes('🐟') #=> [1]
%w(🦜 🐟 🐁 🦄 🐁).find_indexes('🐝') #=> []
```
バッチファイルを使用したT-SQLのループ処理

# 目的
バッチファイルを使用したT-SQLのループ処理
指定したテーブルが存在するか確認して、存在する場合のみ処理を実行する

# 環境
Windows Server 2016
SQL Server 2016

# 準備

- テーブル名の書かれたリストの準備

```text:list.txt
table1
table2
table3
.
.
.

```

- バッチファイルの準備

バッチフォルダにlist.txtがある前提です。

```bat:check_existence.bat
@echo off

rem 接続情報
set HOSTNAME="localhost"
set USER_ID="sa"
set PASSWPRD="PASSWORD"

rem ディレクトリ設定
set SQL="V:\script\sql\check_existence.sql
set LOG="V:\script\log\check_existence.log

rem 遅延環境変数設定
setlocal enabledelayedexpansion

rem 1行ずつ取り出しループ処理
for /f %%a in (list.txt) do (
sqlcmd -S %HOSTNAME% -U %USER_ID% -P %PASSWORD% -i %SQL% -o %LOG% -v TABLE=%%a
)
```

- SQLファイルの準備

```sql:check_existence.sql
use testdb
go

-- $(TABLE)が存在する（nullではない）場合のみ動作する
if object_id('$(TABLE)') is not null
  -- 存在する場合の処理を記載
end
```

# 結果

動いてくれました。

`begin`を使用した方法や`is null`で`return`を返したりと方法はあったが、
上手く動かないことがあったので今回はこの簡単なコマンドを採用。

特に存在しない場合の処理を記載しなくても
テーブルが存在しない場合はなにもせず次のテーブルで処理をしてくれていました。
T-SQLってそういうもんなんですかね。

ログファイルは`>>`を使用しているので追記されます。

リストに記載されているテーブル分SQL Serverへログインしてしまうので、
そこはどうなのかなって思うところはありますけど、テーブル増えたときはリストに追加するだけなので、
運用としてはこちらのほうが楽なんですかね…。

### あとがき

Oracle ばかり触っていて、SQL Server に関する知識が超スカスカだったので、少し勉強になりました。
VsCodeで自作モジュールをImportすると何故かNo name in module...と言われる

Pylintを導入した状態で、プログラム直下にあるフォルダからモジュールをImportするとVsCode上で何故かエラーが表示される。
直下にあるフォルダからのImportなので、実行自体は問題なく動く。

## 解決方法
モジュールが入っているフォルダに空の__init__.pyを作成する。

    $ touch ./modules/__init__.py


\_\_init__.pyがないと検索に引っかからないのかな。