Amarronの日記

iOSやMac、Web系の記事を書きます。

iOSDC JAPAN 2020 感想 自分用メモ

iOSDCの概要

f:id:Amarron:20200921183322p:plain

iOSDC JapanはiOS関連技術をコアのテーマとした技術者のためのカンファレンスです。今回はオンライン開催です! iOSDC Japanと言えば日本中、世界中から公募されたスピーカーによる知的好奇心を刺激するトークと参加者間のコミュニケーションですが、オンライン開催となる今回も変わらず、そして今まで以上にお楽しみ頂ける企画を検討中です。 開催に関連するニュースは本サイトのお知らせや公式Twitterアカウントでお知らせします。是非フォローしておいてください。

開催概要 開催2020年9月19日(土)〜9月21日(月・祝) 場所オンライン 対象iOS関連技術およびすべてのソフトウェアエンジニア 主催iOSDC Japan 2020実行委員会 (実行委員長 長谷川智希 @tomzoh)

iosdc.jp

コメントが多かったトーク

  • 1位 GitHub ActionsでiOSアプリをCIする個人的ベストプラクティス / uhooi
  • 2位 AVAudioEngineでリアルタイムレンダリング / 八十嶋祐樹

全体の感想

  • ニコ生について
    • そもそもニコ生をあまりみないのでシリアルコードの入力など戸惑う
    • 家のネットワーク環境の問題かニコニコの問題か、高画質で見ると音が飛び飛びになる
    • リアクションが文字なので独特
  • 内容について
    • 動画やナレーションが豪華で力が入っている
    • 質疑応答などはDiscodeらしいので、少し物足りない(Discodeの使い方がよくわからなかった)
    • セッションとの時間の感覚があるので休憩が取りやすい
    • DMMの広告が多い
    • SwiftUIの話題が多い
    • カンファレンスに参加すると自分の知ろうとしていない分野の知識が増えて視野が広がった気がする
  • その他
    • 前撮りした動画を流す形で配信(ライトニングトークはライブ)
      • 後からyoutubeでも見れるので見たいセッションが重なっていても安心

自分が聞いたトーク

  • 9/20
    • Background Notificationで新聞紙面の大きい画像の自動ダウンロードを実現する / Takagi Go
    • 100人でアプリをリファクタリングして見えてきた、最強のiOSアプリ設計に求められること / Yuta Koshizawa
    • Flutter移行の苦労と、乗り越えた先に得られたもの / 桐山圭祐
    • 新規機能開発からモジュール分割を始めてみる / Ryo Izumi
    • エラーアーキテクチャ設計について考える / きちえもん
    • iPadOSDC: Multiple Windows / ひろん
    • 効率よくUIKitからSwiftUIへ移行する / josh
    • ライトニングトーク
  • 9/21
    • 詳解Storyboard / 日向強
    • 継続的にアプリのパフォーマンスを計測する / kariad
    • クックパッドが、革新的な方法でまったく新しい買い物体験を皆様にお届けします」 / 藤坂 祐史
    • 大解剖!UIColorファミリー / しもとり
    • SwiftUIを導入したアプリ設計 / Yu Tawata
    • Apple Silicon への長い道 / hak
    • ライトニングトーク

9/20

Background Notificationで新聞紙面の大きい画像の自動ダウンロードを実現する / Takagi Go

speakerdeck.com

  • 背景
    • コンテツの自動ダウンロード
      • 快適なユーザ体験
      • 通信環境
    • 的配信コンテンツ
      • 寝ている間にアプリへ配達
      • ユーザーを逃さない
    • 通信量はそれなりのサイズ
  • iOS Background Mode
    • Background Mode
      • f:id:Amarron:20200921183255p:plain
      • 制約
    • Backgroundでダウンロードする方法
      • Background App Regresh Task(iOS 13.0+)
      • Background Notification(iOS7.0+)
        • push型
        • 許諾は必要なし
      • Background Transfer Service(iOS7.0+)
    • 「Background Notification(iOS7.0+)」採用
  • 全体的なアーキテクチャ
    • f:id:Amarron:20200921183301p:plain
  • 細かいTips
    • Background Notificationの性質に対処
      • 実行確率を上げるため、複数回送る
      • Background Notification自体を複数種類作らない
    • OS側が止めてしまうことを前提としたロジック
      • 排他制御のミスに気をつける
      • 最小限の単純なロジックにする
    • 提示できる状態はなるべき明示的に周知
    • Background Notificationに通知の許諾はいらない
    • Background Push Notificationの動作確認
      • 通知が必要なので、基本的に実機が必要
    • (ちなみに)Simulatorで通知を操作する
    • 運用すると課題が見えてくる
      • アクセスのピークが発生する
    • 端末側の問題
      • 端末による成功率の違いが如実に
    • OSによって落とされにくいアプリへと改善する
  • 安定して受け取るために
    • 利用するBackground Modeの選択
    • 動かしたい時間帯の考慮
    • アプリ本体は健康

100人でアプリをリファクタリングして見えてきた、最強のiOSアプリ設計に求められること / Yuta Koshizawa

SwiftUIで作るリバーシアプリ - github

  • 設計に見られた共通項
    • Presentation Domain Separation(PDS)
    • Enterprise Business Ruleの分離
    • 状態遷移の整理
    • 依存関係逆転の原則(DIP)
    • 一方向のデータフロー
    • 静的型の活用
  • Presentation Domain Separation
    • Presentation(UI)とDomain(ロジック)を分離する
    • Clean Architecture
    • モジュールを分ける方法
  • Enterprise Business Ruleの分離
    • Enterprise Business Ruleとは、アプリに依存しない汎用的なルール
    • オセロ
      • Disc・・・おせろ、白黒の状態を持つ
      • Board・・・オセロの数、挟んだら色が変わる
      • Game・・・ゲームの状態(ゲーム中/終了)、どちらの番とか(対戦相手がマニュアルかコンピュータかはゲームに含めない)
  • 状態遷移の整理
    • f:id:Amarron:20200921183300p:plain
  • 依存関係逆転の原則(DIP)
    • デリゲートで依存関係を逆転される(Presentation -依存-> Domain の形にする)
    • 他の方法
      • DI
      • Combineによる変更通知、値型による変更通知
  • 一方向のデータフロー
  • 静的型の活用

Flutter移行の苦労と、乗り越えた先に得られたもの / 桐山圭祐

  • Flutterとは
  • 話すこと
    • Flutterを採用して実際どう立ったか
      1. どんな技術的課題に直面したか
      2. 乗り越えた時のメリット
  • じゃらんおFlutter移行
  • 前提の共有
    • Flutterへの段階的移行
      • Add-to-appを使用
        • FlutterViewController
        • FlutterView
        • FlutterEngine ← Dartのコードを実行している
      • 既存のネイティブプログラムに組み込む
    • Flutterのレイアウト構築
  • 直面した課題
    • タブ切り替えのパフォーマンス
    • Flutterの画面が初期化されない
    • ネットワーク通信がproxyサーバを経由しない
    • Google Mapのクラッシュ
  • タブ切り替えのパフォーマンス
    • リストのアイテムを大量に読み込んでタブを切り替えると重い、またはクラッシュする
    • どう回避したか
      • AutomaticKeepAliveClientMixinを適用することで、画面をクリアさせない
  • Flutterの画面が初期化されない
    • Flutterの画面を再度開くとFlutterの画面だけ、前回の画面が残る
    • どう回避したか
      • FlutterViewControllerは初期化されていたが、FlutterEngineが初期化されていなかった
      • FlutterEngineを初期化すると時間がかかる
      • 初期画面を明示的に呼び出す処理を書く
  • ネットワーク通信がproxyサーバを経由しない
    • Flutterだとproxyサーバを経由できない
    • どう回避したか
      • PACを指定する
  • Google Mapのクラッシュ
    • google_maps_flutterを使うとメモリが解放されないため何度も利用しているとクラッシュされる
    • どう回避したか
      • google_maps_flutterのバージョンが上がったことでメモリが正しく開放されるようになった
  • 直面した課題まとめ
    • 致命的なものはなかった
  • メリット
    • 開発効率の向上
      • 規制部品の充実
        • Widgetの種類がとて充実
      • hot reload/ restart
        • ビルドが即時に反映される
      • IDE(Android Studio)の機能の充実
    • 工数の削減
    • 上記以外のメリット
      • 宣言的UI構築が素晴らしい
      • FlutterはOSSであるので、内部処理を確認できる
      • など

