OmniAICreator/Qiita-1.07M huggingface dataset:
読書メーターの資料整理

あちこちのサービスで、検索でデータが出てこなくなった。　

検索に時間がかかりすぎるため、なんらかの打ち切りをしているのか、　
検索対象自体を最初から限定しているのかよく分かっていない。　

防衛策としては、自分の大事な記事は、リンクを貼りまくることで、　
少なくとも三回クリックすれば、必要な情報に辿り着くようにすることである。　

残念ながら、 Researchmapは、第二版でURLを変更し、古いURLと新しいURLの変換、一覧などの機能を提供していない。　

Qiita記事のResearchmap URLは順次改訂中である。ごめんなさい。あと１０年かかると思います。　

読書メーターが、検索しても出てこなくなった。　

そこで、読書メーターの各種資料を、順次整理して、最終的にはGithubに掲載するが、　
ひとまずResearchmapとQiitaで整理してみる。　

<この項は書きかけです。順次追記します。>

# 分類 

読書メーターの分類は「本棚」という機能で提供している。　

https://bookmeter.com/users/121023/bookcases

本棚が3831あり、整理が必要である分類しなおしてみる

## 文学

### 短歌 

## 科学
### 数学 

### 物理学 

### 情報　

### 経済学 

## 著者 登録者数順
佐伯裕子


https://bookmeter.com/users/121023/bookcases/11094347?sort=book_count&order=desc

赤川次郎 


https://bookmeter.com/users/121023/bookcases/11094350?sort=book_count&order=desc


西村京太郎　

https://bookmeter.com/users/121023/bookcases/11094351?sort=book_count&order=desc


かこさとし 


https://bookmeter.com/users/121023/bookcases/11094355?sort=book_count&order=desc

山村美紗

https://bookmeter.com/users/121023/bookcases/11094367?sort=book_count&order=desc

唯川恵

https://bookmeter.com/users/121023/bookcases/11094369?sort=book_count&order=desc

小池真理子

https://bookmeter.com/users/121023/bookcases/11094371?sort=book_count&order=desc

栗本薫・中島梓

https://bookmeter.com/users/121023/bookcases/11094377?sort=book_count&order=desc

栗本薫が、あとがきで、自分たちが本を出せるのは、赤川次郎、西村京太郎が売れる本を書いてくれるので、他の作家も本を出せると書かれていた。そのため、赤川次郎、西村京太郎への感謝の意味を込めて全部読みを始めた。自分の読書傾向には、栗本薫の影響が大きい。


東野圭吾

https://bookmeter.com/users/121023/bookcases/11094378?sort=book_count&order=desc

アガサクリスティ

https://bookmeter.com/users/121023/bookcases/11094379?sort=book_count&order=desc

上橋菜穂子

https://bookmeter.com/users/121023/bookcases/11094411?sort=book_count&order=desc

中家菜津子

https://bookmeter.com/users/121023/bookcases/11094406?sort=book_count&order=desc

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20230314

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
ユーザのプロフィールページ③

<h1>プロフィール更新のためのフォーム</h1>
app/views/profiles/edit.html.haml
エラーメッセージ

    .container
      %ul
        - @profile.errors.full_messages.each do |message|
          %li= message


app/views/articles/_form.html.haml
ここからコピペしてきた
    
      %ul
        - article.errors.full_messages.each do |message|
          %li= message

app/controllers/profiles_controller.rb

      def edit
        @profile = current_user.build_profile
      end
からの箱（インスタンス）を作る。

app/views/profiles/edit.html.haml

    = form_with(model: @profile, url: profile_path, method: 'put', local: true) do |f|
ラウツのPOST

    %div
      = f.label :nickname, 'ハンドルネーム'
    %div
      = f.text_field :nickname, class: 'text'
    %div
      = f.label :introduction, '自己紹介'
    %div
      = f.text_area :introduction

次に性別を選択を作成

そもそも、マイグレーションファイルにて、性別部分をinteger:整数にしていました。
それはなぜなのか？

文字列を入れてしまうと、はじめに、男・女で定義していたが、途中から男性に変えたい！となると、パターンが増えてしまう。

しかし、０・１にしておけば、後から変更しても表示を男性に変えるだけで良い👍

app/models/profile.rb

    enum gender: { male: 0, female: 1, other: 2 }

app/views/profiles/edit.html.haml

    %div
      = f.label :gender, '性別'
    %div
      = f.select :gender,['mele', 'female', 'other']
配列にするのが、一番簡単
しかし、モデルで何か追加された時など変更が起きた時に、ここを変えるを忘れてしまう可能性が出てきしまう。

    ＄rails c
立ち上げ

    ＄Profile
    ＄Profile.genders
    {"male"=>0, "female"=>1, "other"=>2}
enumを定義しているので、ハッシュが手に入る

    $Profile.genders.keys
     ["male", "female", "other"]
というハッシュも手に入る

      = f.select :gender, Profile.genders.keys, {}, { class: 'text' }
よって、こうしても、同じことをすることができる。

また、classは第四引数に、定義しなければならない！！

app/assets/stylesheets/form.scss
また、input部分に、selectを追加👍

次に生年月日
app/views/profiles/edit.html.haml

    %div
      = f.label :birthday, '生年月日'
    %div
      = f.date_field :birthday, class:'text'

通知を受け取るボタンと保存ボタン

    %div
      = f.label :subscribed, '通知を受け取る'
      = f.check_box :subscribed

    = f.submit '保存', class: 'btn-primary'

これで、フォームの完成！
プログラミングより大切なテストの色々！

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回はテストの色々について更に詳しく調べてみましょう！
![インスタスライド_202303022.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/5f7e087e-57e6-34a9-81f5-a9c6e6de14cd.gif)


# テストとは
-　単体テスト
-　UNITテスト
-　結合テスト
-　システムテスト
等があるが、呼び方は色々ある

# 単体テスト
プログラム単体で、内部的なチェックを行う。

例えば、二乗を行うプログラムでは、2を入力すると正しく４が出力される事などをテストする

# システムテスト
１．利用ユーザ参加型で全体的な仕様を含め確認＋テストを行う

主旨は、本番直前でのユーザとの認識違いを防ぎ、実運用ベースをイメージさせる

２．タイムシーケンスでのテスト

時系列で処理が行われる上で、実際にシステム時間等を変更しながらテストを行う。

例えば、毎月ポイントが加算され、そのポイント等に有効期限がある場合のテスト。

月末処理がある場合に、年越しテストや２月の月末テスト、うるう年テスト等。

３．イレギュラーテスト

通常運用では、発生する可能性が低いケースについてテストを行う

・ＤＢベースが落ちた場合のプログラムの動作確認（エラーページが表示される事）

・ディスクが一杯になった場合のアラートの確認

・バッチ処理プログラムが異常終了時のリカバリーテスト

４．負荷テスト

要件として決めたアクセス負荷に耐えれるかについてテストを行う。

見落としがちなテストですがリリース後に負荷に耐えられずにサービスダウンさせないためにはマストなテストです。

# まとめ
ーテストも色々なテストがあり、呼び方色々

ー大きく単体テスト、システムテストがある

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
langchainjs と deno を使ってtypescriptで ChatGPT APIを利用する


langchainにはjs版（typescript版）があります
これとdenoで実行できる環境を作ってみます

https://github.com/hwchase17/langchainjs

denoはtypescriptのまま実行できるので、nodeと違ってtypescript→javascriptにするなどの余計な作業がいらず、環境が素早く構築できます


# deno インストール

https://deno-ja.vercel.app/manual@v1.9.1/getting_started/installation

# 環境構築

適当な場所にディレクトリ作る
```
mkdir test-langchain
cd test-langchain
```

# コードを書く

denoにはnpmなどのパッケージマネージャがありません
かわりに importの際に npm: とつけると、実行前にパッケージを取得しキャッシュしてくれます

またVSCodeを使ってる場合は `deno` という拡張を入れて初期設定しとくと、書き心地がぐっとよくなります

では早速コード書きます
`index.ts`を作って以下を書きましょう


```index.ts
import { OpenAIChat } from 'npm:langchain/llms';
import { PromptTemplate } from 'npm:langchain/prompts';

const config = {
  apiKey: "XXXXXXXXXXXXXXXXXXXXXX",
};


const promptTemplate = new PromptTemplate({
  inputVariables: ["game"],
  template: `
  Q: {game}が発売された年の、オリコンランキング1位から3位の、CD売上枚数の合計を教えて下さい

  A: 一歩一歩、考えていきましょう。
  `,
});

const prompt = await promptTemplate.format({ game: "ドラクエ７" })

const llm = new OpenAIChat({
  temperature: 0,
  prefixMessages: [{
    role: "system",
    content: "あなたは聡明なお嬢様です。丁寧な口調で回答してください。語尾は「ですわ」です",
  }],
  openAIApiKey: config.apiKey,  
});

const result = await llm.call(prompt);

console.log(prompt);
console.log("=========");
console.log(result);
```

API KeyはOpenAIで自分で取得してください

# denoで実行

denoで単ファイルを実行する場合は
```
$ deno run index.ts
```

と書きます、、が今回はこれだと実行できません

denoは安全のために、ネットワークやファイル編集が必要な場合は、オプションを指定していないと出来ないようになっています

