技術メモ

習得したIT技術の備忘録

【e-tax×freee】転居時の電子証明書再発行でやったこと

e-taxで確定申告する時に必要になる電子証明書は、転居した場合に再発行が必要になる。
freeeとの紐づけとかの流れを忘れないようにメモしておく

1. 引っ越し先の役所で「電子証明書」の発行を申請する

 マイナンバーカード+必要な書類(自治体ホームページを確認)で発行してもらえる  転居や氏名の変更等(改行)転居して住所が変更した場合(改行)電子証明書は失効します(ただし、利用者証明用電子証明書は失効しません)。再度電子証明書が必要な場合は、転居先の市区町村の窓口で電子証明書の発行申請を行います。
転居や氏名の変更等 | 公的個人認証サービス ポータルサイト

2. e-tax電子証明書を登録する

 ※e-taxでも行えるけどfreeeの確定申告の流れでできるのでそちらを記載
①「freee電子申告開始」ナビボタンから設定画面を表示
2. 電子申告に必要な準備をしましょう 下記に該当する人はこのステップで準備を行ってください。 初めて確定申告を電子申告で行う方 利用者識別番号が失効している方  すでに利用者識別番号をお持ちで、引越しなどでマイナンバーカードの情報が変更になった方 すでに利用者識別番号をお持ちで、マイナンバーカードの電子証明書の有効期限が切れた方  該当する人は「freee電子申告開始ナビ」で必要な準備をできます。利用は無料です。freee電子申告開始ナビボタン。わからない場合は、電子申告開始ナビ 使い方ガイドを参照してください。
②利用番号を確認し登録ボタンクリック
パソコンの場合。カードリーダーを用いてマイナンバーカードを読み取り、利用者識別番号に電子証明書を紐づけます。

https://support.freee.co.jp/hc/ja/articles/360037668512-%E9%9B%BB%E5%AD%90%E7%94%B3%E5%91%8A%E9%96%8B%E5%A7%8B%E3%83%8A%E3%83%93-%E4%BD%BF%E3%81%84%E6%96%B9%E3%82%AC%E3%82%A4%E3%83%89-%E5%80%8B%E4%BA%BA%E7%89%88#h_0cfa6854-727a-40ac-a6f7-90b0fccd32e8

【TypeScript】構造的部分型 (structural subtyping)を理解する

構造的部分型 (structural subtyping)とは

プログラミング言語の派生型(継承関係にある型)の方式の1つ。

派生型の方式は公称型(Nominal Typing)と構造的部分型(structural subtyping)があり、 TypeScriptは構造的部分型(structural subtyping)を採用している。

構造的部分型は、型の構造を比較し置換可能かを判定する。

つまりどういうことか?

  • Fruits型とApple型を定義する

  • それぞれ別の型なので、Fruits型の変数にApple型の変数を代入すると型エラーが発生しそうだけどしない

  • それははぜか?

    • Fruits型とApple型の構造を比較すると、両方string型のnameプロパティがある(構造が同じ)
    • 構造的部分型では「型の構造を比較し置換可能かを判定する」
    • Fruits型とApple型が構造が同じのためFruits型の変数にApple型の変数を代入してもエラーにならない
type Fruits = {
  name: string;
};

type Apple = {
  name: string;
};

const apple: Apple = {
  name: "ジョナゴールド",
};

// Fruits型の変数にApple型の変数を代入する
const fruits: Fruits = apple; // コンパイルエラーにならない

構造の比較について

コンパイルエラーになるパターン

以下のパターンはコンパイルエラーになる。

  • なぜエラーになるのか?
    • Apple型はcolorプロパティを持っているが、Fruits 型にはない
    • Apple型に必要なプロパティがない(=構造が一致していない)ためエラーになる
type Fruits = {
  name: string;
};

type Apple = {
  name: string;
  color: string;
};

const fruits: Fruits = {
  name: "ジョナゴールド",
};

// Apple型の変数にFruits型の変数を代入する
const apple: Apple = fruits // エラー「プロパティ 'color' は型 'Fruits' にありませんが、型 'Apple' では必須です。」

コンパイルエラーにならないパターン

