OmniAICreator/Qiita-1.07M huggingface dataset:
Udemy 「Unityゲーム開発入門」講座受講ノート　4 - 18 配列の基礎と応用

#18. 配列の基礎と応用

###配列
連続した複数のデータをまとめて扱うことができる。
for文と連携することで、繰り返し処理を強力にする。

###宣言と値の代入

:small_blue_diamond:パターン１
**型名[] 変数名 = new 型名 [要素数];**
配列の[0]に値aを代入する
配列の[1]に値bを代入する
配列の[2]に値cを代入する


```csharp
        int[] xList = new int[3];   //宣言
        xList[0] = 0;               //値を代入
        xList[1] = 2;
        xList[2] = -3;
```

:small_blue_diamond:パターン２
**型名[] 変数名 = new 型名 [要素数]{値a,値b,値c};**



```csharp

       int[] yList = new int[3]{0,2,-3};   //宣言して、値a,b,cを並べて書く
```

###値の取得
配列の[0]の値を取得する
配列の[1]の値を取得する
配列の[2]の値を取得する

```csharp
 
        Debug.Log(xList[0]);             // 取得
        Debug.Log(xList[1]);
        Debug.Log(xList[2]);      
```

###配列の長さの取得

```csharp

       // 配列の長さ取得(要素の数)
        Debug.Log(xList.Length);
```


###for文との連携で、配列の値を取得する

```csharp

        for(int i=0; i<xList.Length; i++)
        {
            Debug.Log(xList[i]);
        }
```
例題：0から30までの数を要素とする配列を作成する。
      値を表示して確認する。



```csharp

        int[] yList = new int[31];
        for (int i = 0; i < yList.Length; i++)
        {
            yList[i] = i;
            Debug.Log(yList[i]);
        }
```


-------------------------------------------------------------------------
##教材
**Udemy Unity ゲーム開発入門：インディーゲームクリエイターが教えるマリオのようなゲームを作成する方法**
https://www.udemy.com/course/studio_shimazu_sideview_action/
〜に限らず

**意味**　～だけでなく（・・・も）

**接続**  
```　　N ＋ に限らず（・・・も）
```     

:anchor: **POINT**　「限る」には**限定**の意味があります 

#### :1234: 例
1. 寿司はアジアに限らず、世界で人気だ。
    Sushi không chỉ giới hạn ở châu Á mà còn nổi tiếng trên toàn thế giới.

![〜に限らず](http://livedoor.blogimg.jp/edewakaru/imgs/b/8/b8778e67-s.jpg)
なぜなぜ分析(問題を改善しよう) まとめ 


##はじめに

9月30日。
社外研修の1ヵ月目の最終日でした。
1ヵ月の学習のまとめとして、作成したアプリケーション(コンソール)を自社の人間に
プレゼンをしました！！

~~上記の設計ですが、新人でも作れる内容な為、なかなかOH！my g・・・的な設計です。~~
~~というか、初投稿が10/08・・・。ままならないですね。~~

プレゼン終了後、上司から今後、上流の工程の仕事をすることもあるから、
今から「なぜ？」その設計なのか、疑問を持って取り組むといいよと
アドバイスをもらいました。

また、

__「なぜなぜ分析を調べてみて！！勉強になるよ」__

と言われ、気になって調べたのでまとめてみます。


##なぜなぜ分析とは？

問題があるとする。
その問題について、「なぜ？」起きたのかを繰り返し問いながら
真因をつきつめていく手段。

トヨタ生産方式を構成する代表的な手段の一つらしい。

また、開発設計を行う担当者は、設計起因の品質問題の早期解決、および再発防止の徹底、未然防止策を開発の初期段階から行うスキルが求められている。。。
そこで、有効なのが「なぜなぜ分析」。(㈱日本能率協会コンサルティング 文献)

##ネガティブなケースの利用場面だけではない。
問題が起きた際の原因分析などマイナス方面での利用を取り上げられることが多いが、
それ以外にも下記のような用途がある。

・商品改良のための「なぜなぜ分析」
・設計品質向上の仕組みづくり

##分析方法
1.課題を決める
2.課題に対して、「なぜ？」を行い、回答を出す
3.回答に対して、「なぜ？」を行い、回答を出す
4.2,3の手順を繰り返し、真の要因を見つける。
![nazenaze.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362189/6cfc542e-1459-aae7-b56b-69862d80a8d3.png)


__※「なぜ？」を繰り返しすぎると「クライアントが悪い」など対策を打てない真因に結びつくことがある。__
分析の狙いとして、改善や再発防止を導くことを念頭に進めること。
回数は、「なぜ？」（質問）を5回繰りかえす「なぜなぜ5回」が有名。(トヨタが実施)

###ポイント
__1. 「なぜ？」（質問）と回答の記述は、あいまいにしない__
あいまいな表現だと「なぜ？」を繰り返す際に意味が変容する可能性がある
例)「品質の悪さ」が課題として、最初は仕様書の誤りを指していたのが、プログラムのバグを
　　指すようになってしまったりする

__2. 「なぜ？」（質問）や回答はシンプルに__
1つの回答には1つの課題（事象）
多くのことが、回答に含まれているということは、分析が充分ではない

__3. 「なぜ？」（質問）がでないときは前の回答を見直す__
「なぜ？」（質問）を繰り返していく際に、質問が続かなくなった場合、
　直前の回答が適切ではない可能性がある

__4. 仮説と誘導は別物__
過去の類似事例をもとに仮設や類推を具体的に行うのは有効
ただし、結論を決めつけて回答してしまう可能性があることを認識し注意する

__5. なぜなぜを打ち切る際の目安__
以下のような状態になった場合は打ち切る
・立場、観点を変えても「なぜ？」（質問）がでてこない
・対称性を使って考えても「なぜ？」（質問）がでてこない
・回答に言い訳や推測がでてきた


#参考
■ 独立行政法人情報処理機構(IPA), 情報処理システム高信頼化教訓作成ガイドブック(ITサービス編), 2016, 閲覧日 2019-09-30, https://www.ipa.go.jp/files/000051042.pdf (PDF).

■日本化学技術連盟, ソフトウェアへのなぜなぜ5回の適用 ～真の原因を求めて～, 2007, 閲覧日
2019-09-30, https://www.juse.or.jp/sqip/workshop/report/attachs/2007/2_report.pdf (PDF).
■ 株式会社日本能率協会コンサルティング, 開発部門向けなぜなぜ分析スキル向上, 2013, 閲覧日 2019-09-30,https://www.jmac.co.jp/_images/service/consulting/pdf/177.pdf?n=1291255469 (PDF).





#終わりに
こういったマネジメント系というのでしょうか、手法は色々とあると思うので、
知見を広げていきたいです。

また、実際に業務の中で自然に使えるように積極的に利用するよう、
心がけたいと思います。

皆さんが有効活用してる方法等あれば教えて頂けると幸いです。

最後に誤記等あればご指摘いただけると幸いです。
PowerShell 2行でメール送信 (SMTP認証)

## 前置き
メール通知の設定値もらったけど実際これ使えんの？って確認を簡単にやりたかった。
そしたらPowerShellを使えば簡単にできるよってヒントをもらったのでやってみた。

## 早速実行
### 1. 認証情報の入力
今回SMTPサーバに認証が必要だったので、認証情報を先に指定する。
あとで使用するメール送信コマンドで使えるのが、PSCredentialオブジェクトとかなんとからしいので`Get-Credential`を使う。

```
PS C:\> $Credentials = Get-Credential
コマンド パイプライン位置 1 のコマンドレット Get-Credential
次のパラメーターに値を指定してください:
Credential
```

これを実行するとなんか入力できそうなウィンドウが出てくるので、認証情報をいれてみる。

### 2. メール送信
メール送信には、`Send-MailMessage`を使う

```
PS C:\> Send-MailMessage -To (自分メールアドレス) -Subject test -From test@test.jp -SmtpServer (SMTPサーバ) -Port (ポート番号) -Credential $Credentials
```

今回は、本文無しのメールを送信した。

* `-To` - 送信したいメールアドレスを指定
* `-Subject` - メールの件名を入力
* `-From` - 差出人メールアドレス(ここは何でもいい)
* `SmtpServer` - SMTPサーバを指定
* `Port` - ポート番号を指定
* `Credential` - 認証情報(さっき作ったやつ)

本文を入力したいときは`-Body`と`-Encoding`でUTF-8を指定するといいかも。
でも普通にUTF-8を指定するとエラーになるので、`([System.Text.Encoding]::UTF8)`を指定する。

あとは自分のメールボックスをみて確認するだけ。これは便利。

## ちなみに
相手方(今回はSMTPサーバ)のポートが空いてるか確認したくなったらこれを使うと良い。

```
Test-NetConnection (SMTPサーバ) -port (ポート番号)
```

これまた便利。
gitでcloneときに使用するSSHキーを指定する方法

## 結論
一発

```
$ ssh-agent $(ssh-add 秘密鍵のパス; git clone リモートリポジトリ)
```

