上大学的时候,看到好多精彩炫丽的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中提供的样例控件就都尽收眼底了。
后续:有源文件,有开发工具,你可以随意摆弄这些代码,熟悉语法,熟悉开发环境,熟悉对象属性,拼拼凑凑完成自己的一个组合界面了。
为缓解早晚高峰带来的拥堵,北京交通委经过调研,拟从商业机构、大型商场开始试行错峰上下班,同时拟在IT行业、科研单位试行弹性工作制。昨天,市人大代表赵凤桐透露,具体方案政府还在拟订中。
市人大代表刘国祥在去年的人代会上提出“合理调整上下班时间”建议(见新闻附件)。市交通委对此予以回复称,本市拟试行错开上下班时间和实行弹性工作时间两种方法,缓解早晚高峰的交通压力。目前,已经在开展商业、机关企事业单位等错峰上下班的研究,并提出了调整商业、机关企事业单位上下班时间的初步方案,拟从商业机构开始实施。 此外,交通委还与相关部门进行了协商,对中关村等地区进行调研,拟对某些行业(如IT行业、科研单位等)实行弹性工作制,鼓励在家网上办公。如果这些措施能够实施,则在一定程度上可以削减高峰时段的交通流峰值。
据了解,截至2007年底,北京的机动车保有量已达到310万辆。市交通委表示,从城市交通运行态势来看,出行需求和机动车保有量仍在持续快速增长,高峰时段道路拥堵区域不断扩大、局部路段平均车速下降,缓解拥堵的措施大多被持续快速增长的交通需求所抵消,交通形势依然十分严峻。
这是前两周的新闻了,当时一看到新闻就感觉这条消息很利好,尤其对我们北京的程序员来说。在家办公的利弊,现在业内也没有个具体的说法,这几天有幸在家办公,体验了一把想跟大家谈一谈我的看法。
一,利:
1,节约时间:花在等车、路上、堵车、倒车或开车、停车等交通出行的时间成本。
2,节约金钱:上下班的路费或车位费、油费等,还不算看不到的时间兑换的钱(时间就是金钱)。
3,为国家做贡献:不但给上述新闻中的交通部门减少压力,而且减少了碳的排放量(节能减排)。
4,为公司节约日常费用:占位费,水费,餐费,办公费,交通费。。。。
5,自己时间把握更准确:由于减少了交通环节,个人时间上更有可控性。
二,弊:
1,缺少办公气氛:家中的环境毕竟没有公司那么统一,一个家一个样儿,有条件给自己打造办公环境和气氛的员工恐怕只有少数。
2,增加交流成本:公司面对面的交流只能改成手机对手机,或麦克对麦克,或手指对手指。这些肯定都比面对面花的时间长,还要通讯费上网费。
3,容易受外界干扰:如果家中有妻儿老小,家里很难给你一个封闭环境,你会不断的被“骚扰”,毕竟工作的事情像写程序需要比较心静的环境。
4,容易自由散漫:没有了公司领导的监控和同事的督促,人的自控能力是有限的,没准看新闻泡论坛玩游戏就过了头,耽误的肯定是正事。
5,造成公共资源浪费:公司里的公共资源在家是很难利用好的,比如内部的服务器,局域网和通讯工具。
以上这些是我所能想到的,至于利大还是弊大我没有偏向都是5条。个人还是觉得天时地利人和才适合在家办公,对于不同的人或同一个人的不同时间段都是利弊难辨的。
希望大家能聊一聊自己的看法。
半年以前做过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写应该是很方便的,以后有例子再作补充。
从代码角度来看这种写法不是很灵活,但在能满足用户的需求前提下,这种生成方式还是很受欢迎的,给用户的感觉就是轻
便。个人认为简单就是美!
数据库常见的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 部门.组织编号 = 组织.编号