OmniAICreator/Qiita-1.07M huggingface dataset:
tips

現場業務にてシステムのテストを実施する際に大量のキャプチャを撮ってエクセルに貼り付けいていたので、、、業務効率化に役立つかと現場に導入してみましたが。。


#### フォルダ内に存在するファイル（jpgなど）を一斉にエクセルに貼り付ける事が可能なマクロ
```vb
Sub 画像貼り付け()
Dim lngTop As Long
Dim objFile As Object
Dim objFldr As FileSystemObject

    Set objFldr = CreateObject("Scripting.FileSystemObject")

    'フォルダパスを入力
    flderPath = Application.InputBox("画像貼り付け", "画像フォルダを入力", Type:=2)
    'キャンセルを押すとマクロ終了
    If flderPath = "False" Then Exit Sub

    '貼り付け開始位置
    setTop = 20
    '画像の高さ
    setHeight = 450
    '画像の幅
    setWidth = 640
    '画像の間隔
    span = setTop + setHeight
    
    
    '画像貼り付け処理
    For Each objFile In objFldr.GetFolder(flderPath).Files
        ActiveSheet.Shapes.AddPicture _
                Filename:=objFile, _
                LinkToFile:=False, _
                SaveWithDocument:=True, _
                Left:=20, _
                Top:=setTop, _
                Width:=setWidth, _
                Height:=setHeight
        
        '次の画像の貼り付け位置を設定
        setTop = setTop + span
    
    Next

End Sub


```

基本的な流れと書き方はJavaなどと一緒ですね〜

➀変数定義
➁変数に値を代入
➂for文などの繰り返し処理

大量のキャプチャを一回一回貼り付けていたのは何て無駄だったのだろうと後悔。
WinShotとこれを組み合わせてかなりの効率化に成功しました。

という今回はtipsになりますが是非参考にしてみてください。エンジニアはコードを書くことだけが仕事ではないということが最近身に染みてきました。また！
@VisibleForTesting


## @VisibleForTestingアノテーション

**Javaのコードでテスト目的で使用される非公開メンバー（フィールドやメソッド）を指定するためのアノテーション**

非公開メンバーはテストコード内からはアクセスできないようにする
→外部からの誤使用を防げる

:::note
テストコード内からはアクセスする必要がある場合がある
→@VisibleForTestingアノテーションを使用して非公開メンバーをテストコードに対して可視化できる
:::

## @VisibleForTestingアノテーション使用例

```java
public class MyClass {
    private String myPrivateField;

    @VisibleForTesting
    void myPrivateMethod() {
        // テストコードからアクセス可能なメソッドの実装
    }
    
    // 公開されたメソッドや他の非公開メソッドなど
    
}
```


- myPrivateFieldフィールドとmyPrivateMethodメソッドが非公開メンバー

**myPrivateMethodメソッドに@VisibleForTestingアノテーションが付けられているため、テストコード内からアクセスできる
→テストコード内でmyPrivateMethodメソッドを呼び出してテストできる**
A/Bテスト実践ガイド（通称カバ本）の凄さをみなさんに知ってほしいの巻

