2006年2月14日

初学flex

     上大学的时候,看到好多精彩炫丽的flash,学习了一些flash的知识。那个时候不怎么会写脚本,就用动画的概念一帧一帧的拼出一个flash。后来工作以后,给客户在线演示产品,有接触了Captivate。2006年末的时候,客户要求开发一个在线产品展示平台,我偶然搜到了adobe用flex开发的网上购物演示,就体会到如果用flex来实现这个产品展示平台将是很动人的事情,由于某种原因最终未能如愿。最近在做一个通用视频培训平台时又用到了FLV播放器,也是用Flex开发的,最终效果和土豆、优酷非常类似。这些场景使我对flash的展现效果情有独钟,况且有adobe这样的公司在运作flash,如果可能的话应该在合适的场合来把flex集成到我们现在开发的应用中,比如图表功能、表单功能、打印功能等等。基于以上的经历和思路,决定花功夫学习一下flex还是值得的。
    首先,到adobe官方网站下载flex builder 3(当前最新版本)并安装。安装完毕后会看到一些入门文章中提到的Flex SDK已经在builder中存在了,所以初学仅下载个builder就够了。
    然后,打开builder发现它就是基于eclipse开发的,我想这个IDE对于大多数java开发着再熟悉不过了。首次进入时会有一个欢迎界面和初学者向导,我比较习惯看看这些东西,点击下载提供的入门工程Flex3GSEIII_a_WorkingWithData_JSP,并导入builder中。看看工程结构跟我们平时的JAVAEE工程有了一些不同。多了bin-debug和html-template文件夹,文件类型主要是*.mxml、*.as。在工程的左侧视图右键*.mxml运行(类似与运行java文件),会有一个编译过程,过后弹出一个html,html中运行的正式flash。当时比较好奇,一个mxml是如何经过编译产生html和flash的,打开刚才提到的bin-debug发现两个文件生成到了这个文件夹。仔细读一下mxml的代码发现跟XHTML基本类似,其中的一些function都是AS写的。至此我分析得到如下结论:mxml+as-->swf,中间的转换是adobe集成在builder中的转换工具完成的。如此跟我们以往HTML+JS的编程习惯很类似了,并且XHTML与AS的结合更紧密一些。由于初学原理性的知识我就理解至此了。
   最后,我们关心的是用flex都能实现哪些控件,并且控件的效果如何。我没有迫不及待的去google,而是又深入到builder的安装目录下,在D:\Flex Builder 3\sdks\3.0.0发现了好东西,别的我不关心,先看samples,子目录下有一个explorer,其中包含一个build.bat。看到这个bat我更加确定了我以上的结论。于是运行bat,开始编译其下的mxml文件逐一生成swf文件。花一段时间生成完毕,打开类似于index的swf文件,sdk中提供的样例控件就都尽收眼底了。
   后续:有源文件,有开发工具,你可以随意摆弄这些代码,熟悉语法,熟悉开发环境,熟悉对象属性,拼拼凑凑完成自己的一个组合界面了。

posted @ 2008-03-12 14:28 beyondduke 阅读(1380) | 评论 (2)编辑 收藏

谈一谈在家办公的利弊


为缓解早晚高峰带来的拥堵,北京交通委经过调研,拟从商业机构、大型商场开始试行错峰上下班,同时拟在IT行业、科研单位试行弹性工作制。昨天,市人大代表赵凤桐透露,具体方案政府还在拟订中。
市人大代表刘国祥在去年的人代会上提出“合理调整上下班时间”建议(见新闻附件)。市交通委对此予以回复称,本市拟试行错开上下班时间和实行弹性工作时间两种方法,缓解早晚高峰的交通压力。目前,已经在开展商业、机关企事业单位等错峰上下班的研究,并提出了调整商业、机关企事业单位上下班时间的初步方案,拟从商业机构开始实施。 此外,交通委还与相关部门进行了协商,对中关村等地区进行调研,拟对某些行业(如IT行业、科研单位等)实行弹性工作制,鼓励在家网上办公。如果这些措施能够实施,则在一定程度上可以削减高峰时段的交通流峰值。
据了解,截至2007年底,北京的机动车保有量已达到310万辆。市交通委表示,从城市交通运行态势来看,出行需求和机动车保有量仍在持续快速增长,高峰时段道路拥堵区域不断扩大、局部路段平均车速下降,缓解拥堵的措施大多被持续快速增长的交通需求所抵消,交通形势依然十分严峻。


