zsh介绍

先前用的shell是bash(一般程序员都这样吧= =),接触了一段时间zsh,非常好用的shell,最方便的地方,应该就是命令行补全和命令历史记录共享。下面来记录一下。

zsh简介

Shell是Linux/Unix的一个外壳,负责外界与Linux内核的交互,接收用户或其他应用程序的命令,然后把这些命令转化成内核能理解的语言,传给内核,之后再把结果返回用户或应用程序。

Linux/Unix提供了很多种Shell,可以通过以下命令查看系统中自带的shell:cat /etc/shells

初期zsh并不是那么好用,因为配置复杂。直到有一天国外有个程序员开发出了一个快速上手的zsh项目「oh my zsh」,人气开始聚集起来。

好,下面我们看看如何安装、配置和使用 zsh。

zsh安装

如果你使用的是Mac,那么可以跳过安装这一节,Mac自带了zsh。

安装zsh

apt-get install zsh ### 安装oh my zsh 自动安装:

wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh 手动安装:

git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

zsh配置

与bash类似的配置文件.bashrc,zsh的配置主要集中在用户当前目录的.zshrc里,打开.zshrc,在最下面会发现这么一行字:

# Customize to your needs…

可以在此处定义自己的环境变量和别名,当然,oh my zsh 在安装时已经自动读取当前的环境变量并进行了设置,你可以继续追加其他环境变量。

我自己的部分配置如下:

alias vi='vim'
alias dd='df -h'
alias p='netstat -antp'
alias pp='pstree -a'
alias ta='tail -f /var/log/syslog'
alias dudir='du --max-depth=1 -ah 2> /dev/null | sort -hr | head '
alias rm0='find / -type f -name "0" | xargs -i  rm -fr "{}"'
alias grepall='grep -D skip -nRe'

ip() {
  iptables -F;
  iptables-restore < /etc/iptables.test.rules;
  iptables-save > /etc/iptables.up.rules;
  iptables -L;
}

alias tn='tmux new -s'
alias tll='tmux ls'
alias tt='tmux attach -t'
alias tk='tmux kill-session -t'

zsh可以针对文件类型设置对应的打开程序,比如:

alias -s html=mate,意思就是你在命令行输入 hello.html,zsh会为你自动打开 TextMat 并读取 hello.html; alias -s gz=’tar -xzvf’,表示自动解压后缀为 gz 的压缩包

zsh使用

  • 强大的历史纪录功能,输入 grep 然后用上下箭头可以翻阅你执行的所有 grep 命令。

  • 智能拼写纠正.

  • 各种补全:路径补全、命令补全,命令参数补全,插件内容补全等等。触发补全只需要按一下或两下 tab 键,补全项可以使用 ctrl+n/p/f/b上下左右切换。

  • 目录浏览和跳转:输入 d,即可列出你在这个会话里访问的目录列表,输入列表前的序号,即可直接跳转。

  • 在当前目录下输入 .. 或 … ,或直接输入当前目录名都可以跳转。

zsh其它

通过以上步骤,zsh已经可以很好地使用了。如果你还想更加rock一些,zsh也可以满足你的要求。

主题

如果你是个主题控,还可以玩玩 zsh 的主题。在 .zshrc 里找到ZSH_THEME,就可以设置主题了,默认主题是:

ZSH_THEME=”robbyrussell”

oh my zsh 提供了数十种主题,相关文件在~/.oh-my-zsh/themes目录下,你可以随意选择。

插件

oh my zsh 项目提供了完善的插件体系,相关的文件在~/.oh-my-zsh/plugins目录下,默认提供了100多种,大家可以根据自己的实际学习和工作环境采用。

想了解每个插件的功能,只要打开相关目录下的 zsh 文件看一下。插件也是在.zshrc里配置,找到plugins关键字,你就可以加载自己的插件了,系统默认加载 git ,你可以在后面追加内容,如下:

plugins=(git textmate ruby autojump)

​ 参考资料:


关于开源

知乎看到了神奈川关于开源回答的两个好答案,深以为然,转到自己的blog上,时时勤拂拭。

  1. 为什么要开源
  2. 世界顶级开源软件工程师,他们如何谋利?

为什么要开源

题主问的非常好,尤其是从功利的角度来看为什么要开源。我把这个问题分成三个回答你:

从无私的角度看,为什么要开源? 从自私的角度看,个人为什么要开源? 从自私的角度看,公司为什么要开源?

从无私的角度看,为什么要开源?

  1. 建立社区:可以这么说,如果没有开源社区,苹果,谷歌,Facebook都不会是现在这样。如果没有Linux,现在互联网的格局简直无法想象。为了让更多人能够使用优秀的产品,需要有人来愿意把自己的产品免费给他人使用。很多开源社区的贡献者都是为了建立,维持这样一个互助互利的社区而不断努力的。

  2. 帮助他人:开源一个很美妙的地方就是,别人不用花时间解决一样的问题。当你看到你的一个大问题已经有人做了开源项目的时候,你一定感觉如释重负。同样,有人感谢你的开源项目帮他们解决了一个大问题,真的是种很美妙的成就感。

  3. 结识朋友:开源社区中经常能遇到很多志同道合的好朋友。你帮我改代码,我帮你加功能,说不定两个人就认识成了好朋友。我和我现在的一位导师和几位朋友就是在贡献开源项目的时候认识的。

好,下面来说说不明显的:

从自私的角度看,个人为什么要开源?

  1. 提升代码质量:开源是提升个人代码质量的好方法。这个有两个方面:首先,如果你知道你的代码要给别人看,你会不自觉的把代码写的更干净一点,多加点说明。其次,开源之后别人会建议怎么改(如果你的项目有一定影响力),给你建议的人多了,你也大概就有概念怎么把代码写的更好了。

  2. 展示个人代码:如果你在找工作,这个很可能会是你的主要动机。公司实际上很好奇你写的代码质量如何,但是光从1个小时的面试实在看不出太多。所以很多公司会非常喜欢看你的开源项目,来评估一下你的代码质量如何。同样,如果你面试的时候告诉公司,“我有个开源项目,你们可以去看看”,这将是个不错的加分项。

  3. 建立个人品牌:如果你足够厉害,把一个优质项目开源是个迅速提升影响力的好方法。很多在大公司工作过的顶级工程师,我们都是通过他们的开源项目认识的。git的发明人,Linus Torvalds,就是一个好例子。一个工程师如果在工作之外想要树立个人品牌的话,写一个高质量的开源项目是个相当好的选择。

  4. 备份个人项目:其实很多人把项目放到Github的时候根本没想这么多。。。他们只是想把家庭作业,代码练习啥的备份到网上去而已。。。其实Github当中绝大部分项目都是这种实际没啥用的代码备份(只是Github没让你看到)。。

从自私的角度看,公司为什么要开源?

  1. 树立品牌形象:公司与个人开源的动机不同。公司开源很多情况下是为了提升外界对公司的形象认知。任何一个大科技公司,肯定用了多多少少用了开源项目(Linux,至少吧?)。如果连一个开源项目都没有,这很容易给人造成,“这公司总是索取,却不回馈给开源社区”的形象(尤其在美国)。

  2. 发掘潜在员工:比如,我读了谷歌的Android的代码,发现里面有个大安全漏洞,然后我提交一个修改把漏洞给补了。你说谷歌想不想拉起我去工作?很多公司一个很好的招聘渠道是开源项目的贡献者。如果能在公司开源项目做出有意义贡献的话,这个对于公司来说是比面试好很多的能力证明。

  3. 实现额外功能:这点实际上很有意思,有的公司/项目实际上有很多想做的小功能,但是没时间也没人力去单独做。这个时候开源的力量就体现出来了,项目开源之后很多时候能吸引到开源贡献者来做一些自己感兴趣,项目想要,但项目没时间做的feature。我之前在Socket.io做的时候写的就是这样的一个小feature。

  4. 扩大影响范围:公司开源项目的质量,很多时候能反映公司的影响力。所以硅谷的很多大公司,都有一些厉害的开源项目。一方面是回馈社区,一方面是展示公司的影响力和代码质量,吸引更多人才。同样,如果一个公司很希望自己的一个产品有更大影响力的话,开源是个好方法。苹果的Swift就是个好例子。Swift开源之后,能够用在不少iOS之外的领域。说不定之后我们还能看到用Swift写的网站架构。

  5. 用作战略武器:开源项目还可以作为公司的战略武器。最好的例子就是谷歌的Android。通过开源和病毒式的传播一下追上iOS。这里面有很多弊端(比如碎片化严重),不过谷歌这么一招给了开发者十分大的力量,Android一下成为一个和iOS比肩的选项。

