Saturday, February 26, 2005
Federated Identity Management
SourceID | SAML, Liberty Alliance, WS-Federation | Federated Identity Management
Related link from Roti
Friday, February 25, 2005
ทบทวน Antlr
วันนี้แกะ code Jakarta Slide ส่วน Client command line tool
พบว่าใช้ Antlr ช่วยเขียน เลยขอ note ทบทวนเกี่ยวกับ Antlr หน่อย
เนื่องจากห่างหายไม่ได้ใช้มา 2-3 ปีแล้ว
เวลาเราเขียน Gramma spec ด้วย Antlr
เราจะเขียนผ่าน file ที่มีนามสกุล .g โดยเราสามารถเขียน Lexer, Parser
แล้วก็ Tree Parser จากนั้นก็จะใช้ Ant ช่วย
compile ให้กลายเป็น java file อีกที
ในส่วน Slide Client command line จะใช้เฉพาะ Lexer และ
Parser เมื่อ parser parse ได้ ก็จะเกิด Action เลย ไม่ได้มีการสร้างเป็น Abstract
Syntax Tree แต่อย่างไร
Lexer Spec
class ClientLexer extends Lexer;
// ------------------------------------------------------------ options section
options {
k = 2;
caseSensitiveLiterals = false;
charVocabulary = '\u0003'..'\uFFFF';
}
// ------------------------------------------------------------- tokens section
tokens {
EXIT = "exit";
QUIT = "quit";
BYE = "bye";
HELP = "help";
....
}
//---------------------------------------------------------------- lexer rules
WS : (
' '
| '\t'
)
{
_ttype = Token.SKIP;
}
;
EOL // the end of line
: "\r\n" // DOS
| '\r' // MAC
| '\n' // UN*X
;
// Backslashes are accepted by CHARS,
// but STRING replace them into slashes !!
STRING
: ( CHARS (CHARS | '-')*
| '"'! ( ~'"' )* '"'!
)
{ String txt = $getText;
txt = txt.replace('\\', '/');
$setText(txt);
}
;
protected
CHARS
: 'a'..'z'
| 'A'..'Z'
| '0'..'9'
| '.'
| ':'
| '/'
| '$'
| '#'
| '%'
| '&'
| '('
| ')'
| '!'
| '+'
| '\\'
| '_'
;
....
ส่วนที่อยู่ในเครื่องหมายปีกกาเรียกว่า action
ซึ่งจะถูกแปลงเป็น java code ตรงๆ ใน Lexer class
และจะถูกเรียกทำงานเมื่อ lexer recognize rule ส่วนนั้น
สังเกตุได้ที่ STRING lexer rule เมื่อ lexer
จับได้ว่าเป็น String token
ก็จะทำการแปลงเครื่องหมาย \\ ให้เป็น /
ส่วน protected ที่นำหน้า Rule นั้น
เนื่องจาก Antlr แปลง rule ทุกตัวให้เป็น java method
ดังนั้นคำว่า protected ก็คือบอกให้ method
ที่ gen ออกมามี scope เป็น protected
k=2 ก็คือ บอกว่า Look ahead เท่ากับ 2
Parser Spec
class ClientParser extends Parser;
// ------------------------------------------------------------ options section
options {
k = 2;
exportVocab = Slide; // call this vocabulary "Slide"
defaultErrorHandler = false; // abort parsing on error
// TODO: use a tree-parser rule
// buildAST = true; // build tree construction
buildAST = false; // uses CommonAST by default
}
// Java code
{
// ------------------------------------------------------------- properties
/**
* The Slide WebDAV client.
*/
protected Client client;
// --------------------------------------------------------- helper methods
/**
* Set a client.
*
* @param client a client
*/
void setClient(Client client) {
this.client = client;
}
// --------------------------------------------------------------- parser rules
commands
: {
client.prompt();
}
( command
{
client.prompt();
}
)+
;
exception catch [ANTLRException ex] {
// XXX bad hack for bug #28100
if (ex.toString().indexOf("null") != -1) System.exit(-1);
// handle parse errors gracefully
client.print("Error: "+ex.toString());
}
command
:
( exit
| help
| invalid
| nothing
| spool
| run
| echo
.... (ตัดออก)
| commit
| abort
)
;
help
: ( HELP
| QUESTION
)
EOL
{
client.help(null);
}
;
exception
catch [RecognitionException ex]
{
printUsage("help");
}
connect
: ( CONNECT
| OPEN
)
uri:STRING
EOL
{
client.connect(text(uri));
}
;
exception
catch [RecognitionException ex]
{
printUsage("connect");
}
จะเห็นได้ว่าเราสามารถ embed method setClient
เพื่อที่เราจะได้ set helper class ลงไปได้
โดยเมื่อ parser recognise syntax ได้
ก็จะมีการทำ action (ส่วนที่อยู่ในเครื่องหมายปีกกา)
ซึ่ง implement ในลักษณะ delegate
ต่อไปยัง Client class อีกที
กฎง่ายๆของการเขียน Parser Rule ก็คือ
ถ้าเขียนตัวใหญ่หมด อันนั้นคือ token
ส่วนถ้าเป็นตัวเล็ก ก็หมายถึง sub rule
action code สามารถอ้างถึง token value
ได้โดยใส่ ชื่อตัวแปรตามด้วย colon
นำหน้า token ดังจะเห็นได้ในตัวอย่างของ
connect rule ซึ่งเขียนกฎ token STRING
-> uri:STRING
ข้อดีของ Antlr คือเมื่อแปลงเป็น java code แล้วก็ยังอ่านง่าย, debug ง่าย
ตัวอย่างของ code ที่ gen ออกมาในส่วนของ rule connect
public final void connect() throws RecognitionException,
TokenStreamException {
Token uri = null;
try { // for error handling
{
switch ( LA(1)) {
case CONNECT:
{
match(CONNECT);
break;
}
case OPEN:
{
match(OPEN);
break;
}
default:
{
throw new
NoViableAltException(LT(1), getFilename());
}
}
}
uri = LT(1);
match(STRING);
match(EOL);
client.connect(text(uri));
}
catch (RecognitionException ex) {
printUsage("connect");
}
}
Related link from Roti
ส่วน Search และ Index ของ Slide
วันนี้ลองไล่ดู wiki และ source code ของ Slide ในส่วน
Index และ Search ดู ได้ความเบื้องต้นดังนี้
กรณี Search
ในส่วนของ WebDAV protocol Slide support DASL Extension
แต่ไม่พบเอกสารว่า support แค่ไหนอย่างไร มิหนำซ้ำ
DASL Spec. จริงๆแล้วก็ยัง
เป็นแค่ Draft
version
อยู่ แต่ถ้าพูดถึงในแง่ว่าเพียงพอต่อการใช้งานธรรมดาแล้ว
หรือยัง ก็ถือว่าเพียงพอแล้ว
กรณี Index
ตัว Slide เองถ้าติดตั้งแบบ default จะไม่มีการทำ index เก็บไว้
แต่ถ้ามี search method ส่งเข้ามา
ก็จะใช้วิธี search หากับเนื้อข้อมูลจริงเลย
กรณีที่เราต้องการทำ
Index. Slide ก็ bundle
Basic Index feature มาให้เรา 2 กรณีคือ
- ทำ index ในส่วน MetaData ของ Resource
- ทำ index ในส่วน Content
Note: ทั้ง 2 กรณีนี้ใช้ lucene เป็น engine
กรณีที่ทำ index ในส่วน MetaData ถือว่ายังอยู่ในขั้นทดลอง
จะ release จริงใน version 2.2
ส่วนกรณี content indexer ที่มีมาให้ ก็เป็น simple case
ถ้าจะใช้จริงต้อง implement เพิ่มเติมเอง
ถือว่ามี source ให้ดูเป็นแนวทางเท่านั้น
Feature ที่เกี่ยวเนื่องกับเรื่องนี้อีกอันก็คือ Extractor
เดิมเข้าใจว่า feature นี้น่าจะใช้กรณีที่เราต้องการ automatic สร้าง
metadata จากเนื้อ content เลย (เรียก PropertyExtractor)
แต่ใน source code เห็นมี Indexer ตัวหนึ่งเรียกใช้ตรงๆ จาก ExtratorManager เลย
เข้าใจว่าเป็นส่วนเพิ่มมาที่หลัง (เรียก ContentExtractor)
ใช้ extract เฉพาะส่วนที่สมควรทำ index ออกมาจากเนื้อ content
โดย slide มี extractor ให้ดังนี้
- excel
- word
- powerpoint
วิธีที่กะว่าจะใช้
- ใช้ PropertyExtractor สำหรับ extract content ออกมา
- ใช้ Property Indexer ทำ index แบบ asyncronous
สิ่งที่ต้อง check ต่อก็คือ ลำดับของ slide ในการเรียก extractor กับ
เป็นไปตามที่เราคิดไว้หรือไม่
Related link from Roti
Tuesday, February 22, 2005
Jakartal Slide Performance & websphere problem issues
1. maximum file per Directory
1.1 Files Directory ต้องแนะนำให้ user จัด folder โดยคำนึงถึง limit ด้วย
(maybe 500)
1.2 History Directory ต้องเพิ่ม
parameter name="history-collection-hack"
ใน Configuration Element
เพื่อให้ file structure กระจาย ไม่เช่นนั้นจะ slide จะเก็บ history file ไว้
ใน directory เดียว
2. Memory Leak ที่ต้องทำให้ re-start server บ่อยๆ
issue นี้มีพูดถึงใน this tread
3. jdom.jar ใน Websphere 5.0 กับ Slide conflict กัน (look at this thread)
4. Slide on Websphere มีหลาย tread ที่ระบุปัญหา Authenticate
แต่ถ้าดูใน thread นี้ก็ชัดเจนดี คงต้องทดสอบอย่างเดียว
5. มีคนพูดถึง performance issue กรณีที่ว่า slide เหมาะสำหรับ
light to medium load เท่านั้น
ให้ check user requirement ด้วย
6. ปัญหาเรื่อง config servlet (look at this thread)
เห็น issue ก็เหนื่อยแล้ว
Related link from Roti
Cutom authentication for Slide
RE: Cutom authentication for Slide
ในประเด็น client ที่ไม่ใช่ browser นั้น ต้องขอ Ticket จาก CAS มาให้ได้ก่อนแล้วค่อยใช้
CasProcessingFilter.CAS_STATELESS_IDENTIFIER เป็น principal
(อ่านได้ใน reference guide)
Related link from Roti
Monday, February 21, 2005
Sunday, February 20, 2005
slide admin
web ซึ่งภายในมี admin application ออกไป แต่ไปเพิ่ม admin app ใน
framework ที่ชื่อ projector ซึ่งไม่มีเอกสารอธิบายเลย จึงต้องแกะเอาเอง
ในส่วนของ projector จะใช้ concept workflow โดยมองเป็น process
ย่อยๆ หลายอัน ซึ่งแต่ละอันก็จะมี step ต่างๆ เท่าที่ดูก็ยังมีปัญหาต้องแก้อีก
พอสมควร (tag version พึ่งจะ 0.1)
ดังนั้นปัญหาตอนนี้ก็คือ จะทำ admin ด้วยอะไรดี
ตัว DAVExplorer ก็มีข้อเสียว่า ถ้าจะ config ส่วน security
ก็ต้องใช้วิธี manual config เอาเอง
ส่วน WebDAVPilot มีส่วน ACL ที่ทำค่อนข้างดีแล้ว แต่ขาดตรง
ไม่มี source code provide มาให้ ทำให้ไม่สามารถ extend ได้
ทางเลือกเร็วสุดตอนนี้ก็คือ ใช้ tapestry + lib WebDAVClient
Related link from Roti
Blue Gate Crossing
ขนาดดูครั้งที่ 2 ก็ยังซึ้งอยู่เหมือนเดิม หนังเรื่องนี้เล่าเรื่องได้ดีจริงๆ
ดำเนินเรืองสบายๆ (เหมือนจังหวะของชีวิตจริง ไม่มีการเน้นเกินจริง)
ยิ่งรู้โครงเรื่องทั้งหมดแล้วเห็นรายละเอียดที่นักแสดงแสดงออกมา
แถมยังเป็นการแสดงทีดูเป็นธรรมชาติมาก ไม่รู้ว่าคนอื่นเป็นเหมือนเราบ้างหรือเปล่า
ดูแล้วรู้สึกเหมือนหัวใจพองโต เหมือนมีอะไรอัดแน่นอยู่ข้างใน
มีความรู้สึกเอ่อท้นออกมา (บอกไม่ได้นะว่าเป็นความรู้สึกประเภทไหน
มันมีส่วนผสมระหว่าง ความสุข ความเศร้า และก็ผสมความเหงา)
แถมตอนจบยังได้ฟังเพลงโปรดอีกต่างหาก
(อิ่มอกอิ่มใจจริงๆ)