強欲で謙虚なツボツボ

趣味の読書の書の方

【WSL2+Docker+GPU】機械学習のために環境構築を~仮想環境編

あらすじ

機械学習の勉強のためにいろいろな環境を作れるようにしようということで、前回までに最新のwindows OS ビルドやWSLをインストールしてきた。
今回はDockerを使って仮想環境をつくる。

 

今回の登場物とそのバージョン

  • Docker Desktop for Windows 3.5.2
  • NGC pytorch:21.06-py3

 

流れ

windows作業編:1~3(前回
仮想環境編  :4~5(今回)

  1. windows10 build 20150(以上)をインストール
  2. NVIDIA Drivers for CUDA on WSL
  3. CUDA Toolkitをインストール
  4. Docker Desktop for Windowsをインストール
  5. NGCコンテナを動かす

 

Docker Desktop for Windowsをインストール

macではよく使ったけどwindowsは初めてやる。
インストール後、再起動すると立ち上がるのでチュートリアルとかをやろう。

Dockerコンテナはいろいろインストールして環境構築済みのPCとでも思っておけばいいかもしれない。ミスったと思ったら簡単に消せるところがいいね。
Dockerイメージはコンテナの設計書と考えておけばいい。

www.docker.com

 linux上にdockerやCUDAをインストールしてもいい

Docker Desktopがあるのでやらなくてもいいけど、別にもやり方があるというだけ。
正直、dockerを学びたいわけではないのでCUIGUIでやりやすい方を選ぶといい。
なのでやりかたは省略。

Dockerの設定

日本語にしない方が分かりやすいと思う。
最初から設定がほとんどされていたからあまりすることは無かった。

docs.docker.com

f:id:taopo:20210715000151j:plain

docker run --rm -it --gpus=all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark

↑ の実行結果。こんな感じに表示されていれば問題ないらしい。


NGCNVIDIA GPU Cloud)コンテナを動かす

カタログサイトを見るとなんだかたくさん種類があるが、おススメは左上の法則よりPyTorchを選んでみる。その隣のTensorFlowが一番人気な気がするけど。

ContainerとかCollectionとか分類もいくつかあるけど基本コンテナしか使わなそう。

ngc.nvidia.com

とりあえず、先にフォルダだけ作っておく。
wslを起動すると/mnt/c/Users/userとかいう場所にいるが、/mnt配下でdockerするのが良くないとのことなので、適当に/home/user/pythorchというフォルダを作った。
適当にtest.txtみたいなファイルも作って/pytorch下に置いておくと後で確認しやすい。

Best practices

To get the best out of the file system performance when build-mounting files, we recommend strong source code and other data that is bind-mounted into Linux containers (i.e., with docker run -v <host-path>:<container-path> ) in the Linux file system, rather than the Windows file system. You can also refer to the from recommendation Microsoft.

・  Linux containers only receive file change events (“inotify events”) if the original files are stored in the Linux filesystem. For example, some web development workflows rely on inotify events for automatic reloading when files have changed.

・  Performance is much higher when files are bind-mounted from the Linux filesystem, rather than remoted from the Windows host. Therefore avoid docker run -v /mnt/c/users:/users (where /mnt/c is mounted from Windows).

・  Instead, from a Linux shell use a command like docker run -v ~/my-project:/sources <my-image> where ~ is expanded by the Linux shell to $HOME.

If you have concerns about the size of the docker-desktop-data VHDX, or need to change it, take a look at the WSL tooling built into Windows.

If you have concerns about CPU or memory usage, you can configure limits on the memory, CPU, Swap size allocated to the WSL 2 utility VM.

To avoid any potential conflicts with using WSL 2 on Docker Desktop, you must uninstall any previous versions of Docker Engine and CLI installed directly through Linux distributions before installing Docker Desktop.

コマンドをコピペして実行。
待ってる時間にPyTorchの使い方とかを調べておくといい。

※Docker Desktopを起動した状態でdockerコマンドを実行すること。起動してないとdockerコマンドはありませんとエラーになる。

docker pull nvcr.io/nvidia/pytorch:21.06-py3
# ...
# 実行結果
Status: Downloaded newer image for nvcr.io/nvidia/pytorch:21.06-py3
nvcr.io/nvidia/pytorch:21.06-py3

f:id:taopo:20210715111038j:plain

