OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScript初心者が最初にハマる型エラー図鑑【2025年版】

## はじめに

TypeScriptを学び始めると必ずぶつかるのが**型エラー**。
そして大半の初心者が思うのが「エラーメッセージが全然優しくない…」です。

でも実は、よく出るエラーには**だいたい定番パターンがある**。
この記事では、**初心者がつまづきやすい型エラーを「症状」「原因」「解決策」で整理**して、図鑑的にまとめます。

---

## 想定読者

* TypeScript初学者
* 案件でTypeScriptを使い始めた方
* 型エラーの読み方を身につけたい方

---

## 1. "Type 'undefined' is not assignable to type '〇〇'"

### 症状

```typescript
let name: string = undefined;
```

```
Type 'undefined' is not assignable to type 'string'.
```

### 原因

* `string`型には`undefined`が含まれていない
* TypeScriptは「型安全」にうるさい

### 解決策

* 明示的に `undefined` を許容する

```typescript
let name: string | undefined = undefined;
```

---

## 2. "Object is possibly 'null'"

### 症状

```typescript
document.getElementById("app").innerHTML = "Hello";
```

```
Object is possibly 'null'.
```

### 原因

* `getElementById()`の戻り値が `HTMLElement | null`
* nullの可能性を無視すると怒られる

### 解決策

* nullチェックする

```typescript
const el = document.getElementById("app");
if (el) {
  el.innerHTML = "Hello";
}
```

* または非nullアサーションを使う（注意して使用）

```typescript
document.getElementById("app")!.innerHTML = "Hello";
```

---

## 3. "Argument of type '〇〇' is not assignable to parameter of type '△△'"

### 症状

```typescript
function greet(name: string) {}
greet(123);
```

```
Argument of type 'number' is not assignable to parameter of type 'string'.
```

### 原因

* 関数の引数に違う型を渡してる

### 解決策

* 呼び出し側の型を合わせる

```typescript
greet("John");
```

---

## 4. "Property '〇〇' does not exist on type '△△'"

### 症状

```typescript
const user = { id: 1, name: "John" };
console.log(user.email);
```

```
Property 'email' does not exist on type '{ id: number; name: string; }'.
```

### 原因

* 存在しないプロパティにアクセスしようとしてる

### 解決策

* プロパティを定義に追加する or アクセスをやめる

```typescript
interface User {
  id: number;
  name: string;
  email: string;
}
```

---

## 5. "Type 'any' is not assignable to type '〇〇'"

### 症状

```typescript
let data: string = JSON.parse("{}");
```

```
Type 'any' is not assignable to type 'string'.
```

### 原因

* `JSON.parse()` は `any` を返す
* `any`をそのまま型付けに使うと怒られる

### 解決策

* パース後に型アサーションする

```typescript
interface User { id: number; name: string; }
const user = JSON.parse(json) as User;
```

* もしくは `zod` などで安全にパースする

---

## 6. "Cannot assign to '〇〇' because it is a constant"

### 症状

```typescript
const count = 0;
count = 1;
```

```
Cannot assign to 'count' because it is a constant.
```

### 原因

* `const`は再代入不可

### 解決策

* 変更したいなら`let`を使う

```typescript
let count = 0;
count = 1;
```

---

## 7. "Excess property checks"

### 症状

```typescript
interface User { id: number; name: string; }
const user: User = { id: 1, name: "John", age: 20 };
```

```
Object literal may only specify known properties, and 'age' does not exist in type 'User'.
```

### 原因

* インターフェースにないプロパティを追加してる

### 解決策

* 定義に追加する or 削除する

```typescript
interface User { id: number; name: string; age?: number; }
```

---

## まとめ：型エラー攻略のコツ

* **まずエラーメッセージを恐れず読む**
* **「誰にどんな型を渡した？」を常に意識**
* **undefined / null / any あたりを丁寧に扱う**
* **困ったら型定義に立ち戻る**

TypeScriptの型エラーは最初は難しく感じますが、**慣れるとむしろバグが減る最強の味方**になります！

---

## おわりに

Qiitaでは今後も**初学者向けTips**を発信していきますので、ぜひLGTM・フォローお願いします！
[Linux] ローカリゼーション_ロケール_LC_*, LANG

# 主な環境変数
| 変数名            | 説明                                         | 優先順位 | 例                          |
| :------------- | :----------------------------------------- | :--: | :------------------------- |
| `LC_ALL`       | **すべてのロケール設定を一括で上書き**する特別な変数。<br>一時的な変更に便利 |  最優先 | `LC_ALL=ja_JP.UTF-8`       |
| `LC_CTYPE`     | 文字分類や大文字・小文字の判別、マルチバイト文字の処理などの設定           |   中  | `LC_CTYPE=ja_JP.UTF-8`     |
| `LC_MESSAGES`  | システムメッセージの言語（例：エラーメッセージ）                   |   中  | `LC_MESSAGES=en_US.UTF-8`  |
| `LC_MONETARY`  | 通貨記号や金額の表示方法                               |   中  | `LC_MONETARY=ja_JP.UTF-8`  |
| `LC_NUMERIC`   | 数値の表記（例：小数点の区切り文字など）                       |   中  | `LC_NUMERIC=de_DE.UTF-8`   |
| `LC_TIME`      | 日付や時刻の書式（例：`YYYY/MM/DD` や曜日名）              |   中  | `LC_TIME=fr_FR.UTF-8`      |
| `LC_NAME`      | 個人名や敬称などの表示形式（例：姓名の順序、敬称 Mr./Ms.）          |   中  | `LC_NAME=ja_JP.UTF-8`      |
| `LC_ADDRESS`   | 住所表記の書式（例：郵便番号、都道府県、番地の順序）                 |   中  | `LC_ADDRESS=ja_JP.UTF-8`   |
| `LC_TELEPHONE` | 電話番号の表記方法（国番号・市外局番・番号の区切り）                 |   中  | `LC_TELEPHONE=ja_JP.UTF-8` |
| `LANG`         | 基本となるロケールを指定。<br>他の `LC_*` が未設定の場合に使用される   |  最低  | `LANG=en_US.UTF-8`         |


