2009年9月27日 星期日

安裝設定Java相關軟體或套件注意事項

安裝設定Java相關軟體或套件注意事項
1.盡量不要安裝在有目錄路徑中包含空白字元的目錄之下
2.安裝目錄的名稱不要使用過長的名稱
有些軟體的設定會設定 CLASSPATH  , 有時候就會導致軟體啟動失敗 ...
可以試著將相關套件所在目錄改成較短的目錄名稱...再重新啟動軟體就會成功
(同理 , 包含空白字元的目錄名稱也有可能會引起啟動軟體失敗)

Java 程式透過公司Proxy連線到Internet

這個應該是不少在大公司上班的程式開發人員會問的問題 .
我們的公司要上網 , 必須透過 proxy , 而且要有申請過的Domain ID 跟 Password 才能連上網路去

那麼Java 程式或是Server軟體(Ex: Tomcat , Jetty) 要如何才能透過 proxy 連上 internet ?

基本的屬性:
http.proxy.host
http.proxy.port http.proxy.username
http.proxy.password
接著就看你要把它以程式的方式去設定或是以屬性的方式去設定
舉例來說:
 如果你原來要執行的Java 程式指令如下
java myDemoApp
加上相關屬性設定之後
java  -Dhttp.proxy.host=myProxyServerName -Dhttp.proxy.port=80 -Dhttp.proxy.username=myDomain\myUserID -Dhttp.proxy.password=myPassword    myDemoApp
(或者是在你的 Tomcat 啟動的 .bat 或是 Jetty 啟動的 .bat 中去修改加上上述的設定)

在這裡假設
http.proxy.host=myProxyServerName
http.proxy.port=80
http.proxy.username=myDomain\myUserID
http.proxy.password=myPassword
你可以使用 -D 去設定JVM的執行參數

或者你可以在你的程式碼中使用以下指令
System.setProperty("http.proxy.host" ,  "proxy.hinet.net");
System.setProperty("http.proxy.port" ,  "80");
System.setProperty("http.proxy.username", "myUserName");
System.setProperty("http.proxy.password", "myUserPassword");
在這裡只是舉例 , 所以 你要記得換成你使用的 proxy Server , port , username 跟password

這些設定記得看你的需求而定 , 甚至有其他的變化方式
這樣你的程式就可以在公司有proxy server的情況上 , 也能連上 internet

在網頁中同時顯示 Html 內容 及 PDF 內容

在網頁中同時顯示 Html 內容 及 PDF 內容

重點應該是加上粗體的部份
其中 PDF 來源可以是 WEB Server 上的 PDF File
<param name="src" value="demo1234.pdf"/>

或是 ASP 抓取資料庫內容回傳的 PDF 內容
  <param name="src" value="showpdf.asp?pdfID=bb980124567"/>


因為 html 原始碼無法正常放上  奇摩部落格 ,  所以只好手動把 半形英數字 換成 全形英數字
有需要測試的人 , 請自行把 全形英數字重新還原成 半形英數字



以下是 html 內容 (有需要 ,你也可以換成 asp 的寫法)

<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8">
        <title>showdata       
       
<body>   
    name:xxxx<br/>
    age:12<br/>
   
        <object classid="clsid:ca8a9780-280d-11cf-a24d-444553540000" id="pdf1" height="100%" width="100%">
         <param name="_version" value="327680"/>
         <param name="_extentx" value="2646"/>
         <param name="_extenty" value="1323"/>
         <param name="_stockprops" value="0"/>       
         <param name="src" value="showpdf.asp?pdfid=bb980124567"/>
   
  



ASP 讀取儲存在資料庫欄位中的 PDF 原始範例

ASP 讀取儲存在資料庫欄位中的 PDF 原始範例

範例假設如下:
database name: DEMODB
database user id: DEMOUser
database user id: DEMOPassword
table name:MY_PDF_TABLE
            field1 :    pdfID               - varchar , 20 , primary key
            field2:     pdf_content  - blob         , 1M                      
ODBC Name: DEMODB             

以下挑重點解說:
(1) SQL 指令:
set rs = conn.Execute("SELECT PDF_CONTENT FROM MY_PDF_TABLE WHERE pdfID='"+pdfID+"'")

