pomelo

hello world。
今年为止,撸的框架记录下。

  • node.js+vue webapp
  • laravel+angular side
  • egret h5 demo
  • unity+tolua game framework
  • asch

前面3个在我的github上都有记录。
我撸框架在习惯Overleaf上画流程图,记录下框架的架构。我觉得画流程图是一个很好的方式,后面复习的话可以很清晰的回想起这个框架的架构。(非广告,嘻嘻)
现在, 决定开始撸pomelo 这套啦。虽然现在工作很忙,但看了这套架构的概述,还是挺好奇的。
这里立此贴为证,后面如果觉得有所感悟再写出来分享下啦。

—————————-update—————————–
2017/10/5
pomelo-chat看的七七八八了,架构图的话,其实不用自己写,pomelo wiki有丰富的的架构图,流程简图。如果大家对big world的架构有兴趣,可以读读这款。长见识嘛!

如果真用来做项目的话,其实不太建议,因为我本身是做erlang的,读了pomelo-chat 感觉pomelo是想在做一个node.js的erlang,那我为什么不直接用erlang来写呢。

pomelo的master,monitor组件挺好的,对远程服务器提供控制和监控,看看什么时候可以为现在项目弄一套。

end

WebIssues

工作需要搭建一个项目管理软件,我选择了WebIssues, 这里记录下搭建的过程,比较简单。

系统环境:Centos6.5
WebIssues版本:WebIssues1.1.5

服务端:

  • 下载服务端:webissues-server-1.1.5.tar.bz2
  • 创建数据库(支持MySQL,PostgreSQL,SQL Server),我用的是MySQL,仅需要在MySQL里面创建一个库就可以啦。
  • 配置webissues-server的nginx(官方主要支持IIS,Apache),nginx config 里面的root目录指向webissues-server-1.1.5.tar.bz2解压后的目录。
  • 访问配置好的网站,根据上面的提示安装就可以(中间会有个data目录下面的sites没有权限访问,需要分配777)。

客户端:

官方文档:

SVN Cmd

因为工作中经常需要用到SVN,虽然我知道git很好,但我们要考虑我们项目的大众啊,策划啊,美术啊,运营啊等等等等,所以我们选择了SVN,但因为一些命令,常会忘记,一到要用的时候,方恨未做记录。这里就记录些常用的,和一些遇到问题后用的。

问题:

1
2
3
svn: E155017: Checksum mismatch while updating 'xxx': 
expected: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
actual: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

解决:

1
2
svn update --set-depth empty 
svn update --set-depth infinity

问题:

1
svn: Previous operation has not finished; run 'cleanup' if it was interrupted

解决:
sqlite3.exe

1
2
3
4
5
先下载sqlite3.exe(链接在上方)
将sqlite3复制到报错svn项目的.svn目录的同级目录
sqlite3 .svn/wc.db "select * from work_queue" (查看队列未完成的任务)
sqlite3 .svn/wc.db "delete from work_queue" (清空队列)
svn cleanup

问题:
语义化版本

1
打版本(这里涉及到语义化版本的问题,参考上方链接内容)

解决:

1
svn copy svn://xxxx/server/trunk svn://xxxx/server/branch/0.1.0_beta -m "辅助脚本签出新版本:0.1.0_beta"

Centos Cmd

可能人老了吧,记忆衰退了,一些常用的命令也会忘记,而且本人书签很多,找起来不容易,这里就整理下一些常用的Centos Cmd,方面后面查看。这些都是经常用到的 Cmd。大部分Cmd可以直接用参数 –help 来查看相应的注释。

查看外网地址:
1
$ curl icanhazip.com

or

1
$ curl ifconfig.me

查看文件夹大小:
1
$ du -sh dirname
查找文件:
1
$ locate -i /etc/sh  #查找/etc目录下的sh开头的文件

or

1
$ find / -name mod.erl #查找/目录下的名为mod.erl的文件

在多文件中查找指定字符:
1
$ grep "被查找字符" dirname
服务器TIME_WAIT查看:
1
$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
服务器TIME_WAIT处理:

修改 /etc/sysctl.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃,不应该大于255,默认值是5,对应于180秒左右时间  
net.ipv4.tcp_syn_retries=2
#net.ipv4.tcp_synack_retries=2
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为300秒
net.ipv4.tcp_keepalive_time=1200
net.ipv4.tcp_orphan_retries=3
#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
net.ipv4.tcp_fin_timeout=30
#表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_syn_backlog = 4096

#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
net.ipv4.tcp_syncookies = 1
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
net.ipv4.tcp_tw_reuse = 1
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.tcp_tw_recycle = 1
#可用端口范围
net.ipv4.ip_local_port_range = 10000 61000

##减少超时前的探测次数
net.ipv4.tcp_keepalive_probes=5
##优化网络设备接收队列
net.core.netdev_max_backlog=3000

/sbin/sysctl -p 让参数生效

查找僵尸进程
1
$ ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
服务器禁止ping

一般服务器不需要禁止ping,因为禁止之后我们无法通过ping命令来检测服务器是否丢包等。

1
2
3
4
5
6
7
#禁止
$ echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all (禁止)
#开启
$ echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
#永久保存(/etc/rc.d/rc.local 里面内容开机后会自动执行)
$ vi /etc/rc.d/rc.local
$ echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all

查看内存
1
2
$ free -m #MB为单位
$ free -g #GB为单位
查看内核版本
1
$ uname -a

or

1
$ cat /proc/version

