屋外タブレットアプリ開発



aaa

屋外でタブレットで使うアプリの開発を考えています。ios系かandroid系かはまだ決めていません。開発するフレームワーク・言語は何がいいでしょう?RubyOnRailsやSpringBootなどのweb系が得意なのですが、屋外でネットワークがつながらない場合もあり、どうしようか迷っています

屋外利用を想定したタブレットアプリの開発ということで、いくつかの観点からフレームワーク・言語の選択を整理してみましょう。
特にネットワークが不安定または不通になる可能性がある点が重要です。


🔍前提条件を整理

✅ 推奨される選択肢

① Flutter(Dart)

② React Native(JavaScript/TypeScript)

③ Kotlin Multiplatform Mobile(KMM)

💡Web系の得意分野を活かすなら?

🟡 PWA(Progressive Web Apps)は要注意

🔧 おすすめ技術構成の例(Flutterの場合)

📌結論


技術スタック例やサンプル構成図を見せてください

ここでは「Flutter + Rails(またはSpring Boot)」の技術スタックを中心に、オフライン対応タブレットアプリの構成例をわかりやすくご紹介します。


✅ 技術スタック例:Flutter × Rails(または Spring Boot)

レイヤー技術説明
UI(アプリ)Flutter (Dart)iOS / Android 両対応のクロスプラットフォーム
状態管理Riverpod / Bloc / Providerアプリ内状態を安全に管理
ローカルDBHive(簡単) / Drift(SQLite)オフライン保存用DB
データ同期REST API(Rails/Spring Boot)オンライン時に差分同期
バックエンドRuby on Rails / Spring Boot楽にAPI開発・認証・DB操作
データベースPostgreSQL / MySQLサーバー側の永続DB
認証Firebase Auth / Devise / Spring Securityオフライン用トークン管理なども
通信層Dio(FlutterのHTTPクライアント)API通信・エラーハンドリング

🧭 システム構成図(サンプル)

以下は、基本的なオフラインファースト構成図のイメージです。

scss

┌────────────┐ オフライン時 ┌──────────────┐

│ Flutter App│◀──────────────┬────▶│ ローカルDB │

│ (タブレット)│ │ │(Hiveなど) │

└────┬───────┘ │ └──────────────┘

│ オンライン時 │

▼ │

┌────────────┐ REST API ┌──────────────┐

│ Rails API │◀──────────────────▶│ PostgreSQL DB │

│(またはSpring)│ └──────────────┘

└────────────┘


🔁 データ同期の流れ


✨ 特に検討すべき設計ポイント


💡補足:Spring Bootで開発する場合


簡単なFlutterコードサンプル(Hiveとの連携など)や、Rails APIサンプルを見せてください

もちろんです!

ここでは、まず以下の2つをセットで紹介します:


✅ ① Flutter + Hive の簡単な連携コード(ローカルDB保存・取得)

HiveはFlutter向けの軽量なローカルNoSQLデータベースです。ネットワークが使えない場面でもサクサク動作します。

🔹ステップ1:依存パッケージを追加(pubspec.yaml)

dependencies:
  flutter:
    sdk: flutter
  hive: ^2.2.3
  hive_flutter: ^1.1.0
  path_provider: ^2.0.14

🔹ステップ2:初期化(main.dart)

import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:path_provider/path_provider.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final dir = await getApplicationDocumentsDirectory();
  await Hive.initFlutter(dir.path);
  await Hive.openBox('offlineData');
  runApp(MyApp());
}

🔹ステップ3:保存・取得(例:簡単なメモ保存)

