OmniAICreator/Qiita-1.07M huggingface dataset:
【UiPath Appsでアプリ作成②】ページコンテナーを活用してヘッダーとフッターを共通化したアプリやサイトを作成する

今回は、UiPath Appsの [ページコンテナー] を活用して、ヘッダーとフッターをテンプレート化したアプリを作成していこうと思います。

[【公式ドキュメント】UiPath Apps](https://docs.uipath.com/ja/apps/automation-cloud/latest)
[【ユーザーガイド】ページコンテナ―](https://docs.uipath.com/ja/apps/automation-suite/2022.4/user-guide/page-container)

<H2>作成する画面</H2>
アプリを読み込んだ際にトップページを開き、各メニューを押すとヘッダーとフッターがついた状態で各コンテンツが表示されるように作っていきます。

![AppsHeader.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/17300d16-b9c3-3e16-0449-ba8cc8ea0d3d.gif)


<H2>ヘッダーとフッターを準備する</H2>

あらかじめMainPageにヘッダーとフッターを用意しておきます。以前の記事でコンテナーを駆使してヘッダーを作成する方法を紹介しているので、まだ準備ができていない方はそちらもご参照ください。ヘッダーには各メニュー、フッターには[コンテナー]の中にロゴと筆者のQiita IDを入れたものを用意しました。

https://qiita.com/kumatech/items/7a648372639851499212

ヘッダーとフッターを用意できたら、画像のように[ページコンテナ―]を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/956ab2b0-d40b-3b30-7dbd-7ac1d5ebdfd7.png)



また、ヘッダーとフッターが入ったMainPageとは別にコンテンツが入ったページを用意します。今回は簡単に[コンテナー]に文字が入っただけのトップページと支出の記録ページ、収入の記録ページを作りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/63a7d902-0a0e-dc75-ef22-e9e4dfa56fd4.png)

これで準備完了です。

<H2>コンテンツを読み込む</H2>
デフォルトの設定では、最初にアプリを開いたときに読み込むページはMainPageになっています。
（もしほかのページを開始ページに設定したい場合には、左のパネルので右クリックし開始ページとして設定を選択します）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/86f021d9-2490-7476-0224-4704a5dc2dd7.png)

今回は、開始ページはMainPageのまま進めます。
MainPageを選択した状態で[イベント]の設定を開き、[読み込み時のルール]を設定します。[ページを開く]のルールを追加して、トップページを選びます。ここからが今回の一番重要な部分です。開くページを設定できたら、[ページコンテナーを開く]をクリックし、MainPageの配下にある、PageContainerを選んでください。これで、<b>MainPageを読み込むと同時に、MainPageのPageContainerでトップページを読み込む</b>ようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/948b40a2-a0d4-1f0b-b211-48542bd424d4.png)

実際にプレビューボタンを押して画面を見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/fdf2fdcd-d3c9-a9b8-2f32-b89df1b6d15c.png)

トップページをMainPageに埋め込むことができました。
他のページに関しても同様の設定をしていきます。ヘッダーにある支出の記録、収入の記録をクリックしたときの[イベント]を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/177317f3-1aeb-a055-881e-bbdc6dea507a.png)

実際にメニューをクリックすると支出の記録ページがヘッダーとフッターと合わせて表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/6c0902b2-2b54-da1b-dac3-4e8fe07676d6.png)

最後にロゴとアプリのタイトルの入った[コンテナー]をクリックしたときに、トップページを開くように設定したら完成です。

<H2>まとめ</H2>
今回はヘッダーとフッターを共通化して、各コンテンツを表示する方法をまとめました。これでよりデザイン性の高いアプリやサイトを作成することができます。
是非、ページコンテナーを活用してみてください。
自動車用ベアリング市場調査： Research Nesterによる分析：自動車台数の増加と自動車普及率の上昇を促進 2023-2033

リサーチ・ネスターは次のタイトルのレポートを発表した「<b><a href="https://www.researchnester.jp/reports/automotive-bearings-market/1996" target="_blank">自動車用ベアリング市場調査</a> 世界の需要分析と機会展望2033"</b>この調査レポートは、自動車用ベアリングの世界市場について、製品タイプ別、車種別、用途別、地域別に分類した詳細な概要を掲載しています。
さらに、詳細な分析のために、市場の成長に関連する現在と将来の市場動向に関する詳細な議論とともに、業界の成長指標、阻害要因、需給リスクを網羅しています。
自動車用ベアリングの世界市場は、予測期間中（2023～2033年）のCAGRが～6％で成長すると予測されている。市場は車種別に乗用車、小型商用車、大型商用車に区分される。これらのセグメントのうち、小型商用車の販売台数が増加していることから、予測期間中、小型商用車セグメントが最大の市場シェアを獲得すると予測される。また、産業界における商用車需要の増加も、今後数年間の同セグメントの成長を後押しすると予想される。
![Automotive-Bearing-Market-Future-Scope.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491677/b4089211-9eeb-f018-4b83-453860397d85.jpeg)

<b>このレポートの詳細については、こちらをご覧ください：</b>
<b>https://www.researchnester.jp/reports/automotive-bearings-market/1996</b>

自動車用軸受の世界市場は、世界的な大型車の増加を背景に、2033年末までに520億米ドルの売上を達成すると推定されている。摩擦の低減、安全な操作の確保など、自動車用ベアリングが提供するさまざまな機能も、今後数年間で、これらのツールの売上を押し上げると予測されている。さらに、商用車の生産台数の増加やベアリングの普及率向上も、予測期間中の市場成長を促進すると予測されている。
地域的には、自動車用ベアリングの世界市場は、北米、欧州、アジア太平洋地域、中南米、中東・アフリカ地域の5つの主要地域に区分される。このうち、アジア太平洋地域の市場は、自動車の普及台数の増加により、予測期間中に最大の市場シェアを獲得すると推定される。これとは別に、欧州市場は今後数年間で大きな成長を記録すると予測されている。
この調査はグローバルな性質を持ち、以下の国の市場に関する詳細な分析をカバーしている North America (U.S., Canada), Europe (U.K., Germany, France, Italy, Spain, Hungary, Belgium, Netherlands & Luxembourg, NORDIC [Finland, Sweden, Norway, Denmark], Poland, Turkey, Russia, Rest of Europe), Latin America (Brazil, Mexico, Argentina, Rest of Latin America), Asia-Pacific (China, India, Japan, South Korea, Indonesia, Singapore, Malaysia, Australia, New Zealand, Rest of Asia-Pacific), Middle East and Africa (Israel, GCC [Saudi Arabia, UAE, Bahrain, Kuwait, Qatar, Oman], North Africa, South Africa, Rest of Middle East and Africa). さらに、市場規模、前年比成長率および機会分析、市場プレイヤーの競争調査、投資機会、将来の展望に対する需要などを含む分析も、調査報告書の中で取り上げられ、表示されている。

<b>自動車普及率の上昇が市場成長を牽引</b>
データによると、2020年には世界中で5580万台以上の乗用車が生産された。
自動車の普及は、今後数年間で市場の成長を加速させると予想される。ベアリングは、エアコンシステムやウォーターポンプからシートやミラーの調整機構に至るまで、自動車の重要な機能の全てに使用されているため、ベアリングの使用なしでは自動車の重要な機能の多くがはるかに効率的でなくなるか、あるいは不可能になる可能性さえある。さらに、技術の進歩や車輪の数の増加も、予測期間中の自動車用ベアリングの世界市場の成長を促進すると予想される。
しかし、原材料コストの変動やメンテナンスコストの高さが、予測期間中の自動車用ベアリングの世界市場成長の主な阻害要因になると予想される。
本レポートはまた、自動車用ベアリングの世界市場における主要企業の競争シナリオを提供しています NTN Corporation, Timken Company, Schaeffler Group, NSK Ltd., SNL Bearings Ltd., JTEKT Corporation, Nippon Thompson Co., Ltd., Aktiebolaget Svenska Kullagerfabriken (SKF), NTN-SNR Roulements, MinebeaMitsumi Inc. プロファイリングでは、事業概要、製品・サービス、主要財務情報、最近のニュースや開発など、企業の主要な情報を掲載しています。全体として、当レポートは自動車用ベアリングの世界市場に関する詳細な概観を描いており、業界コンサルタント、装置メーカー、拡大機会を探している既存企業、可能性を探している新規企業、その他の利害関係者が、現在進行中および今後予想される動向に従って市場中心の戦略を調整するのに役立ちます。

<b>レポートサンプル@を請求する</b>
<b>https://www.researchnester.jp/sample-request-1996</b>

<b>について Research Nester</b>
リサーチ・ネスターは戦略的市場調査とコンサルティングのリーディング・サービス・プロバイダーです。業界、コングロマリット、エグゼクティブが将来のマーケティング戦略、事業拡大、投資などのために賢明な決断を下せるよう、偏りのない比類のない市場洞察と業界分析を提供することを目指しています。私たちは、戦略的思考を通じて適切なタイミングで適切なガイダンスを得ることができれば、あらゆるビジネスが新たな地平へと拡大できると信じています。私たちの既成概念にとらわれない思考は、お客様が将来の不確実性を回避するために賢明な決断を下すのに役立ちます。
<b>【お問い合わせ先】</b>
ナオミ コスギ
Eメール: <b>info@researchnester.jp</b>
米国の電話番号: +81 505 050 8480
結局Sassのネストってどこで切ればいいの問題


## きっかけ
SCSSファイル内でのネストが**実際の階層に忠実すぎる**ために深くなりすぎてしまったことがあり、改めて「適切なネストの構造とは何か？」について考えるようになりました。


## 本記事の目的
Sass[^1]の基本記法のひとつであるネスト（入れ子）に関しては、次のようなデメリットが挙げられています。

