OmniAICreator/Qiita-1.07M huggingface dataset:
先輩エンジニアとしてのコミュニケーションの勘所

この記事は[リンクアンドモチベーション Advent Calendar 2023](https://qiita.com/advent-calendar/2023/lmi)の3日目の記事になります。


# はじめに
これまで僕はバックエンドエンジニアとしてキャリアを始め、フロントエンドに転向し、新規プロダクトの立ち上げなどを経験してきました。
小さなチームで働く機会が多く、チーム内でもいわゆる若手の層だったので先輩のエンジニアの方々と協業していました。

しかし、最近はチームやプロジェクトをリードする機会が増え、チーム内にも後輩のエンジニアが出来ました。
育成、特にコミュニケーションにおいて、個人、またチームとして意識しておきたいポイントをまとめようと思います。

# 前提
僕の所属するチームは社員が4人でそのうち1人が新人のため育成の優先度は高いです。
実際の開発の効率を落としたくはない かつ 早く1人前になってもらいたい。という状況です。（そのようなチームが多いと思いますが...）

投資対効果は高くしたく、少ない投資で大きなリターンが欲しいです。つまり勝手に育っておいてもらいたい。
直近起きてるな〜と思った問題とそれに対して行ったことを整理したので記載します。

# 認知が合ってないとお互いつらいことになる
正直、先輩とはいえ後輩が何から何まで出来るかどうかなんてわかりません。
なにかタスクや課題を渡す時には目的や、納期、方法などをすり合わせますが、そもそも互いの基準が擦り合っていないと、しばらくして、なかなか進んでいないことに気がついたり、そもそも荷が重すぎる内容を渡してしまっていたりすることがあるんじゃないでしょうか？

更につらくなるのは「出来ると思っていたのに...」というもの以上に、「想像以上に重たいタスクになってしまったな。。。」「もう少し適切なものからやってもらったら良かったな」ということの方が多い気がします。


# 能力を見極めることは難しいと感じる
お互いにわからないでいるままがいいと思っているわけではないです。
しかし具体的なタスクを進める際にどのように取り組んでいるか、それが難しいと捉えているものなのか、簡単だと捉えているものなのかを正確に把握することは難しいと思います。
実際に「難しいです」と難しいと思って言ってるかわからないですし、「大丈夫です！」と言ってるのに大丈夫じゃないことは往々にしてあると思います。
どこまで教えたら良くて、どこまでは理解しているんだ..とよく悩んでしまいます。

## なかなかちゃんと伝わってないなという感覚にもなる
更には教えようとして、何かを伝えようとします。その時に例え話をよく使いますが、それもなかなか伝わってる気がしない。
具体的な話は話でそもそもの言葉の意味が通じている感じがしない...みたいな感覚です。

# 何が起きているのか
ここで起きている原因の1つが互いに期待値を曖昧なまま進めてしまっていることです。
先輩は先輩で正しくスキルや後輩の課題に対する捉え方を理解できていないし、後輩も自分がどんなものを最終的にアウトプットしたらいいのかを正しく期待値を理解していないことがあります。

必要なことはお互いにすり合わせることです。


# 解決していくために
解決のためのコミュニケーションとしてはどこまで教えたらいいのか、任せてできるのか をすり合わせ整理することが大切です。

まずはアウトプットしてもらい方針やゴールをすり合わせましょう。
具体的にタスクの進め方を書き出してもらったり、現状の理解を言葉にしてもらって聞くことが効果的です。

また、期待以上のことが出来ることもあればそうでないこともあります。
先輩と後輩のお互いがそのタスクに対してどう捉えているのかを整理することが大切です。

そのために、課題と育成対象の能力を考えタイプに分けて対応を変えています。
以下のように整理して、対応の方針を変えています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642245/25abd848-4278-fd95-b7e2-23a5a16f56f7.png)
引用:[フィードバックとは？意味や目的・やり方を解説 ！効果を高める方法](https://stretch-cloud.lmi.ne.jp/column/0072)

上記は管理職のマネジメントの手法に関してまとめている図ですが、あらゆる先輩と後輩の関係で応用できると思います。

- 先輩も後輩も出来ると捉えている場合
    - 信じて任せて見ましょう。どんどん挑戦してもらい、失敗も経験してもらうと良いです。
- 先輩は出来る、後輩は出来ないと捉えている場合
    - 励まして背中を押してあげましょう。言語化させて進め方を引き出しましょう。
- 先輩は出来ない、後輩は出来ると捉えている場合
    - 正してあげましょう。正しく課題を認識できるまで指摘しましょう。
- 先輩も後輩も出来ていないと捉えている場合
    - 教える、もしくはその観点について学ぶ必要があります。何をインプットしてほしいのか明確にリクエストしましょう。

課題とどんな関係性であるのか適切に把握しつつ、対応の方法を考えています。
「あ、ここは教えたほうがいいのかな」や「あ、ここはもっと任せてみようかな」とかを都度考えてコミュニケーションしています。


# 期待を下げないこと
技術の進化もあり、インプットの元になる情報は圧倒的に増えています。
生成AIの台頭もまさにそうで、あらゆる情報に触れる機会は多くなっています。
これらの技術を正しく使いこなしていけば人の成長角度はどんどん高まっていくはずです。
「自分たちはこうだったから」という思考に縛られず、育成論もチームでアップデートしていきたいと思っています。


# おわりに
以前[新人の際に気をつけること](https://qiita.com/okadadaisuke/items/5259b89cf48de69fad0f)について記事を書いていたのですが、いつの間にか新人とコミュニケーションする側になっていました。
改めてまとめてみると、なんだか当たり前のことも多いですが、意図して実行することでより良くなっていると感じています。
こういったことで悩んでいる方の力になれれば幸いです。
2023アドカレ02:シン・テレワークシステムでリモート会議に参加する方法

シン・テレワークシステム利用時、zoomミーティングでマイクのみ認識しない問題が起こりました。

# これは何の記事？
この記事は[ぐらだけアドベントカレンダー2023](https://qiita.com/advent-calendar/2023/c9h11o2)、2日目の記事です。

テレワークしつつミーティングやセミナーにも参加したい場合、デフォルトではマイクが作動しないため、その設定解除方法を残します。

# 誰むけ？
- リモートデスクトップPCで音声会議に参加したい人
- シン・テレワークシステムを使っていて、マイクが上手く反応しない人
- シン・テレワークシステムを使っていて、共有機能周りの設定が気になる人

# あらすじ
シン・テレワークシステムを使ってリモートデスクトップを使い、Zoomミーティングに参加しようとしたところ、PCのマイクが認識されない事件が起こったので、原因を調べました。

### シン・テレワークシステムって何？
IPAとNTTが共同開発したリモートデスクトップアプリです。
新型コロナが流行したことで無料で使えるように提供してくれ、今も無料利用期間が続いています。

取り敢えずや、急ぎリモートでの勤務を検討する方にオススメです。
弊社でも、一般事務の方が病気療養の後、通勤することが難しくなってしまった際、リモート環境が日の目を見ました。

# 解決の為に使ったもの
色々ググりました。
#### シン・テレワークシステムの設定変更について

こちらを参考に設定を変更しました。

https://www.curict.com/item/d1/d134605.html

#### シン・テレワークシステムの共有設定追加

＜公式ニュース＞

#### リモートデスクトップだと何故マイクが反応しないのか

セキュリティ上、わかる人が解除しないと外のPCからは共有がかけられない仕組みのよーです。

https://so-kai-app.sakura.ne.jp/blog/3448/2021/05/31/


# 具体的に何をやったか
#### マイクの設定を変更しました
※設定変更方法については「解決の為につかったもの」の項を参照。
幸い対象のPCはシステム版をインストールしていたので共有機能設定も変更できました。（共有無効版をインストールしていると変更不可）
Windows10のリモートデスクトップ機能の設定変更は不要で、シン・テレワークシステムの設定変更のみで大丈夫でした。
まぁ、シン・テレワークシステムがリモートデスクトップ機能にガワを着せて動いているようなものだと思うので、言われてみれば当然なんですが。

# 結果
次回のZoomウェビナー開始時にマイクテスト。
Zoomの音声テスト画面でマイクを認識し、マイク部を叩いて音声入力ゲージに反応があればOK。

PCや接続環境が変われば問題が発生する可能性があるため、20〜15分前には接続して、準備完了させておく位が良いかと思います。
トラブルが起きた場合、10分前行動だと地味に足りなかったりするので……。

# 応用事例

### 手元PCで快速に文章入力を行った後、テレワーク先PCにコピペする
共有機能の設定を変更すると、クリップボード情報の共有ができます。
リモートデスクトップは仕様上、社内PCを直接操作するよりは操作遅延が発生する為、手元のPCで直接入力する方が早いです。
クリップボードの共有機能をONにすると、手元のPCで軽快に入力した後で、リモートで繋いでいる社内PCにコピペすることができます。地味に便利。
### 自宅PCで資料印刷を行える
印刷プリンタも自宅と社内と選択できるため、コレは紙で出して確認したいという資料があっても大丈夫。
ただ、情報漏洩などの観点は注意が必要です。

### 社内PCにスピーカーやマイクがなくても、手元PCにあればウェビナー参加ができる
リモートで繋ぐ、社内PCにスピーカーやマイクが内蔵されていなくても、リモートを繋ぐ、手元のPCにスピーカーやマイク、もしくはイヤホンマイクなどがあればミーティングやウェビナー参加ができます。
通常業務中はスピーカーなど不要でついていなかったため、地味に便利……！

### 弊社でのリモートデスクトップ利用事例

テレワークに限らず、下記のような様々な状況で利用しています。

- 会議室から自分のデスクトップPCに接続し、資料を確認する
- 支社へ出張した際、リモート用ノートPCを持参し、自分のデスクトップPCをのぞく
- 他拠点にあるPCをリモートでのぞき、PCの状況や設定を確認する
- スピーカーやカメラがついていないデスクトップPCをリモートでのぞき、ノートPCのスピーカーでウェビナーを受ける


# 注意点
- 共有機能停止版の場合はテレワークPCや社用スマホから直接ミーティング参加してもらう必要がある
- 共有機能を有効にすると会社の重要情報を家庭の個人PCに持ち帰れてしまう為、リモート設定や規定の見直しが大切
ElasticSearchでnestedを対象としたsearchQueryはpathをつけよう！

# 概要
ElasticSearchで作成したIndexで、nestedで設定したfieldの検索で　`nested`検索を利用すると取得出来るかもしれないといった奮闘記になります

# 前提
ElasticSearchに作成したIndex/Mapping/Documentは以下の通りです

```
# Index/Mapping
$ curl -H "Content-Type: application/json" -XPUT '127.0.0.1:9200/hoge_index?pretty' -d '
{
	"mappings": {
		"properties": {
			"company": {
				"type": "nested",
				"properties": {
					"user": {
						"properties": {
							"id": {
								"type": "long"
							}
						}
					}
				}
			}
		}
	}
}'
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "hoge_index"
}

# Document
$ curl -H "Content-Type: application/json" -XPOST '127.0.0.1:9200/hoge_index/_doc/?pretty' -d '{
    "company":{"user":{"id":1}}
  }'
{
  "_index" : "hoge_index",
  "_type" : "_doc",
  "_id" : "9lYhJYwBYAWRxjRwHMJl",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}
```

# 失敗した検索
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html
上記を参考に、以下のようなQueryを作って検索してみました

```
$ curl -H "Content-Type: application/json" -XGET '127.0.0.1:9200/hoge_index/_search?pretty' -d '
{
  "query": {
    "bool": {
      "filter": [
        {"term": {"company.user.id": 1}}
      ]
    }
  }
}'

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}
```

なんかそれっぽく作ってみたら、NoHit、つまりは検索が出来ませんでした

# 成功した検索
https://qiita.com/michi_wkwk/items/630cf46af5303cdc8eb6#%E3%81%82%E3%82%8B%E5%80%A4%E4%BB%A5%E4%B8%8A%E3%81%AE%E8%A6%81%E7%B4%A0%E3%82%92%E3%82%82%E3%81%A4%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%82%92%E6%A4%9C%E7%B4%A2

nestedの場合のQueryもあるっぽく、参考に作ってみました

```
$ curl -H "Content-Type: application/json" -XGET '127.0.0.1:9200/hoge_index/_search?pretty' -d '
{
  "query": {
    "bool": {
      "filter": [
        {
            "nested": {
                "path": "company",
                "query": {
                    "term": {
                        "company.user.id": 1
                    }
                }
            }
        }
      ]
    }
  }
}'

{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.0,
    "hits" : [
      {
        "_index" : "hoge_index",
        "_type" : "_doc",
        "_id" : "9lYhJYwBYAWRxjRwHMJl",
        "_score" : 0.0,
        "_source" : {
          "company" : {
            "user" : {
              "id" : 1
            }
          }
        }
      }
    ]
  }
}
```

nestedにpath/queryを繋ぐと、欲しいDocumentが検索できるようになりました

# 備考
ElasticSearchの公式やStackOverflowでも、search時のnestedの扱い方が探せなかったので、公式での使い方を見てみたい気持ちはあります...
サーバーを使わないNextjs開発(App Router)

## はじめに
NextjsをデプロイするにはNodeサーバーが必要と思われがちですが、Static Exportsを使用することで静的なファイルだけを用いたデプロイを行えます。
この記事ではそんなStatic Exportsの利用方法について紹介します。

## Static Exports
Staci Exportsはその機能を有効にして、ビルドを実行するとアプリケーションをSPAとして活用するための最適なファイルを生成します。
生成されるコンテンツはファイルの分割や、画像の最適化などNextjsを利用することによる様々恩恵をひきつづk受けられます。

有効にするためには`next.config.js`で`output`を`'export'`に設定します。
```js:next.config.js
/**
 * @type {import('next').NextConfig}
 */
const nextConfig = {
  output: 'export',
}
 
module.exports = nextConfig
```
Static Exportsはクライアントコンポーネントはもちろん、サーバーコンポーネントにも対応しています。
クライアントコンポーネントはビルドによってプレレンダリングされたHTMLとそれにインタラクティブ性を付与するJavaScriptを生成します。サーバーコンポーネントはビルド時に計算されたHTMLが生成されます。
Static Exprotsはそれらのコンポーネントに関わる生成物に加えて、最初のHTMLを返した後のナビゲーションに関わるコンテンツを生成します。

### 環境を作成する
まず、`npx create-next-app`でNextjsの環境を作成します。質問には以下のように答えました。

![スクリーンショット 2023-11-28 12.08.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591069/4af4760a-0aab-6a45-6b22-75c4f9cd2ca9.png)

そして、`next.config.js`の設定を以下のようにします。
```js:static-exports/next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
  output: 'export',
}

module.exports = nextConfig

```
その後`npm run build`を実行すると`out`に対して静的なファイルが吐き出されます。
ホストするサーバーにはこの中身を返すように設定することでWebページを展開できます。

### 利用できない機能
Nodeサーバー上での動作を前提としているものや、ビルド時に計算できない動的なロジックは対応していません。
前者に対応する機能は直感的でわかりやすいですが、後者については注意が必要です。例えば動的なルーティングは`generateStaticParams()`を用いなければ利用できません。


<details><summary>対応していない機能</summary>

- [Dynamic Routes](https://nextjs.org/docs/app/building-your-application/routing/dynamic-routes) with dynamicParams: true
- [Dynamic Routes](https://nextjs.org/docs/app/building-your-application/routing/dynamic-routes) without generateStaticParams()
- [Route Handlers](https://nextjs.org/docs/app/building-your-application/routing/route-handlers) that rely on Request
- [Cookies](https://nextjs.org/docs/app/api-reference/functions/cookies)
- [Rewrites](https://nextjs.org/docs/app/api-reference/next-config-js/rewrites)
- [Redirects](https://nextjs.org/docs/app/api-reference/next-config-js/redirects)
- [Headers](https://nextjs.org/docs/app/api-reference/next-config-js/headers)
- [Middleware](https://nextjs.org/docs/app/building-your-application/routing/middleware)
- [Incremental Static Regeneration](https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating)
- [Image Optimization](https://nextjs.org/docs/app/building-your-application/optimizing/images) with the default loader
- [Draft Mode](https://nextjs.org/docs/app/building-your-application/configuring/draft-mode)
</details>

## おわりに
この記事ではNextjsのStatic Exportsについて紹介しました。
Reactの開発ではフレームワークを利用することが推奨されていますが、推奨される多くのフレームワークはデフォルトでNodeサーバー上に載せることを想定して作成されています。
そのため、Nodeサーバーを利用せずに静的コンテンツをサーバー上にホストしたい場合はフレームワークを用いずにViteなどを用いてReactの環境を用いることがあります。そんな場合でもNextjsのStatic Exportsを用いることでバンドルファイルの効率的な分割や画像の最適化などの恩恵を受けつつ静的なコンテンツを配布する環境を作れるので候補に入れてみてはいかがでしょうか。
HLS の #EXT-X-START タグで再生開始位置を指定する

# EXT-X-START タグとは

HLS にはメディアプレイリスト内にあるセグメント群の再生開始位置を示すための EXT-X-START タグが存在します。
#EXT-X-START タグがない場合にはプレイヤーはプレイリストの初めのセグメントから順に再生を開始します。
一方で　#EXT-X-START タグがある場合には再生開始位置を秒数で指定することができます。

[RFC 8216 - HTTP Live Streaming#section-4.3.5.2](https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.5.2) を参照して仕様をまとめると以下のようになっています。

```text
#EXT-X-START:<attribute-list>

例
#EXT-X-START:TIME-OFFSET=1.00,PRECISE=YES
```

| 名前 | 型 |　例 | 説明 |
| --- | --- | --- | --- |
| `TIME-OFFSET` | float | 1.00, 0, -20.555 | 再生開始位置を示す秒数。負の値は最後のセグメントの末尾からの位置。 |
| `PRECISE` | enumerated-string | YES, NO | デフォルトで NO。YES の場合 TIME-OFFSET の含まれるメディアセグメントで再生を開始する。ただし TIME-OFFSET より前のメディアサンプルをレンダリングしない。 NO の場合クライアントはそのセグメントのすべてのメディアサンプルをレンダリングする。 |

この EXT-X-START タグによって再生開始位置が正しく変わるのかを実際に試して調べてみます。

# 環境

- 再生環境
  - Chrome + hls.js (https://hlsjs.video-dev.org/demo/)
  - Safari (`video` タグの `src` にメディアプレイリストURIを入れる)
- 配信環境
  - [Python で CORS 対応の HLS サーバをサクッと書く - srv.py](https://qiita.com/zeek0x/private/2e9b79c32617a74e9acd)
- 動画

```console
ffmpeg -f lavfi -i testsrc2=d=30 \
-f hls -g 10 -hls_time 10 \
-hls_segment_type fmp4 \
-hls_fmp4_init_filename "init.mp4" \
-hls_segment_filename "seg.%3d.mp4" \
media.m3u8
```

- 生成された media.m3u8 に `#EXT-X-START` タグを挿入（実験ごとに変える）

```console
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-START:TIME-OFFSET=15.0,PRECISE=NO
#EXT-X-MAP:URI="init.mp4"
#EXTINF:10.000000,
seg.000.mp4
#EXTINF:10.000000,
seg.001.mp4
#EXTINF:10.000000,
seg.002.mp4
#EXT-X-ENDLIST
```

# 結果

Chrome + hls.js, TIME-OFFSET=15.0,PRECISE=NO
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480312/69609f05-fa93-5060-ef85-f22058060027.png)


Chrome + hls.js, TIME-OFFSET=15.0,PRECISE=YES
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480312/27f457b1-3ca2-b380-45aa-606f7033094e.png)

Safari, TIME-OFFSET=15.0,PRECISE=NO
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480312/39ff318d-78d4-0763-17fe-de0c7935ce02.png)

Safari, TIME-OFFSET=15.0,PRECISE=YES
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480312/cfc4dc93-f02c-04a3-393d-bd89a4015e43.png)

表にまとめると以下のようになりました。

| | EXT-X-START の値 | 表示秒数 | フレームの説明 |
| --- | --- | --- | --- |
| Chrome + hls.js | TIME-OFFSET=15.0,PRECISE=NO | 14.920 | 指定時間の2フレーム前 (動画は 25 fps) |
| Chrome + hls.js | TIME-OFFSET=15.0,PRECISE=YES | 14.920 |  指定時間の2フレーム前 (動画は 25 fps) |
| Safari | TIME-OFFSET=15.0,PRECISE=NO | 10.000 | 指定時間が含まれるセグメントの開始フレーム |
| Safari | TIME-OFFSET=15.0,PRECISE=YES | 15.000 | 指定時間のフレーム |

# 結論

実験をしてみると、再生開始位置を指定することはできましたが、実装によって差異があることが分かりました。
個人的には、 Safari の挙動が仕様に合致しているように感じました。
再生開始位置をそれなりに正確に指定したい用途では `PRECISE=YES` としておくのが良さそうです。
AppleScript で 0.1 秒単位の処理時間を計測する

`current date` では秒単位でしか計測できない。

`do shell script` で `date +%N` しようとしたが、macOS の `date` コマンドは BSD date のため `+%N` オプションが利用できない。

Objective-C を利用する。

```AppleScript
use AppleScript version "2.4"
use framework "Quartz"
use scripting additions

set startTime to current application's NSDate's timeIntervalSinceReferenceDate()
-- 計測したい処理
set endTime to current application's NSDate's timeIntervalSinceReferenceDate()
set elapsedTime to (round (endTime - startTime) * 10) / 10
set elapsedTime to ((round (elapsedTime / 60) rounding down) & "m" & elapsedTime mod 60 & "s") as string
Gradioを使ってSDXL TURBOのリアルタイム変更テキストから画像を実装してみたよ。

SDXL TURBOとGradioを使ってWebインターフェースを作ってみました。

SDXL Turbo以下のサイトでも試すことができるのですが、微妙な調整などができないので、自分で作りました。まだ、調整段階なのでパラメーターの調整などはできないのですが、これもインターフェースからできるようにする予定です。

# Gradio

今回はGradioというアプリケーションを使って作成しました。
すごく簡単にWebインターフェースが作れます。

www.gradio.app


# どんなのができた？

実際に作ったのはこれ。

https://www.youtube.com/watch?v=CExCoquX_t8&ab_channel=Jun_GenAI

このプロンプトとともに画像がパッパッって変わっていく様子が良いですね。結構、これはこれで使えるなと思います。


それではコード。

# コード

今回はGoogle colabでGPUを使っています。というのも前回のようにCPUだと、画像の変更に時間がかかってしまい、SDXL-Turboのいい所が使えなくなってしまうからです。

### インストール

以下をインストールします。Google colabでは前に”!”を付けます。

    pip install diffusers transformers accelerate --upgrade
    pip install gradio
    pip install Pillow

### コード


    import gradio as gr
    import gradio as gr
    from diffusers import AutoPipelineForImage2Image
    import torch
    from PIL import Image
    
    # Diffusers パイプラインを初期化
    pipe = AutoPipelineForText2Image.from_pretrained("stabilityai/sdxl-turbo", torch_dtype=torch.float16, variant="fp16")
    pipe.to("cuda")
    
    # プロンプトに基づいて画像を生成する関数
    def generate_image(prompt):
        image = pipe(prompt=prompt, num_inference_steps=1, guidance_scale=0.0).images[0]
        return image
    
    iface = gr.Interface(
        fn=generate_image,
        inputs=gr.Textbox(label="Promopt"), # 入力ラベルの変更
        outputs=gr.Image(label="Image"), # 出力ラベルの変更
        title="SDXL Turbo", # インターフェースのタイトル
        live=True
    )
    
    iface.launch()


**num_inference_steps=1**
これはモデルが画像生成のために行う推論ステップの数です。数値が小さい（この場合は1）と、生成プロセスが速くなりますが、生成される画像の品質は影響を受ける可能性があります。

**guidance_scale=0.0**
これはモデルがプロンプトに従う度合いを決定するパラメータです。0.0の値は、プロンプトへの従順性がないことを意味し、モデルはより自由に画像を生成することになります。
コミュニティユーザーのmilk-v duo用IOボードの紹介

## はじめに
秋葉原ロボット部の有志で、milk-v duoを購入し、個々人が様々な実験を行って、勉強会内で報告しています。

Milk-v duoは9ドルのrisc-vコンピュータとして知られています。
ハードウェアは以下の通りです。

1. CPUはCVITEKのCV1800B (C906@1Ghz + C906@700MHz)
1. 最高1 GHzで動作するデュアルRV64コア
1. 64 MBのラム
1. オプションのアドオンボードを接続すると10/100Mbpsの1. 速度でイーサーネットに接続可能

Milk-v duoには主催者主導で公開されているIOボード
https://milkv.io/docs/duo/io-board/usb-ethernet-iob
以外に、ユーザーの作製されたボードが紹介されています。
特徴は、GPIO接続用ピンヘッダ、Wifi、Bluetoothモジュールを搭載している点です。

## milkv duo board
https://oshwhub.com/devss/milkvduoboard
この基板のインターフェースは以下のようになっています。
- RJ45 x 1
- USB x 4
- 3V3 x 4
- GND x 4
- GPIO x 40
- GPIOは、ボード脇に2x40のピンヘッダとして並んでいます。
USB接続されたRTL8723BUボードが搭載されており、wifiとBluetoothが利用可能です。
USBガジェットモードとUSBホストモードを切り替える、USBモード切り替えスイッチが存在します。
リセットスイッチが設置されています。
さらに、SPI NOR FLASH(W25Q256JVEIQ)あるいはSPI NAND FLASH(W25N01GVZEIG)を搭載可能なので、こちらにOSをインストールすることにより、SDカードを使用せずに、OSを起動可能です。
NANDとNORのメモリの設定は、組み立て時に配線に用いるチップ抵抗をどこにつけるかで設定します。
フラッシュメモリとSDカードアダプタは同じSPI端子に接続されているので、どちらか一方しか使えません。

6 Vから24 Vの電源が使用できます。

マイクロUSB（あるいはUSB）はCH349チップを介してボードに接続されているの、起動時のブートメニューをみることができます。
この配線はピンヘッダをジャンパーピンでつなぐことで実現しているので、ジャンパーピンを外して、別のポートとシリアル接続することも可能です。


## milkv-duo迷你单片机USB+网卡+WIFI扩展板
https://oshwhub.com/ljm000/mikuvduo-kuo-zhan-jing-jian
この基板のインターフェースは以下のようになっています。
- RJ45 x 1
- USB x 2
- GPIO x 40
GPIOは、本体のホールと並列にピンヘッダが並んでいます。
それ以外に、
- USB接続されているRTL8723BUを介したWifiとBluetooth

## どのボードを選ぶか
公式が公開している「Duo USB&Ethernet IOB」、ユーザーが公開している「milkv duo board」と「milkv-duo迷你单片机USB+网卡+WIFI扩展板」のどれが気に入ったでしょうか？
入手性からすると、「Duo USB&Ethernet IOB」ですが、機能を考えると「milkv duo board」が気に入っています。
「milkv duo board」と「milkv-duo迷你单片机USB+网卡+WIFI扩展板」の基板情報はoshwhubに掲載されていて、WeChatのIDを持っていないと、Gerberデータ等の入手が困難な点が気になります。
今年のCluster Creators Guideを振り返る【クラスターアドカレ2023】

こちらは[クラスター Advent Calendar 2023](https://qiita.com/advent-calendar/2023/cluster)（2枚目）の2日目の記事です。
昨日はぽけばさんの「[クラスター社内で今年開催されたLT会を一部紹介](https://pocketberserker.hatenablog.com/entry/2023/12/01/110000)」でした。文末のパスにあった通り僕も何度か社内LT会に参加させていただきましたが、社内の皆さんの趣味や好み、考え方が垣間見えて毎回楽しいです。

---

こんにちは、クラスター社でインターンをしている滝 竜三です。

2年前に入社して以来、会場制作や[補助ツールの開発](https://creator.cluster.mu/2023/06/19/clusterworldtools/)、[ワークショップ](https://www.workshop.cluster.mu/)にはたまた[ロボットの制作](https://tech-blog.cluster.mu/entry/2023/06/15)まで様々な仕事をさせてもらってきましたが、中でも今年一年は「**Cluster Creators Guide**」関連をメイン業務として、多くの記事を執筆しました。

https://creator.cluster.mu/

そんな年の締めくくりということで、今回はCreators Guideの今年の記事を振り返り、個人的に印象に残っている記事をいくつかピックアップしていきます。

## Particle System作例系
https://creator.cluster.mu/2023/04/12/fallenleaves_particle/

https://creator.cluster.mu/2023/04/19/explosion_particle/

https://creator.cluster.mu/2023/08/25/electric_shock/

基本的な機能などの紹介記事は去年までにかなり集まっていたので、今年はより**具体的な作例**記事を増強することを方針のひとつとしていました。
特に、設定項目が複雑で個別に解説しても覚えづらい「Particle System」はさまざまな作例を紹介しています。
3～4月頃から集中して立て続けに作例記事を出し、はじめの方は「炎」「花びら」など汎用的な表現が中心でしたが、後の方につれて「電撃を放つ」「武器が当たって火花が散る」といったピンポイントな~~自分の趣味が入った~~ネタが多くなっていたり。

## 新機能紹介系
https://creator.cluster.mu/2023/02/14/subaudio_speaker/

https://creator.cluster.mu/2023/09/19/beta_pet/

Cluster Creator Kitのアップデートで新しい機能が実装されたときも、Creators Guideで使い方の紹介記事を書くことがあります。
特にベータ機能のリリース時は早くから開発方面のチームとも連携し、リリース情報やドキュメントだけではサポートしきれない部分を補えるよう、具体的な作例記事を一気に放出しました。

## Blender系
https://creator.cluster.mu/2023/01/31/blender_smooth/

https://creator.cluster.mu/2023/10/18/mesh_normal/

https://creator.cluster.mu/2023/11/15/blender-bevel/

今年はBlenderの機能紹介系記事もいくつか出しました。
とにかく機能の多いBlenderは、意外と基本的な機能を見落としていたりといったことが結構あるようなので（正直なところ僕もよく分かっていない機能がまだまだあります…）、参考にしていただければと思います。

## ギミック系
https://creator.cluster.mu/2023/08/16/bungyjump/

ギミック作例系の記事もいろいろ執筆しました。今年はCluster Creator Kitの機能に加えて、JointなどUnityの基本コンポーネントを使った作例も紹介しています。
バンジージャンプの記事などはビジュアル的な面白さも意識して、しっかり見栄えする作例としてつくりました。
頭から地面に突っ込むGIFはさすがにウケを狙いすぎたかなとも思いつつ。

# 番外編

## 作例動画ツイート
記事以外の施策として、Twitter（当時）でちょっと凝った作例動画を投稿するといったこともしてみました。

https://twitter.com/cluster_jp/status/1669313805611040768

https://twitter.com/cluster_jp/status/1676893962920153090

それぞれ細かい解説はせず、参考記事を紹介しながらちょっと高度な作例を動画にして載せています。
数回のみ試験的におこなったものでしたが、なかなか良い反響がいただけたこともあり個人的には気に入っています。

## 「リリーもひとりでつくれるもん！」
cluster公式YouTubeチャンネルの企画として、Unityを初めて触るリリーさんがイチからワールドをつくってみるというシリーズがありました。

https://www.youtube.com/live/uzuO6wMWYVs?si=eJQsw5LKEEiZKAAj

Creators Guideの企画ではないものの、アドバイザーとしてCreators Guide編集長のFUKUDAさんが出演しているほか、（配信内では触れていませんが）僕もギミックの検討や手順書の整理などでお手伝いしています。
初心者が実際に記事を読んで制作している様子を通しで見られたのはいろいろと参考になりました。

# おわりに
Creators Guideも記事がかなり充実してきて、clusterに限らずUnityやBlenderのナレッジとしてもなかなかのボリュームになってきたのではと思っています。
とはいえまだまだ紹介できていない技術も多く、また作例などはいくらあっても足りないと言っていいでしょう。
こういう機能を解説してほしい、こういう作例を紹介してほしいといった場合は[アンケート](https://forms.gle/St9F1bWtDaHYQKXS6)からご意見・ご要望も受け付けていますが、もしよかったら**皆さんもぜひ知見を発信してみてください**。
clusterが「ワールド制作の知見がいちばん集まる場」になったら面白くなるだろうなぁと、個人的には思っています。

---

最後までお読みいただきありがとうございました。
明日のアドカレ記事は慕狼 ゆにさんの「なんか」です。
闘魂Elixir ── AtCoder Beginner Contest 329のA問題をElixirで楽しむ

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>

<b><font color="red">$\huge{闘魂とは己に打ち克つこと。}$</font></b>
<b><font color="red">$\huge{そして闘いを通じて己の魂を磨いていく}$</font></b>
<b><font color="red">$\huge{ことだと思います}$</font></b>


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


# はじめに

[Elixir](https://elixir-lang.org/)で、[Ｓｋｙ株式会社プログラミングコンテスト2023（AtCoder Beginner Contest 329）)](https://atcoder.jp/contests/abc329)の問題を解いてみます。

https://atcoder.jp/contests/abc329

[AtCoder](https://atcoder.jp/home)とは、世界最高峰の競技プログラミングサイトです。

[Elixir](https://elixir-lang.org/)で解く際には、私が書いた「[AtCoderをElixirでやってみる](https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01)」という記事がとても参考になるとおもいます。自画自賛です。

# What is [Elixir](https://elixir-lang.org/) ?

[Elixir](https://elixir-lang.org/)という素敵なプログラミング言語があるのですね。
その素敵具合は「[Elixir Saves Pinterest $2 Million a Year In Server Costs](https://paraxial.io/blog/elixir-savings)」によく現れています。開発者も経営者もこの事実に瞠目することでしょう。 **$2 Million/年の節約ですってよ！、奥さん。**

https://paraxial.io/blog/elixir-savings

# [A - Spread](https://atcoder.jp/contests/abc329/tasks/abc329_a)問題

今回は、[A - Spread](https://atcoder.jp/contests/abc329/tasks/abc329_a)を解いてみます。
問題はリンク先をご参照ください。

## 私の答え

私の答えです。
折りたたんでおきます。
▶を押して開いてください。

---

<details><summary>私の答え</summary>

```elixir
defmodule Main do
  def main do
    IO.read(:line)
    |> String.trim() 
    |> String.codepoints()
    |> Enum.join(" ")
    |> IO.puts()
  end
end
```

</details>


# さいごに

[Ｓｋｙ株式会社プログラミングコンテスト2023（AtCoder Beginner Contest 329）)](https://atcoder.jp/contests/abc329)のA問題を解いてみました。
[AtCoder](https://atcoder.jp/home)は己との闘い、つまり闘魂です。

人類は不老不死の霊薬を意味する素敵なプログラミング言語[Elixir](https://elixir-lang.org/)を手に入れました。並行処理を他のプログラミング言語よりも比較的容易に書くことができます。それはきっとコンピュータ資源を有効活用できることにつながるでしょう。巡り巡って世界平和に貢献できることでしょう。

さあ、そこのあなたも[Elixir](https://elixir-lang.org/)の世界へようこそ。
_手始めに[エリクサーチ](https://elixir-lang.info/)なんていかがでしょうか。私のオススメです。_

---

**闘魂**とは、  **「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
**アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。**

---

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>
<b><font color="red">$\huge{１、２、３ ぁっダァー！}$</font></b>
Gradioを使ってSDXL TURBOの画像から画像のリアルタイム変更を実装してみたよ。

SDXL TURBOとGradioを使ってWebインターフェースを作ってみました。

仕組みは画像をアップロードして、プロンプトを入力するとそれに沿った画像が作成されます。


# Gradio 

今回はGradioというアプリケーションを使って作成しました。
すごく簡単にWebインターフェースが作れます。

www.gradio.app

# どんなのができた？

実際に作ったのはこれ。

https://www.youtube.com/watch?v=SiwKE2J4HTE&ab_channel=Jun_GenAI

このプロンプトとともに画像がパッパッって変わっていく様子が良いですね。結構、これはこれで使えるなと思います。

左上にプロンプトを入力するたびに画像が変わっていく様子がわかると思います。

それではコード。
# コード

今回はGoogle colabでGPUを使っています。

### インストール
以下をインストールします。Google colabでは前に”!”を付けます。



    pip install diffusers transformers accelerate --upgrade
    pip install gradio
    pip install Pillow

### コード

    import gradio as gr
    from diffusers import AutoPipelineForImage2Image
    import torch
    from PIL import Image

    # Diffusers パイプラインを初期化
    image_to_image_pipe = AutoPipelineForImage2Image.from_pretrained("stabilityai/sdxl-turbo", torch_dtype=torch.float16).to("cuda")
    
    # 画像を修正する関数
    def modify_image_with_prompt(prompt, init_image):
        init_image = Image.fromarray(init_image.astype('uint8'), 'RGB')
        with torch.no_grad():
            modified_image = image_to_image_pipe(prompt=prompt, image=init_image, num_inference_steps=2, strength=0.5, guidance_scale=0.0).images[0]
        return modified_image
    
    # Gradio インターフェースを作成
    iface = gr.Interface(
        fn=modify_image_with_prompt,  # 使用する関数
        inputs=[gr.Textbox(label="Text Prompt for Image Modification"), gr.Image(label="Initial Image for Modification")],  # 入力タイプ：テキストと画像
        outputs=gr.Image(label="Modified Image"),  # 出力タイプ：画像
        title="Image Modification with Text Prompt",  # インターフェースのタイトル
        live=True
    )
    
    iface.launch()

strength=0.5の数字を変えることで、画像の変更具合を調整できます。1に近くすればより大きく変わります。ただ、あまり大きくすると画像から画像の意味がないくらい変わってしまうので、0.5ぐらいがいいかもしれないです。
【Rails】Renderにデータベースをデプロイした時のエラー解消

# 概要
Railsチュートリアルの第10章を進めていた時、
データベースのマイグレーションの設定をRenderにデプロイしたときにビルドエラーが発生しました。
```
rails aborted!
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database.
If you are sure you want to continue, run the same command with the environment variable:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1

Tasks: TOP => db:migrate:reset => db:drop => db:check_protected_environments
(See full trace by running task with --trace)
==> Build failed 😞
```

# 結論（解決策）
```DISABLE_DATABASE_ENVIRONMENT_CHECK=1```の設定をビルドスクリプトに追加した
```render-build.sh:
#!/usr/bin/env bash
# exit on error
set -o errexit
bundle install
bundle exec rails assets:precompile
bundle exec rails assets:clean
bundle exec rails db:migrate
DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rails db:migrate:reset
bundle exec rails db:seed
```

# 参考

https://qiita.com/Neptune/items/ed2d5355bffd989e5002
会社の旅行を最高に楽しくするためにアプリ作った


# 挨拶
TDCソフトのアドベントカレンダー2023年の1日目を飾らせていただく佐藤です！よろしくお願いします！

# はじめに
先日会社のイベントとして部の旅行があり、その際旅行を盛り上げる要素としてiOSアプリを開発しました。
そこで、この記事では開発したアプリについて記載していきます。
（旅行先はマザー牧場です。）

# アプリの目的
- 参加者が旅行先でのコンテンツをアプリを通して楽しんでいただく
- 参加者同士で思い出の共有ができる

# アプリを使用することによる狙い
旅行先がマザー牧場ということで、マザー牧場にいる動物と触れ合ったり、バンジー・ジップライン等のアクティビティ、マザー牧場内のイベントを参加者に楽しんでいただく予定でした。
その際、マザー牧場にあるコンテンツにプラスして、アプリを使用することでより楽しいコンテンツにする狙いでアプリの開発を行いました。

# アプリの概要
- 幹事の定めたお題に沿った写真を撮影し、アプリに投稿する。
    - （お題の例：うさぎの写真を撮る、バンジージャンプに挑戦する、こぶたのレースで1位を当てるetc...)
    - 固定でポイントがポイント入るお題や、下記のAIで判定するお題など種類は様々。
- 投稿した写真がお題にどれだけ沿っているかをAIが判定。（AIが判定するお題以外もあり。）
- 判定結果をポイントとし、チーム毎にどれだけポイントを獲得できたかをアプリに表示する。

# アプリの実際の画面
 |ログイン画面|お題一覧画面|写真投稿画面|ポイント一覧画面|ポイント占領画面|投稿一覧画面|
 |:---:|:---:|:---:|:---:|:---:|:---:|
 |![ログイン画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179037/41d900ab-b6c5-4e80-42a6-a34d5a3e53cd.png)|![お題一覧.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179037/619aad82-d108-1fb4-80f5-cc8279de10da.png)|![投稿画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179037/c5de63ed-1ad8-a685-5e5d-c866ed47f60b.png)|![ポイント一覧.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179037/274b11d4-97d7-e7f3-7046-d7574e71fe0f.png)|![エリア占領画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179037/10f735f7-4233-d7a0-a324-da582070de00.png)|![投稿一覧画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179037/95e65885-65ce-8a6d-5f28-c4a140e23cfb.png)|

# ユーザーの声
参加していただいた方から「今までの部旅行とは一味違う旅行で楽しかった！」、「初めての試みで非常に面白かった」等の感想をいただきました。

# 感想
当日はあいにくの雨で途中までは全くマザー牧場を散策することが出来ず、本来のやりたかったことを100％発揮することは出来ませんでした。
ただ、雨が上がった後に1時間ほど回ることができ、チーム毎に皆さんがマザー牧場を散策しながらさまざまな写真をアプリに投稿してくれました。
1時間という短い時間の中でどうすれば効率よくポイントが稼げるか相談しながら和気藹々と楽しんでいる姿を見ることができて感無量でした。

今回のアプリ開発を通して、多くの苦労がありましたが、周りの人がどうすれば幸せな気持ちになるかを考え、試行錯誤し、実際に使用してもらい、感想をいただくという経験は現在従事しているPJにも活用できると思いました。
この経験を通して、より良い成果物を作成できる様に勤めていこうと身が引き締めていこうと思います。

次回は[y_inoue15](https://qiita.com/y_inoue15)さんです！よろしくお願いします！！
Goで開発する環境を整える

# 前置き
少し前から実務でGoを使って開発を行っているのですが、エディタや生成AIのお陰であまり理解を指定なくても仕事ができています。
そこで、自分の脳みそを使ってGoと向き合うために記事をたくさん書くことにしました。
はじめは環境構築からです。

## 環境
`Dcoker`と`docker-compose`が使えれば良いでしょう。

```bash
$ docker -v
Docker version 20.10.12, build e91ed57
$ docker-compose -v
docker-compose version 1.29.2, build 5becea4c
```

## ディレクトリ・ファイルの作成
```bash
mkdir learn-go && cd learn-go
mkdir -p app/day1
touch app/day1/main.go
touch Dockerfile
touch docker-compose.yml
```

## Dockerfile編集
```Dockerfile
FROM golang:latest # バージョンは指定していない
WORKDIR /app
RUN go mod init github.com/shuyaeer/learn-go # ご自身のモジュールで
```

## docker-compose編集
```yml
version: '3'
services:
  golang:
    build: .
    tty: true
    volumes:
      - ./:/app/
```

## プログラム作成
```go
package main

import "fmt"

func main() {
	fmt.Println("Hello World")
}
```

## コンテナ起動
```bash
docker-compose up -d
```

## コンテナに入る
```bash
docker-compose exec golang /bin/bash
```

## プログラム実行
```bash
root@358998472a71:/app# go run app/day1/main.go
Hello World
```

## おしまい
明日はHTTPサーバーを建てようと思います。
【Bun】ElysiaでSwagger エンドポイントを生成してみる

Elysia には Swaggerプラグインがあります。Swagger は、APIを設計・ドキュメント化するためのツールですが、Elysia なら簡単に実装できます。

昔は、API を作った上にその使い方をもくもくと泣きながらドキュメントに仕上げたものですが、今は Swagger 一発で書けるうえに、万が一(?) API の仕様などが変わっても簡単に書き換えられるわけです。有難いです。

で、Swaggerプラグインのサイトはここです。

https://elysiajs.com/plugins/swagger.html

では、ここの最初のサンプルを試してみましょう。

```sh:Swaggerインストール
$ bun add @elysiajs/swagger
```

```js:Swagger用スクリプト swgr-1.js
import { Elysia } from 'elysia'
import { swagger } from '@elysiajs/swagger'

new Elysia()
    .use(swagger())
    .get('/', () => 'hi')
    .post('/hello', () => 'world')
    .listen(9001)
```
```sh:実行します
$ bun swgr-1.js
```

この状態で ブラウザから 今回作った
```
http://＜アドレス＞:9001/swagger
```
 
へアクセスするとお馴染みのSwagger の画面が現れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7103/905b241a-f1f1-aad0-947b-1881838278a0.png)

これだけです。簡単。

「Try it out」ボタンでAPIに get したり post して動作確認し、そのサーバーへ Request と 	Response の結果を見ることもできます。

では実際に、タグ名を「myApp」としたサンプルを置いておきますね。

[サンプル( http://74.226.208.203:9001/swagger )](http://74.226.208.203:9001/swagger)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7103/666694df-3fea-1148-61f6-07cd8879d702.png)

各 GET/POSTを開いて、「Try it out」と「Execute」ボタンを押してみると、APIへ その Curl が発行されて Response body と Response headers などを確認できます。

コードはこれだけ。

```js:Swagger用スクリプト swgr-1.js
import { Elysia } from 'elysia'
import { swagger } from '@elysiajs/swagger'

new Elysia()
    .use(swagger())
    .get('/', () => 'Hello Elysia', {
       detail: {
         tags: ['myApp']
       }
    })
    .post('/hello', () => 'world')
    .listen(9001)
```
```sh:実行します
$ bun swgr-1.js
```

まぁ詳細は<b> Elysia>Swagger Plugin</b> のサイトや

https://elysiajs.com/plugins/swagger.html

<b> Swagger</b> のページをご覧ください。

https://swagger.io/specification/v2/


# 最近 Qiita に書いた Bun 関連の記事
https://qiita.com/toshirot/items/579d6f7cf7dfa787f291

https://qiita.com/toshirot/items/c4d090bc38f9b85d8cdd

https://qiita.com/toshirot/items/4e8e571dd50a45c651f0

https://qiita.com/toshirot/items/e4eb635596ae4f63bdfd

https://qiita.com/toshirot/items/a81f2073e373b0351493

https://qiita.com/toshirot/items/06a992af8cf8aca9ff95

https://qiita.com/toshirot/items/3af83303f95ac7baa546
Perl メモ

## Perlについて
### Perl 
- Perl(パール)とは、ラリー・ウォールによって開発されたプログラミング言語である。
- 実用性と多様性を重視しており、C言語やsed、awk、シェルスクリプトなど他のプログラミング言語の優れた機能を取り入れている。
- ウェブ・アプリケーション、システム管理、テキスト処理などのプログラムを書くのに 広く用いられている。 
- [公式サイト](http://perldoc.jp/)
- [GitHub](https://github.com/Perl)

## Perlフレームワークについて
### Mojolicios
- Mojoliciosは、PerlのリアルタイムWebアプリケーションフレームワークです。
- シンプルなWebアプリケーションと複雑なWebアプリケーションの両方を利用できるように設計されていることや保守性が高いことなどが特長です。
- 小規模から大規模のWeb開発まで使用できるPerlフレームワークです。
- インストールコマンド
  - $ curl -L https://cpanmin.us | perl - -M https://cpan.metacpan.org -n Mojolicious
- 実行コマンド
  - $ morbo hello.pl
  - $ curl http://127.0.0.1:3000/
- [公式サイト](https://mojolicious.org/)
- [参考サイト](https://mojolicious.perlzemi.com/)

### Dancer
- Dancerは、軽量で簡素なコーディングが出来るWebフレームワークです。
- もともとRubyのフレームワークであるSinatraから移植して派生したものですが、現在は独立して別物になっています。
- モジュールに依存しないような設計をしており、メンテナンスが容易であるという特長があります。Dancerは小規模なWebアプリケーション開発に適しています。
- インストールコマンド
  - $ curl -L https://cpanmin.us | perl - --sudo Dancer2
- アプリケーション作成コマンド
  - $ dancer2 gen -a MyWeb::App
- 実行コマンド
  - $ cd MyWeb-App
  - $ plackup -r bin/app.psgi
- [公式サイト](https://perldancer.org/)

### Catalyst
- Catalystは、MVCアーキテクチャーを搭載しているWebアプリケーションフレームワークです。
- Ruby on RailsやMaypole・Springなどのフレームワークの影響を受けています。
- Catalystは、データベース層に関するコードが必要ないことやMVCパターンを利用しているため効率良い開発が出来ることなどが特長のPerlフレームワークです。
- インストールコマンド
  - $ perl -MCPAN -e 'install Catalyst::Runtime'
  - $ perl -MCPAN -e 'install Catalyst::Devel'
  - $ perl -MCPAN -e 'install Catalyst::View::TT'
- 実行コマンド
  - $ script/myapp_server.pl
- [公式サイト](http://catalyst.perl.org/)

### Amon2
- Amon2は、PSGI/Plackベースのフレームワークです。
- シンプルかつ拡張性が高いフレームワークであるため、小規模から大規模までの開発で使用することが出来ます。
- [公式サイト](https://metacpan.org/release/TOKUHIROM/Amon2-2.09/view/lib/Amon2/Manual/Tutorial.ja.pod)

### TripletaiL
- TripletaiLは、日本製のWebアプリケーションフレームワークです。
- 安全性・生産性・保守性の3つを軸として開発されました。日本語のマニュアルが多いことや依存モジュールがあまりなくバージョンアップによる影響が少ないことなども特長です。
- [公式サイト](http://tripletail.jp/)

### Ark
- Arkは、面白法人カヤックの元社員が在籍中に開発したWebフレームワークです。
- CGIでも実用的に動くCatalystを目指して開発されたため、Catalystに似た設計になっていることが特長です。
- [GitHub](https://github.com/ark-framework/ark)

### Jiffy
- JiffyはPerl用のフルスタック・Webアプリケーションフレームワークです。
- アプリケーションは、設定ファイルであるetc/config.ymlを使い、動作を制御します。 
- フレームワークはHTML::Masonをテンプレートエンジンとして使用し、テンプレートをレンダリングします。
- [公式サイト](https://metacpan.org/pod/App::Jiffy)

### Gantry
- GantryはPerl用Webアプリケーションフレームワークです。
- Gantryはオブジェクト指向の設計により、URLディスパッチに実用的でモジュール化されたアプローチができます。 
- Gantryの特徴として、柔軟なテンプレートシステム、組み込みのCRUD操作、ユーザー認証、セッション、フォーム生成と検証、データベースとSQLユーティリティなど、高速で開発するため多機能を搭載している点が挙げられます。
- [公式サイト](https://metacpan.org/pod/Gantry)
不具合を多く見つけるテスターの思考術

ソフトウェア製品のブラックボックステストにおいて、どのような条件・状況でも、他のテスターよりも多くの不具合を見つける凄いテスターがいます。その違いがどこから生じるのかについて、思考術をご紹介します。

使用しているテスト技法という点では、JSTQBのシラバスにも書かれている「エラー推測」や「探索的テスト」が近いと思います。（※詳細を知りたい方はシラバスをご確認ください）そして、それらを有効に活用するために、対象製品やテストに関する知識や経験と、これまでに発生した不具合情報を使用します。

これらはもちろん重要な要素です。しかし、不具合をより多く見つけるテスターはそれらだけではなく、テストに対する構え方にも違いがあります。

一例としてのご紹介になりますが、よく不具合を見つけるテスターは以下のような着眼点（チャーター）を使います。
* 開発者が想定しきれないことを考えてみる
* 利用者の観点で、使いやすいかどうかを考える
* 違和感があれば、深堀してみる
* 変更された機能により悪影響が出そうな箇所を確認する

このうち、「違和感があれば、深堀してみる」以外は、テスターがActiveに動くことで不具合を見つける着眼点です。さきほどのエラー推測や探索的テストも含めて、着眼点の多くがActiveなものになります。

テスターは目の前で起きている不具合を不具合として正しく検知し、見逃さないようにしています。多くの不具合を見つけるテスターは、操作中・動作中の振る舞いを様々な角度でウォッチし、その中で違和感を覚えたら、その違和感の正体が何かを探り、それが本当の不具合かどうかを確認する、というPassiveな着眼点（と調査分析）も使っています。

つまり、「違和感があれば、深堀してみる」は間違い探しというよりも、**間違いに気付くための心構え**＋不具合かどうかの調査分析、と捉えた方が正しい解釈になります。この違和感の覚え方は、テスターにより工夫しています。例えばあるテストでは、全体を見渡しながら「いつもより動きがもたついた」や「見慣れないログが出た」などの事象から違和感を覚え、そこから不具合があるかどうかを切り分けます。

このようなActiveとPassiveの両方の思考を使って、不具合を見つけています。

なお、仕様を理解したうえで、その知識を使って不具合を検出するという思考が一般的です。しかし、仕様すら信じない状態で、動作確認結果により頭の中に「仕様」を組み上げていき、そこから問題点を検出するという、一歩進んだ概念で不具合を見つけるテスターもいます。
Milk-v Duoでサーボモーターを制御する

## はじめに
秋葉原ロボット部の有志で、Milk-v Duoを購入し、個々人が様々な実験を行って、勉強会内で報告しています。

Milk-v Duoは9ドルのrisc-vコンピュータとして知られています。
ハードウェアは以下の通りです。

1. CPUはCVITEKのCV1800B (C906@1Ghz + C906@700MHz)
1. 最高1 GHzで動作するデュアルRV64コア
1. 64 MBのラム
1. オプションのアドオンボードを接続すると10/100Mbpsの速度でイーサーネットに接続可能

Wiringxを使うと、様々な外部機器の制御が可能です。
この記事では、サーボモータの制御を紹介します。

## DF9GMSとは
DGF9GMSサーボモーターは、DFROBOT社から販売されている360度回転可能なモーターです。
https://www.dfrobot.com/product-1579.html
ホームページ掲載のスペックは以下の通り
- 動作電圧: 3.5 - 6.0V
- 入力すべ気電圧: 4.8V ~ 6.0V
- Dead Zone Width: 5usec
- 動作速度: 0.12秒/60度 (4.8V no load)
- Stall Torque: 1.2kg/cm (4.8V), 1.6kg/cm (6.0V)
- Neutral Location: 1500us
- 配線:
　茶: GND
　赤: 電源[+]
　オレンジ: 制御信号
- ケーブル長: 250mm
- 温度範囲: -30°C to + 60°C
- 外形寸法: 22.6 x 12.2 x 30 mm /0.89x0.48x1.18インチ
- 重量: 9±1g

容易に入手できるSG90でも、動作できそうです。

## サーボモータの接続
「dfgms.c」を参照すると、
```dfgms.c
#include <stdio.h>
#include <unistd.h>
#include <wiringx.h>
/*
Duo
------------------------------------------
PWM operation at a fixed frequency clock of 100MHz, writing Period in units of nanoseconds.
    DF9GMS 360-degree PWM Duty Cycle 
    ------------------------------------------ 
    0.4ms - 1.4ms CW deceleration 
    1.5ms Stop 
    1.6ms - 3ms CCW acceleration 
*/
static int PWM_PIN = 4; // PWM5@GP4
```
とありますので、PWM5に相当するGPIO19に信号制御の線を接続します。
サーボモーターは5 Vで動作しますので、「VSYS」に接続します。
GNDはGNDに接続します。

## サーボ動作プログラムのビルド
まず、Milk-v Duoアドベントカレンダー 
https://qiita.com/advent-calendar/2023
のシリーズ2の3日の
「Milk-v Duoのクロスコンパイル環境をWSL上に作成して、Gitで公開されているプログラムを動かしてみる」
に従って開発環境を構築してください。
使用するプログラムは
https://github.com/milkv-duo/duo-examples
にあります。
「duo-examples」ディレクトリに移動したら、以下のコマンドで「df9gms」ディレクトリで、プログラムをビルドします。
```
$ cd df9gms
$ make it
```
「ls」で生成したファイルを確認します。
```
$ ls
df9gms　df9gms.c　df9gms.o　Makefile
```
Milk-vに「df9gms」を転送します。
「df9gms」ファイルのあるディレクトリで、「./df9gms」と入力すると、サーボモータが回転し、以下のような画面表示が現れます。
```
[root@milkv-duo]~# ./df9gms
Duty: 10000
Duty: 20000
Duty: 30000
...
Duty: 280000
Duty: 290000
Duty: 300000
```
WiringXライブラリのおかげで、容易に制御可能となりました。
様々な動きをさせるための、母艦でプログラムの作成とビルド、ファイル転送の一連の操作は、面倒です。
Milk-v Duo上で操作が完結する、PythonやTinyccでプログラムが作成できると作業がはかどりそうです。

## おわりに
Milk-v DuoのGPIOにサーボモーターを直接接続して、プログラムで制御することが可能になりました。
Milk-v Duoを自作ロボットの制御基板として利用可能です。

参考　https://milkv.io/docs/duo/application-development/sensor-demo
動画生成モデルpika1.0を試しました

最近pika1.0という動画生成モデルが非常に話題になってますので昨日私も試しました。
公式サイト（pika.art）では待ち時間長すぎるので、discordで試してみました。（discordにもすでに50万ユーザーがいます）

機能としては"画像から動画を生成する"と"テキストから動画を生成する"があります。

現時点では3秒までの動画しか生成できないですが、調整できるパラメータが非常に多いので、色々試すことはできます。

まず"テキストから動画生成"を試しました。
prompt文は"a boy with two dogs"で、生成された動画は↓です。いい感じの動画が生成できましたね。（犬の舌は少しおかしいですが、）
![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/57baf940-ca8c-c3b9-bcf2-5977db3fa935.gif)

次は"画像から動画生成"
プロンプトなしで草原の写真だけを渡しましたが、こちらもよくできてますね。
![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/e8c4a4bf-3dab-1eb0-b4d9-88b0de6c60c0.gif)


興味ある方試してみてください。

https://discord.com/invite/pika
Rust メモ

## Rustについて
### Rust
- RustはMozillaが支援するオープンソースのシステムプログラミング言語であり2010年に開発されました。
- Rust言語は速度、並行性、安全性を言語仕様として保証するC言語、C++に代わるシス テムプログラミングに適したプログラミング言語を目指している。 
- コンパイル: $ rustc ファイル名.rs
- 実行コマンド: $ ./ファイル名
- [公式ドキュメント](https://doc.rust-jp.rs/book-ja/title-page.html)
- [参考サイト](https://qiita.com/elipmoc101/items/3c8b6d8332a9019e578c)
- [GitHub](https://github.com/rust-lang)

### Cargo 
- Cargoは、Rustのビルドシステム兼、パッケージマネージャです。 
- ほとんどのRustaceanはこのツールを使用して、 Rustプロジェクトの管理をしています。
- 実行コマンド: $ cargo run
- コンパイル確認: $ cargo check 
- テストコマンド: $ cargo test 
- [公式ドキュメント](https://doc.rust-jp.rs/book-ja/ch01-03-hello-cargo.html)

### 所有権
- 所有権とは「ある値はあるひとつの変数に所有され、この変数からしか読み込みも書き込みも行われない」というルールのことです。
- このルールが有ることによって「変数が宣言されたブロックでの処理が終了」すると「変数に所有された値は開放することができる」ということになります。
- これにより値のためのメモリ確保と開放のタイミングがコンパイル時に決定されるため、ガベージコレクションのように実行時にメモリ解放の判定を行う場合に比べて高速になります。
- また、所有権のルールによって「値が複数変数から同時に更新されて壊れる」という不具合であったり「値を開放し忘れてメモリがリークする」という不具合を防ぐことができて安全性が高まります。
- [参考サイト](https://qiita.com/nirasan/items/9e169859c6807c2c175b)

## Rustフレームワーク
### actix-web
- Rustのフレームワークでも世界的に活用されているものです。
- 日本のみならず海外でも積極的に採用されていて、多くの情報が手に入ります。フレームワークの活用には情報収集が重要となるため、情報収集しやすいものは利用のハードルが下がるのです。
- [公式サイト](https://actix.rs)

### TAURI
- Rustで開発されているフレームワークの中でも軽量なものです。
- フレームワークが軽量であるかどうかはアプリケーションの動作速度に影響するため、Tauriのように軽量なフレームワークであればアプリケーションも軽量であることが期待できます。
- [公式サイト](https://tauri.app)

### Axum
- フレームワークとしてシンプルな設計を採用しているため、Rustの知識があるエンジニアならばスムーズに理解できるはずです。
- Axum独自の考え方はありますが、基本的にはRustの理解があれば差し支えないレベルです。
- [公式サイト](https://docs.rs/axum/latest/axum/)

### Rocket
- Rustのフレームワークでもマイクロフレームワークに分類されるものです。
- 最小限の機能だけが実装されているフレームワークであり、必要な部分は自分で開発しなければなりません。
- [公式サイト](https://rocket.rs)

### warp
- warpはプログラムの再利用を意識することで、高い生産性を実現したフレームワークです。
- プログラム開発では再利用の意識が重要であり、フレームワークによって考え方が異なっています。
- [公式サイト](https://docs.rs/warp/latest/warp/)

### Tide
- Tideはマイクロフレームワークとはいえないものの、機能数が最小限に抑えられたフレームワークです。
- ミニマムなフレームワークといえるものであり、シンプルに利用したりエンジニアが必要に応じて開発したりできます。
- [公式サイト](https://docs.rs/tide/latest/tide/)
Scala メモ

## Scalaについて
### Scala
- Scalaはオブジェクト指向言語と関数型言語の特徴を統合したマルチパラダイムのプログラミング言語である。 
- Javaの後継言語で2003年に開発されました。
- 開発生産性を高める簡潔な表記が可能である。 
- Javaの豊富なライブラリが使える(Scala.jsの場合、JavaScriptのライブラリが使える)。 
- 全てがオブジェクトとして扱われるオブジェクト指向言語である。 
- 静的型付けを行う関数型言語である。静的型付けのため、コンパイル時点でのエラー検出が得意である。
- 型(クラス)をJavaなどと比べてより容易に作ることができ、また、型を使った条件分岐をはじめとして、型に関する機能が豊富なため、メソッドやフィールドを束ねるだけのクラスではなく、型に積極的な意味を持たせてのプログラミングが可能である。
- 型推論をサポートし、多くの場面で型を自動的に補ってくれる。
- コンパイル: $ scalac ファイル名.scala
- 実行コマンド: $ scala ファイル名
- [公式サイト](https://www.scala-lang.org/)
- [公式リファレンス](https://docs.scala-lang.org/)
- [GitHub](https://github.com/scala)

### Scala REPL
- Scalaプログラムは明示的にコンパイルしてから実行することが多いですが、 REPL(Read Eval Print Loop)によって対話的にScalaプログラムを実行することもで きます。
- 実行コマンド: $ sbt console
- 止める: $ >:quit 
- [公式サイト](https://docs.scala-lang.org/overviews/repl/overview.html)

## Scalaフレームワーク
### Play Framework
- Play FrameworkとはJavaとScaraの２つのプログラミング言語でZenexity社のプログラマーギヨーム・ボルト（Guillaume Bort）氏によって開発されたオープンソースのWEBアプリケーションフレームワークです。
- Play FrameworkはRuby on Railsからの影響を強く受けたフレームワークとして有名です。
- その特徴として軽量で動きが速いという点が挙げられることから度々Webサービスの開発などにおいて好まれて利用されております。
- [公式サイト](https://www.playframework.com)

### Fiutla
- FinatraとはTwitter社によって開発されたFinagleとTwitterServerの上にAPIサービスを簡単に構築するためのフレームワークです。
- Rubyのフレームワークである『Sinatra』をモデルに開発されており軽量Webフレームワークとなっております。
- 高速でテスト可能であり、Twitter自社のサービスにも使われていることからScalaフレームワークとして高い注目を集めております。
- [公式サイト](http://twitter.github.io/finatra/)

### SkinnyFramework
- SkinnyFrameworkとはSkinny Micro上に構築されたフルスタックWebアプリフレームワークです。
- Skinny（スキニー）と略称して呼ばれることが一般的でScala on Railsがコンセプトとなっております。
- それからも分かる通り、Ruby on Railsに強く影響を受けておりサーブレットベースのWebアプリ開発の持続可能な生産性を実現するために最適化されています。
- [公式サイト](https://skinny-framework.github.io)

### Lift
- LiftとはScalaに活用されるデビッドポラック氏を中心に安全性を強く意識して開発されたWebフレームワークです。
- 公式サイトでも『最も強力で安全なWebフレームワーク』を謳っております。
- Liftは「安全性・開発者中心・スケーラブル・インタラクティブ」の4点を強く掲げております。同フレームワークはコントローラーの概念が無いことも大きな特徴の一つです。
- [公式サイト](https://liftweb.net)

### Xitrum
- Xitrumとは非同期およびクラスタ化されたScalaのフルスタックWebフレームワークです。
- 最も安全なフレームワークを心がけており、Scalaの思想に乗っとっております。
- 非同期はNettyの思想に基づくものです。同言語のフレームワークである『Scalatra』より強力で『Lift』よりも簡単です。
- [公式サイト](https://xitrum-framework.github.io/index.html)

### Scalatra
- Scalatraとはシンプルで簡単をテーマに開発されたWebマイクロフレームワークです。
- ScalatraはJVMのパワーとScalaの美しさと簡潔さを組み合わせ、高性能のWebサイトとAPIをすばやく構築が可能です。
- 名称からも分かるようにRuby用のフレームワークであるSinatraをモデルに開発されました。
- [公式サイト](https://scalatra.org)
プルリクにコメントする custom actions を作った話

:::note info
この記事は [GitHub Actions Advent Calendar 2023](https://qiita.com/advent-calendar/2023/github-actions) の３日目の記事です。
:::

プルリクにコメントする custom actions を作って公開したので、今回はその話をしたいと思います。

https://github.com/marketplace/actions/comment-pull-request-for-workflow

↑ よかったら使ってみてください。

[README](https://github.com/yumemi-inc/comment-pull-request) に機能などは既に書いたので、今回はそれ以外の、開発にあたって考えたこと等を書きたいと思います。

## 作った動機

他にも同じような機能の custom actions は幾つもあると思うのですが、オプションが多く使い方がよく分からなかったり、機能が冗長であったり逆に足りなかったりしたので、車輪の再発明は否めませんが、新しく自分で作ることにしました。

プルリクへのコメントはその是非はいったん置いておいて、個人的にはたまにワークフローに組み込むものなので、そもそも簡単な実装でできそうであるのに公式で提供しているわけでもない既存ものに敢えて依存する必要もないな、とも思いました。

この action は所属会社の GitHub Organazation に置いています。この action が広く使われるかは別にして（普通に考えたら既存のスター数が多い action を使った方が安心と思うでしょうし）、今後、少しずつでも、世の中のエンジニアに広く役立つものを社としても個人としても作っていきたいなあという思いもあります。

## 少しハマった点

### Windows runnner への対応

この action はシェルスクリプトで作りました。Windows runner であっても Bash であればそれほど違いは気にせず作れるのですが、jq の結果が複数行である場合に、改行コードに CR（Carriage Return） が含まれることが分かったので、そこだけ対処する必要がありました。具体的には `tr -d '\r'` のようにして CR を削除しています。

### GraphQL の利用

普段は GitHub の REST API をよく使うのですが、コメントを非表示にする API が REST にはなかったので、その部分だけ GraphQL を使いました。やってみれば簡単だったのですが、個人的に GitHub の GraphQL は使ったことが無かったので、調べるのに少し時間がかかりました。

### merge queue への対応

現状は GitHub の [merge queue](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-a-merge-queue) はまだ正式リリースでない為か、CI でエラーとなってもひっそりとキューから差し戻されるので（GitHub の [notifications](https://docs.github.com/en/account-and-profile/managing-subscriptions-and-notifications-on-github/setting-up-notifications/configuring-notifications) にはもしかして通知がくるかもですが）、この action でプルリクへキューから差し戻された旨をコメントしたいなと思っていました。

ただ `merge_group` イベントでは、プルリクの番号は取得できません。よって README にも書いたとおり、commit SHA からプルリクの番号を取得する機能を作ったのですが、残念ながらこの時の commit SHA はマージ前ということもありプルリクに紐づいておらず、番号は取得できませんでした。

README で案内したとおり [このような](https://github.com/yumemi-inc/comment-pull-request/blob/33fd83e2b15e09d164f6cc6d4ee26aa6a1fd3cd6/.github/workflows/ci.yml#L25-L29) ワークアラウンドをこの action に組み込んでもよかったのですが、merge queue の正式リリース時にはまた仕様が変わってるかなとも思ったので、これは README で言及するに留めました。

### Market へ公開する際の action 名

リポジトリの `action.yml` ファイルで定義するのですが、既に存在するものと被っていると公開できません。本当はリポジトリ名と同じとおり「Comment Pull Request」としたかったのですが、前述のとおり同じような action はたくさんあるので、思ったとおり被っていました。仕方なく「Comment Pull Request for workflow」という感じで後ろに文字を少し足しました。追加した文字を小文字にしているのは敢えて（副題的な意味合い）です。

## 良かった点

[GitHub](https://github.com/yumemi-inc/comment-pull-request) からコードを見てもらえれば分かるのですが、メインのコードは 50 行ぐらいです。当初に思っていたとおり短いコードで実現できたのでコードは把握しやすく、今後なにかあっても対処もしやすいかなと思っています。

シェルスクリプトでなく JavaScript で実装する選択もあるのですが、私は JavaScript をたまにしか使っておらず、ツールチェインの更新や脆弱性に対応する為の頻繁なライブラリのバージョンアップも面倒だと思ったので、今回はシェルスクリプトで実装しました。GitHub CLI や jq も便利に使えますし。まあ短いコードですし、どちらでも良いかなと思います。

## おわりに

短い投稿となりましたが以上となります。同じような感じで下記の２つの custom actions も作ったので、よろしければそちらも見て頂けると幸いです。

https://github.com/marketplace/actions/changed-files-with-filter

https://github.com/marketplace/actions/gradle-dependency-diff-report
C メモ

## C言語について
### C
- 1972年にAT&Tベル研究所のデニス・リッチーが主体となって開発した汎用プログラミング言語である。
- C言語を用いて作成されたプログラムは直接実行できないため，それを翻訳して実行可能形式（機械語プログラム，ロードモジュール）に変換する必要がある． 
- この変換の作業をコンパイルと呼び，コンパイルを行ってくれるソフトウェアをコンパイラと呼ぶ．
- コンパイル: $ gcc 実行ファイル名
- プログラムの実行: $ ./実行ファイル名
- [公式ドキュメント](https://docs.microsoft.com/ja-jp/cpp/c-language/c-language-reference?view=msvc-160)
- [GitHub](https://github.com/topics/c)

## 開発ツールについて
### Make
- “make” というコマンドを実行するだけで, 自動的にコマンドを実行してコンパイルして くれる.
- これだけではスクリプトと大差がないのだが, make は Makefile に記された依存関係に 基づいて更新されたファイルの内関連のあるものだけを更新することで, コンパイル時間を 短くする.
- [公式サイト](https://www.gnu.org/software/make/)

## フレームワークについて
### C言語フレームワーク事情
- C言語はフレームワークが少ない言語といわれています。
- 実際、ベテランC言語エンジニアはあまりフレームワークを多用しません。
- それは、C言語開発はライブラリに依存することが多いので、フレームワークをつくろうとするとカバーする範囲が大きくなってしまい利便性が低下してしまうからです。
- そのため、C言語向けのフレームワークをつくろうとする企業や個人が少ないのです。
- そもそもフレームワークは小規模なプロジェクトを短期間に効率よく進めるために使われるものなので、C言語案件によくある大規模プロジェクトにはフレームワークは向いていないのです。
- 小規模のスマホアプリ開発ならPHPやPython向けのフレームワークを使って進めたほうがはるかに効率的です。

### CSpec
- CSpecはDSLを志向しているBDDフレームワークです。
- 仕様を書くようにユニットテストを記述できるメリットがあります。
- 分析技法のTDDとの親和性の高さもCSpecの強みです。
- [公式サイト](https://ja.osdn.net/projects/freshmeat_cspec/)

### Cmockery
- Cmockeryは、グーグル製品向けのユニットテスト用のフレームワークです。
- サポート機能が充実し、簡素なつくりになっています。
- 契約による設計との親和性が高いメリットがあります。
- [公式サイト](https://github.com/google/cmockery)
え!! 未経験で一人情シスを!? (1) 

# 結論
**出来らあっ！！！！！！**
(あくまでも個人の見解です)
# 自己紹介
千葉県生まれオセアニア育ちCalifornia State of University Fullerton卒業

新卒で大規模アミューズメント施設PMチームにフリーランスとして参画→プロジェクト後にベンチャーにマネージャーポジションとして中途入社。

プログラミング→Pythonのコードが読めるくらい。自分では書けない。
資格とか→TOEIC940, 二級船舶、CGクリエイター検定エキスパート

# 第一話　情シスとの出会い
前職のアミューズメント施設案件の時から、ドキュメントコントロールやプロジェクトの進捗、リソース管理に携わり、それが"""普通"""なんだと、どの会社でもやってるものだと錯覚していた。チームメンバーの中で一番若く、おじさまおばさまに囲まれていた環境だったのでデバイスやソフトウェアの研修は自分が一人で受けて一人でチームメンバーの分を引き受けていた。研修してくれた情シスのお兄さんはどこか悲しい顔をしていた。
# 第二話　AIってやばくね？
情シスのお兄さんと業務を通じて仲良くなるも、プロジェクトの終わりと共に転職活動へ。転職のネタ探しにWebを漁り、Stable diffusionと運命の遭遇をする。その後もLLM（Large Language Models）やRVC（Real-time Voice Cloning）技術にも手を出す。そして、無事に転職し、中途採用での入社、しかもルートも特殊だったため、「何をどうやるか」「今の立ち位置で足りないところの穴埋めは何が出来るのだろうか」と言った事を毎日Chat GPTのAPI制限ギリギリまで相談しながら一人でこっそり作業をしている時に気づいてしまった。

「あれ、この会社って機関システムだったり色んなITのルールがないな・・・？」と。

# 第三話　”情シス”と書いて何と読むか
「あれ、この会社って共有ストレージとかないんですか？」「ライセンス周りの管理って誰がされてるんですか？」そんな事を聞いても誰からも答えは得られない。なるほど、これがベンチャーなのか。挙句の果てに偉い人に聞いたら「任せるから好きにしていいよ笑」の一言で一人情シスが爆誕したのである。大手のような整備されてBCPやらAZを考慮したシステム環境ではなく、草木が生え散らかったジャングルの中にナイフ一本で切り込んでいくくらいのイメージ。

お盆前の猛暑にぐったりしていたある日、私に初めて飛び込んできた依頼は情シスlv1にとってはとんでもないものだった。

##### 「え!! RPAコードを作ってほしい!?」 

# 次回予告
##### 月150時間の行程を自動化？！
##### データクレンジングと内装設計から読み解くヒヤリング重要性
##### クラウドって結局どれが正解なの？？弊社編

:::note info
##### 次回もお楽しみに！

:::