Categories
日常应用

从R到python散记(结束更新)

算是留条后路吧...anyway学门新语言总比学门新的课程简单一些。

1. 循环
Python 君貌似不是很喜欢操纵下标(不是C),循环比较直接:

for i in forset:

而不是for index in range(len(forset)): i=forset(index)

While和R的用法基本一直。也可以直接break跳出。

Categories
日常应用

linux学习笔记:JDK, rJava以及RJDBC

出于某些原因,最近申请了一个虚拟服务器(虽然有现成的R服务器,但是没有sudo总是各种不爽...),然后开始自己折腾linux...(向着码农方向前进,前进,前...)以下为小白笔记,抄在这里防止自己日后翻回来重新折腾一遍。高手请无视~

服务器是公司C3云上的一片,我选的ubuntu 12.04开始折腾。由于是远程server,所以只能shell操作 T_T 看不到ubuntu华丽丽的界面了。

装R倒是不麻烦,把镜像加一下就好了。编辑/etc/apt/sources.list,然后加上这句(看了一下我的ubuntu是precise版本的)。不加这句的后果就是...装了个上个世纪版本的R?

sudo vi /etc/apt/sources.list
deb http://cran.cnr.berkeley.edu/bin/linux/ubuntu precise/ #文件里加上这一行

然后就直接安...

sudo apt-get update
sudo apt-get install r-base

然后就开始折腾RODBC,给teradata跪了,安个teradata ODBC Driver死活不成功,最后请教同事决定投保RJDBC的怀抱。

JDBC基于Java,自然需要装JDK。网上搜了一下,貌似有个open jdk可用。

sudo apt-get install openjdk-7-jdk
sudo update-alternatives --config java #如果已经有多个jre,记得选一个...

然后保险起见,配一下java的路径。

sudo R CMD javareconf

如果看到下面这一段,那么就OK了。

JAVA_HOME        : /usr/lib/jvm/java-7-openjdk-amd64/jre
Java library path: $(JAVA_HOME)/lib/amd64/server
JNI cpp flags    : -I$(JAVA_HOME)/../include
JNI linker flags : -L$(JAVA_HOME)/lib/amd64/server -ljvm
Updating Java configuration in /usr/lib/R
Done.

然后就可以开始装R里面的那堆包了。R很神奇,必须sudo R之后install.packages()才有用...可怜我折腾了半天一直报错。
然后发现sudo的问题之后,顺利的装上了RJDBC.

sudo R
 install.packages("rJava")
 install.packages("RJDBC")

然后就是Teradata JDBC Driver了。这厮比ODBC好装的多...基本就是解压...然后就没有然后了。

都弄好了之后,就可以在R里面测试着玩了。

library(RJDBC)
jdbc.drv <- JDBC("com.teradata.jdbc.TeraDriver", c("/home/user_name/terajdbc4.jar", "/home/user_name/tdgssconfig.jar"))
 jdbc.conn <- dbConnect(jdbc.drv, "jdbc:teradata://xxxx", "xxx", "xxxx")

然后就是JDBC的一些相关函数了。

dbSendQuery(jdbc.conn ,"CREATE TABLE XXX AS XXXX WITH DATA;") #只执行不返回结果
dbGetQuery(jdbc.conn ,"sel 1 from xxx") #执行且返回data.frame(fetch完毕的)

然后就可以开始各种蹂躏了。

只是让我不爽的是,折腾了许久也没搞定发email...sendmail、mail什么的都不管用,莫非我SMTP没有配?继续google去了。

-----------------4.3更新----------------

原来C3和LDAP是直接集成的,所以别人的帐号也可以登入我的server。之后,一句命令可以加入sudo组:

sudo adduser username sudo

----------------4.4更新----------------

今天在同事的帮助下搞定了Rstudio Server版,瞬间爽翻了...

以前是ubuntu 12.04下有个东西装不上: libssl0.9.8。因为默认装好了1.0版本的。但是Rstudio现在的版本必须调用0.9.8版本...于是强行装旧版:

sudo wget http://mirrors.kernel.org/ubuntu/pool/universe/o/openssl098/libssl0.9.8_0.9.8o-7ubuntu3.1_amd64.deb
sudo gdebi libssl0.9.8_0.9.8o-7ubuntu3.1_amd64.deb

然后再去装一下Rstudio Server版就好了。

sudo gdebi rstudio-server-0.98.501-amd64.deb

然后为了调RJDBC,配置一下环境变量:

sudo vi /etc/profile

加入这么两行

export JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64/jre"
export PATH=$PATH:$HOME/bin:$JAVA_HOME/bin

然后刷新一下。

source /etc/profile

这样就搞定啦。Rstudio监听在服务器的8787端口。可以直接/server:8787 登入。

Categories
读书有感

python小试

今天非常无聊的决定去试一下python。找了一个题,大意如下:

  • 给定一个输入字符串,找出最漂亮的无重复子字符串。
  • 子字符串:从原字符串中减掉某些字符可得到的。
  • 无重复字符串:没有重复的字符
  • 甲比乙漂亮:甲的长度>乙,或者甲的字典排序在乙之后。