# 何がすごいの？
[「A/Bテスト実践ガイド　~真のデータドリブンへ至る信用できる実験とは~」](https://www.kadokawa.co.jp/product/302101000901/)（アスキードワンゴ 2021）は　その名の通りA/Bテストの実践ガイドである。こちらを活用して、[メルカリ等のSaaSのビッグネームカンパニー](https://speakerdeck.com/shyaginuma/btesutobiao-zhun-hua-hefalsequ-rizu-mi)でも実践されている内容である。それに加えて、私の中で「お、すごいぞ！」と思ったことを列挙したい。
①基本的な統計学の考えも忘れてない
・３章のトワイマンの法則の部分は統計分析に触れたことがある人なら知ってる内容
・17章では統計検定の話、22章ではリークの話
②webアプリの知識もつく
・実際のメトリクス計測の話は、普段業務で扱ってない私には新鮮に感じました！
③実際の海外での事例も超豊富
・研究論文の引用やアプリケーション（LinkedInやyahooなど）の用例が多数

# 勉強会で発表してSpeaker Deckでまとめてみた
外部の勉強会で発表した資料があるのでそちらを参考にしてほしい。第Ⅰ〜Ⅲ部の内容を簡素にまとめてあるので、ざっと目を通して頂き、是非とも本書の購入に繋がってくれると私は嬉しく思う。笑
![スクリーンショット 2023-07-04 0.15.42（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/389316dd-d09e-3927-f7c4-011dcbbcd8e3.png)
↓Speaker Deckは下記URLからアクセス
https://speakerdeck.com/wakamatsu_takumu/btesutoshi-jian-gaido-zhen-nodetadoribunhezhi-ruxin-yong-dekirushi-yan-toha

# 最後に
学生時代の受験勉強並みに読み込んだ１冊。それくらい本書はワクワクする内容だし、普段の業務でなかなか触れることのないSaaS関係のプロダクトで　ABテストしてみたくなる、そんな本である。
看護師から未経験エンジニアへ

はじめまして、初投稿させていただきます。
今まで約8～9年近く看護師を務めていました。
私が転職を考えたのは今年に入り凄くパソコンの勉強をしたいという気持ちが強くなったから...

元々あまり人と関わる仕事が好きではなかったこともあります。
ただ、勉強は好きなのでとことん納得いくまで自分のペースでやりたいと常々考えておりました。

現場に入ってまだ1カ月ちょっと。
リモートなので相手(先輩)のお顔が見れないので、分からないところがあっても聞きにくいんだなと実感。
最近は弱気になることも多々あり遠慮してしまいがちですが、それでは作業が進まない為とりあえずスレッドに投げるようにしています。

気持ちでよく言い聞かせるのは『聞くのはタダ』『忙しければ空いた時に連絡が返ってくる』と思うようにしています。

聞かないまま進めてメチャクチャにしてしまう方が怖いから...
とりあえず、作業に対して小さな事でもどうでもいい事でも聞くようにしています。
看護師やってたからってメンタルがかなり強いわけではありません。
むしろ声のトーンなどかなり気にするタイプ。

何でも最初は1人じゃ出来ないし、現場そこそこのやり方があるのでやり方は教えてもらって自分で調べられそうな部分は調べる！という風にしています。

今は自分自身の勉強が追い付いていないこと、勉強のやり方が効率悪いのかな？と悩む機会も多いです。

無料の開発もしてみたいと考えています。
おすすめ検索をしてもたくさんの情報があるので、どれを選べばいいか悩んでいます。
現場で使っている環境をと考えていますがまだまだ知識が足りない。

プログラミング言語はJavaScriptが読める程度。
コードを記述するのもまだまだ初歩的な部分のみしか書けない。
少し捻るともう駄目ですね、頭がこんがらがって。

おすすめの開発環境(無料のものでいいです)、プログラミング言語の練習のアプリや方法があれば教えていただきたいです。

ゆくゆくはフロントの仕事が出来るようになる！と目標を持っています。
現場は進むのが早いですね...(´；ω；`)

大した内容の記事ではないですが、後々自分自身の成長もみたいので日記的な感じで書きました。では失礼いたします。
python PySimpleGUIで全角半角 相互変換ツールをお手軽作成

### はじめに

とあるシステムが全角文字しか入力を受け付けないため、文字列を全角/半角に変換するツールをサクッと作りました。

![スクリーンショット 2023-07-03 235155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577794/86465e66-2493-5e11-a799-4176bfc83ee6.png)

「変換対象のテキスト」に文字列を入力し、「変換」ボタンを押すと、「全角への変換結果」「半角への変換結果」にそれぞれ変換結果が表示されます。変換結果はもちろんコピーできます。ついでに文字列の「削除」ボタンを付けたり、文字列のカウント機能も付けてます。


また、Web上で処理することに抵抗ない方はこちら

https://so-zou.jp/web-app/text/fullwidth-halfwidth/

### 環境

OS: windows11
python 3.7以上

### 仮想環境とインストール
いつものように仮想環境を用意します。
```
python -m venv venv
.\venv\Scripts\activate
python -m pip install --upgrade pip
```
コードを実行するには事前にモジュールのインストールが必要です。
```
pip install PySimpleGUI
pip install mojimoji
```

コードは以下になります。

```python:sample.py
import PySimpleGUI as sg
import mojimoji

def main():
    width = 100
    height = 10

    # ウィンドウのレイアウトを定義
    layout = [[sg.Text("変換対象のテキスト")],
            [sg.Multiline(key='-IN-', enable_events=True, default_text="", size=(width,height))],
            [sg.Button('変換', key='Submit', button_color=('#000', '#999')),
             sg.Button('消去', key='Clear', button_color=('#dc3545', '#fff'))],
            [sg.Text("全角への変換結果")],
            [sg.Multiline(size=(width,height), key='-OUTPUT_ZEN-', disabled=True)],
            [sg.Text("半角への変換結果")],
            [sg.Multiline(size=(width,height), key='-OUTPUT_HAN-', disabled=True)],
            [sg.Text("文字数カウント: 0", size=(40,1), key='-COUNT-')]]

    # ウィンドウを作成
    window = sg.Window('全角半角 変換', layout)

    # イベントループ
    while True:
        event, values = window.read()

        # ウィンドウを閉じる場合ループを抜ける
        if event == sg.WINDOW_CLOSED:
            break
        
        # ユーザーがテキストボックスに何かを入力するたびに、その文字数を'-COUNT-'キーのテキスト要素に表示
        if event == '-IN-':
            window['-COUNT-'].update(f"文字数カウント: {len(values['-IN-'])}")

        # 'Submit'ボタンをクリックすると、入力文字列を全角/半角に変換
        # '-OUTPUT_ZEN-', '-OUTPUT_HAN-'キーのテキスト要素に表示
        if event == 'Submit':
            window['-OUTPUT_ZEN-'].update(mojimoji.han_to_zen(values['-IN-']))
            window['-OUTPUT_HAN-'].update(mojimoji.zen_to_han(values['-IN-']))
        
        # 'Clear'ボタンをクリックすると、入力フィールドと出力フィールドを空にする
        if event == 'Clear':
            window['-IN-'].update('')
            window['-OUTPUT_ZEN-'].update('')
            window['-OUTPUT_HAN-'].update('')
            window['-COUNT-'].update('')

    window.close()

if __name__ == "__main__":
    main()
```

### おわりに
Tkinterなどの別モジュールに比べてPySimpleGUIはコード量が少なく、何が起きているか把握しやすく、余計な事に気を回すことが少ないので使いやすいですね。

ちょっとしたアプリを作ってexe化して配布などすると、業務効率化につながりそうです。
【Mac】コマンドでファイルの文字コードを調べる方法


## ファイルの文字コードを確認するコマンド

次のいずれかのコマンドで文字コードを確認できます。

### `file -I`
```terminal
file -I /path/to/file
```

```terminal
$ file -I sample.txt
sample.txt: text/plain; charset=utf-8
```

### `file --mime`
```terminal
file --mime /path/to/file
```

```terminal
$ file --mime sample.txt
sample.txt: text/plain; charset=utf-8
```

### `file --mime-encoding`

```terminal
file --mime-encoding /path/to/file
```

```terminal
$ file --mime-encoding sample.txt
sample.txt: utf-8
```
エンジニアキャリアの探求：私の転職と学び

どうもこんにちはたくびー(@takubii)です。
今回はQiitaのこちらのお題「[エンジニアキャリアについてあなたの考えをシェアしよう！](https://qiita.com/official-events/0d4c7ac216324bd6a3b9)」について書きたいと思います。

https://qiita.com/official-events/0d4c7ac216324bd6a3b9


## 簡単な略歴
まず初めに自己紹介を少々。
私は高校卒業後、専門学校に入学しプログラミングについて学びました。
在学中にインターンとして参加していたゲーム開発会社に卒業後すぐに就職しましたが、あまりにもブラックだったため、1ヶ月で辞めることになりました。

その後3年間ニート生活を送り、1年間フリーターとして過ごします。
そしてハローワークでたまたま見つけたIT会社の求人に応募し、そのままトントン拍子で入社しました。

## 復帰後のキャリアについて
復帰後に入社した会社はSESという形態の会社で、客先常駐型の働き方でした。
最初は典型的なSESスタイルでテスト業務からスタートしました。当時は特に疑問に感じていませんでしたが、後から考えるとエクセルにスクショを貼る仕事をしていたんだなと気づきました。

1年くらいテスト担当が続き流石にコードを書きたいと思い、当時の上司に直接「もっとコードを書ける仕事がしたいです。」と伝えました。
すると、すぐにコードを書ける仕事を割り当ててもらい、テスト担当からプログラマーへとなりました。

プログラマーとしては主に古くなったバックエンドフレームワークのアップデートに伴う、バックエンドの作り直しです。

この作業のおかげでプログラマーとしての力は結構ついたなと思います。
この作業後はフロントエンドの保守などを行っていました。

## 初の転職活動で現職へ
コロナ禍をきっかけにフルリモートになったおかげで、プライベートの時間が増えました。
その間に仕事に慣れ、元々少なめの業務量もあったのをきっかけに、エンジニアとしてこのまま成長していけるのかと考えるようになりました。
また、バックエンドがメインのフルスタック寄りの業務よりもフロントエンド寄りに舵をきりたいとも考えていました。

そういった背景から、緩めに転職活動を始めることにしました。
エージェントを利用したこともありましたが、「1ヶ月で転職しましょう！」みたいなスケジュール感が合わず、PaizaやWantedlyなどのスカウト系のサービスを利用しました。
その後、Paiza経由で現職を紹介され現在に至ります。

## スカウトサービスのメリット
私は転職活動でスカウトサービスを使いましたが、これがかなり性に合っていました。
以下いくつかメリットを挙げていきたいと思います。
- 自分のペースで進められる。今はスカウトいらないなと思った時には一時的にスカウト停止をすることで仕事との両立がうまくいきました。
- 基本的にカジュアル面談を実施している。スカウトされた企業については基本的に何も知らない企業が多いです。そこはカジュアル面談でどういった企業なのか説明してくれる企業が多かったです。
- 自己肯定感を高められる。自分から探して履歴書を出してお祈りされるという経験をしたことは誰しもあると思います。スカウトでは相手企業に求められているという感覚になり自分で探すより自信が持てます。
- 志望動機を深く考えなくても良い。極端に言うと、志望動機は「スカウト受けて、話を聞いてみて良さそうだから」でOKなのも良かったです。志望動機を考えるのは苦手なのでかなりメリットになりました。

といくつか挙げてみましたが、転職活動の日程に余裕のある方や、上記のメリットが魅力的だと思った方はスカウトサービスに登録してみてはどうでしょうか？

## 今後のキャリアについて
現職に転職してフロントエンド領域の担当が増えたので、この能力を伸ばしていきたいです。
ある程度実績、実力が身に付いたら、再び転職することも考えています。ただ、高還元SESなのか、自社開発企業なのか、受託開発企業なのかといった具体的な目標は定まっていないです。
良いお話があればTwitterアカウント([たくびー](https://twitter.com/takubii0))に気軽にご連絡ください。

## まとめ
自分の今までのキャリアを考えるとどんな技術が使えるのかというところに重きを置いているなと感じます。
エンジニアとしての成長や幅を広げるという方向で転職を行うのが私のキャリアアップについての軸になっています。

未経験の方やブランクのある方はSESにとりあえず入社するという方向性は悪くないと思います。
SESという働き方には色々な意見があると思いますが、運が良ければ開発へ参加させてくれますし、比較的にリモートの案件も多いです。
その後、実績が伴ってきたら自分にあった業界へ転職するというのが無難な方法ではないでしょうか。

私の経験が読んでいるあなたの参考になれば幸いです。
今回はここまでにしたいと思います。
また機会があればお会いしましょう。
chatgptにテーブル設計の問題を作ってもらってみた。

### railsテーブル設計基礎復習

やはりまだまだ基礎が他の人と足りていないので理解の演習問題で理解をもう少し深めよう。

### 方法

とっても簡単。

`chatgptに演習問題を作成してもらう。`

皆さんも聞いてみてね。

では出題された問題の紹介と、出された答えを載せていきます。

### マイグレーションファイルとは何ですか？Ruby on Railsにおいて、どのように使用されますか？

```
マイグレーションファイルは、Ruby on Railsのデータベースマイグレーション機能を使用して、
データベースのスキーマを変更するための手段です。
スキーマ変更とは、テーブルの作成、カラムの追加や削除、インデックスの作成など、データベース構造に関連する変更を指します

マイグレーションファイルは通常、バージョン管理システム（例えばGit）で管理され、
開発チームと共有されます。
開発者は各マイグレーションファイルを順番に実行し、
データベースを必要な状態に保つことができます。
また、マイグレーションファイルの実行は簡単にロールバック（変更の取り消し）もできるため、
データベースの変更を管理する際に便利です。
```

とのこと。

自分なりに噛み砕いてみる。

```
データベースのスキーマを変更するためのファイル。
マイグレーションファイルを使用することで、簡単にデータベースを修正することができ、
バージョン管理により、変更を追跡することができる。
必ずdb:migrateをしないと反映されない。
```


### テーブルのインデックスとは何ですか？なぜテーブルにインデックスを追加する必要があるのでしょうか？

```
テーブルのインデックスとは、データベーステーブル内の特定のカラム（または複数のカラム）に対して作成されたデータ構造です。
インデックスは、データベースのパフォーマンスを向上させるために使用されます。

検索の高速化:
インデックスを作成すると、データベースエンジンはインデックスを使用してデータを効率的に検索することができます。
インデックスを持つカラムを使用した検索は、インデックスを持たないカラムに比べて高速に実行されます。
```

とのこと。

ふむふむ

```
controllerのindexとは違うんだね。
検索を高速に行うために使うんだね。
パフォーマンスも上がりそうだな。
ということはよく検索されるカラムに追加する方が良さげだな。
```

ちなみにインデックスを追加する理由は他にもあるんですが割愛しています。

### テーブル間の関連性を表現するために、Ruby on Railsではどのような方法がありますか？それぞれの方法の特徴を説明してください。


よく使うものを紹介。

### belongs_to

```
belongs_toメソッドは、モデル間の1対1または1対多の関連性を表現するために使用されます。
例えば、UserモデルがPostモデルにbelongs_to :userと関連付けられている場合、
PostモデルのインスタンスはUserモデルのインスタンスに所属していることを示します。
```
一番関連付けでも見るやつやね

### has_many

```
has_manyメソッドは、モデル間の1対多の関連性を表現するために使用されます。
例えば、Userモデルが複数のPostモデルにhas_many :postsと関連付けられている場合、
Userモデルのインスタンスは複数のPostモデルのインスタンスを持つことを示します。
```
belongs_toと一緒に使うイメージだったやつ。
複数持つ方につけよう。

### has_one

```
has_oneメソッドは、モデル間の1対1の関連性を表現するために使用されます。
例えば、Userモデルが1つのProfileモデルにhas_one :profileと関連付けられている場合、
Userモデルのインスタンスは1つのProfileモデルのインスタンスを持つことを示します。
```
やはりこれはプロフィールとユーザー情報の紐付けで使うところだね。
ユーザーは一つのプロフィールしか持ってないよね。


### has_many_through

```
has_many_throughメソッドは、中間テーブルを介して関連性を表現するために使用されます。
例えば、UserモデルがPostモデルを介してTagモデルと関連付けられている場合、
Userモデルのインスタンスから直接Tagモデルのインスタンスにアクセスできるようになります。
```

よく使う中間テーブルのやつやね。
これがあるおかげで直接別のテーブルにアクセスできる。イメージ。
新入りだから、挨拶するぜ！

# 自己紹介
福岡出身、東京在住の男。
社会人2年目のAWS DevOpsエンジニア。（某SIer）

# Qiitaを始めた理由
- 1年目のころ、Qiitaに助けてもらったから恩返しがしたい。
- AWS認定資格を取得したものの、レベルアップした気がしない。アプトプットが必要。
- なんかおもろそう。

# Qiitaで何をするか
1. AWSのサービスをばりばり触っていく。ハンズオン化。
1. 1をTerraform化。
1. 1をCDK化。

# 資格
- AWS Solution Architect Professional
- AWS DevOps Engineer Professional
- GCP Associate Cloud Engineer

# ちょっとできる
- Terraform
- CDK
- CloudFormation
- Python
- TypeScript
DAY8　chatgpt4導入

# DAY8 
230703
#### キーボード購入
今日はシフトがお休みだったので、家電量販店に行きました。
エレコムの白いキーボードを1200～1300円くらいでGET
これでちゃんとコーディングできる
![IMG_1094.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491303/4ce14c2f-7b7b-7be0-6385-1a40f6cc3709.jpeg)

#### ウェブセミナー申し込み
【Lancers】電脳実技会～初めてのChatGPTで即業務改善編～【業務に使えるプロンプトプレゼント】
https://denjitsu01.peatix.com/view
面白そうだしプロンプトもらえるので参加
ウェブセミナー初めてだから高いのか安いのかわからない
使いこなせるようになったら安いのかも

#### chatgpt4
chatgpt4に課金しました（1か月だけ）
現時点で20ドル→2975円
3時間に25回応答が上限らしいです
計画たてるの手伝ってもらったり、プログラミングと英語教えてもらおう～
回数制限あるから雑談や軽い相談は3.5の方でやって、ちゃんと考えたいこととか教えてもらいたいことは4に聞こうかな
今日めっちゃお金使ってるよ:sweat_smile:

プラグインを使ってみました
5色のカラーパレットを作ってくれるプラグイン「Color Palette」を使用しました
なかなかおもしろいです。
さわやかな夏のカラーパレット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491303/490850b6-54c0-ae41-805d-1799e0d8df24.png)
やわらかくて儚い春のパレット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491303/43ce0024-e1ff-a322-0685-3af3f496b99c.png)
いろいろ遊べるし実用できるしいいですね

#### 計画の速度について
最近焦ってしまってたのか、計画を3か月以内！とかにしてしまってたんですが、
いろいろ重なってしまって計画に忠実に進めるのは心身ともにしんどいなと思い、もうちょっとゆっくりめに進めることにしました。
ゆっくりですが確実にすすめていけたらいいな
UiPath_引数をゆる～く理解しよう

## はじめに
①本記事は、2023年7月開催の「UiPathブログ 発信チャレンジサマー」の3日目のブログです。
ブログの詳細、参加方法については、以下のブログを参照ください。
https://note.com/shumpei_w/n/nd082bdf28853

②このブログ情報は、2023/7時点の情報です。

③この記事は、筆者の経験や主観も含みますのでご了承ください。

## 引数とは
引数とはデータの受け渡しを行うものです。
わかりやすく言うと、1つのプロジェクト（＝xamlファイル）ではアクティビティ同士で受け渡しできるのですが、2つ以上のプロジェクトで受け渡す場合は変数を使うことができません。
つまり引数は変数と同じ機能を持っていますが、他のプロジェクトを行き来するときに使用します。
大規模な開発を行う場合は、引数がわかっていないと値が正しく受け渡せないばかりか、処理結果が正しく出ない、入力したはずの値が違う...といった影響が出ます。

## キャッチボールと同じでは？
引数はRPAの初心者だと怖くて使いづらい…という方、筆者も当時は同じ気持ちを持っていました。
しかし、プロ開発でご飯を食べている私はそうはいきません。
どうやったら引数ってわかるんだろうかという考えは、開発経験を経て次第に<b>"キャッチボールに近い"</b>ことなのかなと思いました。
そして、これは「<b>公式ガイド UiPathワークフロー開発実践入門 ver2021.10対応版</b>」を読んで、確信へ変わりました。

キャッチボールは誰かと必ずやりますよね。筆者はスポーツしなかった人なのであまり大きな声では言えませんが...
わかりやすくここに絵をかいてみます。
あるところにMain.xaml君とSub.xaml君がいます。彼らは兄弟です。Mainは弟思いの兄、Subは従順な弟です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/4312eda5-701b-caf9-89ae-24ccc881a97f.png)

## まずは、イメージしてみること
### IN
INは、Mainの兄貴から、Subの弟へ引数の値(ボール)を渡します。弟は兄貴の剛速球を受け止めたものの、痛そう。
### OUT
OUTは、Subの弟から、Mainの兄貴へ引数の値(ボール)を渡します。兄貴は余裕で受け止めました。
### IN/OUT
IN/OUTは、Mainの兄貴→Subの弟→Mainの兄貴→Subの弟...と力加減をそこそこにうまくキャッチボールができているようです。
つまり、上記3つを絵にしてみるとこんなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/1e09af21-aeac-6b7d-76fd-d66bfdfbbd4b.png)

## みんなの身近に当てはめて考えてみると...
もっと言うと、仕事のやり取りも同じことが言えます。
Main.xamlが上司、Sub.xamlが部下の場合もボール=課題、成果物という視点で見ると...みるみるわかってくるかも。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/c2f7cd9d-2cd7-fa11-6323-f78b50e38f4f.png)

皆さんは、イメージできたでしょうか？

## まとめ
引数は変数と共に初心者にとってよくわからない部分ですが、慣れてくると別xamlを分けた開発でも、どの引数をどう渡すかという点が理解出来るようになります。
まずはわかりそうなところからできるようになりましょう！
最後までお読みいただきありがとうございました！

## 参考文献
公式ガイド UiPathワークフロー開発実践入門 ver2021.10対応版
https://www.shuwasystem.co.jp/book/9784798065953.html

PC業務は全部おまかせ！ UiPath×Excel自動化完全ガイド
https://www.shuwasystem.co.jp/book/9784798069906.html
AWS Amplifyでアプリを作ろう

# はじめに

・AWS Amplifyを使えばアプリケーションを簡単に構築できるということでやってみました。
・画像ファイルをアップロードして、一覧表示するアプリをReactで作りました。

![upload.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/e94aee45-6ae0-4ab5-09b6-75766dc09407.gif)

# Amplifyの何がいいの？

認証機能を実装したり、データベースとの連携をするためのあれこれをやっているだけで
１日が終わったりしますよね...。
一般的に必要とされる機能の追加からデプロイまで1時間ぐらいでできちゃいます。
つまり、アプリケーション開発に集中できます！

①認証機能
②API、GraphQL
③データベース
④ストレージ
⑤Webホスティング

# どうやって始めるの？（チュートリアルの進め方）

初心者向けにAWSアカウントの作成からReactアプリのデプロイまで解説されていて、とてもわかりやすいです。
作成したアプリはTodoリストアプリを修正して作ってます。

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


https://dev.classmethod.jp/articles/i-tried-a-tutorial-on-aws-amplify-react/

# まとめ

・AWS Amplifyを使えばアプリケーションを簡単に構築できる。
・さらに詳しく知りたい方はAWS公式を見てください。
→GitHubと連携して、リポジトリにPushしたらデプロイまで自動化することも可能です。

# 参考

https://aws.amazon.com/jp/amplify/hosting/#:~:text=AWS%20Amplify%20%E3%83%9B%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AF%E3%80%81%E3%83%95%E3%83%AB,%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E6%8F%90%E4%BE%9B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

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

https://aws-amplify-jp.github.io/resources/


https://ics.media/entry/200406/
【C#】テキストファイルの行数カウントにReadAllLines(path).Lengthを使わない

# File.ReadAllLinesとは
テキストファイルのすべての行を読み取り、`string[]`に格納する関数。
`File.ReadAllLines(path).Length`は、配列のLengthを取得する動きになる。

https://learn.microsoft.com/ja-jp/dotnet/api/system.io.file.readalllines?view=net-7.0

# なぜ非推奨なのか
小さなファイルなら問題は起こらないが、巨大なファイルを読み込む際、メモリを大量に必要とする。
そのため、スペックの低い環境では`OutOfMemoryExcepiton`が起こる。

中途半端にスペックの高い環境では、大量のメモリを消費しつつ、長時間に渡って読み込み処理を続けるため、PCに多大な負荷がかかる。
時間効率も悪いし、他のことが一切できない状態になってしまう。

# テキストファイルの行数をカウントするには
素直に`StreamReader`で`ReadLine()`する。
```c#:C#
string filePath = "任意のファイルパス";
int rowCount = 0;

using (StreamReader sr = new StreamReader(filePath))
{
    while(!sr.EndOfStream)
    {
        sr.ReadLine();
        rowCount++;
    }
}

Console.WriteLine($"ファイルの行数: {rowCount}");
```
JavaScriptのthisについて

"this"は実行コンテキストであるオブジェクトへの参照である。

# 実行コンテキストとは
まず、 **コンテキスト**とは何かですが、「前後関係、文脈」といった意味になります。
そのためプログラミングでは**コードを実行する際の状況**という意味合いになり、
実行コンテキストとはコードを実行しているコンテキストという意味です。

# **this**について
実行中のコンテキストでは以下が使用可能である。
・グローバルオブジェクト
・this

Node.jsでは**global**と呼ばれるオブジェクトがグローバルオブジェクトになり、
ブラウザであれば**Window**がグローバルオブジェクトになる。
thisはデフォルトでグローバルオブジェクトを参照している。

そのため、thisは実行環境によって中身が変わっている。

## globalThisについて
上記までで長々と記載してきましたが、実行環境によってthisの中身が変わるためトップレベルでのthisの参照は推奨されておらず、
コードがどの環境で実行されているのかを知らなくても、一貫した方法でグローバルオブジェクトにアクセスすることができる**globalThis**が推奨されているようです。

globalThis はグローバルプロパティで、グローバルオブジェクトと同等であるグローバルな this が格納されています。

参照
[globalThis　- javaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/globalThis#%E4%BB%95%E6%A7%98 "globalThis")
ArduinoでPWMインバータ制御でHブリッジドライバから正弦波出力をする

# 概要
ArduinoでPWMインバータ制御でHブリッジドライバから正弦波出力をする。
3kHzぐらいまで。

# やり方
PWMのDuty比を正弦波に合わせて変更する。

Fast PWM mode
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/d8cd9757-d2b9-0145-7370-3754c5a23d36.png)

TCNT：Timerカウンターの最大値をICRレジスタとしたモード14を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/5e888c70-a852-d397-26a8-7a34bdb8b66f.png)

OCR1A＝TCNTになったときに自動的に、PB1(pin9),PB2(pin10)がClear(0)するように設定。
TOP(ICR)=TCNTになったとき自動的に、PB1(pin9),PB2(pin10)がSet(1)するように設定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/b761cb10-efcf-3440-0267-2a856f222c0f.png)

OCR1A割り込みが発生したときに

* Duty比を読み出し、OCR1A値を変更

# サンプルプログラム

```C

/*
   PWMで正弦波を出す

*/

#define space_clock 10
volatile boolean sp_flag = false;
volatile int sin_pos = 0;
volatile int sin_length[100];
volatile int max_sin;


void setup() {
  pinMode(11, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(A0, INPUT);

  digitalWrite(11, HIGH);
  //digitalWrite(9,HIGH);
  //digitalWrite(10,LOW);

  //Timer1 max(ICR1) 正弦波 100分割 1/8分周
  TCCR1A = 0;
  TCCR1B = 0;
  TCCR1A |= (1 << WGM11) | (0 << WGM10) | (1 << COM1A1) | (1 << COM1B1);
  TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS10);
  ICR1 = 1030;     //TOP:ICR1  周波数はこちら
  max_sin = 1030 - space_clock;

  //COMPA 割り込み
  TIMSK1 |= (1 << OCIE1A)  ;

}
ISR(TIMER1_COMPA_vect) {
  //コンペアマッチでclearされるように設定している
  //正弦波になるように調整
  OCR1A = sin_length[sin_pos];
  OCR1B = sin_length[sin_pos];
  sin_pos++;
  if (sin_pos >= 100) {
    sin_pos = 0;
    sp_flag = !sp_flag;
    if (sp_flag) {
      TCCR1A &= ~_BV(COM1A1);
      TCCR1A |= _BV(COM1B1);
    } else {
      TCCR1A &= ~_BV(COM1B1);
      TCCR1A |= _BV(COM1A1);
    }
  }
  if (sp_flag) {
    TCCR1C |= (1 << FOC1A);
  } else {
    TCCR1C |= (1 << FOC1B);
  }
}


void loop() {
  delay(100);
  int data = analogRead(A0);

  //double fz = 510 + (data/1024.0 -0.5)*500;
  double fz = data / 1024.0 * 1000;
  int onoff_time = 500000 / fz;         //1000000us/fz / 2

  ICR1 = onoff_time * 0.16;            //1clock = 1/16[us]　ICR割り込み100回で半周期
  max_sin = ICR1 - space_clock;

  for (int i = 0; i < 100; i++) {
    sin_length[i] = sin(i / 100.0 * 3.141592) * max_sin;
  }

}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/dc4341a0-d21e-b999-9675-7eef342bf818.png)


# 障害対応：ICR増加させた時に割り込みが発生しなくなる

## 原因
    ICR1<OCR1A,ICR1<OCR1Bに一時的に設定されること

## 対策
1. OCR1A,OCR1BをICR1より先に更新する
1. OCR1A<ICR1,OCR1B <ICR1にする。
テーブル行数の任意変更

scaffoldで作成されたCustomersのTableの行数を任意に変更できるようにしましたので、紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/333bc770-3cfa-53c4-8399-c8a7b24386b1.png)

