OmniAICreator/Qiita-1.07M huggingface dataset:
VSのBuildToolsしかない環境でWDKを使ってコンパイルする

# 始めに

ビルド専用環境でWDKを使ったプロジェクトのコンパイルに失敗していたので対応方法を書く。
状況としては https://qiita.com/SnowCait/items/aa9e38478c73d3717ba6 の記事で起こったエラーと多分同じ。

# 問題

Jenkinsやgithub actionsのエージェントが動くような環境では、Visual Studio本体のUI等は必要なく、msbuildやvc等、ビルドするためのツールだけあればいい。
そのような環境では、Build Tools for Visual Studioを使って余計なものを入れないようにすることになるが、
[WDK(Windows Driver Kits)](https://learn.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk)を使ったプロジェクトをコンパイルする際、以下のようなメッセージが出てビルドに失敗する。

```
error MSB8020: The build tools for WindowsApplicationForDrivers10.0 (Platform Toolset = 'WindowsApplicationForDrivers10.0') cannot be found.
```

`WindowsApplicationForDrivers10.0`の部分は`WindowsKernelModeDriver10.0`だったり、`WindowsUserModeDriver10.0`だったりする場合もあるが、意味としては対応するプラットフォームツールセットが無いという意味である。

# 通常の解決方法と、その問題

この問題はmsbuild側がWDKで使用するPlatformToolsetの存在を知らないからだが、ProfessionalやCommunity等ではWDKのインストールの終わりにVS拡張のインストールを行うか、
`[WDKインストールパス]\VS[VSバージョン]\[WDKバージョン]\WDK.vsix`を後からインストールすれば、使用することができる。(`[WDKバージョン]`を間に挟まない場合もある)

通常はこれで問題ないが、Build Toolsしかない環境では、VSIXのインストールに失敗する。
これはWDK.vsixがBuildToolsへのインストールを想定してない(VSIXの中の対応SKUに記述が無い)ことに起因する。

## EWDKを使った対応

一応 [EWDK(Enterprise WDK)](https://learn.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk#enterprise-wdk-ewdk) を使うという手も無くはないというか、多分公式はこっち使えという感じだと思うが、丸々一つのWindows SDK+WDK+Visual Studioビルドツールを展開することになるので、イメージが膨らみ、かつビルドスクリプトも多少複雑になりがちなので、今回は別の方法を紹介する。

# BuildToolsしかない場合の解決方法

以下の手順を行う。**事前にWindows SDKとWDKのインストールは完了させておくこと。**

1. WDK.vsixを別のディレクトリに、"WDK.zip"としてコピーする
2. zipを展開する
    * 特に意識しないとzipと同じフォルダにファイルを展開されてしまうので注意すること
3. `$MSBuild/Microsoft/VC/vc[VCのバージョン]/[CPUアーキテクチャ]` を、 `[VSインストールディレクトリ]/MSBuild/Microsoft/VC/vc[VCのバージョン]/[CPUアーキテクチャ]`にコピーする

これでビルドできるようになるはず。

# 終わりに

WDKの方でBuildToolsの存在も想定してくれればこの対応も不要になるが、今の所そうではないので書いた。
なお、この記事は https://stackoverflow.com/questions/69448098/vs-2019-compilation-error-using-windows-sdk-and-wdk-on-windows-containers を参考にしている。
VSやWDKのバージョン等細部は異なるが、他のバージョンにも応用は効くと思う。
SSL証明書をlet's encryptから別アカウントのACMに変更

## 概要
Let's encryptの証明書でSSL化していたが、認証の強度を上げるためにAWS Certificate Manager発行の証明書を使用するように変更したい。  

変更前の構成はELBなしのEC2インスタンス1台にnginxサーバを設置していた。
そのままnginxにACMの証明書を適応しようとしたのですが、それには
>Nitro System上に構築されるEC2インスタンスで、CPUが4vCPU以上

[ACMのSSL証明書(Amazonの無料証明書)をEC2(Apache)で利用してみた](https://blog.denet.co.jp/acm-ssl-apache/#%E3%81%93%E3%82%8C%E3%81%BE%E3%81%A7%E3%81%AEACM%E3%81%AESSL%E8%A8%BC%E6%98%8E%E6%9B%B8%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%95)

と制約が多くめんどくさそうでした。
一方ALBにACM証明書適応するのは簡単そうなうえ、[１台のEC2でもELBを使うメリットについてまとめてみました](https://dev.classmethod.jp/articles/benefit_elb_with_one_ec2/) によるとALBかませる方が健全っぽいのでALBの後ろに1台のEC2をつけることにしました。

## 構成
最終的な構成はこんな感じです。非常に簡素。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101613/c42bc574-426f-d04f-da8c-8301353ab654.png">

## 実装
### ターゲットグループ作成
ターゲットはEC2が1台だけなので、ターゲットタイプにインスタンスを選択。
ALB,TG間は、httpでの通信のみなのでリスナーのプロトコルは80のみ設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101613/3ccf2bc7-2441-cc9f-637d-01c0fc781403.png)
次のhealth checkは結構ハマりがちなのでちゃんとしましょう。
他の記事などではデフォルトでOKとありますが、動かすアプリによります。
私は、ルートドメイン(DOMAIN/)にアクセスあった場合にログイン画面(DOMAIN/login)に301でリダイレクトにする設定にしていました。
なのでデフォルトのヘルスチェックだと200が返らずずっとunhealthyでした。
しっかりAdvanced Settingまで開き、uccessコードに301を追加しましょう。
(私の場合だと、もしくはHealth check pathを/loginにするのでもいいです。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101613/02acc381-c74c-b488-f0fa-2a6ae03cbcd3.png)
次の画面でターゲットにするEC2インスタンスを80ポートで追加して作成。

### ALB作成
一番左のALBを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101613/154519c7-9085-5cb6-632b-f5646ebeec54.png)
Listeners and routing欄では、
80ポートのリスナーに443ポートへのリダイレクト処理、
443ポートには先ほど作成したターゲットグループへのルーティングを設定して作成。

### nginx側の設定
最後に、通常のウェブアプリならhttpをhttpsにリダイレクトする処理などがあるはずなので、それを削除してhttpのみ受け付ける設定にしましょう。
そうしないとALBからはhttp通信しか来ないので永遠にリダイレクトされます。
大体のnginxであれば、
/etc/nginx/conf.d/app.conf
などで、listen 443とリダイレクトやってるはずなのでコメントアウトして80のみ受け付けるようにしてください。
Docker+nginxでSSL証明書を取得／自動更新するコマンド



今回はLet's Encryptを使用しました。

https://letsencrypt.org/ja/

### SSL証明書の取得コマンド
```
docker-compose run --rm certbot certonly --webroot -w /var/www/html -d example.com
```
※取得は対話式

### SSL証明書の更新コマンド
```
# 証明書を更新
docker-compose run --rm certbot renew
# nginxをリロード
docker-compose exec nginx nginx -s reload
```

自動更新はcronで行う。

参考：

https://paulownia.hatenablog.com/entry/2020/09/12/150658
2011/05/26 プログラマの彼氏が知るべき97のこと

昔、20代の時に書いた社内ブログ記事の抜粋です。

2010年に発売された『[プログラマが知るべき97のこと](https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/) 』という書籍のオマージュ。
はてブに上がっちゃって、会社のブログサーバーを落としました。

## プログラマの彼氏が知るべき97のこと（97個ない）

1. お会計がぴったりだったときは、一緒に喜んでほしい。
1. この場合のぴったりとは、256円とか1024円のこと。
1. プログラマだからといって、WordやOutlookにはあまり詳しくない。
1. でもGoogle先生が常についているから人並み以上には操作できる。
1. ExcelやPowerPointなら結構使いこなせる。
1. マクロっていうのは経済じゃない。
1. Internet Explorerはよくわからない。
1. IEは何年も使っていない。
1. 今後も使う気ない。
1. 表紙に動物の写生が書かれた本をたくさん持っていても、美術に興味があるわけじゃない。
1. 「今日中にやらなきゃいけないことがある」というのは、「明日の朝までかかる」という意味。
1. ネット検索の手際が悪いと見ててソワソワする。
1. だからといって私にワ●ピース動画を検索させないで。
1. 平日のデートは都市伝説。
1. 休日のデートは午後からが吉。
1. 定時に「仕事終わった。お疲れ。」メールが来ると切ない。
1. メールが来なくても切ない。
1. 「仕事と俺とどっちが大事なの」ってそれ女のセリフ。
1. メールの返信もせずにTwitterでつぶやいてても怒らないで。
1. mixi日記書いてたらさすがに愚痴っていいと思う。
1. Facebook日記は書いてもきっとバレないな。
1. PCや携帯にロックがかかっているのは、セキュリティ対策。
1. 浮気なんてする暇ありません。
1. 男性の秘密フォルダは見つけやすい。
1. 女性の隠しフォルダはまず見つからない。
1. お母さんのへそくりと一緒。
1. 作ったものは褒めてほしいのが心情。
1. 意味がわからなくてもとりあえず「すごい」が無難。
1. 化粧やファッションには興味がないけれど、ルビーやパールはすき。
1. 「ググる」の意味くらいググれ。
1. Yahoo!派だからって、「ヤフる」って言わないで。
1. 楽天きらい。私はAmazon派。
1. サンを救うのはアシタカではなくオラクル。
1. ケンカになったら、「それは仕様です」って言ってみれば和むかも。
1. 「コミニュケーション」じゃなくて「コミュニケーション」。
1. 「シュミレーション」じゃなくて「シミュレーション」。
1. ブラウザ履歴は消さないこと。
1. 私のブラウザ履歴は見ないこと。
1. 花火を見て黙っているのは距離を計算してるから。
1. ネカフェデートしたい。
1. マックといえばリンゴ。
1. 部屋を汚されるよりデスクトップを汚される方が嫌。
1. 黒い画面に白い文字が並んでいても、パソコンが壊れているわけではない。
1. 一番よく読む英語はエラー文。
1. ハロウィンとクリスマスは一緒。

## 補足

45番目の、`ハロウィンとクリスマスは一緒` は、Oct 31（8進数の31）とDec 25（10進数の25）のハナシ。
「お前が最近書いたコードを印刷しろ」って言われたら使うコマンド

筆者がそういう状況になったことはないです。
ただ、「誰かが書いたコードを一気に調べたい」みたいな状況はたまに起きるのでメモしておきます。

```bash
find . -type f -exec git blame --since=4.weeks --show-name {} \; | grep "My Name" > mycode.txt
```

詳細は https://git-scm.com/docs/git-blame 読んでください。
chromeで開いて印刷するなり、 https://pandoc.org/ とか使えばtxtからpdfも変換可能だと思います。

この方法だと読みにくいので、もっとカラフルにとか、他にいい方法あったら教えてください。
また、これだと誰か別の人に上書きされたコードは無視されてしまうので、それも印刷したければ git log を使う必要がありそうです。
[Swift UI]validation failed: Couldn’t parse property list because the input data was in an invalid format

結論から言うと、セミコロンが抜けている、または=が大文字とかそんな感じです。

僕の場合はセミコロンは問題なく、探して行ったら=が大文字の＝だったためエラーになってました。

参考記事
https://captainshadow.hatenablog.com/entry/20110828/1314542750
Matplotlibとseabornで複数のヒートマップを描写したい

# 経緯
簡単だと思ったら思いのほか詰まる描画。。。
探しても微妙に出てこないし備忘録として作ろうと思う。


# コード


```python
labels = ['A','B','C','D','E','F','G','H']

for i in range(0,4):
  data_list += [[[i]* 8]* 8]
```

```python
def heatmap(list, ax, labels):
  # print(labels)
  sns.heatmap(list, ax= ax, vmin=0.5, vmax=3, cmap="YlOrRd", annot=True)
  ticks_pos = range(2, 8, 4)
  ax.set_xticks(ticks=ticks_pos)
  ax.set_xticklabels(labels=labels)
  ax.set_yticks(ticks=ticks_pos)
  ax.set_yticklabels(labels=labels)
  ax.plot([0,8], [4,4], ls='--', lw=1, color='b')
  ax.plot([4,4], [0,8], ls='--', lw=1, color='b')
  # labels=labels
```


```python
#日本語にする
sns.set(font_scale=1.1, font="IPAexGothic") 

def cos_heatmaps(lists):
  fig = plt.figure(figsize=(12, 10))
  ax1 = fig.add_subplot(221)
  ax2 = fig.add_subplot(222)
  ax3 = fig.add_subplot(223)
  ax4 = fig.add_subplot(224)

  heatmap(lists[0],ax1, labels[0:2])
  heatmap(lists[1],ax2, labels[2:4])
  heatmap(lists[2],ax3, labels[4:6])
  heatmap(lists[3],ax4, labels[6:8])
  # plt.show()
```

![スクリーンショット 2022-11-15 20.17.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/d5e14a79-b674-d59f-cdc3-f3b6cbd79837.png)
AWS Redshiftにてテーブルを作成してデータをロードする編

AWS RedShiftにてテーブルへデータをロードする際に苦戦したメモ
# １．テーブルの生成(CREATE TABLE)
redshiftに作成したインスタンスにテーブルを生成。
charのsize5で生成したつもり
![createtbl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38727/501f4e64-d128-a810-f215-562059f70d8e.png)


出来上がったテーブルを見るとchar(1)になっている
![createtbl_kekka.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38727/674c612e-16ce-4c91-e2f1-cfe10f03db1a.png)
**原因は不明**
仕方ないのでSQLで再生成
``` SQL
DROP TABLE "public"."tbl_test2";
CREATE TABLE "public"."tbl_test2" ( test1 character(5) NOT NULL encode lzo, 
test2 character varying(256) encode lzo, test3 integer encode az64, test4 time 
without time zone encode az64, test5 date encode az64, CONSTRAINT 
tbl_test2_pkey PRIMARY KEY(test1));
```
ようやく正しく生成
![createtbl_kekka2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38727/8130a8f7-93b3-b775-8ae0-42dabb26c287.png)

# 2.CSVからデータをロード

Ｓ３にアップロードしたＣＳＶファイルへアクセスする為には事前にロール設定が必要です
[こちら](https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c-getting-started-using-spectrum-create-role.html)を参考にしてみて下さい

今回もウィザードを使用
![load_csv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38727/bca10670-ab5e-c162-e22e-614c71389fc4.png)
生成されるSQLはcopy
``` sql
COPY dev.public.tbl_tenpo (test1,test2,test3,test4,test5)
FROM 's3://younet-s3/test.csv'
IAM_ROLE 'arn:aws:iam::9999999999:role/redshift-full-roll'
FORMAT AS CSV DELIMITER ',' QUOTE '"' REGION AS 'ap-northeast-1'
```
データ不備でロードエラーになるとその結果が`sys_load_error_detail `に格納される為、下記SQLにてエラーの内容を確認してデータを修正
``` SQL
SELECT query_id,
       table_id,
       start_time,
       trim(column_name) AS column_name, 
       trim(column_type) AS column_type,
       trim(error_message) AS error_message
FROM sys_load_error_detail 
ORDER BY start_time DESC
LIMIT 1; 
```
Redshiftにて生成したテーブルにデータを投入するまででした。
コーディング規約の存在を知った

# 01 はじめに
javascriptのコーディング規約について

※メモ程度にしか書いていません🙏

# 02 Googleが発表しているコーディング規約

調べてみると、googleがjavascriptのコーディング規約を公開していた。
それが以下
[Google JavaScript Style Guide](https://google.github.io/styleguide/jsguide.html)

いやー素晴らしい。そのようなものがあったとは。他にも色々コーディング規約というものがあるらしい。
【SwiftUI】SFSafariViewControllerを使う

# はじめに
昨日に引き続き、KeyboardKitでお世話になっている[danielsaidi](https://github.com/danielsaidi)さんのライブラリを見てたら[WebViewKit](https://github.com/danielsaidi/WebViewKit)というものを見つけました。
便利だったので紹介します。

ただSFSafariViewControllerを使うためだけにライブラリを使うのは気が引けると思うので中身のコードも載せときます。

# 動画
![Simulator Screen Recording - iPhone 14 - 2022-11-15 at 19.55.26.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/f5f8dcf5-05ac-c048-0f32-df1bb19d4a6d.gif)


# 使い方
```swift
import SwiftUI
import WebViewKit

struct ContentView: View {
    @State var isSafariWebView: Bool = false
    private var url = "https://danielsaidi.github.io/WebViewKit/documentation/webviewkit/getting-started/"
    var body: some View {
        VStack {
            Button {
                isSafariWebView = true
            } label: {
                Text("表示")
            }
        }
        .fullScreenCover(isPresented: $isSafariWebView) {
            SafariWebView(url: URL(string: url)!) { configuration in
                configuration.dismissButtonStyle = .close
                configuration.preferredBarTintColor = .green
                configuration.preferredControlTintColor = .purple
            }
            .edgesIgnoringSafeArea(.all)
        }
    }
}
```

# カスタマイズ
### 左上のボタンスタイル
```swift
configuration.dismissButtonStyle = .close // 閉じる
configuration.dismissButtonStyle = .cancel // キャンセル
configuration.dismissButtonStyle = .done // 完了
```

### コントロールバーの色
```swift
configuration.preferredBarTintColor = .green
```

### コントロールバーのテキストの色
```swift
configuration.preferredControlTintColor = .purple
```

その他もあったらコメントで教えてください！

# SFSafariViewControllerだけ使いたい方
使い方は同じです。
```swift
import SwiftUI
import SafariServices

struct SafariWebView: UIViewControllerRepresentable {
    init(
        url: URL,
        configuration: SFSafariViewController.Configuration = .init(),
        controllerConfiguration: @escaping (SFSafariViewController) -> Void = { _ in }) {
        self.url = url
        self.configuration = configuration
        self.controllerConfiguration = controllerConfiguration
    }
    
    private let url: URL
    private let configuration: SFSafariViewController.Configuration
    private let controllerConfiguration: (SFSafariViewController) -> Void

    func makeUIViewController(context: Context) -> SFSafariViewController {
        let controller = SFSafariViewController(url: url, configuration: configuration)
        controllerConfiguration(controller)
        return controller
    }

    func updateUIViewController(_ safariViewController: SFSafariViewController, context: Context) {}
}
```

# おわり
便利ですねー
重大: サーブレット [action] のServlet.service()が例外を投げました

疲れた

数時間ハマった。

Strtusで突然このエラーが発生して
Actionが呼び出されなくなった。

なぜかわからなくて調べ始めたけど、なかなかわからない。
検索してもactionがservlet.service()のエラーは見つからない。
jspはあるのだけど。

このエラーは、これしかエラーログが出ないので、
何が原因で起こっているのか全く分からない。

原因は、ActionFormで
送信する時、

List<Integer> xxx;
とするのが定番だけど、

試しに
Integer[] xxx;
にしてみたせいだった。

作っていたコードがArrayの方が都合がよかったので、
これで動くか試していたのだけど、

色々やっているうちに変更したことを忘れていた。

もう忘れないように書き残しておこう
【Ruby on Rails】Active Storageの導入方法

# Active Storageの導入方法

<b>ImageMagick：</b>
画像の作成やサイズ変更、保存形式の変更ができる。Gemではなく、ソフトウェア。
<b>MiniMagick：</b>
ImageMagickの機能をRubyで扱えるようにしてくれるGem。
<b>ImageProcessing：</b>
MiniMagickでは提供できない、画像サイズを調整する機能を提供するGem。

## Active Storageを使用する為に必要なツールのインストール
### ImageMagickのインストール

```terminal:ターミナル
brew install imagemagick
```
### MiniMagickとImageProcessingのインストール

Gemfile最終行に以下を追記
```ruby:Gemfile
gem 'mini_magick'
gem 'image_processing', '~> 1.2'
```

```terminal:ターミナル
bundle install
```

以上でActive Storageを使用する為に必要なツールのインストールは完了。

## Active Storageをアプリケーション内で使用する準備
### Active Storageをインストール

```terminal:ターミナル
rails active_storage:install
```
```terminal:ターミナル
rails db:migrate
```
## Active Storageのテーブルに、画像を保存するための実装

モデルと画像ファイルを紐付ける。
この設定によって「モデル.image」が画像ファイルを示すことになる。
```ruby:app/models/モデル.rb
class モデル < ApplicationRecord
  has_one_attached :image
end
```
permitに:imageキーを追加することで、imageという名前で送られてきた画像ファイルの保存を許可する。
```ruby:app/controllers/モデルs_controller.rb
class モデル < ApplicationRecord

private

def モデル_params
    params.require(:モデル).permit(:カラム名1, :image).merge(user_id: current_user.id)
end
```


#techcamp136期
serdeの属性で複数の表現をenumで受け取る

serdeでは様々な入力をenumでまとめて扱うことができます。
[serdeのマニュアル](https://serde.rs/enum-representations.html)に載っているので、このリンクを読んだことがあるなら既知の情報が多いかもしれません。

以下のようなMessageをjsonで受け取ることを例として見ていきます。

```rust
#[derive(Serialize, Deserialize)]
enum Message {
    A { id: u64, event_code: u64 },
    B { id: u64, message: String },
}
```
---
## Externaly tagged
何の属性を設定しない、一般的なenumのシリアライズ方法です。
variantの名前をkeyに、中身をvalueに設定します。
期待する入力は以下のようなjsonになります。
```json
{ 
    "A" : {
        "id" : 1,
        "event_code": 4
    }
}
```

---
## Internally tagged
対象のenumに`#[serde(tag = "type")]`を付けるとvariantの名前をvalueとして受け取ることができます。keyはtagの後につけた"type"の場所の値になります。
```json
{ 
    "type" : "A",
    "id" : 1,
    "event_code": 4
}
```
---
## Adjacently tagged
対象のenumに`#[serde(tag = "type", content = "message")]`を付けると中身もobjectとして受け取ることができます。
```json
{ 
    "type" : "A",
    "message" : {
        "id" : 1,
        "event_code": 4
    }
}
```
---
## Untagged
対象のenumに#[serde(untagged)]を付けるとtagではなくkeyの種類でenumを変化させます。keyで合致した最初のvariantを返します。
```json
{ 
    "id" : 1,
    "event_code": 4
}
```
---
## Untaggedの使い方
Untaggedは受け取る型を任意にするために使うことができます。
```rust
// 文字列でも数値でも受け取れる型
#[derive(Serialize, Deserialize)]
#[serde(untagged)]
enum Input{
    Str(String),
    Int(i64),
}
```
---
# 比較

ここまではリファレンス通りで寂しいのでいろいろ比較してみました。

---

## expand後のサイズ

まずは`cargo expand --release`してコードのサイズがどれくらい違うかを比較します。
serdeの属性以外は同じコードにします。
以下のenumで比較します。
```
enum Message {
    A { id: u64, event_code: u64 },
    B { id: u64, message: String },
}
```

||Externally|Internally|Adjacently|Untagged|
|-|-|-|-|-|
|行数|759行|750行|1383行|540行|
|バイト数|40KB|36KB|84KB|25KB|

Untaggedが一番多いとの個人的予想を裏切り、Adjacentlyが一番長いという結果に。

---

## ベンチマーク

同様に同じenumでパフォーマンスを比較してみました。
上と同じMessageで比較しました。
cargo criterionでのベンチマークの結果は以下のようになりました。

||Externally|Internally|Adjacently|Untagged|
|-|-|-|-|-|
|Message|69.486 ns|232.36 ns|130.55 ns|141.51 ns|

Externallyが早いですがこれくらいのenumならパフォーマンス上大差がないのがわかります。（後で大きなサイズのenumでどれくらい大きくなるかも比較してみたいと思います。）

---

# まとめ
serdeのderiveがいろいろうまくやってくれるのでいろんなjsonの表現からenumを作ることができます。serdeのリファレンスはいろいろ便利な属性が載っているのでぜひご覧ください。
湧き水APIをPythonでたたいてみた！

# はじめに
タイトルどおり、Pythonを使ってこちらの[湧き水API](https://springwaterapi.docs.apiary.io/#)を叩いてみました。


## 開発環境
- OS Windows 10(NVIDIA GTX 1650Ti,16GB RAM, i5-10300H CPU)
- Visual Studio Code 1.73.1
- Python 3.9

## 実際にコード書いていきます
### 初めにcurlコマンドでAPIを叩いてみる
Windowsのコマンドプロンプトだと日本語入っているとうまくできないので
一旦「https://livlog.xyz/webapi/springWater?q=愛知県」
をブラウザでURLを入力し、また再度URLをコピーします。
```
curl -s "https://livlog.xyz/webapi/springWater?q=%E6%84%9B%E7%9F%A5%E7%9C%8C"
```
コマンドプロンプトに戻って`curl`を使うと
![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/7aea7cdb-4c42-236a-585d-cf3fcd1c3c36.png)
愛知県の湧き水スポットがズラッと表示されました^^

### 今度はPythonで！
まずは今回使っていくrequestモジュールをpipインストールします。
```
pip install requests
```
#### 仕様書を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/6a2fbb09-5a56-aca4-cc70-52b60ce67ee4.png)

今回はGETメソッドを使っていくので、
```Python
import requests

url = "https://livlog.xyz/webapi/springWater?q=愛知県"
response = requests.get(url)
print(response.text)
```
Pythonのrequestsをインポートし、引数として、WEBサイトのURLを指定します。

仕様書を確認するとクエリパラメータqには実際に調べたい都道府県名を入力すればよいので、今回は『愛知県』を入れてみました。

最後にgetメソッドを使い、テキストを表示させれば完了！
![water-api.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/31afb195-e674-92ed-4ee3-84194582f522.png)
たくさんの湧き水スポットが出てきました(汗

### ここから抽出するには
このままだと正直見にくいので
```Python
print(response.json()["result"][0])
```
resultの1番初めに出てくる湧き水スポットを取り出すと
![water-api2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/30f835b8-eb02-f418-734f-139ed873c336.png)
これでめちゃめちゃ見やすくなりました！

#### JSONとは？
**APIで標準的に使われているデータ形式**のこと
JavaScriptの書き方を元にしているようです。

## まとめ
+ VSコードでAPIを利用してみた。(`curl`を使えばコマンドプロンプトでもできる)
+ JSON形式はAPIでよく使われるデータ形式！

## その他
### formatを用いた書き方
```python
import requests
pref = "愛知県"
url2 = f"https://livlog.xyz/webapi/springWater?q={pref}"
responce = requests.get(url2)
print(responce.text)
```
### コマンドライン引数を用いた書き方
```wakimizu.py
import requests
import sys

pref = sys.argv[1]
url3 = f"https://livlog.xyz/webapi/springWate?q={pref}"
responce = requests.get(url3)
print(responce.text)

```
**実行方法**
コマンドプロンプトにて
~~~
python wakimizu.py 愛知県
~~~
とすれば同じ結果がでてきます。

### Pythonで書かなくてもAPIは簡単に使えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/001d1205-bda0-e879-4921-58ae53ca4506.png)

VSCodeで**REST Client**という拡張機能をインストールしたら、

1. 利用したいAPIのURLを貼り付ける
1. 「ファイル名.http」で保存
1. 「Send Request」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/fe53133c-4cd4-8f85-6a22-980ff5fa10af.png)

で右のように返ってきました。しかもさっきより見やすい。
Webスクレイピングアプリケーションを作成。

最近は、Udemyの講座である「爆速で5つのPython Webアプリを開発」をやっている。

https://www.udemy.com/course/python-streamlit/

本日は最後のアプリケーションであるWebスクレイピングを用いた簡単なアプリケーションを作成した。
そのアプリケーションをHerokuと呼ばれるものにデプロイをして自動的に更新できるようにした。
実際にはクレカの情報が入力出来なかったので自動更新はまだ実装していない。

他に自分でアプリケーションを作成して自動更新したいようなら別のクレカで試そうと思う。
下のURLが今日の成果物です。お疲れ様でした。

https://udemy-streamlit-demo.herokuapp.com/
matlabでArduinoからデータを持ってくるII ② ESP32（Arduino）のアドオンをインストール

　失敗談ですので、何の役にも立ちませんし、失敗したのは私だけの環境かもしれません。
　Simulink Support Package for Arduino Hardwareをインストールします。
![s101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/cda241ca-33a1-d1d8-d87c-902d43a2a0cb.png)

　最後でコネクションをチェックしたら、アップロードに失敗します。これは、前回のmatlabでも同じです。
　何度かやり直すと、リトライをしているのか数分かかりますが、うまくアップできることもありました。
![s102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/68b2bb75-3e6d-098c-a419-53a33a0acb05.png)

　けれど，simulinkでLチカをしようとしても、アップロードで失敗します。簡単にあきらめます。3回、インストールし直しました。合計数十回試しましたが駄目でした。
　ボードは、3種類試しましたが、状況は変わりませんでした。
　Arduino UNOは動きました。

　という失敗のレポートです。

### 環境
- matlab home License R2022b update1
- MATLAB Support Package for Arduino バージョン21.1.0
- Windows 10 Pro 22H2　メモリ40Gバイト
「内製化プロジェクト」のあるあるを集めてみた

「内製化あるある」を社内で集めてみた。

# 背景
サービス事業会社のシステム部門にて、「内製化プロジェクト」が発起されることがよくある。
とはいえ、なかなかうまくいかないのが実態。
そもそも成功事例が少ないと思われるが、いくら他の成功事例を見ても真似ても、各会社・各部署によって事例通りにいかないことが多々。
なので、まずは社内の「あるある」を集めてみた。

# 内製化の目的とは？
- 外注による開発コストを削減したい。
- 外注先の影響を受けず、開発スピードを向上したい。
- 社内メンバーのスキルを向上したい。
- 社内メンバーにプロフェッショナル意識を醸成させたい。
- 社内で開発・保守・運用できるようにしたい。
- 社内のみで品質を担保できるようにしたい。
- 社内で知識・技術を継承したい。
- 重要なナレッジの外部への流出を防止したい。

# 内製化が発起するタイミングは？
- 基盤再構築・リプレースのタイミングで発起することが多い。
- 開発支援している中で、最終的に内製化となるケースもある。
- ほぼほぼトップダウンで降ってくる。

# 内製化がうまくいった理由は？
- 社内メンバーに高スキルの技術者がいて、技術的に理解し、内部に教示できることで、プロジェクトを牽引していた。

# 内製化がうまくいかなった理由は？
- 保守・運用業務などをやりながら、片手間で進めていたため、学習にコスト・時間がかかり過ぎた。
- 社内メンバーに技術者がいなかったため、学習にコスト・時間がかかり過ぎた。
- 社内メンバーに技術者がいなかったため、難易度がわからず、方針が定まらなかった。
- 要件に合ったスキルの人材を調達できなかったため、教育のコスト・期間が増えてしまった。
- 一部から内製化と考えていたら、やっていくうちに全体を内製化せざるを得ないような流れになってしまった。
- 社内メンバーの感想事例
  - プログラミングがこんなに難しいとは思わなかった。
  - ローコード開発と言ってもやはり難しい。
  - 業務はわかるけど、システムはやっぱりわからない。

# どうすれば内製化がうまくいくのか？
- 技術に触れたことがない人でも簡単にできるような仕組みやシステムの利用を考える。（但し、Kintoneでも難しかったという事例もある。）
- 技術者としてのベース教育を主眼に考え、システム全体を俯瞰する能力や処理の流れを考える能力を教育する。
- 社内メンバーが、チーム作業、役割分担、スケジュール、品質に対しての意識を変える。
- トップ層の内製化に対しての意識改革する。
- トップ層が内製化の意味をきちんと理解し、現場に伝えられるようにする。
- 開発会社を買収して社内開発というのはある意味手っ取り早い。
- 一部の内製化から小さな成功体験を積んでいく。（「ソフトウェアファースト」の考え方）
- コストダウンを目的としない。
- 開発スピード向上やスキル向上、開発コストの削減、プロフェッショナル意識の醸成を、長期スパンのゴールに設定する。

# 内製化そのものを考え直すとしたら？
- コストダウンが目的なら、内製化よりパッケージに寄せて、業務を変えていく。
- 世にあるサービスを組み合わせて実現できないか考える。
- 外製化を効率化する。
- 複数企業の外製要求をまとめて、共通プラットフォーム化する。

# そもそも内製化って何だろう？
- 社内で実装・検証も含めて開発すべてをやることを意味することが多い。
- 社内でシステム要件を決められるようになる、ということも十分内製化と言える。

# 最後に
内製化はなかなかうまくいかない、というのはみな同じ認識だった。
トップダウンで始まることが多いため、トップ層の内製化理解は重要なポイントになると思われる。
一方で、どこまで内製化するのか、という観点を一番最初に検討することが必要なのかもしれない。

今度はポイントを絞りながら、もう少し深堀して考えてみようと思う。
MySQLバックアップ　基本


---
__MySQLバックアップ
基本的なコマンドを整理してみました。__
---



__mysqldumpコマンド__


__このコマンドを活用すると、__
__データベースを抜き出して、後日、再利用する事が出来るようになります。__


【公式ホームページの説明】
mysqldumpクライアント ユーティリティは 論理バックアップを実行し、
元のデータベース オブジェクト定義とテーブル データを再現するために実行できる一連の SQL ステートメントを生成します。バックアップまたは別の SQL サーバーへの転送のために、1 つ以上の MySQL データベースをダンプします。
mysqldumpコマンドは 、CSV、その他の区切りテキスト、または XML 形式で出力を生成することもできます。
https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html

<font color="Red">お気づきかと思いますが、テキストでも取得できます。</font> 



書式
---
__mysqldump -u ユーザー名  -p データベース名 > 出力ファイル名__
<font color="Red">どんな内容が出力されるのか確認したい場合は、
この「出力ファイル名の所を〇〇.txt」とすると内容を確認する事が出来ます。</font> 



__ここで、出力するファイルですが、MySQLサーバ全体も取得する事ができますが、テーブルのみでも出力できます。__
具体的には、3 つ方法があります。

__①1 つまたは複数のテーブルのセットをダンプする。__
mysqldump [options] db_name [tbl_name ...]

__②1 つまたは複数の完全なデータベースのセットをダンプする。__
mysqldump [options] --databases db_name ...

__③MySQL サーバー全体をダンプする。__
mysqldump [options] --all-databases

optionsの主なものは、以下のようなものがあります。

--databases	データベース全体のバックアップ
--lock-all-tables	データベースの全てのテーブルをロックしてバックアップ
--no-data(-d)	CREATE TABLE 文のみを出力
--routines	プロシージャや関数がある場合に付ける


【引用元】
https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html#mysqldump-syntax



dumpは指定されたデータベース内のテーブルと同じものを作るためのコマンドをdumpファイルに出力したものです。
1GB程度のデータベースのdumpであれば取得するのにそれほど時間がかからないかもしれませんが、
10GB以上ですと、だいたい、15分以上かかるようです。
【UE4】リターゲットがうまくいかない場合の対象方

# ・こんな人に読んで欲しい
**「リターゲットがうまくいかない...」**
**「未知の生命体みたいな動きになった...」** みたいな感じです。（2時間前の自分みたいに）

https://twitter.com/MapleSyrup77/status/1592428438748422144?s=20&t=B_1Gcm6Y6yT4cEfl3SsyZw

<br>
<br>
<br>
<br>

## リターゲットがうまくいかない場合

<br>
<br>
今回はこのアセットのアニメーション「Ability_E」を使用します

https://www.unrealengine.com/marketplace/ja/product/paragon-greystone?sessionInvalidated=true

<br>
モデルはこれ

https://booth.pm/ja/items/3741802

VRM4Uプラグインを使ってモデルを入れてるよ
<br>
<br>
<br>
このアセットのアニメーションをリターゲットすると...

https://twitter.com/MapleSyrup77/status/1592428438748422144?s=20&t=B_1Gcm6Y6yT4cEfl3SsyZw

首がイカれやがります、~~ふざけるな、俺の2時間を返せ~~
<br>
<br>
<br>
### ・対象方法その一


（[動画Ver](https://i.gyazo.com/0d578c2dd045e5a220c70ea9a3877814.mp4)）

まず、**「リターゲットしたいキャラ」** からリターゲットすると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843707/aafd41db-45b2-d79c-f741-9eff4f583859.png)
<br>
<br>

失敗します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843707/90ca95d9-3a29-d5bf-84e1-9531fc0381a3.png)
<br>
<br>
<br>
### ・対象方法その二
まず、 **「一度グレーマンにリターゲット」** します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843707/ac58209b-7bb1-416e-6553-6d6f13e1534f.png)

<br>
<br>
<br>

そしたら、 **「リターゲットしたいキャラ」** をリターゲットしましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843707/fa408c7b-5f92-3bb2-0f9f-ae5142042a00.png)
<br>
<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843707/87e1f35b-505a-59fa-b12b-cdf566af9fb3.png)

<br>
<br>
<br>
<br>
完成！！

https://twitter.com/MapleSyrup77/status/1592440968930004994?s=20&t=B_1Gcm6Y6yT4cEfl3SsyZw

<br>
<br>
<br>
<br>
<br>

## ・最後に
スケルトンが表示されない場合、ここのチェックを外しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843707/8c7ab6c9-e998-f988-c1e8-78268c4cd0d4.png)
<br>
<br>
<br>
ちな、リターゲットが終わったらグレーマンは消しておｋ
<br>
（ほかのキャラも使いたい場合はとっておこう）
（元のアニメーションも使わないならそっちも消そう）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843707/d90386f4-d8a9-789e-489d-e3305204614e.png)
<br>
<br>
<br>
あと、グレーマンのSkeletonではなく元々キャラクターについてくるSkeletonでも良いと思うよ
特殊な形のキャラクターとかね（やったこと無いから知らんけど）
<br>
<br>
あとAnimBlueprintもいけるよ
まあ、これが正しいのかは知らんけど、動くんでヨシ！
<br>
<br>
かわいいね↓
https://i.gyazo.com/e562e09404f34acfe7ef00b5b51b79b7.mp4

