十一月 16, 2007

=================================

ANDROID 技巧

运行模拟器
emulator -console

* 将文件写入到模拟器的userdata.img文件中
adb push <file> <dst file>

*将一个目录拷贝到模拟器中,包括子目录
adb push <source> <destination>

* 将一个目录从模拟器中拷出来
adb pull <source> <destination>

* 使得模拟器可以运行arm代码.
使用GNU/ARM Linux编译器编译你的应用程序就可以了

* 在模拟器里面运行shell,需要先运行模拟器
adb shell

*运行模拟器中的一个控制台程序
adb shell <Linux command>

*连接模拟器的控制台
telnet localhost 5554/6/8

运行C程序

参考文献

Native C “Hello World” working in emulator
http://groups.google.com/group/a … wse_thread/threa…

Native C Applications for Android
http://benno.id.au/blog/2007/11/13/android-native-apps

步骤
* 下载GNU/ARM编译工具
http://www.codesourcery.com/gnu_toolchains/arm/download.html

* 编写c/c++代码.

* 使用GNU/ARM Linux 工具创建一个应用程序,不使用动态链接库
ex. arm-none-linux-gnueabi-g++.exe -static -o hello HelloAndroid.cpp

* 启动模拟器
$SDK_ROOT/tools/emulator.exe

* 在命令行窗口运行 abd将编译好的hello程序放入模拟器的磁盘
adb push hello /system/sbin/hello

* 让hello文件变成可执行程序,不要使用 chmod ugo+x
adb shell chmod 777 /system/sbin/hello

* 运行hello程序
adb shell
cd /system/sbin/
hello

EXAMPLE HELLO WORLD CODE
//
// HelloAndroid.cpp
//
//

#include <iostream>
using std::cin;
using std::cout;
using std::endl;

class MyName
{
public:
void getname( void );
void sayhello( void );

private:
char name[ 255 ];

};

void MyName::getname( void )
{
cout << “What is your name? “;
cin >> name;

}

void MyName::sayhello( void )
{
cout << “Welcome ” << name << ” to the world of Android” << endl;

}

MyName name;

int main( int argc, char *argv[] )
{
name.getname();
name.sayhello();
return 0;
}

==============================================

十一月 9, 2007
 