Customers(Screen)のMaxRecordsが表示行数です。
ここでDefault Valueを5にしたら、5行に変わりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/fae83b1f-13a3-d7a9-d9d5-2bc6f10fc3ad.png)

本当はNavigation/Paginationの中に行数選択のDropdownをしたかったですし、本家
https://success.outsystems.com/documentation/how_to_guides/front_end/how_to_customize_number_of_records_per_page/
にはそのやり方があったのですが、私の理解が及ばず諦めました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/707e6c14-dc50-1e28-b3b0-0db2a46eedf1.png)

Inputを配置し、VariableをMaxRecords、On ChangeでNew Client Actionを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/b0c89b43-2483-1cc2-e236-d42b62c4209f.png)

Refresh Dataを配置し、GetCustomersを選択、Selectボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/fabf3ab7-17b0-c20e-c566-96c555523f7c.png)

入力すると即座に表示が変わるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/249e4d01-210b-b019-aad0-00e1fe025597.png)

カーソルがキープする（コントロールされている）のは良いですが、急に増やすと戻れなくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/7abe4ec0-9803-4d6f-ea6f-139a2c8df510.png)

最後に私がやった勘違いミスを紹介しておきます。

On ChangeのClient ActionにおいてCustomers再表示の意味で、
Endの部分をCustomersにして、できないというのをしばらくやってました。

