0

mongodb和mysql的一个小小的取舍比较

对于创业的团队或者个人的项目来讲,在项目初期,可能会考虑一些比较新奇的技术或者方案。

比如关系型数据库能满足的,可能会选择其他一些Nosql方案

比如memcache能满足的,可能选择了redis来做缓存

我在做一个业余小项目thepast.me的时候

由于当时考虑到用户同步过来的数据量会很大,并且对查询的速度要求比较高

所以选择了使用mongodb来存储用户的历史数据。

前几天,在用户数量2200,共存储了440万条数据的时候,mongodb的数据文件已经占用了20G的磁盘空间

由于linode的磁盘还比较贵,2G/month 为2$,所以,我需要更换后端的存储引擎,更换为更为熟悉的mysql。

花了一天的时间,很艰难的把440万条,20G的数据,从mongodb中导出,然后插入到mysql中。

在mysql启用innodb compression的情况下,成功的把数据文件,从20G降到了7个G,节省一些开支。

另外,由于代码在查询数据库的时候,都是使用主键或者索引查询,然后又有memcache的支持,所以速度相当快。

——

小结:

mongodb:
1、加了索引的情况下,在几十G到百G的数据量,查询性能比较恒定,但也谈不上快。
2、mongodb真的很浪费磁盘空间。
3、倒腾大数据,很费神。

mysql:
1、可靠,成熟,自己熟悉。
2、主键、索引查询,速度稳定、快。
3、相比mongodb,节省30%的磁盘,如果启用innodb compression,则可以节省60%的磁盘。

另外,感谢专业dba 李彬 提供的技术支持。

0

九月九,真是个好日子

九月九,嗨,这日子还真不错!

两年前的今天

laiwei哥哥和linjuly姐姐,结婚了,从此,他们过上了幸福的生活(虽然没房没车,然后钱也不多^^), 哈哈,大家快快送个祝福吧。

两年来,虽然偶尔吵吵架,打打对方,事情平息过后,发现打打骂骂都是为对方好,自然也就不生气了。

总体来说,经过这么多年的相处,嗯,对对方那是相当的好,至少laiwei哥哥这边如此。

回想这两年来,做个简单总结

1、生活方面,渐渐趋于稳定,比较规律(不包括作息,作息那是一如既往的不规律)。

2、工作方面,相对稳定,虽然laiwei哥哥换了一次工作(或许是两次),基本能做到养家糊口,稍微有点结余的水平,不过后面的路还很长,希望laiwei哥哥继续加油,争取早日让linjuly姐姐过上有房有车有狗有猫有花有草有淘宝的幸福生活。

3、感情方面,如前所述,稳步友好发展,继续保持哦﹌

4、个人业余生活方面,laiwei哥哥一般就是写写代码,做做网站(thepast.me 有了2200个用户了,还可以),买买域名,烤烤肉,踢踢球,总之都是一些相当健康的爱好啦。linjuly姐姐,一般就是逛逛淘宝,买买东西,吃吃烤肉,逛逛淘宝,逛逛淘宝,逛逛淘宝……

5、朋友圈,过去一年多,两位主人公,都认识了一些要好的朋友

曾经有位名人说过:

人生,一部分因为有了朋友而精彩。 — laiwei

所以,继续贯彻真诚的对待好朋友的方针策略不动摇。

最后,感谢一下linjuly姐姐,真是眼睛瞎了,竟然一直陪着一穷二白的laiwei哥哥,一走就是2年!

接下来的日子,会更好。

0

中国好烧烤节目

最近可忙了

以前我都是在下班回家的路上间隙,用手机写日记呢

最近忙的累的我在路上都睡着了

导致最近木有记日记^^

中国好烧烤,是个什么东东? 嘿嘿,周六虽然加班了,周日不能虚度,为了提前庆祝芈总80大寿,组织了一次烧烤。

早上9点起来,和媳妇、小队长、小队长家琪琪、小队长媳妇,去城北批发市场买东西,买了

4斤羊肉
30个鸡翅
1斤虾
8条鱼 水果 蔬菜
老耿最狠了,从家里带来一斤蒜过来,还带了超多的菜,香蕉等等。

芈总 携家带口,拿来了喝的,菜,面包片,馒头片等一干东西

还有liaofeng,千里迢迢,赶来捧场

从上午12点多开始,一直吃到下午6点

吃的我都崩溃了呢

最后,我从烧烤的农场买了一只土鸡

散养的那种,让我自己进去一大片地里去抓

我就想鬼子进村一样,追的鸡都疯狂了

有一只鸡都被我拽下毛了,可是我一时心软,没能下狠手,就跑了

最终还是农场的人帮我抓了一个,汗