以下のパターンはコンパイルエラーにならない。

  • なぜエラーにならないのか?
    • 構造の一致は必要なプロパティがあるかどうかで判定している
    • Fruits型に必要なstring型のnameプロパティは、Apple型にある
    • Apple型はFruits型に不要なcolorプロパティを持っているが、Fruits型は定義している以外のプロパティはあってもなくてもよい
    • Fruits型必要なプロパティがあるためFruits型とApple型は構造が一致していると判定され、Fruits型の変数にApple型の変数を代入できる
type Fruits = {
  name: string;
};

type Apple = {
  name: string;
  color: string;
};

const apple: Apple = {
  name: "ジョナゴールド",
  color: "赤",
};

// Fruits型の変数にApple型の変数を代入する
const fruits: Fruits = apple; // コンパイルエラーにならない

// 代入はエラーにならないがアクセスはエラーになる
fruits.color  // エラー「プロパティ 'color' は型 'Fruits' に存在しません。」

参考

Vue Fes Japan 2023の資料リンクをまとめてみた

(自分で見返すように)Vue Fes資料リンクのまとめ

全トラック

11:05 - 11:25

走りながらエンジンを交換する 〜 大規模プロダクトを成長させつつVue 3にするには 〜

speakerdeck.com

11:25 - 11:45

社内UIコンポーネントライブラリがエンジニアチームにもたらした本当の価値

11:45 - 12:05

Vue.jsを活用して開発リードタイムが1/3になった話

speakerdeck.com

クラウドサイントラック

12:05 - 13:30

「Youはなぜコントリビュータに?」論より動くもの.fm 出張版
Vue.jsプロジェクト設計のベストプラクティスを求めて

speakerdeck.com

メドピアトラック

12:05 - 13:30

Vue 2のEOLまで二ヶ月ですが進捗どうですか?

speakerdeck.com

13:30 - 14:00

Vueを使ってGrid Systemを実装した話

speakerdeck.com

WebGISとVue.jsの親和性について

docs.google.com

Nuxt3のモジュール開発は意外と簡単? Module Author Guideをのぞいてみよう

Vue 3/Electronで自作したマークダウンエディタをVue 3/Tauriにリプレイスした話

speakerdeck.com

14:15 - 14:45

18営業日で350コンポーネント規模のVueアプリにデザインシステムを導入する方法

speakerdeck.com

15:00 - 15:30

Demystifying Nuxt Bridge 〜 あなたがまだ見ぬ可能性とその活用法 〜

speakerdeck.com

15:45 - 16:15

Deep Dive to UnJS and Nuxt 3

speakerdeck.com

16:30 - 17:00

マルチスレッドフレンドリーなJavaScriptを求めて

https://vue-fes-japan-2023-multithread-slide.sapphi.red/1

17:15 - 17:45

eslint-plugin-vueの現状と今後

エムスリーやっていきトラック

12:05 - 13:30

Nuxt 3ではじめるテスト導入戦略と初手

speakerdeck.com

Nuxt 2から3へマイグレーションする方法考えてたら、マイクロフロントエンドのフレームワークができた話

tome.app

13:30 - 14:00

画面遷移から考えるNuxtアプリケーションをアクセシブルにする方法

yamanoku.net

14:15 - 14:45

Nuxt 3でJamstackテンプレートを作るときの考え方

speakerdeck.com

15:00 - 15:30

Vue Language Serverから生まれたVolar.jsと、それが秘める可能性

speakerdeck.com

15:45 - 16:15

SOLID原則に基づくSFC実装

https://slides-one.vercel.app/1?clicks=1

Composition API時代のPub/Subパターンでの状態管理

speakerdeck.com

Exploring the Power of Error Handling in Vue JS
フルスクラッチECの基盤であるNuxt 2を3に移行し、開発の効率性とパフォーマンスを高める

speakerdeck.com

16:30 - 17:00

Vue.jsと3D可視化 - 産総研OSS「AIST 3DDB Client」を例に

speakerdeck.com

17:15 - 17:45

STUDIOの作り方 2023 ver.

【vuelidate】requiredIfにreactiveを設定したい!!!!

