Sunday, April 17, 2005

nestd loop sql

Introduction

This article and accompanying code demonstrates the theory and practice behind "Nested Sets". The theory is applicable with any type hierarchy in any database, however the example code was written using SQL Server 2000 and every attempt has been made to make it compatible with most major SQL providers.

The Theory

Nested sets rely on a demoralization of parts of the hierarchy, They can be used to efficiently use a hierarchy without relying on the Parent / Child link. How a person usually views or represents a hierarchy is by using parent child relationship, this can be seen below:

The above hierarchy shows a make-believe company organisational structure, this data can be compiled into a database table and represented very easily, the SQL Script below shows how to create the table and populate the data:

-- Create the SQL Table
CREATE TABLE Employee
(
EmployeeID INT IDENTITY(1, 1) NOT NULL,
ParentID INT NULL,
JobTitle VARCHAR(50) NOT NULL,
FirstName VARCHAR(50) NOT NULL,
PRIMARY KEY(EmployeeID),
FOREIGN KEY ParentID REFERENCES Employee (EmployeeID)
)

GO

And populate the data:

-- Set identity insert ON so we can insert the employee ID
SET IDENTITY_INSERT Employee ON
SET NOCOUNT ON

INSERT INTO Employee (EmployeeID, ParentID, JobTitle, FirstName)
VALUES (1, NULL, 'Managing Director', 'Bill')
-- Employees under Bill
INSERT INTO Employee (EmployeeID, ParentID, JobTitle, FirstName)
VALUES (2, 1, 'Customer Services', 'Angela')
INSERT INTO Employee (EmployeeID, ParentID, JobTitle, FirstName)
VALUES (3, 1, 'Development Manager', 'Ben')
-- Employess under angela
INSERT INTO Employee (EmployeeID, ParentID, JobTitle, FirstName)
VALUES (4, 2, 'Assistant 1', 'Henry')
INSERT INTO Employee (EmployeeID, ParentID, JobTitle, FirstName)
VALUES (5, 2, 'Assistant 2', 'Nicola')
-- Employees under ben
INSERT INTO Employee (EmployeeID, ParentID, JobTitle, FirstName)
VALUES (6, 3, 'Snr Developer', 'Kerry')
INSERT INTO Employee (EmployeeID, ParentID, JobTitle, FirstName)
VALUES (7, 3, 'Assistant', 'James')
-- Emplyees under kerry
INSERT INTO Employee (EmployeeID, ParentID, JobTitle, FirstName)
VALUES (8, 6, 'Jrn Developer', 'Tim')
SET NOCOUNT OFF

SET IDENTITY_INSERT Employee OFF

The above SQL code will create the table needed to represent the above hierarchy. Most hierarchy are developed using the above ParentID method, and usually it is enough to get by with especially if the hierarchy has a fixed amount of levels. However if a large part of an application is based around the hierarchy and the hierarchy is dynamic, then the above method becomes less efficient and very costly to use. Various common hierarchy operations become difficult. For instance finding the leaf node of the hierarchy using the ParentID becomes very difficult and can not easily be retrieved with a simple SELECT statement. To find any parent of a child at any level of the hierarchy you must use the ParentID of each node, this is also difficult and inefficient to retrieve with a simple select statement.

This is where nested sets become infinitely useful. If we were to represent the above hierarchy slightly differently we can gain a lot of advantages. Below is the same hierarchy represented as nested sets:

Although at first this is slightly more confusing to read visually, to a computer system this is a cinch. The above diagram is indicating that each node is aware of all its descendents, and vice versa. For example, we can see easily enough from the diagram that Ben and Angela are children of Bill because they are contained within Bill. We can also see that Tim And James are children of Ben because they are contained within Ben. This ultimately gives us a link between each member of the hierarchy.

For us to represent this is data terms we need to store two more values per node, these are the extent values of the set. These are shown below on the same diagram in blue and red.

Lets call these Left (Red Values) and Right (Blue Values). These values should be stored on the Employee table along with the ParentID and this is all we need to fully represent a nested sets hierarchy.

-- Alter the employee table to include the left and right extent values
ALTER TABLE Employee ADD [LeftExtent] INT NULL
ALTER TABLE Employee ADD [RightExtent] INT NULL

GO

By using the Left and Right values of the database you can pick out some simple rules and simple queries:

-- If Left is between parent left and parent right then the node is a child
SELECT * FROM Employee
CROSS JOIN (
SELECT [LeftExtent], [RightExtent]
FROM Employee WHERE Firstname = 'Ben'
) AS Parent
WHERE Employee.[LeftExtent]
BETWEEN Parent.[LeftExtent] and Parent.[RightExtent]

-- All Leaf nodes (an item with any children) can be
-- identified by Left = Right - 1
SELECT * FROM Employee WHERE [LeftExtent] = [RightExtent] - 1

More advanced queries can be used, but before these are explained the Left and Right values must be populated. Below is the SQL code used to to populate the Left and Right values, the explanation for how it work is contained in the comments:

-- Create the stack table
DECLARE @tmpStack TABLE
(
ID INT IDENTITY(1, 1),
EmployeeID INT NOT NULL,
LeftExtent INT NULL,
RightExtent INT NULL
)

-- what we do is start from a parent, in this instance
-- we want to start from the very top which is the NULL parent
DECLARE @parentid AS INTEGER
SET @parentid = NULL

-- our counter is the variable used to set the left and right extent
DECLARE @counter AS INTEGER
SET @counter = 1

-- what we do is go check the parentid for children, if it
-- has children we push
-- it into the stack and move on to the next child
DECLARE @id AS INTEGER
DECLARE @oldid AS INTEGER

SET NOCOUNT ON

WHILE 1 = 1
BEGIN
SET @id = NULL

