OmniAICreator/Qiita-1.07M huggingface dataset:
ネスペ勉強法【学生未経験一発合格】

##  始めに
情報系専門学生のせぼんぬです
2024年にネットワークスペシャリスト試験で合格したため、その勉強法を記載します
筆者はネットワークの知識がほとんどない状態(もちろん実務経験も皆無)で受験＆頭も悪いため、参考になるかと思い書き始めました
この記事では午後問題を中心に書いてます
勉強期間は３か月で、長期休みも使いました



## 筆者スペック
情報系専門学生
応用情報:2回落ちてる 現在は取得済み
情報処理安全確保支援士:１回落ちてる 現在は取得済み
ネットワーク周りほぼ構ったことない
ネットワークの知識は応用情報レベル
頭悪い



## 使用した参考書・サイト・グッズ

- ### インプット用の参考書
なんでもいい
私は下の参考書を使いましたが、可もなく不可もなくって感じ

![ipad分割表示の写真](https://encrypted-tbn2.gstatic.com/shopping?q=tbn:ANd9GcQsnkJTvjk04ilM_BxAA4rrvPsOyuiS6HbD2GXbanMCBZv0fcE5AiShMvYUypTx9JAdpGpXgOzA5G6wWLkoeMW9JDXrKnTk)

<br>

- ###  ネスペシリーズ
みんな大好きネスぺシリーズ
これが超絶いい
<b>特にR1は絶対購入したほうがいい</b>
R1だけなぜか単語帳がついてる
問題文の解説はあまり読まなくていいと思う
解答の解説は重点的に読む
試験一回分に対して一冊なので、いくつか買わなきゃいけないのが難点
でも買う価値はある。そのぐらいの良書

![ipad分割表示の写真](https://encrypted-tbn0.gstatic.com/shopping?q=tbn:ANd9GcSB9H6xzY0_JmFLHLiRlz0_uI0Z63_ygWPkpQ0trpP6UwbPn23Bkjh0ub9ONP7IDJ7wTBK2rVu7kPsdugDfOMjt4WDUBRny-BgjIC6UDVU)

<br>

- ### iPad
iPadでPDFの編集のアプリをダウンロードして、過去問道場からもってきた過去問のPDFに書き込みしていた
下の写真のようにiPadの分割できる機能を使って、後ろにPDF（過去問）、手前にメモ帳を重ねて表示していた（メモ帳かかないときは横にしまってた）
めっちゃ効率よくなったのでおすすめ

![ipad分割表示の写真](https://lh6.googleusercontent.com/proxy/9_Lh-W6C1gUUqOAg8gvd_Wbg4ekZq4qrUaOCvDfsv_uyhEIEH-1IusbIpkpdY-Af-3IwJwensTutZnlGsqOaUcJl_huE9t9yRLswco86C-Pj7DNmUNg)



https://apps.apple.com/jp/app/pdf-expert-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E7%B7%A8%E9%9B%86-%E4%BF%9D%E5%AD%98-%E7%BD%B2%E5%90%8D%E8%A8%98%E5%85%A5/id743974925

- ### 過去問道場
定番のサイト
午前はここを周回すればOK

https://www.nw-siken.com/nwkakomon.php


- ### SE娘の剣
ネスぺシリーズのサイト
ネスぺ頻出の技術についてわかりやすく書かれている
ここの合格体験記も参考になる

https://nw.seeeko.com/



- ### ブドウ糖
超おススメ
午後問題を勉強しているときよく頭が痛くなっていたけど、これ食べると痛くなくなる
しかも、頭が冴える
試験会場にも持って行った
一時期話題になっていた、ブドウ糖のゼリーよりコスパいいと思ってる

![ブドウ糖の写真](https://cache.ymall.jp/webcom/item/multiimage/500/9562111018_001.jpg)


## 大まかな勉強の流れ

1. 知識を入れるための本を1冊読む

本を読みながらノートにまとめる 単語帳的な 
重要そうなとこだけノートにまとめる
必要なとこはネットで知識を補充する
めんどくさい人はネスペシリーズのR1についている単語帳でいいと思う
隙間時間に午前問題を周回

<br>
2. 過去問周回

過去問8〜10年分のを2,3週隙間なく解く（隙間なくというのは、3問中2問解くのではなく、3問中3問全て解くということ）
全体的に2週して、苦手なとこだけ3週した
そして、過去の出題傾向を調べた時に直近1,2年前の問題と11年前ぐらいの問題からはあまり出ないように見えた（たぶん…うろ覚え自信ない）



# 問題の解き方
流れ

1. 問題の設問文をみて解けそうな大門を見極める
10分ぐらいでどの問題を選択するか決める

2. 問題文の概要を読む
さらっとだいたいでいい
システムの概要をつかむ

3. 設問を解く
設問文にでてきたキーワードを頼りに本文をみる





## 解答の検討がつかないとき
ネスペの問題は
<b>「可用性」「負荷分散」「セキュリティ」</b>
を中心に出ていると思うので、解答の見当がつかないときは、その三つの要素のどれかに当てはまらないか考えると閃くことがある


## まとめ
合格したのが前なのもあって記憶があいまいな部分もあります
間違ってたこと言ってたらすみません！ｓ
誰かの役に立てたらうれしいです！皆さんの頑張りが報われますように
TeamIDとAppID prefixが同一でないiOSプロジェクトはビルド地獄になる

# TL,DRまたは概要
App ID PrefixをTeamIDと同一にしてくれるようにAppleの担当者に問い合わせして変えてもらってください。

そのおかげで救われる時間があります。
ここから問い合わせして１週間くらいです。  
https://developer.apple.com/contact/topic/select 


# AppID prefixがTeamIDと同一でないプロジェクトって何？
Apple開発者登録が太古の昔に行われている会社、または開発者においてたまに発生します。

つまり「歴史あるプロジェクトや会社の仕事」をやってると起きることがあります。
(新しい開発者や組織では、このような変なmobileprovisionファイルを作ることはできない、はず…)

## どうやって見分けるの？
例えば手元にある YourCoolApp.mobileprovision というファイルに対してjsonで中身を出力してみます。

```
security cms -D -i YourCoolApp.mobileprovision > provision.json
```

`<key>ApplicationIdentifierPrefix</key>`のあたりにある10文字前後の文字列と、`<key>TeamIdentifier</key>` のあたりにある10文字前後の文字列が**同一ならこの記事を読む必要はありません。やったー！**

そうでない不幸な方は続きをどうぞ…

# 具体的な症状
## Xcode15以降でビルドしようとしても通らない
https://forums.developer.apple.com/forums/thread/745544
Appleの人いわく「その2個が別の文字列なのはおすすめしないから統合したら？」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40627/20f71961-41e1-3cf6-a03b-7246522388ca.png)

どうやら最近のXcodeは暗黙のうちに2個の文字列が同一であるとみなした挙動になっているようです。


## Firebase Cloud MessagingとDynamic Linksの片方しか動かなくなる

iOSアプリをFirebaseに追加する際にApp ID PrefixがTeam IDと一致していないと詰む
https://zenn.dev/colomney/scraps/a4fde5cbab13b8

(まあ、Firebase Dynamic Links自体がサービス終了予定なので気にしなくて良いかもです。しかしこういう妙なハマりポイントが残っているので他のサービスでも苦労する可能性があり、嫌です)
【文系新卒でもなんとかなるかも】応用情報合格体験記【3ヶ月】

## はじめに
応用情報初受験で合格したのでその勉強法などを残しておきたいと思います。
合格したと言っても午前も午後もギリギリだったので、最小の努力で合格したい人向けかもしれません。

## 経歴
国公立大の理系院卒です。学生時代は建築系だったのでITには無関係でした。なぜか現在は某SIerにいます。新卒です。

## 本記事の対象者
・文系卒の方
・未経験の方で応用情報取ってみようと思う方
・とりあえず合格が欲しい方
・基本情報を取ってる方
となります。未経験で基本情報取ってない方はおそらくこの記事には合わないと思われます。まずは基本情報取ろう！(そしてそっちの方が効率いい)

## 応用情報を受ける前に
　試験には申し込みましたか？自分も含め、なんらかのリスクがないと人は動き出せないもんです。一番効果があるのは「金」だと思うので、「申し込んじゃったからまあやるか」の状態を作るためにも申し込みましょう。
　また、対象者に欄にも書きましたが、応用情報は基本情報を取った直後が最も受かりやすいです。理由は単純に午前試験が基本情報を軽くパワーアップした物だからです。基本情報取った直後なら応用情報の午前は5割いけます。いけなかったら何回か過去問やってみましょう。勘が戻ってくるはず。

## 午前対策
　基本情報を取ったあなた！多分すでに5割程度は取れることでしょう。
じゃあ残り1割を短期間でマスターするために何をするかを解説していきます
### 1. 必要な参考書
　過去問道場とスマホアプリの過去問集だけあればいいです。
「参考書も欲しいよ！」という方へ
本屋に行って、書いてあることが理解できるものを選びましょう。アルゴリズムで躓くことが多いので、アルゴリズムのページがわかりやすいといいです。

### 2. 現在位置を知る
　過去問道場を2回分解いてどのジャンルでどの程度取れるか調べてみましょう。
「案外いける」「何これ知らない」いろんな感想が出ると思います。個人的にこの感情大事だと思うので試験日まで忘れずに
### 3. 弱点を埋める
　過去問を解いて弱点がわかったら、それを潰しましょう。アプリや過去問道場なんでもいいです。午前試験においては、得意を伸ばすより弱点を潰した方が楽です。
### 4. 過去問を通しで解く
　最後に過去問を通しで解いてみましょう。通しで解く理由は以下の通り
・ジャンルごとに出題される問題数が違う
・80問解く集中力を付ける
などです。応用情報は長丁場なので集中力を伸ばす訓練はしておいた方がいいです。我々には高校3年のような受験体力はないのだから。

## 午後対策
　未経験新卒にとってここが難関です。巷の合格体験記には「仕事で経験したものを中心に選びましょう」と書かれているものが多いです。羨ましいですね。そんなものがない我々はどうすればいいのか、書いていきます。
### 1. 参考書
　参考書を買いましょう。お勧めは、重点学習系のやつか、国語系に振り切っているやつです。しかし、後者はかなりリスキーな選択となるため、先に過去問同情を解いて適性があるかを判断しましょう。また、電子で買うにしても一度書店で見てみるのをお勧めします。
### 2. ジャンル選択
　さあ、ジャンル選択です。ここの選択で試験の結果画左右されます。専門知識が無い中でも、選択しやすい、解くべき候補に入れてもいいジャンルを紹介します。
### ・セキュリティ
　唯一の必須問題です。個人的には午前試験の対策を十分にすることが正答率を安定させる近道だと感じます。
### ・経営戦略
　国語系その1。簡単な回ととんでもなく難しい回があります。読解力が求められるので、時間が許す限り問題文からヒントを探しましょう。
### ・データベース
　応用情報の選択問題では珍しく、回ごとの難易度の差が少ないジャンルです。午後に余力を割けるのであれば、ぜひトライしてみましょう。
### ・プロジェクトマネジメント
　国語系その2。長文読解＋本文の抜き出しでほとんど解けます。計算問題も午前試験を対策していれば難なく突破することができるでしょう。非常にお勧め
### ・サービスマネジメント
　国語系その3。お勧めの理由はプロジェクトマネジメントと同じです。
### ・システム監査
　国語系その4。倫理観があればある程度は取れます。国語系なので読解力が求められるジャンルといえます。

### ジャンルに関して言えること
　我々のような専門知識や経験がない中、最短で合格するにはこれくらい振り切った選択をすることが大事です。むしろ専門知識がなくてもなんとか戦える道があることに感謝しましょう。
　10月受験だと業務でネットワークやってる、みたいな例もあると思うので、その場合はネットワークを選択してもいいかもしれませんね。
 　友人は1ヶ月みっちりネットワークの研修を受け、午後のネットワークが解けるようになったと言ってました。同じ研修を受けていた自分はちんぷんかんぷんでした。なんでですかね。

### 3.過去問を解こう
　午前の時と同じですが、最低一回は時間を測って解いて見ましょう。本番では、午前も頑張った後で午後150分なので、慣れていないと本当に集中力がなくなります。今回お勧めジャンルが国語で埋め尽くされているので、集中力の持続がかなり大事になってきます。慣れましょう。

## 最後に
　応用情報はやり方と戦略さえ間違えなければ、合格はそこまで難しくないと思っています。友達と教え合うのもよし、苦手なジャンルは避けるのもよし、アプリで隙間時間を活用するのもよしです。本番は長丁場だということを忘れずに、体調管理もしっかりして臨みましょう。頑張ってください。
MasterPage is 何？

# 使用環境
Visual Stdio 2022
.Net Freamework 4.8

# 今北産業でわかるMasterPage
1ページを親と子に分解したときの親要素。
複数ページでもおんなじ要素を表示したい！ってときに利用。
ページのイベント処理順序が少しだけ面倒かな。

# どんなところで使うの？MasterPage
単一のページを作るとしたら、Master.Pageは使わないほうがいいです。
MasterPageを使用するシーンとしては、別ページだけど同様の要素を出力したいときが考えられます。
例えば個人サイトであったら、自身のホームページの名前はずっと表示し続けたいですよね。
![スクリーンショット 2025-01-25 151424.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740962/d953c5e3-520a-193e-25ad-515bfbfaad84.png)
単純に考えると、すべてに自身のホームページの名称を書くことは改修する際に改修忘れを生む要因となります。
10ページに自身のホームページの名前を書いた場合、ホームページの名前を変更する際には10ページすべてを変更しなければいけません。
そこで利用するのが、MasterPageです。

# どうやって作るの？MasterPage
Visual Stduoのプロジェクトから[新しい項目の追加]->[Web Formsのマスターページ]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740962/d87247c6-1aa3-4ccb-c725-8e06dffa708f.png)

すると、このようにMasterPageが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740962/bc83ed1d-cfc3-b7e9-4dad-b14b9c36b2bd.png)

たったこれだけなんですよね。

# どこがどうなの？MasterPage
先ほどの画像を少しだけ拡大しました。
全行を解説すると、行数が足りなく既存のHTMLの技術もあるので省略。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740962/0b21682d-531d-4b26-0455-8655ed17f6dc.png)
ここからMasterPageについて詳細にみていきましょう。

