Home

2009年10月22日 星期四

XOOPS 2.3.3b 與 AD 的帳號整合

From: Polin Wei

廢話不多說, 直接來看設定值:

作業環境:

LDAP 認證的環境:

OS: Windows Server 2k3 SP2
Domain: mydomain.com
Host: ad.mydomain.com
LDAP Search User: xoopser ( 此 User 放在 Windows Server 2k3 AD 內定的 Users 目錄CN下)


XOOPS 運作的環境:

XOOPS Version - XOOPS 2.3.3b
PHP Version - 5.2.6
MySQL Version - 5.0.51b-community-nt-log
Server API Version - apache2handler
OS Version - WINNT

記得要將 php.ini 中的 ldap extension 啟用,並重啟 apache server

extension=php_ldap.dll


在 XOOPS 管理模組的設定如下:

Preferences Main »» Authentication Options
Authentication Method: Microsoft Active Directory ©
LDAP - Port Number: 389
LDAP - Server Name: ad.mydomain.com
LDAP - Base DN: dc=mydomain,dc=com
DN of the LDAP manager: cn=xoopser,cn=Users,dc=mydomain,dc=com <= 搜尋用的帳號,需使用完整的 DN , 注意預設的 Users , 是 cn , 不是 ou
Password of the LDAP manager: **********
LDAP Version protocol: 3
Users allowed to bypass LDAP authentication: admin
Login name use in the DN: No
LDAP Attribute use to search the user: sAMAccountName
The search filter LDAP query to find user: 空白
The domain name: mydomain.com
Automatic xoops account provisionning: Yes
Default affect group: 會員
LDAP - Mail Field Name: mail
LDAP - Given Name Field Name: givenname
LDAP - Surname Field Name: sn
Xoops-Auth server fields mapping: email=mail|name=displayname
Maintain xoops account provisionning: Yes
Use TLS connection: No

看截圖 [英文版]

看截圖 [中文版]


這樣夠清楚了吧!! 搞了我一個下午...希望對大家有幫助

FTP 的概念

From: Polin Wei

概念:

FTP 是 File Transfer Protocol(檔案傳輸協定)的縮寫, FTP 是 Internet 中傳輸檔案的一套通訊協定標準, 任何電腦系統只要遵循 FTP 協定, 就可以和其它相同或不相同的電腦系統之間互相傳遞檔案.

FTP 的通訊協定:

HTTP, SMTP, POP3...等通訊協定都只要一個通訊埠. 如 HTTP=>80, SMTP=>25, POP3=>110 , 但 FTP 卻需要二個通訊埠( Command Port & Data Port )

Command Port: 用於傳送主機端與客戶端之間命令的連線埠, 一般預設的通訊埠為 21
Data Port: 用於傳送主機端與客戶端之間的資料連線埠, 而 Data Port 又分成二種: PORT 和 PASV. 兩者主要分別在於客戶端向主機端發出不同的 FTP Command

PORT 模式: 一般的 FTP 在傳送資料時是採用主動(PORT)模式, 由客戶端主動要求主機端透過那個通訊埠來傳送資料. 這樣的話就會讓客戶端可以任意要求主機端連到特定的通訊埠, 這可能會有安全性的問題; 另外主機端受到防火牆的阻擋也會無法傳送資料, 因此有設定防火牆的話就要改用被動(PASV)模式

PASV 模式: 被動(PASV)模式就是客戶端連上主機端後, 不主動要求主機, 而是被動地等待主機端通知客戶端可以用那個連線, 以及到哪裡去取得下載的資料. 而你選用 PASV 通訊埠的範圍是不能被防火牆給擋住的. 否則將無法傳輸資料.

具有 FTP Server 功能的軟體:

Free 免費軟體如下:
zFTPServer : http://zftp.twftp.org
FileZilla : http://filezilla-project.org
HFS : http://www.rejetto.com
PCMan's FTP: http://pcman.ptt.cc/FTPD_teach/

2009年7月17日 星期五

2009年7月14日 星期二

[Apache] 網頁目錄保護 .htaccess 檔案

From: Polin Wei

利用 .htaccess 檔案來保護網頁目錄, 只能適用於 Apache 伺服器, 對於 ISS 並不適用, 假如你無法修改 Apache 的設定檔, 那 .htaccess 檔案會是一個很好的選擇 .htaccess 能在你架設的網站目錄內對網站伺服器產生控制作用, 目錄內一旦有這個檔案, 該目錄及所有子目錄都會受到影響.

.htaccess 是一個文字檔, 你可以使用任何像是 NotePad 的文字編輯器直接撰寫, 編輯這個檔案, 然後再用 ftp 的方法上載到 Apache 的目錄內. 如果使用 ftp 的軟體需選擇傳輸模式, 要記得選擇 ASCII 模式.

以下針對 .htaccess 檔案內容的參數作一些說明:

Options +Indexes : 顯示目錄內的檔案清單
Options -Indexes : 不顯示目錄內的檔案清單
IndexOptions +FancyIndexing : 檔案清單呈現時, 出現檔案類型的小圖示
IndexOptions -FancyIndexing : 檔案清單呈現時, 不要出現檔案類型的小圖示
IndexIgnore *.php *.html : 隱藏指定的檔案, 其余的檔案則呈現出來. 此範例為 隱藏 .php *.html 的檔案

2009年7月11日 星期六

[Form] 如何取消表單輸入時的自動完成

From: Polin Wei

一般的情況 IE5/6/7, FireFox 預設是將 AutoComplete 打開。見:IE5/6/7-工具-內容-自動完成選項。

<form>
    <input type="text" name="user_name">
</form>



但有時候我們並不需要 AutoComplete,例如需要使用者自己再次輸入密碼而非自動完成, 或者用 AJax 將後端整理好的資料讓使用者挑選時..., 在上述的情況時, autocomplete 都會干擾使用者的操作, 若要讓特定的表單欄位不要自動完成 ( autocomplete ), 只要將此表單輸入元素的autocomplete屬性設置為off即可。

<form>
    <input type="password" name="Password" autocomplete="off">
</form>



如果所有表單元素都不想使用autocomplete功能, 則可以用下面的方法:


<form autocomplete = "off">
    <input type="text" name="user_name">
    <input type="password" name="Password" >
</form>

2009年7月10日 星期五

[Apache] 加掛壓縮模組 deflate/gzip 壓縮網頁 加快顯示速度

From: Polin Wei

在 apache2.x 利用 mod_deflate 模組來設定 gzip , 可以壓縮網頁資料, 加快網頁顯示速度. 設定如下:
step 01: 修改 $APACHE_HOME/conf/httpd.conf

LoadModule deflate_module modules/mod_deflate.so 將 # 拿掉

#
## 啟動 gzip 壓縮, 加上下列設定
#
<IfModule mod_deflate.c>
      DeflateCompressionLevel 6
      AddOutputFilterByType   DEFLATE text/html text/plain text/xml application/x-httpd-php
      AddOutputFilter         DEFLATE html htm xml css js php
</IfModule>


若是要壓縮 PHP 檔, 則可以修改 php.ini 中的
output_handler = ob_gzhandler

step 02: 重新啟動 Apache Service 即可

附註: 經測試, 大致可以減少約 35% 的傳輸量

2009年5月15日 星期五

[PHP] AppServ 安裝 pear 及與 MySQL 連結設定

From: Polin Wei

環境:
OS: WindowXP Sp3
AppServ Package: appserv-win32-2.5.10.exe 包含的服務如下:
Apache 2.2.8
PHP 5.2.6
MySQL 5.0.51b
phpMyAdmin-2.10.3


Step 01:
appservnetwork: 下載appserv-win32-2.5.10.exe 並依預設目錄 C:\AppServ 安裝 Apache, PHP, MySQL, phpMyAdmin

