yikegaya’s blog

仕事関連(Webエンジニア)と資産運用について書いてます

iOS開発に少しだけ手を出してみた感想

仕事で使うとかモバイルエンジニアにキャリアチェンジしたいとかではないんだけど、iOS開発環境少し触ってみたので感想書いてみる。

現状

ここ数年Webの開発エンジニアポジションで直接のモバイル開発経験なし。モバイルに渡すサーバサイドのAPIとかWebView開発経験はある。

動機

  • 単なる好奇心
  • ReactNativeを軽く動かしてみたが中身がブラックボックスすぎて少しは中を知ってみたくなった。
  • 自分が担当でなくてもモバイル開発ってどんなもんかちょっとでも知っておくと業務上のコミュニケーションが取りやすくなったりいいことあるかなとか

やったこと

Udemyのセールで1300円でオンライン講座買ったけど37時間あり異常に充実している。。ただやっぱり長くてとりあえず半分まで受講したところで気が済んでしまった状況。

残りの内容はJSON解析して画面に描画したりFirebaseと連動させたりみたいな内容みたいだけどその辺りは普段Reactでやってる作業とそんなに差がなさそうなんで気が済んでしまった。

受講した内容

  • Swiftについての講義
  • Xcode上でのStoryBoardを使ったiPhoneアプリ開発
  • WebViewでのWebサイト表示方法
  • MVCパターンでのフォルダ分割
  • CocoaPodsでのライブラリ管理
  • JSONXML解析
  • Firebase連携
  • airbnbのlottie-iosライブラリを使ったアニメーション実装

など

買った講座

www.udemy.com

感想

  • swiftは概ね違和感なく使えそう。ただDelegateパターンでのプログラミングはまだ慣れない。
  • あとswiftにはオプショナル型っていうnilの値を許容するか制御する型の仕組みがあって独特な感じだけどそこまでxcodeで書いてると勝手に修正してくれるんでそんなに辛くはなさそう。
  • 簡単な画面のアプリ作るくらいなら今すぐできそう。ただ複雑なUI(カレンダーとか)開発だとWeb画面の開発と勝手が違うんでしばらくつまづきそう
  • xcodeでの開発が最初戸惑う

xcode上での開発

  • xcodeでStoryBoardっていうXMLファイルを選択するとiPhoneの実画面のプレビュー画像みたいなのが出てくる
  • そこに配置したボタンやテキストなどのUI部品を配置
  • UI部品をクリックしてxcode上で色や文字の大きさフォントをぽちぽち選んでくとStoryBoardに反映される
  • 配置したUI部品を選択してCtrlキーを押しながらエディタ状のコードにドラッグアンドドロップして動きをつけていく

。。みたいな開発をやったんだけどこの作業がプログラミングいらずのGUI作業でどんどん進むので最初戸惑った。

GUI作業でコードが更新されてくと何が起こってんだこれ?ってなるけど実際は画面構成とUI部品の見た目を制御するXMLとそこに動作をつけるSwiftを作っているのであってこれはWebでいうHTML、CSSとJSの関係とまあ似たようなもんだという理解でいる。

慣れるとHTMLにCSSやJS当てていくよりも直感的に画面作れそうだしこっちの方が初学者には優しいんだろうなとは思う。

まだよくわかってないこと

  • SwiftUIっていう新しい開発の仕組みがあるらしくてこれが何なのか
  • SwiftUIは現状の現場ではあまり使われてないっぽいけどいつ頃主流になるのか、現状の開発とどう共存してくのか
  • iOS開発環境だとC、C++とMetalって言語も使えるらしいけど普通のアプリ作るときにはほぼほぼ関係ないコア機能作るときの選択。ってことでいいのかな?
  • AR、VR機械学習絡みのAPIは面白そうだけど全くわかってない

これどこまで首突っ込むか

現状ポジション的にはWebのエンジニアでだしモバイル開発のAPIに詳しくなるより普段触ってる技術(サーバサイドのAPI開発、JS、AWS)の深い知識を身につけていく方がまだ優先度高いかな。。と思う。大体その領域で十分仕事あるし。

ただWebの開発とは違った体験が新鮮で面白くはあるんでちょくちょく気晴らし程度に触ってはみたいかな。

フリーランス1年目の確定申告振り返り

フリーランスになって初の確定申告があった。税理士には頼まずに自力でやってみたんでその記録。

確定申告に向けての準備

フリーランスなりたての時にやったこと

  • クラウドの会計ソフトに登録する。自分の場合はfreeeのスタータプランに登録した。
  • 事業用の口座、クレジットカードを作って会計ソフトに連動させる。
  • 家で仕事してるんで家賃、水道光熱費、ガス代、通信費などを按分として計上するようにfreeeで設定する
  • 家賃、水道光熱費、ガス台、通信費を事業用口座に切り替える(これ面倒)

その他節税

  • ふるさと納税をしておく
  • ソフトウェア業なので技術書、PC代、オンライン講座の受講料、資格の受験料は経費としてつけた

早めにやっとけばよかったこと

  • マイナンバーカード を作ってなかったんでe-taxができなかった。
  • Suicaを途中からスマホアプリに切り替えた。カードだと交通費の管理が面倒。
  • ほぼほぼ無いけど紙の領収書が出た時Google Driveに入れてたんだけどfreeeに画像登録できるんでそっちの方がよかったか?
  • 昨年の1月は会社員だったんで会社から源泉徴収票貰っとかないといけなかった。退職時に貰ってなかったんで連絡して貰ったんだけど早めに準備しとけばよかったかな。
  • 家賃、水道光熱費、ガス代、通信費の切り替えに時間がかかるので開業前にやってしまうくらいでよかったな。
  • フリーランスだと住民税、年金、健康保険の支払いも自分でやるんだけど自動引き落としに切り替えないとかなり面倒なんでこれも早くやっちゃった方が楽だった

失敗

素人だったんで1回目申告した後に見事に税務署から指摘があって出し直した。。 売り上げを銀行口座に振り込まれた日付で計上してたんだけど、請求書を発行した時点で計上しないとダメだったらしく2020年12月に請求書発行して1月に振り込まれた分の売り上げが抜けてた。

ありがたいことに税務署の人が丁寧に対応してくれて、名前とか住所書いて判子押して出し押せばOKの訂正版送ってくれたんで期限内には出し直せたけど焦った。

感想

とりあえず会計ソフトにまめに登録しとけば税理士なしでもなんとかなる感じはあったかな。来年もフリーランス続けてる可能性は高いんで次は一発で通したい。

Kindle Unlimitedで技術書いろいろ読んでみた

Amazonの技術書眺めてたら割とKindle Unlimitedで読みたい本あるな。。と思い加入していろいろ技術書読んでみた。

使ってみた感じ、買ったら3000円くらいする技術書が月1000円で読み放題で思ったよりいい本もあるんで結構良い気がしている。

以下読んだ本の記録。 最近別にインフラ担当じゃないけどインフラ周りに興味があってそっち方面の本多め。

Amazon Web Servicesネットワーク入門

個人開発でAWSのECS環境作ったんだけどネットワーク周り復習したくなって読んだ。

AWS Lambda実践ガイド

そういえばLabmda使ったことないな。。と思いどんなもんか気になって読んでみた。 どんな場面で使えるのか。ってのはざっくり把握できた気がする。

kubectl完全逆引きリファレンス

Kubernetesがどんなもんか気になるので読んでみた

実践Helm─自作アプリをKubernetesクラスタに簡単デプロイ!

これもKubernetesがどんなもんか気になるので読んでみた。Kubenetesのデプロイツール。現状Kubenetesのデプロイツールはほぼこれが標準らしい。

Google Cloud Platform エンタープライズ設計ガイド

GCP触ったことがなかったのでどんなもんか気になって読んだ。AWSとの比較が多くてGCPは何が違うのか知るにはちょうどよかった気がする

さわって学ぶクラウドインフラ docker基礎からのコンテナ構築

