OmniAICreator/Qiita-1.07M huggingface dataset:
【C++】文字列の型がいろいろあるが、どれをどういうときに使うかわからない

# やりたいこと
charとかwchar_tとか、文字列を扱う型が色々あって、なにをどういうときに使えば正しいのかよくわからないので知りたい。

# 文字列の種類

### ワイド文字とは
1文字表現するのに2バイト用いる文字のこと。
Unicodeはこれ。

### マルチバイト文字とは
1バイト以上の文字のこと。
SJISで日本語使う場合なんかはこれ。

# 型

### char

- 文字列を扱う型。
- サイズは1バイト。
- 全角を扱うには、2バイト(char2つ分)が必要。
- charを複数つかう「マルチ」バイト文字を扱う。
- 文字列を初期化時に代入するには下記のようにする

``` .cpp
char buf[] = "abc";
```

### wchar_t(WCHAR)

- 2バイトで1文字を表すunicode(ワイド文字)の文字列を扱う型。
- サイズは2バイト。
- 下記のように定義されている。

``` cpp
typedef unsigned short wchar_t;
typedef unsigned short WCHAR;
```

- ワイド文字列を扱うときは、文字列の前にLをつける(コンパイラにワイド文字であることを示す)。

``` cpp
wchar_t buf[] = L"abc";
```
### TCHAR

- コンパイルオプションで通常とユニコードを切り替えできる型。
- 下記のように定義されている。

``` cpp
#ifdef _UNICODE
typedef wchar_t		TCHAR;
#else
typedef char		TCHAR;
#endif
```

- 文字列を代入するときはこのようにする。

``` .cpp
TCHAR buf[] = _T("abc");
```