Step 02:
修改 c:\windows\php.ini 檔. DLL (動態連結檔) 先載入 php_mbstring.dll, 再載入 php_exif.dll 順序如下:

; Windows Extensions
; Note that ODBC support is built in, so no dll is needed for it.
; Note that many DLL files are located in the extensions/ (PHP 4) ext/ (PHP 5)
; extension folders as well as the separate PECL DLL download (PHP 5).
; Be sure to appropriately set the extension_dir directive.

; pear 要用的
extension=php_mbstring.dll
extension=php_exif.dll


Step 03: 安裝 PEAR
a. 重新啟動 Apache , 然後執行 C:\AppServ\php5\go-pear.bat,往後皆按Enter便可。
b. 最後會出現一段訊息,提醒使用者雙擊 c:\AppServ\php5\PEAR_ENV.reg ,登錄PEAR相關的註冊碼。

Step 04: 安裝 PEAR DB, 並使用"Pear list" 檢查是否安裝完成
C:\AppServ\php5>pear install DB
C:\AppServ\php5>pear list




Step 05 : 在 DB: test , 建立 Table: users 來測試
--
-- 資料庫: `test`
--
--------------------------------------------------------
--
-- 資料表格式: `users`
--

CREATE TABLE `users` (
`id` varchar(10) NOT NULL,
`username` varchar(30) NOT NULL,
`password` varchar(50) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- 列出以下資料庫的數據: `users`
--

INSERT INTO `users` (`id`, `username`, `password`) VALUES ('1', 'polin', 'wei');


Step 06: 建立 pearDB.php 來測試

<?php


require_once("DB.php");


$dbh = DB::connect('mysql://root:mysql@localhost/test');
$result = $dbh->query('SELECT * FROM users ORDER BY id');
if ( $result->numRows($result) > 0 ) {
 echo "<table>\n<tr><th>ID</th><th>userName</th><th>Password</th></tr>\n";
  while ( $data = $result->fetchRow() ) {
  echo "<tr><td>$data[0]</td><td>$data[1]</td><td>$data[2]</td></tr>\n";
  }
  echo "</table>\n";
} else {
  echo "Ok;\n";
}


?>


 




成果如下:
ID userName Password
1 polin wei

2009年5月10日 星期日

利用 Lambda Probe 來觀察 JNDI 的 DataSource Connection Pools

From: Polin Wei

在寫 Java 程式時, 利用 JNDI 來連接資料庫, 是一個非常好的方法, JNDI 的設定, 請參考: [JNDI] Java + Tomcat + MySQL 的連結設定 但是新手程式設計師常常建立了 DataSource 的 Connection , 在取完資料庫後, 卻又常常忘了關閉這一條 connection . 導致資料庫連接池 ( DataSource Connection Pools ) 不夠使用, 而整個 Application Server 當住了.

這有一個不錯的工具 Lambda Probe , 可以讓程式設計師來觀察程式撰寫的過程中, 是否有 Connection 忘了關閉的情況. 而 Lambda Probe 目前有支援 Tomcat & JBoss.

環境:
Tomcat : 6.0.14
Lambda Probe: LambdaProbe 1.7b, BINARIES (解開的檔案放在 D:\probe)

Step 01:
Lambda Probe 下載 LambdaProbe 1.7b, BINARIES , 並解開放在 D:\probe

Step 02:
修改 Tomcat 的 server.xml , tomcat-users.xml 分別如下:


server.xml
<Context docBase="D:/probe" path="/probe" privileged="true"/>

tomcat-users.xml
<role rolename="admin"/>
<user username="admin" password="1234" roles="admin,manager"/>


Step 03:
重啟 Tomcat

Step 04:
進入: http://localhost:8080/probe
輸入admin,1234



Step 05:
點選 Data Sources 的頁次, 就可以查看 DataSource Connection Pools 的狀況



參數說明:
在 Data Sources 頁次中的 M, E , B 分別為
M: Total max. 連接池最大的連接數目
E: Total estab. 現行已建立過的連接(connections) 數目
B: Total busy 目前的連接數

2009年5月7日 星期四

[FCKeditor] 用 Java Taglib 使用 FCKeditor

From: Polin Wei

FCKeditor 是所見即所得(WYSIWYG)的線上編輯器, 支援多國語言, 多種瀏覽器支援, 可更換SKIN,還可以用JavaScript控制按鈕,功能十分多樣化,外掛的功能也是十分強大,支援瀏覽器管理檔案...等多樣化外掛。

支援語言: ASP.Net, ASP, ColdFusion, PHP, Java, Active-FoxPro, Lasso, Perl, Python
支援流覽器: IE, FireFox, Safari, Opera, Google Chrome, Camino
支援平台: MS Windows , MAC , Linux
版權: under the GPL, LGPL and MPL open source licenses

在 Java 的平台上有一個很好用的工具 Taglib , 可以讓你的 jsp 程式簡單化.配置如下

FCKeditor: FCKeditor_2.6.4.zip
FCKeditor.Java: fckeditor-java-2.4.1-bin.zip
FCKeditor.Java 文件參考: http://java.fckeditor.net/
SLF4j: slf4j-1.5.6.zip
Application Server: Tomcat 6.x.x

step01:
在 WebContent 目錄下建立一個目錄 fckeditor , 並將 FCKeditor_2.6.4.zip 解開的資料放在這個目錄下.

step02:
解開 fckeditor-java-2.4.1-bin.zip , 將 fckeditor-java-core-2.4.1.jar, 及 lib 目錄下的三個檔案 commons-fileupload-1.2.1.jar, commons-io-1.3.2.jar, slf4j-api-1.5.2.jar , 複製到 WEB-INF\lib

step03:
解開 slf4j-1.5.6.zip , 將slf4j-api-1.5.6.jar, slf4j-simple-1.5.6.jar 複製到 WEB-INF\lib

step04:
在 WEB-INF\web.xml 檔增加下列程式碼
<servlet>
 <servlet-name>Connector</servlet-name>
 <servlet-class>net.fckeditor.connector.ConnectorServlet</servlet-class>
 <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Connector</servlet-name>
  <url-pattern> /fckeditor/editor/filemanager/connectors/*
  </url-pattern>
</servlet-mapping>


step05:
在 WEB-INF 目錄下增加一個檔案 FCKeditor.tld , 內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
 version="2.0">
 <description>
  The FCKeditor Tag Library offers a very convenient way to create
  several FCKeditor instances with different configurations.
  Additionally, you can check for user-based capabilities.
 </description>
 <display-name>FCKeditor Tag Library</display-name>
 <tlib-version>2.4</tlib-version>
 <short-name>FCK</short-name>
 <uri>http://java.fckeditor.net</uri>
 <tag>
  <description>
   Creates a FCKeditor instance with the given parameters. Any
   parameter except instanceName which is empty or contains
   whitespaces only will be ignored.
  </description>
  <display-name>editor</display-name>
  <name>editor</name>
  <tag-class>net.fckeditor.tags.EditorTag</tag-class>
  <body-content>JSP</body-content>
  <attribute>
   <description>
    The unique instance name under which the editor can be
    retrieved through the API.
   </description>
   <name>instanceName</name>
   <required>true</required>
   <rtexprvalue>true</rtexprvalue>
   <type>java.lang.String</type>
  </attribute>
  <attribute>
   <description>
    Width of the FCKeditor instance in the browser window.
   </description>
   <name>width</name>
   <rtexprvalue>true</rtexprvalue>
   <type>java.lang.String</type>
  </attribute>
  <attribute>
   <description>
    Height of the FCKeditor instance in the browser window.
   </description>
   <name>height</name>
   <rtexprvalue>true</rtexprvalue>
   <type>java.lang.String</type>
  </attribute>
  <attribute>
   <description>
    The toolbar set which shall be displayed to the user.
   </description>
   <name>toolbarSet</name>
   <rtexprvalue>true</rtexprvalue>
   <type>java.lang.String</type>
  </attribute>
  <attribute>
   <description>
    The path/folder in which the editor is deployed under
    the given context. The context path will be attached
    automatically. (e.g. '/fckeditor')
   </description>
   <name>basePath</name>
   <rtexprvalue>true</rtexprvalue>
   <type>java.lang.String</type>
  </attribute>
  <attribute>
   <description>
    Passes any content to the FCKeditor document. Use the
    jsp:attribute tag for large inline content. \r, \n, and
    \t will be truncated.
   </description>
   <name>value</name>
   <rtexprvalue>true</rtexprvalue>
   <type>java.lang.String</type>
  </attribute>
  <example><![CDATA[
<FCK:editor instanceName="editorDefault" height="500px" />]]>
  </example>
 </tag>
 <tag>
  <description>
   Sets a config property of the editor to the supplied value.
   You may provide any attribute you want for the editor. Set
   at least one attribute per tag or several attributes with
   one tag. This tag can only be nested within an editor tag.
   For all configuration options click
   <![CDATA[<a href="http://docs.fckeditor.net/FCKeditor_2.x/Developers_Guide/Configuration/Configuration_Options">here</a>]]>.
  </description>
  <display-name>config</display-name>
  <name>config</name>
  <tag-class>net.fckeditor.tags.ConfigTag</tag-class>
  <body-content>empty</body-content>
  <dynamic-attributes>true</dynamic-attributes>
  <example>
   <![CDATA[
<FCK:config SkinPath="/skins/silver/" AutoDetectLanguage="true" />]]>
  </example>
 </tag>
 <tag>
  <description>
   Displays session-dependent and compatibility-related
   information. This tag is intended for developers only.
   Response messages cannot be localized, they are English
   only.
  </description>
  <display-name>check</display-name>
  <name>check</name>
  <tag-class>net.fckeditor.tags.CheckTag</tag-class>
  <body-content>empty</body-content>
  <attribute>
   <description>
    Provide the feature name you want to check. Valid
    features are [FileUpload, FileBrowsing,
    CompatibleBrowser]
   </description>
   <name>command</name>
   <required>true</required>
   <type>java.lang.String</type>
  </attribute>
  <example><![CDATA[
<FCK:check command="FileUpload" />
<FCK:check command="CompatibleBrowser" />]]>
  </example>
 </tag>
</taglib>


step06:
建立一個 fck.jsp 來測試, 程式碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/FCKeditor.tld" prefix="FCK"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<form action="show.jsp" method="post" target="_blank">
<FCK:editor instanceName="fckEdit"  width="700" height="500"  toolbarSet="Default" />
<input type="submit" value="Submit">
</form>


</body>
</html>



成果如下圖:


fckeditor-java-2.4.1 的設定比較簡便, 就連上載檔案, 也只要在step04: 設定好 servlet : Connector 就可以了. 不需要太繁瑣. 不過若要上載檔案, 不要忘了要在 classpath 建立一個檔案 fckeditor.properties , 內容如下:
fckeditor.toolbarSet=Basic
connector.userActionImpl=net.fckeditor.requestcycle.impl.UserActionImpl
connector.userFilesPath=/userfiles
connector.resourceType.file.extensions.allowed=txt|doc
connector.resourceType.image.extensions.allowed=jpg|png


這樣才不會有問題. 參數說明:
connector.userFilesPath : 是伺服器上要存放檔案的地方.如 /userfiles
connector.resourceType.file.extensions.allowed : 可以限制上傳到/userfiles/file 目錄的附加檔名有那些
connector.resourceType.image.extensions.allowed: 可以限制上傳到/userfiles/image 目錄的附加檔名有那些

因為上載的檔案只能存在這個 application WEBcontent 的目錄內, 所以若將 java 打包成 war 檔在 JBoss 上使用, 則會有問題.

2009年4月14日 星期二

MSSQL 2000 附加資料庫時, 只有MDF檔 或 出現LSN錯誤

From: Polin Wei

MSSQL 2000 Server 建立一個資料庫時, 會有兩個檔案 MDF 檔(資料檔) 及 LDF 檔(交易檔), 有時因為某種原因(如當機, 備份時間不一致...等), 致使這兩個檔的 LSN 不一致. 或者只備份 MDF 檔, 因此在附加資料庫時, 會發生 LSN 的錯誤. 以致於資料庫無法附加


環境:
OS: Windows Server 2k3 SP2
MSSQL: 2000 版本8.0
資料庫: ATest
資料庫檔案: D:\DB\ATest_Data.MDF (遺失 ATest_Log.LDF 或兩者不同步, 導致附加資料庫時出現 LSN 錯誤)

要救回資料庫的方法如下:

Step 01: 新建立一個相同的資料庫, 建立好後 shutdown MSSQL 2k


Step 02: 移除新建立資料庫的檔案 D:\DB\ATest_Data.MDF & ATest_Log.LDF , 將原來的 ATest_Data.MDF 放回 D:\DB

Step 03: 在 SQL Query Analyzer 中執行以下语句,把该数据库设置为紧急模式
Use Master
Go
sp_configure 'allow updates', 1
reconfigure with override
Go




Step 04: 接著執行 下列指令
update sysdatabases set status = 32768 where name = 'ATest'

Step 05: 重启SQL Server服务, 會發生此資料庫進入緊急模式


Step 06: 執行 sp_dboption 指令,把資料庫设为Single User模式;
sp_dboption 'ATest', 'single user', 'true'

Step 07: 執行 DBCC CHECKDB
DBCC CHECKDB('ATest')


Step 08: 執行 DBCC REBUILD_LOG , 重建立 LDF 檔, 此時可以看到資料庫內的資料表了
DBCC REBUILD_LOG('ATest','D:\DB\ATest_Log.LDF')




Step 09: 執行下列指令, 将資料庫回覆正常狀態
update sysdatabases set status=0 where name='ATest'
或者
sp_resetstatus "ATest"
go
sp_configure 'allow updates', 0
reconfigure with override



Step 10: 執行 sp_dboption 指令, 將資料庫設回多人模式:
sp_dboption 'ATest','dbo use only','false'

Step 11: 重啟 MSSQL Server 2000 即可

2009年4月13日 星期一

[DataBase] 用 eclipse 的 Data Source Explorer 讀取 Oracle XE 資料

From: Polin Wei

Step 01: 設定 DataBase 所需要的 JAR 檔
Window -> Preferences 選擇 Data Management -> Connectivity -> Driver Definitions
先在 Name/Type 中選擇資料庫驅動程式的名字(Driver Name) 如 Oracle XE 為 Oracle Thin Driver, version 為 10 ; 然後再到 Jar List 指定 Jar 檔存放的地方.


Step 02: 在 Data Source Explorer 中建立 OracleXE 的連線設定


Step 03: 選擇 Connection profile type


Step 04: 設定連接 Oracle XE 的相關參數, 並按下 Test Connection , 測試是否連線成功


設定好以上資料, 就可以將 Table 的資料叫出, 並直接作新增, 修改, 刪除, 存檔的動作了.

2009年4月12日 星期日

[PHP] 用 eclipse PDT 撰寫 PHP

From: Polin Wei

Step 01: 安裝 PHP Development (PDT) :

習慣用 eclipse IDE 的工具來撰寫 JAVA, 若想用它來撰寫 PHP 則可以使用 PHP Development (PDT) 的工具, 這樣就可以不用切換程式撰寫工具. 若你已經裝了 eclipse 則可以使用 Safeware updates 的工具來安裝. 在 Help > Software Updates > Find and Install > Add Site :
http://download.eclipse.org/tools/pdt/updates
http://download.eclipse.org/tools/pdt/updates/2.0/



Step 02: 安裝 ZEND 的 Debugger:

裝完 PHP Development (PDT) 後, 還要裝 ZEND 的 Debugger
安裝的方法有二:

1. Open Eclipse and go to Help-> Software Updates-> Find and Install
Select "Search for new features to install" and click "Next"
Create a New Remote Site with the following details:

Name: PDT
URL: http://downloads.zend.com/pdt
Check the PDT box and click "Next" to start the installation

2. 若安裝不下來, 則可以到 Debugger 去下載壓縮檔 download the Zend Executable Debugger Eclipse Plug-in (Note: this plug-in is included in the all-in-one package). 解開後, 放在 eclipse 目錄下的相對路徑就可以.


Step 03: 設定 PDT 環境:
Window -> Preferences -> PHP -> Debug


Window -> Preferences -> PHP -> Executables


以上安裝完後, 建立一個 PHP Project 測試一下:
Step 01: 選 PHP Project


Step 02: Project 存放的目錄要放在 apache 的 Document Root 的地方


Step 03: 在撰寫 PHP 檔時, 它就會有 Coding 提示

2009年4月8日 星期三

[PHP] 取得運行的 OS 平台資訊

From: Polin Wei

PHP 提供三種方式來取得目前運行主機的 OS 平台資訊

1. PHP_OS
2. getenv('OS')
3. php_uname();

程式若為:
<?php
echo PHP_OS."<br>";
echo getenv('OS')."<br>";
echo php_uname()."<br>";
?>


以在 OS 為 windowns XP 的平台來說, 相對應的值為
1. echo PHP_OS; => WINNT
2. echo getenv('OS') => Windows_NT
3. php_uname(); => Windows NT polinwei 5.1 build 2600

以 OS 為 Linux : CentOS 的平台來說, 相對應的值為
1. echo PHP_OS; => Linux
2. echo getenv('OS') =>
3. php_uname(); => Linux polinwei.com 2.6.18-128.1.1.el5 #1 SMP Mon Jan 26 13:58:24 EST 2009 x86_64

2009年4月2日 星期四

[JAVA] Tag Interface 參數及方法說明

From: Polin Wei

所有的標籤 Tag 處理類別均是執行 Tag, IterationTag 或 BodyTag 介面之一的 Java 類別 (class) . 因為 Java 並不支援多重繼承, 因此, 如果現有的類別 (class) 已繼承自某個基礎類別, 就無法使其繼承自必要的標籤 Tag 處理基礎類別了(好像有點饒舌). 但 JSP 提供另一個更好的解決方法, 它仍舊可以只繼承單一基礎類別, 不過這些類別可以執行多個選擇的介面.

執行此介面的類別可以在起始標籤 public int doStartTag() throws JspException 和結束標籤 public int doEndTag() throws JspException 中執行自訂作業, 但不能控制主體內容.

在 doStartTag() 所傳回的值有:
public final static int EVAL_BODY_INCLUDE : 通知伺服器將主體內容放在 out 的資料流中
public final static int SKIP_BODY : 通知伺服器不要處理任何的主體內容

在 doEndTag() 所傳回的值有:
public final static int EVAL_PAGE : 通知伺服器繼續評估網頁
public final static int SKIP_PAGE : 通知伺服器不要處理網頁的其餘部份

方法:
public int doStartTag() : 如果傳回 SKIP_BODY 則直接呼叫 doEndTag() ; 如果傳回 EVAL_BODY , 則將主體內容放在 out 資料流中.

public int doEndTag() : 之前已呼叫過 doStartTag() , 主體內容可能已經處理過, 也可能沒有處理過, 如果傳回 SKIP_PAGE , 此網頁就不再作任何評估, 就此結束; 如果傳回 EVAL_PAGE, 網頁就會繼續評估.

public abstract void setPageContext() : 設定目前的 PageContext , 並在伺服器呼叫 doStartTag() 之前.

public abstract javax.servlet.jsp.tagext.Tag getParent() : 取得最近的標籤處理常式, 並封裝此標籤處理常式, 如果找不到就傳回 null

public abstract void setParent() : 此方法設定父階標籤處理常式, 會由 getParent() 傳回, 在 doStartTag() 之前呼叫, 因此視需要存取父階的標籤處理常式

再次看 Tag 的程式運作的流程圖, 應該就比較瞭解了

[MySQL] MySQL root的密碼忘了怎麼辦 ( How to recover MySQL root's Password on CentOS )

From: Polin Wei

step 01 : 停止 mysqld 的服務, 指令: service mysqld stop

[root@jsvr /]# service mysqld stop
Stopping MySQL: [ OK ]


若停不了. 可以先找到 mysqld 的 id , 然後再用 kill -9 mysqld-id 來停止

[root@jsvr /]# ps -ef | grep mysqld
root 20154 18807 0 02:43 pts/2 00:00:00 /bin/sh /usr/bin/mysqld_safe --skip-grant-tables

[root@jsvr /]# kill -9 20154
[1]+ Killed mysqld_safe --skip-grant-tables


step 02: 在「背景」模式執行 mysqld_safe,並跳過權限檢查, 指令: mysqld_safe --skip-grant-tables &

[root@jsvr /]# mysqld_safe --skip-grant-tables &
[1] 20154
[root@jsvr /]# Starting mysqld daemon with databases from /var/lib/mysql


step 03:以 root帳號登入,此時已經不會詢問密碼
[root@jsvr /]# mysql -u root mysql

step 04: 更換 root密碼,'new-password' 即是新密碼
mysql> update user set Password=PASSWORD('new-password') WHERE User='root';
mysql> update user set Password=PASSWORD('new-password') WHERE user='root';
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0


step 05: 寫入權限 flush privileges , 並離開 mysql
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye


step 06: 將mysqld_safe 的服務停掉, 指令: service mysqld stop ; 或將剛才放在背景執行的 mysqld_safe拿到前景,並用 ctrl+c 停止執行 , 若仍停不了, 則使出殺手鐗, 用 step01 的方法 kill -9 來停止 mysqld 的服務

[root@jsvr /]# fg
mysqld_safe --skip-grant-tables
[1]+ Stopped mysqld_safe --skip-grant-tables


step 07: 重新啟動 mysql服務, 指令: service mysqld start
[root@jsvr /]# service mysqld start
Starting MySQL: [ OK ]


這樣 root 的密碼就可以變更成新密碼了

2009年4月1日 星期三

[JAVA] Tag 自訂標籤第一支程式

From: Polin Wei

上一篇 [JAVA] Tag 自訂標籤簡介 大致介紹了 Tag 自訂標籤 的方便性, 及如何使用, 現在就來看如何撰寫 Tag 自訂標籤 及 如何在 JSP 網頁上, 使用自己撰寫的 Tag 標籤

Step1: 撰寫 Tag 的 Java 程式檔: jsDemoTag.java
package com.demos.tag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class jsDemoTag extends BodyTagSupport {

    
    @Override
    public int doEndTag() throws JspException {
        // TODO Auto-generated method stub
        try {
            StringBuffer sb = new StringBuffer();
            // 利用 pageContext Object 取得 JSP 網頁輸出資料流 .getOut() , 才能將產生的 Java Script 寫到客戶端
            JspWriter out = pageContext.getOut();

            // 利用 BodyContent Objext 及 getBodyContent() 函式取得資料
            BodyContent bodyContent = getBodyContent();

            if( bodyContent!=null ){
                String bodyMessage = bodyContent.getString();
                sb.append("<script language=\"javascript\"> \n  \n");
                sb.append("alert('"+ bodyMessage.trim() +"');");
                sb.append("  \n</script> \n");
               
                // 將資料寫回客戶端
                out.write(sb.toString());              
            }
           
        } catch (Exception e) {
            // TODO: handle exception
            System.err.print(e);
        }
        return EVAL_PAGE;
    }   
}



Step2: 建立標籤程式庫描述元 demo.tld , 並放在 WEB-INF 目錄下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_1.dtd" >
<taglib>
  <tlibversion>1.0</tlibversion>
  <jspversion>1.1</jspversion>
  <shortname>demo</shortname>  
  <info>Demo Customization Tag </info>
  <tag>
    <name>message</name>
    <tagclass>com.demos.tag.jsDemoTag</tagclass>
    <info>Display Alert Box</info>
  </tag>
</taglib>


tld檔中, 在<attribute> </attribute>中可設定 name, required, rtexprvalue 等三個屬性條件,<required>用來指定屬性是否一定要使用,若設定為true,則一定要使用指定的屬性,設定為false表示屬性為可選的(optional),<rtexprvalue>用來表示屬性指定時,是否可以使用表示式等動態屬性,例如 EL ${param.who}這樣的指定,如果設定為true表示可以,設定為false表示必須為靜態屬性。


Step3: 建立 JSP 網頁 HelloTag.jsp 來測試
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="uDemo"  uri="/WEB-INF/demo.tld"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Demo Customization Tag Library</title>
</head>
<body>
<uDemo:message>Hello Tag !! This is first Tag Library</uDemo:message>
</body>
</html>

[JAVA] Tag 自訂標籤簡介

From: Polin Wei

自定標籤 Tag 的優點:
使用預先建立的 Tag 標籤可以減少 Java 程式碼在前端開發所需要的時間, 進而加速網站開發, 重覆使用自訂標籤是縮短時間的最大幕後功臣.

Tag 自定標籤只能經由 JSP 網頁來使用, Tag 標籤處理常式和 JSP 網頁是彼此緊密結合的, 因此, 您得以存取 PageContext 物件, 就可以存取目前包含在 JSP 網頁中的相同資料. 所以, Tag 標籤可以存取任何從 session 資料到 request 物件裡的變數. 不過, 從 PageContext 物件得到最重要的一件事是存取 JSP 網頁的 out 物件, 我們需要此物件才能將內容寫回 JSP 網頁的輸出資料流.

使用自定標籤 Tag 的方法

只要兩個簡單的步驟就能使用標籤程式庫

Step1: 匯入標籤程式庫
匯入標籤程式庫只需使用 taglib 指令, 如
<%@ taglib uri="/WEB-INF/struts-layout.tld" prefix="layout"%>
uri : 是識別標籤程式庫的唯一名稱, 用來指定標籤程式庫描述元(Tag Library Descriptor , TLD) 的位置. 標籤程式庫描述元(Tag Library Descriptor , TLD) 實際上是索引檔案, 告訴 JSP 容器 Context 每個標籤 Tag 處理常式所在位置與使用對象. 也就是說. TLD 是 JSP 應用程式裡定義標籤程式庫的地方.

Step2: 從標籤程式庫中呼叫自訂標籤
在 Step1 中定義請求呼叫此標籤程式庫的方法 prefix="layout" , 並從 layout 標籤程式庫中請求 html 自訂標籤的功能
<layout:html>

</layout:html>


撰寫 Tag 程式(class) 繼承 TagSupport 與 BodyTagSupport的區別:
撰寫 Tag 的程式( class ), 若選擇繼承TagSupport的類別,那您所能決定的,就是要不要顯示標籤之間的文字,但沒有辦法對這段文字作任何的處理,如果您要對本體文字作處理,可以繼承BodyTagSupport類別。

大體上, Tag 的程式運作的流程如下圖

2009年3月18日 星期三

[JAVA] Filtering 過濾器的使用

From: Polin Wei

Servlet 2.3 規則中最重要的新特性- Filtering , 它相容於 Servlet 2.3 規格的 J2EE 容器(Context)間快速地成為最常被用到的增值特性.

過濾器 (Filtering) 可以在資源被取出前或取出後插手檢查, 以 HTTP 為主的 請求(Request) / 回應(Response) 的中間層伺服器來說, 過濾器 (Filtering) 可以用來:

1. 在請求(Request)的表頭到達資源手中前先看看其中的內容

2. 在請求(Request)的表頭被送達資源時看看其中的內容

3. 提供修改過的請求(Request)被容器(Context)所處理過的資源

4. 在回應(Response)被傳回前, 先行存取並修改

5. 在請求(Request)到逹資源前全部加以終止

過濾器 (Filtering) 為 javax.servlet.Filter 的介面類別, 這類別所該實作的部份有三個方法:

1. doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
這是 過濾器 (Filtering) 的主要方法, 幾乎所有 過濾器 (Filtering) 的工作都在此完成. 在這個方法中需呼叫 chain.doFilter(request, response) 這個方法, 以便將控制傳給下一個過濾器 ( Pass control on to the next filter )

2. init(FilterConfig fConfig)
在 doFilter() 方法被第一次呼叫前設定 FilterConfig 物件. FilterConfig 物件提供 過濾器 (Filtering) 的初始化參數, 並允許它存取相關的 ServletContext.

3. destroy()
當 過濾器 (Filtering) 被帶出服務前, 容器(Context)會呼叫 destroy()

上述所提的 FilterConfig 物件在 init(FilterConfig fConfig) 時會取得, 而 FilterConfig 可以被 過濾器 (Filtering) 用來取得這個 過濾器 (Filtering) 的初始化參數, 文字型名稱, 或正在執行的 ServletContext. 它主要有四個方法:

1. getFilterName()
取得 過濾器 (Filtering) 定義於配置描述檔 web.xml 中的文字型名稱.

2. getInitParameter(String paramName)
取得所指定的初始化參數的字串值. 找不到則回傳 null

3. getInitParameterNames()
取得一個 java.util.Enumeration , 其中含有所有這個實體中所具有的初始化參數的名稱. 這些參數都是在配置描述元 web.xml 中的 <filter> 定義中所指定的. 若無則回傳 null

4. getServletContext()
取得正在其中執行的 ServletConext . 這個內容通常是在伺服器上的 server.xml 檔中指定.

程式實作:

step 01: 先建立一個 LoggerFilter.java
package com.demos.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * Servlet Filter implementation class LoggerFilter
 */
public class LoggerFilter implements Filter {
    
    protected FilterConfig filterConfig = null;

    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
        this.filterConfig = null;
    }

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        if (filterConfig==null)
            return;

        long bef = System.currentTimeMillis();
        ServletContext context = filterConfig.getServletContext();
        context.log("in LoggerFilter Class");

        // Pass control on to the next filter
        chain.doFilter(request, response);
   
        long aft = System.currentTimeMillis();
        context.log("Request to " + request.getRemoteHost() + "Total time(ms): " + (aft - bef));

    }

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
        this.filterConfig = fConfig;
    }
}


