mongodb接続時のerror:non ascii character detectedエラー

環境:CentOS5.2

すでにあるMongoDBに接続し、以下のようなエラーが出る場合にはインストールされているMongoDBのバージョンを確認してください

> db.sample.find()
error:non ascii character detected
$ mongo --version
MongoDB shell version: 1.6.4

どうもCentos標準のYumリポジトリのMongodbはバージョンが古いようなので日本語がうまく扱えない模様です。

そこでリポジトリを追加します

# cat /etc/yum.repos.d/mongodb.repo
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1

古いMongodbを削除し再度インストールします

# yum remove mongodb
# yum install mongodb-org
# mongo --version
MongoDB shell version: 2.6.9

これで問題なく日本語が表示されるようになります

VirtualBox上のWindows7のWindows Updateが失敗する

ちょっとハマったというか不思議なのでメモ

VirtualBoxにWindowsをインストールして使っている人は多いと思います。

すっかりMacユーザになってしまったので、たまにWindowsしか動かないアプリケーションを使う必要がある際にはこのVirtualBoxで作成したWindowsが役に立ちます。

しかし、Windows7など、ちょっと古めのOSをクリーンインストールすると、WindowsUpdateで更新しないといけないパッチが100以上になることもあります。

このさい、あまりに多いとWindowsUpdateで失敗してしまうのですが、必ず失敗してしまう時にVirtualBoxのネットワークの設定がNATになっているのならばブリッジ接続に変更するとうまくいく場合があるみたいです。

かなりはまりました。。

RをScalaから呼び出し、Eclipseのspecs2でテストする

以外と面倒だったのでメモ

環境
  • Mac OS X 10.10
  • eclipse 4.4
手順 

Rのインストール

brew install r

scalaプロジェクトの作成

$ tree
.
├── build.sbt
├── lib
├── project
│		├── build.properties
│		└── plugins.sbt
└── src
		├── main
		│	 ├── resources
		│	 └── scala
		└── test
				├── resources
				└── scala

rjavaを使うためのライブラリをコピー

$ cp -rp ~/Library/R/3.2/library/rJava/jri/JRI.jar lib
$ cp -rp ~/Library/R/3.2/library/rJava/jri/libjri.jnilib lib

テストを作成

import org.specs2.mutable._
import org.specs2.runner.JUnitRunner
import org.junit.runner.RunWith
import org.rosuda.JRI.{ REXP, Rengine }

@RunWith(classOf[JUnitRunner])
class RTest extends Specification {
	"r " should {
		"r check" in {
			val engine = new Rengine(Array("--no-save"), false, null)
			val result = engine.eval("sum(c(1, 2, 3, 4))")
			engine.end()
			println(result.asDouble)
			result.asDouble mustEqual 10.0
		}

	}
}

build.sbt

name := "sample"

version := "1.0"

scalaVersion := "2.11.6"

javaOptions in run += "-Djava.library.path=" + System.getProperty("java.library.path") + ":lib"


libraryDependencies ++= Seq(
		"org.specs2" %% "specs2-core" % "3.6.2" % "test",
		"org.specs2" % "specs2-junit_2.11" % "3.6.2"
)

scalacOptions in Test ++= Seq("-Yrangepos")
 
retrieveManaged := true	// lib_managedへjarをコピーする

plugin.sbt

addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")

build.properties

sbt.version=0.13.8

eclipse用変換

sbt eclipse
Rの設定
install.package("rJava")
Eclipseの設定
  1. Eclipseを起動し、プロジェクトを取り込む
  2. プロジェクトのプロパティからjava build path > libraries > add jarsでJRI.jarを追加
  3. JRI.jarの左三角マークをクリックしnative library locationにlibディレクトリを追加
  4. RTest.scalaを右クリックから、Debug Configuration > environment にR_HOMEを設定
R_HOME=/usr/local/Cellar/r/3.2.1_1/R.framework/Resources

これで実行できます