新規機能開発からモジュール分割を始めてみる / Ryo Izumi

speakerdeck.com

  • マルチモジュール
  • 新規機能からモジュールを分割する
    • 新しい施策の機能をモジュールに分割する前提で設計する
  • 手順
    1. 要件、使用の整理
    2. 責務を決める
    3. input/outputを定義
    4. framework
    5. 開発
  • メリット
    • 通化すべき部分が見えてくる
    • 既存コードに囚われなくなる
    • 影響範囲の縮小
  • デメリット
    • プロジェクトファイルのコンフリクト
      • XcodeGenを導入するべきだった
    • モジュール分割の単位が機能単位になる
    • 抽象度が上がるので実装がどこにあるか分かりにくくなる可能性

エラーアーキテクチャ設計について考える / きちえもん

speakerdeck.com

  • モチベーション
    • エラーをいい感じに扱いたい
  • 環境
    • RxSwift
  • エラーの種類
    • enumで定義することでなんのエラーがあるかわかる
  • 固有エラーは個別定義
  • 問題点
    • エラーケースを方で表現できない
    • エラーケースの漏れが発生
    • 機能固有のエラーケースを個別に処理できない
  • 改善
    • 型で制約をかける
    • 列挙型を利用する
    • 固有エラーは個別に処理する
  • 2種類のユースケース
    • 基本コース:晴れの日のシナリオ
      • すべてが上手く行ったシナリオ
    • 代替コース:雨の日のシナリオ
      • 何かしらうまくかなかったシナリオ
  • 雨の日のシナリオを考えるのがエラーアーキテクチャ
  • エラーアーキテクチャ設計まとめ
    • f:id:Amarron:20200921183314p:plain

iPadOSDC: Multiple Windows / ひろん

speakerdeck.com

  • iPadOS
  • Multiple Windows
    • 複数のスペースで同じアプリを開いて作業する
    • メモの動作
      • SplitViewで同じアプリの別ウィンドウを並べられる
      • メモのアイテムをドラックすると別のウィンドウを開くことができる
      • Appスイッチャーや、AppExposeでウィンドウを閉じることができる
  • 予備知識
    • 1つのアプリのプロセスは従来どおり1つ
    • ここまで「スペース」や「ウィンドウ」とよんできたものは「シーン」に相当
    • 全面に表示されていないシーンは切断されたり、そもそも接続されてなかったりする
  • 登場人物図
    • f:id:Amarron:20200921184540p:plain
  • サンプロコード
  • Step 1 シーンは簡単
    • Xcode11で新規プロジェクト作成
      • iOS13以降で考える(iOS12で対応すると大変)
    • info.plist に Scene Manifest を追加
    • SceneDelegate クラスを作る
      • 今までは画面のライフサイクルに関する通知はAppDelegate
      • Sceneごとにの通知はSceneDelegateが呼ばれる
    • AppDelegate から SceneDelegate へ引っ越し
  • Step 2 複数のシーンをサポート!戦いの始まり
  • Step 3 シーン状態の保存ならオレにまかせろ
    • NSUserActivity
      • アプリの状態を表現するクラス
    • OSからの要求に答える
    • 状態の復元
    • 状態の保存はシーン API の機能
  • Step4 プログラムから新しいシーンを展開
  • Step4(2) プログラムから新しいシーンを閉じるようにしたい
  • その他のトピック
    • シーンのライフサイクル
      • f:id:Amarron:20200921184545p:plain
    • シンクロナイズドシーン
      • 片方の画面を更新したらもう片方に反映したい
      • 特別な方法があるわけではない
        • KVM、NotificationCenter、Combine、他
      • データが単方向に流れていると同期しやすい

効率よくUIKitからSwiftUIへ移行する / josh

speakerdeck.com

  • Why move to SwiftUI
  • Why not move to SwiftUI
    • バグが多い
    • 古いOSに対応していない
    • 複雑な画面に対応できない場合がある(ヒューマンインターフェースガイドラインに準じていない場合もある)
  • Modernize Swift usage
    • Objective-CをSwiftへ移行する
    • Swiftのバージョンを新しくする
  • Modernize UIKit usage
    • Storyboardを分ける
  • Plan and prototype
    • プロトタイプのアプリを作って、実験する
  • Architecture
  • Two approaches
    • 末端の画面からSwiftUIへ変更している
  • Tips
    • 画面内でUIKitとSwiftUIを混ぜない
    • 簡単な画面からSwiftUIへ切り替えていく
    • 急ぎすぎない(無計画に進めると大変なことになる)
    • SwiftUIとCombineを事前に勉強しておくことが大事

ライトニングトーク

  • Catalystに対応したアプリをリリースするまでのリジェクト集 / かっくん
    • Macだと考えることが少し多い
  • In App Purchaseのこれからの在り方を考える / Yuki Yamamoto
  • iOS Custom Keyboards でできること/できないこと/やってはいけないこと / Kyome
    • できること
      • 好きなキー配置、特殊な記号、背景を変更
    • できないこと
      • キーボードだけをAppStore配信できない
    • やってはいけない
      • 余計な機能を搭載
  • DroidKaigiの公式アプリで始めるiOSアプリのOSSコミッターへの道 / 遠藤拓弥
    • 修正が認められなかった
      • issueに取り込む前に修正範囲を明確にしていなかった
      • 確認が足りなかった
    • この経験を活かして次は修正したところ無事コミットできた
  • Apple Pencilと左利き対応 / ああうえ
    • ツールバーの位置について(右利きは右側、左利きは左側)
  • ダークモード対応とAutoLayoutアニメーションと私 / Abebe
  • macOS仮想カメラ「テロップカム」実装方法とその先 / 服部 智
    • CoreMediaIO DAL Plugin
    • NSPasteBoard
  • 文字列をコピーできるスクリーンショットを作る / えんどう
    • なぜPDFは文字列をコピーできるのか
      • PDFに文字情報を持っている
    • なぜ文字列をコピーできなかったのか
      • 文字情報を持っていなかった
    • 文字列をコピーできるPDFを作るには
      • ViewをそのままPDFに出力する
  • あなたのアプリ、✨リブランディング✨できますか? / monoqlo
  • iOSアプリを譲渡!?失敗は許されない一発勝負!予想外に立ち塞がる様々な罠に挑んだストーリー / じんむ

9/21

詳解Storyboard / 日向強

