OmniAICreator/Qiita-1.07M huggingface dataset:
#新卒の年からの業務で困ったことまとめ(~3年目まで)

# はじめに
　本記事はweb系のエンジニアとして2020年に就職したエンジニアが各年次で困ったことをざっくりと書き溜めたものです。
# 筆者の情報
  - 2020年（コロナ１年目）新卒入社
  - 情報系学部卒
  - 卒業時点で数日適当に参考書を眺めてITパスポートに何とか受かるぐらいの知識
  - 個人開発なら簡単なものを自分で作成できるが卒業時点でチーム開発の経験はほぼなし
  - web系のアプリの運用/保守・開発が業務の中心

# １年目の困りごとと失敗談(※2年目の夏に記憶を掘り返して記載)
 - チケットでのタスク管理に戸惑う（backlogを使用）
    - wbsの更新を上司に任せきりに
    - チケットのステータスが未対応のまま放置など
 - gitの使い方に慣れていないため（開発での基本的な運用方法知らず）プルリクエスト出さずに直接リリースブランチに変更をプッシュする
 - どこまで聞いてよいかわからない（細かすぎることを聞くのに躊躇する）
 - 議事録の書き方統一(～こと口調で統一するなど)ができず、時間がかかる

# ２年目の困りごとと失敗談
 - 時間管理ができておらず、作業日前日に保守対応で流すスクリプトが完成していない
 - リモートワーク2年目にして慣れてきてモチベーションが保てない
 - DB設計が粗い
   - 「本人的には動いたからできた!」の認識だが、処理が重かったりしてなかなか要件を満たさなかったりする
   - 案件の直属の上司に「sql苦手意識持ってるみたいやね」と評価をいただく（本人的にはそうでもないと思っている
 - 調査に時間をかけすぎて振られた対応に時間がかかる

# ３年目の困りごとと失敗談
- 自分の責任で決めて良い内容かどうかの切り分けに失敗する
- 時間をかけるべきタスクとサクッと終わらせるべきタスクの判別に苦戦
    - 先輩から「やりたくないタスクに対する手の抜き方がすごい」と評価をいただく
    - 本人的には手を抜いていたわけではないと思っているが「やりたくない」の部分があっていたので冷や汗
- メール問い合わせ対応を勘違いにより見なかったことにする
- お客様との会議が増えるが、「言いたいことが伝わらない」が露呈する
- コーディング規約を守らずレビューが通らず何度も修正依頼をもらう
- API呼び出しの設計が甘く、「それだと月次バッチなのに1ヵ月動かし続けても終わらない」と言われる

# おわりに
本当は4年目も途中までまとめていたんですが、技術的な困りごとが多くなり始めたので、ここまでにします。
解決策とかが書いてあるわけではないですが、OJTを担当し始めたり、部下に新卒を持ち始める同世代の方々が下の世代の方々と接するうえでのヒントになれば幸いです。
※ちなみにWBSのチケット更新は4年目半ばぐらいまで直属の先輩に任せ気味になっていたことをここに懺悔します
Ubuntuの容量がなくなってboot出来なくなったときの対処法

# TL;DR
- Ubuntuの容量がなくなってboot出来ない
- USBで再起動
- データを削除

# こわれた
データを生成している最中にUbuntuが固まってしまったので，再起動したところ起動出来なくなった

![スクリーンショット (612).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3694323/4ea934bd-8e55-871f-0933-4ee9675f4324.png)

# UbuntuをインストールするUSBを作成
↓参考サイト

https://rtc-fukushima.jp/technical/6671/

空のUSBを用意する

PCにISOファイルをダウンロードする
↓Ubuntu Desktop 22.04.3 LTSの場合

https://jp.ubuntu.com/download

↓USBに書き込むためにUniversal-USB-Installerをダウンロードする

https://pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/

USBメモリをPCに接続して，フォーマットを確認する
NTFSだと問題ある可能性があるので，それ以外のフォーマット形式(FATなど)がよい

確認方法
Windowsでは、フォルダの中のコンピュータにUSBがあることを確認
USBドライブ選択状態で右クリックし，メニューから「フォーマット」を選ぶ

↓参考サイト

https://av.jpn.support.panasonic.com/support/home_p/download/format_10.html#:~:text=USB%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E9%81%B8%E6%8A%9E%E7%8A%B6%E6%85%8B%E3%81%A7,%E3%80%81%E3%80%8C%E9%96%8B%E5%A7%8B%E3%80%8D%E3%82%92%E9%81%B8%E6%8A%9E%E3%80%82&text=%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%81%AE%E7%A2%BA%E8%AA%8D%E7%94%BB%E9%9D%A2%E3%81%8C,%E3%81%A6%E3%80%8COK%E3%80%8D%E3%82%92%E9%81%B8%E6%8A%9E%E3%80%82

Universal-USB-Installerを起動し,インストール

# パソコンを再起動
外付けUSBからUbuntuを起動する
F12を押す(場合による)

Bootsetup

security 
unlock setup statusのlockedを変更
unlock setupを押す

boot
File browser add boot option

saveしましょう

# 問題のファイルを探す
- ターミナルを開く

- 権限を変更
```sudo -i```を実行し，管理者となる

- 容量を沢山とっている原因のデータの保存先を探す
削除しても良いデータ(原因のデータ)が保存されているパーテーションを確認するために，```fdisk -l```や```lsblk```を実行する

- マウントして削除

    - パーテーションが特定出来たら, マウント先のディクレクトリを作成する
例. データが保存されているパーテーションが```nvme1n1p2```の場合は, ```mkdir /mnt/nvme1n1p2```を実行する

    - データが保存されているパーテーションをマウントする
例. データが保存されているパーテーションが```nvme1n1p2```の場合は, ```mount /dev/nvme1n1p2 /mnt/nvme1n1p2```(```mount <消したいファイルの場所>　<新しく作った場所>```)を実行する
    - マウントしたパーテーションの中で容量を消費しているデータを削除する
```find```や```grep```コマンドで探すと良い

    ```
    # ルートディレクトリから****を検索(おすすめ)
    find / -type d -name ****
    ```

    - 探した後はそのデータを削除(ディレクトリの場合は以下のような感じ)
    ```rm -rf <ディレクトリ名>```

- 再起動する
復活(o^―^o)ﾆｺ

# 大事なこと
データ生成のコードを走らせている最中に挙動がおかしくなったら，まずはディスクの空き容量を表示する```df -h```を実行して空き容量を確認する．容量が100%に近い場合は再起動してはいけない．まず，生成したデータを削除する．
javaで直角三角形を表示するプログラムを作る２

# 問題
int型の変数nを作成し、一辺がn個の右下直角の三角形を表示するプログラムを作成せよ
例) nが4の場合
## 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717834/f071e39c-16b3-2e9d-a4e1-12e9e0f03284.png)

## 解答
```java
	public static void main(String[] args) {

		int n = 4;
		for (int i = 1; i <= n; i++) {
			dispCircle(i, n);
			System.out.println();
		}
	}

	static void dispCircle(int i, int n) {
		for (int j = n; j >= 1; j--) {
			if (i < j) {
				System.out.print(" ");
			} else {
				System.out.print("●");
			}
		}
	}
```
## 解説
`dispCircle`メソッドの`for`文で`j`を減算することで空白の出力回数を
1行ごとに減らしています。
`dispCircle`に渡す`int i`は●の数なので`j`が`i`と同じ値になるまで空白を出力するというイメージを持つと
理解しやすいです。

## 感想
この問題で一通りピラミッドを出力するシリーズは終了したのですが、エンジニアになって1年で
まだこの問題解くのがやっとレベルなのが大変焦りです。
OpenSilver 2.1 がリリースされました。 F# 開発者は、高度な Web アプリケーションで自分の言語を XAML の分離コード言語として使用できるようになりました。

親愛なるみんな、

F# 言語をサポートする OpenSilver 2.1 の新しいリリースに関する情報を共有します。

Web アプリケーションを構築するためのオープンソース フレームワークである OpenSilver は、F# の強力で表現力豊かな機能を採用し、Web 開発をより機能的、簡潔、効率的にします。 複雑なビジネス アプリケーションを作成している場合でも、インタラクティブな Web インターフェイスを作成している場合でも、OpenSilver 2.1 は F# の強みを活用して、より少ないコードとより多くの機能でプロジェクトを実現します。

OpenSilver と完全な変更ログを含む新しいリリース、およびその開始方法について詳しく興味がある方は、公式発表がここにあります: https://opensilver.net/announcements/2-1/
【SwiftUI】スクロールするとふわっとコンテンツが下から出現するあれ

# はじめに
Webサイトとかだとよく見る、スクロールするとふわっとコンテンツが下から現れるあれをiOSで実装してみます。

# サンプルアプリ
![Simulator Screen Recording - iPhone 15 Pro - 2024-02-26 at 21.19.56.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/6bf3ec5c-8189-3250-fa75-b4e7b62d899e.gif)

