OmniAICreator/Qiita-1.07M huggingface dataset:
ステータスコード451の由来、あなたは知っていますか?

## はじめに
ステータスコードの451について意味をパッと答えられることが出来ますか?

結論、**法的な理由により閲覧できない**ことを指すステータスコードになります。

自分は滅多に遭遇しないので、調べるまでは全然知りませんでした。

今回はその由来含めて、ステータスコードについてまとめます。


## そもそもステータスコードについて
そもそもHTTPとは必ずリクエストとレスポンスが必ずあるプロトコルになります。

ステータスコードは、HTTP通信でレスポンスを受け取った際にそれが何なのかを**3桁の数字**で簡潔に伝えるためのコードになります！

以下の通りステータスコードで5分類されます。
| ステータスコード |意味|  
|:-----------|:------------|
| 1xx| 処理中| 
| 2xx       | 成功        | 
| 3xx| リダイレクト        | 
| 4xx     | クライアントエラー  | 
| 5xx       | サーバーエラー        | 

全部知りたい方は下記をご覧ください。

https://developer.mozilla.org/ja/docs/Web/HTTP/Status

かなり初歩的な内容になりますが、
`200・201・204・301・400・403・404・500・502・503`は実業務でも頻出のステータスコードになるので分からないものが一つでもあれば覚えておきましょう！

## ステータスコード451の由来

「45１」のコードはレイ・ブラッドベリのSF小説 **「華氏451度」** に由来しています。
また、小説の題名については本が自然発火する温度である**華氏451度** を意味しております。

この小説は、書物全体が悪とされる世界でで法律の下で本を燃やす男の話です。
つまり、情報(本)を法のもと遮断させるということで
ステータスコード451は「法的な理由により閲覧できない(遮断されている)」という意味が付けられたことも納得できますね。




## おまけ
ステータスコード418は自分がティーポットの時に返すレスポンスコードです。　自身がティーポットであることを理由としてコーヒーを入れることを拒否することを示します。

これは割と有名ですよね。

サーバー側がティーポットだなと思ったら418を返してきます(~~なんだよそれ~~)

これは1998年のエイプリルフールにジョーク規格として発行されました。 googleだと下記様な表示がされます(かわいい)

![スクリーンショット 2023-07-21 12.14.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636995/a5009ea2-14c2-f780-e5fd-4dfb61bc546f.png)

クリックをすると注いでくれます(やっぱりかわいい)

![スクリーンショット 2023-07-21 12.15.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636995/2a540721-2972-af8c-11c0-020e736be2fe.png)





## 参考
https://www.google.com/teapot

https://developer.mozilla.org/ja/docs/Web/HTTP/Status/418

https://developer.mozilla.org/ja/docs/Web/HTTP/Status/451

https://ja.wikipedia.org/wiki/%E8%8F%AF%E6%B0%8F451%E5%BA%A6
管理者側　顧客一覧ページ

### :shamrock: migrageファイル追加
まず、モデルに退会ステータスのためのフィールドを追加します。今回は、**boolean型** の**is_deleted**というカラムを追加することにします。
```diff_ruby
 t.boolean "is_deleted", default: false
```
:star:**boolean型 のis_deletedがなければ**
ターミナルで以下のコマンドを実行します
```
rails generate migration add_is_deleted_to_customers is_deleted:boolean
rails db:migrate
```
### :shamrock:コントローラー
``` abmin/customers.html.rb
class Admin::CustomersController < ApplicationController
  def index
    @customers = Customer.all
  end
end
```

### :shamrock:views 顧客一覧ページ
```erb:admin/costomers/index.html.erb
<div class="container">
  <div class="row">
    <h2>会員一覧</h2>

      <table class="table">
        <thead>
        <tr>
          <th>会員ID</th>
          <th>氏名</th>
          <th>メールアドレス</th>
          <th>ステータス</th>
        </tr>
      </thead>
        <% @customers.each do |customer| %>
          <tr>
            <td><%= customer.id %></td>
            <td><%= customer.first_name %> <%= customer.last_name %></td>
            <td><%= customer.email %></td>
           <td class="<%= customer.is_deleted ? 'text-gray' : 'text-green' %>"><%= customer.is_deleted ? '退会済み' : '有効' %></td>
          </tr>
        <% end %>
      </table>
    </div>
  </div>
```













### 補足
Customerモデルにnameメソッド（nameフィールドを指しています）が存在しないことがわかります。これは、Customerモデルにnameというフィールドが存在しないからです。
![スクリーンショット 2023-07-20 17.58.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/e5dc4d08-8df6-4abe-5fa9-392d33b16f15.png)
ですので、以下のコマンドを実行してカラムを追加します。
```
rails generate migration add_name_to_customers name:string
```
```
rails db:migrate
```
```diff_ruby 
 create_table "customers", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.boolean "is_deleted", default: false
+   t.string "name"
    t.index ["email"], name: "index_customers_on_email", unique: true
    t.index ["reset_password_token"], name: "index_customers_on_reset_password_token", unique: true
  end
```
_________
:cherry_blossom:しかし、今回はnameカラムは必要ありませんでした（笑）
以下のコマンドで削除しました。
```
rails generate migration RemoveNameFromCustomers name:string
```
これで新しいマイグレーションファイルが生成されます。生成されたマイグレーションファイルを開き、内容が次のようになっていることを確認します
```diff_ruby
class RemoveNameFromCustomers < ActiveRecord::Migration[6.1]
  def change
    remove_column :customers, :name, :string
  end
end
```
```
rails db:migrate
```
:point_up:**理由は顧客新規登録ページにあります！**
認証関連での "No account identifier found in service during interactive flow" エラーの回避について

# これは何？
突然 Visual Studio の認証がうまくいかないと怒られまして、対処した内容です。
昔は問題なかった認証がうまくいかなくなった、そんな場合に役に立つかもしれません。
エラー コード 0x80090345 とか、0x80090034 とかその辺りが出ていたらワンチャンの模様。

# 手順
1) レジストリエディタを起動し、下記パスに移動します。
`HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography\Protect\Providers\df9d8cd0-1501-11d1-8c7a-00c04fc297eb `

2) 下記レジストリを追加します。
` ProtectionPolicy (DWORD) : 1`

3) 問題となっている手順を行います。解決されていれば OK。
ダメだったら再起動後再トライ。それでもだめならこの手順では対応できません。

## 手順の補足
問題が解消された後は当該レジストリを消しておきましょう。

# 何をしているのか
今回追加したレジストリは DPAPI のマスター キーをどこに置くかの設定です。
1 にすることによりローカルに保存される設定になります。