public   bool   IsCorrenctIP(string ip)

  {  
   string pattrn=@”(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])”;
   if(System.Text.RegularExpressions.Regex.IsMatch(ip,pattrn)) 

   {
    return   true;  
   }
   else
   {
    return  
false;  
   
   }
  }

  public   bool   IsValidIP(string   ip)  
  {  
   if  
(System.Text.RegularExpressions.Regex.IsMatch(ip,”[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}”))  

   {  
    string[]   ips   =   ip.Split(’.');  
    if  
(ips.Length   ==   4   ||   ips.Length   ==   6)  
    {  

     if(System.Int32.Parse(ips[0])   <   256   &&  
System.Int32.Parse(ips[1])   <   256   &   System.Int32.Parse(ips[2])  
<   256   &   System.Int32.Parse(ips[3])   <   256)  

      return   true;  
     else  
      return   false;  

    }  
    else  
     return   false; 
   
   }  

   else  
    return   false;  
  }

Powered by ScribeFire.

十一月 7, 2007

为什么使用Lighttpd,从性能方面来说,首先考虑单进程与多进程问题,这也是我为什么不想使用Apache的原因,多进程服务器的惊群问题,简单来说
多进程服务(例如Apache)在一个请求发送时候会唤醒所有sleep的进程,但是最终服务的只有一个,在进程数目很多,请求频繁的时候这会造成一个大
困扰,系统会忙于切换进程,如果看Top会发现CPU使用在system的比例很高,至于Lighttpd则使用单进程来响应quest,使用
libevent,poll()作为event handler,如果在linux2.4下,还可以选择rtsig作为event
handler。如果不使用大文件(>4G)支持,lighttpd使用sendfile()来发送文件,完全的zero-copy,在这方面性能
表现是占优的。同时Lighttpd使用FastCGI来做动态脚本处理,经过实测,在性能表现上也可以接受。

另外就是原先使用Apache的用户迁移成本会比较少,Lighttpd语法与Apache接近,并且核心功能基本实现,我关注的就是
url_rewrite,PHP(这是当然的),alias,custom_log这几个模块,语法接近,并且也同样支持跟cronolog的管道配合日
志,所以迁移之后功能都可以实现。另外我比较了Apache和Lighttpd的Suexec方案,虽然目前Lighttpd并没有官方模块来支持这一特
性,但是就实现的难度来看,跟Apache1.3乃至Apache2+MPM差不多……(如果希望安全的使用Apache2+MPM+PHP,一样需要
FastCGI模式)

如此,我们就可以开始尝试了,首先是Lighttpd的下载,然后把PHP安装为cgi模式,你可能需要安装Libevent,如果需要url_rewrite支持,还需要pcre,安装基础安装可以看TutorialLighttpdAndPHP

安装PHP

./configure \
–prefix=/usr/local/php-cgi \
–enable-fastcgi \
–enable-discard-path \
–enable-force-redirect \
&&make \
&&make install

在php.ini里边修改你的设置

cgi.fix_pathinfo = 1

安装Lighttpd

./configure \
–prefix=/usr/local/lighttpd \
&& make \
&& make install

设定文件范例 PHP部分

fastcgi.server = ( “.php” =>
(( “socket” => “/tmp/php-fastcgi.socket”,
“bin-path” => “/usr/local/php-cgi/bin/php”,
“idle-timeout” => 30,
“min-procs” => 1,
“max-procs” => 1,
“bin-environment” => (
“PHP_FCGI_CHILDREN” => “1″,
“PHP_FCGI_MAX_REQUESTS” => “10000″ ),
“bin-copy-environment” => (
“PATH”, “SHELL”, “USER” ),
“broken-scriptfilename” => “enable”
))
)

一个简单的启动/停止脚本

#!/bin/shLIGHTTPD_CONFIG=/usr/local/apache04/conf/httpd.conf
LIGHTTPD_BIN=/usr/local/apache04/sbin/lighttpd
LIGHTTPD_PID=/usr/local/apache04/lighttpd.pid
test -r $LIGHTTPD_CONFIG || exit 6

case “$1″ in
start )
echo -n “Starting lighttpd”
$LIGHTTPD_BIN -f $LIGHTTPD_CONFIG
;;
stop )
echo -n “Shutting down lighttpd”
killall lighttpd
rm $LIGHTTPD_PID
;;
esac
exit 0

这样就可以跑起来了:)

Lighttpd

libevent

PCRE

Powered by ScribeFire.

Nginx 是一个轻量级的 http server,也可作为 proxy server 使用,由一个俄罗斯哥们儿开发并在一些高负载的站点上跑了2年多。许多人用它来搭建 Rails 应用,有的评测性能已经超过 lighty。Nginx 能快速响应静态页面的请求,支持 fastcgi、ssl、virtual host、rewrite、HTTP Basic Auth、Gzip 等,功能比较完备,配置文件也是类似 lighty 那种很简介的形式。

Nginx 和 PHP 一起应用应该也是个不错的搭配:
1. 第一步安装 Nginx,最新版本是 0.5.5,配置:

./configure         –sbin-path=/usr/local/nginx/nginx         –conf-path=/usr/local/nginx/nginx.conf         –pid-path=/usr/local/nginx/nginx.pid         –with-http_ssl_module

如果是需要 rewrite 模块的话,系统需要有 pcre-devel 类似的包,然后就是 make ; make install 。

2. 然后需要 PHP 有 fastcgi 的支持,编译的时候带上 –enable-fastcgi 这个选项。

3. 运行FastCGI server,有2种方法,一种是运行 PHP 自带的 FastCGI server,可以用类似的脚本来执行;一种是使用 spawn-fcgi 这样的工具(lighty网站上有下载),推荐用后者,使用很方便:

spawn-fcgi -a 127.0.0.1 -p 9000 -u jason -f /usr/bin/php-cgi 

4. 配置 Nginx,将 nginx.conf 中关于 PHP 支持那段按实际情况稍作修改即可:

location ~ .php$ {    fastcgi_pass   127.0.0.1:9000;    fastcgi_index  index.php;    fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;    include        conf/fastcgi_params;}

那个 include 的 conf 目录可以在源码包里复制过来。

5. 启动 nginx,访问 localhost,能看到一个大大的 Welcome to nginx!,再跑几个 PHP 应用试试。

更多的资料可以参考:Nginx English Wiki

Powered by ScribeFire.

