OmniAICreator/Qiita-1.07M huggingface dataset:
AWS SDKをv1→v2にアップデートする

## 経緯

現在携わっているPJでAWS SDKを使用してるのですが、処理実行時に`java.lang.NoSuchFieldError: CLIENT_ENDPOINT`が発生するようになり、調べたところ、サービスによってライブラリバージョンv1とv2が混在していることが原因だったため、全てv2に揃える対応を行いました。
(cf. [Github issue](https://github.com/aws/aws-sdk-java/issues/2582))

## 前提

* ビルドツールはMavenを使用
* 利用サービスは以下
    * Cognito
    * S3
    * SES
    * SQS

## 概要・基本方針

v1とv2の基本的な違いは公式ドキュメント [AWS SDK for Java 1.x と 2.x の相違点](https://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/migration-whats-different.html)に記載されているのと、各サービスの主要な処理については[コードサンプル](https://docs.aws.amazon.com/code-samples/latest/catalog/code-catalog-javav2.html)が用意されています。
ただ、一度v1で実装済のものはいちいちコードサンプル確認せずとも、以下の要領でほとんどバージョンアップが可能でした。

### pom.xmlのdependency修正

* groupId：`com.amazonaws`→`software.amazon.awssdk`
* artifactId：`aws-java-sdk-{サービス名}`→`{サービス名}`
    (cf. つまずいたところ①)

※BOMを使用している場合、BOMにも上記ルールが適用できる(今回の対応の発端を踏まえると、複数サービス利用するならBOM使用した方が良さそう)

### 各種clientクラス名・初期化方法

* clientクラス名から"AWS"、"Amazon"がなくなり、単純に`{サービス名}Client`に変わっているのでクラス名を修正してインポート
* 初期化方法は`ClientBuilder.defaultClient()`→`Client.create()`に変更
    (cf. つまずいたところ②)


### 各種インスタンスの生成方法

* コンストラクタがprivate化されているため、staticな`bulder().build()`でインスタンスを生成する
* フィールドアクセスメソッドを`with属性名()`→`属性名()`に修正

### AwsResultクラスの名称変更

`{サービス処理名}Result`→`{サービス処理名}Response`に変更されているので、クラス名を修正した上でv2のクラスをインポートする

## つまづいたところ

### ①Cognitoのライブラリ

ライブラリの変更ルールは前述の通りなんですが、cognitoidpだけ、artifactIdは**cognitoidentityprovider**に置き換える必要がありました
(cognitoidpのv2も存在はしていて、バージョンがpreviewのまま4年近く放置されていたので一瞬焦りました。 →[Github issue](https://github.com/aws/aws-sdk-java-v2/issues/2278))


### ②ClientBuilder.defaultClient()

ざっとClientクラスを見ただけでは旧ClientBuilder.defaultClient()に相当するものが分からなかったため、一旦サンプルコードの通り実装したら見事にデグレました…
正しくはClient.create()で、よく見たら相違点ドキュメントにちゃんと記載ありました。

### ③SdkInternalListの廃止

v1ではリストを扱うにあたり、AWS SDK独自のリストを生成する必要があったのですが、java.util.Collectionで渡せるようになりました
(一瞬修正方針が分からず戸惑いましたが、これはナイス変更！)


### ④AwsResponse

AwsResponse(旧AmasonWebserviceResult)クラスにステータスコードをセットする方法について、v1では
1. デフォルトコンストラクタでHttpResponseインスタンス生成
1. setterでHttpResponseにステータスコードをセット
1. 上記をSdkHttpMetadata.from()に渡してSdkHttpMetadata生成
1. デフォルトコンストラクタでAwsWebServiceResultインスタンス生成
1. AwsWebServiceResultにSdkHttpMetadataをセット

とステップを踏む必要がありましたが、v2では


1. SdkHttpResponseにステータスコードをintで渡してビルド
1. AwsResponseに上記を渡してビルド

とかなり簡略化できるようになりました。
レスポンスコード毎の後続処理の挙動確認をMockを使用して行う場合にデータ準備がかなり楽になりました！



### ⑤S3関連

* v1ではS3のリクエスト用オブジェクトはコンストラクタで生成できていたのですが、v2では他と同様`builder().build()`で生成するようになりました
* ファイルアップロード`putObject()`について、v1ではリクエスト用オブジェクトにFileオブジェクトも保持していましたが、v2ではputObject()の第2引数のRequestBodyに持たせるようになりました
* ファイルの存在チェック`doesObjectExist()`に相当するメソッドがv2には見当たらなかったため、`getObject()`呼出時に`NoSuchKeyException`を捕捉してハンドリングするよう変更しました(これはイマイチ変更…)

### ⑥builder().build()の可読性問題

もともと値のセットをwith属性名()のチェーンでやっていたところに、builder()とbuild()の2つが追加になってさらにチェーンが長くなりました…
フィールドアクセスメソッドから"with"がなくなった分短くなっている＆フォーマッタである程度ネストが分かるよう綺麗にしてもらえるとはいえ、**セットする値もbuilderでビルドする必要ある場合は、変数に切り出し**た方が良いように思いました。
(特にSESはフィールド値をビルドする機会が多い)



## 参考

* [Mavenの依存関係を確認する方法](https://hacknote.jp/archives/24426/)
* [BOMプロジェクトとは](https://qiita.com/syogi_wap/items/432bbdbe9892eb05e122)
【VBA】空欄セルを残して重複削除

# はじめに
Excelで大量に重複削除をしたいというのがありました。
しかし、標準機能では**空欄セル**を残したまま重複が削除できません。

そのため、VBAを作成する必要がありました。
簡易的ではありますが、せっかくなのでこちらに残しておきます。

# VBAコード

:::note
現在開いているエクセルシートのA1の行から空欄を残して重複を削除するVBA
値を変更すれば任意の列の重複を削除できる
:::

```vb
Option Explicit

Sub duplication_delete()

Dim wb As Workbook  'Workbook
Dim ws As Worksheet 'Worksheet
Dim LastRow         '最終行
Dim i               'ループ用
Dim ConfValue       '値(確認元)

'現在開いているWorkbookとWorksheetを変数に設定する
Set wb = ActiveWorkbook
Set ws = wb.ActiveSheet

'現在開いてるエクセルの現在のシートのA列の最終行を取得
LastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row

'確認元の値(A2)
ConfValue = ws.Cells(2, 1).Value

'1～最終行まで繰り返す
For i = 1 To LastRow

    '確認元の値と現在の行の値が同じ場合
    If ConfValue = ws.Cells(i, 1).Value Then
    
        '現在の行の値、書式を削除
        ws.Cells(i, 1).Clear
    
    '確認元の値が空欄(値無し)の場合
    ElseIf ConfValue = "" Then
    
    'それ以外の場合
    Else
    
        '確認元の値を現在の行の値に置き換える
        ConfValue = ws.Cells(i, 1).Value
        
    End If
    
Next

End Sub

```
MySQLで複数カラムの変更を一文でまとめてやる

タイトル通りです。やりたいことはシンプルなのに、ネットでググって見つけた記事がどれも微妙にSQL文が違う上に、実際に叩いたら動かないんだが...ということが発生したので、メモです。

### ALTER TABLE文一文でカラムを追加したり削除したりする

```mysql
ALTER TABLE users 
ADD `name` text not null after `id`,
ADD `delete_date` datetime default null after `modified`;
```

```mysql
ALTER TABLE users 
DROP `email`,
DROP `status`;
```

などなど。
`,`の後に毎度`ADD`やら`DROP`やらを書いてやれば出来ました。
「プロになるJava」でJava入門したい人へ

# 概要
「プロになるJava」を読んだ感想と内容、おすすめできる人などを書いていきたいと思います。
かなり良い本だと思うので是非読んでいただきたいです。

# 前提
私はJavaの開発歴が1年ちょっとあるエンジニアです。すでにJavaに関してはProgateや「スッキリわかるJava入門」、その他教材、研修などで入門済みです。業務でもJavaを使っているのでこれらの視点から「プロになるJava」について書きたいと思います。

# 「プロになるJava」の概要
「プロになるJava」の構成ですが以下のようになっています。
+ Javaを始める準備
+ Javaの基本
+ Javaの文法
+ 高度なプログラミング
+ ツールと開発技法
+ Webアプリケーション開発

各章の章立てだけ見れば最後のSpring bootを用いての実践的な開発以外は”基本⇒文法⇒ツールの使い方”という一般的な流れですが、それぞれの章の中身の構成を見るとかなり他の技術書とは異なっています。

他の技術書ではJavaの基本を大まかに説明した後はコンソール表示、計算、条件分岐、繰り返し処理、メソッド、継承などの文法をまとめて紹介します。

しかし、本書ではこのような解説の流れとは異なり標準APIやSwing、ネットワーク、処理の高度なプログラムに関する説明が適宜入っていたりします。だからといって急に全く別の技術の話が入ってくるわけではなく前後の流れを意識したつくりになっています。（条件分岐、繰り返し処理の説明の後にすぐに継承の説明に入らず条件分岐や繰り返しを用いた難しい処理についての説明が入るなど）

またオブジェクト指向には深入りせず、オブジェクト指向自体の難しさと関数型プログラミングに触れたりなどしており最近の技術の流行などの説明もありました。

# 個人的な感想
まず一番はハンズオン形式で非常に読みやすくわかりやすいと感じました。ハンズオンではJShellを用いて逐次実行して結果を確かめられるのは手間がなく良かったと思います。また練習問題の難易度も易しいものが多く確認程度にサクサク進められるのも初心者にはありがたいつくりになっていると感じます。

また実践形式で書かれており、ばらばらにあった知識が一つの流れになって全体的な技術のつながりを感じられると思います。そのため、良くも悪くもあまり使われていない技術には触れていないです。匿名クラスなど実践的な内容からそれる文法には力を入れておらず説明は端的なものになっています。またスレッドなどの説明もありません。

他には実践形式を意識しているだけありデータベースとの接続やSQLについても記載されていてよいです。プログラマーを目指すのであればSQLは確実にマスターしたいので、本書では少し触れていたのでここもおすすめできる点だとおもいます。またGitについても記載があるのもよいです。

一方、全くの初心者には少し難しいと感じるかもしれません。実践的な流れで書いてありますが、その流れを理解し進むのはある程度文法などに理解があるとわかりやすいかもしれません。逆に言えば全くの未経験でこの一冊をやり切る力があればエンジニアの適正は抜群かもしれません。できないからと言って適性がないということはないです。わからなくなったら飛ばして読んだり、少し戻って復習しつつ進められれば問題ないです。

# 「プロになるJava」のメリット、デメリット
【メリット】
+ 実践的に書かれている。最後までやり切るとWebアプリケーションが一つ作れる。
+ ハンズオン形式になっており、理解していれば簡単に解ける練習問題も付属している。
+ データベース、SQL、Git、ビルドツールなどの知識もまとめて学べる。

【デメリット】
+ 実践的の裏返しだが体系的でない。
+ Javaの文法で詳しく触れていない部分がある。
+ 少し難しいかも…？（初心者が読めないほど難しいわけではない）

# 「プロになるJava」をお勧めできる人
以上のメリット、デメリットを踏まえて「プロになるJava」をおすすめできる人は
+ Javaを学びながら実際にWebアプリケーションを作ってみたい人
+ Progateやその他書籍、サービスで文法を学んだけど次に何をしたらよいのかわからない人
+ 最新のJavaや周辺ツール(Git,JUnit,Maven)、Spring Bootを理解したい人

逆におすすめできない人は
+ Javaを体系的に学習したい人
+ Javaの文法を詳しく学びたい人

# まとめ
本書はJavaやSpring bootについてマスターしている人以外にはかなりおすすめできる書籍だと思います。
是非「プロになるJava」でJavaのプロになりましょう！

ちなみにですが以下のURL先であるサムライズムから本書を購入するとIntelliJ IDEAのショートカットシート、並びに著者描き下ろしDukeのステッカーシートがもらえます。（自分は知らずに楽天で買っていしまいました。。。）
https://samuraism.com/jetbrains/projava
その他、紹介プログラムがあるので購入した方は使っていみるといいかもしれません。(これも自分は使っていないのでいないので紹介できないです。。。)
【DB2】システムカタログから特定テーブルのカラム名を取得する

# はじめに
アプリケーションサーバー側(Java)で、次の処理を行う必要が生じた。

**データベースサーバ(DB2)の特定のスキーマ.特定のテーブルに登録されている全カラム名を取得したい**

DB2を使った開発現場からはすでに離れてしまったのと、当時の走り書きと曖昧な記憶しか残っていないため、参考程度に備忘録を残しておく。
(もしかすると、SQLも細かいところで間違っているかもしれない)

# どうするか
スキーマ名とテーブル名を抽出条件として、SYSCAT.COLUMNSからカラム名の情報を取り出す。
```sql
SELECT COLNAME FROM SYSCAT.COLUMNS WHERE TABSCHEMA = 'HOGESCHEMA' AND TABNAME = 'TABLENAME'
```
アプリケーションサーバー側で上記のSQLを実行、検索結果のレコードを1件ずつ取り出していく。

# 参考
[SYSCAT.COLUMNS カタログ・ビュー](https://www.ibm.com/docs/ja/db2/9.7?topic=views-syscatcolumns)
ビューテンプレートについて

### パスとURLヘルパーメソッド
ルーティングを表示する際のPrefixの値+_pathなどとするとルーティングで定義したパスが取得可能になります。

以下例になります。

次のようなルーティングを表示した場合のprefix欄にあたる
**publisher**や**edit_profile**の名前を使ってURLやパスを生成できます。
```
Prefix Verd            URI Pattern                  Controller#Action

publisher  GET         /publishers/:id(.:format)    publisher#show

edit_profile  GET      /profile/edit(.:format)      profiles#edit
```

上記のPrefix値に_pathを付けると
ドメインやポートなどを除いた/から始まるパス部分を、
_urlとするとドメインなどを含んだ安全なURLを返します。

また、publsiherのようなパスの情報に「:id」といった変動する値がある場合は、引数にハッシュ形式で値を指定します。
コントローラーやビュー上では「edit_profile_url」などとするとURLを取得できます。
コンソール上で試してみたい場合にはappオブジェクトを使用することで確認することができます。
```
irb(main):001:0>app.edit_profile_url
=> "https://example.com/profile/edit"
irb(main):002:0>app.edit_profile_path
=> "/profile/edit"
```

### ヘルパーメソッドを活用する事例

#### url_for
url_forはWebアプリケーションのパスを構築するためのヘルパーメソッドになります。
文字列を書かずにルーティング上の定義を活用できます。
```
url_for(edit_profile_path)
=> /profile/edit
```

以下のようにコントローラとアクション名を指定したパラメーターから適切なパスを選択して出力することも可能です。
```
url_for(controller: :profiles, action: :edit)
=> /profile/edit
```

また、contorllerなどの特定のオプション以外の
パラメーターを追加することでクエリパラメーターを付与できます。

#### link_to
link_toはaタグを生成するヘルパーメソッド
url_forと同じよう_pathや_urlを利用してタグを生成できます。

```
link_to("リンクはこちら", edit_profile_path)
=> <a href="/profile/edit">リンクはこちら</a>
```

controllerを直接指定する場合
```
link_to("リンクはこちら", controller: :profiles, action: :edit)
=> <a href="/profile/edit">リンクはこちら</a>
```

#### form_with
フォームを構築するためのヘルパーメソッドになります。
使用するとモデルの情報をもとに送信URLや、対応するフィールドの内容を埋めたり、エラーを表示したりすることができます。
```
<%= form_with(model: book, local: true) do |form| %>

<処理内容>

<% end %>
```

#### time_ago_in_words
ある時刻と現在の時刻にどの程度で開きがあるのかをわかりやすく表示するヘルパーメソッドになります。
こちらはコンソールでも動作を確認することでできます。その時はhelperオブジェクト経由でメソッドを呼び出す必要があります。
```
irb(main):001:0:0> helper.time_ago_in_words(Time.current)
=> "less than a minute"
irb(main):002:0:0> helper.time_ago_in_words(Time.current + 3days)
=> "3 days"
```
githubにてコミット前の変更を取り消したい（元に戻したい）ときの対処法

# はじめに
謝ってファイルを消してしまった時などの対処法を記載します。
githubを用います。

## 対処法(コミット前の時)
githubにて、削除したとして記録されている変更箇所を右クリック→「Discard Changes...」をクリックすれば、変更をキャンセルできる。
【Rails】ルーティング【備忘録】


下記のようにlogout_pathのような[ルート名]_pathのように記述し、routes.rbにルートを記述するとlogout.hrml.erbを呼び出すことができる。
ルート名の確認方法は下記のコマンドrails routesで確認できる。
ルート名は,as:'ルート名'でエイリアスを設定できるが、デフォルトでは[コントローラ名]\_[アクション名]_pathのようになる。
```bash
$rails routes | grep 'home'
#ルート名　　　　　　　　URL                       コントローラ名#アクション名
root GET             /                         home#top 
home_top GET         /home/top(.:format)       home#top
logout GET           /home/logout(.:format)    home#logout
```
```routes.rb
Rails.application.routes.draw do
  devise_for :admin_users, ActiveAdmin::Devise.config
  ActiveAdmin.routes(self)
  resources :todos
  devise_for :users
  root 'home#top'
  get 'home/top'
  get 'home/logout' => 'home#logout' # ,as:'logout' で logout_pathでも呼び出せる
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
```

```home_controller.rb
class HomeController < ApplicationController
  def top; end

  def logout; end
end
```

```aplication_controller.rb
class ApplicationController < ActionController::Base
  # 新規登録後のリダイレクト先をマイページへ
  def after_sign_in_path_for(_resource)
    if current_user
      flash[:notice] = 'ログインに成功しました'
      todos_path # 　指定したいパスに変更
    end
  end

  def after_sign_out_path_for(_resource)
    flash[:notice] = 'ログアウトしました'
    logout_path
  end
end
```

```logout.html.erb　
<h4 id="notice"><%= notice %></h4>
<% if user_signed_in? %>
ログインしています

<h4>メールアドレス： <%= current_user.email %></h4>
<%= link_to "ログアウト",destroy_user_session_path, method: :delete %>
<% else %>
<%= link_to "トップへ",root_path,class:"btn btn-primary" %>
<% end %>
```
WEB開発をやり始めてみる(Ruby:ハッシュ)

# やったこと
```ruby:
### ハッシュの作り方
scores = {luke: 100, jack: 90, robert: 70}
puts scores 
{:luke=>100, :jack=>90, :robert=>70}

### eachを使った変数の代入と出力
scores.each { |k, v| puts v}
100
90
70

### eachを使った変数の代入と出力
scores.each { |k, v| puts "#{k}, #{v}" }
luke, 100
jack, 90
robert, 70

## if文を使った点数の指定以上だけを出力
scores.each { |k, v|
     if v >= 80
       puts "#{k}, #{v}"
     end
   }

luke, 100
jack, 90

 
scores.keys
 => [:luke, :jack, :robert] 
### each文で使う場合
scores.each_key do { key }
end


scores.values
 => [100, 90, 70] 
### each文で使う場合
scores.each_value do { value }
end

scores.has_key?(:luke)
 => true 
 scores.has_key?(:takahashi)
 => false 

scores.size
 => 3 
```
多くメモリ消費する高負荷計算の実行時間が遅くなる場合の対処法


`numpy`や`pandas`のオブジェクトを多数生成したりして、多くメモリ消費する高負荷で複雑な計算を実行した際、`timeit`で実行した際の実行時間よりも、普通に実行した際の実行時間が長くなるという現象が起きました。調べてみたところ、普通に実行した際にはガーベージコレクションが途中で作動していて遅くなっているということがわかりました。

下記の`timeit`のソースにあるように、ガーベージコレクションを無効にすることで解決しました。また、手動でガーベージコレクトするには、`gc` 標準モジュール[`collect`](https://docs.python.org/3/library/gc.html#gc.collect)関数が利用出来ます。

https://github.com/python/cpython/blob/3.10/Lib/timeit.py#L175-L182
Dynamics 365 で作業完了後に、顧客満足度のアンケートを送る 2022/10/15

## やりたいこと
お客様の声を手軽に集めるために、Formsを使って作業完了後にアンケートをメールやTeamsチャットへ送る

## 完成イメージ
作業が終わった後に完了となると、お客さまへアンケートをメールで送る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/5c434571-2bdd-9f8a-f3ac-cde265ae6d5a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/52e33ed6-0b44-4459-7917-ffcc4600a766.png)
アンケートがメールで届く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/cd506a6f-62de-1502-c775-773f7e1f353c.png)


## 設定手順
### アンケート作成
Dynamics 365 Customer Voice にサインインします。
https://customervoice.microsoft.com/

すべてのプロジェクト タブ、新しいプロジェクト を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/2bfd31c4-b08a-5560-fcf2-06648dd7b3b2.png)

アンケート作成場所を作りたいテナント環境でつくる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/cc591343-0889-a27c-53f0-3d846c503043.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/eb5e88bf-dcd0-a063-e1ac-e53d3d9fdc99.png)

### ワークフローで自動化を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/bcdcf5a3-62a0-29f2-b3d4-bcb6234bb3e6.png)

「Dynamics 365 で作業指示書が完了または終了したときに調査を送信する」テンプレートを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/adad9d7e-f950-9bff-3eab-8ec1fa8d3dc0.png)

追加設定不要で自動でワークフロー作成するため、保存を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/d021e03f-9707-2d8a-8640-f36759bc1443.png)

### テストする

作業指示書を完了にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/915b5306-4891-2205-fabf-37a9ca1084bd.png)

メール届く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/3d2b0da8-0d51-b08e-3fb9-909284e8bcdd.png)

アンケートを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/29776699-3b95-ebf2-1010-75f4093c2eed.png)