这是前两周的新闻了,当时一看到新闻就感觉这条消息很利好,尤其对我们北京的程序员来说。在家办公的利弊,现在业内也没有个具体的说法,这几天有幸在家办公,体验了一把想跟大家谈一谈我的看法。
一,利:
1,节约时间:花在等车、路上、堵车、倒车或开车、停车等交通出行的时间成本。
2,节约金钱:上下班的路费或车位费、油费等,还不算看不到的时间兑换的钱(时间就是金钱)。
3,为国家做贡献:不但给上述新闻中的交通部门减少压力,而且减少了碳的排放量(节能减排)。
4,为公司节约日常费用:占位费,水费,餐费,办公费,交通费。。。。
5,自己时间把握更准确:由于减少了交通环节,个人时间上更有可控性。
二,弊:
1,缺少办公气氛:家中的环境毕竟没有公司那么统一,一个家一个样儿,有条件给自己打造办公环境和气氛的员工恐怕只有少数。
2,增加交流成本:公司面对面的交流只能改成手机对手机,或麦克对麦克,或手指对手指。这些肯定都比面对面花的时间长,还要通讯费上网费。
3,容易受外界干扰:如果家中有妻儿老小,家里很难给你一个封闭环境,你会不断的被“骚扰”,毕竟工作的事情像写程序需要比较心静的环境。
4,容易自由散漫:没有了公司领导的监控和同事的督促,人的自控能力是有限的,没准看新闻泡论坛玩游戏就过了头,耽误的肯定是正事。
5,造成公共资源浪费:公司里的公共资源在家是很难利用好的,比如内部的服务器,局域网和通讯工具。
以上这些是我所能想到的,至于利大还是弊大我没有偏向都是5条。个人还是觉得天时地利人和才适合在家办公,对于不同的人或同一个人的不同时间段都是利弊难辨的。
希望大家能聊一聊自己的看法。

posted @ 2008-01-31 09:48 beyondduke 阅读(4663) | 评论 (12)编辑 收藏

Excel报表之js版

 半年以前做过server端生成excel的简单引擎,总感觉不够轻便,尤其在一些固定格式,数据量又不是很大的情况下,上周写了一

个根据表单数据在client端用js生成excle的demo,令我我激动了半天------js太强了!

下面分享一下这段js:
 
 1var excel  = new ActiveXObject("Excel.Application"); //创建AX对象excel
 2excel.visible =true//设置excel可见属性
 3var workbook = excel.Workbooks.Add; //获取workbook对象
 4var sheet1 = xlBook.Worksheets(2);  //创建sheet1
 5var sheet2 = xlBook.Worksheets(1);  //创建sheet2
 6sheet1.Range(sheet1.Cells(1,1),sheet1.Cells(1,14)).mergecells=true//合并单元格
 7sheet1.Range(sheet1.Cells(1,1),sheet1.Cells(1,14)).value="员工月考核成绩"//设置单元格内容
 8sheet1.Range(sheet1.Cells(1,1),sheet1.Cells(1,14)).Interior.ColorIndex=6;//设置底色 
 9sheet1.Range(sheet1.Cells(1,1),sheet1.Cells(1,14)).Font.ColorIndex=5;//设置字体色 
