ゲーム機の世代とは?

こんど発売になるPlay Station 5は第9世代のゲームコンソールだということなんですが、ここで出てくる世代ってなんだろう?と思いました。Play Station 5が第9世代なら、そこからさかのぼっていけばPlay Station 1は第5世代。スーパーファミコンが第4世代、ファミコンが第3世代。その前って? ……もしかして第2世代がカセットビジョンとかAtariとか? それじゃ第1世代は何になるの?

ja.wikipedia.org

Wikipediaなどで調べてみたところ、据え置きタイプについては次のようになっているようです。太字は僕が所有していたことがあるもの。

  • 第1世代:オデッセイ、ホームポンなど(1970年代)……80年代後半になってから中古のオデッセイを入手して遊んでました。
  • 第2世代:Atari 2600、カセットビジョンなど(1970年代後半~1980年代前半)……アタリショックが起きた世代
  • 第3世代:ファミコンセガマーク3、Commodore 64など(1980年代前半~中盤)……ゲームができるパソコンとして、当時はZX 81が欲しかった。ひとつのキーに4つも5つも機能が割り当てられててすごいと思った。MSXもこの世代かな。
  • 第4世代:スーパーファミコンPCエンジンメガドライブなど(1980年代後半~1990年代前半)……僕はパソコンのほうに行ってしまっていたのでPC98を使っていたし、あこがれていたのはMac SEAtari STでした*1
  • 第5世代:Play StationセガサターンNINTENDO 64(1990年代中盤~後半)……ピピンとかマーティとかもあったね。従来のゲーム機メーカー以外(主にPCメーカー)も参入して、いろいろな機種がお星さまになりました。
  • 第6世代:Play Station 2ドリームキャストゲームキューブXbox(2000年代はじめごろ)……DVDプレイヤーにもなるということでPS2は爆発的に普及したよね。
  • 第7世代:Play Station 3WiiXbox 360など(2000年代中盤~後半)……コントローラが無線になった!
  • 第8世代:Play Station 4Wii UXbox One(2010年代前半)……スマートフォンの普及でコンソールゲームがちょっと目立たない時期かも
  • 第9世代:Nintendo SwitchOculus Questなど(2010年代後半~)……Play Station 5やXbox Series Xもここにいれてしまっていいの?

SwitchとPS5とかは性能も方向も違うので同じ世代に分類してしまっていいのか疑問。Switchはどちらかというと遅れてやって来た第8世代なのではないかという気もするし。

Wikipediaには携帯タイプも世代分類がされているのだけど、据え置き機として第9世代に入っているNintendo Switchが携帯機としては第8世代になっていたりして不思議な感じ。任天堂ソニーの携帯ハードはすべての世代のものを持ってるなぁ。PCエンジンGTワンダースワンも持ってた。なんとなく携帯タイプのほうが好きなのかも。

*1:Atari ST用に登場したNotatorという楽譜作成ソフトがシーケンサ機能を強化してオーディオも扱えるNotator Logicになり、その後AppleのLogicへとつながっていくのです

東京都のCOVID-19データを取ってくる(Julia版)

先月のエントリでRを使って東京都の新規陽性者数を取得してくるプログラムを作りました。

marui.hatenablog.com

今日はそれをJuliaでやってみたいと思います。とは言っても、Rでやっていることとほとんど同じで、HTTPパッケージを使って東京都のサイトにアクセスし、CSVで読み込んできたものを、DataFramesでデータフレームにしているだけです。

using DataFrames, CSV, HTTP

# read data from prefectural government website of Tokyo
daturl = "https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv";
dat = CSV.read(HTTP.get(daturl).body, header=1);

## data cleaning
dat2 = DataFrame(公表日 = CategoricalArray(dat[:,5]),
                 居住地 = CategoricalArray(dat[:,8]),
                 年代   = CategoricalArray(dat[:,9]),
                 性別   = CategoricalArray(dat[:,10]),
                 退院済 = CategoricalArray(dat[:,16]))

## summarize
describe(dat2)

実行結果は以下のようになります。

julia> describe(dat2)
5×8 DataFrame. Omitted printing of 1 columns
│ Row │ variable │ mean    │ min                │ median  │ max                │ nunique │ nmissing │
│     │ Symbol   │ Nothing │ CategoricalValue…  │ Nothing │ CategoricalValue…  │ Int64   │ Union…   │
├─────┼──────────┼─────────┼────────────────────┼─────────┼────────────────────┼─────────┼──────────┤
│ 1   │ 公表日   │         │ Date("2020-01-24") │         │ Date("2020-08-14") │ 178     │          │
│ 2   │ 居住地   │         │ -                  │         │ -                 │ 8       │ 389      │
│ 3   │ 年代     │         │ -                  │         │ 不明               │ 13      │          │
│ 4   │ 性別     │         │ -                  │         │ 男性               │ 5       │          │
│ 5   │ 退院済   │         │ 1                  │         │ 1                  │ 1       │ 6507     │