1行目に記載されている要素はMasterPege自体の宣言部分です。
・言語(Language)はC#で記載する。
・AutoEventWireupはページの初期化や更新時に実行されます。
・CodeBihindは実行するプログラムファイルのパスを記載する。
・InheritsはCodeBihindを利用する際のPageクラスの派生クラスを記載する。
>引用 
>https://atmarkit.itmedia.co.jp/ait/articles/0207/23/news001.html

9,10,15,16行目に記載されているのが、子ページで記載するスペースを確保しています。
```WebSite.Master
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server" />
```
この記載はMasterPageに一つだけ存在しなければいけないということはなく、複数記載することができます。

# 実際に使ってみたよ！MasterPage
Visual Stduoのプロジェクトから[新しい項目の追加]->[マスターページを含むWebフォーム]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740962/516e3a9d-7b58-a44c-8641-7e72c774e582.png)
すると、以下のウィンドウが続けて表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740962/0ea5e6e0-28d3-9caf-4793-470c201d0e4a.png)
ここで適用するMasterPageを選択し、「OK」を押下します。

以下のファイルが作成できました。これで先ほど作成したMasterPegeを親とした子ページが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740962/4322d8a1-926c-92f9-539f-468ddac89186.png)

あとは、
```WebForm.aspx
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
（好きな要素を記載）
</asp:Content>
```
asp:Contentタグ内に子ページで表示したい内容を記載するだけです。

今回はここまで。
Roo Codeで仕様書を書き起こし、Cursor Composer(Yolo)で構築する

