一身上の都合

プログラミングとかの話

iPad Air(M2) 13インチを買ってよかった

長年iPad mini4 とiPad Air2 を使用していたのだが、いい加減動きがもっさりしてきたのと勉強とか仕事のメモに使えるタブレットが欲しくて色々検討した結果iPad Air M2 を購入した。

結果的に大正解だった。

用途

  • 仕事用の考えをまとめるためのメモ
    • フロー図、ダイアグラム、ミーティング中のメモなど
    • 長年markdown やNotion などいろいろ模索してきたが、やはりさっと考えを残すには手書きが良いと思った
  • プライベートの勉強
    • 読書のメモ
    • 試験勉強ノート
  • お絵かき

iPad Air(M2) 以外の候補と感想

  • iPad Pro(M4) 12.9 インチ
    • ペン用途を重視するなら120 Hz が重要に感じた
    • 値段はともかく、オーバースペックなきらいがある
  • iPad Pro(第5世代) 12.9 インチ 整備済製品
    • M1 チップかぁ……
    • こっちでも満足できそうだったが、値段大差ないなら新品の方が良い
  • Galaxy Tab S6 Lite
    • メモだけなら良さそう
    • ROM が64GB しかない
    • 安物買いの銭失いになりかねない
  • Galaxy Tab S9+
    • 防水防塵!風呂で使える!
    • 実機触ってみたいけど近隣に展示品ない

買ったもの

iPad Pro とAir を触ってみたいと思い家電量販店で試した。

試してる最中にiPad Pro (M4) を買っていく裕福そうな人がいたのを羨みつつも、メモ程度では自分にはフレームレートの差も処理能力の差もわからなそうだった。

ということでiPad Air(M2) 13インチ を購入。

性能は十分だが、FaceID 無いのかよとは思った。

アクセサリーは純正が高すぎるのでサードパーティ製で賄っているが、今のところ満足。

アクセサリー

おまけ

  • Metapen A14
    • 最初何も考えずに最新を買った
    • 結果非接触充電がうまくいかなかった
    • 今は眠っている

AWS Certified Cloud Practitioner 合格体験記

試験概要

AWS Certified Cloud Practitioner はAWS 認定のFoundational に該当する、最も易しい認定資格です。

AWS Certified Cloud Practitioner 認定 | AWS 認定 | AWS

受験の経緯

今までもAWS はちょこちょこ使っていたのですが、ここ半年くらいでそこそこしっかりとした環境構築をする機会に恵まれたので、体系的に理解するためにもまずは入門レベルの認定を受験してみようと思うようになりました。

結果

2週間ほどの勉強期間で受験し、結果は821/1000 で合格でした。 可もなく不可もなくといった結果ですが、ひとまず合格できて安心しました。

試験終了後 5 営業日以内にメールが届くとか書いてましたがその日のうちに連絡が来ました。

勉強に使った教材と勉強方法

認定試験は基本的に自分の好きな日程で受験することができます。

そのためある程度勉強して自信がついた時点で、近日中の日程で申し込むのが良いと思います。

今回は2週間ほど勉強した段階で、もう大丈夫そうかなと思い挑戦することにしました。

