PHP 加密算法 openssl_encrypt vs mcrypt_encrypt

$key = "anotherpassword1";
$str = "does it work 12";
$enc = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $str . "\1", MCRYPT_MODE_ECB);
$dec = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $enc, MCRYPT_MODE_ECB);
echo(bin2hex($enc) . PHP_EOL);
var_dump($dec);
$enc = openssl_encrypt($str, 'bf-ecb', $key, true);
$dec = openssl_decrypt($enc, 'bf-ecb', $key, true);
echo(bin2hex($enc) . PHP_EOL);
var_dump($dec);

实测结论:
1. mcrypt_encrypt的加密密钥超过56个字符串则报错
2. 当字符串$str的长度是len = (16*N)-1 时, mcrypt_decrypt 与 openssl_decrypt 可互相解密。(N取正整数)
3. openssl_decrypt加密过的数据可以用mcrypt_decrypt解密,不管$str长度是多少

引用http://php.net/manual/en/function.openssl-encrypt.php
http://php.net/manual/en/function.mcrypt-encrypt.php
http://php.net/manual/en/function.mcrypt-generic.php
http://stackoverflow.com/questions/9993909/php-replace-mcrypt-with-openssl

sh脚本,多目录git更新

git更新多个项目
如 a.xxtime.com, b.xxtime.com, c.xxtime.com

#!/bin/bash

data_path='/data/www/'
search='xxtime.com'

