OmniAICreator/Qiita-1.07M huggingface dataset:
conda環境の保存と生成(environment.ymlを使用)

# 検証環境
* conda: 22.9.0
    * `conda --version`でバージョンを確認できる
    * バージョンが異なる場合は、公式ドキュメントの該当バージョンを確認
* linux: Ubuntu 20.04.5 LTS
    * `lsb_release -a`でubuntuのバージョンを確認
    * ほかのOSでは動作を確認していないが、condaのバージョンが同じであれば、動くものと思われる

# 公式ドキュメント
* 詳細は[こちら](https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html)を確認
    * 本記事ではSharing an environmentの項目を参考にしている

# 注意
* 以下の内容は上記の環境を前提にしています
* より新しいcondaのバージョンでは以下のコマンドが動かない可能性があるので、[公式ドキュメント](https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html)を確認することを強く勧めます


# 保存
```terminal:export
conda activate [env_name]
conda env export --from-history > environment.yml
```

# 生成
```terminal:create
conda env create -f environment.yml
```
Automotive Handbook Advent Calendar 2022 満席御礼

Automotive Handbook Advent Calendar 2022

https://qiita.com/advent-calendar/2022/automotivehandbook

を開催することになりました。　

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


幸い、満席をいただきました。ありがとうございました。　

詳細は、順次、閲覧していただいた際に、ご意見をたまわりますようお願いいたします。　

ボッシュ自動車handbook(英語)11版(0-1) 課題と記事一覧new

https://qiita.com/kaizen_nagoya/items/a9d2887bf2a7598dc8e5

の各章を紹介する感じというよりは、
書籍側の課題と、自分の整理の課題の両方を記述して、　
参加者の方からのご意見で解決していこうという、
新しい参加型AdventCalendarを企画しています。


Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642
Management for spark-ignition engines,800
Gasoline-engine operation with alternative fuels, 886
Management for diesel engines, 906
Electrification of the drive, 970
Emission-control and diagnosis legislation, 1042
Chassis systems, 1108
Vehicle bodies, 1310
Comfort and convenience, 1392
Safety systems in the motor vehicle, 1410
Vehicle security systems, 1430
Automotive electrics, 1450
Vehicle electrical systems for hybrid and electric vehicles, 1560
Automotive electronics, 1620
Entertainment 1780
Drive assistance and sensors, 1804
Drive assistance systems 1872
Future of automated driving 1934
Appendics, 1940

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

# 文書履歴(document history)
ver. 0.01 初稿 　20221105
USBの種類の整理

Type-Bがどれだったか忘れてたので、思い出すために
- https://www.softbank.jp/sbnews/entry/20220221_02

#### 概要
- USBとは、ユニバーサル・シリアル・バス（Universal Serial Bus）という規格の略称
- コンピューターに周辺機器を接続するために使用されます。元はマウスやプリンターなど機器ごとに異なる規格のものを使う必要がありましたが、それらの規格を統一しようとUSBが策定された、という歴史があります。

#### USBケーブルは主に7種類
- 7種類だけかー。もっと多い気がしてた

```uml
[] -> USB -> Type-A
[] -> USB -> Type-B
mini -> USB -> Type-B
Micro -> USB Type-B(2.0)
Micro -> USB Type-B(3.0)
[] -> USB -> Type-C
Lightning
```

```
規格を表す「Type」のほかに、「2.0/3.0」と付いているものがあります。
これは規格のバージョンを表しており、数字が大きいほど新しいバージョンであることを示しています。
具体的には、USB3.0はUSB2.0の約10倍もの速さ（理論値の場合）で転送できるなど、転送速度に大きな違いがあります。
端子の一部が白いのがUSB2.0、青いのがUSB3.0と、見分けることができます。
```
ServiceNowのマイクロ資格一覧と取得状況

![FireShot Capture 012 - 技術語り-Tech Blog[JP]_ ServiceNowのマイクロ資格一覧と取得状況_ - tech-software-tokyo.blogspot.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/ac71c5bf-1a8d-0cff-2c16-3c5d1a3ccc7b.png)
---
![スクリーンショット 2022-11-05 135410.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/acfb50f0-cf53-1c2a-c88a-f38fc5e0755a.png)

投稿者は現在、
- Predictive Intelligence
- Agile Development and Test Management
- Welcome to ServiceNow

を取得済み。

## 参考
以下の[個人ブログ](https://tech-software-tokyo.blogspot.com/2022/11/servicenow.html#more)にていろいろと実務上や自主学習での気づきを書いておりますのでご参照ください。

https://www.servicenow.com/community/riseup-with-servicenow-blogs/servicenow-%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%81%AEmvp%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%97%E3%81%9F%E3%81%84-yasutaka-ono-s-story/ba-p/2553376
Railsコマンド備忘録

✨Railsコマンド備忘録

# Railsアプリケーションを作成
% rails new アプリケーション名

# Railsのバージョンを指定してアプリケーションを作成(6.0.0の場合)
% rails _6.0.0_ new アプリケーション名

# オプションを付けてアプリケーションを作成(6.0.0の場合)
% rails _6.0.0_ new アプリケーション名 -オプション名

# データベース管理システムにmysqlを指定
% rails new アプリケーション名 -d mysql

# データベースを作成する
% rails db:create

# ローカルサーバーを起動
% rails s

# 設定されているルーティングを確認
% rails routes

# ファイルを生成する
% rails g ファイルの種類 生成するファイル名

# コントローラーを作成
% rails g controller コントローラー名

# 例）postsコントローラーを作成
% 例）rails g controller posts

# マイグレーションを実行
% rails db:migrate
[2022.11] 開発環境改善する (iterm2他)

業務高速化のために本格的にシェルスクリプトを使っていく。
コマンドをプロンプトにベタがきして修正していくのはたるい。長めのコマンドを打つときは即シェルスクリプトを開いて実行するくらいにしたい。

# iterm2を使用する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/4d82acfd-6eef-0f63-9188-eefdedac9c78.png)

- `cmd + d`で別タブを開ける。
- `cmd + [` と `cmd + ]` でタブを切り替える。
アプリケーション開発の開発工程（リマインドノート）

アプリケーション開発の開発工程（リマインドノート）

↓
①企画：APPの内容を考案
・課題をヒアリングする対象者を選定
例)友人、社会問題を抱える架空の人物など
↓
・対象者の属性をヒアリング
例)性別、年代など
↓
・対象者の抱えている課題を洗い出し
例)学習を継続できないなど
↓
・課題の深掘り
※課題に対し、「なぜ？」を繰り返し、原因を深掘り
例)学習を継続できないの場合
↓
・課題解決をできるAPPの考案
例）APP内容　：　目標のシェアで、ユーザー同士で励まし合えるAPP
↓
・ユーザーストーリーの考案
例）目標シェアのためには？　：　目標管理機能
例）ユーザー同士の励まし合いは？　：　ユーザー管理機能、コメント管理機能
↓
・+＠の考案
例）より便利にするには？　：　フォロー管理機能、お気に入り管理機能
例）ユーザーを増やすには？　：　SNSログイン機能、SNS共有機能
例）マネタイズ化するには？　：　投げ銭システム管理機能

↓
②要件定義：APPの仕様と要件の洗い出し
「機能（大分類）」：実装したい機能を大小で分ける。
「機能（小分類）」：実装したい機能を大小で分ける。
「要件」：機能の要件を箇条書きで整理
「所要時間の目安」：見積もり時間
「優先順位」：実装の優先順位を概略記入する。
※優先順位で意識するポイント
・その機能がAPPの成立する上で重要か？：例えば、メモAPPにメモ機能がないと成立しない。
・解決したい課題との関連度：企画で決めた課題にどれぐらい影響するか
・実装時間は十分か？：そもそも時間がないと、誰かに見てもらえるAPPにならない。

↓
③設計：開発に必要なDBと画面遷移の設計
・DB設計：draw.ioなどを使い、ER図作成
↓
・画面遷移図作成：draw.ioなどを使う。
↓
・フロントデザインを書き出してみる：手書きでOK。時間をかけすぎないこと。

↓
④開発：プログラミング言語を使用し、開発
・タスク管理：GitHubプロジェクトボードなどでタスク管理
・コミットはこまめ：機能完成後、一気にコミットを行うのではなく、作業単位でこまめにコミット
・フロントのマークアップに時間をかけすぎないように注意：サーバーサイドを実装する時間が減り、APPの完成ができなくなってしまう恐れがあり
※bootstrapなど、ツールの利用もありだが、使いこなすまで時間が必要の為、スケジュールを確認
・むやみに不慣れな言語は使用しない：時間がかかってしまう恐れがある。
★デプロイは先に行う：最初からコードをGitHubで管理することと同時に、1つの機能が作り終わったタイミングで、デプロイを実施。
※まとめてするとトラブルの原因になる恐れあり。
★エラー発生時は、質問してみる
※Teratail,MENTAなど

↓
⑤テスト：開発した機能のテスト実施や品質検証
・単体テストコードや統合テストコードを記述：実装した機能ごとに、必ずテストを実施（APPの品質を担保のため）

