[{"data":1,"prerenderedAt":316},["ShallowReactive",2],{"$f4hm6ko01-UxVYH5Dp-jrK2CnDQj2k3-CvH_uSbYyZTI":3,"$fl7wcoyUSjJFz66rxP_qtyEdNX4xPOcWv6HCfPaC8ZGY":93,"$fA5_5IdYgkbDTOj00lzfphatKgYg3b3csT0Aokfh2ha8":189},{"entry":4,"before":55},{"metadata":5,"sys":8,"fields":29},{"tags":6,"concepts":7},[],[],{"space":9,"id":14,"type":15,"createdAt":16,"updatedAt":17,"environment":18,"publishedVersion":22,"revision":23,"contentType":24,"locale":28},{"sys":10},{"type":11,"linkType":12,"id":13},"Link","Space","jmfsolylwbqz","44OAk3fEMxgnCY5QzxPiDr","Entry","2026-05-06T04:47:12.868Z","2026-05-06T04:47:37.284Z",{"sys":19},{"id":20,"type":11,"linkType":21},"master","Environment",31,2,{"sys":25},{"type":11,"linkType":26,"id":27},"ContentType","blogPost","ja-JP",{"title":30,"slug":31,"category":32,"body":51,"description":52,"legacy":53,"enableAd":54,"enableCommentField":54},"【Submon】最小iOSバージョンをiOS 16へ引き上げます","submon-min-ios-16",{"metadata":33,"sys":36,"fields":48},{"tags":34,"concepts":35},[],[],{"space":37,"id":39,"type":15,"createdAt":40,"updatedAt":41,"environment":42,"publishedVersion":44,"revision":23,"contentType":45,"locale":28},{"sys":38},{"type":11,"linkType":12,"id":13},"1AZ6Df2460uf9EaWHYRZi2","2022-04-25T12:44:16.773Z","2022-04-28T14:13:15.068Z",{"sys":43},{"id":20,"type":11,"linkType":21},5,{"sys":46},{"type":11,"linkType":26,"id":47},"category",{"name":49,"slug":50},"Submonのお知らせ","submon-info","いつもSubmonをご利用いただきありがとうございます。\n\nこの度、安定してアプリをご利用いただくため、今後リリース予定のSubmonより、インストール可能な最小iOSバージョンを以下の通り変更いたします。ご不便をおかけしますが、新しいiOSへ更新した上でご利用ください。\n\n【実施バージョン】\u003Cbr>\nv2.0.0（リリース時期未定）\n\n【変更前】\u003Cbr>\niOS 13以上\n\n【変更後】\u003Cbr>\n__iOS 16以上__","",false,true,{"metadata":56,"sys":59,"fields":71},{"tags":57,"concepts":58},[],[],{"space":60,"id":62,"type":15,"createdAt":63,"updatedAt":64,"environment":65,"publishedVersion":67,"revision":68,"contentType":69,"locale":28},{"sys":61},{"type":11,"linkType":12,"id":13},"5rj9AuEsebufNWtBTlTu6F","2026-01-15T15:27:29.616Z","2026-05-04T11:52:28.460Z",{"sys":66},{"id":20,"type":11,"linkType":21},233,14,{"sys":70},{"type":11,"linkType":26,"id":27},{"title":72,"slug":73,"category":74,"body":92,"description":52,"legacy":53,"enableAd":54,"enableCommentField":54},"DartのSwitch式/文、when句、パターンマッチング周りのチートシート","dart-pattern-matching",{"metadata":75,"sys":78,"fields":89},{"tags":76,"concepts":77},[],[],{"space":79,"id":81,"type":15,"createdAt":82,"updatedAt":82,"environment":83,"publishedVersion":85,"revision":86,"contentType":87,"locale":28},{"sys":80},{"type":11,"linkType":12,"id":13},"5MKCmbhhcqboMXodYszCG6","2021-11-16T05:31:22.875Z",{"sys":84},{"id":20,"type":11,"linkType":21},3,1,{"sys":88},{"type":11,"linkType":26,"id":47},{"name":90,"slug":91},"役立ち情報","useful","## 🔹 基本構文\n\n### Switch文（Statement）\n```dart\nswitch (値) {\n  case パターン: \n    // 処理\n  case パターン when 条件式: \n    // ガード条件付き処理\n  default: \n    // デフォルト処理\n}\n```\n\n※case内に処理がある場合は`break`は不要。複数条件を記述する場合、パターン内で論理演算子を使用するか、以下のように複数caseを記述する（この場合はORとなる）。\n\n```dart\nswitch (値) {\n  case パターン1:\n  case パターン2:\n    // 処理\n}\n```\n\n#### 使用例\n\n```dart\nswitch (color) {\n  case 'red':\n    print('赤色です');\n  case 'blue':\n    print('青色です');\n  default:\n    print('その他の色です');\n}\n};\n```\n\n### Switch式（Expression）\n```dart\nfinal result = switch (値) {\n  パターン => 結果,\n  パターン when 条件式 => 結果,\n  _ => デフォルト結果,\n};\n```\n\n#### 使用例\n\n```dart\nfinal colorName = switch (color) {\n  'red' => '赤色',\n  'blue' => '青色',\n  _ => 'その他の色',\n};\n```\n\n## 🔹 Switch式 vs Switch文\n\n| 特徴 | Switch式（Expression） | Switch文（Statement） |\n|------|----------------------|---------------------|\n| **各ブランチの内容** | 返すための値 | 何らかの処理 |\n| **構文** | `条件 => 結果` | `case 条件: 処理` |\n| **デフォルト** | `_` | `default:` または `case _:` |\n| **セミコロン** | 必要 | 不要 |\n| **用途** | 変数への代入 | 処理の実行 |\n\n```dart\n// Switch式：値を返す\nfinal result = switch (value) {\n  1 => 'one',\n  2 => 'two',\n  _ => 'other',\n}; // セミコロンが必要\n\n// Switch文：処理を実行\nswitch (value) {\n  case 1:\n    print('one');\n  case 2:\n    print('two');\n  default:\n    print('other');\n} // セミコロン不要\n```\n\n\n\n## ✅ ワイルドカード `_` の意味\n- **Switch式** の中で使用すると・・・すべてにマッチするデフォルトケース\n- **パターン内** で使用すると・・・値を無視する（変数に代入しない）\n\n```dart\nfinal result = switch (value) {\n  int _ => '何らかの整数',  // どの整数でもマッチ、値を使わない\n  _ => 'その他',           // すべてにマッチ\n};\n```\n\n\n\n## 🔹 when句（ガード条件）\n\n`when`句を使うことで、パターンマッチに加えて追加の条件を指定できる。\n\n### 基本構文\n```dart\ncase パターン when 条件式:\n```\n\n### 例：オブジェクトパターン（後述）を使った場合分け\n```dart\n// Switch文\nswitch (snapshot) {\n  case AsyncData(:final value) when value.score >= 80:\n    print('優秀');\n  case AsyncData(:final value) when value.score >= 60:\n    print('合格');\n  case AsyncData(:final value) when value.score >= 0:\n    print('不合格');\n  case AsyncData(:final value):\n    print('無効なスコア');\n  case AsyncLoading():\n    print('取得中');\n  case AsyncError(:final error):\n    print('スコア取得失敗: $error');\n}\n\n// Switch式\nfinal grade = switch (snapshot) {\n  AsyncData(:final value) when value.score >= 80 => '優秀',\n  AsyncData(:final value) when value.score >= 60 => '合格',\n  AsyncData(:final value) when value.score >= 0 => '不合格',\n  AsyncData(:final value) => '無効なスコア',\n  AsyncLoading() => '取得中',\n  AsyncError(:final error) => 'スコア取得失敗: $error',\n};\n```\n\n\n\n## 🔹 パターンマッチング\n\n※`final 変数名`の部分は変数を定義するときと同じ書き方ができ、再代入を許可する場合は`var`とすることも可能。\n\n### 単純な型\n```dart\n// Switch文\nswitch (value) {\n  case final int n:\n    print('整数:  $n');\n  case final String s:\n    print('文字列: $s');\n  case final double d:\n    print('浮動小数点数: $d');\n  default: // または case _:\n    print('その他の型');\n}\n\n// Switch式\nfinal description = switch (value) {\n  int n => '整数: $n',\n  String s => '文字列: $s',\n  double d => '浮動小数点数: $d',\n  _ => 'その他の型',\n};\n```\n\n### リストパターン\n```dart\nswitch (data) {\n  case [int a, int b] when a == b:\n    print('同じ値の2つの整数');\n  case [int a, int b]:\n    print('異なる値の2つの整数:  $a と $b');\n  case [int single]: \n    print('1つの整数:  $single');\n  case []:\n    print('空のリスト');\n  default:\n    print('その他の構造');\n}\n```\n\n### レコードパターン\n```dart\nfinal point = (x: 10, y: 20);\n\nfinal quadrant = switch (point) {\n  (x: final x, y: final y) when x > 0 && y > 0 => '第1象限',\n  (x: final x, y: final y) when x \u003C 0 && y > 0 => '第2象限',\n  (x: final x, y: final y) when x \u003C 0 && y \u003C 0 => '第3象限',\n  (x: final x, y: final y) when x > 0 && y \u003C 0 => '第4象限',\n  _ => '原点または軸上',\n};\n```\n\n### オブジェクトパターン\n```dart\nswitch (user) {\n  case User(name: 'admin', age: final age):\n    print('管理者（年齢:  $age）');\n  case User(name: final name, age: final age) when age \u003C 18:\n    print('未成年ユーザー:  $name');\n  // スコープ内の変数とオブジェクトのプロパティが同名の場合、省略可\n  case User(:final name, :final age) when age >= 65:\n    print('シニアユーザー: $name');\n  default:\n    print('一般ユーザー');\n}\n```\n\n## （余談）if文でのパターンマッチングとnullチェック\n\nif文でも`case`句を使用することで、同様にパターンマッチングを使用することが出来る。\n\n### 基本的な構文\n\n```dart\nif (値 case パターン) {}\nif (値 case パターン when 条件) {}\n```\n\n### 使用例\n\n```dart\nif (user case SuperUser(:final name)) {\n  print(\"こんにちは、$nameさん。\");\n}\n\n// whenを使用した例\nif (user case SuperUser(:final name, :final age) when age >= 30) {\n  print(\"こんにちは、$nameさん（30歳以上）。\");\n}\n```\n\nこれは何に使うと便利かというと、単純なnullチェックで昇格できない、オブジェクトのプロパティなどの __非nullを保証できる__。\n\n```dart\n// context.userがnullだった場合、if文の中身は実行されない\nif (context.user case final user?) {\n  print(value.length); // value は String (非null型)\n}\n\n// context.userがnullだった場合、if文に入る前にエラーを投げる\nif (context.user case final user!) {\n  print(value.length); // value は String (非null型)\n}\n```\n\n\n\n## 🔹 Switch式における複数条件の指定\n\n※上に書いた条件から順に評価される。\n\n### 1. 論理和・論理積（OR/AND）\n\n```dart\n// 論理和（OR）\nString getDayType(String day) => switch (day) {\n  'Monday' || 'Tuesday' || 'Wednesday' || 'Thursday' || 'Friday' => '平日',\n  'Saturday' || 'Sunday' => '週末',\n  _ => '不明',\n};\n\n// 論理積（AND）※単に&&を使った指定も可能\nString getDiscount(bool isStudent, bool isMember) => switch ((isStudent, isMember)) {\n  (true, true) => '学生会員割引: 20%オフ',\n  (_, true) => '会員割引: 10%オフ',\n  _ => '割引なし',\n};\n```\n\n### 2. 関係演算子パターン - 範囲指定\n\n```dart\n// 範囲による分類\nString getGrade(int score) => switch (score) {\n  >= 90 => 'A',\n  >= 80 => 'B',\n  >= 70 => 'C',\n  >= 60 => 'D',\n  >= 0 => 'F',\n  _ => '無効なスコア',\n};\n\n// 複数の関係演算子を組み合わせ\nString getAgeGroup(int age) => switch (age) {\n  \u003C 0 => '無効',\n  >= 0 && \u003C 13 => '子供',\n  >= 13 && \u003C 20 => '10代',\n  >= 20 && \u003C 65 => '成人',\n  >= 65 => 'シニア',\n  _ => '不明',\n};\n\n// レコードパターンを用いた論理積などでも使用可能\nString getDiscount(int age, bool isMember) => switch ((age, isMember)) {\n  (>= 65, true) => 'シニア会員割引:  30%オフ',\n  (>= 65, false) => 'シニア割引: 15%オフ',\n  (\u003C 18, true) => '学生会員割引: 20%オフ',\n  (_, true) => '会員割引: 10%オフ',\n  _ => '割引なし',\n};\n```\n\n### 3. 型パターンと条件の組み合わせ\n\n```dart\n// 型と値の条件を組み合わせ\nString describe(Object value) => switch (value) {\n  int n when n > 0 => '正の整数:  $n',\n  int n when n \u003C 0 => '負の整数: $n',\n  int _ => 'ゼロ',\n  double d when d > 0.0 => '正の浮動小数点数: $d',\n  double d when d \u003C 0.0 => '負の浮動小数点数: $d',\n  double _ => 'ゼロ',\n  String s when s.isEmpty => '空文字列',\n  String s => '文字列:  $s',\n  _ => 'その他の型',\n};\n\n// null と型チェックの組み合わせ\nString handleValue(Object? value) => switch (value) {\n  // 値がnullの場合\n  null => 'null値',\n\n  // 整数の型チェック + マッチング\n  int n => '整数値: $n',\n\n  // その他の型\n  double d when d.isFinite => '小数値: $d',\n  String s => '文字列: $s',\n\n  // 上記に該当しないその他すべて\n  _ => 'その他',\n};\n```\n\n### 4. リストパターンでの複数条件\n\n```dart\n// リストの要素数と内容で分岐\nString analyzeList(List\u003Cint> numbers) => switch (numbers) {\n  [] => '空のリスト',\n  [_] => '要素1つ',\n  [final a, final b] when a == b => '同じ値の2要素:  $a',\n  [final a, final b] when a \u003C b => '昇順の2要素: $a, $b',\n  [final a, final b] => '降順の2要素:  $a, $b',\n  [final first, ..., final last] when first == last => '最初と最後が同じ',\n  [final first, ... ] when first > 0 => '最初が正の数のリスト',\n  _ => 'その他のリスト',\n};\n\n// 特定のパターンにマッチ\nString matchCoordinates(List\u003Cnum> coords) => switch (coords) {\n  [0, 0] => '原点',\n  [final x, 0] => 'X軸上の点:  ($x, 0)',\n  [0, final y] => 'Y軸上の点: (0, $y)',\n  [final x, final y] when x > 0 && y > 0 => '第1象限',\n  [final x, final y] when x \u003C 0 && y > 0 => '第2象限',\n  [final x, final y] when x \u003C 0 && y \u003C 0 => '第3象限',\n  [final x, final y] when x > 0 && y \u003C 0 => '第4象限',\n  _ => 'その他',\n};\n```\n\n### 5. マップパターンでの複数条件\n\n```dart\n// マップのキーと値で複数条件\nString processRequest(Map\u003CString, dynamic> request) => switch (request) {\n  {'method': 'GET', 'path': '/api/users'} => 'ユーザー一覧を取得',\n  {'method': 'GET', 'path': String path} when path.startsWith('/api/users/') => \n    'ユーザー詳細を取得',\n  {'method': 'POST', 'path': '/api/users', 'body': Map body} => \n    'ユーザーを作成',\n  {'method': 'PUT', 'path': String path, 'body': Map body} \n    when path.startsWith('/api/users/') => 'ユーザーを更新',\n  {'method': 'DELETE', 'path': String path} \n    when path.startsWith('/api/users/') => 'ユーザーを削除',\n  {'method': String method} => '不明なエンドポイント:  $method',\n  _ => '無効なリクエスト',\n};\n\n// 複数のキーの組み合わせで判定\nString getUserStatus(Map\u003CString, dynamic> user) => switch (user) {\n  {'isActive': true, 'isPremium': true, 'role': 'admin'} => \n    'プレミアム管理者',\n  {'isActive': true, 'isPremium': true} => \n    'プレミアムユーザー',\n  {'isActive': true, 'role': 'admin'} => \n    '管理者',\n  {'isActive': true} => \n    '通常ユーザー',\n  {'isActive': false} => \n    '無効なユーザー',\n  _ => \n    '不明',\n};\n```\n\n### 6. レコードパターンでの複数条件\n\n```dart\n// レコードの値で複数条件\nString analyzePoint((int x, int y) point) => switch (point) {\n  (0, 0) => '原点',\n  (final x, 0) => 'X軸上',\n  (0, final y) => 'Y軸上',\n  (final x, final y) when x == y => '対角線上',\n  (final x, final y) when x == -y => '逆対角線上',\n  (final x, final y) when x > 0 && y > 0 => '第1象限',\n  (final x, final y) when x \u003C 0 && y > 0 => '第2象限',\n  (final x, final y) when x \u003C 0 && y \u003C 0 => '第3象限',\n  (final x, final y) when x > 0 && y \u003C 0 => '第4象限',\n  _ => 'その他',\n};\n\n// 名前付きレコード\nString analyzeUser((String name, int age, {bool isPremium}) user) => \n  switch (user) {\n    (name: 'admin', age: _, isPremium: _) => '管理者アカウント',\n    (name: _, age: \u003C 18, isPremium: _) => '未成年ユーザー',\n    (name: _, age: >= 65, isPremium: true) => 'シニアプレミアムユーザー',\n    (name: _, age: _, isPremium: true) => 'プレミアムユーザー',\n    (name: final name, age: final age, isPremium: false) => \n      '通常ユーザー: $name ($age歳)',\n    _ => '不明',\n  };\n```\n\n### 7. オブジェクトパターンでの複数条件\n\n```dart\nsealed class Shape {}\nclass Circle extends Shape {\n  final double radius;\n  Circle(this.radius);\n}\nclass Rectangle extends Shape {\n  final double width, height;\n  Rectangle(this. width, this.height);\n}\nclass Triangle extends Shape {\n  final double base, height;\n  Triangle(this.base, this. height);\n}\n\n// オブジェクトの型とプロパティで複数条件\ndouble calculateArea(Shape shape) => switch (shape) {\n  Circle(radius: final r) when r \u003C= 0 => 0,\n  Circle(radius: final r) => 3.14 * r * r,\n  Rectangle(width: final w, height:  final h) when w \u003C= 0 || h \u003C= 0 => 0,\n  Rectangle(width: final w, height: final h) => w * h,\n  Triangle(base: final b, height: final h) when b \u003C= 0 || h \u003C= 0 => 0,\n  Triangle(base:  final b, height: final h) => b * h / 2,\n};\n\n// 複雑な条件\nString describeShape(Shape shape) => switch (shape) {\n  Circle(radius: final r) when r > 10 => '大きな円',\n  Circle(radius: final r) when r > 5 => '中くらいの円',\n  Circle(radius: final r) when r > 0 => '小さな円',\n  Rectangle(width: final w, height: final h) when w == h => '正方形',\n  Rectangle(width: final w, height: final h) when w > h => '横長の長方形',\n  Rectangle(width: final w, height: final h) when w \u003C h => '縦長の長方形',\n  Triangle(base: final b, height: final h) when b == h => '底辺と高さが同じ三角形',\n  _ => 'その他の図形',\n};\n```\n\n### 8. 実用的な複雑な例\n\n```dart\n// HTTPレスポンスの処理\nString handleResponse(int statusCode, Map\u003CString, dynamic>? body) => \n  switch ((statusCode, body)) {\n    (200, {'data': List data}) when data.isNotEmpty => \n      '成功:  ${data.length}件のデータ',\n    (200, {'data': List data}) when data.isEmpty => \n      '成功: データなし',\n    (201, {'id': int id}) => \n      '作成成功: ID $id',\n    (400, {'error': String msg}) => \n      'リクエストエラー: $msg',\n    (401, _) => \n      '認証エラー',\n    (403, _) => \n      '権限エラー',\n    (404, _) => \n      '見つかりません',\n    (>= 500, _) => \n      'サーバーエラー',\n    _ => \n      '不明なレスポンス',\n  };\n\n// ファイル処理の判定\nString getFileAction(String extension, int size, bool isReadOnly) => \n  switch ((extension. toLowerCase(), size, isReadOnly)) {\n    (_, _, true) => 'ファイルは読み取り専用です',\n    ('exe' || 'bat' || 'sh', _, _) => '実行ファイルです',\n    ('jpg' || 'png' || 'gif', > 10000000, _) => \n      '大きな画像ファイル（${(size / 1000000).toStringAsFixed(1)}MB）',\n    ('jpg' || 'png' || 'gif', _, _) => \n      '画像ファイル',\n    ('mp4' || 'avi' || 'mov', _, _) => \n      '動画ファイル',\n    ('txt' || 'md', \u003C 1000, _) => \n      '小さなテキストファイル',\n    ('txt' || 'md', _, _) => \n      'テキストファイル',\n    (_, > 100000000, _) => \n      '非常に大きなファイル（${(size / 1000000).toStringAsFixed(1)}MB）',\n    _ => \n      '一般ファイル（.$extension）',\n  };\n```\n\n### 9. 入れ子になったパターン\n\n```dart\n// 複雑な入れ子構造\nString analyzeData(dynamic data) => switch (data) {\n  // リストの中にマップがある場合\n  [{'type': 'user', 'name': String name}] => \n    '単一ユーザー:  $name',\n  \n  // 複数要素でパターンマッチ\n  [{'type': 'user', 'name': String name}, ... ] when data.length > 5 => \n    '多数のユーザー（${data.length}人）',\n  \n  // マップの中にリストがある場合\n  {'users': List users, 'total': int total} when users.length == total => \n    'ユーザーリスト完全:  $total人',\n  \n  {'users': List users, 'total': int total} when users.length \u003C total => \n    'ユーザーリスト部分的: ${users.length}/$total人',\n  \n  // 深い入れ子\n  {'data': {'user': {'name': String name, 'age': int age}}} \n    when age >= 18 => '成人ユーザー:  $name',\n  \n  _ => 'その他のデータ構造',\n};\n```\n\n\n## 最後に\n\nこのチートシートは、Dart 3以降のモダンなswitch構文に対応している。独特な構文で慣れが必要だが、パターンマッチングとガード条件（when句）を活用することで、より表現力豊かで読みやすいコードが書けるようになるはず。\n\n\n\n## 📚 参考リンク\n\n- [Dart公式ドキュメント：Branches](https://dart.dev/language/branches)\n- [Dart Switch Expression Syntax and Examples - Bugsee](https://bugsee.com/dart/dart-switch-expression-syntax-and-examples/)\n- [Dart Switch Expressions - ChristianFindlay.com](https://www.christianfindlay.com/blog/dart-switch-expressions)\n\n\n※本記事は、GitHub Copilot「Claude Sonnet 4.5」を利用して出力したものを大幅に加筆修正したものです。手作業による精査済みですので、何か誤っている箇所がありましたら私が悪いです。",{"sys":94,"total":96,"skip":97,"limit":44,"items":98,"includes":175},{"type":95},"Array",4,0,[99,118,137,156],{"fields":100,"sys":115},{"title":101,"slug":102,"category":103},"Submonより送られるメールのドメイン変更のお知らせ","notice-submon-subdomain-update",{"metadata":104,"sys":107,"fields":114},{"tags":105,"concepts":106},[],[],{"space":108,"id":39,"type":15,"createdAt":40,"updatedAt":41,"environment":110,"publishedVersion":44,"revision":23,"contentType":112,"locale":28},{"sys":109},{"type":11,"linkType":12,"id":13},{"sys":111},{"id":20,"type":11,"linkType":21},{"sys":113},{"type":11,"linkType":26,"id":47},{"name":49,"slug":50},{"createdAt":116,"id":117,"type":15},"2025-06-29T09:50:21.514Z","3BW0GSgPUYBe4e7nwvrssj",{"fields":119,"sys":134},{"title":120,"slug":121,"category":122},"【重要】SubmonにおけるTwitterサインイン機能の削除について","submon-removal-of-twitter-sign-in",{"metadata":123,"sys":126,"fields":133},{"tags":124,"concepts":125},[],[],{"space":127,"id":39,"type":15,"createdAt":40,"updatedAt":41,"environment":129,"publishedVersion":44,"revision":23,"contentType":131,"locale":28},{"sys":128},{"type":11,"linkType":12,"id":13},{"sys":130},{"id":20,"type":11,"linkType":21},{"sys":132},{"type":11,"linkType":26,"id":47},{"name":49,"slug":50},{"createdAt":135,"id":136,"type":15},"2023-06-11T13:15:09.449Z","43EEuVfRjAaZxapVg5MZ8Z",{"fields":138,"sys":153},{"title":139,"slug":140,"category":141},"【重要】「Submon」リリースに伴う「提出物マネージャー」の今後について","future-of-smmanager",{"metadata":142,"sys":145,"fields":152},{"tags":143,"concepts":144},[],[],{"space":146,"id":39,"type":15,"createdAt":40,"updatedAt":41,"environment":148,"publishedVersion":44,"revision":23,"contentType":150,"locale":28},{"sys":147},{"type":11,"linkType":12,"id":13},{"sys":149},{"id":20,"type":11,"linkType":21},{"sys":151},{"type":11,"linkType":26,"id":47},{"name":49,"slug":50},{"createdAt":154,"id":155,"type":15},"2022-06-02T15:47:27.415Z","4XTqqoKZoC9Xwmrvj0YruI",{"fields":157,"sys":172},{"title":158,"slug":159,"category":160},"「提出物マネージャー」後継アプリ「Submon」のベータ版リリース(Androidのみ)予定について","submon-beta-release",{"metadata":161,"sys":164,"fields":171},{"tags":162,"concepts":163},[],[],{"space":165,"id":39,"type":15,"createdAt":40,"updatedAt":41,"environment":167,"publishedVersion":44,"revision":23,"contentType":169,"locale":28},{"sys":166},{"type":11,"linkType":12,"id":13},{"sys":168},{"id":20,"type":11,"linkType":21},{"sys":170},{"type":11,"linkType":26,"id":47},{"name":49,"slug":50},{"createdAt":173,"id":174,"type":15},"2022-05-01T05:23:34.258Z","2vIQSvgkzXcblOJnpOGS9k",{"Entry":176},[177],{"metadata":178,"sys":181,"fields":188},{"tags":179,"concepts":180},[],[],{"space":182,"id":39,"type":15,"createdAt":40,"updatedAt":41,"environment":184,"publishedVersion":44,"revision":23,"contentType":186,"locale":28},{"sys":183},{"type":11,"linkType":12,"id":13},{"sys":185},{"id":20,"type":11,"linkType":21},{"sys":187},{"type":11,"linkType":26,"id":47},{"name":49,"slug":50},{"sys":190,"total":191,"skip":97,"limit":44,"items":192,"includes":290},{"type":95},103,[193,208,227,246,265],{"fields":194,"sys":207},{"title":72,"slug":73,"category":195},{"metadata":196,"sys":199,"fields":206},{"tags":197,"concepts":198},[],[],{"space":200,"id":81,"type":15,"createdAt":82,"updatedAt":82,"environment":202,"publishedVersion":85,"revision":86,"contentType":204,"locale":28},{"sys":201},{"type":11,"linkType":12,"id":13},{"sys":203},{"id":20,"type":11,"linkType":21},{"sys":205},{"type":11,"linkType":26,"id":47},{"name":90,"slug":91},{"createdAt":63,"id":62,"type":15},{"fields":209,"sys":224},{"title":210,"slug":211,"category":212},"【Dart/Flutter】とてもいい感じに末尾カンマを強制できるLintプラグインを作ったよ","better-require-trailing-commas",{"metadata":213,"sys":216,"fields":223},{"tags":214,"concepts":215},[],[],{"space":217,"id":81,"type":15,"createdAt":82,"updatedAt":82,"environment":219,"publishedVersion":85,"revision":86,"contentType":221,"locale":28},{"sys":218},{"type":11,"linkType":12,"id":13},{"sys":220},{"id":20,"type":11,"linkType":21},{"sys":222},{"type":11,"linkType":26,"id":47},{"name":90,"slug":91},{"createdAt":225,"id":226,"type":15},"2026-01-15T15:06:58.744Z","7DWX6Gej091IAM1nvGIaiw",{"fields":228,"sys":243},{"title":229,"slug":230,"category":231},"Crashlyticsのデバッグシンボルのアップロードを、CocoaPodsからSwiftPMに移行する","upload-crashlytics-debug-symbols-with-swiftpm",{"metadata":232,"sys":235,"fields":242},{"tags":233,"concepts":234},[],[],{"space":236,"id":81,"type":15,"createdAt":82,"updatedAt":82,"environment":238,"publishedVersion":85,"revision":86,"contentType":240,"locale":28},{"sys":237},{"type":11,"linkType":12,"id":13},{"sys":239},{"id":20,"type":11,"linkType":21},{"sys":241},{"type":11,"linkType":26,"id":47},{"name":90,"slug":91},{"createdAt":244,"id":245,"type":15},"2026-01-13T14:08:17.070Z","7hj5PFf8Y2yNv9MuY5Rxw6",{"fields":247,"sys":262},{"title":248,"slug":249,"category":250},"【Jetbrains IDEs】Dev ContainerでIDEバックエンドのメモリヒープ設定を書き込むには、postAttachCommandを使う","devcontainer-jetbrains-backend-memory-setting",{"metadata":251,"sys":254,"fields":261},{"tags":252,"concepts":253},[],[],{"space":255,"id":81,"type":15,"createdAt":82,"updatedAt":82,"environment":257,"publishedVersion":85,"revision":86,"contentType":259,"locale":28},{"sys":256},{"type":11,"linkType":12,"id":13},{"sys":258},{"id":20,"type":11,"linkType":21},{"sys":260},{"type":11,"linkType":26,"id":47},{"name":90,"slug":91},{"createdAt":263,"id":264,"type":15},"2025-12-24T10:04:08.997Z","4mqFGBFZqEtNN0LUoivz69",{"fields":266,"sys":287},{"title":267,"slug":268,"category":269},"【学マス】空と約束千奈の立ち回り（NIAマスター）メモ（随時更新）","tiny-brave-china-nia-master",{"metadata":270,"sys":273,"fields":284},{"tags":271,"concepts":272},[],[],{"space":274,"id":276,"type":15,"createdAt":277,"updatedAt":278,"environment":279,"publishedVersion":281,"revision":85,"contentType":282,"locale":28},{"sys":275},{"type":11,"linkType":12,"id":13},"4QnljevVGe4bI4JNVdk2Zc","2021-05-02T15:11:20.089Z","2021-11-16T05:32:02.763Z",{"sys":280},{"id":20,"type":11,"linkType":21},17,{"sys":283},{"type":11,"linkType":26,"id":47},{"name":285,"slug":286},"どうでもいいこと","others",{"createdAt":288,"id":289,"type":15},"2025-11-29T12:56:25.421Z","2dGV5IqxRrE9or4veLCUa5",{"Entry":291},[292,304],{"metadata":293,"sys":296,"fields":303},{"tags":294,"concepts":295},[],[],{"space":297,"id":276,"type":15,"createdAt":277,"updatedAt":278,"environment":299,"publishedVersion":281,"revision":85,"contentType":301,"locale":28},{"sys":298},{"type":11,"linkType":12,"id":13},{"sys":300},{"id":20,"type":11,"linkType":21},{"sys":302},{"type":11,"linkType":26,"id":47},{"name":285,"slug":286},{"metadata":305,"sys":308,"fields":315},{"tags":306,"concepts":307},[],[],{"space":309,"id":81,"type":15,"createdAt":82,"updatedAt":82,"environment":311,"publishedVersion":85,"revision":86,"contentType":313,"locale":28},{"sys":310},{"type":11,"linkType":12,"id":13},{"sys":312},{"id":20,"type":11,"linkType":21},{"sys":314},{"type":11,"linkType":26,"id":47},{"name":90,"slug":91},1778043006017]