# Ping-t
- [5045_全般](https://mondai.ping-t.com/question_subjects/32/question_sessions/33698403/progressing_questions/515999728)
- [5141_LC_NAME, LC_ADDRESS, LC_TELEPHONE](https://mondai.ping-t.com/question_subjects/32/question_sessions/33767513/progressing_questions/517007537)
- [4735_LC_ALL](https://mondai.ping-t.com/question_subjects/32/question_sessions/33767513/progressing_questions/517007549)
- [4557_LANG](https://mondai.ping-t.com/question_subjects/32/question_sessions/33767513/progressing_questions/517007550)
- []()
- []()
- []()
- []()
Rails学習メモ（初学者向け）④


どうも、nus4です。

Rails講座の学習メモ4回目です。
今回は梅雨の時期に取り組んでいるのですが、
自分は低気圧に弱く、時々頭がぼーっとしながら苦心しています…


## 学習方法

- Progate Ruby on Rails5コース　Ⅳ〜Ⅴ
　（Ruby学習に引き続き、愛用させてもらってます！）


## 📝 目次
- [レコードの削除](#レコードの削除) 
- [レコードの更新](#レコードの更新)  
- [postアクションへのリンクの書き方](#postアクションへのリンクの書き方)  
- [エラー条件の作成（バリデーション）](#エラー条件の作成バリデーション)  
- [別のアクションを経由せずに直接ビューを表示](#別のアクションを経由せずに直接ビューを表示)  
- [エラーメッセージの表示](#エラーメッセージの表示)  
- [サクセスメッセージの表示](#サクセスメッセージの表示)


## レコードの削除
```ruby
インスタンス名.destroy
```
.saveメソッドは不要です。


## レコードの更新
```ruby
インスタンス名.update(カラム名: 値)
```
カラムと値は","で複数指定することが可能です。


## postアクションへのリンクの書き方
```erb
<%= link_to("画面表示名", "/リンク先URL",{method:"post"}) %>
```
{method:"post"}がないと、routesではgetアクションを探してしまうため、追記が必要です。


## エラー条件の作成（バリデーション）
モデルファイルに上記を記載することで、
各条件に合致するデータベースへの変更を弾きます。
#変更は起こらず、インスタンス名.save = falseになる状態
```ruby
# modelファイル
# 空の値をデータベースに追加する場合、エラー
validates :検証するカラム名 {presence: true}

# 141文字以上の値をデータベースに追加する場合、エラー
validates :検証するカラム名 {length: {maximum: 140}}

# 上記2つのエラーを一行で書く
validates :content, {presence: true, length: {maximum: 140}}
```

実行エラーにはならないので、処理自体は止まらず続きます。
逆に、エラー条件に合致した場合の処理を追加したい場合は
*controllerファイル内で if インスタンス名.save = false* と書けばいいわけです。


## 別のアクションを経由せずに直接ビューを表示
アクション中に別のviewに飛ばしたいが、それ用にアクションを追加したくない場合、
renderメソッドを使用してviewファイルを直接指定することが可能です。
```ruby
# controllerファイル アクション内
render("コントローラ名/ビュー名")
```

redirect_toメソッドと違い、viewファイルを直接指定するので、()内の頭に"/"が不要なことに注意。
また、*同アクション内で定義した＠変数を指定したviewファイル内でも使用できる*のでそこも便利です。


## エラーメッセージの表示
railsではバリデーションに失敗した場合、自動でメッセージが生成されるようになっています。
メッセージは*インスタンス名.errors.full_messages*に配列として格納されていますので、
配列の値を取り出すことで、エラーメッセージを表示することができます。
```erb
<!-- viewファイル -->
<% @インスタンス名.errors.full_messages.each do |変数名| %>
    <%= 変数名 %>
<% end %>
```

配列なので、エラーメッセージを複数蓄積することも可能ですが、
アクションのたびにインスタンスを作成するように記述されていれば、
処理時のエラーメッセージ以外はリセットされるため、表示されません。

## サクセスメッセージの表示
反対に、サクセスメッセージを表示させることも可能です。
ページ上に一度だけ表示させる"フラッシュ"というメッセージを、
railsで用意されている特殊変数"flash[:notice]"で用意することができます。
```ruby
# controllerファイル
flash[:notice] = "表示させたい文字列"
```

```erb
<% if flash[:notice] %>
    <div class="flash">
        <%= flash[:notice] %>
    </div>
<% end %>
```

flashは@がついていませんが、ビュー内で使用することができる特殊な変数です。
色々なページで表示させたいことが多いので、application.html.erbにまとめて記載したほうがいいです。

いかがでしたでしょうか。

Progateの有料プランは1ヶ月のみの契約のつもりでしたが、自分の進捗がゆっくり過ぎて2ヶ月目に突入していました…。
3ヶ月以内に目標完了目処でこれからも無理せず進めたいと思います。
Proxmox上にZimaOSを構築

# ZimaOS
ZimaOSは、CasaOS(OSではない)から発展したNAS向きOSです。

https://github.com/IceWhaleTech/ZimaOS

https://www.zimaspace.com/

`Buildroot`で構築されているので、OSイメージが非常に軽量です。
I/Oを最小化し、負荷が少ないらしいです。

現在パブリック評価版を公開中なので、今回はそちらを使用していきます。

# インストール
本来はUSBにbalenaEtcherなどで展開してインストールするのが公式の手順になります。
しかし、proxmoxでUSBパススルーを使ってインストールしようとしたらエラーを吐かれたので、今回は別のアプローチを使用します。

## VMの作成
まずはVMを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532025/8500fc05-a1ed-4416-bbe3-a545f0a115f4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532025/eff01dd4-727c-4943-a016-70a0623a1b89.png)

::: note warn
インストーラーメディアは使用しません。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532025/7c7c9a72-49d9-4541-8483-53a232ecdc64.png)

::: note warn
UEFIマシンが必要です。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532025/d1659876-34a0-401d-9793-4cb3037af71a.png)

::: note warn
デフォルトで追加されるディスクは削除します。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532025/c54d4e4f-2ef1-4ece-8e82-33b22f7e7871.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532025/09e48095-7c97-4648-be8d-e7e2f89d3719.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532025/234a8504-a0e9-48ba-9d78-90ed630ef3e7.png)


作成します。


## OSイメージのダウンロード
GithubのReleasesから最新版のイメージファイルをダウンロードします。
ここで使用するのは、`.xz`で圧縮された形式のイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532025/f2ae41fd-859c-4bfd-960d-53825ddacbe8.png)

```
# wget -O /var/lib/vz/images/zimaos_image.img.xz https://github.com/IceWhaleTech/ZimaOS/releases/download/1.4.1/zimaos_zimacube-1.4.1.img.xz
```
## OSイメージ展開
先ほどダウンロードしたディレクトリへ移動し、イメージを展開します。

```
# cd /var/lib/vz/images
# xz -d zimaos_image.img.xz
```

::: note warn 
`xz-utils`がない場合はインストールしておいてください。
```
# apt install xz-utils
```
:::

## VMへのアタッチ
VMの作成と解凍が完了したら、VMにOSイメージをアタッチします。

```
# qm importdisk <vmid> /var/lib/vz/images/zimaos_iamge.img <storage>
```

WebUIへ移動し、VMの`ハードウェア`タブへ移動します。
`未使用のディスク`が追加されているはずなので、編集から追加を押してVMへアタッチします。

## ディスクリサイズ
ここでOSのイメージディスクをリサイズします。
デフォルトの容量だとインストールに失敗してしまうので、**最低でも32GB程度まで増やしてください。**

今回はOSイメージを拡張し、そのままデータディスクとして使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532025/ae625707-7e13-4c66-b227-c1c997ec8af3.png)

# 初期設定
## SecureBoot無効化
ディスクのアタッチまでが完了したら、一度VMを起動してUEFI画面へ移動します。

`Device Manager` -> `Secure Boot Configuration` -> `Attempt Secure Boot`を無効化します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532025/fbfd4379-e503-44e9-9d0e-b3a8b97a7c3f.png)

無効化したらトップへ戻ってContinueで続行します。

## rootパスワード設定
起動後、この画面になったらVNCのサイドメニューから`Alt`キーを押下状態にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532025/1eb12256-7793-4d4e-8f4d-e2a859c59240.png)

この状態で、`F2`キーを押下すると仮想コンソールが移動するので、`root`でログイン後に`passwd`を実行します。

## 初期ユーザー登録
`passwd`実行後は、初期ユーザーを登録して終了です。
お疲れさまでした。

# おまけ
初期設定だと、IPアドレスがDHCPになっているので自分で固定したほうがよいでしょう。
生成モデルの基礎知識1 Vector Database

こんにちは。
最近、NVIDIA-Certified Associate: Generative AI and LLMs (NCA-GENL)を習得しました。
その際に知っておいた方が良い基礎知識とコードの書き方を共有したいと思います。
生成AIのチュートリアル:

https://github.com/Yuji-github/Gen_AI_Tutorial

１．ベクトルデータベース (Vector Database)とは？
ベクトルデータベースは、ベクトル化したデータを保存、管理、クエリするために設計されたデータベースの一種。
ベクトルデータベースは、非構造化データ（テキスト、画像、音声、動画など）を類似性検索が可能。
また、キーワードの一致だけでなく、与えられたクエリに「意味的に類似している」データアイテムを見つけることができる。（セマンティック検索機能）
大規模言語モデル（LLM）やGPTモデルなどに不可欠。


２．ChromaDBとは？
ChromaDBは、オープンソースのベクトルデータベース。
軽量で使いやすいように設計されており、データの保存、Embedding、検索を行うためのツールを提供。
色々なEmbeddingモデル（SentenceTransfotmerベースやOpenAIのAPI）をサポートし、ローカルで実行することも、クライアント・サーバーソリューションとして実行することもできるため、効率的なセマンティック検索機能を提供。


その他のオープンソースのベクトルデータベースのメリットとデメリット

|データベース  |メリット  |デメリット  |
|---|---|---|
|ChromaDB  | - 開発者フレンドリー: LLM開発者にとって、セットアップと使用が非常に簡単。<br> - シームレスなLLM連携: LangChain、HuggingFace、および様々なEmbeddingモデルとの連携。<br> - デプロイ: インメモリ、ファイルベース (DuckDB)、またはよりスケーラブルなバックエンド (ClickHouse) で実行。<br> - コミュニティ: 開発者向けのサポートとリソースが豊富。 | - スケーラビリティの限界: 数十億のベクトルやペタバイト級のデータ向けには設計されておらず、非常に大規模なデータセットには最適ではない。<br>- 機能: コアとなるベクトル検索とRAGに重点を置いており、他のオプションは少なめ。|
|Milvus  | - スケーラビリティ: 数十億のベクトルを処理し、クラスター全体で水平にスケールするように設計。<br> - パフォーマンス: 高スループットと低レイテンシーのベクトル検索。<br> - インデックスオプション: パフォーマンスと精度を微調整するための様々なインデックスアルゴリズムを提供。 | - 運用上の複雑さ: 小規模なプロジェクトやチームにとっては、セットアップ、管理、運用がより複雑でリソースを消費。<br> - リソース要件: 分散デプロイメントにはかなりのインフラが必要。<br> - 新規ユーザー: 分散型である事と豊富な機能のため、新規ユーザーには難しい。 |
|Qdrant  | パフォーマンス: Rustで書かれており、高速性、効率性、および低いリソース消費。<br> - ペイロードフィルタリング: 添付されたメタデータ (JSONペイロード) に基づいて検索結果をフィルタリングする機能があり、複雑なコンテキスト検索。<br> - リアルタイム更新: データとリアルタイムインデックス作成を効率的に処理。  | - 新規ユーザー: フィルタリング機能を完全に習得するには勉強が必要。<br>  - 特化: 多機能ではあるが汎用データベースではない。|
SES（客先常駐）で見つけた、自分なりの“居心地の作り方”

<h1>SESエンジニアとして“居心地”を作るために僕がやってる5つのこと</h1>

<p>
SESで客先常駐をしていると、環境や文化がバラバラで、技術以前に「どう馴染むか？」が問われる場面に出くわしますよね。<br>
今回は、これまで数年SESとして働く中で、自分なりに見つけた「居心地の作り方」を紹介します。
</p>

<hr>

<h2>1. <b>最初の一言は「〇〇さんって何をされてるんですか？」</b></h2>
<p>
初対面の先輩にこの一言を投げかけるだけで、人はけっこう話してくれます。<br>
技術の話が苦手な人でも「書類作ってます」「テストだけです」と答えてくれます。<br>
大事なのは、そのあとに「すごいっすね」とか「大変そうですね〜」と軽くリアクションを返すこと。<br>
それだけで、空気がだいぶ柔らかくなります。
</p>

<h2>2. <b>議事録は“先に作っておく”</b></h2>
<p>
定例MTGの前に「たぶんこうなるだろう」という内容を先に書いておく。<br>
完璧じゃなくてOK。5割でも下書きがあると、会議中は“追記”するだけで済みます。<br>
結果、「仕事が速い人」と思われるし、何より自分がラクになります。
</p>

<h2>3. <b>会社の“色”を読み取る（Slack or Excel？）</b></h2>
<p>
Slack文化の会社もあれば、「すべてExcel」の現場もあります。<br>
大事なのはツールの良し悪しではなく、「その文化に乗れるかどうか」。<br>
僕は、Slack中心の現場では“スタンプ職人”として、Excel中心の現場では“関数職人”としてやってます（笑）
</p>

<h2>4. <b>帰属意識は“2つ”持つ</b></h2>
<p>
常駐先の環境に溶け込むのも大事ですが、自社のSlackやチャットに雑談を書いたり、月報でちょっとふざけたり、<br>
“帰る場所”を意識的に作ることも大事だと思っています。<br>
現場で孤独感を感じたら、自社に一言「最近こんな感じです〜」と送ってみるのもアリです。
</p>

<h2>5. <b>技術で目立つのは“半年後”でいい</b></h2>
<p>
最初から技術的にアピールしようとせず、「空気を読む」ことを優先しています。<br>
半年くらい経つと「〇〇さん、これ分かります？」と自然に頼られるようになります。<br>
そこで初めて、自分の得意な分野で貢献すればOK。
</p>

<hr>

<h3>まとめ</h3>
<p>
SESはしんどいこともありますが、<b>「環境に適応する力」も立派なスキル</b>だと思っています。<br>
どんな現場でも「ちょっとずつ自分の居心地を作る」ことが、楽しく働くコツかもしれません。
</p>

<p>
読んでくれたエンジニアの皆さんが、「あるある！」「ちょっと試してみようかな」と思ってもらえたら嬉しいです。<br>
次の現場でも、お互い気楽にいきましょう〜！
</p>
日本の非IT産業におけるChatGPTの利用

# 日本の非IT産業におけるChatGPTの利用


| 会社名 | 証券コード | 産業セクター | 主要AIプラットフォーム | 主要な活用事例 | 導入規模 | 公表されている効果・ROI |
|--------|--------------|----------------|-----------------------------|------------------|----------|---------------------------|
| 三菱UFJフィナンシャル・グループ | 8306 | 金融 | Azure OpenAI Service | 内部文書・稟議書の作成支援、資産管理業務での活用検討 | 全社的 | 月間22万時間の労働時間削減（試算） |
| 三井住友フィナンシャルグループ | 8316 | 金融 | 不明（ChatGPT技術ベース） | 自社専用AI「SMBC-GPT」による文書作成、要約、翻訳、ソースコード生成 | 試験導入 | 従業員の生産性向上 |
| 大和証券グループ本社 | 8601 | 金融 | Azure OpenAI Service | 英語情報の収集支援、資料・企画書の素案作成 | 全社員約9,000人 | 本来業務への時間創出 |
| パナソニック ホールディングス | 6752 | 製造 | Azure OpenAI Service | AIアシスタント「PX-GPT」による情報検索、要約、アイデア創出 | 国内グループ社員約9万人 | 想定の5倍の利用率（約5,000回/日） |
| 三菱重工業 | 7011 | 製造 | Azure OpenAI Service | 発電プラント向けソリューション「TOMONI」における業務改善AI「TOMONI TALK」 | 特定事業部門 | 業務改善の実現、将来的な「TOMONI Copilot」構想 |
| デンソー | 6902 | 製造 | Azure OpenAI Service | 自律動作ロボットへの言語指示 | R&D | 自律的にタスクを実行するロボットを開発 |
| 西松建設 | 1820 | 建設 | 不明（ChatGPT活用） | 物価変動の高精度予測 | 特定業務 | 購買戦略への貢献が期待される |
| 三井不動産 | 8801 | 不動産 | Azure OpenAI Service (GPT-4) | 自社特化型AIチャット「&Chat」 | 全従業員約2,500人 | 業務効率化、全社的な活用推進施策 |
| セブン＆アイ・ホールディングス | 3382 | 小売 | 不明（ChatGPT活用） | 新商品の企画支援 | 商品企画部門 | 商品企画にかかる時間を最大90%削減 |
| すかいらーくホールディングス | 3197 | 小売 | Azure OpenAI Service | AI店長「Co店長」 | 試験導入（秋葉原店） | 業務効率化と顧客接点の質の両立 |
| 第一三共 | 4568 | 医薬品 | Azure OpenAI Service | 「DS-GAI」プラットフォーム開発 | グループ全体 | 8割以上が生産性・精度向上を実感 |
| サワイグループホールディングス | 4887 | 医薬品 | Azure OpenAI Service | AIエージェントによる研究支援 | 研究開発部門 | 月間100回程度の利用、高評価 |
| 三菱商事 | 8058 | 総合商社 | Azure OpenAI Service | 「MC-GPT」ポータル導入 | 全社的 | 月間アクティブユーザー1,000人超 |
| 西日本旅客鉄道（JR西日本） | 9021 | 運輸 | Azure OpenAI Service | AI「MIRAI」による駅設備対応支援 | 現場担当者 | 経験の浅い担当者でも迅速な対応が可能に |
| 鹿島建設 | 1812 | 建設 | 独自AI | 「Kajima ChatAI」による業務支援 | 国内グループ従業員2万人 | セキュアなAI利用環境の構築 |
Nextpart AI - フィルターなしのNSFWキャラクターAIチャット

Unfiltered [NSFW AI Chat](https://nextpart.ai/) with lifelike AI characters. Create your dream AI Girlfriend and enjoy limitless, personalized interactions anytime, anywhere.

フィルターなしのNSFW AIチャットでリアルなAIキャラクターと会話しましょう。あなたの理想のAIガールフレンドを作成し、いつでもどこでも無限にパーソナライズされたインタラクションを楽しんでください。

Nextpart AI is an unrestricted [NSFW AI chat](https://nextpart.ai/) platform allowing users to interact with AI characters, each having customized appearances and personalities. It supports voice responses, image generation, and multilingual conversations without NSFW Chatbot filters.

Nextpart AIは、ユーザーがカスタマイズされた外見と個性を持つAIキャラクターと対話できる制限のないNSFW AIチャットプラットフォームです。音声応答、画像生成、多言語での会話をサポートしており、NSFWチャットボットフィルターはありません。
【E資格】3次正方行列の行列式（サラスの公式）

3次正方行列の行列式は、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/d001013f-539b-4960-8fe4-598344a7ad10.png)

によって計算できます（サラスの公式とも呼ばれています）。

※数学において、「det」とは、行列式を表す記号であり、英語の「determinant」の略です。
Perplexity.aiについての記録

こちらが、**Perplexity.ai**（通称「パープレキシティ」）の特徴と活用法です。目的は記録だけです。

#### 1. サービス概要

- AI搭載の検索エンジン兼チャットボットとして、GPT‑4、Anthropic（Claude）のような最新LLMを採用 
- 質問に対して文章形式で回答し、回答内に**ウェブソースへの引用付きリンク**を提供 

#### 2. 主な機能

##### Quick Search vs. Pro Search

- Quick Search：無料で高速な基本回答
- Pro Search：有料版では深掘り型の対話形式で応答し、さらに詳細な情報とソース提供 [perplexity.ai](https://www.perplexity.ai/hub/getting-started?utm_source=chatgpt.com)

##### ライブラリとスペース

- Thread（スレッド）単位の会話履歴管理が可能
- スレッドをグループ整理できるスペース機能を備え、プロジェクト別に知識をまとめやすい 

##### ファイル解析・ドキュメント検索

- Proユーザーは PDF・Word・CSVなどのファイルをアップロード可能
- アップロードしたドキュメント内からの検索や要約が可能 

##### マルチモーダル対応

- 画像生成（DALL‑E 3など）やファイル内の画像から情報抽出が可能 

#### 3. 利用シナリオ／活用法

- ウェブ検索の代替として：複数ソースを統合した回答を享受 
- 情報収集・リサーチ：アカデミックフォーカス・フォローアップ質問で深堀が可能 
- 文章・コンテンツ作成：要約生成、SEO用記事の下書き、自動校正などに活用 
- 市場調査／ファクトチェック：最新ニュースやデータを根拠つきで取得 
- プログラミング支援：コード作成・デバッグ・説明などの開発支援

#### 4.自分で、利用して生成したページ

[2025年までの金のトレンドに関して、レポートをまとめて](https://www.perplexity.ai/search/2025nian-matenojin-notorentoni-qe7U2EAWSFelyqcQX3qJmw)

[Perplexityを使用している人数に基づいて、Perplexityの使用傾向と見通しを生成して](https://www.perplexity.ai/search/perplexitywoshi-yong-siteirure-wsTdk1MpSIqpVLFrn5Ykww)
CSR, SSR, SSGをレストランで理解する

## はじめに
　今回、研修でReact×Laravelを用いてECサイトを構築しているのですが、そこでCSR, SSRという用語が出てきており、良い感じに例え話ができたため、備忘録として残しておきます。

 例え話のため、単語と対応してない部分があるかもしれないので、流れを理解するために活用していただけると幸いです。

### 覚えておく用語たち
　以下の用語はこれからの物語を理解するために必要なため、わからない方は事前に学習しておくと理解が捗ると思います。
- Bladeテンプレートエンジン
- APIエンドポイント

## SSR (Server Side Rendering)
1\. お客様（ユーザー）がレストラン（ブラウザ）に来店して料理を注文（リクエスト）する
2\. 料理人（サーバー）が注文（リクエスト）を受け取る
3\. 料理人（サーバー）は必要な材料（データ）を棚（データベース）から取得する
4\. 取得した材料（データ）をBlade料理人（Bladeテンプレートエンジン）に渡す
5\. Blade料理人（Bladeテンプレートエンジン）が、料理（データ）をレシピ（Bladeテンプレー トの記述）通りに調理（組み合わせて）して完成させる（最終的なHTML文字列を生成）
6\. 料理人（サーバー）は、この完成した料理（HTML文字列）をお客様（ブラウザ）へ渡す
7\. お客様（ブラウザ）は、出された料理をそのまま食べる（画面に表示する）。ﾌﾝ!!



## CSR（Client Side Rendering）

1\. お客様（ユーザー）がレストラン（ブラウザ）に来店して料理を注文（リクエスト）する
2\. 料理人（サーバー）が注文（リクエスト）を受け取る
3\. 料理人（サーバー）はレシピ（JavaScriptファイル群）と材料リストだけが書かれたメモ（ごくシンプルなHTMLファイル）をお客様（ブラウザ）に渡す

:::note warn
この時点では、お客様（ブラウザ）のテーブルにはほとんど何もありません
:::

4\. お客様（ブラウザ）は受け取ったマニュアル（JavaScript）を読み始め、メモ（シンプルなHTML）を確認する。
5\. 同時に、マニュアルの指示に従って材料の調達部門（APIエンドポイント）に材料（データ）の注文を出す。
6\. 材料の調達部門（APIエンドポイント）から、注文した材料（JSON形式のデータ）がお客様（ブラウザ）の元に届く。
7\. お客様（ブラウザ）は、作り方マニュアル（JavaScript）と手元に届いた材料（データ）を使って、自分のテーブルの上で実際に料理（HTML要素）を組み立てて完成させる（画面に表示する）。

## SSG (Static Site Generation)
1\. 料理人（サーバー）が開店前（デプロイ時やコンテンツ更新時）に作り置きした料理（HTML）を棚（CDN/サーバー）に置いておく(麻婆豆腐、回鍋肉、小籠包など)

2\. お客様がレストラン（ブラウザ）に来店して注文（リクエスト）する

:::note warn
この時点で、お客様は事前に作られた料理しか選べません。
:::

3\. お客様が注文（リクエスト）すると、料理人（サーバー）は棚（CDN/サーバー）に置いてある完成した料理（HTML）を提供する

## まとめ
これまでの各レストランの特徴は以下の通りです。

##### SSR (Server Side Rendering)
- お客様が注文してから、料理人は料理を作り始め完成したら提供する！

##### CSR（Client Side Rendering）
- お客様が注文したら、料理人はレシピと材料リストだけが書かれたメモを渡して、実際に料理するのはお客様！

##### SSG (Static Site Generation)
- 開店前に全部作り置き！注文来たらそのまま料理をお客様に出すだけ！

## 最後に
普通のレストランはSSR形式のところが多いですが、CSR形式のようなレストランがあると楽しそうですね！
Cloudera AI に JOB を登録してみよう

# この記事について

Cloudera AI 上で、実行時間の長いスクリプトをバックエンドで流し続けたいときなどに、スクリプトファイルをジョブとして登録して実行することができます。

ここではそのやりかたを説明します。

# 手順

## 前提

該当のプロジェクトに対する Admin 権限が必要です

## Job の登録

Project の画面から New Job をクリックします

![Screenshot 2025-06-13 at 16.05.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/b5eb5b73-b783-45a5-a9c4-96a909e5a23a.png)

Job名として任意の名前をつけ、Jobとして実行したいファイルを選択し、実行環境を選択します。

![Screenshot 2025-06-13 at 16.10.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/f8bc06f7-da87-4014-9d93-a178acba1f84.png)

画面下までスクロールをして、「Create Job」をクリックします

![Screenshot 2025-06-13 at 16.13.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/b05365f7-cda0-486f-9caf-aa8e956f45e2.png)

## Job の実行

Job の一覧が表示されるので、「Run as」をクリックします

![Screenshot 2025-06-13 at 16.15.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/b236870e-a922-4a8f-a518-fe3c55dd82e1.png)

実行が始まり、状態が Running になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/31e2d60e-98e9-4c81-9683-870e3a4812da.png)

実行が終わると、 Status が Success になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/5c1727b0-b649-457f-b858-d92b0625820b.png)

## 実行エラーになった場合

実行エラーになり、スクリプトを修正した場合は、スクリプトファイルを修正した上で同じジョブを実行することで修正版のスクリプトを実行することができm
rex0220 計算式プラグイン 添付ファイル項目のアップロード期限日

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で、 添付ファイル項目のアップロード期限日と登録日をセットします。

# 概要

レコード作成時に添付ファイル項目のアップロード期限日、ファイル登録時に登録日をセットします。
添付ファイル項目は、編集画面中のイベント処理では値を参照できないという仕様なので、参照するには少し工夫がいります。

![2025-06-13_16h00_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/938b316b-8055-4bfa-8222-c18176c8d41b.png)

# 計算式プラグイン設定

循環参照を許可をチェックします。
添付ファイル未登録の場合は、5日後の日付を「ファイル添付期限」にセットします。
日付設定済みの場合は、そのまま。

EV_INFO("mode") で、添付ファイル項目の値を参照できるかを判定します。

- EV_INFO("mode") の値
    - "success": レコード作成と編集の保存が成功時
    - "batch": 一覧画面の「一括計算」処理時※１
    - "allUpdate": プラグイン設定画面の「既存レコードの更新」処理時※１

※1　Ver.90 以降で対応

![2025-06-13_16h07_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d657443c-03d8-407a-b1ab-f7cab5a8c148.png)

```JavaScript:
OPTION: 循環参照を許可

// ファイル添付期限 DATE
IF(IN(EV_INFO("mode"),"success","batch","allUpdate"),
  IF(添付ファイル,"",
    NVL(ファイル添付期限,DATE_ADD("TODAY",5,"day"))
  ),
  ファイル添付期限
)

// ファイル登録日 DATE
IF(IN(EV_INFO("mode"),"success","batch","allUpdate"),
  IF(添付ファイル,
    NVL(ファイル登録日,TODAY()),
    ""
  ),
  ファイル登録日
)
```
SPIRAL APIで脱！SQL

https://www.pi-pe.co.jp/regist/is?SMPFORM=man-lanerf-2473a633d82734eb22aa64cad426ae23&utm_source=pup-qiita&utm_medium=contentlink&utm_campaign=/SPIRAL_internship/items/26a41bcf1af052d30498&utm_content=link-top&f000099824=https://qiita.com/SPIRAL_internship/items/26a41bcf1af052d30498

---

## はじめに
こんにちは！スパイラル株式会社インターン生です。
突然ですが、開発現場で「SQL書くのしんどいな…」と感じたことはありませんか？
SQLの学習コスト、ミスのしやすさ、可読性…。
エンジニア初心者には、少しハードルが高いと感じる方も多いはず。

そんなあなたに朗報です！
**SPIRAL**が提供する独自の**API**を使えば、SQLを一切書かずにデータベース操作が可能になります！
本記事では、SPIRALのAPIを活用して「SQLレスなDB連携」を体験し、スムーズに開発を進める方法を紹介します。

## こんな人に向けて書いてます
-	SQLにまだ慣れていないエンジニア初心者の方
-	ノーコード／ローコードでの開発に興味がある方
-	SPIRALのAPIに興味があり、使ってみたいと思っている方

## SPIRALってなに？
SPIRAL（スパイラル）とは、スパイラル社が提供する「ローコード開発プラットフォーム」です。
**フォーム作成・データベース管理・メール配信・ワークフローなど、業務に必要な機能をノーコード／ローコードで組み合わせて開発**できます。
そして、開発者向けには**API**も提供されており、システムとSPIRALを柔軟につなぐことができます。
詳しくは公式サイトをご覧ください → [公式サイト](https://www.spiral-platform.co.jp/)

---

▼お試しはこちら

https://www.pi-pe.co.jp/regist/is?SMPFORM=man-lanerf-2473a633d82734eb22aa64cad426ae23&utm_source=pup-qiita&utm_medium=contentlink&utm_campaign=/SPIRAL_internship/items/26a41bcf1af052d30498&utm_content=link-middle&f000099824=https://qiita.com/SPIRAL_internship/items/26a41bcf1af052d30498

---

## SQLと何が違うの？
Webアプリケーションとデータベースを連携するには、主に以下のようなSQLが必要です。
```SQL
SELECT * FROM users WHERE age > 20 ORDER BY created_at DESC;
```
しかし、SPIRALではSQLを直接書く必要がありません！
代わりに、APIを通して**データの取得・更新・登録・削除**を行うことができます。
たとえば、レコードの取得は以下のようなリクエストでOK。
``` SPRAL API
POST /api/spdb/record/search
{
  "form_id": "your_form_id",
  "conditions": [
    {
      "column_name": "age",
      "operator": "gt",
      "value": 20
    }
  ],
  "sort": [
    {
      "column_name": "created_at",
      "order": "desc"
    }
  ]
}
```
これだけで、SQLの代わりに目的のレコードが取得できちゃいます！

### SPIRAL APIでできること
SPIRAL APIでは、レコード登録・取得・更新・削除をはじめ、多くのことがSQLレスで実現できます！
詳しくはこちら

https://support.smp.ne.jp/api/index.html

このAPIを使えば、外部システムとの連携も簡単になります。
皆さんが思うより、できることは山ほどあります！サンプルプログラムもたくさん公開されていますので、ぜひ活用してみてください。

https://support.smp.ne.jp/programs/?_fsi=Nay6NuVR

## まとめ
SPIRAL APIを使えば、SQLに頼らず、より安全かつ簡単にDB連携が可能です。
ノーコード・ローコード開発にもピッタリなSPIRALは、チーム開発にも、個人プロジェクトにも使える心強いプラットフォームです。
ぜひ一度、トライアル登録をして体験してみてください！

---
 
 
私がインターンしているスパイラル株式会社は、ローコードプラットフォーム、SPIRAL ver.1の**トライアルアカウント**を**無償提供**しています。このアカウントの記事でも紹介するように、たくさんの機能ございます。
 
▶︎ フォーム
 ▶︎ 認証エリア
 ▶︎ ログイン
 ▶︎ メール送信
 ▶︎ カスタムプログラム
 
などの作成できますので、ぜひ試してみてください!!
 
https://www.pi-pe.co.jp/regist/is?SMPFORM=man-lanerf-2473a633d82734eb22aa64cad426ae23&utm_source=pup-qiita&utm_medium=contentlink&utm_campaign=/SPIRAL_internship/items/26a41bcf1af052d30498&utm_content=link-bottom&f000099824=https://qiita.com/SPIRAL_internship/items/26a41bcf1af052d30498
 
そして、今チームでトライアル登録者向けに、オンボーディングコンテンツを作成しています。**SPIRAL ver.1**にご興味のある方、ぜひこちらもご覧ください👇
 
https://knowledge.spirers.jp/special/detail/11680
【Linux】pstreeコマンド

**pstreeコマンド**は、プロセスの親子関係をツリー構造で表示するコマンドです。

**表：主なオプション**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/bdf5719a-f45f-44ee-b755-6275a60241d2.png)
ジュニアエンジニアが学んだ「認識のズレ」を防ぐ開発の進め方

エンジニアとして働き始めて半年、業務の中で痛い失敗を経験しました。しかし、この失敗から学んだことは今後の開発ライフを大きく変える重要な気づきとなりました。今回は、その体験談と学んだ教訓、そして実践的な改善策について共有したいと思います。

## 起きてしまった出来事

ある日、比較的大規模な改修タスクが私に割り当てられました。工数見積もりは約2週間という、新人の私にとってはかなりチャレンジングなものでした。

私なりにタスクの内容を理解し、実装計画を立案。GitHub issueに詳細を記載し、PMにもリンクを共有して開発をスタートしました。「きちんと計画を立てて、共有もしている。これなら大丈夫だろう」と思っていました。

しかし、開発最終日の前日、衝撃的な事実が判明します。私の理解とPMの想定していた実装内容に大きな齟齬があったのです。

「え？そこの機能も必要だったんですか？」
「いや、逆にその部分は今回の対象外です」

まさに青天の霹靂。急遽実装をやり直すことになりました。幸い修正範囲がそれほど大きくなかったため、なんとか期限内に完了できましたが、心身ともにかなりのダメージを受けました。

## 失敗から見えた根本的な問題

この失敗を振り返って気づいたのは、「共有したつもり」になっていたという点でした。

確かにGitHub issueにタスクを登録し、PMにリンクも送っていました。しかし、それだけでは全く不十分だったのです。一方的に情報を投げただけで、相手がその内容を正しく理解しているか、自分の理解が正しいかを確認していませんでした。

**「実装計画を立てて共有する」だけでなく、「この理解で合っていますか？」と明確に確認を取るべきだった**のです。

## 「認識のズレ」はなぜ生まれるのか

PMと開発者の間に認識のズレが生まれるのは、実は当然のことです。それぞれが持っている背景情報や専門知識に違いがあるからです。

### PMの視点
- プロジェクト全体の仕様や要件への深い理解
- ビジネス要件や顧客ニーズの把握
- スケジュールや優先度の管理

### 開発者の視点  
- 実装の技術的詳細への理解
- コードベースの構造や制約の把握
- 開発工数や技術的リスクの評価

この**知識のギャップが「開発上の過不足」を生み出します**。

例えば：
- 開発者の仕様理解に漏れがある → 「え！そこも開発しなきゃいけなかったんですか！」
- 開発者が過剰に開発を進める → 「え！そこは必要なかったんですか！」

特に**ジュニアエンジニアは「どう開発を進めればいいか」という経験則が不足している**ため、このような事態に陥りやすいのです。

## 具体的な改善策

### 1. タスク開始時の確認ポイント

タスクを受け取ったら、以下の点を必ず確認するようにしました：

**実装計画の妥当性**
「この実装計画で進めて問題ないでしょうか？理解に間違いはありませんか？」

**ゴールの明確化**
「最終的にどのような状態になっていればタスク完了と言えるでしょうか？」

**テストケースの確認**
「どのようなテストケースを考慮すべきでしょうか？エッジケースで気をつけるべき点はありますか？」

### 2. 定期的な進捗共有

実装中も定期的（1-2日に1回程度）に進捗を共有し、方向性が間違っていないかを確認するようにしました。これにより、仮に認識のズレがあっても早期に修正できます。

## 効率的な共有を支援するツール

### Awesome Screenshot
Google Chromeの拡張機能で、画面キャプチャとその場での編集が可能です。矢印やテキストを追加できるため、視覚的に分かりやすい資料を素早く作成できます。実装予定の画面や機能を図解で説明する際に重宝しています。

こんな感じで使ってます

![Qiita用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2590850/4e51b405-b3a7-4bdc-b213-214e3f9ebcaf.png)


### Claude（ブラウザ版）
AIツールですが、PM側から開発者への要件伝達にも活用できます。デザインが固まっていない段階で、PMが「こんな感じの画面を作ってほしい」と大まかな要件をClaudeに伝えるだけで、HTMLやReactコンポーネントのプロトタイプを生成してもらえます。これを開発者と共有することで、PMの頭の中にある完成イメージを具体的かつ視覚的に伝えることができます。
実際にPMの方にも試してもらったところ、技術的な知識がなくても直感的に使えて、かなり実用的なUIを生成してくれるとのことでした。開発者としても、言葉だけの説明より格段に理解しやすくなります。


「管理画面のUI作って　必要なのはユーザー、商品、クーポンのカラムと、ログイン画面とログアウトボタン。サイドバーで移動できる感じがいいかも」


上記のプロンプトで、こんな感じのUIをすぐに作成してくれます

![qiita_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2590850/5a5d5c20-a4c0-41b6-a084-b45c7686d055.png)
![qiita_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2590850/d2f2eb1a-c1af-4490-92d5-e2ca14c8591a.png)



## まとめ：効率的な開発のために

今回の失敗から学んだ最も重要なことは、**「認識のズレをなくす作業」が開発効率に直結する**ということです。

一見すると余計な手間に思えるかもしれませんが、後戻りや手戻りのリスクを考えれば、初期段階でのコミュニケーションコストは十分に見合うものです。

特にジュニアエンジニアの方には、以下を心がけることをおすすめします：

- タスクを受け取ったら、理解した内容を必ず言語化して確認を取る
- 実装中も定期的に進捗と方向性を共有する  
- 便利なツールを活用して、視覚的で分かりやすいコミュニケーションを心がける

当たり前のことかもしれませんが、実際にできているかどうかは別問題です。私自身、この経験を通じて改めてコミュニケーションの重要性を実感しました。

皆さんも効率的で安心な開発ライフを送っていきましょう！
Azure AI Search の List Synonym Maps の API をPowerShell で実行する

# この記事の目的
公式ドキュメントにはリファレンスが記載されているが、実行するとき毎回変換する必要があるため、備忘の為、記載する

# 実行するAPI
Azure AI Search Service内のシノニム マップの一覧を返すAPIを実行する

https://learn.microsoft.com/en-us/rest/api/searchservice/synonym-maps/list?view=rest-searchservice-2024-07-01&tabs=HTTP

# 実行方法
PowerShell の Invoke-RestMethod を使用して実行する

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/invoke-restmethod?view=powershell-7.4

# 実行例

```Powershell
$key = "<api key>"
$Resource = "<Resource 名>"
$apiversion = "<REST APIのバージョン>" 
$url = "https://$Resource.search.windows.net/synonymmaps?api-version=$apiversion"
$headers = @{}
$headers["Content-Type"]  = "application/json"
$headers["api-key"] = "$key"

$response = Invoke-RestMethod -Uri $url -Method GET -Headers $headers
$response | Format-List
```

key などの取得方法はこちらを参照

https://learn.microsoft.com/en-us/azure/search/search-security-api-keys?tabs=rest-use%2Cportal-find%2Cportal-query

APIのバージョンはREST APIのリファレンスを参照

https://learn.microsoft.com/en-us/rest/api/searchservice/synonym-maps/list?view=rest-searchservice-2024-07-01&tabs=HTTP
技術ブログ｜React開発の革新！Create React AppからViteで得た快適さ

![note.：社員インタビュー (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4093365/0b1a987c-4571-4289-a56c-972d471ae5b9.png)

# はじめに

React開発者がCreateReactAppを使っていたところ、Viteに変えて快適だった話です。

# 其の一  開発サーバ起動/ビルドが速い
まずこれに尽きます。実際に測ってみると↓
開発サーバ起動:
CRA 1分10秒
Vite 4秒
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4093365/cb693f63-6105-46d5-ae7d-4a7aec973387.png)
![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4093365/a72ae96c-30e9-4a38-a43c-21241d84c1bf.png)

ビルド
CRA 2分25秒
Vite: 8秒

とんでもない差が出てしまいました。
実際開発をしていて、CRAの場合一度開発サーバを落として他の作業をするのが億劫なまであります。

# 其の二 設定の変更がしやすい
Viteの場合、プロジェクトのルートに’vite.config.js’というファイルが配置され、それを編集することで設定の変更が行えます。

一方CRAですが、設定変更のたびにnpm run ejectを行う必要があり、複雑です。

![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4093365/09841a74-e8b6-4908-805a-79693d60588d.png)

vite.config.jsの一例。このようにDockerとの連携に必要な設定も行えます。

# 其の三 フレームワークの自由性
CRAはその名のとおりReactにのみ使用ができますが、
Viteを使用していれば、Vue.jsなど他のフレームワークもサポートしているため、同じ感覚でプロジェクトの進め方が可能となります。

![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4093365/8bb27d0f-1e7e-4246-b755-8e0124a08c6e.png)


# 其の四 とどめ
CRAはもはや公式で推奨されていない
メンテナンスが止まっていることが原因のようです。
サポートがされていないということは今後も改善される余地がなく、またViteの存在に食われてしまうということになるかと思いますので、あらゆる観点からVite推しになることでしょう。

# まとめ
開発サーバをCRAで賄うとストレスがすごい
設定しやすく、柔軟で他FWでも使用可
いわゆるオワコン(サポートが終了している)

開発サーバ/ビルド速度の点のみでも十二分に採用するに値すると思いますので、CRAからの移行も検討してみる価値はあると思います。

# ふろく(CRAで動的にビルドしたファイルを読み込む)
ReactをViewファイルで読み込みながら開発する際、ビルドする度にmain.[ハッシュ値].jsやmain.[ハッシュ値].cssといった形でファイル名を指定し読み込まなければならず、煩雑でした。(npmのビルトインサーバで開発していたが、ビルド後の挙動も確認したかったため)

![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4093365/4c6d823e-97cb-4f33-bbde-7026b3e141d2.png)



# 調べてみた
どうやら/build/asset-manifest.jsonによってファイル名のハッシュ値が変わっていくようです。
以下を見てみると、files[main.css], files[main.js]にハッシュ値を含んだファイル名が書かれています。

![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4093365/1aa0b894-2c05-4c83-b5ce-645fccceb706.png)


### つまり、asset-manifest.jsonの値を参照してしまえば動的に変更できるのでは...?

$asset_manifest_path = WWW_ROOT . ’xxx/build/asset-manifest.json’;
$manifest = json_decode(file_get_contents($asset_manifest_path), true);
dumpしてみると...取れています!

![画像7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4093365/6fdbfcfb-aafc-4b45-bcc4-020c8487102c.png)

あとは連想配列にアクセスして値をlinkタグ,scriptタグに入れ込んであげるだけです。


![画像8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4093365/59fe7896-b871-48f7-a504-34e934ae8c00.png)

# 最後に
正直なところベストプラクティスであるのはViteへ鞍替えすることかと思います(Laravel+Viteで動的指定がデフォルトでサポートされている)が、CRAプロジェクトでこういうことが起きているということがわかって面白かったです。

# 安心安全のホワイト高還元SESに転職を考えている方へ
新しい挑戦に踏み出すことは、人生において重要な一歩です。
転職活動は自分自身を知り、成長する貴重な機会でもあり、夢や成長を追求するためには必要な要素の一つになるかと思います。
どんな選択をされるにせよ、その決断があなたに取って素晴らしい未来を切り開くことを願っています！
グラディートと一緒に誇れるエンジニアを目指しましょう！

■『株式会社グラディート』では受託開発・SES・ブランディングデザイン・事業コンサルティングなどを事業として行う都内のIT企業です。現在、不遇な待遇で困っているエンジニアさんは、ぜひ一度グラディートに相談してみてね！（年収査定・SESへの転職相談も承っております！）

株式会社グラディート採用情報はこちら▼
https://en-gage.net/gradito/

株式会社グラディート公式サイトはこちら▼
https://www.gradito.co.jp/
【Linux】プロセスとは

**プロセス**とは、実行中のプログラムのことです。
システムでは、常に複数のプロセスが稼働しています。
ユーザがコマンドを実行することによって、プロセスは生成され、プログラムの終了とともに消滅します。
Linuxでは、psコマンドなどを使用して、プロセスの情報を得ることができます。

実行中のプロセスを表示する主なコマンドは以下の通りです。

**表：プロセスを表示するコマンド**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/41fbbd62-5841-467c-83c6-c9ace6e4fc1c.png)
『テストの7つの原則』〜 パート④ 〜

## はじめに

現在、アプリ開発者としてプロダクトの持続的な成長や

ユーザーへのコミットに寄与するためにも、

SDLC全体を見渡して開発をすること、

および、それにはテストに関する体系的な知識が必要だと考え、

それを効率良く学べるJSTQB Foundation Levelの資格試験の勉強をしており、

そこでのインプットを記事にしたいと思います。
<br>

今回はその中でも「テストの7つの原則」の一部について

記事にしたいと思います。
<br>

なお今回は

#### 欠陥の偏在

<br>
こちらの原則について記事にしてみようと思います。

## 欠陥の偏在とは

皆さんはこんな場面に遭遇したことはありますか？
<br>

『この機能、なるはやで欲しいって言われたけど、期日めっちゃ短いやん。。。』

『この機能、レビューのリソースが殆ど無かったんだよなぁ。。。』

『この機能、他の機能と比べるとめっちゃ複雑なんだよね。。。』

『しかも作るのめっちゃムズいし。。。』

『新しく入ったAさんはまだ開発経験が浅いんだけど、全然フォロー出来てない。。。』

『ほぼ一人で作ってレビューもない。。。』

<br>
きっと何処かでこんな場面に遭われた方もいらっしゃるかも知れませんね😅

このような環境で作った機能やプロダクトには、

そうではないものと比べても欠陥が生まれやすくなることは

容易に想像出来るかと思います。
<br>

この特性のことを『**欠陥の偏在**』と言います。

## まとめ

欠陥のこのような特性を鑑みるにつけても、

実施されるテストには効率性や合理性が求められます。

現実のプロジェクトには様々な制約がつきまとうからです。。。
<br>

この制約の中で最大のパフォーマンスを発揮するためには、

チームや個々人が開発時に培ってきたノウハウ、経験値、

またはよりドメイン性の高い知識に基づいてリスク分析を行い、[^1]

よりリスクレベルが高くて優先度の高いものへテスト工数を割いていくことが

求められるものと思われます。

このリスク分析についてはまた別の機会で記事にしてみたいと思います。


## 参照

https://jstqb.jp/syllabus.html

https://book.impress.co.jp/books/1124101026

https://shiftasia.com/ja/column/2020071412000001-2/

[^1]: ここで言うリスク分析とはプロダクトリスク分析のことを指しています。
セキュリティに無関心だった自分がヒヤッとした話【WordPressセキュリティウェビナー】

https://www.pi-pe.co.jp/regist/is?SMPFORM=man-lanerf-2473a633d82734eb22aa64cad426ae23&utm_source=pup-qiita&utm_medium=contentlink&utm_campaign=/SPIRAL_internship/items/fb302ff149d4715336f3&utm_content=link-top&f000099824=https://qiita.com/SPIRAL_internship/items/fb302ff149d4715336f3

---

## はじめに
こんにちは、スパイラル株式会社のインターン生です。
今回は、「WordPress × Webフォーム：最新の脅威と守るべきセキュリティ対策」のウェビナーに参加した感想をまとめてみました。
「セキュリティ」と聞くとちょっと距離を感じていましたが、今回参加したウェビナーでは、そんなセキュリティと縁のない自分でも驚くような内容ばかりでした！

## ウェビナーの形式
今回参加したウェビナーは、「パネルディスカッション」という形式で、
スライドに沿って説明するのではなく、
登壇者の方々がテーマに沿って意見を交わすような内容でした。

## 印象に残ったこと
### 1．Webフォームが攻撃対象に
今回最も印象的だったのは、「webフォームが攻撃の入り口となっている」という話。
個人的には全くなじみのない話で驚きましたが、
**問い合わせフォーム**や**メールフォーム**などに潜む落とし穴は意外と見落としがちで、狙われやすいみたいです。
ウェビナーを受ける前の自分なら、「とりあえず動けばいい」と考えていたと思います。

### 2．プラグインの便利さの裏には
WordPressは簡単にカスタマイズができて非常に便利ですが、その裏に**プラグインの脆弱性を狙った攻撃**のリスクがあると痛感しました。
脆弱性が見つかると、開発元がアップデートを提供してくれますが、ユーザー側が更新していないとリスクにつながることもあるそうです。普段使っているものでも、油断せず定期的にアップデートすることが大切だと学びました。
また、「**何年も更新がないプラグイン**はそもそも修正されない可能性があるので、注意したほうが良い」という助言も印象に残りました。

### 3．無料の裏にある危険
Googleフォームなどの無料ツールも手軽で便利ですが、ウェビナーでは「もしサービス提供国との関係が悪化した場合、使えなくなる可能性もゼロではない」という話が出ました。
確率は低いかもしれませんが、「いつも使えていたものが突然使えなくなる」ことも想定しておくのは、大切な考え方だと思いました。

## ウェビナーの感想
パネルディスカッション形式のセミナーは今回が初めてで、最初は「知識ゼロの自分が参加して退屈しないかな...」と不安でしたが、登壇者の皆さんが例を交えながら話してくれたので、意外とすんなり内容が入ってきました。
そして今回、**リスクヘッジの重要性**を改めて痛感しました。

## さいごに
### 登壇者の裏話記事おすすめです！
今回のウェビナーに登壇された三谷さんによる裏話をゆるくまとめた記事もあります。
気になった方は、ぜひ読んでみてください！

https://qiita.com/sho-mitani/items/b9b4e998bf0a6a7e486f

### さくらインターネットさんのユーザコミュニティ
今回のウェビナー内でも紹介された、**さくらインターネット**さんの**ユーザコミュニティ**も併せてチェックしてみてください！

https://support-community.sakura.ad.jp/

---

私がインターンしているスパイラル株式会社は、ローコードプラットフォーム、SPIRAL ver.1の**トライアルアカウント**を**無償提供**しています。このアカウントの記事でも紹介するように、たくさんの機能ございます。
 
▶︎ フォーム
▶︎ 認証エリア
▶︎ ログイン
▶︎ メール送信
▶︎ カスタムプログラム
 
などの作成できますので、ぜひ試してみてください!!
 
https://www.pi-pe.co.jp/regist/is?SMPFORM=man-lanerf-2473a633d82734eb22aa64cad426ae23&utm_source=pup-qiita&utm_medium=contentlink&utm_campaign=/SPIRAL_internship/items/fb302ff149d4715336f3&utm_content=link-bottom&f000099824=https://qiita.com/SPIRAL_internship/items/fb302ff149d4715336f3
 
そして、今チームでトライアル登録者向けに、オンボーディングコンテンツを作成しています。**SPIRAL ver.1**にご興味のある方、ぜひこちらもご覧ください👇
 
https://knowledge.spirers.jp/special/detail/11680
【Linux】topコマンド

**topコマンド**は、前回の更新から現在までの間でCPU使用率（％CPU項目）の高い順に、周期的にプロセスの情報を表示するコマンドです。

更新の周期はデフォルトで3秒ですが、-dオプションで変更できます。
2秒間隔は「-d 2」、1.5秒間隔は「-d 1.5」と指定します。

表：オプション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/d4002d93-e64c-4fbb-88b1-ad9b2fe66da2.png)
🧠 日本のソフトウェア開発会社に学ぶ：構成設計と技術選定【2025年事例ベース解説】


この記事では、日本における業務アプリ・AIシステムの開発事例をベースに、使用される技術スタック・構成・課題と解決法をQiitaの技術共有スタイルで解説します。
Indo-Sakura Software Japan株式会社による実例を含み、構成のヒントや技術の比較ができる内容になっています。

⚙️ ある業務自動化システムのアーキテクチャ構成（GPT-4 + NestJS）
json
Copy
Edit
{
  "language": "TypeScript",
  "backend": "NestJS",
  "ai_provider": "OpenAI GPT-4 API",
  "auth": "Firebase Authentication",
  "db": "PostgreSQL",
  "infra": "AWS Fargate + RDS"
}
この構成により、問い合わせメールの自動返信やFAQ生成など、生成AIを組み込んだ業務自動化が実現できました。

🔗 類似構成の事例・解説：
https://indosakura.com/jp/top-software-development-companies-in-japan/

📱 モバイルアプリ導入時の技術選定：Flutter vs React Native
観点	Flutter	React Native
パフォーマンス	高速（ネイティブコンパイル）	中速（Bridge経由）
UI自由度	高	普通
社内ノウハウ	Dart必要	JavaScriptベースで習得しやすい
サンプル事例	勤怠管理アプリ	社内チャットアプリ

dart
Copy
Edit
// FlutterのAPIアクセス例
final response = await http.get(Uri.parse("https://api.example.com/data"));
🔒 Firebase Authentication + NestJS の連携例
ts
Copy
Edit
// JWT認証のGuard定義（NestJS）
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {}
ts
Copy
Edit
// FirebaseでのIDトークン検証
const decodedToken = await admin.auth().verifyIdToken(idToken);
エンタープライズ環境では、Auth0とFirebaseを使い分けて認証とRBAC管理を強化

💡 失敗から学んだTips：PostgreSQL接続エラーの対処
bash
Copy
Edit
Error: connect ECONNREFUSED 127.0.0.1:5432
原因と対処法：

.envのポート設定ミス → 再確認

Docker未起動 → docker-compose up

Prisma未初期化 → npx prisma migrate dev

📍 所在地ベースの技術パートナー探索
Indo-Sakura Software Japan株式会社のオフィス所在地（東京都品川区）は、国内外のクライアントへのアクセス性が高く、多言語対応・グローバル案件も多いです。

📍 Googleマップで確認：
https://g.co/kgs/EPkvUtq

※ Qiitaガイドラインに従い、位置情報は参考情報として記載し、商業的な誘導は行っていません。

🔧 使用技術まとめ
バックエンド：NestJS / FastAPI

フロントエンド：React / Next.js / Flutter

認証：Firebase Auth / Auth0

AI統合：OpenAI GPT / LangChain

インフラ：AWS ECS / Fargate / RDS

CI/CD：GitHub Actions + Docker + Prisma

🧠 まとめ
この記事では、日本の開発現場で実際に採用された構成例と技術選定について紹介しました。Indo-Sakura Software Japan株式会社の構成をベースに、業務アプリやAIシステムの構築に役立つ情報を共有しました。

より詳細な事例はこちら：
🔗 https://indosakura.com/jp/top-software-development-companies-in-japan/
読書記録アプリ作ってみた！

https://www.pi-pe.co.jp/regist/is?SMPFORM=man-lanerf-2473a633d82734eb22aa64cad426ae23&utm_source=pup-qiita&utm_medium=contentlink&utm_campaign=/SPIRAL_internship/items/13d8fefeb4e6c037564a&utm_content=link-top&f000099824=https://qiita.com/SPIRAL_internship/items/13d8fefeb4e6c037564a

---

# はじめに
こんにちは！スパイラル株式会社インターン生です。
今回はローコード開発ツール「SPIRAL」を使って読書記録アプリを作ってみたのでその作成方法をご紹介します！
# 背景
私は読書が好きで、スマホアプリで読書記録を付けていたんですが、どこか物足りなさを感じていました。
そこで！自分好みの読書記録アプリを作ってみようと思い立ちました！
# どんなアプリ？
今回の読書記録アプリでは、主に以下の要件を実装することにしました。
- ユーザーが登録フォームから読書記録を送信し、一覧表で確認できるようにする
- 更新フォームを設置し、登録した情報を修正できるようにする
- 集計表を使って合計ページ数、合計金額が一目で分かるようにする
# フロー図
今回のフロー図です

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4041448/481efc66-9242-4c87-aa3b-49cfd33bdff5.png)

# 作り方
- DB作成
まずはじめにDBを作成します。DB名は「読書記録DB」としました。
フィールドの構成は以下の通りです

| フィールド名   | フィールドタイプ             |
|:--------------:|:----------------------------:|
| 本のタイトル   | テキストエリア(256 bytes)    |
| 著者名         | テキストエリア(256 bytes)    |
| 出版社         | テキストエリア(256 bytes)    |
| ページ数       | 整数                         |
| ジャンル       | セレクト                     |
| 値段           | 整数                         |
| 読了日         | 日付（○年○月○日）           |
| 5段階評価      | セレクト                     |
| 一言感想       | テキストエリア(2048 bytes)   |
| 状態           | セレクト                     |
| 登録日時       | 登録日時                     |

「ジャンル」と「状態」の選択項目は以下の通りです。

ジャンル
 　小説 ノンフィクション ビジネス書 エッセイ 詩集 その他
状態
 　読みたい 進行中 読了

  
- フォーム作成

次にフォームを作成します。今回は２つのフォームを作成しました。

・登録フォーム
最初に情報を登録するフォームです
・更新フォーム
登録した情報を更新するフォームです

- 一覧表作成

フォームを作成したら一覧表を作成します。
実際の表示はこんな感じです。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4041448/90a15d85-5d99-4fcb-9954-06bdbfd4b600.png)

- 集計表作成

最後に集計表を作成します。

今回は

・ページ数集計表
集計タイプ:単純集計(合計)
軸:読了日
合計:ページ数
表示カラム:度数合計
グラフタイプ:縦棒グラフ

・金額集計表
集計タイプ:単純集計(合計)
軸:読了日
合計:値段
表示カラム:度数合計
グラフタイプ:縦棒グラフ

の2つの集計表を作成しました。

実際のページ数集計表の表示はこんな感じです。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4041448/c817f129-6aab-41cd-a093-7519f1e9a306.png)

