OmniAICreator/Qiita-1.07M huggingface dataset:
【RSpec】POSTリクエストが送れずハマった話

## はじめに
request specに関する記事です。
かなり沼った＋参考になる記事があまり無かったので、初学者に役に立てれば嬉しいです！
## RubyとRailsのバージョン
- Ruby 2.7.7
- Rails 6.0.6.1

## エラー発生時点
### 修正前コード
※FactoryBotにてuserとpostを登録しています。
```ruby:spec/requests/likes_spec.rb
require 'rails_helper'

RSpec.describe 'Api::Likes', type: :request do
  let!(:user) { create(:user) }
  let!(:post) { create(:post, user: user) }

  context 'ログインしている場合' do
    before do
      sign_in user
    end

    describe 'POST /api/like' do
      it 'いいね出来る' do
        post post_like_path(post.id)
        body = JSON.parse(response.body)
        expect(response.status).to eq(200)
        expect(body).to eq({ 'likesCount'=>1, 'status'=>'ok' })
      end
    end
  end
end
```

### エラー内容
```
Failures:

  1) Api::Likes ログインしている場合 POST /api/like いいね出来る
     Failure/Error: post post_like_path(post.id)

     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     # ./spec/requests/api/likes_spec.rb:24:in `block (4 levels) in <top (required)>'
```
エラー文には「予測される引数は０個だけど、１個余分にあるよ」って事が書いてあります。
ヘルパーメソッドのpost_like_pathに、(post.id)という引数が１つ必要なのに？？

## 原因
エラー内容をググってみると、同じような内容の方を1名発見しました。
```
post post_like_path(post.id)
```
ここでPOSTリクエストを送っていたつもりが、Rspecでは
```
let!(:post) { create(:post, user: user) }
```
で定義していたpost変数の事だと認識していたようです。

## エラー改善
### 修正後コード
```ruby:spec/requests/likes_spec.rb
require 'rails_helper'

RSpec.describe 'Api::Likes', type: :request do
  let!(:user) { create(:user) }
  # 下記post→new_postと定義
  # postリクエストとpostインスタンスが重複してしまう為
  let!(:new_post) { create(:post, user: user) }

  context 'ログインしている場合' do
    before do
      sign_in user
    end

    describe 'POST /api/like' do
      it 'いいね出来る' do
        post post_like_path(new_post.id)
        body = JSON.parse(response.body)
        expect(response.status).to eq(200)
        expect(body).to eq({ 'likesCount'=>new_post.likes.count, 'status'=>'ok' })
      end
    end
  end
end

