OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel/MYSQL】データベースの正規化とは/メリット・デメリットについても解説！！

今回はデータの正規化について説明していきます。
プログラミングを勉強していくとよく正規化ということを耳にすることが多くなります。
正規化とはいったい何なのかについて解説していきます。
そのメリット・デメリットについても説明するので良かったら参考にしてください。

## 正規化とは
データベースの正規化とは、データベース設計の工程において同一テーブル内のデータの重複をなくすために、適宜データを分割・整理することです。

（例)正規化なし

| 注文番号 | 注文者名 | 電話番号 | 品名 | 数量 | 仕入れ先 |
|:-:|:-:|:-:|:-:|:-:|:-:|
| １１１  |  山田太郎 | 090-111-222  | きゅうり  |  5 |  山田農場 |
| １１２  |  高田玲奈 | 070-333-444  |  レモン | 10  | 高田商事  |
|  １１３ |  倉敷颯太 | 080-555-666  |  そうめん | 30  |  気楽製粉 |

正規化をしていない場合だと全ての情報が一つのテーブルで管理しています。

(例)正規化あり

・注文テーブル
| 注文番号 | 注文明細番号 | 商品名 |  数量 |
|:-:|:-:|:-:|:-:|
| １１１  |  1 | きゅうり  |  5 | 
| １１２  |  2 |  レモン | 10  |
|  １１３ |  3 |  そうめん | 30  |

・注文者テーブル
| 注文番号 | 注文者 |　電話番号 |
|:-:|:-:|:-:|
| １１１  |  山田太郎| 090-111-222  | 
| １１２  |  高田玲奈 |  070-333-444 |
|  １１３ |  倉敷颯太 |  080-555-666 |

・商品情報テーブル
| 商品番号 | 商品名 | 仕入れ先コード | 
|:-:|:-:|:-:|
| 1  |  きゅうり | 1A  |
| ２  |  レモン |  2B |
|  ３ |  そうめん | 3C  |

正規化することによってテーブルごとに情報を分けることができ、見やすくなりました。
カラムの中身を見ればそれぞれどんな情報が管理されているか何となく理解できそうですね。

## 正規化すること、しないことによるメリット・デメリット

### 正規化することへのメリット・デメリット
メリット
テーブル１つで完結するため、結合ありと比べてSQLの処理が速い

デメリット
もし値を変更（例：完了→済　など）しなければならなくなったら、全てのtodo行を更新しなければならず変更コストが高い

### 正規化しないことへのメリット・デメリット
メリット
もし値を変更することになってもprogressテーブルの1行だけで済み変更コストが低い

デメリット
テーブルを結合しなければならず、結合なしと比べてSQLの処理が遅い

## まとめ
それぞれのメリットとデメリットを確認するとわかりますが、どちらかが良い、どちらかが悪いというわけではありません。それぞれ良さがあり、常に最適解というのがありません。
これはそれぞれのプロジェクトの規模や事情によって設計を変える必要があります。
このことを理解して実務に臨んでいきましょう。
Azure OpenAI Service の "On Your Data" と同じことを Bing Chat  でやってみる

# はじめに

[Azure OpenAI Service](https://azure.microsoft.com/ja-jp/products/ai-services/openai-service) は GPT-3.5 Turbo や GPT-4  を利用できるサービスです。[Azure OpenAI Service](https://azure.microsoft.com/ja-jp/products/ai-services/openai-service) が提供する Azure OpenAI Studio を使用すれば、OpenAI の ChatGPT と同じような対話型生成AIサービスを簡単に構築できます。さらに [Azure Congnitive Search](https://azure.microsoft.com/ja-jp/products/ai-services/cognitive-search) と連携して、RAG (Retrival-Augmented Generation) という方法を使って、外部の知識ベースから事実を検索し、最新かつ正確な情報をもとに大規模な言語モデル（LLM）を使って回答を生成することも可能です。

外部の知識データベースを使うことで望んだ回答が得られるかどうかを事前にテストしたい場合、Azure OpenAI Service と Cognitive Search の環境を構築しなくても、Webサイトと Bing Chat を用いれば簡単に質疑応答のチェックができます。

本実験では実際に大学が提供している学生便覧を用いてどのような回答が得られるかをチェックしました。

# 学生便覧とは

学生便覧とは、大学に入学した学生が必要とする情報をまとめた冊子です。例えば、以下のような内容が含まれています。

- 大学の教育方針やカリキュラム
- 学部や学科の履修規程や卒業要件
- 学生生活の支援制度や相談窓口
- 大学の諸規則や施設の利用方法
- 国際交流や就職支援の機会

学生便覧は、入学時に配布されることが多いですが、大学のホームページにも掲載されていることがあります。本実験では [**山梨大学がWeb上に公開している2023年度学生便覧**](https://www.yamanashi.ac.jp/wp-content/uploads/2016/01/c8aec6771f3a3a16773966cfbedd2dab.pdf) を使用します。

# 準備

- Edge ブラウザで学生便覧のURLにアクセスします。
- 画面右上の(b)のアイコンをクリックし、Bing Chat のサイドバーを開きます。
- 会話のスタイルは、**[より厳格に]** を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/9fdd50a7-93f1-7ef7-afc0-96db5ddd6a53.png)

# 実験

まず、各学部の全学履修科目の必須単位がいくつ必要なのかを聞いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/dad2bd69-0f92-6379-659e-9c7c74f840fd.png)

機会学科の全学必須科目の詳細を聞いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/4db4efbc-31e9-3887-af6e-7a6743ec8644.png)

全学必須科目の語学教育科目部門について聞いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/f5dcdb80-1726-44e2-0318-9c8ce16b7fe5.png)

インターンシップ制度のついて聞いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/bc4d941c-7847-2883-bfff-4f56b1775156.png)

学生便覧には記載されていないことを聞いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/7587c7d6-b2f1-dcc2-7bab-4a04097d16a8.png)

ちゃんと記載されてことを返答しています。また、「休学の方法は、山梨大学学則に定められていると思われますので、そちらを参照してください。 」といったように、別の解決策を提示しています。

# まとめ

実験の結果から、学習便覧のような文章があれば、その内容を元にQ&AできるAIチャットボットを作れる可能性があることがわかりました。Bing Chat を使ってこのように事前チェックすることで、Azure OpenAI Serivce を使った AI Chatbot が有効であるかどうかの検証ができるはずです。
【HTML・学習ログ2】フォーム作成

## フォーム作成
![スクリーンショット 2023-10-22 193658.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/4d63b42f-27dd-a00c-cc0d-19452c84a1a8.png)
《使用する主なパーツ》
- <b>ラベル</b>…項目名
labelタグで記述
<br>

- <b>テキストボックス</b> … １行の文章入力
inputタグのtype属性、text指定でボックス作成
placeholder属性でボックス内に薄い色で記入例を表示 
<br>

- <b>セレクトボックス</b> … プルダウンで複数の選択肢から１つ選択
selectとoptionタグで作成。
<br>

- <b>テキストエリア</b> … 長い文章を入力するためのフォーム
textareaタグで作成。
<br>

- <b>ラジオボタン</b> … 選択肢から１つだけクリックして選択
inputタグのtype属性、radio指定で作成。
name属性で値を統一。
<br>

- <b>チェックボックス</b> … はいかいいえの２択で選択できるフォーム。
inputタグのtype属性にcheckboxを指定。
<br>

- <b>送信ボタン</b> … フォームの入力内容を送信す
（送信ボタン）inputタグ type属性　submit指定
（ボタンの文字）value属性　任意の文字指定
（送信先）formタグ action属性　URL指定
<br>

- <b>リセットボタン</b> … フォームの入力をやり直したいときに使う。
（リセットボタン）inputタグ type属性 reset指定
（ボタンの文字）value属性　任意の文字指定。※記述しなければ「リセット」と表示される。

```html
<!DOCTYPE html>
<html>
<body>
	<form>
		<label>氏名</label>
		<input type="text" placeholder="名前を入力してください">
		<br>
		<label>年代</label>
		<select>
			<option>10代以下</option>
			<option>20代</option>
			<option>30代</option>
			<option>40代以上</option>
		</select>
		<br>
		<label>お問い合わせ内容</label>
		<textarea></textarea>
		<br>
		<label>男性</label><input type="radio" name="gender">
		<label>女性</label><input type="radio" name="gender">
		<label>その他</label><input type="radio" name="gender">
		<br>
		<label>利用規約に同意する</label>
		<input type="checkbox">
		<br>
		<br>
		<input type="submit" value="送信">
		<input type="reset" value="リセット">
	</form>
</body>
</html>
```
<hr>

（まとめ）
|フォーム|タグ|
|-|-|
|テキストボックス|input type="text"|
|ラベル|label|
|セレクトボックス|selectとoption|
|テキストエリア|textarea|
|ラジオラベル|input type="radio"|
|チェックボックス|input type="checkbox"|
|送信ボタン|input type="submit"|
|リセットボタン|input type="reset"|
【データベース/MYSQL】ER図とは何か？意味や定義、例などわかりやすく解説！！

![ER copy 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759534/6ff6c0d2-dba1-a4c7-04bb-78643efa3bce.png)
データベース設計の基本であるER図。
まずシステム開発を行う上で必ず必要なデータベース、そのデータベースを設計する上で必要になってくるのがデータベース設計です。
今回はデータベース設計の基本的な手法の一つであるER図の書き方について解説していきます。