for file in ./*
do
    #if test -f $file
    #then
    #    echo $file 是文件
    #fi

    if test -d $file
    then
        #echo $file 是目录
        result=$(echo $file | grep "${search}")
        if [[ "$result" != "" ]]
        then
                echo ${data_path}${file##*/}
                cd ${data_path}${file##*/}
                git pull origin master
                cd ${data_path}
        fi
    fi
done
exit

ejabberd 管理,添加管理员登陆

安装好ejabberd后

修改管理员密码:
ejabberdctl register admin localhost password

给管理员赋予权限:
编辑配置文件 /usr/local/ejabberd/etc/ejabberd/ejabberd.yml
在97行左右,修改为

hosts:
  - "xxtime.com"

在400行左右,修改为

###.   ====================
###'   ACCESS CONTROL LISTS
acl:
  ## 
  ## The 'admin' ACL grants administrative privileges to XMPP accounts.
  ## You can put here as many accounts as you want.
  ## 
  admin:
    user:
      - "admin": "xxtime.com"
  ##     - "ermine": "example.org"
  ## 
  ## Blocked users
  ## 
  ## blocked:
  ##   user:
  ##     - "baduser": "example.org"
  ##     - "test"

重启

ejabberdctl restart

登陆管理后台:
http://localhost:5280/admin
根据自己设置输入用户名和密码
用户名:admin@xxtime.com
密码:123456

参考文献:
https://www.digitalocean.com/community/tutorials/how-to-install-ejabberd-xmpp-server-on-ubuntu
http://coderplay.iteye.com/blog/99893

nginx日志切割

#!/bin/bash
#设置日志文件存放目录
logs_path="/usr/local/nginx/logs/"

#设置pid文件
pid_path="/usr/local/nginx/logs/nginx.pid"

#仅linux 不支持unix
#yesterday=`date -d "yesterday" +"%Y%m%d"`

#同时支持 linux unix
#echo `TZ=aaa16 date +%Y%m%d\ %H:%M:%S`
yesterday=`TZ=aaa16 date +%Y%m%d`

#重命名日志文件
mv ${logs_path}xxtime.com_access.log ${logs_path}xxtime.com_access${yesterday}.log

#向nginx主进程发信号重新打开日志
kill -USR1 `cat ${pid_path}`

SIP vs XMPP

SIP vs XMPP (Jabber)

SIP and XMPP are application layer protocols mostly used to send voice or IM over Internet. SIP is defined by RFC 3621 and XMPP is defined in RFC 3920. Basically XMPP is evolved from IM and Presence, whereas SIP evolved from Voice and Video over IP. XMPP added an extension called Jingle for session negotiation and SIP added an extension called SIMPLE to support IM and Presence.

SIP和XMPP都是应用层的协议,主要用来在互联网上发送语音和即时通信IM。RFC 3521定义了SIP,RFC3920定义了XMPP。XMPP来自即时通信系统,而SIP类似语音和视频通信。XMPP增加了Jingle扩展协议来支持面向连接的业务,如语音和视频;而SIP增加了SIMPLE协议来支持即时通信业务。

SIP (Session Initiation Protocol)

Session Initiation Protocol (SIP) is an application layer protocol used to establish, modify and terminate multimedia sessions such as VoIP Calls. SIP also can invite new sessions to existing sessions such as multicast conferences. Basically it’s referred as signalling protocol in VoIP environment that can handle call establishment, call control and call termination and generating CDR (Call Detail Record) for billing purposes.

SIP是应用层的协议,用来建立、改变和终结多媒体连接,如语音呼叫。SIP也可以在已经存在的呼叫上增加新的呼叫,实现多方会议。本质上来讲,SIP被称之为VoIP的信令协议,他可以处理呼叫的建立,呼叫的控制和呼叫的终结,并且产生CDR用来计费.

XMPP (Extensible Messaging Presence Protocol)

XMPP is an open Extensible Markup Language (XML) protocol for real time messaging, presence and request response services. Originally it was developed by Jabber open source community in 1999. In 2002 the XMPP working group developed adaptation of Jabber Protocol that is suitable for IM (Instant Messaging).

XMPP是开放的XML协议,用来实现实时消息传递、呈现和请求/响应业务。起初,他由Jabber开源社区开发。2002年,XMPP工作组将Jabber开发成支持即时通信的协议。

Difference Between SIP and XMPP

We just can’t compare SIP and XMPP because both serve different purposes like session establishment and structured data exchange respectively. But introduction SIMPLE and Jingle introduces some similar functionalities.

  我们不能简单对SIP和XMPP进行对比,因为两者服务与完全不同的目标,一个服务于连接的建立,一个服务于结构化的数据交换。但是SIP增加SIMPLE和XMPP增加Jingle后,两者开始变得类似了。

(1) SIP provides session establishment, modify and termination but XMPP provides streaming pipe for structured data exchange between group of clients.

SIP提供连接的建立、改变和终结,而XMPP在客户组内部提供流管道,交换结构化的数据。这就是说:SIP的重点是终端之间连接的建立和维护,连接以后的数据和信息传送他不关注;而XMPP重点是考虑终端组内部的数据交换,连接建立是基本的功能,而不是重点。所以,XMPP对应用的支持和扩展性的考虑很充分,比SIP天生要好。

(2) SIP is text based request response protocol and XMPP is XML based client server architecture.

SIP的信令和消息传送是基于文本的,是平面化(Flat)的数据表达,解析起来缺少规律性,在新增数据消息体的时候缺少继承性,需要开发新的代码来封装和解析,原有代码的继承性比较差。而XMPP采用开放的标准的XML表达,是一种结构化的消息结构,能够方面表达层次化的消息内容,表达内容的内在逻辑。这种XML的结构对应用的扩展和内容的解析带来极大的方便,大量软件代码可以重复利用。

(3) SIP signalling messages go via SIP headers and body whereas in XMPP messages passes via streaming pipe. XMPP sends request, response, indication or error using XML via the streaming pipe.

SIP信令由SIP报文格式的头部和内容两部分组成,也就是说,SIP报文格式的头部已经包含了部分内容,类似于HTTP,与具体的上层应用直接关联,而不是通用的报文格式;而XMPP所有信息都是采用XML在流管道之间透明传送。

SIP的连接建立通道与数据传送通道是各自独立的,连接建立在SIP client与Server之间,而数据传送通道是在Client–Client之间直接进行的。这个对视频、语音和文件传送业务很合适,但是不适合其他形式的应用。

XMPP的控制和数据通道是一体的,Clent只与Server建立连接,而Client与client之间是没有之间连接的。Client之间传送的通道是:Client1—〉Server1—〉server2—〉client2。这种方式看起来扩展性差,server压力很大,但是能够实现很好的业务功能,比如留言、广播、群聊、状态更新、Blog、微博、数据共享等等。

这种Client-server模型,很多业务的控制在Server上完成,新功能的增加在server上实现,在server上定义新的XML对象和逻辑,客户端只要负责XML数据流的解析和呈现就可以了。所以,终端实现简单。

(4) SIP runs over UDP, TCP and TLS whereas XMPP uses TCP and TLS only.

(5) In SIP, user agent could be server or client hence user agent can send or receive messages whereas in XMPP client only initiates requests to server so it will work with NAT and Firewall.

SIP是双向对称,客户端和服务器都可以主动发起连接请求并响应,这种对称连接的方式在穿越NAT和firewall的时候,带来很大的复杂性,无法保证穿越NAT。而XMPP是单向的连接,只有Client可以向Server发起连接请求,server不会向Client发起连接。这样便于NAT和firewall的穿越。

(6) Both SIP and XMPP are easy to implement.

Technically comparing SIP and XMPP is like comparing apples and oranges because the core protocols serve different purposes: session rendezvous/establishment vs structured data exchange

技术上比较SIP和XMPP,就像苹果与橙子相比,因为核心协议服务的目的不一样:连接汇聚/建立功能和结构化的数据交换功能。各自在其固有的领域有各自的优势,但是两者体系架构的差异,在未来的竞争中,个人觉得XMPP/Jingle架构更加有竞争力。因为XMPP的开放性,开发了大量的开源代码和开源应用,大量是非连接的业务,如即时通信、blog、微博、社交网络、远程控制、设备管理、三屏切换等等应用,已经有了基于XMPP开源代码和应用提供。Google在XMPP增加了Kingle,也很好地实现了基本的语音和视频通讯业务。

  基于XMPP的即时通信系统主要是Google Talk,还有基于Jabber的很多组织,最近Skype宣布支持急于XMPP协议,实现与XMPP IM的互通,微软也宣布MSN开始正式正式支持XMPP,facebook也宣布正式支持XMPP.所以,XMPP成为IM的互通比较已经初步确定,并且有一统天下的趋势.

社交网络好友关系数据库设计

好友关系设计在社交网络扮演重要的角色,以此来连接所有人。本片文章将介绍好友关系的数据库设计。这将对你设计的关系网络提供一个新的启发

https://app.box.com/s/oot5n9suwo3nw6oeyr8z

上述连接提供好友基本关系,同时具有类似facebook好友功能

数据库关系图

下面是好友关系数据设计的关系图

Note: One thing you can do to speed up the retrieval and insert operations is to keep the foreign key only in design and not to implement it in the Database. You must check the constraints programmatically rather than using database constraints.

Database Schema
数据库关系图

用户表

这张标包含4个字段 user_id 作为自增主键

关系表

前两个字段是需要关联的两个用户id, status 标示这两个用户的关系状态

Status 字段状态

Code Meaning
0 Pending 待定
1 Accepted同意
2 Declined 拒绝
3 Blocked   阻止

 

用整形代替字符串表示状态, 可以提高数据库性能

Action User

action_user_id 代表最近更新了status字段的用户id

举例,

如果用户1 像用户2发送了一个请求, 那么action_user_id就是1, 所以 发送好友请求的就是用户1.

如果用户2阻止了用户3, 那么用户2就应该是action_user_id. 用户2组织了用户3

唯一索引

为了不重复添加好友关系记录,我们给user_one_id和anduser_two_id增加一个UNIQUE索引, 这样避免重复的插入数据

它是如何工作的?

重要的是要记住,当你使用这个模型时候一定要确定 不管什么样的操作user_one_id总是要比user_two_id少. 下图是录入的好友关系数据截图.

下面是好友关系数据表

Sample relationship table data
Sample relationship table data

好友请求

插入一条好友请求. 用户1向用户2发起一个好友请求. 一旦一条记录插入到了这个关系表, 一个请求或者一个关系就已经在两个用户之间建立了. 你可以通过 statusaction_user_id 显示当前好友状态或者阻止好友请求

INSERT INTO `relationship` (`user_one_id`, `user_two_id`, `status`, `action_user_id`)
VALUES (1, 2, 0, 1)

 

同意好友请求

更新好友请求状态. 同意用户1发给用户2的好友请求.

UPDATE `relationship` SET `status` = 1, `action_user_id` = `2`
WHERE `user_one_id` = 1 AND `user_two_id` = 2

 

检查好友关系

检查任意两个用户是否是好友使用这个查询. 记住, user_one_id一定总是比user_two_id少. 如果返回一行结果, 那么这两个用户就是好友关系.

SELECT * FROM `relationship`
WHERE `user_one_id` = 1 AND `user_two_id` = 2 AND `status` = 1

 

好友列表

查看用户的所有好友. 这里用户1是登陆的用户.

SELECT * FROM `relationship`
WHERE (`user_one_id` = 1 OR `user_two_id` = 1)
AND `status` = 1

 

请求未决

获取用户1 所有未处理的好友请求. 假设用户1当前登陆.

SELECT * FROM `relationship`
WHERE (`user_one_id` = 1 OR `user_two_id` = 1)
AND `status` = 0
AND `action_user_id` != 1

 

用户的好友请求

当登陆的用户访问另一个用户的用户主页, 我们应该需要检索出两个人的好友关系状态. 这里, 用户1是当前登陆的用户. 用户1访问用户7的用户主页, 下面的查询可以检索出两个人的关系状态.

SELECT * FROM `relationship`
WHERE `user_one_id` = 1 AND `user_two_id` = 7

 

Friend Request Query Result
好友请求

上图是用户1向用户7发了一个好友请求. 根据状态我们可以知道他们不是好友. 使用下面的代码显示两人的关系状态

<?php
// Database connection code, $con is the database connection var.
// Now $row contains the query result.
// Logged in user id is stored in, $current_user_id. Profile user id is shown in $profile_user_id

switch ($row['status']) {
    case 0:
        if ($row['action_user_id'] === $current_user_id) {
            // Show, "Friend request sent" button. Show options to cancel the friend request.
        } elseif ($row['action_user_id'] === $profile_user_id) {
            // Show, "Accept Friend request" button. Show options to block and reject friend request.
        }
    break;
    case 1:
        // Check and show options to unfriend the user.
    break;
    case 3:
        // Check and show options to unblock. If the other user's visit's this profile show "profile does'nt exists"
    break;
}

 

原文出自: http://www.codedodle.com/2014/12/social-network-friends-database.html

翻译: xxtime.com

延伸阅读:
http://www.9lessons.info/2013/05/message-conversation-database-design.html
http://www.9lessons.info/2014/03/facebook-style-friend-request-system.html

linux 环境变量与动态链接库

# 指定动态链接库
/etc/ld.so.conf
/etc/ld.so.conf.d/

# 检查是否是动态链接库
ldd /bin/rm

# 指定环境变量(安全推荐)
~/.bash_profile
~/.bashrc

# 指定环境变量 所有用户
# 尽量不要修改/etc/profile, 可再/etc/profile.d/ 加入配置
/etc/profile
/etc/profile.d/

/etc/bashrc

# 让bash_profile环境变量立即生效的三种办法
1 . .bash_profile
2 source .bash_profile
3 exec bash –login

团队协同工具

团队是指为了实现某一目标而由相互协作的个体所组成的群体,它可以调动团队成员的所有资源和才智,但是如果没有团队协作,企业将可能会因为团队的内耗和冲突导致项目无法完成,从而浪费了大量时间金钱和资源。

那么,怎样才能让团队得到有效的协作,在网络时代,哪些是常用的团队协作工具,本文列举了世界上主要的10个企业团队协作工具,供大家参考。对于中国用户来说,有些产品可以借鉴。

十大团队协同工具

Skype

Skype在办公领域的应用十分广泛,家用也比较普及,大多数人每天都在使用Skypy用于工作和休闲,Skype被赋予“伟大”的协同工具,团队成员可以使用其进行头脑风暴,或者针对客户快速反应,以及轻松的聊天会话,同时还支持远程协助。(译者注:对于中国用户来说,腾讯QQ也和Skype具有几乎完全相同的功能和用处)

Yammer

Yammer可不仅仅是一个企业社交网站而已,它提供了各种各样的信息流和文章等,Yammer也鼓励员工有不同的想法,让员工更专注于工作,而不必担心因为上网而分心。Yammer是整合跨部门协同的有效服务。

Projectmanager.com

Projectmanager成立于2008年,由四个开发出来,提供一个项目管理的创新型工具,如今,Projectmanager已在全球100多个国家和地区拥有了客户,是发展快速的互联网项目管理服务。

Google Docs

Google Docs已经发布了很长一段时间,目前已经成为一个适合所有类型团队的稳定的协同工具,同时,这也是团队内多人共同编辑一个文档的最简单的途径。

Teambox

Teambox是一个创新的项目管理系统,专注于协同开发,支持项目成员的实时交流沟通。

Facebook Member Pages

在Facebook上创建一个封闭的群组并没有什么新鲜的,很多企业都将社区转向了这个平台,员工随时都可以在上面发布和工作相关的任务,并和那些在不同时期的同事进行协同。

Basecamp

Basecamp是目前世界头号项目管理软件之一,它提供了to-do list、Wiki类型的文档编辑、文件共享、事件跟踪和消息系统。它还支持世界上多种不同的语言,不过不支持中文。

Status.net

Status.net支持用户通过桌面或移动应用程序访问微博、文件共享和群组,也支持使用自定义域名以及其他社交网络的接口。

GoToMeeting

GoToMeeting不止提供电子邮件或即时通讯,还支持主管经理发布会议邀请,进行VoIP音频会议,这是一个适合中小型企业的非常简单的网络会议工具。

Socialcast

Socialcast是一个完全集成SharePoint、Outlook的微博工具,这个协作工具在管理界面上提供了一个分析套件。

随着互联网的发展,越来越多的公司开始依赖Internet上的在线协同工具来提供公司内部团队以及与用户之间即时在线工作的能力,实现无缝、实时的通讯、任务跟踪或文档分享等功能,完成企业的低成本、高性能、高整合、智能化的综合管理。

php与python在读取.ini配置文件时的区别,连词符&影响php读取配置

最近写程序时候发现一个问题
php 与 python 在读取 .ini 配置文件时候有一些区别

比如 在分别读取这三条配置的时候

password=123456
password=123&456
password=’123&456′

php 读取到的三个配置结果分别是:
123456
0
123&456

而python读取到的结果分别是:
123456
123&456
‘123&456’

由此可见
1.当配置的值中出现连词符&时,如果配置的值没有被引号包起来,则php会出错,读到的为0
2.php读取配置时,配置的值是否被引号包起来结果一样(上述的第一条除外)
3.python读取配置的时候所有等号后面的字符,包括引号,都认为是配置的值