speakerdeck.com

  • UIHostingController
    • 内部にSwiftUIを持つことができるViewController
  • IBSegueAction
  • リストア機能
    • Restoration
      • SceneDelegateでは使えない
  • Storyboardを分割する
  • Localization
  • テキストにundoをつける
  • OSバージョンごとにStoryboardを差し替える
  • 様々な画面に対応する
  • ActionはObject化する
  • Delegate
    • Collectionで返すと複数のActionを呼べる

継続的にアプリのパフォーマンスを計測する / kariad

speakerdeck.com

  • アジェンダ
    • なぜパフォーマンス計測が必要なのか
    • iOSアプリにおけるパフォーマンス計測
    • 継続して計測する仕組みの作成
    • 運用してみて
    • これから
  • なぜパフォーマンス計測が必要なのか
    • 重い、クラッシュする
  • iOSアプリにおけるパフォーマンス計測
    • 代表例
      • Instruments,MetricKit、外部サービス
    • Instruments
      • どこのパフォーマンスが悪いのか分析、特定する機能をサポート
    • MetricKit
      • iOS13から利用可能
      • 起動時間、CPU使用時間、バッテリー消費、クラシュなど
      • ユーザの操作の計測
    • 外部サービス
      • FireBase、HeadSpin
  • 継続して計測する仕組み
    • パフォーマンスが悪くなってからでは遅い
    • 継続的な計測で必要なもの
      • 計測ツール
        • Instrumentsを採用
      • 最新のアプリ
        • 毎日の更新に追従した最新のアプリで継続
        • releaseビルドと同等の最適化されたアプリで計測
          • ipaのresignを利用した
      • 実機
        • 自前で管理はコストが高い
        • クラウド型のデバイスファーム
          • f:id:Amarron:20200921184548p:plain
          • HeadSpin
            • 様々なパフォーマンス計測もできるデバイスファーム
          • Appium
      • CI
        • 今回の計測では2種類
          • 計測対象のアプリをビルド、resignする
          • 計測を行う(負荷ツールを動かす)
        • Jenkins
          • Jenkins自体の管理が必要
          • 脱Jenkinsを目指している
    • アプリ操作用のUITestフレームワーク
      • Appium
    • アプリに負荷をかけるツール
    • この構成で起きた問題
      • Appium serverの問題
        • Xcodeのバージョンの問題
        • traceファイルの保存先
      • Instrumentsの問題
        • 計測結果を定量的な数値で取得する方法がない
  • 実際に運用してみて
    • 問題点
      • Appiumの不安定さ
      • 実行パターンの増加
      • 季節
      • インカメラの利用
      • 結果確認フローの問題
    • 運用した結果の変更
      • f:id:Amarron:20200921184557p:plain
  • これからの展望
    • xctrace
      • Xcode12からInstrumentsコマンドがdeprecatedとなりxctraceが追加された
    • Bitrise(MacStadium)への移行
    • 他項目の計測

クックパッドが、革新的な方法でまったく新しい買い物体験を皆様にお届けします」 / 藤坂 祐史

  • 全く新しい買い物体験 クックパッドマート
    • 課題
      • 実店舗だと品揃えや並びなど
      • ネットだと送料や1品だと買えないなど
    • クックパッドマート
      • 送料無料で1品からでも買える
      • 専用冷蔵庫
        • 好きな時間、好きな場所で受け取りOK
      • 注文アプリ、配送アプリ
      • 技術的な取り組み
        • 配送アプリ・・・配達員専用アプリ
          • ドライバの位置情報を常にオンにする
          • puree
    • クックパッドアプリの「買い物」機能
      • レシピから買い物へ
      • 新機能の画面はSwiftUIで実装している
      • SwiftUIを導入すべきか?
        • f:id:Amarron:20200921184603p:plain
      • SwiftUIで良かったこと
        • Viewの組み立てが楽
          • 状態のあるUIがわかりやすい
          • データを入れるだけで、良きに再描画される
          • コンポーネント単位で使いまわし、可変しやすい
          • スタイル調整も楽

大解剖!UIColorファミリー / しもとり

speakerdeck.com

  • 話すネタ
    • UIColorにはサブクラスがいっぱい
    • サブクラスの紹介
    • UIColorのサブクラス自作は結構難しい
    • UIColorのメソッドの挙動を見る
  • UIColorにはサブクラスがいっぱい
    • サブクラスは18個ある
    • デザインパターン
      • Class Cluster
        • サブクラスが複雑な処理をしてくれる
  • サブクラスの紹介
    • f:id:Amarron:20200921184610p:plain
    • UIPlaceHolderColor
      • 何か特定の色を指しているわけではない
    • UI(Cached)DeviceRGBColor
      • RGBで指定される色のクラス
    • UIDynamicColor
      • traitの変化に応じて動的に変わる
        • systemBlueなど
      • Asset Catalogから得られる
    • その他フレイムワーク
      • UICIColor
        • CIColorを受け取って
      • UIPatternCGClor
      • NSColor
  • UIColorのサブクラス自作は結構難しい
    • UIColor直下に作る簡単なものならOK
    • privateのサブクラスに作るのは難しい
  • UIColorのメソッドの挙動を見る
    • isEaual(to:)
      • 同じ色でもサブクラスが違うと等しくならない

SwiftUIを導入したアプリ設計 / Yu Tawata

speakerdeck.com

  • アジェンダ
  • 設計の目標
  • SwiftUI
    • 考慮すべき要件
      • 機能
        • 複数のアプリ起動経路
      • 非機能
        • アナリティクスの画面遷移
    • 複数のアプリ起動経路
      • UIKitの場合
        • Coordinator
      • SwiftUIの場合
    • UIKitをベースにしてSwiftUIを実装する
  • 検証
    • 次のクラスでSwiftUIを利用できるか
      • UITableView
      • UICollectionView
  • アーキテクチャ
    • f:id:Amarron:20200921184613p:plain
    • フロー
      • f:id:Amarron:20200921184619p:plain

Apple Silicon への長い道 / hak

  • SoCの歴史
    • AAPL0098
    • AAPL0298
    • AAPL0398 / A4
    • AAPL498, 2498, 7498 / A5
    • AAPL5498 / A5X
    • A6 / X
    • A7
      • 64bit
    • A8 / X
    • A9 / X
    • A10 Fusion / X
      • Big/Small コア
    • A11 Bionic
    • A12 Bionic / X / Z
    • A13 Bionic
  • Apple Silicon

ライトニングトーク

  • 本当はこわいLLDB / みやし
  • iOS 13における Siri Shortcuts 最小実装+α / 明渡麻衣花
    • NSUserActivityを利用する
  • xcrun Essentials / Yutaro Muta
    • xcrunとは
    • xcrunを使う
      • xcrun simctl
      • xcrun xccov
  • Swiftで分かるSOLID原則 / 川口 航平
    • 単一責任の原則
    • リス古布の置換原則
    • 依存性逆転の原則
  • SwiftUIとFlutter / tamappe
    • Flutter最高
    • SwiftUIとFlutterは似ている
  • 100人以上の中高大学生にiOSアプリ開発を教えていて感じたこと / とし
    • プログラミング
      • 一緒にやる、自分でやってみるのフロー
      • 何度でも説明など
    • アプリについてきちんと考えられるのか
  • Feature Flagを適切に分類することでA/Bテストの運用コストを下げる / Takeshi Ihara
    • A/Bテスト + Feature Flag
    • Feature Flagの分類(生存期間、変更規模を考える)
      • Release Flag
      • Ops Flag
      • Permission Flag
      • Experiment Flag
  • CryptoKitとCoreBluetoothを利用したスマートキー開発 / saiten
    • 車の鍵をiPhoneで開く
    • RxBluetooth
    • CryptoKit
  • Apple Low-Latency HLSを使った超低遅延配信について / meteor
    • 遅延
    • HTTP Live Streaming
    • CMAF
  • 着信時氏名表示させたいエンジニア vs 簡単には着信時氏名表示できない電話番号 (iOS13対応版) / 栗山 徹
    • 0はじまりでない電話番号で氏名が表示できない