似たような本読んだことあったしDocker普通に触ってるからそんなに目新しい情報もなかったけどKubenetesについても書かれていてその辺りは勉強になった気がする

GitLab実践ガイド

今の案件がGitLabなので読んでみた。Githubに比べてCI/CD関連の機能多めってことは薄々感じてたけどその辺りがまとまって書いてあってよかった。

以上

terraformでRDSに接続するAPIサーバをECSにデプロイする

terraformでGoのAPIを動かすECSを作ろうとした時、DBの接続で結構手こずった。

初回のterraform実行でRDS構築してさらにECR(コンテナのレジストリ)からdockerイメージをpullしてECS内にコンテナを立ち上げるんだけど、その時に以下の2点がうまくできずにしばらくハマった。

  1. どうやってRDSのエンドポイントとかDB名、ユーザ、パスワード情報渡そうか
  2. Migrationのタイミング

で、とりあえず作った内容を書いてみる

1のRDSの情報

terraformならECSのresouce定義内でRDSのエンドポイントやDB名を参照できる。ユーザ、パスワードはterraformの変数として定義して同じように渡せる。

以下タスク定義内に書いたコンテナの情報。dockerイメージはAPIエンドポイントを立ち上げるGoで書いたサーバ。

resource "aws_ecs_task_definition" "movie-backend" {
  family = "movie_backend"

  requires_compatibilities = ["FARGATE"]

  cpu    = "256"
  memory = "512"

  network_mode = "awsvpc"

  execution_role_arn    = aws_iam_role.ecs_task_execution_role.arn

  container_definitions = <<EOL
[
  {
    "name": "movie_backend",
    "image": "public.ecr.aws/e9z3g6v3/movie-info-backend:latest",
    "portMappings": [
      {
        "containerPort": 8080,
        "hostPort": 8080
      }
    ],
    "environment": [
      {
        "name": "DB_HOST",
        "value": "${aws_db_instance.movie-backend.endpoint}"
      },
      {
        "name": "DB_USER",
        "value": "${var.db_user}"
      },
      {
        "name": "DB_PASSWORD",
        "value": "${var.db_pass}"
      },
      {
        "name": "DB_NAME",
        "value": "${aws_db_instance.movie-backend.name}"
      },
      {
        "name": "DATA_SOURCE",
        "value": "${var.db_user}:${var.db_pass}@tcp(${aws_db_instance.movie-backend.endpoint})/${aws_db_instance.movie-backend.name}?charset=utf8&parseTime=True&loc=Local"
      }
    ],
    "logConfiguration": {
      "logDriver": "awslogs",
      "options": {
        "awslogs-region": "ap-northeast-1",
        "awslogs-stream-prefix": "movie-backend",
        "awslogs-group": "/ecs/movie-backend"
      }
    }
  }
]
EOL
}

こんな感じでそのままGoのコードに渡せばMySQLにつながるように文字列作れるの便利だな。。

${var.db_user}:${var.db_pass}@tcp(${aws_db_instance.movie-backend.endpoint})/${aws_db_instance.movie-backend.name}?charset=utf8&parseTime=True&loc=Local

2のMigration

ここはとりあえずDB、Migration用のECSのタスク定義を作って手動で実行することにした。今のところ手動だけどここはAWSのCodeBuild使って自動化もできそう

作ったterraformのコード。大体上のサーバ実行用のタスク定義と同じなんだけど、commandオプションでイメージ内で最終的に実行されるコマンドをMigrationに上書きしている

resource "aws_ecs_task_definition" "movie-db-migration" { family = "movie_db_migration"

requires_compatibilities = ["FARGATE"]

cpu = "256" memory = "512"

network_mode = "awsvpc"

execution_role_arn = aws_iam_role.ecs_task_execution_role.arn

container_definitions = <<EOL [ { "name": "movie_db_migrate", "image": "public.ecr.aws/e9z3g6v3/movie-info-backend:latest", "command": ["sql-migrate", "up"], "environment": [ { "name": "DATA_SOURCE", "value": "${var.db_user}:${var.db_pass}@tcp(${aws_db_instance.movie-backend.endpoint})/${aws_db_instance.movie-backend.name}?charset=utf8&parseTime=True&loc=Local" } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-region": "ap-northeast-1", "awslogs-stream-prefix": "movie-db-migration", "awslogs-group": "/ecs/movie-db-migration" } } } ] EOL }

以上の作業レポジトリ

github.com

public access可能なRDSをterraformで作成した時のメモ

実運用ではダメだけどちょっと試したいことがあってpublic access可能なRDSをterraformで作った時のメモ

必要なこと

  • RDSのpublicly_accessibleをtrueにする
  • VPCのenable_dns_supportとenable_dns_hostnamesをtrueにする
  • RDSに紐づいているsubnetのaccessをpublicにする

public accessできないterraformとのdiff

git diff
diff --git a/rds.tf b/rds.tf
index 1aaca8b..49f41a0 100644
--- a/rds.tf
+++ b/rds.tf
@@ -15,4 +15,5 @@ resource "aws_db_instance" "movie-backend" {
   port                    = 3306
   vpc_security_group_ids  = [aws_security_group.movie-backend-rds-sg.id]
   db_subnet_group_name    = aws_db_subnet_group.movie-backend-db-subnet.name
+  publicly_accessible     = true
 }
diff --git a/subnet_group.tf b/subnet_group.tf
index 1c329c8..b4d8a70 100644
--- a/subnet_group.tf
+++ b/subnet_group.tf
@@ -1,4 +1,4 @@
 resource "aws_db_subnet_group" "movie-backend-db-subnet" {
   name        = "movie-rds-subnet-group"
-  subnet_ids  = [aws_subnet.movie-backend-private-1a.id, aws_subnet.movie-backend-private-1c.id, aws_subnet.movie-backend-private-1d.id]
+  subnet_ids  = [aws_subnet.movie-backend-public-1a.id, aws_subnet.movie-backend-public-1c.id, aws_subnet.movie-backend-public-1d.id]
 }
diff --git a/vpc.tf b/vpc.tf
index 6365c63..79f2602 100644
--- a/vpc.tf
+++ b/vpc.tf
@@ -1,5 +1,7 @@
 resource "aws_vpc" "movie-backend" {
   cidr_block = "10.0.0.0/16"
+  enable_dns_support   = true
+  enable_dns_hostnames = true

   tags = {
     Name = "movie-backend"

document.execCommandの代替(クリップボードへのコピー)

javascriptでdocument.execCommandを使ってクリップボードにテキストをコピーしているプログラムがあったんだけど最近のブラウザだとこのメソッド使えないらしく代わりになるものを探した。

クリップボードAPIってものがあってこっちを使えばいいらしい。クリップボードへのコピーの方法雑にググると現時点でdocument.execCommandが先に出てくる。

developer.mozilla.org

const target = document.getElementById('hoge')
target.readOnly = false;
const range = document.createRange();
range.selectNode(target);
window.getSelection().addRange(range);
document.execCommand('copy');
target.readOnly = true;

navigator.clipboard.writeText(value)

ただIEの場合はwindow.clipboardData使わないとダメかも

    if (window.clipboardData){
      window.clipboardData.setData("Text" , target.value);
    }

ブラウザごとの対応状況

developer.mozilla.org

terraformで AWS acmの取得、破棄を繰り返してたら上限超えたので緩和申請した

httpsを使いたくてterraformからAWS Certificate ManagerでSSL/TLS 証明書を発行してたんだけど使ってる個人AWSアカウントだと上限が10だったらしくてterraform applyとdestroyを繰り返してたら超えて発行できなくなってしまった。

対応

AWSのサポートセンターのページを開いて、Limit typeでAWS Certificate Managerを選択→上限30で申請出したら4日で返信きて上限緩和された。

上限30で申請出したけどなんか一気に1000に上げてくれた。割と最近作ったアカウントだと上限低かったらしい。