↓
⑥運用/保守：リリース後のバグ対処や追加機能実装
・時間に余裕を持ってデプロイ、挙動確認を実施：機能ごとにこまめにデプロイを実施し、その都度必ず本番環境での挙動確認を実施
・エラーが起きる・意図しない挙動が起きる場合は、デプロイログを参考にコード修正を実施
VSCodeのターミナルでコピペを簡単に

VSCodeのターミナルをコピーに何度も失敗したので。。

# ターミナルの選択でコピー
1. ファイル＞ユーザー設定＞設定＞機能＞ターミナル
1. 「Copy On Selection」(ターミナルで選択したテキストをクリップボードにコピーするかどうか制御します)にチェックを入れる。


# 右クリックで貼り付け
1. ファイル＞ユーザー設定＞設定＞機能＞ターミナル
1. 「Right Click Behavior」(右クリックに対するターミナルの反応を制御します)にチェックを入れる。

----
素早くターミナルとエディタを行き来する方法。
キーボードショートカットで次の設定を。

- Terminal: Focus Terminal
  - キーバインド：`Ctrl + ; `
  - いつ：`editorTextFocus`
- Focus First Editor Group
  - キーバインド：`Ctrl + ;`
  - いつ：`terminalFocus`
実践編勉強会_20221120

## 本日の内容

- 受講生への共有事項
    - 営業サポートについて
- フリーエンジニアになるために最低限必要なこと
- rubocopの使い方
- DBツールについて
- 時間があったら


## 受講生への共有事項

- 営業サポートについて
    - 人工インターン経験が6ヶ月を経過したら営業サポートが受けられます。
    - 営業サポート開始〜案件の獲得までは最低2ヶ月程度みておいてください。
    - 営業サポートへのご案内はこちらからは行っていません。そのため「そろそろ案件探しに入りたい」というタイミングになったら受講生から→スタッフ江草まで「営業サポート希望」のご連絡をお願いします。

### 〜推奨〜

プライベートや現職の都合で「ある決まった時期までフリーエンジになれない」という方以外は、少々自分の技術力に自信がなくても早めにフリーエンジニアとして現場に出ることをお勧めします。

なぜなら「現場でのチーム開発は効率良くプログラミングスキルを上げれられる絶好のチャンスだから」です💪
（プログラミングを本業にしてしまえば一日中プログラミングができます）

フリーエンジエンジニアとして報酬をいただきながら、次の現場での単価UPを狙っていきましょう。
単価を上げるためには半年〜1年程度で次の現場へ移るのがポイントです。


## フリーエンジニアになるために最低限必要なこと

- Rubyが書ける
    - [現場で意外と出番が多いなと感じたこと] 配列の操作、hash配列の操作
    ```
    # 配列
    ['a', 'b', 'c']

    # hash配列
    [
        { name: 'suzuki', age: '20', address: 'tokyo' },
        { name: 'tanaka', age: '39', address: 'tokyo' },
        { name: 'watanabe', age: '35', address: 'kanagawa' }
    ]
    ```
- Railsが書ける
    - DRYなコード, メンテしやすい, 何をしているかがわかりやすい(読みやすい)メソッド名, 適度に[#コメント]を残す
- 未経験のgemを、gemのREAD MEや公式ドキュメントを読みながら使用することができる
- 既存コード(他人が実装したコード)を読むことができる（現場に入ったらまずこれ）
- 環境構築ができる
    - 最近はDockerが使われている現場が多い
        - Dockerの設定(Docker.file, docker-compose.ymlの記述)はできなくてもDockerコマンドが使えればひとまずOK
    - ちなみに環境構築の手順は現場ごとにマニュアルが準備されていることが多い
    - 環境構築のマニュアルがない現場は他のドキュメントも揃っていない可能性大。このような現場で積極的にドキュメントを用意してあげるとPMや自分より後から入るメンバーに喜ばれると思います
- 文字(チャット)を使ったコミュニケーションができる（要件を簡潔に伝える）
- 口頭でのコミュニケーションができる（要件を簡潔に伝える）
    - ダラダラと回りくどい話し方は嫌がられる
- 進捗報告ができる（予定期日より遅れそうな時こそ報告が大事）

- Gitが使える（Git操作は基本中の基本）
    - commit, push, コンフリクト修正, PR作成 etc.
    - 自分以外の人が作ったリモートブランチをローカルにコピーする
    - 必要なコミットだけcherry-pickする
- RSpecが書ける
    - 人工インターンで少し触れておき、現場では調べながら書ければOK
- ある程度の自己解決能力（現場のエンジニアは皆自分のタスクで忙しいので、自分の問題はできるだけ自分で解決を目指す） 

---

フリーエンジニア養成コースを修了したばかりのレベル感のエンジニアに、Dockerの設定やインフラ関連(AWS)の設定を任せることは基本的にはありません。

既にRailsをある程度攻略して余裕のある方は今の段階からどんどんAWSやフロント技術(React、Vue)に挑戦するのも良いですが、そうでない方はまずはRailsエンジニアとして現場に出ることを目指しましょう。


## rubocop の使い方
...その前にVSCodeでの便利な検索方法について共有

rubocopとは？
Lintツールのこと。
事前に設定したコーディングルールをコマンド実行により自動で確認してくれる便利なもの。

例)
- '(シングルクォート)ではなく"(ダブルクォート)を使いましょう
- 一行は100文字以内としましょう
- ブロックは {} ではなく do end で囲いましょう

これらのルールは
.rubocop.yml　に定義されています。

--- コマンド$rubocop 実行でrubocopに怒られたら? ---
rubocop.ymlに記載されているルールに沿って自分の記述を修正します。

--- もしどうしてもルールを守れない場合は? ---
該当の記述箇所のみrubocopチェックをスルーする記述を追加する。
https://qiita.com/tbpgr/items/a9000c5c6fa92a46c206

※このような場合に .rubocop.yml に定義されているルール自体を書き換えるのは基本的にはNGです。
ルール自体を書き換えてしまうとルールの意味がなくなってしまうからです。

## DBツールの話

DBツールとは？

DBのデータを見やすくしてくれるGUIツール。
rails cを起動しなくてもDBの中にどのようなデータが入っているか確認することができる。
現場でよく使う。

- 例)Sequel Ace（まずはPCにインストール）
- Docker起動してからSequel Aceを起動
- 設定追加したらconnect実行

[注意点]
DBツール（今回の場合はSequel Ace）からは基本的にはデータのcreate, update, deleteは行わないようにしましょう。

Railsプロジェクトであれば、データの操作はrails cから行うことが推奨されます。

さてなぜでしょう？

## 時間があったら
https://qiita.com/Tech_Leaders/private/b8538f4f7db28aa35da2
AccessのVBAでファイル数カウント（特定の拡張子に絞ったカウントについても）

# FileSystemObjectを使用

下記の理由がある為、Dir()は使わずFileSystemObjectを使います。

https://qiita.com/waokitsune/items/58a155414433fd6746a8

# 参照設定

FileSystemObjectを使えるようにMicrosoft Scripting Runtimeを参照。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/10b80102-ddf0-1877-21f8-cbf7b5ece213.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b4972065-e3c7-218d-29e7-bfa0d27343ca.png)

Microsoft Scripting Runtimeの参照設定をしなくてもFileSystemObjectを使う方法はあります。
ですが、下記のようなメリットがある為、個人的には参照設定して使うのがおススメです。

* コンパイルチェックで入力ミスをあぶりだせる
* Ctrl + スペースで候補が出てきてコーディングが楽


# やり方（とにかく全ファイル）

```vb
Dim fso_ As New Scripting.FileSystemObject
Debug.Print fso_.GetFolder("フォルダーパス").Files.Count
```

GetFolder()について、フォルダーパスの末尾に『\』が付いても、付いていなくても、どちらでも動作に変わりは無い。

存在しないフォルダーを指定した場合は下記の例外。

> 実行時エラー76
> パスが見つかりません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/02b00e48-64c6-fafc-9f6d-db80c66772be.png)

# やり方（特定の拡張子のファイル）

```vb
Dim fso_ As New Scripting.FileSystemObject
Dim file_ As Scripting.File
Dim count_ As Long: count_ = 0
    
For Each file_ In fso_.GetFolder("フォルダーパス").Files
    If fso_.GetExtensionName(file_) = "csv" Then
        count_ = count_ + 1
    End If
Next
    
Debug.Print count_
```

```GetExtensionName()``` で取得できる文字列に『.』は付かない。

# 蛇足

特定の拡張子のファイル数を取りたい時、For Each回すのは若干面倒。
ワイルドカードでサクッとカウント取る方法が見つからなかった…。

でもあらかじめFor Eachで作っておくと、『ファイル作成日』や『その他の属性』によって条件分岐したい、なんて要件が出てきた時は楽。

# 参考サイトさん

https://officedic.com/excel-vba-fsofolder-file-count/

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.2130
Microsoft Access for Microsoft 365 MSO (バージョン 2209 ビルド 16.0.15726.20068) 32 ビット
PHPのクラスについて

## はじめに

日本システム開発株式会社の藤井といいます。
タイトルにもあるようにクラスについてまとめました。
クラスとは？より、PHPのクラスについての内容になっています。

## オブジェクトについて

オブジェクトは他の言語の参照と同じように扱えます。

