Swift UserDefaults の synchronize() は不要

https://developer.apple.com/documentation/foundation/userdefaults/1414005-synchronize

Waits for any pending asynchronous updates to the defaults database and returns; this method is unnecessary and shouldn't be used.

かつては UserDefaults でアプリの設定値の永続化をする際に synchronize() を呼び出して、内容を同期して保存していたが、現在は「不要であり、呼び出すべきではない」に変わっていたのでメモ。

Swift ケルビンから摂氏、ケルビンから華氏へ変換する

import Foundation

func kelvin2Celsius(_ kelvin: Float) -> Float {
  return kelvin - 273.15
}

func celsius2Kelvin(_ celsius: Float) -> Float {
  return celsius + 273.15
}

func kelvin2Fahrenheit(_ kelvin: Float) -> Float {
  return kelvin * (9.0 / 5.0) - 459.67
}

func fahrenheit2kelvin(_ fahrenheit: Float) -> Float {
  return (fahrenheit + 459.67) * (5.0 / 9.0)
}
 
do {
  // 液体窒素の沸点
  let k = Float(77.4)
  print("\(k)[K] \(kelvin2Celsius(k))[°C] \(kelvin2Fahrenheit(k))[°F]")
  // 77.4[K] -195.75[°C] -320.35004[°F]
}

do {
  // ドライアイスの昇華点
  let k = Float(195.1)
  print("\(k)[K] \(kelvin2Celsius(k))[°C] \(kelvin2Fahrenheit(k))[°F]")
  // 195.1[K] -78.04999[°C] -108.49002[°F]
}

do {
  // 人間の標準的な体温
  let k = Float(310.15)
  print("\(k)[K] \(kelvin2Celsius(k))[°C] \(kelvin2Fahrenheit(k))[°F]")
  // 310.15[K] 37.0[°C] 98.599945[°F]
}

do {
  // 水の沸点
  let k = Float(373.1339)
  print("\(k)[K] \(kelvin2Celsius(k))[°C] \(kelvin2Fahrenheit(k))[°F]")
  // 373.1339[K] 99.98392[°C] 211.97104[°F]
}

USGS Earthquakes Realtime Feeds

USGS から地震のリアルタイムフィードを受ける。具体的には USGS の Web にアクセスして GeoJSON 形式で地震データを取得する。

USGS

USGS(United States Geological Survey)とは日本語では「アメリカ地質調査所」になる。災害、エネルギー、鉱物、天然資源などの調査・研究する政府機関。

https://www.usgs.gov/

リアルタイムフィード

地震災害についての TOP がここであり
https://www.usgs.gov/natural-hazards/earthquake-hazards


地震についてのフィードのページがここになる
https://earthquake.usgs.gov/earthquakes/feed/


上にいろいろとフィードの受け取り方があるが、リアルタイムに受け取りたい場合は、これになる(GeoJSON 形式)
https://earthquake.usgs.gov/earthquakes/feed/v1.0/geojson.php


例えば、過去7日にあったすべての地震の GeoJSON は、これになる(毎分更新)
https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_week.geojson

本『暗号解読』(サイモン・シン)の感想

暗号解読(上) (新潮文庫)

暗号解読(上) (新潮文庫)

面白かった。 「暗号の歴史」が知れる本。
そもそもは暗号というのは、バレてはいけない内容の話(急襲とか反乱とか)が漏れ出ないように、重要人物から重要人物への通信(手紙とか)に使う手段だった。

とにかくバレなければ良い、ということなので、最初は手紙、それ自体の存在を隠すという、ステガノグラフィ(隠蔽)も秘密の通信には大事な要素だった。

しかし、次第にバレても絶対読めないよね?の暗号技術がより研究されるようになり、それが戦争の勝利への重要要素になったりと、人類に非常に関わっていくこととなる。

印象的だったのは、今日は当たり前の無線通信が、それが発見された当初はとても画期的であり、例えば、それまでの通信というのは地点間にケーブルを埋設してやっと交信できたのに対して、無線はそういった工事がなく使用できたという歴史の流れ。

すなわち、無線はいち早く、基地と基地、前線と基地が通信でき、これがあるのとないのとでは、戦争に勝てるかどうか決定的な差が生まれる。

しかし無線なので、その通信の存在自体は隠匿できず、したがってその通信内容をいかに秘密にするべきか暗号技術がまたさらに発展し、さらに無線になったことで有線の時よりも通信しやすくなり、通信量が増えたことで人間による暗号化・複合化に限界がきて、暗号機械(エニグマ)が誕生・・・というくだりが読みごたえがあった。

SwiftUI プレビューのデバイスを指定する、複数指定する

コード

import SwiftUI

struct ContentView: View {
  var body: some View {
    VStack {
      Text("Hello")
        .font(Font.custom("AvenirNext-Heavy", size: 100))
    }
    .background(Color.yellow)
  }
  
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
      
      ForEach(["iPhone SE", "iPhone XS Max"], id: \.self) { deviceName in
          ContentView().previewDevice(PreviewDevice(rawValue: deviceName))
      }

    }
}

プレビュー結果

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

資料