廣告聯播

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 的程式運作的流程如下圖