## ER図とは
ER図とはデータベース設計（データモデリング）で使う設計手法のことです。
「エンティティ」、「アトリビュート」、「リレーション」、「カーディナリティ」と呼ばれるオブジェクトで構成されており、ER図を活用してデータ構造全体を把握してシステム開発を効率よく行います。

![ER copy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759534/08605aaf-805d-de89-c64d-f0dbd1c1b302.png)

## ER図のオブジェクトの意味と書き方
ER図のそれぞれのオブジェクトの意味と書き方について説明していきます。
カタカタで難しいと感じる部分が多いですが、データベースを設計する上では非常に重要な部分になってきますので、しっかりと覚えていきましょう。

### エンティティ
エンティティとはデータの集まりのことです。
ER図では主にテーブルのことを言うことが多いです。
またエンティティの中にはアトリビュートという詳細情報が存在します。
![ER copy 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759534/81cdf9aa-36b2-2f63-3a80-0273016070e8.png)

### アトリビュート
アトリビュートとはデータの詳細情報のことを言います。
下図でいうところの仕入先名や住所にあたります。
アトリビュートには主キーや外部キーが存在し、主キーはIDなど一意で他に存在しないの値のことを言い、
外部キーとは他のテーブルから参照しているカラムのこと言います。
![ER copy 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759534/ced924d5-2f2b-7001-c1ee-a43a42f71d82.png)

### リレーション
リレーションとは、エンティティ同士(テーブルとテーブル)の関係のことを言います。
下図でいうと注文テーブルと注文明細テーブルは注文　IDでつながれているため、リレーションが成立しているといえます。
リレーションの詳細は、「カーディナリティ」で表されます。
![ER copy 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759534/9ccf22b6-f15b-c369-b266-97a247daf59a.png)

### カーディナリティ
「カーディナリティ」とは、「１対１」「１対多」「多対多」など、リレーションの詳細を表現する記号のことです。 「0以上」や「0または1」といったことも表現することができます。多重度ともいい、どれだけエンティティ同士のつながりが強いかを表しています。

![ER copy 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759534/b091bd04-e8fe-1c9c-c049-a255fe680f05.png)

##まとめ
今回はERとは何かについて説明しました。
システム開発する上ではコードを書く時間よりもいかにしっかりとしたデータベース設計を行うかで短い期間でシステム開発が可能かどうかが決まってきます。
専門用語で非常に理解するのが難しい部分でもありますが、しっかりと覚えて実務で活かしていきましょう！
Parcel で静的ファイルの URL を取得する

例えば [Parcel](https://parceljs.org/) で画像ファイルの URL が欲しい場合は、単に import するだけで手に入ります。

```tsx:Image.tsx
import image from "path/to/image.png";

export function Logo() {
  return <img src={image} />;
}
```

ただし CSS や JSON の場合、単に import すると URL ではなくオブジェクトが手に入ってしまいます。


```tsx:Stylesheet.tsx
import stylesheet from "path/to/index.css"; // CSS Modules として import されてしまう

export function Stylesheet() {
  return <link rel="stylesheet" href={stylesheet} />; // これは動かない
}
```

Parcel 2 に搭載されている `url:` パターンを用いることで、URL を取得することができます。

```tsx:Stylesheet.tsx
import stylesheet from "url:path/to/index.css";

export function Stylesheet() {
  return <link rel="stylesheet" href={stylesheet} />;
}
```

> For the current version of parcel 2 I'm using (^2.0.0-alpha.3.2), the url:path pattern is default behaviour.

https://github.com/parcel-bundler/parcel/issues/1080#issuecomment-619077923

ちなみにそのままだと TypeScript がエラーを吐くので、アンビエントモジュール宣言を追加する必要があります。

```typescript:types/declaration.d.ts
declare module "url:*" {
  const url: string;
  export default url;
}
```

CSS ファイルの URL が欲しいケースは稀ですが、例えば [React を使って Web Components のカスタム要素を作成する](https://ja.legacy.reactjs.org/docs/web-components.html#using-react-in-your-web-components)場合などで、このテクニックが必要になることがあります。

誰かの参考になれば幸いです。
（もっと良いやり方をご存知の方がいれば、コメントにてお教えください。）
PythonからAWS BedRock経由でAnthropic Claude v2に質問して回答を得る最小限のコード

# こんな感じで

```python
import json

import boto3

message = "Claudeについて説明してください。"

client = boto3.client("bedrock-runtime", region_name="us-east-1")
body = {
    "prompt": f"\n\nHuman:{message}\n\nAssistant:",
    "max_tokens_to_sample": 2000,
}
rsp = client.invoke_model(body=json.dumps(body), modelId="anthropic.claude-v2")
rsp_body = json.load(rsp["body"])
print(rsp_body["completion"])
```

## 補足

### 事前準備

コードを実行する前に、BedRockでClaudeを使える状態にしておく必要がある。

1. AWSマネジメントコンソールにログインする。
1. us-east-1のBedRockを開く。
1. 画面左側のメニューから「Model access」を選ぶ。
1. 「Model access」の「Edit」を押す。
1. 「Anthropic」の「Request」を押す。
1. リクエストフォームが表示されるので記入して「Request」を押す。
1. しばらく待つ。

### このあたりのドキュメントを読むことになる

- client.invoke_model()について確認したいなら
    - https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/bedrock-runtime/client/invoke_model.html
- 各モデルのパラメータを確認したいなら
    - https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html

### 「Claudeについて説明してください。」の回答

>  はい、Claudeについて説明します。
> 
> Claudeは私の名前です。私はAnthropicが作成した助手型AIシステムです。人工知能として、人間とコミュニケーションを取り、情報を提供したり質問に答えたりすることができます。私の目的は人々を助け、役立つ情報を提供することです。私には感情はありませんが、会話を楽しむことができます。技術的には、大規模な言語モデルに基づいており、絶えず学習を続けて、会話能力を向上させています。ご質問があれば、できる限り明確に回答するように努めます。よろしくお願いします!
【メモ】Trailheadでやったことを備忘用に記録していく（Lightning Experience の Service Cloud ）

## Service Cloud とは?

・使いやすいカスタマーサービスアプリケーション。
⇒チケット管理する感じかな？

## Service Cloud の管理
・まずは[サービスの設定] でいじればOK

## ケース管理の自動化

・ルールを作成⇒有効化する
・ルールエントリを追加します。⇒条件式をいれて、機能を追加。
・時間経過で自動通知が来るように設定。

## ケース自動レスポンスルール

・自動レスポンスルールで顧客にメールがいくようにする。

## 複数のチャネルでのデジタルエンゲージメントの作成

・オンデマンドメール-to-ケース　の設定でメールサービスを追加
・Web-to-ケース＝オンラインフォーム設定

・他にもSalesforce でチャネルを用意することができるよ。
AtCoder初心者 DailyTrainingメモ③


# ABC269 B-問題
https://atcoder.jp/contests/adt_easy_20231024_1/tasks/abc269_b

![269B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547298/9f4089db-200b-cdbb-7b57-9d081c4d2ca8.png)

**ポイント**
・図形の境界値をset()で取得する
・空白をはさんで出力　print(A,B,sep=" ")

````Python:269B.py
# 入力
..........
..........
..........
..........
...######.
...######.
...######.
...######.
..........
..........

from itertools import permutations
import math,sys,datetime,random,glob,os,re

row = set() # 行のset
col = set() # 列のset

# 入力
for i in range(10):
    S = input()             # 1行読み込む
    for j in range(10):     # 1文字ずつ判定する
        if S[j] == '#':     # 「#」の位置を記憶させる
            row.add(i+1)    # 行のsetに　i+1 を格納
            col.add(j+1)    # 列のsetに　j+1 を格納

# それぞれの境界値を取得する
A = min(row)   # 行の最小値
B = max(row)   # 行の最大値
C = min(col)   # 列の最小値
D = max(col)   # 列の最大値

print(A,B,sep=" ")  # 空白をはさんで出力
print(C,D,sep=" ")
````

# ABC235 C-問題
https://atcoder.jp/contests/adt_easy_20231024_1/tasks/abc235_c

![235C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547298/f6e9dfdc-d335-031a-57d0-46019e11e2a5.png)

**ポイント**
・連想配列に格納する
・ループでクエリ（問い）に回答する

````Python:235C.py
from itertools import permutations
from collections import defaultdict
import math,sys,datetime,random,glob,os,re

# 入力
6 8
1 1 2 3 1 2
1 1
1 2
1 3
1 4
2 1
2 2
2 3
4 1

N,Q = map(int,input().split())
A = list(map(int, input().split()))

# 連想配列のリストクラスへ格納する
M = defaultdict(list)
for i in range(N):
    M[A[i]].append(i + 1)  # 出現順（インデックス）を記憶させたいので　[i+1]

# M: defaultdict(<class 'list'>, {1: [1, 2, 5], 2: [3, 6], 3: [4]})

for _ in range(Q):
    X,K = map(int,input().split())
    if K <= len(M[X]):
        print(M[X][K-1])    # インデックスなので　[K-1]
    else:
        print(-1)

# 出力
1
2
5
-1
3
6
-1
-1
````
# ABC272 C-問題
https://atcoder.jp/contests/adt_easy_20231019_2/tasks/abc272_c

**問題文**
長さ 
N の非負整数列 A=(A1,A2,…,AN) が与えられます。
A の異なる 2 要素の和として表せる値の中に偶数が存在するか判定し、存在する場合その最大値を求めてください。

**ポイント**
計算量を考えて偶数グループと奇数グループに分ける。和が偶数になる場合は、偶数同士奇数同士の組み合わせのみ

````Python:272C.py
入力例
3
2 3 4

N = int(input())
A = list(map(int, input().split())) 

# 計算量を考えて偶数グループと奇数グループに分ける
# 和が偶数になる場合は、偶数同士奇数同士の組み合わせのみ

add = []
even = []

ans = -1
for i in range(N):
    if A[i] % 2 == 0:
        add.append(A[i])
    else:
        even.append(A[i])

add.sort(reverse=True) # 降順に並べ替え
even.sort(reverse=True)

addsum = 0
evensum = 0

# 偶数グループ、奇数グループのTOP2 の和を算出
if len(add) >= 2:
    addsum = add[0]+add[1]
    ans = max(ans,addsum)

if len(even) >= 2:
    evensum = even[0]+even[1]
    ans = max(ans,evensum)

print(ans)
````
PDFアップロード時のプレビューが白紙になる

# 内容

プロダクトの中に、PDFをアップロードする部分があり、
そこで特定のPDFアップロードすると、下記のように枠線だけ残って、文字が消えるといった自体を発見。
このときの調査の履歴と対応を記しておく。
ライブラリにreact-pdf@3.0.5を利用していた。（pdfjs-dist）
諸事情で今はライブラリのアップデートとかはしたくない！なんてときに役立つはず。
同じような問題に直面している人に少しでも助けになりますように。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2563397/a781f566-591b-4d09-5b50-da5bc85d323c.png)



# 前提知識
## react-pdfとは
React アプリケーション内で PDF ドキュメントを表示、操作、作成するためのライブラリ。
アプリを作成するときにこのライブラリをインストールして、importして使う。
このライブラリの中でpdfjs-distも使われている
https://react-pdf.org/

## pdfjs-distとは
PDF.jsのビルド成果物。これをnpm installで自分のアプリにインストールしてPDF.jsが使えるようになる。

## PDF.jsとは
Mozillaが開発した、オープンソースのJavaScriptライブラリ。
ウェブブラウザ内でPDFドキュメントを表示するためのもの

## pdfの文字表示のために必要なこと
cmapsの理解。フォントが持つそれぞれの文字と、文字コードを結びつけるための対応表のこと。
PDF.jsなどのPDFレンダリングライブラリはPDF内の文字を実際のUnicode文字にマッピングさせることで、ブラウザでの表示を可能にしている。つまり、PDFが持っている文字の情報をブラウザで表示するためにマッピングの情報を予め持っておく必要がある。そのマッピングを行うものの１つがcmaps。
PDF.jsはそれをライブラリ内部にこんな感じで持っている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2563397/53c0bcba-a39e-c2a2-7827-bb2c042673c1.png)