[[AI個人開発] Cursorで自動化レバレッジを最大化するためにしたこと10](https://qiita.com/tettuan/items/3d27c01ed7cc414db8f2)と、[Cursor Composer メインでも、Claude 3.5 SonnetならAI開発自動化が進む](https://qiita.com/tettuan/items/2972cb054408c0c38014)話の続きです。

日々進歩しているので、このやり方が通用する時期は短いと思います。
ただし、基本的な考え方は今後ツールが変わっても有効だと考えています。

なお、Cursor月額 $20 に収めなくても構わない方は、API叩きまくるRooへ寄せても良いと思います。

# メインをCursorに置く
Yoloモードは、Roo Codeに比べると処理出来る範囲が限られています。
Computer use がコマンドライン前提になっているためです。

一方、それはそれで安心感があって、触る範囲に予測が付くメリットにも繋がります。

AI開発への期待は完全自動化ですが、実際は内部的にコードを書くわけなので、うまくコードベースに反映することを中心に考えます。

そうすると、Cursorが月額$20で（Slowを許容しながら）Claude-3.5-sonnetを使える点で優位になります。最近DeepSeekが良いらしいため、API叩く上では追加検証してくことになりますが、月額固定である良さはCursorにあります。

# Roo Codeに行ってもらうこと
最近Geminiの無料開放枠が大きくなったこと、従量で比べても安いことから、Rooから使う際にはGeminiを選択します。
ここでClaude精度を求めてはいけません。

では、どういった点でRooの良さを引き出すか？

1. 全てを網羅的に自動で完成させる
1. 持っているコンテキスト量が増えても処理ができる

この2点を活かすために、仕様書作成やQA観点のチェック作業をRooへ寄せます。

`Roo → Cursor → Roo` という流れです。

# Rooに任せる範囲
## Roo が用いるモデルとバージョン
Roo のAPIにGemeniを設定します。バージョンは好きなもので良いと思いますが、制約の小さい(tokenサイズの大きい、コール上限数が大きい)モデルが良いと思います。

直近では `gemini-2.0-flash-thinking-exp-01-21` が開放されています。


## 設定
Rooにはシステムプロンプトを複数渡せます。これらは共通して、役割に必要な情報を持たせるように考えられています。

私は、アプリケーションの意図から仕様を検討する役割と、アプリケーションの意図を踏まえて品質をチェックする役割の２つを設定しています。

## 指示
Rooには、出来る限り細かな指示を渡しません。
Cursorに細かく渡しているため、それ以外の作業を自動化するためにも、できる限り人間が行う作業を減らしたいです。

必要な制約（障る範囲、触ってはならない範囲）はシステムプロンプトへ入れておきます。
使って欲しい観点は、役割として定義しておきます。

そのうえで、指示は抽象度の高いものを入れます。ただし、スコープが絞られないと無限に広がってしまうため、

> 最近2週間以内に追加されたコードを洗い出してください。それらを1つずつスコープを定めて検証し、ミッションをクリアしてください。
あなたの役割は、テスト対象の漏れや、コード修正が必要な課題を洗い出して、直したり整理することです。
システムプロンプトの指示に従って作業しなさい。


のようにします。システムプロンプトが無視される場合は、重要なプロンプトを繋いだ状態にしてから、指示すると良いでしょう。

仕様を決めていくときは、

> 今回は、仕様決めがゴールです。実装は不要です。
アプリケーションの課題は、**情報は一覧表示があるものの、edinetの一覧表示はないことです。
また、別々に閲覧するのは不便であるため、**とedinetが混在した一覧作成を行うことが望まれています。
> 
> そこでまず、**を表示している箇所を洗い出してください。
そのうえで、以下の要求から必要な仕様を考えて整理し、最善と考える仕様を決定してください。
> - ヘッダのリンク「**」情報を表示している方法と同じような、一覧表示を新設したいです。
> - 一覧は「開示」というリンクにします。内容は**とedinetを混在した一覧にします。
> - ** のリンク先は、既存の ** と同様にします。edinetのリンク先は、stock showに存在するリンクと同じにします。
> 
> あなたの役割は、既存システムやドキュメントを読み解いて、仕様を考え、仕様を決めて記載することです。
> 考えた仕様は、****** へまとめなさい。
> 
> 検討プロセス自体はタスク管理し、ステータスを更新しながら進めなさい、



これで自走します。

## 成果

詳しくは書きませんが、成果の測り方や保存の仕方には工夫が必要です。
ドキュメント作成をゴールにする場合は、ドキュメントの出力場所や形式、ボリュームを決めていく必要があります。

また、Cursorへ引き継ぐために、目的や背景を記載させることも重要になります。

フロント側であれば設計効率や速度とUI/UXを、バックエンドであれば堅牢性・セキュリティ・冪等性を重視するなど、いくつか異なる観点を交えてRooに作業させつつ、Cursorへ渡すときには絞り込まれた状態にしておく必要があります。

いずれにしても、自走するRooにはカバー範囲の広い上流を、狭い範囲でパフォーマンスを発揮するCursor Composerにはコーディングを担当させるのが、今のところ有効そうに思います。

# 最後に
こうしたAI開発環境を作ることで、自らコーディングせずに済みます。
最近は、精度が上がっているため、ブランチのMergeもCursor Composer(Yolo)へ任せています。ボタンを押すプルリクは、最後のmainブランチへのマージだけです。

時々、ミスは起こります。
例えばブランチを綺麗にするためにpruneなどをさせて綺麗にします。そのときに、merge済みのブランチを削除させようと指示を同時に出すと、まだマージしていないブランチを削除したりします。 -D で強制削除することもあります。

従って、ブランチを切りながら、作業をコミットさせていくことによって、手戻りを許容する必要があります。Gitで管理できない差分のある作業は、まだ任せられません。

ただ、良いコードの積み上げを自律的に行い、人間はコーディングせずに開発できる時代になっていることを、自分自身の肌身で感じています。

もう、AIが書いたコードを念のために読むこともなくなってきています。
セキュリティの懸念、パフォーマンスの懸念なども、繰り返しRooやCursorに作業させているため、回数で品質をカバーできているように思います。
（セキュリティやバリデーションのレベルを強めすぎて、自分で書いたテストが通らずにループするケースがあるほどなので、仕様や要件の水準コントロールが、次の課題かな・・とは感じています。）
OSS-DB Silver試験勉強を始めました

# はじめに
OSS-DB Silver試験勉強を始めました。

## 試験概要
90分で約50問の問題を解く試験です。合格のためにはおおよそ2/3以上の正答率が基準です

## 試験勉強を始めたきっかけ
Oralce Gold、DB2エンジニアの資格を取得していますが、将来のため、もう一度DBを勉強しなおしたいと考えたためです。

## 合格目標
できればGWあたりを目標にしています。

# 最後に
勉強の進捗について、記事をUpしたいと思います。
Open WebUIの変な使い方メモ（コンテナ版Open WebUIで埋め込みモデルのAPIを使う）

# コンテナ版Open WebUIで埋め込みモデルのAPIを使う
…といっても2025/01/26現在、Open WebUIが提供しているOPEN AI互換APIにおいてembedding用のAPIエンドポイントは機能していない（というか多分提供されていない）。

# 回避策
現状、筆者は単一コンテナ版のOpen WebUIを利用しており、このコンテナの中にはバックエンドのLLMサーバとしてOllamaが同居し動作している。
よってembeddingを利用したい場合は、このOllamaにアクセスできるようにコンテナを修正すればよい。（別途OllamaなりvLLMなりをインストールしてもよいが、それをやるとダウンロードしたLLMモデルを共有できないので、ストレージが無駄に消費されてよろしくない）

あるいはコンテナ版Open WebUIには外部のOllamaを使うパターンも提供されているのでそちらを利用してもよい、というかそちらのほうが正攻法であろうとは思うが、それはそれでOllamaのモデルファイル格納先を別途設定したり、という構築の面倒さがある。

# 手順

まず以下のコマンドで既存のコンテナを破棄（設定データは残る）
```docker rm open-webui```

次に以下のコマンドでコンテナを再作成
```
docker run -d \
  -p 3000:8080 \
  -p 11434:11434 \
  --gpus=all \
  -v ollama:/root/.ollama \
  -v open-webui:/app/backend/data \
  --env OLLAMA_HOST=0.0.0.0 \
  --name open-webui \
  --restart always \
  ghcr.io/open-webui/open-webui:ollama
```
OllamaのAPIサーバとしてのデフォルトのポート番号は11434で、それはOpen WebUI内部のOllamaも同様。
従って上記の操作によりこのコンテナの11434ポートを開放し、ollamaのホストを0.0.0.0にすることで、コンテナ外からollamaに対してもAPIサーバとしてアクセス可能な状態にしておく。
これでopenai api互換LLMサーバ非対応だがollama apiなら対応、というアプリについても単一コンテナ版Open WebUI一つあれば動作を試せるようになる。


※OllamaのAPIを経由してembeddingモデルにテキストを送り込み、ベクトル化データを受信するテストコマンド
```
$ curl -X POST http://localhost:11434/api/embed -H "Content-Type: application/json" -d '{"model": "nomic-embed-text:latest", "input": "テストテキスト"}'
{"model":"nomic-embed-text:latest","embeddings":[[0.022953669,0.08734732,-0.17950457,・・・
```
【Android】難読化・圧縮したくないクラス、コードの選択

難読化・圧縮に関してはもう少し詳しくなってから機会があれば、記事にしようかと思います。

# 方法１
proguard-rules.proに難読化・圧縮したくないクラスを記載します。
![スクリーンショット 2025-01-26 21.30.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/60045633-1bbb-02e3-0035-9d89922e47fc.png)

```php:proguard-rules.pro
-keep class com.〜クラス名〜.** { *; }
```

# 方法２
難読化・圧縮したくないコードの上に＠Keepアノテーションを追加


# 参考・関連

https://developer.android.com/build/shrink-code?hl=ja

https://qiita.com/toroncho-good/items/cce0e660caba6a5d4191
仮想化技術とコンテナ技術の違いを初学者の視点からまとめてみた

## はじめに
仮想化技術とコンテナ技術について学ぶ機会を頂いたので、理解できたことを自分なりにまとめたいと思います。「Dockerって仮想化するやつでしょ？」程度の認識でなにもわからないままコンテナを操作していた状態から、少しでも前へ進むために学習を継続します。

## 仮想化技術
PCにおける仮想化技術とは、PC上に同じリソース（CPU,RAM）を利用した別のマシン（仮想マシン）をつくることです。PC本体をホストと呼び、仮想マシンはVMと呼びます。

### 仮想マシン(VM)
仮想マシンはホストとハードウェアは共有しますが、中身は完全に別物です。例えばWindowsPCに作成した仮想マシンでLinuxやMacを動かすこともできます。別のOSをインストールできるということになります。
仮想マシンはベアメタルハイパーバイザーとホスト型ハイパーバイザーに分けられます。
- ホスト型ハイパーバイザー
ホストOSに仮想化ソフトウェアをインストールし、ホストOS上で仮想マシンを稼働させます。仮想マシンがハードウェアにアクセスする際にホストOSを経由するため、パフォーマンスが低下する場合があります（オーバーヘッドが発生する）。
環境構築がしやすく、Virtualboxなどを用いて個人の検証作業で使われます。

- ベアメタルハイパーバイザー
ハイパーバイザーと呼ばれる仮想化ソフトウェアをハードウェア上に直接インストールし、そのOSの上で各仮想マシンを稼働させます。ホストOSは不要な設計です。これにｙ仮想マシンがハードウェアを直接制御できるのでオーバーヘッドが小さくなります（パフォーマンスが高い）。データセンターで利用される技術です。
別の物理サーバーに移行する際には、稼働中の仮想マシンを停止させることなく移行するライブマイグレーションと呼ばれる技術が使われます。

## コンテナ技術
主にDockerで使われている仮想化技術の一種です（厳密には仮想化技術とは別の技術）。ホストPCのカーネル（Windows NTカーネルやLinuxカーネル）を共有したコンテナを作り、そこにOSをインストールします。カーネルを共有することでリソース（CPU・RAM）の消費が少なく済み、起動が速くオーバーヘッドが小さくなります。コンテナ上で実行されるアプリケーションはホストPCと分離されています（ユーザー空間が分離されている）。
一方、カーネルを共有しているためWindowsPC上にコンテナを作り、そのコンテナでMacを起動するといったことはできません。
DockerについてはLinuxがベースの技術となっており、Windowsで利用する場合はWSL2のインストールが必要となります。WSL2上でDockerが起動する形となるため、ホストPCとはLinuxカーネルを共有していることになります。

## 仮想化技術とコンテナ技術の違い
仮想化技術がOSそのものを分離しているのに対し、コンテナ技術はホストPCとOSのカーネルを共有しています。仮想化技術は相対的にオーバーヘッドが大きく起動に時間がかかる一方、ＯＳが完全に分離しているため出来る事の幅が広くなります。コンテナ技術はオーバーヘッドが小さいため起動は速いですが、カーネルを共有しているため出来ることに制限があります。


※オーバーヘッドとは？
同じ結果を得るための工程が大きいか小さいかの違いのことです。例えば、みそ汁を作る時に出汁を取って作る場合はオーバーヘッドが大きい、出汁の素を使って作る場合はオーバーヘッドが小さいといえます。どちらが良い悪いというわけではなく、それぞれにメリット・デメリットがあると理解しました。


## カーネルについて
カーネルとはコンピューターが動くために必要な最小限の機能のことです。カーネルはカーネル空間というもので、それとは別にユーザー空間というものがあります。
OSは動作の効率性・安全性を確保するためにこの二つの領域に分かれています。

- カーネル空間
OSの中核部分（カーネル）が動作する領域で、メモリ管理、プロセス管理、ファイルシステム、ハードウェアの制御などの処理を行っています。高い権限を持っているため、エラーや悪意のある操作があると、システム全体に大きな影響を与えるリスクがあります。

- ユーザー空間
一般的なアプリケーションプログラムが動作する領域です。カーネル空間の上に成り立っている空間で、カーネルからのシステムコールによってカーネル空間とやり取りを行います。ファイルを開く、ネットワーク通信を行う、メモリを割り当てるなどが該当します。


## 参考になったサイト
https://linuc.org/study/column/2968/

https://www.itmanage.co.jp/column/virtualization-server-integration/
CORSを理解する

## 目次
- corsとは
- Originとは
- 同一Originとは
- 同一Origiの重要性
- corsがないとどうなるか

## corsとは
**cors = Cross-Origin Resource Sharinの略です。**
オリジン間のリソース共有を意味します。
自身のオリジンから見て、別のオリジン（Cross-Origin）からのリクエストを共有するかどうかの仕組みのことです。

## Originとは
Originは以下で構成されています。
- スキーム
プロトコルと書かれていたりするが厳密には違う。
しかし、Web開発においては基本httpかhttpsを使うのでプロトコルでも問題ない
- FQDN
Fully Qualified Domain Nameの略です。
サイトによってはホストやドメインと書かれていたりします。
厳密にはFQDNつまり完全修飾ドメイン名のことを指します。
- ポート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895655/47c7ed79-920e-a4a2-f132-3a07746e1f79.png)


