Learning "5G"

5G(第5世代移動通信システム)について調べたことなど

資料

特徴

  • 特徴
    • 高速・大容量 → ピークレート 20Gbps
    • 低遅延 → 1ms 以下
    • 同時接続 → 106バイス/km2
  • 波及分野
    • 「高速大容量」で「低遅延」で今までより
    • 信頼性の高いネットワークが実現
    • いままで採用されなかった信頼性が必要な分野にネットワークが採用される

スケジュール

周波数帯域

  • 3.7GHz および 4.5GHz
    • 2枠割当て
      • NTT ドコモ
      • KDDI
        • KDDI に割当てられたのは 3.7GHz帯 100MHz と 28GHz帯400MHz
        • この周波数は「エコバンド」と呼ばれる国際的に 5G の利用が見込まれる部分
        • つまり KDDI はグローバルでの端末調達において少し有利になるのか?
    • 1枠割当て
  • 28GHz 帯
    • すべての申請者

実証実験・トライアル

医療

災害医療対応支援、遠隔医療教育
国内初、災害医療対応支援に5G VRを活用 | 2019年 | KDDI株式会社

農業

自動運転農機
報道発表資料 : (お知らせ)最先端の農業ロボット技術と情報通信技術の活用による世界トップレベルのスマート農業およびサステイナブルなスマートアグリシティの実現に向けた産官学連携協定を締結 | お知らせ | NTTドコモ

VR/AR

コネクテッドカー
日産自動車とNTTドコモ、「Invisible-to-Visible」技術の5G走行実証実験を開始

観光

テレイグジスタンス(遠隔だが、あたかも近くにあるかのように操作できる)
遠隔存在技術で旅行!? ロボット×VRで小笠原観光! | 5G VR・AR | au

これから

遮蔽物に弱いという課題

  • 5G に使用する 28GHz の電波は直進性がたかく、遮蔽物での品質劣化が課題になる
  • これは反射板(金属反射板、メタマテリアル反射板)でのエリア拡大が検証される
  • 逆にいうと、これは地方など建築物のない場所では、ここがアドバンテージになるのでは?

ガラスアンテナ

報道発表資料 : (お知らせ)世界初、28GHz帯に対応する5G端末向けのガラスアンテナで通信に成功 | お知らせ | NTTドコモ

  • 透明、薄型、小型のガラスアンテナ
    • 目立たない、邪魔にならない、まわりの外観を乱さない
  • これを使うと
  • 高速移動する自動車、鉄道などで安定した通信ができる
  • 基地局の設置が難しい場所、一時的に 5G を使いたい場所へ設置する

WKWebView の読み込み進捗を表示する

はじめに

  • iOS の WebView の読み込み進捗を示すプログレスバーを表示させたい
  • iOS 5 以降 / Objective-C の時代には
  • プログレス表示に NJKWebViewProgressView を使用していたが
  • WebKit の WKWebView(not UIWebView) と Swift のあたらしい KVO の仕組み(closure でスリムに書ける)を使うと
  • 以前より簡単に実装できるような感じがしたので
  • 実際に試してみる

資料

WebView の進捗を KVO する

WebView の読み込み進捗(estimatedProgress)を KVO する最小のコードは以下。これで正しく進捗を得ることを確認できた。

var observation: NSKeyValueObservation?

observation = webView.observe(\.estimatedProgress, options: .new){_, change in
      print("progress=\(String(describing: change.newValue))")
}

UI を実装する

WebView の進捗を得ることを確認できたので、それっぽい UI を実装してみる。要件は以下だ。

  • WKWebView 上部に UIProgressView で進捗を表示する
  • 進捗が 1.0 になったら(読み込みが完了したら)、プログレスの表示をフェードアウトして消したい(Chrome とか Safari のように)
  • プログレスの色をデフォルトの青から変えてみたい

コードは以下。

class ViewController: UIViewController, WKNavigationDelegate {
  
  @IBOutlet weak var webView: WKWebView!
  @IBOutlet weak var progressView: UIProgressView!
  
  private var observation: NSKeyValueObservation?
  private var colorCnt = 0
  private let colorArray: [UIColor] = [
    .blue,
    .green,
    .yellow,
    .red,
  ]
  
  override func viewDidLoad() {
    super.viewDidLoad()
    
    webView.load(URLRequest(url: URL(string: "https://www.kantei.go.jp/")!))
    
    progressView.progressTintColor = colorArray[colorCnt]
    colorCnt = colorCnt + 1
    
    observation = webView.observe(\.estimatedProgress, options: .new){_, change in
      print("progress=\(String(describing: change.newValue))")
      self.progressView.setProgress(Float(change.newValue!), animated: true)
      
      if change.newValue! >= 1.0 {
        UIView.animate(withDuration: 1.0,
                       delay: 0.0,
                       options: [.curveEaseIn],
                       animations: {
                        self.progressView.alpha = 0.0
                        
        }, completion: { (finished: Bool) in
          self.progressView.progressTintColor = self.colorArray[self.colorCnt]
          self.colorCnt = self.colorCnt + 1
          if self.colorCnt >= self.colorArray.count {
            self.colorCnt = 0
          }
          
          self.progressView.setProgress(0, animated: false)
        })
      }
      else {
        self.progressView.alpha = 1.0
      }
    }
    
  }
  
}