(2)asp 部份:
      Response.Buffer =true
      Response.Clear()

(3)設定 MIME TYPE
下面這行是黨你的內容是 pdf 時所要設定的 mime type ,
所以當你的檔案是其他的格式 , 請修改對應的 mime type
      Response.ContentType="application/pdf"          

(4)Browser 開啟方式: 強制另存檔案 或是 線上開啟檔案
(a) 如果你希望回應到前端 browser 是要強制另存檔案 請用下面這一行
'Response.AddHeader "Content-Disposition" , "attachmentfilename="+pdfID+".pdf"

(b) 如果你希望回應到前端 browser 是要線上開啟檔案 請用下面這一行
Response.AddHeader "Content-Disposition" , "inlinefilename="+pdfID+".pdf"

(5)傳回檔案的二進位串流 
回應前端資料使用 BinaryWrite 把二進位串流傳回 
dim pdfSize
pdfSize = rs("PDF_CONTENT").ActualSize          
Response.BinaryWrite rs("PDF_CONTENT").getChunk(pdfSize)

(6)這一篇雖然是叫做
儲存在資料庫欄位中的 PDF 原始範例
但是如果你的 DB 中放的是其他格式的檔案內容也一樣可以通用 ,

假設你放的是 JPG
那麼請修改上述的
(3) MIME TYPE  , 請改為 jpg 的 MIME TYPE-->  image/jpeg
(4) 開啟方式的檔案名稱的副檔名 , 請改為 .jpg
     

以下是完整程式碼 , 有執行過 , 確認沒有問題的程式碼


測試方式
開啟瀏覽器: 輸入 以下網址
http://localhost/demo1/ShowPDF.asp?pdfID=BBB9998804



(假設: Windows Server , IIS ,
你建立一個虛擬目錄為 demo1 ,
資料庫中有一筆紀錄 pdfID 為 :  BBB9998804 )


===ShowPDF.asp===
<%@Language="VBScript"%>

<%
    Response.Charset="utf-8"  
    Response.Expires=0
    dim pdfID
    dim pdfID1
    dim pdfID2
    pdfID1= Request.Form("pdfID")                 'POST - 由 input html 中 form 傳入參數
    pdfID2 =Request.QueryString("pdfID")   'GET  - 直接輸入參數在網址列
        if (pdfID1 <> "" ) then pdfID=pdfID1
    if (pdfID2 <> "" ) then pdfID=pdfID2
   'DB Operation
   dim conn
   dim rs
   dim haveData
       haveData=false
   set conn = Server.CreateObject("ADODB.Connection")
       conn.ConnectionString = "Provider=MSDASQL.1;Password=DEMOPassword;Persist Security Info=True;User ID=DEMOUser;Data Source=DEMODB"
       conn.Open()
   set rs = conn.Execute("SELECT PDF_CONTENT FROM MY_PDF_TABLE WHERE pdfID='"+pdfID+"'")
   on error resume next
       rs.MoveFirst()       
   do while NOT rs.EOF
      haveData = true
      Response.Buffer =true
      Response.Clear()
      Response.ContentType="application/pdf"          
      'Response.AddHeader "Content-Disposition" , "attachmentfilename="+pdfID+".pdf"
       Response.AddHeader "Content-Disposition" , "inlinefilename="+pdfID+".pdf"
      dim pdfSize
          pdfSize = rs(PDF_CONTENT").ActualSize          
      Response.BinaryWrite rs("PDF_CONTENT").getChunk(pdfSize)
      rs.MoveNext()
    loop
   if (NOT haveData)  then Response.Write "查無資料
"
   conn.Close()   
%>

Velocity - 使用備忘錄


Velocity - 使用備忘錄
Velocity 是拿來作模板套版使用 , 你可以把常用的某些內容透過模板定義的方式 , 由它幫你轉換
直接來看主程式
以下範例 , 是假設你要寄送一堆電子帳單給客戶 , 但是有可能電子帳單的內容會調來調去
(User 特別是User 的主管 , 總是會在最後一刻改變心意 , 告訴你 , 某段的內容要換掉某個字 , 甚至是標點符號的全形半形都會要你改)

以下是使用講解 , 只把重點挑出來 , 完整程式碼 , 請看最下方有附上
完成的測試範例包含
(1)
TestMainApp1.java
(2)
example1.vm
(3)
example1_big5.vm

以下針對
TestMainApp1.java 作重點講解
假設你有一個method , 會根據你傳入的資料,去進行套版 , 然後回傳套表之後的結果

public static String getMailVM(Properties pData) throws Exception{
String s1=null;
VelocityEngine ve=new VelocityEngine();

Properties p = new Properties();
//以下是告訴套表程式 , 你的套版檔案放在哪個目錄

p.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, "/home/demo/wk_myDemoLab/MyDemoVelocity/src");
//p.setProperty("runtime.log", "velocity.log");
ve.init(p);
//這個是放我們傳入的變數內容

VelocityContext context = new VelocityContext(pData);

Template template = null;

//以下是抓取套版檔案 , 且要用哪種編碼方式讀取
//注意 , 如果你的套版檔案存檔時是用UTF8編碼 , 請用UTF8讀取
//注意 , 如果你的套版檔案存檔時是用big5編碼 , 請用Big5讀取
//不然就會造成 , 顯示時有可能只有變數會正常顯示 , 其他部份都是亂碼
// template = ve.getTemplate("example1.vm","UTF8");
template = ve.getTemplate("example1_big5.vm","big5");

StringWriter writer=new StringWriter();
//合併套版及變數 ,

if ( template != null) template.merge(context, writer);
writer.flush();
writer.close();
//將套版結果轉出成字串

s1=writer.toString();
ve=null;
context=null;
template =null;
return s1;
}