これで作成は完了です！

 ---

▼実際に使っているシステムはここから体験できます！

 https://www.pi-pe.co.jp/regist/is?SMPFORM=man-lanerf-2473a633d82734eb22aa64cad426ae23&utm_source=pup-qiita&utm_medium=contentlink&utm_campaign=/SPIRAL_internship/items/13d8fefeb4e6c037564a&utm_content=link-middle&f000099824=https://qiita.com/SPIRAL_internship/items/13d8fefeb4e6c037564a

 ---


# 感想
実は今回初めて集計表を作成したのですが、めっちゃ便利でもっと早く使っておけばよかったと思いました。集計表のおかげで自分がどのくらい読んだのか一目で分かるのでモチベも上がります！
# まとめ
今回は読書記録アプリを作成しました。とても簡単にできるので、読書好きの方はぜひこのアプリを作ってみてください！

---
 
 
私がインターンしているスパイラル株式会社は、ローコードプラットフォーム、SPIRAL ver.1の**トライアルアカウント**を**無償提供**しています。このアカウントの記事でも紹介するように、たくさんの機能ございます。
 
▶︎ フォーム
▶︎ 認証エリア
▶︎ ログイン
▶︎ メール送信
▶︎ カスタムプログラム
 
などの作成できますので、ぜひ試してみてください!!
 