ちゃんとImageができてる

コピペと変えた部分

  • local_dir:さっき作ったpytorchフォルダを指定
  • container_dir:/workspaceが作業ディレクトリっぽかったので、その配下にpytorchを置く。(-v は自分のPCと仮想環境のどのフォルダをコピーするか的なノリ)
  • --name pytorch:コンテナに名前を付ける。なくてもいいけど見やすくなる。
  • 21.06:選んだバージョン
docker run --gpus all -it --rm -v /home/user/pytorch:/workspace/pytorch --name pytorch nvcr.io/nvidia/pytorch:21.06-py3

f:id:taopo:20210715115006j:plain

コンテナが起動した。環境構築済みのPCにログインした的な感じ。

ちゃんと/workspaceにpytorch/test.txtがある。

 

自分のPC側でtest.txtを編集保存すると、コンテナ側のtest.txtに編集が反映される。
また、その逆も同様。
今後はホスト側で実装して、それをコンテナ側で実行することでGPUで処理を行うことができる。なので、一応これで環境構築としては完了。

※コンテナ内に全てあるので自分のPCにpythonをインストールする必要すらない。
ただ、エディターでwarningは表示されるかも。

f:id:taopo:20210715115755j:plain

Docker Desktopにも表示されている

 

おわり

これで機械学習のための環境構築ができたと思う。というよりもdockerを使うための準備だったと言えそう。
バージョン管理や依存関係に悩まされることなくやっていけそう。飽きてもdockerのcontaier, imageを削除したらきれいさっぱり元通りにできる。
仮想化っていいね。

 

おまけ

PytorchにしろTensorflowにしろ、使い方はそれぞれの公式チュートリアルをやって覚えようと思う。
当面は買った本の写経をして、そのあとにそれをPytorchで書き換えるようにしよ。
先はまだ長そう。

 

【WSL2+Docker+GPU】機械学習のために環境構築を~windows作業編

あらすじ

機械学習が面白そうだからやってみようと思った僕は、本屋の目立つ場所に並んでいたオライリーの「ゼロから作るDeep Learning」を買って写経して喜んでいた。
ところが、コードを実行してみると時間がかかる。どうやら普通にpythonを実行するだけではCPUで処理され、GPUで処理してもらうためにいろいろやる必要があるらしい。

調べるといろんなやり方が出てくる。やり方によってバージョンを合わせたりとか動かなくなったりとかは面倒なので仮想環境でやることにした。

平たく言えば、自分のPCに他人の環境構築済みPCを入れてやろうみたいなノリ。今回はそのための準備、次回は実際に入れてみるという感じ。

 

今回の登場物とそのバージョン

 

流れ

