OmniAICreator/Qiita-1.07M huggingface dataset:
個人開発の異常性


例えば面接とかなんかで、

「個人開発やってます！」

みたいなことを言っても、

「ああそう（で？だから何？）」

みたいな感じになると思う（偏見）。

しかし、冷静になって考えてほしい。

その異常性を。

作っているものの規模が大きければ、プログラムの複雑さも上がってくる。

苦痛で投げ出したくなる場面も多く発生することだろう。

それでも、くじけずに実装させたとしても、そのアプリが利用されるかどうかなんて分からない。

全く人目につかずに爆死して絶望することも多々あるだろう。

で、だ。

そんな苦痛を伴い、努力が報われないことが多い賽の河原の個人開発を、
ゲームやアニメやテレビなど、他の娯楽よりも優先しているという事実。

これは異常なのだ。

大抵の人は1円も儲からない個人開発などせず、娯楽を優先するのに！

というわけで、個人開発は冷静に考えてすごい！という話でした。
pythonで円グラフを書く



<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/c8f567bf-fc1b-d00a-8a92-2f190dcabad1.jpeg" width=80%>



# はじめに
Kaggleに投稿されたさまざまな円グラフを集めてみました。
Pythonには可視化のための豊富なツールがあり、それぞれ異なる魅力を持っています。
この記事では、円グラフを中心に、可視化方法やその特徴をご紹介します。



# 1.Matplotlib-円グラフ

・単純なカテゴリ分布を視覚化。colors オプションで指定した色を使用
・小カテゴリ（最大3～5程度）の割合をシンプルに表示
・カスタマイズが少なく、基礎的な円グラフ

```python:python
# Randomly sample 10,000 rows
df_sampled = df.sample(n=50000, random_state=42)
df_sampled.head(3)
plt.figure(figsize=(3, 4))
extinction_reason_counts = df_sampled['Extinction Reason'].value_counts()
plt.pie(extinction_reason_counts, labels=extinction_reason_counts.index, autopct='%1.1f%%', colors=['lightcoral', 'gold', 'lightskyblue'])
plt.title('Breakdown of reasons for extinction')
plt.show()
```


https://www.kaggle.com/code/risakashiwabara/eda-animal-lifespan

![スクリーンショット 2024-12-22 19.14.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/d1d4cfb0-c8b0-fd17-43ef-8d28afd60520.png)




# 2.plotly-円グラフ

・plotly.express による円グラフ
・color_discrete_sequence による色のシーケンスを活用
・視覚的にわかりやすいデザイン



```python:python
import plotly.express as px


form_counts = df['Region'].value_counts().reset_index()
form_counts.columns = ['Region', 'Count']  


fig = px.pie(form_counts, values='Count', names='Region', title='Distribution of Region', 
             color_discrete_sequence=px.colors.sequential.Blues)

fig.show()
```

https://www.kaggle.com/code/risakashiwabara/eda-medicines-from-egyptian-pharmacie


![スクリーンショット 2024-12-22 19.16.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/49d58aad-deb0-26b7-ad39-bbdda4bf861c.png)




# 3.Matplotlib-円グラフ

・上位5つのチームの割合を表示し、startangle や wedgeprops を利用して見た目を調整
・ラベルや順位を明示的に表示する比較対象が明確なデータ
・カスタマイズ性が高く、順位付きのカテゴリに適している


```python:python
# Get the top 5 teams by points
top_5 = df.nlargest(5, 'points')

labels = [f"{team}({rank})" for team, rank in zip(top_5['team'], top_5['rank'])]

# Plot the pie chart with labels
plt.figure(figsize=(4, 4))
plt.pie(
    top_5['points'], 
    labels=labels, 
    autopct='%1.1f%%', 
    startangle=140, 
    wedgeprops={'edgecolor': 'white', 'linewidth': 2}  # Adds white spaces
)
plt.title('Top 5 Teams by Points')
plt.show()

```
https://www.kaggle.com/code/risakashiwabara/eda-2024-premier-league-analysis



![スクリーンショット 2024-12-22 19.18.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/b4f69741-fa77-d4bf-9104-d2b930b7ad64.png)
未経験からSESエンジニアになった話【辛かった】


未経験からSES企業に転職(24歳)
ここでは筆者がSES企業に就職するに至った経緯をお話します。

大学卒業してフリーター生活を2年間していた
SES企業に転職する前は、フリーター生活を2年間していました。

大学4年生で就活に失敗し、行くあてもないまま社会に放逐。そのままフリーターになりました。

深夜にドラックストアの品出しをひたすら行っていました。昼夜逆転の生活に、心身はボロボロになり、そろそろまともな生活をしなければならないと実感。

就職活動を決意しました。

転職活動3ヶ月で、何故かエンジニアになれた
ろくに定職に就職せずにフリーターを続けていたため、転職活動は長期戦を覚悟していました。

しかし何故か転職活動3ヶ月で、転職先が決まりました。その転職先こそがSES企業でした。

何となく、エンジニアいいなぁ、と漠然と考えていましたが、こんなすんなりなれるものなのかと驚愕。

怪しさを感じながらも内定を頂いたSES企業への転職を決意しました。

フリーターの転職成績
3ヶ月間の転職成績は下記の通りです。

IT企業を中心に応募

応募求人は40件以上

内定は1個

転職期間は3ヶ月

転職成績としては、散々な結果でしたが、フリーター2年間を考慮すれば、まあ良い方でしょう。

定職につけなかったフリーターでもエンジニアになれるんだなと感じました。


SES企業で働いた地獄の3年間
ここではSES企業でエンジニアとして働いた3年間を紹介します。実体験を解説するので、ぜひ参考にしてみて下さい。

未経験でいきなり一人客先常駐
未経験でエンジニアになりましたが、いきなり一人客先常駐をすることになりました。

１ヶ月社内で動画研修をした後、常駐する現場が決まりました。

初めのうちは客先常駐の意味がわかりませんでしたが、実際にやってみると、そのヤバさを実感。

地獄の客先常駐生活がスタートしました。

スキルが無さすぎで怒鳴られる毎日
初めて入った一人客先常駐の現場では、6ケ月間働きましたその日々はまさに地獄そのものでした。

毎日のように飛んでくる怒号。完全な無視、放置。一線を超えたパワハラ。
などが日常的行われ、とにかく毎日が辛かったです。

この案件が終わる頃には、SESを辞めたいという感情しか湧きませんでした。

サービス残業と毎日の勉強で乗り切った
未経験からのエンジニアだったので、当たり前のように、納期に間に合いませんでした。

その納期の遅れは、ひたすらサービス残業でカバーしました。休日は周りのエンジニアに追いいつくため、ひたすら勉強を実施。

本当に辛かったです。

3年目で限界に達し、SESから転職
3年弱で5つほど案件を経験しましたが、最後の案件で精神が限界に達し、転職を決意しました。

今は社内SEとして、働いています。

もう二度とSES企業には就職したくない
客先常駐のSESやってみて、感じたのは、もう二度とあの環境には戻りたくない。
ということ。

はっきり言ってあの環境は地獄なので、今SESにいる人は、急いで脱出した方が良いと感じました。

この方の記事も面白いので、合わせて参考にしてみて下さい。

https://ses-job-change.com/ses-3month-experience/
PHP Conference japan 2024 参加レポート

## はじめに

php conference japan 2024 （通称：ぺちこん）に参加してきました。

https://phpcon.php.gr.jp/2024/

https://x.com/nakahiro2151/status/1870643232914452820?s=46&t=wrNqeNv_LNXgP0e938e0Ww

他言語やフレームワークと比べてベテランエンジニアが多いためか、他のweb系セッションと比べても比較的落ち着いた雰囲気で実施されていました。

体調不良でやや出遅れてしまいましたが、何とか基調講演の途中から参加することができました。

魅力的なセッションがたくさんありましたが、自分が見たセッションの中で最も学びが多かったセッションを３つ紹介しようと思います。

ちなみに今回、Postmanのバブルヘッドを頂きました！

https://x.com/nakahiro2151/status/1870700943882543188

statudCode530は初めて見ました。ShopifyのCloudflare解決エラーとPantheon特有のエラーらしいです。

最近トレーナー(メンター)業務がなくなったので、しばらくはPostmanコーディングができそうです（笑）

## セッション紹介

### **良いテストコードを書くためのガイドライン〜作成から運用まで〜 by rikuto**

https://fortee.jp/phpcon-2024/proposal/7edc5567-d741-4d6a-bfa7-732afb7dd311

https://speakerdeck.com/riku929hr/tesutokodonogaidorain-zuo-cheng-karayun-yong-made

一番初めに聞いたセッションです。

発表者のrikutoさんが社内向けテストガイドラインを作成したときに意識したことや大変だったことなどについて話されていました。

最も面白かったのは、「テストガイドライン」ではなく「テストスタイルガイド」として公開していた点です。

テストスタイルガイドには「必ずしてほしい」「できればしてほしい」「できるとよくなる」といった重要度が振られていて、すべての項目を必須にはしなかったそうです。

また、各項目にはできる限り実装コードのサンプルを書いているらしく、非常にユーザーフレンドリーなガイドライン(スタイルガイド)に感じました。

ガイドラインは様々な参考書をもとに作ったそうですが、中でも「単体テストの考え方/使い方」を最も参考にしていたようです。

https://amzn.asia/d/e5tHiK1

実装の詳細ではなく、ふるまいをテストすることが重要であり、テストガイドラインにもその考え方を取り入れたそうです。

