シェルスクリプトマガジン

test

作りながら学ぶVue.js入門(Vol.100掲載)

投稿日:2026.01.25 | カテゴリー: コード

著者:大津 真

JavaScriptフレームワークの中でも、学びやすさと柔軟さで人気を集めている「Vue.js」。本連載では、Vue.jsの基礎から実践的な使い方までを、分かりやすく丁寧に解説していきます。一緒にフロントエンド開発の楽しさを体験してみましょう。第5回では、v-modelディレクティブによる双方向データバインディングと、計算結果をプロパティとして返す算出プロパティについて説明します。

シェルスクリプトマガジン Vol.100は以下のリンク先でご購入できます。

図1 「v-model1/src/App.vue」ファイルのコード

<script setup>
import { ref } from 'vue'

// refでリアクティブな変数を定義
const message = ref('こんにちは')   ←①
</script>

<template>
  <div>
    <h2>Composition APIでv-modelのテスト</h2>
    <!-- v-modelを使って入力値とリアクティブ変数を同期 -->
    <input v-model="message" placeholder="入力してみてください" />  ←②
    <button @click="message = ''">クリア</button> ←③
    <p>入力されたメッセージ: {{ message }}</p>  ←④
  </div>
</template>

図5 v-modelディレクティブを使う場合と使わない場合のコードの比較

■v-modelディレクティブを使う場合
<input v-model="message" placeholder="入力してみてください" />

■v-modelディレクティブを使わない場合
<input
  v-bind:value="message"
  v-on:input="message = $event.target.value"
  placeholder="入力してみてください"
/>

図6 「kaibun1/src/App.vue」ファイルのコード

<template>
  <div>
    <h2>入力した文字列が回文かどうかを判断</h2>
    <input v-model="message" placeholder="たけやぶやけた" />
    <button @click="checkKaibun">判定</button>
    <button @click="clearInput">クリア</button>
    <p>入力されたメッセージ: {{ message }}</p>
    <p>{{ result }}</p>
  </div>
</template>
<script setup>
import { ref } from 'vue'

const message = ref('')
const result = ref('') // 判定結果を表示する文字列
// 回文判定関数(ボタンを押したときに実行)
function checkKaibun() { 
  if (!message.value) {
    result.value = '文字を入力してください。'
    return
  }
  // 文字列を反転して比較
  const reversed = message.value.split('').reverse().join('') 
  if (message.value === reversed) { 
    result.value = '✅ 回文です!'
  } else {
    result.value = '❌ 回文ではありません。'
  }
}
// 入力クリア
function clearInput() {
  message.value = ''
  result.value = ''
}
</script>

図10 「computed-prop1/src/App.vue」ファイルのコード

<template>
  <div>
    <h2>算出プロパティなし(直接式)</h2>
    <input v-model="firstName" placeholder="名" />  ←①
    <input v-model="lastName" placeholder="姓" /> ←②
    <!-- マスタッシュ構文に直接式を書く -->
    <p>フルネーム:{{ firstName + ' ' + lastName }}</p> ←③
  </div>
</template>
<script setup>
import { ref } from 'vue'

const firstName = ref('')
const lastName = ref('')
</script>

図11 「computed-prop2/src/App.vue」ファイルのコード

<template>
  <div>
    <h2>算出プロパティ(computed)を使って整理</h2>
    <input v-model="firstName" placeholder="名" />
    <input v-model="lastName" placeholder="姓" />
    <!-- シンプルに変数名として使用 -->
    <p>フルネーム:{{ fullName }}</p>
  </div>
</template>
<script setup>
import { ref, computed } from 'vue'

const firstName = ref('')
const lastName = ref('')
const fullName = computed(() => {
  return ${firstName.value} ${lastName.value}
})
</script>

図12 「computed-prop3/src/App.vue」ファイルのコード

<template>
  <div>
    <h2>computedの代わりに関数で定義する</h2>
    <input v-model="firstName" placeholder="名" />
    <input v-model="lastName" placeholder="姓" />
    <!-- 関数を実行して結果を表示 -->
    <p>フルネーム:{{ fullName() }}</p> 
</template>
<script setup>
import { ref } from 'vue'

const firstName = ref('')
const lastName = ref('')
// 関数でフルネームを返す
function fullName() {
  return ${firstName.value} ${lastName.value}
}
</script>