## 参照
[How to specify the private SSH-key to use when executing shell command on Git?](https://stackoverflow.com/questions/4565700/how-to-specify-the-private-ssh-key-to-use-when-executing-shell-command-on-git)
next.jsでフォントの読み込みがおかしい時の処方箋

node.jsでnpmパッケージとかのフォントファイルを読み込んでくれない(´・ω・`；)
そんなときの処方箋メモ。

ディレクトリ構成は以下がベースです。
[With Firebase Hosting and Typescript example](https://github.com/zeit/next.js/tree/canary/examples/with-firebase-hosting-and-typescript)

# 1. `static`フォルダにフォントファイルだけ手動設置
* dev環境の場合は`/src/app/static`に設置
* serve & deploy環境は`/src/public/static`に設置するか、`package.json`(一部抜粋)を以下のように調整
    * dev環境の`static`フォルダと共通じゃないので泣く泣く重複設置。他にいい方法あったら教えてください(´・ω・`；)

```json:package.json
{
  "scripts": {
-    "build-public": "cpx \"src/public/**/*.*\" \"dist/public\" -C",
+    "static-to-public": "cpx \"src/app/static/**/*.*\" \"src/public/static\" -C",
+    "build-public": "npm run static-to-public && cpx \"src/public/**/*.*\" \"dist/public\" -C",
  },
}
```

# 2. フォントファイルの読み込み部分をコピペ＆調整(ファイルパスをフォントファイルを設置したパスに変更)して、適当な部分で`import`。

以下、importサンプル。

```css:sample.css
@font-face {
  font-family: 'sample';
  src: url("/static/fonts/sample/sample.eot") format("embedded-opentype"),
  font-weight: normal;
  font-style: normal;
}
```
```js:sample.js
import "./sample.css"
```
指定したPathのファイルのみStashする方法

# 指定したPathのファイルのみStashする方法

検索してもヒットしなかったので、gitのhelpで見つけました。

```bash
git stash push -m "message" -- filepath/to/stash
```

今回のこのやり方はこのコマンドの出力結果から確認できます。

```bash
git stash --help
```

```
... 

git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
             [-u|--include-untracked] [-a|--all] [-m|--message <message>]
             [--] [<pathspec>...]]
...

       push [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [-m|--message <message>] [--]
       [<pathspec>...]
           Save your local modifications to a new stash entry and roll them back to HEAD (in the working tree and in the index). The
           <message> part is optional and gives the description along with the stashed state.

           For quickly making a snapshot, you can omit "push". In this mode, non-option arguments are not allowed to prevent a misspelled
           subcommand from making an unwanted stash entry. The two exceptions to this are stash -p which acts as alias for stash push -p and
           pathspecs, which are allowed after a double hyphen -- for disambiguation.

           When pathspec is given to git stash push, the new stash entry records the modified states only for the files that match the
           pathspec. The index entries and working tree files are then rolled back to the state in HEAD only for these files, too, leaving
           files that do not match the pathspec intact.

           If the --keep-index option is used, all changes already added to the index are left intact.

           If the --include-untracked option is used, all untracked files are also stashed and then cleaned up with git clean, leaving the
           working directory in a very clean state. If the --all option is used instead then the ignored files are stashed and cleaned in
           addition to the untracked files.

           With --patch, you can interactively select hunks from the diff between HEAD and the working tree to be stashed. The stash entry
           is constructed such that its index state is the same as the index state of your repository, and its worktree contains only the
           changes you selected interactively. The selected changes are then rolled back from your worktree. See the "Interactive Mode"
           section of git-add(1) to learn how to operate the --patch mode.

           The --patch option implies --keep-index. You can use --no-keep-index to override this.
...
```

以前は

```bash
git stash save -m "message" -- filepath/to/stash
```

で出来たような気がしましたが、仕様が変わってしまったのでしょうか。

**追記(2019/10/08)**

コメントをいただき、 `git stash save` はdeprecatedになっているそうです。

```
       save [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]
           This option is deprecated in favour of git stash push. It differs from "stash push" in that it cannot take pathspecs, and any
           non-option arguments form the message.
```
タグVLANにおけるサーバ側のbonding設定

## はじめに
ネットワーク構築において欠かせないのがVLANという技術だが、VLANの種類によってサーバ側のbonding設定方法も変わってくる。
今回はタグVLAN方式におけるサーバ側のbonding設定方法をメモに残しておく。
タグVLANについては下記のリンクがわかりやすかったので、目を通して見るといいかもしれない。
https://qiita.com/RyomaTaniyama/items/3dcb86f21f16f0e5c423
(スイッチ側の設定はこの記事では割愛する)


### 環境
CentOS7.6


## 手順
ネットワークファイルをいくつかいじる


#### /etc/sysconfig/network

```:network
GATEWAY={default_gateway}
NETWORKING=yes
VLAN=yes
VLAN_NAME_TYPE=DEV_PLUS_VID_NO_PAD
```


#### /etc/sysconfig/network-scripts/ifcfg-bond0
modeについては下記にまとめられてます。
http://tagutagu.com/?p=946

```:ifcfg-bond0
NAME="bond0"
DEVICE="bond0"
ONBOOT=yes
NETBOOT=yes
BONDING_OPTS="mode=4 miimon=100"
TYPE=Bond
```


#### /etc/sysconfig/network-scripts/ifcfg-bond0.{back_vlanid}
{back_vlanid}にはbackネットワークのvlanidをつける

```:ifcfg-bond0.{back_vlanid}
DEVICE=bond0.{back_vlanid}
BOOTPROTO=none
ONBOOT=yes
IPADDR={{ back_ip }}
NETMASK=255.255.255.0
```


#### /etc/sysconfig/network-scripts/ifcfg-bond0.{front_vlanid}
{front_vlanid}にはフロントネットワークのvlanidをつける

```:ifcfg-bond0.{front_vlanid}
DEVICE=bond0.{front_vlanid}
BOOTPROTO=none
ONBOOT=yes
IPADDR={{ front_ip }}
NETMASK=255.255.255.0
```


#### /etc/sysconfig/network-scripts/ifcfg-eno1
使用するインターフェース全てに設定する
※ **eno1**は筐体の機種によって名前が異なるので注意

```:eno1
NAME="eno1"
DEVICE="eno1"
TYPE=Ethernet
ONBOOT=yes
NETBOOT=yes
SLAVE=yes
MASTER="bond0"
```


#### /etc/sysconfig/network-scripts/route-bond0.{back_vlanid}
ルーティングを設定する。
サブネットの範囲はお好みで。

```:route-bond0.{back_vlanid}
192.168.0.0/16 via {back_gateway} dev bond0.{back_vlanid}
172.29.0.0/16 via {back_gateway} dev bond0.{back_vlanid}
10.0.0.0/8 via {back_gateway} dev bond0.{back_vlanid}
```


#### ネットワークのrestart
```
systemctl restart network
```


backとfrontの確認をして繋がれば終わり
今日学んだ基本情報の勉強内容(4)　～過去問編～

##過去問で分からなかったことをメモ程度に
- 疎結合マルチプロセッサシステムは複数のCPUごとにOSと主記憶が独立して存在し、密結合マルチプロセッサシステムは複数のCPUが単一のOSと主記憶を共有するという違いがある。

- 定格出力電力はある条件下で機器類が安全に動作することができる最大出力

- 埋め込みSQLは表データを直接扱えないような手続き型プログラミング言語に関係データベースを操作するためのSQLを埋め込む手法。
- システムダウン時のデータベース回復処理時間の短縮のために主記憶上の更新データを定期的にディスクに書きだすことを<font color="Red">チェックポイント</font>といい、ディスク障害からデータベースを復旧するためにデータベースの内容をディスク単位で複写したものを<font color="Red">バックアップ</font>という。またデータの更新前後の値を書き出してデータベースの更新記録をとったものを<font color="Red">ログファイル</font>という。
- 共通鍵暗号方式は公開鍵暗号方式に比べて暗号化と復号化の計算量が少ない。　→これは初めて知った
- リスクアセスメントは<font color="Red">リスクの特定</font>、<font color="Red">リスクの分析</font>、<font color="Red">リスクの評価</font>を表す。
- パスワードリスト攻撃は複数のサイトで同じようなパスワードを使っていることを利用して、あるサイトに対する攻撃で得られたIDとパスワードのリストを用いて別のサイトにログインしようとすること。
- モジュール結合度において結合度が弱いものから挙げていくと、データ結合、スタンプ結合、制御結合、外部結合、共通結合、内容結合
- <font color="Red">コンカレントエンジニアリング</font>はソフトウェア開発サイクルに伴い発生する作業を同時並行で行うこと。<font color="Red">フォワードエンジニアリング</font>はリバースエンジニアリングによってでた仕様に新規ソフトウェア用の変更などを加えて作成する手法
- <font color="Red">エスクローサービス</font>は電子商取引において商品の発送などを仲介するサービス

###参考　
- [基本情報技術者ドットコム　過去問道場](https://www.fe-siken.com/fekakomon.php)
Windonsにて、半角/全角切り替えをMacのように行う

※JISキーボードを想定しています。

Macでは、「スペース」キーの両サイドにある「英数」キーおよび「かな」キーで半角/全角の切り替えを行う。

一方、Windowsでは、「半角/全角」キーで半角/全角の切り替えを行い、「スペース」キーの両サイドには、「無変換」キーおよび「変換」キーが存在している。

もともとMacを利用していたが、今回Windowsを利用することになってしまったので、WindowsのキーボードでMacのように「無変換」キーおよび「変換」キーで、半角/全角切り替えを行えるようにする。

利用しているWindowsのバージョンはWindows 10。

## IMEの設定変更

キーの割り当て変更は、IMEの設定変更からできる。

### 設定画面

IMEアイコンをクリックし、「プロパティ」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151059/a130ca40-0ff1-f81d-8b75-a5640384a922.png)

「詳細設定」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151059/d55bcc2d-e51b-9703-2c7b-24e4000fa217.png)

