继续学R:安装软件包

昨天学习了一下如何在Linux(Ubuntu )下装R(还好我们学的是R语言,而不是B语言😰),并且简单测试了一下如何使用。详情可以参考《学R:准备工作》,今天来继续学R。


(图片从 @dapeng 的帖子里偷的)

运行脚本

昨天我摸索出来执行R脚本的命令为:

R --slave -f hello.R

今天发现原来有一个专门的指令做这个工作:

Rscript

比如对于上述命令,我们可以修改为:

Rscript hello.R

除此之外,我们还可以用-e来直接执行一些语句,比如:

Rscript -e "1+1"
Rscript -e 'print("Hello World");'
Rscript -e "print(\"Hello World\");"
Rscript -e "print(\"Hello World\");1+1;2+2"

安装软件包

在使用Python语言时,我们知道可以使用pip指令来安装所需的软件包,那么R语言环境下,我们如何安装呢?答案是在R环境的提示符下直接使用类似如下指令即可:

install.packages("example_package")

比如我想安装一个caTools的东西(我也不知道是啥),这样做就可以鸟:

install.packages("caTools")

注:我是在普通用户账户下执行的R,所以执行上述指令是会提示我:

Would you like to use a personal library instead? (y/n) y

也就是说数据包被安装的本地,如果想安装到全局,估摸应该用sudo R来启动R环境(我瞎猜的,本地安装挺好,就不去测试了)

加载安装好的软件包,使用类似如下指令即可:

library(caTools)

见识一下

尽管”Hello World!”已经超级强大了,但是还是想见识一下更加强大的功能,在R语言的维基百科页面有一个曼德勃罗集合(Mandelbrot set)的例子,略作修改拿来运行一下,长长见识。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#install.packages("caTools")  # install external package
library(caTools) # external package providing write.gif function
jet.colors <- colorRampPalette(c("#00007F", "blue", "#007FFF", "cyan", "#7FFF7F",
"yellow", "#FF7F00", "red", "#7F0000"))
dx <- 400 # define width
dy <- 400 # define height
C <- complex(real = rep(seq(-2.2, 1.0, length.out = dx), each = dy),
imag = rep(seq(-1.2, 1.2, length.out = dy), dx))
C <- matrix(C, dy, dx) # reshape as square matrix of complex numbers
Z <- 0 # initialize Z to zero
X <- array(0, c(dy, dx, 20)) # initialize output 3D array
for (k in 1:20) { # loop with 20 iterations
Z <- Z^2 + C # the central difference equation
X[, , k] <- exp(-abs(Z)) # capture results
}
write.gif(X, "Mandelbrot.gif", col = jet.colors, delay = 25)

Mandelbrot.gif

虽然不知道是什么鬼,但是很漂亮,不是吗?

相关链接


This page is synchronized from the post: 继续学R:安装软件包

学R

最近因为CN区的 @dapeng 巨著《学R》上市销售,以及 @dapeng 在steemit.com上连载R语言教程跟大鹏学 R 语言(第一篇),在#cn 区掀起了一股学R的热潮。

比如美女 @dancingapple 也开始学R,这不禁让人颇有些紧迫感,人长得美,还会R,让别人咋办啊?不行,人丑更得多读书,我也要学R。


(图片从 @dapeng 的帖子里偷的)

可是我舍不得买书啊,那么就看 @dapeng 免费教程好了,可是一看,竟然都是在Windows下操作,可恶,Windows我是用来发帖子聊QQ的,怎么能用来学R,于是研究一下在Linux下咋玩吧。

安装

在Linux(ubuntu )下安装还是很方便的。

首先更新一下系统

sudo apt-get update
sudo apt-get upgrade

然后执行

sudo apt-get install r-base r-base-dev

就会安装R啦。当然了,这种方式安装的版本可能旧一点,不过我就是试试啦,不纠结这事,感兴趣的朋友可以试试其它安装方式。

开发环境

上述安装命令中的r-base-dev就是R的开发环境啦。

命令行中敲

R

回车,就会启动开发环境

然后我们就可以在里边瞎搞了。

Hello World

每学习一门语言,我做的第一件事就是写一个”Hello World!”出来,如果”Hello World!”运行起来,我就可以放心地和别人吹嘘我又掌握了一门高深的编程语言。

随便写两条打印语句试试

print("Hello World!")
print("Hello World!");

看来这些语言都差不多嘛。嗯,我可以放心的和别人吹嘘了我会R了。(在steemit上吹容易被识破,还是线下吹吧)

执行

