OmniAICreator/Qiita-1.07M huggingface dataset:
Power Appsによるアプリ開発(Part1-1)

# 目次
- 初めに
- 今回作成するアプリについて
- 作成した内容
- 完成形
- 最後に

# 初めに
前回初めてPower Appsを学習し、ある程度知識を得たので実際に業務用アプリケーションを作成したいと思います。
前回の記事は[こちら](https://qiita.com/gun_lee/items/b4bd64253fdab3f8e461)から見れます。
# 今回作成するアプリについて
今回作成するアプリケーションは、来店客の人数等を記録する来店記録アプリを作ってみようと思います。
記録するデータは、その日の一時間ごとにおけるスタッフ数、来店数、接客数、購入者等です。
登録したデータを一覧で見ることができて、更に修正したい場合は変更できるようにしたいと思います。
この記事では登録する機能まで作成したいと思います。
# 作成した内容
- データベース作成
まずは記録を保存するためにデータベースを作成していきます。
今回は前回Power Appsと同時に学習したSharePointを利用して作成したいと思います。
テーブルは一つだけで、来店記録を取る際に必要と思った要素をあらかた出してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329903/204e4ba5-422b-450f-1d27-894136a72d52.png)
今回はすべての列を必須項目にしました。
また、カウントするものと金額のデフォルト値を「0」にします。
天気、気温の備考に書いてあるMSN天気とは、マイクロソフトが提供しているある地点における現在の気温、湿度、降水量などといった最新の天気予報を取得することができます詳しい情報は[こちら](https://learn.microsoft.com/ja-jp/connectors/msnweather/)をご覧ください。
これを作成し、実際にアプリ画面を作成していきます。

- アプリ画面作成
これからアプリ画面を作成していきたいと思います。
今回は登録をするだけなので編集フォームを先ほど作成したテーブルをもとに作成し、登録ボタンを置きたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329903/9db41132-66de-0741-a8be-c3ce4a82cdee.png)
これでもいいのですが、見た目のバランスや天気、気温の自動取得などのように便利にしたいので加工していきます。
行った内容は以下の通りです。

- 日付の入力を省くため、今日になるようする
- 天気、気温をMSN天気から自動で取得するようにする(手入力できないようにする)
- カウント方式と決めたテキスト入力をボタンを押すだけで1ずつ上げ下げして入力できるようにする(直接入力できないようにもする)
- カウント方式で入力するときにマイナスにならないようにする(テキスト入力が0以下の場合、下げるボタンを非表示にする)
- アイテムボックスの検索の文字を変更
- 入力しやすいようにテキスト入力やコンボボックスの間隔を空ける
- 文字サイズを大きくする

これらをやってみたらこのようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329903/b04dfe74-9871-bdb3-3e09-2814898ab61f.png)
先ほどと違って見やすくなり、使いやすくなりました。
しかし、天気と気温の表記がおかしいので修正したいと思います。

大前提として、天気、気温の取得場所は東京にしています。
天気については日本語に翻訳すればいけそうなので、MSN天気と同じ方法でMicrosoftTranslatorを引っ張ってきて天気の文字を翻訳させるようにコードを書きます。
```:Default(天気)
MicrosoftTranslator.Translate(
    MSN天気.CurrentWeather(
        "Tokyo",
        "Metric"
    ).responses.weather.current.cap,
    "Ja"
)
```
次に気温についてなのですが、59℃と表示されている原因が摂氏ではなく華氏を受け取っているのが原因でした。
そのため、摂氏に変更にする方法を模索していたのですが、方法が見つからなかったので、無理やり解決します。
摂氏を求める時の計算式は以下の通りなのでこの式を直接入力して計算させます。
```:華氏から摂氏への式
℃= (°F-32)÷1.8
```

```:Default(気温)
With(
    {
        temp: MSN天気.CurrentWeather(
            "Tokyo",
            "Metric"
        ).responses.weather.current.temp
    },
    (temp - 32) / 1.8 & "℃"
)
```
かなり強引ですが、一応解決出来ました。
もしほかの方法を知っている方がいたら教えていただけるとありがたいです。

# 完成形
そして、実際に出来たアプリの画面はこのようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329903/3ae4338d-c958-f689-b442-e23ba335e044.png)
一番初めよりもアプリらしくなっていい感じになりました。

実際にフォームに入力したらデータベースに登録されるのを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329903/008bd53f-eab5-ae40-db9f-72a8b0fdd08a.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329903/1f1c05d7-2844-2ec1-6d7d-77e9a201d1f5.png)
# 最後に
今回は来店記録のアプリのデータベース作成と登録画面の作成を行いました。
所々躓いた点がありましたが、何とか完成することが出来ました。
次回は登録した来店記録を参照、編集する画面を作成したいと思います。
realsense imuキャリブレーション

# To do
realsenseで取得したデータをPointCloud表示し，さらにそれをカメラの姿勢に関係なく水平方向から撮影したみたいに表示し直したい．

そのためには，現在のカメラの姿勢を読み取ったうえで，カメラ向きが水平になるよう座標変換を行う必要がある！

が，
やってみたら何かカメラの向きが訳分からんことになった．