windows作業編:1~3(今回)
仮想環境編  :4~5(次回

  1. windows10 build 20150(以上)をインストール
  2. NVIDIA Drivers for CUDA on WSL
  3. CUDA Toolkitをインストール
  4. Docker Desktop for Windowsをインストール
  5. NGCコンテナを動かす

 

Windows10 build20150(以上)をインストール

WSL2上でCUDAが使用できるのがbuild20150以降なのでそうします。
ただ、これは勝手に更新のお知らせでくるバージョンではなくて開発用のもので、windows insider programに登録してDevチャネルからインストールする必要がある。

windows insider program

自分のMicrosoftアカウントで登録してログインすればいい。

insider.windows.com

設定を開いてインストールする手順があるが、リリースプレビューチャネルしかない。。。Devチャネルはどこ??

windows11の要件を満たしていく

どうやらwindows11の要件を満たさないとリリースプレビューチャネル以外のチャネルをやらせてくれないらしい。

https://46c4ts1tskv22sdav81j9c69-wpengine.netdna-ssl.com/wp-content/uploads/prod/sites/44/2021/06/HardwareChannels6_24-final.png

TPM2.0を有効化

windows11の要件で弾かれてしまう原因の多くはTMP2.0らしい。
これをとりあえず有効にすればよいらしく、BIOS設定の変更から出来るみたい。
早速PCを再起動してF2を押してBIOS設定を開く。
マザーボードはASRock B450 Steel Legend。

f:id:taopo:20210713235921j:plain

Advancec → CPU Configuration

f:id:taopo:20210714000009j:plain

AMD fTPM switch → AMD CPU fTPM

f:id:taopo:20210714000107j:plain

Exit → Save Changes and Exit

windows更新

PCが起動したら設定のwindows insider programを確認すると、Devチャネルが出ているので選ぶ。

f:id:taopo:20210714000428j:plain

f:id:taopo:20210714000436j:plain

 

更新完了

しばらく待って再起動とかしたらネットで見たwindows11の画面がでてきた。
バージョンもちゃんと最新のになっている。

f:id:taopo:20210714005454j:plain

 

NVIDIA Drivers for CUDA on WSLをインストール

簡単に言えば、WSLはwindows上でlinuxを使えるようにしてくれて、そのうえでCUDAを使えるようにするという感じでいいのか?
ダウンロードするのに会員登録がいるみたい。

developer.nvidia.com

f:id:taopo:20210714095550j:plain

インストール完了

 

WSL2をインストール

略さずに言うと「Windows Subsystem for Linux」。windowsでもlinuxを使えるようにしてくれるみたい。
OS ビルド 20262 以降だとコマンド一つで簡単だ。
windows power shellの管理者モードで実行。できたら再起動。

f:id:taopo:20210714102930j:plain

デフォルトのubuntuをインストール

OS ビルド 20262 以前を含めた手順詳細。↓

docs.microsoft.com

f:id:taopo:20210714104316j:plain

再起動するとubuntuが起動してuserを作成する

 

次回

とりあえず、windows上で作業するところまでが完了した。
次はDockerを使って仮想環境をつくって動かそう。

 

taopo.hatenablog.com

 

【C++】AtCoderコンテスト #5

所感

先週に引き続き参加した。
A,B,Cが解けて前回よりも成績は上がったのでok。
Dは時間があっても解けなさそうだった。いずれはFまで解けるようになりたい。

f:id:taopo:20210704230951j:plain

 

覚えたこと

  1. 階乗
    int p = 1;
    for (int i = 1; i <= n; i++) {
        p *= i;
    }
    
  2. 約数の数
    小さい数から調べていく。積み木のイメージ。
  3. vectorをsort
    #include <algorithm>
    vector<int> v;
    sort(v.begin(), v.end());
    
  4. vectorのindexを調べる
    vectort<int> v;
    vector<int>::iterator itr = find(v.begin(), v.end(), want);
    int index = distance(v.begin(), itr);
    

【SwiftUI + Combine】プロジェクトのベースになりそうなものを作る

概要

おそらく今後のiOSアプリの開発はSwiftUIで作成するだろうから、プロジェクトのベースになりそうなものを作成することにした。
せっかくなので標準搭載されているCombineを使ってみる。
構成はMVVMとするのが通例のようなのでModel, View, ViewModelのフォルダにファイルをまとめる。

 

目次

 

Combine

SwiftUIと同じくiOS13以降で使用可能な状態管理をするためのもの。
RxSwiftと同じ。使い方も結構似てるみたいだから好きな方を使えばいいと思った。
公式は正義という理念に従うのならばCombineの方がいいのかな。

これが一番わかりやすくて好きだった↓

qiita.com

 

その他の大事な登場人物

ObservableObject

ViewModelにあたるclassにはこれを継承させる。
名前の通り、値を監視してくれて変更があればViewに即時反映される。
監視する値には@Publishedをつける。
このViewModelに対応するViewで、@ObservedObject ViewModel名 と定義してあげる。

@State

これも値を監視してくれる。
表示フラグとかでよく使う。

こんな感じで使う↓

class TestViewModel: ObservableObject {
    @Published var aaa: String = "aaa"
    var bbb: String = "bbb"
    
    // APIでデータを取得してaaaに代入する、みたいなことをCombineで実装していく。
}

struct TestView {
    var body: some View {
        @ObservedObject viewModel: TestViewModel = TestViewModel()
        @State var isShow: Bool = false
        
        if (isShow) { // isShowの切り替えで表示が変わる
            Text(viewModel.aaa) // aaaの値が変わるたびに表示が変わる
        } else {
            Text(viewModel.bbb) // bbbは@Publishedではないので値が変わっても表示は変わらない
        }
        
    }
}

プロジェクトを立ち上げる

Xcode11以上が必要です。
iOSのAppプロジェクトを作成。
interfaceやLife CycleはSwiftUIを選ぶ。SwiftUIでもUIKitの実装はできるので特に迷う必要はなさそう。

f:id:taopo:20210628110319p:plain

 

こんな構成で作成される。

f:id:taopo:20210628110636p:plain

 

AppDelegateがない

AppDelegateファイルがないですね。
その代わり、アプリ開いた時・閉じた時の検知は下のようにできる模様。
AppDelegateよりも簡明でいいと思った。

f:id:taopo:20210628110931p:plain

 

Combineを試してみる

とりあえず、以下の2つを目標に頑張ってみる。

  • 構成はMVVMを意識する
  • APIで情報を取得完了したら表示に反映させる
  • フォームでユーザ入力を監視する

 

フォルダ構成

こんな感じになった。
Views, ViewModels, Modelsを作って、リクエストやデータの構造体などは適当にModelsに詰め込めた。

f:id:taopo:20210629111434p:plain

 

APIで情報を取得完了したら表示に反映させる

よくあるQiitaの記事を取得するのをやる。

https://qiita.com/api/v2/items

Model→ViewModel→Viewの順番でファイルを作成する。

Model

Models/Entities/Article.swift

まず、データの構造体を作る。上のurlを確認するとわかるがこんなにデータは必要ないので、id, titile, urlを使う。

  • Codable:APIで取得したJSONを好きなデータ型に変換する。
  • Identifiable:リストで表示させるのに必要。
// Models/Entities/Article.swift
import Foundation

struct Article: Codable, Identifiable {
    let id: String
    let title: String
    let url: String
}

一応Errorも作った。

// Models/Entities/Errors.swift
import Foundation

enum RequestError: Error {
    case parse(description: String)
    case network(description: String)
}
Models/Entities/Protcols/ArticleProtcol.swift

プロトコルを作成。
今はQiitaの記事取得だけしかしないので、fetchメソッドを持つだけ。
Publisherをreturnする。データ取得完了や失敗のイベントを発行するみたいな感じか。

// Models/Protcols/ArticleProtcol.swift
import Foundation
import Combine

protocol ArticleProtcol {
    func fetch() -> AnyPublisher<[Article], Error>
}
Models/Requests/ArticleRequest.swift

APIのリクエストを司る部分。前項で作ったProtcolに準拠。

  • apiComponents:APIのurlを作る。
  • fetch:protcolに記述したメソッド。
  • URLSession:ネットワーク上のデータ転送処理をまとめている。基本的にはsharedを使えばいい。
  • map:データを整形したりできる。ログ出力すると何をしているかよくわかる。
  • eraseToAnyPublisher:簡単に言うと型変換。
// Models/Requests/ArticleRequest.swift
import Foundation
import Combine

// MARK: - Request
class ArticleRequest: ArticleProtcol {
    private let scheme = "https"
    private let host = "qiita.com"
    private let basePath = "/api/v2"

    func fetch() -> AnyPublisher<[Article], Error> {
        guard let url = apiComponents(path: "/items").url else {
            let error = RequestError.parse(description: "wrong request url")
            return Fail(error: error).eraseToAnyPublisher()
        }

        return URLSession.shared
            .dataTaskPublisher(for: URLRequest(url: url))
            .map({ $0.data })
            .decode(type: [Article].self, decoder: JSONDecoder())
            .eraseToAnyPublisher()
    }
}

// MARK: - API
extension ArticleRequest {
    func apiComponents(path: String) -> URLComponents {
        var components = URLComponents()
        components.scheme = scheme
        components.host = host
        components.path = basePath + path
        return components
    }
}

ViewModels

前項で作ったfetchメソッドを利用する。
データ取得完了や失敗を監視して

  • sink:データ取得完了や失敗を監視してくれるみたい。
  • cancellables:完了したらちゃんと完了したよとしてあげないといけない。メモリ管理の領域。
// ViewModels/ArticleViewModel.swift
import Foundation
import Combine

class ArticleViewModel: ObservableObject {
    @Published var title: String = "Article View"
    @Published var articles: [Article] = []
    @Published var isLoading: Bool = false

    private var articleRequest = ArticleRequest()
    private var cancellables = Set()

    func fetchArticles() {
        isLoading = true
        articleRequest.fetch()
            .receive(on: DispatchQueue.main)
            .sink(receiveCompletion: { completion in
                switch completion {
                case .finished:
                    print("finished")
                    self.isLoading = false
                case .failure(let error):
                    print(error.localizedDescription)
                    self.isLoading = false
                }
            }, receiveValue: { response in
                self.articles = response
            })
            .store(in: &cancellables)
    }
}

Views

特に説明することはない。
Listは最初にIdentifiableにしたから使える。

// Views/ArticleView.swift
import SwiftUI

struct ArticleView: View {
    @ObservedObject var viewModel: ArticleViewModel = ArticleViewModel()

    var body: some View {
        VStack() {
            if (viewModel.isLoading) {
                Text("Now Loading...")
            } else if (viewModel.articles.isEmpty) {
                Text("No results")
            } else {
                List {
                    ForEach(viewModel.articles) { article in
                        ArticleRowView(article: article)
                    }
                }
            }
        }
        .onAppear {
            viewModel.fetchArticles()
        }
    }
}
// Views/ArticleRowView.swift
import SwiftUI

struct ArticleRowView: View {
    @State private var isShowAlert: Bool = false

    let article: Article

    var body: some View {
        HStack {
            Group {
                Text(article.title)
                ZStack {
                    Button("") {
                        isShowAlert = true
                    }
                }
            }
        }.alert(isPresented: $isShowAlert) {
            Alert(
                title: Text(""),
                message: Text("launch safari?"),
                primaryButton: .default(
                    Text("OK"),
                    action: {
                        self.isShowAlert = false
                        guard let url = URL(string: article.url) else { return }
                        UIApplication.shared.open(url)
                    }
                ),
                secondaryButton: .cancel(Text("Cancel"))
            )
        }
    }
}
// ContentView.swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationView {
            VStack() {
                Text("Hello, world!")
                    .padding()
                NavigationLink("ArticleView", destination: ArticleView())

            }
        }
    }
}