Refresh Dataのこの方法もある日ふとやってみたらできたのですが、
outsystemsを独学でやってると
アミバ「ん!?、まちがったかな…」
の連続です。

習うより慣れろ状態ですが、間違った方法をやってないかが心配です。
AWSのセキュリティ　AWSの責任共有モデル

AWSとユーザが責任を負う部分を分けて、それぞれが責任を共有して守っていくことを、AWS責任共有モデルという。

# AWSのセキュリティ

AWSはクラウド本体のセキュリティ部分を担当する。


# ユーザのセキュリティ

ユーザはクラウド内のセキュリティを担当する。
AWSが用意するセキュリティサービスを適切に活用して、ユーザはクラウド内のセキュリティを管理できる。
Rails 閲覧数 カウント

#  はじめに
- 投稿詳細ページの閲覧数をカウントし、投稿一覧と投稿詳細に表示させる
- 学習内容の備忘録です

# 前提条件
- ユーザーと投稿に関する機能が実装できている
- ここでは、UsersテーブルとBooksテーブルがある状態
- Bootstrap4を入れている状態

# 手順
1. モデル作成
1. アソシエーション
1. コントローラ
1. ビュー

# 1.モデル作成
今回作成するモデルはLookモデルとします。
```:ターミナル
rails g model Look user_id:integer book_id:integer
```
migrationファイルを確認し、問題なければ、
```:ターミナル
rails db:migrate
```

# 2.アソシエーション
```:look.rb
belongs_to :user
belongs_to :book
validates_uniqueness_of :book_id, scope: :user_id
```
>補足
「validates_uniqueness_of :book_id, scope: :user_id」によって、同じ本（book_id）に対して同じ人（user_id）の閲覧カウントが重複しないようにしている。

```:book.rb
has_many :looks, dependent: :destroy
```

```:user.rb
has_many :looks, dependent: :destroy
```

1人のユーザーは複数の閲覧データを持ち、1冊の本も複数の閲覧データを持つ。
>user:book=N:N
user:look=1:N
book:look=1:N

のアソシエーションが完成！

# 3.コントローラー
ここでは、booksコントローラーに閲覧数をカウントさせる記述を書く。
（bookの閲覧数なので、looksコントローラーは作成しない）

```:books_contoroller.rb
def show

    #省略

    # ゲストユーザーログインを実装しているため、ゲストユーザーでない時に限定
    if current_user.name != "guestuser"

      # Lookの中にbook_idとユーザーのidが一致するものがないか探し、unlessによって、falseの場合のみ実行する
      unless Look.find_by(user_id: current_user.id, book_id: @book.id)

        # このユーザーのlooksを新たに作成し、book_idに取得してきた本のidを入力
        current_user.looks.create(book_id: @book.id)

      end
    end
  end
```
>補足
今回は1人1カウントにしたが、1日1カウントにしたい場合は、
「where(created_at: Time.zone.now.all_day)」で、可能になる。