`$obj = new StdClass()`を実行すると、`$obj`にはオブジェクトのIDが代入されます。
`$obj`を他の変数に代入すると、オブジェクトのIDがコピーされます。
`$obj`には、オブジェクトのIDが代入されているため、nullを再代入してもオブジェクトは消えません。(他の言語の参照と同じ動作です)

```php
<?php
$obj = new StdClass();
var_dump($obj);
$obj2 = $obj;
$obj = null;
var_dump($obj2);
```

## プロパティに代入した無名関数の呼び出し

PHPはプロパティへのアクセス、メソッドへのアクセスをコンテキストによって判断します。
「()」がついた呼び出しはメソッドへのアクセス、それ以外はプロパティへのアクセスと判断します。
そのため、プロパティに無名関数を代入すると、直接呼び出すことができなくなります。(一度、変数に代入する必要がある)

ワンラインでプロパティに代入した無名関数を呼び出すには、
`($obj->closure)()`で、プロパティにアクセスしてから呼び出します。

```php
<?php
$obj = new StdClass();
$obj->closure = function() {echo "hello";};
($obj->closure)();
```

## 静的遅延束縛

静的遅延束縛は「staticキーワード」と「スコープ定義演算子」を使います。
静的遅延束縛を使うと、親クラスから子クラスのメソッドを呼び出すことができます。

```php
<?php
class Hoge {
    public static function func1() {
        static::func2();
    }
}
class Huga extends Hoge {
    public static function func2() {
        echo "Huga::func2" . PHP_EOL;
    }
}

Huga::func1();
```

staticキーワードは、直近の非転送コール(転送コール以外)に解決されます。
転送コールとは、「self」「parent」「static」を使った呼び出しを指します。
上記の例では、`static::func2();`にとって、`Huga::func1();`が直近の非転送コールにあたるため、`static`が`Huga`に解決されます。

## まとめ

- オブジェクトをインスタンス化すると、変数にはオブジェクトのIDが代入される
- PHPは、プロパティへのアクセス、メソッドへのアクセスをコンテキストで判断する
- 静的遅延束縛を使うと、親クラスから子クラスのメソッドを呼び出すことができる
【C++】文字列から文字を探すプログラム➀

## 「特定の◯◯」シリーズ
標準入力によって得られた３つの整数から、特定の数字が含まれていないものを選ぶプログラムを作りました。まず最初に含まない数字を、以降に候補の数字３つを、それぞれスペース区切りで順番に入力して、コンパイル・実行します。

### coutの置き場所で悩む
このプログラムはとにかく、for文からcoutへの移行を考えるのが難しかったです。

```:間違ったプログラム
#include <iostream>
#include <string>
using namespace std;

int main(){
	
	int NN_num, number[100];
	cin >> NN_num;
	
	for(int i = 0; i < 3; i++){
		cin >> number[i];
	}
	
	string NN_num_str = to_string(NN_num), buf[100];
	
	for(int j = 0; j < 3; j++){
		buf[j] = to_string(number[j]);
		int n = 0;
		while(n < buf[j].length()){
			string str(buf[j], n, 1);
			if(str == NN_num_str){
				break;
			}else{
				
			}
			cout << buf[j] << endl;
			n++;
		}
	}
	
}
```

そのままcoutを置くとアウトのものどころか同じ数字が何個も出てきて、おかしい結果になりました。

しばらく考えた後、coutの処理を**無事に文字列の最後に来たらさせる**事を思いつき、今度はif文の形でwhile文の中に入れました。

```c++:正常に動いたプログラム
	for(int j = 0; j < 3; j++){
		buf[j] = to_string(number[j]);
		int n = 0;
		while(n < buf[j].length()){
			string str(buf[j], n, 1);
			if(str == NN_num_str){
				break;   //str＝NN_num_strであればwhile文を抜けて、その文字列の調査を終了する
			}else{
				if(n == buf[j].length() - 1){   //str≠NN_num_strだった時、もしそこで文字列の末端まで来ていたら出力表示する
					cout << buf[j] << endl;
				}
			}
			n++;
		}
	}
```

この書き方だとうまくいきました。
3を含んではならない文字とし、18, 23, 99の組み合わせで試してみると、18と99のみが出てきました。23は期待通り、除外されていました。

### atoiを使う・避ける
あとは、文字列として調べるために一度数値をstring型に変換しているので、出力前に数値に戻さなければなりません。そこで、今までの僕ならatoiでポン！と熟すところを、atoiを使うリスクを[以前の記事](URL "タイトル")でも学んだので、strtol (今回はC++なのでstol) を代用する方法で考えてみました。
stolには、第１引数に「変換したい文字列」、第２引数に「”最初に現れた不正な文字を指すポインタ” を格納するためのアドレス」、第３引数に「変換した際の進数」をそれぞれ入れます。実行すると、第１引数の文字列をlong型の数値に変換した結果が返されます。

簡潔にまとめたいので、不正アドレス云々には触れません。

```c++
		while(n < buf[j].length()){
			string str(buf[j], n, 1);
			if(str == NN_num_str){
				break;
			}else{
				if(n == buf[j].length() - 1){
					long num = stol(buf[j], NULL, 10);   //string型からlong型へ
					cout << num << endl;
				}
			}
			n++;
		}
```

上のように書く事で、出力結果は数値として表示されます。

参考記事：

https://daeudaeu.com/strto/

https://cpprefjp.github.io/reference/string/stol.html

以上、これらをまとめてプログラムを作り直してみます。

```c++:完成プログラム
#include <iostream>
#include <string>
using namespace std;

int main(){
	
	int NN_num, number[100];   //NN_num：含まない数字, number：調査する数値
	cin >> NN_num;
	
	for(int i = 0; i < 3; i++){
		cin >> number[i];
	}
	
	string NN_num_str = to_string(NN_num), buf[100];
	
	for(int j = 0; j < 3; j++){
		buf[j] = to_string(number[j]);
		int n = 0;
		while(n < buf[j].length()){
			string str(buf[j], n, 1);
			if(str == NN_num_str){
				break;   //str＝NN_num_strであればwhile文を抜けて、その文字列の調査を終了する
			}else{
				if(n == buf[j].length() - 1){   //str≠NN_num_strだった時、もしそこで文字列の末端まで来ていたら出力表示する
					long num = stol(buf[j], NULL, 10);   //string型からlong型へ変換
					cout << num << endl;
				}
			}
			n++;
		}
	}
	
}
```

僕の環境では正常に動きました。

## まとめ
過去に頂いたアドバイスを活かしてみると、より完成度の高いプログラムになり、とてもモチベーションが湧いてきました。
一方、結局は単純なミスだった些細な点で長い時間悩み続けていたので、その部分は早急に解決しなければと思いました。
【随時更新】セキュリティ関連リンク集


## Framework