あとは煮るなり焼くなり……。

久しぶりにバス献血してきた

十代のころから献血を続けています。特に学生の頃は献血ルームまで徒歩2分のアパートに住んでいたこともあって、月初めの土曜日は献血というかんじの生活をしていました(残念ながら、その献血ルームは今年3月に閉所となってしまいました……その地方唯一の血液センターだったのに……)。

東京で暮らすようになってからも時間を見つけては献血ルームに通っていましたが、あまり都合が合わなくなり年1~2回という頻度になってしまっています。

このCOVID-19の状況下で血液センターに出かけるのを自粛する人も多いのでしょう、今朝「すべての血液型の血液が足りません」というメールが届きました。前回の献血から十分な期間があいていましたし、近くで献血できるところがあればすぐにでも行こうと思ってはいました。そこで、さっそく日本赤十字社のページ献血車のスケジュールを調べたところ、ちょうど職場のそばに来ていたので、職場に置いてあるものを取りに行くついでに献血に行ってきました。

f:id:amarui:20200808172037j:plain
東京芸術センター前広場に来ていた献血車

ふだんは献血ルームに行くので、献血車での献血は久しぶりです。事前の血液検査は指先に針を刺すだけ(献血車では全血献血しかやらないのでこの方法で良いとのことです)になっていましたし、バス内部の仕組みなどもいろいろと変わっていました。

僕は両腕ともに献血の神に愛された血管を持っているので、いつも職員の方にうらやましがられたり褒められたりします。今日は400 mL全血献血でした。

東京都のCOVID-19データに指数関数をあてはめた

昨日、データが取って来れるようになりました。

marui.hatenablog.com

そこで、緊急事態宣言解除後の新規陽性者数について指数関数をあてはめてみました。

f:id:amarui:20200724125953p:plain

縦の破線が緊急事態宣言と解除の日*1、赤色の実線が7日間移動平均線で、緑色が指数関数フィットです。数日後まで外挿してあり、7日後は約450人となっています。

さらにこのペースのまま曲線を伸ばしてみると、21日後には1000人を超えるらしいことが計算できます。しかし、過去のデータに指数関数をあてはめて外挿してというのには、「得られたデータは正しい(操作されていない、集計方法に途中変更がない)」「このデータは指数関数のモデルから生じている」「過去に起きたことが未来もこのまま続く(誰も行動を変えない)」などという、本当にそうなるの?と思う点がいくつかあります。なので、占いみたいなものです。当たるも八卦当たらぬも八卦

*1:どちらも全国を対象としたもの。東京を含む都市部は1週間ほど早い4月7日に当初緊急事態宣言が発出されていました。参考:政府 2020年5月25日 緊急事態解除宣言(全国で解除)/新型コロナウイルス感染症特設サイト/とりネット

東京都のCOVID-19データを取ってくる(R版)

今日の東京都では366人の新規陽性者数が確認されましたね。今後どうなることやら。

catalog.data.metro.tokyo.lg.jp

統計を勉強している人は、生きているデータだとモチベーションが上がるし有用性もあるかもしれないから自分でもデータ分析してみよう、なんて考えるのではないでしょうか。すでに様々な人がプログラムを書いていると思いますが、遅ればせながら僕も東京都が公開しているデータを読み込んでグラフを書くプログラムを作ってみました。

# 東京都のサーバーからCSVを読み込む
dat_csv_url <- "https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv"
dat <- read.csv(dat_csv_url, fileEncoding="UTF-8-BOM", header=TRUE, row.names=1)

# データのクリーニング
dat <- dat[, c(4, 7, 8, 9, 15)]
colnames(dat)<- c("公表日", "居住地", "年代", "性別", "退院済")
dat$公表日<- as.Date(dat$公表日, format="%Y-%m-%d")
dat$居住地 <- factor(dat$居住地)
dat$年代 <- factor(dat$年代)
dat[dat$年代=="'-",]$年代 <- "不明"   # 年代が '- となっているものを 不明 とする
dat$年代 <- ordered(dat$年代, levels=c("10歳未満", "10代", "20代", "30代", "40代",
                    "50代", "60代", "70代", "80代", "90代", "100歳以上", "不明"))
