R&iPod touchの単語帳を強化したよ!!

この辺で初めて自分でTerminalで動く単語帳を作って、この辺でRで画像生成→iPod touchで単語帳として活用、とかを過去にやったりしてました。

で、今日はid:Hash先生お勧めの単語帳を試してみたり。うむうむ、なかなかよいな。

でも、以下の点で不満。

  • 英語→日本語、と日本語→英語の選択ができない
  • 日本語の入力はめんどうなので、選択式とかにしたい

「不満があるなら自分で作れ」というのが世の常なので、作りました。id:syou6162と言ったらもちろんRですね!!*1

http://itoshi.tv/d/?date=20080609#p01に刺激されて、何か作らねば!!とか思ってなんていないんだからね!!

こんなの!!

和→英

こっちは普通に入力していきます。

英→和

こっちは上にも書いた通り普通にやると入力が面倒なので、j、k、lから選択するという形にしました。ホームポジションから離れないで、どんどん行ける。

画像の生成

これもiPod touchで単語帳できるように、画像生成したよ!!今回は上のR単語アプリケーションで覚えてないやつなどのフィルターを通して、選択できるので効率的に勉強できる!!

iPod touchに取りこめば、こんな感じになるよ!!画像しか使ってないのでiPhoneが発売されても安心ですね!!

その他の機能

多彩なフィルタリング

Rで実行しているので、Rの様々な便利な機能をそのまま使うことができます。例えば、正解だった数と不正解だった数をカウントできるようにしているんですが、その数の比を取ってそれが1を越える→不正解のほうが多い問題のみで学習したい、という時には次のようにすればよいです。

ask_en('tango[(tango[1:11,]$num_of_mistake/tango[1:11,]$num_of_right > 1),]')

下の部分はRでよく見るやつですね。それにシングルクオーテションとかを付けただけです。

tango[(tango[1:11,]$num_of_mistake/tango[1:11,]$num_of_right > 1),]

あと、"日時"や"完全に覚えたかどうか"、"単語のグループ"などでもフィルタリングできます。

発音機能

「ええ、まじかよ?!」って感じですが、

system("say accommodate")

とかやれば発音してくれます。RじゃなくてOS Xの機(ry。まあ、Rを離れないで発音も聞けるというのは結構いいんじゃないでしょうか。

インポート、エクスポート機能

Rのデータの入出力の基本であるread.csvとかを使っているので、すでにあるデータも活用できます。また、単純なデータフレームの構造になっているので、出力するのも簡単です。

言いたいこと

みんなもっとRをRらしくない使い方して遊ぶといいと思うよ!!id:kkobayashiさんを喜ばせると、きっとすごいテクを披露してくれると思うんだ(とか言ってみる><)!!

ソース

ソースは長くなったので、続きを読むにしておくか。
関数の付近を読み込んであげているところ以外は、実際にどういう風にして勉強するかの付近を表わしています。

validation <- function(x){
  if(is.na(x$num_of_right)) x$num_of_right <- 0
  if(is.na(x$num_of_mistake)) x$num_of_mistake <- 0
  return(x)
}

register <- function(old=get("tango"),new,init=FALSE){
  new$reg_date <- Sys.time()
  new$num_of_right <- NA
  new$num_of_mistake <- NA
  new$group <- NA
  new$complete <- NA
  if(init == TRUE){
    return(new)
  }else{
    return(rbind(old,new))
  }
}

ask_en <- function(x){
  ask_private <- function(tango){
    for(i in sample(1:nrow(tango),nrow(tango))){
      answer <- readline(paste("> What is the meaning of ",tango[i,]$japanese,"?\n",sep=""))
      tango[i,] <- validation(tango[i,])
      if(tango[i,]$english == answer){
        tango[i,]$num_of_right <- tango[i,]$num_of_right +1
        cat("That's right",fill=TRUE)
      }else{
        tango[i,]$num_of_mistake <- tango[i,]$num_of_mistake +1
      }
    }
    return(tango)
  }
  eval(parse(text=paste(x,"<<-","ask_private(",x,")",sep="")))
  #永続化しないとダメ。globalな変数に触れない
}

ask_ja <- function(x){
  print_selections <- function(tango,select){
    counter <- 1
    for(j in select){
      cat("> ",paste(counter," : ",tango[j,]$japanese),fill=TRUE)
      counter <- counter + 1
    }
  }
  ask_private <- function(tango){
    for(i in sample(1:nrow(tango),nrow(tango))){
      cat(paste("> What is the meaning of ",tango[i,]$english,"?",sep=""),fill=TRUE)
      selection <- sample(c(sample((1:nrow(tango))[1:nrow(tango) != i],2),i),3)
      print_selections(tango,selection)
      answer <- readline()
      tango[i,] <- validation(tango[i,])
      key <- list(j=1,k=2,l=3)
      eval(parse(text=paste("num <- selection[key$",answer,"]",sep="")))
      if(tango[i,]$japanese == tango[num,]$japanese){
        tango[i,]$num_of_right <- tango[i,]$num_of_right +1
        cat("That's right",fill=TRUE)
      }else{
        tango[i,]$num_of_mistake <- tango[i,]$num_of_mistake +1
      }
    }
    return(tango)
  }
  eval(parse(text=paste(x,"<<-","ask_private(",x,")",sep="")))
  #永続化しないとダメ。globalな変数に触れない
}

write_pdf <- function(num,x){
  which_lang <- function(lang,x){
    pdf(paste(sprintf("%03i",num),lang,".pdf",sep=""),height=3,width=9)
    grid.newpage()
    pushViewport(viewport())
    grid.rect(gp=gpar(fill="white"))
    grid.text(x,gp=gpar(cex=3,fill="red"))
    popViewport()
    dev.off()
  }
  which_lang("en",x[1])  
  which_lang("ja",x[2])
}

convert_to_png <- function(num,x){
  which_lang <- function(lang,x){
    system(paste("sips -s format png ",sprintf('%03i',num),lang,".pdf --out ",sprintf('%03i',num),lang,".png",sep=""))
  }
  which_lang("en",x[1])  
  which_lang("ja",x[2])
}

tango <- read.csv("~/r/tango.txt")

new <- "english,japanese,example
aisle,通路
allergic to,〜にアレルギーがある
alternate,代わりの
amend,訂正する
apparatus,器具、装置"

new <- read.csv(textConnection(new))
tango <- register(tango,new)
#tango <- register(new=new,init=TRUE)
tango

ask_en('tango[1:3,]')
ask_ja('tango[1:3,]')

tango[1:nrow(tango),]$complete <- (runif(nrow(tango)) > 0.5)
tango

tango[tango[1:nrow(tango),]$complete == FALSE,]
aks_en('tango[tango[1:nrow(tango),]$complete == FALSE,]')
aks_en('tango[(tango[1:11,]$num_of_mistake/tango[1:11,]$num_of_right > 1),]')

tango[1:11,]$num_of_right <- sample(1:100,11)
tango[1:11,]$num_of_mistake <- sample(1:100,11)

save(tango,file="~/r/tango.Rdata")
load("~/r/tango.Rdata")

for(i in 1:nrow(tango)){
  write_pdf(i,c(as.character(tango[i,]$english),as.character(tango[i,]$japanese)))
  convert_to_png(i,c(as.character(tango[i,]$english),as.character(tango[i,]$japanese)))
}

*1:この辺とか