教材

  1. AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー 改訂第3版

    試験対策テキストで一番上に出てきたのでとりあえず選びました。

    内容は浅く広く載っているという感じで、これだけで網羅は難しいです。

    とはいえ初学者がいきなりAWS 公式ドキュメントにあたるのはなかなかハードルが高いと思うので、問題を解いてテキストに載っていない内容は適宜AWS 公式ドキュメントで補完するというくらいが良いと思います。

  2. 【CLF-C02版】この問題だけで合格可能!AWS 認定クラウドプラクティショナー 模擬試験問題集(6回分390問)

    Udemy【CLF-C02版】この問題だけで合格可能!AWS 認定クラウドプラクティショナー 模擬試験問題集(6回分390問)

    結果的にはテキストとこれとAWS 公式ドキュメントだけで十分だと思いました。

    通常価格7,600円もするらしいですが、Udemy はしょっちゅうセールをやっており自分は1,300円で購入しました。

    自分の場合は会社に費用を出してもらえるのでセールでなくても構わなかったのですが、Udemy Business や費用補助の制度がない場合はセールを待ちましょう。

    難易度的には実際の試験を☆3 とすると、Udemy の本番レベル①-④はより少し難しい☆4くらいでしょうか。

    実際の試験のUI とも近く、おかげで当日もそこまで違和感なく受験できました。

    また本番レベル①-④それぞれで出題内容が偏っているので、そのあたりはうまく分散してくれればいいのにとは思いますが、基本的にはこれを満点近く取れるようになるまで周回すれば問題ないでしょう。

  3. AWS認定 クラウドプラクティショナー 模擬問題集

    2 のUdemy を満点近く取れるようになったあと、試験前日に模擬試験として挑戦できるものはないかと探したあと、これを見つけました。Kindle Unlimited でも利用できるようです。

    レビューで65問の模擬問題が2セット収録されているという旨のものを見かけて、安価だったので軽い気持ちで購入しましたが、内容は65問×2回分になっているわけではなく130問収録されているだけだったので模擬試験としての試みは失敗でした。

    難易度は☆5 で、Udemy よりも細かいことを聞かれるため知識を身につける上では役立ちましたが、本番試験対策にはやや過剰にも感じました。

    順序としてはテキストの次にやれれば良かったなと思っています。

    暗記問題は自分はやっていません。

  4. 暗記メーカー ankimaker.com 無料かつスマホでもPC でも使用できる一問一答メーカーのようなものを探していたところ見つかりました。

    csv インポートはなかなか癖のあるフォーマットなので注意です。

    主にAWS CAFとAWS Well-Architected Framework の暗記と、Udemy の間違えた問題の復習に使用しました。

    AWS CAFとAWS Well-Architected Framework の暗記用に自分が作成したものを置いておくので良ければ使ってください。解説内容はAWS ドキュメントをコピっただけのものです。

具体的な勉強方法とそのスケジュール

あまり時間で区切るということはやっていなかったのですが、振り返ると休日は4時間くらい、平日は2-3時間くらいは合計で捻出していたかなと思います。

まずは1のテキストを2日かけてさらっと読み、その後更に2日かけてもう一周しました。

その後2のUdemy の問題集を1日に2回分ずつ解きました。試験時間は90分ですが、実際解くと30分程度で終わったのでそこまで負担ではないと思います。

本番レベル①② を解いたあたりでAWS CAF とAWS Well-Architected Framework は暗記した方が良いという意見を見かけましたので、暗記メーカーを使用して一問一答を作成し、全問正解できるようになるまで繰り返しました。実際当日もそれぞれ1 問は出た記憶があります。

Udemy で間違えた問題は暗記メーカーにコピペしました。この作業は地味に負担でしたが、どこでも気軽に復習できるのでやって良かったです。

あとはほぼ100%正答できるようになるまでひたすらUdemy を周回(自分の場合は3-4周)し、

試験前日に模擬試験のつもりで購入した3 の模擬問題集を解きました。自信をつけるためにやったのですが、130問通して正答率は80%弱くらいだったものの、分野によっては知識が浅いことに気づき、危うく自信を喪失しかけました。

直前はあんまり新しいことをやるものではないですね。

その後当日直前までは自信回復のために暗記メーカーでの復習に徹しました。

試験当日

14時からの試験で、会場には15分前には着くようにとのことでしたが、30分前には着いてしまいました。自分の受験した会場の場合は30分前から受付開始だったのでちょうど良かったですが、このあたりは会場によると思うので会場のルールをご確認ください。

持ち物は身分証が2つ必要なので要注意です。自分はマイナンバーカードと保険証を提出しました。詳細は公式の情報をご確認ください。

おそらくどこの会場も身分証以外の持ち物はロッカーに預けることになります。

その他会場ではメモ用のホワイトボードが渡されますが、自分は特に使用することがありませんでした。開始と同時に暗記事項を書き出しても良いかもしれませんね。

試験は途中退出が可能で、当日も30分+見直し10分の合計40分で試験を終了しました。

試験終了を選択した後アンケートに答えると、試験結果が表示されます。

無事合格と表示されたのを確認して、ホワイトボード等を受付に返却し、ロッカーのものを持って帰宅という流れでした。

感想と今後