Swift5 SwfitUI

概要

  • Swift5とSwiftUIを調べたので、参考にした使用や感想、調べた内容などを備忘録的に残します。
  • Swift2までの知識はあるので、変更点や個人的な印象期な内容を記載します。(今の仕事ではあまりSwiftを使っていないです。)
  • 動機としては、個人でアプリを久しぶり作りたくなったので、学習も踏まえ調べました。

参考資料

swift:swiftの復習用
swift5:swift5の学習用
swift ui:swfit uiの学習用

目次

  1. 感想
  2. swift
  3. swift5
  4. swift ui

1. 感想

  • Swift
    • リッチな機能が増えていてびっくり
    • 型が省略されすぎて、頭の中で整理するのがなれるまでは大変そう(洗練されているから?)
  • Swift5
    • ABIが良さそう(今後のメンテナンスコストが少なくなりそう)
    • Swift5_Cheet_Sheet.pdfが、標準ライブラリの更新を重点的に整理させれていて助かる
  • SwiftUI
    • SwiftUIで用意されていない画面の挙動を実装するのが大変そう(クラアンとの要求に絶対に答えるみたいな開発ではどこかで破綻しそうな気がする)
    • 結構ボリュームがある
    • チュートリアルがかなり充実している。(サンプルコードもあって親切)
    • xibとプログラムが一致していて嬉しい
    • 実装結果がリアルタイムに反映されるPreview画面(エミュレータみたいのが常に表示されていて、修正が即座に反映されるの)は、かなり作業が捗る
      • なぜか新しいクラスを作ったあとはpreviewコンパイルエラーになることが多かった(その都度クリーンビルドやXcodeの再起動などを行った)
    • プログラムが今までと結構違うので、コーディングが最初は戸惑いそう
      • ViewControllerとかもう作らない?
      • UIViewのbodyに各Viewを追加していく?
      • セルはTableViewCellを継承してつくるのではなく、bodyの中身をCellにする感じっぽい
    • 書き方はSwiftUIのほうがエレガント(直感的で無駄が少なくて)で良い
      • サイズを指定するときに費用な項目だけ設定できるとか
      • Viewが、ブロックを組み合わせるようなモジュール感があって汎用的に作りやすそう
    • SwiftUI Essentialsだけ実際に書きながら試す(Drawing and Animation、App Design and Layout、Framework Integrationはどんなことができるのか眺める)
      • アイコンのような複雑な図形やグラフ、アニメーション、横スクロールのリスト、オーバーレイ的な画面表示

2. swift

A Swift Tour

英語が辛いのでThe Swift Programming Language 日本語訳を利用。
playgroundでめぼしいところを実践してみる。 プログラムを書く時に、再度Swift ツアーを確認すると良さそう。(最初から全部完璧に覚えるのは大変なので、ざっくり何が書いてあるかだけ覚える)
「2. 言語ガイド」は量が多いので、「2. 1. 基本」だけ見て、それ以降は興味がある箇所を読む。 以下、印象に残ったところ。

    1. Swift にようこそ
        1. Swift ツアー
      1. 1.2.3. 関数とクロージャ
      2. 1.2.4. オブジェクトとクラス
        • set,get
        • willSet,didSet
      3. 1.2.5. 列挙型と構造体
        • enumは定数用、structは構造
          • struct:人間
        • 1.2.6. プロトコルとエクステンション
          • extention
            • Int型とかでも拡張できる
        • 1.2.7. エラー処理
          • defer
            • 関数がリターンする前に常に実行されるコードブロックを記述する
        • 1.2.8. ジェネリクス
          • Equatable
            • Object同士の比較
      1. 言語ガイド
      2. 2.1.9. タイプエイリアス
        • typealias
          • タイプエイリアスは、既存の型に別の名前を定義すること
      3. 2.1.11. タプル
        • タプルは、複数の値を 1 つの複合値にグループ化します

3. swift 5

Swift 5の導入
Swift 5では、Appの配信が劇的に改善されます。SwiftランタイムがiOS、macOS、tvOS、watchOSに組み込まれるようになったため、最新のOSリリースではランタイムライブラリをAppにバンドルする必要がなくなります。Swiftで作成したAppをユーザーがApp Storeからダウンロードすると、従来よりも小さいサイズのAppがより速くダウンロードされます。
その他の機能
String型がUTF-8エンコーディングで再実装されたため、より高速なコードの実行が期待できます。
デバッグ用ビルドとリリース用ビルドの両方で、メモリへの排他アクセスがデフォルトで必須になりました。
SIMD VectorおよびResult型が標準ライブラリに追加されました。
DictionaryとSetのパフォーマンスが改善されました。
動的に呼び出し可能な型をサポートするようになり、Python、JavaScript、Rubyといった動的言語との相互運用性が強化されました。

https://developer.apple.com/jp/swift/
  1. Swift.org - Swift 5 Released!を読む。
  2. 言語の更新
    • 安定したABIとバイナリの互換性
      • ABIの安定性など
      • ABI安定後のAppleプラットフォームでのSwiftの進化
    • 標準ライブラリの更新
      • Swift 5は、Swift Evolutionプロセスからの次の標準ライブラリの提案を実装しています。
        • SE-0200 未加工テキストをサポートするための文字列リテラル区切り文字の強化
        • SE-0211 UnicodeプロパティをUnicode.Scalarに追加
        • SE-0214 DictionaryLiteralタイプの名前をKeyValuePairsに変更
        • SE-0215 Never型がEquatableとHashable型に準拠した
        • SE-0218 compactMapValuesにdictionary型を導入
        • SE-0221 キャラクタープロパティ
        • SE-0225 isMultipleをBinaryIntegerに追加
        • SE-0228 ExpressibleByStringInterpolationを修正
        • SE-0229 SIMD Vectors
        • SE-0232 標準ライブラリのコレクション階層からいくつかのカスタマイズポイントを削除します
        • SE-0233 数値に新しいAdditiveArithmeticプロトコルを洗練させる
        • SE-0234 Sequence.SubSequenceを削除
        • SE-0235 標準ライブラリにResult型を追加
        • SE-0237 withContiguous {Mutable} StorageIfAvailableメソッドの導入
        • SE-0239 Range関連をCotableプロトコルに準拠した
        • SE-0241 文字列インデックスのエンコードオフセットを非推奨
    • 追加の言語およびコンパイラの更新
      • Swift 5はデフォルトで、デバッグビルドとリリースビルドの両方でメモリへの排他的アクセスを強制します。
      • また、Swift 5は、PythonJavaScriptRubyなどの動的言語との相互運用性を向上させる動的呼び出し可能型をサポートしています。
      • Swift 5は、Swift Evolutionプロセスからの次の言語提案も実装しています。
        • SE-0192 将来の列挙型ケースの処理
        • SE-0213 強制によるリテラル初期化 -
SE-0216 ユーザー定義の動的に「呼び出し可能な」型を導入
        • SE-0224 コンパイル条件で「小なり」演算子をサポート -
