restofwaterimpのぎじゅつMemo

SIerに所属。企画から運用まで幅広くやってます。C#中心に書いてます。

【学習メモ:SQL】offset_limit_rank,dense_rank

LeetCodeでSQLを学習1

ビジネスアプリでは使わないが、BIや分析だと集合やウィンドウ関数をたくさん機会があり、LeetCodeで学習

知らなかったことを少しでも各

  1. offset と limit

offset はselect 最初の何件は飛ばすってもの カーソルフェッチで何件かパスする。でも線形なので、数が多いと遅い? ただ、BIツールが発行するページ送りだとみる。indexをつけておくことが重要なのだろう。

limit はそこから何件分取得するもの

select xxx from table limit n offset m で書ける

2 何番目の値をって問題

通常sql なら limit , offset で行けるのだが、 function の中だと limit n offset m に定数ではなく変数を設定すると、n - 1 とか計算ができない

そこでウィンドウ関数 mysql となるが first_value()とか使うと、最初の1つめ

 select salary from 
      ( select distinct salary,
        dense_rank() over (order by salary desc) as rnk
        from Employee) as emp
        where rnk = N

と書くと dense_rank は 対象内で同じ値があるとまとめてくれるみたい group by した後にまとまったもとで、1,2,3と番号を振る

ただの rank だと group by せず、同じ値でも違う番号で連番がつく

こういうのも知っていないと、効率が悪い実行計画のSQLになるので。

【個人メモ】Dependency Trackの入れ方

仕事で、SBOMの作成と脆弱性評価の必要が訪れた。

昨今、ヨーロッパを中心にソフトウェアのセキュリティ評価が敏感になっているようである。

日本でもIPAMETIが情報を出していること、またいろいろとソフトウェアがあるらしい。

www.ipa.go.jp

www.meti.go.jp

https://japanese.opswat.com/resources/guides/sbom-in-2025-a-strategic-asset-not-just-a-list?utm_medium=paid_search&utm_source=bing&utm_campaign=APJ_JP_Search_SBOM_SupplyChain_Japanese_NB_PM&utm_term=SBOM&utm_content=japan&msclkid=6f7f2a2cc6d311a1c230433c53765321

何やら形式として、CycloneDXとSFPXという形式があるらしい。 部品表のみなら後者でもできそうなのだが、脆弱性評価は前者のほうが活用ができそう。

OSSdependency Trackというツールを利用するとdocker上にsbomを挙げるだけでチェックできるみたいなので、ちょっと試してみた。 対象のソースコードC#で書かれたコードです。 C#以外でもできるみたいです。

dependencytrack.org

前提として

個人PCにdockerが導入されている必要がある

C#のSBOMの取得

dotnetのCycloneDXをインストールする
dotnet tool install -glocal CycloneDX

インストール出来ると利用可能になります。

対象のsln プログラムを指定して、sbom.xmlを出力する
dotnet-CycloneDX YourSolution.sln -o /output/path

生成されると /output/path に指定した箇所へbom.xmlファイルが作成されます。

Dependency Trackの設定

基本的にはサイトに記載の通りに実施することとなる。 しかし、docker-composeでうまく、pullできない部分があったため、備忘録

・apiserver がdocker-composeではうまく取れず。 ‘‘‘ [+] Running 18/3 - postgres [⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿] Pulling 15.8s ✘ apiserver Error Get "https://registry-1.docker.io/v2/": context deadline exceeded 15.8s - frontend [⣿⣿⣿⣿⣿⣿⣿⣿⣦⠀⠀⠀⠀⠀⠀] Pulling 15.8s Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded

こうなったら、どのイメージでこけているか確認し、
一つ一つdocker pull image で先に取得するとエラーが解消できました。

・postgre のRAM不足

dockerをインストールしたのが結構前で、デフォルトのRAMの設定を覚えていなかったが、4GBだった。このインストールでは、4GB以上を必要とするみたいなので、今回は8GBを指定した。

docker のwsl版で入れていたため、ユーザディレクトリは以下の wsl.configを修正

[wsl2] memory=8GB

で、その後、docker をリスタートし、適用

#### dependency trackの設定

無事、dockerが立ち上がると
localhost:8080でおそらく立ち上がる。


そこで、ログイン画面を求められるのだが・・・


