備忘録
デバックログ出力
http://www.mono-project.com/docs/advanced/pinvoke/dllnotfoundexception/
$ MONO_LOG_LEVEL=debug mono GdiExample.exe
備忘録
デバックログ出力
http://www.mono-project.com/docs/advanced/pinvoke/dllnotfoundexception/
$ MONO_LOG_LEVEL=debug mono GdiExample.exe
Rで作成したチャートをファイル保存する際にちょっとハマってしまったのでメモ
チャートを作成する際に、銘柄コードでグルグル回して作成したい場合があります。その際に、ロウソク足だけ、とかなら大丈夫なのですが、その上に重ね合わせたりする場合にファイル作成時にはうまくいかないことがあります。
これはOKです
png("file.png") candleChart(ohlc,theme="white") dev.off()
これだとpointsが描かれない
png("file.png") candleChart(ohlc,theme="white") addTA(points,on=1,col="red",type="b") dev.off()
こうすればうまくファイルに出力されます
candleChart(ohlc,theme="white") plot(addTA(points,on=1,col="red",type="b") dev.copy(png,"file.png") dev.off()
この辺りを参考にしました
Linuxでsambaを構築、Macから接続すると表記のようなエラーが出る場合があります。
Windows側からは特に問題なくつながるにもかかわらずです。
しばらく悩んだのですが解決策がわかったのでメモ。
[global] workgroup = MYGROUP server string = Samba Server Version %v security=share load printers = yes cups options = raw [user] path = /home/user guest ok = yes writable = yes share modes = yes guest account = user force group = user force create mode = 0774 force directory mode = 0755
こんな感じでゆるゆるのアクセス権限。
しかし、macからFinderのサーバへ接続では
「このサーバにアクセスするためのアクセス権がありません」
との冷たい表示。。
どうやら、/home/user ディレクトリのパーミッションが700になっていたのが原因でした。
777に変更すると問題なく接続可能。
Nobodyで最初接続しようとしているからなのでしょうか?
本来ならば適切な権限にする必要がありそうですがとりあえずこれでよし
環境: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にWindowsをインストールして使っている人は多いと思います。
すっかりMacユーザになってしまったので、たまにWindowsしか動かないアプリケーションを使う必要がある際にはこのVirtualBoxで作成したWindowsが役に立ちます。
しかし、Windows7など、ちょっと古めのOSをクリーンインストールすると、WindowsUpdateで更新しないといけないパッチが100以上になることもあります。
このさい、あまりに多いとWindowsUpdateで失敗してしまうのですが、必ず失敗してしまう時にVirtualBoxのネットワークの設定がNATになっているのならばブリッジ接続に変更するとうまくいく場合があるみたいです。
かなりはまりました。。
以外と面倒だったのでメモ
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
install.package("rJava")
R_HOME=/usr/local/Cellar/r/3.2.1_1/R.framework/Resources
これで実行できます
どうやらまた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上で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
次にファイルの中を記述します
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をコピーする
sbt.version=0.13.8
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")
case class Model(ival:Int,sval:String)
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は非常に便利なのですが、MacbookAirの128GディスクではWindows8を20Gパーティーションで入れるのにはちょっときつすぎます
ということで外付けUSBメモリに入れることにします。
http://uiuicy.cs.land.to/winpe06.html
この辺りを参考にUSBメモリを起動ディスクにします
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便利ですね。ただでいろいろなフレームワークを使ったアプリケーションを試すことができます!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 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の設定を削除すれば良いようです