OmniAICreator/Qiita-1.07M huggingface dataset:
【自己流】プロジェクトマネジメントにおける定例会の役割とその進め方

こんにちは。Kaneyasuです。
re:Invent 2024に参加して帰ってきました。
参加のためにスケジュール調整、特に定例会の調整したのですが、その中で、そういえば定例会の進め方については誰にも教えてもらったことがなく、探り探りでやってきたことを思い出しました。
自分のやり方を書き残しておくと、誰かの役に立つかもしれないと思ったので記事にしてみます。

## 前提条件

本記事で想定しているプロジェクトは以下の条件を満たしているものとします。

- プロジェクトはウォーターフォール型でもアジャイル型は問いません。
- 各タスクや課題はチケット管理ツールまたは表計算ソフトで管理されている。

## 定期的に人が集まって話すことを定める意味とは

そもそも定例会は何のためにするのか、ということから考えてみます。  

毎日、週一、月一、 単位は様々でしょうが定期的にミーティングすることを定めたものを定例会だとします。
スクラム開発であれば、デイリースクラムなども定例と言えるでしょう。
定例会を設ける意味としては、以下のものがあると思います。

### 関係者が多忙なので、スケジュールを先立って確保しておく

プロジェクト進行を円滑に進めるには、影響力の大きい人を巻き込む必要があります。
しかし、影響力が高い人はどスケジュールが難しい傾向にあるので、その人たちとのスケジュール調整をしていると、ミーティングの開催が難しくなります。

### 定期的な報告の場を作ることで、プロジェクトにある程度の緊張感を持たせる

定例会では、進捗報告や課題報告が行われます。  
進捗報告においては、少なくとも報告内容には根拠が必要です。  
例えば進捗をパーセンテージで表現していたとします。
あるタスクを100％と報告するならば、少なくともそのタスクは綺麗に終わらせないといけません。  
一度報告した進捗が下がることは、進捗報告の信憑性を失わせることになるからです。  
進捗に変更がない状況が続くと、プロジェクトに対して何らかのアクションを求められることもあります。  

このように定例会用で報告するために、進捗に根拠を持たせたり、変化があることを見せようとする努力がプロジェクトに緊張感を持たせます。
逆に緊張感がないプロジェクトは、各タスクがずっと80％で停滞しているなど、責任感の欠如が現れる可能性があります。

### 続けて、比較しないと見えてこない

人がものの良し悪しを理解するには、何かと比較する必要があります。
プロジェクトも同じです。
進捗の％、残課題の数、メッセージに対する返信など、これらの変化・または変化してないことを見て初めて何かを見出すことができます。
定例会でこれといって議論することがなくとも、ひとしきり状況を共有することは必要です。
変化がないこと自体が状況を表している、または状況が見えてないと言えることがあり、そこから議論が生まれる可能性があります。

### 大事な話はそこですれば周知が効率的という空気を作る

共有するための場が用意されているというのは重要です。
定例会で共有すれば効率がよいと思ってもらえれば、無駄なコミュニケーションが減り効率化が図れます。
逆に共有の場がないと、声が挙げられずアラートが見えなくなることが考えられます。

タスクや課題をチケットで管理している場合、テキストベースでのやり取りでは解決が難しいと感じたら、詳細は定例会会話しましょうと提案する選択肢があります。
実際に定例会で会話したら、その結論をチケットに記載しておくと、記録にもなります。
この場合、経緯は議事録に残るでしょうから、必ずしも経緯までチケットに記載する必要はありません。

## 定例会の進行

システム開発のプロジェクトにおいて、定例会の司会は一般的にプロジェクトマネージャーが担当しますが、慣れてないとかなり負担がかかります。
理由としては、報告することがないと思えてしまうのと、忙しい中集まってくれているというプレッシャーなどが挙げられます。

### アジェンダは型を決める

毎回の定例会のアジェンダを型のように固めておくと、定例会の進行はだいぶ楽になります。
定例会の枠が1時間だとすると、以下のようなアジェンダが考えられます。

例）
- 進捗報告（10分）
    - 全体進捗
    - 変化したタスク・遅延しているタスク
    - 今後のスケジュールへの影響
- 重要タスクの確認（10分）
- 課題共有（15分）
    - 変化があった課題の共有
    - 停滞している課題の状況確認
- その他の議論（10分）
- 次回定例までの重要タスクの決定（5分）
 
これで50分です。
どこかで盛り上がる可能性を加味すると、アジェンダはこれぐらいでよいかと思います。

### 進捗報告はプロジェクトマネージャーが行う

進捗報告は、プロジェクトマネージャー自らが行います。
良いことも悪いことも報告する姿勢を貫いた方が、信頼を得やすくなります。

### 課題の共有は起票者・編集者に投げる

課題の共有は、プロジェクトマネージャーが全て行わず、課題の起票者／最後の編集者に共有をお願いした方がよいでしょう。
プロジェクトマネージャーの負担を減らすとともに、参加者が傍観者になるのを防ぐ効果があります。

停滞している課題の状況確認も忘れないようにし、起票者／最後の編集者に共有を依頼します。
停滞している課題は、誰もボールを持っている認識が可能性や、解決が困難な問題が発生している可能性があります。
逆に理由もないのに停滞しているなら、定例会を利用してみんなの前で強制的に進めるか完了にした方がよいです。
無駄に残っている課題は見通しの悪さに繋がります。

### 議論が収束しない場合は、時間を区切る

課題について議論していると、収束しないことがあります。
これは、課題についての準備不足や、新たな情報が出てきたことに起因することが多いです。
この場合、時間を区切って、別枠で議論したり、次回に持ち越すことを提案します。
時間の守られない会議は、参加者のモチベーションを下げる原因になります。

### 重要タスク (TODO、ネクストアクション)

定例会の最後には、次回までにやるべき重要タスクを決めます。
重要タスクは、TODOリストやネクストアクションと言うこともあります。
基本的にタスクはチケット管理か表計算ソフトで管理されているはずですが、参加者の中には立場上そこまで詳しく情報を追えない人もいるでしょう。
得てして、要件の確認やスケジュール調整には、そのような人たちが重要になることが多いので、強調する意味でも重要タスクを決めることは重要です。
経験上、重要タスクは次の定例会の最初の方で触れるようにしておくと、放置される確率が下がると思います。

---

以上です。
本記事が誰かの役に立てば幸いです。
【Power BI】 ライブ接続時にDaxを確認できるようにする


# はじめに
 　この記事は、Microsoft Power BI Advent Calendar 2024 シリーズ2の12月14日の記事です。
  
   https://qiita.com/advent-calendar/2024/powerbi
  
  
# ライブ接続とは？
　Power BIを企業内で広く展開する時には、セマンティックモデルとレポートを分離することがベストプラクティスとされています。

https://learn.microsoft.com/ja-jp/power-bi/guidance/powerbi-implementation-planning-usage-scenario-managed-self-service-bi#scenario-diagram

　このシナリオでは自ずと共有されたセマンティックモデルにライブ接続をしてレポートを作成することになります。
 
# 困ったこと
　**ライブ接続ではメジャーの定義が見えない…💦**
 　※レポート作成者がDAXの内容を知らなくてもいいことも多いかもしれませんが、モデル作成者もデバッグ含めて確認したいんですよね。

# 解決方法
　メジャーの「説明（Description）」でDAXの内容を確認出来るようにしよう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783030/47bf889e-419c-1bb3-af5a-29cd181b75e6.png)
 
## Talular Editorスクリプトを使用して一括設定

　1.　無料のTabular Editor v2をダウンロードしてインストール

https://www.sqlbi.com/tools/tabular-editor/

　2.　Power BI デスクトップの外部ツールからTabular Editorを起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783030/00c802cb-bb52-887f-81f9-c93225dca09c.png)

　3.　C#Scriptタブから以下のコードを貼り付けて、`run script`を押下

```csharp
//全てのメジャーの式を説明欄にセットする。
foreach(var m in Model.AllMeasures)
{
    m.Description = m.Expression;
}
```
これですべてのメジャーの定義が説明欄（Description）にコピーされました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783030/21f3825a-3474-d873-a386-9f5a635603e6.png)

4.　最後に `file`⇒ `Save`でモデルに反映します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783030/2453c0be-5f78-01ef-80a5-5fd07a3f7d0b.png)

# おわりに
　メタデータはCopilotがモデルの理解を促進するために使用すべきという観点もあるなと思いながら、今回は利便性の観点でTabular Editorを使って１つのローカルのPbixファイルの説明欄を更新する手順を紹介しました。

 Fabric NotebookとData pipelineを使用してPower BIサービスに発行されている複数のセマンティックモデルを一括で更新する方法にもチャレンジをしました。
 以下に投稿しています。

 https://qiita.com/fumiki-k/private/0eee770c4a97aec45e87
 

こちらに継続参加中です。

 https://powerbi.connpass.com/
atcoder練習(2024.12.08)

改めて自分が初心者なのかどうかを検証する意味で「AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～」を解く。これができれば、初心者よりちょっと一歩先にいることは確かだ。

https://qiita.com/drken/items/fd4e5e3630d0f5859067


# 問題1
全体的に長くなるので割愛。要約されたものが↑のリンクに記載されている。

# 回答
```Python
a, b = map(int, input().split())

if a*b % 2 == 0:
  print("Even")
else:
  print("Odd")
```

# 備考
- これはやったことある。提示されているものとアルゴリズムは同じだから問題ないと思う。

# 問題2

# 回答
```Python
s = input()
k = 0

for i in s:
  i = int(i)
  k += i
print(k)
```

# 備考
- これも比較的簡単にできた。
- ただし、提示された回答を見ると、forを使ってない。確かにforがなくてもかける。この場合だと全探索でいける。確かにforの方が汎用性は高いが、汎用性を志向する必要はない。問題に対して過不足なく処理することができれば、それで十分


# 問題3

# 回答
```Python
import numpy as np

n = int(input())
a = list(map(int, input().split()))
a = np.array(a)
k = 0

while np.all(a % 2 == 0):
    a = a / 2  
    k += 1

print(k)
```