当日の試験の感想は、Udemy などの想定問題よりも出題内容の面でも、選択肢の面でも合格点に達しやすかったように感じています。

Udemy や模擬問題集では選択肢が紛らわしいものが並んでいましたが、当日の選択肢は「この中だったらこれしか無くない?」と思って自信を持って選べるものが多かった印象です。

ただその一方で、初めて見る内容の問題も数問はありました。また、テキストかどこかで見たっきり、問題としては出会っていなかった内容にも出くわし、そういった問題で点を落としてしまったのだと思っています。

今回合格したことにより、他の認定試験の50% Discount が3年後まで受けられるので、期限が来るまでにAWS Certified Solutions Architect - Associate に挑戦してみようかと思っています。

ブラックフライデーで買ったもの

ブラックフライデーで買ったもののレビューです。

LG 55型 4Kチューナー内蔵 有機EL テレビ OLED55C2PJA Alexa 搭載 2022 年モデル 黒

リビングに置くのを大型モニターにするかテレビにするか迷いに迷って、結局テレビにした。
ちょうどAmazon でLG の22年エントリーモデルであるLG テレビ 55型 4Kチューナー内蔵 有機EL OLED55A2PJA スマートテレビ Alexa 搭載 2022 年モデルが10万円を切っていたのでそちらにしようかと思い現物を見に量販店に行ったところ、
LG の店員さんからこのA のシリーズよりも今回購入したC のシリーズの方が価格に見合うよと教えてもらった。 色と音と映像エンジンのことを考えて、C シリーズにすることを決めたのは良いものの、
量販店には23 年モデルしか置いておらず、セールで18万くらい(元値が30万だということを考えると大特価なんだろうけど)。
流石に予算オーバーかなと思い、性能もそこまで大差なさそうな22年モデルを買うに至った。

届いて早速いろいろ観てみたが音も映像も今のところ満足している。

EQUALS イコールズ テレビ台 壁寄せテレビスタンド WALL V2 ロータイプ (2020モデル) 棚板レギュラーサイズセット 32型〜60型対応 サテンブラック (棚板:サテンブラック)

元々狙っていたテレビスタンドが棚板セットでだいぶ安くなっていたので即ポチった。 似たような製品はあるが、取付可能重量と、あと一応耐震性も考えて選んだ。

今のところいい感じ。

アイ・エス 電子メモパッド 8.5インチ 書き消し可能 ホワイト IDM02-8-WH

iPad Pro を買おうと思ってるけど、とりあえずメモできるものがすぐに欲しかったので買ってみた。
電池が切れると消せなくなるみたいだが、コイン型電池を交換すればまた使えるらしい。
767 円なのでロクに使えなくてもしかたないと思っていたけど、以外に悪くない。
ペンの太さが筆圧依存っぽいのがちょっと使いにくいが、簡単な落書きには置いといても良い。

あとはティファールの深型フライパンを買ったたくらいだが、これはまだ届いていないので割愛。

余談だけど去年のブラックフライデーで買った曲面モニタを買い足そうかと見に行ったら、
買ったときより1,000 円くらい下がってた。 おすすめ。

fvm(flutter version management)で困ること

以下の環境はWindows11, WSL2 ですが、 macOS Ventura でも同様でした。

flutter commands から色が消える

通常flutter doctor を実行すれば次のように色のついた状態で内容が表示されると思う。

だがこれをfvm 経由で実行すると色が表示されない。

調べたところfvm のissue で次のようなコメントが見つかった。

引用すると、

I did some digging and it looks like all coloring done by flutter (ie. not pub, since it is external) passes through this method: https://github.com/flutter/flutter/blob/abecef6ed36565d5d756da3d406555a4e6e70387/packages/flutter_tools/lib/src/base/terminal.dart#L249

Which decides whether to color or not based on this:

https://github.com/flutter/flutter/blob/abecef6ed36565d5d756da3d406555a4e6e70387/packages/flutter_tools/lib/src/base/terminal.dart#L190-L191

However _platform does not seem to have a way to be overridden. To overcome it you can just replace the getter to always return true and recompile flutter locally:

ということらしい。具体的なワークアラウンドについてもshilangyu さんがスクショを貼ってくれているが、一応自分の方でも書いておく。
※以下は自己責任でお願いします。以下の内容により生じたあらゆる不利益または損害に対して、一切の責任を負いません。

  1. ~/fvm/default/packages/flutter_tools/lib/src/base/terminal.dartを変更
@override
bool get supportsColor => true;
// bool get supportsColor => _platform.stdoutSupportsAnsi;
  1. rm -dfr ~/fvm/default/bin/cache を実行

これで再びfvm flutter doctorを実行すればOK。 OKですね。

shilangyu さんに感謝です。

未解決: fvm flutter run でインタラクティブにデバイス選択ができない

flutter run を実行するとデバイス選択がシェル上でインタラクティブに可能なのだが、fvm を通すと以下のようにdeviceId を指定しろと言われる。

More than one device connected; please specify a device with the '-d <deviceId>' flag, or use '-d all' to act on all devices.

これについてもissue が見つかった。 wontfix タグは削除されているものの、まだ対応はされていない。

職場ではスクリプトを用意してくれた人がいるので従来通りっぽく動かせるのだが、pure なコマンドに比べるといくらか処理速度が遅いのが気になる。 fvm さん対応お願いします。

YouTube Data API で登録済みチャンネルの中からライブ配信中のものだけ取得しようとしたがQuota の上限に引っかかった

YouTube 配信開始の通知はGoogle アカウントへのメールか、スマホへのポップアップ通知しかないので、自分でAPI 叩いてDiscord とかに通知飛ばせるようにするかと思いちょっとしたツールを作りました。

が、一つ問題がありGCP のYouTube Data API は一日10,000 Queries というQuota(割当)上限が決められており、さらに使用するAPI によってQueries の使用量が定められています。
Quota については公式のドキュメントYouTube Data API (v3) - Quota Calculator  |  Google Developers をご確認ください。

例を挙げると、
チャンネル登録に関するAPI であるsubscriptions.list を使用する場合はcost は "1" ですが、
動画を検索するsearch.list を使用する場合はcost は "50" も必要です。

今回やりたかったことは流れとして、

  1. 自分の登録チャンネルのID を取得する
  2. 各チャンネルの配信中の配信があればそれを返す
  3. それをDiscord とかで5分おき(配信開始は大抵キリの良い時間なので)に通知する

って感じなんですが、YouTube Data API では配信中かどうかの情報は videos または search リソースでしか取得できません。
videos に関してはChannel ID からは取得できず、search リソースを使用するしかないのですが、
登録チャンネルが50だった場合、search のコスト 50 × 50 で2,500 Queries を消費してしまうので課金する他方法がないようです。
Quota 上限の開放に関しては(個人だと難しいみたい)https://stackoverflow.com/questions/61281991/applying-for-additional-quota-for-youtube-api-as-an-individual-without-business/62686472#62686472なので、白旗です。

一応作ったものはこちら

github.com

Vue CLI でGoogleAppsScript アプリ を作成するまで

VueCLI4 でGoogleAppsScript アプリを作成する

GoogleAppsScript (以下GAS) で簡易なWeb サイトやアプリケーションが作成できるのですが、
それをVueCLI を用いて作成してみました。

Vue CLI のインストール

Vue.js のアプリケーションを簡単に作るためのCLI ツールであるVue CLI をインストールします。
Vue CLI はglobal install する必要があるので注意。

なおnpm を使用する場合は適宜読み替えてください。

$ yarn global add @vue/cli @vue/cli-init
yarn global v1.22.10
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 🔨  Building fresh packages...
success Installed "@vue/cli@4.5.11" with binaries:
      - vue
✨  Done in 197.86s.

$ vue --version
@vue/cli 4.5.11
  • vue が動かない場合はグローバルインストールしたパッケージへのパスが通っていないと思われます。必要に応じてググってみてください。

プロジェクトを作成

プロジェクト内にすべてのソースコードが入ります。

$ vue create <appname>
* ここではappname は"vue-gas-app" とします。
** おそらくself singed certificate に関するエラーが生じるので、Global Protect を一時的に切断しましょう。
*** 終了後再接続するのを忘れずに。

実行後、以下の初期設定用インタラクティブモードに入ります。
今回は試しにManual で設定してみましょう。