step 02: 在 web.xml 上加入Filter的參數
<filter>
    <filter-name>loggerFilter</filter-name>
    <filter-class>com.demos.filter.LoggerFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>loggerFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>


<filter-mapping> 的樣式可以對 URL 或 servlet 來作 Filter:

<url-pattern>/*</url-pattern>
<servlet-name>action</servlet-name>



step 03: 在 console 中看的結果如下:
2009/3/18 下午 6:36:30 org.apache.catalina.core.ApplicationContext log
資訊: in LoggerFilter Class
2009/3/18 下午 6:36:31 org.apache.catalina.core.ApplicationContext log
資訊: Request to 127.0.0.1Total time(ms): 234


實際系統上運用 Filtering 可以讓系統在每一個網頁在載入時, 塞入編碼原則為 UTF-8 , 以避免網頁出現亂碼. 程式碼SetCharacterEncodingFilter.java如下:
/*
* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
 * @author Craig McClanahan
 * @version $Revision: 1.2 $ $Date: 2004/03/18 16:40:28 $
 */

package com.demos.filters;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class SetCharacterEncodingFilter implements Filter {


    // ----------------------------------------------------- Instance Variables


    /**
     * The default character encoding to set for requests that pass through
     * this filter.
     */
    protected String encoding = null;


    /**
     * The filter configuration object we are associated with.  If this value
     * is null, this filter instance is not currently configured.
     */
    protected FilterConfig filterConfig = null;


    /**
     * Should a character encoding specified by the client be ignored?
     */
    protected boolean ignore = true;


    // --------------------------------------------------------- Public Methods

    /**
     * Take this filter out of service.
     */
    public void destroy() {

        this.encoding = null;
        this.filterConfig = null;

    }


    /**
     * Select and set (if specified) the character encoding to be used to
     * interpret request parameters for this request.
     *
     * @param request The servlet request we are processing
     * @param result The servlet response we are creating
     * @param chain The filter chain we are processing
     *
     * @exception IOException if an input/output error occurs
     * @exception ServletException if a servlet error occurs
     */
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain)
    throws IOException, ServletException {

        // Conditionally select and set the character encoding to be used
        if (ignore || (request.getCharacterEncoding() == null)) {
            String encoding = selectEncoding(request);
            if (encoding != null)
                request.setCharacterEncoding(encoding);
        }
    // Pass control on to the next filter
        chain.doFilter(request, response);

    }

    /**
     * Place this filter into service.
     *
     * @param filterConfig The filter configuration object
     */
    public void init(FilterConfig filterConfig) throws ServletException {

    this.filterConfig = filterConfig;
        this.encoding = filterConfig.getInitParameter("encoding");
        String value = filterConfig.getInitParameter("ignore");
        if (value == null)
            this.ignore = true;
        else if (value.equalsIgnoreCase("true"))
            this.ignore = true;
        else if (value.equalsIgnoreCase("yes"))
            this.ignore = true;
        else
            this.ignore = false;

    }

    // ------------------------------------------------------ Protected Methods
    protected String selectEncoding(ServletRequest request) {
        return (this.encoding);
    }
}


