基于GIT构建本地开发环境

注:忽略git环境安装等问题,linux可直接安装,windows有软件包可以下载安装,如下示例都是基于命令行操作。

  1. 通过clone命令构建本地基本开发环境
    git clone [user name]@[domain or server]:/[path to your git package].git  [Local folder] 从远程服务器克隆构建本地开发包。
  2. 切换开发分支
    git checkout [-b] [branch name] [origin/[dev]]
    “-b” 可选,如果设置表示新建本地分支。
    “origin/dev” 可选,如果设置表示关联本地分支到远程分支,这样在git push 或  git pull的时候不需要明确指明更新的分支,例如“git push origin dev” 这个后面的“origin dev”是可以不用每次更新的时候都输入的。如果之前没有设置,可以后期通过 git –set-upstream [local branch]  origin/[remote branch] 来实现分支关联。如下图:
    git-docs-02

 

此时打开 .git/config 可以看到如下图参数设置

git-docs-01

 

 

 

 

其它常见问题的处理

GIT 手册无法使用 “No manual entry for git-init”

原因是 手册文件缺失,从下面的地址下载,会得到一个 git-manpages 的文件夹,直接复制到 /usr/local/man 文档目录下即可。

command:  /bin/cp -R ./git-manpages/* /usr/local/man/

②:从以下地址gitclone

git://git.kernel.org/pub/scm/git/git-manpages.git

http://git.kernel.org/pub/scm/git/git-manpages.git

https://git.kernel.org/pub/scm/git/git-manpages.git

GIT官方手册

英文版本  https://www.kernel.org/pub/software/scm/git/docs/user-manual.html
简体中文版本  https://www.kernel.org/pub/software/scm/git/docs/user-manual.html
ProGit 中文版本  http://git.oschina.net/progit/
关于GIT patch操作的一篇文章, 很详细  http://www.cnblogs.com/y041039/articles/2411600.html

Gearman 安装与使用

关于Gearman的一些资料和基本的安装流程:

官方网址: https://launchpad.net/gearmand

官方文档:http://gearman.org/documentation/

GEARMAN download : https://launchpad.net/gearmand/+download

GEARMAN PHP扩展包手册: http://php.net/gearman

基本的安装与配置手册: http://gearman.org/getting-started/

GEARMAN PYTHON package: https://pypi.python.org/pypi/gearman/

Documents for PYTHON package: http://pythonhosted.org//gearman/

MySQLdb 类库文档
http://mysql-python.sourceforge.net/MySQLdb-1.2.2/public/MySQLdb-module.html
包地址: https://pypi.python.org/pypi/MySQL-python/1.2.5
一篇文档介绍MySQLdb使用的 http://drizzlewalk.blog.51cto.com/2203401/448874/

初始安装需要几个包,基本可以YUM INSTALL 搞定:

boost, gperf,libuuid

这些包安装的时候,需要同时安装 “*-devel”包,如“yum install libuuid-devel”

gperf似乎没有YUM支持,可以从官方网站下载:
http://gnu.april.org/software/gperf/#TOCdownloading

最新版本的gearman对最新版本的gperf可以正常安装。

初始安装需要配置一些项目:

–localstatedir  默认是 /usr/local/var 这个目录可能存在,但之后的 /usr/local/var/log/一般是不存在的,而且Linux系统默认的 log目录一般是  /var/log ,
–sysconfdir 更改默认配置目录到 /etc 目录。

 

启动与测试:

1.  一篇文档讲解gearman基于mysql持久化queue配置的,内容比较全
http://blog.csdn.net/wusuopubupt/article/details/17534321

2.  PHP 的 gearman扩展安装  “pecl install gearman”

3.  PYTHON的gearman扩展安装

4.  命令行测试gearmand 是否正常工作,并支持持久队列。
添加一个队列: gearman -f testqueue -b “Some data to testqueue function”
检查MYSQL数据表是否有记录, select * from gearman_queue;
处理队列: gearman -f testqueue -w
检查MYSQL数据表是否记录消失。

5.  按照官方教程和网上收集的资料分别编辑 gearman-server.php 和 gearman-client.php
两个程序,所谓及时处理指,先运行  php -f gearman-server.php &, 然后运行gearman-client.php
可以马上得到返回结果。
检查PHP端GEARMAN扩展是否良好支持持久QUEUE,需要先运行 gearman-client.php
然后检查数据库,是否有记录。然后开启,php -f gearman-server.php, 如数据库记录消失,说明
基于PHP的gearman扩展运行正常。

 

基于GEARMAN的消息队列服务器正式架设和部署

一些意料之外的问题:

1. 创建mysql数据库和用户后,无法登陆。我的版本是5.1.73, 各种测试都无法登陆,最后重置密码解决。 用root用户进入mysql, update mysql.user set Password=PASSWORD(“123456”) where User=’gearman’;  这是MYSQL的问题, 5.X版本同时支持老密码加密和新密码加密方式,明显grant 命令用的是老密码, 结果系统无法登陆,需要重新设置密码。

团队内部项目GIT操作手册

GIT服务器配置

GIT服务器地址:     git.XXX.com

“XXXX”项目地址: /data/gits/XXX.git

默认服务器端GIT分支设置及说明:

Origin/master

Origin/dev

Origin/debugs

Origin/topics

Origin/[VERSIONS]

GIT服务器”dev”分支每周Merge时间:

每周五上午开发人员要将自己已经测试过的稳定版本提交到”dev”分支。

下午2点开始,进行DEV分支运行测试,并将稳定运行版本标记为[VERSIONS]分支。

 

“XXXX”项目多地团队GIT工作流程操作规范

l  开发人员GIT帐号申请与注销

GIT帐号由运维负责统一管理,GIT帐号申请需要邮件发送到 master@xxxx.com, 说明所在技术组和项目。

如需提交服务器端公钥文件,可以直接将公钥附加在邮件附件中。

l  开发人员本地GIT操作规范

  1. 你的master分支,永远不要作为开发分支。保持master分支总是你的安全版本,且master分支需与团队GIT服务器master保持一致,任何时候你都可以从你的本地master分支获得当前项目最稳定版本和更新。
  2. “dev”分支是你的开发目录,且dev分支的代码应该总是来源于你电脑的master分支,而不是团队GIT服务器。
  3. 你的本地分支结构应该包含且尽可能只包含如下分支:
    master, dev, [debug-TAG NAME], [topic-TAG NAME]
  4. 保持你的dev分支和团队GIT服务器“origin/dev”关联,且只通过dev分支提交代码。master分支只用于从团队GIT服务器获取最新代码和更新
  5. 单向解决代码冲突,永远不要改动master分支代码。当你在MERGE master分支到dev分支时解决可能存在的冲突,如冲突导致的原因,需要修改master代码部分,那么你需要将这个问题以BUG REPORT的形式报告你的项目经理,由问题代码的开发者负责完善或项目经理协调,而后在全面检查和测试你的代码后,提交你的dev分支代码。

l  代码提交GIT服务器规范

  1. 代码commit前,需要准确且简介说明你的开发或修复日志,方便日后查询。
  2. 开发者在确认任务完成、并经过全面测试后,邮件通知你的负责人,并提交代码。同时需要关注你的任务列表和邮箱。
  3. 个人代码提交总是通过个人dev分支,向团队服务器dev分支提交。

l  基于GIT管理的团队协作开发责任说明

  1. 个人提交代码如无特别说明,BUG总是由开发者负责维护。
  2. 个人任务完成提交需要对任务质量负责,如有明显的BUG和质量问题,需说明原因,并获得绩效减分。
  3. 团队阶段任务完成后,需要反复检查和测试,

l  项目版本发布规则

… 未完成的部分。

l  已发布版本的BUG解决规范

… 未完成的部分。

其它:

 

GIT官方文档:http://git-scm.com/book/en/v2 该文档有多种语言版本可供参考

GIT日志查询相关资料:

 

GIT布局结构图

引智工程版本管理方案

 

 

GIT日志查询相关资料整理

“GIT log” 很完整的log命令资料说明

http://www.cnblogs.com/gbyukg/archive/2011/12/12/2285419.html

 

“GIT log”应用实例

http://hi.baidu.com/jeffeyliu/item/53f9acefd038ba0c560f1d9a

https://ruby-china.org/topics/939

Android開發學習第二篇(JAVA进阶-01)

主题概要:

这里主要涉及到的内容包括JAVA命名规范与习俗,一些测试性代码,JAVA包引用问题与路径设置等问题。经过两天的代码调试,详细罗列以下这篇文档所涉及到的主要内容:

[Section – 1]  JAVA命名规范与习俗。
[Section – 2]  包路径问题。
[Section – 3]  一些基础的JAVA开发规范。

 

[Section – 1]

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
一段摘录, 关于JAVA包命名规范,在“Think in Java Edtion 4” page 72
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Name visibility
A problem in any programming language is the control of names. If you use a name in one module of the program, and another programmer uses the same name in another module, how do you distinguish one name from another and prevent the two names from “clashing”? In C this is a particular problem because a program is often an unmanageable sea of names.
C++ classes (on which Java classes are based) nest functions within classes so they cannot clash with function names nested within other classes. However, C++ still allows global data and global functions, so clashing is still possible. To solve this problem, C++ introduced namespaces using additional keywords.
Java was able to avoid all of this by taking a fresh approach. To produce an unambiguous name for a library, the Java creators want you to use your Internet domain name in reverse since domain names are guaranteed to be unique. Since my domain name is MindView.net, my utility library of foibles would be named net.mindview.utility.foibles. After your reversed domain name, the dots are intended to represent subdirectories.
In Java 1.0 and Java 1.1 the domain extensions com, edu, org, net, etc., were capitalized by convention, so the library would appear: NET.mindview.utility.foibles. Partway through the development of Java 2, however, it was discovered that this caused problems, so now the entire package name is lowercase.
This mechanism means that all of your files automatically live in their own namespaces, and each class within a file must have a unique identifier—the language prevents name clashes for you.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

 

[Section – 2]

1. JAVAC 对当前开发包的编译需要设定 “-cp”参数,制定当前包的定成目录到CLASSPATH搜索路径。 。
否则会出现如下错误:

Testa.java:9: error: cannot access SectionA
stest.SectionA.sayHello();
^
bad source file: ./stest/SectionA.java
file does not contain class stest.SectionA
Please remove or make sure it appears in the correct subdirectory of the sourcepath.
1 error

原因在于,当你编译JAVA源码时,在JAVA源码中如果有使用当前包下面的其它类,那么这些类的名字空间与目录关联是受CLASSPATH参数管理的。

2. JAVA命令,执行刚刚编译过的包,需要指明完整的包路径,例如“java com.glools.utility.Testa”, 该路径与执行java的当前路径没有关系。java命令,会参考CLASSPATH,搜索要执行的命令。

总结:这个包管理模式,非常好,虽然理解和接受起来有点乱,但是仔细想,这个模式很严格且规范,这对于JAVA开发的大批量包的管理提供了有效和规范的模式。

[Section – 3]

一些基础的开发规范,今天学到的。

1.  一个.java 程序只写一个class.
2.  X.java的文件名,需要与其内部的CLASS名称完全一致。因为编译后会生成 X.class文件。
3.  每一个.java程序,都隶属与某一个包,并且在程序开始声明“package”。
4. 若用VIM开发,那么需要将当前项目的顶层包的上级目录,加入到CLASSPATH变量中,或者在编译和执行时,通过“-cp|-classpath”指定也可以,但是如果频繁调试,可能会很麻烦,所以设置CLASSPATH还是比较规范的做法。
5.  主包的主类,main方法,是静态的,原则上,这个class里,除了main,不需要其它方法了,这样比较简介明了。
6.  开始开发JAR包时,规划好程序,设计好package结构,当然这是正确的废话。

 

今天收获不少… 明天继续努力,看看需要多久可以开始android项目开发。

Android開發學習第一篇(手册文档资源与环境)

Android 学习基本资料准备:

#JAVA SE 开发手册资料

官方文档 http://docs.oracle.com/javase/6/docs/
学习手册 http://docs.oracle.com/javase/tutorial/
JAVA SE 语言规范 http://docs.oracle.com/javase/specs/ (这里包含JAVASE6\7\8三个版本的文档,有PDF版本可以下载)

“学习手册”是最重要的资料,如果你之前没有写过JAVA,这个里面大部分内容需要看一遍,不见得要记住什么,只要知道大概怎么回事,有什么东西就好,实际开发中,再进一步学习也方便资料快速查找。

 

# Android 开发资料

Android Studio, 这个是GOOGLE官方推出的android 开发工具,非常好用,建议使用,下载有些麻烦,搞不好要翻墙。
Android开发官方文档, http://developer.android.com/guide/index.html,很重要。

另:网上收集来一些不错的帖子,看手册有时候,速度比较慢,概念性东西很难一次准确掌握概貌。这时候需要借助一些网上的帖子,讲的很直白了当。我这里持续性罗列吧:
1.     “Android Activity 和 Intent机制学习笔记” http://www.cnblogs.com/feisky/archive/2010/01/16/1649081.html
2.    “Android Intent”机制详解 http://www.oschina.net/question/565065_67909

 

# 实际操作中遇到的一些问题:

1.    Linux 32位操作系统和64位操作系统问题, “Android Studio”默认下载包只有64位,JDK下载包32位和64位都有,原则上,“Android Studio”在linux 下安装,要求整套同样的版本,即操作系统、JDK、都是64位,否则会碰到各种无法安装和启动问题,这个和$JAVA_HOME, $CLASSPATH配置无关,虽然错误信息是这个。
2.    Windows 7下, “Android Studio” 实际应用当新创建“AVD”时,有个“CPU/ABI”无法选择问题,这个问题是缺少Android包,需要下载如下对应版本下的如下包
ARM EABI v7a System Image, Intel x86 Atom System Image, 关于这个问题解决的一篇帖子  http://www.eoeandroid.com/thread-192847-1-1.html
3.    “Android Studio” 本身携带的“SDK Manager” 可以加载“Intel x86 Atom System Image”,需要修改一下hosts配置:
74.125.113.121 developer.android.com
203.208.46.146 dl.google.com
203.208.46.146 dl-ssl.google.com
包下载完后,需要修改回去,要不然Android开发手册无法看,这个世界的事就是纠结,没有VPN的日子真不好过。
(另: Android SDK Manager 关于“Intel x86 Atom System Image”相关的包,不是每次都可以刷出来,如果一次刷不出来,需要多试几次,或者在不同的时段,因为如果有些服务器无法访问,相关的资源就无法获取,我在安装的时候,整个白天都无法获取这些包,晚上9点以后,才刷出来。)

 

操练MYSQL和页面编码

说实话,很多年没有碰到这样的问题了,由于养成了良好的开发习惯。但是无奈,林子大了什么鸟都有,我接了一个小项目,UTF8字符集的SQL文档,GB2312的页面字符集输出格式,GBK的数据库字符集名字设置(set names gbk;)结果可想而知,乱码鸟。

历时两天,从数据库编码测试,到文档编码确定,整理出一套处理这类问题的思路,但是说实话,字符集编码是一个程序员开发规范问题,良好的开发习惯,不会碰到这个问题,但是如果碰到了,没人有把握能够把编码成功转换。

问题解决的思路:

1.  确定SQL文件的字符集格式,我用linux 下的Geany编辑软件测试的,这一步很重要。原则上,页面编码、数据库文件编码、和names设置一直,不会出乱码问题。

2.  确定数据库字符集格式,通常新建数据库会通过 “create database DATABASE_NAME default character set utf8” 设置数据库默认字符集。在mysql中,数据库字符集设置影响到所有的表和字段。但是这个字符集设置需要和页面保持一致。

3.  这是最关键的环节:     如何把两种不同的字符集转换成相同的字符集,这里感谢MYSQL。我的数据库一般默认设置都是UTF8字符集。

mysql>   set character_set_client=utf8; (这个设置是和SQL文档字符集需要保持一致。)

mysql> set character_set_results=gbk;  (这个设置表明,这个数据结果的字符集选择,这里设置GBK,和页面GB2312保持一致。)

mysql> set character-set_connection=utf8; (这个是命令行管理器和MYSQL交互的字符集格式,由于文件是UTF8格式,LINUX的 TERMINAL默认也是UTF8格式显示数据,所以这里设置UTF8,但是这个设置原则上,对数据库内容存储的字符集没有影响。)

以上三步设置完成后。通过如下代码导入SQL文件。

mysql> use DATABASE;

mysql> source SQL_FILE.sql

以上操作完成,成功把UTF8字符格式的SQL文件,导入到MYSQL数据库,并实现GBK字符集存储。或许你会问,你设置UTF8数据库字符集,但是这里存储GBK字符集,这个可以吗?
原则上是可以的,MYSQL存储数据是二进制,字符集只是如何渲染数据,与数据的输出有关,与数据本身安全无关(这个存在争议),MYSQL早期默认的字符集是LATIN1,很少有人设置字符集,也一样使用,因为进去和出来的字符集是一致的,所以中间存储什么无所谓,这就是为什么我设置UTF8格式数据库,然而存储和提取数据都是GBK是可行的。但是仍然建议全套UTF8,这是最保险和安全的方式。

Drupal CTools研究 – 第一季 概念

研究的主题涉及CTools, DisplaySuite(DS), Views 三个模块。

初步的印象:

CTools是一个开发工具包,看起来像一个勤奋的程序员开发的,对页面组织的最大贡献是高级block功能和Page组织功能,高级的block,这里称为panel,一个页面由众多的panel组织而成,而且在CTools的支持下,可以直接在后台定义Page布局,并填充内容,感觉非常不错,同时Views和系统block在这里也起了很大的作用。

DisplaySuite(DS)是一个针对node 的内容表现层工具,扩展了系统内部view_mode的支持,但是在我之前的测试中,如果在ds中定义一个新的view_mode,你并不能直接通过node_view_multiple(); 获得制定view_mode的样式,这可能是ds的一个不足之处,但是和Views模块的配合,为由CTools创建的Page填充内容还是非常不错的。

Views是一个知道很久的模块,在几年前的开发中,由于Views的复杂管理和混乱的数据关系,让我最终决定放弃Views,从而自己开发了Views组建,现在集成在Glools-Drupal模块中。

Read more…

WeiXin时代, 应用开发的思考

“微信”,这个互联网发展的怪胎,从一个及其古怪的角度,戳中了用户的需求,而且入骨三分,逃无可逃。

随之而来的,便是关于如何用好微信的各类思考和尝试。微信红包,一个微信的公众号,却动摇了支付宝无法撼动的根基。

各大银行,纷纷开通微信服务号,使用起来确实很方便。

仔细思考微信的实际功能和应用,考虑如何和乐书网能够结合到一起?

我个人的分析:

微信,说到底,是一个通讯工具,从简单的消息通信到复杂的应用通信,最大的特点,就是封闭性,你无法在微信中,搜索帖子,无法在一个公众帐号发布的信息中,搜索你需要的信息,甚至你无法在网上找到,微信中的信息,微信的世界是封闭的。

关注微信的公众号,可以实时获得该公众号发送的信息,并且自动按照公众号分类,与微博相比,信息流的可追溯性略强,在微博中,信息流速度很快,如果一条消息希望被用户注意到,只能提高出现的次数,以提高传播率。但是微博的信息,可以搜索,微信则不行。

你会经常浏览微信公众帐号发布的消息吗?
我不会,只是偶尔看看,究其原因,是浏览体验不佳,与LOFTER的信息浏览体验或者微博相比,相去甚远。这么久用微信以来,最实用的功能是,银行的公众服务号给我的实时提醒,和微信的通信功能,省了我很多短信消费。偶尔会关注朋友圈,“朋友圈”是我使用微信唯一涉及到社交网络的地方。

所以,我的综合分析,微信之于企业的应用,首先是服务功能,其次是媒体功能。媒体功能,对企业而言,只是辅助。

12099365_112411676125_2

微信开发笔记

微信显然以火箭的速度成为了一个时代的象征,使短信成为了历史,部分代替了电话和通信交互功能,在互联网上,原来很多通过短信交互的功能,现在可以通过微信实现,且有更好的用户体验和更完美的功能。

微信接口开发者认证:    在drupal开发模式下,微信认证可以简单的print 一个数据,而不是return 页面返回值。这样可以避免drupal把整个页面render出来。

微信接口通信:    微信信息通讯是以XML格式进行的,接收到的消息不能简单的“simplexml_load_string();”处理,这样得不到正确的值,需要强制字符串转换。

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
$requestArr = (array)simplexml_load_string($postStr, 'SimpleXMLElement');
foreach ($requestArr as $name=>$element) {
$requestData[$name] = array(
'data' => (string)$element,
//'attributes' => $element->attributes()
);
}
debug_rdata(__FUNCTION__, $requestData);
}

 

这里微信官方提供的获取POST_DATA的方式,似乎不是很好的选择,个人还是建议:

$postStr = file_get_contents("php://input");

 

为了能够在drupal下,通过一个module来支持多个第三方API通信,例如微信、微博、或者其它什么信之类,开发了一个OAPI模块(Open API), 通过插件的形式支持所有第三方API,并保持自动处理过程,通过在OAPI中,创建大量的公共数据资源库,以方便任何API与系统交互。

 

GIT研究 之 花絮

无法直接创建远程 branch 问题
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
GIT官方手册,branch 远程创建部分, http://git-scm.com/book/en/Git-Branching-Remote-Branches, 一条简单的语句 “git push origin xxx” 在远程创建branch,可能是我哪里理解有误,一直无法创建成功,后来先在本地创建branch, 然后远程关联创建成功。
#git branch dev
#git push origin dev:development
* [new branch]      dev -> development

# 错误提示 “Your branch is ahead of ‘origin/master’ by 1 commit
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
注:该错误在上一篇GIT博文中,已经记录,这里只是复制过来,把和GIT相关问题整理到一起。

如果只在本地修改,还没有commit,那么用git status, 打印信息为:

# On branch master

# Changes not staged for commit:

#   (use “git add …” to update what will be committed)

#   (use “git checkout — …” to discard changes in working directory)

#    modified:   conf/gitolite.conf

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

        commit之后,用git status,打印信息为:

# On branch master

# Your branch is ahead of ‘origin/master’ by 1 commit.

nothing to commit (working directory clean)

说明没有文件需要commit,但是本地仓库 有一个commit ahead原来的master,就是本地仓库有一个提交,比远程仓库要先进一个commit。git push origin master之后,再用git staus,打印信息为:

# On branch master

nothing to commit (working directory clean)

GIT 研究 – 2014.2.13更新

历时三天详细研究和操练,终于对GIT有些较为全面的认识。这里一一记录下这几天的收获。

另, bitbucket.org 是一个不错的私人代码管理库,适合私密性要求比较高的企业和个人使用,免费:)。

注:

SHELL代码中,所有注释用“#–”标记。

# Branch 操作部分

“”“

Branch 是GIT一个很核心的概念, GIT官方手册,关于这一部分的详细说明 http://git-scm.com/book/en/Git-Branching。

Branch 分为本地branch和远端branch,两个部分,期概念相同,操作和实现略有讲究,见下面SHELL命令操作和分析部分详述。

“””


#−− ”“常规操作部分”“
#−− 新建一个本地branch
#git branch
#−− 说明:GIT创建的本地分支,与服务器端无关。但是支持全部本地branch操作。

#−− 新建一个本地branch 并切换为当前branch
#git branch −b
#−− 创建完成后会得到如下提示:
Switched to a new branch 'test'
#−− 执行 git branch −a,得到如下信息
master
* test
remotes/origin/HEAD −> origin/master
remotes/origin/master
#−− 上面提示信息可以看到,test 为当前branch,且远程没有创建"test"branch

#−− 新建一个服务器端branch
# git push origin
#−− "origin" 是默认的repositry名称,该命令的解释为,在服务器段origin代码库,创建分支。
#−− 创建分支后,该分支只在服务器端存在,也就是说,其他人可以通过 “git fetch −−all”获取到该分支信息。

#−− 关联本地分支与服务器端分支
#git push origin :
#−− 例如
# git push origin dev:development
#−− 关联本地“dev”branch 和 服务器端 “development”branch,该操作完成后,通过
# git checkout dev
#−− 可以切换当前branch 为 “dev”,同时可以对该“代码库对象”进行修改等操作。

#−−删除服务器端分支
#git push origin :
#−− ":"这个冒号是必须的,该命令既可以作为删除远端branch命令,也可以作为关联本地branch和服务器端branch命令,例如:
#−−现在的服务器端和客户端全部branch状况
master
* test
remotes/origin/HEAD −> origin/master
remotes/origin/master
#−−执行创建远端branch并,自动关联本地branch命令
#git push origin test:testSite
#−−得到如下输出结果:
Password for 'https://xxx@bitbucket.org':
To https://xxx@bitbucket.org/xxx/lasooo.git
* [new branch] test −> testSite
#−−现在的全部branch状况 “branch −a”
master
* test
remotes/origin/HEAD −> origin/master
remotes/origin/master
remotes/origin/testSite

#−−删除远端branch
#git push origin :testSite
#−−得到返回信息
− [deleted] testSite
#−−删除后的branch状况
master
* test
remotes/origin/HEAD −> origin/master
remotes/origin/master

#−− *** 重点说明:
#−− 如果有另外一个用户在服务器已经fetch了“testSite”branch, 此时当你删除服务器端“testSite”branch后,
#−− 其他人需要执行 “git fetch −p” 或 “git fetch −−prune”才可以同步他人本地branch视图。
#−− 单纯“git fetch”无法获得完整branch视图,并更新本地branch视图。

GIT研究之花絮整理:

# 错误提示 “Your branch is ahead of ‘origin/master’ by 1 commit

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

如果只在本地修改,还没有commit,那么用git status, 打印信息为:

# On branch master

# Changes not staged for commit:

#   (use “git add …” to update what will be committed)

#   (use “git checkout — …” to discard changes in working directory)

#

#    modified:   conf/gitolite.conf

#

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

        commit之后,用git status,打印信息为:

# On branch master

# Your branch is ahead of ‘origin/master’ by 1 commit.

#

nothing to commit (working directory clean)

说明没有文件需要commit,但是本地仓库 有一个commit ahead原来的master,就是本地仓库有一个提交,比远程仓库要先进一个commit。git push origin master之后,再用git staus,打印信息为:

# On branch master

nothing to commit (working directory clean)

Drupal7 Custom Field Research

目标:

1.  研究Drupal7 Field系统实现机制

2.  如何开发定制Field模块

研究Drupal7 Field系统实现机制

有三个分支问题:

1.   Drupal Form 系统如何和Field系统整合?

Drupal7 form 按照 #type 属性设置字段类型,在Field系统中, 通过WIDGET 类型代表 form=>#type 属性,对应的HOOK是 “HOOK_field_widget_info”。

2.   Field字段设置如何和Drupal系统整合?

所谓Field字段设置和Drupal系统整合,指自定义Field字段,可以出现在drupal系统后台,内容类型管理的字段设置中,并且可以根据自定义字段设置对字段进行初始化设置。

其次,根据内容类型定义的字段,可以输出有效的FORM表单,最后,可以把FORM表单提交的数据,通过Field预先的设置,实现数据录入。

在第一歌问题中,解决了Form 和 Field关联问题,这里重点是Field和Drupal7系统后台整合。

所有相关的HOOK如下:

HOOK_field_info,  定义字段类型

HOOK_field_widget_info  定义字段对应的WIDGET

– 该HOOK中的设置项“field types” 指向当前已经在HOOK_field_info中,定义的字段,可以是系统已经定义字段,例如 “textfield”等字段。

– WIDGET label名称会出现在 drupal7后台,内容类型定义,字段管理的 widget 列。

– 同一个字段可以有多个WIDGET,但是一个字段至少需要有一个WIDGET。

HOOK_field_widget_settings_form  定义字段设置,该HOOK中定义的字段设置表现在 后台字段属性设置的 “编辑” TAB, 其它TAB还有,“设置”、“控件类型”、“删除”。

HOOK_field_settings_form  定义字段设置,该HOOK中定义的字段设置表现在 后台字段属性设置的 “设置” TAB, 其它TAB还有,“编辑”、“控件类型”、“删除”。

3.   Field数据操作部分如何工作?

参考 modules/field/field.api.php

意外的收获

1.  ‘managed_file’ WIDGET 类型,是Drupal7 内部提供的AJAX方式文件上传类型,及在$form 的 element设置中, $form[‘hello’]=array(‘#type’=>’managed_file’);

该字段类型在 api.drupal.org的form API文档中,没有注明的类型。更多的相关设置需要参考 /modules/file/file.module 和  /modules/file/file.field.inc 两个文件。

可以设置上传文件类型,文件大小限制(管理员模式下文件大小不检查)等。Drupal7系统 image 模块,是基于该模块的‘managed_file’ WIDGET类型扩展而来。

存在的问题

1.  HOOK_element_info 设置中的一些问题,同时也是Drupal7整个系统存在的问题:


function address_element_info(){
$types = array();
$types['address']=array(
'#input'=>TRUE,
'#process' => array('address_element_process'),
'#value_callback' => 'address_element_value',
'#element_validate' => array('address_element_validate'),
'#pre_render' => array('address_element_pre_render'),
'#theme' => 'address_element',
'#theme_wrappers' => array('form_element'),
'#size' => 22,
'#extended' => FALSE,
'#attached' => array(
'css' => array($file_path . '/address.css'),
'js' => array($file_path . '/address.js'),
)
);
return $types;
}

在上面的代码中,有“#process”=“address_element_process”设置项,这里“address_element_process”就是实际HOOK函数的名称,没有MODULE前缀。

在整个drupal系统中,HOOK大概分为三类,分别为”以”MODULE名称或TEMPLATE等为前缀的,“指定”MODULE名称或TEMPLATE等为前缀的,还有

就是这里提到的,没有前缀,这是DRUPAL7系统中,比较混乱的,虽然仔细想想也有道理,但是一致的规则更便于开发。

编辑中… 2014年1月26日

最近从LOFTER上下载的一张照片,意境级美。

lighttpd, mysql, PHP 5.3.19, postgresql 配置安装日志

这套系统装过很多次了,以前偷懒,没写日志, 结果每次安装都得搜索一堆资料, 这次勤快了,该记录的全部记录下来, 以后省事了。

另外, PHP5.3.19的选择,是试过5.3.18 5.3.20后,发现这个版本编译和运行还比较稳定的,两年多来使用一直非常好。

在Ubuntu12.04下, 大部分扩展包可以直接apt-get获得, 但是有少数,搞不定, ldap就是其中一个,如果搞不定,只能下载源码包编译安装。

为什么选择lighttpd, 而不是apache?

速度快很多, 配置文件简单,操作容易。另外, lighttpd, 和  php, python混合配置, 效果不错。

 

#安装日志

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

PHP5.3.19在ubuntu12.04下,编译有问题,更换PHP5.4.21了。

 

【 PHP 】

关于zlib2启用问题, 在 ubuntu 系统下,需要安装 “libbz2-dev” 包。

# – – –  LDAP 轻量级目录访问协议安装

LDAP 安装依赖 berkelyDB, 一个非常优秀的接口型数据库,可以安装在任何平台, 包括android, linux, unix, windows, mac等。

官方网站: http://www.oracle.com/technetwork/products/berkeleydb/overview/index.html

官方文档: http://www.oracle.com/technetwork/products/berkeleydb/documentation/index.html

编译安装文档(For unix, linux system):http://docs.oracle.com/cd/E17076_03/html/installation/build_unix.html

LDAP 相关链接:

官方网站: http://www.openldap.org/

安装笔记, BerkelyDB默认安装在  /usr/local 目录下,  ldap的lib库默认安装在/usr/local/lib目录下, PHP默认的LIB库目录是  /usr/lib, 所以需要 ln -s 一下相关的 .so文件,和.h文件, .h文件是在  /usr/include/目录下。总体而言一切顺利。

注:这里有个问题,我使用BerkeleyDB5.1.23版本,应为之前已经编译过,所以我直接运行 sudo ../dist/configure, 运行正常, 然后 make, 没有需要make … all 的东西,然后我也没有在意,直接 make install, 这一步执行正常,结果,浪费很多时间openldap安装不上去,显示berkeleyDB not available.

最终 BerkeleyDB 和 Openldap配套的版本是, BerkeleyDB: db-5.3.21,   openldap: 2.4.37 .

BerkeleyDB 安装后,默认安装目录 /usr/local/Berkeley….  , 其中包括 lib, include, 两个目录, 需要分别将 lib/libdb.so 和  include/db.h  “ln -s “到  /usr/lib  和  /usr/include目录。

这其中在多个BerkeleyDB版本匹配中,可能发生,BerkeleyDB已经安装,版本不匹配问题,这是如果要卸载,除了手动删除 /usr/lib, /usr/include 刚刚 “ln -s” 的软链接外,需要到BerkeleyDB安装包的 相应目录,例如 [build_unix]/ 执行,  sudo make uninstall, 这样可以删除全部关联链接。并 sudo make clean, 然后重新 sudo make  .

以上全部操作完,安装成功。

 

【lighttpd】

这个安装,稍微有些麻烦,主要我的电脑, Ubuntu装载U盘上,硬盘是win7, 一切设置完成后, 如果使用硬盘作为  lighttpd 虚拟机目录,需要提前mount这个目录与 lighttpd设置的目录相匹配,我之前想简单用ln 一下的,结果lighttpd没有操作权限,只能mount。

其它一切配置都还简单.

GIT 使用手册整理

《GIT简易实用指南》  http://rogerdudler.github.io/git-guide/index.zh.html

非常不错的使用引导。

 

《GIT community book》  http://gitbook.liuhui998.com/

GIT社区编辑的使用指南,非常不错。

 

《GIT  Reference》 貌似官方手册  仅供参考  http://gitref.org/