安装ruby

过程中有点小曲折,我们leader是技术大牛,现在我生命中多了个超高智商处女座man了,还有一个是我老爸。o(∩∩)o..

记录下命令行:

rbenv

rbenv install -l

rbenv install 1.9.3-p484

ruby -v (报错ruby:commond not found)

rbenv  global 1.9.3-p484

ruby -v(正常了)

gem  install   bundler

rbenv  rehash

bundle install

(报错如下 Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.—–
libxml2 is missing.  please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies.)

原因是libxml2文件丢失

sudo apt-get install libxml2-dev  libxslt-dev

bundle install(这下正确了)

bundle exec rails server(报错)

cd config/

ll(看一下这里的conf文件)

cp log4r.yml.example log4r.yml(改一下文件后缀)

cp database.yml.example  database.yml(同上)

cp settings.yml.example settings.yml(同上)

rbenv rehash

rails sever

sudo mkdir -p  /opt/logs/cms

sudo chown  wangzheng:wangzheng /opt/logs/cms

mkdir log

touch log/development.log

rails server

vim常用指令及快捷键(持续更新)

发现了个非常赞的网站  http://openvim.com/

以下很多操作都是安装好vundle之后的操作哦

在命令行输入vim,进入vim,

输入 :NERDTree可以进入树形菜单

ctrl+t 光标会移动到顶端,输入**/abc   这样可以检索到所有名字中含有abc的文件

ctrl+ww 左右两侧的切换,左边是树形菜单,右边是代码,

ctrl+e 打开上一个打开过的文件

ctrl+n自动补全

shift+j 退行

shift+o 换行,另起一个新行

ctrl+c  快速切换到对应的controller

ctrl+v快速切换到对应的view

g;  跳到本文档上次编辑的地方

,a 显示曾经复制过的内容

shift+g 显示最后

shift+v选中后,按下=  可以调整格式,如对齐、缩进之类的

將光标移动到某个变量上,按gf可以打开,与此同时,ctrl+o可返回,ctrl+i可再次返回

:sp 切屏,水平方向上

:vs 垂直方向切屏

ctrl+f 上一页

ctrl+b 下一页

 

在操作的时候如果显示了you need to be root to perform this command,表示权限不足,在前面加sudo可以取得临时权限。

/字母  回车     (表示查找,n是从前往后,N是从后往前)

:%s/\$relea/17/g  替换$relea为17,看到g的时候很温馨,想到了js

 

Linux常用指令(持续更新)

PP真的是一位很有姿势的程序猿,有这样的邻居真好,榜样啊。

pwd 当前路径

df  -kh 当前盘符实用情况

top 系统当前的使用情况,进程状态

apt -get   update更新现有的程序

sudo apt -get install  vim 安装vim

sudo apt -get install curl 安装curl

curl -O http://mirrors.xxxxxx.repo 下载文件,大写的o能直接把名字赋给新文件,这是大小写的区别

yum makecache 生成缓存

mv   vimrc_bak_2    .vimrc   將前面的的文件移动并替换成后面的文件,也就是把前面的文件内容给后面的文件,名字还是后面的文件名

 

 

 

Linux常用热键(持续更新)

–圣诞节怎么过,

–略过。

今天装ubuntu的时候把windows覆盖了, 凌乱,TX童鞋建议我买mac,我问他这俩有啥区别,他说相当于拖拉机和保时捷的区别,好吧,我没开过拖拉机,也没坐过保时捷呢哦,如果他告诉我这是馒头和包子的区别,我肯定会心动的O(∩_∩)O

开始用ubuntu了,装上之后就是新版本的界面,如何改成旧版本呢,请看一下这篇文章吧,灰常实用。

www.psychocats.net/ubuntu/classicgnome

重要的热键:

[Tab]按键:命令补齐 和 文件补全。

[Ctrl]+c:停止当前执行的任务,在mysql里做退出的作用。

[Ctrl]+d:exit

[Ctrl]+[Alt]+t 打开终端,相当于搜terminal然后点击了。

在vim里[Ctrl]+[Shift]+v粘贴

cttl+pageup或pagedown在多个终端之间切换

 

关于seajs

      最近经常听到各种JS前缀的名称,瞬间感觉自己弱爆了,啥都没用过呢,这么下去将来怎么嫁人呢。

     多个js工程师一起开发项目,不能用一个js文件,不好管理,又不能用多个js文件,因为页面连多个js文件会变慢,应该怎么办,