```
無事テストが通りました。


## 最後に
Postモデルではなく、Articleモデルを使用した方が良さそうですね。
改めて命名法には気をつけなければならないと痛感しました。

## 参考文献
https://qiita.com/kurawo___D/items/50d260546255526c734f
ReactでfetchしたデータをsetStateするときに目から鱗だった方法

# はじめに

仕事でNextjsを書いているのですが、そこで同僚の方(フロント強い)が実装したコードに驚いたのでまとめてみます。
JavaScirptにある程度知見がある方は常識のようにやっているのかもしれませんが、私ともう一人の同僚は知らなかったのでもしかしたら知らないかとも多いのかなと思っています。

# こんな感じで書いていませんか？

とあるAPIを叩いて返ってきたレスポンスを`setState`するときに以下のようなコードを書いていませんか？

```ts
      fetch(`/todos`)
        .then((s) => s.json())
        .then((json: ResponseJson) => {setTodos({
            ...json
        })
```

私もこのようなコードを書いていました。。。

# このようにかくとよいかも

```ts
      fetch(`/todos`)
        .then((s) => s.json())
        .then(setTodos)
```

これを使えば`ResponseJson`も消えるしコードも少なくなるし最高だとなりました

# おわりに

目から鱗だったのでまとめてみました
日々周りの方から色々学べて良い環境です
Auto Scalingグループ内のEC2インスタンスを無停止で入れ替える

Auto Scalingグループ内のEC2インスタンスを無停止かつ手動で入れ替える手順をご紹介します。

今回は、起動テンプレートに記述されているEC2のインスタンスサイズを「Micro」から「Small」に変更して、Auto Scalingグループ内の「Microサイズ（旧）×2台」と新たに起動した「Smallサイズ（新）×2台」を入れ替えます。

# 前提
前提として、EC2インスタンス（Microサイズ）×2台、起動テンプレート、Auto Scalingグループが作成済みである事とします。

# 1. 起動テンプレート修正
AWSマネジメントコンソールにログインして、ナビゲーションのサービスから「EC2」を選択します。

![2023102701.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143947/32cab678-58ac-5fdc-3ade-3aca088ef80b.jpeg)

EC2のナビゲーションペインから「起動テンプレート」を選択します。

![2023102702.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143947/2dc73bd5-e0d7-cd01-bf3a-f903406bfcdb.jpeg)

表示された対象の起動テンプレートを選択して右クリック、以下の画像のように「テンプレートを変更（新しいバージョンを作成）」を選択します。

![2023102703.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143947/69fabc8c-6981-a10f-38b2-aabe6060729b.jpeg)

インスタンスタイプを「Small」に変更して、「テンプレートのバージョンを作成」ボタンを選択して適用します。

![2023102704.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143947/6468e7fd-c545-9142-6564-9c303c46767c.jpeg)

以上で、起動テンプレートのインスタンスサイズ変更は完了です。

:::note info
次回のAuto Scalingから、SmallサイズのEC2インスタンスが起動されるようになります。
:::

# 2. EC2インスタンスのスケールアウト数（2台→4台）修正

EC2のナビゲーションペインから「Auto Scaling グループ」を選択して、「高度な設定」から「編集」を選択します。

![2023102705.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143947/002dc984-83ac-64f3-3a41-94257cc7ea80.jpeg)

終了ポリシーから「最も古いインスタンス」を選択、デフォルトのクールダウンは「60」を入力して「更新」を選択します。

![2023102706.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143947/e87d660c-3ae1-7eed-054e-8221fb502106.jpeg)

:::note info
終了ポリシーに「最も古いインスタンス」を選択すると起動してから最も時間が経過しているEC2インスタンスから廃棄されます。
:::

EC2のナビゲーションペインから「Auto Scaling グループ」を選択して、「グループの詳細」から「編集」を選択します。

![2023102707.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143947/34c1cf4d-ee5d-f877-dcb3-b97b0b312201.jpeg)

希望するキャパシティ、最小キャパシティ、最大キャパシティに設定されているキャパシティ数を「2」から「4」に変更して「更新」を選択します。

![2023102708.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143947/5d938111-270e-a257-9eb1-de95f8a0d645.jpeg)

:::note info
各キャパシティを「4」に設定するとEC2インスタンスが2台から4台に増えます。
:::

暫くするとSmallサイズのEC2インスタンスが新たに2台起動して、インスタンスの状態が「実行中」に変化します。

![2023102709.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143947/1a329448-b359-bac7-512e-a842eab9273e.jpeg)

# 3. EC2インスタンスのスケールアウト数（4台→2台）修正

EC2のナビゲーションペインから「Auto Scaling グループ」を選択して、「グループの詳細」から「編集」を選択します。

![2023102710.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143947/a12d8c50-735e-5153-a1fe-74c654422e9a.jpeg)

希望するキャパシティ、最小キャパシティ、最大キャパシティに設定されているキャパシティ数を「4」から「2」に変更して「更新」を選択します。

![2023102711.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143947/c1328e47-a3c1-6c7e-e9df-be7ff26a120c.jpeg)

:::note info
各キャパシティを「2」に設定するとEC2インスタンスが4台から2台に減ります。
:::

暫くするとMicroサイズの既存のEC2インスタンス×2台が停止して、インスタンスの状態が「終了済み」に変化します。

![2023102712.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143947/a3f814d4-e4b0-6e35-c826-c72204fec610.jpeg)

:::note info
終了ポリシーに「最も古いインスタンス」を選択しているため、起動してから最も時間が経過しているMicroサイズの既存のEC2インスタンス×2台から廃棄されます。
:::
githubでのプルリクの送り方

# gitでプルリクするまでの流れ
個人開発でプルリクする意味はあまりないのかなとは思いますが、チーム開発するときには必須なので、その時のために準備しておこうと思ってまとめた備忘録です。




## 1 . issues, リモートブランチを立てる
githubでissuesを立て、 **issues/#(#はissuesの番号)** という名前でブランチ作成。

issuesを立てるときはこれらのことを意識すると良い。
* what: 何を実装したいのか
* why: どうして実装したいのか
* issues一つに対して実装する機能は一つ


## 2 . ローカルブランチを作成
下記コマンドでリモートのブランチの最新情報を取得し、リモートに対応したローカルブランチを作成。
```bash
$ git fetch origin
$ git checkout issues/#
```

## 3 . ローカルで作業
作業後に下記コマンドを入力していくことでリモートの **issues/#** ブランチに変更点が更新される。
```bash
$ git add
$ git commit
$ git push origin issues/#
```

## 4 . プルリクを送る
リモートの **main** ブランチと **issues/#** ブランチで差異が発生しているのでここでようやくプルリクを送ることになる。
プルリクを送る際にこれらを意識するとよい。
* issuesを立てた時に設定項目に対して何ができたのか or 何ができなかったのか
* what: 何を実装できたか or できなかったのか
* why: なんで実装したのか or できなかったのか
* how: どのように実装したのか


## 5 . プルリクに対するコメント、レビュー
プルリク送ったあとは変更点を確認した後に問題がないことを確認したり、レビュー、コメントする。
## 6 . マージする
マージする。 その後は立てた **issues** と **ブランチ** は削除したほうが良い。
lanngchainでAzureのやつ使おうとしたら openai.error.InvalidRequestError: Resource not found

# どんな内容か（おこったこと）

langchainでAzureにデプロイしているGPTを利用しようとしたら
下記エラーが表示された。

```
openai.error.InvalidRequestError: Resource not found
```

絶対にパスワードとかその他もろもろ設定間違ってるわけがない！！
という意気込みだったのにこのエラーが出てきまくってた。

それを解決できたよって話

# 結論

これを
```
from langchain.chat_models import ChatOpenAI
import openai
```

こう
```
from langchain.chat_models import ChatOpenAI
# import openai
```

解決できたけど理由はわかってないです
コメントお願いします。

openaiと競合してたんやなかろか～という感じでした。

# どんなエラーか powered by gpt-4

```
openai.error.InvalidRequestError: Resource not found は、OpenAIのAPIまたはその他のリソースを使用してリクエストを行った際に、指定したリソースが見つからなかった場合に表示されるエラーメッセージです。

具体的には、以下のような状況が考えられます：

URLのタイポ: リクエストを送信する際のURLが間違っている場合。
リソースの存在しないIDを指定: たとえば、特定のドキュメントやデータを取得するためのIDが間違っている、またはそのIDのリソースが存在しない場合。
エンドポイントの変更: APIのバージョンアップや変更が行われ、以前のエンドポイントが存在しなくなった場合。
このエラーが表示された場合、まずリクエストのURLや指定したIDなどのパラメータを確認し、正確にリクエストを行っているかを確認することが必要です。また、APIのドキュメンテーションを参照して、エンドポイントやリソースの指定方法が正しいかどうかを再確認するとよいでしょう。
```
ubuntu(virtual box)にRとR Studioをインストールしてみた

参照サイト
https://noooooorick.hatenablog.jp/entry/2023/04/18/122151
https://cran.r-project.org/bin/linux/ubuntu/
https://posit.co/code-signing/

# インストール
## Rをインストール
```console:console
sudo apt update -qq
sudo apt install --no-install-recommends software-properties-common dirmngr
wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | sudo tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc
sudo add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/"
sudo apt install --no-install-recommends r-base
sudo add-apt-repository ppa:c2d4u.team/c2d4u4.0+
```


## R Studioをインストール

### debファイルをダウンロード
https://posit.co/download/rstudio-desktop/#download

### インストール
```console:console
sudo apt install ./RSTUDIO-20xx.xx.x-494-AMD64.DEB
```

## コンパイラをインストール
```console:console
sudo apt install g++
sudo apt install gfortran
```
- パッケージをインストールする際にコンパイラがインストールされていないとエラーとなる
Polarsのwrite_excelでautofitによる列幅の自動調整が効かないとき

# 問題
Polarsの`polars.DataFrame`の`write_excel`というメソッドでデータをエクセルにエクスポートできます。
`write_excel`の`autofit`引数にTrueを指定することで列幅の自動調整をかけることが可能ですが、2バイト文字が混じると中途半端に自動調整されてしまいうまくいきません。

# 対処法
polarsではxlsxwriterというモジュールを使ってエクセルにエクスポートしているので、これをいじります。
xlsxwriterのutility.pyというファイルに`xl_pixel_width`という関数があります。ここに

```python
length += CHAR_WIDTHS.get(char, 8)
```

がありますので、この8を12ぐらいにするといい感じになります。

# 結果

いい感じになる

# 参考情報
polars=0.19.7
xlsxwriter=3.1.9
HTMLで文字のグラデーションを動かす方法

# はじめに
どうAtsu1209です♪(←音符復活)

いきなりですがh1テキストなどの色をグラデーションにしたのはいいけど
アニメーションをつけたいなと思ったことはありませんか?
なので今回はテキストをグラデーション&色変化のアニメーションにする
方法を書いて行きます。

# CSS
まずグラデーションを作ります
例として h1テキストを使います。

まずHTMLを書きます
```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<title>グラデーション</title>
</head>
<body>
<h1 class="glad">Hello World</h1>
</body>
</html>
```
今回はClassを使ってCSSを書きたいのでClassをつけておきます
次にCSS

```css:index.css
.glad {
  
  background: linear-gradient(90deg, #1e90ff, #00bfff, #87cefa);
  background-size: 200% 100%;
  animation: gradientAnimation 4s linear infinite;
 -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
  
  
}
@keyframes gradientAnimation {
            0% {
                background-position: 200% 0;
            }
            100% {
                background-position: -200% 0;
            }
        }
```

::: note 
background: linear-gradient(90deg, #1e90ff, #00bfff, #87cefa);
の`#1e90ff`と`#00bfff`と`#87cefa`でグラーデーションに使う
3色を指定しています。
:::

::: note
@keyframes gradientAnimationで色が変化するアニメーション
をつけていて、上の`background`で指定した色を変化させて行く
ようになっています
:::
見本

https://glad.atsu1209game.repl.co/

# 以上
今回はグラデーションを動かす方法を書きました。
是非使ってみてはいかがでしょうか
なにか意見がありましたらコメントへ
では 次の記事で
【宗教戦争】半角スペースの表し方について【␣と△】

この記事にたどり着いてくれて、まずはありがとう。
こんな内容を検索するなんて、あんたも相当物好きね。
.



### １．はじめに
とある話の中で、半角スペースを　$\tiny{△}$　で書いたらびっくりされた。
「何それ！　␣が一般的だよｗ」と言われた。

この記事は、**確固たる意志を持って、$\tiny{△}$が優位であるということの証明を目指す記事である。**　止めてくれるな。

### ２．情報収集　その０-思い出す
そもそもなぜ私が△を使うようになったのだろうか。
よく思い出せないが、正式にプログラミングを学び始めたのは大学に入ってからだった。
初めて触ったプログラムはScratchだった。（年齢バレ要素）
次はC言語だった。
その時のテキストをもう一度見ればわかるかもしれない…（あいまい）


### ３．情報収集　その１-wikipedia
まずは情報を集めよう。
wikipediaを見てみる。
> 空白記号
> https://ja.wikipedia.org/wiki/%E7%A9%BA%E7%99%BD%E8%A8%98%E5%8F%B7
>> 空白記号は、コマンドでの入力内容を書籍などで表現する時のスペース（空白）入力を表す目的や、プログラミング言語でのスペースを明示する目的で使用される下線（アンダースコア）の両脇に上に伸びる縦線のついた空箱のような記号である。
>> 「␣」

**負けた…。**

だが、このような記述もあった。

>> プログラミング言語などの表現においては、スペースを表現する手法として「△」や「•」を空白記号の代わりに使用することもある。

**プログラミング言語などの表現においては？？**
どういう意味だろうか。言語によって異なるのだろうか…？


### ４．情報収集　その２-OKWAVE
興味深いQ&Aを見つけた。
> スペースを表す記号のような印をだしたいのです
> https://okwave.jp/qa/q4743123.html
>> 2009/02/23 19:50
>> たとえばパソコンに入力する説明を文字で表す場合に、○○○　▼▼と表記したときの、この○と▼の間のスペースをあらわす記号はありますか？
よく［　を左に90度回転（上向き？）させたものです。

どう考えても、「␣」のことを指している。
ベストアンサーも、
>> 2009/02/23 20:41
>> MS-IME2002ですが、う2423 と書いて変換せずに続いて[F5]キーでどうでしょうか？

と、入力の仕方まで教えてしまっている。

だが…

>> 2009/02/23 20:25
>> **プログラマはブランク（空白）は”白三角で現します。**
>> 「Ｘ　Ｙ　Ｚ」→「Ｘ△Ｙ△Ｚ」

という回答があった。仲間がいるよ！


### ５．情報収集　その３-日立製作所
なんだかよくわからないが、日立製作所のCOBOLで作られたツールの説明書にたどり着いた。
> 分散トランザクション処理機能　OpenTP1 プログラム作成リファレンス COBOL言語編
> https://itpfdoc.hitachi.co.jp/manuals/3000/30003D5550/PCBL0004.HTM
>> このマニュアルで使用する各種記号を説明します。
>> 　｜　△白三角　｜　半角スペースを示します。　｜

**きたっ！！日立製作所は△派だ！！！　これは強い。**

なんだがよくわからないが、日立製作所のHiRDBの説明書にもたどり着いた。（これ、正規のやつ？）
> HiRDB XML Extension Version 9 3020-6-480-30 解説・手引書 HiRDB XML 拡張機能
> https://manualzz.com/doc/ja/14010988/hirdb-xml-extension-version-9-3020-6-480-30-%E8%A7%A3%E8%AA%AC%E3%83%BB%E6%89%8B%E5%BC%95%E6%9B%B8-hirdb-...

これの１０ページ目にも同様の記載がある。

**COBOLだけでなく、データベースの説明書も　△　なら、もはや日立製作所は　△　と言っても過言ではない。**

### ６．考察
これらのことを踏まえると、着実に△派は生きていることがわかる。
だが、隅に追いやられていることも事実。
全プログラマーにアンケートを取ってみたいところだが、真実が明らかになったら私の精神が耐えられないだろうと思うので辞めておく。
学校とかで使われている教科書にはどう書かれているのかも気になるところではある。
調査はまだまだ続く。

### ７．まとめ
△派よ、ほそぼそと生き延びてくれ。
そして、必ずや多数派になることを誓おう。
␣派は手ごわい。
負けてはいけない。
耐えるのだ。
今は耐えるのだ。

何らかの情報があったらコメントしてくれると助かるのだ。よろしくお願いしますなのだ。
.
.
.
.
.
.
　**␣はアンダーバーと混同しちゃうから、良くないんじゃないかな～。と言っておく。**
VSCodeでワークスペースを作りtsconfig.jsonの設定をそれぞれのワークスペースにも適用させる

個人開発(知人と開発だがほぼ一人)のフロントエンドで学習も込めてなんちゃってDDDとしてリポジトリ層、モデル層、ユースケース層などに区分けしたディレクトリを切っていたり、NextJSのAPI機能を使っているのでそのディレクトリ、Supabaseのfunction(cloud workersみたいなやつ）のディレクトリも切ってあったり、componentも少し細かくディレクトリを切っていたりとディレクトリを追うのが面倒になってきたのでワークスペースをちゃんと切って作業することにしました。

## .vscode/hoge.code-workspace のファイル作成
hogeの部分は任意でファイルを切ります。

```.vscode/hoge.code-workspace
{
  "folders": [
    {
      "name": "リポジトリ層",
      "path": "../src/repositories"
    },
    {
      "name": "ユースケース層",
      "path": "../src/usecases"
    },
    {
      "name": "root",
      "path": "../"
    }
  ]
}

```
適当に自分の思うディレクトリを設定してください。そしてvscodeを使っている場合は右下の方に「ワークスペースを開く」というボタンがあるのでクリックすると設定したワークスペースで一気に開くことができます。

## tsconfig.json設定が読み込まれない
しかしここで問題となるのはサブディレクトリ側のtypeエラーです。
tsconfig.jsonがサブディレクトリでは読み込まれないことに起因しています。

## サブディレクトリにルートディレクトリのtsconfigを参照するtsconfig.jsonを設定する

```src/usecases/tsconfig.json と src/repositories/tsconfig.json
// 親のtsconfig.jsonを参照
{
    "extends": "../../tsconfig.json"
}
```

このように拡張させることでそのまま設定を引き継ぐことができました。

### 個別でディレクトリ毎にtsconfigの設定させて親側で設定を重複させたくない場合
個別でディレクトリ毎にtsconfigの設定させたい場合は逆に親側のtsconfig.json側で

```
  // ...compileoptionsなど省略
  "references": [
    { "path": "./src/repositories/tsconfig.json" },
    { "path": "./src/usecases/tsconfig.json" }
  ]
  ...
```
のように参照すればできるかと。

## 終わりに
個人開発なので気にせずtsconfigをディレクトリ毎に用意できますがチームで開発する場合はサブディレクトリにtsconfig.jsonを置くことに抵抗があるかもしれません。事前にモノリポ寄りでディレクトリが多くなることを踏まえワークスペースで作業することに同意を得た上でこのような形にすれば良いのかなと思います。
ABC-013B「錠」 解説

皆さん、こんにちは！
今回はABC-013のB問題「錠」について解説していきたいと思います！
（https://atcoder.jp/contests/abc013/tasks/abc013_2)

# 目次
- 問題概要
- 制約
- 入力形式
- 解説


# 問題概要
 ダイヤルロック式の錠がある。
この錠の赤いボタンを押すと、ディスプレイに表示されている数が$1$増え、青いボタンを押すと$1$減る。
ただし、ディスプレイの表示が$9$のときに赤いボタンを押すと$0$になり、ディスプレイの表示が$0$のときに青いボタンを押すと$9$になる。
現在ディスプレイに表示されている数字は$a$で、この数字が$b$になると錠が空く。

錠を開けるために最低でボタンを何回押せばいいか求めよ。
[ABC013-B](https://atcoder.jp/contests/abc013/tasks/abc013_2)

# 制約
$0 \leq a,b \leq 9$　（$N$は整数）

# 入力形式
` a 
  b `


# 解説
少し複雑な条件に思えてしまいますが、一旦シンプルな例で考えてみましょう。

### 例1
- $a = 4, b = 6$の場合
入力例1のパターンですね！
赤いボタンを$2$回押せばよいだけなので、答えは$2$となります。

### 例2
- $a = 6, b = 4$の場合
これは入力例2です。
a,bの差が$2$なので、青いボタンを$2$回押せば$a=b$となり錠が開きます。

### 例3
- $a = 8, b = 1$の場合
この場合はどうでしょう？
先ほどの$2$つの例と同じように考えると、ボタンを$7$回押して$a=b$とすればいいように思えます。
しかし問題文をよく読むと、「ディスプレイの表示が$9$のときに赤いボタンを押すと$0$になり、ディスプレイの表示が$0$のときに青いボタンを押すと$9$になる。」とあります。
この条件を考慮に入れると、赤いボタンを$3$回押すと$a=b$となることがわかります
- $8→9→0→1$ $(3回)$

### 結論
上述のとおり、出力すべき数字は
- $aとb$の差
- $min(a,b)$に$10$を足したものから$max(a,b)$を引いたもの
のうち小さいほうであることがわかります。

それを実装すると下記のようになります。
```C++:013-B.cpp
#include <iostream>
using namespace std;
int main(void){
    
    int a;
    int b;
    cin>>a;
    cin>>b;
  	int ans;
    
    ans = min(abs(a-b), abs(min(a,b)+10-max(a,b)));
    cout<<ans<<endl;
}
```

[提出コード](https://atcoder.jp/contests/abc013/submissions/39744274)
Gitで最新のコミットを取り消したい時

## この記事で書くこと
- 最新のcommitを一つ戻る方法
- リモートリポジトリにpushしていた時の対処法

## 問題発生

```bash:ターミナル
git add -A
git commit -m "Finish 〇〇"
```
をしてしまってから、commitを取り消したい時ってありませんか？
僕はこうなってしまったので、commitを取り消す方法を備忘録にでも書いておきます。

## commitを一つ戻る方法

結論、最新のコミットを取り消す方法は以下のコマンドを実行するだけです。
```bash:ターミナル
git reset --hard HEAD~1
```
これでコマンドを一つ戻れます！！わーい🙌

ここまででいい人はいいのですが、僕はリモートリポジトリにpushしていました...
そんな時はどうしたらいいのでしょうか？僕はこうしたので、参考にしてください。

## リモートリポジトリにpushしていた時のcommitの取り消し
リモートリポジトリにpushしてしまっていたので、リモートリポジトリのcommitを消せないかなと思っていたところ...

「むずくね？」「調べてもパッと出てこん」ってなってしまったので工夫で乗り切りました。

:::note info
結論、その工夫とは
「普通に他にブランチを作って、mergeしちゃえばいいんです」
:::

まぁ、mainからだと難しいかもですが、ブランチを作って開発してるならいけると思いますので、よかったら参考にしてください。

## mergeするまでの流れ

1, まずはもどりたいところまで戻す
```bash:ターミナル
git reset --hard HEAD~1
```

2, 次に移行するブランチを作る
```bash:ターミナル
git switch -c (適当な名前)
```

3, mergeする
```bash:ターミナル
git merge (戻したブランチ)
```

いかがでしたか？きっとこの他に頭のいい方法があるのでしょう。僕も数年後成長したら「なんちゅう仕方でやってるんや」とびっくりする臭いがプンプンしています。

ですが、まぁダックプログラミングと同じで戻りゃいいんですよ！！笑
Podの通信をtcコマンドで遅延させる

Podを使ったテストの際、遅延を入れてテストしたいことがある。
Istioなどがあれば簡単に実現できるが、逆にちょっとしたテストだけのためにIstioを入れるのは流石に面倒である。
なので、tcコマンドをサイドカーとして差し込んで遅延を起こしてみる。

## tcコンテナの作成＆動作確認
tcのコンテナを作成する。確認用にpingも入れている。
```dockerfile
cat << EOF > ./Dockerfile
FROM ubuntu:latest
RUN apt-get update && apt-get install -y iproute2
RUN apt-get install iputils-ping net-tools
CMD ["/bin/bash"]
EOF
```
イメージをビルドする。`IMAGE`は自環境のリポジトリ等に書き換えること。
```sh
IMAGE=imuratashared/tc
docker build -t $IMAGE --platform linux/x86_64 .
docker push $IMAGE
```
次に動作確認する。
tcは強めの権限がないと動かないので、ここではPrivilegedをつけて起動する。
```sh
kubectl run --privileged=true --image $IMAGE tc -- sleep 3d
```
何もしていない状態でのpingの応答は以下のような感じ。
```sh
$ kubectl exec -it tc -- ping vmware.com
PING vmware.com (10.113.63.149) 56(84) bytes of data.
64 bytes from cloudsolutions.vmware.com (10.113.63.149): icmp_seq=1 ttl=51 time=34.6 ms
```
遅延を入れてみる。
```sh
kubectl exec -it tc -- tc qdisc add dev eth0 root netem delay 100ms
```
pingの応答は以下のようになり、遅延が効いていることが分かる。（なんか接続先は微妙に変わっているが。。。）
```sh
$ kubectl exec -it tc -- ping vmware.com
PING vmware.com (10.113.63.149) 56(84) bytes of data.
64 bytes from passwordreset.vmware.com (10.113.63.149): icmp_seq=1 ttl=51 time=135 ms
```

## 任意のPodへの組み込み
先程のtcコマンドを持ったコンテナをinitContainerとして組み込み、tcコマンドを実行するようにする。
ここではサンプルとしてCentOSのイメージで確認する。
以下のようなManifestを作成する（先程使った`IMAGE`という環境変数が設定されているものとする）。
```yaml
cat << EOF > ./delay-centos.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: centos
  name: centos
spec:
  initContainers:
  - command: ["tc","qdisc","add","dev","eth0","root","netem","delay","100ms"]
    name: tc
    image: $IMAGE
    securityContext:
      capabilities:
        add:
        - NET_ADMIN
  containers:
  - args:
    - sleep
    - 1d
    image: centos
    name: centos
EOF
kubectl apply -f delay-centos.yaml
```
作成したPodでpingを実行する。
```sh
$ kubectl exec -it centos -c centos -- ping vmware.com
PING vmware.com (10.113.63.149) 56(84) bytes of data.
64 bytes from www.vmwareblogs.com (10.113.63.149): icmp_seq=1 ttl=51 time=125 ms
```
なお、何も入れていない状態だと以下のような数値となっているため、遅延出来ていることが分かる。
```sh
$ kubectl exec -it centos -- ping vmware.com
PING vmware.com (10.113.63.149) 56(84) bytes of data.
64 bytes from www.vmwareblogs.com (10.113.63.149): icmp_seq=1 ttl=51 time=24.2 ms
```
RENDERからAWSのEC2移行に伴うエラーについて

EC2の環境下にはPostgreSQL（RENDERで運用していたため）が入っておらず、gemのインストールができないため,エラーが出ていた。

なので、エラーを解消するために、EC2ではMariaDBを使用してデータベースを構成するため、postgreSQLは削除する。

①Gemfileで、「gem 'pg'」の記述を削除する

②Gemfile.lockを削除、ローカル環境でbundle installをおこなう

③GitHubにコミットとプッシュ

④EC2環境でgit pull origin master
（※デフォルトブランチがmainの場合はgit pull origin main）

⑤EC2環境でbundle install

これでエラーが解消される。
[備忘録]openvpnのclient間通信の際の注意事項


# はじめに
困ったらとりあえず公式のドキュメント（ https://www.openvpn.jp/document/how-to/ ）を参照！
随時更新予定

- configファイルの編集に関しては、ドキュメントがわかりやすいので省く
- client間通信を行う際にclient host配下の機器のIPアドレスはローカルアドレスを使用する
- client hostは原則として**10.8.0.x**のようなvpn server側から割り振られたIPアドレスを使用する
- PCにルーティングに関する設定を施さないとローカル機器に対して正しく接続されない
Oracle Analytics Cloud Classic：Answersで分析を作成中、使っているサブジェクト領域を変更する、置換する。

はじめに
---
Oracle Analytics Cloud Classic： Answersで使用しているサブジェクト領域を変更したいときがあります。
そんな場合には、対象の分析を開き詳細タブで、対象のサブジェクト領域を変更します
詳細タブを開き、対象のサブジェクト領域を変更する方法を紹介します。

サブジェクト領域「売上分析開発用」を使っていて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/6475ca94-67d0-da2d-e429-51cc987cb981.png)

サブジェクト領域「売上分析本番用」に変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/ef07defc-24f1-6ded-3bbe-03fca94b9011.png)

記事記載時のOAC ver：Sep 2023 Update

詳細タブを開き、対象のサブジェクト領域を変更する
---
Answersで分析を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/5843605a-e36e-234f-c854-95ba854969ec.png)

詳細タブをクリックします
中ほどまでスクロールダウンします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/6def8e1b-ad9a-2183-c287-a13cd2522ef2.png)

拡張SQL句のところまでいきます
FROMのところに使っているサブジェクト領域がセットされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/d57d477a-f12f-07bb-6dc3-802270f9e669.png)

変更する、置換するサブジェクト領域の名前に変更します
変更後「SQLの適用」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/f0e385ac-01b5-97b5-f009-e1d5cda40cd0.png)

