子非鱼,安知鱼之乐?

我的程序人生,累并快乐着。
posts - 40, comments - 210, trackbacks - 2, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

置顶随笔

摘要: 情况是这样的:这个数据库先前没有启用完整日志,用的是简单日志。至于为什么这样用,原因很多,就不再追究了。后来有段时间服务器有些问题,连续的几次非法重启以后,数据库挂了,被标志为可疑。于是采用了dbcc checkdb进行修复。然后又对几个表也进行了单独修复。然后数据库可以用了,于是为了防止此类事件再次发生,把日志改为完整。结果,日志膨胀到60G以后,无法收缩。不管是把日志改为简单,还是使用截断日志...阅读全文

posted @ 2008-11-14 11:37 Jason Cui 阅读(266) 评论(7) 编辑

2008年11月14日

情况是这样的:这个数据库先前没有启用完整日志,用的是简单日志。至于为什么这样用,原因很多,就不再追究了。

后来有段时间服务器有些问题,连续的几次非法重启以后,数据库挂了,被标志为可疑。于是采用了dbcc checkdb进行修复。然后又对几个表也进行了单独修复。

然后数据库可以用了,于是为了防止此类事件再次发生,把日志改为完整。

结果,日志膨胀到60G以后,无法收缩。不管是把日志改为简单,还是使用截断日志的方式,日志的可用空间始终为0(或者是一个很小的数值),日志一直膨胀下去,直到有一次把硬盘空间占满。

这个问题怎么解决?

首页暂放一下,明天主动撤下。多谢。

posted @ 2008-11-14 11:37 Jason Cui 阅读(266) 评论(7) 编辑

2007年10月29日

Django的设计里,Session的保存是借助Cookie的,Cookie的保存默认有两种周期,浏览器生命周期和14天周期。这两者的选择在settings.py里面的一个参数,设成True就是前者,设成False就是后者。但是,我们通常的需求是用户登录的时候可以选择是否记住登录,如果不选就是前者,如果选中,就使用后者,但是Django却没有留下这个接口。
在我以前的文章里面,是通过直接修改Django的源代码,改了它的sessionMiddleware来解决的,今天在浏览它的google group的时候,终于找到了一个比较正规的方法。其实其原理跟我那个方法是完全一样的,修改sessionMiddleware,让它在设置Cookie之前从当前的session里面读取一个值,看看是否要记住密码,从而控制生成哪一个周期的Cookie。
但是他的做法就比我要高明了,我的做法直接修改了Django的源代码,所以导致每次升级的时候会很麻烦,因为会覆盖以前的修改。但是他的做法是自己重新写了一个sessionMiddleware,基本上,这个文件应该就是直接把原来的拷了出来,然后做修改。只要在settings文件中指定这个middleware的类,让你的项目使用自己的这个就可以了。这样,系统自己的就完全被忽略掉了。
想来想去,还是把代码附上吧,以防万一:
 1from django.conf import settings
 2from django.contrib.sessions.models import Session
 3from django.contrib.sessions.middleware import SessionWrapper
 4from django.utils.cache import patch_vary_headers
 5import datetime
 6
 7class DualSessionMiddleware(object):
 8    """Session middleware that allows you to turn individual browser-length 
 9    sessions into persistent sessions and vice versa.
10    
11    This middleware can be used to implement the common "Remember Me" feature
12    that allows individual users to decide when their session data is discarded.
13    If a user ticks the "Remember Me" check-box on your login form create
14    a persistent session, if they don't then create a browser-length session.
15    
16    This middleware replaces SessionMiddleware, to enable this middleware:
17    - Add this middleware to the MIDDLEWARE_CLASSES setting in settings.py, 
18      replacing the SessionMiddleware entry.
19    - In settings.py add this setting: 
20      PERSISTENT_SESSION_KEY = 'sessionpersistent'
21    - Tweak any other regular SessionMiddleware settings (see the sessions doc),
22      the only session setting that's ignored by this middleware is 
23      SESSION_EXPIRE_AT_BROWSER_CLOSE. 
24      
25    Once this middleware is enabled all sessions will be browser-length by
26    default.
27    
28    To make an individual session persistent simply do this:
29    
30    session[settings.PERSISTENT_SESSION_KEY] = True
31    
32    To make a persistent session browser-length again simply do this:
33    
34    session[settings.PERSISTENT_SESSION_KEY] = False
35    """
36    
37    def process_request(self, request):
38        request.session = SessionWrapper(request.COOKIES.get(settings.SESSION_COOKIE_NAME, None))
39
40    def process_response(self, request, response):
41        # If request.session was modified, or if response.session was set, save
42        # those changes and set a session cookie.
43        patch_vary_headers(response, ('Cookie',))
44        try:
45            modified = request.session.modified
46        except AttributeError:
47            pass
48        else:
49            if modified or settings.SESSION_SAVE_EVERY_REQUEST:
50                session_key = request.session.session_key or Session.objects.get_new_session_key()
51                
52                if not request.session.get(settings.PERSISTENT_SESSION_KEY, False):
53                    # session will expire when the user closes the browser
54                    max_age = None
55                    expires = None
56                else:
57                    max_age = settings.SESSION_COOKIE_AGE
58                    expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE), "%a, %d-%b-%Y %H:%M:%S GMT")
59                
60                new_session = Session.objects.save(session_key, 
61                                                   request.session._session,
62                                                   datetime.datetime.now() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE))
63                response.set_cookie(settings.SESSION_COOKIE_NAME, session_key,
64                                    max_age = max_age, expires = expires, 
65                                    domain = settings.SESSION_COOKIE_DOMAIN,
66                                    secure = settings.SESSION_COOKIE_SECURE or None)
67        return response
68

