Apr 11

<a href=”?goods[]=924&goods[]=967&goods[]=993″>?goods[]=924&goods[]=967&goods[]=993</a>
<?php
if($_GET){
print_r($_GET);
}
?>

Feb 22

客户端预先定义say_Result响应函数,然后调用由Flash Media Server提供给客户端的say方法。而Flash Media Server为客户端定义的say函数实际上是在处理amfphp提供的服务——phpSay,再由其回调HelloWorld类的phpSay_Result方法,进而触发了客户端预定义的say_Result函数。

客户端:
var _nc = new NetConnection();
_nc.say_Result = trace;
_nc.connect(’rtmp://x/helloworld’);
_nc.call(’say’, null, ‘hello world!’);
Continue reading »

Feb 22

Flash Player 10 中的P2P

已经有很多关于RTMFP激动人心的新闻了,主要是因为Flash Player 10中将支持P2P的通信。现在应该是时候向大家说一下利用该技术大家可以创建什么样的COOL应用,所以我将很乐意地介绍给大家更多有关的信息。

 

因为已经有很多人问过我有关这个技术的细节,一系列的问题有时我不知道如何回答比较恰当。对于那些将使用RTMFP进行开发工作的人,将这篇文章读完是很有好处的哦。

 

Flash Player 10支持P2P通讯吗

Flash Player 10 NetConnection NetStream 上有一些新函数, 这些函数将使得通过将来的FMS可以管理这些P2P通讯。服务器将维护这些潜在的可以被连接上的终端列表。如果NetConnection 到服务器的连接断了或者被关闭,任何又该服务端连接初始化的终端连接都将被关闭。

 

通过Flash Player 10我将如何创建一个P2P连接

SWF通过将来的FMS创建的连接将被分配一个唯一的ID(这个ID看似很难被猜)。其他连接相同服务器的SWF们可以订阅该ID广播的流和事件,当然是在该ID同意的条件下。

在服务端层面,这些ID可以被映射到应用相关的信息中,比如用户名等。对于一个聊天应用来说,这个ID可以连到用户的昵称,当终端用户选择了他们要聊天的对象时,Flash Player将使用这个ID创建一个与那个用户的连接。

 

通过P2P连接我可以发送什么?

之前,你可以通过本地麦克风和摄象头采集流并上传到服务器,同样的,你也将可以将这些流直接发给另外一个已经连接上的PEER

通过NetStream.Send 你可以在应用中发送一些有用的共享数据。任何的数据格式在这个函数中都可以被发送,不过对包大小还是有限制的。

 

PEER连接是如何工作的?

RTMFP UDP包从一个Flash Player直接发送到另一个。服务端负责将Peer IDs解释到网络地址,如果它们中有一方或者全都在NAT设备后,服务端也将协助它们建立连接。如果UDP被防火墙禁掉或者RTMFP协议在mms.cfg的配置文件里被禁掉,peer连接将无法建立。

 

我可以选择UDP或者TCP吗?

不。RTMFP是基于UDP的协议。你将自动地使用UDP协议当你调用了这些函数时。

 

RTMFP允许在Flash Player10上传输大文件吗?

不。大型的文件交换网络应用依赖一项能力,就是可以在需要时,不断地从硬盘中读取一部分文件数据到内存中。在Flash Player中,你可以从机子中加载一个文件,但这个文件需要终端用户手工加载并且将一直存在于内存中。资源的耗尽将导致这个类型的应用毫无用处。

 

我现在可以开始RTMFP吗?

虽然RTMFPFlash Player 10已经支持了,但还没有服务端支持来处理这些请求。如果你打算尝试还没发布的服务端,请发邮件给 fmsprerelease@adobe.com

Feb 11

Ctrl+1 快速修复(最经典的快捷键,就不用多说了)
Ctrl+D: 删除当前行
Ctrl+Alt+↓ 复制当前行到下一行(复制增加)
Ctrl+Alt+↑ 复制当前行到上一行(复制增加)
Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)
Alt+↑ 当前行和上面一行交互位置(同上)
Alt+← 前一个编辑的页面
Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)
Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性
Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)
Shift+Ctrl+Enter 在当前行插入空行(原理同上条)
Ctrl+Q 定位到最后编辑的地方
Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)
Ctrl+M 最大化当前的Edit或View (再按则反之)

Continue reading »

Dec 31

再过两个小时后,2009即将过去,来总结一下这一年:

1.最大的事件当然是终于在上海有了自己的两室两厅的房子,并且买的时机恰好合适,在楼市价格未回升之前.算是解决了人生的一件大事.