結果タブをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/542b6ef6-a7fc-13b0-79bc-3e4dc0f38521.png)

サブジェクト領域が変更、置換されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/96b5b008-00b2-04f6-082c-144ba5e22ea6.png)

※名前以外の列名などは同じものがある必要があります

以上です
あれこれ気になって一つの作業に集中できない…！

直近の話ですが、業務に携わる機会が増えはじめ、あれこれ気になり一つの作業に集中できず、ズルズルと時間を浪費してしまうことがありました。

私が現在所属している部署では、ライトニングトーク会と呼ばれる"学んだことを、簡潔にまとめて、アウトプットする"トレーニングがあります。
そのトレーニングに参加した際に私の現状に当てはまる内容のプレゼンがありましたので、それを実践してみました。

# プレゼン内容紹介

先輩社員のプレゼンにて、"自分に合った時間術"が紹介されていました。
※参考：以下リンク

https://www.kawade.co.jp/YOURTIME/

私たちが気にしなければいけないことは時間ではなく時間間隔であり、その時間間隔には個人差があると伺いました。
そして時間間隔の改善のために、アラーム機能を用いることで次の予定を忘れて目の前のタスクに集中して取り組んだという実践内容の紹介があり、共感することが多かったです。

# 実践してみた

「次の打合せの時間が気になったり、いついつまでにあれこれを終わらせなければいけない」といった仕事と付き合う上でありふれた内容ですが、そうしたちょっとした思考こそ煩わしく感じていました。

