OmniAICreator/Qiita-1.07M huggingface dataset:
学んだ事（週末）

data fabrics とは。

データを一元で管理すること。
一番恩恵を受けるのは、コールセンターの人、

なぜなら、多くの情報から適切に顧客にサポートできるため。

end to end solution 
→ システムの設計、開発、成果物まで業務を行うこと。
【プラクティス紹介】1分でさらっと分かる「ワーキングアグリーメント」

## プラクティス名（別名）
ワーキングアグリーメント　（W.A、Work Agreement、Team Agreement）

## プラクティスの目的・狙い
* メンバー間の無用な摩擦（ストレス）を軽減し、全員が気持ちよく働ける環境を整える
* チームメンバーとして期待される行動、望ましい振る舞いの判断基準を揃える
* 意見の相違を円滑に処理するプロセスを定める

## どんな時に使うか
* 新規チームにおいて、まだメンバーの認識や行動がバラバラで、心理的安全性が低い時
* 既存チームにおいて、メンバー間のコラボレーションを促進し、生産性をより高めたい時

## 実施手順
1. ファシリテータがW.Aの目的を説明し、**全員合意**の上でルール化する、という原則を伝える
1. 具体的な行動例を考える前に**観点**を挙げてもらう（＝どのへんをルール化したいか？）
1. 観点毎に具体的な**行動例**を挙げてもらう（付箋などに書き出す）
1. 重複する意見は集約/選定し、相反する意見はどちらかに決める
1. 最終的にW.Aとしてルール化するものを全員で選ぶ（目安として10個以下）
1. 合意できないルールがないことを最終確認し、目につくところに掲示する
1. **定期的に見直す**（十分、浸透したものは外す）

:::note warn
観点はメンバーや熟練度によって変わってきます。全てを事細やかにルール化するのではなく、問題になりそうなポイントに焦点を絞りましょう。
:::

:::note warn
ルールは「～を気をつける」といった記述だとスローガンになってしまい、守れているかどうかが判断できません。「ダブルチェックする」のように具体的な行動例として記載しましょう。
:::

:::note info
以下はW.Aの例です（**観点**：行動例）
* **チームポリシー**：全員が笑顔でいられるチームにする
* **マインド**：アウトプットよりアウトカム
* **コミュニケーション**：リアクションとフィードバックを返す
* **会議**：アジェンダを作成し、事前共有する
* **オンライン会議**：zoomは原則カメラON
* **出社方針**：毎週水曜日はチーム出社日とする
* **生活習慣**：1時間毎に休憩をとろう
* **勤務時間**：10-16時をチームのコアタイムとする
* **残業方針**：原則「しない」を前提に、2h以上残る時は周囲に言う
* **勤怠連絡**：予定休は（できれば）1週間前には周知する
* **意見の衝突**：1時間議論しても結論が出ない時は日を改める
* **問題解決**：30分考えても解決しない問題は有識者に聞く
* **スクラムイベント**：朝会は元気な挨拶から始める
* **計画と見積**：作業時間のキャパは8割で計算する
* **コーディング**：プルリクは4時間以内に返信する
* **コミット**：1日の終わりにプッシュする
* **ペアプロ**：ドライバーは30分毎に交代する
* **モブワーク**：最初に今日のゴールと時間制限を決める
* **テスト方針**：結合テストはコード書いた人とは別の人が行う
* **ドキュメント**：作成要否はチームの多数決で決める
* **更新頻度**：チーム定例前に各自タスクボードを最新化しておく
* **情報共有**：議論は人数を絞ってよいが、結論はチーム全員に伝達する
* **ルール見直し**：レトロスペクティブの最後にW.Aを再確認する
* **方針決定**：欠席者2名以下の場合は一旦、チーム合意とみなす
* **ペナルティ**：ルール違反者は後日おやつ神社にお布施する
:::

## アレンジ例
* 逆に最初に行動例を挙げてもらい、それらをグルーピングすることで観点を導く
* スクラムイベントなど具体的なシーンごとに行動例を考えてみる
* チーム憲章、インセプションデッキ、アジャイル宣言といった方針書をインプットにする

## アンチパターン
* リーダーやマネージャが一方的に決めてチームに押し付ける
* 最初に決めたままで、メンテされずに時間の経過とともに形骸化する
* 累積したルールが多くなりすぎて、覚えていられなくなる

## 参考情報

定番、AgileStudioさんのサイト

https://www.agile-studio.jp/post/apm-working-agreement

初心者に優しいとも坊さんの「Hello Scrum」サイトにも例が豊富に載っています

https://do-scrum.com/working-agreement/

ワーキングアグリーメント用のキャンバスもあるようですが、個人的にはもっとシンプルな方が好みです

https://scruminc.jp/blog/5846/

## こぼれ話（私的コメント）
Aさんは予定休の周知をいつも直前に行っていました。何日も前に言われても覚えていられないだろうという配慮からです。一方、Bさんは常々もっと前もって言ってほしいとストレスを感じていました。こうしたちょっとした期待のズレが積み重なると、チームの和が壊れてしまうことにもなりかねません。このケースではどちらの考え方が正解ということではなく、単純に決め事が１つあれば解決する問題です。
どういった行動を「正解」と考えるかは人それぞれで、年齢/性格/所属/立場/経験などによっても変わってきます。メンバーが多様化している現代だからこそ、W.Aのようなワークスタイルを揃えるプラクティスの重要性も増してきているように感じます。

余談ですが、Working Agreementを直訳すると「労働協約」となってしまい大分意味が変わってしまうので要注意です。最初、僕もWorking Agreementと聞いた時は労使協定の類かと思ってしまいました。