## ・宣伝（いいねして、フォローして）
Twitter　(今すぐフォローしやがってくださいませ)
https://twitter.com/MapleSyrup77
<br>
<br>
Noto（毎日ゲーム制作の日記）

https://note.com/ggrks_ue4

<br>
<br>
<br>
<br>
Discord鯖　　(気軽に進捗上げてね、デバッグ募集とかもOK！)

http://discord.gg/xBMBWbrRDS

# いいねとフォローよろしく！！！
Google UXデザイン：ゲシュタルトの原理

# はじめに

わたしが[Google UX Design Crtificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/mapami/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/1ed400d1-bbdf-302d-70be-3175620c3912.png" width="800">

<details><summary>これまでの振り返り</summary>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/7e940764-ef37-d2e7-0ad2-ff705e7291d5.jpeg" width="500">

</details>

# ゲシュタルトの原理を応用する

あなたのデザインは、ユーザーが経験する問題に対して確かな解決策を与えるものです。アプリやWebサイトを訪れたユーザーが何をしたいのかを考えてみてください。その目的は何でしょうか。そのニーズをデザインでどう満たすか。ユーザーはどのように反応するのか？

人間の脳は、論理、パターン、構造を構築することで、周囲の世界を理解することができます。

***<font color="MediumVioletRed">『ゲシュタルト原理は、人間が物体を知覚する際に、類似した要素をグループ化し、パターンを認識し、複雑なイメージを単純化する方法を説明しています。』</font>***

ワイヤーフレームを作成する際にも、ゲシュタルトの法則を応用してコンテンツを整理することで、視覚的に美しく、理解しやすいものにすることができます。

私たちは無意識のうちに、シーンにあるさまざまな要素を結びつけて、すばやく理解することができるのです。つまり、私たちの脳は一目で意味を理解できるようにできているのです。

# ゲシュタルトの原理の代表的な３つ

- ***類似性***
    - 例えば形や大きさ、色などが似ているものは、同じ機能を持つものとして認識される。
- ***近接性***
    - 離れた場所にあるものよりも、近くにあるものの方が関連性があるように見える。
- ***共通領域***
    - 同じ閉じた領域内にある要素は、一緒にグループ化されていると認識される。

ただし、この3つ以外にもゲシュタルトの原則は存在することに留意してください。

## 類似性（Similarity）

ユーザーがアプリを素早く操作できるようにするためには、「似たもの同士」の一貫性を保つことが重要です。

例えば、アプリのデザインにユーザーのアバターや画像を含める場合、ワイヤーフレームではそれらのアバターのプレースホルダーが同じ形とサイズであることを確認する必要があります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/1faa7312-8d6a-d645-1c0b-7dcfcdc26360.png" width="800">

## 近接性（Proximity）

次に、記事の本文の近くに「もっと知りたい」と書かれたボタンを描いたとします。ユーザーがそのボタンを押せば、その記事の内容についてもっと詳しく知ることができると思わせるのです。

逆に、記事のテキストと「もっと知りたい」ボタンの間に多くのスペースを空けてしまうと、ユーザーは2つの要素の関連性を理解できないかもしれません。数秒の混乱やためらいが、ユーザーがアプリの次のページに進むか、もっと便利なものを探すためにアプリを閉じるかの分かれ目になることもあるのです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/0424732c-d070-b7e4-7958-087034a93708.png" width="800">

## 共通領域（Common region）

携帯電話の画面の上部や下部にあるナビゲーションバーは、たいてい違う色であったり、ボーダーでグループ化されていることにお気づきでしょうか？

ナビゲーションバーにボーダーを設け、色のブロックを追加することで、アプリのメインページのアイコンを画面上で浮遊させるのではなく、アンカーとして配置することができます。このデザインのヒントにより、ユーザーはナビゲーションバーのアイコンが他よりも重要であり、グループ化されていると認識することができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/805c82d5-3f3f-8963-56c0-d18ff577958e.png" width="800">

# 参考となるサイト


- [7 Gestalt principles of visual perception][page1]
- [Psychology + design: Gestalt principles you can use as design solutions][page2]

[page1]: https://www.usertesting.com/resources/topics/gestalt-principles
[page2]: https://uxdesign.cc/psychology-design-4-gestalt-principles-to-use-as-your-next-design-solution-fcdec423a6bf
【GAS】チームメンバーのカレンダーからミーティングに使っている時間を抽出する


備忘録のようなイメージで、とにかく作ったものを記載していきます。
他人が見てわかるようには書いていないのでご注意を…


今回は会社のチームメンバーの業務効率化の一環として、MTG時間の算出を実施した。


`■大まかな流れ`
-対象者のカレンダー情報を取得し、配列に格納
-開始時間と終了時間を取得し、Date形式に変換
-終了時間から開始時間をマイナスし、各ミーティングの所要時間を算出
-スプレッドシートの所定の項目にアウトプット

`■コードは下記の通りです`
```
function myFunction() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("更新シート");

  let todays = new Date();
  sheet.getRange(4,4).setValue(todays)
  　
  for (r = 9; r < 200; r++) {
    const StartID = sheet.getRange(r, 5).getValue();
    var ac_name = sheet.getRange(r, 4).getValue();
    if (StartID == "") break;
    var calendars = CalendarApp.getCalendarById(StartID);
    var startTimeString = sheet.getRange(2, 4).getValue();
    var startTime = new Date(startTimeString);
    var endTimeString = sheet.getRange(3, 4).getValue();
    var endTime = new Date(endTimeString);
    var events = calendars.getEvents(startTime, endTime);
    const records = events.map(event => {
      return [
        event.getTitle(),
        event.getStartTime(),
        event.getEndTime(),
        event.getCreators().join(",")
      ]
    })
    let f = 0;
    for (let t = 0; t < records.length; t++) {
      var creator = records[t][3]
      var Start = records[t][1]
      var End = records[t][2]
      //if (creator == StartID) {
      var data = records[t][0]
      var nego = data.includes("MTG")
        if (nego == true){
          var worktime = (End.getTime() - Start.getTime()) / 1000 / 60
          f = f + worktime
      }}
      console.log(worktime)
      sheet.getRange(r, 7).setValue(f)

}}
```

`■注意点`
・カレンダー登録をしていない人のカレンダーは抽出出来ず、エラーが出るようです。
・非表示にしている場合はブランクで抽出されるため、カウントできないようです。
・タイトルに "MTG" と記載がある場合のみ抽出できます。
【Laravel】クエリビルダでサブクエリを CROSS JOIN する方法

# crossJoinSub メソッドを使う

第一引数にサブクエリを定義したビルダー、第二引数にはエイリアス名（任意の識別子）を記述します。

```php
// サブクエリ
$highPriceFruits = DB::table('fruits')
                   ->select('id AS fruits_id', 'name AS fruits_name'))
                   ->where('price', '>', '500');

// サブクエリを CROSS JOIN する
$users = DB::table('users')
        ->crossJoinSub($highPriceFruits, 'hign_price_fruits')
        ->get();
```

## 余談
サブクエリとの結合については、joinSub、leftJoinSub、rightJoinSubメソッドが用意されている旨の内容がドキュメントですぐに見つかりました。

https://laravel.com/docs/9.x/queries#joins

しかしながら、crossJoinに関しては記載がなかったので、用意がないのかなと思ってしまいましたが、そこはさすがのLaravelです。
バージョン 8.x で crossJoinSub メソッドがクエリビルダに追加されたということ。

https://qiita.com/okdyy75/items/0f3566597a8f7e0107b0#%E3%82%AF%E3%82%A8%E3%83%AA%E3%83%BC%E3%83%93%E3%83%AB%E3%83%80%E3%81%ABcrossjoinsub%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E8%BF%BD%E5%8A%A0

https://github.com/laravel/framework/pull/34400

https://laravel.com/api/8.x/Illuminate/Database/Query/Builder.html#method_crossJoinSub

クエリビルダすごい…

# 参考文献

https://readouble.com/laravel/8.x/ja/queries.html

https://www.ritolab.com/posts/93#cross-join

https://laraweb.net/practice/4756/
祝！VMware Cloud on AWS の i4i.metalインスタンスがGAされたのでデプロイしてみた

# 1. とうとうGAされたi4i.metalインスタンス
以前より噂だけありましたが、とうとうGAされたので調べてみます。

https://aws.amazon.com/jp/about-aws/whats-new/2022/10/general-availability-amazon-ec2-i4i-metal-instance-vmware-cloud-aws/

VMware Cloud on AWS はi3.metalとi3en.metalだけの提供でしたが、VMware Explore 2022でi4i.metalについてもアナウンスされました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/accd5f7b-504f-941b-66ee-b1cb4b9fc827.png)

