Jump to Navigation

Document

Programming articles and books.

php扩展编写中的整数参数接收

在php中没有C/C++语言中的unsigned long long,unsigned int这些无符号整数类型,

在C/C++程序中一般表示为uint64_t,uint32_t等。

如果在php扩展中需要接收这些无符号数据类型,则需要特殊的处理方式。

对于在PHP支持的范围内的整数,可以直接使用"l"参数获取,

但对于赶出php支持范围的整数,一般需要使用"s"参数获取,

之后在C/C++语言中转换成无符号整数。

也就是,通用的情况下,参数定义为mixed(integer/string)类型的。

在扩展中使用"z"接收参数,接收到之后,使用宏Z_TYPE_P判断参数的实际类型,

对于Z_TYPE_P == IS_LONG的时候,直接转换成无符号类型,

因为这情况情况说明PHP正确传递了整数类型的参数。

如果超出了PHP处理的范围,参数会被转换为浮点数,宏Z_TYPE_P应该为IS_DOUBLE类型。

这样就可以根据扩展中判断出来的类型做不同的接收处理。

当使用字符串类型传递这种参数时,Z_TYPE_P == IS_STRING,转换一次就可以。

Category:

svn到git的迁移与过渡方案

svn与git都是源代码版本控制软件,但它们属于不同的时候。
svn特点在集中式的管理方式,而git更适合于当前分布式管理方式。
当前从svn到git的迁移方案,都是以git为目标,从git的角度提供了相对的迁移策略。
使用的比较多的是,git-svn 和 subgit。

前者出现的早,一直是在git包里自带,用的人多些,在最新的版本里对分支的支持已经非常完善了。
但是它只是一个客户端口的解决方案,能让使用人员用git的方式管理svn代码库,并最终把代码存储在服务器的svn服务器上。
后者属于第三方的解决方案,并且是个商业产品。客户端的使用纯git命令而非git-svn命令,
并在git服务器上提供服务器端的配置支持,让服务器上的git与svn服务器保持同步。

在客户端上则看不到svn的影子,只是把git-svn拿到服务器上使用,并且自动化了。

这两种方案最终都是使用 git或者类似git命令管理代码,与向git的迁移目标一致。

Category:

gitlab安装

gitlab是与github类似的git开放代码管理平台,不过gitlab是开源的版本,
可以在自己服务器上搭建类似github的代码管理平台。
gitlab是使用ruby on rails开发的,目前来说已经比较成熟。
在经历上次安装5.x版本的gitlab失败后,最近有抽了点时间,
为了能推动使用git库开发,再次尝试安装了一次,还算比较满意。
现在把安装过程和安装中遇到的问题与解决办法简单总结下来,
以备后续参考。

安装版本选择,
这次选用的是最新的6.4.0版本。
其他主要使用的包版本如下:
https://github.com/gitlabhq/gitlabhq/archive/v6.4.0.tar.gz
centos-6.5-x86_64
ruby-2.0.0-338
python2.7
mysql-5.5
nginx-1.4.3
redis-2.8
git-1.8.5.2

Category:

git submodule 引用一个repo的branch分支

git submodule add -b branch_name git@abc.org:account/efg.git cname
git submodule add -b [branch] [URL] [DirectoryName]

参数在于-b branch_name

这个功能应该是在git-1.8.2加入的,
如果之前需要使用这个类似svn:externals类似的引用任意分支的功能则使用上比较复杂。

在.gitmodules中显示比普通的submodule多了一个branch属性:

[submodule "cname"]
path = cname
url = git@abc.org:account/efg.git
branch = branch_name

Category:

实际项目中的常见算法

【编者按】本文原始内容来源于stackexchange,遵循cc-wiki协议;

近日Emanuele Viola在Stackexchange上提了这样的一个问题,他希望有人能够列举一些目前软件、硬件中正在使用的算法的实际案例来证明算法的重要性,对于大家可能给到的回答,他还提出了几点要求:

JSON-RPC协议与网络传输