posted @ 2007-10-29 16:00 Jason Cui 阅读(1436) 评论(3) 编辑

2007年10月28日

假如你是一个开发人员,假如你通过威客网站比如k68.cn来接一些单子,或者是通过朋友介绍或者个人魅力找到了一些小项目来做;

假如你是一个开发团队,你们希望自己做项目的过程更加标准化,希望用户能够通过你们专业的流程信任你们的开发能力,但是你们目前没有自己的专用服务器,或者没有独立固定的外网IP;

这个时候,你如何来管理你的项目信息,如何让用户随时看到你的工作进度,如何让用户简单有效的提出他们的修改意见,产品交付后,用户的Bug如何报告给你,你又通过什么样的手段来管理它们呢?

不知道你是如何来解决这个问题,但是我却多次为这个问题所烦恼。开发过程中我没有办法让用户知道项目的进度,哪些功能已经完成,哪些功能有待开发,哪些功能需要他们的确认再修改;开发完成后用户只能经常的通过电话或者Email来告诉我系统中新发现的Bug,而我不得不建立一个Excel来管理它们,当我准备把修改了部分Bug以后的版本发给用户以后,用户不知道哪些是已经完成的,因此导致重复的报告我还没来得及修改的问题;而如果我想等一次全部改完再给他们的时候,他们又会等的不耐烦,不知道我是不是在工作。

从需求上来看,我需要一个标准的Bug管理系统,如果我有自己的服务器,那么问题很简单,装一个Mantis就可以了,甚至,我还可以装个Bugzilla,甚至,是Jira。不过,我没有服务器,那就比较麻烦,即使是只买一个包含PHP+Mysql功能的虚拟主机,加上域名,也要五百块左右,还要自己关心数据备份的问题,而且,我的用户对使用这种复杂的Bug管理系统有着相当的抵触情绪。

现在,我有了Bugols,全名Bug Online System,即Bug在线管理系统。你只需要记得这个域名www.bugols.com,其它的问题,都不用操心。而且,更重要的是,这个系统的设计目标就是给那些希望最快的使用Bug管理的个人开发者和那些对电脑几乎一窍不通的客户来使用的,因此,该网站的设计尽量简化,功能和菜单上都极尽简单,但是,恰好够用。另外,该系统还可以作为一个简单的项目管理工具来使用。

打开网站的首页,首先看到的是一个简洁的界面。点击浏览项目,能够看到网站上所有被设为公开的项目列表,点击查找项目,可以通过项目名来搜索到项目。点击一个项目的名称进入项目页面,看到的就是该项目下所有的Bug列表。

在项目页面可以看到左边的菜单,因为是公开项目,任何人都可以提交Bug报告;可以进入项目的公开讨论区,可以作为简单的软件支持论坛;如果你已经登录了,可以创建自己的过滤器(完全自定义的Bug搜索列表),以及收藏项目或者申请加入项目的团队。

