[转载]BlazeDS 整合 Flex HelloWorld 示例

mikel阅读(1199)

[转载]BlazeDS 整合 Flex HelloWorld 示例 – hoojo – 博客园.

开发环境:

System:Windows

WebBrowser:IE6+、Firefox3+

JavaEE Server:tomcat5.0.2.8、tomcat6

IDE:eclipse、MyEclipse 8

Flex IDE:Flash Builder 4

BlazeDS:4.5

开发依赖库:

JavaEE5、blazeDS 4.5

Email:hoojo_@126.com

Blog:http://blog.csdn.net/IBM_hoojo

http://hoojo.cnblogs.com/

一、准备工作

1、 首先要提供相关的jar包

Java服务器端需要提供BlazeDS相关的配置和jar包

下载地址:http://opensource.adobe.com/wiki/display/blazeds/download+blazeds+trunk

下载后,解压你可以看到这样的一个目录

clip_image002

Docs就是文档

Resource是源码

SampleDB是示例用的数据库,可以运行startdb.bat来启动数据库

Tomcat是内置的tomcat,如果你没有tomcat的话可以使用它,在tomcat的webapps目录中有samples示例

blazeds.war就是blazeDS的核心文件、库,你可以把这个war放到tomcat的webapps目录下,就会自动解压。当然你也可以自己手动解压。

Blazeds-spring.war是和spring整合的配置

Ds-console.war是blazeDS的控制台程序

Samples.war是官方提供的示例

Samples-spring.war是spring和blazeDS的整合示例

二、部署服务器端程序

1、新建一个JavaWeb Project工程,然后在WEB-INF/lib目录中添加如下jar包

clip_image004

这些jar包可以在blazeds.war包中的lib目录中可以找到

2、 然后你需要将blazeds.war包中的WEB-INF目录下的flex目录复制到当前工程的WEB-INF下

3、 将blazeds.war包中的WEB-INF目录下的web.xml的配置,添加到当前工程的web.xml文件中

4、 最后基本的样式如下

clip_image006

5、 最后你发布当前工程,如果没有错误就表明你服务器端部署成功了。

6、 编写一个HelloWorld的java程序。代码如下

package com.hoo.flex;

/**
 * <b>function:</b> HelloWorld Example
 * @author hoojo
 * @createDate 2011-8-31 下午06:11:27
 * @file HelloWorld.java
 * @package com.hoo.flex
 * @project BlazeDSServer
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email hoojo_@126.com
 * @version 1.0
 */
public class HelloWorld {

    public HelloWorld() {
    }

    public String sayHello(String name) {
        return "[" + name + "] say hello!";
    }
}

就一个sayHello方法,接收一个参数。

三、Flex客户端程序

1、创建一个Flex工程,在选择服务器技术的时候,你需要选择J2EE。然后勾上使用J2EE技术,然后选择BlazeDS。点击Next下一步

clip_image008

2、配置根文件夹,也就是JavaEE服务器端发布程序在tomcat中的位置。我这里是在tomcat的webapps的 BlazeDSServer中,BlazeDSServer是我的服务器端程序。根URL是访问服务器端程序的url;上下文目录对应工程名称;最后就是 输出文件夹目录,这个是Flex的文件最后在tomcat中保存的目录。

clip_image010

3、最后你需要设置服务器端的services-config.xml的路径到编译参数中,这个很重要!如果你不设置的话,那么你在后面用RemoteObject调用BlazeDS的时候,就需要设置endpoint。设置如下:

clip_image012

-services是参数键,后面的字符串是值。我这里是设置BlazeDSServer发布到tomcat目录中的services-config.xml的路径。

4、编译Flex前端代码,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" viewSourceURL="BlazeDSHelloWorld.mxml" layout="absolute" minWidth="955" minHeight="600">
    <mx:Script>
        <![CDATA[
            import mx.controls.Alert;
            import mx.rpc.AsyncToken;
            import mx.rpc.events.ResultEvent;

            private function faultHandler(event: Event): void {
                Alert.show(event.toString(), event.type);
            }

            private function resultHandler(event: ResultEvent): void {
                //event.result是服务器端返回对象
                result.text = "Message:" + event.result.toString();
            }

            private function sendHandler(): void {
                helloRemoteObject.sayHello(userName.text);
            }
        ]]>
    </mx:Script>

    <!-- 当工程没有设置编译器-service参数 或是-context-root等参数,就需要手动设置endpoint参数 -->
    <mx:RemoteObject
        id="helloRemoteObject"
        destination="helloWorld"
        fault="faultHandler(event)"
        result="resultHandler(event)"
        showBusyCursor="true"/>
    <mx:Panel x="10" y="10" width="272" height="148" layout="absolute" title="BlazeDS Remote HelloWorld Sample">
        <mx:Label x="10" y="22" text="请输入名称"/>
        <mx:TextInput x="70" y="19" id="userName"/>
        <mx:Button x="184" y="45" label="发送" click="sendHandler()"/>
        <mx:Text x="10" y="79" id="result"/>
    </mx:Panel>
</mx:Application>

首先你需要将Java服务器端的HelloWorld程序配置在flex的remoting-config.xml中,配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<service id="remoting-service"
    class="flex.messaging.services.RemotingService">

    <adapters>
        <adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/>
    </adapters>

    <default-channels>
        <channel ref="my-amf"/>
    </default-channels>

    <destination id="helloWorld">
        <properties>
            <source>com.hoo.flex.HelloWorld</source>
        </properties>
    </destination>
</service>

上面mxml代码中的RemoteObject的destination对应的就是remoting-config.xml配置文件中的 destination的id。这个是一一对应的,然后在sendHandler方法中,helloRemoteObject对应的就是 RemoteObject的id,而sayHello方法对应的就是配置在remoting-config.xml中的destination的 source的Java服务器端代码的公有方法。添加完配置后,需要重启tomcat。

运行上面的flex程序后,如果输入参数后,点击发送,可以看到服务器端返回的消息就说明BlazeDS整合Flex成功了。

[转载]百度地图API详解之地图标注

mikel阅读(1201)

[转载]百度地图API详解之地图标注 – jz1108 – 博客园.

详解系列

本文将向大家介绍百度地图API的标注(Marker)的使用方法和一些实现细节。

标注概述

标注(Marker)是用来表示一个点位置的可见元素,每个标注自身都包含地理信息。比如你在西单商场位置添加了一个标注,不论地图移动、缩放,标注都会跟随一起移动,保证其始终指向正确的地理位置。

从上面的图可以看出,不论地图如何变化标注始终指向“西单商场”的位置。

如何知道某个点的坐标?

上例中我们在西单商场位置添加了一个标注,那么我是如何知道它的坐标点呢?可以通过API的事件机制来获取:

map.addEventListener('click', function(e){
    console.log(e.point);
});