而 web.xml 也要相對的加入
<filter>
    <filter-name>Set Character Encoding</filter-name>
    <filter-class>
        com.gu.filters.SetCharacterEncodingFilter
    </filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
    <init-param>
        <param-name>ignore</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>Set Character Encoding</filter-name>
    <servlet-name>action</servlet-name>
</filter-mapping>

2009年3月6日 星期五

[Java] 建立由 LDAP AD 認證的機制

From: Polin Wei

環境:
OS : Windows Server 2k3
Domain: mydomain.com
Host : x.x.x.x(此為指定 ip address)

以 Java 程式撰寫 對 LDAP-AD 的認證, 程式碼如下:

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.ModificationItem;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;
 /**
     * AD LDAP 登入認證
     *
     * @param ldap_url   like ldap://x.x.x.x:389/DC=mydomain,DC=com
     * @param account
     * @param password
     * @return String[0] array 0 :0 success,1 fail,2 LDAP connect fail,3 unknow
     */
    public String[] LDAP_AUTH_AD(String ldap_url, String account, String password) {
        String[] returnStr = new String[2];
        Hashtable<String, String> env = new Hashtable<String, String>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, ldap_url);
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, account+"@mydomain.com");
        env.put(Context.SECURITY_CREDENTIALS, password);

        LdapContext ctx = null;
        try {
            ctx = new InitialLdapContext(env, null);
            returnStr[0] = "0";
        } catch (javax.naming.AuthenticationException e) {
            returnStr[0] = "1";

            return returnStr;
        } catch (javax.naming.CommunicationException e) {
            // System.out.println("Can't connect to ldap server!");
            returnStr[0] = "2";

            return returnStr;
        } catch (Exception e) {
            System.out.println("error");
            e.printStackTrace();
            returnStr[0] = "3";

            return returnStr;
        } finally {
            if (ctx != null) {
                try {
                    ctx.close();
                } catch (NamingException e) {

                }
            }
        }
    }