### 参考にさせていただきました
[[Rails]ページの閲覧数をカウントする方法](https://qiita.com/Auk10/items/6c789a569bfe71214745)

# 4.ビュー
今回は、閲覧数をカウントし表示する記述は、部分テンプレートにまとめた。

```:_look.html.erb
# user_has_look?メソッドはbookモデルに定義する
<% if current_user && book.user_has_look?(current_user) %>
  <div class="text-danger"> # 閲覧した場合は、赤色に
    閲覧数:<%= book.looks.count %>
  </div>
<% else %>
  <div class="text-dark"> # 閲覧していない場合は、黒色に
    閲覧数<%= book.looks.count %>
  </div>
<% end %>
```

user_has_look?メソッドの定義をしておく
```:book.rb
# userを引数にし、user_idにこのユーザーのidが存在するかを確認する
def user_has_look?(user)
  looks.where(user_id: user.id).exists?
end
```

あとは、この部分テンプレートを呼び出したいところへ！
（ここでは、本の一覧表示についても部分テンプレートに記述している。）
```:_index.html.erb
# 省略
<% books.each do |book| %>
# 省略

# 閲覧数を表示したい部分に記述
<%= render partial: "books/look", locals: { book: book } %>
```

詳細ページにも！
```:show.html.erb
# 閲覧数を表示したい部分に記述
<%= render partial: "books/look", locals: { book: @book } %>
```

# まとめ
- 閲覧カウントは、ユーザーと投稿に中間テーブルを設ける
- 投稿に関するコントローラーでidを作成する

⚠️学習4ヶ月目の初学者による投稿です。
⚠️間違いがあるかもしれません。ご容赦ください。
⚠️ご指導、ご教授いただけると幸いです。
homebrewで、homebrewが壊れてるっぽいエラーが発生したらまずやるべきこと

# 結論

まずは、homebrewのトラブルシューティング機能で自己診断する。
（この記事を見ている段階で、困ってweb検索しているかもしれないが・・・）

具体的なコマンドは下記の通り。

~~~zsh:comand
user@host ~ % brew doctor
~~~


## 実際に経験したトラブル（エラー事例）

brew update を実行したら、いつもと違うメッセージが・・・
~~~
fatal: revision walk setup failed.
error: https://github.com/Homebrew/homebrew-cask did not send all necessary objects
~~~

## いざ、トラブルシューティング！！（事例）

brew doctor コマンドを発行すると、今回は原因と修復の手順が示された。
（ちなみ、その手順を実行することで、すぐに修復できた）
~~~~
user@host ~ % brew doctor

Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: The following directories do not exist:
/usr/local/sbin

You should create these directories and change their ownership to your user.
  sudo mkdir -p /usr/local/sbin
  sudo chown -R $(whoami) /usr/local/sbin

Warning: You have an unnecessary local Cask tap.
This can cause problems installing up-to-date casks.
Please remove it by running:
  brew untap homebrew/cask

Warning: You have an unnecessary local Core tap!
This can cause problems installing up-to-date formulae.
Please remove it by running:
 brew untap homebrew/core
~~~~

## あとがき
+ 多くの場合、トラブルが発生するとすぐにgoogle検索などで調べるという行為に走りがちであるが、もともとトラブルシューティング機能がプログラムについているなら、まずはそれを試すのが妥当だろう。
+ 検索で引っかかってくる玉石混交の情報を精査するにも時間がかかる。また、homebrewのトラブルシューティング機能の方が安全性（信頼性）も高いと思われる。
+ 無論これはhomebrew自体は動作することが前提であるし、homebrewのトラブルシューティング機能では解決できない事もあるだろう。
+ 実のところ、上記のことは自戒を込めて書いている。初手でgoogle検索したものの、出てくる解決方法がいまいち違う気がしていた。その時、自己診断機能みたいのながあったような気がと・・・ふと思い出し、homebrewのヘルプを参照し、そこから今回の問題の解決に至った。というのがことの顛末だったりする。
四角いメモリを丸く使う

コンピュータは、データを処理する機械であり、その処理手順やデータ構造を示したものがプログラム。
処理の対象となるデータはメモリやディスクに格納されている。
プログラマは、メモリやディスクを自由自在に使いこなせなければならない。
そのために必要なことは、メモリやディスクの構造を物理的（ハードウェア）にも論理的（ソフトウェア）にもイメージできるようになること。
## メモリの物理的な仕組みはシンプル
メモリの実態は「メモリIC」と呼ばれる装置。
メモリICには、RAMやROMなど、様々な種類があルガ、外部から見た基本的な仕組みはどれも同じ。
メモリICには、電源、アドレス信号、データ信号、制御信号を入出力するための多くのピンがあり、アドレスを指定して、データを読み書きするようになっている。
シンプルに考えると、メモリICの内部に8ビットのデータを収納できる入れ物がたくさんあり、その場所をアドレスで指定してデータの読み書きを行うだけ。
## メモリの物理的なイメージはビルディング
ビルディングには、1フロアに1バイトのデータを格納でき、フロアの番号がアドレスを示すものとなる。
メモリの実体はメモリICだけど、プログラマから見れば個々のフロアにデータが格納されたビルディングだと思えば良い。メモリICの電源や制御信号のことまで意識する必要などない。1KBのメモリなら1024階建てのビルディングとして表せる。
ただしプログラマーから見たメモリーには、物理的なメモリーに存在しない概念がある。
それが「データ型」。プログラミング言語におけるデータ型とは、どのような種類のデータを格納するかを示すものであり、メモリにとってみれば占有するサイズ（ビルのフロア数）を意味するものとなる。
物理的には1バイトずつデータを読み書きするメモリであっても、プログラムでは型を指定して、特定のバイト数ずつまとめて読み書きできるようになっている。
## メモリを工夫して使うための基本は配列
配列とは、同じデータ型（サイズ）の複数のデータがメモリ内に連続して並んだもの。配列の要素となる個々のデータは先頭から通し番号で区別され、この番号のことをインデックスと呼ぶ。インデックスを指定すると、それに対応するメモリ領域を読み書きすることができる。インデックスとメモリ・アドレスを変換する処理は、コンパイラによって自動的に生成される。
配列がメモリの使い方の基本となる理由は、配列がメモリの物理的な構造そのものだから。
多くのプログラムでは、様々な工夫を凝らして配列を使っている（スタック、キュー、リスト、2分探索木）。
## スタックとキュー
スタックとキューは、どちらもアドレスやインデックスを指定せずに配列の要素を読み書きできるもの。計算の途中のデータや、コンピュータに接続された装置と入出力するデータなどを一時的に保存しておく場合に、これらの手法でメモリを使用する。
スタックとキューの違いは、データを出し入れする順序の違い。
スタックでは、後入れ先出し（LIFO）、キューでは先入れ先出し（FIFO）によって、メモリ内のデータを読み書きする。あらかじめメモリ内にスタックやキューのための領域を確保し、書き込みや読み出しの順序を決めておくことで、アドレスやインデックスの指定が不要になる。
スタックは、「干草を積んだ山」という意味。干草を積んで山を作ると、最後に積んだ干草が、最初に取り出される。家畜に食べさせる飼料を一時的に保存するためのもの。プログラムに置き換えても、一時的にデータを保存する目的で同じ仕組みが使えれば便利！！これをメモリ上で実現したものがスタック。スタックは、データを一時的に退避し、後で元通りに復元する場合などに使用する。git stashは、stackですね、、、
それに対してキューは、配列に格納された最初のデータが最初に取り出される。待ち行列とも呼ばれる。待ち行列とは、電車の切符を買うために自動券売機の前に並んで待っている人の列などのこと。待ち行列は、不定期に訪れる切符の購買者と、それを処理する自動券売機の処理タイミングが合わない場合の緩和剤となるもの。プログラムでも、データの入力と処理のタイミングを調整するために同じ仕組みが使えれば便利！！！これをメモリ上で実現したものがキュー。キューに不定期に格納されるデータをコツコツと処理していく手法は、通信で送られてくるデータを処理する場合や、同時に実行されている複数のプログラムから送られてくるデータを処理する場合などに使用される。
キューはリングバッファと呼ばれる形態で使われることが一般的。
## リストは要素の追加や削除が容易
リストと2分探索木は、どちらもインデックスの順序とは無関係に配列の要素を読み書きしたもの。
リストを使用すれば、配列にデータを追加したり削除したりする処理を効率的に行える。
2分探索木を使用すれば、配列に格納されたデータを効率的に探索できる。
リストは、配列の個々の要素に、データの値だけではなく、次の要素のインデックスも付加することで実現できる。
リストでない通常の配列を使用した場合、途中の要素を削除したり、途中に追加したりするときに、その後ろにある要素を全て移動しなければならなくなる。これはとても時間がかかる。
## 2分探索木は効率的にデータを探せる
2分探索木はリストをさらに工夫し、配列に要素を追加するときに、その大小関係を考慮して左右2つの方向に分岐させるもの。2分探索木を実現させるためには、配列の個々の要素に、データの値と2つのインデックス情報を持たせれば良い。通常の配列を使用した場合には、配列の先頭からインデックスの順に要素を参照して目的のデータを見つける必要があるが、2分探索木なら、目的のデータが現在読み出しているデータより小さければリストの左側を、大きければリストの右側を辿れば良いので、目的のデータをより早く見つけることができる。
Rails ネストされたリソース

# はじめに
「〇〇さんのブログ記事」のようなページを作成する際、ルーティングの書き方を迷ったのでネストされたリソースのルーティングについてまとめます


## やりたいこと
〇〇さんのブログ記事ページを作成したい
（〇〇さん以外のブログ記事はページに表示しない）
この場合、〇〇さんにブログ記事をネストすると簡単にできる

MemberとEntryモデルが存在し、１対多で関連づけられているモデル

```models/member.rb 
has_many :entries
```

```models/entry.rb 
belongs_to :member
```
***→Memberモデルの下にEntryモデルをネストする***

## ルーティングの書き方
```
resources :members do
  resource :entries
end
```
このルーティングによって、entriesControllerのアクションは以下のパスでアクセスできるようになる
|  アクション  |  パス  |  HTTP  |
| ---- | ---- | ---- |
|  index  |  members/123/entries  |  GET  |
|  show  |  members/123/entries/456  |  GET  |
|  new  |  members/123/entries/new  |  GET  |
|  edit  |  members/123/entries/456/edit  |  GET  |
|  create  |  members/123/entries  |  POST  |
|  update  |  members/123/entries/456  |  PATCH  |
|  destroy  |  members/123/entries/456  |  DELETE  |

idが123の会員の記事一覧ページ・・・indexアクション
**members/123/entries**でアクセスが可能
idが123の会員の456の記事詳細ページ・・・showアクション
**members/123/entries/456**でアクセスが可能

#### パラメータ取得について
123・・・params[:member_id]
456・・・params[:id]

#### ネストされたリソースへのリンクを作成する場合

|  アクション  |  パスを返すメソッド  |
| ---- | ---- |
|  index  |  member_entries_path(@member)  |
|  show  |  member_entries_path(@member, @entry)  |
〜省略〜

entriesControllerのアクションのパスでidを指定するモデルを引数に指定する必要があります

※members/123/entriesの場合はmember.idが指定されているので引数にmemberは必要となる

#### パスを返すメソッドの代わりの配列を指定する場合
|  アクション  |  パスを表す配列  |
| ---- | ---- |
|  index  |  [@member, :entries]  |
|  show  |  [@member, @entry]  |
|  new  |  [:new, @member, :entries]  |
|  edit  |  [:edit, @member, @entry]  |
|  create  |  [@member, :entries]  |
|  update  |  [@member, @entry]  |
|  destroy  |  [@member, @entry]  |


## ネストする・しない混合したルーティングも可能
```
resources :members do
  resource :entries, only: [:index]
end
resource :entries
```
indexアクションはネストしたパス**members/123/entries**でも、ネストしていない**entries**でもアクセスが可能となる

### 余談・・・
```only: [:index, :show]```の記載をすると、indexアクション・showアクションのみのルーテングが作成されるが、```only: []```の記載をすると、すべてのアクションを無効化することができる



## 参考
[【Rails】1対1のアソシエーションにおけるネストされたリソース設計について](https://qiita.com/aiandrox/items/263a56d4321218caabe7)
[【Rails】ネストしたresourcesをフル活用したアプリケーションの作成方法｜_url, _path, form_with modelのエラー対処法](https://prograshi.com/framework/rails/nested_resources/)
オブジェクト指向UI設計について

## はじめに
以下の書籍で、オブジェクト指向をベースとしたUI設計の方法を学んだので、まとめていこうと思います。
[オブジェクト指向UIデザイン 使いやすいソフトウェアの原理](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91UI%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E2%94%80%E2%94%80%E4%BD%BF%E3%81%84%E3%82%84%E3%81%99%E3%81%84%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E5%8E%9F%E7%90%86-WEB-DB-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4297113511)

## 概要
この書籍では、どのようにUI設計をすればユーザーが使いやすいアプリケーションや、システムになるかが書いてあります。様々な実例などを交えながら書かれている書籍だったので、とても勉強になりました。

## オブジェクト指向の設計とタスク指向の設計の違い
### 〇タスク指向の設計
タスク指向のUI設計とは、簡単に言うと、動詞⇒名詞の順番にUI設計がされているシステムになります。
例えば、よく使うドリンクの自動販売機などはまさにそうです。お金を入れる(動詞)⇒ドリンクを選ぶ(選択)という順番で設計されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/29c07e34-3dd3-e90c-fe07-f0bb0d7608b1.png)
システムでいえば、以下のような銀行のATMなどは、「振込」「入金」などの操作の選択を先に行うタスク指向のUI設計になっていることが多いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/081cb325-9be0-edaa-d1e8-2fed3f2ab64f.png)


### 〇オブジェクト指向の設計
これは先ほどの逆で、名詞⇨動詞の順番にUI設計がされているシステムになります。
例えば、以下の画像のような生徒の管理をするアプリケーションがあるとします。
オブジェクト指向のUI設計に基づいて設計をされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/7df29af3-fca1-3050-689c-532d7e096e53.png)

