上次说到给俺们家糖糖建了一个网站,这次主要说一下建站的技术细节吧,希望对感兴趣的朋友有所帮助,大牛们请直接跳过。

建站的几个步骤如下

1 域名申请

2 空间选择

3 上传自己的程序代码并且建立数据库

4 广告申请

5 Alexa排名申请

6 备案

1 域名申请

因为我是第一次申请域名,我把碰到的问题和需要注意的事项一并记录一下,希望能对朋友们有所帮助。刚开始我想申请cn的顶级域名,网上给出的价格很便宜,一般不超过10块钱一年。可是当我打算下单购买的时候才发现cn域名的申请对个人来说几乎是不可操作,因为要求域名申请的单位以及一系列的手续,当然这也比较符合中国国情,只是不知奥运后限制会不会放宽。最后我选择了比较贵的国际域名,edong网给出的价格是68元/年,国际域名的注册没有太多的限制,很快就注册下来了。打款的时候也碰上了一点麻烦,我首先在开通了工行的网上银行,不过支付的时候总是报超出客户最大支付限额的错误,后来才知道需要到银行取办理口令卡开通才能完成,只好放弃(太不人性了,我半夜办理业务让我怎么去银行阿)。相比较招商银行就做的很不错,简单的注册就可以使用了。

2 空间选择

网络上建站有两种方式,租用虚拟主机或者服务器托管。对于个人站长,租用虚拟主机是相对经济的解决方案。我的网站http://www.basilwang.net就是租用了了edong网的虚拟主机,采用了它的k300的linux/unix解决方案,支持php+mysql,空间费用300元/年,当然也有支持.net的解决方案,而且比较便宜200元/年。这里为什么没有选用.net的解决方案,我做一下解释:就.net和php而言,我认为个人网站还是选用php更加灵活一点,而且网上php开源的东西一大把,有的已经非常稳定了。另外建议大家选择口碑比较不错的空间商,不过这方面我也没有什么经验,就不误导大家了。

3上传自己的程序代码并且建立数据库

代码方面我选用了wordpress,我之前没有任何php的编程经验,不过为了建站还是花了3天看了一部分原代码,了解了wordpress关于theme、插件还有widget等方面运行机制。不过这里提醒大家的是,wordpress已经完全能够做到一键式的安装,非常方便,没有程序开发经验的朋友也可以很快上手。当然我在阅读php代码的时候,还是有种回到asp编程的年代。

程序代码可以用上传软件如cuteftp等用提供商给的帐号上传。关于mysql,你可以建库并设置访问密码,通过phpMyAdmin进行访问,不支持类似mysql-front等第三方工具的访问。这里还要注意的是,网络提供商可能提供的是英文的编码方案,因此通过phpMyAdmin看到的中文都是乱码,不过显示都是没有问题的,只是备份还原的时候需要注意,网上有解决方案,也可以参考我接下来的文章。

4 广告申请

在写这篇文章的时候,申请的Google Adsense又一次被拒,原因是“确保您的网站已经注册6个月以上时间;”,只能等半年后再说了。相反alimama的申请到是很方便,不过希望马云所说的“电子商务的冬天”会不会影响到造福放大个人站长的alimama。最后提醒大家,单靠广告点击的收入保证网站的自负盈亏比较困难,请打算上贼船的朋友三思。我做网站的时候也考虑了这点,全当是我对儿子的投资了,呵呵,儿子不要有压力阿。

5 alexa排名

这个东西能给使你对你的网站有一个比较直观的认识,建议把网站提交到alexa以进行统计

6 备案

现在的网站都需要备案,当然这个备案目前是免费的,需要到工业和信息化部网站进行注册(原来的信息化部网站),也可以由你的空间提供商代为你注册。我个人感觉还是自己操作吧,熟悉一下流程,没有坏处。