:::note alert
　文字列検索がしにくい
　詳細度があがるため上書きしにくい
:::

これに関しては、分かりやすくまとめられた記事があるため、[そちら](https://qiita.com/xrxoxcxox/items/16002a866aa7ba8fb346)もご覧ください。

一方で、ネストには次のようなメリットもあります。

:::note 
　階層関係が分かりやすい
　記述量を減らすことにより冗長なコードにならない
:::

これらを踏まえ、

「**視覚的に見やすく**」かつ「**変更や上書きにも対応しやすい**」ネストの構造とは何か？

を考えてみました。

[^1]: CSSの拡張言語のこと。「SASS記法」と「SCSS記法」の２種類があり、本記事では「SCSS記法」を採用する。

## 結論
親要素のブロック ＋ １階層を基本として、

**① 疑似要素（:first-childなど）を追加するとき
② 同階層にclassを追加するとき**

のみネストするのがいいのではないか、という結論に至りました。


## コード例
### サンプルHTML

```nest_sample.html
<div class="main-container">
    <ul class="main-container__list">
        <li class="item first">リスト項目1</li>
        <li class="item first selected">リスト項目1（複数クラス指定ver.）</li>
        <li class="item second">リスト項目2</li>
        <li class="item third">リスト項目3</li>
    </ul>
</div>
```

### サンプルSCSS:before

```nest_sample.scss
.main-container { 
  &__list { 
    padding: 0;
    
    .item { 
      margin-top: 10px;
      background-color: light-gray;

      &.first {
        background-color: red;

        &.selected {
          background-color: blue;
        }
      }

      &.second {
        background-color: green;

        &:hover {
          cursor: pointer;
        }
      }
    }
  }
}

```

ファイル内のネストは、実際のHTML構造に合わせた階層になっています。
ただ、このままこの書き方を続けるとネストが段々深くなっていき、後からの変更に弱い構造になってしまうのが分かります。
そこで「プロパティの位置が視覚的に分かりやすく」「変更や上書きがしやすい」ネストになるよう、書き方を変えてみました。


### サンプルSCSS:after

```nest_sample.scss
.main-container {
  .main-container__list { //文字検索しやすいようクラス名を明記
    padding: 0;
  }

  .item {
    margin-top: 10px;
    background-color: light-gray;
  }

  .first {
    background-color: red;

    &.selected {
      background-color: blue; // 同階層に2つのクラスを指定している場合はネスト
    }
  }

  .second {
    background-color: green;

    &:hover {
      cursor: pointer; // 疑似要素を指定している場合はネスト
    }
  }
}
```

### 変更点
できるだけネストを浅くするよう、原則として親ブロック ＋ 1階層に書き直しました。

それに合わせ、以下のものを切り離しました。
- 子階層の全てに適用されるプロパティを有した「.item」などの親要素のclass
- ネストの子階層にあった、直接名前で指定できる「.first」などのclass

また、以下のものは記述の重複を避けるためネストさせています。
- 「.first.selected」などの同階層に追加されることが必要な要素
- 「:hover」などの疑似要素

このように、ネストを深くしすぎないことで割とすっきりした書き方になりつつ、変更に堪えやすいプロパティ指定になっているのではないかと思います。

## まとめ

プロパティ把握のしにくさなどから反対される記事が多いネストですが、個人的には適切に設計すれば見やすさ・変更のしやすさの両立も可能なのではないかな、と思いこの記事を書きました。

本記事での提案はあくまでローカルルールのようなものなので、特にCSS設計に関して定められたルールがない場合の参考にしていただければと思います。もっと書きやすいやり方があるよ！などのご意見がありましたらぜひコメント欄でお伝えください。内容に関する質問・ご指摘も大歓迎です。



## 参考記事

[「これからはcssはSassで書こう。」（Qiita記事）](https://qiita.com/m0nch1/items/b01c966dd2273e3f6abe)
[「【CSS設計】ゼロからわかるBEM超入門」（Zenn記事）](https://zenn.dev/nagan/articles/dac6fa662f4dab)
[「Sassの機能でネストが最初に紹介されるけどあまり使わない方が良いと思う」（Qiita記事）](https://qiita.com/xrxoxcxox/items/16002a866aa7ba8fb346)
[「Sass Basics Nesting」(Sass公式ホームページ)](https://sass-lang.com/guide/)
リモートサーバ上でdokcerを立ち上げローカルでGUIを表示する

# 1.リモートサーバからの映像が飛んでくるか確認


XLaunchを立ち上げる。
ここにチェックを忘れずに入れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565468/099412aa-95bf-2caa-f60b-7929fc30aa34.png)

```
ssh remotehost
xeyes
```

下の写真が出れば問題なし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565468/0a83a900-d11c-eb31-c5bf-b36aecbe4e20.png)

ちなみにこのとき
```
$DISPLAY
localhost:13.0: command not found
```




# 2.ローカル上のdockerでGUIを表示
XLaunchを立ち上げる。
Windows（WSL2）を使っている場合、localhost:0ではうまくいかないので、自分自身のIPを直打ちしてDISLPAYを指定する。
```
export DISPLAY=ローカルのIPアドレス:0
xeyes
```
でさっきと同じ目が出力されればOK



# 3.リモート上のdockerでGUIを表示
ここからが本題

```docker-compose.yml

version: "3.2"
services:
  ubuntu:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: "disp_container"
    network_mode: host
    volumes:
      - /dev/bus/usb:/dev/bus/usb
      - ./workspace:/workspace
      - ~/.Xauthority:/root/.Xauthority
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
      - NVIDIA_DRIVER_CAPABILITIES=all
      - DISPLAY=$DISPLAY
    tty: true
```
`network_mode: host`
`- ~/.Xauthority:/root/.Xauthority`

がないとGUIが表示されない

ちなみに
```Dockerfile:Dockerfile
FROM ubuntu:20.04

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update
RUN apt-get install x11-xserver-utils -y 
RUN apt-get  install x11-apps -y
```

```
docker compose build 
docker compose up 
xeyes
```
で表示されれば大丈夫。
この時
```
$DISPLAY
bash: localhost:11.0: command not found
```
VitestのspyOnでfetchをモックしてテストする方法

## はじめに

VitestのspyOnでfetchをモックする方法を２つご紹介します。ただし実際にfetchをモックする方法は１つのみで、もう１つはfetchを実行している関数をモックする方法です。

前回axiosでモックする方法を紹介しているので気になる方は参考にしてください。

https://qiita.com/mori_goq/items/a99f75ce29098a59df60

## コード

fetchを使用してユーザーを取得をする関数です。この`fetch`関数をモックします。

```typescript:src/fetchers.ts
type User = { name: string; age: number }

export const fetchUsers = async (): Promise<User[]> => {
  const response = await fetch('/users').then((res) => res.json())

  return response
}
```

取得したユーザーから15歳のユーザーを抽出して返す関数です。今回のテストではこの`getFifteenYearsOldUsers`が正しい動作をするか検証します。

```typescript:src/getFifteenYearsOldUsers.ts
import { fetchUsers } from './fetchers'

export const getFifteenYearsOldUsers = async () => {
  const data = await fetchUsers()

  return data.filter((user) => user.age === 15)
}
```

### fetchをモックしてテストする方法

fetchはグローバル関数のため、`vi.spyOn(global, 'fetch')`のように指定します。返り値は`Response`オブジェクトになるため書き方に注意が必要です。

```typescript:src/spyOn.test.ts
import { test, expect, vi } from 'vitest'

import { getFifteenYearsOldUsers } from './getFifteenYearsOldUsers'

test('fetchをモックして検証', async () => {
  const mockData = [
    { id: 1, name: 'tarosuke', age: 15 },
    { id: 2, name: 'momo', age: 20 },
    { id: 3, name: 'pac', age: 15 },
  ]

  const spy = vi
    .spyOn(global, 'fetch')
    // fetchの返り値は非同期のResponseオブジェクトになる
    .mockResolvedValue(new Response(JSON.stringify(mockData)))

  expect(await getFifteenYearsOldUsers()).toEqual([
    { id: 1, name: 'tarosuke', age: 15 },
    { id: 3, name: 'pac', age: 15 },
  ])

  spy.mockRestore()
})
```

### fetchUsers関数をモック

こちらは`fetchers.ts`ファイルの`fetchUsers`関数をモックしてテストしています。`fetch`をモックしている訳ではないですが、`fetchUsers`関数はユーザーを取得して返すだけの処理しか書いてないため、こちらでもOKです。

```typescript:src/spyOn2.test.ts
import { test, expect, vi } from 'vitest'

import * as fetchers from './fetchers'
import { getFifteenYearsOldUsers } from './getFifteenYearsOldUsers'

test('fetchers.tsのfetchUsers関数をモックして検証', async () => {
  const mockData = [
    { id: 1, name: 'tarosuke', age: 15 },
    { id: 2, name: 'momo', age: 20 },
    { id: 3, name: 'pac', age: 15 },
  ]

  const spy = vi.spyOn(fetchers, 'fetchUsers')
    // 非同期でそのままのデータを返すだけ
    .mockResolvedValue(mockData)

  expect(await getFifteenYearsOldUsers()).toEqual([
    { id: 1, name: 'tarosuke', age: 15 },
    { id: 3, name: 'pac', age: 15 },
  ])

  spy.mockRestore()
})
```

## まとめ

VitestのspyOnでfetchをモックしてテストする方法をご紹介しました。前者のfetchをモックしてテスト方法の方が実際の動作に近いためおすすめです。

## 最後に

### GoQSystemでは一緒に働いてくれる仲間を募集中です！

ご興味がある方は以下リンクよりご確認ください。

https://goqsystem.recruit.site?qiita=1800261547b23e11266c
Pythonで「ノートブックの作成とPythonプログラムの実行」の動作を確認してみた

# 概要

Pythonで「ノートブックの作成とPythonプログラムの実行」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/jupyter-notebook/index3.html

# 実装

以下のファイルを作成しました。と言ってもほぼ自動生成ですが。
```sample01.ipynb
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "e11d8b2f-4cf6-4a3e-8212-c541319dda3e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hello\n"
     ]
    }
   ],
   "source": [
    "print(\"Hello\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "eca998a1-dd0a-4b72-af16-1745fbe9195e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Orange\n",
      "Peach\n",
      "Lemon\n"
     ]
    }
   ],
   "source": [
    "mylist = [ \"Orange\", \"Peach\", \"Lemon\" ]\n",
    "for val in mylist:\n",
    "    print(val)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b8e4deb2-54ce-48d3-96ec-fcd50bce4828",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
```

実行画面は、以下の通りです。
![Screenshot from 2023-10-19 18-45-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/e5af1c57-d233-ef86-69e1-4e5cc992835f.png)

# まとめ

何かの役に立てばと。
ReactアプリをビルドしてGitHub Pagesに公開するには?

ReactアプリをビルドしてGitHub Pagesに公開するには、以下の手順を実行します。

1. **GitHubリポジトリの作成**:
   - GitHubにログインして、新しいリポジトリを作成します。

2. **`gh-pages` パッケージのインストール**:
   - ローカルのReactアプリのディレクトリで、`gh-pages`パッケージをインストールします。
     ```bash
     npm install gh-pages --save-dev
     ```

3. **`package.json`の修正**:
   - `package.json`に以下のフィールドを追加します：
     ```json
     "homepage": "https://YOUR_GITHUB_USERNAME.github.io/YOUR_REPOSITORY_NAME"
     ```

   - さらに、`scripts`セクションに以下のスクリプトを追加します：
     ```json
     "scripts": {
       "predeploy": "npm run build",
       "deploy": "gh-pages -d build",
       ...
     }
     ```

4. **GitHubリモートの追加**:
   - もしまだリモートが設定されていなければ、以下のコマンドで設定します。
     ```bash
     git remote add origin https://github.com/YOUR_GITHUB_USERNAME/YOUR_REPOSITORY_NAME.git
     ```

5. **アプリの公開**:
   - 次のコマンドを実行して、アプリをGitHub Pagesにデプロイします。
     ```bash
     npm run deploy
     ```

6. **GitHubリポジトリの設定変更**:
   - GitHubリポジトリの設定ページに移動します。
   - "GitHub Pages"セクションに移動し、"Source"を"gh-pages branch"に変更します。

7. **完了**:
   - 数分後、Reactアプリが指定したURL (`https://YOUR_GITHUB_USERNAME.github.io/YOUR_REPOSITORY_NAME`) でアクセス可能になります。

この手順で、ReactアプリをGitHub Pagesにデプロイできます。エラーが発生した場合は、GitHubリポジトリの設定や`package.json`の内容を再確認してください。
【Ruby】superを使うメリット

## 【Ruby】`super`を使うメリット

### Rubyの`super`について

`super` は子クラス（サブクラス）のメソッド内から親クラスの同名のメソッドを呼び出すために使用されます。これにより、親クラスの振る舞いを再利用しつつ、子クラス（サブクラス）での独自の振る舞いを追加することができます。

### `super`の使用例

```ruby
class Parent
  def greet(message)
    puts "From Parent: #{message}"
  end
end

class Child < Parent
  def greet(message)
    super(message)  # ここで親クラスの greet メソッドが呼び出される
    puts "From Child: #{message}"
  end
end

child = Child.new
child.greet("Hello!")

# From Parent: Hello!
# From Child: Hello!
```

## `super`を使うメリット

Rubyの`super`キーワードを利用することには、多くのメリットが存在します。以下に、その主な利点をいくつか紹介します。

### 1. コードの再利用

親クラスのメソッドの一部機能を、子クラス（サブクラス）で再実装することなく継承し、拡張やカスタマイズが可能です。

### 2. DRY (Don't Repeat Yourself) になる

コードの重複を最小限に抑えることができ、結果的に保守性が向上します。

### 3. カプセル化の保持

サブクラスは親クラスの内部実装を知る必要がありません。親クラスの提供する公開インターフェースのみを利用することで、カプセル化の原則が維持されます。

```ruby
class Vehicle
  attr_reader :color, :wheels

  def initialize(color, wheels)
    @color = color
    @wheels = wheels
  end

  def describe
    "This is a #{color} vehicle with #{wheels} wheels."
  end
end

class Car < Vehicle
  attr_reader :brand

  def initialize(color, brand)
    super(color, 4)  # ここでVehicleのinitializeメソッドを呼び出している
    @brand = brand
  end

  def describe
    "#{super} It's a #{brand} brand."  # superでVehicleのdescribeメソッドを呼び出す
  end
end

car = Car.new("red", "Toyota")
puts car.describe

# This is a red vehicle with 4 wheels. It's a Toyota brand.
```


### 4. 変更の容易性

親クラスのメソッドに変更が加えられた際、`super`を利用しているサブクラスも自動的にその変更を受け取ります。これにより、変更の追従が容易となります。

### 5. 一貫性の保持

サブクラスで特有の動作を加えつつも、親クラスの基本的な動作を`super`を使用することで維持することができます。
Qiitaでリンク付きのコードスパンを太字で書く時に上手くいかない事象についての対策

# はじめに
記事執筆時点2023年10月19日で、Qiitaでリンク付きのコードスパンを太字で書こうとしたところ、うまく太字に表示できず、結構ハマったのでその対策の記事を書きました。

対象の読者は、こんな感じのエラーが出た方です。
リンク付きのコードスパンを太字で書きたいが、**[`コードスパン`](リンク)**こうなってしまいます。

## 追記

@Yarakashi_Kikohshiさん、コメントありがとうございます。詳しい原因等はコメント欄をご覧ください。
また、以下の記事が参考になります。どうやら**分かち書きをする**ことでこの問題を回避できるようです。

https://qiita.com/Yarakashi_Kikohshi/items/f5ebd1273cb6c0681da1


# 対策
先に対策を述べると、どんな時も以下のように**コードスパンを太字コードで囲った後にリンクを入れる**と動くと思います。

```:太字のリンク付きコードスパンの書き方
[**`コードスパン`**](リンク)
```
結果

[**`コードスパン`**](リンク)

ちなみに、太字の文字と一緒に使いたい場合は、以下のように書きましょう。
```
**太字の文字**[**`コードスパン`**](リンク)**太字の文字**
```
結果

**太字の文字**[**`コードスパン`**](リンク)**太字の文字**

# ハマる例とハマらない例一覧

対策のコードを使えば問題ないと思いますが、ここでは、筆者が調べた範囲でコードスパンのリンクの外側で`**`を使った場合に、ハマるケースを紹介します。
見やすいようにMarkdownのリスト化の`-`を使いますが、リスト化の有無によって結果は変わらなかったです。

```:ハマる例
- **[`コードスパン`](リンク)**後に文字
- 前に文字**[`コードスパン`](リンク)**後に文字
- 文字と**前に太字[`コードスパン`](リンク)**と文字
- 文字と**[`コードスパン`](リンク)後に太字**と文字
```

- **[`コードスパン`](リンク)**後に文字
- 前に文字**[`コードスパン`](リンク)**後に文字
- 文字と**前に太字[`コードスパン`](リンク)**と文字
- 文字と**[`コードスパン`](リンク)後に太字**と文字


:::note warn
以下のハマらない例は、今後仕様変更でハマる可能性もありますので、上の対策で述べたコードを使うのが安全だと思います。
:::

```:ハマらない例
- **[`コードスパン`](リンク)**
- **前に太字[`コードスパン`](リンク)**
- **[`コードスパン`](リンク)後に太字**
- **前に太字[`コードスパン`](リンク)後に太字**
- 文字と**前に太字[`コードスパン`](リンク)後に太字**と文字
- 文字と**前に太字[`コードスパン`](リンク)**
- **[`コードスパン`](リンク)後に太字**と文字
- 文字と**前に太字[`コードスパン`](リンク)後に太字**と文字
```

- **[`コードスパン`](リンク)**
- **前に太字[`コードスパン`](リンク)**
- **[`コードスパン`](リンク)後に太字**
- **前に太字[`コードスパン`](リンク)後に太字**
- 文字と**前に太字[`コードスパン`](リンク)後に太字**と文字
- 文字と**前に太字[`コードスパン`](リンク)**
- **[`コードスパン`](リンク)後に太字**と文字
- 文字と**前に太字[`コードスパン`](リンク)後に太字**と文字
Dartの基礎文法part1

# はじめに
この記事ではFlutterでアプリ開発をする際に必要なDart言語の基礎文法についてまとめています。

## 変数
変数は格納した値を後から上書きすることが出来るものです。

Dartではvarを変数名の前に配置して、その次にスペースを空けて変数名を記述し、変数を定義することができます。
Dartでは、行の終わりは; (セミコロン)が必要になります。
最後の;がまだ慣れないですが。
```
// ① 初期値なし
var hoge;
print(hoge); // null

// ② 変数の宣言時に初期値を代入することが出来です。
var str = 'hoge';
print(str); // hoge

Swiftの場合は以下のように書きます。
var String: str = "hoge"
```

## 定数
定数は一度格納した値は後から上書きすることが出来ないものです。
Dart言語の定数には「final」と「const」 の2種類があります。
・final → ビルド時に値が代入される　それ以降は値を変更できない
・const → コンパイル時に値が代入される　　それ以降は値を変更できない
ビルド時orコンパイル時に値が代入されるかの違いがあります。

```
const 定数名 = 値;
final 定数名 = 値;

void main() {
  final int number = '10'; // ビルド時に値が代入される
  const name = 'John';  // コンパイル時に値が代入される
  
// それぞれの値をprintする
  print(number);
  print(name);
}

// 出力結果 10, John
```

## if文
if文は条件によって処理を分けたい場合に使用します。
```
main() {
  var value = 4; // 初期の値

  if (value % 2 == 0) { // 
    print('2の倍数'); 
  } else if (value % 4 == 0) {
    print('4の倍数');
  } else if (value % 8 == 0) {
    print('8の倍数');
  } else {
    print('2, 4, 8の倍数以外');
  }
}
// if (条件式1) {
//  条件式1が真（true)の時に実行する処理;
// }else if(条件式2) {
//  条件式1が偽（false)で条件式2が真（true)の時に実行する処理;
// }else if(条件式3) {
//  条件式1及び条件式2が偽（false)で条件式3が真（true)の時に実行する処理;
// }else{
//  全ての条件式が偽（false)の時に実行する処理;
// }
// 
```
上記の例では、valueという変数に'4'という値が格納されいてます。
そのvalue変数をif文の条件式に使用しています。
4という数字が、2 or 4 or 8で割った時に0になるかどうか、もしくは0にならないのかの4つの条件式を書いています。
なので上記の式で実行すると 2の倍数 という文字が出力されます。

## for文(繰り返し処理)
処理を繰り返し行いたい時にしようします。
for文を用いることで、for文内の処理を繰り返し行うことができます。
```
for文の書き方
for(初期化式; 条件式; 変化式){
  処理内容... //条件式がtrueの間実行される
}

使用例
void main() {
  for(int i = 0; i<10; i++) 
    print('Hallo World');
  }
}

//出力結果　　Hallo World ×10
```
[i]の値が10になるまで繰り返し同じ処理を行なっています。
なので上記の処理では、Hallo Worldを10回printします。

### for in文(オブジェクトの各プロパティに対し繰り返し)
for in文を用いることで、Listなどに格納されている全てのデータを0から順に取得し、変数に代入させていくことができます。
配列の最後のデータを取得し処理を終えるとループ処理が終了します。
```
for in文の書き方
for (var 変数 in 配列){
  // 処理内容
}

main() {
  List<int> hogeList = [1, 2, 3, 4];

  for (var value in hogeList) {
    print(value);
  }
} 

// 出力結果 1  2  3  4
```
上記の例は、配列のデータを先頭の 1 から順にプリントするプログラムです。
最後のデータである 4 を取得し処理を終えるとループ処理が終了します。

## forEach文（配列やコレクションに対して繰り返し)
forEach文は、Listに格納されている全てのデータを０から順に取得することができます。
基本的な役割としては上記で解説したfor　in文と同じになります。
```
 forEach文の書き方
List名.forEach((変数){
    (実行したい処理)
  }
)

使用例
void main() {
 List<int> numList = [1, 2, 3, 4, 5];
  numList.forEach((num){
    print(num);
   }
 );
}

//出力結果　　1, 2, 3, 4, 5
```
上記の例は、配列のデータを先頭の 1 から順にプリントするプログラムです。
最後のデータである 5 を取得し処理を終えるとループ処理が終了します。

## まとめ
簡単にDartの基礎文法である、変数、定数、if文、for文、for in文、forEach文についてまとめました。
Swiftとは書き方が違うのでまだ慣れないですね。
最後までご覧いただきありがとうございました！
webarenaでubuntu その60

# 概要
webarenaでubuntu18.04やってみた。
postfixが悪さしてるので、止めてみた。

# プロセス確認

```
$ ps aux | grep postfix
```

# postfix停止

```
$ sudo service postfix stop
```

# サービスの状態を確認

```
$ systemctl status postfix
```


# サービスの自動起動を止める
```
$ sudo systemctl disable postfix
```

以上。
ECサイト制作のコスト:ビジネス成長のための賢い投資

ECサイト（電子商取引サイト）は、企業とお客様を結びつけ、ビジネスの範囲を広げる重要なものとなっています。しかし、ECサイトの開発を決定する際、最も重要な要素の1つがコストです。この記事では、ECサイトにかかるコストについて理解を深め、ビジネスの成長に向けた賢い投資方法をご紹介します。 
1.ECプラットフォームの利用にかかるコスト
 
ECサイトを制作する際にまずかかるコストの一つがECプラットフォームの利用料です。 [Shopify](https://newwave-solutions.co.jp/shopify-guideline) 、WooCommerce、Magento、BigCommerce などの人気のあるプラットフォームでは、使用するために月額料金または年額料金を支払う必要があることがよくあります。このコストは、ビジネスの規模と必要な特定の機能によって異なります。プラットフォーム間の調査と比較を通じて、予算に最適なオプションを見つけることができます。 
2.設計・開発コスト
 
[ECサイトの開発](https://newwave-solutions.co.jp/how-to-make-an-EC-site) と設計は、お客様にとって魅力的で機能的なインターフェイスを作成するための重要な部分です。このコストは、プロジェクトのサイズ、カスタマイズ機能、複雑さによって異なります。コストとリソースを無駄にしないためにも、本当に必要な機能は何かを慎重に検討しましょう。賢明な設計と開発の決定により、コストと時間を大幅に節約することができます。 
3.ドメイン名・ホスティングのコスト
 
ECサイト制作に欠かせないのが、ドメイン名とホスティングの購入です。ドメイン名のコストは通常​​、年間固定コストですが、Webホスティングのコストは必要なリソースに応じて変動します。Webサイトを安定して安全に動作させるには、信頼できるドメイン名とホスティングプロバイダーを選択することが重要です。
 
4.マーケティング・広告のコスト
 
ECサイトに集客するためには、オンラインマーケティングや広告宣伝費への投資が必要になる場合があります。有料広告や従来型のマーケティング、良質なコンテンツの作成など、マーケティング活動には多額の資金が必要となります。事業目標や予算に応じて、効果的なマーケティングプランを検討しましょう。
5.改修・メンテナンスのコスト
 
ECサイトが公開されると、改修やメンテナンスのコストが発生します。コンテンツの更新、サイトのセキュリティ確保、新機能の管理などが含まれます。このコストをある程度予算化しておくことで、長期的にスムーズで効率的なサイト運営が可能になります。
>>> ECサイト制作のコストについては、[こちら](https://newwave-solutions.co.jp/cost-to-create-an-EC-site) をご覧ください。 
まとめ
 
ECサイトにかかる費用は様々な要因によって異なりますが、ビジネス成長のための重要な投資です。コスト要因を理解し、賢く判断することで、ビジネスに経済的な負担をかけることなくECサイトを成功させることができます。特に、ECサイト制作の専門家と相談することで、リソースを最適化し、ビジネスにとって最も重要なことに投資することができます。 
 
ベトナム・ハノイに本社を置く[Newwave Solutions Japan](https://newwave-solutions.co.jp/)は、12年以上の業界経験を持つグローバルなソフトウェア開発企業です。当社は、ソフトウェア開発分野のリーダーであり、大手[Web制作会社](https://newwave-solutions.co.jp/EC-production-companies) であることを誇りに思っており、お客様に効果的で信頼性の高いソフトウェアソリューションを提供することをお約束いたします。
 
私たちは、高品質な[システム開発](https://newwave-solutions.co.jp/system-development/)、[DX推進支援](https://newwave-solutions.co.jp/digital-transformation/)、[Webサイト開発](https://newwave-solutions.co.jp/website-development)、[アプリ開発](https://newwave-solutions.co.jp/mobile-app-development/)、その他多くの複雑なプロジェクトにおける信頼できるパートナーです。当社は、リーズナブルなコストと最高品質のソフトウェアソリューションをお客様のビジネスに提供できることを誇りに思っています。
 
当社のビジョンは、お客様のニーズを満たす革新的で高度なソフトウェアソリューションを作成することです。才能ある専門家のチーム、効率的なワークフロー、グローバルなビジョンにより、当社は情報技術とソフトウェア開発の分野で確固たる評判を築いてきました。
 
Webサイト構築やシステム開発に関するご質問やご要望がございましたら、今すぐ[お問い合わせ](https://newwave-solutions.co.jp/contact-us/)ください。いつでもお手伝いさせていただきます！
C# DateTime.Nowのフォーマット注意事項

必ず、日付のフォーマットを指定すること

日付フォーマットは迷ったら
```
yyyy/MM/dd HH:mm:ss
```
とすること。最大のポイントは、HHで、フォーマットを指定しないと
9時なら9:00:00となる。
これはデータベースで扱う場合落とし穴になる。
9:00:00,10:00:00とあった場合、不幸にも文字列型でデータベースに日付を入力していた場合
10:00:00が並び替えで前に来てしまう。
09:00:00ならこの問題は起こらない。

そもそも日付型でデータベースに保存している方には上記のことは関係がない



231030追記
@juner(jun maeda)様よりアドバイスをいただきました。
```
DateTime date1 = new DateTime(2008, 4, 10, 6, 30, 0);
Console.WriteLine(date1.ToString("s"));
// Displays 2008-04-10T06:30:00
```
ToString("s")と指定すれば
比較可能な定義済みの標準 (ISO 8601) フォーマットを反映してくれるようです。
MashMapをMacでコンパイルする

## はじめに

パンゲノム作成用のパイプライン[pggb](https://github.com/pangenome/pggb)の中の[wfmash](https://github.com/waveygang/wfmash)というツールがあり、その中でロングリードのアライナー[MashMap](https://github.com/marbl/MashMap)が使われているそうなので、簡単に試せるものなのか気になってコンパイルしてみた。

https://github.com/marbl/MashMap

https://kazumaxneo.hatenablog.com/entry/2018/06/19/194715

## コンパイル

HomebrewでGSL(Gnu Scientific Library)をインストールします。

```
brew install gsl
# brew intall gnu-scientific-library
```

HomebrewでインストールしたGSLを認識してくれないので、CMakeLists.txtを下記のように書き換える必要がありました。

```diff:CMakeLists.txt
@@ -75,11 +75,13 @@ add_executable(mashmap-align
 target_include_directories(mashmap PRIVATE
   src
   src/common
+  /opt/homebrew/include/
 )
 
 target_include_directories(mashmap-align PRIVATE
   src
   src/common
+  /opt/homebrew/include/
 )
 
 if (USE_HTSLIB)
@@ -88,23 +90,21 @@ if (USE_HTSLIB)
 endif()
 
 target_link_libraries(mashmap
-  gsl
-  gslcblas
   m
   pthread
   #rt
   z
   #assert
+  /opt/homebrew/lib/libgsl.dylib
 )
 
 target_link_libraries(mashmap-align
-  gsl
-  gslcblas
   m
   pthread
   #rt
   z
   #assert
+  /opt/homebrew/lib/libgsl.dylib
 )
 
 install(TARGETS mashmap DESTINATION bin)
```

これで、GSLを認識してくれるようになります。ビルドします。

```sh
cmake -H. -Bbuild -DCMAKE_BUILD_TYPE=Release
cmake --build build
```

動作確認します。

```sh
build/bin/mashmap \
  -r data/scerevisiae8.fa.gz \
  -q data/scerevisiae8.fa.gz \
  --pi 95 \
  -n 1 \
  -Y '#' \
  --threads 4 \
  -o scerevisiae8.paf
```

## 参考

https://qiita.com/mitsuruk9999/items/b8a4094f558a9c36e208#8-gsl%E3%82%92%E4%BD%BF%E3%81%86%E4%BE%8B
【Docker】コンテナに仕込んでおいたほうが良いコマンドたち

## はじめに
雑にこれいれとけ！的な記事が意外となかったので備忘録を兼ねて。
デバッグしながら不足してるやつ補えばよいやん、て話でもある。環境はAL2です。

## 結論
```
RUN yum -y update && yum -y install findutils xargs libcap coreutils procps net-tools shadow-utils sudo
```

なんか足りない気がするw
その時はまた追記します。

簡単ですが以上です:fist:
スッキリわかるJava入門 実践編 第３版 まとめ -part15-設計の原則とデザインパターン

# はじめに
こんにちは　◤●ㅅ●◥ﾉ

今回はデザインの原則やパターンについて学びました！

## 第１５章　設計の原則とデザインパターン
### 1.優れた設計の原則
開発をしていくと自分の作ったクラスの設計に以下のような悩みが出てくる
:star: クラス設計によくある悩み
・似たような記述が何ヶ所もある
・１つのクラスにいろいろな処理を盛り込みすぎてわかりにくい
・分岐や繰り返しなどのネストが深く、処理の構造を把握しづらい
・たくさんのクラスに処理を分けすぎて、各クラスの内容が希薄である
・小さな機能追加をするだけなのに、修正箇所が多くて時間がかかる
・１ヶ所を修正すると、他のクラスにもかなりの影響が及んでしまう

:star: 優れた設計の原則を知る

### 2.コード記述全般に関する原則
#### 同じことを何度もやらない（DRY）
同じような処理内容の記述があちこちに登場する助長なコードは悪い設計の代表である
→コードを記述するときには __DRY（同じことを何度もするな）__　の原則を意識する

#### 意味や意図を明確に記述する(PIE)
どのような処理をしているのかわかりにくいコードや動作を誤解してしまうようなコードは
処理内容を理解するために時間がかかること以上に、修正時に不具合を混入させやすい問題がある
→コードを記述する際には、 __PIE（明確かつ表現豊かに記述する）__　の原則も意識する
手軽に実践できる手法３つ
1.適切な名前を選ぶ
2.マジックナンバーに名前をつける
3.複雑な処理に名前をつける

### 3.クラスの設計に関する原則
#### クラスに与える責務は１つだけ（SRP）
クラスを設計する際に重要なのは、 __単一責任原則__
→１つのクラスに１つの役割（責務）だけを持たせるという原則
複数の役割を持っているクラスがあれば分割してわかりやすくする

#### 既存部分の修正なしで拡張可能に（OCP）
ソフトウェアが完成した後に顧客の要望などで機能を追加しなければならなくなることがよくある
そのときに単なる追加なのに既存部分のコードも含めて修正しなければならない場合とても大変いなる
→そこで　__解放閉鎖原則__　を念頭におき、クラスの未来を考えながらコードを記述するようにする
この原則は「将来自由に拡張でき、変更に対して既存の部分の変更の不要」な設計を推奨するもの

### 4.クラスの関係に関する原則
#### 安定したものに依存する（SDP）
プログラムは多数のクラスで構成されているが、クラスによって修正の発生頻度には違いがある
変更が発生しにくいものを安定的なクラス、修正頻度が比較的高いと想定されるものを不安定なクラス
→ __安定依存の原則（SDP）__　ではなるべく安定的なクラスに依存すべきであるとしている
修正頻度が高いクラスに依存すると自身も高い頻度で修正が必要になってしまう

#### 循環依存、相互依存を避ける（ADP）
__非循環依存の原則（ADP）__　はクラス同士の循環依存をいさめる原則
循環、または相互で依存している場合依存関係を構成するどれか１つのクラスに修正が発生したときに
他のすべてのクラスも必ず修正が必要になってしまう

### 5.デザインパターン
:star: デザインパターンとは
設計原則やノウハウを取り入れた、設計の定石およびお手本
これらを参考にすることでより柔軟で優れた設計を実現できる

パターンを利用するメリット
1.開発者間のコミュニケーションが円滑になる
2.オブジェクト思考や設計原則の理解が深まる

デザインパターンには数えきれないくらいの種類がある
その中で有名なものとして　__GoFデザインパターン__　がある
GoFデザインパターンは２３のパターンが存在する
以下では入門に適したものを紹介する


### 6.Facade-内部を隠してシンプルに-
表の窓口や正面玄関のことをフランス語でFacade（ファサード）という
プログラムの設計においてファサード役となるようなクラスを準備すること
→Facadeパターン
ファサードがあれば細々とした作業はやってくれるため、コードがわかりやすくなる

### 7.Singleton-唯一無二の存在-
Javaにおいてクラスはインスタンスを作るための金型である
クラスという設計図でいくつものインスタンスを生み出すことができる
しかし、ただ一つだけしかないということもできる
→Singletonパターン
あるクラスを１回のみインスタンスを生み出せないようにできる

### 8.Strategy-プラグインの切り替え-
共通の抽象クラスを持つ複数のクラスを準備しておき、
どれをnewして利用するかを状況に応じて切り替える設計
→Strategyパターン

### 9.TemplateMethod-大まかなシナリオ-
処理の流れだけは確定し、それを開発者に強制する
→templeteMethodパターン

## まとめ
優れた設計の原則
・重複のないわかりやすいコードを書く
・クラスの責務は１つとし、修正することなく拡張を可能にする
・循環した依存や不安定なクラスへの依存を避ける
GoFパターンを初め、多数のデザインパターンが提唱されている


今回もありがとうございました！
ではまた〜　◤●ㅅ●◥ﾉ"
スッキリわかるJava入門 実践編 第３版 まとめ -part14-アジャイルな開発

# はじめに
こんにちは　◤●ㅅ●◥ﾉ

今回はJavaを用いた開発プロジェクトで成果が現れている手法や道具について学びました！


## 第１４章　アジャイルな開発
### 1.チーム開発の基盤
チームが共有すべき基盤となる要素
1.共通の目標
2.共通の言葉
3.共通の手順
↓
共通の価値観・思想

### 2.共通の言葉
共通の言語とは何か？
普段のコミュニケーションで使われるような「日本語」などの自然言語が挙げられる
しかし、それ以外にも使われているものがある
プログラムの内容を理解するためにはプログラム言語についての知識が必要になる
また複雑なプログラムの構造を表現することも必要になるため設計図の書き方とルールが規定されているモデリング言語についての知識も必要となる

モデリング言語の代表的なものとしてUMLというものが存在する
UMLで特に用いられるのがクラス図とシーケンス図である
__・クラス図__
クラスやインタフェースのメンバやほかのクラスとの関連を表現するために用いる図
１つのクラスを１つの四角形で表す
__・シーケンス図__
クラスを表す四角形およびその下の点線をメッセージと呼ばれる矢印でつなぎ、
クラス間の連携の手順を時間軸に沿って示す

また上記の２つ以外にプロジェクトが始まり、設計をする段階（要件定義）で使用する
__ユースケース図__ というものがある
ユースケース図は現実世界のどのような人が、システムを使って何ができるかを図として簡潔に表現する目的で使用される

### 3.共通の手順
通常の開発の手順は大きく分けて４つになる
1.要件定義
2.設計
3.実装
4.テスト

各工程には期限とそれまで終えなければいけないものが設定され、それらは __成果物__ と呼ばれている

どのような手順で工程を進めてソフトウェアを完成させるかを定めたもの
→ __開発プロセス__
開発プロセスの多くは２つに分類される

__・ウォーターフォール型__
各工程であいまいさや誤りを残さず完璧に仕上げてから次の工程に進む
全肯定の成果物に誤りが含まれていないことを前提とするため、大人数での分業や納期と要件範囲が固定された中での長期開発計画の立案が比較的行いやすいという特徴がある
__・スパイラル型__
最初から完璧なものを作ろうとせず、ある一部についてのみ、要件定義からの流れを進め完成した時点で依頼主に見せてフィードバックをもらう
その後に意見や要望に基づき修正や機能の追加を行う
こまめに依頼主と確認をとりながらプロジェクトの軌道修正を行なっていくことが特徴

### 4.アジャイルという価値観
人やコード変化への対応を重視する価値観をベースとしたものが __アジャイルソフトウェア開発手法__

具体的な開発の進め方として、２〜４週間程度の極めて短機関で工程を反復するスパイラル型開発プロセスを実践することを特徴としている
アジャイル開発における１回の工程反復期間のことを __イテレーション__　や　__スプリント__　と呼ぶ
チームは顧客と共にイテレーションを繰り返しながら、逐次、要件定義や実装を進めていく

### 5.エクストリーム・プログラミング
__エクストリーム・プログラミング（XP）__　とは
アジャイル開発方法論の１つでありソフトウェア開発の関係者が尊重すべき５つの「価値」を定めている
・シンプルさ
・コミュニケーション
・フィードバック
・相互尊重
・勇気

さらにこれらの価値観に基づいて実践すべき事項として、いくつかのプラクティスも定めている
特徴的なプラクティス
__・ペアプログラミング__
２人の開発者がペアとなって１つのコードを開発していく
１人がコーディングを行う隣でもう１人が様子を見てアドバイスをしたり、テストケースを考える

ペアプログラミングのメリットとして
・他人に見られるため品質が向上する
・コードに対して客観的な立場から即時にフィードバックが得られる
・相手の持つ知識やテクニックを得られる
などがある

### 6.スクラム
__スクラム__　は現在世界で最もよく活用されていると言われているアジャイル開発方法論
プログラムに関する言及はほとんどない
製品開発チームのアクメンバーの役割や連携をどのように実現するかを重視した、
アジャイルなプロジェクトチームマネジメント技法

スクラムではそれぞれのチームメンバーが担う役割として次の３つを定めている
1.プロダクトオーナー
チームが開発すべき製品に関する最終責任者
チームが作るべき機能の優先順位を定めるなど、チームの開発を方向付ける
2.開発メンバー
実際に開発を行うメンバー
プログラマ、デザイナ、テスターなどが含まれる
適宜お互いの作業を手助けしながら、チーム全体の成果に全員が責任を持つ
3.スクラムマスター
スクラムに関する専門家
プロダクトオーナーや開発メンバーが正しくスクラムを実践できるよう指導や助言を行ったり、
円滑なチーム活動とチームの成長を手助けする

スクラムで用いられる３つのリスト
1.プロダクトバックログ
製品が実現すべき要件や機能（フィーチャ）を優先度が高い順に箇条書きしたもの

2.スプリントバックログ
現在のスプリントで実現すべきフィーチャとその達成に必要な作業項目の一覧
実用上はタスクボードに整理して掲示することが多い

3.障害リスト
チームの円滑な活動を阻害している事柄を懸念度が高い順に箇条書きしたもの

スクラムが定める４つのミーティング
スクラムでは２〜４週間の開発周期をスプリントと呼び、それを繰り返しながら開発を進める
このスプリントにおいて実施しなければならない会議が４つ存在する
1.スプリント計画ミーティング
2.デイリースクラム
3.スプリント・レビュー
4.振り返り

## まとめ
クラスの静的構造と関連を表現するためにクラス図を利用する
オブジェクトの連携を時系列に沿って表現するためにシーケンス図を利用する
依頼主と要件を合意するために、ユースケース図を利用する
開発プロセスは各工程を完璧に仕上げてから次に進むウォーターフォール型と
繰り返しながら順次仕上げていくスパイラル型に分かれる
人とコードと変化への対応を重視する価値観に基づき、機敏に反復を繰り返す開発手法をアジャイル開発手法と総称する
代表的なアジャイル開発手法であるXPやスクラムでは、プログラミング作業やチーム活動に関する実践手法や規則を定めている

今回もありがとうございました！
ではまた〜　◤●ㅅ●◥ﾉ"
スッキリわかるJava入門 実践編 第３版 まとめ -part13-ソースコードの管理と共有

# はじめに
こんにちは　◤●ㅅ●◥ﾉ

今回はチームで開発活動を行う際の基盤となるツールについて学びました！

## 第１３章　ソースコードの管理と共有
### 1.チームによる開発
開発効率を上げる方法の１つとして複数人で手分けをする...分業

分業の特徴
長所も短所も全体に大きな影響を与える諸刃の剣になる

具体例
1.連携が悪いと開発効率に悪影響を与える
2.人数が増えるほど連携が難しくなる

:star: 分業のメリットを最大限に発揮するために
連携を維持改善するための方法、道具、ルール、メンバーの努力が欠かせない

連携を維持改善していくため、プロジェクトではさまざまな取り組みが行われる
→プロジェクトの運営や管理に関する工夫...プロジェクトマネジメント

### 2.ソースコードの共有
ソースコードの共有には共有のファイル置き場を使用することでもできる
しかし、アップロードの際に過去のソースコードは上書きされ失われてしまう
常に最新のものだけになり、過去のコード内容の変更の経緯を調べられない
→ソフトウェア開発の現場では、 __バージョン管理システム__　と言われる専用のファイル共有を使う

バージョン管理システムとは
複数の利用者間でファイルを共有することができる仕組み
ソフトウェア構成管理ツールと呼ばれることもある
ファイル置き場を __レポジトリ__ とよび、
各開発者はクライアントツールを使ってレポジトリとファイルをやり取りする
ファイルの過去のバージョンや、内容、作成者、変更点などをすべて記録として残せる
代表的なものとしてSubversionとGitが挙げられる

### 3.Gitの基礎
:star: Gitをはじめて使うにあたっての心構え
GItには豊富な機能や内部構造があり、それらを完全にマスターしようとせずに
日常的に使う範囲から着実に慣れていく

#### Gitの基本構図
![スクリーンショット 2023-10-17 15.39.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336192/f3ea3f1e-140b-a835-9ee0-8580a748e19c.png)

ソースコードが置かれるのは３つの場所になる
1. __ワークツリー__
　自分のpc内に置いている最新のソースコード一式
　ワークツリーにある各ファイルはエディタなどでいつでも編集することができる

2. __ローカルリポジトリ__
　自分のPC内に存在するGit専用のデータベースで「過去から現在までの全ソースコードとそのすべての変更の歴史」が書き込まれている
　通常ユーザーはリポジトリ内のファイルや歴史を直接編集することはできない
　後述のcommitという手続きによってワークツリー上のファイルや変更点を新たな「歴史」としてリポジトリに刻むことができる

3. __リモートリポジトリ__
　ローカルリポジトリ同様、「過去から今までの全ソースコードとそのすべての変更の歴史」を保持している
　ユーザーは後述のpushやpullという手続きを行なって自分のローカルリポジトリとリモートリポジトリをやり取りし、その内容を同期することができる

:star: リポジトリとワークツリーの違い
・リポジトリはローカルとリモートがあるがワークツリーはローカルしかない
・リポジトリには過去からの全バージョンが記録されているが、ワークツリーには最新版のファイルのみしかない
・ユーザーはリポジトリ内に記録されたファイルを編集できないが、ワークツリーのファイルは編集できる

#### Gitのアクション
Gitには知っておくべき３つのアクションが存在する

1. __commit__
commitとは手元のワークツリーのファイルに行った修正を新たな歴史としてローカルリポジトリに正式に記録する行為
commitを行うことでどのファイルの、どのbぶんが、いつ、誰によって修正されたかという情報が追記される

2.__push__
ローカルリポジトリに刻み込まれた歴史をサーバに送り、リモートリポジトリと歴史を同期するアクション
手元PCで行った修正をサーバに公開することができる

3.__pull__
リモートリポジトリの歴史をローカルリポジトリに同期する、ローカルリポジトリの最新版をワークツリーに反映するという２つの処理が連続して行われる

送り出す時にcommitとpushの２つになぜ分かれているのか？
以下のようなメリット
1.ネットワークに繋がらない環境でも開発できる
ローカルリポジトリにcommmitしながら開発を進めることができる

2.中途半端な状態を公開せずに済む
修正に日数がかかる作業の場合、作業記録を残すいざというときのバックアップとしてこまめにcommitしておくと安心
この時pushまですると中途半端な状態でソースコードがチームメンバーに伝わってしまい、迷惑をかける恐れがある

場所の関係の結ぶアクション... __clone__
はじめに開発環境を作る時に全ファイルの全歴史が詰まったリモートリポジトリの複製をローカルリポジトリとして自分のpcに落とすことができる

### 4.競合の発生と解決
__競合__　とは
自分のローカルリポジトリの全歴史をリモートに同期しようとした時、偶然ほかのメンバーによって異なる歴史が刻まれていたときに発生する
成功してしまうと意図せずに過去の歴史を書き換えてしまうことになりかねないためにGitの安全装置が止めてくれている状態

解決方法
ほかのメンバーによって変えられたほかの歴史をリモートからローカルに落として
自分の変えたものと歴史を混ぜることで解決することができる

### 5.ブランチ
__ブランチ__　とは
リポジトリの中の１つの歴史の流れが複数のcommitの数珠つなぎとしてつながっているこの流れのこと
特に指定されていないときはブランチの名前はmasterとなる

__マージ__
リポジトリ内にある２つのブランチをまーじして、１つの流れに統一すること

## まとめ
分業は最も基本的かつ有力な効率改善の方法である
しかし、連携がうまくいかないとかえって非効率になる
バージョン管理システムを用いて、ソースコードをチームで共有できる
バージョン管理システムには、ファイルの変更履歴や内容を格納できる
代表的なものとして、 GitやSubversionが存在する
Gitはリモートリポジトリ、ローカルリポジトリ、ワークツリーの３つの場所が関係している
操作にはclone,pull,commit.pushなどのアクションを使いソースコードの共有を実現する

今回もありがとうございました！
ではまた〜　◤●ㅅ●◥ﾉ"
スッキリわかるJava入門 実践編 第３版 まとめ -part12-メトリクスとリファクタリング

# はじめに
こんにちは　◤●ㅅ●◥ﾉ

今回は品質を「見える化」し、戦略的に改善していくについて学びました！

## 第１２章　メトリクスとリファクタリング
### 1.品質の「見える化」
本番の開発現場において品質向上に取り組む場合、品質に不安を感じ続ける
→以下のことは容易に把握できないため
・プログラムやクラスの使われ方についての全パターン数
・テストで試したパターン数（カバー率）

目に見えにくい、把握しにくい「品質」について
単に高い、低いという感覚ではなく数値として見える化することで根拠にする

品質に限らずに、開発に関する把握しにくいさまざまな事柄について「見える化」したもの
→ __メトリクス__

テストによるカバー率...　テストカバレッジ（網羅率）　というメトリクスの一種

カバー率の指標がコードカバレッジと呼ばれるもの
代表的なものとしては命令網羅率、分岐網羅率が知られている
客観的な数値として計測、活用できるメトリクス

:star: 命令網羅率の数え方
1.ソースコード中の命令文をすべて数える
2.テストケースを実行した場合に通る命令文を数える
3.2の数を1の数で割る

:star: 分岐網羅率の数え方
1.フローチャート中の分岐記号だけに注目する
2.すべての分岐記号について、流れ出ている各経路の隣に矢印を描く
3.テストを実行した際に通過した経路の矢印に印をつける
4.3によりまるで囲まれた矢印の数を、2で書いたすべての矢印の数で割る

:warning:メトリクスを適切に使う
メトリクスはあくまでも手段であって、目的ではない
メトリクスはあくまでも道具であって、道具に使われてはいけない

### 2.さまざまなメトリクス
便利な３つの指標について知る

__LOC__ (Lines of Code) 
プログラムの行数のこと
コード行数を手作業で数えるほかさまざまなツールを使って計測することができ、
簡単にコードの規模を把握することができる
あくまで規模をおおまかに捉えるための道具と割り切って使う

__CC__ (Cyclomatic Complexity) 
「マッケーブの循環複雑度」とも呼ばれる
CCはある特定のメソッドの中身がどれだけ複雑化を表す１以上の数値
大きいほど複雑であることを示している
分岐やループが多く使われるほど高い数値を示す

__WMC__ (Weighted Method Per Class)
あるクラスに含まれる全メソッドのCCを合計した値、クラスの複雑度を示す
WMCが異常に吐出しているクラスは、複数に分割することを検討すべきかもしれない

### 3.リファクタリング
プログラム開発はとても複雑で試行錯誤しながら進める行為
→意識せずに放っておくと開発中のプログラムはどんどん複雑なものになっていく

最終的には手がつけられなくなる借金みたいなもの...　技術的負債と呼ばれる
→時々コードを見直して「カイゼン」する __リファクタリング__　という活動が推奨される

リファクタリングとは
外部から見た動作仕様を変えずに、内部構造を改善することを指す
以下の代表的なものがリファクタリング活動
1.重複部分を１箇所にまとめる
2.メソッドやクラスを分割する
3.外部ライブラリやJavaの新しい文法を利用する
4.コメントなどを適正につける

リファクタリングを行うことで新たなバグを混入させてしまう危険性がある
→リグレッションテスト（再度同じテストを行うこと）を行う
リファクタリングの際にバグが入っていても多くの場合はテストが失敗して気づくことができる

:warning: リファクタリングの注意点
1.納期直前はリファクタリングのメリットが得られにくい
2.むやみにやらない、やりすぎない

### 4.コードの静的解析
やみくもにリファクタリングをしないように「どこが悪いのか」「何が悪いのか」をある程度明確にする必要がある
そこでソースコードの中身を相席して問題がある箇所をあぶり出したり、評価材料となる情報を集める
__静的コード解析__　が行われる
多くの場合はツールを用いて行われる

２つの代表的なツール
1.SpotBugs
　コード内に含まれる「バグの原因になりそうな危険な記述」を探し出してくれるツール
例：文字列を==演算子で比較しているなど
2.Checkstyle
「Javadocコメントがついてない」「インデントがおかしい」「クラス名が大文字で始まっていない」といったコーディングスタイルに関するルール違反を検出するためのツール

## まとめ
品質は目に見えないため把握しにくいが、メトリクスとして測定することで可視化できる
テストのカバー率は、カバレッジとして計測することができる
プログラムの規模を大まかに示す指標として、LOCがある
コードの複雑度を示す指標には、CCやWMCがある
メトリクスは品質を把握するための手段であり、最終目的ではない
外部仕様を変更せずに内部構造を改良することをリファクタリングという



今回もありがとうございました！
ではまた〜　◤●ㅅ●◥ﾉ"
【Python】zipファイルを解凍せずに中身を読む

<!-- Pythonでzipファイルを解凍せずに中身を読む -->

Apacheのアクセスログのような大量のzipファイルの中身を解析したい時などに、いちいち解凍するとディスクが圧迫されます。zipのままに中身にアクセスする方法として、うまくいったやり方をまとめてみました。

# やりたいこと

1. txtファイルなどをまとめたzipファイルを解凍せずに、中のtxtファイルの内容を読む
2. Pythonで行う

# 結論
```python
import zipfile

zip_file_path = "<zipファイルのパス>"
target_file_path = "<zipファイルの中にある目的のtxtファイル>"

with zipfile.ZipFile(file_path, "r") as zip_ref:
    with zip_ref.open(target_file_path, "r") as file:
        for line in file:
            line_decoded = line.decode("utf-8")
            # line_decodedに対してやりたいことを追記する
```

`ZipFile`ライブラリという標準ライブラリを使えば上手くいきます。

`zipfile.ZipFile`オブジェクトの`open()`関数は、zipアーカイブ内のファイルを開くための関数です。この関数を使用すると、zipアーカイブ内のファイルを読み取りモードで開くことができます。

あとは、`for line in file`みたいなノリで一行ずつ処理するなり好きにすればよいと思います。

# 参考にさせていただいた記事
- [pythonでzipを解凍せずに画像ファイルを読み込み、numpyの配列に格納する方法](https://qiita.com/kame_yang/items/91a203480bc2bf61ad4a)
BGPとOSPFの学習

## BGP

### パスベクトル型

https://www.lab-infra.com/bgp/bgp2

## OSPF

### リンクステート型
### OSPFは定期的にhelloパケットを出す
### コストを同じに設定して負荷分散させることも可能

https://www.infraexpert.com/study/ospfz14.1.html
【Pytorch】DataLoaderの乱数を固定する方法（備忘録）

# 内容
datasetからミニバッチを作成する際によく使用する```DataLoader```。
しかし、記述次第では毎回バラバラなバッチを取り出してしまうことに。。。
そこで、本記事ではこの **取り出し方（乱数）** を固定する方法を記述したい。

# 環境
- Python 3.10.12
- torch 2.0.1

# 実装
```python
seed = 42

def seed_worker(worker_id):
    worker_seed = torch.initial_seed()

    # Seed other libraries with torch's seed
    random.seed(worker_seed)

    # Numpy seed must be between 0 and 2**32 - 1
    if worker_seed >= 2 ** 32:
        worker_seed = worker_seed % 2 ** 32
    np.random.seed(worker_seed)


train_loader = DataLoader(
                            train_dataset,
                            batch_size=100,
                            shuffle=True,
                            num_workers=2,
                            worker_init_fn=seed_worker, # <--- 追加
                            generator=torch.Generator().manual_seed(seed), # <--- 追加
                        )
```
基本的に、シード値を設定した上で、```worker_init_fn```と```generator```の2つの引数を記述してもらうことで乱数を固定することができる。
【Vercelデプロイ時のエラー】Error: Node.js Version "14.x" is discontinued and must be upgraded. Please set Node.js Version to 18.x in your Project Settings to use Node.js 18.

## エラー
Vercelデプロイ時に以下のエラーが発生
`Error: Node.js Version "14.x" is discontinued and must be upgraded. Please set Node.js Version to 18.x in your Project Settings to use Node.js 18.`

## 対処法
①デプロイできないプロジェクトの画面(以下のスクショ)の"Settings"を開く
![スクリーンショット 2023-10-19 16.51.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1216661/0ab7a561-d0fa-0842-cdc1-077107cd849c.png)

②"Node.js Version"を18.xにする
![スクリーンショット 2023-10-19 16.53.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1216661/87d1f8ed-f714-0bf5-7b72-3de79dfc04c6.png)

解決！
【Azure】SQL Server 移行パス

## 0. はじめに
オンプレミス環境上の SQL Server を Azure へ移行することを検討する場合、Azure上で選択可能なSQL Sever関連のマネージドサービス (PaaS)の種類が多く、どのマネージドサービスが要件 (Fit & Gap) を満たす最適なサービスであるか、悩まれている方もいるのではないでしょうか。
今回、**「SQL ServerのAzure移行に向けたフローチャート」** を作成してみようと思います。

## 目次
[0. はじめに](#0-はじめに)
[1. SQL ServerのAzure移行に向けたフローチャート](#1-sql-serverのazure移行に向けたフローチャート)
[2. SQL ServerのAzure移行に関する参考情報](#2-sql-serverのazure移行に関する参考情報)
[3. 最後に](#3-最後に)

## 1. SQL ServerのAzure移行に向けたフローチャート
![SQL Server マイグレーション フローチャート_20231023.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3540203/3d0fbd7b-9e83-946e-b2d8-d81b8dcedde7.jpeg)

## 2. SQL ServerのAzure移行に関する参考情報
SQL ServerのAzure移行に関する参考情報、移行時の注意点、Fit＆Gap 分析に役立つ情報などをまとめた **「Microsoft Learn コレクション」** を作成してみました。

[Microsoft Learn コレクション (SQL ServerのAzure移行)](https://learn.microsoft.com/ja-jp/collections/4wyyuroj8r6g3w?wt.mc_id=DP-MVP-5004154)


## 3. 最後に
今回、**「SQL ServerのAzure移行に向けたフローチャート」** の作成、および、SQL Serverの移行計画に参考となる公開情報をまとめた **「Microsoft Learn コレクション」** の作成、共有を実施してみました。
SQL ServerのAzure移行を検討する際の参考になればと思います。

なお、各種クラウドサービスは日々進化していくため、移行を検討の際には、マイクロソフトが公開している最新の公開情報についても確認ください。
【Swift】CIFilterで画像のホワイトポイントを変更する

# はじめに
CIFilter8日目

# サンプルアプリ
![Simulator Screen Recording - iPhone 15 - 2023-10-19 at 15.59.41.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/6e6447e3-795b-c74e-aa08-6d4f5f914045.gif)

# 実装
```swift
import SwiftUI

struct ContentView: View {
    private let image = UIImage(named: "sample")!

    @State private var uiImage: UIImage?
    
    @State private var red: CGFloat = 0.0
    
    @State private var green: CGFloat = 0.0
    
    @State private var blue: CGFloat = 0.0

    var body: some View {
        ScrollView {
            VStack {
                if let uiImage {
                    Image(uiImage: uiImage)
                        .resizable()
                        .scaledToFit()
                } else {
                    Image(uiImage: image)
                        .resizable()
                        .scaledToFit()
                }

                HStack(spacing: 15) {
                    Button {
                        applyWhitePointFilter()
                    } label: {
                        Text("適用")
                    }
                    
                    Button {
                        uiImage = nil
                        red = 0.0
                        green = 0.0
                        blue = 0.0
                    } label: {
                        Text("リセット")
                    }
                }
                
                VStack {
                    Text("red: \(red.description)")
                    Slider(value: $red, in: 0...1)
                }
                
                VStack {
                    Text("green: \(green.description)")
                    Slider(value: $green, in: 0...1)
                }
                
                VStack {
                    Text("blue: \(blue.description)")
                    Slider(value: $blue, in: 0...1)
                }
            }
            .padding(.horizontal, 20)
        }
    }

    func applyWhitePointFilter() {
        let context = CIContext()
        let inputImage = CIImage(image: image)!
        let inputColor = CIColor(red: red, green: green, blue: blue)
        
        guard let whitePointFilter = CIFilter(name: "CIWhitePointAdjust", parameters: [
            kCIInputImageKey: inputImage,
            kCIInputColorKey: inputColor
        ]) else { return }
        guard let outputImage = whitePointFilter.outputImage else { return }
        guard let cgImage = context.createCGImage(outputImage, from: outputImage.extent) else { return }
        self.uiImage = UIImage(cgImage: cgImage)
    }
}
```

# おわり
画像の色味を調整できました
AndroidでtextboxのautoFilter機能を使いフィルタリング機能を実装してみた

# 目次
1. はじめに
1. 完成イメージ
1. 実装方法
1. 最後に


# はじめに
textboxのプロパティには、入力した文字を元に入力候補を表示してくれるautoFilterという機能があります。
今回はそのautoFilterの実装方法について紹介していきたいと思います！

:::note
autoFilterは、モバイルのAndroidとWindowsのみ設定することができます。
iOSでは機能しないためご注意ください。
:::

# 完成イメージ
今回の完成イメージはこちらです。
テキストボックスに社員名を入力すると、入力した文字に応じて候補が表示されるような簡単なアプリを作っていきます。
![ezgif-3-72ef0b8ec4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/6185c743-d7bc-a34f-b9e2-9d91946febab.gif)


# 実装方法
まずは画面を作成していきましょう。
社員検索画面を作成したいので、このように画面を作成しました。

![スクリーンショット 0005-10-19 15.37.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/28bb7245-0e1a-148f-56fe-0d5bfe292d1b.png)

テキストボックスを配置したら、右側のPROPERTIES->Text Boxタブをクリックし、
Auto FilterをOnに設定してください。
![スクリーンショット_0005-10-19_15_37_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/71a51616-dcd0-1493-b8d0-57bbac190c85.png)

次にControllerを開き候補を表示するロジックを記述していきます。

```frmAutoFilter.js
  preShow: function(){
    this.view.txtSearch.filterList =["田中","山田","大木","大島"];
  }
```

`filterList`：
このメソッドを使うと、フィルターの候補として表示するフィルターリストを定義することができます。
今回は固定データとしていますが、APIから取得する場合も配列形式であれば同様に設定することが可能です。

関数の定義ができたので、あとはFormのアクションエディタでアクションを設定すれば完成です。
![スクリーンショット_0005-10-19_15_43_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/475032e2-df85-13e5-01a1-43e587301038.png)
![スクリーンショット 0005-10-19 15.44.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/f4f0701f-9bc0-cbba-1d72-0dd384f7f74f.png)

早速動作をみてみましょう！

文字を入力するとfilterListに設定されている文字が候補として出てきているのがわかるかと思います👀
![ezgif-3-72ef0b8ec4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/54b962a1-8c38-f0de-2859-4394837d868d.gif)

フィルターリストの色についてですが、Windowsの場合のみ変更可能でAndroidでは変更ができません。。

Windowsのみ以下のプロパティも使用可能ですので、必要に応じて使ってみてください。

|プロパティ名|詳細|
|--|--|
|filterCriteria|前方一致、部分一致など検索方法を設定することができる|
|filterBoxSkin|フィルターリストの色を変更することができる|

# 最後に
autoFilterの機能について紹介しました！
モバイルのAndroidとWindowsのみで、実装できる端末は限られていますが、
簡単なアプリを実装する場合などロジックはほぼ不要で
すぐに実装することができるため、是非活用してみてくださいね:relieved:

# 参考
https://opensource.hcltechsw.com/volt-mx-docs/docs/documentation/Iris/iris_widget_prog_guide/Content/TextBox_Properties.html#filterLi
C# LINQ チーとシート

技術記事: **C# LINQ メソッドの使い方**

C#において、LINQ (Language Integrated Query) はデータへのクエリを簡潔に書くための強力な機能です。以下に、よく使われるLINQメソッドの使い方を具体的な例とともに紹介します。

1. **Select** - コレクション内の各要素に対して操作を行う
```csharp
var numbers = new[] { 1, 2, 3, 4, 5 };
var squaredNumbers = numbers.Select(n => n * n);
```

2. **Where** - コレクション内の要素をフィルタリングする
```csharp
var evenNumbers = numbers.Where(n => n % 2 == 0);
```

3. **OrderBy** - コレクション内の要素を昇順に並び替える
```csharp
var orderedNumbers = numbers.OrderBy(n => n);
```

4. **OrderByDescending** - コレクション内の要素を降順に並び替える
```csharp
var descendingNumbers = numbers.OrderByDescending(n => n);
```

5. **ThenBy** - 前のOrderByまたはThenByの後に追加のソート条件を適用する
```csharp
var people = new[] 
{ 
    new { Name = "Alice", Age = 30 },
    new { Name = "Bob", Age = 30 },
    new { Name = "Charlie", Age = 25 }
};
var orderedPeople = people.OrderBy(p => p.Age).ThenBy(p => p.Name);
```

6. **ThenByDescending** - 前のOrderByまたはThenByの後に追加の降順ソート条件を適用する
```csharp
var descendingOrderedPeople = people.OrderBy(p => p.Age).ThenByDescending(p => p.Name);
```

7. **GroupBy** - コレクション内の要素をキーに基づいてグループ化する
```csharp
var ageGroups = people.GroupBy(p => p.Age);
```

8. **ToList** - コレクションをListに変換する
```csharp
var numberList = numbers.ToList();
```

9. **ToArray** - コレクションを配列に変換する
```csharp
var numberArray = numbers.ToArray();
```

10. **First** - コレクションの最初の要素を返す
```csharp
var firstNumber = numbers.First();
```

11. **FirstOrDefault** - コレクションの最初の要素を返す。存在しない場合はデフォルト値を返す
```csharp
var firstOrZero = numbers.FirstOrDefault(n => n > 10);
```

12. **Last** - コレクションの最後の要素を返す
```csharp
var lastNumber = numbers.Last();
```

13. **LastOrDefault** - コレクションの最後の要素を返す。存在しない場合はデフォルト値を返す
```csharp
var lastOrZero = numbers.LastOrDefault(n => n > 10);
```

14. **Single** - コレクションから単一の要素を返す
```csharp
var singleNumber = numbers.Single(n => n == 3);
```

15. **SingleOrDefault** - コレクションから単一の要素を返す。存在しない場合はデフォルト値を返す
```csharp
var singleOrZero = numbers.SingleOrDefault(n => n > 10);
```

16. **Count** - コレクション内の要素数を返す
```csharp
var totalCount = numbers.Count();
```

17. **Sum** - コレクション内の数値要素の合計を返す
```csharp
var totalSum = numbers.Sum();
```

18. **Average** - コレクション内の数値要素の平均値を返す
```csharp
var averageValue = numbers.Average();
```

19. **Max** - コレクション内の最大値を返す
```csharp
var maxValue = numbers.Max();
```

20. **Min** - コレクション内の最小値を返す
```csharp
var minValue = numbers.Min();
```

21. **All** - 全ての要素が指定した条件を満たすかどうかを確認する
```csharp
var allEven = numbers.All(n => n % 2 == 0);
```

22. **Any** - いずれかの要素が指定した条件を満たすかどうかを確認する
```csharp
var anyOdd = numbers.Any(n => n % 2 != 0);
```

23. **Contains** - コレクションが特定の要素を含むかどうかを確認する
```csharp
var containsThree = numbers.Contains(3);
```

24. **Distinct** - コレクションから重複する要素を除いて返す
```csharp
var distinctNumbers = numbers.Distinct();
```