SE-0227 IDキーパス -
SE-0230「try?」の結果としてネストされたオプションをフラット化します
    • パッケージマネージャーの更新
      • Swift Package Managerには、依存関係ミラーリング、ターゲット固有のビルド設定、カスタマイズされた展開ターゲット、コードカバレッジデータを生成する機能など、Swift 5の多くの新機能が含まれています。
      • さらに、このswift runコマンドには、実行可能ファイルをビルドする必要なく、REPLにライブラリをインポートする機能が含まれています。
      • Swift 5は、Swift Evolutionプロセスからの次のパッケージマネージャーの提案を実装しています。
        • SE-0219 パッケージマネージャーの依存関係のミラーリング
        • SE-0236 パッケージマネージャープラットフォームの展開設定 -
SE-0238 パッケージマネージャーターゲット固有のビルド設定
  3. Swift5_Cheet_Sheet.pdfを読む。 -「Swift.org - Swift 5 Released!」の内容がわかりやすく説明されている
  4. What's New in Swiftを見る。

4. swift ui

  • 環境構築
    • iOS15
    • Xcode11
  • SwiftUI Tutorialsを進める。
    • SwiftUI Essentials
      • Creating and Combining Views
      • Building Lists and Navigation
      • Handling User Input
    • Drawing and Animation
      • Drawing Paths and Shapes
      • Animating Views and Transitions
    • App Design and Layout
      • Composing Complex Interfaces
      • Working with UI Controls
    • Framework Integration
      • Interfacing with UIKit
  • Note
    • VStack/HStack・・・画面部品を縦並び、横並びに整理して表示する
    • UIViewRepresentable
      • makeUIView(context:)・・・ビューオブジェクトを作成し、その初期状態を構成します。
      • updateUIView(_ :context:)・・・・指定されたビューの状態をSwiftUIからの新しい情報で更新します。
    • TableView
      • NavigationView // TableView
        • List(dataList, id: .id) { data in // Cell
          • NavigationLink(destination: DetailView()) { // IBAction
            • DetailView(data: data)
    • Data
      • @Published・・・プロパティの値変更を通知する属性マーク
      • @EnvironmentObject・・・修飾子が親に適用されている限り、自動的に値を取得する
// TableViewの例
struct LandmarkList: View {
    var body: some View {
        NavigationView { // TableView
            List(landmarkData, id: \.id) { landmark in // Cell
                NavigationLink(destination: LandmarkDetail()) { // IBAction
                    LandmarkRow(landmark: landmark)
                }
            }
            .navigationBarTitle(Text("Landmarks"))
        }
    }
}

SwiftUI Essentials

ContentView.swift
import SwiftUI

/*
 デフォルトでは、SwiftUIビューファイルは2つの構造を宣言します。
 最初の構造はViewプロトコルに準拠し、ビューのコンテンツとレイアウトを記述します。
 2番目の構造は、そのビューのプレビューを宣言します。
 */
struct ContentView: View {
    var body: some View {
        Text("Hello World")
    }
}

struct ContentView_Preview: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

iPhone simロック 解除 - au から UQモバイル へ -

f:id:Amarron:20171213220928p:plain

  • 2017年12月に、 au から UQモバイル格安simに変更したので個人用のメモ
  • 率直な感想としては、格安simに切り替えるのは良かったが、切り替えるのは au 回線ではなく docomo 回線を使っている キャリアにしとけば良かった
  • 内容について
    1. 動機
    2. 変更内容
    3. 変更の流れ
    4. 感想
    5. 利用料金

1. 動機

  • 格安simに変更したい理由
    • 一番の理由は、料金が安い
      • 毎月9,000円くらい払っているのが3,000円くらいになる
    • 海外旅行に行ったときに、海外simフリーを入れ替えて使えるのが良い(実際は端末の問題らしいので特に関係なさそう。。。)
  • UQモバイルを選んだ理由
    • auの回線と同じ回線を使っていたため(au回線で困ったことがなかった)

2. 変更内容

内容 変更前 変更後
端末 iPhone6 iPhoneX
キャリア au UQモバイル
料金/月  9,000円 2,980円(プランM)

3. 変更の流れ

個人で行ったことなので正式な手続きではなく、無駄な手順がありますが記録ように書いています。 簡単に手順を3行で書くと
1.iPhoneX購入
2.sim切替
3.キャリア切替
みたいな感じです。

  1. simロック解除方法を調べる
  2. iPhoneX を購入
    • Apple Store で iphoneX を購入
    • iPhone6のsimをiphoneXに入れ替えるが、そのままでは使えない
    • au へ問い合わせる(simの入れ替えについて)
      • iPhone6とiPhoneXでは使えるsimが違うので契約の変更が必要
      • その手続きは店舗でないとできないと言われる
  3. simの変更
  4. simロック解除方法を調べる
    • My ausimロック解除が可能か調べる
      • 解除不可判定
    • au へ電話で問い合わせる(解除不可判定について)
      • 店舗でsimロック解除の手続きが追加(¥3,000)で必要と言われる
        • 前回店舗での手続きでは、iphonexへの移行手続きだけしかされていない
        • au以外から購入した場合、問い合わせでのsimロック解除を受け付けていないので再度店舗で手続きしてほしい
        • auで購入した端末は101日以上経過していないとsimロック解除できない、appleにも同じような規約があるかもしれないので確認した方が良い
    • appleへ問い合わせる
      • iphonexは全てsimロック解除対象の端末であり最低利用期間など設けていない
  5. UQモバイルへ申し込む
  6. simを変更する

4. 感想

  • 変更作業についての感想
    • そもそもsimカードやキャリアについて詳しくないので理解するのが面倒(sim解除simフリー格安sim?docom回線、au回線?2年縛り?番号ポータビリティ?)
    • 手順が多い(ただし、切り替え自体(「5. UQモバイルへ申し込む」以降)は楽に進んだ)
    • iPhoneau側で購入するとsimロック解除制限期間があるし、Apple Storeで購入するとsimロック解除auへ電話での問い合わせでは出来ないといわるなど、色々解約されないように不便にしているように感じた
    • 2年縛りや、simロック解除制限期間や、端末でsimロック解除対象外やで色々不自由
    • なんやかんやで切り替えに金がかかる
      • au:iphone6からiphonexへのsim変更3,000円+2年縛りの違約金3,000+mnp手数料3000
      • uq:sim3,000円強(これは3000円分のQUOカードが貰えるのでトータルは殆どなし)
    • 「3.変更の流れ」の「3. simの変更」がやらなくても問題なかったかも
  • UQモバイルの不満点
    • テザリングができない
      • uqモバイルではテザリングがiPhone7からできないらしく、外でネットを使うにはwi2300を使うのが便利そうだと思った
    • wi2 300 が現実的には無料で使えない
      • wi2 300 が使えるのでテザリングできなくても問題ないと考えていたが現実的には無料ではない
      • uqモバイルを契約するとwi2 300という公共無線LANのサービスのサービスが利用できる(wi2 300へ登録は別途必要)
      • 対応エリアも広く自分が良く行く喫茶店やファミレスでも対応エリアだったから、テザリングが使えなくても問題ないように感じていたが、実際は対応エリアではあるがオプションを追加しないと使えないエリアだった
      • つまり、無料では使えない(周知内容が姑息な気がして au 系列に失望する)
    • 6Gプランだが3Gまでしか設定されていないので、6G使うには毎月3Gは購入する手続きを行う必要があり面倒
  • 使ってみた感想

5. 利用料金

  • 初月の利用料金です
  • 少し高く見えますが、SIM切替の料金3,000円が入っているためです
ご利用案内 内訳金額(円) 備考
ぴったりプランM(V) 4,658 基本データ容量3G
スマトク割 -1,000
イチキュッパ割 -935 13ヶ月まで基本料金割引
国内通話料 860
無料通話割引120分 -860 無料通話分割引
各種ダイヤル通話料 120
SMS送信料 3
データチャージ500MB 500 追加データ容量3G
(25ヶ月までは無料)
500
500
500
500
500
データ増量キャンペーン -3,000 追加データ容量3G分
SIMパッケージ料金 3,000 初月のみSIM切替料金が請求される
(2ヶ月後にクオカード(3,000円)が
送られるので相殺される予定)
ユニバーサルサービス 3
消費税 467
【ご請求金額】 6,316

SOFT SKILLS ソフトウェア開発者の人生マニュアル 感想

f:id:Amarron:20170630131517j:plain

概要

  • 「SOFT SKILLS」を読んだので次の内容を備忘録
    • 本の概要
    • 本の特徴(個人的な感覚)
    • 印象的な文のピックアップ
    • 紹介されたサービス一覧
    • 感想

本の概要

著者:ジョン・ソンメズ

ソフトウエア開発者専用に、「より良い人生」を送るためのノウハウ・スキルを網羅した、生き方バイブル本です。プログラマーが良い人生を送るためには、技術習得法やキャリア構築法といったノウハウに加え、対人的な交渉・指導・意思疎通などをうまく行える能力や知恵、すなわちソフトスキルが不可欠です!本書では、キャリアの築き方、自分の売り込み方、技術習得法、生産性の高め方といった仕事で成功する方法だけでなく、財産の築き方、心身の鍛え方、恋愛で成功する方法など、「人生全般をより良く生きる方法」を具体的に説明します。

本の特徴(個人的な感覚)

  • 語りかけるような文体で書かれている(読みやすい)
  • 各章の文末に「まとめ」や「やってみよう」の項目があり親切
  • 技術的な内容ではなく、働き方に重きを置いている
  • 中盤以降は仕事全般的な話が多め(投資や健康の話などもあり)

印象的な文のピックアップ

専門特化

  • 専門特化の法則・・・専門性が高ければ高いほど、チャンスの数は減るが、その反面、チャンスを獲得する可能性は高くなる
  • クライアントになる可能性のある会社は非常に少ないが、非常に高い時給を要求できる
  • 専門領域
  • 専門分野の選択方法
    • 会社で感じた大きなペインポイントは何か?そのペインポイントを解決することを専門とする人間になれるか?
    • 誰もがやりたがらない仕事やスキルのある人がいない仕事はあるか?
    • カンファレンスやユーザグループでよく話題になるテーマはどのようなものか?
    • 同僚相手にあるいは「StackOverflow」などの開発者向けサイトであなたがよく答える質問はどのようなものか

プロであること

  • プロであるということは、自らの姿を見せ続け、仕事を進め、逆境に負けないことだ
  • プロは毎日いつでも基準を守ってくれると当てにすることができる
  • プロになるには
    • 良い習慣を身につける(時間を計画して守る)
    • 正しいことをする
    • 品質の追求と自己研鑽

うまくやり遂げるまではできたふりをする

  • 次の事柄についてうまくやり遂げるまではできたふりをする
    • 必要なスキルと能力をすでに持っているふり
    • なりたいと思っているタイプの人間になっているふり
    • 勝者になっているふり(試行を重ね続ければいずれ克服できることを深く理解しているため、まるで、戦闘はすでに終わっているイメージ)
    • 経験者のふり(これから通ろうとしている未知の道をすでに何度も通ったことがあるかのようなイメージ)

自分のマーケティングするにはどうすればいいのか

  • 自分のマーケティングは、個人ブランドから始まる
    • ブランドとは、あなたが表現するものだ
  • 自分が何になりたいか、そのイメージを世界にどのように見せたいか、ということを意識的に決める
  • 人と触れ合うときや、あなたが複数回に渡って何かをするときに親しみを感じさせるのにブランディングは役に立つ
  • ブランドを作るためのステップ
    • メッセージを定義する
    • ニッチを選ぶ
    • キャッチフレーズを作る
    • エレベーターピッチを作る
    • ビジュアルを作る

学習の10ステップ(7~10は繰り返す)

  1. 全体像をつかむ
  2. スコープを決める
  3. 成功の基準を決める
  4. 参考資料を見つける
  5. 学習プランを作る
  6. リソースをフィルターにかける
  7. 使い始められるようにする方法を学ぶ
  8. 遊びまわる
  9. 役に立つことができるところまで学ぶ
  10. 教える

引退とは逆算で働くこと

  • 引退のためのプランニングで大切なこと
    • 毎月生活するために必要な額を正確に計算する
    • 受動的収入を確保する方法を確立する(少し余裕を持たせられるだけの額)
    • 毎月生活費と受動的収入を考え逆算で働く

紹介されたサービス一覧

分類 サービス名 概要 備考
開発 GitHub ホスティングサービス
開発 WordPress CMS
開発 Blogger CMS
開発 Buffer SNS予約投稿サービス
管理 Trello タスク管理サービス
管理 Kanbanflow タスク管理サービス
管理 RescueTime 作業時間の可視化
QA Stack Overflow Q&A
ビジネス Fiverr クラウド・ソーシング $5でロゴが作れる
ビジネス oDesk クラウド・ソーシング
ビジネス Leanpub Markdownテキストを本にして販売してくるサービス
ビジネス Smashwords 本を流通させてくれるサービス
ビジネス Bookbaby 本を流通させてくれるサービス
ミートアップ トーストマスターズ スピーチを通じてコミュニケーション、話し方、リーダーシップスキルの上達を目指す非営利教育団体
ミートアップ Clarity コーチやメンターを探せる 時間料金制
ミートアップ meetup.com ミートアップ

※フィットネス関連は除外しています

感想

  • @HigeponJaさんがオススメしていたので読んだが、積読せずにもっと早く読めば良かった
  • ソフトウェア開発者が働くということを網羅的に書かれていて考えの整理や仕事への全体像の見晴らしが良くなった気がする
  • 「報酬にランダム性があると習慣が強くなり、カジノに中毒性があるのもそのためだ」というのは面白かった
    • 習慣にしたい事柄の報酬をランダムにして、中毒にしたら、自分をハックしている感じで面白いかも
  • 生産性に対して、かなりストイックな内容で仕事のために生きていると思っていない人には全部きっちりやるのは少し厳しい内容だと思った
    • 自分はそこまでストイックではないが、やっていたこと(ポモドーロやクォータなど)が何個か出てきて共感しやすかった
    • おそらくこの本に書かれていること全部を自分はやることはないと思うが、一部はやっていきたい
      • やること:ブログを毎週書く、専門分野を伸ばす、自分のマーケティング、ルーチンをしっかり守る、預金を投資にまわす
  • 自分の改善したい部分が幾つか見つかった
    • 学習の10ステップで、「スコープを決める」「成功の基準を決める」を結構適当にやっていた
      • 課題がはっきりしていないときにダラダラと本を最初から最後まで読んでしまって、結局浅い知識で何を学んだのか覚えていないときが多かった
    • 今までの自分の独学の手順が非効率だったかも
      • 「遊びながら行動を起こし、本を読んで学ぶと吸収も早く、その成果を遊びに活かす、自分が学んだことを誰かほかの人に教えて知識をセメントで封印しておこう」が独学の手順として効率的らしい
      • 自分はスピード感が遅かったりや途中で諦めてしまうことが多いが、その原因は本を読みながら学習しそれをブログに書くなどをやっているからなのかも知れない
      • 手順を「調査と出力」を同時に進行するのではなく、「遊び→行動→調査→出力」の流れに変えたら効率があがりそうな気がした
  • 読んでいて少しひっかかる部分もあった
    • 「うまくやり遂げるまではできたふりをする」は、しったかぶりや、なんでも出来ますで無理な受注を受けて、周りに嫌われたりしないだろうか
    • この本と同じことをやっても、ある程度能力が高くないと大きな成功はつかめないと思った
      • 最終的にアントレプレナーになることがストーリーになっているがそれだけが成功なのか疑問を感じた
  • こういう自己啓発系の本を読むと毎回人生のテーマとか自分は何をしたくてどうなりたいかなどをあらためて考える機会が作れて、自律的で前向きになれる良い本だと思った

Pokemon Go API メモ

f:id:Amarron:20160822191210p:plain

ポケモンGOAPIについて、少し調べたので残します。
自分用のメモなので間違っていたらごめんなさい。(コメントとか頂けると嬉しいです)

  1. APIについて
  2. 非公式サービスのポケモン情報の取得方法について

なお、URLの「reddit」を「れでぃっと」と記載しています。(Bad Requestのため)

from20020516.hatenablog.com

1. APIについて

Guide to Pokemon Go Server Responses
I’ll be updating this post as I figure more things out

Things needed (incomplete list):

  • A way to MITM/intercept responses (Charles with SSL Proxy via Wifi)
  • ProtoBuf 3 (protoc on the command line)

The second response

After the initial handshakes with pgorelease.nianticlabs.com/plfe/rpc you’ll get a response from the server that has three parts:

  • Player
  • Inventory
  • Settings

In order to parse these, you’ll need to need to separate them - they each have overlapping messages, which makes it difficult to handle with one file.

If you’re looking at your .bin (binary file), look for the hex seq a206020801 - this marks the end of the Player section, and you split the file after this seq. The next split is at the last a206 - this marks the beginning of the Settings section, and you can make the split before this seq.

Player

You can use this .proto file to decode your player binary with protoc –decode Holoholo.Rpc.Player player.proto < player.bin. There’s not a whole lot of information there yet.

Inventory

You can use this .proto file to decode your inventory binary with protoc –decode Holoholo.Rpc.Inventory inventory.proto < inventory.bin. This has the most information of the response, detailing all of your items and pokemon.

Settings

You can use this .proto file to decode your inventory binary with protoc –decode Holoholo.Rpc.Final settings.proto < settings.bin. This has the most information of the response, detailing all of your items and pokemon (sorry for the inconsistent naming).

Map Response

After you’ve been talking to server a while, you’ll send up your lat/long at some point to request map cell information. The response can be decoded with this .proto file and protoc –decode Holoholo.Rpc.Map map.proto < response.bin. This is a pretty interesting response which includes nearby pokemon, wild pokemon, forts, spawn points, etc.

Conclusion/comments

It’s interesting that the nearby pokemon return distances, and not points on the map. It should be reasonably easy to triangulate their position with three sets of data (assuming they don’t move - I don’t think they do). I’m not sure if their EncounterId is unique (doesn’t decode correctly right now), which might make it difficult to sort to triangulate.

Once the pokemon are close enough to you, it looks like a MapPokemon/WildPokemon gets returned, at which point you can see their exact point on the map, along with their expiration time and spawn id - I’m not sure why both Map and Wild are needed. Maybe it’s related to them being able to be captured/visible?

The settings provide some interest info (in case you’re unable to decode):

Settings {
  Sha1: “”
  Values {
    FortSettings {
      InteractionRangeMeters: 40
      MaxTotalDeployedPokemon: 10
      MaxPlayerDeployedPokemon: 1
      DeployStaminaMultiplier: 2
      FarInteractionRangeMeters: 1000
    }
    MapSettings {
      PokemonVisibleRange: 100
      PokeNavRangeMeters: 200
      EncounterRangeMeters: 50
      GetMapObjectsMinRefreshSeconds: 5
      GetMapObjectsMaxRefreshSeconds: 30
      GetMapObjectsMinDistanceMeters: 10
      GoogleMapsApiKey: “”
    }
    InventorySettings {
      MaxPokemon: 1000
      MaxBagItems: 1000
      BasePokemon: 250
      BaseBagItems: 350
      BaseEggs: 9
    }
    MinimumClientVersion: “0.29.0”
  }
}

Some of these things were confirmed earlier, but it’s neat to see them as actual variables from the server, rather than hard-coded into the game.

Here’s a sample Inventory Pokemon (sorry for censoring - idk how unique these are):

    Pokemon {
      PokemonId: 98
      Cp: 19
      Stamina: 29
      MaxStamina: 29
      Move1: 216
      Move2: 20
      HeightM: 0.42
      WeightKg: 7.
      IndividualAttack: 14
      IndividualDefense: 9
      IndividualStamina: 13
      CpMultiplier: 0.39
      Pokeball: 2
      CapturedS2CellId: 
      CreationTimeMs: 1468154******
    }

Here are some NearbyPokemon examples:

NearbyPokemon {
  PokedexNumber: 19
  DistanceMeters: 107.49982
}
NearbyPokemon {
  PokedexNumber: 46
  DistanceMeters: 48.262047
}
NearbyPokemon {
  PokedexNumber: 19
  DistanceMeters: 105.36407
}
NearbyPokemon {
  PokedexNumber: 10
  DistanceMeters: 191.24013
}

There’s still quite a few requests to get through - if anyone is doing something similar, feel free to post them here, or ask questions.

Please don’t ask me how to set mitm/protobuf/other things up.

https://www.れでぃっと.com/r/pokemongodev/comments/4svl1o/guide_to_pokemon_go_server_responses/ より抜粋

2. 非公式サービスのポケモン情報の取得方法について

  • 多数の非公式サービスは、「pokevision」や「catch that」などから無許可でAPIを利用しているよう(niantic -> pokevisionやcatch that -> 多数サービス)

pokevision

  • サービス停止中(7月31日くらい〜)

↓FAQです。(nianticapiを使っているらしいです)

Find all Pokemon near you (or a selected target location) in real time for Pokemon Go. Pokemon nearby will be marked along with their appearance timer on the map. These are real time Pokemon locations, meaning they are currently live and can be found exactly at the marked spots.

What is Pokevision?

Pokevision is a Pokemon tracker/locator for the mobile game Pokemon Go. It uses the Niantic API to grab the location of all Pokemon near your (or your selected location) and display them on the map in real-time; this means if it is displayed on the map, you can go out and catch them! Note: Rarer pokemons have a shorter appearance time so they might despawn; make sure to be quick and keep an eye on their timers!

How do I track Pokemon using Pokevision?

There are a few methods to scan for the location of Pokemon:

  1. Click anywhere on the map to drop a location marker. After placing a marker, press scan to reveal Pokemon nearby.
  2. Use the Search Bar to enter your location (or a location you wish to scan) and hit enter. You can then click Scan. If there are Pokemon nearby, they will display on the map along with their appearance time.

Are the Pokemon displayed actually there?

Yes - as long as the timer has not reached 0, the Pokemon are actually there and in real time.

How come I see some Pokemon in game but not on your map?

Pokemon that spawn due to lure/incense are not visible on our map since those pokemon are visible to only you.

Can I scan anywhere?

As long as it is an area where Pokemon Go is serviced, yes. Please keep in mind we have a small delay between scans so that requests do not spam the servers. Scans take around 5-15 seconds depending on the density of the area.

I am receiving an error. Help!

The Pokemon Go servers are very overloaded during peak hours of the day, this also affects the API and results may take longer or stall. Please be patient and try again!

What map provider are you using?

We are grateful to be provided map tiles and geocoding services by the folks over at Esri .

How do I contact you guys regarding suggestions, feedback, or business inquiries?

You may reach us via the contact us page.

https://pokevision.com/faqより抜粋

catch that(SkipLagged)

  • 8月22日時点では利用出来ている(日本はサービス対象外?)
  • SKIPLAGGEDのトラップストリート?をやっている
  • メイン事業は、旅行関連のサービスっぽい

↓色々他社サービスにAPIを無断で利用されているようです。

Shame shame shame

So a while back, we built an api endpoint that instantly provides live positions of wild pokemon. It was meant for use by our services and personal use by anyone (who agrees not to abuse, of course).

Not surprisingly people have been abusing this, to the point where lots of websites and mobile apps are calling it directly.

As such, we figured trolling is only fair:

http://i.imgur.com/SJaUXpF.jpg

http://i.imgur.com/qU3RApd.jpg

http://i.imgur.com/zSHcLfH.jpg

http://i.imgur.com/WvcVNvL.jpg

http://i.imgur.com/LQgyzsa.png

http://i.imgur.com/cU54C4L.png

http://i.imgur.com/K3bigJ1.jpg

https://na.cx/i/T7K84g.png (thanks to /u/mlc130104, https://www.れでぃっと.com/r/pokemongodev/comments/4yheff/pokefast_isnt_the_only_api_sending_bogus_pokemon/

C'mon folks, servers are expensive. Especially when processing tens of thousands of searches per second..

Press:

http://did2memo.net/2016/08/19/pokemon-go-p-go-search-data-source-skiplagged/

http://i.imgur.com/8tgm6UD.png

https://www.れでぃっと.com/r/pokemongodev/comments/4yhpk0/shame_shame_shame/ より抜粋

その他

Swift PDF Download Export 実装方法

f:id:Amarron:20151129162938p:plain:w350

概要

PDFのDownload

  • NSURLSessionDownloadDelegateを利用してダウンロードします
  • 以下のプログラムは「download」ボタン押下で、指定したURLからPDFをダウンロードするよう書いてあります
// NSURLSessionDownloadDelegateを追加
class YourClass:UIViewController, NSURLSessionDownloadDelegate {
    // PDF保存先のディレクトリを定義
    let dir = NSSearchPathForDirectoriesInDomains(
        .DocumentDirectory,
        .UserDomainMask, true)

    @IBAction func download(sender: AnyObject) {
        // ダウンロードしたいPDFのURLを指定
        let url = NSURL(string: "http://www.indire.it/wp-content/uploads/2015/08/pdf-sample.pdf")
        
        let config = NSURLSessionConfiguration.defaultSessionConfiguration()
        let session = NSURLSession(configuration: config,
            delegate: self,
            delegateQueue: NSOperationQueue.mainQueue())
        // PDFのダウンロード
        let task = session.downloadTaskWithURL(url!)
        task.resume()
    }
    
    // MARK: - NSURLSessionDownloadDelegate
    func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL){
        let data = NSData(contentsOfURL: location)!
        if data.length > 0 {
            let path =
            NSURL(fileURLWithPath: self.dir[0]).URLByAppendingPathComponent("ファイル名.pdf").path
            // PDFの書込み
            data.writeToFile(path!, atomically: true)
        }
    }
    
    func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
        if error == nil{
            session.finishTasksAndInvalidate()
        } else {
            session.invalidateAndCancel()
        }
    }
}