Vue CLI v4.5.11
? Please pick a preset: (Use arrow keys)
  Default ([Vue 2] babel, eslint)
  Default (Vue 3 Preview) ([Vue 3] babel, eslint)
❯Manually select features
? Check the features needed for your project: (Press <space> to select, <a> to toggle all, <i> to invert selection)
❯◉ Choose Vue version
 ◉ Babel
 ◯ TypeScript
 ◯ Progressive Web App (PWA) Support
 ◯ Router
 ◯ Vuex
 ◯ CSS Pre-processors
 ◉ Linter / Formatter
 ◯ Unit Testing
 ◯ E2E Testing
? Choose a version of Vue.js that you want to start the project with
❯ 2.x
  3.x (Preview)
? Pick a linter / formatter config:
  ESLint with error prevention only
  ESLint + Airbnb config
  ESLint + Standard config
❯ ESLint + Prettier
? Pick additional lint features: (Press <space> to select, <a> to toggle all, <i> to invert selection)
❯◉ Lint on save
 ◯ Lint and fix on commit
? Where do you prefer placing config for Babel, ESLint, etc.? (Use arrow keys)
❯ In dedicated config files
  In package.json
? Save this as a preset for future projects? (y/N) n
? Pick the package manager to use when installing dependencies: (Use arrow keys)
❯ Use Yarn
  Use NPM
✨  Creating project in /Users/user/work/vue-gas-app.
🗃  Initializing git repository...
⚙️  Installing CLI plugins. This might take a while...

yarn install v1.22.10
info No lockfile found.
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 🔨  Building fresh packages...
success Saved lockfile.
✨  Done in 123.97s.
🚀  Invoking generators...
📦  Installing additional dependencies...

yarn install v1.22.10
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 🔨  Building fresh packages...

success Saved lockfile.
✨  Done in 20.69s.
⚓  Running completion hooks...

📄  Generating README.md...

🎉  Successfully created project vue-gas-app.
👉  Get started with the following commands:

 $ cd vue-gas-app
 $ yarn serve

今回はVueCLI でデフォルトのビューのみのアプリを作成するので、Vue Router やVuex は使用しないものとします。
パッケージのインストールが完了したら試しに一度動かしてみましょう。

$ cd vue-app-demo

$ yarn serve

yarn serve

GoogleAppsScript の用意

以下のリンクからGoogle Apps Script API を「オン」にしておきましょう。
https://script.google.com/u/1/home/usersettings

GAS のソースコードはclasp というCUI ツールによってローカル環境と同期することができます。

$ yarn global add @google/clasp

$ clasp login

$ clasp create vue-gas-app
? Create which script?
  standalone
  docs
  sheets
  slides
  forms
❯ webapp
  api
Created new webapp script: https://script.google.com/d/<id>/edit
Warning: files in subfolder are not accounted for unless you set a '.claspignore' file.
Cloned 1 file.
└─ appsscript.json

ここで新たにappsscript.json と.clasp.json が作成されます。
最終的にGAS へはclasp push というコマンドでdist/ 内のファイルをアップロードするのですが、
dist/ 内にappsscript.json やCode.js を配置することを避けるために、gas/ というディレクトリを作成しましょう。

$ mkdir gas

$ mv appsscript.json gas/

$ echo .clasp.json >> .gitignore

またgas/ 内にGAS のエントリポイントとなるCode.js を作成します。

# Code.js
function doGet() {
  return getHtml()
}
function getHtml() {
  const html = HtmlService.createTemplateFromFile('index')
  return html
    .evaluate()
    .setTitle('vue-gas-app')
    .addMetaTag('viewport', 'width=device-width, initial-scale=1')
}

dist/ 内のファイルをGAS へpush するために.clasp.json を以下のように修正します。

{
  "scriptId":"<id>",
  "rootDir": "dist"
}

ビルドの設定

作成したgas/ 内のファイルをビルドの際にdist/ にコピーしてくれるように、webpack の設定をします。
VueCLI では従来のようにwebpack.config.js に設定するのではなく、vue.config.js 内に記述します。

# vue.config.js
const CopyWebpackPlugin = require('copy-webpack-plugin')