vuelidaterequiredIf(特定の条件のときだけ必須にする)に、reactiveな値を設定するのに結構苦戦したので、備忘録です。 (ドキュメントに書いてあったのでその通りにすればよかっただけ)

ゴールのイメージ

チェックボックス(リアクティブな値)がtrueの場合は、テキストボックスが必須になる。
falseの場合は、必須にならない。

入力フォームのgif。チェックボックスとテキストボックスが横並びに表示されている。チェックを入れるとテキストボックスの下に必須エラーが表示される。チェックを外すとエラーが非表示になる
ゴールのイメージ

検証環境

  • vue: 3.3.2

  • Composition API

  • @vuelidate/core:2.0.2

  • @vuelidate/validators": 2.0.2

ダメだった書き方

state.isCheckedreactiveなのでこれで良いと思ったのですがダメでした。

<template>
  <div>
    <h1>Vuelidate</h1>
    <input type="checkbox" v-model="state.isChecked" @change="v$.mailAddress.$touch" />
    <input type="text" v-model="state.mailAddress" @blur="v$.mailAddress.$touch" />
    <div class="input-errors" v-for="error of v$.mailAddress.$errors" :key="error.$uid">
      <div>{{ error.$message }}</div>
    </div>
  </div>
</template>

<script lang="ts">
import { computed, defineComponent, ref } from 'vue'
import { reactive } from 'vue'
import { useVuelidate } from '@vuelidate/core'
import { required, requiredIf } from '@vuelidate/validators'

export default defineComponent({
  setup() {
    const state = reactive({
      isChecked: false,
      mailAddress: ''
    })

    const rules = {
      return {
        mailAddress: { required: requiredIf(() => state.isChecked)} 
      }
    })

    const v$ = useVuelidate(rules.value, state)

    return { state, v$ }
  }
}
</script>

正解

rulescomputedにする!
あとはチェックボックス@change="v$.mailAddress.$touch"を設定するのもポイントでした。

    const rules = computed(() => {
      return {
        mailAddress: { required: requiredIf(() => state.isChecked)} 
      }
    })

ちゃんと公式に書いてあった

vuelidate-next.netlify.app

結論

公式ドキュメントをちゃんと読もう!

【Firebase Hosting】削除したプロジェクトを復元してデプロイするとError: HTTP Error: 404, Requested entity was not found.になる

Firebaseで一度削除して復元したプロジェクトにHostingデプロイすると、エラーになりデプロイできなくなる事象の調査と解消した方法をご紹介します。 (前提:プロジェクト削除前はデプロイできていた)

Error: HTTP Error: 404, Requested entity was not found.

ターミナル画面のスクショ。firebase deployコマンドの後404エラーが発生している

解消した方法

ターミナル画面のスクショ。firebae deployコマンドの後deploy completeと表示されている

結論からいうと「プロジェクトを復元した後1日待ったらデプロイできるようになった」です。
(原因がわかっていないので、1日待つことが解消の要因かどうかは断定できませんが私の場合はそうでした)

解決までの流れ
1日目 am11:00頃 プロジェクトを復元する
1日目 am12:00頃 デプロイすると404エラーになる。調べて色々試してみるが解消しない
2日目 am10:00頃 デプロイに成功する(この日は特に何もしていない。1日目の状態のまま)

解消するまでに試したこと

まずはプロジェクトが存在するか確認

以下コマンドで、デプロイ先のプロジェクトが存在するか確認する

$ firebase projects:list

↓ 結果にデプロイ対象の「プロジェクトが表示されている」「Project ID に(current)が表示されている」が確認できればOK
ターミナル画面のスクショ。firebase projects:listの実行結果が表示されている

対象のプロジェクトに(current)が表示されていない場合は、以下のコマンドで切り替える

$ firebase use (PROJECT_ID)

①firebase-toolsを最新にする

以下コマンドでツールを更新する

$ npm install -g firebase-tools

②firebaseプロジェクトを初期化する

以下コマンドで初期化

$ firebase init

③デプロイ ターゲットを設定する

以下コマンドでデプロイターゲットを設定