# 実装
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        ScrollView {
            VStack(spacing: 20) {
                ForEach(0..<30) { index in
                    GroupBox("新機能\(index)") {
                        Text("サンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキスト")
                    }
                    .scrollTransition(.animated, axis: .vertical) { visualEffect, transitionPhase in
                        visualEffect
                            .opacity(0 < transitionPhase.value ? 0.0 : 1.0)
                            .offset(y: 0 < transitionPhase.value ? 0.0 : -40.0)
                    }
                }
            }
            .padding()
        }
    }
}
```

# 解説
`transitionPhase`の型は`ScrollTransitionPhase`で列挙型です。

- identity
- topLeading
- bottomTrailing

上記の3つのcaseがあります。

ドキュメントを読むと以下のような判定だということがわかります。

|||
|-|-|
|`identity`|ScrollViewの可視領域内（中心付近）にコンテンツがあるときに適用される|
|`topLeading`|ScrollView(.vertical)の時は上端、ScrollView(.horizontal)の時は左端にコンテンツがあるときに適用される|
|`bottomTrailing`|ScrollView(.vertical)の時は下端、ScrollView(.horizontal)の時は右端にコンテンツがあるときに適用される|

では、今回使用している`transitionPhase.value`はなんなのでしょうか？

これは`topLeading`を-1.0、`identity`を0、`bottomTrailing`を1.0としてDoubleで出力してくれるプロパティです。

ここまでわかるとコードで何をしているのかを理解しやすくなると思います。

ちなみに以下のコードでも同じことができます。
```swift
.scrollTransition(.animated, axis: .vertical) { visualEffect, transitionPhase in
    visualEffect
        .opacity(transitionPhase == .bottomTrailing ? 0.0 : 1.0)
        .offset(y: transitionPhase == .bottomTrailing ? 0.0 : -40.0)
}
```

# おわり
ScrollViewのアニメーションの幅がかなり広がりましたね
I18nにおける翻訳ファイルのコンフリクト解消

## はじめに
とある東京のWeb系企業で主にフロントエンドの開発をしております、tatanと申します。
今回は業務でローカライズ対応をする際によく生じる翻訳ファイルのコンフリクトについて、私が行っている解消手順を書き残したいと思います。

## 解消手順
翻訳ファイルがコンフリクトをしたら、以下の手順で解消できます。(VSCodeの場合)

1. 翻訳の削除部分があればまず先に手動で削除する
2. vscodeでコンフリクトが生じている部分全てをaccept both changesする
3. npm run i18nを実行する

これで重複がなくなり、順序も正しいものとなります。

## おわりに
そもそもコンフリクトが起きなければ解消する必要はないですよね。
弊社では翻訳ファイルを一つのファイルで全て管理しているためにコンフリクトの起きる頻度が多くなってしまっています。
なのでドメインごとに翻訳ファイルを分けるなどすればコンフリクト確率も減らせそうですね。
pythonでcsvファイルの編集

## 前提
ゴールとしてawsのs3にupされたcsvのファイルをlambdaで編集し再UPするものを作りたいので
手始めにローカル環境のpythonでcsvを編集する処理を試していきます

## 準備
in.csv
![スクリーンショット 2024-02-04 20.14.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535004/67dbe298-97b5-95bd-eff2-841125741c71.png)

サンプルとしてこのようなcsvファイルを用意しておきます
今回は「合計、平均、中央値」を追加してみます

## 実戦
```main.py
import pandas as pd
import numpy as np

def change_csv(df):
  # '国語', '数学', '理科', '社会', '英語'の列を抽出
  subjects = ['国語', '数学', '理科', '社会', '英語']
  subject_columns = df[subjects]

  # 結果を新しい列としてDataFrameに追加
  df['合計'] = subject_columns.sum(axis=1)
  df['平均'] = subject_columns.mean(axis=1)
  df['中央値'] = subject_columns.median(axis=1)
  return df

# CSVファイルの読み込み
df = pd.read_csv('in.csv')
df = change_csv(df)

# 変換後のCSVファイルを保存
df.to_csv('out.csv', index=False)

print("CSVファイルが変換されout.csvとして保存されました。")
```

これで実行指定みるとout.csv出力されます

out.csv
![スクリーンショット 2024-02-04 20.14.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535004/63b22b36-f961-df1d-0df3-99eacfd5eee0.png)


こんな感じで「合計、平均、中央値」が追加されました簡単ですね

## おわり
csv周りの編集は色々と便利そうですs3にcsvを吐き出したりとしたい場合も多いので
lambdaので今回の処理のようにcsvを編集して再upするなどすると実現可能なことも多そうです
FlutterでCocoaPodsがインストールされていないというエラーが出たときの対処

## 起こったこと

・いつも通りFlutterでコードを書いてエミュレータでアプリを起動しようとしたところ

```
Warning: CocoaPods not installed. Skipping pod install. CocoaPods is used to retrieve the iOS and macOS platform side's plugin code that responds to your plugin usage on the Dart side.
Without CocoaPods, plugins will not work on iOS or macOS. For more info, see https://flutter.dev/platform-plugins To install see https://guides.cocoapods.org/using/getting-started.html#installation for instructions.

Exception: CocoaPods not installed or not in valid state.
```

というエラーが発生してアプリの起動ができなくなった。

## 対処方法

### step1.homebrewをインストールする

https://brew.sh/ja/

:::note info
既にhomebrewがインストールされている人はstep2へ
:::

・ターミナルに以下入力

```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

・パスワードを入力

・インストール終了後、パスを通す

```
Add Homebrew to ~ に続く部分をコピぺしてreturn
```

・インストールが正常に終了したかを確認

```
brew help
```

### step2.cocoapodsのインストール

```
brew install cocoapods
```

・インストールが完了したら、

```
flutter doctor
```
を実行(android studioのターミナルでもOK,一度再起動しておく)

・Xcodeに関する内容の中の、CocoaPodsの欄に✅がついていればOK!
WordPressのホームページ以外のページで404が発生するときの対処法

WordPressのパーマリンク設定を変えた後にホームページ以外のページで404が発生したことがありますか？
自分でWordPressをセットアップしたときに起きやすい問題なので、WordPressのこの問題に困っている方はこの方法を試してみましょう！
## 原因
### パーマリンク設定を基本以外にしている

パーマリンクを基本以外にするとこの問題が発生する可能性が高まります。

### ウェブサーバーの``mod_rewrite``モジュールが有効になっていない

``mod_rewrite``モジュールは、URLの書き換え・リダイレクトを行ってくれるモジュールです。
Apache (httpd)のコンフィグでこのモジュールが有効になっていないと、``mod_rewrite``モジュールをWordPressが読み込むことができないため、この問題が発生します。

### URLの書き換え・リダイレクトを設定で許可していない

Apache (httpd)のコンフィグでURLの書き換え・リダイレクトが許可されていないと、この問題が発生します。
Apache (httpd)のコンフィグの``AllowOverride``設定を変えることで解決します。

## 解決方法

### ウェブサーバーの``mod_rewrite``モジュールを有効にする
Apache (httpd)のコンフィグファイルを開き、下記のコンフィグがコメントアウトされているか、存在しない場合は下記のコンフィグのコメントアウトを解除するか、追加してください。
```
# コンフィグ
LoadModule rewrite_module modules/mod_rewrite.so
```
(#が書いてあるところは追加しなくてもOKです)

### URLの書き換え・リダイレクトを許可する
ウェブサーバーの``mod_rewrite``モジュールを有効にしていてもこの問題が発生する場合は、URLの書き換え・リダイレクトを許可する設定をしてみてください。
Apache (httpd)のコンフィグにある下記のコンフィグが存在するかを確認します。
```
AllowOverride All
```
このコンフィグがない場合は、下記のコンフィグを上のコンフィグに置き換えてください。
```
AllowOverride None
```

## 最後に
この投稿で404が発生する問題が解決しましたか？
ちなみにですが、この設定をすることでApacheの404ページが表示されなくなります。
(変わりにWordPressの404ページが表示されます)
もし皆さんのお役に立てたなら幸いです！
C9x な Legacy な C での static_assert

工場の機材とか相手にするとたまにあるんですよね。

```c
#define static_assert(cond, msg) \
typedef int compile_time_assertion_[(cond) ? 1 : -1]
```

cond の評価結果が負になると三項演算子の : の次の式が採用されて、

```c
typedef int compile_time_assertion_[-1];
```

と展開されて、-1 を配列のサイズに採用できないよ！というエラーになります。
(ただし、cond はコンパイル時定数である必要があります)

メッセージは出ません。
LaravelでSQLSTATE[HY000] [2002] Connection refusedがでたときに試したこと

僕は初心者です。
初めての投稿です。

 Laravel学習中にこのようなエラー画面がでて先に進めなくなりました。

 SQLSTATE[HY000] [2002] Connection refused (SQL: select * from `articles`)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2212591/69085b07-246e-6add-94e8-abe51d18553c.png)


$ brew install mariadb
$ brew services start mariadb

こちらのコマンドを打ってから、

php artisan serve        

で無事に画面がでました。
空行が含まれたファイルを読み込んでランダムに一段落単位で読み上げるPowershellスクリプト

<h3>空行が含まれたファイルを読み込んでランダムに一段落単位で
読み上げるPowershellスクリプト</h3>
空行が含まれたファイルを読み込んでランダムに一段落単位で
読み上げるPowershellスクリプトを作りました。

<hr>
PGM内容

RandomSyoBetuYomiageHoge1.ps1

```powershell
#テキスト読み上げ用
Add-Type -AssemblyName System.Speech

$ps_speak = New-Object System.Speech.Synthesis.SpeechSynthesizer
$ps_speak.SelectVoice("Microsoft Haruka Desktop")

#音声読み上げ用ファイルを読み込み
$arr = Get-Content "C:\hoge\hon-yomiage-text\YomiageText1.txt"
#echo $arr

$str1 = "";
$strlist = @();

for($i=0; $i -lt $arr.Length; $i++){
    if($arr[$i].length -eq 0){
        $strlist += $str1
        $str1 = "";
    }
    $str1 += $arr[$i];
}
echo $strlist.Count

#読み上げる回数
$readCount = 10;

for($j=0; $j -lt $readCount; $j++){

$idx = Get-Random -Maximum ($strlist.Count-1) -Minimum 0
Start-Sleep -s 2

echo $strlist[($idx)];
$ps_speak.Speak($strlist[($idx)])


}
```
Excel for the webで右クリックからリンクをコピーが表示されない場合があった話

