OmniAICreator/Qiita-1.07M huggingface dataset:
Stripeの定期購読のデフォルト料金計算の図解

Stripeすごく便利ですよね。

Stripeの[ドキュメント](https://stripe.com/docs/api/subscriptions/update)に定期購読の料金計算について書いてありますが、文字列から読み取るのになかなか苦労したので、備忘録は図にしてみようと思い立った記事です。(手書きの図はいつか直すかもしれない)

いろいろ指摘していただけると助かります。

# 本題
プランを以下の図ように**箱**で表すものとします。
![def_plan.jpeg](https://qiita-image-store.s3.amazonaws.com/0/272192/b29f608d-3962-295c-d238-6038c4cf1624.jpeg)
- 幅：インターバル
- 面積：支払い金額

購読サイクルを以下のように表すものとします。
![sub_normal.jpeg](https://qiita-image-store.s3.amazonaws.com/0/272192/b12d0f7b-409b-08af-e4df-b26ee0db12f2.jpeg)
横軸は時間で、緑の軸上の点が支払いタイミングおよび支払い金額とします。

## アップグレード
以下公式より抜粋
>By default, we prorate subscription changes. For example, if a customer signs up on May 1 for a ¥100 plan, she'll be billed ¥100 immediately. If on May 15 she switches to a ¥200 plan, then on June 1 she'll be billed ¥250 (¥200 for a renewal of her subscription, plus a ¥50 prorating adjustment for half of the previous month's ¥100 difference).

![sub_up.jpeg](https://qiita-image-store.s3.amazonaws.com/0/272192/ae2aa8e8-2dc8-d42d-eb0b-ffd51c0d3650.jpeg)
100円プランで開始し、期間の中間で200円のプランにアップグレードすると、200円を日割りし、残りの期間と支払っていない部分が**青の箱**であることがわかると思います。この**青い箱**の料金が次回請求時に加算され請求されます。

ここで、支払いは次回の請求時になりますが、StripeのSubscriptionのプランは即時アップグレードされます。

また、[create an invoice API](https://stripe.com/docs/api/invoices/create) および [pay an invoice API](https://stripe.com/docs/api/invoices/pay) をコールすることにより、即時差分の料金を請求することも可能です。

## ダウングレード
以下公式より抜粋
>Similarly, a downgrade will generate a credit to be applied to the next invoice. 

![sub_down.jpeg](https://qiita-image-store.s3.amazonaws.com/0/272192/efd7111c-32ee-6420-b76f-8dc1200765bd.jpeg)
同様に、200円のプランで開始し、期間の中間で100円のプランにダウングレードすると、200円を日割りし、未使用の部分が**赤の箱**であることがわかると思います。この**赤の箱**の料金が次回支払い時に相殺されて請求されます。

アップグレードと同様に、支払いの相殺は次回請求以降となりますが、StripeのSubscriptionのプランは即時ダウングレードされます。

また高額のプランから定額のプランに移行の際に未使用額が300円、次回以降のプランが100円というような場合には、３回分の支払いで相殺され、４回目以降から請求が再開します。

このようにStripeでは相殺によって基本的に返金を行う必要がありません。解約などによって返金が必要な場合はStripeのダッシュボードから返金を行うことができるようです。

# インターバルの変更
以下公式より抜粋
> The exception is when you're switching between different intervals (e.g., monthly to yearly): in this case, we apply a credit for the time unused on the old plan, and charge for the new plan starting right away, resetting the billing date. 

![interval.jpg](https://qiita-image-store.s3.amazonaws.com/0/272192/c110472d-b123-0504-f057-cdd85543b2ca.jpeg)

1ヶ月２００円のプランでスタートし、途中で2ヶ月200円のプランに変更するとすると、200円を日割りし、未使用の部分が**赤の箱**であることがわかります。この**赤の箱**の料金が、時期プランの**青の箱**と相殺した金額（１００円）が即時請求されます。
また、インターバルが異なるプラン変更は請求サイクルの起点日が変更時点にリセットされます。
カレントディレクトリーで管理者コマンドプロンプトを開くsudoもどきを作った(引数付き)

# はじめに

初投稿です
 
 こんなことを解決出来るように作りました

- windowsでもsudoコマンドぽいの使いたい
- カレントディレクトリーで開きたい(`C:\Windows\System32`で開きたくない)
- 引数つけたい
- GUIアプリケーションを起動した時にコマンドプロンプトを起動したくない
- もっとLinuxぽく使いたい(`sudo su`とか打つと管理者コマンドプロンプトが起動する)

# 前提条件

- PATHの通し方を知っている事
- バッチファイルを作成出来る事

# 実行環境
Windows 10 OSビルド 17763.253 (PowerShellが入っていればどの端末でも動くと思われ)

# 作り方

以下のコマンドのバッチファイルを作成しPATHを通す

```sudo.bat

@echo off
REM 管理者権限でコマンドプロンプトを開く
if "%1"=="cmd" (
	powershell  -NoProfile start-process cmd -ArgumentList '/k ""cd /d %CD%""'-verb runas
	exit /B
)
if "%1"=="su" (
	powershell  -NoProfile start-process cmd -ArgumentList '/k ""cd /d %CD%""'-verb runas
	exit /B
)
if "%~x1"==".exe" (
	powershell -NoProfile Start-Process %1 -ArgumentList '"%2" "%3" "%4" "%5" "%6" "%7" "%8" "%9" ' -Verb Runas
	exit /B
)
REM コマンドはcmd.exeに流して実行
if not "%1"=="" (
	powershell -NoProfile Start-Process cmd -ArgumentList '/K ""cd /d %CD%"" "&" "%1" "%2" "%3" "%4" "%5" "%6" "%7" "%8" "%9" ' -Verb Runas
) else (
    rem 引数がなければエラーを返す
	echo コマンド構文が間違っています 1>&2
	echo sudo [実行するコマンド][実行するコマンドにつける引数]	1>&2
	exit /B
)
```

`sudo dir`とか出来たら成功

# 構文

```
sudo [実行するコマンド][実行するコマンドにつける引数]
```

# 説明

1. このPowerShellコマンドでコマンドプロンプトを管理者権限で実行
`powershell -NoProfile Start-Process cmd -Verb Runas`
2. `-ArgumentList`オプションで`cmd.exe`に追加する引数を追加
3. `&`はコマンドプロンプトでコマンドを連続して実行する際に使う
4. `""cd /d %CD%""`でカレントディレクトリーで実行
5. 引数は最大９個までつけられる` "%1" "%2" "%3" "%4" "%5" "%6" "%7" "%8" "%9"`

※`$*`がなぜか使えない…

# もっとLinuxぽく使いたい
   
- 引数に`su`と`cmd`を入れたら管理者コマンドプロンプトが起動するようにしたい
 - `if`文で第一引数が`su` or `cmd` の時に起動するようにする
 - `sudo cmd` `sudo su` とか出来るようになる
- エラーを表示したい 
 - 引数無しで呼び出された時にエラーを表示
 - 引数をつけるよう促す文を標準エラー出力に表示
   - 標準出力を標準エラー出力にリダイレクトし、表示する`1>&2`

```sudo.bat
@echo off
rem 管理者権限でコマンドプロンプトを開く
if "%1"=="cmd" (
	powershell  -NoProfile start-process cmd -ArgumentList '/k ""cd /d %CD%""'-verb runas
	exit /B
)
if "%1"=="su" (
	powershell  -NoProfile start-process cmd -ArgumentList '/k ""cd /d %CD%""'-verb runas
	exit /B
)
rem コマンドはcmd.exeに流して実行
if not "%1"=="" (
	powershell -NoProfile Start-Process cmd -ArgumentList '/K ""cd /d %CD%"" "&" "%1" "%2" "%3" "%4" "%5" "%6" "%7" "%8" "%9" ' -Verb Runas
) else (
    rem 引数がなければエラーを返す
	echo コマンド構文が間違っています  1>&2 
	echo sudo [実行するコマンド][実行するコマンドにつける引数]  1>&2
	exit /B
)
```


### Windows Terminalにも対応させてみた
2022/2/26 追記 
```bat:sudo.bat
REM 管理者権限でWindows Terminalを起動するコマンド
if "%1"=="wt" (
    powershell  -NoProfile Start-Process wt.exe -ArgumentList '"new-tab --startingDirectory" "%CD%"' -verb runas
    exit /B
)
```

# GUIアプリケーションを起動した時にコマンドプロンプトを起動したくない

※firefoxに**PATHが通っている事**にして話しています
`sudo firefox`と実行すると管理者コマンドプロンプトも起動してしまう。
引数に拡張子付き(`.exe`)で指定した場合、第一引数を直接管理者権限で実行するように変更
`if`文で`.exe`がついているか判定(`%~x1`で引数から拡張子だけを取得できる)
`sudo firefox.exe`

```sudo.bat
if "%~x1"==".exe" (
	powershell -NoProfile Start-Process %1 -ArgumentList '"%2" "%3" "%4" "%5" "%6" "%7" "%8" "%9" ' -Verb Runas
	exit /B
)
```

誰かもっといい方法ありませんか…

2022/2/26 追記
コメント欄にて @e4rfx 様に、引数を可変長にできる方法を教えて頂きました。
```bat:sudo.bat
if "%~x1"==".exe" (
    powershell -nop "start -v runas %*"
    exit /B
)
```
pipenv install したライブラリとそれらのimportについて

# はじめに
今後Pythonを学んでいく必要があり、いろいろと勉強中です。
この記事に対してもビシバシ指摘をいただけるとありがたいです。

本題
今どきのPythonの開発環境の構築について調べていると、どうも「Pipenv」を使う手法がナウいらしい。
Pipenvはnpmのようにモジュール管理できるらしく、そうであればとっつきやすそうということで使ってみることにしました。

Pipenvのインストールは公式のドキュメントなどに書かれています。


# ライブラリのインストール
適当なプロジェクトを作成します。

```
$ mkdir sample_project && cd sample_project
```

適当なライブラリをPipenv経由でインストールします。

```
$ pipenv install flask
```

これで、プロジェクト内に`Pipfile`と`Pipfile.lock`が作られて、パッケージの依存関係などが管理されるらしい。
とてもnpmっぽい！

そして、インストールしたライブラリを使うようなコードを書きます。

```python:server.py
from flask import Flask, render_template
app = Flask(__name__)


@app.route('/')
def index():
    return render_template('index.html')


if __name__ == '__main__':
    app.debug = True
    app.run(host='0.0.0.0', port=80)
```

# 問題
ここで`server.py`を実行しようとしましたが、以下のようなエラーが表示されうまくいきませんでした。

```
$ python server.py

Traceback (most recent call last):
  File "server.py", line 1, in <module>
    from flask import Flask, render_template
ModuleNotFoundError: No module named 'flask'
```

どうも`flask`が読み込めていないようです...

# 解決策
`pipenv install`を実行すると、仮想環境も自動で作成され、
`pipenv install <package>`するということは、仮想環境に対してライブラリをインストールするということになります。

試しに仮想環境のみにインストールされていることを確認してみます。

```
$ pipenv shell
$ python
>>> import flask
>>> exit()

$ exit
```

`pipenv shell`で仮想環境に対して操作ができるようになります。
特にエラーはおきません。
最後の`exit`で`pipenv shell`を終了しています。

次に、`pipenv shell`を実行せずにやってみます。

```
$ python
>>> import flask
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'flask'
```

最初と同様なエラーが表示されます。

なので、`server.py`を実行したかったら、`pipenv shell`で仮想環境に対して操作ができるようにしたうえで、実行してあげる必要がありそうです。

こちらを参考にさせていただきました。
[pipenv を使ってみたのでメモ - Qiita](https://qiita.com/subarunari/items/dcbdad68ba1809b721b9)

## pipenv scripts
しかし、このままだと多くの手順が必要なので、Pipenvのscripts機能を使います。
`Pipfile`に以下を追記します。

```Pipfile
[scripts]
start = "python server.py"
```

そうした上で、下記コマンドを実行すると、仮想環境上で`server.py`を実行できます

```
$ pipenv run start
```

なんともnpmライク！

# インストールしたライブラリはどこへ？
`npm install`したライブラリ群は、同じプロジェクト内の`node_modules/`内に入っていきますが、`pipenv install`したライブラリたちはどこに行ったのだろうと思い調べました。

先ほど記述したように、`pipenv install`を実行すると、仮想環境も自動で作成されます。
そこで、`pipenv --venv`とすると、仮想環境のパスが表示されます。
今回はWindowsを使用しているので、以下のような感じになります。

```
$ pipenv --venv
C:\Users\username\.virtualenvs\sample_project-KJ82JQpK
```

インストールしたライブラリ群の在りかはこの中の、
`C:\Users\username\.virtualenvs\sample_project-KJ82JQpK\Lib\site-packages`
です。

# 所感
以上、かなり基本的なところでした。。
Python自体はちょっと使ったことがある程度で、使ったとしても標準モジュールを組み合わせて簡単な自動化ツールを作る程度でした。
Pipenvを活用していけば、JavaScriptっぽく（自分が慣れているだけですが）Pythonのコードを書いていけるのかなーと思いました。
もっと色々と調べてみます。
Ubuntu 18.04 Desktop 日本語をVMware Workstation 15.0.2 Playerで動かす

# Wiondow10にVMwareを使ってUbuntu環境を構築する。

【目的】
 技術的な検証をUbuntu環境で色々やりたいので、仮想環境を構築する。

【手順】
１．VMwareをインストールする。
　-> 簡単です。他の記事を参照してください。

２．Ubuntu 18.04 ISOイメージをダウンロード。

３．VMwareでUbuntuを起動して初期設定などする。

## Ubuntu 18.04 ISOイメージをダウンロードする

https://www.ubuntulinux.jp/home

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/1d09061e-3d0a-b0dc-4642-da4a4c3c7d64.png)

https://www.ubuntulinux.jp/download/ja-remix

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/7ae47326-4e35-85ac-0a8a-93189af16891.png)

ubuntu-ja-18.04.1-desktop-amd64.iso（ISOイメージ）をダウンロード。（1.8GB）

ISOファイルをVMwareに読み込ませる。

## VMwareで起動したUbuntuの初期設定をする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/dfd80b44-f75b-450c-5004-d2853d23bac9.png)

『新規仮想マシンの作成』を選択。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/96770fe7-6cbf-1d57-878a-d7dad28d5db8.png)

『インストーラディスクイメージファイル』を『参照』ボタンを押して指定します。
今回は、先ほどダウンロードしたISOファイルを下記のフォルダーに移動してあるので、
そちらを指定します。（どこにISOがあっても構いません。）

『C:\Program Files (x86)\VMware\VMware Player』

ウィザードに従って情報を入力していきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/0805a6db-d53e-522a-4b84-ccd65c273ff4.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/c49f4769-b648-083d-eb07-6d44d3bc9416.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/f7cacc40-09d9-a81f-bedf-a39c4ec18813.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/d54d1a3d-9f12-151e-c582-426b93f7b5fa.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/827d4f06-37f9-fe69-6d17-6959f942965c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/54ee62d8-e846-69a0-5111-9051b36c5349.png)

ツールをダウンロードするか聞かれた場合は、インストールしてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/98d2a512-0225-4a8a-e805-46fce80c8681.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/11f30f82-e6da-567f-6a55-4f46a1bc4bab.png)

Ubuntuのインストールが行われていきます。
※今更ですが、ネットにつながった環境でやりましょう。
　私のようにカフェで実施するとテザリング等の環境では相当時間がかかります。。。

余談ですが、Ubuntuに限らず、Linux系OSをVMwareを使って普段使うPC上で使える
メリットはとても大きいです。外付けのメモリデバイスに入れて使う方法もありますが、
日本の多くの現場では、業務用のOSはWindowsが一般的です。私も多くの開発現場を
経験してきましたが、貸与PCはWindowsでした。試験環境もステージングもWindowsで
本番はLinuxなんてことも多いのではないでしょうか。

はい、終わったようなので、ログインしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/b3973d8e-9056-fb47-c720-4031914a51cc.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/3c785d17-d3d8-70bd-ed21-d1a24fb3e6d3.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/99043b14-3ba1-cacb-7478-58a62c03023a.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/2fd93b0f-9076-4eae-6452-2bc4f11f234e.png)

ネットが整った環境で行えば、30分かからない作業だと思います。

以上です。
わざわざコンテナIDを入力しなくてもコンテナを選択することでログを見れるようにするエイリアス

色んなコンテナを多数起動している開発環境だと、毎回コンテナ名をtypoしてしまいます。
※しかも命名規則がバラバラだったり…

```bash
$ docker logs -f something_long-container_Name
Error: No such container: something_long-container_Name
```

# 選べるようにする

## pecoをインストール

```bash
brew install peco
```

## aliasを設定する
.bash_profileに以下を追記します。

```bash
alias dklog='docker logs $(docker ps -a | awk '\''NR>1{print $0}'\'' | peco | awk '\''{print $1}'\'')'
```

以下をタイプします。

```bash
dklog
```

`docker ps -a`の結果がpecoに送られて選択できるようになります。

```bash
QUERY>                                                                                                                                                                                  IgnoreCase [3 (1/1)]
692ab0e8e167        postgres            "docker-entrypoint.s… "   4 minutes ago       Up 4 minutes        5432/tcp                            some-postgres
6dc481bddabd        mysql               "docker-entrypoint.s… "   9 minutes ago       Up 9 minutes        0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
06ca5a387b59        nginx               "nginx -g 'daemon of… "   11 minutes ago      Up 11 minutes       80/tcp                              epic_wiles
```

Enterで選択すると、ログが表示されます。

```bash
bash-3.2$ dklog
Initializing database
2019-06-22T18:07:20.186142Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2019-06-22T18:07:20.186250Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.16) initializing of server in progress as process 30
2019-06-22T18:07:22.247002Z 5 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
2019-06-22T18:07:23.718153Z 0 [System] [MY-013170] [Server] /usr/sbin/mysqld (mysqld 8.0.16) initializing of server has completed
```
他にも工夫次第で増やすことができます。

```bash
# コンテナを停止する
alias dkstop='docker stop $(docker ps -a | awk '\''NR>1{print $0}'\'' | peco | awk '\''{print $1}'\'')'
# コンテナを削除する
alias dkremove='docker rm $(docker ps -a | awk '\''NR>1{print $0}'\'' | peco | awk '\''{print $1}'\'')'
```

# まとめ
これでタイプ力のない私でもイライラしなくて済みそうです。
WP-Ban で特定のキーワードを含んだユーザーエージェントのアクセスを拒否する

# ０．はじめに

WordPress サイトに、以下の様な OpenVAS からのアタックが見受けられたので WP-Ban で拒否の設定を試してみました。

* `82.221.102.36 - - [24/Jan/2019:10:03:44 +0900] "GET /admin HTTP/1.1" 302 - "-" "Mozilla/5.0 [en] (X11, U; OpenVAS-VT 9.0.3)"`

事前準備としては、以下。

* WP-Ban 導入済み

# １．WP-Ban の Banned User Agents　に設定を追加する

1. WP-Ban の設定画面を開き、「Banned User Agents」に、以下の設定を追加します。
    * `*OpenVAS-VT*`
    * <img width="552" alt="スクリーンショット 2019-01-24 11.28.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/161939/8e171480-ca46-1d1d-b42e-786cc96645e2.png">
1. ちゃんと設定されていれば、以下の様に拒否の一覧が表示されます。
    * <img width="552" alt="スクリーンショット 2019-01-24 11.34.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/161939/90e9e48a-e6e0-d99b-5de9-d1f144f8ab0c.png">

# ９９．ハマりポイント

* あまりハマりはしなかったです。
<br><br>
* 設定の確認の際は、Restlet Client や Postman、cURL などで確認できます。

# ＸＸ．まとめ

ユーザーエージェントは変更できるので、あくまでとりあえずの対応ですが、しないよりはいいかと。

ご参考になれば、では♪

* ※参考:
    * [OpenVAS 等からのポートスキャン攻撃をひとまず拒否する方法 \(Apache & nginx\) \- Qiita](https://qiita.com/katzueno/items/7785fea3489cc173ab18)
難しくないGit

###### ※分かりにくいとの意見を頂きました

## Gitを個人開発で使おう

　この記事は、Gitをゆるふわっと個人開発に導入し、Gitの便利さを最小の労力で享受しようというものです。自分が最低限やっているGitのプラクティスを紹介します。

## GitHubは使わない

　GitHubは使いません。環境にめちゃめちゃ依存してるスクリプトなども、書いたらとりあえずGitHubに公開すべきと主張する人も居ますが、それは流石にアホくさいと思っています。

　Gitファイルには作業履歴が保存されているので、あとからGitHubに反映させることは簡単です。公開したくなった時に公開できます。

## 本格的な開発に必要な機能は段階的に覚えて下さい

　困難は分割せよとよく言いますが、まずは最も簡単な使い方を覚えるべきだと考えています。ここで紹介している使い方でも、何もしないより遥かにマシだと思います。というか個人で開発してるのにこれ以上やる必要があるのか？と思います。

## 難しいと思うな

　ここで紹介する方法はマジで簡単なので、難しいと思わないで下さい。難しいと思った瞬間脳が理解するのを諦めます（要出典）。

## ここで言うGitとはなにか

高機能作業履歴記録ツール

## 最初に覚えるコマンド

```
git init
git add <path詳細>
git commit -m "やった作業"
```

## 雑な説明

```
git init
```

　イニシャライズ、`.git/`ディレクトリを作る。この中に色々記録される。

```
git add <path>
```

　ファイルをgitに追加出来る。パスを指定することになってる。追加されると作業が追跡される。ファイルが多ければ.gitignore（無視）ファイルでgitに無視させるファイルを書いて、「.（現在のディレクトリのファイル全て）」という記号を用いて`git add .`とよく使う。

```
git commit -m "やった作業"
```

　ポケモンでいうレポート、セーブ。

## これらで何が記録されていくか

　こんなのが記録される。
![tig.png](https://qiita-image-store.s3.amazonaws.com/0/157765/2a7c62ab-08aa-5c53-df08-77a119f53d72.png)

* 自分が見てるもの
 * いつこの作業やったっけ？
 * どんな変更だったっけ？

　バグの原因が結構分かる。めちゃありがたい。主観だけど。

## 実際にやってみる

　実際にやってみる際に、Gitの初期設定が絡みます。作業した人の名前とメールアドレスの入力です。Gitをインストールして初期設定をします。

Ubuntu

```
sudo apt update
sudo apt install git
```

Mac

```
brew update
brew install git
```

Windows

ググって

初期設定

```
git config --global user.name "名前"
git config --global user.email mail-address@example.com
```

この辺りはさっきまで忘れてた。[ここを](https://git-scm.com/book/ja/v1/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-%E6%9C%80%E5%88%9D%E3%81%AEGit%E3%81%AE%E6%A7%8B%E6%88%90)読んで思い出した。

## `.git/`ファイル読めるやつ

　`.git/`ファイルは人が直接読むようなものではありません。書かれているデータを読めるクライアントソフトが必要です。tigが好きです。

ubuntu

```
sudo apt install tig
```

　読むためだけにtigを使います。

## やろう

　例えばこんなことしてみます。

```
mkdir test
cd test/
git init
vim test.py
```

test.py

```python
print("hello world!")
```

```
git add test.py
git commit -m "hello git!"
```

```
tig
```

するとこうなります。
![tig-test.png](https://qiita-image-store.s3.amazonaws.com/0/157765/5d53dfc5-8260-9da7-fbd6-ea3bbd983f80.png)

enterでやった作業の詳細画面が出てきます。これをdiffとか言います。そのcommitで、どの行を消して、どの行を書いたかが見れます。

diff画面は`j`で下へ、`k`で上へ移動できます。見終わったら`ctrl`+`c`で終了します。

この記事ではここまでとします。tigの使い方はググって下さい。
vagrant ssh以外でのSSH接続方法とフォルダ同期の個人的な設定

環境はこちら
 *Vagrant-CentOS/7
 *Windows10

## `$ vagrant ssh`以外でSSH接続
Rloginだけできた
方法は２通り

1. ssh-configで出てきたHostName:127.0.0.1 Port:2222
1. Vagrantfileで設定したip:192.168.33.10 Port:22

どちらもユーザー名、パスワードを共にvagrant、SSH認証鍵の設定も忘れずに☜`$ vagrant ssh-config`で確認しよう
~~PUTTYはどうしてもできなかった。~~~~あきらめる勇気を手に入れた！~~
【追記】[PUTTYでもSSH認証鍵を設定する必要がありました。](https://qiita.com/mikoski01/items/c3984901c22a7736d726)
Ubuntuとはここら辺の仕様が違うっぽいですね
<font color="Gainsboro">RloginとPUTTY以外手を付けてないから他は知らない！！</font>

## フォルダ同期でした方がいい設定

vagrantアカウントでログインしたときのディレクトリは/home/vagrantになるから、フォルダの同期にはゲストOSの設定を/home/vagrant/syncとかにしとくと良い。
これでVScodeが使える！(typeを明示的に設定することで双方向での同期ができます)

```ruby:Vagrantfile
  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
config.vm.synced_folder "./sync", "/home/vagrant/sync",type:"virtualbox"
```
チームの打ち上げはボーリングがオススメ


## 概要
* 最近、チームで大きめのリリースがあり、打ち上げでボーリングをやりました。
* 一般的に打ち上げは飲み会が多いかと思いますが、ボーリングにしてよかった事をお伝えします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21391/34b1e4fd-7dde-7c21-621d-f811c8ae9e21.png)


## 飲み会にしなかった理由
* メンバーでお酒を飲める人が限られている
  - 今回は８人で実施しましたがガブガブお酒を飲む人は2,3人です。
* 飲める人、飲めない人で温度差が出てしまう。
* 若い子は気遣いなどしなければならないと言う義務感に駆られる。

## ボーリングにしてよかったこと

* ルール説明不要で誰でも知っていて１度はやったことが必ずある
  - うちのチームはみんな１度はやったことがありました！
  - 大体みんな下手くそなので下手くそに対してネガティブになる必要はありません。
  
* ハイタッチ！
  - どんなに下手でも、２ゲーム投げれば必ずと言っていいほどスペアやストライクを取れるでしょう。
  - そんなときはハイタッチのチャンスです！自然と笑顔が生まれ良い雰囲気に！メンバー同士の距離感が縮まります！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21391/e8b71f0a-be63-b1ae-4809-018d378f3c7a.png)


* 良い運動になる
  - 翌日、筋肉痛ネタで盛り上がれるというおまけ付き

* ボーリングの名前の表示名を自由に決められる
  - github アカウント名や 普段のあだ名などつけると面白い。
 

### その他
* ２ゲームで大体２時間かかりました。
* 今回利用したボーリング場は飲食持ち込み禁止、フードは乾き物しか無かったので、  
  ２次会に行きました。普段参加してくれない人もごく自然に来てくれました。

## 今回利用した会場
ザ・プリンス パークタワー東京 ボウリングサロン
http://m.princehotels.co.jp/parktower/bowling/

* ホテルの併設施設で一般の人も使えます。
* 芝公園駅からホテル内の移動も含めて１０分で結構距離あります。
* 直前割引？みたいなのがあり2ゲーム靴代付ドリンク1杯おつまみで 3,000円/人 でした。
* 予約取り易くおすすめです。
* ただし、飲食の持ち込みが禁止されていて、ホテルなので注文しようとすると、若干高いです。
* ボウリング＆レストランプランのプランもあるようです。

## まとめ
* 体を動かし、みんなでハイタッチして笑顔になる瞬間がとても微笑ましくやってよかったです！
* 皆さんも、飲み会以外の打ち上げの選択肢を考えてみてはいかがでしょうか！
* 皆さんのオススメの打ち上げを教えてください！
​
serverless.ymlで設定値を条件分岐したい

cloudformationではよく!Ifとか!Equalを使って条件分岐書いてたのですが、
どうやらserverless.ymlではその記法ができないそうなので。。。


ex)
develop環境の場合にはdev, production環境の場合にはprodとなるような省略名の設定値'envShorten'を作りたい


```serverless.yml

provider:
  name: aws
  runtime: python3.6
  region: ap-northeast-1
  stage: ${opt:stage, 'develop'}
  conf:
    #hogehoge
  iamRoleStatements:
    #hogehoge

  environment:
    ENVIRONMENT_TYPE: ${self:provider.stage}

plugins:
  #hogehoge

custom:
  envShorten:
    develop: dev
    production: prod
```

上記のような書き方によって、!Ifなどを使わないで条件分岐を実現できる。
上記のyml内で、実際に値を取りに行くときは

```
${self:custom.envShorten.${self:provider.stage}}
```
と指定してやれば良い
No.015【Python】 「実部と虚部の取得」／共役な複素数・複素数の絶対値について

![python-logo-master-v3-TM-flattened.png](https://qiita-image-store.s3.amazonaws.com/0/336067/5a8a5349-6dbb-3939-7029-57de7ed8b104.png)

今回は、「実部と虚部の取得」について書いていきます。
I'll write about " to acquire real and imaginary parts " on this blog.

##■実部と虚部の取得について<br>About "real and imaginary parts" 

####・複素数complex型の実部は"real "、 虚部は"imag"属性で取得ができる。
　You can acquire the complex type of real part by "real "; <br>&emsp;on the other hand,  you do the type of imaginary part by "img" in python.

```
>>> a = 2 + 6j
>>> 
>>> print(a.real)
2.0
>>> print(type(a.real))
<class 'float'>
>>> 
>>> print(a.imag)
6.0
>>> print(type(a.imag))
<class 'float'>
```
ただし、読み込みのみだけなので、
変更することが不可能であることは覚えておいてほしい。
However, I'd like you to remember that this is "reading only "; hence, it can't be changed after you printed.

```
>>> a.real = 7.5
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    a.real = 7.5
AttributeError: readonly attribute
```
###■共役な複素数の取得について<br>About conjugated complex numbers

####・共役な複素数を取得する際は、conjugateメソッドを利用する。
　　When you acquire conjugated complex numbers, we use "conjugate  method" in Python.

```
>>> a = 2 + 5j
>>> 
>>> print(a.conjugate())
(2-5j)
```

####■複素数の絶対値の取得について<br>About absolute value of complex numbers

####・複素数の絶対値を取得する際は、組み込み関数 ”abs(  )"を利用する。
　　When you get  the absolute value of complex numbers, you would use an abs function<br>&emsp;&emsp;as a built-in function.

```
>>> a = 6 + 8j
>>> 
>>> print(abs(a))
10.0
>>> 
>>> a = 2 + 1j
>>> 
>>> print(abs(a))
2.23606797749979
```

いかがでしたでしょうか。
How was my post?

次回も引き続き「複素数」に関する内容について書いていこうと思います。
I'll write about  "complex numbers" on the next blog.

本ブログは、随時に更新していきますので、
定期的な購読をよろしくお願いします。
I'll update my blogs at all times.
So, please subscribe my blogs from now on.

また、本ブログについて、
何か要望等ありましたら、気軽にメッセージをください！
If you have some requests, please leave some messages! by You-Tarin
Electronの最速チュートリアル

## 環境

- OS: Windows10
- terminal: Cmder

### 前提

node.js、npm、electron、electron-packagerはインストール済みであること。

```
$ node -v
v10.3.0
$ npm -v
6.1.0
$ electron -v
v1.4.13
```

## 手順

### 1. プロジェクトフォルダを作成する

```
$ mkdir sample
$ cd sample
```

### 2. npm initでpackage.jsonを作成する

```
$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (sample)
version: (1.0.0)
description:
entry point: (index.js) main.js
test command:
git repository:
keywords:
author: fk2000
license: (ISC) MIT
About to write to C:\Users\fk2000\workspace\sample\package.json:

{
  "name": "sample",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "fk2000",
  "license": "MIT"
}


Is this OK? (yes) yes
```

### 3. デバッグ起動の確認

```
$ electron .
```

デバッグコンソールも起動する。

![electron-hello-world.png](https://qiita-image-store.s3.amazonaws.com/0/2567/65f0662b-f818-f901-179f-de9c3a7df4f6.png)


### 4. electronのバージョンを確認する

パッケージングのコマンドオプションにElectronのバージョンを入力するために確認します。

```
$ electron -v
v1.4.13
```

### 5. パッケージングする

electron-packagerコマンドの使い方は以下の通り。

> Usage: electron-packager &lt;sourcedir&gt; &lt;appname&gt; [options...]

※Macではないのでdarwinオプションはskipされます。

```
$ electron-packager . sample --platform=darwin,win32 --arch=x64 --electron-version=1.4.13
Downloading tmp-18752-0-electron-v1.4.13-darwin-x64.zip
Downloading tmp-18752-1-SHASUMS256.txt-1.4.13
[============================================>] 100.0% of 2.88 kB (2.88 kB/s)
Cannot create symlinks (on Windows hosts, it requires admin privileges); skipping darwin platform
Wrote new app to C:\Users\fk2000\workspace\sample\sample-win32-x64
```

### 6. 出来上がったファイルを確認する

```
 ~\workspace\sample  sample@1.0.0 
$ ls -l
total 10
-rw-r--r-- 1 OryLab 197121  389 1月  10 17:53 index.html
-rw-r--r-- 1 OryLab 197121 1083 1月  10 17:52 main.js
drwxr-xr-x 1 OryLab 197121    0 1月  10 17:56 sample-win32-x64/
-rw-r--r-- 1 OryLab 197121  211 1月  10 17:49 package.json
```

### 7. バイナリを起動してみる

デバッグ起動のときと同じ画面が表示される。

```
$ cd sample-win32-x64
$ sample.exe
```

sample.exeを実行するとデバッグ起動と同じものが表示される。
![electron-hello-world.png](https://qiita-image-store.s3.amazonaws.com/0/2567/65f0662b-f818-f901-179f-de9c3a7df4f6.png)

以上、Electronの最速チュートリアルでした。
IDERA が買収した開発系会社一覧 (2019/1版) 

# 2015 年以降 IDERA が買収した開発系会社一覧

## IDERA について
[IDERA, Inc.](https://www.idera.com/) のメイン事業はデータベースツールの開発と販売（オーナーは [TA Associates](https://www.ta.com/)）。
IDERA は、Embarcadero Technologies が開発していた「[ER/Studio](https://www.idera.com/er-studio-data-architect-software)」などのデータベース製品が欲しくて Embarcadero を買収したところ、[**Delphi**](https://www.embarcadero.com/jp/products/delphi) といった開発ツールも**偶然**手に入れてしまった、という流れ。
当初 IDERA は、あまり開発環境ビジネスに興味が無かった様ですが、Delphi がユーザーベースも多く、割と売れる事を知ってしまい、その後次々と開発環境系企業を買収している感じ。

そして、2019/1/23 に人気の高い Travis CI を買収したので、この記事を書いてみました。

## 開発ツール
| 買収年 | 月 | 日 | 企業名                         | 代表的製品    | 内容                                                                |
|:------:|:--:|:--:|--------------------------------|---------------|---------------------------------------------------------------------|
|  2015  | 10 |  7 | [Embarcadero Technologies, Inc.](https://www.embarcadero.com/) | Delphi        | マルチプラットフォーム開発環境<br>（ネイティブベース, Object Pascal） |
|  2017  |  8 | 25 | [Sencha, Inc.](https://www.sencha.com/)                   | Sencha Ext JS | マルチプラットフォーム開発環境<br>（Webベース, JavaScript）           |
|  2018  |  6 | 19 | [Froala](https://www.froala.com/)                         | Froala Editor | WYSIWYG HTML Editor                                                 |
|  2018  |  8 |  2 | [Whole Tomato Software, LLC.](https://www.wholetomato.com/)    | Visual Assist | Visual Studio 用<br>コーディング補助ツール                              |
|  2018  | 12 | 18 | [LANSA](https://www.lansa.com/)                          | Visual LANSA  | マルチプラットフォーム開発環境<br>（Webベース, LANSA Language）       |

## テストツール
| 買収年 | 月 | 日 | 企業名       | 代表的製品    | 内容                     |
|:------:|:--:|:--:|--------------|---------------|--------------------------|
|  2017  | 10 | 23 | [Ranorex GmbH](https://www.ranorex.com/) | Ranorex       | GUI用テスト自動化ツール       |
|  2018  | 10 | 5 | [Kiuwan](https://www.kiuwan.com/)        | Code Security | 脆弱性検査ツール         |
|  2018  | 11 | 1 | [Assembla](https://www.assembla.com/)     | Secure Git    | Git ホスティングサービス |
|  2019  | 1 | 10 | [Gurock Software GmbH](https://www.gurock.com/)| TestRail    | テスト管理ツール |

## DB ツール
| 買収年 | 月 | 日 | 企業名      | 代表的製品 | 内容             |
|:------:|:--:|:--:|-------------|------------|------------------|
|  2018  |  4 | 11 | [Webyog Inc.](https://www.webyog.com/) | SQLyog     | MySQL 管理ツール |

## CI ツール
| 買収年 | 月 | 日 | 企業名           | 代表的製品 | 内容                           |
|:------:|:--:|:--:|------------------|------------|--------------------------------|
|  2019  |  1 | 23 | [Travis CI, GMBH.](https://travis-ci.org/) | Travis CI  | 継続的インテグレーションツール |

# まとめ
買えるところを買っている感じ。

マルチプラットフォーム開発環境、３つも必要…？

今後、どの程度それぞれが繋がって行くのかが見所。
いくつか聞いたところだと

* Visual Assist, Ranorex, Code Security が RAD Studio IDE (Delphi で使われる IDE) に対応する
* Froala Editor が Sencha に対応する
* Sencha Ext JS が RAD Server 上で動作する

といったところ。

テストツール群が Travis CI と繋がると良さそう。
dfコマンドのUse%計算方法

完全にディスクフルだと後の祭りになるので、少しだけバッファを持たせて表示していると認識しているけど、実際にどうなんだっけ。
計算すると微妙に計算合わない。


```sh
$ df  /
Filesystem              1K-blocks     Used Available Use% Mounted on
/dev/mapper/centos-root  30909700 14577164  16332536  48% /
```

dfの表示は48%だけど、``(use*100) / (Used + Available) `` この計算だと47%になる。

```sh
echo "(14577164 * 100) / (14577164 + 16332536)" | bc
47
```

core-utilsみましょうか。

```c:df.c
        case PCENT_FIELD:
        case IPCENT_FIELD:
          {
            double pct = -1;
            if (! known_value (v->used) || ! known_value (v->available))
              ;
            else if (!v->negate_used
                     && v->used <= TYPE_MAXIMUM (uintmax_t) / 100
                     && v->used + v->available != 0
                     && (v->used + v->available < v->used)
                     == v->negate_available)
              {
                uintmax_t u100 = v->used * 100;
                uintmax_t nonroot_total = v->used + v->available;
                pct = u100 / nonroot_total + (u100 % nonroot_total != 0);
              }
```

概ね、+1されるという感じでしょうか。
そもそも、この ``(u100 % nonroot_total != 0)``  は 0 or 1 を返すんですね。


```sh
$ cat x.c
#include <stdio.h>
int main(void)
{
  printf("%d\n", (0 != 0));
  printf("%d\n", (1 != 0));
}
$ gcc x.c
$ ./a.out
0
1
```
Rails5で自動的にwwwありからなしにリダイレクトする方法

## 概要
Railsの初心者ですが、だいぶ前タイトル通りの作業依頼が来て、
少し調べて実装してみたが、忘れないうちにメモを書いておきたいですね。

一見ややこしそうに見える処理ですが、Rails5ではものすごく簡単にできるということに感心しました。
具体的に言うと、`config`フォルダーにある `routes.rb` の最初に以下のコードを書けば大丈夫みたいです。
(最初とはいえ、 `Rails.application.routes.draw do ~ end`　の中です)

## コード

```ruby:config/routes.rb
match '(*any)', to: redirect(subdomain: ''), via: :all, constraints: {subdomain: 'www'}
```

この1行のコードを細かく見ると、

・`match '(*any)'` ：まあ文字通り全てのルートにマッチした場合です。
・`constraints: {subdomain: 'www'}` はサブドメインに `www` が付いている時に限るということです。
・`via: :all` は全てのHTTP動詞（GET / POST / PATCHなど）に適用ということです。
・`to: redirect('')`　はsubdomainを取り除いてくれるということです。

## 参考サイト
https://medium.com/@mikekitson/redirecting-to-a-bare-domain-in-rails-5-7fe533df225f
GitHub Slack Appで通知内容をカスタマイズ

# 概要

SlackのChannelとGitHubを連携させ、各種通知を受け取る際に通知内容をカスタマイズできます。このカスタマイズのやり方をいつも忘れのでメモしておきます。

# Slack Appのインストール

- [slack.github.com](https://slack.github.com/)にアクセスし、「Add to Slack」をクリック
- アプリが必要とするアクセス権限を確認し、「Continue」をクリックして許可
- アプリがアクセスできるチャンネルを選択 (全てのパブリックチャンネル、特定のチャンネル、なし、等)

これで`/github`コマンドが使用できるようになります。

# Repositoryの購読

購読には以下のコマンドを通知を流したいChannelで実行します。

```
/github subscribe owner/repo
```

## Slackへの通知内容のカスタマイズ

GitHub AppはGitHubの各種機能について、イベントが発生した際にSlackへの通知を行います。

### デフォルトでの通知内容

デフォルトで通知を行う・通知されない機能は次のようになっています。

|デフォルトで通知を行う機能|デフォルトで通知されない機能|
|:--|:--|
|issues (イシュー)|reviews (レビュー)
|pulls (プル)|comments (コメント)|
|statuses (ステータス)|branches (ブランチ)
|commits （コミット）|commits:all (すべてのコミット)
|deployments (デプロイメント)|
|public (パブリック)|

### 通知内容のカスタマイズ

購読する機能を追加するには以下のコマンドを入力します。

```
/github subscribe owner/repo　機能
```

また、購読を解除するには次のコマンドを入力します。

```
/github unsubscribe owner/repo　機能
```

# 参考資料

- [GitHub と Slack を連携させる](https://get.slack.help/hc/ja/articles/232289568-GitHub-%E3%81%A8-Slack-%E3%82%92%E9%80%A3%E6%90%BA%E3%81%95%E3%81%9B%E3%82%8B)
TensorFlow-Object-Detection(物体認識)を使って学習モデルの作成からiOSでビルドするまでの道のり【学習】

## 前回まで
前回はTensorFlowを使って学習させるまでのセットアップからデータの収集と学習に必要なデータの準備を行いました。ここからは学習の工程に入ります。
※私は機械学習については全くの素人です。

##### おおまかな流れ
1. 学習準備
 1. TensorFlowのセットアップ 
 * 対象画像を集める
 * 画像ごとにラベリング
 * TFRecordを作成
2. **学習**
 1. **モデル学習用のconfigファイルを用意**
 * **学習**
 * **学習過程を確認**
 * **学習モデルの書き出し**
3. iOS

## モデル学習用のconfigファイルを用意
事前に学習してある学習モデルを使って、集めた画像を機械学習させます。使う学習モデルによって認識精度とスピードが異なるようです。[こちらのサイト](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md)に各モデルを使って学習させた場合の、認識スピードと精度の対応表があります。ただし、 GPUは`Nvidia GeForce GTX TITAN X card`で測定しているそうです。

上記サイトから`ssd-mobilenet-v1`をダウンロードしてきて、以下のファイルをtensorflow-stamp-mode/に移動させます。

* model.ckpt.meta
* model.ckpt.index
* model.ckpt.data-00000-of-00001
* pipeline.config

そして、pipeline.configを編集します。基本的に`PATH_TO_BE_CONFIGURED`と書いてある箇所です。

```bash:pipeline.config変更箇所
# 変更後
num_classes: 3 # ラベル名の数？だと思う
fine_tune_checkpoint: "model.ckpt"
label_map_path: "annotations/label_map.pbtxt"
input_path: "train.record"
label_map_path: "annotations/label_map.pbtxt"
input_path: "val.record"
```

## 学習
これで準備が整ったので、いよいよ学習に入ります。modelフォルダに学習過程が保存されていきます。学習を中断させても、もう一度下記のコマンドを叩けば続きから学習するようです。
また、`fine_tune_checkpoint`をコメントにすると学習済みのモデルを使用しないで0から学習できるようです。

```bash:/tensorflow-stamp-model
python object_detection/model_main.py \
--logtostderr \
--model_dir=model \
--pipeline_config_path=pipeline.config
```

GPUがないため、私の環境で停めたり学習したりを繰り返しながら15638ステップまで到達するのに**2日**ほどかかりました。。。

## 学習過程を確認
学習状況を確認するためにtensorboardというツールを使います。

```bash:/tensorflow-stamp-model
tensorboard --logdir model

http://0.0.0.0:6006/
```
![test.gif](https://qiita-image-store.s3.amazonaws.com/0/117549/3b8c51e6-9188-41fb-e048-338edce4c85f.gif)
上記gifで同じ画像が2枚並んでいますが、左側が推論によって検出されたオブジェクトで右側がラベリングしたときのラベル位置になっています。ステップ数が上がるにつれて、検出できるオブジェクト数が増えていっているのが分かります。この左側の画像になにも表示されない場合は、学習不足もしくは特徴量が足りない可能性があります。

## 学習モデルを書き出し
ある程度の認識精度が出たら、modelフォルダにあるデータを学習モデルとして書き出します。
modelフォルダにある以下のファイルをコピーしてtensorflow-stamp-model/に移動します。
※ 番号はステップ数に応じて変更してください。

* model.ckpt-15752.index
* model.ckpt-15752.meta
* model.ckpt-15752.data-00000-of-00001

```bash:/tensorflow-stamp-model
python object_detection/export_inference_graph.py \
        --input_type image_tensor \
        --pipeline_config_path pipeline.config \
        --trained_checkpoint_prefix model.ckpt-15752 \
        --output_directory output_inference_graph
```


これでiOSで利用するための学習モデルができました。
次回はこの学習モデルを使ってiOSに組み込むまでを記録します。

---
動作保証はしませんが、今回のTensorFlowのプロジェクトは[GitHub](https://github.com/mitsuyacider/tensorflow-stamp-model)に置いてあります。
また、TensorFlowの学習モデルをiOSに組み込んだプロジェクトは[こちら](https://github.com/mitsuyacider/tensorflow-ios-build)です。ご自由にお使いください。
要素数50の配列の中から、入力した整数以上の数と未満の数を出力するプログラム

現在javaの勉強をしていて表題のプログラムを作成する課題をやっております。
まずランダムで要素数50の配列をつくり、その後入力された整数以上の数を出力、その後改行して入力された整数未満の数を出力したいのですが、うまくいきません。
どこを直したらよいかアドバイスいただけないでしょうか？

```
class test17 {
    public static void main(String[] args) {
        int[] array = PConsole.createRandomIntArray(1, 300, 50, true);
        int th= PConsole.inputIntNum(1, 300); // 閾値

        int upper = array[0];
        int lower = array[1];

        for (int i = 0; i < array.length; i++) {
            if ( array[i]>= th) {
              upper+= array[i]+" ";
            }else{
              lower+= array[i]+" ";
            }
        }
        System.out.println(th);
        System.out.println(upper);
        System.out.println(lower);
    }
}       
```
【Rider】Unityで新規プロジェクト作成と設定の保存ができない場合の対処

# はじめに
久しぶりにUnity触ろうと新規プロジェクト作成しようとしたができなかった。
解決にちょっと悩んだので備忘録。

# 症状
具体的には`File -> New Project -> Create project`としてもプロジェクトが作成されず、Unityが死んだまま再起動もされない。

また、`Unity -> Preferences`から設定を変更してUnityを再起動しても設定が保存されていない。

# 環境
* Unity 2018.2.3f1, 2018.2.20f1
* Rider 2018.2.3

２つのバージョンのUnityで試したけど両方ダメだった。

# エラー内容
`$ tail -f ~/Library/Logs/Unity/Editor.log `

>
...
Refresh: detecting if any assets need to be imported or removed ...
Refresh: elapses 0.017180 seconds (Nothing changed)
Refresh completed in 0.017242 seconds.
Refresh: detecting if any assets need to be imported or removed ...
Refresh: elapses 0.016770 seconds (Nothing changed)
Refresh completed in 0.016825 seconds.
[Package Manager] Server::Kill -- Server was shutdown
Cleanup mono
get_unityVersion is not allowed to be called while application is terminating.
(Filename: /Users/builduser/buildslave/unity/build/Runtime/Scripting/ScriptingThreadAndSerializationSafeCheck.cpp Line: 85)
Unhandled Exception: UnityEngine.UnityException: get_unityVersion is not allowed to be called while application is terminating.
  at <0x00000> <unknown method>
  at <0x00000> <unknown method>
  at <0x00000> <unknown method>
  at <0x00000> <unknown method>
  at <0x00000> <unknown method>
  at <0x00000> <unknown method>
  at <0x00000> <unknown method>

---
> Unhandled Exception: UnityEngine.UnityException: get_unityVersion is not allowed to be called while application is terminating.

この部分を読む限りだと終了時に異常が起きていて正しく終了できていないように見える。

なので設定を変更して終了しても変更が保存される前に死ぬのでは。

# エラーの原因
エラーでググった。

["GET_UNITYVERSION IS NOT ALLOWED TO BE CALLED WHILE APPLICATION IS TERMINATING." IN LOG FILE WITH CERTAIN CMD ARGUMENTS](https://issuetracker.unity3d.com/issues/get-unityversion-is-not-allowed-to-be-called-while-application-is-terminating-dot-in-log-file-with-certain-cmd-arguments)

> IVANSHAKHOVJAN 04, 2019 12:37
> I can reproduce it with Rider EditorPlugin.

Riderのプラグインが原因らしい。

# 解決方法（WIP）
0. `Assets -> Plugins -> Editor -> JetBrains`をディレクトリごと削除
0. Unityを終了（まだエラー出て死ぬ）
0. Unityを起動
0. Unityを終了（エラーが出ずに正しく終了）

でとりあえず解決。

でもRider使えないと困るので、Riderを開いて再度プラグインをインストール。
インストール完了後、以下のポップアップが出た。

>
Rider plugin v2018.2.0.104 can be found at: Assets\Plugins\Editor\JetBrains\JetBrains.Rider.Unity.Editor.Plugin.Repacked.dll.

これでUnityを終了すると再度同じエラーが出たので、根本的な解決にはならなかった。

Riderのバージョンとか上げたらいいんだろうか。また後で試す。
ネットワーク関連の備忘録

#Apache Serverで簡単なCGIプログラムを書いた時の備忘録

## TL;DR
初めてネットワーク関連のことで遊んだので、復習がてらまとめていこうという備忘録。今まであまり意識したことがなかったファイルのパーミッション系統を意識できるようになって良かった。あと、Pythonの`eval`関数がすごく便利。


##よく使ったコマンドたち
1. `cd`: 言わずもがな
2. `ls -al`:今までパーミッションあまり気にしなかったので`ls -a`でよかったんだけど、`ls -al`の大事さがわかった。
3. `vim`:ターミナル内で完結するエディタは便利。gitにvimrc上げとけばSublime text3とかJupyter notebookとか使えないときに使えるので、vimrc最低限は書いてgitに上げておこうと思った。
4. `chmod`:パーミッション関連。とりあえずCGI実行したければ755っておばあちゃんが言ってた。777にするとCGI動かない罠にはまっていた。
5. `curl`:お手軽にGETとかPOSTとかできるのがすごい。でもこれについては奥が深すぎていまいちわかってない。
6. `which`:シバン行書くときに大事ってことがよくわかった。
7. `netstat`:ポートの状況を知りたいときに非常に便利だった。

## Apache Server関連
```bash
#install
yum -y install httpd

#Serverの開始
sudo service httpd start

#自動起動設定
sudo chkconfig httpd on

#再起動
sudo apachectl restart 
```

## ファイル構成など
詳しい人たちは当然知っているんでしょうが、そもそもindex.htmlどこにあるの？ってところから詰まったので・・・

```bash
#index.htmlとか
/var/www/html/

#cgi置き場
/var/www/cgi-bin/

#error_log
/var/log/httpd/error_log/

#httpd.conf
/etc/httpd/conf/httpd.conf
```
##BASIC認証
セキリティ的にかなり問題があるらしいが、一番簡単らしいので。

```bash
#アカウントを作成
htpasswd -c -b /etc/httpd/conf/.htpasswd <user> <password>
vim /etc/httpd/conf/httpd.conf
```
httpd.confの末尾に以下を追加

```conf

<Directory "/var/www/html/">
      AuthUserFile /etc/httpd/conf/.htpasswd
      AuthGroupFile /dev/null
      AuthName "Basic Auth"
      AuthType Basic
      Require valid-user
</Directory>
```
## PythonをCGIで動かすための設定
### SElinuxの無効化
```
getenforce
#Disabled
```
であることを確認。
状態は以下のように表される。

|表示|状態|
|---|---|
|Disabled   |無効化されている
|Enforcing  |有効
|Permissive |有効だがアクセス制限は行わず警告

### httpd.confファイルを設定する
```
sudo vim /etc/httpd/conf/httpd.conf
```

#### コメントアウトされてる行の有効化

```
#コメントアウトを外す
LoadModule cgid_module modules/mod_cgid.so
```

#### .pyがCGIとして認識されるようにする

```conf
 576 #下の三行を足す
 577 <IfModule alias_module>
 578 ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
 579 </IfModule>
 580
 581 #
 582 # "/var/www/cgi-bin" should be changed to whatever your ScriptAliased
 583 # CGI directory exists, if you have that configured.
 584 #
 585 <Directory "/var/www/cgi-bin">
 586     AllowOverride None
 587     Options ExecCGI　#ExecCGIにする
 588     Order allow,deny
 589     Allow from all
 590 </Directory>
 591 AddHandler cgi-scprit .cgi .py .pyc #この行に.py .pycを足す
```
### 実行ファイルを作る（Hello World)
```bash
sudo vim /var/www/cgi-bin/test.py
```
とりあえずHello Worldさせてみる。シバン行は環境ごとに変える。pyenvとか使ってると色々変わるらしい。

```bash
which python3
#!/usr/bin/python3
```

```python
#!/usr/bin/python3 #シバン行
# coding:utf-8
print("Content-Type: text/html\n") #おまじない、意味がわかってないので今度調べる
print("Hello World")
```
### 実行

```bash
sudo chmod 755 test.py　#権限を付与
curl http://IP:port/cgi-bin/test.py
#Hello World
```

### 実行ファイルを作る（keyを受け取る）
```bash
sudo vim /var/www/cgi-bin/test1.py
```

```python
#!/usr/bin/python3 #シバン行
# coding:utf-8
import cgi

print("Content-Type: text/html\n")

form = cgi.FieldStorage()
key=form.getvalue('key', 'default') #keyを受け取る。keyなしならdefaultを返す。

print(key)
```

### 実行
```bash
sudo chmod 755 test1.py
curl http://IP:port/cgi-bin/test.py?key=aaa
#aaa
```

## あとがき
随時増やすかもしれない。Permisson denyに苦しまされた勉強でした。
Python の http クライアントの使い方 (Post)

```py:http_post.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	http_post.py
#
#					Jan/24/2019
#
# ------------------------------------------------------------------
import	sys
import	json
import	requests
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
url="https://httpbin.org/post"
args={}
args['user'] = 'jiro'
args['password'] = '123456'
#
rr=requests.post(url,args)
print(rr.text)
#
dict_data = json.loads(rr.text)
#
print("Host:\t" + dict_data['headers']['Host'])
print("origin:\t" + dict_data['origin'])
print("url:\t" + dict_data['url'])
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行結果

```text
$ ./http_post.py 
*** 開始 ***
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "password": "123456", 
    "user": "jiro"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "25", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.25.1", 
    "X-Amzn-Trace-Id": "Root=1-62ea1008-74ec40232232071557e44577"
  }, 
  "json": null, 
  "origin": "219.126.136.52", 
  "url": "https://httpbin.org/post"
}

Host:	httpbin.org
origin:	219.126.136.52
url:	https://httpbin.org/post
*** 終了 ***
```

次のバージョンで確認しました。

```text
$ python --version
Python 3.10.4
```

## 認証がある場合の例
[Python3: ChatGPT Speech to text の使い方 (requests)](https://qiita.com/ekzemplaro/items/1b093a23579659198cf2)
Python の http クライアントの使い方 (Get)

```py:http_get.py
#! /usr/bin/python
#
#	http_get.py
#
#					Aug/03/2022
#
# ------------------------------------------------------------------
import	sys
import	json
import	requests
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
url="https://httpbin.org/get"
args={}
#
rr=requests.get(url,args)
dict_data = json.loads(rr.text)
#
print("Host:\t" + dict_data['headers']['Host'])
print("origin:\t" + dict_data['origin'])
print("url:\t" + dict_data['url'])
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行結果

```text
$ ./http_get.py 
*** 開始 ***
Host:	httpbin.org
origin:	219.126.136.52
url:	https://httpbin.org/get
*** 終了 ***
```

次のバージョンで確認しました。

```text
$ python --version
Python 3.10.4
```
【Ruby】n営業日前の日付をだす

## はじめに
いろいろググったけど、nの値が固定されている想定のものばかりだったので、nが変動する場合はこれでいいんじゃないかというメモ。

例は3営業日前をだしてみた。
## コード

```ruby:
require 'date'
require 'business_time'
require 'holiday_japan'


hiduke = Date.new(2018, 12, 25)  # 元になる日付を指定 今日でいいならダイレクトにDate.todayでよし

n = 3  # 回数指定

cnt = 0  # 箱作り

n.times do  # n回繰り返し
  cnt += 1

  while  cnt.business_days.ago(hiduke).national_holiday? do  # 祝日かどうか判定
    cnt += 1
  end

end

puts cnt.business_days.ago(hiduke)
```

```ruby:実行結果
2018-12-19
```
## おわりに
'business_time'では祝日が休日に含まれないので 'holiday_japan'で祝日判定。振替休日にも対応。
3営業日前だけを判定にすると、1・2営業日前が祝日でもカウントしてしまうのでn回数分判定を繰り返す。

もし今日の日付を元にしたいなら、タイムゾーンの問題がでてくる。

n営業日後を出したいなら ago をafter に変えればOK。

いろんな日付で試してて気付いたけど、大晦日って祝日じゃないんだなあ…
完璧にするなら「国民の祝日」ではないけど一般的な休日も含められるようにする必要あり。
Storybookでプレビューに表示確認のための背景色を設定する

例えば、下のように背景が白いものがあり、ページ全体のベースの色が白いのままだと本当に丸角になっているかなど確認ができないです。
Storybookのプレビューでは、デフォルトの背景色を設定できるAddonがあるので紹介します。また、BACKGROUNDパネルで、他の色を選択させることも可能です。

![img_background.png](https://qiita-image-store.s3.amazonaws.com/0/177417/0155db21-6667-b8e0-ebf7-92c97f7219bf.png)

## 方法
[storybookのアドオン（Storybook Addon Backgrounds）](https://github.com/storybooks/storybook/tree/master/addons/backgrounds)をインストールします。

```
npm i -D @storybook/addon-backgrounds
```

「.storybook/addons.js」にimportします。

```
import '@storybook/addon-backgrounds/register';
```

「.storybook/config.js」にAddonをimportし、何色をデフォルトにして、他何色選べるか設定します。

```
import { withBackgrounds } from '@storybook/addon-backgrounds'; // importを追加

addDecorator(
   withBackgrounds([
     { name: 'default', value: '#f0f0f0', default: true }, // デフォルトの色にdefault:trueを絵ッてい
     { name: 'white', value: '#fff' },
   ])
);
```

さらに、個別のstoryに個別の設定をして上書きすることも可能です。

```
import { withBackgrounds } from '@storybook/addon-backgrounds'; // importを追加

storiesOf('Molecules/FilterLink', module)
  .addDecorator(
    withBackgrounds([
      { name: 'default', value: '#ff0000', default: true },
      { name: 'white', value: '#fff' },
    ])
  )
  .add('使い方', withInfo(`
～省略～
```

## 参考文献
* [Storybook Addon Backgrounds](https://github.com/storybooks/storybook/tree/master/addons/backgrounds)
Railsでerbをhamlに変換する方法

簡単ではありますが、Railsでerbをhamlに変換する方法をまとめてみました。

3ステップで変換することが出来ます。


#1.Gemfile  の編集

Gemfileに

```
gem 'haml-rails'
gem 'erb2haml'
```

を追加する。

1つ目のGemで、hamlを導入。
2つ目のGemで、コマンド1つでhamlに変換できるためのGemである、erb2hamlの導入。



#２.bundle install

bundle installを実行する。

#3.変換してみる

ターミナルで、

```
rake haml:replace_erbs
```

を実行。

すると。。。


```
Looking for ERB files to convert to Haml...
Converting: app/views/layouts/application.html.erb... Done!
Removing: app/views/layouts/application.html.erb... Removed!
Converting: app/views/layouts/mailer.html.erb... Done!
Removing: app/views/layouts/mailer.html.erb... Removed!
Converting: app/views/layouts/mailer.text.erb... Done!
Removing: app/views/layouts/mailer.text.erb... Removed!
```

となる。

これで、erbをhamlに変換することが出来ます。
Storybookのサイドバーのコンポーネントの表示を階層化する


Storybookでコンポーネントを沢山った場合にカテゴリー、例えばAtomic DesignならMoleculesやOranismsなどで階層化したいときに便利です。
下記のような表示にすることができます。

![img_side.png](https://qiita-image-store.s3.amazonaws.com/0/177417/fa56d805-0ddb-ce1b-7082-a318155cf2de.png)

## 方法
各storyのstoriesOf部分にスラッシュを利用するだけ！スラッシュで区切っていくと、その分階層が深くなります。

```
storiesOf('Molecules/Buttons/Simple', module).add('with text', () => (
  <Button onClick={action('clicked')}>Hello Button</Button>
));
```
また、[StorybookのAddonのoptions](https://github.com/storybooks/storybook/tree/master/addons/options)を利用し、下記プロパティの「hierarchySeparator」で「/」で切るか「.」で切るかなど設定ができるようです。

## 参考文献
* [Nesting stories | Writing Stories |Storybook](https://storybook.js.org/basics/writing-stories/#nesting-stories)
rails destroyメソッドに飛ばない

rails で destroyメソッドに飛ばなくて苦戦していました。

javascriptの読み込みができてないのでは、などの解決法を参考にしても解決せず・・


そもそも自分の飛ばし方が間違っていたっぽいです＞＜

https://rails-study.net/delete/

こちらのサイトを参考にさせていただいたところ解決いたしました。

```view.html.erb
<%= link_to "削除する", member_path(@member.id), method: :delete %>
```

member_path のmember を自分のコントローラ名前に
@member.id は削除したいデータのidが代入されていればできるものと思われます！
CSSで子要素を親要素の中央に配置する方法

positionを使う方法とflexを使う方法があります。

```ruby:HTML
	<div class="parent">
		<div class="child"></div>
	</div>
```
##positonを使う場合
```ruby:CSS
.parent {
	position: relative;
}
.child {
	width: 100px;
	height: 100px;
	position: absolute;
	left: 0;
	right: 0;
	top: 0;
	bottom :0;
	margin:  auto;
}
```
※子要素に高さや幅を設定していない場合は、親要素と同じ大きさになります。

##flexを使う場合
```ruby:CSS
.parent {
	display: flex;
	justify-content: center;
	align-items: center;
}
.child {
	width: 100px;
	height: 100px;
}
```
Zen2あれこれ

# はじめに

毎度のことながら、備忘録につきとりとめはないです。

（2019.03.18 ちょっと[追記](#20190318追記)）

# Zen2
Elasticsearch 7.0から[Zen](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery-zen.html)にかわって搭載されるDiscoveryモジュールです。

以降は、[こちら](https://www.elastic.co/guide/en/elasticsearch/reference/master/modules-discovery.html)に記載されていることを試しつつ書いたものです。

Zenと比べて、ちょいちょい設定とか動きが違います。
詳しいところは・・・オンラインマニュアルか、[公式ブログ](https://www.elastic.co/blog)で公開される情報を確認。

## 起動時の設定チェック

若干うざいですが、起動時に設定が足りてないと怒られます。
[ここ](https://www.elastic.co/guide/en/elasticsearch/reference/master/modules-discovery-bootstrap-cluster.html)みて設定しましょう。

## Quorum baseの決定
Zenでは、`discovery.zen.minimum_master_nodes`に最低マスターノード数を指定していました。
この設定はZen2では無くなり、現在のマスターノード数に応じて自動で定足数を決定します。

たとえば5台のマスターノード（データノードを兼務してても良い）があるとします。このとき、スプリットブレインが発生しないようにするには、最低3ノードが必要なので、定足数は3となります。
Zen2環境では、同時に2ノードまでは落ちてもそのまま動き続けますが、3ノード落ちるとその時点でクラスタの動作が停止します（6.xまでと同じように、`discovery.zen.no_master_block`で動作が変わります（7.0では試してないけど））。
⇒名称が変わってました。[`cluster.no_master_block`](https://www.elastic.co/guide/en/elasticsearch/reference/7.0/breaking-changes-7.0.html#_new_name_for_literal_no_master_block_literal_setting)です。

## 定足数の自動削減設定

デフォルトでは、定足数は現在稼働しているマスターノード数に基づいて決定されます。
先ほどのように5ノードで起動した後で3ノードに減った場合は、定足数は2になります。

この動作は、elasticsearch.ymlに`cluster.auto_shrink_voting_configuration`を設定することで変更できます。
`false`にした場合は、5ノードから3ノードに減った後でも定足数は3のままとなります。従って、この後1ノードでも落ちるとクラスタの動作は停止します。

## Voting Configuration

定足数は、マスターノードのうち投票権を持つノード数が影響してきます。
明示的にマスターノードから投票権を削除するには、[Voting configuration exclusions API](https://www.elastic.co/guide/en/elasticsearch/reference/master/voting-config-exclusions.html)（長い！）を使用します。

たとえば5台（名前はnode-1～node-5とします）のマスターノードがあるとします。
このとき、node-4とnode-5から投票権を削除します。

```
POST /_cluster/voting_config_exclusions/node-4
POST /_cluster/voting_config_exclusions/node-5
```

この状態で、node-3～node-5を停止した場合、通常であればクラスタの動作ができなくなるところが、問題なく動作かのうとなります。これは、2台の投票権が削除されたことにより定足数が3になるためです。

現在どのノードが投票権を削除されているかを確認するには、以下のようにします。

```
GET /_cluster/state?filter_path=metadata.cluster_coordination.voting_config_exclusions
```

```
GET /_cluster/state?filter_path=metadata.cluster_coordination
```
とだけすると、現在のマスターノードも表示されるようになります。

投票権を戻す場合は、

```
DELETE /_cluster/voting_config_exclusions
```

をします。
が、これ実行した後で状況を確認すると、リストに乗ったままなんですよねぇ・・・

```
DELETE /_cluster/voting_config_exclusins?wait_for_removal=false
```

にすると、すぐに消えます。

ちょっとわかりにくくなりますが、
1. 最初に5ノード立ち上げる
2. 2ノードから投票権を削除する
3. 3ノード落とす
4. 削除した投票権を戻す
とした場合、投票権を持つノードは3台のままで2ノードが動いているので、そのまま動作を続けます。これは`cluster.auto_shrink_voting_configuration`の設定に依存しません。

# その他

設定項目は[いろいろ](https://www.elastic.co/guide/en/elasticsearch/reference/master/modules-discovery-settings.html)あります。
GAが楽しみですね～

# 追記
### 2019.03.18追記

[elasticsearch-node](https://www.elastic.co/guide/en/elasticsearch/reference/7.0/node-tool.html)なるツールが追加されているらしい。

少なくとも1台のMaster-eligible nodeがあるときに、その1台を使って unsafe-bootstrap で新しいクラスタを起動。当たらいクラスタに detach-cluster でノードを移動。
Dockerの不要なコンテナ・イメージを一括削除する方法

## タグがついていないイメージをすべて削除する
```
docker rmi $(docker images -f 'dangling=true' -q)
```
## コンテナをすべて削除する
```
docker rm -f $(docker ps -a -q)
```

### 参考
https://suin.io/537