通常据说的JSON-RPC协议指的是数据格式协议,
对于数据包的传输,可以使用不同的网络连接协议实现,
最基本的只使用tcp传输,所有传递的数据包以 json格式为准。
对于无法识别成json格式的数据包,像其他的类似软件一样认为协议错误。

另外,其他的像http,websocket这些通用协议,都可以作为JSON-RPC的传输层使用。
RPC的概念是一个远程过程调用,想当于通过网络执行一段远程服务器上的代码。
那么这段代码可以理解成普通编程语言中的函数,
它有函数名字和函数参数,这样程序的其他位置可以通过名字与参数调用。
JSON-RPC协议也是如此,给远程服务器一段功能代码一个名字与输入参数,
然后通过网络发起这段功能代码的调用,执行并返回结果。

所以,JSON-RPC协议标准,每次调用都需要提供一个方法名,一组方法参数。

40多个关于人脸检测/识别的API、库和软件

自从谷歌眼镜被推出以来,围绕人脸识别,出现了很多争议。我们相信,不管是不是通过智能眼镜,人脸识别将在人与人交往甚至人与物交互中开辟无数种可能性。

Category:

初步尝试opencv图像识别训练

在了解了一些关于opencv的功能与基本用法之后,开学尝试使用opencv做一些实际应用。
本次选定一个功能应用,识别验证码功能。
验证码用于网站的防伪,一般为大小写字母与数字,4-6个字符不等。

使用opencv识别,分解为以下步骤,
验证码图片的切割,把图片中的几个字符拆开成单独的字符图片。
使用拆开的字符图片执行opencv训练,
使用训练好的分类器文件,识别目标中的字符。

对于图片验证码的切割,又分为下面几个步骤,
图像去噪,去除图像的背景,混淆随机点/线
图像的加强或者平滑处理,让其中的字符更清楚
根据字符轮廓,切割出字符图片。

这一步中,对于稍微复杂的验证码,也非常难以做到,
例如在去噪的时候,会把字符线条也去掉了部分,对于比较细的字体,可能就被过滤掉了。
对于有比较粗的混淆线时,这种线一般与字符交叉重叠,
在计算字符的轮廓时,会出现两个字符粘连一在起的情况。
图片加强时,也会加强没有去掉的混淆点/线,影响识别字符轮廓
还有些字符距离可能由于倾斜或者字体大小不同而靠的非常近,

go语言学习笔记-文件读写

和文件读写相关的包和类:
os.
bytes.
Reader
Writer

package main;

import ( "fmt"
"os"
"bytes"
)

func main () {
fp,err := os.Open("file.go")
fp2,err2 := os.Open("file2.go")
data := make([]byte, 100)

if err != nil {
count,err3 := fp.Read(data)
if count == 0 && err3 != nil {
fmt.Printf("%s", data[0:count])
fp2.Write(data[0:count])
}
}
}

Category:

comdb - 融合couchbase与mysql的分布式KV存储

K/V数据的优点是结构简单,读写速度快。目前的互联网应用互动数据要求这种级别的存取效率。
沿着当前技术发展趋势设计这么一种分布式的KV存储系统。

comdb中的couchbase系统,本身是一个偏向内存的分布式KV存储系统。
couchbase充分展示了无主分布式系统的优势,集群中所有节点都以相同的模式存取数据,
所有节点在集群中的角色完全一致,集群完全符合大规模水平扩展的需求。

在设计comdb的运行机制时,除了实现两个组件的合并存取,提供一致的访问接口,
还在mysql这层做了大量的工作,模拟couchbase的某些分布机制,
以实现高可用的大规模集群水平扩展与数据自动迁移。
虽然couchbase有自带的磁盘存储,但现有一些开发工程师和运维对新兴的KV存储可靠性尚有些疑虑,
再多应用一层mysql存储,对尽可能保证数据完整非常有帮助。

comdb的设计,主要根据当前计算机技术发展趋势,大内存,快速网络,
弱化磁盘存储的应用,把其作为一个最终可用的磁盘备份。​

页面

订阅 RSS - Document


Main menu 2

by Dr. Radut