フローも正常確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/68b509fc-3ae6-e586-849f-8ebe941ca3f8.png)

### 以上

## 余談。詰まったところ
以下の手順でやるとプロジェクトがないよとエラー表示となり、ワークフロー設定ができません。
https://flow.microsoft.com に移動して、[Dynamics 365 で作業指示書が完了または終了したときに調査を送信する](https://us.flow.microsoft.com/galleries/public/templates/7135fe34812745d5af513437a7657002/send-a-survey-when-a-work-order-is-completed-or-closed-in-dynamics-365/ "Dynamics 365 で作業指示書が完了または終了したときに調査を送信する")というテンプレートを検索します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/88289857-1ea8-5a50-511c-af9045b0287a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/f3829354-2e53-e001-6da4-e691196d34f0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/92b94415-675b-a576-124d-5c7dccaa2daa.png)



## 参考手順

https://learn.microsoft.com/ja-jp/dynamics365/customer-voice/create-project


https://learn.microsoft.com/ja-jp/dynamics365/field-service/work-order-surveys
UbuntuのVim入力がおかしい場合は低機能版が原因かも

# 現象

1. Ubuntuのターミナルで ```vi ファイルパス``` でファイル編集。
1. でも入力した通りにならない。
1. 例えば、上矢印キー押すとAが入力されてしまう、右矢印キー押すとCが入力されてしまう、バックスペースキー押しても文字が消えない…といった症状。