実際にふるまいをテストするようなコードを書くと実装の詳細が隠蔽されるので、テストがしやすい以外にも様々な良い効果が出てきそうだと思いました。

### **プロダクトの寿命を延ばすためにエンジニアが考えるべきこと 〜バージョンアップってなんのためにやるのか〜 by 牧 良摩**

https://fortee.jp/phpcon-2024/proposal/8ef1f689-efaf-4775-a6c6-86bc814f256f

カオナビの牧さんがシステムアップデートの重要性と実際にやってみて大変だったことについて話されていました。

バージョンアップはセキュリティリスクと開発効率の悪化を招くため、バージョンは会社のためでもあり、エンジニアのためでもあると話されていました。

また、カオナビでは開発とバージョンアップを並行して行ったため、バージョンアップが終わるまでは終始いたちごっこのような状態が続いていたようです。

他チームとの折衝や依頼が大変なことは自分も普段の業務で経験しているので、話を聞いていて少し胃が痛くなりました笑

テストコードを書いたり、余計なパッケージはインストールしなかったと基本は大切なことをあたらめて実感しました。増やすことより、減らすことのほうが大変なので、普段の業務で余計なものは極力入れていかないようにしたいです。

### **EC2からECSへ：念願のコンテナ移行と巨大レガシーPHPアプリケーションの再構築 by 江口 純矢**

https://fortee.jp/phpcon-2024/proposal/ff1b3bb3-f123-48d4-9b88-0b891975bd68

コドモンの江口さんが、LaravelのアプリケーションをEC2からECSに移行した際のお話です。

江口さんが「巨大システムの移行は総力戦」というお話をされていましたが、私もその通りだと思います。システムは大きくなれば大きくなるほど、依存システムも大きくなっていきまが、それ以上に関係者が増えていきます。そのため、ここでいう「総力戦」は「システムの開発を行っている人」だけではなく「システムを使ってい利益を上げている人、ひいてはシステムの利用者」も含まれているのだと思います。

移行の流れとしては以下のように行っていました。

- 開発環境のコンテナ化
- 開発環境をステージング環境で動作するようなコンテナイメージづくり
- ステージング環境と本番環境の環境差分を環境変数に切り出し
- ステージング環境での動作確認
- 本番環境へデプロイ、ロードバランシングの振り分けをEC2からECSに向けていく

しかも、これを2サービス行っているそうです。気が遠くなりますね。

このセッションに関しては、各移行フェーズでどんなことをしてどんな障壁にぶつかったか、そしてそれをどうやって乗り越えたのかが書かれており、今後の移行の参考にしようと思いました。

特にデプロイ周りはBlueGreenデプロイ周りの制約や加重ルーティングを活用したデプロイ方法などが書かれていたので、AWSを使っている環境ならどこでも利用できるナレッジでした。

本当に50分間移行のためにやったことを離されていたので、終始その熱量に圧巻されていました…。

# まとめ

今回はぺちこんで聞いたセッションの中で、最も印象深かった3つのセッションについて紹介し増した。

ここで紹介していないセッションや私が見られていないセッションもあるので、気になる方はSpeacker DeckやYouTubeアーカイブを見てみてください！

https://www.youtube.com/@PHPConferenceJapan
Agentforce Analytics

[Agentforceに戻る](https://qiita.com/Keiji_otsubo/items/59ea22f4da6567ba93cf)

+ [【ヘルプ】Agentforce Analytics](https://help.salesforce.com/s/articleView?id=sf.copilot_analytics.htm&type=5)
+ [【ヘルプ】発言分析によるエージェントのインタラクションの評価](https://help.salesforce.com/s/articleView?id=release-notes.rn_einstein_utterance_analysis.htm&release=252&type=5)

# エラー

+ [Agentforceのダッシュボードのデータが表示されない](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J8w1A0AR)
Emacs Lisp 超初心者がコマンドを作ってみる 〜 Emacs Lisp スタイルチェッカ checkdoc 〜

# はじめに

今回のコマンド作成で .el ファイルのバッファを eval-buffer しようとしたときに、 今まで使っていた Emacs 26.3 では eval-buffer がそのまま走ったのですが、 Emacs 29.3 では代わりに checkdoc-eval-current-buffer が走りました。 ワーニングがゴロゴロ出てきてビックリ！しましたが、 Emacs Lisp のコーディングスタイルチェッカのようです。

# 何か

python でいうところの pycodestyle (旧 pep8)と同様に コーディングスタイルが標準に沿うにワーニングを出してくれるようです。

checkdoc.el が標準添付されているようです。

checkdoc-eval-current-buffer は、そもそも動かないとスタイルチェックもクソもないやろ、と、 まずは「 eval-buffer が通るのを確認してから、」 checkdoc するコマンドだそうです。

# コーディングの標準に即して書きたいんだけどどの文書見ればいい？

python では pep8 とか関連文書に纏められていますが、 Emacs Lispではリファレンスマニュアルに書いてあります。

D.6 ドキュメント文字列のヒント

や

D.8 Emacsライブラリーのヘッダーの慣習

をご覧ください。

こちらさんを参考にさせてもらってます

https://ayatakesi.github.io/lispref/29.4/elisp-ja.html#Library-Headers

今回はここまで。
ホームページの設定

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)

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

+ [Lightning Experience ホームページの設定](https://qiita.com/Keiji_otsubo/items/a2505c9a82dadf651366)
+ [Lightning Experience のホームページでアシスタント](https://qiita.com/Keiji_otsubo/items/7627a774ebc345c50f77)
+ [ホームページがモバイルでは表示できない](https://qiita.com/Keiji_otsubo/items/bc53f220d02930dfac8b#%E3%83%9B%E3%83%BC%E3%83%A0%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%8C%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E3%81%A7%E3%81%AF%E8%A1%A8%E7%A4%BA%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84)

# エラー

+ [ホームページのアクセスレベルの障害？](https://qiita.com/Keiji_otsubo/items/d30a384f01279c2938ca)
+ [ログイン時のデフォルト画面が設定とは違って別画面にリダイレクトされる【未解決】](https://qiita.com/Keiji_otsubo/items/5bdb45b5200381184546)

+ [Lightningホームページにコンポーネントを追加できないのはなぜですか？](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HETVQ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e163f37a-c070-58e8-ff30-f887cab2e2c7.png)

+ [ホームページのタイル メニューにボタンが表示されません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007aheeF)

# トレイルヘッド

+ [Customize the Home Page](https://qiita.com/Keiji_otsubo/items/479e64e017991cb1be77)
【React】 #2 電波時計アプリを作成

# はじめに
現在、Reactを習得するために、23種類のReactアプリ開発に取り組んでいます。
今回はその第二弾として、Reactで電波時計アプリを作成しました。

https://qiita.com/xYasi/items/0e223b8be80006ef9933

# 要件
+ デジタル時計を画面上に表示すること
+ 日本標準時をサーバから取得して同期すること
+ 毎回フェッチするとパフォーマンスが低下するため、初回描画時のみ同期すること

# 作成したアプリのイメージ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947973/5ce044d2-832c-de19-c752-158ecd3e6e15.jpeg" width=60%>

# アプリ紹介動画
<iframe width="200" height="400" src="https://www.youtube.com/embed/joF1n7mQpTk" title="React 電波時計" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# 利用技術
+ React
+ TypeScript
+ Vite
+ Tailwind

# 意識したポイント
## useEffectでデータをフェッチ
初回レンダリング時に日本標準時をフェッチし、それを画面に表示する必要があるため、
useEffectを利用してデータを取得しています。
以降、1秒単位で時刻を更新するため、setIntervalを使用して時刻を加算しています。
コンポーネントがアンマウントされた後に実行されないように、
クリーンアップ関数でインターバルをクリアしています。
```react:useServerTime.ts
const useServerTime = () => {
  const [myTime, setMyTime] = useState<Date | null>(null);
  useEffect(() => {
    const syncData = async () => {
      const time = await feachDateTime();
      if (time) {
        setMyTime(time);
      } else {
        console.error("サーバ同期に失敗しました。");
      }
    };

    syncData();

    const intervalId = setInterval(() => {
      setMyTime((prev) => {
        if (!prev) return new Date();
        return new Date(prev?.getTime() + 1000);
      });
    }, 1000);

    return () => {
      clearInterval(intervalId);
    };
  }, []);

  return myTime;
};
```
今回は初回レンダリング時にのみフェッチするので依存配列は空です。

## 日本標準時を「World Time API」を介して取得
日本標準時は「World Time API」を使ってインターネットから取得しています。
「World Time API」は、特定のタイムゾーンの現在時刻を取得できるシンプルなWebAPIで、
インストール不要で使用することができます。
APIからデータを取得し、日付をDateオブジェクトに変換して表示しています。
```react:fetchTime.ts
const feachDateTime = async (): Promise<Date | null> => {
  try {
    const res = await fetch("http://worldtimeapi.org/api/timezone/Asia/Tokyo");
    if (res.ok) {
      const data = await res.json();
      const datetime = new Date(data.datetime);
      console.log(`サーバ同期に成功：${datetime}`);
      return datetime;
    } else {
      console.error(`サーバ同期に失敗しました status：${res.status}`);
      return null;
    }
  } catch (error) {
    console.error(error);
    return null;
  }
};
```
World Time APIの詳細はこちらから確認できます:
https://worldtimeapi.org/

## カスタムhooksに分割して実装
データフェッチ部分は別のAPIファイルに、
useEffectでのレンダリング部分はカスタムフックとして分割しました。
このようにすることで、デジタル時計の描画部分をシンプルに保つことができました。

# おわりに
今回は、useEffectとカスタムコンポーネントへの分割を意識して実装を行いました。
コードの可読性や再利用性を高めるために、関心ごとを分けてシンプルに保つよう意識して実装できたのが良かったです。

# Github
https://github.com/yasi1989/react-degital-clock
Azure AI Foundry でプロンプトフローを使ってみる

Azure AI Foundry でプロンプトフローを使ってみました。以下の内容に準じています。

https://learn.microsoft.com/en-us/azure/ai-studio/how-to/prompt-flow

# 前提
以下の記事内容をセットアップしていることが前提です。

# 手順
## 1. プロンプトフロー作成
Azure AI Foundry のプロジェクト画面でメニューから「プロンプト フロー」を選択し、「+作成」ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/e26c32e3-907e-f926-24f6-82b57a5a9e80.png)

標準フローの「作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/c15b367b-5008-d79c-1ef1-2bdc24e62707.png)

画面の下にある「作成」ボタンクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/646bf209-0d16-4bd2-a5ce-1c02ed8ce0cf.png)

最初にJokeのサンプルプロンプトフローが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/72a5524e-3a75-677a-e5bb-d6ef8ec297c3.png)

## 2. プロンプトフロー確認
今回は特にいじらずに中身を確認します。
画面右側に「グラフ」ブロックがあり、joke -> echoの順に実行されるのがわかります。
「joke」を選択すると左のブロックでjokeに遷移。どんなプロンプトが定義されているかがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/41abcdff-a5c7-397a-9ad6-413a66d23238.png)

後の実行に備えて「接続」にAI サービス、「deployment_name」にデプロイしたモデル名を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/766bacad-b3fa-d682-1d6c-31aebd214adc.png)

「echo」は単純にLLMの出力をそのままエコーしているだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/800abf7c-bd08-3e6b-d29e-b7bae6fc2017.png)

入出力は、以下のように定義されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/fd4edee1-c896-6970-d8ab-dd4c9cc8bf7c.png)