2009年3月2日 星期一

資訊名詞簡寫速查

From: Polin Wei

資訊名詞簡寫 & 資訊名詞全名
---------------------------
BPM: Business Process Management (企業流程管理)
SOA: Service-Oriented Architecture (服務導向架構)
BPEL: Business Process Excution Language (企業流程執行語言)
BPMN: Business Process Modeling Notation (企業流程模型符號)
XPDL: XML-based Process Definition Language (以 XML 為基礎的程序定義語言)
BAM: Business Activity Monitor (商業活動監控)
UDDI: Universal Description Discovery and Integration (通用描述發現與整合)
WSDL: Web Services Description Language (全球資訊網路服務描述語言)
J2EE: Java 2 Platform Enterprise Edition (Java2 平台企業版)
PKI: Public Key Infrastructure (公開金鑰基礎建設)
EMBA: Executive Master of Business Administration (高階管理碩士班)
ROI: Return On Investment。 (投資報酬率),計算公式為:ROI = (1 + g) * n /PER。 簡介 其中,g代表企業未來n 年平均獲利成長率。PER表示本益比。
TCO: Total cost of ownership (總所有成本)

2009年2月25日 星期三

[JBoss] JBoss 建立 SSL 以便使用 HTTPS 登入

From: Polin Wei