図13 「computed-prop4/src/App.vue」ファイルのコード

<template>
  <div>
    <h2>算出プロパティと関数の更新タイミング</h2>
    <input v-model="msg" placeholder="メッセージ" />
    <p>メッセージ:{{ msg }}</p>
    <p>日時(算出プロパティ):{{ getDate_prop }}</p>
    <p>日時(関数):{{ getDate_func() }}</p>
  </div>
</template>
<script setup>
import { ref, computed} from 'vue'

const msg = ref('')
// 算出プロパティは依存するデータが変わったときだけ再評価される
const getDate_prop = computed(() => {
  // var msgVal = msg.value
  return new Date().toLocaleString()
})
// 関数は呼び出されるたびに実行される
function getDate_func() {
  return new Date().toLocaleString()
}
</script>

図17 「reiwa1/src/App.vue」ファイルのコード

<template>
  <div>
    <h2>令和 ⇄ 西暦 相互変換</h2>
    <div>
      <label>令和:</label>
      <input type="number" v-model.number="reiwa" placeholder="例:5" /> 
    </div>
    <div>
      <label>西暦:</label>
      <input type="number" v-model.number="seireki" placeholder="例:2023" />
    </div>
  </div>
</template>
<script setup>
import { ref, computed } from 'vue'

// 算出プロパティの実体となる内部の値
const reiwaValue = ref(null)
const seirekiValue = ref(null)
// 算出プロパティreiwa
const reiwa = computed({
  get() {
    return reiwaValue.value
  },
  set(value) {
    reiwaValue.value = value
    if (value > 0) {
      seirekiValue.value = 2018 + value
    } else {
      seirekiValue.value = null
    }
  }
})
// 算出プロパティseireki
const seireki = computed({
  get() {
    return seirekiValue.value
  },
  set(value) {
    seirekiValue.value = value
    if (value >= 2019) {
      reiwaValue.value = value - 2018
    } else {
      reiwaValue.value = null
    }
  }
})
</script>

Pythonあれこれ(Vol.100掲載)

投稿日:2026.01.25 | カテゴリー: コード

著者:飯尾 淳

本連載では「Pythonを昔から使っているものの、それほど使いこなしてはいない」という筆者が、いろいろな日常業務をPythonで処理することで、立派な「蛇使い」に育つことを目指します。その過程を温かく見守ってください。皆さんと共に勉強していきましょう。第30回では、筆者らが実施している、異文化間交流を体験する国際プロジェクトの評価アンケートを対象に、回答状況を分析してみます。

シェルスクリプトマガジン Vol.100は以下のリンク先でご購入できます。

図4 NPSを計算するコード

promoters = df[df['Evaluation'] >= 9].shape[0]
detractors = df[df['Evaluation'] <= 6].shape[0]
total_respondents = df.shape[0]
promoter_percentage = (promoters / total_respondents) * 100
detractor_percentage = (detractors / total_respondents) * 100
nps = promoter_percentage - detractor_percentage
print(f"NPS: {nps:.1f}")

図5 NPS計算用のnps()関数を定義するコード

def nps(df):
  promoters = df[df['Evaluation'] >= 9].shape[0]
  detractors = df[df['Evaluation'] <= 6].shape[0]
  total_respondents = df.shape[0]

  promoter_percentage = (promoters / total_respondents) * 100
  detractor_percentage = (detractors / total_respondents) * 100
  return promoter_percentage - detractor_percentage

図6 感情分析をするコード

from transformers import AutoModelForSequenceClassification, \
                         AutoTokenizer, pipeline

model_name = "llm-book/bert-base-japanese-v3-marc_ja"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
cls = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer)
text = "迷子の子豚ちゃん。あなたの家はどこですか?"
print(cls(text))

図7 文単位に感情分析をするコード

df[‘NegaPosi’] \
= df[‘Comments(JP)’] \
.apply(lambda x: [cls(y)[0][‘label’] \
for y in x.strip().split(‘。’) if y != “”] \
if isinstance(x, str) else [])
df

図8 ネガティブな文を含むコメントを抽出するコード

for row in df[df['NegaPosi'] \
             .apply(lambda x: 'negative' in x)].iterrows():
  comments = [x for x in row[1]['Comments(JP)'].strip().split('。') \
              if x != ""]
  negaposi = row[1]['NegaPosi']
  for i in range(len(comments)):
    print(f"{negaposi[i]}: {comments[i]}")
  print()