LangChainのLCELをツールで定義しているような内容でした。

## 3. 実行
Python処理もあるので、裏ではサーバレスが動くらしく、最初に「コンピューティング セッションの開始」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/a55dd819-6b68-db72-beaf-bec5af8f216b.png)

「実行」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/0572f28b-0536-f87b-235d-3b27c530316c.png)

「出力の表示」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/9cb82566-3292-6503-90df-a0057620af9a.png)

ポップアップで結果が表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/cddca952-2dff-152d-3dfe-f375cf5a5fdb.png)

トレースを見るとLangSmithみたいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/341391ff-4620-3d0f-baba-fb55ff468ae6.png)

## 4. 後片付け
忘れずに「コンピューティングセッションの停止」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/739f2a85-cd3e-7502-521f-c713d5ea8abd.png)

フローを「アーカイブ」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/cf5123e7-d001-89c2-29d2-b559ada1f1ce.png)
VS Codeでのショートカットまとめ

# 生産性が上がるキーボードショートカットを10個紹介

Visual Studio Code（VS Code）は、多くの便利なキーボードショートカットを提供しており、効率的なコーディングをサポートします。今回は、その中でも自分が使っていて便利だな思ったものを10個紹介します。

---

## 1. **全てのファイルを保存する**  
**`Ctrl + K` `S`**

`Ctrl + S` でファイルを保存することができるのはご存じだと思いますが、`Ctrl + K` に続けて `S` を押すことで複数開いているファイルをまとめて保存できます。
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619840/3fe8fb1a-44f0-ebce-dcfb-93bc9e37e44a.gif)


---

## 2. **次の一致項目を選択に追加**  
**`Ctrl + D`**

このショートカットは、現在のカーソル位置で選択中の単語と一致する次の単語を追加選択する機能です。これにより、複数箇所での同時編集が簡単にできるようになります。
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619840/0f780ab8-d891-8e56-5d95-043ee86a0b7f.gif)

---


## 3. **選択部分の全マッチを選択**  
**`Ctrl + Shift + L`**

選択したテキストと一致するすべての箇所を一括で選択できます。複数箇所の一括編集に最適です。
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619840/55d5e473-0e24-7697-fc9e-e52847dd32db.gif)

---

## 4. **最後の選択操作を取り消す**  
**`Ctrl + U`**

カーソル操作を1つ前に戻します。誤ってカーソルを移動してしまった場合に非常に便利です。
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619840/ec813779-77bc-c5c7-9acd-04efa6e358b4.gif)


---

## 5. **単語の先頭 / 最後へ移動**  
**`Ctrl + ←/→`**

カーソルを単語単位で移動するショートカットです。この機能を使うと、通常の矢印キーによるカーソル操作よりも、効率的にテキスト内を移動できます。
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619840/225d267e-bc97-d61b-cb4e-ced310a34b5a.gif)

---

## 6. **矩形選択**  
**`Shift + Alt + ドラッグ`**

矩形選択（ボックス選択）を行うためのショートカットです。この機能を使うと、通常の選択とは異なり、テキストの列単位で選択することができます。特に、整列したデータや表形式のコード編集で非常に便利です。
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619840/776fdb35-1713-c3ee-17dc-37fa5e85d229.gif)

---

## 7. **行移動**  
**`Alt + ↑/↓`**

現在の行または選択範囲を上下に移動するショートカットです。この機能を使うと、コードの並び替えや順序変更が素早く行えるため、特に整った構造のコードやデータ編集に便利です。
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619840/b744d4c9-babd-2c22-a7a8-e53958610869.gif)

---

## 8. **ファイル検索**  
**`Ctrl + P`**

ファイル名を指定して素早く開くことができるショートカットです。このショートカットを使用することで、プロジェクト内のファイルを迅速に検索・開くことが可能になります。
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619840/f8ca4dc1-185d-c45f-96dd-1aa9260a44d7.gif)

---

## 9. **上下に複製**  
**`Shift + Alt + ↓ / ↑`**

現在の行または選択範囲をコピーしつつ上下に複製するショートカットです。この機能を使えば、行やコードブロックを素早く複製して編集できるため、反復的な作業を効率化できます。
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619840/e299129e-f826-5f4b-3fb9-bbb20a56dbd0.gif)

---

## 10. **コメントの追加・解除**  
**`Ctrl + /`**

現在の行または選択範囲をコメントアウト／コメント解除するショートカットです。この機能を使えば、コードの一部を一時的に無効化したり、コメントを追加する操作が素早く行えます。
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619840/41168cdd-c369-2243-3b6b-7fd1d442ce79.gif)


---

## まとめ

「塵も積もれば山となる」という言葉がある通り、ちょっとした効率化の積み重ねですが意外と馬鹿にならないと感じています。
環境構築不要でKubernetesを学習！

## はじめに

こんにちは。私はまだ最後まで受講できていないのですが、受講している中で楽しく学習ができており、役に立つと感じたKubernetesの講座を紹介します。