https://www.pi-pe.co.jp/regist/is?SMPFORM=man-lanerf-2473a633d82734eb22aa64cad426ae23&utm_source=pup-qiita&utm_medium=contentlink&utm_campaign=/SPIRAL_internship/items/13d8fefeb4e6c037564a&utm_content=link-bottom&f000099824=https://qiita.com/SPIRAL_internship/items/13d8fefeb4e6c037564a
 
そして、今チームでトライアル登録者向けに、オンボーディングコンテンツを作成しています。**SPIRAL ver.1**にご興味のある方、ぜひこちらもご覧ください👇
 
https://knowledge.spirers.jp/article/development/detail/11665
【備忘録】PHPのインストール中 Could not get lock /var/lib/apt/lists/lockが出た時の対処法

:::note warn
正直よくわかってないので自己責任でお願いします。
:::

削除するファイル
```bash
sudo rm /var/lib/apt/lists/lock
sudo rm /var/lib/dpkg/lock
sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/cache/apt/archives/lock
```
シェルで実行
```bash
sudo dpkg --configure -a
```

これでphpがインストールできるようになる

# 参考
https://yuki130.hatenablog.com/entry/2023/07/27/164752

https://ysuzuki19.github.io/post/ubuntu-apt-could-not-get-lock
Dockerコマンド操作マニュアル（基礎編）