今回はOpenAI のAPIを叩くため、その権限をオプションで指定する必要があります

```
$ deno run --allow-read --allow-net index.ts

  Q: ドラクエ７が発売された年の、オリコンランキング1位から3位の、CD売上枚数の合計を教えて下さい

  A: 一歩一歩、考えていきましょう。
  
=========
まず、ドラクエ７が発売された年を確認しますわ。それは2000年ですわね。
次に、オリコンランキング1位から3位のCD売上枚数を調べますわ。
2000年のオリコンランキング1位から3位のCD売上枚数は以下の通りですわ。
1位：「Can You Keep A Secret?」宇多田ヒカル　約201万枚
2位：「LOVEppears」浜崎あゆみ　約195万枚
3位：「Duty」浜崎あゆみ　約181万枚
これらのCD売上枚数を合計すると、約577万枚ですわ。
以上、回答でしたわ。
```

できました

たった１ファイル書くだけですぐに実行できるのが、denoのとても良いところです

本家langchainの資料はいっぱいあるんですが、langchainjsの資料が少ないので書いてみました

さらなるドキュメントはこちら
https://hwchase17.github.io/langchainjs/docs/overview/
【個人開発 #3】初学者がrailsでTODOアプリを作ってみる～詳細設計～

# はじめに
https://qiita.com/void_takazu/items/a775fa768567787541b9

こちらの続きですっ

# 全体の詳細設計

### ユーザー新規登録とログイン機能の詳細設計
・ユーザー新規登録画面を作成します。必要な情報として、ユーザー名、メールアドレス、パスワードが必要です。
・パスワードは、ハッシュ化してデータベースに格納します。
・ログイン画面を作成します。ログインに必要な情報として、メールアドレスとパスワードが必要です。
・ログインに成功した場合は、セッションを開始し、TODOアプリにアクセスできるようにします。
・ログインに失敗した場合は、エラーメッセージを表示します。

### TODOアイテムの作成、編集、削除の詳細設計
・TODOアイテム作成画面を作成します。必要な情報として、TODOアイテムのタイトル、締め切り日、進捗状況が必要です。
・TODOアイテムの編集、削除機能も実装します。
・TODOアイテムをデータベースに格納するために、TODOアイテムテーブルを作成し、必要なカラムを定義します。

### TODOアイテムの一覧表示画面の詳細設計
・TODOアイテムの一覧表示画面を作成します。カード形式で表示し、タイトル、締め切り日、進捗状況を表示する必要があります。
・カードの並び順は、締め切り日が近いものから順に表示する必要があります。
・カードをクリックした場合は、TODOアイテムの詳細画面に遷移します。

### TODOアイテムの詳細画面の詳細設計
・TODOアイテムの詳細画面を作成します。サブ画面として表示し、タイトル、締め切り日、進捗状況、詳細説明などの情報を表示する必要があります。
・TODOアイテムの編集、削除機能も実装します。

### カレンダー画面の詳細設計
・カレンダー画面を作成します。カレンダー上にTODOアイテムの締め切り日を表示します。
・カレンダー上でTODOアイテムをクリックした場合は、TODOアイテムの詳細画面に遷移します。


# 実装の注意点
・データベースには、ユーザーテーブルとTODOアイテムテーブルが必要です。ユーザーテーブルには、ユーザー名、メールアドレス、パスワードなどの情報を格納します。TODOアイテムテーブルには、TODOアイテムのタイトル、締め切り日、進捗状況などの情報を格納します。

・パスワードは、ハッシュ化して格納する必要があります。また、ログイン時には、入力されたパスワードをハッシュ化してデータベース内のハッシュ化されたパスワードと比較する必要があります。

・ログイン後には、セッションを開始する必要があります。セッションを使用することで、ユーザー情報を保持し、ログイン状態を維持することができます。

・TODOアイテムの作成、編集、削除機能では、フォームやボタンなどのUI要素の実装が必要です。また、入力値のバリデーションも必要です。

・一覧表示画面では、TODOアイテムをカード形式で表示する必要があります。カードのデザインやレイアウト、並び順の実装が必要です。

・詳細画面では、TODOアイテムの詳細情報を表示する必要があります。また、編集、削除ボタンの実装も必要です。

・カレンダー画面では、カレンダーのUI要素の実装が必要です。また、TODOアイテムの締め切り日の取得方法や、カレンダー上でのTODOアイテムの表示方法などが課題になります。



# おわりに
個別の詳細設計をもう少しかみ砕いて書いて、実装してみたいと思います。
【個人開発 #2】初学者がrailsでTODOアプリを作ってみる～再：基本設計、詳細設計～


# はじめに
個人開発第2弾ですっ

先日色々要件書き出して、基本設計したけど
なんか機能付けすぎて、これ難しくね？ってなりましたｗ

※第1弾はこちら↓
https://qiita.com/void_takazu/items/8e17330da17955ca2906

なので、まずは必要最低限の機能だけのTODOアプリにして
リリースできたら機能追加する方針で行こうと思います。

追加機能する場合に手戻りにならないような設計をしておきたいけど
それを考えるのはとても時間かかりそうなので今回はあまり考えすぎずにいきます…ｗ


# 再度基本設計を検討する
必要最低限にして書き直しました！

### 【システムフロー設計】
トップ画面でユーザー新規登録と、ログインができる。
ユーザーがログインすると、自分のTODOアプリにアクセスできるようになる。
ユーザーは、TODOアイテムを作成、編集、削除できる。
ユーザーは、カレンダー画面でTODOアイテムを確認できる。

### 【UI設計】
シンプルなUIを実装し、直感的に操作ができるようにする。
画面レイアウトは、TODOリストを一覧表示するメイン画面と、TODOアイテムの詳細を表示するサブ画面に分ける。
メイン画面では、TODOリストをカード形式で表示し、それぞれのカードにはタイトル、締め切り日、進捗状況を表示する。
カードの並び順は、締め切り日が近いものから順に表示する。
モバイルデバイスからの利用にも配慮し、レスポンシブデザインを採用する。

### 【データモデル設計】
PostgreSQLを採用する。
「TODOアイテム」テーブルを作成し、タイトル、締め切り日、進捗状況をカラムに持たせる。
「ユーザー」と「TODOアイテム」の関係を1対多の関係にする。
ユーザー情報のパスワードは、ハッシュ化して格納する。

### 【開発環境】
言語: Ruby on Rails、Vue.js
データベース: PostgreSQL
エディタ: Visual Studio Code
デプロイ先: Heroku
バージョン管理: Git、GitHub



# ER図
一旦これでいいかな？
なんかすごい単純だけど…

```:ER図
             ┌───────────────┐
             │     Users     │
             ├───────────────┤
             │ id            │
             │ name          │
             │ email         │
             │ password_hash│
             └───────────────┘
                     │
                     │ 1
                     │
             ┌───────────────┐
             │     Todos     │
             ├───────────────┤
             │ id            │
             │ title         │
             │ due_date      │
             │ progress      │
             │ user_id (FK)  │
             └───────────────┘
```


# 画面遷移図

```
1. start -> トップ画面 -> ユーザー新規登録 -> ユーザー登録完了 -> トップ画面
2. トップ画面 -> ログイン -> ログイン認証 -> ユーザーTODOアプリへのアクセス -> ユーザーTODOアプリ画面
3. ユーザーTODOアプリ画面 -> TODOアイテム作成 -> TODOアイテム登録 -> ユーザーTODOアプリ画面
4. ユーザーTODOアプリ画面 -> TODOアイテム編集 -> TODOアイテム更新 -> ユーザーTODOアプリ画面
5. ユーザーTODOアプリ画面 -> TODOアイテム削除 -> TODOアイテム削除完了 -> ユーザーTODOアプリ画面
6. ユーザーTODOアプリ画面 -> カレンダー画面への遷移 -> カレンダー画面 -> ユーザーTODOアプリ画面

```
Figmaとか使ってモック作りたい


# 開発手順
1. 最初に、ユーザー新規登録とログイン機能を実装します。これによって、ユーザーがTODOアプリにアクセスできるようになります。ログインには、ユーザー情報をデータベースに格納しておく必要があります。

2. ログイン機能が実装されたら、TODOアイテムを作成、編集、削除できるようにします。TODOアイテムをデータベースに格納するために、TODOアイテムテーブルを作成し、必要なカラムを定義します。

3. 作成したTODOアイテムを一覧表示するための画面を実装します。TODOアイテムのタイトル、締め切り日、進捗状況を表示する必要があります。カード形式で表示することで、直感的な操作ができるようにします。

4. TODOアイテムの詳細を表示するための画面を実装します。サブ画面として表示し、詳細な情報を表示するようにします。

5. 最後に、カレンダー画面を実装します。カレンダー画面では、締め切り日が近いTODOアイテムを確認できるようにします。

# おわりに

んーーなんとなく整理されました。
実装しながら随時設計も変更していこうと思います。

続く…(´・ω・｀)
2023/3/14主にITとかセキュリティの記事

Google、Windows版Chromeの望ましくないソフトウェア削除機能を廃止(3/12)
https://www.zaikei.co.jp/article/20230312/713166.html

中国格安ブランド「SHEIN」アプリ、クリップボードから個人情報を窃取＝米マイクロソフト(3/11)
https://www.epochtimes.jp/2023/03/140860.html