更多内容,请阅读发表在[http://www.basilwang.net]的文章

posted @ 2008-08-29 11:46 BAsil 阅读(214) | 评论 (2)编辑

自打老婆怀孕的时候,我就琢磨着给未曾谋面的宝宝建一个网站,记录他的成长,无奈乱七八糟的事情太多,网站的事情一拖再拖。7月30日宝宝出生了,亲朋好友都希望看到他的近照,结果发邮件发到手疼,这才想起建站的事情不能在拖下去了,把宝宝的照片、我们的心情都记录下来,大家访问网站就行了,也算是对宝宝有个交代。说到网站,免费的空间限制太多,我个人不太喜欢,估计宝宝也不喜欢(随我,呵呵),咬咬牙,租了个空间,申请了一个域名,以后这里就是宝宝在网上的家了。

最后这句话是对俺家宝宝说的:糖糖,人生的路还很长,爸爸妈妈祝愿你健康快乐的成长!!

posted @ 2008-08-29 09:30 BAsil 阅读(41) | 评论 (0)编辑

tt

更多图片请访问糖糖的个人空间

http://www.basilwang.net

posted @ 2008-08-28 12:04 BAsil 阅读(18) | 评论 (6)编辑

我的儿子糖糖于2008年7月30日(农历6月28)生于山东大学齐鲁医院,体重7斤7两,记录一下。

posted @ 2008-08-28 12:02 BAsil 阅读(18) | 评论 (4)编辑
     摘要:

前几天,在园子里看了一个图片幻灯效果,很不错,不过今天想找却找不到了。这两天想把网站的图片幻灯效果给换了,原来的虽然做成了web控件,不过控件里硬编码了javascript和css,甚至还有document.write这样的输出,感觉很是不爽。偶然发现了一篇翻译文章如何使用 JavaScript 创建可维护的幻灯片效果,感觉原作者在构建可分离的javascript和css上颇有心得,不过这里和我想要的效果还有些差异,参照大部分国内网站的实现方式,应该能够实现定时的播放,同时在右下角还应该有一个序列号的指示,就像新浪网的首页那样,既然作者帮我们作了大部分的分离工作,剩下的这部分自己实现,也十分简单。

  阅读全文
posted @ 2008-07-04 13:16 BAsil 阅读(2025) | 评论 (11)编辑
我他妈的要是再看中国队的球我就是王八羔子!
posted @ 2008-06-07 21:50 BAsil 阅读(220) | 评论 (5)编辑
     摘要: 画了两张UML图,帮助理解asp.net 2.0的页面即时编译,建议结合Reflector查看
  阅读全文
posted @ 2008-06-04 21:46 BAsil 阅读(2753) | 评论 (14)编辑
最近在看《ASP.NET 2.0服务器控件与组件开发高级编程》,其中有一个以前没有注意的细节,思索了好久,还是没有答案,还请各位帮忙指点一下。
服务器控件,注意CardholderNameText是存到ViewState当中的
    public class CreditCardForm : Control
    
{
        
public CreditCardForm()
        
{
        }

        
public string CardholderNameText
        
{
            
get return ViewState["CardholderNameText"!= null ? (string)ViewState["CardholderNameText"] : "CardholderName"; }
            
set { ViewState["CardholderNameText"= value; }
        }

        
protected override void Render(HtmlTextWriter writer)
        
{
            writer.Write(
"<strong>" + CardholderNameText + "</strong>");
        }

    }
调用的页面,我放置了一个button,以便观察Postback的值是否发生改变,另外设置了CardholderNameText属性
   <form id="form1" runat="server">
    
<div>
       
<custom:CreditCardForm CardholderNameText="Full Name(Initialize)" runat="server" ID="creditcardform" />
        
<asp:Button ID="Button1" runat="server" Text="Button" /></div>
    
</form>
调用页面的后台代码,很简单
void Page_Load(object sender, EventArgs e)
  
{
    
if (!IsPostBack)
    
{
      creditcardform.CardholderNameText 
= "Full Name(After Postback)";
    }

  }
在页面第一次请求的时候,执行aspx编译生成的Page子类的AddParseSubObject,将控件加入到Controls集合中,并设置了CardholderNameText的值为"Full Name(Initialize)",由于是第一次加载在Page_Load中修改了值为"Full Name(After PostBack)",到这里没有问题。
当我点击button提交,第二次请求页面时,我在调试器里发现再一次设置了CardholderNameText的值为"Full Name(Initialize)",但是页面却显示Name(After PostBack)",不知道怎么回事。
我怀疑是和Page的AddParseSubObject有关,因为它是在整个生命周期的最开始执行,会不会是此时的ViewState还没有生效?希望能给与解答!!谢谢
源代码附上CreditCardForm
原因:
结果和AddParseSubObject无关,原因实际很简单,怪自己看得不仔细,乱扣帽子,引用wit的回复
回传时,第一步任然解析html,并且设置CardholderNameText为:Full Name(Initialize),此时 视图里的值也为这个,因为该属性保存在视图里。

下面就是重载视图了,会根据客户端form请求的值,重新加载视图状态,
这时就把第一次访问后的视图值加载过来(将Full Name(After Postback))

所以就是你的结果了···
posted @ 2008-05-20 11:34 BAsil 阅读(804) | 评论 (6)编辑
     摘要: Linq to sql给我们的orm影射带来了极大的便利,实体类写很少的代码就可以完成数据库表的增删查改,也使我们能够更加专注于业务逻辑;而Xml的应用也是相当广泛,如今的SOA很大程度上是利用了Xml格式的SOAP消息来进行交互。有的时候我们会碰到需要读取xml保存到数据库的情况,在没有Linq的时候,可能我们会通过XmlSerializer的Deserialize方法来反序列化Xml生成相对应的net class,然后操作net class插入数据库,如果不采用orm的话,代码量和利用XmlDocument直接操作Xml更新数据库没有什么差别,那么现在有了Linq to sql,反序列化的net class和Linq to sql的Entity可以优雅的结合到一起,看看减轻了我们多少的工作量?  阅读全文
posted @ 2008-04-25 10:43 BAsil 阅读(2012) | 评论 (10)编辑
     摘要: 折腾了近两天,这个500的问题终于解决了,我都快崩溃了,我的笔记本是xp sp2,vs2005 vsts,sql2005 dev,biztalk en r2 eval版,作了Adapter Useages的HTTPRequestResponse个例子,在http://localhost/RequestResponse/default.aspx中点击提交按钮,正常的应该是调用http adapter返回response 可是却报500的错误,网上关于这个问题的帖子很多,但是解决方案就是那么几种,转过来转过去的,没有什么帮助,并且大都是window 2003 iis6的解决,我在window 2003 iis6下测试没有问题。下面我把我的解决思路整理一下,问题到最后解决很简单,就那么一下子,但是我却走了不少弯路,希望以后碰到问题的时候能够尽快地定位到错误点。
  阅读全文
posted @ 2008-04-16 16:25 BAsil 阅读(1256) | 评论 (7)编辑
     摘要: 暂时放到首页,希望dudu看到,如有不妥,可以撤下。
用手机浏览博客园已经有一个多月了,感觉好像已经成了生活的一部分,习惯了每天晚上睡觉前捧着我的Treo 650看上几篇博客,Palm宽大的屏幕,配上细腻而柔和的背光,看上几个小时都不觉得累,那感觉真是不错。呵呵,扯远了,说说我认为手机版博客园需要改进的地方吧(优点我就不说了,太多了)。
  阅读全文
posted @ 2008-03-22 22:39 BAsil 阅读(2404) | 评论 (21)编辑
     摘要: 我下载了源代码,却发现总是无法调试。后来偶然发现VS2005的输出窗口显示“不包含源服务器信息”,我仔细比对了网上提供的三个step,检查了VS编译器的设置,发现了问题。我的设置Debugging->General->Enable Just My Code(Managed Only)为选中,而网上的图例未选中。修改了这个设置后,发现可以正确的调试源代码了。
不过我认为应该把这个细节强调一下,毕竟不是每个人都熟悉vs05的,我工作中一直用vs03,vs03中没有这个选项。

  阅读全文
posted @ 2008-03-22 21:53 BAsil 阅读(2297) | 评论 (3)编辑
在CS 2.0下,使用了大量的Ajax来提高用户体验,比如AjaxPager来实现无刷新翻页,以后有时间会把AjaxPager讨论一下。
大家可能知道,在CS里面,登录是专门放到一个页面来处理的,当点击首页时,跳转到登录页面。这样做的好处是逻辑比较清楚,代码比较简单。但缺点是每次登录完后需要重新跳转到首页,增加了用户的等待时间。而我们在二次开发的过程中,很多时候希望在首页上直接有登录的区域,类似很多门户网站的操作,但是又不希望每次登录都PostBack,这样的话采用了Ajax。下面是我开发的登录控件的过程,另外由于我现在工作的环境主要还是framework 1.1,所以开发的这个登录控件也可以在1.1环境下使用。
先说一下开发的思路,由于原来CS的登录也是做成了控件的形式,通过AnonymousTemplate和LoggedInTemplate模版来配置登录时和登录后的页面,在后台完成相应的代码,也就是和Asp.net 2.0里的登录控件差不多(2.0里面简单看了看,可能比较类似)。因此改造登录控件时,我也希望延用这种方式,再把Ajax加上去。
其实在之前我也写了一个基于CS的登录控件,但是感觉不够模块化,那个控件采用了Ajax的Anthem第三方开源控件,但是正如上一篇文章CommunityServer 2.0中的Ajax和Anthem比较提到的,由于只有标识为UpdateAfterCallBack=true的控件才能够完成无刷新更新,如果页面的控件比较多,而且Asp.net控件和Anthem控件堆到一起时,代码非常的乱;另外Anthem的脚本会自动生成到aspx页中,个人感觉不便于缓存,而且如果首页上只有登录控件使用Anthem,也会生成大量的Anthem脚本文件,很是不爽。而CS2.0的Ajax,给人感觉代码比较简洁,有的时候也比较灵活。因此采用了CS 2.0的Ajax来完成,重构后的登录控件和页面耦合度更低,可以放置到各个页面而且不需要修改代码,另外可以通过Template来更改布局。
下面来看一下代码:
AjaxManager.cs这是CommunityServer中用来封装Ajax的一些代码
global.js CommunityServer中实现Ajax_CallBack的脚本
TemplateWebControl CS中用来实现皮肤调用的基类,在CS中只要有类继承此类,就需要有对应的皮肤
Login.cs 继承了TemplateWebControl,相当于一个容器
LoginView.cs 这里为了方便,直接继承了Panel,但是参考原有CS的实现,使用了ITemplate
AnonymousUserCtrlComplex.cs 匿名用户看到的内容
RegisteredUserControl.cs 登录用户看到的内容
这里着重看一下LoginView的部分代码
[PersistChildren(false), ParseChildren(true)]
    
public class LoginView : Panel,INamingContainer
    
{
        
protected override void OnInit(EventArgs e)
        
{
            
base.OnInit (e);
        
            AjaxManager.Register(
this,"Login");
        }


        
public LoginView()
        
{

        }

        [AjaxMethod(IncludeControlValuesWithCallBack
=true)]
        
public string ValidUser(string user,string password)
        
{
            
//CommunityServer.Components.User userToLogin = new CommunityServer.Components.User();
            string redirectUrl = null;
            
            
if(user=="admin" && password=="admin")
            
{
            
                FormsAuthentication.SetAuthCookie(user, 
false);
            
            }

            StringWriter stringWriter 
= new StringWriter();
            HtmlTextWriter htmlWriter 
= new HtmlTextWriter(stringWriter);            


            
this.Controls.Clear();
            
this.ChildControlsCreated=false;
            
this.Page.DataBind();
            
this.Render(htmlWriter);

            

            
return stringWriter.ToString();
        }

        
public override void DataBind()
        
{
            
this.EnsureChildControls();
            
base.DataBind ();
        }

        
protected override void CreateChildControls() 
        
{
            
this.Controls.Clear();
            
this.ChildControlsCreated=false;
            ITemplate template  
= null;

            
if(!Context.User.Identity.IsAuthenticated)
            
{
                template 
= AnonymousTemplate;
            }

            
else
            
{
                template 
= LoggedInTemplate;                
            }


            
if(template != null)
            
{
                
//basilwang 2008-02-26 没有采用原有CS增加Control的方式,而保持AnonymousTemplate的Parent为LoginView
                
//Control cntrl = new Control();
                
//template.InstantiateIn(cntrl);
                template.InstantiateIn(this);
                
//this.Controls.Add(cntrl);
            }

            
        }

        
        [
        Browsable( 
false ),
        DefaultValue( 
null ),
            Description( 
"TODO SkinTemplate Description" ),
        PersistenceMode( PersistenceMode.InnerProperty ),
        ]
        
public ITemplate AnonymousTemplate 
        
{
            
get {return _anonymousTemplate;}
            
set {_anonymousTemplate = value;}
        }

        
private ITemplate _anonymousTemplate;

        [
        Browsable( 
false ),
        DefaultValue( 
null ),
        Description( 
"TODO SkinTemplate Description" ),
        PersistenceMode( PersistenceMode.InnerProperty ),
        ]
        
public ITemplate LoggedInTemplate 
        
{
            
get {return _loggedInTemplate;}
            
set {_loggedInTemplate = value;}
        }

        
private ITemplate _loggedInTemplate;

    }

 注意AjaxManager.Register的注册时间,是在生命周期的最开始Init完成的
 另外对于CallBack的函数一定要加上[AjaxMethod(IncludeControlValuesWithCallBack=true)]
 那么对于回调生成的html,这里我向老赵学习,尽量通过framework生成规整的html,当然这里也费了我很多的时间
 由于采用了模版ITemplate,而模版在AddParsedSubObject的时候只是add到Control集合当中,注意此时并没有调用模版的CreateChildControls方法,那么什么时候这些方法会被调用呢,我开始一直认为是在Page的PreRender,但是通过Reflector发现Page的PreRenderRecursiveInternal在执行完this.EnsureChildControls()后(此时还没有递归调用他的子控件的PreRender),紧接着处理 this.OnPreRender(EventArgs.Empty);但是由于我们的Ajax方案是在PreRender时候即返回了结构,所以总是得不到Template的值。后来我使用了DataBind(建议大家在使用模版ITemplate时,别忘了DataBind这个好用的方法),因为DataBind()有一个递归EnsureChildControls()方法,可以帮助我们把所有的子控件都给创建出来,最后的事情就比较简单了,Render出来就可以了。
 另外在WebForm1.aspx页面上一定要加

{
            
//base.VerifyRenderingInServerForm(control);
        }

 防止CallBack时框架验证是否包含在服务器端Form中,这也是我觉得不爽的地方

asp.net1.1源代码附上LoginAjax.rar,asp.net 2.0下面也可以用,做一下转换即可
posted @ 2008-02-26 01:31 BAsil 阅读(2081) | 评论 (4)编辑
     摘要: 在园子里面的兄弟为aspx和mvc的争论不休的时候,由于工作的关系,我还在用着可怜的framework1.1,我没有使用过Asp.net ajax(1.1不支持),所以这里我把CommunityServer 2.0中的Ajax和Anthem作一下比较;当然也是为我的下一篇文章基于CommunityServer 2.0二次开发之登录控件做一个铺垫,稍后奉上。
  阅读全文
posted @ 2008-02-25 22:05 BAsil 阅读(2424) | 评论 (10)编辑

最近总是感觉电脑不大正常,可是瑞星杀毒总是不抱错,瑞星防火墙偶尔会报出一串数字命名(位数不确定)的exe文件试图访问网络。从网上搜了一下,很多都是说8位的数字病毒。可是我的数字exe文件有的时候是11位有的时候是12位,另外Windows的Temp文件夹下还有很多4位的exe文件。前天晚上怒了,自己跑到安全模式system32下杀文件,看着不顺眼的就干掉,结果杀红了眼,不小心把几个后缀名是nls的文件给杀掉了,结果导致机器无法启动,害得我只好用ERD Commander配合Recover4all将误杀文件恢复,真是郁闷。
昨天晚上,在用sreng扫描进程模块信息时,发现好多进程下面都关联了两个动态链接库udbajj.dll,systen.dll,在网上搜了一下,关于systen.dll的内容不少,确定是一个木马,udbajj.dll网上没有介绍,不过我在system32文件下找到udbajj.dll文件时,可把我惊出一身冷汗,我找到一个udbajj.key的文件,打开一看,我所有的键盘操作包括运行的软件全部被以名文的形式记录下来,另外发现和systen.dll相关的也有几个日志文件,不过都加密了,估计也不是什么好东西。另外我发现系统被木马建立了四个以$打头的管理员权限的帐号,晕倒。


我用PowerRmv强制将这两个文件粉碎掉,把注册表里的相关信息全部杀掉。这样随机生成的访问网络的数字exe文件也不再生成了。
另外我也发现了删除autorun病毒的方法,把每一个盘符下面的autorun.inf文件和msn.exe文件都用PowerRmv粉碎,然后找个autorun的金山专杀禁止硬盘的自动运行,就ok了。

posted @ 2007-12-01 11:11 BAsil 阅读(568) | 评论 (0)编辑

TREO 650买回来已经三天了,试用了N多的软件,重起了不下五十次,现在基本成长为一名合格的初胖了。下面把我的一些经验教训给大家总结一些。
1 有天突然发现浏览器和快速学习都造成重起,通过#*377发现报Blazer错误,可能快速学习调用了Blazer,百度一下发现很多帖子都描述其和Clipro造成重起,可是我的Clipro用uninstall确
却无法删除,总是报数据库已经打开,用Resco Explorer可以在Plam-dm下发现该文件正在使用,仍无法删除,后来发现通过Mcfile可以删除。删除后问题解决。
2 我的胖子设置Ringo的Mp3铃声重起,无奈安装Mring,正在测试稳定性。安装了Hi-launcher,无奈打开菜单时重起,现在用Dalauncher。

3 用Tcpmp播放电影时经常卡,并报Out of memory错误。后来安装DBcachetool,问题解决
4 我在安装了Dbcachetool系统变得很慢,每打开一个程序都执行一次。没办法关闭自动清除,装了一个Dbcacheda,手动执行。

以上为在Treo的记事本写的,有空把其他的心得一块补上来。这几天得抓紧工作了,让treo折腾得够呛,电脑都中了一个down(0).exe的病毒,还没杀掉呢。

posted @ 2007-11-07 22:29 BAsil 阅读(185) | 评论 (5)编辑

最近发现服务器总是不工作不正常,cygwinsvr.exe进程cpu占用率过高,因为cygwin装上去以后就没有用过,打算将其删除,可是找了半天没有找到卸载程序,这时才想到毕竟是*nix移植过来的程序。好容易在网上发现的卸载需要在cygwin shell下运行,执行以后报可能存在多个Cygwin1.dll。搜索了一下发现安装的OpenSSH下面还有一个Cygwin1.dll,停止Opensshd服务,删除Cygwin1.dll。执行Cygwin Shell,问题解决,cpu占用率恢复正常。

posted @ 2007-10-27 11:19 BAsil 阅读(512) | 评论 (0)编辑

项目开发一直采用的是vs.net+vss,可是vss只支持局域网。最近总是跑来跑去,开发起来很麻烦,希望能有一个远程的源代码管理器可以简化开发。cvs的一套早就听说过了,可是一直担心不能和vs.net好好的整合。今天突然有个念头,为什么非要整合阿--两个独立起来,cvs负责源代码管理而vs.net专注开发不是更好吗?

花了一个晚上搭建了一个cvsnt + wincvs环境,还算比较简单,碰到的问题也都解决了,不过还是列一下

1.wincvs需要首先安装pathon和tcl,其中pathon版本不能高于2.2.3,而tcl我用的是tcl832.exe,另外pathon需要配置一下环境变量

2.wincvs 1.3中文版设置CVSRoot的路径要求采用unix方式,刚开始采用E:\XantalServer\XantalServer4CVS,报no such repository,后改为/XantalServer/XantalServer4CVS,问题解决

今天就到这里了,明天看看把vs项目的源代码添加进来,不知道还会碰到什么问题,先不管他了。

 

ps 我就是那匹叫做春丽的马

posted @ 2007-10-10 22:43 BAsil 阅读(299) | 评论 (0)编辑

最近总是感觉比较累,这学期的带的班又比较多,每天晚上回到家一点力气都没有,只想睡觉。项目的一部分需求总是定不了,Coding的时候总是没底。学习的干劲也不是很足,从当当网买的《代码大全》还扔在那里没看呢。现在想象,前段时候忙起来真的是很充实阿,希望这一篇博客能让我重新回到原来的生活中,吼吼,怀念一下。

 

打算最近看一下代码大全,不过能从里面学到什么,看看书评可是挺玄的。

Code Complete, Second Edition
by Steve McConnell

Read more about this title...

打算买一个二手的treo 650,不过在斗争了两三天以后决定放弃了,贴一个图片,以此纪念。

posted @ 2007-09-14 10:25 BAsil 阅读(54) | 评论 (0)编辑