摘要: zdirectshow的原理大概大家都知道,基本就是用微软封装的接口来实现硬件无关性,但是最终调用的接口都要在驱动层有对应的实现:为了更清楚地演示directshow的数据传输过程,我必须说明的这个程序的基本流程。我采用的是vs2005 + windows mobile 6。0professional 仿真模拟器,驱动层传出的是176*144格式的rgb565的数据,最后我将保存图片为RGB24的bmppdf图片。说明:source filter从驱动层获取数据后一般分成两个pin将数据传出,一个是still pin用于传输静态数据,一帧的数据,一个是capture pin用于传出连续的视频数阅读全文
posted @ 2011-08-04 07:55 mmic.net.cn 阅读(83) 评论(0) 编辑

android中怎样让手机测试的日志在logCat输出?
1,关闭模拟器;

2,重启开发工具(Eclipse);

3,设置手机上---开发--USB调试。

4,如果你手机上Sdcard为计算机管理,请设置为让手机加载。

5,如果开发工具(Eclipse),启动好了的话,把数据线重新插拔,便于重新识别。

6.最后一步,运行程序(注意:但不要再启动模拟器了),这样,就可以在(Eclipse)中的logCat,看到手机上运行程序的日志了。


详细用法 
Android日志系统提供了记录和查看系统调试信息的功能。日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过 logcat 命令来查看和使用.


使用logcat命令
你可以用 logcat 命令来查看系统日志缓冲区的内容:

[adb] logcat [<option>] ... [<filter-spec>] ...
请查看Listing of logcat Command Options ,它对logcat命令有详细的描述 .

你也可以在你的电脑或运行在模拟器/设备上的远程adb shell端来使用logcat命令,也可以在你的电脑上查看日志输出。

$ adb logcat
你也这样使用:

# logcat

过滤pdf日志输出
每一个输出的Android日志信息都有一个标签和它的优先级.

日志的标签是系统部件原始信息的一个简要的标志。(比如:“View”就是查看系统的标签).
优先级有下列集中,是按照从低到高顺利排列的:
V — Verbose (lowest priority)
D — Debug
I — Info
W — Warning
E — Error
F — Fatal
S — Silent (highest priority, on which nothing is ever printed)
在运行logcat的时候在前两列的信息中你就可以看到 logcat 的标签列表和优先级别,它是这样标出的:<priority>/<tag> .

下面是一个logcat输出的例子,它的优先级就似乎I,标签就是ActivityManage:

I/ActivityManager(  585): Starting activity: Intent { action=android.intent.action...}
为了让日志输出能体现管理的级别,你还可以用过滤器来控制日志输出,过滤器可以帮助你描述系统的标签等级.

过滤器语句按照下面的格式描tag:priority ... , tag 表示是标签,priority 是表示标签的报告的最低等级. 从上面的tag的中可以得到日志的优先级. 你可以在过滤器中多次写tag:priority .

这些说明都只到空白结束。下面有一个列子,例子表示支持所有的日志信息,除了那些标签为”ActivityManager”和优先级为”Info”以上的和标签为” MyApp”和优先级为” Debug”以上的。 小等级,优先权报告为tag.

adb logcat ActivityManager:I MyApp:D *:S
上面表达式的最后的元素 *:S ,,是设置所有的标签为”silent”,所有日志只显示有”View” and “MyApp”的,用 *:S 的另一个用处是 能够确保日志输出的时候是按照过滤器的说明限制的,也让过滤器也作为一项输出到日志中.

下面的过滤语句指显示优先级为warning或更高的日志信息:

adb logcat *:W
如果你电脑上运行logcat ,相比在远程adbshell端,你还可以为环境变量ANDROID_LOG_TAGS :输入一个参数来设置默认的过滤

export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
需要注意的是ANDROID_LOG_TAGS 过滤器如果通过远程shell运行logcat 或用adb shell logcat 来运行模拟器/设备不能输出日志.


控制日志输出格式
日志信息包括了许多元数据域包括标签和优先级。可以修改日志的输出格式,所以可以显示出特定的元数据域。可以通过 -v 选项得到格式化输出日志的相关信息.

brief — Display priority/tag and PID of originating process (the default format).
process — Display PID only.
tag — Display the priority/tag only.
thread — Display process:thread and priority/tag only.
raw — Display the raw log message, with no other metadata fields.
time — Display the date, invocation time, priority/tag, and PID of the originating process.
long — Display all metadata fields and separate messages with a blank lines.
当启动了logcat ,你可以通过-v 选项来指定输出格式:

[adb] logcat [-v <format>]
下面是用 thread 来产生的日志格式:

adb logcat -v thread
需要注意的是你只能-v 选项来规定输出格式 option.


查看可用日志缓冲区
Android日志系统有循环缓冲区,并不是所有的日志系统都有默认循环缓冲区。为了得到日志信息,你需要通过-b 选项来启动logcat 。如果要使用循环缓冲区,你需要查看剩余的循环缓冲期:

radio — 查看缓冲区的相关的信息.
events — 查看和事件相关的的缓冲区.
main — 查看主要的日志缓冲区
-b 选项使用方法:

[adb] logcat [-b <buffer>]
下面的例子表示怎么查看日志缓冲区包含radio 和 telephony信息:

adb logcat -b radio

查看stdout 和stderr
在默认状态下,Android系统有stdout 和 stderr (System.out和System.err )输出到/dev/null ,在运行Dalvik VM的进程中,有一个系统可以备份日志文件。在这种情况下,系统会用stdout 和stderr 和优先级 I.来记录日志信息

通过这种方法指定输出的路径,停止运行的模拟器/设备,然后通过用setprop 命令远程输入日志

$ adb shell stop$ adb shell setprop log.redirect-stdio true$ adb shell start
系统直到你关闭模拟器/设备前设置会一直保留,可以通过添加/data/local.prop 可以使用模拟器/设备上的默认设置


Logcat命令列表
Option Description
-b <buffer> 加载一个可使用的日志缓冲区供查看,比如event 和radio . 默认值是main 。具体查看Viewing Alternative Log Buffers.
-c 清楚屏幕上的日志.
-d 输出日志到屏幕上.
-f <filename> 指定输出日志信息的<filename> ,默认是stdout .
-g 输出指定的日志缓冲区,输出后退出.
-n <count> 设置日志的最大数目<count> .,默认值是4,需要和 -r 选项一起使用。
-r <kbytes> 每<kbytes> 时输出日志,默认值为16,需要和-f 选项一起使用.
-s 设置默认的过滤级别为silent.
-v <format> 设置日志输入格式,默认的是brief 格式,要知道更多的支持的格式,参看Controlling Log Output Format . 

posted @ 2011-08-04 07:54 mmic.net.cn 阅读(187) 评论(0) 编辑
摘要: JavaScript是互联网时代编程语言的霸主,统领浏览器至今已有许多年头,而这股风潮很可能随着HTML 5的兴起而愈演愈烈。如今JavaScript更是在Node.js的帮助下进军服务器编程领域。“单线程”和“无阻塞”是JavaScript的天性, 因此任何需要“耗时”的操作,例如等待、网络通信、磁盘IO都只能提供“异步”的编程接口。尽管这对服务器的伸缩性和客户端的响应能力都大有脾益,但是异 步接口在使用上要比传统的线性编程困难许多,因此也诞生了如jQuery Deferred这样的辅助类库。Jscex的主要目的也是简化异步编程,但它使用了一种与传统辅助类库截然不同的方式,尽可能地将异步编程阅读全文
posted @ 2011-08-04 07:52 mmic.net.cn 阅读(62) 评论(1) 编辑

Android SDK下, 如何在程序中输出日志 以及如何查看日志.

闲话少说,直接进入正题


在程序中输出日志, 使用 android.util.Log 类.
该类提供了若干静态方法

Log.v(String tag, String msg);
Log.d(String tag, String msg);
Log.i(String tag, String msg);
Log.w(String tag, String msg);
Log.e(String tag, String msg);

分别对应 Verbose, Debug, Info, Warning,Error.

tag是一个标识,可以是任意字符串,通常可以使用类名+方法名, 主要是用来在查看日志时提供一个筛选条件.


程序运行后 并不会在 ide的控制台内输出任何信息.

如果要后查看日志 请使用

adb logcat

关于adb的更多信息请查看官方网站.

当执行 adb logcat 后会以tail方式实时显示出所有的日志信息.

这时候我们通常需要对信息进行过滤,来显示我们需要的信息, 这时候我们指定的 tag就派上了用场.

adb logcat -s MyAndroid:I

这时将只显示tag为MyAndroid,级别为I或级别高于I(Warning,Error)的日志信息.

示例代码如下:

Java代码 复制代码 收藏代码
  1. package com.zijun;   
  2.   
  3. import android.app.Activity;   
  4. import android.content.Context;   
  5. import android.graphics.Canvas;   
  6. import android.os.Bundle;   
  7. import android.util.Log;   
  8. import android.view.MotionEvent;   
  9. import android.view.View;   
  10.   
  11. public class MyAndroid extends Activity {   
  12.        
  13.     protected static final String ACTIVITY_TAG="MyAndroid";   
  14.        
  15.     @Override  
  16.     protected void onCreate(Bundle icicle) {   
  17.         super.onCreate(icicle);   
  18.         setContentView(new MyView(this));   
  19.     }   
  20.     public class MyView extends View {   
  21.         public MyView(Context c) {   
  22.             super(c);   
  23.         }   
  24.         @Override  
  25.         protected void onDraw(Canvas canvas) {   
  26.     
  27.         }   
  28.         @Override  
  29.         public boolean onMotionEvent(MotionEvent event) {   
  30.             Log.i(MyAndroid.ACTIVITY_TAG, "=============================");   
  31.                
  32.             Log.d(MyAndroid.ACTIVITY_TAG, "Haha , this is a DEBUG of MyAndroid. ");   
  33.             Log.i(MyAndroid.ACTIVITY_TAG, "Haha , this is a INFO of MyAndroid. ");   
  34.             Log.w(MyAndroid.ACTIVITY_TAG, "Haha , this is a WARNING of MyAndroid. ");   
  35.   
  36.             return true;   
  37.         }   
  38.            
  39.     }   
  40.   
  41. }  
package com.zijun;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

public class MyAndroid extends Activity {
    
   	protected static final String ACTIVITY_TAG="MyAndroid";
   	
    @Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(new MyView(this));
    }
    public class MyView extends View {
        public MyView(Context c) {
            super(c);
        }
        @Override
        protected void onDraw(Canvas canvas) {
 
        }
        @Override
        public boolean onMotionEvent(MotionEvent event) {
        	Log.i(MyAndroid.ACTIVITY_TAG, "=============================");
        	
            Log.d(MyAndroid.ACTIVITY_TAG, "Haha , this is a DEBUG of MyAndroid. ");
            Log.i(MyAndroid.ACTIVITY_TAG, "Haha , this is a INFO of MyAndroid. ");
            Log.w(MyAndroid.ACTIVITY_TAG, "Haha , this is a WARNING of MyAndroid. ");

            return true;
        }
        
    }

}




以上程序运行后, pdf在命令行执行  adb logcat -s MyAndroid:I
然后在手机模拟器的屏幕上 点击 拖动鼠标 就能看到相应的日志信息.

posted @ 2011-08-02 07:46 mmic.net.cn 阅读(148) 评论(0) 编辑

这是摘录androidin.com的一篇文章,对于学习Android的朋友来说,可以做工具来参考下。

(hanchao3c Android开发者论坛原创,转载请注明)

logcat是Android中一个命令行工具,可以用于得到程序的log信息。

logcat使用方法如下所示:
logcat [options] [filterspecs]
logcat的选项包括:
  -s                    设置过滤器,例如指定 '*:s'
  -f <filename>   输出到文件,默认情况是标准输出。
  -r [<kbytes>]   Rotate log every kbytes. (16 if unspecified). Requires -f
  -n <count>      Sets max number of rotated logs to <count>, default 4
  -v <format>     设置log的打印格式,  <format> 是下面的一种:
                         brief process tag thread raw time threadtime long

  -c                   清除所有log并退出
  -d                   得到所有log并退出 (不阻塞)
  -g                   得到环形缓冲区的大小并退出
  -b <buffer>     请求不同的环形缓冲区    ('main' (默认), 'radio', 'events')
  -B                   输出log到二进制中。

过滤器的格式是一个这样的串:
  <tag>[:priority]

其中 <tag> 表示log的component, tag (或者使用 * 表示所有) , priority 如下所示:
  V    Verbose
  D    Debug
  I    Info
  W    Warn
  E    Error
  F    Fatal
  S    Silent


事实上logcat的功能是由Android的类android.util.Log决定的,在程序中log的使用方法如下所示:
Log.v() -------------------- VERBOSE
Log.d() -------------------- DEBUG
Log.i() -------------------- INFO
Log.w() -------------------- WARN
Log.e() -------------------- ERROR
以上log的级别依次升高,DEBUG信息应当只存在于开发中,INFO, WARN,ERROR这三种log将出现在发布版本中。