# 備考
- 初めてnumpyを使った。pythonだけでやると、a[i]みたいな感じでforループがかなり多くなって、実行時間が超過した。ライブラリ便利だな。
- 一方で描き終わったタイミングで気づいたけど、pythonだけでもanyである程度同じように書ける。やっぱり知っていることは大事。そしてその知識と動作を正確に結びつけることが重要。
AndroidStudio リストやドロップダウンリストの作成

## 表示用の文字列リストを作成する
**string.xml**を開く
app → res → values → string.xml
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953063/9ea7cf8f-0c4a-65a2-d815-14a57fafa734.png)

:::note info
## リスト用の文字を追加する
<<foo>string-array name="リストの識別名">
     <<foo>item>追加するアイテム<<foo>/item>
<<foo>/string-array>
:::

~~~html:追加後 strings.xml
<resources>
    <string name="app_name">TestApplication</string>
    <string-array name="Test_list">
        <item>あいうえお</item>
        <item>かきくけこ</item>
        <item>さしすせそ</item>
        <item>たちつてと</item>
        <item>なにぬねの</item>
    </string-array>
</resources>
~~~

## リスト／ドロップダウンリストの配置
~~~xml:追記後　activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <ListView
        android:id="@+id/TestList"
        android:entries="@array/Test_list"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        />
    <Spinner
        android:id="@+id/TestSpinner"
        android:entries="@array/Test_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
</LinearLayout>
~~~
| タグ | 種類 |
|:-:|:-:|
| ListView | リスト |
| Spinner | ドロップダウンリスト |

:::note info
## android:entries="@array/文字リスト"
文字リストはstring.xmlで作成した
string-array name="**この部分**"を指定する
そうすることで作成したリストに反映される。
※反映されるのは実行時、レイアウト画面は未反映
:::
リストビューの
android:layout_height="150dp"と指定しているのは
wrap_contentを指定するとアイテムの数だけ画面いっぱいに表示されるため
## 実行
![携帯.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953063/f784a6e8-e1c1-1462-3929-6e560e670836.gif)
Windows環境でTauriアプリを作成する

# Windows環境でTauriアプリを作成する

Windows環境で、Tauriのセットアップと開発方法をまとめます。

## Tauriとは

Tauriは、軽量でセキュアなデスクトップアプリケーションを作成するためのオープンソースのフレームワークです。主にRust言語をベースに構築されており、RustとWeb技術を使用してクロスプラットフォームのネイティブアプリを開発できます。

## Electronとの違い

似たようなフレームワークとして、Electronがありますが、ElectronとTauriには以下のような特徴があります。

##### セキュリティ
  Tauriはフロントエンドとバックエンドの分離が強力で、必要なAPIだけを公開することで攻撃面を最小化する工夫がされています。
  また、ネイティブ部分にはRustのメモリ安全性が活用できます。  

##### アプリサイズの軽量化
  TauriはRustとOS固有のWebViewを利用しており、Electronと比べて生成されるアプリのバンドルサイズが非常に小さくなっています。
  また、消費リソースも低減できます。  

##### 柔軟性
  Tauriはモジュール性が高く、必要に応じてネイティブ機能をRustで実装できます。
  また、フロント部分にはReactやVueといったJavaScriptフレームワークのほかに、Rustのフレームワークを使用することもできます。
  そして、V2.0からはモバイル端末も正式対応となり、AndroidやiPhoneアプリも作成することができます。  

ただし、エコシステムの成熟度や採用実績などではElectronに及ばない面もあります。

## 環境セットアップ

Tauriは開発時にMicrosoft C++ Build ToolsとMicrosoft Edge WebView2を使用します。
なので必要な依存関係をインストールします。
また、必要に応じてRust、Node.js、モバイル開発ツールをインストールします。

### Microsoft C++ Build Tools

