OmniAICreator/Qiita-1.07M huggingface dataset:
Google Cloud Certified: Professional Cloud Database Engineer受験記

# はじめに
Google Cloud Certified: Professional Cloud Database Engineer試験の受験記録です。

# Professional Cloud Database Engineer とは
Google Cloudの試験の中でも、Google Cloudでのデータベーの設計・実装・トラブルシューティングなどに関する能力を評価する試験です。
具体的に評価される能力については以下となっています。
※ [公式サイト](https://cloud.google.com/learn/certification/cloud-database-engineer?hl=ja) より抜粋

- スケーラブルで可用性の高いクラウド データベース ソリューションを設計する
- データ ソリューションを移行する
- 複数のデータベース ソリューションにまたがるソリューションを管理する
- Google Cloud にスケーラブルで可用性の高いデータベースをデプロイする

難易度としては、他のProfessional試験と比較するとやや低く感じました。
Google Cloudが提供しているデータベースサービスごとユースケースを理解したうえで、各サービスの知識をインプットしておくことが合格への近道のように思います。
なお、本記事執筆時点(2024年9月)で、Professional Cloud Database Engineer試験は日本語試験に対応していません。今回は、初めて言語を英語にして受験しましたが、問題文自体に出てくる単語や表現については特別難しいものではなかったです。

# 学習フロー
今回は以下のような学習フローで学習しました。

- [試験ガイド](https://cloud.google.com/learn/certification/guides/cloud-database-engineer?hl=ja) を確認する
- G-genさんの対策ブログを見て、試験で問われるポイントを知る
[Professional Cloud Database Engineer試験対策マニュアル](https://blog.g-gen.co.jp/entry/professional-cloud-database-engineer)
- Google Cloud環境で実機確認する（実際にデータベースサービスをデプロイ・接続確認）
- 公式の模擬試験やUdemyの練習問題を解く
udemy問題集：[【2024年版】Google Cloud 認定 Professional Cloud Database Engineer](https://www.udemy.com/course/2024google-cloud-professional-cloud-database-engineer/)

# 学習のポイント
- データベースサービス
    - Cloud SQL
        - Google Cloud上でマネージドなリレーショナルデータベースを提供
        - 高可用性構成、リードレプリカなど対応
    - Sppaner
        - グローバルでリレーショナルデータベースを使いたいとき、まずはこれ
        - ユースケースに合わせてCloud SQLと使い分ける感じ？
    - Bigtable
        - Google Cloud上でマネージドなNoSQLデータベースを提供
        - IoTデバイスからのデータ格納用のデータベースとしての利用が主なユースケース
        - 他のDBにも言えるが、テーブル設計が重要
            - データの偏りを特定するためのツール（Key Visualizer）あり
    - Firestore
        - Google Cloud上でマネージドなドキュメントデータベース(NoSQLデータベースの1種)を提供
        - モバイルアプリ向けのデータベースとしての利用が主なユースケース
            - オフラインモード という機能により、インターネット接続が不安定な環境でもローカルキャッシュにデータを保存して、インターネット接続が再開すると、Firestoreへの同期を再開できる
- データベースサービス以外のデータベースデプロイ
    - Compute Engine
        - インスタンスを作成して、データベースをデプロイ
            - 運用面の考慮が必要になる
    - Bare Metal Solution（Bare Metal Solution for Oracle）
        - Google Cloudのベアメタルサーバーを利用できるサービス
        - 主なユースケースは、OracleデータベースのGoogle Cloud上への移行
- Google Cloudへの移行
    - ユースケースに合わせて前述のデータベースサービスを選択できるようにしておく
    - RTO/RPO、コスト、運用面などの要件も考慮必要（＝選択する移行方法が変わってくる）
    - 移行関連のサービス
        - Database Migration Service (DMS)
        - Datastream
- データベースの管理
    - データベース接続、アクセス制御
        - VPC（パブリックIPかプライベートIPのどちらへ接続するか、VPC Peering、Shared VPC、Private Service Accessなど）
        - IAM（サービスアカウント、IAMデータベース認証、フラグなど）
        - Cloud SQL Auth Proxy

# まとめ
今回はProfessional Cloud Database Engineerについて書いてみました。
今後も精進していきます。
簡単な記事ではありますが、いつか、どなたかの参考になれば幸いです。
言語・フレームワーク・ライブラリの違い

- 言語 : 素材
- フレームワーク : 土台
- ライブラリ : 部品

![キャプチャ (1).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690075/7f126e71-017b-2a04-1854-3051a5607391.png)
React-Adminの概要から実装まで

## 背景

- この記事を見ている人はきっとReact-Adminの導入を検討しているか、React-Adminを導入したは良いものの、情報が少なすぎて困っている方になると思います。
- 自分がまさに、React-Adminの導入が決まったプロジェクトに配属されて困った人間なので、その立場からほかの方にとって有益な情報の提供ができたらいいなという趣旨の記事になります。

## 前提

- この記事では、React-Adminの全体像について軽く説明します。
- そのうえで、各機能の解説等は別記事へのリンクを張っておきますので、詳細はそちらをご確認いただければと思います。

## React-Adminを知る

それではさっそくReact-Adminの説明をしていきます。

### 公式のリンク集

下記に公式のリンクをまとめたので、ぜひ確認してみてください

- 公式サイト
    - https://marmelab.com/react-admin/
- ドキュメント
    - https://marmelab.com/react-admin/documentation.html
- デモ
    - https://marmelab.com/react-admin/Demos.html
- Github
    - https://github.com/marmelab/react-admin

### 概要

React-Adminとはどんなものなのか、基本的な内容は下記です。

- フランス企業のmarmelabが管理しOSで開発が進んでいるB2B アプリ向け React フレームワーク
- 世界中で25,000社以上の企業が利用（公式の説明）
- Githubのスター数が現時点（2024/09/14時点）で24.8kと、類似のフレームワークの中でも突出している
- 認証・ルーティング・翻訳など、様々な機能が盛り込まれている
- React.jsとTypescript、MUI、React Hook Form、React Router、React Queryなどを内包している
- デザインはMUIを内包している関係でmaterial UI が使用されている
- 特定の機能や公式からのサポートを受けられる有料プランが存在する
- 簡単に導入できるデザインテンプレートも存在する

## 作れるページや機能

React-Adminでは主に下記のような機能やページの実装が可能です。

特に、このフレームワークを使う上で最も扱うことになるのは

 「一つのAPIに基づいた一覧・編集・新規登録・参照ページの作成」

かなと思います。

それぞれの詳細は別の記事としていますので、そちらをご覧ください。

（記事がまだかけていない項目も、需要があれば書いていきたいなと思っています。）

-  [認証機能](https://qiita.com/shino_gono/items/f255a0345fb8d8de2713)
    
- ルーティング
- 国際化（多言語化）
-  [基本的なCRUD操作](https://qiita.com/shino_gono/items/03abc255054f2a47eda5)
    
- 一つのAPIに基づいた一覧・編集・新規登録・参照ページの作成
- 仮実装のための補助機能
- デザインのカスタム


## 導入の際の注意

### APIについて

- React-AdminのCRUDは基本的に、APIの仕様もReact-Adminに合わせられていることを前提としています。
- そのため、React-Admin導入時にはAPI側をReact-Adminに合わせて設計できるかをあらかじめ確認することを強く推奨します。
- それができない場合はReact-Adminのデフォルトの挙動を押さえて、一部処理を独自実装する必要が出てきますが、あまり簡単にできるものではないです。
VSCode の dev-container を使って、React + TypeScript の開発環境を構築する方法

## はじめに

一緒に働いている方から「VSCode の dev-container を使えば、ローカル環境を汚さずに特定の開発環境だけ作れるよ」と聞いたので、実際に環境構築を行なった手順をまとめました。

今回は、Node.js をベースに React + TypeScript の開発環境を構築しました。

## 事前準備

dev-container は docker 用いて使用する必要があるため、docker のインストールを行なっておいてください。(今回は割愛します。)

---

## 手順 1: プロジェクトの作成

まず、Vite を使って新しい React プロジェクトを作成します。

1. **Vite のプロジェクト作成**

   ```bash
   npm create vite@latest my-react-app -- --template react
   ```

   - `my-react-app` はプロジェクト名です。

※ **TypeScript を使いたい場合**

TypeScript を使用する場合は、テンプレートを `react-ts` に変更します。
            
   ```bash
   npm create vite@latest my-react-app -- --template react-ts
   ```

---

## 手順 2: プロジェクトのセットアップ

1. **プロジェクトフォルダに移動**

   ```bash
   cd my-react-app
   ```

2. **依存関係のインストール**

   ```bash
   npm install
   ```

---

## 手順 3: dev-container のセットアップ

1. **VSCode を開く**

    VSCode を開きます。
   
2. **`Dev Containers: Add Development Container Configuration Files` を選択**

   コマンドパレットに `dev container` と入力し、`Dev Containers: Add Development Container Configuration Files` を選択します。

3. **Node.js & TypeScript 環境を選択**

   - ポップアップメニューで `Node.js & TypeScript` を選択します。

4. **`devcontainer.json` を確認・編集**

   自動生成された `devcontainer.json` ファイルが生成されるので、必要であれば、以下のように編集します。

   ```jsonc
   {
     "name": "Node.js & TypeScript",
     "image": "mcr.microsoft.com/devcontainers/typescript-node:1-22-bookworm",
     "extensions": [
       "dbaeumer.vscode-eslint",    // ESLint
       "esbenp.prettier-vscode",    // Prettier - コード整形
       "dsznajder.es7-react-js-snippets"  // React用スニペット
     ],
     "postCreateCommand": "npm install",
     "forwardPorts": [5173]
   }
   ```

   - **extensions**: 開発に便利な拡張機能を指定します。今回は、ESLint, Prettier, React スニペットをリストに追加しました。
   - **forwardPorts**: デフォルトポートとして `5173` を指定。
   - **postCreateCommand**: コンテナ起動後に `npm install` を自動実行し、依存パッケージをインストールするようにコマンドを指定しておきます。

---

## 手順 4: dev-container の起動

1. **dev-container を起動**

   - VSCode の左下の dev-container アイコンをクリックし、`Reopen in Container` を選択します。これでプロジェクトが Dev Container 内で開かれ、環境構築は完了です。

2. **開発サーバーの起動**

   Dev Container 内で以下のコマンドを実行し、開発サーバーを起動します。

   ```bash
   npm run dev
   ```

   - 開発サーバーが起動し、ブラウザで `http://localhost:5173` にアクセスするとアプリが表示されます。
ユーザーアクセスポリシー



Salesforce ユーザー アクセス ポリシーは、管理パッケージ ライセンス、権限セット、権限セット グループなどのアクセス メカニズムへのユーザーの割り当てを自動化および移行できる Salesforce の新機能です。

この機能を使用すると、特定のプロファイルを持つユーザーを識別するルールを作成し、それらを新しい権限セットまたは権限セット グループに割り当てることができます。これは、ユーザーをプロファイル ベースの権限モデルから権限セット ベースの権限モデルに移行する場合に役立ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/904945cf-a607-59e1-51b5-4ea2f4f5d824.png)

Cheryl Feldman 氏とそのチームの努力により、ユーザー アクセス ポリシーの有効化が非常に簡単になりました。セットアップに進み、ユーザー管理設定を検索し、ユーザー アクセス ポリシー オプションまで下にスクロールして、有効化をクリックするだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b64bb894-b66c-1c46-3267-963c0f1ef4cc.png)


+ [ユーザーアクセスポリシーの考慮事項](https://qiita.com/Keiji_otsubo/items/d221f85c95689c8fe736)


# 変更セットでできないこと

+ [ユーザー アクセス ポリシーが変更セットの展開に失敗する](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZA1WS)

:::note
解決できませんでした。結局、本番組織で手動で作成することになりました。
:::
Visual Studio Code のまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


# トレイルヘッド

+ [Quick Start: Visual Studio Code for Salesforce Development](https://qiita.com/Keiji_otsubo/items/9557e089cfc1ba51351c)

# エラー

+ [The 'salesforce.mule-dx-extension-pack' extension is not available in Visual Studio Code for Linux 64 bit](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YwadHSAR)

:::note
The error message states that the extension pack is not available for Linux version of VS Code. I would suggest reviewing the below documentation before installation:

Getting Started with Anypoint Code Builder

>> https://docs.mulesoft.com/anypoint-code-builder/start-acb

エラー メッセージには、拡張パックが Linux バージョンの VS Code では使用できないことが示されています。インストールする前に、以下のドキュメントを確認することをお勧めします。

Anypoint コード ビルダーの使用を開始する
:::
meviy2D で金具を発注・製造してみた

# 1. はじめに
電子工作で、金属製のケースや、金具が必要になることがあります。

「精密板金」を依頼できる工場が手近にあると良いのですが、業務でやっていないと難しいでしょう。
量産前提でない、一見さんが 1 個だけ欲しいような時に話を聞いてくれる工場となると、更に難しくなります。

近年、3D データから製造できることで有名になった meviy があるようです。
個人事業主または法人に限られますが、単品物でも気軽に発注できます。
ですが、**3D CAD 習得するのめんどくさー**と思って、使った事はありませんでした。

ところが、いつのまにか (昨年から)、2D 図面でも発注できる **meviy2D** のサービスが始まっていました。
dxf/dwf だけでなく、**pdf の図面でも ok** ということです。

**これなら不器用な私でもなんとかなる！**

ということで、さっそく使ってみることにしました。


# 2. 作るもの
現在、コンベクションオーブンをリフロー炉に改造する作業中です。

温度調節器をコンベクションオーブンと合体させるのに、固定用のブラケットが必要です。
これを作ってもらうことにしました。

2D 図面を、回路図用 OrCAD で作成しました。
1:1 の pdf で出力します。
![1_旧図面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/f67ea9d9-bfee-5d73-ea1e-73d25ab8b339.png)


# 3. meviy2D に見積依頼
misumi アカウントを作ったら、早速 meviy2D に見積もりを依頼します。
見積条件として、SECC 素材で表面処理・熱処理無し、単品を指示しました。
板厚は、図面中で指示するようです。

![2_見積条件.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/0f32702e-6c4a-f1d8-3cb8-b15a9f9d5905.png)

送った図面は、寸法指示の文字が小さすぎて、見積もり不可の返事が来ました。
AI が認識できないのか、FAX で送ると潰れてしまうからか😅

発注仕様を確認したところ、
https://jp-2dx.meviy.misumi-ec.com/meviy-guide/ja/customer_manual/2dx_quotation/10113/

![3_文字サイズ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/fc780f89-ff71-bfac-b1e6-70e76c8b8874.png)

が指示されていましたので、文字を大きくして再送しました。
固定フランジ角のC0.5指示をR2に変更しています。
別途見積数量で、10個の場合も聞いてみることにします。

![4_図面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/0e54a822-c7ec-6b4a-f524-381d45e61269.png)

2日後の夕方に、見積結果が届きました。

![5_見積結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/f4de0b26-f372-f66c-b25f-7ac019a92147.png)

税別単価で、
**1個製作時: 6,340 円
10個製作時: 970 円**
でした。

# 4. 発注と受け取り
見積は 1 個と 10 個でお願いしましたが、1 個だけ発注します。(税込み 6,974円)
5営業日で発送してくれるそうです。

実際のところは、

**9/5(木) 発注
9/12(木) 発送 - 川崎
9/14(土) 受取 - 札幌**

となりました。
納期見積は実働5日だったので、予定通りの納期で発送されました。

川崎 ⇒ 札幌で輸送に2日かかります。
送料は無料でした。


# 5. 受け取った現品の確認
こんな感じで出来上がりました。

![6_EXI-COB.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/778bbc07-7ed4-c19f-09ab-3c1263dc50eb.jpeg)

寸法と仕上げも、満足いくものです。
寸法誤差まで確認していませんが、日本製ですし大丈夫でしょう。

温度調節器が、固定できればよいのです。

**顧客は穴を開けたかった！**
(あと、曲げも)

# 6. まとめ
meviy2D で、2D 図面から板金部品を製造することができました。
電子工作で使うようなシートメタルの精密板金全般をカバーでき、塗装も可能なので、カスタムケース作り放題です。

あと、シルク印刷か、インクジェット印刷もサポートしてくれると、更に色々できて楽しそうです。
【OpenAI o1】について、書かれたものや動画などのリンクなどを集めてみました。


　どうも、カーブミラーです。

　今回は、ChatGPT o1について、書かれたものや動画などのリンクなどを集めてみました。なるべく、まとめてみたけれど、見づらいかも😅

:::note info
本記事は、
　ChatGPTは使っておりません。
　　あしからず。
:::
　まずは、ニュースです。

　OpenAIからです。
　　[OpenAI公式ポスト](https://x.com/OpenAI/status/1834665203407241366?t=zu9zSScZvEoSzqigfo9bzw&s=19)
　DeepL翻訳
「OpenAI o1-previewとo1-miniを試してみたいという熱意が多く、すぐにレートリミットに達してしまうユーザーもいました。

すべてのPlusとTeamユーザーの週間レートリミットをリセットしました」

　さぁ、野郎ども！　お嬢様方！
　　難問を突きつけろ！
　　　オイラは、寝る😸
***
　さて、本題です。

　今回は、OpenAIのo1について、書かれたものや動画などのリンクなどを集めてみました。

　WIREDの記事に
　　OpenAIのo1について
　　　書かれてあった。
　　　　[WIRED日本語版](https://wired.jp/article/openai-o1-strawberry-problem-reasoning/)

　OpenAIの
　　最高技術責任者（CTO）である
　　　ミラ・ムラティ氏が
「このモデルは、OpenAI社内でStrawberryというコードネームで呼ばれており、GPT-4oの後継ではなく、GPT-4oを補完するものだ」
　　　　と語った。

　　また、彼女は
「OpenAIは現在、次のマスターモデルである「GPT-5」をつくっており、これは前モデルよりもかなり大規模なものになる」とも。

　OpenAIの
　　研究担当副社長である
　　　マーク・チェンの言葉もある。

　ほかのLLM研究者の言葉も。
***
　ゆうべ、o1の開発チームが
　　ユーザー質問に答えるAMAを
　　　行ないました。
　　　　[OpenAI開発者ポスト](https://x.com/OpenAIDevs/status/1834608585151594537?t=jDYOidF0QWsZt8c3V5E2qQ&s=19)

　まつにぃさんが
　　簡単にまとめてくださいました。
　　　[まつにぃさんポスト](https://x.com/yugen_matuni/status/1834754808877859248?t=uayBpINRF3LAYOL4g14gQw&s=19)

　抜粋というか、そのままですが。
　・oはOpenAIのo
　・単一モデルで思考連鎖実施
　・o1-miniは無料ユーザー配布予定
　・ナレッジ関係の処理は苦手
　・ブラウジング、マルチモーダル機能も搭載予定
　・思考制御機能予定
　・価格低下予定
***
　木内翔大さんが
　　OpenAIのo1を紹介する動画を
　　　和訳したテロップを付けて
　　　　ポストしてくれました。

　[木内翔大さんポスト](https://x.com/shota7180/status/1834441243314847867?t=8I0tfNpyjv1QoJUh0rBAzA&s=19)

　目次
　1/ プロンプトからビデオゲームをコーディングする
　2/  特定の量子演算子の応用について答える
　3/ AIにとって難しい有名なひっかけ問題に答える
　4/ 物理法則に基づく推論を行う
　5/ 経済学博士レベルの試験問題に答える
　6/ 複雑な論理パズルを解く
　7/ 遺伝学の研究をサポート
　8/ 崩れた文章を解読する
　9/ 論理的数字パズルゲームを作成し、解く
　10/ コーディングにおいて人間のように意思決定、処理を行う
***
　YouTube動画です。

　ビジネス観点から
　　[リモート研究所](https://youtu.be/O_8EUw7GhJY?si=xdIgI1-tV4u7REDl)

　ニュースとして
　　[AI大学](https://youtu.be/CAMzO0BgVDY?si=DI2gCxt_SCzRNFUC)

　GPT-4oとの比較
　　[mikimiki WebSchool](https://youtu.be/syTDauME3u8?si=lwUkKS_EA5qntOpY)

　研究者目線で、o1登場すぐ試すLIVE
　　[ChatGPT活用チャンネル](https://youtu.be/69LaJYV-y-o?si=Q_HtM7BAKrdsPM8_)

　実際に使ってみて
　　[KEITO WEB&AI CH](https://youtu.be/y_mevM5JHE4?si=LA3XIPCPq3xO1KGt)

　KEITOさんの動画には
　　Promptのコツもありました。

　- プロンプトは簡潔で直接的に
　- 連鎖型の思考プロンプトは避ける
　- 区切りを使って明確にする
　- 追加の文脈情報は最小限に
***
　Qiitaでの記事

　@7mpyさんがふたつ。
　[o1-preview大実験！ChatGPT o1は競プロの問題を解けるのかAtCoder (2024年9月版)](https://qiita.com/7mpy/items/c05f61ed65926afa5fb5)

　[ChatGPT o1-previewに数学の共通テスト（旧センター試験）を解かせてみた](https://qiita.com/7mpy/items/02f6641e7f488253418a)

　Sugawara Nobisuke@n0bisukeさんは
　　ひとつ。APIでのアクセスを
　　　試みたようです。
　[OpenAI o1-prebiewのAPIを試そうとしたら会員ランク()ではじかれてた話 #chatgpt](https://qiita.com/n0bisuke/items/59909167a883d906a21f)
***
　ひとまず
　　得られたものは
　　　このくらいですね。

　o1は、工学系
　　GPT-4oは、文系
　　　とX-Twitterで言われている方も
　　　　いらっしゃいました。

　ちなみに
　　私は、Promptの問題点を
　　　挙げてもらいました。
　　　　それと改善案も。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
MacでSSH接続する

MacでSSH接続を行う方法を説明します。

以下の手順に従ってください。

1. **ターミナルを開く**:
   - Finderで「アプリケーション」 > 「ユーティリティ」 > 「ターミナル」を選択します。

2. **SSHキーの生成**:
   - 新しいSSHキーを生成するには、以下のコマンドを実行します。
     ```bash
     ssh-keygen -t ed25519 -C "your_email@example.com"
     ```
     - `your_email@example.com` の部分は自分のメールアドレスに置き換えてください。

3. **公開鍵をサーバーに追加**:
   - 生成された公開鍵（`~/.ssh/id_ed25519.pub`）を接続先のサーバーに追加します。通常、サーバーの `~/.ssh/authorized_keys` ファイルに追加します。

4. **SSH接続の設定**:
   - `~/.ssh/config` ファイルを作成または編集し、以下のように設定します。
     ```plaintext
     Host 接続名
       HostName ホスト名
       User ユーザー名
       IdentityFile ~/.ssh/id_ed25519
       Port ポート番号
     ```
     - `接続名`, `ホスト名`, `ユーザー名`, `ポート番号` を適宜置き換えてください。

5. **接続の確認**:
   - 設定が完了したら、以下のコマンドで接続を確認します。
     ```bash
     ssh 接続名
     ```

これで、MacからSSH接続ができるようになるはずです.

ソース: 
(1) SSH接続のやり方をめちゃくちゃ詳しく解説する for Mac - Qiita. https://qiita.com/rihib/items/9b1f611619695cbf68a0.
(2) MacのTerminalで「 ssh 接続名」で SSH 接続 - Qiita. https://qiita.com/blendthink/items/d31e5c19751644129efc.
(3) Macにsshで接続してログインしよう！sshでの接続方法解説 .... https://aprico-media.com/posts/1319.
(4) Macのターミナルでssh接続 - Qiita. https://qiita.com/Yui-00/items/8bc9be260db8ec668f65.
ハッシュ値の性質 ハッシュの衝突耐性とは

今回はハッシュ値についてまとめてみます。

ハッシュ値から元の値を推測するのが難しいことは理解していましたが、いろいろ混乱するような性質があったため、改めて頭の整理を兼ねてこの記事にまとめました。

## そもそもハッシュ値とは

ハッシュ関数という特別な関数にデータを入力して出力されるビット列のことです。広く使われているものとして、SHA-256、SHA-512、RIPEMD-160などがあります。

ハッシュ関数が出力するハッシュ値には、異なるデータから同じハッシュ値が生成されないという特徴があり、この「同じハッシュ値が生成されないこと」を衝突耐性と呼びます。

この特徴から、ハッシュ関数は入力データが少しでも変わると出力されるハッシュ値も大きく変わります。これを利用してデータの改ざんチェックやデジタル署名の作成にも応用されています。


# ハッシュ値の性質
引用元：[ハッシュ値にはたくさんの特徴や役割がある！具体的な使い方を理解しよう！](https://www.gmosign.com/media/work-style/hassyuti/#index_id7)

思った以上に色々な性質、特徴があった。

## 衝突発見困難性

> 衝突発見困難性とは、同じハッシュ値になる元データを求めようとしても、計算量が大きいために困難であることをいいます。セキュリティの点から、ハッシュ値が同じになるような元データを求めることが物理的に困難であることが性質として求められます。

簡単に言えば、異なるデータで同じハッシュ値を見つけるのが非常に難しいという性質です。
偶然、別々のファイルから同じハッシュ値が生成されるという衝突を意図的に探すのは非常に困難なので、データの改ざんを防ぐことができます。


## 原像計算困難性

> 原像計算困難性とは、あるハッシュ値について、その元データを求めようとしても、計算量が大きいために困難であることをいいます。ハッシュ値から元データの予測や分析、復元ができないことがハッシュ関数に求められます。

あるハッシュ値から元のデータを推測するのが非常に難しいという性質です。例えば、友達からハッシュ値を渡されて「元のデータを当ててみろ」と言われても無理ゲーということですね。


## 第2原像計算困難性

> 第2原像計算困難性とは、ある元データとそれに対するハッシュ値が与えられたときに、そのハッシュ値と一致するような別のデータを求めることが困難であることをいいます。一つ一つのハッシュ値がユニークなものである以上、同一のハッシュ値になるような元データを求められるようなことがあってはいけないためです。

既に出力されたハッシュ値と同じハッシュ値を持つ「別のデータ」を見つけるのが非常に難しいという性質です。これにより、悪意のある者が別のデータを作成してハッシュ値を偽装することを防ぐことができます。

## Rubyでの計算方法

実際にRubyでハッシュ値を使う場合、標準ライブラリのdigestを利用して文字列からハッシュ値を計算できます。[Ruby 3.3リファレンスマニュアル module Digest](https://docs.ruby-lang.org/ja/latest/class/Digest.html)

主なハッシュ関数として、前述のSHA-256やSHA-512、RIPEMD-160が用意されています。

```rb
Digest::SHA256
Digest::SHA512
Digest::RMD160
```

メソッドにはdigest、hexdigestがあり、それぞれハッシュデータをバイナリデータで返すものと、16進数で返すものがある


```rb
// 組み込みライブラリではないので、requireが必要
require 'digest'

p Digest::SHA256.digest('Qiitaテストでございます')
p Digest::SHA256.hexdigest('Qiitaテストでございます')
```

実行結果

```rb
// digest
"\x1C\x01\x13d\xA1\xF4_\xFFEUgW\xC4[\xC1\xCE\x9FG\xFE\xDD\xA4Tk\xD3\x9ECouH:\xDC\xCE"

// hexdigest
"1c011364a1f45fff45556757c45bc1ce9f47fedda4546bd39e436f75483adcce"
```


今回はハッシュ関数について整理しました。
仕事で使うことも時折あるので、改めて頭の中を整理できて良かったと思います。


おしまい
フリーランスエンジニアの現実は？現実は甘くない！「フリーランスエンジニアはやめとけ」は本当？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783009/5acbd3f7-7829-a4a5-b469-65b2054a786b.png)

近年、ITエンジニアのフリーランス転向が増えており、多くのエンジニアが独立して働く選択肢を選んでいます。しかし、その背景には現状とリスクが存在します。本記事では、フリーランスとして働くITエンジニアが抱える現状やリスクについて解説します。

## 現在のフリーランスエンジニア市場は？
まず現状についてですが、ITエンジニア需要は非常に高く、フリーランスとして働くエンジニアは案件の獲得が容易であることが挙げられます。また、企業側から見ても、ITエンジニアの不足を補うために、フリーランスエンジニアと契約することが増えています。さらに、コロナ禍により在宅勤務が一般化したことで、フリーランスエンジニアに対する受け入れも進んでいます。 しかし、リスクも存在しています。以下に主なリスクを挙げます。

### １）安定した収入が得られない可能性
フリーランスエンジニアは収入が安定しないことがあります。案件が続かなかったり、競合他社との価格競争が激しくなると、収入に影響が出ることがあります。案件がないと収入がゼロになります。もちろん残業代も出ません。

### ２）自己負担が増える
フリーランスエンジニアは、社会保険や確定申告などの手続きを自分で行う必要があります。また、税金や手続きの負担も増えることがあります。（これが意外と多い…）健康診断も全て自分で受けることになりますよ！

### ３）働く環境が整わない
在宅勤務が主となるフリーランスエンジニアは、自身で働く環境を整える必要があります。自宅で集中できない場合や、適切な設備が揃っていない場合、効率的に働けないことがあります。また、大手企業の案件ではセキュリティ対策が必須であるため、設備や業務環境の制約が求められます。また最近ではフルリモート案件はコロナ当時の半分以下に減っています。２～３年後には３０％以下に減少すると言われています。

### ３）スキルの維持・向上が難しい
フリーランスエンジニアは、自己研鑽が求められます。業務に追われるうちにスキルの維持や向上が疎かになり、市場価値が下がることがあります。
フリーランスエンジニアは自己スキルが唯一の稼ぐ手段であり、生活していくための生命線です。スキルが向上しないと単価も上がりません。

### ４）フリーランスエンジニアが飽和状態
ここ最近のフリーランスブームは活況を帯びています。ここで注意喚起ですがフリーランスエンジニアを煽るSNSやネット広告は鵜呑みにしないで下さい。未経験や経験の浅いエンジニアが高単価案件を獲得するのはまず無理です。供給過多（飽和状態）でスキルがないと案件すら獲得が困難な状態になります。よく言う「フリーランスエンジニアはやめとけ」状態です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783009/cbd646ff-5aa6-ceff-0759-b9d0ef42fbb7.png)


[引用：ITプロパートナーズが実施した独自調査](https://codezine.jp/article/detail/15930 "引用：ITプロパートナーズが実施した独自調査")

### ５）社会的信用度が低い
一部のクレジットカードや自動車ローン、住宅ローンなどの審査が通らないケースがあります。結婚して家族ができてフリーランスを続けられますか？

### ６）５０歳を超えると急激に案件が少なくなる
残念ながらプロ野球選手やサッカー選手のように、ITエンジニアの賞味期限はあります。５０歳を超えると案件がなくなるため収入が厳しくなり、その分転職もしにくくなるためニッチモサッチもいかなくなります。


[引用：ITプロパートナーズが実施した独自調査](https://itpropartners.com/blog/26099/ "引用：ITプロパートナーズが実施した独自調査")

### ７）トラブルによる損害賠償は個人で責任を負う
案件や顧客とのトラブルなどで損害賠償が発生した場合、個人責任となり、誰も守ってくれないので人生に詰みます。例えば、個人のPCがセキュリティの脆弱性を突かれ、案件情報や個人情報はおろか、プロジェクトの機密情報など流出したケースや、客先や案件に損害を与えてしまうトラブルが生じた場合は損害賠償を免れることはできません。

### ８）休んだら収入減額と場合によっては契約解除
休んだら収入減額になります。多くは140-180hの契約となっていると思います。インフルエンザやコロナウイルスに感染した場合は少なくとも最低３日間（24h）のロスになります。体調不良による休みが度々続く場合は最悪のケースとして契約解除になります。

以上がITエンジニアのフリーランス転向の現状とリスクです。フリーランスエンジニアとして働くことにはメリットもありますが、今回はあえて厳しい現実をご紹介しました。独立を検討する際は、リスクを十分に考慮した上で判断することが重要です。でもあえて言います。「フリーランスエンジニアはやめとけ」

## 安心安全の高還元SESに転職を考えている方へ
新しい挑戦に踏み出すことは、人生において重要な一歩です。
**転職活動は自分自身を知り、成長する貴重な機会でもあり、夢や成長を追求するためには必要な要素の一つ**になるかと思います。
どんな選択をされるにせよ、その決断があなたに取って素晴らしい未来を切り開くことを願っています！
私と一緒に誇れるエンジニアを目指しましょう！

■『株式会社グラディート』では受託開発・SES・ブランディングデザイン・事業コンサルティングなどを事業として行う都内のIT企業です。現在、不遇な待遇で困っているエンジニアさんは、ぜひ一度グラディートに相談してみてね！（年収査定・SESへの転職相談も承っております！）

株式会社グラディート採用情報はこちら▼
https://en-gage.net/gradito/

株式会社グラディート公式サイトはこちら▼
https://www.gradito.co.jp/
Resoniteでアップデートが来ているはずなのにSteamの画面に表示されない！？時の対処法

# アップデートの文字がSteamの画面に表示されない！？
そんな時は「ゲームファイルの整合性を確認」です！

1.SteamのライブラリからResoniteのタブを右クリック
![スクリーンショット 2024-09-14 124657.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626996/eec7b3ab-c252-4c56-5640-c40c923177b6.png)

2.プロパティを開きます
![スクリーンショット 2024-09-14 124703.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626996/85163ead-2c41-664e-d501-4daf84cd32b9.png)

3．インストール済みファイルのタブを開きます
![スクリーンショット 2024-09-14 124719.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626996/06ac5d4e-79c7-574d-dce7-6e498abd3b9b.png)

4.ゲームファイルの整合性を確認を押しましょう
![スクリーンショット 2024-09-14 124724.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626996/369b823e-2805-8885-4629-e29a61b1b9b9.png)

待っているとファイルの整合性の確認が終わります！
![スクリーンショット 2024-09-14 125142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626996/44e93003-fa5d-1584-1596-7a5f267c0f6b.png)
![スクリーンショット 2024-09-14 125437.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626996/afcbbb06-d592-31f1-63a5-c8ba031332da.png)

これでアップデートの表示が出るようになるかもです！

以下の記事が参考になるかもしれません！
[Steamサポートの記事](https://help.steampowered.com/ja/faqs/view/0C48-FCBD-DA71-93EB)
CV2を使って写真画像にタイムスタンプを入れてみる

## はじめに
RaspberryPiカメラを使用して、定期的に写真を撮影しています。その写真にタイムスタンプを入れたいと思った。
## 環境
ハードウェア　：　RaspberryPi ZERO 2
OS : Raspbian OS (Debian GNU/Linux 12 (bookworm))
Python : Python 3.11.2
CV2 : opencv-python==4.9.0.80
## コード
```Python
import cv2
import datetime

img = cv2.imread('タイムスタンプを入れたい画像ファイルのパス')

now = datetime.datetime.now()
timestamp = now.strftime('%Y/%m/%d %H:%M:%S')

# タイムスタンプの位置は第3引数で調整（30, 30）は画像の左上に表示されます
# タイムスタンプの色は第6引数で調整(0, 128, 255)はオレンジ色です。RGB形式ではなくBGR形式である点に注意
cv2.putText(img, timestamp, (30, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 128, 255), 2)

# imgと同じファイルパスとした場合上書きとなります
cv2.imwrite('出力先ファイルパス', img)
```
LinuxでPythonの仮想環境（venv）を作る方法

# 仮想環境(venv)とは
venvはPythonの仮想環境を作成する仕組みで、Pythonをインストールすると標準で利用できます。

用途としては、プロジェクト別にインストールしたいパッケージを分けるときです。使っていきましょう。


# Linuxでvenvを作成してvenv使用する
```bash:terminal
$ python3.9 -m venv (venvディレクトリ名) # 仮想環境を作成する
```
このコマンドでvenvの環境が(venvディレクトリ名)に作成されます。

```bash:terminal
$ source (venvディレクトリ名)/bin/activate # 仮想環境に入る（有効化）する
```
とsouceするとターミナルの先頭に括弧書きで使用している仮想環境の名前が表示されます。

```bash:terminal
$ which python # pythonのpathを表示
(venvディレクトリのPATH)/bin/python 
```
と表示されていればOKです。

仮想環境を抜ける（無効化）するにはdeactivateコマンドを実行します。
```bash:terminal
$ deactivate # 仮想環境を抜ける（無効化）する
```

仮想環境が不要になった場合は仮想環境を削除します。
```bash:terminal
$ rm -rf (venvディレクトリ名) # 仮想環境を削除する
```

# 参考文献
-[Pythonによるあたらしいデータ分析の教科書](https://amzn.to/3XnQBVD)
旅館布団敷き巡回効率化を話し合いたい

1 質問の動機
今，旅館で働いています。旅館では，客の登録情報をもとに，夜食事に向かう時間に応じて布団敷きの順番を決めます。ですが，現在，インバウンドの客が増加したことにより，より効率よく布団敷きの巡回をしなければならなくなりました。
そのため，効率的な布団敷き順路を，食事時間に応じて編成できるようなプログラムを作りたいと思っています。
どの旅館でも汎用性のあるプログラムにしたいので，部屋数，階数，移動方法などは打ち込みでできるようにしたいです。しかしここではサンプルとして，特定の旅館を提示してみたいと思います。

2 条件の例示
布団敷きでは，1階から5階までを階の両端にあるエレベーターで移動して目的の部屋に移動します。端から端まで20部屋あり、隣り合う部屋間の移動はx秒、エレベーターによる階数移動は回数に応じてy秒ずつ増加。一部屋の布団敷きにかかる時間はz秒。さらに、ランダムに食事時間（＝布団敷き許容時間）が各部屋に割り当てられています。布団敷きをするチームは2つに分かれて独立して動くことができます。

このような状況下で、どのような計算が適しているか、みなさんと話し合いたいです！
抜けている条件など適宜は追加したいと思うので、たくさん意見くださったら嬉しいです。

（込み入った状況としては、各部屋人数がもちろん違うので、布団敷きにかかる時間も違います。そして、もし全ての部屋が時間に間に合わなそうな結果の場合、クレームを最小限にするため、間に合わない部屋数も最小化したいです。）

3 少し考えてみた。
最初の一部屋を割り出した後は、近くの部屋で、食事時間と対応し、かつ移動時間が少ない順に大きい方から点数をつけていき、最大の点数の部屋を次の部屋として指定する。
ハミルトン閉路の弱化版のような気がするので、総当たり戦が有効なのだろうか？

4 展望
業務効率化で（自分の）ブラック労働を減らしたいので、そして、布団敷きに苦しむ色んな人に使って欲しいので、ゆくゆくは3D見取り図などに経路が表示されると素晴らしいなと思います。

どうにか皆さんとお話ししながらこの問題を解決したいです！！！
媒介中心性を用いて都市の道路網で車・人通りの多いポテンシャルを持つエリアを簡単に可視化する

## はじめに
グラフ理論における[媒介中心性](https://en.wikipedia.org/wiki/Betweenness_centrality)を、実際の都市の道路網に適用してみます。これによって、車・人通りの多いポテンシャルを持つエリアを簡単に可視化することができます。

![四万十市媒介中心性.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3753744/f70eb8f9-ae46-48e9-8eee-64290c7b7bb0.png)

上図は、高知県四万十市。

## 媒介中心性とは
ノード$i$の媒介中心性とは、**すべてのノードのペア$(s,t)$の最短経路のうち、ノード$i$を通る経路の数**と定義されいます。

＊最短経路が$k$本ある場合は、経路上のノードに対してそれぞれ$1/k$の中心性を付与するなどもあります。

媒介中心性は、ネットワーク上で「そのノードを通るフローがどれほどあるか」を示しており、そのノードの重要性・中心性を表す指標の一つになっていると言えます。

例えば、下図のノードAは次数中心性（そのノードの次数）は低いが、媒介中心性が高い典型的な例です。

![媒介中心性が高い例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3753744/0844d41c-47e2-2829-2def-c8bfb1bb02ff.png)[^1]
 
 Group間の移動には必ずAを通らなければいけません。



## Pythonでのコード
### 対象地域の道路情報を取得し、道路ネットワークを可視化
``` python
import folium
import osmnx as ox

# 対象地域の道路情報取得 (例：高知県四万十市)
query = "Shimanto,Kochi,Japan"
G = ox.graph_from_place(query, network_type="drive")

# 道路グラフネットワーク可視化
fmap = ox.plot_graph_folium(G)
fmap.save(outfile="road_network.html")

opts = {"node_size": 5, "bgcolor": "white", "node_color": "blue", "edge_color": "blue"}
ox.plot_graph(G, show=False, save=True, filepath="road_network.png", **opts)
```

すると、以下のように道路網ネットワークが出力されます。

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3753744/331dc405-1778-9452-f55d-386a903fc723.png)


### 各ノードの媒介中心性を計算
NetworkXというPythonのネットワーク分析パッケージを用いると、`nx.betweeness_centrality`によって簡単に媒介中心性を求められます。
``` python
# betweenness centralityの計算
betweenness_centrality = nx.betweenness_centrality(G)

print(betweenness_centrality)
```

### 媒介中心性をヒートマップとして可視化
媒介中心性が大きいノードほど赤く、大きくなるようにします。ネットワークの種類やサイズによって、`node_sizes`の`500`の部分は変えても良いかと思います。

``` python
# ヒートマップ表示のためのノード中心性の値を取得
node_centrality_values = list(betweenness_centrality.values())
node_positions = list(betweenness_centrality.keys())

# ノードのサイズと色を媒介中心性に基づいて設定
node_sizes = [v * 500 for v in betweenness_centrality.values()]
node_colors = [v for v in betweenness_centrality.values()]

# 道路グラフネットワーク可視化
fmap = ox.plot_graph_folium(G)
fmap.save(outfile="road_network.html")

opts_heatmap = {"node_size": node_sizes, "bgcolor": "white", "node_color": node_colors, "edge_color": "blue"}
ox.plot_graph(G, show=False, save=True, filepath="road_network_Shimanto.png", **opts_heatmap)
```

実行すると、以下のような出力が得られます。

![四万十市媒介中心性.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3753744/0a4fbd8d-d0da-a006-48e4-80f7d35f8f9c.png)

右下の密集したエリアにヒートマップが集中しているのがわかります。
そして、Google Mapで実際に四万十市の衛星写真を見てみると、媒介中心性が高く表示されていたエリアと市街地がおおよそ一致しているのがわかります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3753744/39949de8-065c-12cf-307c-d539ede1a715.png" width=300px>

## まとめ
今回は、グラフ理論の媒介中心性を用いて、都市の道路網における重要性をヒートマップとして可視化してみました。非常に簡単で、単純な理論やプログラムですが、割と現実と一致しているという興味深い結果が得られました！

より高度な分析には、[Space Syntax理論](https://en.wikipedia.org/wiki/Space_syntax)という理論を用いたものもあります。それについての記事も書いていますので、ぜひそちらもご覧下さい。

https://qiita.com/hiro_tan5/items/16604e51fba56f89c609

https://qiita.com/hiro_tan5/items/7e0176caaa9394c44e75
[^1]:Newman, M. (2018). Networks. Oxford university press.
投稿 71 未経験エンジニア転職するために、資格試験勉強を捨てました 2024/09/09

本日の勉強時間　　２H

# はじめに

こんにちは。miyazakirakeikoです。
僕は現在31歳で未経験WEB系エンジニア転職を目指しています。

その中で、タイトルの通り「何かを捨てるのって大事」ということを実感したので、WEB系への転職をするまでの間。自分が捨てた「資格試験勉強」について紹介しようと思います。


# みなさんは何かを捨てるのは得意ですか？

ちなみに、僕は何かをすてるの超苦手です。
今回自分は応用情報技術者試験の受験を控えていました。

・昨年8月から勉強
・今年4月に受験
→結果午前53%（足切り）
・今年10月分の申込済み
・もち入金済み

# 捨てるのこわい

入金すんでるし、試験の受験料7,500円高いし


# エンジニアに資格は必要、ただし、中上級者に限る

↑にある通り、今の自分には資格試験よりも、ポートフォリオ作成に力を入れるのがいいとわかりました。

この議論って、すごい普段からされているんですけど
この堀口セイト先生の動画に全て詰め込まれています。
ぜひ見てみてください。

<iframe width="560" height="315" src="https://www.youtube.com/embed/IVVfAjqtOus?si=byIn1Wv-L0QbT3QJ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>



さいごにこれも、、、笑。
スティーブジョブスも同じこと言っていました！

<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">【何をしてきたかと同じくらい、「何をしてこなかったか」が大事って話。】1/3 <a href="https://t.co/JqZYYgeYdZ">pic.twitter.com/JqZYYgeYdZ</a></p>&mdash; インベスターZ公式 ｜Kindle本30%ポイント還元フェア開催中 (@investorz_mita) <a href="https://twitter.com/investorz_mita/status/1834155011074658526?ref_src=twsrc%5Etfw">September 12, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
p5.js で呼び出した YouTube動画の再生位置の時間を YouTube の IFrame Player API を使ってキャンバス上に表示

以下の記事にも書いた「YouTube の IFrame Player API」と「p5.js」を組み合わせてみた話の続きです。

●YouTube の IFrame Player API を使って p5.js Web Editor の中に YouTube動画を呼び出す
　https://qiita.com/youtoy/items/90b1ad79291a826aff2b

今回、お試しで実現した内容は以下です（先々月にやっていたけど、記事には書いてなかった...）。

https://x.com/youtoy/status/1817011942491586930

YouTube動画を再生したり停止させたりすると、上記での YouTube動画の真下あたりで「Current Time」と書いてある部分に、動画の再生位置の時間が表示されます。

## 実装した内容
p5.js Web Editor上で実装したコード全体は、以下のとおりです。

基本的な部分（主に setup()内の処理）は、[前回の記事の内容](https://qiita.com/youtoy/items/90b1ad79291a826aff2b)を流用しています。
そこに今回は、再生位置の時間の取得と、取得した時間のキャンバス上への表示を付け加えた形です。

```javascript
let player;
let currentTime = 0;
let isPlaying = false;

function setup() {
  createCanvas(400, 400);

  const scriptTag = createElement("script");
  scriptTag.attribute("src", "https://www.youtube.com/iframe_api");
  scriptTag.parent(select("head"));

  const playerDiv = createDiv();
  playerDiv.id("player");
  playerDiv.position(50, 50);
  select("main").child(playerDiv);

  window.onYouTubeIframeAPIReady = function () {
    player = new YT.Player("player", {
      height: "270",
      width: "480",
      videoId: "s4auEwHEjlQ",
      events: {
        onStateChange: onPlayerStateChange,
      },
    });
  };
}

function draw() {
  background(220);

  if (isPlaying) {
    currentTime = player.getCurrentTime();
  }

  fill(0);
  textSize(30);
  text("Current Time: " + nf(currentTime, 2, 2) + "s", 10, height - 10);
}

function onPlayerStateChange(event) {
  if (event.data === YT.PlayerState.PLAYING) {
    isPlaying = true;
  } else {
    isPlaying = false;
  }
}
```

以下の部分は、ほとんどが前回の記事の内容と同じですが、 `events: { onStateChange: onPlayerStateChange, }` の部分を付け足しています。

```javascript
  window.onYouTubeIframeAPIReady = function () {
    player = new YT.Player("player", {
      height: "270",
      width: "480",
      videoId: "s4auEwHEjlQ",
      events: {
        onStateChange: onPlayerStateChange,
      },
    });
  };
```

また以下の部分は、前回の記事の内容では、特に何らかの実装は加えてなかった部分です（前回の記事だと、背景に色をつける処理を残していたくらい）。

```javascript
function draw() {
  background(220);

  if (isPlaying) {
    currentTime = player.getCurrentTime();
  }

  fill(0);
  textSize(30);
  text("Current Time: " + nf(currentTime, 2, 2) + "s", 10, height - 10);
}

function onPlayerStateChange(event) {
  if (event.data === YT.PlayerState.PLAYING) {
    isPlaying = true;
  } else {
    isPlaying = false;
  }
}
```

draw() の中の処理は、「動画再生中の場合のみ時間情報を取得する」「取得した時間情報をキャンバス上にテキスト表示する」というものです。

また、 ` onPlayerStateChange()` の部分は、動画再生の状態の変化が起こったタイミングで、動画が再生中かどうかを示すフラグを切り替えるというものです。

このような内容で、冒頭で示したような「動画の再生位置の時間を取得して、p5.js のキャンバス上で表示する」ということができました。
wslでmanim その20

# 概要
wslでmanimやってみた。
練習問題やってみた。

# 練習問題
真理値表を表示せよ。



# 成果物

![CreateTableExample_ManimCE_v0.18.1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2c2330f8-ce9f-7b77-9e00-e3962461a296.gif)


# サンプルコード

```

from manim import *

class CreateTableExample(Scene):
	def construct(self):
		table = Table([["0", "0", "0"], ["0", "1", "1"], ["1", "0", "1"], ["1", "1", "0"]], col_labels = [Text("A"), Text("B"), Text("XOR")], include_outer_lines = True)
		self.play(table.create())
		self.wait()



```

以上。
音が降ってくる動画から楽譜作成

## モチベーション
youtubeにあるsynthesiaで生成されたピアノ動画と同じものを弾きたい、となったときに楽譜が公開されていない（購入もできない）、ということは多々ある。自分は楽譜が無いと弾けないので、どうにか**動画から楽譜を作成できないか**と思い試したところ、案外うまくいったので記録を残しておこうと思う。

ちなみにgithubは[こちら](https://github.com/NeoKana/Synthesia2score)。サイトとして公開してみたくて、htmlなど勉強してサイトを作ってみたは良いものの、結局サーバー費用などの関係で公開は泣く泣く断念...。


## 最終目標はmidiファイル生成
まず、楽譜を生成するには音の情報ファイルを用意してmusescoreなどのソフトに読み込ませればよい。音の情報ファイルとしては、midiファイルとmusicxmlファイルを検討してみたが、結局midiファイルを選んだ。

musicxmlは音符の情報を細かく設定できるが、その分四分音符か八分音符かなど自分で特定する必要がある。一方、midiでは音のピッチと開始時間、終了時間を指定すればよいので、よりシンプルでやりやすい。
ただ、これだとグリッサンドなどがうまく表現できないので、より高いクオリティを目指すならmusicxmlを使うべきなのだろう。

とりあえず今回は、**降ってくる各音のピッチとその開始時刻、長さを取得**することを目標とした。

## 簡単な流れ
まず、キーボードの色の変化から判定する方法を考えたが、音が同じピッチで連続しているとき、フレームごとに見てもキーボードの色が変化していなかった。つまり、連続した音は一つの長い音として捉えられてしまう。

そこで、キーボードではなく**降ってくる音の方に着目**することにした。つまり、小節ごとに画像をキャプチャし、各四角を捉え、その横方向の位置からピッチを、縦方向の位置から時間を取得する。長さを時間に変換する際は、一小節が流れ終わるのにかかる時間を利用した。ついでに色も取得し、楽器または右手左手を区別するようにする。（midiファイルでは楽器の種類を指定できる。）

四角を捉える部分はCanny edge detectionを利用。鍵盤の位置は、動画によって異なるので、鍵盤の数と黒鍵白鍵の位置から特定するようにした。オクターブを特定する方法は音源を使用したり、あれば鍵盤上のC3などの文字を利用できるだろうが、そこまでは実装していない。

小節ごとのキャプチャの部分や、四角を上手く捉えて音情報に変換するところは、かなり試行錯誤をしたが、細かい部分は割愛。

①小節ごとにキャプチャ
![test_6.533333333333333.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3689894/a15abe77-6e10-7c3d-9087-4db4a2a9902f.jpeg)

②Canny edge detectionで各音を抽出し、一つずつ処理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3689894/c007dd4b-5554-67b8-5d35-c88f4a47634f.png)

## 最後に
今回、小節ごとに音を処理することで、処理を単純にしていたが、小節を示す線がそもそもない動画、あっても画質が悪く抽出できない動画がかなりあった。
そのような動画に対応する方法も今後検討したい。余裕があれば機械学習とかも使ってみたい。
ハンドの賢さをもっと重視しよう

## 問題提起
- 人型ロボット・双腕ロボットの活用事例が少ないのは、ハンドの賢さが足らないからではなかろうか
- ２足歩行よりも、ハンドの賢さを重視しよう。


#### 触覚の重要性
- 視覚をなくした動物はいるが、触覚をなくした動物はいない。
- 長い時間をかけて見れば、触覚を持っているかのような植物もある。
    - つる植物


## 興味あるハンドの事例
#### FingerVison
https://www.fingervision.jp/

[触覚ハンドで食品を盛付けるロボット、FOOMA JAPAN 2024に登場](https://prtimes.jp/main/html/rd/p/000000021.000095912.html)

#### 近接覚センサ
https://www.thinker-robotics.co.jp/

- [ばら積み部品をまさぐってつかむカメラレスの新型ロボットハンド 「Think Hand F」アルファ版を「2023国際ロボット展」に初出展](https://prtimes.jp/main/html/rd/p/000000022.000106143.html)


## 現状のロボットについての私見
## 人型（少なくとも双腕ロボット）の開発への私見
- 開発資金が継続して得られるような開発のループを回すことこそが、成功させるこつ。
- 1回のトライで実現できない内容を目標に設定すべきではない。
- 例：
　自由度があって、人程度の握力のある人の手の程度ハンド
　難易度が高すぎる。
　仮に高価格で実現できたところで、購入してもらえないため、なかったと同じになってしまう

#### 2足歩行がもたらす欠点
- 手に何かをさせようとした時点で、2足歩行による姿勢の不安定さは問題を引き起こす。
-　車輪で姿勢が安定している方が、手に何かをさせようとするのに向いている。
- 開発資金の大半を2足歩行とそのデモンストレーションに費やしてしまうので、手に何かをさせる余力が失われている。
- 2足歩行をできるロボットにした時点で、ロボット全体の単価を上げてしまうので、導入することができなくなってしまう。
- 明確な目的で作られるロボットに及ばない。
- 例：配膳ロボットと人型ロボット
　人型ロボットに配膳ロボットの代役ができるとは思えない。
　
#### 人型という制約を縛られずに人型を作るべきだということ
- 進化はなりゆきの結果のデザインであることを認めよう
- 脊椎動物では２眼という制約。生物では眼を作るコスト高いために、２眼より増えることがなかった。
- 現在のコンピュータビジョンでは、カメラと画像認識のコストが格段に減少している。
- そのため、カメラの数を増やすという選択枝が可能である。

#### 人の手の形状という制約に縛られすぎずに、用途を開拓していくべきだということ
- 形状・可動域・パワー・触覚・制御・タスク。　これらは連動しながら進化（もしくは退化）してきた。
　バランスを持って開発していきながら、実現できるタスクを増やしていく。
- 触覚と制御がない形状・可動域は実用にならない。
- 展示されている人の手に類した５本指ハンドは、飾ってあるだけ。重すぎてエンドエフェクタとして取り付けるのも困難ということも起こる。
- 耐水性も必要だよね。例：イチゴの収穫。

#### repeatability(繰り返し位置精度)は意味を持たない使い方が増えつつある

用意される環境が、十分に制御された条件から異なってくると、
repeatability(繰り返し位置精度)は意味が少なくなっているんじゃなかろうか。
repeatabilityの意味合いが少なくなれば、ロボットの各軸に剛性を高める必要もないんじゃないだろうか。
タスクをこなせる範囲でハンド・アームを軽く作ることが大事になっているんじゃなかろうか。

# 首という自由度は必要か？
胴体についている腕・手を動かすために、胴体基準の座標系を使用する。

### 首の自由度がもたらすもの
- 胴体基準の座標系と頭部の座標系との変換行列が必要になる。
- 座標変換で必要になるもの
- 頭部座標での点群
- 頭部データでのタイムスタンプ
- 胴体と頭部の相対関係を決める頭部の自由度のパラメータ
- それら自由度のタイムスタンプ

そのタイムスタンプデータでの頭部の姿勢を決めるパラメータ
-> 変換行列
-> 変換後の点群データ


- 頭部のIMUデータ
- 胴体のIMUデータ

#### 欠点
- このために、ただでさえ点群算出のために増えている遅延時間がさらに増えてしまう。
- 変換作業による誤差の累積が増えてしまう。ただでさえ、3D計測は精度を出しにくいのに、その変換作業による誤差が大きくなってしまう。



### 私見：センシングのためには、首という自由度は不要
初代のAtlas に首の自由度はない。胴体の上部に３Dカメラが直接ついている。倒れたときに３Dカメラにぶつけないようにするガードはある。

#### 頭部への３Dカメラを増やしたロボット
https://agilityrobotics.com/products
このロボットには、頭部に複数の3Dカメラを採用している。
しかも、頭部は胴体と連結している。
AWS System Manager Session Managerでローカル環境とRDSを接続したい

# はじめに
[Table Plus](https://tableplus.com/)でAmazon RDSのデータを確認するために、EICE接続を使用してローカル環境とAmazon RDSを接続したのですが、[Prisma Cloud](https://docs.prismacloud.io/en)のアラート`Instances exposed to network trafficfrom the internet`が出てしまいました。
セキュリティグループのインバウンドルールを変更してもアラートが再発したため、SSM接続に変更。
EICE接続とSSM接続の違いについてまとめていきます。

# 接続条件
ローカルではTable Plus、RDSはPostgreSQLを使用しています。
【ポート設定】
Local Port:5433（任意） Remote Port:5432とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3878075/a7eb815b-1793-3d66-acbb-d770fc3e4589.png)


# EICE接続
まずは、現状使用しているEICE接続です。
EC2 Instance Connect Endpoint (EICE)は、パブリックIPアドレスを使用せずに、EC2インスタンスへのSSH接続とRDP接続を行える

:::note info
特徴
セキュリティグループによるポートの開放が必要
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3878075/2d9acaf7-1ffb-6054-95b8-2a894bdf53a8.png)


## 接続手順
ターミナルで
1. AWS access portalのアクセスキーを入力
1. 下記コマンドを入力
```npm
ssh -i ~/.ssh/<作成したキーペア>.pem \
-L 5433:<RDS DB名>.xxxxxx.ap-northeast-1.rds.amazonaws.com:5432 \
ec2-user@i-xxxxxxxxxxx \
-o ProxyCommand='aws ec2-instance-connect open-tunnel --instance-id i-xxxxxxxxxxx'
```

# SSM接続
次にSSM接続です。
Session ManagerはAWS Systems Manager(SSM)の機能の一つで、使用する際はEICE接続で使用していたEC2にアタッチしているセキュリティグループのインバウンドルールは**全て削除します**

:::note info
特徴
- セキュリティグループによるポートの開放が不要
- アクティビティのログが保存可能

:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3878075/18da576a-de69-0e9e-4783-2ecfdd56bc72.png)

## 接続手順
ターミナルで
1. AWS access portalのアクセスキーを入力
1. 下記コマンドを入力
```npm
aws ssm start-session \--target i-xxxxxxxxxxx \
    --document-name AWS-StartPortForwardingSessionToRemoteHost \
    --parameters '{"host":["<RDS名>.xxxxxx.ap-northeast-1.rds.amazonaws.com"],"portNumber":["5432"], "localPortNumber":["5433"]}'
```

# 最後に
ユーザー様に提供できる機能の追加にエクスタシーを感じるけど、セキュリティ面の強化にもエクスタシーを感じていけるように勉強していこう！

# 参考記事
https://dev.classmethod.jp/articles/aws-ssm-support-remote-host-port-forward/
docker daemonのdata directoryを変更する

# DockerのDefaultの data directory

`/var/lib/docker`

# 変更方法

`/etc/docker/daemon.json`に設定を書く

```
vi /etc/docker/daemon.json
```

```json
{
  "data-root": "/mnt/docker-data"
}
```

restart

```
systemctl restart docker
```

# Ref

https://docs.docker.com/engine/daemon/#configuration-file

https://qiita.com/nakamasato/items/b20628546c6e5b32bd8c
【豆知識】条件分岐。if とunless と演算子

# はじめに

現在アプリ開発のカリキュラムに取り組んでいます。今までやったカリキュラムを参考にしつつ条件分岐の書き方？の知識を少しアップデートしておきたいと思います。

## 環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3



## どういう状況だったのか
もともと私が書いていたコードでは自分が投稿したポストに対してもお気に入りボタンが表示されている状態でした。

まぁ、単純に以下のようなコードを書いていたので当たり前といえば当たり前。
```
    <div class="my-auto">
      <%= render 'posts/favorite_buttons', post: post %>
    </div>
```

## unlessを使用したコード
どうすればいいのか色々探ってみるといい例があり次のように変更しました
```
    <div class="my-auto">
      <% unless post.user_id == current_user.id %>
        <%= render 'posts/favorite_buttons', post: post %>
      <% end %>
    </div>
```

`if`ではなく`unless`を使う方法！！


## ちょっと解説
`post.user_id == current_user.id`は「投稿のユーザーIDと現在ログインしているユーザーのIDが同じであるかどうか」を確認しています。

- `post.user_id`: 投稿を作成したユーザーのID。
- `current_user.id`: 現在ログインしているユーザーのID。

この2つが等しい場合（`post.user_id == current_user.id`）、その投稿はログイン中のユーザーが作成したものということになります。

### でも`unless`を使うことで・・・

`unless`は「〜でない場合」という条件を表すため、「`post.user_id == current_user.id`が**成り立たないとき**」つまり「**投稿のユーザーIDと現在ログインしているユーザーのIDが同じでないとき**」に実行されます。


## ifを使用したコード
```
<div class="my-auto">
  <% if post.user_id != current_user.id %>
    <%= render 'posts/favorite_buttons', post: post %>
  <% end %>
</div>
```
- `unless post.user_id == current_user.id`の代わりに、`if post.user_id != current_user.id`と書くことで、「自分の投稿でない場合」にお気に入りボタンを表示する条件を表現しています。
- `!=`は「等しくない」ことを意味する演算子で、`==`の否定となります。


## おまけ
ついでに課題の方もifとunlessで両方比べてみると下記のようになりました
```
<% if current_user.own?(board) %>
  <div class='ms-auto'>
    <%= link_to edit_board_path(board), id: "button-edit-#{board.id}" do %>
      <i class="bi bi-pencil-fill"></i>
    <% end %>
    <%= link_to board_path(board), id: "button-delete-#{board.id}", data: { turbo_method: :delete, turbo_confirm: t('defaults.delete_confirm') } do %>
      <i class="bi bi-trash-fill"></i>
    <% end %>
  </div>
<% else %>
  <%= render 'bookmark_buttons', { board: board } %>
<% end %>
```

```
<% unless current_user.own?(board) %>
  <%= render 'bookmark_buttons', { board: board } %>
<% else %>
  <div class='ms-auto'>
    <%= link_to edit_board_path(board), id: "button-edit-#{board.id}" do %>
      <i class="bi bi-pencil-fill"></i>
    <% end %>
    <%= link_to board_path(board), id: "button-delete-#{board.id}", data: { turbo_method: :delete, turbo_confirm: t('defaults.delete_confirm') } do %>
      <i class="bi bi-trash-fill"></i>
    <% end %>
  </div>
<% end %>
```
`if`では「自分が所有者であれば編集・削除ボタンを表示」
`unless`では「自分がboardの所有者でない場合ブックマークボタンを表示」

動作は同じ。少し論理が反転しただけ。


# さいごに
`unless`と`if`と演算子の組み合わせでこのようなコードの書き方があることを知ることができてよかったです。`if`の方がぱっとみわかりやすいのかな。現場を知らないのでなんとも。
今回の記事が何か参考になれば幸いです。
nandだけで、xorを作ってみる。

# 概要
nandだけで、xorを作ってみる。

# not

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/88d9ae0f-6ec1-e823-9883-686f34ab9e02.png)


# and

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e7de8f86-3117-2282-da98-e5e700aa205d.png)

# or

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/92f99b57-d0ce-501b-bc95-0ba90594063f.png)


# nor

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/898b642d-e116-ab42-bc2a-67850cd099d9.png)


# xor

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1e72c2e0-f03f-78a8-0391-2891ce49463b.png)

コメントにて追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3235973b-bb3c-7a08-4aa6-2a66228c8ae7.png)



以上。
Q. On Click関数のフィールドにスクリプトをアサインしたのに呼び出せる関数がない！A. スクリプトではなく、それをアタッチしたGameObjectをアサインします

## 不具合の内容
ボタンのインスペクタータブにあるOn Clickに
呼び出したい関数が書かれたスクリプトをアサインしたのに
呼び出せる関数がひとつもない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852634/22f0bb80-2c2f-3522-3fb2-f6dd0ba85db0.png)
## 解決方法
スクリプトではなく、
それをアタッチしたGameObjectを
アサインする
## くわしく
アサインする際に、Assetではなく
Sceneから選ぶ必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852634/db6afc4f-61a2-be59-264a-7c84c15d30a2.png)

デフォルトがAssetになっており
なかなかの罠なので、
ヒエラルキータブからD&Dでアサインする方が確実。

フィールドにスクリプトをアサインする
というパターンは稀ということを覚えておこう。


==
コメント歓迎です。
ご指摘をいただけるとうれしいです！
[備忘録] SIGNATE Cup 2024

# はじめに
SIGNATEのコンペティションに参加。
- プロフィール ▶︎ https://qiita.com/yta-m
- 参加コンペ ▶︎ [SIGNATE Cup 2024]( https://signate.jp/competitions/1376 )
- 順位 ▶︎ 87/1226位 (銅メダル獲得)
- 作成したコード ▶︎ Githubの[リポジトリ]( https://github.com/aattyy-102030/Signate/tree/main/SignateCup_2024 )に保存 (2024/10/11現在、非公開中. 申し訳ありません)

# コンペティション概要
旅行会社の保有する顧客データ（属性や志向、営業担当との接触履歴等）を元に、旅行パッケージの成約率を予測するモデルを構築するコンペティション。

詳細は公式HPを参照。

# 流れ
期間は約1ヶ月だったため、1週間ごとに計画を立てた。
- 1週目 ▶︎ 前処理、EDA
- 2週目 ▶︎ 特徴量の作成
- 3週目 ▶︎ 機械学習モデルの選定
- 4週目 ▶︎ ハイパーパラメータチューニング

# 1. 前処理
ここでは表形式で、前処理の概要のみ記載する。
コードはTOP記載のGitHubリポジトリを参照。
- "特徴量" ▶︎ 特徴量の名前
- "処理概要" ▶︎ 前処理の概要。特徴量ごとの処理内容を記載している。
- "Nan値埋め" ▶︎ Nan値をどのように埋めたかを記載している。なお、元のデータ数が小規模なため、行ごと削除する方法は取っていない。

| 特徴量 | 処理概要 | Nan値埋め |
|:-:|:-:|:-:|
| Age | 半角数字(int)への統一 | 平均値(整数) |
| TypeofContact |  ダミー変数化 |  無し |
| CityTier | 無し | 無し |
| DurationOfPitch |  秒数(int)への統一 |  平均値(60刻みで四捨五入) |
| Occupation |  ラベルエンコーディング |  無し |
| Gender | 表記ゆれの修正、ダミー変数化 |  無し |
| NumberOfPersonVisiting | 無し |  無し |
| NumberOfFollowups |  外れ値処理(3桁値を100で割って1桁にする) |  無し |
| ProductPitched |  'Basic', 'Standard', 'SuperDeluxe', 'Deluxe', 'King' に名寄せ(str) |  無し |
| PreferredPropertyStar | 無し |  無し |
| NumberOfTrips | 年での回数に修正(int) | 平均値(整数) |
| Passport | 無し | 無し |
| PitchSatisfactionScore | 無し | 無し |
| Designation | 'VP', 'AVP', 'Senior Manager', 'Manager', 'Executive' に名寄せ後、この順にラベルを付与(int)  | 無し |
| MonthlyIncome | "月収○○万円"のような文字列値含め数値型(int)に修正 | 平均値(整数) |
| customer_info | 以下3つに分割 | 無し |
| ↳婚姻状況 | "未婚", "離婚済み", "結婚済み", "独身" に分類 | 無し |
| ↳車の有無 | 有り:1, 無し:0 に分類 | 無し |
| ↳子供の人数 | 人数を数値型(int)に修正 | 無し |


# 2. モデル選定
LightGBM, XGBoost, CatBoostを試行。
アンサンブルは行わず、どれか1つに絞る方針としていた。

また、検証時はk Foldクラスを用いた.(分割数:10)
(結果提出したのはCatBoostで学習したモデル)

# 3. 特徴量生成
前処理の段階で既に着手していたが、結果としては"customer_info"を"婚姻状況", "車の有無", "子供の人数"に分けることで特徴量を作成した。

# 4. ハイパーパラメータチューニング
(この時点で、機械学習モデルは検証時のスコアより、CatBoostとしていた。)
グリッドリサーチでチューニングした。理由は以下。
- データが比較的小規模であったため
- 計算時間を短縮したかったため

チューニングの対象としたパラメータは以下。
- depth
- learning_rate
- l2_leaf_reg
- iterations
- bagging_temperature
- random_strength

他にもいくつか増やしたがスコアが下がったため、上記とした。

# やりたかったが出来なかったこと
- 機械学習によるMonthlyIncomeのNan値埋め
- アンサンブル学習によるモデル構築

1つ目は時間に余裕が無く、2つ目は自分の知識不足のため着手できず。

# 感想
メダル獲得は素直に嬉しいし、cvスコア・lbスコア・最終スコア全体があまりシェイクしなかったので、そこそこ満足。
だが、トップ層でシェイクダウンがかなり起きており、運営側・参加者共にコンペに対し問題視しているようなので、あまり一喜一憂せず次の学習を進めていきたい。
CodeWars オススメ問題 #3【超入門編】

# はじめに

個人的に好きなアルゴリズム学習サイト「CodeWars」の問題をシェア。

週1くらいのペースで、全10回を目指す予定。

:::note
CodeWarsはいいぞ！の紹介は[こちら](https://qiita.com/kohki_takatama/items/2ae2808b931e943262b8)

CodeWarsの始め方は[こちら](https://qiita.com/javacommons/items/7c473cda7825ab99e08c
)
:::
# オススメ問題

https://www.codewars.com/kata/56dec885c54a926dcd001095/solutions/javascript

### 例
`number`を与えるので、`-number`を返せ、という問題です。

```
1: -1
14: -14
-34: 34
```
### 難易度
分類は 8kyu です。
- アルゴリズム問題の作法を知りたい
- JavaScriptに初めて触れる

という方にちょうどいいと思います。

# オススメの回答
「評価が高い回答」の中から、学びの多い回答をピックアップしてご紹介。

:::note
<details><summary>オーソドックスな解法</summary>

JavaScriptの伝統的な記法です。
```js
function opposite(number) {
  return -number;
}
```
```js
function opposite(number) {
  return number * -1;
}
```
</details>
:::

:::note
<details><summary>アロー関数</summary>

JavaScriptには「アロー関数」という記法があります。

短く書けるのがメリットです。
```js
const opposite = num => -num
```

</details>
:::


# おわりに
以上、CodeWarsオススメ問題でした。
Notionをpdfで出力する際に任意の場所で改ページを入れる方法

## 概要
NotionからpdfをExportができますが、困ったことに表やコードブロックの途中で改ページされてしまって見栄えが悪くなることがあります。
一手間加えてレイアウトを整えたので、以下メモ書きです。

## 方法
1. NotionからHTMLで出力する
この際、`Include content`を`Everything`にするのを忘れずに

2. 出力したhtmlを好きなエディターで開く
3. 2行目以降の適当なところに以下のcssを追加する
    ```
    @media print {
      .page-break {
        break-before: page;
      }
    }
    ```
    <br/>
4. 改ページしたい場所に以下の一行を追加していく
    ```
    <div class="page-break"/>
    ```
    <br/>
5. 任意のブラウザでhtmlファイルを開き、プリント画面でレイアウトを確認
6. フッターとヘッダーを除いてpdfで出力
vim備忘録 2日目

最近はgoogle colabをvim機能で記載したり,vscodeの拡張機能でvim操作をできるようにしたりと日々のエディタにvimが侵食しています.ですが,いまひとつ利便性を感じられないのでこんな機能がないかと思いながら自然と学んでいったコマンドを記載していきます.

## colabにvim機能を追加する方法
右上の設定画面に移動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787219/6e206503-9003-12c7-8267-c8bf38003d07.png)

Editorを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787219/61e70150-76ad-69fb-1425-95c16ccb649b.png)

Editor key bindingsでdefaultからvimに変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787219/b879782e-5c6c-5b6e-4573-1a51ae004699.png)

するとコードスペースの左下に
--NORMAL-- や --INSERT--
という表示が出ます.



## 移動コマンド
### `h` `j` `k` `w`:上下左右の移動
これは使って一週間ほどでやっと慣れてきた感覚です.矢印ではなくこのコマンドを使おうという意識をもって取り組めばいずれは体に染みつくと信じています.


### `G` `gg`:ページの先頭と末尾に移動
Gは覚えやすい位置にキーがあるので触っているうちに使うようになりました.

### `W` `E` `B`:単語単位の移動
左手の各指の押しやすい場所,そしてwebという語呂で単語レベルの移動をするのだと頭にたたきつけて最近やっと使い始めました.

### `o`次の行に移動してinsertモード
このコマンドは多用しています.pythonのデータ分析や機械学習で自動補完が右に複数ある場合などでよく使っていますが皆さんはもっと早い方法を知っているのですかね...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787219/7c12f1ca-5459-c410-6877-0f3f142158f3.png)

### `A`行末に移動してinsertモード
これもなぜか覚えたコマンド.

## コピペコマンド
### `yy` `Y`ヤンク
ヤンクとはコピーのことらしいです.
### `dd` `D`カット
deleteもしてそのままペーストもできる機能なのでDと覚えました.

### `pp` `P`ペースト
pasteそのまんまですね.とても覚えやすいです.



## まとめ
raspberry piの方ではウィンドウ分割やプラグインなどとにかくvim機能をゴリゴリ進めています.まずは日々のコード記述にvimを取り入れる習慣をつけている段階です.
paizaラーニング問題集「2項間漸化式2」を解いてみた

▼感想：

前の問題である 2項間漸化式1 を踏まえて
コードを書くことができました。

▼コード：

```py
########## 処理0(準備) インプット,リスト定義など ###########

x,d = map(int,input().split())

Q = int(input())

########## 処理1 漸化式の定義、計算 ##########

a = [x]*(1000+1)

for i in range(2,1000+1):
    a[i] = a[i-1] + d

########## 処理2 入力kに応じた値を出力 ##########

for _ in range(Q):
    
    k = int(input())
    print(a[k])
```
paizaラーニング問題集「2項間漸化式1」を解いてみた

▼感想：

リストaのインデックスは0から開始にしましたが、
1から開始にするのが正解ですね。
次の問題から意識したいと思います。

▼コード：

```py
########## 処理0(準備) インプット,リスト定義など ###########

x,d,k = map(int,input().split())

########## 処理1 漸化式の定義、計算 ##########

a = [0]*k
    
a[0] = x

for i in range(1,k):
    a[i] = a[i-1] + d

print(a[k-1])
```
kubectl コマンドで cronjob を任意のタイミングで実行する

# 結論
```shell
kubectl create job your-job-name --from=cronjob/your-cronjob-name
```

# 具体例
`user-tracking` という cronjob を任意のタイミングで起動させたい時に使用します。
テスト時に使用したりすることがあります。

```shell
kubectl create job test-user-tracking --from=cronjob/user-tracking
```

`test-user-tracking` の部分は任意の命名で問題ないです。

このコマンドは、CronJobから直接Jobを作成します。
通常、CronJobはスケジュールに従って自動的にJobを作成しますが、
このコマンドを使用すると、そのスケジュールを待たずに、即座にJobを作成して実行できます。

## 作成された job を確認するコマンド
作成された`Job`を確認するためには、以下のコマンドを使用します。

```bash
kubectl get jobs
```

現在の`Kubernetes`クラスタで作成されたすべての`Job`のリストが表示されます。

### 特定のJobの詳細を確認するコマンド
```bash
kubectl describe job your-job-name
```

これにより、`Job`の状態、Podの進行状況、イベント、再試行の回数など、詳細な情報が表示されます。

# job と cronjob の関係性

### Job
一度だけ実行されるタスクです。
Jobは、指定されたタスクが成功するまで再試行を行い、終了するとそのタスクのPodも終了します。

### CronJob
定期的にタスクを実行するためのJobの一種です。
CronJobは、指定されたスケジュールに従ってJobを定期的に生成します。
例えば、毎日決まった時間にバックアップを取るようなタスクに適しています。
CronJobは時間ベースでJobを生成しますが、生成されたJob自体は通常のJobと同様に動作します。