# 出典
[[MS14-066]SChannel の脆弱性により、リモートでコードが実行される(2014 年 11 月 11 日)](https://support.microsoft.com/ja-jp/topic/-ms14-066-schannel-%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%AB%E3%82%88%E3%82%8A-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%81%A7%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%82%8B-2014-%E5%B9%B4-11-%E6%9C%88-11-%E6%97%A5-4740940a-5fe0-8d9b-88b5-2e2ca5999537)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/a7ef905a-b1b3-6bad-36fd-c911705162ca.png)
福島第一原発　視察レポート

# アジェンダ
**２０２３年6月１７日から二日間かけて、福島第一原発へ視察に行ってまいりました。そこで感じたことをレポートしたいと思います。**  
1. 科学的な考察　～処理水であるトリチウム水について～
2. 政治的な考察　～インフルエンサーと政治サークル～
3. 復興についての考察　～地方の現実と復興のバランス～

**以上、三つの考察にてレポートに代えさせていただきます。**  

# **1. 科学的な考察　～処理水であるトリチウム水について～**
２０２３年７月現在、ALPS処理水の排出是非について議論となっているが、ALPS処理水はトリチウム水であり、化学物質排水や海洋資源放射線被害と同列に扱うべきではないと考える。以下にその理由を示す。
- ALPS処理水はストロンチウム・セシウム等の化学物質を除去している
- トリチウムは水分子内の水素原子に中性子が飛び込んだ結果三重水素と呼ばれるものであり、僅かな放射線を放つ以外は水と分子レベルで同等で、生物体内にて濃縮・変化するものではないこと。

以上、ツアーに同行していた経産省　木野氏に確認済みである。

# **2.政治的な考察　～インフルエンサーと政治サークル～**
今回のツアーはALPS処理水に対する理解を求めるために資源エネルギー庁より予算が出ているツアーであり、SNS等を扱えるインフルエンサーを意識したものである。（夕食時食堂入口張り紙にインフルエンサー御一行様と記述あり。その後勉強会の時間にて一部参加者から指摘時にそのような説明があった。）
また、衆議院の学生秘書を中心とした政治サークルの参加が確認できた。ユーチューバーの参加も確認している。一部バス内での態度が悪い者も散見された。
ネットに親和性の高い若者を頼るのは良いが、素行には注意すべきと考える。また現地のアピールポイントを拡散したいのであれば文章や写真を彼らに見せるだけでなく実体験をもとに情報拡散をさせたほうが良いのではないか。農場や波浪の奇麗な水平線を見せるだけでは不充分と考える。

# **3.復興についての考察　～他地方と復興のバランス～**
ツアーの後半には被災資料館や被災時の状態を保存している施設を回った。また山梨より福島第二原発近くへ移住したワイン農家への訪問も行われた。
周囲は未だ未利用地や廃墟も多いが、コンビニや施設などライフライン要素は拡充されつつある。
しかし日本は現在も全国的に地方の過疎で課題を多く残しており、福島の一部地域だけ過去のように復興を果たせるかは疑問である。
大型の魚類（放射線の影響はない）や波浪によるマリンレジャーなどが差別化要素として挙げられたが、他地方にそれらが少ないわけではない。

![20230617_155227.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327408/a954c46e-210d-a50c-bffb-7f2eb7371fc3.jpeg)
ワイン農家の活動している丘から見える福島第二原発。かなり近いように見える。

# **まとめ**
日本の原子力行政は外交含め見切り発車であるとの評価がされて久しいですが、起きてしまったことは正面から受け止めつつ他地方とのバランスを考え、日本全体で対処する必要があるのではないかと考えています。
今や全国・全世界的に原子力発電所が広がり、また電力需要拡大により化石燃料による火力発電だけでは限界を迎えている現状があります。原子力だけに頼らず、過去のレガシーに従属せず、エネルギー政策・ライフスタイル・技術振興を考えるべき時が来ているのではないでしょうか。
SDGｓが各所にて提唱されておりますが、単なる環境問題としてではなく人間の人権・生活様式・技術による産業振興と流出抑止を正面から考える時が来ていると私は考えます。

詳細なルポ（旅行記風味）は別途noteにて掲載させていただきます。

[福島原発ルポ　～トリチウム水排水直前！？インフルエンサーツアー～](https://note.com/busyoucow/n/nd56bc4ad271a?from=notice)

ご興味のある方はご覧ください。
VSCode Themeのすゝめ ＋ Themeでイタリック体になった字体を通常に戻す方法

# VSCode Themeとは
VSCodeでコーディングをする上で見た目って結構重要ですよね。
VSCode Extensionsには、そういう方々のために、VSCode全体の色味や、シンタックスハイライトの色合いをテーマという単位で変更してくれる拡張機能が大量に存在します。
言語や他のIDEに似せるためのものや、季節や景色、アニメのキャラクターなど、様々なテーマに沿ったものがあるので、ぜひインストールしてみてほしいです！

こちらのサイトでテーマを一覧で見ることができ、気に入ったものをそのままVSCodeでインストールできるのでお勧めです！
**[VS Code Themes](https://vscodethemes.com/)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588962/441611e2-be2f-202a-b211-b6d0e04d4192.png)

ちなみに、複数インストールしたテーマを変更したい場合は、VSCodeの設定で、**Workbench: Color Theme**と検索すると一番上に出てくる項目のドロップダウンから変更するだけです。
気分転換に変えてみたり、家で作業する時とオフィスで作業する時で変えてみるのもいいかもしれませんね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588962/3444c0ff-966c-6c1f-0fd3-473efcdd60dd.png)


# イタリック体問題
このVSCode Theme、すごくいい拡張機能なのですが、作成している方が海外の方が多いからなのかわかりませんが、一部言語のシンタックスや、予約語をイタリック体にしたものがあります。
特に、おしゃれ系やかわいい系に多い印象を受けました。(確かにくるんとしてて流体系の文字なので使われている理由もよくわかりますが...)
しかし、我々日本人にはあまり馴染みのない字体だと思います。

これはQiitaというテーマを適用した際のJavaそソースコードですが、型宣言やアノテーションがイタリック体になっているのがわかると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588962/f90708c1-caef-b3d6-014e-182360629597.png)

これぐらいならまだましな方ですが、コメントアウトや、変数がイタリック体になっているテーマもあり、プログラミングをする上で、少しネックになってしまいそうだったので、設定ファイルを弄って、イタリック体を通常の字体に変更する方法も書いておきます。

# イタリック体→通常の字体への変更方法
そこまで難しいことはしなくて大丈夫です。

#### まずは、該当するテーマの拡張機能フォルダを開きます。
VSCodeの拡張機能はWindowsであれば、
``C:\Users\ユーザー名\.vscode\extensions``
に格納されています。(Macは触ったことないので、わからないです...)

このフォルダを開けたら、`Ctrl+F`でフォルダ内検索を行い、該当する拡張機能を探しましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588962/58f74743-9df2-2650-4ed3-8c7e318f50dd.png)


#### 設定ファイルを開く
該当のフォルダを開くことができたら、設定ファイルを探します！
設定ファイルは基本的にjsonファイルで書かれているので、それっぽいjsonファイルを探します。
探すといっても、基本的には、`themes`というフォルダに入っているようなので、まずはそこを探してみてください。
themesフォルダを見ると、おそらく1つだけでjsonファイルが置かれているはずなので、それを開きましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588962/d47dfdd1-ec79-d558-f3e9-ebe464691f40.png)


#### 設定ファイルを変更する
jsonファイルを開くと、何に何色を使って字体はどうするか、というのがたくさん書いてあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588962/47aeb674-004e-8fd6-4873-c51ecb6a14fa.png)

感がいい人は理解できたと思いますが、この字体はどうするか(fontStyle)がイタリック体(italic)になっているものを変更してあげればいいだけです。

ここでも、`Ctrl+F`で検索を開いて、`italic`と入力してあげれば、どこでイタリック体が適用されているのかが一目瞭然です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588962/fc10db4e-1160-0ec5-7a7b-2de7386b28f6.png)

この`italic`を空にしちゃえばOKです！
```
 "fontStyle": "italic",

        ↓

 "fontStyle": "",
```
変更をする際に1つだけトラップがあって、このまま置換しちゃいたくなるところですが、実は`italic`というワードは`fontStyle`以外にも書かれている場合があるんですよね...(多分元々イタリック体のところをどうするか、というニュアンスでした)

そのため、一括置換はせずに1つずつ置換するか、1度`fontStyle`以外に`italic`が適用されていないか確認してから一括置換するなどの方法を取るようにしましょう。

それが終わったら、ファイルを保存して、一度VSCodeを終了しましょう。

再度VSCodeを起動すると、先ほどイタリック体だったところが通常の字体になっているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588962/11e4c57d-68ce-b7d9-a96b-0e4fd4119f4a.png)
Webpacker::Manifest::MissingEntryError を解決したい