public static void main(String[] args) throws Exception {
//設定會給套版使用的變數 , 需要跟套版檔案配對

Properties p1=new Properties();
p1.setProperty("cust_name", "錢多多");
p1.setProperty("bank_name", "大台北郵局");
p1.setProperty("account_num", "200-123-456");
p1.setProperty("yr", "98");
p1.setProperty("mn", "06");
p1.setProperty("dy", "15");
String s1= getMailVM(p1);
System.out.println(s1);
}

}
======執行結果 , 粗體部分是我們傳入的變數=========
親愛的 錢多多 ,您好:
您的帳單將於98年06月15日自您的大台北郵局200-123-456進行扣款。

客戶服務部
======================================
前面提到User 或是User的主管總是很多變 , 如果哪一天User 又想要變變花樣
把電子帳單的訊息改變甚至是要由 Text 變成HTML 怎麼辦?
在沒有增加變數的情況下 , 你只要打開 example.vm然後根據User要的 , 重新調整這個套版就可以了
完成不需要打開原始程式碼重新修改編譯....

把會變的部份 , 盡可能抽離出來 , 讓"修改"遠離你的原始程式碼,

以下是完整程式碼範例

=====example1.vm , 注意是要存檔為 UTF8編碼==================
親愛的 $cust_name ,您好:
您的帳單將於$yr年$mn月$dy日自您的$bank_name$account_num進行扣款。

客戶服務部

=========================================================
=====example1_big5.vm , 注意是要存檔為 Big5編碼=============

親愛的 $cust_name ,您好:
您的帳單將於$yr年$mn月$dy日自您的$bank_name$account_num進行扣款。

客戶服務部

==================================================================
TestMainApp1.java
==================================================================

package com.demo.velocity.examples;

import java.io.StringWriter;
import java.util.Properties;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;

public class TestMainApp1 {
public static String getMailVM(Properties pData) throws Exception{
String s1=null;
VelocityEngine ve=new VelocityEngine();

Properties p = new Properties();
p.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, "/home/demo/wk_myDemoLab/MyDemoVelocity/src");
//p.setProperty("runtime.log", "velocity.log");
ve.init(p);
VelocityContext context = new VelocityContext(pData);

Template template = null;
// template = ve.getTemplate("example1.vm","UTF8");
template = ve.getTemplate("example1_big5.vm","big5");

StringWriter writer=new StringWriter();
if ( template != null) template.merge(context, writer);
writer.flush();
writer.close();
s1=writer.toString();
ve=null;
context=null;
template =null;
return s1;
}
public static void main(String[] args) throws Exception {
Properties p1=new Properties();
p1.setProperty("cust_name", "錢多多");
p1.setProperty("bank_name", "大台北郵局");
p1.setProperty("account_num", "200-123-456");
p1.setProperty("yr", "98");
p1.setProperty("mn", "06");
p1.setProperty("dy", "15");
String s1= getMailVM(p1);
System.out.println(s1);
}

}