用于模块化加载的RequireJS 和 SeaJS 则是模块加载器,倡导的是一种模块化开发理念,核心价值是让 JavaScript 的模块化开发变得更简单自然。     模块加载器一般可降级为文件加载器用,因此使用 RequireJS 和 SeaJS,也可以达成 LABjs 的性能优化目的。RequireJS 和 SeaJS 都是很不错的模块加载器,两者区别如下:

1. 两者定位有差异。RequireJS 想成为浏览器端的模块加载器,同时也想成为 Rhino / Node 等环境的模块加载器。SeaJS 则专注于 Web 浏览器端,同时通过 Node 扩展的方式可以很方便跑在 Node 服务器端

2. 两者遵循的标准有差异。RequireJS 遵循的是 AMD(异步模块定义)规范,SeaJS 遵循的是 CMD (通用模块定义)规范。规范的不同,导致了两者 API 的不同。SeaJS 更简洁优雅,更贴近 CommonJS Modules/1.1 和 Node Modules 规范。

3. 两者社区理念有差异。RequireJS 在尝试让第三方类库修改自身来支持 RequireJS,目前只有少数社区采纳。SeaJS 不强推,而采用自主封装的方式来“海纳百川”,目前已有较成熟的封装策略。

4. 两者代码质量有差异。RequireJS 是没有明显的 bug,SeaJS 是明显没有 bug。

 

GZIP压缩

     
      zip压缩文件听说过,GZIP对我可是新鲜词儿,这个世界好复杂,压缩是无处不在的,哈哈。
 
      GZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNⅨ系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。
       HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来.当然这也会增加服务器的负载. 一般服务器中都安装有这个功能模块的。
 
    吼吼,顺便把LINUX的解压缩默写一遍,省的自己下次忘记,
    tar -xvsf  xxxx.gz
    本想说这么多LINUX命令,我这脑子得背到猴年去,但是一想确实快到猴年了,心里一惊,争取猴年来临之前都背下吧,周末去大悲院拜拜神仙,哈哈。

对象的constructor属性

对象的constructor属性, 最初是用来标识对象类型的。

比如 ,我们定义一个 Person类,然后实例化两个对象。
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
}
var person1 = new Person(“Jam”, 25, “Software Engineer”);
var person2 = new Person(“Tom”, 27, “Doctor”);
 
这两个对象 都有 一个constructor 属性,该属性指向 Person
lert(person1.constructor == Person); //true
alert(person2.constructor == Person); //true
 

不过,提到对象类型检测,我们一般不这样做, 
因为 instanceof 操作符 更可靠一些
往往是这样用 alert(person1 instanceof Person); //true

session会话复制

     前几天请教了Yoda大神关于会话复制方面的问题,
 
     如果客户访问是两个服务器的东西,这样会有两个分别的session, 这两个session之间怎么交互,集群环境下,同构的服务器,专业术语叫做session复制,或者会话复制。
 
      session的复制是由应用服务器提供的,一般来说应用服务器都支持这个特性,比如WebLogic、WebSphere之类的
另外,通常这种Web服务器的集群,其前面会有一个接入代理,这个接入代理负责保证同一个session上来的请求分发到同一个主机,除非这个主机挂掉了。这个特性叫做session粘滞,或者叫做会话粘滞,但是也有代理的设置是均分请求的,就是无论是不是同一个客户端/会话过来的请求,都会产生摆动。简单来说,集群后面有2个服务器,那么请求12345中的135可能被分配到A,24被分派到B

这种东西,只有真正弄过大型应用的人才明白。比较大的集群是浙江移动,16个Server一个集群,共有4个集群。总共就是64个Server
而且,纯Web的集群和业务支撑的集群在设计考虑方面还是有点儿不同的。

http://www.blogjava.net/yoda/archive/2008/04/17/193891.html
这是Yoda之前翻译的一篇文档,介绍的很详细的
电商的又是另外一种方案了
电商比一般的企业内部应用的集群更复杂
但是很多原理是相通的。

淘宝或者京东这种电商的结构会更加复杂,首先web端可以大面积横向扩展,但是后台交易处理系统要保证并发不发生冲突,
比如银行这种的,基本的从前到后是这样一个顺序  防火墙->4层或者7层交换机->web静态内容集群->web动态内容(jsp,php,asp这种)集群->业务交易平台->核心数据,

每一层都可以使用集群方式。建行的核心数据都是2台大型机在运转,

建行的业务交易平台是16台机器。
 
感谢Yoda大神的耐心讲解,哈哈。

ruby学习