dat$性別 <- factor(dat$性別)
dat[dat$性別=="'-",]$性別 <- "不明"   # 性別が '- となっているものを 不明 とする
dat[dat$性別=="女",]$性別 <- "女性"   # 性別が 女 となっているものを 女性 とする
dat$性別 <- factor(dat$性別)
dat$退院済 <- factor(dat$退院済, levels=c(0, 1))
dat[is.na(dat$退院済),]$退院済 <- 0   # NAのデータは未退院(0)とする

以上でデータの整理ができました。データの概要を見るためにsummaryを使ってみます。

> summary(dat)
     公表日                    居住地          年代          性別      退院済  
 Min.   :2020-01-24               : 239   20代   :3096   女性  :4072   0:2868  
 1st Qu.:2020-04-16   湖南省長沙市:   1   30代   :2058   男性  :5974   1:7186  
 Median :2020-05-12   湖北省武漢市:   2   40代   :1381   調査中:   1           
 Mean   :2020-05-26   調査中      :  85   50代   :1146   不明  :   7           
 3rd Qu.:2020-07-11   都外        : 425   60代   : 725                         
 Max.   :2020-07-22   都内        :8965   70代   : 632                         
                      ―          : 337   (Other):1016     

居住地が空白になっているものとダッシュになっているものがありますが、不明にまとめてしまってしていいか分からないのでそのままにしています。

テレビなどでよく見る新規陽性者数の推移をプロットするのには以下のように、公表日ごとの人数を集計します。

# 新規陽性者数のグラフ
num.positive <- table(dat$公表日)
plot(num.positive, xlab="公表日", ylab="新規陽性者数")
grid()

ついでにN日間移動平均線を追加しましょう。以下ではN=7としています。

# N日間移動平均
npos <- as.data.frame(num.positive)
colnames(npos) <- c("公表日", "新規陽性者数")
N <- 7
npos$移動平均 <- filter(npos$新規陽性者数, rep(1,N)/N, sides=1)
lines(npos$公表日, npos$移動平均, col=2, lwd=2)

出てきたグラフは以下のようになりました(今日公開されているのは昨日までのデータなので366人の新規については入っていません)。CSVファイルで情報提供されていると、いろいろな人が試してみることができるのでいいですね。

f:id:amarui:20200723172059p:plain

Chromeのアプリ用URL

昔からabout:のようなちょっと秘密のURLというのはありました。

gigazine.net

このところChromeの使用頻度が上がったので、Chromeの隠し機能をオンオフできるchrome://flagsなどを知りました。そして、そのちょっと秘密のURLの一覧表にアクセスできるというURL(chrome://chrome-urls)があるというのも知りました。

news.mynavi.jp

面白いのもあるけど、chrome://newtabとか何に使うんだろう……?(ウェブページからは実行できず、アドレスバーに入力する必要があるみたいなので、手動でタブを開いてそこに記入するとそのタブが新しくできたものとされる、という何を言っているのか分からない状況なのです。)

WWDC 2020で発表されたAirPods Proの3Dオーディオ

今回のWWDC 2020では、MacIntelチップからARMチップへの以降が発表されて盛り上がりました。しかし個人的に最も嬉しかったのはAirPods Proのアップデートでした。以下のビデオの42分25秒付近から始まる3分間です(ボタンを押すと42分25秒から再生されると思います)。

発表されたのは、デバイス間の自動切り替え(automatic switching)と空間オーディオ(spatial audio)の2点です。前者も便利といえば便利ですが、後者の空間オーディオがすごいのです。AirPods Proは左右独立のBluetooth接続イヤホンなはずなのに、iPhoneiPadとの相対的なヘッドトラッキングを行って適切なHRTFを畳み込むことで5.1 ch、7.1 ch、Dolby Atmosにも対応するとのことです。AirPodsを買う気がなかったため、この発表を見るまではAirPods Proの中にジャイロセンサーや加速度センサーが入っているとも気づいていませんでした(さっき見たら仕様表に書いてあった……)。

以下の記事によると、開発者はAirPods ProのモーショントラッキングAPI(Core Motion)が使えるそうで、どんなアプリが出てくるかとても楽しみです。

www.phileweb.com

このアップデートはiOS 14にあわせて行われる予定です。昔から使っているソフトがあるために僕はiPhone XsiOS 12のまま使い続けてきたのですが、この発表を受けて(別件でAirPods Proをじっくり試聴できる機会もあって性能にも驚き)思わずAirPods Proを購入してしまいました。ちゃんと設定して使うためにiPhoneiOS 13にアップデートしてしまい、今ではiOS 14を心待ちにしています。