查看发行版信息
1
$ cat /etc/issue
查看cpu相关信息
1
$ cat /proc/cpuinfo
查看磁盘空间
1
2
$ df
$ df -h #我们更加可读的方式显示
统计目录下文件行数
1
$ find . -name "*.erl" | xargs cat | wc -l

or

1
$ find . -name "*.erl" -exec wc -l {} \; | awk '{sum+=$1}END{print sum}'

统计目录下文件行数,排除空行
1
$ find . -name "*.erl" | xargs cat | grep -v ^$ | wc -l
统计目录下文件数
1
$ find . -name "*.erl" | wc -l
打包文件,排除指定目录,文件
1
$ tar -zcvf dnv_android.tar.gz ./server/ebin --exclude=./Dir

A*

写了一篇关于jump point search,想着不写一篇A*,似乎不对。

首先关于A*需要了解的几个概念:

  • manhattan 曼哈顿距离,两个点在水平方向和垂直方向的距离,并且把这两个距离相加,结果就是曼哈顿值。
  • start 起始点
  • end 结束点
  • G '起始点start'到'当前点'产生的移动消耗
  • H 它只是计算出'当前点'到'结束点end'的曼哈顿距离值,当然,你也可以用其他算距离的方法,例如euclidean(欧几里得距离),octile距离,chebyshev(切比雪夫距离)。
  • F F = G + H
  • openlist 待检索的列表,此列表需要根据元素的F值自动排序
  • closelist 不需要检索的列表
  • openedlist 已检索的列表

demo

说完了这些,我们还是往常一样,来个demo。

A*

图中的黄线上的绿色点为起点,红色点为终点。
搜索过程:

  • 1、 把起始点s压入openlist,并将起始点放进openedlist。

  • 2、 从openlist中弹出一个点,以这个点为当前节点。并把这个点放进closelist。

  • 3、 获得当前点附近可以走的所有点。算出这些点各自的F值,并把这些点放进一个openlist中,同时也需要放进openedlist。

  • 4、 取出openlist中f指最小的点作为当前点,并且放进closelist,此处是图中的1点,接着再获取1点周围的附近可以走的,未在关闭列表的点,判断此邻点是否是结束点,如果是,那么Ok, 我们可以根据这些节点的父节点倒推出路径了,就结束啦;如果不是,那么需要判断此邻点是否已经在openedlist,如果是,那么就需要判断此邻点当前路径的G值是否小于已经保存的G值,是的话那么就需要更新在openlist中此邻点的G值,并且把此邻点的父节点设置为1点(就是我们当前所在的点),如果不在openedlist,那么就需要把其加入openedlist,并加入openlist。

  • 5、 经过第4步的更新,我们就可以继续重复2-4。跟着找到2,3,4直到找到结束点为止。

好了, A* 搜索的过程其实就这些,接下来,各位同学去找个实际的代码demo看下,加深下理解吧!go !

Jump Point Search(JPS)

闲来无事,这里我写一篇关于jps寻路的文章,希望帮助大家理解jps,也是帮我自己留一个历史的脚印吧!

首先需要了解的两个概念:

  • forced neighbors
  • jump point

forced neighbors

forced neighbors中文意思是被迫邻居,有两种情况的被迫邻居。

第一种

对角线情况 - 为被迫邻居
x + +
x n +
p x -

第二种

直线情况 - 为被迫邻居
x x -
p n +
x x -

jump point

jump point中文意思是跳跃点,上面两种情况中的n就代表的是jump point ,我们从起始点寻到目标点,就是一个个jump point 这样寻找过去。

成为jump point 有两个条件
: 1、这个点有被迫邻居
: 2、这个点是目标点

demo

说完两个概念,我们直接上个demo讲解下jps寻路过程。(这个demo从s开始寻找到e)

b b b b b b b
b + s + b e b
b + + j1 j2 + b
b + + + + + b
b b b b b b b

图中的

  • s(start) 起始点
  • b(block) 阻碍点
  • e(end) 目标点
  • j(jump point)跳跃点

在这个简单的例子中,要从s寻路到e,我们的jps寻路过程是这样。

  • 1、 把起始点s压入openlist。

  • 2、 从openlist中弹出一个点,以这个点为当前节点。

  • 3、 获得当前点附近可以走的所有点,(获得的点)我用了加粗表示。

  • 4、 先在这5个点中的3个正方向上的点上寻找jump point。很明显,这3个正方向上都找不到jump point。

  • 5、 在5个点中的2个斜方向上的点上寻找jump point。这里需要注意的是,如果寻找方向上的点不是阻碍点也不是jump point的话,那么会"继续搜索"下去。但要注意的是,如果是协方向, 这个"继续搜索"会先对在正方向进行搜索,也就是上下左右,如果没有找到jump point再从协方向搜索。这里很明显,上下左都会遇到阻碍点,但我们向右走的时候会遇到jump point(j2),而在这种情况下遇到的jump point ,那么我们当前的点( j1 )就会被当做jump point返回。

  • 6、 设置j1的父节点为s,然后把j1压入openlist。

  • 7、 我们继续重复上面的操2-6的操作,就可以找到下一个jump point(这里是j2,因为j2满足jump point的条件)。

  • 8、 我们在找到j2的情况下,再重复2-6,就会发现我们找到了我们的目标点。(如果未完成,继续重复第7步操作,直接找到e点)。

  • 9、 最后我们找到e点之后,可以根据每个对应节点的父节点,从后往前推导,整理出一条路径出来。任务完成。

好了, jump point search 搜索的过程其实就这些,接下来,各位同学去找个实际的代码demo看下,加深下理解吧!go !

博主github上有个path_finding项目,是实现了erlang版本的jps,需要的可以看下。