Microsoft 365 Excel for the web　で Sharepointなどで共同編集しているファイルなどで。

右クリックからリンクをコピーでエクセルのセルやテーブルや範囲をリンク（URL）として共有する事ができますが。
（URLを開くと、指定したセルやテーブルや範囲が協調された形で表示される）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/b6f97dec-a341-bda3-9597-dd32e35c73b5.png)

あるとき、このメニューが表示されな事があったのでメモ。

そもそもの指定範囲のリンクの取得については下記参照

[Share a section of a workbook](https://support.microsoft.com/en-au/office/share-a-section-of-a-workbook-dd5d3385-a8f7-4a25-9283-ff505ad8ddb4)

## シートビューの表示中はメニューが表示されない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/3d2f4675-398a-efe3-9631-3ecb5d7cac0e.png)

エクセルにはシートビューと呼ばれる便利機能がありますが、これを利用している時は右クリックにリンクをコピーのメニューがでてこなくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/e25893f0-4d1a-a0ba-1f4f-1dad7643bf07.png)

## 総評

気づいてみればビューで表示をカスタマイズしつつ、参照範囲を指定したリンクの生成ができないんだろうなと思いますが。

最初、右クリックにメニューがでなかった際はなかなか要因に気がつけなかったのでメモ。
【振り返り】データ分析家からエンジニアになってみて

# はじめに
この記事はこちらのイベントに関する内容になっています。
キャリアを振り返ろうというキャンペーンです。私事ですがちょうどキリの良さそうなタイミングでしたので参戦してみようと思います。

https://qiita.com/official-events/72b44470c9c08f6f080b

はじめに簡単な自己紹介をします！

## 経歴
- データ分析業務：3年程度
  - これまでの業務内容:
      - 自然言語処理と統計処理を用いた分析パッケージの企画/開発/運用など  
- エンジニア：3年程度
  - これまでの業務内容
      - システムの改修や開発など(顧客向け/社内向け)

# エンジニアになろうとしたきっかけ
- ①労働集約型の業務を改善したかった
主な業務内容が顧客に分析レポートを提供することだったので、人が不足していました。
分析基盤だけでもシステム化できれば多くの顧客に展開したり、作業の一部を自動化することが見込めます。

- ②顧客のニーズを素早く形にしたかった
データを元に顧客とディスカッションしていく中で要望をいただく場面が多々ありました。
早い段階でサンプルを作ることができればフィードバックも早く見込めます。
プロダクトが手探りなフェーズにおいては大事なことかと思います。

# エンジニアになってみて
当たり前ですが今のスキルを過去の自分が持っていたらもっと良い結果に結びつけたのではないかと思います。
現時点ではまだまだ未熟ですが、当時のレベルと比べたらまともに開発できているのではないかと思っています。
(オープンソースのモデルを自分の環境で使うことすら危ういレベル）
また、開発に関連した知識や経験(スクラムやモブプロ、テスト駆動など)が身に付いたことも大きい収穫だと思っています。

# これまでで苦労したこと
- 環境づくり
こちらの記事に簡単にまとめてありますが、開発環境づくりから苦戦していました。
調べても何言ってるか分からないので関連記事をまた調べて、その記事にかいてあることも分からないのでまた調べるみたいなことを繰り返していました。

https://qiita.com/does_not_exist/items/aba7befc44846e19bc7a

- モブで話せない
始めた頃はメンバー同士が話している内容を理解するのに精一杯でした。

https://qiita.com/does_not_exist/items/f85f5346ed927d4d5de0

他にも色々とありますが、同じチームの上司やメンバーにたくさんサポートいただいたおかげでここまでこれました。感謝しかないです。

# おわりに
エンジニアとして経験を積むことができて良かったと感じています。
珍しい経歴かもしれませんが似たような経歴の方やこれからエンジニアを目指そうと考えている方の参考になればと思います。全体を通じてカッコよくまとめていますが大したことはしていないです。いつも周りに支えられています！感謝を忘れずに！
新しいタブ自作してみた

新しいタブに機能が少なくて使いにくかったので作ってみた。
# 経緯
Chromeを開くと毎回開かれる「新しいタブ」があるが、「Google」と検索ボックスとショートカットといくつかのカードが有るだけで、自分の欲しい機能があまりなかったのでGoogleサイトを使って作ってみた。
また、同級生に使ってもらった。

# 手順
1. Googleサイトで作成する
1. 公開する
1. [New Tab Redirect](https://chrome.google.com/webstore/detail/icpgjfneehieebagbmdbhnlpiopdcmna) という拡張機能を使用して新しいタブに設定する

# やってみた
1. まずサイトの内容から決める。
今回は、検索ボックスと、下にスクロールしたときにいくつかのリンク、カレンダー、時計、名言、天気、メモ欄などが表示されるようにした。
1. 一度作成して友人に使ってもらったところ、今の新しいタブと違和感がありすぎて使いにくいという意見があった。
1. なので、開いた状態で表示される一番上の部分には今の新しいタブのような検索ボックスと小物アプリのみを表示し、下にスクロールしたら色々なものが表示されるようにした。
1. 完成
# やって思ったこと
- 結構簡単だった。
- 重いので使いにくい。
- 結局アドレスバーにURLやキーワードを打つことが多い。

# 結果
気に入って使っているが、あまり要らなかったかもしれない。
STM32CubeMXでコード生成時に*.cppと*.cを切り替える

　STM32CubeMXはコード生成時に`main.c`を生成する。`main.cpp`があっても`main.c`が作成される。その他のソースファイルについても同様。

　STM32CubeMXでは`Project Manager`タブの`Code Generator`から`User Actions`で`Before Code Generation`および`After Code Generation`を指定することで、コード生成の前と後に何らかのコマンドを実行することができる。ここでリネームを走らせれば、main.cppをmain.cとして処理できる。ただしちょっと癖が強く、狙い通りに動かすのに手間取ったため、方法をメモっておく。なお、使用したSTM32CubeMXはWindows環境のv6.10.0。

　結構変な設定になるので、万人向けというわけではない。

## 手順

### ショートカットを作成する

　リンク先を`%userprofile%\AppData\Local\Programs\STM32CubeMX\STM32CubeMX.exe hoge.ioc`として、STM32CubeMXを起動した上でプロジェクトファイルを読み込ませる(exeのパスは適宜変更)。
　作業フォルダを空欄にし、プロジェクトフォルダをカレントディレクトリとして使用するようにする。
　STM32CubeMXを起動するときは、必ずこのショートカットで起動する。

　必要に応じて：ショートカットを`.gitignore`に追加して、各環境で独自に用意してもらう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264452/69032ecc-f512-8633-97d8-29de850d973f.png)

### バッチファイルを作成する

```bat:beforeCodeGeneration.bat
@ren core\src\*.cpp *.c
```

```bat:afterCodeGeneration.bat
@ren core\src\*.c *.cpp
```

　renコマンドのワイルドカードで`core/src`の`*.cpp`を`*.c`に書き換えている。main.cppだけ使いたい場合はそれだけ指定すればいい。

### CubeMXでバッチファイルを指定する

　`Project Manager`→`Code Generator`→`User Actions`の`Before Code Generation`と`After Code Generation`に対して、`beforeCodeGeneration.bat`と`afterCodeGeneration.bat`を指定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264452/39ddd553-6c3a-9205-8c79-854564572016.png)

　以上の手順により、`GENERATE CODE`を実行すると、コード生成の前に`beforeCodeGeneration.bat`が実行され、コード生成の後に`afterCodeGeneration.bat`が実行される。バッチファイルの中でリネーム処理を行うため、`*.cpp`ファイルを一時的に`*.c`ファイルへ変更し、CubeMXで処理できるようになる。
　`hoge.ioc`をダブルクリックしてSTM32CubeMXを起動するとUser Actionの相対パス(カレントディレクトリ)が変わり、バッチファイルの起動ができない。GENERATE CODEを使うときはショートカットから起動するのを忘れないようにする。
　ショートカットを使わず(通常の手順で)STM32CubeMXを起動した場合、カレントディレクトリはCubeMXのインストール先となる。この場合でも、User Actionsのパスを絶対パスor相対パスで適切に指定してやればバッチファイルを起動することはできる(ショートカットを作る&使う手間と、絶対パス(or長い相対パス)のどちらを選ぶかのトレードオフ)。

　Toolchain / IDEにMakefileを指定している場合、MakefileのC_SOURCESに各々の`*.c`のパスが追加されるから、忘れずに削除する必要がある。また、リンカスクリプト(*.ld)も上書きされるため、これを変更している場合は元に戻す操作も必要になる。LDはそう書き換えるものでもないから、beforeでバックアップしafterで上書きするみたいな処理を追加すると良さそう。

## ハマった点

* STM32CubeMXのUser Actionsはパスをダブルクオーテーションで囲むと実行できない(パスの途中にスペースが入っていても囲む必要はない)
* STM32CubeMXのUser Actionsは起動オプションを指定することはできない
* renコマンドはディレクトリをたどるときにスラッシュは不可でバックスラッシュが必要
routesの`:id`の部分をid以外にしたい備忘録