> VMware Japan Blog [VMware Cloud on AWS の最新アップデート（VMware Explore 2022 の発表内容）](https://blogs.vmware.com/vmware-japan/2022/09/vmc-explore-2022.html)から抜粋

i3.metalの約２倍のリソース密度で、CPUは世代も新しくなりパワーアップしました。

# 2. 気になる価格について

価格についてはVMware社公式サイトをご参考ください。

https://www.vmware.com/products/vmc-on-aws.html#pricing

i3.metalの約２倍のリソース密度にも関わらず、価格は2倍以下となっているのが分かります。(お得！！)
CPUの世代数も上がっているので、パフォーマンスもグッと向上していることが期待できます。

VMware Cloud on AWS Pricing Calculator: https://www.vmware.com/jp/products/vmc-on-aws/pricing-calculator.html

# 3. デプロイしてみた

さっそく東京リージョンで`i4i.metal x 1ホスト`構成でデプロイしてみました。
[SDDCバージョン](https://docs.vmware.com/jp/VMware-Cloud-on-AWS/services/com.vmware.vmc-aws-operations/GUID-52CED8FB-2E3A-4766-8C59-2EAD8E2C1D31.html)は執筆時点で1.20v2です。

i3.metalやi3en.metalとの比較は参考記事をご参照ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/2234ad94-8696-5966-862f-2d60d2539f33.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/1e5095a2-1c0e-733e-d4c8-8e953539c9eb.png)



# 4. 参考記事

https://qiita.com/sanjushi003/items/03c3f634931fb8e0fbc7

https://qiita.com/sanjushi003/items/01dec3aba5038c025d4b

https://qiita.com/sanjushi003/items/3860df18a403f3b9343b
VSCodeでPythonインタープリターが選択できない

![OS-Windows 10](https://img.shields.io/badge/OS-Windows_10-brightgreen) ![python-3.10.7](https://img.shields.io/badge/python-3.10.7-brightgreen) ![VSCode-1.73.1](https://img.shields.io/badge/VSCode-1.73.1-brightgreen)

知人がだいぶ困っていたので、解決策を書き残しておきます。

# 結論

ユーザー名やフォルダ名に **全角スペース** を使わない方が良い

# 問題
Winodows に Python と VSCode をインストールしたものの、Python 拡張機能が python.exe を認識してくれない。

右下のインタープリター表示部はこんな感じ。 
![黄色く「⚠インタープリターを選択」と出ている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470813/109fba77-5778-9f21-e399-e2aeb7582ccc.png)

右上の実行▷を押してもエラーが生じる。
![「無効なPythonインタープリターが選択されています。」](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470813/9b914b0a-3d77-2570-0f95-36d0ee2647e1.png)

ただ PATH はしっかり通っているので、powershell で Python を動かすことはできる。

```
PS C:\home> python -V
Python 3.10.7
PS C:\home> python
Python 3.10.7 (tags/v3.10.7:6cc6b13, Sep  5 2022, 14:08:36) [MSC v.1933 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print("OK")
OK
>>>
```

どうなっている？

## 心当たり

Python をインストールしているパスは Windows のインストーラーの初期設定のままで、以下の場所だった。

```
C:\Users\<ユーザー名>\AppData\Local\Programs\Python\Python310
```

そしてこのユーザー名が「**名字　名前**」のようになっていて、全角スペースが含まれていた。

# 実験

以下の3種類のフォルダに Python 3.9～3.11 をインストールしてみる。

- `C:/install_test/テスト１＿全角`
- `C:/install_test/テスト２　全角スペース`
- `C:/install_test/test3 ascii space`

それぞれのフォルダに PATH を通したのち VSCode のインタープリター選択画面を開くと、予想通り `C:/install_test/テスト２　全角スペース` に入れた Python だけが表示されていない。

![1と3しか表示されていない！](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470813/949fecb7-1659-cefd-9248-af77b8b6c1c7.jpeg)

やっぱりパスの途中に全角空白があると認識できないようだ。

# 解決

`C:\Users\Public\Python` にインストールしました。

## 原因

分かりません。VSCode と Python 拡張機能のどちらかの実装の問題なんだろうけど、どっちなんだろう……
【OutSystems】 詳細画面をポップアップで表示させる

## 従業員の名前をクリックしたら詳細をポップアップで表示させる
ReactiveWebにモーダルは対応していないので、ポップアップを使用します。![111.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691264/be7e7086-70db-1ad2-1a01-4659fdb8860e.jpeg)![table4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691264/450becbe-f720-b75a-dca6-ed26d9c1f47d.jpeg)

#### 1. はじめに
テーブルにはGetEmployeesエンティティの内容が表示されています。
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691264/8effbc93-d5c7-d2a3-0320-4127f88ade6e.jpeg)
Employeeエンティティ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691264/63febb07-3af3-b4c7-ec15-a213887bbd22.png)