# Vimのバージョン確認

端末で ```vi --version``` 。

下記のように『Small Version』と表示されたら、Versionが原因。
（低機能なVimがインストールされている）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/f185130e-4bd7-ca35-39fb-7a8f85dadbaa.png)

# 高機能なVimのインストール

端末で下記コマンド。

```shell
sudo apt-get install vim
```

事前にVimアンインストールやUbuntuの再起動は必要無し。

インストールが済んだら ```vi --version``` でVimのバージョン確認。
下記のように『Huge版』となっていればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/42c73496-afed-3e69-4f78-9edf4bd6fe07.png)

# 参考サイトさん

https://did2memo.net/2015/12/23/ubuntu-vim-install/

# バージョン

Ubuntu 20.04.5 LTS
XcodeでもマウスのボタンでGoBackしたい with Hammerspoon

# 動機
最近Xcodeを使い始めました。
しかし、関数の定義先へ飛んだあと、マウスの戻るボタンで元いた場所にカーソルを戻すことができません。
私は普段トラックパッドよりもマウスを使っているのでやや不便です。

# やりたいこと 
Hammerspoonを使い、5ボタンマウスの戻る進むボタンと、XcodeでのGoBack, GoForwardのキーバインドとを割り当てることでマウスで移動ができるようにします

# 手順
1. Hammerspoonをインストール

1. スクリプトを追記
    ```.hammerspoon/init.lua
    local function mousePress(eventobj)
      if eventobj:getButtonState(3) then
        -- 戻る
        hs.eventtap.event.newKeyEvent({'cmd','ctrl'}, 'left',true):post()
        hs.eventtap.event.newKeyEvent({'cmd','ctrl'}, 'left',false):post()
      end
      
      if eventobj:getButtonState(4) then
        -- 進む
        hs.eventtap.event.newKeyEvent({'cmd','ctrl'}, 'right',true):post()
        hs.eventtap.event.newKeyEvent({'cmd','ctrl'}, 'right',false):post()
      end
      
      return false
    end
    
    -- mousePress関数を割り当て
    override_mouse_button = hs.eventtap.new({25}, mousePress)
    
    -- Xcodeでのみマウスボタンを上書き
    hs.window.filter.new('Xcode')
        :subscribe(hs.window.filter.windowFocused,function() 
          override_mouse_button:start()
         end)
        :subscribe(hs.window.filter.windowUnfocused,function()
          override_mouse_button:stop()
         end)
    ```

1. スクリプトを再読み込み