図10 コメントの長さを国別に集計するコード

df['CommentsLength'] \
  = df[df['ST'].str.contains('Student')]['Comments(JP)'] \
      .apply(lambda x: len(x) if isinstance(x, str) else None)
df[['Country', 'CommentsLength']].groupby('Country') \
  .mean().sort_values('CommentsLength', ascending=False)

Generative AIコンパス(Vol.100掲載)

投稿日:2026.01.25 | カテゴリー: コード

著者:為藤 アキラ

AI技術の進化は、社会や産業のあり方を大きく変えつつあります。本連載では、国内外の最新動向や実践的な技術トピックを、日本の現場視点も交えながら分かりやすく解説します。執筆は、産学連携で生成AI活用を推進するGenerative AI Japan(略称:GenAI)のメンバーが担当します。第2回では、生成
AIと人間の役割分担を3段階の自動化レベルで整理し、HITL(Human-in-the-Loop)を前提とした改善サイクルの回し方を解説します。

シェルスクリプトマガジン Vol.100は以下のリンク先でご購入できます。

図4 自動化レベル1用のプロンプト例(ドラフト作成+自己チェック)

あなたは営業担当者のライティングアシスタントです。
以下の条件でメールの下書きを作成してください。

### 入力情報
- 送信先:{{会社名}} {{担当者名}}様
- 目的:{{目的(例:新規サービスのご案内)}}
- 背景:{{相手との関係性や直近のやり取り}}
- 伝えたい要点:{{箇条書きで3つ程度}}
- トーン:{{フォーマル / ビジネスカジュアル / カジュアル}}

### 出力形式
1. 件名(3パターン)
2. 本文(300字程度)
3. 自己チェック
   - 事実確認が必要な箇所
   - トーンの違和感がある箇所
   - 根拠が曖昧な表現

自己チェックでは、人間が特に注意して確認すべき箇所を明示してください。

図6 自動化レベル2用のプロンプト例(条件付き承認フロー)

あなたはカスタマーサポートの振り分けAIです。
以下の問い合わせを分析し、対応方針を判定してください。

### 問い合わせ内容
{{問い合わせ本文}}

### 判定してほしいこと
1. カテゴリ分類
   - 契約・請求 / 技術サポート / クレーム / 一般問い合わせ / その他

2. 緊急度スコア(1-5)
- 5:即時対応必須(サービス停止、重大なクレーム)
- 4:当日対応推奨
- 3:翌営業日対応可
- 2:週内対応可
- 1:定型回答で完結可能

3. 自動対応可否
- YES:FAQ/定型文で対応可能 → 推奨回答文を生成
- NO:有人対応が必要 → エスカレーション理由を明記

4. 判定根拠
- なぜこのカテゴリ・スコアにしたか(2-3行)

### 出力形式(JSON)
{
  "category": "...",
  "urgency_score": 3,
  "auto_response": true,
  "suggested_reply": "...",
  "escalation_reason": null,
  "reasoning": "..."
}

図8 自動化レベル3用のプロンプト例(自律実行の監視レポート)

あなたは在庫管理AIです。
以下の在庫状況を確認し、発注が必要か判断してください。

### 在庫データ
| 商品名 | 現在庫 | 安全在庫 | 平均消費/日 | リードタイム |
|--------|--------|----------|-------------|--------------|
| {{商品A}} | 50個 | 100個 | 20個 | 3日 |
| {{商品B}} | 200個 | 80個 | 10個 | 5日 |

### 発注ルール
- 現在庫 < 安全在庫 → 自動発注
- 現在庫 < (平均消費 × リードタイム × 1.5) → 自動発注
- 上記以外 → 発注不要

### 出力
1. 判定結果:発注する / 発注しない
2. 発注内容:商品名、数量、発注先
3. 判断理由:なぜこの数量にしたか(1-2行)
4. 異常フラグ:通常と異なる点があればYES

### 注意
- 発注金額が10万円を超える場合 → 実行せず「要承認」と出力
- 過去30日で同商品を3回以上発注済み → 「要確認」と出力

レポート2(Vol.100掲載)

投稿日:2026.01.25 | カテゴリー: コード