class MyApp extends StatelessWidget {
  final Box box = Hive.box('offlineData');

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("Hiveメモアプリ")),
        body: Center(
          child: Column(
            children: [
              ElevatedButton(
                onPressed: () {
                  box.put('message', 'こんにちは、オフラインデータ!');
                },
                child: Text("保存"),
              ),
              ElevatedButton(
                onPressed: () {
                  String? message = box.get('message');
                  print("取得したデータ: $message");
                },
                child: Text("取得"),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

✅ ② Rails API の簡単なサンプル(データ送信・取得用)

🔹モデル生成(例:メモ)

rails new offline_api --api
cd offline_api
rails g scaffold Memo title:string content:text synced:boolean
rails db:migrate

🔹CORS設定(config/initializers/cors.rb)

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '*'  # 本番では制限してください
    resource '*', headers: :any, methods: [:get, :post, :patch, :put, :delete]
  end
end
 

🔹例:POSTでメモを受け取る

curl -X POST http://localhost:3000/memos \
  -H "Content-Type: application/json" \
  -d '{"memo": {"title": "外出先メモ", "content": "これはオフラインで作成されたメモです", "synced": false}}'

🔹同期済みに更新

curl -X PATCH http://localhost:3000/memos/1 \
  -H "Content-Type: application/json" \
  -d '{"memo": {"synced": true}}'

🔄 FlutterアプリとRails APIの同期ロジック概要


springbootでの

ありがとうございます!

今度は Spring Boot での API サンプル をご紹介します。

Flutter などのクライアントと連携し、オフライン時に溜めたデータを オンライン復帰時に同期する前提の REST API サンプルです。

✅ Spring Boot + REST API 簡易サンプル(メモアプリ)

ここでは「メモを保存・取得・更新」できる REST API を作成します。


🔹 1. プロジェクト作成(Spring Initializr)


🔹 2. エンティティ作成(Memo.java)

package com.example.demo.entity;

import jakarta.persistence.*;
import lombok.Data;

@Entity
@Data
public class Memo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;
    private String content;

    private boolean synced;  // オフライン→オンライン後の同期管理用
}

🔹 3. リポジトリ(MemoRepository.java)

package com.example.demo.repository;

import com.example.demo.entity.Memo;
import org.springframework.data.jpa.repository.JpaRepository;

public interface MemoRepository extends JpaRepository {
}

🔹 4. コントローラー(MemoController.java)

package com.example.demo.controller;

import com.example.demo.entity.Memo;
import com.example.demo.repository.MemoRepository;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/memos")
@CrossOrigin(origins = "*")  // Flutterなど他ドメインとの通信用
public class MemoController {

    private final MemoRepository memoRepo;

    public MemoController(MemoRepository memoRepo) {
        this.memoRepo = memoRepo;
    }

    @GetMapping
    public List getAll() {
        return memoRepo.findAll();
    }

    @PostMapping
    public Memo create(@RequestBody Memo memo) {
        return memoRepo.save(memo);
    }

    @PutMapping("/{id}")
    public Memo update(@PathVariable Long id, @RequestBody Memo updatedMemo) {
        Memo memo = memoRepo.findById(id).orElseThrow();
        memo.setTitle(updatedMemo.getTitle());
        memo.setContent(updatedMemo.getContent());
        memo.setSynced(updatedMemo.isSynced());
        return memoRepo.save(memo);
    }
}

🔹 5. アプリ起動後の確認方法

ターミナルや Postman で:

✅ POST(メモ作成)

curl -X POST http://localhost:8080/api/memos \
  -H "Content-Type: application/json" \
  -d '{"title":"外出メモ", "content":"Flutterから送信", "synced":false}'

✅ GET(メモ取得)

curl http://localhost:8080/api/memos

✅ PUT(メモ更新)

curl -X PUT http://localhost:8080/api/memos/1 \
  -H "Content-Type: application/json" \
  -d '{"title":"更新済メモ", "content":"同期完了", "synced":true}'

💡 Flutterとの同期設計例

処理実装方法例
オフライン保存Hive に synced: false として保存
オンライン時の送信synced == false のデータだけPOST
サーバー側保存Spring Boot の /api/memos
同期完了のローカル更新synced: true にしてHive上書き
これで、FlutterアプリとSpring Boot APIの連携ベースが完成します!

より本格的にするなら、認証(Spring Security + JWT)や、差分ID管理なども追加できますので、必要であればぜひお声がけください 😊


Flutterの学習方法のおすすめは?

いい質問ですね!

Flutterは比較的新しく、習得しやすいUIフレームワークですが、初学者は「Dartの文法」「Widgetの考え方」「状態管理」などに最初戸惑うこともあります。

ここでは、独学しやすく、実践に結びつきやすい Flutter の学習ステップを段階的に紹介します。


✅ Flutter学習のおすすめステップ

🔰 Step 1:Dart言語の基本をおさえる

📚 おすすめ教材


🔧 Step 2:Flutter の基本構造を理解する

🌐 公式教材


🛠 Step 3:実践アプリを作ってみる

💡 初心者向けアプリ例


📘 おすすめ書籍

📖『Flutterで始めるモバイルアプリ開発』技術評論社(入門に最適)

📖『Flutter & Dart 開発レシピ』(実用的なレシピ集)


🔄 Step 4:状態管理やデータベースにステップアップ

ローカルDB


💬 Flutter コミュニティ参加もおすすめ!


🌟 おすすめ勉強法まとめ

レベルやることツール / サイト
初級Dart文法 + UI構築Dart公式 / YouTube / ドットインストール
中級状態管理 + API通信 + DBFlutter公式 / Riverpod / Hive
上級認証 + 非同期 + マルチプラットフォーム展開Firebase / GitHub連携 / CI/CD

フロントですが、htmlが得意なので、軽量のサーバをクライアントで動かしてWEBアプリをクライアントで動かすようなことはできませんか

めっちゃ良い着眼点ですね!

「HTMLが得意で、できればFlutterなどを覚える前に、自分の強み(HTML/CSS/JS)を活かしたい」

そして「軽量なサーバをクライアント端末で動かし、WEBアプリとして使いたい」という方向性、実は一定の方法があります!


✅ 結論:「ローカルWebサーバ + Webアプリ」構成は可能

つまりこういうことですね:


📱 タブレット端末(iOS or Android)
    └── 軽量Webサーバ(例:Node.js, Python, Ktorなど)
         └── HTML/JS/CSSで作られたWebアプリを配信

ただし、モバイル端末上でローカルサーバを動かすにはいくつかの課題と工夫が必要です。


🔧 方法①:PWA(Progressive Web App)

✔ おすすめ度:★★★(サーバレスでHTML活用したい方向け)

✅ 利点

📚 リファレンス


🔧 方法②:Termux + Node.js(Androidのみ)

✔ おすすめ度:★★(エンジニア寄り向け、実験的)

✅ 利点

⚠ 注意点


🔧 方法③:WebViewを使ってローカルHTMLを読み込む

✔ おすすめ度:★★★(マイルドなアプローチ)


✅ 実装例(Android Kotlin)

val webView = findViewById(R.id.webview)
webView.settings.javaScriptEnabled = true
webView.loadUrl("file:///android_asset/index.html")

✅ iOSでも同様に可能(WKWebView)

🌟 一番おすすめは?

方法iOS対応Android対応HTML活用度難易度
PWA
Termux + Node.js×中〜高
WebView内ローカルHTML

📌 結論


PWAでオフライン対応メモ帳を作る方法を教えてください

いいですね!💡

「PWAでオフライン対応メモ帳」は、HTML/CSS/JSだけでできるシンプルかつ実用的なプロジェクトです。

以下に、ステップごとにやさしく解説していきます!

✅ 目指すゴール

📁 ディレクトリ構成(最小限)

/pwa-memo/
├── index.html
├── style.css
├── app.js
├── manifest.json
└── service-worker.js

🧱 ステップ①:HTML + CSS + JS でメモ帳を作る

🔹 index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>オフラインメモ帳</title>
  <link rel="stylesheet" href="style.css">
  <link rel="manifest" href="manifest.json">
</head>
<body>
  <h1>オフラインメモ帳</h1>
  <textarea id="memo" placeholder="ここにメモを入力..."></textarea>
  <button onclick="saveMemo()">保存</button>
  <script src="app.js"></script>
</body>
</html>

🔹 style.css(お好みで)

body {
  font-family: sans-serif;
  padding: 20px;
}
textarea {
  width: 100%;
  height: 300px;
  margin-top: 10px;
}
button {
  margin-top: 10px;
  padding: 10px 20px;
}

app.js

// 保存ボタンでメモを保存
function saveMemo() {
  const memo = document.getElementById('memo').value;
  localStorage.setItem('memo', memo);
  alert('保存しました!(ローカル保存)');
}

// ページ読み込み時に保存済みメモを表示
window.onload = () => {
  const saved = localStorage.getItem('memo');
  if (saved) {
    document.getElementById('memo').value = saved;
  }
};

// サービスワーカー登録
if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('service-worker.js')
    .then(() => console.log('Service Worker 登録成功'))
    .catch(err => console.log('Service Worker 登録失敗:', err));
}

🛠 ステップ②:manifest.json でPWAにする

{
  "name": "オフラインメモ帳",
  "short_name": "メモ帳",
  "start_url": "./index.html",
  "display": "standalone",
  "background_color": "#ffffff",
  "theme_color": "#2196f3",
  "icons": [
    {
      "src": "icon-192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "icon-512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ]
}

※ icon-192.png と icon-512.png は適当なアイコンを pwa-memo フォルダに置いてください。

🔄 ステップ③:Service Worker でオフライン対応

🔹 service-worker.js

const CACHE_NAME = 'memo-app-cache-v1';
const urlsToCache = [
  './',
  './index.html',
  './style.css',
  './app.js',
  './manifest.json',
  './icon-192.png',
  './icon-512.png'
];

// インストール時にキャッシュ
self.addEventListener('install', event => {
  event.waitUntil(
    caches.open(CACHE_NAME)
      .then(cache => cache.addAll(urlsToCache))
  );
});

// リクエストがあればキャッシュを優先
self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request)
      .then(response => response || fetch(event.request))
  );
});

