帆的博客

扬帆起航

安装

https://www.mongodb.com/download-center

按照传统的方式,可以在这里下载mongo的安装包进行安装。

OSX

如果是mac系统,并且按照了brew,可以直接执行brew install mongodb进行安装。

docker

现在用docker快速的搭建软件环境已经非常方便了,所以我在这里将使用docker下载mongo的镜像来部署mongo,方便随后的测试。

https://hub.docker.com/_/mongo/

阅读全文 »

cherry-pick

cherry-pick可以将你对某个分支的修改信息应用到另外一个分支上。

应用场景

在现有一个文件在master分支上,但是却不小心在develop分支上做了修改并新增了两次提交,也就是提交错了分支。

传统方式是我们备份好已经修改的文件然后切换分支再复制过去,这样做太低效了,而且容易出错。

我们可以用cherry-pick来解决这个问题。

阅读全文 »

裸库

通常我们在本地初始化仓库的时候,都是用git init。如果我们不借助github,如何自己建立一个中心仓库呢,这个就是裸库的概念。

git init --bare <repo>

这个命令执行后,将在本地创建一个名为 repo 的文件夹, 里面包含着 Git 的基本目录, 我们一般会将这个文件夹命名为后面加 .git 的形式,如 repo.git (这也是为什么我们从 GitHub clone 仓库的时候,地址都是 xxx.git 这样的形式的原因).使用 –bare 参数初始化的仓库,我们一般称之为裸仓库, 因为这样创建的仓库并不包含 工作区 , 也就是说,我们并不能在这个目录下执行我们一般使用的 Git 命令。

阅读全文 »

源码分析(三)

前面我们已经了解了Netty的启动流程,以及各个组件之间的关系,接下来要看看Netty的数据容器(ByteBuf)。

回顾Java NIO

先回顾一下Java NIO的Buffer使用方式。

使用NIO进行文件读取所涉及的步骤:

  1. 从FileInputStream对象获取到Channel对象。
  2. 创建Buffer.
  3. 将数据从Channel中读取到Buffer对象中。

0 <= mark <= postion <= limit <= capacity

flip()方法切换读和写的状态:

  1. 将limit值设为当前的position。
  2. 将position设为0.
阅读全文 »

refspec

Reference Specification简称refspec。
在执行push或fetch操作时,refspec用以给出本地Ref和远程Ref之间的映射关系,通常是本地分支或本地tag与远程库中的分支或tag之间的映射关系。

refspec格式:
+:
其中的+是可选的,表示强制更新
典型的push refspec为HEAD:refs/heads/master
典型的fetch refspec为refs/heads/:refs/remotes/origin/

阅读全文 »

Git远程仓库

Git本身是一个分布式的版本控制系统,每个用户的机器上都会有一个完整的版本库。之前我们的操作都是在本地机器上操作的,最终别人需要获取我们的修改,需要我们将本地的修改**推送(push)到远程机器上,然后别人再拉取(pull)**合并我们的代码。

说到远程仓库呢,就不得不提一下Github,全球最大的同性交友社区(😄开个玩笑)。

https://github.com/

Github是免费使用的条件就是你在上面创建的代码都是开源的,开源被查看的,如果要想创建私有的仓库,就是需要收费的。那么应运而生的产生了一个叫Gitlab的开源产品可以让我们在公司的服务器搭建私有的仓库,让我们可以享受到免费的,私有的,内网的服务。

阅读全文 »

前面的文章讲解了分支的操作和原理,接下来接着看一下git的checkout、stash、blame、diff等命令的一些使用方法。

git checkout

修改一下文件,看看git status会提示什么?

1
2
3
4
5
6
7
8
9
10
➜  mygit git:(master) vim test.txt 
➜ mygit git:(master) ✗ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: test.txt

no changes added to commit (use "git add" and/or "git commit -a")

Git提示到:修改没有暂存,请用git add或者git checkout --,我们试一下

1
➜  mygit git:(master) ✗ git checkout -- test.txt
阅读全文 »

随着多核处理器的出现,提升应用程序处理速度最有效的方式是编写能充分发挥多核能力的软件。可以通过切分大型的任务,让每个子任务并行运行,在Java中目前有直接使用线程的方式、使用Fork/Join框架和JDK8中的并行流来达到这一目的。

这段代码演示了分段求和用线程方式的实现。

分别开启2个线程,给予不同范围的数值进行求和,最后调用join()方法等到线程执行完毕,将2个线程的结果相加得到结果。

阅读全文 »

源码分析(二)

在理解了Reactor模式后,因为Netty框架本身就是基于Reactor模式的一种实现,所以回过头来再看源码,才能更好的理解代码中一些类的角色和意义。

ServerBootStrap在调用bind()方法后,通过channelFactory反射的方式创建了我们指定的Channel(NioServerSocketChannel.class)对象,然后调用了init(channel)方法对channel进行了初始化设置。

看一下ServerBootStrap.init(),初始化Channel的代码,ChannelPipeline p = channel.pipeline();这里面就出现了一个Netty中一个又一个非常核心的类ChannelPipeline,它是在Channel的父类AbstractChannel初始化的时候创建的。

ChannelPipeline

ChannelPipeline里面是一个一个的ChannelHandler,当客户端的请求到来或者出去的的时候,会一个一个的通过这些处理器,就像一个过滤器一样。每一个Channel都拥有自己的ChannelPipeline,当一个Channel被创建的时候,ChannelPipeline也跟着被创建了。I/O事件只能被ChannelInboundHandler和ChannelOutboundHandler其中之一所处理,处理完成后再传递到别的处理器中(ChannelHandlerContext#fireChannelRead(Object)或者ChannelHandlerContext#write(Object))。

阅读全文 »

先介绍一下**.gitignore**

.gitignore

项目里面经常有一些文件是不需要纳入版本控制的,例如我编译后的class文件,或者idea产生的一些配置文件等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.gradle
/build/
!gradle/wrapper/gradle-wrapper.jar

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
nbproject/private/
build/
nbbuild/
dist/
nbdist/
.nb-gradle/

rebel.xml

/out

上面是我的一个项目的配置,看得出来是有一些规则的,使用起来很简单,将这些规则保存到一个.gitignore中后,在项目里面这些文件或者文件夹里面的所有修改操作都不会被纳入到git版本控制中,也不会提交。

阅读全文 »
0%