## 同一Originとは

あるオリジンで読み込まれたリソース（HTML, スクリプト, Cookie など）が
異なるオリジン（クロスオリジンとも呼ばれる）のリソースとの通信・アクセスを制限する
Web ブラウザが持つセキュリティ機能です。

異なるオリジンからロードされたリソースへのアクセスをブロックすることにより
元オリジンで読み込まれたリソースに対して
悪い影響を及ぼさないようにすることを目的としています。

2つのオリジン(Origin)の
- スキーム(プロトコル)
- FQDN(ホスト、ドメイン)
- ポート
**がすべて一致した場合のみ同一オリジンだと言えます。**

```
# 同一Origin
http://example.com/8000/api/user/1
http://example.com/8000/api/user/2

# 同一Originではない
http://example.com/8000/api/user/1
http://trap-example.com/8000/api/user/1
```

## 同一Originの重要性

ユーザがWebサイトにログインした状態で別の悪意のあるサイト(別オリジン)から
本人が意図しない情報やリクエストを勝手に送信されてしまったりCSRF(Cross-Site Request Forgeries)、外部の不正なスクリプトを実行させるXSS(Cross Site Scripting)を受けてしまいます。セキュリティ上良くないですよね。

## corsがないとどうなるか

とはいえcorsがないと、フロントエンドとバックエンドでわけて開発するときに困りますよね。
それぞれポート8000や3000と別々に配置することが多いと思いますので。
そこでCORSの設定をすることで同一オリジンポリシーを守りつつ別のオリジン(Cross-Origin)からのリクエストを共有できます。

**ありがとうございました。**
macOSシステム設定：最初に見直したい基本項目

macOSを新しく使い始めたときや再設定するときに、まず確認しておきたい「システム設定」の基本項目を紹介します。自分の使いやすさに合わせて設定を微調整しています。
備忘録してまとめました。

## システム設定

### iCloucd

iCloucd はあまり活用していないので以下 4 つがオンにする項目で、他はオフにします。

- パスワードとキーチェーン
- Mac を探す
- Safari
- FaceTime

### 一般

- 情報
    - コンピュータ名

### コントロールセンター
- サウンド: メニューバーに常に表示

### Siri と Spotlight

- Siri に頼む: オフ
- Spotlight: 全部オフ

### デスクトップと Dock

- Dock: 拡大オフ
- Dock を自動的に表示 / 非表示: オン
- ウィジェット: 全部オフ
- ホットコーナー
  - 左上: ディスプレイをスリープさせる
  - 左下: スクリーンセイバを開始
  - 右上: Mission Control
  - 右下: デスクトップ

### ディスプレイ
- 使用形態: スペースを拡大

### 壁紙

- 静止のものを選択

### ロック画面

- 電源アダプタ接続時に使用していない場合はディスプレイをオフにする: 1時間後
- スクリーンセーバの開始後またはディスプレイがオフになったあとにパスワードを要求: すぐに

### Touch ID とパスワード

- Touch ID: 全部オン

### キーボード
- Spotlight
  - Spotlight 検索を表示 -> オフ
- 修飾キー
  - Caps Lock -> Cotrol
  - Control -> アクションなし
  - Option -> アクションなし
  - 地球儀 -> Option

### トラックパッド

- ポイントとクリック
  - 起動の速さ: 一番速いから 1下げたところ
  - タップでクリック: オン
- その他のジェスチャ
  - 通知センター: オフ

## Finder

### 一般
オンにするもの
- CD、DVD、及び iPad
- 接続中のサーバ
- フォルダを新規ウィンドウでなくタブで開く
- 新規Finderウィンドウで次を表示: 自分のホーム

### 詳細
オンにするもの
- すべてのファイル名拡張子を表示
- iCloud Drive から削除する前に警告を表示
- ゴミ箱をからにする前に警告を表示

### ディレクトリ名を英語表示にする
```
$ rm /Applications/.localized
$ rm ~/Documents/.localized
$ rm ~/Downloads/.localized
$ rm ~/Desktop/.localized
$ rm ~/Public/.localized
$ rm ~/Pictures/.localized
$ rm ~/Music/.localized
$ rm ~/Movies/.localized
$ rm ~/Library/.localized
$ sudo rm /Applications/.localized 
```
### スクリーンショット設定を変更する
- スクリーンショットの影を無効化
```sh
$ defaults write com.apple.screencapture disable-shadow -boolean true
```
- 保存形式を jpg に
```sh
$ defaults write com.apple.screencapture type jpg
```

- 設定を反映
```sh
$ killall SystemUIServer
```
- スクリーンショットのプレビューを無効化
`defaults write com.apple.screencapture disable-preview -bool true` 
このコマンドが機能していないようです。

### **GUI でプレビューを無効化する方法**

1. `Shift + Command + 5` を押す（スクリーンショットと画面収録のツールを開く）。
2. **[オプション]** をクリック。
3. **「フローティングサムネイル」のチェックを外す**。

これでスクリーンショットが即座に、保存されるようになります。
【GitHub Actions エラー】Buildしたら「error TS2688: Cannot find type definition file for '@testing-library/jest-dom'. error TS2688: Cannot find type definition file for 'jest'. error TS2688: Cannot find type definition file for 'node'.」と言われた

# はじめに
今回はGitHub ActionsでBuild時に起きたエラーについて書いていきます。

# 問題
```plaintext: エラーメッセージ
error TS2688: Cannot find type definition file for '@testing-library/jest-dom'.
 The file is in the program because:
  Entry point of type library '@testing-library/jest-dom' specified in compilerOptions

error TS2688: Cannot find type definition file for 'jest'.
 The file is in the program because:
  Entry point of type library 'jest' specified in compilerOptions

error TS2688: Cannot find type definition file for 'node'.
 The file is in the program because:
  Entry point of type library 'node' specified in compilerOptions
  
Error: Process completed with exit code 1.
```

![スクリーンショット 2025-01-26 2.22.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775597/10cd7644-36d8-982b-cb29-4ebdda2830ab.png)

```diff_yaml: main.yml
  # ビルドジョブ - テスト完了後に実行
  build:
    name: Build
    needs: [test] # テストジョブが成功した後に実行
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: ${{ env.NODE_VERSION }}
          cache: "npm"

      # プロジェクトのビルド
      - name: Build
        run: npm run build

      # ビルド成果物をアップロード
      - name: Upload build artifacts
        uses: actions/upload-artifact@v3
        with:
          name: build-files
          path: dist/ # ビルド出力ディレクトリ
```
# 解決方法
```diff_yaml: main.yml
  # ビルドジョブ - テスト完了後に実行
  build:
    name: Build
    needs: [test] # テストジョブが成功した後に実行
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: ${{ env.NODE_VERSION }}
          cache: "npm"

      # 型定義のインストールを追加
+     - name: Install type definitions
+       run: npm install --save-dev @types/jest @types/node @types/testing-library__jest-dom

      # プロジェクトのビルド
      - name: Build
        run: npm run build

      # ビルド成果物をアップロード
      - name: Upload build artifacts
        uses: actions/upload-artifact@v3
        with:
          name: build-files
          path: dist/ # ビルド出力ディレクトリ
```

# おわりに
Vite環境でTypeScriptを採用してのCI/CDは初めてで型定義のインストールが必要だと分かり、上記のコードを追加して解決できました。
Rubyの暗黙的な返り値を理解する

# １ はじめに
初学者が暗黙的な返り値というのを理解していないがためにエラーが起こってので備忘録として記載する。

# ２ そもそも返り値とは
「返り値とは、メソッドの実行結果として返される値のこと」
多くのプログラミング言語では、return文を使って明示的に返り値を指定する。
一方Rubyの場合、明示的なreturn文を使用しなくても、メソッド内で最後に評価された式の値が自動的に返り値となる。

# ３ Rubyの暗黙的な返り値とは
Rubyでは、メソッド内でーー最後に評価された式の値ーーが自動的にそのメソッドの返り値となるものである。
明示的なreturn文を使用しなくても、メソッドは値を返すものである、便利ですね。

# 明示的な返り値の具体例
def add(a, b)
  return a + b
end

result = add(3, 4)
puts "3 + 4 = #{result}"  # 出力: 3 + 4 = 7

# 暗黙的な返り値の例
def multiply(a, b)
  a * b  # この行が返り値となる
end

result = multiply(3, 4)
puts "3 * 4 = #{result}"  # 出力: 3 * 4 = 12

# 4 じゃあ返らない場合はあるのかい？
ありまーす
# 関数に何も入れないと：
def no_return
end
puts no_return  # 出力: nil

# putsの場合はそもそも、、：
result = puts "Hello, World!"
puts result  # 出力: nil

# 5 ようやく本題、私がやらかした愚かなミス
def calculate_and_print(a, b)
  result = a * b
  puts "計算結果: #{result}"
end

final_result = calculate_and_print(3, 4)
puts "最終結果: #{final_result}"

resultが当然出力されると思っていたのだが
# 出力結果
計算結果: 12
最終結果: 