フォームでユーザ入力を監視する

Qiitaの記事を取得できたから、次はTextFieldで入力してタグ検索できるようにしてみる。
Modelはメソッドを追加するだけだが、ViewModelは色々追加する。

Model

タグ検索用のsearchメソッドを追加

f:id:taopo:20210629123451p:plain

Models/Protcols/ArticleProtcol.swift

f:id:taopo:20210629123516p:plain

Models/Requests/ArticleRequest.swift

ViewModel

ユーザ入力の監視のためにCurrentValueSubjectを用いる。
値の変更がある度に前項のsearchメソッドを呼ぶ。

  • CurrentValueSubject:一つの値を内包し、値の変更を検知して新しい値を発行する。
  • debounce:入力終了後に待つ。入力一文字ごとにリクエストしていたら大変だから。
  • removeDuplicates:変更前と後が同じ値ならやめる。

f:id:taopo:20210629124102p:plain

ViewModels/ArticleViewModel.swift

Views

適当に変更。

f:id:taopo:20210629124355p:plain

Views/ArticleView.swift

 

deeplinkの設定は簡単だった。特に説明は不要。

f:id:taopo:20210629124849p:plain

f:id:taopo:20210629124859p:plain

 

終わりに

なあなあになってたSwiftUIとCombineを自分なりにまとめられたので少しスッキリしてよかった。

よくできたものだとは言いかねるが、気づいたところを少しずつ修正したりしてプロジェクトのベース的なのにできたらいいや。
なんだかんだで、これくらいのものでも毎回一から作るのは面倒すぎる。

【C++】AtCoderコンテスト #4

所感

約半年ぶりの参加。
多くの人が少し参加してやめてしまうのと同じ道を辿っていたが何とか復帰することができた。

感覚はだいぶ薄れていたが検索しながらで少しずつ思い出してAだけできた。Cも時間を少し過ぎたくらいに正解することができた。
Bは何故か1つだけWAになってうまくいかなかった。

半年やらないと流石にレートは下がる。。。

f:id:taopo:20210628100932p:plain

調べたこと

nCrの計算

using namespace std;
using ll = long long;

vector<vector<ll="">> comb(int n, int r) {
  vector<vector<ll="">> v(n + 1,vector<ll="">(n + 1, 0));
  for (int i = 0; i < v.size(); i++) {
    v[i][0] = 1;
    v[i][i] = 1;
  }
  for (int j = 1; j < v.size(); j++) {
    for (int k = 1; k < j; k++) {
      v[j][k] = (v[j - 1][k - 1] + v[j - 1][k]);
    }
  }
  return v;
}

int nCk = v[n][r];

来週も参加しよう!!

e-Taxで確定申告(青色申告決算書と確定申告書Bを作成して確定申告完了)

概要

e-taxソフトをインストールして、開業届と青色申告承認申請書を送信するまでが完了したので、青色申告で確定申告を完了させる。
提出するのは、「青色申告決算書」「確定申告書B」の2つ。
青色申告決算書は、「損益計算書」「損益計算書の内訳1」「損益計算書の内訳2」「賃借対照表」の4枚から成る。
確定申告書Bは、「第1表」「第2表」の2枚から成る。

これまでの手順はこちら。↓

taopo.hatenablog.com

 

目次

 

e-taxソフトに追加インストール

青色申告決算書」「確定申告書B」を作成するためにe-Taxに追加インストールします。
「申告」「所得税」「令和2年分」を選択してインストール。

 

www.sumoviva.jp

 

作成

先程インストールしたので、申告、所得税、令和2年分を選択できるようになります。

f:id:taopo:20210221122628j:plain

作成→申告・申請等→新規作成

作成する帳票の選択が無尽蔵にありますが、必要なのは「確定申告書B」と「青色申告決算書」なので、上から1, 3番目を選択。
上から2番目の「兼送付書」が必要と表示されたのでこれも選択。

f:id:taopo:20210221133051j:plain

上から3つを選択

名前は任意でわかりやすいものをつける。

f:id:taopo:20210221133435j:plain

作成する書類の名前を任意でつける。

作成すると先程選択した帳票が作成中と表示されます。
選択し忘れたり、不要な帳票があれば、右下の帳票追加、帳票削除で操作しましょう。

・年分の所得税及び復興特別所得税の確定(修正)申告書B...→いわゆる確定申告書B
・年分の青色申告決算書
・年分の申告書等送信票

<株式などで損益があったので以下を追加>
・年分の所得税及び復興特別所得税の申告書付表(先物取引に係る繰越損失用)
先物取引に係る雑所得等の金額の計算明細書

f:id:taopo:20210221133643j:plain

確定申告のための帳票一覧

帳票の編集

作成中となっている帳票3つを記入していきます。

青色申告決算書

メインの記入用紙です。青色申告といったらこれです。

※ 一番気になるのは経費に自宅作業での光熱費や家賃を含められるかですが、これらは自宅で過ごす時間の中で作業している時間の割合の分だけ記入するのが普通です。明確な基準はないので全額経費にもできますが、1日8時間作業だから1/3を経費にするなど、明確な基準を設けて第三者に説明できる状態にしておいた方が無難です。

出来る限り税金は押さえたいのが本音ですが、国相手に負い目を作るようなことは避けるべきです。

1ページ目

記入箇所について

  • 売上金額:フリーランス等であれば振り込まれた金額、投資であれば1年間で決済して増えた(減った)金額
  • 売上原価:製造とか飲食の原価のことです。youtuberとかには原価はないです。(経費と原価は違う)
  • 差し引き金額:売上金額 - 売上原価。
  • 租税公課:事業に関係する税金。住民税みたいな私的なものは別なので、フリーランスや株、youtuberなどの個人事業主は空欄の人が大多数かと思います。
  • 荷造運賃:商品を送った場合に記入できます。メルカリとかの送料も記入できますね。
  • 水道光熱費:自宅なら作業した時間の割合分。(1/3くらい)
  • 旅費交通費:youtubeで動画取りに行った時の交通費とかもいけそうです。
  • 通信費:水道光熱費と同様です。
  • 広告宣伝費:一般人には関係ないですかね。
  • 接待交際費:接待があれば。
  • 損害保険料:倉庫の火災保険とかです。たいていの人はないと思います。
  • 修繕費:消耗品でない道具などを修理した費用。
  • 消耗品費:みんながよく言う「「経費」」です。事務用品や業務のために購入したものを合計しましょう。経費にしたいものはカード払いにしておけば、こういう時に確認しやすくて便利です。
  • 減価償却費:高額な購入を経費にする際、何年かに分けて控除に入れることです。高額なPCなどが該当。
  • 福利厚生費:従業員へのサービスなので個人であれば関係ないです。
  • 給料賃金:従業員への給料なので個人であれば関係ないです。
  • 外注工賃:動画編集を外注してる人は記入。
  • 利子割引料:金融機関から事業に関して借金している人は利子を記入。
  • 地代家賃:家賃のことですが、自宅兼事務所の人は仕事で使う分の面積で割合を考えればいいです。トイレとかも含めていいみたいです。ワンルームの人は50%とかが無難ですかね。
  • 貸倒金:債権回収に関わるものなので、大多数の人には無縁です。
  • 雑費:以上に含まれないもので、振込手数料やNHK受信料などです。迷ったら基本的には消耗品費でいいかと思います。雑費の割合が多いと内容把握のために税務調査が入ります。
  • 貸倒引当金、専従者給与:大多数の人には無縁です。

f:id:taopo:20210221141641j:plain

青色申告決算書1ページ目
2ページ目

月ごとの収入を記入。これの合計が1ページ目の売上金額と一致します。
他は、右下に1ページ目の控除後所得と青色申告によって65万円控除と記入します。

f:id:taopo:20210221192248j:plain

2ページ目
3ページ目

控除してほしい家賃を記入します。
住所は、自宅ではなく支払先の不動産会社か大家さんになります。
引っ越したばかりであれば礼金なども記入して、その右の欄に家賃のうち事務所の割合の金額を入力。

f:id:taopo:20210221192740j:plain

3ページ目
4ページ目

現金と口座に入っている預金、12月のお金が振込されていないと思うので売掛金にその金額を記入しておけば良いと思います。
差額は、事業主貸に記入します。(事業目的以外で収入を利用した金額。個人用の口座に振り込んでもらっている場合は、そこから生活費を引き出すのでその生活費分)
自宅で委託作業してるだけとかならば、負債の欄に記入することはないと思います。
原価も入力不要。

f:id:taopo:20210221193049j:plain

4ページ目

確定申告書B

白色申告で使うAよりも記入が多いです。
基本的には前項の青色申告決算書の数字を見ながら記入します。

第一表

・氏名等の基本情報は自動入力されています。種類の青色にチェックを忘れないでください。
・収入金額等:㋐営業等に収入金額を入力。(投資損益は別用紙で入力するので含みません。)
・所得金額等:①⑫に経費等を差し引いた所得を入力
・所得から差し引かれる金額:年金・健康保険料・多額の医療費・多額の災害損害など。基礎控除は大多数の人が48万円です。㉘寄付金控除はふるさと納税です。
・税金の計算:指示に従って足し算引き算の結果を入力
・その他:56青色申告特別控除額は65万円。この控除のために頑張って入力してきました。必ず入力すること。

・還付される税金の受け取り場所:銀行口座を入力

f:id:taopo:20210623092110j:plain

第一表

第二表

第一表の詳細を記入する用紙です。番号は第一表の項目に対応しています。

・所得の内訳:収入をくれた人・団体について記入。所得の種類は第一表の収入金額等の㋐~㋛の語句に対応させる。
・保険料控除等に関する事項:第一表の所得から差し引かれる金額の保険関連に対応するかと思います。私は年金のみの入力でした。
・㉘寄付金控除に関する事項:ふるさと納税。名称は一か所のみ書けばOK。寄付金は合計金額

・住民税・事務税に関する事項:ふるさと納税。自分で納付にチェックと都道府県市区町村への寄付に合計金額を入力。

上記以外の項目で入力することはありませんでした。必要な人は各自入力してください。

f:id:taopo:20210623095000j:plain

第二表
第三票・追加した帳票

第一表で記入した収入以外で副収入がある人のみの記入です。
私はフリーランス以外に投資損益があるので記入します。損は翌年の利益に対して控除となるので損しても記入しましょう。(非課税のNISAについては分かりません)

 

申告書等送信票

作成した帳票にチェックします。
・申告書第一表・第二表
・決算書・収支内訳書
他にもあれば随時チェック。

f:id:taopo:20210623101427j:plain

申告書等送信票

 

完了!!

後は署名、送信するのみです。
署名・送信は以下の最後の方を参考。

taopo.hatenablog.com

送信が完了すると、メッセージが追加されているので確認します。
それに記載のある番号を用いてATMなどで納税することができます。

 

結構大変だったけど、まとめたおかげで来年少しは楽にできるはず。

ATMの隣にSTMとかいうのがあった

仕事から帰宅すると少し目立つ格好をした何かが顔を覗かせていた。未払い年金の催促状が届いていた。
ポストを開けると他にも税金関連の郵便物があり、持ち帰って開封してみると住民税の納付書だった。こちらは真っ当に支払っているから今年度分だ。年金の方は3ヶ月前に未納があったらしい。
早いところPay-easyで済ませて寝てしまおうと晩御飯を食べながら考えていたが、思うようにはいかなかった。住民税の納付書にはPay-easyの記載がない。どうやら住民税はPay-easyに非対応のようだ。
他方、年金納付書にはいつも通り納付番号が記載されている。UFJのネットバンキングにいざ入力。表示されるのは支払いできませんというエラー。使用期限が過ぎていても納付書は使えますとの文言は嘘なのか。
コンビニに行くか。しかしコンビニは現金しか受け付けてくれない。それにコンビニで税金・公共料金の支払いやAmazonの受け取りだけを目的に行くことは、なんとなく気が引ける。不要とも思えるアルバイトへの気遣いをすることで自己満足を得ることにした。

 

大きめのUFJに足を踏み入れた。前回来店時からはかなり月日が経過している。
こんな小さな店舗だったか。確か奥まで広がっている大きめの店舗だったという記憶がある。しかし見えるのは並んだATMだけだ。
ATMではPay-easyでしか税金は払えない。仕方がないから店員に話を聞いたところATMの隣にある機械に案内された。この時、奥に普通の窓口が見えた。どうやらATMゾーンとパーティションで区切られているようだ。やはり大きめの店舗だという記憶は間違ってはいなかった。
並んでいる機械は全てATMだと思っていたが違うようだった。ATMに紛れて外貨両替機とSTMというものが設置されている。STMは初めて目にするが、税公金・振込自動受付機(STM)とある。
これは、従来コンビニや窓口等の対面でしか叶わなかった一部の手続きも機械で可能とするものであり、手数料がいくらか割引(*1)にもなる模様。
ただし、税金の指定金融機関、収納代理金融機関がUFJでない場合は手数料(*2)がかかるが、これは当たり前である。
後続に並ぶ人から若干のプレッシャーを感じながら初めての操作に挑む。

(*1)他行宛3万円以上の現金振り込み手数料(税込) 窓口864円:STM648円
(*2)3万円未満:648円、3万円以上:864円
参考:https://www.bk.mufg.jp/info/pdf/20190116_mufgnext.pdf

f:id:taopo:20210622100237p:plain

 

操作方法は並んでいる最中に操作中の人を凝視して予習済みだ。とりあえず納付書を機械に食わせればいいのだろう。
違った、機械は紙を吸い込んでくれない。出鼻を挫かれたが冷静に操作画面に視線を移してパネルをタッチした。その間、納付書をSTMの口に添え続けるという変な格好にはなっていたが周りはスマホを見ているであろうから問題ない。
なんとか納付書を機械に吸わせることに成功し、キャッシュカードも順次吸わせて口座から引き落とさせることができた。
完了後は大きめの明細が排出されることは予習済みだ。ただ、納付書は排出されないところまでは知らなかった。仕事を終えた機械の前で棒立ちしてしまった。その間十秒、短いがなんとも不自然で印象に残る長い十秒であった。
大きめの明細書には納付書のコピーが印刷されていた。

 

使用感は操作が簡明で便利。連続で税公金の受付してくれるようで使う際はいくつか納付書を溜めてから行くと良いだろう。
操作手順が少なく、初めて使う人でもあまり迷わず不快感なく操作ができるデザインというのは見習うべき箇所が多い。機械以外の他種製品の設計でも意識したいところである。

 

税金に近いほど手元に残るお金は多い。
自動で口座引き落としよりも自身で引き落とし操作をした方がより税金に近いと言えるのではないか。また、納付日付等の明細が手元に残すことができて管理しやすい。これらの理由から口座振替の申請を行っていないが、利便性の面からやはり申請したい気持ちもある。
どちらにせよ、節税は心がけなければいけない。

 

なお、年金はATMのPay-easyで支払うことができた。なぜネットバンキングではできなかったのか。納付書の使用期限が鍵なのかもしれない。