OmniAICreator/Qiita-1.07M huggingface dataset:
【小ネタ】AWS IQでAWS HEROESは召喚できるのか？

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

そろそろ小ネタ的なブログを執筆したいと思ったので色々調べてみたところ、**AWS IQ**なるサービスがあるようでしたので調べてみました。

:::note info
小ネタレベルの記事ですので気軽に読んでください
:::

# Amazon IQとは

ざっくり言えば**AWSが選んだ専門家とマッチングさせるためのプラットフォーム**です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/9c7dc7d5-8d2e-4e4e-9f7e-c5a369ae1a8f.png)

https://iq.aws.amazon.com/

以下のような申請フォームで専門家へ案件を依頼できるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/05fdef7c-eb65-49f2-9487-be9b962312b1.png)

プロジェクト例として以下が示されていました

1. VPC へのリモート VPN アクセス
>リモート ワーカーが多要素認証を備えた VPN クライアントを使用して VPC に接続できるようにしたいと考えています。ユーザーは VPN 経由で EC2 および RDS インスタンスにアクセスできる必要があります。できるだけ早くこれを設定したいと考えています。

予算: 1,000ドルから10,000ドル

1. サーバーレス アーキテクチャの VPC 構成にサポートが必要
>インターネット経由のアクセスを最小限に抑えるために、VPC 内のサーバーレス アーキテクチャ (Lambda、API Gateway、DynamoDB、S3、Cloudwatch) 内のすべての AWS サービスを設定したいと考えています。目的は、サービスの周囲に保護レイヤーを作成することです。これを 1 週間で完了させたいと考えています。

予算: 100ドルから1,000ドル

1. データウェアハウスを構築する
>DynamoDB レポート ソリューションを構築して、ビジネス チームがデータをレポートできるようにしたいと考えています。さまざまな AWS データベース間のトレードオフを説明できる人を探しています。次に、これを実行するための CloudFormation スクリプトを構築できる人を探しています。今日相談して、2 週間以内にプロジェクト全体を完了したいと考えています。

予算: 1,000ドルから10,000ドル

（AWSの業務これで完結するんじゃ,,,）

支払方法・スペシャリストの選定条件などはFAQで示されていました。FAQを読んでみても、**AWS
のアーキテクチャ実装でお困りごとがある企業への人材リソース提供**を目的にしているのかなぁと思いました（やはり中国リージョンはサポート外のようです...）

https://iq.aws.amazon.com/faq

## AWS HEROESは召喚できるのか？

公式ドキュメントの専門家認定条件として以下の通り示されていました。

- フリーランサーまたは企業で働く場合は、 AWS Marketplace がサポートする適格な管轄区域に拠点を置き、有効な税務情報と米国の銀行情報を保有している必要があります。米国の銀行口座をお持ちでない場合は、Hyperwallet を通じて取得できる可能性があります。Hyperwallet の詳細については、AWS Marketplace セラーガイドの「セラー登録プロセス」を参照してください
- AWS Marketplace に販売者として登録され、公開プロフィール、銀行口座、税金の詳細が提供されています
- 承認された権限を持つユーザーアカウントがあります。詳細については、「AWS IQ を使用するための権限の設定」を参照してください
- 多要素認証 (MFA) が有効になっている AWS アカウントがあります。詳細については、AWS Identity and Access Management ユーザーガイドの「AWS でのユーザーの MFA デバイスの有効化」を参照してください
- 利用可能なリクエストを表示して応答するには、上記の前提条件に加えて、次の条件が満たされている必要があります
- 社内の専門家のうち少なくとも 1 人は、有効な AWS 認定 (アソシエイト、プロフェッショナル、またはスペシャリティ) を取得している必要があります

うーん、正直よくわからない...

公式ホームページに掲載されているカスタマーサクセス情報も見てみました。

https://iq.aws.amazon.com/customer-stories

対企業向けに依頼している事例が多かったので、**個人を対象とした案件は少ないのかなぁ**といった印象を持ちました。

## まとめ

法人向けサービスのようなので個人で触るのは限界がありそうでした。
（NDAまわりで多分書けないような感じでしたので...）

ブログなどで触れている方もほとんどいないように見えるので、
まさに密林案件なのかなぁと思いました。

小ネタレベルの記事ですが、最後までお読みいただきありがとうございまし
【岡本一洋】HTMLの最短学習法

岡本一洋です。

HTML（HyperText Markup Language）は、ウェブページを作成するための基本的な言語です。ウェブ開発を学ぶ上で最も基礎となる技術の一つですが、初心者にとっては「どこから始めればよいのか」と悩むことも多いでしょう。今回は、HTMLを効率的に学ぶための最短学習法について紹介します。

# 1. **HTMLの基本を理解する**

HTMLは「タグ」と呼ばれるコードを使って、ウェブページの構造を作成します。まず最初に覚えるべきことは、**HTML文書の基本的な構造**です。具体的には以下のようなものです。

```html
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>ページタイトル</title>
</head>
<body>
    <h1>見出し1</h1>
    <p>段落のテキスト</p>
</body>
</html>
```

上記のコードは、基本的なHTML文書の構成です。最初は、この基本構造を理解することが大切です。

## 学ぶべき基本的なタグ

- **`<html>`**: HTML文書を囲むタグ
- **`<head>`**: メタデータ（ページタイトルや文字コードなど）を記述する部分
- **`<body>`**: 実際のコンテンツが含まれる部分
- **`<h1>`～`<h6>`**: 見出しタグ（`h1`が最も重要な見出し）
- **`<p>`**: 段落タグ
- **`<a>`**: リンクタグ
- **`<img>`**: 画像タグ
- **`<ul>` / `<ol>`**: リストタグ（順序なしリスト、順序ありリスト）

# 2. **実際にコードを書く**

理論だけでは理解が深まりません。最も効果的な学習方法は、実際に自分でコードを書くことです。最初はエディタ（例：VSCodeやSublime Text）を使って、簡単なウェブページを作成してみましょう。例えば、以下のような簡単なページを作成してみてください。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>私のウェブページ</title>
</head>
<body>
    <h1>こんにちは、世界！</h1>
    <p>これは私が作った初めてのウェブページです。</p>
    <ul>
        <li>HTMLを学ぶ</li>
        <li>CSSを学ぶ</li>
        <li>JavaScriptを学ぶ</li>
    </ul>
</body>
</html>
```

これをブラウザで開いて、自分の作ったページを確認することで、HTMLの基本構造やタグの使い方が実感できます。

# 3. **インラインCSSを使ってデザインを学ぶ**

HTMLの学習と並行して、**CSS**（Cascading Style Sheets）も学ぶことをおすすめします。CSSはウェブページのデザインを整えるための言語です。HTMLで構造を作り、CSSでデザインを施すことで、実践的なウェブページを作成することができます。

最初は、インラインCSSを使って簡単にデザインを加えてみましょう。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>シンプルなページ</title>
</head>
<body style="background-color: lightgray; font-family: Arial, sans-serif;">
    <h1 style="color: blue;">ウェブページのタイトル</h1>
    <p style="color: green;">HTMLとCSSを使って、簡単なデザインを作成しています。</p>
</body>
</html>
```

上記のコードでは、**インラインCSS**を使って、ページの背景色や文字色、フォントを設定しています。CSSの基本を学ぶことで、ページのデザインを自由に調整できるようになります。

# 4. **リファレンスを活用する**

HTMLやCSSのリファレンスは豊富に存在します。わからないことがあった場合、すぐに調べられるように、信頼できるリファレンスサイトを活用しましょう。例えば、以下のサイトは初心者にもおすすめです。

