欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

推荐几个技术博客,持续更新中... 博客分类: vb2005xu开发文章转摘 webqq 

程序员文章站 2024-03-20 19:52:22
...

推荐几个技术博客,我整理了一下googlereader的订阅。

 
http://www.udpwork.com/
http://mindhacks.cn/
http://www.ruanyifeng.com/home.html
http://coolshell.cn/
http://www.php-internal.com/
http://www.laruence.com/
http://googlechinablog.blogspot.com/
http://www.cnblogs.com/
http://dbanotes.net/
http://emacser.com/
http://robbinfan.com/
http://timyang.net/
http://www.36kr.com/
http://www.valleytalk.org/

http://www.gnu.org/software/

 

http://alloyteam.github.io/JX/#home webqq的前端框架

 
--- 个人博客:
http://jiangbo.me/ 一些HFDS的说明
 
推荐给大家,相互学习啊。
 
继续补充哦。
 
--- 摘自 robbin 的博客 git使用记录
## Git配置
    git config --global user.name "robbin"   
    git config --global user.email "fankai@gmail.com"
    git config --global color.ui true
    git config --global alias.co checkout
    git config --global alias.ci commit
    git config --global alias.st status
    git config --global alias.br branch
    git config --global core.editor "mate -w"    # 设置Editor使用textmate
    git config -l  # 列举所有配置

用户的git配置文件`~/.gitconfig`  

## Git常用命令

### 查看、添加、提交、删除、找回,重置修改文件

    git help <command>  # 显示command的help
    git show            # 显示某次提交的内容
    git show $id

    git co  -- <file>   # 抛弃工作区修改
    git co  .           # 抛弃工作区修改

    git add <file>      # 将工作文件修改提交到本地暂存区
    git add .           # 将所有修改过的工作文件提交暂存区

    git rm <file>       # 从版本库中删除文件
    git rm <file> --cached  # 从版本库中删除文件,但不删除文件

    git reset <file>    # 从暂存区恢复到工作文件
    git reset -- .      # 从暂存区恢复到工作文件
    git reset --hard    # 恢复最近一次提交过的状态,即放弃上次提交后的所有本次修改

    git ci <file>
    git ci .
    git ci -a           # 将git add, git rm和git ci等操作都合并在一起做
    git ci -am "some comments"
    git ci --amend      # 修改最后一次提交记录

    git revert <$id>    # 恢复某次提交的状态,恢复动作本身也创建了一次提交对象
    git revert HEAD     # 恢复最后一次提交的状态

### 查看文件diff

    git diff <file>     # 比较当前文件和暂存区文件差异
    git diff
    git diff <$id1> <$id2>   # 比较两次提交之间的差异
    git diff <branch1>..<branch2> # 在两个分支之间比较 
    git diff --staged   # 比较暂存区和版本库差异
    git diff --cached   # 比较暂存区和版本库差异
    git diff --stat     # 仅仅比较统计信息

### 查看提交记录

    git log
    git log <file>      # 查看该文件每次提交记录
    git log -p <file>   # 查看每次详细修改内容的diff
    git log -p -2       # 查看最近两次详细修改内容的diff
    git log --stat      # 查看提交统计信息

### tig

Mac上可以使用tig代替diff和log,`brew install tig`

## Git 本地分支管理

### 查看、切换、创建和删除分支

    git br -r           # 查看远程分支
    git br <new_branch> # 创建新的分支
    git br -v           # 查看各个分支最后提交信息
    git br --merged     # 查看已经被合并到当前分支的分支
    git br --no-merged  # 查看尚未被合并到当前分支的分支
    
    git co <branch>     # 切换到某个分支
    git co -b <new_branch> # 创建新的分支,并且切换过去
    git co -b <new_branch> <branch>  # 基于branch创建新的new_branch
    
    git co $id          # 把某次历史提交记录checkout出来,但无分支信息,切换到其他分支会自动删除
    git co $id -b <new_branch>  # 把某次历史提交记录checkout出来,创建成一个分支

    git br -d <branch>  # 删除某个分支
    git br -D <branch>  # 强制删除某个分支 (未被合并的分支被删除的时候需要强制)
    
### 分支合并和rebase

    git merge <branch>               # 将branch分支合并到当前分支
    git merge origin/master --no-ff  # 不要Fast-Foward合并,这样可以生成merge提交

    git rebase master <branch>       # 将master rebase到branch,相当于:
    git co <branch> && git rebase master && git co master && git merge <branch>

## Git补丁管理(方便在多台机器上开发同步时用)
    git diff > ../sync.patch         # 生成补丁
    git apply ../sync.patch          # 打补丁
    git apply --check ../sync.patch  # 测试补丁能否成功

## Git暂存管理
    git stash                        # 暂存
    git stash list                   # 列所有stash
    git stash apply                  # 恢复暂存的内容
    git stash drop                   # 删除暂存区
    