# おわり
狙い通りマウスを使って戻る、進むといった移動ができました
eclipseからgithubリポジトリへのプッシュ時に「(https://XXXXX.git: 未認証)」

# 状況

eclipse で作成したプロジェクトをリモートリポジトリにプッシュ時に発生
github のユーザ名（メールアドレス）とパスワードを入れるとプッシュが出来ず、３回繰り返すと表題のエラーが発生

# 結論

**Personal Token が必要だったというだけ。**
元々 SourceTree で別プロジェクトを git 管理していたものの、トークンを作った記憶がなかったため選択肢に出てこなかった・・・
以下作成までの手順

# 手順

Github にログインし、右上のメニューから「setting」を選択
![スクリーンショット 2022-10-15 10.45.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/69bbfa4a-c134-5a81-baab-b6cb8e54ca0d.png)

左のメニューから「Developer setting」を選択
![スクリーンショット 2022-10-15 10.45.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/ba311ec1-97de-ec46-d376-47e12902dd4a.png)

左のメニューから「Personal access tokens」を選択
![スクリーンショット 2022-10-15 10.46.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/daa69fbd-98ae-105b-97fd-0af65fc81723.png)

「Generate new token」を選択
![スクリーンショット 2022-10-15 10.47.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/99c08ff6-c754-7448-2a47-5edaea0188e7.png)

画面の項目を入力する。
それぞれの内容は次の通り
>・Note
>　作成するトークンの名称。プロジェクト名とかにすると良いか
>・Expiration
>　作成したトークンの有効期限
>　個人の学習用としてなら無期限でもいいが、管理には注意すること
>・Select scopes
>　そのトークンに持たせる権限を選択する
>　リポジトリ操作をしたいだけなら 「repo」　を選んでおけばOK。
>　後ほど権限を修正することも可能なため、一旦上記を選んで、後ほど追加すればよい

![スクリーンショット 2022-10-15 11.03.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/b413f20d-e481-a1e1-71e1-81d4bdd678d8.png)
![スクリーンショット 2022-10-15 11.03.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/c3d9fc63-956a-8979-553a-3d89c579fa88.png)

画面下部の「Generate token」を選択
![スクリーンショット 2022-10-15 11.03.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/f3c15858-83ca-855b-4a97-fd9e835044b5.png)

画面上に表示される token をコピー、管理しておく（下記灰色で塗りつぶされた部分）
※token が見れるのはこのタイミングのみなので注意
　・・・とはいっても、もしわからなくなっても再発行するなり、新しく作るなりすればいいだけではある
![スクリーンショット 2022-10-15 11.04.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/24d09f57-52ca-928e-74b1-d73e946fe0eb.png)

あとはプッシュ時のパスワード部分に、tokenを入れればOK
![スクリーンショット 2022-10-15 11.13.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/11bdfe20-1af4-d99c-c40e-7164651e302c.png)

# 〆

久々に手を動かすと詰まりがちな認証周りですが、近年はこうした token などを利用したものが多いってことを忘れなければなんとかなるはず。
hostPath type check failed:　is not a directoryエラーの対処方法（type: Directoryの場合）


Kubernetes (k8s)のDeploymentにてローカルドライブのディレクトリをPVとして指定した際に以下のエラーでPodが作成されなかった。
```
MountVolume.SetUp failed for volume "local-jupyter-dir" : hostPath type check failed: /home/xxxxxx/k8s/jupyter/drive is not a directory
```

エラーメッセージでは指定したパスはディレクトリではないと言っているが、実際にはちゃんとディレクトリであり、かつhostPathのtypeとして"Directory"を明記していた場合には、このtype: Directoryをコメントアウトするとうまく動いた。

具体的にはdeploymentのyaml該当箇所を以下のように変更（コメントアウト）。

```
      volumes:
      - name: local-jupyter-dir
        hostPath:
          path: /home/xxxxxx/k8s/jupyter/drive
          # type: Directory　<-この行をコメントアウト
```
AWSの有益な資料、動画、教材、

# 概要
自分が読んだり見たり、聞いたりした中で有益だと思った資料や動画、
教材などをまとめて見ました。
良さそうなものがあったら参考にしてみてください。

# 前提
AWSエンジニアではないのですが、AWSエンジニアになろうと思っていた時期がありました。
なので自分で調べたりはしてきました。

どのようなルートでAWSエンジニアになるのかはご自身の判断でお願いします。

# AWSの基本
自分が書いたもので恐縮ですが、全く用語から何までわからない方は目を通してみてください。
Youtubeの動画などもリンクがあります。

https://qiita.com/Hashimoto-Noriaki/items/e9516c0f4f14849c1bb3

https://qiita.com/Hashimoto-Noriaki/items/1cb2324d67f217ef8aef

https://qiita.com/Hashimoto-Noriaki/items/202ab28412f640cb4fa8

# 基本の動画
この辺も見ておくといいかもしれないですね。

https://www.youtube.com/watch?v=kLXtqBkGvFE&list=PL-1KBX2gDRuiVHvgXJTvZxmQgIY8C7dlp&index=2

https://www.youtube.com/watch?v=KuR-lcoqrQY

https://www.youtube.com/channel/UCX30pfp4p82rIiSJmBygADw/videos

https://www.youtube.com/channel/UC-ghC1JUUkoyn3Z8aOBsF2w


# AWSのデプロイ
すごくわかりやすいので参考にしてみてください。

https://qiita.com/Yuki_Nagaoka/items/975b7598806d6ae0c0b2#-%E7%AC%AC2%E7%AB%A0-rds%E3%81%AE%E8%A8%AD%E5%AE%9A


# ハイクオリティの記事

https://qiita.com/toma_shohei/items/b7a001d26bd988d52021

# クラウドエンジニアロードマップ

https://qiita.com/KurokawaKouhei/items/3836802fc3a0286f668f

# AWSの認定試験を取るなら(Cloud tech)
AWSエンジニアのインフルエンサーの黒川さんが主催しているコミュニティです。

https://kws-cloud-tech.com/


# Cloud techアカデミー
AWSエンジニアのインフルエンサーの黒川さんが主催しているスクールみたいです。

https://www.youtube.com/watch?v=jeZvOk2seUc

# ルビコン塾
AWSの家庭教師みたいな感じみたいです。自分の知り合いも受けていたみたいですが、
かなりサポートは手厚いみたいです。

https://www.youtube.com/channel/UC-ghC1JUUkoyn3Z8aOBsF2w

# 有益なスクール(Raise tech)。Infracture as Codeが学べる
こちらのスクールの詳細はブログ記事で解説してありました。
自分もこのスクール出身ではありませんが、このスクールの講師の方から学びました。
このスクールは難易度はかなり高いですが、卒業すれば現場レベルまで上がるみたいで、
このレベルできるなら未経験でも現場来ていいと言われるくらい濃密なカリキュラムみたいです。
自分もやってみたかったと思いました。
興味ある方はこのスクールに問い合わせしてみてください。

```Infracture as Codeができるとかなり市場価値が上がります```。
***プログラミングやったことある人はいいかもしれないですね***!

https://raise-tech.net/?maf=2011_1403992.27498.0..1871487594.1665807503

https://www.ryukke.com/?p=9782
Swiftポケットリファレンスのメモ

### Swiftポケットリファレンスを読んだ後のメモ
[本のリンク](https://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E6%96%B0%E7%89%88-Swift%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-POCKET-REFERENCE/dp/4774196177/ref=asc_df_4774196177/?tag=jpgo-22&linkCode=df0&hvadid=295704876452&hvpos=&hvnetw=g&hvrand=11315013947549265090&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009225&hvtargid=pla-526262305170&psc=1&th=1&psc=1)
### iOSのレイア構造

|  名前  | 概要|フレームワーク|
| :---: | :---: |  :---:|
|  Application  |アプリ |
|  Cocoa Touch  | 画面タッチなどの機能|UIKit（画面構成やタッチ）<br>MapKit（地図関連機能）|
|  Media  | グラフィックス/オーディオ/ビデオなどの機能|AVFoundation（メディアの再生）<br>AVKit（メディア再生UI）<br>Core Image（画像加工）<br>Core Graphics（グラフィック関連）|
|  Core Services  | 内部データ/位置情報/センサーなどの機能|Core Motion（端末のセンサー）<br>Core Location（位置情報関連機能）<br> Foundation（データ管理）<br> LocalAuthentication（生体認証）|
|  Core OS  | iOS内のほぼ全ての機能の基本的な部分を管理|
|  Hard　Ware  |ハードウェア|

### iOSアプリの構造
アプリを起動するとアプリケーション全体を管理するUIApplicationオブジェクトが生成される、
UIApplicationオブジェクトは、AppDelegate.swiftで管理されるデリゲートに渡される
UIApplication
　　↪︎AppDelegate
 　　　　↪︎RooViewController

### Responder Chain　（レスポンダチェーン）
UIViewなどのオブジェクトを経由してUIApplicationまで到達することをレスポンダチェーという
イベントが最初に発生するオブジェクトをファーストレスポンダ（First Responder）と呼ぶ


### 特殊文字
String文字列に以下の特殊文字を含めることができる
特殊文字|概要
:---: | :---: 
\0|ヌル文字
＼＼　　|バックスラッシュ
\t|タグ
\n|改行コード（LF）MacOS X以降
\r|改行コード（CR）MacOS 9以前
\"|ダブルクオーテーション
\'|シングルクオーテーション
### 範囲演算子
演算子|例|概要
:---: | :---: | :---: 
...|a...b|aからbまで（bを含む）
..<|a..<b|aからbまで（bを含まない）

### アクセス修飾子
名前|概要
:---: | :---:
open|どこからでもアクセス可能
public|どこからでもアクセス可能、同一のプロジェクト外ではoverrideは不可
internal|同一のプロジェクト内のみアクセス可能（既定）
fileprivate|同一ファイルのみのアクセス可能
private|同一の定義の中飲みアクセス可能
override|スーパークラスから継承したメソッドの上書き
class|クラスメソッドとして定義
static|クラスメソッドとして定義、同一のプロジェクト外ではoverrideは不可

### 可変長引数
可変長引数とは引数を任意の個数に設定できる引数
``` swift
func total(num: Int...) -> Int {
    var s = 0
    for n in num {
        s += n    
    }
    return s
}
print(total(num: 1,2,3)) // Print [6]
```

### UIResponder
UIViewの上層クラスで、画面の接触や揺れのイベントを管理する
```swift
import UIKit

class SampleViewController: UIViewController {
    // このViewControllerがFirstResponderになれるようにする
    override var canBecomeFirstResponder: Bool {
        return true
    }

    // 揺れが始まった
    override func motionBegan(_ motion: UIEventSubType, with event: UIEvent?) {}

    // 揺れが止まった
    override func motionEnded(_ motion: UIEventSubType, with event: UIEvent?) {}

    // タッチ中
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {}

    // タッチ終了時
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {}
    
}
```
### UserDefaults
KeyValue型の形式で少量のデータの保存を管理する
大きなデータやファイルの書き出しはCoreDataを利用する
データの暗号化がされてない
自動テストを書くとき、書かないとき。テスト駆動開発をバズワードとして受け取らないために

今更テスト駆動開発がバズワードと言われるのも、結構時間が経ってるから違う気もするけど。

# バズワードとして受け取られるテスト駆動開発

自動テストって大事なんだけど、バズワードと感じてしまうのは、大事さが独り歩きして、踏み絵やチキンレースみたいになっている感じがするとき。

「えwwwwwww テスト書いてないの？ 開発者として終わってんじゃん。うちのシステムはめっちゃCI動いてるけどね」
「最近テスト駆動開発はじめたけど、マジで良いわ。単体テストからめっちゃテスト書いてるから、ちゃんとしてる俺マジエンジニア」

こういうこと感じのニュアンスでマウントをかけられると、イラッとする。そう言ってるあなた、どれほど仕事でテスト書いてるんですか、って思うし、テスト書く文化が形骸化していきそうな雰囲気を感じる。

# なんでテストを書かない時があるか

書けばいいじゃん、その方がエンジニアっぽいしって言うだろうけど、書きたくないときもある。

だって時間がかかるんですもの。

ちょっとしたテストでも、既存テストの拡張とかじゃない場合、1,2時間かかる。
（実はテスト慣れしていないっていうのが一番大きいんだけど、書いていない人が重い腰を上げるときは時間かかる）

コード書いたり修正するのが30分とかしかかかってない小さい修正なのにそんなかかるのは割に合わない感じがしてしまう。

特に機能拡張や修正したときに、既存コードにテストがなかったら、介護感があり、なお嫌だ。
自分の修正が30分で終わったのに、なんで既存コードのために4時間テストを仕込まないといけないのっていう。

特にそんな場面で、「単体テストから積み重ねて」とか言われると「うっせ！」って思ってしまう

# 自動テストは誰のため？


こんな愚痴を述べておきながら、やはりテストは大切だと思う。

自動テストが書かれるといろんなメリットがある

- テストで保証するものは仕様(spec)であり、変なコードを書いてもテストがそれを弾いてくれるため、テストが書かれたコードでユーザがバグを踏まないで済む
- 1回書けば、その仕様は、特にケアしなくてもそれ以降テストがその仕様を守ってくれる
- 将来修正されなさそうな1回限りのコードでも、誰かが手動で動作確認するコストを、テストコードを書くことで賄ってくれる

テストによって<開発者>の<心理的安全性>が保証されるため、開発者にメリットという言説もあり、もっともだが、
やはり、テストの根底にあるのは製品を守る、品質確保の意味が大きいと思う。

テストはユーザのためになるし、
もっと生々しく言えば、バグったときに痛手を被ったり、そうならないように動作確認を求められるPOにとって自動テストは大事と言える。
動作確認は本業以外の時間を結構持っていくし、もちろんケースが膨大なため漏れもあるからだ
（テストの時間が取れない場合、意思決定者であるPOのためであるっていうことを言うと、意外と納得されるかも笑）

仕様メインにしてしまうと、アイスクリームコーン問題が取りざたされる可能性はあるが、それでも製品の品質・仕様を守るという側面を強調したい

# 絶対自動テストを書いた方がいい場合

上記に書いたとおり、テストは品質を守るためのものだと私は考えている。
ただ、コストがかかる以上、無尽蔵に時間をかけられない。
特に既存システムが動いており、それらにテストが書かれていない場合はなおさらだし
全てのテストを手厚く守れるかというとそれもコストがかかるから難しい。

では、どこのテストは書かなければいけなく、特に手厚くしなければならないのか。

それは、バグったときの影響がやばいところである。

システムが止まる、売上に影響がある、信頼を失う。そういった影響が大きいところは是が非でもテストを書きたい。
その影響に比べたらテストを書くコストなんて安いもの、と言えるところは是非テストを書いたほうがいいだろう
（なんだったら、その点についてビジネスオーナーと話しても面白いかもしれない。ビジネスオーナーを守る堅固な城壁となるため、その人からの評価も上がるかもしれない）

テストを書くということは、その仕様を守っていきたい、という開発チーム、ひいては事業部、会社の意思表示であり、
大事な部分をコストをかけてまで守るという営みである。

そういった部分はぜひともコストをかける意思決定をしたい。

# テストを書かない場合

逆に言えば、バグっても「テヘ」で済むようなところには、私はテストを書かない可能性が高い笑。

極端な話、文言修正時に、そのテストを書くわけない。


『アジャイルソフトウェア開発宣言』に「完全なドキュメントよりも、動くソフトウェア」とあるが、神経症的にテストを課すのは、現代版の「完全なドキュメント」に近く、コストが上回ってしまう気がする。
SIerの誰も読まない膨大なドキュメントの日々のメンテみたいな感じで。

# この場合は手動動作確認で済ましちゃうかな


もう一つ、テストを書くかどうかを考えるときの観点は、手動動作確認のコスト。

「テスト書くの面倒じゃん」は言いやすいが、あまり表面化しないが、手動動作確認も意外と時間かかる。

- A. 複雑な条件を自分で準備しなければならない
- B. 1回の試行が一瞬で終わらない。5回やると疲労感感じるくらい(=0.5~1h)かかる
- C. 影響箇所が1箇所より多いと、試行回数が必要
- D. 重要な機能だと、間違ってはいけない、とプレッシャーがかかる
- E. 失敗すると、複数セット同じことを試す必要がある（A~Cの困難が複数セットのしかかる）


といったような、時間が膨れ上がる要因がある。

自動テストも時間かかるけど、手動動作確認してたら、思ったより時間がかかったという経験がある人も多いのではないだろうか。

なので私は
- 動作確認の準備がほぼかからず（A）
- 影響箇所が1箇所で(B,C)
- バグってもテヘで済む(D)
- 変更・追加した挙動がコードから自明にわかり（例: 文言修正）、失敗可能性がほぼない(E)

場合にはテスト書かないけれども、

それ以外の場合はテストを書こうかな、と思う。

# まとめ

テスト駆動開発はまだバズワード感が伴う概念であるが、
「テスト書かないと誰かになじられる」
「テスト駆動開発の名称通り、開発前にテストを書かねばならない」
といった強迫観念にとらわれるよりも、
MUSTでテストを書かなければならない場所にコストをかけていく姿勢をまずはやっていきたい
（慣れてきたら開発前にテスト書く、文字通りのテスト駆動もやってみようかな）
[Kintone]WSL2でVSCodeのLive Serverが反応しない時の対処法

会社の支給PCがWindows11で、開発環境の構築に苦戦しています。
今回はKintoneのJavaScript開発用にVSCodeのLive Serverの設定を試みていたのですが、プライベートのMacでは成功するのにWindows端末上のWSL2では動いてくれません。
試行錯誤の末ようやく動くようになりましたので、メモに残しておきます。

なお、今回はKintone開発のデバッグ環境構築を前提として話を進めます。

# 結論
mkcertのインストール先はwindows。pfxへの変換や証明書の登録など余計なことはしない。

# 手順

## １：Chocolatey （Windows用のパッケージ管理システム）のインストール
まずは公式に従ってWindows版mkcertをインストールします。
https://github.com/FiloSottile/mkcert#installation
```
$ Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
```

## ２：mkcertのインストール
`choco`コマンドで一発。
```
$ choco install mkcert
```
## ３：インストール先ディレクトリに移動してキーを作成
よくある一般的な方法です。
```
$ mkcert -CAROOT
C:\Users\pc10h\AppData\Local\mkcert

$ cd C:\Users\pc10h\AppData\Local\mkcert

$ mkcert localhost 127.0.0.1 ::1
Created a new certificate valid for the following names 📜
 - "localhost"
 - "127.0.0.1"
 - "::1"

The certificate is at "./localhost+2.pem" and the key at "./localhost+2-key.pem" ✅

It will expire on 15 January 2025

```

### ５：VSCodeに設定
```settings.json
(略)
    "liveServer.settings.https": {
      "enable": true,
      "cert": "\\Users\\pc10h\\AppData\\Local\\mkcert\\localhost+2.pem",
      "key": "\\Users\\pc10h\\AppData\\Local\\mkcert\\localhost+2-key.pem"
    },
(略)
```
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335316/fecf9420-0a45-2ceb-3a1a-e6a85adc5470.png)

以上終わり！
パブリック / プライベートサブネットを用いて AWS でかんたんな VPC を構築する

# 本記事の目的

* 以下記事の実質続きとなります。


https://qiita.com/shintaro-san/items/8c146f9bd199d04e41ff

* 以下のようなネットワークを構築してみる。前回の環境に対し、プライベートサブネットを用意する。

![vpc-image-002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/cd15edc0-7e88-9589-bd3e-64e36dfd48b3.png)

# 事前知識

* AWS のサブネットには「パブリックサブネット」と「プライベートサブネット」という概念があるらしい。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/configure-subnets.html

* 簡潔にまとめると、以下くらいの理解で良さそう。
    - パブリックサブネット：外部インターネットと通信可能
    - プライベートサブネット：外部インターネットと通信不可

# 手順

* まずはプライベートサブネットを作成。名前は subnet-002 で、範囲は 10.0.2.0/24 にしておく。

![subnet-002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/b6e088a2-d026-b7c0-a233-48918dbc7f4e.png)

* プライベートサブネット上にインスタンスを構築する。subnet-002 が割り当てられていることを確認し、「パブリックIPアドレスの割り当て」は無効化のままにしておく。

![instance-create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/58dd68e7-f815-18b2-14d4-8795ff1d96eb.png)

* デプロイした WindowsServer のプライベート IP アドレスを確認。今回は 10.0.2.43 が自動で割り当てられた。
![private-ip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/7b1b3ca0-a24e-c4c3-02d9-b8e602c5f966.png)

* パブリックサブネットの WindowsServer にアクセスし、リモートデスクトップのアプリを開く

![remote-desktop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/13515746-4caa-40fb-4005-6ebd4f98515f.png)

* 認証情報を正しく入力すると、プライベートサブネットの WindowsServer にアクセスできた。

![remote-desktop-002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/94a8eae9-1e15-18e5-ae6a-e013d7ae05c1.png)

# 終わりに

* もうちょっとルートテーブルの設定とか必要なのかな？と思っていたが、案外かんたんに実施できて拍子抜け。。
    - 「特定のインスタンスからだけ、プライベートサブネットへのアクセス許可」みたいな運用を目指すのであれば、ルートテーブルの設定とかは必要そう。
Qiita医療ハッカソンをハックするTeam AIのアプローチ集【Slack翻訳のKiaraより】

はじめに

![Screen Shot 2022-10-15 at 13.51.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76304/f4b899eb-37f9-b09e-25de-df0b72f56fff.png)
--- 
Team AI = 機械学習研究会

![Screen Shot 2022-10-15 at 13.52.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76304/45552ee0-60e3-82b3-97ac-6e2a4ca59aa2.png)
---
Why We Do

---
What We Do

(output)
![Screen Shot 2022-10-16 at 16.42.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76304/00383b8a-cc49-9648-72f6-443a2b523656.png)

...
![Screen Shot 2022-10-16 at 16.42.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76304/14049c14-d4dc-a461-49a2-4cef429cc727.png)

...
![Screen Shot 2022-10-16 at 16.42.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76304/74b5bf1a-e996-502f-e95b-6316d552e856.png)

...

---
how We Do

意思決定の仕方のコツ
- 大人数で決めすぎない。船頭が多いとハッカソンは勝てない。
- 仲間でいいが、大事な局面のためにリーダーを決めたほうがいい
- 完全な合議制で平均点のアイデアを出しても、審査員さんの心に響かない
- 成果発表時に審査員さんが感動して泣いてしまうような内容が理想的
- その為にはリーダーのパーソナルストーリーだとなおいい
- 逆にパーソナルストーリーを持っている人がリーダーをやるとUI/UXのYES/NOを即座に出せるのでPDCAは速く回る
AWS上でssh接続時にWARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! のエラーが出た時の対処法

# この記事を書いた背景
EC2で２つのインスタンスを立ち上げました。
その時にSSH接続をする際以下のエラーが出ました。

```
% ssh -i #今回は省略
```
するとこんなエラーが出ました。

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

#省略
```

# 原因
AWS上でサーバを作ったり消したりしていると同じIPアドレスでサーバが用意される事があるみたいです。

SSH接続時には、以前保存した情報といま接続しようとしているサーバの情報が一致しているかを確認することで、ユーザ（クライアント）が別のサーバへ接続してしまうことを防ぐ機能があるみたいです。
そのため、IPアドレスの振り直しやOS再インストールなどでホスト鍵が変わってしまった場合、エラーが出るみたいです。

# 解決法
これで解決しました。
```
ssh-keygen -R [IPアドレス]
```

```
% ssh-keygen -R 54.250.137.54
# Host 54.250.137.54 found: line 14
/Users/taro/.ssh/known_hosts updated.
Original contents retained as /Users/hashimotonoriaki/.ssh/known_hosts.old
```
これでエラーが出なくなりました。



# 参考資料
この記事を参考にしました。

https://cloud5.jp/ssh-host-id-changed-error/
ネットワーク管理

# 主なネットワーク管理技術
## SDN(Software-Defined Networking)
ソフトウェアによる```仮想ネットワーク技術の総称```。
```物理的なネットワーク構成や設定をソフトウェア制御によって論理的に変更する```技術。
拡張や資源管理が容易になる。

### 図
https://www.ntt.com/bizon/glossary/e-s/sdn.html

## OpenFlow
SDNを実現するための```標準化された実装技術```。
ハードウェアの制御機能とデータ転送機能を分離し得て抽象化し、```ソフトウェア的にネットワーク制御を一元管理```する。

# ネットワーク管理プロトコルSNMP
SNMP(Simple Network Management Protocol)は、```TCP/IPにおけるネットワーク管理を行うためのプロトコルの一つ```。
サーバやネットワーク機器（ルータやブリッジなど）、サービスの状態や稼働状況、トラフィックを監視することが可能。

## SNMPマネージャとエージェント
### マネージャ
管理対象を管理する側

### エージェント
管理される側

### 
それぞれで専用のアプリケーションソフトを動作させることで、メッセージをやりとりし、監視否定論理積行うことができる。```障害発生時にはエージェント側からの自発的に通知を行う```。

## MIB(Management Information Base)
マネージャとエージェントが持つ、```ネットワーク管理用のデータベース```

# ネットワーク管理ツール
## ping
TCP/IPネットワークにおいて、接続確認のために利用される。接続確認の仕組みは、指定したノードと自ノードとの間の```パケット返送の往復時間を監視```し、一定時間経過しても戻ってこない時は未接続と判断する。

## ipconfig
IPネットワークにおいて、ホスト名、最優先のDNSサフィックス、名前解決法、ネットワークのDNS、NIC名、MACアドレスなどの```設定情報を確認```できる。

## arp(address resolution protocol)
```IPアドレスによってMACアドレスを知る```ことができる。

## netstat
```ネットワークの通信状態(TCPコネクション)やルーティング状況などを確認```できる。

## 参考文献
https://www.sbcr.jp/product/4797396072/

# 出典 
https://gihyo.jp/book/2022/978-4-297-12375-8
【IntelliJ IDEA】jarファイル実行でエラーが出て、死にそうになった話。

多分、ビルドシステムとか統合開発環境に詳しい人には、何て事ない話なのでしょうが、解決に死ぬ程、苦労したので、備忘録として記載します。環境は、Mac M1です。

尚、Intellijを使わずに、ターミナルでJarファイルを構築方法は、こちら。
https://www.tech-teacher.jp/blog/java-jar/

IntelliJで、jarファイルを作成して、そのjarファイルを実行すると下記のエラーが発生。

```
UserX@UserX-mac HelloWorld_jar % jar -tf HelloWorld.jar 
Error: Invalid or corrupt jarfile HelloWorld.jar
```

IntelliJ上で、runすると、「プロセスは終了コード 0 で終了しました」と正常終了しているので、コード自体は間違ってないが、jarファイルが実行できていないと言う状況です。
![1015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/ef570b30-57bb-858c-144b-050c5e992018.png)

Jarファイルの中身を見ると、こんな感じ。
```
UserX@UserX-mac HelloWorld_jar % jar -tf HelloWorld.jar  
com/
com/example/
com/example/helloworld/
com/example/helloworld/HelloWorld.class
yonishik_jp@yonishik_jp-mac HelloWorld_jar % 
```

死ぬ程、調べました。（知っている人からすれば、拍子抜けでしょうが。）
下記サイトにソリューションが書いてありました。
https://programmerah.com/how-to-solve-error-invalid-or-corrupt-jarfile-32717/

＞So I tried a lot of methods first, and found that there is no META_INF folder in the jar package at all through comparison, which is the root cause of the jar’s inability to run;

要は、「META_INFファイルがJarフォルダーに内包されている必要があるとの事。」

そんな訳で、下記の手順に忠実に従って、Jarファイルを再作成した。

https://pleiades.io/help/idea/creating-and-running-your-first-java-application.html#run_jar_artifact

今度は、META_INFファイルが内包されております。
```
UserX@UserX-mac HelloWorld_jar % jar -tf HelloWorld.jar  
META-INF/MANIFEST.MF
META-INF/
Main.class
com/
com/example/
com/example/helloworld/
com/example/helloworld/HelloWorld.class
```

実行した。完了した。
```
UserX@UserX-mac HelloWorld_jar % java -jar HelloWorld.jar
hellokazu, world
```

以上。

尚、HelloWorldのJavaコードはこちら。
```
package com.example.helloworld;
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("hellokazu, world");
    }
}
```
cscの作法 その281

# 概要
cscの作法、調べてみた。
c#4には、async/await無いので、task.ContinueWith使ってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5a7bad39-cf0d-693f-9ba7-4ab9a7e2d624.png)


# サンプルコード

```