企業使用盜版軟體會被抓 , 企業使用軟體的另外選擇

企業使用盜版軟體會被抓 , 企業使用軟體的另外選擇
最近經濟不景氣 , 在台灣有所謂的BSA | 臺灣商業軟體聯盟 , 專門協助一些大廠抓盜版
檢舉是有檢舉獎金的 , 但是有但書 , 就是必須是舉發成功 , 而且"打官司"有勝訴並且有獲得賠償金額....
但是有很多離職員工都是為了出一口氣... , 所以你會發現會去  BSA檢舉的多是離職員工....

然後每年只有要公司被 BSA抓到有盜版 , 都會有人問:  BSA 會不會抓個人盜版?
答案是: 目前並不會,
原因是: BSA 的收入來源就是抓盜版 , 並且勝訴的賠償金 ,
            所以它的對象都是企業公司行號 ,
            至於無利可圖的個人 , 目前還不是它的目標
(詳情參閱最下方的新聞內容)


回過頭問 ,
為什麼要用盜版? 錢太多 , 一定要買正版?
錯 , 明明有替代性軟體可能達到相同功能 , 為何一定要用盜版 ,
軟體除了要花錢買的正版軟體 , 不花錢買的正版的盜版軟體之外(有點繞舌) ,
還有另一種選擇 , 開放原始碼的免費的正版軟體


簡單的對照如下: 商業付費軟體    -> (開放原始碼)/(免費)正版軟體
OS            :MS Windows         -> Linux (Ubuntu Server / Desktop  或是其他 Linux)
Office        :MS Office         -> Open Office
壓縮軟體        :WinZip / WinRar     -> 7zip
PDF產生軟體    :Adobe Acrobat        -> PDFCreator
電子字典        :DrEye            -> StarDict
虛擬伺服器    :VMWare Workstation    -> VMware Server 2.0
(燒錄軟體        :) ~~~            -> 太多
(影音播放軟體    :) ~~~            -> VLC

很多企業都會花錢買 Windows OS , MS Office , WinZIP , Dr.Eye 等軟體
但是其實這些軟體都有替代軟體可以使用....不是一定要花錢才有用...

有許多商業軟體也會提供給個人開發用的開發版軟體
例如: XXX Express Edition , XXX Personal Edition , ....
但是很奇怪 , 有很多人就是要用盜版 , 明明有的選擇 , 有替代產品 , 替代方案 , 但是就是要用盜版軟體

舉例來說: VMWare Server 版是免費的版本 , 而VMWare Workstation 是需要付費的版本
其實 VMWare Server 版的功能已經能夠滿足需要使用 VM的人大部份的功能 ,
但是就還是有人偏偏要使用盜版的 VMware Workstation ,


別懷疑 , 我們公司的某廠商 , 他們的人員不止用的理直氣壯 , 告訴他們有免費的VMware Server版本可用 , 他們還一副你是白痴的態度....
甚至於開發出來的某些系統有使用到有版權的商業字型 , 他們也是不管公司是否有買 , 就是拿了就要裝 ,
還有像是 Adobe Acrobat , 反正那家廠商就是甚麼東西會侵權 , 就拿甚麼東西來用....
(反正東西是要裝在我們公司環境跑...就看我們公司的某些白爛 , 會不會明明知道侵權 , 還是讓他們裝在上面)

另外像是文件要轉成 PDF 不是只有 Adobe Acrobat 才能使用 ,
明明有Open Source 的 PDF Crator , 或者是利用 Open Office  也可以把文件轉出成 PDF
但是就是有人堅持要用盜版的 Adobe Acrobat , 很奇怪的想法


關於軟體授權還有不少 故事可以說 ,
有空再說....

