Install a git server use gitolite over the ssh

闲话

最近这段时间处在封闭开发状态,基本上没什么时间写日志了,不过现在也忙的差不多了,更重要的是,今天需要安装一台Git服务器做为开发之用,而且需要把安装过程整理出一份文档 ,所以,咱就直接写出来,也做为一篇日志发布了吧。

进入正题

建立服务器的软件我这里选用Gitolite,之所以选用Gitolite,一是因为之前曾经使用过Gitolite,再一个是因为Gitolite可配置性更高,而且更为小巧。而且,由于这个服务器只在内部使用,没有必要使用Gitlab这种体积庞大的提供过多的WEB方面功能的程序。

没有特别声明的都为在服务器上执行

  1. Git

    使用系统命令安装git客户端,比如yum install git,版本最好不要太低,1.7以上。

  2. 建立Git帐户

    useradd -d /opt/git -m git,用户目录的位置不做要求,但是由于是专用帐号,最好是放在有备份保证的目录,便于管理。

  3. 生成管理公钥 (管理端)

    ssh-keygen -t rsa -C "Git Admin" -f gitadmin
    这个步骤需要注意的是生成密钥对最好不要加密码,否则有可能出现奇怪的问题。完成这一步后将gitadmin.pub文件传至git的HOME目录中备用。

  4. 同步Gitolite代码

    git clone https://github.com/sitaramc/gitolite,此命令需要在Git用户的HOME目录中执行。

  5. 安装Gitolite

    在用户目录中执行gitolite/install -ln,参数的意思是在$HOME/bin目录中建立指向源代码目录的文件链接,这样做的好处是可以方便的升级gitolite,另外,install命令另一个参数是-to可以指定命令安装到的目录,默认情况下不需要指定。
    需要注意的是,默认安装的时候需要将$HOME/bin加入$PATH,如果指定安装目标需要将$HOME/to_dir加入$PATH。
    执行完install之后需要执行gitolite setup -pk gitadmin.pub
    完成后,需要再检查一下~/.ssh目录和其中的authorized_keys文件的权限,需要将权限控制为仅本人可读写。

  6. 同步管理库(管理端)

    由于管理端或客户端与Git服务器之间的通讯是基于ssh的,所以,为了便于使用,需要对与Git服务器的连接进行单独配置,打开~/.ssh/config,在其中加入单独定义管理时所使用的密钥文件。

host gitadmin

HostName xxx.xxx.xxx.xxx

User git

IdentityFile ~/.ssh/gitadmin

经过以上配置即可以执行git clone gitadmin:gitadmin获取管理库,之后所有对服务器的管理只能通过此管理库进行,严禁直接在服务器上对服务器进行修改。

  1. 修改Gitolite配置及用户管理
    详细使用配置及管理方法请参考源代码目录下的README.txt
  2. 从Subversion向Git做版本迁移
    两种方法

    • git svn clone svn://url.to.svn/repos —no-metadata —authors-file=users.txt
      直接从svn版本库中clone数据到本地,其中
      —no-metadata 指定命令不在git版本库中加入svn版本元数据。
      —authors-file 指定与svn用户相对应的git用户。

    • git svn init svn://url.to.svn/repos —no-metadata

    • git svn fetch —authors-file=users.txt
      这两个命令为一组,第一个命令初始化一个基于svn源的git库,此时可以在该库的.git目录下修改branches和tags信息,完成之后使用第二个命令开始同步代码,此时代码将按照配置把不同分支或标签下的代码提交到git库的指定位置。
      如要迁移的Subversion版本库使用遵循惯例的目录设置,则可以在第一种方法和第二种方法的第一条命令中加入-s选项,本选择可以简化同步的操作。

Windows版客户端TortoiseGit下载地址:http://download.tortoisegit.org/tgit/1.8.8.0/
Pro Git: http://git-scm.com/book/zh/

结束语

Git的使用入门很容易 ,只需要简单的分支、标签管理和版本提交,基本上就可以满足日常的需求,当然,还有更多的特性需要在使用的过程中逐渐的接触和应用。

Get a TexturePacker free license

闲话几句

