September 2, 2006

Ubuntu 開機時啟動程式

    Ubuntu 中並沒法執行 /etc/rc.local 及 /etc/init.d/rc.local 因此必需自己以 update-rc.d 來讓某個 script 檔在啟動 Linux 時會自動執行

sudo update-rc.d -f myservice start 99 2 3 4 5 .

myservice 是要啟動時執行的檔案
start 是啟動時執行, 另有 stop 則是關機時執行
99 則是優先權  0~99 ,0是最優先
2 3 4 5 則是 run level


另外在 myservice 檔中使用 export JAVA_HOME=/usr/local/java 在登入時你會看不到,echo $JAVA_HOME 是空白的,似乎是系統把變數給清除掉了,但這支script確實是有在執行的。




...繼續閱讀

August 6, 2006

在 Windows 上編譯 FFmpeg

 FFmpeg 是一套用來編碼和編碼的函式庫,支援的編碼種類相當齊全,不過仍是有少部份編碼不支援。

要在 Windows 上編譯 FFmpeg 原始碼首先必須要先安裝好 MinGW,請自行尋找如何安裝 MinGW,網路上有相當多的訊息。

從它的SVN 上下載 FFmpeg 的原始碼,建議使用TortoisSVN來下載,這是一個在 Windows 上的 SVN Client 工具, FFmpeg 的 svn 位置為:svn://svn.mplayerhq.hu/ffmpeg/trunk

checkout 完成後,開啟 msys ,進入 cd /c/FFmpeg 中,輸入
./configure --enable-memalign-hack ,這個 --enable-memalign-hack 是在 win32 平台下一定要給予的編譯參數,如果沒加的話編譯出來的dll是無法使用的,會發生記憶體位置錯誤。
configure 還有一些重要的參數,只要開啟 configure 這個檔案即可看得參數及其說明。比較重要的有:

--enable-shared  //這個是建立 dll 檔來讓其他程式動態連結使用
--disable-static   //則是靜態連結,把程式直接編譯到 ffplayer 和 ffserver 上。

make

make install



August 1, 2006

某段日期時間轉換成日期

需求:將 2006-07-21 07:30:00 到隔天 2006-07-22 07:30:00的日期 (不包含 2006-07-22 07:30:00) 變成 2006-07-21

(date >= 2006-07-21 07:30:00 && date < 2006-07-21 07:30:00 ) 變成 2006-07-21

程式碼:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateConverter {
 private Calendar calendar;
 private DateFormat df;
 
 public DateConverter(){
  calendar = Calendar.getInstance();
  df = new SimpleDateFormat("yyyy-MM-dd");
 }
 
 /*
  * 預設一天期間是 07:30:00.000 到隔天 07:29:59.1000
  */
 public String datetimeToDate(Date dateToConvert){
  return datetimeToDate(dateToConvert, 07, 30, 00);
 }
 
 /*
  * 將 2006-07-21 07:30:00 到隔天 2006-07-22 07:30:00的日期 (不包含 2006-07-22 07:30:00) 變成 2006-07-21
  *
  * (date >= 2006-07-21 07:30:00 && date < 2006-07-21 07:30:00 ) 變成 2006-07-21
  */
 public String datetimeToDate(Date dateToConvert, int hh, int mm, int ss){
  calendar.setTime(dateToConvert);
  long time = calendar.getTimeInMillis();
  
  calendar.set(Calendar.HOUR_OF_DAY, hh);
  calendar.set(Calendar.MINUTE, mm);
  calendar.set(Calendar.SECOND, ss);
  calendar.set(Calendar.MILLISECOND, 0);
  long basis = calendar.getTimeInMillis();
  
  if(time < basis){
   calendar.add(Calendar.DATE, -1);
  }

  String strDate = df.format(calendar.getTime());
  return strDate;
 }
}



July 30, 2006

網頁內容壓縮

大部分的瀏覽器都有支援Gzip的壓縮格式,因此在將內容傳給Client時可以先把內容以Gzip的方式壓縮來結省傳輸量,
如果您是租用虛擬主機的話,主機商大部份都是以傳輸流量來計費的,若您的網站在一個月內超過1G或其他規定的限制量
就需要多繳額外的費用了,因此這隻程式可以幫您多省一些頻寬。

如果大部分都文字的網頁經過Gzip壓縮,檔案大小可以壓到到原本的20%。



package com.jsptw.filter;
import java.io.*;
import java.util.zip.GZIPOutputStream;
import javax.servlet.*;
import javax.servlet.http.*;
public class GZIPEncodeFilter implements Filter {
public void init(FilterConfig filterConfig) {}
public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
String transferEncoding = getGZIPEncoding((HttpServletRequest)request);
if (transferEncoding == null)
{
chain.doFilter(request, response);
}
else
{
((HttpServletResponse)response).setHeader("Content-Encoding", transferEncoding);
GZIPEncodableResponse wrappedResponse = new GZIPEncodableResponse((HttpServletResponse)response);
chain.doFilter(request, wrappedResponse);
wrappedResponse.flush();
}
}
public void destroy() {}
private static String getGZIPEncoding(HttpServletRequest request) {
String acceptEncoding = request.getHeader("Accept-Encoding");
if (acceptEncoding == null)
return null;
acceptEncoding = acceptEncoding.toLowerCase();
if (acceptEncoding.indexOf("x-gzip") >= 0)
{
return "x-gzip";
}
if (acceptEncoding.indexOf("gzip") >= 0)
{
return "gzip";
}
return null;
}