動作イメージ

上記のコードを実行するとこんな感じ。Good ですね。

完全なサンプルプロジェクト

ビルドできる完全なサンプルプロジェクトは GitHub にある

パフォーマンスを高める Swift の記述

はじめに

Swift の実行速度を向上させたくドキュメントを探すと以下が見つかった。

swift/OptimizationTips.rst at master · apple/swift · GitHub

この中から気になったトピックをメモする。

Dynamic Dispatch(動的な呼び出し)を削減する

Swift は Objective-C 同様に動的な言語である。このためダイナミズムを削減したコードはそのぶん、パフォーマンスが向上する。

"final" キーワードを使用する

オーバーライドが必要ないクラス、メソッド、プロパティには final キーワードを使用する。

"private" "fileprivate" キーワード使用する

外部から参照しないものには private fileprivate を使用する。

コンテナを効果的につかう

Swift 標準ライブラリには Array と Dictionary のコンテナがある。これを高パフォーマンスに使用するように気をつける。

Array では Value types(値型) を使用する

Swift の型は大きく二つに分けることができる

  • Value types(値型)
  • Reference types(参照型)
    • class

この二つの主な違いは Value types は NSArray に含めることが できない ということ。

これはつまり Value types を Array に使う限り、それが 「NSArray に戻される可能性」がなくなり、その可能性を維持するためのオーバーヘッドが削除できることに繋がる。

さらに Reference types は参照カウントが必要だが、 Value types は参照型が含まれている場合のみ、参照カウントが必要になる。
このため、Reference types の無い Value types を使用することにより、Array 内での retain/release のトラフィックを避けることができる。

ただし、Value types には注意が必要。
上記の参照カウントをもたないことのメリットの裏には Value types のコピーのコストがある。
つまり Value types が大きな場合、コピーのコストが大きくなり、それがこれまであげたメリットを上回る可能性に注意する必要がある。

チェックしない演算子

Swift では演算実行のタイミングでオーバーフローをチェックする。
しかし、フローの問題が発生しないとわかっている時は、このチェックを省略すると、チェックにかかる時間が無くなる。

a : [Int]

for i in 0 ... 100 {
  a[i] = i &+ (i+1)  // この演算はオーバーフローしないので & をつけてチェックを省略する
}

そのほか

  • ここに書いていないトピックも原文に目を通しておくと良い。
  • とくに Generics に関してはきっと役立ちそう
  • ここに記載した事柄をとりこんでみた結果、下のライブラリは実行速度が向上した

おわり

MKMapView の地図タイルをオーバーレイする

目的

  • iOS の MKMapView で表示する地図タイルを標準以外に差し替えたい(ベースタイルの変更)
  • またベースの地図タイルの上に、透明度のあるレイヤーをオーバーレイすることも試したい(範囲を示す、情報を含むタイルをベースに重ねる)

使用するタイル

今回は国土地理院のタイルを使用する。

国土地理院タイルを使用する際の注意点

国土地理院のサーバ上にある地理院タイルを、リアルタイムで読み込み表示するウェブサイトやソフトウェア、アプリケーションを製作する場合、地理院タイルは出典の明示のみで申請不要でご利用いただけます。

実際使用したタイル

MKMapView でタイルオーバーレイを使用する

タイルオーバーレイを追加する

MKMapView にオーバーレイを追加する。

// オーバーレイを作成
// Templete の URL を設定する
// z -> ズームレベル
// x -> x 方向
// y -> y 方向
let overlay = MKTileOverlay.init(urlTemplate:"https://cyberjapandata.gsi.go.jp/xyz/pale/{z}/{x}/{y}.png")

// canReplaceMapContent
// ベースタイル(タイルが不透明)ならば true 
// オーバーレイタイル(タイルに透明度がある)ならば false
overlay.canReplaceMapContent = true
overlay.tileSize = CGSize(width: 256, height: 256)

// MKMapView にオーバーレイを追加する    
mapView.addOverlay(overlay)


さらに MKMapViewDelegate の rendererFor を実装し MKOverlayRenderer を返す必要がある。

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
  return MKTileOverlayRenderer.init(overlay: overlay)
}

タイルオーバーレイを削除する

// マップビューからオーバーレイを削除する
mapView.removeOverlays(mapView.overlays)

動作イメージ