著者:末安 泰三

米Microsoft社は2026年1月8日、コードエディタ「Virtual Studio Code」(以下、VS Code)のバージョン1.108を公開した。同版の大きな特徴は、AIエージェントに業務知識やワークフローを伝える標準的な仕組みの「Agent Skills」に対応したことである。

シェルスクリプトマガジン Vol.100は以下のリンク先でご購入できます。

図1 「SKILL.md」ファイルに記述する設定の例

---
name: summarize-file
description: テキストファイルを読み取り、短く要約します。
---

ファイルの要約を求められた場合は、以下を実施してください。

- ファイルを **読み取り専用** で読む
- 3〜5行程度の短い要約を書く
- ファイルを変更しない

Safety:
- このスキルは読み取り専用であり、ファイルの編集・削除・上書きをしてはいけません。

シェルスクリプトマガジンvol.100 Web掲載記事まとめ

投稿日:2026.01.25 | カテゴリー: コード


004 レポート Open Source Summit Japan開催
005 レポート Agent Skills対応VSCode コード掲載
006 製品レビュー スマートカメラ「GH-SMCC-WH」
007 NEWS FLASH
008 特集1 シェルワンライナー100選/麻生二郎
018 特集2 Claude Codeの始め方/しょっさん
024 特別企画 「さくらのAI Engine」で始める生成AI APIプログラミング/前佛雅人
031 インタビュー テイラー 柴田 陽氏
032 特別企画 クラウドPBXのZoom Phone/坂井悠樹、福本勝功
042 Generative AIコンパス by GenAI(ジェナイ)/為藤アキラ コード掲載
048 ARM/RISC-V搭載コンピュータボード/米田聡
052 Pythonあれこれ/飯尾淳 コード掲載
058 作りながら学ぶVue.js入門/大津真 コード掲載
066 知っておきたいシェル関連技術/麻生二郎
072 Techパズル/gori.sh
073 コラム「SEユニケージ」/シェル魔人

Vol.100

投稿日:2026.01.25 | カテゴリー: バックナンバー

 Linuxでは、コマンドをパイプ(|)などでつなぐことで、単体では実現できない処理を1行で実行できます。こうした「ワンライナー」を使いこなすことで、端末操作の自由度が大きく広がり、日々の作業効率も向上します。
特集1では、このワンライナーを実務で活かすために、10分野に分けて100本紹介します。ファイルシステム、プロセス監視、ネットワーク管理、ログ解析、セキュリティ、バックアップ、テキスト操作、ネットワーク診断、システム情報、計算・日時処理など、サーバー運用の現場で頻出する領域を幅広くカバーしています。
 一方、開発の現場では生成AIの活用が急速に進み、プログラムコーディングを支援するツールが続々と登場しています。特に近年は、コマンドラインで利用できるAIコーディング支援ツールも増え、AIが開発を支える時代が目前に迫っています。特集2では、その代表的な存在である「Claude Code」の始め方を分かりやすく紹介します。
 さらに特別企画では、生成AIを活用したサービスや、最新のクラウド基盤にも注目します。1本目では、さくらインターネットが提供するフルマネージド生成AIサービス「さくらのAI Engine」を取り上げ、サービスの概要とAPIを使ったプログラミングの基本を解説します。
 続く2本目では、企業の電話基盤として長く利用されてきたPBXのクラウド移行に焦点を当て、AIを搭載したクラウドPBX「Zoom Phone」を紹介します。従来型PBXとの違い、導入メリット、クラウド化による運用負荷の軽減、AIによる通話支援など、これからのビジネスコミュニケーションを支える新しい電話基盤の特徴を踏まえて解説します。
 読み応え十分のシェルスクリプトマガジン Vol.100。最終号ではありますが、いつも通りの充実した内容をお届けします。どうぞゆっくりお楽しみください。

※記事掲載のコードはこちら。記事の補足情報はこちら

※読者アンケートはこちら

Vol.100 補足情報

投稿日:2026.01.20 | カテゴリー: コード

連載 作りながら学ぶVue.js入門

記事で紹介したサンプルコードの完全版と、その実行方法を記したMarkdown文書をまとめたZIPファイルは、ここからダウンロードできます。

情報は随時更新致します。

【インタビュー】AIによるソフトウエアテスト自動化基盤を提供するグローバル企業 米Autify社

