laifangsong's blog

取长补短,精益求精。 (打个广告,想做手机网站和asp/asp.net网站的可以跟我联系.QQ:25313644)
posts - 51, comments - 187, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2007年4月14日


问题如上,
点文字链接到本页面,Request.Referrer是可以获得url来源地址的,但点击flash内的链接到本页面,就获取不到了。

不知道有没解决方法,谢谢!

posted @ 2007-12-17 12:31 laifangsong 阅读(246) | 评论 (3)编辑


以前在网上看到:“要想成为老总,从现在起马上就要注意观察老总是怎么做事,做人的”

想想很有道理,的确,一个人进步最快的途径就是向高手学习,模仿什么样的人,以后很可能就能成为这种人。

但也不是光模仿,模仿+吸收精华思想+创新 才是成功之道。

一个多月的观察,发现老总工作、分配任务等暗含着以下思想:


重视思想,别太在意特定的工具

需求核心
 提炼出核心需求(验证可行性)->陆续添加其余功能(边加边单元测试)->最终集成测试和压力测试


分组
 职责(人/人),相似功能分开(两个文件)
 将task过程中的邮件也一起发到评论中
 报告中一组的整理在一起

最小化
 任务时间能短尽量短,简单的任务能完成的尽快finish
 分配权限较细 
 没有修改的文件一定不要check out
 
交接
 文档更替,一定要有成果记录
 提供接口
 请假等

持续改善
 有可能升级的软件,经常做 code review
 对每天的行为跟前一天对比,有什么差异
 日报由30分钟改为20分钟

统一
 做统一的标准,严格遵守(例:文件名,编码规范)
 统一utf-8编码

参照
 内部开发使用task 2007,再不断发现问题,更新版本
 做规范时,参照之前或别人做好的规范

预计
 考虑将要开发的东西,先想设计思路,不要求立即编码
 安排时间时,对正在做的东西,要设定个目标,要有个预估时间,要有时间限制

交替
 互相code review 对方的代码
 交替写测试文档规范

公用
 基类
 写文档时,整理出公用的元素:背景色,间距,宽度以及其他格式等

优先级
 上班最合适时间做最重要的任务,跟公司无直接关系的应放在下班做

敏感
 修改一处,测试全部
 bug多时,多做开发;少时,多做测试
 及时接受邮件,查看消息,及时回复
 
 


 


 

posted @ 2007-08-29 12:38 laifangsong 阅读(143) | 评论 (1)编辑


在csdn数据结构看到个热门帖子,奶牛问题:
一只刚出生的小牛,4年后生一只小牛,以后每年生一只。
现有一只刚出生的小牛,问20年后共有牛多少只?

我算出来的是345只,跟答案一致。

用递归写了下算法,自己感觉挺不好理解的。不知道有没有不用递归的算法,或者递归程序写的比较好理解的。
以下是代码:

        private int StatCount(int year)
        {
            
int bornCount;
            
if(year<4)
            {
                bornCount 
= 1;
            }
            
else
            {
                
int sum = 1;
                
for(int i=4; i<=year; i++)
                {
                    sum 
+= StatCount(i-4);
                }
                bornCount 
= sum;
            }
            
return bornCount;
        }

posted @ 2007-08-07 12:09 laifangsong 阅读(285) | 评论 (6)编辑

     摘要: 去网上搜c#邮件发送程序时,基本找到的都是零散的函数,没做封装,有的连异常处理都没有;能用的调用起来也不太灵活方便,所以,特地做了个封装。代码中如果有错误,欢迎指正。以下是程序:usingSystem;usingSystem.Web.Mail;usingSystem.Collections;namespaceAsai.Mail{/**////<summary>///C#邮件发送类V1....  阅读全文

posted @ 2007-07-28 14:04 laifangsong 阅读(900) | 评论 (7)编辑


今天明白了几件事。

1。在公司或朋友之间,应该积极主动没错,但不要没有安排、不考虑自己能力能不能做到的情况下随意揽事来做,这样事情如果做不好,被人责怪;做的好,也不会特别感激(虽然不是想要那份感激)。如果因为这样破坏了自己的安排,占用了很多时间,更是得不偿失。

2。对别人给于的帮助、肯定、甚至一个微笑,都应该报有一颗感恩的心。

3。在公司里,做事的同时,更要懂得怎么做人。做事的能力是前提,但做人做不好,很难有做事或者提升的机会。做事规规矩矩,做人多留意、多揣摩、洒脱一些,在公司内才好立足。

posted @ 2007-06-14 11:28 laifangsong 阅读(138) | 评论 (0)编辑


明早要去一家日本人开的公司(亚才信息技术(福州)发展有限公司)应聘C#程序员,公司在福州软件园内,新开不久,主要做日本外包业务。