上記のプレゼン内容は、試してみようと思えば直ぐに取り組める簡単な創意工夫です。
そうしたハードルの低さも相まって、早速取り入れてみました。

## 実践内容
Apple Watchを日頃から使用しているので、「アラーム」機能を使用しました。
デフォルトのままですとけたたましいアラーム音が鳴るので、バイブレーション機能を使用しています。

実践内容も簡単です。

* 始業前に、取りかかる各々の予定の数分前にアラームをセットする
* 突発的な作業の場合、その作業だけに集中するための時間を設け、アラームをセットする

これをルーティン化するだけです。
タスクごとに時間を区切ってそれだけに集中するよ～というお話でした。

## 所感

* **他のタスクが脳裏にちらついていた。**
→今でもちらつくことはあるが、メモに控え一旦それを忘れる方針でカバー

* **時間を浪費してしまっていた。**
→タスク一つ一つに集中して取り組めるようになり、無駄な時間は減った（と思う）

* **打合せの時間が気になっていた。**
→アラームのおかげでメリハリ付けられるように

タスク効率が上がり、一日のやり切った！感はより得られるようになったかと思います。
~~※手際が悪くて進まないものもありますが~~

最後にはなりますが、本著書も一度目を通してみたいとも思ってます。
他にも有益になりそうな情報が載っていそうですので…

https://www.kawade.co.jp/YOURTIME/
ダッシュボードのリコメンド機能で見たいデータをサクッと可視化してみた

# 概要
稼働しているシステムの状況を簡単に把握できることは、問題を迅速に特定して解決するためには必要不可欠です。オブザーバビリティプラットフォーム New Relicは、インフラからアプリケーション、ユーザー体験までシステム全体からEnd-to-Endで収集したデータを可視化することができます。

New Relicには、様々な技術スタックやデータソースに対応したダッシュボードのテンプレートが数多く用意されており、システム構成にあったテンプレートを利用することですぐに可視化することができます。

さらに、それぞれのシステムの技術スタックやデータソースなどの情報をあらかじめ登録しておくことで、自動的にシステムにあった有用なダッシュボードを提案してくれます。これにより、いちいち欲しいダッシュボードを探さなくてもすぐに利用できるようになります。