对于JAVA类,可以声明一个字符串常量TAG,Logcat可以根据他来区分不同的log,例如在计算器(Calculator)的类中,定义如下所示:

public class Calculator extends Activity {
/* ...... */
    private static final String LOG_TAG = "Calculator";
    private static final boolean DEBUG  = false;
    private static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
/* ...... */
   由此,所有在Calculator中使用的log,均以"Calculator"为开头。

例如使用方法如下所示:
# logcat &
< 得到一个log片段 >
W/KeyCharacterMap(  130): No keyboard for id 0
W/KeyCharacterMap(  130): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
I/ActivityManager(   52): Displayed activity com.android.contacts/.DialtactsContactsEntryActivity: 983 ms
I/ARMAssembler(   52): generated scanline__00000077:03545404_00000A04_00000000 [ 29 ipp] (51 ins) at [0x25c978:0x25ca44] in 1764174 ns
I/ARMAssembler(   52): generated scanline__00000077:03515104_00000001_00000000 [ 46 ipp] (65 ins) at [0x25d1c8:0x25d2cc] in 776789 ns
D/dalvikvm(  130): GC freed 834 objects / 81760 bytes in 63ms
D/dalvikvm(   52): GC freed 10588 objects / 425776 bytes in 94ms

其中W/I/D表示log的级别pdf,“dalvikvm”“ARMAssembler”等是不同组件(component)的名称,后面括号里面的数字表示了发出log的进程号。

使用技巧:
1.使用logcat &在后台运行
2.使用-d得到所有log
3.使用-f或者重定向(>和>>)输出到文件
4.使用-s设置过滤器,得到想要的log。

当然,最重要的还是在程序中加入恰当的log.

posted @ 2011-08-02 07:45 mmic.net.cn 阅读(201) 评论(0) 编辑

 首先还是下载smack,我下载的是smack_3_2_0.tar。这个包里有四个jar文件。
  首先创建一个java工程。创建一个lib文件夹,把这四个jar包放到lib中,添加到编译路径中。
  目录接口如下:

       创建一个TestSmack.java类。具体代码如下:

java代码:

  1. package eoe.demo;
  2. import org.jivesoftware.smack.ConnectionConfiguration;
  3. import org.jivesoftware.smack.PacketListener;
  4. import org.jivesoftware.smack.XMPPConnection;
  5. import org.jivesoftware.smack.XMPPException;
  6. import org.jivesoftware.smack.filter.PacketFilter;
  7. import org.jivesoftware.smack.packet.IQ;
  8. import org.jivesoftware.smack.packet.Packet;
  9. public class TestSmack {
  10. public static void main(String[] args) throws XMPPException {
  11. ConnectionConfiguration config = new ConnectionConfiguration("127.0.0.1", 5222);
  12. XMPPConnection connection = new XMPPConnection(config);
  13. XMPPConnection.DEBUG_ENABLED = true;
  14. connection.connect();
  15. connection.login("admin", "admin");
  16. // ChatManager chatManager = connection.getChatManager();
  17. // chatManager.addChatListener(new ChatManagerListener(){
  18. // @Override
  19. // public void chatCreated(Chat chat, boolean arg1) {
  20. // chat.addMessageListener(new MessageListener(){
  21. // @Override
  22. // public void processMessage(Chat arg0, Message arg1) {
  23. // System.out.println(arg1.getBody());
  24. // }
  25. // });
  26. //
  27. // }
  28. // });
  29. connection.addPacketListener(new PacketListener(){
  30. @Override
  31. public void processPacket(Packet arg0) {
  32. System.out.println(arg0);
  33. }
  34. }, new PacketFilter(){
  35. @Override
  36. public boolean accept(Packet arg0) {
  37. return true;
  38. }
  39. });
  40. IQ iq = new IQ(){
  41. @Override
  42. public String getChildElementXML() {
  43. StringBuilder buf = new StringBuilder();
  44. buf.append("");
  45. return buf.toString();
  46. }
  47. };
  48. connection.sendPacket(iq);
  49. // Chat chat = chatManager.createChat("yangzc", new MessageListener(){
  50. // @Override
  51. // public void processMessage(Chat arg0, Message arg1) {
  52. // System.out.println(arg1.getBody());
  53. // }
  54. // });
  55. // chat.sendMessage("hello World!!!");
  56. // BufferedReader cmdIn = new BufferedReader(new InputStreamReader(System.in));
  57. // for(;;) {
  58. // try {
  59. // String cmd = cmdIn.readLine();
  60. // if("!q".equalsIgnoreCase(cmd)) {
  61. // break;
  62. // }
  63. // chat.sendMessage(cmd);
  64. // }catch(Exception ex) {
  65. // }
  66. // }
  67. connection.disconnect();
  68. System.exit(0);
  69. }
  70. }
复制代码