我毕业两年,熟悉 .net(c#)和asp环境。

听说日本人很不喜欢面试的人迟到,还听说他们面试人不太一样,通常会弄什么智力测试之类的,不知道有没这回事。

有知道这个公司的朋友(福州),麻烦留言下,简单说下这个公司基本情况,面试时需要注意的问题或者面试前要做哪些特别的准备。
如果你有在日本人公司做过,也请留言下。

期待你的回复,谢谢。。:)




posted @ 2007-06-07 14:59 laifangsong 阅读(679) | 评论 (11)编辑


很多时候用JMail发送邮件一直出错,常见原因有:
1。发送邮件服务器地址写错。如果用 163邮箱来发送,服务器地址应当写成 smtp.163.com
2。很多发送邮件服务器需要验证邮箱登录名(例:laifangsong@163.com)和密码(123456),如果这两样没提交,发送也会失败。
3。发件人邮箱地址和发送邮件服务器登录名不统一。

以下的代码已在asp中调试通过。

<%

Dim nReturnValue '发送函数
nReturnValue = SendMail_JMail("mail.qcmw.com""laifangsong#qcmw.com""倾城wap自动建站系统""laifangsong#qcmw.com""#123456#""laifangsong#126.com""注册成功提示""您在我们网站上注册成功!")
Select Case nReturnValue
Case 0
    Response.Write 
"邮件发送成功!"
Case 1
    Response.Write 
"创建JMail组件失败!"
Case 2
    Response.Write 
"邮件发送失败!"
End Select


'JMail发送邮件(4.4)
'
组件下载:http://www.52z.com/Down/3525.html
'
参数:发送邮件SMTP服务器, 发件人邮箱地址, 发件人姓名, 发送邮件服务器登录名, 发送邮件服务器登录密码, 接收人邮件地址, 邮件标题, 邮件内容
Function SendMail_JMail(s_SMTPServer, s_FromMail, s_FromName, s_MailServerUserName, s_MailServerPassword, s_ToEmail, s_Subject, s_Body)
    
On Error Resume Next
    
Set jmail = Server.CreateObject("JMAIL.Message")   '建立发送邮件的对象
    If Err.Number <> 0 Then
        SendMail_JMail 
= 1
        
Exit Function
    
End If

    jmail.silent 
= True    '屏蔽例外错误,返回FALSE跟TRUE两值
    jmail.logging = False   '启用邮件日志
    jmail.Charset = "GB2312"     '邮件的文字编码为中文
    jmail.ISOEncodeHeaders = False '防止邮件标题乱码
    jmail.ContentType = "text/html"    '邮件的格式为HTML格式
    jmail.AddRecipient s_ToEmail    '邮件收件人的地址
    jmail.From = s_FromMail  '发件人的E-MAIL地址
    jmail.FromName = s_FromName   '发件人姓名
    jmail.MailServerUserName = s_MailServerUserName    '登录邮件服务器所需的用户名
    jmail.MailServerPassword = s_MailServerPassword     '登录邮件服务器所需的密码
    jmail.Subject = s_Subject    '邮件的标题 
    jmail.Body = s_Body      '邮件的内容
    jmail.Priority = 1      '邮件的紧急程序,1 为最快,5 为最慢, 3 为默认值
    jmail.Send(s_SMTPServer)     '执行邮件发送(通过邮件服务器地址)
    jmail.Close()   '关闭对象
    
    
If jmail.ErrorCode <> 0 Then
        SendMail_JMail 
= 2
    
Else
        SendMail_JMail 
= 0
    
End If

End Function


'IIS中SMTP邮件服务器发送组件
Function SendMail_IISSMTP(s_FromMail, s_ToEmail, s_Subject, s_Body)
    
Set cdomail = Server.CreateObject("CDONTS.NewMail")  '建立邮件对象
    cdomail.Subject = s_Subject   '邮件标题
    cdomail.From = s_FromMail   '发件人的地址
    cdomail.To = s_ToEmail   '收件人的地址
    cdomail.Body = s_Body   '邮件的内容
    cdomail.Send    '执行发送
End Function

%
>




posted @ 2007-06-06 09:48 laifangsong 阅读(438) | 评论 (2)编辑


调用可以很灵活,代码如下:

using System;
using System.Configuration;
using System.Web;
using System.Web.UI;
using System.Text;
using System.IO;