[Kubernetes Certified Application Developer (CKAD) Training | Udemy](https://www.udemy.com/course/certified-kubernetes-application-developer/?srsltid=AfmBOoqKfjna5zMvtwKdXbVXo1xKfif9X3hhDwKaYM60vqs07KGzNwz_)

## おすすめの理由

### その1: ハンズオンがブラウザ上で完結するため、環境構築が不要

Kubernetesの学習で大変な部分といえば、学習用の環境構築です。ローカル環境にKubernetesクラスタを構築するためには、[Rancher Desktop](https://rancherdesktop.io)や[Minikube](https://minikube.sigs.k8s.io/docs/)などのツールを使う必要があります。加えて、練習用のアプリケーションを作成した後は毎回クリーンアップする必要があります。

しかし、この講座ではブラウザ上で完結するハンズオン演習が用意されています。そのため、環境構築に時間を取られることなく、Kubernetesの学習に集中をすることができ、煩わしさがありません。

以下のサイトを利用して、ブラウザ上でKubernetesの操作を学ぶことができます（Udemyのコース内で詳細な手順が説明されています）。

https://kodekloud.com

### その2: 英語のリスニング力も鍛えられる

こちらは英語の講座のため、英語のリスニング力も同時に鍛えられるのは大きなメリットです。もちろん日本語の字幕も用意されているので、英語が苦手な方でも問題ありません。

ただ、Kubernetesの公式ドキュメントも英語で書かれていることが多く、日本語翻訳のページもありますが最新情報が反映されていないことなどがあるため、英語のスキル向上を兼ねて勉強できるのはとても良いと感じました。

### その3: Kubernetesエンジニアは需要が高い

Kubernetesはいろいろな企業で採用されているため、Kubernetesに関する知識やスキルを持つエンジニアは需要が高いです。

この講座は、Kubernetesの資格向けのトレーニングになっていますが、資格を取る取らないに関わらず、この講座を受講する価値はあると思います。

実際の求人を探すと様々な企業でKubernetesの技術が採用されていることが伺えます：

- [30,000 件の Kubernetes の求人 | Indeed (インディード)](https://jp.indeed.com/q-kubernetes-%E6%B1%82%E4%BA%BA.html?vjk=022df0646d41db06)
- [Flexible Kubernetes Jobs | Indeed.com](https://www.indeed.com/jobs?q=kubernetes&l=&from=searchOnDesktopSerp&vjk=ea69b94747a57785)
- [KUBERNETES 求人の転職・求人・中途採用情報【doda（デューダ）】](https://doda.jp/keyword/%EF%BD%8B%EF%BD%95%EF%BD%82%EF%BD%85%EF%BD%92%EF%BD%8E%EF%BD%85%EF%BD%94%EF%BD%85%EF%BD%93%E3%80%80%E6%B1%82%E4%BA%BA/)
- [「kubernetes」の求人 | LinkedIn](https://www.linkedin.com/jobs/search/?currentJobId=3978418383&distance=25.0&geoId=118424786&keywords=kubernetes&origin=HISTORY)


## まとめ

Kubernetesの学習を初めたい方におすすめのUdemy講座をご紹介しました。
GitHub から Azure に起票しよう

今年を振り返る「なんかかく」アドベントカレンダー 23 日目です。昨日の記事では [怪しい動きをするコネクタ](https://qiita.com/e99h2121/items/5693f418d24951ae02e8) を用いましたが、そういえばそれらを使ってワークフローを構築するための Logic Apps デザイナーは 2024、今年ちょっときれいになりました。

「新しい Azure Logic Apps Designer のご紹介： より速く、よりスムーズに、より確実に」

https://techcommunity.microsoft.com/blog/integrationsonazureblog/introducing-the-new-azure-logic-apps-designer-for-consumption-faster-smoother-an/4095261

上の記事自体は Mar 26, 2024 なので大分日も経ち、何をいまさらなのですが、Logic Apps 的に 2024 年すこし張り切ったと思われる 新しいデザイナー を紹介した記事を引用しつつ、便利情報をまとめてみます。issues 起票するの楽しいよ。

## 「どこでも同じデザイナー」

> 従量課金版の新しいデザイナーの一般提供により、サポートされるすべてのプラットフォームでデザイナー エクスペリエンスを統一しました。これは、Standard 版 Azure Logic Apps、Standard 版 Azure Logic Apps Visual Studio Code 拡張機能、および従量課金版 Azure Logic Apps のエクスペリエンスを網羅します。

## 「古いデザイナーを使いたい場合は？」

前略、「古いデザイナーを使いたい場合は？」

> What if I want to use the old designer?

> 新しいデザイナーが何らかの理由でお客様のニーズに合わない場合は、ご意見をお聞かせください。https://github.com/Azure/LogicAppsUX で issue を作成するか、laux@microsoft.com まで直接メールをお送りください。

> ただし、何らかの理由で旧デザイナーを使用したい場合は、今のところオプションとして残しておきます。デザイナーのコマンドバーから Enable Legacy Designer をクリックすることでアクセスできます。

(※ 注: Enable Legacy Designer は 2024 年 12 月現在既に除去されております。)

> また、何らかの理由でデザイナーへのアクセスに問題がある場合は、https://aka.ms/lafallback 。レガシーデザイナーは今後完全にサポートされることはありません。レガシーデザイナーを好まれる方のために、できる限りレガシーデザイナーをメンテナンスする予定です。

## UX の Issue を眺めてみよう

ということでデザイナーについてお気づきのことがあれば GitHub から issue を登録することができます。こちら。

https://github.com/Azure/LogicAppsUX



## Azure とか MicrosoftDocs とか色々起票できる 

というわけで、Logic Apps のデザイナーに限らず Azure に関するリポジトリは探索しがいがあります。

https://github.com/Azure/logicapps

https://github.com/Azure/azure-powershell

https://github.com/Azure/azure-cli

https://github.com/MicrosoftDocs/azure-docs

こんとりびゅーとしていきましょう。以上です～
とあるBoxerの一日 (激録！Boxer密着24時)

こんにちは！
2024年も、残すところ9日間となりました。早いですね！
今年の年末年始は、奇跡の9連休🙌という会社も多いのではないかと思います。
そうそう、年末年始あるあるといえば、テレビの特番をつけてのんびり過ごす、だったりしませんか？

というわけで (？)、強引な筋書き感は否めませんが、本日は年末特番 激録！Boxer密着~~24時~~ 8時間 (〜製品担当編〜) を、一足早くお届けします！

## 午前9時
この時間は、本社アメリカ側の製品チームもまだ働いていることが多く、定期的に会議を行ったり雑談したりしてコミュニケーションを図ります。

会議の議事録として使うのは、Boxnote。シンプルなUIでありながら、必要な機能はぎゅぎゅっと詰まっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951514/9e6a9107-3018-29c8-fca1-c00b6495dcda.png)


リアルタイムに同時編集可能で、画面を共有して同じBoxnoteを見ながら会議を進行すれば、お互いの認識やアクションアイテムを一緒に確認しながら会話を進めることができます。
お互いの言語が違う時はもちろん、同じ日本語を話しているからこそ、メモをとりながらの指差し確認が大事だなぁ、と思うこともしばしば。

今年は、BoxnoteにBox AIが搭載されたことにより、さらにパワーアップ！「あのプロジェクトはどうなった？」といったBoxnoteへの質問ができるほか、マークダウンに対応したコンテンツ（テキスト）生成もでき、ユーザーの日常業務をアシストしてくれます。

## 午後1時
さて、午後からは製品情報の整理をしようかな。
そういえば数ヶ月前に見たあのプレゼン資料、どこにあったっけ、、なんてこともたまにあります。

よくアクセスするコンテンツであれば、**コレクション**しておくのがおすすめですし、数日前にアクセスしたコンテンツであれば、**履歴**からアクセスする方も多いのではないでしょうか？履歴は、個人的にもとても重宝している推し機能❤️です！

もちろん、ウェブアプリからBox内を検索することもあります。そして、この検索画面は、今年ユーザーインターフェイスの機能強化が行われ、とても見やすくなりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951514/3d25cb08-645f-8982-75f8-fda1947d9479.png)

ファイル名/フォルダ名のみを検索できるようになったほか、特定のフォルダのなかで検索するときは、そのフォルダ内の検索をデフォルトで行う、など、地味ながらもユーザーエクスペリエンスを意識した機能強化となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951514/b1a7e8e7-363b-76ce-2c9c-af094bda042f.png)

## 午後3時
整理した製品情報を、他の社員が理解しやすいようBox Canvasで表してみよう。

Boxのコラボレーション機能やセキュリティを活用・維持したまま、気軽にお絵描きできる便利ツール、それがBox Canvasです。チームメンバーと一緒にアイディアを出し合ったり、フローチャートや相関図などを作成したりもできますし、シンプルに情報や考えを整理したりするときにも使えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951514/daa80705-f3a7-0fcc-81c2-e33acf38c938.png)

リアルの世界で、方眼紙やホワイトボードを持ち歩くのは大変だけれど、Box Canvasは、必要なときにサッと取り出せる上に、Canvas上で共同作業したり、そのまま社内外の人と共有することも、もちろんOKです！Box Canvasは、2023年6月の正式リリース以降、定期的に機能強化を積み重ね、日々進化を遂げています！
今後ともどうぞよろしくお願いいたします。

最後までお読みいただき、ありがとうございました！みなさま良いお年をお過ごしください！
郵便局apiを使ってみた。

import requests

url = "http://zipcloud.ibsnet.co.jp/api/search"

params = {"zipcode":"0000000"} 

response = requests.get(url,params,timeout=3)

print(response.text) 


リクエストモジュールをインポート。

webapiのアドレス

レスポンスにリクエストモジュールのget関数をつかってデータを入れる

郵便番号を7桁きっちりいれたらかえってくる。
データウェアハウスとは

## はじめに
データウェアハウス (Data Warehouse, 以下DWH) は、ビジネス利用に適した大量のデータを**分析しやすく、検索しやすくなるように蓄積した倉庫**を指します。
本記事では、データウェアハウスの概要、基本機能、メリットと課題、主要ツールや活用事例を解説します。

## DWHの概要

### データベースとの違い
データベースは、データの保存や編集など幅広い用途に対応しています。
対して、DWHはデータ分析に特化しています。各システムから時系列でデータを収集し、サブジェクト別に整理することで効率的な分析を実現します。

ビジネスデータが増大し、それらを有効に利用する需要が高まる中、データベースでは課題を解決しきれない場面が増えてきました。これを解決するために、DWHが開発されました。

## DWHの基本機能
DWHには満たすべき4つの機能があります
### データの統合
DWHは複数の部門のさまざまなアプリケーションから情報を集めます。しかし、集めた情報の内容や保存形式はバラバラであることが多いです。

例えば、異なるシステムで同じ顧客が登録されていると、データの重複が発生します。また顧客の情報を「取引先」として定義しているシステムと「会社名」と定義しているシステムがあったりと、項目の不一致も問題になります。

このような問題を解決するのがデータ統合です。表現の統一や重複の削除などにより、データの整合性を高めます。
データ統合の例としては下記が挙げられます。
- 日付：和暦・西暦の変換、JST・UTCの変換
- 文字列：大文字・小文字、整数・小数などの表記揺れの統一化
- 値：NULL・空、コード体系の統一化

### サブジェクト指向
サブジェクトとはデータの項目を指します。「顧客」や「商品」などです。
DWHでは「顧客」「商品」のように**分析の軸ごとにデータを集計し、蓄積したデータである「データマート」を作成します。**
これにより個々のシステムで保存されているデータを統合し、一つの集約されたデータとして扱えるようになります。

### 時系列
DWHでは、日々作成されるデータを、**その時点のデータ状態として保存します**
通常のデータベースでは、最新の状態を重視します。
例えば、ある顧客の会員ポイントの情報を取得する場合、基本的には一番最新の状態の情報のみを取得します。（過去の情報を取得する意味がないから）

一方DWHでは、その顧客が会員になってから現在に至るまでのポイントの推移をすべて保存します。現在の状態だけがわかるのではなく、現在の状態に至る経緯を把握できるため、ビジネスの意思決定に活かしやすくなります。

### 恒常性
蓄積されたデータは、変更せずに参照可能な状態で永続保存します。原則として、保存したデータは削除できません。これはDWHが過去から現在までのデータを時系列で記録し、履歴として活用するからです。
しかし、DWHのストレージ容量には限りがあります。容量が限界に近づいた場合は、保存期間が古いデータや重要性が低いデータを削除する運用を行うこともあります。
多くの容量が必要となるケースが多いため、クラウドのストレージサービス（AWS S3など）とは相性が良いです。

## メリットと課題

### メリット
ビジネス意思決定の支援: 統一されたデータにより、インサイトを添える分析が可能になる。
データの統合と一貫性: さまざまなシステムからのデータの統合が可能。
長期的データ利用: 過去データの分析・利用が容易。

### 課題
初期コスト: 構築に時間や資金がかかる。
データの複雑性: データ源が多様な場合の統合に要求されるスキル。

## 主要ツール

#### BigQuery (Google Cloud)

Googleのマネージド・サービスで、高速なクエリを実現するツール。

#### Redshift (AWS)

Amazon Web Servicesのサービスで、エンタープライズマネージド環境を搭載。

#### Snowflake

クラウドネイティブツールで、多様なクラウドプラットフォームに対応。

## まとめ
データウェアハウスは、ビッグデータを分析する際に欠かせない技術です。
読んでいただきありがとうございました！

## 参考記事
https://it-trend.jp/dwh/article/149-0001

https://www.youtube.com/watch?v=G7weKwUE6KY
【備忘録】map関数を用いた標準入力の失敗例、ついでにABC081Bを解いてみた。

# はじめに
本稿は、自分用に備忘録としてmapオブジェクトの取り扱いの失敗例を載せていきます。
~~それと同時に、標準入力でよく併用されるリスト内包表記についても軽く触れていきます。~~
（筆者は、記事を書き始めた当初、リスト内包表記の挙動がおかしいと勘違いしていた。）
特に丁寧な説明とかはないので、悪しからず。
実行環境：python 3.11.4


### リスト内包表記のメリット 
主に標準入力で使用する為、for文との比較になる。

①計算量が少ない。つまり、速い。
※.append()の実行速度が遅すぎる。~~yield文使えば良くね？？？~~

②コードがシンプルになる。
シンプルイスザベスト。



## 使用例０（失敗例）
```py
n = int(input())
li = [map(int, input().split()) for i in range(n)]

#出力１
print(li)
#出力２
print(list(li))
#出力３
print(*li)
#priny
```

n行m列の標準入力データの受け取りである。
気をつけて欲しいのだが、liの出力が全てmapオブジェクトになってしまう。

リスト内包表記の中で、map関数で直接受け取ったオブジェクトは、
何故かリスト型への変換も＊によるアンパックもできないみたいである。
~~と、筆者は勘違いしていた。~~


### 入出力例
>入力データ
2
5 3 4 
7 9 11 

出力
~~~
[<map object at 0x104fbace0>, <map object at 0x104fbac80>]
[<map object at 0x104fbace0>, <map object at 0x104fbac80>]
<map object at 0x104fbace0> <map object at 0x104fbac80>
~~~
実は出力例２を、print(list(li[0]),list(li[1]))とすると、普通に出力される。
要は上記のコードでは、listオブジェクトであるliをリスト化したり、アンパックしていたのである。
つまり、liはlistオブジェクトで、liの要素がmapオブジェクトだった為に、mapオブジェクトが出力される事態に至っていたのである。

##### list(map(int, ......))　← これ本当に大事。
皆様は、mapオブジェクトのリスト化をゆめゆめ忘れないように……

## 修正例
```py
n = int(input())
li = [list(map(int, input().split())) for i in range(n)]

print(li)
```
n行m列のデータの受け取り。上記の入力例から試してみると良い。

## リスト内包表記？
```py
n = int(input())
E = [0 for i in range(n)]
print(E)
```
１行n列の０ベクトルの生成。
変な利用方法だが、便利そうなので忘れたくない。


## ABC081Bの解答例
```py
n = int(input())
li = list(map(int, input().split()))
E = [0 for i in range(n)]
cnt=0

while True:
    #「liの要素のmod２と、Eの要素が等しいか」を判定。
    if list(map(lambda x: x%2, li)) != E:
        break
        
    cnt+=1
    li = list(map(lambda x:x/2, li))
    
print(cnt)
```
0ベクトルの利用例
[ABC081B](https://atcoder.jp/contests/abs/tasks/abc081_b)を参照。
受け取った標準入力をmap関数とラムダ式を用いて、リストの全要素が２で割り切れるかを判定するコード。
要は０リスト（０ベクトル）と渡されたリストの比較をしたかったのである。
その為、ラムダ式でリストの要素に作用させた。
着想はベクトルの一意性の利用。
>入力データ①
3
8 12 40

出力は2

>入力データ②
6
382253568 723152896 37802240 379425024 404894720 471526144

出力は8

## 後書き
以上、mapオブジェクトに二時間発狂し続けた悲しき男の備忘録でした〜

二重ループ回すより、綺麗に処理できてスッキリ！！！
参考になったら、幸いです。
##### mapオブジェクトのリスト化、忘れるんじゃねぇぞ……
Javaで「フレームを作成する」の動作を確認してみた

# 概要

Javaで「フレームを作成する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/tutorial/jframe/index1.html

# 実装

以下のファイルを作成しました。

```Sample.java
import javax.swing.JFrame;

class Sample{
  public static void main(String args[]){
    JFrame frame = new JFrame();
    frame.setTitle("MyTitle");
    frame.setVisible(true);
  }
}
```

以下のコマンドを実行しました。
```
$ javac Sample.java 
$ java Sample
```

実行結果は以下のとおりです。

![Screenshot from 2024-12-23 04-15-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/05a5c175-37ec-653b-bc71-b39c186cc2fc.png)

# まとめ

何かの役に立てばと。
APIについて学ぶときに使用したおすすめUdemy.1

# この記事について

この記事では、私がUdemyを活用して学習した中で特に役立ったコースについてご紹介します。特に、API構築やNode.jsに興味がある方、短時間で実践的なスキルを身につけたい方に向けて、このコースの内容や感想をお伝えします。

# コース紹介：Node.js入門 - Node.jsとMongoDBを連携してTodoアプリを１から構築してみよう


https://www.udemy.com/course/nodejs-mongodb-todoapp/?srsltid=AfmBOorekuNpYPhzg-ftgncI0flo57K5DSk02S7QQ4IYDALr3y1ViAz1


このコースでは、Node.js、MongoDBを使用してTodoアプリをゼロから作成します。
このコースでは、
	•	Node.jsの基礎
	•	Expressフレームワークの活用
	•	MongoDBとのデータベース連携
	•	HTTPメソッドの理解
という、基礎的な内容を学ぶことができます。
また、コース内ではただコードを書くのではなく、Expressでのリファクタリングやルーティング設計といった、より高度で応用の効く内容も学び身につけることができます ☺️

# このコースを選んだ理由
私はNode.js、Expressを使用してAPIについて理解を深めようとしていました。しかし、APIについて、何も理解していなかったため、とにかく多くの記事や講座を受けて手を動かすことを意識していました。そうしてさまざまな講座を受けていましたが、時間が長いことや、私が不器用なため途中で動かなくなってしまうことなど、続けることが困難になってしまい挫折することがありました。
「半分も受講していないのに、困難に直面して焦り、全くうまくいかずに挫折するのは時間ももったいないし、学ぶこともできずもったいない！」と思っていたとき、このコースを見つけて受講しました。
 
 　この講座は全体的に時間が短く、それでいて丁寧でわかりやすいです。私はすでに環境構築がある程度終わっていたため飛ばしてしまいましたが、VSCodeやNode.jsのインストールから丁寧に紹介しています。それでいてかなりきちんとしたTODOアプリを作成することができるため、基礎はこの講座でかなり身に付くかと思います。


# 受講後の感想

### 1. 初心者に優しいけれど充実の内容

APIやNode.jsに不慣れな私でも、手順通りに進めることでアプリを完成させることができます。動画内の説明は丁寧で、具体的なコード例とともに進むため、理解しやすかったです。特に、Expressを使ったルーティング設計や、データベースとの連携方法は基礎から応用まで学べました。ただ作成するのではなく、体系的に理解しながら進めることができたのはかなり良かったと思います。

### 2. 時間の効率性が抜群

約4時間という短時間であるにも関わらず、完成度の高いTodoアプリを構築することができ、達成感を得られます。他の長時間の講座では途中で挫折してしまうこともありましたが、このコースは短いからこそ最後までやり遂げることができました。私は1.5倍速で聞き、動画を少しづつ止めながら進めていました。

### 3. 応用の効くスキルが身につく

単純にコードを模倣するだけではなく、コードのリファクタリング方法や、ルーティングを考える際の設計思想を学ぶことができました。これらのスキルは他のプロジェクトでも活用可能だと思います。

# このコースをおすすめする人

このコースは以下のような方に特におすすめです！
	•	WebAPIを早く理解し、自身で構築したい方
	•	HTTPメソッドなど、APIの基本を短期間で身につけて他の講座や記事に活かしたい方
	•	実践的な学びを求めている方
	•	Node.jsやExpressの基礎を知りたい方


# まとめ
**「WebAPIを短時間で理解し自作しなくてはならない！」**
という方がいたら是非受けてみてください
私はこの状況だったため、とても助かりました😅
Udemyの「Node.js入門」講座は、短時間でNode.jsやAPI構築の基礎を学びたい方に非常におすすめの内容です。このコースを通じて得た知識は、他のプロジェクトにも応用可能で、これからの学習の土台を築くのに役立つと思います。短時間で勉強し、さらに他の講座などに繋げてください！私もこの講座で学んだことを活かして、さらに学んでいく予定です😁
一緒に頑張りましょう！
【TryHackMe】Introduction to Flask：Walkthrough

# 概要

TryHackMe「Introduction to Flask」のWalkthroughです。

https://tryhackme.com/r/room/flask

# Task2

## **Q1**.*Which environment variable do you need to change in order to run Flask?*

**A**.**FLASK_APP**

# Task3

## **Q1**.*What's the default deployment port used by Flask?*

**A**.**5000**

## **Q2**.*Is it possible to change that port? (yay/nay)*

**A**.**yay**

# Task4

## **Q1**.*Does Flask support POST requests? (yay/nay)*

**A**.**yay**

## **Q2**.*What markdown language can you use to make templates for Flask?*

**A**.**HTML**

# Task6

## **Q1**.*What's inside /home/flask/flag.txt ?*

`?name={{ get_user_file("/home/flask/flag.txt") }}`というパラメータを与えることで`/home/flask/flag.txt`を読み取れました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/9843846c-122a-cf7c-f8c5-a3e842740f06.png)

**A**.**THM{flask_1njected}**
学会においての緊張との向き合い方

# はじめに
皆さんは学会発表は緊張しますか？自分はめっちゃ緊張します。自分にはここに紹介できるような技術は持ってないため、学会での緊張に対しての考え方、向き合い方、(緩和法？)について個人的な持論を述べさせていただきます。割と当たり前のことを言っているかもしれませんがご容赦ください。Qiitaは初めて書くので読みにくいところもあると思いますが、よろしくお願いします。



# 緊張はするもの

まず、大前提として**緊張はみんなするもの**だと思ってます。発表上手いなと思う人も緊張はしてます。緊張の程度が違うだけです。なので、**緊張してることを恥ずかしく思わないでください**。自分だけ緊張してると思うと余計緊張します。



# 準備はやっぱり大事

そんなことかよと思うかもしれませんが準備がどれだけできるかはやっぱり緊張を緩和してくれる要素になります。 発表練習などの洗練はもちろん大事なことですが、それ以外にも会場を下見したり発表壇上からの景色を見ておくなどの準備も緊張を緩和してくれると考えています。特に自分は**リセットの視点**を準備することを心がけてました。これはハイキューで知ったのですが、ウォームアップの段階で視線を落ち着かせる場所を大まかに決めておいて、それをリセットの信号にして心を落ち着かせるというものです。準備はして損はないので、できるだけ準備はできるといいです。



# 高いハードルを設定しない

高いハードルを設定する人が中にはいます。例えば「絶対失敗しない」などです。自分は体育会系の部活に所属しチームスポーツをしていたのでそこでもよく「ノーミスで行こう」、「絶対後半は点を取らせるな」などと声掛けをするのを聞いたりしていました。実際、そのような高い目標設定をすることにより信念を持って行動できる人もいると思います。しかし、個人的にはこのような目標立てはよくないかなと感じます。なぜなら、ミスした時に全てが狂ってしまうと感じてしまうからです。ノーミス目標で一回でも噛んだり何かトラブルになった時にそこを臨機応変に立て直すことができれば大丈夫ですが、基本的にプランが崩れると頭が真っ白になったりします。なので、**簡単な目標設定にしましょう**。実現できそうな目標ならマジでなんでもいいと思います。自分は最初の学会の時は、パソコンを忘れないで持って行くとかを目標にしていました(笑)

簡単な目標設定でもクリアできればそれは成功体験になるため、その積み重ねが緊張をほぐしたりするかもしれません。



# 緊張は言葉に出す

緊張してる時にその気持ちを内に秘めてしまう人はいませんか？例えば、緊張してることを馬鹿にされるのではないか？または、緊張してる自分を緊張してないと思い込ませるために内に秘める人もいるかなと思います。個人的にはこれは悪手だと考えてます。なぜなら、この考えはデバフになるからです。

気持ちを抑え込めばこむほどそのことばっか考えるようになってしまい、肝心の発表に対して考えられなくなってしまいます。まずは**緊張してる自分を認めましょう**。そして**緊張してることを口に出して友達とかにでも伝えましょう**。悩み事と一緒で、話すことで気持ちが少しは楽になるものです。



# まぁ死ぬわけじゃない

学会に参加していれば、コテンパンにやられてしまうこともあります。そのような経験は緊張の種になってしまいます。自分も勉強不足が故に質疑応答でボコボコにされた経験があり、その次の学会ではまたあんなこと言われたらどうしようとナイーブになってすごく緊張したこともあります。そんな時に自分は、**まぁ死ぬわけじゃないしなぁ…と考えてました**。いくらボロカスにされたって、めっちゃ失敗したとしても死ぬことはないです。(心は別ですが…)
なので、**気楽に行きましょう**。自分も発表順が近づくとめっちゃ緊張してきますが、最終的にはこのスタンスで発表しています。



# まとめ

緊張について自分なりの考えをダラダラと述べさせていただきました。緊張は誰もがすると思ってますが、それでもあまり緊張しないと思ってる人は、**話しかけてあげるなど緊張してる人の気持ちを楽にしてあげてほしいです**。

また、緊張をよくする自分と同じ人は、自分の考えが何か参考になれば嬉しいです。



**最後まで読んでいただきありがとうございました**。
Mutableのわからんこと調べてみた

# Mutableのわからんことしらべてみた
MutableはUE5.5からリリースノートに乗るようになったキャラクターのカスタマイズを適用したスケルタルメッシュをランタイムまたは静的に作成するプラグインです！
まだまだできる事を把握しきれていないMutableですがいくつか個人的な疑問点についてしらべてみました。

2024のアドカレ用に作成した記事ですが、アドカレのスロットをうまく予約できていなかったので供養のために放流しますw

## リンク
- 公式ドキュメント
https://github.com/anticto/Mutable-Documentation/wiki
- 「Mutableをさわってみよう」@ docswell
https://www.docswell.com/s/EpicGamesJapan/KYDVLL-2024-12-09-095042


# 用語集
* CO = CustomizableObject
* COI = CustomizableObjectInstance
* CSC = CustomizableSkeletalComponent
* SMC = SkeletamMeshComponent

# 疑問点

## その1 : SkeletalMeshComponent(SMC)に対して一つのCustomizableSkeletalComponent(CSC)を設定するべき？

CSCにはComponentNameに指定されたノードを親のSMCに自動設定する機能があります。
一つしかMeshComponentノードが無い場合には問題ありませんが、二つ以上のMeshComponentノードを持ったCOがあるときどうなるのでしょうか？
↓こんな感じ
<img width="600" alt="aaa" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223804/5a6359db-ca9a-5ffe-ab79-f6146593d5ff.png">

下のコンポーネント構成のようにCSCはそれぞれのSMCに対して作成するべきなんでしょうか？
もしかするとComponentNameに設定されたメッシュだけが賢くインスタンス化されている可能性もゼロではないと思いました。
<img width="600" alt="b" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223804/40904c66-da9b-4f1f-b0cd-1e88ace44270.png">

### アンサー

**各CSCはComponentNameに指定されていないSkeletalMeshも生成します。**
上の例だと2つのSMCにぶら下がったそれぞれのCSCが2つのメッシュを生成するので、合計4つのメッシュが生成されますが、ComponentNameが一致していないメッシュは自動的には使われません。
生成したSkeletalMeshを無駄なく利用するために**利用したいCOIに対して一つのCSCがあるべきです。**

## その2 : 生成したスケルタルメッシュの取り出し

GetComponentMeshSkeletalMeshを使って生成されたSkeletalMeshにアクセスします。
※プロジェクトの仕様が決まっているならForLoopを回す必要はありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223804/5612a84d-fef0-554a-0a82-9a9e63448a61.png)

## その3 : アニメーションブループリントを扱えるの？

SkeletalMeshノードにはアニメーションブループリントをセットするプロパティがあります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223804/da2fd535-582d-66d4-9a48-d18587dedd87.png)

**このアニメーションブループリントは親のSkeletalMeshComponentに自動設定されません。**
そのため自分でABPを取り出して設定する必要があります。
ブループリントで処理するなら、以下のようなノードが使えると思います。
ComponentIndexは複数のMeshComponentがあるのであればループを回す必要があるかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223804/42241c2a-2dc1-159f-a45b-3b7711e9855f.png)