まず、オブジェクト(ここでは生徒がオブジェクト)を一覧で表示します。そのオブジェクトに関するボタン(ここでは編集ボタン)を押すとそのオブジェクトに関する操作ができるような設計になります。つまり、名詞⇨動詞の順番でUI設計がされているというわけです。
これがオブジェクト指向のUI設計になります。今回で言うと、一覧からオブジェクトを選択して、それに対する操作をすると言う流れです。
タスク指向のUI設計では、操作を選んでからオブジェクトを選択するという流れなので、全く逆なのです。

## オブジェクト指向UIの原則
この書籍では、オブジェクト指向UIの原則として以下が挙げられています。

**・オブジェクトを知覚でき直接的に働きかけられる**
**・オブジェクトは自身の性質と状態を体現する**
**・オブジェクト選択⇨アクション選択の操作順序**
**・全てのオブジェクトが互いに協調しながらUIを構築する**

## 宅配ピザサービスの例
最後に特殊なUI設計をしているサービスの解説をしてきます。
このUI設計のおかしな点を以下に箇条書きにしていきます。

**・商品を選ぶ前に、なぜかログインや会員登録しなければならない。**
⇨買いたい商品を選んでからログインなどの操作を行うUI設計の方が、ユーザーからしてもわかりやすい。
**・商品を選ぶ前に、商品を選ぶのではなく、なぜか「今すぐ配達」ボタンを押さないと注文画面にいけない。**
⇨ユーザーからすると、どこのボタンを押せば商品を押すと注文をすることができるのかわかりにくい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/1b7e74c4-0823-7f86-a41a-ae2eabb0945e.png)



## 最後に
他にも記事を書いているので、良ければ見ていってください。