private class GZIPEncodableResponse extends HttpServletResponseWrapper {
private GZIPServletStream wrappedOut;
public GZIPEncodableResponse(HttpServletResponse response) throws IOException {
super(response);
wrappedOut = new GZIPServletStream(response.getOutputStream());
}
public ServletOutputStream getOutputStream() throws IOException {
return wrappedOut;
}
private PrintWriter wrappedWriter;
public PrintWriter getWriter() throws IOException {
if (wrappedWriter == null) {
wrappedWriter = new PrintWriter( new OutputStreamWriter( getOutputStream(), getCharacterEncoding())); }
return wrappedWriter;
}
public void flush() throws IOException {
if (wrappedWriter != null) {
wrappedWriter.flush();
}
wrappedOut.finish();
}
}

private class GZIPServletStream extends ServletOutputStream {
private GZIPOutputStream outputStream;
public GZIPServletStream(OutputStream source) throws IOException {
outputStream = new GZIPOutputStream(source);
}
public void finish() throws IOException {
OutputStream.finish();
}
public void write(byte[] buf) throws IOException {
outputStream.write(buf);
}
public void write(byte[] buf, int off, int len) throws IOException {
outputStream.write(buf, off, len);
}
public void write(int c) throws IOException {
outputStream.write(c);
}
public void flush() throws IOException {
outputStream.flush();
}
public void close() throws IOException {
outputStream.close();
}
}
}


偵測上一個網頁來源

request.getHeader("Referer"),
不過,不確定所有的瀏覽器都會送出這個 header;
另外,像 flashget 這些 web client application 會有像 "參照頁" 這樣的設定,可以用來欺騙 web server。

用來產生報表的 OpenSource Project

Semantic Web (語意網)

將路上的資訊予以分類,並給予用來描述資訊本身含意的metadata讓資訊可以含有Self-describing的功能,使Agent可以自動化地處理資訊。

語意網最終的目標: 讓機器可以瞭解文章的意思,處理資料更方便快速
1.資料的網路(Web of data):提供一個共同的資料描述框架來促進網路資源間的整合
2.藉由連結到資訊本身的定義以及背景,來增加資訊使用的頻率。
3.更有效的資訊存取與分析

為了達成物件或詞彙的metadata的註解(annotation),Ontology、RDF/RDFS就是用來描述資料的技術。

PostgreSQL 中的字串操作

以下是個人比較常使用到的字串操作,更多的字串操作方式請參考String Functions and Operators

說明範例結果
字串相加'Post' || 'greSQL'PostgreSQL
計算字元個數char_length('jose')回傳4

全部字元轉成小寫
全部字元轉成大寫

lower('TOM')
upper('tom')
tom
TOM
取出子字串

substr('Thomas',2,3)
//2是從第2個字元開始

//3是取出3個字元

hom

   

 



Ruby 是一個 Strong Type 和 Dynamic Type 的語言

Strong Type :
3 + " is a number."
這行會出錯,因為 Ruby 是一個 Strong Type 的語言,因此無法將 Fixnum 和 String 物件轉型
因此無法相加。

i = 3
i = " is a number."

i = 3 時,i 會變成 Fixnum 型別
i = " is a number." 時,i 又會變成 String 型別
型別是用物件來判斷的,而不是變數本身,這就是 Dynamic Type ,變數不用宣告型別,而是在執行時期根據指定的物件來判斷型別。



July 29, 2006

IT 資訊網

C++ 相關資源

C/C++ Reference : 標準函式庫查詢



STL 介紹

STL 全名為 C++ Standard Template Library , 在 Java 中類似的東西為 Collection。

在 SGI 中下載的 STL 僅為 header file,並沒有實作,以下為 STL 的實作版本:

STLport :

STDCXX :



July 19, 2006

SDL 簡介

SDL (Simple Directmedia Layer)

SDL 是一個跨平台的多媒體函式庫,提供音效、鍵盤、滑鼠、搖桿、3D硬體(以OpenGL)、2D video framebuffer的低階存取,SDL結合OpenGL即可用來開發跨平台的遊戲,而DirectX則只能在Windows平台上跑,且DirectX每次改版變動都很大。



在Dev C++中使用SDL

下載 SDL for MinGW for Developer 版本,檔名會因版本而不同SDL-devel-1.2.11-mingw32.tar.gz

解壓縮此檔案,並放至任何喜歡的地方,我是放到 C:SDL-1.2.11

Dev C++中選擇 Compiler Options -> Directories -> Libraries

Libraries中加一個目錄 C:SDL-1.2.11lib

Dev C++中選擇 Compiler Options -> Directories -> C++ Include
C++ Include中加入一個目錄 C:SDL-1.2.11lib

最重要的一點:
在專案中選 Project Options -> Parameters -> Linker 中加入
Linker中加入 C:/SDL-1.2.11/bin/SDL.dll

完成上述設定即可使用 SDL

測試程式碼:若可正常編譯並且執行表示設定沒問題

 

#include "SDL.h"

int main(int argc, char *argv[])

{

    printf("nHello SDL User!n");

    /* initialize SDL */

    if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )

    {

         fprintf( stderr, "Video initialization failed: %sn",

         SDL_GetError( ) );

         SDL_Quit( );

     }

       

     SDL_Quit( );

     return EXIT_SUCCESS;

}



June 24, 2006

June 23, 2006

test

test