参考）
https://www.morisawa.co.jp/culture/dictionary/1921#:~:text=%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%8C%E6%8C%81%E3%81%A4%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E3%81%AE,CID%E3%81%8C%E4%BD%BF%E3%82%8F%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82

## 今回の事象
上記スクショのように、アプリ内でcmapsを持っていて、そこを参照してレンダリングされるようになっている場合、ユーザーによってアップロードされたPDFの文字コードが、今、システムに取り込まれている、このライブラリ内のcmapsにマッピングがない場合、このマッピングがうまくいかず、ブラウザでレンダリングできないというような状況になってしまう！！（ここに至るまでかなりの時間を溶かした）

参考）

https://blog.csdn.net/gentleman_hua/article/details/126579762

## 対応
じゃあ、Web上に転がっている最新のやつを参照するようにすればよくね？
おそらくこのマッピングの参照元を定義している場所があって、そこをどうにかすればなんとかなるのでは
という発想。

それが下記の部分。
react-pdfはデフォルトではライブラリ内を読み込もうとする。
```
const options = {
  cMapUrl: 'cmaps/',
  cMapPacked: true,
};
```

ここを変更する。なんとオプションをつけることができて、読み込むソースを指定できる。
setOptionsをimportする（setOptionsはreact-pdfの3.0.5専用）
```
import { Document, Page, setOptions } from 'react-pdf';
```

利用前にsetOptionsを定義しておく
このcMapUrlというところを自分のプロダクトに適するものをチョイスする。
```
setOptions({
    cMapUrl: 'https://cdn.jsdelivr.net/npm/pdfjs-dist@2.0.305/cmaps/',
    cMapPacked: true,
});
```

利用する部分でoptionをもたせる
```
<Document
    file={file}
    onLoadSuccess={this.onDocumentLoadSuccess}
    options={options}
>
```

これで表示されるようになった！！


参考）
https://github.com/wojtekmaj/react-pdf/commit/6cc17ca63d5742f23293e8379202a37787941f8f

## 書簡
自分が作った部分じゃなかった（ほとんどそう）ので、pdfをブラウザにどうやって出しているかというところからの調査。
後任エンジニアあるあるの、問い合わせを投げてきている人よりこの周辺を知らないところからのよーいどん。
前提知識すらいろんなドキュメントを漁って、githubに載っているライブラリの中のソースコードを読んで漸くたどり着けた。
この記事を書くために自分の作業ログを見ていたら、誕生日にこの調査やっていた。エンジニア冥利に尽きるぜ（涙）
同じような問題に直面している人に少しでも助けになりますように。と本当に心から思ってこの記事書こうと思いました。
もっといい解決は絶対あるとは思う。
Linux(arch)✖nvidia(3060ti)✖gnomeでgoogleアカウント追加につまづいた時の備忘録

## 環境
![Screenshot from 2023-10-22 19-03-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663352/9649de10-b151-2807-10a4-143b1ff457ef.png)

## 困ったこと
googleアカウント追加しようとしたら画面が真黒
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663352/744e8657-e7a9-7d38-1765-26813e354308.png)

## やってみたこと
色々ググって以下の記事を発見

https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/2498

## 結論
以下を実行したら問題なくウィンドウが表示され、アカウントが追加できた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663352/64018b96-1678-3c48-3fe2-5025c807b0f7.png)

一応コマンドとかを載せる

modesetを確認
```sh
sudo cat /sys/module/nvidia_drm/parameters/modeset
N ←ここが"Y"になってほしい
```
結果がNだったら
```sh
echo options nvidia_drm modeset=1 | sudo tee /etc/modprobe.d/nvidia_drm.conf
```
これで一回再起動して"Y"になっていることを確認する。

ここで一度アカウント追加ウィンドウが正常に表示されるか確認する。

私の場合はだめだったので更に、
```sh
export $WEBKIT_DISABLE_SANDBOX_THIS_IS_DANGEROUS=1
export WEBKIT_DISABLE_SANDBOX_THIS_IS_DANGEROUS=1
export WEBKIT_FORCE_SANDBOX=0
```
を実行してから、
```sh
gnome-control-center #普通にGUIから起動すると上の設定が反映されない
```
で設定アプリを起動してアカウント追加を試みる。

## 結果
無事入力ウィンドウが表示されてアカウント追加できました。
ちなみにセッション切れば当然また真っ黒な画面に戻る。
何度も操作する人は.bashrcとかに書いておくとかスタートアップアプリにスクリプトを登録とかすると良いのかな？
Linux初心者なので対処療法っぽいことしかできませんでした。詳しい方原因とか分かったら教えてほしいです。
plunkerでthree.js その8

# 概要
plunkerでthree.jsやってみた。
練習問題、やってみた。

# 練習問題
クリックして、線を引け。

# 方針
- raycaster使う
- clickイベント使う
- line使う

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/07767128-5475-f287-5767-695d6ed3a7f1.png)


# サンプルコード

```

let scene, 
    camera, 
    light,
    renderer;

renderer = new THREE.WebGLRenderer({ 
	  antialias: true 
});
renderer.setSize(400, 400);
document.body.appendChild(renderer.domElement);
scene = new THREE.Scene();
scene.background = new THREE.Color(0xbfd1e5);
camera = new THREE.PerspectiveCamera(45, 400 / 400, 1, 1000);
camera.position.set(0, 0, 200);
scene.add(camera);
light = new THREE.AmbientLight(0xFFFFFF);
scene.add(light);
const size = 70;
const geometry = new THREE.BoxGeometry(size, size, size);
const material = new THREE.MeshNormalMaterial()
const box = new THREE.Mesh(geometry, material);
scene.add(box);
renderer.render(scene, camera);
var raycaster = new THREE.Raycaster();
var controls = new THREE.OrbitControls(camera, renderer.domElement);
controls.update();

renderer.domElement.addEventListener('click', function(e) {
  var raymouse = new THREE.Vector2();
	raymouse.x = (e.offsetX / 400) * 2 - 1;
	raymouse.y = -(e.offsetY / 400) * 2 + 1;
	raycaster.setFromCamera(raymouse, camera);
	var intersects = raycaster.intersectObjects(scene.children);
	if (intersects.length > 0)
	{
		const material0 = new THREE.LineBasicMaterial({ 
  	  color: 0xff0000 
    })
    const points = new Array()
    points.push(intersects[0].point)
    points.push(new THREE.Vector3(50, -50, 40))
    const geometry0 = new THREE.BufferGeometry().setFromPoints(points)
    const line = new THREE.Line(geometry0, material0)
    scene.add(line)
		renderer.render(scene, camera);
	}
})

function tick() {
	requestAnimationFrame(tick);
	renderer.render(scene, camera);
	controls.update();
}
tick();




```