using System;
using System.Threading;
using System.Windows.Forms;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks;

namespace WindowsFormsApp4
{
	public partial class Form1 : Form {
		Button button1;
		public Form1() {
			button1 = new Button();
			button1.Location = new Point(30, 30);
			button1.Text = "test";
			Controls.AddRange(new Control[] {
				button1
			});
			button1.Click += Button1_Click;
		}
		private void Button1_Click(object sender, EventArgs e) {
			var progress = new Progress<int>(onProgressChanged);
			var task = Task.Run(() => {
				Waiting(progress);
			});
			//await task;
			//task.Wait();
			//MessageBox.Show("終わり！");
			task.ContinueWith(task1 => { 
				MessageBox.Show("終わり！");
			});
		}
		private void Waiting(IProgress<int> iProgress) {
			foreach (var i in Enumerable.Range(1, 5))
			{
				Thread.Sleep(1000);
				iProgress.Report(i * 20);
			}
		}
		private void onProgressChanged(int per) {
			Text = string.Format("{0}%", per);
			//this.Invoke(new Action(() => Text = string.Format("{0}%", per)));
		}
		[STAThread]
		public static void Main() {
			Application.Run(new Form1());
		}
	}
}





```

以上。
ESP32 のGPIOピンのクセ

ESP32のピン配置は結構自由に割り振れるのだが、調子に乗っていると起動モード用のピンにあたったり、出力しないなーと思っていたらINPUT専用のピンだったりのうっかりミスを起こしがち。
なので回路設計時には、いちいち「なんだっけ？ 」と資料を何回も見なくてもいいように、これを貼っている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/5c892e64-328c-14ff-7632-5d4d638f79fe.png)

改めて、知識整理のために記事化。

# 高精度Analog Inputピン

- SENSOR_VP は GPIO36 として入力に使える
- SENSOR_VN は GPIO39 として入力に使える

# GPIO34 ~ 39

- 入力専用
- PullUp/PullDown 回路は付属していない

## GPIO 6~11 

- ESP-WROOM32 の内蔵フラッシュに接続しているため、通常は使用できない


# ピン設定とブートモード

ブートに関係するピンは GPIO0,2,4,5,12,15。

|ピン|初期状態|Hi|Lo|
|:---:|:---:|:---:|:---:|
|GPIO0|PullUp|SPIブート|downloadモード|
|GPIO2|PullDown|downloadモード時、STDOからブート|downloadモード時、シリアルからブート|GPIO0:Loのときのみ働く|
|GPIO4|-|-|
|GPIO5|PullUp|SDIO Slaveモード時にFE Output に設定|SDIO Slaveモード時にRE Output に設定|
|MTDI(GPIO12)|Pulldown|flash供給電圧を1.8Vに設定|flash供給電圧を3.3Vに設定|
|MTDO(GPIO15)|PullUp|ブート時デバッグログをU0XDに出力しない/SDIO Slaveモード時にREsamplingに設定|ブート時デバッグログをU0XDに出力する/SDIO Slaveモード時にFEsamplingに設定|

## 備考

- GPIO2 GPIO0がHiのときにはGPIO2の状態は起動に影響を及ぼさない
- GPIO4 起動時の状態は検出するがここで検出した情報は現在使用していない。ユーザ側で情報を利用できる。
- GPIO5 SDIO Slave モードを使わず通常起動であれば起動に影響を及ぼさない
- GPIO12 ESP-WROOM32 の内蔵フラッシュは3.3VなのでLoに落として起動しないように注意

# テキスト
```
SENSOR_VP is GPIO36
SENSOR_VN is GPIO39
IO34 to IO39 are input only
Boot mode is GPIO0,2,4,5,12,15
when boot: 
GPIO0 Pulluped / when Lo to download mode
GPIO2 Pulldowned / when GPIO0 Hi and GPIO2 Lo to serial downlaod mode 
GPIO4 detectable , but no use
GPIO5 Pulluped / when SDIO slave mode, timing set
GPIO12 Pulldowned / MTDI / when Hi to flash voltage to 1.8V
GPIO15 Pulluped / MTDO / when Lo to suppress debugging log print over U0TXD