最後に評価される式がputs文であること、これが問題である。最終行のputsメソッドの返り値はputsの戻り値であるnilである。
そのため、final_resultにはnilが代入され、最終結果が空白になってしまった。

# ６ 解決方法
def calculate_and_print(a, b)
  result = a * b
  puts "計算結果: #{result}"
  result  # この行が関数の返り値となる
end

final_result = calculate_and_print(3, 4)
puts "最終結果: #{final_result}"

# 出力結果
計算結果: 12
最終結果: 12

よくできました、頑張りましょう
Vue3にテストツールJestを導入し、単体テストを書く（初心者向け）

Vue3にテストツールのJestを導入し、シンプルなhookの単体テスト（Unitテスト）を書くだけの初心者向けのライトな内容になります。

## Jestとは
JestはJavaScript用のテストフレームワークで（TypeScriptもOK）、Node.jsで動くWebアプリケーションに簡単に組み込めます。

## セットアップ
まず新規Vueプロジェクトを作成し、起動できる事を確認
```
npm init vue@3 test-practice
```

*プロジェクト作成に関しては詳細を省略しますが、本記事ではTypeScriptを使うので、`Add TypeScript?` は `Yes` にしておいてください。

Vueプロジェクトができたら、Jest、その他必要なパッケージをインストールします。
```
npm install --save-dev jest @vue/test-utils ts-jest @types/jest ts-node
```

Jestの設定ファイル `jest.config.ts` をルート直下に作成
内容は以下。これでJestが`XXXX.test`と拡張子がついたファイルを探し出して、テストを実行してくれます。
```typescript
const config = {
  "roots": [
    "<rootDir>/src"
  ],
  "testMatch": [
    "**/__tests__/**/*.+(ts|tsx|js)",
    "**/?(*.)+(spec|test).+(ts|tsx|js)"
  ],
  "transform": {
    "^.+\\.(ts|tsx)$": "ts-jest"
  },
};

export default config
```

`package.json` の`sciprts` 内に以下を追記

```json
"test": "jest"
```

`tsconfig.json` に以下を追記
```json
"compilerOptions": {
  "esModuleInterop": true,
  "types": [
    "jest"
  ]
}
```

これでセットアップはOKです。

## テストコード作成
テストコードの前にテスト対象のhookを作ります。
今回はシンプルな足し算、引き算をするだけのhookです。
（格納場所はお任せします）

ファイル名: `useCalculate.ts`
```typescript
export const useCalculate = () => {
  const add = (a: number, b: number) => {
    return a + b
  }

  const subtract = (a: number, b: number) => {
    return a - b
  }

  return {
    add,
    subtract
  }
}
```

上記で作ったhookのテストファイルを作ります。
ファイル名: `useCalculate.test.ts`
```typescript
import { describe, test, expect } from '@jest/globals'
import { useCalculate } from './useCalculate'

const { add, subtract } = useCalculate()

describe('useCalculate', () => {
  test('add 1 + 2 to equal 3', () => {
    expect(add(1, 2)).toBe(3)
  })

  test('subtract 10 - 2 to equal 8', () => {
    expect(subtract(10, 2)).toBe(8)
  })
})
```
#### 各種メソッドの説明
`describe` メソッドは、いくつかの関連するテストをまとめるブロックを作成するためのメソッドです。これがなくても動きます。

`expect` メソッドは、テスト結果を評価するメソッドです。

[Jest公式ドキュメント](https://jestjs.io/docs/api)に詳しく載っています。

```typescript
test('テストの説明文', () => {
  expect(関数を実行).toBe(期待する実行結果)
})
```

これでテスト対象のhookとテストを実行するファイルができました

## テストの実行
以下のコマンドで実行します。

```
npm run test
```

するとこんな結果がターミナルに表示されると思います。
緑色のPASSは全てのテストが無事に通ったと言う意味です。

![スクリーンショット 2025-01-26 20.31.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173182/58df864c-e243-a759-aa29-730790031526.png)

試しにテストが失敗するように書いて、テストを実行してみてください。
```typescript
expect(subtract(10, 2)).toBe(80)
```
すると赤色でFAILと表示され、どのテストでどこで失敗したのかも表示されます。

![スクリーンショット 2025-01-26 20.36.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173182/03c05ecf-d666-a9d9-f29e-d3e9199fa9ff.png)

## まとめ
今回はあくまでも導入と、基本的なユニットテストだけ書いてみました。
次はCircleCIと繋いで、CI/CDのCIパートを実装してみます。
マテリアライズドビューを作成すると、同名のテーブルが作成される

# まとめ

自分が不勉強だったのでメモ。 **Oracle Databaseでは、マテリアライズドビューを作成すると、同名のテーブルが作成されます。** この挙動はCREATE MATERIALIZED VIEWのドキュメントにも記載されています。


https://docs.oracle.com/cd/G11854_01/sqlrf/CREATE-MATERIALIZED-VIEW.html

>マテリアライズド・ビューを作成すると、そのマテリアライズド・ビューのスキーマ内に、1つの内部表および1つ以上の索引が作成されます。また、1つのビューが作成されることもあります。これらのオブジェクトは、マテリアライズド・ビューのデータをメンテナンスするために使用されます。ユーザーには、これらのオブジェクトを作成するための権限が必要です。

# 例

employeesテーブルを利用するマテリアライズドビューemployees_mvを作成するとします。

```
CREATE MATERIALIZED VIEW employees_mv AS SELECT * FROM employees;
```

USER_OBJECTSテーブルを確認すると、マテリアライズドビューとテーブルが作成されていることがわかります。

```SQL
SELECT object_name, object_type
FROM USER_OBJECTS
WHERE object_name = 'EMPLOYEES_MV'
```

|OBJECT_NAME |OBJECT_TYPE      |
|:-----------|:----------------|
|EMPLOYEES_MV|TABLE            |
|EMPLOYEES_MV|MATERIALIZED VIEW|

なお、マテリアライズドビューemployees_mvを削除すると、テーブルemployees_mvも同時に削除されます。

# 環境情報

- Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production
Version 19.17.0.0.0
コレクション型を定義する

コレクションをレシーバにメソッドを定義することはできない
```go
type User struct {
	ID   int
	Name string
	Age  int
}

// invalid receiver type []User
func (us []User) IDs() []int {
	var ids []int
	for _, u := range us {
		ids = append(ids, u.ID)
	}
	return ids
}
```

そんな時はコレクション型を定義する
```go
package main

import "fmt"

type User struct {
	ID   int
	Name string
	Age  int
}

type Users []User

func (us Users) IDs() []int {
	var ids []int
	for _, u := range us {
		ids = append(ids, u.ID)
	}
	return ids
}

func main() {
	users := Users{
		User{
			ID:   1,
			Name: "Paul",
			Age:  82,
		},
		User{
			ID:   2,
			Name: "John",
			Age:  40,
		},
	}

	fmt.Println(users.IDs()) // [1 2]
}

```
030 AI屋さんの　LLMにトークン全文入力　Flask＋Gunicorn＋Cloud RUN＋Gemini　実践編


030 AI屋さんの　LLMにトークン全文入力　Flask＋Gunicorn＋Cloud RUN＋Gemini　実践編


無事にデプロイはできましたので、
今度は、実際にdockerイメージを作成してみましょう。
設定ファイルなので、一度コピーして動けば完成です。

何度でも同じように動きます。
が、急に　gunicorn　なるものが出てきます。
本番環境向けに、Flaskと連携するwebサーバーです。


---

---


Gunicorn と Flask の連携について

　Gunicorn (Green Unicorn) は、Python で書かれた WSGI (Web Server Gateway Interface) HTTP サーバーです。Flask のような Web アプリケーションフレームワークで作成したアプリケーションを、本番環境で動かすための重要な役割を担います。



　Flask　：　アプリサーバー
　Gunicorn　：　ウェブサーバー



https://gunicorn.org

https://docs.gunicorn.org/en/stable/


https://cloud.google.com/run/docs/tips/python?hl=ja#optimize_the_wsgi_server



![スクリーンショット 2025-01-26 20.22.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/a5e04dc6-3f13-490b-5a30-1b1bfd5c0ac4.png)




１、Gunicorn の役割
　Flask アプリケーションは、開発時には Flask の組み込み開発サーバーで簡単に実行できますが、これはあくまで開発用であり、本番環境での利用には適していません。Gunicorn は、以下のような役割を担い、Flask アプリケーションを本番環境で安全かつ効率的に動作させるために使用されます。

　同時リクエスト処理: Gunicorn は、複数のワーカープロセスまたはスレッドを起動し、同時並行で複数のリクエストを処理できます。これにより、単一リクエストの処理中に他のリクエストが待たされることを防ぎ、高負荷環境でも安定した動作を実現します。
 
　堅牢性と信頼性: Gunicorn は、エラーが発生した場合にワーカープロセスを自動的に再起動するなど、堅牢で信頼性の高い運用をサポートします。
 
　設定の柔軟性: Gunicorn は、ポート番号、ワーカー数、ログ設定など、様々な設定を柔軟に変更できます。これにより、環境に合わせて最適なパフォーマンスを発揮できます。

　WSGI 準拠: Gunicorn は WSGI に準拠しているため、Flask だけでなく、他の WSGI 対応の Web アプリケーションフレームワークでも利用できます。




２、なぜ Gunicorn が必要なのか？
　Flaskは、開発中は手軽に動かせるWebサーバーを内蔵しています。しかし、これはあくまで開発用で、本格的なWebサイトを公開するには不十分です。なぜなら、

　同時接続に弱い: 多くの人が同時にアクセスすると、処理が追いつかずにWebサイトが表示されなくなってしまうことがあります。
 
　セキュリティが低い: 開発用のサーバーはセキュリティ対策が十分ではありません。

　安定性に欠ける: 開発用のサーバーは、長時間の運用には向いていません。
 
Gunicornはこれらの問題を解決し、安定したWebサイト運営を可能にします。



３、Gunicorn の役割
　Gunicornは、具体的に以下のような役割を担います。

　リクエストの受付: Webブラウザからのアクセス要求（リクエスト）を受け付けます。
 
　処理の分配: 受け付けたリクエストを、Flaskアプリケーションに渡します。
 
　応答の返信: Flaskアプリケーションから処理結果を受け取り、Webブラウザに返信します。
 
　同時接続の処理: 複数のリクエストを同時に処理できます。
 
　プロセスの管理: アプリケーションが動くためのプロセスを管理し、安定した運用をサポートします。






---

---



ソースコードは　こちら、

https://st.bono0.com/flask001


![スクリーンショット 2025-01-26 18.53.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/94f81bfe-febb-8e79-395d-1262ddbcd87a.png)


![スクリーンショット 2025-01-26 17.54.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/90acb248-5130-3ce9-b3fc-27b31481e026.png)


---

webapiの中身は、案件ごとに修正が必要です。
雛形をベースに肉を盛っていきます。
app.py　の中で、Geminiのプロンプトに全文入力できれば完成です。


---


目次

https://qiita.com/bono0/items/dc1d000c98af7e07c9a7




今回も無事に　dockerイメージを作成できました。

　030 AI屋さんの　LLMにトークン全文入力　Flask＋Gunicorn＋Cloud RUN＋Gemini　実践編

 
完成です。おめでとうございます。








ー続くー
Windowsでのファイル名一括変換

# 環境
- Windows 10
- PowerShell利用可能
- プログラムの実行権限<font color="red">なし</font>
- インストール権限<font color="red">なし</font>

# やりたいこと
100個あるディレクトリの名前を以下のように変更したい
```:before
01_hogehoge/
02_hogehoge/
︙
99_hogee/
test.txt
text.xlsx
```
```:after
001_hogehoge/
002_hogehoge/
︙
099_hogee/
test.txt
text.xlsx
```

# やり方
PowerShellで以下のコマンドを当該ディレクトリのある階層に移動して実行する
```PowerShell:コード例
Get-ChildItem | ? { $_.Name -match "^[0-9]+.+" } | ? { $_.PSIsContainer } | Rename-Item -NewName { $_.Name -replace "^([0-9]+).*", "0$_" }
```

おそらくもっと簡単にかけると思うが、とりあえず動いたからヨシ！
【Linux】CentOS9にNginxを入れてみた

# ■目的
後にPacemakerでサーバ2台による冗長化を行いたいので、その前準備として今回は、CentOSにNginxをインストールします。

# ■環境
・CentOS Stream9

# ■手順
### **0.rootユーザになる(rootユーザになっていない場合のみ本手順を実施する。)**
```
# sudo su -
```
### 1．Nginxのインストール
```
# yum -y install nginx
```
⇒「完了しました！」と表示されること

バージョン確認をしておきます。
```
# nginx -v
nginx version: nginx/1.20.1
```
無事インストール出来ました。

### **2．Nginxのステータス確認**
```
# systemctl status nginx
○ nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; preset: d>
Active: inactive (dead)
```
事前情報通り、Nginxはインストールしただけで自動起動しないようです。

### **3．Nginxの起動**
以下のコマンドを入力し、Nginxを起動します。
```
# systemctl start nginx
⇒エラーとならないこと
```
Nginxが起動したかを項番2．のコマンドを実行し確かめます。
```
# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; preset: d>
Active: active (running) since Sun 2025-01-26 19:58:41 JST; 2min 26s ago
Process: 11068 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, sta>
Process: 11069 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCE>
Process: 11070 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
Main PID: 11071 (nginx)
Tasks: 2 (limit: 23124)
Memory: 2.0M
CPU: 50ms
CGroup: /system.slice/nginx.service
tq11071 "nginx: master process /usr/sbin/nginx"
mq11072 "nginx: worker process"
```
⇒「Active: active (running) 」と表示されたこと






### **4．Nginxの自動起動**
毎回、サーバ起動後にNginxを起動させるのが面倒なので、自動起動設定をしておきます。
```
# systemctl enable nginx
```
⇒「/usr/lib/systemd/system/nginx.service; enabled」と表示されたこと

### **5．Nginxのポート開放**
Nginxで使用される80番ポートを開放します。
```
# firewall-cmd --add-port=80/tcp --zone=public --permanent
```
⇒「success」と表示されたこと

設定をリロードします。
```
# firewall-cmd --reload
```
⇒「success」と表示されたこと

設定が反映されたかを確認します。
```
# firewall-cmd --list-all
"public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3 enp0s8
  sources:
  services: cockpit dhcpv6-client http ssh
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:"
```
⇒ services:欄に「http」が反映されたこと

# ■WEBページ
NICのIPを確認し、WEBページが表示されることを確認します。
```# ip a```
↑のコマンドでこのサーバのNICのIPが「192.168.56.101」と判明したので、
IPをWEBブラウザに入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761139/90c3ee9f-06f7-495d-51ea-7d224188ed13.png)