:::note info
この機能に関する詳細はこちら
[New Relic アップデート(2023年9月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202309 "New Relic アップデート(2023年9月)")
[New Relic アップデート一覧](https://newrelic.com/jp/blog/nerdlog/new-relic-update)
:::

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！
](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::

この投稿では、実際に技術スタックやデータソースの情報をカスタマイズすることで、どのようにダッシュボードが提案されるか確認してみます。

# デフォルトで提案されるダッシュボードの確認
New Relicにログイン後、左メニュー「Dashboard」にアクセスすると上部のRecommended Dashboardsに推奨のダッシュボードが表示されます。デフォルトでは、導入環境のソフトウェアスタックとは無関係によく使われているダッシュボードが優先的に表示されます。

![Default Recommendation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/0413f5f0-3228-7351-2431-7473ac49ce7f.png)


# 推奨ダッシュボードのカスタマイズ
推奨されるダッシュボードを自分の環境に合うようにカスタマイズしてみます。カスタマイズは画面上「Tell us about your stack」から実施します。

![Tell us stack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/ff934c48-ad5f-9a34-374e-a3c7fa974a69.png)



技術スタックやデータソースを選ぶ画面が出てきました。今回は、Kuberenetes環境で動くJavaアプリを想定して、JavaとKubernetesにチェックを入れてみます。

Javaを指定
![settings-java.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/1d5d8d43-93ec-9653-7501-da8b7074e26b.png)

Kubernetesを指定
![settings-k8s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/3073b475-5e54-85dc-ce4b-020d1f9a083a.png)


# 設定変更後の推奨ダッシュボード確認
設定後、推奨されるダッシュボードがどう変わるのか確認してみます。KubernetesとJavaにチェックしたので、確かに推奨されるダッシュボードがKubernetesやJavaに関連するダッシュボードになったことが確認できます。

![k8s - java - dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/0cbb1125-457d-0744-122d-a751c4a9d7a2.png)


あとは利用したいダッシュボードをクリックして作成するだけです。

![k8s-dash.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/7b385870-fc47-2957-b8f3-368a00bdc9c9.png)


# まとめ
本記事では、オブザーバビリティプラットフォームであるNew Relicのダッシュボードに関し、システム環境にマッチしたダッシュボードを推奨してくれる機能を試し、技術スタックやデータソースを正しく設定することで推奨されるダッシュボードが意味の必要なものに絞られることが確認できました。

プラクティスに基づいて作られた推奨ダッシュボードの利用はデータの可視化のための準備をスピードアップするとともに、データ分析の質も上がりますので是非ご利用ください。

:::note info
この機能に関する詳細はこちら
[New Relic アップデート(2023年9月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202309 "New Relic アップデート(2023年9月)")
[New Relic アップデート一覧](https://newrelic.com/jp/blog/nerdlog/new-relic-update)
:::

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！
](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::

:::note info
[New Relic株式会社のQiita Organization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::
Inputクラスについて(Unity)

# はじめに
Unityをまともに触り始めて一年くらいが経とうとしていますが、よくプレイヤーを動かすときに次のクラスを使います。

```php
float horizontalInput = Input.GetAxis("Horizontal");
float VerticalInput = Input.GetAxis("Vertical");
```

ただ、実はこれがどういう仕組みで動いているのかをよくわからずに使っており「上矢印キー押したら前に進んだぞ」「Aキー押したら左に進んだぞ」って感じでした。さすがにその認識だとまずいよねって言うことでどういう仕組みで動いているのかをまとめます。

# Inputクラス

これ、別に難しい仕組みでもなんでもなくて誰でも反応するキーとかを変更できるんですよね
タブから【Edit → Project Setting】をクリック、そのあと【InputManager → Axes → Horizontal(Vertical)】をクリックするとどのキーが反応するかを設定することができます。

ちなみにNegative Buttonがマイナス方向（Horizontalなら左、Verticalなら下）、Positive Buttonがプラス方向に行きます

![スクリーンショット 2023-10-27 150520.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471631/fcf1b6be-7673-002f-7f57-f0be19b4d0de.png)

# おわりに

なんとなくで使うのではなくて、ちゃんと仕組みを理解しよう！！！（自分宛）
sysを使った標準入力の受け取り方(Python3)

# はじめに

就活でコーディングテストを受けることになったので、標準入力の受け取り方をまとめておきます。言語はPython3で、`input()`ではなく`sys.stdin`を使った方法を紹介します。

# 標準入力受け取り方

各種の入力データを処理するPythonスクリプトの例と、それに対応するサンプルデータを以下に示します。スクリプトは標準入力からデータを受け取り、特定のフォーマットに従って処理を行います。

1. **1つの数値を取得:**

   - サンプルデータ:
     ```
     42
     ```
   - スクリプト:
     ```python
     import sys

     def main():
         line = sys.stdin.readline()
         number = int(line.strip())  # 文字列を整数に変換
         print(f"受け取った数値: {number}")

     if __name__ == "__main__":
         main()
     ```

   このスクリプトは、入力された行を整数として解釈し、それを出力します。

2. **1つの文字列を取得:**

   - サンプルデータ:
     ```
     hello
     ```
   - スクリプト:
     ```python
     import sys

     def main():
         characters = sys.stdin.readline().strip()  # 改行文字を取り除く
         print(f"受け取った文字: {characters}")

     if __name__ == "__main__":
         main()
     ```

3. **1行に複数の数値を取得 (各変数で受け取る):**

   - サンプルデータ:
     ```
     a b c
     ```
   - スクリプト:
     ```python
     import sys

     def main():
         line = sys.stdin.readline().strip()  # 改行文字を取り除く
         a, b, c = map(int, line.split())
         print(f"受け取った数値: a: {a}, b: {b}, c: {c}")

     if __name__ == "__main__":
         main()
     ```

4. **1行に複数の数値を取得 (配列として受け取る):**

   - サンプルデータ:
     ```
     a b c
     ```
   - スクリプト:
     ```python
     import sys

     def main():
         line = sys.stdin.readline().strip()  # 改行文字を取り除く
         numbers = list(map(int, line.split()))
         print(f"受け取った配列: {numbers}")

     if __name__ == "__main__":
         main()
     ```

5. **複数行に渡る数値を取得 (各行が1つのデータとして配列に格納される):**

   - サンプルデータ:
     ```
     N //行数
     A_1
     A_2
     ・
     ・
     ・
     A_N
     ```
   - スクリプト:
     ```python
     import sys

     def main():
         n = int(sys.stdin.readline().strip())  # 行数の入力
         A_list = [int(sys.stdin.readline().strip()) for _ in range(n)]  # 各行の数値をリストに格納
         print(f"受け取った配列: {A_list}")

     if __name__ == "__main__":
         main()
     ```

6. **複数行の数値を取得 (各行の数値を個別の変数で処理):**

   - サンプルデータ:
     ```
     N //行数
     1 2 3
     4 5 6
     ・
     ・
     ・
     a b c
     ```
   - スクリプト:
     ```python
     import sys

     def main():
         n = int(sys.stdin.readline().strip())  # 行数の入力
         for _ in range(n):
             a, b, c = map(int, sys.stdin.readline().strip().split())  # 各行の数値を個別の変数に割り当て
             # 以下にa, b, cに対する処理を書く

     if __name__ == "__main__":
         main()
     ```

7. **複数行の数値を取得 (配列で受け取る):**

   - サンプルデータ:
     ```
     N //行数
     1 2 3
     4 5 6
     ・
     ・
     ・
     a b c
     ```
   - スクリプト:
     ```python
     import sys

     def main():
         n = int(sys.stdin.readline().strip())  # 行数の入力
         data = [list(map(int, sys.stdin.readline().strip

# まとめ

この記事では、Pythonで標準入力を受け取る様々な方法を紹介しました。プログラミングやコーディングテストでは、多種多様な入力形式に対応する必要があります。このため、入力データの種類（数値、文字列、配列など）やフォーマットに応じて適切な入力処理方法を選ぶことが重要です。
vba vbs エクセル定期更新

```
確認方法
xlsmファイル
表示＞マクロ＞マクロの表示＞更新＞編集
window task スケジューラへ追加
スケジューラの操作設定
プログラム/スクリプト
C:\mupd\run_vbs.vbs
引数の追加
"C:\mupd\99.xlsm"  "更新"
-------------------------------------------
run_vbs.vbs
Dim excelApp,macro

file = WScript.Arguments(0)
macro = WScript.Arguments(1)

Set excelApp = CreateObject("Excel.Application")

excelApp.Visible = False        'Excelを非表示にする
excelApp.DisplayAlerts = False  'ポップアップメッセージを非表示にする
excelApp.AutomationSecurity = 1 'マクロを有効にする

'Excelファイルを読み取り専用で開く
excelApp.Workbooks.Open file,3,False

'WScript.Echo "---マクロを実行します---"

'マクロを実行する
excelApp.Run macro

'WScript.Echo "---マクロの実行が完了しました---"

'Excelを終了する
excelApp.Quit

Set excelApp = Nothing


-----------------------------------------------
vba ソース
Sub 更新()

Dim wb As Workbook
Dim m As Integer

m = Format(Month(Now), "00")

'tpath = "test.xlsm"

'tpath = "\test\"

tpath = "test2.xlsm"

'Set wb = Workbooks.Open(ThisWorkbook.Path & "test3.xlsm")

Set wb = Workbooks.Open(tpath)

wb.Worksheets("list").Range("K1").Value = "A"

wb.Close savechanges:=True




wpath = "test.xlsm"

Set wb2 = Workbooks.Open(wpath)

wb2.Worksheets("区分").Range("M1").Value = "A1"

wb2.Close savechanges:=True


End Sub
脆弱性と対策

# 脆弱性とは
脆弱性とはセキュリティ上の欠陥のことです。
<dl>
  <dt>主な原因</dt>
  <dd>・プログラムやコードのミス</dd>
<dd>・基盤となるOSやミドルウェアの欠陥</dd>
<dd>・新しい攻撃手法の誕生</dd>

  <dt>脆弱性の種類</dt>
  <dd>・技術的脆弱性</dd>
  <dd>・組織的脆弱性</dd>
  <dd>・人的脆弱性</dd>
  <dd>・物理的脆弱性</dd>

  <dt>脆弱性による攻撃</dt>
  <dd>・クロスサイトスクリプティング（XSS）</dd>
<dd>・クロスサイトリクエストフォージェリ（CSRF）</dd>
  <dd>・SQLインジェクション</dd>
  <dd>・OSコマンド・インジェクション</dd>
  <dd>・ゼロデイ攻撃</dd>
  <dd>・ルートキット攻撃</dd>
  <dd>・セッションID</dd>
  <dd>・その他</dd>
  
</dl>


この脆弱性が入り口となり様々な問題が生じます。

## 脆弱性の種類
脆弱性には大きく分けて４つに分けられます。
#### 技術的脆弱性
一つ目は技術的脆弱性です。
上の原因でも紹介したプログラムやコードのミスであったり、
OSやミドルウェア等の欠陥であったりと技術に関するものです。

#### 組織的脆弱性
次に組織的脆弱性です。
組織の中や外との関り方組織での脆弱性についての意識や取組などです。

#### 人的脆弱性
次に人的脆弱性です。
人間の不注意や感情によるものなどです。
不審なメールを開いてしまったり、
気づかないうちにミスをしてしまったりというものです。

#### 物理的脆弱性
最後に物理的脆弱性です。
会社やデータセンターといった建物やサーバーやPCといったハードウェアの管理不足や
セキュリテ―面によるものです。

## 脆弱性による攻撃
脆弱性による攻撃はたくさんあります。
上記で上げた以外にもありますがここでは２つに絞って紹介します。

#### クロスサイトスクリプティング（XSS）
Webサイトの脆弱性を利用し、悪用サイトに飛ばすようにし、
個人情報を不正取得したり、マルウェア感染させたりするサイバー攻撃のことです。
 
 <b>例</b>
 
![Qiitaクロスサイトスクリプティング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524069/eaf71252-953b-9c30-c4e1-4b693717397f.png)
1. 通常のウェブサイトにアクセスをします
1. エラーなどを装いアクセスできなくします
1. 悪意のあるウェブサイトに飛ばします
1. 悪意のあるスクリプトが実行され個人情報紛失やマルウェア感染が起きてしまいます




#### SQLインジェクション
第三者がSQLコマンドを悪用してデータベースの情報へ不正にアクセスし、情報を盗んだり改ざんしたり、削除したりする攻撃のことです。
 
 <b>例</b>
 
![QiitaSQLインジェクション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524069/915a0a0c-da7d-3561-df1c-388156535af8.png)
1. ログイン情報入力画面（入力フォーム）に不正なSQL文を入力
1. データベース内に侵入成功
1. ID、パスワードを用いて不正ログインしたりデータを改ざんする
# 脆弱性対策
### 脆弱性診断
脆弱性診断とは上記で紹介した攻撃を防ぐため発端となる脆弱性がないかをチェックしてセキュリティ状態を確認することです。
脆弱性を見つけその脆弱性がどんな害をもたらすかを表したり、
どうすることで脆弱性を対処できるかを教えてくれたり、
検知した脆弱性をランク付けしわかりやすくしたりといった機能があります。




・私が使ったアプリ


 https://www.ubsecure.jp/vexcloud




### サニタイジング
XSSに有効な対策としてあげられるのがサニタイジングです。
サニタイジングとは書かれたコードを文字列に置き換える操作のことです。
万が一悪意のあるスクリプトが実行されるとなっても
その物自体が文字として扱われるため実行されることはなくなるということです。

<details><summary>Java Scriptでのやり方</summary>

```
function htmlentities(str){
    return String(str).replace(/&/g,"&amp;")
        .replace(/"/g,"&quot;")
        .replace(/</g,"&lt")
        .replace(/>/g,"&gt;")
```



</details>

https://cybersecurity-jp.com/security-measures/33684

### 管理
企業が所有している機器やOSの管理が大切です。
* 常に最新の状態に更新しているか
* 点検や確認はこまめに行っているか
* 他人に変えられないようなセキュリティであるか
### 知識・情報
脆弱性とは何か、どういった原因で起こりどう対処するかを知っておく必要があります。
また、脆弱性やセキュリティに関する最新の情報を知っておくことも大切です。
新たな攻撃手法が誕生したり新たなセキュリティ対策が生まれることもあります。
事前に知っておくことで対策できることはたくさんあります。

# まとめ
ここでは脆弱性についてまとめました。
脆弱性はトラブルの原因となるものです。
未然に防ぐことができるため、
脆弱性についての知識と対策を頭に入れておくことが大切です。
脆弱性についてまだまだ分からないことだらけなのでぜひご教示ください。
最後までご覧いただきありがとうございました。
【ツール紹介】anylabeling

## anylabeling

Segment Anything、MobileSAM および YOLOモデルによるAIサポート付きのアノテーションツール。


特徴は多角形、長方形、円、線、点の画像注釈、
YOLOv5 と Segment Anything による自動ラベル付け。
テキストの検出、認識、KIE (Key Information Extraction) ラベル付け。
多言語対応：英語、ベトナム語、中国語。

github:https://github.com/vietanhdev/anylabeling
ドキュメント: https://anylabeling.com
YouTube デモ: https://youtu.be/5qVJiYNX5Kk




## install
インストールの方法は2つ。

1. 実行ファイルをダウンロードして実行する
[リリース](https://github.com/vietanhdev/anylabeling/releases)から最新バージョンをダウンロードして実行します。
MacOSの場合：
インストール後、アプリケーションインストールに移動します
アプリを右クリックして「開く」を選択します
2 回目以降は、Launchpad を使用して通常通りアプリを開くことができます


2.Pypiからインストールする
要件: Python >=3.8、<= 3.10。

推奨: Miniconda/Anaconda。

環境を作成します。
~~~
conda create -n anylabeling python=3.8
conda activate anylabeling
~~~

(macOS のみ) Conda を使用して PyQt5 をインストールします。
~~~
conda install -c conda-forge pyqt==5.15.7
~~~
AnyLabeling をインストールします。
~~~
pip install anylabeling # or pip install anylabeling-gpu for GPU support
~~~
AnyLabeling を実行します。
~~~
anylabeling
~~~

## 使い方

#### AIを使用する場合
画面が起動したらAuto Labelingボタンを押下。画面上部にモデルの選択BOXが表示されるのでモデルを選択します。
今回はCPUで動かすのでSegment Anything(MobaieSAM)を使用。
※Segment Anythingモデルを使用する場合GPUはCUDAが推奨。

![anylabeling1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576312/333223ed-9245-dd76-bc15-053369f4912c.png)
![anylabeling2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576312/9e7ea17b-c808-fd0d-48d8-6043e562d7a3.png)

ファイル位のアイコンをクリックし画像を読み込ませたら「+Point」を有効にし、アノテーションしたいオブジェクトをクリックします。
![anylabeling3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576312/5b111531-05e7-6a75-a8c7-369dfb17485a.png)

AIモデルがオブジェクトのセグメンテーションを実施。
オジェクトの輪郭が画像上に表示される。
![anylabeling4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576312/15bfac41-d121-e9f7-e76b-e301d30100f8.png)

ラベル設定のウィンドウが表示されるのでラベルを設定し、画面上部の「Finish Object」をクリック。
![anylabeling5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576312/45337823-e8f7-3bd8-9e2b-a028052c8810.png)

この段階でアノテーション済データがJSON形式で画像と同じディレクトリに１画像につき１ファイルで作成される。


アノテーション済みの画像に関してはマスク部分を手動で変更することも可能。
![anylabeling6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576312/eaea2887-9058-a618-942f-dac2c8fd4b90.png)


１クリックでかなり精度良くセグメンテーションマスクが作成されているが確認できます。

画面上部のOutputをRectangleに設定し「+Rct」を有効にすることで矩形でのセグメンテーションも可能。

### AIを使わない場合
画面左側中段の図形マークでそれぞれに対応した形式でオブジェクトの指定を行うことができます。
ラベルをつけてobjectが確定した段階でアノテーション済データがJSON形式で画像と同じディレクトリに１画像につき１ファイルで作成される。

## まとめ
個人的に使用してみて輪郭が複雑なオブジェクトをアノテーションする際は簡単な操作で作業がきそうと感じました。

日本語対応がされるとより使いやすくなりそうなツールだと思います。
laravel テストコード実行時にMiniOのバケット内をクリーンアップする

## 概要

- laravelのテストコードで実際にストレージにファイルを設置して

## 前提

- ローカル開発環境はDockerである。
- バケットはローカル用とローカルテスト用で別に用意されているものとする。
- MiniOコンテナとの接続は完了しており、バケットもすでに作成されているものとする。

## 方法

- 下記の内容をFeatureテストのテストクラスのsetUpとtearDownに記載する。

    ```Test.php
    public function setUp(): void
    {
        parent::setUp();

        // シーダーの実行
        $this->seed();

        Mail::fake();
        $this->minioCleanUp();
    }

    public function tearDown(): void
    {
        $this->minioCleanUp();

        parent::tearDown();
    }


    /**
     * テスト用MiniOのpublicバケットの初期化
     *
     * @return void
     */
    private function minioCleanUp(): void
    {
        // ディスクの確認（ローカルだとMiniOだけどs3のdiscの設定を流用している）
        $isS3 = config('filesystems.default') === 's3';
        // テスト用ストレージの初期化
        $bucketName = strtolower(config('filesystems.disks.s3.bucket'));
        $isIncludeTestToBucketName = strpos($bucketName, 'test') !== false;

        if ($isS3 && $isIncludeTestToBucketName) {
            $files = Storage::allFiles('/');
            Storage::delete($files);
        }
    }
    ```

## ポイント

- 単純に「テストメソッド実行前にバケット内をクリーンアップする」だけならこんなたくさん記述する必要はない。下記の内容をそれぞれsetUpとtearDownの中に記載すれば良い。

    ```php
    $files = Storage::allFiles('/');
    Storage::delete($files);
    ```

- ただし、これはあくまでテスト実行時の.env.testingのバケット系の記載に誤りがないという大前提のもと成り立つ。
- もし仮に、.env.testingのバケット名の指定を間違えてテスト用バケットではなくメイン用バケットになっていたらどうなるだろうか。
- 実際にエンドユーザーが使用する環境でテストコードは基本実行しないが、なにかの間違いでS3の全オブジェクトクリーンアップ処理が走ってしまったら大事故になる。
- そのため今回のコードでは念のため確認処理を挟んでいる。
- 具体的には下記の内容を確認し、両方ともtrueだったらクリーンアップをするようにしている。
    - 指定ストレージディスクがs3になっている
    - バケット名に`test`という文字列が入っている
- `$isIncludeTestToBucketName = strpos($bucketName, 'test') !== false;`の部分について
    - 一見`$isIncludeTestToBucketName = strpos($bucketName, 'test');`で良さそうに見える。
    - しかし`!== false`は絶対必要である。
    - strpos()という組み込み関数は第一引数の文字列の中に第二引数の文字列があるかをチェックしている。
    - ヒットしなかったらfalseかfalseと判定される値が返される。
    - ヒットした場合、「第一引数の何文字目でヒットしたか」をintで返す。
    - 下記のような場合strpos()は3を返す。（最初の文字を0としてカウントしているため）

        ```php
        strpos('aaatest', 'test');
        ```

    - 下記のような場合strpos()は0を返す。

        ```php
        strpos('testaaa', 'test');
        ```

    - 0番目でヒットしてしまったとき0を返す。intの0はfalseと判定される。そのため`$isIncludeTestToBucketName = strpos($bucketName, 'test');`だと、0番目でヒットして、testという文字が評価対象の文字列に含まれているのにも関わらず、falseとして扱われるためである。
ポートフォリオのまとめ

ここ数日は、これまでに制作した下記内容を紙資料に纏めておりました。

https://drive.google.com/file/d/1IkH2bYVEOb2AU6mo9SQhUOxed7oR4chw/view?usp=share_link

1.架空の企業のコーポレートサイト
 - 
 - PhotoShop/Figmaでレスポンシブのデザインカンプ作成
 - VSCodeでHTML/CSS/Javascriptのコーディング
 - GitHubへのアップロード
 
 2.架空の美容室のコーポレートサイト
  - 
 - Figmaでデザインカンプ作成
 - ordPressのテンプレートを使ってサイト構築
 - レンタルサーバーへのアップロード
 
 3.自身のポートフォリオサイト
  - 
 - PhotoShop/Figmaでレスポンシブのデザインカンプ作成
 - VSCodeでHTML/CSS/Javascriptのコーディング
 - GitHubへのアップロード


<ここ3週間で習得した内容>
・HTML、CSS、JavaScriptでの基本的なウェブサイト構築
・Figmaを駆使したレスポンシブデザインでのデザインカンプ作成
・WordPressのテンプレート機能を使ったサイト構築、予約機能の実装

<これから学習する内容>
・PhotoShop、illustratorの基本操作について改めて学習
    ↪︎目標 : 資格の取得「Adobe Certified Professional」
・Git、Sourcetreeの使用方法
・ポートフォリオ用にLPサイト、バナーを作成
Dockerはsystemctl stopが使えないぽよ

## はじめに
プロセス直接止めるんかなーと思ったらそうでした。メモです。

## 結論
psでプロセスIDを調べてkillする(プロセスIDは出力の2番目の列)。
ProxySQLプロセスを例とします。

```
# ps -ef | grep proxy
proxysql       123   111  0 00:00 ?        00:00:00 proxysql
proxysql       124   123  0 00:00 ?        00:00:03 proxysql
    root       125   126  0 00:00 pts/0    00:00:00 grep --color=auto proxy
# sudo kill 123
# ps -ef | grep proxy
proxysql       123   111  0 00:00 ?        00:00:00 proxysql
proxysql       124   123  0 00:00 ?        00:00:03 proxysql
    root       125   126  0 00:00 pts/0    00:00:00 grep --color=auto proxy
# sudo kill 124
# ps -ef | grep proxy
    root       125   126  0 00:00 pts/0    00:00:00 grep --color=auto proxy
```

## おわりに
普段systemctlしか使わない勢なのでこゆとこ新鮮でよい。

簡単ですが以上です:relaxed:
eslint-plugin-vuetifyへのPRを送った時の雑メモ

## はじめに

ESLintのpluginへPRを送る際に、ESLintのpluginってそもそもどういう仕組み？という部分で躓いたので、今後のための備忘録を残しておく。

## eslint-plugin-vuetifyとは？

[eslint-plugin-vuetify](https://www.npmjs.com/package/eslint-plugin-vuetify)はVuetify2→3へのマイグレーションを行い際に、Vuetify2で利用できていたがVuetify3ではなくなったコンポーネントや、Vuetify3では名前が変わったコンポーネントなどに開発者が気付けるようにするためのESLintルールを追加できるplugin。

## PRを送るまでに理解したこと
### ESLintのルールの作り方

https://qiita.com/mysticatea/items/cc3f648e11368799e66c

の記事が参考になった。

公式だと[Custom Rules](https://eslint.org/docs/latest/extend/custom-rules)にルールの実装方法が書かれている。

ESLintのルールの実装方法としては、eslint-plugin-vuetifyも全く同じで、ソースコードでいうと以下の部分がそれにあたる。

https://github.com/vuetifyjs/eslint-plugin-vuetify/blob/v2.0.5/src/rules/no-deprecated-components.js#L45

### context.parserServices.defineTemplateBodyVisitorってなんだ？

`context`オブジェクトについては、ESLintが持っているオブジェクト（JSON）で[The Context Object](https://eslint.org/docs/latest/extend/custom-rules#the-context-object)に詳細が書かれている。

`context.parserServices`はDeprecatedになっているが、このオブジェクトにはカスタムのパーサー（コードをどのように解析してオブジェクトを作るか？をESLintに指示するもの）を利用しているときに、そのパースされた結果のオブジェクトが`context.parserServices`に入っている（以下、公式からの引用）。

> The default parser does not provide any services. However, if a rule is intended to be used with a custom parser, it could use parserServices to access anything provided by that parser. 
> （デフォルトのパーサーはサービスを提供しない。しかし、ルールがカスタムパーサと共に使用されることを意図している場合、そのパーサが提供するものにアクセスするためにparserServicesを使用することができます。）

そして、`defineTemplateBodyVisitor`はなんだ？となるが、これは[vue-eslint-parser](https://www.npmjs.com/package/vue-eslint-parser)というVueファイルをパースしてくれるパーサーを利用することで利用できるようになるオブジェクトで、詳細は[`defineTemplateBodyVisitor(templateBodyVisitor, scriptVisitor, options)`](https://github.com/vuejs/vue-eslint-parser#definetemplatebodyvisitortemplatebodyvisitor-scriptvisitor-options)に書かれている通り。

つまり、eslint-plugin-vuetifyはこのパーサーにより利用できるようになった`defineTemplateBodyVisitor`というオブジェクト（Vueのtemplateの部分のコードのオブジェクト）に対して、新しくESLintのルールを定義しているものということがわかる。

※あとのコードについては簡単で、チェックしたい内容に合わせたコードが実装されており、そのチェック結果を`context.report()`でESLintに伝えている。実際にESLintでチェックしてみると、以下のようにeslint-plugin-vuetifyのルールでのチェックが走っていることも確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/d3bea48c-7720-4212-74db-e2901773246f.png)

## まとめとして

普段からESLintは利用しているが、そのルールをどのように実装するのか？までは踏み込んだことがなかったので、今回PRを送るきっかけで少し理解が深目られた気がするので良かった。

## おまけ
### 送ったPRについて

`VListItemAvatar`と`VListItemIcon`というコンポーネント？API？がVuetify2では利用できていたが、Vuetify3からはprops or slotに変わったので、それをESLintのエラーで知らせるようにする改修をした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/616e8ccd-1440-ea9b-ba19-7dfeb3ab2f87.png)
rex0220 項目書式プラグイン ステータスの書式設定

[項目書式プラグイン](https://qiita.com/rex0220/items/87470704fd4187e29406)で、ステータスの書式設定を行ってみます。

# 概要
ステータス・作業者・ステータスの書式の設定例です。

- レコード詳細画面の表示

![2023-10-27_13h21_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/f0d26baa-18fe-3823-a67f-ab8b1c6e60af.png)

- 一覧画面の表示

![2023-10-27_13h28_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/5de43e1b-409e-a8cb-58a7-0f816e72b730.png)

# 項目書式プラグインの設定

ステータスが"完了"で、文字色を変え、文字の大きさをステータス・作業者・ステータスの履歴を揃えます。

![2023-10-27_13h34_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ee8b40ef-5590-5cb9-a66c-5cd1eaba48f7.png)

- ステータス
![2023-10-27_13h34_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9608c741-1b2c-7d0c-7d32-9d6493e83cd1.png)
![2023-10-27_13h35_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/fc86f503-d805-646b-3900-10f35ee28f24.png)

- 作業者
![2023-10-27_13h35_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/66ae7810-5eff-dddb-6bff-a27b5ecac512.png)
![2023-10-27_13h35_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/1ecbd3e6-2ec7-eba0-5ccc-0ced460abed6.png)

- ステータスの履歴
![2023-10-27_13h36_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d83d1889-705f-3b76-d605-d7ef0655f400.png)
jbuilderでマルチバイトや数字の名前(key)を使う

## はじめに
Railsでコードを書いているときに、レスポンスのJSONに日本語や数字で始まるキーを返さなくてはいけなくなりまたした。

こんな感じ↓
```json
{
  "日本語のキー": "値",
  "12345": 12345
}
```

方法を探したのですが、検索の仕方が悪いせいか結論にたどり着くまでに結構苦労したので、備忘録代わりに結果を残しておきます。

## 結論

数字も日本語も全部これでOKです。`set!`最強！
```ruby
json.set! :日本語のキー, '値'
json.set! :'12345', 12345
```

## もう1つの方法

日本語だけなら直接 `json.` の後に書けます。
ただし RuboCop を使っていると Naming/AsciiIndentifiers というので警告が出ます。

```ruby
json.日本語のキー '値'
```
【メモ】Hmac key生成時のコマンド

## Overview
Hmac key（≒パスワード）を作る際に使ったコマンド。メモです。

:::note info
HMAC (Hash-based Message Authentication Code）
:::

```
pwgen -s1 桁数 数値
```
※数値の部分を変更すれば、その数払い出しが可能となる。
tikz rotate nameで指定した場合に回転しない？

```
88 \path(0,0) node[name=o]{};
 89 \path(30:4) node[name=a]{};
 90 \path(50:2.5)++(0.5,0) node[name=b]{};
 91 \path(0:4) node[name=c]{};
 92 \large
 93 \path[draw,color=black,line width=0.5pt] (0,0) --(a);
 94 \path[draw,color=black,line width=0.5pt,rotate=40] (0,0) --(a);

 ```


rotateで回転させたいが(3,3)みたいな感じで直接指定して書いたpathは回転するが、上の行でnameで名前をつけたもので(a)みたいに座表を指定した場合は、うまくtotateが働いていない？
5分でPythonの開発環境を用意しよう！【Windows向け】

**この記事でわかること:raised_hands:**

・Pythonとは何か？
・Pythonを使えるようになる環境構築

---

自分のコンピュータで開発環境を構築することをローカル環境の構築と呼びます。ローカル環境を構築することで、自分のコンピュータがあればどこでもPythonコードを書いて、自分のプログラムを開発できるようになります。

この記事を見ながら、Pythonの開発環境を構築してみましょう！

### 〇必要なもの
- Windows PC
- Pythonの基礎的な知識(ここがあると理解度〇)

### 〇インストールするバージョン
Python 3.11.6

## Pythonとは何か？
Pythonは、プログラミングの初学者から注目を浴びるプログラミング言語の一つです。

Pythonは、Web開発やデータ分析など、幅広い分野で利用できる汎用性があり、特に人工知能(AI)などの先進技術の開発において非常に人気があります。

例えば、「ChatGPT」といった話題のプロジェクトもPythonで開発されています。

**Pythonの特徴**
- シンプルで短いコードでプログラムを記述できること
- 簡単にプログラムの動作を確認できること
- 幅広い用途に適用できること
- 開発を効率化するためのフレームワークやライブラリが豊富に存在すること

これらの特性がPythonの魅力であり、初心者からプロの開発者まで幅広い層に支持されている理由と言えます。

## Pythonの環境構築
早速お手持ちのWindows PCにPythonの開発環境を構築していきましょう。

### 1. Pythonのインストール
   まず、自分のPCにPythonをインストールしましょう。以下の手順に従って、Pythonの公式ウェブサイトにアクセスしてください。

[Python公式サイト](https://www.python.org/)

https://www.python.org/


サイトにアクセスすると、画面上部に「Downloads」という部分があります。カーソルを移動させてクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/aba9b75b-c4ee-3619-2003-797a53af61e8.png)

クリックすると次のような画面に移動すると思います。
私が今回インストールしたのは**Python version 3.11.6**です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/a0bcd2ba-1fcc-107a-ed2f-87504ce3f764.png)

インストールしたいバージョンをクリックすると、ダウンロードが開始されます。ダウンロードが完了したら、そのファイルを開いてください。

ファイルを開くと、次のような画面が表示されます。画面の一番下に「Add Python.exe to PATH」というチェックボックスがあるので、必ずチェックを入れてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/3d291915-5f1a-4704-1629-e9cce3f1482b.png)

チェックを入れたら、画面中央にある「Install Now」というリンクをクリックしてください。デバイス変更の許可が求められた場合は、「yes」をクリックしてください。

インストールが進行する画面が表示されます。インストールには時間がかかることがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/8f6d8e81-7d12-6d15-fe13-4f0a6bdc429f.png)

最後に、インストールが完了すると次のような画面が表示されます。右上の✕ボタンをクリックして、この画面を閉じてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/e5c75f2b-accb-904f-d7a8-fd7b0a6019b9.png)

これでPythonのインストールが完了しました！次に、Pythonが正しく動作しているか確認しましょう!

### 2.コマンドプロンプトで確認しよう
Pythonを使用するには「コマンドプロンプト」というツールを使用します。PCの画面左下などにある検索バーに「コマンドプロンプト」または「cmd」と入力し、アプリケーションが表示されたらダブルクリックで開いてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/639151bf-3788-c42d-a437-ef458b7a27c7.png)

黒い画面が表示されます。この画面では、コンピュータに対して様々な処理を行うことができます。Pythonが正しくインストールされているか確認するために、次のコマンドを入力し、「Enter」キーを押してください。

```:terminal
python --version
```

画面に「Python 3.11.6」と表示されれば、Pythonのインストールが正常に完了しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/be145057-6f82-556b-5480-37bfb06269d1.png)

エラーメッセージが表示される場合、Pythonをインストールする際に<font color="red">**「Add Python.exe to PATH」**</font>のチェックを忘れた可能性があります。

最初にダウンロードしたファイルを再度開き、「Uninstall」をクリックして修正してください。その後、Pythonを再度インストールしてみてください。

## まとめ
Pythonの開発環境構築はどうでしたか？

開発環境構築と聞くと大変そうなイメージがありますが、自身のPCにローカルの開発環境を作るのは意外と簡単です。

といっても最低限の用意をしたまでなので、さらに効率化や環境を整えたい方はVisual Studioや追加のモジュールなどをインストールしてみてもいいかもしれませんね:smile:
mayaでmatrixの値をそのままコピーする

下のようにTrans, Rotate, Scaleを適当に入れたものを、もう一つのConeにそのままコピーしたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410880/c68d252a-7511-a370-eb5f-90b1673602d3.png)

cmds.xformのmatrixを使うと、値を１つ１つセットせずに済む。

```
import re
import maya.cmds as cmds
sl = cmds.ls(sl=1)
for i in sl:
    localMat = cmds.getAttr(i+'.matrix')
    rightNode = re.sub('_l$', '_r', i)
    cmds.select(rightNode)
    cmds.xform(m=localMat)
```

値を全く同じにしているので重なっているが、同じトランスフォームになっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410880/ba6c7b5f-6833-4203-a280-b8781a612420.png)

cmds.xformで、translationやrotateを行う例文は多いものの、
matrixをそのまま扱ってるモノが少ないのでメモ。
よくド忘れすんねん、秘密鍵を保存した後。。

# タケシ！あんたまた秘密鍵置きっ放しにして！
ほんと母ちゃんには申し訳なくくらいド忘れしちゃうんです。
公開鍵と秘密鍵を作った後、公開鍵を接続先(サーバー側)に置いておくところまでは覚えているんです。それ以降はさっぱり。。
これ以上母ちゃんに怒られないように、秘密鍵を受け取った後の手順をまとめていきたいと思います。

# sshキー作成後の簡単な手順
まずは、sshキーの作成から簡単におさらいします。
ステップ１　秘密鍵：id_rsa、公開鍵：id_rsa.pubが生成される。
ステップ２　公開鍵を接続先(サーバー側)へ設置
ステップ３　秘密鍵を自PCへ保存

簡単そう〜！でも実際は色んなコマンド打たなきゃいけないので、私は間違えないようにヒヤヒヤしながら作っています。

# 忘れちゃいけない、自PCでの作業
ステップ3以降は自分のPCにて色々作業があります。
### ステップ４ .ssh/へ秘密鍵を配置
(私のPCはmacなので、mac目線で話させてください。)
.ssh/ファイルを探してみても見当たらないですよね？それは隠してあるから。
Finderにて、`command`+`shift`+`.`で隠しファイルを表示できます。
すると、`自分の名前がついているファイル内`に.sshファイルが出現します。
その中に秘密鍵を保存しましょう！

### ステップ5 秘密鍵の権限を変更しよう！
```
$ chmod 600 秘密鍵の名前
```
ssh接続するときは使用される秘密鍵の権限があります。
上記のコマンドで権限を変えてあげることで、接続ができるようになります。
これで母ちゃんに怒られる事なく、安全にssh接続ができるという事ですね！
タケシの目もキラキラ輝いています！よかったー！


# エラーが出てきたら？
.sshに秘密鍵を置いたのはいいけれど、ssh接続をしようとしたらこんなエラーが。。
```
Warning: Permanently added 'xxxxxx' to the list of known hosts.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/xxxxxxx/.ssh/秘密鍵の名前' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/xxxxxxx/.ssh/秘密鍵の名前": bad permissions
```
`Permissions 0644 for　... are too open.`でこの秘密鍵、権限持ちすぎだよ！と言っています。
なので [ステップ5] の手順で権限を狭めてあげましょうね！

# sshキーの全体の流れを知りたいタケシにおすすめな記事
https://qiita.com/soma_sekimoto/items/35845495bc565c38ae9d