karino2が調べた経済などの統計データを表示するアプリ。正式名称は「スマホに統計のグラフが降ってくる!」
内部的にはRのサブセットのスクリプトとテキストの解説が降ってきて、それを元にグラフを書いて表示するような作りになっている。 データはgoogle spread sheetsにまとめている。
スクリプト集
高齢者の労働参加率を求めた時に、労働力人口の比率と違うか?と思って調べてみた。あまり変わらなかった。
urlL <- Qurl("年齢階級別就業者数")
dfL <- read.csv(urlL)
urlWP <- Qurl("年齢階級別労働力人口")
dfWP <- read.csv(urlWP)
#
sumMonths <- function(total) {
n <- (length(total)/12)
y <- 1:n
for(i in 1:n) { b <- (12*(i-1))+1; e <- (12*(i-1))+12; y[i] <- mean(total[b:e]) }
y
}
#
calcRatio <- function(df) {
ytotal <- sumMonths(df["男女計: Total"](%22%E7%94%B7%E5%A5%B3%E8%A8%88%3A%20Total%22))
yover <- sumMonths(df["男女計: 65歳以上"](%22%E7%94%B7%E5%A5%B3%E8%A8%88%3A%2065%E6%AD%B3%E4%BB%A5%E4%B8%8A%22))
yratio <- 100*yover/ytotal
yratio
}
# 1968〜2022(2023は途中まで)
Lratio <- calcRatio(dfL)
# 1973〜2022(2023は途中まで)
WPratio <- calcRatio(dfWP)
Lratio2 <- Lratio[6:length(Lratio)]
length(Lratio2)
#length(WPratio)
#plot(1973:(1973+(length(Lratio2)-1)), Lratio2, main="65歳以上の労働力人口と労働参加率(%)", ylim=c(0,20), type="b")
#lines(1973:(1973+(length(WPratio)-1)), WPratio, type="b")
#legend(2000, 0, c("65歳以上労働参加率", "65歳以上労働力人口比率"))
単体
url <- Qurl("年齢階級別労働力人口")
df <- read.csv(url)
sumMonths <- function(total) {
n <- (length(total)/12)
y <- 1:n
for(i in 1:n) { b <- (12*(i-1))+1; e <- (12*(i-1))+12; y[i] <- mean(total[b:e]) }
y
}
ytotal <- sumMonths(df["男女計: Total"](%22%E7%94%B7%E5%A5%B3%E8%A8%88%3A%20Total%22))
yover <- sumMonths(df["男女計: 65歳以上"](%22%E7%94%B7%E5%A5%B3%E8%A8%88%3A%2065%E6%AD%B3%E4%BB%A5%E4%B8%8A%22))
yratio <- 100*yover/ytotal
# 1973〜2022 (2023は10月まで)
plot(1973:(1973+(length(yratio)-1)), yratio, main="65歳以上の労働力人口(%)", ylim=c(0,20), type="b")
url <- Qurl("人口")
pop <- read.csv(url)
url <- Qurl("人口推計")
popFuture <- read.csv(url)
#
years <- c(pop["Year"](%22Year%22), popFuture["Year"](%22Year%22))
olds <- c(pop["65歳以上(老年人口)"](%2265%E6%AD%B3%E4%BB%A5%E4%B8%8A%EF%BC%88%E8%80%81%E5%B9%B4%E4%BA%BA%E5%8F%A3%EF%BC%89%22), popFuture["65歳以上(老年人口)"](%2265%E6%AD%B3%E4%BB%A5%E4%B8%8A%EF%BC%88%E8%80%81%E5%B9%B4%E4%BA%BA%E5%8F%A3%EF%BC%89%22))
products <- c(pop["15~64(生産年齢人口)"](%2215%EF%BD%9E64%EF%BC%88%E7%94%9F%E7%94%A3%E5%B9%B4%E9%BD%A2%E4%BA%BA%E5%8F%A3%EF%BC%89%22), popFuture["15~64(生産年齢人口)"](%2215%EF%BD%9E64%EF%BC%88%E7%94%9F%E7%94%A3%E5%B9%B4%E9%BD%A2%E4%BA%BA%E5%8F%A3%EF%BC%89%22))
total <- olds+products
ratio <- (100*olds)/total
#
plot(years, ratio, ylab="%",main="15歳以上年齢に占める65歳以上人口の比率", type="b")
url <- Qurl("CPI")
df <- read.csv(url)
years <- df["Year"](%22Year%22)
cpis <- df["All items"](%22All%20items%22)
yearNum <- length(years)
begYear <- years[1]
res <- (begYear+1):(begYear+yearNum)
ratio <- 100*cpis[2:yearNum]/cpis[1:(yearNum-1)]
plot(years[2:yearNum],ratio,ylim=c(90,130), main="CPIの前年比の推移(%)", xlab="年度", ylab="前年比", type="b")
legend(2000, 100000, c("CPI"))
以下は古い話題。
現状統計グラフ!は、バックエンドにjson engineとgoogle spread sheetを使っている。 前者は単にjsonを吐いたりwebのリンク先urlを作っているだけなので、GithubPagesに乗り換えたい。 たまに触っては意外とTODOが多くて手がつかずに撤退、を繰り返しているので、少しここに作業メモを書いていく。
やる事
3が面倒でやる気を失ったが、そもそも単にhtmlでどうだろう? 結構良い感じになった。これでいいや。
あとは4を作ればやる気になるかなぁ。ただその前に1を調べる方がいいか。
If-Modified-Sinceは普通に動いている。これで良さそう。
あとは4のサイトを生成する所だけやったらアプリ側を変えようか、という気分になった。
TypeScriptの勉強も兼ねてやって4をやってみたらあっさり出来る。やりたい事が片付けられた、というのは印象良いね。 TypeScriptは別の言語というよりはJSにtype annotation入れてるだけって感じで、ほとんど学ばなくても使い始める事は出来るな。
という事で1, 3, 4が終わった。あとは2と5だけだな。
アプリ側を一通り対応して、一つ統計データも更新してみた。 画像共有が動かなくなって対応に苦戦する。
これまではexternal storageにフォルダをほってそこにpngファイルを吐き出し、それをcontent dbに突っ込んだ結果のurlをACTION_SENDのEXTRA_STREAMにくっつけて送っていた。 だがこのexternal storageに書くのができなくなって、DownloadsとかPicturesとかにしか書けなくなった。まぁそれはいい。
で、Downloadsに書いてそれをcontent dbに突っ込んだ結果のurlを同様に渡すと、どうも受け取る側が開けない。 うーん、公式のドキュメントだと以下が該当する所か? Sharing files - Android Developers
見てみると何故か途中からインテントを受け取る側のFileProviderの書き方になって、単に送るケースが良くわからない。 仕方ないのでFileProviderのコードを読んでいると、どうもdata下に保存してあるという前提でパスの前半と一致しているかチェックしているな。 つまりDownloads下に置いて共有するケースだとFileProviderは使えないっぽい。
うーん、まぁ画像共有はadmin業務として自分だけが使う機能なので、どうでも良い所ではあるが。
とりあえずcontext.getFilesDir()
の下にディレクトリほって共有用のファイルを置く事にする。
ついでにintentにintent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
もしておいた。
この辺はいろいろ試していたら動いたので、このフラグがいるかは試してないが、まぁいい。
という事で無事共有は動いた。それにしてもAndroid 11はなかなか酷い事になっているな。これだけの変更をしておきながら、標準的なケースで現行機種と将来の機種の両方に対応する推奨方法がどこにも書いていないというのはさすがにダメなんじゃないか。 さすがにもうちょっとしたらまともな対応をするだろうと思ってあまり近づかないでおきたい所。