OmniAICreator/Qiita-1.07M huggingface dataset:
テンプレートエンジンについて理解する

# 目次
1. 背景
2. テンプレートエンジンとは
3. 有名なライブラリ
4. HandlebarsJSとは
5. おまけ　HandlebarsJSを使ったが拡張機能でフロントエンドのみでは実装できなかった
6. 最後に
7. 参考

# 1. 背景
業務で拡張機能を開発しており、一から要素を記述してるのでjsxやテンプレートエンジンを使うと効率的になり、また管理もしやすくなるのではと思ったからです。

# 2. テンプレートエンジンとは

- 様々なコンポーネントに分割されたウェブ・アプリケーションを迅速に構築したい場合に使用します。
- テンプレートはまた、アプリケーションに渡す必要のあるサーバーサイドのデータを高速にレンダリングすることもできます。

# 3. 有名なライブラリ
- [Ejs](https://ejs.co/)
- [Jade](https://jade-lang.com/)
- [Pug](https://pugjs.org/api/getting-started.html)
- [Mustache](https://mustache.github.io/)
- [HandlebarsJS](https://handlebarsjs.com/)
- [Jinja2](https://jinja.palletsprojects.com/en/3.1.x/)
- [Blade](https://laravel.com/docs/10.x/blade)

## トレンド

https://npmtrends.com/blade-formatter-vs-ejs-vs-handlebars-vs-jade-vs-jinja-js-vs-mustache-vs-pug

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/d13ce2cd-ceaf-5f39-f067-b75ff3566ccb.png)

ejsとHandlebarsJSが良い勝負をしてることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/194e3415-6b15-6cce-83a8-d47cbc5fe953.png)

HandlebarsJSの方が更新頻度、starの数が多いので次の章で試しにhandlebarJSを使ってみようと思います。

# 4. HandlebarsJSとは

https://github.com/handlebars-lang/handlebars.js

demoがある[公式ページ](https://handlebarsjs.com/)がありました。

## セマンティック・テンプレート
フラストレーションを感じることなく効果的にセマンティックテンプレートを構築するために必要な機能を提供します。

## 迅速な実行
- テンプレートをJavaScript関数にコンパイルします。
- これにより、他のテンプレートエンジンよりもテンプレートの実行が高速です。

[ここ](https://handlebarsjs.com/playground.html)でdemoが動かせます。

# 5. おまけ　HandlebarsJSを使ったが拡張機能でフロントエンドのみでは実装できなかった
## 5.1 インストール
```terminal
npm install handlebars
```
or
```terminal
yarn add handlebars
```
## 5.2
テンプレートのプリコンパイルをするように実装します。
クライアントの時間を節約し、Handlebarsライブラリの必要なランタイムサイズを減らせます。

## 5.2 実装
[このリポジトリ](https://github.com/yamatai12/handlebars-demo)で作成します。
以下のエラーが解消されませんでした。。
manifest v3では無理みたいです。

https://stackoverflow.com/questions/72376413/refused-to-evaluate-a-string-as-javascript-because-unsafe-eval-is-not-an-allow

# 6. 最後に
- テンプレートエンジンは便利だということが分かりました。
- Chrome拡張機能で実装（サイトに埋め込み）するならば、バックエンドからテンプレートを使って作成された要素を返すようにするしかないようです。

# 7.参考
- [What are template engines?](https://www.educative.io/answers/what-are-template-engines)
【JavaScript・初学者】map / forEach / filter / findの違い


# はじめに

`React`を学習していましたが、`JavaScript`の記法についてフワッとしている部分がよくあったので、簡単ですが今回は、`map` / `forEach` / `filter` / `find`の違いについてまとめました

# 比較


メソッド             | map                           | forEach
--------------- | ----------------------------- | -----------------------------
目的            | 配列の全ての要素を変換する     | 配列の全ての要素に対して何かを実行する
返り値          | 変換後の要素からなる新しい配列 | なし（undefined）
元の配列への影響 | 元の配列は変更されない         | 元の配列は変更されない
使用例          | 配列の全ての要素を一定のルールで変換する場合など | 配列の全ての要素に対して一定の操作を実行する場合など


メソッド            | filter                           | find
--------------- | ----------------------------- | -----------------------------
目的            | 条件に合致する全ての要素を取得する    | 	条件に合致する最初の要素を取得する 
返り値          | 条件に合致する要素からなる新しい配列 | 条件に合致する最初の要素、なければundefined
元の配列への影響 | 元の配列は変更されない         | 元の配列は変更されない
使用例          | 特定の属性を持つオブジェクトを抽出する場合など | IDや一意のキーで特定のオブジェクトを検索する場合など

# map / forEach / filter / find
書くメソッドの使い方について個別にまとめているので、参考にしてみてください。

### map

https://qiita.com/ke_sukesakuma/private/787c0136df00e40749db

### forEach

https://qiita.com/ke_sukesakuma/items/4c39c19c6fdb0907e33d


### filter

https://qiita.com/ke_sukesakuma/private/1ee371745c26c8db9767

### find

https://qiita.com/ke_sukesakuma/private/cb73922e736e6e5b57af
Dockerのローカル以降についての見解

# はじめに
みなさんはどんなときにdockerを使っていますか？
わたしはdockerを初めて知ったとき、**マシン間での環境の差異をなくす**というメリットが一番でかいと思って使っていました。
それで思ったことが、もともとローカルで環境を作って開発したあと、その環境をdockerに移行してdockerで動かすことにあまりメリットがないのではということです。
もしかしたら、当たり前だろ。と思った人もいるかもしれませんが、ここでは私がそう考えた理由と経緯をだらだらと書いていきます。

# Dockerのメリット
一度整理しておくと、Dockerを使うメリットとしてよく挙げられるのは以下のようなものでしょう。

* **環境の一貫性と分離**：
「私のマシンでは動くけど、他のマシンでは動かない」問題を解決する。

* **効率的なリソース利用**：
同じハードウェア上でより多くのアプリケーションを実行できる。

* **継続的インテグレーションとデプロイメント**：
自動テストやデプロイメントプロセスの一部として使用することができる。

* **バージョン管理と再現性**：
特定のバージョンのイメージを再利用することで、過去の状態を再現できる。

# 最初の開発環境で変わる
一番重要なのはここで、最初に構築した開発環境がローカルマシンかdockerコンテナかによってメリットが左右されると思っています。Dockerで構築した場合、[#Dockerのメリット](#Dockerのメリット)であげたものの全てを持っていますが、ローカルだとどう変わるのでしょうか？

### 環境の一貫性と分離
「私のマシンでは動くけど、他のマシンでは動かない」問題を解決する。ローカルから移行する場合はもとのファイルがローカルマシンにないと動かないので（COPYとか使うんでしょ？どうせ）、結局ソースを渡してからイメージを作る流れになります。

### 効率的なリソース利用
同じハードウェア上でより多くのアプリケーションを実行できる。これはローカル移行の唯一のメリットだと思います。例えばフロントとバックで異なるサーバーを持つ場合、別々に動かすことなくコンテナを同時に起動することができます。

### 継続的インテグレーションとデプロイメント
自動テストやデプロイメントプロセスの一部として使用することができる。自動テストはいいとして、デプロイメントプロセスとしては少し問題がある場合があると思います。例えば、複数のサーバー間でやりとりをするアプリケーションの場合、[#効率的なリソース利用](#効率的なリソース利用)のおかげで同時に起動することはできます。ただし、デプロイする場合は複数のコンテナを一つのサーバーに公開することはできない（はず）なので、結局コンテナを分離する必要があるのです。テスト稼働にだけメリットがあるといえるでしょう。

### バージョン管理と再現性
特定のバージョンのイメージを再利用することで、過去の状態を再現できる。これはどちらの場合にも適応できますが、ローカルに環境があるならgitで管理する方が手間が少ない気がします。バージョンごとにいちいちコンテナを作っているだけで時間がかかります。

## まとめると
* 結局ソースを渡すことになる
* ローカルで開発できるならそれでいい
* 結局サーバーは分けないといけないから、サーバー数が少なければ、テストはローカルで十分
* バージョン管理はgitでいいでしょ。コンテナ作ってたらキリがない

こういう経緯でで、ローカル環境をdockerへ移行すること...いえ、ローカルに環境をつくることに愚かさを覚えました。開発する前にdockerを使うならdocker、ローカルでやるならローカルと開発環境を決めてプロジェクトを推進することに大切さを感じました。

勝手に完結しましたが、わたしの勝手な解釈もあるはずなので、プロフェッショナルな方はコメントで暴露していただけるとありがたいです。ここまで愚痴を読んでくださりありがとうございました。
Adafruit_GFXとAdafruit_ST7789でカラー液晶ST7789の表示(Arduino)まとめ


![o_cop787.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/faf7980b-6e4b-c397-9693-98639e85f925.jpeg)


![o_cop634.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b037a2fd-8b3f-54cf-b134-27863895ff60.jpeg)


https://akizukidenshi.com/catalog/top.aspx

https://akizukidenshi.com/catalog/g/gK-15560/

https://qiita.com/caa45040/items/3c57c159be0fd0f7a718

https://qiita.com/caa45040/items/8935036eab45af3b08d0


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


https://qiita.com/caa45040/items/b070ec14ee8003c54ed2

https://qiita.com/caa45040/items/de3680a3338c5018bacc

https://qiita.com/caa45040/items/f2a5dcd8e8b6b4ace141

https://qiita.com/caa45040/items/b20bc091d947e9071331

https://qiita.com/caa45040/items/98c763963e1c6af40a23
AivenはApache Kafka® 3.2をサポートしています。

<font color="Grey">*[Aiven supports Apache Kafka® 3.2](https://aiven.io/blog/aiven-supports-apache-kafka-3.2)の翻訳です。*</font>

2022年8月3日

# Aiven は Apache Kafka® 3.2 をサポートします。

Aivenが新しくリリースされたApache Kafkaバージョン3.2に対応しました。AivenがApache Kafka® 3.2に対応しました。

## Apache Kafka 3.2の新機能


Apache Kafka 3.2のリリースでは、数多くの改善とバグ修正が行われました（これらについては[リリースノート](https://archive.apache.org/dist/kafka/3.2.0/RELEASE_NOTES.html)をご覧ください）。


Aivenでは、バージョン3.2がKRaftに基づく自己管理型メタデータクォーラムへの切り替えに一歩近づいたことを特に喜んでいます。


バージョン3.2のハイライトをいくつかご紹介します：


## 標準オーソライザー


[KIP-801：cluster_metadataにメタデータを格納するオーソライザを実装する](https://cwiki.apache.org/confluence/display/KAFKA/KIP-801%3A+Implement+an+Authorizer+that+stores+metadata+in+__cluster_metadata)


標準オーソライザはZooKeeperに依存しないKRaftモード用の組み込みオーソライザである。Apache KafkaからZooKeeperへの依存を取り除く重要なステップである。


Aivenでは、既にKRaftに対応している独自の[fully open-source authoriser](https://github.com/aiven/auth-for-apache-kafka)を使用しています。


## 新しいリーダーの回復状態


[KIP-704: ヒントをパーティションリーダーに送り、[パーティションを回復させる](https://cwiki.apache.org/confluence/display/KAFKA/KIP-704%3A+Send+a+hint+to+the+partition+leader+to+recover+the+partition)


コントローラが、新しく選出されたトピックパーティションリーダに対して、「クリーンでないリーダ選出」を使用して選択されたかどうかを示すことができるようにします。このプロセスは、トランザクションステータスが一貫していない場合などに使用できます。クラスタ回復の調整に役立ちます。


## 全コネクタの一覧


[KIP-769：Connect API to list all connector plugins and retrieve their configuration definitions](https://cwiki.apache.org/confluence/display/KAFKA/KIP-769%3A+Connect+APIs+to+list+all+connector+plugins+and+retrieve+their+configuration+definitions)


Connect APIがすべてのコネクター・プラグインをリストできるようになりました。これにより、ユーザーはConnectランタイムのセットアップを知らなくても、利用可能なすべてのコネクターを一覧表示できます。また、特定のコネクタプラグインの設定を返すエンドポイントも追加されました。


## Aiven for Apache Kafka 3.2を始めるには？


[Aivenコンソール](https://console.aiven.io/)で新しいクラスタを立ち上げるか、ダウンタイムなしで最新バージョンにアップグレードすることができます。


アップグレードパスの詳細や質問については、[プロジェクト自体のリリースノート](https://archive.apache.org/dist/kafka/3.2.0/RELEASE_NOTES.html) をご覧ください。


## まとめ


Apache Kafkaの詳細については、[Apache Kafkaとは](https://aiven.io/blog/what-is-apache-kafka)をご覧ください。


まだAivenのサービスをご利用になっていませんか？<https://console.aiven.io/signup>から今すぐ無料トライアルにお申し込みください！


その間、変更履歴やブログのRSSフィード、またはLinkedInやTwitterのアカウントをフォローして、製品や機能関連の最新情報をご確認ください。
github actions で pre-commit を走らせよう

この記事は [一分で読める小ネタのカレンダー | Advent Calendar 2023 - Qiita](https://qiita.com/advent-calendar/2023/raki) の１０日目

# github actions とワークフロー

- [GitHub Actions](https://docs.github.com/ja/actions/learn-github-actions) は、CI/CD のプラットフォーム
- github 上でテストやビルドを実行したりデプロイができる、要はコミットした後になんかやって欲しい、を実現できる
- やって欲しい内容を書くのがワークフロー
- 昨日の記事で pre-commit を導入したと思うので、今日はワークフローを導入して、PRを出したら自動で走るのを確認しようって話

本文はここまで。以下は時間外ｗ

# ワークフロー

- [feat: pre-commit workflow by officel · Pull Request #76 · officel/dotfiles](https://github.com/officel/dotfiles/pull/76)

```yaml:.github/workflows/pre-commit.yml
name: pre-commit

on:
  workflow_dispatch:
  pull_request:

jobs:
  pre-commit:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v4
        with:
          python-version: '3.10'
      - uses: pre-commit/action@v3.0.0

      - run: pre-commit autoupdate
      - name: Create Pull Request
        uses: peter-evans/create-pull-request@v5
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          base: ${{ github.event.repository.default_branch }}
          branch: update/pre-commit-autoupdate
          title: 'build(deps): bump pre-commit autoupdate'
          commit-message: 'build(deps): bump pre-commit autoupdate'
          body: |
            Update versions of tools in pre-commit
            configs to latest version
          add-paths: |
            .pre-commit-config.yaml
          assignees: ${{ github.actor }}
          reviewers: ${{ github.actor }}

```

- ワークフローの個別の説明はそれぞれ勉強して欲しい
- ここでは PR が出た時に自動で github 上で pre-commit が走ってチェックをやってくれるということと、ついでに pre-commit autoupdate コマンドが走って、.pre-commit.yaml で使用しているフックのバージョンアップがあったら更新するためのPRを作ってくれる、ということだけ理解すればおｋ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44420/01561827-8908-4a90-524f-4f4dec6d3cba.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44420/01c3f4e9-cdc6-81bb-6986-a361c5254d82.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44420/3f56ea73-4aad-0f1c-6f84-341fca7a1bd3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44420/be659223-6d92-ceda-dd8f-eb33cddd75d9.png)

pre-commit がエラーになると（ローカルでpre-commitを使わないでチェックに失敗するようなホコリをコミットしようとすると）エラーになって教えてくれる（画像は本家 pre-commit の draft から拝借）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44420/9c2f9df7-6c03-3f29-e4d1-3989c07d00b8.png)

# 雑

- 自分だけが pre-commit を使っていても他のメンバーが使っていなかったらホコリは溜まる
- リモートリポジトリ（github）上で同じチェックをするのは無駄に思えるかもしれないが、意外とミスや漏れはあるのでできるだけやっておくのを薦める
- チームで管理しているリポジトリでは相談して導入して欲しい
- 特に後から導入して大量に差分が出るとそうするべきではないファイルが混ざったりして大変なことになるので注意
- ２日目の記事で書いた、プライベートな my-til リポジトリで練習運用をするとフック毎の設定のテストなんかもできて便利（実際そうしている。パブリックに持ってきてるのはその一部）

# 改善依頼

- peter-evans さんの actions はだんだん github のドキュメントから消されてるんだけど事情をご存じの方。。。
- いや更新内容から今後は個人の actions じゃなくて gh を使った例にしていくって感じっぽいんだけども
pre-commit を使ってみよう

この記事は [一分で読める小ネタのカレンダー | Advent Calendar 2023 - Qiita](https://qiita.com/advent-calendar/2023/raki) の９日目

# pre-commit

- git にはフックという機能があって、add や commit など、コマンドを実行する（した、終わった）タイミングで様々な処理を実行させることができる
- よくあるのは commit した時に事前チェックをおこない、合格しない場合はコミットを失敗させる、である
- そのフックを効率的に管理するツールが [pre-commit](https://pre-commit.com/)
- 自分のリポジトリに導入すると、行儀のよいファイルをコミットできるようになる
- pre-commit を導入してルールによって統一されたファイル管理をしようって話

本文はここまで。以下は時間外ｗ

# インストールとか

- この記事を書くために自前のパブリックリポジトリに導入したw
- [feat: use pre-commit by officel · Pull Request #75 · officel/dotfiles](https://github.com/officel/dotfiles/pull/75)

```bash
vi .pre-commit-config.yaml  # とりあえずPRにあるファイルをコピーすれば楽
brew install pre-commit     # インストール方法は本家のドキュメントに従う
pre-commit --version
pre-commit install
pre-commit run --all-files
```

# 使い方

- pre-commit install したら後は勝手にコミット時に走る
- .pre-commit.yaml ファイルを必要に応じて更新していく
- pre-commit の名前のとおり、デフォルトのフックタイミングは pre-commit だけど、他のフックタイミング（stage）も指定できるので、いろいろ試すと面白い（やりすぎると自分でもうっとおしくなるので注意）

# フック処理

- 参考に挙げたコードで使用している end-of-file-fixer と trailing-whitespace は最低限のマナーだと思うので、そのまま使って欲しい
- conventional-pre-commit は昨日の記事にも書いた [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) を強制してくれる
- 後はここから探す [Supported hooks](https://pre-commit.com/hooks.html)
- lint 系は言語によってそれぞれ存在する。しかも同じ言語で複数ずつ存在しているので、当然少しずつ出来ることやデフォルトが違っていたりする。この辺りは好みや使いやすさを調べたりチームと相談して欲しい

# おまけ

- 恥を晒しておくｗｗｗ [fix: cleanup files by pre-commit](https://github.com/officel/dotfiles/pull/74/files)
- 導入する前の古いファイルもあるので一概には言いにくいけど、やることやってるつもりでも対応が漏れることはよくあるという話
- 自分の（あるいはチームの共有）財産であるリポジトリにホコリが溜まったら嫌じゃん？掃除しようぜ、ということ

# 改善依頼

- おすすめフックはあえて書かなかったので、こんなの使ってるぜ、みたいなのコメントください
- pre-commit 以外で同様のツールをおすすめするぜ、があったらください
Windows シャットダウンイベントログ一覧

Windowsのシャットダウン関連のイベントログは以下の表になる。

![イベントログ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350668/d7bcfc41-8aa8-9ec0-effb-658eeb2f2fee.png)

https://laboradian.com/win-system-power-state-events/
テクニカルライターとは

# はじめに
　最近テクニカルライターに興味ができ、色んなコミュニティやMeetupなどを接しています。特に、株式会社LINEさんからのMeetup動画で良質の情報が提供されていると思います。今回はその動画の中で [LINE Technical Writing Meetup vol.24](https://youtu.be/Jw5CIpABlkU?si=ZrbMSX5yroPa94ij) の一部をまとめてみました。

## 1. テクニカルライターとは
### 定義
　テクニカルライターとは言葉そのまま「技術文書作成者」と言われています。Wikipediaでは、テクニカルライターの業務を「技術情報を他人に共有・紹介することができること」と説明しています。

>Technical writing is performed by a technical writer (or technical author) and is the process of writing and sharing technical information in a professional setting.
A technical writer's primary task is to communicate technical information to another person or party in the clearest and most effective manner possible.

 
 テクニカルライターは、業務の内容によって様々な呼び方があります。

- Technical Communicator (コミュニケーションサポート)
- UX Writer (ユーザー向けのサービス文書)
- API Writer (開発エンジニア向けの技術文書)
- Information Architect (文書の構造化に特化)
- Document Engineer (効果的な文書配布の為のエンジニアリングに特化)

### 一緒に働くチーム
　テクニカルライターが社内で一緒に仕事する職務にはプロジェクトマネージャー、QAエンジニア、デザイナーなどがありその中で**開発エンジニア**が一番です。


# 2. テクニカルライターの仕事
　テクニカルライターの仕事は大きく2つ挙げられます。一つは今まで開発エンジニアとして経歴を積んできた場合と、もう一つは言語を専攻してきた場合となります。
　やることが全く分けられているわけではないのですが、前者は開発用語やプロジェクト一連の流れに慣れているはずなので、技術文書や文書エンジニアリング業務を取り組んだ方がいいかもしれません。
　一方、後者は言語感覚を活かして多国語文書作成やリアルタイム翻訳など、グローバル的な業務を取り組んでいくことができます。このように自分の長所を発揮できる業務があると思います。代表的な業務内容は下記の通りです。

- Technical documentation
- Site structuring
- Documentation in multi-languages
- Document engineering
- Writing training

# 3. テクニカルライターの業務フロー 
　テクニカルライターがはどんな流れで作業を行っていくのかについては、会社とプロジェクトによって違いがあると思いますが、大体の流れは下記となります。

**① 文書作成依頼**
: 開発エンジニアまたはプランナーから文書作成の依頼を受ける。

**② サポート可能性判断**
: テクニカルライターは依頼された内容が文書として作成できるかどうかを判断する。

**③ キックオフミーティング**
: 文書として作成できると判断した場合、ステークホルダー（関係者たち）が集まってキックオフミーティングを進め、この際開発エンジニアはプロジェクトのストラクチャーを説明する。

**④ 文書作成**
: 草案は開発エンジニアが作成し、検討が必要であれば開発エンジニアとやり取りをしながら作業を行っていく。

**⑤ 翻訳依頼**
: 文書作成が完了したら翻訳に進められ、出来上がったら開発エンジニアは技術面に間違いがないのかレビューする。

**⑥ 文書リリース**
: 最終作成が完了したら文書を公開します。

# さいごに
　meetupでは、テクニカルライターになるにはどんな履歴が必要なのかという内容より、テクニカルライターについての情報が得られ、同じ興味を持っている人々とのコミュニケーションができるコミュニティを紹介してくれました。
- [Society for Technical Communication](https://www.stc.org)
: コンファレンス開催、テクニカルライティング講義　等
- [WRITE THE DOCS](https://www.writethedocs.org)
: コンファレンス開催、Slackチャンネル運用、英文ニュースレター提供
- [API the Docs](https://apithedocs.org)
: コンファレンス開催、API文書作成講義
- [Technical Writing Courses](https://developers.google.com/tech-writing)
: Googleのテクニカルライター講座
- [TechDocs Solutions & Consultancy](www.shufrans-techdocs.com/services/simplified-technical-english/) 
: 英文テクニカルライティングの講義
windows Server 再起動確認方法

WindowsServer(クライアント)の起動時間確認方法
コマンドプロンプトで「systeminfo」を実行する。
以下、実行結果のシステム起動時間から再起動、シャットダウン等をせず起動していることになる。

最初のインストール日付: 2023/04/16, 0:29:05
システム起動時間:       2023/11/11, 23:27:12

上記、以外の確認方法はイベントビューアでの確認

イベントビューア＞システムでログをフィルターする。
イベントソースで「kernel-Power」のイベント109を確認する。
内容としては、シャットダウンの切り替えになるので、このログがあれば再起動したことが確認できる。
[Roblox] Argon にて Port to VS Code しても接続できない時の対処法

Roblox Argon 使ってますか？

Roblox Studio でコードを編集するのではなく、VSCode で編集できるようになる拡張Plugin です！

めちゃくちゃ使いやすいんですが、ひとつだけ注意が必要で、初期設定が上手くいかないことがあります。例えば、「Port to VS Code」ボタンを押しても、なんだか接続ができないことがあるんですよね。（くるくるロードしているまま）

その時の対処法が以下です。

- Roblox Argon の接続ポート番号を、再設定する
（一度クリアにして、再度設定）

- VSCode 側の接続ポート番号も再設定する
（一度クリアにして、再度設定）

これでうまくいきました。
長期インターンでデータサイエンスの世界へ！

# はじめに
こんにちは！
僕は、研究を行いながらデータサイエンスの**長期インターンシップ**を行なう大学院生です。

学部時代から長期インターンシップを開始し、これまで4社経験してきました。
この経験から、プログラミングの学習を始めたばかりの人や、長期インターンを行う勇気が出ない人に、学習サポートや合格サポートなどを行わせてもらっています！

僕自身、プログラミングの習得や長期インターン探しに苦労したので、その経験をお伝えすることで、より多くの人が挫折せずデータサイエンティストになるまで成長して欲しいです！

以下でサポートを行なっているのでご興味ある方はご連絡ください！学生・社会人問わずサポートいたします！

X(Twitter)

https://twitter.com/DS_school_1

ココナラ

https://coconala.com/services/3044873

# 長期インターンシップとは
インターンシップと聞くと多くの方は、就職活動の一環である「サマーインターン」や「冬インターン」を思い浮かべる方が多いのではないでしょうか？
これらのインターンは短期インターンに位置付けられ、1日~２週間ほどの期間で実施されます。

それに対して長期インターンは、期間で言うと3ヶ月以上、更には有給のインターンシップとなっています。
下記に短期インターンと長期インターンの違いをまとめます。

![長期インターン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584936/791fa284-e908-3975-4072-f72f7fab0381.png)

次に長期インターンシップを行うメリット・デメリットについてお話しします。


# 長期インターンシップのメリット・デメリット
僕が考える長期インターンシップのメリット・デメリットをデータサイエンス系の職種に特化してお話しします。エンジニア職でも当てはまる点は多いと思います。

データサイエンスの業務は、<font color="Red">エンジニアリンング力</font>・<font color="Blue">数学力</font>・<font color="Green">コミュニケーション力</font>を組み合わせた業務になります。

それぞれのスキルに関して長期インターン(実務)を行う場合と、行わない場合(独学)での比較を通してメリットを説明します。

### エンジニアリング力
まず、<font color="Red">エンジニアリング力</font>に関してですが、プログラミング力やチーム開発力を指します。
独学の場合、プログラミングの基礎を学習した後に成果物を作成する部分に壁があり、そこで挫折する人が多いのですが、実務を行うことで、社員の方からの援助を受けながら成果物を作成することができます。

更にチームで開発することが多いので、<font color="Red">**Git・GitHubなどのチーム開発スキル**</font>を身につけられる点がメリットだと考えます。

### 数学力
<font color="Blue">数学力</font>に関しては、実務と独学でそれほど大きな差はないと考えます。
と言うのも、数学に関する力に関しては、資格の学習を通して身につけられると考えるからです。

自身のレベルに合わせて、<font color="Blue">**統計検定**</font>３級・２級・準１級を準に取得することをお勧めします。
準１級を取得できれば十分な数学力が身についていると考えています。

### コミュニケーション力
<font color="Green">コミュニケーション力</font>は、実務と独学で大きな違いがあります。
コミュニケーション力とは、アウトプットを分かりやすく説明する説明力や、分かりやすい資料を作成する資料作成スキルを指します。

独学の場合、自分では解釈・理解できていても、それを人に伝えられないと**意味を成しません**！
パワーポイントなどによる資料作成に関しても実践を重ねれば重ねるほど、上手く分かりやすくなります。

この経験を積める点は非常に大きなメリットだと思います。

### その他
３つのスキル以外にも様々なメリットがあります。
例を挙げると以下のようなメリットです。
+ 給料をもらえながら学べる
+ データサイエンスに詳しい社員や同期との人脈ができる
+ 就活の際に話せるガクチカになる
<br>
<br>
デメリットとしては１点だけで、時間に余裕がないと難しい点です。
週に2~3日以上は企業としては、働いてほしいところが多いので、それだけの時間が取れないという点は注意した方が良いと思います。

このように多くのメリットがあるので、時間に余裕がある方は、学生のうちに長期インターンシップをやらない手はないと思います。

最後にメリットをまとめた表を掲載しておきます。
![長期インターン_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584936/04f32eae-9f5f-f2c6-9e9e-dbba9b6cf2ab.png)



# さいごに
長期インターンによる成長幅は本当に大きいです。
自分のスキルで大丈夫かな？やっていけるか不安だなという方も多くいると思いますが、是非一度勇気を出して飛び込んでみて下さい！

不安のある方はいつでも、質問・ご相談お待ちしております！
お気軽にご連絡ください！

X(Twitter)

https://twitter.com/DS_school_1

ココナラ

https://coconala.com/services/3044873

# 参考文献
+ 【徹底解説】長期インターンとは　https://www.in-fra.jp/long-internships/articles/362
[Roblox] 打倒チーター！おすすめのAnti-Cheating Plugin Asset はこれだけ！

Roblox にはチーターが多すぎる！

対策はしたいけど、そんなに手間かけたくない！ゲーム作るのに集中したーい！

そんな人向けのアンチチートスクリプトがこちら。

この１つだけ入れてたらとりまOK。


# Hex AE Anti-ExploitCheat

https://create.roblox.com/marketplace/asset/6165100765/Hex-AE-Anti-ExploitCheat

# Hex AE の使い方

https://www.youtube.com/watch?v=9zOtzWQvx9M

おしまい
Dynamics 365 FIN / SCMのUpdateリリース頻度が変わります~2024年より~

# はじめに
Dynamics 365 Finance と Supply Chain Managementのupdateリリース頻度が変更となります。
変更点を確認していきましょう。

# 変更点
1. Service Updateは **年4回** (2月、4月、7月、10月)に変更
2. 変更は10.0.38(2024/2月)以降より
3. Update適用の一時停止は **1回** まで
4. ユーザは年2回のService Updateの適用が必要
5. メジャーUpdateは4月、10月の年2回
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/e2ccd6c8-b7ee-db0b-b740-ca103c2b9926.png)

# その他
各リリースのライフサイクルが大幅に延長
自動更新の際に予想されるダウンタイムは15分

# まとめ
以前は7件あったService Updateが4件に減っています
また、適用の一時停止も年3回から年1回までへ変更となりました
Dynamics CRM側のService Update頻度と同じ頻度になりました

| # | 変更点 | 新 | 旧 |
|:-:|:-:|:-:|:-:|
| 1  | 頻度  | 年4回  |年7回|
| 2  | Updateリリース月  | 2月、4月、7月、10月  |2月、4月、5月、7月、8月、10月、11月|
| 3  | 適用の一時停止  | 1回  |最大3回|
| 4  | メジャ―アップデート  | 4月、10月  |ー|

# 参考文献
https://learn.microsoft.com/ja-jp/dynamics365/fin-ops-core/dev-itpro/get-started/public-preview-releases
Paperclipについて

RailsのPaperclipについて、ざっくりメモです。

### 簡単なファイルアップロードの統合
Paperclipは、Railsモデルにファイルアップロードの機能を簡単に統合することを可能にする。これにより、開発者は少ないコードで画像やドキュメントなどのファイルをアプリケーションにアップロードできる。

### 画像処理
Paperclipは、ImageMagickを使用して画像のリサイズや形式の変換などの処理を行うことができる。これにより、ユーザーがアップロードした画像をサイトの要件に合わせて自動的に調整することが可能。

### ファイル検証
アップロードされたファイルの種類やサイズに対して検証を設定できる。これにより、不適切または危険なファイルのアップロードを防ぐことができる。

### ストレージの柔軟性
Paperclipは、ローカルファイルシステムの他に、Amazon S3などのクラウドストレージサービスにファイルを保存する機能をサポート。

### URLとパスのカスタマイズ
アップロードされたファイルのURLやパスは、アプリケーションのニーズに合わせてカスタマイズすることが可能。

### 複数ファイルのアタッチメント
一つのモデルに対して複数のファイルをアタッチすることができる。これにより、一つのレコードに対して複数の画像やドキュメントを関連付けることができる。
Microsoft Storeが全然更新されなくなった時に実行ファイルから更新する方法(Windows 10)

## Microsoft Storeが更新されない
複数のPCの工場出荷状態からのセットアップをする際に、
どういう訳かMicrosoft Storeが全く更新されなくなる問題が発生しました。
アプリの検索・インストールが全く読み込まず、
「問題が発生しました　マニフェストで不明なレイアウトが指定されています」
「ページを読み込めませんでした。しばらく待ってもう一度お試しください。エラーコード：0x80131500」
と睨めっこすること数刻…ようやく解決法が見つかったので備忘用に書き残します。

### Wsresetは？　PowerShellからの再インストールは？
どれも効果がありませんでした。一般的なトラブルシューティングに記載されているので割愛します。

### どうやらデフォルトでインストールされているMicrosoft Storeのせい
デフォルトのバージョンが古すぎて、コマンドによる再インストールを行っても無限にそれが読み込まれている様子。かと言って複数台のWindowsを新たにイメージ作ってインストールし直すのは考えただけで骨が折れる…
と思っていた所で、Microsoft Storeのファイルを実行ファイル形式で抽出してくれるサイトを発見。

### 実行ファイルの抽出方法(2023/11/16時点)
**Microsoft Edge**で、こちらのサイトにアクセスします。
https://store.rg-adguard.net/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621883/8d5b4988-6f2c-0540-e30c-5a7bf951d86d.png)
左側のプルダウンは「Productid」を選択し、
中央のテキストボックスには「9wzdncrfjbmp」と入力。
チェックマークをクリックし読み込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621883/b679bb1f-96c6-e352-a15a-f70804b7bc66.png)

一覧から、
Microsoft.WindowsStore_{xxxxx}__neutral_~_8wekyb3d8bbwe.msixbundle
を選択しDLしてください。

＊セキュリティ上の警告が何度も出ます。自己責任でDLお願いいたします。
＊Msixbundleファイルはストアアプリの「MSIX Packaging Tool」が必要です。これが動かない場合は開けません。

ダウンロードして実行すると、更新の確認が出てきますので実行してください。
無事に更新が終わると、storeの起動画面が出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621883/1a6c2d8a-6c36-48c6-24b8-c26335baff4c.png)
PLATEAUを無制限に取り込み、どこへでも持ち運ぶ。国連スマート地図バザール

[3D都市モデル Project PLATEAU Advent Calendar 2023]()の開設、おめでとうございます！

G空間情報センターからオープンデータとして公開されているProject PLATEAUの三次元タイル（3D Tiles）形式データを、自分の超小型サーバに取り込んで、ウェブ地図の形で見えるようにしています。

- [デモサイトのインデックスページ](https://smb.optgeo.org/ipfs/QmTUrkw3j7PPyizAbjZPxT6SCWf37fmvDYPbpfZ4t99sAn)
- [GitHubリポジトリ](https://github.com/optgeo/platoon)

超小型サーバというのは実際には Raspberry Pi 4B であり、活用している技術は惑星間ファイルシステム（IPFS; InterPlanetary File System）です。

この実装は「破壊的に安価で、耐え難いほど遅く、そこそこ止まらない」ことを目指した実装です。

この技術は、今年6月にコソボで開催された FOSS4G 2023 のために、私が主任を務めている国連スマート地図グループのプロジェクトとして開発しました。

地理空間情報をIPFSのような分散ウェブ技術によって手軽に共有できるようにし、ウェブ地図を開かれたものに保つことを私たちは目指しています。そのためのプロジェクトとして、[国連スマート地図バザール](https://github.com/unopengis/smb)は立ち上がりました。

国連スマート地図バザールは、[国連スマート地図グループ](https://unopengis.github.io/smb)のプロジェクトであり、国連スマート地図グループは[国連オープンGISイニシアティブ](https://unopengis.org)の第７作業部会です。
Cannot clone a git repository using Sourcetree

# Issue

I copy the SSH URL for cloning it in my sourcetree, and paste the URL like this.

![スクリーンショット 2023-11-15 230804.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532286/8fc71e4e-28cc-0d04-fd7f-214e28438d6f.png)

and as you can see, Repository Type give me "This is not a valid source path / URL"

The Content of Detail was like this
```
git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks push
-v --tags --set-upstream origin renewal:renewal Pushing to github.com:user name/
Git-practice.git 
The host key is not cached for this server: github.com (port 22) You have no guarantee 
that the server is the computer you think it is. The server's ssh-ed25519 key fingerprint
is: ssh-ed25658 256　SHA256:+HiY3wvvV7TuJJhbpZisF/zLDA0zPMSvHdkr7UvCOqU If you trust 
this host, enter "y" to add the key to
```


# Solution

1. Open command prompt
2. Execute the following command

```
 > "C:\Users\username\AppData\Local\SourceTree\app-3.4.12（change the last part to yours）
\tools\putty\plink.exe" -ssh -C -i "C:\Users\nyun\sourcetree\private.ppk" 
git@github.com:～～（paste the SSH URL here）
```

Then, it ask like "If you trust this host, enter “y”...", so enter "y".

![スクリーンショット 2023-11-15 234730.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532286/bde0ce10-e2b3-2af7-9a44-cf6dbf3b5dda.png)

Yay! did it!
ロードバランサ配下のサーバを全部切り離してサービス停止させてしまった話

# はじめに
この記事は、[本番環境などでやらかしちゃった人 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/yarakashi) の6日目です。

https://qiita.com/advent-calendar/2023/yarakashi

この記事で取り上げるやらかしは数年前の出来事です。
当時新卒2年目のエンジニアだった私が、ロードバランサ配下のサーバを全部切り離してサービス停止させてしまった話について、ここに供養させていただきます。

自分の失敗談なんて書きとぉないんじゃ、、というのが本音ですが、毎年やらかし系のアドベントカレンダーに勇気と希望をもらっていたので、今年は私もその一助となれたらという思いです。
やらかして死にたくなっているあなたへ。

# 背景
新卒で入社した会社で社内システム向けインフラの保守運用に携わっていました。
2年目となって仕事にも慣れてきた頃（フラグ）、事を起こしてしまいました。

## 環境
やらかしの対象となった環境はこちら。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/feeda26f-5a76-6e23-bf1b-67538d26536f.png)

AWS環境上で、ロードバランサとしてELBがあり、その配下にサーバ（EC2）を2台配置しているという、よくある構成です。
サーバ上ではSquidが動いており、この環境はフォワードプロキシとして機能提供しています。
社内システムを提供するサーバ側でこのロードバランサをプロキシとして設定し、インターネットに通信しにいく際にこのロードバランサを経由させる、という使われ方です。

## 当時の運用
保守運用作業でプロキシサーバ内の設定ファイルを書き換えたり、モジュールのバージョンアップを行ったりする際は、その変更がサービス提供に影響を与えないようにするため、変更作業前にロードバランサから片系ずつサーバの切り離しを行っていました。
※プロキシサーバ#2→プロキシサーバ#1の順に、以下作業を行う
 　1. ロードバランサからの切り離し
 　2. プロキシサーバ内の変更作業
 　3. ロードバランサへの再登録

そして、そのサーバの切り離し、および再登録は、AWS CLIにより行っていました。

# ある日、事件は起こった
プロキシサーバの変更作業に伴い、いつものようにプロキシサーバ#2から作業を始めました。
ロードバランサからプロキシサーバ#2を切り離し、予定通り変更作業を進めていると、社内システムの担当者から **「インターネット向けの通信でエラーが出ている」** という連絡が。

あれ、プロキシサーバ#1は生きているはずなのに、、

急いでマネジメントコンソール（AWS環境の管理画面）からロードバランサを状態を確認すると、
**ロードバランサの配下に、プロキシサーバが2台とも登録されていない状態となっていました。**

止まらない冷や汗。

即座に作業を中断し、震える手でプロキシサーバ#2をロードバランサに再登録しました。
ロードバランサ経由のインターネット接続に問題がないことを確認し、復旧。

# 原因
その日はたまたま、別件でプロキシサーバに対する変更作業があり、並行して作業が進んでいました。
別作業の担当者がプロキシサーバ#1を切り離し、その後に私がプロキシサーバ#2を切り離してしまったため、結果障害。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/24b7804c-8083-b590-9715-a1c3714c7958.png)

根本原因としては以下が考えられました。
- 当日実施される作業の全量、およびその内容がチーム内で共有できておらず、並行して複数の作業を行うことに問題がないかという目線で事前にチェックができていなかった
- ロードバランサからプロキシサーバを切り離す前に、両系がロードバランサに登録されていることを確認すべきだったが、その手順が作業手順書に含まれていなかった

# 終わりに
この件を上司に報告し、しっぽり怒られたあと、上記根本原因に対する対応に着手しました。
作業に関するチーム内コミュニケーションの円滑化、作業手順書の修正を行い、事象の再発には至っていません。

やらかしは起こさないに越したことはないですが、もしやらかしを起こしてしまった場合は、真摯に再発防止につとめ、後輩が同じ轍を踏まないようにしてあげたいなあと思います。
そのやらかしも、いつかまた思い出話する日の花になる迄。。

お付き合いいただきありがとうございました。
Rails7のTurboを使った実装をしてわかったことと考察

# はじめに
本記事は錆びかけたRailsの知識を頑張ってアップデートするアドベントカレンダーの5日目です。

引き続き猫Rails様の[猫でもわかるHotwire入門 Turbo編](https://zenn.dev/shita1112/books/cat-hotwire-turbo)を読み進めています。いま、2章の真ん中くらいまで来ました。

本記事では、ここまで学習してわかったRails7の特徴とそれについての考察を備忘録的に残します。Rails6までしか知らない、Rails7をまだ触ったことが無い人に役に立つかもしれません。

# わかったこと及び考察

- Rails7の目玉の1つであるTurboとはリクエストに対して非同期でHTMLをレスポンスするような機能
- Rails7を使ってアプリを作ると、初期設定ではレスポンスがbodyタグの中だけ帰ってくる
- turbo_frame_tagという新しいヘルパーメソッドにより柔軟に非同期なレンダリングができる

### Rails7の目玉機能の1つであるTurboとはリクエストに対して非同期でHTMLをレスポンスする機能
Turboは、Rail7で推されている機能群の総称です。これは、サーバにリクエストが来たとき非同期でHTMLをレスポンスする機能だと理解しました。

「非同期で」とはどういうことかというと、例えば一般的なWebアプリケーションでなんらかのリンクをクリックしてページが切り替わる際、サーバは「同期的に」ページを更新します。リクエストされた内容に基づきデータを作りブラウザに返すその中に、ユーザーがリクエストしたページのHTML/CSS/JavaScriptが含まれています。ブラウザはそれらを読み取って0からページを作り直し表示します。この時ブラウザの画面は、古いページから切り替わる一瞬空白になる時間があり、ユーザーはリクエストした瞬間からブラウザの表示が終わるまで操作することができなくなります。

一方非同期の場合はページ全体が再度読み込まれることはありません。ページの一部分に必要なデータがレスポンスされるのみで、ブラウザは全てが再描画されず一部分だけ更新されます。結果的にページが切り替わる空白の時間がなく、ユーザーはリクエストした後もブラウザを操作し続けることができます。

非同期の方がページが空白になる瞬間がないので、アプリを使った時の印象が「サクサク動くな」「快適だな」となりやすいです。

### Rails7を使ってアプリを作ると、初期設定ではレスポンスがbodyタグの中だけ帰ってくる
Rails7とRails6以前との大きな違いは、アプリを作成し始めた初期設定(デフォルト)でリクエストが非同期になることです。返却されたリクエストはbodyタグの中身だけが非同期で更新されます。それ以外の部分はそもそもレスポンスに含まれていないのか、ブラウザには到達してそのあと使われないのかはまだ不明です。

この機能を**Turbo Drive**と言います。

もしリクエストを同期にしたい場合は、アプリケーションの設定ファイルを編集してオプションを指定する必要があります。

### turbo_frame_tagという新しいヘルパーメソッドにより柔軟に非同期なレンダリングができる
Turbo Driveによる非同期処理はbodyタグの中身を非同期的に更新するものです。一方、Rails7から正式追加された`turbo_frame_tag`というヘルパーメソッドを使うとこのヘルパーメソッドで囲ったHTMLの箇所のみを非同期で更新できます。

例えば以下のように利用します。

```erb:index.html.erb
<!-- 一覧 -->
<div class="card shadow mt-3">
  <div class="card-header">
    <%= icon_with_text("table", "一覧") %>
  </div>

  <div class="card-body mx-3">
    <%= turbo_frame_tag "cats-list" do %>
      <div class="row py-2">
        <div class="col-4 mt-auto">
          <%= sort_link(@search, :name) %>
        </div>
        <div class="col-4 mt-auto">
          <%= sort_link(@search, :age) %>
        </div>
        <div class="col-4 d-flex justify-content-end">
          <%= link_to icon_with_text("plus-circle", "登録"),
                      new_cat_path,
                      class: "btn btn-outline-primary"
          %>
        </div>
      </div>

      <%= render @cats %>

      <div class="d-flex justify-content-end mt-3">
        <%= paginate @cats %>
      </div>
    <% end %>
  </div>
</div>
```

`turbo_frame_tag`ヘルパーで囲った内部からのリクエストは特別に扱われ、その場合ページ全体ではなく、`index.html.erb`の範囲のみがレスポンスされます。そして、`turbo_frame_tag`で囲った部分だけが更新されます。

これはちょうど、erbでビューを作るにあたりJavaScriptで非同期通信し、返却されたデータをもとにJavaScriptでHTML要素を作ってページの一部と置き換えるといった実装と良く似ています。

```javascript:javascriptの例

```

Rails7ではこのような実装もJavaScriptをほとんど書かずに実現できてしまいます。確かに、生産性の高さを謳っているだけのことはありますね。
アウトプットはスピードが命です！

アウトプットの心構え Advent Calendar 2023の5日目です。

別のカレンダーに執筆予定がたまたまこのアドカレに出会ってしまったので、12/5はあと32分しかないけど執筆します。

この記事ではスピード感を持ってアウトプットすることの重要性について書きます。

インターネットが登場し一般的に使われるようになってから20数年になりますが、時を追うごとにスピードの重要性が増し続けています。

# 開発のスピード感

昔々、仕事をしていたときにプロトタイプを1週間程度で作って驚かれたことがあります。しかし、現在では、

- 翌日にプロトタイプを作って普通
- 当日中ですごい
- 30分以内だと驚かれる

というくらい開発にもスピード感が求められているように感じます。Yコンビネーターなど米国スタートアップの動きを見ているとスピードこそ命でどれだけ短時間でプロダクトを出してPDCAを回していくか、同じ期間でどれだけの回数失敗できているかなどが求められています。

日本ではまだまだ開発には仕様確認をして調整をして見積もりをしてなどとやっていますが、どちらが生産的で世の中に大きなインパクトを出せているかは日の目を見るよりも明らかです。

# 技術記事執筆のスピード感

最近はQiitaやZennなどのようなプラットフォームがあり、技術記事の執筆が気軽に行えるようになっています。そんな中、毎日のように世界中でざまざまなOSSが誕生し新しい技術が次々に生まれ続けています。XのTLを見ていても様々な情報が飛び交っていますがすべての情報をキャッチアップすることは非常に困難な時代になっています。

多くは「積読」状態で「あとで読む」のまま永遠に読まれることはないpostや記事が多いでしょう。

周りを見渡して、成長し続けている人や業務においても良い仕事をしている人たちの多くはアウトプットを繰り返しています。

これはなぜだか考えたことがありますでしょうか？

# 脳の働きから考えるアウトプットの重要性

人間の脳の構造を考えてみるとわかりやすいのですが、見ただけのものよりも経験したほうが圧倒的に記憶に残るからです。

インターネット上では日々膨大な量の情報が発信され続けており、情報を目にしてもすぐに記憶から消えてしまいます。これを少しでも自分の身にするためには、自分でアウトプットする以外に方法はありません。

日々目にする情報は **風景の一部** と同様に記憶に残りませんが、自分で手を動かしたりすることで **経験として記憶に残る** ことになります。

これは例えば小学生の時に漢字をいくら眺めても覚えることはできませんが、手で書くことで覚えることができるのと同様の脳の働きになります。

# 学びたければ手を動かす

プログラミングを学ぶ際にも本を読んでいてもなかなか身につきません。基本的には手を動かしものづくりをすることで身についていきます。

手を動かす方法としては以下のものがあります。

- サンプルコードを動かす
- 写生してコードを動かす
- 業務でコードを書く

それに加えて記憶に残りやすいのが次の方法になります

# 人に教える

これも何を学ぶときにも聞く話ですが、人に教えることで自分がより良く知ることができるようになります。自分がしっかりと理解していないと人にうまく伝えることができないためです。

つまり

- 人に教える
- コードレビューをする

などをすることで手を動かすだけよりも効果的に新しいことを学ぶことができます。

人に教えるをより高度にすると

# 情報を整理して人に教える

質問されて人に教えるパターンに加えて、誰が見ても理解できる状態に情報を整理して伝えるという教え方もあります。この方法がテックブログやQiitaなどで技術記事をまとめる方法になります。

記事に仕立てるためにはしっかりと理解していないと情報を整理することができないので、まずは自分がしっかりと理解する必要があります。そのうえで伝えたい情報を整理して情報をテキストにアウトプットすることになります。

# なぜスピード感が重要か

情報を整理して伝えることの重要性は上記の通りですがなぜスピード感が重要なのか？

これも情報の流れになります。日々洪水のような情報に飲み込まれてしまうような情報社会ですが、私たしは日々成長し続ける必要上がります。情報に飲み込まれないためにも短期間で新しいことを学んでいく必要があります。

効率的に新しいことを学ぶには情報をアウトプットが重要なので、短期間のアウトプットを繰り返すことで他の方が学ぶよりも速いスピードで新たなことを学び続けることができるようになります。

Xなどを見ていても新しいことを発信し続けている方を見て「すごいな〜」と感じることも多いと思いますが、この記事を読んだあなたも今日からその達人のようなアウトプット力をつけるために実行できることがあります。

まずは間違っていても、雑でも良いのでアウトプットすることを習慣化しましょう！それにより情報の整理の仕方や収集の仕方などインプットからアウトプットまで様々なことを学ぶ事ができ、学ぶことでまた新たな知識の領域に到達することができます。

まずは躊躇せずに　**アウトプットする習慣を身に着けましょう！**

# まとめ

スピード感をもってアウトプットを繰り返すことで劇的な成長を遂げることができます。

まずは騙されたと思ってやってみてください。

# おまけ

ここまでで23:57なのでギリギリ、12/5の記事として公開します
【Next.js】サーバーコンポーネントでクエリパラメータを取得する方法

以下のように`middleware.ts`でヘッダーに設定することで、サーバーコンポーネントでクエリパラメータを取得できます。

```middleware.ts
import { NextResponse } from 'next/server'
import { NextRequest } from 'next/server'

export async function middleware(req: NextRequest) {
  const requestHeaders = new Headers(req.headers)
  reqHeaders.set('x-params', req.nextUrl.searchParams.toString())

  return NextResponse.next({
    request: {
      headers: requestHeaders,
    }
  })
}

```

```layout.tsx
import { headers } from 'next/headers';

export default function RootLayout() {
  const headersList = headers()
  const header_params = headers().get('x-params') ?? "";
}
```
Railsアプリの画像をS3にアップロードをしてみた

# はじめに
フロントエンドよりの駆け出しエンジニアの私が、Railsのアプリケーションの画像をS3にアップロードしてと言われたのでやってみたの記事を書こうと思います。

# そもそもS3とは
AWSのオンラインストレージサービスです。
画像データは容量が重く、データベースでの保存だと、クエリの実行速度が重くなり、パフォーマンスが低下します。
さらに、ストレージ容量が満たされ、拡張が必要になることがあります。
そのため、S3などの大規模データを保管することに特化したサービスを使います。

S3以外の画像やファイルのストレージサービスには以下のようなものがあります。
- Google Cloud Storage
- Microsoft Azure Blob Storage
- Backblaze B2:

# Railsで、画像をS3にアップロードする方法
Railsで、画像をS3にアップロードする方法を調べました。
## 方法1 Active Storage
Rails標準の技術のActive Storageを使用する方法があります。
Active Storageは、ファイルアップロードを行う機能で、Rails5.2で追加されました。
Rails側では、storage.ymにAmazonの情報を書き込み、Active Storageの設定ファイルにて、Amazaonを指定するだけでとても簡単です。

## 方法2 Carrierwaveとfog-aws　（こちらを採用しました。）
こちらは、上記のGemをインストールして、アップローダーをマウントしたり、画像ファイルの保存先を指定します。
carrierwave.rbを生成したりとActive Storageより少し、工程はありますが、こちらも簡単です。
また、先人たちが多いので、参考記事が多くありました。

イメージ図
![スクリーンショット 2023-12-05 23.41.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889120/59db9366-2f39-85ed-01cc-1fbfc2d2a490.png)

# 実際の手順
1. `gem 'carrierwave'`をGemfileに追加します。
1. `gem 'fog-aws’`を追加も追加します。
1. アップローダーの追加と編集を行います。
```ruby:/app/uploaders/image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
  # 保存形式の設定
  storage :fog

  # 画像ファイルの保存先の設定
  def store_dir
    "uploads/share/#{model.voice_id}/#{model.category}"
  end
end
```
4.モデルの修正を行います。
```ruby
# CarrierWaveのアップローダーをマウント
  # ImageUploader を使用して、
  # photo カラムにファイルをアップロードできるようになる。
  mount_uploader :photo, ImageUploader
```
5.envファイルにアクセスキーを入力します。
```
S3_ACCESS_KEY_ID = 'アクセスキー'
S3_SECRET_ACCESS_KEY = 'シークレットアクセスキー'
```
6.carrierwave.rbを作成
```ruby:config/initializers/carrierwave.rb
require 'carrierwave/storage/abstract'
require 'carrierwave/storage/file'
require 'carrierwave/storage/fog'

CarrierWave.configure do |config|
  config.storage = :fog
  config.fog_provider = 'fog/aws'
  config.fog_credentials = {
    provider: 'AWS',
    aws_access_key_id: ENV['S3_ACCESS_KEY_ID'],#AWSのaccess_key_id
    aws_secret_access_key: ENV['S3_SECRET_ACCESS_KEY'],#AWSのsecret_access_key
    region: 'ap-northeast-1', #アジアパシフィック（東京）を表している
    path_style: true
  }

  config.fog_directory  = 'バケット名'
  config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/バケット名'
end
```

# おわりに
お読みいただきありがとうございました。
S3と聞くと、初学者の方がよく詰まっている印象があったので、実装が不安でした。
しかし、Railsは使いやすいGemなど方法が用意されており、容易に設定できると知ることができ、印象が変わりました。

今後もRailsや他の開発系記事諸々コンスタントにあげていきたいと思います。
超小型ゲーム機 Thumby を手持ちのパーツで再現してみた：その③

[前回記事](https://qiita.com/inachi/items/3c3c7e599127815b48e9)の続きです。

# Thumby ファームウェアのインストール

Chromemを使って[Thumbyのコードエディタ](https://code.thumby.us/)を開き、上にあるメニューから「UTILITIES」→「DOWNLOAD FIRMWARE」を選択します。

![スクリーンショット 2023-12-05 21.52.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/cdf473ce-dac3-3596-3e27-ebed65921fce.png)

「ThumbyFirmware.uf2」という名前のファイルがダウンロードされるので、Raspberry Pi Picoのブートローダを起動(BOOTSELボタンを押しながらPCにUSB接続)し、マウントされた RPI-RP2 フォルダに「ThumbyFirmware.uf2」をコピーします。

# ファームウェアをコードをちょっと修正

[前回記事](https://qiita.com/inachi/items/3c3c7e599127815b48e9)で書いたとおり、本物ではボタンBに GPIO24 を使っていますが、Raspberry Pi Picoで GPIO24 はUSB電源入力のチェック用に使われていて外に出ていないので、代わりに GPIO21 を使っています。そのため、ファームウェアのコードも少し変更する必要があります。

まず、Raspberry Pi Pico をPCのUSBに繋ぎます。Thumbyコードエディタの上にあるメニューから「CONNECT THUMBY」をクリックします。

![スクリーンショット 2023-12-05 21.52.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/37f4df1d-d8d9-f076-09e6-d1f1e1d10ac8.png)

すると、左ペインに保存されているファイルが表示されるので、lib/thumbyHardware.py をダブルクリックして開きます。

![スクリーンショット 2023-12-05 22.35.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/2c1e291f-3514-0334-2606-3e04f9f5d4ee.png)

33行目にボタンBで使うGPIOピンの設定があるので、24から21に変えて、「FILE」→「SAVE TO THUMBY」を選びます。

![スクリーンショット 2023-12-05 22.41.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/99a790a0-d331-f9b9-7291-b0f2c9aea9ff.png)

これで、ファームウェアの修正は完了です。

細かいことをいうと、128x64サイズのOLEDの表示に使っていないところにゴミが出てしまうのを治すというのもあるのですが、修正しなくても実用上は問題ないので、本記事では省略します。

# これで（たぶん本物同様に）遊べます

Bad AppleやPicoInvadersを実行してみた写真を載せておきます。

![IMG_7191.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/807481f8-b26a-7dcd-6a8b-2b875be4af0e.jpeg)

![IMG_7192.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/e9a10670-b818-5985-88b8-876f3ac12a6f.jpeg)
win10 : Robocopyを使って定期バックアップを取る

## 背景

動物の写真を撮ることを趣味にしている．撮った写真はすべてHDDに保存しているが，
読み書きが止まったりと，最近HDDの調子が悪い気がするので，別ドライブでバックアップを取ることにした．
「毎回コピーして貼り付ければいいやん」と言われそうだが，
削除等の編集をしたフォルダもバックアップ上では反映されて欲しいと思うし，
1の成果のために10の苦労をするのがエンジニアだと思うので実際にやってみる

## 使用するツール

### 環境

OS : Microsoft Windows 10 Pro

### 1. robocopyコマンド

```terminal:robocopyコマンド
robocopy [コピー元パス] [コピー先パス] /MIR /COPYALL /LOG+:[ログファイルのパス]

```
linuxの`cp`コマンド同様ファイルおよび子フォルダのコピーが可能なのに加えて，
差分コピーが可能なwin10のコマンド．

#### 使ったオプション

| オプション                 | 意味                           | 備考                                               | 
| -------------------------- | ------------------------------ | -------------------------------------------------- | 
| /COPYALL                   | ファイル情報をすべてコピーする |                                                    | 
| /MIR                       | 完全ミラーリング               | コピー元になく，コピー先にあるファイルは削除される | 
| /LOG+:[ログファイルのパス] | 追記する形でログを出力する         |                                                    | 

実行すると以下のようなログが出力される

```log:robocopy出力ログ
-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー                              
-------------------------------------------------------------------------------

  開始: 2023年12月4日 23:38:53
   コピー元 : C:\Users\photo\
     コピー先 : F:\testbackup\

    ファイル: *.*
	    
  オプション: *.* /S /E /COPYALL /PURGE /MIR /R:1000000 /W:30 

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

	                   5	C:\Users\photo\
	  新しいファイル		  238576	image-1.png
 54%  
100%  
	  新しいファイル		  272029	image-2.png
 48%  
 96%  
100%  
	  新しいファイル		  195033	image.png
 67%  
100%  
	  新しいファイル		    1221	log.txt
```
実行後コピー先フォルダをエクスプローラーで見ると，確かにコピーされている．

### 2. タスクスケジューラ

定期的にコマンドを実行するために利用するwin10の標準ツール
![タスクスケジューラ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/7c883b59-3b94-e97e-b15a-730c9a879e13.png)

なんか難しそうだけど，タスクの作成と情報閲覧さえできれば問題ない(と思ってる)．
adobe製品などの自動アップデートのタスクなどがここに入っていて，
PCの立ち上がりが遅いなぁと思ったらここを見るのも良いと思う．

タスクスケジューラを使うと，時間やログイン時などのトリガーに応じて
所定のタスク・プログラムを実行できる．

## 定期バックアップを取る

### 1. タスクスケジューラを開く

意外と分かりずらい位置にあるのでメモしておく．
タスクバーの検索で「タスク」で検索するか，
タスクバーのwindowsボタンを押して，アプリ一覧の「windows 管理ツール」の中を見るか，
のどちらかになると思う．

### 2. 基本タスクの作成

タスクスケジューラで定期的に動作させるタスクを作成する．
名前や説明は自分が分かりやすい名前で問題ない．

![手順1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/f354f1bc-822a-02c9-0c74-91cb2e28ce06.png)

### 3. タスクトリガーの設定

バックアップを取るタイミング(トリガー)を設定する．
自分は週1回月曜日で設定している．

![手順2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/82013ba9-6d61-390b-ad71-11e25298b266.png)

### 4. 操作:プログラムの開始

定期実行するタスク(プログラム)の自体の設定を行う．
robocopyのプログラム/スクリプトは以下のパスにある．
```
C:\Windows\System32\robocopy.exe
```
引数の追加には，コマンドの引数をそのまま記入する
![手順3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/395dcc6f-787d-2f6b-8890-a2831ec9a703.png)

### 5. 要約の確認

必ず，操作欄にある**コピー元とコピー先のリンク**を確認すること
(ミスったら元ファイルを白紙で更新することになる)

![手順4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3600683/a87af2c2-980e-bf27-3310-3b69f3654bf6.png)

これで定期バックアップの設定が完了．
aws lambdaカスタムランタイムでGoを動かす

# aws lambdaでGo
アドベントカレンダー5日目です。
Goはaws lambdaで正式にサポートされていましたが、Amazon Linux AMI のメンテナンスサポートが 2023 年 12 月 31 日に終了するに伴い、Go 用ランタイムもサポートが終了してしまいます。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-golang.html

そのため、これからは`provided.al2`イメージ上に作成する必要があります。


## Dockerfile作成
```bash
touch app/day5/Dockerfile
touch app/day5/main.go
```
`day5`を独立したモジュールとしたいため、初期化しておきます。
```bash
cd app/day5
got mod init github.com/shuyaeer/learn-go/app/day5
```

Dockerfileです。ビルドしたバイナリを`provided:al2`上で実行しています。
```docker
FROM golang:latest as build

WORKDIR /app

COPY go.mod go.sum ./

COPY main.go .
RUN go build -tags lambda.norpc -o main main.go

FROM public.ecr.aws/lambda/provided:al2
COPY --from=build /app/main ./main
ENTRYPOINT [ "./main" ]
```

メインのプログラムです。シンプルに文字列を返すものにしました。
```go
package main

import (
	"context"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

func handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
	response := events.APIGatewayProxyResponse{
		StatusCode: 200,
		Body:       "\"Hello from Lambda!\"",
	}
	return response, nil
}

func main() {
	lambda.Start(handler)
}
```

ビルド
```bash
docker build -t lambda-go-sample:test .
```

ローカルでlambdaを実行するためのエミュレータをインストール
```bash
mkdir aws-lambda-rie

curl -Lo aws-lambda-rie/aws-lambda-rie \
 https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie

chmod +x aws-lambda-rie/aws-lambda-rie
```

コンテナ起動
```bash
 $ docker run -v `pwd`/aws-lambda-rie:/aws-lambda \ 
   -p 9000:8080 --entrypoint /aws-lambda/aws-lambda-rie \
  lambda-go-sample:test ./main
  05 Dec 2023 14:52:33,937 [INFO] (rapid) exec './main' (cwd=/var/task, handler=)
05 Dec 2023 14:52:59,385 [INFO] (rapid) INIT START(type: on-demand, phase: init)
05 Dec 2023 14:52:59,390 [INFO] (rapid) The extension's directory "/opt/extensions" does not exist, assuming no extensions to be loaded.
START RequestId: cf4d9fad-94cd-4731-aa8c-a38f774d384d Version: $LATEST
05 Dec 2023 14:52:59,394 [INFO] (rapid) Starting runtime without AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN , Expected?: false
05 Dec 2023 14:52:59,475 [INFO] (rapid) INIT RTDONE(status: success)
05 Dec 2023 14:52:59,475 [INFO] (rapid) INIT REPORT(durationMs: 92.176000)
05 Dec 2023 14:52:59,477 [INFO] (rapid) INVOKE START(requestId: c97ef940-dce9-4b25-881a-dbb5eee68382)
05 Dec 2023 14:52:59,525 [INFO] (rapid) INVOKE RTDONE(status: success, produced bytes: 0, duration: 46.652000ms)
```

別ターミナルからリクエストを送ってみます。
```bash
 curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}' | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    92  100    90  100     2   4754    105 --:--:-- --:--:-- --:--:--  6571
{
  "statusCode": 200,
  "headers": null,
  "multiValueHeaders": null,
  "body": "\"Hello from Lambda!\""
}
```

よさそうです。
画像と音声から動画をつくーる（Python）

# はじめに
[がちもとさんアドベントカレンダー](https://qiita.com/advent-calendar/2023/gachimoto3)5日目の記事です。
今日は、画像と音声から動画を作成するプログラムを作りました。

# 開発環境
- Windows 11 PC
- Python 3.11

# 導入

~~~image2movie.py
from moviepy.editor import *

# 画像ファイルの読み込み
image = ImageClip('slide.jpg')

# mp3音声ファイルの読み込み
audio = AudioFileClip('speech.mp3')

# 動画の長さを音声に合わせる
video = image.set_duration(audio.duration)

# 動画に音声を合成する
video = video.set_audio(audio)

# 動画を保存する
video.write_videofile('output.mp4', codec='libx264', fps=30)
~~~

# 実行結果

https://x.com/sotongshi/status/1731687113127493737?s=20

これでスライドとテキストを用意して、昨日の[OpenAIでテキストから音声合成](https://qiita.com/SatoshiGachiFujimoto/items/01fb948017619a008469)すれば、プレゼン用の動画もできちゃいますね！

お疲れさまでした。
NetBSDC-currentで新たに追加される新機能を試してみる

[NetBSD Advent Calendar 2023](https://qiita.com/advent-calendar/2023/netbsd) 5日目の記事です。今日はNetBSD-10(というかNetBSD-currentで確認した)新機能を試してみようと思います。

## NetBSD-10に搭載されるであろう新機能

[昨日の記事](https://qiita.com/furandon_pig/items/024097dbd565c9d8d429)で紹介した、来るべきNetBsd-10に搭載されるであろう新機能をためしてみようと思います。

```sh
# find /usr/share/man/ -type f \
    | grep '\.[0-9]' \
    | xargs grep -A1 'first appeared in' \
    | grep '.Nx 10\.0' \
    | sed -e "s/-.*$//"
...
/usr/share/man/man1/scmdctl.1
/usr/share/man/man2/getrandom.2
/usr/share/man/man2/poll.2
/usr/share/man/man2/pollts.2
/usr/share/man/man2/ppoll.2
```

NetBSDのソースツリーを辿ると、システムコール的には `getrandom(2)` と `ppoll(2)` が新たに追加されているようです。

## getrandom(2)

[getrandom(2)](https://man.netbsd.org/getrandom.2)はLinux 3.17で追加された機能ですが、これが新たにNetBSD-10で利用できるようです。サンプルコードは以下になります。

```c
#include <sys/random.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
        uint8_t secretkey[32];
        ssize_t ret;

        ret = getrandom(secretkey, sizeof(secretkey), GRND_RANDOM);
        if (ret == -1) {
                err(EXIT_FAILURE, "getrandom");
        }

        for (int i = 0; i < sizeof(secretkey); i++) {
                printf("%02x:", secretkey[i]);
        }
        putchar('\n');

        exit(EXIT_SUCCESS);
}
```

実行結果は以下になります。

```sh
:c5:64:66:d1:65:38:d9:32:fb:60:ea:0e:3e:79:77:40:07:4b:76:4d:77:35:
```

## pploll(2)も追加されました

[ppoll(2)](https://man.netbsd.org/ppoll.2)も追加されています。サンプルコードは以下になります。どうやら `ppoll(2)` はLinux独自のシステムコールのようで今回新たにNetBSDに追加されたシステムコールのようです。

```c
#include <err.h>
#include <poll.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
        struct pollfd fds[1];
        struct timespec timeout = {0, 0};
        int r, len;

        char buf[BUFSIZ];

        fds[0].fd = fileno(stdin);
        fds[0].events = POLLRDNORM;
        fds[0].revents = 0;

        while ((r = ppoll(fds, 1, &timeout, NULL)) != -1) {
                if (fds[0].revents & POLLRDNORM) {
                        len = read(fds[0].fd, buf, sizeof(buf));
                        puts(buf);
                }
        }

        exit(EXIT_SUCCESS);
}
```

## まとめ

来るべきNetBSD-10に搭載される機能を調べてみました。 `getrandom(2)` や `ppoll(2)` といった、Linuxのシステムコールとの互換性を保つ機能が追加されているようです。BSDユーザ個人としては、それが良いことなのかどうなのかは判断しかねますが…😖(互換性が高まるのはよいことではあります…)。
【Go言語】ポインタ

## ポインタとは
値のメモリアドレスを扱う機能のこと。
変数がメモリ上のどこに格納されているかを示すために使用する。

## 使い方
**ポインタの宣言**：`*` + `型`
**アドレスの取得**：`&`演算子
**値の参照**：`*`演算子

## サンプルコード
```go
package main

import "fmt"

func main() {
	var x int = 1
	// xのアドレスをpに割り当てる
	var p *int = &x
	// pが指すアドレスの値を出力する
	fmt.Println(*p) // 1

	// pが指すアドレスの値を変更する
	*p = 2
	fmt.Println(x) // 2
}

```

## 参考

https://www.oreilly.co.jp/books/9784873119694/