[基本設計について](https://qiita.com/hukuryo/items/97797a91d7e2ee0bcabc)
[Vue.jsとNode.jsでチャットアプリを作った](https://qiita.com/hukuryo/items/265c676d17fe21e75242)
[Next.js×TypeScriptでTODOアプリを作成する](https://qiita.com/hukuryo/items/ebeb26823f944f143b11)
【SwiftUI】画像を透過グラデーションにする

# はじめに
画像を段々透明にするコードを書く機会があったので記録しておきます

# 素材
3年前に撮った川の写真です
![スクリーンショット 2023-07-03 23.06.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/d72dfc3d-3116-85b8-a5fc-7405fdd76723.png)

# 実装
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        Image("sample")
            .resizable()
            .aspectRatio(contentMode: .fit)
            .mask(alignment: .top) {
                LinearGradient(
                    gradient: .init(colors: [.white, .clear]),
                    startPoint: .top,
                    endPoint: .bottom
                )
            }
    }
}
```

# 完成
![simulator_screenshot_CD6EF230-5101-43E1-9523-51EA6F0C50A9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/96689800-880c-1023-ef67-32e783bdb144.png)

# おわり
グラデーションをViewにマスクすることで透過グラデーションさせることができます。
Viewであれば画像以外でも同じ方法で可能です
一旦、他のブランチに移動したい時は git stash コマンドを使う


### 作業ディレクトリから一時的に避難したい

現在の作業ブランチから、一旦他のブランチに移動したい！ってことありますよね。
そんな時に使えるのが`git stash`というコマンド。


stash:隠し場所

gitには、stashという特別な空間があります。ブランチでの作業を`コミットする前に`一時的に保存できる領域です。
`git stash`というコマンドを入力すると、最後の作業内容(スタッシュ)は特別な空間に一時的に保存され、作業ディレクトリは一番最後のコミット時にリセットされる。
スタッシュには、名前が当てられる`（stash@{n}）`

最初のスタッシュ　（stash@{0}）
２番目のスタッシュ（stash@{1}）
3番目のスタッシュ（stash@{2}）
・
・

#### よし、一旦他のブランチでの作業も終えたし、もう一度作業に取り掛かりたい！
そんな時は`git stash apply`で復元することができる！

以上
QRコード生成

## はじめに
初学者がPythonなど勉強しています。

## 目的
（共通）働く環境を改善しましょう。人とAIの仕事の切り分けを推進したい。
（今回）powerappsで読み込むためのQRコード生成

## マイルストーン
1. 目的の確認
2. 現場意向確認
3. AIよコードを生成しておくれ！
4. 付加価値
5. HAPPY!!

## 目的
現状手作業の部分をタブレットでデータ収集＋分析への第一歩
QRコードで読み取ることでできるかぎり間違いを無くす。

## コード
chatGPTを少しでも効率よく活用できるようなプロンプトを勉強する。
OUTPUT重視

今回はエクセルファイルから抽出したいため、エクセルファイルから活用
作成時間は30min

```python:DataDL.py
 
import os
import math
import openpyxl
from PIL import Image, ImageFont, ImageDraw

def print_qr_codes(excel_file, sheet_name, qr_directory):

    # メイリオフォントのパス
    font_path = "C:/Windows/Fonts/meiryo.ttc"

    # エクセルファイルを読み込み
    workbook = openpyxl.load_workbook(excel_file)
    sheet = workbook[sheet_name]

    # QRコード画像のファイルリストを取得
    qr_files = [file for file in os.listdir(qr_directory) if file.endswith('.png')]

    # QRコード画像の数を取得
    num_qr_codes = len(qr_files)

    # 1ページに印刷するQRコードの数
    codes_per_page = 3 * 8

    # A4用紙のサイズ
    page_width = 2480  # ピクセル単位
    page_height = 3508  # ピクセル単位

    # 1つのQRコードの幅と高さ
    qr_width = page_width // 3
    qr_height = page_height // 8

    # 印刷するQRコード画像の座標
    x = 0
    y = 0

    # メイリオフォントを指定
    title_font = ImageFont.truetype(font_path, 32)

    # 新しいページのイメージを作成
    page_image = Image.new('RGB', (page_width, page_height), 'white')
    draw = ImageDraw.Draw(page_image)

    # QRコードを1つずつ配置していく
    for i in range(num_qr_codes):
        qr_code_file = qr_files[i]

        qr_code_path = os.path.join(qr_directory, qr_code_file)

        # QRコード画像を開く
        qr_code_image = Image.open(qr_code_path)

        # QRコード画像を指定の位置に貼り付け
        page_image.paste(qr_code_image, (x, y))

        # エクセルのC列のデータを取得
        data = sheet.cell(row=i+2, column=3).value

        # データが文字列でない場合は文字列に変換
        if not isinstance(data, str):
            data = str(data)

        # ページにタイトルを追加
        try:
            draw.text((x, y), data, font=title_font, fill='black')
        except TypeError:
            print("データを印刷します:", data)

        # QRコードの位置を更新
        x += qr_width
        if x >= page_width:
            x = 0
            y += qr_height

    # ページを保存
    page_image.save("printed_page.png")
    print("ページが保存されました。")

if __name__ == "__main__":
    # エクセルファイルのパス
    excel_file = 'data.xlsx'

    # 使用するシート名
    sheet_name = 'Sheet1'

    # QRコードの保存先ディレクトリ
    qr_directory = 'QRディレクトリ'

    # QRコードを印刷する関数を呼び出す
    print_qr_codes(excel_file, sheet_name, qr_directory)
```

## 付加価値
QRを活用することで、
デバイス管理用やマニュアル、各種ムービー/情報に展開させる。
わからなくてもQRですぐフォローできるような状況にしておこう。

## HAPPY！！！
ここまで読んでいただきありがとうございました。
OUTPUT継続していきましょう。
【SwiftUI】Viewを円状に配置する方法

# はじめに
この記事では、Viewを円状に配置する方法を紹介します。

# 作るもの
色のついた7つの円を円状に配置します。
![スクリーンショット 2023-07-03 21.50.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366249/64eb026d-fdde-45a9-0a99-7a35c7bb3f8e.png)


# やり方

## コード全体
```swift
import SwiftUI

struct ContentView: View {
    private let colors = [Color.red, Color.orange, Color.yellow, Color.green, Color.blue, Color.purple, Color.pink]
    
    var body: some View {
        ZStack {
            ForEach(0 ..< colors.count, id: \.self) { i in
                Circle()
                    .fill(colors[i])
                    .frame(width: 50, height: 50)
                    .offset(
                        polarToRectangular(r: 100, theta: theta(i: i))
                    )
            }
        }
    }
}

extension ContentView {

    // 等間隔に配置するための角度を計算
    // 360° ÷ 色の数にインデックスを掛ける
    private func theta(i: Int) -> CGFloat {
        return CGFloat(i) * 2 * .pi / CGFloat(colors.count)
    }

    // 中心からの距離と角度を指定して、円状に配置するための座標を返す
    // 極座標（r, θ）を直交座標（x, y）に変換
    private func polarToRectangular(r: CGFloat, theta: CGFloat) -> CGSize {
        let x = r * cos(theta)
        let y = r * sin(theta)
        return .init(width: x, height: y)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```

## ポイント
このコードのポイントは、`polarToRectangular(r:theta:)`メソッドです。このメソッドは、中心からの距離と角度を指定して、円状に配置するための座標を返します。このメソッドは、数学の極座標（r, θ）と直交座標（x, y）の変換に着想を得ています。

また、`theta(i:)`メソッドは、等間隔に配置するための角度を計算しています。等間隔に配置するための角度は、360° ÷ 色の数にインデックスを掛けることで求めることができます。

# おわりに
SwiftUIでViewを円状に配置する方法を紹介しました。メソッドに切り出す時って名前をどうするか悩みますよね。今回は、数学に着想を得て命名してみました。この記事が参考になったと思った方は、いいねとフォローしていただけると嬉しいです☺️
📜Private Diary【AWSで仮想ネットワークを作成する】

## はじめに
オンラインスクールに入り、早３ヶ月が経ちました。
無事にポートフォリオも作成ができましたが、残り１ヶ月である今月はクラウド教養としてAWSについて深く学習中であるエンジニアを目指しているものです。
ポートフォリオについては、いつか記事にて紹介ができたらと思っています。

## 今回学習していること
今月の課題は、「自身で仮想ネットワークを構築し、そのネットワーク上にPFをデプロイし、公開する。また、該当のEC2インスタンスに障害が発生した場合、通知を受けられるようにする。」となります。

下記のような、AWS構成図を作成してイメージを持ちながら作成中になります。
![スクリーンショット 2023-07-03 22.10.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338070/e1a07f92-f27c-c665-63e0-f5a9f9809ffd.png)

特にエンジニアの業界はアルファベットやらカタカナやら短縮したり特殊な用語だったりと覚えるのが大変です。すべてを暗記するくらいまで覚えるのは難しいので、全体の把握までを目標に頑張っています。

## イメージしていること
VPCという仮想ネットワークを作成して、その中でAZ（アベイラリティーゾーン）を２つ作り、またその中でサブネットを「パブリック」「プライベート」で分けて作成して、片方のAZのパブリックサブネットの中に、新たにEC2を作成する。（このEC2インスタンスはPFをデプロイするためのインスタンス）また、片方のプライベートサブネットにはRDSを作成する。（このRDSは先月のPF作成時にすでに作成済みのため、今回はVPCの移行を行う）
以上の状態までを構築してがゴールであると認識しています。
明日以降にまた、訂正が必要であると気づいた場合は修正していきます。

現在は、上記の図であるAWS構成図の外枠ができたと思いますので、明日以降から作成したEC2に、再度RubyやRailsなどをインストールすることがはじめて、改めてデプロイができるようにしたいと思います。

## 終わりに
このクラウド学習が終わればついに、転職活動が開始となります。
今の率直な気持ちとしては、「この知識だけで働けるの？」です。全くの未経験の人と比べては、ある程度知識などはあると思っていますが、やればやるほど奥が深すぎることに気づきます。
この業界は、いつまでも勉強なのだと実感することもできますが、この今の知識で働きばじめても本当に何ができて企業へ還元できる？と感じてしまいます。

転職活動は、すぐに終わることはない思いますので（未経験転職なので尚更！）、転職活動中も怠けずに継続して学習して行くことを強い気持ちで持ち続けたいと思います。
明日も頑張ろう！！
Microsoft Certified: Azure Fundamentals（AZ-900）を2週間で取得！

# 実は取る気なかった・・・
元々SAAの勉強をしていたのですが、あまりに覚えることが多く煮詰まっていました・・・
# よっしゃ、何かサクッと取って勢いつけたろう！
折角ならクラウド関係の資格がいいなあ・・・
クラウドプラクティショナーは既に取ってしまったし・・・

あっ、それなら有効期限ないこれにしよ！

【Microsoft Certified: Azure Fundamentals（AZ-900）】

https://learn.microsoft.com/ja-jp/certifications/azure-fundamentals/

こういうのは短期集中。2週間を目標にチャレンジ慣行。


# まず1週目☆
最新の試験体系に沿っているとのことでこちらを読み込む。
『合格対策 Microsoft認定 AZ-900：Microsoft Azure Fundamentalsテキスト＆問題集 第2版』
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287651/476af009-4c2d-171d-fa1d-70786ee806d3.png)


https://amzn.asia/d/2tfzDZI

模擬試験を除いて1～2周しました。
**斜め読みして、全体像の理解に注力。**
章末問題があったので、そこで知識の穴を見つけていく感じになりました。

# ラスト2周目☆
模擬試験を解きまくりました。
上記テキストだけでは圧倒的に問題量が不足するので、セール中にUdemyの教材も購入。

https://www.udemy.com/course/az-900-microsoft-azure-fundamentals4176/

**模擬試験1～5を9割取れるまでひたすら解く。**
大体1つの模擬試験を7周はしました。
併せて上記テキストの模擬問題も3周行いました。

個人的に管理グループやリソースグループ、ポリシーとロールの違いやAzure AD、基本的なSaaS、PaaS、IaaSの違いに苦戦しました。

理解が難しいところは、上記テキストや下記サイトを参考に理解を深めました。

https://az-start.com/category/az-900/

# いざ本番！
これ解いたやつだ！となったのは体感3～4割程かな？
うわ知らんわ～みたいな問題もあったので、そういうのは潔く捨てて取れるところを確実にという意識で解き、2度慎重に見直して試験終了！見直しは余裕持って出来ました。正直ギリギリ受かるかな？という感触でした。

# 2週間で合格！！
**ボーダー700点で865点を取得し、無事合格。**
思っているより余裕を持って合格できホッとしました💦

これで本丸のSAA取得にも勢いづいたと思う。頑張ろう！

# 工夫したこと
①スプレッドシートに不明点をまとめ、自分なりの解説シートを作った。
②どうしても覚えられないことは、とにかくノートに書く。
**③音読！！（②とセット。書いて読んでは最強）**
④解説しっかり読む！（答え丸暗記はNG。同じ内容を問われているのに日本語が違うだけで違う問題のように見えます。）

# 最後に感想
資格自体は初級レベルなので自慢出来るものでもなんでもないですが、資格試験を受けたのが1年半ぶりだったので、どういう学習の仕方が良いか改めて考えることが出来ました。
**気になったのは、スプレッドシートで不明点をまとめたのは良いものの、何だか自己満足で意味のないような気もしたので運用を今後工夫したい。（パワポでフラッシュカード作るとか?）**
また、案外クラウドの基礎部分SaaS、PaaS、IaaSの違いがよく理解出来ていなかったことに気づけて良かったと感じています。SAAが取得出来たらまた記事にしたいと思います。
typeorm 熱心で怠惰な関係


typeormのtips的な備忘録です。

## 熱心で怠惰な関係？
typeormでrelationを使用する際に使用する設定です。

https://typeorm.io/eager-and-lazy-relations

このページをgoogle翻訳するとタイトルのように訳されるのですが、それでもわからん。
ということで発行されるクエリを確認しつつどう動くのか確認して行きます。

## Eager relations
テーブルやコードに関しては公式ドキュメント通りを用意

### SQL確認
発行されたSQLを確認するとcategoryをleftjoinしている。
付け足すだけでリレーション先も呼び出せるのは楽だが、コストが高いため関連が強いのであれば使用して良いかもしれない。
積極的にとってくるという意味でeager熱心ということらしい。
```
SELECT "Question"."id" AS "Question_id", "Question"."title" AS "Question_title", "Question"."text" AS "Question_text", "Question__categories"."id" AS "Question__categories_id", "Question__categories"."name" AS "Question__categories_name" FROM "question" "Question" LEFT JOIN "question_categories_category" "Question_Question__categories" ON "Question_Question__categories"."questionId"="Question"."id" LEFT JOIN "category" "Question__categories" ON "Question__categories"."id"="Question_Question__categories"."categoryId"
```

## Lazy relations
こちらもコードは公式を使用して確認

### SQL確認
クエリだと結合（特に外部結合）は発生してないように見えるのでこのクエリが投げられているならコストは低いと思われる。
ただし、categoryが取得できているのでクエリでなく、どこかの処理で処理は行なっているはず。
メモリなどを確認して、トレースしていけば判明するかもしれない。
消極的にとってくる（あればとってくる）という意味で　lazy怠惰ということらしい。

```
SELECT "Question"."id" AS "Question_id", "Question"."title" AS "Question_title", "Question"."text" AS "Question_text" FROM "question" "Question"
```
取得結果
```
console.log([questions]);
console.log([categories]);
--- 結果 ---
[ Question { id: 1, title: 'aaa', text: 'bbb' } ]
[
  [
    Category { name: 'animals', id: 1 },
    Category { name: 'zoo', id: 2 }
  ]
]
```
Ansibleで日本語版SQLServerをインストールする際の`This SQL Server setup media does not support the language…`を解消する

AnsibleでSQLServer(日本語版)をWindowsServerにインストールしようとした際にハマったのでメモを残します。

具体的にはAnsubleからサイレントインストールした際に以下のようなエラーが表示されました。

```log
This SQL Server setup media does not support the language
of the OS, or does not have the SQL Server English-language version
installation files. Use the matching language-specific SQL Server
media; or install both the language specific MUI and change the format
and system locales through the regional settings in the control
panel.
```

内容だけ見るとインストーラーとOSの言語設定があっていないがために発生するように見えますが、実際は間違っておらずAnsibleを経由せず直接WindowsServer上でPowershellを流すとインストールができます。

以下のような記事も試してみましたがどうもうまくいきませんでした。

https://groups.google.com/g/ansible-project/c/ZBnHCAT4_Ro?pli=1

https://qiita.com/HirokiSakonju/items/9c4d91ff45c94992309e

## 解決策
最終的には`ワールドワイド言語サポートでUnicode UTF-8を使用`をPowershell経由でサイレントインストールする際だけ有効化し、インストール後に元に戻す形でインストールを実現しました。

```yml
- name: Enabled WorldWideLanguageSapport utf-8
  win_shell:
    $path = "HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage"
    Set-ItemProperty -Path $path -Name "ACP" -Value "65001"
    Set-ItemProperty -Path $path -Name "OEMCP" -Value "65001"
    Set-ItemProperty -Path $path -Name "MACCP" -Value "65001"

- name: Disabled WorldWideLanguageSapport utf-8
  win_shell:
    $path = "HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage"
    Set-ItemProperty -Path $path -Name "ACP" -Value "932"
    Set-ItemProperty -Path $path -Name "OEMCP" -Value "932"
    Set-ItemProperty -Path $path -Name "MACCP" -Value "10001"
```

画面から設定する際は`コントロールパネル＞時計と地域＞地域＞管理＞システムロケールの変更＞ベータ：ワールドワイド言語サポートでUnicode UTF-8を使用`から設定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223700/e0011af7-a617-266d-d874-7e31f66e0df7.png)

https://stackoverflow.com/questions/56419639/what-does-beta-use-unicode-utf-8-for-worldwide-language-support-actually-do
【実践時系列解析】グレンジャー因果検定とインパルス応答関数

# 概要
・前回の記事に続き、VARを応用した分析を行う

https://qiita.com/icchi-ioo/items/bb95bb992c8e7ada72df


・今回の分析の1つがグレンジャー因果検定で、時系列における”グレンジャー因果”を検定するものである。これを使えば、どの変数同士にどういった方向の関係があるかを推察できる

・インパルス応答関数は選択したある変数にショック（インパルス）を与えた時、他の変数にどのような影響を与えるのかを調べることができる。現実で利用できる具体例として、広告を１単位打ったとき、売上にどのくらいの寄与があるかなどを調べることに使える

・今回は電力需要とその他の変数にどのような関係があるのか調べる

# グレンジャー因果検定
まず、グレンジャー因果検定の概要から

### 誤ったグレンジャー因果に対するイメージ
グレンジャー因果検定の間違ったイメージとして、原因は過去にあり、結果は原因より後に起こる。故に、時系列データでは因果関係を推定しやすく、それがグレンジャー因果検定だというものがある。

しかし、グレンジャー因果検定では2つのモデルのMSE（平方二条誤差）を比較しているだけであり、上記のイメージはかなり違う。

説明のためにまず、グレンジャー因果性について説明する

### グレンジャー因果とは
グレンジャー因果性とは目的変数X_tを説明する際に、X_(t-1)だけではなく、ある説明変数Y_(t-1)を加えると予測精度が改善するとき、YからXへのグレンジャー因果があるという。

つまり、説明変数YはX_tを予測するのに役立つ情報を持っているということ。

それを数式を使って説明する

### 数式で確認

$X_{t} = c + X_{t-1} + \varepsilon$ ・・・① 
$X_{t} = c + X_{t-1} + Y_{t-1} + \varepsilon$ ・・・②

２つの式をMSE（平均二乗誤差）を比べた時、②の式の方が改善していた場合、YからXへのグレンジャー因果性があるという。

では具体的にどのくらい改善していれば良いかというと、ここで検定統計量を利用する。2つの式の残差平方和の差を若干いじったものから検定統計量Fが計算できる。この時、２Fはかい２乗分布に近似するので、お馴染みの検定ができる。

※説明変数は入れるほど、残差平方和は小さくなる性質がある。それを考慮した上での検定をグレンジャー因果検定は行なっている。

### 実践
前回記事で必要なデータ、ライブラリーはインストールしたものとする。
```python
# モデルのインスタンス生成
var_model = VAR(df_train.diff().dropna())
# モデルを構築
results = var_model.fit(maxlags=10, ic='aic')

# グレンジャー因果性を確認
for i in col: # colはモデルに入れた変数
    for j in col:
        print(i, '→', j, results.test_causality(caused=i,causing=j).pvalue)
```

p値を確認できる。

![スクリーンショット 2023-07-03 20.30.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707093/9fd9226a-699f-0e54-655b-58f74cc6eff2.png)

p値が小さい場合は帰無仮説(グレンジャー因果性がない)を棄却し、対立仮説を採用する。今回の分析ではV_4という変数からPOWER（電力需要）という因果の流れを有意水準５％で確認できる。

### グレンジャー因果検定の弱点
因果の方向はわかったとしても、その大きさがわからないという弱点がある。その弱点を補うのがインパルス応答関数である。

# インパルス応答関数

ある変数を１単位動かしたとき、他の変数がどのくらい動くのか示したものがインパルス応答関数。経済学でいう限界効用みたいなもの。

```python
# (直行化)インパルス応答関数
period = 10
irf = results.irf(period)
irf.plot(orth=True)
plt.savefig('pic/tmp3.png')
plt.show()
```

![tmp3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707093/3bbd7233-6260-56e0-19b7-7ebc54d57f51.png)

V_4の変動がPOWERに影響を与えていることがわかる。

# 参考文献

https://www.salesanalytics.co.jp/datascience/datascience128/#ADF

https://www.salesanalytics.co.jp/datascience/datascience115/#ADF

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

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

https://corvus-window.com/app_var/
古いRoomライブラリで「Caused by: java.lang.Exception: No native library is found for os.name=Mac and os.arch=aarch64. path=/org/sqlite/native/Mac/aarch64」に遭遇したら

https://www.udemy.com/course/modern-food-recipes-app-android-development-with-kotlin/

上記Udemyでspoonacular APIとRoomを使用したFood Recipeアプリをハンズオンで学んでいた時に、
分かりずらいエラーに出くわしました。

```
* What went wrong:
Execution failed for task ':app:kaptDebugKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
   > java.lang.reflect.InvocationTargetException (no error message)

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org


```

ビルドエラーをうんうんとうなりながら辿っていくと、以下に到達

```
Caused by: java.lang.Exception: No native library is found for os.name=Mac and     os.arch=aarch64. path=/org/sqlite/native/Mac/aarch64 
```

講座自体がGitHubの更新から見るに3年以上は経っており
M1 MacでのビルドをしようとするとRoomのライブラリで上記エラーになるようです。

https://github.com/stevdza-san/Foody/

room-compilerより前の行に1行追加するだけで解決。
半日悩んだけどあっさり治りました。

```
 // Room components
kapt "org.xerial:sqlite-jdbc:3.34.0"  // この行を追加
implementation "androidx.room:room-runtime:2.2.5"
kapt "androidx.room:room-compiler:2.2.5"
implementation "androidx.room:room-ktx:2.2.5"
androidTestImplementation "androidx.room:room-testing:2.2.5"

```

# 参考
[Caused by: java.lang.Exception: No native library is found for os.name=Mac and os.arch=aarch64. path=/org/sqlite/native/Mac/aarch64](https://stackoverflow.com/questions/68884589/caused-by-java-lang-exception-no-native-library-is-found-for-os-name-mac-and-o)