一、) 安装Nginx
1.) 安装
Nginx发音为[engine x],是由俄罗斯人Igor Sysoev建立的项目,基于BSD许可。据说他当初是F5的成员之一,英文主页:http://nginx.net。俄罗斯的一些大网站已经使用它超过两年多了,一直表现不凡。
Nginx的编译参数如下:

[root@localhost]#./configure --prefix=/usr/local/server/nginx --with-openssl=/usr/include –with-pcre=/usr/include/pcre/ –with-http_stub_status_module –without-http_memcached_module –without-http_fastcgi_module –without-http_rewrite_module –without-http_map_module –without-http_geo_module –without-http_autoindex_module

在这里,需要说明一下,由于Nginx的配置文件中我想用到正则,所以需要 pcre 模块的支持。我已经安装了 pcrepcre-devel 的rpm包,但是 Ngxin 并不能正确找到 .h/.so/.a/.la 文件,因此我稍微变通了一下:

[root@localhost]#mkdir /usr/include/pcre/.libs/[root@localhost]#cp /usr/lib/libpcre.a /usr/include/pcre/.libs/libpcre.a[root@localhost]#cp /usr/lib/libpcre.a /usr/include/pcre/.libs/libpcre.la

然后,修改 objs/Makefile 大概在908行的位置上,注释掉以下内容:

./configure --disable-shared

接下来,就可以正常执行 makemake install 了。

2.) 修改配置文件 /usr/local/server/nginx/conf/nginx.conf
以下是我的 nginx.conf 内容,仅供参考:

#运行用户user  nobody nobody;

#启动进程worker_processes  2;

#全局错误日志及PID文件error_log  logs/error.log notice;pid        logs/nginx.pid;

#工作模式及连接数上限events {        use epoll;        worker_connections      1024;}

#设定http服务器,利用它的反向代理功能提供负载均衡支持http {        #设定mime类型        include       conf/mime.types;        default_type  application/octet-stream;

        #设定日志格式        log_format main         ‘$remote_addr - $remote_user [$time_local] ‘                                                ‘”$request” $status $bytes_sent ‘                                                ‘”$http_referer” “$http_user_agent” ‘                                                ‘”$gzip_ratio”‘;

        log_format download ‘$remote_addr - $remote_user [$time_local] ‘                                                ‘”$request” $status $bytes_sent ‘                                                ‘”$http_referer” “$http_user_agent” ‘                                                ‘”$http_range” “$sent_http_content_range”‘;

        #设定请求缓冲        client_header_buffer_size    1k;        large_client_header_buffers  4 4k;

        #开启gzip模块        gzip on;        gzip_min_length  1100;        gzip_buffers     4 8k;        gzip_types       text/plain;

        output_buffers   1 32k;        postpone_output  1460;

        #设定access log        access_log  logs/access.log  main;

        client_header_timeout  3m;        client_body_timeout    3m;        send_timeout           3m;

        sendfile                on;        tcp_nopush              on;        tcp_nodelay             on;

        keepalive_timeout  65;

        #设定负载均衡的服务器列表        upstream mysvr {                #weigth参数表示权值,权值越高被分配到的几率越大                #本机上的Squid开启3128端口                server 192.168.8.1:3128 weight=5;                server 192.168.8.2:80   weight=1;                server 192.168.8.3:80   weight=6;        }

        #设定虚拟主机        server {                listen          80;                server_name     192.168.8.1 www.yejr.com;

                charset gb2312;

                #设定本虚拟主机的访问日志                access_log  logs/www.yejr.com.access.log  main;

                #如果访问 /img/*, /js/*, /css/* 资源,则直接取本地文件,不通过squid                #如果这些文件较多,不推荐这种方式,因为通过squid的缓存效果更好                location ~ ^/(img|js|css)/  {                        root    /data3/Html;                        expires 24h;                }

                #对 “/” 启用负载均衡                location / {                        proxy_pass      http://mysvr;

                        proxy_redirect          off;                        proxy_set_header        Host $host;                        proxy_set_header        X-Real-IP $remote_addr;                        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;                        client_max_body_size    10m;                        client_body_buffer_size 128k;                        proxy_connect_timeout   90;                        proxy_send_timeout      90;                        proxy_read_timeout      90;                        proxy_buffer_size       4k;                        proxy_buffers           4 32k;                        proxy_busy_buffers_size 64k;                        proxy_temp_file_write_size 64k;                }

                #设定查看Nginx状态的地址                location /NginxStatus {                        stub_status             on;                        access_log              on;                        auth_basic              “NginxStatus”;                        auth_basic_user_file  conf/htpasswd;                }        }}