# 成果物

https://embed.plnkr.co/plunk/OYPoZMljS12e7riC


以上。
ESLint で Date オブジェクトの使用を禁止する

`new Date()` と `Date.parse()` だけを禁止したい場合は [amzn/eslint-plugin-no-date-parsing](https://github.com/amzn/eslint-plugin-no-date-parsing) などが使えますが、 `Date` オブジェクトに生えている全てのメソッドも禁止したい場合は、以下のようなルールを書くことで実現できます。
（[ESLint Flat Config](https://eslint.org/docs/latest/use/configure/configuration-files-new) を使う場合は適宜読み替えてください。）

```json:eslintrc.json
{
  "rules": {
    "no-restricted-syntax": [
      "error",
      {
        "selector": "NewExpression[callee.name='Date']",
        "message": "Use dayjs instead."
      },
      {
        "selector": "CallExpression[callee.object.name='Date']",
        "message": "Use dayjs instead."
      }
    ]
  }
}
```

[no-restricted-syntax](https://eslint.org/docs/latest/rules/no-restricted-syntax) というルールを使うことで実現しています。
[こちらの記事](https://zenn.dev/ubie_dev/articles/a5c8fb2d219258#no-restricted-syntax-%E3%81%A7%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%82%92%E7%A6%81%E6%AD%A2%E3%81%99%E3%82%8B)に詳しい使い方が書いてあるので詳細は省きますが、このルールを使うことで特定の構文を禁止できるようになります。
（余談ですが http://estools.github.io/esquery/ は中々楽しいので、是非触ってみてください。）

また私のチームでは [Day.js](https://day.js.org/) を使っているので、メッセージではそちらを使うよう促しています。

誰かの参考になれば幸いです。
（もっと良いやり方をご存知の方がいれば、コメントにてお教えください。）
Dell PowerEdge R720のiDRACやBIOSを更新する

中古のPowerEdge R720を購入し、使える状態に持っていくまでの備忘録。

# 購入した状態
- CPU: E5-2630 * 1
- メモリ: DDR3-1333 16GB * 4
- ディスク: なし
RAIDコントローラのバッテリー劣化

# 挑戦した内容
- CPU: 2 socket使う
- メモリ: 増設する（予定）
- ディスク: SSDを使う
- RAIDコントローラ交換

# 実際にやった内容
## iDRACのバージョンアップ
### iDRACログイン
まずiDRACのIPを調べるところから。
全面のフロントパネルを操作してIPアドレスを確認します。
1. 決定ボタンを押す
1. Viewを選択して決定ボタンを押す
1. iDRAC IPを選択して決定ボタンを押す
1. IPv4を選択して決定ボタンを押す
1. IPを選択して決定ボタンを押す

iDRACのIPが確認できたらPCとiDRACポートをLANケーブルで接続し、PCのIPを手動設定してブラウザで接続します。

BIOSが起動する状態なら、セットアップモードでiDRACの設定を書き換える方が早そうです。

### TLSエラー回避
ブラウザで普通にアクセスするとセキュリティエラーが表示されます。TLS1.1以下のサイトには接続できないようになっています。

そこでEdgeをIEモードで動かし、さらにTLS1.1以下のプロトコルを許可します。
目的が済んだら設定を元に戻しておきましょう。

https://beyondjapan.com/blog/2023/05/support-protocol/

id/passwordを聞かれますが、初期パスのことが多いです。
初期パスで入れなかったらリセットしましょう。

### iDRAC更新ファイルの取得
dellのサポートサイトからファームウェアを取得します。大抵は1系だと思うので、まずは1系の最新版(1.66.65)を目指します。

下記サイトからMS Windows 64ビット用更新パッケージをダウンロードします。

https://www.dell.com/support/home/ja-jp/drivers/driversdetails?driverid=3f4wv&oscode=ws8r2&productcode=poweredge-r720

ダウンロードしたファイルとiDRACの更新画面でブラウザからアップロードして展開されるのを待ちます。展開が失敗する場合はローカルで展開し、.d7ファイルをアップロードします。

アップロードが完了しチェックに成功するとバージョンアップできる状態になります。そのままブラウザからバージョンアップ実行を行いましょう。iDRACが再起動します。

次に2系をダウンロードします。.d7ファイルを使うやり方は最後に気づいたので、実は一足飛びでできるかもしれません。自分はまずは2系の最初のリリース(2.10.10)を使いました。

https://www.dell.com/support/home/ja-jp/drivers/driversdetails?driverid=y5k20&oscode=ws8r2&productcode=poweredge-r720

最後、2系の最新版(2.65.65)に更新しました。

https://dl.dell.com/FOLDER06110107M/1/iDRAC-with-Lifecycle-Controller_Firmware_0GHF4_WN64_2.65.65.65_A00.EXE

大体2系くらいからブラウザをIEモードで接続しなくても閲覧できるようになります。

## BIOSのバージョンアップ
CPUをE5-2630v2に換装したところBIOSが起動しなくなりました。
マザーボードのファームウェアを更新する必要がありそうです。

BIOSを起動できる状態に戻すためE5-2630に換装し直します。
DELLのサポートサイトから最新のBIOSを取得します

https://dl.dell.com/FOLDER05980977M/1/R720-020900C.efi

EFIファイルをUSBメモリに保存し仮想コンソールで連結させるか、直接サーバにUSBメモリを挿します。
サーバを再起動しBIOS Boot ManagerからBIOSをアップデートします。

BIOSが最新(2.9.0)になると、E5-2630v2も認識されBIOSが起動するようになりました。

## RAIDコントローラーのバッテリー交換

この動画がわかりやすかったです。先にRiserカードを抜いてから交換します。
RPEC H710 のバッテリーはLi-ionなので絶縁してから回収してくれる場所に持っていきましょう。

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

バッテリーを交換してからは少しの時間iDRACからは認識されませんでしたが、起動したまま数十分まつと認識されました。

## SSD
筐体がSASなので、SAS SSD (HGST)を仕入れました。
しかしiDRACでは認識されるもののファームなどが見つからず書き込み不可になっています。
RAIDコントローラからRAID1仮想ディスクの作成を試みましたが作成失敗になります。

調べた限りだとHGSTのSSDでも、Dellブランドでない限りはファームウェアが異なるため使用できないようです。フォーマットを変更すれば動くという噂もありますが、SAS SSDのフォーマットを変更できる環境が用意できなかったので試せていません。

(追記)
↓を参考に、LSI MegaRAID SAS 9272-8i でフォーマットできるか試してみました。
物理ディスクとしては認識されているのですが、WebBIOS上でRAID組めず、OS上でも物理ディスクが刺さっていること自体認識できませんでした。SSDだとHDDより詰まりどころが多そうです。

https://nakoruru.jp/format_netapp_hdd_sas_520byte_sector_so_that_it_can_be_used/

SASのSSDは種類が多くなく中古品も高いのですが、SATAのSSDも使える（速度はSATA基準になる）とのことなので、Micron 1100シリーズを試してみました。
iDRACから物理デバイスとして認識されるものの細かい情報などは取得できてなさそう？
不安でしたがRAIDは構築できて、OSインストールも成功しました。

# まとめ
iDRACやBIOSのバージョンアップ方法などについて記載しました。
この記録が誰かの参考になれば幸いです。

今後作業を進める中で引っかかりポイントなどあれば追記していきます。
GitHub 上の Pull Request に特定のラベルが付いている場合は CircleCI のワークフローを止めたい

特定の条件下では CircleCI のワークフローを実行したくないとき、ありますよね。
ブランチをフィルターするだけで済むならそちらの方が楽ですが、Pull Request のラベルを参照したい場合は自前でスクリプトを書く必要があります。多分。

というわけでスクリプトを書いてみたところ、こんな感じになりました。
`installation_id` などは適宜読み替えてください。

```typescript:scripts/confirmNeedForDistribution.ts
import { createAppAuth } from '@octokit/auth-app';
import { request } from '@octokit/request';
import { Buffer } from 'buffer';

(async () => {
  const appId = process.env.GITHUB_APP_ID;
  const privateKey = process.env.GITHUB_APP_PRIVATE_KEY;
  const commitSha = process.env.CIRCLE_SHA1;

  const owner = "my-owner";
  const repo = "my-repository";

  if (!appId || !privateKey || !commitSha) {
    throw new Error('id または privateKey または commitSha が存在しません。');
  }

  // GitHub App として認証し、JWT を取得
  const auth = createAppAuth({ appId, privateKey });
  const { token: jwt } = await auth({ type: 'app' });

  // GitHub API のアクセストークンを取得
  const {
    data: { token },
  } = await request('POST /app/installations/{installation_id}/access_tokens', {
    headers: { Authorization: 'Bearer ' + jwt },
    installation_id: 99999999,
  });

  // CI 実行のトリガーとなったコミットが属する Pull Request を取得
  const { data: pullRequests } = await request(
    'GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls',
    {
      headers: { Authorization: 'Token ' + token },
      owner,
      repo,
      commit_sha: commitSha,
    },
  );

  // Pull Request のラベルを取得
  const { data: labels } = await request(
    'GET /repos/{owner}/{repo}/issues/{issue_number}/labels',
    {
      headers: { Authorization: 'Token ' + token },
      owner,
      repo,
      issue_number: pullRequests[0].number,
    },
  );

  // ラベルを確認
  console.log(
    labels.some((label) =>
      ['feat', 'fix', 'hotfix', 'refactor', 'deps'].includes(label.name),
    ),
  );
})();
```

```yaml:.circleci/config.yml
version: 2.1

commands:
  confirm-need-for-distribution:
    steps:
      - run:
          name: Confirm need for distribution
          command: |
            flag=$(yarn -s ts-node scripts/confirmNeedForDistribution.ts)
            if [ $flag = "false" ]; then
                circleci-agent step halt
            fi
```

個人のトークンに紐付けたくなかったので [GitHub App を作成](https://docs.github.com/ja/apps/creating-github-apps/registering-a-github-app/registering-a-github-app)し、それを使いました。
また、認証には [octokit/auth-app.js](https://github.com/octokit/auth-app.js/) を使用しました。
誰かの参考になれば幸いです。
（もっと良いやり方をご存知の方がいれば、コメントにてお教えください。）
OBS Studio のインストール方法

# はじめに

ごきげんよう、百合宮桜です。
本記事は、非IT職が少しも早くインストールを完了する為に書いています。
その為、環境が Windows に限定されますが、ご了承ください。

# Microsoft Store を起動する
1. タスクバーにある検索ボックスに「Microsoft」を入力し、「開く」をクリックします。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/cd3d23ca-7ed5-3eb1-8d65-4a74147619b5.png)

2.  Microsoft Store が起動します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/1aed49db-e5e0-49a4-807f-e4495b9d0f07.png)

# OBS Studio をインストールする

1. Microsoft Store 上部の検索ボックスに「OBS」を入力します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/d562f041-e5d5-0a3f-ed2a-8cb5e904c972.png)

2. OBS Studio をクリックします。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/8bc4b28e-dd66-f2b3-b0c4-804dbfc56d03.png)

3. インストール をクリックします。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/27b708f4-a409-c647-fb6d-e42b393a1742.png)

4. ユーザーアカウント制御 のウィンドウが出たら、はい をクリックします。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/b0d2766f-15b0-9bd2-9f1c-1e1795719fab.png)


5. インストールが完了します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/33e2ca07-94eb-c691-6526-dc1ebd4214c7.png)

    タスクバーの検索ボックスで「OBS」と検索すると、OBS Studio が起動できます。

    
