R语言中的class()、mode()和typeof()的区别

今天对R语言中的这三个函数产生了疑惑,为什么有时候它们的运行结果一样,有时候却又不一样?

定义

mode
 The (Storage) Mode of an Object
Description
 Get or set the type or storage mode of an object.

typeof
 The Type of an Object
Description
 typeof determines the (R internal) type or storage mode of any object

class
 Object Classes
Description
 R possesses a simple generic function mechanism which can be used for an object-oriented style of programming.
 Method dispatch takes place based on the class of the first argument to the generic function.

解释

在R里面,每一个对象都有一个mode和一个class。
前者表示对象在内存中是如何存储的。 (numeric, character, list and function)
后者表示对象的抽象类型。

1
2
3
4
5
6
7
d <- data.frame(V1=c(1,2))
class(d)
# [1] "data.frame"
mode(d)
# [1] "list"
typeof(d)
# list

通过上面的例子,我们可以知道,data frame这种类型,在内存中作为list被存储,但是它们被包装成data frame。
对于某个函数的参数,它的类型是data frame,却不能说是list。

再来看mode和typeof。
mode和typeof通常返回同样的值,但也有例外。

typeof(c(1,2))
# [1] "double"
mode(c(1,2))
# [1] "numeric"

历史原因啦。R语言由S语言发展而来。
mode,为了和S语言兼容,返回R的对象的模式。
typeof是R语言特有的,返回一个R的对象的类型。(哎呀,解释不清楚啦)

参考

1.http://stackoverflow.com/questions/6258004/r-types-and-classes-of-variables
2.http://stats.stackexchange.com/questions/3212/mode-class-and-type-of-r-objects

大部分时候都是目光短浅的动物

大部分时候都是目光短浅的动物,只能看到眼前一小块;要是再远一点,便如同迷雾般不可捉摸。
写代码的时候,不时需要打印出一些debug信息,这样才能确认正确;见过有牛人,一次写完代码,最后调试一遍,通过。
看不到利好,往往不敢继续。所以需要给自己的甜头,引诱自己继续前行。
在普通人看不到任何收益的情况下,还能继续做,要么眼光比别人更长远,要么是因为情怀。


今天吃饭看见一个老太太,一个人点了份寿司,安安静静的吃完,离开。面容好平静。

敦煌旅行计划

Day1:南京-兰州

正宁路夜市(小吃):到达的当晚可以逛。
永昌路夜市(杂货):返程有空就逛,连着正宁路夜市。
中山铁桥:清朝。
省博:返程住兰州,有空逛,大约半天。

Day2:兰州-武威-张掖

武威旧称凉州,西夏文化,特色小吃:拨鱼儿、面片、三套车。
张掖
 丹霞景区(40元),最好早晨或者傍晚去,雨后更佳。
 大佛寺(41元),西夏国寺,卧佛。
 甘州美食广场。

Day3:张掖-嘉峪关-敦煌

嘉峪关
 关城、第一城、悬壁长城三景区联票,但距离较远。
 镜铁市场的眼镜烧烤有名。
瓜洲
 榆林窟,有空就去。

Day4:敦煌

敦煌市区以及莫高窟
 鸣沙山月牙泉(120元)傍晚去。
 市博。
 沙洲市场(敦煌夜市)。
东线:莫高窟。

Day5:敦煌

敦煌周边
西线:
 西北:玉门关(90km 40元)、雅丹魔鬼城(80km 80元)
 西南:西千佛洞(35km)、阳关(70km 50元包含博物馆)

Day6:敦煌-青海湖-兰州

Day7:兰州-南京

路线备忘

G30 丝绸之路:兰州-武威-张掖-酒泉-瓜洲:1000km
S314 瓜洲-敦煌:120km
G215-G315-G25 敦煌-青海湖-兰州

20160306 碎碎念

我有一个小侄子,吃饭时必须要拿iPad播放光头强,才能吃得下。
我以为只有小孩才会这样。
结果现在发现所有人吃饭都看着手机。
简直和筷子一样不可或缺。
下次我给大家表演一下,吃饭without手机。

必然

我们期待未来30年,哪些预言能够成为现实!

形成(Becoming)

无数在未来颠覆我们当前世界的产品,可能还没有发明出来,所以当下就是创业的最佳时机。
未来正在“形成”,正在被我们所塑造。我们没有迟到。
上学的时候有人讲“互联网的圈地时代已经过去了”,现在看来,过去的十年里,无数的互联网公司涌现出来,并且在几个巨头的统治下,顽强地生存着。人类的需求和欲望,是不断扩大和增长的,有这一点,就有足够的理由期待未来有更多的产品,来满足人类的需求。