以下是跟本文說明相關的新聞全部抄錄 , 僅供上文說明參考使用
------------------------------------------------------------
BSA:不景氣 盜版檢舉率飆升2倍
http://www.zdnet.com.tw/news/software/0,2000085678,20138024,00.htm  
ZDNet記者蔡宜秀/台北報導 2009/05/05 19:31:02

無薪假、企業縮編與員工的版權意識抬頭導致今(09)年的企業盜版檢舉量較往年高出2倍。

台 灣商業軟體聯盟(BSA)主席宋紅媞今(6)日指出,從去(08)年11月到今(09)年4月短短半年的時間,即累積超過往年一年的企業盜版檢舉案件 數:1千5百筆,由於檢舉案件繁多,BSA目前仍在篩選、過濾檢舉案件的真實性,計畫將於今(09)年6月開始透過合作律師事務所進行查緝。

BSA指出,不景氣有可能促使今(09)年的企業盜版檢舉案件創歷年新高。

從年初至今,BSA每月至少接獲250到300件檢舉案。宋紅媞表示,因為過年的關係,2月的盜版檢舉率多半偏低,但今年卻不是這麼一回事,根據BSA目前的統計資料來看,這與過年前、中、後都有企業在裁員,以及放無薪假有關。

「這一次接獲檢舉的企業清一律是新竹以北的中小企業,而這可能與中南部的中小企業多在這波不景氣時期宣告倒閉有關,」她說。

接獲盜版檢舉案件數雖創新高,但不代表BSA能荷包滿滿。宋紅媞指出,由於每個案件多得費時2到3年才會有最終判決,因此,即便今年接獲的盜版檢舉案件創往年新高,也未必能未BSA帶來立即性收益:高額賠償金。

「更重要的是,BSA在偕同檢警單位查緝涉嫌使用盜版軟體的企業前,多會先發送警告信函給企業,只要企業證明已改過,即不會進行查緝動作。」她說。

根據BSA數據顯示,台灣盜版率目前是40%,僅次於日本(23%)與新加坡(37%),為亞洲第三低。另根據IDC調查報告顯示,若台灣的軟體盜版率能在2012年降低為31%,將帶動國內生產毛額(GDP)高達134億元的挹注。



BSA查盜版 倒楣的多半是小企業

CNET新聞專區:Ina Fried 2007/11/27 13:32:02

商業軟體聯盟(Business Software Alliance)給人的印象,總是宣布軟體盜版率,並公布因使用盜版而和解的案例。但最新調查報告卻發現,BSA最大的資金來源不是因使用盜版軟體被抓的大企業,而是小公司。

美聯社記者Brian Bergstein表示,他的分析報導顯示,BSA的和解金收入中,有90%是取自於小企業。美聯社報導指出,這個代微軟、奧多比(Adobe Systems)等軟體商監督有無盜版行為的組織,去年的和解金進帳高達1,300萬美元。

有趣的是,美聯社報導附帶的一張表格顯示,BSA的收入有81%得自於和解金,13%得自於會員費。這些收益有將近五成用於法律訴訟,另有16%用於公共關係。

另外值得一提的是,BSA原先為鼓勵企業使用正版軟體,而提出一些赦免措施,但現在這些措施已縮減。同時,BSA提高發懸賞抓盜版的獎金,以鼓勵企業員工舉發使用盜版軟體的雇主。

這篇報導質疑,這類獎勵措施鼓勵任職於企業IT部門的員工舉發雇主,並不能解決企業使用正版軟體的問題。報導也質疑,BSA雖然宣稱只把矛頭對準嚴重藐視軟體授權條件的企業,但案例卻顯示,猶他州有一家公司只用兩套未授權的微軟軟體,一樣被抓到。 (唐慧文/譯)

網路安全-企業禁用Open Source 軟體的合理性

網路安全-企業禁用Open Source 軟體的合理性

就我個人所知 , 某些企業內部所謂的 rm單位的某些人士 ,(IRM 或是 ORM)
為了要表現自己真的很專業 , 在審查你的軟體系統時 , 或是針對公司的相關軟體政策 ,
都會把 Open Source 的軟體或是相關套件列為 "禁止使用"
不然就是說 , "不然你開出個證明 , 證明這個軟體或是套件是安全的"