Rでチャートを書いてみる(9)

どうやらまたYahooの時系列データの仕様が変わったようです。

http://d.hatena.ne.jp/anagotan/20140816/1408276789

こちらで書いたものが使えなくなっていました。具体的には先頭(直近)のページのみのデータしか拾えていません。

そこでちょっとまたまた、いじってみました。

RFinanceYJを作った方の真意わかりませんがquoteTsData関数の

while( result.num >= 51 ){
..
result.num <- xmlSize(quote.table)

この部分で次ページがあるかどうか判定していたのがうまく作用しなくなっています。

そこで下記のように修正してみました。

library(RFinanceYJ)
#API
quoteStockTsData <- function(x, since=NULL,start.num=0,date.end=NULL,time.interval='daily')
{
	time.interval <- substr(time.interval,1,1)
	function.stock <- function(quote.table.item){
		if( xmlSize(quote.table.item) < 5) return(NULL) 
		d <- convertToDate(xmlValue(quote.table.item[[1]]),time.interval)
		o <- as.number(xmlValue(quote.table.item[[2]]))
		h <- as.number(xmlValue(quote.table.item[[3]]))
		l <- as.number(xmlValue(quote.table.item[[4]]))
		c <- as.number(xmlValue(quote.table.item[[5]]))
		v <- ifelse(xmlSize(quote.table.item) >= 6,as.number(xmlValue(quote.table.item[[6]])),0)
		a <- ifelse(xmlSize(quote.table.item) >= 7,as.number(xmlValue(quote.table.item[[7]])),0)
		return(data.frame(date=d,open=o,high=h,low=l,close=c,volume=v, adj_close=a))
	}
	return(quoteTsData(x,function.stock,since,start.num,date.end,time.interval,type="stock"))
}
quoteFundTsData <- function(x, since=NULL,start.num=0,date.end=NULL,time.interval='daily')
{
	time.interval <- substr(time.interval,1,1)
	function.fund <- function(quote.table.item){
		d <- convertToDate(xmlValue(quote.table.item[[1]]),time.interval)
		if(time.interval=='monthly'){
			d <- endOfMonth(d)
		}
		c <- as.number(xmlValue(quote.table.item[[2]]))
		v <- as.number(xmlValue(quote.table.item[[3]]))
		return(data.frame(date=d,constant.value=c,NAV=v))
	}
	return(quoteTsData(x,function.fund,since,start.num,date.end,time.interval,type="fund"))
}
quoteFXTsData <- function(x, since=NULL,start.num=0,date.end=NULL,time.interval='daily')
{
	time.interval <- substr(time.interval,1,1)
	function.fx <- function(quote.table.item){
		d <- convertToDate(xmlValue(quote.table.item[[1]]),time.interval)
		o <- as.number(xmlValue(quote.table.item[[2]]))
		h <- as.number(xmlValue(quote.table.item[[3]]))
		l <- as.number(xmlValue(quote.table.item[[4]]))
		c <- as.number(xmlValue(quote.table.item[[5]]))
		return(data.frame(date=d,open=o,high=h,low=l,close=c))
	}
	return(quoteTsData(x,function.fx,since,start.num,date.end,time.interval,type="fx"))
}
######	private functions	#####
#get time series data from Yahoo! Finance.
quoteTsData <- function(x,function.financialproduct,since,start.num,date.end,time.interval,type="stock"){
	r <- NULL
	result.num <- 51
	financial.data <- data.frame(NULL)
	#start <- (gsub("([0-9]{4,4})-([0-9]{2,2})-([0-9]{2,2})","&c=\\1&a=\\2&b=\\3",since))
	#end	 <- (gsub("([0-9]{4,4})-([0-9]{2,2})-([0-9]{2,2})","&f=\\1&d=\\2&e=\\3",date.end))
	start <- (gsub("([0-9]{4,4})-([0-9]{2,2})-([0-9]{2,2})","&sy=\\1&sm=\\2&sd=\\3",since))
	end	 <- (gsub("([0-9]{4,4})-([0-9]{2,2})-([0-9]{2,2})","&ey=\\1&em=\\2&ed=\\3",date.end))
	
	if(!any(time.interval==c('d','w','m'))) stop("Invalid time.interval value")
	
	extractQuoteTable <- function(r,type){
		if(type %in% c("fund","fx")){
			tbl <- r[[2]][[2]][[7]][[3]][[3]][[9]][[2]]
		}
		else{
			tbl <- r[[2]][[2]][[7]][[3]][[3]][[10]][[2]]
		}
		return(tbl)
	}
	
	#while( result.num >= 51 ){
	while(1){
		start.num <- start.num + 1
		quote.table <- NULL
		quote.url <- paste('http://info.finance.yahoo.co.jp/history/?code=',x,start,end,'&p=',start.num,'&tm=',substr(time.interval,1,1),sep="")
		#cat(quote.url)
		#try( r <- xmlRoot(htmlTreeParse(quote.url,error=xmlErrorCumulator(immediate=F))), TRUE)	# これだと取得時にエラーが出た。。
		try(r<-htmlParse(quote.url))
		if( is.null(r) ) stop(paste("Can not access :", quote.url))
		
		#try( quote.table <- r[[2]][[1]][[1]][[16]][[1]][[1]][[1]][[4]][[1]][[1]][[1]], TRUE )
		#try( quote.table <- extractQuoteTable(r,type), TRUE )
		try( quote.table <- xpathApply(r,"//table")[[2]], TRUE )
 
		quote.size<-xmlSize(quote.table)
		#cat(paste("size:",quote.size))
		if(xmlSize(quote.table)<=1){
			return (financial.data)
		}
		if( is.null(quote.table) ){
			if( is.null(financial.data) ){
				stop(paste("Can not quote :", x))
			}else{
				financial.data <- financial.data[order(financial.data$date),]
				return(financial.data)
			}
		}
		
		size <- xmlSize(quote.table)
		for(i in 2:size){
			financial.data <- rbind(financial.data,function.financialproduct(quote.table[[i]]))
		}
		
		#result.num <- xmlSize(quote.table)
		Sys.sleep(1)
	}
	financial.data <- financial.data[order(financial.data$date),]
	return(financial.data)	
}
#convert string formart date to POSIXct object
convertToDate <- function(date.string,time.interval)
{
	#data format is different between monthly and dialy or weekly
	if(any(time.interval==c('d','w'))){
		result <- gsub("^([0-9]{4})([^0-9]+)([0-9]{1,2})([^0-9]+)([0-9]{1,2})([^0-9]+)","\\1-\\3-\\5",date.string)
	}else if(time.interval=='m'){
		result <- gsub("^([0-9]{4})([^0-9]+)([0-9]{1,2})([^0-9]+)","\\1-\\3-01",date.string)
	}
	return(as.POSIXct(result))
}
#convert string to number.
as.number <- function(string)
{
	return(as.double(as.character(gsub("[^0-9.]", "",string))))
}
#return end of month date.
endOfMonth <- function(date.obj)
{
	startOfMonth		 <- as.Date(format(date.obj,"%Y%m01"),"%Y%m%d")
	startOfNextMonth <- as.Date(format(startOfMonth+31,"%Y%m01"),"%Y%m%d")
	return(startOfNextMonth-1)
}

quoteStockTsData("6758.t",since="2014-01-01")

以前と同じようにRのコンソールにコピーアンドペーストで実行

> quoteStockTsData("6758.t",since="2014-01-01")
					date	 open	 high		low	close	 volume adj_close
1	 2015-01-20 2430.0 2466.5 2397.5 2462.5	8926300		2462.5
2	 2015-01-19 2425.0 2448.5 2402.0 2443.5	7436000		2443.5
3	 2015-01-16 2426.0 2437.5 2351.5 2384.0 15055500		2384.0
4	 2015-01-15 2453.5 2511.0 2452.5 2500.0	7843800		2500.0
..
252 2014-01-09 1898.0 1920.0 1870.0 1894.0 37843200		1894.0
253 2014-01-08 1799.0 1827.0 1788.0 1825.0 10182500		1825.0
254 2014-01-07 1820.0 1820.0 1792.0 1800.0	7516600		1800.0
255 2014-01-06 1815.0 1830.0 1787.0 1802.0 10114200		1802.0
> 

無事取れるようになりました

sbtプロジェクトを作成しeclipseでテストする

ちょっとハマったのでメモ

sbtプロジェクトを作成したのちに、eclipse上でJunitテストをできる環境を構築します。

Eclipseで右クリックからの scala Junit Testができるので非常に便利 

まずディレクトリおよびファイルを以下の構成で作成します

$ tree
.
├── build.sbt
├── project
│ ├── build.properties
│ └── plugins.sbt
└── src
		├── main
		│ ├── resources
		│ └── scala
		│		└── Model.scala
		└── test
				├── resources
				└── scala
						└── ModelSpec.scala

8 directories, 5 files

次にファイルの中を記述します

  • build.sbt
name := "sample"

version := "1.0"

scalaVersion := "2.11.6"

javaOptions in run += "-Djava.library.path=" + System.getProperty("java.library.path") + ":lib"


libraryDependencies ++= Seq(
		"org.specs2" %% "specs2-core" % "3.6.2" % "test",
		"org.specs2" % "specs2-junit_2.11" % "3.6.2"
)

scalacOptions in Test ++= Seq("-Yrangepos")
 
retrieveManaged := true	// lib_managedへjarをコピーする
  • build.properties
sbt.version=0.13.8
  • plugins.sbt
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")
  • Model.scala
case class Model(ival:Int,sval:String)
  • ModelSpec.scala
import org.specs2.mutable._
import org.specs2.runner.JUnitRunner 
import org.junit.runner.RunWith 


@RunWith(classOf[JUnitRunner]) 
class ModelSpec extends Specification {
	"model" should {
		"value check" in {
			val model=new Model(1,"s")
			model.ival mustEqual 1
			model.sval mustEqual "s"
		}
	}
}

Eclipseようにファイルプロジェクトファイルを作成してやります 

$ sbt eclipse

.project .classpath .settingsが作成され、依存するjarファイルがlib_managedに取り込まれいるのが確認できます

このままeclipseで読み込んで、ModelSpec.scalaを右クリックからのScalaJunitTestでテストできます。

Bootcampで外付けUSBにWindows

備忘録用に記録しておく。

bootcampは非常に便利なのですが、MacbookAirの128GディスクではWindows8を20Gパーティーションで入れるのにはちょっときつすぎます

ということで外付けUSBメモリに入れることにします。

USBメモリで起動用ディスク作成

http://uiuicy.cs.land.to/winpe06.html

この辺りを参考にUSBメモリを起動ディスクにします

Windows のインストール

http://posaune.hatenablog.com/entry/2014/05/01/184944

こちらの1と3を実施

ここでWindows8.1を使用する場合にはこちらからADKをダウンロードします

http://www.microsoft.com/ja-jp/download/details.aspx?id=39982

なおコマンドのある場所は上記のURLとは違います


C:\Windows\system32>"C:\Program Files (x86)\Windows Kits\8.1\Assessment and Depl
oyment Kit\Deployment Tools\amd64\BCDBoot\bootsect.exe" /nt60 e:
Target volumes will be updated with BOOTMGR compatible bootcode.

E: (\\?\Volume{56130f06-7576-11e4-830f-001c421b11f1})

		Successfully updated exFAT filesystem bootcode.

Bootcode was successfully updated on all targeted volumes.

C:\Windows\system32>"C:\Program Files (x86)\Windows Kits\8.1\Assessment and Depl
oyment Kit\Deployment Tools\amd64\DISM\imagex.exe"	/info c:\wim\install.wim

多分これで行けるはず?

herokuのGitをProxy越しに使う

git clone

heroku便利ですね。ただでいろいろなフレームワークを使ったアプリケーションを試すことができます!Postgresも使えるし。

proxyでsshなどが許可されていない場合にgitを使おうとするとタイムアウトでうまくいかない場合があります

$ heroku git:clone -a APPNAME
Cloning from app 'APPNAME'...
Cloning into 'APPNAME'...
ssh_exchange_identification: read: Operation timed out
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

proxy環境下だとHTTPくらいしか許可されていないのでHTTPでアクセスするオプションをつけることにします

$ export HTTPS_PROXY=http://proxy:port/
$ export HTTP_PROXY=http://proxy:port/
$ heroku git:clone -a APPNAME --http-git
Cloning from app 'APPNAME'...
Cloning into 'APPNAME'...
remote: Counting objects: 137, done.
remote: Compressing objects: 100% (131/131), done.
remote: Total 137 (delta 48), reused 0 (delta 0)
Receiving objects: 100% (137/137), 1.54 MiB | 642.00 KiB/s, done.
Resolving deltas: 100% (48/48), done.
Checking connectivity... done.

結構探したのですが、実はマニュアルに書いていました

https://devcenter.heroku.com/articles/http-git

git push

続いてgit pushです

$ git add .
$ git commit
[master c6abc8c] sample comment
 1 file changed, 1 insertion(+)
$ git push heroku master
fatal: 'heroku' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

こんな感じでエラーになります。http用に設定してやります

$ git remote add heroku https://git.heroku.com/APPNAME.git
$ git push heroku master
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 258 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
..

これだけ。簡単ですね

ちなみにHTTPでもherokuのgitにアクセスできます

$ git clone https://git.heroku.com/APPNAME.git

追記 20141226

どうもgit config –global http.proxy でPROXYを設定していると

could not resolve proxy ...

というエラーが出る場合があるようですが、この場合には~/.gitconfigの設定を削除すれば良いようです

Raspberry Pi Type B+にUSBメモリ増設

RaspberryPIを買って早1月以上。そろそろディスク容量も乏しくなってきました。もともと余っていた32GのMicroSDを挿していたのですが、データが増えるにつれてちょっと残りが寂しくなってきたので、上海問屋の64GUSBメモリを購入しました。

RaspberryPIはUSB3.0対応ではないので、USB2.0の安いものをチョイス。送料込みで3400円くらい。安い。。

早速挿してみました。フォーマット自体はFAT32。プラグアンドプレイなので差し込むだけでOK。コマンドラインからマウントしてやります

pi@raspberrypi ~ $ sudo fdisk -l

Disk /dev/mmcblk0: 31.7 GB, 31657558016 bytes
4 heads, 16 sectors/track, 966112 cylinders, total 61831168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000b5098

				Device Boot			Start				 End			Blocks	 Id	System
/dev/mmcblk0p1						8192			122879			 57344		c	W95 FAT32 (LBA)
/dev/mmcblk0p2					122880		61831167		30854144	 83	Linux

Disk /dev/sda: 64.5 GB, 64541949952 bytes
255 heads, 63 sectors/track, 7846 cylinders, total 126058496 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xc3072e18

	 Device Boot			Start				 End			Blocks	 Id	System
/dev/sda1							64	 126058495		63029216		c	W95 FAT32 (LBA)

pi@raspberrypi ~ $ sudo mount /dev/sda1 /mnt
pi@raspberrypi ~ $ df
ファイルシス	 1K-ブロック		 使用	 使用可 使用% マウント位置
rootfs						30311756 13465040 15569968	 47% /
/dev/root				 30311756 13465040 15569968	 47% /
devtmpfs						219832				0	 219832		0% /dev
tmpfs								44800			240		44560		1% /run
tmpfs								 5120				0		 5120		0% /run/lock
tmpfs								89580				0		89580		0% /run/shm
/dev/mmcblk0p1			 57288		 9896		47392	 18% /boot
/dev/sda1				 63012832		 2752 63010080		1% /mnt

こんだけ。マウント簡単。しかしここで問題が発生。

どうやら一般ユーザでは書き込めない模様。権限も変更できず。まあ、FATなので権限もクソもないのでどうしょうもないのでしょう。ちなみにROOTユーザなら読み書きOKですがそれだと使いづらいので、EXT4にフォーマットし直してやります

pi@raspberrypi ~ $ sudo fdisk /dev/sda

Command (m for help): d
Selected partition 1

Command (m for help): p

Disk /dev/sda: 64.5 GB, 64541949952 bytes
199 heads, 32 sectors/track, 19795 cylinders, total 126058496 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xc3072e18

	 Device Boot			Start				 End			Blocks	 Id	System

Command (m for help): n
Partition type:
	 p	 primary (0 primary, 0 extended, 4 free)
	 e	 extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-126058495, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-126058495, default 126058495): 