我们在map对象上添加了一个click事件的监听函数,当点击地图上某个位置时,监听函数通过控制台把当前点击的位置输出出来(注意需要有控制台 的支持,比如firebug,如果没有控制台则可使用alert把point的lng和lat属性输出出来)。此外,你也可以使用API提供的坐标拾取工 具来完成(http://dev.baidu.com/wiki/static/map/API/tool/getPoint/),它支持检索并且点击地图上任意位置时会出现该位置的坐标。

标注元素组成

从DOM元素构成角度看,一个完整的标注是由以下几个部分组成的:

  • 标注点击区域
  • 标注图标
  • 标注阴影

下面是示意图:

在地图API实现中,这三个DOM元素分别位于不同的容器中,这些容器可以通过map.getPanes()方法获得,其中 markerMouseTarget就是标注点击区域所在容器、markerPane为标注图标所在容器,markerShadow为标注阴影所在图层。 你可能会在自定义覆盖物时需要这些容器对象,这里只需要知道Marker的各个部分是如何放置的即可。

自定义标注图标

标注的图标是可以自定义的,通过Icon类可以自定义标注的图标,比如我希望使用下面这个图片作为标注图标:

已知这个图标大小为20×32。我们初始化地图,接着定义Icon,并赋给一个Marker实例:

var map = new BMap.Map('container');
map.centerAndZoom(new BMap.Point(116.380797, 39.918497), 18);

var icon = new BMap.Icon('pin.png', new BMap.Size(20, 32), {
    anchor: new BMap.Size(10, 30)
});

var mkr = new BMap.Marker(new BMap.Point(116.38075,39.918986), {
    icon: icon
});

map.addOverlay(mkr);

我们给定icon所需图片的url,接着是图片的尺寸,另外我们还增加了anchor属性,这个是干什么用的呢?在自定义标注图标时有一点需要注意 的就是标注的定位点(anchor),通俗的讲就是要指定图片的哪个位置是与标注真正的位置对应在一起。我们通过下面的图示来说明:

我们获取到地图上一个位置(上图中标注下端所在的黑色小方块),那么我也希望我标注中间下端指向这个位置,这个就需要通过anchor来调节。anchor的意义如下图所示:

即定位点距离图片左上角的偏移量。

如果不给anchor的话,API会自动获取图片中心点作为anchor位置:

我们看到标注图片中心的位置覆盖在那个小方块区域。

除了anchor之外,还有一个infoWindowAnchor属性,它是用来控制信息窗口开启的位置的(注意这里调用的是Marker的 openInfoWindow方法,而不是Map的openInfoWindow方法),默认情况下它和icon的anchor是一个位置:

标注被InfoWindow的底角挡住了,通过infoWindowAnchor属性就可以改变开启位置:

var icon = new BMap.Icon('pin.png', new BMap.Size(20, 32), {
    anchor: new BMap.Size(10, 30),
    infoWindowAnchor: new BMap.Size(10, 0)
})

再看看效果:

尖角位置已经发生了改变。

标注拖拽

标注支持拖拽,并且可以配置是否有动画效果,我们修改创建标注的代码:

var mkr = new BMap.Marker(new BMap.Point(116.38075,39.918986), {
    icon: icon,
    enableDragging: true,
    raiseOnDrag: true
});

这里开启了拖拽功能以及响应的动画效果。如果此时拖拽地图你会得到如下效果:

通过监听标注的dragend事件,你可以知道拖拽结束后标注的地理位置:

mkr.addEventListener('dragend', function(e){
    alert(e.point.lng + ', ' + e.point.lat);
})

标注阴影

为了增加立体感,可以单独给标注添加阴影,当然你也可以把阴影直接画在icon所用的图片上,但是由于阴影和标注本身在一起,所以就不建议使用任何 动画效果,否则会缺乏真实感。阴影可以通过MarkerOptions的shadow属性配置,类型也是一个Icon实例。具体使用方法和icon属性一 样,这里就不赘述了。

[原创]ASP.NET MVC IIS6上部署教程

mikel阅读(844)

部署步骤:

1.IIS 建立站点,设置 ASP.NET 版本为2.0

2.IIS站点权限属性设置ISUse_来宾账号为读取权限

3.在IIS6上建一个站点,然后在站点属性中的“主目录”–》“配置” ,将打开如下窗口:

在下方的“通配符应用程序映射”中插入一个映射,可执行文件交给.NET的“aspnet_isapi.dll”,默认地址一般在“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll”

4.查看IIS的Web扩展是否存在ASP.NET 2.0的扩展并启用,如果没有大概是因为IIS版本过低导致的,可以选中添加扩展,输入扩展名字

选择扩展文件为C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll

[转载]13 个 WordPress 提速技巧

mikel阅读(949)

[转载]13 个 WordPress 提速技巧.

性能是一个网站成功的非常关键因素,任何人都不喜欢访问速度超慢的网站。WordPress 的开放性造就 WordPress 有着成千上万的插件,使得 WordPress 比以其他 CMS 程序更受欢迎,但是开放也在一定程度上使得 WordPress 的性能不是很好,所以当你发现你的 WordPress 站点性能很差,你应该尝试通过下面的方式去优化它:

一些最基本,简单的提速方法

1. 更新 WordPress 到最新的发行版本

WordPress 每次版本的升级都有对性能的改进,所以升级到 WordPress 最新的发行版本是改进性能的第一步。

2. 删除没用的插件和更新正在使用的插件

删除任何你不再使用的插件,并从服务器上删除它们,这样会明显加速 WordPress 速度,因为 WordPress 运行的时候会检查每个插件是否被启用,并且导入激活的插件。

另外最好把现在使用的插件更新到最新版本,因为插件的开发者发布新版本一般来说他们应该是在某种程度上优化了插件工作效率。

3. 最小化 PHP 和数据库查询

如果每次导入你服务器上的一个页面,服务器都要执行 PHP 语句和数据库查询,这样速度是不会快的,如果你把一些 PHP 语句直接改成静态的 HTML 代码,这样每次导入页面,浏览器只要读取 HTML 就好了。

4. 使用 PHPmyAdmin 优化和修复数据库

我们至少应该每个星期登陆 PHPMyAdmin 去优化下数据库,选择 WordPress 数据库,选择所有的表,选择优化数据表和修复,你会惊奇的发现这个技巧的效果非常好,它节省了数据库的 10% 的空间,并且效率也提高了。

PHPMyAdmin Optimize Table
使用 PHPmyAdmin 优化和修复数据库

优化图片和其他静态文件

5. 使用可靠的图片存储服务

可以尝试把一些常用的网页图片,CSS,JavaScript 和其他一些静态文件存到 Amazon S3 这样的存储服务中,你会发现服务器的 CPU 时间和内存使用会下降很多,这里有一个 Amazon S3 的向导

Amazon S3
使用 Amazon S3 存储图片

不过 Amazon 的 S3 存储服务收费的,价格虽然比较低的,但是个人感觉还是不特别适合国内的 blogger。

6. 通过 Shrink O’Matic 这个工具来优化图片

Shrink O’Matic 是一个 AIR 程序,它能非常容易批量修改图片,并且支持 JPG, GIF 和 PNG 格式。只要简单的拖拉图片,它就能帮你修改图片的大小,另外它还有一些选项,让你能够选择输出大小,名字和格式。

Shrink O’Matic
Shrink O’Matic

全面提高性能

7. 安装 WP Super Cache 插件

关于 WP Super Cache 这个插件,我已经有详细的介绍。这里简单说,就是它能够产生静态的 HTML 文件,这些 HTML 文件产生之后,你的服务器就不用再去运行 PHP 脚本和数据库查询,所以它能够明显的加快你的博客速度。

8. PHP Speedy WP

PHP Speedy WP 能 够会自动把所有的 JS 和 CSS 文件组合成两个文件,这样就非常简单的加速 WordPress 站点和提高你的博客的响应时间。并且 CSS 的背景图片被转换成 data URIs,就大大降低了 HTTP 请求,并且重要的是,它和 IE 兼容,尽管 IE 不支持 data URIs。但是不幸的是,PHP speedy 还有一些缺陷,组装之后的 JavaScript 文件是放在页面顶部而不是底部,所以这个会在 WP Super Cache 开启的时候不工作,当然了已经有人提供了解决方案

PHP Speedy WP
PHP Speedy WP

9. WP CSS

这个插件会 GZIP 压缩和删除 CSS 文件中的空白,并且会把 style.css 文件中的 @import 直接放入,这个插件还可以设置 CSS 文件的缓存过期时间。

10. DB Cache

DB Cache 这个插件在给定的时间内可以缓存数据库的每一次查询,并且速度很快,而且只用到很少的磁盘空间用于缓存。

11. 使用 Google 的 AJAX Libraries API 来提速

AJAX Libraries API 就是 Google 把一些非常流行 Javsacript 框架(JQuery, prototype, script.aculo.us, MooTools, dojo)放到 Google 的服务器上,使得大家可以充分使用 Google 的服务器资源之外,更重要的是能够提高你的速度。另外WordPress 也有 AJAX Libraries 相关的插件

12. 显示页面导入时间和查询次数

这里有段代码能够让你插入到你的模板中让你知道页面导入的时间,和有多少数据库查询,这个技巧能够让你知道你博客优化的程度。

<?php timer_stop(1); ?>  秒钟有 <?php echo get_num_queries(); ?> 次查询。

13. Optimize DB

MySQL 是一个非常好的数据库,但是它不能自己整理和清理碎片和垃圾。Optimize DB 这个插件可以运行优化数据库的命令,加速你的 WordPress 数据库的速度,这里有一篇关于 Optimize DB 插件的详细介绍。

原文:link

[转载]最佳 WordPress 缓存插件:WP Super Cache

mikel阅读(749)

[转载]最佳 WordPress 缓存插件:WP Super Cache.

WP Super Cache 是 WordPress 官方开发人员 Donncha 开发,是当前最高效也是最灵活的 WordPress 静态缓存插件。它把整个网页直接生成 HTML 文件,这样 Apache 就不用解析 PHP 脚本,通过使用这个插件,能使得你的 WordPress 博客将显著的提速。

WP Super Cache 基本介绍

WP Super Cache 是基于 Ricardo Galli Granada 的 WP-Cache 2。WP-Cache 2 可以缓存你的 WordPress 博客使得不用再次访问数据库,但是它产生的是 PHP 文件而不是 HTML 文件,所以还需要 PHP 引擎去解析它们。而 WP Super Cache 则直接产生 HTML 文件,所以服务器不用解析甚至一行 PHP 代码,所以缓存之后的速度就和访问你服务器上的一张图片一样快。

WP Super Cache 是如何工作的

一半常规的缓存办法是手工把动态页面保存为 HTML 代码,WP Super Cache 也是通过同样的方式的,但是通过自动的方式完成这个过程。

当你一个访问者来的你的站点,他没有登入或者也没有留言,这样他得到是一个在 WordPress cache 文件夹下的 supercache 子文件夹下的纯静态文件,其实你都可以自己到上面的 supercache 目录下去查看同样的永久链接的 HTML 文件的备份。判断一个页面是否已经被缓存了,查看该页面的源代码,看看最后一行是否有 <!– super cache –> 或者 <!– super cache gz –>。

如果访问者已经登陆或者留了言,就会返回 WP Cache 函数生成的页面,并且最后一行会有 <!– Cached page served by WP-Cache — >

WP Super Cache 基本使用

上传 WP Super Cache 到插件目录,并在 Plugin 目录下激活之后,就可以到 Setting > WP Super Cache 进行详细配置。

WP Super Cache Status

首先是三个选项:

  • ON (WP Cache and Super Cache enabled)
  • HALF ON (Super Cache Disabled, only legacy WP-Cache caching.)
  • OFF (WP Cache and Super Cache disabled)

默认情况下,WP Super Cache 是没有开启的,所以在这里选择下,需按则第一个,就是 Super Cache,缓存为静态文件,如果第二种情况呢,则和 WP-Cache 一致。

Proudly tell the world your server is Digg proof! (places a message in your blog’s footer)
这个是说在你的 footer 显示一条信息告诉读者该博客已经缓存了,一般不要这样做。

Clear all cache files when a post or page is published. (This may significantly slow down saving of posts.)
这个是说发布新日志的时候清理所有缓存,这个肯定不能这么干了。

Super Cache Compression

启动这个则会成生 gzip 压缩,节省你的带宽。

Mod Rewrite Rules

WP Super Cache 是通过 Mod Rewrite 实现访问静态文件的,所以这里在是显示添加的 Mod Rewrite 规则。

Expiry Time and Garbage Collection

过期时间和垃圾收集,这里主要设置缓存文件过期时间,和多久删除一次过期的缓存文件。个人建议:一般缓存时间设置为1天(86400)左右,缓存删除时间为1个小时一次。

Accepted filenames, rejected URIs

这里设置一些链接不需要缓存,并且可以设置特例。

Rejected User Agents

这里设置某些 User Agents 来访问的时候不会缓存。比如 Google 和百度爬虫等。

Cache Contents

这里显示你博客缓存文件和过期文件的数量,你可以手工删除缓存文件和过期文件,因为 WP Super Cache 有垃圾回收机制,所以这里不帮不用手工删除,如果当你测试某个插件,看不到效果的时候,如果确定是缓存的原因,你可以到这里手工删除测试下。

Lock Down

一般情况下,某篇日志如果有了新留言,就会更新缓存文件,不过这篇日志是否已经到了缓存时间,但是在某种情况,你预料到你的博客可能会有很大流量和留言,候重复更新缓存文件可能并不是很好的选择,速度反而更慢,这个时候你就可以锁定缓存文件,新留言不再更新缓存日志。

插件作者也给出了一段代码,如果你的博客锁定了之后,可以通过判断一个变量 WPLOCKDOWN 是否存在告来诉读者,你博客已经锁定,待会才会更新,当然了,一般博客不建议使用。

Directly Cached Files

直接缓存文件,根据永久链接直接缓存,比如你的关于页面是不太更新,你就可以直接缓存它到你的 about 目录下(假如你的关于页面的 slug 是 about),这个直接缓存不会过期。适合一些经常性不更新的静态页面。

Configuration messed up?

因为上面那么多配置,你可能搞糊涂了,那么这里可以让你一键恢复到默认。

Cache Plugins

缓存插件还支持附加插件,比如作者自己就提供一个插件:No Adverts for Friends,不对朋友显示广告。

附加说明

  • 登陆了和留言之后是看不到静态缓存页面的,看到的效果和原来的 WP-Cache 插件一样的,一般来说留言的同学不是那么多。
  • 这个插件通过 Mod Rewrite 来是实现访问静态缓存页面,所以首先你的主机要支持 Mod Rewrite,然后你要在 WordPress 后台启动永久链接。
  • 一些动态的时时更细的插件,如 Recent Comments,Recent Posts 等,一个很好的解决方法是通过 JavaScript 来实现。所以同理 Sidebar 更新也只能在静态页面刷新的时候更新。我以后会讲解下如何实现 JS 实现 Recent Comment, Recent Post, 和 PostViews 。
  • 不要使用性能很差的主机,尽管缓存了,但是还是不行的,这里我个人推荐我和朋友一起搞的主机:WFANS 主机
  • 还有很多依赖于刷新数据的插件,如 SK2, Bad Behaviour 等可能不起作用。缓存总归会带来一点那个灵活性的不足。

[原创]Windows下版本服务器VisualSVN的迁移

mikel阅读(908)

最近换了台机器,需要把原机器上的VisualSVN迁移到新的机器上,为了保持原有修改日志不变,于是按如下步骤进行了迁移:

1.首先备份原VisualSVN的数据目录Repositories,一般在安装目录下

2.在新机器上安装VisualSVN服务器

3.恢复备份中的新机器上的Repositories文件夹下的项目文件夹,记住是项目文件夹而不是所有文件

4.在Visual Studio2008中,我用的是AnkhSvn-2.1.8420.8进行的SVN操作

右键选中需要更换SVN地址的项目,选择SubVersion->Swith Objects

输入新的SVN服务器的链接地址,类似:https://zlnc-js005:8443/svn/Test/trunk/NewTest/

点击确定更新完毕

[转载]腾讯开放平台中实现QQ登陆的功能

mikel阅读(987)

转载腾讯开放平台中实现QQ登陆的功能 – 小宇.net – 博客园.

这昨天为自己的网站实现了QQ登陆的功能,虽然,没有进行绑定,但是在技术层面上来说,已经了解了一点腾讯开放平台的协议.

具体什么是OAUTH,请您GG一下吧…

关于腾讯的开放平台,最主要的就是参数一定不能多,能有的要有,不能有的一定不能有.不然提交过去,就会提示什么什么错了.

最关键的就是签名的方式,下面就是我的签名的代码

1 /// <summary>
2 /// 每一步不同的生成签名的方式
3 /// </summary>
4 /// <returns></returns>
5 protected virtual String BuildSignature(String SignatureHost)
6 {
7 String PostMethodString = GET&;
8 StringBuilder ParamString = new StringBuilder();
9 this.CurrentStepParameters
10 .OrderBy(c => c.Key.ToString())
11 .ToList()
12 .ForEach(c =>
13 {
14 if (c.Key != OAuthParameterName.oauth_signature &&
15 c.Key != OAuthParameterName.timestamp)
16 {
17 if (ParamString.Length > 0)
18 {
19 ParamString.Append(&);
20 }
21 var p = c.Value;
22 ParamString.Append(p.OAuthOringinaName);
23 ParamString.Append(=);
24 ParamString.Append(p.Value);
25 }
26 }
27 );
28 StringBuilder SignData = new StringBuilder();
29 SignData.Append(PostMethodString);
30 SignData.Append(OAuthHelper.UrlEncode(SignatureHost));
31 SignData.Append(&);
32 SignData.Append(OAuthHelper.UrlEncode(ParamString.ToString()));
33
34 //密钥
35 String SecretKey = String.Format({0}&{1}, this.AppKey, this.AuthorizedTokenKey);
36 String SignContent = SignData.ToString();
37 String Signature = Convert.ToBase64String(OAuthHelper.HMACSHA1Code(SignContent, SecretKey));
38 return Signature;
39 }

这里的CurrentStepParameters是在构造方式里进行赋值,或者其它地方,签名里最关键的,就是oauth_signature和timestamp这两个参数,要记得去掉,在这里,我选择了过滤.

因为有的时候,CurrentStepParameters这个字典从querystring来生成的话会简单点还有能复用.

在所有参数中,有几个是经常会用到的.

所以,在此我建立了一个通用参数生成方法

1 protected virtual void AddCommonParameters()
2 {
3 if (this.CurrentStepParameters != null)
4 {
5 //增加通用参数
6 this.CurrentStepParameters.AddParam(OAuthParameterName.oauth_consumer_key, this.AppID);
7 this.CurrentStepParameters.AddParam(OAuthParameterName.oauth_nonce, DateTime.UtcNow.Ticks.ToString());
8 this.CurrentStepParameters.AddParam(OAuthParameterName.oauth_timestamp, OAuthHelper.GenerateTimestamp());
9 this.CurrentStepParameters.AddParam(OAuthParameterName.oauth_version, 1.0);
10 this.CurrentStepParameters.AddParam(OAuthParameterName.oauth_signature_method, HMAC-SHA1);
11 this.CurrentStepParameters.AddParam(OAuthParameterName.oauth_client_ip, 1);
12
13 if (this.CurrentStepParameters.ContainsKey(OAuthParameterName.oauth_token_secret))
14 {
15 this.AuthorizedTokenKey = CurrentStepParameters[OAuthParameterName.oauth_token_secret].Value;
16 }
17
18 if (this.CurrentStepParameters.ContainsKey(OAuthParameterName.oauth_signature))
19 {
20 CurrentStepParameters.Remove(OAuthParameterName.oauth_signature);
21 }
22
23 if (this.CurrentStepParameters.ContainsKey(OAuthParameterName.timestamp))
24 {
25 CurrentStepParameters.Remove(OAuthParameterName.timestamp);
26 }
27 }
28 }

下面是一个测试地址 :http://www.changshu.so/Tencent , 之后等完成绑定后,地址会删除

组件下载地址 : http://files.cnblogs.com/sam251/CSCMS.Secrity.OAuth.rar

后续还有绑定的需要自己去实现了.如果能有通用的方式,我会定时更新,另外,其它OAUTH,比如SINA的,正在研究.

本程序里的OAuthHelper.GenerateTimestamp()及OAuthHelper.UrlEncode都是来自网上其它朋友的方法.

源不源码也没有什么重要了.因为整合在自己的网站里,所以,只是给出了一个DLL,要源码的可以找我,我可以发你.

[转载]构建自己的购物搜索引擎一:写一个简单的

mikel阅读(1207)

[转载]构建自己的购物搜索引擎一:写一个简单的 – 小诺N – 博客园.

记得2010109号,淘宝全网搜索引擎一淘网上线,当时不怎么关注,只是在网站上看到过新闻而己,前两个月,觉得是时候走确定自己以后要走的方向了,于是决定以后加入到搜索的行列中,此时开始关注一淘网的技术,来打开搜索的大门。

那么做搜索引擎要做哪些内容呢,以前有人也这样问过nutch,lucene,hadoop之父Doug Cutting,他回答大致应该分为以下几部分:

1) 攫取(fetching):就是把被指向的网页下载下来。通常就是日常所说的网络爬虫的工作。

