隨筆-15  評論-79  文章-0  trackbacks-0
            2010年5月25日
          最近經常做一些數據導入的工作!做數據挖掘項目大家都懂的...
          導入數據最痛苦的就是等待他導...不過如果大家沒注意一些需要注意的東西,可能大家會這樣反復等好多次!!
          一、
          首先,我也是多次吃虧的一件事情,就是老是忘記加入導入日志。因為在導入數據的時候可能會拋出很多異常,這些異常如果不記錄下如果缺失了重要的數據可能要從新導入或找到原因然后重導。太可惜了。加入導入日志一切有據可查,非常重要。

          它的做法可以在imp時直接加參數:
          log=/oracle/log/imp.log (linux)
          log=E:\log\imp.log      (windows)
          指定日志的路徑和文件名
          例如:
          imp trade/zhangy@orcl file=/test/trade.dmp show=n buffer=2048000 ignore=n commit=y grants=y full=y log=/oracle/log/imp.log
          這樣就有日志了...

          二、導入單個表
          可能客戶給我們一個整庫文件,但是我們可能只需要其中的一些表就OK了。oracle已經帶有導入單獨表的語法。
          IMP trade/trade file=D:\2011-02-18_trade.dmp IGNORE=Y TABLES=(TOS_ContractInterval,TOS_CONTRACTMASTER) FULL=N



          當然還有許多語法,我們可以通過imp help=yes來查看..


          posted @ 2011-06-02 20:04 張元Won 閱讀(613) | 評論 (0)編輯 收藏
          因為新配置的機器,裝的Oracle10g一直都沒使用過。因為參與到項目,昨天突然用Oracle發現用Plsql不上Oracle了。
          蝦米原因?...搞的我蛋疼了一上午...
          于是一直找帖糾結這個問題,終于還是解決了,在博客中留個記錄以便以后忘記了翻翻。

          導致這個錯誤的原因有很多
          可能是SID配置不對,但絕大多數是因為Oracle程序本身問題。就是OracleOraDb10g_home1TNSListener這個服務對應的D:\oracle\product\10.2.0\db_1\BIN\TNSLSNR執行程序沒有執行或者執行中斷造成的。那么我們只要設置一個全局SID服務變量,以后就可以都以這個變量為準來查找到監聽了。

          解決方法如下:
          打開:%Oracle_Hoem%/network/admin/listener.ora文件 在 
          SID_LIST_LISTENER = 
          (SID_LIST = 
          (SID_DESC = 
            (SID_NAME = PLSExtProc) 
            (ORACLE_HOME = D:\Oracle\Oracle10g) 
            (PROGRAM = extproc) 
          后面添加: 
          (SID_DESC = 
            (GLOBAL_DBNAME = ORACLE) 
            (ORACLE_HOME = D:\Oracle\Oracle10g) 
            (SID_NAME = ORACLE) 
            ) 
          最后變成: 
          SID_LIST_LISTENER = 
          (SID_LIST = 
          (SID_DESC = 
            (SID_NAME = PLSExtProc) 
            (ORACLE_HOME = D:\Oracle\Oracle10g) 
            (PROGRAM = extproc) 
          ) (SID_DESC = 
            (GLOBAL_DBNAME = ORACLE) 
            (ORACLE_HOME = D:\Oracle\Oracle10g) 
            (SID_NAME = ORACLE) 
            ) 
          posted @ 2011-05-27 09:17 張元Won 閱讀(1015) | 評論 (0)編輯 收藏
        1. 第一步: 取消自動validation   
        2. validation有一堆,什么xml、jsp、jsf、js等等,我們沒有必要全部都去自動校驗一下,只是需要的時候才會手工校驗一下!   
        3. 取消方法:   
        4. windows–>perferences–>myeclipse–>validation   
        5. 除開Manual下面的復選框全部選中之外,其他全部不選   
        6. 手工驗證方法:   
        7. 在要驗證的文件上,單擊鼠標右鍵–>myeclipse–>run validation   
        8. 第二步:取消Eclipse拼寫檢查   
        9. 1、拼寫檢查會給我們帶來不少的麻煩,我們的方法命名都會是單詞的縮寫,他也會提示有錯,所以最好去掉,沒有多大的用處   
        10. windows–>perferences–>general->editors->Text Editors->spelling
        11. 第三步:取消myeclipse的啟動項   
        12. myeclipse會有很多的啟動項,而其中很多我們都用不著,或者只用一兩個,取消前面不用的就可以   
        13. windows–>perferences–>general–>startup and shutdown   啟動項功能如下,可以根據自己的需要選擇
        14. Automatic Updates Scheduler //自動升級調度      
        15. MyEclipse QuickSetup //快速啟動      
        16. MyEclipse Derby //derby是一個開源數據庫的名字   
        17. MyEclipse EASIE Geronimo 1 //同色都是應用服務器的名字      
        18. MyEclipse EASIE Geronimo 2       
        19. MyEclipse EASIE JBOSS 2       
        20. MyEclipse EASIE JBOSS 3       
        21. MyEclipse EASIE JBOSS 4       
        22. MyEclipse EASIE JBOSS 5       
        23. MyEclipse EASIE JBOSS       
        24. MyEclipse EASIE Jetty 4       
        25. MyEclipse EASIE Jetty 5       
        26. MyEclipse EASIE Jetty 6       
        27. MyEclipse EASIE Jetty       
        28. MyEclipse EASIE JOnAS 3       
        29. MyEclipse EASIE JOnAS 4       
        30. MyEclipse EASIE JOnAS       
        31. MyEclipse EASIE JRun 4       
        32. MyEclipse EASIE JRun       
        33. MyEclipse EASIE Oracle 10 AS       
        34. MyEclipse EASIE Oracle 9 AS       
        35. MyEclipse EASIE Oracle AS       
        36. MyEclipse EASIE Orion 1       
        37. MyEclipse EASIE Orion 2       
        38. MyEclipse EASIE Resin 2       
        39. MyEclipse EASIE Resin 3       
        40. MyEclipse EASIE Resin       
        41. MyEclipse EASIE Sun 8.x       
        42. MyEclipse EASIE Sun 8       
        43. MyEclipse EASIE Sun 9       
        44. MyEclipse EASIE Glassfish 2       
        45. MyEclipse EASIE Glassfish 1       
        46. MyEclipse EASIE Sun One       
        47. MyEclipse EASIE MyEclipse Tomcat 6 Server       
        48. MyEclipse EASIE Tomcat 4       
        49. MyEclipse EASIE Tomcat 5       
        50. MyEclipse EASIE Tomcat 6       
        51. MyEclipse EASIE Tomcat       
        52. MyEclipse EASIE WebLogic 10       
        53. MyEclipse EASIE WebLogic 6       
        54. MyEclipse EASIE WebLogic 7       
        55. MyEclipse EASIE WebLogic 8       
        56. MyEclipse EASIE WebLogic 9       
        57. MyEclipse EASIE WebLogic       
        58. MyEclipse EASIE WebSphere 5       
        59. MyEclipse EASIE WebSphere 6.1       
        60. MyEclipse EASIE WebSphere 6       
        61. MyEclipse EASIE WebSphere 4       
        62. MyEclipse Examples //樣例      
        63. MyEclipse Memory Monitor //內存監控      
        64. MyEclipse Tapestry Integration //插件集成      
        65. MyEclipse JSP Debug Tooling //jsp調試插件      
        66. MyEclipse File Creation Wizards //文件創建程序      
        67. ICEfaces Integration for MyEclipse //基于Ajax的JSF開發框架()   
        68. MyEclipse Backward Compatibility //后臺功能      
        69. MyEclipse Perspective Plug-in //透視圖插件      
        70. Pluse Collaboration Control Center //Eclipse的網頁管理中心   
        71. eclipse-cs 4.x.x -> 5.0.0 Migration Plug-in  //Eclipse插件兼容組件   
        72. Mozilla Debug UI Plug-in(Incubation) //Mozilla調試插件(Mozilla是一款瀏覽器)      
        73. Dynamic Languages ToolKit Core UI //對入PHP等動態語言支持的用戶接口   
        74. WTP Webservice UI Plug-in //Web 服務視圖插件      
        75. JavaServer Faces Tools - Core //jsf工具核心包      
        76. Automatic Updates Scheduler //自動更新   
        77. Service policy  //Web提供的服務性能目標定義,自動管理   
        78. Atfdebug Plug-in(Incubation)  //動態語言的調試工具   
        79. Auxiliary Web Module Support for MeEclipse// 輔助的Web模塊支持.(可能是Struts等文件自動添加)   
        80. JSF Editor Preview Support for MyEclipse//jsf編輯器 
        81. 第四步:更改jsp默認打開的方式   
        82. 安裝了myeclipse后,編輯jsp頁面,會打開他的編輯頁面,同時也有預覽頁面,速度很慢,不適合開發。所以更改之windows–>perferences–>general–>editors->file associations   選擇*.jsp,把編譯器改為默認啟動MyEclipse JSP Edition(在下方選擇一種編輯器,然后點擊左邊的default按鈕   )
        83. 第五步: 更改內存使用文件   
        84. 1、打開 eclipse.ini   
        85.   
        86. -startup
          ../Common/plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar
          --launcher.library
          ../Common/plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.200.v20090519
          -install
          D:/Myeclipse 8.5/Program
          -vm
          D:/Myeclipse 8.5/Common/binary/com.sun.java.jdk.win32.x86_1.6.0.013/jre/bin/client/jvm.dll
          -configuration
          configuration
          -vmargs
          -Xmx512m
          -XX:MaxPermSize=1024m
          -XX:ReservedCodeCacheSize=128m
          把下面的那個 -XX:MaxPermSize 調大,比如 -XX:MaxPermSize=1024M,再把 -XX:PermSize 調成跟 -XX:MaxPermSize一樣大   
        87. 原因:大家一定對這個畫面很熟悉吧:   
        88. 幾乎每次 eclipse 卡到當都是因為這個非堆內存不足造成的,把最大跟最小調成一樣是因為不讓 myeclipse 頻繁的換內存區域大小   
        89. 注意:XX:MaxPermSize 和 Xmx 的大小之和不能超過你的電腦內存大小   
        90. 經理比較奢侈,就調到了1024
        91. 第六步: 取消Maven更新(啟動更新)   
        92. Window > Preferences > Myeclipse> Maven4Myeclipse > Maven>禁用Download repository index updates on startup

        93. 改快捷鍵之類的經理就不介紹了。

          posted @ 2010-11-17 10:25 張元Won 閱讀(18465) | 評論 (5)編輯 收藏

          最近發現很多朋友連攔截器都不知道,于是想寫個BLOG總結一下。
          java攔截器的基本原理其實非常簡單,說白了就是動態代理類。
          下面來看一個簡單的例子
          首先,我建立一個攔截器的類InterceptorClass,這里的before()和after()方法是以后攔截器會執行的方法
          CODE清單一:

          public class InterceptorClass {
           
          public void before()
            System.out.println(
          "攔截器InterceptorClass方法調用:before()!"); 
           }
           
           
          public void after()
               System.out.println(
          "攔截器InterceptorClass方法調用:after()!"); 
           }

          }

           

          我們模擬一個業務組件接口BusinessInterface,和一個業務組件實現類BusinessClass
          CODE清單二:

          public interface BusinessInterface {
           
          public void doSomething();
          }

           

          CODE清單三:

          public class BusinessClass implements BusinessInterface {
           
          public void doSomething() {
             System.out.println(
          "業務組件BusinessClass方法調用:doSomething()"); 
           }

          }

           

          然后,創建一個動態代理類DynamicProxyHandler,這個類是集成InvocationHandler接口的,動態類的原理實際上是使得當你執行一個動態方

          法的時候,他可以把這個動態方法dispatch到這個動態類上來。這樣,你就可以在這個方法的前后嵌入自己的一些方法。
          CODE清單四:
          //包含了業務對象綁定動態代理類的處理,并實現了InvocationHandler接口的invoke方法

          public class DynamicProxyHandler implements InvocationHandler {
           
          private Object business;//被代理對象
           private InterceptorClass inceptor = new InterceptorClass();//攔截器
           
           
          // 動態生成一個代理類對象,并綁定被代理類和代理處理器
           public Object bind(Object business) {
             
          this.business = business;
             
          return Proxy.newProxyInstance(
               
          //被代理類的ClassLoader
               business.getClass().getClassLoader(),
               
          //要被代理的接口,本方法返回對象會自動聲稱實現了這些接口
               business.getClass().getInterfaces(), 
               
          //代理處理器對象
               this);
           }


           
           // 代理要調用的方法,并在方法調用前后調用連接器的方法

           /**
            * 
          @param proxy  代理類對象
            * 
          @param method 被代理的接口方法
            * 
          @param args   被代理接口方法的參數
            * 
          @throws Throwable
            
          */

           
          public Object invoke(Object proxy, Method method, Object[] args)
             
          throws Throwable {
            Object result 
          = null;
            inceptor.before();
            result
          =method.invoke(business,args);
            inceptor.after();
            
          return result;
           }


          OK,我們來寫個類測試一下
          CODE清單五:

          public static void main(String[] args) {
            
          //生成動態代理類實例
            DynamicProxyHandler handler = new DynamicProxyHandler();
            
          //生成待測試的業務組件對象
                  BusinessInterface business = new BusinessClass();
                  
          //將業務組件對象和動態代理類實例綁定
                  BusinessInterface businessProxy = (BusinessInterface) handler.bind(business);
                  
          //用動態代理類調用方法
                  businessProxy.doSomething();
           }


          來看看結果:


          近期struts2很流行,而且攔截器是struts2里面一個比較好的功能,下面舉個例子說明一下攔截器在struts2中的用法。
          struts2對攔截器實現做了一個封裝,使得我們在實現的時候比較簡單。
          首先我們要建一個攔截器類
          CODE清單六:

          public class AuthorizationInterceptor extends AbstractInterceptor {
           @Override
           
          public String intercept(ActionInvocation invocation) throws Exception {
            Map session 
          = invocation.getInvocationContext().getSession();
            String userName 
          = (String) session.get("userName");
            
          if ( userName != null && userName.equals("test")) {
             System.out.println(
          "攔截器:合法用戶登錄---");
             
          return invocation.invoke();
            }

            
          else
            
          {
             System.out.println(
          "攔截器:用戶未登錄---");
             
          return Action.LOGIN;
            }

           }

          }


          這個類是必須要繼承struts2包中提供的AbstractInterceptor類,這個類有一個抽象方法intercept,這個方法是必須要實現的。
          那么經理在這個攔截器里面寫了一個簡單的實現,對url用戶合法性做了一個限制。

          接下來比較關鍵的是過濾器在struts2中的配置,先看看代碼
          CODE清單七:

          <package name="system" extends="struts-default">
            
          <interceptors>
             
          <!--  定義權限控制攔截器  -->
             
          <interceptor name="authority" 

          class
          ="com.sharesin.biz.common.intercepts.struts2.AuthorizationInterceptor"/>
             
          <!-- 定義一個包含權限控制的攔截器棧   -->
             
          <interceptor-stack name="mystack">
              
          <interceptor-ref name="defaultStack"></interceptor-ref>
              
          <interceptor-ref name="authority"></interceptor-ref>
             
          </interceptor-stack>
            
          </interceptors>
             
          <!--定義默認攔截器   -->
                  
          <default-interceptor-ref name="mystack" />
             
          <!--定義全局處理結果   -->
            
          <global-results>
             
          <result name="login">index.jsp</result>
            
          </global-results>
            
          <action name="login_*" class="com.sharesin.biz.web.system.LoginAction" method="{1}">
             
          <result name="success">system/homepage.jsp</result>
            
          </action>
           
          </package>


          在interceptors節點里,我們可以定義多個攔截器,這里的名為authority的只是其中的一個。struts2的攔截器棧我是先執行struts2默認的攔

          截器defaultStack,然后再執行我的。然后只需要用default-interceptor-ref標簽設置好這個system包中的默認攔截器為這個攔截器就OK了。

          struts2中引入了package這個概念,我覺得十分實用,當然這對struts2攔截器也是個實惠,我們可以根據不同的action來分包和不同的攔截器


          ok,來運行測試一下。


          結果..


           

           

           

           

           

          posted @ 2010-09-06 17:21 張元Won 閱讀(4518) | 評論 (3)編輯 收藏
               摘要:  在FLEX開發中有一些小技巧,經理在這里總結下,方便以后查閱,也希望能和大家一起交流。 這些小功能在實際開發中是很經常用的。 一、在DataGrid的列中加圖片 做報表的時候經常會在DataGrid中加入一些刻度條或者增減的圖片表示一些API指標值,其實這個功能FLEX可以實現。 在DataGrid-colums-DataGridColumn中有個itemRenderer屬性,...  閱讀全文
          posted @ 2010-09-03 11:39 張元Won 閱讀(3922) | 評論 (1)編輯 收藏

          在使用flex過程中經常會對調樣式感到頭痛,經理在這里準備把常用的一些東東總結一下,以便以后查閱。
          以后慢慢總結。
          一、公用
          1.includeInLayout:它的作用是當使用visible隱藏對象的時候,該對象不會占位。
          2.字體:fontsize:全局字體大小,推薦設置12。font-family:"ARIAL"。這些在CSS中設定好

          二、Panel
          1.headerHeight:Panel頭的寬度,這里一般設置成15比較舒服。
          2.borderThicknessBottom:Panel控件下邊框的粗細,一般設置成2比較舒服。
          3.borderThicknessLeft:Panel左邊框的粗細,一般設置成2比較舒服。
          4.borderThicknessRight:Panel右邊框的粗細,一般設置成2比較舒服。
          5.backgroundImage:如果覺得Panel的白色北京太丑,那就用這個換一個漸變背景吧。

          三、DataGrid&AdvancedDataGrid
          1.headerColors:用于繪制標題背景漸變的兩種顏色的數組。推薦[#60beff,#1273ce],藍色漸變
          2.alternatingItemColors:交替模式中行的顏色。此值可以是由多種顏色中任意兩種所組成的數組。推薦[#FFFDCE, #C8ECFF],淺藍和黃色。
          3.headerWordWrap:則指定標題文本不適合一行時將換行。(這是在AdvancedDataGridColumnGroup中設置的)。
          4.一個標志,指示當此列中各行的文本不能在一行中顯示時,是否能夠自動換行(這是在DataGridColumn中設置的)。

          四、Chart
          1.showDataTips:指定Flex是否顯示圖表的提示窗口控件。
          2.verticalAxis-CategoryAxis-Title:單位可以加在坐標軸上。
          3.GradientEntry:設置圖表的漸變色。詳見第..
          http://www.aygfsteel.com/zhangyuan/archive/2010/09/03/330847.html
          如下CODE

           1<mx:BarSeries xField="costs" >
           2                        <mx:fill>
           3                            <mx:LinearGradient>
           4                                <mx:GradientEntry color="#A6A602" ratio="0"  />
           5                                <mx:GradientEntry color="#DFDF97" ratio=".2"  />
           6                                <mx:GradientEntry color="#A6A602" ratio=".4"  />
           7                                <mx:GradientEntry color="#F5F655" ratio=".8"  />
           8                                <mx:GradientEntry color="#A6A602" ratio="1"  />
           9                            </mx:LinearGradient>
          10                        </mx:fill>
          11                    </mx:BarSeries>





          posted @ 2010-08-27 15:44 張元Won 閱讀(3015) | 評論 (0)編輯 收藏

           cognos中有列表和圖形,但是表和圖之間總是孤立的,刷新頁面也都是全頁面刷新,于是經理在想,是否有個方法能在點擊cognos列

          表時旁邊的cognos圖表能夠實時的變動,類似flex中的綁定效果。在老板的強烈催促下,經理也沒什么時間去網上去找去問,覺得憑自己以前

          的一些J2EE老底子加上report studio中強大的HTML項目貌似可以搞定,于是開搞了...
           首先給大家看看數據庫

          一、先用report studio建立一個帶參數的cognos餅圖報表(這里可以隨便是什么圖),報表灰常簡單

          設置參數名為par3,并把此報表保存為a1
          二、再用report studio建立一個列表,如圖

          經理在這里多用了html項目,因為cognos在頁面上封裝的太好了,只能這樣拼湊腳本。
          基本的原理就是在列表旁邊放置一個html項目,其內容是一個iframe,其連接也就是剛剛做好的那個帶參數的餅圖報表。
          然后在列表中放置一個label,在label中設置點擊事件出來iframe鏈接(其實這樣就換了一個參數)及重新載入。

          其中
          1的代碼如下,他主要是點擊的列表觸發的事件

          1<script type="text/javascript">
          2    function changeframe(par)
          3    {
          4        sname="http://localhost/cognos8/cgi-bin/cognos.cgi?b_action=cognosViewer&ui.object=/content/package[@name='aa']/report[@name='a1']&ui.action=run&run.prompt=false&p_par3="+par;
          5        frameChart.location.href=sname;
          6    }

          7</script>

           

          2到6主要就是定義一個含有點擊事件的label
          2的代碼為

          1<u><label onclick="changeframe('


          3其實是一個報表表達式,它是參數

          1[query1].[arr2]


          4的代碼為

          1');"  style="width:100%;height:100%" >


          5也是一個報表表達式,他是設置該列顯示的內容

          1[arr2]


          6的代碼為,他收個尾

          1</label ></u>


          7的代碼主要是iframe,然后就是刷新等待時候的一個等待提示
          7的代碼為

           1<iframe frameborder="0" id="frameChart" src="" scrolling="no" height="450" width="100%"></iframe>
           2<div id="loading" style="display:block; padding:100px 0 100px 0;text-align:center;color:#999999;font-size:12px;">
           3      頁面加載中
           4    </div>
           5<script type="text/javascript">     
           6     var  a  = document.getElementById("frameChart");   
           7     var b  = document.getElementById("loading");   
           8     a.style.display =  "none";                     
           9     b.style.display = "block";                     
          10     
          11        if  (window.ActiveXObject)   {   
          12
          13
          14     a.onreadystatechange =  function()     
          15     {   
          16        if (this.readyState=="complete")   
          17         {                                                                   
          18             b.innerHTML  =   "";   
          19              b.style.display = "none";   
          20             a.style.display  = "";   
          21          }
             
          22     }
           
          23     }
          else
          24     a.style.display =  "block";                     //隱藏 
          25     b.style.display = "none"
          26     }

          27  </script>


          拼滴我累死了.....

          OK,我們來看看效果
          我先點擊一下第一個單元格

          再點擊第二個

          注意,列表不會刷新哦,有點像ajax的效果。


          后來想想,其實功能挺簡單的。
          例子比較簡陋,只是想傳達一個思想,希望以后大家有好東西能一起交流。

          posted @ 2010-08-20 17:37 張元Won 閱讀(4322) | 評論 (4)編輯 收藏

              對COGNOS有一定了解以后,經理逐漸發現COGNOS的強大之處,特別的立方體模型使數據倉庫更有條理而且訪問速度更快。但是也了解到了COGNOS的劣勢,應該說是IBM整體的劣勢,也就是界面太丑。雖然COGNOS也包含了幾乎所有的圖表,樣式也可以調整。但是對COGNOS的界面調整太復雜,幾乎看的比較好的COGNOS顯示界面都要有HTML對象來調,更或者無論你怎么調也是基于HTML,在色彩和動畫方面不會有很大的空間了。
              于是經理在想,是不是可以把只用COGNOS對數據的抓取優勢而在顯示層用別的方式呈現呢(比如flex或者別的)?如果COGNOS能開發更多的前端顯示接口固然好,但這是不可能的,當然,經理知道這樣做會損失一部分性能,但是對現在大多對界面都很挑剔的客戶,這肯定是一條比較好的路。
              OK,那么現在經理把做的一個java調用cognos端直接返回XML字節流的例子和大家分享下。
          一、環境
              硬件環境:主屏2.0Hz+內存3gb+系統32位
              軟件環境:cognos 8.41+Myeclipse8.5ga+sqlserver2000sp4

          二、IBM Cognos Connection部分
              首先,我用framework做了了一個灰常簡單的包(所謂非常簡單就是里面完全沒有維度和亮度,直接隱射的數據庫表列),并把他發布到公共文件夾,名為test_sdk_paser

          然后在這個包下用report studio做了一個灰常簡單的報表,名為test

          這個報表就是我們之后要在java中獲取其數據的報表。
          三、COGNOS SDK調用程序
              0.準備步驟.
          我們先要把sdk所需要的包考到項目中來。必要包的位置在D:\cognos\c8\sdk\java\lib\下,先給大家看看我的目錄結構

              1.我建立了一個config.properties文件用來存放congos服務器的ip和端口

              在java中對應寫一個從properties中獲取數據的方法

              2.弄清楚報表的xpath
              這個xpath我們可以在報表的 設置屬性-->常規 找到

              xpath是十分重要的,其實報表ID也十分重要,這個經理以后會跟大家寫。
              3.連接cognos服務器
          經理這里用ReportService_ServiceLocator對象的getreportService方法來獲得一個ReportService_Port對象。
          getreportService需要一個參數,是cognos服務器地址,http://localhost/p2pd/servlet/dispatch
          ReportService_Port是報表操作對象,我們就是用這個對象的run方法來運行cognos端報表。


              4.設置cognos認證信息
          經理這里的cognos設置了NTML認證,那么是需要在sdk代碼中設置認證信息的。

          用CAM方式進行登陸


              5.設置report的參數
          本例中用HashMap來傳遞report的參數,用循環的方式把外界的參數從HashMap中取出來,設置到ParameterValue的value中去。

              6.cognos運行報表設置
          每項代表什么經理已經把注釋寫的很清楚了。


          這里尤其提醒大家注意的一點是,RunOptionEnum.prompt這個參數一定要設置,設置這個參數是當cognos運行有參數的report時候,不彈出html提示窗口。經理之前就是沒有設置這個參數,所以在測試帶參數報表的時候搞了一天都沒搞出來。
          那么這個option到底還有多少參數呢?經理給大家看啊看你cognos sdk的官方API

          大家看到了吧,官方的API只是把枚舉值做了一個羅列,具體他們是做什么的?有什么作用?什么都沒說。經理當然也看了sdk的源碼,希望能在源碼中找到一點注釋,結果是:sdk的java文件沒有一行注釋代碼。
          經理在這里不想罵人,現在終于知道為什么cognos sdk這個領域這么弱了。
              7.運行cognos報表并返回xml數據
          經理在這里統計了一下用sdk返回數據的時間。
          之前講過用ReportService_Port的run方法可以讓report運行,然后返回一個叫AsynchReply的對象,這個對象中有details[]屬性,這個里面基本上包含了report返回的所有信息。而他的status屬性則標識了此次請求是否成功。


          OK,現在代碼都解釋完了,現在來測試下。

          經理在這里寫了一個簡單的測試例子,用之前講到的test_sdk_paser包中的test進行測試


          下面再測試一個帶參數的報表

          把之前的那個報表加一個參數

          然后在這里輸入一個1

          得到這樣的數據

          稍微改動下代碼,然后run一下

          然后得到結果是這樣的

          正好和剛剛的結果一樣~~


          sdk取數據關鍵的也就是上面說的7個步驟。最后依然要BS一下cognos的開發者,居然在源碼中一行注釋都沒有,幫助文檔也不全面。
          所以還是集結大家的力量一起研究一起分享研究后的成果。
          歡迎大家一起來博客上討論。

          謝謝~

           

           

           

           

           

           

           

           

           

           


           

          posted @ 2010-08-05 21:41 張元Won 閱讀(6220) | 評論 (16)編輯 收藏

              很早以前用過VSS的人都知道,相比之下SVN的確是個好東東。他以副本式的版本管理模式很好的解決了VSS單數據源下的簽入簽出混亂問題。但是最近發現很多人都不會裝SVN,經理在這里寫個博客跟大家分享一下。
          環境:
          Win7系統
          Myeclipse 8.5GA
          JDK1.6
          一、準備工作
          首先,當然是下載軟件安裝包。(經理這里以svn1.6為例)這里需要2個安裝程序和1個解壓包。


          Setup-Subversion-1.6.6.msi這個是SVN服務器。
          (你可以在這里 http://subversion.tigris.org 下載到最新版本)

          TortoiseSVN-1.6.10.19898-win32-svn-1.6.12.msi是SVN 版本控制系統的一個免費開源客戶端。
          (可以在這里下載   http://tortoisesvn.net/downloads )

          site-1.6.12.zip是Myeclipse的插件包。
          (可以在這里下載 subclipse.tigris.org

          二、安裝svn服務器
              首先安裝svn服務器(也就是Setup-Subversion-1.6.6.msi這個),按照常規安裝就OK了。然后把tortoise也安裝起來(也就是TortoiseSVN-1.6.10.19898-win32-svn-1.6.12.msi這個)。
          在安裝tortoise的時候會提示重啟,這里最好重啟下。

          這是經理的安裝目錄
          Setup-Subversion-1.6.6.msi --> Subversion目錄
          TortoiseSVN-1.6.10.19898-win32-svn-1.6.12.msi --> TortoiseSVN目錄
          svnroot目錄是什么呢?接著往下看

          三、建立SVN資源庫(Repository)
          svnroot是經理建立的svn資源庫根目錄,然后在這個目錄里建立了一個名為repos的目錄。(這個目錄是經理打算做svn資源庫的目錄)

          然后在這個目錄點右鍵->TortoiseSVN->Create repository here



          當看到被建立的repos目錄中多了很多文件夾后證明資源庫創建成功。
          在網上也看到有用cmd命令來創建的,如svnadmin create D:\svn\repository

          四、配置用戶和權限
           打開剛剛建立的資源庫文件夾(repos),里面有一個名為conf的文件夾,這個文件夾里都是svn的配置信息。首先打開svnserve.conf文件
          這里行前凡是有#的都等于是被注釋忽略了, 你可以把#去掉讓那一行生效, 或者自己新添加行。經理對這個文件主要修改3處
          把" #anon-access = read"改為"anon-access = none"
          (他表示沒有經過驗證的用戶無任何權限,之前的意思是沒經過驗證的用戶可以進行讀操作。經理強烈建議該成none,不然別人沒有驗證的人都可以看到項目文件)
          把" #auth-access = write"去掉#為"auth-access = write"
          (通過驗證的用戶有寫操作,寫操作是包含讀操作的)
          把" #password-db = passwd"去掉#為"password-db = passwd"
          (密碼數據存放到passwd文件中)

          打開passwd文件
          設置一個用戶名如 manager=jingli
          還有一個文件authz
          這個文件主要是用來針對不同的目錄給用戶分配不同的權限的。
          如:
          [groups]
          team1 = manager,staff
          表示劃定一個小組,組員有manager和staff用戶

          [repository:/baz/fuz]
          @team1= rw
           * = r
          表示team1這個組對資源有讀寫權限,資源對所有人有讀權限

          [/foo/bar]
          manager = rw
          * =r
          也可以像這樣對個人設置權限,manager有讀寫權限,該資源對所有人有讀權限
          這些可以根據個人需要修改

          五、運行svn服務器
          在安裝的Subversion目錄下有個bin目錄里svnserve.exe,我們直接運行這個文件是無效的。需要在控制臺來啟動他。直接在cmd命令中輸入svnserve -d -r D:\SVN\svnroot這樣服務就啟動了(注意,這里指定的是svnroot文件即資源根目錄,而不是資源目錄repos)。當然你關閉dos窗口的時候svn服務也就關閉了。svn的所有操作都需要在這個服務器啟動的基礎上進行。但是一直開著這個dos命令窗口很不爽,所以經理在這里寫個程序讓他開機自動啟動。
          首先我們需要為svnserve創建一個系統服務。
          以經理本機的安裝目錄為例,在cmd命令行輸入

          sc create SVNServer binpath= "D:\SVN\Subversion\bin\svnserve.exe --service -r D:\SVN\svnroot" 
          displayname
          = "SVNServer" depend= Tcpip start= auto   
          pause

          binpath指svnserve.exe的路徑
          (注意:如果你的路徑里有空格記得要在binpath的頭尾用轉義字符/"把整個個binpath框起來,D:\SVN\svnroot指svn資源庫根目錄)
          displayname指服務名稱
          depend指協議是tcpid
          start指開機自動啟動
          注意:以上的=后面的一個空格千萬不要丟了

          然后我們打開服務可以看到我們的服務已經是自動啟動了


          六、安裝subeclipse插件
          打開之前下載的site-1.6.12.zip文件可以看到里面有features、plugins兩個文件夾
          用之前我講過的Myeclipse安裝插件的方法安裝就可以了
          參考:
          (http://www.aygfsteel.com/zhangyuan/archive/2010/07/28/327371.html)


          在這里要注意一點
          安裝插件時要去掉features中的org.tigris.subversion.subclipse.mylyn_3.0.0.jar文件
          去掉plugins中的org.tigris.subversion.subclipse.core_1.6.8.jar和org.tigris.subversion.subclipse.mylyn_3.0.0.jar
          經理用Myeclipse8.5配這一套svn如果不刪這些文件的話,啟動Myeclipse時會報錯


          這樣SVN就搭建好了..



          posted @ 2010-07-28 23:27 張元Won 閱讀(31314) | 評論 (13)編輯 收藏
          我們在用Myeclipse進行開發的時候會用到很多插件,比如jad、svn、properties等。經理最近發現很多同事安裝問我xx插件怎么安裝,覺得很驚訝,居然不會裝插件。而有的同事會安裝插件,但是安裝的插件很零散,缺乏管理。那么經理在這里把安裝插件的方法和大家分享下。
          環境
          開發工具:Myeclipse8.5
          JAVA環境:JDK1.6
          操作系統:windows7

          首先給大家看看經理的Myeclipse安裝目錄,經理在這個目錄里建了一個myPlugin文件夾專門來管理插件。

          我這里以安裝jad的插件為例講解。我們在myPlugin目錄下建立一個jad目錄來存放jad的插件包,在這個目錄下創建features和plugins目錄,并把jad的插件包copy到里面去。

          打開Myeclipse的安裝目錄下的dropins文件夾,在此文件夾下創建jad.link文件

          在這個文件中寫入剛才配置的myPlugin的jad地址
          path=D:\\MyEclipse 8.5\\myPlugin\\jad
          注意:這里的反斜杠需要轉義,也就是用\\來表示。

          這樣配置工作就完成了。

          以后我們所有的插件都可以在dropins這個文件夾中來創建對應的.link文件鏈接。而所有插件包夜可以在myPlugin目錄中很好的管理起來,這樣不是很好?..

          希望以后有好東西還是跟大家一起分享
          posted @ 2010-07-28 23:25 張元Won 閱讀(32531) | 評論 (13)編輯 收藏
          昨天跟朋友一起吃飯,他說到兩個Integer類型值比較是否相等的問題。經理也在這里把java的Integer值比較的問題拿出來說一說。因為在面試的時候這個是經常遇到的問題。
          首先給大家看一個例子:
           1public class Test {
           2
           3    /**
           4     * 關于Integer大小比較問題
           5     * @author 經理
           6     */

           7    public static void main(String[] args) {
           8        Integer a = 10;
           9        Integer b = 10;
          10        System.out.println("a==b : " + String.valueOf(a==b));
          11        System.out.println("a.equals(b) : " + String.valueOf(a.equals(b)));
          12    }

          13}

          14
          運行一下,在控制臺得到的結果是這樣的
          a==b : true
          a.equals(b) : 
          true

          當是當我們變換一下值
           1public class Test {
           2
           3    /**
           4     * 關于Integer大小比較問題
           5     * @author 經理
           6     */

           7    public static void main(String[] args) {
           8        Integer a = 1000;
           9        Integer b = 1000;
          10        System.out.println("a==b : " + String.valueOf(a==b));
          11        System.out.println("a.equals(b) : " + String.valueOf(a.equals(b)));
          12    }

          13}

          運行一下,控制臺的結果又是
          a==b : false
          a.equals(b) : 
          true

          這是什么原因呢?我當時也有點犯糊涂。有點沖動就直接開源碼看了。
          實際上在我們用Integer a = 數字;來賦值的時候Integer這個類是調用的public static Integer valueOf(int i)這個方法。
          1public static Integer valueOf(int i) {
          2        if(i >= -128 && i <= IntegerCache.high)
          3            return IntegerCache.cache[i + 128];
          4        else
          5            return new Integer(i);
          6    }
          我們來看看ValueOf(int i)的代碼,可以發現他對傳入參數i做了一個if判斷。在-128<=i<=127的時候是直接用的int原始數據類型,而超出了這個范圍則是new了一個對象。我們知道"=="符號在比較對象的時候是比較的內存地址,而對于原始數據類型是直接比對的數據值。那么這個問題就解決了。
          至于為什么用int型的時候值會在-128<=i<=127范圍呢呢?我們知道八位二進制的表示的范圍正好就是-128到127。大概就是因為這吧。

          把平時出現的問題記錄下來,自己就可以一點一點進步了。
          posted @ 2010-07-24 16:03 張元Won 閱讀(24805) | 評論 (12)編輯 收藏
          JAVA經常會有取properties文件的需求,因為一些host、port客戶應該能自行修改。所以這些東東應該放在一個配置文件中,而不是編譯成class文件。當然,這樣的配置文件可以是xml文件也可以是property文件,取的方法也不一樣。經理在這里介紹一個經常用的方法。
          這里寫了一個例子,先給大家看看目錄結構

          經理是用properties文件來做的,因為這個非常簡單,而且讀取properties文件的速度比讀xml要快的多。
          這里的主要文件有兩個:config.properties是配置文件,Test是測試java類
          config文件的內容就是一個ip一個port

          原理很簡單就是首先取得config.properties的二進制流,然后用JAVA封裝好的Properties類把這個流load進來,最后只需要用Properties對象中的getProperty(String key)方法就可以取值了。是不是很簡單。
          給大家看看代碼:

          我們來運行下結果:

          成功了~
          posted @ 2010-07-12 11:48 張元Won 閱讀(2589) | 評論 (4)編輯 收藏
          看了很多Cognos建模概念性的東西,一直被‘維度’這個概念困擾。Cognos把數據看成一個立方體,例如:我們把產品、地區、時間組成一個立方體,那么維度就相當于這個立方體的坐標軸,各個維度的每個交點上面的值就是量度(即數據)

          這是對模型設計一個非常重要的概念,因為平面取值的搜索條件是2個,而三圍取值的搜索條件是3個,這樣一來搜索速度會很大程度的提升。
          最重要的還不僅僅如此,因為維度還可以分層的,就是說如上圖的例子,時間是可以分為,年、月、日,而產品可以分為產品系列、類型、和品牌產品,地區也可以分為地域、國家和部門。這樣一來就是一個多維多層級的數據模型。

          再一個概念就是類別。類別其實是維度多面性的一個體現。他相當于是在每一層上又多加了一個拓展,以地區為例。

          那么有了這些概念,我們在建模,不應該說是在建立數據庫平面模型的時候就應該按照這樣的概念去設計數據庫。畢竟兩個平面表就可以組成一個立方體的多維數據表,而表中的字段、數據可以用層和類的關系來模擬。真是受益匪淺啊~



          posted @ 2010-05-26 11:03 張元Won 閱讀(1153) | 評論 (0)編輯 收藏
             最近進了新公司的數據挖掘與分析組,因公司需求開始學習Cognos,前幾個星期看了下Cognos的主要設計器,沒想到經理馬上就要我搞Cognos的sdk,這個東西國內用的人很少,網上的資料也相當少,只能硬著頭皮自己看官方的文檔和例子。
             這里就把東西都記錄下來。
            
             首先,根據看的一些資料,所謂sdk其實是Cognos公布了一些自己在設計產品時候留下的接口,可以讓客戶從程序端靈活的調用。但是Cognos本身具有的設計功能已經灰常強大了,一般會用到sdk的公司基本上都是遇到很J8的甲方。不過這次也給了我很大的學習機會。
             那么我這里寫了一個用java訪問Cognos建立的維度和量度,來生成報表。
             一、準備工作
                1.建立一個叫 zj_cognos_interjavaweb項目, 我這里比較熟悉用struts于是自己把struts的框架也導進來了
                2.找到Cognos自帶的例子, 示例位置在cognos安裝目錄"c8"webapps"samples"WEB-INF"src"com"cognos"jspSample.
                在這里可以看到一些工具類
               

          我們把這些類考到項目中來

          這些類是非常重要的,很多類如API.JAVA,LogonException等都是封裝的方法類,一般不需要用,不過里面有很多的方法,可供我們學習。
          在這里我們用的比較多的是CognosConnection和ReportBuilder這兩個類。
          這里我用了一個配置文件來保存一些靜態參數
          <?xml version="1.0" encoding="gb2312"?>
          <cognos version="8.3">
              
          <url_home>
                  
          <![CDATA[
                          http://localhost/cognos8
                      
          ]]>
              
          </url_home>
              
          <url_report_prefix>
                  
          <![CDATA[
                          /cgi-bin/cognos.cgi?b_action=cognosViewer&ui.action=run&ui.object=
                      
          ]]>
              
          </url_report_prefix>
              
          <url_report_suffix>
                  
          <![CDATA[
                          &run.outputFormat=&run.prompt=true&cv.header=false&cv.toolbar=false
                      
          ]]>
              
          </url_report_suffix>
              
          <url_logoff>
                  
          <![CDATA[
                          /cgi-bin/cognos.cgi?b_action=xts.run&m=portal/logoff.xts&h_CAM_action=logoff
                      
          ]]>
              
          </url_logoff>
              
          <url_cm>http://localhost:9300/p2pd/servlet/dispatch</url_cm>
              
          <namespace>my cognos</namespace>
          </cognos>

          ServletContext application = getServlet().getServletContext();
              HttpSession session 
          = request.getSession();
              String cfgPath 
          = application.getRealPath("/WEB-INF/cfg.xml");
              String cmUrl 
          = ConfigUtil.parseXml(cfgPath,"url_cm");
              
          //連接cognos服務
              CognosConnection conn = new CognosConnection(cmUrl,application,session);
              
          //-----如果是用匿名認證登陸就不需要這句話,如果是用的自己的認證就需要登陸一下
              
          //bb是我的表空間,zhangyuan是我本機用戶名,123是我本機的密碼
              conn.logon("bb""zhangyuan""123");
              
          //創建一個報表生成器的實力類
              ReportBuilder rb = new ReportBuilder(conn);
              
          //指定生成報表的包
              String packageSp =     "/content/package[@defaultName='mbase']";
              rb.createReport(packageSp);
              
          //用Cognos sql來指定生成的列
              String[] colRef =  {"[business layer].[date].[mdate].[year]","[business layer].[date].[mdate].[day]","[business layer].[measures].[psend]"};
              String[] titles 
          = {"year","day","psend"};
              rb.addColumns(titles, colRef);
              
          //指定生成的報表名
              String name  = "ReportWizardReport ";
              
          //增加報表
              rb.saveReport(name);
          posted @ 2010-05-25 12:02 張元Won 閱讀(5015) | 評論 (8)編輯 收藏
          主站蜘蛛池模板: 邹城市| 珲春市| 泰宁县| 陆良县| 苍南县| 沙雅县| 五寨县| 望江县| 大冶市| 通许县| 波密县| 新绛县| 介休市| 时尚| 云南省| 长春市| 莎车县| 四川省| 新昌县| 阿拉善左旗| 博兴县| 繁峙县| 沅江市| 吉木萨尔县| 三河市| 微山县| 万山特区| 阿克陶县| 开封县| 济宁市| 鹰潭市| 潜江市| 万山特区| 隆德县| 平陆县| 新竹市| 阳泉市| 江源县| 保定市| 麟游县| 蓬溪县|