# OBS Studioの 初期設定を完了する
1. OBS Studio を起動します。

2. 自動構成ウィザード というウィンドウが開きます。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/2f48a8af-9d5a-16c3-0f94-f6f1f6a005df.png)

3. 使用目的を選択し、「次へ」をクリックします。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/10c3e891-faeb-911e-5fa3-f0ad59f7628e.png)

4. 映像設定を行い、「次へ」をクリックします。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/c6f83f87-36ca-fbb6-f4c9-eed5c82adf57.png)

    ※私は映像設定をデフォルト値のままにしておきます。

5. 「設定を適用」をクリックします。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/17931e0c-24e5-d4b9-a364-d705c0f5c43d.png)

6. 自動構成ウィザード のウィンドウが閉じ、設定が完了します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/d8092766-125d-2e06-bb06-17879086e5e0.png)


# 終わりに

OBS Studio は、YouTube の配信や画面録画を行う際に使用するツールです。
無料ですし、画質が綺麗なので、お仕事で動画を作成する際によく使用します。
皆さんもよかったら、使ってみてください。
PC上の動画をH.264でエンコしてBDAVとして焼く方法

むかしは知恵ノートに書いてあってすぐ見つけられたのですがいまはなかなか発見できないので、makeBDAVベースのやり方ここにメモしておきます。


[makeBDAV1.40B1](https://bit.ly/2VdX0BX)

# 必要機器、ソフト

- BDドライブ装備のPCとレコーダー
- MakeBDAV（Javaとffmpegも必要）
- ImgBurnなどのオーサリングソフト

# 手順

## MakeBDAVの「設定」

設定でFFmpegのオプション１に以下のように設定する（オーディオエンコはお好みで）

```
-c:a ac3 -b:a 192k -ar 48k -pix_fmt yuv420p -c:v libx264 -x264opts "nal-hrd=vbr:aud:colorprim=bt709:transfer=bt709:colormatrix=bt709:sar=1/1:weightp=0:b-pyramid=strict:slices=4:bframes=3:keyint=24:vbv-maxrate=40000:vbv-bufsize=30000:ref=4:level=4.1"
```


注：vbv-maxrate, vbv-bufsize, level, refの値は以下で決定

|Level|vbv-maxrate|kbpsvbv-bufsizekbit|解像度（最大ref）|
|---|---|---|----|
|4.1|40000|30000|1920x1080(4), 1440x1080(4) 1280x720(6) 720x576(6) 720x480(6)|424000300001920x1080(4)1440x1080(4)1280x720(6)720x576(6)720x480(6)3.22400024000720x576(6) 720x480(6)3.11680016800720x576(6) 720x480(6)31200012000720x576(5) 720x480(6)


尚、mpeg2形式でいい場合は、インストール時の設定のままで構いません

## ドラッグドロップ

MakeBDAVに変換したいファイルをドラッグ＆ドロップして「作成」

## ImgBurnを起動

起動したら「Write files/folders to disc」をクリック

## ドラッグドロップ

makeBDAVの出力フォルダーにある「BDAV」フォルダをImgBurnにドラッグ&ドロップ

## Optionsは次の基準で

- BD-REの場合: UDF 2.50、
- BD-Rの場合: UDF 2.60

## 焼く

Let's burn!

これで完成です

画質に問題がある場合は、1.の設定に「-b:v 8000k」などビットレートを指定してみてください
[非推奨] 今どきの環境でASA5505のASDMを使う方法

# はじめに

旧式のASA5505のASDMを利用しようとしたときに、TLSv1しかサポートされていない悲しい機器ですので、今どきの環境ではアクセスできません。
セキュリティ面は置いといて、とりあえず使えるようにする方法です。

:::note information
当然ながらTLSv1は非推奨のプロトコルですので、大事な環境では使うのはやめましょう。
古い機器は早く更改すべきです。
:::


# 環境

## クライアントPC
- Windows 10 Pro (22H2)
- Edge (118.0.2088.61)
- Oracle JRE (1.8.0_391)

## ASA5505
- ASA 89.2(4)33 (asa924-33-k8.bin)
- ASDM 7.6(2)150 (asdm-762-150.bin)


# クライアントPCの設定

## JREの設定（コントロールパネル）

1. [コントロールパネル] - [Java]
2. [詳細]タブから、[TLS 1.0を使用する]にチェック
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580974/d07ec2ab-c0a5-362f-854f-55f2803e73b8.png)

## JREの設定（java.security）

1. "C:\Program Files\Java\jre-1.8\lib\security\java.security" をエディタで開く（要管理者権限）
2. jdk.tls.disableAlgorithmsから、TLSv1を削除

```diff
-jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
+jdk.tls.disabledAlgorithms=SSLv3, TLSv1.1, RC4, DES, MD5withRSA, \
    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
    include jdk.disabled.namedCurves
```

## Edgeの設定

1. [設定] - [既定のブラウザー]
2. [Internet Explorer モード ページ]に、ASAのIPアドレスを追加（例：https://192.168.100.250/）
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580974/0c70c2f7-74ff-664f-02bc-2c10a8560ab7.png)

## インターネットオプションの設定

1. [コントロールパネル] - [インターネットオプション]
2. [詳細設定]タブから、[TLS 1.0を使用する]をチェック
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580974/64dd1831-0fc3-511e-b230-edf413aa7dec.png)


## ASAの設定

TLSv1を使用するように設定します。（デフォルトがTLSv1になっているハズですが。）
```
ASA5505# show run ssl
ssl server-version any
ASA5505# conf t
ASA5505(config)# ssl server-version tlsv1
ASA5505(config)# wr
```


## ASDMのショートカットの変更

TLSv1だけでなく、[Cisco ASDM-IDM Launcher]のショートカットの修正も必要です。

1. [Cisco ASDM-IDM Launcher]のショートカットを右クリック、[プロパティ]
2. [リンク先]を、"%SystemRoot%\system32\wscript.exe invisible.vbs run.bat"に変更


# 動作確認

通常通りASDMにアクセスしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580974/b142d870-65dc-6f9e-2884-ac70f9f5ccdc.png)

これで、[OK]を押すと、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580974/e6266476-7e3f-4628-5176-01bf7d6d9c84.png)

と言われますが、[続行]します。

ほら起動した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580974/58e2ee7b-8e4b-4812-679c-104e734cda92.png)

大丈夫ですね。（セキュリティ面はおいといて）万事OKなはずです。
ECSのタスク配置戦略を調べた

ECSを試しに使ったとき、EC2が二つ起動されたけど、

特にこちらで台数を指定した覚えがないので、なんで二台か調べた

# ECS タスク配置戦略
AWS公式サイトによると、

>**EC2起動タイプ**を使用するタスクを起動するとき、Amazon ECSではタスク定義で指定されている CPU やメモリなどの要件に基づいてタスクを配置する場所を決定する必要があります。