因为都是无重复的,所以肯定不需要甲的长度大于乙,故而是所有长度一样的无重复子字符串中,找出字典排序最大的。

这个先用R写的,为的是写出一个有效的算法来。基本的思路就是强行的逐层递归。

x = 'nlhthgrfdnnlprjtecpdrthigjoqdejsfkasoctjijaoebqlrgaiakfsbljmpibkidjsrtkgrdnqsknbarpabgokbsrfhmeklrle'

x_split = strsplit(x,split="")[[1]]
unique_x = unique(x_split) 
unique_x_order = sort(unique_x,decreasing=T) 
x_remain = character() 

# find the largest character than can be remained

#initialize
current_string = x_split
current_unique = unique_x
current_order = unique_x_order
while ( length(x_remain) < 20) 
{ 
  for(i in 1:length(current_order))
  { character = current_order[i]
    index = which(current_string == character)
    sub_string = current_string[min(index):length(current_string)]  
    if (length(setdiff(unique(current_string),unique(sub_string)))==0) #no lose of characters
    {x_remain = c(x_remain,character);
     current_string = current_string[-c(1:min(index),index)];
     current_unique = unique(current_string);
     current_order = sort(current_unique,decreasing=T);
     break;
    }
  }
}

#answer is 'tsocrpkijgdqnbafhmle'

后面用python重写了一遍。基本就是等价函数的替换...我是不是在暴殄天物的利用python?完全不理解program on the fly的感觉...

x = 'nlhthgrfdnnlprjtecpdrthigjoqdejsfkasoctjijaoebqlrgaiakfsbljmpibkidjsrtkgrdnqsknbarpabgokbsrfhmeklrle';
x_split = list(x);
unique_x = list(set(x_split));
unique_x.sort(reverse=True)
x_remain = list();
###initialize
current_string = x_split;current_unique = unique_x;current_order = unique_x;
while len(x_remain) < len(unique_x):
	for character in current_order:
		index = current_string.index(character);
		sub_string = current_string[index:len(current_string)];
		#print(character);
		if (len(set(current_string)-set(sub_string))==0): #no lose of characters
			x_remain.append(character);
			for i in range(sub_string.count(character)):
				sub_string.remove(character);
			current_string= sub_string;
			current_unique = list(set(current_string));
			current_unique.sort(reverse=True);
			current_order = current_unique;
			break;
print(x_remain);

最后好不容易写完python之后,发现网断了...没法在线提交了。等重新连上,时间已经过了,sigh。就当周末无聊历练一下了。

Categories
网络新发现

R+3D打印=可爱的网络模型

无意中刷feedly刷出来的...

small_3dprint-300x242这货居然是打印出来的...虽然大多数3D人偶神马的都很丑,这个网络模型倒是还可以看看的。貌似可以3D打印一些R会议纪念品什么的...

原文在此。作者用的是iGraph,然后在Shapeways上注册个帐号就好了。设计图vs实物图见下。

3D_and_blender

Categories
日常应用

七彩琴键图...(via ggplot2)

这个纯属做出来卖萌的...只是画出来有高有低比较像琴键的感觉,又按照类别填了一下颜色,所以再卖弄一下来个好听的名字——七彩琴键图。

Year over Year Growth
点击看大图

数据比较敏感,所以很多信息都删掉了...大概还是可以看出来横轴是时间,纵轴是增长率。增长率大于阈值40%则100%上色,否则设为半透明。颜色是ggplot2自己上的,还是挺美观的...从上而下,各个类别的表现比较容易直接区分,这也就是这张图的目的。此外标注了一些重要日期。

可能一般画增长率都会画折线图吧,我只是觉得同样的数据折线图画出来大起大落的太丑了,还是这样好看一些...

最后按惯例,放上代码。其实很短...

library(ggplot2)
require(scales)

# growth
ggplot(q4_yoy, aes(x=DT12, y=ll, color=NULL))+
geom_bar(stat = "identity",aes(fill=Vertical,alpha=ll>0.4))+ #柱状图,然后判断是否大于40%
scale_y_continuous(labels = percent_format())+ #纵轴改成百分比
facet_grid(Vertical~.)+ #分类别画出来
geom_hline(yintercept=0.4,alpha=0.9,color="grey",linetype="dotdash")+ #40%增长率的水平线
geom_vline(xintercept=as.numeric(as.Date("2012-10-31")),
alpha=0.5,color="red",linetype="dotdash")+ #一些重要的日期
geom_vline(xintercept=as.numeric(as.Date("2012-11-22")),
alpha=0.5,color="red",linetype="dotdash")+
geom_vline(xintercept=as.numeric(as.Date("2012-12-25")),
alpha=0.5,color="red",linetype="dotdash")+
geom_vline(xintercept=as.numeric(as.Date("2012-09-22")),
alpha=0.5,color="blue",alpha=0.5)+
#   annotate("text",label="Sep 22",x=as.Date("2012-09-22"),y=-0.5)+
theme_bw()#黑白底板