昨天跟老婆吵了几句,当时确实是非常气愤,不过现在想想真的很划不来,气大伤身不说,昨天也因为这吵架导致了始终静不下心来学习,所以说,这吵架不仅伤身、伤心情,还浪费了时间。
其实本来也没有什么大不了的事情,没有必要非得争个是非黑白,如果确实觉得对方做的不合适,完全可以在对方心情恢复正常之后再换个角度讲给她听,这样在达到目的的同时也避免了伤和气。基本上应该有这个原则,在对方情绪激动的时候最好是避免正面的意见冲突,这不光是在两口子之间的相处之道,在和任何人相处时都是适用的。

说点正题

Texture Packer是一个非常方便的Sprite Sheet生成工具,我在About Sprite Sheet一文中讲到过,那天我在写博文时就发现下面提示还有两天的试用期,于是去到官网上准备,然后就看到下面有个可以申请免费License的链接,看里面的说明,我的博客是符合条件的,于是就试着申请了一下,没想到今天就收到了作者发来的邮件。
Email
同时,下面还附送了一个Physics Editor的授权文件,这个软件我也安装上了,看起来也是非常的强大,尽管我还没有试用,不过我想这对我学习游戏开发的过程一定会很有帮助,在此对作者表示剧烈的感谢。

结语

我想作者愿意为做技术的或跟此相关的人提供免费的授权,一方面是希望能帮助宣传这他的软件以使他能够获得更多的回报,另一方面也是希望他的用户更多,即便是没有得到金钱上的回报,但是由此带来的巨大成就感也是所有软件开发者内心所渴望的。
就像王爷他老人家现在每天熬夜加班费劲巴力的花大量的时间在搞他的一个EF English辅助APP一样,他也没指望能在这个APP上获得什么经济回报,当然能得到经济回报更好,就算得不到,一旦用户多了,我想他也会忍不住请我动吃大吃一顿来庆祝一番的。【千里传音:我说的对吧,王爷?】。

About Sprite Sheet And Tools

闲话

感冒好像有些更严重了,头很不舒服。

下午听王爷说他们发奖金了,虽然不多,但是也是要恭喜一下的,毕竟不管发多少,总比不发强吧,而且现在他的项目进展的也算是顺利。一想到这项目还是会有些郁闷,毕竟是我们哥几个一点点弄出来的,现在却成了别人的孩子,而且还是不太待见的孩子,郁闷。

正文

今天随便说说Sprite Sheet吧,简单来说,这是一个小图片集合。我印象中,这种技术最早用于WEB开发中,当在网页中使用很多小图片时,在访问时,浏览器需要对每个图片发起请求,而每次请求都只传送了一个很小的图片文件,这无形中就浪费了大量的HTTP请求和网络连接,即使在HTTP 1.1的环境中,默认的头Connection保持keep-alive时可以我重用连接,便是多次请求传送的Header也会浪费很多的流量。

因此,就有聪明人发明了这种方式,把多个小图片合成一个大图片,这样不仅减少了请求数、节约了资源,还使数据传输更加有效率,于是人们亲切的称之为Sprite Sheet。

而在游戏开发中,合理的使用Sprite Sheet同样有着积极的作用,比如将相关性较高的图片合并到一张大图片中,不仅可以使图片的渲染过程得到优化,同时还能使图片资源更便于管理(这也是我最近也学到的,:))。

Cocos2D-X learning 4

废话

今天和王爷一起去传说中的车库咖啡见了一个创业团队,跟他们有了一个小时左右的交流时间,交流的详情就不说了,总之,让我和王爷多了一个很好的话题,在回家的路上,我们就这个话题进行了友好、亲切而又愉快的交流,受益匪浅。
不过,最糟心的是,跑这一趟我竟然感冒了,主要是天气热,出了很多汗,而在地铁通道里风太大,晾了汗了,纠结死我了,明天还要去见一个离得比较近的创业团队,我在犹豫到底还要不要去。

概述

今天随便说说在Cocos2D-X开发中,关于对CCSprite方面的优化,总得来说就是尽可能减少渲染次数,这样可以使游戏运行更有效率,能够空出更多的CPU时间做其它的事情,以增加游戏的流畅与体验。

正文