       总结:
  这里比较关键的一句话时是pdf:buf.append("");这句话指定了这个消息是发动到那个命名空间中。
  只有发送到openfire插件对应的命名空间中openfire插件才可以正确接收。
  至此openfire插件和smack的通信实现算是告一段落。剩下的工作就是xml了,不用说了吧,很简单的。

posted @ 2011-08-02 07:44 mmic.net.cn 阅读(602) 评论(0) 编辑

1. 除去JavaScript注释

除了注释,其他所有的 // or /* */ 注释都可以安全删除,因为它们对于最终使用者来说没有任何意义。

2. 除去JavaScript中的空白区域

如:x = x + 1; 可以简短得写成:x=x+1; 。

3. 进行代码优化

简单的方法如除去暗示的(implied)分号,某些情形下的变量声明或者空回车语句都可以进一步减少脚本代码。一些简略的表达方式也会产生很好的优化,例如:

x=x+1;

可以写成:

x++;

不过得小心谨慎,不然代码很容易出错。

4. 重命名用户自定义的变量和函数

为了阅读方便,我们都知道在脚本中应该使用象sumTotal这样的变量而不是s。不过,考虑到下载的速度,sumTotal这个变量就显得冗长了。这个长度对于最终使用者来说没有意义,但对浏览器下载则是个负担。这个时候s就成为较好的选择了。先写好方便阅读的代码,然后再使用一些工具来处理以供交付。这种处理方式在这里再一次展示了其价值所在。将所有的名称都重新用一个或两个字母来命名将带来显著的改善。

5. 改写内建(built-in)对象

长长用户变量名会造成JavaScript代码过长,除此之外,内建(built-in)对象(比如Window、Document、Navigator等)也是原因之一。例如:

alert(window.navigator.appName);
alert(window.navigator.appVersion);
alert(window.navigator.userAgent);

可以改写成如下简短的代码:

w=window;n=w.navigator;a=alert;
a(n.appName);
a(n.appVersion);
a(n.userAgent);

如果这几个对象使用频繁的话,这样改写带来的好处就不言而喻了。事实上这些对象也的确经常被调用。然而我要提醒的是,如果Window或 Navigator对象仅仅被使用了一次的话,这样的替换反而使代码变得更长。这个技巧带来一个对象更名后脚本执行效率的问题:除了代码长短上带来的好处,这种改写更名实际上还会稍微的提高一点脚本执行的速度,因为这些对象将会被放在所有被调用对象中比较靠前的位置。JavaScript游戏开发程序员使用这个技巧已经有多年了,下载和执行速度都会有所提高,并且对本地浏览器的内存花销也会降低,可谓一石三鸟。

6. 重构<script>和<style> 调用方式来优化请求次数

我们常常在一个HTML文件头中看到这样标记代码:

<script src="/scripts/rollovers.js"></script>
<script src="/scripts/validation.js"></script>
<script src="/scripts/tracking.js"></script>

大多数情况下,上述代码应该被简化成:

<script src="/0/g.js"></script>

其中pdfg.js包含了所有供全局使用的函数。虽然把脚本文件分成三份对于维护来说是有道理的,但对于代码的传输则没有意义。单个的脚本下载要比三个分离的请求高效的多,并且这也同时简化了markup代码的长度。

7. 合并你的javascript文件

尽可能的减少HTTP的Request请求数。

8. 将脚本放到网页底部

脚本一般是用来于用户交互的。所以如果页面还没有出来,用户连页面都不知道什么样子,那谈交互简直就是扯谈。所以,脚本和CSS正好相反,脚本应该放在页面的底部。

posted @ 2011-07-31 11:35 mmic.net.cn 阅读(65) 评论(0) 编辑

在使用ExtJs过程中,性能一直是一个比较头疼的问题,从用户的角度来看,就一个字:慢。从技术的角度来说,这个“慢”字可以分为两种,加载“慢”和渲染“慢”。想分辨这两种情况很容易:如果居于网不慢而互联网上慢,说明是加载慢;如果Chrome不慢而IE慢,就是渲染慢。还有另一种情况:越用越慢,这个“慢”通常是内存泄露造成的。

针对以下这三种情况讨论一下解决方案:

1,加载慢

1.1 减少要加载的东西

不要动不动就ext-all.js,extjs是可以定制的,如果你用不到tree,就不要包含这个组件了。ExtJs的官网上有详细的定制方法和工具。

1.2 给出合适的用户提示

把Js后置,然后前面做一个加载的提示。如果像Gmail那样给出进度条,或者像很多网游那样来点图片或者Tips啥的就更好了,说不定用户还会觉得怎么加载这么快,我还没看清楚呢,呵呵。

1.3 用的时候再加载

动态加载,参考使用ExtJs开发MIS系统(2):Js的动态加载。

1.4 只加载一次

别用iframe了,如果你的静态内容过期做的不好,浏览器会经常再不厌其烦的从服务器下载同样的东西。

1.5 对你的Js添加过期标记

ext-base.js、ext-all.js都可以设置很长的过期时间,甚至永不过期(如果你不换extjs的版本)。这点对所有静态内容都很有用,如何设置过期标记请垂询Google。

2,渲染慢

2.1 pdf少加载少解析、晚加载晚解析

1.1,1.3,1.4都对改善渲染慢的情况有效——加载的少了自然渲染的快了。

2.2 别用iframe

iframe不仅仅可能会使浏览器加载两遍,还一定会使浏览器解析两遍,放弃它吧,真的。

2.3 精心设计你的Js代码

例如缓存getElementByID()的结果、编译查询表达式之类的东西,这个纯看Js功力。

2.4 可能的话,让用户换个浏览器吧

Chrome比IE的Js渲染快是数量级上的差异!构造一个40列,50行的复杂GridPanel试试,你就会深有体会了……对于企业内部的MIS系统,换浏览器还是具有可能性的。

3,内存泄露
Ext性能调优方案

