とり研

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

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

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

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

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

内容

こちらの本の紹介です。

今なら、第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%くらいは出来てるような気がします。
  • 来年も頑張りたいです(小学生並みの...)。

「iOSDC Japan 2018」参加報告メモ

日本国内最大のiOS開発者向けイベント「iOSDC」。今年も参加してまいりました。 そして、SWWDCで「iOSDC Japan 2018 参加報告会」をすることになりました。わー。

swwdc.connpass.com

報告会で、感想などを発表する事になったので、取り急ぎ、感想を箇条書きでまとめました。

私とiOSDC 2018

iosdc.jp

  • 3年連続3回目の参加
  • 前夜祭から最終日まで、ほぼすべての時間帯にいました
  • 今年は体力的にキツくて、セッションを聴かずに休憩してる時も多め
    • 体力面 : 東京 is 暑い(前夜祭・1日目は最高気温35度とかであった...)
    • 無限コーヒー(コーヒーが自由に飲める)や電源付きの席があり、休憩中も快適でした
  • 3.5日間は長い印象
    • 地方から行く人は、ホテルを確保するのも3泊だと結構しんどい.

Goodな発表まとめ

qiita.com

  • 今回は、サンプルのソースコードを用意している方が多くて、助かりますね

MicroViewControllerで無限にスケールするiOS開発

金の弾丸

差分更新関連

アンカンファレンス「ゲーム機のアーキテクチャを語る」

  • ポッドキャストrebuild.fm にたびたび出演されているhakさんが、ゲーム機について語るセッション
  • rebuild.fmを愛聴していて、かつ、ゲーム好きの私には俺得
  • 当日、急に告知があり、まさかと思い会場に入ったらほんとにゲーム機の話をしていた
    • iOSとはぜんぜん関係無い。だかそれが良い
  • ゲーム機のスペック資料を見てあれこれ話す仕組みは、「有田と週刊プロレスと」のようでした

DC18アプリ

  • 非公式のタイムテーブルアプリ。便利。
  • [バグ]24時間表示をオフにしていると、午後の予定が表示されない。
    • 本体設定に依存するところなので、テストしにくく、バグになりやすい
    • なぜバグに気付くかというと、仕事でカレンダーを扱っているので、暦関連のバグを見つけるため、本体設定を一般的ではないものにしているから
    • ここら辺のノウハウとかまとめても良いかもなあ(来年は改元もあるし)。
  • ちなみに、昨年(2017年)のアプリは、本体を和暦にしていると予定が表示されないバグがあった(のを見つけた)

やっててよかったスプラトゥーン

  • 懇親会でボッチの危機
    • 話題が無い…
    • (とりあえずビールと日本酒を飲んだ。美味しかったです。)
  • そのとき「ガチマッチが…」「ZAPが…」と会話している声が聴こえた
    • スプラトゥーンの話なら得意 → 話に混ぜてもらった
  • 結論:みんなSwitch買ってスプラトゥーン2やるべき くコ:彡

地方開催

  • iOSDCを福岡に招致したい」 というLTがあって、それは良いかもと思った
    • 「福岡に行ってみたい」「美味しいもの食べたい」というのが主な理由
  • 懇親会で「仙台は招致活動しないんですか?」と言われた
    • けど、大変そうですし、自分は招致活動はちょっと…
    • やる気がある若い人がいたら、応援したいです
    • 名乗り出てくださいッ!

FIFAランキングとイロレーティング

勤め先の社内勉強会で、ちょっとした統計の話題ということで、FIFAランキングとイロレーティングについて発表しました。 せっかくいろいろ調べたので、加筆してこちらにも書いておこうと思います。

FIFAランキング

FIFAランキング - Wikipedia

  • 国際サッカー連盟(FIFA)が発表している、ナショナルチームのランキング
  • 2018/7/19発表分から、ランキングの集計方法が変わる
  • 今後は「イロレーティング」を利用して集計されます
    • 日本の順位はおそらく40位くらいになります(現在は61位)
      • これまでの集計方法では、アジアやアフリカのチームは順位が上がりにくかった
      • 今回から地域の格差がなくなり、平等になります。
    • 7/19以降、「日本代表の順位がこんなに上がりました!」と報道されるかもしれませんが、「いやいや集計方法が変わったんだからそうでしょ」とツッコミましょう