```

# 参考資料

「ESP32 Series Datasheet」
https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf
の「2.4 Strapping Pins」

「Boot Mode Selection - ESP32 -  &mdash; esptool.py latest documentation」
https://docs.espressif.com/projects/esptool/en/latest/esp32/advanced-topics/boot-mode-selection.html
WSL2環境のGitでp4mergeを使用する

# はじめに
WSL2環境でp4mergeを使用するときに設定に少し手間取ったのでメモ

# git configの設定

```bash:p4merge設定用 git configコマンド
// diffで使用するツールを指定
git config --global diff.tool p4merge

// difftoolで実行するexeのパスを設定
git config --global difftool.p4merge.cmd '/mnt/c/Program\ Files/Perforce/p4merge.exe $(wslpath -aw $LOCAL) $(wslpath -aw $REMOTE)'

// difftoolを実行した際に表示されるプロンプトを表示しないようにする設定
git config --global difftool.prompt false

// mergeで使用するツールを指定
git config --global merge.tool p4merge

// mergetoolで実行するexeのパスを設定
git config --global mergetool.p4merge.cmd '/mnt/c/Program\ Files/Perforce/p4merge.exe $(wslpath -aw $LOCAL) $(wslpath -aw $REMOTE) $(wslpath -aw $BASE) $(wslpath -aw $MERGED)'