`resources :furnitures`とした時に生成されるURLは↓こんな感じになると思います。
|  |  |
|:-:|:-:|
| furnitures#index  | GET /furnitures |
| furnitures#create  | POST   /furnitures  |
| furnitures#new  | GET    /furnitures/:id/edit  |
|furnitures#edit   | GET    /furnitures/:id  |
| furnitures#show  | GET  /furnitures/:id  |
|furnitures#update|PUT    /furnitures/:id|
|furnitures#destroy|DELETE /furnitures/:id|

 show画面だと`/furnitures/1`とかになると思うのですが、この数字(:id)を変えて、`/furnitures/sofa` `/furnitures/table`という感じにしたい。
 [公式ドキュメント](https://railsguides.jp/routing.html#%E5%90%8D%E5%89%8D%E4%BB%98%E3%81%8D%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%82%A4%E3%83%89%E3%81%99%E3%82%8B)

 ---

 resourcesに`param`オプションをつければ可能になる。
 ```rb
 # 例えばslugカラムがあったとしたら
 resources :furnitures, param: :slug
 ```
 コントローラーには普段`:id`を渡すところを`:slug`にすればOK
 ```rb
def show
    @furniture = Furniture.find_by(slug: params[:slug])
end
 ```

 URLはちゃんとそれっぽくなる
 |  |  |
|:-:|:-:|
| furnitures#index  | GET /furnitures |
| furnitures#new  | GET    /furnitures/:slug/edit  |
|furnitures#edit   | GET    /furnitures/:slug  |
| furnitures#show  | GET  /furnitures/:slug  |
|furnitures#update|PUT    /furnitures/:slug|
|furnitures#destroy|DELETE /furnitures/:slug|
【PowerAutomate】WordファイルからPDFファイルを作成する

今回はOneDrive上のWordファイルを取得し、PDFファイルに変換するフローを作成していきたいと思います。

## 事前準備

PDFファイルにしたいWordファイルをOneDrive(クラウド上)に配置しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/9800d042-7bef-6352-5983-e2d4d4b02e0e.png)

場所は自分が分かればOKです。

今回はPowerAutomateフォルダの中にWordファイルを配置し、PDFファイルを同フォルダ内へ出力する予定ですが、業務等で複数のファイルを処理する場合はさらにWordフォルダやPDFフォルダを作成して区別すると分かりやすいです。


## フローを作成する

それでは、準備ができたのでフローを作成していきます。

### step1

アクションの追加⊕を押してアクションを追加します。

検索窓で「Word」と入力し、Wordアクション群を表示させます。
なぜかかなり下の方にあるので頑張って探してください。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/bc28c7cb-4617-5e48-eeb5-4c3b873b1c47.png)

### step2

Wordアクション群の中から「Word文書をPDFに変換します」アクションを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/6b737a18-3260-08f8-c5bb-06f0ac823cc9.png)

### step3

Wordのサインインを求められるので、サインインを行ってください。

それぞれの項目を埋めていきます。
内容については以下を入力してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/afad8c6e-15f7-ab7d-68d1-87228c3ce218.png)

■ 場所：`OneDrive for Business`　←ドロップダウンから選択
■ ドキュメントライブラリ：`OneDrive`　←ドロップダウンから選択
■ ファイル：`/PowerAutomate/週報.docx`　←**ピッカー**から選択

**ピッカー**について
ピッカーでクラウド上に保存してあるファイルを選択することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/c8721a76-3a71-8ef4-7fd7-9fe94eb9d55f.png)

※ピッカーを利用すると置換等をした際に同名だった場合でもエラーが発生してしまいます。

*【回避方法↓】*

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/da58d162-0324-4142-05ed-98c331820c73.png)

見た目上は一緒ですが、ピッカーを利用しないで同様に記述することによってエラーを回避することができます。

"動的なコンテンツの追加"から、ファイル名に動的なコンテンツを利用することも可能です。

### step4

検索窓で「OneDrive」と入力し、OneDriveアクション群を表示させます。

次に、ファイルの作成を選択してください。

※今回の例ではOneDrive上にPDFファイルが作成されますが、「SharePoint」アクションを利用してSharePoint上にファイルを作成することも可能です。

それぞれの項目を埋めていきます。
内容については以下を入力してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/cc31a407-d1e6-350c-1ce8-96bd2210968f.png)

■ フォルダーのパス：`/PowerAutomate`　←ピッカーから選択(ファイルではなくフォルダを選んでください)
■ ファイル名：`週報.pdf`　←ドロップダウンから選択
■ ファイルコンテンツ：`PDFドキュメント`　←動的なコンテンツから選択

ファイル名の拡張子を**pdf**にするのを忘れないようにしてください。
ファイルコンテンツは、step3のアクションで作成したものを選択します。

## 実行してみる

それではフローを実行してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/177fe95b-7acb-afc0-af76-f23c5fffc8e3.png)

OneDriveを確認すると、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/c8a51bb7-6d77-cfcc-77b0-0c89b2a474eb.png)

PDFフォルダが作成されています◎！

## おわりに

読んでいただきありがとうございました！

お役に立てれば幸いです。
パスワードをハッシュ化するgem

gemとは、RubyやRailsでプログラミングをする際に「よく使う機能」をパッケージ化したもの。
「検索機能を作るgem」や「ハッシュ化するgem」など様々なgemが存在し、Railsにインストールすることで使用することができる。
今回はbcryptという「ハッシュ化するgem」を使います。

Railsにはインストールしたいgemを記述するGemfileというファイルが存在する。

「gem'gemの名前','gemのバージョン'」とすることで記述したバージョンのgemをインストールすることができる。

Gemfileにgem'bcrypt'を記述する。
ターミナルでbundle installコマンドを実行する。
記述したgemをインストールできる。

bcryptをインストールすると、has_secure_passwordメソッドが使用可能になる。
パスワードを扱うUserモデルにhas_secure_passwordを追加する。
class User < ApplicationRecord
 has_secure_password
 .
 .
 .
 end
ユーザーを保存する際に自動的にパスワードをハッシュ化される。
provideとinject

# 背景と目的

コンポーネントのネストが深い場合、propsとemitを使う方法だと冗長になるため、これまではデータストアを経由してデータのやり取りをすることが多かったが、データの内容が薄く、単純であることや、特定のコンポーネント構成でしか使用しないデータだったのでprovideとinjectを使った実装をすることにした。

# 実装内容
まずは親コンポーネント
```vue
<template>
<div>
  <ChildComponent />
</div>
</template>
<script setup>
// 子コンポーネントと共有したいデータ
const data = ref(
{
      status : false,
      steps:[],      
}
);

// provideして子孫が参照できるようにする
provide('parentData',data);
</script>
```
通常通りデータを定義し、それをprovideで名前をつけておくだけ。

続いて子コンポーネント
```vue
<template>
  <p>{{ parentData.status === true ? '公開' : '非公開'}}</p>
</template>
<script setup>
const parentData = inject('parentData');
</script>
```
injectで名前を指定して呼び出して使うだけ。
この例では親と子しか無いが、さらに孫、曾孫とコンポーネントのネストが深くなっても親子関係にある限りはinjectを使ってデータを参照することができる

# データストアとの違い
個人的にはデータストアの方がデータやそれに関する処理を分離できるので、特に理由がなければデータストアで十分だと思う。
provideとinjectを使う場合、injectを使うコンポーネントは必ずprovideしているコンポーネントの配下に入らないといけないため、コンポーネント間の結合度が高まるのもマイナスポイント。

そのため、下記のような基準で判断するといいと思う。

|  | ネスト | 親子関係 | データの複雑さ |
|:-:|:-:|:-:|:-:|
| props/emit  | 親と子だけ  |  親子関係が必要 |  簡単 |
| provide/inject  |  ３階層以上 | 親子関係が必要  | 簡単  |
| データストア  |  ネストの深さに関係ない | 親子関係が必要でない  | 複雑  |


# リンク
以前書いた記事で棲み分けについて話してます

https://qiita.com/sho_fcafe/items/a3b20860833f35612e09
image_tagを使って画像遅延読み込み

## image_tagとは？
画像ファイルのリンクを作成できる。

https://railsdoc.com/page/image_tag

# 画像遅延読み込みとは？
jsなどのライブラリを用いて画像を非同期読み込みすること。
遅延読み込み用のjsは検索すれば出てくると思うのでダウンロードしておいてください。
ここでは遅延読み込みについて詳しくは触れないので各自調べていただければと思います。
https://technical-seo.jp/lazy-load-javascript-library/

# 画像遅延読み込みをimage_tagを使って実装する
第一引数に画像ファイルへのパスを指定し、第二引数以降にオプションやHTML属性を指定できる。
第一引数に遅延読み込み用のファイルパスを指定し、第二引数のdate-srcで実際の読み込む画像のファイルパスを記載する。
```rb
<=% "遅延読み込み用の画像ファイルパス","date-src"=>"表示させたい画像のファイルパス",altなど... %>
```
第二引数にはハッシュの形でファイルパスを渡してあげてください。
【PHP8.2】PHP8.2でジェネリクスが導入された

[PHP 8.2 新機能の概要とコード例](https://www.fushigiame.jp/article/9)

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/e3f09638-36a7-344d-28f1-c2fb980e48a3.png)

:::note
4\. ジェネリクス
PHP 8.2 では、ジェネリクスのサポートが導入されました。
ジェネリクスを使用すると、コードの再利用性が向上し、型安全性も確保されます。

