OmniAICreator/Qiita-1.07M huggingface dataset:
5 月 LeetCode 挑戰, W1D4, Number Complement, in Swift

資料結構與演算法： `Bit Manipulation` `Math`

- 挑戰頁面 - [Number Complement](https://leetcode.com/explore/challenge/card/may-leetcoding-challenge/534/week-1-may-1st-may-7th/3319/)
- 原題目頁面 - [476. Number Complement](https://leetcode.com/problems/number-complement/)

題意：找出一個數字的補數 (complement)

這一題最直覺會想到 bit manipulation ，因此我第一個寫出來的解法也用了 bit manipulation 。不過還有另外一個解法可以用單純的數學來解。

這篇就兩種解法都做紀錄吧！

## Bit Manipulation

做的事情簡化來說就是每一位數都做 bit 翻轉 (`^`，XOR, [參考](https://docs.swift.org/swift-book/LanguageGuide/AdvancedOperators.html))

以 4 (`100`) 為例，從二進位的表示來看答案會是 3 (`11`) ，我們做的事情實際上就是：

``` text
                                      101 (4)
4 XOR 2^0 -翻轉第一位-> 5 (101) 需處理：  10 (4 >> 1)
5 XOR 2^1 -翻轉第二位-> 7 (111) 需處理：   1 (2 >> 1)
7 XOR 2^2 -翻轉第三位-> 3 (011) 需處理：   0 (1 >> 1)
```

### 程式碼

``` swift
class Solution {
    func findComplement(_ num: Int) -> Int {
        var number = num
        var result = num
        var divisor = 1

        repeat {
            result ^= divisor // result = result ^ divisor 的簡化
            divisor <<= 1     // 向左 bitwise ，也可以寫成 divisor *= 2
            number >>= 1
        } while number != 0

        return result
    }
}
```

### 複雜度分析

- 時間複雜度： O(1)
  - 最多只會做 31 次 O(31)，所以可以簡化成 O(1) 。 31 次： 32 位元的有符號數的範圍 `-(2^31) ~ 2^31`
- 空間複雜度： O(1)
  - 只有用常數個變數來運算。

### 執行結果

``` text
Runtime: 4 ms (beats 83.33%)
Memory Usage: 20.7 MB
```

## 單純的數學運算

逐步把參考值乘以 2 乘到直到比傳入值還大，參考值減去傳入值就是答案。

### 程式碼

``` swift
class Solution {
    func findComplement(_ num: Int) -> Int {
        var bigger = 0
        var binary = 1

        while bigger < num {
            bigger += binary
            binary <<= 1 // 或可以寫 binary *= 2
        }

        return bigger - num
    }
}
```

### 複雜度分析

和前一個解法一樣是 O(1) / O(1) 。

### 執行結果

``` text
Runtime: 4 ms (beats 83.33%)
Memory Usage: 21 MB
```

## 0 的話呢

題目有提到不會有 leading 0 ，所以可以理解成不需要理會 `0` 。
[VBS] ADODB.Streamで使える文字コード一覧の取得

[01_ADODB.Stream で使用可能な 文字コード ( コードページ ) 一覧 ](http://mrxray.on.coocan.jp/Delphi/plSamples/887_ADODBStream.htm)
このレジストリのことは
[Charset プロパティ (ADO)](https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/charset-property-ado)
 HKEY_CLASSES_ROOT\MIME\Database\Charset in the Windows Registry.

という記載がされている。
このためこれをレジストリから取り出し、
`HKEY...Charset\`
までを消して
VBSCRIPTがあるフォルダをカレントディレクトリにして、
adodbCharSetList.txt
を作成する


```vb:ADOStreamChrSetlist.vbs
Dim data
Dim WSH : Set WSH = WScript.CreateObject("WScript.Shell")
Dim fs : Set fs = CreateObject("Scripting.FileSystemObject")
Dim strSrc, colEventSource
Dim outExec, outStream, strOut
Set outExec =Wsh.Exec("cmd.exe /c reg query ""HKEY_CLASSES_ROOT\MIME\Database\Charset""")
Set outStream = outExec.stdOut
strOut = ""
if fs.FileExists(wsh.CurrentDirectory & "\" & "adodbCharSetList.txt") then
fs.DeleteFile(wsh.CurrentDirectory & "\" & "adodbCharSetList.txt")
end if
Do While Not outStream.AtEndOfStream
  strOut = strOut & vbNewLine & outStream.ReadLine()
Loop
Dim ts : set ts =fs.OpenTextFile(wsh.CurrentDirectory & "\" & "adodbCharSetList.txt", 2, true)
ts.WriteLine Replace(strOut , "HKEY_CLASSES_ROOT\MIME\Database\Charset\", "",1,-1,0)
ts.close
WScript.Echo strOut
Set fs = Nothing
Set WSH  = Nothing
Wscript.Quit
```

画面の方は省略していないため、このように表示されます。
エイリアス（別名）が含まれるため意外と多いです。
HTMLに対応しているのかも知れません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/19bfb593-8664-24b0-ffe3-104563a509b7.png)

[各ブラウザが解釈可能なcharsetのリスト(古いブラウザver)](https://pentan.info/else/alias_for_charset.html)
もはやサポートが終了したブラウザや、古いバージョンのブラウザのエンコーディングを掲載する。現行のブラウザのテストはこちら。
Safari(win 5.1.7) Safari(OS X、7.0.1) Firefox 18

[4.2. Charset クラス](https://www.techscore.com/tech/Java/JavaSE/NIO/4-2/)
>それぞれの文字セットには必ず1つの標準名があり、また複数の別名を持つことが許されております。forNameメソッドでは標準名と別名のどちらも使用することができます。例えば標準名「EUC-JP」の文字セットには「eucjis」「x-eucjp」「csEUCPkdFmtjapanese」「eucjp」「Extended_UNIX_Code_Packed_Format_for_Japanese」「x-euc-jp」「euc_jp」 といった別名が存在します。 forNameメソッドでどの名前を使用しても取得されるインスタンスは同等のものです。文字セットの名前を取得するには、以下のメソッドを使用します。

```
String name() - 文字セットの標準名を返します
Set aliases() - 文字セットの別名をすべて含むセットを返します
```

仮想マシンがどの文字セットをサポートしているかは実装依存ですが、以下の文字セットは必ずサポートしなければいけないことになっています。
<UL>
<li>US-ASCII
<li>ISO-8859-1
<li>UTF-8
<li>UTF-16BE
<li>UTF-16LE
<li>UTF-16
</UL>

[コードページの一覧 技術資料 Pentan](https://l0.cm/encodings/list2/)
Kubernetes the Hard Way on Vagrant with v1.18.2

こちらを参考にしました
https://qiita.com/t_ume/items/5d24b377e08669155639

下敷きにオリジナル版をやったうえでのチャレンジです
https://github.com/kelseyhightower/kubernetes-the-hard-way

同じことをやっても仕方ないのと、現状では `v1.15.3` とバージョンが古いのもあるので、導入するソフトウェアバージョンを現状の最新にしてみました。

 - Ubuntu 18.04.4 LTS (Both host and all VirtualBox VMs)
 - VirtuarBox v6.1.6
 - Vagrant 2.2.7
 - Kubernetes: v1.18.2
 - Containerd: 1.3.4
 - runc: v1.0.0-rc10
 - etcd: v3.4.7

成果物は以下に置きました。
https://github.com/dmiyakawa/kube-the-hard-way-on-vagrant

VMのイメージ類やインストラクションはないです。インストラクションは上の記事を踏襲すれば概ねOKですが、ちょっと設定ファイルには違いがあったので2点指摘しておきます

 * kube-apiserver.service should have --runtime-config=api/all=true instead of --runtime-config=api/all for its boot option
 * kube-controller-manager.service should have --master=http://localhost:8080 in adittion.

これらの対応がないと Control Plane を構築する段階でちょっと分かりづらいエラーが出ます。ちなみに上の方法が「正しい」かまではわかりませんが、一応スモークテストは通っています。
変更を適用済のsystemdの設定ファイルも上のレポにあるので、比較すると良いかもしれません。

オリジナル版が手元のGCP請求から逆算するに2〜3時間で終わっていて、体感でも非常にわかりやすかったことと比較すると、on Vagrantは結構作業ミスや上記のようなトラブルシューティングが多くて大変だったなぁという印象でした。

特にエラーがストレートに症状を説明しない。こういう感じでログにエラーが出てくるんですね。

```
May 03 22:38:12 controller-0 kube-controller-manager[25440]: invalid configuration: no configuration has been provided, try setting KUBERNETES_MASTER environment variable
May 03 22:38:12 controller-0 systemd[1]: kube-controller-manager.service: Main process exited, code=exited, status=1/FAILURE
May 03 22:38:12 controller-0 systemd[1]: kube-controller-manager.service: Failed with result 'exit-code'.
```

この `no configuration has been provided, try setting KUBERNETES_MASTER environment variable` というエラー自体は `kubectl` における v1.18.2 の変更に基づくものらしく、それ自体はIssueもすぐ見つかるんですが、では、それがなぜ kube-controller-manager のログで出てくるのか、ということまでは初心者にはちょっと分かりづらいですね。
初心者によるpython 環境作成メモ

##環境
- OS 
windows10 home

- IDE
とりあえず無し
Atomにてコーディング、実行を行う。
(ステップ実行環境はまだ構築しない)

#python 環境作成メモ
##インストール
公式からpython3系を落とす(2はサポート終了が近いため)
anaconda を入れる
入れる際、環境変数への設定が行われるようにする

##入れたプラグイン
- autocomplete-python
python補完機能

- atom-runner
Alt+R で実行できる

- highlight-selected
直接pythonとは関係ない。選択したワードを強調する

- atom-beauty
コード整形機能
CTRL+ALT+B で実行

##Atom設定
- プラグインの追加
メニュー File->Settings.. を開く
\+ Install タブを開く

- atom runner の日本語が文字化け対策
メニュー File->Init Script... を開き
process.env.PYTHONIOENCODING = "utf-8"
と1行追加
[C#] 安全にディレクトリ/ファイルを探索する(サブディレクトリも) その2

この記事は、[安全にC#でファイルを検索する(サブディレクトリも)](https://qiita.com/ikutana/items/170354c0e002f00d3d5a)の続編的記事です。
***
#安全にディレクトリを探索する
.NETは便利なのですが、ディレクトリを深堀りするのに
-Directory.GetDirectories()
-Directory.EnumerateDirectories()
という二種類のメソッドに、SearchOption.AllDirectoriesをつけてやればできるのですが、残念ながら、権限がないと落ちるので、使えない子です。

##今までの手法
よくある手法に再帰を使うというのがあります。基本といえば基本です。が、再帰でシンプルに書ければ意味はあるのですが、再帰にしなければ複雑になるというのでなければ、再帰は使いたくないわけです。なぜなら、再帰はメモリを消費していくから。

##ちょっと冴えた方法
というわけで、[私の以前の記事]( https://qiita.com/ikutana/items/170354c0e002f00d3d5a )に書いた手法ですが、
Processに"cmd /c dir \"{DirectoryName}\" /a:-d /s /b"
を渡してしまうという方法です。ただ、これだとWindows限定になってしまいます。
.NET Frameworkから.NETに移行しようというこの時代にこれではいけません。

##というわけで、Queueを使う
Queueです。キューと読みますが、要はFIFOバッファです。
Queueにこれから探索対象ディレクトリをぶっこんでやって、Dequeue(取り出し&削除)しながら、下位ディレクトリを返す&探索対象にする。ってのを、キューが空になるまでやるわけです。
本当は、tryを使わずにアクセス権を確認できればいいのですが、ACLを取得してとなるとまた移植性に問題が出てきそうになるので、今回は無視します。

後、メソッド名から分かる通り、EnumerateDirectoriesと同じ返し方をしています。
深堀りすると時間がかかるので、メソッドが60秒以上何も返さなくてデバッガに怒られる事があるのでちょっと嫌なんですね。
(いまや、互換性以外でGetDirectoriesを使う理由がほぼないのだけど)
ファイルの探索は、このディレクトリの結果をもとに、EnumerateFilesすれば良いと思います。

```csharp:EnumerateDirectoriesSafer.cs
using System;
using System.Collections.Generic;
using System.IO;
namespace EnumerateDirectoriesSafer
{
    class Program
    {
        static void Main(string[] args)
        {
            var ed = EnumerateDirectoriesSafer("/");
            Console.WriteLine("Start");
            foreach(var d in ed)
                Console.WriteLine(d);
            Console.WriteLine("Finish!");
        }

        static IEnumerable<string> EnumerateDirectoriesSafer(string SearchRootDirectory)
        {
            Queue<string> DirectoriesToSearch = new Queue<string>();
            DirectoriesToSearch.Enqueue(SearchRootDirectory);
            while(DirectoriesToSearch.Count!=0)
            {
                var ThePath = DirectoriesToSearch.Dequeue();
                if (Directory.Exists(ThePath))
                {
                    yield return ThePath;
                    try
                    {
                        var Children = Directory.EnumerateDirectories(ThePath);
                        foreach (var Child in Children)
                            DirectoriesToSearch.Enqueue(Child);
                    }
                    catch
                    { }
                }
            }
        }
    }
}
```
pythonで書くガチャ-おまけ付きレアリティ確定-

#内容
**「11連SR以上1枚確定ガチャ」**
実際のソーシャルゲームでは、このような10回分のコストを一度に使うことにより、一定レアリティ以上のおまけが付くガチャが定番です。
前回のガチャロジックをベースに、実現する方法を考えてみます。
[Pythonで書くシンプルなガチャロジック](https://qiita.com/saib-ryo/items/dffb3ab05762cdc26da0)

```python
# 抽選対象のアイテムIDと重みのdictionary
item_dic = {"id_1":1,"id_2":5,"id_3":14,"id_4":30,"id_5":50}
```
id_1〜4までを**おまけレアリティ確定**の対象と考えてみます。

##２回に分けて実行してマージする
```python
# 抽選対象のアイテムIDと重みのdictionary
item_dic = {"id_1":1,"id_2":5,"id_3":14,"id_4":30,"id_5":50}
# 抽選回数
times = 10

item_list = gacha(item_dic,times)

# おまけ抽選対象のアイテムIDと重みのdictionary
sp_item_dic = {"id_1":1,"id_2":5,"id_3":14,"id_4":30}
# おまけ抽選回数
sp_times = 1

item_list.extend(gacha(sp_item_dic,sp_times))
```

作成したgacha関数をそのまま使った、簡単な実現方法です。
ただ、コードの通り**呼び出し側に冗長な処理が記述される**ことになります。
そこで、処理のgacha関数への内包を試してみます。

##gacha関数の改修を試してみる
gacha関数にパラメータとして、どのような情報が必要かを考えてみます。
前提として、今回のガチャ対象アイテムの一部がおまけ抽選の対象とします。
また、おまけは一つと固定にします。

おまけ抽選に必要な情報は、その対象となるIDのリストと抽選回数になります。
まずは単純にパラメータを追加してみます。

- sp_item_ids：おまけガチャの対象となるIDのリスト

また、おまけがないガチャも実行できるように、
追加したパラメータには初期値をセットしてみます。

```python
def gacha(item_dic, times, sp_item_ids=[]):
    total_weight = 0
    sp_total_weight = 0
    sp_item_dic = {}
    for item_key,value in item_dic.items():
        total_weight += value
        if len(sp_item_ids) > 0:
            if item_key in sp_item_ids:
                sp_total_weight += value
                sp_item_dic[item_key] = value

    results = []
    for i in range(times):
        results.append(lottery(item_dic,total_weight))

    #おまけガチャ
    if len(sp_item_dic) > 0:
        results.append(lottery(sp_item_dic, sp_total_weight))
    return results
```
##改修したガチャを実行
```python
# 抽選対象のアイテムIDと重みのdictionary
item_dic = {"id_1":1,"id_2":5,"id_3":14,"id_4":30,"id_5":50}
# 抽選回数
times = 10

# おまけ抽選対象のアイテムIDのリスト
sp_item_list = ["id_1","id_2","id_3","id_4"]

item_list = gacha(item_dic, times, sp_item_list)
```
同じような結果が得られました。
しかし、gacha関数のロジックがとても煩雑化しました。
これでは、元々の別々にガチャを実行したほうがシンプルですっきりしています。

**改修の方向性が間違っていたと言えます**

##おまけ付きガチャ関数を作成
gacha関数を元に戻して、
新しくgacha_omakeという関数を作ります。

```python
# おまけ付きガチャ
def gacha_omake(item_dic, times, sp_item_ids=[]):
    item_list = gacha(item_dic, times)
    #sp_item_idsが存在したらおまけ付きガチャとする
    if len(sp_item_ids) > 0:
        sp_item_dic = {}
        for item_key,value in item_dic.items():
            if item_key in sp_item_ids:
                sp_item_dic[item_key] = value
        if len(sp_item_dic) > 0:
            item_list.extend(gacha(sp_item_dic, 1))

    return item_list

def gacha(item_dic, times):
    total_weight = 0
    for value in item_dic.values():
        total_weight += value

    results = []
    for i in range(times):
        results.append(lottery(item_dic,total_weight))

    return results
```
```python
# 抽選対象のアイテムIDと重みのdictionary
item_dic = {"id_1":1,"id_2":5,"id_3":14,"id_4":30,"id_5":50}
# 抽選回数
times = 10

# おまけ抽選対象のアイテムIDのリスト
sp_item_list = ["id_1","id_2","id_3","id_4"]

item_list = gacha_omake(item_dic, times, sp_item_list)
```

ガチャの処理そのものはgacha関数に任せて
通常ガチャと、おまけガチャを実行する処理のみを、切り出してまとめることにより
関数の持つ機能が明確になりました。
indexの仕組み


# MySQL のインデックスの使用の仕組み
インデックスは特定のカラム値のある行をすばやく見つけるために使用されます。インデックスがないと、MySQL は関連する行を見つけるために、先頭行から始めてテーブル全体を読み取る必要があります。テーブルが大きいほど、このコストが大きくなります。テーブルに問題のカラムのインデックスが含まれている場合、MySQL はすべてのデータを調べる必要なく、データファイルの途中のシークする位置をすばやく特定できます。これはすべての行を順次読み取るよりはるかに高速です。

# indexを貼る
rails generate migration add_index_テーブル名_カラム名をし、migrationファイルを作成します。

作成されたmigrationファイルの中身はこんな感じです。

```ruby
class AddIndexToテーブル名 < ActiveRecord::Migration
  def change
    add_index :テーブル名, カラム名
  end
end
```
indexに複数のカラムを設定する場合は

```ruby
add_index テーブル名, [:カラム名1, :カラム名2, ・・・]
```
と書けばオーケーです。

オプション
:name - インデックスの名前
:unique - trueを指定するとユニークなインデックス
:length - インデックスに含まれるカラムの長さ


参考
データベースにindexを張る方法
https://qiita.com/seiya1121/items/fb074d727c6f40a55f22

mysql公式リファレンス
https://dev.mysql.com/doc/refman/5.6/ja/mysql-indexes.html
公式リファレンスほんとに優秀...
Delphi10 でTwilio apiを叩いて発信＋ボイスメッセージ

#はじめに
ほぼ前回の記事の使い回しですが、 Twilio のapiを使って発信を行い
音声合成によるボイスメッセージを送ってみました。
全く同じソースでWindows、Android共に動作します。

#画面作成
以下の画面イメージの様に必要なコンポーネントを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625152/bdbc6f05-5d91-ebaf-69a5-49d3c9a86d4a.png)

#ソースリスト
```Pascal
unit rest1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, REST.Types,
  FMX.Controls.Presentation, FMX.StdCtrls, Data.Bind.Components,
  Data.Bind.ObjectScope, REST.Client, REST.Authenticator.Basic, FMX.ScrollBox,
  FMX.Memo, FMX.Edit;

type
  TForm1 = class(TForm)
    RESTClient1: TRESTClient;
    btn_send: TButton;
    HTTPBasicAuthenticator1: THTTPBasicAuthenticator;
    RESTRequest1: TRESTRequest;
    RESTResponse1: TRESTResponse;
    Memo1: TMemo;
    ed_message: TEdit;
    ed_account: TEdit;
    ed_token: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    ed_to: TEdit;
    Label5: TLabel;
    ed_from: TEdit;
    btn_dial: TButton;
    Label6: TLabel;
    ed_voice: TEdit;
    procedure btn_sendClick(Sender: TObject);
  private
    { private 宣言 }
  public
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.btn_sendClick(Sender: TObject);
var action : String;
begin
  HTTPBasicAuthenticator1.Username := ed_account.Text;
  HTTPBasicAuthenticator1.Password := ed_token.Text;

  RESTRequest1.Method := rmPost;
  RESTRequest1.Client := RESTClient1;
  RESTRequest1.Response := RESTResponse1;

  if Sender = btn_send then
    action := 'Messages.json'
  else if Sender = btn_dial then
    action := 'Calls.json'
  else
    exit;
  RESTClient1.BaseURL :=
      format('https://api.twilio.com/2010-04-01/Accounts/%s/%s',[ed_account.text,action]);
  RESTClient1.Authenticator := HTTPBasicAuthenticator1;
  with RESTClient1.Params do
  begin
    Clear;
    if action = 'Messages.json' then
      AddItem('Body',ed_message.Text)
    else if action = 'Calls.json' then
      AddItem('Twiml',
        format('<Response><Say language="ja-JP" voice="alice">%s</Say></Response>',[ed_voice.text]));
    AddItem('To',ed_to.Text);
    AddItem('From',ed_from.Text);
  end;
  RESTRequest1.Execute;
  memo1.lines.text := RESTResponse1.Content;
end;

end.
```
#実行
入力ボックスにパラメータを入れてDialボタンを押すと、スマホに着信しました。
ガイダンスメッセージの後で、着信画面のボタンを押すと女性の声で指定した
メッセージを読み上げてくれます。（日本語指定にすると漢字も読んでくれます。）
※最初はボタンを押すことに気が付かず、音声メッセージが流れないぞと
　さんざん悩んでしまいました。（恥）

画面下のメモコンポーネントにレスポンス内容を表示しますので、上手くいかない場合は
エラー内容を頑張って読み解いてください。
To:には携帯番号の頭に+81（日本の国番号）をつけています。
SMSの場合は先頭のゼロをつけても動作しましたが、発信の場合は先頭のゼロを
取り除いておかないと着信しませんでした。
llvm-mingw(clang) + ninja + cmake で Windows で self-contained な C/C++ 開発環境を整える

## 背景

Windows 10 64bit(x86) を想定します.

以下のような要望が多くあります.

* 手っ取り早く Windows で C/C++ 開発環境を整えたい.
* インターネットに接続できないなど, セキュリティ制限のある環境でも C/C++ 開発できるようにしたい
  *  C++ を, 幼稚園/保育園や小学校で教えるときなど
    * 一台の PC を共有して C/C++ を教えるときなど.
* CI ビルドなどでビルドを回したい
* msys とか, Visual Studio とか, インストールがめんどい
  * Visual Studio の場合, さらに Microsoft アカウント登録が必要になりめんどい
    * たとえば優秀な幼稚園児さまがアカウント取得する場合, 保護者(親権者)の承諾が必要となり, 優秀な幼稚園児さまがご自身で C++ を極めようとするのに向いていない.
  * インストールタイプの多くは, 管理者権限が必要
* clang を wasm でブラウザで無理やり動かすというのもあるが, 激重である.
* 最先端 C/C++ 開発環境の入った CD-ROM を売りさばいてがっぽがっぽしたい.
 
フォルダだけで完結(self-contained)すると, これらの問題が解決できます!

(CI で MSVC を使いたい場合, おまけのところに, MSVC compiler だけインストールする方法も書きました)

## 構成

* llvm-mingw(clang コンパイラ, lld リンカ): https://github.com/mstorsjo/llvm-mingw
* ninja https://ninja-build.org/
* cmake 

これだけです! これだけで最新かつ最先端の C/C++ 開発ができます!

### llvm-mingw

vlang が推奨していることで存在を知りました.

https://github.com/vlang/v/wiki/Installing-a-C-compiler-on-Windows

今までは, Windows で C/C++ 開発だと, MinGW(gcc) + msys が主流だったかとは思いますが, Windows runtime(thread, 例外周りなど)や MSVC なコードと相性が悪かったり, 特に dll やリンカ周りで問題が多かったりします.

TinyEXR のおかげで見つかった ld のバグは記憶に新しいところですね.
https://github.com/syoyo/tinyexr/issues/105

最近は llvm-mingw(clang + lld) の登場により, より Windows(MSVC)と親和性の高いツールチェインが良い感じになってきました.


clang 自体は Visual Studio のコンパイラとして使えたりなどしていますので, MinGW バージョン(コンパイラオプションが gcc 互換)の clang も十分品質が高いと想像できます.
 
実際, そこそこ複雑(MSVC 依存が多いようなコード)な production level のコードのコンパイルを試しましたが, 無事に動いてくれました. 
(ただ, 一部, thread とメモリアラインメント周りで `-O2` にしないとうまくいかない例もありました)

### ninja, cmake

インストーラー形式ではなく zip などの形式を落として使いましょう.

cmake で, `-G Ninja` として ninja でのビルドの generator を選択します.
mingw32-make と異なり, ninja の場合はなにか OS の機能(shell 機能)を使うわけではないようなので, 普通のコマンドプロンプトから動かすことができます!

## セットアップ

たんに zip を展開するだけです.
環境変数に llvm-mingw, ninja, cmake の PATH を通すといいかもですが, 多分通さなくても頑張ればうまくいけます.

シェルは Windows 標準のコマンドプロンプトや Powershell でいけます.
(mintty) bash や msys などを使う必要はありません(使ったほうがファイル操作はやりやすいですが).

## アンインストール

アンインストールもかんたんです!

フォルダを消すだけです :smile: 

## エディタは ...?

コンパイラとビルドはこれで整いましたが, エディタの問題が残ります.

最近ですと, **gvim** https://www.vim.org/download.php,  VSCode or Theia https://theia-ide.org/ が選択肢でしょうか.

## IDE は ...?

VSCode or Theia でしょうか.
Theia を使っている gitpod も気になりますね.

clangd を動かして C/C++ の intellisense っぽいのをやるのは VSCode ありますが, cmake & ninja のビルドのフローまで VSCode 上でできるでしょうか?

## おまけ

C++ Build Tools で MSVC 単体をインストールできました.

Visual StudioなしにWindows上でコンパイルする
https://www.infoq.com/jp/news/2016/12/vsbt/

Windows で MSVC ビルドツール (Build Tools) のインストール（Chocolatey を利用）
https://www.kkaneko.jp/tools/win/windows_vc15msbuildtools.html

ありがとうございます.

いろいろところころ名前が変わっているので, ご注意しましょう. 
2020/05/05 時点ですと, Build Tools for Visual Studio 2019 をインストールし, そこから C++ ツールをインストールします.
ダウンロード先はいろいろわかりにくいところにあります. 頑張って探しましょう(web サイトでは, まちがって Visual Studio をダウンロードしやすくなっているので注意です)

 
## TODO

* [ ] VSCode 内で,  cmake, ninja で Visual Studio っぽく IDE 上でのビルドフローが作れるか試す(cmake から `compile_commands.json` 吐けばいけるか?)
* [ ] Theia ベースで自前で C/C++ IDE 環境を作り, IDE + C/C++ コンパイル一式できる DVD パッケージを作成し, C/C++ トレーニングキットとして売りさばいてがっぽがっぽしたい.
「ノンデザイナーズ・デザインブック 第4版」の内容メモ

# 良いデザインの4つの基本原則
 - 1. 近接
    - 関連する項目を近づけて配置することでグループ化する
 - 2. 整列
    - 右揃えや左揃えなどを意識しページ上の項目に視覚的つながりを作る
 - 3. 反復
    - デザイン上の何かの特徴を作品全体を通して繰り返す
 - 4. コントラスト
    - 書体の選択、線の太さ、色、形、サイズ、スペースなどでコントラストをつける

1つの原則だけを使うということは滅多にない。

# 1. 近接
関連する項目を近づけて配置することでグループ化(組織化)する。近づけることで関係のある1個のグループに見えるようになる。
注意する点として、関連しない項目は離して配置し、関連しない情報同士は近づけてはならない。また、個別の要素を作りすぎてはいけない。

# 2. 整列
右揃えや左揃えなどを意識しページ上の項目に視覚的つながり(一体化と組織化)を作る。整列させることで、各要素間に自然と力強い透明な線が生まれ、離れていても情報が結び付けられ洗練された印象となる。
中央ぞろえを使う場合は、テキストの幅を変化させると強調され効果的に見せられる。
注意点としては、同一ページ上で2種類以上の文字そろえを用いないこと(特に中央ぞろえを用いる場合)。

# 3. 反復
デザイン上の何かの特徴を作品全体を通して繰り返す。太いフォント、太い罫線、ビュレットの種類、デザイン、色、フォーマット、配置などを反復して配置することで統一感が生まれる。

# 4. コントラスト
書体の選択、線の太さ、色、形、サイズ、スペースなどでコントラストをつける。コントラストをつけることで焦点が作り出され、ページに面白みを生み読者の目を引き付けることができる。また、ページの情報の組織化に役立つ。
コントラストをつける場合は、臆病にならず大きく違いをつけるようにする。12ptと14ptの文字でコントラストはつかない。

# 日本語を用いたデザインの注意点
日本語は英語と異なり縦にも横にも読むことができる。従って、英語と同様の行間にしてしまうと窮屈で読みづらいものとなるので、日本語を用いたデザインでは英語よりも行間を広く設定する必要がある(アルファベットを1とすると日本語は1.2倍程度)。

# 活字の協調・衝突
書体を一種類だけ用いるとデザインは協調的になる。協調的なデザインは比較的に落ち着いてフォーマルなものになる。
一方で、同じでも全く異なるわけでもない類似の書体を用いたデザインは、衝突を起こす。似たような書体同士は間違って配置されたように見えてしまう。

# 活字のカテゴリー(英語の場合)とコントラスト

 - Oldstyle
    - 尖ったペンで書いたような、手書き文字に基づいた書体。
 - Modern
    - 手書き文字の模倣でない、ストロークに極端な太さの推移などコントラストを持った書体。
 - Slab serif
    - 太さの遷移のほとんどない、全体的に太い書体。可読性に優れるが、Oldstyleに比べてページ全体が暗い印象になる。セリフを持つ。
 - Sans serif
    - セリフがなく太さが一定(例外あり)の書体。
 - Script
    - カリグラフィ用のペンや筆などの手書き文字に見える書体。
 - Decorative
    - 風変わりな書体。非常に目立つ。

活字でコントラストをつける場合には、サイズ、太さ、構造、フォーム、方向、色の6種類の方法がある。異なる書体を組み合わせる場合は、同じカテゴリーから選ぶのは避けたほうが良い。また、すべて大文字のワードの組み合わせは、効果的に用いることができる場合もあるが読みづらいため、できるだけ避けたほうが良い。
激重なリストの更新をアニメ処理無効化で軽くする

![list filtering example1](https://media3.giphy.com/media/eMDjNUmOj5BOYwI0d9/giphy.gif?cid=4d1e4f293f3729d16d3e97c42448cefdbc156bccddf0eb8c&rid=giphy.gif)

```swift
import SwiftUI

struct ContentView: View {
    private var items = Array(1...20)
    @State var word = ""
    var filteredItems: [Int] {
        word.isEmpty ? items : items.filter{"\($0)".contains(word)}
    }
    var body: some View {
        VStack {
            TextField("Search", text: $word)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .frame(width: 300)
                .padding()
            List(filteredItems, id: \.self) {
                Text("item \($0)")
            }
        }
    }
}
```

少ないアイテム数ならアニメーション/トランジション効果があっても問題はないが、アイテムが増えると重くなり最悪フリーズ状態に。

重くなる原因は表示変更の効果計算がアイテム毎に行われている為。

その計算を行わないようにする為に新たにリストを作り出して入れ替えるという形にすると瞬時に表示される。

具体的には`List{〜}.id(UUID())`と更新の度にユニークidを付加するだけ。

```swift
import SwiftUI

struct ContentView: View {
    private var items = Array(1...10000)
    @State var word = ""
    var filteredItems: [Int] {
        word.isEmpty ? items : items.filter{"\($0)".contains(word)}
    }
    var body: some View {
        VStack {
            TextField("Search", text: $word)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .frame(width: 300)
                .padding()
            List(filteredItems, id: \.self) {
                Text("item \($0)")
            }.id(UUID())
        }
    }
}
```

![list filtering example2](https://media2.giphy.com/media/kgsQs4YfSbMBe1hJfo/giphy.gif?cid=4d1e4f294b21171495f79eb83a758efeec4d207794888dea&rid=giphy.gif)

ネタ元: https://www.hackingwithswift.com/articles/210/how-to-fix-slow-list-updates-in-swiftui
ユーザー認証の簡単な仕組み

# ユーザー認証の仕組み
HTTPプロトコルでは1回目にリクエストした人が2回目に同じ人がリクエストをしてもそれを判断できない。
なので
ステートレスの状態である。（ログインしてるか、していないかという状態を持たないこと）


# セッション管理
ログイン認証が成功した時はサーバーが発効したセッションID（ユーザーの情報を暗号化）がブラウザのCookieにセットされ、それをサーバーに渡す事で次回以降ログイン済みであるのかを判断する

電球Cookie（ブラウザに小さなデータを保存しておける機能）サイトのURLごとに紐付けて管理

![8f344bc43c5fd308853c66dc3e2ace58.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492881/d2163c7b-625e-420c-7f18-89d04ac89a0e.jpeg)
VPC作成 〜 パブリック・プライベートサブネットを作るまでの手順②

[VPC作成 〜 パブリック・プライベートサブネットを作るまでの手順①](https://qiita.com/kanadeee/items/527e7ea4daed36b396fe) の続きです。

# 前回までのあらすじ
**【最終的にこうしたい】**
![aws-Page-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/c3a1a9d7-3bcf-9d02-e01f-b525a081a644.png)

----
**【今の状態はこんな感じ】**
![subnet4_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/f97ac78f-e252-f7dd-eae4-e644dd039f36.png)

## インターネットゲートウェイの作成
**1.　サイドバーの[インターネットゲートウェイ] をクリック**

**2.　[インターネットゲートウェイの作成] をクリック**

**3.　名前タグに任意の内容を入力し、[作成] をクリック**

**4.　インターネットゲートウェイID のリンクをクリック**
インターネットゲートウェイが無事に作成されたことを確認できます。

## インターネットゲートウェイをVPCにアタッチ
先ほど作成したインターネットゲートウェイの状態は[detached] になっており、どこにも紐づいていません。
今回作成したVPCにアタッチします。

**1.　先ほど作成したインターネットゲートウェイを選択し、[アクション] をクリック**

**2.　[VPCにアタッチ] をクリック**
![スクリーンショット 2020-05-02 22.51.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/5da3fefe-4f0f-3eb4-7a6c-dd483e6c7dba.png)

**3.　プルダウンから紐付けたいVPCを選択し、[アタッチ] をクリック**

**【今の状態はこんな感じ】**
![igw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/fed6ccb8-5901-7ce5-e00e-1b9c107b6f8b.png)

## ルートテーブルの作成
ルートテーブルはVPC内の通信にルーティング設定を行う機能です。
あとでサブネットにくっつけるため、作成します。

**1.　サイドバーの[ルートテーブル] をクリック**

**2.　[ルートテーブルの作成] をクリック**

**3.　以下を設定し、[作成] をクリック**

- 名前タグ：ルートテーブル名 (任意の内容でOK)
- VPC：今回作成したVPCを選択

**4.　ルートテーブルID のリンクをクリック**
ルートテーブルが無事に作成されたことを確認できます。

## ルーティング設定の追加
VPC内の通信がインターネットと通信できるようにするため、ルーティング設定を追加します。

**1.　[ルート] タブをクリック**

**2.　[ルートの編集] をクリック**
<img width="950" alt="スクリーンショット 2020-05-02 23.00.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/b87fb043-77fc-1d32-fe7f-9d1fd8af5dc6.png">

**3.　[ルートの追加] をクリック**

**4.　以下を設定し、[ルートの保存] をクリック**

- 送信先：0.0.0.0/0
- ターゲット：先ほど作成したインターネットゲートウェイを選択

**5.　[閉じる] をクリック**
**【今の状態はこんな感じ】**
![igw2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/097e26e2-8e1f-cd19-15e2-b50bf07b0a8a.png)

## ルートテーブルの関連付け
先ほど作成したルートテーブルは、今どこにも紐づいていない状態です。

今回は各アベイラビリティゾーンの片方のサブネットをインターネットと通信できる状態( = パブリックサブネット)にしたいので、紐づける設定をします。

**1.　サイドバーの[サブネット] をクリック**

**2.　紐付けたいサブネットを選択し、[ルートテーブルの関連付けの編集] をクリック**
![スクリーンショット 2020-05-02 22.49.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/d3cc7a59-d3a1-147a-dfd8-1fdfa4a8c531.png)

**3.　[ルートテーブルID] のプルダウンから先ほど作成したルートテーブルを選択**

**4.　[保存] をクリック**

**5.　ルートテーブルが紐づいていれば問題なし**
![スクリーンショット 2020-05-02 23.03.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/e54d57ab-43ed-54be-ff9d-b53b18689673.png)

----
完成しました！
![aws-Page-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/c3a1a9d7-3bcf-9d02-e01f-b525a081a644.png)

このあとはサブネット内にEC2を置いてみようと思います。
[AWSコンソールからEC2インスタンスを作成する手順](https://qiita.com/kanadeee/items/cfdcffea3e47a0a71c98)

#参考
- [AWS Hands-on for Beginners 〜スケーラブルウェブサイト構築編〜](https://pages.awscloud.com/event_JAPAN_Hands-on-for-Beginners-Scalable_LP.html?trk=aws_introduction_page)
- [インターネットゲートウェイ - Amazon Virtual Private Cloud](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Internet_Gateway.html)
- [AWS認定アソシエイト3資格対策~ソリューションアーキテクト、デベロッパー、SysOpsアドミニストレーター~](https://www.amazon.co.jp/dp/B07TT1N73K/)
【Ruby】使ったメソッドの解説自分用

ヒント。
https://hengenjizai.com/2019/11/24/paiza-skillcheck/#toc_id_2_1
https://qiita.com/taruya/items/63b66eb50fc60e239141

##printメソッド
改行せずに出力してくれる。

```
n = gets.to_i
s = gets.chomp.to_s

n.times do
    print s => 改行せずに結果を横に並べて出力する。 
end
```

##countメソッド

入力例
asdfga

```
n = gets.to_s
puts n.count('a') #=> 2
```

##chompメソッド
文字列の末尾の改行しないようにしてくれる。
改行を取り除く。

```
line = chomp
```

##getsメソッド
文字列の入力を受け付ける。キーボードで入力された値を文字列として返してくれる。
(ユーザーがキーボードで入力した値を文字列として取得する。）

```
n = gets
```

##to_iメソッド
Stringクラスのメソッド。元となる文字列を整数に変換して返してくれる。

##to_sメソッド
文字列以外のオブジェクトを文字列に変換する。数字を文字列に変換したり、小数を変換するのに使用する。

##lengthメソッド
文字列の長さを持ってくるメソッド。
当然持ってくる変数は文字列に直す必要がある。

```
n = gets # nを文字列に直す
puts n.length
```
##sliceメソッド
文字列で指定された範囲を抜き出す。

```
n = gets.chomp  #今回はchompを使ってnを文字列にする
puts n.slice(0)

puts n.slice(0..3) #0~3番目の文字列を抜き出す
```

##splitメソッド

与えられたデータを指定の記号で分割し、配列として戻す。

下記はカンマで区切ってます。

```
line = "勇者、戦士,魔法使い"
p line.split(",")         #pメソッド、変数と一緒にsplitメソッドを使う。
```

##upcaseメソッド

文字を大文字にする。

```
n = gets
puts n.upcase #=>大文字になる
```

##splitメソッドとlengthメソッドの組み合わせ

文字列をsplitメソッドを使って、スペースのところで分割して単語の数を出力する。

splitメソッドとlengthメソッドの違いに注意。

```
str = "One cold rainy day when my father was a little boy he met an old alley cat on his street"
count = str.split(" ").length   
puts count
```

##splitメソッドとfor in文の組み合わせ

2つの整数a以上b以下の間の全ての整数を改行区切りで表示する。

```
n = gets.split(' ')   #getで標準入力で値を受け取り、空白を区切り文字にして配列として返す。
for i in n[0]..n[1]
  puts i              #putsメソッドで出力したあと改行をしてくれる。
end
```
「ミリジャン」の手役を組合せ最適化で求める

## これなに

「[「ミリジャン」の手役を自動で判定するアルゴリズムを改良しました](https://qiita.com/YSRKEN/items/dd033edbd0ddedbef98b)」を、Pythonで[組合せ最適化](https://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)を使って解いてみました。

## サンプルデータ

元記事のパターン2を使います。

```py
# パターン2
hands = ['春香', '千早', '美希', '真', '貴音', 'やよい', 'まつり', '真美', 'エミリー', '亜美', '桃子', '伊織', '育']

hand_unit_list = [
 {'member': {'伊織', 'エミリー'}, 'name': 'little trip around the world'},
 {'member': {'エミリー', 'まつり'}, 'name': 'Charlotte・Charlotte'},
 {'member': {'真美', 'やよい'}, 'name': 'わんつ→ているず'},
 {'member': {'千早', '春香'}, 'name': 'CRIMSON LOVERS'},
 {'member': {'美希', '伊織'}, 'name': "始めのDon't worry"},
 {'member': {'育', '伊織', '桃子'}, 'name': 'きゅんっ！ヴァンパイアガール'},
 {'member': {'真', '伊織', 'やよい'}, 'name': '待ち受けプリンス'},
 {'member': {'美希', '伊織', '貴音'}, 'name': '99 Nights'},
 {'member': {'真', '真美', '春香'}, 'name': '咲きませ！！乙女塾'},
 {'member': {'美希', '千早', '春香'}, 'name': 'Fate of the World'},
 {'member': {'真美', '亜美', 'やよい'}, 'name': 'Funny Logic'},
 {'member': {'美希', '真美', '亜美', '伊織'}, 'name': '星彩ステッパー'},
 {'member': {'美希', '春香', '真', '千早', 'やよい'}, 'name': 'メリー'},
 {'member': {'美希', '春香', '真', '千早', 'エミリー'}, 'name': 'World changer'},
 {'member': {'伊織', '春香', '真', '真美', '亜美'}, 'name': 'Miracle Night'},
 {'member': {'美希', '貴音', '真', '真美', 'やよい', '亜美'}, 'name': 'ザ・ライブ革命でSHOW!'}
]
```

## 解いてみる

[組合せオークション問題](https://qiita.com/SaitoTsutomu/items/614aa24b4025d3f7cc73)として解いてみましょう。

```py
import pandas as pd
from pulp import lpSum
from ortoolpy import model_max, addbinvars, addvals
df = pd.DataFrame([hand_unit['name'] for hand_unit in hand_unit_list],
                  columns=['name'])
for hand in hands:
    df[hand] = False
for i, hand_unit in enumerate(hand_unit_list):
    for member in hand_unit['member']:
        df.loc[i, member] = True
addbinvars(df)

m = model_max()
m += lpSum(df.Var)
for hand in hands:
    m += lpSum(df[df[hand] == True].Var) <= 1
m.solve()
addvals(df)
print(df[df.Val > 0])
```

|    | name                         | 春香   | 千早   | 美希   | 真    | 貴音   | やよい   | まつり   | 真美   | エミリー   | 亜美   | 桃子   | 伊織   | 育    | Var     |   Val |
|---:|:-----------------------------|:-------|:-------|:-------|:------|:-------|:---------|:---------|:-------|:-----------|:-------|:-------|:-------|:------|:--------|------:|
|  1 | Charlotte・Charlotte         | False  | False  | False  | False | False  | False    | True     | False  | True       | False  | False  | False  | False | v000002 |     1 |
|  2 | わんつ→ているず              | False  | False  | False  | False | False  | True     | False    | True   | False      | False  | False  | False  | False | v000003 |     1 |
|  3 | CRIMSON LOVERS               | True   | True   | False  | False | False  | False    | False    | False  | False      | False  | False  | False  | False | v000004 |     1 |
|  5 | きゅんっ！ヴァンパイアガール | False  | False  | False  | False | False  | False    | False    | False  | False      | False  | True   | True   | True  | v000006 |     1 |

元記事と同じ結果が得られました。
Webサーバとアプリケーションサーバの違い


周辺知識
Rails開発におけるwebサーバーとアプリケーションサーバーの違い（翻訳） - Qiita
https://qiita.com/jnchito/items/3884f9a2ccc057f8f3a3

この記事が分かりやすかった。

Webサーバの代表例はapachやnginxなど
アプリケーションサーバの代表例はpuma、unicorn、Passengerなど

以下引用。

## Webサーバ

webサーバーはユーザーから送られてきた自サイトへのリクエストを受け取り、なんらかの処理を加えるプログラムです。そして、場合によってはあなたのRailsアプリケーションにリクエストを投げます。 NginxとApacheは最も有名なwebサーバーです。

## アプリケーションサーバ

アプリケーションサーバーはあなたのRailsアプリケーションを動かしているものです。 アプリケーションサーバーはあなたのコードを読み込み、アプリケーションをメモリに保持します。アプリケーションサーバーはwebサーバーからリクエストを受け取ると、Railsアプリケーションにそのことを知らせます。アプリケーションがリクエストを処理すると、アプリケーションサーバーはそのレスポンスをwebサーバーに返します。（そのレスポンスは最終的にユーザーへ届きます。
VPC作成  〜 パブリック・プライベートサブネットを作るまでの手順①

[AWS Hands-on for Beginners 〜スケーラブルウェブサイト構築編〜](https://pages.awscloud.com/event_JAPAN_Hands-on-for-Beginners-Scalable_LP.html?trk=aws_introduction_page) を進めているので備忘録です。
ハンズオン動画上のAWSコンソールと実際のUIがたまに違ったので、調べながらやりました。
#この構成をつくるぞ
![aws-Page-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/c3a1a9d7-3bcf-9d02-e01f-b525a081a644.png)

#作業手順
**1.　[AWSコンソール](https://console.aws.amazon.com/console/home) にログイン**

**2.　[VPC] と入力し、Enterキーを押す**

## VPCの作成
**1.　[VPCの作成] をクリック**

**2.　以下を設定し、[作成] をクリック**
![スクリーンショット 2020-05-02 22.23.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/5d2cdede-f4d0-ea74-01c3-6f98235af436.png)

- 名前タグ：VPC名 (任意の内容でOK)
- IPv4 CIDR ブロック：任意 (今回は10.0.0.0/16)

他の項目はとりあえずデフォルト値にしておきます。

**3.　 VPC ID のリンクをクリック**
VPCが無事に作成されたことを確認できます。
![スクリーンショット 2020-05-02 22.25.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/8695d606-7814-0abe-022e-04d44478a56a.png)

**【今の状態はこんな感じ】**
![vpc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/c00bb495-cec3-dbbb-85f5-74d2fa47dba8.png)

## サブネットの作成
**1.　サイドバーの[サブネット] をクリック**

**2.　[サブネットの作成] をクリック**

**3.　以下を設定し、[作成] をクリック**
![スクリーンショット 2020-05-02 22.29.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/b091f74e-3002-6395-1cc0-fb5e02f00fca.png)

- 名前タグ：サブネット名 (任意の内容でOK)
- VPC：先ほど作成したVPCを選択
- アベイラビリティーゾーン：任意 (今回はap-northeast-1a)
- IPv4 CIDR ブロック：任意 (今回は10.0.0.0/24)

**4.　サブネットID のリンクをクリック**
サブネットが無事に作成されたことを確認できます。
![スクリーンショット 2020-05-02 22.47.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/a756b3bb-bb81-4319-4b2e-ec4fb727ea6a.png)

**【今の状態はこんな感じ】**
![subnet1_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/aea16997-9d97-b789-fdef-e15098e5ce03.png)


各アベイラビリティゾーンに2つずつ、つまり全部で4つサブネットを作成します。
なので、あと3つサブネットを作ります。

**【今の状態はこんな感じ】**
![subnet4_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/f97ac78f-e252-f7dd-eae4-e644dd039f36.png)

なんとなくそれっぽくなりましたが、このままでは外部と接続ができない状態です。
インターネットゲートウェイを作成し、紐づけることによって解決できるので
[**次回**](https://qiita.com/kanadeee/items/daba7a84ac89eb89556c) はその辺りの設定をしていきます！
#参考
- [AWS Hands-on for Beginners 〜スケーラブルウェブサイト構築編〜](https://pages.awscloud.com/event_JAPAN_Hands-on-for-Beginners-Scalable_LP.html?trk=aws_introduction_page)
VSCode のターミナルを Git Bash に変更

# はじめに
VSCode (Visual Studio Code) のターミナルをデフォルトの PowerShell から
Git Bash に変更する方法を紹介します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296531/b2e705f8-18c9-68aa-3054-783da6faae4a.png)

# 環境
* [Microsoft Windows 10 Pro](https://www.amazon.co.jp/Microsoft-Windows-April-Update適用-パッケージ版/dp/B07765H5G4/ref=sr_1_4?ie=UTF8&qid=1538288847&sr=8-4&keywords=windows10%2Bpro&th=1)  

# 必要なもの
* [Visual Studio Code](https://code.visualstudio.com/)
* [Git for Windows](https://gitforwindows.org/)

# VSCode のターミナルを Git Bash に変更
`Ctrl + ,`のショートカットで、Settings 画面に移動します。
または、`File > Preferences > Settings` で移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296531/00975e2a-4bef-2360-7f7f-8cddb4008507.png)

Settings 画面に移動したら、

## <font color="Purple">【追記：2021/07/23】1.58.2 で確認すると設定項目が変わっていました</font>
検索欄に `Terminal.Integrated.Default Profile: Windows` を打ち込み、
`Git bash` を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296531/138f4520-123b-84ec-60c4-f295728a861c.png)

## 以前
検索欄に `terminal.integrated.shell.windows` を打ち込み、
`Edit in settings.json` をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296531/a39210d1-f3c2-b2d3-4a64-217e3695e150.png)

`terminal.integrated.shell.windows`に、インストールした Git Bash のパスを指定します。
通常は、"C:\\\Program Files\\\Git\\\bin\\\bash.exe" にあります。[^1]

↓編集前
![2020-05-04_21h37_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296531/f85c1ef4-5952-c14e-c418-858f819eb039.png)
↓編集後
※PATH の`\`は、画像のように`\\`と書いてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296531/62ef235e-9fa8-f603-3e28-e3bb62a15ff8.png)

# さいごに
`Ctrl + @`で開いたターミナルが bash になっていれば設定完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296531/825f0689-f875-fc67-7eab-284d655c5b8d.png)

[^1]: "C:\\\Program Files\\\Git\\\git-bash.exe" を指定するのは NG です。VSCode のターミナルを開いたときに、別ウィンドウで Git Bash が立ち上がってしまいます。
NutanixをREST APIで操作するその１

# NutanixをREST APIで操作するその1(準備)

* 大規模環境となると少なくとも自動化・スクリプト化の要件があり、今までperlやPowerShellなどのスクリプト、SNMPなどで行ってきましたが、最近REST APIの需要も増えてきているかと思います。
* REST APIってよくわからない状態から確認していきます。



## 目次

* 下記の流れでまとめます
  * PrismでREST APIを見てみる（今回）
  * PythonでREST APIを操作してみる（クラスタやVM情報取得)



## REST APIとは

* RESTは **RE**presentational **S**tate **T**ransferの略でWebシステムを外部から操作するための呼び出し規約(API)です。
* 雑に言うとURLを用いてシステムを操作（参照したり、更新したり）すること
* e-Wordを引用すると下記です

> RESTful APIとは、Webシステムを外部から利用するためのプログラムの呼び出し規約（API）の種類の一つで、RESTと呼ばれる設計原則に従って策定されたもの。RESTそのものは適用範囲の広い抽象的なモデルだが、一般的にはRESTの考え方をWeb APIに適用したものをRESTful APIと呼んでいる。



##  NutanixのREST APIその1：Prismで見てみるREST API

* Nutanixでは外部ツールなどの連携用にREST APIが公開されています。
* NutanixのREST APIはREST API Explorerから確認できます。 
* どういった値が取得できるか、どういった操作ができるか見てみましょう。
* [Prism] > [admin] > [REST APIエクスプローラ]
  ![img060.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543420/23504839-0860-12e6-853f-8be2bb9445c2.jpeg)


* REST APIエクスプローラの画面が表示されます
  ![img061.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543420/5f3ae5a7-e684-ed90-00bd-82b9edb3a493.jpeg)


* Nutanixでは複数のバージョンのREST APIが提供されています（ver0.8、ver1、ver2、ver3）
* 将来的にはv3のAPIをメインに使用する予定ですが、現段階ではv2が機能的に充実していると思います。用途に応じてv2、v3を使い分けましょう



## Nutanix REST APIがどんなことができるか見てみる

* REST API エクスプローラの画面

* カテゴリごととに行が区切られています。なんとなくできそうなことが見えてきます。

* aletsとかhostsとかvmsとか

  ![img062.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543420/a5033390-7c26-6118-07c9-a3b742363fc4.jpeg)




## REST APIで値を取得してみる

* 一般的（基本的）な操作としてVM情報を取得してみます。

* 単純にVM一覧を取得します。vmsの「Show/Hide」をクリックすると画面のようになります。

  ![img064.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543420/9e7e6be5-f7d5-7b66-c0b6-795b3ebafa86.jpeg)

* 一番上の「GET」（Get a list of Virtual Machines.の行）をクリックすると下記の画面になります。

  ![aimg060a.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543420/9d8dbd59-f272-39a4-ca8c-08f190c76154.jpeg)




* 上記の画面では実際にクエリを作成することができます。初めてだと分かりづらいですが、ひとまず、少しスクロールして「Try it out」をクリックします。

  ![aimg063.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543420/1667517f-2ea2-68ed-b576-78a84542e80d.jpeg)



* 「Try it out」をクリックすると画面が展開され、このREST APIの結果が「Response Body」に表示されます。この結果が各自の自動化やスクリプトで利用できるか検討します。

* もう一つ大事なところは「Request URL」です。このURLを指定すれば同じ結果が得られます。

* ですので、このURLをコピーして別のタブで見てみます

  ![img071.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543420/4d6d4617-7fa6-f652-5131-5f8dd843b444.jpeg)




* 上記のようにJSON形式でVM一覧が取得できます。以下のような情報がここでは取得できます。

  * VM名
  * vCPU数
  * メモリ数
  * UUID
  * その他、HAが有効か、GuestToolが入ってるかどうかなど。

* ひとまずREST APIでどんな値が取れるのかが分かったかと思います。

* 他には下記のような操作ができます。

  * VMの電源ON/OFF

  * Snapshotの取得

  * host情報の取得

  * SNMP情報の取得

  * alerts情報の取得など

  * 

    

## まとめ

* NutanixのREST APIでどのようなことができそうか、見れたかと思います。
* 個人的にはSNMPよりも使いやすいと思います。
* 次回はPythonでREST APIを使用して情報を取得してみたいと思います。
Power Automate - Excel - 行を更新する

Microsoft Flowから名前が変更されて生まれ変わったMicrosoft Power Automate。

まだリリースされたばかりであまり情報が出てなさそうですので、自分で試行錯誤して分かったことなどをまとめていきます。

Power Automateとは？や基本的な使い方は他にたくさん情報出てきますので、そちらを参考ください^^;

なお、2020/5/4現在の情報です。

今回はExcel Online(Business)の「行を更新する」アクションを見ていこうと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512887/6d0590db-48f4-4c77-5337-d5a86668adcb.png)
　※画面がなぜか英語になってしまっていますが気にしないでください

### 告知！
今回の内容を動画で公開しています。
文章では伝わりづらい部分も、動画なら分かりやすく見て頂けるかと思います。
またプラスアルファで内容を追加していますのでぜひお試しください。

動画はこちらです。
https://www.udemy.com/course/power-automate-dxrpa/?referralCode=E4AC928EDCFBE0F35365

### 行を更新する　アクションとは？
Excelアクショングループ（どう呼ぶのが正しいのでしょう？）の中で、最も基本的な操作です。
指定したファイルの中から、ひとつの行を選択し、その中の要素を更新するというものです。

・定刻になったら、エクセルに何かを記憶する
・他のアクションのをトリガーにして、エクセルに記憶する

といったケースなど、エクセルを使う連携する上での必須アクションかと思います。

##### 使い方
###### 1.ファイルを指定する
下の写真のように、位置、ライブラリ、ファイルと順に指定してください。
Locationはお使いのサービスで見え方が変わってくるかと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512887/8a8c9782-9caf-d1c5-4c69-654bd535548f.png)

###### 2.テーブルを選ぶ
選んだファイルの中にあるテーブルが一覧表示されるので選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512887/5de4f79d-3660-1264-7d4d-21433c480aa5.png)

テーブルを選択すると、そのテーブルの中のキー列が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512887/37985885-d8f8-ed87-7748-f542338c0670.png)


テーブルの作り方は別途記事を書きますね。

###### 3.キー列とキー値を選ぶ
これは絵で見た方が分かりやすいです。

たとえばこういうテーブルを選んだとして。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512887/422d238f-81e5-4235-d05f-e6ee26dc347c.png)

社員番号２の鈴木さんのデータ欄に100という値を入れたいとします。

その場合は、以下のように入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512887/cfc78576-be32-3fd1-c472-b9b7f1681083.png)

これを言葉で説明すると、
　・キー列とキー値を使って更新する行を特定
　・特定した行に対し、更新する値を入力
という考え方です。

これを実行すると、以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512887/06eebac6-0cb0-e840-14d1-62621aa7c081.png)


ちなみに、他の列の値も更新したい場合、そちらにも値をいれればOKです。

###### ちなみに
私が試した限りでは、キー自体は更新できないようです。
キーのある行（すなわち冒頭の行）をキー列に設定、
キー値をキーそのものにしましたが、「その値は存在しません」のようなエラーが出て指定できませんでした。

### まとめ
というわけで、以上が「行を更新する」アクションの使い方になります！

Excel系アクションの基本中の基本ですので、使いこなせると便利かと思います。
Herokuで更新 反映されない

##きっかけ
Herokuでデプロイして、更新したが反映されない

久しぶりに作りかけていた作成物を更新したので、Herokuで更新しようと

git add .
↓
git commit -m "コミットメッセージ"
↓
git push origin master
↓
git push heroku master

で更新して。んで、本番の挙動確かめたら、js効いてないってか更新されてない。

##学習したこと
デプロイあんまわかってないし、久しぶりなのでプリコンパイルについて少し調べてみた。
まずアセットパイプラインについてはそういえば少し前にQiitaに書いていたことに気づく。なのでプリコンパイルってなんだっけ。

##precompile
アセットファイル結合されて、URLでアクセスできるようにするためにはプリコンパイルをする必要があって、
内容的には

app/assetsなどのディレクトリからファイルを探す
↓
ｊｓファイルやCSSファイルを展開
↓
それぞれを一つのファイルに連結&圧縮
↓
出来上がったファイルをpublic/assetsディレクトリに保存。
というざっくりだけど、今の所そーゆー認識です



####preconpileの実行

```ruby:ターミナル
$ bundle exec rake assets:precompile

```

そして上記のaddやらcommitやらしてpushしたらちゃんと更新されていました。

##まとめ
アセットパイプラインてか、デプロイてわかり辛いので数打って少しずつ勉強していきます。ご指摘などありましたらお願いします。
LINE bot で外出先から家電操作（2019年10月23日最新版) 　回路図についての補足




LINE bot で外出先から家電操作（2019年10月23日最新版) 　前編
https://qiita.com/llight/items/35c762179826c31b827f

こちらの記事について
念の為回路図について、解説しておきます。

高校レベルの物理の知識は前提とします。





# MOSFETについての説明
記事で紹介されている
2N7000　
IRFU9024NPBF
はMOSFETというFETの一種です。


<img width="393" alt="スクリーンショット 2020-05-04 19.21.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264607/b1b4629e-3d68-296c-a132-51b6615f7ffa.png">

MOSFETはG（ゲート）による電圧によってS(ソース）とD（ドレイン）に流れる電流を制御します。

MOSFETはn型とp型の２つあります。

n型（2N7000）　ではGの電圧がSより大きいときにオンとなり、SとDの間に電流が流れます。（スイッチのよう感覚）
p型（IRFU9024NPBF)　ではGの電圧がSより小さいときにオンとなります。

今回の
n型（2N7000）は左からD（ドレイン）/G（ゲート）/S（ソース）
となっていて、
p型（IRFU9024NPBF）は左から　S（ソース）/D（ドレイン）/G（ゲート）となってます。下図参照

<img width="330" alt="スクリーンショット 2020-05-04 21.36.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264607/1812c423-a5b0-8bc5-6259-f71217c7f3d6.png">
<img width="324" alt="スクリーンショット 2020-05-04 21.39.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264607/bff1be2d-e146-37a9-e679-e55e9cdc9b92.png">
図a

# 回路図の解説
<img width="977" alt="スクリーンショット 2020-05-04 21.25.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264607/06cd055c-e640-a5a6-68a5-03b210002095.png">
図A

このような回路図になっていました。
まず
n型（2N7000）はエンハンスメント型です。
エンハンスメント型はG（ゲート)に流れる電圧が０のとき、オフになるという構造です。
したがって
（i)GPIO17がLOWのとき

　n型（2N7000)はオフとなり、電流は流れないため
実質の回路は以下のようになります。

<img width="820" alt="スクリーンショット 2020-05-04 21.42.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264607/4779bc4e-d73a-3471-3311-3985458b8b57.png">
図B

したがってｐ型のG（ゲート）にかかる電圧は4.7kΩの抵抗に電流は流れていないため　５V
また当然　Sは５V
したがって　S　>　G とならないためオフとなり全体に電流はながれません。

（ii)GPIO17がHIGH(3.3v)のとき、
図Aにおいて、ｎ型のゲートの電圧がソース（GND)より大きくなるためn型のS−D間に電流が流れます。

このとき、ｐ型のゲートにはGNDの電圧がかかるため、S ＞　G　となるため
S-D間に電流が流れ、結果赤外線LEDに電流が流れます。

#注意点

回路図ではｐ型（IRFU9024NPBF）の真ん中がゲートのように感じますが、
実際IRFU9024NPBFは図aのようになっているため
配線には注意してください。

#最後に

私自身物理系の人間でもないため、
誤っているところがありましたらご指摘お願いいたいします。
UiPath Activity Creatorを使ってみる。（その６：nupkgの設定)

#このドキュメントの概要

　前回 はActivity Creatorでのスコープを持ったアクティビティの作成方法について見ていきました。
　今回はnupkgファイルの設定および出力方法について説明します。

#対象バージョン
　Activity Creator 2.2未満ではnuspecファイルを編集する方法がとられていましたが、2.2以上ではcsprojファイルにメタ情報を記述する方法がとられています。
　ここでは後者のcsprojファイルへの記述方法について見ていきます。

#メタ情報の設定
　それでは実際に自動生成されるcsprojファイルを見てみましょう。
　参照するファイルは、**プロジェクト名.Activities.Design.csproj** になります。
　基本的には以下ファイル中のPackageMetadataの注釈以下の要素を変更することによりnupkgのメタデータとして反映されます。

```Company.Product8.Activities.Design.csproj
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net461</TargetFrameworks>
		<RootNamespace>Company.Product8.Activities.Design</RootNamespace>
		<AssemblyName>Company.Product8.Activities.Design</AssemblyName>
    <PackageId>Company.Product8.Activities</PackageId>
  </PropertyGroup>
  <!-- Package Metadata -->
  <PropertyGroup>
    <PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
    <PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
    <Description>This package was generated using the UiPath VS Extension.</Description>
    <Authors>Company</Authors>
    <Company>Company</Company>
    <Copyright>@ 2020 Company</Copyright>
    <PackageTags>UiPath Activit𝗒</PackageTags>
    <PackageProjectUrl>https://docs.uipath.com/integrations/docs/how-to-create-activities</PackageProjectUrl>
    <PackageIconUrl>https://raw.githubusercontent.com/NuGet/Samples/master/PackageIconNuspecExample/icon.png</PackageIconUrl>
    <PackageIcon>packageIcon.png</PackageIcon>
    <AssemblyVersion>1.0.0.0</AssemblyVersion>
    <FileVersion>1.0.0.0</FileVersion>
    <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
  </PropertyGroup>
  <!-- Package Versions -->
  <PropertyGroup Condition="'$(Configuration)' == 'Debug'">
    <PackageVersion>0.1.0.$([System.DateTime]::UtcNow.ToString(MMddHmmss))</PackageVersion>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)' == 'Release'">
    <PackageVersion>0.1.0</PackageVersion>
  </PropertyGroup>
以下省略
```

#Publish
Designプロジェクトのアイコン上で右クリック→発行をクリックします。
初回時等プロファイルが作成されていない時のみ以下のダイアログが出てます。
![uac6-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/cf65eefd-1e10-4527-ec9b-04249a2b473a.png)

必要に応じて構成を変更して、発行をクリックします。
![uac6-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/2ca254d8-4084-b3b3-a305-2674440ad53d.png)

所定の場所にnukpgファイルが生成されます。

（おわり）

[その１](https://qiita.com/SuetakeYoichi/items/2bbd7affbbcf32e002c1)　[その２](https://qiita.com/SuetakeYoichi/items/e4383318bfc09de0db51)　[その３](https://qiita.com/SuetakeYoichi/items/29278e6b9c5621fd2358)　[その４](https://qiita.com/SuetakeYoichi/items/117126227867d580d590)　[その５](https://qiita.com/SuetakeYoichi/items/12369209ab6fc5807ddc)
OR-Toolsで巡回セールスマン問題を解く

## これなに

「[Watsonで巡回セールスマン問題を解く](https://qiita.com/makaishi2/items/78570f9283c0bc6c7e6c)」をOR-Toolsを使って解いてみました。

### OR-Toolsとは

Googleが作成した無料のOperations Research関連のライブラリーです。
OR-Toolsを使うと、[配送最適化問題](https://qiita.com/SaitoTsutomu/items/1126e1493ff601a858c9)や[巡回セールスマン問題](https://qiita.com/SaitoTsutomu/items/def581796ef079e85d02)を解くことができます。

参考：https://developers.google.com/optimization/routing

## 解いてみる

そのままだと、ちょっと面倒なので、ortoolpyのラッパーを使います。

```py
import pandas as pd
import matplotlib.pyplot as plt
from scipy.spatial import distance
from ortoolpy import ortools_vrp

url = 'https://raw.githubusercontent.com/makaishi2/sample-data/master/data/att48.csv'
df = pd.read_csv(url)[:30]  # 元記事に揃えて30都市にする
dist = distance.cdist(df.values, df.values).astype(int)
route = ortools_vrp(len(df), dist, limit_time=1)[0]
plt.figure(figsize=(6, 6))
plt.plot(df.x[route], df.y[route], 'bo-');
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/9bfdb62e-878b-61c4-c730-c79c7390961e.png)

計算時間1秒で、元記事と同じ結果が出ました（元記事の計算時間は、226秒）。

### 補足

OR-Toolsのアルゴリズムは近似解法です。`limit_time=1`をつけないと一瞬で解がでますが、若干精度が悪いです。
そこで、計算時間を1秒にすることで、元記事と同じ厳密解が得られています。

※ `dist`を整数にしていますが、OR-Toolsは距離を整数にしないといけません。
【Ruby】配列・ループ周りのメソッドまとめ

##例題

itemという配列に、下記の要素をこの並び順で代入して、pメソッドで出力する。

```
指定の文字を配列にする
item = ["ロングソード","ブレードソード","エクスカリバー"]
p item
```


##例題
配列の一番左要素をputsメソッドで出力する。


```
team = ["勇者", "戦士", "侍", "忍者", "魔法使い"]
puts team[0]
```
画像の複数投稿などで使える。



###lengthメソッド
配列の要素を数える。

putsが必要なことに注意。

```
weapon = ["木の棒", "鉄の棒", "鉄の剣", "銅の剣", "石斧", "エクスカリバー"]
puts weapon.length
```



###pushメソッド
配列の末尾に要素を追加する。

```
weapon = ["木の棒", "鉄の棒", "鉄の剣", "銅の剣"]
weapon.push("石斧")
p weapon
```

###配列の要素を上書きする

```
weapon = ["木の棒", "鉄の棒", "鉄の剣", "サビた剣"]
weapon[2] = "石斧"
p weapon
```


###配列の要素を削除するdelete_atメソッド
```
weapon = ["木の棒", "鉄の棒", "鉄の剣", "銅の剣"]
weapon.delete_at(2)
p weapon
```

["木の棒", "鉄の棒", "銅の剣"]

###for inメソッドと配列の組み合わせ

配列から要素を順に取り出して、「＊＊が現れた」と出力する。

```
enemy = ["スライム", "モンスター", "ゾンビ", "ドラゴン", "魔王"]
for i in enemy
puts "#{i}が現れた"
end
```


###要素の合計を計算する

要素を合計を計算した値を出力する。

```
numbers = [12, 34, 56, 78, 90]
sum = 0
for i in numbers
	sum += i
end
puts sum
```

もしくはsumメソッドを使い

```
puts numbers.sum
```
とすると簡単。

###配列をeachメソッドを使用して取得する
```
enemy = ["スライム", "モンスター", "ゾンビ", "ドラゴン", "魔王"]
enemy.each do |i|
    puts "#{i}が現れた"
end
```