## 🛠️ Dockerイメージのビルド 

コマンド build

``` bash
docker build -t <イメージ名>:<タグ名> <Dockerfileのあるディレクトリ>

# (例)
docker build -t todo_app_web:latest .
```
---

## 💬 Dockerコンテナ起動(対話モード)

コマンド run

``` bash
docker run --name <コンテナ名> -it <イメージ名>:<タグ名> /bin/bash

# (例)
docker run --name web_container -it todo_app_web:latest /bin/bash
```
 * ```docker run``` はイメージがローカルに無ければ自動pullされる  

---

## 💻 Dockerコンテナの起動(バックグラウンド)

コマンド run

``` bash
docker run --name <コンテナ名> -p <ローカルポート番号>:<Dockerポート番号> -it -d <イメージ名>:<タグ名> /bin/bash

# (例)
docker run --name web_container -p 80:9000 -it -d todo_app_web:latest /bin/bash
```

---

## 👀 Docker起動中プロセスの確認

コマンド ps

``` bash
# (例)
docker ps
```

結果
``` bash
CONTAINER ID   IMAGE          COMMAND                  CREATED       STATUS       PORTS                    NAMES
0575dab5a255   todo_app_web   "/wait-for-it.sh db:…"   2 hours ago   Up 2 hours   0.0.0.0:9000->5000/tcp   todo_app_web_1
ec944cff9f83   postgres:15    "docker-entrypoint.s…"   2 hours ago   Up 2 hours   0.0.0.0:5432->5432/tcp   todo_app_db_1

```
* ```docker ps``` は起動中コンテナのみ表示される  
→ 停止中も見たい場合は ```docker ps -a```