[https://docs.dependencytrack.org/getting-started/initial-startup/:embed:cite]

ここにinitial は adminだよって書いてあるので、無事ログイン。

あとは、中でプロジェクト作って、bom.xmlをuploadすればできそう。

サンプルのプロジェクトを上げたらこんな感じでした。

<figure class="figure-image figure-image-fotolife" title="脆弱性の様子">[f:id:restofwaterimp:20251109224630p:plain]<figcaption>脆弱性の様子</figcaption></figure>

サンプルで挙げたものはリスクなしってことでした。

ただ、ライブラリが最新のものではないという警告が出ておりますが。


まだ、日本国内だけでの利用のソフトだとSBOMをしっかり管理しろとはないかもしれないが、昨今のサイバー犯罪のことを考えると、常に最新化にするという波が来るのかも・・その時に、構築ソフトウェアの状況がぱっと見れる便利なツールがあるというのはいいですね。

【書籍】読めばわかるは当たり前

ここ数年、若いメンバにシステム設計やお客さんとの調整を依頼することが多くなってきていた。

しかし、どうもうまくいかない。

言葉を正しく理解できていないし、お客さんとの会話のやり取りもスムーズにいっていない。

経験が足りない・・・というのでは、状況から逃げているだけと思っていた時に、本屋で見つけたのがこの書籍。

https://amzn.to/43H9BBC

タイトルからして、今の私のもやもやが晴れるかもしれないと思い購入。

内容を整理すると、図の通り。

整理_読めばわかるは当たり前

批判的理解を行ってほしいのだが、表像理解までも進んでいない状況。つまり、書いてあるとは話されている内容がそもそも理解できていない。

背景としては

  • 「言葉を知らない」という単語・用語のそもそもの理解。(聞いたことない、理解していない)
  • 単語をつなぎ合わせ、文にしたときに理解できていない。(主語、述語や目的語など文法的に読み解けない)
  • 文などをつなぎ合わせて理解できない。

など、さまざま。

ITシステムを理解する上での技術的なことがわからないというわけではなく、読む力がまずないのだなと。

また、書き物をするときも同様で、書くために使う用語、書き方(正しい日本語)ができていないと、伝わらない。

SIの業界にいるが、よく、文章の伝え方で論理構成とか研修で学ぶのだが、それ以前のこともしばしば。。

文間の内容を理解できないと、文間からより抽象的な事象をとらえるとか無理ですからね・・・。

と、いうこと良い本に出合えたかと。


書籍の中にあった、文理解のため、「内容について質問する」というのは年齢問わずに効果がありそうです。

※読んだことを自分の中で解釈して発言するので、表像理解までの作業ができるので。

【メモ】ASP.NETの学習4(初心者向けのASP.NET Core)とIoC

本日はこれ

learn.microsoft.com

Razar Pagesを使った、リストの表示、追加、削除という学習

Razorは触ったことがなかったが・・えらい便利ですね。 Blazorと同じかと思っていたが違うみたい。

RazorはASP.NET Coreを利用してWeb UI を構築するサーバ側のページ中のプログラミングモデル

BlazorはMSが出しているフレームワークJavaScriptでフロントを書かず、C#と.netでフロント、バックエンドが書けるのが特徴。

Razor pagesはASP.net Core構築の方法です。

MS Learnでは

  • 動的 Web UI を生成したい。
  • ページに重点を置いたアプローチを優先する。
  • 部分ビューでの重複を減らしたい。

ときに利用すると記載がされていたが、Copilotだと

概要: Razor PagesはASP.NET Coreの一部で、ページ指向のアプローチでWebアプリケーションを構築します。各ページは専用のC#コード(ページモデル)とビュー(HTML)で構成されます。

レンダリング方法: サーバーサイドレンダリングSSR)を採用しており、サーバー側でHTMLが生成され、クライアントに送られます。

主な特徴:

  • 使いやすく、従来のサーバーサイドWebアプリケーションに適している。
  • 初期ロードが速く、SEOに対応しやすい。
  • 比較的静的なページや動的部分が少ないアプリケーションで便利。

用途: 伝統的なWebアプリケーション、ブログ、企業の紹介サイトなど。


複雑な画面ではなく、静的画面が多く、サーバサイド側で処理をさせたいときに利用かと。

利用するにあたって、タグは重要みたい。 cshtml側で、タグヘルパーを利用して、サーバサイド機能を埋め込むことでプレゼンテーション側の記述を簡潔にできる。

実際にLearnのデモで記述してみましたが、サンプルのおかげか、ローカルでのWebサーバ起動はdotnet watch でできるし、ソースを保存した段階で、差分をとって、画面に反映してくれるしでえらい便利だなと。

普段WPFで開発・保守をしている身とすると、こんなに.net周りって進んでいたのか・・・と思うくらい、衝撃を受けた。

ゼロからファイルを起こしてやったほうがいいのか、コマンドでテンプレートを作ってからやったほうが効率、保守性がいいのか。学習しながら覚えていくものとする。

【メモ】ASP.NETの学習3(ミドルウェア)とIoC

HTTPによる動作についての学習

learn.microsoft.com

learn.microsoft.com

サービスの有効期限

とここんだ内容の有効期限が以下の三つあるみたい。

  • シングルトン ・・・ アプリ起動時に一回作成。アプリ起動中変化しないサービスならここで。
  • スコープ ・・・ 受信したときに作成され、要求完了時に破棄。要求ごとに作り直す必要があるならこれで。
  • 一時的 ・・・ ステートレスサービスに適している