知化(Cognifying)

大数据+计算能力+算法=人工智能时代。
一个有趣的循环:
1.机器人(电脑)干不了我的工作。
2.好吧,它会许多事情,但我做的事情,它不一定都会。
3.好吧,我做的事情它都会,但它常常出故障,这时需要我来处理。
4.好吧,它干常规工作时从不出错,但是我需要训练它学习新任务。
5.好吧,就让它做我原来的工作吧,那本来就不是人该干的。
6.哇,机器人正在干我以前做的工作,我的新工作不仅好玩多了,工资还高!
7.真高兴,机器人(电脑)绝对干不了我现在做的事情。

好了,我要去找工作了!

流动(Flowing)

如果某个产品可以依赖互联网复制,那么价格会趋近于免费。
但是下面这几种特性却无法复制,我们可以从这些角度创造价值:
1.即时性
2.个性化
3.解释性(用户手册、技术支持收费)
4.可靠性
5.获取权(云服务)
6.实体化(现场感)
7.可赞助
8.可寻性(相关性数据)
在“流动”的时代,互联网产品时开放的,可分享的,也是变化的。

屏读(Screening)

从古登堡以来,人们获取信息的方式,从书页转移到屏幕。未来我们的生活中会使用大大小小、分散在各处的屏幕。

使用(Accessing)

未来我们不需要真正“拥有”某些资源,我们只在需要的时候,租用/借阅/访问这些资源。

共享(Sharing)

我们分享我们的知识(StackOverflow),并且互相协作(github),看上去是免费提供的,但是参与者可以获得满足感。
如果对某个设想感兴趣,并且想把它制造出来,可以“众筹”,也就是粉丝们集体资助他们所喜爱的,再也没有比“众筹”更能让创作者受益的好方法了。

过滤(Filtering)

这个世界每秒钟创造出来的信息,可能我一辈子都阅览不完。这个一个信息爆炸的时代,最稀缺的资源是我们自己的注意力,我们需要过滤器,将这些大量丰富的信息缩减到令人满意的程度,再将我们的注意力投入之上。
事实上,这些过滤器已经在工作了。电子邮件服务器帮我们区分出正常邮件/广告邮件/垃圾邮件;朋友圈/微博只推送给我,那些我感兴趣的信息;亚马逊通过我的购买记录,给我推荐我可能感兴趣的商品信息,我无须再自己搜索。
Google这样的广告服务商,可以根据用户的信息,提供更加准确的广告投放服务。
未来我们会在自己的身体或者生活中加入更多的感知仪器,测量到的数据会发送给我个人的过滤器,让我得到更加准确有效的信息。

重混(Remixing)

文学作品/音乐/摄影作品/电影,这些作品在未来,最有可能发生再创作。同人小说创作、音乐改编、PS、电影片段剪辑。。。
法律上,应该如何界定一段代码、一个idea、一段旋律的所有权和期限,都可以是亟待探明的问题。

互动(Interacting)

通过各种各样的感应器,我们可以在增强现实/虚拟现实的世界里,用我们自己的感知和行为跟这个世界互动。
有些感应器可以增强我们的能力,比如视力、听力,有些感应器能够给我们添加一些新能力,比如GPS定位、X光透视、温度探测等。互动发生的区域,会比现在的手机和手表,离我们更近。
我们自己就是密码和数字身份证。我们的步态、心跳模式、敲击键盘的节奏、表情、眨眼的频率、坐下的姿势、声音等等,都是和他人不同的,也几乎无法仿造。

追踪(Tracking)

越来越多的物联网设备记录了我们生活中的各种数据:行驶记录、旅行记录、手机位置、公共摄像头、公共wifi、社交网络、浏览器、智能家居设备、健康追踪等等。我们不断增长的自身信息,被追踪、分析,甚至被利用。

提问(Questioning)

在互联网上提问,可能是别人回答你的问题,比如维基百科、知乎;也有可能是人工智能回答你的问题,比如Google、Siri。
好的提问创造更多价值。

开始(Beginning)

未来正在发生,我们就站在起点,能够参与其中,深感荣幸。


亚马逊链接:必然
必然

Git常用命令备忘

不用git简直就是反人类啊。
不过没有能力一下子把所有的命令都记住,先把常用的几个列下,具体的后面用到了再查。

示意图

git-map

  • remote
  • repository
  • index
  • workspace

-图中的remote是远程仓库,而repository、index和workspace都是在你本地。
remote还可以分为trunk repository和your own github repository。
如果你觉得别人的工程很好,想在此基础上嫁接自己的开发,那么fork一下,就会到你自己的github工程列表中。这些remote都是有独立的地址的,比如git自己的代码,提供一个唯一的地址供大家fork:

https://github.com/git/git.git   

-图中的repository是本地仓库,如果这个本地仓库刚刚被初始化,还是空的,那么我们需要clone一下远程仓库。
如果这个本地仓库是以前就创建好的,我们开发代码之前,应该取得(fetch)远程仓库remote的更新。

-图中的workspace是工作区,就是具体的代码文件。
-图中的index是暂存区,代码某个版本开发好后,需要add进index,就是告诉仓库,我修改了哪些文件,将会提交哪些文件。
此时使用commit命令来提交文件。
最后,把修改从本地仓库repository推送(push)到远程仓库(remote)。

1.git clone

重要的事情在前面说,clone之前需要init!

$ cd proj-dir
$ git init

clone命令会在本地主机生成一个目录,与远程主机的版本库同名。
如果要指定不同的目录名,可以将目录名作为git clone命令的第二个参数。

$ git clone <版本库的网址>
$ git clone <版本库的网址> <本地目录名>

比如,克隆jQuery的版本库。

$ git clone https://github.com/jquery/jquery.git

clone支持HTTP(s)、SSH、Git、FTP等协议。

2.git remote

git remote命令列出所有远程主机。
克隆版本库的时候,所使用的远程主机自动被Git命名为origin。

$ git remote
origin

使用-v选项,可以参看远程主机的网址。

$ git remote -v
origin  git@github.com:jquery/jquery.git (fetch)
origin  git@github.com:jquery/jquery.git (push)

如果想用其他的主机名,需要用git clone命令的-o选项指定。

$ git clone -o jQuery https://github.com/jquery/jquery.git
$ git remote
jQuery

3.git fetch

如果远程仓库的代码有更新,我们需要将这些更新取到本地。
通常建议在修改本地代码前做这件事。

$ git fetch <远程主机名>
$ git fetch <远程主机名> <分支名>

如果不指定分支名,则取回所有分支的更新。
如果指定分支名,则仅取回指定分支的更新。

那么,我怎么知道取哪个分支?
git branch命令的-r选项,可以用来查看远程分支,-a选项查看所有分支。

$ git branch -r
origin/master

$ git branch -a
* master
remotes/origin/master

上面的命令表示,本地主机的当前分支是master,远程分支是origin/master。

fetch只能从远程仓库取得代码,还没有合并到本地的代码中去。需要使用git merge命令或者git rebase命令,在本地分支上合并远程分支。

$ git merge origin/master
# 或者
$ git rebase origin/master

可是可是,如果我不想合并到现在的分支上怎么办呢。可以使用git checkout命令创建一个新的分支。

$ git checkout -b newBrach origin/master

上面命令表示,在origin/master的基础上,创建一个新分支。

4.git pull

取回远程主机某个分支的更新,并且与本地的指定分支合并。
同最开始的图上看,是不是相当于fetch+checkout?

$ git pull <远程主机名> <远程分支名>:<本地分支名>
$ git pull origin next:master

表示取回origin主机的next分支,与本地的master分支合并。
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。

$ git pull origin next

也就是先做git fetch,再做git merge。

$ git fetch origin
$ git merge origin/next

5.git add

把修改信息添加到index暂存区。
添加所有文件:

$ git add -A

添加指定文件到暂存区:

$ git add <文件1> <文件2>

也可以指定文件夹:

$ git add <文件夹>

删除文件,并且将删除信息也添加到暂存区:

$ git rm <文件1> <文件2>

重命名,并且将重命名信息也添加到暂存区:

$ git mv <原文件名> <新文件名>

6.git commit

把暂存区的修改,提交到仓库:

$ git commit -m "信息"

原则上是,每一个原子修改,都作一次提交。

7.git push

将本地分支的更新,推送到远程主机。

$ git push <远程主机名> <本地分支名>:<远程分支名>   

通常本地分支名和远程分支名都同名,可以省略远程分支名。

$ git push origin master

表示将本地的master分支推送到origin主机的master分支。

其他

显示暂存区和工作区的差异:

$ git diff    

显示有变更的文件:

$ git status

参考

1.阮一峰 Git远程操作详解
2.阮一峰 常用 Git 命令清单
3.廖雪峰 Git教程
4.Git官方文档
5.Git常用命令一览
git-cmd

利用hugo搭建个人博客入门教程

起因

之前看过腾讯工程师写的《Web全站工程师的自我修养》^1一书,萌生了搭建一个博客的想法,用来记录学习记录和生活感受。先用免费的github,挂载静态页面试试吧。原来计划使用道听途说的Jekyll,然后一不小心看到了这篇文章http://blog.coderzh.com/2015/08/29/hugo/,各种好:
1.只有一个二进制文件。
2.可以将宇宙标准MarkDown格式的文章自动转换为静态网页。
3.内置Web服务器,可以立即在本地查看修改结果。
那么就用hugo^2吧。有空再试试hexo^3

