(1)用户中心的整体功能设计(持续更新)

实际需要,需要一套用户中心的系统,考虑种种原因,没有使用UCenter等系统,决定自己搭建一套,随记录一下:
主要功能:
用户中心
SSO

架构图(持续更新):
58B6A5C8-8ADB-4908-971F-11FC25083998

1、用户id的设计
使用Twitter’s snowflake (pysnowflake)
snowflake-64bit
pysnowflake中基准时间不是1970年,基准时间/usr/lib/python2.7/site-packages/snowflake/server/generator.py:EPOCH_TIMESTAMP = 550281600000不同版本不同,自行设定
pysnowflake配置:
http://pysnowflake.readthedocs.org/en/latest/
Snowflake的使用
安装 requests
pip install requests
安装 pysnowflake
pip install pysnowflake

启动pysnowflake服务

snowflake_start_server \
–address=192.168.137.11 \
–port=30001 \
–dc=1 \
–worker=1 \
–log_file_prefix=/tmp/pysnowflask.log
snowflake_start_server \
–address=192.168.137.11 \
–port=30001 \
–dc=1 \
–worker=1 \
–log_file_prefix=/tmp/pysnowflask.log
–address:本机的IP地址默认localhost这里解释一下参数意思(可以通过–help来获取):
–dc:数据中心唯一标识符默认为0
–worker:工作者唯一标识符默认为0
–log_file_prefix:日志文件所在位置

使用示例(这边引用官网的)

# 导入pysnowflake客户端
>>> import snowflake.client

# 链接服务端并初始化一个pysnowflake客户端
>>> host = ‘localhost’
>>> port = 88001
>>> snowflake.client.setup(host, port)
# 生成一个全局唯一的ID(在MySQL中可以用BIGINT UNSIGNED对应)
>>> snowflake.client.get_guid()
3631957913783762945
# 查看当前状态
>>> snowflake.client.get_stats()
{
‘dc’: 1,
‘worker’: 1,
‘timestamp’: 1454126885629, # current timestamp for this worker
‘last_timestamp’: 1454126890928, # the last timestamp that generated ID on
‘sequence’: 1, # the sequence number for last timestamp
‘sequence_overload’: 1, # the number of times that the sequence is overflow
‘errors’: 1, # the number of times that clock went backward
}

# 导入pysnowflake客户端
>>> import snowflake.client
# 链接服务端并初始化一个pysnowflake客户端
>>> host = ‘192.168.137.11’
>>> port = 88001
>>> snowflake.client.setup(host, port)
# 生成一个全局唯一的ID(在MySQL中可以用BIGINT UNSIGNED对应)
>>> snowflake.client.get_guid()
3631957913783762945
# 查看当前状态
>>> snowflake.client.get_stats()
{
‘dc’: 1,
‘worker’: 1,
‘timestamp’: 1454126885629, # current timestamp for this worker
‘last_timestamp’: 1454126890928, # the last timestamp that generated ID on
‘sequence’: 1, # the sequence number for last timestamp
‘sequence_overload’: 1, # the number of times that the sequence is overflow
‘errors’: 1, # the number of times that clock went backward
}

MAC平台下的个人SVN仓库的建立

换MAC PRO之后,以前的很多工作方式都要研究新的方式,以前是使用tortoisesvn+微云来搭建,转到mac后mac中自带svn服务及客户端(没有好的图形的svn),随配置之:
1、安装微云同步盘/Users/liwf/weiyun
2、建立目录/Users/liwf/weiyun/SVN_mac
3、创建Test(SVN仓库)
svnadmin create /Users/liwf/weiyun/SVN_mac/Test
4、配置权限 vi /Users/liwf/weiyun/SVN_mac/Test/conf/svnserve.conf
将# anon-access = read修改为
anon-access = write (因为是个人用,不限定权限,如果需要限定的话查看SVN权限配置方式)
5、启动服务
svnserve -d -r /Users/liwf/weiyun/SVN_mac
(关闭的话使用在 应用程序–》实用工具–》活动监视器 :(svnserve,或者直接ps)
6、客户端访问方式:
svn checkout svn://localhost/Test
搞定 :)

Python中MySQLdb的事务处理

conn = MySQLdb.connect()返回一个连接对象

cursor = conn.cursor()返回一个游标对象

当我们使用cursor.execute(SQL)执行一条Insert/Update/Delete语句后,我们需要使用conn.commit()提交事务,否则,语句不会生效。

其实我们常用的commit(),就是包含了一种事务处理的概念,如果你在commit()之前,执行了多条语句,只有当commit()之后,才会全部生效。