⇒テストページが表示されたこと

# ■参考URL
https://zenn.dev/aym613/scraps/0ccbc49bbb1200

https://www.miraiserver.ne.jp/column/about_centos7-nginx/
DiscordでのOGP（サムネイル）表示について

# 本記事について

## OGPとは
ざっくりいうと、こういうのを各サービス・アプリケーションで表示してもらうための仕組みです。
以下はDiscordの例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283303/5d163c0a-f93a-5e6f-a982-0d7003ab311b.png)

## この記事を書いた背景
- OGPについては、意外と日本語での情報が少ないです
- 特にDiscordはあまり日本の業務シーンでは活躍していないからか、尚更少ないです
- 今回の要件としては「Discordのサムネイルである程度の情報を伝える」というものがあり、ここがインターネット上にも情報がなく、なかなかうまくいかず苦戦しました

# 開発

## ソースコード(html)
基本的には、HTMLヘッダーにOGP専用のメタ情報を付与することで対応することができます。
サイトやサービスにより、専用のタグがあったりするみたいなので、要件に応じて確認してください。
``` html
<meta property="og:site_name" content="サイト名">
<meta property="og:url" content="URL">
<meta property="og:type" content="website">
<meta property="og:title" content="ページタイトル">
<meta property="og:description" content="ページ概要説明">
<meta property="og:image" content="サムネイル画像のURL">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:type" content="image/png">
```

## 用意する画像
色々なサイトを見ると、w1200*h630が推奨サイズのようです。
今回当方はサムネイル画像をページごとに自動で生成するようにしました。

Laravel + InterventionImage を使用して生成していますが、もし需要があるようでした記事にしたいと思います。

## Discordにおける仕様について
実はDiscordでのOGPは、画像が大きく表示されるパターンと、小さく表示されるパターンがあります。
先述した __「サムネイルである程度の情報を伝える」__ という要件から、どうしても大きい方で表示したかった訳です…。

#### 小さいの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283303/5d163c0a-f93a-5e6f-a982-0d7003ab311b.png)

#### 大きいの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283303/89d318ef-ba97-737e-fcaf-b9f22bda18e1.png)

Discordで何を基準に、どちらを選択しているのか？という情報が分からず、大きい方のサムネイルが表示されずに苦戦しました。
色々なサイトのURLをDiscordで表示したときにどうなるか確認し、それぞれのサイトのOGPメタ情報がどのように書かれているかなど調査を進めました。

### 結論
メタ情報に以下を追記することで、大きいサムネイルを表示することができました👏👏
Twitter用のメタ情報なのになぜ??と思いましたが･･･詳しいことは分かりません･･･。
``` html
<meta name="twitter:card" content="summary_large_image">
```

# デバッグ
localhostのアドレスをDiscordにテストとして貼り付けても、アクセスできずに画像が表示できないため、開発・テストがうまくいきません。
そんな時は以下を使用させていただきましょう🤗🤗

## Localhost Open Graph Debugger
https://chromewebstore.google.com/detail/localhost-open-graph-debu/kckjjmiilgndeaohcljonedmledlnkij?hl=ja&utm_source=ext_sidebar

↑ちなみにこれもOGPを使用してサムネイル表示されています。
神GoogleChrome拡張です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283303/ccdbf701-d68d-4a0b-9790-62d69281d53a.png)

localhostで拡張機能を起動するだけで、localhostのOGP情報（画像含む）のみを一時的にインターネットにUPしてくれて、URLを発行してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283303/3300bc9a-967e-d045-0135-79835eb6c55d.png)

これで各サービスにURLを添付したときに、OGPを生成してくれますね👏👏

## Discord Developer Portal Embed

https://discord.com/developers/embeds

Discordに投稿したときに生成されるOGPを疑似的に作成して確認することができます。
Discordでテスト用のサーバなどを作成して、実際にメッセージを投稿したりしなくても結果が確認できるため非常に便利です。
Discord以外でも同様のサービスが提供されていることが多いみたいなので、要件に応じて探してみてください。
※Localhost Open Graph Debuggerの画面の各サービスのアイコンを押すことでも利用できます

# おわり
以上、Discordで大きいサムネイルを表示したい！という方の参考になれば幸いです🙂
Djangoのフォームフィールドと使える引数一覧

Django4.2.2です。

# はじめに
こんな感じで使うフィールドについて、いろいろ種類があってまとめてみたくなったのでまとめます。

```forms.py
from django import forms

class HelloForm(forms.Form):
    name = forms.CharField(label='name', widget=forms.TextInput(attrs={'class': 'form-control'}))
    mail = forms.EmailField(label='mail', widget=forms.TextInput(attrs={'class': 'form-control'}))
    age = forms.IntegerField(label='age', widget=forms.NumberInput(attrs={'class': 'form-control'}))
```
因みにですが、私の環境では`(前略}/Python313/Lib/site-packages/django/forms/fields.py`に定義が書いてあるらしく、それを見ながら書いています。危ういところが多いのでコメントください。

# フィールド一覧
Djangoのフィールドはクラス単位でまとめられています。
以下、継承している場合はPythonの書き方と同様に`Subclass(Superclass)`と表現します。
当然継承元にいる引数も使えます。