實際上 , 這些人根本就是在裝懂 ,
首先, 你買微軟或是IBM 或是 Oracle的軟體進來的時候 ,
你是否有要求 微軟或是IBM 或是 Oracle 針對他們的軟體開具證明 , 去證明軟體或是套件經過測試是安全的?
那一家公司或是企業有要求出具證明的 , 可以出個聲...

第二個 , 你去哪裡要求提供Open Source 的組織或是單位為你開具證明?

或者是有的企業或是公司政策乾脆明定禁止使用 Open Source (軟體? / 套件?)

基本上 , 如果我是稽核人員 , 看到這種政策 , 然後那家公司如果又是使用 Java導向的 ,
我就直接給他記缺失....

因為政策太白痴 ...會這樣訂的 , 保證是完全不懂的人在裝懂....
這麼說好了 , 很多 Java程式都會使用的 log4j , hibernate , jdom ,dom4j 之類的套件 ,
根本就是 Open Source , 但是公司的政策又規範說 , 禁用 Open Source ,
那你說 , 這樣是不是違反政策 , 是不是就是缺失....

所以說會定這種白痴政策的人 , 你能說他不是在裝懂?
假裝好像很懂資訊安全 , 定了一大堆 , 就是公司擺明一定會違反的政策
你說他不懂 , 他又訂的頭頭是道 ,
你說他真懂 , 怎會訂出擺明就過不了的政策

這種人 , 我碰到過 , 真的你要他說出個五四三 , 他會說的天花亂墜 ,
但是明明這種訂法 , 就是亂來 , 公司擺明了百分之百會違反政策 , 他還是在亂訂....
偏偏又是這種人在導 ISO , 擺明了 , 這種人一導入ISO , 就會讓公司記缺失...還導個屁....




我說得是不是真的?
有興趣的人 , 回去翻翻你們自家公司的 ISO政策或是資訊安全相關文件
是否有禁用 Open Source 這一條要求 ,
有的話 , 再看看 , 你們公司是否是使用 Java相關平台在開發系統的 ,
是的話 ,
直接問 , 使用 Java 系統中幾乎一定會使用的 log4j 是否就會讓你的系統跟公司根本性的違反政策 ,
(一般來說 , 要使用違反政策的軟體或是套件 , 必須要有豁免程序 , 就是公司的某單位要提出申請 , 然後安控單位及相關主管要審查 , 然後出具證明 , 表示公司的安控單位同意此項違反公司政策的要求等等)

這時候 , 你就可以去看看 , 系統中使用的 log4j 是否有經過公司的豁免程序同意使用(有無豁免證明)
如果沒有 , 那就是缺失....


(log4j 的使用 , 在Java 平台上 , 幾乎就是常識性的使用 ,
Java開發人員沒人會特別針對這一點去提出疑問 ,

但是 , 對不起 ,
公司某些制定 SDLC , 安控政策的 , 是完全不會寫程式的人在制定 , 訂的頭頭是道 , 執行處理問題重重)


會拿 log4j 出來當樣板 , 只是為了要突顯 ,
很多公司或企業的安控政策對於Open Source 另眼看待或是要求的不合理狀況
(你用了 log4j(Open Source) , 怎麼沒有出具證明 , 證明 log4j 是安全的 ,
Open Source 你找誰去出具證明的? ,
你用微軟的軟體 , 就不用要求微軟出具證明 , 證明他們家的軟體是安全的 , 沒有漏洞的
)


如果有碰到 , 公司內部安控單位的人員 , 拿著禁用 Open Source的政策當作令箭的 ,
請拿 log4j 打的他滿地找牙.....
(看看安控單位的人員如何不懂裝懂的自圓其說...還蠻有趣的 ,
不過最後的結果大部分就是 , 他可以跟你廢話個 2 萬字 , 但是怎麼把問題處理掉 , 他絕對說不出來...只是繞著問題打轉)

這是先前碰到公司內部的所謂安控人員 , 針對系統的要求 , 特別讓我感冒的問題....
(我不認為 Open Source 是 100%安全的 , 但是我並不認可的是 那種完全不懂就裝懂的要求政策)

~備份複製~從奇摩我的部落格~