#
摘要: 一、簡介
JUnit是一款由Erich Gamma(《設計模式》的作者)和Kent Beck(極限編程的提出者)編寫的開源的回歸測試框架,供Java編碼人員做單元測試之用。當前版本4.1,可以從www.junit.org網站上獲得。與早期的JUnit 3相比,JUnit 4.1依賴于Java 5.0的新特性,因此無法兼容于jdk 1.4,可以說是一...
閱讀全文
public static String getFileCreateDate(File _file){
File file=_file;
try{
Process ls_proc = Runtime.getRuntime().exec("cmd.exe /c dir " + file.getAbsolutePath() + " /tc");
DataInputStream in = new DataInputStream(ls_proc.getInputStream());
for (int i = 0; i < 5; i++ )
{
in.readLine();
}
String stuff = in.readLine();
StringTokenizer st = new StringTokenizer(stuff);
String dateC = st.nextToken();
String time=st.nextToken();
in.close();
return dateC;
}catch (Exception e){
return null;
}
}
在jdk中,File的操作并沒有取得文件創建時間的方法。唯一提供提供的方法是
lastModified()返回long值。犧牲創建時間的方法實在是為了滿足跨平臺的需要。但在windows環境中,需要取得文件創建時間的情況是存在的。
實現的辦法是通過windows本地命令行來取得創建日期。以上代碼主要取自http://forum.java.sun.com/thread.jspa?threadID=311281&messageID=1247450
但此文提供的原始代碼尚有不足,無法解析帶有空格的文件夾名,如:C:\\Program files\等,解決辦法是在路徑前后加上",執行語句變為
"cmd.exe /c dir "" + file.getAbsolutePath() + "" /tc"。以上方法返回的是我實際程序需要的數據格式,大家有興趣可以自行改編
typedef是c/c++代碼中經常用到的一個關鍵字. 他的主要做用是給變量類型定義一個別名.
從而達到代碼簡化, 促進跨平臺開發的目的.
下面是typedef的最經常的用法:
typedef struct{
int a;
int b;
}MY_TYPE;
這里把一個未命名結構直接取了一個叫MY_TYPE的別名, 這樣如果你想定義結構的實例的時候就可以這樣:
MY_TYPE tmp;
這是typedef的第一種用法. 比較簡單. 就是 typedef 原變量類型 別名
相似的例子:
typedef unsigned long DWORD; 無符號長型
typedef void far *LPVOID; //void far *是原變量類型, 表示一個void 型指針(far 在32位系統里面已經沒有意義了)
等等
typedef還有第二種用法. 可能這種用法初學者沒有接觸過.
比如:
typedef int (*MYFUN)(int, int);
這種用法一般用在給函數定義別名的時候.(其實質還是和上面的用法一樣的)
上面的例子定義MYFUN 是一個函數指針, 函數類型是帶兩個int 參數, 返回一個int
在分析這種形式的定義的時候可以用下面的方法:
先去掉typedef 和別名, 剩下的就是原變量的類型.
比如上面的例子:
去掉typedef和MYFUN以后就剩:
int (*)(int, int)
讀了我前面一課里面討論的 <<細說如何確定一個變量的類型>>的朋友應該很容易就得出這個類型指的時是
一個函數指針, 函數類型是帶兩個int 參數, 返回一個int
If your tarball is compressed with bzip2, run
$
tar xvjf linux-x.y.z.tar.bz2
If it is compressed with GNU zip, run
$ tar xvzf linux-x.y.z.tar.gz
C語言宏定義技巧(轉)
寫好C語言,漂亮的宏定義很重要,使用宏定義可以防止出錯,提高可移植性,可讀性,方便性 等等。下面列舉一些成熟軟件中常用得宏定義。。。。。。
1,防止一個頭文件被重復包含
#ifndef COMDEF_H
#define COMDEF_H
//頭文件內容
#endif
2,重新定義一些類型,防止由于各種平臺和編譯器的不同,而產生的類型字節數差異,方便移植。
typedef unsigned char boolean; /* Boolean value type. */
typedef unsigned long int uint32; /* Unsigned 32 bit value */
typedef unsigned short uint16; /* Unsigned 16 bit value */
typedef unsigned char uint8; /* Unsigned 8 bit value */
typedef signed long int int32; /* Signed 32 bit value */
typedef signed short int16; /* Signed 16 bit value */
typedef signed char int8; /* Signed 8 bit value */
//下面的不建議使用
typedef unsigned char byte; /* Unsigned 8 bit value type. */
typedef unsigned short word; /* Unsinged 16 bit value type. */
typedef unsigned long dword; /* Unsigned 32 bit value type. */
typedef unsigned char uint1; /* Unsigned 8 bit value type. */
typedef unsigned short uint2; /* Unsigned 16 bit value type. */
typedef unsigned long uint4; /* Unsigned 32 bit value type. */
typedef signed char int1; /* Signed 8 bit value type. */
typedef signed short int2; /* Signed 16 bit value type. */
typedef long int int4; /* Signed 32 bit value type. */
typedef signed long sint31; /* Signed 32 bit value */
typedef signed short sint15; /* Signed 16 bit value */
typedef signed char sint7; /* Signed 8 bit value */
3,得到指定地址上的一個字節或字
#define MEM_B( x ) ( *( (byte *) (x) ) )
#define MEM_W( x ) ( *( (word *) (x) ) )
4,求最大值和最小值
#define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )
#define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )
5,得到一個field在結構體(struct)中的偏移量
#define FPOS( type, field ) \
/*lint -e545 */ ( (dword) &(( type *) 0)-> field ) /*lint +e545 */
6,得到一個結構體中field所占用的字節數
#define FSIZ( type, field ) sizeof( ((type *) 0)->field )
7,按照LSB格式把兩個字節轉化為一個Word
#define FLIPW( ray ) ( (((word) (ray)[0]) * 256) + (ray)[1] )
8,按照LSB格式把一個Word轉化為兩個字節
#define FLOPW( ray, val ) \
(ray)[0] = ((val) / 256); \
(ray)[1] = ((val) & 0xFF)
9,得到一個變量的地址(word寬度)
#define B_PTR( var ) ( (byte *) (void *) &(var) )
#define W_PTR( var ) ( (word *) (void *) &(var) )
10,得到一個字的高位和低位字節
#define WORD_LO(xxx) ((byte) ((word)(xxx) & 255))
#define WORD_HI(xxx) ((byte) ((word)(xxx) >> 8))
11,返回一個比X大的最接近的8的倍數
#define RND8( x ) ((((x) + 7) / 8 ) * 8 )
12,將一個字母轉換為大寫
#define UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )
13,判斷字符是不是10進值的數字
#define DECCHK( c ) ((c) >= '0' && (c) <= '9')
14,判斷字符是不是16進值的數字
#define HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||\
((c) >= 'A' && (c) <= 'F') ||\
((c) >= 'a' && (c) <= 'f') )
15,防止溢出的一個方法
#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))
16,返回數組元素的個數
#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )
17,返回一個無符號數n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)
#define MOD_BY_POWER_OF_TWO( val, mod_by ) \
( (dword)(val) & (dword)((mod_by)-1) )
18,對于IO空間映射在存儲空間的結構,輸入輸出處理
#define inp(port) (*((volatile byte *) (port)))
#define inpw(port) (*((volatile word *) (port)))
#define inpdw(port) (*((volatile dword *)(port)))
#define outp(port, val) (*((volatile byte *) (port)) = ((byte) (val)))
#define outpw(port, val) (*((volatile word *) (port)) = ((word) (val)))
#define outpdw(port, val) (*((volatile dword *) (port)) = ((dword) (val)))
[2005-9-9添加]
19,使用一些宏跟蹤調試
A N S I標準說明了五個預定義的宏名。它們是:
_ L I N E _
_ F I L E _
_ D A T E _
_ T I M E _
_ S T D C _
如果編譯不是標準的,則可能僅支持以上宏名中的幾個,或根本不支持。記住編譯程序
也許還提供其它預定義的宏名。
_ L I N E _及_ F I L E _宏指令在有關# l i n e的部分中已討論,這里討論其余的宏名。
_ D AT E _宏指令含有形式為月/日/年的串,表示源文件被翻譯到代碼時的日期。
源代碼翻譯到目標代碼的時間作為串包含在_ T I M E _中。串形式為時:分:秒。
如果實現是標準的,則宏_ S T D C _含有十進制常量1。如果它含有任何其它數,則實現是
非標準的。
可以定義宏,例如:
當定義了_DEBUG,輸出數據信息和所在文件所在行
#ifdef _DEBUG
#define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%d”,date,_LINE_,_FILE_)
#else
#define DEBUGMSG(msg,date)
#endif
20,宏定義防止使用是錯誤
用小括號包含。
例如:#define ADD(a,b) (a+b)
用do{}while(0)語句包含多語句防止錯誤
例如:#difne DO(a,b) a+b;\
a++;
應用時:if(….)
DO(a,b); //產生錯誤
else
解決方法: #difne DO(a,b) do{a+b;\
a++;}while(0)
|
gcc :C語言的編譯器
g++:C++/C語言的編譯器
gcc :C語言的編譯器
g++:C++/C語言的編譯器
#include 頭文件一般有兩種格式
一種是 <> 還有一種是""
如:
#include <iostream.h>
#include "myfile.h"
兩者的區別在于:
如果文件名用尖括號<>括起來,表示文件是一個標準頭文件,查找過程會預定義目錄.
如果文件名用一對引號""括起來,表明文件是用戶提供的頭文件查找該文件時將從當前文件目錄開始.
所以用標準頭文件時用<>
用自定義的頭文件時用""
關于gcc的參數 -Idirname
-Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預編譯過程中使用的參數。C程序中的頭文件包含兩種情況∶
A)#include
B)#include “myinc.h”
其中,A類使用尖括號(< >),B類使用雙引號(“ ”)。
對于A類,預處理程序cpp在系統預設包含文件目錄(如/usr/include)中搜尋相應的文件,
而對于B類,cpp在當前目錄中搜尋頭文件,這個選項的作用是告訴cpp,如果在當前目錄中沒有找到需要的文件,就到指定的dirname目錄中去尋找。在程序設計中,如果我們需要的這種包含文件分別分布在不同的目錄中,就需要逐個使用-I選項給出搜索路徑
第一:首先介紹一下SAX,DOM,JAXP,JDOM,DOM4J的基本知識:
1、sax、dom是兩種對xml文檔進行分析的方法(沒有具體的實現,只有接口)
所以不是解釋器,如果光有他們,你是完成不了對xml文檔的處理的。
sax的包是org.xml.sax
dom的包是org.w3c.dom
包的名稱很重要,它有助于你理解他們之間的關系。
2、jaxp是api,他封裝了sax\dom兩種接口。并在sax\dom的基礎之上,作了一套比較簡單的api以供開發人員使用。
jaxp的包是javax.xml.parsers
可以看看jaxp的源文件,它的文件中包含了對sax或者dom的引用(import)
jaxp也不是具體的實現,他只是一套api。如果你僅僅有jaxp那是無法工作的
(其實jaxp只是完成對sax、dom的包裝,生成了DocumentBuilderFactory\DocumentBuilder
和SAXParserFactory SAXParser。也就是設計模式中的工廠模式,他的好處就是具體的對象( 解釋器)建立由子類完成)
3、xerces解釋器(號稱地球上最快的xml解釋器)
在xerces中對jaxp中定義的SAXParser SAXParserFactory DocumentBuilder DocumentBuilderFactory進行了繼承(extends)對應SAXParserImpl SAXParserFactoryImpl DocumentBuilderImpl DocumentBuilderFactoryImpl
這就是為什么你的classpath中只要有xerces.jar(其中包含了sax dom jaxp )和 xercesImpl.jar就可以的原因了.
4、什么時候可以用別的解釋器 比如crimson呢
他也是和xerces一樣 是解釋器,很簡單,用crimson.jar 替代xercesImpl.jar
5、jdom和dom4j
W3C的DOM標準API難用的讓人想撞墻,于是有一幫人開發Java專用的XML API目的是為了便于使用,這就是jdom的由來,開發到一半的時候,另一部分人又分了出來,他們有自己的想法,于是他們就去開發dom4j,形成了今天這樣兩個API,至于他們之間的性能,jdom全面慘敗,dom4j大獲全勝。我覺得jdom和dom4j就相當于sax/dom+jaxp,具體的解釋器可以選擇。
第二:再介紹一下,dom,sax,jdom,dom4j的技術特點:
1: DOM
DOM 是用與平臺和語言無關的方式表示 XML 文檔的官方 W3C 標準。DOM 是以層次結構組織的節點或信息片斷的集合。這個層次結構允許開發人員在樹中尋找特定信息。分析該結構通常需要加載整個文檔和構造層次結構,然后才能做任何工作。由于它是基于信息層次的,因而 DOM 被認為是基于樹或基于對象的。DOM 以及廣義的基于樹的處理具有幾個優點。首先,由于樹在內存中是持久的,因此可以修改它以便應用程序能對數據和結構作出更改。它還可以在任何時候在樹中上下導航,而不是像 SAX 那樣是一次性的處理。DOM 使用起來也要簡單得多。
另一方面,對于特別大的文檔,解析和加載整個文檔可能很慢且很耗資源,因此使用其他手段來處理這樣的數據會更好。這些基于事件的模型,比如 SAX。
2:SAX
這種處理的優點非常類似于流媒體的優點。分析能夠立即開始,而不是等待所有的數據被處理。而且,由于應用程序只是在讀取數據時檢查數據,因此不需要將數據存儲在內存中。這對于大型文檔來說是個巨大的優點。事實上,應用程序甚至不必解析整個文檔;它可以在某個條件得到滿足時停止解析。一般來說,SAX 還比它的替代者 DOM 快許多。
3: 選擇 DOM 還是選擇 SAX ?
對于需要自己編寫代碼來處理 XML 文檔的開發人員來說,選擇 DOM 還是 SAX 解析模型是一個非常重要的設計決策。
DOM 采用建立樹形結構的方式訪問 XML 文檔,而 SAX 采用的事件模型。
DOM 解析器把 XML 文檔轉化為一個包含其內容的樹,并可以對樹進行遍歷。用 DOM 解析模型的優點是編程容易,開發人員只需要調用建樹的指令,然后利用navigation APIs訪問所需的樹節點來完成任務。可以很容易的添加和修改樹中的元素。然而由于使用 DOM 解析器的時候需要處理整個 XML 文檔,所以對性能和內存的要求比較高,尤其是遇到很大的 XML 文件的時候。由于它的遍歷能力,DOM 解析器常用于 XML 文檔需要頻繁的改變的服務中。
SAX 解析器采用了基于事件的模型,它在解析 XML 文檔的時候可以觸發一系列的事件,當發現給定的tag的時候,它可以激活一個回調方法,告訴該方法制定的標簽已經找到。SAX 對內存的要求通常會比較低,因為它讓開發人員自己來決定所要處理的tag。特別是當開發人員只需要處理文檔中所包含的部分數據時,SAX 這種擴展能力得到了更好的體現。但用 SAX 解析器的時候編碼工作會比較困難,而且很難同時訪問同一個文檔中的多處不同數據。
4:jdom http://www.jdom.org
JDOM 的目的是成為 Java 特定文檔模型,它簡化與 XML 的交互并且比使用 DOM 實現更快。由于是第一個 Java 特定模型,JDOM 一直得到大力推廣和促進。正在考慮通過“Java 規范請求 JSR-102”將它最終用作“Java 標準擴展”。從 2000 年初就已經開始了 JDOM 開發。
JDOM 與 DOM 主要有兩方面不同。首先,JDOM 僅使用具體類而不使用接口。這在某些方面簡化了 API,但是也限制了靈活性。第二,API 大量使用了 Collections 類,簡化了那些已經熟悉這些類的 Java 開發者的使用。
JDOM 文檔聲明其目的是“使用 20%(或更少)的精力解決 80%(或更多)Java/XML 問題”(根據學習曲線假定為 20%)。JDOM 對于大多數 Java/XML 應用程序來說當然是有用的,并且大多數開發者發現 API 比 DOM 容易理解得多。JDOM 還包括對程序行為的相當廣泛檢查以防止用戶做任何在 XML 中無意義的事。然而,它仍需要您充分理解 XML 以便做一些超出基本的工作(或者甚至理解某些情況下的錯誤)。這也許是比學習 DOM 或 JDOM 接口都更有意義的工作。
JDOM 自身不包含解析器。它通常使用 SAX2 解析器來解析和驗證輸入 XML 文檔(盡管它還可以將以前構造的 DOM 表示作為輸入)。它包含一些轉換器以將 JDOM 表示輸出成 SAX2 事件流、DOM 模型或 XML 文本文檔。JDOM 是在 Apache 許可證變體下發布的開放源碼。
5: DOM4J http://dom4j.sourceforge.net/
雖然 DOM4J 代表了完全獨立的開發結果,但最初,它是 JDOM 的一種智能分支。它合并了許多超出基本 XML 文檔表示的功能,包括集成的 XPath 支持、XML Schema 支持以及用于大文檔或流化文檔的基于事件的處理。它還提供了構建文檔表示的選項,它通過 DOM4J API 和標準 DOM 接口具有并行訪問功能。從 2000 下半年開始,它就一直處于開發之中。
為支持所有這些功能,DOM4J 使用接口和抽象基本類方法。DOM4J 大量使用了 API 中的 Collections 類,但是在許多情況下,它還提供一些替代方法以允許更好的性能或更直接的編碼方法。直接好處是,雖然 DOM4J 付出了更復雜的 API 的代價,但是它提供了比 JDOM 大得多的靈活性。
在添加靈活性、XPath 集成和對大文檔處理的目標時,DOM4J 的目標與 JDOM 是一樣的:針對 Java 開發者的易用性和直觀操作。它還致力于成為比 JDOM 更完整的解決方案,實現在本質上處理所有 Java/XML 問題的目標。在完成該目標時,它比 JDOM 更少強調防止不正確的應用程序行為。
DOM4J 是一個非常非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件。如今你可以看到越來越多的 Java 軟件都在使用 DOM4J 來讀寫 XML,特別值得一提的是連 Sun 的 JAXM 也在用 DOM4J。
最后:我建議用dom4j
JDOM 和 DOM 在性能測試時表現不佳,在測試 10M 文檔時內存溢出。在小文檔情況下還值得考慮使用 DOM 和 JDOM。雖然 JDOM 的開發者已經說明他們期望在正式發行版前專注性能問題,但是從性能觀點來看,它確實沒有值得推薦之處。另外,DOM 仍是一個非常好的選擇。DOM 實現廣泛應用于多種編程語言。它還是許多其它與 XML 相關的標準的基礎,因為它正式獲得 W3C 推薦(與基于非標準的 Java 模型相對),所以在某些類型的項目中可能也需要它(如在 javascript 中使用 DOM)。
SAX表現較好,這要依賴于它特定的解析方式。一個 SAX 檢測即將到來的XML流,但并沒有載入到內存(當然當XML流被讀入時,會有部分文檔暫時隱藏在內存中)。
無疑,DOM4J是最好的,目前許多開源項目中大量采用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 來讀取 XML 配置文件。如果不考慮可移植性,那就采用DOM4J吧!
四種xml操作方式的基本使用方法:
<?xml version="1.0" encoding="GB2312"?>
<RESULT>
<VALUE>
<NO>蘇A88888</NO>
<ADDR>南京市新街口10號</ADDR>
</VALUE>
<VALUE>
<NO>蘇A99999</NO>
<ADDR>南京市山西路20號</ADDR>
</VALUE>
</RESULT>
1)DOM
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
public class MyXMLReader{
public static void main(String arge[]){
long lasting =System.currentTimeMillis();
try{
File f=new File("data_10k.xml");
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc = builder.parse(f);
NodeList nl = doc.getElementsByTagName("VALUE");
for (int i=0;i<nl.getLength();i++){
System.out.print("車牌號碼:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
System.out.println("車主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
}
}catch(Exception e){
e.printStackTrace();
}
2)SAX
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
public class MyXMLReader extends DefaultHandler {
java.util.Stack tags = new java.util.Stack();
public MyXMLReader() {
super();
}
public static void main(String args[]) {
long lasting = System.currentTimeMillis();
try {
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
MyXMLReader reader = new MyXMLReader();
sp.parse(new InputSource("data_10k.xml"), reader);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("運行時間:" + (System.currentTimeMillis() - lasting) + "毫秒");}
public void characters(char ch[], int start, int length) throws SAXException {
String tag = (String) tags.peek();
if (tag.equals("NO")) {
System.out.print("車牌號碼:" + new String(ch, start, length));
}
if (tag.equals("ADDR")) {
System.out.println("地址:" + new String(ch, start, length));
}
}
public void startElement(String uri,String localName,String qName,Attributes attrs) {
tags.push(qName);}
}
3) JDOM
import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
public class MyXMLReader {
public static void main(String arge[]) {
long lasting = System.currentTimeMillis();
try {
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new File("data_10k.xml"));
Element foo = doc.getRootElement();
List allChildren = foo.getChildren();
for(int i=0;i<allChildren.size();i++) {
System.out.print("車牌號碼:" + ((Element)allChildren.get(i)).getChild("NO").getText());
System.out.println("車主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());
}
} catch (Exception e) {
e.printStackTrace();
}
}
4)DOM4J
import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;
public class MyXMLReader {
public static void main(String arge[]) {
long lasting = System.currentTimeMillis();
try {
File f = new File("data_10k.xml");
SAXReader reader = new SAXReader();
Document doc = reader.read(f);
Element root = doc.getRootElement();
Element foo;
for (Iterator i = root.elementIterator("VALUE"); i.hasNext() {
foo = (Element) i.next();
System.out.print("車牌號碼:" + foo.elementText("NO"));
System.out.println("車主地址:" + foo.elementText("ADDR"));
}
} catch (Exception e) {
e.printStackTrace();
}
)
Introduction
FOAF-a-matic 是一個簡單的 Javascript 應用程式。它讓你能夠建立關於你自己的 FOAF("Friend-of-A-Friend")檔案。你可以參考 Edd Dumbill 的文章:「XML 觀察:使用 XML 和 RDF 找到朋友」,拜訪RDFWeb 的 FOAF 首頁,以及FOAF 的詞彙描述(FOAF vocabulary description)。
簡單地說,FOAF 是一種用 XML 跟 RDF 描述你自己的方式:你的名字、電子郵件信箱,以及你的朋友們。 這種方式使其可以被軟體處理,舉例來說可為搜尋引擎所利用,自動化地發現社群與你的資訊。 FOAF 具有帶動線上社群許多有趣發展的潛力。Ben Hammersely 的英國衛報文章 "Click to the Clique" 提供 關於這些想法的更進一步探討。
FOAF-a-Matic 被用來提供一個簡單、快速的方式,產生你自己的 FOAF 檔案。最基本你至少需要提供你的 名字與 email 地址,並且你可以增加任何你想加入的朋友。把朋友加入 FOAF 檔案中是很重要的(當然想 寫下多少朋友看你高興啦),因為當 FOAF 彙整器索引你的 FOAF 描述時,他們將會自動把你們一起綁成 一群個體之間的網絡關係。
備註:在本頁你所輸入的所有資訊,都不會被存下來或被使用。全部的處理過程全部都是在客戶端進行, 以確保你的隱私權。
如果你對這個應用有任何的意見,或者關於 FOAF 的進一步問題,為什麼不參加RDFWeb-dev 的通訊論壇?
最新消息:我目前正在撰寫一套建立與管理個人 FOAF 資料的桌面應用程式,FOAF-a-Matic Mark 2 a
你所認識的朋友
告訴 FOAF-a-matic 你所認識的朋友。按下「加入更多朋友」,可以增加空白欄位,輸入更多你所認識朋友的資訊。 如果你的朋友已經有了 FOAF 檔案,請把該檔案連結的資訊(URL)輸入在「SeeAlso」的欄位中。
產生結果
現在你已經輸入了這些資料。你已經可以轉成 FOAF 檔案了。
接下來呢?
讓別人知道你的 FOAF 檔案
這個部分最簡單。只要將產生出來的 FOAF 檔案從剛剛的文字區複製,貼到一個檔案裡。將這個檔案擺在你的網站中, 可以讓所有的人公開下載;建議將檔案名稱取名為 foaf.rdf,然後 google 的搜尋機器人就會自動取用它,並且還會 用它自動發現網路上其他的 FOAF 檔案。
你的 FOAF 檔案現在已經好了。現在只需要其他人來拜訪並且開始閱讀它...
加入 FOAF 的社群
FOAF 的「查詢」問題(舉例來說,FOAF 相關的應用程式如何發現你的 FOAF 檔案)目前仍然尚待討論。如果你有任何 的建議,請送到 RDFWeb-dev 通訊論壇。然而有三種可 能的方法加入社群,你可以自己試試看:
使用 link 這個標籤
Aaron Swartz 曾經建議使用 HTML 的 link 標籤來指向 FOAF 檔案;這種做法和一般部落格的作者們指向他們的 RSS 檔案的方式是相同的。寫法應該像 是下面的樣子:
<link rel="meta" type="application/rdf+xml" title="FOAF" href="foaf.rdf" />
從朋友的 FOAF 檔案指過來
另外一種推薦的方式,是請別人(也就是你的朋友)在他們的 FOAF 檔案中標記你的 FOAF 檔案。一個 FOAF 的蜘 蛛(搜尋代理程式)可以梭巡所有互相標記關聯的 FOAF 檔案。你可以依照下列做法修改 FOAF 檔案:
- 修改
rdf:RDF
元素,如下增加 RDF Schema namespace: <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
- 然後透過加入
rdfs:seeAslo
的敘述,增加指向其他的 FOAF 檔案的鏈結: <rdfs:seeAlso rdf:resource="http://www.example.com/friends.xrdf"/> <rdfs:seeAlso rdf:resource="http://www.ldodds.com/webwho.xrdf"/>
最新消息:如果你的朋友們已經有了一個 FOAF 檔案,那麼請把它加在上面表單 seeAlso 的欄位中。你也可以推薦朋友 來使用 FOAF-a-matic
使用 FOAF 告示板
一個查詢 FOAF 檔案最直接的方式,就是有一個所有人的註冊中心。我用一個簡單的方式來進行, 叫做 FOAF 公佈欄(FOAF Bulletin Board)。你只需要瀏 覽 FOAFWiki,並且編輯 FOAFBulletinBoard 的網頁,把你的名字與連到你的 FOAF 檔案的連結加入到網頁中。你可以 使用我已經加入的資料做為範例,在公佈欄頁面中加入你的資料。
使用 HTML Tidy 與 XSLT 的魔法,意味著例如 Edd Dumbill 的 FOAFbot 這樣的應用程式可以處理這個索引檔案。請瀏覽 FOAFBot 的首頁關於如何看它發揮作用。