• 29 Nov 2008 /  Linux

    今天公司加班,用老婆的电脑,想实验几个C++语法结果没装VC6.0。远程自己家的电脑发现速度太慢。后来想起标准的C++用linux好像也能啊?马上从家里的电脑拷了一个putty远程上一台linux服务器。敲了gcc,g++之后都提示输入文件名,心中狂喜,说明gcc,g++是默认安装的。

    马上用vi写一个cpp文件,g++ o test test.cpp ,编程连接成功。用ls列表,发现同级目录多了一个绿色的test,运行test成功执行!

    可是发现vi编辑器太郁闷了,没语法高亮,没缩进?怎么办?网上找来很多资料说什么改配置之类的,其实都不需要,只要直接 vim 就可以了,vim默认支持高亮。

    但是要自动缩进的话,还需要对/etc/vimrc进行配置,加入以下几行:

       set autoindent
       set cindent
       set modeline
       set ruler
       set showcmd
       set showfulltag
       set showmode
       set smartcase
       set smartindent
       set imcmdline
       set previewwindow
       set hlsearch
       syntax on

    vimrc配置详解:

    1、配置文件的位置
        在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”。例如,/root目录下,通常已经存在一个.vimrc文件。

    2、设置语法高亮显示

    1) 打开vimrc,添加以下语句来使得语法高亮显示:
        syntax on
    2) 如果此时语法还是没有高亮显示,那么在/etc目录下的profile文件中添加以下语句:
        export TERM=xterm-color
    3、设置Windows风格的C/C++自动缩进(添加以下set语句到vimrc中)

                  1)不讨论制表符为8还是为4较好,这里设置(软)制表符宽度为4:
                                set tabstop=4
                                set softtabstop=4

                  2)设置缩进的空格数为4
                              set shiftwidth=4
                  3)设置自动缩进:即每行的缩进值与上一行相等;使用 noautoindent 取消设置:
    set autoindent
                  4)设置使用 C/C++ 语言的自动缩进方式:
                              set cindent
                  5)设置C/C++语言的具体缩进方式(以我的windows风格为例):
                              set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s

    以前一直愁在linux下没有好的编程工具,看来并非如此。用C++可以完成linux编程。用PHP+mysql可以完成网页编程,感觉又向自由迈出一步了!

    Tags: , , ,

  • 27 Nov 2008 /  Ajax, javascript

    先看下面代码:

    <script>
    var abc;
    window.onload=function(){
     abc=document.getElementById(”aaa”);
     abc.onclick=test;
    }
    function test(){
     alert(”测试”);
    }
    </script>
    <input id=”aaa” type=”button” value=”test” />

    这样可以捕获button的onclick事件。注意2点:1) abc.onclick=test 这里的test不能带(),因为是传一个函数引用给onclick 。2)一定得在页面onload()完之后赋值,要不然无法获得document.getElementById(”aaa”); 可以写在文件最后,如果想写在前面一定得onload()函数里,要不然报abc为空的错误。

    Tags:

  • 26 Nov 2008 /  Ajax

    封装了一个ajax的基本客户端框架后,对javascript有了更深刻的认识.以前一直听人说javascript是一种面向对象的语言,用了之后才发现完全不能用面向对象去理解! 虽然很多地方很像C#或java里的对象,但绝对不是! Javascript应该是一种面向函数的语言!一切都是函数!

    为什么这么说呢? 首先javascript里面没有类,有的只有函数,也就是 function ! 但javascript的函数是一个树形的,也就是说可以有子函数,函数套函数。函数和数组其实是一样的,可以无限级分下去。要理解上篇文章的框架代码,必须从javascript语言的特性讲起,要不然很难理解。下面看一个简单的例子:

    <script>
    function clsA(){
     this.a=1;
     this.b=2;
    }
    clsA.prototype.subA=function(){
     alert(this.a+this.b);
    }

    function abc(){
     var a=new clsA();
     a.subA();
    }

    </script>
    <input type=”button” name=”test” value=”test” onclick=”abc();” />

    上面的例子很简单,按了按钮之后,弹出3。下面分解和改写上面的代码。首先看 var a=new clsA(); 这句很像java里面的new吧,产生一个对象!这里可以这样理解,但不全对,如果这样理解后面你就会想不明白!下面看改写的代码:

    function clsA(){
     this.a=1;
     this.b=2;
     alert(’1′);
    }

    上面的代码只是加了一行:alert(”1″); 那么将先弹1,再弹3。再改:<input type=”button” name=”test” value=”test” onclick=”clsA();” /> 这次同样可以弹出1。说明什么?clsA是一个函数!那为什么要用new呢?函数也可以用new ? 所以说用传统的面向对象的观念你无法理解,只有一种解析:在javascript里面一切都是函数,或者说函数也只是javascript里面的一种数据类型!this可以定义这个数据类型的内部子数据类型。当然不用 this 也可以用prototype来附加。像上面的用prototype附加了subA函数。在javascript里面还有一个非常非常重要的东西叫做:call ! 任何一个函数都可以call。call 有什么用呢?看完下面的例子就明白了:

    <script>
    function clsA(){
     this.a=1;
     this.b=2;
     this.c=3;
    }

    function do1(){
     alert(this.a+this.b+this.c);
    }

    function abc(){
     var a=new clsA();
     do1.call(a);
    }

    </script>
    <input type=”button” name=”test” value=”test” onclick=”abc();” />

     看,发现了什么? 弹出了6;然后再do1.call(a)改成do1(a) :弹出 NaN 。 说明了什么? 也就是说用了call之后,a 里面的参数自动do1给调用了。也许这样还不能说明问题,我们再改下:

    <script>
    function clsA(){
     this.a=1;
     this.b=2;
     this.c=3;
    }

    clsA.prototype.do1=function(){
     alert(this.a+this.b+this.c);
    }

    function clsB(){
     this.a=10;
     this.b=20;
     this.c=30;
    }
    function abc(){
     var a=new clsA();
     var b=new clsB();
     a.do1.call(b);
    }

    </script>
    <input type=”button” name=”test” value=”test” onclick=”abc();” />

    看,发生了什么?竟然弹出了60!请注意,do1本来属于clsA的,如果我们这样调用:a.do1(); 肯定是弹出6。也就是说,b里面的值 传给了do1了!do1竟然拥有了clsB的属性值。这充分说明了call的用法,可以将一个函数的值改变。以后一些例子会讲到这样做的好处。

    好了,说了这么多,可以充分说明javascript的本质,函数是javascript一等公民!利用this, prototype, call 可以灵活的做出很多的应用。有这些基础去理解上篇中的简易ajax框架应该容易很多了。最后说明一句:如果用了var 变量的作用于只有本函数,如果不用默认为全局变量!所以写javascript应该养成定义var的好习惯!要不然很容易出问题。

    Tags:

  • 26 Nov 2008 /  Ajax

    前面一篇文章实现了简单的ajax应用,已经可以初步应用了。但是却非常复杂!又要产生xmlRequest请求对象,又要做显示,今天重构一下昨天的ajax,发布了一个简单的处理框架。先不说代码如何,先看看下面2个函数:

    function dotxt(str){
     if(this.xmlHttp){
      document.getElementById(”txtHint”).innerHTML=this.xmlHttp.responseText;
     }
     else{
      if (str)
      {
       var url=”ajax.php”;
       url=url+”?act=txt&q=”+str;
       url=url+”&sid=”+Math.random();
       var o=new ltAjax.ContentLoader(url,dotxt);
      }
      else{
       document.getElementById(”txtHint”).innerHTML=”";
      }
     }
    }

    上面的函数完成从产生请求写入页面的全部过程。首先产生一个 var o=new ltAjax.ContentLoader(url,dotxt);  这个函数其实是一个全局对象,而这个函数dotxt其实是回调自己,有 xmlHttp 对象则显示,没有就新建。再看一个处理xml请求的函数:

    function doxml(str){
     if(this.xmlHttp){
      document.getElementById(”xmlHint”).innerHTML=this.xmlHttp.responseXML.documentElement.getElementsByTagName(”compname”)[0].childNodes[0].nodeValue;;
     }
     else{
      if (str)
      {
       var url=”ajax.php”;
       url=url+”?act=xml&q=”+str;
       url=url+”&sid=”+Math.random();
       var o=new ltAjax.ContentLoader(url,doxml);
      }
      else{
       document.getElementById(”xmlHint”).innerHTML=”";
      }
     }
    }

    测试地址:http://myphp.net0791.com/ajax.htm 源码用记事本打开看。类文件 inlucde/ajax.js 别忘了下载。

    Tags: ,

  • 26 Nov 2008 /  Ajax

     

    javascript事件列表解说
    事件 浏览器支持 解说
    一般事件 onclick IE3、N2 鼠标点击时触发此事件
    ondblclick IE4、N4 鼠标双击时触发此事件
    onmousedown IE4、N4 按下鼠标时触发此事件
    onmouseup IE4、N4 鼠标按下后松开鼠标时触发此事件
    onmouseover IE3、N2 当鼠标移动到某对象范围的上方时触发此事件
    onmousemove IE4、N4 鼠标移动时触发此事件
    onmouseout IE4、N3 当鼠标离开某对象范围时触发此事件
    onkeypress IE4、N4 当键盘上的某个键被按下并且释放时触发此事件.
    onkeydown IE4、N4 当键盘上某个按键被按下时触发此事件
    onkeyup IE4、N4 当键盘上某个按键被按放开时触发此事件
    页面相关事件 onabort IE4、N3 图片在下载时被用户中断
    onbeforeunload IE4、N 当前页面的内容将要被改变时触发此事件
    onerror IE4、N3 出现错误时触发此事件
    onload IE3、N2 页面内容完成时触发此事件
    onmove IE、N4 浏览器的窗口被移动时触发此事件
    onresize IE4、N4 当浏览器的窗口大小被改变时触发此事件
    onscroll IE4、N 浏览器的滚动条位置发生变化时触发此事件
    onstop IE5、N 浏览器的停止按钮被按下时触发此事件或者正在下载的文件被中断
    onunload IE3、N2 当前页面将被改变时触发此事件
    表单相关事件 onblur IE3、N2 当前元素失去焦点时触发此事件
    onchange IE3、N2 当前元素失去焦点并且元素的内容发生改变而触发此事件
    onfocus IE3 、N2 当某个元素获得焦点时触发此事件
    onreset IE4 、N3 当表单中RESET的属性被激发时触发此事件
    onsubmit IE3 、N2 一个表单被递交时触发此事件
    滚动字幕事件 onbounce IE4、N 在Marquee内的内容移动至Marquee显示范围之外时触发此事件
    onfinish IE4、N 当Marquee元素完成需要显示的内容后触发此事件
    onstart IE4、 N 当Marquee元素开始显示内容时触发此事件
    编辑事件 onbeforecopy IE5、N 当页面当前的被选择内容将要复制到浏览者系统的剪贴板前触发此事件
    onbeforecut IE5、 N 当页面中的一部分或者全部的内容将被移离当前页面[剪贴]并移动到浏览者的系统剪贴板时触发此事件
    onbeforeeditfocus IE5、N 当前元素将要进入编辑状态
    onbeforepaste IE5、 N 内容将要从浏览者的系统剪贴板传送[粘贴]到页面中时触发此事件
    onbeforeupdate IE5、 N 当浏览者粘贴系统剪贴板中的内容时通知目标对象
    oncontextmenu IE5、N 当浏览者按下鼠标右键出现菜单时或者通过键盘的按键触发页面菜单时触发的事件
    oncopy IE5、N 当页面当前的被选择内容被复制后触发此事件
    oncut IE5、N 当页面当前的被选择内容被剪切时触发此事件
    ondrag IE5、N 当某个对象被拖动时触发此事件 [活动事件]
    ondragdrop IE、N4 一个外部对象被鼠标拖进当前窗口或者帧
    ondragend IE5、N 当鼠标拖动结束时触发此事件,即鼠标的按钮被释放了
    ondragenter IE5、N 当对象被鼠标拖动的对象进入其容器范围内时触发此事件
    ondragleave IE5、N 当对象被鼠标拖动的对象离开其容器范围内时触发此事件
    ondragover IE5、N 当某被拖动的对象在另一对象容器范围内拖动时触发此事件
    ondragstart IE4、N 当某对象将被拖动时触发此事件
    ondrop IE5、N 在一个拖动过程中,释放鼠标键时触发此事件
    onlosecapture IE5、N 当元素失去鼠标移动所形成的选择焦点时触发此事件
    onpaste IE5、N 当内容被粘贴时触发此事件
    onselect IE4、N 当文本内容被选择时的事件
    onselectstart IE4、N 当文本内容选择将开始发生时触发的事件
    数据绑定 onafterupdate IE4、N 当数据完成由数据源到对象的传送时触发此事件
    oncellchange IE5、N 当数据来源发生变化时
    ondataavailable IE4、N 当数据接收完成时触发事件
    ondatasetchanged IE4、N 数据在数据源发生变化时触发的事件
    ondatasetcomplete IE4、N 当来子数据源的全部有效数据读取完毕时触发此事件
    onerrorupdate IE4、N 当使用onBeforeUpdate事件触发取消了数据传送时,代替onAfterUpdate事件
    onrowenter IE5、N 当前数据源的数据发生变化并且有新的有效数据时触发的事件
    onrowexit IE5、N 当前数据源的数据将要发生变化时触发的事件
    onrowsdelete IE5、N 当前数据记录将被删除时触发此事件
    onrowsinserted IE5、N 当前数据源将要插入新数据记录时触发此事件
    外部事件 onafterprint IE5、N 当文档被打印后触发此事件
    onbeforeprint IE5、N 当文档即将打印时触发此事件
    onfilterchange IE4、N 当某个对象的滤镜效果发生变化时触发的事件
    onhelp IE4、N 当浏览者按下F1或者浏览器的帮助选择时触发此事件
    onpropertychange IE5、N 当对象的属性之一发生变化时触发此事件
    onreadystatechange IE4、N 当对象的初始化属性值发生变化时触发此事件

    Tags: ,

  • 25 Nov 2008 /  Ajax

    将昨天的ajax.php改下,一种用html方式来传递数据,一种用 xml 来传递。服务器端代码如下:

    ajax.php:

    <?php
    switch($_REQUEST['act']){
    case ‘txt’:
     header(’Content-type: text/html;charset=gb2312′);
     echo $_REQUEST['q'];
     break;
    case ‘xml’:
     header(’Content-type: text/xml;charset=gb2312′);
     echo ‘<?xml version=”1.0″ encoding=”gb2312″?>’;
     echo ‘<company>’;
     echo ‘<compname>’. $_REQUEST['q'] .’</compname>’;
     echo ‘</company>’;
     break;
    }
    ?>

    客户端代码:http://myphp.net0791.com/ajax.htm 自己下载代码看。

    Tags: ,

  • 24 Nov 2008 /  Ajax

    客户端代码:

    <html>

    <script>

    function GetXmlHttpObject()
    {
      var xmlHttp=null;
      try
        {
        // Firefox, Opera 8.0+, Safari
        xmlHttp=new XMLHttpRequest();
        }
      catch (e)
        {
        // Internet Explorer
        try
          {
          xmlHttp=new ActiveXObject(”Msxml2.XMLHTTP”);
          }
        catch (e)
          {
          xmlHttp=new ActiveXObject(”Microsoft.XMLHTTP”);
          }
        }
      return xmlHttp;
    }
    function showHint(str)
    {

      if (str.length==0)
        {
        document.getElementById(”txtHint”).innerHTML=”";
        return;
        }

      xmlHttp=GetXmlHttpObject()
     
      if (xmlHttp==null)
        {
        alert (”您的浏览器不支持AJAX!”);
        return;
        }

     var url=”";
     url=url+”?q=”+str;
     //url=url+”&sid=”+Math.random();
     xmlHttp.onreadystatechange=stateChanged;
     xmlHttp.open(”GET”,url,true);
     xmlHttp.send(null);
    }

    function stateChanged()
    {
      if (xmlHttp.readyState==4)
      {
      document.getElementById(”txtHint”).innerHTML=xmlHttp.responseText;
      }
    }
    </script>
    <body>
    <meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″ />
    <form>
    First Name:<input type=”text” id=”txt1″ onkeyup=”showHint(this.value)” />
    </form>

    <p>Suggestions: <span id=”txtHint”></span></p>

    </body>
    </html>

    ASP服务器端代码:

    <%
    Response.Charset=”gb2312″
    if Request(”q”)<>”" then response.write(request(”q”)):response.end()
    %>

    PHP端服务器代码:

    <?php
    header(’Content-type:   text/html;charset=gb2312′);  
    if($_REQUEST['q']!=”) die($_REQUEST['q']);
    ?>

    注意:服务器端一定得设置charset,在客户端一定得加上<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″ />。这样就不会出现中文乱码问题。其他的应用可以在以上基础上拓展

    Tags: , ,

  • 22 Nov 2008 /  PHP

    用了PHP,发现PHP的功能确实很强大,而且有很多实用的函数。以前ASP还得用什么无组件上传类,而PHP直接处理了上传的请求,对于上传的文件,是先保存在upload_tmp_dir里面,这个文件夹是在php.ini里面设置的。那么PHP上传其实只要做一件事:用move_uploaded_file函数把临时文件移动到指定目录!如果没有移动,在会话结束后临时文件也会被删除!

    上传示例代码如下:

    <?php
    if($_REQUEST['act']==’upload’){
     $uploadFile=’upload/’.time().$_FILES['userfile']['name'];
     if(!file_exists($uploadFile)){
      move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadFile);
      echo $_FILES['userfile']['name'].’<br>’;
      echo $_FILES['userfile']['size'].’<br>’;
      echo $_FILES['userfile']['type'].’<br>’;
     }
    }
    ?>
    <form enctype=”multipart/form-data” action=”?act=upload” method=”POST”>
        Send this file: <input name=”userfile” type=”file” />
        <input type=”submit” value=”Send File” />
    </form>

    Tags: ,

  • 20 Nov 2008 /  服务器配置
    不能正常显示中文,你可以在putty下window-〉Appearance-〉Translation中, Received data assumed to be in which character set 中,把Use font encoding改为UTF-8.

      如果出现无法输入中文的情况,修改putty的设置:Appearance-〉Font settings-〉Change…,选择Fixedsys字体,字符集选CHINESE_GB2312.而且这样设置,显示的字体也舒服多了,呵呵.

    现在打开putty,登录成功后,在shell中输入:export LC_ALL=’zh_CN.utf8′,现在已经可以完美的支持中文了
      当然如果是在本地终端,你可以使用zhcon来显示和输入.

    Tags: , ,

  • 20 Nov 2008 /  ASP

    在写完了php的数据库类之后,发现其实ASP也是可以做到数据库连接对象隐藏的!现在最主流的ASP写法都是将conn做为全局变量。以前封装的几个类也或多或少的用到了conn对象。也就是在配置文件里必须有一个 conn的全局变量,我们需要的时候用 link_database() 来给conn赋值,然后在页面的结尾都需要显示的conn.close();通常我们在每个页面的结尾加上如下代码:

    if isobject(conn) then conn.close:set conn=nothing

    这样做存在什么问题呢?不优美了!相比自己写的PHP类,显得耦合度很高,我竟然需要用到全局变量来控制数据库操作!有没有更好的方法呢?以前也想过,不过最后因为过度封装反而影响了开发的速度,结果还是回到最原始的conn全局变量的写法来。其实要100%封装ASP的数据库操作是完全可以的!下面先来看下我们理想的写法。数据库更新删除添加我就不写了,没什么好说的,我们可以做到。要封装最麻烦的是和分页结合在一起的部分。如果我用调用PHP数据库操作类的写法应该如下:

    Set objConn=New DBClass ‘建立一个新的对象
    objConn.Connection() ‘连接数据库
    objConn.PageSize=20 ‘一页显示20条
    objConn.Execute(”select * from T”) ‘传入select语句,自动判断是查询还是更新

    ‘以下是循环读取数据
    while(objConn.Read())
              Response.write objConn.Get(”ID”) & “&nbsp;”
              Response.write objConn.Get(”test”) & “<br />”
    Wend
    objConn.ShowPage() ‘分页导航

    看上面的写法多么优美!我们没有任何的连接数据库的对象。我们希望不需要写conn.close(),只要页面销毁对象的时候自动关闭数据库连接,我们希望不需要考虑页面的参数,ShowPage() 已经帮我们完成了。我们也不希望去考虑数据如何传递,我们只需要简单的Get就可以获得我们想要的数据。想想,如果能这样,我可以用VB去封装一个数据库操作的类,我可以直接用 Set objConn=Server.Create(”DBClass”) 来生成一个对象,VB是编译好了的,性能肯定很高。这样的写法能做到吗?答案是肯定的!完全可以通过ASP有限的面向对象特性封装成一个这样的类。

    首先我们分析下,这个类我们需要将conn,rs等 传统的东西都包含进去。也就是我们在调用Connection方法的时候就得产生一个conn对象,当然这个对象是类里面私有的。然后我们在给PageSize赋值的时候,我们的对象就知道接下来是要进行分页操作了!当执行Execute的时候,我们同样也判断是否是select 语句,如果是,则产生一个rs对象,这个rs肯定也是私有的。那如何得到值呢?以前一直被rs(”id”)这种方式误导了,认为要构建一个数据库操作类,应该和C#那样objConn(”ID”)来得到,其实应该是用类里面的一个方法,暂且我们定义为Get(str) 我们可以将Get映射到 rs(str) 里面来,这样就可以在外部得到想要的一切数据了。好,还有另外的情况!rs.movenext呢?我们需要控制游标下移啊。在这里我用类似.net 里面的Read()方法来完成。其实很好做,反过来,如果是第一条记录,直接给返回true。如果不是第一条记录,怎么办呢?控制rs.movenext()嘛。这样我们的写法不就和.net里面统一了吗? 所以通过Get完全可以获得我们想获得的任何记录。至于分页,能顺利进行吗?答案是肯定的!其实一个分页函数只和2个变量有关!第一个是最大值,第2个是一页显示多少条记录。而至于当前页,完全可以通过全局的request对象获得参数值。第1个最大值,可以调用rs的recodcount得到,一页显示多少条,前面的变量已经赋了。所以分页也可以解决!

    通过以上的分析一个优美的数据库操作类就完成了。这个类我们完全可以独立运行,不需要任何所谓的全局conn对象。而且非常健壮,在类撤销的时候,会自动关闭数据库连接。

    到了上面的分析,基本上解决了问题,但是有一个问题:海量数据的分页!肯定不能用rs来分页,如果超过10万条,都放到内存,还不慢死!可惜sqlserver和access 都不支持limit,支持该多少好啊。当然不支持不意味着不能实现高性能的分页。获得记录条数,还是改造select语句,将其改造为 select count(*)。而取得数据记录用 排除法,select top not in 这种方法来实现。当然这里的改造select 语句可比mysql的要复杂得多啊,毕竟是将一条select 语句改造成一条复合语句。以前封装C#的数据库操作类的时候已经封装了一个,相信看看以前的代码处理起来会比较简单。当然类里面肯定得做开关来支持海量数据分页。

    至此,这个数据库操作分页类就分析完毕了,至于代码,暂不公布,还没写完,这种方式还是昨天坐车的时候想到的。写了这么久的程序,接触了VB,VC++,C#,Java,ASP,到前段时间接触的PHP,可谓各大主流的编程语言都过了一遍了。越来越深刻的感觉到,任何一种语言其实都可以写得很优美!任何一种语言都可以提高可复用性,提高健壮性。

    其实我还感觉ASP还可以实现更多的面向性。因为ASP有个很有用的函数:execute .将字符串当表达式执行!以前一直是用来表单给rs赋值用的。也许在这个数据库操作类里面我们可以加入更新,添加的部分。用execute语句可以像这样来更新数据:objConn.Form2Rs(”ID,UserName,Password,TX”) 只要这样一写,表单的值就全跑到数据库去了。当然必须Form名和数据库字段名对应!

    其实有时候想来,编程和设计其实并没有区别,让代码看起来更优美,更简单是不断追求的。

    Tags: ,