### 詳細設定画面

「編集操作」欄の「キー設定(Y)」: 「変更」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151059/b95e386b-6774-c710-b8b2-95920367dbbb.png)

### キー設定画面

#### 無変換キー

キーが「無変換」となっている行の欄「入力/変換済み文字なし」を選択し、「変更」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151059/dfc1d9cd-9a9c-55bb-9c5c-37f0c119c64f.png)

機能選択ダイアログが出てくるので、「IME-オフ」を選択し、「OK」ボタンをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151059/49c1121c-10a3-d76c-cb2e-1f3308bbd594.png)

#### 変換キー

「無変換」キーと同様に、キー設定画面でキーが「変換」となっている行の欄を選択し、「変更」をクリック。

機能選択ダイアログが出てくるので、「IME-オン」を選択し、「OK」ボタンをクリック。

done.
AWS Configを有効にしても一部のリソースしか表示されない

# はじめに
AWS Configを全てのリソースを対象にしたのに、EC2やRDSの一部のリソース(13個くらい)しかリソースの合計に表示されなかった。

# 結論
待っていれば時間が解決してくれる。
設定中等の内容が画面に表示されないため、何か追加で設定が必要かと思い、いろいろ検索してしまった。
2,3時間くらい？経ってからみると全てのリソースが表示された。

# 最後に
時間が掛かること事前に知りたかった。。。
無駄な時間を使いました。。。
サーバサイド初心者がGoのPackageとimportを個人的に理解しようとした話

Packageってなに？？？

The Tour of Goでいきなり出てくるねんけどなにこれ、てか、Cみてーだなこれ。

ってなったので、メモがわりに。。。

# golangってなに？！
@soichiro331 さんの記事によると

Golangが作られた背景は
> ・動的型付け言語のプログラミング容易性、静的型付け言語の安全性・効率的なコンパイルを一つの言語で享受したい。
・マルチコアプロセッサを生かした優れた非同期処理による実行効率を目指した。
・本当に開発者が必要だと思う機能のみを提供するように、言語仕様をリッチにしないことにより、開発者の迷いを無くし、生産性の高い開発をサポートしたい。

っていう三つらしい。ほう。なるほど。わからん。

ようするにCとかC++は今のマルチコア環境に適応しきった言語ではなく、動的な型付けの便利さを残しつつ、静的言語の安全性、効率性を残したスーパーC言語を作ろうぜ的な？

そんな感じか。ほうほう。

もともとSwift書いてる身からすると、めちゃくちゃ読みやすいなってなった。

```Go:TourofGo
package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello, World")
}
```

ふむふむ。Packageからなんかしてるのかなー。 Importでfmtのライブラリだったりを呼び出してるのかなー

func()ふむふむいつも通りのやつね。

fmtはなんかちゃうなこれがライブラリみたいな感じで書いてるんかな。おう？

ってなったからPackageとfmtについて調べてみた。

# Packageとは
Packageは割とクラスと同じと思ってる。インスタンス化が常にされてるクラス的なサムシング。

要するに

```Go
package main

import (
     "fmt"
)

func numberPrint() {
}

var number int
```