イロレーティング

イロレーティング - Wikipedia

  • イロレーティングは直感的に分かりやすい統計手法で、対戦ゲームなどでも幅広く利用されています。

レーティングの仕組み

  • 平均的な強さのチームを1500点とする
  • 200点のレート差がある対局者間では、レートの高い側が約76パーセントの確率で勝利するように、点数をつける.
  • 自分よりレーティングが上の相手に勝つと、多くの点数を得られる。逆に自分よりレーティングが下の相手に勝っても、得られる点数は少ない

レーティング計算例

FIFAランキング - Wikipedia に掲載されている式で、実際に計算してみます。(各国のレーティングの数値は適当です。)

例1: 勝ち負けの場合

レーティング1700の日本🇯🇵が、1900のコロンビア🇨🇴と試合をして勝ちました。 (レーティング差200 = コロンビアの勝率0.76、日本の勝率は0.24)

  • 新🇯🇵 = 1700 + 50 * (1 - 0.24) = 1738
  • 新🇨🇴 = 1900 + 50 * (0 - 0.76) = 1862

例2: 引き分けの場合

レーティング1700の日本🇯🇵が、1800のセネガル🇸🇳と試合をして引き分けました。 (レーティング差100 = セネガルの勝率0.64, 日本の勝率は0.36)

  • 新🇯🇵 = 1700 + 50 * (0.5 - 0.36) = 1707
  • 新🇸🇳 = 1800 + 50 * (0.5 - 0.64) = 1793

集計しているサイト

サッカー

将棋

その他、スプラトゥーン2、動物タワーバトル、MJ(麻雀ゲーム)などオンラインゲームでも、これと似たようなレーティングシステムが(たぶん)使用されています

平成30年度春期 データベーススペシャリスト試験 に合格しました

平成30年度春期 データベーススペシャリスト試験 に合格しました。

f:id:tototti:20180621221815j:plain

午後1、午後2の得点のギリギリ感がすごい。 ボーダーラインすれすれですが、合格は合格なので良いでしょう。

誰かの役にたつかもしれないので、勉強法・参考書を書いておきます。

勉強法

  • とにかく過去問を解く
    • 情報処理試験でよく言われるのは、「過去問が大事」ということ
    • 確かに、同じような問題が出題される
    • 3年分くらいは解いたと思う。それを何回か繰り返し。電車の中で解説を読んだり。
    • 午後2は時間がかかって辛いので、1時間x2回に分けてやったりした。本番で集中力を保つためには、2時間連続でやるようがいいんでしょうけど。
  • 用語に慣れる
    • 試験に頻出の用語があるので、その漢字を手書きで書けるようにしておくのが大事
    • 例えば。それなりにDB使ってる人なら、テーブルが「第n正規形」か見ればわかると思うんですが、試験だと「推移的関数従属性」などの単語を使って説明をしないといけない
  • Nintendo Switchを封印する
    • 目につくところに置いてあると、スプラトゥーンをやってしまうので
    • テレビ接続・電源ケーブルを外し、棚の奥などにしまっておくと良いでしょう
    • でもフェスの日だけはやった(サザエが欲しかったので)
    • 2〜3週間ほどやりませんでしたが、復帰後のウデマエはそれほど落ちてませんでした

参考書

情報処理教科書 データベーススペシャリスト

情報処理教科書 データベーススペシャリスト 2018年版

情報処理教科書 データベーススペシャリスト 2018年版

この本は良かった。午後試験は、普通の人が普通に解いていったら、どうやっても時間が足りないと思う。 問題の傾向をつかんで、対策する必要があるわけですが、そういう部分が詳しい。 ゲームの攻略本みたいな感じでしょうか。

過去問と解説のPDFがWebでダウンロード出来るのもGood。

徹底解説データベーススペシャリスト本試験問題 (本試験問題シリーズ)

2018 徹底解説データベーススペシャリスト本試験問題 (本試験問題シリーズ)

2018 徹底解説データベーススペシャリスト本試験問題 (本試験問題シリーズ)

こちらの本も買いましたが、解説の文章がちょっと固くて、自分にはマッチしなかった。 大学の教科書のような感じ?