[Microsoft C++ Build Toolsインストーラー](https://visualstudio.microsoft.com/ja/visual-cpp-build-tools/)をダウンロードしてインストールします。
インストール中に、「C++ によるデスクトップ開発」オプションをチェックします。

### WebView2

Windows10(バージョン1803以降)のWindowsには、すでにWebView2がインストールされているため、WebView2のインストールは不要です。
インストールされていない場合は、以下からインストールします。

[Microsoft Edge WebView2](https://developer.microsoft.com/en-us/microsoft-edge/webview2/?form=MA13LH#download-section)

### Rust

以下のコマンドでインストールします。

```PowerShell
winget install --id Rustlang.Rustup
```

デフォルトツールチェーンをMSVCに設定します。

```PowerShell
rustup default stable-msvc
```

### Node.js

以下のページからインストールします。
[Node.js](https://nodejs.org/en/)

### モバイル開発ツール
必要ならば、以下に従いモバイル開発ツールをインストールします。

#### Android

https://v2.tauri.app/start/prerequisites/#android

#### iOS

https://v2.tauri.app/start/prerequisites/#ios

## アプリ作成

必要な依存関係のインストールが終わったらアプリを作成していきます。

以下のコマンドでプロジェクトを作成します。

```PowerShell
npm create tauri-app@latest
```

プロジェクト名とbundle identifierを入力します。

```
? Project name (tauri-app) ›
? Identifier (com.tauri-app.app) ›
```

フロントエンド（UI）開発言語を選択します。
フロントエンドの開発には、JS/TSのほかにRust、.NETも選択できます。
今回はJS/TSを選択します。

```
? Choose which language to use for your frontend ›
❯ TypeScript / JavaScript  (pnpm, yarn, npm, deno, bun)
  Rust
  .NET
```

JS/TSを選択した場合、使用するパッケージマネージャーを選択します。
```
? Choose your package manager ›
❯ npm
  pnpm
  yarn
  deno
  bun
```

UI開発で使用するフレームワークを選択します。
現在JS/TSでは以下のフレームワークを使用できます。
今回はReact/JSを選択します。

```
? Choose your UI template ›
  Vanilla
  Vue
  Svelte
❯ React  (https://react.dev/)
  Solid
  Angular
  Preact

? Choose your UI flavor ›
  TypeScript
  JavaScript
```

また、他の開発言語は以下のフレームワークを使用できます。

Rust
- Vanilla
- Yew
- Leptos
- Sycamore

.NET
- Blazor

プロジェクトフォルダに移動して、以下のコマンドを入力し、アプリを起動します。

```
npm install
npm run tauri dev
```

正常に起動すると以下のような画面が表示されるはずです。  
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406753/e6003e69-2be0-912f-36f6-6ccb74ba1e7f.png)


以上でプロジェクトの作成は完了です。  
手順にすると量は多いですが、エコシステムやドキュメントがしっかりしており、インストールはすんなり進みます。
これからはデスクトップ・モバイルアプリの開発の選択肢としていいかもしれません。
Autocomplete

```ts
import React, { useState } from "react";
import { Autocomplete, TextField } from "@mui/material";

interface AutocompleteItem {
  itemId: number;
  itemName: string;
}

const App: React.FC = () => {
  // オプションデータ
  const options: AutocompleteItem[] = [
    { itemId: 1, itemName: "Apple" },
    { itemId: 2, itemName: "Banana" },
    { itemId: 3, itemName: "Cherry" },
  ];

  // 初期選択値 (例: Banana を選択状態にする)
  const initialValue = options[1]; // { itemId: 2, itemName: "Banana" }

  // State管理
  const [selectedItem, setSelectedItem] = useState<number>(initialValue.itemId);

  return (
    <div style={{ width: 300 }}>
      <Autocomplete
        options={options}
        getOptionLabel={(option) => option.itemName} // itemNameを表示
        isOptionEqualToValue={(option, value) => option.itemId === value.itemId} // 一意の比較
        value={options.find((item) => item.itemId === selectedItem) || null} // 初期選択
        onChange={(event, newValue) => {
          if (newValue) {
            setSelectedItem(newValue.itemId); // itemIdをStateに保存
          }
        }}
        renderInput={(params) => (
          <TextField {...params} label="Select an item" variant="outlined" />
        )}
      />
      <div style={{ marginTop: 16 }}>
        <strong>Selected Item ID:</strong> {selectedItem}
      </div>
    </div>
  );
};

export default App;
```
一つのファイルに２つのクラスの評価をする

Shared examples group included in two groups in one file

### groupとはテストされるクラスのこと、contextで評価される
>Under the hood, an example group is a class in which the block passed to describe or context is evaluated. The blocks passed to it are evaluated in the context of an instance of that class.

https://rspec.info/features/3-13/rspec-core/example-groups/basic-structure/#:~:text=Under%20the%20hood%2C%20an%20example%20group%20is%20a%20class%20in%20which%20the%20block%20passed%20to%20describe%20or%20context%20is%20evaluated.%20The%20blocks%20passed%20to%20it%20are%20evaluated%20in%20the%20context%20of%20an%20instance%20of%20that%20class

>Given a file named “collection_spec.rb” with:
```rb
require "set"

RSpec.shared_examples "a collection" do
  let(:collection) { described_class.new([7, 2, 4]) }

  context "initialized with 3 items" do
    it "says it has three items" do
      expect(collection.size).to eq(3)
    end
  end

  describe "#include?" do
    context "with an item that is in the collection" do
      it "returns true" do
        expect(collection.include?(7)).to be(true)
      end
    end

    context "with an item that is not in the collection" do
      it "returns false" do
        expect(collection.include?(9)).to be(false)
      end
    end
  end
end

RSpec.describe Array do
  it_behaves_like "a collection"
end

RSpec.describe Set do
  it_behaves_like "a collection"
end
```
* 実際にやってみて二つのテストは通った


>When I run rspec collection_spec.rb --format documentation
>
>Then the examples should all pass
>
>And the output should contain:
```
Array
  behaves like a collection
    initialized with 3 items
      says it has three items
    #include?
      with an item that is in the collection
        returns true
      with an item that is not in the collection
        returns false

Set
  behaves like a collection
    initialized with 3 items
      says it has three items
    #include?
      with an item that is in the collection
        returns true
      with an item that is not in the collection
        returns false
```

https://rspec.info/features/3-13/rspec-core/example-groups/shared-examples/#:~:text=in%20that%20file.-,Shared%20examples%20group%20included%20in%20two%20groups%20in%20one%20file,with%20an%20item%20that%20is%20not%20in%20the%20collection%0A%20%20%20%20%20%20%20%20returns%20false,-Providing%20context%20to
ifでbool?を入れるときは3値の可能性があり、nullの扱いに注意

# はじめに
C#でプログラミングをしていると、bool?型（Nullable型のbool）をif文に渡すケースがあります。この場合、三値論理（true/false/null）を意識しないと、予期せぬ挙動やバグにつながる可能性があります。本記事では、bool?をif文で使用する際の注意点と、その適切な扱い方について解説します。

# bool?が取る値
bool?は、Nullable<bool>の糖衣構文で、true、false、**null**の3つの状態を持つ型です。nullは「値が未設定」や「状態が不明」を表す場合に使用されます。

# ifにTrueでもFalseでもなくnullが判定基準の場合は？
C#ではif文の条件文にnullをそのまま入れるとfalseになります。
これは、たとえif文のelse句に入ったからといって、条件文の結果がfalseなのかnullなのか判断できないことになります。

# 明示的にnullを扱う方法
nullを明確に区別する場合は、nullableBoolを直接if文に渡すのではなく、条件分岐を明示的に記述する必要があります。
```C#: nullable.css
bool? nullableBool = null;

if (nullableBool == true)
{
    Console.WriteLine("Condition is true.");
}
else if (nullableBool == false)
{
    Console.WriteLine("Condition is false.");
}
else
{
    Console.WriteLine("Condition is null.");
}
```

簡潔に書くのであれば、 __三項演算子__ や __??(null合体演算子)__ 、__switch文__ を使用してもよいでしょう。

# 終わりに
nullは「値が存在しない状態」または「参照が設定されていない状態」を示すので、メモリ管理の経験が少ないと感覚が掴みにくいですが、if文などの条件文で関係してくる場合は気をつけなくてはいけません。
エンジニアに転職して3年が経ちました

# 3年目にやったこと

エンジニアに転職して3年になりました。40歳になったおじさんの月日の経過は早いものです。
この1年は、昨年から始めたセールスフォース導入サポートにさらに注力し、[Salesforceコンサルティングパートナー](https://o-kun.com/blog/dtorqjk99)にも登録・認定していただくことができました。

またそれに伴い、スクラッチ開発だけでなく、セールスフォースなどのクラウドサービスカスタマイズによるシステム化をソリューションとして提示できることは、会社としての提案の幅も広がり、クライアントの選択肢を増やすことができると思っています。

（過去記事）
   - [エンジニアに転職して３週間が経ちました](https://qiita.com/to-nakashima/items/036911e186b2acd115eb)
   - [エンジニアに転職して1年が経ちました](https://qiita.com/to-nakashima/items/dce24aa75ce5c5844787)
   - [エンジニアに転職して2年が経ちました](https://qiita.com/to-nakashima/items/90e62c2da69717198944)


# エンジニアにはなれたけど、どこへ向かえばいいのだろう？
エンジニアになって1年半くらい経った頃、自身のエンジニアとしてのキャリアに悩んだことがありました。周りを見渡せば、開発好きな優秀な猛者ばかり。一方、開発が嫌いではありませんが、猛者たちに勝てる（同じ熱量を持てる）気が全くしません。

卑下や後ろ向きでなく、冷静かつ前向きに、この事実・感情に向き合い、自身の向かうべき方向性を真剣に考えなければいけないなと思いました。

その際に、助けとなった考え方を2つ紹介します。

- やりたくないこと・苦手なことから逆算して考える

   - やりたいことってすぐ浮かびますか？私はやりたいこと起点で考えても、あまり考えが浮かびません。むしろ、やりたくないことから逆算して考えることで、結果として快適な環境を引き寄せているなと感じます
       - 例えば、
           - 【やりたくないこと】先が予測できてしまう環境（大企業など）
            →【逆算して考える】将来どうなるか分からないワクワクする環境（ベンチャーなど）
           - 【やりたくないこと】旅行の際に家賃が埋没コストとなる
            →【逆算して考える】[アドレスホッパーになる](https://www.youtube.com/watch?v=_PnB9GSHHb4)
           - 【苦手なこと】デザイン性や改善の発想が求められる、UI/UX関連業務
            →【逆算して考える】要件整理や資料作成、もしくはセールスフォース導入サポート（ノーコーディング）などの業務
- ニッチ戦略・ポジションを考える

   - やりたくないこと・苦手なことにも繋がるのですが、私は誰かに勝ちたい・負けたくないという意識が昔から希薄です。なので、既に他の人がやってくれていることで、それ以上のバリューを発揮できるイメージが湧きません。よって、①人と被らないことかつ②自分がわりと好きと思えることを探す方が、価値を発揮できることが多いように思います
       - 例えば、
           - 【他の人がやってくれていること】スクラッチ開発
            →【人と被らないこと】geekな人があまり興味を持たない、セールスフォースなどのノーコード開発
           - 【他の人がやってくれていること】最新技術のキャッチアップ、AWS関連資格取得など
            →【人と被らないこと】セールスフォース関連資格取得など

上記のように考えていく中で、セールスフォース関連業務という領域に出会い、ゆくゆくは会計事務所に特化した業務管理ツールを、セールスフォースアプリとして展開していきたいと考えています。
エンジニアをばりばり極めたい人にとっては、全く役に立たない内容ですが、そうでない誰かにとって、こんなキャリアプランの見つけ方もあるんだと思っていただけたとしたらとてもうれしいです。
ロールモデルって誰だろうというぼやき

Advent Calendar 2024の23日目です。

ということで以下の記事を見て思ったこと。

https://konifar-zatsu.hatenadiary.jp/entry/2024/09/27/014657

今の会社に転職してきてからロールモデルってのが見つかっていない。

というのも、周りが賢くてなれる人のイメージがわいていないのと、やってきたことの技術領域が違いすぎて多分ロールモデルがいない。

個人的に、技術領域とがっててもマネジメント力低い人というかリーダーシップない人には魅力感じないし、

かといってマネジメント力高いけど人間性的にドライな人もあまり好きじゃないので、

一個だけ誰にも負けない技術領域があってマネジメント力もそれなりにあって、かつ飲みに行って楽しい人がロールモデルになりがち。

フルスタック系の人は逆になれる気がしないのでロールモデルからはかなり外れる。

今までそういうロールモデルになる人と出会ったの2人くらいしかいない（飲みに行って楽しい人には大量に出会ってきてるのでいい社会人人生を送れている）。

どういう人がロールモデルになるのか、年齢的にも再度考えてみたいと思う今日この頃。
女性エンジニアを目指して：未経験者の視点で考える現状と魅力

## はじめに
私は現在エンジニアを目指して学習中の未経験者です。
アドベンドカレンダーの下記カレンダーに参加したのでこちらをふまえた上で記事を書いていこうかと思います

https://qiita.com/advent-calendar/2024/panasonic_connect

## 女性エンジニアの数
エンジニアという職業は、性別や年齢を問わず挑戦できる世界ですが、女性の割合はまだまだ少ない現状です。下記記事の女性エンジニアの数は2021年度の調査となっていますが現在も20％台であるといわれています。

https://coeteco.jp/articles/11074

私自身求人等を見ていても男性の方が多いイメージですし、上の年代になればなるほど、男性の方がおおく、管理する立場の方も男性陣。結婚や出産とライフスタイルの変化が大きい立場であるからこそ、不安に感じている部分があることは否定できません。

## 女性エンジニアの素晴らしさとは？
女性エンジニアを目指す身として、マイナス部分も知っておくべきだけどプラス部分をもっと知っていこうと思います。
※あくまで個人的見解です。

1. 柔軟な視点で課題を解決できる
女性エンジニアの方々がプロジェクトに参加することで、チーム内に多様な視点が生まれる、と思っています。どの業界でもいえるようなことですが、日常生活の中でも、細やかな気配りができているなと感じるのは女性の方が多いと感じています。

2. ロールモデルの存在
SNSやブログなどで活躍されている女性エンジニアの方々の記事を読むたびに、「私もこうなりたい！」という気持ちが湧いてきます。彼女たちの成功談や努力の過程を知ることで、自分の目標が明確になり、学ぶ意欲が湧いています。
👇下記記事の方は育休復帰をされていてすごいと感じました。

https://www.itmanage.co.jp/recruit/member/female-engineer-interview/


3. 技術と生活の両立
家庭や育児と両立しながら、フレキシブルな働き方を実現している女性エンジニアの話も耳にします。エンジニアという仕事は、リモートワークやフレックスタイムを活用しやすい職種でもあり、多様な生き方を支える点で大きな魅力を感じています。


## 女性エンジニアを増やすためにできることってなんだろう
1. エンジニアの仕事を知る機会を増やす
学校や地域でのプログラミング教育を推進し、女性が若い段階でエンジニアという職業に触れるきっかけを増やす。
2. ロールモデルの可視化
SNSやメディアを通じて、活躍する女性エンジニアのストーリーを発信することで、「自分にもできる」と思える環境を作る。
3. 学びやすい環境の整備
未経験からエンジニアを目指す人に優しい学習コンテンツや支援プログラムを拡充する。


## おわりに
私はまだエンジニアとしてのスタートラインに立ったばかりですが、女性エンジニアの方々が未来の自分の姿を映してくれるように感じています。
この記事を通じて、女性エンジニアのキャリアに少しでもポジティブな影響を与えられたら幸いです。そして、これから私自身がロールモデルの一人として、未来のエンジニアたちを応援できるようになりたいです！:sparkles:
いい感じの文節で自動的に折り返しを行うCSS

# はじめに
HP制作をしている駆け出しエンジニアです。
文章が変な箇所で折り返されて悩んだことはありませんか？

PC表示ではいい感じに改行されるのに、スマホで確認すると最後の一文字だけ改行されてしまうなど...

この問題をCSSの1つのコードだけで解決できると分かったので備忘録として残します📝

# 自動的に折り返しを行うCSS
CSSの`word-break: auto-phrase`を使います。
`word-break: auto-phrase`を利用すれば、自動的にいい感じの文節の位置で折り返しをしてくれます。
なので、レスポンシブデザイン対応がめちゃくちゃ楽になります!!

私はHP全体的に対応させたかったので`body`に対して`word-break: auto-phrase`を指定しました。

```css:style.css
body{
    word-break: auto-phrase
}
```

ちなみに、　`auto-phrase`を使うためにはHTMLに`lang='ja'`を指定する必要があります。
日本語であることを明示しておく必要があるためです。

参考になれば幸いです!!
モーダルの開閉状態が正しく反映されない問題と解決方法

## はじめに
モーダルの開閉状態に応じてCSSを切り替える処理を実装した際、期待通りの動作をしない問題が発生しました。本記事では、その事象の詳細と原因、そして解決方法について解説します。

## 前提
以下の条件下で発生した問題について取り扱います：

* `Modal` コンポーネントと `Contents` コンポーネントがそれぞれカスタムフックを用いて、モーダルの開閉状態を管理している
* `Contents` コンポーネントでは、`isOpenModal` の値によってモーダルの表示・非表示を制御
* `Modal` コンポーネントでは、`isOpenModal` の値によって適用するCSSクラスを動的に切り替える

実際のコードは以下の通りです。
```react
export const Contents = () => {
    const { isOpenModal, onClickOpenModal } = useContents()

    return (
        <button onClick={onClickOpenModal}>
        {isOpenModal && <Modal />}
    )
}
```

```react
export const Modal = () => {
    const { isOpenModal } = useContents()

    return (
        <div className={`${isOpenModal ? 'text-black' : 'text-white'}`}>
            <button>キャンセル</button>
            <button>送信</button>
        </div>
    )
}
```

## 問題
`onClickOpenModal`関数が実行されることで、`isOpenModal`が`false`から`true`に変化することを期待しています。しかし、Modalコンポーネントでは`isOpenModal`が常に`false`のままとなり、CSSが正しく切り替わりませんでした。

## 原因
`Contents` と `Modal` がそれぞれ別のインスタンスのカスタムフック (useContents) を参照していたため、状態が同期されていませんでした。この結果、`Contents` での状態更新が `Modal` に正しく反映されていなかったのです。

## 解決方法
`Contents`コンポーネントで参照している`isOpenModal`を`Modal`コンポーネントに対して引数として渡してあげると、`Contents`内のCSSの切り替え処理が期待通り動作します。
情報処理安全確保支援士試験(SC R6春)

:::note info
[今年取得した・挑戦した資格を共有したい！ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/exam)の8日目です。
:::

# 1. はじめに
 IT業界に入って、セキュリティマネジメント・基本情報までは取得できたけど、
 ここ数年応用情報が合格できなくて足踏みしていました。
 なんとか昨年の秋季試験で合格したので、高度試験にトライしました。

## 1.1 情報処理安全確保支援士試験を選んだわけ
*  セキュリティのスペシャリスト資格だったから
⇒仕事でセキュリティに触れることが多く、いままでの知識と経験を生かせると思ったから
* 春/秋の2回試験が行われるから
⇒春でだめでも秋がある！
* セキュリティを専門にした仕事を将来したいと思っていたから
⇒持っていると持っていないでは転職の時の印象が変わるかも


# 2. 試験概要
IPAの試験情報を確認してもらえればと思います。
https://www.ipa.go.jp/shiken/kubun/sc.html
ざっくり書くと、午前試験はマークシート方式・午後試験は記述方式。
それぞれ6割取れれば合格です。

# 3. 勉強方法
教本を１冊購入しました。（電子書籍)
こちらを選んだ理由は過去問Webアプリがついているからです！

https://gihyo.jp/book/2023/978-4-297-13813-4
教本を何周かしました。

##  3.1. 午前試験対策
午前Ⅰは免除されたので、午前Ⅱのみの受験だったのですが、過去問Webアプリでひたすら反復学習しました。

    ↓午前I免除については下記参考
    https://www.ipa.go.jp/shiken/about/koudo_menjo.html

##  3.2. 午後試験対策
教本の午後問題対策を読みながら、自分なりの対策を立てました。
IPAが公開している過去問はほとんどやっていないです。

    ・出題分野から自分が得意な分野を見極める
    →情報セキュリティマネジメントなどの分野については知見もあり経験もあったので、この分野の問題で点数を確実に取ろうと考えました。
    ・問題文の構成を把握する
    →ひたすら解法のテクニックを叩き込んでました。基本的には問題文から解答を導き出せばよいはずなので、問題の読み解きをミスらないようにはしようと考えてました。


# 4. 実際の勉強スケジュール
勉強開始は1月から教本を読み始めていました。
基本は教本を読んで、通勤中に過去問Webアプリで問題を解いていました。
試験直前も同じようなサイクルで勉強をしていました。

# 5. モチベーション維持法
精神論みたいになってしまうのですが・・・受験時は以下のようなことを考えていました。

    ・受かりたいという気持ちを強く持つ
    →当時は高度資格を持って転職活動を進めたいという強い気持ちがあったので、絶対受からなきゃという気持ちがありました。そのおかげか勉強をさぼらず継続できたと思っています。
    ・追いついてやるという気持ち
    →周りにホイホイ高度資格を持っている人がいたので、追いついてやる！という気持ちもありました。

「今受からなきゃいけない！」という気持ちを、焦りじゃなくてやる気に変えられたことがよかったと思っています。

# 6. おわりに

結果としては、午前も午後も<font color="Pink">6割ぴったり</font>で合格しました。
セキュリティを実際にシステムとして実装する経験がなかったため、完全にマネジメント分野で点数を稼ぎました。

### おまけ
今年の秋は、システム監査技術者試験を受験したのですが、午後Ⅱで時間が足りなくなってしまいました。
午後は時間を測って過去問やればよかったです・・・:cry:
BigQueryで「余剰Slot」のみを使うReservationを作成する

BigQueryをCapacity Compute pricingで使うときに、Slotという仮想的な計算資源(≒CPU)を使ってクエリの実行が行われます。

このSlotをいくつ確保するかによってBigQueryの費用が決まります。確保するSlotの数は固定値にすることも、負荷変動に応じてオートスケールさせることもできます。

https://cloud.google.com/bigquery/docs/slots

しかし、オートスケールで確保できるSlotの数は50slot単位かつ1分単位でしかないです。そのため、極端な例ですが1slotを1秒だけ使った場合には49Slot * 59秒が確保されたけれど使われていない状態になります。
このようなSlotをこの記事では余剰Slotと呼び、有効活用する方法について考えます。

余剰Slotが発生した場合には、管理プロジェクトを同一にする他のReservation内で「おすそわけ」が行われます。
そのため、余剰Slotがそのまま無駄になるわけではないです。

https://cloud.google.com/bigquery/docs/reservations-workload-management?hl=ja#managing_your_workloads_and_departments_using_reservations

ここで、以下のようなReservationを作成することを考えます。slot_capacityが0なので一見すると一切のクエリが実行できないようにも見えます。
しかし、先程説明した「おすそわけ」の効果によって、他のReservationで余ったSlotを使うことができます。

```terraform
resource "google_bigquery_reservation" "parasite" {
  project  = "<Project ID>"
  name     = "parasite"
  location = "US"

  slot_capacity     = 0
  edition           = "ENTERPRISE"
  ignore_idle_slots = false
  concurrency       = 0
}
```

クエリをこのReservationで実行することで、今まで無駄になっていたSlotを利用することができ、「実質無料」でクエリを実行できます。
しかし、この方法を採る場合、どの程度のSlotが使用できるかを事前に予測することは困難です。場合によっては一切のSlotを利用できない可能性もあります。
そのため、基本的には実行時間に対する制約の緩いクエリに対してのみ使用し、実行時間に対する要件が明確なクエリに対してはしっかりとSlotを確保して実行するほうが良いです。
varとwhenの使い方

最近のJavaでは、

```java 
3:    var var = var().var;
4:    switch (var) {
5:      case When when when when.when() -> when();
6:      default -> {}
7:    }
```

こういうプログラムが書けるようになります。(元ネタは[こちら](https://x.com/kthoms/status/1585560941999030273/photo/1))
Markdownが最新のJava言語に対応したいないためか、色の付け方に、少し変なところがあります。
そこで、このコードを、Java言語仕様(文法)的に考察してみます。ここでは、仕様として[Java SE 23のJLS](https://docs.oracle.com/javase/specs/jls/se23/html/index.html)を参照しています。
実際に動作する完全コードは[こちら](https://gist.github.com/kazumura/b22fd6f0e3052c1523f2f9150bf89bc8)。

## varの解説

3行目
```
var var = var().var
(1) (2)   (3)   (4)
```

(1) [ContextualKeyword](https://docs.oracle.com/javase/specs/jls/se23/html/jls-3.html#jls-3.9)の「var」。[JLS 1.4.4 Local Variable Declarations](https://docs.oracle.com/javase/specs/jls/se23/html/jls-14.html#jls-14.4)で定義されている「LocalVariableType」。
(2) 「var」というローカル変数名(identifier)。
(3) 「var()」という名前のローカルメソッド呼び出し。
(4) (3)で返却されたインスタンスのクラスに定義された「var」というフィールド名。

## whenの解説
5行目
```
 case When when when when.when() -> when();
 (5)  (6)  (7)  (8)  (9)  (10)      (11)
```

(5) [ReservedKeyword](https://docs.oracle.com/javase/specs/jls/se23/html/jls-3.html#jls-3.9)。
(6) 「When」という名前のクラス名。
(7) 「when」という名前の[パターン変数](https://docs.oracle.com/javase/specs/jls/se23/html/jls-14.html#jls-14.30)。変数の型は、(6)の「When」クラス。
(8) [ContextualKeyword](https://docs.oracle.com/javase/specs/jls/se23/html/jls-3.html#jls-3.9)。[JLS 14.11.1. Switch Blocks](https://docs.oracle.com/javase/specs/jls/se23/html/jls-14.html#jls-14.11) で定義されている「Guard」。
(9) (7)で定義した変数。
(10) 「When」クラスの「when」という名前のインスタンスメソッド呼出し。
(11) 「when()」という名前のローカルメソッド呼出し。

## なぜ、ややこしいのか？
こんなコードを書く人はいないと思いますが、このコードをややこしくしている原因は、ContextualKeywordにあります。ContextualKeywordとは、文脈によって、キーワードになったり、ならなかったりするというもので、JLS17で追加された言語仕様です。

```そんなにややこしいなら、ContextualKeywordなんかやめて、すべてReservedKeywordにすればいいだろ。```

という意見があるかもしれませんが、やたら新しくキーワードを増やすと、これまで動いていたコードが動かなくなってしまいます。互換性を重視するJavaならではの言語仕様の考え方です。
SME日記その9 OpenBLASのSME対応状況について調べる

ここまで調べて，ふと，OpenBLASやApple Accelerate FrameworkですでにSMEに対応している可能性に思い至り，まずOpenBLASに関して調査をしてみました．

SMEシリーズ

- [Apple Silicon M4はM3シリーズからScalable Matrix Extension (SME)命令などが足されている](https://qiita.com/zacky1972/items/69fd802fd41ae4d7d469)
- [SME日記その1: Apple Silicon M4に搭載されたScalable Matrix Extension(SME)のベクトル長(SVL)を取得する](https://qiita.com/zacky1972/items/231fd22a1fdef15d4108)
- [SME日記その2: Apple Silicon M4にはCVTW命令は備わっていない？](https://qiita.com/zacky1972/items/a4fc98614df085586175)
- [SME日記その3: Apple Silicon M4にどの命令が実装されているかをsysctl hwの実行結果とドキュメントから推測する](https://qiita.com/zacky1972/items/427035001554cb9768bc)
- [SME日記その4 Streaming SVE modeでCNTWを実行してみる．](https://qiita.com/zacky1972/items/3182fa1693983846205d)
- [SME日記その5 Streaming SVE modeでCNTWを実行してみる Part 2](https://qiita.com/zacky1972/items/b7b5dd456fe021b30eb2)
- [SME日記その6 Streaming SVE modeでsvcntw()とsvcntsw()を実行してみる](https://qiita.com/zacky1972/items/7d4ec630d54564ebb9b3)
- [SME日記その7 svcntw()とRDSVL命令の実行結果の関係性を考察する](https://qiita.com/zacky1972/items/48cf7577e254b8c3a0b6)
- [SME日記その8 __arm_new("za")について調べる](https://qiita.com/zacky1972/items/762b73b3414369d762ad)

## OpenBLASのChangelog.txt

https://github.com/OpenMathLib/OpenBLAS/blob/develop/Changelog.txt

- Version 0.3.28 8-Aug-2024
- Version 0.3.27 4-Apr-2024
- Version 0.3.26 2-Jan-2024
- Version 0.3.25 12-Nov-2023
- Version 0.3.24 03-Sep-2023
- Version 0.3.23 01-Apr-2023
- ...
- Version 0.1 alpha1 20-Mar-2011

SMEを検索しましたが見つかりませんでした．また，Scalable Matrix Extension でも見つかりませんでした．

Version 0.3.28に下記の記述を見つけました．

- added optimized SGEMV and DGEMV kernels for A64FX
- added optimized SVE kernels for small-matrix GEMM
- fixed potential miscompilation of the SVE SDOT and DDOT kernels
- fixed potential miscompilation of the non-SVE CDOT and ZDOT kernels

よって，OpenBLASの現行バージョン(Version 0.3.28)は，SMEに対応していない可能性が高く，これからSVE対応していくものと思います．
0.1+0.1+0.1は0.3じゃない

Advent Calendar 2024の12日目です。

## 0.1+0.1+01は0.3じゃない
まんまです。pythonでちゃんとDecimal.from_floatで値を見たことがなかったのですが、

```
Decimal.from_float(0.1) = 0.1000000000000000055511151231257827021181583404541015625
```

のようです。なのでこれを

```
0.3（実際は0.299999999999999988897769753748434595763683319091796875） == 0.1 + 0.1 + 0.1
```
するとFalseになるという話。

おわり。（これ毎日ブログ書いてる人マジですごいと思う。）
ハーフモーダル、実は半分じゃない！デバイスごとの違いと実測結果

こんにちは！株式会社ZOZOでショップスタッフ向けの販売サポートツール「FAANS」のiOSアプリ開発を担当しているイッセーと申します！

今回は業務の中で必要になった「ハーフモーダルの具体的な高さ」を調べた結果をまとめました。ニッチな内容にはなりますが、ハーフモーダルを使う実装で参考になれば嬉しいです。

## はじめに
FAANSでは、YouTubeショートのコメント表示画面のように、画面上部に動画やコンテンツを表示するハーフモーダル画面があります。レイアウトの都合上、ハーフモーダルの高さに応じて、画面上部のコンテンツの高さを動的に変更する必要がありました。



### 公式ドキュメントの定義

https://developer.apple.com/documentation/uikit/uisheetpresentationcontroller/detent/medium()

Apple公式ドキュメントを確認すると、iOSのハーフモーダル実装に使用されるUISheetPresentationControllerのDetentクラスにおけるmediumメソッドについて、以下のように記載されています。


> Creates a system detent for a sheet that’s approximately half the height of the screen ...

「スクリーンの高さの約半分」と定義されていますが、具体的な数値は示されていません。


## 検証方法
検証にあたっては、さまざまなiPhoneデバイスを用いて実際のハーフモーダルの高さを計測しました。


その際、各デバイスの画面高さを基準にして、ハーフモーダルが画面全体のどの割合を占めているかを比較しました。


## 結論
検証の結果、ハーフモーダルの高さは、デバイスによって若干の差異があるものの、おおよそ画面の **53%** であることがわかりました。公式ドキュメントの定義にほぼ沿った結果となりました。

以下は検証したデバイスごとの詳細です。
| デバイス | 割合 | ハーフモーダルの高さ | 画面の高さ |
|:-----------|:------------:|:------------:|:------------:|
| iPhone SE (2, 3 Gen) | 52.6% | 351 | 667 |
| iPhone 13, 14 | 53.9% | 455 | 844 |
| iPhone 15, 15 Pro, 16 | 53.2% | 453 | 852 |
| iPhone 15 Pro Max | 53.4% | 498 | 932 |
| iPhone 16 Pro | 53.1% | 464 | 874 |
| iPhone 16 Pro Max | 53.3% | 510 | 956 |

### 画面サイズが異なっても割合は一定

iPhone SEのような小型デバイスでも、iPhone 16 Pro Maxのような大型デバイスでも、割合はほぼ53%で一定でした。

また、画面が少し縦に伸びたiPhone 16 Proシリーズでも、ハーフモーダルの高さの割合は大きく変わりませんでした。

## まとめ
ハーフモーダルの高さは公式ドキュメントの記述通り「画面の約半分」とされていますが、正確には「約53%」であることが確認できました。

この調査により、すべてのデバイスで一貫した表示ができるようなハーフモーダルの実装をすることができました。
開いているレポートの自動更新、できる!

## はじめに

今年を振り返って、個人的に体感で良かったと感じたことのひとつは、インポートモードのセマンティックモデルが更新されると、見ているレポートが自動的に更新されるという点を理解したことです。

## レポートページの自動更新

自動更新の方法にはいくつかの選択肢があります。詳細については、以下のドキュメントを参照してください。

https://learn.microsoft.com/ja-jp/power-bi/create-reports/desktop-automatic-page-refresh?WT.mc_id=DP-MVP-5004418#considerations-and-limitations

この中で、特に注目すべきなのは、よく使われるインポートモードでの自動更新です。

[インポート モードを使用する場合の開いているレポートに対するモデルの更新の影響](https://learn.microsoft.com/ja-jp/power-bi/create-reports/desktop-automatic-page-refresh?WT.mc_id=DP-MVP-5004418#impact-of-model-refresh-on-open-reports-when-using-import-mode)

なんかすごい恐ろし気な見出しですが、書いてあることは心配するような内容ではありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/5c2e47e8-cc9c-919f-2880-2dff98e0c3fa.png)

自動更新が行われるのは、ワークスペースの所有者や書き込みアクセス権を持つユーザーに限られる点に注意が必要です。

## 確実な更新を確認した、Power Automateからの更新

検証した結果、セマンティックモデルの手動更新や定期更新では、自動更新がうまく動作しないことがありました。

しかし、Power Automateからの更新を利用すると、ほぼ確実に自動更新が行われることが確認できました。

Power Automateを使用したセマンティックモデルの更新に関しては、以下のメモも参考にしてください。

https://qiita.com/ishiayaya/items/9584b99d9063d866e3b3

## おわりに

いつも使っているインポートモードでもわかっていない部分がありました。
ドキュメントは随時更新されるため、一度確認した内容でも、定期的に更新がないかをチェックすることが重要です。見落としがないよう、常に最新の情報を確認しましょう。
🛤️ エンジニアとしての成長の記録①

# 🛤️ エンジニアとしての軌跡：私の挑戦と学び（2016-2024）
![1cc1d737d41baf4cb9779702833c35c9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942148/5be46f77-48ec-e424-8fb5-33c94f83c4a0.png)


こんにちは、Naotoです。Σ
私は2016年からエンジニアとしてキャリアをスタートし、多くのプロジェクトに携わってきました。その中で得た経験や教訓、苦労や喜びを振り返り、この記事で共有したいと思います。この振り返りが、同じエンジニアとして歩む皆さんに少しでも役立てば幸いです。

---

## 🌱 **駆け出しエンジニアの挑戦（2016年）**

私がエンジニアとして最初に手がけたのは、まったくの初心者からのスタートでした。当時、Javaを初めて学び、やっと `int` と `String` の違いを理解できるレベルでした。そんな中、SESを中心に活動する中小企業に入社し、最初の現場が決まったときはとても緊張したのを覚えています。

### **初の現場：C#との遭遇**
最初の現場で言われたのは「C#で開発しているので、ASP.NETを知っておいてください」という一言。慌てて本を買い、一生懸命勉強しましたが、3ヶ月で契約終了という結果に。。。自分のスキル不足を痛感し、大きな挫折感を抱きましたが、これが後の成長のきっかけとなりました。

### **Java案件での苦闘と成長**
その後、念願のJava案件に携わることができました。振り返れば、この時期がエンジニア人生の基盤を築く重要な期間だったと思います。順調に？成長し、それなりのコードが書けるレベルに到達。
- リーダー経験を通じたチームマネジメントの重要性。
- 決済システムでの厳格なテストの実施。
- クライアントとのコミュニケーションスキルの向上。
- 朝早く出社し、深夜に帰宅する日々（当時はリモートワークなど皆無）。  

これらを通じて「基礎から応用まで」を身につけることができました。このプロジェクトがあったからこそ、現在の自分があると言えます。

---
## 🔧 **新たなスキルとの出会い**
### **Spring Bootの衝撃**
長らくStrutsを使用していましたが、Spring Bootとの出会いは私にとって革命的でした。DIの概念や、MyBatis・DBFluteの利用など、新しい技術の魅力に触れることで、エンジニアとしての視野が一気に広がりました。

## ⚡ **中堅エンジニアとしての自覚（2020年）**
この頃になると、どのプロジェクトでも一人称で仕事を進められるようになり、少しずつ「エンジニアとしての自信」も芽生え始めました。

### **WordPressとの遭遇と苦悩**
CMS案件ではWordPressを初めて扱いましたが、特にCSS関連の課題に直面しました。レスポンシブデザインや色の調整に苦労し、「CSSはもう極めない」と誓ったことも（笑）。これらの経験を通じて、フロントエンドの奥深さを知り、エンジニアとしてさらに成長できたと思います。
- **CSSの苦労**：レスポンシブデザインや色の設定で悩み、「CSSは極めない」と心に誓いました。  
- **PHPの壁**：慣れない言語での開発は苦労しましたが、視野が広がるきっかけになりました。

### **Javaから広がる技術の世界/新たな挑戦へ**
Javaプロジェクトでは要件定義からリリースまで、すべての工程を経験しました。「プログラムとして正しい開発」を追求する中で、開発の効率化や品質向上の大切さを学びました。
Javaで培ったスキルをもとに、Node.js、Next.js、Nest.jsといった新しい技術にも挑戦しました。コンポーネント思考や関数型プログラミングも自然に受け入れることができ、プロジェクトの幅が広がると同時にチームとしての成果を実感できた時期です。
統合プラットフォームにも慣れ、ドキュメントを読み理解するスピードが飛躍的に伸びた時期でもありました。
慣れてくると楽しさやワクワクが勝ってきました(笑)

---

## 🌟 **エンジニア人生の分岐点（2024年）**
現在、私はエンジニアとして一定の自信を持ち、どのプロジェクトでも成果を出せる状態になったと感じています。ただし、「分からないことがなくなった」ことで、成長が止まっているように感じ始めました。
正しく言葉で表現するならば、仕事が「作業」になっている危機感を覚えました。

### **挑戦する勇気**
「成長が止まる＝挑戦がなくなる」という危機感から、今後は未知の領域への挑戦を恐れず、常に学び続ける姿勢を持ち続けたいと思っています。たとえば、AIやクラウドネイティブ技術など、**これまで手を出していなかった領域**に挑戦する予定です。

### **過去/未来へのメッセージ**
- 周囲の意見を大切にしてください。そのフィードバックは必ずあなたの糧になります。  
- 健康を過信せず、適度に休むことを忘れないでください。  

## 🧭 **おわりに**

この記事では、私のエンジニア人生の歩みを振り返りました。当時の挫折や成功、試行錯誤の過程を共有することで、少しでも皆さんの参考になれば幸いです。 
私自身は気づけば8年の時が過ぎ去っていました。要約で執筆しましたが、ディープダイブすると記載が多大になるため割愛しています。

もしこの記事が何かしらの気づきを与えることができたら、ぜひコメントやフィードバックをいただければ嬉しいです。これからも挑戦を続けながら、自分自身をアップデートしていきます。

最後に、これを機にX（旧Twitter）やFacebookで技術的な情報を発信する予定です。フォローいただければ幸いです！


### 記事のご紹介  
以下の記事もぜひご覧ください！

- [コードレビューとエビデンスの重要性](https://qiita.com/Z-Naoto/items/b715628b9ffb3633c185)  
  切っても切り離せないコードレビューとエビデンスについて記載しています。これから成長したいと考えているエンジニアの方々に、ぜひ一読をおすすめします。
源氏物語と原価計算

### 源氏物語みたいな経営
むかしむかし、あるところに、若紫（わかむらさき）という、まだ幼いが大変魅力的なベンチャー製薬企業があったそうな。光源氏という、若紫に一目ぼれしてしまった大手製薬企業は、若紫の発行済株式の30％を取得し、その世話役として、若紫の経営に介入するようになりました。

### ERPと原価計算の始まり
まだ生産規模の小さい若紫は、原価計算はそれほど重要であると考えていませんでした。また、若紫の業務は、AS400で社内開発された個別アプリケーションを使って、何とか回されている感じでした。経験豊富な光源氏は、「ERPとともに標準原価計算も導入するといいねぇ」と偉そうに語りつつ、若紫へ異様に熱い視線を送っていました。

### 適した方法
若紫の別の大株主である尼君（あまぎみ）は、「幼い若紫に標準原価計算は早すぎる。まずはロット別原価計算から始めるべきだ。成長し大人になってから、必要に応じて標準原価計算へ切り替えればよい。」と横やりを入れました。これにカチンときた光源氏は、「ERPで一度決めた原価計算方法を後から変更するなんて、できねーよ」と吐き捨てて、その場を去っていきました。尼君は「まったく、油断も隙もありゃしない」、とあきれました。

### NetSuiteにおける原価計算方法変更の手順
他のERPと同様に、NetSuiteでも、品目マスタレベルでは、一度登録した原価計算方法を変更することはできません。したがって、光源氏の言い分も必ずしも間違いではないのです。ただし、個別の品目に関してではなく、ERP全体における原価計算方法の変更について言えば、 尼君の提案する「ロット別原価計算で始め、生産規模が大きくなったら標準原価計算へ」という案は、実現可能な選択肢と言えます。また、変更前、変更後の原価計算方法に制限はなく、「後入れ先出し（LIFO）から、先入れ先出し（FIFO）へ」といった変更パターンも想定されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3431564/10365925-3eac-2c03-ab83-f582c5057b72.png)

### 品目マスタデータ移行のステップ
前述の通り、既存の品目マスタレコードを継続使用して原価計算方法を変更することはできないため、以下の移行作業が必要となります。
a. 既存の各アイテムの在庫数量をゼロにする。
b. 各アイテムマスタレコードを非アクティブ化する（接尾辞"-old "を追加するなどして、アイテム名を変更した後に）。
c. 各アイテムに対して、マスタレコードを新しい原価計算方法を指定して再作成し、適切な開始在庫数量を登録する。

### 全体的な原価計算方法変更のステップ
1. できる限り多くのトランザクションレコードを完了させる。
2. 品目マスタデータの移行を行う（a, b, c）。
3. 未完了のトランザクションレコード調整する（旧品目の既存トランザクション明細行をキャンセルし、新品目を使用した新明細行を追加する）。
4. 保存検索などのレポートの検索条件に、「品目アクティブ = FALSE」の条件を追加する。その条件を「TRUE」や「空白」に切り替えて、レポートを使用する。

### 専門家に相談するかどうかの判断基準
原価計算変更のステップが4行に収まってしまうと、簡単な話に聞こえてしまうかもしれません。当然、その4ステップの行間には、まったく小さくないリスクや、専門的知識と経験の必要性が含まれております。2024年12月現在、NetSuiteは世界に4万社を超える顧客を持ち、グローバルに蓄積されたベストプラクティスを、お客様へお届けすることが可能です。以下、より詳細な原価計算方法の変更に関する自作資料と、おまけのイラストです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3431564/fd8e3f49-7c4e-bdd1-322e-5956c9b35c1d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3431564/e3a60181-ffa2-66b7-d717-d619a6f9f4ce.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3431564/0155f526-08a7-b186-4460-db490139ed80.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3431564/4b5bbd36-3717-69f5-eff2-3a4707f9a12e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3431564/ce7c04cd-72df-0869-f217-5f6e7dc94388.png)
### 関連リンクのご紹介
https://qiita.com/fujitak/items/c708bd3ddad284e83cff

https://qiita.com/advent-calendar/2024/netsuite
Flutter+Firebaseでiosアプリ作れた！

# Flutter+Firebaseで簡単にiosアプリ作れた！
この度、初めてiosアプリ作ることができました。

今回はFlutter+Firebaseのコンビで作ってみましたよお。

作ったのは友人や恋人とに旅行や日常生活で使える支払い管理アプリです！
デデン

https://apps.apple.com/jp/app/%E3%81%BF%E3%82%93%E3%81%AA%E3%81%A7%E3%83%AF%E3%83%AA%E3%82%AB%E3%83%B3/id6738672960?l=en-US

Flutterとても開発しやすかったです。

# Flutter+Firebase
この組み合わせすごい。初心者の僕でも簡単にデータベース使ってアプリ作れましたよ。。。なんたってステップが少ないのサ

・ステップ１　FlutterプロジェクトとFirebaseプロジェクトを別々に作成
・ステップ２　flutterfireのサイト(https://firebase.flutter.dev/) を参考にセットアップする

これだけです！！すごい、、　　なんでこんなに簡単なんだ、、

そのあとはDartでfirebaseにアクセスするコマンド書けば読み書きできました！！
firebaseのセットアップはサイトからアカウント作ってプロジェクト作成のボタンをポチッするだけなんて、、

もう一つくらい作ってみようかな！

# Flutter使ってる人って少ない、、？
イメージなんですがFlutterってあんまりはやってないですか、、？クロスプラットフォーム開発だとReactNativeが強いのですかね？？調べていきたいです！

知ってる人見てたら教えて下さい！！

また、今後はswiftと使ってiosに特化したアプリ開発もしてみたいです！
転職を振り返って

この一年、転職自体に対して気づいたことを記載してみようと思います。完全に個人の感想です。会社の悪口とかに見えたならそれは誤解なので最初に伝えておきます。責任は全部自分です。

## 勝手に解釈するな
自分が悪かったなぁという所が募集要項や説明を「勝手に解釈するな」ということです。
例えば、そのプロジェクトが特定のプラットフォームを構築しているものとします。
チーム構成として、アプリを構築しているチームと、クラウドを構築しているチームがいるという説明を受けたとします。

その時に、
（ふむふむなるほど、ということはアプリとインフラで分かれているんだな）
と解釈します。これが大きな間違いで、実際にはそんなチーム構成じゃないということです。
あまり細かいことを書くと良くないので詳細はきっと知り合いにお酒の場でしか話しませんが、面接の場ではその用語がお互いが共通して認識している内容であるかどうかを確認することが大事だと思いました。

また、IaCの構築もしてもらうことがあります、と募集要項に記載があったとします。
その時に、
（ということはSRE的なこともやるんだな）
と解釈したとします。これも実際とは大きく異なっていて、そのあたりも募集要項に書いていることを真に受けずに、ちゃんとすべからく現場レベルのメンバーの業務内容を日々のタスクレベルで細かい部分まで確認しておく必要があると思いました。（少なくとも、自分は募集要項から想像できなかったので次からはより詳細に確認しようと思いました。この辺の話も知り合いにお酒の場でしか話さないと思います。）

## 給与を下げるならそれなりの覚悟を
正直、前職を出て行って業務内容としては結果的に得られるものが多かったような気はしますが、やはり給与が大幅に下がってしまったのは痛手でした。
いや、覚悟はしていたし、生活も維持できることや額的にも世間一般よりは高かったものの、前職がちょっと良かったのでその水準で生活を維持してきたところからガクンと年収を下げてしまったので、家族とも揉めることが増えたことや月々のモチベーションとかもやはり大きく変わってきたなぁと思いました。
業務内容と給与のバランスはとても大事だなぁということで、世間一般的な給与と比較して年収を考えるというよりは、今の生活水準と家族の考えを基にその辺は覚悟をしていかないといけないなぁと実感しました。覚悟の大きさが思っているより違うので、これは実感しないと気づけなかったことなので良くも悪くも個人的にはナイストライになりました。

## 大きい会社はやっぱ凄い
自分はもともと大学で4年間情報科学を専攻し、10年以上IT畑で働いてきました。
で、今はITと全く関係ないところで働いているのですが、面接のときに「最近できた部署なのでITにうとい」という説明を受けたので、自分が戦力になれるのではないかと思っていました。（ここ数年、会社でもそれなりに実績が出てたので半分天狗状態）
ところがどっこいで、入ってみたら自分の配属された部署はITリテラシーの高さが過去努めてきた会社と同等、もしくはそれ以上に高くて、なんでこんなすごい人たちがこの会社にいるんだろうとい衝撃を受けました。
実は現職に入社前に、前職の人から「そこの会社は自分たちで手を動かせるからなぁ」というのを聞いていましたが、俗にいうフルスタックエンジニアが集まってるとんでもない担当でした。さすが大きい会社は違うなと思ったのと、適材適所はありつつも自分が全然通用しないというので、すごい人達に巡り合えるというのは結構な福利厚生だと思いました。

## 口コミサイトはちゃんと見ろ
これ結構大事だと思っていて、入社してから良いことも悪いことも色々気づいたことが口コミサイトにめっちゃ色々書いてました。（そんなこと書いていいの？ってのは気になりましたが）
なので、入社前の情報収集の仕方として、知り合いの社員の話を聞くのも大事だと思いますが、割と確度が高いと思ったので口コミサイトはぜひ見といた方がいいと思います。

## まとめじゃないけど感想
なかなか転職って難しい、というか100点の会社なんてどこにもないですが、会社を理由に文句なんかいくらでも言えるので、エンジニアとして自分の軸をしっかり持ってキャリアを築いていくのが一番大事なんだと思います。責任は全部自分です。
ラズパイPicoで温湿度計を使う

ラズパイPicoのI2Cで、温度計・湿度計で測った数値を表示してみよう

## 温湿度計の説明

温湿度センサー AHT21B は、I2Cで制御される温度と湿度を計測するモジュールです。

I2Cでは、GND、VCC、SCL、SDAと言う、4本のピンで複数の周辺機器を制御します。このひとつにAHT21Bを接続して、温度計・湿度計の値を表示してみましょう。

温湿度センサー AHT21B：
https://akizukidenshi.com/catalog/g/g117394/

※ AHT20、AHT25は、AHT21Bと同じプログラムで動きます。
※ AHT25はピン配列が狭く、そのままではブレッドボードに刺さりません。

## 準備：AHT21B を GND、VCC、SCL、SDA で接続

前回接続した OLED の配線はそのままにして、AHT21Bを追加で接続します。（OLEDとAHT21Bが両方使える状態になります）

AHT21Bの左から右に向かって：
VCC：+ (3.3V)
SDA：PIN 0
GND：-
SCL：PIN 1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665435/d2f53732-2e55-2237-ca3c-b8a6f6f3c1ef.png)



## プログラム

まず、「パッケージを管理」で、ahtx0 をインストール、としたいところですが、パッケージ管理では上手くインストールできないそうです。
以下のファイルを lib フォルダの ahtx0.py ファイルとしてコピーします。

https://github.com/targetblank/micropython_ahtx0/blob/master/ahtx0.py


温度と湿度を1秒毎に表示する（f文字列を使用して、小数点以下2桁まで表示）

```Python
import time
from machine import Pin, I2C

from ahtx0 import AHT20

i2c = I2C(0, scl=Pin(1), sda=Pin(0)) # I2C初期化
aht21 = AHT20(i2c)

while True:
    temperature = aht21.temperature
    humidity = aht21.relative_humidity
    print(f"おんど: {temperature:0.2f} C")
    print(f"しつど: {humidity:0.2f} %")
    time.sleep(1)

```

温度と湿度を1秒毎に表示する（f文字列を使用して、小数点以下1桁まで表示）

```Python
import time
from machine import Pin, I2C

from ahtx0 import AHT20
from ssd1306 import SSD1306_I2C

i2c = I2C(0, scl=Pin(1), sda=Pin(0)) # I2C初期化
aht21 = AHT20(i2c)
display = SSD1306_I2C(128, 64, i2c)

while True:
    temperature = aht21.temperature
    humidity = aht21.relative_humidity
    temp = f"Temp: {temperature:0.1f}C"
    humi = f"Humi: {humidity:0.1f}%"
    display.fill(0)
    display.text("Hello", 0, 0)
    display.text(temp, 0, 8*1)
    display.text(humi, 0, 8*2)
    display.show()
    time.sleep(1)

```
クラス、構造体、タプル、Enumの使いどころ

# はじめに
クラスだけではなく、構造体やタプル、Enumなどのデータの扱い方法を知ることで、より効率的なコードを書けることにつながります。本記事ではそれぞれの使いどころを紹介します。

# クラス
## 特徴
- 参照型
- 複雑なデータ構造や状態の管理に適している
- 継承やポリモーフィズム
- メソッドやプロパティを持ち、初期化処理（コンストラクタ）が可能

## 使いどころ
- オブジェクト指向設計に基づいたモデルを作成する場合
- 例えば、 __ユーザー情報、商品のデータ、自動車の振る舞い__ を表現する場合

# 構造体
## 特徴
- 値型
- 軽量なデータ構造を表現するのに向いている
- メソッドを持つこともできる
- 継承はできないが、インターフェースは実装可能

## 使いどころ
- データのサイズが小さく、複雑な操作が不要な場合
- 例えば、__座標（Point）、サイズ（Size）、色（Color）__ を表現する場合

# タプル
## 特徴
- 複数の値を簡単にまとめて扱えるので、一時的なデータの受け渡しに使える
- 名前付きタプルを使用すると、データの意味が分かりやすくなる
- メソッドやロジックを持てない

## 使いどころ
- 関数から複数の値を返したい場合や、一時的に関連するデータをまとめたい場合
- 例えば、 __計算結果やDBから取得__ した簡易データを返す場合に利用します。

# Enum
## 特徴
- 列挙可能な値の集合を定義
- 限定された選択肢（設定値や状態）を表現するのに便利
- 値にはデフォルトで整数が割り当てられるが、任意の値を設定可能

## 使いどころ
- 特定の選択肢や状態を表現したい場合
- 例えば、 __方向（北・南・東・西）や曜日、ユーザーの権限レベル__ を表現する場合に利用します

# おわりに
クラス、構造体、タプル、Enumのいずれもデータを表現するために重要です。
それぞれの特徴を理解し、用途に応じて使い分けることで、効率的で分かりやすいコードを書くことができます。
あなたの使い方に合った選択をしてください！
膨大なテストコンディションがあるときの対策

## 組み合わせ爆発
これまでに、2024 アドベントカレンダーの中で、エンティティや
テストコンディションなど、組み合わせテストを作るのに必要な基本をご紹介しました。
https://qiita.com/advent-calendar/2024/hanamaruqa

こうした、テンプレート化しやすい資料ができたところで、よくあるのは、
「これで組み合わせテストを正直に作ったら、大変なことになる」
という課題です。

## 削減するには
テストケースのボリュームを減らすのは、増やすよりはるかに難易度が高いです。
テストを減らすということは、不具合が流出してしまうリスクが上がるからです。

かといって、無限にテストを続けるわけにはいきません。
ですので、リスクベーステストなどの手法が考案されています。

テストケースを削減する場合、どのテストを割愛するかの線引きが必要です。
テストの作り方で、これをコントロールすることが、一定可能ですが、
リリースクライテリア（リリース時の品質基準）については、
経営方針、顧客、リソースなどが指標になります。
これらの指標を見つけるには、普段からの、カスタマーサクセスや、
ビジネスサイドの情報が必要になります。

## 削減手法

削減手法にはいくつかありますが、ここでは組み合わせテストを紹介します。


#### 直交表
直交表は、あらかじめ、組み合わせの出現が保証されたテンプレートを使って
多因子・他水準の組み合わせでの品質を保証する手法です。
一度テンプレートを作ってしまえば、適用は意外と簡単です。
このときの、因子水準の選び方が、一つの削減ポイントと言えるでしょう。

#### AllPair
オールペア法（ペアワイズ）とは、２因子間の値の組み合わせを
着実に網羅するテストを効率的に作成する手法です。
テスト作成には、便利なツールが出ています。

#### 抽象化
抽象化は、先に基本となるテストをしっかり行ったうえで、優先度付けを行い、
因子を代表する水準を選ぶことです。

またテストパスをしっかり網羅するという意味で、水準をずらしながら
テストを組む方法もあります。直交表ではしっかりとした組み合わせが保証されますが、
これは、コントロールした範囲でテストパスの網羅性を高めるやり方になり、
削減の効果は高いですが、もちろん網羅性は下がるので、必要に応じた見極めが
ポイントになるでしょう。

Web製品のテストでは、組み合わせの複雑なところから不具合が出やすい傾向があるので、
抽象化と探索的テスト、不具合分析を絡めた手法で、効率よくバグを見つける
努力をすることがあります。

## リスクの探し方
リスクの定義には、前提に、経営方針やビジネス事由などがあるのは前述しましたが、
ヒト・モノ・カネ・時間など、製品の要件にしたがって変わりますので、
自分たちに必要な品質の定義を行い、運用していきます。

#### 不具合分析から
普段の不具合をBTSから抽出し、傾向を調べることで、バグの出がちな
条件や操作を見つけることができるでしょう。
そうした要素はテストから外さないようにするなどして、効率化を図ります。
また、パレート分析を行って、これを数値化する手法もあります。

#### リスクベーステスト
リスクベーステスト（一度、JSTQBのなかでも読み方が変わっていますね）
についても、テスト工数削減のテクニックの一つと言えます。
リスクのある個所を重点的に行う進め方になります。

人・カネ・物・時間、など、製品を使うステークホルダー
（ユーザー・ビジネスユーザー・運営など）にとって、リスクになることを
関係者に共有し、そこを担保することを優先して保証するやり方です。
また、風評被害などについても考慮します。

#### ユースケースから
実際のユーザーが行う操作の主要なものから保証を行うやり方もあります。
この場合、エッジケースが間引かれる恐れがあるので、そこを組み合わせテスト他、
各種テスト技法を使って、どうやって保証していくかの戦略が必要になります。

#### テストパスで間引く
いわゆる、C0、C1のような、コードレベルでのテストカバレッジもありますが、
単純にそれだけだとビジネスに必要な個所が網羅されているかの保証が
判断できない側面もあります。

ここでいうテストパスというのは、一定保証された基本テストで必要な操作を抽象化して、
そこのバリデーションを網羅保証していく組み方になります。

例えば、ログインの機能は十分保証されたので、ここは正常系を使って、
そのあとの操作をテストする、といった具合です（抽象化を行っている）。

あるいは、ログイン不正が一度起こった場合に、その後どうなるか、という組み方を
することもあります（ログイン不正という抽象化を行っている）。

こうして、テストパスを操作単位で、部分網羅→抽象化→操作組み合わせ、として、
必要な網羅性を高めつつ、保証の範囲を広げていきます。


## テスト戦略の中で網羅性を高めるには

こちらは リグレッションを流す手法ですが、設定条件の組み合わせリストを
あらかじめ用意しておき、リグレッションで少しずつ消化して、テストの網羅性を
担保し続ける、網羅範囲を固定にしない手法です。
このテスト条件の組み合わせには、直交表を使うなどして、
テストパス・テストコンディションを一度に保証することを意識します。

## 最後に
ざっと表面的な内容を記述してみましたが、それぞれのテスト技法や、
テスト戦略について、深い知識をもって組み立てる必要があるので、
テストの醍醐味のような、面白さがある部分でもあるかと思います。

まだまだ紹介しきれていない方法もあるので、興味があれば、ぜひ調べてみてください。

#
### 用語解説

#### BTS
バグ・トラッキング・システムの略で、Jira や Redmine などがそれにあたります。

#### パレート分析
QC七つ道具の一つである、パレート図を使って、不具合の傾向を調べる指標です。
分類を作るのには、一定の経験が必要になるでしょう。
傾向を数値化するのに便利です。
https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%AC%E3%83%BC%E3%83%88%E5%88%86%E6%9E%90
【CSS】スクロールに合わせて、イマーシブ体験を提供する

## はじめに
最近のバスワードとして、イマーシブというものがあります。
イマーシブは、`没入させる` や `夢中にさせる` と言った意味のある言葉です。

クリエイティビティの高いwebサイトでは、イマーシブ体験を提供するためにスクロールに合わせて、写真の中に入るみたいな体験もあったりします。

この記事では、イマーシブ体験を提供するためのヒントとなるように CSSだけで、スクロールに合わせてアニメーションする方法を紹介します。

## 作るもの
今回作るものはこちらです！↓↓↓↓
スクロールすると円が広がり、画像が画面いっぱいになります。
また、イマーシブ体験を提供するために画像を少し大きくしております。

<p class="codepen" data-height="500" data-default-tab="result" data-slug-hash="PwYNEdz" data-pen-title="Screen width / height (CSS)" data-editable="true" data-user="sp_degu" style="height: 500px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/sp_degu/pen/PwYNEdz">
  Screen width / height (CSS)</a> by でぐぅー | Qiita (<a href="https://codepen.io/sp_degu">@sp_degu</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


## 作り方
### 実装方針
スクロールに合わせて、イマーシブ体験を提供するためには、このように実装しています。

1. `<div>` の `background` に画像を設定する
1. `clip-path` で `<div>` を円形にカットする
1. スクロールアニメーションさせる
1.  `<div>` の `position` プロパティを `sticky`に設定する

### 1. `<div>` の `background` に画像を設定する
```sample.html
<div class="img" />
```

```sample.css
.img {
  background: no-repeat url("https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/c04b6fd0-c089-d18a-9c1d-bd2699c7332f.png");
  background-position: center;
  height: 100vh;
  width: 100vw;

  background-size: 100%, auto, cover;
}
```

### 2. `clip-path` で `<div>` を円形にカットする

```sample.css
.img {
  background: no-repeat url("https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/c04b6fd0-c089-d18a-9c1d-bd2699c7332f.png");
  background-position: center;
  height: 100vh;
  width: 100vw;

  /* アニメーションさせる要素 */
  background-size: 100%, auto, cover;
  clip-path: circle(20%);
}
```


### 3. スクロールアニメーションさせる
スクロールアニメーション↓こちらの記事を参考にしてください！

https://qiita.com/degudegu2510/items/9fa70a8b5284e37f2fe3

```sample.css
@keyframes scroll-anim {
  from {
    clip-path: circle(20%);
    background-size: 100%, auto, cover;
  }
  to {
    clip-path: circle(100%);
    background-size: 115%, auto, cover;
  }
}

.img {
  animation: scroll-anim linear;
  animation-timeline: scroll();
  background: no-repeat url("https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/c04b6fd0-c089-d18a-9c1d-bd2699c7332f.png");
  background-position: center;
  height: 100vh;
  width: 100vw;
}
```


### 4. `<div>` の `position` プロパティを `sticky`に設定する

```sample.css
@keyframes scroll-anim {
  from {
    clip-path: circle(20%);
    background-size: 100%, auto, cover;
  }
  to {
    clip-path: circle(100%);
    background-size: 115%, auto, cover;
  }
}

.img {
  animation: scroll-anim linear;
  animation-timeline: scroll();
  background: no-repeat url("https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/c04b6fd0-c089-d18a-9c1d-bd2699c7332f.png");
  background-position: center;
  height: 100vh;
  position: sticky;
  top: 0;
  width: 100vw;
}
```

## まとめ

イマーシブ体験を提供するためのヒントとなるように CSSだけで、スクロールに合わせてアニメーションする方法を紹介しました。

この記事を参考に、イマーシブ体験を作成しみてください！
Power AutomateからPower BIのセマンティックモデルの更新

## はじめに
Power BIの1つのセマンティックモデルのデータ更新は、ライセンスによって更新回数制限があります。しかし、Power Automateからの更新で、Power BI Premium Per User（PPU）であれば、**制限なく更新**できます。

## ユーザーベースのライセンスモデルによって更新回数が違う

Power BIの1つのセマンティックモデルについて、ライセンスによって1日あたりの更新回数が決まっています。

- **Fabric 無料ユーザー**: 8回/日
- **Power BI Pro**: 8回/日
- **PPU、Premium容量**: 48回/日

リファレンスとして日本マイクロソフトのサポートさんのブログから引用します。

https://jpbap-sqlbi.github.io/blog/powerbi/pbi_power%20automate/

:::note info
引用
<ul>
<li><p><strong>Pro 容量</strong></p>
<ul>
<li>1日あたりの更新回数はセマンティックモデルあたり8回/日まで（スケジュールされた更新と Power Automate による更新の合計）。</li>
</ul>
</li>

<li><p><strong>Premium 容量（Per Capacity, Per User）</strong></p>
<ul>
<li>Power Automate による更新には制限はありません。</li>
<li>Power BI Service でのスケジュール更新は48回/日まで可能です。</li>
</ul>
</li>
</ul>
:::

## Power Automateからの更新

どうしても、こちらの制限を超えて更新回数を増やしたい、というケースがある場合、Power Automateの出番です。



Power Automateを使用する際、アクションで「データセットの更新」を選択します。
データセットは、セマンティックモデルの旧名称です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/73f51875-446a-3589-d245-2da456373795.png)


たとえば、HTTPコネクターを利用して外部サービスからデータを取得し、そのデータをPower BIで取り込むためにCSVファイルとして溜め込みます。蓄積したデータに対して、セマンティックモデルを即座に更新する、という使い方が考えられます。

## おわりに

業務要件によっては、頻繁なデータセットの更新が求められ、それをできるだけ早い段階でPower BIの更新に結びつけたいという場合に、Power Automateを活用することで制限なく更新を行えます。この手法を利用することで、よりスムーズにデータの更新とビジネスの対応が可能となります。