什麼是 SSL ? 它就是 Secure Socket Layer 的縮寫 , 它是一種架構於 TCP 之上的安全通訊協定 , 它可以有效地協助 Internet 應用軟體提升通訊時的資料完整性以及安全性。

SSL ( Secure Socket Layer )是業界採用的加密通訊協定標準,可以安全地透過網路,傳輸使用者的個人或信用卡等資料,博客來也是使用此種技術,保障會員資料的安全。通常,必須使用 SSL 連接的網頁,其網址的開頭應該會是「https:」,而不是「http:」。因此只要在瀏覽器的網址欄看見開頭為「https:」時,就表示你目前是透過 SSL 連線。

那在 JBoss 如何建立呢? 作法如下:

開發環境:
作業系統 :windowsXP
JBoss : JBoss-4.0.3SP1
JDK: 1.6.x

Step 01: 生成KeyStore
在cmd執行keytool -genkey -alias tomcat -keyalg RSA -keystore chap8.keystore
PS: -validity 3650 這個參數可以讓憑證的有效期變延長, 以這個參數為例, 為 10 年

D:\>keytool -genkey -alias tomcat -keyalg RSA -keystore chap8.keystore
輸入 keystore 密碼:  12345
您的名字與姓氏為何?
  [Unknown]:  polin
您的編制單位名稱為何?
  [Unknown]:  wei
您的組織名稱為何?
  [Unknown]:  polinwei
您所在的城市或地區名稱為何?
  [Unknown]:  taichung
您所在的州及省份名稱為何?
  [Unknown]:  taichung
該單位的二字國碼為何
  [Unknown]:  tw
CN=polin, OU=wei, O=polinwei, L=taichung, ST=taichung, C=tw 正確嗎?
  [否]:  y
輸入 <tomcat> 的主密碼(RETURN 如果和 keystore 密碼相同):
說明:輸入的密碼不要帶特殊字元,否則在運行JBoss時可能會出錯。


Step02:
將產生的chap8.keystore放到 $JBOSS_HOME\server\default\conf下

Step03:
修改 $JBOSS_HOME\server\default\deploy\jbossweb-tomcat55.sar\server.xml
<!-- SSL/TLS Connector configuration using the admin devl guide keystore
      <Connector port="8443" address="${jboss.bind.address}"
           maxThreads="100" strategy="ms" maxHttpHeaderSize="8192"
           emptySessionPath="true"
           scheme="https" secure="true" clientAuth="false"
           keystoreFile="${jboss.server.home.dir}/conf/chap8.keystore"
           keystorePass="rmi+ssl" sslProtocol = "TLS" />
      -->