5.5の時点ではGetAnimBPやForEachAnimInstanceはComponentIndexを要求しますが、5.5のMutableではCSCのComponentIndexはDeprecatedにマークされていて、ComponentName版を使うようになっているのでおそらく今後インターフェイスが変更される気がします。。。

## その4 : SkeletalMeshに設定されたPostProcessABPはどう扱われる？

MeshComponentノードに設定されたReferenceSkeletalMeshのPostProcessABPがデフォルトで設定されます。
必要あらばその3のGetAnimBPを使ってオーバーライドしましょう。


# 今後調べたいこと
* テクスチャベイクの動作
* UVEditorとは テクスチャアトラスの扱い方
* グルームの扱い
* クロスの扱い
* タグやパラメータのような汎用的なデータも出力できるのか
文章がうまくかけないことに気づけました

# はじめに
とあるプロジェクトを進めていたときに、なんども言われて気づいたことがあります。

「何を聞かれているのか分からない」「何を答えていいか分からない」など、ISSUEや、仕様の記事について言われました。
また別の言いかたで、「解像度が低い」ということでした。

![photo_pinboke.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/6a7a49b1-0d52-dfd9-25e0-8dcfa7a90bb8.png)

## なぜ気づけたのか

- 仕様や、やることをドキュメントにして残す必要があったこと
- 確認すること、承認してもらうことがあり、Zoomで直接確認するより、Slackで確認することが多くなったこと