$ firebase target:apply hostign (TARGET_NAME) (RESOURCE_IDENTIFIER)
  • TARGET_NAME・・・デプロイ先である Hosting サイトの一意の名前(Hosting サイト内で被ってなければ好きな名前を付けていいよということ)
  • RESOURCE_IDENTIFIER・・・Firebase プロジェクトにリストされている Hosting サイトの SITE_ID
  • SITE_ID・・・デプロイした場合に表示される「SITE_ID.web.app」のドメイン部分

これは複数のHostingサイトがある場合に設定するものなので、今回は関係なさそうでしたmm
以下コマンドで設定をクリアしました。

$ firebase target:clear  hosting (TARGET_NAME)

上記色々試しましたが、冒頭に書いた通りなぜか一日待ったらデプロイできるようになりました。
プロジェクトを復元した場合にデプロイできるようになるまで何かしらのタイムラグがあるのか、単純にローカル環境の問題だったのか。。。謎です

参考サイト

apprythm.com

uyamazak.hatenablog.com

Firebase CLI リファレンス  |  Firebase Documentation

デプロイ ターゲット  |  Firebase Documentation

【ドメイン取得】GoogleDomainsでドメインを購入する方法

個人開発で独自ドメインが欲しかったので、GoogleDomainsで取得してみました。
手順がすごく簡単だったのでご紹介します。(画面通りに進めばOK)

事前準備

  • Googleアカウント作成
  • Googleアカウントでログイン済み

購入手順

1.Google Domainsを表示する

domains.google

2.「取得したいドメイン」を入力し[取得]ボタンを押下する

googleDomainsのトップ画面のスクショ

3.「希望の末尾(.com等)」をカートに入れ、カートアイコンを押下する

ドメイン取得画面のスクショ。選択可能な末尾の一覧が表示されている

4.設定内容を確認し[精算]ボタンを押下する

whoisに連絡先を公開したくない場合は「プライバシー保護」を有効にしておく*1
設定内容確認画面のスクショ。更新の設定とセキュリティ設定の有無について確認される

5.お客様情報を入力し[保存して続行]ボタンを押下する

個人情報入力画面のスクショ。名前や連絡先の入力欄がある

6.支払情報を入力し[購入]ボタンを押下する

支払情報入力画面のスクショ

ドメインが取得されます
マイドメイン画面のスクショ。取得したドメインが一覧に表示されている

参考

Google Domains スタートガイド - Google Domains ヘルプ

プライバシー保護について - Google Domains ヘルプ

*1:whois」とはIPアドレスドメイン名の登録者などに関する情報を、インターネットユーザーが誰でも参照できるサービスです

【e-Tax × freee】フリーランスエンジニアの確定申告に必要なものリスト

今年初めてe-Tax × freeeで確定申告を行いました。
来年も忘れないようにするために、e-Tax × freeeで確定申告する際に必要だったものをリスト化しました。
確定申告の詳細な手順はありませんのでご了承ください。
(freeeはとても親切なので、freeeの手順通りにやっていれば確定申告できると思います)

1.事前に用意しておくもの

2.毎月対応しておくもの

確定申告の際にまとめて入力しようとすると大変なので毎月入力しておくとよい

  • 売上の入力
  • 経費の入力
    • 家賃、通信費、光熱費
    • 携帯代
    • 技術書の書籍代、勉強会の参加費等

※家賃や携帯代等私用と共有している場合は、全額は経費にできないので注意
freee家事按分を登録する

3.確定申告の際に必要になるもの

初年度に発生するもの

freeeの手順に従えば取得できます。 freee電子申告開始ナビ 使い方ガイド

毎年必要なもの

  • 利用者識別番号
  • 電子証明書
  • 取引先(エージェント等)からの支払調書

(以下は加入の場合)

  • 掛金払込証明書の封書(10月位に届くはず)
  • 社会保険料国民年金保険料)控除証明書のはがき(10月位に届くはず)
  • 社会保険料(国民健康保険)・納付額お知らせのはがき (1月末までに届くはず)
    ※届く日付は自治体や団体によって異なる可能性があります

*1:青色申告する場合は開業届の際にこの手続きも必要になる

*2:確定申告までにあればいいが、品薄になる可能性があるので早めに準備する

*3:オンライン申請だと、利用番号も即時発行されます