上記のサービスの有効期限の依存は気にする必要あり。 ASP.NET Coreはこの依存関係の誤りをチェックしてくれるらしい。

演習では例が上がっている。

例えば、シングルトンでアプリ起動時に取得した内容を画面に表示した場合、画面をリロードしても値が変わらないということ。

  • スコープはリロードすると日付は異なる。ただ、GUIDは同じ。
  • 一時的にすると、リロードのたび、GUIDも変わる。

つまりは同じGUIDで使いまわすのか、再度利用するかの違い。

リロードしても値が変わらない

スコープはリロードすると値が変わる

using WebApplicationIoC.Interfaces;
using WebApplicationIoC.Services;

var builder = WebApplication.CreateBuilder(args);

// builder.Services.AddSingleton<WelcomeService>(); //Singleton
builder.Services.AddScoped<IWelcomeService, WelcomeService>();
var app = builder.Build();

// app.MapGet("/", () => "Hello World!");
// app.MapGet("/",  (WelcomeService welcomService) => welcomService.GetWelcomeMessage()); //Singleton

app.MapGet("/",  (IWelcomeService welcomService1,IWelcomeService welcomService2 ) =>
{ 
    string message1 = $"Message1 : {welcomService1.GetWelcomeMessage()}";
    string message2 = $"Message1 : {welcomService2.GetWelcomeMessage()}";
    return $"{message1}\n{message2}";

}); // Scope


app.Run();

【メモ】ASP.NETの学習2(ASP.NET 概要理解)

設定値の意味などを知る

learn.microsoft.com

サンプルに記載してあったが、WebApplicationBuilderに各々用意されているメソッド。 これらを用意することで、ASP.NET内に用意されている一般的にミドルウェアが追加されるようである。

var builder = WebApplication.CreateBuilder(args); //WebApplicationBuilder型が戻る
var app = builder.Build();

app.UseHttpsRedirection();  //HTTP要求をHTTPSにリダイレクト
app.UseRouting();  //要求をエンドポンとにマップするルーティングを有効にする
app.MapStaticAssets();  //HTML、CSS、JavaScript、画像、その他のアセットなどの静的ファイルの配信を最適化
app.UseAuthentication();  //認証機能を追加
app.UseAuthorization();  //認可機能を追加
app.MapGet("/", () => "Hello World!");
app.Run();

【メモ】ASP.NETの学習1(VS Code でのASP.NET構築準備)

MS Learnのこのサイトに従って実施

learn.microsoft.com

1..NET環境の整備

Visual Studio 2022 をインストールしていたが、VSCodeで環境を整えると記載があるため、やろうとするも、Java のプロジェクトしか表示されない。過去にAzure へのアプリ連携していたはず・・だけど、あれはVisual Studio だったかな。

ということで、

C#のキットをインストール

C# Dev Kit をインストールして実施

Create .NET Project のボタンが表示されるので、作成を行う。

2.各フォルダの説明

.csproj  WPFの時と同じ。プロジェクトのビルド方法や.netのターゲット指定

.sln

Dev Kitなどで作成するとこのファイルができるみたい。

obj

コンパイル時の中間生成物

launchSettings.json

applicationurl に ランダムのローカルポート番号が記載されたルートURLが指定される

Program.cs

//事前構成された規定値を使用してWebApplicationBuilderを作成
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World!"); //HTTP GET 要求を処理するエンドポイントを記載

app.Run();

ここは以下のことを設定する

  • ホストの構成:Web サーバーの設定を含め、ホストを構成します。

  • サービスの登録:データベース コンテキスト、ログ、特定のフレームワーク用の特殊なサービスなどのサービスをアプリの機能に追加します。

  • ミドルウェア パイプラインの構成:アプリの要求処理パイプラインを一連のミドルウェア インスタンスとして定義します。

  • 環境の構成:開発、ステージング、運用それぞれの環境固有の設定を設定します。

ということはアプリ全体に影響がある事柄はこのファイルにまとめるということかな? (ここは学んでいくうちにわかるのかも)

3. 起動

デバッグ実行すると、画面が表示されます。これで、asp.netの初起動が完了。

dotnet run ・・・全てつくりのして起動 dotnet watch ・・・ すでに作っているものを復元して起動。こちらのほうが早い

MS Learnより

  • アプリケーションをホット リロードする: 可能な場合、dotnet watch は完全なリビルドを必要とせずに、実行中のアプリケーションに変更を適用します。
  • アプリケーションをリビルドする (必要な場合): 変更をホット リロードできない場合、dotnet watch は自動的にアプリケーションをリビルドして、ユーザーが行った変更を組み込みます。
  • アプリケーションを再起動する (必要な場合): 完全なリビルドが必要な場合、dotnet watch はアプリケーションを再起動します。

つまり、以前のものから起動するのではなく、変更がある場合はほっとリロードではなく、アプリをリビルトし、再起動するようである。