namespace aspnet_test
{
    
/// <summary>
    
/// 单个文件上传类
    
/// 
    
/// 可以自定义:上传目录,上传文件类型、大小,是否使用随机上传文件名。
    
/// 
    
/// 作者:laifangsong  QQ:25313644  GMail:laifangsong@gmail.com
    
/// 原文:http://www.cnblogs.com/jiny-z/archive/2007/05/30/764762.html
    
/// </summary>
    public class UploadFile_Single
    {
        
/* web.config设置:
         * <appSettings>        
         *     <add key="uploadDir" value="UploadFiles/" />
         *   <add key="uploadFileExt" value="gif|jpg|jpeg|png|bmp|doc|xls|hlp|chm|rar|zip" />    
         *   <add key="uploadFileSize" value="2048" />
         *   <add key="isUseRandFileName" value="true" />            
         * </appSettings>
         * 
         * private string uploadDir = ConfigurationSettings.AppSettings["uploadDir"];;
         * private string uploadFileExt = ConfigurationSettings.AppSettings["uploadFileExt"];
         * private int uploadFileSize = int.Parse(ConfigurationSettings.AppSettings["uploadFileExt"]);
         * private bool isUseRandFileName = bool.Parse(ConfigurationSettings.AppSettings["uploadFileExt"]);
         * 
*/

        
//上传目录,相对于本文件路径;以“/”结尾;如果目录不存在,会自动创建;如果要启用绝对路径,写法:“/虚拟目录名称/上传文件目录名称/”
        private string uploadDir = "UploadFiles/";
        
//允许上传文件类型,逗号隔开
        private string uploadFileExt = "gif|jpg|jpeg|png|bmp|doc|xls|hlp|chm|rar|zip";
        
//允许上传文件大小,k 为单位
        private int uploadFileSize = 2048;
        
//是否使用随机上传文件名;如果不使用,会覆盖上传目录的同名文件
        private bool isUseRandFileName = true;

        
//上传结果
        private string uploadResult = "";
        
//上传文件保存路径
        private string uploadPath = "";
        
        
public string UploadDir
        {
            
get
            {
                
return uploadDir;
            }
            
set
            {
                uploadDir 
= value;
            }
        }
        
public string UploadFileExt
        {
            
get
            {
                
return uploadFileExt;
            }
            
set
            {
                uploadFileExt 
= value;
            }
        }
        
public int UploadFileSize
        {
            
get
            {
                
return uploadFileSize;
            }
            
set
            {
                uploadFileSize 
= value;
            }
        }
        
public bool IsUseRandFileName
        {
            
get
            {
                
return isUseRandFileName;
            }
            
set
            {
                isUseRandFileName 
= value;
            }
        }
        
public string UploadResult
        {
            
get
            {
                
return uploadResult;
            }
        }
        
public string UploadPath
        {
            
get
            {
                
return uploadPath;
            }
        }        


        
//上传文件方法
        public bool Upload(Page page)
        {
            HttpPostedFile uploadFile 
= page.Request.Files[0];
            
//获取上传文件属性
            string fileFullName = uploadFile.FileName;
            
string contentType = uploadFile.ContentType;
            
int contentLength = uploadFile.ContentLength;
            
//取得文件名
            string fileName = System.IO.Path.GetFileName(fileFullName);
            
//取得扩展名
            string fileExt = System.IO.Path.GetExtension(fileName).Remove(01);
            
//检测文件类型
            if( ("|"+UploadFileExt+"|").IndexOf( ("|"+fileExt+"|") ) < 0 )
            {
                uploadResult 
= "<font color='red'><b>上传文件格式错误!允许上传文件类型(" + uploadFileExt + ")</b></font>";
                
return false;
            }
            
//检测文件大小
            if(contentLength<1 || contentLength>uploadFileSize*1024)
            {
                uploadResult 
= "<font color='red'><b>上传文件大小错误!最大允许上传 " + uploadFileSize + " KB</b></font>";
                
return false;                
            }
            
//如果上传目录不存在,创建目录
            if(!uploadDir.EndsWith("/")) uploadDir += "/";
            
string tempPath = "";
            
string tempMapPath = "";
            
string tempDir = uploadDir.Substring(0,1)!="/" ? uploadDir : uploadDir.Substring(uploadDir.IndexOf("/"2)+1) ;
            
while(tempDir.IndexOf("/")>=0)
            {
                tempPath 
+= tempDir.Substring(0, tempDir.IndexOf("/")+1);            
                tempMapPath 
=  System.Web.HttpContext.Current.Server.MapPath(tempPath);
                
if(!Directory.Exists(tempMapPath))
                {
                    Directory.CreateDirectory(tempMapPath);
                }
                tempDir 
= tempDir.Substring(tempDir.IndexOf("/")+1);
            }
            
//随机文件名
            if(isUseRandFileName)
            {
                fileName 
= DateTime.Now.ToString("yyyyMMddhhmmss"+ (new Random()).Next(1001000).ToString() + "." + fileExt;
            }

            
string saveFilePath =  System.Web.HttpContext.Current.Server.MapPath(uploadDir) + @"\" + fileName;            
            uploadFile.SaveAs(saveFilePath);

            uploadPath 
= uploadDir+fileName;
            
//SaveUploadPathToDB(uploadPath);

            uploadResult 
+= "<font color='blue'><b>文件上传成功!</b></font>" + "<br/><br/>" +
                
"<b>保存位置:</b>" + uploadPath;
    
            
return true;
        }

        
//将上传文件路径存入数据库
        private void SaveUploadPathToDB(string uploadPath)
        {
            
//string sql = "update table 1 set f_uploadpath='" & uploadPath & "' where ";
            
//TSQL.ExecuteNonQuery(sql, null);
        }

    }
}


调用:

UploadFile_Single upfile = new UploadFile_Single();
upfile.Upload(
this);