被他们拍了录像,沦为笑柄了。

另外,最近工作上的事情比较劳心,需要思考的东西很多。

需要静心。

0

postgresql show tables, show databases, show columns, describe table

PostgreSQL is one of the best database engines for an average web project and many who moves to psql from mysql (for example) often ask the following questions: what is the analog of “show tables” in postgres? or how can I get the list of databases in postgres like “show databases” in mysql? The answers are short:

mysql: SHOW TABLES
postgresql: \d
postgresql: SELECT table_name FROM information_schema.tables WHERE table_schema = ‘public';

mysql: SHOW DATABASES
postgresql: \l
postgresql: SELECT datname FROM pg_database;

mysql: SHOW COLUMNS
postgresql: \d table
postgresql: SELECT column_name FROM information_schema.columns WHERE table_name =’table';

mysql: DESCRIBE TABLE
postgresql: \d+ table
postgresql: SELECT column_name FROM information_schema.columns WHERE table_name =’table';

via http://www.linuxscrew.com/2009/07/03/postgresql-show-tables-show-databases-show-columns/

0

About SSO

前言:

SSO 是单点登录(Single sign-on )/单点登出(Single sign-off ) 的缩写。
SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。同理单点登出,即用户在一处登出,其他系统也相应登出。它是目前比较流行的企业业务整合的解决方案之一。

SSO与OpenIDOAuth的区分和联系:

OpenID 和 SSO的思想有相似之处,他们的宗旨就是用户使用统一的帐号,可以对不同的系统进行授权,也有一些较大的差别:
1、SSO是在一处登录,其他各处自动生效,在于集中管理;
2、OpenID是由用户自行决定是否允许其他第三方使用自己的帐号信息,在于去中心化,类似OAuth协议(其实目前国内开放平台的使用第三方帐号登录,就是使用OAuth协议模拟的伪OpenID),同时,OpenID是没有办法定义单点登出的(因为是去中心化的)。

已经有很多SSO的实现(包括开源的和商业的),不过都非常复杂,且依赖多,理解、部署、和现有系统集成都比较困难。

因此,在这里,从0开始,设计一套SSO的方案:

流程图:

名词解释:

1、Browser :客户端浏览器
2、Broker:siteA.com,siteB.com, etc…
3、SSO-Server:sso.com
4、token:broker和sso-server用来相互通信的凭证
5、token_cookie:broker种的cookie,是一个(随机数 + broker_name + SECRET)的加密值
6、session_cookie:sso-server种的cookie,可以理解为一个随机数
7、broker_name:每个broker都有一个标志identity
8、secret:每个broker都有一个secret,该secret只有该broker和sso-server知晓,用来加密(起到签名的作用)。
9、sign:对token_cookie, broker_name, nonce的签名
10、action: 为setup或者immediate, 默认为setup,表示如果用户在sso那里处于未登录状态,则跳转到login,immediate则意味着不跳到login页面,只是检查一下是否登录罢了。

流程说明:

用户第一次访问Broker :

1. 用户访问broker,由于是第一次访问,所以没有token_cookie,这时,Broker会生成一个随机数token,并将该token加密后,作为token_cookie种在浏览器中,然后将用户重定向到sso-server,请求sso-server把该token-cookie 和 用户的session绑定起来。

2. 用户访问sso-server,请求绑定token_cookie和用户session,传递的参数包括:上一步中生成的token, broker_name, nonce + 上述三者的签名 sign。

3. sso-server接到绑定请求后,首先验证签名,再检查cookie中是否有session_token,并且该session_token是否合法,如果合法,则把用户session和 md5( token_cookie + broker_name + SECRET )绑定起来,即通过后者可以查到该用户。反之,则重定向用户到sso/login页面,要求用户登录
这里会有action参数,默认为setup,如果没有登录,则引导用户跳转到sso/login页面

4. 用户访问sso/login 进行登录,提交的参数包括:token, broker_name, nonce + 上述三者的签名sign, username, password。sso-server对签名做验证,对用户名密码做验证,验证通过,则种一个session_cookie,并且按照上一步中的绑定策略,将用户session和 md5( token + broker_name + secret )绑定起来。之后,重定向用户到broker/index
用户访问broker/index,这时候,cookie中已经有token_cookie了,所以参考下面一节

用户再一次访问Broker :

用户访问broker,cookie中已经存在token_cookie,所以,broker会使用token_cookie 去sso-server那里,查找用户session:
1. 如果查到了,则返回用户信息
2. 如果没有查到,则重新生成一个token 和 相应的加密结果token_cookie,走“用户第一次访问Broker”流程

单点登出:

用户在任何一处登出时,都会把sso-server与该用户session绑定的token都删掉,来达到单点登出的目的。

1

thepast的初衷

昨天晚上,收到了funfunsay.com《纷纷说》开发者的来信,交流了一下thepast和纷纷说的一些设计思路。

funfunsay.com目前的笔记功能主要是:创建笔记,将笔记归入不同的脉络(Threads),创建文章(Paper)并且从已有笔记中选择纳入相关的笔记。系统支持对文章中的笔记进行拖动排序。笔记通过文章的形式共享(文章可以共享,同时文章中的笔记需单独设置共享后才能随着文章一起共享)。用户还可以收纳(Take in)其他用户共享的文章中的笔记。

简单的说,funfunsay.com/n的笔记功能主要目的是让用户更容易的整理自己的文字。通过细粒度的笔记条目组成完整的文章。

借此机会,我重新理了一下thepast到底是为了解决什么样的问题而来的:

thepast的初衷是保存个人在互联网上的“印迹”!

目前聚合了个人的qq微博、sina微博、twitter、豆瓣、blog的rss

由此衍生了一些小的功能:

1、对这些“印迹”,以PDF的形式,供用户离线保存。(现在是PDF形式,后续会考虑更好、更多的形式,比如纸质的timeline)

2、每天提醒用户,自己过往历史上的今天发生的一些事情,有时候会带来一些惊喜。

3、对这些“印迹”,能更好的搜索,管理

4、做一些数据挖掘,推送一些相关的,用户感兴趣的东西。

最后,thepast 做了一些简单的事情,同样也希望解决一些简单的问题,仅此而已。

update:

收到一位豆友在archlinux发行版环境,搭建好了thepast的运行环境,并写了一篇blog来记录过程中遇到的问题和心得,记录在这里:

http://blog.sina.com.cn/s/blog_6f97247e010117ms.html

0

持续锻炼身体 刻不容缓

因为冬天比较冷,加上晚上一般会做一些业余项目,所以每周一次的豆瓣足球,好有2个月没有参加了。

昨天晚上踢球去参加了,大场,由于较长时间未参加锻炼,刚上场的前20分钟,明显感觉胸口很闷,头稍微也有些疼,还以为自己都坚持不下去了。

还好,经过20多分钟的适应,慢慢有所好转。

工作这四年来,身体素质有明显的下滑,这个问题应该引起重视了,坚持每周锻炼身体,健康是家人的依靠和保障。

另外,晚上没和媳妇一起回家,怪想的^^

3

一个小小的开源项目:个人杂志计划

我在业余时间,做了一个小小的开源项目,叫做个人杂志计划。

目前在做的功能:

聚合个人在豆瓣广播,新浪微博,twitter的内容,并生成排版后的PDF文件,可供下载。

个人杂志计划的目的:

1. 一方面可以永久保存自己的timeline到本地。
2. 另一方面,排版后的PDF版本,在移动设备上(手机,pad)的离线阅读体验很不错,或者发送到kindle上。
3. 此外,如果我们还有精力的话,不妨把排版做的更好,这样出一本记录自己,讲述自己的纸质杂志应该还是很令人期待的。

还有一些更多可以做的东西

1. 聚合更多的内容,包括饭否,腾讯微博,wordpress……
2. 对聚合后的消息,提供搜索功能
3. 对聚合后的消息,做去重
4. PDF排版,更美观
5. 如何做纸质的杂志,包括版式设计,排版,打印

技术细节:

linux(debian6) –http://debian.org, stable and powerfull
nginx/uwsgi –web server and serve static file
mysql
python
flask(python web framework) –http://flask.pocoo.org
redis –nosqldb, store text,img etc, and used for cache instead of memcached
xhtml2pdf –convert html to pdf, https://github.com/chrisglass/xhtml2pdf
git/github –code version control
v2ex –thanks for v2ex and css of v2ex^^

项目地址: https://github.com/laiwei/thepast

官方主页: http://thepast.me

作为开源项目,期待大家加入,也欢迎吐槽。

thanks

0

我睡觉有那么投入吗

年前事情好多,比较累
到了晚上,11点左右就困的不行了
睡着后基本处于不省人事的状态
今天早上起床,我擦,发现我满脸是血
晕,原来晚上睡觉流鼻血了,然后我迷迷糊糊的不知道,用手抹了一脸
早上起来才发现
我这是到底睡的有多投入啊

ps 这要是半夜起来媳妇一开灯不得吓个半死啊啊啊啊啊

0

Password Strength Checker

用户注册网站的时候,本着对用户负责的态度,应该提示用户他的密码复杂度,免得被容易的破解!

所以需要有个简单的规则来提示用户。

设计原则