module.exports = {
  configureWebpack: {
    plugins: [
      new CopyWebpackPlugin([
        {
          from: path.resolve(__dirname, './gas'),
          ignore: ['.*']
        }
      ])
    ]
  }
};

また、VueCLI の通常のバンドルではGAS では読み込めない場合があるため、すべてをインラインでバンドルすることにします。

# vue.config.js
const path = require('path')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackInlineSourcePlugin = require('html-webpack-inline-source-plugin')

module.exports = {
  publicPath: '/public',
  chainWebpack: config => {
    config
      .plugin('html')
      .tap(args => {
        args[0].template = './public/index.html'
        args[0].inlineSource = '.(vue|js|css)'
        return args
      })
  },
  configureWebpack: {
    plugins: [
      new HtmlWebpackInlineSourcePlugin(),
      new CopyWebpackPlugin([
        {
          from: path.resolve(__dirname, './gas'),
          ignore: ['.*']
        }
      ])
    ]
  }
};

deploy

では実際にビルドしてみましょう。

$ yarn build

ビルドしたものをclasp push でデプロイします。
また、不要なファイルがアップロードされないように事前に.claspignore を設定します。

/* .claspignore */
**/**
static/**
static/css/**
!appsscript.json
!Code.js
!index.html
$ clasp push

これでGAS の画面からデプロイすればOKです。

Appendix

Linter とFormatter

Linting rules に関しては好みが分かれますが、ここでは標準的に使用されているPrettier をフォーマッタに使用します。
VueCLI を使用してESLint + Prettier をインストールすると、自動的にESLint とPrettier で競合するルールをオフにしてくれるeslint-config-prettier がインストールされるので、基本的には自分で特にルールをいじる必要はありません。
私の場合は .prettierrc.js にてシングルクォートのみ有効にしてあります。

# .prettierrc.js
module.exports = {
  singleQuote: true,
};

【2020年8月版】NHK解約してみた

この度ついにNHKを解約した。
意外とすんなりいったので流れを書いておこうと思う。

なお、私はもともと地上波契約をしておらず、今回テレビを処分し受信できる設備が無くなったので解約したのであり、
そうでなくてNHKの料金を払いたくないだけという人はお引取りください。
見てるなら払え。

  1. テレビを売却
    10年ものの32インチテレビだったので引き取り手に苦労した。
    無償引取でもいいので出張対応してくれる業者を探し、引き取っていただいた。
    NHK解約には買取証明のようなものが必要と聞いたので、業者の方とメールでやり取りする際に領収書や明細が発行できるか尋ねたところ、 「買取証明書発行しますよ」とのことだったのでお願いした。
    おそらく同じようなことをよく言われるんだろうな。
    ちなみにテレビは家電リサイクル法の関係で、処分しようと思うと諸々5000円程度かかるのが辛い。

  2. NHKに連絡
    こちらに記載されているNHKふれあいセンターに電話をかけた。
    はじめはナビダイヤルのガイドに従い番号を入力していき、お決まりの「ただいま電話が大変込み合っております」のアナウンス。
    まぁ解約は往々にしてそうだよなと思いつつ待つこと1 分半、担当者の方に繋がった。
    「〇〇と申します。お世話になっております。この度テレビを処分したので、解約の申請書を頂きたいのですが。」と伝えたところ、
    「他に受信機はありませんか?」「テレビ売却の証明になるものはありますか?」などの質問を受けたあと、本人確認をされ、1 週間から10 日ほど解約の届出書が届くので、売却の証明になるものと合わせて送るよう説明いただいた。
    なお、本人確認の際に契約番号がわからなければ電話番号や住所から確認が行われるが、この際住所変更をしていないと手間になるので注意。
    実際今回事前に住所変更を行っておいたが、ネットで24時間受付しているので簡単だった(反映まで少し時間がかかる模様)。

  3. 解約届出書送付
    必要事項を記入して売却証明書と合わせて返送。
    解約処理が届いた時点から日割りで計算して過払い分は返金するとか電話口で聞いた。

以上。
NHKといえばアポもなくしつこく訪問してくるようなイメージしかなかったが、準備をして正当な理由を持って誠実な対応をすればなんの問題も無かった。