---

## 🚪 PostgreSQLコンテナにログイン

コマンド exec

``` bash
docker exec -it <コンテナ名> psql -U <ユーザー名> -d <データベース名>

# (例)
docker exec -it db_container psql -U your_user -d your_database
``` 


---

### ビジネス構築に使用した内容を公開

https://business-on.playground.style/

### ROI探偵事務所 3名の生成AIがビジネス課題を解決していく物語 

https://roi-blog.playground.style/
上部のハンバーガーメニューってうざくない？


最近はお客様のご提案ばかりしているぼくです。
こんにちは。

結構HTMLの初学者が最初のタイミングで実装されるのが多いハンバーガーメニューですが、もしかしたら最近悪手なのではと思う点を書いていきます。

※既存で組まれてるサイトやハンバーガーメニューの重要性に対して下げる意図はありません。その点だけご留意ください。

# 女性は手のひらが小さい

例えば美容系・アパレル系などの男女比でいう9:1くらいで女性の利用者が多いサイト
SNS・動画サイトなどコンテンツや投稿者によって変わるプラットフォームは老若男女問わず利用されますよね。

こういったサイトは利用者の潜在的なストレスを低減してあげる必要性があると思ってます。

そもそも男女の手のサイズについてこんな記事があったので紹介します。
https://sizea.jp/palm-size/#google_vignette