如果你好奇全职的开源工程师如何赚钱的话,这是我之前的答案: 世界顶级开源软件工程师,他们如何谋利? - 编程

最后,也希望题主能继续为开源社区出一分力 : )

世界顶级开源软件工程师,他们如何谋利?

喜欢这个问题,我之前也有相同的困惑。

来说说我导师的故事。

在哈佛上一个和Facebook一起合作办学的课程,一个学期与一个开源项目合作,学习在开源社区维持并贡献代码。

我当时选择了Socket.io。写过实时软件(比如聊天室,微信,多人在线合作文档)的同学可能听说过Socket这个概念。Socket.io就是用javascript编写的Socket库,只要几行就能弄出一个聊天室。这个项目在Github上有将近2万的star。实际使用项目规模大约有10万以上。并不能和Rails,Linux这种顶级的开源项目比,但是也十分了得。

我的导师,Socket.io的创始人之一,并没有稳定的日常工作。换个说法更好,他并不需要稳定的日常工作。

首先,他的主要工作,是旅游。Socket.io因为有不错的国际影响力,他经常被各个地方当地的软件社区请去做演讲嘉宾。去年我在日本的时候还十分机缘巧合地也碰到他在东京,一问原来是参加东京的Socket.io event来做嘉宾了。因为是别人请来,衣食住行全部报销,一分钱都没花。

曾经,他先后被三家创业公司雇佣,担任CTO,公司卖了赚了大笔钱。现在他基本处于不用工作就可以衣食无忧的状态。选择再次加入创业公司也只是因为个人兴趣爱好。包括别人请他飞来飞去,何必用个工作来限制周游世界的自由?

然后,他对于Socket.io本身的工作,基本减少到维持社区,做战略决定。听他说很多民间爱好组织会给这个项目捐钱,数额不等,但并不是主要收入。大公司合作捐款的很多,基本上可以作为2~3个人的工资。这些捐款也确实基本用于支付全职项目管理员。他也不太再直接写代码,很多漏洞和功能都是代理给管理员和社区了。不过前一段时间Socket.io要更新大版本,他比较辛苦一些,亲自修复了之前很多漏洞。

最后,来说说我在开源社区的几个感受: 开源并不是散漫。开源社区有着相当严格的管理体系。每个大型项目都有创始人,全职管理员(管理项目领薪水),专项贡献者,一般贡献者等不同的区分。开源软件不会被新手破坏也是得益于这样的管理体系。一般如果你只是随便写点东西,管理员是不会允许你的代码进入项目的。

开源并不是赚钱。开源项目是为了影响力。如果Linux像微软一样收费,怎么也不可能走到今天这步。与之相对,开源项目创始人和领导者所获得的,是他人无与伦比的尊敬。如果想要,他们的地位,影响力完全可以给他们找到任何级别的工作,无论是大小公司CTO,高级工程师,创业cofounder。其中任何一项几年的薪资都可以让他们衣食无忧。更何况之前所说的捐款,演讲。

最后link一下关于开源的另一个回答,感兴趣的朋友们可以去看看: 为什么要开源? - 神奈川的回答


markdown入门

Markdown 是一种轻量级的「标记语言」,学习成本低。很早前就在使用markdown,就连我的blog 的编写,也都是使用markdown语言编写的。这篇文章里将记录一些常用的markdown语法、Mac下的 工具,以及Mou的快捷键。

Mou快捷键

大小写 		Ctrl (Shift) U
文章前data 	Ctrl Shift G
大小于和& 	Ctrl Shift ,(.)(7)
参考手册 		Cmd R

Markdown语法

加粗 Cmd B

*emphasize*   **strong** 	

斜体 Cmd I

_emphasize_   __strong__					

链接 Ctrl Shift L