```php
interface Collection<T> {
    public function add(T $item): void;
    public function get(int $index): T;
}

class StringCollection implements Collection<string> {
    // ...
}

$stringCollection = new StringCollection();
$stringCollection->add("Hello");
$stringCollection->add(123); // エラー：string 型が期待されています
```
:::

初耳なんだけど。


もちろん実際には[PHP8.2](https://www.php.net/manual/ja/migration82.php)でジェネリクスは導入されておらず、それどころか現行最新のPHP8.3でもこのコードはシンタックスエラーになります。

いったいなんなんだこのゴミ、と思ったら[本当にただのゴミでした](https://www.fushigiame.jp/)。

:::note
ChatGPTを活用した試み

ChatGPT API（gpt-3.5-turbo）を活用し、特定のテーマに基づく文章生成実験を行っています。

これは、今後のAIを活用した創作や情報収集の可能性を探るための試みです。
:::

この注釈、詳細ページには一切記述されていないため、詳細ページだけではAI生成によるものだと判断することができません。
遡ってよく調べないかぎり気付きようがありませんし、そんなもの調べる暇人はそうそういませんから、結果としてこの記事は完全に間違い以外の何物でもありません。


当然ながら他のページも間違いだらけです。
たとえば[JavascriptのES2022を活用しよう！実践的なコードで紹介](https://www.fushigiame.jp/article/10)の記事では、ES2022で`Array.prototype.at()`・`Object.fromEntries()`・クラスフィールドが導入されたみたいに書かれているのですが、`Object.fromEntries()`はES2019です。
また[PHP 8.2 Enums（列挙型）について](https://www.fushigiame.jp/article/11)ではバックトリック演算子とかいう謎の演算子が爆誕しています。
いったいどこから生まれてきたんだその単語。

このサイト、何のためにこんなデタラメを垂れ流してるんですかね。
こんな品質の記事が並んでいるようでは、本業の『デジタルサイネージプレイヤー開発事業』『Webサイト・サイネージコンテンツ制作』『スマホアプリ開発』とやらの質もたかが知れるってかんじですよね。
はっきりいって逆効果なのでは。

それともあれか、AIの危険性を知らしめるために自らを犠牲に公開しているのだろうか。


ちなみに[もっと](https://www.fushigiame.jp/ai/article/21)[アレな](https://www.fushigiame.jp/ai/article/84)[かんじの](https://www.fushigiame.jp/ai/article/207)[ページ](https://www.fushigiame.jp/ai/article/120)もたくさんあったりするのですが、そちらにはきちんとAI生成によるものだと注釈が書かれているんですよね。
技術記事にも同じ注釈を書いておけば、わざわざここで論うこともなかったのにどうして。
【AWS】 スイッチロールやってみた

# 1. 初めに
はじめまして、株式会社TechoesのインフラチームのAです！
2023年4月に入社して約10ヶ月の初心者クラウドエンジニアです。
今年から始まったTechoesの採用強化と学習内容のアウトプットを目的としてQiitaで技術ブログを書くことになりました。
もしよろしければ私の同期が書いた[前回の記事](https://qiita.com/y-tomaru-techoes/items/aac4814ae842b8f9f8cc)も見ていただけるとモチベーションになります笑

# 2. そもそもスイッチロールとは
簡単に言うと異なるAWSアカウントやIAMユーザ間をロールを渡すことでアクセス権限の切り替えができるAWS IAMの機能です。

# 3. 達成したいこと
AWSアカウントAからAWSアカウントBにロール切り替えをできるようにする。

# 4. 手順
AWSアカウントBにログインし、コンソールからIAMを開きます。
ロールからロール作成をクリックする。![iam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554208/d709150e-df39-846b-b797-824dc1f7b1d5.png)


信頼されたエンティティタイプをAWSアカウントにし、別のAWSアカウントを選択して、入力したら次へをクリックします。
![iam_role01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554208/670f6e1a-36cf-64d8-31f7-d7c90b888395.png)

ここでは許可するサービスや範囲を選択できるので今回はAmazonEC2FullAccessを選択します。
選択したら次へをクリックします。
![iam_role02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554208/4fde1d19-6773-0281-60d8-44a3206c6c46.png)

最後にロール名を入力してロールを作成をクリックしたら、AWSアカウントBでの作業は終了です。
![iam_role03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554208/8567ef4b-2e1e-398b-4f65-f8a01c7b538a.png)

AWSアカウントAでログインし、右上のユーザ名をクリックしてロールを切り替えをクリックします。
![iam_role04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554208/197617d5-11b3-7011-557e-d1b3c5c5d7bc.png)

続けてロールの切り替えをクリックします。
![iam_role05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554208/b5041fcb-a6cf-a02c-cd1f-499f455acef7.png)

AWSアカウントBのアカウントIDと先ほど作成したロール名を入力してロールの切り替えをクリックします。
![iam_role06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554208/f532c9bb-ce37-bacc-9440-d868ee6a80a0.png)

これで右上の表示名が設定したロール名になりスイッチロールできているのを確認できると思います。
![iam_role07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554208/b7779f02-864a-ffcb-a895-774898e9fbc1.png)

コンソールから色んなサービスにアクセスして確認してみます。
EC2
![iam_role08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554208/34c9fd60-9dd1-8c3f-26aa-479a896198b3.png)

IAM
![iam_role09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554208/ac577c46-a458-3a53-710b-3aea19a0e085.png)

ECS
![iam_role10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554208/816a181f-49ba-8b53-a9e9-ea2b8e633c61.png)

今回はEC2のフルアクセス権限しか付与していないのでIAM等はアクセス拒否になっていますので正常にアクセス制御できていますね。

最後に元のアカウントに戻りたい場合は右上のユーザ名からスイッチバックをクリックすると元のアカウントに戻れます。
そして再度スイッチロールしたい場合はロール履歴に記録が残っているのでそこからクリックすると簡単に出来ます
![iam_role11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554208/a1853982-f494-02c0-30f1-5ae7d80b96cb.png)

# 5. 最後に
今回初めて技術ブログなるものを書いたので拙い部分が多く読みづらくなってしまったかと思います。。
精進していきたいので記事に対して気になる点がありましたらコメント等頂けると嬉しいです！
以上、株式会社TechoesのAでした～！
Copilot Studio で Google Drive 上のファイルを回答ソースにしたボットが作成できるか検証してみた

こんにちは、向井です。
Copilot Studio で Google Drive 上にあるファイルを回答ソースにしたチャットボットが作成できるか検証してみましたので、検証結果をこちらにメモします。


今回検証した実装方法はざっくり以下のような流れです。
・Power Automate を使用してGoogle Drive 上のファイル情報を取得し、
・AI Builder のOCRでファイルコンテンツをテキスト化し、
・Copilot Studio のカスタムデータソースとして使用する


:::note warn
あくまで検証結果の共有ですので、ご了承ください！
:::

# 結論
先に結論を書いておくと、今回なんとか、Google Drive 上のファイルを参照して生成AIに回答を作成させることはできましたが、現時点では実運用をするためにはかなり工夫が必要そうだという印象でした。

正直、Google Drive にあるファイルをSharePoint にコピーできるならそれが一番楽だと思います。

今回はPower Platformの範囲内で検証しましたが、Azureと連携すればもう少しうまくいくかもしれません。

# 検証内容
## トピックの構成
Conversational boosting のトピックを編集して以下のようなトピックを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/d91fb43f-58bb-bec0-3cc8-fd12096f1046.png)

### フローの呼び出し
「生成型の回答を作成する」の前にPower Automate のフローを呼び出すアクションを追加しています。
このフローからは、ファイルコンテンツ、ファイルパス、ファイル名を取得しています。(いずれも文字列）
※フローの中身は後述します。


それぞれの出力はグローバルに設定しておきます。
こうすることで、後続のアクションの計算式内で変数を呼び出せるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/e3350898-2750-e7cf-8f70-98c6fb8d41eb.png)


### 回答の作成
「生成型の回答を作成する」ではカスタムデータソースを指定できます。
以下のdocsを参考に、フローから取得したファイルコンテンツ、ファイルパス、ファイル名をテーブル型式にして設定しています。
[生成型の回答にカスタム データ ソースを使用する](https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/nlu-generative-answers-custom-data)

計算式から設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/2a65fd82-fe1a-2cb8-a4c3-c06c5a219c75.png)


グローバル変数を使用して以下のように書きました。
```
[{Content: Global.content,
  ContentLocation: Global.path,
  Title: Global.Title}]
  ```

テーブルの列は、ソースとなる文字列、ファイルの場所、ファイルの名前の3つです。
テーブルの行が、それぞれのファイルになるイメージなので、たくさんファイルがある場合は結構大変そうです。。
今回はテストなので、ファイルは一つだけです。


## 使用したフロー
フローの構成はざっくりと、Google Drive 上のファイルを取得して、AI Builder でファイルのテキスト認識（OCR）をして、必要な情報をCopilot Studio に返すという感じになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/ca1aaf6a-a07b-c244-44d2-da3bc020c5e5.png)

テストなので、ファイルはパスで直接指定しましたが、何らかの方法で、ボット側でファイルのパスかIDを取得してフロー側に渡すような構成にすると少し実用的になりそうです。
今回はPDFを指定しています。

AI Builder 以降のアクションは以下のDocsを参考に作成しました。
[Power Automate でテキスト認識の事前構築済みモデルを使用する](https://learn.microsoft.com/ja-jp/ai-builder/flow-text-recognition)

Copilot Studio には以下を返しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/2f133189-efc7-ba16-c912-b47ec09db4f4.png)

# 動作確認
Google Drive には以下のPDFを置いています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/4a109826-c598-9224-e8ae-8ad3ea22671d.png)

Copilot Studio でテストをするとそれらしき回答が得られました。
回答にかかった時間は1分弱でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/fe4a5eb3-52f7-c22d-c663-d76512157496.png)

フローの実行にかかった時間は、32秒でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/43e419a2-2f99-1fec-3f99-a194ae16a9eb.png)