            UploadFile_Single upfile = new UploadFile_Single();
            upfile.UploadDir 
= "UploadFiles/";
            upfile.UploadFileExt 
= "gif|jpg|jpeg|png|bmp";
            upfile.UploadFileSize 
= 1024;
            upfile.IsUseRandFileName 
= true;
            upfile.Upload(
this);

            UploadFile_Single upfile = new UploadFile_Single();
            upfile.UploadDir 
= "/虚拟目录名称/UploadFiles/1/2/3/";
            upfile.UploadFileExt 
= "gif|jpg|jpeg|png|bmp";
            upfile.UploadFileSize 
= 1024;
            upfile.IsUseRandFileName 
= true;
            upfile.Upload(
this);
               
               Response.Write(upfile.UploadResult); //上传结果信息
               Response.Write(upfile.UploadPath); //上传保存路径
(上传目录可以用绝对路径,也可用相对路径;如果上传目录不存在,会自动创建)


 

 

 

posted @ 2007-05-30 09:53 laifangsong 阅读(546) | 评论 (0)编辑


asp.net使用表单验证控件时,会调用 /aspnet_client中的js脚本。

你如果在2000或xp上做开发,用到验证控件,当系统迁移到 win2003下运行时,记得用win2003的 /aspnet_client,不要用2000或xp的 /aspnet_client,否则会出现表单不能提交等错误!

今天就遇到这个问题,调了个半死,呵呵。

posted @ 2007-04-24 17:40 laifangsong 阅读(419) | 评论 (1)编辑


最近做一个小系统,在系统管理后台,做了一个PageBase类,供后台其他页面继承。
在该类的构造函数中验证是否Session有值;有值表示处于登录状态,否则返回后台登录页面。

但一写类似这样的代码: if(Session["key"]!=""){...}, 就提示错误:
只有在配置文件或 Page 指令中将启用会话状态设置为真时,才可以使用会话状态
代码大略这样:
PageBase.cs:
================
public class PageBase : System.Web.UI.Page
{
   public PageBase()
   {
         if(Session["Key"]<>"")
         {
               ...
         }  
   }
   ...
}
Admin_Index.aspx:
================
...
...

Admin_Index.cs
================
public class Admin_Index : PageBase
{
   ...
   private void Page_Load(object sender, System.EventArgs e)
   {
        ...
   }
   ...
}

做了以下测试,查找原因:
1.  在 Admin_Index.cs的Page_Load事件中读写Session,结果:一切正常,可以正常赋值
2.  在 Admin_Index.cs的构造函数中读写Session,结果:提示同样错误
3.  在 PageBase.cs的任意位置读写Session,结果:提示同样错误
似乎只能在Page_Load等系统事件中,才能正常读写。

google了一下,发现可能的几个原因:
1.web.config中 <page enableSessionState="false" />,应为"true"
2.aspx页面中的<%@ Page  enableSessionState="false"%>,应为"true"
3.Session["key"]="" 改为 System.Web.Httpcontent.Current.Session["key"]=""

由于Page_Load事件中Session读写正常,基本可以排除上面几个原因;并且可以判断可能是 Session写错了地方。

之后,又搜到一篇:http://www.nqqn.com/ym/183/102910.htm
了解到大概原因:在构造函数运行时,Httpcontent.Current.Session对象未生成,不能引用.
(google下 asp.net事件模型,可以了解下 Session对象是何时产生的);将Session读写放在PaeBase.cs的OnInit事件中,不再有错误。


正确写法:
PageBase.cs:
================
public class PageBase : System.Web.UI.Page
{
   public PageBase()
   {
   }
  protected override void OnInit()
   {
          if(Session["Key"]!="")
         {
               ...
         }       
   }
}

posted @ 2007-04-14 17:45 laifangsong 阅读(439) | 评论 (3)编辑