OmniAICreator/Qiita-1.07M huggingface dataset:
[Python] PDF文書からテキストの抽出

## はじめに
PDFは仕事でよく使われるテキスト形式であり、共有や保存に便利です。ただし、その中のテキストを編集したい場合は、PDFからテキストを抽出することをお勧めします。PDFファイルが少ない場合は、専用のPDFリーダーソフトウェアを使用して手動でテキストを抽出できます。しかし、ファイルが多い場合は、プログラミングを使用してPDFのテキストを一括で抽出することができます。この記事では、Pythonを例に挙げて、PDF全体または指定範囲のテキストを抽出する方法を紹介します。
## 環境
* Python 3.12.0
* [Spire.PDF for Python](https://www.e-iceblue.com/Introduce/pdf-for-python.html)ライブラリ

このライブラリは購入する必要がありますが、[30 日間の無料試用版](https://www.e-iceblue.com/TemLicense.html)も提供されています。
もっと多いサンプルコードについて、[Spire.PDF for Python](https://www.e-iceblue.com/Download/Spire-PDF-Python.html)をダウンロードして参照してください。
## 準備
まず、[Spire.PDF for Python](https://www.e-iceblue.com/Introduce/pdf-for-python.html) と plum-dispatch v1.7.4を VS Code にインポートします。
1.	[Python](https://www.python.org/downloads/) をダウンロードしてインストールします。
2.	VS Codeで「Extensions」をクリックし、「Python」を検索してインストールします。
3.	「Explorer」-「NO FOLRDER OPENED」-「Open Folder」
4.	フォルダーを選択し、そこに「.py」ファイルを追加します。
5.	「Terminal」-「New Terminal」
6.	次のコマンドを入力します。
```
pip install Spire.PDF
```
## サンプルコード
### PDFからすべてのテキストを抽出する
まず、必要なモジュールとクラスをインポートします。
```python
from spire.pdf.common import *
from spire.pdf import *
```
PdfDocument オブジェクトを作成し、テキストを抽出する必要がある PDF文書を読み込みます。
```python
pdf = PdfDocument()
pdf.LoadFromFile("C:/Users/Administrator/Desktop/Sample.pdf")
```
すべてのページを反復処理し、各ページを取得してそこからテキスト全体を抽出します。
```python
for i in range(pdf.Pages.Count):
    page = pdf.Pages.get_Item(i)
    text = page.ExtractText()
```
txt ファイルを作成し、抽出したテキストをこのファイルに書き込みます。
```python
extractedText = open("C:/Users/Administrator/Desktop/Text_1.txt", "w", encoding="utf-8")
extractedText.write(text + "\n")
extractedText.close()
pdf.Close()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/34eb3fc2-528a-e37c-953c-ef42c26b7175.png)
### PDFから指定された範囲のテキストを抽出する
この方法は、ページ内の一部のテキストのみを抽出する場合に適しています。
以下は参考コードです。
```python
from spire.pdf import *
from spire.pdf.common import *

pdf = PdfDocument()
pdf.LoadFromFile("C:/Users/Administrator/Desktop/Sample.pdf")
```
指定したページを取得し、抽出するテキストの範囲を設定します。
```python
page = pdf.Pages.get_Item(0)
text = page.ExtractText(RectangleF(0.0, 0.0, 890.0, 160.0))
```
抽出したテキストを新しく作成した txt ファイルに書き込みます。
```python
extractedText = open("C:/Users/Administrator/Desktop/Text_2.txt", "w", encoding="utf-8")
extractedText.write(text)
extractedText.close()
pdf.Close()
```
この場合、ページをループする代わりに、指定されたページを直接取得してテキスト範囲を設定します。 次に、**PdfPageBase.ExtractText()** メソッドを使用してテキストを抽出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/b3a24230-00bb-3f64-32f3-637d63e0a0d3.png)
jQueryとは

# [jQuery](https://jquery.com/) とは・・・

JavaScriptのライブラリの一種で、DOMの操作やサーバーとの処理を簡単なプログラミングで処理してくれるもの（ある程度纏められている）です。

jQueryというプログラミング言語があるのではなく、**記述方法はJavaScript**です。



jQueryを使うとJavaScriptより短く簡単に書けるので初心者でも簡単に難しいコードを組み立てることができます。
※ただしJavaScriptの基礎知識は必要です。


例えばJavaScriptだと
```
const parent = document.getElementById("parent");
```
と記述しますが


これがjQueryだと
```
const parent = $("#parent");
```
になります。


### jQueryの特徴は$関数です ###
DOM要素を取得するのに$(セレクタ)と記述します。

他にもid属性を取得する際に `＃` を使うなどjQueryの独自のメソッドも多々あるようです。
市販顔照合システム（主に国内）について調査中

顔分野のシステムの提供状況、市販ライブラリの状況は変化が激しい。

- これは、自分用のメモである。
- 以下の項目について調べて、自分の用途に適するかどうかを考えていこう。
CPU,　OS,　組込みライブラリとして販売しているかどうか、顔検出、顔照合、顔検索、顔属性推定、顔向き推定、マスク顔対応の有無（検出、照合）

https://www.ipros.jp/cg2/%E9%A1%94%E8%AA%8D%E8%A8%BC%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0/

## 上記のリンク先にない業者
### [PUX FaceU](https://www.pux.co.jp/%E3%83%86%E3%82%AF%E3%83%8E%E3%83%AD%E3%82%B8%E3%83%BC/)
特徴　ライブラリサイズが小さい

> 各機能単位でSDK（ライブラリ、API仕様書、サンプルアプリ一式）で提供いたします。
> NDAを締結の後、一定期間無償で評価いただくことも可能です。
> 詳細はお問い合わせください。


### [NeoFace 顔認証システム導入セット](https://www.otsuka-shokai.co.jp/erpnavi/product/neoface/)
このURLのNeoFaceは大塚商会のものである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/a2c1bb94-1e70-f116-3989-4dc7672aa45e.png)



## 入退室管理システムなどのシステム導入者の場合
この目的のための調査を私はしたことがない。
そのため、ここでは詳細を述べない。


## 顔検出・顔照合を利用するシステムを実装する場合

- それぞれの場合で、利用可能なものが違ってくる。
- 変化の激しい時代なので、容易に陳腐化することで、その実装の改良が放棄されてしまうことは簡単に起こる。
- 利用する側のシステム構成は、OSや依存ライブラリを更新する必要を生じることがある。
- メンテナンスされないライブラリを選ぶことはババを引き当てたことになる。
MacでGit環境構築からGitHubリポジトリ作成まで

MacでGit環境構築と、GitHubのリポジトリ作成までの手順をまとめます。
接続方法はsshを用いています。

# Homebrewのインストール

- [Homebrew](https://brew.sh/)の公式ページからスクリプトをコピー、ターミナルでペースト
下のようなコマンドをコピーできます。
```
　/bin/bash -c "$(curl -fsSL　https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

インストールして、もしパスを通しなさいと言われたら、

```
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/ユーザ名/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"

```
ユーザ名は各自変更しましょう。

- インストールできたか確認する

```
brew -v
```

# gitのインストール

```
brew install git
```

- インストールできたか確認する

```
git --version
```

- git のユーザー情報の登録

```
git config --global user.name "登録する名前"
git config --global user.email "登録するメール"
```

- ssh-keyの作成

```
ssh-keygen -t ed25519 -C "gitに登録したメール"
```

- 鍵の中身をクリップボードへコピー

```
pbcopy < ~/.ssh/id_ed25519.pub
```
# GitHubのリポジトリ作成

ここから先はGitHubアカウント登録が必要です。

- Add SSH key で公開鍵の中身をgithubに登録
自分のアイコンから、setting -> Add SSH key
Titleを設定して、⌘+vでsshkeyをペースト

- ここで確認
```
ssh -T git@github.com
```
Hi　ユーザ名!.........とでたら成功


# GitHubでリモートリポジトリを作成

- sshを選択し、説明通りにコマンドを実行

READMEファイルの作成や、git initなど

### 🎉リポジトリ完成🎉

これでリポジトリは完成です。
Streamlitを使ってみる：その１

データ解析結果をチームで共有するためのサイトを手軽に作れないか、と思い立ち、Streamlitを勉強中です。

# 1. 開発環境

- MacOS Ventura
- Anaconda

Anacondaは導入済みとする

# 2. 参考URL

### 使い方

https://docs.streamlit.io/

>Streamlit is an open-source Python library that makes it easy to create and share beautiful, custom web apps for machine learning and data science. In just a few minutes you can build and deploy powerful data apps. So let's get started!
>Streamlitは、機械学習とデータサイエンス用の美しいカスタムWebアプリを簡単に作成して共有できるオープンソースのPythonライブラリです。わずか数分で、強力なデータアプリを構築して展開できます。それでは始めましょう!(Google翻訳)

https://qiita.com/tamura__246/items/366b5581c03dd74f4508

https://yonesuke0716.hatenablog.com/entry/2022/07/31/215154

### 他フレームワークとの比較

vs Shiny

https://excel2rlang.com/shiny-for-python-covidapp/

# 3. インストール手順

streamlit用の環境を作成

```
% conda create -n streamlit python==3.10
```

streamlit環境をアクチベート

```
% conda activate streamlit
```

streamlitライブラリをインストール

```
% conda install -c conda-forge streamlit
```

streamlitのデモを起動

```
% streamlit hello
```

他に使いそうなライブラリをインストール

```
% conda install pandas numpy scipy scikit-learn scikit-image matplotlib seaborn jupyterlab
```

# 4. テストページを作成してみる

## 4-1. テキストを表示

test_st.pyファイルを作成し、下記を記述して保存

```python:test_st.py
import streamlit as st
st.text("Hello World!")
```

ターミナルで実行

```
% streamlit run test_st.py
```

![streamlit_test1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622965/44a21148-529c-c686-954b-5182b5942ac3.png)


## 4-2. マジックコマンドでテキストを表示

```python:test_st2.py
import streamlit as st

"Hello World!!"
```

![streamlit_test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622965/c03c1f6f-a25e-4753-d289-c27b5d99ae1f.png)

`st.text`のときとフォントが違いますね。

## 4-3. Pandasデータフレームを表示

- マジックコマンド
- st.write
- st.table

の3種類の方法で記述してみます。

```python:test_st3.py
import streamlit as st
import pandas as pd

df = pd.DataFrame([
   {"a":1,"b":2,"c":2},
   {"a":5,"b":6,"c":4},
   {"a":2,"b":-4,"c":10}])

df #マジックコマンドで渡す

st.write(df) #st.writeで渡す

st.table(df) #st.tableで渡す
```

![streamlit_test3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622965/b4fe74bd-82d4-254c-750d-f70622ec21c5.png)

`st.table`だけ見え方が違います。

## 4-4. 折れ線グラフを表示

先ほどのPandasデータフレームをラインプロットしてみる

```python:test_st4.py
import streamlit as st
import pandas as pd

df = pd.DataFrame([
   {"a":1,"b":2,"c":2},
   {"a":5,"b":6,"c":4},
   {"a":2,"b":-4,"c":10}])

st.write(df)

st.line_chart(df)  
```

![streamlit_test4_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622965/c10206dc-2000-0a1f-08da-33ab3734f3af.png)

右上の...をクリックすると画像で保存もできます。

![streamlit_test4_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622965/0b345465-708e-70c6-82c0-98f77be80f9a.png)

[その２](https://qiita.com/MTNakata-ku/items/44257f6577e7f689ba40)に続く。
はじめてのserverless deploy

# はじめに
この一年はバックエンドはDocker+lambdaのserverless deployの構成をずっと触っていましたので、
簡単に振り返ってみたいと思います。


これまでにいくつか記事を投稿しています。

https://qiita.com/does_not_exist/items/a68570cd062f5ff991e5

https://qiita.com/does_not_exist/items/b51009611bebb13aeb2f

https://qiita.com/does_not_exist/items/a130a157a92fe26a3981

https://qiita.com/does_not_exist/items/300c0eb5929a4df6b75a

# はじめてのserverless deploy
Rails+Reactでserverless deployに挑戦しましたが、ハンドラーやlambdaのアップロードサイズ制限などで苦戦しました。

- Dockerイメージとlambda
当時挑戦していたのはDockerイメージをlambdaに載せてサーバレスデプロイする構成でした。
このイメージがlambdaのアップロードサイズの制限を超えているとエラーで引っかかります。
GoやPythonでは気にならなかったのですがRailsだと色々なファイルがあるのでapiモードで作成したプロジェクトをそのままイメージにすると引っかかります。

- ハンドラー
API Gatewayから受け取ったリクエストをlambda関数に紐づける部分のことです。
調べても有益な情報をあまり得られず、社内で他の案件で使用している人に教えていただきました。

```ruby:lambda.rb
require 'json'
require 'rack'
require 'base64'

$app ||= Rack::Builder.parse_file("#{__dir__}/config.ru").first
ENV['RACK_ENV'] ||= 'production'

module App
  class Handler
    def self.process(event:, context:)
      puts event
      body = if event['isBase64Encoded']
        Base64.decode64 event['body']
      else
        event['body']
      end || ''
      puts body if body.present? && body.exclude?('password')

      headers = event.fetch 'headers', {}

      env = {
        'REQUEST_METHOD' => event.fetch('httpMethod'),
        'SCRIPT_NAME' => '',
        'PATH_INFO' => event.fetch('path', ''),
        'QUERY_STRING' => Rack::Utils.build_query(event['queryStringParameters'] || {}),
        'SERVER_NAME' => headers.fetch('Host', 'localhost'),
        'SERVER_PORT' => headers.fetch('X-Forwarded-Port', 443).to_s,

        'rack.version' => Rack::VERSION,
        'rack.url_scheme' => headers.fetch('CloudFront-Forwarded-Proto') { headers.fetch('X-Forwarded-Proto', 'https') },
        'rack.input' => StringIO.new(body),
        'rack.errors' => $stderr,
      }

      headers.each_pair do |key, value|
        name = key.upcase.gsub '-', '_'
        header = case name
          when 'CONTENT_TYPE', 'CONTENT_LENGTH'
            name
          else
            "HTTP_#{name}"
        end
        env[header] = value.to_s
      end

      begin
        status, headers, body = $app.call env

        headers.merge!({
          'Access-Control-Allow-Origin': ENV['CLOUDFRONT_ADDRESS'],
          'Access-Control-Allow-Credentials': true,
          'Access-Control-Expose-Headers': 'Content-Disposition,X-Suggested-Filename',
          'Content-Security-Policy': "default-src 'self'"
        })

        body_content = ""
        body.each do |item|
          body_content += item.to_s
        end

        response = {
          'statusCode' => status,
          'headers' => headers,
          'body' => body_content
        }
      rescue Exception => exception
        response = {
          'statusCode' => 500,
          'body' => exception.message
        }
      end

      response
    end
  end
end
```

# おわりに
少しは慣れたような気がします！
wslでnerves その21

# 概要
wsl(wsl2じゃない)でnervesやってみる。
asdfが魔法なので、コマンドをメモる。

# 起動する。

```
$ . "$HOME/.asdf/asdf.sh"
```

# インストールできるバージョン

```
$ asdf list-all erixir
```

#  インストールされているバージョン

```
$ asdf list elixir
```

# インストールする

```
$ asdf install elixir 1.15.7-otp-26
```


# 現在の設定

```
$ asdf current
```


# カレントバージョンを変更する。


```
$ asdf local elixir 1.15.6-otp-26
```

# カレントバージョンを設定する。

```
$ asdf global elixir 1.15.7-otp-26
```

# どこに、インストールされるの

```
/home/root/.asdf/installs/elixir/1.15.6-otp-26/.mix/archives/hex-2.0.6
```

# からくりは

- asdf は、 $PATH の前に、 shims のディレクトリを挿入することで動作します。


以上。
入門監視に入門する

# About

CARTA HOLDINGSの２４新卒のebikunです。この記事はCARTA Advent Calendar 2023の４日目を担当しています。
最近[入門監視](https://www.amazon.co.jp/%E5%85%A5%E9%96%80-%E7%9B%A3%E8%A6%96-%E2%80%95%E3%83%A2%E3%83%80%E3%83%B3%E3%81%AA%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-Mike-Julian/dp/4873118646/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1V7EBTQYPMA3S&keywords=%E5%85%A5%E9%96%80%E7%9B%A3%E8%A6%96&qid=1699678159&sprefix=%E5%85%A5%E9%96%80%E7%9B%A3%E8%A6%96%2Caps%2C170&sr=8-1)を社内の読書会で読んでいたので今回はそのまとめを書いていこうと思います。

Webアプリケーションの設計トレンドはフロントエンド/バックエンドの間ではMPA,SPA,SSR...と処理の複雑さをどちらに寄せるかという議論のもとで技術の螺旋を描くようにここ十年来移り変わり、インフラ方面の設計ではモノリス、マイクロサービス、モジュラーモノリスとさまざまなパターンが存在します。

しかしそのような変化の中でも変わらない監視の基本とそれを実践できるポイントを簡潔にまとめることにします。

# ポイント

## メトリクスはある関心ごとからの質問に答えるためのものである

さて、ビジネスには多くの人が関わっています。
そのビジネスに関わる人の立場によって関心ごとは異なりますし、それに対応するメトリクスも異なります。
例えば経営者の関心ごととそれに対応するメトリクスはこのようになるでしょう。

| 関心ごと                   | メトリクス                                       |
|--------------------------|------------------------------------------|
| 成長しているか、縮小しているか、停滞しているか | 課金顧客の数                                   |
| どのくらい利益が出ているのか              | 月次経常収益、顧客あたりの収益、粗利（売総）            |
| 顧客は喜んでいるのか                  | ネットプロモータスコア、解約数                        |



しかしエンジニアリングの専門知識をもってビジネスを監視するとなると、ビジネスのメトリクスを技術的なメトリクスと結びつける必要が出てきます。それを行うのが **「外側からの監視」** です。

## 外側からの監視

**サービスの利用者の行動と直接結びついたメトリクスを監視するようにします。**

例えばGoogleのように検索プラットフォームを提供している事業者の場合、「１日あたりの検索数」は間違いなく監視すべきメトリクスになるでしょう。

これらのメトリクスを計測することで問題が発生しているかもしれないことに気づくことができます。例えば検索機能が壊れていたり通常より遅くなっている場合、検索実行数は下がるでしょう。長期的に見ればこのようなメトリクスは比較的安定しているはずですから、メトリクスに変動があれば一目でどのサービスが良くてどのサービスがダメか分かります。もちろん具体的に何が悪いかまでは分かりませんがビジネスが提供する各サービスの調子を表すという意味では十分です。

### TIPS

1. 外側からの監視をするにあたっては「成功率」よりも **「失敗率」を計測した方が効果的です**。
例えばゲームアプリであれば「課金アイテムの購入失敗数」、メッセンジャーアプリであれば「メッセージ送信失敗数」といった具合です。成功を監視していてもアプリが動作しているかどうかという質問には答えられませんが、失敗を監視していればその質問に答えられます（もちろん詳細な原因は分かりませんが）。

2. 何を監視すれば良いか分からない場合、まずはプロダクトマネージャと話してみましょう。利用者がどのようにアプリを使っていて、それぞれの機能はどう動いていたら良いのか、主要なKPIは何かといった具合です。インフラの構成図を描いて、そこに機能をマッピングしてみるのも良いです。何を監視すべきかのヒントになるでしょう。

<続きは私が業務で監視に本格的に関わることになった時に書きます(力尽きた)>
環境ごとの切り替えについて

## はじめに
- 環境変数
- .envファイル
など聞くけど、なぜ必要なの？

:::note info
面倒なことせずに、プログラムに埋め込めば良いんじゃないの？
:::
そういった疑問を持つ方がいたので、環境変数などがなぜ重要か説明します。

## 環境による切り替えが必要な理由
開発環境(dev) /ステージング環境(stg) / 本番環境(prd) によって扱う設定が異なり
環境固有に設定したい値が存在するから必要になります。

その場合、設定をハードコーディング（プログラムに埋め込む）するのではなく、
プログラムの

:::note info
外から環境ごとで切り替えられる仕組み
:::
が必要となる


## 環境変数とは
- プログラムの実行時などに必要となる、利用者やコンピュータごとに内容が異なる設定値などを記録するために使用する
- OSが設定値などを永続的に保存し、利用者や実行されるプログラムから設定・参照できるようにしたもの

### 利用するメリット
- 誤ってリポジトリに機密情報を混入する可能性が低くなる

### 機密情報を設定する場合
- Systems Manager - Parameter Storeを使用する
- GitHub ActionsのEnvironments ( 環境ごとに異なるシークレットを定義)


## .envファイル
### 機密情報の扱いには注意する
- .gitignore 
- git-secrets
- Secret Scanning
- コードレビュー

### 環境ごとの.envファイルを準備する（サンプル）

```env:開発環境 （ .env.dev）
DB_DATABASE = dev
DB_USER = dev
DB_PASSWORD = dev
```

```env:ステージング環境（ .env.stg）
DB_DATABASE = stg
DB_USER = stg
DB_PASSWORD = stg
```

```env:本番環境（ .env.prd）
DB_DATABASE = prd
DB_USER = prd
DB_PASSWORD = prd
```


## 設定に関する注意事項
開発環境(prd) /ステージング環境(stg) / 本番環境(dev) それぞれリポジトリを作成すると反映漏れが発生する可能性が高くなります。
従って、コードの外から環境固有の値を切り替えできるようにすることが重要と言えます。


```python:良い例（サンプル）
env = os.environ.get('ENV')
with open(f'./config.{env}.json') as f:
    config = json.load(f)

sample = config['sample']
```
- 環境固有の値を変更するだけで良くなる
- コードがシンプルになる

```python:悪い例（サンプル）
env = os.environ.get('ENV')
if env == 'prd':
    sample = 'prd-xxx'
elif env == 'stg':
    sample = 'stg-xxx'
else:
    sample = 'dev-xxx'
```
このコードには以下のような問題があります。
- 環境固有の値に変更がある都度、ソースコードの修正 + デプロイが必要になる
- prd / stg / dev 以外に環境を用意した場合、分岐を増やす必要がある
（上記だと、else が dev になるので、prd, stg 以外の環境は全て dev になる）
- 環境固有の値が増えたらその都度if分の中で定義しないといけない
1 つの実数を出力 4 Python3編

次はこれ
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__format_real_number_step4


formatをつかえばいいとおもうけど　変数Mどうやって入れよう。。。と思って
```py
Arr = input().split()
N = float(Arr[0])
M = str(Arr[1])

print("{:.} + M + {f}".format(N))

```
エラーになった。。。。
どう書けばいいんかわからず調べる。

こうだった。
二重かっこにすればよかったんだ。。。

```py
print("{:.{}f}".format(N,M))
```
【AtCoder】 AtCoder Beginner Contest A~C問題の傾向と対策 part1

# はじめに
　この記事では、AtCoder Beginner Contest(以下、ABC)の出題傾向をまとめています。part1では、ABC200~225を、そして今後はABC300までを予定しています。
___
#### なぜABC200~300なのか。
　それは、ABCの問題を解くために必要な典型テクニックが網羅されているからです。(darake調べ)
#### なぜ25回ごとに記事を分けるのか。
　基本的にABCは毎週末に開催されています。月に4回あるとして、100回分をまとめた場合、約2年分に相当します。そうすると傾向という言葉とは少し違うように思いませんか。

　「え、2年前の出題傾向が本当に役に立つの？」

　分かります。確かに傾向は変化していますが、基本的に必要な知識や考え方は変わっていないように感じます。そうすると25回に分ける必要もない気がしてきますが、何に重点を置いて勉強すればよいかという目安にはなると思います。ある程度の目星を付けることで、問題が解けるという楽しさを味わえる可能性が高まるなら、決して悪ではないでしょう。

 # 　対象者
　・これから競技プログラミングを始める人。
　・プログラミングの基礎をある程度学んでいる人。(具体的には、[AtCoder Programming Guide for beginners (APG4b)](https://atcoder.jp/contests/APG4b)がなんとなく分かる程度)
　・AtCoderのレートが灰色~茶色ぐらいの人。

 # 使い方
　添付資料は __2つ__ あります。A,B問題とC問題でグラフや資料の内容を変えています。A,B問題はプログラムの基礎、C問題はテーマ別に分類しています。
　1つ目のグラフは、25回のうち、何回出題されたかが分かります。特に __これを勉強しようというのが決まっていないなら、参考になる__ と思います。
　2つ目の資料は、対象の問題を解く為に、どういう知識や考え方が必要なのかをまとめています。これは、__問題が解けなかった時、何が分かっていて、何が分かっていないのかを知るために使ってください。__ 例えば、「この問題はオーバーフローが分かれば解けた。でも解けなかったのは、intは知ってたけどlong longについての充分な知識がなかったからだ。intとlong longで表現できる数値はどれくらい？同じ知識が必要な別問題を解いてみよう。」とすれば、不足知識を定着させることもできると思います。
  ＊__ポイントの部分は無視してください。__ スピード重視で記事を作成しているため、対象の問題とポイントの内容がずれています。修正予定ですが、先に投稿します。
  
# 資料
①
![スライド1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619656/b6697f69-ab75-1a65-d6ec-c00a464e29fa.jpeg)
![スライド2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619656/ed01b2b3-3147-8a7e-0711-366d826fe3a3.jpeg)
![スライド3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619656/d5b162ea-c77c-915b-ecb3-35cd70addcd1.jpeg)
___
②
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619656/6f52087a-cf4d-7ef8-d9c5-d6cf52799062.jpeg)
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619656/2314cece-c4c1-0b44-959c-874ce99c33df.jpeg)
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619656/9afc168c-b3ee-b17c-d8bf-f0f9b6e484a6.jpeg)

# おわりに

　正直に言います。この記事を書くべきか迷いました。出題比率が高いところが注目されるので、あまり出題されない問題には目を向けられないかもしれないからです。レート向上も良いですが、色々な知識に触れる機会が減ってしまうのはもったいないなと思っています。
　一方で、実は、C問題でも座標圧縮(座圧)が出題されていることを見逃してはいけません。記憶がおぼろげで申し訳ないですが、B問題でも座圧が使えるものがあったような気がします。座圧で躓いている方は、解いてみても良いと思います。
　この記事の本当の目的は、そういうところに焦点を当てられるところだとも言えるでしょう。

　記事が長いと眠くなりますね。早速[AtCoder Problems](https://kenkoooo.com/atcoder/#/table/)で問題を解きましょう。
引継ぎしたシステムにテストを導入したい

# はじめに
今年のカレンダーはとある会社のとあるチームで活動した1年間を振り返っていきます

## 登場人物
### 山田さん：
他チームからヘルプに来てくれた真面目で素直な新メンバー。音声繋いでペアプロしているが声質や話し方が某アイドルグループの某メンバーにそっくり(な気がする)。

### アーキテクチャ先生：
AWSが好きな新上司。Docker on Lambdaを利用したサーバーレスアプリケーションのアーキテクチャなどが得意。いつも忙しい。

# 引継ぎしたシステムにテストを導入するまで

私「やはりテスト入っていないのはしんどいですね…」

山田さん「未然に防げたバグも後から見つかるとその分だけ作業増えますからね…」

私「隙見てテスト書いてみるのでレビューお願いしたいです」

山田さん「分かりました！テスト書いたことないですが頑張ります」

私「本番コードにどれくらい影響ありそうかの観点で見ていただく感じになると思います！」

～しばらくして～

私「Dynamodbに接続する箇所をローカルDBに切り替えたいのですが、そうなると本番コードをいじらないといけなさそうです。関数の依存度も高いのでリファクタリングしたいくらいです」

山田さん「本番と同じDBにテスト用テーブルを作りたくないですよね～。lambdaとローカルでDBの切り替えができればいけそうですかね…」

私「そのあたりの調査から必要になってきますね。一旦テストの導入方法と書き方をまとめるところまでで保留になりそうな気がします。上司と相談してきますね」

山田さん「お願いします！」

～しばらくして～

アーキテクチャ先生「OKです！また検討しましょう！」


# おわりに
引継ぎしてから早い段階でテストを入れたかったところですが、後手になってしまいました。
引継ぎ時にはほぼシステムとして完成しておりフロント改修後にデモとして使用、その後はデモ効果でいくつか案件をいただけたのでその対応という感じでした。今後似たような状況に出会った際は、導入までに必要な作業と時間を早めに見積もってタスクとして挙げておく必要があると感じました。そのためにはテストの書き方やコードの理解力を磨いていく必要があると思うので、まずはそこから引き続き経験を積んでいきたいです。
今回は無理やりテストを書くところまでやっていたので、少しは経験を積むことができたと思います。
1 つの実数を出力 3 Python3編

今日はこれ

https://paiza.jp/works/mondai/stdout_primer/stdout_primer__format_real_number_step3

・そもそも[実数って浮動小数点数のことかと思ったら違う](https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0%E3%81%AF%E5%AE%9F%E6%95%B0%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84/#google_vignette)らしい

・とりあえずPythonの型としては整数はint、実数はfloatかdecimal型として出すらしい
　https://pg-chain.com/python-int-float-decimal#google_vignette
　floatかdecimalのどっちを使うかで悩みそうな気がするが。。。

・とにかく問題としては実数 N が入力されるので、N を丸めて小数第 3 位（0埋め）出力という問題。
とりあえず素直にround使ってみたけど0埋めができない。。。

```py
N = round(float(input()),3)
print(N)
```
はて？
と思ったら、format関数を使えばいいそうだ。（調べた）
そういえばphpにもあったやん。。。。orz

```py
N = float(input())
print("{:.3f}".format(N))
```
下参考までに
[Python String format() Method](https://www.w3schools.com/python/ref_string_format.asp)

あまりにも沢山種類があるが、とりあえずここでは書き方だけ覚えておけば良い。
変換したいところを｛｝でかこみフォーマットを指定して、引数に本来入る数をいれればOK
変換したいところと変換しないところを混ぜてみるとこんな感じ

```py
N = float(input())
print("小数第3位で実行した結果は{:.3f}".format(N))
```
IBM Cloud Functionsの定期実行（Periodic）トリガーを使って指定時間LINE通知


非推奨になってましたが、以前の記事でIBM Cloud Functionsを少し触ってみました。

https://qiita.com/n0bisuke/items/c6361cfef84ca15a407e

トリガーで時間指定ができたので少し触ってみます。

## Periodicの設定

時間指定をGUIで設定でき、cronぽい指定ができます。

>![スクリーンショット 2023-11-07 19.09.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/38df1bd1-1749-71ad-60de-06fdd4f37dd5.png "スクリーンショット 2023-11-07 19.09.42.png")

> ![スクリーンショット 2023-11-07 19.08.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/a230048d-239b-c093-8671-ee5670784b95.png "スクリーンショット 2023-11-07 19.08.56.png")

このGUIめちゃめちゃ便利ですね。
他のサービスも割とこれにしてほしいくらいある。

`毎時10分`に通知するように設定してみました。

## トリガー(Periodic)とアクションの紐付け

トリガーを作っただけだと何にもならないので、アクションと紐づけます。
> ![スクリーンショット 2023-11-07 19.10.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/af4bf7f1-6354-1d30-4eef-326f8d65022e.png "スクリーンショット 2023-11-07 19.10.25.png")


前回の記事でLINE Notifyに通知するアクションを作成してました。

> ![スクリーンショット 2023-11-07 19.10.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/fc2a351d-4442-28ca-6f83-a192ab72afb7.png "スクリーンショット 2023-11-07 19.10.42.png")

選択していってPeriodicとアクションの紐付けをします。

## 指定時間にLINE通知

指定時間の **毎時10分**に通知が来ました。

> ![スクリーンショット 2023-11-17 15.06.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/c0dd95fe-1bc3-9ebe-0205-0591649c37f1.png "スクリーンショット 2023-11-17 15.06.05.png")

かんたん。

## おわりに、 編集がわからない

一回設定したトリガーの編集ってできないのだろうか... 

> ![スクリーンショット 2023-11-07 19.15.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/29e6fc9a-56c2-699e-45a6-bcd15b9fe828.png "スクリーンショット 2023-11-07 19.15.07.png")

うーん... 削除して新規に作るしかないのかも？
boto3でDynamoDBを操作する

## はじめに
DynamoDBをboto3で操作するとき、
登録・更新・削除の処理を書くことが多く、そのメモを残します。

## ソースコード

### 登録
```python:put.py
def put_item(param):
    try:
        table = dynamo.Table(config.TABLE)
        response = table.put_item(
            Item=param
        )
    except Exception as e:
        logger.exception(e)
        raise
```

### 更新
```python:update.py
def update_item(param):
    table = dynamo.Table(config.TABLE)
    try:
        update_params = {
            'Key': {
                'primary_key': primary_key,
                'secodary_key': secodary_key
            },
            'UpdateExpression' : "SET #st = :d",
            'ExpressionAttributeNames': {
                "#st" : "update_column"
            },
            'ExpressionAttributeValues': {
                ":d": param
            }
        }
        response = table.update_item(**update_params)
    except Exception as e:
        logger.exception(e)
        raise
```

### attribute 削除
```python:delete_attribute.py
def delete_attribute(param):
    table = dynamo.Table(config.TABLE)
    try:
        table.update_item(
            Key= {
                'primary_key': primary_key,
                'secodary_key': secodary_key
            },
            UpdateExpression='remove foo' # foo というキーのデータを削除する
        )
    except Exception as e:
        logger.exception(e)
        raise
```

### 削除
```python:delete.py
def delete_item(id):
    table = dynamo.Table(config.TABLE)
    try:
        table.delete_item(Key={'year': year, 'title': title})
    except Exception as e:
        logger.exception(e)
        raise
```
Ubuntuのバージョン更新に際してのエラー対応

# はじめに
本記事では、**Ubuntu LTSのバージョンを更新する方法**を紹介します。特に、「アップグレード作業を見積もれません」というエラーメッセージへの対応方法を記載します。


# 前提条件
以下のをご準備ください。
* Ubuntu LTS をインストール済みのPC
* ネットワーク接続環境


# 手順
### 1. バージョンの確認
まず、以下のコマンドで現在のバージョンを確認します。
```
$ cat /etc/os-release
```
続いて、以下のコマンドで更新可能なバージョンの有無を確認します。
```
$ sudo do-release-upgrade -c
```
コマンドが実行できない場合は、まず以下のコマンドでupdate managerをインストールします。
```
$ sudo apt install update-manager
```
バージョンの更新が可能な場合は、以下の手順に進みます。

### 2. バージョン更新のための準備
バージョン更新の準備として、以下のコマンドでパッケージのアップデート・アップグレードを実施します。パッケージの更新後にマシンの再起動も実施します。
```
$ sudo apt update
$ sudo apt upgrade
$ sudo apt full-upgrade
$ sudo reboot
```


### 3. Ubuntuのバージョン更新
以下のコマンドを実行し、Ubuntuのバージョンを更新します。途中いくつか質問がありますが、いずれも``y``で先に進みます。
```
$ sudo do-release-upgrade
```
バージョン更新の完了後に再起動が行われます。再起動したら以下のコマンドでバージョンを確認します。
```
$ cat /etc/os-release
```
無事バージョンが更新されていれば成功です。

# エラー対応
「アップグレード作業を見積もれません」というエラーメッセージが出て、``$ sudo do-release-upgrade
``が実行できない場合があります。その場合、``/var/log/dist-upgrade/main.log``を確認します。ファイルの末尾あたりに``INFO failed to remove libpython-stdlib``等の記述があり、削除できなかったパッケージ（先の例では``libpython-stdlib``が該当）が記載されています。

削除できなかったファイルを確認できたら、以下のコマンドで手動で削除し、再度手順３を実行します。
```
$ sudo apt remove libpython-stdlib
```

# 参考URL
基本的なアップグレード手順は以下の記事を参考にしました。

https://tech.uzabase.com/entry/2022/10/05/163458
はじめての環境閉鎖でしくじったお話

# はじめに
今年のカレンダーはとある会社のとあるチームで活動した1年間を振り返っていきます

## 登場人物

### 山田さん：
他チームからヘルプに来てくれた真面目で素直な新メンバー。音声繋いでペアプロしているが声質や話し方が某アイドルグループの某メンバーにそっくり(な気がする)。

### アーキテクチャ先生：
AWSが好きな新上司。Docker on Lambdaを利用したサーバーレスアプリケーションのアーキテクチャなどが得意。いつも忙しい。

# はじめての環境閉鎖でしくじったお話

アーキテクチャ先生「あ、そういえば先日の展示会で使用した環境ですがもう使用しないので閉鎖お願いします」

私「sls removeした後ドメインの紐づけを解除する感じですかね」

アーキテクチャ先生「そうですね！コンソールから直接削除するものは怖いので専門チームに依頼出しましょうか」

私「はい！」

・・・

私「remove成功ですね、コンソールから作成していたスタックが消えているのも確認できています」

山田さん「問題なさそうですね！では私は別件で呼ばれているので少し抜けますね」

~しばらくして~

私「ドメインの削除忘れてたな、やっておこう」

他チームのエンジニア「開発環境にアクセスできなくなったのですが、更新中とかですか？」

私「更新はしていないですね…(この時はまだ何もわかっていない)　確認します！」

山田さん「カスタムドメインが消えてますね」

山田さん「もしかしてAWS_PROFILEが切り替わっていないかもしれない！？」

私「echo $AWS_PROFILE！」

私「切り替わっていないですね…コンテナ落としていたかもしれないです。それで開発環境のAWS_PROFILEになっていたのか」

# おわりに
コンテナを落とすとAWS_PROFILEが毎回空白になるのを失念していました。
当時は他の作業も入っていたので、先に閉鎖作業を終わらそうとダブルチェックせずに作業を行ってしまったことも良くなかったです。今回は社内の開発環境でしたが、これがユーザー向けの環境だった場合を考えるととても怖いです。
抵抗早見表：消費電力，ディレーティング

電圧と抵抗値が決まった際に，**実際に使用する抵抗部品の定格グレードをいくつにするか確認** しますよね．　 
かれこれ２０年近く，毎度電卓を叩いて確認していましたが，電卓を叩く元気も暗算力も衰えてきたので自分で見る用に早見表をつくりました．

# 条件
抵抗の消費電力は毎度おなじみオームの法則より
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/e24239a8-5630-5996-050d-0fd80e8b3053.png)

# 定格グレード/ディレーティング
抵抗の定格グレードはチップ抵抗のメジャーどこで色分けします．
ディレーティング５０％ってことで，部品の定格の半分を超えないように早見表を作成します．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/6ec46aaf-f358-c300-1d63-89abf8e5b907.png)

# 抵抗電力早見表

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/d36fe3b1-6144-618c-bd77-106aeeb00457.png)
Google Chromeのブックマークレットを使って、画面の全チェックボックスをON / OFFする

# 前置き
はじめまして、ムカイと申します。
システムエンジニアをやっています。
最近参画したプロジェクトで基本設計書を作成するはずが、基盤が全く固まっておらず、なぜかワイヤーフレームを作成しています。(元々Web出身だと自己紹介した結果、デザイナーをすることに)
ちまちました機能や備忘録を投稿していきたいと思ってます。
では、どうぞよしなに。

# ブックマークレットの登録方法
前提：Google Chromeを使用。ブックマークバーは表示済み
1. ブックマークバーを右クリックし、「ページを追加...」をクリック
1. ブックマークに好きな名前を付け、URLに下記のコードをコピー&ペーストする

```
javascript:(function(){if(jQuery){var checkboxes = jQuery(':checkbox');if(checkboxes.length > 0){var allChecked = checkboxes.is(':checked');checkboxes.prop('checked', !allChecked);}}else{var script = document.createElement('script');script.src = 'https://code.jquery.com/jquery-3.6.4.min.js';script.onload = function(){var checkboxes = jQuery(':checkbox');if(checkboxes.length > 0){var allChecked = checkboxes.is(':checked');checkboxes.prop('checked', !allChecked);}};document.head.appendChild(script);}})();
```

# 動作
![CPT2311171417-112x796.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622932/30c856d2-1ec6-32a0-8b91-7ee0815460c3.gif)

わかりづらいですが、上で登録したブックマークをクリックしてます。
使いどころは微妙ですが、あったら便利的な機能です。

## 注意
画面の全てのチェックボックスに作用するので、指差し確認:point_up:して利用してください。

以上、初投稿でした。(初投稿がニッチな機能すぎる。。)
IHP(Integrated Haskell Platform)をWin11環境に導入する

HaskellにはIntegrated Haskell Platformというフルスタックのwebフレームワークがあります。

しかし、linuxやコマンドに慣れていないユーザの導入ハードルが高く感じたので記事を書きます。

以下、bashのコマンドでうまく実行できない場合は頭にsudoをつけてみてください。

# 参照元
- https://ihp.digitallyinduced.com/Guide/installation.html

## WSLを導入する
まずはwindows上でlinuxを動かすためのWSLをインストールします。

powershellを管理者権限で開き、以下を実行します。
```posh:powershell
wsl --install
```

windowsを再起動するとターミナルが自動的に起動するので、usernameとpasswordを設定します。

一旦ターミナルを閉じて、powershellでWSLの導入成功を確認し、WSLを起動します。
```posh:powershell
wsl -l -v
wsl
```

以下を順に実行しubuntuのアップデート等を行います。
```bash:bash
sudo apt update
sudo apt upgrade
sudo apt install git curl make xdg-utils -y
```

vimで.bashrcを開き、
```bash:bash
vim /home/[username]/.bashrc
```

カーソルキーで最下部に移動し、aでインサートモードに入ります。
そして以下を追記したら、ESCでインサートモードを抜けて **:w** で保存し、 **:q** でvimを抜けてください。
```vim:.bashrc
PATH=$(/usr/bin/printenv PATH | /usr/bin/perl -ne 'print join(":", grep { !/\/mnt\/[a-z]/ } split(/:/));')
. ~/.nix-profile/etc/profile.d/nix.sh
```

ファイルが読み込み専用でしか開けない場合は、以下のコマンドで権限を編集してください。
```bash:bash
sudo chmod 755 /home/[username]/.bashrc
```

これでWSLの導入は終了です。

## nixを導入する
とても便利なパッケージマネジャです。

nix用のフォルダを作成。
```bash:bash
sudo mkdir -p /etc/nix
```

nix.confを作成。
```bash:bash
sudo touch /etc/nix/nix.conf
```

vimでnix.confを開き、
```bash:bash
vim /etc/nix/nix.conf
```

先程のようにvimを使い、nix.confを編集。
```vim:nix.conf
sandbox = false
use-sqlite-wal = false
experimental-features = nix-command flakes
```

nixをインストール
```bash:bash
curl -L https://nixos.org/nix/install | sh
```

インストールが完了したら、一度ターミナルを閉じ、再度WSLに入り直してください。

これでnixの導入は完了です。

## IHPの導入

IHPの導入はこれだけで完了です。
```bash:bash
nix-env --install ihp-new
```

## VSCodeの設定
VSCodeを使用している場合は、以下の拡張機能を導入してください。
- [direnv](https://marketplace.visualstudio.com/items?itemName=mkhl.direnv)
- [Haskell](https://marketplace.visualstudio.com/items?itemName=haskell.haskell)
- [Haskell HSX](https://marketplace.visualstudio.com/items?itemName=s0kil.vscode-hsx)

direnvを導入したあとに、先程編集した.bashrcに追記してください。
```bash:.bashrc
eval "$(direnv hook bash)"
```

これにてIHPの導入は終了です。
【Laravel】大文字・小文字・数字が1文字以上含まれるパスワードの生成方法

## 概要

下記の条件を満たすパスワードの生成

- 大文字が1文字以上含まれる
- 小文字が1文字以上含まれる
- 数字が1文字以上含まれる
- 文字数は8文字

### 環境

- Laravel Sailでの環境構築
    - Laravel 10.30.1
    - PHP 8.2.12

## 実際の記述

```php
private function generatePassword(): string
{
    $password = Str::password(8);

    if (preg_match('/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,}$/', $password)) {
        return $password;
    }

    return $this->generatePassword();
}
```

## 補足

- `Controller`内のprivateメソッドに定義した際の記述
    - ハッシュ化（`Hash::make()`）はメソッドの呼び出し先で処理
- 他の文字数に設定したい場合は下記2箇所の`8`を任意の数に書き換える
    - `Str::password(8)`
    - `'/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,}$/'`
はじめてユーザー向けに環境構築してしくじったお話

# はじめに
今年のカレンダーはとある会社のとあるチームで活動した1年間を振り返っていきます

## 登場人物
### 山田さん：
他チームからヘルプに来てくれた真面目で素直な新メンバー。音声繋いでペアプロしているが声質や話し方が某アイドルグループの某メンバーにそっくり(な気がする)。

# はじめてユーザー向けに環境構築してしくじったお話
私たちは社内の開発環境のブランチから環境変数の切り替えを行ってユーザー向けの環境を構築していました。

私「これで動作検証も終わりですかね。

山田さん「やっと環境構築できましたね。期日より早く環境お渡しできそうで良かったです。」

~後日~

営業さん「認証メールからログイン画面に遷移したあとログインできないと問い合わせが来ています」

山田さん「確認します！」

・・・

山田さん「遷移先が社内の開発環境になったままでした…すぐ修正できます」

私「環境変数の切り替えができていなかったですね…」

期日より早めに環境をお渡して動作確認いただいていたのがせめてもの救いでした。ユーザーとのやり取りが発生してしまい営業さんには手間を取らせてしまいました。

動作検証時にメールの挙動などは確認できていたのですが、肝心のリンク先は確認漏れでした。
今回の反省を生かして翌日には検証項目リストの作成を行いました。

以降は環境構築によるトラブルは発生することなく運用できていました。


# おわりに
2人体制で初めてユーザー向けに環境構築を行いましたが、ユーザー認証機能や環境変数、AWS設定など多くのことを学びました。構築に至るまでの多くの手順をまとめることにいっぱいになってしまい、その後の検証がおろそかになってしまいました。
【Laravel】ログイン済みの特定ユーザーのみが閲覧できるページの作成方法

## 概要

- adminユーザーとデフォルトユーザーでテーブルを分けるのではなく、1つのユーザーテーブルのみを作成
- それぞれのユーザーが持つ`admin_id`の値で権限をチェックして、ログイン済み、且つadmin権限を持つユーザーのみが閲覧できるページを作成

### 前提

- Laravel Breezeがインストール済
- `admin_id`カラムを持つUserテーブルを作成
    - `admin_id`が1の場合、adminユーザー
    - `admin_id`が1以外の場合、デフォルトユーザー

### 環境

- Laravel Sailでの環境構築
    - Laravel 10.30.1
    - PHP 8.2.12
    - Laravel Breeze

## 実際の記述

```php:app/Models/User.php
// 既存ファイルに以下を追記

public function isAdmin(): bool
{
    return $this->role_id === 1;
}
```

```php:app/Http/Middleware/CheckRole.php
// ファイルを新規作成して、以下を記載

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class CheckRole
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        if (auth()->check() && $request->user()->isAdmin()) {
            return $next($request);
        }

        return abort(403, 'Unauthorized');
    }
}
```

```php:app/Http/Kernel.php
protected $middlewareAliases = [
    // 既存ファイルに以下を追記
    
    'checkRole' => \App\Http\Middleware\CheckRole::class,
];
```

```php:routes/auth.php
// 既存ファイルに以下を追記

Route::middleware(['auth', 'checkRole'])->group(function () {
    // ここにadmin権限を持つユーザーのみが閲覧できるRouteの処理を書く
});
```
WSL ( 2.0.9.0 )で外部ネットワークからアクセスできるようにする

WSLで外部ネットワークからアクセスできるようにしていたのですが

Windows UpdateでWSLのバージョンアップ(2.0.9.0になった）にともなって設定の変更が必要になったので変更内容を備忘録がわりに投稿してみます

● 以前(多分WSL 1.x.x.x)
Windows上のインターネット接続用のアダプタとは別にWSL用のネットワークアダプタ(名前をwslAdapterとします)を用意
（このアダプタは「コントロールパネル」の「アダプタの設定の変更」でのプロパティをすべてoff）
（Windowsで使用しているAdapterをWSLで共有するのはなんか気持ち悪いのでアダプタを別に用意して実現するほうがいいかなと）

WSL起動後にPowerShell(管理者用）で下記のコマンドで強制的にWSL上のネットワークをwslAdapterに変更

Set-VMSwitch -name "WSL" -NetAdapterName "wslAdapter" -AllowManagementOS $true

そのあとWSL上でIPアドレスをリフレッシュ
sudo ip addr flush dev eth0
sudo dhclient eth0

● WSL 2.0.9.0上
Hyper-Vマネージャー上で仮想スイッチを新規に作成（"WSLswitch"）し外部でwslAdapterのアダプタを割付

PowerShellでwsl --shutdownあと
.wslconfigに
[wsl2]
networkingMode=bridged
vmSwitch=WSLswitch
を追加

この状態でWSLを起動するととりあえず外部のIPアドレスが割りついているところまでは確認

（どの程度動くかはこれからですが）

参考にしたサイト

@shimoe(k shimoe)

https://qiita.com/shimoe/items/9ad5103f51972b8884dd
【Google Cloud Next Tokyo ’23レポート】PIVOT様と事例を交えて、クラウドリフトに潜むしくじりポイントを大公開 !!

# 概要
PIVOT 様と事例を交えて、クラウドリフトに潜むしくじりポイントを大公開 !!
 今後を見据えた PIVOT 様のビジネス映像メディアのクラウド化。TOPGATE ではオンプレミス環境から Google Cloud へのリフト支援。その際に出た「違う！そうじゃない！」悲鳴と怒号、悲しみと安堵。今回はクラウドリフトに潜む“しくじりポイント“の公開に付き合ってもらおう。

株式会社トップゲート 竹内 薫 氏
開発部 インフラチームリーダー

株式会社トップゲート 小川 智寛 氏
開発部 部長 兼 執行役員 VPoE

PIVOT株式会社 蜂須賀 大貴 氏
プロダクトマネジメントチーム プロダクトマネージャー

PIVOT株式会社 黒澤 進伍 氏
プロダクトマネジメントチーム ソフトウェアエンジニア

# 所感
しくじり、というワードがタイトルにある通り、
オンプレミスからクラウドへ移行するというプロジェクトにおける「しくじり」話。

個人的には、成功したお話を聞くよりも、
こういったお話の方がリアリティがあり、すごく参考になる事が多いと思っています。

セッションでは、発注者としてPIVOTさん、そして受注し移行作業を進める側としてトップゲートさんが対談形式で登壇。
そもそもしくじり話をこの両者登壇という形で実現できている時点で、両者の関係性がそこそこ良好である事は感じ取れます。
(もし悲惨なことになっていたら、実現しなかったろう・・・)

内容としては、技術的な見落としなども所々にあるものの、
話の主軸は、「プロジェクトマネジメント」だと思います。

発注者側として、どのように依頼し、進捗を確認・管理し、作業をしてもらうか。
受注側として、どのような期待を持たれて、期待されるスケジュールや最低限の達成ポイントはどこにあるのか。

こういったコミニュケーションがいかに大事であるか、ということを感じることができました。

それにしても対談の中で、PIVOTさん、トップゲートさんの関係性が見えて、色々あったけどいい雰囲気で達成できた、というワン
チーム感があって、見ていてとても気持ちが良かったです。

深夜作業にslackに飛んでくる不吉なメッセージなど、当時の心中は穏やかでなかったかもしれないですが、
互いに責めるのではなく、その状況の中でも、目的達成のために「何をするのがベスト」なのか、を企業の垣根を超えて一つのチームとなって推し進めていった、というがとてもいいなと感じました。

チーム作りは、自社内・外問わず、プロジェクトのとても大事な要素であることを再認識。

# 内容メモ
## PIVOT
映像番組を軸としたビジネスメディア。
youtubeで毎日無料配信中。

### クラウドリフトの背景
- 完全外注でローンチしたサービス
- オンプレミスで構成されていた
    - 1つの物理サーバーが単一障害点に
    - メンテナンスが困難
- GCPとAWSがクラウド移行の候補に
    - コンペを実施
- 安全性
    - メディアを安定的に配信可能
- 金額
    - スモールスタートできるかどうか
- 将来性
    - 映像系サービスの将来性
    - 分析基盤
## GCPの優位性
-　分析領域が強い
-　コンテンツのデータ分析をする上で、GA4やBigQueryとの親和性が高い

## アーキテクト
![PXL_20231116_041043403.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1458753/0399b4e3-c7d7-e5d3-f5d2-7a4f05a8f6ca.jpeg)

## パネルディスカッションより
### PJの初速
- クラウド選定事、GCPが安全性・安定性、ダウンタイムの最小化など要望に合致した。
- 初回ミーティングは「こんにちわ」の時間がすごく長かった
    - スケジュールなどの話があると期待していた
- 4/3にキックオフ→スケジュールが出たのがGW明け
- 現状把握がまだできていない状況だった
- 当初の想定ではGW開けぐらいにはリフト完了のつもりだった
- 発注する側が丸投げすると起こる
### LXDのTG殴り
- 作業範囲の役割分担が曖昧だった
- 役割と技術スタックが想定と違った、その点でのコミニュケーションが足りなかった
- slackなどは流せてしまうので、ミーティングを実施して進捗を確認
### 墾田永年DMS
- DMS＝データベースマイグレーションサービス＝DB間のデータ移行サービス
    - ダウンタイムをなくすために利用を決めていた
- ダウンタイム０で利用できると聞いていた
    - そのためのDNS
- いざ移行となった時にDMSが使えない
    - サポートに問い合わせ
    - 従来のDBが、クラウドSQLに取り込めない構成・設定になっていた
- それもやむなし、書き込みを停止した場合の影響範囲を調査
    - 会員登録などの書き込みは停止してもやむなし
    - ただし、閲覧、メディアの再生は絶対に止めたくない
- bump&リストアで対応
    - １h想定でメンテナス時間を設定
    - 深夜帯
- しかしうまくいかず。。。。（夜中２時）
    - slack上がお通夜状態
- １hが経過しそうなので、一旦切りもどし
    - メンテナンス時間としてはスケジュール通り
    - しかし目的達成できず。。。
- チェック不足
- 再度チャレンジして移行完了
- 達成時にはワンチームで喜びを共有

### ショックザパリス
- GCPのパリリージョンで障害があった
    - トップゲート側でその対応にリソースが大幅に割かれる事態あった
    - PIVOT側（発注側）には関係のない話
### プロマネ（コミニュケーション）
- 最初からいかにワンチームを作れるか、で今回の至る所のしくじりポイントを解決できたと思う
- 知識不足、技術不足はあるものの、コミニュケーションがとれていれば、もっと早く気づけていたのでは。

## まとめ
PIVOT　× トップゲートの話ではあるが、今回のしくじりは、相手がどこであろうと発生したと思う。
発注側はスケジュールの許容範囲やデッドライン、ワンチーム作りを意識する必要があるという学び

受注側は、スケジュールやマイルストーン、リスクヘッジなどをいかに考えられているか。
マネジメントは重要。

プロジェクトを進める上で、発注側、受注側、それぞれでのマネジメントが大事
# 関連記事
- [【Google Cloud Next Tokyo ’23レポート】 by yukiMiyoshi_fcafe](https://qiita.com/yukiMiyoshi_fcafe/items/18ad65426e1a71311419)
- [【Google Cloud Next Tokyo ’23レポート】 by sho_fcafe](https://qiita.com/sho_fcafe/items/a97ee90d6a05f68e1c01)
【Google Cloud Next Tokyo ’23レポート】生成AIのもたらすインパクトとエンタープライズ利用における検討ポイント

# 概要
本セッションでは、生成 AI の特徴と、エンタープライズでの利用時に検討すべきポイントについて、主にシステム構成の観点で説明します。
生成 AI はその強力なケイパビリティにより、多くのユースケースが検討されていますが、エンタープライズ利用においては、生成 AI がもたらすリスクを理解して、ビジネス / 組織 / システムといった観点での対応を検討する必要があります。必要な対応を、本セッションで学ぶことができます。

Google Cloud 遠山 雄二
カスタマー エンジニア

# 所感
このセッションでは、主にどのようなステップで生成AIを作成すべきなのか、ざっくりと知ることができた。

開発上で考えるべきこともさることながら、
それ以前の段階で、例えば現状のビジネスがどのように運用されていてどこに改善の余地があるのか、
現状データはどのように蓄積されているのか、
AIを用いることによる法律的な観点でのリスクがないのか、
そしてAIを用いることでどれぐらいの改善インパクトが見込めるのか、または改善したと言えるための基準値（KPI）の定義など、
必要な検討ポイントが述べられている。

そしてこれらの検討ポイントは必ずしもAIだけに当てはまるものではなく、
どんなものでも、開発する上で重要なポイントとなるのではないか、と思う。

# 内容メモ
## インパクトとリスク
### インパクト
生成AIの登場で、7%のGDP成長

### リスク
- ハルシネーション
- AI倫理を考慮した開発が必要
- PaLM2には有毒性検出機能がある

## エンタプラーズでの検討ステップ
- ビジネスドメインとユースケースの特定
    - ビジネスインパクトの観点
        - 繰り返し作業
        - ドキュメントに基づく対応
        - データの検索などの範囲は？
    - フィージビリティの観点
        - 十分なデータがあるか？
        - リスクを許容できるか？
            - ミッションクリティカル
- テータソース
    - なんのデータが必要か？
        - 関連するデータは？
    - どこにあるデータが必要か？
        - データの保存場所は？
    - どのようガバナンスが必要か？
        - アクセス件の管理
        - 機密情報や個人情報は？
- タスクフォース
    - ビジネス、技術面からなるチームを構成
        - ビジネス担当者
        - エンジニア
            - プロンプト
            - 実装
        - リーガル担当
        - MLリード
- 成功基準の定義
    - ビジネス、技術のKPIの定義
        - 精度
        - 生産性
        - 魔族ど
        - コスト削減
        - エラー
- 自社データと統合したアプリの開発
    - LLMと自社データを統合したアプリケーション
        - パフォーマンスの考慮
        - LLM
        - グラウンディング
            - 指定した情報に基づいてMMLに回答させる手法
        - セキュリティ
- 利用者拡大
    - トライアルし、フィードバックを得る
    - 更なる改善ポイントを探る
- 運用βプランの整理
    - 評価指標を測定し、継続的に改善する
    - おブザーばビリティ
        - LLMのアウトトット品質
        - アプリ全体の品質
        - 監査情報の取得
        - 事前に決めたKPIが指標
- 同じドメインへ追加ユースケースに取り組む
    - ゆーすけーすの横展開
    - 今後の全社展開、社外公開も見据えて

## システム構成面での考慮点
- パフォーマンス
    - テキスト→ベクトル変換API
    - Embeddings API
        - 非構造データからのデータ抽出
    - ベクトルDB
        - Cloud Sql
        - Alloy DB
        - Bigquery
        - VertexAI Vector searc
    - LLMの選択とチューニング
        - ユースケースを踏まえて選択
        - ROIを考慮
- セキュリティ
    - 機密データの処理
        - アタックプロンプトの検出
        - データのアクセス制御
- オブザーバビリティ
    - LLMの評価
    - アプリケーションの評価
    - 監査
##　VertexAI Search
- グランディングからの言語検索
    - 情報ソースの提示
- 社内ポータルからAPIで繋ぎ、バックエンドとして使用できる
- 社内文書の検索
- WEBサイトのナビ
- リサーチ業務の効率化
- プロダクトカタログの検索性向上

# 関連記事
- [【Google Cloud Next Tokyo ’23レポート】 by yukiMiyoshi_fcafe](https://qiita.com/yukiMiyoshi_fcafe/items/18ad65426e1a71311419)
- [【Google Cloud Next Tokyo ’23レポート】 by sho_fcafe](https://qiita.com/sho_fcafe/items/a97ee90d6a05f68e1c01)
千里眼と八岐大蛇

login.html
以下にクォーテーションにより発生
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login Page</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            text-align: center;
            margin: 100px;
        }

        #loginForm {
            width: 300px;
            margin: 0 auto;
            background-color: #fff;
            padding: 20px;
            border-radius: 10px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }

        input {
            width: 100%;
            padding: 10px;
            margin-bottom: 10px;
        }

        button {
            width: 100%;
            padding: 10px;
            background-color: #4caf50;
            color: #fff;
            border: none;
            border-radius: 5px;
            cursor: pointer;
        }

        button:hover {
            background-color: #45a049;
        }

        #errorMessage {
            color: #ff0000;
            margin-top: 10px;
        }
    </style>
</head>
<body>
    <div id="loginForm">
        <h2>Login</h2>
        <label for="id">ID:</label>
        <input type="text" id="id" name="id" required>
        <br>
        <label for="password">Password:</label>
        <input type="password" id="password" name="password" required>
        <br>
        <button onclick="login()">Login</button>
        <div id="errorMessage"></div>
    </div>

    <script>
        function login() {
            var id = document.getElementById('id').value;
            var password = document.getElementById('password').value;
            var errorMessage = document.getElementById('errorMessage');

            // シンプルなIDとパスワードの検証
            if (id === 'id0000' && password === 'pass1111') {
                //↓　ログイン成功時にはアラートが表示される。さらに↓のページ遷移に変更
		// ログイン成功時の処理（ここではアラート表示）
                //alert('Login successful!');
		// ログイン成功時のリダイレクト
                window.location.href = 'success.html';
            } else {
                // ログイン失敗時の処理
                errorMessage.textContent = 'Incorrect ID or password. Please try again.';
            }
        }
    </script>
</body>
</html>
```

success.html
```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Success Page</title>
</head>
<body>
    <h2>Welcome to the Success Page!</h2>
    <p>Here are some downloadable files:</p>

    <!-- ダウンロード用リンク1 -->
    <a href="file:///D:/file1.txt" download="file1.txt">
        <button>Download File 1</button>
    </a>

    <!-- ダウンロード用リンク2 -->
    <a href="file:///D:/file2.zip" download="file2.zip">
        <button>Download File 2</button>
    </a>

    <!-- ダウンロード用リンク3 -->
    <a href="file:///D:/file3.csv" download="file3.csv">
        <button>Download File 3</button>
    </a>
</body>
</html>
```
demo


```java:demo.java

@RequestMapping(value = "/user/create", method = RequestMethod.POST)
public String create(@Validated @ModelAttribute UserRequest userRequest, BindingResult result, Model model) {
    if (result.hasErrors()) {
        List<String> accountNameErrors = new ArrayList<>();
        List<String> loginIdErrors = new ArrayList<>();
        List<String> passwordErrors = new ArrayList<>();

        for (ObjectError error : result.getAllErrors()) {
            String defaultMessage = Objects.requireNonNull(error.getDefaultMessage());
            String errorMessage = messageSource.getMessage(defaultMessage, null, defaultMessage, LocaleContextHolder.getLocale());

            if (defaultMessage.contains("アカウント名")) {
                accountNameErrors.add(errorMessage);
            } else if (defaultMessage.contains("ログインID")) {
                loginIdErrors.add(errorMessage);
            } else if (defaultMessage.contains("パスワード")) {
                passwordErrors.add(errorMessage);
            }
        }

        model.addAttribute("accountNameErrors", accountNameErrors);
        model.addAttribute("loginIdErrors", loginIdErrors);
        model.addAttribute("passwordErrors", passwordErrors);

        return "user/add";
    }

    userService.create(userRequest);
    return "redirect:/user/list";
}

```


```html:title.html

<div th:if="${accountNameErrors}">
    <div th:each="error : ${accountNameErrors}">
        <p th:text="${error}"></p>
    </div>
</div>

<div th:if="${loginIdErrors}">
    <div th:each="error : ${loginIdErrors}">
        <p th:text="${error}"></p>
    </div>
</div>

<div th:if="${passwordErrors}">
    <div th:each="error : ${passwordErrors}">
        <p th:text="${error}"></p>
    </div>
</div>

```
自分のリポジトリをAIにコードレビューしてもらっていて快適です。

# はじめに
最近自分のgithubリポジトリに[CodeRabbit](https://coderabbit.ai/)を導入してみています。AIがPRの内容を見てコードレビューしてPRにコメントをくれます。2023-11-17時点ではフリープランが用意されており、publicリポジトリに対しては無料でコードレビューまでしてくれるので個人利用の範囲であれば十分な機能を備えていると思います。
中身はOSS化されている様子。
https://github.com/coderabbitai/ai-pr-reviewer

# CodeRabbit
githubまたはgitlabのアカウントでサインインすることができます。

リポジトリごとにレビュー内容や言語などを細かく設定することができます（逆にリポジトリを跨いで一括で設定する方法はなさそう？)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619165/d20fd179-fdcb-503a-153a-5d348e3e2cbe.png)

# どんな感じ？

PRを作るとCodeRabbitが差分を読み取って、サマリーを書き加え、コード内容へのコメントをしてくれるようになります。

・サマリーの例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619165/bdb992d3-679c-2023-944b-5a7dc362a6ba.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619165/2c233e88-1b13-6d13-3454-10e49c337d69.png)


https://github.com/Showichiro/timer/pull/38

・コードへのコメントの例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619165/dcb33e87-8164-8eee-8e57-ecf9003881d6.png)

返信をすると返事をくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619165/8894ecb1-0d59-5050-d4a7-9a2059f853c8.png)

https://github.com/Showichiro/ts-convertor-generator-from-excel/pull/3

# 使ってみてどう？

- 自分一人でメンテナンスしているリポジトリは杜撰な管理(mainブランチに直プッシュなど)をしてしまうのですが、AIがコメントをくれるのでちゃんとPRを作る気が湧きます。返事くれるし。とはいえまだまだちゃんと管理しているとは言えないけれど...。
- まだ使って見ている途中ですが、コードの形式的な部分のチェックなどはAIが全部見てくれる時代が来る、のかもしれない。
- 現時点ではコミット差分だけを見てコメントしている（ぽい）ので、リポジトリ全体を見てのレビューはなさそう。例えば、READMEが差分に含まれない場合に「READMEのアップデートが漏れてるよ！」とかはコメントしてくれなさそう。プロンプトなどを工夫するとうまくいくのかはわからない。
【Anaconda】Homebrewを使ってAnacondaをインストールし、仮想環境を構築する方法

## はじめに
HomebrewでAnacondaをインストールし、仮想環境を構築する方法についてのメモとなります。

## 環境
■ MacOS
14.0
■ チップ
Apple M2

## 前提条件
Homebrewがインストールされていること

■ Homebrew
https://brew.sh

## 1.Anacondaのインストール
brewを用いて、anacondaをインストールします。

```terminal:Terminal
$ brew install --cask anaconda
```

Anacondaのパスを確認します。

```terminal:Terminal
$ brew info anaconda
# 出力
==> anaconda: 2023.09-0 (auto_updates)
https://www.anaconda.com/
/opt/homebrew/Caskroom/anaconda/2023.09-0 (744.0MB) #←パスを確認
中略
```

パスの中身を確認したところ、インストーラースクリプトがありました。
以下のコマンドで、Anacondaのインストーラースクリプトを実行します。
```terminal:Terminal
$ chmod +x Anaconda3-2023.09-0-MacOSX-arm64.sh
$ ./Anaconda3-2023.09-0-MacOSX-arm64.sh
# 出力
中略

Do you accept the license terms? [yes|no]
[no] >>> yes

中略

[/Users/xxxx/anaconda3] >>> 
PREFIX=/Users/xxxx/anaconda3 #←パスを確認
Unpacking payload ...

中略

Preparing transaction: done
Executing transaction: / 
- WARNING conda.core.envs_manager:register_env(49): Unable to register environment. Path not writable or missing.
  environment location: /Users/xxxx/anaconda3
  registry file: /Users/xxxx/.conda/environments.txt
done
installation finished.
Do you wish the installer to initialize Anaconda3
by running conda init? [yes|no]
[yes] >>> yes

中略
```

上で確認したパス（Anacondaのバイナリディレクトリのパス）を設定します。
```terminal:Terminal
$ echo 'export PATH="/Users/xxxx/anaconda3/bin:$PATH"' >> ~/.zshrc
$ source ~/.zshrc
```

condaコマンドが使用できるかを確認します。
無事できました！

```terminal:Terminal
$ conda -V
# 出力
conda 23.7.4
```

デフォルト（base）の仮想環境の状態で、他の仮想環境に切り替えるには、まず最初にデフォルト（base）の仮想環境を抜け出す必要があります。
このような手間を避けて、仮想環境の切り替えをスムーズに行うために、
シェルの設定を変更してデフォルト（base）環境が自動的に入らないようにすることをお勧めします！
以下のコマンドで設定できます。
```terminal:Terminal
$ conda config --set auto_activate_base false
```

設定が正しく反映されたかについては、以下のコマンドで確認できます。
```terminal:Terminal
$ conda config --show | grep auto_activate_base
# 出力
auto_activate_base: False
```

## 2.仮想環境を構築
base仮想環境の場合、base仮想環境からまず抜け出す必要があります。
base仮想環境を無効にせずに仮想環境を作成すると、仮想環境の中に仮想環境が作成されるという
問題が発生します。
```terminal:Terminal
(base) $ conda deactivate
```

仮想環境を構築します。
pythonのバージョンを指定しないと、現在インストールされているPythonのバージョンの中から最新のバージョンを選んで環境を作成します。
libraryの場合は指定しないと、追加のライブラリが含まれていない "空の" 環境となります。
```terminal:Terminal
$ conda create -n {name} python={version} {library}
```

## 3.仮想環境を実行
以下のコマンドで、作成した仮想環境に切り替わります。
```terminal:Terminal
$ conda activate {name}
```

## 最後に
これで、Homebrewを使ってAnacondaをインストールし、仮想環境を構築することができました。
下の方に、仮想環境でよく使うコマンドについてまとめているので、見てください笑


| 説明 | コマンド |
| :--- | :--- |
| condaバージョン確認 | `conda -V` or `conda --version` |
| 特定のパッケージをインストール | `conda install [name]==version` |
| 特定のパッケージをアップデート | `conda update [name]` |
| 特定のパッケージをアンインストール | `conda uninstall [name]` |
| すべてのパッケージをアップデート | `conda update --all` |
| インストールしたパッケージを確認 | `conda list` |
| 仮想環境の一覧を確認 | `conda env list` or `conda info --env` |
| 仮想環境を構築 | `conda create -n [name] python=[version] [library]` |
| 仮想環境をコピー | `conda create -n [new name] --clone [old name]` |
| 仮想環境を有効化 | `conda activate [name]` |
| 仮想環境を無効化 | `conda deactivate` |
| 仮想環境を削除 | `conda remove -n [name] --all` |