2) 数据库:保存攫取的网页信息,比如那些网页已经被攫取,什么时候被攫取的以及他们又有哪些链接的网页等等。

3) 链接分析:对刚才数据库的信息进行分析,给每个网页加上一些权值(比如PageRank,WebRank什么的),以便对每个网页的重要性有所估计。不过,在我看来,索引那些网页标记(Anchor)里面的内容更为重要。(这也是为什么诸如Google Bombing如此高效的原因

4) 索引(Indexing): 就是对攫取的网页内容,以及链入链接,链接分析权值等信息进行索引以便迅速查询。

5) 搜索(Searching): 就是通过一个索引进行查询然后按照网页排名显示

根据这几部分,我们可以自己写一个简单的购物搜索引擎。

第一步:抓取数据

目前开源的网络爬虫有很多,nutch,heritrix都可以算是其中的佼佼者。这里我们先自己动手写一个简单的。

仔细看淘宝的网站,会发现,基本上商品信息比较全的页面全都是以item.taobao开头的,那我们用chrome的开发人员工具分析一下页面结构。

如下图:

图片内容为:<div id=”J_itemViewed” catid=”1512″ data-value=”{“itemId”:”10810071223″,”xid”:””,”pic”:”i3/T1EJahXm4kXXb3Ses._112056.jpg”,”price”:”334800″,”itemIdStr”:””,”title”:”HTC S510e/Desire S g12 安卓2.3系统 大陆行货 联保 现货”}”></div>

