OmniAICreator/Qiita-1.07M huggingface dataset:
開発者から見るプロダクトマネージャーカンファレンス 2024

# はじめに

プロダクトマネージャーカンファレンス(以下、pmconf)は、PdM向けの内容が中心ですが、自分自身がプロダクトマネジメントに興味があったため、試しに全てのセッション(計40本)を聞いてみました。

結果、プロダクトマネジメントを理解することで、開発そのものがより価値のあるものにできるヒントが多く得られました。本記事では、pmconf2024の紹介とおすすめのセッションを紹介したいと思います。

# プロダクトマネージャーカンファレンスとは

pmconfは、日本で2016年から毎年開催されており、この2024年で9回目の開催となります。プロダクトマネージャーという職種の認知を高め、プロダクトマネージメント業務に携わる人々が情報や意見を交換することで共に学ぶ場を提供することを目的として、企画されています。

募集人数は300人となっていますが、初年度から募集を大幅に超える応募があり、今年度もチケットが完売していました。しかし、2022年からはオンラインでの開催も始まり、本年度は1日目はオンライン開催によるセッション配信、2日目はオンサイト開催でワークショップ形式のOSTを中心に、参加型のコンテンツがメインになっています。

セッション配信はアーカイブもYoutubeで公開されているので、開催2週間後にはどなたでも閲覧することができるようになっています。
https://youtube.com/playlist?list=PL6pQufjCVYz_Ebrnkd-vU3RahZVRwTGmE&si=JSe8WOz208rU1S-h

# カンファレンス全体の印象とトレンド

オンライン開催のタイムテーブルは下記に記載されています。
https://2024.pmconf.jp/timetable/1205

pmconf2024は、プロダクトマネジメントを「Quest」するというテーマで開催されています。全体を通して、登壇者自身が担当されているプロダクトを開発する上での苦労や工夫したポイントを発表されていることが多かったように感じます。ただ、中にはプロダクトマネジメントからさらに踏み混んで、自分自身の色を出されている発表もあり、そこが面白かったです。明確なトレンドはありませんでしたが、やはりAIの活用事例やプロダクトに関する発表は複数ありました。

# おすすめのセッションの紹介

## ぜひ見てほしい
### プロダクトマネージャーの良い意思決定についてQuestする
https://youtu.be/_-kXsJCe7YY?si=9TV62nFP5arxCF4U
- プロダクト開発における「意思決定」に悩まれている方におすすめ

## 見てほしい

### 継続的にアウトカムを生み出しビジネスにつなげる、戦略と運営に対するタイミーのQUEST(探求)
https://youtu.be/bP65TX0bwb8?si=tieAvzUW3je9GXqo
- プロダクトのKPIの設定に悩まれている方におすすめ

### TimeTreeが経た3つの転換点 ー プロダクト成長過程でその時、その瞬間、何を考えてたか
https://youtu.be/PySrqdqDjUA?si=lEbSg78slcIqeaxL
- プロダクトが成長過程していく過程で行き詰まりを感じている方におすすめ

### 4000を超える顧客要望からプロダクトの未来を描いた話
https://youtu.be/WR6wHtSYC7w?si=KEEh6SX2doRvjP9t
- 膨大の顧客の要望から、どのようにロードマップを描けば良いか知りたい方におすすめ

### ストーリーテリングでチームに"熱"を伝える
https://youtu.be/cBcAmlBSmx4?si=dGN0xgKxxkPZyZX8
- 自分の仮説が周囲に響かないと悩んでいる方におすすめ

### プロダクトの爆速開発を支える、「作らない・削る・尖らせる」技術
https://youtu.be/bPAlEFORGZw?si=EE1F5CYzjWgGZTKJ
- 爆速のプロダクト開発を実現するために、作らない、を諦めない方法を知りたい方におすすめ

## できれば見てほしい

### 「使いたくなる」体験のつくりかた
https://youtu.be/yebA67mPIx8?si=9aQaoMuATYAH6qnT
- 昨日は充足しているのに、プロダクトが使われないと悩んでいる方におすすめ

### Amazon元本社PMが伝授！意思決定の質とスピードを上げる、ドキュメントの極意
https://youtu.be/QoJaJwv3G1s?si=GdbSA4Z8N4V-if6-
- プレゼンやドキュメント作成で書くことに悩まれている方におすすめ

### 届けきる使命 ―UXライティングがfreeeプロダクトに与えた影響―
https://youtu.be/xfkJaT2PjEE?si=ou988JAlD5NseQOT
- 説明率を30文字を変更するだけで、売り上げを2倍にしたライティングのコツを知りたい方におすすめ

## 大企業勤めの方に見てほしい
### 重厚長大なものづくり企業におけるプロダクトマネジメントの挑戦と苦悩
https://youtu.be/qxj07jq3Wq8?si=tH6B2-R34pdz6WmQ
- これから大企業でプロダクト開発組織を立ち上げる方におすすめ

### 異文化クエスト - ベンチャーPMが大企業とサービス開発したら大事なのは「メタ認知」だった話
https://youtu.be/8RZ5hAjtQuQ?si=jvVG275o4mjHu9cq
- ベンチャー企業との協業や、社内で新しい組織の立ち上げに苦労されている方におすすめ

# まとめ

今回のカンファレンスを通じて、PdM視点を取り入れることで、開発がより価値の高いものにできる可能性を強く感じました。

例えば、機能を作る際に『この機能がユーザーにどのような価値をもたらすのか？』を常に考えることで、単なる技術実装以上のものが生まれる可能性があります。また、PdMと開発者が共通の言語を持つことで、要件漏れやミスコミュニケーションを減らせると感じています。

もし、セッションを見た方がおられたら、ぜひ感想をシェアしてください！
GASを使ってPageSpeed InsightsのAPIにアクセスしてパフォーマンススコアを取得してみる（APIキー不使用）

## 概要

GASを使ってAPIキーを使わず、PageSpeed InsightsのAPIにアクセスしパフォーマンススコアを取得し、ログに出力してみる。

## 内容

1. 任意の名前でGASを作成し、下記のコードをそのまま記載

    ```js
    function getPageSpeedInsightPerformanceScore() {
      //const url = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=スピードを知りたいページのURL&strategy=desktop';
      const url = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=スピードを知りたいページのURL&strategy=mobile';
    
      try {
        const response = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
        
        const content = response.getContentText();
        const json = JSON.parse(content);
      
        if (json.lighthouseResult && json.lighthouseResult.categories) {
          const categories = json.lighthouseResult.categories;
          Logger.log('情報取得時間（UTC）: ' + json.lighthouseResult.fetchTime);
          Logger.log(categories.performance.score * 100);
        } else {
          Logger.log('Categories not found in response.');
        }
      } catch (e) {
        Logger.log('Error: ' + e.toString());
      }
    }
    ```

1. そのまま上記を実行

情報をフェッチした時間（UTC）とパフォーマンススコアが取得できる。
またlet urlのコメントアウトを切り替えることでデスクトップ側のスコアを取得する事もできる。※何も指定しないとデスクトップの情報を取得する。

例↓

![CleanShot 2024-12-24 at 23.10.29@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/cf4abdff-e77f-7b6c-2b20-5f34b700a8e5.jpeg)


## 参考文献

https://developers.google.com/speed/docs/insights/v5/reference/pagespeedapi/runpagespeed?hl=ja#parameters

https://developers.google.com/speed/docs/insights/v5/reference/pagespeedapi/runpagespeed?hl=ja#response

https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app?hl=ja

https://developer.chrome.com/docs/lighthouse/performance/performance-scoring?hl=ja

https://developer.chrome.com/docs/lighthouse/performance/performance-scoring?hl=ja#lighthouse_10

https://googlechrome.github.io/lighthouse/scorecalc/
「進捗悪いです」という言葉が出てきた時にマネージャーとしてできること

## この記事は何
日々朝会などでマネジメントしているメンバーの進捗を聞いていると「進捗悪いです」というワードが出てくることがしばしばあります。
このワードが出てきた時にマネージャーとして僕が判断し行なっていることをまとめます。

:::note
開発組織を想定して記事は書いていますが、開発タスク以外でも、開発組織以外でも参考にできる内容だと思っています。
それぞれご自身の組織に照らせ合わせながら読んでいただけると嬉しいです。
:::

## 進捗が悪くなる要因
コミュニケーションについて書く前に、まずはなぜ進捗は悪くなるのかの要因についてまとめたいと思います。
僕は、ほとんどの場合進捗が悪くなる場合は以下の三つのパターンに当てはまると考えています。

- 知識・経験不足
    - 例: タスクの中で出てきた問題が解決できていない
- 差し込みの発生
    - 例: タスク外のことを色々やっている
- タスクボリュームの見積りミス
    - 例: やることが思ったよりも多かった

これらの三つの要因に対して上手くチームの動きをキャリブレーションしていくことで、
進捗の回復を狙うことが主なアプローチになります。

## それぞれの要因に対してできるアクション
前項で挙げた要因に対して、チームとして取れるアクションは以下のパターンが多いかなと考えています。

### 知識・経験不足
知識・経験不足の場合は知っている人がサポートすればすぐに解決し、前へ進めることが多いです。
なので、このサポートにどれだけ早いタイミングで入れるかが重要だと考えています。
メンバーが何かしら自身で解決できない問題に遭遇している場合は

- その問題を解決できるメンバーが他にいないか
- 解決できるメンバーのキャパシティ的にサポートに入れるか

を把握し、問題を素早く取り除くことを狙います。

### 差し込みの発生
差し込みで進捗が悪くなっている場合は、その差し込みの対応を本当にその人がやらないといけないかを判断することが重要だと考えています。
メンバーが差し込みの対応に追われアサインされたタスクが上手く進められていない場合は

- 他のメンバーはキャパシティ的に余裕があるか
- 差し込みタスク/アサインされているタスクは他のメンバーでも対応可能か
- 差し込みタスク/アサインされているタスクは誰がやることで素早く進むか
    - 知識・経験的な観点
    - 逆に誰がやってもパフォーマンスが変わらないタスクか

を把握し、チーム全体でのタスクの分散、平準化を狙います。