:::note warn
今回は短いドキュメントだったので、比較的早く回答が得られましたが、長いドキュメントだと、フロー側の処理が終わる前にCopilot Studio がタイムアウトしてしまったり、ソースの文字数が多すぎてエラーになったりする懸念があります。
:::

# 考察
カスタムデータをソースにする場合のポイント
・テーブル型で指定する
・回答のソースとする部分はテキスト形式にしておく必要がある

回答の作成にフローを使用するポイント
・フローの実行時間が長くなりすぎないように工夫する
・Copilot Studio に返す値が長くなりすぎないように工夫する（特にコンテンツ部分）
【CSS】下線の新しいプロパティ（text-underline-offset）


# はじめに
案件で「text-underline-offset」なるものを知ったのでメモ。
今まで下線との距離はpadding-bottomで指定してたけどtext-underline-offsetが便利そう！

# text-underline-offset
text-underline-offsetは下線とテキストの距離を指定するCSSプロパティ

```
text-underline-offset
```
https://developer.mozilla.org/ja/docs/Web/CSS/text-underline-offset


# 対応ブラウザも問題なし！

https://caniuse.com/?search=text-underline-offset

![スクリーンショット 2024-02-26 20.10.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587166/b551b10a-96aa-f856-e7a9-fa16bf1501ba.png)

これは便利！今度から使お！
Webサービス利用に必要なネットワーク帯域幅の見積もり方

## はじめに
お客様オンプレミス環境やSaaSとしてWebサービスを提供する際に、どの程度のネットワーク帯域が必要なのかを聞かれる事があると思います。

以下のような観点で、それぞれのネットワーク帯域幅を見積もる方法をまとめてみたいと思います。
 - Webサービスを○○名いる拠点から利用する場合に必要なネットワーク帯域幅
 - オンプレミス環境からクラウドに移行する場合など、データ移行(移送)に必要なネットワーク帯域幅
 - システム間データ連携に必要なネットワーク帯域幅

## 見積もりに必要な情報
Webサービス利用における、ネットワーク帯域幅の見積もりに必要な情報は、以下になります。
 - お客様拠点のユーザー数
 - 同時アクセス率
 - 1リクエストあたりの平均転送量

上記情報から平均転送量を算出し、帯域幅毎に、平均転送量のデータを送信するのにかかる時間を算出し、必要となるネットワーク帯域幅を見積もります。

スクリプトで同時アクセス率(秒間最大同時リクエスト数÷お客様拠点のユーザー数)、1リクエストあたりの平均転送量を調べる方法は、以下の記事も参考にしてください。

https://qiita.com/tbtakhk/items/63e022861aa969ea3e69

## 平均転送量の計算
平均転送量は、以下の式で計算する事ができます。
````
[平均転送量] = [ある拠点の利用ユーザー数]×[同時アクセス率]×[1リクエストあたりの平均転送量]
````
#### Webサービス利用の場合
同時アクセス率は、社内の本番環境や、お客様の本番環境のWebサーバーのアクセスログを解析して、秒間同時最大リクエスト数を出した後、利用ユーザー数で割って算出できます。
- ある拠点の利用ユーザー数：2000名
- 同時アクセス率：1%
- 1リクエストあたりの平均転送量：20KB

上記の場合の平均転送量は、`2000×0.01×20(KB)÷1000=0.4(MB)=3.2Mbit`になります。

#### データ移行の場合
平均転送量は、移行するデータのサイズとなります(直列にデータを移行する場合)。

移行するデータサイズが100GBの場合、平均転送量は、`100000(MB)=800000Mbit`になります。

#### システム間データ連携の場合
平均転送量は、最もデータ転送量が大きい時間帯の転送量の合計になります。

2つのジョブで、合わせて20MBのデータが連携されている場合、平均転送量は、`20(MB)=160Mbit`になります。

## ネットワーク帯域の見積もり
平均転送量が求められたら、帯域幅により、平均転送量のデータを転送するのに、どの位の時間がかかるかを算出します。
また、算出にあたり、ネットワークの実効速度が帯域幅の50%であるとします。

帯域幅毎の転送時間は、以下の式で求められます。
```
[帯域幅毎の転送時間(秒)] = [平均転送量]÷[帯域幅]÷[実効速度(0.5)]
```
先程算出した、Webサービス利用の場合、データ移行の場合、システム間データ連携の場合の平均転送量について、帯域幅毎の転送時間を算出すると、以下のようになります。

【平均転送量】
Webサービス利用：3.2Mbit、データ移行：800000Mbit、システム間データ連携：160Mbit
| 帯域幅(Mbps) | Webサービス利用(秒) | データ移行(秒) | データ移行(時分秒) | システム間データ連携(秒) |
|-:|-:|-:|-:|-:|
| 10 | 0.640 | 160,000 | 44:26:40 | 32.00 |
| 20 | 0.320 | 80,000 | 22:13:20 | 16.00 |
| 30 | 0.213 | 53,333 | 14:48:53 | 10.67 |
| 50 | 0.128 | 32,000 | 8:53:20 | 6.40 |
| 100 | 0.064 | 16,000 | 4:26:40 | 3.20 |
| 200 | 0.032 | 8,000 | 2:13:20 | 1.60 |
| 500 | 0.013 | 3,200 | 0:53:20 | 0.64 |
| 1000 | 0.006 | 1,600 | 0:26:40 | 0.32 |

この例では、Webサービス利用においては、帯域幅を100Mbpsとすると、転送時間が0.064秒となり、十分な帯域幅であると判断ができます。

:::note info
私見ではありますが、Webサービス利用では、平均転送量のデータを転送する時間が、0.1秒未満になるのがよいと考えます。
転送時間が0.5秒を超えると、利用者の体感的に遅く感じる可能性が上がるのではないかと思われます。
:::

データ移行においては、データ移行中はシステムを停止しておかなければならない事が多いため、システム停止可能な時間に収まるかどうかで判断します。
この例では、最低100Mbps程度の帯域幅が必要であると考えられます。

システム間データ連携においては、ジョブの実効頻度や、1つのジョブがどの位の時間で終わる必要があるのか、またネットワークをデータを転送する以外の処理(データフォーマットの変換処理など)にかかる時間もあるため、その点を加味して、必要な帯域幅を検討します。

:::note info
実際には、あるネットワークを1つのシステムのみで利用する事はなく、複数のシステムやインターネットサイトへのアクセスなどで共用されるため、適時安全率を掛けるなどして見積もるようにしてください。
:::

## ネットワーク帯域幅見積もりのテンプレ化
ネットワーク帯域の見積もりにおいては、変数が決まっているので、スプレッドシートに計算式を埋め込んでおき、利用ユーザー数や同時アクセス率、1リクエストあたりの平均転送量などをインプット情報とする事で、すぐに見積もりをできるようになると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2554521/7ce47529-c357-1583-e8bf-b1ac58e050d8.png)

新規のお客様など、どの位の同時アクセス率になるか、1リクエストあたりの平均転送量がどの位になるのかが不明な場合は、既存のお客様本番環境で、一番大きい値となった環境の値を利用するなどして、参考見積する事も可能かと思います。


## おわりに
お客様オンプレミス環境やSaaSとしてWebサービスを提供する際に、どの程度のネットワーク帯域が必要かを見積もる方法について、まとめてみました。
猛牛さんにNetBSDを焼いてみた

開発中はネットブートしていましたが、ある程度使えるようになったので、Flashに焼いてみることにしました。

CFEでflashを確認してみます。

```
CFE> show devices
Device Name          Description
-------------------  ---------------------------------------------------------
uart0                NS16550 UART at 0x18000300
uart1                NS16550 UART at 0x18000400
flash0               ST Compatible Serial flash size 1024KB
flash0.boot          ST Compatible Serial flash offset 00000000 size 256KB
flash0.trx           ST Compatible Serial flash offset 00040000 size 1KB
flash0.os            ST Compatible Serial flash offset 0004001C size 704KB
flash0.nvram         ST Compatible Serial flash offset 000F0000 size 64KB
flash1.boot          ST Compatible Serial flash offset 00000000 size 256KB
flash1.trx           ST Compatible Serial flash offset 00040000 size 704KB
flash1.nvram         ST Compatible Serial flash offset 000F0000 size 64KB
nflash0.trx          Unknown type 146 NAND flash offset 00000000 size 1KB
nflash0.os           Unknown type 146 NAND flash offset 0000001C size 131072KB
nflash1.trx          Unknown type 146 NAND flash offset 00000000 size 121856KB
nflash1.brcmnand     Unknown type 146 NAND flash offset 07700000 size 9216KB
eth0                 Broadcom BCM47XX 10/100/1000 Mbps Ethernet Controller
*** command status = 0
```

どうもこのデバイスはブート用の1MのSPI FlashとOS用の128MのNAMD FLashを搭載しているようでうす。

tftpサーバにtrxイメージを置いて以下のようにして焼きます。

```
CFE> flash -noheader 192.168.11.3:netbsd-WZR-1750DHP.trx nflash1.trx
Reading 192.168.11.3:netbsd-WZR-1750DHP.trx: Done. 1769472 bytes read
Programming...done. 1769472 bytes written
*** command status = 0
```