## Webpacker::Manifest::MissingEntryError
ただrails sコマンドを実行したところ、今までに見たことの無いエラーが突然吐かれて混乱。
```ruby:エラー
ActionView::Template::Error (Webpacker can't find application.js in /home/ec2-user/environment/Javajiten/public/packs/manifest.json. Possible causes:
1. You want to set webpacker.yml value of compile to true for your environment
   unless you are using the `webpack -w` or the webpack-dev-server.
2. webpack has not yet re-run to reflect updates.
3. You have misconfigured Webpacker's config/webpacker.yml file.
4. Your webpack configuration is not creating a manifest.
Your manifest contains:
{
}
):
     7:     <%= csp_meta_tag %>
     8: 
     9:     <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    10:     <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
    11:   </head>
    12: 
    13:   <body>
```
調べたところ、webpackerをインストール、compileする必要があるとの事。
その過程でもエラーに引っかかったので以下の記事を参考させていただき、解決しました。
[【Rails6】Webpacker::Manifest::MissingEntryErrorを解決する
](https://qiita.com/ginger-yell/items/8584e9149496940ea144)

## webpackerをインストールする
まずは下記コマンドを実行。
```ruby:ターミナル
rails webpacker:install
```
私の場合、ここは特にエラーなくインストールできました。
この調子でコンパイルしてみると・・・
```ruby:ターミナル
rails webpacker:compile
```
↓実行結果
```ruby:エラー
Compilation failed:
warning ../../package.json: No license field
node:internal/process/promises:279
            triggerUncaughtException(err, true /* fromPromise */);
            ^

Error: Cannot find package '@babel/plugin-proposal-private-methods' imported from /home/ec2-user/environment/Javajiten/babel-virtual-resolve-base.js
```
@babel/plugin-proposal-private-methodsが見つけられない・・・？
またよくわからないエラーにぶつかりました。またまた検索・・・こちらの記事を参考にさせて頂きました。
[[Rails]Webpacker::Manifest::MissingEntryErrorについて](https://zenn.dev/redheadchloe/articles/3615a4d9bcd8a4)

パッケージを再インストールしてみる必要がありそうなので下記コマンドを実行
```ruby:ターミナル
#一度node_modulesを削除
rm -rf node_modules

#パッケージを再インストール
npm install --save-dev @babel/plugin-proposal-private-methods
```
実行してpackage.jsonを確認
```ruby:package.json
"devDependencies": {
    "@babel/plugin-proposal-private-methods": "^7.18.6",
    "webpack-dev-server": "^3"
  }
```
ただこれだとパッケージはインポートされているが記述がjsonに無いと言われるみたいなので追記。
```ruby:package.json
"devDependencies": {
    "@babel/plugin-proposal-private-methods": "^7.18.6",
    #追記
    "@babel/plugin-proposal-private-property-in-object": "^7.21.0",
    "webpack-dev-server": "^3"
  }
```

```ruby:ターミナル
#インストール
npm install

#コンパイルを実行
rails webpacker:compile
```

正常にコンパイルでき、viewが表示されました！

## 最後に
これまでにいくつかWEBアプリを作りましたが初めて見るエラーだったので戸惑いました。
webpackerについてはまだまだ理解しきれていないところだらけなのでしっかり勉強していかなければ・・・

ちなみに、viewを表示した時にエラーとして引っかかったのが
```ruby:application.html.erb
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
```
だったので、当初はコメントアウトして対処しようとしていました。
ただ、これをコメントアウトしてしまうと後々使いたい機能が使えなかったり不便なことになるので非推奨です。
未知のエラーに当たると避けたくなりますがきちんと向き合わねばと思い直したエラーでした・・・。
コマンドの使用方法を確認する

# 参考書籍
[新しいLinuxの教科書](https://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84Linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E4%B8%89%E5%AE%85-%E8%8B%B1%E6%98%8E/dp/4797380942/ref=sr_1_1?adgrpid=117229375656&hvadid=655144332605&hvdev=c&hvqmt=e&hvtargid=kwd-1152146940662&hydadcr=21814_13461165&jp-ad-ap=0&keywords=%E6%96%B0%E3%81%97%E3%81%84linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8&qid=1688622508&sr=8-1)

# 動作環境
+ Windows11
+ Oracle VM VirtualBox
+ CentOS 7

# はじめに
+ Linuxのコマンドは、**Linuxシステム自身に含まれている使い方の説明を読む**ことで、ネット検索に頼らずに一次情報にアクセスできる。

# --helpオプション
+ Linuxのコマンドの多くは`--help`というオプションを指定できる。
+ `-help`を指定すると、コマンド自身のヘルプメッセージを表示する。
+ 表示内容はコマンドによって異なるが、主に以下の４つである。
 1. 使用方法（オプションや引数の指定方法）
 1. コマンドの概要
 1. 利用可能なオプション一覧とその意味
 1. その他の参考資料

~~~bash:rmdirコマンドのヘルプを表示
$ rmdir --help
......ヘルプ内容......
~~~

# manコマンド
+ `man`コマンドは指定したコマンドやライブラリ、Linuxの設定ファイルなどの[オンラインマニュアル][語句補足]を表示するコマンドである。
+ Linuxにおいて最も基本的なマニュアルであり、`--help`オプションよりも詳しい解説がされている。

### 書式
`man` <セクション番号> <名前>
`man` -k <キーワード>

+ [スクロール操作](https://qiita.com/sumisumi2000/items/820a8c16fdfa3ba58785#%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%E8%A1%A8%E7%A4%BA)は`less`コマンドと同様の操作で行うことができる。
+ コマンド名がわからないときは`-k`オプションを指定することでキーワードから探すこともできる。
+ セクション番号を省略すると、セクション番号が最も小さいものが表示される。
+ `-wa`オプションを指定すると、マニュアルページがどのセクションに含まれているか確認できる。

#### 使用例
~~~bash:コピー関連のマニュアルを検索
$ man -k copy
......検索結果......
~~~

~~~bash:セクション番号のリストを表示
$ man -wa crontab
......検索結果......
~~~

# whichコマンド
+ `which`コマンドは指定したコマンド名の実行ファイルのフルパスを表示する。
+ パスの中から見つかった最初のコマンドだけを表示する。
+ すべて表示させるには`-a`オプションを指定する。

### 書式
`which` [オプション] <コマンド名>


## 語句補足
<dt> オンラインマニュアル </dt>
<dd> 電子化されたマニュアルのこと。<dd>
<dd> ネットワーク上のマニュアルではない。<dd> 

# 終わりに

次はLinuxのテキストエディタであるVimの使用方法についてまとめようと思う。

**次回**(未作成)

何かご指摘がありましたら、コメントしていただけると幸いです。
最後までお読みいただきありがとうございました！

[語句補足]: #語句補足
退会確認画面　退会ステータス

**はじめに**
bootstrap導入済　
namespases使用
devaice導入
:blossom:boolean型で実装
________
今回の完成イメージ
![スクリーンショット 2023-07-20 23.47.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/3e8e4249-9f2c-b6fb-ea23-3b15bba2e2f7.png)
### :cherry_blossom: boolean型について
真偽値を表現するためのデータ型です。これは、主に論理的な真(true)または偽(false)のいずれかの値を持つことができます。

データベースでの使用例としては、ユーザーが商品の購入を希望しているかどうか、商品が在庫切れかどうかなど、二つの状態のうちどちらかを示す必要がある場合に使用されます。

Railsでは、これをデータベースのカラムに適用して、そのカラムがtrueまたはfalseの値を持つことができます。例えば、今回のis_deletedフィールドは、顧客が退会したかどうかを示すためにBoolean型が使用されています。

### ルーティング
```routes.rb
 resources :customers, only: [:show, :edit, :update] do
      collection do
        get 'check_out'
        get 'withdraw'
        patch 'withdraw_update'
      end
```

### コントローラー

```sessions_controller.rb
 before_action :withdraw, only: [:create]

    protected

   def withdraw
        @customer = Customer.find_by(email: params[:customer][:email])
      if @customer&.valid_password?(params[:customer][:password]) && @customer.is_deleted
          redirect_to new_customer_session_path, notice: 'アカウントは退会済みです。'
      end
   end
```
退会済みのユーザーをログインさせないためのコードです。このコードでは、メールアドレスとパスワードのチェックを行い、ユーザーが退会済みであればログインページにリダイレクトしています。
```public/customers_controller.rb
class Public::CustomersController < ApplicationController
   before_action :authenticate_customer!

  def withdraw
  end

  def withdraw_update
    current_customer.update(is_deleted: true)
    reset_session
    redirect_to root_path
  end
end
```
do と end の間には、そのリソースのコレクション（すなわち、全顧客）に対する追加のルートが定義されています。具体的には、以下のルートが作られます：

check_out へのGETリクエスト
withdraw へのGETリクエスト
withdraw_update へのPATCHリクエスト

これらのルートは、全顧客に対する特定の操作を表す可能性があります。例えば、顧客全体のチェックアウト状態を確認したり、全顧客からの引き出しを行ったり、引き出しの更新を行ったりするなどです。

### views 退会確認画面
```erb:costomers/withdraw.html.erb
<div class="container text-center">
  <h1 class="my-4">本当に退会しますか？</h1>
  
  <p>退会すると、会員登録情報や</p>
  <p>これまでの購入履歴が閲覧できなくなります。</p>
  <p>退会する場合は、「退会する」をクリックしてください。</p>

  <div class="d-flex justify-content-center mt-5">
    <%= button_to '退会しない', customer_path(current_customer), method: :get, class: 'btn btn-primary' %>
    <div class="custom-gap"></div>
    <%= button_to '退会する', withdraw_update_customers_path, method: :patch, class: 'btn btn-danger', data: { confirm: '本当に退会しますか？' } %>
  </div>
</div>
 ```
:star:ボタンの間隔を開けるためにcss追加
```customers.scss
.custom-gap {
    width: 100px;
}
```
【Eclipse】白黒のコンソールに色をつける方法

# はじめに
表題の情報が意外とネット上に少なかったため、この記事が
同じように「コンソールに色をつけたい」という方の役に立てば幸いです。

## before
![20230721-104934.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659821/c707d21b-8018-d473-6e33-69a21a0c1aa7.png)

## after
![20230721-105215.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659821/cc8adb7b-dfa0-11c9-fd13-a7be3c64e46a.png)

# 手順
設定（Preference） → Ansi コンソール　→ 「使用可能」にチェックを入れる　→ 適用して閉じる
![20230721-105423.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659821/c228d027-a3ed-4470-4901-f40a081fed35.png)

# 参考
https://ja.stackoverflow.com/questions/89070/spring-tool-suite%E3%81%A7gradleproject%E3%82%92%E3%83%AA%E3%83%95%E3%83%AC%E3%83%83%E3%82%B7%E3%83%A5%E3%81%97%E3%81%9F%E5%BE%8C-%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%AB%E8%89%B2%E3%81%8C%E3%81%A4%E3%81%8B%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F
Screen Flow Distribution


+ [Screen Flow Distribution](https://trailhead.salesforce.com/content/learn/modules/screen_flow_distribution?trailmix_creator_id=smartbridgesupport&trailmix_slug=developer)

# Get Started with Flow Distribution

何もしないで、検証ボタンをクリック

:::note alert
Make sure that the flow's label is 'Hello World' and that it's active.
:::

# Display a Flow on a Page in Your Salesforce Org


# Add a Flow as an Action on a Record

何もしないで、検証ボタンをクリック

:::note alert
Make sure that the action has the right object (Account), type (Flow), and name (Flow Action).
:::

ページレイアウトには追加してない状態

:::note alert
We couldn't find the 'Flow Action' (API: 'Flow_Action') action in the Account Layout.
:::



# エラー

+ [Make sure that the action has the right object (Account), type (Flow), and name (Flow Action).](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007A1oYdSAJ)

+ [Make sure that the action has the right object (Account), type (Flow), and name (Flow Action).](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000Pa08U)

:::note
I changed My Time zone to New York and the challenge check worked. 
:::
Synchronizeとは

## Synchronize

:::note
Javaのマルチスレッド環境でスレッドセーフ（Thread-safe）な動作を実現するための機能
**スレッドが同時に共有されるリソースにアクセスするとき
→スレッドの実行順序や同時実行による競合状態を制御するために使用**
:::

### 具体的な状況の例

Javaでは、複数のスレッドが同時に共有データにアクセスすることがある

複数のスレッドが同時にデータを変更しようとすると**データの整合性が損なわれたり、競合状態が発生**したりすることがある

このような競合状態を防ぐために使用
***

synchronizeキーワードを使用
→メソッドやブロックをsynchronizedできる

- synchronizeされたメソッドやブロックは、**同時に1つのスレッドしか実行不可**
- スレッドがsynchronizedされた領域に入ると、**他のスレッドはその領域の終了を待つ**ことになる

## 例　Javaのsynchronize

```java
public class Counter {
    private int count;

    public synchronized void increment() {
        count++;
    }

    public synchronized void decrement() {
        count--;
    }
}
```


Counter クラスの increment() メソッドと decrement() メソッドは、キーワードによってsynchronizedされている

→**複数のスレッドが同時に increment() や decrement() メソッドを呼び出しても、互いに干渉することなく正しくカウンターを操作できる**
特定ブランチ時にプルリクタイトルを自動で作成したい

# 前提
タイトル通り、特定のブランチ時にプルリクタイトルを自動で作成したいです！
- releaseブランチ時には以下のようにしたい。
    - title: `Release Staging ${yyyymmdd}`
    - ![スクリーンショット 2023-07-17 19.24.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458664/1828ac04-30c1-5332-515b-cd51352f3287.png)

- mainブランチ時
    - title: `Release Staging ${yyyymmdd}`
    - ![スクリーンショット 2023-07-17 19.30.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458664/777e5e4c-ed13-5bdc-a9b6-171daab0640c.png)

# 結果
出来ました！
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458664/1c5d80ce-4a2a-dc00-3ef6-ff602fad7f03.gif)


イメージ上へコードをチェックアウトしてgithub clでコマンドをタイトルを修正する形です！
また実施するのにリポジトリ権限周りの変更が必要です。
![スクリーンショット 2023-07-17 23.12.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458664/342f1226-f51c-2732-b925-8fb7f1e67e0c.png)




```pullreq_title_change.yml
name: pullreq title change
on:
  pull_request:
    types: [opened, reopened]
    branches:
      - release
      - main

env:
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
jobs:
  release_edit_title:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - name: Edit Pull Request Title
        run: |
          date=`TZ=Asia/Tokyo date "+%Y%m%d"`

          base_branch_name=${{github.event.pull_request.base.ref}}
          if [ $base_branch_name = "release" ]; then
              gh pr edit ${{github.event.pull_request.number}} --title "Release Staging $date"
          elif [ $base_branch_name = "main" ]; then
              gh pr edit ${{github.event.pull_request.number}} --title "Release Produciton $date"
          fi

```


コード解説。
  `main`と`release`ブランチ時のみ走り、
　　　 日本時間の日にちを取得後、既存のプルリクのタイトル編集する形です。

本当はプルリク作成時に発火したかったが、自分の調べた範囲でできなそうだった。。。
Tailwind CSSを導入してみる

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [はじめに](#はじめに)
1. [Tailwind CSSとは](#tailwind-cssとは)
1. [導入](#導入)
1. [おわりに](#おわりに)

# はじめに
前職ではスタイル直書きやオレオレCSSでの実装が散見され、全体の統一を目的としたCSSフレームワークの導入を検討しました。
当時のリードエンジニアが比較検討しBootStrapとTailwind CSSのいずれかにしようとなり、基本的なことはどちらでも対応可能でしたがコンポーネントライブラリが豊富であるTailwind CSSを採用した結果となりました。

![スクリーンショット 2023-07-21 9.38.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194442/433cdb0b-21cb-c8b1-d99d-2ff098a1c4f2.png)


# Tailwind CSSとは
<!-- 発端や概要を記載 -->
Tailwind CSSはユーティリティファーストのCSSフレームワークです。個別にCSSを記述する必要がなく、決められたユーティリティクラスをクラス名に追加するだけでスタイリングが可能です。

https://tailwindcss.com/



<!-- 各チャプター -->
# 導入

### 前提
新規ReactアプリケーションにTailwind CSSを導入するケースを想定します

### やり方

- Tailwind CSSをインストール
```sh
npm# install -D tailwindcss
```

- tailwindcss.config.jsを作成

```sh
npx tailwindcss init -p
```

上記のコマンドを入力すると `tailwind.config.js` というファイルが生成されます。
- Tailwind CSS を適応するファイルパスの指定

生成後は以下のようになっています
```typescript:tailwind.config.js:
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [],
  theme: {
    extend: {},
  },
  plugins: [],
}
```

↓

対象のパスを指定

```diff:tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
- content: [],
+ content: ["./src/**/*.{js,jsx,ts,tsx}"],
  theme: {
    extend: {},
  },
  plugins: [],
}
```

- index.cssにtailwndcssのルールを適用させる

`src/index.css` に`@Tailwind` を追加

```css:src/index.css
@tailwind base;
@tailwind components;
@tailwind utilities;
```

- index.tsxにindex.cssをimportする

```typescript:index.tsx
import "../src/index.css";
```

- 使い方

```typescript:App.tsx
<button className="bg-red-500 text-white font-bold py-2 px-4 ">
   Hello Tailwind
</button>
```

[チートシート](https://tailwindcomponents.com/cheatsheet/)

# おわりに
今回は導入編として導入方法のみを纏めましたが、応用編として様々な使い方も今後POSTしていきます！！
😂passport-localで401 Unauthorizedが出てハマった話

# 結論
passport-localはデフォルトでは以下のプロパティ名を持つデータしか受け取ることができません！
- username
- password

```ts:悪い例
{
  "email": "user@example.com",
  "password": "hogefuga"
}
```

```ts:良い例
{
  "username": "user@example.com", // ← usernameを使う
  "password": "hogefuga"
}
```

# カスタマイズもできる
プロパティ名を`username`以外にしたい時は`usernameField`オプションで明示的に指定する必要があります。

NestJSの場合は以下のように変更します。
```ts:NestJSでの例
...
@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) {
  constructor(private authService: AuthService) {
    super({ usernameField: 'email' }); // ←emailを使いたい場合
  }
...
```

このことを知らず半日を費やしてしまったため戒めの意味で記事を書きました😅

# 参考
[passport.js - NestJS passport authentication returns 401 when using email for authentication - Stack Overflow](https://stackoverflow.com/questions/61067156/nestjs-passport-authentication-returns-401-when-using-email-for-authentication)
【JavaScript】【Jquery】配列の指定した要素を削る

コード
```javascript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var aaa = [1,2,3].filter(function(v){
    return ! [2].includes(v);
});
console.log(aaa);

var aaa = [1,2,3].filter((v) => ![2].includes(v));  
console.log(aaa);


```

# 結果
```javascript
[ 1, 3 ]
```
【小ネタ】SecurityGroupにリソースが紐づいてるか確認スクリプト書いてみた

## はじめに
不要セキュリティグループを一掃しようと思いスクリプトを書いてみました。
本スクリプトでVPCリソースと紐づいているセキュリティグループをあらかた判別出来ます。

## 実行例
スクリプト
```get_security_group_attachment.sh
#!/bin/bash

# 引数からプロファイル名を取得
profile="$1"

# 引数が渡されていない場合はデフォルトのプロファイルを使用
if [ -z "$profile" ]; then
  profile="default"
fi

# セキュリティグループのリソースIDのリストを作成
security_group_ids=$(aws ec2 describe-security-groups --query 'SecurityGroups[].GroupId' --output text --profile "$profile")

# CSVファイルにヘッダーを書き込む
echo "セキュリティグループ,Attachment ID" > result.csv

# スクリプトの実行
for security_group_id in $security_group_ids; do
  echo "セキュリティグループ: $security_group_id"
  attachment_ids=$(aws ec2 describe-network-interfaces \
    --filters Name=group-id,Values=$security_group_id \
    --query 'NetworkInterfaces[].Attachment.AttachmentId | join(`,`, @)' \
    --output text \
    --profile "$profile")

  # セキュリティグループとAttachment IDをカンマ区切りでCSV形式でファイルに書き込む
  if [ -z "$attachment_ids" ]; then
    attachment_ids="null"
  fi
  echo "$security_group_id,$attachment_ids" >> result.csv

done
```

引数にprofileを指定して実行

```sh
./get_security_group_attachment.sh sample-profile
```

## 結果例
※Attachment IDがnullなら何にも紐づいていない
```csv
セキュリティグループ,Attachment ID
sg-xxxxxxxxxxxxx,ela-attach-xxxxxxxxxxxxx,ela-attach-xxxxxxxxxxxxx,ela-attach-xxxxxxxxxxxxx
sg-xxxxxxxxxxxxx,ela-attach-xxxxxxxxxxxxx,ela-attach-xxxxxxxxxxxxx,ela-attach-xxxxxxxxxxxxx
sg-xxxxxxxxxxxxx,null
sg-xxxxxxxxxxxxx,null
sg-xxxxxxxxxxxxx,eni-attach-xxxxxxxxxxxxx
```

## おわり
さくっと調べるには丁度いいかなと思います。1点注意が必要で、サポートにも確認しましたがAWSの仕様上、CodeBuildなどでVPC接続時に指定されていたSGはNICと紐づかないためか判別出来ないっぽいので全てを拾えるわけではないので、飽くまでも掃除のお助けツールのように使うことを想定しています。
RecyclerViewで何も表示されない時に確認すべきこと。

何度もハマるので自分の備忘のために記入。

RecyclerViewに何も表示されない場合、以下の点を確認しましょう。


## RecyclerViewにlayoutManagerを設定する。

layoutManagerに何も設定しないと、何も表示されません。
view Bindingを使用している場合、以下のような感じで設定する。

```XXXActivity.kt
    binding.recyclerView.layoutManager = LinearLayoutManager(this)
```

コードで設定する代わりにlayout editorで設定しても良い。


## (表示後にデータ更新している場合) nofityDataSetChanged() を呼ぶ

RecyclerViewAdapterが参照しているデータが変わった場合、表示を更新するためには

notifyDataSetChanged()

などを呼び出す必要がある。
(変更内容によっては行単位の更新を反映するメソッドのほうが適切な場合もあります。)


以上
VSCodeでPythonを実行していたら、venvのせいでPathがめちゃくちゃになってしまったら

# 概要
Pathが読み込まれない事件が発生
原因を調べたが.bashrc　.bash_profileの記載は残っている。
さらにホームディレクトリが分けの分からない場所になっている。
原因はVSCodeのインタープリターのせいだった

## 事件は起こった
サーバーにSSHしてPythonを実行していたところ
Pythonの拡張機能をインストールしませんか？と出てきたので何も考えずにインストール
その後venvで仮想環境を構築したら事件は起こった。

## 事件の内容
lsコマンド等が使えなくなった
エラー内容（例）：
```
Command 'lesspipe' is available in the following places
 * /bin/lesspipe
 * /usr/bin/lesspipe
The command could not be located because '/bin:/usr/bin' is not included in the PATH environment variable.
lesspipe: command not found
``` 

## 事件の原因
Pathが読み込まれていない

## 原因究明
- .bashrc .bash_profireを確認　→　正常
- ターミナルを起動後にecho $PATHを実施すると,ホームディレクトリが/home/user/singnal/binというプロジェクトディレクトリ配下になっていた
    - ホームディレクトリをrootで修正したが何も起きず
- venvを触っていたのでvenv周りの記事を探したところVScodeに特化した環境構築の記事がでてきて、インタープリターの設定にたどり着く　→pythonの拡張機能をアンインストールしたところ解決


## インタープリターとは？
インタープリター（Interpreter）は、プログラムを実行する際に、プログラムを一行ずつ解釈し、逐次実行するソフトウェアやツールのことを指します。プログラムのソースコードを直接実行し、命令を解釈してコンピュータが理解できる形式に変換し、実行する役割を果たします。
Pythonのインタープリターは、Pythonプログラムを実行するためのコマンドラインツールです。Pythonのソースコードを直接インタープリターに与えることで、そのコードを実行することができます。インタープリターは逐次実行するため、コードの途中でエラーが発生した場合、エラー箇所を特定しやすく、デバッグがしやすいという特徴があります。

## 結果
不意に拡張機能をインストールするのはやめよう
アンインストールしたところとりあえず復旧
なぜPythonの拡張機能でインタープリターの設定をしたらPathが正常に読み込まれなくなったかは謎です。
linuxでコマンドを時刻指定する方法(at コマンド)


# linuxでコマンドを時刻指定する方法(at コマンド)

指定の日時にコマンドを実行する方法。
crontabと違って、単発で実行することができる。
sqlを時間指定で実行するために調べた。

## 実行環境

RHEL 6.5

## 使い方

実行例：
```shell
[user@host]$ sudo at hh:mm DD/MM/YY (20YY下2桁)
at> /usr/local/pgsql -U role dbName < /home/user/Query.sql
at> <EOT>
job 1 at 20YY-MM-DD hh:mm
```

1. at 時間:分 日/月/年(下2桁)を入力する。
    ※このとき、管理者権限で実行すること
2. カーソルが「at> 」に移動するので、設定したいコマンドを入力する。
    ※実行したいファイルには、実行権限を付けておくこと。
3. 設定したいコマンドを入力後「Enter」を入力すると、次の「at>」の行に飛ばされる。
「ctrl+d」を押すと\<EOT>が表示され、設定完了。

## 注意点

atコマンド設定、実行時は、atdを起動しておくこと。
    
```
RHEL 7.X~の場合、
systemctl atd start
または、RHEL6.Xの場合、
/etc/init.d/atd start
```

atでコマンドを設定する際に、以下の「Can't open ...」メッセージが表示されることがある。
この場合、atdのサービスが起動していないため、コマンドは指定時刻に実行されない。

```
[user@host]$ sudo at hh:mm DD/MM/YY (20YY下2桁)
at> /usr/local/pgsql -U role dbName < /home/user/Query.sql
at> <EOT>
job 1 at 20YY-MM-DD hh:mm
Can't open /var/run/atd.pid to signal atd. No atd running?
```
バッチファイルでテキストファイルに文字列処理

バッチファイルでテキストファイルに文字列処理

# 概要
Windowsのバッチファイルでファイル内の文字列処理を行う際のTIPSをまとめました。
最初にサンプルを記載し、その後に各機能やTIPSを、サンプルから引用する形でまとめます。


# サンプル
実行できることは確認済みです。
```
@echo off
set string1=hogehoge
set string2=hoge
set string3=fuga
set inputFile="file.txt"
set outputFile="out.txt"
set flag=0

call set replaced_line=%%string1:%string2%=%string3%%%
echo %replaced_line%

setlocal enableDelayedExpansion
(for /f "usebackq delims=" %%a in (%inputFile%) do (
	set "line=%%a"
	echo !line!
	call set replaced_line=!!line:%string2%=%string3%!!
	echo "!line!" | find "%string2%" >nul
	if not ERRORLEVEL 1 (
		call :func1 !line!
		echo %flag%
	) else (
		echo none
	)
)) > %outputFile%
endlocal
goto end


:func1
echo %1
set flag=1
exit /b 0

:END
exit /b
```

# if文
```
	if not ERRORLEVEL 1 (
		echo %flag%
		call :func1 !line!
		echo %flag%
	) else (
		echo none
	)
```

単純に()で区切る。()内に命令が1つもないとエラーになる。
文字列の比較は ==でつなぐ。
エラーレベルのときは例のように書く。
ファイルの存在を確認するときはexistなど。詳しくは if /? で。


# ファイルからテキストを読み込んで処理
```
for /f "usebackq delims=" %%a in (%inputFile%) do (
	...
)
```

for文のオプション/fがファイルからの読み込み指定。
"delims="の後には区切り文字を指定する。例では何も指定していないので改行で区切る。
usebackqを指定すると、入力にコマンド(``で指定)や、""で区切ったファイル名を指定できるようになる。

# for文の環境変数遅延展開
```
setlocal enableDelayedExpansion
(for /f "usebackq delims=" %%a in (%inputFile%) do (
    set "line=%%a"
    echo !line!
    ...
)) > %outputFile%
endlocal
```

バッチファイルは一命令ずつ読み込んで処理する。for文はすべてを読み込んで処理する。読み込みの際に変数が解決される。
例のようにファイルから読み込むなどで環境変数が変わるときは、使用時に!!で囲む指定を行う。


# 区間内のechoをファイルに出力する
```
(
	...
) > %outputFile%
```



# 文字列の置換
```
set replaced_line=%string1:hoge=fuga%
```
通常の固定文字列の指定

```
call set replaced_line=%%string1:%string2%=%string3%%%
```
置換前、置換後の文字列に変数を使用する際の指定
callを呼ぶことで、いったん変数が展開されたものが呼び出されるイメージで処理される。

```
call set replaced_line=!!line:%string2%=%string3%!!
```
遅延環境変数を使用する際の指定

# 文字列中の文字列検索
```
echo "!line!" | find "%string2%" >nul
if not ERRORLEVEL 1 (
	call :func1 !line!
) else (
)
```

例のようにパイプでfindに渡し、結果はnulに捨てる。
エラーコードで結果を判別し処理。

# 関数呼び出し
```
set flag=0

...

echo %flag%
call :func1 !line!
echo %flag%

...

:func1
echo %1
set flag=1
exit /b 0
```

関数呼び出し（サブルーチン）はラベルをcallする。引数を与えられる。
サブルーチン内では引数を%1 %2...で受取可能。（元のbatファイルの引数が上書きされる模様）
サブルーチンの脱出は exit /b で、整数であれば返り値を指定できる。文字列なら環境変数を使うことになる。
forループからサブルーチンに飛ぶと、遅延展開を考慮せずとも良いとされている。

# setの違い
```
	set "line=%%a"
```
setでの文字列の代入は、左辺のみ""でくくると、代入された変数にも""がつく。
左辺と右辺を両方とも""でくくると、代入後の変数に""が入らない。


# echoで"ECHOは\<OFF\>です"などとでる
コマンドプロンプトで呼んでみるとわかるが、echoは引数がないと現状のecho設定を返す。
バッチファイル上で引数を変数として指定されている場合、引数に何も入っていない場合に上記が出力される。

# 記号が入っているファイルの処理
バッチファイルでは%!=:などが文字列処理の際に使用されるため、入力文字列にそういった記号が含まれている場合に意図しない動作が発生する恐れがある。
バッチファイルでそういった記号が入ったテキストファイルを編集するのはお勧めしない。
2023年のAWSアップデート追いかけてみる（まとめ）

どうも、若松です。

軽い思いで始めたアップデート追っかけ祭りですが、どうやらこのままいくと10記事以上になりそうなことがわかったので、まとめページを用意しました。
（ほんと2~3ヶ月分で1記事のつもりだったんですが、、）

# 記事一覧
https://qiita.com/t_wkm2/items/ff6eba1cc3871305ac81

https://qiita.com/t_wkm2/items/c2375c5af1ae6bbfdfd6

https://qiita.com/t_wkm2/items/429a294b986b58be9317

# まとめ
みんなで追いかけていきましょー
TkinterのTextが「最初は隠れている」問題はバージョンの問題か

# 本稿で扱う情報
Python
Tkinter（デスクトップアプリ制作用ライブラリ）

# 発生している問題
Tkinterで制作したアプリについて、textウィジェット（ほか）が、実行時は見えない状態になっているが、「あるはずの位置」にカーソルを合わせてクリックすると表示され、それ以降は問題なく表示され続ける

参考：Tkinter: テキストボックスが表示されない。
https://teratail.com/questions/b9jyl2uahruike

# 原因（暫定）
バージョン

# 確認できたバージョン
### 発生しない
+ 3.8.5
+ 3.11.4

### 発生する
+ 3.9
+ 3.10(確かそうだったはず）
+ ほかにも発生するバージョン多数、のはず

# 結論
Macのダークモードにも対応してるっぽいし3.11.4を使おう

# 弱腰
3.11.4で開発しますが、固有の問題があったら追記します
【SRE】SRE文化を浸透させるための委員会の取り組みと挑戦

# はじめに
こんにちは！うるるの技術戦略課の古賀と申します！

今回はQiita Engineer Festa 2023の一環で、
SRE導入のモデルケースを作るために
うるる社内でSRE委員会を立ち上げたえんフォト事業部のエピソードと、
成功後である現在の委員会の活動について、ご紹介させていただきます。

SREを導入したくて勉強もしているけど、
日々忙しかったり、ビジネスサイドや、他の開発メンバーに対して、
「SREやろうぜ！」といっても中々踏み切れない方に対して、
この記事が参考になればと思います。


__【この記事で取り扱うこと】__
・「SRE委員会」の設立について
・どんなことを提案したか

__【取り扱わないこと】__
具体的なSREの実現方法、効果については、
[えんフォトにSREを導入した経験と具体的な実践方法を大公開！！](https://qiita.com/yafan_chuang/items/6c028d70c6d059791c29)
をご覧ください。　

# 委員会の設立経緯について

他社のSREと同じだと思いますが、
規模が大きくなったシステムはシステムの信頼性を向上させることが重要な課題となっています。

うるるでは、成熟してきたシステムが増えてきており、
立ち上げ段階のシステム開発とは違うシステム信頼性の向上を視野に入れた開発が必要なステージに当時はなっていました。
そこで。信頼性を向上させる一つの手段として、信頼性を維持する仕組みである、SREを用いていきたいと考えている
大きく分けて上記3点となります。

# 体制について
SRE委員会は、うるるのSREを推進すべく、
__特定の部署に限らず、
うるるのSREを横串で推進すべく、集まった横断組織です。__

私の所属する技術戦略課だけでなく、
当事者のえんフォト事業部、NJSS事業部などなど、
別々の部署からメンバーが集まっております！

# なぜ「委員会」という形を取ったのか
__SRE導入をよりスピーディーで効果的に行うためです。__
えんフォト事業部のメンバーだけでなく、
他部署の知見のあるエンジニアや、VPoEも一丸となって効果的に進めることができ、
導入以降は、横串でSRE未導入の部署に導入できるようにすることが狙いです。

# __導入にあたって__
SREを導入するにしても当然時間も運用する可視化ツールなどにお金もかかってくるので、
まずは委員会でプレゼンの資料を作成することにしました。
どんな観点から説得のための資料作りをしたのか、書いていこうと思います。
（内的な情報もあるため、具体的な内容は一部伏せさせて頂きます。）

[主にプレゼンした内容]
・まずSREってなに？(今回は割愛します)
・SREを推進する理由-なぜ今なのか、何を解決してくれるのか-
・こんな副次的な効果もあります！
・委員会活動をするうえでのお約束

# __SREを推進する理由-なぜ今なのか、何を解決してくれるのか-__

・開発チームの規模感はちょうどいい。
・開発を進める中で技術負債と開発スピードのバランスが徐々に崩れている。
・サービス拡大につれて保守作業の量が増えて来ている。
　（ここで当時メンバーに取った保守作業やトイルに関するアンケートを開示）

などなど、
当時のえんフォト事業部は成長フェイズだったため、
サービスの成長に伴って技術負債や保守作業・トイルの量が徐々に増えてきていました。
なので、サービスをこれからも成長させていくためには、
SREの導入が最適だと主張をしました。

なので、これからSREを導入していきたいと考えている方は、
__なぜ今なのか、
やらないとこの先どうなるのか、
今現場はどんな状態なのか、
それらはどうやったら解決できるのか__
を伝えることが大事だと思います。

また、
__具体的にサービス品質が保証されていると、どのくらいビジネスへ影響を与えるか、
試算でも具体的に数字を見せると、より効果的です！__

月間5分のダウンタイムによる平均ビジネス損失 = XXX円
月間20分のダウンタイムによる平均ビジネス損失 = XXX円
◯◯という保守作業を自動化することで、毎週新機能開発時間がXX時間確保できる。
などなど...

（まだまだありますが、開示できない情報も多いのでこのあたりで...）

# こんな副次的な効果もあります！
例えば...
・SREの実現には多くの技術ノウハウが必要となるため、うるるの技術レベルも上がる。
（自動化に関する、サービス品質やセキュリティのコントロール）
・SREをテーマにして、記事、社外勉強会や外部イベント登壇する事で、
うるるの知名度、採用のしやすさにも繋がるでしょう
（まさに今やっていること）

などなど、SREはサービスの品質向上だけではないことを存分にアピールしました。

# 委員会活動をするうえでのお約束
①SREの導入と推進を目指すという、共有目的を持ったメンバーが自主的に活動している委員会です。
②本業務に影響を及ばされないように、上長の許可をとった上で活動をおこなっています。

要するに
__本業に影響を与えないように頑張ります！__
というお約束です。

# 現在の活動について
その後、
委員会の設立に至り、無事うるるにおけるSRE導入のモデルケースとなりました。
一定の成果を得ることができ、無事委員会存続中。
めでたしめでたし。

現在の活動としては、
・これからのうるるSREのさらなる発展のためには。
・最近のSREに関するトピックの報告・共有。
・未導入の部署へのサポート・質疑応答。
・導入ナレッジのまとめをすることで、スムーズに導入できるようにする。
・イベント参加による、うるるSREの広報。
などを行っております！

# 最後に
今回はQiita Engineer Festa 2023にてSRE委員会の紹介をさせていただきました。
もしお読みいただいた方の会社で、
別部署同士でも、「SREやりたいよね〜」なんて話が出ていたら
こういった形で実現してはいかがでしょうか。

少しでもこの記事がお役立ちできたら幸いでございます。
ChatGPTの新機能「Custom instructions」のあれこれ

2023年7月20日にChatGPTに「Custom instructions」という機能が追加されたので、その機能について調べてみました。

# Custom instructionsとは
![スクリーンショット 2023-07-21 7.25.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/ec709472-59e7-d3aa-1987-6f9a14da6d6b.png)

Custom instructionsとは、ChatGPTの応答をユーザーのニーズに合わせて調整するための新機能です。

Custom instructionsを使うことで、ChatGPTからの応答の中で考慮して欲しいことをあらかじめ伝えておくことができるようになります。

例えばこれまでは「日本語で回答してください」や「〇〇になりきって回答してください」と考慮すべき内容をプロンプトに含める必要がありましたが、この機能を使えばあらかじめ設定しておくことで、毎回入力する必要がなくなります。

これにより、ユーザーは一度指示を設定すれば、それが全ての将来の会話で考慮されるため、毎回同じ情報を繰り返す必要がなくなります。

# Custom instructionsを使うメリット

Custom instructionsの最大の利点は、ChatGPTの応答をユーザーのニーズに合わせてカスタマイズできることです。

これにより、ユーザーは一度指示を設定すれば、それが全ての会話で考慮されるため、毎回同じ情報を繰り返す必要がなくなります。

また、適切にCustom instructionsを設定すれば欲しい回答を得られる可能性を大幅に上げることができます。

# 日本での利用について

2023年7月現在、「Custom instructions」はChatGPT Plusを利用しているユーザーに順次リリースされています。

もし、ChatGPT Plusに加入しているけど利用できないという人は、機能がまだ解放されていないので、使用できるようになるまで数日程度待つ必要があります。

# 設定方法

①Settingを開く

![スクリーンショット 2023-07-21 7.23.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/81f64299-8a34-c6c6-244e-787566c23af0.png)

②「Beta features」から「Custom instructions」をONにする
![スクリーンショット 2023-07-21 7.24.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/7254049e-3ffd-1bcb-4bed-d9c7075b193e.png)

③メニューに「Custom instructions」が表示されるのでクリックして開く
![スクリーンショット 2023-07-21 7.24.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/325c163e-879a-80fe-ca09-9fa5a3763163.png)

④説明が出るので「OK」をクリック
![スクリーンショット 2023-07-21 7.24.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/4949e229-ff23-87bf-4abd-3e2cc2655266.png)

⑤「Custom instructions」を入力
![スクリーンショット 2023-07-21 7.25.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/ec709472-59e7-d3aa-1987-6f9a14da6d6b.png)


# 入力欄の違い

Custom instructions」には二つの入力欄があります。

また、文字数制限はそれぞれ1500文字です。

それぞれの違いは以下の通りです。

## 上の入力欄：What would you like ChatGPT to know about you to provide better responses?

こちらに入力するのはChatGPTに知っておいてほしい「自分」の情報です

職業、趣味、興味、専門知識などを含めることで、ChatGPTがあなたのニーズに合わせてより適切な応答を生成するのに役立つ情報を含むことができます。

例えば、プログラミングについて質問したときに、プログラミング初心者への回答と上級者への回答は大きく変わります。

そのため、もしプログラミングについてよく質問するのであれば、「Pythonを3ヶ月前から開始した初心者」や「フルスタックのエンジニアで10年の実務経験あり」なと自分のプログラミングレベルを書いておくことでChatGPTから自分のレベルに合った回答を得ることができます。

## 下の入力欄：How would you like ChatGPT to respond?

こちらに入力するのは「ChatGPTの応答の形式やスタイル」についての指示です。

これは、特定の情報の提示方法（例えば、リストや表形式）、応答のトーン（例えば、フォーマルまたはカジュアル）、または特定の視点やアプローチ（例えば、批判的思考を促す質問を提供する）などを含むことができます。

例えば、コーディングの生成をお願いしたときに毎回説明が欲しい場合は「コードを生成したときには、その処理についての解説も併せてください」と記載し、逆に説明は不要でコードだけ欲しい時は「コードを生成したときには、説明は不要でコードだけ提示してください」と記載します。

# Q&A

## アプリでも使える？

はい、アプリでもこの機能は使えます。

「ChatGPT Account Settings」から「Custom Instructions」をONにしてください

もし表示されない場合は、アプリを最新のバージョンに更新してください。

## プラグインを利用したときにも適用される？

はい、OpenAIの公式サイトにはプラグインを使用したときにも適用されると記載されています。

## データエクスポートに含まれる？
はい、ChatGPTのデータエクスポートに含まれます。

## ChatGPTとの会話の途中でカスタム指示を変更した場合、既存の会話にも影響を与える？

いえ、その変更が反映されるのは新しいチャットを開始したときです

## 「Custom instructions」が使えない

2023年7月現在、「Custom instructions」はChatGPT Plusを利用しているユーザーに順次リリースされています。

もし、ChatGPT Plusに加入しているけど利用できないという人は、機能がまだ解放されていないので、使用できるようになるまで数日程度待つ必要があります。
package.json備忘録

# 本記事について
package.jsonの機能について個人的に役に立ちそうなものを備忘録的にまとめてみたものになります。
過不足等あるかと思いますが随時メンテしていければと思っております。

# package.jsonとは？
package.jsonとはNode.js上でインストールするパッケージの指定やメタデータの設定、スクリプト
の記述等を行うことができるjson形式のファイルです。
インストールされたパッケージと依存関係はpackage-lock.json(yarnの場合yarn.lock)として生成されます。

# 使用するバージョンの指定方法
ライブラリのバージョン管理には[Semantic Versioning](https://semver.org/lang/ja/)という管理手法が用いられており、後方互換性や機能追加、バグ修正などの影響範囲ごとに`major` `minor` `patch`とし`○○.xx.□□`のようにピリオドで区切られた数字でバージョンを表記しています。

各パッケージのバージョン表記の前に `^(キャレット)`もしくは`~(チルダ)`をつけることでバージョンの更新を自動的に取得し、指定されたバージョンの中から最新のものをインストールするよう許可することができます。

`^(キャレット)`をつけることでminorバージョンまでの更新を、`~(チルダ)`をつけることでpatchバージョンまでの更新を取得してインストールするようになります。
また、完全にバージョンを固定したい場合は記号を付けずにバージョンを指定することで実現可能です。

```
{
  "devDependencies": {
    "@types/node": "^18.16.19",
    "eslint": "~8.45.0",
    "nuxt": "3.6.3"
  }
}
```
こちらの例の場合、`^(キャレット)`で指定している`@types/node`のバージョンは `18.16.x <= 18.x.x < 19.0.0`となり、18.16以降19.0未満の範囲でのバージョン更新を許可する記述となります。
また`eslint`のバージョンは `8.45.0 <= 8.45.x < 8.46.0`となり、8.45.0以降8.46.0未満の範囲でのバージョン更新を許可する記述となります。

# dependenciesとdevDependenciesの使い分け
パッケージをインストールする際に主に使うのが `dependencies`と`devDependencies`というオブジェクトになりますが、具体的にはどのように使い分けるのがよいでしょうか？

dependenciesに記述するものは `本番環境でのビルド時に必要なパッケージ`
devDependenciesに記述するものは `ローカル・テスト環境等でのビルド時に必要なパッケージ`
とされています。

```
{
  "dependencies": {
    "vuetify": "^3.3.9"
  },
  "devDependencies": {
    "@nuxt/devtools": "latest",
    "@types/node": "^18.16.19",  
    "eslint": "^8.45.0",
    "nuxt": "^3.6.3"
  }
}
```
このように、テストツールやトランスパイルが必要なものについてはdevDependenciesに記述します。

# 重複しているパッケージのバージョンをまとめて指定したい
パッケージ同士の依存関係の問題で、同一パッケージの別バージョンが重複していたりすることは開発上よくあるケースだと思います。
それでも問題なく動作しているれば ~~とりあえず~~問題はないのですが、パッケージのバージョン更新を行った際にかみ合わせが悪く何度試してもビルドが通らないくなることが稀によくあるかと思います。


重複したバージョンをインストールしたくない場合は`resolution`オブジェクト内にパッケージとバージョンを指定することで、単一のバージョンをインストールすることができます。
```
{
  "resolutions": {
    "@nuxt/kit": "~3.4.3"
  }
}
```

# まとめ
自分なりにまとめてみましたが、なんとなくで使ってしまっていた部分が多くあったりそもそも知らない機能があったりとドキュメント化する中で知見が深まったように思います。
あれ？この書き方で良いんだっけ？と迷ったときに当記事を思いだして頂ければ幸いです。
マサカリや追記等、ぜひよろしくお願いします！

# 公式
npm 
https://docs.npmjs.com/cli/v9/configuring-npm/package-json

yarn
https://yarnpkg.com/configuration/manifest
a>0 で a>1の場合を考える。

$a>0$ (前提) で $a>1$の場合を考える。

$\left(1+\frac{a-1}{n} \right)^n > 1 + a-1 = a$ 

（これは、よいとして）　だから、

$a^{\frac{1}{n}} < 1+\frac{a-1}{n}$

と言っていいのだろうか？　（良いとして）

任意の$\varepsilon > 0$ に対して、($\varepsilon > \frac{a-1}{n_0}$ つまり)$n_0 > \frac{a-1}{\varepsilon}$ なる $n_0 \in {\bf N}$ が存在して、$n \geq n_0 \Rightarrow |1-a^{\frac{1}{n}}| < \frac{a-1}{n} < \varepsilon$ つまり、$a^{\frac{1}{n}}\rightarrow 1$
Oracle Database 23c セキュリティ新機能: Column Level Audit

今回は、Oracle Database 23cのセキュリティ新機能として、Column Level Auditを紹介します。
従来の監査ポリシーは、SELECTなどのDMLの監査を指定するのはテーブルまででしたが、23cではテーブルのカラム単位までに絞って設定することができるようになりました。
この機能により機密データの列を対象にした監査の実行を限定することで、監査によるパフォーマンスのオーバーヘッドを最小化し、監査ログの出力も抑制できます。
また、Unified AuditにはSYS_CONTEXTで取得できるIPアドレスやプログラムなどのセッション情報を条件に監査を絞ることもできるので、Column Level Auditと組み合わせてより対象を絞った監査ポリシーの作成ができます。

主な特徴としてはこちらのスライドをご覧ください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/40acb900-9224-aebb-efec-91213b6ca3a2.png)


使い方は従来の監査ポリシーで明示的に列を指定するだけです。[前回](https://qiita.com/western24/items/ca6515042d1a84ee07db)作成したHRスキーマと同様に用意した2つのターミナルを使った動作確認を紹介します。

```sql
-SYSユーザーでUnified Auditを削除(A)
EXEC DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL (audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, use_last_arch_timestamp => FALSE);

-Unified Auditのログ件数を確認(A)
select count(*) from unified_audit_trail;
  COUNT(*)
----------
         1

-EMPLOYEES表のSALARY列のSELECTに対する監査ポリシーを作成(A)
CREATE AUDIT POLICY emp_sal_pol ACTIONS SELECT(SALARY) ON HR.EMPLOYEES;
AUDIT POLICY emp_sal_pol;

-SALARY列を含むSELECTを実行(B)  -> Unified Auditの件数は増加する
SELECT SALARY FROM EMPLOYEES;
SELECT * FROM EMPLOYEES;

-SALARY列を含まないSELECTを実行(B) -> Unified Auditの件数は増加しない
SELECT EMPLOYEE_ID from EMPLOYEES;

-Unified Auditのログ内容を確認(A)
SELECT EVENT_TIMESTAMP,DBUSERNAME,SQL_TEXT FROM UNIFIED_AUDIT_TRAIL ORDER BY EVENT_TIMESTAMP DESC;
EVENT_TIMESTAMP                DBUSERNAME SQL_TEXT
------------------------------ ---------- ----------------------------------------
20-JUL-23 01.56.08.683548 PM   HR         SELECT SALARY FROM EMPLOYEES
20-JUL-23 01.53.08.888481 PM   HR         select * from employees

```

Unified Auditについては[こちら](https://qiita.com/western24/items/2e2764a34a3cfe7d80ce)で解説していますので、ご参考にして下さい。
テーブルのSELECTの監査はどうしてもログ件数や膨大になってしまうので、機密列のみのアクセスに限定したSELECTということであれば監査が実行する回数の削減が期待できるのではないかと思います。
Go言語でスクレイピングのしかた

## はじめに

Go言語でのスクレイピングについて、基本的な手順と使用するツールを説明します。

## 必要なパッケージのインストール

Go言語でウェブスクレイピングを行うには、HTMLを解析するためのパッケージが必要となります。ここでは、`goquery`というパッケージを使用します。`goquery`はjQueryのような構文でHTMLの解析を行うことができるため、非常に使いやすいです。

ターミナルで以下のコマンドを実行して`goquery`をインストールします。

```bash
go get github.com/PuerkitoBio/goquery
```

## スクレイピングの基本的な手順

1. **ウェブページの取得**: `http.Get()`関数を使用してウェブページを取得します。
2. **HTMLの解析**: 取得したウェブページのHTMLを`goquery`で解析します。
3. **必要な情報の抽出**: `goquery`のセレクタを使用して、HTMLから必要な情報を抽出します。

以下に、この手順を用いてウェブページからタイトルを取得する基本的なコードを示します。

```go
package main

import (
	"fmt"
	"net/http"

	"github.com/PuerkitoBio/goquery"
)

func main() {
	// 1. ウェブページの取得
	res, err := http.Get("http://example.com")
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	// 2. HTMLの解析
	doc, err := goquery.NewDocumentFromReader(res.Body)
	if err != nil {
		panic(err)
	}

	// 3. 必要な情報の抽出
	title := doc.Find("title").Text()
	fmt.Println(title)
}
```

このコードは`http://example.com`からHTMLを取得し、そのHTMLから`<title>`タグのテキストを抽出して表示します。

## まとめ

この記事では、Go言語を使用したスクレイピングの基本的な手順と、それを実現するための`goquery`パッケージについて説明しました。しかし、これはあくまで基本的なスクレイピングの例であり、より複雑なウェブページや動的なコンテンツのスクレイピングには、さらなるテクニックやツールが必要になります。
週一でPython勉強会やってみる⑬

前回の続き

https://qiita.com/Waddy675/items/0cc2eb693797f8d50e77

教科書通りでもつまらないのでここから一気に路線変更しました！

## ColaboratoryにSelenium導入
下記を参考に設定。

https://dev.classmethod.jp/articles/google-colaboratory-use-selenium/

やったことはひたすら記事通り・・・
先駆者の方ありがとうございます！！

## ログイン処理してログイン後の情報を取得する
無事にSeleniumを導入できたので、実際に動かしてみる。。
お題は弊社のワーカーサイトにIDとパスワードを入力し、ログインボタンを押す。遷移後のおすすすめの店舗に出てくる4店舗を出力するというもの。

### 手順
1. Chromeなどで対象URLを開発者モードで開く
1. 入力フォームにあるidを取得する
1. ID、パスワード、ログインボタン分確認しておく
1. Pythonにドライバーの設定をしておき、対象URLを開く
1. ID、パスワードに入力をする
1. ログインボタンを押す
1. 開発者モードで遷移後の画面に表示されるおすすめ店舗のclass名を取得する
1. 店舗名のテキストを取得する
1. 出力する

### 注意点
- 2の手順でidやclassなどが一意なものなのか検索しておく
　→driverのメソッドにfind_elementとfind_element **s** があるため。
- バージョンによってfind_elementの引数でidかclassかを指定する場合もあれば、find_element_by_idというメソッドの場合もあるので要確認
- 5ではsend_keysメソッドを使用
- 6ではsubmitを使用
- 7は複数使用されているため、配列で返却される
- 8でループ文を使用しprintする

## まとめ
Colaboratoryはヘッドレスモードで使用するので、実際にどう動いているのか確認できないのが残念な点です。
とはいえ実装とデバッグが終われば見ることないのですが・・・
初期段階ではイメージつきにくいので画面見せながら説明するのがよいですね。
MicroShiftをVagrantで試した際のメモ

こちらのチュートリアルに従ってMicroShiftを試した際のメモを記す。
https://community.ibm.com/community/user/cloud/blogs/alexei-karve/2021/11/23/microshift-1


# Vagrantfileの用意

以下の `fedora/36-cloud-base` の `Vagrantfile` を利用する：
https://raw.githubusercontent.com/thinkahead/microshift/094e6f1956378dbea9f87458d63d7f6f7c28093b/vagrant/Vagrantfile.fc36

OpenShiftのAPIサーバーにCLIから接続するために、VMの6443番ポートへのフォワード設定を `Vagrantfile` に追加する：
```
config.vm.network :forwarded_port, guest: 6443, host: 6443, id: "cli"
```

# VMの起動

ホスト上で以下のコマンドを実行：
```
vagrant up
```
```
vagrant ssh
```

## MicroShiftのセットアップ

VM上で以下のコマンドを実行：

```
sudo su -
```
```
./w.sh
```
```
./okd-web-console-install.sh
```

# 接続確認

## CLI
以下のコマンドをホスト上で実行し、ホスト上にkubeconfigファイルを作成する：
```
vagrant ssh -c "sudo cat /var/lib/microshift/resources/kubeadmin/kubeconfig" > ./kubeconfig-mac
```
参考：https://rheb.hatenablog.com/entry/2022/06/24/162156

OpenShift CLIがAPIサーバーに疎通するのを確認する：
```
oc --kubeconfig=./kubeconfig get nodes
```

## Webコンソールの表示

ホスト上の `/etc/hosts` に以下のエントリを追加する：
```
127.0.0.1 console-np-service-kube-system.cluster.local
```

ブラウザから以下のURLにアクセスする：
```
http://console-np-service-kube-system.cluster.local
```
GitHub Copilot ChatがBusinessユーザー向けにもベータ公開されたので組織で有効化してみる

# TL;DR

https://www.publickey1.jp/blog/23/githubgpt-4github_copilot_chatgithub_copilot_for_business.html

待望の機能だったので早速有効化してみました！

# 有効化

`https://github.com/organizations/[組織名]/settings/copilot/policies`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/846dc117-2180-942b-957b-413137a9a244.png)

GitHub Copilotをすでに利用していればこれだけでOK。

# VSCodeから使ってみる

こちらの拡張機能をインストールします。

https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-chat

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/a55fefd0-15f9-652f-198b-274b99966709.png)

サイドバーからチャットにアクセスできます。
日本語で聞けばしっかり日本語で答えてくれます。

選択したコードについて右クリックメニューから質問することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/4fcdaea8-e977-c6fc-701b-cd57882e6a9c.png)

例えばLaravelのコードを説明させてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/1392e002-7690-610f-0d25-5862b1ac423b.png)

英語がわからない場合は翻訳してもらえます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/0881e175-e3dc-6757-2554-26bd6d45673e.png)

# 感想

動作も軽快でレスポンスも速いです。
他のAIチャットツールに画面を切り替えたり、コピペを挟まなくてもすべてVSCodeで完結するのもありがたいですね！