• 2009-07-19

    分布式的 twitter 模式

    twitter 被和谐,饭否被自杀,令人唏嘘。 如果有一种分布式的 twitter 模式,实现:

    1. 每个用户搭建自己的 twitter 服务器,用户作为即时消息独立发布源
    2. follow 动作成为在用户的 twitter 服务器建立 follower/following 的列表
    3. follow 动作完成后,自动开始从 following 的个人用户服务器同步(rss、webservice 或者其它一切有效同步数据的方式)已经发布的即时消息

    好处:

    • 用户可以自己管理自己的即时消息
    • 采用同步的方式,follower 多的个人服务器的镜像消息就多
    • 即时消息源和谐不尽,不至于发生某个即时博客服务提供商(例如饭否)挂掉而使得全体用户无法发布消息

    缺点:

    • 用户都要自己架设和维护一个自己的服务器,增加了技术门槛
    • 同步消息的机制消耗更多的网络资源
    • 消息搜索的实现难度增加

    belltoy同学说,以后每个人的手机都可以作为一个 webserver,这个模式还是存在可行性的。如果能够将现有的模式结合起来呢??

  • 2009-02-15

    一个IE6下css无法正常解析的问题

    一个asp.net网站上线

    结果发现在ie6下一些css样式显示不出来,无法解析

    后来看了这篇帖子:http://article.pchome.net/content-786234.html

    把style.css里的汉字注释全部删了

    结果就搞定了……

     

    visual studio中貌似没有一个地方可以统一设置文件保存的字符编码
    没有汉字的是ANSI,有汉字的会自动保存为UTF8
    这样就很容易会因为字符编码不统一而出现莫名其妙的问题

    据Belltoy说: 微软的整个系统都不统一,默认其实中文是GBK,有的地方又是GB2312,最近开始用UTF-8

    linux下只要一个环境变量,所有的都能统一了
    belltoy@belltoy-laptop:~$ locale
    LANG=zh_CN.UTF-8

     

    用VS的开发的兄弟们借鉴下。。

    编码很重要,不要以为平时没碰到问题就不care

    等碰到了莫名其妙的问题就完蛋了……

    Tag:
  • 2009-01-07

    ascx + wrapper page + jQuery的Ajax解决方案 - [asp.net]

    Guide

    本篇说明 ashx + jQuery, a lightly ajax solution of asp.net 提到的 ajax 解决方案之五。
    首先,请理解什么是 wrapper page。
    wrapper page 是定义的一种专门用来包装用户控件 ascx 的 webform,wrapper page 的 Render 方法被重写(override),仅 render 它的 UserControl 成员。这样,我们就可以通过 ascx 输出干净的 html 片断。是的,我们的目标就是输出干净的 html 片断


    实现方法

    目标明确了,思路有了,现在让我们来实现吧~
    很简单:写一个 Wrapper Page Base,作为所有 wrapper page 的基类,以后的 wrapper page 都从它继承。这个类(WrapperPageBasel类)继承自System.Web.UI.Page类,他只要做两件事情:

    • 拥有一个 UserControl 成员
    • 重写父类(Page)的 Render 方法

    那么我们在重写的 Render 方法里执行 UserControl 的 Render 方法即可。请看代码1)

    /// <summary>
    /// Ajax包装页面基类
    /// </summary>
    public class WrapperPageBase : System.Web.UI.Page
    {
        public UserControl control { get; set; }
     
        protected override void Render(HtmlTextWriter writer)
        {
            if (control == null)
                control = (UserControl)this.LoadControl("~/Controls/dummy.ascx"); // 一个dummy,null时输出server error..之类的信息
     
            control.RenderControl(writer);
        }
    }

    Wrapper Page继承自WrapperPageBase类:

    public partial class Ajax_Test : WrapperPageBase
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            this.control = (UserControl)this.LoadControl("~/Controls/any.ascx"); // 有用的用户控件           
        }
    }

    在页面中,使用jQuery异步调用。参看ashx + jQuery, a lightly ajax solution of asp.net 的实例。
    你的页面只需要一句话:

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Ajax_Test" %>

    其余都可以删除。——当然,你也可以不删除,你会发现哪些代码不会出现在页面上。你还可以在同一个 Wrapper Page 里来切换 UserControl,只要判断下query string,像这样:

    protected void Page_Load(object sender, EventArgs e)
    {
        var str = Request["Want"];
        if(str == "IWantA")
          this.control = (UserControl)this.LoadControl("~/Controls/A.ascx"); // 用户控件A           
        else if(str == "IWantB")
          this.control = (UserControl)this.LoadControl("~/Controls/B.ascx"); // 用户控件A
        else 
          this.control = (UserControl)this.LoadControl("~/Controls/WhatDoYouWant.ascx"); // 用户控件WhatDoYouWant
    }

    至此,这个解决方案就完成了。


    为什么要这么做?

    事实上,我们不用 WrapperPageBase,不用重写 Render 方法,简单地把 webform 里的 html 代码全部删掉,再换上我们现在放在 ascx 里的代码,这样也可以达到输出 html 片断的效果。但是为什么要这么麻烦????
    理由如下:

    1. 你不用删除 webform 里的那些代码
    2. 你可以不用修改,使用现成的 ascx
    3. 机制是透明的,你只需要 LoadControl
    4. 最后,你完全可以在同一个 webfrom 里根据不同的 query string 来输出不同的 html 片断 —— 哪怕这些片断毫不相干!神奇吧!
    1) 代码里指定了一个 dummy,当 dummy.ascx 的内容为空,或者不指定 dummy 时,HtmlTextWriter 会显示一个没有内容但是完整的 html 页面,它不是我们要的 html 片断
    Tag:asp.net ajax
  • 2009-01-04

    ashx+jQuery,一个轻量级的asp.net ajax解决方案 - [asp.net]

    shotdog老师研究探讨了下asp.net里,除官方庞大asp.net ajax之外的ajax解决方案。我们想法是以不同的服务器端方式输出,然后在页面使用jQuery的ajax实现调用服务器端几个解决方案:

    1、使用一般的webform,在页面用jQuery ajax调用,再从取得的html数据中取得<body>内的内容,写入DOM

    优点:不用改变现有的asp.net开发模式,可以使用现成的页面;ajax取得的内容是html文本,直接写入DOM即可
    缺点:内容浪费,<body>之外的内容都不是必要的,而且如果使用了MasterPage那就。。。

    2、使用一般的webform,但是用Response.Write()控制输出html,在页面用jQuery ajax调用,将获取的内容写入DOM

    优点:内容干净,不浪费;ajax取得的内容是html文本,可以直接写入DOM
    缺点:需要在服务器端以字符串形式构造html文本,编程不方便,不容易调试和维护

    3、使用一般的webform,用Response.Write()控制输出json数据,在页面用jQuery ajax调用,将json数据在客户端加工成html后写入DOM

    优点:仅仅交换json数据,极干净,符合高效的web设计理念
    缺点:需要在客户端加工json数据,并且对DOM造成入侵

    4、使用asmx,封装成web service,用jQuery ajax调用asmx的内容,将json或者xml数据在客户端加工成html后写入DOM
    优点:仅仅交换json或/xml数据,非常干净;web service易于跨平台
    缺点:需要在客户端加工json数据,并且对DOM造成入侵

    5、使用自定义控件ascx,然后使用专门的webform页面做wrapper(包装)在页面用jQuery ajax调用wrapper webform,将html数据写入DOM

    优点:webform仅仅用作wrapper,根据不同的请求参数可以在wrapper中动态使用自定义控件;自定义控件输出的是html文本,可以直接写入DOM;编程方便,有VS2008代码感知支持,易于调试和维护
    缺点:跟传统的webform编程理念不一样,弱化了webform的作用

    以上就是讨论的几种可行的方案——不管是asp.net webform方式还是asp.net MVC方式,都是可行的。
    昨天晚上又发现一种方案:使用ashx+jQuery .ashx是一个专门的用于处理HttpHandler的文件类型,用来处理自定义Http请求,可以在web.config定义运行时针对ashx的Http请求处理方式。

    <add verb="*" path="*.ashx" type="System.Web.UI.SimpleHandlerFactory" validate="false" />

    这样我们就可以用SimpleHandlerFactory来处理ashx的http请求了。在ashx的类中实现IRequiresSessionState接口,using下System.Web.SessionState就可以使用Session了,很方便

    using System.Web.SessionState;    
    public class checkCookie : IHttpHandler ,IRequiresSessionState
    {  
        ...  // todo somthing
    }

    实例:使用ashx+jQuery实现Email存在的验证
    .ashx文件
    <%@ WebHandler Language="C#" Class="CheckUser" %>

    using System;using System.Web;  
    public class CheckUser : IHttpHandler
    {
         public void ProcessRequest (HttpContext context)
        {      
               context.Response.ContentType = "text/plain";
               context.Response.Write(UserRule.GetInstance().IsUserExist(context.Request["Email"]));
        }
         public bool IsReusable
        {
            get {
                return false;
            }
        }
    }

    html:
    <input type="text" id="email" />
    <input type="button" value="test" onclick="check_email()" />

    js:
    function check_email()
    {
        var email = $("#email").attr("value");
        $.get("../ajax/checkuser.ashx",
        { Email: email },
         function(data)
         {
            window.alert(data);
          });
    }

    simple的,显然效率会比较高。不过simple的就只能够做点simple的事情。如果要输出html,还是不太方便。如果要输出html的话,我还是比较倾向于用ascx处理内容,webform做包装所以ashx+jQuery应该算是是一个asp.net里轻量级的解决方案
    Tag:asp.net ajax
  • 2008-12-14

    asp.net不使用ViewState和服务器控件 - [asp.net]

    做过asp.net mvc之后发现,一般的asp.net服务器端控件实在是慢

    页面刷新延迟感觉也很严重

    影响速度的地方:

    1、服务器控件编译

    2、ViewState

     

    于是:

    1、禁用掉ViewState

    2、用HTML标签

    3、页面数据直接用<% %>来控制【参看asp.net mvc或asp】

    4、post值传递通过Request["somename"]来实现

    例如:一个<input name="pureClient" type="text" value="<%= AnyValue %>" />

    submit之后在服务器端:Request["pureClient"] 就可以取到它的值啦! 

    :)

     

    结论:

    1、不用ViewState来保存/恢复控件状态,可以提高页面加载速度

    2、不用ViewState可以提高页面传输速度

    3、不用服务器控件可以提高页面编译速度(html标签不需要编译)

    4、没有服务器控件和ViewState我们仍然可以编程

    5、以后尽量不用ViewState,它让我们不了解Web机制,“那是欺骗新手的”--小黑语

    6、我找到继续使用asp.net的方式了,很开心 :)

    Tag:asp.net
  • 2008-09-01

    即时博客插件想到的一些

    即时博客的产品很多了,之前还给印度三哥的Kwippy.com做过推荐,最近他们更新很多,不过还没做到twitter和国内的叽歪,饭否的程度.夏老师甚至还和三哥"信交"过几次,逐一介绍了区别.刚才搜索了一下,发现国内其他博客也关注介绍了.

    缘于想更新博客的侧栏,因为twitter最近抽风,不能正常显示,我登录也比较麻烦,于是在选择饭否和叽歪的时候产生了一些看法.

    饭否不仅是我第一个知道的国内即时博客,同时因为他们的创业团队中有几个福建龙岩人,是老乡,更从boss那了解到郭万怀美眉的经历,一直都有在使用; 叽歪的创业人是大话西游原来的站长,技术实力毋庸置疑.

    两者的插件设置,在png图片格式选择上没有太大的对比,只是和各自的风格一直,使用了统一色调,相对饭否的蓝色,叽歪的暖橙显得更具活力.

    饭否 - png - 侧栏

    饭否 - png - 签名档

    叽歪 - png - 侧栏

    叽歪 - png -签名档

    同时叽歪还提供了原始的版本.

    关键在于flash形式插件上的设置,叽歪比饭否有更多"自定义"功能,主要在于颜色设置方面.

    饭否 - flash

    叽歪 - flash

    从信息浏览的角度来说,饭否的更能让人一目了然,显示范围是完整的宽度,而叽歪的头像占用了20%左右的宽度,这就增加了侧栏的高度,或者产生了滚动条,在阅读方面显然是更不方便的,即便是选择小头像.

    但是叽歪的侧栏flash插件能够自定义背景,文字的颜色,用户可以根据博客的风格来自定义,使得插件和博客页面浑然一体.但饭否的冷蓝色虽然不能调整颜色,但在色调上也不会和其他颜色产生太大的冲突.

    叽歪的一直在强调创新,而关于饭否的一些"雷同"文章不少,叽歪能坚持自己的想法是很值得赞赏;同时他们两家都获得了投资并且运营得不错,是我最羡慕的,将想法运营成了产品.

    最后我选择了饭否的插件.

    不过有个建议,除了flash格式外的,png格式如果也能自定义一些颜色,选择范围会更大.

    另外,叽歪的插件上头像更新速度比较慢,我都换成我自己的"猪头照"了,但显示的还是最初的"卡纳瓦罗".

    用户设计和体验是很"玄"的东西,我没特别的经验,只能说说使用中碰到的想法.

    饭否上会有更新,这样我的博客也就即时更新了.

    Tag:UI UE
  • 2008-08-27

    用户邮件地址验证的实现

    配合我们简化的登录/注册模式

    需要实现Email认证用户帐号的功能(验证注册Email是否有效)

    实现方案如下:

    1、a) 用户注册成功后,发送验证邮件

        b) 未及时验证Email的用户在页面上点击验证Email的按钮,发送验证邮件

    2、邮件包含一个认证注册Email的链接,链接包含特定的加密参数

    3、链接的加密参数*由用户唯一标识(用户名或者用户序号)加密生成 **

    4、用户打开邮件Email的链接时,将接收到的参数解密还原,并解析出用户标识

    5、完成用户帐号验证(Email有效)

     

    * 如果有必要(比如系统要求三天内验证有效),加密的参数可以加入时间戳

    ** 可使用的加密算法很多中,我们拟采用Base64加密(参看.net中System.Security.Cryptography类的使用)

                          -- by allentranks@AMP_Team

  • 2008-08-12

    简化的登录/注册模式

    为避免用户注册繁琐的步骤

    参考moodle的登录/注册模式

    我们将试用一种简化的登录/注册模式:

    1、使用Email作为登录用户名

    2、无注册入口,首次登录Email自动为其注册,并保存密码

    3、首次登录时的密码和验证链接发送到登录的Email地址,以利于用户备份和验证用户

    4、详细资料可以留给用户日后完善

     

    FAQ:

    1、为什么要做这样的简化?

    答:注册很麻烦不是吗??我们要的仅仅是一个用户标识而已

    2、忘记密码怎么办?

    答:第一次登录的密码会发送到您的邮箱。同样,每次修改的密码都会发送到您的邮箱。如果必要,您还可以随时要求我们将密码发回您的邮箱。所以,就算您一时忘记密码,您仍然可以很方便地找回您的密码。 当然,你首先得有个可用的电子邮箱 :)

    3、我的电子邮件地址被他人使用了怎么办??

    答:很简单!密码永远在你的电子邮箱里!!

    4、要是我的电子邮箱被盗了,密码丢失了怎么办??

    答:不用担心,您的电子邮箱服务提供商会提供有效的途径帮助您找回电子邮箱和密码。您所需要做的仅仅是选择一个好的服务提供商 :)

     

    关键点:

    1、用Email做登录用户名

    2、设计一种方便的密码找回机制

    3、仅适合于简单的登录系统,例如小型社区等不需要详细身份信息的地方