これまで会話でどうにかしていたことが、文章で伝える必要がおおくなったことで、気づけたことでした。

## こまった、どうにかしたい

業務に支障がでたので、解決しなければ！
だけど、どうしたらいいかわからない…

そんなとき、Qiitaは毎週・隔週で、1on1を複数のリーダーとできるので、相談して助けを求めました。

![medical_seishinka_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/cd2ae844-2250-ce32-4848-99857a735b8f.png)

そこで、何冊かおすすめされた書籍があります。
そのなかで、以下の2冊を読んで解決策をみつけることにしました。

### おすすめされた書籍

- 解像度を上げる――曖昧な思考を明晰にする「深さ・広さ・構造・時間」の４視点と行動法

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

- 数学文章作法 基礎編

https://amzn.asia/d/eqWTOfa

# さいごに

推薦図書の紹介で終わってしまった記事ですみません。

これも教えていただいたことなのですが、何かを人に伝えるとき意識することがあります。

それは、 **誰に** 、 **何を伝えたい** かです。

また、 **曖昧な表現を使っていないか** 、 **同じことを別のいいかたをしていないか** などもあります。

自分はそれができていないから伝わらないんだと思います。
おすすめされた書籍を読んで、言葉ではなく、文字で伝える力を身につけたいと思います。