### タスクボリュームの見積りミス
タスクボリュームがシンプルに多い場合にできることは、そこからできるだけ進捗を悪化させないこと、すでに進捗として深刻な場合は他のメンバーを当ててスピードを出せるかが重要だと考えています。
メンバーが想定よりもやることが多く進捗が悪くなっていることを把握した場合は

- 今他に持っているタスクはないか
- 対象のタスクは分割できるか
    - 他のメンバーと分担して対応ができるか

を把握し、チーム全体でタスクを分けて対応するか、対象のタスクに集中できる状態を作ることを狙います。

## 最後に
進捗が悪い時、そんなにやれることがたくさんあるわけではありません。
しかし、逆にいうと今回紹介したパターンを把握しておくと、チームとしての動きの判断もしやすくなると思います。
各メンバーの進捗が悪いかを把握するためには、正しく状況を把握できる必要もあります。
以前朝会で状況を把握し、チームのアクションの改善を行うために僕が行なっていることも記事にまとめているのでよかったら参考にしてみてください。

https://qiita.com/getty104/items/35ccb10ce660e7487ef8
解決のさらに上をいくために（後編）｜文章題で身に付くプログラミング思考入門️（20/25）

## はじめに

[前回](https://qiita.com/yuki_thewaggle/items/7f5c441a08308f143423)の続きです。
皿洗い問題について、真の解決策を探っていきましょう。

『文章題で身に付くプログラミング思考入門️』は、日常や文章問題からプログラミング思考を身に付けていく、簡単で身近で、あなたをちょっと輝かせてくれるシリーズです。

## これまでのまとめ

https://qiita.com/advent-calendar/2024/thewaggle

## 対象者
- プログラミングの考え方を学びたい人
- プログラミングに挫折したことのある人
- 論理的思考を鍛えたい人
- 文系の人
- エンジニアの思考を理解したい人


## 振り返り

表面的な課題
> 皿洗いをやりたくない

本当の問題
```
他の家族が団欒してリラックスしているのに、自分は家事をしている
```

解決しない解決策
> 【解決策】皿を使わないか、皿を洗わない

## 創造的解決

では、本当の問題がわかったところで、次回、創造的解決を考えていきましょう。

```
【問題】他の家族が団欒してリラックスしているのに、自分は家事をしている
```

これね、考え出すと奥が深いんですよね。

例えば「他の家族」って誰でしょうか？
親かもしれないし、子かもしれないし、パートナーかもしれないし、同居人かもしれないですね。
この時、パートナーは含むけど子は含まない、なんてこともあります。

同様に、「団欒」の定義って何ですか？「リラックス」って？「家事」って？

となっていくわけです。
そして、それをまた聞いて、分解し続けることによってわかった解決策が実は

```
【解決策】パートナーと一緒に皿洗いをする
```

だったりするわけです。
皿洗いをやりたくない、という話だと思っていたら、皿洗いをすることが解決になったりするんですね。

何が解決策になるかは人や状況や歴史、時代によります。本当にわからないわけです。

### ペルソナ

なので、システムや商品を作る上では **ペルソナ** を定めます。
この世にたった一人の、その人が本当に欲しがっている解決策を提案するんですね。

この解決策は、想像ではいけません。
ペルソナに会いに行って、ヒアリングをして、仮説検証をして、本当に課題が解決できたことを確認してから商品やサービスを販売するんです。

これだと、その人にしか売れない、と思いますか？
正直、そうかもしれません。
でも、どこかにいるだろう誰かに向けた商品やサービスは、もっと誰にも届きません。

逆に、どこかに本当にいる誰かが買ってくれる商品は、確実にその人を助けます。
そして、それを知った周りの人が、「自分の場合はこんな使い方できる」と想像して買ってくれたりするのです。

人間の想像力、創造力は最大の味方です。

### リバースエンジニアリング

最後に、ちょっとビジネスの観点を入れてみましょうか。
皿洗いを解決するための商品といえば、

- 食洗機
- 使い捨ての紙皿
- 汚れが落ちやすいお皿

などがありますね。
食洗機の始まりはどんなユーザーの声だったんでしょうか。
ここまでの創造的解決を逆から行ってみてください。面白い発見があると思いますよ。
これをリバースエンジニアリングと言います。

ちなみに、[Panasonicさんの食洗機開発秘話](https://panasonic.jp/dish/story.html)を見つけました。
諦めずに苦労や困難を乗り越えてきた先人たちのおかげで、今のテクノロジーがあるんですね。
本当に頭が下がります。

勉強するのに教科書や模範解答やお手本が必要だなと思いますよね？
同じことです。
上手くできているもの、上手くいったものを分解するのはとても勉強になります。

## まとめ
なぜなぜ分析、頭を使うので苦労しますが、コミュニケーション改善や課題解決をしたいと思ったらやってみてください。
大事なのは、本当の原因や強い因果関係を分析するために能力や道具を使う、ということです。

そして、プロジェクトが炎上する原因の大半は、コミュニケーションのミスによるすれ違いです。
ここもなぜなぜ分析が活躍するので、日常的に「なぜ？」を問う習慣をつけるととても助けになると思います。

次回は、ゲーム理論から紐解く課題解決について考えていきましょう。

## 最後に
ここまで読んでくださってありがとうございます！
よかったら「いいね」をください。続ける励みになります！
RPGゲームシナリオ　「北境の黎明」

## タイトル 「北境の黎明」
清朝末期の遼寧省。混乱の中、村の若者が困難な状況を切り抜けて英雄となるまでの物語を描く、小規模で濃密なストーリー。貧しい農村、腐敗した役人、異国の野望が交錯する中で、主人公は選択を迫られ、自らの信念を貫く。

## ゲームの舞台
### 村とその周辺

#### 主人公の故郷: 「遼雪村」
小さな農村で、農民たちが厳しい冬を乗り越えるために必死で働いている。貧しいながらも人々は互いに支え合っているが、最近は馬賊や山賊の襲撃が頻発し、村の安全が脅かされている。
#### 主要施設: 村長の家、鍛冶屋、交易所（商人が滞在）、祈りの祠。

#### 隣接する町: 「遼陽の市」
小さな交易都市で、商人や役人が集まる。役人の腐敗が進んでおり、村人からの搾取が問題となっている。密貿易を行う外国人商人やスパイも潜んでいる。

#### 主要施設: 市場、酒場、役所、宿屋。

### 周辺の危険地帯

馬賊の隠れ家: 山岳地帯にある砦。侵略的なロシア人や日本人と通じている可能性がある。
古い遺跡: 山中の封印された洞窟で、伝説的なアイテムや隠された文献が眠る場所。
密貿易ルート: 遼河沿いの隠れた道。怪しい商人たちが武器や情報をやり取りしている。

## ストーリーの概要
### 序盤: 生存への闘い
村に馬賊が襲来し、主人公の家族や友人が被害を受ける。主人公は村を守るため、武器を手に取り反撃を開始。
村の人々と協力して馬賊を撃退した後、馬賊が背後で外国勢力と通じていることを知る。

### 中盤: 真実を追う旅
馬賊の隠れ家や隣町を訪れ、情報を集める主人公。腐敗した役人たちに妨害される一方で、表向きは優しい日本人や狂暴なロシア人商人たちが関与していることが判明。

ロシア人の目的: 鉱山資源の支配と軍事拠点の確保。
日本人の目的: 友好的に振る舞いながらも、村や町の内部から浸透し侵略の基盤を築くこと。
主人公は選択を迫られる場面が増える。
### 終盤: 決戦と英雄への道
主人公は馬賊の首領を倒すか、あるいは外国勢力との密約を暴露することで、村を救う英雄となる。最終的に、村を平和に導くか、さらなる戦いに備えて立ち上がる選択が求められる。

## 主人公と周囲のキャラクター
- 主人公（プレイヤー）
遼雪村出身の若者。狩猟や農業で生活を支えてきたが、村を守るために行動を起こす。武器は農具や弓矢からスタートし、後に強力な剣や銃を手に入れる。

- 村長「張老爺」
村の長で、民衆に慕われているが、腐敗した役人への対抗策に苦慮している。主人公に期待を寄せる。

- 商人「李栄」
遼陽の市に拠点を置く交易商。情報通だが、金で動くため信用はできない。

- 山賊の首領「黄天虎（こう てんこ）」
遼寧の山中を拠点とする山賊団のリーダー。外国勢力と手を組み、地域を支配しようとしている。

- 日本人外交官「伊藤修平」
一見親切で信頼できる人物だが、裏では侵略計画を進めている。善良な日本人を装い主人公に近づく。

- ロシア人密輸業者「イワン・ペトロフ」
粗暴で貪欲なロシア人。軍事用武器を密輸しており、馬賊と取引をしている。

## ゲームの特徴とシステム
### 小さなマップ構成
村、町、山岳地帯、密貿易ルートの4つのエリアを中心に展開。短時間で全体を把握できる規模感。
各エリアで探索要素やミニイベントを追加してボリュームを確保。

### シンプルなバトルシステム
行動順が分かりやすいターン制バトル。
武器（弓、刀、銃）やアイテムを活用。
敵によって特性が異なり、戦略的に弱点を突く必要がある。
選択によるストーリー分岐
村人を守るか、自身の利益を優先するか、選択肢がストーリーに影響。
日本人やロシア人と協力するか否かでエンディングが分岐。
### 成長とクラフト
主人公は村で得た素材を使って武器を改良。
交易所で物資を売買し、新しいスキルを習得可能。
## エンディング案
### 平和の英雄エンド
村を守り抜き、役人や山賊、外国勢力の手を退ける。村人たちに感謝される結末。

### 力を得た覇者エンド
外国勢力や馬賊と手を組み、地域を支配する立場に立つ。

### 犠牲の代償エンド
村を守るために犠牲を払うが、最終的に主人公は村を去る。

### ゲームデザインのポイント
清朝末期特有の文化や雰囲気（服装、建築、音楽）を活かした演出。
限られたマップで、濃密な人間関係とストーリー展開を実現。
一見平凡な村や町の中に潜む「清朝末期の歴史の暗部」を描くことで、リアリティを加える。
TailscaleのログインIdPを変更するまで

# はじめに

この記事は、Qiita Advent Calendar 24日目の記事です。
以下の記事より、すべての記事をご覧になれます。

https://qiita.com/0_terarin_0/items/2b60d47a2d0e64a273c3

# 本編

実は僕のメインのOfficeサービスをGoogle WorkspaceからMicrosoft 365に変更したんですよね。
で、TailscaleのIdPを最初はGoogle WorkspaceでログインしていたのをMicrosoft 365に変更するようにしないといけなかったので、その手順を紹介しておこうと思います。

## サポートに連絡

https://tailscale.com/contact/support?type=sso

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/ef233429-9b3b-673a-e7c7-ff6c4ecceb1a.png)

上のようにサポートにIdPを変更する旨申請すると、サポートから１通、Queueに並んでいますっていうのが届きますが、それは直接は関係ないのでそのまま保管しておいてください。

## 新しいIdPでログイン

順番が回ってくると、サポートからメールが来ます。僕の場合は次のようなメールでした。

![Screenshot 2024-12-24 at 22.52.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/ea71dfb9-8447-81f6-8bc7-e5b259102097.png)

要約すると、「SSOのプロバイダーを変更したから、新しい方のプロバイダーでログインしてくれる〜？ヨロー」って感じのメールです。
向こうのプロダクトがどういう仕組みで動いているのかは全くわからないですが、どうやら申請した時のドメインとプロバイダーに紐づけて運営側で変更してくれているそうです。

## IdP、結構選択肢がある

Tailscaleはメールアドレスログインはなく、OIDCで別のIdPを使うことが前提になっています。使えるIdPは下のサポートのページに書いてあります。

https://tailscale.com/kb/1013/sso-providers

OIDCに対応してるってこれ結構すごいことやと思うんですよね。僕自身、Firebaseを使っていたのですけど、OIDCの設定めっちゃ楽だったんですよ。たとえば、LINEとかYahooのログインを実装する時は全部OIDCで設定しちゃえばたいしてFirebase側で新たに設定することなかったんですよね。

https://developer.yahoo.co.jp/yconnect/v2/

https://developers.line.biz/ja/docs/line-login/integrate-line-login/

https://developers.kakao.com/docs/latest/en/kakaologin/common

せっかくなので、OIDC（OpenID Connect）について少しだけ。OIDCとは、認証のフローについて決めた規格のことで、これがあるとOAuthのような細かい設定が必要なくなります。僕的にはこの企画が世界中に広まって欲しいぐらいの気持ちです。

https://financial.ctc-g.co.jp/itinfo/2402-oidc#:~:text=OIDC%EF%BC%88OpenID%20Connect%EF%BC%89%E3%81%A8%E3%81%AF%E3%80%81%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E9%96%93%E3%81%A7%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC,%E3%82%B7%E3%83%BC%E3%83%A0%E3%83%AC%E3%82%B9%E3%81%AB%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

IDaaSのFirebase AuthenticationはOIDCのIdPに対応していてこれの認証めっちゃ楽だったのですごい好印象でした。（逆に、MicrosoftとかFacebookってめっちゃめんどくさかった記憶）

# 最後に

このようにIdPを変更するっていうパターンは結構稀かもしれないので、参考になるように記事に残しておきました。🥳
来年はこの認証系の勉強もしていきたいと思います。
Nixを導入しようとして失敗するまで

# はじめに

この記事は、Qiita Advent Calendar 22日目の記事です。
以下の記事より、すべての記事をご覧になれます。

https://qiita.com/0_terarin_0/items/2b60d47a2d0e64a273c3

# 本編

皆さんはNixをご存知でしょうか？

https://nixos.org/

システム全体（グローバル）にも各リポジトリごと（ローカル）にも開発環境を用意できる素晴らしい機能だそうです。（という認識です）今回アドカレのネタが尽きてしまったので中途半端に手を出したのも運の尽き、瞑想劇を残しておきたいと思います。

## インストールの方法

インストールは下記の公式ホームページに情報が書いてあります。

https://nixos.org/download/

が、これを使わない方がどうやら良さそう。代わりに、下のサイトにあるスクリプトを使う方がいいらしいです。

https://zero-to-nix.com/start/install/

```zsh
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install
```

この時点で僕は「ややこしい」って思っています。

## 使い方（グローバル）

Flakesを使う前にまず最初にチャンネル登録（おそらくリポジトリという意味）が必要なので、チャンネル登録をしましょう。

```zsh
nix-channel --add https://nixos.org/channels/nixpkgs-unstable

nix-channel --update
```

パッケージのインストール自体は`nix-env`というコマンドを使うそう。

```zsh
nix-env -i "package"
nix-env --install "package"
```

で、この時にインストールしたいパッケージは`nix-env -qa`で探すそう。

```zsh
nix-env -qa "package"
```

アップデートの時は
```zsh
nix-env -u "package" #特定のパッケージをアップデート
nix-env -u #全部アップデート
```

これだそうです。なんで`nix-env`と`nix-channel`を分けたのでしょうか。

# 感想

正直重いしHomebrewでいいような気がします。が、LinuxとMacを共通のリポジトリで管理できたらいリポジトリ以外にあるものも管理できたりっていうのはすごいいいような気もしますので、食わず嫌いはやめて、来年はちょっとFlaksにもチャレンジしてみたいと思います。

# 最後に

今回改めてNixを調べてみたけどむずい、NixOSって恐るべしって感じ。
FVMがいつのまにかPubから独立していた話

# はじめに

この記事は、Qiita Advent Calendar 21日目の記事です。
以下の記事より、すべての記事をご覧になれます。

https://qiita.com/0_terarin_0/items/2b60d47a2d0e64a273c3

# 本編

以前Flutterを用いて開発していたアプリがありまして、そちらはFVMでFlutterを開発していました。

https://fvm.app/

FVMは、Flutterのバージョンを管理してくれるツールで、元々はPub経由で僕はインストールしていました。しかし、この度新しく環境を用意しなおさないといけなくなったため、新たにFVMをインストールしようとFVMのホームページを見ると、、、。見事に変わっているじゃないですか！

## Mac/LinuxでのFVMの入れ方

MacとLinuxの場合、マニュアルでのインストールまたはHomebrewでのインストールの２種類があります。

### マニュアルでのFVMのインストール

```zsh
curl -fsSL https://fvm.app/install.sh | bash
```

### HomebrewでのFVMのインストール

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

## WindowsでのFVMの入れ方

Windowsの場合、chocoが必要です。

```zsh
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
choco install fvm
```

## 使い勝手

使い勝手は以前のものと変わらないですが、これでFlutterの生存の有無に関わらずFVMが使えるようになりました。ちなみに、僕はFVMを使う時にいちいち```fvm flutter```と入力するのはとてもめんどくさいので、僕はZSHでAliasを設定しています。

```zsh
alias "flutter"="fvm flluter"
alias "dart"="fvm dart"
```

ぜひ参考にしてみてください！

# 最後に

今回は、少し軽めの記事になりましたが、FVMにつれて触れてみました。そういえば、LinuxでHomebrewって使ったことないなぁ、、、。
配列、スライス

## はじめに

A Tour of Goについて勉強になった箇所をまとめる。

### 配列

・```[n]T```で型```T```のn個の配列を表す
・固定長である

```Go
package main

import "fmt"

func main() {
	var a [2]string
	a[0] = "Hello"
	a[1] = "World"
	fmt.Println(a[0], a[1])
	fmt.Println(a)

	primes := [6]int{2, 3, 5, 7, 11, 13}
	fmt.Println(primes)
}
// Hello World
// [Hello World]
// [2 3 5 7 11 13]
```

### スライス

・```[]T```は 型```T```のスライスを表す
・可変長である
・```a[low : high]```により```low```と```high```の境界を指定することでスライスができる。最初の要素は含むが、最後の要素は除く


```Go
package main

import "fmt"

func main() {
	primes := [6]int{2, 3, 5, 7, 11, 13}

	var s []int = primes[1:4]
	fmt.Println(s)
}
// [3 5 7]
```

配列への参照で、スライスの要素を変更するとその元となる配列の対応する要素が変更される

```Go
package main

import "fmt"

func main() {
	names := [4]string{
		"John",
		"Paul",
		"George",
		"Ringo",
	}
	fmt.Println(names)

	a := names[0:2]
	b := names[1:3]
	fmt.Println(a, b)

	b[0] = "XXX"
	fmt.Println(a, b)
	fmt.Println(names)
}
// [John Paul George Ringo]
// [John Paul] [Paul George]
// [John XXX] [XXX George]
// [John XXX George Ringo]
```

スライスは長さのない配列のようなものとして使える

```Go
package main

import "fmt"

func main() {
	q := []int{2, 3, 5, 7, 11, 13}
	fmt.Println(q)

	r := []bool{true, false, true, true, false, true}
	fmt.Println(r)

	s := []struct {
		i int
		b bool
	}{
		{2, true},
		{3, false},
		{5, true},
		{7, true},
		{11, false},
		{13, true},
	}
	fmt.Println(s)
}
// [2 3 5 7 11 13]
// [true false true true false true]
// [{2 true} {3 false} {5 true} {7 true} {11 false} {13 true}]
```

上限または下限を省略することができる。既定値は下限が0で上限はスライスの長さ。

```Go
package main

import "fmt"

func main() {
	s := []int{2, 3, 5, 7, 11, 13}

	s = s[1:4]
	fmt.Println(s)

	s = s[:2]
	fmt.Println(s)

	s = s[1:]
	fmt.Println(s)
}
// [3 5 7]
// [3 5]
// [5]
```
CSS（というかSVG）でボックスに斜線

CSS Advent Calendar 2024 にCSSの三角関数を使って斜線を引くというネタからのインスピレーションを受けて、最終日が空いていたので、CSSというかSVGでボックスに斜線を引く芸を紹介します。

https://zenn.dev/fraim/articles/6501d8f8842a7c

基本的な仕組みはボックスの`background-image`に以下のような斜線を描いたSVGを指定するという単純なものです。

```xml:diagonal-line.svg
<svg
  xmlns="http://www.w3.org/2000/svg"
  viewBox="0 0 1 1"
  preserveAspectRatio="none"
>
  <path
    d="M0,0L1,1"
    vector-effect="non-scaling-stroke"
    stroke="black"
  />
</svg>
```

この程度のシンプルなSVGならCSSに埋め込んでも問題ないでしょう

```css
.diagonal-line {
  background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1 1" preserveAspectRatio="none"><path d="M0,0L1,1" vector-effect="non-scaling-stroke" stroke="black"/></svg>');
}
```

[シンプルなデモ](https://ksk1015.github.io/diagonal-line/0.html)

ポイントは
`preserveAspectRatio="none"`
`vector-effect="non-scaling-stroke"`
の2つの属性です。

## preserveAspectRatio="none"

この属性はSVGを表示するとき縦横比の保持をさせない、つまり、元の縦横比を無視してサイズに応じて表示されるようになります。

https://developer.mozilla.org/ja/docs/Web/SVG/Attribute/preserveAspectRatio

この属性によってボックスのサイズいっぱいに斜線を表示してくれるようになります。

[preserveAspectRatio="none"の有無のデモ](https://ksk1015.github.io/diagonal-line/1.html)

## vector-effect="non-scaling-stroke"

この属性はオブジェクトのstrokeの幅をサイズに応じたスケーリングをさせないというものです。

https://developer.mozilla.org/ja/docs/Web/SVG/Attribute/vector-effect

この属性によってSVGデータの元サイズより縮小・拡大しようとstrokeの幅が一定に保たれます。

[vector-effect="non-scaling-stroke"の有無のデモ](https://ksk1015.github.io/diagonal-line/2.html)

## まとめ

以上がSVGを使って斜線を描く基本です。あとは `stroke`, `stroke-width`, `stroke-opacity`, `stroke-dasyarray`等を使って各々お好きな斜線を描いて素敵なクリスマスにしてください！メリクリ！

[SVGでボックスに斜線を描くシミュレーター](https://ksk1015.github.io/diagonal-line/3.html)
Amiga用MicroPython

# MC68000にあこがれていた頃

Amigaが発表されたのは1985年。当時は MC68000 にあこがれていたものの、搭載PC御三家にはどれにも手が出ない貧乏な大学生でした。

![スクリーンショット 2024-12-24 22.31.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/4f969d42-e3be-f27e-ba7e-1671103bfa8f.png)

# 気の迷いから A500

今年に入って、ちょっと Amazon で目にはいったことから　A500 を買ってしまいました。これは Amiga 500 をミニゲーム機として復刻したものです。

![スクリーンショット 2024-12-24 22.34.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/67c7b729-ca1b-33be-3893-dd04c6a3d380.png)

![スクリーンショット 2024-12-24 22.38.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/6066ba9d-013c-844d-d82e-62fd1408cb82.png)

中では ARM Cotex-A53 で Linux を動かして、その上で Amiga エミュレータの Amiberry を動かしていました。

![スクリーンショット 2024-12-24 22.39.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/b177c049-18a2-1f85-a54e-f2ab74744602.png)

# 結局、Amiberry

ということで、Mac 上の Amiberry で時々遊んでいます。ちょっと前に X で流行ったメキシカンハットも Amiga の BASIC でやってみたりしてました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/51f2316f-f025-1fd5-a32c-87681bed0217.png)

# MicroPython が Amiga に移植されたとの話が

そんなとき、[MicroPython が Amiga に移植された](https://commodore-news.com/news/item/12678/en/desktop)とのニュースが。

github のサイトは[ここ](https://github.com/jyoberle/micropython-amiga)。

さっそく Amiberry 上で動かしてみました。AmigaOS 3.1 の Amiga Shell 上で amp コマンドを実行することで動かせます。

![スクリーンショット 2024-12-23 22.47.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/a4000813-80be-d043-7d4e-cd9349045555.png)

まだ移植途中とのことで、Amiga 特有の機能はぜんぜん使えません。今後に期待したいところですが、8月にリリース以降、変化がないのはちょっと気になります。
解決のさらに上をいくために（前編）｜文章題で身に付くプログラミング思考入門️（19/25）

## はじめに

皿洗い、好きですか？
誰がやるかで揉めたことありませんか？

実は、こういう日常の問題こそ「創造的解決」の出番です。

『文章題で身に付くプログラミング思考入門️』は、日常や文章問題からプログラミング思考を身に付けていく、簡単で身近で、あなたをちょっと輝かせてくれるシリーズです。

今回は皿洗いをテーマに、解決のさらに上を行く、創造的解決策について考えてみます。
「言われた通りやりました」は、本当の解決にならないことが多いです。

## これまでのまとめ

https://qiita.com/advent-calendar/2024/thewaggle

## 対象者
- プログラミングの考え方を学びたい人
- プログラミングに挫折したことのある人
- 論理的思考を鍛えたい人
- 文系の人
- エンジニアの思考を理解したい人

## 皿洗い問題の構造を考える

問題は定義されて生まれ、解決に向けて動き出す。ということで問題を定義してみましょうか。

### 問題の定義

皿洗いは、生きていく上で避けて通れないタスクですね。
では、なぜ問題になるのでしょうか？そこにはこんな理由があるかもしれません。

- 皿洗いをやりたくない
- いつも同じ人が皿を洗っていて不公平
- 皿洗いの時間が取れない

他にも色々あるでしょう。
社会的、感情的、機能的。語りきれない複雑な理由が隠されているはずです。

### 解決策

さて、では問題を解決しようと思ったら、どんな解決策が思い浮かびますか？

- 皿洗いをやりたくない
    - 【解決策】皿を使わないか、皿を洗わない
- いつも同じ人が皿を洗っていて不公平
    - 【解決策】公平に分担する
- 皿洗いの時間が取れない
    - 【解決策】皿洗いの時間を減らすか、なくすか、作るか、人に頼む

こんな感じの解決策が思いつきますね。
これは問題を裏返した解決策です。

これで解決できるなら十分です。
でも、現実はそう上手くいかないですよね。

「今日担当でしょ！さっきもお皿洗ってって言ったじゃん！」
「後でやるよ！」

そうです。私たちにはさらに上をいく、圧倒的な解決策が必要なのです。

### 本当の問題

みんなが納得できる解決策を見つけるには、そもそも本当の問題は何なのかを見つけ出すことが大事です。

- 皿洗いをやりたくないのはなぜ？
- いつも同じ人が皿を洗うのが不公平なのはなぜ？
- 皿洗いの時間が取れないのはなぜ？

**なぜなぜ分析** という言葉を聞いたことがあるでしょうか？
「なぜ？」を繰り返す中で、根本的な原因や、課題に結びつく因果関係を見つけるアプローチのことですね。
品質管理の道具としては、**フィッシュボーン図** などもよく似た考え方です。

日本人は、振り返る力に長けていると私は思います。
深く深く振り返って分析することによって解決策を導く、というやり方も有効です。

**大事なのは、本当の原因や強い因果関係を分析するために能力や道具を使う、ということです。**
道具も使いようです。どう使うかによっては、単なるなまくらにしかなりません。

さて、やってみましょう。
例えば、こんな感じでしょうか。3回なぜを繰り返してみましょう。

- 皿洗いをやりたくないのはなぜ？
- → 面倒だから。それはなぜ？
- → 食べたあとはゆっくりしたいから。それはなぜ？
- → 他の家族と同じように、団欒してリラックスしたいから。

といった具合ですね。すると本当は、

```
他の家族が団欒してリラックスしているのに、自分は家事をしている
```

という状況が問題なのではないか、という仮説が立てられるわけです。

この問題に対して、

> 【解決策】皿を使わないか、皿を洗わない

という解決策を提示しても、そりゃあ解決しないわけです。
例え皿洗い問題が解決されたとしても、一人だけ家事をしていて他の家族は団欒している、という状況がどこかで再現してしまう可能性がありますから。
シーンが切り替わっただけで、根本的原因が解決されない限り、また悪さをしてしまう可能性があります。

ここで、創造的解決の出番です。

## 次回、創造的解決

では、本当の問題がわかったところで、次回は創造的解決を考えていきましょう。

## 最後に
ここまで読んでくださってありがとうございます！
よかったら「いいね」をください。続ける励みになります！
git commit時に開くvimでAIコミットメッセージをぶっ放す 

どうもてぃ。

本日は私の息子の3歳の誕生日です:tada: 
とてもめでたいので、久しぶりにアドカレを書くことにしました。
ゆっくりしていってね。

## 導入
世には既にいろんなAIライブラリ・プラグインがはびこっています。
そして、私もAIなしでは生きていけない身体になっています。
コミットメッセージについても、AIライブラリが存在します。
例えば

https://github.com/Nutlope/aicommits

この子は結構有名みたいですね。

ただ、普段Tigを使ってコミット時にVimを開きメッセージを書き込んでいる身としては活用できないのです。

Tigの使い方は以下をどうぞ。

https://qiita.com/vivid_muimui/items/7e7a740e6537749de0c0

その節はとてもお世話になりました（今もたまにお世話になってます）。

普段のコミットのやり方としては...
1. tigでstageを確認
2. ファイル差分を見てadd
3. addしたものをコミット
4. vimが開きコミット

という順になっています。

最後の **vimが開いたタイミングでAIにコミットメッセージを書いてほしい！** 
そう思っているTig使いの方々、いませんか？

私は思ったので作りました。

## やりたいこと
タイトルの通り。
**git commit時に開くvimでAIにコミットメッセージを挿入してもらう** です。

## 結論
作りました。

https://github.com/motty93/ai-commits-message

すべてやり方は `README.md` に書いてます。

もしわからなければコメントください。

一応動作gifを張っときますね。

<img src="https://raw.githubusercontent.com/wiki/motty93/ai-commits-message/images/ai-commit-message-demo.gif">

脳死で `:AICommitMessage` すればコミットメッセージを書いてくれるようになりました。

### 改善点

ファイルの差分が多すぎると `OpenAI からのレスポンスがありませんでした。`と表示されちゃいます。
そもそもコミットするときは分割して細かくコミットが基本だと思うので、めったに起きることはないのですが、ディレクトリをrenameしたりすると結構差分がでてしまいます。
現状は不便感じないのですが、うっとうしければ修正しようかなと思ってます（プルリク大歓迎です）

## おわりに

当日急ぎ記事を書いたので超絶雑になりました。
反省してます。
来年の息子の誕生日はちゃんと前もって記事を書こうかなぁと思いました（小並感）。

今年もお疲れさまでした。 
良いAIコミットメッセージライフをば。
とある自動化の「あるある話」

# はじめに
これまでに様々なテストの自動化を実施してきました。その中で自分が遭遇した、とある「あるある話」をご紹介したいと思います。

# RPA を入れたがコーディングがベストと気づく
テストを自動化したい！そうした時に真っ先にハードルになるのがコーディングです。 Python など様々なスクリプトがありますが、コーディングスキルに自信がない。そうしたとき、RPA に代表されるローコード、ノーコードソリューションは魅力的です。

RPA による自動化は、使いこなせるととても便利ですが、使えるようになるまでのハードルが意外と高かったりします。いざ機能を使おうと思ったら追加のライセンスが必要だったり、また使い始めると欲しい機能がなかったりなど。

また複雑なテストをしようとすると RPA 内で結局コードコードを書く必要がでてきたりします。それが独自言語の場合学習コストが高く、いろいろと検討した結果やはり Python などのスクリプトが良いという結論になるあるあるがありました。

# コーディングに没頭し脇道にそれる
RPA がダメならスクリプトということで、コーディングを始めると楽しくなってきて、いろいろなことをしたくなってきます。すると本来の目的である自動化を忘れてスクリプトそのものに没頭するパターンがあります。

例えば自動化した結果をログに書き出す際、自分の好みのフォーマットで書き出すような関数を作ったとします。するとそれを一般化してみようとクラスにしたり、他の関数で使おうとデコレーターにしたりなどなど。

またはすでに用意されているモジュールが気に入らず、自分独自実装のモジュールを作ったり、rich などを使って妙に表示にこだわってみたり。そうこうしているうちに自動化が大幅に遅れるというあるあるがありました。

# そして完成した自動化が解読不能で結局使われず
そうこうしているうちに、本来の自動化を思い出し、凝りに凝ったコードで自動化を完成させます。するとあまりにもコードが凝り過ぎていて難解なコードとなります。

自分では芸術作品を作ったような気持ちになりますが、他の方からするともっとシンプルに書けば良いものをと思われたりします。そしてカスタマイズが難しくなり自分が担当から外れた途端に使われなくなる、というあるあるがありました。


# 終わりに
こうした経験から、テスト自動化ではシンプルなツール、柔軟性のあるツール、属人性を排除できるツールがとても重要だと思っています。T-DASH はこれまでに何度か試用したことがありますが、GUI ベースの日本語ローコードソリューションのため、こうした懸念が少ないソリューションだと思っています。今後 T-DASH のようなソリューションがさらに普及すると良いなと思います。
ABC347Eを解いた【累積和】


筆者はレート800前後の茶～緑コーダ

ABC347のE問題を解いていく
    
https://atcoder.jp/contests/abc347/tasks/abc347_e

# 実装コード

各クエリでの集合の要素数を記憶して累積和

各数列の要素が集合に入っていた区間を記憶して累積和から区間和を求める

```python:main.py
from bisect import bisect_left, bisect_right, insort_left, insort_right
from collections import defaultdict, Counter, deque
from itertools import product, accumulate, groupby
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rI1(): return (int(sys.stdin.readline().rstrip())-1)
def rLI1(): return list(map(lambda a:int(a)-1,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

d = defaultdict(deque)
def main():
    N, Q = rLI()
    X = rLI1()
    s = set()
    v = 0
    Y = [0]
    V = [0]
    A = [0] * N
    for i, x in enumerate(X):
        d[x].append(i)
        if x in s:
            s.remove(x)
            v-=1
        else:                           
            s.add(x)
            v+=1
        Y.append(Y[-1]+v)
        V.append(v)
    # err(V)
    # err(Y)
    for k,q in d.items():
        # err(k,q)
        a = 0
        while q:
            if len(q) >= 2:
                j = q.popleft()
                v = Y[q.popleft()] - Y[j] 
            else:
                v = Y[-1] - Y[q.popleft()]
            # err(k,a,v)
            a+=v
        A[k] = a
    print(*A)
    
if __name__ == '__main__':
    main()

```

# まとめ

手順が複雑で難しそうだったが
クエリごとではなく数列の各要素に着目すればシンプルに解けた

物事の視点を変える重要性を感じる問題だった。
FTPサーバー構築でAWSマネージドサービスに苦しめられ助けられた話

この記事は朝日新聞社Advent Calendar2024の最終日の記事です。
昨日の記事は加藤さんの[【SwiftUI】iOS 15でListのSection上部に余白が生じないようプリミティブに対処する](https://qiita.com/takumus21/items/bc32248d1012c837a60b)でした。

### はじめに
こんにちは。朝日新聞社で紙面ビューアーの開発を担当している新山です。
今回はAWS Transfer Familyを使ったFTPサーバーの構築の際に頭を悩ませた話です。

### 構成

朝日新聞紙面ビューアーでは電子ブック作成のためのシステムがあります。2024年3月にこのシステムを社内ネットワーク上のオンプレサーバーからAWSへ移管しました。
その際に、構築の時間短縮かつ可用性を保つために自前でFTPサーバーを構築するのではなく、AWSマネージドであるTransfer Familyを使用してFTPサーバーを作成しました。
超ざっくりと以下のような感じです。

![Web application hosting diagram example - Web application hosting diagram example (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620207/21c5a0c1-57cc-711d-70b8-24afd3bc4586.png)


### 問題の発生

動作確認も済ませ、いざ疎通テストの段階で「FTPは繋がる(ログイン等はできる)もののレスポンスが返ってきません」とのことでした。

#### 原因
新聞制作システムで使用されていたFTPクライアントが原因でした。
新聞制作システムからのアクセスはaliasレコードを利用して、2つのNLBにランダムに振り分けられる想定だったため、PassiveIPには`0.0.0.0`を記述しておけばいい感じにやってくれると思っていたのですが、[Transfer Familyのドキュメント](https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/API_ProtocolDetails.html#:~:text=%E5%BF%85%E9%A0%88%EF%BC%9A%E3%81%84%E3%81%84%E3%81%88-,PassiveIp,-FTP%20%E3%81%8A%E3%82%88%E3%81%B3%20FTPS)にある、`全てのFTPクライアントがサポートしているわけではありません`を都合よく読み飛ばしていたのです。。。
```ドキュメントからの引用.
ただし、すべてのFTPクライアントが PassiveIp=0.0.0.0 レスポンスをサポートしているわけではありません。 FileZilla また、WinSCP が対応していることに注意してください。他のクライアントを使用している場合は、そのクライアントが PassiveIp=0.0.0.0 応答をサポートしているかどうかを確認してください。
```
その上、手元での動作確認の際は新聞制作システムと別のFTPクライアントを使用していたことで発覚が遅れてしまいました。
念の為、新聞制作システムのFTPクライアントを変更できないか聞いてみたものの、もちろん難しいとのことで対応を考える必要がありました。

#### 対応

以下の構成とすることで無理やりマルチAZのNLB×Transfer Familyの組み合わせを実現しました

![Web application hosting diagram example - Web application hosting diagram example (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620207/8dc19d18-a736-e2bf-c2a0-6e569b53cac5.png)

CloudWatch Insighsを用いてNLBの状態を監視して、これを起点にDNSのフェイルオーバー(フェイルバック)とFTPサーバーのパッシブIPをLambdaで書き換えるという方法をとっています。パワー解決です。
Route53 フェイルオーバールーティングとCloudWatch Insightsに頼って何とか解決できました。


### 終わりに

今回の経験から以下の事項は改めて意識しておかねばと実感しました。
- ドキュメントはきちんと読むこと
- たとえ手元での動作確認であっても実際の環境に可能な限り近づけること
- クライアントの制約を意識すること
    - 新聞制作系システムは比較的古いシステムであること
- ドキュメントはきちんと読むこと

また、AWSマネージドサービスの制約に苦しめられたものの、AWSマネージドサービスに助けられており便利さを実感する形となりました。

以上、朝日新聞社 Advent Calendar 2024 の最終日の記事でした。ご覧いただきありがとうございました。
【未経験からIT業界へ】オンラインスクールと技術コミュニティを活用して転職した話

## はじめに
はじめまして！ゆうざんと申します。私はデータラーニングスクールに入学し、同時にそのスクール内の技術コミュニティにも所属することで、未経験からIT業界への転職を実現しました。今回の記事では、私の入学前後の状況から、勉強・課題の取り組み方、コミュニティとの関わり方、そして転職後にいただいた初めての仕事のお話を共有したいと思います。
同じように他業種からITへ転身を目指されている方、あるいはこれからスクールやコミュニティ参加を検討されている方の参考になれば嬉しいです。


## 入学編
### 他業種からの転職を見据えた入学
私はもともとITとは全く無関係の業界で働いていましたが、キャリアの軸を見直したときに「ITスキルは今後ますます必須だ」と考えるようになり、思い切ってIT系オンラインスクールに入学しました。
### 転職までの道筋がとても立てやすい
オンラインスクールに入る前は「そもそも何から学んだらよいのか？」と右も左もわからない状態でしたが、スクールでは転職までのロードマップが明確に示されていました。自力で独学するのとは雲泥の差と感じます。目標達成までに必要なステップが具体的なので、モチベーションを維持しやすかったです。


## 課題・勉強編
### 最短ルートの指導
スクールでは、業界経験のある講師やメンターによる指導が受けられます。たとえば書籍やネット情報を片っ端から調べるやり方でも習得はできますが、どうしても回り道しがちです。講師陣が提示してくれるカリキュラムは、時間に制約がある社会人や転職希望者にとって本当にありがたいものでした。
### カリキュラムのボリューム
カリキュラムは想像以上に多く、「本当に全部終わるの？」と焦ることもよくありました。しかし「これを学んでおけば、転職時に武器になる」という内容がしっかり詰まっています。ただし、いざ転職して働き始めるとそれでもやっぱり全然足りないという事実にも直面しました（笑）。仕事に就いてからが本当の学習スタートと痛感しています。
### 課題提出と勉強ペースの両立
スクールには課題の提出期限があり、そのペースに合わせなければなりません。私はほぼ未経験からのスタートだったので、勉強ペースを大幅に上げる必要がありました。最初は「勉強しなきゃ…でも提出間に合わない！」のループで大変でしたが、習慣化してしまうと意外にもテンポよく進められるようになりました。


## 技術コミュニティ活用編
### 初めはただ「皆さんのやり取りを拝見する」日々
オンラインスクール内の技術コミュニティや勉強会で飛び交う専門用語は、未経験の私には馴染みがありませんでした。最初は「何の話をしているんだろう？」と傍観するだけ。でも、一つひとつの単語やフレームワークなどを調べる癖をつけると、自然と知識が増えていきます。
### イベント・発表を観たり聞いたり
コミュニティでは、定期的にLT会（Lightning Talk）や勉強会、発表会などが催されます。初めのうちは内容が高度すぎてよくわからないことも多かったのですが、理解できそうなテーマはチェックして、後から復習するようにしていました。
### 点と点が繋がり、解像度が上がる
勉強を継続して転職活動をし、実際に転職したことで経験が少しずつ積み重なっていくと、「あれ？この話って以前コミュニティで見聞きしたのと同じだ！」という瞬間が増えていきます。これはテンションが爆上がりしますよね。
### もっとイベントに飛び込めばよかった
振り返ると、コミュニティが主催するイベントにもっと参加しておくべきだったと反省しています。萎縮せず飛び込めば得るものは多いはず。とはいえ今からでも遅くありません。次の機会があれば積極的に関わるよう心がけています。


## 転職して初めていただいた仕事編
### 原発での画像識別に関わる案件
転職後、最初に携わった仕事は意外にも原発関連の画像識別案件でした。AIや画像処理といった分野のプロジェクトだったのですが、私はプロジェクトの途中からアサインされたため、コア部分の開発作業は既に完了していました。それでも、先輩エンジニア達にコーディングの手ほどきをして頂いたりと、沢山ご教授いただきました
### UIの作成と他業種とのコミュニケーション
私に残されていた業務内容のなかには、エンジニアや研究者だけでなく、ITとは全く別分野の方ともやり取りをしながら要件を固めて実施していくものがありました。原発に赴き、実際の環境を確認するという貴重な経験もさせてもらいました。
初対面の方々と調整することが苦ではなかったのと、逆に未経験だからこそ少しでも貢献できる部分に飛びつく姿勢は、チームにも好評だったようです。私の運が良かっただけの話かもしれませんが、IT未経験は不利ですが、それでもカバーできない問題ではないんだなと思いました。

## まとめ
まだ転職して3ヶ月ほどですが、**「この分野で頑張ろう！」**と決意し、日々学習を続けています。まだまだ駆け出しで、常に新しい技術や知見が出てきますが、コミュニティやQiitaを活用することで仲間と共有・発信し合う環境があるのは本当にありがたいことです。


•オンラインスクール：転職までの道筋を明確に示してもらえる
•技術コミュニティ：勉強した知識をさらに拡張し、人とのつながりを得られる
•転職後：未経験でも学びながらプロジェクトに貢献できる


これからもQiitaやデータラーニングギルドで学びを深め、いつかは私自身が発信者として貢献していきたいと思っています。もし興味を持たれた方がいれば、ぜひ一緒に学んだり、コミュニティのイベントでお会いしましょう！

## 最後に
この記事が、これからIT業界への転身を考えている方や、オンラインスクールやコミュニティ参加を迷っている方の後押しになれば幸いです。最後まで読んでいただき、ありがとうございました。
24日目: MasterTreeを実装する

[競プロ用ライブラリを作る Advent Calendar 2024](https://qiita.com/advent-calendar/2024/yukkku-ribitol)の24日目です.

https://qiita.com/advent-calendar/2024/yukkku-ribitol

# MasterTreeって?

皆さんは[遅延伝搬反転可能乱択平衡二分木](https://nyaannyaan.github.io/library/rbst/lazy-reversible-rbst.hpp)を知っていますか?
これと同じノリで思いつく機能を片っ端から盛り込んだ最強データ構造を作ります.

列に対して以下のことを全部$O(\log N)$でします.

- 複製する
- 指定された位置に指定した値を挿入する
- 指定された位置の値を削除する
- 2つの列をくっつける
- 列を指定した位置で2つに分割する
- 指定された区間のモノイドの総積を求める
- モノイドに遅延伝搬可能な写像を指定した区間に作用させる
- 列を前後反転させる

# 仕組み

[LazySegmentTree](https://qiita.com/Yukkku/items/9e658f3bd95ffeabaa7b) + [BinaryTree](https://qiita.com/Yukkku/items/781baa053aac580d3098) + [Persistent SegmentTree](https://qiita.com/Yukkku/items/c5c6e39e84b2302cdce6) + 他色々の知識を全部合体させます.

[BinaryTree](https://qiita.com/Yukkku/items/781baa053aac580d3098)ではWeight Balanced Treeというもので平衡させましたが, 操作の種類が多くて証明が大変なので, ここではRBSTという別の方法を使います. (元ネタの[遅延伝(略)木](https://nyaannyaan.github.io/library/rbst/lazy-reversible-rbst.hpp)と同じ方法です)

「全部の頂点が当確率で根になる」というもので, 例えば要素数$N$の木と要素数$M$の木をマージすると, $N/(M+N)$の確率で要素数$N$の木の根だった要素が, $M/(M+N)$の確率で要素数$M$の木の根だった要素が新しい木の根になるようにします.

```rs: とてもふわっとしたサンプルコード
fn merge(left: Tree, right: Tree) -> Tree {
    if rand() < left.size() / (left.size() + right.size()) {
        // 左側の木の根を新しい木の根に採用 (左の木の右の部分木でマージを行う)
        left.subtree.right = merge(left.subtree.right, right);
        return left;
    } else {
        // 右側の木の根を新しい木の根に採用 (右の木の左の部分木でマージを行う)
        right.subtree.left = merge(left, right.subtree.left);
        return right;
    }
}
```

実質平衡条件が存在してないようなもので, 考えることが減るので機能を増やしやすいです.

# 実装

- [`mastertree.rs`](https://github.com/Yukkku/ribitol/blob/main/src/mastertree.rs)

やってしまいましたね. 800行くらいあります.

# まとめ

いかがでしたか?

明日はライブラリの混沌を治めます.
WordPress で REST APIが無効化されていた時にやったこと

WordPressで有名なTCDのテーマ (zoomy_tcd067) を導入しているサイトのstripeの改修作業をさせていただいておりましたが、Webhookがうまく機能しませんでした。

![スクリーンショット 2024-12-24 22.39.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65992/34abd57e-45b1-ece4-a7d8-204be88ef8c7.png)

最初原因が何にあるかわからなかったんですが、
テーマを変更すると、エラーにならなかったことから、テーマに依存していることがわかりました。
その後、/wp-content/themes/zoomy_tcd067/functions/membership/frontend.php に見つけたのです。

```PHP
/**
 * 未ログインの場合にREST APIで使える機能を制限
 * 参考 https://nendeb.com/541
 */
function tcd_membership_rest_pre_dispatch( $result, $wp_rest_server, $request ){
	$namespaces = $request->get_route();

	if ( current_user_can( 'read' ) ) {
		return $result;

	// /oembed/1.0
	} elseif ( strpos( $namespaces, 'oembed/' ) === 1 ){
		return $result;

	// /jetpack/v4
	} elseif( strpos( $namespaces, 'jetpack/' ) === 1 ){
		return $result;

	// contact form 7 (Ver4.7～)
	} elseif( strpos( $namespaces, 'contact-form-7/' ) === 1 ){
		return $result;
	}

	return new WP_Error( 'rest_disabled', __( 'The REST API on this site has been disabled.', 'tcd-w' ), array( 'status' => rest_authorization_required_code() ) );
}
add_filter( 'rest_pre_dispatch', 'tcd_membership_rest_pre_dispatch', 10, 3 );
```

このコードがあることで、無効化されているようでした。
なので、

```PHP
remove_filter('rest_pre_dispatch', 'tcd_membership_rest_pre_dispatch');
```

ということをさせていただきました。

これがセキュリティ的に、いいか悪いかで言えばおそらく悪いので、
他にいい方法があれば教えていただきたいです🙇‍♂️🙇‍♂️🙇‍♂️
画像処理の基本用語集

## はじめに
画像処理を理解する上で必要不可欠な用語をまとめました。

## 1. 画像の基本構造

### ピクセル (Pixel)
- デジタル画像を構成する最小単位
- 1つのピクセルは色情報を持つ
- 画像の解像度は「縦×横のピクセル数」で表現

### 解像度 (Resolution)
- 画像の細かさを表す指標
- 例：1920×1080は横1920ピクセル、縦1080ピクセル
- DPI（Dots Per Inch）：1インチあたりのドット数

### ビット深度 (Bit Depth)
- 1ピクセルあたりの色情報量
- 8bit：256段階（0-255）の値を表現可能
- 24bitカラー：RGB各8bitで約1677万色を表現

## 2. 色空間

### RGB
- Red（赤）、Green（緑）、Blue（青）の3原色
- 加法混色：光の三原色
- デジタルディスプレイでよく使用される

### HSV/HSL
- Hue（色相）、Saturation（彩度）、Value/Lightness（明度）
- 人間の色の感覚に近い表現
- 画像編集やコンピュータビジョンでよく使用

### グレースケール
- 白黒の濃淡のみで表現
- 0（黒）から255（白）の256段階
- 画像処理の前処理としてよく使用

## 3. 基本的な画像処理操作

### 二値化 (Binarization)
- グレースケール画像を白（1）と黒（0）の2値に変換
- 閾値を設定して判別
- 文字認識や物体検出の前処理として重要

### フィルタリング
- 画像にフィルタを適用して特定の効果を得る処理
- 主な種類：
  - ぼかし（平滑化）
  - シャープネス強調
  - ノイズ除去
  - エッジ検出

### ヒストグラム
- 画像の明るさや色の分布を表すグラフ
- 画像の特徴を把握するのに役立つ
- コントラスト調整などに使用

## 4. 画像の前処理テクニック

### 正規化 (Normalization)
- データの範囲を一定の区間（例：0-1）に変換
- 機械学習の前処理として重要
- 異なる画像間の比較を容易にする

### リサイズ
- 画像のサイズを変更する処理
- 補間方法：
  - 最近傍補間
  - バイリニア補間
  - バイキュービック補間

### アフィン変換
- 画像の幾何学的変換
- 主な操作：
  - 回転
  - 拡大・縮小
  - 平行移動
  - せん断

## 5. 特徴抽出

### エッジ検出
- 画像内の輪郭線を検出
- 代表的なアルゴリズム：
  - Sobelフィルタ
  - Cannyエッジ検出
  - Laplacianフィルタ

### コーナー検出
- 画像内の特徴的な点（コーナー）を検出
- 主なアルゴリズム：
  - Harrisコーナー検出
  - FAST
  - SIFT/SURF

### テクスチャ解析
- 画像の模様や質感を数値化
- 統計的特徴量の抽出
- パターン認識に利用

## 6. 実践的な応用例

### ノイズ除去
- 画像に含まれる不要なノイズを軽減
- 手法：
  - メディアンフィルタ
  - ガウシアンフィルタ
  - バイラテラルフィルタ

### 領域分割（セグメンテーション）
- 画像を意味のある領域に分割
- 手法：
  - しきい値処理
  - 領域成長法
  - K-means法

### 物体検出
- 画像内から特定の物体を検出
- 主な手法：
  - テンプレートマッチング
  - HOG特徴量
  - 深層学習（CNNなど）

## 7. 画像処理ライブラリ

### OpenCV
- オープンソースの画像処理ライブラリ
- 多言語対応（C++, Python, Javaなど）
- 豊富な機能と高速な処理

### PIL/Pillow (Python)
- Pythonの標準的な画像処理ライブラリ
- 基本的な画像操作に最適
- 扱いやすいAPI

### scikit-image (Python)
- 科学技術計算向けの画像処理ライブラリ
- NumPyとの親和性が高い
- アルゴリズムの実装例として学習にも最適

## まとめ

画像処理の基本用語について解説しました。これらの概念は、より高度な画像処理やコンピュータビジョンを学ぶ上での基礎となります。

初心者の方は、まずはこれらの基本概念をしっかりと理解し、実際にコードを書いて試してみることをお勧めします。特に、OpenCVやPILなどのライブラリを使って実践的に学習を進めると、理解が深まります。
SQLのBooleanの値の書き方

SQLAlchemyを使って勉強する機会があって、つまづいたときのメモです。

１．Booleanを扱いたい(エラーなく通ったコード)

```python
def insert_event():
  DB_URI = "~~"
  db_engine = create_engine(DB_URI,  pool_pre_ping=True, echo=True)
  setup_db(db_engine)
  with create_session(db_engine) as ssn:
    with ssn.begin():
      incident = Incident()
      incident.system_name = "勘定"
      incident.incident_flg = False
      ssn.add(incident)
insert_event()
```

２．間違った指定方法
   String扱いになる書き方をしていた。
   ```python
      incident.incident_flg = "False"
      incident.incident_flg = "0"
   ```
   このときのエラー
   ```
      raise TypeError("Not a boolean value: %r" % (value,))
　　　sqlalchemy.exc.StatementError: (builtins.TypeError) Not a boolean value: 'False'
   ```
   ```
      raise TypeError("Not a boolean value: %r" % (value,))
　　　sqlalchemy.exc.StatementError: (builtins.TypeError) Not a boolean value: '0'
   ```
Pokyとは？

ある環境の構築の際にpokyという単語が登場し、その理解が今一つだったため情報をまとめ理解を促すことにする。

Pokyとは
> You will use Yocto Project to build a reference embedded OS called Poky.

リファレンス組み込みOSというものに該当するようです。

https://docs.yoctoproject.org/3.1.5/brief-yoctoprojectqs/brief-yoctoprojectqs.html

https://qiita.com/AngryMane/items/61d2fa47246a9f9217f5

> Yocto Project が提供する poky では、ターゲットマシンで動作するイメージと呼ばれるファイル群を構築するツール bitbake が提供されています。
bitbake は、レシピと呼ばれるソフトウェアを構築する際に必要なデータが記載されたファイルを指定して実行します。レシピ及び、構築を行うディストリビューションやマシンの設定ファイルは、レイヤーとしてまとめられて配布されています。
Poky では、OpenEmbedded Project で開発されて、今は共同で開発・保守を行っている openembedded-corre と呼ばれる基本的なソフトウェアを収集したレイヤーと、Yocto Project で提供する参照（実装例として提供）レイヤーとして、pokyディストリビューションを定義する meta-poky と BSP の実装サンプルとして meta-yocto-bsp の 3 つのレイヤーを提供しています。

https://www.lineo.co.jp/blog/yocto/vol05-startYP01.html

![IMG_E2615.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/1971bfc7-02a6-59d9-3514-27ecf2d3747c.jpeg)

図解するとこんな感じ？
bitbakeで実行役でレイヤー(meta-pokyなど)を参考にしながらソフトウェアの構築を行う。
Nest.jsのModuleとは

# はじめに
Nest.jsを触る機会があるものの基礎を理解せず触っていたため、よくわかっていない部分を再確認していきます。今回はModuleについて。

# Moduleとは
関連する機能をグループ化し、アプリケーションの構造を整理するための単位。

各アプリケーションには少なくとも1つのルートモジュールがあり、依存関係の解決の開始点となる。一般的には、複数のモジュールを使用して機能を整理・呼び出す。

## 定義方法
`@Module()`を使って定義する。`@Module()`は1つのオブジェクト（モジュールの設定を記述したプロパティを持っている）を受け取る。

- `providers`:  Nest injector によってインスタンス化され、Module 内で共有される
- `controllers`: Module で定義された Controller
- `imports`: Module で使用する Provider をエクスポートしている他の Module
- `exports`: Module 内で定義された Provider を他の Module で利用できるようにするための設定

## 種類
モジュールにはいくつかの種類があるのでまとめていく。

### 機能モジュール
特定の機能やドメインに関連するコードをグループ化したモジュール。

```javascript
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {}
```

### 共有モジュール
アプリケーション全体で共有される共通のプロバイダーやサービスを含むモジュール。

```javascript
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService] // CatsModuleをimportするとCatsServiceを使えるようになる
})
export class CatsModule {}
```

### グローバルモジュール
アプリケーション全体で自動的に利用可能になるモジュール。

app.module.ts等、1度だけ登録すればimportしなくてもグローバルモジュールのプロバイダにアクセスできる。

```javascript
import { Module, Global } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Global() // これをつけるとグローバルモジュールになる
@Module({
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService], // CatsServiceがimportしなくてもアクセスできるようになる
})
export class CatsModule {}
```

# 参考

https://docs.nestjs.com/modules
DockerでJST設定できない（専用イメージは/etcに書き込めない）

# 問題と結果
python:3.11-slim でタイムゾーンを JST（Asia/Tokyo）にできなかったので、専用イメージを使うのをやめて ubuntu に apt で python3.11 インストールして タイムゾーンを JST（Asia/Tokyo） に設定したら想定通りJSTで動作してくれました

## 原因
専用イメージはシステム領域（/etcとか）に対しては root でも書き込めない設定になっていて /etc/timezone ファイルが変更できずタイムゾーンをUTCから変更できなかった

## きっかけ
Docker で python:3.11-slim 動かしてローカルフォルダをマウントして flask アプリを動かして reload させつつアプリ開発しようとしたがJSTで更新すると９時間前の UTC 時間で判定されるために flask の reload が動作しなかった

## 発見が遅れた理由
ln コマンドで Asia/Tokyo の timezone ファイルを /etc/timezone へリンクするコマンドがエラーを出さなかったため
Docker構築中にそこでエラー落ちしてくれれば気がついたのになーと思いました
「symbolの薄い本」を書く。

# 30分でブロックチェーンエンジニアになれる薄い本を作りました

## この本について
ブロックチェーン開発に興味はあるけれど、最初の一歩が踏み出せない方向けの入門ガイドです。

コーヒーを飲む時間で読める薄さ（A5サイズ想定、約30ページ）にまとめました。基本的なトランザクション発行と確認までを、説明とサンプルコードで解説しています。ちょことコラムもあります。フライヤー的に配るくらいのイメージです。

わかる人には見えない壁があるそうで、複数名のかたにzoomで個別レッスン（伴走型）をして、どこでつまづくのかを一緒に検証しました。本書のレビューもしていただきました。

**レビュワー様のありがたきお声の抜粋**

Aさん：トランザクション作成でaliceオブジェクトとBobオブジェクトをブラウザ上に生成させるところでごっちゃになってたけどこれならできた。

Bさん：ネットにもたくさん良い情報があるが、バラバラになっているのを繋げるのが大変。「本」という１本のレールにのって確実に達成できる安心感がある。

Cさん：Chromeのデベロッパーツールのところとか、最初の細かい躓きがちなところが丁寧に書いてあってありがたいです。

Dさん：最初の取っ掛かりが難しいけど、これならコードの分からない人でもコピペでいけますね(^^)

Eさん：理系に憧れるド文系の人にもハマるとおもいます！えっ？終わり？って思うくらいスムーズに出来ました👀✨送金の速度が早いことにもびっくりです。ちょっと眠たくてぼんやりしていたのですが出来ました！びっくりして目が覚めました（笑）

hashIDが図ごとに違うので困惑しました。
**→そもそも凡ミスですが。hashIDは毎回変わるものということを「周知のこと」としていて、気にしていませんでした。修正しますm(__)m**

## ねらい
**このようにうすい本にしたのは、さまざまな分野の方々が気軽に手に取り、既存の概念にとらわれない新しい発想（誰もそうぞうだにしなかったウルトラC）が生まれることを期待しているからです。**

## 特徴
- ソースコードはコピペでできる
- テストネットで無料にて試せる
- 必要最小限の知識に絞っている

## 目次
- はじめに
- 環境構築
- Aliceアカウント作成
- テスト用通貨もらう
- Bobアカウント作成
- トランザクション作成
- トランザクション署名
- トランザクションアナウンス（送信）
- おめでとうございます！

## 書籍作成ソフト
- Vivliostyle(楽しくCSS組版！)

## ダウンロード
[ここからダウンロードできます](https://drive.google.com/file/d/1bIk4Gw9q_nJIUJiEKSTCZVJobRSIYh_A/view?usp=sharing)

誰かの最初の一歩になれば嬉しいです。

#Symbol #ブロックチェーン #JavaScript #入門 #技術書
elixirのKinoと仲良くなる

## Kinoとは？
> Client-driven interactive widgets for Livebook.
Kino is the library used by Livebook to render rich and interactive outputs directly from your Elixir code.

https://hexdocs.pm/kino/Kino.html

> KinoとはLivebook上で動作するUIライブラリで、画像の表示やユーザーが操作可能なボタンやフォームをElixirコードでLivebook上に配置できます。

引用:Elixir実践入門

UIに関連したライブラリであり、統計データ、APIのレスポンスデータ、画像ウやグラフその他のUIを整えることができます。


## 実践
以下の作業はLivebookで行います。

### Chart
Elixirのデータをさまざまなグラフに描画します。

```elixir
my_data = %{a: [89, 124, 0, 67, 45], b: [12, 45, 67, 83, 31]}
```
でデータを用意して実行します。

次にSmartからChartを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/43f47104-a112-8adf-19da-cd16a56245b9.png)

データの対象を確認したら実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/91ff68dc-d2e1-e91a-8811-75d2c46d691c.png)

グラフができあがりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/87b6efb9-346e-a143-a345-689191e3d09e.png)


### MAP
地図データの表示とマーカーの追加と図形、点、線の描画を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/45cdca15-2107-c5b5-87ea-7fa63ff42f9c.png)

https://x.com/N1809031125/status/1871570511219864015
GNU gforth 超初心者が説明を試みる 〜forthのコンパイル機能という代物〜

# はじめに
「forthはディクショナリー(辞書)にワード(コマンド)をコンパイルする

と言いますけれども、それは 他のコンパイル言語や、 インタープリター言語の一括コンパイル機能とも異なります。

今回は、どう違うのかを説明しておきます。

# ワードを実行する。

````forth
1 2 + .
````

すると結果は 3 で、これは 1 と 2 を数値としてデータスタックに格納し、 + を実行し、 . を実行したわけです。

全く意味ないですけども、これをワード three にしてみましょう。

````forth
: three  ( -- ) 1 2 + ;
````

この時、 : が「実行」され、はテキスト・インタープリター(外部インタープリター)のコンパイルモードをONにします。そして、 : が次の単語を切り出して、ディクショナリーに新しいワードのヘッダを生成します。

そして次の ( はコメントなので 対の ) まで無視されます。

1 と 2 は数値なのですが、コンパイルモードOFF(インタープリターモード)ではスタックに積みますが、コンパイルモードONの時は 1 と 2 を、 この新しいワードの「実行時」に当該の数値をスタックに積む命令(ワード)と当該の数値をディクショナリーに書き込みます。

続けて + の「コンパイル時の機能」が実行されます。 + のコンパイル時の機能は、 + の実行時の機能をディクショナリに書き込む事です。

そして . の 「コンパイル時の機能」が実行されます。 . のコンパイル時の機能は . の実行時の機能をディクショナリに書き込む事です。

最後の ; は コンパイルモードをOFFにしてインタープリターモードに戻ります。

# コンパイラ言語との違い

コンパイラ言語では記述した各機能はコンパイラによって実行ファイルに変換されます。基本的に実行ファイルが実行されるまで各機能は実行されることはありません。

一方、 forth の ワード(コマンド) は インタープリター時もコンパイル時も、 とにかく実行されます。

そうです、 ワード(コマンド)は基本的にどれも、コンパイル時の機能とインタープリター時の機能を持っているのです。

forth のコンパイルというのは全体を統括する凄い賢いコンパイラが全てをコントロールするのではなくて、個々のワードが動いて、結果としてディクショナリーにコンパイルされるのです。

# インタープリター言語との違い
インタープリター言語にもコンパイルユーティリティーがついていたり、高速化できるキャッシュを自動作成するようなのもあります。
譬えば Emacs Lisp はバイトコンパイル出来ますし、 python は .pyc ファイルを生成します。

しかし forth はこれらとは違って外部のユーティリティー等で一括コンパイルという仕組みを持ちません。

前述したように各ワードがそれぞれ動くのです。

# コンパイル中に(定数)計算とかする

他の言語でも編集初期化等で定数計算させる事があります。

````C++
int a=1+2;
````

forth でも同様に可能で、もっと柔軟にできます。
というのも、明示的にコンパイル・モードとインタプリタ・モードを切り替えるワード(コマンド)も用意されているからです。

# 注意
逆に言うと「今、 このワードはどういう状態にあるか、コンパイル・モードかインタープリターモードか」を意識してコーディングするようにしてください。

今回はここまで。
Blenderのアドオンの作り方解説

目的
・pythonから機能を持った処理を実行する
・アドオンとしてメニューに表示する

環境
Blender 3.3.4
Windows11

BlenderのScriptingを選択
TemplatesからPython、BmeshSimpleEditmodeを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/52744d58-7aac-3ab1-36d6-a809c384aee8.png)

テンプレートが表示されるので適当なメッシュを選択した状態で実行するとメッシュが移動するのが確認できる。

```python
# This example assumes we have a mesh object in edit-mode

import bpy
import bmesh

# Get the active mesh
obj = bpy.context.edit_object
me = obj.data


# Get a BMesh representation
bm = bmesh.from_edit_mesh(me)

bm.faces.active = None

# Modify the BMesh, can do anything here...
for v in bm.verts:
    v.co.x += 1.0


# Show the updates in the viewport
# and recalculate n-gon tessellation.
bmesh.update_edit_mesh(me, loop_triangles=True)
```

https://x.com/N1809031125/status/1871557540276007191

この記事ではBlenderのアドオンの作り方について解説しました
Blender　フリーアドオン　一覧

この記事では無料で使えるBlenderのアドオンやアセットをまとめた記事となります。
2024.12月時点でのフリーのアドオンとなります。
それぞれの機能についてはサイトを参照されてください。

https://www.youtube.com/watch?v=fk9MKf9gCXM&list=PLbcfxxORzQ3a26XZzNgF5U7SDCL4A1HYv&index=5

https://blendermarket.com/products/33-free-studio-hdri-maps/?ref=974

https://blendermarket.com/products/advanced-car-paint-shader-fully-procedural/?ref=974

https://blendermarket.com/products/free-addon---trace-generator-from-image/?ref=974

https://blendermarket.com/products/zenshaders-free-library/?ref=974

https://www.youtube.com/watch?v=SxDavWj_tu8&list=PLbcfxxORzQ3a26XZzNgF5U7SDCL4A1HYv&index=3

https://blendermarket.com/products/easypivot/?ref=974

https://blendermarket.com/products/free-trim-sheet/?ref=974

https://www.youtube.com/watch?v=aDowk7fefow&list=PLbcfxxORzQ3a26XZzNgF5U7SDCL4A1HYv&index=3

https://blendermarket.com/products/free-realtime-fx-bundle/?ref=974

https://blendermarket.com/products/lazy-animation/?ref=974

https://www.youtube.com/watch?v=pF9t7KdmuhI&list=PLbcfxxORzQ3a26XZzNgF5U7SDCL4A1HYv&index=2
わたしのテレワークを支えてくれているものたち👩🏻‍💻

こんにちは、ふるすです。
フルリモートになってはや数年。。もはや出社していた期間より在宅勤務期間のほうが長くなってしまいました。

今日はそんな私のテレワーク環境を支えてくれているものたちをいくつかご紹介します。

:::note warn
**なお本記事に広告は含んでおりません。**
:::

## カップウォーマー

https://amzn.asia/d/ameoRh1

わたしは紅茶が大好きなのですが、猫舌で淹れたては飲めず、ちびちび飲むので気づいたら冷たくなっていることもしばしば。
こちらのカップウォーマーを買ってから適温で長時間飲み物を飲むことができてとっても快適です。こういうのって大して使えないんじゃないかと思っていましたが、本当にあったかいまま維持してくれるので驚きました。

![IMG_0959.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3827898/63ba5b3e-5e4e-0a2e-a9fb-d96d8aea3825.jpeg)
薄くて軽いし、タイマーもついていていうことなし。

## デスクスパ

https://item.rakuten.co.jp/bodyandsoul/deskspa2/?scid=wi_ich_iphoneapp_item_share


暑がりなのに足先は冷えるという困った体質なのですが、こちらのおかげで冬も足元ぽかぽかで過ごせるようになりました。いや、**ぽかぽかというよりアチアチです。**
あまりにも熱いので分厚めの靴下やルームシューズを履いて使っています。それでもかなり熱いです。
冷え性の方、使ってみてはいかがでしょうか。

## DELI PICKS

https://deli-picks.com/

続いて冷凍宅配弁当のデリピックスです。外に出るのも面倒だし、かといってUberばっかりだとお金が気になる。ということでわたしのランチの月半分がこちら頼み…なくなったら本当に困ります。
会員ランクはプラチナランク！80食以上注文し、お弁当の評価を35件以上行うとプラチナ会員になり、10%オフになります。

![IMG_0960.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3827898/cfdd58d6-2b19-efba-fc3b-ba221a0da8f1.jpeg)


冷凍宅配弁当はいろいろと種類がありますが、わたしがデリピックスを頼み続けている一番の理由はずばり**おいしいから！！**
フレンチや中華、和食など様々なジャンルがあり、メニューのリニューアルや追加が頻繁に行われるので全く飽きません。「ほかに選択肢がないから仕方なく食べてる」のではなく「おいしいから頼んでる」お弁当です。
お気に入りメニューはたくさんあるのですが、特におすすめなのは魚介のラグーカレー。具材もごろごろだしお魚の旨味たっぷりで本当においしいんです。
お昼ご飯のレパートリーを増やしたい方、一度頼んでみてはいかがでしょうか。

ここまでお読みいただきありがとうございました！
みなさまよきテレワークライフを:sparkles: