とり研

iPhoneアプリ開発とかプログラミングとかの話題。

「仙台iOS開発者の会 SWWDC#48 - WWDCキーノートを見る会」を開催します

swwdc.connpass.com

毎年恒例、WWDCキーノートをみんなで見る会を開催します。

今年はオフライン開催も検討したのですが、やはり会場の確保が難しいためオンライン開催といたします。

2時間くらい、ゆるく見る感じですかね〜。

『2022/03/10 19時- 仙台iOS開発者勉強会 SWWDC47 - Apple Special Event振り返り + LT会』 を開催します

swwdc.connpass.com

コロナ中も細々と続けてきた「仙台iOS開発者勉強会 SWWDC」が、2022年の1回めを開催いたします。

開催概要

今回も状況を踏まえ、オンライン開催になっております。

会の構成ですが、 * 第一部: 2022/03/09 に行われたApple Special Event の振り返り * 第二部: ライトニングトーク大会 の二本立てとなっております。

第二部: ライトニングトーク大会について

ここ最近のSWWDCはAppleのイベントを振り返る会が続いておりましたが、その結果、ここ2年ほどプレゼンの機会も少なくなり、アウトプットの場が少なくなっていました。

ですので、たまにはLTもやってみたいと思ってこのような形になりました。

申し込み

申込みは下記のconnpassからお願いいたします。

swwdc.connpass.com

【随時更新】AWS Certified Cloud Practitioner 学習ノート

はじめに

AWSに関しては全くの素人ですが、仕事に役立ちそうだし、まずは資格を取ろうと思い立ち「AWS Certified Cloud Practitioner」試験に向けて勉強することにした。 ここでは、日々学んだことを書き留めておく。というか覚える単語が多すぎて、ノートを取らないと覚えきれない。

参考書は以下を使用しています。

※注意:これ以降のノートは自分なりに解釈して書いています(参考書の内容をそのままブログに写すのはNGだと思うので)。そのため、誤っている可能性もあります。

EC2について

インスタンスの種類

  • リザーブドインスタンス
    • スタンダード:1年/3年間の契約
    • コンバーティブル : インスタンスの属性を変更できる
    • スケジュールドリザーブドインスタンス:現在は提供されていない
  • オンデマンド
    • 都度課金して使用
  • スポット
    • 格安だが、途中で止められてしまう場合がある。

ストレージ

インスタンスストア

内蔵ハードディスクのようなイメージ。ただし、インスタンスを終了すると消えてしまう。

EBS (Elastic Block Store)

外付けハードディスクのようなイメージ。 スナップショットでS3に保存可能。フルバックアップ→その後の増分を保存。

Amazon EFS (Elastic File System )

NASのようなイメージ。複数のEC2インスタンスからアクセス可能。

DB関連

Amazon RDS

リレーショナルデータベース。フルマネージド。マルチAZ対応は設定が必要。Aurora, Postgre, MySQL, MariaDB, Oracle, SQL Server。

DynamoDB

NoSQLデータベース。フルマネージド。デフォルトでマルチAZ対応。

ElastiCache

リアルタイムデータベース。インメモリ。フルマネージド型。マルチAZ対応は設定が必要。Redis、Memchached互換。

Redshift

リレーショナルデータベース。データウェアハウス、BI向け。データ解析が得意。

EMR

ビックデータ向け。フルマネージド型。HadoopやSparkなどのフレームワーク。

Athena

S3のデータをSQLで検索できる。

S3 Select (Glacier Select)

S3やGlacier内のCSVやJSONファイルをSQLで検索できる。 ※ Athenaとの違いがよくわからない...【AWS re:Invent 2017】S3 SELECTとAmazon Athenaの違い | Skyarch Broadcasting

ネットワーク関連

AWS Global Accelerator

ユーザーからリソースまでの経路を最適化。

Amazon CloudFront

  • エッジサーバーにコンテンツのキャッシュを配置
  • API Gatewayと連携可能
  • データ転送(out)とhttp(s)リクエスト数でコストが決まる

ネットワークACL(Access Control List)

VPC内の通信アクセス(in - out)を制御する仮想ファイアウォール

ELB

ロードバランサ。

Application Load Balancer とは? - Elastic Load Balancing

コンテナ関連

Amazon ECS (Elastic Container Service)

Docker コンテナオーケストレーションサービス

Amazon EKS (Elastic Kubernetes Service)

Kubernetes で コンテナを実行

Amazon ECR (Elastic Container Registry)

Dockerコンテナイメージを保存する

アカウント関連

AWS Organizations

アカウントグループを作ったり、ポリシーを適用したり。アカウント作成の自動化。

IAM

アカウントを作成・管理

ユーザー関連 (IAM)

付与対象

  • IAM ユーザー
    • 個人
  • IAM ユーザーグループ
    • ユーザーをグループ化したもの
  • IAM ロール
    • EC2などの個々のサービス

設定

  • IAM ポリシー

AWSリソース(ユーザー・ユーザーグループ・ロール)へのアクセス権限を設定

アクセス制限

セキュリティグループ

インスタンス単位。1つ以上のインスタンス(EC2やRDSなど)への通信を制御する仮想ファイアウォール。インスタンスごとに設定できるので、通常のファイアウォールよりもきめ細かい。

ネットワークACL

サブネット単位。VPC用。サブネットへのインアウトのトラフィックを制御するファイアウォール。

認証関連

AWS STS (AWS Security Token Service)

一時的な認証でアクセスできる。

アクセスキー

AWSサービスへのプログラム呼び出しを認証するために使用される

Amazon Cognito

アプリにサインイン機能を追加できる。Apple、Facebook、Google、Amazon などのアカウントでサインイン対応。

ログ・監査関連

Amazon CloudWatch

AWSリソースが対象。 AWSリソース(EC2など)のモニタリングを行う。CPU使用率など。

Amazon CloudWatch Logs

AWSリソースが対象。 AWSリソースのログを監視してアラート通知を送ったり出来る。

AWS CloudTrail

AWSアカウントが対象。 AWSアカウント内のAPI呼び出しを記録(= AWS内のすべての操作ログ)。

AWS Config

AWSリソースの変更を自動記録。

Trusted Advisor

AWSアカウントの状態を自動的にチェックし、アドバイスをレポート。

  • コスト最適化
  • パフォーマンス
  • セキュリティ
  • etc.

Amazon Inspector

EC2インスタンスの脆弱性調査。EC2にインストールして使用。

AWS Systems Manager

利用中のインフラを可視化。AWSリソースをグループ化したりして、管理する。

コスト計算・見積もり関連

Cost Explorer

コスト分析ツール。現在の使用状況を分析する。

TCO計算ツール

見積もりを行うツール。

セキュリティ関連

Amazon Inspector

EC2インスタンスを分析し、脆弱性をチェック。テンプレートに基づいて調査。

AWS GuardDuty

AWSアカウントをモニタリング。

AWS Shield

DDos攻撃に対する保護サービス。Standard(無料)とAdvanced(有料)がある。

AWS WAF

ファイアウォール(Web Application Firewall)。 適用対象は CloudFront, ALB (Application Load Balancer)、API Gateway。

自動構築関連

AWS CloudFormation

インフラ構成をテンプレート化しておき、一括起動できる。

AWS Elastic Beanstalk

アプリケーションを自動デプロイ。ソフトウェアが対象。

AWS OpsWorks

Chef や Puppetによる構成管理。インフラ構成の自動化。

オンプレとの連携・データ移行

AWS DMS (Database Migration Service)

データベースの移行サービス

AWS SMS (Server Migration Service)

サーバーのマイグレーションサービス

iOSDC Japan 2020 に参加しました #iOSDC #iwillblog

iosdc.jp

5年前の初回から、毎年参加しているiOSDCに、今年もまた参加しました。

今回は、新コロの影響もありオンライン開催です。ニコニコ生放送を使用し、各セッションでは事前録画されたものを放映する形式でした。

オンラインイベント初体験

このような、大規模なオンラインイベントへの参加は初めてですので、自分が感じたPros / Cons (良かった点 / 良くなかった点)をまとめてみたいと思います。

Pros オンラインイベントで良かったところ

  • 費用面
    • 地方から参加の場合、ざっくり4万円が浮く(往復新幹線(10000 x 2) + ビジネスホテル宿泊(8000 x 2) + その他)
    • 自分の会社は上記費用が会社から出ていたので良かったのだが、そうでない人は大きいのでは
  • 環境面
    • 昨年は、大学の教室ということでエアコンが寒かったり暑かったりということもあったが、今回はそれがない。快適。
    • セッションごとに、教室の移動がなくて楽だった。人気セッションで満席で入れないということもない。
    • 「ちょっと期待した内容と違うな...」といったセッションだった場合に、テレビのザッピングのように、すぐに他に行けるのも良い

Cons オンラインで良くなかったところ

  • 気分転換ができない
    • 年に一回くらいは東京に行くのは気分転換になっていたのだが、それが出来ない
    • そもそもGoto Travelでも東京は除外されていたくらいなので、仕方なし....
  • 懇親会がない
    • iOSDCは、懇親会で結構良いお酒が出るのでそれも楽しみだったのですが、今回は残念...
    • 事前に送付されたノベルティ箱に、「ビールなどが入っていないかな」と、密かに期待していたくらいですw