- _T("")は、プロジェクトの「文字セット」の設定によって、扱いが変わる。(詳しくは、[こちら](https://qiita.com/tadnakam/items/99d7c40670fb3649875d#%E6%B1%8E%E7%94%A8%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B%E3%81%AE%E3%83%9E%E3%83%83%E3%83%97)を参照)

``` .cpp
// 文字セットの設定により、このように動作する。
char buf[] = "abc";    // 設定なし
char buf[] = "abc";    // マルチバイト文字を使用する
wchar_t buf[] = L"abc";    // Unicode文字セットを使用する
```

# メモ

- charからwchar_tにキャストして使ったり、その逆をしたりはできない。専用のAPIを使う必要がある。([mbstowcs_s](https://docs.microsoft.com/ja-jp/cpp/c-runtime-library/reference/mbstowcs-s-mbstowcs-s-l?view=vs-2019)など)
- DLLを作ったときなど、char* をC#にそのまま渡すことはできない。マーシャリングや文字セットの指定など、いろいろややこしい。([こちら](https://qiita.com/tera1707/items/81042abaa62dc97e26ae)も参照)


# 参考

**Visual C++ 文字列 まとめ**
https://qiita.com/tadnakam/items/99d7c40670fb3649875d
めちゃくちゃわかりやすい、文字列を扱う型の解説
ここを見れば疑問はほぼ解決した。

文字列関連の標準関数
http://ytyaru.hatenablog.com/entry/2016/07/15/003402

char、wchar_t（WCHAR）とTCHAR
https://www.dinop.com/vc/char_wchar_tchar.html

ワイド文字
http://wisdom.sakura.ne.jp/programming/c/c63.html
MACでKerasのload_data時出たSSLCertVerificationErrorの対応

MACでKerasのload_data関数を呼び出す時、SSLCertVerificationErrorが出ました。
調べてみると、Python 3.7.3をインストールした時、出てきたPython 3.7フォルダにあるInstall Certificates.commandを実行してなかったからです。

Applications→Python 3.7フォルダに入って、Install Certificates.commandをダブクリックして実行すると、エラーがなくなりました。

参考：
https://stackoverflow.com/questions/42098126/mac-osx-python-ssl-sslerror-ssl-certificate-verify-failed-certificate-verify
10以上の文字列のORDER BYは気をつけないとダメ

数値でソートするカラムが数値型なら問題ないですが、
文字列型の場合のソートは挙動が変わります。

```
数値型の場合
1，2，3，4，5，6，7，8，9，10，11
文字列型の場合
1，10，11，2，3，4，5，6，7，8，9
```

原因としては文字列で見てしまうので最初の文字が「1」なので「1」「10」「11」が「2」より優先されてしまいます。
SharePoint/OneDriveのドキュメントのURLを多少短くする

# 共有用のURLが長い
SharePoint、OneDriveのドキュメントへのURLが非常に長くて、メールでURLを送るときは気をつけないとURLの途中で改行されてしまう問題があったりします。
短縮URLサービスを使うのも手ですが、Googleが短縮サービスを終了したようにセキュリティ上よろしく無い場面があったりします。Googleが短縮URLサービスを辞めたのは別の理由だったようですが。

# 短縮URLサービスを使わずに短くしたい
Google Driveは比較的短くて良い感じ。せめてあのぐらいの長さにしてほしいな。

## URLの中身(SharePointの場合)
※(2020/6/24追記)下記URLはSharePointのサイト名が「office365」の場合です。下記URLの「office365」を適宜変更してください。
OfficeOnlineでOffice系ファイルを表示するとURLは以下のような感じになります(Wordの場合)。
`https://xxxx.contoso.com/:w:/r/sites/office365/_layouts/15/Doc.aspx?sourcedoc=AAAA...AAAAA&file=BBB..(中略)..BBBB.docx&action=default&mobileredirect=true`

とにかく長い。Word、Excel、PowerPointそれぞれでパラメータの種類が若干違いますが、sourcedocパラメータは必ず付いています。sourcedocパラメータ以外は省略可能っぽいので、sourcedocパラメータ以外は消しちゃいます。

`https://xxxx.contoso.com/:w:/r/sites/office365/_layouts/15/Doc.aspx?sourcedoc=AAAA...AAAAA`
多少は短くなりました。

## ドキュメントの種類でURLが少しだけ異なる
のようです。
・Wordの場合
`https://xxxx.contoso.com/:w:/r/sites/office365/_layouts/15/Doc.aspx`
・Excelの場合
`https://xxxx.contoso.com/:x:/r/sites/office365/_layouts/15/Doc.aspx`
・PowerPointの場合
`https://xxxx.contoso.com/:p:/r/sites/office365/_layouts/15/Doc.aspx`

## OneDriveの場合
↑はSharePointのURLだけでしたが、OneDriveもほぼ同じようです。
`https://xxxx.contoso.com/:p:/r/personal/[ユーザIDのスネークケース]/_layouts/15/Doc.aspx?`

## 注意点
上記はOffice Onlineで表示したときのURLの話なので、「リンクのコピー」からコピーできるURLには通用しません。パラメータのフォーマットが異なるようです。
*ダメな例
<img width="325" alt="リンクのコピー" src="https://qiita-image-store.s3.amazonaws.com/0/245365/a9b4905d-3ea4-180c-6cc3-210f76223e80.png">

## その他
・Google DocsのようにExcelだったらシート、PowerPointだったらスライドのURLが異なっているわけではない。これは残念。
・フォルダもダメ。
Real World HTTPのキャッシュについてのまとめ

Real World HTTPのキャッシュの部分を読んだので自分なりのまとめです。

## Last Modified
サーバーがレスポンスに最終更新日時を持たせ返す。
2度目以降のダウンロード時にクライアントはIf-Modified-Sceneヘッダーに
レスポンスで返ってきた最終更新日時を持たせてリク
エストをする。
サーバー側はリクエストの最終更新日時とサーバー上のコンテンツの最終更新日時を
比較し、変更がなければ「304 Not Modified」を返し、変更があれば「200 OK」とコンテンツ返す。

## Expires
日時を格納する。
クライアントはこの期限内であれば、強制的にキャッシュを利用する。

## Etag
サーバーがレスポンスにEtagヘッダーを持たせ返す。
2度目以降のダウンロード時にクライアントはIf-None-Matchヘッダーに
レスポンスで返ってきたEtagの値を持たせてリクエストをする。
サーバー側はEtagの値を比較してEtagの値が同一ならば「304 Not Modified」を返し、
変更があれば「200変更があれば「200 OK」とコンテンツ返す。

## Cache-Controll
### public
同一のコンピューターを使う複数のユーザー間でキャッシュを再利用することを許可する。 
### private
同一のコンピューターを使う複数のユーザー間でキャッシュを再利用しない。
同一URLから異なるコンテンツが返される場合に利用。
### max-age=n
キャッシュの鮮度を秒で設定。
設定内であればサーバーに問い合わせずに、キャッシュを利用。
それ以降はサーバーに問い合わせ、「304 Not Modified」が返ってきた場合のみ
キャッシュを利用する。
### s-max-page=n
max-ageと同等。
共有のキャッシュに対する設定。
### no-cache
キャッシュが有効性を毎回サーバーに問い合わせる。
max-age=0とほぼ同じ。
### nostore
キャッシュしない。
### no-tranceform
プロキシがコンテンツを改変するのを抑制。
### must-revalidate
nocacheとほぼ同じプロキシサーバーがサーバーに問い合わせ、応答がなければプロキシサーバーがクライアントに「504 Gateway Timeout」を返すことを期待する。 
### proxy-revalidate
must-revalidateと同様。
共有のキャッシュのみに適用する。

## Vary
UserAgentなど同じURLでもクライアントによって返す結果が異なることを示すヘッダー。
Varyを指定することで、UserAgentなどVaryで指定したヘッダーの内容に応じたキャッシュを
利用するようにする
duplicityでIBM Cloud Object Storageにバックアップを保管する

# duplicityとは

[duplicity](http://duplicity.nongnu.org/index.html)はローカルのファイルをリモートにバックアップする便利なOSSです。特に、Amazon S3へのバックアップにも対応しています。ということは、S3互換のIBM Cloud Object Storageにもバックアップが取れます。

# 手順

## IBM Cloud Object Storageのオーダーとバケットの作成

（手順省略）

## クレデンシャルファイルの作成

以下のファイルを作成します。awsという文字が見えるのは気のせいです。

```
$ vi ~/.aws/credentials

[ibmcloud-s3]
aws_access_key_id = ポータルで確認できるアクセス・キーID
aws_secret_access_key = ポータルで確認できる秘密アクセス・キー
```

## duplicityのインストール

CentOSやRed Hat Enterprise Linuxの場合はepelリポジトリが必要です。

```
# CentOSの場合
$ yum install epel-release

# RHELの場合
$ yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
```

duplicityをインストールします。

```
$ yum install duplicity
```

## バックアップの取得

ポータルで確認できる認証エンドポイントを指定して、バックアップを取得します。東京リージョンだと``s3.jp-tok.cloud-object-storage.appdomain.cloud``（パブリック）、``s3.private.jp-tok.cloud-object-storage.appdomain.cloud``（プライベート）または``s3.direct.jp-tok.cloud-object-storage.appdomain.cloud``（VPC）です。今回はパブリックを使用します。

```
# 初回
$ AWS_PROFILE=ibmcloud-s3 duplicity full --no-encryption --s3-endpoint-url https://s3.jp-tok.cloud-object-storage.appdomain.cloud ソース boto3+s3/バケット名/プレフィックス

# 2回目以降
$ AWS_PROFILE=ibmcloud-s3 duplicity incremental --no-encryption --s3-endpoint-url https://s3.jp-tok.cloud-object-storage.appdomain.cloud ソース boto3+s3/バケット名/プレフィックス
```

もし実行時に``duplicity: error: no such option: --s3-endpoint-url``が表示されエラーとなった場合は、こちらの記事を参照ください。

https://qiita.com/teruq/items/97cc4e74aa95525bb0a1

うまく動けばとても簡単にバックアップがとれます。リストアも同様にできますし、今回は暗号化なしにしましたが、暗号化も容易です。詳しくは[duplicity](http://duplicity.nongnu.org/index.html)のドキュメントを参照ください。
python HackerRankを解くための筋道と知識2



#はじめに
HackerRankでPythonに取り組んでいる中で、不足していた知識や考え方を忘備録として記録します。
なお、この記事はHackerRankの答えを掲載しているものではありません。
初学者のため、間違いがある場合はご指摘いただけるとすぐに修正します。
宜しくお願いします。

#基本事項
##複数の入力値
複数入力値を変数に入力する際には以下のようにsplitを使用する。

```python3
a,b = input().split()
```

また、それぞれを数値として入力する場合にはmapを使用する。

```python3
a,b =map(int, input().split())
```

#Designer Door Mat

問題は[こちら](https://www.hackerrank.com/challenges/designer-door-mat/problem)

###流れ
①変数に入力
②空の配列を作る
③for文を用いて、上半分の模様を先ほど作成した配列に入れる。
④出力する。この際、下半分は上半分を反転して出力。
   すなわち、「	上半分」＋「真ん中（welcome）」＋「下半分（上半分を反転）」とする。

###必要な知識
#######反転
反転は``[::-1]``を使用する。
詳しくは[こちら](http://d.hatena.ne.jp/cheeseshop/20080529/1236822182)

###補足
ちなみに、[Alphabet Rangoli](https://www.hackerrank.com/challenges/alphabet-rangoli/problem)の問題もこの反転を使用するとスムーズに解ける。

#Capitalize!
問題[こちら](https://www.hackerrank.com/challenges/capitalize/problem)

###流れ
①文字列をsplitを使用して苗字と名前に分割
②分割した文字の頭文字をそれぞれcapitalizeを用いて大文字にする
③joinを用いて結合して出力

#まとめ
次第に初見でも筋道が見える問題が増えてきたと思う。
よりたくさんの知識を吸収してさらなる向上を目指したい。
再度ではありますが、初学者のため間違いがあればご指摘いただけると幸いです。
PowerShell で csv を結合させる

# PowerShell で csv を結合させる

Get-Content などを使わず、あえて cmd を使います。

## csv の準備

以下のように 2 つの csv を用意します。

- あい.csv

|おれが知ってる曲|説明|
|---|---|
|マリーゴールド| 紅白出た|
|君はロックを聴かない|一番最初に知った|

- みょん.csv 

|||
|---|---|
|GOOD NIGHT BABY|最近好き|
|生きていたんだよな|かっこいい|

`※こちらはヘッダーなしで作りましょう`
`※また 文字コードは UTF-8 with BOM とかだとよろしくないです。`
`※UTF-8 with BOM なら UTF-8 に変換しておきましょう`


いい感じですね。では、さっそく合体させちゃいましょう。
これが合体させたい 2 つです。あい.csv の末尾に みょん.csv を結合します。

```ps1:
> $ai = "あい.csv"
> $myon = "みょん.csv"
```

合体させた後の csv は あいみょん.csv という名前にしておきます。

```ps1:
> $aimyon = "あいみょん.csv"
```

では、あい.csv の末尾に みょん.csv を結合します。

```ps1:
> cmd /c "copy /b $ai + $myon $aimyon"
```

`/b` があるとバイナリで見てくれるらしく、勝手に改行コード付け足したりとかがないそうです。
Tone.jsでピッチシフト（キー変更）

Tone.jsでピッチシフト（曲のテンポを維持したまま、キーを変更する）ができることを知ったので試してみました。
結果を先に言うと、キーを下げるとロボットみたいになって、歌に対して実用的に使える状態にはできませんでした。キーを少し上げるくらいなら良い感じです。

単にTone.jsの関数を呼んでいるだけですが、せっかくなので記録を残しておきます。
実際に動作しているものは[こちら(個人的なページ)](https://majipon.jp/products/pitchshift/)

Playerにファイルを読み込ませ、PitchShiftを経由してMasterへ流せばOK。

```javascript:pitchshift.js抜粋
var URL = URL || webkitURL;

let source = null;
let semitones = 0;
let shift = null;

// ファイル選択ダイアログなどで選ばれたものをtargetFileとして取得
function setAudio(targetFile) {
    let src = URL.createObjectURL(targetFile);
    // ボタン押下などでsemitonesの値を変えれば再生中のキーも変わる
    shift = new Tone.PitchShift({
        pitch  : semitones ,
        windowSize  : 0.03 ,
        delayTime  : 0 ,
        feedback  : 0
        }
    );
    source = new Tone.Player(src);
    source.connect(shift);
    shift.toMaster();
    source.autostart = true;
}

```

うまく調整する方法をご存知の方がいらっしゃれば教えてもらえると幸いです。
WebAudioを使って自力でピッチシフトの実装にも挑戦してみましたが、現状の私には難易度が高くて諦めました。

# 参考
- [Tone.js](https://tonejs.github.io/)
- [タイムストレッチ、ピッチシフトのアルゴリズム](http://ackiesound.ifdef.jp/tech/timestretch.html)
ブラウザだけで３分でKubernetesが試せるKatacoda

「ブラウザでプログラミングできるサービスで何かできないかな」と思って試したのが今回のKatacodaです。
https://www.katacoda.com/

##Katacodaとは

上述の通り、ブラウザ上のコンソールにプログラムを書いて実行できるサービスの一つです。
Katacodaの場合は、それが２５０以上の無料学習コースとして提供されています。

特にコンテナに強いようで、Kubernetesもブラウザだけで簡単に試せてしまうことには衝撃を受けました。

##Kubernetesを使ってみる

Kubernetesのコースはこちら。
https://www.katacoda.com/courses/kubernetes

minikubeというKubernetesの簡易ツールがインストールされた環境が用意されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/388624/2eef1283-90bc-73a7-4118-ef27c3de1ba4.png)

表示されるコマンドを入力すればKubernetesのクラスタが構築できます。

ダッシュボードの設定まですれば、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/388624/27551ef1-8ba0-c2fb-e94d-af9d30c890fe.png)

作成したダッシュボードのURLが表示されるので、開いてみると、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/388624/7d4d15cd-9f65-6186-a685-d63cbc67703e.png)

Kubernetesがこんなに簡単に。

去年の夏、minikubeを起動することすらできずに苦しんだ私にとっては、
本当に驚きです。

##その他のコース
他にも、OpenShiftやIstioなど、自分ではそうそう構築できないツールが簡単に試せます。AnsibleやTerraformなどの構築ツールも繰り返し実行できます。

##注意点
コンテナとクラウドを使えばここまでできてしまうのか・・・、という感じですが、あくまでも指示されたコマンドを入力するだけなので、仕組みを理解するためには別途学習が必要です。
あと、英語です。
scikit-learn ちょっと高度なFunctionTransformerの使い方

# はじめに
以前に書いた記事[sckit-learnのPiplineを使って、カスタム前処理をモデルの中に組み込む](https://qiita.com/makaishi2/items/880f88c72a4ad29e5139)の続編。
前の記事では前処理関数は完全に固定したものでしたが、この関数にパラメータを含めて、Pipeline作成後にパラメータを変更できる作りにすることを目標にします。

# 実装サンプル
以下に実装コードを記載しながら解説をします。

## データ準備
アイリスデータセットを題材にします。

```py3
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
```

## 前処理関数
前処理関数 func_customの定義をします。
説明を簡単にするため、入力値Xを一定値で割り算するという関数とします。
割る値は``arg1``という後で変更可能なパラメータにします。

```py3
def func_custom(X, arg1):
    return(X/arg1)
```

## カスタムフィルターの定義
FunctionTransformerクラスと先ほど定義したfunc_customを使ってカスタムフィルターを定義します。

```py3
from sklearn.preprocessing import FunctionTransformer
ft = FunctionTransformer(func_custom, validate=True, kw_args={'arg1': 2})
```

インスタンス生成時のパラメータ指定``kw_args={'arg1': 2}``がポイントです。
パラメータのキー値``'arg1'``は、関数宣言での引数と名前をそろえます。
こうすることで関数宣言のパラメータ値を後で変更することが可能になります。

## パイプラインの定義
パイプラインの定義に関しては、普通の方法で行います。


```py3
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
pipe = Pipeline([('ft', ft),('svm', SVC(gamma='auto'))])
```

## 学習・予測
いったん作ったPipelineで学習と予測を行ってみます。
ここも普通の方法ですので、解説は省略します。

```py3
pipe.fit(X, y)
pipe.predict(X)
```

## Pinelineから前処理を抜き出す
named_steps属性を使って、今作ったPipelineから前処理関数を抜き出してみます。


```py3
pipe.named_steps['ft']
```

次のような結果がかえってくるはずです。

```
FunctionTransformer(accept_sparse=False, check_inverse=True,
          func=<function func_custom at 0x10d904488>, inv_kw_args=None,
          inverse_func=None, kw_args={'arg1': 2}, pass_y='deprecated',
          validate=True)
```

## 前処理の挙動の確認
FunctionTransformerは、transform関数でフィルターの挙動を確認できます。現時点では以下のように入力データを2で割った答えが返ってきます。

```py3
X1 = X[:5,:]
print(X1)
```

```
[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]]
```

```py3
print(pipe.named_steps['ft'].transform(X1))
```

```
[[2.55 1.75 0.7  0.1 ]
 [2.45 1.5  0.7  0.1 ]
 [2.35 1.6  0.65 0.1 ]
 [2.3  1.55 0.75 0.1 ]
 [2.5  1.8  0.7  0.1 ]]
```

## フィルター関数内のパラメータ値変更
フィルター関数内のパラメータ値は``set_params(kw_args={'arg1': 4})``のようにset_params関数呼び出して値を変更できます。
変更のための実行コードと、変更後のフィルター出力結果は以下の通りです。
想定通り、入力値を4で割った結果がかえってきていることがわかると思います。

**パラメータ値変更**

```py3
pipe.named_steps['ft'].set_params(kw_args={'arg1': 4})
```

```
FunctionTransformer(accept_sparse=False, check_inverse=True,
          func=<function func_custom at 0x10d904488>, inv_kw_args=None,
          inverse_func=None, kw_args={'arg1': 4}, pass_y='deprecated',
          validate=True)
```

**変更後のフィルターの挙動**

```py3
print(pipe.named_steps['ft'].transform(X1))
```

```
[[1.275 0.875 0.35  0.05 ]
 [1.225 0.75  0.35  0.05 ]
 [1.175 0.8   0.325 0.05 ]
 [1.15  0.775 0.375 0.05 ]
 [1.25  0.9   0.35  0.05 ]]
```
Pythonの標準入力input()の個人的まとめ

## 実行すると、入力待ちの状態になるようなコードをPythonで書きたい。

Pythonに関する書物は世の中に沢山あるのですが、私の探し方が悪いのか「実行すると、
入力待ちの状態になるコード」に関する説明がどの書物にもそれほど書かれていないように思えます。

例えば「ある整数nを入力すると、それを2倍した2nが出力される」という
コードをPythonで書きたいと思ったらどうすれば良いのでしょうか。

Pythonの書物だと、下のようなコードはよく基本の章などに書いてあります。

```python:
n = 5
print(2*n)
```

確かにこのコードを実行すると5の2倍である10という数が出てきます。
しかしこれだとnに何を入力するのかが既にコードに書いてあり、コードを
実行したあとにnを自由に決めることはできません。

ではコードを実行した後にnを入力するにはどうすれば良いのか、ということになりますが、
答えは以下のコードになります。

```python:例1
n = int(input())
print(2*n)
```

このコードを実行すると入力待ちの状態になり、例えば7と入力すると14という数が出力されます。

別の例も挙げておきます。

```python:例2
print("好きな正の整数を入力して下さい。")
n = int(input())
print("１から入力された整数までの各整数の和は" )
print(n * (n+1)/2)
print("です。")
```
このコードを実行して、例えば6と入力すると1+2+3+4+5+6=21なので21という数が出力されます。




## input()の個人的まとめ

ここでは、input()に関連したコードを私が個人的にまとめて書いていきたいと思います。







#### 実数を入力する場合

intではなくfloatとすればOKです。
例えば以下のコードを実行して0.2と入力すると2.5×0.2=0.5が出力されます。

```python:例3
n = float(input())
print(2.5*n)
```
また、文字の場合は何も付けずn=input()とします。

   
#### 複数の数を入力したい場合

map(int, input().split())と書きます。入力の間隔はエンターではなくスペースです。

```python:例4
print("好きな整数を３つ入力して下さい。")
a, b, c= map(int, input().split())
print("入力された各整数の和は" )
print(a+b+c)
print("です。")
```

単に和を求めるだけなら以下の様な書き方もあります。


```python:例5
print("好きな整数を５つ入力して下さい。")
s = 0
for i in range(5):
    s += int(input())
print("入力された各整数の和は" )
print(s)
print("です。")
```



#### メッセージのあとに整数を入力させたい場合

例２や例４、例５のように書いてもいいのですが、以下のようにまとめて書くこともできます。

```python:例6
n = input('好きな整数を入力して下さい。:')
n = int(n)
```





#### 配列を入力したい場合


```python:例7
array = list(map(int, input().split()))
```
このあとに例えば

```python:
print(len(array))
print(sum(array))
```
などと書いておけば、入力した配列の要素数(つまり入力した整数の個数)や配列の要素の和が
出力されます。

#### 配列を入力したい場合２


```python:例8
n = int(input())
array = [int(input()) for _ in range(n)]
```
この場合、最初に配列の要素数を指定できます。ただし、ひとつの成分を入力するごとに
その都度Enterを押す必要があります。

#### 配列を入力したい場合３

上の状況と似ていますが、こちらは先に空の配列を用意しておきます。

```python:例9
n = int(input())
a = []
for i in range(n):
    a.append(int(input()))
```

#### 縦に整数を並べたい場合

まず入力する整数の数を決めて、そのあとはfor文とします。

```python:例10
n = int(input())
for i in range(n):
    x = int(input())
```


#### n行の行列のような配列を入力したい場合

数学で行列と言えば各行の成分の数は一定でなければいけませんが、ここではそうとは限らない配列の入力法を書いておきます。


```python:例11
n = int(input())
a = []
for i in range(n):
    a.append(list(map(int, input().split())))
```


### クラスを使用したコード

例えば、以下の様に書くことができます。

```python:例12
class Doubler:
    def __init__(self):
        self.n = int(input("数字を入力してください: "))
    
    def double(self):
        print(2 * self.n)

# インスタンスを作成してメソッドを呼び出す
doubler = Doubler()
doubler.double()
```
Cloud Functions で Puppeteer が動かないとき

Puppeteer は、Google の Chrome DevTools Teams が開発しているブラウザの自動化ライブラリ。Cloud Functions でも使えると発表されている。

[Introducing headless Chrome support in Cloud Functions and App Engine | Google Cloud Blog](https://cloud.google.com/blog/products/gcp/introducing-headless-chrome-support-in-cloud-functions-and-app-engine)

が、Cloud Functions で動かしたときのみ、`Navigation Timeout Exceeded` エラーなどで Puppeteer が動かないときがある（動くときもあるので厄介）。
（ちなみにスペックは、`runtime: Node.js 8`, `memory: 2GB`, `region: asia-northeast1`）

:warning:  `Navigation Timeout Exceeded` エラー は、時間内に処理が完了しないときに出るエラーだが、Cloud functions が原因の場合は、timeout をどんなに長く設定してもダメ。

## Puppeteer (Chromium) の起動オプションを見直す

[Puppeteer slow execution on Cloud Functions · Issue #3120 · GoogleChrome/puppeteer](https://github.com/GoogleChrome/puppeteer/issues/3120)

この issue でもいろいろ議論されている。

```javascript
  const browser = await puppeteer.launch({
    args: [
      '--no-sandbox',
      '--disable-setuid-sandbox',
      '-–disable-dev-shm-usage',
      '--disable-gpu',
      '--no-first-run',
      '--no-zygote',
      '--single-process',
    ],
    headless: true,
  });
```

真似して設定してみたら、動いた :open_mouth: 
同じ環境で困っていたら、試してみてくだしあ。

Chromium のオプション一覧
[List of Chromium Command Line Switches « Peter Beverloo](https://peter.sh/experiments/chromium-command-line-switches/)
raspiで59.94Hzのdisplayを表示させる

通常のディスプレイは６０Hzでちゃんと表示されるのだが、ある特定の５９.９４Hzのディスプレイは横縞が上下にずっと動いている状態になってしまった。

こちらも、日本語で書いてある説明がなくだいぶ困ったのでこちらにメモしておく。

答えとしては、以下のコマンドを実行すれば良い。

```
tvservice -e "CEA 16 HDMI" --ntsc
```

一応説明すると、--ntscとすると、HDMI_PIXEL_CLOCK_TYPE_NTSCの設定となる。
ソースのコメントを見ると、/**< Multiply norminal pixel clock by 1000/1001 to get the alternative frame rate e.g. 59.94Hz rather than 60, not applicable to all formats */となっていて、６０Hz設定が５９.９４Hz設定となると言うわけである。

CEA 16 HDMIと言うのは、HDMIのCEAの１６番の設定（１０８０pの６０Hz）に設定と言う意味。
さらに--ntscとしているので５９.９４Hz設定となります。

ちなみに、HDMIのカスタム設定で５９．９４Hzをやったがダメで６０Hzに四捨五入されていました。

表示最初数秒は縞が解消されていく過程が見えてしまうのだが、それは今後の課題として残っている。

Force 1080i video at 59.94fps
https://raspberrypi.stackexchange.com/questions/82527/force-1080i-video-at-59-94fps
 
HDMI_PIXEL_CLOCK_TYPE_NTSC
https://github.com/raspberrypi/userland/blob/master/interface/vmcs_host/vc_hdmi_property.h
LAN内のPC・スマホのIPアドレスを一覧表示させる方法

# 使用環境

MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)

# nmapを使用する方法

```bash
$ sudo nmap -sP (対象LANのネットワークアドレス)
```

例えば，192.168.3.0を対象とする場合，

```bash
$ sudo nmap -sP 192.168.3.*
```

としてやればOKです．

# arp-scanを使用する方法

arp-scanを使用することで，IPアドレスだけでなくOS情報も表示してくれます．

まずはbrewでarp-scanをインストールします．

```bash
$ brew install arp-scan

...
libpcap is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have libpcap first in your PATH run:
  echo 'export PATH="/usr/local/opt/libpcap/bin:$PATH"' >> ~/.bash_profile

For compilers to find libpcap you may need to set:
  export LDFLAGS="-L/usr/local/opt/libpcap/lib"
  export CPPFLAGS="-I/usr/local/opt/libpcap/include"

For pkg-config to find libpcap you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/libpcap/lib/pkgconfig"
```

言われた通りPATHもセットしときましょう．
あとは，以下のようなコマンドを打てばOKです．

```bash
$ sudo arp-scan --interface en0 -l
Interface: en0, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.9.5 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.3.1	18:4f:32:80:10:8e	Hon Hai Precision Ind. Co.,Ltd.
192.168.3.2	cc:9e:a2:cf:d6:1f	(Unknown)
192.168.3.5	44:1e:a1:fa:39:13	Hewlett Packard
192.168.3.3	38:f7:3d:85:ef:dc	(Unknown)
192.168.3.7	88:19:08:95:76:d9	(Unknown)
192.168.3.8	a8:6b:ad:43:00:a0	Hon Hai Precision Ind. Co.,Ltd.
192.168.3.9	a0:6f:aa:f3:bb:12	(Unknown)
192.168.3.11	cc:08:8d:70:66:78	Apple, Inc.
192.168.3.15	54:13:79:be:9f:d1	Hon Hai Precision Ind. Co.,Ltd.
192.168.3.12	c8:69:cd:9b:b2:6e	Apple, Inc.
192.168.3.14	cc:82:eb:44:38:b2	(Unknown)
192.168.3.6	60:45:cb:1f:ad:ae	(Unknown)
```

linuxでも同じコマンドが使用できます．

# LanScanをインストール

App Storeで「LanScan」をインストールすれば，簡単にapr-scanのような情報が得られます．コマンドうつのめんどくさいという方はぜひインストールしてみてください．
raspiでデジタルサイネージ（omxplayerのseek表示を無くす編）

omxplayerでデジタルサイネージを作るのだが、再生をloopさせると動画の先頭に戻るときにseek XX:XX:XXが表示されてしまうのに困っていた。--no-osdを付けても出るのである。

色々調べたらわかったのでここにメモしておく。
日本語で書いてあるページは調べるかぎりなかった。

omxplayerは以下のようにpopenで起動するのだが、--no-osdを付けてもseekだけは表示が出てしまって困っていた。

```
proc = subprocess.Popen('omxplayer --no-osd --refresh --loop --blank -o both /home/pi/demo/demo.mp4',shell=True,stdin=subprocess.PIPE)
```

そこで色々調べていたら以下のページにたどり着いた。

how to hide omxplayer details.
https://www.raspberrypi.org/forums/viewtopic.php?t=197087

そこにはこう書いてある。OMXのスクリプトを変更せよと。具体的にはこう。

```
cd /usr/bin
sudo cp omxplayer omxplayer_silent
sudo nano omxplayer_silent
```

そして、omxplayer_silentのLD_LIBRARY_PATHの行を以下のように変更する。

```
LD_LIBRARY_PATH="$OMXPLAYER_LIBS${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" $OMXPLAYER_BIN "$@" > /dev/null 2>&1
```
これで完了。起動するときはsilentの方を実行する。

```
proc = subprocess.Popen('omxplayer_silent --no-osd --refresh --loop --blank -o both /home/pi/demo/demo.mp4',shell=True,stdin=subprocess.PIPE)
```
そして、--no-osdをつけるのも忘れずに。これでSEEK表示が出なくなった！

では、楽しいデジタルサイネージライフを！
個人事業主になってWebサービス作るので用意・検討したこととか汎用的なところを一通り書いていく

まだ導入に至っていない箇所も多いので、より良いサービスなどありましたらコメント頂けると幸いです。

この記事自体の粒度は粗いのでリンク集や俯瞰してみたい方向け。

# 国への申請や経理関連
**この項目は[開業freee](https://www.freee.co.jp/kaigyou/)にのっかれば全部終わります、神。**

### 個人事業の開業・廃業等届出書を送る
開業freeeで必要項目を入力すると書類がPDFで出てくるので印刷して税務署郵送。
屋号を考える必要はある。
会社と間違われない名前をつけたほうが良いとのこと。
名前を一部文字った○○システムという名前で申請した。
（本当は○○ラボとしたかったが、同名の企業があったので回避）

### 所得税の青色申告承認申請書を送る
開業freeeで必要項目を入力すると書類がPDFで出てくるので印刷して税務署郵送。

### 事業用の銀行口座を作る
月額会員アプリでもなんでも収入を振り込む口座、経費の引き落としに使う口座は必要になるので事業用に作る。
開業freeeに勧められたジャパンネット銀行に開くことにした。
2000年から事業はじめてるしセキュリティトークンなども利用しているので大丈夫でしょう多分。
~~システムリニューアルとかにも強い設計してくれてそう。~~

事業用口座の場合、個人事業の開業・廃業等届出書の控えのコピーを送付する必要がある。なので個人事業の開業手続きはお早めに。

2019年4月現在、申請が混み合い3週間程度かかるとのこと。普段は1,2週間らしい。
→4月末頃に口座開設できました。トークンと一緒にデビットカードが届く。

### 事業用のクレジットカードを作る
AWSの支払いとかカードでやりたいので作る。
個人事業主で収入目処無くても作れるのかと思ったが、個人事業主向けに作ってるところがあり少なくともそこなら大丈夫らしい。

このあたりは実際に口座が出来て申請したあとに結果を追記しようと思います。
多分6月頃？
→デビットカードで大体の支払いが可能なので一旦不要と判断。

### 確定申告の準備
ホイホイレールに乗って会計freeeに登録して上記口座とカードの決済情報連携して済ませようと思います。
私の場合は手作業として
・自宅作業になるので電気代の一部を経費として計上。
・業務用カード発行までの個人カードからの経費を計上。
が必要。
（個人カードを連携してから余分を削除でもいけると思いますが、私の場合経費分入力のほうが早そうなので）

余談：収入がない年でも[経費を申請しておけば3年間繰越できる](https://www.freee.co.jp/kb/kb-blue-return/deficit/)そうです。
税務署は証拠を出す貧乏人には優しいので吐いた血の量はわかるようにしておきましょう。


# インフラ関係
**AWSとGCPで迷ったが、今回はAWS**
[理由]
初年度無料サービスが多いのが嬉しい。
導入企業が多いのでフリーランスで週○日やりつつ、という潰しが効きそう。
日本語で問い合わせできるのが英語できないマンとしてはとても嬉しい。（GCPは400$～で日本語サポート対象のはず）

### グローバルドメインを取得する
[AWSがやってくれる](https://aws.amazon.com/jp/getting-started/tutorials/get-a-domain/)のでお願いする。

### WEBサーバ/ロードバランサーを用意する
[AWSのチュートリアルに従う](https://aws.amazon.com/jp/getting-started/tutorials/deploy-app-command-line-elastic-beanstalk/?trk=gs_card)
AWS Elastic Beanstalkを利用。Docker使ってのデプロイを想定。

### DBサーバ
[Amazon RDS](https://aws.amazon.com/jp/rds/)でシンプルにいく。
MariaDB利用。

### ファイルサーバ
[Amazon EBS](https://aws.amazon.com/jp/ebs/)を利用。
[Amazon FSx for Windows](https://aws.amazon.com/jp/blogs/news/new-amazon-fsx-for-windows-file-server-fast-fully-managed-and-secure/)はまだ日本リージョンでサービスがないので遅延考えると難。

# プロジェクト・ソース管理
[gitLab](https://about.gitlab.com/)を使ってみる。

### タスク管理
gitLabでやれる。
正直、個人なので当面管理系の機能は不要と思うがβリリースした後などリスト化したいので。

### CIツール
これもgitLab。実際のところ、gitLabを使いたいのはこちらの機能が主目的。

### チャットツール
一人だといらないがgitLabで出来る。

### ソース管理
githubからgitlabに連携する。ソース自体はgithubにプッシュしていく予定。
なんだかんだgithubは連携できるアプリケーションが多く、こちらにソースがあったほうが何かと便利。

# アプリケーション開発関連
WEBブラウザ、WEBアプリ（android/iOS)でサービス提供する。

### 開発環境
自宅PC。もともとコーディングできる性能のものがある。
これからは経費で落とせるので嬉しい。

### googleプレイへのアプリリリース準備
[グーグル先生の教え](https://techacademy.jp/magazine/2255)に従って申請。

### iOSデプロイ用
Macを買う。経費で。
そして[グーグル先生の教え](https://dev.classmethod.jp/smartphone/iphone/ios-app-how-to-release-2018/)に従って申請

### サーバーサイド言語、フレームワーク
PHPでLaravel。
よほどWEBサーバーのロジックを作り込む必要がない限り、これがデファクトスタンダードになると思う。[phalcon](https://phalconphp.com/ja/)は気になるけども。

### フロントサイドのライブラリ
bootstrap/react/多分jQuery
SPAにしてみようかとも思うが、今の所保留。
画面デザイン・遷移図が完成してから検討する。
画面数はそんなに多くならず、頻繁に遷移しない設計になりそうなのでSPAにする必要は薄そう。

### 決済関係
[Stripe Billing](https://stripe.com/jp/billing)にお願いします。
継続支払い関連の手数料が非常に安く、
継続支払いによる収益の最初の1億円分に対しては0%、
継続支払いに対しては0.4%となっていたのが決め手。


### デザイン作成ツール
adobe XDで
1.ワイヤーデザイン
2.細かい画像などのデザイン
3.Web ExportやCopy CSSあたりのプラグインを使ってHTML/CSS取得→コード化していく

もしくはbootstrap studioが気になったので触るかも。
Live2DをC++で組み込むため、Cubism3 Nativeのサンプルを動かした

#Live2DをKuinに組み込みたい
プログラミング言語KuinにLive2Dを組み込むため、C++で提供されているCubism3 Nativeを試すことにした。
今回は、サンプルプロジェクトを実際に動かしたい。

#環境
今回は以下の環境で行う。
これはプログラミング言語Kuinに組み込むときのために環境を合わせる意味がある。

- Visual Studio 2017 C++
- ターゲットプラットフォーム8.1
- ツールキットv140
- DirectX11

#情報が無い
Cubism3 Nativeだが、驚くほどに情報が無い。
これは主に業務で使う人が多いためだと思われる。しかし私は趣味で試していく。

もっとも大きな情報源はSDKチュートリアルだ。
SDKチュートリアル : https://docs.live2d.com/cubism-sdk-tutorials/top/

これによると、基本的にはCocos2d-xや、OpenGLなど、スマホやネイティブアプリ向けを意図しているようだ。
![0050.jpg](https://qiita-image-store.s3.amazonaws.com/0/9729/be8f2ac1-c5ef-0052-e97e-63e6efc91b76.jpeg)

そう。**DirectXについての記載がない**。

つまり気合いである。

#Cubism SDK for Nativeの入手
公式からダウンロードできる。

Last update : 2019/03/28
Download Cubism 3 SDK for Native beta11
https://live2d.github.io/#native

![0060.jpg](https://qiita-image-store.s3.amazonaws.com/0/9729/c8dedd06-0c95-6334-6ad5-d8edc96df05a.jpeg)
サンプルプロジェクトまであるようだ。

#構成
ここがいきなりの難関だと思う。
どう組み立てていくべきか、予測していくしかない。

- Core
- Framework
- Samples

これらの立場を調べた。

- Core　→　libとヘッダー。すでにコンパイル済み。
- Framework　→　ソースとヘッダー。必要なものをコンパイルしてlibかDLLを作る。
- Samples　→　実際にLive2Dを使うときのサンプルプロジェクト。

#何をすべきか
やることは以下のとおりだ。

1. Frameworkをビルド
2. Samplesで動作を確認

#Frameworkのビルド
Frameworkのビルドについてはわりと楽だ。
ソースコードで配布されている上、なんと優しいことにCMakeのファイルまでついている。
CMakeを基に、Visual Studio 2017でのプロジェクトファイルを調整していく。
主に『DirectX関連へのパスやライブラリの追加』である。（例えば追加ライブラリへd3dcompiler.libを足すなど）
DirectXの知識はCubism3 Nativeと関係ないため割愛する。

注意点として、**Renderingフォルダ内のD3D9フォルダやOpenGLフォルダは不要**なことだろう。
これは、今回はDirectX11をターゲットにしているためである。
OpenGL向けなら、もちろんD3D9とD3D11フォルダが不要となる。
また、ソースコードを読めば分かるが、フォルダ階層には調整が必要なので注意が必要だ。

#Samplesのビルド
サンプルは、環境別に用意されている。
今回はDirectX11のため、D3D11だ。
![0090.jpg](https://qiita-image-store.s3.amazonaws.com/0/9729/dd6f5647-c21e-689c-3e03-75d427273ece.jpeg)
ResフォルダはLive2D用データだ。共通必須となる。
また、このサンプルはDirectXTKが必要となる。
ReadMe_ja.txtに従い、DirectXTKをダウンロードしてビルドし、DirectXTK.libを作っておこう。

さて、実際にビルドするといくつものエラーが出るはずだ。
（フォルダ構成に関するものは割愛する）
主な原因は、**LPCSTRとLPCWSTRの型変換ができない**ことだ。


~~これはビルド環境側で吸収できるのか確認が面倒だったため、以下の対応を行った。~~
![0150.jpg](https://qiita-image-store.s3.amazonaws.com/0/9729/0cdcaa21-a7cd-9edc-3d68-0402084e08a4.jpeg)
![0152.jpg](https://qiita-image-store.s3.amazonaws.com/0/9729/ac5c41bb-4136-dffe-1a5d-e560e69e69f2.jpeg)
~~もともとC++で開発している人であれば、このあたりは問題にならないだろう。~~
~~逆に、わたしのようなC#erには分かりづらい。~~
追記：あとで調べたところ、該当箇所はLPCSRTで型宣言をした変数だった。そのため、型宣言をLPCWSTRに修正して対応した。可能と分かったならよりエレガントに解決すべきだ。


最後に、リソース関連のプロパティを明示しておく必要がある。
![0170.jpg](https://qiita-image-store.s3.amazonaws.com/0/9729/e5dfe457-a8ad-7c90-770c-82668c87caf9.jpeg)
jsonファイルはもちろんテキスト。画像は画像だ。
moc3ファイルはリソースだとエラーになるため、今回はメディアとした。
（構成は　すべての構成　を選択しておくこと）

ここまでの作業により、サンプルがビルドでき、動くようになる。
https://twitter.com/isimiya9/status/1114068543002177536

あとはサンプルのソースコードを読み込んでいくのが中心となる。
サンプルのソースコードを読めば、C++で自前のプログラムを組むことができる。

以上。
Civ5をMacで日本語化する

思い立ってSid Meier's Civilization® VをMacでプレイしてみることに
日本語サポートはWindowsのみということで色々探ってみて自力でやってみました。
ネットで落ちてる情報だと少し足りなかったのと、
色々とミスって会社用のPCで構築してしまったので、
私物PCにするためにここにメモ。


#用意するもの
1.日本語翻訳ファイル　(xml)
　Windowsでインストールするなりして手に入れてください。
　ファイルの場所は後述
2.Beauty Japanese Font Kit（有志で作られたフォント。）
　ググるとどこかしらで手に入ります

#翻訳ファイルの場所(windows内)
###通常ぶん：
c:/ProgramFiles(x86)/Steam/steamapps/common/Sid Meier's Civilization V/Assets/Gameplay/XML/NewText/
の　JA_JPフォルダをコピー

###DLCぶん:
c:/ProgramFiles(x86)/Steam/steamapps/common/Sid Meier's Civilization V/Assets/DLC　内に買った分のDLCがはいっているので、
それぞれのフォルダの中の、 ~/Gameplay/XML/Text/　のJA_JPフォルダをコピー

私は全部入りを購入したのですが、
DLC_SP_Maps系と、Tabletには日本語化するものはないもよう
Expansion　というフォルダには、さらに中に DLCというフォルダがあり、
同じ構造で日本語ファイルが入っているので、それらのJA_JPフォルダもコピーしておく。

#翻訳ファイルをMacに配置
持ってきた翻訳ファイルを然るべき場所に配置します
Assetsフォルダ以下はWindowsと構成が同じなので、そこにいれていくだけ

/Users/[ユーザー名]/Library/Application Support/Steam/steamapps/common/Sid Meier's Civilization V/Civilization V.app
を右クリックして「パッケージの内容を表示」を選択すると、中身が表示されます。
/Contents/Home/Assets/〜　にそれぞれ翻訳ファイルを配置していく

#日本語化フォントを入れる
Beauty Japanese Font Kitを導入します
なくても日本語にはなりそうですが、見た目が崩れたりして読みにくいらしいので、
ありがたくこちらを使わせていただきます。

軽装フォント、重装フォント　どちらでもいい
Assets/UIの中身を　~Assets/UI/にコピーして上書き
さらに、resources/Common の中身を　~Assets/UI/Fonts/Tw Cent MT/に入れる
こんなかんじ
<img width="784" alt="スクリーンショット 2019-04-05 19.32.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/39089/7d54d85c-468e-c8cd-430c-a6526a08b6ea.png">

#英語の設定ファイルを書き換え
1.~Assets/Gameplay/XML/NewText/English.xmlをひらく
2.
この部分を

```xml
<Languages>
        <Row>
            <ID>0</ID>
            <Type>en_US</Type>
            <Name>English</Name>
            <TableName>Language_en_US</TableName>
            <PluralRule>2</PluralRule>
        </Row>
</Languages>
```

こう書き換え

```xml
<Languages>
        <Row>
            <ID>0</ID>
            <Type>ja_JP</Type>
            <Name>Japanese</Name>
            <TableName>Language_JA_JP</TableName>
            <PluralRule>2</PluralRule>
        </Row>
</Languages>
```

#起動して確認
うまくいってなくても責任は持たない

#おまけ
Windows版には日本語版のOPムービーが入っていた
英語版と内容が全然違うのできになる人は見てみよう
~Steam/steamapps/common/Sid Meier's Civilization V/
フォルダの中にあります

#遊べる
ああ＾〜時間が無限に吸われる〜
レッツエンジョイライフ〜
WindowsでCSVファイルアップロードうまくいかない。。。

#導入
先日、とあるWebアプリケーションのCSVファイルアップロード機能を追加開発した時にMacではうまくいっていたファイルの中身のバリデートチェックがWindowsでは全然機能しなかった問題が発生したので備忘録として。

#アプリケーション環境
* Ubuntu（バージョンは忘れた）
* PHP-7.2fpm 
* CakePHP 2系
* nginx

#動作確認環境
###不具合が発生した環境
* WindowsのChrome、InternetExplorer11、FireFox

###問題がなかった環境
* MacのChrome、FireFox

#原因調査内容
###MacとWindowでは同じChromeでも仕様がちがう？
→検索していろいろ調べてみたが原因解明できず、一旦保留

###MacとWindowsではブラウザの初期のセキュリティ設定が違う？？
→JavaScriptやCookieの設定等いろいろいじってみたが挙動変わらず。

###nginxかPHPの設定がおかしい？？？
→nginxはそもそも関係なかった。。。
→PHPはphp.confにuploadファイルの設定があったので、一時保存先や最大ファイルサイズ等変更するが変わらず（そもそもサーバの設定ならWindowsとMacで挙動変わらないはず。）

###ctpファイル（View）の実装がおかしい？？？？
→こちらもformタグに「multipart/form-data」が設定されているから問題ない気がする？

###MacとWindowsでrequestの中身が違うんじゃ？？？？？
→とりあえず、アップロードファイルが格納される変数をCotrollerで画面に出力するコードを記載
　MacとWindowsのそれぞれで出力結果を確認してみる。

```
 // ファイルの中身を出力
 echo "<pre>";
 var_dump($_FILE);
 echo "</pre>";
 exit();
```

出力結果が以下、、、ん？？

```
#Windows

array(1) {
  ["data"]=>
  array(5) {
    ["name"]=>
    array(1) {
      ["XXXXXXXX"]=>
      array(1) {
        ["upfile"]=>
        string(12) "TEST.csv"
      }
    }
    ["type"]=>
    array(1) {
      ["XXXXXXXX"]=>
      array(1) {
        ["upfile"]=>
        string(24) "application/vnd.ms-excel"
      }
    }
    ["tmp_name"]=>
    array(1) {
      ["XXXXXXXX"]=>
      array(1) {
        ["upfile"]=>
        string(14) "/tmp/phpQYwrAs"
      }
    }
    ["error"]=>
    array(1) {
      ["XXXXXXXX"]=>
      array(1) {
        ["upfile"]=>
        int(0)
      }
    }
    ["size"]=>
    array(1) {
      ["XXXXXXXX"]=>
      array(1) {
        ["upfile"]=>
        int(56)
      }
    }
  }
}

#Mac
array(1) {
  ["data"]=>
  array(5) {
    ["name"]=>
    array(1) {
      ["XXXXXXXX"]=>
      array(1) {
        ["upfile"]=>
        string(12) "TEST.csv"
      }
    }
    ["type"]=>
    array(1) {
      ["XXXXXXXX"]=>
      array(1) {
        ["upfile"]=>
        string(8) "text/csv"
      }
    }
    ["tmp_name"]=>
    array(1) {
      ["XXXXXXXX"]=>
      array(1) {
        ["upfile"]=>
        string(14) "/tmp/phpICM53a"
      }
    }
    ["error"]=>
    array(1) {
      ["XXXXXXXX"]=>
      array(1) {
        ["upfile"]=>
        int(0)
      }
    }
    ["size"]=>
    array(1) {
      ["XXXXXXXX"]=>
      array(1) {
        ["upfile"]=>
        int(18)
      }
    }
  }
}


```

***MIMEtypeが違うな？***

#結論

ファイルの型のチェックの際、MIMEtypeのチェックをしていたが、
"text/csv"のみ許容する実装になっていたため、Windowsから送信されるMIMEtypeが"application/vnd.ms-excel"になっていたのでCSVファイルと判定されていませんでしたね。。。

現在はファイル名の後ろが「.csv」かどうかで判定するように変更して落ち着きました。
FirebaseをCarthageで設定する時のXcodegenのyml

こちらを参考にxcodegenのymlを書きました。
https://qiita.com/lovee/items/09d33b7c8b1e3ff3dcc6

```yaml
targets:
  App:
    settings:
      base:
        OTHER_LDFLAGS: $(inherited) $(OTHER_LDFLAGS) -ObjC
    dependencies:
      - framework: Carthage/Build/iOS/Firebase.framework
        embed: false
        link: false
      - framework: Carthage/Build/iOS/FIRAnalyticsConnector.framework
        embed: false
      - framework: Carthage/Build/iOS/FirebaseAnalytics.framework
        embed: false
      - framework: Carthage/Build/iOS/FirebaseAuth.framework
        embed: false
      - framework: Carthage/Build/iOS/FirebaseCore.framework
        embed: false
      - framework: Carthage/Build/iOS/FirebaseCoreDiagnostics.framework
        embed: false
      - framework: Carthage/Build/iOS/FirebaseInstanceID.framework
        embed: false
      - framework: Carthage/Build/iOS/GoogleAppMeasurement.framework
        embed: false
      - framework: Carthage/Build/iOS/GoogleUtilities.framework
        embed: false
      - framework: Carthage/Build/iOS/GTMSessionFetcher.framework
        embed: false
      - framework: Carthage/Build/iOS/nanopb.framework
        embed: false
      - sdk: libc++.tbd
      - sdk: libsqlite3.tbd
      - sdk: CoreTelephony.framework
      - sdk: StoreKit.framework
```

FirebaseAnalyticsとAuthのサンプル
MacOSでfishにgoogle-cloud-sdkをインストールするときの手順

ちょっと時間をかけてしまったので、メモを残す。

### 前提条件
- Homebrewインストール済み
- fishインストール済み

### 手順

#### brew cask でSDKをインストール
```shell
brew cask install google-cloud-sdk
```

#### config.fishにSDKの設定を追加
```shell
vim ~/.config/fish/config.fish
```
下記を追加する

```
source /usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.fish.inc
```

#### コマンド補完を有効にする
https://github.com/aliz-ai/google-cloud-sdk-fish-completion をcloneして`install.sh`を実行


### 参考
https://stackoverflow.com/questions/25468074/get-fish-shell-to-work-with-gcloud-command-line-tools
CSVからTSVに変換するワンライナー

```
python -c 'import sys, csv; csv.writer(sys.stdout, delimiter="\t").writerows(csv.reader(sys.stdin))' < 入力.csv > 出力.tsv
```

表題のテーマでググるとsedなりtrなりで単純にデリミタを置換する方法が多く紹介されています。
しかしそれではクォーテーションされた文字列の一部としてのカンマも置換されてしまいます。

クォーテーションを考慮しようとすると、もはやどんなに正規表現を駆使しようとも置換では不可能なので、既成のCSVツールに頼りたくなります。
ではシェル上でパイプフィルタとして手軽に呼び出せる既成のCSVツールはどんなものがあるだろうか。

ない

少なくとも私は知らない。あったら教えてください。
したがって、何らかのスクリプト言語のCSVライブラリを用いることになります。

ひとまず思い浮かぶのは「電池ついてます」がウリのpythonなので、冒頭のようなワンライナーを考えました。
もちろん、デリミタ指定を変えてやればTSV → CSVもできるし、独自デリミタもできます。

```
python -c 'import sys, csv; csv.writer(sys.stdout, delimiter=",").writerows(csv.reader(sys.stdin, delimiter="\t"))' < 入力.tsv > 出力.csv
```

ワンライナーは短さこそ至上命題なので、もっと短く書けるよというコメントを歓迎します。
もちろんpythonに限りません。
Docker+nginxでtry_filesを追加したい

PWAのhistory APIを利用している場合、TOP以外のURLでリロードすると実体が存在しないため、404になってしまう。
※history APIは実際にはサーバーにアクセスせずに、ブラウザのURLを書き換えるというもの。

そのため、すべてのアクセスはindex.htmlなどの実体で受け止める必要がある。
vuejsではVueRouterのhistory mode, AngularのRouterではデフォルトでhistory APIを利用するので、これをやっておかないとTOPページが出たワーイからの別ページを作るときに404祭りになってアワアワすることになるよ！

APIの詳細はこいつ。 [History - Web API | MDN - Mozilla](https://developer.mozilla.org/ja/docs/Web/API/History)

# どうなるの？

---

TOPページ(vueのサンプル)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/56925/d52f1d66-766e-21f4-77c7-e1faeb8c64ab.png)


---

aboutページに遷移はOK
![image.png](https://qiita-image-store.s3.amazonaws.com/0/56925/f0c55087-f3f7-a513-ec2d-b6dd97b401fa.png)

---

リロードすると、404になる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/56925/8089e947-fc98-5ced-35fe-b32633e2aee7.png)

# どうすればいいの？

index.htmlにすべてを放り投げればよい。
nginxの設定にtry_filesを追加することでおｋになる。
locationの中に書くのがよろしかろう。`try_files $uri $uri/ /index.html;`
これをやると本当の404もindex.htmlに持っていかれるのでjs側でなんとかしてください。

```
server {
    listen 80;
    server_name  localhost;

    charset utf-8;

    location / {
        root   /usr/share/nginx/html;
        index index.html;
        try_files $uri $uri/ /index.html;
    }
}
```

# Docker 

Dockerのnginxを利用する場合、confファイルを作ってコピーする。
nginx-vhost-default.confに↑のようなconfファイルを用意して、コンテナにコピーしてあげる。
下から2行目だよね。

```
# Stage 0, "build-stage", based on Node.js, to build and compile the frontend
FROM node:11.3.0 as build-stage
WORKDIR /app
COPY package*.json /app/
RUN npm install --global npm@6.8.0 npx@10.2.0 && npm install
COPY ./ /app/
RUN npm run build -- --mode development

# Stage 1, based on Nginx, to have only the compiled app, ready for production with Nginx
FROM nginx:1.15
COPY ./nginx-vhost-default.conf /etc/nginx/conf.d/default.conf
COPY --from=build-stage /app/dist /usr/share/nginx/html
```
default.confはDockerですでに用意されていて、上書きしてしまうので元を知りたい方はこちらを参考にどうぞ。
https://github.com/nginxinc/docker-nginx/tree/master/stable/alpine

# おまけ Apache2.2と2.4の場合

2.2の場合は頑張って書く。

```
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]
</IfModule>
```

2.4の場合はFallbackResourceが使えます。

```
<IfModule mod_rewrite.c>
    FallbackResource /
</IfModule>
```

2.2は2017年でエンドオブライフを迎えてますので使わないようにしてくださいね。
システム設計・テスト 応用情報技術者試験 対策日記@17

#システム設計
##DFD(データフローダイアグラム)
入力データに対して何らかの処理を施し、データを出力する流れを**プロセス**という。
データベースやファイルなど、 データの保管場所を**データストア**という。
部品間のデータの移動経路を矢印で表したものを**データフロー**という。

最初に、システム全体のDFDを作成し、それぞれのプロセスを別のDFDに詳細に記述する(段階別詳細化)。
既存のシステムや業務を新しいシステムとして作成する場合、まず現状の業務を**現物理モデル**として洗い出す。次に、それを一般的に抽象化して**現論理モデル**とし、さらに新しくイメージした**新論理モデル**を作成する。最終的に具体的な業務に落とし込んだ**新物理モデル**を作成する。

##UML(Unified Modeling Language)
http://www.itsenka.com/contents/development/uml/ を参照


#テスト
##ユニットテスト
テストするモジュールの上位モジュールが未完成の場合、その仮のモジュールを**ドライバ**と呼ぶ。
一方、テストするモジュールの下位モジュールが未完成の場合、仮に作るモジュールを**スタブ**と呼ぶ。

##ホワイトボックステスト
ソースコードなどのシステム内部の構造についてテストする
###制御パステスト
プログラム中のソースコードが全て実行される様にテストデータを与える手法。命令網羅、判定条件網羅などでどの程度のソースコードが網羅されたかをカバレッジ(網羅率)で判定する。
###データフローテスト
制御部分ではなくデータや変数の定義、使用、消滅のステップを確認するテスト。

##ブラックボックステスト
外部から見て仕様書通りの機能を持つかどうかをテストする。原因-結果グラフや決定表を用いる。
###同値分割
出力値と入力値を同値クラスに分類し、各同値クラスを代表する値に対してテストを行う。
###限界値分析
同値クラスの境界値はエラーが起こりやすいので、そこを重点的にテストする。

##テストの管理方法
###信頼度成長曲線(ゴンベルツ曲線)
テストを消化するごとにエラーの増加割合は減少していく。この曲線が収束に向かうことを目指す。
###エラー埋め込み法
意図的にエラーを埋め込み、埋め込みエラーと真のエラーは同じ割合で発見されるとの仮定のもと、真のエラー数を推測する。

#開発モデル・プロセス
##ウォーターフォールモデル
作業工程を分解し、それを順番に進めていくモデル。
##スパイラルモデル
分割した単位で開発のサイクルを繰り返すモデル。
##アジャイル開発
迅速に無駄なくソフトウェア開発を行う手法の総称。代表的なものにXP(Extreme Programming)などがある。
##SLCP
ソフトウェアライフサイクルプロセスは**SLCP-JCF2013**に定義されている。取得者と供給者の間で開発作業についての作業を詳細に規定したもの。
##CMMI
Capability Maturity Model Integration(能力成熟度モデル統合)。組織のプロセスの習熟度をモデル化したもの。
レベル1:初期　
レベル2:管理された 
レベル3:定義された 
レベル4:定量的に管理された 
レベル5:最適化している
##リバースエンジニアリング
ソフトウェアの動作を解析し、ソースコードを明らかにすること。禁止されている場合もある。
##マッシュアップ
複数サービスのAPIを組み合わせて新しいサービスを作ること。

------
[ホームへ](https://qiita.com/k-y/items/dc2c9a3a8425712253e8)
【ゴリ押し】Unity2018.3から2018.2へPrefabを壊さず持って行く方法

Unity2018.3から2018.2へダウングレードする際に死んでいく数多くのPrefabたちを守るための ~~ゴリ押し技~~ 救済措置です。
↓のような方法を試してもうまくいかなかった最終手段として考えてもらえればと思います。
<a href=https://virtualcast.jp/blog/2019/03/downgrade_unity2018_2/>Unity2018.3から2018.2へのダウングレードで壊れたPrefabをなんとかする方法｜公式ブログ｜バーチャルキャスト[Virtual Cast]</a>

- 新規シーンを作成
- Prefabをすべてシーンに配置
- 右クリック→Unpack PrefabでPrefabとの紐付けを解除
- シーンを保存

<img width="333" alt="スクリーンショット 2019-04-05 19.02.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/87892/d90f9b11-be43-e336-4ea8-c4b2dbaac1f7.png">

- そのままUnity2018.2へダウングレード。
- シーン内の元PrefabたちをそれぞれPrefab化する。

<img width="1680" alt="スクリーンショット 2019-04-05 19.05.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/87892/1ffa1939-412e-2d9b-7747-4df0a97a83fa.png">


おわり。

コンポーネント類とのPrefabの参照はもちろん切れてしまいますが、Prefabを作り直すよりマシかなと思った次第です…。
Unity2018.3のNestedPrefabに苦しんでいる多くの方に届くことを祈っています。

Best Wishes🤞
KuinをGitHubのリポジトリからビルドしてみた

#Kuinをビルドしたい
はてさて、なぜこのようなことになったのか。
Kuinを自前でビルドしたいのである。

理由は単純で、標準ライブラリを自力で追加したいからである。
Live2Dを組み込むため、Cubism3 Nativeを使う。
Cubism3 SDKのラッパークラスを標準ライブラリとしてビルドすることで、プログラミング言語KuinでLive2Dを使いたいのだ。

#なぜCubism3 Nativeなのか
KuinはC++とアセンブラで書かれている。
標準ライブラリの一部はKuinそのもので書かれているが、C++で書かれているものもある。
例えば wnd draw2d MFCへのラッパーか、Direct2Dへのラッパーとなっている気がする。
となれば、同じような構成で作れば、標準ライブラリを追加できるはずだ。

#なにをすべきか
主に、4つの工程に分けられる。

1. Kuinの自前ビルドの確認
2. Cubism3 Nativeの自前ビルドの確認
3. Kuinの自作標準ライブラリの作成
4. KuinにCubism3 Nativeのラッパーである自作標準ライブラリの作成

今回の記事は、1の工程について書き残す。

#事前知識
KuinのVisual Studio用のソリューションは、Visual Studio 2015で作られている。
そのため、Visual Studio 2017でビルドするに当たって、いくつか知っておくべきことがある。

Visual Studio 2017は、C++の開発環境が実質的にはオプションである。
追加でC++関連の色々なものをイントールする必要がある。
必要なものについては後から追加するのでも良い。
適時、ツールの『ツールと機能を取得』を選択し、必要なものをインストールしていただきたい。
![0004.jpg](https://qiita-image-store.s3.amazonaws.com/0/9729/50808a87-104c-1e93-fbdd-22952b97b707.jpeg)

主に、ターゲットプラットフォームをWindows8.1とするためのもの。
またツールセットをv140とするためのものである。

#Kuinのソースコードを取得
難しいことはない。
GitHubのリポジトリから取得するだけだ。
注意点として、masterはバージョンが20180817のようなので、developからダウンロードすることくらいだろう。

Kuin : https://github.com/kuina/Kuin

#プロジェクトの設定
Visual Studio 2017は、Windows10向けのビルド環境であるため、ターゲットプラットフォームがWindows10がデフォルトとなっている。
しかし、KuinのターゲットプラットフォームはWindows8.1である。これはKuinの開発当初の環境がそうであったためと思われる。
そのため、いくつかの設定を行う必要がある。

1. ターゲットプラットフォームの変更
2. プラットフォームツールセットの変更
3. ソリューション構成の変更
4. includeディレクトリのパス追加
5. リンカーの入力の追加の依存ファイルのパス追加
6. ビルド後イベントの追加

色々あるので、標準ライブラリの設定を参考にして変更する必要がある。
注意点として、ビルド後イベントなど、**他の標準ライブラリとファイル名が被らないようにする必要がある**。

![0010.jpg](https://qiita-image-store.s3.amazonaws.com/0/9729/bc5a484b-1927-4819-2d74-41efee59b777.jpeg)

![0014.jpg](https://qiita-image-store.s3.amazonaws.com/0/9729/01e73d69-f09b-4c92-5345-acbdd0d722f0.jpeg)

![0018.jpg](https://qiita-image-store.s3.amazonaws.com/0/9729/993f9932-3bba-0dc8-ad0a-f8948be2f1a7.jpeg)

![0022.jpg](https://qiita-image-store.s3.amazonaws.com/0/9729/a2c07ae0-a599-e406-f13b-5275b37884d2.jpeg)

![0026.jpg](https://qiita-image-store.s3.amazonaws.com/0/9729/effb00f0-9d32-a493-1339-e57f943ee72d.jpeg)

![0030.jpg](https://qiita-image-store.s3.amazonaws.com/0/9729/bdfbc0ba-561b-ca9a-a27b-49173ab514c1.jpeg)

![0040.jpg](https://qiita-image-store.s3.amazonaws.com/0/9729/cc5f9e7b-c8ae-e2e8-639c-f4bc3ddd93c9.jpeg)

![0041.jpg](https://qiita-image-store.s3.amazonaws.com/0/9729/63e09dca-5154-ac0a-2c3f-9cec666ab439.jpeg)

![0049.jpg](https://qiita-image-store.s3.amazonaws.com/0/9729/71f2e7a8-3a35-992e-cecd-b908991facc8.jpeg)

![0050.jpg](https://qiita-image-store.s3.amazonaws.com/0/9729/95749961-e136-a25d-7186-a1873d27da4a.jpeg)

#ビルド
ビルドの順番が決まっているので注意が必要だ。
詳しくはGitHubのリポジトリのREADME.mdに書いてある。

1. Debug
2. Release_dbg
3. Release_rls

#成果物
実際にKuinの環境が生成されていれば成功だ。
現在は20190402だが、リポジトリのdevelopのバージョンは20190417だ。
![0060.jpg](https://qiita-image-store.s3.amazonaws.com/0/9729/5f907ff6-c0d0-7f44-375e-a9909e330c08.jpeg)

この調子で残りの工程もクリアできればLive2Dの組み込みに成功することになる。

- [x] 1. Kuinの自前ビルドの確認
- [ ] 2. Cubism3 Nativeの自前ビルドの確認
- [ ] 3. Kuinの自作標準ライブラリの作成
- [ ] 4. KuinにCubism3 Nativeのラッパーである自作標準ライブラリの作成

以上。
[AWS] MFAの設定（2段階認証）

# AWSでのMFAの設定（2段階認証）

- AWSコンソールへのログイン時に2段階認証を実現させる機能
- 複数の方法で2段階認証を実現可能
  - 仮想デバイス（スマホのアプリ）
  - U2F セキュリティキー
    - など、、、
    - [参考](https://aws.amazon.com/jp/iam/details/mfa/)

## 仮想デバイスでの設定方法

> 今回は仮想デバイスでの設定手順を記述する

### アプリ

- 今回は [`IIJ SmartKey`](https://www.iij.ad.jp/biz/smartkey-m/) を用いるので以下どちらかを端末にインストールする
  - [iOSアプリ](https://itunes.apple.com/jp/app/iij-smartkey/id974476420?mt=8)
  - [Android](https://play.google.com/store/apps/details?id=jp.ad.iij.smartkey2&hl=ja)

### AWS側の設定

> 今回は IAM で作成されたユーザでのログインとする

> ルートユーザでは設定場所が異なる

#### AWS側の手順

1. MFA設定するユーザでコンソールにログインする
2. `IAM` サービスを開く
3. サイドメニューから `ユーザー` を選択
4. 今回MFAを設定するユーザを検索し選択する
5. `認証情報` タブを選択
6. `MFA デバイスの割り当て` の `管理` を押下
7. `仮想 MFA デバイス` を選択し `続行` を押下
8. `QRコードの表示` を押下

#### アプリ側の操作
1. インストールした `SmartKey` を開く
2. 左上の `+` マークを押下
3. AWS側で表示させたQAコードを読み込む
4. 画像や各名前が問題なければ `登録` を押下

#### AWS側の操作
1. `連続する 2 つの MFA コードを以下に入力` にアプリ側で表示されている `6桁` の数字を入力する
   1. 30秒枚に新しいコードに切り替わるので暫くまつ
2. `MFA コード 1` にコードを入力
3. `MFA コード 2` に更新された新しいコードを入力
4. `MFAの割り当て` を押下

## MFA設定後のログイン

- 通常通り `ユーザー名` `パスワード` を入力してログイン
- `MFA認証` でコードの入力を求められるので `SmartKey` を開き表示されている `6桁` のコードを入力する

## 補足

### IIJ SmartKeyの設定

- 設定はQRコードで簡単に別端末へ共有できるので、可能であれば複数端末に共有しバックアップを作成しておく
- 複数端末ない場合はQRコードをプリントアウトするなりして保管しておく
- アプリを開く際に `パスコード` `Touch ID` が設定できるのでアプリのセキュリティ強化の為に設定をオススメする
- `終了する際にロックする` という設定もオススメする
  - アプリがバックグラウンド実行にまわった時にもアプリロックがされるのでよりセキュリティ強化できる
window.location.search（クエリ）を object にする

## まえがき

URL の `?` 以降の文字列（いわゆる `window.location.search` ）（いわゆるクエリ）を JavaScript の object にする。
大体いつも必要になるので、すぐに引っ張ってきて `utils` ディレクトリにでも置いておきたいやつ。


## 🔶 JavaScript

```javascript
function getSearchObj(searchStr) {
  if (!searchStr) return {};
  return searchStr
    .substr(1)
    .split("&")
    .reduce((acc, cur) => {
      acc[cur.split("=")[0]] = cur.split("=")[1];
      return acc;
    }, {});
}
```

## 🔷 TypeScript

```typescript
function getSearchObj(searchStr: string): { [key: string]: string } {
  if (!searchStr) return {};
  return searchStr
    .substr(1)
    .split("&")
    .reduce(
      (acc, cur) => {
        acc[cur.split("=")[0]] = cur.split("=")[1];
        return acc;
      },
      {} as { [key: string]: string }
    );
}
```
制御文字(tab)をgrepしたい

# やりたいこと
制御文字(tab)をgrepしたい

# 方法
grepしてみる
```
grep $'\t' file.txt
```

# その他のコード

| **制御コード** | **意味**                                                   |
| -------------- | ---------------------------------------------------------- |
| \a             | 警告                                                      |
| \b             | バックスペース                                             |
| \t             | 水平タブ                                                 |
| \n             | 改行                                                     |
| \v             | 垂直タブ                                                 |
| \f             | フォームフィード                                         |
| \r             | 復帰                                                   |
インストールされているnpm moduleを確認するために使うコマンドたち


## [npm-ls | npm Documentation](https://docs.npmjs.com/cli/ls.html)


### global に install されてるのなんだっけ

```bash
$ npm ls -g --depth=0
/usr/local/lib
├── npm@6.9.0
└── yarn@1.13.0
``` 

`--depth` の数値をあげてくとその module の依存関係を参照できるけど知りたい人あんまりいなさそうだし使わなさそう

#### JSON でほしい

```bash
$ npm ls -g --depth=0 --json=true
{
  "dependencies": {
    "npm": {
      "version": "6.9.0",
      "from": "npm",
      "resolved": "https://registry.npmjs.org/npm/-/npm-6.9.0.tgz"
    },
    "yarn": {
      "version": "1.13.0",
      "from": "yarn@1.13.0",
      "resolved": "https://registry.npmjs.org/yarn/-/yarn-1.13.0.tgz"
    }
  }
}
```

`package-lock.json` っぽい情報を JSON で表示してくれる


### dev だけ見たい

```bash
$ npm ls --depth=0 --dev
~ ~ ~
├── @babel/core@7.2.2
├── babel-loader@8.0.5
├── webpack@4.29.0
└── webpack-cli@3.2.1
```


### prod だけ見たい

```bash
$ npm ls --depth=0 --prod
~ ~ ~
├── react@16.7.0
└── react-dom@16.7.0
```
iostatコマンドの基本的な使い方

# はじめに

Linuxの **iostatコマンド** に使い方について書いてみました。

# iostatコマンドの説明


iostatコマンドをオプションをつけずに打つと、CPU使用率と、I/Oデバイスの使用状況を表示してくれます。
上部の **avg-cpu：** がCUPの使用率で、下部の **Device：** が、デバイスの使用状況を表しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94029/59417034-9252-b52f-1665-c4a8ccb583f4.png)

ＣＰＵの使用率のみ表示したい場合は、オプションに **c** をつけます。
`iostat -c`

デバイスの使用率のみ表示したい場合は、オプションに **d** をつけます。
`iostat -d`

デバイスの使用量の単位がデフォルトで **kB** の表示になっています。見やすくするため、 **MB** に変更したい場合は、オプションに **m** をつけます。残念ですが、 **GB** で表示するオプションはないようです。
`iostat -dm`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94029/e44cc2c3-0ff0-26cd-8f5b-239e09e4c5bc.png)

デバイスの項目の見方について見ていこう

| 　項目　|   説　明　　　　　　　　　　|
|:------------|--------------------------------------:|
| tps         |  1秒当たりのHDDへのI/Oリクエスト数の平均　|
| MB_read/s   |  1秒当たりのHDDへの読み出し容量の平均 　　|
| MB_wrtn/    |  1秒当たりのHDDへの書き込み容量の平均 　　|
| MB_read     |  HDDへの読み出し容量の総計 　　　　　　　|
| MB_wrtn     |  HDDへの書き込み容量の総計 　　　　　　　|

**MB_read** の容量が大きければ、DBにSelect文が大量に発行されていて、**MD_write** の容量が大きければ、DBにInsert、Update、Delete文が大量に発行されているのだなと判断できる。

	
表示された数字の見方には注意が必要になる。**MB_read/s**だが、この値は、現在リアルタイムでＤＢへのアクセスが発生している数値ではなく、ＯＳが起動してから、現在までの平均値を表示しています。

現在のリアルタイムの**MS_read/s**を見たい場合はこういうコマンドをうつ。リアルタイムな値を１秒間隔で表示してくれます。
`iostat -dm 1`


ちなみにだが、このようにオプションの順番を逆にしても同じ結果を表示してくれます。
`iostat 1 -dm`

２秒間隔で表示したい場合は、オプションに **2** をしてすればＯＫ。これで、２秒間の平均値が表示される事になります。	
`iostat 2 -dm`

ちなみにだが、先頭に表示される１行目だけは、何故だが、平均値が表示されるようになっているので覚えておいて下さい。

**t** オプションを付けると、計測した時間を表示してくれるので、確かに、２秒間隔で表示してくれているねという事が確認できます。
`iostat 2 -dmt`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94029/b2c1ed51-a756-9db0-516c-4b9a22b39a99.png)
さて、 **Device** が３つ表示されています。デバイスの説明です。

|Device | 　　　　　　　　説　明　　　　 　　　　　 　|
|:-------|---------------------------------------:|
| sda　　| １台目の物理ハードディスク（プライマリ）   |
| sdb　　| ２台目の物理ハードディスク（セカンダリ）   |
| loop0　| ループデバイス　　　　　　　　　　　　　   |