- [Cybersecurity Framework | NIST](https://www.nist.gov/cyberframework)
- [CIS Critical Security Controls](https://www.cisecurity.org/controls/)
- [How to Become FedRAMP Authorized | FedRAMP.gov](https://www.fedramp.gov/)

## Roadmap

- [産業横断 人材定義リファレンス | 産業横断サイバーセキュリティ検討会](https://cyber-risk.or.jp/contents/)
- [セキュリティ知識分野（SecBoK）人材スキルマップ2021年版](https://www.jnsa.org/result/skillmap/)
- [Cyber Security Skills Roadmap | SANS Institute: Cyber Security Skills Roadmap](https://www.sans.org/cyber-security-skills-roadmap/)

## Secure by Design

- [情報セキュリティを企画・設計段階から 確保するための方策に係る検討会 報告書](https://www.nisc.go.jp/active/general/pdf/SBD_report.pdf)
- [IPA, セキュリティ・バイ・デザイン入門](https://www.ipa.go.jp/files/000055823.pdf)

## 脅威情報

- [MITRE ATT&CK®](https://attack.mitre.org/)
- [Cybersecurity & Compliance Solutions & Services | Rapid7](https://www.rapid7.com/)

## Threat Modeling

- [脅威 - Microsoft Threat Modeling Tool - Azure | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/security/develop/threat-modeling-tool-threats)
- [The Pyramid of Pain | Enterprise Detection & Response](https://detect-respond.blogspot.com/2013/03/the-pyramid-of-pain.html)
- [CIS Critical Security Controls](https://www.cisecurity.org/controls/)

## Security

- [総務省｜サイバーセキュリティタスクフォース｜サイバーセキュリティタスクフォース](https://www.soumu.go.jp/main_sosiki/kenkyu/cybersecurity_taskforce/index.html)
- [内閣サイバーセキュリティセンター](https://www.nisc.go.jp/)
- [IPA 独立行政法人 情報処理推進機構：情報セキュリティ](https://www.ipa.go.jp/security/index.html)

### Cloud Security

- [Security Strategies for Microservices-based Application Systems](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-204.pdf)
- [情報セキュリティサービス基準適合サービスリストの公開：IPA 独立行政法人 情報処理推進機構](https://www.ipa.go.jp/security/it-service/service_list.html)
- [政府情報システムのためのセキュリティ評価制度（ISMAP）](https://www.ismap.go.jp/csm)
- [サイバーセキュリティ | Policy(提言・報告書) | 一般社団法人 日本経済団体連合会 / Keidanren](https://www.keidanren.or.jp/policy/cybersecurity.html)

### IT Secutiry


### IoT Security

- [IoTセキュリティチェックリスト](https://www.jpcert.or.jp/research/IoT-SecurityCheckList.html)
- [ソフトウェア出荷判定セキュリティ基準チェックリスト「Ver.1.2」発表 | SAJ 一般社団法人ソフトウェア協会](https://www.saj.or.jp/NEWS/pr/201201_sec-release-decision.html)
- [サイバーセキュリティタスクフォース, IoT・5G セキュリティ総合対策 2020](https://www.soumu.go.jp/main_content/000698567.pdf)

### OT Security

- [産業サイバーセキュリティ研究会 （METI/経済産業省）](https://www.meti.go.jp/shingikai/mono_info_service/sangyo_cyber/index.html)
【Swift】NWPathMonitorを使用したインターネット接続の確認方法

Appleの<font color="#A276E4">**Network**</font>フレームワークは、ネットワークデータを扱うための便利なクラスを多数提供しており、その中にはネットワークのアクセス性を監視するために特別に設計されたクラスもあります。<font color="#A276E4">**NWPathMonitor**</font>です。もしあなたがAppleの古い`Reachability`システムを使ったことがあるなら、<font color="#A276E4">**NWPathMonitor**</font>はそれを完全に置き換える形となります。

:::note warn
重要： この記事を投稿したのが2020年3月26日（木）で自身の法人サイトの方でしたけれども、公式サイトの更新などでブログ系のメンテナンスが大変だったので、ここに過去の投稿の移動とこれからの記事を投稿をする予定です。
:::

まず始めに、<font color="#A276E4">**Network**</font>フレームワークのインポートを追加します。

```swift
import Network
```

次に、すぐに解放されない場所に<font color="#A276E4">**NWPathMonitor**</font>のインスタンスを作成します。例えば、ビューコントローラのプロパティとして持つ場合など

```swift
let monitor = NWPathMonitor()
```

次に、ネットワークアクセスが変更されたときにトリガーされるクロージャを、この監視に割り当てます。これは、現在可能なネットワークアクセスを記述した<font color="#A276E4">**NWPath**</font>を1つのパラメータとして受け取る必要があります。

<font color="#A276E4">**NWPath**</font>にはいくつかのプロパティがありますが、特に気になるのは次の2つでしょう。`status`は現在接続可能かどうかを表し、`isExpensive`は携帯電話データを使用する場合、またはiPhoneの携帯電話接続を経由してホットスポットされたWiFiを使用する場合に<font color="#C93E3F">**true**</font>に設定されます。

これを試すために、ユーザーの接続状態が変化したときにメッセージを表示し、さらにその接続が高価とみなされるか否かを表示するコードを以下に示します。

```swift
monitor.pathUpdateHandler = { path in
    if path.status == .satisfied {
        print("通信可能です!")
    } else {
        print("通信不可能です。")
    }

    print(path.isExpensive)
}
```

このクロージャは、接続状態が変わるたびに呼び出されることを覚えておいてください。

パス監視を作成し、設定したら、最後のステップとして、監視を実行するためのカスタム <font color="#A276E4">**DispatchQueue**</font> インスタンスを作成し、その <font color="#C93E3F">**start()**</font> メソッドを呼び出します。

```swift
let queue = DispatchQueue(label: "Monitor")
monitor.start(queue: queue)
```

これが完了すると、接続状態が変わるたびにクロージャが呼び出されるので、そこにコードを追加して、アプリの残りの部分を現在の接続状態で更新することができます。

ネットワークチェックをより細かく制御したい場合は、特定のインターフェースタイプを使用して<font color="#A276E4">**NWPathMonitor**</font>を作成することができます。例えば、特に携帯電話の通信状態をチェックしたい、携帯電話の通信状態だけをチェックしたい場合は、次のように記述します。

```swift
let cellMonitor = NWPathMonitor(requiredInterfaceType: .cellular)
```

`.wifi`や`wiredEthernet`を使用することも可能です。インターフェイスの種類を省略すると、それらすべてが同時に監視されるようになります。
Salesforce初期設定02～不要なデフォルトアプリケーション非表示～

こんにちは

Salesforce初期設定でやるべき内容を説明します

今回はアプリケーションの非表示です

今回の内容は動画でも公開されています

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

<iframe width="560" height="315" src="https://www.youtube.com/embed/IUrHvHPHQl0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>



アプリケーションとは、こちら左上の9個の丸をクリックしたときに表示されるものです

![アプリケーション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ae705fc8-fbf7-b42b-e540-80577dc1f512.png)

こちらについて不要なアプリケーションは見せなくすることが可能です

設定方法としては右上の歯車マークから「設定」をクリックします

その後、「アプリケーションマネージャー」と虫眼鏡に入力して、非表示にしたいアプリケーションに▽ボタンをクリックして編集します

すべてのプロファイルで非表示設定にすることで表示をさせないことが可能です


ぜひ皆様のSalesforce環境で不要なアプリケーションが見えていましたら、隠してみてください。
CodeIQ:パスカルの　三角形では　ありません（字余り）の解答

@nabetaniさんのCodeIQの問題です
問題と解説はこちら
->https://nabetani.hatenablog.com/entry/2016/09/06/193540

一行目では左からn番目の数(n)は(n)=(n-2)+(n-1)です。二行目で上の数式との差を見ると、
左からn番目上からm番目の数(n,m)は(n,m)=(n,m-1)+(n-2,m)+(n-1,m)であると推定されます。
他の行でも確認して当てはまることがわかります。
テストケースがみつからないのですが、問題の表に出ている範囲で確認しました。
比較的単純な漸化式ですので、入力値が大きくなっても問題ないでしょう。
テストケースはZzまであるらしいのですが、その場合メモ化が必要になります。
functor/3,twoar/3,data29/4がメモ化関連です。（1x1～26x26まで可能）
アルファベットの入力を数に変換する部分は省いています。
実行例：solv29(20,26,R).
　　　　あるいは先頭のコメントを外して実行

%SWI-Prolog version 7.4.2,7.6.4
```Prolog
%:- initialization(start).  %ideone
%start.
twoar(_,0,_).      % two dimension array
twoar(F,X,Y) :- arg(X,F,V), functor(V,y,Y), X1 is X-1, twoar(F,X1,Y).
data29(_,0,_,0) :- !.
data29(_,_,0,0) :- !.
data29(F,X,Y,V) :- arg(X,F,V1),arg(Y,V1,V).
npas(1,_,_,1) :- !.
npas(X,Y,F,R) :-
     data29(F,X,Y,R1), (nonvar(R1) -> R = R1 ; (Y1 is Y-1, X1 is X-1, X2 is X1-1,
     npas(X1,Y,F,R3), npas(X2,Y,F,R2), npas(X,Y1,F,R4), R is R4+R2+R3, data29(F,X,Y,R))), !.    %Dd=Dc+Bd+Cd

solv29(X,Y,R) :- functor(F,x,26), twoar(F,26,26), npas(Y,X,F,R), write(R), !.

start :- N=8, numlist(1,N,L), member(X,L), member(Y,L), solv29(X,Y,_), (Y =:= N -> nl ; write(",")), fail.
start.

```
laravel carbon formatはstringになる

# 概要

- carbonにてformat('Y')とするとstringで出力される。ちょっと詰まったのでまとめておく。

# まとめ

- まずは下記のようにCarbonかCarbonImmutableのインスタンスを作る。

    ```php
    use Carbon;
    use Carbon\CarbonImmutable;
    $c = Carbon::now(); // もしくは $c = CarbonImmutable::now();
    ```

- formatメソッドを用いて年を出力してみる。string型で出力される。

    ```php
    var_dump($c->format('Y'));
    // string(4) "2022"
    ```

- yearプロパティを用いて年を出力してみる。int型で出力される。

    ```php
    var_dump($c->year);
    // int(2022)
    ```

# ちなみに

- monthプロパティで一桁月を出力すると0埋めされない。

    ```php
    $c = new Carbon('2022-01-01');
    var_dump($c->month);
    // int(1)
    ```
Streamlitで自由に入力フォームを追加/削除できるUIを実現する

こんにちは。たぶん初投稿です。

今回はPythonコードだけでWebアプリが作れる[Streamlit](https://streamlit.io)で
入力フォームを追加/削除できるUIを考えていきます。

# 環境
```
Python 3.10.6
Streamlit 1.11.1
```

# 概要
Streamlitでは文字列や数値などの入力フォームが用意されています。
公開されている[Streamlitデモアプリ](https://streamlit.io/gallery)を見ると、入力フォームの数は固定になっているものがほとんどです。
入力フォームの数を可変にしたい場合もあると思い、入力フォームの数をユーザ側の操作に応じて変更できるデモアプリをつくってみました。

#  できあがったもの
早速ですができあがったものはこちらになります。
![demo_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414198/4ab1a0f0-5fc4-620d-05e1-0702f03f94fb.gif)

https://nockn-streamlit-example-unlimited-forms-streamlit-app-zjujcz.streamlit.app

ソースコードは下記の通りです。
```python
import streamlit as st

st.set_page_config("Unlimited forms demo")

if "list" not in st.session_state:
    st.session_state.list = [0]

st.info("Sums the numbers entered.")

with st.form("form"):
    st_input_area = st.container()
    st_add_button_area = st.container()

    if st_add_button_area.form_submit_button("ADD FORM"):
        st.session_state.list.append(0)

    if st_add_button_area.form_submit_button("REMOVE FORM"):
        del st.session_state.list[-1]

    for i in range(len(st.session_state.list)):
        st.session_state.list[i] = st_input_area.number_input(f"Value {i+1}", step=1, key=i)

    is_calc = st.form_submit_button("DONE")

if is_calc:
    sum = 0
    for _value in st.session_state.list:
        sum += _value
    st.success(f"Total: {sum}")
else:
    pass  # DO NOTHING

```



## 解説
### Streamlitの動作の特徴
Streamlitの特徴として、UIを操作するとコードが再実行し直されます。
例えば、以下はボタンをクリックすると数字が加算されるプログラムです。

```python
import streamlit as st

temp = 0

if st.button("+1"):
    temp += 1

st.write(temp)
```

Streamlitの場合、ボタンを押すと
1. 変数の宣言
1. ボタンの押下に伴う処理
1. 加算後の結果表示

が一度に行われます。
したがってボタンを何回クリックしても、そのたびに変数が再宣言されるため、常にボタンを1回押した値にしかなりません。
![demo_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414198/b9a83346-67ca-c643-9827-73b9955b42bd.gif)


Streamlitにはそうした再実行に対処するために[st.session_state](https://docs.streamlit.io/library/api-reference/session-state)という機能があります。
これは変数の値を保持し続ける機能です。
以下のように宣言をします。
```python
if "var" not in st.session_state:
    st.session_state.var = 0
```

st.session_stateを組み合わせることで、変数の再宣言が行われずにボタンを押すたびに数を足す動作ができるようになります。

```python
import streamlit as st

if "temp" not in st.session_state:
    st.session_state.temp = 0

if st.button("+1"):
    st.session_state.temp += 1

st.write(st.session_state.temp)
```

![demo_3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414198/227dbf4a-2f59-5a7c-6e64-a41f4c96a1cb.gif)


### デモアプリの解説
Streamlitの再実行とst.session_stateの説明をしました。
デモアプリではst.session_stateでlist（配列）を宣言し、listの要素数に応じた入力フォームを表示させています。
そしてユーザがlistの要素数を操作できるようにすることによって、
入力フォームの追加/削除を実現しています。

処理の流れとしては、
1. listの要素数を操作
2. 要素数に応じた入力フォームを表示

となります。
デモアプリでは要素の配置を
1. 入力フォーム
2. 要素数の操作UI

という順にしたかったため、[st.container()](https://docs.streamlit.io/library/api-reference/layout/st.container)というStreamlit要素の配置場所を操作できる機能を使って、
処理順は、要素数の操作→入力フォーム表示 で
表示順は、入力フォーム→要素数の操作 を実現しています。

# さいごに
Streamlitで入力フォームをユーザが自由に追加/削除できるアプリを実装してみました。
Streamlitは簡単にWebアプリが実装できますが、そのぶん制約が多いです。
ただ機能を組み合わせてみることで柔軟なUIが実現できます。
~~（そこまでするならDjangoとかに手を出したほうがいい気もする）~~
[vue-tsc / Volar] props に aria-* を必須にしたら エラーになったんで

調べた時のメモ。

## 環境
-　Vue3(v3.2.41) + Typescript(v4.8.4)
-　vue-tsc (v1.0.9)
-　VSCode （extention: Volar）

## どんなエラー？

`BaseBadge` というコンポーネントがあって、 `ariaLabel` を必須にしている。
![スクリーンショット-2022-11-05-11.06.13_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42905/178ee01a-9bc4-7b5c-ba45-128c34ab28e6.png)
で、呼び出したら `vue-tsc` で怒られた。
![スクリーンショット 2022-11-05 11.09.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42905/aecf73b8-8518-829c-405d-59840b5f873b.png)
`BaseBadge` を呼び出ししてるコンポーネントを見てみる。
![スクリーンショット 2022-11-05 11.04.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42905/d4c22884-2c6c-2aa4-d9a6-b07201a25d35.png)
`aria-label` 指定しているのに、なぜに怒られる。。？

## どうやって解決した？

原因はよくわからないが、 `withDefaults` で
![スクリーンショット 2022-11-05 11.06.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42905/441f496e-b772-5613-3eba-0d81c52065fb.png)
デフォルト値を指定してあげたら、エラーを吐かなくなった。
![スクリーンショット 2022-11-05 11.10.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42905/2ccaa404-ed51-09a4-f797-aab7cad25f47.png)

## まとめ

`withDefaults` で デフォルト値を指定していなかったので、指定したらエラー吐かなくなった。

## その他

この辺が関わってるのですかね？よくわらかないけど。。
https://github.com/johnsoncodehk/volar/issues/1077
河合継手の3Dデータ

# 河合継手 kawai tsugite

河合継手なるものがあって、３Dプリント用のデータを作成。継手の元となる形状データをモデリングして、法線とUVを削除して、ファイルを小さくしたものをobjフォーマットで下記に掲載。

3Dプリントして、中心部分が嵌るように少し隙間を開けた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/88340535-e8a2-9f27-d04c-4fe1bfc1d44e.png)

同じものを２つプリントして嵌め合わせて、立方体になる。

![IMG_1712.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/faab4a0f-6d16-5105-96ec-ec6e6f0b5b7b.jpeg)

```text:kawaiTsugite.obj
v -4 2 0
v -4 0 -2
v -2 0 -4
v 0 2 -4
v -2 4 0
v 0 4 -2
v -2 2 -2
v -4 1 2
v -4 4 2
v -1 4 2
v 2 4 -1
v -4 4 -4
v 2 4 -4
v 2 1 -4
v -4 -2 -4
v -1 -2 -4
v -4 -2 -1
v -2 0 2
v 0 2 2
v 2 2 0
v 2 0 -2
v -2 -2 0
v 0 -2 -2
v 0.2 0.1 -0.1
v -0.1 0.1 0.2
v -0.1 -0.2 -0.1

f 7/4 3/3 4/1
f 7/6 1/5 2/7
f 7/12 6/11 5/9
f 10/14 8/13 18/33 19/32
f 13/19 12/17 6/18 11/36
f 4/51 12/17 13/19 14/20
f 15/22 12/17 3/52 16/21
f 11/27 14/25 13/26
f 9/15 12/30 1/31 8/13
f 2/29 12/30 15/34 17/35
f 1/31 12/30 2/29
f 5/16 12/17 9/15 10/14
f 12/17 5/16 6/18
f 22/37 17/23 16/21 23/38
f 24/40 21/39 20/41
f 25/46 19/45 18/43
f 26/48 22/47 23/49
f 6/11 7/12 24/42 20/41
f 7/10 5/9 19/45 25/46
f 1/5 7/6 25/44 18/43
f 7/8 2/7 22/47 26/48
f 3/3 7/4 26/50 23/49
f 7/2 4/1 21/39 24/40
f 4/51 3/52 12/17
f 16/21 3/3 23/38
f 21/39 4/51 14/25
f 19/45 5/16 10/14
f 20/28 11/36 6/11
f 22/47 2/29 17/23
f 18/33 8/13 1/5
f 21/24 14/25 11/27 20/28
f 8/13 10/14 9/15
f 15/22 16/21 17/23
```
コンテナから出力したログがDatadogで欠落した場合の原因調査方法

Datadogでログの大量投入試験をしていた際、欠落が発生したので、原因調査方法をまとめました。
今回の構成は、Openshiftノード内にDatadogAgentPodをDeamonSetで立てて、標準出力されるログをDatadogAgentが刈り取る仕組みです。

## 【事象】
Logs -> SearchでLogExplorerを表示すると、投入件数と合いませんでした。

その際に調査した内容と原因、および解決策について記載します。

## 【原因調査】
①IndexFilterやRemapperで落とされていないか確認する　→　問題なし
②Agentコンテナに割当てたリソースが不足していない確認する　→　割当量を増やして再試験したが、結果に変化なし
③Agentで刈り取りタイムアウトしていないか確認する（本投稿で詳細説明）

## Agentの刈り取りタイムアウトとは？
DatadogAgentは、各コンテナから標準出力されたログファイルを2世代分（※）刈り取ります。（ログファイルが暗号化されていると刈り取られない。2世代目は刈り取り時間はデフォルト60秒でタイムアウト）。

大量にログが出力された場合、2世代目のログファイルを60秒以内に刈り取り切れないことがあります。すると、「まだ刈り取っていないログがあるのに刈り取り終了」状態になってしまいます。
この時、以下のログをAgentコンテナが出力してくれます。

```
Tailer stopped after rotation close timeout with remaining unread data
```

そのため、ログが欠落してるな、と思ったら、このログが出力しているかを確認すると良いです。

## 【解決策】
Datdogのサポートに問い合わせところ、刈り取りタイムアウト値(close_timeout)を延ばすと良いとアドバイスいただきました。close_timeoutは、カスタム設定のため、明示的に記載しなければ、デフォルト値（60秒）に従います。
実際にはagent.customAgentConfigに以下を追記しました。
```
cutomAgentConfig:
    logs_config:
        close_timeout: 300
```
実際に挿入される際は、サポートに念のため確認されてください。


## ログ監視の推奨
```
Tailer stopped after rotation close timeout with remaining unread data
```
このログをLogMonitorで監視しておくことを推奨します。試験時のように投入件数と受信件数を突合できるような時以外は、欠落に気づく術がないからです。
Obsidian内にGoogleカレンダーを埋め込みたい！

## ObsidianCustomFramesならいけそう
- Twitterでこのような投稿を見つけた。

https://twitter.com/hk1115ab/status/1588029050651410432?s=20&t=6tIxtWBr5TEKUDCNZOFVzA

- このプラグインを使えば、実現できそう！

https://github.com/Ellpeck/ObsidianCustomFrames
### 機能
- Obsidianに下記の中の任意のアプリケーションを埋め込むことができる
![スクリーンショット 2022-11-05 11.26.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673036/7c087c8e-eef2-d3de-f84e-5afb6b44dbd6.png)
## インストールと設定手順
- obsidianの設定をクリック
- コミュニティプラグインのコミュニティプラグインを閲覧にて「Custom Frames」と検索
- 有効化を行う
- オプションからCreate a new frameと記載のあるところから入れたいアプリを選択
- Add Frameを選択
- cssコードをコピーする
- Vault/.Obsidian/snippetsに〇〇.cssという名前でファイルを作成し、コピーしたCSSコードをペーストする
:::note info

obsidianでの外観を変えるためのcssファイルの作り方は下記を参照してください。
https://pouhon.net/obsidian-css/6542/
:::
- 完了!
## 完了後の操作
- command+pでcustomと入力し選択すると任意のアプリが開きます![スクリーンショット 2022-11-05 11.15.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673036/f0ffa3b4-b33f-839c-7701-b132a095455f.png)
##  入れてみた後の感想
- Obsidian内で使えるのはアガったけど、実用的にはChrome内でいいかもとも思うので少し様子見してみる
- もし他にこうしたらいいよ！っていうものがあれば教えてくれると泣きます（嬉しいという意味でｗ）
【AWS】最低限の冗長性を持ったウェブサイトのAWS構成例

## はじめに
AWS上でウェブサイトを作成し、公開するとします。
一般公開の用途で、最低限の冗長性を持ったサイトを作成すると想定して、AWS構成を考えてみました。
![最小構成イメージ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879925/8642d500-04e3-b6b0-1425-77ca0af5cbcb.png)


## ①VPC
とりあえずVPCを一つ作り、その中にサブネットを2つ作ります。
RDS作成時にAZの異なるサブネットを2つ指定しなければいけないため、AZのリージョンは違うものにしておきます。それぞれのリージョンに、EC2一台とサブネットが所属する形になります。
そのAZのデータセンタが津波で壊れたとしても、別のAZに存在するもう一台のEC2が稼働し、RDSについてもマルチAZ構成のため、片方のAZが生きているため稼働が可能です。
※東京では現在3つのリージョンが選択可能1(ap-northeast-1a、ap-northeast-1c、ap-northeast-1d)。

## ②EC2
OSはAmazon linux2想定。インスタンスタイプはt3系が多いイメージです。
あとから上のグレードのインスタンスに変更することも可能です。
インスタンス作成時はルートボリュームを8GBから30GBまで無料で大きくできます。

## ③RDS
EC2と同じく、t3-から始まるインスタンスタイプにすることが多いイメージです
可用性を持つため、インスタンス作成時にデフォルトでマルチAZ指定が有効になってます。
=2つのサブネット上に配置しなければいけない且つ対象のサブネットが別のAZでなければいけないません。

## ④ALB, Gloabal Accelerator
ALBにてhttpでリクエストはhttpsにリダイレクトするルールや、通常のリクエストはEC22台が入ったターゲットグループに送るルールを導入します。ALBのIPをDNS公開しても、定期的にアドレスが変わってしまうため、Global Acceleratorを挟み、Global AcceleratorのIPを公開します。この場合だと確かIPが勝手に変わらなかった気がします…

## ⑤Cloudwatch
AWSの監視ツールのこと。EC2のCPU使用率、メモリ使用率、死活監視、ドキュメントルートのURL監視は最低限入れます。
メモリとCPUについては2段階(70%&90)でアラートを設定することが多いように思います。

## おわりに
WordPressの管理画面経由でファイルをアップロードしようとすると、本構成ではファイルがALBによって分散されてしまうため、S3を立てるもしくは、rsyncを利用したしサーバ間でファイルの同期設定が必要です。
rsyncについては別で記事を書いたのでご参考になれば幸いです。
[EC2×2台S3なし環境にて、/wp-content/uploadsディレクトリの内容を一方向同期する](https://qiita.com/benny3333/items/93de67d047e3725102bc)
[EC2×2台S3なし環境にて、WordPressの管理画面アクセスを片方のサーバに集中させる](https://qiita.com/benny3333/items/f34957299e079f018357)
piyopiyo.ex #11：Phoenixって何？Phoenixのディレクトリ構成やconfigファイルを見てみよう＆基本構文

この記事は、2022/11/5開催の『piyopiyo.ex #11：Phoenixって何？Phoenixのコードを見てみよう＆基本構文』勉強会用の記事です。

https://piyopiyoex.connpass.com/event/262074/

## Phoenixって何？

* ElixirのWebアプリケーションフレームワーク
* MVC（Model-View-Controller）アーキテクチャを採用している


## ソースコードを読む前に押さえたい構文

Elixir Schoolより引用

https://elixirschool.com/ja/lessons/basics/modules

### モジュールと名前付き関数

```elixir
defmodule Example do # <- モジュール
  def greeting(name) do # <- 名前付き関数 
    "Hello #{name}."
  end
end

Example.greeting "Sean"
"Hello Sean."
```

#### モジュール

> モジュールは関数群を名前空間へと組織する最良の方法です。  
> 関数をまとめることに加えて、関数のレッスンで取り上げた名前付き関数やプライベート関数を定義できます。

※名前空間（namespace）とは、名前の集合全体を小さな空間に区切り、それぞれに異なる識別名を与えることで、その空間内では他の空間に含まれる名前の競合・衝突を意識しなくて良いようにしたものです。
　プログラミング言語だと頻出する概念で、名前付き関数をモジュールにまとめて構造化できる、と捉えてもらうといいかも。

### 名前付き関数

> 関数を名前付きで定義して後から呼び出せるようにすることができます。 こうした名前付き関数はモジュール内部で `def` キーワードを用いて定義されます。

## Phoenixのソースコードを眺めてみよう

Replitで作成されたPhoenixプロジェクト

```zsh
├── _build
├── assets
├── config
├── deps
├── lib
│   ├── phoenix_app
│   ├── phoenix_app.ex
│   ├── phoenix_app_web
│   └── phoenix_app_web.ex
├── priv
├── test
├── .formatter.exs
├── .gitignore
├── mix.exs
├── mix.lock
├── phoenix_app_dev.db # ReplitでDBにSQLiteを指定しているため
└── README.md
```

### プロジェクトのトップディレクトリに生成されるファイル

* .formatter.exs
  - ソースコードのフォーマッタに使われる設定ファイル
* .gitignore
  - ビルドの副産物として生成されるファイルやディレクトリをこのファイルに列挙し、Gitリポジトリに保存されないようにする
* mix.exs
  - プロジェクト全体の設定ファイル。プロジェクトの情報や依存するライブラリ、Mixタスクのエイリアスなど
* mix.lock
  - mix.exsで指定した依存ライブラリの具体的なバージョンが記録される

### 詳しいディレクトリ構成は、下記Docを読みながら見ていきましょう

https://zenn.dev/koga1020/books/phoenix-guide-ja-1-6/viewer/directory_structure
DockerとApacheを使ったWEBサーバー構築で詰まった点

# はじめに
https://avinton.com/academy/aws-docker-apache/

上記記事を参照し、WEBサーバーを作成したが、作成にあたりいくつか詰まった点があったため備忘録として残しておく。

# CentOS8で名前解決エラー
`yum update`で下記エラーが発生。

```
Failed to set locale, defaulting to C.UTF-8
CentOS Linux 8 - AppStream                                                                                    34  B/s |  38  B     00:01
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
```

https://www.na3.jp/entry/20220213/p1

上記記事でのリポジトリの書き換えでメタデータの書き換えできるようになった。

# テスト画面が表示されない
セキュリティグループもHTTPアクセス可能だし、Apacheも起動しているのにブラウザ上で表示がされず慌てた。
これは完全に初歩的なミスだが、EC2の画面でオープンアドレスで開くと`https`の表示となるので、httpに修正するか、手打ちでパブリックIP入力して表示されることを確認するとよい。
Mac の Homebrew で複数バージョンの Java を利用する

# 概要

Mac の Homebrew で複数バージョンの Java を利用するときのメモ。
なお、複数バージョンの Java を利用する方法としては jEnv を使う手もある。しかし毎回なにで Java を入れているのか忘れて「Homebrew かな？それとも別の何か...？」と混乱するので、もう Homebrew を使うことにした。

# 既存の Java をアンインストールする場合

Mac から既存の Java をアンインストールしたい場合は以下のようにする。
公式では以下のコマンドが推奨されている。

```bash
$ sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
$ sudo rm -fr /Library/PreferencesPanes/JavaControlPanel.prefPane
$ sudo rm -fr ~/Library/Application\ Support/Oracle/Java
```

しかしこれだけでは JDK までは削除できない。
以下のコマンドで場所を確認しつつ削除する。

```bash
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (1):
    1.8.0_144, x86_64:	"Java SE 8"	/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home

# 上記で確認したパスの親ディレクトリから消す
$ sudo rm -rf sudo rm -rf /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk
```

これで Java を消すことができた。
なお、これでも多少のゴミファイルは残っているのだが、　Java のラッパーが残っているだけで悪影響はない。
もし今後 Java を再インストールするのならそのまま使われる。

ちなみに Homebrew で入れている jdk は以下のように探すことができる。

```bash
$ brew list | grep jdk
openjdk
openjdk@11
openjdk@17
```

# OpenJDK のインストール

複数バージョンの JDK を入れていくには以下のようにする。

```bash
# インストール
$ brew install openjdk@17
# Java のラッパーに認識してもらうためシンボリックリンクを貼る(上記のインストール時にコマンドを案内されるためそれを参考にする)
sudo ln -sfn /usr/local/opt/openjdk@17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk@17
```

認識されている JDK を確認するには以下のコマンドを打ってみる。

```bash
$ /usr/libexec/java_home -V  
```

さらに以下を ~/.bachrc や ~/.zshrc に記載する。
JDK のバージョンを切り替えたいときはここの数値を変えればいい。

```bash
export JAVA_HOME=`/usr/libexec/java_home -v "19"`
PATH=${JAVA_HOME}/bin:${PATH}
```

これで複数バージョンの Java を利用することができるようになった。
【データ分析/Python】titanicコンペで欠損値の多いカラムを削除したうえで、外れ値を探してみた。

こちらのNotebookを摸写した上で、自分で考えたことを考えてデータ処理してみた。
※[Titanic using Pipelined XGBoost & GridSearch](https://www.kaggle.com/code/maheshnanavare/titanic-using-pipelined-xgboost-gridsearch)

## データの読み込み
```python
#　データ読み込み
X_y = pd.read_csv('train.csv', index_col = 'Passenger_id')
X_test = pd.read_csv('test.csv', index_col = 'Passenger_id')

# Survivedカラムに欠損値がある行を削除する。
X_y = X_y.dropna(subset=['Survived'], axis=0)

# yをXから分離する。
X = X_y.copy()
y = X.pop('Survived')
```

## データクレンジング
```python
def show_null_values(X, X_test)
    # 変数Xの欠損値の数を数える。
    null_values = pd.DataFrame(X.isnull().sum(), columns=['Train Data'])
    # 変数X_testの欠損値の数を数える。
    null_values['Test Data'] = X_test.isnull().sum().values

    # null_values変数に、Train Data, Test Dataのどちらかが０ではないデータを抽出する。
    null_values = null_values.loc[(null_values['Train Data']!=0 | (null_values['Test Data']!=0)]
　　# ソートする。
    null_values = null_values(by=['Train Data', 'Test Data'], ascending=
False)
    return null_values

# メソッド呼び出し
show_null_values(X, X_test)
```
下記のように、各カラムの欠損値の数を抽出することができた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/bdd5b652-0822-1652-4ab3-39bff1be9817.png)
欠損値の数が多いカラムがあるため、半分以上の行が欠損値となっているカラムは除去してしまうことにする。

```python
null_columns = [if for col in X.columns if X[col].isnull().sum() > len(X)/2]
null_columns
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/0b36d713-16a1-e064-6bf4-efd13b90599f.png)
Cabinカラムが削除された。

## 外れ値を探す。
```python
X.plot.box()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/5a1efc15-7bb2-eaad-827b-7ff0127cc93e.png)

# Fareの外れ値（？）がありそうなため確認する。
```python
outlier = X.query('Fare >= 500')
outlier = outlier.sort_values('Fare', ascending=False)
outlier
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/c82568f3-915b-4dba-9dc4-7f72a918f2be.png)

Fareが500以上の行は削除してもよさそうだと感じた。


## 四分位範囲を利用して、外れ値か判断してみる。
Fareの統計量を出してみる。
```python
X['Fare'].describe()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/1685ffaf-ead2-a0d8-610f-cc50bde7995e.png)

「第三四分位範囲から四分位範囲x1.5倍を足した値」以上のデータがありそう。
`31 + (31-7.910400) x 1.5 = 65.6344`なので、Fareが65以上の場合は外れ値と判断できる。

これで外れ値を判断すると大量のデータを除去することになってしまうので、他の方法を調べたところwinsorizationを使用して外れ値に対処している方がいらっしゃったため、自分も試してみた。
参考:[winsorization で外れ値に対処する](https://qiita.com/pocokhc/items/9311836f2b0ab09cd6fc#1-3fare-%E3%83%81%E3%82%B1%E3%83%83%E3%83%88%E6%96%99%E9%87%91-%E5%A4%96%E3%82%8C%E5%80%A4)


```python
# 小数データをヒストグラムで表示
def plot_float(df, column, bins=10):
    sns.distplot(df[column], kde=True, rug=False, bins=bins)
    plt.title(column)
    plt.tight_layout()
    plt.show()

X["Fare"] = scipy.stats.mstats.winsorize(X["Fare"], limits=[0.01, 0.01])

# 外れ値を除外した結果をplot
plot_float(X, "Fare")
```
外れ値（Fareが500以上のデータ）が除去できていることを確認できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/3f16a42b-4549-075a-d95b-eae0ba2a98bd.png)


## 結果
しかし、Score（予測精度）を上げることはできなかった。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/b07644c6-1edf-0bc2-79f9-13b3f8a14caa.png)
「[Q&A] 部分和の計算（初心者です）」の動的計画法のコードを書いてみました

　Qiitaの次の質問

https://qiita.com/hiro1044/questions/7ff52d0e1e4d9fd42a13

の、動的計画法のコードを考えたが、時間がかかりすぎて質問がクローズになっていたので、ここに投稿します。

　`dp[j]`は和が`j`となる数の組（リスト）を要素とするリストとします。
　最初の状態は何も選ばれていなくて和が`0`であるから、`dp[0]`は空リストを要素とするリスト`[[]]`となる。
　$i$番目に和が`j`になるのは、$i$番目の`xs_i`を、「選ばず」にか、「選んで」かのどちらか。
　よって遷移式は、$i-1$番目に「和が`j`になっている数の組を要素とするリスト」と「和が`j - xs_i`になっている数の組を要素とするリスト」を結合したリストになるので、

```
dp[j] <- dp[j] + (dp[j - xs_i]の各要素のリストにxs_iを追加したものを要素とするリスト)
```

となる。
　コードにすると、

```python
def has_subset_sum(xs, k, target):
    max_sum = sum([i for i in xs if i > 0])
    min_sum = sum([i for i in xs if i < 0])

    dp = [[] for _ in range(max_sum - min_sum + 1)]
    dp[0] = [[]]

    for xs_i in sorted(xs):
        for j in range(max_sum, min_sum - 1, -1):
            dp[j] += [[*d, xs_i] for d in dp[j - xs_i] if xs_i not in d and len(d) < k]

    for d in dp[target]:
        if len(d) == k:
            return True

    return False


target = int(input("targetを入力してください:"))
k = int(input("足し合わせる数を入力してください:"))
xs = list(map(int, input().split()))

print(has_subset_sum(xs, k, target))
```
deeplAPIでファイルを翻訳する方法

# はじめに
deeplを使った翻訳アプリを作成したいと思い、調べて実装致しました。

# 対象
・Python学習者
・deeplで翻訳アプリを作成したい方

# 開発環境
・macOS Monterey バージョン12.3.1
・Python 3.10.8

# 本題

① deeplAPIを利用する際は、以下のサイトで登録する必要があります。
https://www.deepl.com/pro-api?cta=header-pro-api

②　ライブラリをインストールする
```
pip install --upgrade deepl
```

③初期設定
```
import deepl

translator = deepl.Translator("認証キー")
```

④実装
```
translator.translate_document_from_filepath(
    "translate-test.docx",  #翻訳対象ファイル
    "translate-test-ja.docx",　#翻訳後のファイル
    source_lang='DE',　#元ファイルの言語
    target_lang="JA" #翻訳したい言語
)
```

# 参考サイト
https://chigusa-web.com/blog/deepl-api-python/

# まとめ
現在は、Djangoを使ってアプリを作成しており、実装出来次第、こちらで共有したいと思います。
kintoneプラグイン作成方法（開発環境なしVer）

# はじめに
kintoneのカスタマイズをjavascriptで実施はできるようになった、次はプラグインを作成してみよう！
しかし、どのページ作成方法もNode.jsでの開発環境が前提としてあり、なんだかよくわかんない。
npmってなんじゃい、そもそもどこで入力すんの？という人向けの記事。（これ私だけなのかな？）

ということで、node.js等の開発環境なしでプラグイン開発を目指します。

# 目次
1. プラグインのテンプレート（雛形ファイル）のダウンロード
1. プラグインのパッケージング
1. 動作確認
1. テンプレートの説明

# プラグインのテンプレート（雛形ファイル）のダウンロード
[入力チェックプラグイン作成例](https://developer.cybozu.io/hc/ja/articles/203480420)を参考に、テンプレートを作成しGitHubに公開しました。
以下のURLにアクセスし、フォルダ毎ダウンロードしてください。
https://github.com/necomochi/kintoneplugin_template

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879170/60b7c098-43ec-d8af-b391-85b0471dfc66.png)

# プラグインのパッケージング
ダウンロードしたZIPファイルを任意の場所に回答して、ルートフォルダを[plugin-packer for Web](https://plugin-packer.kintone.dev/)にドラッグ&ドロップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879170/a0939012-6e20-18a9-1b90-8ba82c174f2f.png)

作成されたファイルをクリックしてダウンロード（ppkファイルは2回目以降に、一緒にドラッグ&ドロップ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879170/611375c9-db61-a1a3-393a-00a45316d9cc.png)

# 動作確認
作成されたZIPファイルをkinotoneのプラグインとして登録。
任意のアプリにインストールし、設定値を適当に保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879170/22230659-a2c2-adc7-2adc-d71e9b396026.png)

アプリ更新後、一覧に戻ってブラウザのコンソールログに設定した情報が反映されていたら成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879170/98428aae-79fb-e9c9-b310-9d99ece64d32.png)

# テンプレートの説明
テンプレートは、設定を保存してコンソールに出力するだけのものです。
あとは、cybozu Developoer network にある[プラグイン開発方法](https://developer.cybozu.io/hc/ja/articles/203455680-kintone-%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E9%96%8B%E7%99%BA%E6%89%8B%E9%A0%86)等を参考にいろいろやってみてください。

今回は自分の備忘も含めて、テンプレートと記事を作成してみました。
プラグインのテンプレートについての説明も需要があれば記事にしたいと思います。
【自分ルール】技術書などの保存について

# はじめに
子供は本が好きで絵本を「読んで～」とよく持ってくるのですが
最近私の技術書などにも興味をもちはじめ、
散らかしたり破壊したりしてきたので、対策として自分のやっていることをメモとして残します。

似たような悩みを抱えている方の参考となれば幸いです。

# 結論
ブックコートフィルムをかけます。
フィルムやフィルムのかけ方については以下にリンクを掲載いたしますので、
参考にしてください。
この動画が一番わかりやすかったです。


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

# 参考
私が購入しているフィルムのリンクを張っておきます。
これ以外にも種類はあるみたいなので、合わなかったひとは別の使うのも手です。

デビカ 製本テープ 図書館ブックフィルム A4ロール

https://www.amazon.co.jp/gp/product/B004EHYGY6/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1

# ブックコートフィルムのメリット
以下にブックコートフィルムを使用することのメリットを記載していきます。
## 読むときにカバーが外れない
本を読んでちょうど真ん中に差し掛かったり、読みたいページを探してパラパラめくったりすると、カバーが外れて「むきー！！！」となることありませんか？私はあります（半ギレ）
ブックコートフィルムをかければカバーが固定されるので、そういったイライラからも解放されます。

## 本の強度が増す
フィルムで補強しているので、純粋に本の強度が増します。
また表紙にちょろっと水をこぼしたりしてもさっと拭けば元通りになるので、
多少の水気もあんしんです。
子供にクレヨンで落書きされても安心だな！（中身が無事とは言っていない）

## 本への愛着が増す
もともと自分が好きな本に、完璧にフィルムをかけられたときの愛着はやばいです。
「へへ…ラブだぜ…」と思いながらより一層読書をたのしむことができます。

# ブックコートフィルムのデメリット
メリットもあれば当然デメリットも存在します。
以下に記載していきます。
## 本は売れなくなる
本にフィルムかけるわけですから、当然古本屋などで売れなくなります。
つまり、不要になったら捨てるか人にあげる選択肢となります。

## お金が余分にかかる
+数百円とはいえ、フィルムを購入するわけですからその分お金は余分にかかります。
綺麗に残すための費用と私は割り切っています。

## やり直しは効かない
フィルムの貼り付けに失敗した場合、基本的にやり直しはできません。
うにーってなったフィルムがかかった本と付き合っていくことになります。
まずは捨ててもいい本で練習するのもいいかもしれません。（n敗）

# おわりに
自分以外に技術書などの本を少しでもきれいに管理して、
長く読んでいきたいと考えている方に届けば幸いです。
Qt+QOpenGLWidget+CMake の手順メモ

# 0)環境
Ubuntu　20.04
Qt5
GCC 9
GDB 

# 1）Qtのプロジェクト生成する。
このとき、ビルド条件はCMAKEを利用する。

# 2) 生成されたQtのプロジェクトをビルドする
ここは、特に何もくビルドできるはず。何も問題がなければ空のWindowが立ち上がる。


# 3）自己定義のGLwigetのクラスを定義する。
これは、この辺の[ページ]()が参考になる。



glwidget.h
``` c
#ifndef GLWIDGET_H
#define GLWIDGET_H


#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QColor>
#include <QOpenGLFunctions_1_0>



class GLWidget : public QOpenGLWidget, public QOpenGLFunctions
{
    Q_OBJECT
public:
    explicit GLWidget(QWidget *parent = nullptr);

    virtual ~GLWidget();

    void initializeGL();
    void paintGL();
    void resizeGL(int w, int h);


signals:

public slots:
};

#endif // GLWIDGET_H

```



"glwidget.cpp"
``` c
#include "glwidget.h"

GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent)
{


}


GLWidget::~GLWidget()
{

}

void GLWidget::initializeGL()
{
    initializeOpenGLFunctions();
    glClearColor(0.1, 0.1, 0.1, 1);
}

void GLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin ( GL_TRIANGLES );
    glColor3f ( 1.0 , 0.0 , 0.0 );
    glVertex3f (- 0.5 , - 0.5 , 0 );
    glColor3f ( 0.0 , 1.0 , 0.0 );
    glVertex3f ( 0.5 , - 0.5 , 0 );
    glColor3f ( 0.0 , 0.0 , 1.0 );
    glVertex3f ( 0.0 , 0.5 , 0 );
    glEnd ();
}

void GLWidget::resizeGL(int w, int h)
{
    Q_UNUSED(w)
    Q_UNUSED(h)
}



```

# 4)　Uiファイル編集にて、配置したQWidgetかOpenGLWidgetのオブジェクトに自己定義のウィジェットを設定。

## ・QWidgetかOpenGLWidgetを配置する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397413/534857b6-39b4-7384-9b09-77134c99db98.png)

## ・QOpenGLWidgetの「promoted widget（格上げされたウィジェット）」にて、自己定義のクラス格上げする。
今回は、自己定義ファイルは、「GLWidget」となる。
![Screenshot from 2022-11-05 08-34-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397413/a0b7fb94-13fb-7e22-4def-f56ce8c5c63a.png)

# 5)　CMakeのビルド条件を追加する。

これが追加部分
```　cmake
find_package(Qt5 COMPONENTS Widgets REQUIRED)
find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)

target_link_libraries(QtTestOpenGL PRIVATE Qt5::Widgets ${OPENGL_LIBRARIES} ${GLUT_LIBRARY})
```

## 6) ビルドすればトライアングルが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397413/39b6f52c-8a22-439d-f41e-5dd86be325c4.png)


## 参考　CmakeLists.txt
CmakeLists.txt を載せておく。

```　cmake
cmake_minimum_required(VERSION 3.5)

project(QtTestOpenGL LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt5 COMPONENTS Widgets REQUIRED)
find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)


add_executable(QtTestOpenGL
  main.cpp
  mainwindow.cpp
  mainwindow.h
  mainwindow.ui
  glwidget.cpp
  glwidget.h
)

target_link_libraries(QtTestOpenGL PRIVATE Qt5::Widgets ${OPENGL_LIBRARIES} ${GLUT_LIBRARY})
```
LPC812MAXの俺の考えた最強のLチカ(mbed2)(タイマー割り込み)


x mbed2リビジョン144
x リビジョンを変更できる人むけ



目的
最強のLチカを作る。
タイマー割り込みの例。


![o_cop231.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5d9bfd93-727f-dbdd-05bf-d547034ce54b.jpeg)



資料

Ticker - 繰り返しタイマー割込み


https://os.mbed.com/users/okini3939/notebook/ticker_jp/



https://os.mbed.com/users/okini3939/notebook



```c++




//LED_RED_L_TI_KA_812_1

#include "mbed.h"


//LEDのポートの定義
DigitalOut myled(LED_RED);   //red

//タイマー割り込みの定義
Ticker flipper;


//タイマー割り込みの呼び出し関数
void flip()
{

    //LEDの反転
    myled = !myled;

} //flip


//メイン関数
int main()
{

    //タイマー割り込みの開始
    flipper.attach(&flip, 2.0);

    //無限ループ
    while(1) {}

} //main




```