#### 2. 「Employee」画面を右クリックし、［Add Local Variable］を押下。Booleanデータ型の変数(ここでは「ShowPopup」)を画面に追加する
![キャプチャ2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691264/841c82c2-13f6-56bc-14af-2414e0ae4e91.jpeg)

#### 3. Name(従業員名)の横にポップアップウィジェットを配置
［Properties］タブで、Show Popupプロパティの変数を2.で作成したShowPopupローカル変数に設定する。
Show Popupプロパティは、ポップアップを表示するかしないかを設定する箇所で、
・True->ポップアップを表示、
・False->ポップアップを非表示となる。

True、Falseを設定するとポップアップが常に表示あるいは非表示になってしまうので、TrueかFalseかだけを格納するBoolean変数を設定する。
この変数の値に応じてポップアップを切り替えることができるようになります。![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691264/d52af35b-df77-2a61-0e16-b4534580be6d.jpeg)

#### 4. Name(従業員名)のリンク先を設定
リンクプロパティのOn ClickにNew Client Actionを選択し、名前を「EmployeeDetailPopup」とする。![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691264/1ef2a9f4-810d-56ff-042b-2bb393223860.jpeg)

#### 5. EmployeeDetailPopupアクションの設定
ShowPopup変数の値を［True］に設定する。
Name(従業員名)がクリックされると、EmployeeDetailPopupのShowPopup変数が［True］に設定され、ポップアップが開く。![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691264/252059a4-bfc0-5f74-1d1e-ee438ac8d5fb.jpeg)
EmployeeIdにGetEmployees.List.Current.Employee.Idを設定する。![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691264/7080ed45-cb18-de4c-e35d-91ff95e658e5.jpeg)
ポップアップに表示されるのは、GetEmployeeById Aggregate
GetEmployeeById.List.Current.Employee.Name
GetEmployeeById.List.Current.Employee.Department
GetEmployeeById.List.Current.Status.Label![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691264/6b94022d-a62c-b4bf-ee8d-720dff66252c.jpeg)

