Tシャツ祭りや

ダミーヒルフィガー

# tableの枠線描くためにcss設定 Knit
# HTMLする前にConsole上で実行しておく必要あり
options(rstudio.markdownToHTML = function(inputFile, outputFile) {
    require(markdown)
    markdownToHTML(file = inputFile, output = outputFile, stylesheet = "my.css")
})

初期設定

library(RJSONIO, quietly = TRUE)
library(hwriter, quietly = TRUE)
library(base64, quietly = TRUE)
library(ReadImages, quietly = TRUE)
library(png, quietly = TRUE)
options(encode = "UTF-8")

関数定義

# base64ライブラリのオーバーライト
img <- function(file, Rd = FALSE, alt = "image", linesize = 72L) {
    tf <- tempfile()
    on.exit(unlink(tf))
    encode(file, tf, linesize)
    sprintf("%s<img src=\"data:image/png;base64,\n%s\" alt=\"%s\" />%s", if (Rd) 
        "\\out{" else "", paste(readLines(tf), collapse = "\n"), alt, if (Rd) 
        "}" else "")
}

# 画像のurlを与えるとDLしてpngに変換してbase64に変換して返す
conv.url2base64 <- function(url.str) {
    # 画像fileをlocaleに取得
    download.file(url.str, "pic1", quiet = TRUE)  #404問題は後で考える
    pic1j <- try(read.jpeg("win.png"), TRUE)
    if (is.null(dim(pic1j))) {
        # png
        b64 <- chartr("\\\n", "  ", chartr("\\\"", " '", img("pic1", alt = "image", 
            linesize = 10240L)))
    } else if (any(grep("^x89png", binf))) {
        # jpeg
        writePNG(pic1j, "pic1j")
        rm(pic1j)
        b64 <- chartr("\\\n", "  ", chartr("\\\"", " '", img("pic1j", alt = "image", 
            linesize = 10240L)))
        system("rm pic1j")
    } else {
        # それ以外は気にしない
        b64 <- NULL
    }
    system("rm pic1")
    return(b64)
}

ここから

# 収集するハッシュタグ
hash.tag <- "#Tシャツ祭り"
# Tシャツの数(2枚と6枚)を定義
tshirt.num <- list(loveT = 1:2, useR = 1:6)
# 収集する時間、今から何分前までか
min.limit <- 30
# 乱数発生のシード
my.seed <- as.integer(Sys.time())
# my.seed <- as.integer(10^as.integer(runif(1)*10)*runif(1))
options(encode = "UTF-8")

# JSONでデータを取得
tshirt.json <- RJSONIO:::fromJSON(content = URLencode(paste("http://search.twitter.com/search.json?show_user=true&rpp=100&lang=ja&q=", 
    hash.tag, sep = "")), encoding = "UTF-8")
# dataframeに変換
tshirt.df <- as.data.frame(do.call(rbind, tshirt.json))
# ↑これは仮の姿 真のdataframeをつくる
tshirt.dat <- do.call("rbind", lapply(as.list(tshirt.df["results", ]), function(x) {
    return(unlist(x$results[1:18]))
}))
tshirt.dat <- as.data.frame(tshirt.dat)

# twitterIDのユニーク取得,重複があるIDは最後にツイートした時間取得
twitter.ids <- structure(tapply(X = as.POSIXct(tshirt.dat$created_at, format = "%a, %d %b %Y %X %z"), 
    INDEX = as.factor(tshirt.dat$from_user), max), class = c("POSIXt", "POSIXct"), 
    tzone = "GMT+00:00")

# tweet時間チェック
val.twitter.ids <- twitter.ids[which(difftime(time1 = Sys.time(), time2 = twitter.ids, 
    units = "mins") < min.limit)]

# 当選判定用のdataframeを作成しておく
val.twitter.ids.df <- as.data.frame(matrix(NA, ncol = 3, nrow = length(val.twitter.ids)))
colnames(val.twitter.ids.df) <- c("speed", "rnd", "result")
rownames(val.twitter.ids.df) <- names(val.twitter.ids)
# tweetした速さ
val.twitter.ids.df$speed <- as.integer(difftime(Sys.time(), val.twitter.ids, 
    units = "secs"))
# 乱数発生
set.seed(my.seed)
val.twitter.ids.df$rnd <- runif(length(val.twitter.ids))
# Tシャツ当選
val.twitter.ids.df[which(rank(-1 * val.twitter.ids.df[, 1] * val.twitter.ids.df[, 
    2]) %in% tshirt.num$loveT), "result"] <- "loveT"
val.twitter.ids.df[which(rank(-1 * val.twitter.ids.df[, 1] * val.twitter.ids.df[, 
    2]) %in% (tshirt.num$useR + length(tshirt.num$loveT))), "result"] <- "useR"

# 当選者だけ抽出
election.winner <- val.twitter.ids.df[!is.na(val.twitter.ids.df$result), ]
# 彼らのprofile_img
winner.imgs <- tshirt.dat[tshirt.dat$from_user %in% rownames(election.winner), 
    c("from_user", "profile_image_url")]
winner.imgs <- as.data.frame(tapply(X = as.character(winner.imgs$profile_image_url), 
    INDEX = as.factor(as.character(winner.imgs$from_user)), min))
colnames(winner.imgs) <- "profile_image"
election.winner <- cbind(election.winner, profile_image = rep(NA, nrow(election.winner)))
# base64化
for (i in 1:length(winner.imgs$profile_image)) {
    election.winner$profile_image[i] <- conv.url2base64(winner.imgs$profile_image[i])
}

# 出力,seed, 応募総数
cat(paste("<H1>当選結果発表</H1><br><h4>乱数発生に使用したシードは", 
    my.seed, "です。</h4><br><h3>応募総数は", nrow(val.twitter.ids.df), 
    "人です。</h3><br><H2>その中で、当選者は以下の方々です。おめでとうございます。</H2><br>", 
    sep = ""))

当選結果発表


乱数発生に使用したシードは1344073200です。


応募総数は22人です。


その中で、当選者は以下の方々です。おめでとうございます。


print(chartr("\n", " ", hwrite(election.winner[, c("profile_image", "result")], 
    row.bgcolor = "#ffdc98")), type = "html")

[1] “

profile_imageresult
ActuaryDayimageuseR
chiralimageuseR
dichikaimageloveT
eiichesimageuseR
hereticreaderimageuseR
kimukou2628imageuseR
motake2010imageuseR
tetsuroitoimageloveT

save.image("tshirt.RData")