OmniAICreator/Qiita-1.07M huggingface dataset:
[AWS]デプロイ手順その①（環境構築編）

# 背景
AWSのデプロイは手順が長かったので、３つに分けて手順を記載する。

その②
https://qiita.com/ren0826jam/items/37b827343cd1128c3c0e

その③
https://qiita.com/ren0826jam/items/22153a9e3def565c93f6

## 手順
1.AWSページからEC2ページに行き、旧バージョンに切り替える(左上の切り替えスイッチ)

2.「インスタンス作成」をクリック

3.「AMIの選択」にしてから、「Amazon Linux AMI」を選択

4.「インスタイプの選択」にしてから、「t2.micro」を選択し、確認と作成

5.「インスタンス作成の確認」にしてから、起動

6.キーペアを入力してダウンロードしておく(スペース入れない)

7.インスタンスを作成し、インスタンスIDをコピー

8.サイドバーの「Elastic IP」を選択し、「新しいアドレスの割り当て」をクリック

9.Amazonプールをチェックし、割り当てし確認してから閉じる

10.「アクション」→「アドレスの関連付け」をクリック

11.インスタンスに先程コピーしたIDを貼って関連付け

12.パブリックIPとElastic IPが同じか確認

13.セキュリテイグループのリンクをクリック

14.「インバウンド」→「編集」をクリック

15.「ルールの追加」し、下記の様に設定し保存する。
※タイプを「HTTP」、プロトコルを「TCP」、ポート範囲を「80」、
　送信元を「カスタム / 0.0.0.0/0, ::/0」に設定
 
16.下記の手順でec2-userにログインする

```ruby

$ cd ~


$ mkdir ~/.ssh

$ mv Downloads/ダウンロードした鍵の名前.pem .ssh/
# mvコマンドで、ダウンロードしたpemファイルを、ダウンロードディレクトリから、.sshディレクトリに移動します。

$ cd .ssh/

$ ls
# pemファイルが存在するか確認しましょう

$ chmod 600 ダウンロードした鍵の名前.pem

$ ssh -i ダウンロードした鍵の名前.pem ec2-user@作成したEC2インスタンスと紐付けたElastic IP
# ダウンロードした鍵を用いて、ec2-userとしてログイン
```
17.下記の手順で設定用のツールをインストールする(ec2-userログイン状態で)

```ruby

$ sudo yum -y update

$ sudo yum -y install git make gcc-c++ patch libyaml-devel libffi-devel libicu-devel zlib-devel readline-devel libxml2-devel libxslt-devel ImageMagick ImageMagick-devel openssl-devel libcurl libcurl-devel curl

```
18.下記の手順でNode.jsをインストールする(ec2-userログイン状態で)

```ruby

$ sudo curl -sL https://rpm.nodesource.com/setup_6.x | sudo bash -

$ sudo yum -y install nodejs
```

19.下記の手順でrbenvとruby-buildをインストールする(ec2-userログイン状態で)

```ruby

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv 
# rbenvのインストール

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile 
# パスを通す

$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
# rbenvを呼び出すための記述

$ source .bash_profile
# .bash_profileの読み込み

$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
# ruby-buildのインストール

$ rbenv rehash  
# rehashを行う
```

20.下記の手順でRubyをインストールする(ec2-userログイン状態で)


```
$ rbenv install 2.5.1

$ rbenv global 2.5.1

$ rbenv rehash

```

21.MySQLをインストールする(ec2-userログイン状態で)

```ruby
$ sudo yum -y install mysql56-server mysql56-devel mysql56
```

22.MySQLを起動する(ec2-userログイン状態で)

```
$ sudo service mysqld start
# MySQL起動

$ sudo service mysqld status
# 起動しているか確認(~ is runnningと出る)
```

23.MySQLのパスワード設定(ec2-userログイン状態で)

```ruby

$ sudo /usr/libexec/mysql56/mysqladmin -u root password 任意のパスワード
# 0から始めない、メモしておく
```

24.MySQLの接続確認をする。(ec2-userログイン状態で)

```ruby

$ mysql -u root -p
# パスワード入力
```
ハイブリッドアプリなどで有効なcssの小技

## ハイブリッドアプリの動き
webviewは画面を長押しするとコピーなどのメニューが表示され、そのときにバイブも発動するという特徴があります。
ネイティブではこのようにならないので、長押ししてメニューが出ればハイブリッドアプリってすぐバレます。
そこまで意識する必要はないかもしれませんが、アプリによっては長押しでコメントを削除できたりとイベントを付けていたりするので、コピーさせる必要がないならば切っておいた方が良いと思います。 

# コピーメニュー非表示とバイブ停止
```css
* {
  -webkit-user-select: none;
}
```
これでコピーメニューが表示されなくなりますし、バイブも発動しません。
ただこれだと、input要素に入力もできなくなるので、

``` css
input, textarea {
  -webkit-user-select: auto;
}
```

としておきましょう。
`not`を使ってもOKです。  

# リンク長押し時のメニュー非表示
リンクを長押しすると違ったメニューが出る場合があります。  

``` css
* {
  -webkit-touch-callout: none;
}
```
これで出ないです。
ただバイブは発動するようでした。
気になるならaタグでのリンクはやめて違う要素で`click`イベントで遷移するようにしてしまえばバイブは発動しません。

# ハイライト停止
長押しするとその部分にハイライトがかかることがあります。

```css
* {
  -webkit-tap-highlight-color: transparent !important;
}
```
これでハイライト部分が透明になるので事実上ハイライトが消えます。

## まとめ
ハイブリッドアプリを作るうえでwebviewの不必要な機能をcssでOFFにする方法を紹介しました。  
知らないと設定することもないですが、簡単にできるのでデフォルトで設定しておきましょう。
【AWS】Beanstalk上で動くEC2を夜間停止させる

# 目的
- Beanstalkで動く環境を日中だけ動作させ、夜間はコスト削減のために停止させたい

## 概要
- CloudWatchのイベント > ルールから、ラムダを実行する際にCron式でスケジュールを設定できるが、、Beanstalkで管理されているので、例えラムダでEC2を停止させても復活したりする
- かといってBeanstalkそのものを止めたり削除・復帰させるのは無駄な動作っぽい
- Beanstalkでスケジュール設定できるので、環境立ち上げ時に`.ebextension`に設定を記載することで、スケジューリングによるインスタンスの停止・起動が可能！

## 方法
- `.ebextension`に下記の内容を追記するだけでOK

```ebextension_scheduling.config

      // スケジューリング自体を開始させる日付を指定（現在日時より前ならOK）
      - namespace: aws:autoscaling:scheduledaction
        option_name: StartTime
        resource_name: ScheduledEC2Start
        value: "2020-04-01T04:07:2Z"

      // スケジューリング自体を停止させる日付を指定（適当に1000年後とかにしてます）
      - namespace: aws:autoscaling:scheduledaction
        option_name: EndTime
        resource_name: ScheduledEC2Start
        value: "2999-04-28T04:07:2Z"

      // インスタンスのマックス数を3に指定　　　
      - namespace: aws:autoscaling:scheduledaction
        option_name: MaxSize
        resource_name: ScheduledEC2Start
        value: "3"

      // インスタンスのミニマム数を2に指定　　　
      - namespace: aws:autoscaling:scheduledaction
        option_name: MinSize
        resource_name: ScheduledEC2Start
        value: "2"

      // 期待キャパシティを指定（今回は2にしてます）
      - namespace: aws:autoscaling:scheduledaction
        option_name: DesiredCapacity
        resource_name: ScheduledEC2Start
        value: "2"

      // スケジューリングを発動させる時間をCron式で指定
      - namespace: aws:autoscaling:scheduledaction
        option_name: Recurrence
        resource_name: ScheduledEC2Start
        value: "00 01 * * 1-6"

      // スケジューリング自体を開始させる日付を指定（現在日時より前ならOK）
      - namespace: aws:autoscaling:scheduledaction
        option_name: StartTime
        resource_name: ScheduledEC2Stop
        value: "2020-04-01T04:07:2Z"

      // スケジューリング自体を停止させる日付を指定（適当に1000年ごとかにしてます）
      - namespace: aws:autoscaling:scheduledaction
        option_name: EndTime
        resource_name: ScheduledEC2Stop
        value: "2999-04-28T04:07:2Z"

      // インスタンスのマックス数を0に指定　　　
      - namespace: aws:autoscaling:scheduledaction
        option_name: MaxSize
        resource_name: ScheduledEC2Stop
        value: "0"
　　　
      // インスタンスのミニマム数を0に指定　　　
      - namespace: aws:autoscaling:scheduledaction
        option_name: MinSize
        resource_name: ScheduledEC2Stop
        value: "0"

      // 期待キャパシティを0に指定
      - namespace: aws:autoscaling:scheduledaction
        option_name: DesiredCapacity
        resource_name: ScheduledEC2Stop
        value: "0"

      // スケジューリングを発動させる時間をCron式で指定
      - namespace: aws:autoscaling:scheduledaction
        option_name: Recurrence
        resource_name: ScheduledEC2Stop
        value: "00 11 * * 0-5"
```