分散型SNS「Twetch」を使ってみた。(3/12)
https://note.com/yasuto0425/n/ne7847ee70246

SBT誕生の経緯と課題、インターネットの新たなアイデンティティー層となり得るか(3/13)
https://xtech.nikkei.com/atcl/nxt/column/18/02132/030900011/

「まずはSaaSから」、日清食品HDが目指す変化に強い基幹システムの姿とは(3/13)
https://xtech.nikkei.com/atcl/nxt/column/18/02386/030900005/

時刻トラブルはなぜ起こる、「日付が過去に戻る」「未来からデータが届く」の訳(3/13)
https://xtech.nikkei.com/atcl/nxt/column/18/02381/030900001/

金融業界から見たデータ流通の課題、政府のコミットで「DFF」と「T」の二兎を追う(3/13)
https://xtech.nikkei.com/atcl/nxt/column/18/02299/030900006/

前向きな意図だから強制排除が難しい！？企業の対策問われる「シャドーIT」とは(3/13)
https://xtech.nikkei.com/atcl/nxt/column/18/01679/020700099/

DX人材像が曖昧すぎる日本企業　リスキリングの前にやるべきこと(3/13)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/030300133/

秘密計算（Secure Computing）(3/13)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/030300136/

AIでごみ焼却施設の蒸気を制御　温度安定させ発電効率高める
日立造船(3/13)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600004/030700126/

人守る公共データ　活用ルール整備進むか(3/13)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/030800139/
HTML コンテンツ・モデル

<h1>・コンテンツモデルとは？</h1>
HTMLの要素は使いたいところに使えるわけではなく、このタグの中ではあのタグは使えないというルールがある。このルールのことをコンテンツ・モデルという。

コンテンツ・モデルには大きく7種類ある。

1つ目ー「MetaData-Content」

メタデータに関するタグのこと。基本的にWebページに表示されない。
例)＜meta＞タグ、＜title＞タグなど

2つ目ー「Flow-Content」

ページを作る要素のほとんどがこれに当たる。
例）＜article＞タグ、＜ruby＞タグなど数多い

3つ目ー「Sectioning-Content」

大きくページを分ける時に使うタグのこと。
例）＜article＞タグ、＜aside＞タグ

4つ目ー「Heading-Content」

細かくページを分けるタグのこと。
例）＜h1~h6＞タグ、＜hgroup＞タグ
5つ目ー「Phrasing-Content」

テキストを修飾するタグのこと。
例）＜button＞タグ、＜ruby＞タグ、＜small＞タグ

6つ目ー「Embedded-Content」

外部ファイルやHTML以外の言語で作られたコンテンツを埋め込むタグのこと。
例）＜iframe＞タグ、＜img＞タグ

7つ目ー「Interactive-Content」

何かしら操作することができるタグのこと。
例）＜button＞タグ、＜iframe＞タグ、＜select＞タグ

<h1>・コンテンツ・モデルの調べ方</h1>
コンテンツモデルを調べるのに一番良い方法はHTMLの仕様書を読むことである。

https://html.spec.whatwg.org/multipage/

例えばpタグは「Phrasing-Content」であるので、そこにある要素をこのpタグに入れることができる。

《p》《a要素（Phrasing-Content）》《/p》とすることができる。
私が公式ドキュメントを読むまでの軌跡

今日は公式ドキュメントを読みたいけど、読めない！そんなあなたのために私が公式ドキュメントを読むまでの軌跡を書いていきます。

# 想定読者
　公式ドキュメントを読みたいけど読めない読者

<h1>公式ドキュメントとは？</h1>
　公式ドキュメントとは公式が出しているドキュメントのことです。例えばC#なら開発元のマイクロソフトが出しているドキュメントのことです。公式ドキュメントを読むとどこよりも正確な情報を得ることができます。

<h1>なぜ公式ドキュメントは難しいのか</h1>
　公式ドキュメントは正確だ。と言われても公式ドキュメントを読むのは難しいですよね。なぜ難しいのか？理由は3つあると思っています。
1つ目は英語で書かれているから。大体のドキュメントは海外の方が作ることが多いので英語のドキュメントであることが多いです。母国語ではないだけで心理的ハードルって上がりますよね。
2つ目は正確な情報を提供するための文章で書いているからです。わかりやすい文章ではどうしても正確性を捨てざるを得ません。しかし、公式ドキュメントとなると正確な文章が求められます。この二つはトレードオフの関係です。だから難しいのです。
3つ目はドメイン知識が足りていないためです。ある程度のドメイン知識があること前提に書かれていることが多いです。だから当たり前のように専門用語が使われており難しいのです。

# 公式ドキュメントを完全理解するまでの軌跡
さてここからは本題の私が公式ドキュメントを読むまでの軌跡を書いていきます。

## 始めてたて
　上の方に出てくるわかりやすそうなサイトで解説文を読んでました。流石にそれを見た先輩が「公式ドキュメントを読もう」ってアドバイスをくれました。公式ドキュメントを読んでも英語でちんぷんかんぷんでした。

## 半年後
　電子の海で当たり前のように公式ドキュメントが読まれている現実を見て公式ドキュメントを読む努力を始めました。でも何言っているのかわからない。まず始めたのが以下のルーティーンです。
1. まずは公式ドキュメントを読む。私は英語が苦手なのでGoogle翻訳を活用しています。
2. 読めそうなら知らない単語を調べながら公式ドキュメントを読んでいく。読めなさそうならわかりやすく解説しているブログやサイトを見る。そこで頑張って理解する。最後に公式ドキュメントに戻ってもう一度読む。

これを1週間位続けたら公式ドキュメントを読むハードルが下がってきました。2年目に突入する頃には、ある程度理解している分野であれば公式ドキュメントをいきなり読むことができました。今でもよくわからないときはこの方法を試しています。

# 最後に
　公式ドキュメントは難しいですが、どこよりも正確な情報を得ることができます。あとつよつよエンジニアになるためには避けては通れない道です。是非皆さんも公式ドキュメントを読んでいきましょう
空(何もアクションを指定していない状態)のIAMポリシーを作成する方法

# 概要

CloudFormationテンプレートから空(何もアクションを指定していない状態)のIAMポリシーを作成する方法を調べた時に、[英語の記事](https://stackoverflow.com/questions/62287436/is-it-possible-to-have-a-no-op-iam-policy)しかヒットしなかったので書きました。

# 空のIAMポリシーを作成する方法

アクションを何も指定しないで作成しようとするとエラーになって作成することができませんが、

```
"Action": "<サービス名>:<アクション名>"
```

"Action": "test:test"のように適当な<サービス名>と<アクション名>を指定したら、何も権限が付与されていない空の状態のIAMポリシーを作成できます。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "test:test",
            "Resource": "*"
        }
    ]
}
```

ですが、存在しない<サービス名>と<アクション名>を指定した場合、下記の画像のように「識別されていないサービス」という警告が出てしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599875/5a31443d-8ce2-93c3-c345-6f372106caca.png)

警告を出したくない場合は、下記のように"NotAction"を使うことで警告を出さずに空のIAMポリシーを作成できます。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "NotAction": "*",
            "Resource": "*"
        }
    ]
}
```

下記は"NotAction"を使ったパターンのCloudFormationテンプレートです。

```YAML
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  AccountCustomPolicy:
      Type: AWS::IAM::ManagedPolicy
      Properties:
        ManagedPolicyName: "account-custom-policy" 
        PolicyDocument:  
          Version: "2012-10-17"
          Statement:
            - Effect: Allow
              NotAction:
                - "*"
              Resource:
                - "*"
```
substringが言語によって違うので整理してみる

# 概要
JavaScript, C#を使うことが多く毎回`substring()`で迷っているので整理

## substring
- 文字列から位置を指定して返却する
- substract stringの略なのだろうか

## JavaScript
[String.prototype.substring()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substring)

1. indexStart以上の文字列を返す
    - indexStart番目の要素を含む
    - substring(indexStart)

```javascript:JavaScript
const str = 'abcdefg';
let result = str.substring(2);
console.log(result);
// 'cdefg'
```

2. indexStart以上、indexEnd`未満`の文字列を返す
    - indexStart番目の要素を含む
    - indexEnd番目の要素は含まない
    - substring(indexStart, indexEnd)

```javascript:JavaScript
const str = 'abcdefg';
let result = str.substring(2, 4);
console.log(result);
// 'cd'
```