## Git远程分支管理
    git pull                         # 抓取远程仓库所有分支更新并合并到本地
    git pull --no-ff                 # 抓取远程仓库所有分支更新并合并到本地,不要快进合并
    git fetch origin                 # 抓取远程仓库更新
    git merge origin/master          # 将远程主分支合并到本地当前分支
    git co --track origin/branch     # 跟踪某个远程分支创建相应的本地分支
    git co -b <local_branch> origin/<remote_branch>  # 基于远程分支创建本地分支,功能同上

    git push                         # push所有分支
    git push origin master           # 将本地主分支推到远程主分支
    git push -u origin master        # 将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库)
    git push origin <local_branch>   # 创建远程分支, origin是远程仓库名
    git push origin <local_branch>:<remote_branch>  # 创建远程分支
    git push origin :<remote_branch>  #先删除本地分支(git br -d <branch>),然后再push删除远程分支

## Git远程仓库管理

    git remote -v                    # 查看远程服务器地址和仓库名称
    git remote show origin           # 查看远程服务器仓库状态
    git remote add origin git@github:robbin/robbin_site.git         # 添加远程仓库地址
    git remote set-url origin git@github.com:robbin/robbin_site.git # 设置远程仓库地址(用于修改远程仓库地址)
    git remote rm <repository>       # 删除远程仓库

### 创建远程仓库
    git clone --bare robbin_site robbin_site.git  # 用带版本的项目创建纯版本仓库
    scp -r my_project.git git@git.csdn.net:~      # 将纯仓库上传到服务器上

    mkdir robbin_site.git && cd robbin_site.git && git --bare init # 在服务器创建纯仓库
    git remote add origin git@github.com:robbin/robbin_site.git    # 设置远程仓库地址
    git push -u origin master                                      # 客户端首次提交
    git push -u origin develop  # 首次将本地develop分支提交到远程develop分支,并且track

    git remote set-head origin master   # 设置远程仓库的HEAD指向master分支

也可以命令设置跟踪远程库和本地库

    git branch --set-upstream master origin/master
    git branch --set-upstream develop origin/develop
 
写道
对大多数不从事Linux平台C语言开发的人来说,GNU gcc的一套工具和Linux平台的共享库的使用还是十分陌生的,其实我也不太熟悉,姑且写点基础知识,权当做备忘吧。

## GNU gcc的编译工具用法

我们先来写一个简单的C程序:hello.c

#include <stdio.h>

void print_hello() {
printf("Hello World\n");
}

int main(int argc, char argv[]) {
print_hello();
return 0;
}

定义了一个print_hello函数,调用main函数打印Hello World。 如何编译它呢?

gcc -o hello -O2 hello.c

-o参数指定生成的可执行程序的文件名, -O2是优化级别。该命令会编译生成hello可执行程序,看看这个文件:`ls -l hello`

-rwxr-xr-x 1 robbin users 11939 2008-11-02 13:48 hello

有11KB大小。

看看他链接了哪些系统动态链接库,用`ldd`命令:

ldd hello

输出信息为:

libc.so.6 => /lib64/tls/libc.so.6 (0x0000002a9566d000)
/lib64/ld-linux-x86-64.so.2 (0x0000002a95556000)

libc是C语言标准函数库,ld是动态链接器。

接着我们看看hello这个程序里面有哪些符号,用nm命令:

nm hello

输出:

00000000005008f8 A __bss_start
000000000040043c t call_gmon_start
......
00000000004004f0 T main
0000000000500658 d p.0
00000000004004e0 T print_hello
U puts@@GLIBC_2.2.5
0000000000400410 T _start

中间省略了一些,不过我们还是可以在符号表里面找到函数定义。 hello有11KB,体积偏大,去处符号表可以给它瘦身,我们用strip命令:

strip hello

然后再ls -l hello,输出为:

-rwxr-xr-x 1 webuser users 4464 2008-11-02 13:56 hello

只有4.4KB了,瘦身效果明显! 不过这次符号表再也看不到了,`nm hello`,输出为:`nm: hello: no symbols`。

最后如果我们想从可执行程序里面提取出来一点什么文本信息的话,还可以用strings命令:

strings hello

输出信息为:

/lib64/ld-linux-x86-64.so.2
SuSE
libc.so.6
puts
__libc_start_main
__gmon_start__
GLIBC_2.2.5
t fff
Hello World

友情提醒一下,如果你用Java写一个HelloWorld.java,编译以后你也可以用strings窥探一番。

## 动态共享库怎么使用

这次我们把hello.c拆开成为两个文件:hello.c和main.c。hello.c的代码是:

#include <stdio.h>

void print_hello() {
printf("Hello World\n");
}

而main.c的代码是:

int main(int argc, char argv[]) {
print_hello();
return 0;
}