とかっていうこう言うプロパティやらインスタンスを他のimport(継承）したところでも使えますよっていう認識をしてる。詳しいところだとちょっと違うんだろなぁって思いつつもここからどう展開したらいいかわからんから一旦こういう認識をしとく。


# importとは
他のパッケージを読み込む時に使う。継承の認識をしてる。
 
さっき作ったnumberPrint()メソッドとかを他の画面で読み込む時に

```Go
package otherPkg

import (
    "fmt"
    "main"
)

func otherFunc(){
     main.numberPrint()
}

```

ってできるようになるよっていうことだと言うことがわかった。

## 細かいimportの挙動
実際にimportするときは、

```Go
import (
     "fmt"
     "main"
)
```

ってまとめれる。これを、Factored Import Statementって呼ぶらしく、Swiftみたく

```Go
import "fmt"
import "main"
```
ってできるらしい。けど、理想的な書き方は上のほうらしい。

あと疑問なのが、import時にファイルパスの末端を参照するって言う規約（？）なのに、なぜ
`import"math"`ではrandは参照されず、'import"math/rand"'っていうパス指定をしないといけないのかがわからない。。。

## 標準搭載のpackage

[golang.jp参照](http://golang.jp/pkg)
使い勝手の良さそうなpkgとか一応頭入れとこうと思ったpkgとか

|package名(ファイルパス）|package用途|
|:------------------:|:------------------:|
|ローカル系|
|zip|zip形式のファイルの読み書きを行うためのパッケージ|
|bufio|I/Oのバッファリング機能を提供します。|
|hex|16bitエンコードとデコード|
|base64|base64エンコードあるやんけ！|
|exec|外部コマンドの実行|
|fmt|formatのfmtかwwww　I/Oを使うやつか。printfとか|
|サーバ系|
|http|これめっちゃ使うんやろなー|
|html|これもめちゃ使うんやろなー|
|image/jpeg|jpeg型のimageライブラリを一時的に生成する|
|image/png|png型のimageライブラリを一時的に生成する|
|データ系|
|json|jsonへのエンコード、デコード|
|net|TCP/IP、UDP、ドメイン名解決、UNIXドメインソケットを含むUnixネットワークソケットへのポータブルインタフェースを提供します。（わけわかめ）|
|sort|配列やユーザ定義のコレクションをソートするためのあれやこれ|
|strconv|String to Data cast的な？！|
|strings|文字列操作のための
|sync|相互排他ロックってことは標準搭載のreactive的なサムシング？|
|utf16|utf16シーケンスのエンコード|
|websocket|websocketプロトコルのサーバ実装|
|xml|XML1.0のパーサー|

# 参考
[初めてのGo言語　Packageについて](http://cuto.unirita.co.jp/gostudy/post/go-package/)
@availableの落とし穴

最近Sign in with appleを対応する時、iOS 13+以上しか使えないObjective-C API「ASAuthorizationAppleController」などを利用します。
古いiOSバージョンを判別するため、下記のようなコードを書きました。

```
if (@available(iOS 13.0, *)) {
  // iOS 13以上のAPIを使う
  ...
}
```

ざっくり見ると、@available条件でiOS 13以上であれば、if文内の処理を行うという認識ですが、実際はそうではないようです。
iOS10からiOS12までのシミュレータで試しました。全てif文の内の処理に行って、ASAuthorizationAppleController APIの所でクラッシュしてしまいました。

どうやら、if (@available）はruntimeで判別することではないようで、コンパイルする時点でマクロのような条件分岐はすでに決まってます。しかしマクロであれば、なぜ直接に#if文で書かないですか？理解にちょっと苦しい。。。
仕方ないので、runtimeでバージョン判別コードを入れました

```
if (@available(iOS 13.0, *)) {
  if ([UIDevice currentDevice].systemVersion.floatValue >= 13.0) {
    // iOS 13以上のAPIを使う
    ...
  }
}
```

一応iOS13以下の古いバージョンで問題なく動けます。
Xcode11, iOS13のSimulatorで課金アイテムが表示されない場合は焦らずに再起動しましょう

Xcode11, iOS13のSimulatorで以下のようなエラーが出て課金アイテムが表示されない場合は焦らずに再起動しましょう

```
Error: Optional(Error Domain=ASDErrorDomain Code=507 "Error decoding object" UserInfo={NSLocalizedDescription=Error decoding object, NSLocalizedFailureReason=Attempted to decode store response})
```

XcodeとSimulatorを再起動すればOKです。


以下、参照
> ios13 - Requesting an In App Purchase in iOS 13 fails - Stack Overflow
https://stackoverflow.com/questions/58020258/requesting-an-in-app-purchase-in-ios-13-fails
楽しい基数変換

こんにちは。
今回は基数変換を書くことにしました。
意外と使われていないのかわからないですが、自分はたまに使うのでメモとして残しておきます。

#考え方。
まず10進数で考えてみましょう。
1を次の桁に送るときは10進数なら10をかけますね。
そうすると1->10になりますね。簡単簡単。
では、N進数ならどうでしょう。同じ要領で。
1を次の桁に送るときはN進数ならNをかけますね。
そうすると1->10(N進数)になりますね。
基本的にはこれだけ。

逆もあります。
10の2桁目を下の桁に移動したい時は、10を割りますね。
そうすると10->1になりますね。
同じ要領で。
10(N進数)の2桁目を下の桁に移動したい時は、Nを割りますね。
そうすると10(N進数)->1になりますね。

#大事な事
例えば。
4進数の10では自然数で4であるのに対して、
5進数の10では自然数で5であるのです。

見た目は同じですが、内容量は変わっています。
気をつけましょう。

#何に使うか
ゲームなんかではスコアを表示するときに各桁の数字が欲しいときがあるのですが、そういうときにも使えます。
私は数学が**赤点**だったので数学的な意味は知りませんが、たまたま使う機会があったので作りました。


#コード全容
```C++:基数変換全容
#include <iostream>
#include <deque>
#include <cstdint>
#include <string>

typedef std::deque<std::uintmax_t> DType;


DType MakeRadix(std::uintmax_t N,const std::uintmax_t& R) {
	DType D;
	
	if (N == 0) {
		D.push_front(0);
		return D;
	}

	while (N != 0) {
		D.push_front(N % R);
		N /= R;
	}
	
	return D;
}

std::uintmax_t MakeNumber(const DType& D, const std::uintmax_t R) {
	std::uintmax_t V = 0;

	if (D.size() == 0) { return 0; }

	for (std::size_t i = 0; i <D.size() ; i++) {
		V *= R;
		V += D[i];
	}
	return V;

}

int main() {

	std::uintmax_t N = 100;
	std::string Ch = "0123456789";
	DType D = MakeRadix(N, Ch.size());
	for (auto& o : D) {
		std::cout << Ch[o];//show each character.
	}
	std::cout << std::endl;
	std::uintmax_t V = MakeNumber(D, Ch.size());
	std::cout << V << std::endl;

	return 0;
}

```
HSMM(隠れセミマルコフモデル）って何？

#この記事では
HMM（隠れマルコフモデル）の変種であるHSMM（隠れセミマルコフモデル）について簡単にその概要と利点についてまとめてあります。

##そもそもHMMとはという方に
この記事がわかりやすいです。
https://www.kabuku.co.jp/developers/hmm
簡単にいうと確率的に遷移する隠れ状態を持ち、その状態における確率分布に従って出力を行うオートマトンといったところでしょうか。

##HSMMとは
$ $
ではHMMとHSMMの違いはなんなのでしょうか。
その違いは「状態継続長」にあります。
時間tにおけるオートマトンの隠れ状態を$z_t$とおきましょう。
HMMでは、次の隠れ状態は$z_t$にのみ依存し、時間t+1で遷移確率に従って$z_{t+1}$に遷移します。
しかしながら、HSMMでは次の隠れ状態は$z_t$と$z_t$で消費する時間$t_s$に依存します。
時間$t$~$t+t_s$の間隠れ状態は$z_t$に留まり続け、時間$t+t_s$になると$z_{t+t_s}$に遷移し、それと同時に$z_{t+t_s}$で消費される時間$t_{s'}$が決定します。
この$t_s$,$t_{s'}$は状態継続長と呼ばれ、HSMMを特徴づける重要な要素です。

なのでパラメータ集合もHMMとHSMMでは異なり、
HMMのパラメータ集合が
$$\(a_{ij},b_{i},\pi_i\)$$
$a_{ij}$が状態の遷移確率、$b_{i}$が記号の出力確率、$\pi_i$が初期状態の確率であるのに対して、
HSMMのパラメータ集合は
$$\(a_{ij},b_{i},\pi_i\,p_{i})$$
$a_{ij}$が状態の遷移確率、$b_{i}$が記号の出力確率、$\pi_i$が初期状態の確率、そして$p_i$が状態iごとの消費時間(duration)の確率分布となります。
この確率分布$p_i$は一様分布であったり正規分布であったり色々変えていいようです。

##HSMMの利点
探した中では京大の論文(http://sap.ist.i.kyoto-u.ac.jp/members/yoshii/papers/ipsjnc-2016-maruo.pdf) がわかりやすくまとめられていて良かったです。
この論文は音楽のコード認識に関する論文なのですが、HMMの問題点として、同一の状態にとどまり続けると単調にその確率が減少していってしまうことが挙げられています。
すごい直感的な説明をすると、ある日やってきたセールスを断ったとして次の日もそのセールスマンがやってくる確率は10回に1回もないと思われますが、
4日連続そのセールスマンがやって来たとすると、そんなやばい奴どうせ次の日もやって来るに決まってるのでそのセールスマンが4日連続来る確率と5日連続来る確率はほぼ変わらないと思われます。
HMMはそのような事象に対応できないので$\frac{1}{10}$を乗算し続けてしまいますが、HSMMは確率分布を用意することによってその事象を再現することが可能となります。
そういう点もあって、speech recognitionやimage recognitionに使われて来たという歴史があるようです。

こちらの論文に他の利点や応用例がまとまっているようなのですが、かなり長いのでほぼ読めていないです。
これから読むことがあればまとめようと思います。
https://www.sciencedirect.com/science/article/pii/S0004370209001416

## 最後に
もともとLearning Neural Templates for Text Generationという論文 
(https://arxiv.org/abs/1808.10122) を読む過程でHSMMを調べたのですが、まとまった記事が全く出てこなかったので書きました。
ただこの論文ではdurationの確率分布が一様分布なので長さに対応した確率分布が欲しいわけではなさそうですね。なんでHSMMにしたんだろう。
Convert UTC to JST with Carbon

https://play.golang.org/p/LMaAy1RaIFQ

```
package main

import (
	"fmt"
	"time"

	"github.com/uniplaces/carbon"
)

func main() {
	tokyo := "Asia/Tokyo"
	// Parse date time from string
	startAt, _ := time.Parse("2006-01-02T15:04:05Z", "2019-10-07T06:54:08Z")
	endAt, _ := time.Parse("2006-01-02T15:04:05Z", "2019-10-07T06:54:08Z")
	// UTC to JST
	location, _ := time.LoadLocation("Asia/Tokyo")
	startAt = startAt.In(location)
	endAt = endAt.In(location)
	fmt.Println(startAt, endAt)
	// Convert to date range
	start, _ := carbon.CreateFromDate(startAt.Year(), startAt.Month(), startAt.Day(), tokyo)
	end, _ := carbon.CreateFromDate(endAt.Year(), endAt.Month(), endAt.Day(), tokyo)
	fmt.Println(start.StartOfDay(), end.AddDay().StartOfDay())
	// Convert to UTC date range
	fmt.Println(start.StartOfDay().In(time.UTC).String(), end.EndOfDay().In(time.UTC).String())

}

```
【Node.js】指定したディレクトリ以下のファイル群をコピーする

# 指定したディレクトリ以下のファイルをコピーする

指定したでディレクトリ配下のファイルをコピーし、
コピー先にファイルがない場合にのみ出力を行うモジュールが
必要であったため自作したものを備忘録としてあげておきます。

また、取得する関数の紹介ばかりで、
<b>同期処理など含めておらず実用的でない</b>記事が多かったため、
この記事を書きました。

## 記事を読むために
- node npm の環境構築が可能
- ES6 が理解できる
- async await （同期処理/非同期処理）を理解できる

## コード
まずfsモジュールの<b>readdirSync()</b>を用いて該当ディレクトリ配下にある、
ディレクトリ、またはファイル名を取得する処理を書いていきます。
<b>readdir()：</b>非同期処理
<b>readdirSync()： </b>同期処理
これらを用いることで引数に渡したディレクトリ配下の
ディレクトリ名やファイル名を取得することができます。

関数の処理が非同期であると戻り値が担保されないため、
async awaitとthen()を利用します。

```js
import fs from 'fs'

const getFileNameList = async (originFilePath) => {
  // fileListがreturnされるまで待機
  return await fs.readdirSync(originFilePath, (err, fileList) => {
     if (err) throw err
     return fileList
  })
}
```

次にfsモジュールの<b>copyFileSync()</b>を利用し、
取得したファイル群を指定したディレクトリ配下にコピーしていきます。

```js
import fs from 'fs'
import path from 'path'

const copyFilesToDir = (originDir, copyDir) => {
  getFileNameList(path.resolve(originDir) + '/')
  .then(list => { // 処理完了後に処理を実行し戻り値を担保
    const fileNameList = list.slice()
    fileNameList.forEach((fileName) => {
      try {
        // fs.constants.COPYFILE_EXCLをオプションに設定
        // コピー先に同名ファイルが存在した場合に例外を出す
        // 指定しない場合は上書き
        fs.copyFileSync(
          path.resolve(originDir + fileName), 
          path.resolve(copyDir + fileName),
          fs.constants.COPYFILE_EXCL,
        )
        console.log('copied:' + path.resolve(originDir + fileName))
      } catch(err) {
        // ファイルがすでに存在する場合 EEXIST
        // ディレクトリが存在しない場合 ENOENT
        console.log(err)
      }
    })
  })
}

```

汎用的にしたつもりですので、
カスタムなどして利用してみてもいいかもしれません。
コンボの中身から一項目だけ削除したい

```
 LendPaterns = _NameService.GetCodeName(NameSegmentCode.lend_patern);
           　　 var yyy = LendPaterns.Where(x => x.Code == ((int)Const.LendPatern.xxx).ToString()).SingleOrDefault();
            　　LendPaterns.Remove(yyy);
```

GetCodeNameで取ってきた値（コンボ）の中からxxxだけ削除したい

```
(int)Const.LendPatern.xxx).ToString()).SingleOrDefault()
```
xxxはConstの中で数字として値を持っている（xxx = 2 とか）
(int)を書かなかったらxxxという名称が取れてきてしまうから名称ではなくて2をとってきたい。
(int)を書くことによって数字をとることが出来る。

今回は1件だけ値が取れてくるからSingleOrDefault()を忘れずに書いて型を決める。
※型がList<>の場合は必要ない。
dockerでkotlinをcliでコンパイル、javaで実行できる環境をつくった

はじめてkotlinを勉強しようと思ったのですが、macにkotlinコンパイラをいれるのも少し嫌だったので、docker composeで一式つくりました。
ビルドツールを使用することは想定しておらず、kotlinの簡単な文法を動かしながら確認できる環境を用意するというコンセプトのもと作成してます。
必要な方は参考にしてみてください。

# できたもの

./docker-compose.yml

```yml
version: "3.7"

services: 
  java:
    build: ./docker/java
    tty: true
    volumes:
      - ./src:/usr/local/src
```

./docker/java/Dockerfile

```dockerfile
FROM openjdk:13-slim

RUN apt-get update && apt-get install -y git \
    unzip \
    zip \
    curl \
    vim
    
WORKDIR /usr/local/src
RUN curl -s https://get.sdkman.io | bash 
RUN /bin/bash -l -c "chmod a+x $HOME/.sdkman/bin/sdkman-init.sh;$HOME/.sdkman/bin/sdkman-init.sh;sdk install kotlin"

CMD ["/bin/bash"]
```

ディレクトリ構成は以下のようになってます

```console
.
├── docker
│   └── java
│       └── Dockerfile
├── docker-compose.yml
└── src
    └── test.kt
```

# つかいかた

## 下準備
docker-compose.ymlを配置したディレクトリで、以下のコマンドを実行するのみです。

```console
$ docker-compose build
$ docker-compose up
```

## うごかす
実際に、`test.kt`をコンパイルして、`java`コマンドで実行します。
コンパイルする対象は`./src/test.kt`です。

```kotlin
fun main(args: Array<String>) {
    println("Hello, World!")
}
```

コンテナに入って、コンパイルして、実行します。

```console
$ docker-compose exec java bash
root@3b62768acd0b:/usr/local/src# kotlinc test.kt -include-runtime -d test.jar
OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release.
root@3b62768acd0b:/usr/local/src# java -jar test.jar
Hello, World!
root@3b62768acd0b:/usr/local/src#
```

`-Xverify:none`は駄目だというwarningがでてしまいますが、コンパイルができて、javaコマンドで実行することができました。

さらに、`/usr/local/src`をボリュームマウントしてますので、コンパイル後にできたjarファイルは、ホストマシンのファイルシステムでも確認可能です。

```console
.
├── docker
│   └── java
│       └── Dockerfile
├── docker-compose.yml
└── src
    ├── test.jar
    └── test.kt
```

# さいごに
これから勉強を進めていく中で、ビルドツール使いたくなったり、いろいろ不都合がでてくるかもしれませんが、一旦環境が整ったということで、どんどん勉強していきたいです！
Nuxt.jsで未利用のVueコンポーネントを探すシェルスクリプト

最近Nuxt.jsで[Webアプリ](https://tsundoku.site)を作ってるけど、
度重なる改修でVueコンポーネントが乱立。。

使ってないのもたくさんありそうなので、調べるスクリプトを作ってみた。

### スクリプトはこんな感じ

```sh
#!/bin/bash

# vueコンポーネントの一覧を取得
FILES=`find components -name "*.vue"`
for i in $FILES; do
  #  全体からコンポーネントをインクルードしている行の数を取得
  NUM=`grep -r "$i" * | wc -l | sed -e "s:[^0-9]*::g"`

  # ファイル名と見つけた件数を表示
  echo "** ${NUM}: ${i}"

  # grepした結果を表示(確認用)
  grep -r "$i" * 
  echo ""
done
```

こんな感じで出力されるので、`** 0:`で始まるコンポーネントを削除していけばOK。

```text
** 1: components/Hero.vue
pages/index.vue:import Hero from "~/components/Hero.vue";

** 0: components/OgpUserStock.vue

** 0: components/Card.vue

** 3: components/atom/TotalNumBooks.vue
pages/clip/_uid.vue:import TotalNumBooks from "~/components/atom/TotalNumBooks.vue";
pages/read/_uid.vue:import TotalNumBooks from "~/components/atom/TotalNumBooks.vue";
pages/stack/_uid.vue:import TotalNumBooks from "~/components/atom/TotalNumBooks.vue";
```

確認用にgrepの結果を出しているけど、コメントアウトしたり、  
NUMが0件のときは、結果を表示しないようにすればいい感じ。

もしくは、`| grep "** 0:"`で結果をgrepするとかでもいいかも。

### appとかディレクトリを変えてる場合

こんな感じにapp配下とかに場所を変えている場合は、

```
app/
  pages/
  components/
```

こんな感じで、findする場所を変えればOK♪

```sh
#!/bin/bash

FILES=`find app/components -name "*.vue" | sed 's:app/::g'`
for i in $FILES; do
  NUM=`grep -r "$i" app/* | wc -l | sed -e "s:[^0-9]*::g"`
  echo "** ${NUM}: ${i}"
  grep -r "$i" app/* 
  echo ""
done
```

以上!!


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

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

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

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

要望・感想・アドバイスなどあれば、
公式アカウント([@MemoryLoverz](https://twitter.com/MemoryLoverz))や開発者([@kira_puka](https://twitter.com/kira_puka))まで♪
データ構造についての学び

こんにちは！今プログラミング学習を始めてまもないものです。今日はデータ構造について学んだのでそれをアウトプットしていきたいと思います。

#データ構造
データ構造とはデータを保持する形式や方法のことを言います。


##リスト
リストは要素が順番に並んだデータ構造のことを言います。リストの特徴としては、要素を編集しやすいということです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504611/9944c243-b16f-f525-f9c1-29f5ef6cdf79.png)

##スタック
スタックは Last in, First outと言い表されるように、最後に入ったものが最初に出ていくというデータ構造です。イメージとしては本などを積み重ねていくような感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504611/f52deeef-ee09-368a-4507-5b3761e2bbf2.png)

##キュー
キューは先ほどのスタックと違い First in, First outと言い表されるように、最初に入ったものが最初に出てゆくというデータ構造です。一方通行のトンネルといった感じでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504611/bdd45d69-b311-c899-ecbb-d9911a2952c9.png)

##連想配列(ハッシュ テーブル,辞書,マップ)
連想配列は指定されたキーに対応する値を素早く見つけだせるように、キーと値を関連付けてデータを保持するデータ構造です。
Pythonでは辞書と呼ばれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504611/194675ac-834d-9004-cedb-5fd0a3f65709.png)

##ツリー
ツリーはノード（線と線の結び目）を接続して階層構造を表現します。ツリーには種類がいくつか存在します。

##バイナリーツリー
バイナリーツリーは各ノードが最大で２つのこしか持たないツリー構造のことを言います。
バイナリーツリーは基本左にリンクする子は親より小さくなり、右にリンクする子は親よおり大きくなるという法則があります。

##バランスドツリー
バランスドツリーとはルートノードからリーフノードの高さをできるだけ等しくしたツリー構造のことです。
ツリーの高さを等しくしないと、処理に時間がかかってしまうなどのデメリットがあるため、バランスドツリーは有効です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504611/b5701d49-3f45-a45e-afca-2740d355df35.png)

#参考URL
https://www.codereading.com/algo_and_ds/ds/
HashMap#putAll()の挙動がJava7とJava8で異なる

こんなコードがあった。

```java:HashMapを継承したカスタムHashMapクラス
@Override
public Object put(Object key, Object value) {
	// キーを小文字にする
	return super.put(key.toString().toLowerCase(), value);
}
```
```java:カスタムHashMapを使用しているコード
CustomHashMap map = new CustomHashMap();
map.putAll(valueMap); // Java7ではキーがすべて小文字になる
```

Java7からJava8に上げると、mapのキーが小文字にならずに、今まで通りの挙動をしなくなった。

HashMapのコードを読んだところ、

- Java7では、putAll()からput()を呼び出している
- Java8では、putAll()からput()を**呼び出していない**

ことが原因と判明。つまり、Overrideしたputメソッドを呼び出していないためである。
putAllはOverrideしていなかったので、Java7ではたまたま動いていた、と考えるべきか。
(Java7の実装を読んでいたのかも知れないが。)
GitHub使ってみた2

今回もGitHubを使ってみた。

##操作
　前回はコミットやプッシュなどを紹介したが、今回は新たに以下の3つの操作を紹介したい。

　・リバート
　・リベース
　・チェリーピック

##リバート
　ファイルを変更したが、取り消したいときに使う。
　GUIではログを表示して、変更を取り消した後、コミット→プッシュで行うことができる。

##リベース
　日本語では主軸を変えるという意味。
　この操作により、変更をコミットしたブランチから別のブランチへ再現することができる。
　GUIではリベース→プッシュの順で行うことができる。

##チェリーピック
　マージがすべての変更を反映するのに対し、チェリーピックは一部の変更を反映する。
　GUIではログから対象ブランチ、コミットを選択しチェリーピック→プッシュで行うことができる。

##まとめ
　最初は難しいが慣れれば簡単であるので、ぜひ身につけたい。
　以上。
FileZilla だけをインストールする

## FileZilla をインストールするとマルウェア/アドウェアが入る問題

2014年頃、[SourceForgeでマルウェア入りのFileZillaが配布されていた](https://gigazine.net/news/20150722-sourceforge/)という問題がありました。
またそれとは別件ですが、2019年10月現在、[FileZillaの公式サイト](https://filezilla-project.org/)のインストーラーにはアドウェアが含まれており、何かとFileZillaは「余計なもの」が入るイメージがあります。

※公式サイトのインストーラーに含まれるアドウェアは意図された[スポンサードなソフトウェア](https://filezilla-project.org/sponsored_updates.php)なのでそこまで害はないという感じもしますが、ノートン先生とかが怒るのでなるべくならば入れたくないところです。

<img width="627" alt="スクリーンショット 2019-10-08 15.30.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16060/f762df24-31a1-2f53-0a60-466a3fc35d07.png">

## FileZilla だけをインストールしたい

Macの場合は以下の手順でFileZillaだけをインストールできます。

- [FileZillaの公式サイト](https://filezilla-project.org/)にアクセス
- 「Download FileZilla Client」のボタンをクリック
- 緑色の「Download FileZilla Client」のボタンは無視して下部の「Show additional download options」をクリック
- 「FileZilla_3.45.1_macosx-x86.app.tar.bz2」をクリックしてダウンロード＆インストール

※ .dmgインストーラーではなく.tar.bz2のアーカイブをダウンロードするのがポイントです。

## FileZilla を支援したい

[Mac App Store](https://apps.apple.com/jp/app/filezilla-pro-ftp-and-cloud/id1298486723?mt=12)から年間サブスクリプション1000円のProバージョンも利用できます。
他には[FileZilla Proの公式サイト](https://filezillapro.com/)からもPro版を購入することもでき、こちらは買い切りかサブスクリプションなのかの明記が見つからなかったのですが、現時点では税込み2136円で購入できることができます。（もちろんPro版はアドウェアなしです）

<img width="303" alt="スクリーンショット 2019-10-08 16.05.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16060/fe4a5dd5-3b6c-c9ad-45c9-398c59a0e5e2.png">

# See Also (2020.02.26追記)

macOS版のFileZillaからアドウェアが取り除かれたかもしれない - Qiita
https://qiita.com/studio15/items/5d8cdb5b277627bd5f4d
Ubuntuのディスク容量を拡張する方法

## 前置き
virtual box関連のデータがディスク容量を圧迫していた。そのためハードディスクを増設し容量を拡張、そして容量を圧迫しているデータを増設したハードディスクで管理することにした。その時のコマンドの手順について記録を残す。ハードディスクの増設・接続といった作業は完了している前提で話を進める。本記事を参考に作業を行う人は、適宜自分のやりたいことに置き換えて欲しい。
## 環境
OS : Ubuntu 16.04
増設したハードディスクで管理したいディレクトリ : /home/"ユーザ名"/VirtualBox VMs/
増設したハードディスク : /dev/sdb
作成したパーティション : /dev/sdb1
パーティションサイズ : 256GiB
## 手順
### パーティション作成
fdiskコマンドを利用して、増設したハードディスクにパーティションを作成します。

```shell
$ sudo fdisk /dev/sdb

Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


コマンド (m でヘルプ):
```

パーティションを作り直す人は、先にdコマンドで既存のパーティションを削除します。新規パーティションを作成する際は、以下の手順で実行します。最後のwコマンドでパーティションが作成されます。キャンセルしたい場合は、qコマンドを実行します。
1. nコマンド
2. pコマンド
3. Enter(パーティション番号、デフォルトで問題ない)
4. Enter(セクタの開始位置、デフォルトで問題ない)
5. +256G(セクタの終了位置、パーティションの容量)
6. wコマンド


```sh
コマンド (m でヘルプ): d
Selected partition 1
Partition 1 has been deleted.

コマンド (m でヘルプ): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
パーティション番号 (1-4, default 1):
First sector (2048-1953525167, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-1953525167, default 1953525167): +256G

Created a new partition 1 of type 'Linux' and of size 256 GiB.
```

### フォーマット

```sh

$ sudo mkfs -t ext4 /dev/sdb1
```

### マウント設定
パーティションを一時的にマウントします。

```sh

$ sudo mkdir /mnt/tmp
$ sudo mount -t ext4 /dev/sdb1 /mnt/tmp
```

/ete/fstabファイルを編集し起動時のマウントの設定を行います。
まず、パーティションのUUIDを確認します。

```sh
$ sudo blkid /dev/sdb1
/dev/sdb1: UUID="9154ae50-d990-4390-b4f8-81e51ca4c6a4" TYPE="ext4" PARTUUID="da2c6072-01"
```

確認したUUIDを利用して/etc/fstabファイルに以下の内容を追記します。
*VirtualBox VMs*を*VirtualBox\040VMs*としていますが、fstabにスペースで記載するとエラーになるため、8進数で記載しています。

```sh
UUID=9154ae50-d990-4390-b4f8-81e51ca4c6a4       /home/"ユーザ名"/VirtualBox\040VMs  ext4    defaults       0       0
```

### データの移動
移動させたいデータを増設したハードディスクにコピーします。

```sh
$sudo cp -R /home/"ユーザ名"/VirtualBox\ VMs/* /mnt/tmp
```

ディレクトリ名を変更します。

```sh
$ sudo mv /home/"ユーザ名"/VirtualBox\ VMs /home/"ユーザ名"/VirtualBox\ VMs.bu
```
マウント先を変更します。

```sh
$sudo umount /mnt/tmp
$sudo mount -t ext4 /dev/sdb1 /home/"ユーザ名"/VirtualBox\ VMs
```

### マウント設定に問題がないか確認
以下のコマンドを実行してエラーがしたときはfstabファイルの設定を見直します。

```sh
$sudo mount -a
```

再起動して問題なければ作業完了です。
numpy/pandasで同じ値を連続ある程度連続した箇所を取り除く


# 目的

なにやら適当な時系列データなどを収集して保管するとする。
集め方によっては一定の区間同じ値を出し続けることがあるが，その間の分を記録しているのは容量を圧迫する。

例えば以下の図のように0が長く続く区間が複数あり，これを除去したいとする。

- 0がN以上連続したデータを取り除く
- 0が異常に長く続くのを除去したいのであって0そのものは残っていてもよい。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188863/1b36048c-34eb-eeff-65e7-d52f1fb0a5e3.png)



## 実装

1. まず，上のdataのうち，0でない箇所のindexを抽出する。
1. index番号の間隔をdiffを用いて計算。
1. 間隔がN以上になるindexを抽出。
1. 抜き出すべきindexをarrangeで作成。
2. Pandasのdfからdropで指定して一気に落とす。

以下のコードはサイズ調整が少し入っている。

```python3
valididx = np.where((data>1e-5) | (data<-1e-5)) # Non zero only count rigid zeros
spaceidx=np.diff(valididx,prepend=0)
delidx=np.where(spaceidx>600) # Assume N = 600
delidxs = []
for deli in delidx[1]:
    delidxs.extend(np.arange(valididx[0][deli-1],valididx[0][deli]))
droppedbuff = df.drop(delidxs,axis=0)
```


余分なデータを落とすと以下のようにスッキリ見える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188863/cc59f943-ec7c-a099-4678-4990bac5d002.png)
Unityを2019.2.3fにアップデートしたら、謎現象が発生する（原因不明のままだけど大したことない）

# アップデートした

## UnityHubを使ってインストール＆起動

すでにご存知とは思いますが、
UnityHubを使って新しいバージョンを追加して、
そのバージョンで既存のプロジェクトを開いて動かした感じです。
バージョンは、
UnityHub 1.6.1
Unityバージョン 2018.2.17f1 → 2019.2.3f1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371470/23acc0b8-0170-fd3d-d838-4ce369518878.png)

割と新しめにしてみました。

## 謎現象発生

とりあえず、何事もなくデバッグできたので、iOSで出力しようということに。
すると、必ずではないものの、ビルド中にこんなエラーが。
![image_2019_10_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371470/638dd67b-aec3-ea1f-6ac6-d4b301469a08.png)

エラー内容を見る限り、
フォルダへのアクセスが拒否されましたって内容。
でも、実はそのフォルダ、Unityで選択して、ビルド中にはそのあたりに触れないでいたもの。
結果的に、フォルダごと消えていて、「多分自分で消したくせに拒否された」ってエラーを吐く不思議。

空のフォルダに入れていたので、特に影響はなく、再度ビルドすると問題なく出力されましたとさ。
でも、同じことが再度発生したので、ビルドは必ず空フォルダにやっといたほうがいいよ…ということで。

おしまい。

## 2019にアップデートして、やりたかったこととか

もう簡潔に、
デバイスの明るさを取得して調整、ってのをアプリ側でやりたくて、
その簡単な機能が2019になってやっと搭載されたから。

Screen.brightness(set / get プロパティ。0.0f ~ 1.0fの値をとる)

これだけ。

## 2019にアップデートして、動作変わって困ったこととか

2019にアップデートすると、.netFramework4.6.1以降にしないとVS側はまともに動かないっぽい。(アップデートしてないので、VSCodeで組んでる)
それと、PlayerSettingsがEditから消えてしまって、パッケージマネージャー( 新規 )の中に動いたので、
Buildsettingsを表示して、PlayerSettingsボタンを押して表示するようになったよ、ぐらいかな。

アップデートしてもエラーが出ないっていうのはえらい。これはホントに。
【初心者】UIの設計にはAdobeのXDが超絶便利だった件

# はじめに
こんにちは、僕です。今回はアプリ設計の経験がなかった僕がとりあえずUI作成にと使用したツール「AdobeXD」が**超絶便利**だったので初心者の方用に参考になればと思い書きました。

# 使用環境
Adobe XD  22.7.12.3 (スターター)
# 良かった点

##無料
有料版もありますが、まずは**スターターで十分**です。
このソフトをタダで使えるなんて良い時代に産まれました。
##操作性の良いUI
何と言っても一番のメリットはここでしょう。おしゃれなアプリ作成には持ってこいです。**本当に使いやすい**。
他にいくつかUIツールを試しましたが、**UIツールなのにそもそもソフト自体のUIが悪いソフトが多すぎます。**
それにくらべAdobeXDは白を基調にしたInstagramやAirbnbなどに似たシンプルなデザインで初心者にも使いやすい用に作られています。
<img width="1680" alt="スクリーンショット 2019-10-08 11.59.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258867/5bccbada-a699-bd30-3807-5911565ab0d8.png">

「アプリを設計したいが、専門的な知識はない」
「でもストアでよく見るあんな**ダサいデザイン**にしたくはない」
と思う方にとっては**最高のツール**ではないかと思います。

さらに、これはアプリ開発の話ですがデバイスプレビュー機能という実際にスマホで動かしているような画面で作品を確認する機能もついています。簡単にですが**このボタンでどこに飛ぶ**といった設定もできるのでおすすめです。さらに、USB接続で専用アプリを入れた**iPhoneとリアルタイムで同期**し、プレビューができるので、絶対に使いましょう。
<img width="413" alt="スクリーンショット 2019-10-08 16.06.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258867/fdac45c8-1b00-ebc5-ffc0-1b2612f55acd.png">


##テンプレートが多い
AdobeXDでは世界中のクリエイターが作ったテンプレートがネットに転がっています。

https://ferret-plus.com/10394
>Adobe XDで簡単にプロトタイプを作れる！おすすめの無料テンプレート15選

とても質のいいテンプレートがたくさんあります。
**基本的なフレームワークができていればある程度感覚でなんとかなる**ものです。
特に僕と同じように学生さんで、他の学生とデザインで差をつけたい人や
開発専門だがデザインにも少し手を出したい！って方は、本当にこの**ちょっとした努力**で評価がかなり変わるので試してみてください！
<img width="704" alt="スクリーンショット 2019-10-08 15.32.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258867/0cf3f9c7-829a-fa91-a789-c1525ac35031.png">
これは僕がテンプレートを参考に一時間程度で作ったフリマアプリのプロフィール画面ですが、**デザイン知識のない学生でもここまでできる**ものです。
なお、デザイン画面はSVGでエクスポートすることでXcode等でもそのまま使えるので安心ですね。


#最後に

僕と同じように「デザインの知識がないがアプリのデザインをしたい」という方には本当にぴったりのツールだと思います。
ダウンロードは下記からできます。ぜひお試しあれ。

[Adobe体験版ダウンロード](https://www.adobe.com/jp/products/xd.html)
YarnやNPMでscriptsを実行する際に、コマンド名がわからずにpackage.jsonを確認する人へ

package.jsonに定義しているstartやtestは覚えていますが、自分で新たに定義したscriptsの名称はしばらく実行していないと忘れてしまいます。

`yarn run` or `npm run`と実行するだけでscriptsの一覧が見れます。
yarnに至っては実行後にコマンドの入力を求めてくれます。

```shell
# yarnで実行した場合
$ yarn run 
   - build
      react-scripts-ts build
   - eject
      react-scripts-ts eject
   - start
      react-scripts-ts start
question Which command would you like to run?:
```

`yarn run`を`yarn run xxx`として使うコマンドとして覚えていると、気づかない機能でした :sweat:
JavaScript初心者に暗記してほしい構文 11選

先日「JavaScriptの本を写経しているけど正直身になっているか不安」という相談を受けました。
これ自体はプログラミング初心者なので仕方がないのですが、パラパラとページを捲りながら「じゃあとりあえず変数fooに文字列の”あいうえお”を入れようか」と言ったら手が止まってしまいました。過去にも別の人に「bazっていう関数を作って」と言ったら`buz{function[]}`みたいなのが出てきて、「おぉ..」となりました。

なので英語の単語ドリルのように構文（書き方の形）だけを暗記することが、初心者にとって近道ではないかと思いました。

今回はJavaScriptのES5で書いていきます。
教えていてミスや質問が多かった部分などのコメントも書いたので、合わせて読んで貰えればと思います。

## 暗記ドリル

### 文字列の「あああ」、数字「12」、ブーリアンの「false」を適当な変数に入れて！
```js
var str = 'あああ'; // 文字列はシングルコーテーションまたはダブルコーテーションで囲う。
var num = 12;
var bool = false;
```

> 適当につけた変数名「str」はstringの略です。stringは文字列という意味です。
> 変数名「num」はnumberの略です。numberは数字という意味です。
> 変数名「bool」はbooleanの略です。booleanはプログラミングでtrueかfalseという意味です。

### 空の配列と空のオブジェクトを適当な変数に入れて！
```js
var arr = [];
var obj = {};
```

> 変数名「arr」はarrayの略です。arrayは配列です。
> 変数名「obj」はobjectの略です。objectはオブジェクトっていうものです。（今はそう覚えて！）

### 適当な変数に「5」を入れて、コンソールに出して！
```js
var hoge = 5;
console.log(hoge);
```

> hogeは日本のIT業界でよく一時的な変数の名前としてよく使われる単語です。意味のない単語なのでWebサイトを公開する時に残っていると偉い人に怒られます。

### 適当な名前の空の関数（ファンクション）作って！
```js
// パターン1
function aaa() {}
// パターン2
var aaa = function() {}
```

> パターン1とパターン2は厳密には違いがあるけど、一旦この２つの書き方がある事を覚えてください。

### 「あ〜お」の配列を作って、「う」をコンソールに出して！
```js
var strs = ['あ', 'い', 'う', 'え', 'お'];
console.log(strs[2]);
```

> 配列の先頭は0から始まるので、strs[0]が「あ」、strs[1]が「い」、strs[2]が「う」になります。

### Bookってオブジェクト作って、「title」ってプロパティに適当な名前を入れて！
```js
var Book = {
  title: 'ワンピース'
}
```

> titleの後ろは「:」です。「=」ではありません。

### Carってオブジェクトに「run」ってメソッド作って！
```js
var Car = {
  run: function() {}
}
```

### Userってオブジェクトに「name」「tel」を作って適当な文字を入れて！
```js
var User = {
  name: 'やまだ',
  tel: '090-xxxx-xxxx'
}
```

> 次のプロパティやメソッドを書くときは「,」を使います。 `name: 'やまだ',`  ← これです。最後は入りません。

### Userオブジェクトからnameをコンソールに出して！
```js
var User = {
  name: 'やまだ',
  tel: '090-xxxx-xxxx'
}
// パターン1
console.log(User.name)
// パターン2
console.log(User['name'])
```

> パターン１でも2でも、どちらでも構いません。

### 「id=‘btn’」のDOM取得して、適当な変数に入れてコンソールに出して！
```js
// パターン1
var b = document.getElementById('btn');
console.log(b);
// パターン2
var b = document.querySelector('#btn');
console.log(b);
```

> パターン1でも2でもどっちでも良いですが、DOMを取得と聞いたらパッとどちらも思いつくようにしましょう。

### 「id=‘btn’」にクリックイベントをつけて！
```js
var b = document.getElementById('btn');
b.addEventListener('click', function() {});
```

## まとめ
繰り返し書いて覚えている時はつまらないかもしれないけど、とりあえずここに書いてもらったものを暗記してもらえれば自分は説明しやすいです。
他にも覚えるべき構文などはたくさんありますし、「for」や「if」がないという人もいるかもしれませんが、そこの説明は楽なんですよね。そこまでたどり着く前に暗記しておいてもらえると、本当に助かると思ったものをピックアップしました。

**これは知り合いを教えるためのテキストとして使用する目的で書きました。**
Laravel(5.5)公式ドキュメントにないassertDatabaseHasのDBの指定方法

# 要約

公式ドキュメント見て載ってなければソースコード見ろ。

## 背景

[Laravelで複数のデータベースを跨ぐテストを実施する際のトランザクションの設定](https://qiita.com/ProjectEuropa/items/2b0b43599dea8ed2ce29)
で当然DBを指定してassertDatabaseHasをしたいが、DBの指定方法が公式ドキュメントにも載ってない。[日本語](https://readouble.com/laravel/5.5/ja/database-testing.html)も[英語](https://laravel.com/docs/5.5/database-testing)も両方とも。


ソースコードを見ると

```php

<?php

namespace Illuminate\Foundation\Testing\Concerns;

use Illuminate\Foundation\Testing\Constraints\HasInDatabase;
use PHPUnit\Framework\Constraint\LogicalNot as ReverseConstraint;
use Illuminate\Foundation\Testing\Constraints\SoftDeletedInDatabase;

trait InteractsWithDatabase
{
    /**
     * Assert that a given where condition exists in the database.
     *
     * @param  string  $table
     * @param  array  $data
     * @param  string  $connection
     * @return $this
     */
    protected function assertDatabaseHas($table, array $data, $connection = null)
    {
        $this->assertThat(
            $table, new HasInDatabase($this->getConnection($connection), $data)
        );

        return $this;
    }
```
こんな記述が...


具体的にはPHPUnitでこう書けば良い。

```php
$this->assertDatabaseHas('users', [
    'name' => 'JMac',
    'email' => 'jmac@example.com'
], 'mysql2');
```
【Python】Pythonで複数のエクセルシートのデータを一括処理

#はじめに
仕事中にいくつかのエクセルファイルに欲しいデータが散らばっていて、何度も何度もエクセルを開きなおすということがめんどくさいな～と思って、なんかいい方法ないかな？の解として辞書型配列を使ってみました。

#１．辞書型配列とは
配列のインデックスは従来数値で表されます。
**辞書型**とは、**インデックス**に数値ではなく**文字を指定できる変数の型**です。（自分の理解では）

コード上では、辞書型のインデックスのことをkey、それに対する値をvalueと書くことが多いです。
（実際の辞書では、調べたい文字がkeyになりその語句の意味がvalueということになる。）

#２．宣言の仕方
**※要注意：配列とめっちゃ似てます！！**

```Python:code.py
list=[] #リスト
dict={} #辞書型
```

続いて、keyと値の設定方法です。

```Python:code.py
dict={a:apple,b:banana,c:corn} #辞書型の宣言時にkey,valueを設定
"key"    "value"
  a       apple
  b       banana
  c       corn
```

他にも、宣言済の辞書型配列にkeyとvalueの組を追加することもできます。

```Python:code.py
dict={} #空の辞書型配列を宣言
key=A 
value=Ace 
dict[key]=value #keyがA,valueがAceを追加
```
また、keyの削除も可能。

```Python:code.py
dict={} #空の辞書型配列を宣言
key=A 
value=Ace 
dict[key]=value 
del dict[key] #keyがAの要素を削除(keyとvalueの両方が削除される)
```

一つのkeyに対して、複数のvalueを紐付けることも可能。
（→keyにlistを紐付ける）

```Python:code.py
dict={} #空の辞書型配列を宣言
key=A 
value=[One,Two,Three] 
dict[key]=value #keyがA,valueがAceを追加
```
 
#３．複数のエクセルシートからデータを形成
ある列または行の値が共通のエクセルシートを用意する。ここでは二つのエクセルシートを考え、これをそれぞれX、Yで表す。XとYのA列は共通の値とする（keyがA列の要素となる）。
エクセルシートから値を取り出す方法については、[Pythonでエクセルデータを扱う!](https://qiita.com/Takuya_Fujitani/items/55e29f64d5d233442964)で紹介。

Xに存在する欲しいデータをX_want、Yに存在する欲しいデータをY_wantとする。
これをkey=A列として紐付ける。

```Python:code.py
dict={} #空の辞書型配列を宣言
key="A列の要素" 
value=[X_want,Y_want] 
dict[key]=value #keyがA列の要素で,それに対応する異なるエクセルから持ってきた値がvalue
```

この操作を行うことで、Python上では二つのエクセルがマージされ、あたかも一つのファイルを扱っている風になる。

#４．おわりに
複数のエクセルから必要なデータを引っ張ってくるという事をしてみました。なんとなく複数データベースから値をとってくるってこんな感じなのかなっていう、雰囲気を感じることが出来ました。データベース構築とか管理とかいつかは挑戦したいなとおもいました！！
Docker CentOSイメージを使用してPHP-FPMを実行する


CentOSイメージをベースにしてphp-fpmが動作するコンテナを作成します。サンプルです。

リポジトリ
https://github.com/kakizaki/sample_docker_phpfpm_cent


# 動機

DockerHubにはphp-fpmのための公式のイメージがありますが、ベースは```debian```または```alpine```だったと思います。
実際のサーバー環境はCentOSを使用していて、yumによりパッケージをインストールをしています。
コンテナでもyumが使えて、同じように書けると楽です。


# 使用手順

```docker-compose up```を実行すると、nginxコンテナとphp_fpmコンテナが起動します。
ブラウザで```http://localhost/index.php```を表示すると、phpinfoの実行結果が表示されると思います。



# はまった点

php-fpmの設定を誤っていたことで、nginxコンテナからphp_fpmコンテナへアクセスできずに、はまってしまいました。
(unixソケットを使用する場合には不要ですが)

```config:php/www.conf
; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect.
; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original
; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address
; must be separated by a comma. If this value is left blank, connections will be
; accepted from any ip address.
; Default Value: any
; HACK 外部からのアクセスを許す場合はコメント(any)にするか、IPを指定する
;listen.allowed_clients = 127.0.0.1
```
【コピペ用】laravelで都道府県のバリデーション

# 都道府県のバリデーション
作っているうちにどこかでコピペできたら便利だな、と思って記載しました。

Laravelで都道府県を入力するフォームで用いるための
バリデーションロジックです。
バリデーション自体の説明は割愛しますが、
特定の値のみ受け付ける場合には```in```を用います。

県あり
<pre>
$request->validate([
    'prefecture' => 'required|in:北海道,青森県,岩手県,宮城県,秋田県,山形県,福島県,茨城県,栃木県,群馬県,埼玉県,千葉県,東京都,神奈川県,新潟県,富山県,石川県,福井県,山梨県,長野県,岐阜県,静岡県,愛知県,三重県,滋賀県,京都府,大阪府,兵庫県,奈良県,和歌山県,鳥取県,島根県,岡山県,広島県,山口県,徳島県,香川県,愛媛県,高知県,福岡県,佐賀県,長崎県,熊本県,大分県,宮崎県,鹿児島県,沖縄県',
]);
</pre>

県なし
<pre>
$request->validate([
    'prefecture' => 'required|in:北海道,青森,岩手,宮城,秋田,山形,福島,茨城,栃木,群馬,埼玉,千葉,東京,神奈川,新潟,富山,石川,福井,山梨,長野,岐阜,静岡,愛知,三重,滋賀,京都,大阪,兵庫,奈良,和歌山,鳥取,島根,岡山,広島,山口,徳島,香川,愛媛,高知,福岡,佐賀,長崎,熊本,大分,宮崎,鹿児島,沖縄',
]);
</pre>

## 参考
バリデーションについて公式ドキュメント：
https://laravel.com/docs/5.8/validation

都道府県引用元：
https://www.start-point.net/maps/tool/
javascriptでDOMの一部を差し替える

# 経緯
多言語サイトの年齢認証モーダルで、モーダルの内容を選んだ言語に合わせて内容が変わるものが必要になった。
ブラウザ設定言語によって初回ロード時は各言語に振り分けしてるが、モーダル内の言語選択でも内容が変わらないとおかしいよねｗｗｗ
プロマネに言われるまで気づかなかった（爆）

姑息な方法として各言語の内容をCLASSでONOFFすれば良いが、個人的に嫌というかダサいので違う方法を模索。
結果、以下の方法で実装することとした。

# 実装
## デフォルト表示させるスタティックなHTMLを用意する
私は日本語をデフォルト表示とした。
jsによってID[modal]の内容が差し替わります。

```haml:default.haml
#modal
  %h1 こんにちは！
  %ul{onclick: 'loadModal(event)'}
    %li{data:{lang: 'en'}} EN
    %li.active{data:{lang: 'ja'}} JA
    %li{data:{lang: 'zh'}} ZH
    %li{data:{lang: 'fr'}} FR

```

## 各言語切り替え用モーダル部品を用意する

```html:lang_ja.html
<h1>こんにちは！</h1>
<ul onclick='loadModal(event)'>
  <li data-lang='en'>EN</li>
  <li class='active' data-lang='ja'>JA</li>
  <li data-lang='zh'>ZH</li>
  <li data-lang='fr'>FR</li>
</ul>

```
```html:lang_en.html
<h1>Hello！</h1>
<ul onclick='loadModal(event)'>
  <li class='active' data-lang-type='en'>EN</li>
  <li data-lang='ja'>JA</li>
  <li data-lang='zh'>ZH</li>
  <li data-lang='fr'>FR</li>
</ul>

```
```html:lang_fr.html
<h1>Bonjour！</h1>
<ul onclick='loadModal(event)'>
  <li data-lang='en'>EN</li>
  <li data-lang='ja'>JA</li>
  <li data-lang='zh'>ZH</li>
  <li class='active' data-lang='fr'>FR</li>
</ul>

```
```html:lang_zh.html
<h1>您好！</h1>
<ul onclick='loadModal(event)'>
  <li data-lang='en'>EN</li>
  <li data-lang='ja'>JA</li>
  <li class='active' data-lang='zh'>ZH</li>
  <li data-lang='fr'>FR</li>
</ul>

```

## JS
クリックイベントでdata属性の値を取得し、その値を利用してロードするhtmlを制御します。

```javascript:sample.js
function loadModal(e){
  var lang = e.target.getAttribute('data-lang');
  XHR = new XMLHttpRequest();
  XHR.onreadystatechange = checkingStatus;
  XHR.open("GET", "/modal_" + lang + ".html", true);
  XHR.send(null);
};
function checkingStatus(){
  if (XHR.readyState == 4 && XHR.status == 200){
    var target = document.getElementById("modal");
    target.innerHTML = XHR.responseText;
  }
}

```
## CSS
簡易的なものなのでご自由に

```scss:sample.scss
#modal{
  width: 300px;
  box-sizing: border-box;
  color: #FFF;
  background-color: #000;
  border-radius: 5px;
  padding: 40px 20px;
  margin: 100px auto 0;
  h1{
    font-size: 30px;
    text-align: center;
    margin-bottom: 20px;
  }
  ul{
    display: flex;
    justify-content: space-around;
    li{
      display: inline-block;
      color: #B7B7B7;
      cursor: pointer;
      &.active{
        color: #FFF;
      }
    }
  }
}
```

## こんなかんじ
![スクリーンショット 2019-10-08 15.41.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126335/cb32c40a-f219-7503-bfff-a14ba252a993.png)
Ruby on Rails　アプリ作成のはじめのはじめ

Ruby on Rails作成におけるアウトプット用も兼ねて記載していきます。
間違い等あればご連絡ください。


新規Railsアプリケーションの作成
　アプリケーションを配置するディレクトリを作る。
　　自分の作成したい場所までターミナルで移動する。
　　cd
    現在のディレクトリ（カレントディレクトリ）を移動する
   mkdir
    新しくディレクトリを作成する
   pwd
    現在のディレクトリ（カレントディレクトリ）のパスを表示する
   ls
    現在のディレクトリ（カレントディレクトリ）のファイル一覧を表示する

 新規アプリケーションを作成
  ターミナルで「rails new」コマンドの実行
　　rails new アプリケーション名 -オプション名

これでRuby on Railsのアプリ制作における雛形ができるので、ここから色々と編集していくことで立派なアプリへと成長させていくことが可能となる。