安装hugo

我是在mac上通过tar压缩文件安装的。
其他方法可以参考官方文档。
1.下载
 下载地址:https://github.com/spf13/hugo/releases
 我要的mac版,文件名长这样:hugo_X.YY_darwin_amd64.zip
2.解压
 解压后是这样:

$ ls -l   
total 31696
-rw-r--r--@ 1 username  staff     10480  2 28 21:38 LICENSE.md
-rw-r--r--@ 1 username  staff      7694  2 28 21:38 README.md
-rwxr-xr-x@ 1 username  staff  16201084  2 28 21:38 hugo_0.15_darwin_amd64

 试一试:

$ ./hugo_0.15_darwin_amd64 version   
Hugo Static Site Generator v0.15 BuildDate: 2016-02-28T21:38:32+08:00   

3.创建链接文件
 这么长的命令,用起来多不方便啊,我们简化一下。

$ ln -s /fullpath/fullpath/hugo_0.15_darwin_amd64 hugo
$ ls -l
total 31696
-rw-r--r--@ 1 username  staff     10480  2 28 21:38 LICENSE.md
-rw-r--r--@ 1 username  staff      7694  2 28 21:38 README.md
lrwxr-xr-x  1 username  staff        54  2 28 22:05 hugo -> /fullpath/fullpath/hugo_0.15_darwin_amd64
-rwxr-xr-x@ 1 username  staff  16201084  2 28 21:38 hugo_0.15_darwin_amd64

 亲测有效:

$ ./hugo version   
Hugo Static Site Generator v0.15 BuildDate: 2016-02-28T21:38:32+08:00   

4.加入PATH
 这还不够,我们要加到PATH里去。

$ which hugo
/fullpath/fullpath/hugo
$ vi ~/.bash_profile

 加入这一行:

export PATH=$PATH:/fullpath/fullpath

 这样你应该可以在任意位置运行hugo命令了:

$ hugo version   
Hugo Static Site Generator v0.15 BuildDate: 2016-02-28T21:38:32+08:00   

生成本地站点

安装好hugo之后,就可以很轻松地生成本地站点啦:

$ hugo new site mysite

hugo会在当前的目录下,生成mysite这个目录,cd进去,目录结构如下

archetypes/
content/
layouts/
static/
config.toml

其中content是MarkDown文章目录,layouts存放的是网站的模版文件,static存放的是图片、css、js资源等。config.toml是网站的配置文件,你也可以换成yaml、json等。

(2016/04/23 发现一个小问题,配置文件里categories不能填写大写字母。
可能hugo创建categories时不区分大小写。
然而在页面上点击一个categories后,在页面上却又全部转化成了大写字母。)

创建文章

在mysite目录下,创建一个[关于]页面:

$ cd mysite
$ hugo new about.md

内容自己填呗。
再创建一个文章页面:

$ hugo new post/2016-03-06-first.md

内容自己填。
想看看效果么?等等,还需要导入个主题。

导入主题

还是在在mysite目录下,创建一个文件夹,我们随便clone一个主题下来。
我在https://themes.gohugo.io上没有找到喜欢的主题,就直接拉了上面原文作者的主题。

$ mkdir themes
$ cd themes
$ git clone https://github.com/coderzh/hugo-rapid-theme.git
$ cd ..

(主题里面包含了作者的信息,如果需要使用,记得修改。)

调试

现在终于可以调试了。

$ hugo server --theme=hugo-rapid-theme --buildDrafts --watch

浏览器里打开:http://localhost:1313
选项watch会让服务器自动检测文章的改动,自动刷新浏览器,非常方便。

发布

在本地自己偷着看有什么意思,发布到github上去吧。
1.生成静态页面

$ hugo --theme=hugo-rapid-theme --buildDrafts --baseUrl="http://youngspring1.github.io"

 这里的url要替换成你自己的。
 所有的静态页面都会生成到public目录。

2.创建Repository
 在github上创建一个Repository,名为”youngspring1.github.io”。
 同样,不认识的名字要替换成你自己的。

3.提交
 把public目录下的内容,全部提交到刚刚创建的Repository中。

$ cd public
$ git init
$ git remote add origin https://github.com/youngspring1/youngspring1.github.io.git
$ git add -A
$ git commit -m "first commit"
$ git push -u origin master

 在浏览器中访问http://youngspring1.github.io

参考

原文作者coderzh搭建的中文的hugo站点:http://www.gohugo.org/