   1. 将JS进行合并压缩。

        使用yahoo的yui-compress.jar进行压缩JS,去掉过多的空格和注释,并合并,减少IO的支出。

     2. 将前后台传输的数据进行GZIP压缩。

        大数据量的数据传输,通过GZIP的压缩方案,可以减少到25%,有些数据可能会更多。

    3. 对大量的JS分析依赖关系,进行动态加载。

         这个是关键,通过分析所有的JS中的依赖关系,减少了JS加载的数量。从很大程度上提高了性能。

    4. 另外对部分页面进行缓存,而非真正的关闭。

 还有一个外部的因素,由于系统使用的客户机环境上的复杂,我们在多个浏览器上进行了测试,只有IE是最慢的,尤其是IE6,后来发现不是IE6要比IE7慢,是因为发现MS发布了脚本引擎cscript 5.7, 而大部分的ie6系统都装的是5.6, 这个版本上的升级,不仅仅是修改了BUG,在JS的执行速度上也有了较大的提升,于是我们在环境因素上又加上了一条,要求客户安装cscript5.7,也大大的提升了页面的打开时间。

posted @ 2011-07-31 11:34 mmic.net.cn 阅读(156) 评论(0) 编辑

减小代码在传输中的大小,就能提高页面的传输速度,打开网页也就快了。在一起PHP程序中 像WordPress是默认的gzip压缩功能是通过ob_gzhandler这个函数来实现的,ob_gzhandler是php 4.0.4新增的一个输出缓存函数,并通过gzip压缩后发送到客户端。这个函数需要zlib库支持,一般的虚拟主机都安装有这个库,所以很多blog都使用这个方法来实现对php页面的压缩。

那么对于我们这些没有开启mod_deflate模块的主机来说,就只能采用ob_gzhandler函数来压缩了,它的压缩效果和mod_deflate相比,相差很小,几乎可以忽略(但它只能对php文件进行压缩),下一篇文章将附上我对这几种方式的一个对比测试。

使用ob_gzhandler函数有3种方法让它对php进行压缩:
1、在php.ini中设置output_handler = ob_gzhandler
2、在.htaccess中加入php_value output_handler ob_gzhandler
3、在php文件头加上ob_start('ob_gzhandler');
第一种我们是没法办到,第二种方法不错,可以一劳永逸,一、二种方法效果都一样,就是对所有php后缀文件进行压缩。我这里主要介绍一下第三种方法,
就是试用CSS压缩法 例如对模板下的style.css进行压缩

1、把模板目录下的style.css复制一份出来,命名为style.css.php

接着在pdfstyle.css.php顶部加入这句:

< ?php if(extension_loaded('zlib')) {ob_start('ob_gzhandler');} header("Content-type: text/css"); ?>
在最后加上

< ?php if(extension_loaded('zlib')) {ob_end_flush();} ?>
(复制的时候去掉?php前的空格)

2、按照下面的方式修改header.php中的css连接

原来的:

<link rel="stylesheet" type="text/css" media="screen" href="/style.css"/>
修改后的:

<link rel="stylesheet" type="text/css" media="screen" href="/style.css.php"/>
搞定,现在你的CSS就可以被gzip压缩了。

JS也可以使用同样的方法,只是在xx.js.php头部加入的应该是这样:

< ?php if ( extension_loaded('zlib') ) {ob_start('ob_gzhandler');} header("Content-Type: text/javascript"); ?>
(复制的时候去掉?php前的空格)

仔细看看K2主题的中的JS,就是修改后缀为php后在顶部加入了ob_gzhandler函数。

所以我们可以用能压缩CSS 和JS的工具来对代码压缩 提高浏览速度~~~

posted @ 2011-07-31 11:33 mmic.net.cn 阅读(38) 评论(0) 编辑

Mashery于2011年7月25日发布了其I/O文档工具,这也是对Mashery API管理SaaS平台提供的新增支持。I/O文档旨在为开发人员提供一个接口,通过该接口可以直接在API文档中执行实时API调用,从而实现加速应用。

针对该工具及其特点,InfoQ对Mashery产品管理主管Neil Mansilla进行了采访。

InfoQ:什么是I/O文档?该项目的动因又是什么呢?

Mashery I/O文档是一种交互式的文档,可以帮助开发人员更加快速有效地理解和学习API。我们可以直接从API文档执行实时的API调用,相较干巴巴的静态示例这种方式可以提供实时的载荷数据。I/O文档能够帮助我们的客户和API提供者,这样发布的文档外观清晰、简洁,且在内容资源、方式方法和参数层面又能够做到细致入微。
在我们此前的调研中,我们了解到API文档通常缺乏方法上的专用性和API调用样例。使用Mashery I/O文档,对方法的分析,可深入到参数层次,从而为开发人员良好地定义并清晰地展现出来。至于API调用样例,I/O文档就是个实时样例生成器——通过实时API调用,开发人员能够创建自己直接可运行的样例。我们推出I/O文档的动因就是希望能够帮助我们客户的平台和开发人员取得成功。
下面列举了该工具其他一些对API提供者带来的好处:


- 清晰的API文档,测试、调试以及开发都集中在一起
- 缩短开发人员首次API调用时间
- 更快的应用开发
- 减少技术支持
- 具备一个强大的沟通渠道可供内部技术支持和芯、QA以及技术写手来实现与API变更的交流
- 确保API文档反应当前的API版本
- 清晰、优美的API文档设计
InfoQ: 该工具是否同样适用于公共API和企业内部API呢?是否支持非REST(non-RESTful)APIs?

Mashery I/O文档对私有企业API和公共API都适用。Mashery I/O文档目前支持RESTful APIs。很快I/O文档将实现对SOAP的支持。Mashery I/O 文档是可扩展的,并且能够适用于支持非标准的协议。
InfoQ:能否请您描述一下有关将一个传统API文档,比如Java文档,迁移到I/O文档的相关技术细节?

Mashery I/O文档使用一种JSON schema来描述API资源、方法和参数。该schema可被扩展来处理各种API的各种独到特征。创建一个面向I/O文档的JSON配置是最直截了当的方法。
InfoQ:还有什么有关IO文档未来发展蓝图是您觉得可以与社区分享的吗?

我们的I/O文档发展蓝图包括:提供补充加密方法的支持、支持SOAP、能够实现随地部署(甚至在Mashery环境堆栈以外)。

一些早期的I/O文档实现已经可以公开获得了,其中包括从Klout、Alibris以及Fanfeeder获取API文档。

posted @ 2011-07-30 22:01 mmic.net.cn 阅读(13) 评论(0) 编辑