那么如果像文章开始提到的那样,执行两条插入语句,我们可以把conn.commit()语句放在两条插入语句执行之后,并放在try语句块内,如果差生异常,我们可以使用:

conn.rollback()

这个语句可以使事务回滚,直到上一条conn.commit()执行之后的位置。

所以,我的代码是这样写的,这里我就简单的写了,并没有用类来封装了:

try:
cursor = conn.cursor()
cursor.execute(insertSQL1)
cursor.execute(insertSQL2)
cursor.close()
conn.commit()
except Exception, e:
cursor.close()
conn.rollback()

这就可以达到我们的目的了。其实更优雅的方法是,对事务处理进行一个封装,将处理过程写在自己的类的方法中,并接受1个SQL语句序列(可能包含1条或多条SQL语句)作为参数,返回事务执行状态即可。

Mac中安装mariadb

1、

brew update

2、

brew install mariadb

3、执行:

unset TMPDIR
mysql_install_db

4、启动

mysql.server start

5、使用

mysql -uroot
>create database xxxxx

#查看数据库编码
>use xxxxx
>show variables like 'character_set_database';

6、实例:
1)插入数据

#coding=utf-8
__author__ = 'liwf'

import MySQLdb

try:
conn=MySQLdb.connect(host='localhost',user='root',passwd='',port=3306)
cur=conn.cursor()

#cur.execute('create database if not exists python')
conn.select_db('dbinfo')
#cur.execute('create table test(id int,info varchar(20))')

#value=[1,'188888888',0,'jsonstr']
#cur.execute('insert into UserInfo values(%s,%s,%s,%s)',value)

#values=[]
#for i in range(20):
# values.append((i,'hi rollen'+str(i)))

#cur.executemany('insert into test values(%s,%s)',values)
#
#cur.execute('update test set info="I am rollen" where id=3')
#
#conn.commit()
cur.close()
conn.close()

except MySQLdb.Error,e:
print "Mysql Error %d: %s" % (e.args[0], e.args[1])

7、主键操作

mysql的主键问题:
Mysql的两种主键。Primary key 和not null auto_incriment
在建立mysql表时,给一个字段添加了主键primary key
在insert数据时可以不用insert主键,mysql会自动添加0,但是在第二次insert时没有填写值mysql数据库还是默认添加0,会导致有重复的主键,这是不可以的。所有在定义了primary key时,在insert数据时要给主键填写值。
在建立mysql表时,给一个字段添加了主键not null auto_increment=1;
这也是一个主键。时自增长的以1为开始。这个字段是可以不用填写值的,mysql数据库会自动给填写值,不会出现primary key的状况。
Alter table tb add primary key(id);
Alter table tb change id id int(10) not null auto_increment=1;
删除自增长的主键id
先删除自增长在删除主键
Alter table tb change id id int(10);//删除自增长
Alter table tb drop primary key;//删除主建

Mac邮件只能收不能发的问题

公司邮箱,能够正常接收,但是无法发送,网上找了很多方法(例如说取消SSL选择,但是实际操作怎么也取消不成功,取消了再打开又自动勾选了),没有办法,各种蒙最终用下面的奇葩方式解决:

删除原邮箱账号,重新新建…   终于可以正常发邮件了!!! -_-!

————————华丽的分割线————————-

补充:好吧,我承认我膜(fu)拜(qi)了,昨天才弄好今天又莫名地不行了,不折腾了,果断换foxmail了

mac安装配置使用stunnel-客户端

  1. >brew install stunnel
  2. >brew link –overwrite stunnel

   3.配置:

   cp /usr/local/etc/stunnel/stunnel.conf-sample /usr/local/etc/stunnel/stunnel.conf

  增加:

[example-proxy]

client = yes

accept = 127.0.0.1:8080

connect = 118.28.18.158:443   #配置的服务器ip地址

启动stunnel:

sudo stunnel

关闭stunnel:

> ps aux | grep stunnel | grep root | awk ‘{print $2}’| xargs sudo kill -9

或者:

> cat /usr/local/etc/stunnel/stunnel.pid | xargs sudo kill -9

Mac Pro使用过程中的那些事

换了一个Mac Pro,刚开始各种不习惯,现把碰到的问题做一个总结:

1、无法ping通内网ip,172.16.*.*

$netstat -nr

发现路由到172.的都被连接到了安装的虚拟机网卡vmnet1上了

解决方法:$vi /Library/Preferences/VMware\ Fusion/networking

更改172.为173,解决!

2、安装brew

ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

工具选择:

1、Oracle客户端:免费的Toad