// mergetoolを実行した際に表示されるプロンプトを表示しないようにする設定
git config --global mergetool.prompt false
```

.gitconfigがこのようになっていればOK
```gitconfig:.gitconfig
[diff]
	tool = p4merge
[difftool "p4merge"]
	cmd = /mnt/c/Program\\ Files/Perforce/p4merge.exe $(wslpath -aw $LOCAL) $(wslpath -aw $REMOTE)
[difftool]
	prompt = false
[merge]
	tool = p4merge
[mergetool "p4merge"]
	cmd = /mnt/c/Program\\ Files/Perforce/p4merge.exe $(wslpath -aw $LOCAL) $(wslpath -aw $REMOTE) $(wslpath -aw $BASE) $(wslpath -aw $MERGED)
[mergetool]
	prompt = false
```
Salesforceユーザは一括どこまで作成できるか検証してみた

こんにちは

今回はSalesforceシステム管理者が一括で作成できるSalesfroceユーザ数を検証しました。


今回の内容は動画でもまとめています

https://www.youtube.com/watch?v=lBjvfXSqrcc

<iframe width="560" height="315" src="https://www.youtube.com/embed/lBjvfXSqrcc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


「新規ユーザ」ボタンからは１ユーザしか作成できません

しかし「複数ユーザを追加」ボタンからは最大１０ユーザの自動作成は可能です

「最大」というのはその環境のライセンスが１０以上あれば最大１０以上作成可能です

ライセンスの残数は「組織」から確認できます


なお、今回の場合はSalesforce画面でのユーザ作成数は最大１０ユーザという話です


例えばデータローダを使用すればユーザを一度に何万も作成が可能です

詳細はこちらのヘルプをご確認ください

データローダによるユーザの挿入
https://help.salesforce.com/s/articleView?id=000327115&type=1
AWS AmplifyとReact を始めたメモ

Reactで作ったWebアプリをAWSで実行させたいと思って、AWSのチュートリアルをやったメモです。

参考にした情報
[AWS Amplifyの公式チュートリアル](https://docs.amplify.aws/start/)
[Amplify Docsのチュートリアルを 試してみる](https://note.com/cudhub/n/nba179d0b484b#344e7a9e-e347-45bc-b4b3-9874ffae8be6)
[AWS Amplifyの公式チュートリアルでToDoリストアプリ（React）をデプロイしてみた](https://dev.classmethod.jp/articles/i-tried-a-tutorial-on-aws-amplify-react/)
[AWS Amplify フレームワーク 入門メモ](https://qiita.com/rubytomato@github/items/5d9b6e184b615f974f28)

## チュートリアルを1回目に進めた時に、実行したコマンドなどのメモ
> npm install -g @aws-amplify/cli
> amplify configure
> npx create-react-app react-amplified
> amplify init
> npm install aws-amplify @aws-amplify/ui-react
> amplify add api
> amplify push
> amplify status
> amplify console api
> amplify console

App.jsの中身を置き換える

> npm start
> amplify add auth
> amplify push
> amplify console

App.jsに login UI を追記するが、チュートリアルの通りにするとエラーになるので次のURLの通りに更新する
https://note.com/cudhub/n/nba179d0b484b#344e7a9e-e347-45bc-b4b3-9874ffae8be6

> npm start
> amplify add hosting
> amplify publish

課金しないように削除（S3など全て削除される）

> amplify delete

## 2回目にチュートリアルを実行したメモ
> npx create-react-app react-amplified

アプリ実行を確認

> npm start

App.jsをオリジナルのコードに入れ替えて、再度アプリ実行を確認
```Javascript:App.js
import React, { useState } from "react";

function App() {
  const [ count, setCount ] = useState(0);
  const onPressMinusOne = () => {
    setCount(count - 1);
  };
  const onPressPlusOne = () => {
    setCount(count + 1);
  };
  return (
    <>
      <button onClick={onPressMinusOne}>-1</button>
      <div>{count}</div>
      <button onClick={onPressPlusOne}>+1</button>
    </>
  );
}