RefreshDataウィジェットにGetEmployeeByIdを設定。![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691264/de4fbe73-82eb-50b4-91ae-34b111b7533f.jpeg)

#### 6.  ポップアップを閉じる
ShowPopup変数の値を［False］に設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691264/cbe0fb35-c94b-4d7e-1d12-c7aff6d91336.png)

#### 7.  ポップアップの表示のさせ方はExpressionで定義することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691264/e12feca9-2404-bc1d-7a61-fd4c0048f32e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691264/2ea1d815-24cd-21c1-55b0-3ceffd071a9a.png)
Google Cloud Digital Leaderを取得するには

# Google Cloud Digital Leaderとは
パブリッククラウドや Google Cloud について基礎的な知識を学べる資格です。
AWSではクラウドプラクティショナー、AzureではAZ-900にあたる資格かと思います。

参照：https://cloud.google.com/certification/cloud-digital-leader?hl=ja

# 勉強方法 使用した教材について


## ①GCPの教科書 
参考書でインプット

https://www.amazon.co.jp/GCP%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%82%A8%E3%83%BC%E3%82%B9%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE-%E5%90%89%E7%A9%8D-%E7%A4%BC%E6%95%8F%E3%83%BB%E4%BB%96/dp/4865941959/ref=sr_1_1_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1YE43MIJ0JAS7&keywords=GCP&qid=1668500377&qu=eyJxc2MiOiI0LjkwIiwicXNhIjoiNC4zMiIsInFzcCI6IjMuOTIifQ%3D%3D&sprefix=gcp%2Caps%2C206&sr=8-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUExRDBMVExYRlRVWFJWJmVuY3J5cHRlZElkPUEwOTkwNDI1MjVWVVJSUTVZN0FWQyZlbmNyeXB0ZWRBZElkPUEzOUY0N0dFRDFVT0VXJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ==