### 説明
- この処理はオートスケーリング を利用したものなので、意味合いとしては停止時=インスタンスが0にスケーリングすることと同義
- 起動時は最大値3で最小値2、つまりスケーリングで最大3つまでインスタンスが増加するように指定
- 停止時は最大値・最小値・キャパシティ全てで0を指定しているので、=EC2全ての停止ということになる。

## 備考
- 今回はDBは外だしで環境を作ったので、EC2のみの停止にしていますが、DBもBeanstalkで作った際に設定できるのかが気になりました
- 基本的に自由度が少なくなるので、Beanstalk使うときにDBも一緒に作ることはあまりないかと思いますが、、、
- ちなみに外出しのDBはラムダをCloudWatchのルールでスケジューリングして設定しているので、EC2もDBも同じ時間で夜間停止させるという処理が可能です
- 開発・STG環境でのコスト削減に役立つのではないかとおもいっます
エクセルで小数点以下がある時だけ表示する

標準のセルの書式設定の数値かユーザ定義にあるだろうと思ったらうまくいかなかったのでメモ

## ユーザ定義
セルを選択して右クリック、セルの書式設置＞ユーザー定義で以下を指定

```
#,##0.###
//10->10.
//5.5->5.5
```

## 条件付き書式
### ルールを作成
セルを選択してホーム＞条件付き書式＞新しいルール
スタイル＞クラシック＞数式を使用して、書式設定するセルを決定で以下の式を設定

```
=INDIRECT(ADDRESS(ROW(),COLUMN()))=TRUNC(INDIRECT(ADDRESS(ROW(),COLUMN())))
```

### ユーザ書式の設定
書式＞ユーザー設定の書式
フォント＞色＞自動
塗りつぶし＞背景色＞色なし
ユーザー定義で以下を指定

```
#,##0
//10->10
//5.5->5.5
```

OKを３回くらい押して設定を終わる。