2.对java和swing组件的应用有了长足的进步,并且用java为洋洋兄开发了随访系统,只是稍微留了一点点尾巴,需到明年来完成了.关于这个项目的进度实在有愧洋洋兄.

3.和瓣瓣兄做了些小东西,没少受累,米少少,算是赚了点零花钱.

4.英语的进步程序和规划相差甚远.

5.51ria.com的项目半半落落,能卖的没卖到钱,有客户询问的却没能完成.鸡肋也,但和鸡肋又有区别,希望在下年能变成一只”肥鸡”,少收入一点也有点心理安慰.

6.公司的事情不想在这里说了.

7.暴发?做人?跨年持续反思中…

2009不知道算是收获或是错过,人生好短,希望2010带给我激情和快乐,事业扬帆启程!

Nov 30

’shift’ + ‘tab’:左移代码; 
‘alt’ + ‘/’:代码提示; 或者自己在key里找到 content assist自己设置
‘ctrl’ +’o’:快速查找以及指向变量或函数或者mxml组件的id;
‘ctrl’ + ‘d’:删除一行代码; [用它你会上瘾的]
‘ctrl’ + ‘m’:在最大化与还原之间切换获得焦点的窗口; 很常用的啦, 非常方便, 另外双击窗口也可以实现同样的

‘ctrl’ +’e’:快速查找以及指向打开的文件; [在打开的文件很多时尤其实用]
‘tab’:右移代码; [也很常用,非常方便]
‘ctrl’ + ‘~’:代码和设计模式切换;
‘ctrl’ + ‘/’:注釋一行ActionScript代碼[很常用]
‘ctrl’ + ’shift’ + ‘c’:添加<!– –>或/* */
‘ctrl’ + ’shift’ + ‘d’:添加<![CDATA[  ]]>
‘ctrl’ + 鼠標左鍵: 快速指向所點擊類文件

Nov 23

rundll32.exe shimgvw.dll,ImageView_Fullscreen 图片文件路径
例如:
rundll32.exe shimgvw.dll,ImageView_Fullscreen C:\WINDOWS\Web\Wallpaper\Bliss.bmp

Nov 18

在java中联接Access中多采用jdbc-odbc的方式,传统做法是在 windows系统下的管理工具里分建一个数据源指向Access数据厍文件。

这样建立的应用程序加大了布属难度。要解决这个问题可以像其它(例如:VB,Delphi等)IDE那样用自建数据源(也称动态数据源)来完成。

联系方法如下:

public class faq
{

    String sDBDriver;
    String sConnStr;
    Connection conn;
    ResultSet rs;

/**

* 初始化联接

*/

    public faq(){
        String dbc = getFilePathRoot()+”/jspshop/database/db.mdb”;
        sDBDriver = “sun.jdbc.odbc.JdbcOdbcDriver”;
        sConnStr = “jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=”+dbc;
        conn = null;
        rs = null;
        try{
            Class.forName(sDBDriver);
        }catch(ClassNotFoundException classnotfoundexception){
            System.err.println(”faq(): ” + classnotfoundexception.getMessage());
        }
    }

/**

* 联接构建好后使用方法就和其它的联接使用方法一样了

*/

public void executeInsert(String s)
    {
        try{
            conn = DriverManager.getConnection(sConnStr);
            Statement statement = conn.createStatement();
            statement.executeUpdate(s);
        }catch(SQLException sqlexception){
            System.err.println(”faq.executeUpdate:” + sqlexception.getMessage());
        }
    }

/**

* 取得应用程序运行的跟目录

*/

 public String getFilePathRoot(){
     String filepath=”";
  filepath = this.getClass().getResource(”").getPath();
  filepath = filepath.substring(0,filepath.indexOf(”/WEB-INF”));
  filepath = filepath.substring(1,filepath.length());
  return filepath;
 }

}

Nov 18

import java.sql.*;
public class Access{
  public static void main(String args[]) throws Exception{
  String strurl=”jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=D:\\projects\\demo.mdb”;
  Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver”);
  Connection conn=DriverManager.getConnection(strurl) ;
  Statement stmt=conn.createStatement();
  ResultSet rs=stmt.executeQuery(”select * from mcp_swty_player”);
  while(rs.next())
  System.out.println(rs.getString(”player_mobile”));
  rs.close();
  stmt.close();
  conn.close();
  }
}

Sep 10

本文转载自http://www.cnblogs.com/zack/archive/2009/05/30/1492307.html
只是转载,不代表本人对其观点的认同。