[調べると](https://www.intelrealsense.com/how-to-getting-imu-data-from-d435i-and-t265/)，realsense435iはデフォルトでは（絶対座標との）キャリブレーションが行われていないらしい．つまり，計測できるけどどこが水平か分からない状態．

**そこで，カメラについているimuセンサをキャリブレーションして，正しい姿勢を入手する．**


# imuキャリブレーション
☟の公式が公開している説明pdf通りに行っていく．

https://www.intelrealsense.com/wp-content/uploads/2019/07/Intel_RealSense_Depth_D435i_IMU_Calibration.pdf

:::note info
立てたり横にしたりするときは，realsenseが入ってた箱を利用するといい
:::
【IBM Security Verify】パスワード・インテリジェンス機能を使って、辞書攻撃に対応する②

# はじめに

前回 カスタムパスワードリストを用いたパスワード利用制御について紹介しました。
今回は、もうひとつの「IBM Security X-forceを利用したパスワードの利用を制御する機能」でどのようなパスワードが制限されるか確認しました。

# 1.機能概要
- [パスワード・インテリジェンスの管理](https://www.ibm.com/docs/ja/security-verify?topic=passwords-managing-password-intelligence)
    - 2つの機能が追加された。2つを併用することも可能。
        - 「IBM Security X-forceを利用したパスワードの利用を制御する機能」
        - 「ユーザーが定義したカスタム・リストを用いたパスワード利用の制御する機能」
    - 制御したパスワードを利用している場合のアクションが定義できる。
        - アクションは 監査　＜　警告　＜　強制　の3段階ある。強制が一番高い優先度になる。
    
- [パスワード・インテリジェンス・レポートの生成](https://www.ibm.com/docs/ja/security-verify?topic=reports-generating-password-intelligence-report)
    - 上記パスワードインテリジェンスの動作結果をレポートする機能


# 2.IBM Security X-forceによるパスワード使用制御設定

設定できる項目はユーザー・ログインフローと、アカウントの作成、パスワードのリセット、およびパスワードの変更のフローの2つがありました。

|項目|選択肢|補足|
|---|---|---|
|ユーザー・ログイン・フロー  |<ul><li>監査</li><li>メッセージでユーザーに警告します。</li><li>ログインを禁止し、ユーザーをパスワード変更エクスペリエンスにリダイレクトします。</li></ul>     |ー| 
|アカウントの作成、パスワードのリセット、およびパスワードの変更のフロー  |<ul><li>監査</li><li>メッセージでユーザーに警告します。</li><li>アクションをブロックし、よりセキュアなパスワードを使用するようにユーザーに要求します。</li></ul>      |ユーザーログインフローで、「ログインを禁止し、ユーザーをパスワード変更エクスペリエンスにリダイレクトします。」を指定した場合、「アクションをブロックし、よりセキュアなパスワードを使用するようにユーザーに要求します。」が自動的に選択される。|


# 3.パスワード利用制御の動作確認
IBM Security X-forceのパスワードリストは公開されていないため、どのようなパスワードが利用制御の対象となるのか確認してみました。
※動作検証のため、IBM Security Verifyのパスワード要件はパスワードの長さ：8桁のみに設定しています。

リトアニアのセキュリティ企業であるNord Securityが調査した2022年に日本でよく利用されたパスワードの情報をもとに、IBM Security X-forceの除外パスワード・リストに該当するかどうか試してみました。

https://nordpass.com/most-common-passwords-list/

以下は、2023/5/10に各1回ずつの試行結果になります。

|利用制限されたパスワード例|
|---|
|password|
|12345678|
|123456789|
|1qaz2wsx|
|adgjmptw|
|diskunion|
|himawari|
|zaq12wsx|
|abcd1234|
|lovelove|
|hanahana|
|qwertyuiop|
|varun@1971|
|1234567890|
|doraemon|
|1q2w3e4r|

利用が制限されるパスワードは、グローバル xForce Red 除外パスワード・リストに含まれているようです。
![qiita (27).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/ef740c75-2ed4-fb8c-1ada-6730b1325369.png)


# 最後に
次回は、ユーザーが、除外パスワード・リストに含まれるパスワードを指定した場合どのようにレポートに表示されるか確認したいと思います。

5/11更新
- [【IBM Security Verify】パスワード・インテリジェンス機能を使って、辞書攻撃に対応する①](https://qiita.com/fitz/items/86de0400e346a8c70c88)
- [【IBM Security Verify】パスワード・インテリジェンス機能を使って、辞書攻撃に対応する②](https://qiita.com/fitz/items/bbcfa712de1dc7cda343)
- [【IBM Security Verify】パスワード・インテリジェンス機能を使って、辞書攻撃に対応する③](https://qiita.com/fitz/items/bb6b85883dfc63d2c6bf)
3次元画像処理を学ぶ

# 画像処理ライブラリ
realsenseで取得した3次元情報を処理するにあたって，"Open3D" と "Point Cloud Library" の主に2つのライブラリを用いることが考えられる．

<table>
  <caption>3次元画像処理ライブラリの違い</caption>
  <thead>
    <tr>
      <th> 名前 </th> <th>言語</th> <th> メリット </th> <th> デメリット </th>
    </tr>
  </thead>
  <tr>
    <td> Open3d </td> <td> python/C/C++ </td> 
    <td> <ul> <li>行数が少なくすむ</li> <li>解説サイトが豊富</li></ul> </td> 
    <td> <ul> <li>公式ではros非対応</li> <li>処理が遅い</li></ul> </td>
  </tr>
  <tr>
    <td> Point Cloud Library </td> <td> C/C++ </td> 
    <td> <ul> <li>ros公式パッケージあり</li> <li>処理が速い</li></ul> </td> 
    <td> <ul> <li>行数が多くなる</li> <li>解説サイトが少ない</li></ul> </td>
  </tr>
</table>

上表のように，open3dとPCLの一番の違いは使用言語．
* python：そもそもC++よりコードの行数が少なくすみ，一方で処理が遅い．
* C/C++：処理が速い分，コードの行数も多くなりがちである．（open3dをC++で書けば，そこそこ短いコードで書けるみたい）

また，rosで取得したデータを使うことを考えると，rosとの相性も大切．
* open3d：公式非対応なので，ros関連の解説サイトは少ない（ほぼない）が，open3d自体の解説は英語・日本語どちらも多くある．
* PCL：ros公式のチュートリアルや質問ページが機能している．その一方で，PCL自体の解説は英語も日本語も少ない印象．

さあ，どちらにしよう...？


ということで，どちらもやってみた．

* Point Cloud Library
    * [PCLを使ってみる](https://qiita.com/Karin-Sugi/items/483283c42ab1fbcb0699)
    * [PCLの機能いろいろ](https://qiita.com/Karin-Sugi/items/6d750f3017d966ef33d5)
* [Open 3D](https://qiita.com/Karin-Sugi/items/fa295bf2e14d763d66d0)（工事中...）
簡単？！政府情報システムクラウド基本方針とISMAPの内容と流れをサラっと

# 内容

GW中に下記の資料を読んで内容と今までの流れをまとめてみました。

* [政府情報システムのためのセキュリティ評価制度（ISMAP）について（内閣官房・総務省・経済産業省）](https://www.ismap.go.jp/sys_attachment.do?sys_id=467d7c80dbdfd9506e6cb915f39619c5)

* [ISMAP-LIUについて（内閣サイバーセキュリティセンター・デジタル庁・総務省・経済産業省）]( https://www.ismap.go.jp/sys_attachment.do?sys_id=e3dd3480dbdfd9506e6cb915f39619eb)


* [政府情報システムにおけるクラウドサービスの利用に係る基本方針（以下基本方針と記載）](
https://www.digital.go.jp/assets/contents/node/basic_page/field_ref_resources/e2a06143-ed29-4f1d-9c31-0f06fca67afc/17ef852e/20221228_resources_standard_guidelines_guideline_01.pdf)


# 流れ
基本方針の中でクラウド・バイ・デフォルト原則が発表され、政府情報システム調達の際は、オンプレの前にSaaS→IaaS/PaaSを検討しなさいという流れになりました。クラウドはセキュリティが心配という声が多く、また、統一的なセキュリティ基準がなかったため作成されたのがISMAPです。その後、基本方針の改定案が発表され、下記方針のもと、マネージドサービスやIaCなどスマートでモダンな技術を中心に使っていくことが方針として明記されました。

:::note info
クラウドファースト（先ずはクラウドの利用を検討する）から
クラウドスマート（クラウドを賢く適切に利用する）へ
:::

# 方針の改定
2022年12月に改定された基本方針の中に出てきたキーワードをいくつかピックアップしてみました。このキーワードからどの様なサービスが求められている想像がつきやすいかと思います。また、「調達の際は基本アプリとインフラを分けない」、「オンプレの現行踏襲をしない」等、モダンな技術を使用していくのに必要なプロセスの記載も色々とあります。

![gov1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/c6635032-9596-2616-ae49-ff51fc242e9e.png)

# ISMAP
## どんなものか
セキュリティ基準を満たしたクラウドサービス提供者がリストに登録されます。政府情報システム調達の際、基本的にはクラウドサービスはISMAPに登録されたものを選択する方針となっています。なお、基本方針の「４.１ ISMAP 以外のクラウドセキュリティ認証等」にISMAP登録されていないサービスを利用する際の推奨事項に関して記載があります。

![gov2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/5aa9c85d-11aa-cef3-5c67-e3f1f2e2bde8.png)

## 運営
ざっくり運営側（制度を運営、基準を作る人たち）、CSP（クラウドサービスの提供者）、監査機関で構成されます。この三権分立パターンは（国会、行政、裁判所）や（株主総会、取締役会、監査役会）のようにガバナンスをきかせる鉄則パターンかもしれません。

## 管理基準
クラウドサービス事業者が守るべき基準の一覧です。これはJISQ270XXや統一基準など複数のプラクティスや文章を元に作成されています。管理基準の内容は階層的に「管理策基準」、「マネジメント基準」、「ガバナンス基準」とありますが、全体的な方針があり、それをどう管理していくか、具体的にどうやるかといった、ISMSやセキュリティ管理基準で良く見られるパターンです。

## ISMAP-LIU
ISMAPの基準は膨大でありであるため、セキュリティ上のリスクの小さな業務・情報の処理に用いるSaaSを対象にISMAPの簡易版であるISMAP-LIUが登場しました。
【Android】1つのエミュレータでスマホもタブレットもテストする方法

## はじめに

Android のエミュレータには Resizable emulator というものがあり、その名前の通り単一のエミュレータで複数の画面サイズをテストすることができます。

従来スマホとタブレットでそれぞれ確認したい場合は 2つのエミュレータを立ち上げる必要がありました。さらにエミュレータを複数起動するとホストマシンの CPU やメモリが圧迫されるという問題もありました。

Resizable emulator であれば 1つのエミュレータで完結させることができます。

## Resizable emulator を作成する

Resizable emulator を作成するには、通常のデバイス作成フローの中のハードウェアで `Phone | Resizable (Experimental)` を選択します。私の環境では一番下にありました。その他は通常と同じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56635/d0a990e0-013e-e37f-20fd-040f877b287b.png)


## リサイズしてみる

エミュレータのメニューからサイズを変更することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56635/2425690a-f70f-079f-9603-ce81e1a1348f.png)

**【Phone】**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56635/cfe65f86-bec5-28be-0e7a-50bba6d2d04f.png)

**【Unfolded Foldable】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56635/a05fc79a-5596-a48f-3c3a-928536a5a3b5.png)

**【Tablet】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56635/a94cb695-736c-05d0-2e2f-481c19729b69.png)


## リソース

* https://developer.android.com/studio/run/resizable-emulator?hl=ja
SwiftUI Textで複数形に対応する

# 環境
Xcode 14.2
iOS 16.2

# 概要

SwiftUIでTextとstringdictファイルを使って、複数形対応を行います。

## 複数形対応

得点などを示す英語pointを例としてみます。

1点を表す場合、*one point*となりますが、複数の得点がある場合は*three points*などpointの部分が複数形に変化します。また得点が0の場合も*no points*などと表現すると思います。

そのような、値によって変化するテキストに対してstringdictでの対応を行います。
設定方法に関しては [公式ドキュメント](https://developer.apple.com/documentation/xcode/localizing-strings-that-contain-plurals) を参照してください。


# SwiftUIによる複数形対応
実際にSwiftUIに複数形対応を行なっていきます。

## 複数形で表示したいTextを用意
まずは、得点を表現するTextを用意します。
以下は得点を表示するTextと、得点を操作するStepperで構成しています。
Textの中身は変数を含んだ文字列にします。実際に使う場合はユニークな文字列がいいです。

```swift
struct ContentView: View {
    @State private var point = 0
    var body: some View {
        VStack {
            Text("\(point) points")
            Stepper(value: $point, in: 0...100) {
                Text("Counter")
            }
        }
    }
}
```

## 複数形対応対象のキー名を取得 (省略可能)
ツールバーのProduct→Export Localizations...でxclocファイルが出力されますので、そこから該当のキーを確認してコピーします。
コピーすることでキーを確実にstringdictファイルに入力するのが目的ですが、キーは数値部分が **%lld** と変換されているものになるので、不要であればこのステップは飛ばしてください。

![スクリーンショット 2023-05-11 16.46.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687960/92d7bc9c-43d4-558d-cebb-897428af1b14.png)

## stringdictに該当のキーで値を設定
あとはstringdictに先ほどのキー **%lld points** を追加します。以下の例では、数値が0の場合は **No points**、ポイントが1の場合は **1 point**、それ以外の場合は **points**の複数形で表示されます。

![スクリーンショット 2023-05-11 17.12.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687960/c8be9daf-e313-579a-5c1b-f2c23b5c4210.png)


```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>%lld points</key>
	<dict>
		<key>NSStringLocalizedFormatKey</key>
		<string>%#@VARIABLE@</string>
		<key>VARIABLE</key>
		<dict>
			<key>NSStringFormatSpecTypeKey</key>
			<string>NSStringPluralRuleType</string>
			<key>NSStringFormatValueTypeKey</key>
			<string>lld</string>
			<key>zero</key>
			<string>No points</string>
			<key>one</key>
			<string>%lld point</string>
			<key>other</key>
			<string>%lld points</string>
		</dict>
	</dict>
</dict>
</plist>
```


# 動作

以下はシミュレータでの動作の様子です。
ちなみに、stringdictは[Language Plural Rules](https://www.unicode.org/cldr/cldr-aux/charts/22/supplemental/language_plural_rules.html)に準拠しているようなので、動作確認するにはシミュレータの言語をEnglishなどのoneに対応した言語で確認する必要があります。

![Simulator Screen Recording - iPhone 14 Pro - 2023-05-11 at 17.10.07.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687960/b3c7030a-d687-7fff-ccd9-ebd0ba44c40b.gif)
２２．今日の日課２０　原子力発電と核融合発電

# はじめに

　日課として、その日に気になったテーマについて論文や調べたことをまとめます。

# 今日の日課

## テーマ：原子力発電と核融合発電についてまとめる

### １，原子力発電の仕組み
　原子力発電は核分裂反応のエネルギーを利用している。具体的には、ウランやプルトニウムという重い原子にエネルギーを持った粒子（中性子）をぶつけることで核分裂反応を起こす。この時に大きなエネルギーが発生する。このエネルギーは原子核の種類によって異なるが、約１億９千万～５千万ボルトになる。（ウラン235は１グラムで石油2000リットル分のエネルギー）
　原子炉内はゆっくりとした核分裂をさせるために、燃料にウランは３～５％しか含まれていない。
　また、原子炉内の基本的な構造はウランやプルトニウムをペレット状（固形の粒）にした燃料棒、中性子の数を制御する制御棒、核分裂時に発生した中性子を減速させ発生したエネルギーを取り出すための水、緊急時・非常時用の緊急炉冷却装置からなる。ここで、原子力発電は、元となるエネルギーが核分裂反応からきていることを除けば、温めた水を蒸気に変えてタービンを回すことで発電する点は火力発電と同じである。

### ２，核融合発電の仕組み
　核融合発電では、軽い原子核を持つ重水素と三重水素（トリチウム）で核融合を起こすことで発生する中性子のエネルギーを発電に利用する。この時のエネルギーは1グラムの核融合燃料（DT燃料・Dは重水素、Tは三重水素）で約石油8トン分のエネルギーとなる。
　核融合発電の原子炉内では、重水素Dと三重水素Tを高速でぶつけるために、DとTを１億度以上に加熱する。この時に、DとTはプラズマという状態になる。このプラズマを高密度で長時間封じ込めることで核融合を連続して起こすことができる。

### ３，核融合発電の種類
　よく知られたほうほうとして、二つの種類がある。一つ目はトカマク型というもので、日本やヨーロッパ、アメリカを中心に研究されている。日本では、2020年にトカマク型の実験装置JT-60SAが茨城県那珂市に日欧共同で建設された。また、フランスにもITER（国際熱核融合実験炉）計画によりトカマク型の核融合炉が建設されている。トカマク型では、発生した中性子をブランケットと呼ばれるBeとLiでできた壁によって熱に変換する。
　二つ目はレーザー核融合方式で球状に固めた燃料カプセルにレーザーパルスを照射することで瞬間的に圧縮して核融合反応を起こす。この方法で、2022年にアメリカの国立研究所がレーザーの1.5倍のエネルギーを取り出すことに成功している。
　しかし、上記二つの方法には問題点もある。トカマク方式では、熱を得るのに必要なブランケットが巨大で約2年で取り換えが必要であること。レーザー方式では、現時点では一日に数回しかレーザー照射が行えないことやトータルでのエネルギーの利得が0.8％で発電に使用するエネルギーのほうが発電されるエネルギーよりも小さいことがあげられる。これらの方法では、実用化に時間がかかり、実用化されるのは早くても2030年半ばとされている。
　最近では、第三の方式が出てきている。それは二つのドーナツ状に封じ込めたプラズマをぶつけることで超高温を実現し核融合を起こすという方式である。実際に、アメリカのベンチャー企業が2024年にこの方式で発電を始めるとしている。この方式は上記の二つの方式よりも優れた部分がいくつかありより早期の実用化が期待されている。

# 参考資料
（１）第3の核融合発電、2024年にも発電開始へ
https://xtech.nikkei.com/atcl/nxt/column/18/00001/07822/
（２）米研究所がレーザー核融合の“点火”成功で実用現実味、阪大の技術で加速も
https://xtech.nikkei.com/atcl/nxt/column/18/00001/07516/
（３）遂に組立完了　世界最大の核融合超伝導トカマク型実験装置JT-60SA～　今後、初プラズマ着火に向けて始動　～
https://www.qst.go.jp/site/press/40480.html
（４）先進プラズマ研究開発　JT-60SA計画とは
https://www.qst.go.jp/site/jt60/5150.html
（５）NIFS 核融合科学研究所
https://www.nifs.ac.jp/ene/qa/qa_03.html
（６）先進プラズマ研究開発　誰でも分かる核融合のしくみ | どのようにすれば核融合反応を起こすことができるの？
https://www.qst.go.jp/site/jt60/4931.html
（７）核融合発電と原子力発電の違い
https://www.matsusada.co.jp/column/nuclear_fusion_power_generation.html
（８）原子力発電の仕組み
https://www.fepc.or.jp/enterprise/hatsuden/nuclear/index.html
（９）機械工学事典,一般社団法人日本機械学会
https://www.jsme.or.jp/jsme-medwiki/doku.php?id=12:1002010
deviseの導入[Rails]

# 目次
[環境](#環境)
[Gemの導入](#Gemの導入)
[deviseのインストール](#deviseのインストール)
[Model](#Model)
[Routing](#Routing)
[View](#View)
[最後に](#最後に)

# 環境
mac OS Ventura 13.3
cloud9
Rails 6.1.7
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-linux]
git version 2.39.2

# Gemの導入
まずは、gemfileにdeviseを記述します。
```Gemfile
gem 'devise'
```
bundle installを忘れずに！

:::note warn
bundle installとは？
Gemfileに記述した Gem を、Rails アプリケーション内で使用できるようにインストールするためのコマンド。
:::

# deviseのインストール
devise を動作させるために必要な設定ファイルを作成するためにインストールします。
```
rails g devise:install
```
::: note warn
devise の場合は Gem をインストールした後に、改めてインストールの手順が必要となります!
:::

# Model
テーブルを 1 から設計するには、ユーザテーブルを作成して、ログインに必要なユーザ情報を保存する必要がありますが,
devise を利用すると、このユーザテーブルを自動的に作成してくれます!

モデル名は「User」とした例です。
↓
```
rails g devise User
```
上記のコマンドを実行すると、
User モデル（ユーザ情報を操作する）
users テーブルのマイグレーションファイル（ユーザ情報を保存する）
の2つが作成されます！

usersテーブルにカラムを追加したりと編集できます。
完了したら、「rails db:migrate」を忘れずに行いましょう！

# Routing
devise のモデルを作成したことで、config フォルダの routes.rb ファイルには、ルーティングが自動的に追加されていますので、確認してみてください！
```config/routes.rb
Rails.application.routes.draw do
devise_for :users #この記述が追加されている
end
```
# View
ログイン、新規登録画面を編集するには対応するviewが必要です。
以下コマンドで作成します！
```
rails g devise:views
```
必要なviewは作成されているか確認してみてください！

# 最後に
今回は、deviseの導入方法を簡単に説明しました！
deviseを導入すると簡単にログインなどのユーザー機能が作れるので非常に便利です！
マイグレーションファイルの編集方法や、ログインのviewの編集、ログアウトリンクの付け方など、詳しく知りたい方は他の記事等を参考にしてみてください。
最後までご覧いただきありがとうございました！
java初心者が行く～保守性の高いクラス～

# はじめに
java初心者が備忘録的に書いています
参考文献：https://amzn.asia/d/5EFHrx4

# 良いクラス
良いクラスとはインスタンス変数とインスタンス変数を用いるメソッドが同じクラスに記述しているクラスのことをいう。
ではなぜ同じクラスにあったほうが良いのか。
データだけが記述されたデータクラスを例に考えてみる。
データだけが記述されたクラスではそのデータを使用した処理が様々なクラスで実装されることが予想される。そのためメンテナンスや追加機能を記述する際に様々なクラスファイルを見ないといけない。また、とある処理を行っているメソッドがどこにあるのかわからないので同じ動作をするコードが点在する可能性がある。
そのためインスタンス変数とインスタンス変数を用いるメソッドが同じクラスに記述しているクラスが良いクラスであるといえるのである。

今回はできるだけ良いクラスというお題で以下のクラスを作成してみた。
実装内容とは
1. 名前と年齢を入力
1. 何年後の年齢を知りたいか入力
1. 表示

という流れである。（実装内容としてはくそしょうもない）
引数の値引き渡しミス防止でインスタンス変数を渡すように意識した。

1. 

```java:Addage
package sample;

public class AddAge {
	final int add;

	public AddAge(int age) {
		this.add = age;
	}

	public int returnAddage() {
		return add;
	}
}
```

```java:AfterAge
package sample;

public class AfterAge {
  
	final private int age;
	final private String name;
	final private AddAge addAge;



	public int getAge() {
		return age;
	}

	public String getName() {
		return name;
	}

	public AddAge getAddAge() {
		return addAge;
	}

	public AfterAge(final int age, final String name, final AddAge addAge) {
		if(age < 0) {
			throw new IllegalArgumentExeption("年齢が負の数字です");
		}
		if(name == null) {
			throw new IllegalArgumentExeption("お名前を入力してください");
		}
		this.age = age;
		this.name = name;
		this.addAge = addAge;
	}

	public AfterAge addAge(final AfterAge year) {
		int newAge = year.age + addAge.returnAddage();

		return new AfterAge(newAge, this.name, addAge);
	}
}
```

```java:Main
package sample;

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		int age;
		int after;
		String name;

		Scanner scanner = new Scanner(System.in);

		System.out.println("お名前を入力");
		name = scanner.next();

		System.out.println("何歳ですか");
		age = scanner.nextInt();

		System.out.println("何年後の年齢が知りたいですか");
		after = scanner.nextInt();

		scanner.close();

		AddAge addAge = new AddAge(after);
		AfterAge afterAge = new AfterAge(age, name, addAge);

		AfterAge ans = afterAge.addAge(afterAge);

		System.out.println(afterAge.getName() + "さんの" + afterAge.getName() + "年後の年齢は" + ans.getAge() + "歳です");

	}
}

```
処理内容はゴミみたいなものだがこんな感じで保守や維持、バグに強いクラス作成を意識したい。
日本の名目GDPの推移（内閣府データから）

# はじめに
今回は、国内サイトから取得した日本のGDPデータの可視化を目指す。
海外のよく整備されているデータでさえその処理に苦労している私には、日本語サイトはきついが、やってみた。
（5/19追記）
5/17に速報データが更新されていたので修正。


# データ
内閣府のホームページ（https://www.esri.cao.go.jp/jp/sna/menu.html ）にある、1994年からの名目暦年データを使う。
英語版の方から入ってみたところ、 ~~https://www.esri.cao.go.jp/jp/sna/data/data_list/sokuhou/files/2022/qe224_2/tables/gaku-mcy2242.csv~~  https://www.esri.cao.go.jp/jp/sna/data/data_list/sokuhou/files/2023/qe231/tables/gaku-mcy2311.csv に到達したが、途中の/jp/が示すように日本語版の方にあるやつで、文字コードはANSIコードらしく、ありがたみなし。

EXCELで開いてみると、以下のように、8行目以降の1列目に暦年、2列目に名目GDPのデータが入っていることはわかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3305624/8bbfc534-dbd5-8139-a589-c7e3fbceef29.png)
# コード
もっと賢いやり方で処理したいが、私の能力では無理なので、以下のようなコードを備忘録として残す。

```Python
import pandas as pd
import matplotlib.pyplot as plt

# CSVからデータを読み込む
url = "https://www.esri.cao.go.jp/jp/sna/data/data_list/sokuhou/files/2023/qe231/tables/gaku-mcy2311.csv"
df = pd.read_csv(url, skiprows=6, encoding='latin1')   # データは8行目以降なので、6行スキップ

# 必要な列だけを抽出
df = df.iloc[:, [0, 1]]  # 最初の列と2番目の列を取り出す

# 列名を変更
df.columns = ['Year', 'GDP']

# 欠損値を含む行を削除
df = df.dropna(subset=['Year', 'GDP'])

# 'Year'の不要な文字を削除し、数値に変換
df['Year'] = df['Year'].map(lambda x: str(x).split('/')[0]).astype(int)

# 'GDP'のカンマを削除し、数値に変換
df['GDP'] = df['GDP'].str.replace(',', '').astype(float)

# データをグラフ化
plt.figure(figsize=(10, 5))
plt.plot(df['Year'], df['GDP'])
plt.xlabel('Year')
plt.ylabel('GDP (Billion Yen)')
plt.title('Nominal GDP of Japan(1994-2022)')
plt.grid(True)
plt.show()
```


##  出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3305624/a271d158-57e1-be68-565a-eddc163600ba.png)

名目GDPのデータとは思えない形状で、90年代半ば以降の日本経済の悲惨さだけがにじみ出るグラフになってしまった。


# ご指摘を受け、縦軸範囲を修正
グラフが変なのは縦軸範囲が悪いからだというご指摘を受け、以下のコードを追加して、縦軸を0～600兆に指定して描きなおした。

```Python
plt.ylim(0, 600000) 
```

##  修正後の出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3305624/63a6ada5-df23-ea9c-37fa-3e66c0bfd029.png)


# おわりに
今回の処理はほとんど手作業でやったに等しい。こんなデータ処理はEXCELでやればよいというご指摘はごもっともだ。ただ、この先GDP統計を少しいじってみたいので、ANSIコードのデータで一応の処理ができたことが今回の成果と思っておきたい。
rails 指定できる型

# 指定できる型
railsで指定できる型のメモ。
| 型 | 説明 |範囲|具体例|
|:-:|:-:|:-:|:-:|
|string    | 文字列                                       | 最大長: 制限なし                                 | 例: "Hello World"                                |
|text      | 長い文字列                                   | 最大長: 制限なし                                 | 例: "Lorem ipsum dolor sit amet..."              |
|integer   | 整数                                         | 範囲: -2,147,483,648 から 2,147,483,647         | 例: 42                                           |
|float     | 浮動小数                                     | 範囲: IEEE 754形式の倍精度浮動小数点数           | 例: 3.14                                         |
|decimal   | 精度の高い小数                               | 範囲と精度: ユーザー指定                       | 例: 9.99                                         |
|date      | 日付                                         | 範囲: 4713 BCE から 5874897 CE                   | 例: 2023-05-11                                   |
|time      | 時間                                         | 範囲: 00:00:00 から 23:59:59                     | 例: 14:30:00                                     |
|datetime  | 日時                                         | 範囲: 4713 BCE から 5874897 CE                   | 例: 2023-05-11 14:30:00                          |
|timestamp | タイムスタンプ                               | 範囲: 1970-01-01 00:00:01 から 2038-01-19 03:14:07 | 例: 1620730200                                  |
|boolean   | 真偽値 (true/false)                          | 2つの値: true または false                      | 例: true                                         |
|binary    | バイナリデータ                               | 最大長: 制限なし                                 | 例: 0x0123456789ABCDEF                           |
|bigint    | 大きな整数値 (64ビット整数)                   | 範囲: -9,223,372,036,854,775,808 から 9,223,372,036,854,775,807 | 例: 9223372036854775807            |
|array     | 配列                                         | 複数の値を保持する配列                         | 例: [1, 2, 3, 4]                                 |
|json      | JSONデータ                                    | JSON形式のデータ                               | 例: {"name": "John", "age": 30}                  |
|enum      | 列挙型 (指定された値の中から1つを選択)         | 指定された値の中から1つを選択                 | 例: "red", "green", "blue"                       |
LINE WORKS 複数組織を一括削除

LINE WORKSの標準機能では出来ないあれやこれやを、
LINE WORKS API 2.0 x GASを使ってサクッと解決するシリーズ

今回は、組織の一括削除です。

組織の削除はLINE WORKSの管理画面からひとつづつ手動で行う必要があります。
これをGAS x LINE WORKS API2.0 を使って一括で削除できるようにします。

:::note info
組織を削除すると、30日間はデータが保持され、復元が可能ですが、
失われたデータは復旧不可能なので、自己責任のうえご利用ください。
:::


#### 実行イメージ

Google Sheetに削除したい組織のExternal Keyを入力し、「組織の一括削除」ボタン押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/60c1049e-4353-91a9-336b-032a41521f8c.png)

ポップアップ⇒OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/6f349423-39c1-5beb-fad4-f06a3c3eef55.png)

削除完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/84fbf8cc-9bb3-5abd-5261-84e17223b710.png)



実行結果をログで確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/d2f3005a-e61c-d492-0164-c43c0b8d34c3.png)



## 必要なもの
* Googleアカウント（無償でもOK）
* LINE WORKS Developers Consoleへのアクセス権限を持つID
* [LINE WORKS 便利ツール](https://qiita.com/nonattonolife/items/16181d666b8246e3f28d)


## 事前準備


以下の記事を参考に、LINE WORKS 便利ツールを使うための事前準備をしてください。
すでに完了している場合はスキップしてください

https://qiita.com/nonattonolife/items/16181d666b8246e3f28d


## 組織を一括削除する

LINE WORKS便利ツールの準備ができたら
「deleteOrg」シートを、隠しフィールドから選択して開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/7754e3ff-54ad-2dd8-88e1-2e5c2bb3fd36.png)


削除したい組織のExternal Keyを入力し、「組織の一括削除」ボタン押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/60c1049e-4353-91a9-336b-032a41521f8c.png)

ポップアップ⇒OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/6f349423-39c1-5beb-fad4-f06a3c3eef55.png)

削除完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/84fbf8cc-9bb3-5abd-5261-84e17223b710.png)








### 2. 実行結果の確認

「log」シートを開きます
タイムスタンプ、実行結果、削除した組織のExternalKeyが記録されます。
失敗して途中で処理が止まった場合は、どこまでのIDが削除できているかログから確認し、
続きのデータから削除再開できるようdeleteOrgシートを修正した上で再実行しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/d2f3005a-e61c-d492-0164-c43c0b8d34c3.png)



今回は組織の一括削除を紹介しました。

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

LINE WORKSの標準機能では出来ないあれやこれやを解決するLINE WORKS便利ツール
今後はこんなツールを予定しています

* ユーザを一括削除したい
* 組織を一括追加したい
* グループを一括追加したい
* ID名を一括変更したい
* メッセージを一斉配信したい
* 監査ログを自動保存したい
* SNSのコメントやメッセージをLINE WORKSへ通知したい
etc...

今後なにかご要望があればお知らせください
作ってみるかもしれないです。
railsでコメントを自動保存してみた〜超ざっくり〜　改訂予定

railsでQuiitaみたいな自動保存ってどうやってできるんだろうとふと思ったので、超ざっくり作成してみました。今後、より良くしていく予定ですが、現段階ではかなりざっくりです。

もし改善案とか教えてもらえると嬉しいです...

## ビューの記述
```show.html.haml
%form#comment
  %label{ for: 'comment_area' } コメント
  %textarea#comment_area{ name: 'interview_comment[comment]', value: (@comment if @comment)

= javascript_include_tag 'auto_save'
```
## コントローラの記述
こちらはajaxでデータが送られてきます。
コメントがまだない場合は新しく作成し、ある場合はアップデートしています。

```comments_controller.rb
class CommentsController < ApplicationController
  def new
    @comment = Comment.new
  end
   
  def show
    #差し当たりこの定義
    @comment = Comment.find(params[:id])
  end

  def create
    existing_comment = Comment.find_by(params[:id])
    
    if existing_comment
      existing_comment.update(comment: params[:comment])
    else
      new_comment = Comment.new(comment_params)
      new_comment.save
    end

    redirect_back(fallback_location: root_path)
  end

  private
  def comment_params
    params.require(:comment).permit(:comment)
  end
end
```
# JSの記述
JSは長いこと触っていなかったので、出来上がってみると単純ですが、なかなか苦戦しました...
ajaxのurlの渡し方がわからず、様々に試しましたが、結局`rails routes`で出てくるurlでよかったです。

ajaxをJSでAJAXリクエストを直接記述することは可能みたいですが、CSRF保護、リモートフォーム処理などを手動で再実装する必要があるそうで、時間がかかりそうだったのでjQueryを使いました。

```assets/javascripts/auto_save.js
// = require jquery2
const comment_area = document.getElementById('comment_area');

if (comment_area) {
  let timeoutId;

  const autosave = function() {
    const comment = comment_area.value; 
    const url = '/comments';

    $.ajax({
      url: url,
      type: 'POST',
      // dataはハッシュで指定
      data: { comment: comment },
      dataType: 'script'
    });
  };

  // フォームの変更を監視し、10秒ごとに自動保存を実行する
  comment_area.addEventListener('input', function() {
    clearTimeout(timeoutId); 
    timeoutId = setTimeout(autosave, 1000); 
  });
}

```

ただ、この自動保存だと問題を抱えています。以下は今後の課題です。

:::note
１、現状は１秒ごとに保存されるので、データベース負荷がかなり重そう。

これはどうやって解決できるのか...

すぐ思いつく方法では、以下の２つなんですが、どちらもなんかいけてない。
    * セーブの間隔を長くする
    * `input`ではなく、`focusout`を使用する

２、今後保存するデータが増えたときに、それぞれに関数を適用していく必要がある。
    例えば、「コメントした人の名前も保存したい」となった場合に、そちらのinputにも関数を適用させないといけない。また、最初を空欄にしておくとnilでデータが送られてしまうので、デフォルト値を設定しておけばいいのか？何がいいか分からない。
:::
nodejsをasdfのnodejsに変更したがバージョンが変わらない

# はじめに

この問題につまることは殆どないと思いますが、自分で色々同じような問題に遭遇した経験があったのでメモ程度にまとめます

# 問題

nodejsのバージョン切り替えを簡単にできるように`/usr/local/bin`にいれていたものから、asdfに変えようとしました

```
$ which nodejs
/usr/local/bin/nodejs # これをasdfでバージョン管理したい
$ asdf install nodejs lts
$ asdf global nodejs 18.16.0
$ node -v
# なぜか14.21.3のローカルの古いものに向いている
```

しかし、なぜかバージョンが変更されませんでした

# 解決方法

ターミナルを再起動することで治りました
`node -v`をそのままasdfならやりがちだけど、今回はローカルからasdfに切り替えたので再起動しないと方向が変わりませんでした

# おわりに

記事はこれくらいの粒度でかいても誰かのためになると思っているので雑にかいてみました
Reactのimportでnode_modulesにあるのに見つけることができずVSCodeでエラーになる

# はじめに

Reactにemotionをいれたところnode_moduleにはあるのにインポートできない問題が起きたのでまとめます
他の方のVSCodeでは問題なく読み込めているようでした

# 問題

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/49d28be1-e476-ea95-52fe-b961994cf3b5.png)

```
モジュール '@emotion/cache' が見つかりません。'moduleResolution' オプションを 'node' に設定することか、'paths' オプションにエイリアスを追加することを意図していましたか?ts(2792)
````

なぜか私の環境ではエラーが出ています。

# 解決方法

エラー通りに`tsconfig.json`を修正します

`tsconfig.json`をひらくとたしかにエラーになっていました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/cf77562e-d3bc-9f94-91cf-2050bdaf9572.png)


`bundler`を`node`に変えます


```json:tsconfig.json
    "moduleResolution": "node",
```

これでVSCodeのエラーは消えました

# シンの解決方法

`node`は非推奨になっているので`bundler`で動かす場合は以下の記事にまとめました

https://qiita.com/Sicut_study/items/97b979c5e45277f0ffa2

# おわりに

おうちで開発していてもよく現れる問題でした。あらためて向き合って理解が進みました
デプロイ先からGitHubにpushできない

# はじめに
2022年４月にG’sACADEMY DEVコースを卒業したすえまつです。
卒業制作をデプロイするにあたり色々詰みつつもなんとか解決でしたので、備忘録的に記事を書いてみようと思います。

まず第一弾、デプロイ先からGitHubにpushできないの巻です。
HTTPS接続とSSH接続の設定をごっちゃにしてミスってることが判明したけど、ちゃんとリカバリーできたよというお話です。

# 開発環境や使用言語（関係あるものだけ）
| 項目名| 説明 |
|:-:|:-:|
|OS|MAC OS|
|開発環境|VS Code|
| 言語  |Python3|
| フレームワーク |  Django３ |
|  デプロイサーバ |  さくらのVPS |
|VPSのOS|ubuntu|

# 起こっていた事象
ローカルからGitHubにpush→できる
GitHubからVPSサーバにpull→できる
VPSサーバからGitHubにpush→できない（なんで！！）

# 設定を確認してみた
できる同期とチューターさんによると、
「git remote -v を実行してみて、origin の隣にhttps スタートのエンドポイントが出てきたらhttps接続、git@ スタートのエンドポイントが出てきたらssh接続であることが確認できる」
らしい。

まずは、ローカル。
```
origin	git@github.com:SakiSuematsu/CraftMemo.git (fetch)
origin	git@github.com:SakiSuematsu/CraftMemo.git (push)
```
こちらはSSH接続になっている。

次にVPSサーバ。
```
origin	https://SakiSuematsu@github.com/SakiSuematsu/CraftMemo.git (fetch)
origin	https://SakiSuematsu@github.com/SakiSuematsu/CraftMemo.git (push)
```
HTTPS接続になってる！！
そういえば、git cloneした時に間違えたかも…

# 対処方法
まずはVPSサーバにSSH設定を入れる。
こちらは講義で習う内容なので割愛。

それから、[こちらの記事](https://tks2.co.jp/2021/01/18/github-ssh/)を参考にして、
.gitの下にあるconfigファイルのurlをSSH接続のものに書き換えたら、無事pushできました！

``` 
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
[remote "origin"]
	url = git@github.com:SakiSuematsu/CraftMemo.git 
	fetch = +refs/heads/*:refs/remotes/origin/*
〜〜〜以下省略〜〜〜
```

# まとめ
そもそもgit cloneするときにHTTPS接続の方を指定したのが間違いの始まりだったのですが、間違えてても修正すれば大丈夫というお話でした。
同じ間違いはしたくないので、自戒の記事でした。

# 次回予告
いっぱい詰んだからまだまだネタがあるのです。
* 画像の保存先をAmazonS3に変えたら、model-viewerで３D表示ができなくなった
* SSL証明書を入れたいけど、ドメイン？DNS設定？よくわからない
* SSL証明書は最初から入れておくべきだけど、後から入れることもできたよ

順番は未定ですが、まとめられそうなものから記事にしていきます！
【Tips】関数の順番的に、overrideはoverrideで並べたほうが良い【リファクタリング】

以下が【修正前】のコード

![スクリーンショット 2023-05-11 16.04.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359201/b5a951f3-d039-095d-6959-6196a43e0969.png)


以下が【修正後】のコード

![スクリーンショット 2023-05-11 16.01.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359201/162c4602-72c6-9d54-01d6-2188642441f3.png)
Railsで1か月前の月初、1年前の年始、1週間前の週頭をできるだけ短いコードで書く

# やりたいこと
例えば、日付間隔が指定されたときに、以下のように日付を取りたいとする

| 日付間隔 | 値 | 取りたい日付 | 例 | 
| ------ | -- | ---- | -- |
| 日 | day | 1日前 | 2023年5月10日(水)　⇒　2023/5/9(火) |
| 週 | week | 1週間前の月曜 | 2023年5月10日(水)　⇒　2023/5/1(月) |
| 月 | month | 1か月前の月初 | 2023年5月10日(水)　⇒　2023/4/1(土) |
| 年 | year | 1年前の年始 | 2023年5月10日(水)　⇒　2022/1/1(土) |

# 解
```ruby
# span_typeに上表の"値"が入る
(Time.zone.today - 1.send(span_type)).send("beginning_of_#{span_type}").to_date
```

# 解説
`send関数`で指定した文字列の関数が呼ばれる。
例えば、`Time.zone.today - 1.send('month')`は`Time.zone.today - 1.month`と同義


ワンライナー大好き。

# 追記（2023.05.31）
@koki_73様からアドバイスいただきました！prev系関数を使う案です。
```ruby
Time.current.send("prev_#{time_span}").send("beginning_of_#{time_span}").to_date
```
【速報】Raycast の新有料プラン「Raycast Pro」で何ができるか

こんにちは、赤青鉛筆太郎です。

<img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636677/c6aefd6a-438a-2b32-f007-540cd12c32d3.jpeg">

なんかついさっき(2023/05/10)、Raycastに新しい課金プランが追加され、そのプランで使える新機能が公開されたので日本語でまとめます。実際に軽く使ってみた感想も書きます。

これまではfreeプラン(\\$0/月)、teamプラン(\\$15/月)の2つでしたが、ここに新たに個人向け有料プランである「proプラン」(\\$10/月)が追加されました！

proプランは　\\$10/月　または　1年分まとめ買いで\\$8/月　払って購入できます。

proプラン(とteamプラン)では以下が使えます！
- freeプランの内容すべて
- Raycast AI (ベータ版ではなく正式版)
- 設定のクラウドを通した同期
- カスタムテーマ
- 無制限のクリップボード履歴
- フローティングノート 2.0 (現在未実装 将来追加予定)
- ウィンドウ管理コマンド (現在未実装 将来追加予定)
- 翻訳機能(現在未実装 将来追加予定)

それぞれ見ていきましょう。

### freeプランの内容すべて

言うまでもなくこれまでに使えたなにがしかが使えなくなることはありません！
なおRaycast AI beta は廃止されるので無料でAIを使うことはできなくなりました。

### Raycast AI (ベータ版ではなく正式版)

https://qiita.com/red_blue_tarou/items/53fab6159935fcea5243

これまではbeta版だったのが正式版になりました！
でも正直変わったところはほぼ無いのでAIの便利さは私が書いた上記記事を参照してください。
正直このためだけに課金したところがある。そして実際便利。

### 設定のクラウドを通した同期

同じアカウントを使っていれば設定が自動で同期されます。
同期されるものとされないものの一覧は以下です。アプリ内の表記をそのまま持ってきました。
![スクリーンショット 2023-05-11 14.52.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636677/576b10c8-c81d-c10e-bec4-dd7464ba45c3.png)

「同期されないもの」に書いてないものはだいたい同期されると思っていいです。だいたいは妥当な内容だと思います。（floating notesの内容はさすがに同期しなくていいと思うけど……メモ用だし………）

ただし、拡張機能の一部の機能は同期されないみたいです。「[Text Shortcuts](https://www.raycast.com/koinzhang/text-shortcuts)」拡張機能を用いて自作したテキスト書き換え機能が同期されてませんでした。
たぶん直接実行できず、一度拡張機能の内部に入ってから実行するタイプのやつは同期されないっぽいです。

あと script command(自作でプログラムを書いて作った単発のコマンド) も同期されません。たぶん自作拡張の一部に組み込めば同期してくれると思うけど…

### カスタムテーマ

Raycastの色合いを自由に変更できます。Generalに「Open Theme Stadio」という項目が追加されていますね。

![スクリーンショット 2023-05-11 15.15.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636677/3e66379f-3871-a320-5cee-d32cab099ae6.png)

クリックしてみましょう。
　
![スクリーンショット 2023-05-11 15.16.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636677/9243c6a0-14a2-7a05-5fa4-17fcc6da3401.png)

こんな感じで実際のRaycastの画面を模したもの(クリックやドラッグも可能)をいじりながら色合いを変えられます。今見てる青っぽい画面は自作です。
また、このような自作したテーマを公開することもできます。
各種の色を変更するのが基本であり、プログラマブルな要素は無いですが、まあシンプルに嬉しい機能ですね。

### 無制限のクリップボード履歴

なんかこれまでは最大1ヶ月までしか保存できなかったのが6ヶ月、無制限も選べるようになりました。どうでもいい。

### フローティングノート 2.0 & ウィンドウ管理コマンド & 翻訳機能(現在未実装 将来追加予定)
謎です。まだ使っていませんが将来に期待を込めて★5です。(?)


# まとめ

AIがメインで、クラウド同期とカスタムテーマはサブのメリットですね。一日40円で買えるなら十分ですね。
【Linux】第４回講義の備忘録 ～課題のためのヒント～

# 今回扱うコマンド
* `chmod`:パーミッションの変更
* `du`:ファイルサイズの容量の表示
* `tar`:tar形式のアーカイブの作成/展開

## `chmod`コマンド
このコマンドはファイルやディレクトリのアクセス権限を変更します。
`& chmod [オプション] <権限> <ファイル名>`

|オプション　|説明|
|----|----|
|`-R`|指定したディレクトリと、その下にあるファイルのアクセス権限をすべて変更する  |
|`-f`|アクセス権限を変更できない場合だけエラー表示する|
|`-c`|ファイルモードが変更されたときだけ冗長モードで表示する|

アクセス権限については以下のように表記します。「`rwx`」はそれぞれ「読み込み可能」「書き込み可能」「実行可能」を表し、前から順番に次のようにどのユーザーにアクセス権限を与えるかを設定できます。

`- ➀rwx ➁rwx ➂rwx`
➀：所有ユーザーのアクセス権限
➁：所有グループのアクセス権限
➂：その他のユーザーのアクセス権限

ファイルタイプについて簡単に以下の種類があります。
* `-` ファイル
* `d` ディレクトリ

|権限パターン|引数|
|----|----|
|`---`|0|
|`--x`|1|
|`-w-`|2|
|`-wx`|3|
|`r--`|4|
|`r-x`|5|
|`rw-`|6|
|`rwx`|7|

各桁について`-`ならば`0`、`r,w,x`のいずれかの文字がある場合は`1`といった3桁の2進数表記をしたときに各桁の和を求めることで上記のような8進数表記を得ることができます。

（例）`rw-`を2進数で表記すると`110`これを10進数で表すと`4+2+0=6`が得られます。

## `du`コマンド
このコマンドはファイルのディスク使用量をバイト単位で表示します。
`& du [オプション] <ファイル名>`

|オプション　|説明|
|----|----|
|`-a`|すべてのファイルサイズを表示する|
|`-h`|単位を付けて表示する|
|`--time`|すべての最終個往診時間を表示する|

## `tar`コマンド
このコマンドはtar形式で圧縮・解凍するコマンドです。
複数のファイルをひとつのファイルにまとめるのに使われます。
`& tar [ファンクション] [オプション] <ファイル/ディレクトリ名>`

|ファンクション　　|説明|
|----|----|
|`-c`|アーカイブを作成する|
|`--delete`|アーカイブから指定したファイルを削除する|
|`-t`|アーカイブの内容を一覧で表示する|
|`-x`|アーカイブからファイルを取得する|

|オプション　　|説明|
|----|----|
|`-v`|処理したファイルの一覧を表示する|
|`-f <アーカイブ名>`|指定したアーカイブを利用する|
|`-j`|bzip2形式を利用して圧縮・解凍をする|
|`-J`|xz形式を利用して圧縮・解凍をする|
|`-z`|gzip形式を利用して圧縮・解凍をする|

ファンクションとオプションは`-`を使用せず文字をつなげて実行します。

### 実行例
（例１）`& tar cvf 001.tar testfile`

|`testfile`ディレクトリを`001.tar`という名前でtar形式で圧縮します。`c`はアーカイブを作成、`v`は処理したファイルを一覧表示、`f 001.tar`は001.tarというアーカイブを利用（作成）します。|
|:-|

（例２）`& tar tvf 002.tar`

|002.tarという圧縮フォルダーの中身を解凍せずに一覧表示します。`t`はアーカイブ内を一覧表示、`v`は処理したファイルを一覧表示、`f 002.tar`は002.tarというアーカイブを利用する。|
|:-|

（例３）`& tar xf 003.tar`

|003.tarという圧縮フォルダーを解凍します。`x`はアーカイブからファイルを取得、`f 003.tar`は003.tarというアーカイブを利用する。このコマンドは、解凍結果は一覧で表示されません。|
|:-|

---
以上の内容で第3回課題はクリアできるのではないかと思います。
講義内の他のコマンド`gzip` `zip` `xz`コマンドに関しては省略します。
Flutter入門(随時更新)

# 目的
新職場でFlutter開発部隊にジョインされたので、学んでいく。

# Flutterとは

Googleによって開発及びサポートされているオープンソースの<b>フレームワーク</b>。現在では、Flutter は、iOS、Android、ウェブ、Windows、MacOS、Linux の 6 つのプラットフォームでのアプリケーション開発をサポートしている。

# Flutterの利点
- クロスプラットフォーム開発なので、開発工数が単純に1/2(ネイティブで書かなければいけない部分もあり)
- 👆に加えてネイティブ並みのパフォーマンスを発揮
- 高速、一貫性がある、カスタマイズ可能なレンダリング
- デベロッパー向けのツール
    - ホットリロード : ソースコードを保存するとビルドしなおすことなくアプリに反映される

# Flutterが使用するプログラミング言語
Dart : Googleが開発したUI構築に最適化されたプログラミング言語。`sound null safety`と呼ばれる機能でnullエラーの検出を容易にしている。

※私は以下の記事で基本的なDartの文法を確認しました。
- https://qiita.com/teradonburi/items/913fb8c311b9f2bdb1dd
- https://zenn.dev/iwaku/articles/2020-12-21-iwaku

# Widgetとは
- FlutterではWidgetを使用してUIレイアウトを構築していく。Widgetはウインドウ、パネル、ボタン、テキスト・・・ユーザーが画面上で見るすべてがWidgetで作成されている。
- Widgetを結合して新しいWidgetを作成可能。
----
参考記事 https://aws.amazon.com/jp/what-is/flutter/
【3・4週目】Python【スパルタコーディングクラブ】

・Flaskライブラリ　パッケージの構築
→FlaskとはPythonで書かれた軽量なWebフレームワーク。Pythonでのウェブアプリケーション開発をより効率的に行うことが可能になります。

・火星土地の共同購入サイトを制作
→POSTメソッド、GETメソッド

・『スパルタペディア』というサイト制作
→ターミナルの立ち上げ⇨mongoDBへアクセス⇨POSTメソッド⇨GETメソッド


【感想】
3週目の授業に参加することができず、4週目についていくことができなかった。
ターミナルからフォルダーを生成する工程でつまずきがちなため、復習が必要。
なんとなくやっていることはわかるのですが、具体的に今やっていることが何につながっているかが理解できていない。
静力学と材料力学 基本例題1.22 P16「材料力学演習(20221021)」をsympyでやってみた。 

# オリジナル
基本例題1.22 P16
http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=21

「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。＞sympy
https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy

# sympyで

```python
from sympy import *
a  ,b  =symbols('a b'    ,real=True)
t      =symbols('t'      ,real=True)
P      =symbols('P'      ,real=True)
T      =symbols('T'      ,real=True)
RAH,RAV=symbols('RAH,RAV',real=True)
myFx=Eq(  RAH-T*cos(t)    ,0)
myFy=Eq(  RAV+T*sin(t)-P  ,0)
myM =Eq((a+b)*T*sin(t)-a*P,0)    # (Aまわり)
ans=solve([myFx,myFy,myM],[T,RAH,RAV])
print("#T  ",ans[T  ].simplify())
print("#RAH",ans[RAH].simplify())
print("#RAv",ans[RAV].simplify())
#T   P*a/((a + b)*sin(t))
#RAH P*a/((a + b)*tan(t))
#RAv P*b/(a + b)
```
①私の環境は,pycharmです。
②よく聞くのは、Jupyterです。
③web上で、上記のソースを「SymPy Live shell」に、コピー貼り付けでもできました。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。
???　タブレット環境で、コピー貼り付けが実行できませんでした。???

https://live.sympy.org/

# Mathematicaで
勉強中

# 作図
勉強中
[Python] 小ネタ: 指定した桁を0か5に丸める

```python:python
# 指定した桁を0か5に丸める。
# 123で1の位を丸める場合は、digits=1。10の位をを丸める場合はdigits=2
def roundIntZeroOrFive(x: int, digits: int) -> int:
  n = int(f"{x:0{digits}}"[-digits])
  d = int(x / 10**(digits))
  # if 0 <= n <= 2:
  #   d += 0
  if 3 <= n <= 7:
    d += 0.5
  elif 8 <= n <= 9:
    d += 1
  return int(d * 10**digits)
```

```python:テストコード
def test(digit, times=10, minN=1, maxN=1000):
  for i in range(times):
    n = random.randrange(minN, maxN)
    print(f"{n:4} -> {roundIntZeroOrFive(n, digit):4}")
  print("")

test(1)
test(2)
test(3)
test(4)
```

```
 468 ->  470
 409 ->  410
 808 ->  810
 154 ->  155
 504 ->  505
 519 ->  520
 241 ->  240
 342 ->  340
 846 ->  845
 634 ->  635

 709 ->  700
 443 ->  450
 521 ->  500
 634 ->  650
 230 ->  250
 258 ->  250
  64 ->   50
 852 ->  850
 612 ->  600
 446 ->  450

 447 ->  500
 713 ->  500
 821 -> 1000
 437 ->  500
 744 ->  500
 942 -> 1000
 613 ->  500
 338 ->  500
 716 ->  500
 513 ->  500

 979 ->    0
 969 ->    0
 785 ->    0
 542 ->    0
 235 ->    0
 263 ->    0
 674 ->    0
  40 ->    0
 456 ->    0
 401 ->    0
```
ApacheとNginxについて

## はじめに
今回は、Webサーバの代表的であるApache,Nginxを比較しそれぞれのサーバに対して知識を深めていきます。


## まず、Webサーバとは？
Webサーバとは、パソコンやスマートフォンなどの端末からHTTP/HTTPSで送られたリクエストに応じてWebページやWebアプリケーションなどのコンテンツを提供するコンピュータプログラムのことを指します。私たちは、Webサーバのおかげで様々なホームページを見ることができます。


## Apache(アパッチ)
Apacheは、無償で利用できるオープンソースのWebサーバソフトです。

高い信頼性と充実した機能を備えているため世界中で多く使われています。WindowsやLinuxなどの様々なOSで動作することができます。

Apacheのシェアは、『[W3Techs](https://w3techs.com/technologies/overview/web_server)』によれば、2023年5月時点においては、32.0%でNginxに次ぐシェアが高いWebサーバであります。

Apacheの初版は、1995年にリリースされました。それ以降、version「1.3」,「2.0」,「2.2」, 「2.4」と大きく更新していきました。現在は「2.4系」のみ推奨リリースされていています。



## 設定ファイルについて
設定ファイルは、/etc/apache2/apache2.conf と /etc/httpd/httpd.conf があります。
LPIC202では、主にhttpd.confの内容について触れています。

しかし、Debian系であるUbuntuでのApache2の設定ファイルはapache2.confになります。

httpd.confは主にRed Hat系であるCentOSなどのApache設定ファイルとなります。


## Apacheのメリット
* 無償で利用ができ、高い信頼性と安定性がある
* モジュールを使用することで簡単に機能を拡張することができる
* 長い間、第一線で使われ続けため、技術情報が多い
* スムーズに処理を実行することができる


## Apacheのデメリット
* メモリを大量に消費する
* 同時処理に弱い



## Nginx(エンジンエックス)

NginxもApacheと同じく、オープンソースのWebサーバソフトです。

高い処理能力や並行処理能力を持ち、メモリを効率的に使用することができるため、処理速度が非常に高速な点が特徴です。

Nginxのシェアは、『[W3Techs](https://w3techs.com/technologies/overview/web_server)』によれば、2023年5月時点においては、34.4%と一番シェアが高いWebサーバであります。

Nginxは2002年にApacheで起こった『[C10K問題](https://ja.wikipedia.org/wiki/C10K%E5%95%8F%E9%A1%8C)』に対応べく登場しました。

Apacheとの主な違いは、Apacheは<font color="red">**すべての接続に対してプロセスを使用する**</font>半面、Nginxは、シングルスレッドを採用しているため、<font color="red">**一つのプロセスが複数の処理を行う**</font>ことができます。


このようなアーキテクチャにより、大規模サイトなどアクセスが大量と予想されるサイトのWebサーバとして使われています。

## Nginxのメリット
* 大量の同時接続に耐えることができ、はやい速度でコンテンツを提供することができる
* リバースプロキシやロードバランサの機能がある
* 柔軟にカスタマイズすることができる

## Nginxのデメリット
* 重たいデータの扱いには不向き
* 機能が少ない
* ソースコードが複雑

## ApacheとNginxどっち?
**Apache**：
* 少量の同時接続数で重い処理を必要とするコンテンツ

**Nginx**：
* 同時接続数が多く静的コンテンツが多いコンテンツ

## おわりに
今回は、ApacheとNginxについて軽くまとめてみました。それぞれ、コンテンツによってサーバを決めていくのがよい判断であるということが分かりました。
Webサーバは他にも、CloudflareとOLiteSpeedといったサーバもあります。Apacheのシェアは年々減少傾向があり、Cloudflareのシェアが増加しています。時代の流れに遅れないためにも新しい技術に触れることが大切であります。

## 参考
- [ApacheとNginxを比較！それぞれのメリット・デメリットを解説](https://www.geekly.co.jp/column/cat-technology/1903_096/)
- [UbuntuのApache設定ファイル](https://note.com/ictlink/n/nc494c4242bcb)
- [今さら聞けない　WEBサーバとはどんなサーバ？](https://www.no1web.jp/blog/15004/)
- [Apacheとは。Webサーバーソフトとしての特徴や将来性を解説](https://www.winserver.ne.jp/column/about_apache/#:~:text=Apache%E3%81%AF%E3%80%81%E7%84%A1%E5%84%9F%E3%81%A7%E5%88%A9%E7%94%A8,%E5%B9%85%E5%BA%83%E3%81%8F%E5%88%A9%E7%94%A8%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)
- [（Apache/Nginx/IIS）Webサーバー機能とは？よく使われるサーバーごとの違いについても解説](https://www.rworks.jp/system/system-column/sys-entry/16296/)
ExcelVBAでOutlookに着てるエラーメールのアドレスを取り出す。

大量の送信失敗が誰に届いていないのかを知りたいと要望があったのでVBAでリスト化しました。
とりあえず、適当なフォルダにエラーになってるメールをドラッグ＆ドロップで移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592669/ae3cf1d7-9021-c4c2-f1fe-272b7d877e03.png)

そしたらVBAで以下のコードを実行！！
「E:\メール\*」の部分はメールをドラッグで持って行ったフォルダを指定

    Sub メール解析()
    Dim c As Range
    Dim tmp As String
    
    Dim OL As Object
    Dim msg As Object
    
    Dim re
    Dim ptn As String
    Dim mtc
    
    Set c = ActiveSheet.Range("A1")
    Set OL = CreateObject("Outlook.Application")
    
    Set re = CreateObject("VBScript.RegExp")
    ptn = "<(.+?)>:"
    tmp = Dir("E:\メール\*")
    
    Do While tmp <> ""
        Set msg = OL.CreateItemFromTemplate("E:\メール\" & tmp)
        
        c.Value = msg.Body
        
        
        With re
            .Pattern = ptn
            .IgnoreCase = True
            .Global = True
            
            'If .Test(msg.Body) Then c.Offset(0, 1).Value = 1
            
            Set mtc = .Execute(msg.Body)
            If mtc.Count > 0 Then
                c.Offset(0, 1).Value = mtc(0).Value
            End If
            
        End With
        
        Set c = c.Offset(1)
        tmp = Dir()
    Loop


あとは、アクティブなシートに結果を書き出してくれます。

<メールアドレス>:

にしかマッチさせていないので他のパターンがあったら追加してください。
[自分用]なぜNext.js？

# なぜNext.jsを使用するのか
素のReactを使用すると、構文以外でつまづきやすいため。
ReactのフレームワークであるNext.jsを使用。

**素のReactで躓きやすいポイント**
・ルーティング
・cssモジュール
・SSR/SGらへん

## Next.jsの代表的な機能
**・image optimization**
ブラウザで画像を読み込む際に、最適化してくれる機能。

**・internationalization**
国際化対応。
海外にサイトを展開するときに便利。

**・Next.js Analytics**
Next.jsとVercelを組み合わせることで、Next.jsの分析等を行える。

**・Zero Config**
Next.jsでは、我々があまり設定をしなくても様々な機能を使えるように作られている。

**・Hyblid :SSG and SSR**
ブラウザの読み込み方を設定することができる。
より早く滑らかに表示させるための機能。

**・Incremental Static Generation**
上記と似ている。

**・TypeScript Support**
文字通り、typescriptをサポートしている。

**・Fast Refresh**
開発体験をよくするためのもの。
自動で有効化になっているため、そこまで気にしなくていい。

**・File-system Routing**
Next.jsの規則性に従ってファイルを作れば、自動でURLを生成してくれる。

**・API Routes**
APIの構築を容易にする。

**・Built-in css support**
最初からcssModulesを使える。

**・code-splitting andBundling**
Next.jsアプリケーションを本番環境で動かすときに、最適化してくれる。

## 初期のファイルの中身
**・.next**
Next.jsを動かすためのファイル。
その他のファイルを.nextにコンパイルして、動かしている。

要は裏側でwebpackが動いているけれども、Zero Configによって設定なしでコンパイルしてくれている。

**・package.json**
```json
"scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint"
  }
```
buildを実行すると.nextの中に本番環境用のビルドされたファイルが生成される。さらに、
startを実行するとwebに反映されるが、devを使用するよりもファイルが圧縮されたりしている。
（vercel側はstartを使用している）

もちろんdevにも利点があり、開発時に最適化されているため、コードを変更したら自動で反映されたりする。

**・pages**
ファイルシステムルーティングの軸となる場所。

**・public**
静的なファイルを設置しておく場所。
アイコンや画像。

## おまけ
上記と被るところがあると思うが、具体的な事例を紹介。

Reactではページが読み込まれるときに、一度真っ白な画面になってからページが読み込まれる。
それに比べてNext.jsは最初からページが表示される。
↓
理由は処理が重いJSを後回しにして、先にHTMLを読み込んでいるから。（SSG,SSR）
Unity3DでVuforiaを使いARの世界の門を叩いてみる

# はじめに
[社内活動](https://qiita.com/organizations/creative)の忘備録として本記事を残します。

# 猫カフェでのエピソード
- 社内活動にて猫カフェを訪問した際、壁に貼られた猫たちのプロフィールを見るも見分けがつかない
- プロフィールにはそれぞれの好きな遊び方やおやつが書いてあり仲良くなる為のヒントとして外せない
- 結局その日は店員さんにすべて聞くことに、、
- 店員さんが猫を見てスラスラ名前が出てくるということは、何かしらの見た目の特徴があり猫版顔(姿?)認識ができるのではないか??
- その認識結果と猫たちのプロフィールを紐付けてスマホに表示できれば自分のような初心者もより猫カフェを楽しめそうだ
- どうせなら、スマホをかざすとカメラに映る猫に重なる形で情報が見れればクールじゃないか！

### 理想の完成形イメージ
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603007/c323e449-b607-7031-1626-ac15433956df.png)

## 現実
##### スキル不足
[以前](https://qiita.com/kawataa/items/9356d8a4af971196836e) ノーコードでアプリを作る検証をしたことがあるものの、ARアプリはおろか一般的なアプリを作った経験もない。

https://qiita.com/kawataa/items/9356d8a4af971196836e

##### 順番にステップバイステップに
- 千里の道も一歩から、理想の完成形イメージに近づけるには、ちょっとずつ頑張らなきゃいけない
- そこで、以下の5つのパーツに分解して挑戦していくこととした

STEP① スマホをかざしたら特定のマーカーを元にAR空間にオブジェクトを描画するパート
STEP② あまた闊歩している猫の顔や姿を個人(猫??)ごとに識別するパート
STEP③ 猫ごとの情報をまとめたデータベースを作り運用する仕組みを考えるパート
STEP④ 上記①②のコンポーネントを一つのパッケージとしフロントエンドを作り端末で動くように頑張るパート
STEP⑤ ①～④で考慮出来ていない抜け漏れを塞ぐパート

### STEP① スマホをかざしたら特定のマーカーを元にAR空間にオブジェクトを描画するパート
#### 環境構築
同じ猫部で同じテーマの記事を書いている@itortieさんを参考にされたし。

https://qiita.com/itortie/items/b22b830483702e170e1d

#### 結果
- ARマーカーの配置とオブジェクト作成
![0808.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603007/4515b385-d817-b489-9eb7-9ab0b0c3049f.png)

- ARマーカーを動かしWebカメラ映像にオブジェクトを合成
![1109.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603007/59047411-49ce-8539-9c32-9064f83536d3.png)


## 今後
タイミングを見つけてSTEP②以降にも挑戦していきたい。
【EventBridge】インスタンスの自動起動スケジュール

## 概要
EventBridgeでEC2 Instanceの自動起動スケジュールを作成する予定が、作成できずハマったことを備忘録として記す

## 発生したエラー
```
The execution role you provide must allow AWS EventBridge Scheduler to assume the role.
```

## 解決策
結局、ルールの定義を修正すれば解決する
コンソール上で、[ロール]-[信頼関係]の順でクリック
編集ボタンにて編集する
```
## 変更前
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}


## 変更後
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

```

`Service`として定義しているルールを更新することでEventBridgeのスケジュールは正常に作成され、問題なく動作しました。
何はともあれ解決してよかった

## 参考文献
https://tech.nri-net.com/entry/easy_implementation_with_eventbridge_scheduler