隨筆:25 文章:1 評(píng)論:66 引用:0
          BlogJava 首頁(yè) 發(fā)新隨筆
          發(fā)新文章 聯(lián)系 聚合管理

          2006年6月2日

          Sorry, I have already moved to JavaEye and Fanfou, please update if you have questions.
          posted @ 2009-05-09 22:13 steeven 閱讀(236) | 評(píng)論 (0)編輯 收藏
           
          最近讓新來的實(shí)習(xí)生寫訂餐機(jī)器人,羽毛球活動(dòng)預(yù)定機(jī)器人,兩個(gè)人寫了幾個(gè)星期,看得我心急火燎?,F(xiàn)在的研究生啊。。。。

          自己拿來skype4java看了一下,感覺很好用。里面提供了一個(gè)application機(jī)制,類似socket,又強(qiáng)于socket。為什么說強(qiáng)呢?因?yàn)槭腔趕kype, 穿透防火墻啦。
          windows自帶的遠(yuǎn)程桌面很好用,在速度上,比以前基于位圖傳送的netmeeting/pcanywhere之類的都要強(qiáng)。
          linux下面的遠(yuǎn)程桌面做的比較好的是nx系列。但是這些遠(yuǎn)程桌面的致命問題就是網(wǎng)關(guān)、防火墻問題。
          就是說你要在家訪問公司電腦,基本上要在防火墻上鑿洞,或者借助于vpn,softether之類的東東。

          skype的application利用skype自身的通訊機(jī)制,屏蔽了這些問題,當(dāng)然,你的應(yīng)用也必須依賴skype了。

          java做遠(yuǎn)程桌面要能截屏、控制鼠標(biāo)鍵盤,所幸有java.awt.Robot, 原來這個(gè)東西是為了做自動(dòng)化測(cè)試,剛好。
          剩下就是穿數(shù)據(jù)的問題。屏幕圖片,如果是bmp,比較碩大,即使是上網(wǎng)等文本界面,壓縮下來也要幾十k, 如果網(wǎng)絡(luò)帶寬不夠的話,比如公司有幾個(gè)下載愛好者,會(huì)比較慘。所以呢,決定傳差異,緩存前面的屏幕,看看如果差別不大,就只傳變化的部分。這樣數(shù)據(jù)量就比較小。但是呢,壓縮圖片的時(shí)候就不能采用有損壓縮啦,否則屏幕會(huì)變得越來越怪異。。。

          比較遺憾的是沒能象windows自帶的rdp那樣攔截繪圖操作,在點(diǎn)陣圖的方案上效率還是比較低的。希望有高手指點(diǎn)!

          skype4java是個(gè)日本人寫的,幾個(gè)聽了我介紹的朋友都有這疑問:日本人寫的?
          呵呵,如果你能寫出更好的,咱就不用它。那個(gè)日本作者還不錯(cuò),上班比較忙,還是答應(yīng)抽空fix幾個(gè)bug,感謝中~

          體驗(yàn)一下吧:skypeRDP
          posted @ 2006-12-06 20:18 steeven 閱讀(2611) | 評(píng)論 (6)編輯 收藏
           

          適用版本GWT 1.0.21。
          由于目前google web toolkit還沒有正式release, 所以問題多多。記錄一下碰到的問題:

          1. Shell調(diào)試模式和實(shí)際編譯結(jié)果有差異。
          shell中報(bào)告的異常在運(yùn)行中只是一些凌亂的腳本錯(cuò)誤,或者干脆沒有響應(yīng)。
          shell中通過的程序在實(shí)際運(yùn)行時(shí)還會(huì)有錯(cuò)誤。
          2. 避免錯(cuò)誤的方法是捕獲異常,
          在onModuleLoad方法中try catch
          或者GWT.setUnCaughtExceptionHandler()//全局異常捕獲
          3. LOG, 利用GWT.log(). shell模式下會(huì)輸出到控制臺(tái)。
          4. 遠(yuǎn)程調(diào)用屬于異步。同步遠(yuǎn)程調(diào)用可以自己包裝ClientCallback,在一個(gè)結(jié)束后調(diào)用另外一個(gè).
          5. RPC調(diào)用中Set傳遞有bug, 暫時(shí)用List
          6. Eclipse直接運(yùn)行Compiler/Shell, 加入gwt-dev-windows.jar。
          main: com.google.gwt.dev.GWTCompiler/GWTShell
          arguments: -out ${project_loc}\WebContent real/Index.html
          classpath->UserEnties->advanced->add folder->選擇項(xiàng)目的src目錄,要在第一位。
          7. Tomcat5問題多多, 用tomcat4.
          8. gwt-user中非法包含javax.servlet, tomcat認(rèn)為其無效。直接放到tomcat/common/lib中?;蛘咴趈ar中去掉。
          9. Exception.getStackTrace() 在Shell模式下有效, GWT.isScript()可以判斷
          10. 靜態(tài)中文在html中亂碼,要在html header中加入<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

          posted @ 2006-07-14 18:10 steeven 閱讀(2951) | 評(píng)論 (6)編輯 收藏
           
          開發(fā)設(shè)計(jì)兩個(gè)類:
          雞,構(gòu)造的時(shí)候要帶入蛋.
          蛋,構(gòu)造的時(shí)候要帶入雞.

          編譯沒問題,初始化數(shù)據(jù)的時(shí)候問題出來了.
          new 雞(new 蛋(???)) //蛋是誰(shuí)下的?
          作為一個(gè)正統(tǒng)的進(jìn)化論學(xué)生,解決如下:構(gòu)造原始雞類,雞開始是不下蛋的,把雞的構(gòu)造函數(shù)改成空的,這時(shí)候初始化一條原始雞的數(shù)據(jù)沒問題.然后進(jìn)化出來蛋,雞下的,類不用改,把蛋的數(shù)據(jù)初始化好.這時(shí)候雞進(jìn)化,由蛋孵出來,構(gòu)造方法要帶蛋進(jìn)來,初始化一只新雞,刪除原始雞數(shù)據(jù).

          OK,問題解決了嗎?這樣程序每次初始化數(shù)據(jù)的時(shí)候要改造雞類,好像不大容易啊....

          那上帝造物學(xué)說怎樣解決問題呢?:
          雞1 = new 雞(null);
          蛋1 = new 蛋(null);
          雞1.set蛋(蛋1);
          蛋1.set雞(雞1);
          save(雞1,蛋1);
          雞和蛋同時(shí)出來了.上帝造物法勝利

          是不是我的類設(shè)計(jì)有問題,怎么會(huì)碰到雞生蛋蛋孵雞這種郁悶的問題呢?
          posted @ 2006-07-02 20:28 steeven 閱讀(1461) | 評(píng)論 (2)編輯 收藏
           

          db4o目前還沒有unique index/primary key機(jī)制。(5.4)

          ???? public ? static ? void ?main(String[]?args)? {
          ????????ObjectContainer?db?
          = ?Db4o.openFile( " test.yap " );
          ????????db.set(
          new ?User( " abc " , 234 ));
          ????????db.set(
          new ?User( " abc " , 234 ));
          ????????ObjectSet
          < User > ?list? = ?db.query(User. class );
          ????????System.out.println(list);
          ????????db.close();?
          // halt?without?this?line?in?5.2
          ????}

          上面的例子會(huì)存儲(chǔ)兩個(gè)同樣的User對(duì)象。
          僅有的ID是一個(gè)存儲(chǔ)文件中的ID, 經(jīng)過碎片整理之后會(huì)發(fā)生變化,顯然不適用。
          要實(shí)現(xiàn)一個(gè)auto_increament的主鍵恐怕要自行實(shí)現(xiàn)?;蛘哂靡延械腢UID實(shí)現(xiàn)。

          可能db4o太年輕的關(guān)系,目前還沒有支援這些功能。建議用@Annotation來實(shí)現(xiàn)。并且控制存儲(chǔ)。
          @ID
          @Unique
          @Index
          在EJB3里面已經(jīng)有現(xiàn)成的定義可以參考。
          posted @ 2006-06-19 18:15 steeven 閱讀(919) | 評(píng)論 (0)編輯 收藏
           
          原來說是xaml只是隨著下一個(gè)版本的windows放出,后來改編到winfx里面,最近聽說作為.net3.0出現(xiàn).這樣的直接后果就是這個(gè)b/s+c/s通吃的UI框架不但要寄生在新版windows里面,也要被用來在xp上攻城略地.

          微軟這回蓄勢(shì)待發(fā)xaml有多強(qiáng)大呢?3d(感覺不夠純粹)/強(qiáng)大的數(shù)據(jù)綁定/動(dòng)畫/多媒體支持...
          這里可怕的不僅僅是框架,還有配套的GUI開發(fā)工具.有趣的是Interactive Designer據(jù)說就是用wpf開發(fā)的.
          xaml只是個(gè)xml描述文件,里面可以包含代碼,編譯成UI界面.所有的界面內(nèi)容也可以由程序動(dòng)態(tài)運(yùn)行.
          這樣未來運(yùn)行在browser里面的UI不是復(fù)雜的ajax,是和后臺(tái)一致的托管代碼.

          Java怎樣應(yīng)對(duì)呢?Java+Flash? 開發(fā)bs都困難重重.除非Flash能放棄as,直接同java結(jié)合,或者兩個(gè)公司合作開發(fā)一個(gè)新框架.這個(gè)新框架應(yīng)該是什么樣子呢?完全的3D視角,時(shí)間軸控制...重演c#后來居上的歷史.

          Java在Sun的手里一直半死不活,真希望能趕快被google并購(gòu),或者sun主動(dòng)把java捐贈(zèng)出來.

          如果沒有"意外",在wpf正式發(fā)行以后,桌面應(yīng)用將逐步過渡到wpf開發(fā).HTML由于其跨平臺(tái),可能會(huì)平分秋色.

          面對(duì)wpf,如何反抗?java.net是太監(jiān),在.net陣營(yíng)里面連二奶都不算,等于投降.
          利用xaml? xaml被編譯加載,其執(zhí)行框架還是.net,機(jī)會(huì)似乎不大.在瀏覽器上可能會(huì)有類似lasszlo的組合.

          作為Java愛好者,祈禱奇跡發(fā)生吧,還好在Java世界中奇跡是家常便飯 :)
          posted @ 2006-06-18 22:57 steeven 閱讀(2458) | 評(píng)論 (3)編輯 收藏
           

          一般Apply按鈕應(yīng)該在用戶有輸入時(shí)有效,輸入沒有變化時(shí)無效。
          為了達(dá)到這個(gè)效果,一般界面上每個(gè)輸入控件要監(jiān)聽,并且和以前的值做比較,實(shí)現(xiàn)起來相當(dāng)麻煩。

          因?yàn)槲覀円延械慕缑媸腔跀?shù)據(jù)綁定,綁定到一個(gè)克隆的對(duì)象上。這樣判斷有沒有變化就很簡(jiǎn)單,updateInput之后,比較兩個(gè)對(duì)象是否一致即可。

          什么時(shí)候去判斷呢?在用戶輸入之后:捕捉鍵盤、鼠標(biāo)事件。

          攔截鍵盤鼠標(biāo)事件目前找到兩種方法:
          1. Toolkit.getDefaultToolkit().addAWTEventListener(listener,eventMask);
          這個(gè)方法注冊(cè)全局的監(jiān)聽機(jī)制,無論哪個(gè)窗口。里面注冊(cè)為weakHashmap,應(yīng)該不用考慮垃圾回收問題。因?yàn)槭侨值模唤ㄗh采用。
          2. 攔截每個(gè)component自己的事件。
          正常來說,如果在textbox里面打字,事件不會(huì)交給window處理。enableInputMethods(true)可以幫忙。
          enable以后調(diào)用getInputContext(),取得InputContext處理。
          注意,InputContext的dispatchEvent(AWTEvent)會(huì)接到各種消息,感興趣的getID()有以下三個(gè):
          ???MouseEvent.MOUSE_CLICKED
          ???MouseEvent.MOUSE_WHEEL
          ???KeyEvent.KEY_TYPED

          posted @ 2006-06-13 16:52 steeven 閱讀(1633) | 評(píng)論 (2)編輯 收藏
           
          上海這方面活動(dòng)比較少,難得逮到一個(gè),跑去湊個(gè)熱鬧。天不作美,下班前一場(chǎng)大雨,讓參加的人少了很多。

          零星記了一些筆記,對(duì)我這個(gè)ajax門外漢來說收獲還是很大。主講是ajaxcn.org的兩位高手。robbin的Rubby講座因?yàn)闀r(shí)間關(guān)系要改期。

          1. JS2的一些新特性:class/extend/interface/package/import/塊作用域/操作符函數(shù). 明年底會(huì)有browser開始支持。
          //干脆把java直接搬到browser里面算了。
          //以后是不是弄個(gè)標(biāo)準(zhǔn)接口允許加載不同語(yǔ)言的腳本引擎?大家就不用受js的鳥氣了。
          2. 推薦的ajax框架:Dojo/DWR/Prototype/GWT/YUI
          //排名有先后
          3. 新技術(shù):
          canvas 畫圖,已有多數(shù)瀏覽器支持。據(jù)說有人用它實(shí)現(xiàn)了3D游戲
          SVG 基于xml的矢量圖。據(jù)說和canvas都支持3d繪圖。
          E4X: xml的包裝, firefox支持
          4. 技術(shù)和需求水漲船高 //我們不會(huì)失業(yè)了
          5. HiJax:
          用傳統(tǒng)方式快速開發(fā)。在傳統(tǒng)網(wǎng)頁(yè)基礎(chǔ)上hack成ajax應(yīng)用。
          對(duì)禁用js的瀏覽器表現(xiàn)為傳統(tǒng)網(wǎng)頁(yè)。
          前期開發(fā)和后期改造獨(dú)立性很強(qiáng)。
          //后期要改造為完美的ajax,對(duì)server端要做些小的改動(dòng)來適應(yīng)。
          6. 推薦用FireFox調(diào)試AJAX, 插件三劍客:
          firebug/web develope tool/temper data分別用來調(diào)試腳本,觀察頁(yè)面dom,監(jiān)聽通信。
          //js調(diào)試的日子好過多了,但不要忘記總體效率。。。

          回來路上和一位tx聊起來ajax在企業(yè)中的地位好像不高,他對(duì)敏捷開發(fā)很有好感,對(duì)辦公室環(huán)境的要求很有趣。
          本次活動(dòng)的主要心得是:自助餐很好吃,以后有活動(dòng)還要去吃 :)
          posted @ 2006-06-07 23:44 steeven 閱讀(1327) | 評(píng)論 (4)編輯 收藏
           
          gwt的這些特性還是很有意思的,感覺比echo更貼近html, 比如說尺寸等數(shù)據(jù),寫"20%"和"200px"都可以。echo則盡量封裝的象swing, 屏蔽掉html.

          anyway, 對(duì)于大多數(shù)邏輯都在客戶端的應(yīng)用,gwt可以大展身手。比如小游戲~

          guess number demo看這里:http://steeven.googlepages.com/MyApp.html
          完全在瀏覽器上運(yùn)行的玩意,沒有寫一句js,感覺還是很爽的~

          代碼如下:
          package?org.steeven.gwt.test.client;

          import?com.google.gwt.core.client.EntryPoint;
          import?com.google.gwt.user.client.Random;
          import?com.google.gwt.user.client.ui.Button;
          import?com.google.gwt.user.client.ui.ClickListener;
          import?com.google.gwt.user.client.ui.DialogBox;
          import?com.google.gwt.user.client.ui.Grid;
          import?com.google.gwt.user.client.ui.HasHorizontalAlignment;
          import?com.google.gwt.user.client.ui.RootPanel;
          import?com.google.gwt.user.client.ui.TextBox;
          import?com.google.gwt.user.client.ui.VerticalPanel;
          import?com.google.gwt.user.client.ui.Widget;

          /**
          ?*?
          @author?steeven@gmail.com
          ?
          */

          public?class?MyApp?implements?EntryPoint?{

          ????TextBox?txtCount?
          =?new?TextBox();

          ????
          private?Grid?pnlMain;

          ????
          private?Button[]?numbers?=?new?Button[100];

          ????
          private?int?target;

          ????
          private?int?count;

          ????
          private?DialogBox?box;

          ????
          private?Button?btnRetry;

          ????
          private?Button?btnClose;

          ????
          /**
          ?????*?This?is?the?entry?point?method.
          ?????
          */

          ????
          public?void?onModuleLoad()?{
          ????????VerticalPanel?pnlStatus?
          =?new?VerticalPanel();
          ????????pnlStatus.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
          ????????pnlStatus.setSpacing(
          20);

          ????????txtCount.setEnabled(
          false);
          ????????txtCount.setVisibleLength(
          10);
          ????????pnlStatus.add(txtCount);
          ????????btnRetry?
          =?new?Button();
          ????????btnRetry.setHTML(
          "<img?src=\"replay.gif\"/>?<u>R</u>etry");
          ????????btnRetry.setAccessKey(
          'r');
          ????????btnRetry.addClickListener(
          new?ClickListener()?{
          ????????????
          public?void?onClick(Widget?sender)?{
          ????????????????doInit();
          ????????????}

          ????????}
          );
          ????????pnlStatus.add(btnRetry);

          ????????Button?btnAbout?
          =?new?Button();
          ????????btnAbout.setHTML(
          "<img?src='about.gif'/>?<u>A</u>bout");
          ????????btnAbout.setAccessKey(
          'a');
          ????????btnAbout.addClickListener(
          new?ClickListener()?{
          ????????????
          public?void?onClick(Widget?sender)?{
          ????????????????doAbout();
          ????????????}

          ????????}
          );
          ????????pnlStatus.add(btnAbout);

          ????????RootPanel.get(
          "status").add(pnlStatus);

          ????????pnlMain?
          =?new?Grid(10,?10);
          ????????RootPanel.get(
          "main").add(pnlMain);

          ????????
          for?(int?i?=?0;?i?<?100;?i++)?{
          ????????????numbers[i]?
          =?new?Button();
          ????????????numbers[i].setText(i?
          +?"");
          ????????????numbers[i].addClickListener(
          new?ClickListener()?{
          ????????????????
          public?void?onClick(Widget?sender)?{
          ????????????????????doGuess(sender);
          ????????????????}

          ????????????}
          );
          ????????????pnlMain.setWidget(i?
          /?10,?i?%?10,?numbers[i]);
          ????????}


          ????????box?
          =?new?DialogBox();
          ????????box.setPopupPosition(
          400,?200);
          ????????btnClose?
          =?new?Button("<u>C</u>lose",?new?ClickListener()?{
          ????????????
          public?void?onClick(Widget?sender)?{
          ????????????????box.hide();
          ????????????????doInit();
          ????????????}

          ????????}
          );
          ????????btnClose.setAccessKey(
          'c');
          ????????box.add(btnClose);
          ????????doInit();
          ????}


          ????
          protected?void?doGuess(Widget?sender)?{
          ????????Button?btn?
          =?(Button)?sender;
          ????????btnRetry.setEnabled(
          true);
          ????????
          int?n?=?Integer.parseInt(btn.getText());
          ????????txtCount.setText(
          ""?+?(++count));
          ????????
          if?(n?==?target)?{
          ????????????numbers[n].setEnabled(
          false);
          ????????????btnClose.setFocus(
          true);
          ????????????box.clear();
          ????????????box
          ????????????????????.setHTML(
          "<center><img?src='win.gif'/><h1>YOU?WIN!!!</h1><br/><br/><br/>");
          ????????????box.add(btnClose);
          ????????????box.show();
          ????????}
          ?else?{
          ????????????
          if?(n?<?target)
          ????????????????
          for?(int?i?=?0;?i?<=?n;?i++)
          ????????????????????numbers[i].setEnabled(
          false);
          ????????????
          else
          ????????????????
          for?(int?i?=?n;?i?<?100;?i++)
          ????????????????????numbers[i].setEnabled(
          false);
          ????????}


          ????}


          ????
          protected?void?doAbout()?{
          ????????box.clear();
          ????????box
          ????????????????.setHTML(
          "<img?src='about.gif'/><h1>Guess?Number</h1><h3>Google?web?toolkit?test</h3>");
          ????????box.add(btnClose);
          ????????box.show();
          ????}


          ????
          private?void?doInit()?{
          ????????btnRetry.setEnabled(
          false);
          ????????target?
          =?Random.nextInt(99);
          ????????count?
          =?0;
          ????????txtCount.setText(
          "0");
          ????????
          for?(int?i?=?0;?i?<?100;?i++)?{
          ????????????numbers[i].setVisible(
          true);
          ????????????numbers[i].setEnabled(
          true);
          ????????}

          ????}


          }


          第一次玩gwt, 總共花了3個(gè)小時(shí),菜呀
          posted @ 2006-06-02 15:23 steeven 閱讀(1847) | 評(píng)論 (13)編輯 收藏
          CALENDER
          <2006年6月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          常用鏈接

          留言簿(10)

          隨筆分類

          隨筆檔案

          文章檔案

          相冊(cè)

          我的鏈接

          搜索

          •  

          最新評(píng)論

          • 1.?re: 編程使用SDO[EMF兄弟篇]
          • 最近也在看這個(gè),有沒有好點(diǎn)的文章和代碼啊,有的話麻煩給些,謝謝,郵箱:
            huanggenping2002@163.com
          • --zebrahgp
          • 2.?re: SNMP親密接觸
          • 請(qǐng)問,我在接收Trap時(shí),同時(shí)有多個(gè)設(shè)備發(fā)送,在同一時(shí)間接收到的會(huì)有丟失的情況,怎么解決呢?snmp4j自帶的ThreadPool類有沒有在這方面起到多線程作用?
          • --analyser
          • 3.?re: 編程使用SDO[EMF兄弟篇]
          • 我也在研究soa,如果你有sdo方面的代碼,麻煩您給我一份作為參考,謝謝
            郵箱: litao5168@sohu.com 謝謝
          • --litao
          • 4.?re: 編程使用SDO[EMF兄弟篇]
          • 我也在研究soa,如果你有sdo方面的代碼,麻煩您給我一份作為參考,謝謝
          • --litao
          • 5.?re: 編程使用SDO[EMF兄弟篇]
          • 評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
          • --1984prince

          Powered By: 博客園
          模板提供滬江博客

          主站蜘蛛池模板: 桐庐县| 铁力市| 枣阳市| 丹寨县| 元氏县| 双牌县| 大姚县| 道孚县| 常宁市| 红安县| 商河县| 巴林右旗| 大名县| 花垣县| 梅河口市| 民乐县| 通化县| 广南县| 墨江| 上栗县| 江口县| 克什克腾旗| 同心县| 珲春市| 谷城县| 千阳县| 吐鲁番市| 灵川县| 汤阴县| 乐陵市| 佛冈县| 贵州省| 叙永县| 光山县| 竹溪县| 鄄城县| 杭州市| 西城区| 海南省| 舒城县| 石河子市|