export default App;
```
> npm start
> amplify init
> npm install aws-amplify @aws-amplify/ui-react

src/index.jsにimportを追記
```Javascript:index.js
import { Amplify } from 'aws-amplify';
import awsExports from './aws-exports';
Amplify.configure(awsExports);
```
> amplify add api

上記コマンド実行すると amplify/backend/api/myapi/schema.graphql がVScodeで起動します

> amplify push
> amplify status
> npm start

今回は味見ですぐ消すのでauthentication抜きでデプロイします

> amplify add hosting
> amplify publish

コンソールに表示されたURLにアクセスするとWebアプリが表示されました
https://dev.***.amplifyapp.com
![スクリーンショット 2022-10-15 9.46.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298045/6d4d7cd3-a1c7-416d-ad54-701c344b2859.png)


最後にdeleteして片付けます

> amplify delete
> amplify status

以上
rsyncコマンド、mtコマンドについて

●rsync
ネットワーク経由でデータをコピーできるコマンド。
sshを利用して、安全に離れたホストとデータを同期できるので、バックアップによく利用される。

rsync [オプション] 送信元 送信先

rsyncコマンドの主なオプション

・-a アーカイブモード(-rlptgoDと同じ)。パーミッションや所有者情報など、ファイルやディレクトリの属性を保持したままコピーする。
・-e 転送方式を指定する(rsh,sshなど)
・-v 処理の詳細を表示する
・-z 圧縮して転送する
・—delete 送信元で削除したファイルやディレクトリは送信先でも削除する

※rsyncコマンドの転送方式はデフォルトでsshで暗号化して転送

■rsyncの構文の送信元や送信先の部分は、ユーザ名やホスト名などを細かく指定できる。
特に遠隔地にバックアップする場合、送信先についての情報が必要。

送信先（送信元）の指定：[ユーザ名@][ホスト:]ディレクトリ

●mtコマンド
テープドライブを制御するコマンド。磁気テープなどのテープデバイスを早送りしたり、巻き戻したりできる。
テープデバイスのデバイスファイル名はSCSI接続（1番目）なら/dev/st0もしくは/dev/nst0。
テープデバイスの規格にはLTO（Linear Tape-Open）などがあり、ファイルシステムのバックアップなど、大量のデータを保存するのに適している。

mt -f テープデバイス 操作

-fでテープデバイスを指定。
/dev/st0を指定した場合、データの読み書きでテープが自動的に巻き戻されます。
複数のファイルを読み書きしたい場合などは巻き戻ししない/dev/nst0をテープデバイスに指定します。

mtコマンドの主な操作

・fsf n nファイル分(EOF)分、テープをすすめる
・bsf n nファイル分(EOF)分、テープをもどす

●以下のいずれかの特殊ファイルを指定してデータの上書きを行う。
・/dev/zero：16進数のデータ「0x00」を生成する特殊ファイル
・/dev/urandom：擬似乱数を生成する特殊ファイル

例）
・dd if=/dev/zero of=/dev/sdc1
・dd < /dev/urandom > /dev/sdc1


一度書き込まれたデータは、削除操作の時点ではデータが消されるのではなく「データのない領域」という管理情報が設定されるため、「全ての領域を別のデータで上書きする」という方法が適切
Nuxt3.0.0 RC.11 yarn devでSSLを使いたい

## Solution
`nuxt dev --port=8000 --host=yourHostName --https --ssl-cert path/public.crt --ssl-key path/private.key`

## よくある間違い

.envに書いても無視される。
しかも、SSLはファイルパスを書いてもダメ。直接記述する必要がある。

```NG
NITRO_PORT=8000
NITRO_HOST=0.0.0.0
NITRO_SSL_CERT="public.crt"
NITRO_SSL_KEY="private.key"
```

### Nuxt3まだまだ なんか色々しんどいなぁ〜

参考

https://github.com/nuxt/framework/issues/3949
https://zenn.dev/anpan/articles/0ddc884a5e3c1c
【Laravel】Eloquent（エロクエント）とは

## Laravel独自のデータベース操作機能

簡単なコードを記述するだけで`Eloquent`がSQLに自動変換し
データベース（DB)を操作してくれる優れた機能のことです

## EloquentはDBを簡単に操作するための仕組み

WEBサイトと連携しているデータベースを操作する場合、本来ならば
SQL文が必要ですが、データ取得・データ保存・削除など
単純な操作が必要になった場合`Eloquent`を用いると
記述しなくてはならないコードが少なくなるため可読性が高まります。
デフォルトのコンポーネントを使わず AWS でかんたんな VPC を構築する

# 本記事の目的

* AWS においてデフォルトの VPC とかインターネットゲートウェイを用いずに、手元の PC から接続できる WindowsServer を用意するための手順メモ。
* イメージは以下の通り。
    - VPC の中にサブネット作る。そしてサブネットの中に WindowsServer のインスタンスを作成し、自分の PC からそこに接続してみる、というシンプルなもの。

![vpc-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/89dd09b1-e019-156d-6b7a-b701f13211ef.png)

* 本記事作成にあたり以下参考にさせていただきました、ありがとうございました！

https://qiita.com/kono-hiroki/items/6863aa06754fb25f28fc

# 事前知識

* 本記事で扱う用語について、以下にざっくりとしたイメージをまとめておく。

| 用語 | 説明 |
|---|---|
| VPC | 仮想ネットワーク |
| サブネット　| VPC の中にある、小さなネットワーク |
| インターネットゲートウェイ　| VPC と外部ネットワークの窓口で、VPC 内のインスタンスにアクセスするにはこれを設定する必要あり <br> ※ イメージ的には、ファイアウォールに近いかも |
| ルートテーブル　| ネットワークの経路設定 <br> ※ 分かるようで分かりづらい概念なので、ここでは一旦スルー。触りながら学ぶ |

# 手順詳細

* まずは VPC を作成。名前は test-vpc で、10.0.0.0/16 を範囲とする。

![vpc-create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/853f401c-2a3d-81aa-0f06-a83b216f3aeb.png)

* 続いてサブネットを作成。名前は subnet-001 で、10.0.1.0/24 を範囲とする。
このサブネットには、上手順で作成した test-vpc を紐付ける。

![subnet-create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/7e58714d-10ab-5b9b-677e-855bc88e5429.png)

* このタイミングで試しに WindowsServer のインスタンスを用意してみる。
VPC とサブネットは上で作成した、test-vpc と subnet-001 が割り当てられていることを確認する。
    - 「パブリックIPの自動割り当て」は、「有効化」に設定する
    - なお、このタイミングではまだ WindowsServer への接続はできない。
    - ※ メモ：キーペアを作成しないと、ログイン用のパスワード発行できないらしい。。

![instance-create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/9d202b29-23a8-72e4-d052-1a7c2e32d1a6.png)

* ここからインターネットゲートウェイとルートテーブルの設定が必要。
まずはインターネットゲートウェイを作成する。名前は test-internet-gateway とする。

![internet-gateway.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/c878003c-fb3f-8f60-152e-4e92b0f4c002.png)

* 作成したインターネットゲートウェイを、VPC にアタッチ。

![vpc-attach.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/5437f0ab-47eb-1c6a-7497-7437cc766aad.png)

![vpc-attach-002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/6ee51978-2270-16cc-3369-e78fec4d3ce1.png)

* 続いてルートテーブルを作成する。名前は route-001 とし、VPC　(test-vpc) が紐付いていることを確認する。

![routetable-create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/9d99deba-4581-d54c-8581-18fed5d3d418.png)

* 作成したルートテーブルについて編集を実施。「ルートを追加」にて、送信先を 0.0.0.0/0 とし、インターネットゲートウェイ(test-internet-gateway)を紐付ける。

![routetable-edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/c982b6f5-cd13-aff1-b509-0a09b93f7850.png)

* ここで、序盤に作成したサブネットの詳細画面にアクセスする。すると画面下に「ルートテーブル」のタブがある。「ルートテーブルの関連付けを編集」をクリックし、「ルートテーブル ID」において作成済のルートテーブル(route-001)を紐付けて保存する。

![subnet-routetable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/ea3382a4-63de-90c5-6596-444498a6e7b6.png)

* ここまで実施すると、WindowsServer へ接続できるようになる。
    - 自分は MacOS を使っているので、Microsoft Remote Desktop アプリをダウンロードして接続した。
    ![WIndowsServer-signin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/aabc7f63-da6c-b912-6578-837a171ccffb.png)

# 終わりに

* 次はパブリックサブネット・プライベートサブネットを活用して、以下みたいなネットワークを構築したい。

![vpc-image-002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/4490229c-39d9-ee92-a957-59d10075f2de.png)
【Laravel】メソッドとは（初心者向）

## メソッドとは関数のこと

コントローラーやモデルなどに書く、
function xxx (引数){処理}で記述する命令文を指します 

>関数とは
データを入力するとブラックボックスを通って結果が出力される仕組み
与えられた文字や数値に対し、定められた処理を行って結果を返す機能のこと。