• 2007-08-25

    Web”开发者”别把JavaScript当狗屎来吃!

    Views: 12430 | 2 Comments

    AJAX是Web2.0的最重要概念, 所以JavaScript脚本语言成了当前Web开发必不可少的技术. 可是, 有些人, 在网页中胡乱堆砌, 把好好的JavaScript当作屎来用. 一个页面竟然有二三百K的脚本代码! 所以, 这种页面不小心打开, CPU占用100%, 浏览器不死也半残. 做这种网页的所谓"开发者"到底是不是吃屎长大的! 做这种垃圾网页! 你少用点要死啊! 或者你在进入这种垃圾网页之前提示一下, 这样, 我就不会不小心进入了, 不可以吗?

    这种吃屎的人做的垃圾网页在国内最重要的代表是CSDN!

    Posted by ideawu at 2007-08-25 11:23:56
  • 2007-08-23

    软件体系结构模式-层

    Views: 11180 | No Comments

    关于体系结构模式

    软件系统的开发过程涉及到三种模式:

    • 体系结构模式
    • 设计模式
    • 惯用法

    体系结构模式关于软件系统的整体结构. 而设计模式是比体系结构模式规模小的中等规模的模式, 它主要关注 API 的协作. 模型-视图-控制器(MVC)模式是最著名的体系结构模式.

    层(Layer)是一种体系结构模式, 它将系统水平分割为多个抽象的层次. TCP/IP 网络是层模式的最著名例子.

    层通信

    通信可以分为两种模式: 推模式和拉模式. 下面我们以一个5层结构的系统分析层通信的主要模式.

    1. 层直接调用(API)的拉模式

             read            read            read            read
    Layer 1 ------> Layer 2 ------> Layer 3 ------> Layer 4 ------> Layer 5
    

    在这种通信模式中, 层直接调用相邻层的 API 完成通信. 活动从 Layer 1 开始, 它调用 Layer 2 的 read 方法获取数据, Layer 2 再调用 Layer 3 的 read 方法, 如此. 在代码中, 这种模式的最重要表现是某一层包含了另一层的一个引用.

    2. 层直接调用(API)的推模式

             write           write           write           write
    Layer 1 <------ Layer 2 <------ Layer 3 <------ Layer 4 <------ Layer 5
    

    这种通信模式和上一种很相似. 但活动从 Layer 5 开始, 它将数据压入 Layer 4, 并等待 Layer 4 处理完该数据再返回.

    3. 层是一个独立的处理机(stand-alone)

                ___
    Layer 1 ===[___]=== Layer 2 ...
    

    在这种通信模式中, 层作为一个独立运行的进程或者线程. 层通信通过一个管道(通道), 层从管道中读取数据, 将数据定义管道. 管道中一般有缓冲区. 层与层之间是完全分离的, 不存在相互调用的问题. 管道既可以通过 API 来实现(在线程中), 也可以使用操作系统的管道, Socket 通信等方式.

    在上面的三种层通信模式中, 前两种通过 API 调用来通信, 所以导致层之间耦合度太大, 不利于测试. 即使使用编程语言的接口特性(如 Java 中的 interface)也无法解决这些问题. 而且, 一个层不再被调用时, 它就不会执行.

    第三种通信模式是最典型, 一个例子是 TCP/IP 网络. 每一层作为一个独立的处理机, 就可以独立编写和测试每一个层, 而且层的运行不再受其它层的影响, 只受到管道的影响.

    参考文献

    面向模式的软件体系结构-卷1:模式系统, Frank Buschmann 等著, 机械工业出版社.

    Posted by ideawu at 2007-08-23 08:19:49
  • 2007-08-18

    fopen 函数的设计

    Views: 16857 | 2 Comments

    最近, 我要使用 PHP 的随机写文件功能, 但是, 竟然找不到. 我当时知道, PHP 的 fopen 和 C 语言中的同名函数行为差不多, 参数 w 会把原文件的内容删除, a 又只能追加. 我想当然地认为参数 r 只能是读, 即使是 r+ 也是读, 因为 r=read.

    事实上, r+ 是随机读写的功能! 我不知道这样的参数设计的原因, 但是如果按照我的思维, 我会这样设计:

    r: 只读
    w: 只写
    a: 只追加
    +: 如果不存在则创建
    

    r+ 和 wa 被禁止, 因为读操作不应该创建一个文件, 而只写和只追加在语义上有冲突.

    回到这件事上, 我的问题是太想当然, 导致看手册不小心.

    Posted by ideawu at 2007-08-18 10:11:02
  • 2007-08-15

    通过 HTTP POST 发送二进制数据

    Views: 37345 | No Comments

    我暂时还不清楚 HTTP 文件上传的具体细节, 但是我知道通过浏览器上传文件, 然后用 PHP 接收, 需要使用 PHP 的预定义变量 $_FILES. 最近我有一个应用需要使用 PHP 的预定义变量 $_POST 获取上传的文件(或者任何数据), 也就是通过 HTTP POST 参数传递二进制数据.

    工作在 ContentType = "application/x-www-form-urlencoded" 的模式下时, HTTP 协议使用 ASCII 字符集的一个子集来编码要传输的字节流. 如字符串 "a@" 如果以 ASCII 编码存在于内存中(以字节数组的形式), 也就是内存按字节读取为 HEX 是: 0x61 0x40, 那么该字节数组被传输时会被编码(URL 编码)成为 0x61 0x25 0x34 0x30, 被编码后字节数组如果按照 ASCII 编码显示, 就是 "a%40". 也就是说, 当你想传输 0x61 0x40 时, HTTP 传输的是 0x61 0x25 0x34 0x30.

    这种编码过程几乎所有的编程语言都提供支持, 在 C# 中你可以使用 HttpUtility.UrlEncode(), 输入一个字节数组, 返回一个 URL 编码的 字节数组.

    在 PHP 脚本中, 当你使用 $_POST['data'] 获取数组时, 该数组已经被 PHP 自动解码了. 按照上面的例子, $_POST['data'] 所指向的内存内容为 0x61 0x40 -- 但是, 默认情况下并不总是, 如果该数据包含单引号等少数几个字符, 那么它们的前面会被 PHP 加上 \.

    下面先给出 PHP 脚本, 保存一个通过 HTTP 参数传递的文件:

    <?php
        $filename = $_POST['filename'];
        $data = $_POST['data'];
        if(get_magic_quotes_gpc()){
            // 去掉斜杠
            $data = stripslashes($data);
        }
        file_put_contents($filename, $data);
    ?>
    

    C# 客户端为:

    using System;
    using System.Text;
    using System.Net;
    using System.Web;
    using System.IO;
    
    class Test
    {
        public static void Main(){
            try{
                WebResponse response;
                HttpWebRequest request;
                request = (HttpWebRequest)HttpWebRequest.Create("http://localhost/test.php");
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
    
                String filename = "test.jpg";
                // HTTP 参数名
                byte[] keyBytes = Encoding.UTF8.GetBytes(String.Format("filename={0}&data=", filename));
    
                FileStream fs = new FileStream(filename, FileMode.Open);
                byte[] buffer = new byte[8192];
                int n = fs.Read(buffer, 0, buffer.Length);
                byte[] dataArray = new byte[n];
                Array.Copy(buffer, dataArray, n);
                dataArray = HttpUtility.UrlEncodeToBytes(dataArray);
    
                request.ContentLength = keyBytes.Length + dataArray.Length;
    
                Stream dataStream = request.GetRequestStream();
                // 发送参数名
                dataStream.Write(keyBytes, 0, keyBytes.Length);
                // 发送名为 data 对应的值.
                dataStream.Write(dataArray, 0, dataArray.Length);
                dataStream.Close();
    
                response = (HttpWebResponse)request.GetResponse();
                // 读取服务器的返回, 在本应用中, 如果正常, 返回空字符串.
                StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("UTF-8"));
                Console.Write(sr.ReadToEnd());
    
                response.Close();
            } catch (Exception e) {
                Console.Write("Error: " + e.ToString() + "\r\n");
            }
        }
    
    }
    

    如果你要测试的文件小于 8K, 可以直接使用上面的程序测试. 如果大于, 你可以加大 buffer 的容量.

    上传成功后, 使用文件比较工具对比两个文件是否一致:

    diff test.jpg up_test.jpg
    

    这种方式的典型的应用是自定义文件上传, 你只需要更改少量的代码就可以实现支持断点续传功能的文件上传.

    Posted by ideawu at 2007-08-15 11:21:02
  • 2007-08-12

    PHP str_replace 函数的参数设计不合理之处

    Views: 18567 | 6 Comments

    PHP str_replace 函数的声明大概是这样: str_replace($search, $replace, $input[, &$count]), 比如在对一个字符串进行替换操作, $input 就是源字符串(称为数据源). 这很不合理, 因为它把数据源放在第3位, 而 str_pos, strtok, str_repeat 等等函数都是把数据源放在第1位.

    Posted by ideawu at 2007-08-12 15:42:52
  • 2007-07-24

    lighttpd速度是Apache的10倍

    Views: 25705 | 1 Comment

    今天试用了lighttpd, Windows预编译版, 体积只有5M左右. 我用我的博客程序试了下, PHP的执行速度竟然是Apache下的10倍! 正如其名--轻快. Apache大而全, 速度自然会受影响. 不过, 这个比较是不准确的, 因为我的Apache开了mod_rewrite, mod_vhost等等模块, 而lighttpd只开了mod_access和mod_cgi.

    Posted by ideawu at 2007-07-24 21:24:19 Tags: ,
|<<<100101102103104105106107108>>>| 104/138 Pages, 825 Results.