我们可以看到,在这个名为J_itemViewed的div中,我们可以取到商品的三个最基本的信息,商 品名称,商品价格,商品图片地址。那么现在的目标很明确,就是在抓取item.taobao的网页,然后找到id为J_itemViewed的div标 签,取出里面的商品信息。那么动手吧。

我们写一个Crawler的类,这个类要做以下几件事:

1.提取网页链接

2.碰到包含有item.taobao的链接,分析网页内容,提取信息,将商品信息存储入本地

首先来看提取网页链接,如下图所示:

提取网页上的链接一般是从一种初始网页开始了,比如说我从www.taobao.com开始,然后分析网 页的结构,取得里面的所包含的链接,然后根据这个链接,去提取更深层次的链接。如此循环,到一定条件停止。在抓取网页的时候,网络蜘蛛一般有两种策略:广 度优先和深度优先。广度优先是指网络蜘蛛会先抓取起始网页中链接的所有网页,然后再选择其中的一个链接网页,继续抓取在此网页中链接的所有网页。这是最常 用的方式,因为这个方法可以让网络蜘蛛并行处理,提高其抓取速度。深度优先是指网络蜘蛛会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路之后再 转入下一个起始页,继续跟踪链接。对于垂直搜索来说,通常采用广度优先策略。下面简单列出抓取与提供信息的方法,具体的看附近里的源程序。

GetUrlThread.class(链接抓取)

GetInfo.class(信息提取)

/**
* 提取信息
*
* @param url
* @return
* @throws ParserException
*/
private void retrieveInfo(String url) throws ParserException,
IllegalArgumentException, IOException {
URL myurl = new URL(url);
Node node = null;
Lexer lexer = new Lexer(myurl.openConnection());
while (null != (node = lexer.nextNode())) {
if (node instanceof TagNode) {
//找到id为J_itemViewed的结点,提取其value值
if ("J_itemViewed".equalsIgnoreCase(((TagNode) node)
.getAttribute("id"))) {
String content = "url:"+url+"\r\n"+"data:"+((TagNode) node).getAttribute("data-value")+"\r\n";
FileOut.instance().write(content);
}
}
}
CommonData.urlInfoed.add(url);//添加到已经提取过的集合中
CommonData.urlInfo.remove(url);//从原集合中移去
}

看一下代码:主要是采用htmlparser,一个html文档解析器来解析下载的内容,得到网页中的<a>标签,去掉邮 件,JavaScript,空锚点等,将提取出来的链接加入到集合中,并将包含有item.taobao的链接加入到要提取网页信息的集合中。

从要提取网页信息的集合中取得url,提取所需要的id为J_itemViewed的div的value值。并将其持久化到本地磁盘。我这里采用的是每一分钟写一个文件夹,每一秒写一下文件。得到的文件内容如下所示:具体看附件)

url:http://item.taobao.com/item.htm?id=7520167497

data: {“itemId”:”7520167497″,”xid”:””,”pic”:”i4/T1ZM86XoFpXXXfrvg2_043733.jpg”,”price”:”279900″,”itemIdStr”:””,”title”:”Konka /康佳 LC32IS68N 32寸液晶电视 高清网络电视机 USB/HDMI”}

第二步:建立索引
我们已经得到所需要的内容了,并将其保存在本地的硬盘上。接下来就是要对这些内容做索引了,说到索引,就不得不提lucene了,下面我们使用开源框架lucene来对刚刚提取出来的文件进行索引各搜索。
先介绍一下lucene。
简单的说呢,lucene就是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。