個人的には、 オンラインの方が色々と気楽でしたので、次回に現地開催に戻ったとしても、オンライン生中継を視聴できるような選択肢があるとありがたいです。

本編の印象

見たセッションの印象をメモっておきます。

  • Swift以外の開発として、Flutterが勢いある(?)
    • 「Flutter最高や!SwiftUIなんていらんかったんや!」というLTがあったり
    • 個人的にもFultterに興味が湧いた
  • SwiftUI, Combineのセッションもぼちぼち出てきているが、iOS13以上の縛りがあるので、まだまだこれからといった感じ
    • とはいえ、SwiftUI は iOS14 の Widget 実装では必須のようなので、そろそろ自分も始めたい
  • 長年続いているアプリのメンテナンスの話に共感
    • Objective-CとSwiftの混合でバグが出る...などは自分もさんざん苦労した箇所である

仙台iOS開発者勉強会 SWWDC43 - Special Event 2020を見る会 を開催します。

毎年9月恒例の、Appleの新製品発表会に合わせて、『仙台iOS開発者勉強会 SWWDC43 - Special Event 2020を見る会』 を開催します。

今回も、新コロの影響により、Google Meetを使用してのオンライン開催です。

内容は、新製品発表会のムービーを見ながら、参加者が発表にツッコミを入れたりして楽しむ会です。(iOSアプリ開発者の会なので、当然Appleユーザーが多いのですが、最近は発表に対して厳し目の意見が多いような...。)

一応、対象はiOSアプリ開発者です。そうでないかたも、「最近のAppleはどんなもんかね」という気分で参加されるのも歓迎です。

参加申込はこちらからお願いします↓↓ swwdc.connpass.com

ビールやコーラでも飲みつつ、まったり参加くださいませ。

「リファクタリング 既存のコードを安全に改善する」を読んだ

(※この記事は、会社の勉強会での発表を元に起こしたものです。そのため、若干端折って書いております)

内容

こちらの本の紹介です。

[asin:B01IGW5MG0:detail]

今なら、第2版が出ています。言語がJavaからJavascriptに変更になりました。

読んだ動機

  • 「リファクタリング」って言うけど、やってることは人それぞれだよね
    • もやっとする
    • 体系的におさらいする方がいいのでは?
  • 「リファクタリング」の基本を学びたい
  • 長い間積ん読であったが、コロナ自粛期間中に読んでしまおうと思った

そもそもリファクタリングとは

この本の定義では、リファクタリングとは↓

リファクタリング(名詞) 外部から見たときの振る舞いを保ちつつ、理解や修正が簡単になるように、ソフトウェアの内部構造を変化させること

動詞バージョンはこちら↓

リファクタリングする(動詞) 一連のリファクタリングを適用して、外部から見た振る舞いの変更なしに、ソフトウェアを再構築すること

リファクタリングを行う理由

  • ソフトウェア設計を改善する
  • ソフトウェアを理解しやすくする
  • バグを見つけ出す
  • より早くプログラミングできる

いつリファクタリングをすべきか

  • 3度めの法則
    • 似たようなコードを3回書いたら、まとめる
  • 機能追加の時
    • 理由1. 既存機能を理解するため
    • 理由2. 容易に機能追加出来ない設計を治す→機能追加作業
  • バグフィクスの時
    • 理由1. 既存機能を理解するため
  • コードレビューの時

リファクタリングの注意事項

  • 対象のユニットテストを書いてからリファクタリングすること
  • リファクタリングはバグの原因になりうる (これは、私の実体験でも多々あります...)

リファクタリング例

6章〜12章、270ページに渡りリファクタリングのパターンが紹介されているが、その中で 自分的にびっくりした手法 をご紹介します。

リファクタリング前のコード

※本に載っていた例を簡略化したものです。

// レンタルビデオ店で、レンタル商品の合計金額と獲得ポイントを計算・表示する機能
int amount = 0; // 合計金額
int points = 0; // 獲得ポイント

while(rentals.hasMoreElements()) {
  Rental each = rentals.nextElement();

  amount += each.getPrice();
  points++;
}

// 画面に表示
amountTextField = "合計金額は" + amount + "円です。";
pointTextField = "獲得ポイントは" + point + "ptです。" ;

上のコードの改善点はどこでしょうか...?
(1分間考えてみてください)
.
.
.
.
.
.

リファクタリング後のコード