とのことなので、タスクが何をどうやるか（CPU・メモリ）によって、配置する場所（どのタイプのEC2、どのEC2）が変わるということかな。。。

そして、EC2を以下のように選ぶらしい

> Amazon ECSがタスクを配置する際は、以下のプロセスでコンテナインスタンスを選択します。
　①タスク定義の CPU、GPU、メモリ、ポートの要件を満たすインスタンスを識別します。
　②タスク配置の制約事項を満たすインスタンスを識別します。
　③「タスク配置戦略」を満たすインスタンスを識別します。
　④タスクを配置するインスタンスを選択します。

じゃ、タスクを配置する場所について開発者は何も指定できないか？　そうでもない

**タスクの実行時**または**新しいサービスの作成時**に（タスク定義作成時じゃなく）、
以下のように「タスク配置戦略」を指定することで（上の③に該当）、タスクの配置をある程度決められる。

```ruby:
"placementStrategy": [
    {
        "field": "attribute:ecs.availability-zone",
        "type": "spread"
    }
]
```

# 戦略タイプ

## binpack
CPU またはメモリの最小利用可能量に基づいてタスクを配置
（使用中のコンテナインスタンスの数を、「最小限」に抑える）

### 例：メモリに基づいてタスクをビンパックする
"field"を「memory」に指定

## random
タスクをランダムに配置

## spread
タスクは「指定された値」に基づいて均等に配置

### 例：複数のアベイラビリティーゾーンでタスクを均等に分散する
"field"を「attribute:ecs.availability-zone」に指定

### 例：すべてのインスタンスでタスクを均等に分散する
"field"を「instanceId」に指定

# 参考サイト

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-placement-strategies.html

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-placement.html
Missing frozen string literal comment. (convention:Style/FrozenStringLiteralComment)

## 以下、ChatGPTの回答を要約
- この警告は、RuboCopと呼ばれるRubyコードスタイルおよび品質のツールからのもので、Rubyコード内で "Frozen String Literal Comment" が見つからない場合に表示される。

- "Frozen String Literal Comment" は、Ruby 2.3以降で導入された機能で、文字列（String）リテラルを凍結（freeze）させるための指示。
    - 文字列を凍結すると、その文字列への変更ができなくなり、メモリ使用量が削減されるなどの利点がある。

## 使い方
Rubyコード内の冒頭に、次のようにコメントを追加する。（＝マジックコメント）
```ruby
# frozen_string_literal: true
```

## 効果

```ruby
# frozen_string_literal: true

message1 = "Hello, World!"  # 凍結されます
message2 = "Hello, World!"  # 凍結されます

# 同じ文字列のため、同じobject_idを持つ（＝メモリ使用量が削減できる）
p message1.object_id # 60
p message2.object_id # 60
```
Stringリソースで便利なもの

# はじめに
今回は、Stringリソース等でよく使うものを紹介していきます
### 本文
まず、基本としてStringリソースには代替文字が使えるということです
Stringリソースでは`%`の後ろに数字であれば`d`、文字列であれば`s`を書くことで変数の値を代入して表示することができます。
その時によく使うのが下記のような数値表示です。
```kotlin
fun Int.withComma() = "%,d".format(this)
```
これらを駆使することでユーザー名や何かの値を表示するのに楽になります
### 最後に
今回は、Stringリソースのの大体文字列を備忘録として記事にしました
どなたかのお役に立てれば幸いです
【備忘録】Axios のHTTPメソッド一覧　（コピペ）

備忘録（編集方法いまだよくわからず）


import axios from 'axios';

const BASE_URL = 'http://your-api-domain.com/ApiExample';

// GET: TODOリストの取得
const getTodos = async () => {
    try {
        const response = await axios.get(`${BASE_URL}/todos`);
        return response.data;
    } catch (error) {
        console.error('Error getting todos:', error);
    }
}

// POST: TODOの追加
const addTodo = async (name, todo) => {
    try {
        const response = await axios.post(`${BASE_URL}/todos`, {
            name,
            todo,
            completed: false
        });
        return response.data;
    } catch (error) {
        console.error('Error adding todo:', error);
    }
}

// PUT: TODOの更新
const updateTodo = async (id, updatedData) => {
    try {
        const response = await axios.put(`${BASE_URL}/todos/${id}`, updatedData);
        return response.data;
    } catch (error) {
        console.error('Error updating todo:', error);
    }
}

// DELETE: TODOの削除
const deleteTodo = async (id) => {
    try {
        const response = await axios.delete(`${BASE_URL}/todos/${id}`);
        return response.data;
    } catch (error) {
        console.error('Error deleting todo:', error);
    }
}

// 使用例
(async () => {
    // TODOの追加
    const newTodo = await addTodo('John', 'Buy groceries');
    console.log('Added todo:', newTodo);

    // TODOリストの取得
    const todos = await getTodos();
    console.log('Todos:', todos);

    // TODOの更新
    if (todos.length > 0) {
        const updatedTodo = await updateTodo(todos[0].id, { completed: true });
        console.log('Updated todo:', updatedTodo);
    }

    // TODOの削除
    if (todos.length > 0) {
        await deleteTodo(todos[0].id);
        console.log('Todo deleted.');
    }
})();
【Android】最小APIが低くてもJava 8の機能を使用する方法

# はじめに
ツール系のアプリケーションや歴史のあるプロジェクトでなかなか最小バージョンをあげられないプロジェクトが一定数ありますよね。
そんな時にjava.timeなどに含まれるLocalDateTimeなどの機能を使用しようとすると最小を26以上にしろと怒られるケースがあるかと思います。
本日は最小APIが満たされていなくてもJava８の機能を使用するための設定を備忘録的にまとめておこうと思います。

# 設定方法
設定は非常にシンプルで、app/build.gradleに以下設定を追記するだけです。

```app/build.gradle
coreLibraryDesugaringEnabled true
```

設定は以上になります、上記に関する情報は公式にも記載がありますので、こちらも参考にしていただけたらと思います。

https://developer.android.com/studio/write/java8-support?hl=ja

# さいごに
最小バージョンをあげたいけど上げられないという状況はエンジニアにとってフラストレーションが溜まる原因になりますので、本当に厳しいかどうかは適時相談していきたいところですね。
kintoneエラー：ゲストスペースのURLが正しくありません

先日、痒い所に手が届くkintoneプラグインを提供させていただいたのですが、エラーになるとのこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/f0a0accb-6775-e15f-45db-7cebddf3533e.png)

プラグインは、kintone標準の「一覧」を拡張し、絞り込み機能を追加するものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/5beb83ba-8bb8-d1a0-7616-8635a45e4462.png)

これは、URLのクエリ文字列で実現しています。

https://cybozu.dev/ja/kintone/docs/js-api/app/specify-record-list-via-query-string/

kintoneには、**ゲストスペース**と呼ばれる、取引先や協力会社など、社外の人を**ゲストユーザー**として招待し利用できる特別なスペースがあります。
ゲストユーザーは、ゲストスペースのデータにしか閲覧権限が無いので、ゲストスペースを跨いでのルックアップ機能が使えません。当初この可能性を疑ったのですが違いました。

ゲストスペースではURLのルールが変わるので、その考慮が必要でした。

```:通常のスペースの場合
https://（サブドメイン）.cybozu.com/k/（アプリID）/
```

```:ゲストスペースの場合
https://（サブドメイン）.cybozu.com/k/guest/（スペースID）/（アプリID）/
```

飛び先URLは次のようなコードで設定しています。
（`q`にはクエリ文字列が入ります）