10sheet1.Rows(1).RowHeight = 20//设置列高
11sheet1.Rows(1).Font.Size=16;  //设置文字大小
12sheet1.Rows(1).Font.Name="宋体"//设置字体
13//设置每一列的标题
14sheet1.Cells(2,1).Value="工程师考核项";
15sheet1.Cells(2,2).Value="总分";
16sheet1.Cells(2,3).Value="研发进度";
17sheet1.Cells(2,4).Value="出勤率";
18sheet1.Cells(2,5).Value="执行力";
19sheet1.Cells(2,6).Value="责任心";
20sheet1.Cells(2,7).Value="工作规范";
21sheet1.Cells(2,8).Value="协作精神";
22sheet1.Cells(2,9).Value="进取性";
23sheet1.Cells(2,10).Value="工作合理性";
24sheet1.Cells(2,11).Value="解决问题能力";
25sheet1.Cells(2,12).Value="应变能力";
26sheet1.Cells(2,13).Value="人际技能";
27sheet1.Cells(2,14).Value="理解能力";
28//从表单循环控件中取出数据逐行插入对应列的数据
29var count = sfform.GetAttributeValue('Repeat','Count');
30for(var line=1;line<=count;line++)//begin for
31  var name  = sfform.GetValue('Repeat['+line+'].name');
32  var total= sfform.GetValue('Repeat['+line+'].total');
33  var yfjd = sfform.GetValue('Repeat['+line+'].yfjd');
34  var jh = sfform.GetValue('Repeat['+line+'].jh');
35  var gcgj = sfform.GetValue('Repeat['+line+'].gcgj');
36  var cql = sfform.GetValue('Repeat['+line+'].cql');
37  var zxl = sfform.GetValue('Repeat['+line+'].zxl');
38  var gzgf = sfform.GetValue('Repeat['+line+'].gzgf');
39  var zrx = sfform.GetValue('Repeat['+line+'].zrx');
40  var xzjs = sfform.GetValue('Repeat['+line+'].xzjs');
41  var jqx = sfform.GetValue('Repeat['+line+'].jqx');
42  var gzhl = sfform.GetValue('Repeat['+line+'].gzh');
43  var jjwt = sfform.GetValue('Repeat['+line+'].jjwt');
44  var ybnl = sfform.GetValue('Repeat['+line+'].ybnl');
45  var rjjn = sfform.GetValue('Repeat['+line+'].rjjn');
46  var ljnl = sfform.GetValue('Repeat['+line+'].ljnl');
47  sheet1.Cells(2+line,1).Value=name;
48  sheet1.Cells(2+line,2).Value=total;
49  sheet1.Cells(2+line,3).Value=yfjd;
50  sheet1.Cells(2+line,4).Value=cql;
51  sheet1.Cells(2+line,5).Value=zxl;
52  sheet1.Cells(2+line,6).Value=gzgf;
53  sheet1.Cells(2+line,7).Value=zrx;
54  sheet1.Cells(2+line,8).Value=xzjs;
55  sheet1.Cells(2+line,9).Value=jqx;
56  sheet1.Cells(2+line,10).Value=gzhl;
57  sheet1.Cells(2+line,11).Value=jjwt;
58  sheet1.Cells(2+line,12).Value=ybnl;
59  sheet1.Cells(2+line,13).Value=rjjn;
60  sheet1.Cells(2+line,14).Value=ljnl;
61
62}
//end for
63
64

基本的代码已经实现了,生成excel的格式和一些统计计算,用js写应该是很方便的,以后有例子再作补充。

从代码角度来看这种写法不是很灵活,但在能满足用户的需求前提下,这种生成方式还是很受欢迎的,给用户的感觉就是轻

便。个人认为简单就是美!

posted @ 2006-08-05 11:14 beyondduke 阅读(6583) | 评论 (7)编辑 收藏

数据库常见的三种join方式(收藏)

数据库常见的join方式有三种:inner join, left outter join, right outter join(还有一种full join,因不常用,本文不讨论)。这三种连接方式都是将两个以上的表通过on条件语句,拼成一个大表。以下是它们的共同点:

  1. 关于左右表的概念。左表指的是在SQL语句中排在left join左边的表,右表指的是排在left join右边的表。
  2. 在拼成的大表中,左表排在左边,右表排在右边。
  3. on条件语句最好用=号对两表相应的主外键进行连接。当然,也可以用其他操作符,如>, <, 来连接两表的任一字段,此时的关系将非常复杂,连接后的记录数也随之而变得不确定。如果在一些特殊的场合中需要用到这种方式,必须通过简单的实例加以确认,否则,连接结果很可能不是我们所想要的!
  4. on条件语句不能省略。
  5. 可以连锁使用join,每次使用join都令另一表与当前的表或连接的结果相连接。