投稿日:2026.01.9 | カテゴリー: 記事

 米Autify社は、AIを活用したソフトウエアテスト自動化基盤を提供する、日本人創業のグローバル企業です。2016年に米国サンフランシスコで創業し、2019年頃からソフトウエアテストの非効率性というIT業界共通の課題解決に取り組んでいます。創業メンバーは日本人を中心とし、現在は米国と日本の両拠点で事業を展開しています。金融系や保険系など、ミッションクリティカルな大規模アプリケーションを持つ大手企業を含む、国内外の多くの採用事例があります。
 今回、Autify社 CEO/共同創業者の近澤 良氏(図1)に事業内容や創業の経緯、製品ラインナップ、日本と海外との違い、そしてテスト自動化やAIの未来について話を聞きました(聞き手は麻生)。

図1 米Autify社 CEO/共同創業者の近澤 良氏

――事業内容と、創業の経緯について教えてください。
 我々は、AIを使ってソフトウエアテストを自動化・効率化する事業を展開しています。会社自体は2016年に創業しましたが、当初は今とは異なる事業を行っていました。転機となったのは2018年、サンフランシスコのAlchemist Accelerator社によるシードアクセラレータ(早期に事業を立ち上げる支援プログラム)に日本人として初めて参加したことです。
 私自身、エンジニアとして日本、シンガポール、アメリカの3カ国で10年以上開発に携わってきました。テストはどこでも非常に大変な作業でした。そんな中、米Gartner社のレポートで「開発チームにAIデベロッパが加わる時代が来る」という予測を目にし、テストは必ずAIで代替されると確信しました。そして2019年に現在の事業を開始し、順調に成長を続けています。

――具体的な製品ラインナップと、それぞれの特徴を教えてください。
 主に「Autify Nexus」「Autify Genesis」、そしてAIエージェント機能を展開しています。
 Autify Nexus は、Autify社の現行主力製品であり、Webアプリケーションテストをノーコードで自動化する「Autify NoCode Web」の後継に位置づけられています。米 Microsoft 社が開発したオープンソースのテスト自動化フレームワーク「Playwright」を基盤としており、自然言語でAIエージェントに指示するだけでテストシナリオを生成できます。
 ノーコード操作にも対応し、ユーザーインタフェースの変更によるテストの破綻を抑える仕組みを備えることで、テストメンテナンスの負荷を大幅に軽減します。特に、オープンソースの柔軟性を活かしつつ、コード記述の煩雑さをAIが解消する点も高く評価されています。
 Autify Genesisは、仕様書を読み込んで内容や意図を理解し、テストケースやテストシナリオを自動生成するAIです。
 AIエージェント機能は、最終的には人がコードを書く必要すらなくなり、100台のAIエージェントが代わりにテストを実行し、バグを分析する未来を目指しています。

――日本と海外でのテスト自動化への意識に差はありますか。
 非常に大きな差があります。北米は金融機関であっても自社で自動化スクリプトを回すのが当たり前で、非常に進んでいます。
 一方、日本は依然としてベンダー依存が強く、自動化にたどり着いていない企業がほとんどです。しかし、開発コストの半分をテストに費やしている現状に、多くの企業が課題を感じています。我々は、ツールとプロフェッショナルサービスの両面から、この50%のコストをAIで効率化し、開発スピードを加速させる支援をしています。

――今後、ソフトウエア開発におけるテストの役割はどう変わっていくのでしょうか。
 将来的には、仕様とテストを書けば開発は終了という世界になるでしょう。AIがコードを生成するようになると、その成果物が正しいかどうかを判断する受け入れ要件の重要性がこれまで以上に高まります。人が実装の細かいコードを見る必要はなくなり、AIにどのような指示を出し、どのテストが通ればOKとするかという上流工程に集約されていくはずです。

――AIに期待すること、あるいは現在のAIの限界について教えてください。
 AIの精度や扱える情報量は日々向上しています。一方で、プロンプトに必ずしも従わないといった確率的な振る舞いは依然として課題です。現場では、AIにルールを繰り返し想起させるなどの工夫で対応しています。将来的には、AIが仕様を完全に理解し、自律的に動作するプラットフォームへと進化させていきたいと考えています。

  • shell-mag ブログの 2026年1月 のアーカイブを表示しています。

  • -->