加分因素

  1. 长度>=8, score + 20
  2. 长度>=12, score + 20 again
  3. 含有小写字母, score + 20
  4. 含有数字, score + 20
  5. 含有大写字母, score + 20
  6. 含有特殊字符, score + 20

扣分因素

  1. 出现3个连续顺序小写字符,score – 20
  2. 出现3个连续逆续小写字符,score – 20
  3. 出现3个连续顺序大写字符,score – 20
  4. 出现3个连续逆序大写字符,score – 20
  5. 出现3个连续数字,score – 20

强度判别标准

  1. 得分小于60分,弱
  2. 得分介于60到80分,中等
  3. 得分大于等于80分,强 Continue reading
0

Gnu screen scroll up and copy && past

screen中如何上下滚屏?

ctrl + a + [ 进入copy模式,然后 使用j、k上线滚屏

更多滚屏快捷键:

h 左移一个字符

l 右移一个字符

j 下移一行

k 上移一行

0 移动到行首

$ 移动到行尾

G 移动到指定的行,默认是移动到最底部

Ctrl + u 上移半屏

Ctrl + d 下移半屏

Ctrl + f 下移一屏

Ctrl + b 上移一屏

screen中如何复制 粘贴?

Ctrl + a + [进入拷贝模式,然后:

1、移动你需要开始拷贝的地方

2、按空格键,表明要开始复制

3、移动j k h l 进行复制

4、再次按空格键,结束复制

5、Ctrl + a +]粘贴。

http://www.linuxscrew.com/2008/11/14/faq-how-to-scrollback-in-gnu-screen/

0

早起了20分钟

早起了20分钟(7点10分起床)

就在家吃上了热乎,可口的早饭

猪肉+粉条+萝卜 汤

炒辣椒 配热馒头

鸡蛋没吃掉。。。。

亲爱的媳妇,很辛苦,感谢

0

我小时候怎么那么怕冷

小时候,记得冬天总是分外冷

上小学的时候(确切的说是在四年级之前),是在我们村子里的学校度过的

冬天的早上5点多,貌似我已经起床了,衣服很冰冷,穿的时候,不舒服,然后我就会哭,但是哭归哭,衣服还得照穿,因为要是上学迟到了,会被老师打的

所以,大多数时候,我妈会把我的衣服提前,给我捂在被窝里,热乎了,再穿。

到了学校,冻的我直流鼻涕,冬天的早上,天总是亮的很晚,教室里有没有电灯,我不记得了(不知道是几年级开始有电灯了)

有一段时间,我会带上我自制的煤油灯或者蜡烛,(有那么一段时间,我特别着迷自制蜡烛^^),在黑黑的教室里,边背书,边暖手,很舒服,不过这样做的后果,就是我的鼻子会被灯熏黑,或者是头发,眉毛被灯火烧到,味道你懂的,发型你也懂。。。

就这样,慢慢的我读完了小学三年级,到了四年级的时候,我没有再在村子里读,我去了临村,在那里,有个完全小学(我爸当时在这里教书),就是可以读到6年级。

于是,每天早上我要走的路就更远了,应该有三四里路吧

完全小学在我家的北边,我得往北走,西北风很大,黄土高坡的风应该还是很厉害的

加上如果下了雪,雪也会被风挂在一起,很厚,走的很累,鞋子也很容易湿,更容易冷。

有那么一段时间,我会和一些伙伴,在上学的路上,捎带着每人背一些柴火,然后在冻的不行的时候,点着了,烤火,但是柴火都是没有经过别人允许从人家柴火垛上拿的,时间久了,就被告到学校校长那里了。我们被罚站,批评,之后就再也没有烧柴火。

小时候,冬天最幸福的日子就是到了周末,不用去学校的日子,我妈会把炕烧的火热,一家人围坐在一起,我妈会做针线活,我一般会搜刮一些东西边吃边玩,任凭外边寒风凛冽。

现在的冬天,好像再也没有以前那么冷过了…

0

带饭

今天晚上,亲爱的媳妇在家做明天上班的午饭,我也帮忙在做一些小事情。

以后每周可能都会有几天带饭,如果晚上回家时间来的及,不是太累的话。

说真的,每天上班时间挺紧的,早上7点多就起床,上班路上需要花费1个半小时左右,晚上到家就挺累,但是还是希望能生活的积极一些,健康一些。

媳妇既上班,又做饭,会更累,希望我也会帮上忙。

最近也经常在思考有关人生的问题,活着,到底我们真正在意的是什么?

或许过好当前每一天,和身边最亲的人,每天开开心心,才是重要的。

ps: 铁甲钢拳,值的一看!积极向上,乐观,亲情