行内链接
An [example](http://url.com/ "Title")		

关联链接
An [example][id]. Then, anywhere
else in the doc, define the link:

  [id]: http://example.com/  "Title"	
  	
自动链接
<http://example.com/>
  	
Email
An email <example@example.com> link.

图片 Ctrl Shift I

行内链接
![alt text](/path/img.jpg "Title")			

关联链接
![alt text][id]								

[id]: /url/to/img.jpg "Title"

标题 Cmd 1

类 Setext:
Header 1
========
Header 2
--------

类 atx 形式(后边的#可加可不加):
# Header 1 #				Cmd 1
## Header 2 ##				Cmd 2
### Header 6				Cmd 6

列表 Ctrl L

有序列表:

1.  Foo
2.  Bar

无序列表:

*   A list item.			
    With multiple paragraphs.
*   Bar

还可以这样:

*   Abacus
    * answer
*   Bubbles
    1.  bunk
    2.  bupkis
        * BELITTLER
    3. burper
*   Cunning

引用 Ctrl Q

> Email-style angle brackets		
> are used for blockquotes.

> > And, they can be nested.

> ### Headers in blockquotes
> 
> * You can quote a list.
> * Etc.

代码框 Cmd K

`<code>` 		

代码块 Cmd [ (])

四个空格,或者一个tab

This is a preformatted		
code block.

backtick Cmd K

```				
Fenced code blocks are like Stardard
Markdown’s regular code blocks, except that
they’re not indented and instead rely on a
start and end fence lines to delimit the code
block.
```

横线

---

* * *

- - - - 

强制换行

行末添加两个空格

删除线 Cmd U

~~ ~~		

表格

简单的表格

First Header | Second Header | Third Header
------------ | ------------- | ------------
Content Cell | Content Cell  | Content Cell
Content Cell | Content Cell  | Content Cell

单元格左右对齐

First Header | Second Header | Third Header
:----------- | :-----------: | -----------:
Left         | Center        | Right
Left         | Center        | Right

页内链接

## [This is an example](id:anchor1)

Click this [link](#anchor1) in the Preview view will auto scroll to the place of the destination anchor.

脚标

That's some text with a footnote.[^1]

[^1]: And that's the footnote.

其它相关

运行以下命令安装markdown快速预览插件:

$ brew cask install qlmarkdown

也可以在github上获得这个插件qlmarkdown


jQuery入门

jQuery 是一个 JavaScript 库。jQuery 很容易学习。最近用到了jQuery和Bootstrap,于是记录一下。这一篇是jQuery的一个很粗略的列表总结。

jQuery选择器

$(this)			当前 HTML 元素
$("p")			所有 <p> 元素
$("p.intro")	所有 class="intro" 的 <p> 元素
$(".intro")		所有 class="intro" 的元素
$("#intro")		id="intro" 的元素
$("ul li:first")		每个 <ul> 的第一个 <li> 元素
$("[href$='.jpg']")		所有带有以 ".jpg" 结尾的属性值的 href 属性
$("div#intro .head")	id="intro" 的 <div> 元素中的所有 class="head" 的元素

:first	$("p:first")	第一个 <p> 元素
:last	$("p:last")		最后一个 <p> 元素
:even	$("tr:even")	所有偶数 <tr> 元素
:odd	$("tr:odd")		所有奇数 <tr> 元素
 	 	 
:eq(index)	$("ul li:eq(3)")	列表中的第四个元素(index 从 0 开始)
:gt(no)	$("ul li:gt(3)")		列出 index 大于 3 的元素
:lt(no)	$("ul li:lt(3)")		列出 index 小于 3 的元素
:not(selector)	$("input:not(:empty)")	所有不为空的 input 元素
 	 	 
:header	$(":header")	所有标题元素 <h1> - <h6>
:animated	 			所有动画元素

jQuery事件

触发实例:

$(“button#demo”).click()

常用事件

bind()	向匹配元素附加一个或更多事件处理器
click()	触发、或将函数绑定到指定元素的 click 事件
focus()	触发、或将函数绑定到指定元素的 focus 事件
scroll()	触发、或将函数绑定到指定元素的 scroll 事件
toggle()	绑定两个或多个事件处理器函数,当发生轮流的 click 事件时执行。
trigger()	所有匹配元素的指定事件
load()	触发、或将函数绑定到指定元素的 load 事件

全部事件

方法	描述
blur()	触发、或将函数绑定到指定元素的 blur 事件
change()	触发、或将函数绑定到指定元素的 change 事件
dblclick()	触发、或将函数绑定到指定元素的 double click 事件
delegate()	向匹配元素的当前或未来的子元素附加一个或多个事件处理器
die()	移除所有通过 live() 函数添加的事件处理程序。
error()	触发、或将函数绑定到指定元素的 error 事件
event.isDefaultPrevented()	返回 event 对象上是否调用了 event.preventDefault()。
event.pageX	相对于文档左边缘的鼠标位置。
event.pageY	相对于文档上边缘的鼠标位置。
event.preventDefault()	阻止事件的默认动作。
event.result	包含由被指定事件触发的事件处理器返回的最后一个值。
event.target	触发该事件的 DOM 元素。
event.timeStamp	该属性返回从 1970 年 1 月 1 日到事件发生时的毫秒数。
event.type	描述事件的类型。
event.which	指示按了哪个键或按钮。
keydown()	触发、或将函数绑定到指定元素的 key down 事件
keypress()	触发、或将函数绑定到指定元素的 key press 事件
keyup()	触发、或将函数绑定到指定元素的 key up 事件
live()	为当前或未来的匹配元素添加一个或多个事件处理器
mousedown()	触发、或将函数绑定到指定元素的 mouse down 事件
mouseenter()	触发、或将函数绑定到指定元素的 mouse enter 事件
mouseleave()	触发、或将函数绑定到指定元素的 mouse leave 事件
mousemove()	触发、或将函数绑定到指定元素的 mouse move 事件
mouseout()	触发、或将函数绑定到指定元素的 mouse out 事件
mouseover()	触发、或将函数绑定到指定元素的 mouse over 事件
mouseup()	触发、或将函数绑定到指定元素的 mouse up 事件
one()	向匹配元素添加事件处理器。每个元素只能触发一次该处理器。
ready()	文档就绪事件(当 HTML 文档就绪可用时)
resize()	触发、或将函数绑定到指定元素的 resize 事件
select()	触发、或将函数绑定到指定元素的 select 事件
submit()	触发、或将函数绑定到指定元素的 submit 事件
triggerHandler()	第一个被匹配元素的指定事件
unbind()	从匹配元素移除一个被添加的事件处理器
undelegate()	从匹配元素移除一个被添加的事件处理器,现在或将来
unload()	触发、或将函数绑定到指定元素的 unload 事件

jQuery效果

$(“p”).hide(1000,function(){ alert(“The paragraph is now hidden”); }); $(“#p1”).css(“color”,”red”).slideUp(2000).slideDown(2000);

animate()	对被选元素应用“自定义”的动画
clearQueue()	对被选元素移除所有排队的函数(仍未运行的)
delay()	对被选元素的所有排队函数(仍未运行)设置延迟
dequeue()	运行被选元素的下一个排队函数
fadeIn()	逐渐改变被选元素的不透明度,从隐藏到可见
fadeOut()	逐渐改变被选元素的不透明度,从可见到隐藏
fadeTo()	把被选元素逐渐改变至给定的不透明度
hide()	隐藏被选的元素
queue()	显示被选元素的排队函数
show()	显示被选的元素
slideDown()	通过调整高度来滑动显示被选元素
slideToggle()	对被选元素进行滑动隐藏和滑动显示的切换
slideUp()	通过调整高度来滑动隐藏被选元素
stop()	停止在被选元素上运行动画
toggle()	对被选元素进行隐藏和显示的切换

HTML操作

属性操作

addClass()	向匹配的元素添加指定的类名。
attr()	设置或返回匹配元素的属性和值。
hasClass()	检查匹配的元素是否拥有指定的类。
html()	设置或返回匹配的元素集合中的 HTML 内容。
removeAttr()	从所有匹配的元素中移除指定的属性。
removeClass()	从所有匹配的元素中删除全部或者指定的类。
toggleClass()	从匹配的元素中添加或删除一个类。
val()	设置或返回匹配元素的值。

$("button").click(function(){
  $("#w3s").attr("href", function(i,origValue){
    return origValue + "/jquery";
  });
});

css操作

css()	设置或返回匹配元素的样式属性。
height()	设置或返回匹配元素的高度。
offset()	返回第一个匹配元素相对于文档的位置。
offsetParent()	返回最近的定位祖先元素。
position()	返回第一个匹配元素相对于父元素的位置。
scrollLeft()	设置或返回匹配元素相对滚动条左侧的偏移。
scrollTop()	设置或返回匹配元素相对滚动条顶部的偏移。
width()	设置或返回匹配元素的宽度。

文档操作

addClass()	向匹配的元素添加指定的类名。
after()	在匹配的元素之后插入内容。
append()	向匹配元素集合中的每个元素结尾插入由参数指定的内容。
appendTo()	向目标结尾插入匹配元素集合中的每个元素。
attr()	设置或返回匹配元素的属性和值。
before()	在每个匹配的元素之前插入内容。
clone()	创建匹配元素集合的副本。
detach()	从 DOM 中移除匹配元素集合。
empty()	删除匹配的元素集合中所有的子节点。
hasClass()	检查匹配的元素是否拥有指定的类。
html()	设置或返回匹配的元素集合中的 HTML 内容。
insertAfter()	把匹配的元素插入到另一个指定的元素集合的后面。
insertBefore()	把匹配的元素插入到另一个指定的元素集合的前面。
prepend()	向匹配元素集合中的每个元素开头插入由参数指定的内容。
prependTo()	向目标开头插入匹配元素集合中的每个元素。
remove()	移除所有匹配的元素。
removeAttr()	从所有匹配的元素中移除指定的属性。
removeClass()	从所有匹配的元素中删除全部或者指定的类。
replaceAll()	用匹配的元素替换所有匹配到的元素。
replaceWith()	用新内容替换匹配的元素。
text()	设置或返回匹配元素的内容。
toggleClass()	从匹配的元素中添加或删除一个类。
unwrap()	移除并替换指定元素的父元素。
val()	设置或返回匹配元素的值。
wrap()	把匹配的元素用指定的内容或元素包裹起来。
wrapAll()	把所有匹配的元素用指定的内容或元素包裹起来。
wrapinner()	将每一个匹配的元素的子内容用指定的内容或元素包裹起来。

jQuery 尺寸

width()
height()
innerWidth()
innerHeight()
outerWidth()
outerHeight()

jQuery遍历

.each()	对 jQuery 对象进行迭代,为每个匹配元素执行函数。
.filter()	将匹配元素集合缩减为匹配选择器或匹配函数返回值的新元素。

.add()	将元素添加到匹配元素的集合中。
.andSelf()	把堆栈中之前的元素集添加到当前集合中。
.children()	获得匹配元素集合中每个元素的所有子元素。
.closest()	从元素本身开始,逐级向上级元素匹配,并返回最先匹配的祖先元素。
.contents()	获得匹配元素集合中每个元素的子元素,包括文本和注释节点。

.end()	结束当前链中最近的一次筛选操作,并将匹配元素集合返回到前一次的状态。
.eq()	将匹配元素集合缩减为位于指定索引的新元素。
.find()	获得当前匹配元素集合中每个元素的后代,由选择器进行筛选。
.first()	将匹配元素集合缩减为集合中的第一个元素。
.has()	将匹配元素集合缩减为包含特定元素的后代的集合。
.is()	根据选择器检查当前匹配元素集合,如果存在至少一个匹配元素,则返回 true。
.last()	将匹配元素集合缩减为集合中的最后一个元素。
.map()	把当前匹配集合中的每个元素传递给函数,产生包含返回值的新 jQuery 对象。
.next()	获得匹配元素集合中每个元素紧邻的同辈元素。
.nextAll()	获得匹配元素集合中每个元素之后的所有同辈元素,由选择器进行筛选(可选)。
.nextUntil()	获得每个元素之后所有的同辈元素,直到遇到匹配选择器的元素为止。
.not()	从匹配元素集合中删除元素。
.offsetParent()	获得用于定位的第一个父元素。
.parent()	获得当前匹配元素集合中每个元素的父元素,由选择器筛选(可选)。
.parents()	获得当前匹配元素集合中每个元素的祖先元素,由选择器筛选(可选)。
.parentsUntil()	获得当前匹配元素集合中每个元素的祖先元素,直到遇到匹配选择器的元素为止。
.prev()	获得匹配元素集合中每个元素紧邻的前一个同辈元素,由选择器筛选(可选)。
.prevAll()	获得匹配元素集合中每个元素之前的所有同辈元素,由选择器进行筛选(可选)。
.prevUntil()	获得每个元素之前所有的同辈元素,直到遇到匹配选择器的元素为止。
.siblings()	获得匹配元素集合中所有元素的同辈元素,由选择器筛选(可选)。
.slice()	将匹配元素集合缩减为指定范围的子集。

jQuery Ajax

$(selector).load(URL,data,callback);

$("#div1").load("demo_test.txt #p1");

$.get(URL,callback);

$("button").click(function(){
  $.get("demo_test.asp",function(data,status){
    alert("Data: " + data + "\nStatus: " + status);
  });
});

$.post(URL,data,callback);

$("button").click(function(){
  $.post("demo_test_post.asp",
  {
    name:"Donald Duck",
    city:"Duckburg"
  },
  function(data,status){
    alert("Data: " + data + "\nStatus: " + status);
  });
});

jQuery Ajax 库

jQuery.ajax()	执行异步 HTTP (Ajax) 请求。
.ajaxComplete()	当 Ajax 请求完成时注册要调用的处理程序。这是一个 Ajax 事件。
.ajaxError()	当 Ajax 请求完成且出现错误时注册要调用的处理程序。这是一个 Ajax 事件。
.ajaxSend()	在 Ajax 请求发送之前显示一条消息。
jQuery.ajaxSetup()	设置将来的 Ajax 请求的默认值。
.ajaxStart()	当首个 Ajax 请求完成开始时注册要调用的处理程序。这是一个 Ajax 事件。
.ajaxStop()	当所有 Ajax 请求完成时注册要调用的处理程序。这是一个 Ajax 事件。
.ajaxSuccess()	当 Ajax 请求成功完成时显示一条消息。
jQuery.get()	使用 HTTP GET 请求从服务器加载数据。
jQuery.getJSON()	使用 HTTP GET 请求从服务器加载 JSON 编码数据。
jQuery.getScript()	使用 HTTP GET 请求从服务器加载 JavaScript 文件,然后执行该文件。
.load()	从服务器加载数据,然后把返回到 HTML 放入匹配元素。
jQuery.param()	创建数组或对象的序列化表示,适合在 URL 查询字符串或 Ajax 请求中使用。
jQuery.post()	使用 HTTP POST 请求从服务器加载数据。
.serialize()	将表单内容序列化为字符串。
.serializeArray()	序列化表单元素,返回 JSON 数据结构数据。

Gitolite搭建git服务器

这段时间用Git用的很顺手很舒服,不过都是登陆自己的服务器写的代码。于是乎研究起了Git服务器。不过经过一天晚上的研究。最后发现还是gitlab舒服。大家直接用gitlab好了。这一篇就当纪念了😄

ps:在Git服务管理工具这个领域,除了刚提到gitlab和gitolite之外,还有 Gitosis 和 Git + Repo + Gerrit 的方案。其中Git + Repo + Gerrit是超级重量级的方案,集版本控制,库管理和代码审核为一身。可管理大型及超大型项目。 大名鼎鼎的Android平台就是使用的 Git + Repo + Gerrit。

pps:gitlab可以使用这个脚本一键安装。https://bitnami.com/stack/gitlab/installer

简介

Gitolite是在Git之上的一个授权层,依托sshd或者httpd来进行认证。(概括:认证是确定用户是谁,授权是决定该用户是否被允许做他想做的事情)。

第一步,安装git:

$ sudo apt-get install git

第二步,创建一个git用户,用来运行git服务:

$ sudo adduser --system --shell /bin/bash --gecos 'Git SCM User' --group --disabled-password --home /home/git git

第三步,创建证书登录: 收集所有需要登录的用户的公钥,把所有公钥导入到/home/git/.ssh/authorized_keys文件里。

第四步,下载源码并安装:

$ sudo su git
$ cd $HOME
$ git clone http://github.com/sitaramc/gitolite

安装Gitolite(服务器端)

$ mkdir -p ${HOME}/bin
$ ${HOME}/gitolite/install -to ${HOME}/bin

设置SSH public key(服务器端)

$ ${HOME}/bin/gitolite setup -pk xxx.pub // 你的公钥

到这里,Gitolite已经安装完成。

第五步:克隆Gitolite管理库(客户端)

在客户端上设置ssh的配置文件,config。例如:

Host    gitolite
  HostName        199.199.199.199
  Port            1999
  User            git
  IdentityFile    ~/.ssh/xxx

然后只需要在本地服务器上使用如下代码下载。

$ git clone gitolite:gitolite-admin.git

这只是一篇非常非常简约的安装记录,更多的配置和问题请参考相关的资料:

  • [服务器上的 Git - Gitolite git-scm](http://git-scm.com/book/zh/ch4-8.html)
  • [使用Gitolite搭建轻量级的Git服务器 chinaunix](http://blog.chinaunix.net/uid-15174104-id-3843570.html)
  • Gitolite 构建 Git 服务器