上大學的時候,看到好多精彩炫麗的flash,學習了一些flash的知識。那個時候不怎么會寫腳本,就用動畫的概念一幀一幀的拼出一個flash。后來工作以后,給客戶在線演示產品,有接觸了Captivate。2006年末的時候,客戶要求開發一個在線產品展示平臺,我偶然搜到了adobe用flex開發的網上購物演示,就體會到如果用flex來實現這個產品展示平臺將是很動人的事情,由于某種原因最終未能如愿。最近在做一個通用視頻培訓平臺時又用到了FLV播放器,也是用Flex開發的,最終效果和土豆、優酷非常類似。這些場景使我對flash的展現效果情有獨鐘,況且有adobe這樣的公司在運作flash,如果可能的話應該在合適的場合來把flex集成到我們現在開發的應用中,比如圖表功能、表單功能、打印功能等等?;谝陨系慕洑v和思路,決定花功夫學習一下flex還是值得的。
首先,到adobe官方網站下載flex builder 3(當前最新版本)并安裝。安裝完畢后會看到一些入門文章中提到的Flex SDK已經在builder中存在了,所以初學僅下載個builder就夠了。
然后,打開builder發現它就是基于eclipse開發的,我想這個IDE對于大多數java開發著再熟悉不過了。首次進入時會有一個歡迎界面和初學者向導,我比較習慣看看這些東西,點擊下載提供的入門工程Flex3GSEIII_a_WorkingWithData_JSP,并導入builder中??纯垂こ探Y構跟我們平時的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文件?;ㄒ欢螘r間生成完畢,打開類似于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:
?
?1
var?excel??=?new?ActiveXObject("Excel.Application");?//創建AX對象excel
?2
excel.visible?=true;?//設置excel可見屬性
?3
var?workbook?=?excel.Workbooks.Add;?//獲取workbook對象
?4
var?sheet1?=?xlBook.Worksheets(2);??//創建sheet1
?5
var?sheet2?=?xlBook.Worksheets(1);??//創建sheet2
?6
sheet1.Range(sheet1.Cells(1,1),sheet1.Cells(1,14)).mergecells=true;?//合并單元格
?7
sheet1.Range(sheet1.Cells(1,1),sheet1.Cells(1,14)).value="員工月考核成績";?//設置單元格內容
?8
sheet1.Range(sheet1.Cells(1,1),sheet1.Cells(1,14)).Interior.ColorIndex=6;//設置底色?
?9
sheet1.Range(sheet1.Cells(1,1),sheet1.Cells(1,14)).Font.ColorIndex=5;//設置字體色?
10
sheet1.Rows(1).RowHeight?=?20;?//設置列高
11
sheet1.Rows(1).Font.Size=16;??//設置文字大小
12
sheet1.Rows(1).Font.Name="宋體";?//設置字體
13
//設置每一列的標題
14
sheet1.Cells(2,1).Value="工程師考核項";
15
sheet1.Cells(2,2).Value="總分";
16
sheet1.Cells(2,3).Value="研發進度";
17
sheet1.Cells(2,4).Value="出勤率";
18
sheet1.Cells(2,5).Value="執行力";
19
sheet1.Cells(2,6).Value="責任心";
20
sheet1.Cells(2,7).Value="工作規范";
21
sheet1.Cells(2,8).Value="協作精神";
22
sheet1.Cells(2,9).Value="進取性";
23
sheet1.Cells(2,10).Value="工作合理性";
24
sheet1.Cells(2,11).Value="解決問題能力";
25
sheet1.Cells(2,12).Value="應變能力";
26
sheet1.Cells(2,13).Value="人際技能";
27
sheet1.Cells(2,14).Value="理解能力";
28
//從表單循環控件中取出數據逐行插入對應列的數據
29
var?count?=?sfform.GetAttributeValue('Repeat','Count');
30
for(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 部門.組織編號 = 組織.編號
轉眼做程序已經1年半了,現在的工作似乎很不可思議,自己也搞不清是否真正屬于一個程序員。每天面對msn上幾十個客戶(大多數都是程序員),忙得不亦樂乎,總是不斷的switch workspace,客戶的問題你要能重現才行。也許這也是一種鍛煉吧,需要十足的耐心,千萬不能浮躁,一旦出現問題還要不斷的debug!
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文件,添加內容如下:
1
export JAVA_HOME=/usr/java/j2sdk1.4.2_10
2
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
3
export 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是否啟動成功)
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'");
6
while (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;
11
while ((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盤下是一樣的,說明入庫出庫成功!