有时候我们可能不想这样交互式的运行R,那么能否直接执行R的脚本呢?看一下R的帮助,试试能不能找出咋弄?

R --help

额,帮助信息有点长,不往这里贴了。不过还好找到一些貌似用来运行脚本的参数,来试试看。

vi编辑一个文件,写上print("Hello World!");保存为hello.R,然后执行下列指令:

R --slave -f hello.R

输出如下:

✌,就是这个味,哦不对,就是这个结果。

继续

接下来该怎么办?

咳咳,我已经掌握了R,我不会告诉你我已经可以熟练使用神马诸如加减乘除乘方开方之类的运算操作,神马cat\paste字符串连接之类的我也可以信手拈来,甚至我还会用高深的sprintf用来格式化输出。

你问我还有啥不会的,这个问题还用问吗?还有啥是我不会的我不会的我岂能告诉你。

不过讲真,想好好学R,还是看 @dapeng 的教程,或者买 @dapeng 《学R》这本书吧,只有专业的、系统的教程,才是适合拿来好好学习的。

相关链接


This page is synchronized from the post: 学R

JUSSI: 想说爱你并不是很容易的事

使用过steem JSON API的都知道我们调用JSON API有两种方式。以往大多数时候这两种方式都是正常工作的,但是最近遇到一个API,工作不正常,所以探究了一下到底是哪里出了问题。


(图源 :pixabay)

调用方式

说到两种调用方式,我们以获取用户信息的JSON为例:

方式一

{"jsonrpc": "2.0", "method": "call", "params": ["database_api", "get_accounts", [["oflyhigh"]]], "id": 1}

方式二

{"jsonrpc": "2.0", "method": "database_api.get_accounts", "params": [["oflyhigh"]], "id": 1}

在早些时候这两种工作方式都是正常的,但是如果我们现在使用https://api.steemit.com这个节点来调用上述两个API,则会发现方式二返回错误:

看了一下代码,get_accounts已经从database_api移到condenser_api中,也就是说第二种调用方式的返回才是正确的

处理方式的区别

那么调用方式一和方式二,steem节点都是如何处理的呢?

这部分代码在json_rpc_plugin.cpp

处理rpc的请求会放置到如下函数中

void json_rpc_plugin_impl::rpc_jsonrpc( const fc::variant_object& request, json_rpc_response& response )

进去之后会根据JSON的构成进行解析process_params

从上述代码中不难看出,尽管JSON的格式有所区别,但是最终都是提取出api、method、args然后再进行下一步处理,也就是说殊途同归

JUSSI

既然尽管JSON的构成有所差异,但是最终处理是殊途同归,那么上述两个调用应该返回同样的结果才对呢?要么是都好用,要么是通通不好用,为何方式一好用而方式二不好用呢?(确切地说方式二返回的错误信息才是正确的)

答案在于JUSSI,简单地说,它是steemd之上的一个缓存层,信息发送给steemd之前都在这里预处理一遍,然后再发送给steemd.

对应 RPC而言,它对类似方式一的数据进行了处理,不过把api部分处理成condenser_api,美其名曰:translate_to_appbase,所以两者的调用结果大相径庭。

好处 vs 坏处

对应我们从老旧的API构成以及使用老旧的调用方式而言,JUSSI自动帮我们处理了转换,比如我一直使用诸如方式一的调用,尽管是错误的,但是因为JUSSI的存在,我的错误调用反而能返回正确的结果,颇为神奇。

但是我们来看下列JSON:

{"jsonrpc": "2.0", "method": "call", "params": ["tags_api", "get_discussion", []], "id": 1}

忽略参数部分,这个JSON结构是正确的,调用后应该返回如下信息(表示我们没给对参数):

‘message’: “Bad Cast:Invalid cast from type ‘array_type’ to Object”},

但是上述调用却返回

‘message’: ‘Assert Exception:method_itr != api_itr->second.end(): ‘
‘Could not find method get_discussion’},

也就说因为JUSSI的存在,给出了完全错误的出错信息,真是成也萧何败也萧何呀。

结论

尽管JUSSI增加了容错性,使得老旧的API调用依旧可用,但是却蒙蔽了我们的双眼,让我们不知道自己使用了错误的调用方式或者说调用了错误的API。同时因为JUSSI的存在,使得一些正常的调用反而出错。所以从API调用这个角度而言,JUSSI真的让人爱不起来又恨不起来。

不过通过这次学习,我至少知道了STEEMD的API变动挺大,以后应该把程序中错误的调用方式都切换到正确的方式上来,尽量不要依赖于JUSSI的容错性。