CFEで使えるEthernetのポートはLAN側です。

trxはZRouterのtoolsを使って作りました。

```
KERN="WZR-1750DHP"
../ZRouter/tools/oldlzma/oldlzma e sys/arch/evbarm/compile/obj/${KERN}/netbsd.bin -d16 /tmp/netbsd.lza
../ZRouter/tools/asustrx/asustrx -o /tftpboot/netbsd-${KERN}.trx　/tmp/netbsd.lza
```

-d16を指定しないと実機で展開できないようです。

```
00000000  48 44 52 30 00 00 6c 00  b2 5a 84 63 00 00 01 00  |HDR0..l..Z.c....|
00000010  1c 00 00 00 00 00 40 00  00 00 00 00 5d 00 00 01  |......@.....]...|
00000020  00 d0 e3 15 00 00 00 00  00 00 00 62 80 39 5a 33  |...........b.9Z3|
00000030  fb da 0c e2 78 02 5c 87  48 81 e3 7c be ff fd 84  |....x.\.H..|....|
00000040  97 47 f1 b8 1b 5f 8a 8c  2b db 50 77 44 22 ef f5  |.G..._..+.PwD"..|
```

これはOpenWRTで配布しているtrxファイルのヘッダーです。1bまでがtrxのヘッダーで1cからlzmaのヘッダーです。デフォルトのlzmaのヘッダーは5d,00,00,80なのですが80が01となっています。OpenWRTのMakefileを確認して-d16をつけているのを見つけました。-d16を付けると01になりました。

FreeBSDに入っているlzmaだとダメで古いものを使う必要があります。rayに話したら、oldlzmaはCFEのために入れてるって事でした。

c2kの時はcfiだったので、BareBoxでバックアップのイメージをダンプして解析しましたが、今回はNANDでオリジナルを確認する事ができないのでOpenWRTのイメージを確認して解析しました。

u-bootではイメージの展開アドレスを指定できますが、CFEは固定のようです。このターゲットでは0x00008000でした。

```
check_trx: start nflash1.trx
check_trx: exit nflash1.trx
Loader:raw Filesys:raw Dev:nflash0.os File: Options:(null)
Loading: .. 4818900 bytes read
Entry at 0x00008000
Closing network.
Starting program at 0x00008000
```

これでスタンドアローンでNetBSDが起動できました。

操作のターミナルはWindowsのRLoginを使っていて、書き込みでタイポするといけないので、スクリプトにして実行しています。

CFEのIPアドレスの変更は以下のようにして出来ます。

```
CFE> nvram set lan_ipaddr=10.0.1.98
*** command status = 0
CFE> nvram commit 
*** command status = 0
CFE> 
```
Backlogのショートカットキー

# はじめに
プロジェクトやタスクを管理するのにとても便利なBacklogですが、
弊社内でも課題管理や議事管理にBacklogを利用しております。
本記事ではBacklogを利用していてとても便利だった課題画面で使用できるショートカットキーに注目しています。
今後Backlogを利用する方の作業効率が少しでも上がること、自身の備忘を目的として記載します。


# Backlogとは
Backlogとはシンプルな操作性と親しみやすい見た目で、誰でも直観的に使えるプロジェクト管理・タスクツールです。
プロジェクト全体の進行状況や誰がどのタスクを進めているのかを確認することができ、タスク漏れを防いで業務が円滑に進む手助けをすることができます。（Backlog公式より引用）

https://backlog.com/ja/?argument=ejrlGK31&said=4&ca=19698264663&gr=148703028680&cr=689530570971&kw=backlog&nw=g&mt=b&mid=gg&device=c&pl=&tg=kwd-317079327558&gad_source=1&gclid=CjwKCAiA29auBhBxEiwAnKcSqpy-Rbgg3h1IaaBUGN53uJzwVAz1Ur9P8RzGsuzkMULIQQ-r4i-UGhoCAOcQAvD_BwE

# Backlogのショートカットキー
Backlogにはマウスを使用せずに、画面移動などができるショートカット機能があります。
ショートカットキーを使用することで、すばやく目的のページに移動することができ、作業の効率化に繋げることができます。
今回はBacklogのショートカットについて、2つの内容について紹介します。
　1. ショートカットキーの使用、未使用の設定
　2. 画面移動する為のショートカットキー
<br>

**1. ショートカットキーの使用、未使用の設定**
Backlogでショートカットキーを使用する為には、設定からショートカットキーの使用を許可する必要があります。

<br>

①画面右上にあるユーザアイコンから【個人設定】を押下し、ユーザ情報ページに移動します。
![Backlogホーム画面２.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3444742/60872f8c-ba10-b9dc-bdaa-d856ef0e96b0.png)



②下へスクロールするとショートカットキーの設定欄がありますので、【ショートカットキーを使用する】にチェックを入れます。

![Backlogユーザー情報画面２.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3444742/e167a23a-8a72-9e24-8fb4-2203499d4cf8.png)


③最後に【保存】をすることで、ショートカットキーが使用できるようになります。
<br>

**2. 各画面ごとに使用できるショートカットキー**
Backlogでは各画面ごとに利用できるショートカットキーが異なります。
今回は全画面共通で使用できるショートカットキーと課題画面で使用できるショートカットキーについて紹介します。
<br>

＜全画面共通のショートカットキー＞
Backlogのどの画面でも使用できるショートカットキーです。
以下のショートカットキーを押下することで、画面移動することができます。

![Backlogホーム画面３.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3444742/54e8209b-b3cd-b7cd-f8cf-caa21fe4fe16.png)


|NO.| ショートカットキー | 内容         |
|:-:|:-----------------:|:------------:|
| 1 | `D`               | ダッシュボード|
| 2 | `H`               | ホーム        |
| 3 | `A`               | 課題の追加    |
| 4 | `F`               | 課題         |
| 5 | `R`               | ボード       |
| 6 | `G`               | ガントチャート|
| 7 | `W`               | Wiki         |
| 8 | `S`               | ファイル     |
| 9 | `/`               | 　全体からキーワード検索　|

＜課題検索画面のショートカットキー＞
Backlogの課題検索画面で使用できるショートカットキーです。
以下のショートカットキーを押下することで、画面移動や課題の選択をすることができます。

![Backlog課題検索画面２.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3444742/aa525ed3-fc6b-529c-1f4b-ee238f28862a.png)


|NO.| ショートカットキー | 内容         |
|:-:|:-----------------:|:------------:|
| 1 | `B`               | 検索結果の前のページへ移動|
| 2 | `N`               | 検索結果の次のページへ移動|
| 3 | `K`               | 　一覧表示されている前の課題へ移動　|
| 4 | `J`               | 　一覧表示されている次の課題へ移動　|
| 5 | `O`               | 選択している課題の詳細へ移動|


＜課題詳細画面のショートカットキー＞
Backlogの課題詳細画面で使用できるショートカットキーです。
以下のショートカットキーを押下することで、コメント入力欄の表示や画面移動することができます。

![Backlog課題詳細画面２.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3444742/7bb5066b-a28b-f13d-151e-8c11793829e0.png)



|NO.| ショートカットキー | 内容         |
|:-:|:-----------------:|:------------:|
| 1 | `C`               | コメント入力欄表示|
| 2 | `B`               | 検索結果へ移動|
| 3 | `K`               | 前の課題へ移動|
| 4 | `J`               | 次の課題へ移動|
Vite + React + Typescript 環境構築おためし

# 概要

[vite](https://ja.vitejs.dev/)はwebpackの欠点を解消するように作られたビルドツール。
最近巷でよく聞くので、本家のサイトを参考にしてビルドをやってみようと思う。


# 参考

https://ja.vitejs.dev/guide/#%E6%9C%80%E5%88%9D%E3%81%AE-vite-%E3%83%95%E3%82%9A%E3%83%AD%E3%82%B7%E3%82%99%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B

# 環境
今の環境はこんなかんじ。

- OS
    - MX 21.3 Wildflower (64bit)
- CPU
    - Intel(R) Core(TM) i3-2350M CPU @ 2.30GHz
- RAM
    - 4G
- nvm
    - version 0.35.0
- node
    - version 20.11.1

やけにスペックが低いのは古くなった大学生協PCにOS入れなおして使ってるから…
nvmはnodeのバージョン管理では必須級なのでいれてる。viteを使うときのnodeのバージョンはなんでもいいわけではないそうなので、構築するとき逐一公式サイトは確認しておいたほうがいいかもしれない。
今回は上のバージョンでは問題なかった。

# プロジェクトの作成

ひとまずnpmでやってみよう。
eslintみたいに選択肢が表示されるので、それに従って入力するようだ。

```bash
$ npm create vite@latest
✔ Project name: … sample-vite-project
✔ Select a framework: › React
✔ Select a variant: › TypeScript + SWC

Scaffolding project in /home/yoshi623/ws/sample-vite-project...

Done. Now run:

  cd sample-vite-project
  npm install
  npm run dev
```

一番使い慣れてる、React+Typescriptでやってみた。
SWCというのはRust製のツールだそうで。全然知らないけど、ビルドが速くなりそうなので入れてみた。

上で選択肢を選んでいったけど、下記のように短縮することもできるらしい。
なぜか```--templete```の前に```--```が要るようだ。

```bash
$ npm create vite@latest sample-vite-project -- --templete react-swc-ts
```

# ビルド実行

```
cd sample-vite-project
npm install
npm run dev
```

npm installはさすがに時間がかかるっぽいけど、run devはめっちゃ早い気がする。
npm startでサーバが起動するのに数秒ぐらいかかっていたと思うけど、viteはすぐに起動したようだ。
ローカルにサーバが立ったので確認しにいくとこうなった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2262024/2dd3c3f3-bcef-2d1d-ffd5-897b30475450.png)