## Filed
全てのフィールドの元となるフィールドです。こいつそのものも`forms.Field()`として使用出来ますが、これを継承し特長を追加した後述のフィールドたちを目的に併せて適切に使うのが正しいと思います。
| 引数 | 説明 | デフォルト値 |
| ---- | ---- | ---- |
| required | 必須項目かどうか | True |
| widget | htmlのinput要素やcssクラスなど | None |
| label | フォームに表示されるラベル名。指定しない場合はフォームクラスの変数名がラベルとして採用される。 | None|
| initial | 初期値 | None |
| help_text | そのフィールドの説明書き、入力欄の下とかに表示される。| 空文字 |
| error_messages | エラー時メッセージ、辞書型で渡してデフォルトで入っているものをオーバーライドする。 | None |
| show_hidden_initial| Trueにするとそのフィールドの初期値を持つ隠しフィールドが追加され、POSTしたときに一緒に送信されるようになるらしい。初期値から変更があったかどうかを判断したいときに使えそう。 | False|
| validators | 追加のバリデータ | () |
| localize | 日付の表示形式などがPCの設定に沿ったものになる | False |
| disabled | 編集不可な項目か　| False |
| label_suffix | ラベル文字列に追加される文字列、ラベル名はlabel+suffi_labelにより作られる文字列になる | None |

## CharField(Field)
文字列を入力するためのフィールドです。

| 引数 | 説明 | デフォルト値 |
| ---- | ---- | ---- |
| max_length | 最大文字数 | None |
| min_length | 最小文字数 | None |
| strip | 両端の空白を切り取るか | True|
| empty_value | 空白の場合のデフォルト値 | 空文字 |

## IntegerField(Field)
整数を入力するためのフィールドです。

| 引数 | 説明 | デフォルト値 |
| ---- | ---- | ---- |
| max_value | 最大値 | None |
| min_value | 最小値 | None |
| step_size | 1目盛りの絶対値、例えば2を指定すると、{-4,-2,0,2,4,...}が入力可能な値になる。 | None(1の動きだが?) |

## FloatField(IntegerField)
実数を入力するためのフィールドです。

## DecimalField(IntegerField)
実数を入力するためのフィールドです。

## BaseTemporalField(Field)
日時や時間を入力するためのフィールドクラスの元となるクラスです。これそのものを直接使用することはないと思います。

## DateField(BaseTemporalField)
日付を入力するためのフィールドです。

## TimeField(BaseTemporalField)
時刻を入力するためのフィールドです。

## DateTimeField(BaseTemporalField)
日付と時刻を入力するためのフィールドです。

## DurationField(Field)
期間を入力するためのフィールドです。

## RegexField(CharField)
正規表現パターンに一致する文字列を入力するためのフィールドです。
| 引数 | 説明 | デフォルト値 |
| ---- | ---- | ---- |
| regex | 正規表現 |  |

## EmailField(CharField)
Emailを入力するためのフィールドです。

## FileField(Field)
ファイルを入力するためのフィールドです。
| 引数 | 説明 | デフォルト値 |
| ---- | ---- | ---- |
| max_length | ファイル名の最大文字数 | None |
| allow_empty_file | 空のファイルを許容するか | False |

## ImageField(Field)
画像を入力するためのフィールドです。

## URLField(CharField)
URLを入力するためのフィールドです。

## BooleanField(Field)
「はい」か「いいえ」で答えられるようなものを入力するためのフィールドです。チェックボックスが出ます。

## NullBooleanField(BooleanField)
「はい」か「いいえ」か「分からない」で答えられるようなものを入力するためのフィールドです。プルダウンが出ます。

## ChoiceField(Field)
いくつかの選択肢から1つ選ぶようなものを入力するためのフィールドです。プルダウンが出ます。
| 引数 | 説明 | デフォルト値 |
| ---- | ---- | ---- |
| choices | 選択肢 | () |

## MultipleChoiceField(ChoiceField)
いくつかの選択肢から1つ以上選ぶようなものを入力するためのフィールドです。プルダウンが出ますが、生で出すとCtrlを押しながらじゃな無い限り複数選択出来ません。


# たくさんある
まだたくさんありますが疲れたので休みます。
気が向いたら書き進めます
Android オフラインファーストの push ベースの同期 について

## オフラインファーストとは

オフライン状態でコア機能の一部 or 全部が実行できるアプリのことです。

不安定なモバイルデータ通信状態が想定されるシチュエーションは沢山あります。
- 地下鉄や飛行機での移動中
- キャンプや登山などのアクティビティ中
- 災害時

その中でもアプリのコア機能を実行できるようにしようというお話です。

## 具体例

### Spotify

Spotify ではオフラインでも保存した楽曲を再生することができます。
つまり、音楽再生機能という Spotify のメイン機能を、オフラインで使用することができます。

ホーム画面はオフラインでも楽曲のジャケットが表示されます。
ボトムナビゲーションバーにオフラインである表記が追加されます。
また、プレミアムユーザーが最近聴いた楽曲をオフラインで再生できる機能である、「オフライン・バックアップ」についての項目も表示されます。

[公式の案内記事](https://support.spotify.com/jp/article/listen-offline/)

| Home | マイライブラリ |
|:-:|:-:|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415127/dfd00639-7e12-99f0-dc0d-54d998cbab9c.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415127/8164fa2d-a716-6423-bfe1-528db92a39b2.png)|

### Prime Video
ダウンロードタブでは、オフラインでも保存した動画を再生することができます。
つまり、動画再生機能という Prime Video のメイン機能を、オフラインで使用することができます。

ホーム画面はオフラインでも動画のジャケットが表示されます。
画面上部にオフラインである表記が追加されます。

| Home | ダウンロード |
|:-:|:-:|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415127/9e9ef0b1-c97e-1079-98ce-4c25795301aa.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415127/8e2e6468-8fd5-bc3c-3b45-3aad1f358475.png)|

## 同期のタイミングについて

ローカルでデータをもつということは、どこかでサーバ側と同期する必要がでてきます。