This page is synchronized from the post: JUSSI: 想说爱你并不是很容易的事

停掉一台服务器和两个VPS,美滋滋

十多天前的帖子中我提到了要学会省钱,减少睡后支出。并提到“有几台服务器和VPS上边只跑着少量的东西,完全可以合并一下,这样我每月就可以节省好几百美元的睡后支出了。”


(图源 :pixabay)

其实服务器闲置的问题由来已久啦,大概从去年8月份起我就计划做合并工作了。因为合并服务器上的用户需要迁移数据、修改DNS、与用户确认等诸多繁琐的事情,所以一拖再拖,一转眼都快到一年了,再拖下去不定到猴年马月了。

其实很多时候并不是事情有多困难多麻烦,而是我们将事情想象的太过于困难和麻烦了。或者换个角度,其实我们老了、懒惰了,困难不过是自己为自己的拖延找的借口。好多年前类似迁移工作做过无数次,那时候年轻精力旺盛,并不觉得有什么克服不了的。

既然意识到自己的拖延,我就给自己定下一个目标,务必在本月内完成服务器的合并。定下来目标之后,再懒惰我也每天也要处理一些数据迁移之类以及与用户确认之类的工作。结果却是出乎意料的顺利,不到10天,我就完成了全部任务。

看了一下这台服务器的START DATE,开始于2014-06-05,一转眼已经4年啦,当初看似领先的配置,现在已经落伍啦。而就是这样的配置,SOFTLAYER照旧每月收我几百美元的费用,真心心疼。

尽管已经完成迁移和数据清理,但是服务器直到月底才会被取消,就是说无论你用或者不用,SOFTLAYER也不会给你提前取消退款,不过十几年一直都是这样,已经习惯了。至少处理玩取消服务器的流程,总算松了口气,拖延了快一年的事情终于完成了。

看着还有乱七八糟的一堆VPS,登陆上去看看有些VPS上边根本没啥重要内容,就是当时为了测试,放了点程序在上边。顺手清理出来两个也取消掉,加上取消服务器节省的开支,每月减少了数百美元的睡后支出,美滋滋啊。


(图源 :pixabay)

其实更美滋滋的是用实际行动克服了拖延,只要去做,很多困难和麻烦也都是可以克服的。

相关链接


This page is synchronized from the post: 停掉一台服务器和两个VPS,美滋滋

和朋友小聚

今天和一个朋友小聚,这个朋友是我以前的同事,现在是手游开发商。聊来聊去的话题聊到了手机游戏开发,他和我一通感慨手游开发的各种不易。要办一堆类似网文许可证之类的许可、要对接各大APP市场、还有面临一堆竞争对手的刷榜等不当竞争,等等等等

尽管他现在已经从激烈的厮杀中拼出一条血路,但是收入之类的还是不甚满意,他说甚至一些破解他游戏软件的都比他的收益要好,而他还要疲于升级软件、推广宣传、客户服务等等。


(图源 :pixabay)

聊到软件收入,他和我提起了另外一个前同事,也是做手机应用,却赚得盆满钵满,我说你可以向这个前同事取经啊,学学人家是如何赚钱的。结果他用一幅不屑的口吻和我说:大丈夫有所为有所不为,老油做的是骗钱的软件,我鄙视他。

哦,这激发了我的好奇心,是怎么样的骗钱软件,能赚到很多钱呢?于是他和我介绍,大家可能都玩过手机算命软件,有的更先进,扫描指纹就能算命。老油他们公司就开发了这样一款手机算命软件。

我接过话来,这也没啥啊,有人愿意花几块十几块买个算命软件,算来玩玩也没啥嘛,这钱赚的虽然容易点,但是也不算黑心,去街边找算命先生花五元十元不也是这么回事嘛,不过把这个流程电子化嘛,算命的也省事了,即便被骗几元,但是人家有时候就是买个安心呢。

“毛线的安心,我还没说完呢!你已经老油他们赚几元就满足啦,他们有更阴损的手段呢,现在不是流行什么指纹支付嘛,老油他们的算命程序刚开始都是正常使用的,培养起来用户一些刷指纹的习惯以后,说不定啥时候就弹出个订阅的对话框,然后用户习惯性的去刷,就订阅什么乱七八糟的包月了。”

“我擦,还能这么玩啊”我惊得目瞪口呆,不过想想我似乎没用过什么算命软件,也没开启什么指纹支付,就放心鸟。“老油他们每天进账海了去了,我赚的钱,连人家零头的零头,即便人家一个软件也卖不出去,现在光靠订阅就赚大发了。”