✅ 実行方法(ローカルテスト)

PWAは http:// または https:// 環境でしか動作しません。
ローカルでテストする場合は軽量サーバを立てましょう:

🔹 方法1:VSCode拡張「Live Server」

拡張機能「Live Server」でフォルダを開いて右クリック →「Open with Live Server」

🔹 方法2:Pythonで簡易サーバ起動

python3 -m http.server 8000
# ⇒ http://localhost:8000 にアクセス

📱 ホーム画面に追加

🎉 完成!PWAオフラインメモ帳!

必要であれば、「IndexedDBで複数メモ対応版」や「同期機能付き」などの拡張版もご紹介できますよ😊


クライアントをchromebookやwindowsにひろげるクライアントをchromebookタブレットやwindowsタブレットで考えるとクライアントでhtmlを使う別の案は考えられませんか?

とても良い視点です!✨

クライアントに Chromebook や Windows タブレットも加えるということで、HTML/JS/CSSベースの技術を使いながら、マルチデバイス対応かつオフライン利用も視野に入れた構成を考える必要がありますね。

以下に、あなたのように 「HTMLに強みがある」 方が、ChromebookやWindowsタブレットでもスムーズに開発・利用できる現実的な選択肢を整理してご紹介します!

✅ ゴール整理

項目要件・希望条件
利用端末iOS, Android, Windowsタブレット, Chromebook
UI技術HTML/CSS/JavaScript で構築したい
オフライン対応ネットがない場所でも動作してほしい
ネイティブ言語回避Flutter/Swift/Kotlinなどはできれば回避
方法特徴ChromebookWindowsタブレットオフライン対応コメント
PWA◎ ネイティブ風Webアプリ最も自然な選択肢
ElectronHTMLで作るデスクトップアプリ◯(Linuxとして)機能重視ならアリ
NW.jsElectronに近い軽量寄り
TauriRust+Webの軽量アプリフレームワーク高速・新しい選択肢
WebViewラッパーアプリネイティブにWebViewを埋め込む△(要ビルド)保守が手間