运行以下命令检测配置文件是否无误:

< pre>  如果没有报错,那么就可以开始运行Nginx了,执行以下命令即可:
< pre>  备注:conf/htpasswd 文件的内容用 apache 提供的 htpasswd 工具来产生即可,内容大致如下:
< pre #帐号 yejr,密码 123456 yejr:qLYyJ0ZRLAId2>  3.) 查看 Nginx 运行状态  输入地址 http://192.168.8.1/NginxStatus/,输入验证帐号密码,即可看到类似如下内容:
Active connections: 328server accepts handled requests9309 8982 28890Reading: 1 Writing: 3 Waiting: 324

第一行表示目前活跃的连接数
第三行的第三个数字表示Nginx运行到当前时间接受到的总请求数,如果快达到了上限,就需要加大上限值了。
第四行看不懂 :(

Powered by ScribeFire.

Nginx,它的发音为“engine X” 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Nginx
是由 Igor Sysoev
为俄罗斯访问量第二的 Rambler.ru
站点开发的,它已经在该站点运行超过两年半了。直到20074月,俄罗 斯大约有20%左右的虚拟主机是由nignx服务或代理的。Google在线安全博客中统计nginx服务或代理了大约所有Internet虚拟主机的4%。而netcraft的统计显示,nginx服务的主机在过去的一年里以四倍的速度增长。短短的几年里,它的排名已跃进第9(参见:http://survey.netcraft.com/Reports/200707/)

 

现在,Igor
将源代码以类BSD许可证的形式发布。Nginx因为它的稳定性、丰富的模块库、灵活的配置和低系统资源的消耗而闻名.业界一致认为它是Apache2.2mod_proxy_balancer的轻量级代替者,不仅是因为响应静态页面的速度非常快,而且它的模块数量达到Apache的近2/3。对proxy
rewrite
模块的支持很彻底,还支持mod_fcgissl
vhosts ,适合用来做mongrel clusters的前端HTTP响应。

 

nginx做为HTTP服务器,有以下几项基本特性:

<!–[if !supportLists]–>处理静态文件,索引文件以及自动索引;打开文件描述符缓冲.

<!–[if !supportLists]–>无缓存的反向代理加速,简单的负载均衡和容错.

<!–[if !supportLists]–>FastCGI,简单的负载均衡和容错.

<!–[if !supportLists]–>模块化的结构。包括gzipping, byte ranges, chunked responses,
以及 SSI-filterfilter。如果由FastCGI或其它代理服务器处理单页中存在的多个SSI,则这项处理可以并行运行,而不需要相互等待。

<!–[if !supportLists]–>支持SSL TLS
SNI

 

Nginx专为性能优化而开发,性能是其最重要的考量,
实现上非常注重效率 。它支持内核Poll模型,能经受高负载的考验,
有报告表明能支持高达 50,000
个并发连接数。

 

Nginx具有很高的稳定性。其它HTTP服务器,当遇到访问的峰值,或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应,只能重启服务器。例如当前apache一旦上到200个以上进程,web响应速度就明显非常缓慢了。而Nginx采取了分阶段资源分配技术,使得它的CPU与内存占用率非常低。nginx官方表示保持10,000个没有活动的连接,它只占2.5M内存,所以类似DOS这样的攻击对nginx来说基本上是毫无用处的。就稳定性而言,
nginx
lighthttpd更胜一筹。

 

Nginx支持热部署。它的启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下,对软件版本进行进行升级。

 

Nginx采用master-slave模型,
能够充分利用SMP的优势,且能够减少工作进程在磁盘I/O的阻塞延迟。当采用select()/poll()调用时,还可以限制每个进程的连接数。

 

Nginx代码质量非常高,代码很规范,
手法成熟, 模块扩展也很容易。特别值得一提的是强大的UpstreamFilter链。 Upstream为诸如reverse proxy,
与其他服务器通信模块的编写奠定了很好的基础。而Filter链最酷的部分就是各个filter不必等待前一个filter执行完毕。它可以把前一个filter的输出做为当前filter的输入,这有点像Unix的管线。这意味着,一个模块可以开始压缩从后端服务器发送过来的请求,且可以在模块接收完后端服务器的整个请求之前把压缩流转向客户端。

 

Nginx采用了一些os提供的最新特性如对sendfile (Linux
2.2+)
accept-filter (FreeBSD
4.1+)
TCP_DEFER_ACCEPT (Linux 2.4+)
的支持,从而大大提高了性能。

 

当然,nginx还很年轻,多多少少存在一些问题,比如:

<!–[if !supportLists]–>Nginx是俄罗斯人创建,目前文档方面还不是很完善.因为文档大多是俄语,所以文档方面这也是个障碍.

<!–[if !supportLists]–>尽管nignx的模块比较多,但它们还不够完善。

<!–[if !supportLists]–>对脚本的支持力度不够。

 

这些问题,nginx的作者和社区都在努力解决,我们有理由相信nginx将继续以高速的增长率来分享轻量级HTTP服务器市场,会有一个更美好的未来。

Powered by ScribeFire.

十一月 6, 2007

         
Web2.0无论在国内外的IT界都是热门话题,我都没想到前几天的那篇“谁是中国未来十年的Web2.0英雄”会是那么hot的一篇文章,估计我今天这个惹眼的blog标题也会让这篇blog很火热:)。国内很多对Web2.0的讨论都是在理论层面上的,而今天看到的这篇blog则是从操作层面上阐述如何创建一个成功的Web2.0网站,其中谈论的一些手法值得国内的Web2.0公司去借鉴。

1、为用户解决一个“小”问题,并清楚地知道你要解决的是什么问题。我的理解就是从一个小处着眼,而这个小处恰恰是用户需求没有得到满足的地方。比如文章中举的Google的例子,Google开始只是为解决大家资料搜索的困难(不过Google算Web2.0网站吗?呵呵),比如Flickr就是为了解决大家图片的存储与共享的困难,从这样针对性的“小处”开始,能够一针见血地吸引到用户来使用你的服务。

2、找到负责任而且积极参与讨论的用户。拥有这些投入的用户是你最大的财富,他们会不停地提出各种改进建议,让你的服务变得更加完美。

3、尽早推出。不要等到服务“完美”了之后再推出,而是让你的用户去帮助你完善服务,通过用户的完善才是真正尊重用户体验与用户需求的完善,比你闭门造车的结果要好得多。而且持续有新的功能推出反而会更加吸引到你的用户继续使用。而在服务推出后,则要不断地完善,就如keso在blog中提到的永远的测试版的概念。

4、让用户可随处使用你的服务。不要让你的用户只有在你的网站上才能享受到你的服务,而要让你的用户在任何地点都可以有使用你的服务的方式,就如del.icio.us的Linkroll功能,Flickr的blog发布功能,豆瓣的在自己blog上发布的功能,365key的昨日新闻功能等等。

5、不要违背用户的意愿。如果用户想离开,就大大方方地为他们的离开提供可行的方式,将重点放在提升网站的服务与用户的体验,让用户自己愿意回来,而不是让他们不得不继续使用你的服务。

6、简单就是美。为用户提供最简单但能够满足他们需求的方式。

7、用免费的服务吸引与挽留用户,不要急于收费。

8、不要在市场推广上浪费金钱。互联网与blog的普及已经让口耳相传的成本变得很低,只要你的服务能够让用户满意,他们就会主动替你在blog上宣传,为你带来病毒营销的力量。

9、不要过度融资。资金不足当然是个问题,但过度融资可能会让你的目标膨胀,业务多元化,放弃了自己最核心的产品和竞争力。

10、没有人一无是处。你需要认真地研究和对待每一个竞争者,借鉴他们的优势和强项,没有任何竞争者是一无是处不值得你学习的。

PS.因为只是简单的意译,建议大家有空的话也可以认真读一读原文以及下面的留言讨论。

Powered by ScribeFire.

十一月 2, 2007
FireBug 是一个非常实用的JavaScript以及DOM查看调试工具,是 Firefox 的一个插件。使用 FireBug 调试 AJAX 应用非常方便,终于可以告别 alert 时代了!

Console Logging 函数

FireBug 为所有 Web 页面提供了一个 console 对象。这个对象有以下函数:

Logging 基础

console.log(”message” [,objects]) - 将一个字符串打印到控制台。字符串可以包含任何“String Formatting”小节描述的模式。字符串后面的对象应该用来取代之前字符串中的模式。(译者注:大家用过C里面 printf 吧,效果基本是一样的。)

Logging 等级

通常根据不同的等级来区分Logging的严重程度是很有帮助的。FireBug 提供了4个等级。为了达到视觉分离的效果,这些函数与 log 不同的地方就是它们在被调用的时候会自动包含一个指向代码行数的链接。

console.debug(”message” [,objects]) - 记录一个 debug 消息。
console.info(”message” [,objects]) - 记录一个信息.
console.warn(”message” [,objects]) - 记录一个警告.
console.error(”message” [,objects]) - 记录一个错误.

断言

断言是一条确保代码规则的非常好的途径。console 对象包含了一系列各种类型的断言函数,并且允许你编写自己的断言函数。

console.assert(a, “message” [,objects]) - Asserts that an a is true.
console.assertEquals(a, b, “message” [,objects]) - Asserts that a is equal to b.
console.assertNotEquals(a, b, “message” [,objects]) - Asserts that a is not equal to b.
console.assertGreater(a, b, “message” [,objects]) - Asserts that a is greater than b.
console.assertNotGreater(a, b, “message” [,objects]) - Asserts that a is not greater than b.
console.assertLess(a, b, “message” [,objects]) - Asserts that a is less than b.
console.assertNotLess(a, b, “message” [,objects]) - Asserts that a is not less than b.
console.assertContains(a, b, “message” [,objects]) - Asserts that a is in the array b.
console.assertNotContains(a, b, “message” [,objects]) - Asserts that a is not in the array b.
console.assertTrue(a, “message” [,objects]) - Asserts that a is equal to true.
console.assertFalse(a, “message” [,objects]) - Asserts that a is equal to false.
console.assertNull(a, “message” [,objects]) - Asserts that a is equal to null.
console.assertNotNull(a, “message” [,objects]) - Asserts that a is not equal to null.
console.assertUndefined(a, “message” [,objects]) - Asserts that a is equal to undefined.
console.assertNotUndefined(a, “message” [,objects]) - Asserts that a is not equal to undefined.
console.assertInstanceOf(a, b, “message” [,objects]) - Asserts that a is an instance of type b.
console.assertNotInstanceOf(a, b, “message” [,objects]) - Asserts that a is not an instance of type b.
console.assertTypeOf(a, b, “message” [,objects]) - Asserts that the type of a is equal to the string b.
console.assertNotTypeOf(a, b, “message” [,objects]) - Asserts that the type of a is not equal to the string b.

测量(Measurement)

下面的一些函数可以让你方便的测量你的一些代码。

console.trace() - 记录执行点的堆栈信息。
console.time(”name”) - 根据 name 创建一个唯一的计时器。
console.timeEnd(”name”) - 根据 name 停止计时器,并且记录消耗的时间,以毫秒为单位。
console.count(”name”) - 记录该行代码执行的次数。

字符串格式化

所有 console 的 logging 函数都可以通过以下模式格式化字符串:

%s - 将对象格式化为字符串。
%d, %i, %l, %f - 将对象格式化为数字。
%o - 将对象格式化成一个指向 inspector 的超链接。
%1.o, %2.0, etc.. - 将对象格式化成包含自己属性的可交互的表格。
%.o - 将对象格式化成具有自身属性的一个数组。
%x - 将对象格式化成一个可交互的 XML 树形结构。
%1.x, %2.x, etc.. - 将对象格式化成一个可交互的 XML 数型结构,并且展开 n 层节点。

如果你需要一个真实的 % 符号,你可以通过一个转移符号就像这样 “\%”。

命令行函数

内建的命令行函数可以通过以下命令行使用:

$(”id”) - document.getElementById() 的简写。(译者注:跟 prototype.js 学来的吧?)
$$(”css”) - 返回一个符合 CSS 选择器的元素数组。
$x(”xpath”) - 返回一个符合 XPath 选择器的元素数组。
$0 - 返回最近被检查(inspected)的对象。
$1 - 返回最近被检查(inspected)的下一个对象。
$n(5) - 返回最近被检查的第n个对象。
inspect(object) - 将对象显示在 Inspector 中。
dir(object) - 返回一个对象的属性名数组。(译者注:跟 Python 学的?)
clear() - 清除控制台信息。

Powered by ScribeFire.