|手の大きさ|手長|手幅|手囲|
|---|---|---|---|
|男性平均|183.4mm|83.3mm|202.5mm|
|女性平均|169.3mm|74.40mm|179.1mm|

- 手長　手首のシワより中指の先端
- 手幅　人差し指の付け根と小指の付け根あたりの幅が広いところ
- 手囲　手幅の部分を一周

こうみると男性と女性で手長が14mmも異なることが分かります。
これはあくまで平均ですが、男性目線だけで物事を考えてはいけないという参考になるかもしれません。

# 片手が使えないから両手を使えばいいんじゃないの？ 🫖

いや片手で使える方がいいだろ。
って一蹴しちゃうと乱暴なので、色んなケースを想定してみました。

- 主婦の方が買い物かごをもってる最中（レジ待ち）
- 満員電車のつり革を握った状態
- トートバッグを抱えてる状態
- 喫煙中
- 何かを食べながら確認する時（お行儀の面はさておき）

**現代人は忙しい！聞いたかマリー！！**

これらって片手に何か、片手にスマホの状態でってシチュエーションの際、
必ずしまうのってスマホですよね？
なので、UI/UX的にはスマホは片手操作を考慮して設計してあげるべきだと思うんです。

# 大手サイトのスマホデザインの検証

とはいえ前例ってあるの？って疑問に感じるかもしれませんので、いくつか有名サービスの参考例を2つほどご紹介します。