参考:SwiftでPDFをDL、保存して良さ気な見た目で表示しよう (分かりやすいのとプログレスバーがステキです)

PDFのExport

  • 「UIDocumentInteractionController」を使って出力します
  • 「UIDocumentInteractionController」は、メソッド内に書くとメモリが開放されてクラッシュするのでクラス変数で定義した方が良いと思います
  • 以下のプログラムは「export」ボタン押下で、指定したURLからPDFをダウンロードするよう書いてあります
    • プロジェクト内のファイルを出力したい場合、「NSBundle.mainBundle().URLForResource().path」で出力できます
class YourClass:UIViewController {
    // ※クラス変数で定義(メソッド内の場合、メモリが解放されてしまう)
    var dic:UIDocumentInteractionController? 

    @IBAction func export(sender: AnyObject) {
         // プロジェクト内のファイルを指定したい時
         // if let path = NSBundle.mainBundle().URLForResource("ファイル名", withExtension: "pdf").path! {
        if let path = NSURL(fileURLWithPath: self.dir[0]).URLByAppendingPathComponent("ファイル名.pdf").path {
            dic = UIDocumentInteractionController(URL: NSURL(fileURLWithPath: path))
            dic?.presentOpenInMenuFromRect(CGRectZero, inView: self.view, animated: true)
        }
    }
}