```javascript:修正前コード
const baseURL = `https://${location.hostname}/k/${event.appId}/?view=${event.viewId}`;
location.href = q ? `${baseURL}&query=${encodeURI(q)}` : baseURL;
```

そこで、次のように修正することを考えましたが、スペースIDを取得するAPIは無さそうです。

```javascript
// URLのパスが /k/guest/ で始まっていれば
const baseURL = location.pathname.startsWith('/k/guest/') ? （ゲストスペースのURL） : （通常のスペースのURL）
```

現在のURLから、クエリ文字列のみ差し替えれば良さそうなので、`location.href`ではなく`location.search`を変更することにしました。

```javascript:修正後コード
location.search = q ? `view=${event.viewId}&query=${encodeURI(q)}` : `view=${event.viewId}`;
```
Kubernetes使ったことないので調べた

# Kubernetesとは
Kubernetesとは、コンテナのオーケストレーションツールのことです。そもそもオーケストレーションツールとは、コンピュータシステム、アプリケーション、およびサービスにおける、設定、管理、調整の自動化を意味するそうです。つまり、システムにおけるコンテナ全体の管理を行うツールがKubernetesです。
ちなみにKubernetesをk8sと略すことがありますが、これはkとsの間が8文字だからだそうです。

# Kubernetesがあるの何がうれしいのか
Kubernetesは複数のサーバ内にあるコンテナの全体を管理することができます。もしKubernetesがない環境であれば、各サーバーにログインしDockerコマンドを実行しなくてはなりません。これでは障害発生時や、コンテナのアップデートに相当な手間がかかってしまいます。

# 用語
- ノード：1つのVMまたは物理マシン
- ワーカーノード：実際にコンテナを動かすノード
- マスターノード：ワーカーノードを管理するノード
- クラスター：マスター・ワーカノードで構成されたKubenertesのシステム群
- マニフェストファイル：各種リソース構成や実行するコンテナイメージなどの定義を記述するファイル、コンテナはこのファイルに記載されている状態いに保たれる
- Pod（ポッド）：コンテナとボリュームがセットになったもの、基本的には１Podにつき１コンテナ、ボリュームがない場合も１コンテナを１Podとカウントする

# おわり
業務でKubernetesを使ったことはないのですが、何となく知っておきたかったので簡単にまとめておきました。
いつか使えたらうれしい

# 参考
- https://kubernetes.io/ja/
- https://zenn.dev/esaka/articles/2d117655af1f03cf2444
- https://www.redhat.com/ja/topics/automation/what-is-orchestration
JSでスイカゲームみたいなの


# なにそれ

落ち物ゲームです
同じ大きさの野菜くっつけてどんどんデカくしていくやつです

https://topics.nintendo.co.jp/article/e9d2815a-23be-4dab-9264-1b959470e4fb

# 大体の仕様

実はスイカゲームやったことないので雰囲気で仕様決めます
上から玉落とせる
同じ大きさ同士ならぶつかった中心点に1つ上の大きさの玉を出現させる。
最後の玉が一定のラインを超えたらゲームオーバー

# 完成形

![CPT2310221529-1024x602.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329559/ba8494b6-c4fc-6e21-bf04-b0383fdb58a6.gif)

## URL

https://babu-ch.github.io/ballgame/

# どうやって作った

vite+TSでセットアップして、phaser3というゲームライブラリで作成しました

適当に実装しましたがphaser3がすごいのである程度それっぽくなりました

phaser3
https://phaser.io/phaser3

人気そうな入門記事にもリンクしておきます
https://qiita.com/41semicolon/items/0d2f2509d4ac1558badb

viteとphaserのセットアップはたしか以下記事を参考にしました
https://dev.classmethod.jp/articles/phaser-js-typescript-vite/

# ソース

https://github.com/babu-ch/ballgame/

メインのソースは↓
https://github.com/babu-ch/ballgame/blob/main/src/scenes/MyScene.ts

phaserに詳しくないので書き方が変とかあるかもです
ちょっと判定が増えるだけでコードが汚くなってくるのできれいな書き方を知りたい

あとボール同士がくっついた時ねっとり移動するんですが、それがなぜなのかわかってません
でも気に入っています

# SPにも対応してみました

対象のPR
https://github.com/babu-ch/ballgame/pull/1

とりあえずで対応したのでちょっと雑です（ボールサイズがPC版と同じとことか）

![スクリーンショット 2023-10-24 20.49.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329559/d66b85a2-3625-6106-90f9-e14cec770aee.png)


# おわり

この玉の色の種類はチャットGPTに出してもらいました
可愛い色合いですね

![スクリーンショット 2023-10-22 15.41.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329559/1c1aba48-e8a3-ebea-24ad-47082cdc5588.png)


# パワーアップさせる記事を追加しました
https://qiita.com/babu-ch/items/b5ac12d59b0be19d5e61
iOSのSafariで2つめのvideo要素の幅、高さが逆転する現象

iOSのSafariで2つめのvideo要素の幅、高さが逆転する現象が起こったのでログとして残します。

PCの場合は発生しないのですが、iOSだと発生しました。（iOS: 16.7.1）
MediaStreamを2つ使うケースは少ないと思いますが、今回は通話しながらWebカメラで高画質の写真を撮るケースで発生しました。

## DEMO

https://matometaru.github.io/my-camera-app/

|1つめ  |2つめ  |
|---|---|
|![IMG_0126.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510204/6e31320d-b5c2-8d2e-e075-87909e73072a.jpeg)  |![IMG_0127.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510204/523c47b4-0821-0723-313d-58549f1fedef.jpeg)  |


## 対策1

最初からサイズを指定する。
ただし、カメラのサイズ(width,height)はMediaStream取得後にしか分からないので最初から指定することが難しいです。

## 対策2

video要素の表示がおかしくはなっていますが、元の映像データまでがおかしくなっているわけではありません。

video要素からcanvas要素に表示し、その際、width,heightを反転すれば正しい縦横比で表示することができます。


## 追記

iOSのブラウザではWebRT関連の不具合がまだまだ多いので、実装する際はご注意を。

https://bugs.webkit.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&field0-0-0=product&field0-0-1=component&field0-0-2=alias&field0-0-3=short_desc&field0-0-4=status_whiteboard&field0-0-5=content&no_redirect=1&order=changeddate%20DESC%2Cbug_status%20DESC%2Cpriority%2Cassigned_to%2Cbug_id&query_format=advanced&type0-0-0=substring&type0-0-1=substring&type0-0-2=substring&type0-0-3=substring&type0-0-4=substring&type0-0-5=matches&value0-0-0=getUserMedia&value0-0-1=getUserMedia&value0-0-2=getUserMedia&value0-0-3=getUserMedia&value0-0-4=getUserMedia&value0-0-5=%22getUserMedia%22
JavaScript基礎学習③繰返し処理＆要素の追加


学習の備忘録（JavaScript）

- 参考書籍：確かな力が身につくJavaScript「超」入門
- 参考サイト：[ForEach文で配列のループを行う処理](https://and-engineer.com/articles/YhM_2BMAAKtubeB-)

 ## 繰り返し処理について

繰り返し処理とは、同じような処理を何度も実行するもの。


- ### while
※条件式がtrueである限り延々と処理実行されてしまうので注意！
```
while(条件式){
　//条件式がtrueの際に実行される処理
}
```

- ### for ~ of
配列の項目数分「～」内の処理を実行する。
配列内の値を順に変数名に代入する。
```
for (let 変数名　of 対象となる配列) {
   //処理内容
}
```

- ### for ~ in
オブジェクトに登録されているプロパティの数だけ繰り返し処理。
```
for (let 変数名 in オブジェクト名) {
　//処理内容
}
```

- ### forEach
コールバック関数に処理したい内容を記述することで配列要素一つ一つに対して繰り返し処理。
※forEach文は同じ処理を各要素全てに繰り返しおこなうので、途中で中断することができない！
どうしても処理の途中で中断させたい場合は通常のfor文を利用すること。
```
let array1 = ["東京", "神奈川", "千葉", "埼玉"];
array1.forEach(function(value) {
console.log(value);
});
```
・応用編
コールバック関数には、value、index、arrayの3種類の引数が用意されている。
それぞれ配列の要素に対して値、インデックス番号、配列の元データが格納される。
下記例文ではforEach文のコールバック関数において、要素の値を2倍したものを元の配列に戻して上書きしている。処理結果は[2, 4, 6, 8, 10]となる。
```
let numList = [1, 2, 3, 4, 5];
numList.forEach(function(value, index, array) {
array[index] = value * 2;
});
console.log(numList);
```
学生認証するだけでコードのAI補完を無料で使えるらしい

# AI便利すぎてもうこいつ1人でいいんじゃない?
私普段は[Tabnine](https://www.tabnine.com/)というVScodeの拡張機能を利用してるんですが、いやほんとに素晴らしすぎますね。AI様様ですわ。

firebaseSDKとかをインストールしたときに必要なインポートも勝手に補完してくれるんでヒジョーに重宝しております。

[AIコード補完使うと見つけにくいバグが増える](https://wired.jp/article/fast-forward-power-danger-ai-generated-code/)という話は一旦脇に置いて、とりあえずマトモに動くものを作るのにとてもありがたいんですが、Tabnineの唯一気に入らないところは**Pro版にしないとチーム開発で使えない**ことです。

# Github Copilot、実は学生なら無料で使えるよ
そこで、みんな大好きGithubが提供する元祖AIコード補完の[Github Copilot](https://github.com/features/copilot)が、知らぬ間に我々にとっては大変ありがたい学生認証機能を搭載してくれています。
対象となるのは
- 13際以上の学生
- Github個人アカウントがあること
- 学校が発行した検証可能なメールアドレスがあること
だそうなので、まあ一般的な大学生なら申請できます。詳しい条件については[こちら](https://docs.github.com/ja/education/explore-the-benefits-of-teaching-and-learning-with-github-education/github-global-campus-for-students/apply-to-github-global-campus-as-a-student)から

# Github global campusの申請
Githubでの学生が受けられる特典については、[Github Education](https://education.github.com/globalcampus/student)のダッシュボードで一元的に管理されているようです。申請もここからやります。

申請することで受けられる機能としては
- [GitHub Pro](https://docs.github.com/ja/get-started/learning-about-github/githubs-plans)：主にGithubの拡張機能が使えるようになる
    - [Github Actions](https://github.co.jp/features/actions):デプロイやパッケージの公開などの自動化ツールの使用できる量が増える
    - [Github codespase](https://github.co.jp/features/codespaces):クライドベース統合開発環境(IDE)のコア使用可能時間が60→180時間に増える、ストレージも増える
    - [GitHub Packages](https://github.co.jp/features/packages):オンラインパッケージ管理ツールが2Gまで使用できる
    - プライベートリポジトリでプルリクエストレビュー担当者を複数設定したり、ブランチを保護したりできるようになる
    - [**Github Copilot**](https://github.com/features/copilot):AIコード補完ツールがタダで使える
- [GitHub Student Developer Pack](https://education.github.com/pack)：学習教材とそれに付随する便利キット、JetBrainsのエディターの他に無料ドメインやSSLなんかもついてくるらしい？
- [GitHub Campus Expert](https://education.github.com/experts)：学生が相互に学習するためのコミュニティリーダーに応募できるようになるらしい。公式サイトではまだメーリス登録なのでよくわからん

正味上の方はあまりわかっていないので、私的にはCopilotが使えるようになるのがありがたい。

# 申請のやり方
1. [Github Education](https://education.github.com/globalcampus/student)ダッシュボードから特典の取得をクリック
1. [教育機関の状態を選択する] で、 [学生] を選びます
1. 学校で利用するメールアドレスを選択あるいは追加してください
1. 学校名を入力
1. GitHubの利用計画を記述してください。そんなに長いこと書かなくても、for study and researchとかで通ります
1. [続行] をクリックすると、学歴の証明をアップロードするように求められますので、学生証を写真に撮ってアップロードしましょう
1. Proof typeで証明書の種類を選択
1. アプリケーションの詳細を確認し、 [アプリケーションの処理] をクリックします。

申請から承認されるまで**約5日**ほどかかるらしいので気長に待ちましょう。
承認されるとGithubの自分のプロフィールのアイコンにProと付いて、メールも送られてきます。

# 最後に
Github global campusの全機能は全然網羅できてないので、これからいじって使えるものを探していこうと思います。
MacOSの作業効率を高めたい時のVSCodeショートカットキーをご紹介

:::note
本記事では、MacOSでVSCodeを使用している方に向けて、キーボードによるショートカットキーのご紹介をさせていただきます。
:::

# はじめに
こんにちは、株式会社KakuKaku　アソシエイトエンジニアのhamanoです。
今回は、普段私が使用しているエディタであるVSCodeのショートカットキーについてご紹介します。

# 本記事の作成のきっかけ
私は、普段VSCodeを画面上でポチポチしてしまう癖があり、マウスとキーボードで手の行き来が発生してしまいます。
そうしていると、以下のような課題が生じました。
- 「作業がスムーズにできていない」
- 「集中力を欠いてしまっている」

上記を解消するために、なるべくキーボードで作業をしてしまいたいという思いがありました。
そして、ショートカットキーを調べたところ、自分に対して有効な対策だったと感じることができたので、本記事の作成に至りました！

本記事は、私個人の備忘録でもありますが、皆様の参考になれば幸いです！

# 基本となるキー
| ⌘ | command |
| --- | --- |
| ⌥ | option |
| ⇧ | shift |
| ⌃ | control |

# 全体的に作用
| ⇧⌘P, F1 | コマンドパレットを表示 |
| --- | --- |
| ⌘P | クイックオープン、ファイル検索 |
| ⇧⌘N | 新しいウィンドウ |
| ⌘W | ウィンドウを閉じる |
| ⌘, | ユーザー設定 |
| ⌘K ⌘S | キーボードショートカット |

私は、クイックオープンとファイル検索である「⌘P」をよく利用しています。
これは、後に紹介する「⌘B」で行った後の動作と非常に相性がいいと感じています。

# 画面の表示・非表示
| ⌘+ / ⌘- | ズームイン / ズームアウト |
| --- | --- |
| ⌘B | サイドバーの可視性を切り替える |
| ⇧⌘E | エクスプローラーの表示 / フォーカスの切り替え |
| ⇧⌘F | 検索を表示 |
| ⌃⇧G | ソース管理を表示 |
| ⇧⌘D | デバッグを表示 |
| ⇧⌘X | 拡張機能を表示する |
| ⇧⌘H | ファイルで置き換える |
| ⇧⌘J | 検索の詳細を切り替える |
| ⇧⌘U | 出力パネルを表示 |
| ⌘K Z | Zenモード（終了するにはEsc） |

ズームインの「⌘+」は、キーボードによっては、「⇧⌘;」という入力になることがあります。
サイドバーの可視性を切り替える「⌘B」という部分で、ファイルの一覧を隠しておくことが可能です。開きたいファイルの検索を、先の紹介にあった「⌘P」とすることで、作業スペースを広めに確保することを維持しやすいです。

# コーディングに使用
| ⌘C | コピー |
| --- | --- |
| ⌘X | 切り取り |
| ⌥↓ / ⌥↑ | カーソルの位置の行を上下に移動 |
| ⇧⌥↓ / ⇧⌥↑ | カーソルの位置の行を下 / 上にコピー |
| ⇧⌘K | カーソルの位置の行を削除 |
| ⌘Enter / ⇧⌘ Enter | カーソルの位置の行 下 / 上 に行を挿入 |
| ⌘] / ⌘[ | 行頭にインデント / アウトデント |
| Home / End | 行頭 / 行末に移動 |
| ⌘↑ / ⌘↓ | ファイルの最初 / 最後に移動 |
| ⌥⌘[ / ⌥⌘] | 折りたたみ / 展開領域 |
| ⌘/ | ラインコメント切り替える |
| ⇧⌥A | ブロックコメントを切り替える |

行頭にインデント「⌘]」というショートカットは、わざわざコードの頭にカーソルを運んでTabキーの必要がなくなったので、かなり頼もしいです。
また、折りたたみ「⌥⌘[」と記載しているショートカットは、長くなった関数を折りたたむことが可能です。そして、折りたたんだコードは、コピーする時、削除する時に選択する部分が減らせるので、かなり編集が楽になりました。

# ファイルを管理
| ⌘N | 新しいファイル |
| --- | --- |
| ⌘O | 現在のウィンドウで、開くファイルを選択する |
| ⌘S | 保存する |
| ⇧⌘S | 名前を付けて保存 |
| ⌥⌘S | すべてを保存する |
| ⌘W | 閉じる |
| ⌘K ⌘W | すべて閉じる |
| ⇧⌘T | 閉じたエディターを再度開く |
| ⌘K P | アクティブなファイルのコピーパス |
| ⌘K R | Finderでアクティブなファイルを表示する |
| ⌘K O | 新しいウィンドウ / インスタンスでアクティブなファイルを表示する |

開いていたファイルを誤って閉じたときに、再度開くという手間が苦手なかた(私がそうでした)は、閉じたエディターを再度開く「⇧⌘T」とすると、閉じたものが再度開かれるので、おすすめです。
また、VSCode上で管理しているファイルをFinderで開きたい場合に「⌘K→R」と入力することで、開くことも可能です。

:::note warn
ご紹介させていただいたショートカットキーは、使用しているキーボードによっては、入力が求められるキーが異なる可能性があります。
:::

VSCodeの公式Documentでは、[チートシート](https://code.visualstudio.com/docs/getstarted/tips-and-tricks#_keyboard-reference-sheets)も公開されています。

# 最後に
最後まで読んでいただきありがとうございました。
私達、株式会社Kakukakuでは一緒に開発を行ってくれるスタッフ、パートナーを募集しております。
https://kakukaku.app/

# 本記事作成時の参考
https://code.visualstudio.com/docs/getstarted/tips-and-tricks

https://logsuke.com/app/vscode/vscode-shortcut-mac
【Linux】Non-Pass設定

# やりたいこと
Batchサーバ（SSH接続元）からWebサーバ（SSH接続先）へのノンパス設定を行いたいです

# SSH接続元に鍵を作成
Batchサーバ（SSH接続元）で鍵を作成します。

```
ls -al ~/.ssh
```
鍵が既にあるかの確認。
`id_rsa`とか`id_rsa.pub`があったら、その中身を使い回せばOK。

```
ssh-keygen -t rsa
```
なかった場合は鍵を新しく作る
パスフレーズの入力を求められるが、何も入力せずEnterキーを押せば良い。
```:~/.ssh/id_rsa.pub
ssh-rsa AAAA............BBBB user@hostname
```
みたいな鍵が作られる。

# 作った鍵をSSH接続先に置く
SSH接続元で作った鍵をSSH接続先の`~/.ssh/authorized_keys`に追加。
```:~/.ssh/authorized_keys
ssh-rsa [KEY]
```

`.ssh`がまだ有効になっていない場合は`/etc/ssh/sshd_config`編集して有効にする。


# 権限の設定
ファイルの所有者のみ読み書きできるよう設定する。

```
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
```

以上
ubuntu22.04環境でmarkdownをpdfに変換する（pandocを使う場合）際の備忘メモ

ubuntu22.04環境でmarkdownをpdfに変換する（pandocを使う場合）際の備忘メモ

```
sudo apt-get install pandoc
sudo apt-get install texlive-latex-base
sudo apt-get install texlive-luatex texlive-lang-cjk lmodern texlive-xetex

pandoc input.md -o output.pdf -V documentclass=ltjarticle
```

# 参考
https://mickey-happygolucky.hatenablog.com/entry/2016/03/01/234228
ディレクトリ

# 主なディレクトリ


# コマンド一覧
<ul>
<li>cat [ファイル名]　テキストファイルの内容表示</li>
<li>less [ ファイル名 ]　テキストファイルの内容を1ページずつ表示</li>
➡キー操作<br>
「↓」 　　　　　⼀⾏下にスクロールする<br>
「↑」 　　　　　⼀⾏上にスクロールする<br>
「Space」 　　　１画⾯下⽅向に進める<br>
「 Ctrl」＋ 「b」 １画⾯上⽅向に進める<br>
「q」 　　　　　 ページャーモードを終了する<br>
<br>
<li>cd [オプション] [移動先ディレクトリ]　　　カレントディレクトリの移動</li>　
</ul>