## Netflix
![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_2028663_a4e72a9f-ea73-44a6-ab8d-a9969d5aea6f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028663/8550f3b6-e67d-40a1-b9d2-d6ff5e66b601.png)

ヘッダーには
- アカウント名
- キャストアイコン
- ダウンロードアイコン
- 検索

これらが並んでいます。

ボトムメニューには
- ホーム
- 新着＆ホット
- マイNetflix

といったメニューが並んでいて

マイNetflixを選択するとハンバーガーが表示されますが、アイコンの押下時も

![IMG_0293.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028663/556af495-8d06-414f-a869-ac1638abe53e.png)


- プロフィールの管理
- アプリ設定
- アカウント
- ヘルプ
- ログアウト

これらが表示されるようになっています。
毎日操作する必要性のないものがまとまっています。

ハンバーガーメニューを使用することが悪いことではなくて、頻繁に操作が必要なものに配置するのは良くないよね。ってのが分かると思います。

私自身あまり手が大きくないのですが、そんな私でもNetflixで動画を再生する時ってストレスフリーでコンテンツを楽しむことができます。

# 左上の検索アイコンについて

検索をする時ってどんなシチュエーションが想像できるでしょうか？

- ダラダラとページのクロールをして、なんか面白そうかも～って確認する時
- これがみたい！と目的を決めて操作するとき

どちらかで使用すると思います。
検索は後者の心理に基づいてると思っていて、この際って両手で操作するケースが多いと思います。

- ゲームをする
- テキストを書く
- 漫画を読む
- スマホ上で拡大・縮小が問われる操作（画像の細かい部分を見る）

恐らくテキストを書くケースなどがあげられるかなと思います。
Netflixで検索する時って私の場合はですが

- 左手でスマホを持つ
- 右手で検索のアイコンをタップ
- 左手でキーボード入力を行う

この3つの動作を無意識に行っています。

なので脳みそのエネルギーが少ない時はあまり使用しない動作なんですよね。
「よっしゃ検索するぞ」といったエネルギーがないと基本的に使用しないでOKな設計になってます。

## X（Twitter）

![IMG_0294.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028663/ed40894a-5166-407f-942e-d0fac8fb701f.png)

X（Twitter）もご覧の通り、ハンバーガーメニューがありません。
右下の＋ボタンで簡単にポストができるようになっていて、下部のアイコンで目的の動作がタップで簡単にできるようになっています。

## まとめ

このような形で「ユーザーに対して、繰り返し行ってほしい動作って何？」を定義してレイアウトのパターンを決めている企業やサービスが殆どなんだなということが分かります。

当然ながら、上部にハンバーガーメニューがあっても違和感はないですが「当たり前を見直す」といった形でプロダクトのデザインをご提案していきたいと思っております。
※提案してくれ！って企業さんがいたらぜひともご連絡、お待ちしています！！

なお弊社のサイトはハンバーガーメニューを実装していますので、直したいなという所存です。
手が回らなくて誠にごめんなさいでした。



---
オブジェクティブグループでは X の投稿も平日毎日行っています！
IT 関連の小ネタや便利技から、日常のアニメ・ゲーム布教なども幅広く投稿してるので、
ご興味のある方は是非フォロー・いいねをお願いします。

https://x.com/obg_ocr
【React初心者メモ】論理否定演算子（!）/ ダブルバン（!!）

# 論理否定演算子（!）
値の「真偽（truthy / falsy）を反転する」演算子です。

``` !value ```
value が truthy → false
value が falsy → true

なぜ上記のように動くかと言うと、!は以下のように動作しています。
1. value を boolean に強制変換する（truthy → true, falsy → false）
2. その論理値を反転する（NOT）

# ダブルバン（!!）
booleanに強制変換するために使われる演算子です。

``` !!value ```
value が truthy → true
value が falsy → false

なぜ上記のように動くかと言うと、!!は以下のように動作しています。
1. value を boolean に強制変換する（truthy → true, falsy → false）
2. その論理値を反転する（NOT）
3. その論理値を更に反転する（NOT) = 元に戻る
結果として、「Boolean としての真偽値を得る」ために使われます。
【Ubuntu】20.04LTSから22.04LTSにアップデート中エラーが起きた話

こういうエラー
```bash
E:Failed to fetch https://packages.sury.org/php/dists/focal/InRelease
418 I'm a teapot [IP: 151.101.195.52 443], E:The repository
'https://packages.sury.org/php focal InRelease' is not signed.
```
GPT君に聞くと
「sury-php.listの中身コメントアウトか削除すればいいよ！」
とのことだったので、その通りにしたら解消しました

```bash
/etc/apt/sources.list.d$ sudo vi sury-php.list
```
中身をコメントアウト
SwiftのUserDefaultsとは？使い方を簡単に説明してみた！

UserDefaultsとは？
---
UserDefaults（ユーザーデフォルト）とは、アプリ内で「ちょっとしたデータ」を保存しておける仕組みです。

たとえば以下のようなデータの保存に使えます！：

- ログイン状態

- 最後に開いた画面

- ユーザーが入力した名前や年齢　など

簡単に言うと、メモ帳のように、アプリ内でデータを保存して次に使えるようにするものです。

保存できるデータの種類
--
UserDefaultsには以下のような基本的な型を保存できます：

- Bool

- Int

- Double

- String

- Date

- Array

データを保存する方法（set）
--
```swift
UserDefaults.standard.set(true, forKey: "isLoggedIn")
UserDefaults.standard.set("山田太郎", forKey: "userName")
UserDefaults.standard.set(25, forKey: "userAge")
```
set(_:forKey:)で保存できます。forKeyは保存するときの名前だと思ってください!

データを読み込む方法（get）
---
```swift
let isLoggedIn = UserDefaults.standard.bool(forKey: "isLoggedIn")
let userName = UserDefaults.standard.string(forKey: "userName")
let userAge = UserDefaults.standard.integer(forKey: "userAge")
```
保存したキーと同じ名前で取り出します。

注意点
--
大きなデータ（画像、動画など）には向いてないです！toDO listアプリやメモ帳のアプリが適してます！

まとめ
---

| 機能 | メソッド                                          |
| ---- | --------------------------------------------- |
| 保存   | `UserDefaults.standard.set(value, forKey:)`   |
| 読み込み | `UserDefaults.standard.〇〇(forKey:)`           |


最後に
--
UserDefaultsは、アプリ開発の中でよく使う基本的な仕組みです!
小さな設定や一時的なデータの保存にとても便利なので、ぜひ参考にしてください！🤌