サンプルコード

サンプルコードを作りました。ご参考までに。

github.com

機能

  • PDFのダウンロード
  • ダウンロードしたPDFの一覧表示
  • ダウンロードしたPDFの削除
  • PDFをエクスポート

使い方

  1. ダウンロードしたいPDFのURLをテキストエリアにペースト
  2. ダウンロードボタン押下でPDFをダウンロード
  3. テーブルにダウンロードしたPDFファイル名が追加されて表示
  4. エクスポートしたいファイル名を選択するとエクスポート先が表示
  5. エクスポート先でPDFが表示
  6. ダウンロードしたPDFを削除したい場合は対象のファイル名を右へスワイプ

f:id:Amarron:20151129163036j:plain:w350 f:id:Amarron:20151129163047j:plain:w350

新 TestFlight 内部テスター 手順

概要

  • TestFlightの設定〜使い方手順の自分用メモです(内部テスターを追加する方法)
  • 簡単な手順は次のような流れ
  • 外部テスターを追加する場合、AppleStoreの審査があります(私は審査に1日かかりました)

前提条件

  • iOS8以上
  • iTunes Connectにアプリをアップロードできる状態

手順

  1. iPhone: TestFlightアプリをダウンロード
  2. iTunes Connect: iTunes Connectでユーザと役割にAppleID(メールアドレス)追加
    • f:id:Amarron:20150904214636p:plain
  3. iPhone: AppleID(メールアドレス)に承認メールが届くのでクリック→クリックするとiTunes Connectの画面が開くのでログイン
  4. iTunes Connect:TestFlightベータ版テスターにAppleID(メールアドレス)が追加されるのでチェックを付けてテスターにする
    • f:id:Amarron:20150904214649p:plain
  5. Xcode: 対象のアプリをiTunes Connectにアップロード
  6. iTunes Connect:対象のアプリ(マイ App->プレスリリース->内部テスター)を選択しテスターに追加する
    • f:id:Amarron:20150904214702p:plain
  7. iPhone:AppleID(メールアドレス)にアプリ招待メールが届くのでクリック→TestFlightを開かれ対象のアプリが表示されるのでAcceptで招待を受ける -f:id:Amarron:20150904214714p:plain
  8. iPhone:TestFlightで対象のアプリをダウンロードする

その他

  • 内部テスターでiTunes Connectにログインすると、次のような項目が閲覧・変更できます f:id:Amarron:20150916193927p:plain

参考URL