如果你还没有用户,可以通过右上角的注册链接在半分钟内注册一个新用户,马上就可以使用网站全部的功能了。你可以创建自己的项目,可以加入另一个项目作为开发者或者作为普通用户(使用者)。如果你的项目被设为私密项目,那么该项目将不会显示在网站的项目列表中,也不会被搜索到,其它用户如果想看到该项目,只能通过项目的管理员手动的添加对方的用户名到项目成员中,并告诉对方该项目的Url,否则非项目成员将没有办法看到项目的任何信息。

通过这个网站,我可以简单的创建一个私密项目,为我的客户注册一个用户并添加到项目中,然后把项目地址和用户名密码发给我的用户,那么,在前期开发过程中,我可以把用户的需求整理成一个个的待开发的任务点。这样,用户就可以随时看到我工作的进展,哪些功能已经完成,哪些没有完成。对于有异义的任务点,他可以直接把他的修改意见留下,或者在经过电话的详细讨论后,由我来添加到任务点的备注上,作为参考和历史依据。当产品开发完成进入测试阶段后,用户可以把Bug直接提交上来,并且可以随时监控我的工作进展,哪些已经修改哪些还没有修改。

通过Bugols,不但提高了我和客户的沟通效率,大大改善了产品的质量和用户的满意度,赢得了良好的用户口碑,使得用户更加欣赏我的专业形象,从而为下一次合作奠定了良好的基础。

posted @ 2007-10-28 14:42 Jason Cui 阅读(1895) 评论(26) 编辑

2007年6月14日

网站是C#写的,asp.net 2.0,分成www, bbs, blog, group等等几个站点,几个访问量大的使用自己的应用程序池,小的几个使用同一个。
一开始开发的时候似乎没有发现这个问题,而且至今在本地测试也没有遇到过这个问题,但是发布到服务器以后开始出现。

问题的现象就是,打开某个页面会随机的出现需要登录网站,请输入用户名和密码的那个对话框。按理说这个框应该只是在IIS使用基本身份认证的时候才会出现,但是我们的程序用的是Form认证,Cookie是自己处理的。而且这台机器上所有的站点都没有使用基本身份认证。匿名访问和集成身份认证是按照默认选中的。

出现错误的页面和时间都是随机的,不输入用户名密码点击取消的话,页面可以正常打开,再刷新就不会弹出。但是如果点确定,就会出现一个很奇怪的页面。

请问大家,有没有什么解决方案?商业网站,比较着急,多谢。

posted @ 2007-06-14 17:23 Jason Cui 阅读(1600) 评论(10) 编辑

2007年4月22日

Bugols,中文在线Bug管理系统,为中小开发团队提供简单完善的Bug管理系统,无需再为寻找和购买服务器而苦恼,无需为搭建和配置自己的Bug服务器而辛苦,也无需为让用户如何提交他们的Bug和建议而绞尽脑汁。
http://www.bugols.com

posted @ 2007-04-22 12:14 Jason Cui 阅读(1768) 评论(14) 编辑

从99年开始接触互联网,在2000年看到了互联网的潮起潮落,见识了很多人,很多事。但是后来,一直没有找到机会,始终独身一人,空有壮志凌云,无处施展。

终于在等待了6年之后,才让我进入这一行业,也许是自己太懒了,没有去争取,没有努力。总之,当你身边聚集了这样一群有着同样兴趣,同样价值观,同样爱好的人,你的理想即使已经是死灰,也会复燃。

对于做一个什么样的项目来开始这第一次尝试,跟朋友们讨论了很久,想法也经过了几次易稿,也在讨论的过程中,形成了一个团队。从最初的点子收集网,到最终确定的在线记账,经历颇多。对于创建商业型网站,我希望它是一个可以看到未来,看到成功的可能性的网站,而不是一个公益性的,没有任何收费的可能性的东西。另外,它应该是大众化的,人人都可以并且愿意参与的,而不是只针对互联网用户中某一小部分人自娱自乐的封闭的平台。只有这样,才存在长尾理论和蓝海战略成功实现的可能。

理财易的来源是因为自己曾经希望养成记账的好习惯,却一直没有成功。之前做了很多市场调查,也看到了很多已经存在的记账网站的存在,但是我们相信,我们可以做的更好,因为他们还没有达到我希望的那些功能。既然我能够提出这些需求,相信别的用户同样也会有这样的需求。