おしまい。
改めて…Javaとは【何ができる？】【メリットは？】

## :ledger:Javaでできること

JavaはOSに依存しません。
そのためどんな環境でもソフトを動かせる汎用的な言語です。

例として…

・Webサービス開発
・Webアプリ開発
・PC向けアプリ開発
・Androidアプリ開発
・基幹システム開発
・組み込みシステム開発
・ソフトウェア開発
・IoT開発


幅広い場面で使われていて世界的に見ても需要の高い言語だと思います。

## :ledger:Javaでできないこと

・IOSアプリ開発
・機械学習　
（※できないというよりもPythonなどの特化した言語があるので選ばれないイメージ）

などです。

## :ledger:Javaのメリット

<b>１：プラットフォームへ依存しない</b>
OSに関わらず動かせます。

<b>２：オブジェクト指向</b>
開発効率が良く、カプセル化などを用いてセキュリティー面のコントロールができる。

<b>３：情報が多い</b>
世界規模で需要が高く使っているのエンジニアが多い。そのため情報が多く勉強しやすい。

## :ledger:Javaのデメリット

<b>１：学習難易度高め</b>
コード量や規則も多く初心者から始めるには難易度が高く感じます。
自走できるようになるまでに500時間はかかりそうです。

<b>２：メモリ消費量が大きい</b>
Javaで開発したシステムは、必ずJVMを組み込む必要があり
JVMが動作するためのメモリが必要です。
ガベージコレクションが動作するためにも、追加でメモリが必要となります

***
 <b><<補足>></b>
`JVM(Java Virtual Machine)`…Javaのプログラムを動かすために必要なソフトウェアです。

`ガベージコレクション`…実行中のプログラムが占有していたメモリ領域のうち
不要になったものを自動的に解放し、空き領域として再利用できるようにするものです。


***
## まとめ

Javaは多くのメリットがある言語です。
また大規模開発に向いているて初心者でも比較的求人が多いと思います。

私自身これからたくさん開発をしてJavaをマスターしていきたいです。
24時間でAWS SAAを取得した話

AWS Certified Solutions Architect - Associate (SAA-C03) を 24時間でつめこんで
752点で合格（1000点満点、720点が合格点）したときの体験談です

推奨されるべきではないんでしょうが、不可能ではないという事例としてあげておきます


# 結論
- 24時間で AWS SAA の取得は可能ではある
- でももちろんやめたほうが良い

# なぜ24時間で SAA 取得という羽目になったか

AWSの資格を取得すると会社から報奨金が貰える制度があり、
かつ当時ちょうど期間限定で受験料半額のバウチャーが配られていました

自分は基本金の亡者なので
「必ずバウチャーが使える間に取得する」と決めていたのですが、
同時にそれを上回る怠け者なので
ぎりぎりまで後回しにし続けてしまったためこのような羽目になりました


# 24時間前の状態
- AWS をほぼ触ったことがない
- 基本情報技術者程度のコンピューターサイエンスの知識
- SAA の参考書を眺めて、「何というサービスが試験に出て、それは何をするものか」がざっくり頭にある

# 24時間でやったこと

## 24時間の内訳
3連休の3日目に受験しました
- 前2日：10 時間
- 3日目：4 時間

で合計24時間です

## 勉強したこと
ひたすら[ping-t](https://mondai.ping-t.com/g)というサイトのSAA-C03の問題集を解きました

### おすすめな点
- 完全無料！
- 解説が充実 + とてもわかりやすい
    - その問題の解説に加えてそのサービスそのものの説明もあるので一連で覚えやすい
    - 説明を覚えていれば次の問題で正解できるので、成功体験が積めてモチベーションが維持しやすい
- サービスごとの易しめな問題 と 試験レベルの複合問題がある
    - いきなり試験レベルの問題だと全然解けなくて心が折れる
    - 得意なサービス・苦手なサービスがわかるので対策が立てやすい（データベースとかストレージがとても駄目でした）
- 1サイクルに出題される問題数を選べる + 1問ごとに答え+解説が出る
    - 本番と同じく65問が一気に出題 -> 最後にまとめて答え合わせだと集中力が持たないのでこれはとてもありがたい

### やったこと
1. まずサービスごとの問題を解く -> 解説を読んで頭に叩きこむ
2. 試験レベルの問題を解けるだけ解く


たしか 20時間（試験前の2日）は 1 の方ばっかりやっていて、
試験当日になって 2 の方の問題を頭につめこんでいた記憶があります


# 試験中-結果が出るまで
- みんな「65問一通り解くのは1時間くらいで終わる」と言っていたが、自分は100分くらいかかった
- 見直すと「絶対これ違うじゃん」「なんでこれにしたんだ自分は？」という問題が結構あった
- 意味がつかめない問題で、英語の問題文を見たら理解できたという事例があったのでぜひやるべき
- 絶対落ちたと思ったので試験後は不貞腐れて寝ました
- なんで合格したのかいまだにわかってないです。多分運がよかった


# 取得してみての感想

## よかったこと
- 報奨金をもらえた！！
- 勉強する良い機会になった（報奨金とバウチャーがなければきっと一生やりませんでした）
- 「見たことある」「なんとなくわかる」の知識が増えたので、業務や別試験の勉強がしやすくなった

## 悪かったこと
- 細かいこと（数値や制約系）はすべてすっぽぬけた
- サービス名と機能がごちゃ混ぜになる（GuardDuty と Shield の機能が頭の中で逆になっていたりなど）
- 詰め込めば何とかなるという悪い自信がついてしまった
    - SOA と DVA もつめ込みで受験しました

# まとめ
- AWS の資格は実際に問題を解かないと全然解けない（参考書だけじゃだめ）
- 見直しは絶対にした方がよい！
- 人間つめ込もうと思えばなんとかなるときもある
- でも火事場の馬鹿力に期待せず、コツコツ計画的に勉強しましょう
四捨五入をしたいときはROUND関数を使うべきではない

## ROUND関数は四捨五入ではない

#### 結論：
mysqlで四捨五入したいときはTRUNCATE関数を使用する。


#### 発生した事象：
四捨五入をしたいと思い、round(1.05, 1)を行なった所、結果が1.0になってしまった。

#### 解決策：
TRUNCATE(1.05+0.5, 1)としたところ、結果が1.1となり想定通りの四捨五入となった。
1.05に0.5を足すと。1.1になり「1」を指定しているため、小数点第二位が切り落とされ、そのまま1.1になる。

仮に、TRUNCATE(1.04+0.5, 1)とした場合は、1.0になる。
1.04に0.5を足すと、1.09となり「1」を指定しているため、小数点第二位が切り落とされ、1.0になる。
→とりあえず0.5足して、指定したそこの桁を切り落とすイメージ。


```sql:sql
TRUNCATE([数値]+0.5, [四捨五入したい桁])
```






参考サイト
・https://www.softel.co.jp/blogs/tech/archives/2570
・https://www.softel.co.jp/blogs/tech/archives/1420
ROS2でmapvizを使用してNavSatFixトピックの場所の航空写真を表示

# 概要

ROS2環境でmapviz を使ってNavSatFizトピックの位置の地図を表示するまでの手順



ドキュメント

https://swri-robotics.github.io/mapviz/

Github リポジトリ

https://github.com/swri-robotics/mapviz


# 環境

ROS2 : Iron 
ubuntu : ubunut22.04LTS

# mapvizとは

地図データを可視化したり、地図の上にLaserScanやPoseなどを表示できるrviz2っぽい可視化ツール。

![mapviz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/603eeefc-7ac2-fe9a-b742-6c6d8f666479.png)




# インストール

```bash
sudo apt-get install ros-$ROS_DISTRO-mapviz \
                       ros-$ROS_DISTRO-mapviz-plugins \
                       ros-$ROS_DISTRO-tile-map \
                       ros-$ROS_DISTRO-multires-image
```






# Bing Maps APIの取得

この辺の記事を参考にBing Mapsのアカウントを作成し、APIキーを取得しておきます。

https://sizukana.net/bingmaps001/



# 実行方法

以下のようなlaunchファイルを作って実行する。

```python:mapviz.launch.py
import launch
import launch.actions
import launch.substitutions
import launch_ros.actions
import os
from ament_index_python.packages import get_package_share_directory

def generate_launch_description():
    return launch.LaunchDescription([
        launch_ros.actions.Node(
            package="mapviz",
            executable="mapviz",
            name="mapviz",
        ),
        launch_ros.actions.Node(
            package="swri_transform_util",
            executable="initialize_origin.py",
            name="initialize_origin",
            remappings=[
                ("fix", "/fix"),
            ],
        ),
        launch_ros.actions.Node(
            package="tf2_ros",
            executable="static_transform_publisher",
            name="swri_transform",
            arguments=["0", "0", "0", "0", "0", "0", "map", "origin"]
        )
    ])
```

remappingsの右側に使用するNavSatFixトピック名を書く。
以下はトピック名が`/gps/fix`の場合の例。

```python
        launch_ros.actions.Node(
            package="swri_transform_util",
            executable="initialize_origin.py",
            name="initialize_origin",
            remappings=[
                ("fix", "/gps/fix"),
            ],
        ),
```


実行

```bash
ros2 launch mapviz.launch.py
```


最初に起動した画面


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/894b2cb7-8229-9957-ed26-a3d3e22b903d.png)