- **MDN Web Docs**（Mozilla Developer Network）: [https://developer.mozilla.org/ja/](https://developer.mozilla.org/ja/)
- **W3Schools**: [https://www.w3schools.com/](https://www.w3schools.com/)

これらのリファレンスサイトでは、タグの使い方やプロパティの説明が詳しく載っており、非常に役立ちます。

# 5. **プロジェクトを作って学ぶ**

HTMLを学んでいる最中に、**小さなプロジェクト**を作成することをおすすめします。例えば、**個人のポートフォリオサイト**や**ブログページ**など、自分が興味を持っているテーマでページを作成してみましょう。こうすることで、学んだことを実践的に活用し、より深く理解することができます。

# まとめ

HTMLを最短で学ぶためには、基本的なタグを覚え、実際に手を動かしてコードを書くことが不可欠です。また、CSSやJavaScriptも併せて学ぶことで、ウェブページの見た目や動きに関しても理解を深めることができます。初心者にとっては、実践を重ねることが一番の近道です。興味を持って、少しずつステップアップしていきましょう。
Windowsでhead、tailが使いたい


WindowsとLinux系のOSをどちらも利用していると、
色々なコマンドなり機能なりで、あっちにこれがあったら良いのにな、
と思うことがあるかなと思います。

今回はそのうちの一つで、「Windowsでhead、tailが使いたい」という要望を、
状況に応じてアプローチの整理をしてみました。

# アプローチの整理

```mermaid
graph TD
  A[Windowsでhead/tailを使いたい] -->|インターネットからダウンロード、インストール可| B[既存のツールを導入]
  A -->|インターネット不可| G[標準機能で実装]

  B -->|Linux環境を整える| C[WSL（Windows Subsystem for Linux）]
  B -->|新しいターミナルを導入| D[Git Bash / Cmder / MSYS2]
  B -->|最小限のUnixコマンドを追加| E[GNU Coreutils / BusyBox]

  G -->|スクリプトを作成| H[PowerShell / Batch / VBScript]
  G -->|コンパイラ導入可能ならコンパイル済みのアプリを用意| I[C / C++ で自作]

  C --> J[UbuntuなどをインストールしてLinux環境を使用]
  D --> K[Git Bash / Cmder / MSYS2でUnixコマンドを利用]
  E --> L[GNU Coreutils / BusyBoxをインストールしhead/tailを使う]

  H --> M[PowerShellのGet-Contentを活用]
  H --> N[Batchでfor /F + moreを使用]
  H --> O[VBScriptでファイル処理]

  I --> P[MinGWやVisual Studioでコンパイル]

```
# フローチャートの解説
- インターネットが利用可能か、インストールが可能か
  - 可能なら、既存のツールを導入するのが簡単。
  - 不可能なら、Windows標準機能で実装する必要がある。
- 既存のツールを導入
  - Linux環境を整える（WSL） → Ubuntuなどを使い、head / tailをそのまま実行可能。
  - 新しいターミナルを導入 → Git Bash、Cmder、MSYS2をインストールし、Unixコマンドを使う。
  - 最小限のUnixコマンドを追加 → GNU CoreutilsやBusyBoxでhead / tailだけを追加。
- 標準機能で実装
  - スクリプトを作成 → PowerShell(Get-Content)、バッチ(for /F + more)、VBScriptで代替機能を実装。
  - コンパイル済みアプリを用意 → 対象端末にコンパイル環境があれば、C / C++でhead / tailを作成し、MinGWやVisual Studioでコンパイル。他言語でも実装は可能。

# おすすめ
- 簡単に使いたい → WSL / Git Bash / Cmder
- 軽量に導入したい → GNU Coreutils / BusyBox
- スクリプトで対応したい → PowerShell / Batch
- 完全にWindows標準でやりたい/やらねばならぬ → Batch / VBScript
- C / C++ で学習したい → MinGWやVisual Studioで開発

:::note info
標準のコマンドプロンプトでやってみる、という場合は以下をご利用ください。

https://qiita.com/kubo4ka/items/3ff8d00f2e1cdb0431cd

:::

個人的には履歴機能あって、ぱっと見使いやすいのでcmder導入が好きです。
GitBashも勿論良いと思います。
クイズ的な感じでコマンドプロンプトで実装するのは楽しかったです。
ただ、ファイルサイズ大きいものには向かないとか、問題あるので、
可能なら素直に何らかのツール導入が良いかと思います。
【Python】距離行列の計算と実行時間

距離行列（distance matrix）とは、データセットに含まれる各要素間の距離を表した行列のことです。データ解析、クラスタリング、機械学習の前処理など、さまざまな場面で広く用いられています。
本記事ではランダムに生成した3次元データを用いてPython環境で距離行列を作成し、実行時間を比較します。

```python:ランダムに生成した3次元データ
import numpy as np

np.random.seed(42)
data = np.random.rand(1000, 3)
```

## 距離行列の作成例

### 1. scipyを用いた方法

```python
from scipy.spatial import distance

dist_matrix = distance.cdist(data, data, metric='euclidean')
```

### 2. sklearnを用いた方法

```python
from sklearn.metrics import pairwise_distances

dist_matrix = pairwise_distances(data, metric='euclidean')
```

### 3. numpyを用いた方法

```python
import numpy as np

def numpy_distance_matrix(data):
    sum_sq = np.sum(np.square(data), axis=1)
    dist_matrix = np.sqrt(np.maximum(sum_sq[:, np.newaxis] + sum_sq - 2 * data.dot(data.T), 0))
    return dist_matrix

dist_matrix = numpy_distance_matrix(data)
```

> numpyには距離行列を与える関数が組み込み関数としては実装されていないため、ここではベクトル計算として実装している。

### 4. numbaを用いた方法

```python
from numba import jit
import numpy as np

@jit(nopython=True)
def numba_distance_matrix(data):
    n = data.shape[0]
    dist_matrix = np.zeros((n, n))
    for i in range(n):
        for j in range(n):
            dist_matrix[i, j] = np.sqrt(np.sum((data[i] - data[j])**2))
    return dist_matrix

dist_matrix = numba_distance_matrix(data)
```

### 5. 純粋なPythonによる実装（mathライブラリ）

```python:純粋なPythonによる実装（mathライブラリ）
import math

def plain_Python(data):
    n = len(data)
    distance_matrix = [[0.0 for _ in range(n)] for _ in range(n)]
    for i in range(n):
        for j in range(n):
            tmp_distance_sq = 0.0
            for k in range(3):
                tmp_distance_sq += (data[i][k] - data[j][k]) ** 2
            distance_matrix[i][j] = math.sqrt(tmp_distance_sq)
    return distance_matrix
```

### 6. 純粋なPythonによる実装（numpyライブラリ）

```python:純粋なPythonによる実装（numpyライブラリ）
import numpy as np

def plain_Python2(data):
    n = data.shape[0]
    dist_matrix = np.zeros((n, n))
    for i in range(n):
        for j in range(n):
            dist_matrix[i, j] = np.sqrt(np.sum((data[i] - data[j])**2))
    return dist_matrix
```

## 実行速度の比較（3次元データ）

各手法を同じデータ（1000個の3次元点列）に適用した際の平均実行速度を以下の表にまとめました。シード値を固定しない場合でも結果はあまり変わりません。

| | ライブラリ・手法          | 実行時間 (秒) |
| ----- | ----------------- | --------- |
| 1. | scipy             | 0.004471        |
| 2. | sklearn           | 0.006393        |
| 3. | numpy             | 0.010576        |
| 4. | numba利用         | 0.095734        |
| 5. | math + forループ | 1.880585      |
| 6. | numpy + forループ | 4.866355      |

> 10回の平均値として算出。実行時間は環境やバージョンにより変動するので、あくまで目安として考えてください。（特にnumbaに関してはチューニング次第でさらに速くなる可能性があります）
> | | 実行環境（参考） |
> | ----- | ----------------- |
> | Python | 3.9.12 |
> | CPU | AMD Ryzen 7 5800X3D 8-Core Processor |
> | RAM | 32 GB (DDR4-3600) |
> | scipy | 1.7.3 |
> | sklearn | 1.0.2 |
> | numpy | 1.21.5 |
> | numba | 0.55.1 |

## まとめ

- scipyとsklearnが最も高速かつ実用的。
- numpyのベクトル演算も高速だが、大規模データでは注意が必要。
- numbaは高速化が期待されるが、実際の速度は環境により大きく異なる。
- 純粋Pythonのforループ実装は速度が非常に遅く、実用的ではない。

目的やデータの規模に応じて適切な手法を選択することが重要です。
C言語等で実装するのが速くて良いですが、Pythonで距離行列を何度も計算する必要がある場合はとりあえずscipyを使っておけば良さそうです。for文ベタ書きならJITコンパイラが実装されているJulia言語などでも速そうです。
AWS SAAを受けてみて


## はじめに
2025年の1月にAWS SAAを受験しました。
何とか合格することが出来ました。

## AWS SAAとは？
- AWSを使ったシステム設計や構築に関する知識を問う試験
- 問題数：65問(採点対象の問題はそのうち50問)
- 合格点：720点以上(1000点満点)
- 試験時間：130分
- 受験料：22000円（税込）
- 試験方式：CBT方式

## 著者のスペック
- 情報系の修士卒
- 社会人一年目(機械学習系の案件を担当)
- クラウドの知識はほとんど無し...

備忘録として合格するためにどのような勉強を行ったか紹介していきます

## 受験理由
本資格を受験しようとした理由は以下の通りです。
- 会社の資格手当対象資格だったため
- 案件先の業務でAWSに触れるようになったのでAWSの知識が必要だと感じたから

## 使用したテキストやサイト
①[徹底攻略 AWS認定 ソリューションアーキテクト − アソシエイト教科書 第3版［SAA-C03］対応](https://tatsu-zine.com/books/tettei-aws-sa-3ed)
②[https://mondai.ping-t.com/g](https://www.sg-siken.com/sgkakomon.php)

主にPing-tをメインに使用しました。①の黒本はインプット用に使用しましたがPing-tだけでも合格できると思います。

## 勉強時間
70~80時間くらいだと思います

## 勉強法
### 1. 黒本を1周する
流し見で早めに一周しましょう。というのもAWS SAAは範囲が広いので問題を解きながら知識を身に着けていく方が効率的だからです。

### 2. Ping-tの【試験レベル】以外の問題を8割ほどHit状態にする
全ての問題を解く必要はありません。最終的なゴールは試験レベルの問題を解けるようになることなので、ここではインプットとして各システムがどのようなことができるか理解していきましょう。

### 3. Ping-tの【試験レベル】の問題を全てHit状態にする
全ての問題をHit状態にするまで解きましょう。最初はほとんど解けないと思いますが問題をこなすうちにある程度選択肢が絞れると思います。この段階では問題者が重視していることは何かを意識して問題を解いていきましょう。

### 4. Ping-tの【試験レベル】の問題を全てコンボ状態にする
全ての問題をコンボ状態にするまで解きましょう。ここで間違えてしまった問題はPing-tのブックマーク機能を用いて復習問題として記録しましょう。また理解が曖昧な分野は2で解いた問題を復習して理解を深めましょう。

### 5. Ping-tの模試を解きまくる！
【試験レベル】の問題のみ出題されるように設定し、模試を実施しましょう。ここで80%以上の正答率を5回ほど達成すれば合格できる実力が十分身についていると思います。

ちなみに著者のPing-tのスタンプラリーは以下の通りです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4019599/4bb311d7-e551-402e-b61f-22eaf0f3d86c.png)

あと数回ほど模試で80%以上の正解率を出したかったですね...
ただ模試の正解率は低くても75%くらいだったと思います。

## 試験結果
- スコア：776点（合格ライン：720点）
- 結果：合格
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4019599/1502a6b3-64d3-4508-a790-3efbb3478109.png)

試験日の20時に合格通知が届きました。
なんとか合格できました

## 受験の感想
何問かはPing-tで見たことあるような問題でした。それ以外の問題はPing-tで似たような問題がなかったか記憶をひねり出しながら解いていきました。
またスコアの範囲は100~1000点なのですべての問題が間違っていても100点がもらえます。従って１問当たりのスコアは900÷50で18点くらいだと思います(当然問題の比重によって配点は変わると思います。)よって採点対象の問題を7割ほど解ければ合格点に達するかなぁと思います。
全ての問題を見直しして10分ほど余ったのでちゃんとやれば時間通りに終わると思います。

## おわりに
AWSの知識が0でしたが何とか合格できました。夏までにAWSの試験に多く合格しAWSの知識を身に着けようかなぁと考えています。
(小)規模マイコンでスタックチャン風のアニメを作って遊ぶ。(1)



仕様
----


- サイズは、128x64
- 枚数は、約10枚程度(たぶん8枚)
- なるべく、焼き付かないようにする
- 呼吸時にお口は、動く
- 瞬きする
- かわいい

図
----


![o_coq831.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e4c25f07-3535-4290-9c96-8a2f68e502e3.jpeg)
AtCoder ABC397 振り返り(緑コーダーがPythonでABC問題)

## AtCoder ABC397 振り返り

[オムロンプログラミングコンテスト2025（AtCoder Beginner Contest 397） - AtCoder](https://atcoder.jp/contests/abc397)

今回はABCの3問がACでした。今回はD問題以降の難易度が高かったらしく、3問正解だけでもレーティングは微減で済みました。

[D問題](https://atcoder.jp/contests/abc397/tasks/abc397_d)は解説を見ると、数式を色々とあれこれしてたので、たしかに難しかったです...。もしかしたらE問題に着手するほうが良かったのでしょうか。

## [A - Thermometer](https://atcoder.jp/contests/abc397/tasks/abc397_a)

場合分けして解きました。小数点が入ると誤差が気になるところですが、今回は特に問題なかったようです。

``` python
X = float(input())
if X >= 38:
    print(1)
elif 38 > X >= 37.5:
    print(2)
else:
    print(3)
```

## [B - Ticket Gate Log](https://atcoder.jp/contests/abc397/tasks/abc397_b)

問題文の通り、文字列Sを先頭から一文字ずつ調べていきます。私は文字列Sの管理にdequeを使っていますが、そのまま文字列でも良いかもしれません(→[公式解説](https://atcoder.jp/contests/abc397/editorial/12451))。
B問題としては、結構難しいような気もしました。

``` python
S = input()
queue = deque()
for s in S:
    queue.append(s)

pos = 1
count = 0 # 追加する文字数
last = ""
while queue:
    # 偶数番目で "o"なら　ok
    if pos % 2 == 0 and queue[0] == "o":        
        queue.popleft()
        last = "o"

    # 偶数番目で "i" なら、代わりに"o" を追加する
    elif pos % 2 == 0 and queue[0] == "i":        
        count += 1

    # 奇数番目で "i"なら　ok
    elif pos % 2 == 1 and queue[0] == "i":
        queue.popleft()
        last = "i"

    # 偶数番目で "o" なら、代わりに"i" を追加する
    elif pos % 2 == 1 and queue[0] == "o":
        count += 1

    pos += 1

# 最後が i のときは、o を追加する
if last == "i":
    count += 1

print(count)

```

## [C - Variety Split Easy](https://atcoder.jp/contests/abc397/tasks/abc397_c)

区切り位置を全探索し、そのたびに種類をカウントするのではTLEになってしまいます。そこで、あらかじめ種類を数えておきます。

数列Aを左から数えたときに、何種類が出現したか(fromleft)
数列Aを右から数えたときに、何種類が出現したか(fromright)

> A = 3 1 4 1 5 なら
> fromleft = 1 2 3 3 4 (種類)
> fromright = 4 3 3 2 1 (種類)

これを最初に求めれば、区切り位置に対する種類数をすぐに求めることができます。

> 区切り位置が i のときの種類数は
> count = fromleft[i] + fromright[i + 1]


``` python
N = int(input())
A = list(map(int, input().split()))

fromleft = [0] * N
fromright = [0] * N

# 左から調べたときの種類数(fromleft)を求める
tempset = set()
for i in range(N):
    tempset.add(A[i])
    fromleft[i] = len(tempset)

# 右から調べたときの種類数(fromright)を求める
tempset = set()
for i in range(N-1, -1, -1):
    tempset.add(A[i])
    fromright[i] = len(tempset)

# 区切り位置を変えて、最大値を求める
answer = 0
for i in range(N - 1):
    count = fromleft[i] + fromright[i + 1]
    answer = max(answer, count)

print(answer)
```
蔭山公望Tips：Webマーケターは文系が有利？

蔭山公望です。

Webマーケティングは、日々進化するインターネット環境の中で、企業の集客やブランド価値向上に欠かせない重要な役割を果たしています。そのため、多くの人がこの分野に注目し、キャリアを築こうとしていますが、「Webマーケターは文系が有利？」という疑問を抱く方も少なくないでしょう。実際に、Webマーケティングには文系と理系、どちらのバックグラウンドが有利なのでしょうか？この問題について掘り下げてみたいと思います。

## 1. Webマーケティングに必要なスキル

まず、Webマーケティングに求められるスキルは多岐にわたります。デジタル広告の運用、SEO（検索エンジン最適化）、コンテンツマーケティング、SNS運用など、それぞれに特化したスキルが求められますが、これらを支える基盤となるのがデータ分析や戦略立案です。特に、効果測定やキャンペーンの最適化を行うためには、ユーザー行動を分析し、どの施策が最も効果的かを見極める力が必要です。

## 2. 文系が有利な理由

Webマーケティングは、クリエイティブな側面とデータを駆使した戦略的な側面の両方が求められますが、文系出身者にとって有利な点がいくつかあります。

### 1) **コミュニケーション能力**

Webマーケティングにおいては、ターゲットオーディエンスとしっかりとコミュニケーションを取ることが重要です。コンテンツ制作やSNSの運用では、消費者がどのように感じ、どんな価値を求めているのかを的確に捉える必要があります。文系の教育は、文章力やコミュニケーション能力を高めることが多いため、この点で強みを発揮しやすいです。

### 2) **クリエイティブ思考**

Webマーケティングの成果は、どれだけ効果的なメッセージを作り、消費者の関心を引きつけることができるかにかかっています。文系の学問は、考える力や創造力を養うのに適しており、特にマーケティング戦略の立案や広告のコピーライティングなど、クリエイティブな作業においてその能力を活かせます。

### 3) **消費者心理の理解**

文系の学問では、人間の行動や心理に関する知識を深めることができます。消費者行動を理解し、どのようなメッセージが響くかを考える力は、マーケティングにおいて非常に重要です。特に心理学や社会学などの知識は、ターゲット層に合わせた戦略を立てる際に大いに役立ちます。

## 3. 理系が有利な場合

一方、理系のバックグラウンドを持つ人がWebマーケティングで有利な点もあります。特に、データ分析やSEO、SEM（検索エンジンマーケティング）に関わる部分では、理系の人々が強みを発揮することが多いです。理系出身者は、数値的な分析やプログラミング、システムの理解に長けており、Webマーケティングのデータドリブンな施策において活躍しやすいです。

例えば、SEO対策では検索アルゴリズムの理解が不可欠であり、データ解析を通じて施策の効果を測定する必要があります。このような場面では、理系出身者の論理的思考力や問題解決能力が役立ちます。

## 4. 結論：文系も理系も活躍できるフィールド

結局のところ、Webマーケティングにおいて文系が有利か理系が有利かを一概に決めることはできません。両方のバックグラウンドが、それぞれの強みを活かせるフィールドです。文系の強みであるコミュニケーション能力やクリエイティブ思考は、コンテンツ制作や戦略立案で活かされ、理系の強みであるデータ分析やロジカルな思考は、データ駆動型のマーケティング施策で活きてきます。

Webマーケティングは、多様なスキルセットが求められる分野であり、文系と理系の両者が協力し合うことで、より強力なチームを作ることができます。自分の強みを理解し、適切な領域で活躍できることが大切です。
Proxmox 上の FreeBSD の zfs ディスクを拡張する

Proxmox 上の仮想マシン (FreeBSD) のディスクを拡張する

# FreeBSD を shutdown してディスク割り当てを拡張する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/cbfcedff-a626-46eb-b9e9-eb1050edcb5d.png)
Hardware > Hard Disk を選択
  Disk Action のプルダウン → Resize をクリック

# 拡張する容量を指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/8be93d60-cc62-4d88-a140-06eedef2ab53.png)

# FreeBSD 上の zfs を確認する
FreeBSD を起動し、念のためシングルユーザモードで起動しておく
```
root@:/ # gpart show vtbd0
=>       34  209715126  vtbd0  GPT  (300G) [CORRUPT]
         34        345      1  freebsd-boot   (173K)
        379      66584      2  efi  (33M)
      66963    2097152      3  freebsd-swap   (1.0G)
    2164115  207551045      4  freebsd-zfs   (99G)
```

# ディスクの情報がおかしいらしいので修正する
```
root@:/ # gpart recover vtbd0
vtbd0 recovered
root@:/ # gpart show vtbd0
=>       34  629145526  vtbd0  GPT  (300G)
         34        345      1  freebsd-boot   (173K)
        379      66584      2  efi  (33M)
      66963    2097152      3  freebsd-swap   (1.0G)
    2164115  207551045      4  freebsd-zfs   (99G)
  209715160  419430400         - free -  (200G)
```
[CORRUPT] が消えて後ろに空き領域 (- free -  (200G)) ができた

# zfs のパーティションを拡張する
```
root@:/ # gpart resize -i 4 vtbd0
vtbd0p4 resized
root@:/ # gpart recover vtbd0
=>       34  629145526  vtbd0  GPT  (300G)
         34        345      1  freebsd-boot   (173K)
        379      66584      2  efi  (33M)
      66963    2097152      3  freebsd-swap   (1.0G)
    2164115  626981445      4  freebsd-zfs   (299G)
```

# df で見ると、ファイルシステムはまだ拡張していない
```
root@:/ # df -h .
Filesystem            Size    Used    Avail Capacity  Mounted on
zroot/ROOT/default     32G     21G      11G    66%    /
```

# zpool を再読み込みさせる
```
root@:/ # zpool online -e zroot /dev/vtbd0p4
root@:/ # zpool status zroot
  pool: zroot
 state: ONLINE
config:

        NAME        STATE     READ WRITE CHSUM
        zroot       ONLINE       0     0     0
          vtbd0p4   ONLINE       0     0     0

errors: No known data errors
```
多分、再起動でもいける気がする

# df を確認する
```
root@:/ # df -h .
Filesystem            Size    Used    Avail Capacity  Mounted on
zroot/ROOT/default    226G     21G     205G     9%    /
```
拡張された

完了！
NetworkImageViewについて


# はじめに
今回はAndroid Volleyを使用して画像を表示するNetworkImageViewについて、メモになるようなものを記事に残しておこうと思います。

# 実践
build.gradleに以下を追加
```build.gradle
dependencies {
    implementation("com.android.volley:volley:1.2.1")
}
```

NetworkImageViewはネット上の画像リソースを取得・表示できる機能のついたImageViewという理解でいいと思います。
なので残りはImageViewと使い方は同じになります。



# 参考

https://symfoware.blog.fc2.com/blog-entry-2025.html

https://edywrite.blogspot.com/2015/08/android-volleyurl.html
DS検定前に基礎的なSQLを確認しておこう

# 基礎から学ぶSQL

## はじめに
今週末にDS検定を受けるので、最近使ってないSQLの復習でもしようと思い、本記事の作成に至りました。
データベースを扱う際に必須となるのがSQL（Structured Query Language）です。SQLの基礎を学び、データの取得、挿入、更新、削除といった基本的な操作を習得することを目的とします。

## 1. SQLとは？

SQL（Structured Query Language）は、リレーショナルデータベース（RDB）を操作するための言語です。以下のような用途で使用されます。

- データの取得（SELECT）
- データの追加（INSERT）
- データの更新（UPDATE）
- データの削除（DELETE）

## 2. SQLの基本構文

### 2.1 データの取得（SELECT）

データベースからデータを取得するには`SELECT`文を使用します。

```sql
SELECT カラム名 FROM テーブル名;
```

**例：** `users`テーブルから全てのデータを取得

```sql
SELECT * FROM users;
```

条件を指定してデータを取得するには`WHERE`句を使用します。

```sql
SELECT * FROM users WHERE age > 20;
```

### 2.2 データの挿入（INSERT）

データをテーブルに追加するには`INSERT INTO`文を使用します。

```sql
INSERT INTO テーブル名 (カラム1, カラム2, ...) VALUES (値1, 値2, ...);
```

**例：** `users`テーブルに新しいユーザーを追加

```sql
INSERT INTO users (name, age, email) VALUES ('Taro', 25, 'taro@example.com');
```

### 2.3 データの更新（UPDATE）

既存のデータを更新するには`UPDATE`文を使用します。

```sql
UPDATE テーブル名 SET カラム名 = 値 WHERE 条件;
```

**例：** ユーザーの年齢を変更

```sql
UPDATE users SET age = 26 WHERE name = 'Taro';
```

### 2.4 データの削除（DELETE）

データを削除するには`DELETE FROM`文を使用します。

```sql
DELETE FROM テーブル名 WHERE 条件;
```

**例：** `users`テーブルから特定のユーザーを削除

```sql
DELETE FROM users WHERE name = 'Taro';
```

## 3. SQLの応用

### 3.1 ソート（ORDER BY）

結果をソートするには`ORDER BY`句を使用します。

```sql
SELECT * FROM users ORDER BY age DESC;
```

### 3.2 グループ化（GROUP BY）

データをグループ化するには`GROUP BY`句を使用します。

```sql
SELECT age, COUNT(*) FROM users GROUP BY age;
```

### 3.3 テーブル結合（JOIN）

複数のテーブルを結合するには`JOIN`を使用します。

```sql
SELECT users.name, orders.product_name FROM users
JOIN orders ON users.id = orders.user_id;
```

## まとめ

本記事では、SQLの基本的な操作について説明しました。SQLを学ぶことで、データを効率的に扱えるようになります。実際にデータベースを操作しながら学習を進めてみてください！
Javascript入門（簡易版）


var/let/const解説付
https://qiita.com/rukukun/items/39bd94377b4b2021e684

必要に応じて逆引きで使う場合
https://www.tohoho-web.com/js/index.htm

chatjs入門
https://www.tohoho-web.com/ex/chartjs.html

#### 本記事の背景
Javascript入門は多くの情報と解説があるが、Jinja2と組合わせで使う場合やグラフ描画用ライブライであるchatjs+Jinja2で使う場合の紹介記事は少ない。筆者は、ある程度Javascriptの基礎文法を習得している人向けにJinja2との組み合わせで注意すべき点や引数の渡し方について焦点を合わせている。
※Jinja2については、別記事にて紹介する。

#### 本記事の対象者

- JavaScriptの基礎文法を理解している
- chatjsとはなにかを理解している
- Flaskの基礎を取得している
- HTML/CSSのタグを理解している
- Python基礎文法を理解している
- Webの基本的な仕組みを理解している（localhost,portとはなにかが分かる程度）
※上記で未収得の場合は下記の関連情報を先に参照し、習得、理解してください。

#### 関連情報
- [JavaScript超入門](https://qiita.com/rukukun/items/39bd94377b4b2021e684)（var/let/const解説付)
- [とほほJavascript入門](https://www.tohoho-web.com/js/index.htm)（必要に応じて逆引き）
- [とほほchatjs入門](https://www.tohoho-web.com/ex/chartjs.html)
- [chatjs公式](https://www.chartjs.org/docs/latest/)(chatjsはバージョンによって若干変更されているので、必要に応じて公式ページ参照）
- [chatjs日本語](https://misc.0o0o.org/chartjs-doc-ja/)
- [Flask構築手順](https://qiita.com/akeyi2018/items/0005cebf81c7909db84d)
OSS-DB Silverを受けてみて


## はじめに
2025年の2月にOSS-DB Silverを受験しました。
ぎりぎりの点数で何とか合格することが出来ました。

## OSS-DB Silverとは？
- PostgreSQLに関する技術力と知識を問う試験
- 問題数：50問
- 試験時間：90分(そのうちの5分はアンケート記入)
- 受験料：16500円（税込）
- 試験方式：CBT方式

## 著者のスペック
- 情報系の修士卒
- 社会人一年目(機械学習系の案件を担当)
- SQLの学習経験はあるがデータベースの運用経験は無し

備忘録として合格するためにどのような勉強を行ったか紹介していきます

## 受験理由
本資格を受験しようとした理由は以下の通りです。
- 会社の資格手当対象資格だったため
- 機械学習の案件のみならず様々な案件に対応できるようにするため多様な知識を身に着ける必要があると感じたから

## 使用したテキストやサイト
①[OSS教科書 OSS-DB Silver Ver.3.0対応](https://www.shoeisha.co.jp/book/detail/9784798180311)
②[https://mondai.ping-t.com/g](https://www.sg-siken.com/sgkakomon.php)

主にPing-tをメインに使用しました。公式の緑本は辞書代わりに使用しました。

## 勉強時間
35~40時間くらいだと思います

## 勉強法
### 1. 緑本を1周する
深くやりこむ必要はありません。ここでは流し見程度でいいのでどんなことが問題として出題されるのか把握する程度でいいです

### 2. Ping-tですべての問題をHit状態にする
緑本を一周したらPing-tの問題を全て正解するまで解きましょう。初見だと半分以上の問題を間違えると思います。ですが気にする必要はありません。問題の解説を読みながら知識を身に着けていきましょう。

### 3. Ping-tですべての問題をコンボ状態にする
全ての問題をコンボ状態にするまで解きましょう。ここで間違えてしまった問題はPing-tのブックマーク機能を用いて復習問題として記録しましょう。また緑本を使用して基本的概念を再度インプットすべきです。

### 4. Ping-tの模試を解きまくる！
500問の問題から50問題が出題されます。8割以上を5回くらい取れるようになったら知識は十分に身についていると思います。

ちなみに著者のPing-tのスタンプラリーは以下の通りです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4019599/ac25b450-dd70-404a-9c9a-c40db516377e.png)


## 試験結果
- スコア：66点（合格ライン：64点）
- 結果：合格
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4019599/0d1a439c-de87-4fb5-99f1-323702558ef6.png)

かなりぎりぎりでした...

## 受験の感想
開発/SQLの正答率は高かったですがその他の分野の正答率が低かったです。
これはPing-tで問われなかった内容の理解が曖昧だったのが原因だと思います。一般知識、運用管理は曖昧な理解だと正答率が一気に低くなるのでこれらの暗記はきっちり行うべきだと思いました。
逆にSQLは学習経験があったのである程度スムーズに理解できたのが正答率に現れたのかなと思いました。

## おわりに
ぎりぎりの点数でしたが何とか合格できました。今後は様々な教材で実際にデータベースを構築してみて、この分野に関する理解を深めていくべきだと感じました。
ALFA AWUS036NHAをVMware環境のKali Linuxにセットアップする方法

Aircrack-ng suiteを利用して、学習するために準備をします。

:::note  alert
この記事で記載する内容は全て学習のために自分自身のネットワークを使うことを徹底してください。
他人のネットワークに対して無断で行うことは法的に禁止されています。
:::

Aircrack-ng suiteはKali Linuxにデフォルトで入っている、Wi-Fiネットワークのセキュリティをテストするためのツールセットです。

今回は、仮想環境上のKali LinuxでALFA AWUS036NHAを使えるようにするまでの流れを説明します。

## 使用環境
・PC: Mac Book Air M2
・OS: macOS 15.3.2
・仮想化ソフト: VMware Fusion
・仮想OS: Kali Linux 2024.4
・Wi-Fiアダプタ: ALFA AWUS036NHA
・Wi-Fiチップ: Atheros AR9271

## Wi-Fiアダプタ選定基準
目的はKali LinuxでWi-Fiネットワークの監視や解析をすることです。（※自宅環境でのみ）
1. モニターモード
周囲のネットワークのパケットをキャプチャする機能があること
2. パケットインジェクション
意図的にデータパケットを送信する機能があること
3. チップセット
Kali Linuxに最適化されていること
4. USB接続の安定性と速度
USB3.0が理想的だが、USB2.0でも十分
5. ドライバインストールの有無
手動でインストールする必要がないこと
6. 外部アンテナの有無
信号強度の向上と受信範囲の拡大のため、アンテナがあること

以上の条件を全て満たしたのが、
Atheros AR9271チップ搭載のALFA AWUS036NHAです。

2.4GHzのみ対応しており、5GHzには対応していないのでWi-Fi5はキャッチ出来ません。
それでも学習のためなので2.4GHzで十分だと思います。

## 接続前の状態
仮想環境でOSを起動しているときは、ホストが利用している無線を使わせてもらっています。
VMware FusionデフォルトのNATモードでは、仮想マシンはホストのネットワークを経由してインターネットに接続します。
ホストがルーターの役割を果たし、仮想マシンの通信を外部ネットワークへ転送する仕組みになっています。

## 接続
はじめに、端末をPCに繋いだときは黄緑色のランプが点灯していました。

VMwareのUSB設定でKali Linuxへの接続を許可します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964004/efd368be-afd3-44ea-b819-595daa7abe9e.png)

端末のランプが青色に変わりました。

Kali Linuxのターミナルで接続できたか確認します。
以下のコマンドでデバイスが認識されているかを確認します。
```
lsusb
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964004/4918cfdb-2ac1-4043-88cb-be76c08a7c3e.png)

接続されているデバイスが認識されていることを確認できれば、以下コマンドでWi-Fiデバイスとして認識されているかを確認します。
```
iwconfig
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964004/28ebc76b-3ad8-4619-aa48-55ce752b36fd.png)
wlan0が表示されていれば、正しく認識されています。
Mode: Managedは通常のクライアントモード
Access Point: Not-AssociatedはまだWi-Fiに接続していないことを表します。

wlan0(AR9271)を使って、周囲のWi-Fiスポットをスキャンできれば正しく稼働しているかを以下コマンドで確認します。
```
sudo iwlist wlan0 scan
```

大量のWi-Fiが出力されれば、正常に動作しています。

## Wi-Fiクライアント設定
VMwareで動くOSはホストのネットワークをNATで使っています。
ここでは、仮想マシンを直接Wi-Fi接続します。

接続するWi-Fiを選択し、下記でファイルを編集します。
```
sudo vim /etc/wpa_supplicant/wpa_supplicant.conf  
```
ファイルは以下のように編集します。
```
country=JP

network={
    ssid="SSID-******" #接続するWi-FiのSSID
    psk="********"     #接続するWi-FiのPSK
    key_mgmt=WPA-PSK   #WPA2-Personalを使用
}
```
ファイルを保存し、以下コマンドを実行します。
```
sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
```
`wpa_supplicant`：WPAで暗号化されているネットワークの接続コマンドです。
`-B`：バックグラウンドで実行します。
`-i`：使用するインターフェースを指定します。
`-c`：設定ファイルを指定します。

実行後、`iwconfig`コマンドでwlan0に指定したESSIDが出力されれば、完了です。

端末は青色で点滅します。

IPアドレスを割り当てることもできます。
```
sudo dhclient wlan0
```

接続を終了するときは以下コマンドを実行します。
```
sudo ip link set wlan0 down
```

今日のところは以上です。
【.NET】配列をランダムに並び替えるメソッドは標準である【Shuffle】


.NET 8から追加された、RandomのShuffleメソッドを使うことで、配列をランダムに並び替えることができます。

公式リファレンスは次のページです。

https://learn.microsoft.com/ja-jp/dotnet/api/system.random.shuffle?view=net-9.0

使い方はこんな感じです。

```csharp
var array = Enumerable.Range(1, 10).ToArray();
Random.Shared.Shuffle(array);
Console.WriteLine(string.Join(",", array));
```

新たに並び替えた配列を作るのでなく、Shuffleメソッドの引数に渡した配列を並び替えることに注意してください。

* このメソッドのオーダーはO(n)です
* 内部で、Randomの Next(Int32, Int32)を使っています
* 配列だけでなく、`Span<T>`を並び替えるオーバーロードもRandomに用意されています

---

また、.NET 10（本投稿執筆時点ではPreview 1）で、LINQにもShuffleメソッドが追加されそうです。（注：Shuffleメソッドは、Preview 1には入っていません。）

こちらのLINQ版のShuffleメソッドは、`List<T>`など`IEnumerable<T>`を実装するオブジェクトで利用可能です。また、呼び出し元の`IEnumerable<T>`はそのままで、新たに並び替えた`IEnumerable<T>`を返します。



https://github.com/dotnet/runtime/issues/111221

https://github.com/dotnet/runtime/pull/112173
[Git] push 時に出力される数字列について


Git で push した際に，123/456/789 のような / と数値で構成された文字列が出力されることがある．


## 数字列の正体

この数字列は，UTF-8 のバイト列であり，日本語のディレクトリ名がエンコードされたものに相当する．つまり，日本語を含むディレクトリ名を扱う際に Git が内部的に変換して処理している．


## 数字列の確認方法


以下のコマンドで，バイト列の確認ができる．
```bash
echo -n "任意の文字列" | xxd -p
```

例：**日本語**という文字列はどのように変換されるのか？
```bash
echo -n "日本語" | xxd -p
e697a5e69cace8aa9e
```

上記の数値は16進数の為，10進数に変換する．
```bash
e6  -> 230
97  -> 151
a5  -> 165
e6  -> 230
9c  -> 156
ac  -> 172
e8  -> 232
aa  -> 170
9e  -> 158
```

これらが`/`で区切られている


## なぜ10進数に変換をしているのか
Gitのpush時，日本語のディレクトリ名は数値列（例：123/456/789）として表示される．
これはGitがUTF-8エンコーディングを使用し，日本語をバイト列として処理するためである．
Gitはデータ転送を効率化するため，オブジェクトや参照情報をバイト列（主に16進数）で管理している．
ただし，ユーザー向けには10進数に変換して表示する仕様となっている．
例えば，Gitの転送プロトコルでは，行の長さを示す16進数が用いられるが，可読性のため10進数に変換されることがある．
その結果，日本語ディレクトリ名が10進数のスラッシュ区切りで表示される仕様となっている．


## 数字列の表示を回避する方法

Git の `core.quotepath` 設定を変更することで，日本語ディレクトリ名をそのまま表示することができる．

```bash
git config --global core.quotepath false
```
この設定を適用すると，Gitの出力で日本語ディレクトリ名が直接表示され，数値列（123/456/789 形式）に変換されることがなくなる．


## Summary

Git における push 時の数字列は，日本語ディレクトリ名をエンコードした結果であり，特殊なエラーや異常ではなく，UTF-8 のバイト列として表示される仕様である．


## 参考文献
Git Community  Chapters > 2nd Edition 10.6 Gitの内側 - 転送プロトコル
[10.6 Gitの内側 - 転送プロトコル](https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-%E8%BB%A2%E9%80%81%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB)
【Python】Fraction型（分数）で値の比較はできるのか

## 概要
Pythonで分数を扱う場合[Pythonビルトインの分数を扱うfractionsパッケージについて軽く調べてみた。](https://qiita.com/simonritchie/items/2931963a6f102b8c7853)の記事で紹介されている、Fractionの機能が利用できます。これは四則演算やfloatへの変換もできる優れものなのですが、Fractionってできるのかなと少し調べてみたのでメモ書きします。

## 前提
* 使用したPythonのバージョンは`3.13.0`です。

## 結論
Fractionでの比較は可能です。stackoverflowの[How to compare Fraction objects in Python?](https://stackoverflow.com/a/62955766)の回答を見ると、`__eq__`や` __lt__`、`__gt__`が実装されてるそう。

## 実装サンプル
いくつかケースを挙げて比較してみた実装サンプルを以下に記載します。

```python
from fractions import Fraction

## 2/3の方が大きいのでTrueになる
print(Fraction(2, 3) > Fraction(1, 2))

## 1/3の方が大きいのでFalseになる
print(Fraction(1, 3) < Fraction(1, 5))

## 約分した結果で比較するのでTrueになる
print(Fraction(2, 4) == Fraction(1, 2))
```
自己紹介

どうも初めまして。
GitHubで"sakana-max"という名前で活動している中学生（魚）です
GitHun　https://github.com/sakana-max
Githubでは機械翻訳で話してますが、こっちでは日本語で話そうと思います。

得意言語は"C#(unity)","Python"です。

わからないことがあれば、よく聞くと思うので、アドバイスしてくださるとありがたいです。

よろしくお願いします。
困ったWAの解決方法

# 序文
あまり技術的な話ではないのですが、AtCoderで困ったWAの出方することありませんか？

自分は[ABC095 - Half and Half](https://atcoder.jp/contests/abc095/tasks/arc096_a)を解いた際に出てきたのですが、
![スクリーンショット 2025-03-16 21.02.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607144/68c5474b-0493-466a-bf20-0095cc212eab.png)
↑この一個だけ間違っているケースめちゃくちゃ困りません？？
自分は初めて出会したので対処が分からず、コードを書き直して、素直に全探索しました。

## 助けてくだs……
このような時どのような方法でロジックエラーを解決すればいいか、ご存知の方いらっしゃればコメントしてくださると幸いですm(_ _)m


↓以下、自分が提出した回答です。
~~~python
a, b, c, x, y= map(int, input().split())
C= c*2
pay_for= 0
if a+b<= C:
    pay_for= a*x+ b*y
else:
    if x> y:
        pay_for= y*C+ (x-y)*a
        for i in range(x-y):
           estimate= C*(x-i)+ a*i
           if estimate< pay_for:
               pay_for= estimate     
        
    else:
        pay_for= x*C+ (y-x)*b
        for i in range(y-x):
           estimate= C*(y-i)+ a*i
           if estimate< pay_for:
               pay_for= estimate     
        
print(pay_for)
~~~
自分は、最初` a+b `と`c*2`の大小関係に着目することで計算量を減らせると考えました。
その後の場合分けで、`a+b< C`の時に、ピッタリ a：X枚、b：Y枚になるように買うパターンと、
ABピザを多めに買って、各々`max(X, Y)`枚のピザを買うパターンに気付き、
一応多めに買う方を全探索で出費を最小化するプログラムを書きました。

結果的に、何か探索漏れがあったのか一個だけWAを出してしまいました。


## 参考までに
その後コードを書き直して提出したら、難なくACをもらいました。
正直、上記のコードの何が悪かったのかがあまり分からないです……
~~~python
a, b, c, x, y= map(int, input().split())
C= c*2
pay_for= 10**10
if x> y:
    for i in range(x+1):
        z=i
        if i< y:
            estimate= C*z+ a*(x-z)+ b*(y-z)
        else:
            estimate= C*z+ a*(x-z)
            
        if estimate< pay_for:
            pay_for= estimate

else :
    for i in range(y+1):
        z=i
        if i< x:
            estimate= C*z+ a*(x-z)+ b*(y-z)
            
        else:
            estimate= C*z+ b*(y-z)     
        if estimate< pay_for:
            pay_for= estimate
            
print(pay_for)
~~~
①：`a+b`と`c*2`の大小関係の場合分けで、場合分けに漏れがある。
②探索回数が`x-y`と`y-x`だったので、探索漏れがある。
のどちらかなんですけど、分からねえ……

# 結論
男は黙って全探索‼️👊

ご高覧ありがとうございましたm(_ _)m
情報セキュリティマネジメント試験を受けてみて


## はじめに
2025年の1月に情報セキュリティマネジメント試験を受験しました。
今月に合格発表がされ無事合格することが出来ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4019599/e27a51f3-1d73-43dd-ac20-b10016c54596.png)

著者のスペック
- 情報系の修士卒
- 社会人一年目(機械学習系の案件を担当)
- ITパスポート、基本情報技術者に合格

備忘録として合格するためにどのような勉強を行ったか紹介していきます

## 受験理由
本資格を受験しようとした理由は以下の通りです。
- 会社の資格手当対象資格だったため
- 社内で情報セキュリティを強化する方針を示したため、情報セキュリティに関する体系的な知識を身に着ける必要があると感じたから

## 使用したテキストやサイト
①[情報処理教科書 出るとこだけ！情報セキュリティマネジメント［科目A］［科目B］2025年版](https://www.seshop.com/product/detail/26561?gad_source=1&gclid=Cj0KCQiAq-u9BhCjARIsANLj-s3K2YkeUd5b8KkizesSN4RLbvRak9EdweEgOuvS99MyqVoHkD9SRdMaApMREALw_wcB)
②[情報セキュリティマネジメント過去問道場](https://www.sg-siken.com/sgkakomon.php)

インプットの教材として①はかなり最適でした。また科目B試験の虎の巻は科目Bの読解方法について明確なアドバイスを示していました。

## 勉強時間
15~20時間くらいだったと思います

## 勉強法
### 1. インプット用の教材を1周進める
出るとこだけ！の参考書は数十ページごとに問題があるので理解できているか確認することが出来ます。個人的にはインプットを出来るだけ早めに終わらせてアウトプットを実施すべきだと思います。

### 2. 過去問道場でアウトプットを実施する
今思うと過去問題よりも予想問題を重点的にやればよかったかなぁと思いました。というのも予想問題のLv3以上の問題を行えなかったので、ここらへんをきちんとやっていれば科目Aの正答率が上がると思います。

### 3. 間違えた部分を中心に弱点のインプットを実施
2で間違えた分野を中心に1の教材を読み込みましょう。インプット、アウトプットを繰り返せば過去問道場の正答率が上がっていくと思います。


## 受験の感想
予想問題のLv3以上の問題をあまり行えなかったので科目Aでいくつか曖昧な問題がありました。またセキュリティに関係ない問題もいくつかありました。ただ問題文の指示に従えば解ける問題だと思います。自分は十分な見直しを行い10分くらい余ったので、時間が足りなくなるということはないと思います。合格率が高い試験ですがきちんとした対策は必須だと思います。

## おわりに
これでIPAのレベル2までの試験を全て合格しました。秋の応用情報技術者試験まで時間があるため、6月くらいまではIPA以外の試験を受けて様々な知識を身に着けようと考えています。
ルール表を用いたExcelVBAのチェック処理（chatgpt産）

Sub チェック処理()

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("データ") ' シート名を変更してください
    
    Dim lastRow As Long, lastCol As Long
    lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
    lastCol = ws.Cells(1, Columns.Count).End(xlToLeft).Column

    ' ヘッダを取得（列名 → 列番号のマッピング）
    Dim colMap As Object
    Set colMap = CreateObject("Scripting.Dictionary")

    Dim j As Long
    For j = 1 To lastCol
        colMap(ws.Cells(1, j).Value) = j
    Next j

    ' ルール表のDictionary作成
    Dim dictRules As Object
    Set dictRules = CreateObject("Scripting.Dictionary")
    
    ' ルール表のデータ取得（ルールは "ルール" シートにあると仮定）
    Dim wsRule As Worksheet
    Set wsRule = ThisWorkbook.Sheets("ルール")

    Dim ruleLastRow As Long
    ruleLastRow = wsRule.Cells(Rows.Count, 1).End(xlUp).Row

    Dim ruleNo As String, ruleCondition As String, ruleItem As String, ruleControl As String
    For i = 2 To ruleLastRow
        ruleNo = wsRule.Cells(i, 1).Value
        ruleCondition = wsRule.Cells(i, 2).Value
        ruleItem = wsRule.Cells(i, 3).Value
        ruleControl = wsRule.Cells(i, 4).Value

        If Not dictRules.Exists(ruleNo) Then
            dictRules.Add ruleNo, CreateObject("Scripting.Dictionary")
        End If

        dictRules(ruleNo)(ruleItem) = Array(ruleCondition, ruleControl)
    Next i

    ' チェック処理
    Dim i As Long, key As String, targetColumn As Long
    Dim errMsg As String
    errMsg = ""

    For i = 2 To lastRow
        Dim dataNo As String
        dataNo = ws.Cells(i, 1).Value

        ' ルールの適用チェック
        For Each key In dictRules.Keys
            If dataNo = key Or Left(dataNo, Len(key)) = key Then
                Dim ruleDict As Object
                Set ruleDict = dictRules(key)

                Dim targetItem As Variant
                For Each targetItem In ruleDict.Keys
                    targetColumn = colMap(targetItem)
                    Dim cellValue As Variant
                    cellValue = ws.Cells(i, targetColumn).Value

                    Dim ruleArr As Variant
                    ruleArr = ruleDict(targetItem)

                    Dim condition As String
                    condition = ruleArr(0)
                    Dim control As String
                    control = ruleArr(1)

                    ' 一致ルール
                    If condition = "一致" And cellValue <> "" Then
                        If control = "入力不可" Then
                            errMsg = errMsg & "エラー: " & dataNo & " の " & targetItem & " は入力不可なのに値が入っています。" & vbCrLf
                        End If
                    End If

                    ' 不一致ルール
                    If condition = "不一致" And cellValue = "" Then
                        If control = "入力必須" Then
                            errMsg = errMsg & "エラー: " & dataNo & " の " & targetItem & " は入力必須なのに空欄です。" & vbCrLf
                        End If
                    End If
                Next targetItem
            End If
        Next key
    Next i

    ' 結果出力
    If errMsg <> "" Then
        MsgBox errMsg, vbExclamation, "チェックエラー"
    Else
        MsgBox "全件チェック完了。エラーなし。", vbInformation, "チェック結果"
    End If

End Sub
ActiveRecord-Import を使うとバリデーションがかかる理由

## はじめに
Railsにおいて、データの一括登録、更新処理として`insert_all`や`upsert_all`などの便利なメソッドがあるが、ぼーっと実装しているとバリデーションが適用されないことがあるため、記事としてとりまとめた。

## 結論
`activerecord-import`の`import`メソッドを使って、`ActiveRecord`インスタンスを渡す。

##  `upsert_all` の問題点

Rails には `upsert_all` という便利なメソッドがありますが、これを使うと **バリデーションが適用されない** という問題があります。

例えば、`StockPrice` モデルに以下のバリデーションがあるとします。

```ruby
class StockPrice < ApplicationRecord
  validates :company_code, presence: true
  validates :date, presence: true
  validates :close_price, numericality: { greater_than_or_equal_to: 0 }
end
```

しかし、`upsert_all` を使うと、このバリデーションが無視されてしまいます。

```ruby
StockPrice.upsert_all([{ company_code: 1234, date: "2025-03-16", close_price: -100 }])
```

**→ `close_price` に `-100` を入れてもエラーにならず、そのまま保存される**

なぜなら、`upsert_all` は **SQL を直接実行** するため、ActiveRecord の機能（バリデーションやコールバック）がすべてスキップされるため。

## `import` を使うとバリデーションがかかる理由

`activerecord-import` の `import` メソッドを使うと、**渡すデータの形式によってバリデーションが適用されるかどうかが決まる** というのがポイント。

### (1) ActiveRecord インスタンスを渡す場合（バリデーション適用される）

```ruby
stock_prices = quotes.map do |quote|
  StockPrice.new(
    company_code: quote["Code"].to_i,
    date: quote["Date"],
    close_price: quote["Close"]
  )
end

StockPrice.import(stock_prices, on_duplicate_key_update: { conflict_target: [:company_code, :date], columns: [:close_price] })
```

**→ `new` を使うことで ActiveRecord の通常の処理が適用され、バリデーションも実行される**

### (2) ハッシュを渡す場合（バリデーション適用されない）

```ruby
stock_prices = quotes.map do |quote|
  {
    company_code: quote["Code"].to_i,
    date: quote["Date"],
    close_price: quote["Close"]
  }
end

StockPrice.import(stock_prices, on_duplicate_key_update: { conflict_target: [:company_code, :date], columns: [:close_price] })
```

**→ この方法だと `validates` が効かない**


## `activerecord-import` の仕組み

### ActiveRecord のオブジェクト (`StockPrice.new`) を渡すと
- `import` は通常の `save` のように ActiveRecord の機能を通してデータを処理する。
- **バリデーション (`validates`) が実行される。**
- **コールバック (`before_save`, `after_save`) も実行される。**

### ハッシュを渡すと
- `import` は SQL を直接実行する形になる。
- **バリデーションがスキップされる。**
- **コールバック (`before_save`, `after_save`) も実行されない。**
- `upsert_all` に近い動作になり、DB には高速にデータが入るが、安全性が下がる。

---

##  `activerecord-import` の公式ドキュメントより

`activerecord-import` の公式ドキュメントには、以下のように記述されています。

> **If you pass in model instances, ActiveRecord validations and callbacks will be executed.**  
> **If you pass in an array of hashes, validations and callbacks will be skipped.**  
> （モデルのインスタンスを渡すと、ActiveRecord のバリデーションとコールバックが実行される。ハッシュの配列を渡すと、バリデーションとコールバックはスキップされる。）

**→ インスタンス (`new` で作成) を渡せばバリデーションが適用される**

---

## さいごに
使うメソッドによって下記の通り挙動が異なるため、アプリ仕様にならいメソッドの使い分けが重要。

| メソッド | バリデーション | コールバック | パフォーマンス |
|----------|--------------|-------------|--------------|
| `upsert_all` | ❌ なし | ❌ なし | ⭕ 超高速 |
| `import (ハッシュ)` | ❌ なし | ❌ なし | ⭕ 高速 |
| `import (インスタンス)` | ⭕ あり | ⭕ あり | ⭕ 高速 |
【舘岡優記】コードはオープンすべき

舘岡優記です。

現代のソフトウェア開発において、「オープンソース」という考え方がますます重要になっています。多くの企業や個人開発者が、自分のコードを公開し、コミュニティと共有することで、技術の進化が加速しています。では、なぜコードをオープンにすべきなのでしょうか？ 本記事では、オープンにすることのメリットや、実際にどう活用できるのかを解説します。  

## **1. 知識の共有が技術を発展させる**  

コードをオープンにする最大のメリットは、**技術の共有と発展**です。GitHubやGitLabなどのプラットフォームでは、世界中の開発者がコードを公開し、お互いに学び合っています。  

例えば、以下のような有名なオープンソースプロジェクトが多くの人に利用されています。  

- **Linux** - 世界中のサーバーやスマホ（Android）の基盤  
- **React** - Facebookが開発したJavaScriptライブラリ  
- **TensorFlow** - Googleが開発した機械学習フレームワーク  

これらの技術がオープンであるからこそ、誰でも利用し、改良し、新しいものを生み出すことができています。  

## **2. コードの品質が向上する**  

オープンソースにすると、多くの開発者がコードをチェックするため、**バグやセキュリティの問題が見つかりやすくなります**。企業が内部で管理するコードとは違い、世界中のエンジニアがレビューすることで、より安全で信頼性の高いソフトウェアが生まれます。  

特に以下のような点で品質向上が期待できます。  

- **コードレビューの機会が増える** → 他人の目でチェックされるため、より最適なコードが生まれる  
- **バグ修正が早くなる** → 多くの人が関わることで、問題解決のスピードが向上  
- **ドキュメントが充実する** → 他人が利用する前提のため、詳細な説明が求められる  

## **3. 信頼と実績が生まれる**  

個人開発者がコードをオープンにすることには、**キャリアの強化**というメリットもあります。GitHubに自分のコードを公開し、コミュニティで貢献することで、スキルを証明できます。  

- フリーランスエンジニアが仕事を獲得しやすくなる  
- 企業が採用時に「実際に書いたコード」を確認できる  
- 他の開発者と協力し、ネットワークを広げられる  

企業のエンジニアも、自分の仕事の一部をオープンソースにすることで、**技術力の高さをアピールできる**ため、優秀な人材の確保にもつながります。  

## **4. みんなが便利になる**  

オープンソースのソフトウェアは、個人や企業の垣根を超えて利用され、**社会全体の効率を向上させる**効果があります。  

例えば、もしあなたが社内向けの便利なツールを開発したとします。それをオープンにすれば、他の会社のエンジニアも活用でき、業界全体の生産性が向上するかもしれません。  

また、オープンソースは企業にとってもコスト削減につながります。例えば、WordPress（オープンソースのCMS）が普及したことで、多くの企業が高額なWebサイト開発費を削減できるようになりました。  

## **コードをオープンにする際の注意点**  

もちろん、すべてのコードを無条件に公開すべきというわけではありません。以下の点に注意しましょう。  

- **機密情報が含まれていないか確認する**（APIキー、パスワードなど）  
- **適切なライセンスを設定する**（MIT, GPL, Apache 2.0 など）  
- **ドキュメントをしっかり書く**（READMEを充実させる）  

これらを守ることで、安心してコードを公開し、多くの人に役立ててもらうことができます。  

## **まとめ**  

現代のソフトウェア開発では、「**コードはオープンにするべき**」という考え方が主流になっています。オープンソースにすることで、**技術の共有・品質向上・信頼獲得・社会貢献**といった多くのメリットがあります。  

個人開発者でも、企業エンジニアでも、「コードをオープンにすること」は大きな価値を持ちます。自分のプロジェクトを一つでも公開し、世界中のエンジニアとつながる第一歩を踏み出してみてはいかがでしょうか？
【初心者向け】IT業務で地味に役立つショートカットキー等①（Windows）

## :hatching_chick: はじめに 
※この記事は[KANGEN](https://kangen-holdings.co.jp/)の梅干しとにらめっこがお送りします。
※この記事は頑張れば1分で読めます。
　（タイムアタックをコメントで投稿して頂くと筆者は喜びます）

今回は1年前に下書きのまま放置していた記事に加筆を加えてお届けします。

**なんでこの記事を作ったの？**
➡IT業界で働いていると忘れがちですが、最初はこんなこと知らなかったなと思うことがあり、まとめてみました。


::: note info
この記事の対象者
・日々使用されているPCがWindowsの方
・ちょいちょい「半角」と「全角」を変更し忘れがちな方
:::


🐣入力した全角文字を半角文字へ変更
-
**入力確定前に【F10】ボタン押下**
例：ｐりんｔ＿ｒ　➡　print_r

:::note info
補足
・キーボード上部[F1]~[F12]のボタンをファンクションキーといいます。
・PCによっては[fn]ボタンと[F10]を一緒に押す必要があります。
:::

🐣入力した全角文字を半角カナへ変更
-
**入力確定前に【無変換】ボタン押下（1回目：全角カナ、2回目：ﾊﾝｶｸｶﾅ）**
例：わたしはまっちょがすき　➡　ﾜﾀｼﾊﾏｯﾁｮｶﾞｽｷ

🐣Google検索欄で完全一致検索をしたい
-
"完全一致検索したい文字列"
**のように **"** で囲みましょう（ぜひ試してみてください）**

🐣PCを ~~スリープ~~ ➡　画面ロックしたい
-
**【Windowsマーク】ボタン + 【L】 を同時に押下**
※ご指摘頂きありがとうございます！既に読まれた方、申し訳ございません！

🐣PCにたくさん表示してしまったウィンドウを一気に最小化（一度収納）したい
-
**【Windowsマーク】ボタン + 【D】 を同時に押下**

🐣PCの表示を拡張する設定を表示したい
-
**【Windowsマーク】ボタン + 【P】 を同時に押下**

🐣画面指定範囲キャプチャしたい
-
**【Windowsマーク】ボタン + 【Shift】ボタン + 【S】**
※詳しく知りたい方は筆者別記事の[こちら](https://qiita.com/first_step_by_step_/items/b481c01793b3a6b791f3)へどうぞ！

🐣コマンドプロンプトをあるフォルダのパスですぐ開きたい
-
①エクスプローラーで対象位置まで移動
②パスの表示されている検索窓に「cmd」と入力してEnterキーを押下
※エクスプローラーとは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089043/d2373a4d-6608-4d53-9601-b53b3cdd783c.png)

:::note Info
**試しに初めてコマンドプロンプト立ち上げちゃった人用のヒント**
 Exit
と打てば終了できます(普通に×印押下でもよし)。
:::

🐣なぜか数字が押せなくなった。。。対処法
-
**【num lk】ボタン押下**
※数字キーをロック／ロック解除するボタンです。

🐣なぜか文字を入力すると、後ろの文字が消える。。。対処法
-
**【ins】ボタン押下**
※後ろの文字を書き換えてしまうモードです。

🐣番外編：PCでWindowsが壊れるから絶対やらない方がいいこと
-
**C:ドライブの削除**
（※過去に好奇心でこれをやったのは私です。。。）

## 終わりに :hatching_chick:
最後までご覧頂きありがとうございました！
素敵なWindowsライフをお過ごしください！:blush:
以上、梅干しとにらめっこでした。
Proxmoxで仮想マシンをリストアする（外付けSSDから）

　前回、仮想マシンを外付けSSDに保存しました。今回は仮想マシンを外付けSSDからリストアする手順を公開します。前回も書いたとおり、同じノードにリストアすれば、バックアップから仮想マシンを復元することとなりますし、異なるノードにリストアすればマイグレーションすることとなります。
 
### １　リストア先のサーバへSSDを接続してバックアップデータをコピーする
　リストアしたいサーバ（ノード）へSSDを接続します（USB接続です）。
![SSD connect to Mac - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832918/ec2eb018-1bd6-47a9-b017-a29c40cb7552.png)
　ここではSSDが、デバイス　/dev/sde　として認識されています。

### ２　SSDをマウントする
　シェルを起動してマウント先を作成後、SSDをマウントします。今回も最後に削除することとなるので、ルート上にvmCOPYというディレクトリを作成し、そこへマウントすることとします。
```
# cd /
# mkdir /vmCOPY
# mount /dev/sde /vmCOPY
```
　リストア先のノードに、SSDを追加します。
![マウントしたSSDをディスクに追加するrestore - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832918/f569eadf-78f1-407a-b2d3-33ee5406b639.png)
補足
　追加ボタンを押した後のウインドウとなる「追加：ディレクトリ」の画面では、下記のように設定します。
　　　　　　　ID：　vmCOPY
　　ディレクトリ：　/vmCOPY
　　　　　　内容：　VZDumpバックアップファイル　を追加
　　　　　　　　　　（これを忘れないこと！）

### ３　SSDから仮想マシンをリストアする
　リストア先のノードに追加したSSDのバックアップの項目を確認します。ここに、
 ``vzdump-qemu-101-2025_02_11-20_36_26.vma.zst``
という具合に、仮想マシンのバックアップデータが出てきます。
![VMも見つかり、リストアも押せますrestore - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832918/5a1dcb6b-f0e7-469e-b720-b713945e29a3.png)
　バックアップデータを選択すると、上部の「リストア」のボタンがアクティブになりますので、リストアボタンを押します。

肝心なポイント！
　リストア：VMの画面では、「ストレージ：」の項目で、リストア先のノード上で仮想マシンのデータを蔵置したい場所を選択することに注意します。
![リストアの名前をつけますrestore - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832918/5a873d1a-f44b-4d05-8c08-59d7fbd60e6c.png)
　リストアが完了したら、完了したら、仮想マシンの動作確認。無事に仮想マシンをリストアできたと思います。

### あとかたづけ　その１
　リストア先のノードに追加したストレージSSDを削除し、SSDをアンマウントします。
　ノードからのストレージ削除は、手順２でデータセンターを選択した際に、ストレージ上に　vmCOPY　と表示されているので、これを選択してGUI上で削除します。
　次にシェル上でSSDをアンマウントしてノードから取り外します。
```
# umount /vmCOPY
```

### あとかたづけ　その２
　バックアップ元のノードとリストア先のルートディレクトリ上に作成した/vmSSDや/vmCOPYは、シェル上で削除します。
バックアップ元のノードでは下記のコマンドを実行します。
```
# cd /
# rm -r /vmSSD
```
リストア先のノードでは下記のコマンドを実行します。
```
# cd /
# rm -r /vmCOPY
```
　みなさんの参考になれば幸いです。
ファイル検索コマンド

# ファイル検索コマンドの備忘録
ファイル検索の際に利用するコマンドの備忘録です。

### テストファイル
これらのテストファイルはカレントディレクトリに配置されているとします。
```file1.txt
hogehoge fugafuga
hogehoge1   fugafuga1
hogehoge1fugafuga1
```

```file2.txt
hogehoge fugafuga
hogehoge1   fugafuga2
hogehoge2-fugafuga2
hogehoge2(fugafuga2)
hogehoge123(fugafuga2)fuga
```


## findコマンド
### 基本形

$ find 場所 -name (ファイル名)
※ 「.」 はカレントディレクトリを示す
```
(1) 基本形
$ find . -name "file*"
./file2.txt
./file1.txt

(2) nameオプション省略
$ find file*
file1.txt
file2.txt
$

(3) ワイルドカード無しなら完全一致を探すため1ファイルも抽出されない
$ find . -name "file"
$ 
```




### 【参考】エラーが発生する書き方
```
(1) ワイルドカードなし
$ find file
find: file: No such file or directory

(2) 対象文字列を引用符で囲う
$ find "file*"
find: file*: No such file or directory

(3) ワイルドカードなし かつ 引用符あり
$ find "file"
find: file: No such file or directory
```

## grepコマンド
### 基本形
$ grep [オプション] 文字列 ファイル名
※検索文字列はワイルドカードを利用せずに、この文字列を含む行を検索する。

```
(1) 対象文字列を含むファイル内の行を全て表示する
$ grep "hogehoge" file1.txt
hogehoge fugafuga
hogehoge1   fugafuga1
hogehoge1fugafuga1

(2) 対象文字列を含まない行は表示されない
$ grep "hogehoge1" file1.txt
hogehoge1   fugafuga1
hogehoge1fugafuga1

(3) 対象文字列は引用符で囲んでも同様の出力
$ grep hogehoge1 file1.txt
hogehoge1   fugafuga1
hogehoge1fugafuga1

```

### iオプション
大文字と小文字を区別せずに検索を行う
```
(1) iオプションなし
$ grep HOGEHOGE1 file1.txt
$ 

(2) iオプションあり
$ grep -i HOGEHOGE1 file1.txt
hogehoge1   fugafuga1
hogehoge1fugafuga1
```

### eオプション
grep検索に正規表現を用いる
「.」任意の1文字
「*」0文字以上の繰り返し

```
$ grep -e ".*(.*).*" file2.txt
hogehoge2(fugafuga2)
hogehoge123(fugafuga2)fuga
```


### 【参考】エラーが発生する書き方
正規表現の文字列パターンを引用符で囲まない
```
$ grep -e .*(.*).* file2.txt
zsh: no matches found: .*(.*).*
```

## find | grep
findとgrepをパイプライン(|)で繋いで、特定のファイル名を持つファイルの中から特定の文字列を検索する (他にも実現方法はあるため一例)

※xargsコマンドは標準入力(stdin)から受け取ったデータを別のコマンドに渡す
```
(1) 基本形
$ find file* | xargs grep hoge
file1.txt:hogehoge fugafuga
file1.txt:hogehoge1   fugafuga1
file1.txt:hogehoge1fugafuga1
file2.txt:hogehoge fugafuga
file2.txt:hogehoge1   fugafuga2
file2.txt:hogehoge2-fugafuga2
file2.txt:hogehoge2(fugafuga2)
file2.txt:hogehoge123(fugafuga2)fuga

(2) grepのeオプションあり
$ find file* | xargs grep -e ".*(.*).*"
file2.txt:hogehoge2(fugafuga2)
file2.txt:hogehoge123(fugafuga2)fuga

(3) 特定ディレクトリの全ファイルを検索対象にするならfindの代わりにlsでもOK
$ ls | xargs grep -e ".*(.*).*"
file2.txt:hogehoge2(fugafuga2)
file2.txt:hogehoge123(fugafuga2)fuga
```