不过当理财易真的推出之后,才看到了一些之前被我们忽略掉的东西,同类网站真的好多啊。这就是中国的真实的竞争现状。这是一个还没有被开发的市场,所有的同类网站用户都少的可怜。而且在网站开始的那段日子里,我们听到了许多的反面意见,诸如记账那么麻烦,谁会去记之类的,还有许多的冷嘲热讽,甚至来自身边的朋友。但是,我们相信,凭借我们的努力,想做成一件事情并不难。同时,我们也听到了很多支持的声音,也有了一些支持的用户。网站的访问量也从每天的几个人,增加到十几个,再到几十个,再到上百个。因为网站的发展方向,都是基于用户的意见的。尽管还没有找到有效的宣传手段,也没有一个好用的服务器,但是我们已经看到了努力所带来的回报。

许多人傻傻的追问我网站的盈利模式,是否已经可以赚钱了之类的话。Web 2.0的时代,用户利益就是网站的利益。我相信理财易是一个用户粘度非常高的网站,如果你已经成了用户每日上网的必须品,商业模式自然会显现出来。

当你跟着自己的理想准备要做一件事的时候,支撑你的是自己的理想和激情,而事情一旦开始做起来了,支撑你继续走下去的,就成了责任。理财易在所有会员的支持下一步步走起来,界面也换了几次,一切都为了力求让网站更人性化,更容易使用。每一个Bug,每一个新功能的增加,当看到会员支持的声音的时候,成就感可以弥补一切辛劳。

当你已经开始做一件事,并且不得不做的时候,就把它做好。否则,就太对不住自己了,更对不住你的合伙人。

说到如何挑选合伙人的问题,的确比较头疼,因为目前只看到了一些失败的教训,还没有看到成功的案例。活力/感染力/执行力/决断力/激情,如果能找到这样的合作伙伴,离成功就不远了。没有激情,就没有一切,没有活力,就没有效率,没有决断力,就没有竞争力,没有执行力,就没有效果。

posted @ 2007-04-22 10:47 Jason Cui 阅读(479) 评论(3) 编辑

2007年4月12日

摘要: 要求:熟悉C#语言,明确的知道面向对象/多态/重载等概念,自己写过网站,并以此为爱好。熟悉HTML语言,了解CSS,能够手工修改HTML,完全了解HTML的运作机制,(熟悉asp或PHP编程者优先)。熟悉SQL Server,知道2005和2000的区别。愿意思考,以写出最优质的代码为最大乐趣。能够接受不拖控件来写代码的方式。了解最新的互联网概念,知道SNS/Ajax/敏捷编程(极限编程)/测试驱...阅读全文

posted @ 2007-04-12 15:29 Jason Cui 阅读(951) 评论(24) 编辑

2007年3月12日

摘要: 招两个人,Asp.net,C#,Sql server。职责:对畅享网www.vsharing.com进行代码重写,性能优化。要求:敢想,敢说,敢为。愿意想,喜欢钻研,以编程为乐趣。可以没有经验,但是不能没有激情。重视团队合作,不要个人英雄主义。(四人团队合作开发)。可以长期任职或者短期工作(3-5个月),月薪4000-8000,视能力而定。有兴趣的联系jason.cui#vsharing.com地...阅读全文

posted @ 2007-03-12 14:21 Jason Cui 阅读(613) 评论(8) 编辑

2007年1月29日

摘要: 记账网站基本上分为两类,一类是封闭式的,所有账目都是隐私的。另一类是社区式的,可以公开账目,可以看看别人的钱是怎么花的。 http://www.allmoneygomyhome.com 域名很有意思,建站最早,历史最悠久的在线记账网站,还希望朝着消费指南的方向发展。不过留言板上的意见没人理。 http://www.licaie.com 理财易,界面很清爽,站长反应迅速。新增加了多用户多账本...阅读全文

posted @ 2007-01-29 20:38 Jason Cui 阅读(5365) 评论(15) 编辑

2007年1月27日

摘要: 毕业工作已经四五年了,却仍然一分钱也没有存下。工资年年涨,当年每个月拿1500块钱工资的时候,也照样活下来了,如今工资已经翻了四五翻,月月也都能花个精光。凭“月光族”这个词在网络上的流行,我相信,跟我有同样情况的人为数不少。 其实很多人对于自己做“月光族”并没有什么不好的感觉,甚至有些自豪。但是如果玩过“穷爸爸富爸爸”的现金流游戏,你就不会这么想了。首先,自然灾害是不可控的。哪天再来个类似非典的东...阅读全文

posted @ 2007-01-27 20:27 Jason Cui 阅读(154) 评论(0) 编辑