OmniAICreator/Qiita-1.07M huggingface dataset:
最初のハードルを下げるための方法がわからないまま人生積んでる。

# 404  

ずっと途方に暮れている。

何ができるのだろうか。

今の私には何もないから。

三日坊主どころじゃない。

気まぐれで学習ドリルを開いても

翌日の2日目にもうピークがやってきて

すぐにつらくなってしまう。

やーめた！！ってほん投げる。

もっとハードルを下げればいいのに。

よく聞くし実際そうなんだろうし

どうしてもハードルを落とせないでいる。

それ以外の術はないのにね。

最初は仕方がないんだと知ったとしても。

非力な自分こそが本当の自分なのに

無力である現実を受け入れられない。

こんなに自分が弱いとは思わなかった。

克服できるなら克服したかった。

言ってる割にはやる気がない。

強制されない限り

自分からは動かないし決断もできない。

迷ってばかりでいつも気が散ってしまい

目の前にあるものに気づきもしない。

我を忘れるくらいに

没頭できない。夢中になれない。

作業に集中できた試しってあったかな。

生まれつきメンタルが弱いという先天性の

不治の病を障害を抱えている。

それとも後天性の疾患なのか。

POWERはこれから獲得していくものなのか。

ピカチュウ。

ポケットモンスター。

ネットで情報ばかり集めてないで

友達を作るための工夫をして

作業集中するための環境を作って

一歩、また一歩。

あー日が暮れていく。

2024年12月2日　

16:37 P.M.
40 代が新人になったら、仕事は盗んで覚えるか、教えてもらうか

社会人歴イコール IT 業界歴で 20 年強。40 代になりまして、2 年前に人生初めて転職した者です。2024 年、今年初めに何をしていたかなんて記憶がありません。今年を振り返る「なんかかく」アドベントカレンダー 2 日目です。

## ヒトは人生 2 周目ならすべて思うがまま、思い通りに事を運べるのか

40 にして初めて転職してみると、人生 2 周目が楽しめるというお得ステージ感があります。前職では採用活動をすることも、新人さん向け教育担当をすることもそれなりにありましたが、一転、自分が採用され、教育を受ける立場になると、ヒトはどうなるのか。果たして賢者になれるのか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/8de1256c-8f46-745e-c771-5925e0d7c010.png)
(画は第二新卒のイメージ と言って出てきたもの)


考えているうちに、先月あたり新人教育に関わるツイート (ポスト) を見かけたことを思い出しました。ざっくり書くと仕事は「盗んで覚えるべき」か、「教わって覚えるべき」かという議論です。

ここで私の場合。技は「盗んで覚えている」のか、ストレートに「教えてもらっている」のか。ここ 2 年ちょい新人さんをやってみて、そういえばどっちかな、つまり「ヒトは人生 2 周目ならすべて思うがまま、思い通りに事を運べるのか？！」、考えてみることにしました、というポエムです。


## 最初に結論

### 仕事は教えてもらっています。

昭和生まれの氷河期育ち、面構えだけは一人前になりました。しかし仕事は教えてもらっています。というか教えてもらってしかいない。まじで！でも...


### だって、それがとてもやりやすいから...。

やりやすいし、自分もどんどん教えようという気持ちになるからです。人間何回訊いても忘れることもあるし、前回訊いたことが今回も合っているかわかりません。いつでも教えてもらえるんだというチーム良いですよね。教えてもらった分、自分も教えて返せばよいだけです。


## 人生 2 周目の答え合わせ

私が新人さんをしたのは新卒の頃です。2003 年、氷河期、自分、先輩、勤め人は誰もかれも全員昭和生まれです。

まあ、普通の会社なら 5 割教えてもらって、5 割盗むくらいでしょ、と思われるかもしれません。が、私の入社した会社はちょっと狂っていたので、優しい先輩がいればラッキーで 2、3 割教えてくれるくらい、全く教えてくれないがデフォくらいでした。酷く書いていますがお世話になった良い会社です。リンクは貼りません...。




### タイパ、コスパ

時間単位で自分に身に付いた力、知識量は差があるのか。うーん、変わらない気がします。タイパ、コスパというやつ (言ってみたかった。よく分かってない) で言うと、1 周目の新人たる私はとてつもなく時間がかかりました、深夜休日もカタカタやっていましたが、先輩の時間が浮いたと考えるならば、まあどっちもどっちなのでしょう。

一転して 2 周目の私、そもそも以前ほど体力が無いことは否めませんが 15 分～ 30 分悩んだら訊くことにしています。だって、訊いても結局誰も分からないこともあります。が、そうなるとめでたく (?)、人類いまだ誰も分からない問題であったということも分かるので、自信を持って次の手段を考えることができます。

教えてもらうことのベネフィットはこれだけではありません。


### 教えてもらえたら、教えたくなる

教えてもらえたら、教えたくなります。知識、シェアしてなんぼです。お前のトラブルは俺のトラブルです。

一緒に働いてるんだから楽しくやりたいよな！？

これだけでも「教えてもらう」が正解で良いなと思っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/842ab86b-2077-400d-ab58-a17b14fa49ed.png)



## 例外

ここまでさくっと頭の中では結論が出たのですが、でも待てよと思いました。教わらないこともある。

ただし、教わらないこともありました。

### 「これやっときましょうか」

「これやっときましょうか」とするべきお仕事です。

言われなくても勝手にやって良いかなと思える仕事。掃除、球拾い、というか議事録とか資料整備とか会議の司会進行とかそういうやつ。

### 挨拶、お礼、時間を守ること

挨拶、お礼、時間と約束を守る。率先して仕事を見つけること。新人には信頼貯金が圧倒的にありません。

挨拶をちゃんとする、お礼を言う、時間と約束を毎日毎日守るだけで信頼貯金が溜まります。信頼貯金がたまると、より難しいことを教えてもらいやすくなります。



## 結論

仕事は盗んで覚えるべきだし、教えてくださいと言いましょう。最後にちょっとだけ技術的な便利情報を添えるとすると:

[Copilot プロンプトの詳細 - Microsoft サポート](https://support.microsoft.com/ja-jp/topic/copilot-%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AE%E8%A9%B3%E7%B4%B0-f6c3b467-f07c-4db1-ae54-ffac96184dd5)
目標 (ゴール)、コンテキスト、期待値、参考にしたもの (ソース)

という辺りが整っていると AI 的なものからも回答が得やすいらしいで。

そして教わったことをいつでも教えてあげられる、挨拶、お礼ができて時間とお金の約束を守る先輩になりましょう。なりたいな。

以上です！！
Claude Desktop用のDuckDuckGo検索サーバーをnpmパッケージとして公開してみた

## はじめに

前回の記事では、Windows環境でTypeScriptを使ってModel Context Protocol（MCP）のDuckDuckGo検索サーバーを実装しました。今回は、このサーバーをnpmパッケージとして公開する過程を紹介します。

https://hamaruki.com/duckduckgo-search-for-windows-claude-desktop/

## なぜnpmパッケージとして公開するのか

MCPサーバーをnpmパッケージとして公開することで、以下のメリットがあります：

- 他のユーザーが簡単にインストールして使用可能
- バージョン管理が容易
- 依存関係の管理が自動化
- コミュニティへの貢献

## パッケージの準備

### package.jsonの設定

npmパッケージとして公開するために、package.jsonを以下のように設定しました：

```json
{
  "name": "@sunwood-ai-labs/duckduckgo-web-search",
  "version": "0.1.0",
  "description": "DuckDuckGo Web Search MCP Server - A simple web search implementation using DuckDuckGo API",
  "type": "module",
  "bin": {
    "duckduckgo-web-search": "./build/index.js"
  },
  "files": [
    "build"
  ],
  "scripts": {
    "build": "tsc && node -e \"require('fs').chmodSync('build/index.js', '755')\"",
    "prepare": "npm run build",
    "watch": "tsc --watch",
    "inspector": "npx @modelcontextprotocol/inspector build/index.js"
  },
  "keywords": [
    "mcp",
    "duckduckgo",
    "search",
    "claude",
    "model-context-protocol",
    "sunwood-ai-labs"
  ],
  "author": "Maki",
  "license": "MIT",
  "publishConfig": {
    "access": "public"
  },
  "dependencies": {
    "@modelcontextprotocol/sdk": "0.6.0",
    "node-fetch": "^3.3.0"
  },
  "devDependencies": {
    "@types/node": "^20.11.24",
    "typescript": "^5.3.3"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/Sunwood-ai-labs/duckduckgo-web-search.git"
  },
  "bugs": {
    "url": "https://github.com/Sunwood-ai-labs/duckduckgo-web-search/issues"
  },
  "homepage": "https://github.com/Sunwood-ai-labs/duckduckgo-web-search#readme"
}

```

主なポイント：
- スコープ付きパッケージ名（@sunwood-ai-labs/）
- publicアクセス設定
- ビルド成果物の配布設定

### ファイル構成

パッケージの構成は以下のようになっています：

```bash
.
├── build/          # コンパイルされたJavaScript
├── src/
│   └── index.ts    # メインのソースコード
├── package.json
├── tsconfig.json
├── README.md
└── LICENSE
```

## パッケージの公開手順

### 1. npmへのログイン

```bash
npm login --scope=@sunwood-ai-labs
```

### 2. ビルドの実行

```bash
npm run build
```

### 3. パッケージの公開

```bash
npm publish --access public
```

## インストール方法

他のユーザーは以下のコマンドでパッケージをインストールできます：

```bash
npm install @sunwood-ai-labs/duckduckgo-web-search
```

## パッケージのメンテナンス

### バージョン更新手順

1. package.jsonのバージョン番号を更新
2. 変更をコミット
3. `npm publish`を実行

### 将来の展望

- 検索オプションの拡張
- 多言語対応の強化
- 検索結果のフィルタリング機能
- キャッシュ機能の実装

## まとめ

MCPサーバーをnpmパッケージとして公開することで、インストールと設定が大幅に簡単になりました。また、バージョン管理や更新の配布も容易になり、よりメンテナンス性の高いプロジェクトとなりました。

## 参考リンク

- [パッケージページ](https://www.npmjs.com/package/@sunwood-ai-labs/duckduckgo-web-search)
- [GitHubリポジトリ](https://github.com/Sunwood-ai-labs/duckduckgo-web-search)
- [Model Context Protocol](https://github.com/modelcontextprotocol)
DSONについて

DSONはThe Daz Scene Object Notationの略です。
Daz Sceneという3Dグラフィックスソフトで使われているオブジェクトの表記方法です。

# ファイル形式
DSONのファイル形式にはテキスト型とバイナリ型があります。
テキスト型はJSON形式でデータを記述し、バイナリ型はテキスト型をzlibで圧縮してバイナリにしたものです。

# データ型
基本的にはJSONのデータ型を踏襲していますが、DSONにオリジナルのデータ型もいくつかあるようです。

例えばfloat型の値2つからなる配列の型をfloat2型としています。

```
[float, float]
```

同様にfloat3, 4, 5型もあります。

また以下のようなカウントを保持するようなstring_array型もあります。

```
{
  "count": int,
  "values": [string, string, ...]
}
```

同様にint_arrayやint2_array, float_array, float2_array, float3_arrayなどの型もあります。

さらにfloat_indexed_arrayというインデックス番号と値からなる配列を表す型もあります。

```
{
  "count": int,
  "values": [[int, float], [int, float], ...]
}
```

これと同様にfloat3_indexed_array型もあります。


DSONはほとんどJSONと同じような構文であることが分かります。要素数をcountフィールドに持つ型やインデックス番号とのペアで配列を表現する型などの少々異なる型はありますが、基本的は構文はJSONに準じています。

http://docs.daz3d.com/doku.php/public/dson_spec/start
M5StampS3で素数の計算し、ベンチマークする。(除算)




参考


https://ichiken-engineering.com/arduino-uno-r4-minima_keisan/



x 過去ログを見よ
x ICHIKEN様のホームページの内容を非営利、研究調査目的で引用しました。

目的
除算のベンチマークする

結果

![o_coq672.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/95395a68-7da5-ed7b-a793-b61b19346e6b.jpeg)



プログラム


```c++


//0~99991までの整数値を素数判定するのに要した時間を計測する。
#define DEBUG 0
void setup() {
  Serial.begin(9600);
  Serial.println();
  Serial.print("START");
  for(int i = 0;i < 9;i++){
    Serial.print('.');
    delay(500);
  }
  Serial.println();
}
bool isPrime(unsigned long n) {
    // 2未満の数は素数ではない
    if (n <= 1) {
        return false;
    }
    // 2は素数
    if (n == 2) {
        return true;
    }
    // 偶数は素数ではない
    if (n % 2 == 0) {
        return false;
    }
    // nを2からsqrt(n)までの数で割ってみて、割り切れるかどうかを確認
    // 割り切れる場合、素数ではない
    for (unsigned long i = 3; i * i <= n; i += 2) {
        if (n % i == 0) {
            return false;
        }
    }
    // それ以外の場合、素数である
    return true;
}
void loop() {
  
  unsigned long start_time, end_time;
  unsigned long time;
  bool result;
  unsigned long x;
  unsigned long p=0;
  Serial.println("start");
  start_time = millis();
  for(x=0;x<=99991;x++){
    result=isPrime(x);
    if(result == true){p++;}
#if DEBUG
    Serial.print(x);
    Serial.print("\t");
    Serial.println(result);
#endif
  }
  
  end_time = millis();
  time = end_time - start_time;
  Serial.print("END Value:");
  Serial.print(x-1); //最後の値の出力
  Serial.print('-');
  Serial.println(p); //素数のカウントの出力 最適化対策
  Serial.print("StartTime:"); 
  Serial.print(start_time); 
  Serial.print(" EndTime:"); 
  Serial.print(end_time); 
  Serial.print(" Time:"); 
  Serial.println(time); 
  Serial.println(result);   
  delay(1000);//1秒待機
}


```
svelte:boundaryについて

昨日12月1日に[Svelte5.3.0](https://github.com/sveltejs/svelte/releases/tag/svelte%405.3.0)が出されましたが[`svelte:boundary`](https://svelte.dev/docs/svelte/svelte-boundary)の機能はこの5.3.0 で追加されました。この記事は[そのドキュメント](https://svelte.dev/docs/svelte/svelte-boundary)を翻訳しました。Bluesky上のSvelteによるとクリスマスまで毎日一つ発表すると言ってます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30943/af1ffef2-f3a2-191f-c3a4-b5be2fd8a556.png)

https://bsky.app/profile/svelte.dev/post/3lcavobxn7c2k

`svelte:boundary`は、アプリの一部でのエラーがアプリ全体を壊すことを防ぎ、それらのエラーから回復するために使用します。
`<svelte:boundary>`のc`children`のレンダリングまたは更新中、あるいはその中に含まれる $effect 関数の実行中にエラーが発生した場合、そのコンテンツは削除されます。
レンダリングプロセス外で発生するエラー例えばイベントハンドラ内などは、エラー`boundary`によって捕捉されません。

## プロパティ
バウンダリが機能するためには、`failed` と `onerror` の少なくとも一方を提供する必要があります。

### failed
failed スニペットが提供された場合、`throw`されたエラーと、コンテンツを再作成する reset 関数と共にレンダリングされます。[(デモ)](https://svelte.dev/playground/hello-world?version=5.3.0#H4sIAAAAAAAAE3VRy26DMBD8lS2tFCIh6JkAUlWp39Cq9EBg06CAbdlLArL87zWGKk8ORnhmd3ZnrD1WtOjFXqKO2BDGW96xqpBD5gXerm5QefG39mgQY9EIWHxueRMinLosti0UPsJLzggZKTeilLWgLGc51a3gkuCjKQ7DO7cXZotgJ3kLqzC6hmex1SZnSXTWYHcrj8LJjWTk0PHoZ8VqIdCOKayPykcpuQxAokJaG1dGybYj4gw4K5u6PKTasSbjXKgnIDlA8VvUdo-pzonraBY2bsH7HAl78mKSHZpgIcuHjq9jXSpZSLixRlveKYQUXhQVhL6GPobXAAb7BbNeyvNUs4qfRg3OnELLj5hqH9eQZqCnoBwR9lYcQxuVXeBzc8kMF8yXY4yNJ5oGiUzP_aaf_waTRGJib5_Ad3P_vbCuaYxzeNpbU0eUMPAOKh7Yw1YErgtoXyuYlPLzc10_xo_5A91zkQL_AgAA)

```
<svelte:boundary>
	<FlakyComponent />

	{#snippet failed(error, reset)}
		<button onclick={reset}>oops! try again</button>
	{/snippet}
</svelte:boundary>
```

コンポーネントに渡されるスニペットと同様に、failed スニペットは明示的にプロパティとして渡すこともできます。

```
<svelte:boundary {failed}>...</svelte:boundary>
```

または上記のように`boundary`内で直接宣言することもできます。

### onerror
onerror 関数が提供された場合、同じ error と reset の2つの引数と共に呼び出されます。これは、エラー報告サービスでエラーを追跡する際に役立ちます.

```
<svelte:boundary onerror={(e) => report(e)}>
	...
</svelte:boundary>
```

または`error`と`reset`を`boundary`の外でも使えます。
```
<script>
	let error = $state(null);
	let reset = $state(() => {});

	function onerror(e, r) {
		error = e;
		reset = r;
	}
</script>

<svelte:boundary {onerror}>
	<FlakyComponent />
</svelte:boundary>

{#if error}
	<button onclick={() => {
		error = null;
		reset();
	}}>
		oops! try again
	</button>
{/if}
```

onerror 関数内でエラーが発生した場合（またはエラーを再スローした場合）、親バウンダリが存在する場合はそこで処理されます。
SAR干渉画像から能登地震の地すべりを観る

# まえがき

本記事は「[Nihon University Advent Calendar 2024](https://qiita.com/advent-calendar/2024/nihon-u)」に寄せた記事となります。
能登半島地震で起きた地すべりをSAR干渉画像から判読することを目的とします。
SAR干渉画像とは何か、SAR干渉画像の入手方法、SAR干渉画像からどのように地すべりを観るか、が知りたい方にとって役立つ記事となりましたら幸いです。

# SAR干渉画像とは？

以下のサイトを参照してください。

https://www.gsi.go.jp/uchusokuchi/sar_mechanism.html

# SAR干渉画像の読み方

以下のサイトを参照してください。

https://www.gsi.go.jp/uchusokuchi/sar_procedure.html

# 能登地震について

2024年1月1日の地震の詳細は以下のサイトを参照してください。

https://ja.m.wikipedia.org/wiki/能登半島地震_(2024年)

能登半島で起きた地震の履歴はこちらを参照してください。

https://typhoon.yahoo.co.jp/weather/jp/earthquake/list/?e=390

サイトにジャンプするのがめんどくさい人のために超ざっくりと説明すると、能登半島では1年前くらいに大規模な地震が発生し、今でも高頻度で地震が起こっているってことが解ればOKだと思います。

なお、2024年1月1日の能登半島地震のSAR干渉画像の判読について、興味がある方は以下の文献をご覧ください。佐藤・宇根（2024）の文献です。

http://disaster.ajg.or.jp/files/202401_Noto006.pdf

# データのソース

SAR干渉画像はこちらからダウンロードしました。

https://comet.nerc.ac.uk/comet-lics-portal-velocities/

本当は精度の関係でPALSAR-2のデータを使いたかったですが、データをダウンロードするための料金が高いことから断念しました。
まぁ、一般の方でもダウンロードできるSentinel-1のデータのソースを紹介できる点ではある意味メリットかと（言い訳）。

# 方法

2023年12月から2024年2月までのSentinel-1のSAR干渉画像2枚をダウンロードし、GISにインポート。
色（位相）の変化が急激な地域にポイントを置き、その経緯度を求め、実際に地すべりが起こっているかをGoogle Earthで確認しました。
ダウンロードしたデータは以下の通りです。

フレームID: 017D_05353_130400
期間:
　・20231230-20240111
　・20240111-20240228

# 結果

その結果、1箇所の地すべり箇所（白い点）を判読できました。以下図１、図２が地図になります。

![20231230-20240111.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586134/8112c43c-ab03-7715-eee4-1967056cc8da.jpeg)

図１．20231230-20240111

![20240111-20240228.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586134/eeabc6a7-d158-9da6-8530-bdb712ddd27b.jpeg)

図２．20240111-20240228

そして、このポイントをGoogle Earthで観たものは図３です。

![Target1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586134/8b1eb420-6e4e-e413-2647-36e68c85143a.jpeg)

図３．Google Earthでの観測結果（観測年月日: 2024/5/14）

Google Earthでも観測した結果、この地点では地すべりが見られました。

# あとがき

本記事は能登半島地震で起きた地すべりをSAR干渉画像から判読することを目的とし、SAR干渉画像から地すべりが起きている地域を予想して、空中写真から地すべりが起きているかどうかを確認しました。
本記事をきっかけでSAR干渉画像に興味を持っていただけたら幸いです。
2024/12/2主にITとかセキュリティの記事

サイバー犯罪組織がセキュリティ専門家を大量採用｜年間270億ドルの闇市場の実態(11/30)
https://innovatopia.jp/cyber-security/cyber-security-news/45196/

Godot Engine悪用マルウェア『GodLoader』が登場 – 17,000システムに感染、ゲーム開発コミュニティに警鐘(11/30)
https://innovatopia.jp/cyber-security/cyber-security-news/45189/

Japan Panel Proposes Law to Monitor Communications for Cyber Defense(11/29)
https://sp.m.jiji.com/english/show/36977

ランサムウェア攻撃の実態！医療機関が直面した危機とその教訓とは？事例とともに振り返り
https://cybersecurity-park.com/3667/

サイバー防御　攻撃の兆候を素早く把握せよ(11/30)
https://www.yomiuri.co.jp/editorial/20241130-OYT1T50024/

50社が攻撃を受けたFortinetのゼロデイ脆弱性、その危険性とは？(11/29)
https://kn.itmedia.co.jp/kn/articles/2411/29/news103.html

北朝鮮、数十億ドルの仮想通貨盗難と報告｜ウォレットをハックする手口とは？(11/30)
https://bittimes.net/news/186683.html

オーストラリア 議会 情報・安全保障合同委員会 2024年サイバーセキュリティ法制パッケージ (2024.10.08)(11/30)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/11/post-c0ae36.html

重大サイバー攻撃、予兆で無力化　有識者会議が提言 第三者機関が監督(11/30)
https://www.nikkei.com/article/DGKKZO85153550Q4A131C2MM8000/

サイバー防御、「通信の秘密」と両立探る 監視データは選別/定期的に情報公開(11/30)
https://www.nikkei.com/article/DGKKZO85152850Z21C24A1EA1000/

自治体DXで実施したい取り組み7つ｜自治体DXの必要性も解説(11/29)
https://www.kddimatomete.com/magazine/241129000020/

ChatGPTは工学の学位を取得できるか？(Could ChatGPT get an engineering degree?(11/29)
https://tiisys.com/blog/2024/11/30/post-148001/

海外チームをハッカー集団が襲撃、身代金を要求される(11/29)
https://topics.smt.docomo.ne.jp/article/qoly/sports/qoly-rv43v7zf-qoly-seriea-gib-1

ボローニャが「サイバー攻撃」の被害に…犯行グループは“身代金”を要求(11/29)
https://qoly.jp/2024/11/29/rv43v7zf-qoly-seriea-gib-1

【墨汁速報】米NY規制当局リップル(XRP)のステーブルコイン「RLUSD」を承認か 12月にローンチ予定=リーク(11/30)
https://coinchoice.net/nyfds-indicated-ripple-stablecoin-rlusd-will-be-approved_bnews/

KADOKAWA、特損縮小(11/29)
https://www.nikkei.com/article/DGXZQOUC2976S0Z21C24A1000000/

「根気強く銀行に電話していれば」暗証番号を変えるも 半日で600万円の被害…偽のSMSにメール　警察は「安易にURLをタップしないで」と注意呼びかけ(11/30)
https://nordot.app/1235351106241659726

【速報】NTT西子会社情報流出、書類送検へ(11/30)
https://www.47news.jp/11838604.html

【独自】虚偽報告疑い 名簿業者書類送検へ　岡山県警 NTT西子会社事件巡り(11/30)
https://news.yahoo.co.jp/articles/bd4f07406f16ad25c6fa9a8beebdc1905e404067?source=rss

岡山県警が名簿業者を書類送検へ ＮＴＴ西子会社の情報流出事件(11/30)
https://www.hokkoku.co.jp/articles/-/1591283

【速報】くまもとグリーン農業ホームページにサイバー攻撃　県が発表(11/30)
https://kumanichi.com/articles/1621544

サイバー攻撃、政府へ報告義務化　通信秘密に配慮「合理的な制限」(11/29)
https://nordot.app/1235162936612028697?c=724086615123804160
システムのモニタリング（連載第6回/25回）

# はじめに

システムのパフォーマンスやリソース使用状況を監視することは、安定した運用のために非常に重要です。ここでは、`top`、`htop`、`vmstat` の基本的な使い方を紹介します。
# コマンド説明
#### `top` - 動的なシステムモニタリング

`top` コマンドは、システム上で実行されているプロセスのリアルタイムビューを提供します。
CPU使用率やメモリ使用量、実行中のプロセス一覧を確認できます。

***主な機能***
P : CPU使用率順にソート
M : メモリ使用量順にソート
k : プロセスを終了（kill）
q : top コマンドの終了

```powershell
# 現在のシステムリソースの使用状況が表示されます。
ps
```

#### `htop` - ユーザーフレンドリーなプロセスマネージャー
`htop` は、`top` よりも視覚的に分かりやすく、インタラクティブに操作できるプロセスマネージャーです。インストールが必要です。

***主な機能***
カーソルキーでプロセスの選択
F9 : 選択したプロセスを終了（kill）
F10 : htop コマンドの終了


```powershell
# インストール方法
sudo apt-get install htop    # Ubuntu/Debian
sudo yum install htop        # CentOS/Fedora
```

```powershell
# 使用方法
# このコマンドを実行すると、カラー表示されたシステムリソースの使用状況が表示されます。
htop
```

#### `vmstat` - 仮想メモリ統計
`vmstat` コマンドは、システムのプロセス、メモリ、ページング、ブロックI/O、トラップ、CPUアクティビティのパフォーマンス統計を報告します。

***主なオプション***
-s : メモリ統計のサマリーを表示
```powershell
# このコマンドを実行すると、カラー表示されたシステムリソースの使用状況が表示されます。
vmstat [オプション] [delay [count]]
# このコマンドは、1秒ごとに5回のシステム統計を表示します。
vmstat 1 5
```
# おわりに
これらのコマンドを使用することで、システムのパフォーマンスを効率的に監視し、問題を早期に発見することができます。
あまり頻繁に利用するコマンドではありませんが `top` コマンドなどは頭の片隅に残しておくと必要な時に役立ちます。
次の記事では、プロセス管理について説明します。

https://qiita.com/yu1016/items/f1cce9f9b574a267d3a7

一覧

https://qiita.com/advent-calendar/2024/pig
Google Chart APIが廃止されたらしいのでQR code APIを使ってみる

# はじめに
## ひとこと
アクセスしていただきありがとうございます。
記事を執筆している2024/12/02現在は少し早い年末ということで、筆者用のシステムの大掃除をしていました。
すると、しばらく動かしていなかったQRコードを扱う機能がエラーを出力したため確認したところ、Google Chart APIが`code 404`を返していました。
調べたところ、公式からの発表がないもののユーザの反応から推測するに、2024年の春ごろに廃止されていたようです。
そこで代替となりそうなQR Code APIを使ってみました。

## 目的
+ QR Code APIを理解して使えるようになる

## 検証済みの環境
+ QR code API v1

## ご注意
+ この記事の情報は **2024/12/02現在** のものです

# 1.QR code APIとは
## 概要

https://goqr.me/api/

おそらくドイツの企業（？）が運営しているQRコードに関するAPIです。
下記の通り、特殊な要件でもない限りは十分すぎる機能を備えながら、**無料**、**ログインやAPIキーなし**、**（一部、制限はありますが）無制限**で提供してくれています。
APIのドキュメントは英語ですが平易な表現が使われており、Google翻訳はしっかりと機能してくれましたので、おそらくどなたでも読めると思います。

## できること
### QRコードの生成
データやオプションをURLパラメータで指定する形式です。
QRコードの内容を指定するだけで生成してくれます。
それ以外にも画像の大きさやファイル形式など9つのオプションがあります。

### QRコードの読み取り
読み取りたい画像のURLを指定するか、画像を`POST`することで読み取ってくれます。
読み取った結果はJSON形式かXML形式で返してくれます。

## 使い方
上記の通り、APIドキュメントが分かりやすいため、ここでは最低限だけ紹介します。

### QRコードの生成
```
https://api.qrserver.com/v1/create-qr-code/?data=qiita.com/ochx
```

### QRコードの読み取り
```
http://api.qrserver.com/v1/read-qr-code/?fileurl=http%3A%2F%2Fapi.qrserver.com%2Fv1%2Fcreate-qr-code%2F%3Fdata%3Dqiita.com%2Fochx
```
（QRコードを生成し、それを読み取っています）

# 2.GASでのサンプルコード
QRコードを生成し、Googleドライブに保存するシンプルなサンプルコードです。
```js: script.gas
function createQRCode() {
  const data = 'qiita.com/ochx'
  const url = `https://api.qrserver.com/v1/create-qr-code/?data=${data}`
  const blob = UrlFetchApp.fetch(url).getBlob()
  DriveApp.createFile(blob).setName('QRCode.png')
}
```

# おわりに
最後までお読みいただきありがとうございます。
ざっと調べた限り、この素晴らしいAPIに関する日本語の情報は少なかったので記事にしてみました。
少しでも広まれば幸いです。
ネットワーク診断（連載第5回/25回）

# はじめに

ネットワークのトラブルシューティングや接続状況の確認には、いくつかの基本的なコマンドが非常に役立ちます。ここでは、`ping` と `traceroute` の使い方を紹介します。

# コマンド説明
#### `ping` - ネットワーク接続の確認
`ping` コマンドは、指定したホストにICMPエコーリクエストを送信し、応答を確認することでネットワーク接続の状態をチェックします。

**主なオプション**
-c : 指定した回数だけパケットを送信
-i : パケットを送信する間隔を秒単位で指定

```powershell
# 例
ping [オプション] [ホスト名またはIPアドレス]
# www.example.com に4回のICMPエコーリクエストを送信し、応答を確認します。
ping -c 4 www.example.com
# 特定のホストへの接続確認
# 192.168.1.1 に5回のパケットを送信して応答を確認します。
ping -c 5 192.168.1.1
```

`traceroute` - ルートの追跡
`traceroute` コマンドは、パケットが指定したホストに到達するまでに通過するルーターの経路を表示します。ネットワーク遅延や接続問題の診断に役立ちます。

**主なオプション**
-m : 最大ホップ数を指定
-n : ホスト名ではなくIPアドレスを表示

```powershell
# 例
traceroute www.example.com
# ネットワーク遅延の診断
# ホスト名を解決せずにIPアドレスのみを表示して経路を追跡します。　
traceroute -n www.example.com
# 特定のネットワーク経路の確認
# 最大30ホップまでの経路を追跡して 8.8.8.8 への経路を表示します。
traceroute -m 30 8.8.8.8
```
# おわりに
これらのコマンドを使うことで、ネットワークの接続状態を迅速に確認し、問題の診断に役立てることができます。
特に `ping` コマンドはよく利用しますが普段使わないオプションも試してみると有用だと思います。

次の記事では、システムのモニタリングについて説明します。

https://qiita.com/yu1016/items/954ecc890257d56034b0

一覧

https://qiita.com/advent-calendar/2024/pig
Windows版、次世代ブラウザArcを3か月使って分かったいい所と悪い所

# はじめに
こんにちは！エンジニア志望の高専生です！

今日は、新しい物が大好きな私が、次世代のブラウザ、Arcを3か月使った感想を書いていきます！

:::note warn
本記事はあくまでも**windows版**のレビューになります。さいMac版のとは動作が異なる場合があります。
:::

# Arcとは？
- 2023年にThe Browser Companyがリリースしたブラウザ
- ChromeベースでUIや操作性に優れる
- Windows、Macの両方に存在する

https://arc.net/

# いい所
## 圧倒的サイドバー
正直Arcの代名詞とも言っていいですね。ピン留めしたサイト、ブックマークしたサイト、今開いているサイトがすべて一つのサイドバーに集約されています。

どれだけタブを開いても各サイトのタイトルが一目でわかるのが地味にうれしいです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929797/0970008a-5a65-5ed3-f598-58e8eb4b4b2c.png)

↓こんな感じですぐに使いたいサイトは、より目立つようにブックマークできるのもうれしいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929797/534f88e4-7553-ec52-fcda-f499b24cba04.png)

## 階層化してブックマークできる
サイドバーにブックマークしたサイトは、下の様なフォルダ構造でブックマークできます。ブックマークしたいサイトが多数あっても、煩雑にならず、アクセス時のストレスががなり減ります！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929797/929c47fd-bf8e-8c57-537c-59b11b6f76de.png)

## 邪魔な要素が少ない
例えばChromeだと、↓の様にタブ、検索バー、ブックマークバーが強制的に画面上部を占有します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929797/70aa9333-1e06-6c97-e7c5-1ab3a3e2d10d.png)

これだけならまだましですが、↓の様に4分割して使いたい時などは結構邪魔になったりするんですよね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929797/ed220ffb-23be-a44a-a62b-f6fc214e4c0d.png)

**Arcではサイドバーさえ格納してしまえば、ほとんど邪魔なものはなくなります。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929797/13944f24-4da1-8548-5ebe-236027d461b1.png)

## 画面分割機能
Arcでは画面分割にも対応しています。

Windows版では上下、もしくは左右の分割に対応しています。

余分な空白が少ないため、画面の小さいノートパソコンでも心地よくブラウザを使うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929797/2f84f11d-83e3-5d45-4a2a-518a776bc711.png)

## デフォルトで広告ブロックがついている
規制が厳しくなったYoutubeの広告すらブロックすることができます。

他にも各サイトのバナー広告、Tverのしつこい広告すらブロックしてくれます。

私がArcを使い続ける理由の一つです！

## 動画の自動PIP
動画を開始する➡ほかのタブを開くという手順だけで動画が自動的に画面最前面に固定されます。

動画の大きさや位置は自由に変更できますし、再生停止スキップのコントロールもできます。

普段Youtubeを開きながら作業することが多い方にはかなりおすすめの機能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929797/2542e090-d8c9-fff4-9de2-c9ecf2451194.png)

## Chromeからの移行が楽
私自身、ChromeからArcにブラウザを変更した身ですが、検索結果のUIは変わらなかったり、Chrome拡張機能がそのまま使えたりと、容易に移行することができまた。

# 悪い所
## サイドバー開閉のコマンドについて
サイドバーの開閉の際のコマンドが`ctrl+S`であるため、googlecolabを開いているときに使うとcolab側の保存コマンドも一緒に動作します。

今のところ大きな事故が起こったことはないですが、`ctrl+S`というコマンド自体各所でよく使われているので、他のものにできたらいいなと思ってしまいます。

## 日本語検索時のバグ
Arcの検索バーから、**日本語で検索する場合、末尾に必ず半角スペースを入れる必要があります**。

今でこそある帝都慣れましたが、検索ワードを打ち込む➡半角に変更➡スペースという手順が結構めんどくさいです。

詳しくは下の記事に紹介があります

https://qiita.com/yuu_design00/items/32a3884af62d368c2aab

## なぜか急にキーボードが効かなくなる時がある
これについてはいまだに条件を把握できていませんが、**突然キーボードが効かなくなる**ことが一日に数回ほどあります。

別アプリをクリックしてアクティブにしてからArcに戻ることで一応解決します。

## 画面分割時の動作
画面分割時に、片方の画面の検索バーを使い別サイトに移動したい時、

1. 片側の画面をクリックしてアクティブにする
1. 検索バーをクリックして検索する

という手順を踏まないと現在アクティブになっている画面が遷移してしまいます。

↓の状態(画面右がアクティブ)で,画面左の検索バーをクリックし、検索を行うと画面右側のページが変わってしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929797/1773307d-ccbd-fefc-686d-fd908455ca77.png)

#まとめ
Windows版にはまだいろんなエラーがあるArcですが、それでも使い続けたいと思うくらいUIが素晴らしいです！

皆さん是非使っていきましょう、、！！
Slackワークフローで勉強会の参加者を募集・一覧で管理する

# はじめに
Slackで勉強会の参加者募集を簡単にできないかな～と思っていた時に
Slackワークフローで簡単に実現できたので備忘録として残しておく。

# やりたいこと
やりたいのは「ボタン1つ押すぐらい簡単な作業で勉強会の参加登録ができる」こと！
手軽さが一番大事🏅
アンケートを取るわけではないので、Google Formsとかの入力が必要なのは避けたい。

参加登録だけでなく、さらに以下を一覧で管理できるとベスト。
- 参加者の名前
- 参加人数
- 当日の出欠管理


# やったこと
ざっくりやったことは以下の通り
1. Slackリストを作る
2. 特定のチャンネルで指定のEmojiを使ったらリストに登録できるワークフローをつくる

まずはSlackリストを作ってみる👀

## Slackリストの作成

勉強会の参加者を募集したいSlackチャンネルでリストを作る
ちなみにリストの作成は、チャンネル上部のタブから「＋」を押すと作成できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667288/5c9b42e4-9b8a-374c-addb-0326dfc8fd69.png) 

<br/>


こんな感じのリストを作ってみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667288/0d0cebed-c3e1-a3da-8005-ee18387e9eaf.png)

次はワークフローを作ってみる

## Slackワークフローの作成
リストと同じように、勉強会の参加者を募集したいSlackチャンネルでワークフローを作る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667288/4a2b8bf3-980e-d8cd-7b50-9d1b0eb5eb66.png)

<br/>

### ワークフローの開始方法を指定
開始方法を「**絵文字リアクションが使用された時**」にして、集計したい絵文字を追加する。
今回は事前に登録しといた(:sanka-kibo:)の絵文字を使用する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667288/a0f0a9d9-89f4-60a7-4606-273984cc6379.png)

<details><summary>ちなみに絵文字は複数追加できる😊</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667288/3175568c-9e8c-ca21-c55f-e0d3b602e2c9.png)

</details>

### ステップの追加
次に指定した絵文字が使われた場合に、実行したい処理を指定する。
今回はリストにボタンを押した人を登録したいので「**リストアイテムを追加する**」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667288/c9e2f91f-3753-7069-69fc-4c9f93b04dad.png)

### リストアイテムを追加する
名前に「**｛｝メッセージにリアクションしたユーザー**」を指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667288/77bce73e-c05b-62ca-a2ff-0f348658bb74.png)
<br/>

ここまでやったらリストを公開する🎉

### 参加者を募集してみる🎉

まずは適当なメッセージをチャンネルに送ってみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667288/89f715c4-391f-ac06-bbf6-ea508351f4af.png)
<br/>

そして、この投稿にスタンプを押してみる👀
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667288/55c59e76-acfa-efa1-8cc7-097aca9c9a34.png)
<br/>

絵文字を押した人がリストに追加されていく！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667288/bd3d4d1b-1f13-f70d-ac15-a48764dd6f37.png)



## さいごに
ライトに集まって勉強会やらイベントやりたいときに使えそう
なお、作成したSlackリストはCSVダウンロードできるので、あとは煮るなり焼くなりできます🍲
パーミッションと所有権の管理（連載第4回/25回）

# はじめに

Linuxでは、ファイルとディレクトリのパーミッション（アクセス権）と所有権を管理することが非常に重要です。ここでは、`chmod` と `chown` コマンドを使った基本的な管理方法を紹介します。

# コマンド説明
#### `chmod` - ファイルとディレクトリのパーミッションの変更

`chmod` コマンドは、ファイルやディレクトリのアクセス権を変更するために使用されます。
アクセス権のシンボル
`r` : 読み取り（read） 
`w` : 書き込み（write） 
`x` : 実行（execute）
```powershell
# 例
chmod [options] mode file      
# ファイルに読み取り・書き込み・実行の権限を与える（所有者）
chmod u+rwx filename
#グループに読み取り権限のみを与える
chmod g+r filename
#その他のユーザーに全ての権限を与えない
chmod o-rwx filename`
```

#### 八進数（数値）による指定
`r=4`、`w=2`、`x=1` の合計で指定

```powershell
# 所有者に全ての権限（7）、グループとその他に読み取り・実行権限（5）を与える。
chmod 755 filename
```

#### `chown` - ファイルとディレクトリの所有権の変更
`chown` コマンドは、ファイルやディレクトリの所有者とグループを変更するために使用されます。

```powershell
# 例
chown [options] owner[:group] file
# ファイルの所有者を `user` に変更する
chown user filename
# ファイルの所有者を `user` に、グループを `group` に変更する
chown user:group filename
```

#### 基本的な使用例

```powershell
# ファイルの所有者とグループの変更
# 指定したファイルの所有者とグループが変更されます。
sudo chown user:group /path/to/file
       
# ディレクトリとその中身のパーミッションを再帰的に変更
# 指定したディレクトリとその中身全てのパーミッションを変更します。
chmod -R 755 /path/to/directory

# ファイルの実行権限の追加
# スクリプトファイルに実行権限が追加されます。
chmod +x /path/to/script.sh
```

# おわりに
パーミッションと所有権の適切な管理は、システムのセキュリティと運用の効率性を高めます。
個人的には八進数（数値）による指定を主に利用した方が覚えやすいと思います。

次の記事では、ネットワーク診断の基本コマンドについて説明します。

https://qiita.com/yu1016/items/2bc871f337b2c3b1ffe5

一覧

https://qiita.com/advent-calendar/2024/pig
数学弱者が波に挑戦してみる①

# はじめに
今回初めての投稿になります！

下記の記事を参考に、ゲームによくある「波」の実装に挑戦するだけの開発日記です！

http://marupeke296.com/Shader_No3_WaveSin.html

さっそく実装しながら書いていきます！

# 頂点を動かすかハイトマップを使うか

どうやら波を表現する方法は2種類あるらしい。
・頂点を頂点・ジオメトリシェーダなどで実際に動かす
・ハイトマップ・法線マップを使って、動いているように見せる

ハイトマップ⇒高さ情報を保持したテクスチャ

とりあえず板ポリ描画

![wave1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941047/11f82723-fb30-005d-e9ad-e45e77210339.png)


手始めにハイトマップを使ってそれっぽく見せてみようと思う。
が、ハイトマップを法線マップへ変換する作業が必要らしいので
https://cpetry.github.io/NormalMap-Online/
サイト様の力をお借りしてハイトマップを法線マップへ変換

![wavenormalmap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941047/d079a150-7db9-f8c7-a597-f2c5c1004d35.png)


さっそく適用と行きたいところなんですが、ここであまり知らない概念登場
`「接空間」`
　自分なりに調べた結果、法線を基準とした座標空間っていう認識になったんですが
　あってるんだろうか。まあ、いったん置いといて

![wave2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941047/aa4a82b0-b597-af0c-3238-b4bb981353c3.gif)


適用&少しそれっぽく動かしてみる

まだ全然波ではないですね
っていうのも、今現在はUV値を変動させているだけなのでちゃっちく見える。
本来は毎フレーム、`ハイトマップを作成⇒法線マップに変換`
っていうのをしないといけないらしい。

**「「大変」」**

# ここから少々波について勉強＋メモ

・波を表現する際に必要な要素
　「振幅」波の中心から最低・最高どちらかまでの高さ
　「波長」波の最高地点(最低地点)から次の最高地点(最低地点)までの距離
　「位相」平行移動
・ゲームで波を表現する場合sin波がとても重要
・現実では波長を1とした時の最大の波の高さはおよそ1/7
　波長：最大の波の高さ　＝　1：0.142...
etc.

いったん今日はここまで

次回はハイトマップを動的に生成するところからやります！

#

開発環境
IDE:VisualStudio2022
使用言語:c/c++
使用ライブラリ:DirectXTex,DirectXMath etc.
Raspberry Pi 固定IPアドレス設定（Raspberry Pi OS Lite - bookworm）

# 結論　　少なくともbookwormでは
```
sudo nmtui
```
でグラフィカルで簡単・直感的に設定ができるようになっている
(例としてWi-Fiで繋いだラズパイを固定IP化している)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622136/af042678-e91c-92ca-9548-9035b33b1b0e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622136/e5f69053-e9e0-aab1-2bee-8ddb761fe69b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622136/0bcaabb3-1654-d24a-35fe-819fe58659dd.png)
※preconfiguredはRaspberry Pi ImagerであらかじめWi-Fiの設定を仕込むと自動的にこの名前にしてくれる
※最初はIPv4 CONFIGURATIONが<Automatic>になっているため<Manual>に変更
※この記事を書いたラズパイのイメージは　2024-11-19-raspios-bookworm-arm64-lite.img.xz
　から作成したもの。ハードはRaspberry Pi 4B。

 どうしてもCLIでキーボードをタカタカしたい人は
 ```
 sudo nmcli connection show
 　→接続プロファイル一覧を確認
  
 sudo nmcli connection modify ‘接続プロファイル名’ ipv4.method manual ipv4.addresses 固定したいIPアドレス/ビットマスク ipv4.gateway デフォゲ ipv4.dns DNS鯖

sudo nmcli connection reload
sudo nmcli connection up ‘接続プロファイル名’
```
でも可。圧倒的手数の多さ。

 
# 今までは…
最後にRaspberry Pi OSを触ったのがだいぶ昔となってしまうが、
Raspbian busterあたりまでは
```
/etc/dhcpcd.conf
```
や
```
/etc/network/interfaces
```

の中にゴリゴリと設定を書いていく方式だった。

# 所感
balenaEtcherやRufusではなくRaspberry Pi Imagerが使いやすくなっていたり
上記のようにRaspberry Pi OSの中も便利になっていっているなぁ…と感じた。


思い立って久々にラズパイを押し入れから引っ張り出し、浦島太郎の気持ちになったので備忘録として残す。
2023年位からラズパイを触っておらず、久々に触る人が「/etc/dhcpcd.confがない！」となったときに読んでいただきたい。
【Vue3】does not provide an export named 'default'の対処方法

簡単に残します。

環境：Vue3
記述：Composition API

エラーが起きた事例

jsファイルをapiフォルダ内に作成して、コンポーネントでimportしようとしたところ、タイトルのエラー発生

エラー発生時の記述

const getUser(fn) {
  setTimeout(() => fn(sample),100)
}

エラー改善後の記述

export default {
  getUser(fn) {
    setTimeout(() => cb(sample),100)
  }
}

原因
does not provide an export named 'default'

上記のエラーが出る場合は、composition APIのsetup記述ではなく、Option APIのexport default記述じゃなければ他のファイルにimportできないとの頃。

余談と感想
冷静に考えたらComposition APIは簡単に記述できるようになったものの、別のファイルにアクセス可能にするにはexport defaultで書かないとだめだよなと解決してから思いました。

同じくハマっている方が居たら、参考になると幸いです。
おやすみなさい。
複数のgithubアカウントを運用するときの注意点

# 1. SSH接続の基本

•	SSH接続の役割：安全な通信トンネル（暗号化通信）を提供する。
•	回線自体は秘匿されるが、通信相手が誰かまでは分からない。
•	公開鍵と秘密鍵を使うことで認証を行い、通信相手が正しいか確認する仕組みが必要。

# 2. 公開鍵と秘密鍵の役割

### 公開鍵
•	GitHubに登録し、通信相手が秘密鍵を持つ本人かどうかを確認するために使う。
•	他人に見られても問題ない。
### 秘密鍵
•	自分だけが持ち、署名や暗号化通信の復号に使う。
•	外部に漏れると安全性が失われるため、慎重に管理する。

# 3. SSHキーとパスフレーズ

•	パスフレーズは、秘密鍵をさらに保護するための追加のセキュリティ。
•	漏れる可能性は低いが、管理が不適切（例: 無防備に保管）だとリスクが生じる。
•	忘れた場合、新しいSSHキーを作成してGitHubに再登録する必要がある。

# 4. SSHエージェントの活用

•	SSHエージェントは、秘密鍵をメモリに保持し、パスフレーズを何度も入力しなくて済むようにする仕組み。
•	ssh-add コマンドで秘密鍵を登録し、ssh-add -l で確認できる。
•	SSH設定ファイル（~/.ssh/config）に基づき、複数の鍵を切り替えながら使える。

# 5. 複数のGitHubアカウントを切り替える方法

•	SSH設定ファイルでのエイリアス設定：
•	複数の鍵を使い分けるために、~/.ssh/config に Host を設定。
•	例：
`Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519

Host github-new
HostName github.com
User git
    IdentityFile ~/.ssh/id_ed25519_new_account`

• 認証テストのやり方
1つ目のアカウント
`ssh -T git@github.com`
2つ目のアカウント
`ssh -T git@github-new`

# 6. 他のデバイスでGitHubを利用する際の注意

•	SSHキーはデバイスごとに個別に設定が必要。
•	新しいデバイスでは、新しいSSHキーを作成し、公開鍵をGitHubに登録する。
•	SSH認証はGitHubアカウントのログインには影響しない。
•	ウェブブラウザからのログインは引き続き可能。

# 7. パスフレーズの管理

•	覚えやすいが安全な名前やフレーズを付けることが重要。
•	例：GitHub_Work_Key や SSH_Key_2024
•	パスワードマネージャー（Appleのキーチェーンなど）を活用して安全に保管する。
ABC381Eを解いた【累積和,二分探索】


Python AtCoder 競技プログラミング

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

ABC381のE問題を解いていく

https://atcoder.jp/contests/abc381/tasks/abc381_e

# 実装コード

- 各文字の出現個数を累積和で求める
- "/"の位置を二分探索
- チェックする"/"がクエリ範囲なら、"/"の左にある1の個数、右にある2の個数の少ない方の2倍に1を足した数が暫定の答え
- 少ない方に合わせて探索する`/`の位置をずらす


```python:main.py
from itertools import accumulate
import sys

def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rI1(): return (int(sys.stdin.readline().rstrip())-1)
def rLI1(): return list(map(lambda a:int(a)-1,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)


def main():
    N, Q = rLI()
    S = rS()
    c = {k:[0]*-~N for k in "12/"}
    M = 0    
    for i,s in enumerate(S, start=1):
        c[s][i] = 1
        if s=="/":M+=1
    c1 = list(accumulate(c["1"]))
    c2 = list(accumulate(c["2"]))
    cs = [i for i in range(-~N) if c["/"][i]==1]
    
    # err(c1)
    # err(c2)
    # err(cs)
    
    for _ in range(Q):
        l,r= rLI()        
        # err(f'l: {l}, r: {r}, li: {li}, ri: {ri}')
                
        ans = 0
        li = 0
        ri = M-1
        while li <= ri:
            mi = (li+ri)//2
            m = cs[mi]
            if m < l:
                li = mi + 1
                continue
            elif m > r:
                ri = mi - 1
                continue
            # err(f'mi: {mi}, m: {m}')
            
            l1 = c1[m] - c1[l-1]
            r2 = c2[r] - c2[m]
            # err(f'l1: {l1}, r2: {r2}')
            
            ans = max(ans,2*min(l1,r2)+1)
            
            if l1>r2:
                ri=mi-1
            else:
                li=mi+1

        # err(f"ans: {ans}")
        print(ans)
    
if __name__ == '__main__':
    main()

```

# まとめ

ABC381のE問題を解いた。
解法には累積和と二分探索を組み合わせた

同コンテストのD問題の解説よりわかりやすかったが、bisectの使い方に苦戦して結局直接実装する方式に落ち着いた。

もう少しライブラリの使い方を把握しておきたい
Qt Creator のビルドにトライする

# はじめに

今回、初めてアドベントカレンダーに参加します MAAKUN と申します。
軽く経歴を紹介をさせていただきますと、2000年代前半に情報工学系の修士課程を出て社会人として新卒入社し、以来20年ほどソフトウェア開発に携わっています。いくつもの開発現場で色々な開発環境やプログラム言語を経験してきましたが、基本的にはC++での組み込み系のソフト開発がほとんどです。

Qtによる開発現場にはここ4年ほどガッツリ携わっているくらいでQtの経験歴としてはすごく長いわけではないという状況です。とはいえ何かしらOSSに関われる機会がないかなということを模索していたこともあり、その一環でこのアドベントカレンダーに参加してみようと思いました。

投稿テーマを悩んだ結果、今回選んだテーマは「Qt Creatorのビルドにトライする」です。Qt本体はボリュームも大きくてハードルが高そうだけど、Qt Creator のビルドなら取り組みやすいのではないかと思い選んでみました。Qtを使った開発をしていたらほぼ必ず使うソフトかと思いますし、ビルドが出来たらその先に機能追加やバグ修正など対応できる土台になると思いますので、まずはビルドから、ということにしました。

# 環境の準備

まずはビルド環境の準備です。

Qt Creator のビルド環境とビルド手順に関しては、下記 Qt Creator のリポジトリにあるReadMeに記載されていますので、基本的にこれに従えばいいのかなと進めてみました。
(しかし結局この通りにはしなかったです)
https://github.com/qt-creator/qt-creator/blob/master/README.md

まずは Windows で Qt Creator をビルドするための環境準備をします。

### 必要な環境 (上記サイトから読み取り)
- Qt 6.4.3 以降がインストールされていること
  → 今回は Qt 6.4.3 をインストールしました。
- QtWebEngine ベースのヘルプ ビューアー用の Qt WebEngine モジュール
  → よく分からないのでとりあえず飛ばす
- Visual Studio 2019 以降 または MinGW with GCC 11.2 以降 
  → インストール済みの Visual Studio 2019 を使用
- Python 3.8 以降 (オプション、Python 対応デバッグヘルパーに必要)
  → インストール済みの Python3.9.8 を使用(?)(ビルドには必要なさそう)
- Windows 用デバッグ ツール (オプション、CDB を使用した MSVC デバッグ サポート用)
  → これはVisualStudioインストールされていれば入ってると思うので気にせず進める
- Qt Creator ソースコード
  → これが無いと始まらない。下記からGitでcloneして入手。
    https://github.com/qt-creator/qt-creator.git
- Qt Creator 14.0.2 をインストール
  → Qt Creator 自身のプロジェクトを開いてビルドするための Qt Creator。下記から入手。
    https://download.qt.io/official_releases/qtcreator/14.0/14.0.2/
    → qt-creator-opensource-windows-x86_64-14.0.2.exe
    (個人的な事情からQt統合インストーラーからではなく個別にインストールしました)
    
### ビルド実行

Readmeには直接書かれてないけど、Qt Creator のビルドなんだから当然 Qt Creator でビルドできるっしょ。
ということで、Qt Creator 14.0.2 で qtcreator.qbs を開きます。
ここで、選択するキットは下記のようにしました。

<img width="300" alt="QtCreator_kit_mark.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317085/22606201-9245-217d-a4da-706d1ce7cffe.png">

#### ポイント(赤枠の部分)
- コンパイラには MSVC 16.11.xxx (amd64) を設定。(CもC++も同じ)
  (amd64となってますが、64bit CPU であれば、インテルでもAMDでもamd64です)
- デバッガは x64 の CDB を設定
- Qt バージョンは Qt 6.4.3 MSVC2019 64bit を設定(自動認識)
- CMake Tool は、C:\Qt\6.4.3\Tools\CMake_64\bin\cmake.exe 
   (Qt6.4.3のインストールフォルダにあるもの) を設定

qtcreator.qbs を開いたら、「プロジェクト」の 「Qt Creator」がアクティブになってることを確認してビルド実行します。

※途中、私の環境だと下記の箇所( formattexteditor.cpp の 358行目、366行目)でビルドエラーが発生したのでとりあえずコメントアウトして進めました。
<img width="300" alt="formattexteditor_FixBuilderror.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317085/b6254d3e-8816-96f7-7a6f-cea3aafadafb.png">

※参考までに、ビルド時間は私の環境で25分くらいでした。
  ( CPUは Core i7 10700 @ 2.90GHz(8コア16スレッド) です )

デバッグビルドもリリースビルドも実施して、それぞれ Qt Creator から実行できることを確認しました。

以上になります。これが誰かの何かの役に立てばうれしいです。
もし間違いなどあれば指摘いただければ幸いです。
Rustで変数に束縛されてない値は生成後すぐに破棄される

Rustで、変数に束縛されてない宙ぶらりんな値がメモリから解放されるタイミングがいつなのかなーって気になった。
↓みたいなやつ。

```rust
fn f() {
    vec![1, 2];  // こいつの解放タイミングが知りたい

    ()
}
```

解放時はdropが走るので、適当な構造体にdrop生やして試してみた。

```rust
struct Foo(&'static str);

impl Drop for Foo {
    fn drop(&mut self) {
        println!("dropped ({})", self.0);
    }
}

fn f() {
  println!("start");
  
  Foo("宙ぶらりん");
  
  println!("middle");
  
  let foo = Foo("変数束縛");
  
  println!("end");
}
```

実行結果はこうなりました。

```shell
start
dropped (宙ぶらりん)
middle
end
dropped (変数束縛)
```

[PlayGround](https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=8acaf5f6b8b8eac8a1fa2f57db3249a8)


宙ぶらりんな値の場合、生成はされるものの次の行では既に破棄されているらしい。
効率的ですね。
疑問が解けてスッキリしました。
Claude DesktopでMCPサーバーエラーへの対処（Windows環境）

# はじめに
Keitoさんの動画を見ながら、Claude DesktopでMCPデビューを目指しましたが、私のWindows環境だと「Could not attach to MCP server」というエラーに遭遇。その解消方法を紹介します。

<iframe width="560" height="315" src="https://www.youtube.com/embed/eHrp9hKZed8?si=Ktp2G2C6sOebBVyU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# 困った個所
・Claude desktopの`settings`の`Developer`の個所にはbrave-searchが出てくる
・でもチャットで使えないし、トンカチマークみたいな`2 MCP tools available`が出てこない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3716284/ff0e5104-0e0f-9c0c-79b4-c3c1c1bbbb06.png)


# 原因
・私の環境の`Node.js`のバージョンが`v20.16.0`で、指定よりも高かった
```js
  "devDependencies": {
    "@types/node": "^20.10.0"
```
https://github.com/modelcontextprotocol/servers/blob/main/src/brave-search/package.json

# 解決策
・`Node.js`のバージョンを下げるために必要な`nvm`をインストール

https://learn.microsoft.com/en-us/windows/dev-environment/javascript/nodejs-on-windows

https://github.com/coreybutler/nvm-windows/releases

・`Node.js`のバージョンを`v20.10.0`でダウンロード
```js
nvm install 20.10.0
```
・`claude_desktop_config`のJSONファイルを以下のように修正
```js
{
  "mcpServers": {
    "brave-search": {
      "command": "node",
      "args": [
        "C:\\Users\\[ユーザー名]\\AppData\\Roaming\\npm\\node_modules\\@modelcontextprotocol\\server-brave-search\\dist\\index.js"
      ],
      "env": {
        "BRAVE_API_KEY": "取得したAPIキーを入れる"
      }
    }
  }
}
```

・Claude desktopを再起動して実行する

# おわりに
Dockerを使って、コンテナ環境にMCPサーバを構築するスマートな方法も模索したいです。
メソッドを呼び出す順番

# メソッド名が同じだと特定の順番で呼び出す
```rb
irb(main):001* module A
irb(main):002*   def to_s
irb(main):003*     "<A> #{super}"
irb(main):004*   end
irb(main):005> end
=> :to_s
irb(main):006* module B
irb(main):007*   def to_s
irb(main):008*     "<B> #{super}"
irb(main):009*   end
irb(main):010> end
=> :to_s
irb(main):011* class Product
irb(main):012*   def to_s
irb(main):013*     "<Product> #{super}"
irb(main):014*   end
irb(main):015> end
=> :to_s
irb(main):016* class DVD < Product
irb(main):017*   include A
irb(main):018*   include B
irb(main):019*
irb(main):020*   def to_s
irb(main):021*     "<DVD> #{super}"
irb(main):022*   end
irb(main):023> end
=> :to_s
irb(main):024> dvd = DVD.new
=> #<DVD:0x0000000107c1bc10>
irb(main):025> dvd.to_s
=> "<DVD> <B> <A> <Product> #<DVD:0x0000000107c1bc10>"
```
# 呼び出す順番を出力
>ancestors -> [Class, Module]
クラス、モジュールの`スーパークラスとインクルードしているモジュールを優先順位順に配列に格納`して返します。

https://docs.ruby-lang.org/ja/latest/method/Module/i/ancestors.html#:~:text=ancestors%20%2D%3E%20%5BClass%2C%20Module,%E3%81%A6%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

```rb
irb(main):026> DVD.ancestors
=> [DVD, B, A, Product, Object, PP::ObjectMixin, Kernel, BasicObject]
```
# 下から上にBasicObjectまで探しても見つからないとエラーを起こす
>最後のBasicObjectクラスでもメソッドが見つからなければNoMethodErrorが発生します
```rb
irb(main):027> dvd.foo
(irb):27:in `<main>': undefined method `foo' for #<DVD:0x0000000107c1bc10> (NoMethodError)
```
https://gihyo.jp/book/2017/978-4-7741-9397-7
Astro を利用して個人ブログを作成する方法


この記事は、[はじめてのアドベントカレンダー](https://qiita.com/advent-calendar/2024/first-time) 5 日目の記事です

初めてアドベントカレンダーに参加したので少し緊張していますが、自分が描ける範囲で記事を書いていきたいと思います

## はじめに

数日前に Astro を利用して個人ブログを作成したのですがその際の体験がとても良かったので、Astro を利用して個人ブログを作成する方法を紹介します

## Astro とは

Astro は、静的サイトジェネレーターの一つで、コンテンツを高速かつ効率的に配信するために設計されています  
Astro は、JavaScript フレームワークやライブラリ（React、Vue、Svelte など）と統合できる柔軟性を持ち、開発者が好みのツールを使用してコンポーネントを作成できます

### 特徴

- **パフォーマンス**: Astro は、必要な部分だけをクライアントに配信するため、ページの読み込み速度が非常に速いです
- **柔軟性**: React、Vue、Svelte など、さまざまなフレームワークと統合することができます
- **拡張性**: プラグインやテーマを利用して、機能を簡単に拡張できます

## Astro をセットアップする

Astro を利用して個人ブログを作成するためには、まず Astro をセットアップする必要があります  
次のコマンドを実行して、Astro プロジェクトを作成します

```shell
npm create astro@latest -- --template blog
```

質問に従ってプロジェクトを作成し、次のコマンドを実行して開発サーバーを起動します

```shell
npm run dev
```

ブラウザで `http://localhost:4321` にアクセスすると、Astro のデフォルトのブログテンプレートが表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480180/bca8016c-cb0b-a8c8-3345-e842b11018e8.png)

## ブログ記事を追加する

Astro のデフォルトのブログテンプレートには、`src/content/blog` ディレクトリが含まれており、このディレクトリにブログ記事を追加することができます

`src/content/blog` ディレクトリに、新しい Markdown ファイル（例: `hello.md`）を作成し、記事の内容を記述します

```markdown
---
title: "Hello Astro!"
description: "This is the first Astro article I've created!"
pubDate: "Dec 05 2024"
heroImage: "/blog-placeholder-5.jpg"
---

Hello, Astro! This is the first Astro article I've created!
```

このように、`title`、`description`、`pubDate`、`heroImage` などのフロントマターを設定し、記事の内容を記述します

ブラウザで `http://localhost:4321/blog/hello` にアクセスすると、新しいブログ記事が表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480180/b2a7cb6e-52f6-4d3f-11d8-b2baf71f6ddf.png)

## ソーシャルメディアの埋め込み

Astro では、ソーシャルメディアの埋め込みも簡単に行うことができます
コマンドを利用して次のパッケージをインストールします

```shell
npm i astro-embed
```

先ほど作成した `hello.md` の名前を `hello.mdx` に変更し、次のようにソーシャルメディアの埋め込みを追加します

```markdown
---
title: "Hello Astro!"
description: "This is the first Astro article I've created!"
pubDate: "Dec 05 2024"
heroImage: "/blog-placeholder-5.jpg"
---

<!-- Omit code as it will be off the screen. -->

import { BlueskyPost } from 'astro-embed';

<BlueskyPost id='https://bsky.app/profile/mk.gg/post/3la4wqeyztm2u' />
```

このように、`astro-embed` パッケージをインポートし、`<BlueskyPost id='' />` のように埋め込みたいソーシャルメディアのコンポーネントを追加します

ブラウザで `http://localhost:4321/blog/hello` にアクセスすると、ソーシャルメディアの埋め込みが表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480180/9948669c-7b12-7a99-be91-aab0b689c5cc.png)

## まとめ

Astro を利用して個人ブログを作成する方法を紹介しました
Astro は、パフォーマンスが高く、柔軟性があり、拡張性があるため、個人ブログを作成するのに最適なツールです
ぜひ、Astro を利用して個人ブログを作成してみてください！
[Rails] ディレクトリ構造

# ディレクトリ構造

Railsのディレクトリ構造に迷いそうだったので、自分なりにまとめました。

```console
- .github: GitHubワークフロー(自動アクション)
- app: アプリケーションの主要なコード
    - assets: JavaScript, CSS, 画像などの静的なアセット
    - controllers: [C] コントローラー #
    - helpers: ビューで使えるヘルパー
    - jobs: Active Job(バックグラウンドで実行するジョブ)
    - mailers: Action Mailer(アプリからのメール送信)
    - models: [M] モデル #
    - views: [V] ビュー #
- bin: railsコマンドなどのスクリプト
- config: アプリケーションの設定ファイル
    - environments: 環境(development, production, test)ごとの設定ファイル
    - initializers: 初期化設定ファイル
    - locales: ロケールファイル
    - routes.rb: ルーティングの設定ファイル #
- db: データベース関連
    - migrate: マイグレーションファイル [time_stamps_XXX.rb] #
    - schema.rb: データベーススキーマ(データベース構造の設計図)
    - seeds.rb: データベースにサンプルデータを作る
- lib: ライブラリ用
- log: 過去のサーバーを起動した時のログが見れる
- public: 404エラーやメンテナンスページなど、コントローラーを作るまでもない静的なページなどを置いておける
- storage: ローカル環境にてActive Storageでアップロードしたファイルを格納する場所
- test: Rails標準のMinitestのテストコードを保存
- tmp: 一時ファイル(キャッシュなど)
- vendor: 外部のライブラリやプラグインを保存
- config.ru: Rackサーバー(Pumaなどの、RubyアプリとWebサーバーの仲介役)の設定ファイル
- Gemfile: インストールするGemのリスト #
- Gemfile.lock: Gemのバージョンが記録される
- README.md: プロジェクトの説明文書
- Rakefile: RakeはRuby版のMake。プロジェクトのタスク(処理のひとまとめ)を設定できる
```

# 探す時のポイント

- MVCはすべてappディレクトリ下にある
- ルーティング設定ファイルはconfigディレクトリ下のroutes.rbである
- マイグレーションファイルは、データベース関連なのでdbディレクトリ下にある
- Gemfileはプロジェクトディレクトリ直下にある

# 気付いたこと

- 初期に生成されるディレクトリは、Railsのデフォルトのフレームワークや機能をもとにしたものが多い
- 何気なく使っているrailsコマンドはbin(バイナリ)ディレクトリ下に定義されているため、`bin/rails`と書いてもrailsコマンドが実行できる

# 参考

https://railsdoc.com/rails_base
Singletonモジュール

# 唯一のインスタンスを生成する
```rb
irb(main):001> require 'singleton'
=> false
irb(main):002* class Configuration
irb(main):003*   include Singleton
irb(main):004*
irb(main):005*   attr_accessor :base_url, :debug_mode
irb(main):006*
irb(main):007*   def initialize
irb(main):008*     @base_url = ''
irb(main):009*     @debug_mode = false
irb(main):010*   end
irb(main):011> end
=> :initialize
irb(main):012> config = Configuration.new
(irb):12:in <main>': private method `new' called for Configuration:Class (NoMethodError)

irb(main):013> config = Configuration.instance
=> #<Configuration:0x00000001139f3850 @base_url="", @debug_mode=false>
irb(main):014> config.base_url = 'http://example.com'
=> "http://example.com"
irb(main):015> config.debug_mode = true
=> true
irb(main):016> other = Configuration.instance
=> #<Configuration:0x00000001139f3850 @base_url="http://example.com", @debug_mode=true>
irb(main):017> other.base_url
=> "http://example.com"
irb(main):018> other.debug_mode
=> true
irb(main):019> config.object_id
=> 353960
irb(main):020> other.object_id
=> 353960
irb(main):021> config.equal?(other)
=> true
```
https://gihyo.jp/book/2017/978-4-7741-9397-7

# instance
>そのクラスの唯一のインスタンスを返します。最初に呼ばれたときはそのインスタンスを生成します。
>
>Singleton を include したクラスで定義されますので、正確には Singleton モジュールのメソッドではありません。

https://docs.ruby-lang.org/ja/latest/class/Singleton.html#S_INSTANCE:~:text=%E3%81%9D%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE,%E3%81%A7%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82

# 感想
config,otherも同一のインスタンスになっている
CI/CD入門 #1

# はじめに

Webアプリ開発・運用のチームに配属されてから本格的に業務が始まった時の出来事。開発の依頼をもらいそのままコーディングしプルリクエストを作りコードレビューを貰った。ここまでは自分の想定していた通り。だが、マージ承認をもらってからのCI/CDツールを利用した自動ビルド・デプロイをおこなうのは初めてだった。なんとなくCI/CDという言葉は聞いたことがあったが、今まで個人や短期間でのハッカソンでメインに開発していた自分にとっては全く知らない存在であった。ひとまず手順を覚えミスを防げるように意識する日々だったので、早くCI/CDを深く理解して業務に落とさねばと感じ、記事執筆の中で理解を深めていこうと思ったのでシリーズ化して書いてみることにした。

また、入社した後に自社のインターン生がおこなうフルスタック開発のハッカソンにて、GitHubのCI/CDを利用して開発プロセスの最適化を図っているチームを見かけとても印象に残った。「短期間での小さな開発でそこまでやる必要あるか？」みたいな意見は一旦さておき、学生時代からCICDを理解し実践すること自体は、新卒エンジニア就活での技術チェックにおいて一定評価は高くされそうだなと思ったので、全く扱ったことがない人でも理解できるように噛み砕いて書いてみる。

# CI/CDとは？
### CI (Continuous Integration)とCD(Continuous Delivery)
直訳すると『継続的インテグレーション』と『継続的デリバリー』
「は？」って感じなのですが、、、（すみません英弱で🙇）

CICDとは一言でまとめると、変更をマージしてからリリースするまでのプロセスを自動化してくれるもの。（その『プロセス』で何をやるか・やっているかを知るとグッと理解しやすくなると思います。）実際にマージしてからリリースまでやることは、主にビルド・テスト・デプロイ。ここをツールを利用して自動化している。手動ではなく自動でやってくれることにとてもメリットがあると学生時代の開発経験を振り返った時に自分は感じた。

切り分けたコンポーネントをそれぞれ少しずつ修正を加え、ローカルでも正しく動作していることを確認してからmainブランチにマージしたものの、別の機能が正常に動作しなくなっていたことがあった（いわゆるデグったってやつ）。その時はすぐに修正して変更を反映したり、疲れた時は休憩したりそのまま寝て次の日に作業するという行動をとっていましたが、24時間365日お客様に提供しているプロダクトでは流石にできないと察しました。特に本番環境での不具合が続けば続くほど、そのプロダクトが生み出していた売り上げは確実に落ちる。ECサイトなどで起こると最悪。ゾッとする。
しかも、かなり小さい規模での開発でデグることにも気づけないのだから複数人での大規模プロダクトでの開発では到底気づけるわけがない。

社会人エンジニアにとっては至極当たり前な事だと思うが、サービス運用経験がない駆け出しプログラマーにとっては知る場所がない気がする。
本番環境での動作不具合の時間が少しでも長ければ長いほどそのプロダクトが生み出す売り上げは落ちることは知っておくでき（エンジニア学生向けの伝言）
その他にも、プロダクトを利用してくれているユーザーが離れる、ネットでニュースなどにもなれば会社の社会的信頼も損なわれる、不具合を修正するためにプロジェクトに関わっている全ての人が奔走し追加のお仕事が降りてくること間違いなし。
上げればキリがない。つまりこの過程を自動化することは重要というかむしろお客様がいる時点で絶対に必要なことである。

改めて、以下にCI/CDのメリットを簡潔に記す

- メリット
    - バグの検出が早くなる
    - ヒューマンエラーが削減される
    - リリースサイクルが統一されてることで複数人での運用が容易くなる

# 最後に

なんとなく知ったまでで伴っているので、今後実践してみる。様々なCI/CDツールが存在しているが、個人的にGitHubを利用したCI/CDに興味あるので、これからはそちらを中心にキャッチアップして理解を深めてみる。
【初心者の覚書】シェルとシェルスクリプトが店員と手紙くらい違った件について

業務で、たまたまjavaで作られた古のツールに関わる機会があり、「Shellってわかる？」と質問された。
「ターミナルとかで使うコマンド的なアレですよね。。？」とどぎまぎ答えたところ、「まぁ、そんな感じ。」と言われた。
理解力がなさそうな自分に諦めて詳しく話してくれなかったのか。本当にshell==ターミナルのコマンド、ということなのだろうか。
（結論：shellはターミナルのコマンド、ではなかった...!!!）

![shell.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/2abd305a-48e2-e3c7-c5d4-7494985b9119.jpeg)


# ShellとShellScriptの違い
「java」と「JavaScript」は「パンとパンダくらい違う」(諸説あり)と認識していたが、ShellとShellScriptについては「カタツムリとナメクジ」的な違いしかないと思っていた。
がしかし。大分様相は異なっていた。

## Shellとは
> コンピュータのオペレーティングシステム(OS)を構成するソフトウェアの一つで、利用者からの操作の受け付けや、利用者への情報の提示などを担当するもの。
[「シェル 【shell】 OSシェル」、IT用語辞典](https://e-words.jp/w/%E3%82%B7%E3%82%A7%E3%83%AB.html)

「シェル」とは英語で「(貝)殻、甲羅」の意味を持つ([「shellとは」、Weblio](https://ejje.weblio.jp/content/shell))ため、何かしら閉ざされて完結したプログラムのことだと思っていたが、固く閉ざされた貝でもガソスタでもなく、OS上で機能する「ソフトウェア」とのことらしい。


## Shell Scriptとは
> OS(オペレーティングシステム)を操作するためのシェル上で実行できる簡易なプログラミング言語(スクリプト言語)。また、そのような言語によって書かれた、複数のOSコマンドや制御文などを組み合わせた簡易なプログラム。
[「シェルスクリプト 【shell script】」、IT用語辞典](https://e-words.jp/w/%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88.html)



# まとめ
一言で言うと、
Shellとは「コマンドを通してOSにお願い事をできるソフトウェア」であり、
ShellScriptとは「シェルに命令を自動実行させるファイル」である、
と認識していきたい。

![シェルについて.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/965491cb-2375-c13d-b215-a596651a0822.jpeg)


これまで自分は「Shellはコマンド集のようなもん」などとイメージしていたが、「cd」「ls」などShellコマンドが詰まってるだけではなく、主としてはそれをOSに届け、返答してくれる「ソフトウェア」だと認識を改めたい。

また、Shellについて調べる過程で「PowerShell」に遭遇し、「コマンドラインツール」であると知るも、頭がパンクしそうなので、PowerShellについては別記事で書き連ねたい。


# おまけ〜今日の植物 「ヤツデ」〜
どこかでみたことはあるけど名の知らぬ植物の名を知ることで得られるかもしれないアハ体験を提供できる可能性を感じ意味もなく添付した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/bee82075-581d-8752-c751-9ad9a5fca7c7.png)

参照：

https://lovegreen.net/library/garden-tree/evergreen/p92105/

個人的に玉ねぎの花の集合体のようで気味が悪いと感じていたこの花とすら認識していなかった花。
縁起がいいとかの理由で植え付けられていたそうな。

> ヤツデは別名、「天狗の団扇」とも言われます。天狗が持つ羽団扇は疫病を追い払い、魔除けになるという迷信から、形が似ているヤツデは庭に植えられる事が増えたそうです。
また、
江戸時代から、近隣の家が火事になった時に「貰い火」をして広がるのを防ぐために、我が家を守る手段としてヤツデのような常緑樹を植えていたそうです。
[「ヤツデ」、公益社団法人 日本薬学会](https://www.pharm.or.jp/flowers/post_43.html)

どうりで見かけると思ったら実利にかなっていたり、魔除け的な、鬼除けのヒイラギ感覚でも植えられてたのですね。

以上今日の植物でした。