---
　[アジャイルプラクティス一覧へ戻る](https://qiita.com/kakashi_h5/items/20584998c5ca4594b9ea)
Direct ConnectとTransit GatewayでASNが被っても通信出来る箇所とAS番号設計

# 内容
下記のような構成があったとします。
* Direct Connect Gateway(DXGW)とTransit Gateway(TGW)を関連付ける
* TGW間をピアリングアタッチメントで接続する。

![tgw1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/9a31a91b-4563-0822-1635-29ddfc4f3cd0.png)

この場合、DXGWとTGWのAS番号が被るのはNGですが、実はTGWピアリング間のAS番号は被っていても通信出来ます。ただし、AWS公式ドキュメントに下記の記載がある通り、被らないASNを使用することが推奨となります。

`将来のルート伝達機能を利用するために、ピアリングされたTransit Gatewayに一意のASNを使用することをお勧めします。`

https://docs.aws.amazon.com/ja_jp/vpc/latest/tgw/tgw-peering.html

実業務では当然AS番号の設計は被らないように行った方が良いと思います。例えば、ネットワークを統合するアカウントがあって、別事業者の複数アカウント間をTGWで接続するとします。例として下記の様に設計していくとオンプレミス側含めてAS番号の設計が上手くいくと思います。

* オンプレ側で使われているAS番号を調べる。
* Direct Connectは64512を使用する。
* ネットワークを統合するアカウントは645xx～採番する。
* 事業者のアカウントは645xx～採番する。
* DR構成によっては（大阪リージョンで使用予定のAS番号を確保しておく。）

余談ですが、TGWルートテーブルへの経路追加は伝搬を使用し動的に経路追加をすることが多いと思います。ピアリングアタッチメントでは伝搬がサポートされないため、静的経路追加が必要になります。AS番号が被っても通信が可能なことからピアリングアタッチメントを間はBGP通信ではないため、経路伝搬が出来ないのかもしれません。
PM としての心構え

PMが知りたい事、報告してほしいこと。

最近どう？の質問に対して。PMが知りたいこと。

→ 自分と話すまでにどのような問題があったのか（問題に直面しているのか）

→ チームが達成したことは何か。どのように自分がチームに貢献できたのか。

→ 何の問題に自分の時間、集中を取られているのか。

→ 前回の話、または、ＭＴＧから学んだ事は何かあるのか。

→ 先月の一番の学びは何か。どのようにそれを業務に生かせるか。


![スクリーンショット 2024-11-16 165505.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534330/314de113-aa07-813c-43f3-957dc251313e.png)
CloudWatch Logs InsightsでAPIごとの処理時間を集計する方法

## 集計対象のログ前提

APIごとに以下の情報がログに出ていれば大丈夫です。

| 項目 | 説明 |
|:-|:-|
| リクエストID | リクエスト単位でユニーク |
| 開始・終了 | リクエストの開始と終了がわかるログ |
| メソッド・パス | 集計対象の情報 |

今回の記事でのサンプルログは、👇を想定しています。

```bash
# 開始ログ
2099/01/01 00:00:00.000 X-REQUEST-ID-X INFO Request Start POST /api/v1/ho/ge

# 終了ログ
2099/01/01 00:00:00.999 X-REQUEST-ID-X INFO Request End POST /api/v1/ho/ge
```

※ログに出ている日時が出ていますが、この情報は利用しません。CloudWatchのtimestampを利用します。

## 遅いAPIの抽出クエリ

CloudWatch Logs Insightsで抽出対象の時間・ロググループを指定して、以下のクエリを実行します。
このクエリで300ms以上かかっているAPIを降順で表示できます。

```sql
fields @timestamp, @message
| filter @message like /Request Start|Request End/
| parse @message "* * * * Request * * *" as date, time, requestId, logLevel, logType, method, path
| stats 
    latest(@timestamp) as endTime,
    earliest(@timestamp) as startTime,
    latest(@timestamp) - earliest(@timestamp) as duration
    by requestId, method, path
| filter duration > 300
| sort duration desc
| display fromMillis(endTime) as apiEndTime, requestId, method, path, duration
```

## API単位での集計

次に上記のクエリを発展させて、APIの処理時間の最大・最小・
平均・中央値を計算することで、問題分析で利用可能にします。

```sql
fields @timestamp, @message
| filter @message like /Request Start|Request End/
| parse @message "* * * * Request * * *" as date, time, requestId, logLevel, logType, method, path
| stats 
    latest(@timestamp) - earliest(@timestamp) as duration
    by requestId, method, path
| stats 
    max(duration) as maxDuration,
    min(duration) as minDuration,
    avg(duration) as avgDuration,
    pct(duration, 50) as medianDuration,
    count() as requestCount
    by method, path
| sort maxDuration desc
| display maxDuration, minDuration, avgDuration, medianDuration, requestCount, method, path
```

## 最後に

開発中にテストしていても、ちょっと遅いだけでは問題で出てこないこともあったので、具体的に数字を把握するために準備しました。

同じような方がいれば、参考になればと思います。
定常業務を自動化して1時間かかる業務を10分にした話

# 概要
定常業務を自動で実行するツールを作って業務を効率化してすごく褒められた話

# 自動化してよかったこと
1. 大体バッチファイル3クリックで完了するようになった
    1. 週1～3回ほど発生する作業を、1作業あたり50分短縮した
1. 作業ミスが（ほとんど）なくなった
1. 誰でも出来るようになった
    1. アップロード作業を私一人で担当しなくてよくなり、稼働が減った（分散された）
    1. アップロードチームがいつの間にか出来上がり、自然とチームリーダになれた
    
# 効率化した業務（引き継いだ当初）
1. 開発が完了したモジュールの名称一覧を受け取る
1. 開発したモジュールを、管理用のファイルサーバからローカルに回収する
1. それをWinSCPを使って別環境上の**全23サーバ・69ディレクトリに手作業で**アップロードする
1. 全サーバのアップロード前後の資源一覧を取得する
1. その差分をチェックし、証跡として管理する

# 自動化イメージ
![Excel (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616564/1d772a55-206b-4994-db13-102fec813c85.png)


# タスクごとの使った技術
1. 反映したい資源を記載
    - ここは手作業
1. 記載された資源を回収
    - バッチファイルで実装
        - 1で記載された資源名のファイル名からファイルサーバにアクセスする
        - 対象のファイルをローカル環境に移動
1. 回収した資源を共有ストレージにアップロード
    - バッチファイルで実装
        - 2で回収したファイルをバッチファイルからWinSCP(CLI)をキック
1. 共有ストレージからサーバにアップロード
    - Teratermマクロで実装
        - Teratermで対象の全環境に一括ログイン
        - ログイン後、ShellScriptを実行
    - ShellScriptで実装
        - 共有ストレージから`cp`コマンドでファイルをサーバ移動
        - 同時に反映前後の資源一覧を`ls -l`コマンドで取得
1. 反映結果を取得
    - バッチファイルで実装
        - 4で取得した反映前後の資源一覧をWinSCP(CLI)をキックして回収
        - WinMergeで反映前後の資源一覧の差分を確認

# 手作業の問題点
1. 管理用のファイルサーバからローカルに回収する時、目検ミスをする
    - 命名規約が人間に優しくない案件なので特にミスが発生する
        - AAAA**XY**AとAAAA**YX**A　みたいな
        - 間違ってアップロードした結果、バグが発生するなどの問題が発生していた
1. WinSCPで23サーバにログインするのがかなり手間
    - 23サーバに接続するとウィンドウのタブが山のように出来て視認性も悪い
        - そのせいでアップロード対象を間違えるなどのミスが発生していた
1. ログインした後ぽちぽちディレクトリ切り替えながら69ディレクトリにアップロードするのがかなり手間
    - 対象のサーバによってアップロードする先のディレクトリが変わるので作業ミスが多発する
1. アップロード前後の資源一覧を回収するのが大変
    - Teratermでログインして事前にls -l叩いてアップロードして再度ls -lを叩く→その結果をWinMergeで比較して差分を確認する
    - そのため、証跡の取得に相当な時間をかけていた
    - 証跡の取得ミス（特にアップロード前）が発生すると後戻りが出来ない

# 反省
- 自分でも把握できないくらい改修と修正を繰り返したため、ブラックボックス化している
    - 読み解ける量だが自作ツールのため、自分以外は読んでくれない
    - 仕様変更が発生した場合、修正に稼働を取られる
- ドキュメントを残さなかった
    - 当初はもっと小さなツールだったため、ドキュメントを作る意識がなかった
【AWS】AWSサーバーのデータを確認する方法

# 記事概要
AWSサーバーを本番環境として利用している場合の、DBデータの確認方法を説明する。

# 言語やフレームワーク
|| 使用技術 |
| ---- | ---- |
| フロントエンド | HTML <br> CSS |
| バックエンド | Ruby 3.2.0 <br> Ruby on Rails 7.0.8.6 |
| データベース | MySQL(mariadb) |
| インフラ | AWS |
| API | - |
| その他 | - |

# 前提
- AWSサーバーのDBが起動している
- AWSサーバーのDBに、テーブルが存在する

# 手順
1. EC2にログイン
1. MySQLにアクセス
    ```
    % mysql -u root -p
    ```
1. EC2のrootユーザーのパスワードを入力
    入力した値は表示されない
1. DBを確認　※スキップ可
    ```
    % show databases;
    ```
1. 表示するDBを選択
    ```
    % use [DB名];
    ```
1. DBのテーブルを表示　※スキップ可
    ```
    % show tables;
    ```
1. テーブルの中身を確認 ※下記はテーブルの全データを表示するSQL文
    ```
    % select * from [テーブル名];
    ```
30代後半エンジニアの転職活動で得た学び〜ビジネス視点を持つことの重要性〜

## はじめに
転職活動して気づいた「これをやっていれば.../やってよかった」をシェアしよう 
by 転職ドラフト Advent Calendar 2024
に参加しています！

https://qiita.com/advent-calendar/2024/engineering-careers-2

今回は30代後半の転職で大事だったことを中心に書いていこうと思います。
参考になれば幸いです。

## バックグラウンド
まずはじめに私のバックグラウンドとしては下記のようになります。
- 30代後半
- エンジニア歴 14年
- バックエンドのエンジニア(PHPとRuby on Rails)
- 直近はEMとしてマネージメントに専念している

自己評価ですが、普通に世間からは需要があるエンジニアだと思っていました。
転職活動をする前までは...。


## 現実とのギャップ
まず最初にびっくりしたことは、圧倒的に書類選考で落とされやすいという事です。
これは、20代〜30代前半ではなかったことです。
海外では年齢というものを採用の判断材料にしないことが多いですが（レジュメにも年齢は書かない）、この日本では年齢というものは大きなハードルとなることを痛感しました。

## 何を見られているのか
書類選考では年齢を大きく見られる事を痛感しました。
ただし、書類選考では企業側から明確に選考理由は聞けないので、ここはあくまでそういうケースが多数あったという事実にのみに留めておきたいと思います。
では、面接に進んだ場合はどうか？面接では何を見られているのか？
ここに関してはやってきて良かったこと、逆にやってこなくて困ったことが明確に結果に直結することを同じように痛感しました。

## やってきた良かったこと
エンジニアとして経験を積んでいくと、エンジニアとして技術を突き詰めていくのか、はたまたEMのようなマネージャーとしての立場になるのか、これはよく聞く悩みだと思います。
私も同じようにこのケースで悩みましたが、マネージャーとして若手のメンバーをまとめる仕事をこの数年はしていました。
マネージャーの道として進むと、以下のような不平不満が溜まってくると思います
- エンジニアなのにコードを書けない
- 上司から突然無謀な指示がくる
- 書類関係の仕事が多すぎる

マネージャー職をやり始めた時には、これらの理由が嫌で本気で会社を辞めようと思っていました。
しかしながら、そこを一歩乗り越えた先にはビジネス視点での経験を得られる大切なフェーズに入ります。
それらの経験により会社視点ではどうなのか？という事を常に意識することになり
この経験は実は今回の転職活動で大きく自分自身の力となっていた事に驚かされました。

ちなみに、エンジニアなのにコードを書けないっていうのは、私の場合はココナラというサイトで初学者向けにプログラミングを教えてる副業を始めた事で解決しました。

https://coconala.com/users/2710363

コードを書くのはプライベートでやろう！と決めてしまえばこの悩みは解決です！

## やってこなくて困ったこと
やってこなくて困ったことも明確になりました。
それはインフラサイドの事です。
最近のエンジニア職ではインフラサイド（いわゆるSREポジション）と開発エンジニアのロールが明確に別れているケースが多く、いい意味でも悪い意味でも自分の専門分野の仕事に専念する事が主だとおもいます。
私自身も、Herokuなどで簡単なインフラ環境の知識はありました。
しかしながら、業務レベルでの大規模なトラフィックに対しての知識は圧倒的に不足していました。

面接の中でよく聞かれる質問としては下記の本がすごく参考になります。

[システム設計の面接試験](https://amzn.asia/d/ean5BZE)


## エンジニアとして大事なことは何か
30代後半のエンジニアとして次のキャリアにステップアップするための転職活動でなにが大事なのか。
それは開発以外の事にも常にチャンレンジをしていくという事です。
コンフォートゾーン、ストレッチゾーン、パニックゾーンという言葉を聞いたことはあるでしょうか。

### コンフォートゾーン

意味: 居心地の良い、慣れ親しんだ状態のこと。
特徴:
心理的な負担が少ない
新しい挑戦や変化を避けがち
安全で安定している
成長が停滞しやすい

### ストレッチゾーン

意味: コンフォートゾーンの外側で、少しだけ挑戦的な状態のこと。
特徴:
心理的な負担はあるが、やりがいを感じられる
新しいスキルや知識を習得できる
成長を促す最適なゾーン

### パニックゾーン

意味: コンフォートゾーンから大きく外れ、負担が大きすぎる状態のこと。
特徴:
心理的な負担が大きすぎて、パフォーマンスが低下する
ストレスを感じやすく、メンタルに悪影響を与える
失敗を恐れてしまい、行動できなくなる

### 成長するためにコンフォートゾーンを抜け出す
人は、コンフォートゾーン、ストレッチゾーン、パニックゾーンという3つのゾーンを行き来しながら生きています。成長するためには、コンフォートゾーンから出て、少しだけ挑戦的なストレッチゾーンで行動することが重要です。しかし、パニックゾーンに入ってしまい、負担が大きすぎると、かえって成長を妨げてしまいます。

仕事をしているなかでこういった機会は必ず訪れます。私の場合は開発以外の仕事という点においてうまくこのゾーンにハマることができました。

ここらへんの話については、先日参加させてもらったQiitaカンファレンスの山本 学さんのセッションですごくいいお話が聞けました。
[EM、DevRel、技術広報、プリセールスエンジニア：技術×新たな挑戦で広がる働き方](https://qiita.com/official-campaigns/conference/2024-autumn)


## 最後に
私の場合、内定をもらった会社で評価された点は「考えられるエンジニアで会社視点を持っている」というところでした。最初は嫌だったビジネスサイドの仕事も、チャレンジしていく事で自身の力となる。これを大きく考えさせられた転職活動でした。
私の場合はエンジニアマネージャーというものが大きな経験となりましたが、エンジニアスペシャリストとしてキャリアを進む方も違う形で同じことが言えると思います。
最も大事なのは何かに挑戦し続けることという事です。
【CloudWatch Logs Insights】通信ログ（テストデータ）分析してみる

## はじめに
https://qiita.com/n0mura/items/18ff824515514a548e99

上記で生成したログをCloudWatch Logs Insightsを使って分析してみます。

細かい解説はしませんが、実際に「テストデータ(100件)がどんな感じで分析できるのか」「本番環境のログ分析行うためのアイデア」程度に眺めてもらえれば嬉しいです。


```ログのサンプル（3件）
2024-11-16T12:17:23.252+09:00
Sample log entry at 2024-11-16T03:17:23.252405: status=INFO, message='This is a test log', IP=186.139.154.218

2024-11-16T12:17:24.354+09:00
Sample log entry at 2024-11-16T03:17:24.354606: status=WARN, message='This is a test log', IP=131.127.200.53


2024-11-16T12:17:25.377+09:00
Sample log entry at 2024-11-16T03:17:25.377620: status=WARN, message='This is a test log', IP=174.92.5.202
```
## AWS管理コンソール画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/4d93f83f-60a0-9689-482f-f70275de877c.png)

①：ロググループを選択してください
②：ログの範囲（時間指定）を選択してください
③：実行するクエリを入力してください

## クエリの構文
AWSの公式ドキュメントを参照ください。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html

**この程度は覚えたい**
| 項目 | 説明 |
|:-:|:-:|
|  fields | クエリ結果に表示するフィールド  |
|  filter | クエリのフィルタリング条件  |
|  sort |  返されたログイベントを昇順(asc)または降順(desc)でのソート順 |
|  limit |  結果の件数（sortと併用することで上位/最新の10件などが取得可能） |
|  parse |  クエリで処理できるようにする抽出フィールドの作成<br>（変数みたいなイメージ） |
|stats|フィールドの値を使って集計が可能|
| \|(パイプ) |複数のコマンドをつなぐ |
| #|コメント|

### タイムスタンプの降順に10件抽出

```sql:Query
fields @timestamp, @message, @logStream, @log
| sort @timestamp desc
| limit 10
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/39d7b891-6531-13fd-7d97-83bf092f52eb.png)

### タイムスタンプとIPアドレスとステータスのみを出力（ERRORのみ）
```sql:Query
fields @timestamp
| parse @message /IP=(?<IP>[^ ]*)/
| parse @message "status=*," as status
| filter status = "ERROR"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/564a56a7-c624-e97a-9d51-462a80b5cac8.png)


### ステータス別の件数を抽出
件数のカウントは実用的で便利そう
```sql:Query
fields @timestamp, @message
| parse @message "status=*," as status
| stats count(*) by status
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/71642de2-d01a-32b3-69d5-c780c7fbb743.png)

### IPアドレス別の件数を抽出
今回自動で生成したIPアドレスが全て重複なしだったので、全てcountは1でした。
※自分でデータを生成する場合はランダムIPの範囲を調節すれば良い。

正規表現を使った parse の場合は `(?<IP>...)` のような構文で自動的にフィールド名を付けているため、as IP は必要無いみたい。
```sql:Query
fields @timestamp, @message
| parse @message /IP=(?<IP>[^ ]*)/
| stats count(*) by IP
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/209e3989-3d2f-953b-b733-8da06c0fd436.png)

### IPアドレスを指定してWARNステータスだけを抽出
```sql:Query
fields @timestamp, @message
| parse @message /IP=(?<IP>[^ ]*)/
| filter IP = "80.114.147.217" and @message like /WARN/
| display @timestamp, @message, IP
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/b33a6c20-235e-3ce7-b970-0b1f5b1f625f.png)

## おわりに
CloudWatch Logs Insightsでさくっとクエリが書けると便利そうですね！
【備忘録】freezedでDefault値指定すると型の書き忘れに気づかないがち問題

Flutter × freezed × Firestore で開発している最中、以下のエラーでFirestoreにデータを追加できなかったのを解決したので備忘録を残します。

# エラー
`[cloud_firestore/invalid-argument] Function setDoc() called with invalid data. Unsupported field value: a custom ContentType object (found in document XXXX/XXXX)`

# 原因
freezed使っててDefault値指定してたりすると、ウッカリ型書き忘れてても警告もエラーも出してくれないしパッと見で違和感がないので、書き忘れに気づかないがち。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417009/a669d147-cf42-df86-4c45-d294a53b3174.png)

今回の場合、`contentType`の型`ContentType`を書き漏らしていた。
型を追加して`dart run build_runner builld`すると無事firestoreへの書き込みができるようになった。
ABC379

# [ABC379](https://atcoder.jp/contests/abc379/tasks)

久しぶりにAtCoderをやりました.　[アカウント](https://atcoder.jp/contests/abc379/submissions/me)です.
結果はA,Bはいけましたが、Cで時間オーバーでした. まずA,Bです.
```python
import sys

input = sys.stdin.readline
N = input()
mojis = [char for char in N]
a = mojis[1] + mojis[2] + mojis[0]
b = mojis[2] + mojis[0] + mojis[1]
a = int(a)
b = int(b)
print(a, b)
```


```python
import sys

input = sys.stdin.readline
n, k = map(int, input().split())
s = list(input())
count = 0
mask = []
for i in range(len(s)):
    if s[i] == "X":
        mask.append(count)
        count = 0
    elif i == len(s) - 1:
        mask.append(count)
    else:
        count += 1
ans = sum(i / k for i in mask)
print(ans)
```

# C振り返り
失敗コード
```python
import sys

input = sys.stdin.readline
n, m = map(int, input().split())
s = [input().split() for _ in range(2)]
ans = -1
dp = [0] * (n + 1)
for num, let in zip(s[0], s[1]):
    num = int(num)
    let = int(let)
    dp[num] = let
ans = -1
if (sum(dp) != n) or (dp[1] == 0):
    print(-1)
else:
    for num in range(m):
        i = int(s[0][num])
        j = 0
        while dp[i] >= 2:
            j += 1
            ans += j
            dp[i] -= 1
            if i + j < n + 1:
                dp[i + j] += 1
        if dp.count(0) > 1:
            if dp[int(s[0][num + 1]) - 1] == 0:
                ans = -1
                break
        ans += 1
    print(ans)
```
このコードの失敗点は，以下の内容です.
- Nの大きさを考慮していなかった.
- Nが大きすぎて全探索は無理で上記のコードはどのみち無理だった
- ソートアルゴリズムなどのアルゴリズムの種類を考えることなく解いたのが原因

公式の解説出会った通り解こうとしても, pythonにはpairsは無いからそこを工夫する必要があるが，分りませんでした.
【AWS】AWSにseed値を適用する方法

# 記事概要
AWSサーバーを本番環境として利用している場合の、seeds.rbファイルの適用手順を説明する。

# 言語やフレームワーク
|| 使用技術 |
| ---- | ---- |
| フロントエンド | HTML <br> CSS |
| バックエンド | Ruby 3.2.0 <br> Ruby on Rails 7.0.8.6 |
| データベース | MySQL(mariadb) |
| インフラ | AWS |
| API | - |
| その他 | - |

# 前提
- db/seeds.rbに、シード値を記述している
- AWSサーバーに上記をデプロイしている
- AWSサーバーのDBが起動している
- AWSサーバーのDBに、シード値を登録するテーブルが存在する

# 手順
1. EC2にログイン
1. パスの移動
    ```
    % cd /var/www/[リポジトリ名]/current
    ```
1. シード値適用のコマンドを実行
    ```
    % rake db:seed RAILS_ENV=production
    ```

# 補足：コマンド実行確認
コマンド実行されているかをターミナルで確認したい場合、seeds.rbファイルの先頭に`start seeding`、最終行に`done`と記述する
今年取得した資格振り返りと今後の展望

# 概要
今年（2024年）に取得した資格から、今年の成長を振り返る

# 今年取得した資格
| 資格名 | 取得日 | 合格体験記記事 |
|:-:|:-:|:-:|
|LinuCレベル3 304 Virtualization & High Availability   |2024/02/12   | https://qiita.com/aiz4ryhe/items/d54507e9396340ccc6a9  |
|AWS Certified Solutions Architect - Associate   |2024/07/07   |https://qiita.com/aiz4ryhe/items/a7c7b7f1b98c43e2d90c   |
|Microsoft Certified: Azure AI Fundamentals   |2024/11/15   |https://qiita.com/aiz4ryhe/private/278139a3e435ef01240f   |
|LinuCレベル3 303 Security  |2024/12/22   |https://qiita.com/aiz4ryhe/items/8b185c26826ff2b646fc   |
|プロジェクトマネージャ試験   |2024/12/26   |https://qiita.com/aiz4ryhe/items/9466b3efe9490e8ba5f8   |

# 各資格振り返り
### LinuCレベル3 304 Virtualization & High Availability
- 取得理由
    - 本音：
        - 会社の昇進要件でLinuCのLevel3のどれかを取らないといけなかったから
        - Level3の中で一番簡単という話を方々から聞いたから
    - 建前：
        - やってる案件でHA構成がどうのこうの、今後クラウド化がどうのこうのと言っていたから

- 取得した感想
    - 高可用性周りの知識はかなり役に立っている
        - 特にフェイルオーバーとかスプリットブレインとか業務で出てくる
        - コテコテの基盤屋さんの話してる話がなんとなーくわかったりするのはメリット
    - 仮想化の話は全く役に立たない
        - 先輩有識者曰く、「あんまり使わないんじゃない？」
    - コマンドは忘れた
        - 業務でも使わないし使うならググる

### AWS Certified Solutions Architect - Associate
- 取得理由
    - AWS SAAくらいインフラエンジニアなら取っとくか
    - 取得報奨金が欲しいなあ
- 取得した感想
    - 業務では使わない（あたりまえ）
    - 勉強をしてみて、AWS自体にそこまで面白味・興味を感じなかったので今後のキャリアの方向性の参考になった
        - AWS SAP取るかは要検討
- その他
    - 勉強に使った試験環境の無料枠閉じるの忘れて課金された
        - 数百円だからセーフだったけど、qiitaの記事読むととんでもない請求された話とか転がっているので、その怖さの片鱗に触れられたのは良かった

### Microsoft Certified: Azure AI Fundamentals（AI900）
- 取得理由
    - 何かAI系の勉強をしてみたかった
        - G検定あたり受けようかと思っていた
    - 会社がバウチャー配ってたのでちょうどいい機会だった


- 取得した感想
    - Azureとしての勉強というより「AIとは～、機械学習とは～」の話が多かった
        - AWS CLFはかなりAWSのサービスについて勉強したので意外だった

### LinuCレベル3 303 Security
- 取得理由
    - 業務でACL設定周りに相当苦しめられたので勉強しておきたかった
    - 取得報奨金が欲しいなあ
- 取得した感想
    - 業務で使う内容が出題範囲に含まれていたので、役には立った印象
        - `ulimit`とか`acl`とか
    - 304取った時よりも達成感はなかった
        - たぶん、資格取得の達成感に慣れてきた（ジャンキー）

### プロジェクトマネージャ試験
- 取得理由
    - PM出来ないと給料上がりにくいよなあ
    - すぐにPMやらないにしても勉強しておけばチームリーダとしても役には立つだろうなあ
    - **この歳で受かったらかっこいいなあ**
- 取得した感想
    - いろんな人に褒められた
        - これまで取ったどの資格よりも褒められたから、やはり評価の高い資格なんだと思った
    - チームリーダとしてもメンバとしても学ぶべきことが多かった
        - 合格できないにしても、勉強しておくことに意義があると感じた
    - 文章を書くのが楽しいことに気が付いた
        - 子供のころから長文読解が好きだった⇒午後Ⅰ
        - 空想するのが好きだった⇒午後Ⅱ


### 今後の目標
#### 取りたい資格候補
- AWS SAP
- サービスマネージャ
- CCNA（早く取ろうね…）

# ん？
https://qiita.com/aiz4ryhe/items/94772747eee41332a946
ラズパイピコでショートカットキーボードを作成する

# 概要
突然ですが、社用PCと個人PCのキーボード配置が異なり打ち間違えてしまう経験はありませんか？筆者の社内PCは半角全角の切り替えの配置が異なり業務中によく間違えます。この記事では、Raspberry pi Pico（以降ラズパイピコとする）を使って簡単に自作キーボードを作りたいと思います。

# 目次
- [動作環境](#動作環境)
- [ラズパイピコのピン配置](#ラズパイピコのピン配置)
- [ハードウェア構成](#ハードウェア構成)
- [Thronyのインストール](#Thronyのインストール)
- [関連ライブラリのダウンロード](#関連ライブラリのダウンロード)
- [全体のコード](#全体のコード)
- [コードの解説](#コードの解説)
- [実行結果](#実行結果)
- [おわりに](#おわりに)


# 動作環境
- Windows 11 OS 
- Raspberry pi pico
- Throny 4.1.6

## ラズパイピコのピン配置
以下のリンクからラズパイピコ全体のピン配置を確認することができます。
https://datasheets.raspberrypi.com/pico/Pico-R3-A4-Pinout.pdf
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925972/950dad52-1af7-1d46-014b-48c7302cb9a9.png)

# ハードウェア構成
- タクトスイッチ
- USBケーブル（Micro USB)


![Keyboard_raspberrypico_bb.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925972/5d64bd51-611d-c37a-a410-8bf157e13f2e.jpeg)

## Thronyのインストール
作成するにあたって下記のサイトを参考にしてThronyをインストールしました。
https://logikara.blog/pico_thonny_micropy/

以下のThronyの公式サイトからインストールすることができます。
https://thonny.org/


## 関連ライブラリのダウンロード
ラズパイピコをショートカットキーボードとして使うにはキーボード関連のライブラリをダウンロードする必要があります。
今回は、下記のサイトを参考にして関連ライブラリをダウンロードしました。
https://tech-and-investment.com/raspberrypi-pico-15-circuitpython-hid/
https://uepon.hatenadiary.com/entry/2021/06/10/225800


以下のリンクから関連ライブラリをダウンロードできます。
https://circuitpython.org/libraries

## 全体のコード
タクトスイッチを押すと全角・半角を切り替えることができる
```python
# コード
import time
import board
import digitalio
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode

# キーボードの初期化
keyboard = Keyboard(usb_hid.devices)

# ボタンの設定 (G2)
button = digitalio.DigitalInOut(board.GP2)
button.direction = digitalio.Direction.INPUT
button.pull = digitalio.Pull.UP  # プルアップ抵抗を有効にする

# LEDの設定 (G3)
led = digitalio.DigitalInOut(board.GP3)
led.direction = digitalio.Direction.OUTPUT

while True:
    if not button.value:  # ボタンが押されたとき
        led.value = True  # LEDを点灯
        # 半角全角キーの押下をエミュレート（`キーを使用）
        keyboard.press(Keycode.GRAVE_ACCENT)  # 半角全角キーを押す
        keyboard.release_all()  # すべてのキーをリリース
        time.sleep(0.1)  # 短い待機時間を設ける
    else:
        led.value = False  # LEDを消灯

    time.sleep(0.1)  # スリープしてCPU負荷を軽減
```



## コードの解説
### 半角全角キーを押す
日本語キーボードでは「半角/全角」キーが独立しています。このキーを押すことで日本語入力（IME有効）と英語入力（IME無効）を切り替えることができます。この切り替えを
WindowsのIME（Input Method Editor）の設定が、`GRAVE_ACCENT`を言語切り替え操作に対応付けられているようです。また`keyboard.press`を入力することでPCと同じキーボード操作を模倣することができます。
```python
keyboard.press(Keycode.GRAVE_ACCENT) 
```
### すべてのキーをリリース
一度`keyboard.press`を実行すると、スイッチから指を話してもキーが押された状態が続きます。そこでキーボードで指をキーから話した際の動作を再現するために`release_all`を使います。
```python
keyboard.release_all()  
```
### プルアップ抵抗
今回のようにタクトスイッチなどのスイッチを使う場合、スイッチが押されていないときマイコンの入力端子がどこにも接続されず、閉回路ができません。閉回路がないとスイッチが押されていないときにノイズや誤動作が生じる場合があります。これを未然に防ぐためプルアップ抵抗を使います。ラズパイピコには内部にプルアップ抵抗を使う機能があるので今回はそれを使いたいと思います。
```python
button.pull = digitalio.Pull.UP  
```



# 実行結果
タクトスイッチを押すと半角・全角を切り替えることができました。
https://youtube.com/shorts/zKZf230H6VY?feature=share
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925972/038d9567-5975-05ef-3a19-1e84aa25dd65.png)

# おわりに
半角全角以外にも音量調整のために FunctionキーとF6を押さないといけない場合にも応用できるのでぜひ活用してみてください。
Microsoft Certified: Azure AI Fundamentals（AI900）合格体験記

# 概要
- 機械学習がなんぞやの話は知的好奇心を満たすために勉強したかった
- 会社がバウチャー配ってたから
    - G検定でも受けるかーと思っていたが、ちょうどよいのでこちらに切り替えた

# 学習前の状況
chatGPTすげ～！copilot便利～！

# 使った教材
https://www.udemy.com/course/azure-ai900-learn/?srsltid=AfmBOooMsFKK6cYtg9aKCCZAA7ey8WPIYcVqq6eO_2bV5bCU2j9FHC46

https://www.udemy.com/course/microsoft-ai-900-l/?srsltid=AfmBOopwp_IdwNIQKQ5_32txcLIVFso6UN1KSZGFq9RuIfaEsNaIY-07

# やったこと
以下の順番で勉強した
1. [【AI-900短期合格＆機械学習入門講座】具体例と実践問題で機械学習の本質を学び、最速でAI-900試験に合格しよう！（Udemy教材）](https://www.udemy.com/course/azure-ai900-learn/?srsltid=AfmBOooMsFKK6cYtg9aKCCZAA7ey8WPIYcVqq6eO_2bV5bCU2j9FHC46)
1. [試験対策！Microsoft AI-900　模擬試験問題　※日本語対応（Udemy教材）](https://www.udemy.com/course/microsoft-ai-900-l/?srsltid=AfmBOopwp_IdwNIQKQ5_32txcLIVFso6UN1KSZGFq9RuIfaEsNaIY-07)
1. [azure公式学習教材](https://learn.microsoft.com/ja-jp/credentials/certifications/resources/study-guides/ai-900)

# 結果
合格(857点)

# 感想
- 2をやれば受かる！と書かれていたのを鵜吞みにしたが、公式教材を解いたところ全く違う問題（よりazureのサービスに寄った問題）が出たため、慌てて公式資料で勉強
- 1の動画内で「覚えなくていいです」と言っていた内容がしっかり出題されているなどあまり信用してはいけなさそう
- udemyは本番問題より難しく作られてる印象、本番はもう1段簡単な問題が多い
- ほかの試験を受けるかは今後検討

# 関係ないこと
- 試験画面のUIが他社主催の試験と比較してダントツで優秀
    - 問題解き終わったあと色々画面いじってニヤニヤしてた
    - 特にドラッグドロップで解答する問題に感動した
- テストセンターに行ったら結構スーツのリーマンが多かった
VRAMを使用して文字表示する

自分でOSを1から作ってみる Advent Calendar 2024の5日目です。
# 今日の目標
この前作成したブートセクタはテキストを表示させましたが、BIOSを使って表示させました。なので今回はとりあえずBIOSを使用せずVRAMを使って「Hello,World!」を表示させようと思います。
# VRAMについて
VRAMは通常のRAMと似ているのですが、映像データの処理に特化しており、CPUとGPUのどちらからでもアクセスできるようになっています。詳しいことは調べてください。
# 制作
まずVRAMを使って「Hello,World!」を表示させるコードを載せてしまいます。解説も後に載っています。
```nasm:boot.asm
[BITS 16]
[ORG 0x7C00]

start:
    ; ビデオメモリの先頭アドレスを設定 (0xB8000)
    mov ax, 0xB800
    mov es, ax          ; ESをビデオメモリのセグメントアドレスに設定
    mov di, 0           ; DIを0に初期化（ビデオメモリのオフセット）

    ; 表示する文字列のアドレスをSIに設定
    mov si, message

print_string:
    mov al, [si]        ; SIが指す文字をALに読み込む
    cmp al, 0           ; 文字がnull(0)かチェック
    je done             ; nullなら終了
    mov [es:di], al     ; ビデオメモリに文字を書き込み
    mov byte [es:di+1], 0x0F ; 属性(白文字、黒背景)を設定
    add di, 2           ; 次の文字位置に移動
    inc si              ; 次の文字へ
    jmp print_string    ; 繰り返す

done:
    ; 無限ループで終了
    cli                 ; 割り込み禁止
hang:
    hlt
    jmp hang

; 表示するメッセージ
message db "Hello, World!", 0

times 510-($-$$) db 0    ; パディングを加えて512バイトに調整
dw 0xAA55                ; ブートセクタシグネチャ
```
実行方法は前の記事を参照してください。
# コードの解説
今回新出のコードのみ説明しておこうと思います
### ビデオメモリの設定
```nasm:boot.asm
mov ax, 0xB800
mov es, ax
mov di, 0
```
```mov ax, 0xB800``` は、テキストモードのビデオメモリのセグメントアドレス（0xB800）をAXレジスタに設定します。
```mov es, ax``` により、ビデオメモリのセグメントアドレスを ES レジスタにロードします。
```mov di, 0 ```により、ビデオメモリのオフセットが0に初期化されます。
### メッセージの表示
```nasm:boot.asm
print_string:
    mov al, [si]
    cmp al, 0
    je done
    mov [es:di], al
    mov byte [es:di+1], 0x0F
    add di, 2
    inc si
    jmp print_string
```
```print_string``` ラベルから始まるループで、メッセージを1文字ずつVRAMに書き込みます。
```mov al, [si]``` で SI レジスタが指す文字を AL レジスタにロードします。(```mov si, message```で設定した値)
```cmp al, 0``` と ```je done``` により、文字がNULL文字（終了文字）であれば done にジャンプし、処理を終了します。
```mov [es:di], al``` により、ビデオメモリの ES:DI アドレスに文字を表示します。
```mov byte [es:di+1], 0x0F``` で、文字の属性（白文字、黒背景）を設定します。
```add di, 2``` で次の文字位置に移動します（VRAMは1文字2バイト幅）。
```inc si``` で次の文字に進みます。
```jmp print_string``` でループを続けます。
# 終わりに
今回のブートセクタはカーネルをロードしたりはしていないのでまだOSという感じはしません。なのでそろそろカーネルのロードとかをしたいと思うのですが、自分でブートローダを作っても大変だし不便だしでメリットがないのでブートローダに関しては既成のものを使用しようと思います。もしかしたら最後の方で自分でブートローダを作ってみるかもしれません。
自己紹介

こんにちは！しんです。

僕は、15年以上の介護経験がある現役の介護士です。
介護福祉士と福祉用具専門相談員の資格を持っています。
僕はブログ歴4年で３つのサイトを運営しています。
Twitterもやってます。（@shinbloger2023）https://twitter.com/shinbloger2023


ブログ歴4年。
3サイト運営
トータル記事数550以上
月間PV数40000


✓ブログ紹介

しんぶろぐ〜介護ノート〜
https://shinblog-life.com/

介護の転職エージェント完全ガイド
https://tenshoku.shinblog-life.com/

副業high school
https://side-job.shinblog-life.com/
atcoder練習(2024.11.16)

# キーワード

# 問題
https://atcoder.jp/contests/abs/tasks/abc085_c

日本でよく使われる紙幣は、
10000 円札、
5000 円札、
1000 円札です。以下、「お札」とはこれらのみを指します。

青橋くんが言うには、彼が祖父から受け取ったお年玉袋にはお札が 
N 枚入っていて、合計で 
Y 円だったそうですが、嘘かもしれません。このような状況がありうるか判定し、ありうる場合はお年玉袋の中身の候補を一つ見つけてください。なお、彼の祖父は十分裕福であり、お年玉袋は十分大きかったものとします。

制約
1≤N≤2000
1000≤Y≤2×10 
7
 
N は整数である。
Y は 
1000 の倍数である。
入力
入力は以下の形式で標準入力から与えられる。

N 
Y
出力
N 枚のお札の合計金額が 
Y 円となることがありえない場合は、-1 -1 -1 と出力せよ。

N 枚のお札の合計金額が 
Y 円となることがありうる場合は、そのような 
N 枚のお札の組み合わせの一例を「
10000 円札 
x 枚、
5000 円札 
y 枚、
1000 円札 
z 枚」として、
x、
y、
z を空白で区切って出力せよ。複数の可能性が考えられるときは、そのうちどれを出力してもよい。

入力例 1
Copy
9 45000
出力例 1
Copy
4 0 5
お年玉袋に 
10000 円札 
4 枚と 
1000 円札 
5 枚が入っていれば、合計枚数が 
9 枚、合計金額が 
45000 円になります。
5000 円札 
9 枚という可能性も考えられるため、0 9 0 も正しい出力です。

入力例 2
Copy
20 196000
出力例 2
Copy
-1 -1 -1
合計枚数が 
20 枚の場合、すべてが 
10000 円札であれば合計金額は 
200000 円になり、そうでなければ 
195000 円以下になるため、
196000 円という合計金額はありえません。

入力例 3
Copy
1000 1234000
出力例 3
Copy
14 27 959
この他にも多くの候補があります。

入力例 4
Copy
2000 20000000
出力例 4
Copy
2000 0 0

# 回答
```Python
N, Y = map(int, input().split())

flag = 0

for x in range(N+1):
  for y in range(N+1-x):
    z = N - x - y
    if Y == 10000*x + 5000*y + 1000 *z:
      flag += 1
      print(x,y,z)
  if flag == 1:
    break

if flag == 0:
  print("-1 -1 -1")
```

# 参考

# 備考
- もうわかりませんでした。すみません人の参考にしました。kkakaakak様ありがとうございます。
- 人のコードを見てみて、どうやら、このflagみたいなやつは便利なやつなようです。いろんな所で登場しています。
- あとやっぱりゴリ押し最強！もう僕はとにかく動くならそれでいいというスタンスで行きます。計算資源なんてどうでもいい。ロジカルな解き方はお金で買えないが、計算資源はお金で買える。
- とにかく頭で考えて、とにかく書く、それでもダメなら、人の教えをこう。真似ていじってを繰り返す。
【20秒で分かる】二分探索ってデータ増えてもマジ頑丈で優秀！全部コイツで良くない？

**⚠️よくないです⚠️**
二分探索の計算量O(logN)は非常に効率的です。
が、正しく動作するためにはデータがソート済みである必要があります。
例えば、1から32のデータを二分探索で探す場合は1から32まで綺麗に揃ったデータである**前提条件**が必要なわけです。

二分探索が機能するためにはデータのソートが不可欠です。
ソートにはコストがかかりますが、長期的な効率性や管理のしやすさを考えると、そのコストを支払う価値があります。
atcoder練習(2024.11.16)

# キーワード
endswith, exit, 守破理
# 問題
https://atcoder.jp/contests/abs/tasks/arc065_a

英小文字からなる文字列 
S が与えられます。 
Tが空文字列である状態から始め、以下の操作を好きな回数繰り返すことで 
S=T とすることができるか判定してください。

T の末尾に dream dreamer erase eraser のいずれかを追加する。
制約
1≦∣S∣≦10 
5
 
S は英小文字からなる。
入力
入力は以下の形式で標準入力から与えられる。

S
出力
S=T とすることができる場合 YES を、そうでない場合 NO を出力せよ。

入力例 1
Copy
erasedream
出力例 1
Copy
YES
erase dream の順で 
T の末尾に追加することで 
S=T とすることができます。

入力例 2
Copy
dreameraser
出力例 2
Copy
YES
dream eraser の順で 
T の末尾に追加することで 
S=T とすることができます。

入力例 3
Copy
dreamerer
出力例 3
Copy
NO

# 回答
```Python
S = input()

words = ["dreamer", "eraser", "dream", "erase"]

while S:
    flag = False
    for word in words:
        if S.endswith(word):
            S = S[:-len(word)]
            flag = True
            break
    if not flag:
        print("NO")
        exit()

print("YES")
```

# 参考
https://atcoder.jp/contests/abs/submissions/59803122

https://pg-chain.com/python-startswith-endswith

https://atmarkit.itmedia.co.jp/ait/articles/2308/22/news024.html

# 備考
- もうわかりませんでした。すみません人の参考にしました。sauna_lover様ありがとうございます。
- 流石に完全にコピペするのは悪いので自分なりに変えたつもりです。これが良くなかった。
- 自分としては変えたらダメなところは変えてないつもりなのに、いっこうに正解しない。もうやだ。
- 一つ知見としては、「人のコードを見るのは勉強になる！」
- 自分だけで正解のコードを書いたとしても、自分で最初に決めた解法に無意識に立脚してしまい、他の考えが閃かなくなる。だからこそ人のコードを見て、他の考えを入れて、自分の無意識を解放する。
- あと単純に僕より上手いコードを書ける人はごまんといる。だから、適当に見たとしてもほとんどが上手い人。同じ考えだっとしてもものすごく勉強になる。人のことをとにかく真似なさい。守破理！
eslintのエラー　「TypeError: Error while loading rule '@typescript-eslint/no-unused-expressions': Cannot read properties of undefined (reading 'allowShortCircuit')」

## 更新
こちら修正された模様です。
![IMG_0941.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178346/594a1bf1-3257-080d-f90d-3460303f407d.png)


## 起きたこと
Laravel / Vue3 / TypeScript / Eslint の環境構築で
ESlintが動かなかったのでVSCodeの拡張機能のeslintの出力みると
```
TypeError: Error while loading rule '@typescript-eslint/no-unused-expressions': Cannot read properties of undefined (reading 'allowShortCircuit')
```

が出ていた。

## 原因・解決方法
ESLint v9.15.0　でエラーが起きる模様

ISSUEが上がっており ESLint自体のバージョンを v9.14.0 に下げれば起きなくなった

https://github.com/typescript-eslint/typescript-eslint/issues/10338#issuecomment-2479828906

```bash
npm install --save-dev eslint@9.14.0
```
Rを学びたい(VSCodeで動かす)

## はじめに
最近、データ分析に興味を持ち始め、Rを学ぼうと思います。
`Python`or`R`かちょっと悩んでたんですが、Rにしました。

## 環境構築
事前にRはインストールしてください。

https://www.r-project.org/

## サンプルコードの実行

```R:sample.R
data <- data.frame(
  Name = c("Alice", "Bob", "Charlie", "David", "Eva"),
  Age = c(25, 30, 35, 40, 45),
  Score = c(90, 85, 88, 92, 95)
)

# データの確認
print("データフレームの内容:")
print(data)

# 平均年齢の計算
average_age <- mean(data$Age)
cat("平均年齢:", average_age, "\n")

# スコアの棒グラフを作成
barplot(
  data$Score,
  names.arg = data$Name,
  col = "blue",
  main = "Score by Person",
  xlab = "Person",
  ylab = "Score"
)

```

→実行すると下記のようなものができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/3a9e43ab-7609-dd61-e5ff-14467fd29541.png)
wsl ubuntu上のvimでクリップボードにコピーする簡単な方法


wsl からは windowsのファイルを実行できるので、clip.exeを実行できる。

なので、vimのビジュアルモードで範囲を選択して、clip.exeを実行すればOK。

# 具体的な手順

1. `v`を押してビジュアルモードに入り、カーソルを移動させて範囲を選択。

2. `:`を押すと、`:'<,'>`が入力されます。これは選択した範囲を表しています。

3. ` w !clip.exe`をつけ足し、`:'<,'> w !clip.exe`にして、Enterを押します。このコマンドは、wで一旦一時ファイルに書き出し、その内容を、clip.exeでクリップボードにコピーします。
※ `'<,'>`と`w !clip.exe`の間に半角スペースが必要なことに注意

これで、クリップボードに選択した行がコピーされます。

# この方法の問題点

## 日本語が文字化けする

出力をiconvで文字コードを変換してからclip.exeに渡せばOK

```
:'<,'> w !iconv -t cp932 | clip.exe
```

## root権限で開いたファイルの場合、clip.exeが見つからない

デフォルトのユーザーの場合は、/mnt/c/WINDOWS/system32 にデフォルトでパスが通っているが、ほかのユーザーの場合は違うため。
愚直に、フルパスを指定してclip.exeを実行すれば、コピーできる。~~めんどくさいけど~~

```
:'<,'> w !/mnt/c/WINDOWS/system32/clip.exe
```

## 行全体がコピーされてしまう

ビジュアルモードで選択した範囲だけをクリップボードにコピーしたかったのですが、実際には選択した範囲を含む行がクリップボードにコピーされます。
選択した範囲だけコピーできるようにしたいので、誰かvimに詳しい方教えてくださると嬉しいです。

# 参考 

https://knowledge.sakura.ad.jp/22465/#i-3

https://qiita.com/sasaki_hir/items/45885960b46f87226fd8

https://zenn.dev/skanehira/articles/2020-10-05-vim-about-rw

https://zenn.dev/kumavale/scraps/2271c61cbd19ef

https://qiita.com/suzuki-navi/items/f340c69ccada84a3ece3

https://巫.jp/blog/2023/04/13/uclip/

https://qiita.com/ankuru/items/821738a83272ac658e73
Node.js環境構築(WSL2)

# はじめに
個人の備忘です。`WSL2`上で`Node.js`を使えるように環境構築します。
ディストリビューションは`Ubuntu24.04`をインストールしました。
# 事前準備
Ubuntuターミナルで以下のコマンドを実行します。
```
suto apt update & sudo apt upgrade
```
# curlをインストール
必要なコンテンツをインストールするために``curl``をインストールします。
```
sudo apt-get install curl
```
# nvmをインストール
``nvm``をインストールすることにより、``Node.js``のバージョン管理をコマンドライン上で行うことができます。
インストールするために、以下のコマンドをコマンドラインで実行します。
```
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
```
``nvm``がインストールできていることを確認するために、ターミナルを再起動して以下のコマンドを入力します。
```
command -v nvm
```
ターミナル上に``nvm``と表示されればOKです。
# Node.jsのLTSリリースをインストールする
``nvm``を用いて、Node.jsの安定バージョンをインストールします。以下のコマンドでインストールできます。
```
nvm install --lts
```
続けて、``nvm ls``と入力して``Node.js``がインストールされていることを確認しましょう。
``v22.11.0``がインストールされたことを確認できました。
```
->     v22.11.0
default -> lts/* (-> v22.11.0)
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v22.11.0) (default)
stable -> 22.11 (-> v22.11.0) (default)
```
``node --version``でも現在のNode.jsのバージョンを確認できます。
せっかくなので、``npm``バージョンも確認します。
```
> npm --version
10.9.0
```
``npm``がインストールされていることも確認できました。
KindleやPDF記載のURLや文字をコピペするテクニック

## はじめに
KindleやPDFで記載されている文字をコピーしたい時ありますよね。ただ、文字をコピーしようとしてもうまく文字認識されず、困ったりします。特にURLなどをコピーできないと、全部文字で打つのは辛いです。
そんな時に使えるTipsを紹介します。

## PDFやKindleの文字をスクショする
スクショすると、MacやWindowsが画像解析してくれて文字がコピペできるようになります。
必ずではないですが、結構有用です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/117a4e9c-ca3c-6b90-80de-207ef38d0ea0.png)
→こんな感じでスクショして。URLをコピーできたりします。結構便利です！

## 最後に
Kindleとかは元からコピペできるようにしてもらえると嬉しいなぁ。
【UE5/C++】A とか U とかクラス名の接頭辞の簡単まとめ

# はじめに
`UE` の `C++` を触っていると `A` だの `U` だのようわからん接頭辞が出てきたので、調べてみたところ意外とあったのでちょっとだけまとめてみる。


# `A` 接頭辞
`A` は `AActor` クラスに使用される。`AActor` クラスはゲーム内のオブジェクトを表し、ワールドに配置することができる。これらのオブジェクトはコンポーネントを持ち、移動、回転、スケーリングが可能。ワールドに存在し、動きがあるものは大体これな気がしている。

```cpp
UCLASS()
class MYGAME_API AMyActor : public AActor
{
    GENERATED_BODY()

public:
    AMyActor();
};
```

# `U` 接頭辞
`U` は `UObject` クラスに使用される。`UObject` クラスはより汎用的なオブジェクトで、ゲームワールド内に存在しない。ユーティリティクラスやデータコンテナなどに使用される。`UObject` クラスをそのまま使うことは少ない気がしているが、継承している `UBoxComponent` などで使用する機会が多そう。

```cpp
UCLASS()
class MYGAME_API UMyObject : public UObject
{
    GENERATED_BODY()

public:
    UMyObject();
};
```

# `F` 接頭辞
`F` は構造体（Struct）に使用される。構造体はデータの集まりを表し、軽量で効率的なデータ管理が可能。なぜ `S` ではないのか不思議に思うが、理由がちゃんとあるらしい (参考↓)

https://qiita.com/sy_/items/17d84fb217f7b086e49f

```cpp
USTRUCT()
struct FMyStruct
{
    GENERATED_BODY()

    int32 MyValue;
};
```


# `I` 接頭辞
`I` はインターフェース（Interface）に使用される。インターフェースはクラスが実装すべき関数のセットを定義するもの。

```cpp
UINTERFACE()
class UMyInterface : public UInterface
{
    GENERATED_BODY()
};

class IMyInterface
{
    GENERATED_BODY()

public:
    virtual void MyFunction() = 0;
};
```

# `S` 接頭辞
`S` はスレートウィジェット（Slate Widget）に使用される。スレートは Unreal Engine の UI フレームワークのこと。

```cpp
class SMyWidget : public SCompoundWidget
{
    SLATE_BEGIN_ARGS(SMyWidget) {}
    SLATE_END_ARGS()

    void Construct(const FArguments& InArgs);
};
```

# `T` 接頭辞
`T` はテンプレートクラス（Template Class）に使用される。テンプレートクラスは型に依存しない汎用的なクラスを作成するために使用される。

```cpp
template<typename T>
class TMyTemplateClass
{
public:
    T MyValue;
};
```

# 参考
変数にもある程度規則があるみたいですね

https://dev.epicgames.com/documentation/ja-jp/unreal-engine/coding-standard?application_version=4.27

http://kagring.blog.fc2.com/blog-entry-661.html
AVTOKYO 2024 バッジを改造しよう!


AVTOKYO 2024 バッジは LED でイルミネーションになっています。

![IMG_20241116_140804.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/ab4f6285-5e63-6ad4-e32a-2d9168e7d151.jpeg)

赤、ピンク、  緑、 オレンジ が有りますが、

色は配布時に決まった色が単色で点滅になっています
そのLEDを、自動点滅自動変色LEDに変更して楽しむ工作です。

# 改造方法

改造は、ピンクの人とそれ以外の人で異なります。

# ピンクの人の改造


分解して、はんだごてでLEDを取り外します。



![IMG_20241116_141058.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/85e6e110-1b4d-0951-e6e6-09a0dc782399.jpeg)


この向きで取りつけます。
![IMG_20241116_140911.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/883ac210-23ec-1b76-a909-144ce9d6a3b5.jpeg)


脚の長さはこのくらい。でっぱりのところまで差し込んで、はんだづけします。
![IMG_20241116_141257.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/8e0f7f29-e0d8-f0cc-f099-d862c6932846.jpeg)

LEDの頭をカットします。頭には極細配線が入っているのでそれを切らないように注意!

![IMG_20241116_140610.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/7ce6b585-3507-053b-1c28-a485076f7e97.jpeg)


ケースとプレートを図のように削ります。

![IMG_20241116_140325.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/428b5d62-d5d3-2ffa-0314-1ad92ec2c5f4.jpeg)

このように組み立て。

![IMG_20241116_140952.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/40c45977-88b8-7383-7e56-88ea6aee73c0.jpeg)


スイッチモードで 1,2,3,OFF となりますが、モード3で変色を楽しむことができます。

# 緑、黄色、赤の人の改造

このバッジの方は、スイッチ制御を施さずに電池にLEDを直結します。
そのため、以下の制限があります。

- プレート部分は光りっぱなしです。AVTOKYO イベント中持つかな・・・
- 6VをLEDに印加します。LEDの寿命が短くなります。これも AVTOKYO イベント中持てばということで。

なお、LEDの寿命については難易度が1つ上がりますが、電流制限抵抗を1つ追加すれば解決します。(ご相談ください。)

上記にご了承いただけた方は、以下のように作業を行ってください。


分解して、はんだごてでLEDを取り外します。



![IMG_20241116_141058.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/85e6e110-1b4d-0951-e6e6-09a0dc782399.jpeg)

自己点滅LEDをこの向きで取りつけます。
![IMG_20241116_140911.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/883ac210-23ec-1b76-a909-144ce9d6a3b5.jpeg)


脚の長さはこのくらい。でっぱりのところまで差し込んで、はんだづけします。
LEDの頭もカットしてしまいます。頭には極細配線が入っているのでそれを切らないように注意!


![IMG_20241116_154048.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/795ef58b-bbfe-05f7-8729-651851b0c6c0.jpeg)

LEDの脚は + と、スイッチにはんだづけします。

![IMG_20241116_145820.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/323796bf-2d00-91e2-54b5-d3c13adf740e.jpeg)



ケースとプレートを図のように削ります。

![IMG_20241116_140325.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/428b5d62-d5d3-2ffa-0314-1ad92ec2c5f4.jpeg)

このように組み立て。

![IMG_20241116_140952.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/40c45977-88b8-7383-7e56-88ea6aee73c0.jpeg)

完成です。
![IMG_20241116_150840.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/58fce024-514d-ed98-c6b8-e4c6256c9e90.jpeg)
ポートフォリオ作成時メモ　part3 ~Breezeの追加（ユーザー登録、ログイン機能追加）

## はじめに
こんにちは、未経験からエンジニア転職を目指しているものです。
オンラインスクールで本格的に学習して6ヶ月目に入りました。PHP,Laravelを学習しポートフォリオを作成中です。ポートフォリオ作成手順及び、エラー内容を中心に記録していこうと思います。今回はBreezeを追加しました。本投稿は流れのメモが重点になっておりますので、削除した部分や追加した部分の詳細は割愛致します。

## 実施内容

**変更、追加したディレクトリ**
app
- Http/Controllers/Auth/AuthenticatedSessionController.php
- Http/Controllers/Auth/ConfirmablePasswordController.php
- Http/Controllers/Auth/EmailVerificationNotificationController.php
- Http/Controllers/Auth/EmailVerificationPromptController.php
- Http/Controllers/Auth/NewPasswordController.php
- Http/Controllers/Auth/PasswordController.php
- Http/Controllers/Auth/PasswordResetLinkController.php
- Http/Controllers/Auth/RegisteredUserController.php
- Http/Controllers/Auth/VerifyEmailController.php
- Http/Controllers/ProfileController.php
-----
- Http/Requests/Auth/LoginRequest.php
- Http/Requests/ProfileUpdateRequest.php
----
package-lock.json
- package-lock.json
----
resources/views
- auth/confirm-password.blade.php
- auth/forgot-password.blade.php
- auth/login.blade.php
- auth/register.blade.php
- auth/register.blade.php
- auth/verify-email.blade.php
----
- components/application-logo.blade.php
- components/auth-session-status.blade.php
- components/danger-button.blade.php
- components/dropdown-link.blade.php
- components/dropdown.blade.php
- components/input-error.blade.php
- components/input-label.blade.php
- components/modal.blade.php
- components/nav-link.blade.php
- components/primary-button.blade.php
- components/responsive-nav-link.blade.php
- components/secondary-button.blade.php
- components/text-input.blade.php
-----
- dashboard.blade.php
-----
- layouts/app.blade.php
- layouts/guest.blade.php
- layouts/navigation.blade.php
----
- profile/edit.blade.php
- profile/partials/delete-user-form.blade.php
- profile/partials/update-password-form.blade.php
- profile/partials/update-profile-information-form.blade.php
----
routes
- auth.php
-----
tests/Feature
- Auth/AuthenticationTest.php
- Auth/EmailVerificationTest.php
- Auth/PasswordConfirmationTest.php
- Auth/PasswordResetTest.php
- Auth/PasswordUpdateTest.php
- Auth/RegistrationTest.php
- ProfileTest.php

※コマンド入力で自動作成されたディレクトリになります。


**実施コマンド**
```
./vendor/bin/sail composer require laravel/breeze --dev
./vendor/bin/sail artisan breeze:install
./vendor/bin/sail artisan migrate
```
**ブラウザ上の表示**
![ユーザー登録、ログイン画面完了画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846051/f1005ed9-0ac0-b623-9259-d500f12ccdcb.png)


## 次回実施内容
- 設定とメッセージの日本語化


最後までご覧いただき本当にありがとうございました！！
ポートフォリオ作成時メモ　part2   ~PostgreSQLの追加~

## はじめに
こんにちは、未経験からエンジニア転職を目指しているものです。
オンラインスクールで本格的に学習して6ヶ月目に入りました。PHP,Laravelを学習しポートフォリオを作成中です。ポートフォリオ作成手順及び、エラー内容を中心に記録していこうと思います。今回はPostgreSQLを追加しました。本投稿は流れのメモが重点になっておりますので、削除した部分や追加した部分の詳細は割愛致します。

## 実施内容
**変更したディレクトリ**
- docker-compose.yml
- .env
- ./config/database.php

**実施コマンド**
```
./vendor/bin/sail up
./vendor/bin/sail php artisan sail:install
./vendor/bin/sail php artisan migrate
```
**ブラウザ上で入力**
```
http://localhost:8888
```

## 次回実施内容
- ユーザー登録・ログイン機能の搭載（Laravel Breezeのインストール）


最後までご覧いただき本当にありがとうございました！！
PHP、Laravel基礎　～不要なマイグレーションファイルの削除～

## はじめに
こんにちは、未経験からエンジニア転職を目指しているものです。オンラインスクールで本格的に学習して6ヶ月目に入りました。PHPとLaravelを学習しながらポートフォリオを作成中です。ポートフォリオ作成が順調に進むように、PHPとLaravelの疑問点について整理しようと思います。今回は、マイグレーションとモデルについて気になった部分をまとめてみました。

## 概要
Laravelのマイグレーション機能を使うと、データベースのテーブル作成や更新をコードで管理できます。マイグレーションファイルにはデータベースの「設計図」が書かれており、`migrate`コマンドを実行することで、実際にデータベースがその設計図通りに作成されます。

しかし、不要なマイグレーションファイルが残ったままになると、意図しないテーブルが再度作成されるなどの問題が発生します。これを防ぐため、適切にマイグレーションファイルを管理することが重要です。

## 具体例
1. **マイグレーションファイルを作成する**  
   例えば、`tests`というテーブルを作るためのマイグレーションファイルを作成します。このファイルには、テーブルを作成するための手順が記載されています。

2. **マイグレートを実行する**  
   `sail artisan migrate` コマンドを使うと、マイグレーションファイルに基づいてデータベースにテーブルが作成されます。

3. **不要なマイグレーションファイルが残っているとどうなる？**  
   一度削除したい`tests`テーブルがあるとします。しかし、マイグレーションファイルが残っている場合、再度マイグレートを実行すると**また`tests`テーブルが作成されてしまいます**。

4. **問題点まとめ**
   - **データベースが意図しない状態に戻る**  
     作成したテーブルを削除したいのに、マイグレーションファイルが残っているため、何度もテーブルが作成される可能性があります。
   - **データが無駄に増える**  
     不要なテーブルが作成され続けると、データベースが複雑化して管理が難しくなります。

5. **解決方法**
   - **不要なマイグレーションファイルを削除する**  
     例えば、`tests`テーブルのマイグレーションファイルが不要であれば、`database/migrations`フォルダから削除しましょう。
   - **`sail artisan migrate:reset` コマンドで全てをリセットして再実行する**  
     `reset`コマンドを使うと、全てのマイグレーションが取り消され、データベースが最初の状態に戻ります。その後、必要なものだけ再度マイグレートすることで、意図しないテーブル作成を防げます。

## まとめ
- **マイグレーションファイル**はデータベースの設計図であり、コードでデータベース管理を行う上でとても重要。
- **不要なマイグレーションファイルが残っていると、意図しないテーブルが作成される恐れがある**ので、適切に管理する。
- 必要に応じて、`migrate:reset`や`migrate:refresh`などのコマンドを活用することで、データベースの状態をリセットし、再度マイグレートを実行できる。

最後までご視聴頂き、ありがとうございます！
【Laravel】migrationでカラムの型が変更できない場合の対処法！

泉（[@izumin_0401](https://twitter.com/izumin_0401)）です。

今回は、Laravelのmigrationでカラムの型が変更できない場合の対処法を解説しやす！

# ブログ記事はこちら

https://traveler0401.com/laravel-migration-column-cannot-change/

# 【Laravel】migrationでカラムの型が変更できない場合の対処法

``` php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up()
    {
        DB::connection()->getPdo()->exec('ALTER TABLE your_table ALTER COLUMN your_column TYPE VARCHAR(10);');
    }

    public function down()
    {
        DB::connection()->getPdo()->exec('ALTER TABLE your_table ALTER COLUMN your_column TYPE CHAR(10);');
    }
};
```
上記のように、直接SQLを実行すれば解決します。

# まとめ
結構ハマった。。

ではまた！

# 最後に
暇つぶしに[Twitter](https://twitter.com/izumin_0401)と[ブログ](https://traveler0401.com/)もやってるので見てね。
【備忘録】Qiitaで画像の大きさを調整する方法を初めて知った

ふと思いました。

これまで、Qiita上で画像を挿入する際、普通にコピペして貼り付けていたけど、
**画像の大きさとか調整できないの？** と。


# HTMLタグで画像サイズを調整する
以下のように、HTMLの`<img>`タグを利用します。
```bash
#srcは"source"の略。画像ファイルのURLまたはファイルパスを指す。
<img src="任意の名前.png" width="400">　
```
- `任意の名前.png`について:
 - 任意の画像をコピペしてQiita上に貼り付け際、↓のように表示されると思いますが、この`https://～～.png`部分をコピーして↑の`任意の名前.png`に張り付けましょう。
```bash
![image.png](https://qiita-image~~~.png)
```

`width = ""`内の数字は、適宜調整してみてください！！

## ※追記(2024/11/17)
>↓のように、`width=""`と`src=""`の順番を逆にしてもよいみたいです。[^1]
```bash
<img width="400" src="任意の名前.png">
```
[^1]:[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d#fn-)
【設計書作成で役立つ】Excel 便利ショートカットキー

Excelで設計書を書くエンジニアの方、必見です！

:::note info
__&__ と __+__ 表記の違いについて
以後、この記事では、

&　→　同時押し
\+　→　順押し

を意味するものとします。
:::

---

|ショートカットキー|意味|
|----|----|
|`Alt` & `Tab`|アプリの切り替え|
|`Ctrl` & `fn` & `PgUp/PgDn`|シートの移動|
|`Ctrl` & `矢印`|矢印方向にワープ移動|
|`Shift` & `矢印`|矢印方向にセル選択|
|`Shift` & `Space`|行を選択|
|`Ctrl` & `Space`|列を選択|
|`Ctrl` & `D`|上のセルを下にコピー|
|`Ctrl` & `R`|左のセルを右にコピー|
|`Alt` & `Enter`|セル内で改行|
|`Ctrl` & `f`|検索モード|
|`Ctrl` & `h`|置換モード|
|`Alt` + `i` + `r`|行を挿入|
|`Alt` + `i` + `c`|列を挿入|
|`Ctrl` & `a`|全てのセルを選択|
|`Ctrl` & `tab`|次のブックへ移動|
|`Ctrl`& `Shift` & `tab`|前のブックへ移動|
|`F4キー`|直前のショートカットと同じ動作|
|`` & ``||
|`` & ``||

（↓ おまけ：Windowsエクスプローラーの便利ショートカット）
|ショートカットキー|意味|
|----|----|
|`Ctrl` & `Shift` & `N`|新規フォルダ作成|
|`F2キー`|名前の変更|
|`delete`|フォルダやファイルを削除|

以上です。
他にも便利なショートカットキーを見つけたら、追記していきます。
大学生が卒業旅行のために２週間でWebアプリをリリースした話.その１


# はじめに

はじめまして。大学四年生のSと申します。
友人とWebアプリを開発した話を書いてみることにしました。

理系大学生で、進路は大学院に行くことが決まっています。
現在は卒論と格闘中です。そして卒論が終わった後には、**楽しい卒業旅行**が待っているはず！

卒業旅行は、高校の仲良し4人組で**南米のペルー**へ行こうと話していました。
しかし、先日ちょっとした問題が発生しました。
旅行計画中に、友人のM君が「**お金がないから卒業旅行に行けない...**」との相談が。
でも大学生最後の思い出として、絶対にM君と海外へ卒業旅行に行きたい。

:::note warn
M君は扶養ギリギリまで働いており、決して卒業旅行に行きたくないわけではありません。
:::

そこで、4人でどうにかする方法はないかと話し合いました。その結果、いくつか解決策が出ました。

・行き先をもっと安くいけるところへ変更する
・国内の居酒屋で暴れ回る
・クラウドファンディングで同情を誘い出資してもらう
・アプリ開発で儲けてそのお金で南米へ行く(僕とM君はちょうど１ヶ月前くらいから気まぐれでWebアプリの制作を始めていました)　　など...

僕たち4人組は決して妥協を許さない性格なので、**絶対に南米に行きたい**という強い思いを曲げることができませんでした。
というわけで、M君の卒業旅行の資金を作るという目的のもと、本格的にWebアプリの開発をすることが決定！！
アプリ開発初心者がWebアプリで稼ぐことは難しいと思っていましたが、金欠大学生が南米に行くには今のところこれが最善策ということになりました。

# 何を作るのか
Webアプリを作ることが決まったはいいものの、具体的にどのようなアプリを作るかは決めていませんでした。
M君と話し合った結果、次の条件を満たすものがいいと方針が定まりました。

・規模感が妥当だと思える
・バックエンドの知識が少ししかなくても出来る
・日常の中で使える（収益を上げるために必要だと思いました）

この条件を満たし、かつ自分たちの開発のモチベーションが高いという理由で「**割り勘アプリ**」を作ることにしました。


# 開発環境
開発環境：VScode
→ UdemyでAndroidStudioを入れさせられましたが、VScodeの方が個人的に使いやすかったです。あと、エミュレータの反応速度がXcodeの方が優れていたので！

使用言語：Dart
→Flutterを使用していたため

使用したフレームワーク：Flutter
→扱いやすいらしいと聞いたため

使用したデータベース：FireStore
→M君がやってくれました

参考にしたもの：Udemyの動画, [Warica](https://walica.jp/), grouppay(ネイティブアプリ)

# アプリの概要
開発したアプリは「[**みんなで割り勘**](https://groupwarikan.com/)」です。
旅行など、**誰かがまとめてグループ全員の分を支払うことが多いときに役に立つアプリ**です。
支払いを記録しておくことで、解散するときに精算額を確認することができます。
みなさんぜひ使ってみてください。あったら嬉しい機能などもドシドシお伝えください。

:::note warn
旅行など、支払いが発生するたびにアプリを利用していただくことを想定しているため、スマホに合わせたUIになっています。
また、現在Google AdSenseに広告申請中です。承認されたらいよいよ収益化できるということでドキドキです。
:::

アプリの最初の画面はこんな感じになっています。素人が２週間で作った割にはUIが整っているなと、思っていただけたら嬉しいです。プライバシーポリシーやお問い合わせフォームまであります。


<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672991/4bd790c3-2a31-e134-928b-534d7d8324e3.png">

___

### 今回はここまで

思ったよりも長くなりそうなので、今回はここまでにします。
この記事はWebアプリの宣伝も兼ねているので、複数回に分けて記事を載せた方がユーザーも増えるかなとも思いました。
次回はアプリの具体的な機能や広告申請が承認されたか、お伝えしたいと思います。ありがとうございました。


開発したWebアプリ：「[**みんなで割り勘**](https://groupwarikan.com/)」（https://groupwarikan.com/）