Using default value 126058495

Command (m for help): p

Disk /dev/sda: 64.5 GB, 64541949952 bytes
199 heads, 32 sectors/track, 19795 cylinders, total 126058496 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xc3072e18

	 Device Boot			Start				 End			Blocks	 Id	System
/dev/sda1						2048	 126058495		63028224	 83	Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

mkfsでフォーマット

pi@raspberrypi ~ $ sudo mkfs.ext3 /dev/sda1 
mke2fs 1.42.5 (29-Jul-2012)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
3940352 inodes, 15757056 blocks
787852 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
481 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424

Allocating group tables: done														
Writing inode tables: done														
Creating journal (32768 blocks): 
done
Writing superblocks and filesystem accounting information:				
done

pi@raspberrypi ~ $ mkdir /media/usb0
pi@raspberrypi ~ $ sudo mount /dev/sda1 /media/usb0
pi@raspberrypi ~ $ df
ファイルシス	 1K-ブロック		 使用	 使用可 使用% マウント位置
rootfs						30311756 13498480 15536528	 47% /
/dev/root				 30311756 13498480 15536528	 47% /
devtmpfs						219832				0	 219832		0% /dev
tmpfs								44800			240		44560		1% /run
tmpfs								 5120				0		 5120		0% /run/lock
tmpfs								89580				0		89580		0% /run/shm
/dev/mmcblk0p1			 57288		 9896		47392	 18% /boot
/dev/sda1				 61907956		53196 58703352		1% /media/usb0