// レンタルビデオ店で、レンタル商品の合計金額と獲得ポイントを計算・表示する機能
// 画面に表示
amountTextField = "合計金額は" + getAmount(rentals) + "円です。"   
pointTextField = "獲得ポイントは" + getPoints(rentals) + "ptです。" 

/// 合計金額を求める
func getAmount(rentals[Rental]) {
  int amount = 0; // 合計金額
  while(rentals.hasMoreElements()) {
    Rental each = rentals.nextElement();
    amount += each.getPrice();
  }
  return amount;
}

/// 獲得ポイントを求める
func getPoints(rentals[Rental]) {
  int points = 0; // 獲得ポイント
  while(rentals.hasMoreElements()) {
    Rental each = rentals.nextElement();
    points++;
  } 
  return points;
}

こういうコードは、「ループ回数が増えるので、良くない」と思っていたので、このように修正するのは意外でした...。

なぜこうすると良いのか?

  • ユニットテストが書ける
  • 修正前は、結果を直接UI要素に入れているので、テストは基本的に手動で行うしかない
  • 修正後は、計算処理がメソッドになっていて、入力と出力があるので、ユニットテストが書ける
  • 今回のような単純計算なら良いが、ポイントが複雑になってくると、いちいち手動テストするのはしんどい(* 例えば、「旧作映画を10本同時レンタルしたら+100ポイントキャンペーン」とか...)
  • 最近の計算機は十分速いので、この程度のループが増えても影響は少ない
    • 「1億本レンタルする人がいる」とかなら、大変そうですが...。

まとめ

  • リファクタリングのもやもやがスッキリ
  • なぜ行うのか?などの理由付けになる
  • 定番の技術書を読むのも良い
  • 「一般的に、こういうコードが良いコード」という安心感が得られる
  • 今回の例のようなコードは、自分は良くないコードと思っていたが...と気づくきっかけ。この本を読んでいなければ、気づかなかった

2018年を振り返る

swwdc.connpass.com

SWWDC39 - 忘年LT会 という催しがあり、今年を振り返る機会があったので、自分もやってみた。

lablog.tototti.com

今年の最初に、2018年の抱負なようなもの - とり研 というブログを書いていたので、それに対してどうだったかを振り返りたい。

優先度 ★★★ だったもの

iOS

こちらは今まで通りやって行きたい。 (中略) 今年は、新しいことを学ぶ時間を増やす。

達成度 90% : ありがたいことに、相変わらず続いている。とはいえ、ちょっとだけJavaScriptをやったりもした。

「新しいことを学ぶ時間を増やす」というのはそんなにできなかったので、-10%

SWWDC (仙台iOS開発者勉強会)

今年もいつも通り、気楽にやりたい。年6回くらい開催?かな。

達成度 83% : 合計で5回、開催できた 目標の 5/6 = 83%を達成しているので、まあ充分ではないでしょうか!

大きめのイベントや勉強会に参加

今年も、どこか大きめのiOSイベントに行きたい。

達成度 70% : 今年もiOSDCに参加しました。ただ、それ以外は行けていないので7割くらい。

統計・機械学習

今のところそういう仕事が無いのだけど、あったら本気出したい。

達成度 20% : そういった案件はなく...仕事駆動だと難しいですね。まあでも、2日間のディープラーニング研修というのがあったので、受講してみたりはしてました。

優先度 ★★ だったもの

スマートスピーカー

Amazon echo買ってみた。なかなか良い。音声入力のインターフェースに慣れるためにも、積極的に使っていきたいですね。

達成度 20% : 一応、サンプルアプリを動かすところまではやった。最近、家でAlexaの声を聴いてないですね...(飽きた可能性大)。

メディアアート・映像

ProcessingとかopenFrameworksとか、Unityなどに興味があるのだけど。仕事に結びつかないので、なかなか着手出来てない。今年は何かアクションを。

達成度 10% : 今年も何もしていないな...。見るほうでは、夏の AUDIO ARCHITECTURE展がすごくよかった。

マネジメントとか企画とか

仕事で受託開発していると、商品開発とかマーケティングとかをそんなに考えないので、補っていきたい。

達成度 15% : これも何もやっていないな...。どちらかというと、行動経済学とか、心理面の方が興味が湧いた。

優先度 ★ (たぶんやらないけど、何かあったらやる) だったもの

英語

仮想通貨関連

達成度 100% : 予定通り何もしなかった! よって、「たぶんやらない」という目標を達成した。

まとめ

  • トータルでは60%くらいは出来てるような気がします。
  • 来年も頑張りたいです(小学生並みの...)。