-- get the first row which is a child of @partentid, which has not already
-- been pushed onto the stack
INSERT INTO @tmpStack
(
EmployeeID,
LeftExtent
)
SELECT TOP 1 EmployeeID, @counter
FROM Employee
WHERE ISNULL(ParentID, 0) = ISNULL(@parentid,0)
AND EmployeeID NOT IN (SELECT EmployeeID FROM @tmpStack)



-- just check we are getting the right identity value
-- this value does not get reset once its reas so we
-- need to see if its the same as the older one
SET @id = SCOPE_IDENTITY()
IF ISNULL(@id, 0) = ISNULL(@oldid, 0)
SET @id = NULL
ELSE
BEGIN
SET @oldid = @id
SET @counter = @counter + 1
END


-- if we have children (i.e if this operation inserted a row,
-- then we carry on
IF @id IS NULL
BEGIN
-- no rows left, which means we want to pop the last item
SELECT TOP 1 @id = ID FROM @tmpStack
WHERE RightExtent IS NULL ORDER BY ID DESC

-- there are no items left to pop, so exit the procedure
IF @id IS NULL
BREAK

UPDATE @tmpStack
SET RightExtent = @counter
WHERE ID = @id

SET @counter = @counter + 1

SELECT @parentid = ParentID
FROM Employee WHERE EmployeeID =
(SELECT EmployeeID FROM @tmpStack WHERE ID = @id)
END
ELSE
BEGIN
-- this is easy enough, move on to the next level
-- we want the parent id of the item just inserted
SELECT @parentid = EmployeeID FROM @tmpStack WHERE ID = @id
END
END

-- And update all the Items in Hier_Dept
-- in the original hierarchy table
UPDATE e
SET LeftExtent = ts.LeftExtent,
RightExtent = ts.RightExtent
FROM Employee e
INNER JOIN @tmpStack ts
ON ts.EmployeeID = e.EmployeeID

GO

The logic to the above code is simple enough, if you imagine the hierarchy as its original structure, the left and right values need to be numbered as if you were tracing a line around the outside of the tree e.g.:

Below are some more examples or using the left and right values to query the data:

-- Which level of the hierarchy are the employees on
SELECT COUNT(P2.EmployeeID) AS level,
P1.FirstName,
P1.LeftExtent ,
P1.RightExtent
FROM Employee AS P1
INNER JOIN Employee AS P2
ON (P1.LeftExtent BETWEEN P2.LeftExtent AND P2.RightExtent)
GROUP BY P1.FirstName, P1.LeftExtent, P1.RightExtent
ORDER BY Level ASC

-- counting the employees of a manager (children of a node)
SELECT p1.FirstName,
COUNT(p2.EmployeeID) Employees
FROM Employee p1
INNER JOIN Employee p2
ON (p2.LeftExtent BETWEEN p1.LeftExtent AND p1.RightExtent
AND p2.LeftExtent <> p1.LeftExtent)
GROUP BY p1.FirstName
ORDER BY Employees DESC

That's about it. Nested sets in a nut-shell. I hope you have found the code useful and interesting. If you need more detailed information about the theory there are plenty of SQL websites around which will have some information on this subject. Any corrections please don't hesitate to email me!

Monday, February 07, 2005

Syeikh Nawawi al-Bantani - Digelar Imam Nawawi kedua

NAMA Imam Nawawi tidak asing lagi bagi dunia Islam terutama dalam lingkungan ulama-ulama Syafi'iyah. Ulama ini sangat terkenal kerana banyak karangannya yang dikaji pada setiap zaman dari dahulu sampai sekarang. Pada penghujung abad ke-18 lahir pula seorang yang bernama Nawawi di Banten, Jawa Barat. Setelah dia menuntut ilmu yang sangat banyak, mensyarah kitab-kitab bahasa Arab dalam pelbagai disiplin ilmu yang sangat banyak pula, maka dia digelar Imam Nawawi ats-Tsani, ertinya Imam Nawawi Yang Kedua. Orang pertama memberi gelaran demikian ialah Syeikh Wan Ahmad bin Muhammad Zain al-Fathani. Gelaran yang diungkapkan oleh Syeikh Ahmad al-Fathani dalam seuntai gubahan syairnya itu akhirnya diikuti oleh semua orang yang menulis riwayat ulama yang berasal dari Banten itu. Sekian banyak ulama dunia Islam sejak sesudah Imam Nawawi yang pertama (wafat 676 Hijrah/1277 Masehi) sampai sekarang ini belum ada orang lain yang mendapat gelaran Imam Nawawi ats-Tsani, kecuali Syeikh Nawawi, ulama kelahiran Banten yang dibicarakan ini. Rasanya gelaran demikian memang dipandang layak, tidak ada ulama sezaman dengannya mahupun sesudahnya yang mempertikai autoritinya dalam bidang ilmiah keislaman menurut metode tradisional yang telah wujud zaman berzaman dan berkesinambungan.

Sungguhpun Syeikh Nawawi ats-Tsani al-Bantani diakui alim dalam semua bidang ilmu keislaman, namun dalam dunia at-thariqah ash-shufiyah, gurunya Syeikh Ahmad Khathib Sambas tidak melantik beliau sebagai seorang mursyid Thariqat Qadiriyah-Naqsyabandiyah, tetapi yang dilantik ialah Syeikh Abdul Karim al-Bantani, iaitu ayah saudara kepada Syeikh Nawawi al-Bantani, yang sama-sama menerima thariqat itu kepada Syeikh Ahmad Khathib Sambas. Apakah sebabnya terjadi demikian hanya diketahui oleh Syeikh Ahmad Khathib Sambas dan Syeikh Nawawi al-Bantani. Syeikh Nawawi al-Bantani mematuhi peraturan yang diberikan itu, sehingga beliau tidak pernah mentawajuh/membai'ah seseorang muridnya walaupun memang ramai murid beliau yang menjadi ulama besar yang berminat dalam bidang keshufian.

Lahir dan pendidikan

Nama lengkapnya adalah Syeikh Muhammad Nawawi bin Umar ibnu Arabi bin Ali al-Jawi al-Bantani. Beliau adalah anak sulung seorang ulama Banten, Jawa Barat, lahir pada tahun 1230 Hijrah/1814 Masehi di Banten dan wafat di Mekah tahun 1314 Hijrah/1897 Masehi. Ketika kecil, beliau sempat belajar kepada ayahnya sendiri, dan di Mekah belajar kepada beberapa ulama terkenal pada zaman itu, di antara mereka yang dapat dicatat adalah sebagai berikut: Syeikh Ahmad an-Nahrawi, Syeikh Ahmad ad-Dumyati, Syeikh Muhammad Khathib Duma al-Hanbali, Syeikh Muhammad bin Sulaiman Hasbullah al-Maliki, Syeikh Zainuddin Aceh, Syeikh Ahmad Khathib Sambas, Syeikh Syihabuddin, Syeikh Abdul Ghani Bima, Syeikh Abdul Hamid Daghastani, Syeikh Yusuf Sunbulawani, Syeikhah Fatimah binti Syeikh Abdus Shamad al-Falimbani, Syeikh Yusuf bin Arsyad al-Banjari, Syeikh Abdus Shamad bin Abdur Rahman al-Falimbani, Syeikh Mahmud Kinan al-Falimbani, Syeikh Aqib bin Hasanuddin al-Falimbani. Demikian saja para gurunya yang dapat dicatat daripada berbagai-bagai sumber, dan berkemungkinan banyak yang belum dapat dicatat di sini.

Dipercayai beliau datang ke Mekah dalam usia 15 tahun dan selanjutnya setelah menerima pelbagai ilmu di Mekah, beliau meneruskan pelajarannya ke Syam (Syiria) dan Mesir. Setelah keluar dari Mekah kerana menuntut ilmu yang tidak diketahui berapa lamanya, lalu beliau kembali lagi ke Mekah. Keseluruhan masa beliau tinggal di Mekah dari mulai belajar, mengajar dan mengarang hingga sampai kemuncak kemasyhurannya lebih dari setengah abad lamanya. Diriwayatkan bahawa setiap kali beliau mengajar di Masjidil Haram sentiasa dikelilingi oleh pelajar yang tidak kurang daripada dua ratus orang. Kerana sangat terkenalnya beliau pernah diundang ke Universiti al-Azhar, Mesir untuk memberi ceramah atau fatwa-fatwa pada beberapa perkara yang tertentu.

Belum jelas tahun berapa beliau diundang oleh ahli akademik di Universiti al-Azhar itu, namun difahamkan bahawa beliau sempat bertemu dengan seorang ulama terkenal di al-Azhar (ketika itu sebagai Syeikhul Azhar), iaitu Syeikh Ibrahim al-Baijuri (wafat 1860 Masehi) yang sangat tua dan lumpuh kerana tuanya. Kemungkinan Syeikh Ibrahim al-Baijuri, Syeikhul Azhar yang terkenal itu termasuk salah seorang di antara guru kepada Syeikh Nawawi al-Bantani.

Murid-murid

Diriwayatkan bahawa Syeikh Nawawi al-Bantani mengajar di Masjidil Haram menggunakan bahasa Jawa dan Sunda ketika memberi keterangan terjemahan kitab-kitab bahasa Arab. Barangkali ulama Banten yang terkenal itu kurang menguasai bahasa Melayu yang lebih umum dan luas digunakan pada zaman itu. Oleh sebab kurang menguasai bahasa Melayu, maka tidak berapa ramai muridnya yang berasal dari luar pulau Jawa (seperti Sumatera dan Semenanjung Tanah Melayu dan Patani). Tetapi Tok Kelaba al-Fathani menyebut bahawa beliau menerima satu amalan wirid daripada Syeikh Abdul Qadir bin Mustafa al-Fathani, dan Syeikh Abdul Qadir itu menerimanya daripada Syeikh Nawawi al-Bantani. Syeikh Abdul Qadir al-Fathani (Tok Bendang Daya II) sebenarnya bukan peringkat murid kepada Syeikh Nawawi al-Bantani tetapi adalah peringkat sahabatnya. Syeikh Nawawi al-Bantani (1230 Hijrah/1814 Masehi) lebih tua sekitar empat tahun saja daripada Syeikh Abdul Qadir al-Fathani (Tok Bendang Daya II, 1234 Hijrah/1817 Masehi). Adapun murid Syeikh Nawawi al-Bantani di pulau Jawa yang menjadi ulama yang terkenal sangat ramai, di antara mereka ialah, Kiyai Haji Hasyim Asy'ari, Pengasas Pondok Pesantren Tebuireng, Jawa Timur, bahkan beliau ini dianggap sebagai bapa ulama Jawa dan termasuk pengasas Nahdhatul Ulama. Murid Syeikh Nawawi al-Bantani yang terkenal pula ialah Kiyai Haji Raden Asnawi di Kudus, Jawa Tengah, Kiyai Haji Tubagus Muhammad Asnawi di Caringin, Purwokerto, Jawa Barat, Syeikh Muhammad Zainuddin bin Badawi as-Sumbawi, Syeikh Abdus Satar bin Abdul Wahhab as-Shidqi al-Makki, Sayid Ali bin Ali al-Habsyi al-Madani dan ramai lagi.

Salah seorang cucunya, yang juga mendapat pendidikan sepenuhnya daripada beliau ialah Syeikh Abdul Haq bin Abdul Hannan al-Jawi al-Bantani (1285 Hijrah/1868 Masehi - 1324 Hijrah/1906 Masehi). Pada halaman pertama Al-Aqwalul Mulhaqat, Syeikh Abdul Haq al-Bantani menyebut bahawa Syeikh Nawawi al-Bantani adalah orang tuanya (Syeikhnya), orang yang memberi petunjuk dan pembimbingnya. Pada bahagian kulit kitab pula beliau menulis bahawa beliau adalah `sibthun' (cucu) an-Nawawi Tsani. Selain orang-orang yang tersebut di atas, sangat ramai murid Syeikh Nawawi al-Bantani yang memimpin secara langsung barisan jihad di Celegon melawan penjajahan Belanda pada tahun 1888 Masehi. Di antara mereka yang dianggap sebagai pemimpin pemberontak Celegon ialah: Haji Wasit, Haji Abdur Rahman, Haji Haris, Haji Arsyad Thawil, Haji Arsyad Qasir, Haji Aqib dan Tubagus Haji Ismail. Semua mereka adalah murid Syeikh Nawawi al-Bantani yang dikaderkan di Mekah.

Karya-karya

Berapa banyakkah karya Syeikh Nawawi ats-Tsani al-Bantani yang sebenarnya belum diketahui dengan pasti. Barangkali masih banyak yang belum

masuk dalam senarai yang ditulis oleh

penulis-penulis sebelum ini. Saya telah memiliki karya ulama Banten ini sebanyak 30 judul. Judul yang telah saya masukkan dalam buku berjudul Katalog Besar Persuratan Melayu, sebanyak 44 judul. Semua karya Syeikh Nawawi al-Bantani ditulis dalam bahasa Arab dan merupakan syarahan daripada karya orang lain. Belum ditemui walau sebuah pun karyanya yang diciptakan sendiri. Juga belum ditemui karyanya dalam bahasa Melayu, Jawa ataupun Sunda. Oleh sebab kekurangan ruangan di antara 44 judul di bawah ini saya catat sekadarnya saja, ialah:

1. Targhibul Musytaqin, selesai Jumaat, 13 Jamadilakhir 1284 Hijrah/1867 Masehi. Cetakan awal Mathba'ah al-Miriyah al-Kainah, Mekah, 1311 Hijrah.

2. Fat-hus Shamadil `Alim, selesai awal Jamadilawal 1286 Hijrah/1869 Masehi. Dicetak oleh Mathba'ah Daril Kutubil Arabiyah al-Kubra, Mesir 1328 Hijrah.

3. Syarah Miraqil `Ubudiyah, selesai 13 Zulkaedah 1289 Hijrah/1872 Masehi. Cetakan pertama Mathba'ah al-Azhariyah al-Mashriyah, Mesir 1308 Hijrah.

4. Madarijus Su'ud ila Iktisa'il Burud, mulai menulis 18 Rabiulawal 1293 Hijrah/1876 Masehi. Dicetak oleh Mathba'ah Mustafa al-Baby al-Halaby, Mesir, akhir Zulkaedah 1327 Hijrah.

5. Hidayatul Azkiya' ila Thariqil Auliya', mulai menulis 22 Rabiulakhir 1293 Hijrah/1876 Masehi, selesai 13 Jamadilakhir 1293 Hijrah/1876 Masehi. Diterbitkan oleh Mathba'ah Ahmad bin Sa'ad bin Nabhan, Surabaya, tanpa menyebut tahun penerbitan.

6. Fat-hul Majid fi Syarhi Durril Farid, selesai 7 Ramadan 1294 Hijrah/1877 Masehi. Cetakan pertama oleh Mathba'ah al-Miriyah al-Kainah, Mekah, 1304 Hijrah.

7. Bughyatul `Awam fi Syarhi Maulidi Saiyidil Anam, selesai 17 Safar 1294 Hijrah/1877 Masehi. Dicetak oleh Mathba'ah al-Jadidah al-'Amirah, Mesir, 1297 Hijrah.

8. Syarah Tijanud Darari, selesai 7 Rabiulawal 1297 Hijrah/1879 Masehi. Cetakan pertama oleh Mathba'ah `Abdul Hamid Ahmad Hanafi, Mesir, 1369 Masehi.

9. Syarah Mishbahu Zhulmi `alan Nahjil Atammi, selesai Jamadilawal 1305 Hijrah/1887 Masehi. Cetakan pertama oleh Mathba'ah al-Miriyah al-Kainah, Mekah, 1314 Hijrah atas biaya saudara kandung pengarang, iaitu Syeikh Abdullah al-Bantani.

10. Nasha-ihul `Ibad, selesai 21 Safar 1311 Hijrah/1893 Masehi. Cetakan kedua oleh Mathba'ah al-Miriyah al-Kainah, Mekah, 1323 Hijrah.

11. Al-Futuhatul Madaniyah fisy Syu'bil Imaniyah, tanpa tarikh. Dicetak di bahagian tepi kitab nombor 10, oleh Mathba'ah al-Miriyah al-Kainah, Mekah, 1323 Hijrah.

12. Hilyatus Shibyan Syarhu Fat-hir Rahman fi Tajwidil Quran, tanpa tarikh. Dicetak oleh Mathba'ah al-Miriyah, Mekah, 1332 Hijrah.

13. Qatrul Ghaits fi Syarhi Masaili Abil Laits, tanpa tarikh. Dicetak oleh Mathba'ah al-Miriyah, Mekah, 1321 Hijrah.

14. Mirqatu Su'udi Tashdiq Syarhu Sulamit Taufiq, tanpa tarikh. Cetakan pertama oleh Mathba'ah al-Miriyah, Mekah 1304 Hijrah.

15. Ats-Tsimarul Yani'ah fir Riyadhil Badi'ah, tanpa tarikh. Cetakan pertama oleh Mathba'ah al-Bahiyah, Mesir, Syaaban 1299 Hijrah. Dicetak juga oleh Mathba'ah Mustafa al-Baby al-Halaby, Mesir, 1342 Hijrah.

16. Tanqihul Qaulil Hatsits fi Syarhi Lubabil Hadits, tanpa tarikh. Dicetak oleh Mathba'ah Dar Ihya' al-Kutub al-'Arabiyah, Mesir, tanpa tarikh.

17.Bahjatul Wasail bi Syarhi Masail, tanpa tarikh. Dicetak oleh Mathba'ah al-Haramain, Singapura-Jeddah, tanpa tarikh.

18. Fat-hul Mujib Syarhu Manasik al- 'Allamah al-Khatib, tanpa tarikh. Dicetak oleh Mathba'ah at-Taraqqil Majidiyah, Mekah, 1328 Hijrah.

19. Nihayatuz Zain Irsyadil Mubtadi-in, tanpa tarikh. Diterbitkan oleh Syarikat al-Ma'arif, Bandung, Indonesia, tanpa tarikh.

20. Al-Fushushul Yaqutiyah `alar Raudhatil Bahiyah fi Abwabit Tashrifiyah, tanpa tarikh. Dicetak oleh Mathba'ah al-Bahiyah, Mesir, awal Syaaban 1299 Hijrah.

Raja Haji Abdullah - Yamtuan Muda Riau Ke IX

RAJA Haji Abdullah adalah putera Raja Ja'afar Yamtuan Muda Riau VI. Raja Haji Abdullah termasuk seorang ulama sufi, seorang mursyid dalam Thariqat Naqsyabandiyah al-Khalidiyah. Mula-mula beliau belajar kepada saudara sepupunya Raja Ali Haji bin Raja Haji Ahmad. Setelah itu ke Mekah belajar kepada Syeikh Ismail bin Abdullah al-Minankabawi, Syeikh Syihabuddin bin Syeikh Muhammad Arsyad al-Banjari, Syeikh Ahmad al-Jabarti, Syeikh Daud bin Abdullah al-Fathani dan lain-lain.

Sewaktu beliau pulang ke Riau, dialah yang membawa Syeikh Syihabuddin al-Banjari dan Syeikh Ahmad al-Jabarti datang ke Riau untuk dijadikan guru. Kemudian setelah dia menetap di Riau, Syeikh Ismail Minangkabau datang ke Riau. Raja Haji Abdullah sungguh pun seorang raja, namun menyediakan dirinya sebagai khadam Syeikh Ismail al-Minankabawi, ulama besar yang sudah terkenal di Mekah itu.

Sewaktu Syeikh Ismail al-Minankabawi berangkat ke Singapura, dan mungkin ke mana saja Syeikh Ismail pergi, termasuk ke Kedah, Raja Haji Abullah ikut serta kerana mengharapkan limpah barakah pancaran ilmu sufi yang demikian tinggi yang ada pada peribadi Syeikh Ismail al-Minankabawi itu. Raja Haji Abdullah digelar juga dengan Haji Muda. Selain itu sebagai gelar tertinggi bagi penganut thariqat beliau disebut sebagai Marhum Mursyid. Gelar ini setelah baginda mangkat. Sebenarnya gelar itu memang sesuai untuknya kerana baginda adalah putera Riau yang diakui oleh gurunya Syeikh Ismail Minangkabau sebagai Khalifah Mursyid yang boleh mentawajjuh dan membai'ah para ikhwan Thariqat Naqsyabandiyah al-Khalidiyah itu, apabila Syeikh Ismail Minangkabau tidak berada di Riau.

Setelah saudaranya Raja Ali bin Raja Ja'afar mangkat, Raja Haji Abdullah menggantikan saudaranya sebagai Yamtuan Muda Riau-Lingga ke IX. Walaupun Raja Haji Abdullah sebagai penguasa tertinggi kerajaan Riau-Lingga, namun baginda tetap sebagai seorang tokoh ahli sufi yang melakukan ibadah dengan rutin sebagaimana disebut oleh Raja Ali Haji, ``Maka di dalam hal itu, maka ia pun duduk di dalam berbuat ibadat juga dengan segala sanak-sanak saudaranya serta menjalankan ibadat Thariqat Naqsyabandiyah itu. Maka tiadalah berhenti khatam dan tawajjuhnya pada tiap-tiap malam Selasa dan hari Jumaat serta menderas ilmu di balainya, iaitu Raja Haji Ali mengajar-ngajar serta membaca kitab-kitab akan segala sanak-sanak saudaranya serta pegawai-pegawai negeri. Ada pun kitab yang dibacanya itu kitab fikah: sah, batal, halal, haram ...''

Berambisi

Raja Haji Abdullah bukanlah seorang yang berambisi atau hubbud dun-ya atau hubbul jah, bahawa baginda berkehendak jadi Yamtuan Muda Riau-Lingga itu, tetapi adalah sebaliknya, pangkat yang disandangnya hanyalah berupa anugerah Allah jua adanya. Ini dapat dibuktikan daripada kata-katanya, ``Saya ini, apabila setahun di dalam pekerjaan raja ini, saya hendak berhenti, jika dikehendaki oleh goverment, adalah ganti saya anak saya Muhammad Yusuf.'' Perkataan tersebut seakan-akan sindiran bahawa seolah-olah baginda tahu daripada pandangan kasyaf, umurnya tidak akan berapa lama lagi, baginda akan meninggalkan dunia yang fana ini. Selanjutnya baginda mengatakan, ``Ada pun anak-anak sulbi saya tiadalah yang kebetulan kepada hati saya, yang saya hendak pindah ke Bentan, atau mana-mana tempat yang sunyi membuat ibadat.'' Adapun Raja Muhammad Yusuf di atas bukan puteranya tetapi adalah anak saudaranya. Puteranya ketika itu sedang belajar di Mekah namanya Raja Haji Muhammad atau digelar juga dengan Tengku Nong. Raja Haji Muhammad/Tengku Nong itu merupakan orang ketiga mengadakan konteks dengan alim-ulama di Mekah sesudah Raja Haji Ahmad bin Raja Haji dan Raja Haji Abdullah.

Raja Haji Abdullah Yamtuan Muda Riau ke IX jatuh sakit tumbuh bisul di belakangnya. Penyakit itu mengakibatkan ajalnya. Sebagaimana saudaranya Raja Ali ketika akan mangkat dulu sempat berwasiat dan wafat dalam kalimah zikrullah, maka Raja Haji Abdullah yang tinggi pengetahuan sufiyahnya tentu lebih daripada itu adanya. Baginda juga memanggil sanak saudaranya terutama Raja Ali Haji. Baginda juga sempat meninggalkan wasiat. Raja Ali Haji menulis, ``Maka hampirlah wafatnya, maka ia pun memanggil kekandanya Raja Ali Haji dekat-dekat dia, ia minta riba (pangku, pen:) kepalanya. Maka ia pun bercakap perlahan-lahan pada pekerjaan barzakh, iaitu ba'dal maut, serta beringat-ingatan ilmu, fatwa segala Masyaikh Ahli Thariqat...'' Kemudian ia pun minta tasbihnya diunjukkan isterinya sambil menangis, kemudian bertanya pula ia kepada Raja Ali, ``Pukul berapa ini?''.

Kata Raja Ali, ``Hampir pukul sebelas!''

Katanya, ``Uzurkah tuan hari ini? Tiada usahlah sembahyang Jumaat dahulu, ditinggalkan saja!''.

Jawab Raja Ali, ``Baiklah !''

Seketika lagi ia pun berkata, ``Sesak dada!''

Sekira-kira sampai pukul dua setengah istighfarlah ia di dalam zikir nafi itsbat zal Haq, zikir ismuz Zat. Seketika, rohnya pun berpindah dari negeri fana' ke negeri yang baqa'. Surat wasiatnya diserahkan kepada Raja Ali Haji sementara menunggu puteranya Raja Muhammad/Tengku Nong pulang dari Mekah. Ada pun wasiat itu tulisan tangan dengan huruf Melayu/ Jawi atas kertas lebar dengan khat indah sebagai yang berikut, ``Tarikh as-Sanah 1276, kepada 26 hari bulan Zulhijjah, hari Sabtu, bahawasanya kita Raja al-Haji Abdullah Yang Di Pertuan Muda membuat suatu surat wasiat ini bagi anak-anaknya. Dan pada ketika tarikh ini juga yang aku telah memberikan kepada anakku Maimunah, dan Puteri, dan Muhammad bin Abdullah dan Muhammad Thahir, daripada segala harta bendaku, yang aku tiada mempunyai sesuatu jua, tetapi selagi aku hidup ini seperti orang meminjam jua kepada anakku yang empat orang itu. Dan tiadalah boleh seseorang saudaranya mendakwakan dia adanya.

Fasal Yang Pertama: Adapun rumah dengan sampah sarapnya hak bagi Maimunah dan si Puteri. Adapun segala senjata besar-kecil hak bagi Muhammad. Syahdan dari kebun seperti Pulau Soreh pulang kepada Muhammad bin Abdullah. Dan perahu, sampan, jongkong mana-mana yang ada itu pulang kepada Muhammad bin Abdullah juga. Sebermula jika aku pulang ke rahmatullah Ta'ala, Muhammad bin Abdullah itulah jadi kuasa, dan memerintah, dan memeliharakan segala saudaranya tiada boleh anak-anakku yang lainnya, melainkan dia yang terlebih kuasa daripadanya.

Fasal Yang Kedua: Apabila sudah sampai ajalku, segala hutang aku Muhammad bin Abdullah membayarnya serta mufakat ia dengan ibunya Raja Hawi. Maka jika sudah sampai akil baligh Muhammad Thahir, jika tiada ibunya hendaklah ia mufakat dengan dia pada menyelesaikan hutang-hutang aku itu. Jikalau aku tiada terikhtiarkan yang demikian itu mufakatlah engkau kepada siapa yang menggantikan aku adanya.

Fasal Yang Ketiga: Mana-mana hutangku yang kena kepada pekerjaan kerajaan, maka iaitu Raja Mudalah yang membayarnya, seperti hutang perang atau kerana sesuatu yang lain yang hendak membaiki negeri dan belanja ``mashalihul muslimin''. Jika dengan sebab itu lazimlah Raja Muda itu membayarnya. Demikianlah adatnya selama-lamanya pusaka kita Upu Bugis.

Sathar

Fasal Yang Keempat: Jangan aku ditanam seperti raja-raja, tanamlah aku seperti menanam seorang fakir. Dan jangan aku dimandikan ramai-ramai. Taruh aku di dalam satu sathar dengan dua tiga orang yang saleh. Hawilah memandikan aku, dan janganlah aku diriba. Letakkan sahaja aku di atas suatu tempat yang suci atau di atas sarir yang terus airnya. Mandikanlah aku seperti barang yang telah disebutkan kaifiatnya di dalam kitab fikah. Dan lagi jangan engkau semua yang hidup sepeninggalan aku bersusah-susah belanja tajhiz aku. Jikalau hendak juga engkau semua mentahlilkan aku suruhlah tahlilkan dengan khalifah syeikh kita. Dan boleh engkau beri sedekah ala kadar kifayahnya. Dan jangan sekali-kali menyakit diri yang di luar syariat Rasulullah s.a.w. Hendak engkau semua turut akan jalan yang sebenarnya. Dan haji dan umrah semua selesai tiada lagi menyusahkan adanya. Adapun senjata besar kecil pulang kepada Muhammad Thahir semuanya.

Fasal Yang Kelima: Sesiapa yang menggantikan aku hendaklah engkau semua turut perintahnya. Dan jangan engkau dengki hasad kepadanya, tiada selamat. Dan engkau semua kerjakanlah dia dengan cuci putih hati kepadanya, inilah jalan orang yang baik-baik. Apa yang ada sampah sarap yang aku tinggalkan kepada kamu, jikalau Raja Muda itu berkehendak jangan sekali-kali ditahan adanya.

Fasal Yang Keenam: Engkau semua adik beradik jangan sekali menaruh hasad dan dengki sesama sendiri. Dan jangan bercerai engkau semua dari jalan mufakat dengan saudara-saudaramu yang lain seperti anak Marhum Abdur Rahman, dan anak marhum Raja Ali kerana adalah Marhum kedua itu saudara syaqiqah, yakni saudaraku seibu sebapa adanya.

Fasal Yang Ketujuh: Jangan engkau semua tiada mendengar nasihat ajaran ulama dan shulaha' jika engkau tiada kuasa menuntut kepadanya. Maka jika engkau kuasa menuntut, maka inilah yang sangat gemar dan tuntutku. Kerana tersebut di dalam hadis Nabi s.a.w. Ertinya: ``Menuntut ilmu fardu atas tiap-tiap Islam laki-laki dan Islam perempuan''. Tiada aku panjangkan pada fadilat menuntut ilmu itu melainkan jikalau Allah bukakan hatimu pada menuntut itu ialah yang sebaik-baik jalan dan nikmat yang tiada dapat dibagaikan fid dun-ya wal akhirah.

Fasal Yang Kelapan: Sayugianya engkau merendahkan diri kepada pangkat saudara tua atau pangkat bapa kepadamu. Hendaklah engkau ber''patik'' jikalau serupa gara sekalipun umpamanya. Dan engkau dengar juga akan nasihatnya dan segala ajarannya yang patut pada syarak dan adat.

Fasal Yang Kesembilan: Pesanku kepada kamu sekalian, hendaklah kamu memuliakan anak cucu Rasulullah s.a.w. apa lagi yang sudah jadi kaum kerabat kita; jangan sekali-kali hasad dengki akan dia, seperti abang ``Embong'' dan abang ``Syeikh Engku'' hendaklah engkau jadikan ia seperti saudaramu yang betul adanya.

Fasal yang kesepuluh: Jangan membangsat dan serta rapik pinta meminta kepada segala rakyat raja, inilah pesan datuk nenek moyangku, pantang yang tiada boleh dilalui juga, tiada selamat dunia akhirat kerana banyak daripada beberapa kebinasaan mendatangkan murka Allah Taala Yang Maha Besar.

Inilah wasiat yang aku tahshishkan kepada Muhammad Abdullah al-Khalidi. Bermula hendaklah kiranya engkau ingatkan baik-baik sepeninggal aku mati''.

http://utusan.com.my/utusan/archive.asp?y=2005&dt=0124&pub=utusan_malaysia&sec=bicara%5Fagama&pg=ba_01.htm&arc=hive

Wednesday, January 05, 2005

Fedora tanpa X-window

Mudah sahaja....
taipan init 3 pada command promp (pastikan anda adalah root) atau tekan kekunci "a" pada kernel grub dan "3" pada parameter yang diminta.


Tuesday, January 04, 2005

Set Path dalam redhat/Fedora

edit fail /etc/profile menggunakan vi editor
taipkan
pathmunge /usr/local/namadir dalam fail tersebut
simpan dan keluar (:wq)

Mengistall Fedora ?

Mengistall Fedora core 2 ?

Tiba tiba CD tak boleh pakai pulak. Dah dicuba 2 3 kali masih fail lagi nasib baik kat network server ada salinan Fedora.
Comman yang digunakan untuk mengistall fedora menggunakan ftp server.

Mula mula masukkan CD fedora untuk boot. Kemudian taipkan

Linux askmethod

Kemudian masukkan nama ftp server dan direktori yang mengandungi intalller tersebut.
Kemudian ikut arahan seperti biasa
yesss ... done

Wednesday, December 29, 2004

dns lookup menggunakan JNDI

import javax.naming.*;

import com.sun.jndi.dns.*;
import java.util.Hashtable;

public class TestDNS {
public static void main(String[] argv) {
Name cn = null;
String name = argv[0];
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.dns.DnsContextFactory");
env.put(Context.PROVIDER_URL, "dns://IP for DNS Server/");

try {
// Create the initial context
Context ctx = new InitialContext(env);
// print the fully qualified name (.)
System.out.println("Name in namespace: "+ctx.getNameInNamespace());
// retrieve the parser associated with the named context
NameParser np = ctx.getNameParser(ctx.getNameInNamespace());
if (argv.length != 1) {
System.out.println("Usage: java TestDNS ");
System.exit(-1);
}
// parse the name into its components and print them
cn = np.parse(name);
System.out.println("Name is: "+cn.toString());
System.out.println("The parsed name has "+cn.size()+" components:");
for (int i=0; i lt cn.size(); i++){
System.out.println(cn.get(i));
}
System.out.print("Trying to lookup ");
// get the prefix (domain) and suffix (hostname)
Name domain = cn.getPrefix(cn.size()-1);
Name host = cn.getSuffix(cn.size()-1);
System.out.println("DNS Host: "+host+" Domain: "+domain);
// retrieve the named object
Object obj = ctx.lookup(domain);
System.out.println(domain.toString()+" is bound to: "+obj);
// retrieve and print the environment in effect
System.out.println("Domain properties: "+ ((Context)obj).getEnvironment());
// retrieve and print the IP address (the DNS A records)
System.out.println("IP for: "+cn+ " is: "+
((DnsContext)obj).getAttributes(host, new String[]{"A"}));

// we're done so close the context
ctx.close();
} catch (NamingException e) {
System.err.println("Problem looking up " + cn + ": " + e);
}
}
}

Before you run this application, make sure you specify the IP address for the DNS server.

Here is a sample run:

prompt> java TestDNS prep.ai.mit.edu


Name in namespace: .
Name is: prep.ai.mit.edu
The parsed name has 4 components:
edu
mit
ai
prep
Trying to lookup DNS Host: prep Domain: ai.mit.edu
ai.mit.edu is bound to: com.sun.jndi.dns.DnsContext@b89838
Domain properties: {java.naming.provider.url=dns://IP for DNS Server/, java.namin
g.factory.initial=com.sun.jndi.dns.DnsContextFactory}
IP for: prep.ai.mit.edu is: {a=A: 199.232.41.9}

Friday, December 24, 2004

Macamana nak set path dalam linux ? (BI)

Untuk meliahat path semasa...
echo $PATH

Untuk menambah patah:

export PATH=$PATH:/sbin
untuk tengo keputusan...
echo $PATH

/usr/local/bin:/bin:/usr/bin:/home/myname/bin:/sbin

Tetapi ini hanya untuk sesi tersebut sahaja. Untuk memastikan path kekal pada setiap sesi anda perlu mengedit file bash_profile

Tukar ke direktori anda dan taikan vi .bash_profile. Kemudian cari penyataan dibawah dalam fail tersebut

PATH=$PATH:$HOME/bin

Kemudian taip i untuk edit file

tambahkan direktori yang diperlukan
dan escape dan wq untuk menyimpan fail.

Thursday, December 23, 2004

The Grinder 3 & Web Application load testing (BI)


Web Applications have a wide range of user populations. It is not uncommon to have tens of thousand of visitors hit a site during a week. One really needs to know if the application can perform under a load and what level of load. This type of testing is know as load testing. There are several load testing tools available. The industry standard tool is Mercury Interactive’s Load Runner. I’ve seen it, and I’d recommend it. Unfortunately, I haven’t had the chance to use it, but I’ll recommend the business case again next year. In the meantime, one tool that I recently tried out with CFMX is The Grinder.

The grinder is an open source load testing framework. I went very out of character and utilized the Beta version, grinder 3, because it uses Jython to write scripts. With the grinder 3, you can load test anything; databases, messaging services, web apps, web services, etc. I’m hoping to utilize the grinder 3 to load test Quovadx/Cloverleaf Interface Engine, the Siemens Soarian Clinical Access, Crystal Enterprise 10, 3M’s Encoder, and several other applications.

Installing the Grinder 3

1. First ensure java is installed on the machine where you will be running the scripts. If not, please download from here.
2. Download and unzip the grinder 3 from here.
3. Download the jython2.1 class file.
4. Add the grinder.jar to your CLASSPATH variable.
- Set CLASSPATH=%CLASSPATH%;c:\grinder-3.0-beta23\lib\grinder.jar
5. Install the jython2.1 class file.
- Java jython2-1
Aside: Remember the directory and set it in the grinder.properties file

To get into the Grinder console, run java net.grinder.Console. You can find more about the console here. I'm not very big on the GUI, but it does its job.


Recording Web App test scripts
Hand coding the test scripts would get to be very trying in a very short time. In order to maintain one’s sanity, exploit the TCPProxy httpplugin to record scripts.

1. First, set up IE to temporarily use a proxy server.
- Menu -> Tools -> Internet Options -> Connections tab
- Click on Lan Settings button
- Check the use a proxy server for your lan setting
- Click on Advanced button
- Set the http proxy address to use to be localhost, port 8001
- Set the secure proxy address to use to be localhost, port 8001

ProxySettings.gif

2. Fire off the TCPProxy within grinder.
- java net.grinder.TCPProxy –console –httpplugin

TCPProxy.gif


3. Surf away with the IE session, and you will have all actions recorded.
4. Click Stop Recording on the TCPProxy Window, when you are done.
5. Remove the changes to the IE Browser, unchecking using a proxy server.
6. You will notice within the directory there is a httpscript.py and a httpscript_tests.py file. These are your test scripts.

A quick aside point is that if you don’t want to switch setting, one could always leave ie in the record mode and surf the web with firefox.


Running the test scripts
A key thing to remember when you are running your test scripts, set up multiple grinder sessions on multiple machines. This way everyone isn’t using the same network interface.

1. Set up resource monitoring with performance monitor on the server, and client machine.
2. To run the grinder test scripts;
- In the same directory have a grinder.properties, this file contains the configuration settings
- Also within that directory, have the script you would like to run. For our example, find the httpscript.py and httpscript_tests.py files.
- run java net.grinder.Grinder, from that directory.

The settings in the grinder.properties file are:
#
# Example grinder.properties
#

# Set the jython class directory
grinder.jvm.arguments=-Dpython.home=c:\jython-2.1

#Set the worker processes, with threads, and runs.
#So for this example, I have 10 worker processes with 20 threads each.
#They will cycle 100 times.
grinder.processes=5
grinder.threads=3
grinder.runs=100

#don’t use the console.
grinder.useConsole=false

#The directory which logs the results, and the number of old results to keep.
grinder.logDirectory=log
grinder.numberOfOldLogs=2

#grinder.initialSleepTime=500
#grinder.sleepTimeFactor=0.01
#grinder.sleepTimeVariation=0.005

grinder.script=httpscript.py


I’m hoping grinder is going to be an easy to setup load testing in a systematic way. Our first shot out of the door will be Crystal Enterprise 10 this week. (stay tuned)


Places that helped
WebSite:
The grinder 3 manual
Dan Moore’s the grinder
Open Testing Reviews The Grinder
The HTTPClient Info
The grinder loadtesting for everyone

NewGroups
grinder-announce: Low-volume notifications of new releases
grinder-use: The place to ask for help
grinder-development: For those interested in developing The Grinder

sumber asal http://www.anticlue.net/archives/000395.htm