pi@raspberrypi /media/usb0 $ sudo chmod 777 .
pi@raspberrypi /media/usb0 $ mkdir data

ついでにマウント先も変更しました

WindowsでJekyll環境構築

jekyllをご存知でしょうか?そこいら中に記事があるので詳細はググればわかりますが、簡単にいえば静的HTMLのジェネレータフレームワークです。

Rubyで作成されていますのでgemで簡単にインストールできます。

がちょっとハマったので備忘録。。

環境

  • Windows8.1

インストール

まずはRUBYを入れます。Windows用のRubyはいろいろありますが、

http://rubyinstaller.org/downloads/

こちらからWindows用のMSIをダウンロードしインストールします。

C:\Ruby21-x64にインストールした後には環境変数PATHにC:\Ruby21-x64\binを追加します。

そのままgemでインストールしようとすると以下のエラーが出ます

C:\>gem install jekyll
ERROR:	Error installing jekyll:
The 'yajl-ruby' native gem requires installed build tools.
Please update your PATH to include build tools or download the DevKit
from 'http://rubyinstaller.org/downloads' and follow the instructions
at 'http://github.com/oneclick/rubyinstaller/wiki/Development-Kit'

どうやらMakeできなよと怒られたようです

DevelopmentKitなるものを同じページからダウンロードします。

DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe

現在だとこれになります。

これをC直下にc:\devkitというフォルダを作成しその中に解凍します

その後以下のコマンドを実行

C:\devkit>ruby dk.rb init
[INFO] found RubyInstaller v2.1.3 at C:/Ruby21-x64
Initialization complete! Please review and modify the auto-generated
'config.yml' file to ensure it contains the root directories to all
of the installed Rubies you want enhanced by the DevKit.
C:\devkit>ruby dk.rb install
[INFO] Updating convenience notice gem override for 'C:/Ruby21-x64'
[INFO] Installing 'C:/Ruby21-x64/lib/ruby/site_ruby/devkit.rb'

これで準備が整いました

あとはgemでインストール

C:\devkit>gem install jekyll
Temporarily enhancing PATH to include DevKit...
Building native extensions.	This could take a while...
Successfully installed yajl-ruby-1.1.0
Fetching: posix-spawn-0.3.9.gem (100%)
Building native extensions.	This could take a while...
Successfully installed posix-spawn-0.3.9
Fetching: pygments.rb-0.6.0.gem (100%)
Successfully installed pygments.rb-0.6.0
Fetching: redcarpet-3.2.0.gem (100%)
Building native extensions.	This could take a while...
Successfully installed redcarpet-3.2.0
Fetching: blankslate-2.1.2.4.gem (100%)
Successfully installed blankslate-2.1.2.4
Fetching: parslet-1.5.0.gem (100%)
Successfully installed parslet-1.5.0
Fetching: toml-0.1.1.gem (100%)
Successfully installed toml-0.1.1
Fetching: jekyll-paginate-1.1.0.gem (100%)
Successfully installed jekyll-paginate-1.1.0
Fetching: jekyll-gist-1.1.0.gem (100%)
Successfully installed jekyll-gist-1.1.0
Fetching: coffee-script-source-1.8.0.gem (100%)
Successfully installed coffee-script-source-1.8.0
Fetching: execjs-2.2.2.gem (100%)
Successfully installed execjs-2.2.2
Fetching: coffee-script-2.3.0.gem (100%)
Successfully installed coffee-script-2.3.0
Fetching: jekyll-coffeescript-1.0.1.gem (100%)
Successfully installed jekyll-coffeescript-1.0.1
Fetching: sass-3.4.5.gem (100%)
Successfully installed sass-3.4.5
Fetching: jekyll-sass-converter-1.2.1.gem (100%)
Successfully installed jekyll-sass-converter-1.2.1
Fetching: ffi-1.9.6-x64-mingw32.gem (100%)
Successfully installed ffi-1.9.6-x64-mingw32
Fetching: rb-inotify-0.9.5.gem (100%)
Successfully installed rb-inotify-0.9.5
Fetching: rb-fsevent-0.9.4.gem (100%)
Successfully installed rb-fsevent-0.9.4
Fetching: hitimes-1.2.2.gem (100%)
Building native extensions.	This could take a while...
Successfully installed hitimes-1.2.2
Fetching: timers-4.0.1.gem (100%)
Successfully installed timers-4.0.1
Fetching: celluloid-0.16.0.gem (100%)
Successfully installed celluloid-0.16.0
Fetching: listen-2.7.11.gem (100%)
Successfully installed listen-2.7.11
Fetching: jekyll-watch-1.1.1.gem (100%)
Successfully installed jekyll-watch-1.1.1
Fetching: fast-stemmer-1.0.2.gem (100%)
Building native extensions.	This could take a while...
Successfully installed fast-stemmer-1.0.2
Fetching: classifier-reborn-2.0.1.gem (100%)
Successfully installed classifier-reborn-2.0.1
Fetching: jekyll-2.4.0.gem (100%)
Successfully installed jekyll-2.4.0
Parsing documentation for blankslate-2.1.2.4
Installing ri documentation for blankslate-2.1.2.4
Parsing documentation for celluloid-0.16.0
Installing ri documentation for celluloid-0.16.0
Parsing documentation for classifier-reborn-2.0.1
Installing ri documentation for classifier-reborn-2.0.1
Parsing documentation for coffee-script-2.3.0
Installing ri documentation for coffee-script-2.3.0
Parsing documentation for coffee-script-source-1.8.0
Installing ri documentation for coffee-script-source-1.8.0
Parsing documentation for execjs-2.2.2
Installing ri documentation for execjs-2.2.2
Parsing documentation for fast-stemmer-1.0.2
Installing ri documentation for fast-stemmer-1.0.2
Parsing documentation for ffi-1.9.6-x64-mingw32
Installing ri documentation for ffi-1.9.6-x64-mingw32
Parsing documentation for hitimes-1.2.2
Installing ri documentation for hitimes-1.2.2
Parsing documentation for jekyll-2.4.0
Installing ri documentation for jekyll-2.4.0
Parsing documentation for jekyll-coffeescript-1.0.1
Installing ri documentation for jekyll-coffeescript-1.0.1
Parsing documentation for jekyll-gist-1.1.0
Installing ri documentation for jekyll-gist-1.1.0
Parsing documentation for jekyll-paginate-1.1.0
Installing ri documentation for jekyll-paginate-1.1.0
Parsing documentation for jekyll-sass-converter-1.2.1
Installing ri documentation for jekyll-sass-converter-1.2.1
Parsing documentation for jekyll-watch-1.1.1
Installing ri documentation for jekyll-watch-1.1.1
Parsing documentation for listen-2.7.11
Installing ri documentation for listen-2.7.11
Parsing documentation for parslet-1.5.0
Installing ri documentation for parslet-1.5.0
Parsing documentation for posix-spawn-0.3.9
Installing ri documentation for posix-spawn-0.3.9
Parsing documentation for pygments.rb-0.6.0
Installing ri documentation for pygments.rb-0.6.0
Parsing documentation for rb-fsevent-0.9.4
Installing ri documentation for rb-fsevent-0.9.4
Parsing documentation for rb-inotify-0.9.5
Installing ri documentation for rb-inotify-0.9.5
Parsing documentation for redcarpet-3.2.0
Installing ri documentation for redcarpet-3.2.0
Parsing documentation for sass-3.4.5
Installing ri documentation for sass-3.4.5
Parsing documentation for timers-4.0.1
Installing ri documentation for timers-4.0.1
Parsing documentation for toml-0.1.1
Installing ri documentation for toml-0.1.1
Parsing documentation for yajl-ruby-1.1.0
Installing ri documentation for yajl-ruby-1.1.0
Done installing documentation for blankslate, celluloid, classifier-reborn, coff
ee-script, coffee-script-source, execjs, fast-stemmer, ffi, hitimes, jekyll, jek
yll-coffeescript, jekyll-gist, jekyll-paginate, jekyll-sass-converter, jekyll-wa
tch, listen, parslet, posix-spawn, pygments.rb, rb-fsevent, rb-inotify, redcarpe
t, sass, timers, toml, yajl-ruby after 16 seconds
26 gems installed

「構文解析中に不正なマルチバイト文字列がありました」のエラー

ちょっとはまってしまったのでメモ

Rの関数にsource関数というものがあります。予め共通処理を書いておいたファイルを読み込む機能です。サブルーチンみたいなものでしょうか?

そこでsourceする際に、エラーが出る場合があります

> source("http://localhost/test.R")
以下にエラー source("http://localhost/test.R") :
構文解析中に不正なマルチバイト文字列がありました (102 行)
追加情報:	警告メッセージ:
In grepl("\n", lines, fixed = TRUE) :
入力文字列 102 はこのロケールでは不適切です

どうやら、エンコーディングの問題みたいです

使っているファイルのエンコーディングに合わせて明示的に示してやる必要があります

> source("http://localhost/test.R",encoding="utf-8")