Cocos2D为图片资源批量加载提供了CCSpriteFrameCache类,此类可以通过使用Sprite Sheet文件来减少图片加载次数,简单来说,就是把多个图片拼成一个大图片,之后通过坐标在大文件上取到相应的图片,这个技术被广泛使用在网页设计及游戏开发中。在这里我使用了一个叫做Zwoptex的软件自动生成大图片及相应的.plist,软件的具体使用方法就不在这里细说了(另外,朋友介绍说Texture Packer是可以更好的做这件事的工具,改天尝试一下)。

另外,Cocos2D还提供了一个CCSpriteBatchNode类,这个类主要作用是,当相同图片资源被重复使用时,通过这个类可以减少使相同的图片只渲染一次,具体做法看下面的代码。
PS: 代码基于上一篇BLOG,只对关键部分进行说明。

GameSceneDH.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef __StudyCocos2D__GameSceneDH__
#define __StudyCocos2D__GameSceneDH__

#include <iostream>
#include "cocos2d.h"

using namespace cocos2d;

class GameSceneDH: public CCLayer {
public:
    static CCScene *scene();
    virtual bool init();
    CREATE_FUNC(GameSceneDH);
};

Cocos2D-X learning 3 (CCScene and CCMenu)

废话

本来部门计划今天下午全部门去搞团建的,主要活动是开卡丁车、桌游等项目,可惜天不从人愿,早晨有点下雨,好不容易盼到中午晴天,结果Leader又一个通知,说今天事情太多,活动改期到下周了,我勒个去的,废话不多说,进去正题。

概述

今天练习的内容主要是在Cocos2D开发中,对菜单的运用以及场景切换,中间还涉及到对于CCSprite对象的一些操作和schedule的简单应用。

正文

首先用create_project.py建立一个基础项目,然后分别建立两个CCLayer的子类。

StudyCocos2D.h
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
//
//  StudyCocos2D.h
//  StudyCocos2D
//
//  Created by Toby Lee on 14-3-28.
//
//

#ifndef __StudyCocos2D__StudyCocos2D__
#define __StudyCocos2D__StudyCocos2D__

#include <iostream>
#include "cocos2d.h"
using namespace cocos2d;

class StudyCocos2D: public CCLayer {
private:
    void onStartClick(CCObject *obj);
public:
    static CCScene * scene();
    virtual bool init();
    CREATE_FUNC(StudyCocos2D);
};

#endif /* defined(__StudyCocos2D__StudyCocos2D__) */

这是一个最简单的头文件,相比上一篇只多了一个私有方法void onStartClick(CCObject *obj),其作用后面再说明。

关于MySQL网络协议中的数据包序号

对MySQL协议稍作了解后,我们就知道在协议中,服务端与客户端相互之间的通讯都是以包的形式进行的。

在这些包中,有一个固定的特征就是前四个字节用途不变,前三个字节表示数据包的长度,第四个字节表示当前包在本次交互中是序数。

前三个字节最大只能表达16M的长度,这是三个字节表达无符号整型的极限,所以,每次客户端可以接受到的最大数据包为16M+4个字节。

至于第四个字节,这是表达当前包的序数的,一个字节能表达的最大正整数是255。我们知道,在MySQL协议中,发送COM_QUERY命令后,服务器返回的数据格式为,响应头为一个包,然后,每一个字段的描述也会是一个包,字段说明后面会跟一个EOF包表示字段描述结束,之后则跟随的是表中的数据,每一个数据包表达一行数据,一般情况,我们每次从数据库里检索的条数,去掉描述协议的部分,在序数中我们还有不少空间可以用在数据记录上,但是,如果总的包数超过255,那会是怎么的情况哪?

在我们使用数据库的经验中,我们可以经常有机会看到很多条记录同时显示出来的例子,记录数明明超过了255,可是依然正常显示,这是为什么哪?

经过对MySQL交互嗅探,我发现在数据包次序达到255后,之后紧随的包的次序就变成了0,在Wireshark的协议分析中会认为这是错乱的协议,我想,这应该是MySQL特意使用的方式。

前后端的交互中,到发现次序达到255后,对序数加1,由于只使用了一个字节,所以数据溢出变成了0,这样的情况在MySQL协议中被认为是合法的,只要前后端认可这种方式,那这种通讯就不会出错。

所以我认为,在MySQL通讯中,包序号只是用来确认包的次序没有发生错误的,至于序号是几并不重要,只要认定255号后为0号是合法的,那就可以达到正常交互并保证数据序号不会出错的目的。