![gutspose_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/4702bead-c096-76c9-9c94-a64510d7254c.png)

## お詫び

この記事は、誰に何を伝えたい記事なのか？

誰に：自分
何を伝えたい：文章にして書く練習

おすすめ書籍を少し読んでいるのですが、インプットだけではうまくならないため、アウトプットする必要があります。
なので、訓練のために書いています。
FourKeysとは何か？調べてみた件

## 前置き

開発関連の文献を読んでいたところ、FourKys(4Keys)について述べているものがありました。
お初に出会った言葉であったため、簡単に調べた備忘録です。

## 概要
・DORA(DevOps Research and Assessment)が6年間の研究をもとに提唱されたもの
・ソフトウェアデリバリーのスピードと安定性向上が目的
・4つの指標：
➡ デプロイの頻度、変更のリードタイム、変更失敗率、デプロイ失敗時の復元までの時間

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596363/6c8f2902-80e2-667a-bafc-9827892885f7.png)


## 重要性
・チーム状況を客観的に判断可能
・開発スピードと安定性の両立を測定
・生産性向上につながる

## 生産性向上のポイント
・健全な組織文化の確立
・ユーザー中心の開発
・質の高いドキュメント作成
・公平な仕事の配分
・クラウドインフラの活用

## 新たな指標：信頼性
・最近追加された5つ目の指標
・システムの信頼性がデリバリー頻度に影響
・オブザーバビリティの導入が有効
➡Four Keysは、開発チームのパフォーマンス向上と生産性改善に重要な役割を果たす

< 下記サイトを参考にまとめました>

https://newrelic.com/jp/blog/best-practices/what-is-four-keys

##  結論
・Four Keysは、ソフトウェア開発チームのパフォーマンスを測定し改善するための重要な指標システム
・指標を追うだけでなく、背後にあるチームのCapabilityと合わせて評価することが重要
・長期的に計測し、分析・改善を行う必要がある
・自動化できる部分は自動化し、継続的な改善を行うことが大切
・ただし、メトリクスの向上自体が目的化しないよう注意が必要
・「目指すべき姿（あるべき理想）」を明確にするため、「なぜ？」という問いかけが重要
Herokuでターミナルを使いたい

# きっかけ
Herokuでデプロイ時のmigrateや、デプロイ後のマイグレーションファイルの修正に伴い、migrateする必要が出てきた。

# 内容
テーブルのカラム名を変える必要がでたため、マイグレーションファイルを書き換えたが、マイグレートの方法が分からなくなった。
デプロイ時は、言われるがままにデプロイしていたため、どうやって初回のマイグレートをしたのかわからなかった…。

# 調べたこと
Herokuでマイグレートするには？

### １）HerokuCLIのインストール
HerokuCLIは、ターミナルでHerokuを操作できるようにするためのツール。
この公式さんの説明に沿ってダウンロードしてみてください。

https://devcenter.heroku.com/ja/articles/heroku-cli

自分がインストールしているかわからない…！
という方は、
```
heroku --version
```
と、ターミナルに入力してみてください。
以下のように、バージョンが表示されれば、インストールされています。
```
heroku/10.0.0 win32-x64 node-v20.17.0
```

### ２）ターミナルからHerokuにログイン
文字通り、ターミナルからHerokuにログインをします。
```bash
heroku login 
```
ここから、エンター等q以外のキーボードを押すと、外部ブラウザが表示され、ログイン画面に移行します。
ブラウザでログイン後、またターミナルに戻ります。

### ３）Herokuのbashを開く
ここまでくれば、あと少し！
次は、Herokuでターミナルを使うプロンプトです。

```bash
# Heroku上のアプリ名の指定がない方
heroku run bash

# Heroku上のアプリ名を指定したい方
heroku run bash --app （アプリ名）
```
これで、無事ターミナルが、Herokuのbashに切り替わったかと思います。
「Missing required flag app 」（＝どのアプリ使ったらええの？？）
こういうエラーが出た方は、--app （アプリ名）で、アプリを指定するといけます。
--appの代わりに、-aでもよさそう。

### ４）マイグレーション実行
ここまでくれば、あとは簡単。
```bash
php artisan migrate --force
```
これで、マイグレーション完了です。
ちなみに、--forceを付けることで、強制的にマイグレーションが実行されるみたいです。
（でも、その強制力って、どう活きるんだろう・・・）


---
ご覧いただきありがとうございました。
ほぼ独学な超素人プログラマーなので
内容や解釈に誤りがある可能性をご理解いただいたうえで、ご活用ください。

また、ご指摘・アドバイス・ご質問じゃんじゃんいただけますと幸いです。
AWS CDKのインストールとセットアップ

AWS CDK 再勉強の2日目は、インストールとセットアップの確認から始めます。
筆者は Python を利用することが多いので、Python を使って AWS CDK 始めるための準備から、初期プロジェクトの作成までを解説します。

# 準備するもの
## 必要なツール
AWS CDK を使用するために準備が必要なツールは以下の通りです。

 * Node.js(14.15.0以降)
 * npm
 * AWS CLI

また、 Python を利用するので、以下が必要です。

 * virutalenv を含む Python3.7
 * pip

そして、 AWS CDK 本体です。

### Node.js