港区台場の明治期の状態がみえる

リポジトリ

今回のサンプルのリポジトリ

備考

  • 他に無償で利用できる地図タイルには OpenStreeMap がある

本『回転木馬のデッド・ヒート』(村上春樹)の感想

回転木馬のデッド・ヒート (講談社文庫)

回転木馬のデッド・ヒート (講談社文庫)

村上春樹の短編集 / 1985年10月09日発行

収録

  1. レーダーホーゼン
  2. タクシーに乗った男
  3. プールサイド
  4. 今は亡き王女のための
  5. 嘔吐1979
  6. 雨やどり
  7. 野球場
  8. ハンティング・ナイフ

エピソードを照合する

  • 1冊を通して読むと、奇妙な連続性と反復性を感じた
  • それが何かを知りたく、気になった要素で各エピソードを表にして照合してみた
  • こう見ると直感で感じた「連続性」と「反復性」の説明がつきそうだ
エピソード 話者が女性 話者が男性 話中に男性側の不貞・情欲がある 食事を吐く
レーダーホーゼン
タクシーに乗った男
プールサイド
今は亡き王女のための
嘔吐1979
雨やどり
野球場
ハンティング・ナイフ

Git で Emoji Prefix に関してのメモ

はじめに

Git リポジトリに Emoji Prefix のコミットテンプレートを設定してみる。

Emoji Prefix を導入するメリットは

  • 絵文字とコミットが対になるので、コミットの役割が明確になる
    • バグ修正+リファクタリング+機能追加。。。など本来分割すべきコミットがごちゃごちゃ一緒になることを防げる
  • コミットログのプレフィックスに絵文字がつくため、ログの可視性が上がる
  • 明るい絵文字を使うとプロジェクトが殺伐としづらくなる作用

コミットテンプレートを用意する

今回は以下のコミットテンプレートを用意した。

commit-template.txt

# EMOJI PREFIX
# 🆙 : Version up
# ⚡️ : Add major feature.
# ✨ : Add feature.
# ♻️ : Refactoring
# 🔧 : Improve Performance
# 🐛 : Fix Bug
# 🧹 : Remove unsed feature / resource.
# 🎨 : Update resources.

リポジトリにコミットテンプレートを設定する

# config にテンプレートを設定する
$ git config --local commit.template commit-template.txt

# テンプレートが設定されているかを確認する
$ git config --local commit.template
commit-template.txt  # 問題なく設定されていた

リポジトリにテンプレートを設定する。ここでは対象範囲を local にしている。

  • config の対象範囲は以下になる。
    • local : リポジトリ単位
    • global : ユーザー単位
    • system : すべて

コミットテンプレートが設定されているか確認

$ git commit

をすると、下のようにテンプレートが表示されたので OK

f:id:daisuke-t-jp:20190824103753p:plain:w500

  • TODO
    • GitHub Desktop からコミットテンプレート使うには?

参考

Android Q is Android 10.

Android は今まで菓子の名前を使っていたが、それをやめるようだ。


First, we’re changing the way we name our releases. Our engineering team has always used internal code names for each version, based off of tasty treats, or desserts, in alphabetical order. This naming tradition has become a fun part of the release each year externally, too. But we’ve heard feedback over the years that the names weren’t always understood by everyone in the global community.

  • リリースの命名方法を変更する。
  • 従来はアルファベット順で「お菓子」「デザート」に基づいた名前にしていた。
    • この命名に関しての伝統も楽しめる部分があった。
  • しかし
    • グローバルコミュニティ全員が名前を理解している訳ではないというフィードバックがあった。

For example, L and R are not distinguishable when spoken in some languages. So when some people heard us say Android Lollipop out loud, it wasn’t intuitively clear that it referred to the version after KitKat. It’s even harder for new Android users, who are unfamiliar with the naming convention, to understand if their phone is running the latest version. We also know that pies are not a dessert in some places, and that marshmallows, while delicious, are not a popular treat in many parts of the world.

  • 一部の言語では L と R の発音の区別がつかない
  • 命名規則に慣れていないユーザが Androidバイスのバージョンを特定することが困難
  • Pie(パイ)は地域によっては「デザート」ではない
  • マシュマロはおいしいが、世界中でポピュラーなお菓子とは言えない

As a global operating system, it’s important that these names are clear and relatable for everyone in the world. So, this next release of Android will simply use the version number and be called Android 10. We think this change helps make release names simpler and more intuitive for our global community. And while there were many tempting “Q” desserts out there, we think that at version 10 and 2.5 billion active devices, it was time to make this change.

  • グローバルな OS は名前が明確であり、世界中の全ての人に関連していることが重要である。
  • したがって Android の次のバージョンは Android 10 と呼ぶ。
  • これによりグローバルコミュニティにおいても、名前がよりシンプルに、直感的になる。