![51idxXio4mL._SX384_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629294/c279c6fc-83ad-ac8b-14b9-57c9c498f98b.jpeg)



## ②Google Cloud Digital Leader Certification Practice Exam 2022(Udemy)
問題集で仕上げ
問題集は英語ですが、Google翻訳などを使用すると少し違和感があるかも知れません。
(本番も少し違和感がある日本語なので、慣れるには良いかも...)

https://www.udemy.com/course/google-cloud-digital-leader-certification-practice-exam-2022/
Db2 11.5ランタイムクライアントのインストール on Windows

Db2のランタイムクライアントをWindowsに導入し、Db2 Warehouse on Cloudに接続してみます。

# 最新版のダウンロード
Db2 11.5のランタイムクライアントの最新版を以下から探します。

IBM Download DB2 Fix Packs by version for DB2 for Linux, UNIX and Windows - Japan
http://www-01.ibm.com/support/docview.wss?uid=swg27007053

この時の最新はMod7 Fixpack0でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e74f6074-3b63-63c6-b904-fe9714263034.png)

IBM Data Server Runtime Clientを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0b3721e4-510d-601a-2032-e9dc0404fa08.png)

IBM Data Server Runtime Client (Windows/x86-64 64 bit) V11.5.7 Fix Pack 0を選びダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0d17dc98-37dd-d25d-82ba-e95c8dc8cb09.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8d206ae3-c527-02cd-1771-561fb747f206.png)


