‘编程学习’ 分类下的所有文章
2010七月14

Buffalo ajax实例

Buffalo是国人开发的Ajax框架,它可以使用户在js中方便的调用java代码里的方法。

后台配置方法:

1. web.xml中配置相关servlet 如下:

<!–buffalo ajax–>
    <servlet>
        <servlet-name>buffalo</servlet-name>
        <servlet-class>net.buffalo.web.servlet.ApplicationServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>buffalo</servlet-name>
        <url-pattern>/buffalo/*</url-pattern>
    </servlet-mapping>

2. 需要引入的jar包为:

加入两个jar包:buffalo-2.0.jar和commons-logging-api-1.0.4.jar(下载包里有,下载地址见文章最后)。

注:若commons-logging-api-1.0.4.jar不加入,会抛出异常。

3. 编写需要调用的业务类。
如:
1. desktopService.java

package oa.ajax;

/**
 * Created by IntelliJ IDEA.
 * User: wizzer
 * Date: 2010-7-15
 * Time: 16:08:22
 * To change this template use File | Settings | File Templates.
 */
public class desktopService {
        public String getInfoCount(String userId,String depId){

             return "0|1|2";
        }
}

4. 配置文件中配置业务类

 配置文件为:buffalo-service.properties  位置在classes下
 
 内容如下:
 
desktopService=oa.ajax.desktopService
 
 多个类则配置多个: 格式 名称=业务类全名
 
 注意:js里则通过  desktopService来代替oa.ajax.desktopService类执行其中的业务方法
 
 到此后台代码结束

下面为前台调用

5. 在jsp中引入js文件:prototype.js 和 buffalo.js 文件

 <script type=”text/javascript” src=”js/prototype.js”></script>
 <script type=”text/javascript” src=”js/buffalo.js”></script>
 
6. 编写调用js代码

注意:helloService这个是配置文件中配置的名称

<script type="text/javascript">  
      var endPoint = "<%=request.getContextPath()%>/buffalo"; 
      var buffalo = new Buffalo(endPoint);   
      var userId= "wizzer";
      var deptId = "HITS";

function getEventCount() {
 try {
  var buffalo = new Buffalo(endPointTop);

         buffalo.remoteCall("desktopService.getInfoCount", [userId, deptId], function(reply) {

                var str = reply.getResult();
             var ary = str.split("|");

    document.getElementById("msg").innerHTML = "(" + ary[0] + ")";
    document.getElementById("mail").innerHTML = "(" + ary[1] + ")";
    document.getElementById("wait").innerHTML = "(" + ary[2] + ")";
         });
 } catch (ex) {
 }
}

</script>   

    
    <input type=”button” value=”Buffalo远程调用” onclick=”getEventCount();”/>
   
    消息<div id=”msg”></div>
 信箱<div id=”mail”></div>
 待办<div id=”wait”></div>
   
   
Buffalo ajax 最新版下载地址:http://buffalo.sourceforge.net/download.html

2010七月9

CSS+DIV+UL+LI 实现简单下拉菜单

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>wizzer.cn</title>
<style type="text/css">
<!--
* {
margin:0px;
padding:0px;
font-family:"宋体";
font-size:12px;
text-align:center;
}
body ul{
margin:0px auto;
}
#mean{
width:500px;
margin:0px auto;
padding:0px;
}
#mean li{
float:left;
list-style-type:none;
width:80px;
padding:1px;
line-height:25px;
}
.a{
    background-color: #9DDFAA;
    color: #060;
    text-decoration: none;
    border: 1px solid #0C6;
    display: block;

}
.a:hover{
    color: #FFFFFF;
    background-color: #12581A;
    border: 1px solid #6AFF6A;
}
.list{
    width: 80px;

}
.list ul{
margin:0px auto;
padding:0px;
}
.list li{
    float: left;
    height: 18px;
    width: 80px;
}
.b{
    width: 80px;
    background-color: #55BF60;
    line-height:18px;
    display: block;
    text-decoration: none;
    color: #000;
    filter:Alpha(opacity=70);
}
.b:hover{
    background-color: #FFFFFF;
    color: #060;
    text-decoration: none;
    filter:Alpha(opacity=70);
}
.menu2{
    height: 26px;
    width: 80px;
    cursor:hand;
    overflow-y:hidden;
}
#keai{
    width:800px;
    height:50px;
    background-color:#4033D7;
    z-index:-1;
    position: absolute;
    left: 0px;
    top: 35px;
}
-->
</style>
</head>
<body>
<div id="mean">
<ul>
<li onMouseOver="this.className='menu1'"
onMouseOut="this.className='menu2'">
<a href="#">网站首页</a>
<div>
<ul>
<li><a href="#">我的主页</a></li>
<li><a href="#">我的空间</a></li>
<li><a href="#">我的相册</a></li>
<li><a href="#">我的日志</a></li>
</ul>
</div>
</li >
<li onMouseOver="this.className='menu1'"
onMouseOut="this.className='menu2'"><a href="#">新闻公告</a>
<div>
<ul>
<li><a href="#">我的主页</a></li>
<li><a href="#">我的空间</a></li>
<li><a href="#">我的相册</a></li>
<li><a href="#">我的日志</a></li>
</ul>
</div>
</li>
<li onMouseOver="this.className='menu1'"
onMouseOut="this.className='menu2'"><a href="#">产品信息</a>
<div>
<ul>
<li><a href="#">我的主页</a></li>
<li><a href="#">我的空间</a></li>
<li><a href="#">我的相册</a></li>
<li><a href="#">我的日志</a></li>
</ul>
</div>
</li>
<li onMouseOver="this.className='menu1'"
onMouseOut="this.className='menu2'"><a href="#">最新推荐</a>
<div>
<ul>
<li><a href="#">我的主页</a></li>
<li><a href="#">我的空间</a></li>
<li><a href="#">我的相册</a></li>
<li><a href="#">我的日志</a></li>
</ul>
</div>
</li>
<li onMouseOver="this.className='menu1'"
onMouseOut="this.className='menu2'"><a href="#">联系我们</a>
<div>
<ul>
<li><a href="#">我的主页</a></li>
<li><a href="#">我的空间</a></li>
<li><a href="#">我的相册</a></li>
<li><a href="#">我的日志</a></li>
</ul>
</div>
</li>
</ul>
</div>
</body>
</html>
2010七月9