[公式ドキュメント：オフラインファースト アプリの作成](
https://developer.android.com/topic/architecture/data-layer/offline-first?hl=ja) では、 2 種類紹介されています。
- pull ベース
  - 最新のアプリデータをオンデマンドで読み取る
  - データを表示する直前にのみデータを取得する
- push ベース
  - ローカルデータソースがネットワークデータソースを可能な限り模倣する
  - サーバーからの通知を受けてデータ更新を行う

| pull ベース | push ベース |
|:-:|:-:|
|![image.png](https://developer.android.com/static/images/topic/architecture/data-layer/pull-sync.png?hl=ja)|![image.png](https://developer.android.com/static/images/topic/architecture/data-layer/push-sync.png?hl=ja)|

pull ベース画面毎に必要なデータを取得するために通信を行い、それをローカルでも保持しておくイメージのようです。ローカルを気にしないアプリの通信方式と同じなので、何となく想像がつきました。

push ベースはデータが古くなったとき、サーバーからの通知を受けてデータ更新を行うようです。言いたいことはわかりますが、「データが古くなったとき、サーバーからの通知を受ける」とはどのような仕組みを指すのかいまいち想像ができませんでした。

## Push ベースでの同期の実装について

調べたところ、NowInAndroid の実装についてのコメントがでてきました。
https://github.com/android/nowinandroid/discussions/886#discussioncomment-6715116

簡単に言えば、Gitのようなバージョン管理を行っているようです。
順序としては以下の通りです。
1. API 通信 (バージョン確認を含む)
2. 差分を取得
3. ローカル更新

つまり、「ローカルでサーバと同様のデータを模倣し、通信時にそのデータの差分のみ取得する方式」のようです。

「サーバーからの通知を受けてデータ更新を行う」と書かれると紛らわしいですが、
**アプリからの要求がない限り、サーバーは何も情報を送信していない** ようです。

## その他具体的な実装方法について
公式にまとめられてます
- [公式ドキュメント：オフラインファースト アプリの作成](
https://developer.android.com/topic/architecture/data-layer/offline-first?hl=ja)

<iframe width="560" height="315" src="https://www.youtube.com/embed/jaZ2gLMGUsM?si=IR8ZREQ4nj9E69cc" 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>
【リーダブルコード】初心者エンジニアが読み解く「巨大な式をスッキリ分割する」テクニック - 第8章

こんばんは！マル太です。

前回は、リーダブルコードの第7章「制御フローを読みやすくする」についてまとめました。
今回は、第8章「巨大な式を分割する」について、私なりに解釈し、まとめていきます。


# 巨大な式があるとなぜ良くない？
プログラムを書いていると、ついつい式が長くなってしまいがちです。
ただし、巨大な式は、まるでジャングルの中をさまようように、コードが読みにくくなってしまいます。

例えば、こんな式があったら、どうでしょうか？

```ruby:qiita.rbJava
if (年齢 >= 20 && (職業 == "会社員" || 職業 == "公務員") && 年収 >= 300万円) {
  // ローンを承認する
}
```

この式は、年齢、職業、年収の3つの条件を組み合わせて、ローンを承認するかどうかを判断しています。
でも、ぱっと見ただけでは、どんな条件でローンが承認されるのか、分かりにくいですよね？
<br>

# 式を分割して、コードをスッキリさせよう！
巨大な式を分割すると、コードが読みやすくなるだけでなく、バグも減りやすくなります。
式を分割するためのテクニックを、紹介していきます。

**1. 説明変数を使う**
複雑な条件式を、分かりやすい名前の変数に置き換えてみましょう。

```ruby:Java
boolean 大人である = 年齢 >= 20;
boolean 安定した職業 = 職業 == "会社員" || 職業 == "公務員";
boolean 高収入 = 年収 >= 300万円;

if (大人である && 安定した職業 && 高収入) {
  // ローンを承認する
}
```
このように、「大人である」、「安定した職業」、「高収入」といった変数を使うことで、コードがまるで文章を読んでいるように理解しやすくなりますね。
<br>

**2. 要約変数を使う**
長い計算式を、短い変数名でまとめてみましょう。

```ruby:Java
// 分割前
int 合計金額 = 単価 * 数量 * (1 + 税率);


// 分割後
double 税込み単価 = 単価 * (1 + 税率);
int 合計金額 = 税込み単価 * 数量;
```

「税込み単価」という変数を使うことで、計算式が2つに分かれ、それぞれが何を計算しているのかが明確になりました。

<br>

**3. ド・モルガンの法則を使う**
ド・モルガンの法則とは、
条件式を、より分かりやすい形に変換する法則です。

`!(A && B)` は `!A || !B` と同じ
`!(A || B)` は `!A && !B` と同じ

例えば、「AさんとBさんが 両方 来ない」ということは、「Aさんが来ない または Bさんが来ない」ということと同じ意味ですよね。
これが、`!(A && B)` は `!A || !B` と同じ、という意味です。
<br>

**4. 短絡評価の悪用は避ける**
短絡評価とは、条件式の一部を評価せずに結果が決まる仕組みのことです。
便利ですが、使いすぎるとコードが分かりにくくなるので、注意が必要です。
<br>

**5. 複雑なロジックはシンプルに**
複雑な条件分岐や計算式は、できるだけ分割して、シンプルに表現しましょう。
複雑なコードは、バグの原因になりやすいので、分かりやすく整理することが大切です。
<br>

**6. 巨大な文もは改行で分割**
1行が長すぎる文は、複数の行に分割して読みやすくしましょう。
<br>

**7. 式を簡潔にするには？**
APIの設計を見直したり、適切なデータ構造を使うなど、さまざまな方法で式を簡潔にすることができます。

※APIの設計って？
APIとは、ソフトウェアの機能を外部から利用するためのインターフェースのことです。
APIの設計が分かりやすければ、コードもシンプルになります。

例えば、ユーザー情報を名前で検索するAPIがあるとします。

このAPIを`getUserByName()`という名前にすると、「ユーザーを取得する」という動作と「名前で検索する」という条件が混ざってしまい、少し分かりにくいです。

そこで、`findUserByName()`という名前に変更すると、「名前でユーザーを検索する」というAPIの目的がより明確になります。

APIの名前が具体的で分かりやすくなると、そのAPIを使う側のコードもシンプルになります。

例えば、`getUserByName()`を使う場合は、以下のようなコードになるかもしれません。

```ruby:Java
User user = getUserByName("田中太郎");
if (user != null) {
  // userが見つかった場合の処理
} else {
  // userが見つからなかった場合の処理
}
```

一方、`findUserByName()`を使う場合は、以下のようなコードになります。

```ruby:Java

User user = findUserByName("田中太郎");
// userが見つかった場合の処理
```

`findUserByName()`は、ユーザーが見つからなかった場合はnullを返さないと想定できるので、nullチェックが不要になり、コードが簡潔になりました。


<br>

# まとめ
巨大な式を分割することで、コードが読みやすくなるだけでなく、バグも減りやすくなります。

今回紹介したテクニックを活用して、分かりやすいコードを書きましょう。

次回は、第9章「変数と読みやすさ」についてまとめます。
電験の勉強法について（1種、2種、3種共通）

# はじめに
電験試験を効率的に解くためには、基礎力を付けた上で過去問演習をして自分なりに電気の知識を体系化させることが必要である。そこで、本記事では筆者が電験の試験をどうやって勉強してきたかの概略を述べ、電験受験生に対して自己啓発をすることとする。

# 前提
これは、どの試験でも言えるが、マニアックな難しい問題を解くのではなく、過去問の標準的かつ頻出な問題をできるだけ多く、分野の偏りが生じないように学習する。できれば知識を体系化・抽象化して応用力を効かせる。
# 目次
以下の番号の見出しで本文は進んでいく。

0～3:中学高校の知識を復習する
4～7:電験の勉強
8:過去問対策
# 本文
## 0.読解力の育成
・目的：参考書を読んだり、論説で論理的に破綻していない文章を書けるようにするため。（キーワードを詰め込むこと＋αが必要である）
・方法：中学校の国語読解問題集で、読解力を身に付ける。

社会人には、以下の新書『大人に必要な読解力が正しく身につく本』がおすすめである。

この本は、接続詞の使い方など基本的な事項の確認から入り、効率の良い情報伝達の方法なども扱っているため、論説の解答用紙の作成方法にも応用が利く。



https://amzn.asia/d/hIhupxg



## 1.数学力
・高校数学から大学初年度レベルの代数（二次関数、方程式、四則計算、文字式の計算）、解析（微分積分、ベクトル、三角関数、複素数、行列）の計算方法を理解する。

具体的な参考書としては、『電験2種電気数学: 第3種から第2種へ』がおすすめである。レベルは高いが、電験1種までに必要な数学の知識だけがすべて載っている。また、単に公式を紹介するだけでなく、その意味や背景などを実戦形式で教えてくれる。


https://amzn.asia/d/faqUCF3



## 2.物理
・電磁気＞力学（運動方程式、電子の動きや仕事量、エネルギーの計算方法の習得）＞波動（三角関数）＞熱力学（熱サイクル、エントロピー、エンタルピー→火力で使用）＞原子
の優先度で勉強する

初学者は、受験界隈では有名な『物理のエッセンス』シリーズで復習する。

https://amzn.asia/d/8UfmHEJ

その名の通り、重要なトピックのみを十分過ぎるほどに扱っている。

上級者は、駿台の伝説の参考書である『新物理入門』で基礎を深める。

https://amzn.asia/d/32NRz5V

本作品は、物理で微積を使用しているので、応用性や自由度が増えた議論を味わうことができる。



## 3.化学

・モル計算などの基本知識と電池と電気分解の知識
→機械の電気化学で使用

重要度は数学や物理と比較すると低めなので、あまり深入りしないこと


## 4.理論
・とにかく、数学と物理の知識で押し倒す

## 5.電力
・発電：発電所の種類や性質を理解する
・送電・変電：ベクトル図を書けるようにする
・配電：電圧降下や電力損失の計算

特に、発電・送電では回転機を用いた3相式におけるメリットと課題を整理しておくこと
→慣性力、安定度、発電機における周波数と有効電力と機械入力の関係性など

参考書としては『電力系統』がいい。

電験一種までに必要な電力の知識のすべてが得られる。


https://amzn.asia/d/32NRz5V


## 6.機械

・回転機＞変圧器＞制御＞パワエレ＞電気分解＞その他
の順で勉強するのが効率的である。

・特に、回転機の同期機と誘導機、変圧器は電力とも繋がるので念入りに。

・制御はとにかくラプラス変換を用いた微分方程式が解けるようにする。これができれば、伝達関数などは何とかなる。安定性はオイラー公式を用いて感覚的に理解する。

・過去問を用いた演習問題が足りなければ、エネ管電気の過去問も使用するとよい。というのは、エネ管電気は公式や法則の原理を問う本質的なものが多い。
(回転機の回転数の公式:$N_s=\frac{120 f}{p}$の導出など)


## 7.法規

・電力や施設管理の知識・計算はしっかりと対策する。
・条文は、『電力の安全性と経済性』という考え方が基礎であることを常に頭の片隅において暗記する。

## 8.過去問演習
・できるかぎりまんべんなく学習する。（食わず嫌いは避ける）
・マニアックな問題を深掘りするのではなく、標準レベルや過去問の類題を多く演習する
・論説と計算をバランスよく学習する
・計算は速さよりも正確さ（検算）を意識する。

復習では、問題の目的や意味を考えるのが理想である。
例えば、誘導機の計算では滑りからはじまり効率を求めることがゴールであることが多い。また、電力用コンデンサの問題では、最終的に改善力率を求めるなどの目的を意識しながら問題を味わうと理解が進む。

# まとめ

今回は、電験試験の勉強法の全般にいえることを簡単に説明した。どの試験でもいえることであるが、標準的な問題をあなどらずにしっかりと解き切ることができれば、いい勝負をすることができる。そのために必要なのは、今の自分の実力を客観的に把握して基礎固めをすべきか過去問演習をすべきかを判断できる能力である。健闘を祈る！！
テックキャンプで学んだProtoSpaceアプリケーションの実装

## ProtoSpaceとは

ProtoSpaceは、アプリ開発者がプロトタイプについてフィードバックを得られるサービスです。開発者は自身の試作品アプリを共有し、コミュニティからの意見を収集できます。

## プロジェクトの実装ステップ

### 1. 事前準備
- 開発環境の構築
- 必要なGemやライブラリのインストール
- 開発に必要な初期設定

### 2. ユーザー管理機能の実装
- Deviseを使用したユーザー認証システム
- 新規登録、ログイン/ログアウト機能
- ユーザー情報の管理

### 3. ビュー構成
主要なビューファイルと役割：

| ファイル名 | 目的 |
|------------|------|
| `devise/registrations/new.html.erb` | ユーザー新規登録ページ |
| `devise/sessions/new.html.erb` | ユーザーログインページ |
| `layouts/application.html.erb` | 全体のレイアウト |
| `prototypes/new.html.erb` | プロトタイプ投稿ページ |
| `prototypes/show.html.erb` | プロトタイプ詳細ページ |
| `users/show.html.erb` | ユーザー詳細ページ |

### 4. プロトタイプ関連の実装

#### バリデーション要件
| 項目 | データ型 | カラム名 | 必須 |
|------|----------|----------|------|
| プロトタイプ名称 | string | title | 必須 |
| キャッチコピー | text | catch_copy | 必須 |
| コンセプト | text | concept | 必須 |
| プロトタイプ画像 | ActiveStorage | image | 必須 |

### 5. アクセス制御

#### ログイン制限が必要なページ
- プロトタイプ新規投稿ページ
- プロトタイプ編集ページ
- プロトタイプ削除機能

#### 制限なしのページ
- トップページ
- プロトタイプ詳細ページ
- ユーザー詳細ページ
- ユーザー新規登録ページ
- ログインページ

## まとめ
このプロジェクトを通じて、Railsでの実践的なウェブアプリケーション開発スキルを学びました。ユーザー認証、アクセス制御、ActiveStorageを使った画像管理など、多くの重要な技術を習得できました。