参考：[エクセルで数字を入力時、小数点以下があれば少数表示（小数点以下3桁）、なければ整数表示をする｜おたろく](https://otaroku.net/excel-decimal-point)
確率論的に円周率πを推定してみた

Pythonの標準ライブラリrandomを用いて、確率論的に（厳密に言えばモンテカルロ法的に）円周率を推定してみたという話です。
（読了見込時間：4分）

# 考え方
xy座標を思い浮かべてください。
<img width="560" alt="pi1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596862/e44b79e9-0731-10d3-fec3-dea023f05bc3.png">

ここに、原点Oを中心とする、半径rの円（Cとします）と、一辺が2rの正方形（Sとします）を描きます。
<img width="560" alt="pi2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596862/468a5c69-f84a-a226-940a-41128e2b21c2.png">

Sの中に、ひたすらランダムで点（dot）を打ち続けます。
<img width="559" alt="pi3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596862/f2575e8f-9041-b882-9ca7-579cf94b7a3b.png">

Sの中を埋め尽くすほど点を打ったとき、「Sの中にある点の数：Cの中にある点の数 ≒ Sの面積：Cの面積」と言えます。
<img width="560" alt="pi4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596862/1a05009f-18c0-6cf0-08b6-ecd1c1b25753.png">

Sの中にある点の数を「s_dot_num」、Cの中にある点の数を「c_dot_num」とおくと、

(c_dot_num) / (s_dot_num)
　= Cの面積 / Sの面積
　= (π * rの2乗) / (2r)の2乗
　= π / 4

となることから、

π = 4 * (c_dot_num) / (s_dot_num)

と定義ができました。
あとは、c_dot_numとs_dot_numをそれぞれ求めることができれば、πの値を推定できます。
（rの値は関係ないようですね）

# コード

今回はPythonで書きました。

```Python:estimate_pi.py
# 一辺の長さが1の正方形内にランダムにドットを打ち、円周率を推定する。
import random

def estimate_pi(n):
    c_dot_num = 0
    s_dot_num = 0
    for _ in range(n):
        x = random.uniform(0, 1)
        y = random.uniform(0, 1)
        distance = x**2 + y**2
        if distance <= 1:
            c_dot_num += 1
        s_dot_num += 1
    pi = 4 * c_dot_num / s_dot_num
    return pi

if __name__ == '__main__':
    print('dotが100個のとき、円周率は{}'.format(estimate_pi(100)))
    print('dotが1000個のとき、円周率は{}'.format(estimate_pi(1000)))
    print('dotが10000個のとき、円周率は{}'.format(estimate_pi(10000)))
    print('dotが100000個のとき、円周率は{}'.format(estimate_pi(100000)))
```

※イメージ
<img width="560" alt="pi5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596862/4748d646-836c-5af9-03c3-81abc6c43105.png">

# 実行結果
1回目
<img width="355" alt="r1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596862/03633aa0-1f28-a7c4-d9e9-4d3a22976c75.png">
2回目
<img width="354" alt="r2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596862/81555096-5373-e4cc-8b59-ae8b81eb280e.png">
3回目
<img width="352" alt="r3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596862/d3f4c277-9378-3eef-c828-c2beba207ce5.png">

おおよそ3.141前後になりました。
試行回数n（=dotを打つ回数）を増やすにつれて、精度が高まっています。

# まとめ
今回は、乱数を用いて円周率を推定してみました。
学術的には、乱数を用いて何らかの値を見積もる手法を「モンテカルロ法」と呼ぶそうです。

コード自体は決して難しくはないのですが、初めて知った時に「そういうアプローチがあるのか！」とテンション上がったので備忘録として。
Redmine-Markdownで文字色指定を有効化する(セキュリティリスク有の暫定対処)

# 背景
Redmineでは、テキストをMarkdown、または、textileのいずれかでパースし、表示できる。
Markdownの方が資料数が多く、また、他システム移行性が高いことから、Markdown記法を利用したい。
しかし、textileには文字色指定記法(`%{color: red}target%`)が存在する一方、Markdownには存在しない。
MarkdownはInner HTMLを許容することから、spanタグによる文字色指定(`<span style="color: red">target</span>`)を試みた。
しかし、文字色指定に失敗した。
RedmineでMarkdownでのパースを指定した場合に、文字色指定を有効化したい。

# 環境
+ Redmine: 4.0.4-stable

# 暫定対処
`REDMINE_DIR/lib/redmine/wiki_formatting/markdown/formatter.rb`における、
`Redmine::WikiFormatting::Markdown::HTML`クラス初期化時に、`:filter_html => false`を指定すればよい。

```diff
Redmine::WikiFormatting::Markdown::HTML.new(
+              :filter_html => false,
-              :filter_html => true,
              :hard_wrap => true
            )
```

**ただし、上記方法では全HTMLがフィルタされない。このため、XSSのリスクが高まることに注意が必要。**
上記方法の適用は利用ユーザを限定できる場合にとどめておくべきである。

# 恒久対処案
RedmineのはMarkdown formatterにRedcarpetを採用している。
Redcarpetに手を加え、textileの文字色指定記法を取り込んだ独自フォーマッタを作れば、
HTMLはフィルタしつつ、文字色指定も実現できるだろう。

# 補足
[Redmine.orgのMarkdown formattingに関するWikiページ](https://www.redmine.org/projects/redmine/wiki/RedmineTextFormattingMarkdown#Color)でstyleタグが有効であるかのように記載されているため、
著者の環境による問題である可能性も考えられる。

## 参考
* [Allow "style" tag in Markdown formatter](https://www.redmine.org/issues/22425)
 * Markdownフォーマッタ内でstyleタグが使えないというのチケット。起票が2018年でそこから未更新。
iOS Simulatorのステータスバーの表記をカスタマイズする(iOS13)

参考元: https://www.jessesquires.com/blog/2019/09/26/overriding-status-bar-settings-ios-simulator/

### 確認環境
Xcode: 11.4.1
iOS: 13.4.1

### 手順
iOSシミュレータが起動した状態で、ターミナルで下記のコマンドを実行

```bash
xcrun simctl status_bar "iPhone SE (2nd generation)" override --time 10:00 --dataNetwork wifi --wifiMode active --wifiBars 3 --cellularMode active --cellularBars 4 --operatorName "docomo" --batteryState charged --batteryLevel 100
```
Before:
![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43533/728098cc-ef45-ad59-4329-f4a2d2e58371.png)

After:
![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43533/9292366e-393e-de1e-2d2b-6044af57adc5.png)


### オプション
```bash
--time <string>
  Set the date or time to a fixed value.
  If the string is a valid ISO date string it will also set the date on relevant devices.

--dataNetwork <dataNetworkType>
  If specified must be one of 'wifi', '3g', '4g', 'lte', 'lte-a', or 'lte+'.

--wifiMode <mode>
  If specified must be one of 'searching', 'failed', or 'active'.

--wifiBars <int>
  If specified must be 0-3.

--cellularMode <mode>
  If specified must be one of 'notSupported', 'searching', 'failed', or 'active'.

--cellularBars <int>
  If specified must be 0-4.

--operatorName <string>
  Set the cellular operator/carrier name. Use '' for the empty string.

--batteryState <state>
  If specified must be one of 'charging', 'charged', or 'discharging'.

--batteryLevel <int>
  If specified must be 0-100.
```
lampを勝手にサーバーにインストールしてくれるスクリプト作った(debian/ubuntu想定)

##やりたかったこと

サーバー構築めんどいから自動化したかった。
後、dockerでいわゆる'lamp'コンテナの構築がしたかったので練習。
まあこれ使ってvagrant+chefでもよさそう。
lampを構築するだけならやること同じなのでスクリプト化しよう。ということで

##概要

**debian/ubuntu環境を想定**

apache2 + PHP7.3 + mysql5.7を勝手にinstallしてくれる。
PHPのバージョンは切り替え可能。
場合によってphpmyadminを設置可能。
場合によってcomposerを設置可能。
sslもcertbotで自動化しました。(選択可能)

##ソースコード

https://github.com/Diwamoto/install-lamp
VRCSDK3でのプレイヤーとのTriggerのとり方

プレイヤーがどこかに入ったかをチェックする方法です

## VRCSDK2時代

まず、CollisionのisTriggerがTrueです。
EventTriggerでは、OnEnterTrigger、Layer PlayerLocalにすることで、
プレイヤーがCollisionに入ったときの処理を行えました。

他にもOnAvatarHitというものもありますね。

## VRCSDK3になって

普通に考えれば、以下のように書きます

```
//うまくいかない例
public class MyClass : UdonSharpBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.Layer == 10) //10はPlayerLocal
        {
            // ヒットしたときの処理
        }
    }
}
```

なぜうまく行かないのか
プレイヤーとヒットした時、otherがnullだからです。
上記ソースでは、gameObjectにアクセスした時点でNullアクセス例外が発生します。

プレイヤーのGameObjectは取らせてくれません
なので、nullらしいです。

おいおい、どうすればいいんだ…と思ったら、一応解決方法が…。

OnlyCollideLocal というレイヤーを定義して、
これがPlayerLocalとしか反応しないようにすればいいとのこと
ソース　https://ask.vrchat.com/t/player-collision-in-udon/428

何やらモヤッとしますが、とりあえずはこれで作るしかなさそうです。
マークダウンからWordへ変換：はじめてのpandoc

# マークダウンをWordに変換

## 目的

* マークダウンで手順書や資料を書く人は多いかと思います。Qiitaに投稿もそうですね。
* 人様へ送付する時はPDFにすることが多いのですが、Word（可変ファイル）でくれーと言われることもあります。
* マークダウンからWordへの変換はpandocを使用します。細かいことは置いといて変換できるようになることを目的とします。



## 環境
* 私が試したのはWindowsです。Linux/Macも同じだと思います



## pandocについて

* Pandocとは、 フリーかつオープンソースのドキュメント・コンバータです。
* [日本語サイトはこちら](http://sky-y.github.io/site-pandoc-jp/users-guide/)
* 基本はマークアップ言語（HTML、Markdown、Texとか）に変換でき、その中にWordも含まれています。



## Pandocインストール

* [ここにインストーラがあります](https://github.com/jgm/pandoc/releases)
  * Linux/Mac/Windows版があります。
* Windows版の場合パスを通して欲しいときはインストーラ(msi)で導入して下さい。



## 使い方

* 基本的には下記です。

```
c:\temp\pandoc input.txt -o output.html 
```



* マークダウンからWordにするには下記です。
  * -t で形式を指定するだけのようです

```
c:\temp\pandoc input.md -t docx -o output.docx
```



## サンプル

* こんなマークダウンを
![img060.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543420/ff448d3a-0f4f-444c-ff78-0e4ec480200b.jpeg)



* こんなWordに
![img062.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543420/01ab975e-9499-7c04-f9cc-a25d9225aba1.jpeg)




## まとめ

* ひとまずデフォルト設定でやりたいことができました
* 見た目も問題なし
* 当たり前ですが、完全には移行できない(イメージ名や一部MDのソースがでたり）ので返還後の内容は確認しましょう
* 数ファイルしか試してませんが、データの欠落もなさそうです
* Wordのテンプレートも指定できるので使い勝手は良さそう
* これでQiitaに投稿したものもWordにできますね
* マークダウンで書く人 増えてーー
GradleでWebJarsを利用する

<p>下記のサイトを参考にやってみた。<br>
→<a href="http://hosomi.github.io/gitbook/_book/java/webjars.html">WebJarsの利用</a>
</p>
<p>※BootStrapやjQueryのバージョンは適宜変更すればいけそう。</p>
Rails チュートリアル 14章 following/followerページのテスト 演習回答　

リスト 14.29のassert_selectに関連するコードをコメントアウトしてみて、テストが正しく red に変わることを確認してみましょう。

```sample_app/app/views/users/show_follow.html.erb

<%#= link_to gravatar_for(user, size: 30), user %>
...
...     
<%#= render @users %>

```

ユーザー詳細ページは2リンクずつ存在しているため、

上記2箇所のコードをコメントアウトしないとredにならない。
エクセル列番号数値変換　EXCEL ROW Alphabet presentation conversion

エクセル列番号数値変換　EXCEL ROW Alphabet presentation conv


テーマ：プログラミング



　EXCELのセルの指定法は、RANGEだと「A1」つまり縦がCollumで横がRowと呼ばれる。しかしCellsプロパティだとCells(1,"A")で逆配置となる。これはCollumとRowを呼ぶ「視点」が違うことで、EXCELの代々のプログラマーでも見解が違ったことを意味すると思う。私は縦列を「Row]と呼んでいる。また下でも言及している列の番号付け（A,B......Z,AA,AB,,,）は人間の直感でわかりやすい表記法と思う。しかし、これを数値で考えたいときには、イレギュラーな26進法であり、簡単に数に直せない。横列の番号は値なのに縦はアルファベットとは、開発当時の気配りを感じえない。

　私の業務ではエクセルで表を見ながらそのデータを処理する必要があるので、CSVファイルにしてテキストで処理すると効率的な場合がある。エクセル内はVBAが使えて結構便利なのだが、数百ものファイルを一括処理するのはCSVファイル（もともとその形式で登録される）がいい。

　C言語でCSVテキストを処理するときは1行づつ読み込んで、エクセルの列番号に対応した配列を作らねばならない。しかしここで配列の位置を指定するときは”AA”を２７としなければならない（しかも配列は０から始まるので、配列[26]となる）・・・。

　簡単にアルファベット番号を数値に出来ると考えたのが間違いだった。「A」は１番目であり、「Z」は２６。つまり26進法だが、Zの次は「AA」（27）となり、26までは一桁なのに、「ZZ」（702）まで二桁だ。こんなヘンタイな進法は見たことがない。幸い下に示した　たかみんつ　さんのブログで対照表があるが、C言語で扱うときこの表を持つのはメモリ的にもプログラマの矜持的にも不本意だ。よってなんとか自力でアルゴリズムを見つけようとした。

 

　下が試行錯誤して作ったC言語での式だ。先人が既に作っているかと思い検索したが、見つからなかった（Githubは見ていない）のでひょっとすると、世界初のマイクロソフトのEXCEL囲い込みへの挑戦となるのかもしれない。誰かのお役に立てば幸いだ。3桁以上は検証が面倒で気力がなくなった。列「AB」なら一桁目の *word は「A」、二桁目は「B」とする。コンパイラによっては日本語の変数は使えないので注意。

 

char word[]="AB";

char 一桁目,二桁目;

int 桁数;// word の桁数（二桁なら２）を入れる変数

桁数=strlen(word);

switch( 桁数)
{ case 1:
result = 25 * ('A' - 'A') + (*word - 'A');
break;
case 2:
一桁目= (*word);
二桁目 = (*(word + 1));

result = ( 25 * (一桁目- 'A' + 1) + (一桁目- 'A' + 1) ) + (二桁目- 'A');
break;

default: printf("[VBA_alphabet_to_number]VBA縦配列の3桁には対応してません！誰か作ってね！\n");
return (0);//vba row index starts 1
break;

}

エクセル列番号対応表（たかみんつ　さん）　のブログ

https://takamin.github.io/techtips/xlsColNumMap
【Docker】MySQLで複数database環境を構築する

# 環境

- Docker
- MySQL 5.7

# 背景

Docker で MySQL を起動する時に、引数で database 名を指定できますが、`1つしか指定できない`という制限があります（`docker run` または `docker-compose` いずれを使った場合でも）。


# 複数databaseを構築する方法

https://hub.docker.com/_/mysql の `Initializing a fresh instance` の項目に、以下の通り書かれています（抜粋）。

> `/docker-entrypoint-initdb.d` にある`拡張子.sh、.sql、.sql.gzのファイルを実行します`。ファイルはアルファベット順に実行されます。
> SQLダンプをそのディレクトリにマウントすることでmysqlサービスを簡単に作成し、提供されたデータを含むカスタムイメージを提供できます。
> SQLファイルは、デフォルトでMYSQL_DATABASE変数で指定されたデータベースにインポートされます。

つまり、ローカルで SQLファイルを作成し、そのディレクトリを `/docker-entrypoint-initdb.d` にマウントすると、そのファイルが実行されます。

最後の文章（「SQLファイルは、デフォルトでMYSQL_DATABASE変数で指定されたデータベースにインポートされます」）が気になりましたが（MYSQL_DATABASE変数で指定されたデータベースが作成され、その中で新たなデータベースを作成することが出来るのか？）、問題なく作成できました。

# `docker run`と`docker-compose`に共通で必要なファイル

`.sql` というファイル名であれば何でもいいのですが、以下のようなファイルを用意します。
この中で、「database の作成」と「権限付与」を行います。
ここでではディレクトリ名を仮に`some_dir`としています。

```some_dir/init.sql
CREATE DATABASE IF NOT EXISTS `second_db_comes_here`;
GRANT ALL ON second_db_comes_here.* TO 'mysql_user_comes_here'@'%';
```

`second_db_comes_here` と `mysql_user_comes_here` を環境に応じて変更してください。

# docker run を使う場合

```shell
# 以下のコマンド自体を、どこかのファイルに記述していると仮定してください。

  CURRENT_DIR=$(cd $(dirname $0); pwd) # このファイルの full path が得られる。

  docker run --name $CONTAINER_NAME \
    -d \
    -p $DB_PORT:3306 \
    -e MYSQL_DATABASE=$DB_NAME \
    -e MYSQL_USER=$DB_USER \
    -e MYSQL_PASSWORD=$DB_PASS \
    -e MYSQL_ROOT_PASSWORD=$DB_ROOT_PASS \
    -v ${CURRENT_DIR}/some_dir:/docker-entrypoint-initdb.d \ # この行を追加する
    mysql:5.7
```

# docker-compose を使う場合

```shell
services:
  database:
    image: mysql:5.7
    env_file: .env
    environment:
      MYSQL_USER: 'mysql_user_comes_here'
      MYSQL_PASSWORD: 'mysql_password_comes_here'
      MYSQL_DATABASE: 'mysql_db_comes_here'
      MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
    ports:
      - 3307:3306
    volumes:
      - ./some_dir:/docker-entrypoint-initdb.d # この行を追加する。./some_dir 部分は、docker-compose.yml からの相対パス。
```

# 確認

MySQL にログインして、database ができていることを確認します。

```
$ docker exec -it <docker_container_name> /bin/bash

docker$ mysql -u root -p

mysql> show databases;

mysql> use <first_database>;
mysql> show tables;

mysql> use <second_database>;
mysql> show tables;
```

# 参考URL

上記の内容が、英語で説明されています。

- https://forums.docker.com/t/multiple-databases-in-official-mysql-container/8324/2
- https://github.com/abagayev/docker-bootstrap-collection/tree/master/mysql-few-databases

# リンク

- [CircleCI上で複数databaseを設定する例](https://qiita.com/luigiii/items/d02f94c6f3cc7e39e625)
Azure DevOps Pipelines の Microsoft-hosted と Self-hosted

#はじめに

ここでは [Azure DevOps Pipelines](https://azure.microsoft.com/ja-jp/services/devops/pipelines/) (以下 Pipelines) で利用可能なホスト環境を紹介したいと思います。

~~**※2020.06.27時点で iOS/Android の Micorosoft-hosted 環境では Unity インストール時に問題があるため Self-hosted 環境でしか動作確認は行えていません。**~~

~~**Microsoft-hosted 環境でのエラーの状況**~~

- ~~iOS~~
    - ~~macOS を環境として選択した場合、Unity のインストールでドライブのマウントが正常に行えないためエラー~~
    - ~~Windows 環境ではそもそもビルドできない~~
- ~~Android~~
    - ~~iOS と同じくドライブマウントでエラー~~
    - ~~Windows 環境では SDK/NDK の使用許諾で承認が行えない（ダイアログで承認が必要なため）~~

**※上記の問題は 2020.7.29 時点で解消されました。ただし、ひと手間必要になりますので、別途紹介したいと思います。**

##ホスト環境の種類

ホスト環境には以下の二種類の環境があります。

- [Microsoft-hosted](#microsoft-hosted)
- [Self-hosted](#self-hosted)

#Microsoft-hosted

これは Microsoft が提供しているクラウド環境で、自前で Windows や Mac などの端末を用意する必要がないので手軽に始めるにはかなり便利に扱えます。

Microsoft-hosted を利用する上でのメリット・デメリットは以下です。

###メリット

- 自前で機材やソフトを用意する必要がない
- ビルドごとにクリーンな環境が使える
- ビルドに必要なツールはだいたいはインストールされている
- 足りないツールは自動でインストールができる

###デメリット

- リモート接続が行えない（リモートデスクトップや PowerShell でログインできない）
- 必要なツールがインストールされていない時はインストールから始まるのでビルド時間が長くなる

#Self-hosted

一方こちらは事前に用意している端末を利用したい場合に選択します。
余っている Mac があるからそれをビルドマシンとして利用すると言った場合です。
Microsoft-hosted ではどうして手が届かない場合に使うものだと思ってもらえばいいです。

###メリット

- 自分の環境をそのまま使える
- ビルドが速い

###デメリット

- 予めビルド環境を用意しておく必要がある
- ~~足りないツールを自動でインストールができない~~
- 予めエージェントというものを登録しておかないといけない（最初の一回だけ）

#ホスト環境の選択方法

では、実際にホスト環境を選択する方法はというと YAML ファイルに以下のような記述をするだけです。

```yml
# Microsoft-hosted (Mac)
pool:
  vmImage: 'macOS-latest'
```

```yml
# Self-hosted (Mac)
pool:
  name: 'Unity Build for Mac'
```

Microsoft-hosted で利用可能な OS は簡単にまとめると以下の通りです。

|OS|指定方法|
|:--|:--|
|Windows (Server)|windows-latest|
|Mac|macOS-latest|
|Linux|ubuntu-latest|

詳細は公式サイトを参照ください。
[Microsoft-hosted agents](https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops#use-a-microsoft-hosted-agent)

#おわりに

とりあえずサクッと自動ビルドの環境を揃えたい人は確実に「**Microsoft-hosted**」一択です。
ただし、ちょっと凝ったビルド環境を整えたいと人は「**Self-hosted**」を選択するしかないかもしれません。
とりあえず私は何とか Microsoft-hosted 環境で揃えようと試行錯誤しますが…。

Self-hosted のエージェント登録については以下の投稿を参照してください。
[Self-hosted 環境を構築する方法](https://qiita.com/akiojin/items/ef9226b430ef73806b78)
tezos-client の使い方チートシート

## 準備のときあるある

### いつも使う tezos-node の登録

tezos-client は tezos-node と通信して動作する。 tezos-node はローカルで動かしてもいいし、信頼できるリモートのものがあればそれを使うこともできる。tezos-clientではいつも使うnodeを次のコマンドで登録することができる。

```sh
tezos-client --addr <host or IP address> --port <port> config update
```

使用例: `tezos-client --addr localhost --port 8732 config update`

### nodeがbootstrapするまで待機

対象の tezos-node が bootstrap 済みかどうか確認する。起動したばかりのnodeは bootstrap まで数日間かかることがある。

```sh
tezos-client bootstrapped
```

### faucetなどで得たアカウント情報の有効化

テスト環境 [^test] などでは最初に faucet からアカウント作成することがある。その場合は得た `tzXXXXX.json` のような json ファイルのパスを指定してアカウントを有効化する。

[^test]: Tezosのテストネットワークは `babylonnet` `cartagenet` などプロトコルごとの名前が付いている 

```sh
tezos-client activate account <nickname> with <path-to-json-file>
```

`<nickname>` はclientの動作する環境でのみ通用するあだ名です。恥ずかしい名前をつけても外の人から参照されることはありません。

使用例: `tezos-client activate account karepippi with tzXXXXXXX.json`

## アカウント情報確認、送金とかするときあるある

### ローカルに登録されているアカウント情報の一覧

```sh
tezos-client list know accounts
```

### 残高確認

```sh
tezos-client get balance for <nickname or publickeyhash>
```

使用例: `tezos-client get balance for proofninja`

### アカウントの新規作成

```sh
tezos-client gen keys <nickname>
```

### 送金

```sh
tezos-client transfer <金額> from <支払う人> to <受け取る人> --burn-cap <ディスク使用料金>
```

新しいアカウントへ送金する時など、ディスク容量のための手数料を支払う必要があることがある。その場合は `--burn-cap` オプションで支払ってもよい手数料の上限を指定することができる。`Fatal error: The operation will burn ꜩ0.257` などと言われた場合は `--burn-cap` を指定しよう。

## sandbox node を使っているときあるある

### protocol の activate

```sh
tezos-client activate alpha
```

## SCaml でスマートコントラクト動かすときあるある

関数型プログラマーがスマートコントラクトを開発するときは SCaml がオススメである。SCamlについて知らない人はこちら : https://www.scamlang.dev/docs/


### デプロイする

```sh
tezos-client originate contract <nickname> 
    transferring <金額> from <送り主> \
    running <プログラムファイルパス> \
    --init <storageの初期値> \
    --burn-cap <払ってもいいストレージ利用手数料>
```

使用例: `tezos-client originate contract counter transferring 0 from proofninja running counter.tz --init '(Pair 0 0)' --burn-cap 100`

### 呼び出す

Tezos スマートコントラクトは、そのコントラクトへ送金することでプログラムを呼び出す。その引数は `--arg` で指定しなければ `Unit` が与えられる。

```sh
tezos-client transfer <金額> from <送り主> to <contract名> --arg <引数>
```

使用例: `tezos-client transfer 0 from proofninja to counter --arg 42`

### ストレージの状態を見る

```sh
tezos-client get contract storage for <contract名>
```
個人的に一番簡単なHerokuのデプロイ方法

# 対象読者
・Herokuを学習中の方
・リクエスト数が少ないWebアプリを無料で公開したい方
・ポートフォリオを公開したい方
・ステージング環境でテストとかリリース承認フローとか慎重なプロセスは不要な方

# 概要
GitHubにコミットすると、自動でHerokuにビルド＆デプロイされるようにします。
画面操作のみで完結できるので、Heroku CLIのインストールやコマンド実行は不要です。
![heroku-overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263069/5190a71f-8e50-0fb0-0c48-7077f58ba00d.png)

# 背景
Heroku CLIを使った方法はたくさん出てきますが、
画面操作のみで完結できる方法はなかなか見つからなかったので書きました。

# 前提
・[Heroku](https://jp.heroku.com/)のアカウントを登録済みであること。
・[GitHub](https://github.co.jp/)のアカウントを登録済みであること。

# 方法
HerokuでAppを作成し、GitHubリポジトリと連携して自動デプロイする設定をします。

### 1. App作成メニュー選択
HerokuにデプロイするWebアプリの設定を新規作成します。
![04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263069/64e96573-d422-ca82-bcc4-acd266b98612.png)

### 2. 名前設定
Webアプリの名前を入れます。公開時のURLに反映されます。
![05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263069/d42f7b3d-710f-f3d7-956c-d2abd46a9393.png)

### 3. デプロイ方法設定
デプロイ方法に「GitHub」を選択して「Connect to GitHub」を実行します。
![12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263069/ea7c32b0-2a9d-9d17-8a0e-c850849e0ea1.png)

### 4. GitHubリポジトリの設定
デプロイ対象のソースがあるリポジトリを設定します。
![14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263069/34edafff-8aa1-76b8-7789-d2dbc52bd6f6.png)

設定が成功すれば、「connected」になります。
![15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263069/48608e05-cd20-5bd1-116a-50e2f04997e6.png)

### 5. 自動デプロイの設定
「Enable Automatic Deploys」を実行して自動デプロイを有効にします。
![16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263069/493e2242-6783-2f46-3893-762a619a0d9a.png)

成功すれば「enabled」になります。
![17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263069/b581a0af-4919-87ff-a9d2-9b9f25dfa7d3.png)

# 動作確認
### GitHubにコミット
GitHubにソースをコミットすると、Herokuで自動ビルド＆デプロイが実行されます。
実行の様子は「Overview」で確認できます。
![26.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263069/acdbeec0-11f5-0dcc-6e5a-d74f5721b900.png)

### Webアプリにアクセス
「Open app」でWebアプリにアクセスして、デプロイされていることを確認します。

# 【補足】サンプルソース
さくっとやってみたい場合、[Herokuのサンプルソース](https://github.com/heroku/)を使うと早いです。

以上お疲れ様でした。
ネットワーク関連

#はじめに
ここではネットワークに関するコマンドことを紹介したいとおもいます。

#環境
CentOS 

#コマンド
コマンドを実施するさい相手にプロトコルの許可がないといけないFirewallで許可されていなければ通らないので注意

| コマンド|プロトコル|
|:----|:----|
|ping|ICMP|
|tracert(Windows)<br>traceroute(Linux) |ICMP(Windows)<br>UDP（Linux）<br>TCP<br>※オプションでそれぞれ指定できる|
|ifconfig|----|




##ping
言わずと知れた有名コマンド指定したIPに到達できるかどうか確認できる。
到達できたらechoを返す

```
$ ping [IPアドレス]
```

##traceroute/tracert 
指定のIPまたはホスト名までにたどり着くまでのネットワーク経路をだしてくれる。
しくみは単純で

```sh
#UDP:Linuxでのデフォルト
$ traceroute [ホスト名 or IPアドレス]

# TCP: ポート指定しない場合は80番
$ traceroute -T -p ポート番号 [ホスト名 or IPアドレス]

# ICMP
$ traceroute -I [ホスト名 or IPアドレス]
```

```powershell
tracert  [ホスト名 or IPアドレス]
```

##ifconfig/ip

NICの情報をみる

```sh
# 基本的なコマンド
$ ifconfig

#別パターンNIC情報の表示　表示のしかたが違うので少し見にくいが上記のコマンドが長くて面倒なら
$ ip
```

#nslookup
名前解決ができているかどうかの確認

```sh
$ nslookup [ドメイン名]
```
##ifconfig.io
自分のグローバルIPを調べる

```
curl ifconfig.io
```

#ツール
###Wireshark
言わずと知れたパケットキャプチャ
機能の多さよりシンプルな使い方とは裏腹に大量の情報を取得できる


###nmap
セキュリティスキャナ（この言い方初めてしった）
ポートスキャンやOSやバージョンの検出など
内容を書くだけで１記事できるレベルでできることの多い


#まとめ
いかがだったでしょうかツールやコマンドなどは調べたり思い出したりしたら随時追加していっていきたいですね。
AWS 基調講演メモ AWSomeday　セッション3-4

#セキュリティ
セキュリティは最優先事項

###責任共有モデル
セキュリティを顧客とAWSで守る考え方
⇨明確に責任範囲が定義されている。

###VPCのネットワーク制御
・ファイアウォール
・ネットワークの経路制御
・インターネットとの通信
・オンプレミス環境との接続

####セキュリティグループ
Web3層に対してのセキュリティをまとめたセキュリティグループ
デフォルトは、ブロックされている。（アクセス）

##AWSの認証とアクセス管理

####AWS Identity and Access Management
・AWSリソースへのアクセス制御
・クラウドサービスへのアクセス
・ユーザ、ロールの管理
フェデレーティッドユーザー＝他のサービスの認可を得てログインするユーザー


###AWS　アカウントルートユーザー
はじめに作成されるユーザー（awsの初期登録時のユーザー）。
なんでもできるユーザー⇨乗っ取られるとリスクが高い
なので、基本はIAMユーザーを作成して、IAMユーザーで利用する。


#Well-Architected Framework(ベストプラクティス)と料金の話
クラウド設計・運用のベストプラクティス集

###5つの柱
・運用上の優秀性
・セキュリティ
・信頼性
・パフォーマンス効率
・コストの最適化

###設計原則(クラウドでの一般設計原則)
・必要なキャパシティを勘に頼らない
・本番規模でのシステムテストを行う
・アーキテクチャ試行の回数を増やすために自動化を取り入れる
・発展的なアーキテクチャを受け入れる
・データ計測に基づいてアーキテクチャを決定する
・本番で想定されるトラブルを予めテストし、対策する

#基調講演: 高速で変革し続ける企業を目指すには
世の中で、いかに素早く実現できるかが大事
クラウドの捉え方の変化

マクドナルド　⇨　４ヶ月で宅配サービスを導入。


###
###

###
###
###
###

###
###
###
###
###
###
###
###
絵文字の文字列操作: '👨🏻‍💻'.replace('💻', '🏫') === '👨🏻‍🏫'

Unicodeの絵文字の文字列操作は興味深い。

## 前提知識

 「👨‍👩‍👧‍👦」という絵文字は、そういう1文字(コードポイント)が存在するわけではない。 「👨‍👩‍👧‍👦」は「👨」「👩」「👧」「👦」という4つの絵文字とZero Width Joiner(`U+200D`)という文字の組み合わせのデータで表現される:

```javascript
console.log(
    '👨' + '\u{200D}' +
    '👩' + '\u{200D}' +
    '👧' + '\u{200D}' +
    '👦'
)
//=> 👨‍👩‍👧‍👦
```

上記のとおり、「👨‍👩‍👧‍👦」はデータとしては7文字なのだが、表示上1文字分の幅になっているだけなのである。

ちなみにJavaScriptの`for ... of`は文字列をコードポイントごとにループできるので、「👨‍👩‍👧‍👦」を`for`で回すと構成文字に分解することもできる:

```javascript
for (const codePoint of '👨‍👩‍👧‍👦') {
    console.log('%o', codePoint)
}
//=> '👨'
//=> '‍'
//=> '👩'
//=> '‍'
//=> '👧'
//=> '‍'
//=> '👦'
```

## 絵文字の文字列操作

 「👨‍👩‍👧‍👦」以外にも、「👨🏻‍💻」は`'👨'` + 明るい肌色の`U+1F3FB` + `U+200D` + `'💻'`で構成される絵文字だったりと、複数文字で構成される絵文字はいろいろある。

なので、絵文字を文字列操作すると、

* 職業を変えたり
* 性別を変えたり
* 肌の色を変えたり

することができる。

```javascript
console.log(
    '👨', // 👨 (Man)
    '👨' + '🏻', // 👨🏻 (Man: Light Skin Tone)
    '👨🏻' + '\u{200D}' + '💻', // 👨🏻‍💻 (Man Technologist: Light Skin Tone)
    '👨🏻‍💻'.replace('💻', '🏫'), // 👨🏻‍🏫 (Man Teacher: Light Skin Tone)
    '👨🏻‍🏫'.replace('🏫', '🎓'), // 👨🏻‍🎓 (Man Student: Light Skin Tone)
    '👨🏻‍🎓'.replace('👨', '👩'), // 👩🏻‍🎓 (Woman Student: Light Skin Tone)
    '👩🏻‍🎓'.replace('🏻', '🏽'), // 👩🏽‍🎓 (Woman Student: Medium Skin Tone)
    '👩🏽‍🎓'.replace('🏽', ''),   // 👩‍🎓 (Woman Student)
    '👩‍🎓'.replace('🎓', '👧'), // 👩‍👧 (Family: Woman, Girl)
)
```

上のコードはフォントの関係で表示されない絵文字があるので、同じコードの画像を貼っておく↓

<img width="1007" alt="Untitled_6_js.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/ecd9f143-2be3-7884-0639-c352e7a1cf78.png">

---

最後までお読みくださりありがとうございました。Twitterでは、Qiitaに書かない技術ネタなどもツイートしているので、よかったらフォローお願いします:relieved:→[Twitter@suin](https://twitter.com/suin)
EC2をFTPS化する方法

# EC2をFTPS化する方法
色んなサイトを見ても純粋にEC2をFTPS化する記事がなくてめちゃくちゃハマったのでメモ

**使用した物**

- Ubuntu Server 18.04 LTS (HVM), SSD Volume Type
- FileZilla

## やり方
### サーバー設定
- インスタンスの立ち上げ

	セキュリティグループの設定例
	![SnapCrab_NoName_2016-4-25_23-4-43_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343278/47e4988f-488c-e568-f418-1c1a2a49d733.png)

	
- sshで接続
		
        ssh -i Downloads/demo.pem ubuntu@<IPアドレス>


- Ubuntuを更新

		sudo apt update
		sudo apt upgrade

- vsftpdをインストール

		sudo apt install vsftpd

- vsftpdを使ってFTPSをスタートさせるにはrootユーザーである必要があるのでユーザー変更

		sudo -i

- rootユーザーのパスワードを設定

		passwd root

- Certificateを保存すディレクトリの作成

		mkdir /etc/ssl

- Certificateの作成

		openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout /etc/ssl/vsftpd.pem -out /etc/ssl/vsftpd.pem

- vsftpd.confの編集（FTPS化）

		vim /etc/vsftpd.conf

		＃　以下の設定を追加
		rsa_cert_file=/etc/ssl/vsftpd.pem
		rsa_private_key_file=/etc/ssl/vsftpd.pem
		ssl_enable=YES
		allow_anon_ssl=NO
		force_local_data_ssl=YES
		force_local_logins_ssl=YES
		ssl_tlsv1=YES
		ssl_sslv2=NO
		ssl_sslv3=NO
		require_ssl_reuse=NO
		ssl_ciphers=HIGH
		pasv_enable=Yes
		pasv_min_port=60000
		pasv_max_port=60030
		pasv_address=<EC2で作成したIPv4 Public IP>

- rootでログインできる様にファイルを変更

		vim /etc/ftpusers
		＃この中のrootをコメントアウト
	![Screen Shot 2020-04-22 at 6.07.45 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343278/ede83ecc-9b1b-34cb-e866-ac09fe5a99e9.png)


- サービス開始

		systemctl restart vsftpd
		systemctl status vsftpd

### FileZilla
![Screen Shot 2020-04-22 at 6.10.28 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343278/8ca11224-d111-81c4-e10d-4b2257e6fb9e.png)


## Tips
- vsftpd.confの内容が合っているか確認する方法

		/usr/sbin/vsftpd /etc/vsftpd.conf
		
- もしこのエラーがでたら

		500 OOPS: config file not owned by correct user, or not a file
		# このコマンドでオーナーを変える
		chown root:root /etc/vsftpd.conf

## 参考URL
https://www.youtube.com/watch?v=VZm8SoxgwXc
https://www.getpagespeed.com/server-setup/ssl-directory
https://dev.classmethod.jp/articles/ftps_on_centos7/
https://www.serverkaka.com/2018/08/enable-password-authentication-aws-ec2-instance.html
【JUnit4】JUnit4関連ツール覚書き

世の中、そろそろJUnit5が標準になっているかもしれませんが、個人的には、JUnit4のユーザーインターフェースの方が使い勝手が良く、気に入っています。

## AssertJ
JUnitで使用可能な検証ツールです。メソッドの戻り値にListを使用することは多く、戻り値のListの検証に重宝しています。assertJはBuilderパターンの検証メソッドを提供しており非常にわかりやすいです（いわゆる「流れるようなAPI」）。
[「AssertJ版：テストでよく使う検証メソッド一覧」Qiita @naotawoolさん](https://qiita.com/naotawool/items/6512ecbe2fd006dacfd2)
[「AssertJ公式サイト」（英語）](http://joel-costigliola.github.io/assertj/)

## DbSetup
JUnitで使用可能なDBデータ作成ツールです。リポジトリのテストも単体テストでは必須です。テストデータをテストクラス本文に記載するスタイルが単体テストにマッチしています。DbSetupもBuilderパターンの設定メソッドを提供しており非常に使いやすいです。
[「JavaでのDBのテストデータ作成はDbSetupが楽。」Qiita @ikemoさん](https://qiita.com/ikemo/items/a27ece72fe2af3683ff6)

記事から抜粋

````行単位で定義する例.java
public static final Operation INSERT =
  insertInto("character")
  // 列の定義
  .columns("headgear", "clothing", "shoes")
  // 1行目の値定義
  .values("ヘッドバンド ホワイト", "わかばイカT", "キャンバス ホワイト")
  // 2行目の値定義
  .values("フェイスゴーグル", "スクールブレザー", "パワードレッグス")
  .build();
````

```` 列が多い場合の使い分け例.java
public static final Operation INSERT =
  insertInto("character")
  // 1行目の作成（カラム毎に定義）
  .row().column("headgear", "ヘッドバンド ホワイト")
        .column("clothing", "わかばイカT")
        .column("shoes", "キャンバス ホワイト")
        .end()
  // 2行目の作成（カラム毎に定義）
  .row().column("headgear", "フェイスゴーグル")
        .column("clothing", "スクールブレザー")
        .column("shoes", "パワードレッグス")
        .end()
  .build();
````

こちらも参照下さい。
[「DbSetupというJavaのユニットテスト用のDBデータ作成ツールのUser Guidをテキトーに訳した」HatenaBlog kagamihogeさん](http://kagamihoge.hatenablog.com/entry/2015/08/14/205330)
[「DbSetup公式サイト」（英語）](http://dbsetup.ninja-squad.com/)

## Mockito
JUnitで使用できるMockツールです。テスト対象クラスが単体環境では使用できない共通機能を呼び出している場合等は必須のツールとなります。尚、機能全体を差し替えるMock、機能の一部のみ差し替えるSpyの２種類があります。
[「Mockitoを使ってみる。」Qiita @yakumo3390さん](https://qiita.com/yakumo3390/items/c34f1f1625c3beffaf9c)
[「Mockito公式サイト」（英語）](https://site.mockito.org/)
[「TERASOLUNA Server Framework for Java (5.x) Development Guideline / 10.2.4. 単体テストで利用するOSSライブラリの使い方」](https://terasolunaorg.github.io/guideline/5.4.1.RELEASE/ja/UnitTest/ImplementsOfUnitTest/UsageOfLibraryForTest.html)
is invalid because it does not start with a '-'となった時の対応方法


- 環境
    - Windows 10 Pro 64bit バージョン1909
    - GitBash(mintty 3.1.0)
    - Payara Server 5.194

# 事象 : PayaraのJVMオプションにパスを設定しようとして怒られた

```bash
$ asadmin create-jvm-options -Djava.io.tmpdir=/c/tmp
remote failure: JVM option /tmp is invalid because it does not start with a '-'

Command create-jvm-options failed.
```

# 原因 : パスの書き方が間違っているから
この原因にはだれでもすぐ気が付くが、「で、今の環境ではどう書けば？」がわからず試した。

```bash
# Windows風でエスケープ文字付の囲み文字なし > だめ
$ asadmin create-jvm-options -Djava.io.tmpdir=C\:\\tmp\\
remote failure: Escape at EOL
Escape at EOL
Usage: create-jvm-options
        [--target <target(default:server)>]
        [--profiler[=<profiler(default:false)>]]
        [--min-jvm=<version>]
        [--max-jvm=<version>]
        [-?|--help[=<help(default:false)>]]
        (jvm_option_name[=jvm_option_value])[:jvm_option_name[=jvm_option_name]]*
Command create-jvm-options failed.
```

## 対応 : シングルクォーテーションで囲ってWindows風でエスケープ文字付に書く
```bash
# Windows風でエスケープ文字付の囲み文字あり > いけた
$ asadmin create-jvm-options -Djava.io.tmpdir='C\:\\tmp\\'
Created 1 option(s)
Command create-jvm-options executed successfully.

# 確認してみる
$ asadmin list-jvm-options | grep tmpdir
-Djava.io.tmpdir=C:\tmp\

```
Oracle DBにつながらなくて困ったときの対応まとめ


## DB筐体内での確認事項
### サービスが動いているか確認
そもそもOracleサービスが起動しているか確認します。
Windowsの場合の手順になりますが、サービス画面を開き（OSの検索窓でサービスで検索するか、Windowsキー＋Rで出てきた検索窓でsc.mscと検索する）、下記のOracleサービスが動いているか確認します。
![Screen Shot 2020-04-23 at 10.07.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296083/315435dd-8ce7-8693-7a69-e535b49cc878.png)


もし起動中になっていなかったらサービスを右クリックして起動させてください。


### DBがオープンしているか確認
コマンドプロンプトを開き、sqlplusでDBにつなぎます。

DBの起動状態を確認します。
#### 11g以前の手順
起動状態を確認します

```
sqlplus / as sysdba  もしくは　sqlplus sys/{syspassword} as sysdba
select host_name, instance_name, status from v$instance;
HOST_NAME  INSTANCE_NAME    STATUS
---------- ---------------- ------------
db01       orcl             MOUNTED
```
もしSTATUSがOPENになっていなかったら、DBをOpenします。

```
STARTUP
```

#### 12c以降の手順
起動状態を確認します

```
show pdbs				
				
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED				
---------- ------------------------------ ---------- ----------				
         2 CDB$SEED                       READ ONLY  NO				
         3 PDB01                          MOUNTED
```
もしSTATUSがOPENになっていなかったら、DBをOpenします。

```
alter pluggable database all open;
```

### tnsnames.ora、lisner.oraの記載内容を確認
12c以降でPDBにつなごうとしても次のようなエラーでつながらない場合はtnsnames.oraとlisner.oraを確認します。

```
ORA-12514: TNS: リスナーは現在、接続識別子でリクエストされているサービスを認識していません(TNS-12514)
```

tnsnames.oraは下記のような形式で書かれています。hostnameが正しいか、PDB名が正しいか確認してください。
場所：{ORACLE_HOME}\network\admin\tnsnames.ora

```tnsnames.ora
{接続したいサービス名} =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST ={hostname})(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME ={PDB名/SID})
    )
  )
```

lisner.oraは下記のような形式で書かれています。hostnameが正しいか確認してください。
場所：{ORACLE_HOME}\network\admin\lisner.ora

```lisner.ora
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = {hostname})(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )
```


## DBが別筐体にある場合の確認事項
### DBインスタンスが起動しているか確認
そもそもDBインスタンスが起動しているかを確認します。
また上記の手順のようにｃが動いていて、DB筐体内ではDBが使える状態かも確認します。

### DBへのアクセスが許可されているか確認
pingが通るか、telnetができるか、セキュリティグループやFWで遮断されていないか確認します。

### tnsnames.oraの記載内容を確認
まず、下記のsqlで接続できるか確認します。

```
sqlplus system/{system_password}@{db_ip}:1521/{pdb_name}
例) sqlplus system/password@192.168.145.25:1521/PDB
```
できなければDBでLisnerが起動していないなどの原因が考えられるので、上記のようにDB筐体でOracleサービスが動いてるか確認してください。

これを下記のようにサービス名だけで接続したい場合、tnsnames.oraへの記載が必要になります。



tnsnames.oraは{ORACLE_HOME}/network/admin/tnsnames.oraにあります。
次のような記載を追加してください。

```tnsnames.ora
{接続したいサービス名} =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST ={dbのip})(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME ={PDB名/SID})
    )
  )
例：
REMOTEPDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.129.12.24)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = PDB01)
    )
  )
```

そうすると、下記のようにつなぐことができます。

```cmd
sqlplus system/{system_password}@REMOTEPDB
```

---
Windows向けに書いていますがLinuxでもやること自体そんなに変わらないはず
（ファイルの場所とかコマンドは違いますが）
【Hyper-V】存在しないネットワークアダプタを削除する

# ネットワークアダプターが壊れる
環境が変わった関係で仮想ネットワークスイッチを変更したりゲストOSの利用するネットワークアダプターをあれこれ変えたりすると、ゲストOS側でネットワーク接続できなくなったりした。

# 存在しないネットワークアダプターが邪魔
どうも調べていると、そのごちゃごちゃしてしまった関係上で、元々あったネットワークアダプタがもはや画面上に表示されてこなくなり、そのネットワークアダプターが邪魔してるようだ。

だから、ネットワーク接続名を『ローカル エリア接続』に変えようとしても、その名前のはもうあるからダメだぞ、とか、
固定IPを設定しようとすると、もうその固定IPがあるからおかしいぞ、とか複数のデフォルトゲートウェイで設定されてるアダプターがあるぞ、いいんか？みたいなメッセージが出てきたりする。
見えてるネットワークアダプターは1つしかないのに。

特に固定IPを設定している状態のネットワークアダプターがそんな状態だと邪魔しまくってぶっ壊れる様子。

# ネットワークアダプターを削除する
ゲストOS上で、下記を実施して、邪魔なネットワークアダプターを削除する。

1. コマンドプロンプトから下記を実行する。

    ```
    set devmgr_show_nonpresent_devices=1
    devmgmt.msc
    ```

2. 表示されたデバイスマネージャーのメニューから、表示->非表示のデバイスの表示 にチェックを入れる。
3. ネットワークアダプターのツリーを表示して、アイコンが灰色くなってるものを全て削除する。
4. 一応ゲストOSを再起動。

これで、表示されているネットワークアダプターに対して望む設定（固定IPなど）をすると、ちゃんと接続されるようになる。
APIを使った登録方法

#google,facebook,twitterでユーザー登録？

僕たちが使用してしているwebサイトのほとんどがこのAPI機能を使ってユーザー登録機能を実装しています。

なぜなら、ほとんどの人たちは上記3つのアカウントを保持しているからです。

わざわざ会員登録に毎回、メールアドレスやパスワードを入力するのは面倒ですよね。。。
ユーザーの負担を減らすためにもAPIを使用したユーザー登録をできるようになっておいた方がいいですね。

しかも、めちゃくちゃ簡単ですからね。

#まずは各社のAPIの設定からしてみよう！

リファレンス通りにやればめっちゃ簡単にできます！！！

だから、省略！！！

#重要なのはキーの設定だけ！

rails v5.2以降はcredential.ymlというファイルに環境変数を設定できるようになりました。

そのため、今回作成したいずれかのアクセスキーをcredential.ymlに記述するだけで、準備は完璧です！！

コード載せたいのですが、アクセスコードなので割愛。。。

そのあとのコードは以下。

```
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def google_oauth2
    # You need to implement the method below in your model (e.g. app/models/user.rb)
    session["devise.sns_auth"] = User.from_omniauth(request.env['omniauth.auth'])

    if session["devise.sns_auth"][:user].persisted?
      sign_in_and_redirect session["devise.sns_auth"][:user], event: :authentication
    else
      redirect_to new_regist_path
    end
  end
end
```

要は、request.env['omniauth.auth']っていうキーバリューの形で送られてきて、
それをsessionに入れ直しているだけです！

そもそもgemなんでめちゃくちゃ楽にできますね・・・

リファレンス見れば全部書いてあります。

あとは条件を指定して、作りたいアプリを作るだけです。
[Kotlin]ホワイトリストに特定のpathを含む文字列がある場合の対応

ホワイトリストにURLのhost部分だけじゃなく、pathも含めたい時の対処方法です。

# 前提条件
URLを開く際、以下のようなことをするAndroidアプリがあると仮定します。

- ↓の処理でホワイトリストとuriのhost部分を比較し、ホワイトリストに登録されている文字列がuriに含まれていたらアプリ内のWebViewで、含まれてなければ外部ブラウザで開く

```WhiteListRepository.kt
fun compareWhiteList(uri: Uri): Boolean {
    return uri.host in whiteList
}
```

- ホワイトリストはサーバー上で管理しており、アプリ起動時にFetchしてくる(上記の`whiteList`に格納)
- ホワイトリストは以下の文字列が登録されている

```
hogehoge.com
hugahuga.co.jp
```

# 突然の仕様変更
ある日、「ホワイトリストに`piyopoyo.com/system/menu`を追加したい」という要望が上から降ってきました。
現在の実装では、host部分しかホワイトリストと比較していません。さてどうしましょうか…

# 間違い例
まず初めに、uriにpathを含むホワイトリスト文字列があるかを判定すれば良いのでは？と考え、以下のような処理を追加しました。

```WhiteListRepository.kt
fun compareWhiteList(uri: Uri): Boolean {
    // path含むホワイトリストの判定
    val whiteListWithPathList = whiteList.filter { it.contains("/") } // pathを含むホワイトリストだけ抽出
    if (whiteListWithPathList.any { "$uri".contains(it) }) return true // uriに文字列が含まれてればtrueをreturn

    // path含むホワイトリストの判定がfalseならば、従来通りhost部分のみを比較
    return uri.host in whiteList 
}
```

一見OKなように見えますが、1点問題があります。
これだと、`https://google.com?q=piyopoyo.com/system/menu`のようなuriでもWebViewで開いてしまいます。
ホワイトリスト処理として期待される正しい動きではありません。

(※補足)
わざわざ`whiteListWithPathList`で抽出してるのは、`whiteList`で比較すると`https://xxx/hogehoge.com`のようなuriも該当してしまうためです。

# 正解例
「host + path」は前方一致で判定しなくてはなりません。
よって正しくは↓

```WhiteListRepository.kt
fun compareWhiteList(uri: Uri): Boolean {
    return whiteList.any { "$uri".startsWith("https://$it") } // uriの先頭がhttps://{ホワイトリストの文字列}で始まっているかの判定をreturn
    // return uri.host in whiteList ← 上の処理でhostとの比較をまかなえるので削除できる
}
```

# 終わり
host + pathのホワイトリストの判定は、前方一致しなければいけないことに気をつけましょう。
direnvとnvmを用いてディレクトリごとにnodeのバージョンを切り替える

# 概要
- 個人や仕事で、複数のプロジェクトに渡ってやっていくうちに、nodeのバージョンを切り替えるのが煩わしくなっくる。
- 私自身も`nvm use v12`などと明示的に切り替えていた。
- 今回はそう言った方のために、nodeのバージョンを自動的に切り替える手順を紹介します。

# direnv と nvm について
Githubの[direnv](https://github.com/direnv/direnv)と[nvm](https://github.com/nvm-sh/nvm)を参考

# direnvのインストール & 初期セットアップ
direnvについてはこちらが良い記事だったので、はじめに入れておく。
https://qiita.com/kompiro/items/5fc46089247a56243a62

# nvmのインストール & 初期セットアップ
nvmについてはこちらが良い記事だったので、はじめに入れておく。
Macの方はHombrewを使うと思うが[Github](https://github.com/nvm-sh/nvm#important-notes)には公式でサポートしないと書いてあるので、認識だけしておく。（私も使っているが問題になったことはない）
https://qiita.com/ffggss/items/94f1c4c5d311db2ec71a#nvm%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

# direnvとnvmを用いてディレクトリごとにnodeのバージョンを切り替える
## direnvの設定にuser_nvm()を加える
`~/.config/direnv/direnvrc` もしくは `~/.direnvrc` に書く

```shell:~/.direnvrc
use_nvm() {
  local node_version=$1

  nvm_sh=~/.nvm/nvm.sh
  if [[ -e $nvm_sh ]]; then
    source $nvm_sh
    nvm use $node_version
  fi
}
```
(https://github.com/direnv/direnv/wiki/Node#using-nvm より引用)

## `.envrc`に切り替えたいnodeのバージョンを書く
切り替えたいディレクトリに`.envrc`を作成。
細かいバージョン指定でなく、`v14`などとざっくりで書いておけば、nvmによって自動で選ばれるので、おすすめ

```sell:.envrc
use nvm v14
```

## direnvが使えるように許可 & 読み込み

```bash
 ❯ direnv allow                                                                                                                                                                 
direnv: loading .envrc                                                                                                                                                                     
direnv: using nvm v14
Now using node v14.0.0 (npm v6.14.4)
direnv: export ~NVM_BIN ~PATH
```
うまく切り替わったことがわかる。次に、試しにディレクトリを切り替える

```bash
 ❯ cd ..
direnv: loading ../../../../.envrc
direnv: using java 8.0.242.hs-adpt
direnv: export +CPATH +LD_LIBRARY_PATH +LIBRARY_PATH +PKG_CONFIG_PATH ~JAVA_HOME ~MANPATH ~PATH

 ❯ cd -
direnv: loading .envrc
direnv: using nvm v14
Now using node v14.0.0 (npm v6.14.4)
direnv: export ~NVM_BIN ~PATH
```
ディレクトリを切り替えてもうまく切り替わっていればOK
Rでローレンツ曲線をグラフ化テンプレート

###### tags: `rBasicLearning`
# Rでローレンツ曲線をグラフ化テンプレート

## 1. テンプレート
Rでローレンツ曲線をグラフ化するテンプレートを, 以下に作りました.
よろしければ、使ってください！
（LCは'Lorenz Curve'から持ってきました）

```r
LC = function(a, b){
  df <- data.frame(a, b)
  Graph <- ggplot(df, aes(x = a, y = b)) + 
    geom_line(color = 'blue')+
    geom_line(data = data.frame(x=(0:100)/100), aes(x = x, y = x),
              linetype = 'dotted', color = 'red', size=1)
  plot(Graph)
}
```
##  2. 具体例
###  使うデータ
```r
alpha <- c(0.000, 0.682, 0.854, 0.963, 0.982, 0.993, 0.999, 0.999, 1.000, 1.000)
beta <- c(0.000, 0.194, 0.341, 0.568, 0.663, 0.767, 0.884, 0.919, 0.953, 1.000)
```

### グラフへ出力
```r
LC(alpha, beta)
```
![](https://i.imgur.com/lTkPcim.png)
[Rails]アソシエーションでのclass_name

# class_nameとは
アソシエーション（Active Recordモデル同士の関連付け）におけるオプションの1つ

例えば、下記のItemモデルには、Userモデルの関係が定義されています。現在は@item.userのような形で、@itemに紐づいたuserを取得することができます。

```ruby
class Item < ActiveRecord::Base
  belongs_to :user
```

```ruby
class User < ActiveRecord::Base
  has_many :items
```

#使い時は

アソシエーションのメソッド名とクラス名が一致しているときはそれで問題ありませんが、メソッド名を変えたいこともあります。

例えば、userはuserでも買い手(buyer)と売り手(seller)がいた場合です。

そうした時にclass_nameオプションを使用します。

```ruby
class Item < ActiveRecord::Base
  belongs_to :buyer, class_name:"User"
  belongs_to :seller, class_name:"User"
```
上記のようにしてあげることで、@item.buyerや@item.sellerの形で、@itemに紐づいたuserレコードを取得することができます。
There is a process already using the admin port となった時の対応方法


- 環境
    - Windows 10 Pro 64bit バージョン1909
    - GitBash(mintty 3.1.0)
    - Payara Server 5.194

# 事象 : Payaraを起動しようとしたら怒られた
起動しようとして[Attempting to start domain1.... Please look at the server log for more details.....](https://qiita.com/ponsuke0531/items/68bdfe3cae7780087317)というメッセージが表示された。
そして、起動していないのかと思ってもう一度起動しようとした。

```bash
$ asadmin start-domain domain1
There is a process already using the admin port 4848 -- it could be another instance of Payara Server or Payara Micro.
Command start-domain failed.
```

# 原因 : 既に起動しているから

ポートを確認すると既に使われている。
http://localhost:4848 を表示すると既にPayaraは起動していた。

```bash
$ netstat -nao | grep 4848
  TCP         0.0.0.0:4848           0.0.0.0:0              LISTENING       18056
  TCP         [::]:4848              [::]:0                 LISTENING       18056
```

## 対応 : 既に起動しているので何もしない
気になる場合は、既に起動しているPayaraを停止してもう一度起動する。
[Payara の起動と停止 &mdash; intra-mart Accel Platform セットアップガイド (Payara編) &nbsp; 第4版 2020-04-01 &nbsp; intra-mart Accel Platform](https://www.intra-mart.jp/document/library/iap/public/setup/iap_setup_guide_payara/texts/payara_install/start_and_stop.html)

```bash:気になる場合は、既に起動しているPayaraを停止
$ asadmin stop-domain domain1
Waiting for the domain to stop .
Command stop-domain executed successfully.
```
Attempting to start domain1.... Please look at the server log for more details.....となった時は大丈夫


- 環境
    - Windows 10 Pro 64bit バージョン1909
    - GitBash(mintty 3.1.0)
    - Payara Server  5.194

# 事象 : はじめてPayaraを起動しようとしたらなんか言われた

```bash
$ asadmin start-domain domain1
Attempting to start domain1.... Please look at the server log for more details.....
```

あれ？思ってるメッセージと違う・・・大丈夫？

```bash:思ってたメッセージ
$ asadmin start-domain domain1
Waiting for domain1 to start ...................
Successfully started the domain : domain1
domain  Location: C:\install\dir\payara5\glassfish\domains\domain1
Log File: C:\install\dir\payara5\glassfish\domains\domain1\logs\server.log
Admin Port: 4848
Command start-domain executed successfully.
```

# 原因 : 不明
[GlassFishを使っていた時も同じメッセージが表示されたことがあったが、ちゃんと起動していた。](https://qiita.com/ponsuke0531/items/bf2a07c37f30318f76ff)

http://localhost:4848/ を見てみると起動していた。

`{インストールディレクトリ}\glassfish\domains\domain1\logs\server.log` をみても特にエラーっぽくない。

はじめてだからセキュリティのダイアログは出たから[アクセスを許可する]したけど・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/837bcf71-9570-54eb-9c1d-69711e159bad.png)

## 大丈夫 : 起動してるし、きっと大丈夫！
このまま作業を進めよう！
rails new app名 --skip-bundleってなに？

別問題をあれこれ調べているときに出会った内容に「rails new app名 --skip-bundle するといい！」とあったのだが出来なかった。
基本的なことすぎて記事にもなっていなかったので一応残しておく。

## 実施したこと
rootで次のコードを実行

```zsh
$ rails new app名 --skip-bundle
#~略~
Could not find gem 'rails (~> 6.0.2, >= 6.0.2.1)' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.
```

「あなたのgemファイルにrailsのgemが見つかりません」とのこと。
当たり前です。そもそも参照するべきGemfileが無いのですから。


[新規Railsプロジェクト作成時のコマンド](https://qiita.com/k_senbei/items/02c4bacd5bb862535d9d)