在下文中,用到了两个表,"部门"表与"组织"表,其中,"部门"表有一名为"组织编号"的外键,指向"组织"表中的主键"编号"。

inner join

  格式:select * from 部门 inner join 组织 on 部门.组织编号 = 组织.编号

  目的:将两表中符合on条件的所有记录都找出来。

  规律:

    1. 拼出的大表记录不会增加。
    2. 如果左边与右表的关系是一对多的关系,在选出的任一记录中,假若右表有多个记录与其对应,那么,连接后的左表,主键将不再唯一。

  典型应用:将存在多关系的引用表放在左表,将存在一关系的被引用表放在右表,通过=号将主外键进行连接,通过对右表设定过滤条件,选出相应的且主键唯一的左表记录。

  备注:inner join 是默认的连接方式,可缩写为join。

  转化为where子句:

    select * from 部门, 组织 where 部门.组织编号 = 组织.编号

 

left outter join

  格式: select * from 部门 left join 组织 on 部门.组织编号 = 组织.编号

  格式: select * from 组织 left join 部门 on 组织.编号 = 部门.组织编号

  目的:将左表的所有记录列出,右表中只要符合on条件的,与左表记录相拼合,不符合条件的,填以null值。

  规律:

    1. 选出所有符合条件的左表,如果左边与右表的关系是一对一的关系,则拼成的大表记录不会改变。
       如果左边与右表的关系是多对一的关系,则拼成的大表记录也不会改变。
       如果左边与右表的关系是一对多的关系,则拼成的大表记录会增加。对于每一具有一对多关系的左表记录,如果左表1:N与右表对应,那么会多出N-1条记录。例如,如果左表第一条记录1:3对应于右表,多出2条记录。如果左表第二条记录1:2对应于右表,则再多出1条记录。这样,总共多出3条记录。其他类推。
    2. 如果左边与右表的关系是一对多的关系,在选出的任一记录中,假若右表有多个记录与其对应,那么,连接后的左表,主键将不再唯一。
    3. 如果左边与右表的关系是一对多的关系,对于左表任一记录,如果右表没有记录与其相对应,则全部填以null值。

  典型应用:将存在多关系的引用表放在左表,将存在一关系的被引用表放在右表,通过对右表设定过滤条件,选出相应的且主键唯一的左表记录。

  备注:left outter join可用left join代替。在有些数据库中,如HSqlDb, 只能使用left join而不能使用left outter join。

  转化为where子句:

    select * from 部门, 组织 where 部门.组织编号 = 组织.编号


right outter join

  格式: select * from 部门 right join 组织 on 部门.组织编号 = 组织.编号

  格式: select * from 组织 right join 部门 on 部门.组织编号 = 组织.编号

  目的:将右表的所有记录列出,左表中只要符合on条件的,与右表记录相拼合,不符合条件的,填以null值。

  规律:(与left outter join相反)

  典型应用:可转化成left outter join。例如

    select * from 组织 right join 部门 on 部门.组织编号 = 组织.编号
    与
    select * from 部门 left join 组织 on 部门.组织编号 = 组织.编号
    的效果一样

  备注:right outter join可用right join代替。在有些数据库中,如HSqlDb, 没有实现right join功能。

  转化为where子句:

    select * from 部门, 组织 where 部门.组织编号 = 组织.编号

posted @ 2006-05-18 09:43 beyondduke 阅读(5814) | 评论 (1)编辑 收藏

递归小程序

递归

posted @ 2006-03-29 09:31 beyondduke 阅读(286) | 评论 (0)编辑 收藏

程序员的方向

转眼做程序已经1年半了,现在的工作似乎很不可思议,自己也搞不清是否真正属于一个程序员。每天面对msn上几十个客户(大多数都是程序员),忙得不亦乐乎,总是不断的switch workspace,客户的问题你要能重现才行。也许这也是一种锻炼吧,需要十足的耐心,千万不能浮躁,一旦出现问题还要不断的debug!

posted @ 2006-03-25 11:21 beyondduke 阅读(384) | 评论 (0)编辑 收藏

linux 下配置java环境(jdk和tomcat)