我们先来看一下lucene索引的过程

如上图所示,lucene建立索引的步骤大概可以分为以下几步:

将内容信息存入在Field中,将多个Filed组合成Document,然后经过分词,由IndexWriter写入到目录中。

简单介绍一下这几个类,因为看lucene in action自己翻译过来的,可能会理解的不太准确,见谅。

1.IndexWriter

indexWriter 是创建索引的核心组件。它可以创建一个索引,或者打开一个已经存在的索引,也可以添加,删除,更新索引中的文档。indexWriter拥有索引的写的权限,却没有读与查询的权限。IndexWriter需要在某处来存储这些索引,而这个存储的地方就是Directory

2.Directory

Directory类代表Lucene索引存储的地方。它是一个抽象类,其子类可以存储合适的索引。在我们的indexer例子中,我们使用FSDirectory.open来得到合适的具体实现FSDirectory来存储目录下的文件,然后将其传给IndexWriter的构造方法。

Lucene包含了若干个有趣的Directory实现。IndexWriter要想创建索引,则必须通过AnalyZer来解析内容。

3.Analyzer

在文本被索引之前,它必须通过analyzer分析。在IndexWriter的构造方法中,声明了Analyzer,analyzer是负责利用将要被索引的文字来抽取标识符并且消除剩余的。如果内容被索引的部分不是最简单的部分,需要先将里面的内容的简单字符抽取出来,再索引。

Analyzer是一个抽象类,但是Lucene自带一些它的实现.

AnalyzerLucene非常重要的类,它常用于简单的过滤文本。开发者要想反lucene集成到产品中,需要正确的选择analyzer

要想分析就需要文档,即Document,document中包含单独的field用来创建索引。

4.Document

Document类是fields的集合。其可以是web网页,email或者单纯的文本。

5.Field

每一个索引中的document都包含有一个或者多个命名的字Filed。每一个Field都有一个名字与对应的值。

看一下建立索引的代码:(具体的过程看源代码中的Index.class)

建立索引

上图为建立完索引后生成的文件

第三步:搜索

建立好索引之后,我们就可以检索所需要的信息了,还是利用lucene,代码挺简单的:

/**
* 信息搜索
* @author xiaoruoen
*
*/
public class Search {
private Logger logger = Logger.getLogger(Search.class);
public void search(String name){
try {
//打开索引存放的目录
Directory dic = FSDirectory.open(new File(CommonData.index));
//创建索引搜索
IndexSearcher search = new IndexSearcher(dic);
//创建中文分词
Analyzer analyzer = new IKAnalyzer();
//开始搜索
QueryParser parser = new QueryParser(Version.LUCENE_32,"title",analyzer);
Query query = parser.parse(name);
TopDocs hits = search.search(query,100);
//显示搜索结果
logger.info("共找到"+hits.totalHits+"条记录");
logger.info("=====================================================");
for(ScoreDoc scoreDoc:hits.scoreDocs){
Document doc = search.doc(scoreDoc.doc);
logger.info("名称:"+doc.get("title"));
logger.info("价格:"+doc.get("price"));
logger.info("图片:"+doc.get("pic"));
logger.info("网址:"+doc.get("url"));
}
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
}

我们搜索一下“女装”,看一下出来的结果:

INFO (2011-09-14 10:39:15,593) - 共找到63条记录
INFO (2011-09-14 10:39:15,593) - =====================================================
INFO (2011-09-14 10:39:15,625) - 名称:CIMARRON 堆堆领 女装 长袖 舒适显瘦 针织衫
INFO (2011-09-14 10:39:15,625) - 价格:3200
INFO (2011-09-14 10:39:15,625) - 图片:i4/T1sxtSXddGXXachFs3_045631.jpg
INFO (2011-09-14 10:39:15,625) - 网址:http://item.taobao.com/item.htm?id=12267518050
INFO (2011-09-14 10:39:15,625) - 名称:2011秋冬装新品 修身风衣双排扣 韩版女装风衣 女装中长款外套
INFO (2011-09-14 10:39:15,625) - 价格:19000
INFO (2011-09-14 10:39:15,625) - 图片:i3/T1sPxWXdhNXXXSNBQ3_050815.jpg
INFO (2011-09-14 10:39:15,625) - 网址:http://item.taobao.com/item.htm?id=12523597229
INFO (2011-09-14 10:39:15,625) - 名称:秋装新品2011时尚瑞丽新款女装日韩服饰9482 修身仿皮短外套
INFO (2011-09-14 10:39:15,625) - 价格:6300
INFO (2011-09-14 10:39:15,625) - 图片:i8/T1QSCkXcdoXXX5S5s4_053319.jpg
INFO (2011-09-14 10:39:15,625) - 网址:http://item.taobao.com/item.htm?id=12488194244
INFO (2011-09-14 10:39:15,625) - 名称:2011韩莉雅 秋装新款女装 时尚休闲长袖短外套HLY1131
INFO (2011-09-14 10:39:15,625) - 价格:18800
INFO (2011-09-14 10:39:15,625) - 图片:i7/T1rOSlXoBqXXaFtvc1_041102.jpg
INFO (2011-09-14 10:39:15,625) - 网址:http://item.taobao.com/item.htm?id=13018744492
INFO (2011-09-14 10:39:15,625) - 名称:2011秋装新款专柜正品女装时尚休闲翻领绣花 短外套 军绿色/咖啡
INFO (2011-09-14 10:39:15,625) - 价格:26200
INFO (2011-09-14 10:39:15,625) - 图片:i1/T1liqlXj8oXXXTRSAT_013057.jpg
INFO (2011-09-14 10:39:15,625) - 网址:http://item.taobao.com/item.htm?id=12730707166
INFO (2011-09-14 10:39:15,625) - 名称:水墨佳人女装2011秋装秋款新款新品加厚长袖瑞丽短外套
INFO (2011-09-14 10:39:15,625) - 价格:26200
INFO (2011-09-14 10:39:15,625) - 图片:i1/T1sTV_XadqXXcClX36_060517.jpg
INFO (2011-09-14 10:39:15,625) - 网址:http://item.taobao.com/item.htm?id=12915156606
INFO (2011-09-14 10:39:15,625) - 名称:ViVi杂志款 Asuka  Yuri秀粗麻女装秋冬短外套
INFO (2011-09-14 10:39:15,625) - 价格:17900
INFO (2011-09-14 10:39:15,625) - 图片:i2/T1e2hOXddzXXbw55cZ_032608.jpg
INFO (2011-09-14 10:39:15,625) - 网址:http://item.taobao.com/item.htm?id=7761546704
INFO (2011-09-14 10:39:15,625) - 名称:2011秋季新款女装羊毛呢妈妈装 宽松版中老年短外套翻领绿色
INFO (2011-09-14 10:39:15,625) - 价格:22900
INFO (2011-09-14 10:39:15,625) - 图片:i3/T1ZB40XopXXXckB9E3_051216.jpg
INFO (2011-09-14 10:39:15,625) - 网址:http://item.taobao.com/item.htm?id=9290407443
INFO (2011-09-14 10:39:15,625) - 名称:2011韩版秋冬女装新品 洋气 调皮可爱中长款双排扣风衣 外套
INFO (2011-09-14 10:39:15,625) - 价格:8800
INFO (2011-09-14 10:39:15,625) - 图片:i7/T1KpuaXm4sXXXmcEQZ_033735.jpg
INFO (2011-09-14 10:39:15,625) - 网址:http://item.taobao.com/item.htm?id=13145728284
INFO (2011-09-14 10:39:15,625) - 名称:新款韩版女装风衣外套 修身长袖女士风衣 翻领带拉链风衣外套
INFO (2011-09-14 10:39:15,640) - 价格:15900
INFO (2011-09-14 10:39:15,640) - 图片:i4/T1SPqkXmJjXXcjLEk8_072117.jpg
INFO (2011-09-14 10:39:15,640) - 网址:http://item.taobao.com/item.htm?id=12812355549
INFO (2011-09-14 10:39:15,640) - 名称:2011秋装新款女装军绿色工装休闲外套春秋韩版修身女士风衣
INFO (2011-09-14 10:39:15,640) - 价格:19800
INFO (2011-09-14 10:39:15,640) - 图片:i1/T17smlXb0FXXc.0vwZ_031951.jpg
INFO (2011-09-14 10:39:15,640) - 网址:http://item.taobao.com/item.htm?id=13031860478
INFO (2011-09-14 10:39:15,640) - 名称:2011春秋装新品 韩版女装风衣外套 长款修身风衣 女士外套大衣
INFO (2011-09-14 10:39:15,640) - 价格:15900
INFO (2011-09-14 10:39:15,640) - 图片:i4/T1WOp.Xh8HXXasdJIZ_032024.jpg
INFO (2011-09-14 10:39:15,640) - 网址:http://item.taobao.com/item.htm?id=13031892105
INFO (2011-09-14 10:39:15,640) - 名称:专柜正品女装2011新款春装韩版时尚假俩件带帽风衣
INFO (2011-09-14 10:39:15,640) - 价格:26200
INFO (2011-09-14 10:39:15,640) - 图片:i7/T1zjNYXgtkXXbyJ9g7_065620.jpg
INFO (2011-09-14 10:39:15,640) - 网址:http://item.taobao.com/item.htm?id=9100442835
INFO (2011-09-14 10:39:15,640) - 名称:特价 风衣 女 2011新款秋装韩版大码女装时尚热卖修身风衣
INFO (2011-09-14 10:39:15,640) - 价格:13600
INFO (2011-09-14 10:39:15,640) - 图片:i4/T1y6ajXktkXXXw6vM8_070426.jpg
INFO (2011-09-14 10:39:15,640) - 网址:http://item.taobao.com/item.htm?id=12525276117
INFO (2011-09-14 10:39:15,640) - 名称:枫之玲 2011秋装新款 修身 时尚 长袖女装风衣
INFO (2011-09-14 10:39:15,640) - 价格:20000
INFO (2011-09-14 10:39:15,640) - 图片:i8/T10d05XodEXXX8fYo4_052120.jpg
INFO (2011-09-14 10:39:15,640) - 网址:http://item.taobao.com/item.htm?id=13145948058
INFO (2011-09-14 10:39:15,640) - 名称:以诺 2011秋装 新款 女士 女装 长款 修身 风衣
INFO (2011-09-14 10:39:15,640) - 价格:17800
INFO (2011-09-14 10:39:15,640) - 图片:i1/T1Tmx7XjhEXXbLx7w._113135.jpg
INFO (2011-09-14 10:39:15,640) - 网址:http://item.taobao.com/item.htm?id=12637146864
INFO (2011-09-14 10:39:15,640) - 名称:2011夏装新品欧美女装单件套圆领短袖蝙蝠袖 全棉针织衫
INFO (2011-09-14 10:39:15,640) - 价格:3990
INFO (2011-09-14 10:39:15,640) - 图片:i2/T1feX4XjpkXXaI_Fjb_122628.jpg
INFO (2011-09-14 10:39:15,640) - 网址:http://item.taobao.com/item.htm?id=9674621798

这里只是简单的打印出来,有兴趣的可以弄个web,将结果显示出来。

好了,已经初步构建好一个最简单的购物搜索擎了,由于个人水平原因,可能代码写的有点……,但不管怎么说,是一个开始,接下来会慢慢完善的。

源代码下载

程序运行所需文件与搜集到的内容

[转载]高效程序员系列3、别碰鼠标——让键盘飞起来

mikel阅读(1150)

[转载]【高效程序员系列】3、别碰鼠标——让键盘飞起来 – Alex Leo – 博客园.

看到文章标题,你肯定会很奇怪,为什么“别碰鼠标”,离开鼠标还怎么操作电脑?“让键盘飞起来”,键盘怎么会飞呢?你可以保留这些疑问,先跟着我的描述操作一遍,注意操作的过程中记住你都做了哪些动作,以及花费了多长时间。

前提条件:假设你正在写代码,你的双手都放在键盘上。如果你用Win7,请暂时忽略任务栏锁定的软件。

1、打开QQ

QQ很常用,你可能把它放在桌面了。于是你把手从键盘移到鼠标上,移动鼠标并定位到Win7的右下角点击切换到桌 面。如果是Vista之前的系统,你需要移动鼠标到快速启动栏,定位到“切换到桌面”按钮并点击。然后你在桌面找到QQ的图标,双击启动。这个过程可能花 费你2秒或3秒,似乎并不算长,操作也不繁琐。而我会保持双手在键盘上,按5个键,整个过程不到1秒。

2、打开Visual Studio或者SQL Server

如果你经常用VS,那么在开始菜单中很容易找到。首先你会把手放在鼠标上,然后将光标移动到开始菜单,点击开始菜单,将光标移动到VS的菜单项上,然后点击打开。这个过程可能花费了你2秒或者3秒,也不是很繁琐。如果是我,我依然会使用键盘,按5个键,整个过程不到1秒。

3、打开一个IIS管理器或者不经常用的,比如计算器、PowerPoint或者配置hosts文件

这个就比上面的操作繁琐一些了,你需要到管理工具中找到IIS管理器才能打开。如果你不是经常使用,可能会花费你5秒甚至更多。我还是使用键盘,按下6个键,整个过程还是不到1秒。

4、让一个窗体最大化、最小化、恢复初始大小或者关闭

你需要移动鼠标,双击窗体标题栏或者最大化按钮来实现最大化或恢复初始大小;最小化需要点击最小化按钮;关闭需要点 击关闭按钮或者双击标题栏,如果你会快捷键,可以按Alt+F4,但跨度很大,而且手臂也需要一起动作。我继续选择键盘,而且只需要动手指,手臂不需要 动,操作比之前都快,可以说是在0.2秒左右就可以完成。

怎样,你有没有觉得好奇?我的手一直在键盘上,常用的和不常用的软件,我都只需要1秒就能打开,效率比鼠标高多了。 所以这里才提出“别碰鼠标”的观点,让你的手指在键盘上飞快的敲起来。当然这里说的“别碰鼠标”不只是打开软件这么简单,还包括更多能提高效率的操作。下 面就带你领略键盘的魅力。

注:下文包含一些组合键,比如“Alt+Tab”,意思是同时按下Alt和Tab,中间的+是同时的意思,不要理解为加号;还有“Alt+空格,C”意思是同时按下Alt和空格,然后再按下C,中间的逗号是分隔符。

一、闪电启动软件的秘密

正如很多魔术,外行人苦思冥想也无法得知其中的奥秘,一旦揭穿则会让人大呼:原来是这样,太简单了。其实这里闪电启 动软件业没有什么高深的方法,只不过是调用了运行而已。作为软件开发人员,我们经常会使用到“运行”,输入cmd就可以调用命令行,输入regedit则 是编辑注册表。如果你觉得“运行”只能输入这些固定的命令,那你就大错特错了。

这里先引入一个情景:假如你是公司的老板,你有一件事需要某人来处理,你是愿意自己走过去给他说,还是愿意叫他的名 字,让他主动走过来听你的命令呢?虽然现实中你不是老板,但是在面对电脑的时候,你就是电脑的boss。在你的电脑里有一大堆软件,比如QQ、IE、 Word、VS……。如果你在桌面密密麻麻的图标中寻找对应的软件图标,或者是在需要滚动好几次滚动条的开始菜单中寻找软件快捷方式,你就是那个主动去找 员工的boss,你处在被动状态。你明明知道要打开的软件的名字,为什么不直接叫它的名字呢?下面就叫你怎样变被动为主动,做一个威武的boss,嘿嘿 ^_^

1、在D盘建立一个文件夹,命名为QuickStart或者你喜欢的名字。

2、把桌面的软件快捷方式图标放到QuickStart文件夹中,并给它们重命名,建议用自己能记住的缩写,不重复即可。比如:

clip_image001

3、给QuickStart文件夹建立一个快捷方式,然后重命名为qs,并且把这个快捷方式也放到QuickStart文件夹中,如上图就有一个qs快捷方式。

4、在桌面对“我的电脑”点右键(Win7是“计算机”),然后选择属性,弹出系统属性对话框。如果是Win7则会弹出系统信息窗体,还需要点击左边的“高级系统设置”,如图:

clip_image002

5、在系统属性对话框中,点击“环境变量”按钮,弹出环境变量对话框。如图:

clip_image003

6、在环境变量对话框的系统变量列表中找到Path项,然后点击“编辑”按钮。

clip_image004

7、在编辑对话框中输入路径“D:\QuickStart”,注意和前面的路径用英文的分号分隔,如图:

clip_image005

然后一路点击“确定”按钮,关闭所有对话框。

8、按下Win+R键,调用运行对话框。在运行对话框中输入qq,如果你的电脑够快的话,马上就会弹出QQ的登录界面。输入qs,就会打开D:\QuickStart文件夹。

(注:Win键就是键盘最下面一排,带Windows图标的键,台式机键盘一般左右各一个,笔记本只有左边有,如下图最下方带圆形Windows徽标的键,该键的右边是模拟鼠标右键的按键)

clip_image006

9、当你新安装了软件,需要把快捷方式添加进来,用qs命令就可以很快打开QuickStart文件夹。

10、当你有经常用到的文件夹,也可以把它的快捷方式放到QuickStart中,很方便就可以打开。

怎样,是不是比从一大堆图标里面找软件快多了。一旦你习惯了Win+R,肯定会对它产生依赖。我的电脑桌面一个图标也没有,因为我是一个彻底的Win+R粉丝。

下面列举一些常用的Windows运行命令

这里有一份从网上找到快捷键和命令收集的文章,可以参考一下:常用快捷键知识

不过Win和R之间的距离有点远,在本系列的上一篇文章中提到过两种脚本语言Au3和AHK,可以考虑用它们实现自定义快捷键来调用运行。比如可以用Alt+Q作为快捷键,这样左手基本上不需要移动。下面是用Au3实现的用Alt+Q调用“运行”的代码:

HotKeySet(“!q”,”WinRun”)

Func WinRun()

Send(“{LWINDOWN}r{LWINUP}”)

WinWait(“Run”,””)

If Not WinActive(“Run”,””) Then WinActivate(“Run”,””)

EndFunc

Do

Sleep(500)

Until False

Exit

其实也有其他一些软件可以实现快速启动,这里介绍一款叫做Launchy的免费软件,它不仅可以快速启动软件,还支持查询和搜索功能,如下图。它的官方网址是:http://www.launchy.net/ 不过因为它需要安装,会占用系统资源,虽然占用的不多,但我更倾向于使用原装的Win+R。

clip_image007

clip_image008

二、操作系统常用快捷键(非初学者可以跳过此段,如有遗漏,欢迎补充)

1、不可小视的Alt、Ctrl、Shift

(1)Alt

Alt配合菜单使用:主菜单下面带下划线的都是可以用Alt+对用字母控制的。比如下面的SnagIt,按下Alt 会激活主菜单,如果要选择Edit,按下E即可,要选择Help,按下H即可,或者是同时按下Alt+H即可调用Help菜单。如果是在 Office2007中,按下Alt则会出现如下图的快捷键提示,按下对应的键则可以激活对应的功能。

clip_image009

Alt+Tab:切换窗体。按下Alt+Tab会出现如下的程序窗体预览,按住Alt,多次按下Tab则会从左到右循环选择窗体。而Alt+Shift+Tab则会从右到左循环选择窗体。

clip_image010

Win+Tab:Win7下用预览方式切换窗体,比Alt+Tab更直观。同理Win+Shift+Tab会反向循环选择。

clip_image011

Alt+Down:列出下拉选项。当下拉控件获取焦点时,按下Alt+Down(向下的箭头),则会执行下拉操作,列出下拉框中的候选项。

Alt+Enter:属性命令,当选中一个文件/磁盘时,这个快捷键相当于对文件/磁盘点右键,然后点击属性菜单项。

Alt相关窗体命令

上面提到了用让窗体最大化、最小化、关闭等操作,其实是通过Alt相关命令实现的。对窗体标题栏点右键,可以看到有 一个菜单弹出来。其实用Alt+空格就可以代替对标题栏点右键。而一旦标题栏菜单出来之后,按下菜单项对应的字母,则相当于点击菜单项,所以通过这些命令 可以极速操作窗体大小。熟悉这些命令后,左手大拇指按下Alt,同时右手大拇指按下空格,然后按下对应的菜单命令字母,则可以实现窗体大小操作。具体的操 操作如下:

(2)Ctrl

Ctrl+Left/Right:按单词移动光标,而不是按字母移动,在编程的时候经常会用到,很多时候比鼠标快捷。

Ctrl+Home/End:定位到文章或者页面的顶部/底部,看网页或者编辑文章的时候比较有用。

Ctrl+鼠标点击:对于文本编辑是选中单词,可以代替双击;对于资源管理器是选中多个文件。

(3)Shift

Shift+方向键:选中连续的字符串或文件

Shift+Ctrl+方向键:按单词连续选中字符串

Ctrl+Shift、Ctrl+空格、Shift+空格:切换语言

以上三个键组合使用,在操作菜单、文本编辑、查看文件等方面会带来不小的便利。

2、方便的Windows键

Windows键上面已经介绍过它在键盘上的位置了,按下这个键,就相当于点击了开始菜单。但是Windows键的功能不只是为了很方便的打开开始菜单,配合其他键使用,才能表现出它的方便所在。下面就介绍一下它的妙用,以下用“Win”代表Windows键。

3、其他快捷键

(1)Tab

跳转:界面上有多个控件,按下Tab会使焦点跳转到下一个控件。

反向跳转:按下Shift+Tab,会使焦点按照相反的顺序在控件之间跳转。

在文本编辑区域中:Tab是缩进一个制表符,Shift+Tab是取消缩进一个制表符。

(2)空格键

默认确定:当弹出对话框时,或者焦点定位在某个按钮或者菜单项时,按下空格键相当于点击确认。

浏览器滚屏:当浏览器有滚动条时,按下空格键相当于翻页。

选中文件:在资源管理器中,当某个对象被虚线框住时,按下空格键就会选中该项。

(3)Fx系列按键

Fx系列按键是键盘最顶上一排按键,从F1到F12。其中常用按键对应的功能为

以上是Fx系列按键最常见的用法。很多软件都定义了自己的Fx系列功能键,需要根据实际情况操作。

(4)Esc

Esc就是取消键,在弹出对话框时,按下Esc默认就是点击“取消”。它处在键盘左上角,比移动鼠标到“取消”按钮上要快捷不少。

(5)键盘模拟右键

该键处在键盘右边的Ctrl和Win键之间,按下该键相当于对选定对象点右键。焦点已经定位到某个对象上,常规操作 方法是移动鼠标到该对象,然后点击右键并点击指定菜单项。如果用该键,则只需要按下该键,再按下对应菜单项的快捷键,相比之下要快速。比如压缩文件,如果 熟练的话,按下模拟右键,按下T回车,就可以完成压缩。在实际工作中,我也倾向于用该键,比移动鼠标到对应菜单项要方便。

三、工作中的快捷键

在日常工作中使用的软件,比如Visual Studio,它的功能非常多,菜单项有几十上百个。如果是在密密麻麻的菜单中寻找需要执行的命令,不可避免要花费一番功夫。如果能够记住最常用的快捷 键,也能让操作效率提高不少。下面列举一下工作中用到的快捷键,只列举暂时想到的,大家可以在后面补充。有些未列举的,可以自己在菜单里面查找。

Visual Studio(部分快捷键会因为选择的开发环境不同而不同,VS安装好之后第一次打开都会让用户选择模式,我一般选择常规模式。)

SQL Server

有部分快捷键和Visual Studio相同,比如注释,大家也可以多收集快捷键,对提高工作效率肯定有帮助。

四、用脚本语言加速

在本系列的上一篇文章中提到的Au3和AHK可以从很大程度上降低鼠标频繁操作。特别是遇到需要重复做机械性的鼠标 操作时,可以用脚本语言实现鼠标和键盘的操作,甚至可以用脚本录制工具把鼠标键盘操作记录下来。如果是安装了Au3,在安装文件夹中找到 SciTe\ScriptWriter\AU3Record.exe运行,点击左上角的Au3图标就开始录制了,很容易上手,如下图:

clip_image012

五、不需要鼠标的编辑器-Vim

如果你经常进行文本编辑操作,而且有希望能达到高手级别,那么强烈推荐你使用Vim编辑器。平时编辑文本的时候,经 常需要把手在键盘和鼠标之间切换,这个过程就比较影响效率。即便是使用方向键,也需要把右手从键盘的主区域移开。而Vim则完全不用鼠标和方向键,完全依 靠键盘的主区域。但是学习使用Vim是一个痛苦的过程,需要记住大量的命令。不过既然编程的那么多技术你都学会了,掌握Vim也不是难事。一旦你掌握了 Vim,你就会明白什么才是真正的编辑利器。详细信息可以参考以下文章:普通人的编辑利器——Vim简明 Vim 练级攻略

clip_image013

六、鼠标也可以飞

当然,本篇的目的是让你尽量少用鼠标,减少键盘和鼠标的切换,完全不用鼠标也是不可能的。上面讲到了对键盘进行增强,其实鼠标的功能也可以增强的,可以让鼠标和键盘一起飞。

首先是鼠标本身,一般的鼠标只有左键、右键、滚轮、滚轮点击。但是好一点的鼠标则可以有更多的键,比如前进、后退、双击、滚轮左右点击等等。这些更高级的功能可以从一定程度上提高鼠标操作的效率,多花一点钱也是值得的。

现在很流行触摸屏的手机,而且是多点触摸,因为手势操作可以带来很便捷的操作。虽然普通的电脑还没法像手机那样使用 触摸屏,但是鼠标手势也可以便利。我最开始接触鼠标手势是使用傲游浏览器,鼠标操作不再局限于点击和拖动,而是变成了笔画一样的方式。不同的手势意味着不 同的命令,操作便利性大幅提升。

clip_image014

傲游的鼠标手势确实非常好用,但是它只是局限于傲游浏览器本身。之后其他浏览器也都加入了鼠标手势功能,然而都没有 脱离软件本身。直到某一天看到搜狗输入法里面包含一个小工具:搜狗鼠标手势。它将鼠标手势扩展到了整个系统,而不仅仅局限于单个软件,再次提升了鼠标手势 的应用范围。

clip_image015

本文就介绍这些,快捷键和Windows命令只是介绍了常用的一些,遗漏的部分欢迎大家积极补充,让大家能更快的操作电脑,更快的完成工作!

[转载]PHP底层工作原理

mikel阅读(827)

[转载]PHP底层工作原理 – PHP淮北 – 博客园.

最近搭建服务器,突然感觉lamp之间到底是怎么工作的,或者是怎么联系起来?平时只是写程序,重来没有思考过他们之间的工作原理:

PHP底层工作原理

wps_clip_image-29471

图1 php结构

从图上可以看出,php从下到上是一个4层体系

①Zend引擎

Zend整体用纯c实现,是php的内核部分,它将php代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理 方法、实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕 zend实现。

②Extensions

围绕着zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过 extension来实现,用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的(如贴吧正在使用的php中间层、富文本解析 就是extension的典型应用)。

③Sapi

Sapi全称是Server Application Programming Interface,也就是服务端应用编程接口,sapi通过一系列钩子函数,使得php可以和外围交互数据,这是php非常优雅和成功的一个设计,通过 sapi成功的将php本身和上层应用解耦隔离,php可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。后面 将在sapi章节中介绍

④上层应用

这就是我们平时编写的php程序,通过不同的sapi方式得到各种各样的应用模式,如通过webserver实现web应用、在命令行下以脚本方式运行等等。

构架思想:

引擎(Zend)+组件(ext)的模式降低内部耦合

中间层(sapi)隔绝web server和php

**************************************************************************

如果php是一辆车,那么

车的框架就是php本身

Zend是车的引擎(发动机)

Ext下面的各种组件就是车的轮子

Sapi可以看做是公路,车可以跑在不同类型的公路上

而一次php程序的执行就是汽车跑在公路上。

因此,我们需要:性能优异的引擎+合适的车轮+正确的跑道

Apache和php的关系

Apache对于php的解析,就是通过众多Module中的php Module来完成的。

wps_clip_image-31721

把php最终集成到Apache系统中,还需要对Apache进行一些必要的设置。这里,我们就以php的mod_php5 SAPI运行模式为例进行讲解,至于SAPI这个概念后面我们还会详细讲解。

假定我们安装的版本是Apache2 和 Php5,那么需要编辑Apache的主配置文件http.conf,在其中加入下面的几行内容:

Unix/Linux环境下:

LoadModule php5_module modules/mod_php5.so

AddType application/x-httpd-php .php

注:其中modules/mod_php5.so 是X系统环境下mod_php5.so文件的安装位置。

Windows环境下:

LoadModule php5_module d:/php/php5apache2.dll

AddType application/x-httpd-php .php

注:其中d:/php/php5apache2.dll 是在Windows环境下php5apache2.dll文件的安装位置。

这两项配置就是告诉Apache Server,以后收到的Url用户请求,凡是以php作为后缀,就需要调用php5_module模块(mod_php5.so/ php5apache2.dll)进行处理。

Apache的生命周期

wps_clip_image-8490

Apach的请求处理流程

wps_clip_image-17917

Apache请求处理循环详解
Apache请求处理循环的11个阶段都做了哪些事情呢?

1、Post-Read-Request阶段

在正常请求处理流程中,这是模块可以插入钩子的第一个阶段。对于那些想很早进入处理请求的模块来说,这个阶段可以被利用。

2、URI Translation阶段
Apache在本阶段的主要工作:将请求的URL映射到本地文件系统。模块可以在这阶段插入钩子,执行自己的映射逻辑。mod_alias就是利用这个阶段工作的。

3、Header Parsing阶段
Apache在本阶段的主要工作:检查请求的头部。由于模块可以在请求处理流程的任何一个点上执行检查请求头部的任务,因此这个钩子很少被使用。mod_setenvif就是利用这个阶段工作的。

4、Access Control阶段
Apache在本阶段的主要工作:根据配置文件检查是否允许访问请求的资源。Apache的标准逻辑实现了允许和拒绝指令。mod_authz_host就是利用这个阶段工作的。

5、Authentication阶段
Apache在本阶段的主要工作:按照配置文件设定的策略对用户进行认证,并设定用户名区域。模块可以在这阶段插入钩子,实现一个认证方法。

6、Authorization阶段
Apache在本阶段的主要工作:根据配置文件检查是否允许认证过的用户执行请求的操作。模块可以在这阶段插入钩子,实现一个用户权限管理的方法。

7、MIME Type Checking阶段
Apache在本阶段的主要工作:根据请求资源的MIME类型的相关规则,判定将要使用的内容处理函数。标准模块mod_negotiation和mod_mime实现了这个钩子。

8、FixUp阶段
这是一个通用的阶段,允许模块在内容生成器之前,运行任何必要的处理流程。和Post_Read_Request类似,这是一个能够捕获任何信息的钩子,也是最常使用的钩子。

9、Response阶段
Apache在本阶段的主要工作:生成返回客户端的内容,负责给客户端发送一个恰当的回复。这个阶段是整个处理流程的核心部分。

10、Logging阶段
Apache在本阶段的主要工作:在回复已经发送给客户端之后记录事务。模块可能修改或者替换Apache的标准日志记录。

11、CleanUp阶段
Apache在本阶段的主要工作:清理本次请求事务处理完成之后遗留的环境,比如文件、目录的处理或者Socket的关闭等等,这是Apache一次请求处理的最后一个阶段。

LAMP架构:

wps_clip_image-24435

从下往上四层:

①liunx 属于操作系统的底层

②apache服务器,属于次服务器,沟通linux和PHP

③php:属于服务端编程语言,通过php_module 模块 和apache关联

④mySQL和其他web服务:属于应用服务,通过PHP的Extensions外 挂模块和mySQL关联

Android系统架构图

lamp和安卓的架构图比较一下,貌似和lamp架构有点相似,本人不懂安卓,只是感觉上有点相似,高手可以指出区别,小弟在此不胜感谢

wps_clip_image-27187

从上往下:

安卓架构————–说明——–LAMP架构

1.应用程序 ——–具体应用——–web应用

2.应用程序框架 —-java————-PHP语言和库

3.系统运行库 :—-虚拟机———WEB服务器

⒋Linux 内核 :—操作系统——-lamp架构中的L

更深入的学习和了解可以查看下面:

风雨的博客http://www.laruence.com/2008/08/12/180.html

百度研发中心的博客http://stblog.baidu-tech.com/?p=763

王兴宾的博客http://blog.csdn.net/wanghao72214/article/details/3916825