September 2, 2006
Ubuntu 開機時啟動程式
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();
}
}
}
偵測上一個網頁來源
不過,不確定所有的瀏覽器都會送出這個 header;
另外,像 flashget 這些 web client application 會有像 "參照頁" 這樣的設定,可以用來欺騙 web server。
Semantic Web (語意網)
語意網最終的目標: 讓機器可以瞭解文章的意思,處理資料更方便快速
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) | 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
STL 介紹
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-
解壓縮此檔案,並放至任何喜歡的地方,我是放到 C:SDL-
在Dev C++中選擇 Compiler Options -> Directories -> Libraries
在 Libraries中加一個目錄 C:SDL-
在Dev C++中選擇 Compiler Options -> Directories -> C++ Include
在 C++ Include中加入一個目錄 C:SDL-
最重要的一點:
在專案中選 Project Options -> Parameters -> Linker 中加入
在Linker中加入 C:/SDL-
完成上述設定即可使用 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;
}

![Syndicate RSS feed [Syndicate this site]](http://pics.blog.yam.com/images/rss2.gif)
![Syndicate ATOM feed [Syndicate this site]](http://pics.blog.yam.com/images/atom.gif)