🥇 第一候補:PWA(Progressive Web App)

✅ 理由:

  • Windows・ChromeOS・Android・iOSすべてで動作
  • OSに依存しない(ブラウザ上で完結)
  • オフライン対応も簡単(Service Worker + localStorage/IndexedDB)
  • 📱 対応端末ごとの挙動

    端末PWA動作ホーム画面追加オフライン対応
    Chromebook◎ Chromeで完璧
    Windowsタブレット◎ Edge/ChromeでOK
    Android◎ ChromeでOK
    iOS△ Safariのみ対応◯(一部制限あり)

    ✨ おすすめ活用例:

    • 事務作業・入力用Webアプリ
    • 業務支援アプリ(倉庫管理、現場チェックなど)
    • 小規模POSやフォーム入力ツール

    🥈 第二候補:Electron(PC用のみ)

    ✅ 特徴:

    • HTML/CSS/JSでデスクトップアプリを作れる
    • 完全に「単体アプリ」として配布可能(インストーラ作成)
    • ネットなしでも動作可能(ファイルベース)

    📦 対応:

    • Windows タブレット:◎
    • Chromebook:△(Linux対応があれば可能)
    • iOS/Android:✕(非対応)

    スマホ対応は不要 or スマホ別設計にする場合は、ElectronでPC側をリッチにできます。

    💡補足:Chromebookの特性

    Chromebookは以下の機能を持っています:

    モード内容
    Chromeアプリ現在は非推奨(将来的に廃止)
    Linux(開発者モード)Electronなども動かせる(やや技術的)
    AndroidアプリFlutterなどでAndroid対応していれば実行可能
    Webアプリ(PWA)◎ Chromeブラウザでベストな選択肢

    つまりChromebookであれば「PWA」がベストフィットです。


    🧠 あなたにおすすめの構成案

    🌟 フロントエンド構成

    PWAベースのHTMLアプリ

    オフライン対応は IndexedDB or localStorage + Service Worker

    UIは BootstrapやTailwind などでレスポンシブ対応

    モバイル・タブレット両対応のレスポンシブUI設計

    🌟 バックエンド(必要なら)

    オンライン時に同期するAPI(RailsやSpring Bootなど)

    オフライン中はデータをローカルで保持 → 接続時に同期


    ✅ まとめ:PWA + HTML/CSS/JSが最適解!

    利点

    • ブラウザベースなのでマルチプラットフォーム対応
    • HTML/CSS/JSスキルがそのまま活かせる
    • オフラインでも十分使える設計が可能
    • メンテナンス・展開が楽(インストール不要 or 簡単)
    • 必要であれば「PWAをIndexedDB対応にした複数メモ版」や「APIとの同期機能付き」など、発展形のコードもご提供できますので、気軽にご相談ください😊

    ChromebookでLinux対応という説明がありますが、どういうことですか?

    とても良い質問です!✨

    「ChromebookでLinux対応」というのは、ChromebookにLinux環境を追加して使える機能のことを指します。

    正式には 「Linux(ベータ)」または「Linux開発環境」 と呼ばれており、これによりChromebookがちょっとした開発マシンや実験環境としても使えるようになります。


    🐧 Chromebookの「Linux対応」とは?

    ✅ 概要

    Chromebookには通常、Chrome OS(Google独自の軽量OS)が入っていますが、 設定で「Linux開発環境」を有効にすることで、**Debian系のLinux(仮想環境)**が利用できるようになります。

    ✅ できること

    • ターミナル(Bash)での操作
    • apt を使ったパッケージ管理(Node.js、Python、Gitなど)
    • VSCode などのGUI開発ツールの導入
    • Electronアプリの開発・起動
    • 軽いWebサーバの起動(Express、Python HTTP serverなど)

    📸 画面イメージ

    「設定」→「開発者」→「Linux開発環境(ベータ)」→「オンにする」

    するとターミナルが使えるようになり、次のようなコマンドが実行可能になります:

    bash
    sudo apt update
    sudo apt install nodejs npm
    node -v
    npm -v
    

    🎯 こんなことができます!

    やりたいことLinux環境でできる?備考
    Node.js + ExpressでローカルWebサーバ起動localhost:xxxx にアクセス可
    HTML/CSS/JSでElectronアプリ開発・実行Chromebook上でも可能(パワー次第)
    Git操作でコード管理git clone なども普通に可能
    Pythonでスクリプト実行python3 使用可能

    ⚠ 注意点・制限

    内容説明
    仮想環境なので性能は本体次第安価なChromebookだとやや動作が重くなることも
    ファイルアクセスが特殊Linux環境とChromeOSの間でファイルのやりとりに制限あり(共有フォルダ経由)
    一部のUSBアクセスやGUIアプリに制限完全なLinuxではない(セキュリティ重視の設計)

    🔰 開発者目線での使い方イメージ

    あなたのようにWeb系(HTML/JS)を得意としている場合、以下のような使い方ができます:


    1. 開発用途での使い方

    • Node.js + lite-server などでPWA開発のテスト
    • GitHubと連携してローカル開発
    • SassやWebpackなどのビルドツール使用も可

    2. エンドユーザー用途での使い方

    • 自作のElectronアプリをChromebook上で動作させる
    • PWA以外の選択肢(Linux版アプリ)をユーザーに展開

    ✅ まとめ

    項目内容
    何ができる?ChromebookでLinux環境を使った開発ができるようになる
    誰向け?HTML/JSに強く、ローカル開発や自作アプリをテストしたい人
    メリットChromebook 1台でWeb+サーバ系の開発が可能に
    おすすめ?はい!HTMLに強みがあるあなたにとって、強力な補助環境になります!

    仮想環境なので性能は本体次第とありますが、どのくらいのスペックがおすすめですか?

    とても実践的な質問ですね!💻✨

    Chromebookの「Linux開発環境(仮想環境)」を快適に使うには、ある程度のスペックが必要です。

    以下では、何をやりたいか(用途別)に応じたおすすめスペックを、わかりやすくご紹介します!

    ✅ ChromebookでLinux開発環境を快適に使うためのスペック目安

    用途RAMストレージCPU備考
    ✏️ 基本的なPWA開発(HTML/JS/CSS + Node.js)4GB以上64GB以上Celeron or i3軽量サーバ、テキストエディタ中心
    🔧 ElectronやVSCodeを使った開発8GB以上128GB以上Core i3以上 or Ryzen 3以上GUIアプリやnpmの依存が多い作業
    🧪 Dockerや複数サーバを起動する用途16GB推奨SSD必須Core i5以上ややハイエンド、開発者向け

    🧠 なぜスペックが重要?

    ✅ RAM(メモリ)

    • 仮想LinuxはChrome OSとメモリを共有します。
    • RAMが少ないと、ChromeとLinuxの両方がもっさりになります。

    ✅ CPU

    • ElectronやVSCode、npmなどの重い処理ではCPU性能が重要です。
    • 安価なCeleron搭載モデルだと遅延が目立つことがあります。

    ✅ ストレージ

    • Node.js + npm + Linuxパッケージで数GBはすぐ埋まります。
    • 32GBモデルだとLinux環境自体が入らないことも。

    💡 具体的なおすすめモデル(2024年時点)

    モデル名メモリストレージCPU価格帯(目安)コメント
    Lenovo IdeaPad Duet 5 Chromebook8GB128GBSnapdragon 7c約5〜6万円軽いが高解像度、人気モデル
    ASUS Chromebook Flip CX58〜16GB128〜256GBCore i3/i5約6〜9万円本格開発におすすめ
    HP Chromebook x360 14c8GB128GBCore i3約6万円前後キーボード付きで開発しやすい
    ※上記は開発者向けの選びやすいモデルで、Officeや文書閲覧用途にはもっと軽量モデルもあります。

    ✅ おすすめスペックまとめ(開発者向け)

    項目推奨値
    メモリ(RAM)8GB以上(最低でも4GB)
    ストレージ64GB以上(128GBあると安心)
    CPUIntel Core i3 以上 or Ryzen 3 以上
    その他USIペン対応やUSB-C給電が便利

    🔍 購入前チェックポイント

    • 「Linux(ベータ)対応」と明記されているか(古い機種だと非対応も)
    • ストレージがeMMCではなくSSDだと高速
    • 日本語配列キーボードか英語配列か(好みで)

    ✅ まとめ

    開発目的Chromebookのスペック

    • PWAやWeb開発だけRAM 4GB / ストレージ 64GB / Celeron でもOK
    • Node.jsやElectronを使う本格開発RAM 8GB以上 / SSD 128GB以上 / Core i3以上が安心