hello.c是我们的动态共享库,在hello.c里面我们声明和实现了各种公用的函数,最后main.c可以去调用这些公用函数。首先我们要把hello.c编译成为动态共享库:

gcc -o libhello.so -O2 -fPIC -shared hello.c

`-fPIC`参数声明链接库的代码段是可以共享的,`-shared`参数声明编译为共享库。请注意这次我们编译的共享库的名字叫做`libhello.so`,这也是Linux共享库的一个命名的惯例了:后缀使用so,而名称使用libxxxx格式。

然后编译main.c的时候,我们需要更多的参数让gcc知道如何寻找共享库:

gcc -o main -O2 -L. -lhello main.c

* -L参数指定到哪个附加路径下面去寻找共享库,现在我们指定在当前目录下面寻找;
* -l参数指定链接到哪个共享库上面,我们传的参数hello,那么gcc就会自动链接到libhello.so这个共享库上面(注意我们上面说的libXXXX.so命名规则);
* -I参数指定到哪个附加路径下面去寻找h文件,这个我们没有使用。

最后我们成功编译好了main,执行一下,报错:

./main: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory

找不到libhello.so这个共享库,怎么回事?这是因为libhello.so并不在操作系统默认的共享库的路径下面,我们可以临时指定一下链接路径:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

这样就成功了。我们用ldd main看一下:

libhello.so => ./libhello.so (0x0000002a9566d000)
libc.so.6 => /lib64/tls/libc.so.6 (0x0000002a9576e000)
/lib64/ld-linux-x86-64.so.2 (0x0000002a95556000)

这次main程序链接到了libhello.so这个共享库上面。

## 关于Linux的动态共享库的设置

可执行程序找不到要链接的动态共享库,这是Linux上面编译和运行程序很容易碰到的问题,通过上面的小例子,我们已经大致了解共享库的一点基本原理,接下来我们要探讨一下怎么设置程序寻找动态共享库的行为。 Linux操作系统上面的动态共享库大致分为三类:

### 操作系统级别的共享库和基础的系统工具库

比方说libc.so, libz.so, libpthread.so等等,这些系统库会被放在/lib和/usr/lib目录下面,如果是64位操作系统,还会有/lib64和/usr/lib64目录。如果操作系统带有图形界面,那么还会有/usr/X11R6/lib目录,如果是64位操作系统,还有/usr/X11R6/lib64目录。此外还可能有其他特定Linux版本的系统库目录。 这些系统库文件的完整和版本的正确,确保了Linux上面各种程序能够正常的运行。

### 应用程序级别的系统共享库

并非操作系统自带,但是可能被很多应用程序所共享的库,一般会被放在`/usr/local/lib`和`/usr/local/lib64`这两个目录下面。很多你自行编译安装的程序都会在编译的时候自动把`/usr/local/lib`加入gcc的-L参数,而在运行的时候自动到`/usr/local/lib`下面去寻找共享库。

以上两类的动态共享库,应用程序会自动寻找到他们,并不需要你额外的设置和担心。这是为什么呢? 因为以上这些目录默认就被加入到动态链接程序的搜索路径里面了。Linux的系统共享库搜索路径定义在`/etc/ld.so.conf`这个配置文件里面。这个文件的内容格式大致如下:

/usr/local/lib
/usr/lib64
/usr/lib
/usr/local/lib64

假设我们自己编译安装的ImageMagick图形库在`/usr/local/ImageMagick`目录下面,并且希望其他应用程序都可以使用ImageMagick的动态共享库,那么我们只需要把`/usr/local/ImageMagick/lib`目录加入`/etc/ld.so.conf`文件里面,然后执行:`ldconfig` 命令即可。

`ldcofig`将搜索以上所有的目录,为共享库建立一个缓存文件`/etc/ld.so.cache`。为了确认`ldconfig`已经搜索到ImageMagick的库,我们可以用上面介绍的`strings`命令从`ld.so.cache`里面抽取文本信息来检查一下:

strings /etc/ld.so.cache | grep ImageMagick

输出结果为:

/usr/local/ImageMagick/lib/libWand.so.10
/usr/local/ImageMagick/lib/libWand.so
/usr/local/ImageMagick/lib/libMagick.so.10
/usr/local/ImageMagick/lib/libMagick.so
/usr/local/ImageMagick/lib/libMagick++.so.10
/usr/local/ImageMagick/lib/libMagick++.so

### 应用程序独享的动态共享库

有很多共享库只被特定的应用程序使用,那么就没有必要加入系统库路径,以免应用程序的共享库之间发生版本冲突。因此Linux还可以通过设置环境变量LD_LIBRARY_PATH来临时指定应用程序的共享库搜索路径,就像我们上面举的那个例子一样,我们可以在应用程序的启动脚本里面预先设置LD_LIBRARY_PATH,指定本应用程序附加的共享库搜索路径,从而让应用程序找到它。
 
相关标签: webqq