## C#
[String.Substring メソッド](https://learn.microsoft.com/ja-jp/dotnet/api/system.string.substring?view=net-7.0)

1. indexStart以上の文字列を返す
    - Substring(indexStart)

```c#:C#
string str = "abcdefg";
var result = str.Substring(2);
Console.WriteLine(result);
// 'cdefg'
```

2. indexStartから、indexLengthの長さの文字列を返す
    - Substring(indexStart, indexLength)

```c#:C#
string str = "abcdefg";
var result = str.Substring(2, 4);
Console.WriteLine(result);
// 'cdef'
```
## Python
文字列を配列として扱い文字を抽出

```python:Python
alphabet = 'abcdefg'
result = alphabet[indexStart:indexEnd]
```

1. indexStart以上の文字列を返す

```python:Python
alphabet:str = 'abcdefg'
result:str = alphabet[2:]
print(result)
// 'cdefg'
```

2. indexStart以上、indexEnd`未満`の文字列を返す
    - indexStart番目の要素を含む
    - indexEnd番目の要素は含まない

```python:Python
alphabet:str = 'abcdefg'
result:str = alphabet[2:4]
print(result)
// 'cd'
```

# まとめ
- Python,JavaScriptはindexStart以上、indexEnd未満の文字列
- C#はindexStartからindexLengthの長さの文字列
オンラインゲーム「Rust」のModサーバ 更新方法について(windows / ローカル)

## はじめに
RustのModサーバの更新方法についてまとめました。
サーバ更新後にプラグインが読み込まれない原因についても書き起こしました。

## 構築方法
RustのModサーバ構築方法は、以下のリンクの「Rust Mod鯖構築について」を参考にすると良いです。

https://hqtoo.wordpress.com/2020/07/24/rust-mod鯖構築について/

## 更新手順
① Rustを最新バージョンにする
```winbatch
steamcmd.exe +login anonymous +app_update 258550 validate +quit
```
バッチを作成しておくと良いです。

② oxideを最新バージョンにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1270216/5c88830f-c8c3-cb2f-855a-55f1aecf230b.png)
以下のリンク先にアクセスしてwindows版またはLinux版をダウンロードして、展開してください。


https://umod.org/games/rust


展開後、中にある「RustDedicated_Data」フォルダをコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1270216/2d6b3217-dfce-b32b-7763-60039b079976.png)

steamapps\common\rust_dedicated内の「RustDedicated_Data」フォルダを書き換えて下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1270216/99105e39-fab4-40f6-3f6e-053b74bc2bcd.png)

③ Rustのサーバを立ち上げて、```oxide.version```で最新バージョンであるか確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1270216/e9ceb433-5934-669d-9249-6ba6ad6221d5.png)



## プラグインを読み込まない場合
プラグインがファイル内に存在するのに「No plugins are currently available」と表示される場合、次のことが考えられます。

##### Modサーバを起動するバッチファイル内にRustの更新コマンドが入っている
Rustの更新を再び行ってしまうとoxideデータが消えてしまい、プラグインが読み込まれません。
そのため、再度最新版のoxideファイルを入れる必要があります。


##### バッチファイル内でoxideのディレクトリの指定をしている
以下のコマンドが起動バッチに入っていると、指定した場所に新たなoxideファイルが作成されます。

```winbatch
+oxide.directory "D:\steamcmd\steamapps\common\rust_dedicated\oxide"
```

![スクリーンショット 2023-03-14 000431.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1270216/af5819cd-e936-e185-380e-1806b95259e7.png)

## 参考
https://www.youtube.com/watch?v=5NrE3qb2VRQ


## 最後に
以上がRustのModサーバの更新手順です。
もし更新が上手く行かない場合は、コメント欄でお知らせください。
プロンプト作成の参考にChatGPTのチャットログが3000件以上見れるサイト