PureMVC大大的优化了我们使用FLEX进行前台的开发,使得整个开发过程变的较为可控,但是如果放任程序员去自由的使用pureMVC也会带来很大的隐患。本文内容主要记录我使用pureMVC开发原型这一个星期来使用的一些开发规范和经验总结。

1. 如果有个项目有几个开发人员共同开发,同时采用版本控制工具对项目项目的源码进行版本控制,可是维护通

知的名称着实让人烦恼,我们若要将通知名称放在同一 个类中{ApplicationFacade}就不能很好的使用版本控制工具,因为每个人都要修改这个类 {在你修改时你要看看别人是否已经修改该文件,别人若是修改了还得让他提交,然后自己更新再修改,太痛苦了!} ,而且都放在一个类里也会增加维护的难度,那么有没有什么好的办法呢?

通常一两个人做个例子时遇到这种情况可能比较好解决,单如果参与的人较多的化,可能花在协调上面的工作

量就会比较多,为了增加开发的速度,使开发变的更加的简单,我们可以让通知名称分散到各个模块的Mediator

类中进行维护{每个模块主页面的协调类,可根据自己的系统大小控制粒度},这样每个开发人员可以只要维护自身的通知名称或者只要与一两个人进行协调,同时我们要求每个通知名称都要包含该类所在的包路径和类名称,具体的格式可以是”通知名称+包路径.类名称”,这样我们只要保证通知名称唯一,且便于日后维护。

2. 每个Mediator,Proxy都要定一个NAME属性,通常我要求每个NAME属性必须是”包路径+类名称”,也是

为了避免不必要的冲突,找半天BUG。

3. PureMVC中Mediator似乎什么都可以坐了,Command的用处似乎不大。

这是一个错误的看法,虽然我们在Mediator中可以直接获取到Proxy,Mediator类的对象,也可以注册

Mediator,Proxy,Command,但是我们必须给自已一个约束,不然随着开发的不断深入你会发现代码也越来越乱。所以我们增加了较为严禁的约束:

3.1 通常情况在程序启动后,Mediator负责注册Command,以及派发通知和接收通知,当Mediator类需要进行当前范围外的一些操作时就可以通过派发通知的方式。一般来说页面UI主要负责页面的布局和简单的作,其他的应该交由Mediator来处理。例如,Mediator协调的UI需要获取数据,这是Mediator可以派发一个获取数据的通知(之前已经注册一个用于处理该通知的Command),然后有pureMVC会初始化被注册的Command并执行获取数据的操作。如果你需要告知另外一个页面进行某些操作或者增加一个新的页面,也应该通过派发通知的方式来处理,应避免在当前Mediator类中直接获取响应页面的对象或者获取Mediator类进行操作,如果是增加一个新的页面应当在页面加载后将该页面的对象作为报体通知Command进行注册以及其他操作。

3.2 Command主要负责注册Mediator和Proxy以及协调Mediator和Proxy之间的操作,应当将复杂的操作放在这里处理。Command的注册不必集中但也不可以太过分散,一般来说放在比功能级稍大点的Mediator中来注册(例如一个增删改查,4个页面需要不停的切换,关于这4个页面功能的Command一般来说都是放在这四个页面的上一层页面的Mediator中进行注册,也就是管理这四个页面的Mediator中)。当我们要增加啊一个新的UI时需要通知Command来注册Mediator,需要调用model层对数据进行处理时也应通知Command来调用,如果一个Command类里的代码过多,应当考虑进行拆分,Command类应尽可能分的细点,便于维护。

3.3Proxy主要负责对数据的维护以及与服务器端进行通信处理数据。Proxy应当做到只做纯粹的数据处理不干涉过多的逻辑处理,不关心外面发生了什么事情,只要在数据处理后派发通知来通知外界即可,如果各个Proxy之间需要进行交互,那也应该在Command中来是先调用不用Proxy的方法,不要在Proxy中直接去调用另一个Proxy更不能去调用Mediator。

4.注意清除你不用的Mediator,Proxy,Command应当及时的清除,pureMVC采用观察者模式,及时的清楚能减轻系统的负担,但是有时无法做到清楚指定的Mediator等对象,所以在每次注册新的Mediator,Command,Proxy时要判断是否已经存在相同的类,然后根据自己的需要选择是重新注册还是继续使用以前的,切不可同时注册两个相同的,例如:当你有两个相同的Mediator时,你通过NAME属性去获取该对象,那究竟获取哪一个对象才是你想要的呢?