# インストール
v11.5.7_ntx64_rtcl.exeを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ea9616b3-5ccf-c1ad-ad9e-ad94df3349c2.png)


「次へ」で進んでいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e1b47673-4b8a-56f0-c707-3f478241f8c7.png)


Licenseに同意する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9922d988-1743-5944-a9f9-e20694bb9de9.png)



「次へ」で進んでいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/2647547e-36c0-8c9b-719b-5bc5cc2a3a5a.png)

「次へ」で進んでいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ca1fa6f8-0d9a-488f-4959-32c84b0b222f.png)

「インストール」で進んでいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/dcf06f20-c0d7-0322-be25-e5bd5e6d50b5.png)

「完了」で終わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f18ec534-560a-1b4c-6fad-339462ffe32c.png)


# カタログと接続テスト

「Db2コマンド・ウインドウ」を起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a83096a9-1747-570d-357f-dc2cc131c38a.png)


db2 catalogでDb2 Warehouse on CloudをCatalogします。

```cmd
db2 catalog tcpip node db2whocn remote db2w-xxxxx.ap-north.db2w.cloud.ibm.com server 50001 security ssl
db2 catalog db bludb at node db2whocn
db2 connect to bludb user hkwd using <password>

```
```cmd:結果
C:\Program Files\IBM\SQLLIB\BIN>db2 catalog tcpip node db2whocn remote db2w-xxxxx.ap-north.db2w.cloud.ibm.com server 50001 security ssl
DB20000I  CATALOG TCPIP NODE コマンドが正常に完了しました。
DB21056W  ディレクトリーの変更は、ディレクトリー・キャッシュがリフレッシュされる
まで反映されません。

C:\Program Files\IBM\SQLLIB\BIN>db2 catalog db bludb at node db2whocn
DB20000I  CATALOG DATABASE コマンドが正常に完了しました。
DB21056W  ディレクトリーの変更は、ディレクトリー・キャッシュがリフレッシュされる
まで反映されません。

C:\Program Files\IBM\SQLLIB\BIN>db2 connect to bludb user hkwd using <password>

   データベース接続情報

 データベース・サーバー = DB2/LINUXX8664 11.5.7.0
 SQL 許可 ID            = HKWD
 ローカル・データベース別名 = BLUDB


C:\Program Files\IBM\SQLLIB\BIN>
```