IE浏览器提示保存文件navcancl解决办法

点“开始->运行”输入“iexplore.exe -nohome -extoff” 打开浏览器

首先取消锁定工具栏,禁用你安装的其他第三方工具栏..

然后打开 工具->internet选项->高级->将“SmartScreen筛选器”勾掉.

2010七月7

实现鼠标拖动div交换位置

<html>
<head>
<title>月影</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<style>
body {margin:0px;padding:0px;font-size:12px;text-align:center;}
body > div {text-align:center; margin-right:auto; margin-left:auto;}
.content{width:900px;}
.content .left{
        float:left;
        width:20%;
        border:1px solid #FF0000;
        margin:3px;
}
.content .center{float:left;border:1px solid #FF0000;margin:3px;width:57%}
.content .right{float:right;width:20%;border:1px solid #FF0000;margin:3px}
.mo{height:auto;border:1px solid #CCC;margin:3px;background:#FFF}
.mo h1{background:#ECF9FF;height:18px;padding:3px;cursor:move}
.mo .nr{height:80px;border:1px solid #F3F3F3;margin:2px}
h1{margin:0px;padding:0px;text-align:left;font-size:12px}
</style>
<script>
var dragobj={}
window.onerror=function(){return false}
function on_ini(){
        String.prototype.inc=function(s){return this.indexOf(s)>-1?true:false}
        var agent=navigator.userAgent
        window.isOpr=agent.inc("Opera")
        window.isIE=agent.inc("IE")&&!isOpr
        window.isMoz=agent.inc("Mozilla")&&!isOpr&&!isIE
        if(isMoz){
                Event.prototype.__defineGetter__("x",function(){return this.clientX+2})
                Event.prototype.__defineGetter__("y",function(){return this.clientY+2})
        }
        basic_ini()
}
function basic_ini(){
        window.$=function(obj){return typeof(obj)=="string"?document.getElementById(obj):obj}
        window.oDel=function(obj){if($(obj)!=null){$(obj).parentNode.removeChild($(obj))}}
}
window.onload=function(){
        on_ini()
        var o=document.getElementsByTagName("h1")
        for(var i=0;i<o.length;i++){
                o[i].onmousedown=function(e){
                        if(dragobj.o!=null)
                                return false
                        e=e||event
                        dragobj.o=this.parentNode
                        dragobj.xy=getxy(dragobj.o)
                        dragobj.xx=new Array((e.x-dragobj.xy[1]),(e.y-dragobj.xy[0]))
                        dragobj.o.style.width=dragobj.xy[2]+"px"
                        dragobj.o.style.height=dragobj.xy[3]+"px"
                        dragobj.o.style.left=(e.x-dragobj.xx[0])+"px"
                        dragobj.o.style.top=(e.y-dragobj.xx[1])+"px"
                        dragobj.o.style.position="absolute"
                        var om=document.createElement("div")
                        dragobj.otemp=om
                        om.style.width=dragobj.xy[2]+"px"
                        om.style.height=dragobj.xy[3]+"px"
                        dragobj.o.parentNode.insertBefore(om,dragobj.o)
                        return false
                }
        }
}
document.onselectstart=function(){return false}
window.onfocus=function(){document.onmouseup()}
window.onblur=function(){document.onmouseup()}
document.onmouseup=function(){
        if(dragobj.o!=null){
                dragobj.o.style.width="auto"
                dragobj.o.style.height="auto"
                dragobj.otemp.parentNode.insertBefore(dragobj.o,dragobj.otemp)
                dragobj.o.style.position=""
                oDel(dragobj.otemp)
                dragobj={}
        }
}
document.onmousemove=function(e){
        e=e||event
        if(dragobj.o!=null){
                dragobj.o.style.left=(e.x-dragobj.xx[0])+"px"
                dragobj.o.style.top=(e.y-dragobj.xx[1])+"px"
                createtmpl(e)
        }
}
function getxy(e){
        var a=new Array()
        var t=e.offsetTop;
        var l=e.offsetLeft;
        var w=e.offsetWidth;
        var h=e.offsetHeight;
        while(e=e.offsetParent){
                t+=e.offsetTop;
                l+=e.offsetLeft;
        }
        a[0]=t;a[1]=l;a[2]=w;a[3]=h
  return a;
}
function inner(o,e){
        var a=getxy(o)
        if(e.x>a[1]&&e.x<(a[1]+a[2])&&e.y>a[0]&&e.y<(a[0]+a[3])){
                if(e.y<(a[0]+a[3]/2))
                        return 1;
                else
                        return 2;
        }else
                return 0;
}
function createtmpl(e){
        for(var i=0;i<12;i++){
                if($("m"+i)==dragobj.o)
                        continue
                var b=inner($("m"+i),e)
                if(b==0)
                        continue
                dragobj.otemp.style.width=$("m"+i).offsetWidth
                if(b==1){
                        $("m"+i).parentNode.insertBefore(dragobj.otemp,$("m"+i))
                }else{
                        if($("m"+i).nextSibling==null){
                                $("m"+i).parentNode.appendChild(dragobj.otemp)
                        }else{
                                $("m"+i).parentNode.insertBefore(dragobj.otemp,$("m"+i).nextSibling)
                        }
                }
                return
        }
        for(var j=0;j<3;j++){
                if($("dom"+j).innerHTML.inc("div")||$("dom"+j).innerHTML.inc("DIV"))
                        continue
                var op=getxy($("dom"+j))
                if(e.x>(op[1]+10)&&e.x<(op[1]+op[2]-10)){
                        $("dom"+j).appendChild(dragobj.otemp)
                        dragobj.otemp.style.width=(op[2]-10)+"px"
                }
        }
}
</script>
</head>
<body>
<div>
        <div id=dom0>
                <div id=m0>
                        <h1>dom0</h1>
                        <div></div>
                </div>
                <div id=m1>
                        <h1>dom1</h1><div></div>
                </div>
                <div id=m2><h1>dom2</h1><div></div></div>
                <div id=m3><h1>dom3</h1><div></div></div>
        </div>
        <div id=dom1>
                <div id=m4><h1>dom4</h1><div></div></div>
                <div id=m5><h1>dom5</h1><div></div></div>
                <div id=m6><h1>dom6</h1><div></div></div>
                <div id=m7><h1>dom7</h1><div></div></div>
        </div>
        <div id=dom2>
                <div id=m8><h1>dom8</h1><div></div></div>
                <div id=m9><h1>dom9</h1><div></div></div>
                <div id=m10><h1>dom10</h1><div></div></div>
                <div id=m11><h1>dom11</h1><div></div></div>
        </div>
</div>
</body>
</html>
2010七月1

收藏:魅族M8 Android内核源码和固件下载

魅族官方提供了M8的Android内核源码,包含了完整的驱动以及说明,由于MEIZU M8的物理硬件和iPhone一样平时操作的只有1个Home键无法模拟,Android的Back、Menu以及其他因素魅族放弃了M8跑Android的计划。由于M8使用的是Samsung ARM11内核的S3C6410工作频率为667MHz,山寨厂商有一定的借鉴价值。

  有关魅族M8的ADB驱动 http://m8-android-kernel.googlecode.com/files/M8_6410_adb_driver.rar

  M8的Android编译好固件下载,刷机方法和Wince的一致,下载后直接解压放到USB Storage的根目录 http://code.google.com/p/m8-android-kernel/source/browse/bin/m8_android.rar 

  M8 for Android源码托管在Google Code上面,使用SVN工具直接提取 浏览地址 http://code.google.com/p/m8-android-kernel/source/browse/#svn/trunk 需要注意的是Android开发网发现有关Modem这块代码没有,涉及到了英飞凌的机密,不过可以看到编译好的库,直接挂上即可。

  SVN Checkout地址 http://m8-android-kernel.googlecode.com/svn/trunk

  最后是Android123找到的有关M8的移植文章网上整理的word文档,有兴趣的网友可以DIY下,不过Android开发网表示Android和M8原始的Wince比较差距较大,个人还是建议使用完善的WinCE系统,毕竟可以直播RMVB、WinCE对于M8更适合些。

  1. make menuconfig

A. 串口改成串口3输出打印信息。
(一) (root=/dev/nfs init=/init nfsroot=192.168.1.10:/nfs ip=192.168.1.100 console=ttySAC2,115200
console=ttySAC2,串口2输出,必须与下面同时修改
(二) System Type  —>S3C UART to use for low-level messages—>2
值设成2,即串口2输出,必须与上面同时修改。

B. Onenand驱动支持
(一) Device Drivers  —>Memory Technology Device (MTD) support  —>OneNAND Device Support  —>
[*]   Verify OneNAND page writes                                
<*>   OneNAND Flash device via platform device driver
(二) onenand的支持
从贺超提供的linux2.6.27包drivers\mtd\onenand目录复制s3c6410.h,s3c_onenand.c,s3c_onenand.h提供对三星onenand的支持
(三) Makefile修改
drivers\mtd\onenand\Makefile文件最后添加一行:onenand-objs = s3c_onenand.o,编译s3c_onenand.o,连接进内核。
(四) 在arch\arm\mach-s3c6410\mach-smdk6410.c中
 
static struct platform_device pmem_gpu1_device = {
 .name = “android_pmem”,
 .id = 1,
 .dev = { .platform_data = &pmem_gpu1_pdata },
};
#endif
的后面添加代码:
/*add by liuyihui 2009-08-21*/
/*
*添加onenand驱动支持
*/
/* OneNAND Controller */
/* OneNAND flash controller */
#define S3C64XX_PA_ONENAND     (0x70100000)
#define S3C64XX_SZ_ONENAND     SZ_1M
static struct resource s3c_onenand_resource[] = {
 [0] = {
  .start = S3C64XX_PA_ONENAND,
  .end   = S3C64XX_PA_ONENAND + S3C64XX_SZ_ONENAND – 1,
  .flags = IORESOURCE_MEM,
 }
};
或者替换新的代码:
 arch\arm\plat-s3c64xx\devs.c,
linux/arch/arm/mach-s3c6400/include/mach/map.h
struct platform_device s3c_device_onenand = {
 .name    = “onenand”,
 .id    = -1,
 .num_resources   = ARRAY_SIZE(s3c_onenand_resource),
 .resource   = s3c_onenand_resource,
 .dev.platform_data = &s3c_nand_mtd_part_info
};
/*add end*/
在数组static struct platform_device *smdk6410_devices[] __initdata = {的最后添加:
 &s3c_device_onenand /*add by liuyihui 2009-08-21*/
(五) 分区表修改:使userdata从0x0a000000开始
文件linux/arch/arm/plat-s3c/include/plat/partition.h中:
 
        {
                .name  = “cache”,
                .offset  = MTDPART_OFS_APPEND,
                .size  = (67*SZ_1M)+0x1000000,//orig:(67*SZ_1M)/*modified by cefanty 2009-08-21*/
        },
 
(六) 修改drivers\mtd\onenand\generic.c
复制drivers\mtd\onenand\generic.c替换掉。
 

C. Device Drivers  —>Input device support  —>  []   Keyboards  —>
(一) 暂时去掉键盘支持,因为键盘占用了GPK14口,GPK14口在M8是USB供电开关的GPIO,拉高才能用USB

D. Device Drivers  —> [*] USB support  —>  <*>   USB Gadget Support  —>
(一) <*>   USB Gadget Drivers (Ethernet Gadget (with CDC Ethernet supp
(二) Ethernet Gadget (with CDC Ethernet support)             
(三) [ ]       RNDIS support
(四) d.1)选择Ethernet Gadget (with CDC Ethernet supp,用于把M8模拟成网卡,实现nfs挂载系统。同时去掉RNDIS support支持,因为ubuntu下没有驱动支持。
(五) drivers\usb\gadget\s3c-udc-otg-hs.c修改为USB使用外部晶振
 
//writel(0x20, S3C_USBOTG_PHYCLK); /*commented by liuyihui 2009-08-24*/
writel(0x00, S3C_USBOTG_PHYCLK);  /*00:USB使用外部晶振。modified by liuyihui 2009-08-24*/

2. 驱动移植和修改

A. LCD驱动移植
i. drivers\video\Kconfig,搜索config FB_S3C_LTS222QV,在后面添加如下选项
config FB_S3C_LMS340KC01
 bool “LMS340KC01”
 —help—
 TBA
ii. 添加驱动:drivers\video\samsung\s3cfb_lms340kc01.c
 
a) 复制刘奕辉开发的s3cfb_lms340kc01.c驱动到目录drivers\video\samsung\
b) 在drivers\video\samsung\Makefile文件最后添加内容:
obj-$(CONFIG_FB_S3C_LMS340KC01) += s3cfb_lms340kc01.o
iii. 修改drivers\video\samsung\s3cfb_fimd4x.c,在函数s3cfb_set_gpio最后注释代码,添加:
 

#if 0/*commented by liuyihui 2009-08-24*/
 /* module reset */
 if (gpio_is_valid(S3C64XX_GPN(5))) {
  err = gpio_request(S3C64XX_GPN(5), “GPN”);

  if (err) {
   printk(KERN_ERR “failed to request GPN for ”
    “lcd reset control\n”);
   return err;
  }

  gpio_direction_output(S3C64XX_GPN(5), 1);
 }

 mdelay(100);

 gpio_set_value(S3C64XX_GPN(5), 0);
 mdelay(10);

 gpio_set_value(S3C64XX_GPN(5), 1);
 mdelay(10);

 gpio_free(S3C64XX_GPF(15));
 gpio_free(S3C64XX_GPN(5));
#endif

/*add by liuyihui 2009-08-24*/
/*
*打开M8 LCD需要用到的GPIO口
*/
#if 1 //M8 GPIO set hight
 /* module reset *///LCD_nRESET_SHIFT/*4*/
 if (gpio_is_valid(S3C64XX_GPQ(4))) {
  err = gpio_request(S3C64XX_GPQ(4), “GPQ”);

  if (err) {
   printk(KERN_ERR “failed to request GPQ for ”
    “lcd reset control\n”);
   return err;
  }
  gpio_direction_output(S3C64XX_GPQ(4), 1);
 }
 mdelay(100);
 gpio_free(S3C64XX_GPQ(4));

 /* module reset *///LCD_nSS_SHIFT/*5*/
 if (gpio_is_valid(S3C64XX_GPQ(5))) {
  err = gpio_request(S3C64XX_GPQ(5), “GPQ”);

  if (err) {
   printk(KERN_ERR “failed to request GPQ for ”
    “lcd reset control\n”);
   return err;
  }
  gpio_direction_output(S3C64XX_GPQ(5), 0);
 }
 mdelay(100);
 gpio_free(S3C64XX_GPQ(5));
  
 /* module reset *///LCD_MOSI_SHIFT/*7*/
 if (gpio_is_valid(S3C64XX_GPQ(6))) {
  err = gpio_request(S3C64XX_GPQ(6), “GPQ”);

  if (err) {
   printk(KERN_ERR “failed to request GPQ for ”
    “lcd reset control\n”);
   return err;
  }
  gpio_direction_output(S3C64XX_GPQ(6), 1);
 }
 mdelay(100);
 gpio_free(S3C64XX_GPQ(6));
 
  /* module reset *///LCD_MOSI_SHIFT/*7*/
 if (gpio_is_valid(S3C64XX_GPQ(7))) {
  err = gpio_request(S3C64XX_GPQ(7), “GPQ”);

  if (err) {
   printk(KERN_ERR “failed to request GPQ for ”
    “lcd reset control\n”);
   return err;
  }
  gpio_direction_output(S3C64XX_GPQ(7), 1);
 }
 mdelay(100);
 gpio_free(S3C64XX_GPQ(7));
 
 /* module reset *///LCD_CLK_SHIFT/*8*/
 if (gpio_is_valid(S3C64XX_GPQ(8))) {
  err = gpio_request(S3C64XX_GPQ(8), “GPQ”);

  if (err) {
   printk(KERN_ERR “failed to request GPQ for ”
    “lcd reset control\n”);
   return err;
  }
  gpio_direction_output(S3C64XX_GPQ(8), 1);
 }
 mdelay(100);
 gpio_free(S3C64XX_GPQ(8));

#endif

 return 0;
}
/*add end*/
c) 
iv. 修改drivers\video\samsung\s3cfb_spi.c,在函数s3cfb_set_gpio最后注释代码,添加:
 
在代码#elif defined(CONFIG_PLAT_S3C64XX)后面添加:

#define MEIZU_M8
#ifdef MEIZU_M8
#define S3C_FB_SPI_CLK(x) (S3C64XX_GPQ(8 + ( 4)))
#define S3C_FB_SPI_MOSI(x) (S3C64XX_GPQ(7 + (4)))
#define S3C_FB_SPI_CS(x) (S3C64XX_GPQ(6 + (4)))
#else
#define S3C_FB_SPI_CLK(x) (S3C64XX_GPC(1 + (ch * 4)))
#define S3C_FB_SPI_MOSI(x) (S3C64XX_GPC(2 + (ch * 4)))
#define S3C_FB_SPI_CS(x) (S3C64XX_GPC(3 + (ch * 4)))
#endif

B. 触摸屏移植
drivers\input\touchscreen:synaptics510_i2c.c,synaptics510_i2c.h,Makefile,Kconfig
      
C. 按键移植
覆盖如下文件:目录drivers\input\keyboard\下的:gpio_keys.c
 

3. Busybox在Android上的使用

To build busybox
• Download the latest version of busybox from the following website. At the time of writing the latest version was v.1.13.3.
http://www.busybox.net
• Extract the busybox source:
tar jxf busybox-1.13.3.tar.bz2
• Configure busybox by running menuconfig
cd busybox-1.13.3/
make menuconfig
• In menuconfig set the following options
Busybox Settings –> Build Options –> Build Busybox as a static binary (no shared libs)  –  Enable this option by pressing “Y”
Busybox Settings –> Build Options –> Cross compiler prefix  –  Set this option equal to “arm-none-linux-gnueabi-”
Busybox Settings –> Installation Options –> Don’t use /usr  –  Enable this option by pressing “Y”
Linux Module Utilities  —>  [ ] Simplified modutils 这项不能选,否则insmod 驱动模块加载会提示找不到*.ko驱动文件的路径
• Export path to where the cross-compiler is located on the host, for example:
export PATH=/opt/arm/arm-2007q3/bin:$PATH
• Build busybox
make
 
Installing Busybox
________________________________________
To install busybox in the target file-system
• Create a /bin directory in the target file-system. For example:
mkdir /<path-to-android-fs>/bin
• Copy the busybox binary to the /bin directory in the target file-system
cp busybox /<path-to-android-fs>/bin
•  Install the busybox command line tools on the target by executing the following commands:
cd /bin
./busybox –install
 
Make the Busybox shell the default shell
________________________________________
To make the busybox shell the default shell, edit the file “init.rc” in the target file-system as follows:
• Edit the console service so that it runs the busybox shell and not the default shell by replacing:
service console /system/bin/sh
With:
service console /bin/sh
• Add the path of the busybox command line tools to the system path variable by replacing:
export PATH /sbin:/system/sbin:/system/bin:/system/xbin
With
export PATH /bin:/sbin:/system/sbin:/system/bin:/system/xbin

Android cupcake 1.5版移植

1. 在Android挂载SD移植

cupcake 1.5版需要改写下列文件。

A.    编译mountd,并在文件系统中启动这一服务。

   修改 system/core/mountd/Android.mk文件,开放最后一行

    # disabled – we are using vold now instead
    # include $(BUILD_EXECUTABLE)
    为:

    # disabled – we are using vold now instead
    include $(BUILD_EXECUTABLE)

B.     增加 安装mountd.conf 文件

      修改 system/core/rootdir/init.rc文件

   释放下两行:

     service mountd /system/bin/mountd
          socket mountd stream 0660 root mount
C.     修改  system/core/rootdir/Android.mk 文件, 增加 etc/mountd.conf \,如下:

    copy_from := \
       etc/dbus.conf \
       etc/init.goldfish.sh \
       etc/mountd.conf \
       etc/hosts
D. 修改根文件系统的system\etc \mountd.conf文件:
block_device    /dev/block/mmcblk0

2010六月28

触摸屏全屏浏览器(可定时关机) C#2005 源代码

1、星期一至五,会按设定时间关机,你可以在出现关机提示时点取消(倒计时30秒);
2、星期六日,启动程序即提示关机,无操作则自动关机,若点取消,还会在设定的时间再一次提示关机(倒计时30秒);
3、按*号后输入密码,退出程序回到桌面;
4、参数设置:找到安装目录下的SystemConfig.xml文件,其中starturl为起始网页地址;returntime为多久无操作返回起始网页(单位:分钟);offtime为每天关机时间;exitkey为退出程序的密码;
5、软件需要.NET2.0环境,环境安装包有些大,就不上传了,请到 http://www.microsoft.com/downloads/details.aspx?FamilyID=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5&displaylang=zh-cn 下载

开源地址:http://code.google.com/p/full-screen-touch-browser/

可以通过本站下方的EMAIL与作者交流~:)

2010六月28

PHP webservice客户端 推送文章和附件(xsd:base64Binary)

<?php
//设定字符集
header('Content-Type:text/html;charset=utf-8');

//调用webserver接口class类
require_once('./lib/nusoap.php');

require_once('Article.class.php');     //封装文章信息类
require_once('Attribute.class.php');    //封装字段attr类
require_once('Appendix.class.php');     //封装附件信息类

//-------------------封装推送信息内容开始
$a1 = new Attribute();
$a1->setAttrName('aaa');
$a1->setAttrValue('aaaaa');
$a2 = new Attribute();
$a2->setAttrName('bbb');
$a2->setAttrValue('bbbbbb');
$ar[] = $a1;
$ar[] = $a2;
echo $ar[0]->getAttrName('aaa');

$Article = new Article();
$Article->setArticleContent(mb_convert_encoding('vvvvvvvvvvv<a href="a.txt">a.txt</a>...<img src="tmp.jpg">','UTF-8','GBK'));   //文章正文
$Article->setArticleTitle(mb_convert_encoding("12212AAABBBABAAA".date('Ymd'),'UTF-8','GBK'));   //文章题目
$Article->setAttr($ar);      //文章定制属性组
$Article->setCreateTime(date('YmdHis'));   //文章创立时间
$Article->setDepartment("tongjiju");    //用户部门
$Article->setDescription("description");      //文章描述
$Article->setImportant("0");      //文章级别
$Article->setKeyword("keyword");       //文章关键字
$Article->setLoginName("tongjiju");     //用户登录名
$Article->setModifyTime(date('YmdHis'));   //文章修改时间
$Article->setPassword("tongjiju");     //用登录口令
$Article->setWebName(mb_convert_encoding("市政府子网站群二期 > 市统计局 > 市情简介",'UTF-8','GBK')); //网站的名称
$Article->setCommendId(0);
$client = new nusoap_client("http://221.122.*.*:7006/cmsweb/services/TransferArticle?wsdl", true);
$err = $client->getError();
if ($err) {
echo "<h2>Constructor error</h2><pre>". $err ."</pre>";
}
$godata='';
//文章中存在附件 'finishMark'=>false-------------------------------------------------------------
$godata=array('article'=>$Article,'finishMark'=>false);
$result = $client->call("transferContent", $godata);
if ($client->fault) {
echo "<h2>Fault</h2><pre>";
print_r($result);
echo "</pre>";
} else {
$err = $client->getError();
if ($err) {
   echo "<h2>Error</h2><pre>" . $err . "</pre>";
} else {
   echo "<h2>Result</h2><pre>";
   print_r($result);
   echo "</pre>";
}
}
$aid=$result['transferContentReturn'];

if ($aid){

//第一个附件 'finishMark'=>false-------------------------------------------------------------
$filepath='a.txt';
$fp=fopen($filepath, "rb");
    $filedata=fread($fp, filesize($filepath));
fclose($fp);
$Appendix = new Appendix();
$Appendix->setFileContent(base64_encode($filedata));
$Appendix->setFileName('a.txt');
$Appendix->setFileType('txt');
$godataf=array('aid'=>$aid,'apd'=>$Appendix,'finishMark'=>false);
$resultf = $client->call("transferAppendix", $godataf);
echo '<br><br>';
echo "<h2>Result_f</h2><pre>";
print_r($resultf);
echo "</pre>";

//最后附件 'finishMark'=>true-------------------------------------------------------------
$filepath2='tmp.jpg';
$fp2=fopen($filepath2, "rb");
    $filedata2=fread($fp2, filesize($filepath2));
fclose($fp2);
$Appendix2 = new Appendix();
$Appendix2->setFileContent(base64_encode($filedata2));
$Appendix2->setFileName('tmp.jpg');
$Appendix2->setFileType('image_title');//image_title 此图片为标题图
$godataf2=array('aid'=>$aid,'apd'=>$Appendix2,'finishMark'=>true);
$resultf2 = $client->call("transferAppendix", $godataf2);
echo '<br><br>';
echo "<h2>Result_f2</h2><pre>";
print_r($resultf2);
echo "</pre>";
}
?>
2010六月28

PDF在线阅读开发经验(FlexPaper+SWFTools+SaveAsPDFandXPS)

1、使用SaveAsPDFandXPS将office文档转换成PDF

http://www.microsoft.com/downloads/details.aspx?FamilyID=4d951911-3e7e-4ae6-b059-a2e79ed87041&displaylang=en

微软原计划让Office 2007直接支持保存为PDF格式,但引起了Adobe的不满,并被指责为垄断,最终被迫放弃,改为以插件的形式予以支持,插件大家都知道怎么回事儿,默认不装,要用你的自己找来装上。不过微软针对这件事情也做出了一个回应:发布XPS, XPS则是微软自己利用XML技术开发的新型文档格式。

该插件支持Office 2007的8个组件,包括Word、Excel、Access、PowerPoint、InfoPath、OneNote、Publisher和Visio。安装插件后,用户即可在上述组件中将相应文档存储为PDF格式或XPS格式,还可以方便地将文档保存为PDF/XPS格式的E-mail附件。

2、下载 SWFTools

SWFTools 是一组用来处理 Flash 的 swf 文件的工具包,包括:

1. 合并工具 swfcombine
2. 抽取工具 swfextract
3. PDF/JPEG/PNG/AVI/TTF/WAV 到 SWF 的转换工具 :pdf2swf, jpeg2swf, png2swf, avi2swf, font2swf, and wav2swf|
4. 文本解析工具 swfstrings
5. SWF 解析器 swfdump
6. SWF 读写库 rfxswflib

其中把pdf转成swf的工具就是pdf2swf了。在命令行中运行pdf2swf src.pdf des.swf一般能满足需求。而命令行参数可以通过pdf2swf -f得到:

-h , –help Print short help message and exit 打印帮助信息
-V , –version Print version info and exit 打印版本号
-o , –output file.swf Direct output to file.swf. If file.swf contains ‘13568621′ (file13568630.swf), then each page指定输出的swf文件名
-p , –pages range Convert only pages in range with range e.g. 1-20
or 1,4,6,9-11 or
指定转换的页面范围,使用的页码描述方法与打印机打印文件时候的选页一样

-P , –password password Use password for deciphering the pdf.指定打开pdf的密码
-v , –verbose Be verbose. Use more than one -v for greater effect.转换时输出详细的内容
-z , –zlib Use Flash 6 (MX) zlib compression.使用Flash 6的zlib压缩机制
-i , –ignore Allows pdf2swf to change the draw order of the pdf. This may make the generated允许程序修改pdf的绘制顺序,可能会导致结果与原来有差异
-j , –jpegquality quality Set quality of embedded jpeg pictures to quality. 0 is worst (small), 100 is best (big). (default:85)设置转换其中的jpeg图片的质量,从0到100,默认值是85。
-s , –set param=value Set a SWF encoder specific parameter. See pdf2swf -s help for more information. 设置SWF转码时候的参数,具体参数可以用pdf2swf -s help获取
-w , –samewindow When converting pdf hyperlinks, don’t make the links open a new window. 设置转换后的swf打开原pdf中的连接时使用相同的窗口
-t , –stop Insert a stop() command in each page. 在每页结尾添加一个stop()命令
-T , –flashversion num Set Flash Version in the SWF header to num. 设置SWF所使用的flash版本号
-F , –fontdir directory Add directory to the font search path. 指定字体文件所在路径
-b , –defaultviewer Link a standard viewer to the swf file. 指定默认的swf导航文件,用来翻页、放大缩小等等
-l , –defaultloader Link a standard preloader to the swf file which will be displayed while the main swf is loading. 指定默认的swf加载文件,用来显示加载进程效果
-B , –viewer filename Link viewer filename to the swf file. 指定swf导航文件,作用同-b
-L , –preloader filename Link preloader filename to the swf file. 指定swf加载文件,作用同-l
-q , –quiet Suppress normal messages. Use -qq to suppress warnings, also. 不打印普通信息,用-qq就不打印警告信息。
-S , –shapes Don’t use SWF Fonts, but store everything as shape. 不使用字体,所有都转为形状。
-f , –fonts Store full fonts in SWF. (Don’t reduce to used characters). 在swf中保存全部字体。
-G , –flatten Remove as many clip layers from file as possible. 在文件中尽量去除影片层,合并它们
-I , –info Don’t do actual conversion, just display a list of all pages in the PDF. 不做实际转换,仅显示PDF的信息。
-Q , –maxtime n Abort conversion after n seconds. Only available on Unix. 如果运行时间超时则退出。

3、java程序,实现上传PDF自动转换成SWF文件

//ajax方法,先解密传过来的文件名,根据判断生成SWF文件后跳转至FLASH页面

if (ajaxAction.equals("exeflash"))   //把PDF成SWF
        {
            String fn = DecodeUtil.Decrypt(StringUtil.null2String(request.getParameter("fn")).trim()).toLowerCase();
            try {
                if (!"".equals(fn) && fn.indexOf("/") > -1 && fn.indexOf(".pdf") > -1) {
                    Map webfileupmap = (Map) Globals.SYS_UPLOAD_CONFIG.get("webfile");
                    String webfilepath = StringUtil.null2String(webfileupmap.get("path")).replace("\\", "\\\\");
                    fn = fn.substring(fn.lastIndexOf("/") + 1);//aa.pdf
                    webfilepath = webfilepath + fn;
                    File f = new File(webfilepath);
                    if (!f.exists()) {
                        return "error";
                        //如果PDF文件不存在则退出
                    }
                    Map webupmap = (Map) Globals.SYS_UPLOAD_CONFIG.get("web");
                    String webpath = StringUtil.null2String(webupmap.get("path")).replace("\\", "\\\\");
                    String urlpath = StringUtil.null2String(webupmap.get("urlpath"));
                    String wname = fn.substring(0, fn.indexOf(".")) + ".swf";
                    webpath = webpath + wname;
                    String wurl = urlpath + wname;
                    boolean issc = false;
                    File f2 = new File(webpath);
                    if (!f2.exists()) {
                        issc = true;
                        //如果文件不存在则生成
                    }
                    if (issc) {
                        String cmd = "C:\\SWFTools\\pdf2swf " + webfilepath + " -o " + webpath + " -T 9";
                        if (StringUtil.executeCmdFlash(cmd) == false) {
                            return "error";
                        }
                        System.out.println("cmd::::::" + cmd);
                    }

                    File f1 = new File(webpath);
                    if (f1.exists()) {
                        ajaxstr = DecodeUtil.Encrypt(wurl);
                    }

                } else {
                    return "error";
                }
            } catch (Exception e) {
                Globals.Logger("发生错误:" + e, 2);
            }

        }

注意:

String cmd = “C:\\SWFTools\\pdf2swf ” + webfilepath + ” -o ” + webpath + ” -T 9″;

加 “-T 9” 参数,设置输出版本为flash9,解决PDF文件只有一页,生成的swf不能播放的问题。

另外,若PDF内表格元素过多,在转换时会抛出一堆异常错误。似乎还没有好的解决办法?

//java调用cmd命令行方法

/**
     * 运行可执行文件
     *
     * @param cmd
     * @return String
     */
    public static synchronized boolean executeCmdFlash(String cmd) {

        try {
            final Process process = Runtime.getRuntime().exec(cmd);
            Runtime.getRuntime().addShutdownHook(new Thread() {
                public void run() {
                    process.destroy();
                }
            });
            InputStreamReader inputstreamreader = new InputStreamReader(process.getInputStream());
            char c = (char) inputstreamreader.read();
            if (c != '\uFFFF')
                stdout.append(c);
            while (c != '\uFFFF') {
                if (!inputstreamreader.ready()) {
                    System.out.println(stdout);
                    try {
                        process.exitValue();
                        break;
                    }
                    catch (IllegalThreadStateException _ex) {
                        try {
                            Thread.sleep(100L);
                        }
                        catch (InterruptedException _ex2) {
                        }
                    }
                } else {
                    c = (char) inputstreamreader.read();
                    stdout.append(c);
                }
            }
            try {
                inputstreamreader.close();
            }
            catch (IOException ioexception2) {
                System.err.println("RunCmd : Error closing InputStream " + ioexception2);
                return false;
            }
        } catch (Throwable e) {
            e.printStackTrace();
            Globals.Logger("发生错误:" + e, 2);
            return false;
        }

        return true;
    }

4、利用FlexPaper展示

FlexPaper是一个被设计用来与PDF2SWF一起使用,开源轻量级的在浏览器上显示各种文档的组件, 使在Flex中显示PDF成为可能,而这个过程并无需PDF软件环境的支持。它可以被当做Flex的库来使用。也可以通过将一些例如Word、PPT等文档转成PDF,然后实现在线浏览。

SwfFile : escape(host+"/upload/web/2010-05-24-10-21-51139.swf"),
      Scale : 0.6,
      ZoomTransition : "easeOut",
      ZoomTime : 0.5,
        ZoomInterval : 0.1,
        FitPageOnLoad : false,
        FitWidthOnLoad : true,
        PrintEnabled : false,
        FullScreenAsMaxWindow : true,
        localeChain: "zh_CN" //设置为中文
      };

5、演示地址

http://www.4th-games.org.cn/sis/public/info.html?doAction=scsg&bsdxid=1009&cdate=all

2010六月26

让电脑替你说"I IOVE YOU"

让电脑替你说"I IOVE YOU":新建一个记事本,在里面输入 CreateObject(“SAPI.SpVoice”).Speak “I love YOU” 保存扩展名为 .VBS 文件 如:我爱你.vbs 双击运行,电脑就会说 i love you 了,如果编好给心爱的人的话一定会让TA惊喜不已!

2010六月26

Android开发 ADT插件安装

安装Eclipse 插件(ADT)
要下载和安装ADT 插件,跟着Google 提供给开发者的步骤:
1. 启动Eclipse,接着选择”Help”>”Software Updates”>”Find and Insta ll”
2. 在出现的对话框中,选择”Search for new features to insta ll” 点击”New”
3. 点击”New Remote Site”
4. 在结果对话框中,为远程站点键入一个名称(如:Android Plugin)并键入
这个URL 作为它的URL:
https://dl-ssl.google.com/android/eclipse/
点击OK。(可能要翻哦墙哦)
5. 现在你应该看到新站点加载到搜索列表中(并选中),点击”Finish”。
6. 在后来搜索结果对话框中,选择”Android Plugin”>”Developer Tools”复选
框。这将会选择”Android Developer Tools”和”Android Editors”特性。
Android Editors 特性是可选的,但是推荐。
现在点击”Newt”
7. 阅读许可协议,选择”Accept terms of th license agreement”, 点击”Next”
8. 点击”Finish”
9. ADT 插件没有被签名;总之,你可以点击”Insta ll All”接受安装
10. 重启Eclipse
11. 在重启后,更新你的Eclipse 配置来指向SDK 目录:
a.选择”Window”>”Preferences” 来打开配置面板。(Mac OS
X:”Eclipse”>”Preferences”)
b.从左边面板中选择”Android”
c.对于主面板中”SDK Location”,点击”Browse”并选中SDK 目录位置
d.点击”Apply”,接着点”OK”