JDK的配置:

    1,  下载j2sdk-linux-i386-rpm.bin
    2,运行命令:chmod +x j2sdk-linux-i386-rpm.bin     (修改成可执行权限)
    3,执行:./ j2sdk-1_3_1-linux-i386-rpm.bin        (执行后生成rpm安装包j2sdk-linux-i386.rpm)
    4,rpm -ivh j2sdk-1_3_1-linux-i386-rpm     (安装成功后,jdk将被安装在/usr/java/目录下)
    5,   vi当前用户(例root目录下)的.bash_profile文件,添加内容如下:

1export JAVA_HOME=/usr/java/j2sdk1.4.2_10
2export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.
jar
3export PATH=$PATH:$JAVA_HOME/bin

     6,java命令,验证环境是否配置成功。

TOMCAT的配置:
    
     1,下载jakarta-tomcat-5.0.28.tar.gz
     2, tar zxvf jakarta-tomcat.tar.gz
     3, 转换路径cd到tomcat/bin目录下:./startup.sh (启动tomcat)
     4, 在ie浏览器输入http://servername:port   (验证tomcat是否启动成功)
      

   

posted @ 2006-02-14 12:34 beyondduke 阅读(889) | 评论 (0)编辑 收藏

JDBC实现oracle blob 出库入库

1,首先建一个足够简单的表imageTable
      id         varchar(20)
      image   blob
2,blob入库
      拷贝Sunset.jpg图片在C盘根目录下     
 1      DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); 
 2      Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:beyondduke","duke","duke"); 
 3      conn.setAutoCommit(false); 
 4      BLOB blob = null
 5      PreparedStatement pstmt = conn.prepareStatement("insert into imageTable(id,image) values(?,empty_blob())"); 
 6      pstmt.setString(1,"10001"); 
 7      pstmt.executeUpdate(); 
 8      pstmt.close(); 
 9      pstmt = conn.prepareStatement("select content from imageTable where id= ? for update"); 
10      pstmt.setString(1,"10001"); 
11      ResultSet rs = pstmt.executeQuery(); 
12     if (rs.next()) blob = (BLOB) rs.getBlob(1); 
13      String fileName = "c://Sunset.jpg"
14      File f = new File(fileName); 
15      FileInputStream fin = new FileInputStream(f); 
16      System.out.println("file size = " + fin.available()); 
17      pstmt = conn.prepareStatement("update imageTable set image=? where id=?"); 
18      OutputStream out = blob.getBinaryOutputStream(); 
19       byte[] data = new byte[(int)fin.available()]; 
20      fin.read(data); 
21      out.write(data); 
22      out.close(); 
23      fin.close(); 
24
25      pstmt.setBlob(1,blob); 
26      pstmt.setString(2,"fankai"); 
27
28      pstmt.executeUpdate(); 
29      pstmt.close(); 
30
31      conn.commit(); 
32      conn.close(); 
浏览数据库的数据,发现image项中数据大小与图片大小一致,说明入库了!
 3,blob出库
 1   DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
 2   Connection conn = DriverManager.getConnection(            "jdbc:oracle:thin:@localhost:1521:beyondduke""duke","duke");     
          conn.setAutoCommit(
false);
 3    Statement stmt = conn.createStatement();
 4/* 查询BLOB对象 */
 5    ResultSet rs = stmt.executeQuery("SELECT content FROM javatest WHERE id='1001'");
 6while (rs.next()) {
 7/* 取出此BLOB对象 */    
 8    oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("image");
 9 BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("d://Sunset.jpg"));            
           BufferedInputStream in 
= new BufferedInputStream(blob    .getBinaryStream());        
10    int c;
11while ((c = in.read()) != -1{ out.write(c);        
12   }

13   in.close();
14   out.close();
15   rs.close();
16   stmt.close();
17   conn.close();
18
检查D盘根目录,会发现Sunset.jpg文件,跟C盘下是一样的,说明入库出库成功!

posted @ 2006-02-14 09:23 beyondduke 阅读(2649) | 评论 (0)编辑 收藏

<2006年2月>
2930311234
567891011
12131415161718
19202122232425
2627281234
567891011

导航

统计

公告


MSN联系

常用链接

留言簿(2)

随笔分类

随笔档案

我的连接

搜索

最新评论

阅读排行榜

评论排行榜