# 環境
* Windows 11
* Db2 runtime client 11.5
Intel Mac 、Boot Camp の発熱を抑えたい

![I still love bootcamp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2147055/d0e2d573-4f6b-cd5c-8d24-5cf2360a2d58.png)

いまさらのIntel Macです。(よくよく読むと、単なるwindowsの設定の話です。)
BootCampを使っているとタッチバーの上のアルミプレートがチンチンに熱い。
今までもCPUの使用率は最大50%くらいに下げていたのですが、良い情報に辿り着けたので
確認方法と合わせて記録に残すことにしました。

元ネタはこちら
https://www.reddit.com/r/bootcamp/comments/ie5elp/2019_macbook_pro_16_bootcamp_setup/
"The CPU cores will no longer clock up to 4.5GHz, but will instead run at the base speed of 2.60GHz."
(今から2年前の情報ですね)

途中、IntelのCPUのスペックやら、Turbo Boostやら調べて、いろいろ遠回りしたのですが、
このページに到達する際、グーグル先生に使ったキーワードは・・・
「macbook pro 16 boot camp turn off turbo boost」でした。


### 1. 私の環境
&nbsp;&nbsp; Mac Book Pro 2019 (もはや Macは関係ないような・・・)
&nbsp;&nbsp; Windows 11 (多分 Windows 10 でもできます)


### 2. 確認のため診断ツールを入手(結果を確認する気がなければツールは不要)
&nbsp;&nbsp; Intel Power Gadget をダウンロードしてインストール。起動します。
&nbsp;&nbsp; https://www.intel.com/content/www/us/en/developer/articles/tool/power-gadget.html
&nbsp;&nbsp;&nbsp;&nbsp; ![Before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2147055/e26f57de-2e63-32a4-f312-378087b373ff.png)
&nbsp;&nbsp; 今回のフォーカスに置いているのは赤線部のPackage Freq(周波数)とPackage Temp(温度)。
&nbsp;&nbsp; 少し負荷が上がるとBase Frq(ブーストなしでの基本周波数)が、2.30GHzの線を越えてきます。
&nbsp;&nbsp; なので温度も高い。


### 3. CPU の最大プロセッサの状態を99%に変更します。
&nbsp;&nbsp; コントロールパネルの電源オプションを選択します。
&nbsp;&nbsp;&nbsp;&nbsp; ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2147055/e61fc76c-ec2c-a655-b21a-7403406b4e2a.png)

&nbsp;&nbsp; 選択されている電源プラン設定の変更を開きます。
&nbsp;&nbsp;&nbsp;&nbsp;![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2147055/7f3c3f66-8c5e-0a23-cb47-2f98b2558a73.png)

&nbsp;&nbsp; 詳細設定を変更するを選択します。
&nbsp;&nbsp;&nbsp;&nbsp; ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2147055/8f062927-4db2-6da8-dd16-704816dd29b7.png)

&nbsp;&nbsp; プロセッサーの電源管理＞最大プロセッサの状態＞電源に接続(%)の値を100%から99%に変更して[適用]を押します。
&nbsp;&nbsp;&nbsp;&nbsp;![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2147055/19226b4c-60ae-c020-036d-12ff21213b28.png)


### 4. 設定変更の結果
&nbsp;&nbsp;Package Freq(周波数)が、Base Frqの2.30GHzの線を越えなくなりました。

&nbsp;&nbsp;&nbsp;&nbsp;![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2147055/0a222eff-53fc-9e27-fa9a-a309844192e6.png)

&nbsp;&nbsp;Intel Power Gadgetを見つけた後もTurboを無効にする設定をさがしていたので、
&nbsp;&nbsp;一人では「99%」に設定する発想にはたどりつかなかった気がします。
Oracle Analytics Cloud：ビジュアライゼーションをフィルタする

# はじめに
Oracle Analytics Cloud（**OAC**）で作成したワークブック（とビジュアライゼーション）に対して、データをフィルタする方法を紹介します。
[Oracle Analytics Cloud：簡易的なモデリングツールとしてのマルチ・テーブル・データセット](https://qiita.com/tyo38/items/5021c5f10fda056eb882)で作成したデータセットを使用してワークブックを作ります。

# フィルタの方法
フィルタの方法はいくつかあり、1つのビジュアライゼーション、キャンバス内のすべてのビジュアライゼーション、またはワークブック内のすべてのキャンバスにフィルターを適用できます。

## ワークブックのデータをフィルタする
フィルターバーにフィルタしたい項目をドラッグ＆ドロップします。
今回は、「年」を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/f43c20c6-58c7-7466-0aa1-ba58882d588f.png)

リストから任意の値を選択できます。
「含む」「開始」「終了」「パターン一致」などフィルタの方法も指定可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/b4d533db-14dd-49b9-a18c-6b68c0706cb1.png)

「すべてのキャンバスに固定」を選択することで、このワークブックの全部のキャンバスに適用することもできます。
このオプションを指定しない場合は、キャンバス内のビジュアライゼーションに適用されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/415880f9-fb43-e870-0d12-e32b0a910667.png)

## ダッシュボード・フィルタでフィルタする
「ダッシュボード・フィルタ」コントロールをキャンバスの任意の場所にドラッグ＆ドロップし、フィルタしたい項目を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/0ff0c8af-e229-5e34-0fca-8d6c3bf9d0b2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/b2c056c7-63fd-793a-ddc3-19922c27481a.png)

表示形式を「スライダ」にしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/6eb7b75e-7d59-d150-6c7e-f83c4713a524.png)

クリックして自動的に順々にフィルタを他のビジュアライゼーションに適用していくことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/f0c92e40-9d46-6c63-50d8-97d115f0bb5b.png)

# 公式ドキュメント
- [フィルタの作成と適用](https://docs.oracle.com/cd/E83857_01/paas/analytics-cloud/acubi/create-and-apply-filters.html)
動画から音声を抽出してVideo Indexerの利用コストを下げよう

# Video Indexerとは？
MicroSoftが提供している動画・音声を分析してくれるAI。
分析情報には音声の文字起こし、話者の特定、字幕生成などが含まれる。

# 料金について
[Azure Video Indexer](https://azure.microsoft.com/ja-jp/pricing/details/video-indexer/)より（2022年11月15日現在）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526938/066f1326-296a-286c-657b-9ec31175b3cc.png)

# 動画から音声を抽出してVideo Indexerの字幕生成コストを下げる
前述のように、1分あたりの価格が動画と音声で大きく異なる。
動画ファイルを分析すれば話者の特定など、より付加価値の高い分析が可能だが、
音声ファイルの分析でも音声の文字起こし・字幕生成は可能である。

そこでFFmpegの出番。[動画から音声を抽出](https://qiita.com/gwanryong/items/77dbd4db6c621b4fed08)してくれる<font color="red">無料ツール</font>である。
これを使って、文字起こししたい動画ファイルから音声ファイルを抽出し、Video Indexerに音声ファイルをアップすれば利用コストを下げれる。

# どのぐらいコストを下げれるか？
1時間あたり約1000円のコストカットができる。
仮に1時間の動画100本を対象にしたら、1000円✖️100本 = 10万円の節約！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526938/10f45ea6-1f1e-fb36-303e-28c0a8e705e3.png)
【Ruby on Rails】Deviseの導入方法

## Deviseの導入方法

### Gemfileを編集
Gemfile最終行に以下を追記
```ruby:Gemfile
gem 'devise'
```

### ターミナル実行
```terminal:ターミナル
bundle install
```

### deviseの設定ファイルを作成
```terminal:ターミナル
rails g devise:install
```

### Userモデルを作成
```terminal:ターミナル
rails g devise user
```

### テーブルを作成
「db/migrate/20XXXXXXXXX_devise_create_users.rb」ファイルに必要なカラム情報を追記のうえ以下を実行。
```terminal:ターミナル
rails db:migrate
```

### ビューファイルを作成
```terminal:ターミナル
rails g devise:views
```

### 特定のカラムを許容する
devise_parameter_sanitizerメソッドを使用して特定のカラムの保存を許容しなければ、Deviseにデフォルトで設定されているカラム以外を保存することができない。

```Ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  private
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:カラム名1, :カラム名2])
  end
end
```
#techcamp136期