“你看我整天忧虑我的游戏榜上无名,而老油他们整天都担心上榜太靠前,所以他们监测各大市场的榜单变化, 再动态调整广告投放等等,以保证自己的应用别排进前多少名”。“这又是为何呢?不是越靠前越好吗?”我表示不懂。“排名太靠前,又他们的玩法容易被封掉,所以不敢太出头”,哎,这真是处处皆“学问”啊,可惜就是不学好的学问。


(图源 :pixabay)

问及我朋友之后的规划,他略带忧愁地回到:“就这么干着呗,太龌龊的手段我是不会用的,多说在程序上和推广上下下功夫,内购上优化一下,多增加一些土豪装备吧。对了,我之前写的那个演示的操作系统,最近还有人找到我了,要购买我的源码并打算拉我一起何做开发呢!”

“那不错啊,去和他搞操作系统吧”我羡慕的回答到,他以前自己开发了一个操作系统,并因为这个操作系统被大公司挖走,一直做到公司的首席架构师,可惜后来公司业务调整,他们被并入了闲职的部门,然后辞职改行开发手游了。

“啥不错啊,那东西就是玩玩,唬唬外行,你知道是咋回事的。”,“我哪知道咋回事啊,我也被唬住了呢”“哈哈”“哈哈哈哈”


This page is synchronized from the post: 和朋友小聚

@anti-spam 情况汇报

今天看了一下 @anti-spam 机器人的点赞记录,嗯,已经一整天没有踩到任何帖子了。这非常好,正是我想要的效果,因为这个反垃圾机器人的目的从来是不是为了踩人,而是为了保持CN区的良好环境。


(图源 :pixabay)

举个例子来讲,很多年以前火车站广场等地总有一些带红袖箍的大妈,有人往地上吐痰、扔烟头等,大妈就不知道从哪里冒出来:破坏卫生、罚款五元。这些大妈的目的是为了罚款创收还是保持广场卫生我不得而知,但是广场的卫生无疑因大妈们的存在而变好了。

而这个 @anti-spam 机器人和大妈们还略有不同,大妈们每次抓到破坏卫生的会有五元的收入,而 @anti-spam 每次踩人,都浪费一些VP,如果再加上几个跟踩的大户,估摸浪费的超过五元了。就好比大妈没抓到一个破坏卫生的,都罚款五元然后自己再掏出五元,把这十元一起撕碎,想想这场面也就醉了。

看了一下 #cn类目下这些天的发帖记录,其中5月17日我发布《提示:即将开启机器人踩中文区搬砖(Plagiarism)内容》,5月18日发布《anti-spam 机器人上线》

日期 发帖人数 文章数量
2018-05-15 241 452
2018-05-16 229 452
2018-05-17 223 372
2018-05-18 249 373
2018-05-19 180 271
2018-05-20 182 256
2018-05-21 195 276

看到19、20、21三天帖子数少了100多篇以上,说明机器人还是有效果的。虽然还有一些垃圾贴和抄袭帖子的存在至少以前一进 满目的情感小报和汽车广告杂志的感觉不再了。当然了,这也有搬砖的朋友们意识到了之前做法的问题,及时停掉他们的搬砖机器人的功劳。


(图源 :pixabay)

我之前说过,STEEM是一个自治的区块链(社区),STEEM的发展如何,由我们每个人的行为共同决定。现在各种UGC平台泛滥,尤其是大部分UGC平台都是中文平台并且剑指STEEM,一个常常被提到的问题就是垃圾内容泛滥。

虽然对这些平台能否超越STEEM,我一向并不感冒,但是垃圾内容泛滥倒是直接影响了用户对STEEM的使用体验,没准还会影响投资者的热情。英文那边有好多机器人在处理,中文这边他们处理不过来,@anti-spam来补补漏吧。

对于 @anti-spam 之后的发展并没有太多的规划,但是基本上会保证以下几点:

  • 只要有抄袭、搬砖SPAM等内容存在,@anti-spam 就会一直开下去
  • 我会时不时地查看 #cn 有没有新垃圾贴,更新名单
  • 之后可能会采取一些黑名单之外的机制来使其更加灵活地处理垃圾贴
  • 之后可能会将检查扩大到其它#cn 子社区


(图源 :pixabay)

再次感谢 #cn 区所有小伙伴的支持,包括停掉搬砖机器人的朋友,谢谢你们。


This page is synchronized from the post: @anti-spam 情况汇报

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×