AWS CDK は Node.js ランタイムで動作するため、最新版の Node.js をインストールしてください。
[Node.js](https://nodejs.org/)公式サイトからダウンロードできます。

### npm

Node.js に同梱されるパッケージ管理ツールです。
Node.js のインストールと一緒に利用できます。

### AWS CLI

コマンドラインインターフェースを使って AWS サービスを管理するためのツールです。
AWS CLI のインストール方法は [AWS CLI 公式ドキュメント](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html) をご参考ください。

### Python

[Python](https://www.python.org/downloads/)公式サイトからダウンロードしてインストールします。

### pip

PyPi で公開されている手順、インストーラを使用してインストールします。
https://pip.pypa.io/en/stable/installation/

### AWS CLI の設定

必要に応じて、 AWS CLI で AWS リソースの作成や操作ができるように設定をしておきます。
これには、環境変数の設定や ```aws configure``` コマンドの実行などを行います。

作業用 EC2 インスタンスを利用する場合は、EC2 インスタンスに割り当てられた インスタンスプロファイル(IAM ロール)を利用するケースも考えられますが、ここでは一例として、手元のラップトップなどのローカル環境で IAM ユーザーのシークレット情報を永続化させて使うケースを記載します。

使用するもの
 * IAM ユーザーのアクセスキー
 * IAM ユーザーのシークレットアクセスキー

実行するコマンド(対話形式なので ```aws configure``` を実行したら画面に従って入力していく)
```shell
$ aws configure
AWS Access Key ID [None]:  <IAM ユーザーのアクセスキーを入力する>
AWS Secret Access Key [None]: <IAM ユーザーのシークレットアクセスキーを入力する>
Default region name [None]:  <デフォルトリージョンを入力する。東京リージョンなら ap-northeast-1>
Default output format [None]: <実行後の出力形式を指定。>
```

これで AWS CDK を利用する下準備ができました。

# AWS CDKのインストール
AWS CDK をグローバルインストールするには、次のコマンドを実行します。
必要に応じて、```sudo```を付与して管理者権限で実行してください。

```shell
npm install -g aws-cdk
```

 * npm install は npm パッケージをインストールするコマンドです
 * -g オプションは、グローバルインストールを指定しており、AWS CDK を全システムで利用可能にします

インストール完了後、次のコマンドを実行して、正しくインストールされたかを確認します。

```shell
$ cdk --version
2.173.2 (build f8e6207)
```
記事執筆時点では、 2.173.2 が最新バージョンのようです。

# 初期プロジェクトの作成

AWS CDK の初期プロジェクトを作成するには、開発用に使うディレクトリへ移動してから、以下のコマンドを実行します。

```shell
cdk init app --language python
```

続いて、Python から AWS CDK のモジュールを参照するために、以下のコマンドを実行します。
こちらも、必要に応じて、 ```sudo``` をつけて管理者権限で実行してください。

```shell
pip3 install -r requirements.txt 
```

## ディレクトリ構造の解説

初期プロジェクト作成後には、次のようなディレクトリ構造が作成されます。
環境によってはないファイルやフォルダもあるかもしれませんが、末尾に * がついているものは基本的にあると考えてください。

```shell
test-cdk/
|-- app.py *
|-- cdk.json *
|-- .git/
|-- .gitignore *
|-- README.md *
|-- requirements.txt *
|-- requirements-dev.txt
|-- test_cdk
|-- tests
|-- .venv/ *
```

重要なのは以下の３ファイルです。

 * app.py: CDK アプリケーションのエントリーポイントです。このファイルにコーディングしていきます
 * cdk.json: CDK のコンフィグファイルです
 * requirements.txt: Python デプロイメントのパッケージ管理用ファイルです

# 動作確認
プロジェクトが正しく作成されたかを確認するために、以下のコマンドを実行します。

## cdk synth の実行

```shell
cdk synth
```

```cdk synth``` は、CDK スタックから CloudFormation テンプレートを生成します。初期プロジェクトを作成した時点で、**app.py** に基礎となるコードが書き込まれているので、このコードからテンプレートが生成できれば、設定が正しく行われているかを確認できます。

# まとめ
この記事では、AWS CDK を利用するための環境構築手順を解説しました。
次回以降は、AWS CDKの基本概念の理解や実際にコードを作成して、デプロイしていきます。
Rustマクロの事前知識④ 「聴診器 cargo-expand」


こちらの記事は [Rustマクロ冬期講習アドベントカレンダー](https://qiita.com/advent-calendar/2024/rust-macro) 5日目の記事です！

> アドカレまとめ記事はこちら！: [Rustマクロ作成チートシート！](https://qiita.com/namn1125/items/d601d2cbbf2cc7b5d3dc)

ここからRustのマクロを書いていくわけですが、「マクロを利用した部分が実際にどう展開されるか」はマクロを書く際に一番気になることでしょう。

というわけで何はともあれ、 [cargo-expand](https://github.com/dtolnay/cargo-expand) というツールを入れてください！

```bash
cargo install cargo-expand
```

https://github.com/dtolnay/cargo-expand

プロジェクト中でマクロを使用した際にどのように展開されるか教えてくれます。

```bash
cargo expand
```

例:

```rust:src/main.rs
macro_rules! awesome_macro {
    () => {
        let value = "展開される部分";
        println!("{}\nネストされたマクロについても全て展開される", value);
    }
}

fn main() {
    println!("マクロが全て展開された結果がわかる");

    awesome_macro!();
}
```

```rust:展開結果
$ cargo expand
    Checking project v0.1.0 (/path/to/project)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.07s

#![feature(prelude_import)]
#[prelude_import]
use std::prelude::rust_2021::*;
#[macro_use]
extern crate std;
fn main() {
    {
        ::std::io::_print(
            format_args!("マクロが全て展開された結果がわかる\n"),
        );
    };
    let value = "展開される部分";
    {
        ::std::io::_print(
            format_args!(
                "{0}\nネストされたマクロについても全て展開される\n",
                value,
            ),
        );
    };
}
```

筆者も自信ないのですが `format_args!` は特殊な事情でそのままになっています。。組み込み( `compiler built-in` )だからかな？

大規模だったり複雑なプロジェクトでは、モジュールを指定すると対象モジュールの展開結果のみ得られて便利です！

```bash
cargo expand 対象モジュールへの::パス
```

例:

```rust:Rust
macro_rules! my_macro {
    () => {
        const _: &'static str = "Hello, world!";
    };
}

mod a {
    mod very {
        mod deep {
            mod module {
                my_macro!();
            }
        }
    }
}

fn main() {}
```

```rust:展開結果
$ cargo expand a::very::deep::module
    Checking project v0.1.0 (/path/to/project)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.07s

mod module {
    const _: &'static str = "Hello, world!";
}
```

# まとめ

マクロを書く際に高頻度で使うことになるコマンド `cargo expand` を紹介しました！有効活用していきましょう！
緯度経度の桁数

# はじめに

[MapLibre Advent Calendar 2024](https://qiita.com/advent-calendar/2024/maplibre)、12/23の記事です！

GeoJSON形式のデータを扱うとき、緯度経度が小数点以下10桁以上であることは多いです。でも、xkcdで下記の画像を見て、実際どこまで必要なのか確かめたい、と思いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3960232/f61b3fb9-0315-4c7b-7a5a-9fbe802cf0f0.png)
[引用: https://xkcd.com/2170/](https://xkcd.com/2170/ "Coordinate Precision")

# 説明

こちらのcodepenで、確かめることができます。
https://codepen.io/tvizninja/pen/zxOwXXG

任意のGeoJSONを、HTML中のpreタグ内にペーストします。あとは、地図上のスライダを動かして、小数点以下の桁数を変化させます。下記は、小数点以下ゼロ桁、つまり整数値にした、日本地図です。本州と四国と九州がくっついた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3960232/0e3008d5-ee33-d0ab-1b65-dc002d66688a.png)

# おわりに

MapLibre固有の話じゃなくてごめんなさい！
でも、今回のテーマを思いついてから実現まで、あっという間にできたのは、MapLibreのおかげ！
ヘッドレスUIを使うとReactでアンマウント時のアニメーションを指定するのも簡単になる（場合もある）

## この記事の概要

Reactを使っていて、アンマウント時にアニメーションをさせたくなったことはありませんか？
そして、経験がある方なら「実現したい内容の割に面倒」ということには賛同していただけると思っています。

- 自前で用意する場合
    - アニメーションの制御やタイミング管理など、手間がかかる
    - 通常のコンポーネントをアニメーション用の処理でラップする必要などがあり、メンテナンスの負荷が高い
- ライブラリを使用する場合
    - 「このためだけにライブラリを入れるの？」という感覚が拭えない[^1]
    - ライブラリによるものの、バンドルサイズが増加する

[^1]: かなり感覚的な話ではありますが……経験上、あまり深く考えていない人がライブラリを入れたプロジェクトに後から参加した際、ライブラリが辛さのネックの1つになっていたことは多いです。もっとも、ライブラリ全般に言えることで、アニメーション系のライブラリに限った話ではないのかもしれませんが。

しかしながら最近流行りのヘッドレスUIを使用すると、実は元からアニメーションのための機構が用意されていることも多いです。

## 事例紹介

### React Aria

https://react-spectrum.adobe.com/react-aria/styling.html#animation

マウント時に`data-entering`、アンマウント時に`data-exiting`というdata-属性が付与されます。

### Radix UI

https://www.radix-ui.com/primitives/docs/guides/animation#animation

マウント時に`data-state="open"`、アンマウント時に`data-state="closed"`というdata-属性が付与されます。

注意するほどでもないですが、`data-state`は`"open" | "close"`以外の値にもなり得ます。
例えば[Checkbox](https://www.radix-ui.com/primitives/docs/components/checkbox#api-reference)では同じ`data-state`の名前で`"checked" | "unchecked" | "indeterminate"`という値になります。

### Ark UI

https://ark-ui.com/react/docs/guides/animation

マウント時に`data-state="open"`、アンマウント時に`data-state="closed"`というdata-属性が付与されます。

こちらもRadix UIと同様で、`data-state`は`"open" | "close"`以外の値にもなり得ます。

### Base UI

[2024年12月17日にアルファ版がリリースされたばかりのBase UI](https://base-ui.com/react/overview/releases#1-0-0-alpha-4)も、注目株として紹介しておきます。

https://base-ui.com/react/handbook/animation

マウント時に`data-starting-style`または`data-open`、アンマウント時に`data-ending-style`または`data-closed`というdata-属性が付与されます。

「または」と記載したのは、CSSトランジション用とCSSアニメーション用で付与される属性がわけられているからです。

特徴別にまとめると以下です。

| 役割・用途 | マウント時 | アンマウント時 |
| --- | --- | --- |
| CSSトランジション用<br>途中でキャンセルができる | `data-starting-style` | `data-ending-style` |
 | CSSアニメーション用<br>途中でキャンセルができず、最後まで実行される | `data-open` | `data-closed` |

## 扱い方

紹介したすべてのライブラリにおいて、マウント時・アンマウント時の制御が入っているのは一部のコンポーネントだけです。

例えば以下のようなものです。

- Dialog
- Modal
- Popover

いずれも、ボタン押下などではじめて出現し、画面から消えるまでで1つの役割といったインターフェースです。

こういった要素に対してアニメーションをつけたくなり、ヘッドレスUIを使っている（あるいはこれからの使用を検討している）場合「UIライブラリ側がアニメーションの機構まで用意してくれているかもしれない」という気持ちで調べてみると良さそうです。

書き方は多少違いますが、どれも共通して「マウント時とアンマウント時にそれぞれdata-属性が付与される」というものなので、どれか1つを使ったことがあれば他にもすぐ移行できると思います。

---

逆に「`Add`ボタンでToDoが増える、`Remove`ボタンでToDoが減る、その際のアニメーションをつけたい」といった要望であれば、元々備わっている機構では叶わないことが多いです。

この場合はライブラリを使うかアニメーションそのものを諦めるか、といった判断になるとは思います。
「手軽にアニメーションできる方法」に対する無いものねだり（？）をせずに済み、判断の変数を減らせると言えば減らせそうです。

銀の弾丸ではないですが「どこまでなら簡単にできる、どこからは覚悟を持つ必要がある」と分かるだけでも少しはメリットがあるかと思います。