上面的<!-- -->  移除, 並修改紅色部份
      <Connector URIEncoding="UTF-8" port="443" address="${jboss.bind.address}"
           maxThreads="100" strategy="ms" maxHttpHeaderSize="8192"
           emptySessionPath="true"
           scheme="https" secure="true" clientAuth="false"
           keystoreFile="${jboss.server.home.dir}/conf/chap8.keystore"
           keystorePass="12345" sslProtocol = "TLS" />


Step04:
重新啟動Jboss,在流覽器位址欄中分別輸入http://localhost:8080,https://localhost:443 能夠正常訪問,再輸入https://localhost/也能正常流覽

參考文獻: JBoss Web - SSL Configuration HOW-TO

[Linux] CentOS - Apache server with SSL 的作法

From: Polin Wei

環境:
Cent OS 5.x
Apache 2.x
Domain: mydomain.com
Host: myssl.mydomain.com

Step 01:
# cd /etc/pki/tls/certs

Step 02: 建立金鑰, 要輸入相關的 國家,省份,城巿,主機名(country,state,city,host name)

[root@myssl certs]# make mycert.crt
umask 77 ; \
/usr/bin/openssl genrsa -des3 1024 > mycert.key
Generating RSA private key, 1024 bit long modulus
......................................................................++++++
...........++++++
e is 65537 (0x10001)
Enter pass phrase: **** <== 這裡要輸入金鑰的密碼
Verifying - Enter pass phrase: **** <== 重新輸入金鑰的密碼
umask 77 ; \
/usr/bin/openssl req -utf8 -new -key mycert.key -x509 -days 365 -out mycert.crt -set_serial 0
Enter pass phrase for mycert.key: **** <== 再輸入一次金鑰的密碼
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:tw
State or Province Name (full name) [Berkshire]:Taichung
Locality Name (eg, city) [Newbury]:Taichung
Organization Name (eg, company) [My Company Ltd]:MyCorp.
Organizational Unit Name (eg, section) []:WEI
Common Name (eg, your name or your server's hostname) []:myssl.mydomain.com
Email Address []:root@mydomain.com


這時, 會在 /etc/pki/tls/certs 產生兩個檔 mycert.crt & mycert.key

Step03:
移動 mycert.key 到 /etc/pki/tls/private
mv mycert.key /etc/pki/tls/private

Step04: 修改 /etc/httpd/conf.d/ssl.conf 檔案中的參數

SSLCertificateFile /etc/pki/tls/certs/mycert.crt
SSLCertificateKeyFile /etc/pki/tls/private/mycert.key


Step05: 重新啟動 httpd 服務,
[root@myssl certs]# service httpd start
Starting httpd: Apache/2.2.3 mod_ssl/2.2.3 (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phrases.

Server svn.globeunion.com:443 (RSA)
Enter pass phrase: *** <== 這裡要輸入金鑰的密碼

OK: Pass Phrase Dialog successful.
[ OK ]



Step06: 檢查 ssl 是否有在運作
netstat -an|grep 443

每次啟動 httpd 時, 都會詢問您的 金鑰的密碼 , 若要讓 httpd 不要每次詢問的話可以這麼作

[root@myssl tls]# openssl rsa -in mycert.key -out mycert.pem
Enter pass phrase for private/svncert.key: <== 輸入您的 金鑰的密碼
writing RSA key <== 完成


這樣會產生一個 mycert.pem 的檔案.
[root@myssl tls]# cp mycert.pem /etc/pki/tls/private/


Step07: 修改 /etc/httpd/conf.d/ssl.conf 檔案中的參數

SSLCertificateFile /etc/pki/tls/certs/mycert.crt
SSLCertificateKeyFile /etc/pki/tls/private/mycert.pem


這樣每次重開 httpd 就不會要您輸入 金鑰的密碼
[root@myssl tls]# service httpd restart


另外一種產生 SSL 方法如下:

1. go to /etc/pki/tls/certs
2. make mycert.pem
3. Enter the information about country,state,city,host name etc, your certificate and key has been created .
4. now go to /etc/httpd/conf.d/ssl.conf and change..
SSLCACertificateFile /etc/pki/tls/certs/mycert.pem
SSLCACertificateKeyFile /etc/pki/tls/mycert.pem
5. save changes.
6. on shell prompt service httpd start

2009年2月24日 星期二

[Blogger] 部落格上的相關文章

From: Polin Wei

三個步驟, 讓您的 Blogger 的每一篇文章被點閱時, 可以顯示與這篇文章相關 標籤(Label) 的文章

step 01:

首先在 版面配置->修改 HTML 中的 </head> 標籤前,塞入以下這段 Javascript ():

<script type='text/javascript'>

//<![CDATA[

<!-- Script functions for Related Posts: RelatedLabels(), RemoveDuplicatedPosts(), contains(), ShowRelatedPosts()-->

var relatedPostsNum = 0;

var relatedTitles = new Array();

var relatedUrls = new Array();

var relatedDates = new Array();



function RelatedLabels(json) {

  var regex1=/</g, regex2=/>/g;

  for (var i = 0; i < json.feed.entry.length; i++) {

    var entry = json.feed.entry[i];

    relatedTitles[relatedPostsNum] = (entry.title.$t.replace(regex1, '&lt;')).replace(regex2, '&gt;');

    relatedDates[relatedPostsNum] = entry.published.$t.substr(0,10);

    for (var j = 0; j < entry.link.length; j++) {

      if (entry.link[j].rel == 'alternate') {

        relatedUrls[relatedPostsNum] = entry.link[j].href;

        relatedPostsNum++;

        break;

      }

    }

  }

}



function RemoveDuplicatedPosts(PostUrl) {

  var tmpUrls = new Array(0);

  var tmpTitles = new Array(0);

  var tmpDates = new Array(0);

  function contains(a, e) {

    for(var j = 0; j < a.length; j++)

      if (a[j]==e)

        return true;

    return false;

  }

  for(var i = 0; i < relatedUrls.length; i++) {

    if(!contains(tmpUrls, relatedUrls[i]) && PostUrl != relatedUrls[i]) {

      tmpUrls.length += 1;

      tmpUrls[tmpUrls.length - 1] = relatedUrls[i];

      tmpTitles.length += 1;

      tmpTitles[tmpTitles.length - 1] = relatedTitles[i];

      tmpDates.length += 1;

      tmpDates[tmpDates.length - 1] = relatedDates[i];

    }

  }

  relatedTitles = tmpTitles;

  relatedUrls = tmpUrls;

  relatedDates = tmpDates;

}



function ShowRelatedPosts(PostUrl) {

  RemoveDuplicatedPosts(PostUrl);

  var r = Math.floor((relatedTitles.length - 1) * Math.random());

  var i = 0;

  if (relatedTitles.length > 0) {

    document.write('Related Posts: <ul>');

    while (i < relatedTitles.length && i < 5) {

      document.write('<li><a href="' + relatedUrls[r] + '">' + relatedTitles[r] + '</a> - ' + relatedDates[r] + '</li>');

      if (r < relatedTitles.length - 1)

        r++;

      else

        r = 0;

      i++;

    }

    document.write('</ul>');

  }

}

//]]>

</script>


函示裡紅字的部分,是用來控制相關文章的數量,這裡用五篇

Step02:

找到下面這段程式段(在文章內容後面顯示分類標籤的程式):
<b:if cond='data:post.labels'>

<data:postLabelsLabel/>

<b:loop values='data:post.labels' var='label'>

<a expr:href='data:label.url' rel='tag'><data:label.name/></a><b:if cond='data:label.isLast != "true"'>,</b:if>

</b:loop>

</b:if>


在迴圈結束 </b:loop> 前面塞入呼叫收集相關文章的函示,像下面這樣:
<b:if cond='data:post.labels'>

<data:postLabelsLabel/>

<b:loop values='data:post.labels' var='label'>

<a expr:href='data:label.url' rel='tag'><data:label.name/></a><b:if cond='data:label.isLast != "true"'>,</b:if>

    <!-- Fixed for Related Posts -->

    <b:if cond='data:blog.pageType == "item"'>

       <script expr:src='"/feeds/posts/default/-/" + data:label.name + "?alt=json-in-script&amp;callback=RelatedLabels&amp;max-results=10"' type='text/javascript'/>

</b:if>

</b:loop>

</b:if>


紅色的部分也是用來限制數量,數字加大,可以增加相關文章的亂數樣本,也就是相關文章可以顯示越多舊的相關文章。

Step 03:
抓完文章當然就是找地方顯示囉!只有一個限制:一定放要在文章分類標籤那段的後面(上面這段 標籤的後面就可以,位置依自己的樣版外觀調整)這部分呼叫顯示相關文章的程式碼如下:
<!-- Fixed for Related Posts -->

<b:if cond='data:blog.pageType == "item"'>

  <script type='text/javascript'>

    ShowRelatedPosts(&#39;<data:post.url/>&#39;);

  </script>

</b:if>



if cond='data:blog.pageType == "item"' 這個判斷句代表: 當目前所在頁面是特定文章的連結內頁才會發生,所以上述的顯示相關文章效果,在首頁是看不到的,要隨便點入一篇文章的內頁連結(當然,那篇文章要有加註標籤被分類過),在顯示標籤的後面才會跑出來。

參考文獻: Abin's Tech Note 加入相關文章功能 (Related Post)

2009年2月19日 星期四

[Blogger] 部落格上的隨選文章

From: Polin Wei

部落格上的隨選文章, 可以使用 B Stir 來讓網友繼續讀取其它的文章.



標籤說明:
Blog URL-你的Blog網址
Keyword-顯示文章的關鍵字(建議不選)
Snippets-是否顯示全文
Border-邊框
Results顯示文章篇數(1至5篇)
Background-背景顏色
Dynamic Widget-只顯示一則隨機文章。
Static Widget-顯示所有的隨機文章,文章數量就是在Results設定的。

按下 Advanced 後, 可以將這個 widget 安裝在 Blogger , facebook , widgetbox 這三個部落格中, 若您的部落格不是以上三種, 也可以將下列的程式碼複制在您的網頁中. 下列的程式碼是以 我與小崴崴的工作日記 為例

<script language='Javascript' src='http://stuffablog.com/bstir/service?blogurl=http://polinwei.blogspot.com/&output=html&results=5&border=1&snippets=no&encoding=UTF-8&keywords=' type='text/javascript'> </script>

2009年2月12日 星期四

[Blogger] Google Calendar 嵌入式日曆

From: Polin Wei

在網頁上要嵌入日曆, 使用 Google Calendar 快速建立, 可以讓您方便記錄您的工作外, 還可以與別人分享. 作法如下:

step 1:
先申請一個 Google 的帳號, 然後進入 Google Calendar

step 2:
可以建一個新的日曆 Calendar , 或用預設的也可以


step 3:
將框框內的 HTML 語法 Copy 到您的網頁內即可


step 4:
可以設定是否要公開您的日曆


step 5:
若您不公開時, 別人到您的網站 就看不到任何記事了.

2009年2月11日 星期三

[dotProject] dotProject 與 AD 使用 LDAP 的帳號整合

From: Polin Wei

dotProject 運作的環境:
OS: Cent OS 4.x
GD: 2.0.33-9.4
WEB: Apache HTTP Server 2.2.3-22
PHP: 5.1.6-23
MySQL: 5.0.45-7
dotProject: dotProject_2.1_RC2_20070529_UTF-8_Chinese_by_Markwu.zip (目前穩定的版本)
下載點1(備用網站): dotProject_2.1_RC2_20070529_UTF-8_Chinese_by_Markwu.zip
下載點2(官方網站): dotProject_2.1_RC2_20070529_UTF-8_Chinese_by_Markwu.zip

LDAP 認證的環境:
OS: Windows Server 2k3 SP2
Domain: mydomain.com
Host: ad.mydomain.com
LDAP Search User: dotprojecter ( 此 User 放在 Windows Server 2k3 AD 內定的 Users 目錄CN下)

安裝的文章可以參考 使用 DotProject 架設 Project Server,整合 AD 2003 帳號(適用 CentOS 4) 但此篇文章中有一些設定上的錯誤. 修正如下:

1. 點選「System Admin / System Configuration」。

2. 在「User Authentication Settings」中參考下列參數:
   User Authentication Method:LDAP
   Postnuke login also allows Standard Login:打勾

3. 在「LDAP Settings」中參考下列參數:
   LDAP Host:ad.mydomain.com <- AD Server
   LDAP Port:389
   LDAP Version:3
   LDAP Base DN:dc=mydomain,dc=com <- 這裡只要輸入 Domain Name 即可
   LDAP User Filter:(sAMAccountName=%USERNAME%)
   LDAP Search User:cn=dotprojecter,cn=Users,dc=mydomain,dc=com <- 搜尋用的帳號,需使用完整的 DN , 注意預設的 Users , 是 cn , 不是 ou
   LDAP Search User Password:*******
   LDAP also allows standard login:打勾
   點選「Save」儲存。

這樣就可以了

2009年2月8日 星期日

網頁顯示 MSN 的狀態並讓訪客與您對談

From: Polin

  在您的部落格上顯示您的 MSN 狀況,可以用來進行個人溝通、商業交流或提供線上即時客戶服務。讓個人網頁或部落格的瀏覽者、郵件服務的收件者、或電子商務及企業網頁的造訪者,能夠找到與你進行即時通訊溝通的方式,同時能保有雙方的帳號隱私。這樣的運用似乎是不錯的商業模式,重點是它還不用任何費用。

依下列幾個步驟就可以達成:



step01:


先申請好一個 MSN Messager 的帳號,再登入 http://settings.messenger.live.com/applications/websettings.aspx

step02:





將此頁下方的程式碼 copy 到你的網頁上




step03:

訪客只要在您的網頁上按 開始對話


step04:
輸入訪客的暱稱, 如訪客


step05:
為了安全, 系統會要求訪客輸入亂碼的值.



step06:
這樣就可以開始與版主對話了


2009年2月5日 星期四

[Hyperion] 設定 Hyperion 與 Microsoft AD 認證整合 Integrate Oracle Internet Directory With AD

From: Polin Wei

上一篇 [Hyperion] Windows Server 2k3 + Oracle XE + Hyperion 9.3.1 安裝步驟 作好後, 登入到 Essbase Server 時, 就會牽涉到權限認證的問題. 所以該如何與 AD 作好整合認證就顯得重要了.

要與 AD 的帳號作整合認證的作法如下:
環境:
OS: windows 2k3
Host Name: ad.mydomain.com
AD Domain: mydomain.com
LDAP 認證帳號為 AD 的 administrator
Hyperion Essbase 9.3.1


step 01: 進入 User Management Console 的界面
http://localhost:58080/interop/
帳號/密碼 為預設的 admin/password



step 02: Configure User Directories


加入一筆 LDAP 記錄


選擇 Microsoft Active Directory (MSAD)


依環境提供的值填入, 下圖中的 Base DN 只要填入AD伺服器中的網域(Domain Name)名即可, 如
mydomain.com , 在 AD 的識別為 cn=myadmin,cn=com



登入系統所需認證的相關資訊, 可以先輸入 cn=administrator 然後按 Go , 系統會自動帶出 AD 裡的參數值


Enable Support Group 啟動支援群組, 這樣會比較彈性


step03: 讓 AD 加入系統認證的行列中



step04: 作好以上設定後, 要重啟 HSS (Hyperion S9 Shared Services) 服務, 這樣就可以了






參考文獻
Configuring Oracle Internet Directory, MSAD, and Other LDAP-Enabled User Directories