「[みんなのAI](https://service.webgoto.net/minna-ai/archive/)」というサービスをリリースしました。期間限定ですがアカウント不要で、誰でも無料でChatGPTに質問できるというサービスです。
![2023-03-14 00 06 49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140146/9a31b804-06db-a72c-d72e-672fa43ed8d0.png)
多くの人に使って頂け、ChatGPTでの質問のチャットログが、3000件以上となりました。これらのチャットログでは、様々な分野の質問にどのようにChatGPTが回答するのかを見ることができます。
![2023-03-14 00 05 31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140146/ded7de46-a791-cb43-531c-39f890cdb23c.png)
またAIの利用に慣れていない方の質問の仕方なども知ることができます。これらの会話の内容がChatGPTに関するプロンプトやサービス作成の参考になればと思います。

## チャットの一例

以下は質問の一例（チャットログへのリンク）です。

- [北海道へ安くいく方法](https://service.webgoto.net/minna-ai/c11455/)

- [小説が書けなくなる行動を教えて](https://service.webgoto.net/minna-ai/c11365/)

- [架空の会社名を生成して。また、その会社の業種や規模などの基本データを創作して。](https://service.webgoto.net/minna-ai/c11490/)

- [次の新作ウルトラマンを予想してください](https://service.webgoto.net/minna-ai/c11455/)

- [パロディウスの裏技教えて](https://service.webgoto.net/minna-ai/archive-11100/)

- [パンはパンでも食べられないパンはパンダ](https://service.webgoto.net/minna-ai/c10944/)
いつでもどこでも開発を


[Visual Studio Code (VSCode)](https://code.visualstudio.com/) の開発の進化がすごい！

### VSCode Web (_vscode.dev_)

[VSCode](https://code.visualstudio.com/) は、Microsoft によって開発され 2015 年にベータ版がリリースされた、オープンソースのコード開発の統合プラットフォームです。

当初は、商用版の Visual Studio 統合開発環境 (IDE) から、コンパイラやビルドツールを除いて、コード開発部分だけに注力したアプリケーションとして公開されたような位置づけでした。その後は、コード整形、文法チェック、テストなど様々な機能のためのプラグインの充実、コンパイラやデバッガを実行するためのターミナルセッションとの統合などにより、完全な統合開発環境として Windows だけでなく macOS, Linux でも動作する、開発者にとっては素晴らしい無料のアプリケーションとなっています。

[2021年10月の vscode.dev の発表](https://code.visualstudio.com/blogs/2021/10/20/vscode-dev) で<cite>ウェブブラウザーでも利用できるようになり[^1]</cite>、iOS/Android などのモバイル OS 環境でもブラウザーを使って開発をすることができるようになっています。

[^1]: 元々、2013年に発表された Visual Studio Online (コードネーム ”Monaco") の活動と Microsoft による GitHub の戦略的な統合がクロスした瞬間ではないでしょうか。

### GitHub Codespaces

当初のウェブ版の [VSCode](https://code.visualstudio.com/) は、GitHub 上の Git リポジトリのコードの閲覧や編集に利用できましたが、[GitHub Codespaces](https://docs.github.com/ja/codespaces/overview) サービスのリリースにより、クラウド上でホストされた仮想マシンの開発環境を使って開発・テストなどの作業が実行できるようになりました。この GitHub Codespaces には、[個人用アカウントに含まれる月間ストレージとコア時間](https://docs.github.com/ja/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts)が含まれているので、限られた時間内では無料で開発ができます。

このクラウド型のサービスでは、ソースコードやワークスペースは仮想マシン環境に配置されるため、個人のローカル環境におく必要はなく、複数のコンピューターを使い分けるシーンでもシームレスに開発を継続することができます。

### VSCode Server - Remote Tunnels

GitHub Codespaces と同じような開発環境を自前で用意できないものかと考えていたところ、2022年7月に [VSCode Server](https://code.visualstudio.com/blogs/2022/07/07/vscode-server) のリモートトンネル機能のベータ版がアナウンスされました。

この機能は、これまでにリリースされたリモート接続による開発とは異なり、vscode.dev とコード開発サーバーの間にセキュアなトンネルを確立する方式のリモート接続による開発となります。

任意の物理環境や仮想環境で VSCode Server サービスを起動し、リモート環境の VSCode (デスクトップアプリ版またはウェブ版) からリモート開発を行うことができるようになります。VSCode Server リモートトンネル機能のアーキテクチャは以下のようなイメージと想定されます。

![vscode-server-arch.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620513/219b2556-2679-a3d6-1eb5-46c095660344.jpeg)
AMD Ryzen 9 7950X3D などの 7000 シリーズの X3D モデルでWindows PCを構成したら性能発揮のためにするといいこと

1. BIOS を AGESA 1.0.0.5c ⇧に更新する ⇒ お使いのMBのwebsiteのサポートから
2. AMD Chipset Driver 5.01.29.2026 ⇧を "AMD 3D V-Cache パフォーマンス・オプティマイザードライバー" に☑を入れて導入する ⇒ お使いのMBまたはAMDのwebsiteのサポートから
    - AMD: https://www.amd.com/ja/support
3. Windows の "設定" の "Game Mode" を有効にする
4. Windows の "設定" の "コア分離" を有効にする(※性能を優先する場合にコア分離が何かある程度理解した上で自己責任で無効で使う事は可能)
5. Windows ストアアプリの "Xbox Game Bar" の最新版を導入する
6. 管理者権限で `cmd.exe /c start /wait Rundll32.exe advapi32.dll,ProcessIdleTasks` を実行し、15分程度、コマンドの完了を待つ
    -※実行中は cmd を実行するウィンドウをアクティブにしておいた方がよいかも？
7. OC的な最適化を試みる場合は UEFI(BIOS) で PBO や EXPO あるいは MB によっては用意されている場合もある他のチューニング機能を設定する

# 参考

- 【後編】AMD Ryzen™ 9 7950X3Dと7900X3Dを使う人必見！必要な設定方法を解説！設定別の性能も検証したぞ！それに加え、バックグラウンド処理など ― gradeon
    - https://www.youtube.com/watch?v=4psNCquIgVk
- 新最速CPU爆誕！AMD Ryzen 9 7950X最速検証!! Core i9-12900Kといきなり比較!!! 7900X/7700X/7600Xの性能も全部見せちゃう！ ― PAD : PC Watch & AKIBA PC Hotline! plus DVPR
    - https://www.youtube.com/watch?v=oabYM8NpmHo&t=4s
- Making the most of your Ryzen 9 7950X3D on an ROG motherboard ― ROG Global
    - https://www.youtube.com/watch?v=rM2tOU5bM0s
Amazon ECSのタスク定義のリビジョンが削除できるようになった

# はじめに
最近のAWS UpdateでAmazon ECSの利用していないタスク定義のリビジョンを削除できるようになりました！

https://aws.amazon.com/jp/about-aws/whats-new/2023/02/amazon-ecs-deletion-inactive-task-definition-revisions/

## どういうことか
今まではECSタスク定義においてリビジョンの登録解除しかできませんでしたが、リビジョンの削除が行えるようになりました。

タスク定義内の特定リビジョンを選択すると「登録解除」という項目があります。
![スクリーンショット 2023-03-09 153535.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/f3a1338d-cfdb-e9e1-dde2-6f5d0c045f46.png)

これを行うことにより、見かけ上は削除されたように見えます。
![スクリーンショット 2023-03-09 153653.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/d74dc0d2-9d29-05ec-0301-1c3a90b00f89.png)

しかし、フィルタリングをなくすと「INACTIVE」状態で残っています。
![スクリーンショット 2023-03-09 153807.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/66f33417-7a46-3ee5-13db-1796cf0dee92.png)

このように、今まではタスク定義のリビジョンを「INACTIVE」状態にすることしかできませんでした。
しかし今回のUpdateにより、削除が行えるようになりINACTIVE状態のリビジョンのゴミ掃除を行えるようになりました。
# 試す
実際にリビジョンを削除してみます。
ステータスがINACTIVE状態のリビジョンを選択し、削除を行います。
![スクリーンショット 2023-03-09 155358.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/eb4dcb2c-6d97-830e-cac3-5eaaa4c183dd.png)

フィルタリングを「削除が進行中」に合わせるとステータスがDELETE_IN_PROGRESSとなっています。
![スクリーンショット 2023-03-09 160034.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/f4583939-21da-dab2-5509-37f6ccffaf2f.png)

数分でリビジョンが削除されました！
リビジョンが存在しないタスク定義はリストに表示されないようです。
![スクリーンショット 2023-03-09 163134.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/325441f4-69c5-b789-72b9-9d3ad7bc6ac5.png)



# まとめ
不要なタスク定義のリビジョンを削除できるようになりました。
これにより、いままで残っていた不要なタスク定義をリストから削除できるようになりました。
タスク定義は料金がかかるリソースではないのであまり気にならないかと思いますが、これを機にに不要なタスク定義を削除したいと思います。
8GB メモリの x86_64 で LLVM/Clang のビルドに GCC で失敗。 Clang で成功した。

環境:
* Ubuntu 22.04.2 LTS
* x86_64
* メモリ 8GB 

以下のパッケージは apt で導入したもの。
* GCC 11.3.0
* Clang 15.0.6

## GCC で失敗したよ

@k0kubun, [LLVM/Clang 14をビルドする](https://qiita.com/k0kubun/items/4c29cf9cc423448ea59a), Qiita を参考に GCC で LLVM/Clang をビルドした結果、リンカがメモリを食いつぶして失敗する。
top コマンドで観察する限りリンカは実メモリ 6GB 以上の大きさにまで膨れる。

で、今どき 8GB メモリじゃビルドできないパッケージもあるんだろうなぁ、と Twitter で何気なくつぶやいたところ、親切にも 8GB でもビルドできるとの知らせを @omniroid_dev さんより受けた。

## Clang で成功したよ

そのツイートにあったリンク tinyreminder, [Raspberry PiでのLLVMツールチェインのビルド](https://zenn.dev/tinyreminder/articles/c3bcf508338c14), Zenn を参考にして Clang でビルドしたところ成功した。

その記事は、環境がいくつか異なるため Arm/Raspberry Pi OS にいくつか項目を変更した。

パッケージのインストール:
```
$ sudo apt install cmake ninja-build binutils-dev  \
                   clang-15 libc++-15-dev libc++abi-15-dev lld-15 llvm-15 
```

環境変数の設定:
```
export CC=clang-15
export CXX=clang++-15
export AR=llvm-ar-15
export AS=llvm-as-15
#export LD=ld.mold
export LD=ld.lld-15
export NM=llvm-nm-15
export RANLIB=llvm-ranlib-15
export STRIP=llvm-strip-15
export OBJCOPYY=llvm-objcopy-15
export OBJDUMP=llvm-objdump-15
export READELF=llvm-readelf-15
export C_FLAGS="-O3 -mcpu=native -pipe"
export CXX_FLAGS="-O3 -mcpu=native -pipe"
export LDFLAGS=""
```

ビルド:
```
$ cmake -G Ninja \
      -DCMAKE_BUILD_TYPE=Release \
      -DCMAKE_INSTALL_PREFIX=/usr/local \
      -DLLVM_BINUTILS_INCDIR=/usr/include/ \
      -DBUILD_SHARED_LIBS=OFF \
      -DLLVM_BUILD_LLVM_DYLIB=OFF \
      -DLLVM_CCACHE_BUILD=OFF \
      -DLLVM_ENABLE_LIBCXX=ON \
      -DLLVM_ENABLE_LLD=ON \
      -DLLVM_ENABLE_LTO=Thin \
      -DLLVM_ENABLE_PIC=ON \
      -DLLVM_INSTALL_UTILS=ON \
      -DLLVM_LINK_LLVM_DYLIB=OFF \
      -DLLVM_PARALLEL_COMPILE_JOBS=2 \
      -DLLVM_PARALLEL_LINK_JOBS=1 \
      -DLLVM_ENABLE_PROJECTS="bolt;clang;clang-tools-extra;cross-project-tests;libclc;lld;polly;pstl" \
      -DLLVM_ENABLE_RUNTIMES="compiler-rt;libc;libcxx;libcxxabi;libunwind" \
      -DLLVM_ENABLE_THREADS=ON \
      -DLLVM_TARGET_ARCH=x86_64 \
      -DLLVM_TARGETS_TO_BUILD=X86 \
      ../llvm
```
dependabotの通知をslackのgithub appを使って出そうとしたらうまくいかなかった話

## 要約

1. dependabotによって作られるセキュリティアラートがslackの通知として出たら嬉しい
2. slackではgithub appを使用することで「特定のラベルが付いた」「特定の操作」について通知を受け取ることができる
3. dependabotのセキュリティアラートによって「"dependencies"というラベルの付いた」「プルリクエスト」を作ることができる
4. そのために「"dependencies"というラベルを付けた」「プルリクエスト」のみの通知を受け取るようにした
5. なぜか「dependabotによって作られるラベル」には反応してくれない…
6. 調査しましたが、よくわかりませんでした。いかがでしたか？

## dependabotって何？

https://docs.github.com/ja/code-security/dependabot/working-with-dependabot
- dependabotとは、プロジェクトで使用している依存ライブラリの新しいバージョンについてアラートを出し、自動でプルリクエストを作成してくれるgithubの機能。

導入方法はこちらを参照。gif画像に従ってポチポチ操作してるだけでdependabot.ymlという設定ファイルが作られるので、そこに任意の設定を記載すればヨシ。

https://github.blog/2021-04-29-goodbye-dependabot-preview-hello-dependabot/

## slackのgithub appって何？

- slackにおいてgithubの特定のリポジトリと連携をして各種操作が入った際に通知を受け取ることができる。

https://github.com/integrations/slack#subscribe-to-an-organization-or-a-repository

以下のような操作を通知することができる。

* issues
    * イシューの作成
* pulls
    * プルリクエストの作成
* commits
    * 特定のブランチに対しての新コミット
* releases
* deployments
* workflows
* reviews
* comments
* branches
* +label:"your label"
    * 任意のラベルが付いた操作のみにフィルタリング
* discussions

## やりたいこと

github appを用いて、dependabotによって作られたプルリクエストのみを通知する。

## 行った実験の手順

適当なslackチャンネルと、適当なレポジトリを用意する。

### github appの設定

ワークスペースにおいて「+アプリを追加する」からgithub appを追加する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356208/8f5c18be-ec13-c939-9671-8e2711caf3d3.png)
以下からアカウント連携をする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356208/5c761411-e58b-b475-48f6-66f6e9e139a2.png)

以下のコマンドにより通知を受け取りたいレポジトリを指定し、subscribeを開始する。

```
/github subscribe owner/repo
```
初期状態では、issues, pulls, commits, releases, releasesの5つがsubscribe状態なので、pullのみにしておく。
```
/github unsubscribe owner/repo issues commits releases releases
```

```
/github subscribe owner/repo +label:dependencies
```

これで「dependenciesのラベルが付いた」「プルリクエスト」のみの通知を受け取る状態となった。

### dependabotの設定をする

導入方法はこちらを参照。dependabot.ymlという設定ファイルを作る。

https://github.blog/2021-04-29-goodbye-dependabot-preview-hello-dependabot/

以下のような設定を行った。
```
version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/" # Location of package manifests
    schedule:
      interval: "daily"
    open-pull-requests-limit: 10
```
npmパッケージを用いること、open-pull-requests-limit: 10としてバージョン更新のPRを作成してもらう設定にした(0にすると細かいバージョン更新は省かれ、セキュリティアップデートのみが作られる)。

このレポジトリに適当に古いパッケージを入れてみる。

```
npm i ts-node@1.4.1
```
入れたパッケージ、バージョンは適当。これをpushしてやれば"dependencies"ラベルの付いたプルリクエストが作られる。

そうすればslackに対して通知が…来なかった。

## 調査

以下の条件を試してみる。

* `pulls`のみをsubscribeし、プルリクエストを自作する
* `pulls`, `+label:dependencies`をsubscribeし、`dependencies`ラベルの付いたプルリクエストを自作する
* `pulls`のみをsubscribeし、dependabotによってプルリクエストを作成する
* `pulls`, `+label:dependencies`をsubscribeし、dependabotによって`dependencies`ラベルの付いたプルリクエストを作成する

結果は以下の通り。

||`pulls`のみ|`pulls`, `+label:dependencies`|
|----|----|----|
|自作PR|通知が来た|通知が来た|
|dependabot作PR|通知が来た|通知が来ない|

なんで？？

なお、ラベルを`dependencies`とは別の名前で付けるように設定しても同様の結果となった。

仮説としては以下の様に考えられるだろうか。

**「dependabotが作ったプルリクエストのラベル」** は **「通常設定するラベル」と同様には適用されない？**

そういう記載があるかドキュメントを探したがよくわからなかった。

## 結論

わかる人がいたら教えてください。
ひとまず僕はおとなしくラベルなしで`pulls`のみを取得することとします。
paiza 区間和の計算 LINQ使うとランタイムエラーになる。(C#)

Aランクレベルアップメニューの「区間和の計算」でLINQを使って配列に格納すると、ランタイムエラーになってしまう。原因はLINQが重いから？？

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_twopointers_step2

Sample.csの書き方の場合、「区間和の計算」テスト3で100000もの数値を配列に入れる際にランタイムエラーになる。

Sample2.csの場合は無事通過。なんでかわかる方はコメントお願いします。

```C#:Sample.cs
using System;
using System.Linq;
using System.Collections.Generic;

class Practice
{
    static void Main()
    {

        int count = int.Parse(Console.ReadLine());

        // こいつが重い?
        int[] text = Console.ReadLine().Split().Select(_ => int.Parse(_)).ToArray();

        int c = int.Parse(Console.ReadLine());

        int[] sn = new int[count];

        for (int i = 0; i < count; i++) {

            if (i == 0)
                sn[i] = text[0];
            else
                sn[i] = sn[i - 1] + text[i];
        }

        for (int i = 0; i < c; i++) {

            int[] line = Console.ReadLine().Split().Select(_ => int.Parse(_)).ToArray();

            int min = line[0];
            int max = line[1];
            
            if (min == 0)
                Console.WriteLine(sn[max]);
            else
                Console.WriteLine(sn[max] - sn[min - 1]);
        }
    }
}

```

```C#:Sample2.cs
using System;
using System.Linq;
using System.Collections.Generic;

class Practice
{
    static void Main()
    {

        int count = int.Parse(Console.ReadLine());

        // 一度string配列で受け取って使う時にint型にキャスト
        string[] text = Console.ReadLine().Split(' ');

        int c = int.Parse(Console.ReadLine());

        int[] sn = new int[count];

        for (int i = 0; i < count; i++) {

            if (i == 0)
                sn[i] = int.Parse(text[0]);
            else
                sn[i] = sn[i - 1] + int.Parse(text[i]);
        }

        for (int i = 0; i < c; i++) {

            int[] line = Console.ReadLine().Split().Select(_ => int.Parse(_)).ToArray();

            int min = line[0];
            int max = line[1];
            
            if (min == 0)
                Console.WriteLine(sn[max]);
            else
                Console.WriteLine(sn[max] - sn[min - 1]);
        }
    }
}
```
【devise_token_auth】NoMethodError: undefined method `devise' for User:Class 解消法【Rails】

## 状況

Railsアプリケーションにdevise_token_authを導入するために次の手順を実行しました。

```rb:Gemfile
source "https://rubygems.org"
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby "3.2.1"

gem "rails", "~> 7.0.4", ">= 7.0.4.2"

gem "mysql2", "~> 0.5"

gem "puma", "~> 5.0"

gem "tzinfo-data", platforms: %i[mingw mswin x64_mingw jruby]

gem "bootsnap", require: false

gem "rack-cors", "~> 2.0"

# 以下を追加
gem "devise_token_auth", "~> 1.2"

...
```

```terminal:terminal
$ bundle install

$ rails g devise_token_auth:install User auth
      create  config/initializers/devise_token_auth.rb
      insert  app/controllers/application_controller.rb
        gsub  config/routes.rb
      create  db/migrate/000000000000_devise_token_auth_create_users.rb
      create  app/models/user.rb
```

編集が必要なファイルを編集した後に`rails db:migrate`を実行したところ次のようにエラーとなりました。

```terminal:terminal
$ rails db:migrate                    
rails aborted!
NoMethodError: undefined method `devise' for User:Class
/home/ruby/app-name/app/models/user.rb:5:in `<class:User>'
/home/ruby/app-name/app/models/user.rb:1:in `<main>'
/home/ruby/app-name/config/routes.rb:4:in `block (3 levels) in <main>'
/home/ruby/app-name/config/routes.rb:3:in `block (2 levels) in <main>'
/home/ruby/app-name/config/routes.rb:2:in `block in <main>'
/home/ruby/app-name/config/routes.rb:1:in `<main>'
/home/ruby/app-name/config/environment.rb:5:in `<main>'
Tasks: TOP => db:migrate => db:load_config => environment
(See full trace by running task with --trace)
```

## 解決法

次のように`app/models/user.rb`に`extends Devise::Models`を追記することでエラーが解消しました。

```app/modules/user.rb
class User < ApplicationRecord
  extend Devise::Models
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  include DeviseTokenAuth::Concerns::User
end
```

または、`config/initializers/devise.rb`に以下を追記します。

```rb:config/initializers/devise.rb
Devise.setup do |config|
  require "devise/orm/active_record"
end
```

## 参考

https://github.com/lynndylanhurley/devise_token_auth/issues/1276#issuecomment-478866479

https://github.com/lynndylanhurley/devise_token_auth/blob/master/docs/config/initialization.md#:~:text=require%20%27devise/orm/active_record%27
最近話題のAI(人工知能)についての根本的な基礎知識についてまとめたかった。

# 目次
> [AIって？](#AIって？)
[AIの学習](#AIの学習)
[機械学習](#機械学習)
[深層学習](#深層学習)
[ニューラルネットワークって？](#ニューラルネットワークって？)
[ニューラルネットワークの種類](#ニューラルネットワークの種類)

# AIって？
「AI」や「人工知能」などといった漠然とした単語だけで聞いても、なかなか具体的なイメージが出てこない方も多いのではないでしょうか。
身近な例を出すとスマホの**Googleアシスタント**や**Siri**といった音声アシスタントに始まり、**FaceID**に**カメラで写真を撮るときに顔に□が付くアレ**(伝われ)など、スマホだけでも結構様々な機能として実用化されています。
~~あとはそれこそ最近話題のNovelAIとかChatGPTとか~~

# AIの学習
さて、AI及び人工知能は**学習**しないとまともに使い物にならないのは説明するまでもないと思います。
なので肝心の「**AIの学習って何ぞや？**」ってところを見ていきます。

学習の方法ですが大まかに分けて下記の2種類があります。
> **機械学習**
> **深層学習**

順番に掘り下げていきましょう。
### 機械学習
一言で説明するならば、
「**機械が何かしらの法則や特徴を学習し、その結果を基に"人間が"判断基準を設けて最終的な結果を求めるもの**」
です。
もう少し丁寧に説明すると、画像や音声、文章などのデータに対して、
「**これは○○です**。」
と、予めラベルデータ（教師データとも呼ばれます）を割り当てておき、それをもとにして入力されたデータが割り当てられたラベルデータに一致するかどうか、を判別して結果を返すという、名前の通り機械的な判別を行う学習方法になります。
また、教師データが必要になることから、**教師あり学習**と呼ばれることもあります。

例
>猫の画像をたくさん用意して「これは猫！」と教える。
犬の画像を渡すと「これ猫じゃない！」ってなる。

みたいなイメージです。

### 深層学習
別名**ディープラーニング**とも呼ばれます。名前だけはニュース等で聴いたことがある方もいるんじゃないでしょうか？~~(いるのか？)~~
現代のAIで多く使われているのは主にこちらですね。理由としては"**ニューラルネットワーク**"なるものが普及したためだとか。

さて、深層学習についてですが、AIの学習時に自ら法則や特徴を見つけるのは機械学習と同じなのですが、
**最終的な判断基準もAI側で求めて結果を出す**ことができるのがこちらの学習方法です。

深層学習では**自ら特徴を学習しその特徴を教師データとする**ことで、
予めラベルデータを割り当てずとも同じ様な画像を生成することのできるように学習したり、（教師なし学習と呼ばれる手法）
ゲーム内でどのような行動をすることでスコアを入手することができるか、を学習して**最終的にAIがゲームをクリアすることができる**ように学習したり（強化学習と呼ばれる手法）
することが可能です。

#### ニューラルネットワークって？
人間の脳にある、神経細胞の一種である**ニューロンをモデル化して再現したもの**を何層にも重ねることで、**人間の脳みその処理フローを再現して処理を行う**ため、機械学習等の結果よりもいい結果になることが多いみたいですね。
(画像識別だったら正解率が上がり、ゲームするAIならクリアスピードが上がる、みたいな感じ。)

##### ニューラルネットワークの種類
さて最後に、一口にニューラルネットワークといっても学習する対象やより細かい学習方法の違いなどによって、様々な分野に細分化されているので、ここでいくつか名前だけでも紹介して終わろうと思います。~~（全部についてまとめると文字数と執筆時間が途方もない事になるので投げ出しました）~~
気になった方はそれぞれの単語で調べてみてください。~~(たぶんわからない単語をわからない単語で説明されると思いますが)~~
>**画像識別、異常検知**
・CNN
・Res-Net
・オートエンコーダ
・Ano-GUN

>**画像生成**
・GAN
・DCGAN
・Cycle-GAN

記事作成：K&Q
docker-composeでmongodbを用意して初期セットアップまで行う

たいした話ではないですが[MongoDBのコネクションプールがわからなかったので調査](https://qiita.com/tomoyanp/items/1041fc3ab60ef9c8b10c)の続きです。
Express + MongoDBで個人開発を行っていましたが、チーム開発に昇格したためMongoDBをdocker compose化して誰でも簡単に環境構築できるようにしました。

## 前提
* Windows10
* WSL2


## ディレクトリ構造
こんな感じです。
setup.jsをentrypointとして流し込み、データベースやコレクションの作成を行い初期セットアップとします。
```:ターミナル
docker-compose.yaml
mongo
  ├ Dockerfile
  ├ setup.js
```

## mongo
docker-compose.yamlに直接mongoのイメージを指定してentrypointを実行する方法がわからなかったのでDockerfileからビルドすることにしました。
（docker-composeでやる方法あるかもですがあまり調査に時間かけたくなかったので。。。。）

```Dockerfile:Dockerfile
FROM mongo:4

# mongo自身のrootユーザとパスワード設定
ENV MONGO_INITDB_ROOT_USERNAME sample_user
ENV MONGO_INITDB_ROOT_PASSWORD sample_pass

ENV TZ="Asia/Tokyo"
RUN echo $TZ > /etc/timezone

# setup.jsをentrypointにコピーし、イメージ作成時に初期セットアップを実行
COPY setup.js /docker-entrypoint-initdb.d/
```
```setup.js
// sample_dbというデータベースにsampleというコレクションを作成
db = db.getSiblingDB('sample_db');
db.createCollection('sample');
```

## compose
上記で用意したDockerfileをdocker-compose.yamlで指定すればOKです

```docker-compose.yaml
version: '3.1'

services:

  mongo:
    build: ./mongo # ここでDockerfileが配置されているディレクトリを指定
    restart: always
    ports:
      - 27017:27017
    volumes:
      - ./mongo/db:/data/db
      - ./mongo/configdb:/data/configdb

  # せっかくなのでmongo-expressも使えるようにセットアップ
  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8080:8080
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: sample_user
      ME_CONFIG_MONGODB_ADMINPASSWORD: sample_pass
      ME_CONFIG_MONGODB_SERVER: mongo
    depends_on:
      - mongo
```

あとは`docker-compose up -d`などして起動できればOKです。
RDBのDDL的ノリでmongoのセットアップを行いましたが、もしかしてスキーマレスのmongodbにこういった初期セットアップ作業は不要ですかね？？
勉強不足ですみませんですが、誰かの役に立てば幸いです。
Vultr APIを使ったお手軽スナップショット取得 API v2版

以前、VPSのVultrのインスタンスでのVultr APIを利用したスナップショット取得について記事にしました。
[Vultr APIを使ったお手軽スナップショット取得](https://qiita.com/ataru_mix/items/964d5f8c73390a5b63c9 )
上記記事の時点では使われていたAPI v1は2023年6月には廃止予定で、API v2への移行時期が迫っています。API v2ではRESTベースでAPIの体系が作り直されたためそこそこの修正が必要となります。

APIのリファレンスは以下になります。
[Vultr API (2.0)](https://www.vultr.com/api/)

ここで、以前の記事で作成したスナップショット作成・削除スクリプトのAPI v2版を公開しておきます。curlとjqはインストールされている前提になります。

なお、共通インクルード中の"YOUR_VULTR_API_PERSONAL_ACCESS_TOKEN"は各自のアクセストークンに置き換えてください。
アクセストークンですが、Vultrの管理画面(my.vultr.com)の左メニューから「Account」を選択し、「API」タブを表示すると"Personal Access Token"の項目に表示されています。
また、同じページにある「Access Control」の項目でAPIを発行するインスタンスのIPv4アドレス、IPv6アドレスを追加しておかないとAPI呼び出し時に `{"error":"Unauthorized IP address: アクセスしたIPアドレス","status":401}` のようなエラーが発生します。



## 共通インクルード
``` bash:settings.sh
#!/bin/bash
METADATA='http://169.254.169.254'
API='https://api.vultr.com'
KEY='YOUR_VULTR_API_PERSONAL_ACCESS_TOKEN'
```

## スナップショット取得
``` bash:create-snapshot-v2.sh
#!/bin/bash
SRCPATH=`dirname ${0}`
source ${SRCPATH}/settings.sh

echo '------------------- create snapshot'
date
SERVERID=$(curl -sS ${METADATA}/v2/meta-data/SUBID)
INSTANCEID=$(curl -sS ${METADATA}/v2/meta-data/instance-v2-id)
echo ${SERVERID}, ${INSTANCEID}
EPOCH=$(date +%s)
echo ${EPOCH}

# create a snapshot of this server with server name and current time as description
SNAPSHOTID=$(curl -sS "${API}/v2/snapshots" -X POST \
        -H "Authorization: Bearer ${KEY}" -H "Content-Type: application/json" \
  --data "{
    \"instance_id\" : \"${INSTANCEID}\",
    \"description\" : \"${SERVERID}-${EPOCH}\"
  }" |jq -r '.["snapshot"]["id"]')
echo new snapshot id=${SNAPSHOTID}

# show a list of snapshots for this server
echo current snapshots are:
curl -sS "${API}/v2/snapshots" -X GET -H "Authorization: Bearer ${KEY}" \
        |jq -r '.["snapshots"][]|[.description, .id]|@tsv'|grep ${SERVERID}|sort
```
スナップショットの概要としてインスタンスメタデータから取得したインスタンスの識別子と作成時のunixタイムを付与しています。好みに応じてyyyyMMdd形式などにしてもいいと思います。
ただし、スナップショット名が時系列に対して昇順で並ぶようにしないと後続のスナップショット整理で古い方から消していく処理がうまくいきません。

## スナップショット整理 
``` bash:trunc-snapshot-v2.sh
#!/bin/bash
SRCPATH=`dirname ${0}`
source ${SRCPATH}/settings.sh
# maximum number of snapshots to keep
SNAP_MAX=3

echo '------------------- trunc old snapshots'
date
SERVERID=$(curl -sS ${METADATA}/v2/meta-data/SUBID)
echo ${SERVERID}

# get a list of older snapshots for this server that have exceeded the max count
LIST_REMOVE=$(curl -sS "${API}/v2/snapshots" -X GET -H "Authorization: Bearer ${KEY}" \
        |jq -r '.["snapshots"][]|[.description, .id]|@tsv'|grep ${SERVERID}|sort \
        |awk '{print $2}'|head --lines=-${SNAP_MAX})
echo "[ ${LIST_REMOVE} ]"

# let's remove old sunapshots
for SNAPID in ${LIST_REMOVE}; do
  curl -sS "${API}/v2/snapshots/${SNAPID}" -X DELETE -H "Authorization: Bearer ${KEY}"
done
```
自分自身のスナップショットの一覧を取得し、指定の本数以上のスナップショットを古い方から削除します。

シェル変数のSNAP_MAXが残すスナップショットの本数になります。
Vultrではスナップショットには \\$0.05/GB/month のコストが発生するため、あまり無分別に取得すると意外に大きな出費になります。
なお、感覚的に一瞬で終わるAWS EBSのスナップショットなどとは異なり、相変わらずスナップショットの取得には\\$6インスタンスの32GB SSDで20~30分くらいかかる様子なので(AWSのスナップショット取得の速さが異常)、スナップショット整理は取得の30分くらい後に走らせたほうが安全でしょう。
CPS(サイバーフィジカルシステム)についてまとめてみた

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiixta.com/7_inai_)

# CPSとは
CPS(Cyber Physical System)とは、`現実世界(フィジカル)の情報を、仮想空間(サイバー)に取り込み分析し、分析結果を用いて現実世界の活性化や社会課題の解決を測るシステム`のことです。

★次の①〜④のループを繰り返すイメージです。
①現実世界でのデータ収集
②仮想空間でのデータ蓄積
③仮想空間でのデータ分析
④現実世界でのデータ活用

身近なCPSの例を言うと、__Google Map__ を想像してもらえればわかりやすいと思います。実際の道と同じ道を仮想的にスマホの画面上に映し出し、リアルタイムの道路の渋滞情報や街の混雑状況を反映させています。

# CPS注目の背景
CPSが注目され始めた背景には、CPSならではの強みが関係しています。
例えば、医療、交通、電気のような、社会インフラになるシステムにもITを取り入れる動きが広まっています。しかし、従来のシステムでは社会インフラに求められるだけの安定性が無く、社会インフラとしては不十分でした。そこで使用されるのがCPSです。CPSによって現実世界と仮想空間を統合させることで、客観的な分析結果をもとにトラブルを解消することができます。
また、スマホ等の電子機器の世界規模での流行により、電子部品代が安くなり、CPSへの導入障壁が年々低くなってきていることも挙げられます。


# CPS ≠ デジタルツイン ≠ IoT
CPS・デジタルツイン・IoTの3つの技術はよく混同して考えられるため、それぞれの技術の違いを記載しておきます。


・IoTとCPS：[IoT](https://qiita.com/7_inai_/items/f2a56498b70b39befa0b)はネットワークを用いたデータの収集を意味しますが、CPSが行うような単体での分析や __フィードバック__ までは行えません。

・デジタルツインとCPS：デジタルツインは、現実世界で取得したデータを用いて、サイバー空間内に現実空間の環境を双子(ツイン)であるかのように再現する技術のことです。意味的にはCPSとかなり似ていますが、CPSはデータの収集や蓄積だけでなく、データの分析や __フィードバック__ まで行うことがデジタルツインとの違いです。

# CPSの事例
最後にCPSの事例を2つほど紹介します。
### ①自動車の自動運転
自動車の自動運転では、車がセンサーから取得した実世界の情報を、ITを駆使して仮想空間で処理し、ブレーキやアクセルといった実世界の駆動系フィードバックを行います。
この 「実世界 -> 仮想世界 -> 実世界」というながれがCPSによるものです。

### ②製造ライン最適化
製造ラインの最適化にとってもCPSは重要な技術です。
CPSを用いることで、現実世界の製造ラインを仮想空間に再現することができます。仮想空間で再現した製造ラインでシュミレーションをすることで、「予防保全」「生産プロセスの最適化」「柔軟性向上」など、様々な効果を得ることができます。

# 終わりに
CPSを活用することで、製造業は今後ますます競争力を維持することができるでしょう。しかしながら、CPSは常に進化し続ける技術であり、常に最新のトレンドにアップデートされる必要があります。製造業は、CPSを取り入れ、その恩恵を最大限に受けることで、将来の成功を確保することができます。
Javaのメソッドについて

paizaラーニングforTEAM Java入門編
レッスン6の#02

```Java:6-#02
// メソッドを作る

public class Main {
    public static void main(String[] args) {
        System.out.println("hello world");
        sayHello(); // sayHelloメソッドの呼び出し
    }
    
    // "hello world"と出力するsayHelloメソッドを定義
    public static void sayHello() {
        System.out.println("hello world"); // メソッドの中身
    }
}
NeurIPS2022の量子化論文 (2)

# 概要

この記事では、[NeurIPS2022](https://nips.cc/)の量子化論文を紹介します。[^1]
([その1](https://qiita.com/kyad/items/5138306b021299ae4ad2))

[^1]: 画像や数式は論文から引用しています。


# ClimbQ: Class Imbalanced Quantization Enabling Robustness on Efficient Inferences

https://openreview.net/forum?id=F7NQzsl334D

- 概要：Class-imbalancedな場合の量子化
- 新規性：Class-imbalancedな時量子化精度が小クラスで落ちる課題を解決する。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/17c0cc42-f8d4-f3a7-4677-69e4b90b7483.png)
- キモ：(a)量子化前にデータ分布に合わせてスケーリングし、量子化後のスケールが同じになるようにする。
  (b)データ数が少ないクラスはロスを重くする。データ数の基準はHomoVar Lossで決める。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/c4a3c976-528c-a400-d9d8-34ae923cae1f.png)
- 評価：CIFAR-10-LT, CIFAR-100-LTで評価した。


# Is Integer Arithmetic Enough for Deep Learning Training?

https://openreview.net/forum?id=G7MX_0J6JKX

- 概要：整数のみによる学習・推論
- 研究機関：Huawei
- 新規性：整数のみ学習で、Float精度と同じロス・精度のtrajectryで学習
- キモ：各指数部を、最大値$e_{max}$で揃える形で固定小数点化する。
  ロスのFloatと整数の差分の上界で評価する。(Theorem 1)
- 評価：ResNet18分類タスクで評価した。物体検出等でも評価した。


# FP8 Quantization: The Power of the Exponent

https://openreview.net/forum?id=H3Gv7XEGzYV

- 概要：FP8量子化とINT8量子化との比較
- 研究機関：Qualcomm
- 新規性：PTQすればINT8よりFP8の方が精度が良くなることを示した。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/934479d8-a4a1-8ce3-118a-36f4509c4871.png)
- キモ：INT8の代わりにFP8で量子化する。学習時にQAT的にレンジを決めて、FP8のレンジを補正できる。(flex)
- 評価：ResNet18, MobileNetV2によるImageNet学習やGLUEで評価した。


# Deep Compression of Pre-trained Transformer Models

https://openreview.net/forum?id=EZQnauHn-77

- 概要：Transformerモデルを学習済みモデルからFine-tuneする方法でモデル圧縮する方法
- 研究機関：IBM
- 新規性：4bit量子化でBERT等を50%sparseにできたのは初
- キモ：重み量子化にはSWAB+を使う。量子化誤差最小化に1, 2次モーメントを使う。
  Activation量子化は普通の量子化をする。
- 評価：BERTやViTで評価した。
業務効率化を図る試作2号機

ソロモンよ！！私は帰ってきたああああああああああああああああ！！！！

ある日、仕事中に一緒の職場の人から
「PDFって結合できる？」って聞かれた。
「できますよー(^^)bb」
って答えたはいいものの、何年か前に会社にあった使われてないPDF結合ソフトを入れてそのまま使ってたから会社でできるの僕しかいないやんけって事に気づいた。(今さら…)
まあその人がググったらあったみたいで解決したんだけど、こういったPDF圧縮とかPDF結合とかってぶっちゃけセキュリティ的に大丈夫そ？ってふと思った。

これもしかしたらPythonでPDF結合するプログラム作れるんじゃね？
って思い立ったが吉日、さっそく作ってみることに。
やっぱり前と同じでググってみると、出てくるんですねえ😏

慣れるためにコードは自分で打ってみる。
参考にさせていただいたサイトはこちら↓

https://opty-life.com/study/program/python/python-memo-18/

windows10で使用したエディターは「Visual Studio Code」です。

------------------------------------------------------

まずはコマンドプロンプトでpipをインストール↓
pip install PyPDF2

------------------------------------------------------
次にコード

import os

from PyPDF2 import PdfMerger
#モジュールとオブジェクトをインポート#

folder_a = "C:/Users/〇〇〇〇/Desktop/PDF_binding/PDF/"
#〇〇〇〇は会社のやつ、後ろ2つはフォルダ名#

list1 = os.listdir(folder_a)
#Folder_a内のファイルをリスト化#

pdfiles = PdfMerger()
#PdfMerger()は結合するPDFの入れ物を定義←そのまんま#

for i in list1:
    singlefile = folder_a + i
    pdfiles.append(singlefile)
    #フォルダ内のPDFを追加#

pdfiles.write(folder_a + "binding_files.pdf")
#PDFファイルの入れ物をファイルに出力する←そのまんま#
#””の中は好きな名前でおk#

pdfiles.close()
#最後にファイルを閉じる#

------------------------------------------------------

またまた丸パクリです。でもコード自分で打ったから許して💦
しかも正常に動作したからヨシッ！👈
今回も無事終了。はい、エドテン🌟🙏




、、、かのように思われた！！！！
実はこれ「俺が動かせても他の人動かせないやん」状態なのである。

「俺が動かせても他の人動かせないやん」
# 状態なのである！！！！！ #

ということで、Pythonをインストールしていなくても動かせるらしい「.exe」化をしてみることにした。
これも調べてみると、あるんですねえ😏
参考にさせていただいたサイト↓

https://www.insource.co.jp/python-gakuin/mail-backnumber/vol18.html

------------------------------------------------------

まずコマンドプロンプトでpipをインストール
pip install pyinstaller

------------------------------------------------------

Pythonファイルを開き、下のコードを入力↓

from tkinter import messagebox
messagebox.showinfo("実行ファイル", "実行ファイルの動作確認完了")
#実行ファイル化の対象になるPythonファイルの作成#


フォルダのアドレスバーに「cmd」を入力してEnter。
するとコマンドプロンプトが開く。

コマンドプロンプトに以下のコマンドを実行↓

pyinstaller practice.py --onefile
#最後のオプションをつけることで実行ファイルが融合する#


これで実行ファイルが完成。

するとフォルダの中に「dist」フォルダが作成されているから開くと「ファイル名.exe」の実行ファイルが作成されている。
これをダブルクリックすると画面上に『実行ファイルの動作確認完了』ダイアログが出現するからOK押す。
…すると実行されているんですねえ！！最高か！？

これでみんな使えるようになったか後日確認してみる。

------------------------------------------------------

今回はPDF結合、exe化までできた。丸パクリだけどちゃんと動作してくれて嬉しい。
次はPDF圧縮、exe化までやるぞい！！
経験値けっこう貯まった気がする😤

この調子で業務効率化とPython習得に猪突猛進していくZE🌟