Kegembiraan sedikit terganggu dikarenakan error 0x0000007B yang muncul ketika meng-install Windows XP. Saya gembira karena berkat kebaikan hati istri saya maka saya dapat memiliki laptop baru yang super canggih. Kebahagiaan sedikit terganggu karena ada blue screen error ketika coba ngin-stall windows xp di laptop baru itu. Berikut adalah kronologis dari error tersebut dan bagaimana usaha yang saya lakukan untuk terbebas dari error tersebut. (note: semoga ada yang terbantu dengan cerita ini dan semoga juga ada orang yang lebih berkompeten di bidang per-hardware-an ini yang mau memberi komentar)
Sepulang dari "Ratu Plaza", kardus laptop "Compaq Pressario CQ20" saya bongkar. Processor 2.0 GHz dan RAM 3 GB berhasil membuat muka saya berseri-seri, soalnya buat saya spek tersebut sudah terbilang super canggih. Saya kemudian menyalakan laptop tersebut dan langsung meng-install windows XP. Tanpa berfikir buruk sebelumnya, saya tungguin proses loading file-file untuk proses installasi. "Beung!!!" tiba-tiba muncul blue screen error, sontak mulut bergumam: "waduh kenapa niy?". Masih tanpa berfikir buruk sangka saya bergumam lagi: "oh.. mungkin masih belum panas kali" (halah ada2 aja) sambil mengulangi proses installasi.
"Beung!!!" buset muncul lagi!!!. dengan hati yang mulai "bete" saya ulangi lagi dan lagi tapi tetep hasilnya, buruk!!!. Hati menggerutu: "kacau niy tukang laptop, katanya barang bagus". Mau dibalikin lagi ke Ratu Plaza sudah kemaleman. Dengan hopeless, coba menelusuri BIOS dan berharap ada setingan yang bisa dilakukan. Setelah bolak-balik dilihat, perhatian kemudian terfokus pada tulisan "SATA Device Mode". Setelah merenung dan flashback ke masa lalu ketika mulai pertama kali bongkar-bongkar komputer dan bolak-balik nginstall windows bajakan, saya teringat bahwa setingan untuk hardisk itu selalu ke "IDE". Tapi kenapa ini ke AHCI, apa pula AHCI ini?. Daripada pusing, enggak ada salahnya untuk nyobain proses jaman jadul yaitu IDE yang dipilih. Alasan teknis dibelakang semua ini? blank, enggak tau.
Proses installasi windows XP saya coba lagi. Alhamdulillah..!!! berhasil!!! cihuy.. yipie.. yes yes yes akhirnyaaa. Masih enggak tahu alasan teknis dibalik semua ini, enggak apa-apa, yang penting sudah bisa diinstall. Sambil nunggu nginstall beres, coba untuk googling2 dikit dan menuliskannya di blog biar inget terus. Menurut hasil googling, katanya, laptop jaman sekarang sudah dilengkapi hardisk berteknologi SATA dan si SATA itu katanya enggak dikenali oleh si windows. Saya masih belum "mudeng" juga, enggak apa-apa lah, yang penting proses installasi di laptop sudah bisa jalan. Berikut adalah beberapa artikel yang berhasil saya temukan ketika googling berkaitan dengan hal diatas:
1. Microsoft
2. Anugrah Pratama Blog
3. Wikipedia
4. Tom's Hardware
Teknik Single Sign On akan memungkinkan user untuk hanya melakukan satu kali login/logout saja. Misalkan Anda mengoperasikan tiga buah portal yang masing2 memiliki fungsionalitas, tujuan dan teknologi yang berbeda-beda, maka Anda dapat menyediakan kemudahan kepada user dengan cara membiarkan user untuk hanya melakukan satu kali login saja untuk dapat menggunakan ketiga buah portal tadi. Login pada portal A, dan kemudian otomatis ter-login juga pada portal B dan portal C. Contoh yang paling dekat adalah single sign on antara portal geeks dan WSS-Id yang telah dijelaskan oleh welly di blognya.
Seperti yang telah umum dilakukan, cookies digunakan untuk memelihara informasi seorang user, sesaat setelah dia berhasil di authentikasi. Dengan bermodalkan premis diatas, maka dapat dikatakan bahwa Single Sign On dapat diimplementasi dengan menggunakan cookie dengan cara membuat sebuah cookie yang dikenali dan dapat diakses oleh portal-portal lainnya. Dibawah adalah contoh gambaran implementasi Single Sign On:

AP adalah kependekan dari authentication provider. AP dapat berupa sebuah server yang akan melakukan proses authentikasi yang mana hasil dari authentikasi dapat dikirimkan via HTTP Response. Sedangkan informasi2 credentials yang hendak di authentikasi dapat dikirimkan via HTTP Request. Informasi yang dikirim via HTTP Response dapat digunakan untuk membuat sebuah cookie yang direncanakan untuk dapat diakses dan dikenali oleh portal2 lainnya.
Proses Login
Secara sederhana, proses login dapat diisi oleh code yang melakukan HTTP Request pada authentication provider. Informasi credentials dapat dikirimkan via HTTP Request tersebut. Authentication provider kemudian dapat diatur untuk dapat mengirimkan informasi2 tertentu via HTTP Response yang mana informasi2 tersebut dapat digunakan untuk membuat cookie. HTTP Request dapat dilakukan dengan menggunakan System.Net.HttpWebRequest (Tolong bedakan dengan System.Web.HttpWebRequest). System.Net.HttpWebRequest digunakan karena dalam skenario SSO ini, portal adalah merupakan sebuah client yang hendak mengakses AP.
private void SSOLogin()
{
//data requeststring postData = "id=id&pwd=password";
System.Text.
ASCIIEncoding encoding = new System.Text.ASCIIEncoding();byte[] data = encoding.GetBytes(postData);
//make a requeststring ap_url = "http://josso.batujajar.co.id/josso.do";
System.Net.HttpWebRequest req = System.Net.WebRequest.Create(ap_url);
req.Method = "POST";req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = data.Length;
//send the requestSystem.IO.Stream reqStream = req.GetRequestStream();
reqStream.Write(data, 0, data.Length);
reqStream.Close();
//catch the response
System.Net.HttpWebResponse resp = (System.Net.HttpWebResponse)req.GetResponse();
System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());string results = sr.ReadToEnd();
sr.Close();
//create cookieHttpCookie cookie = new HttpCookie("xyz");
cookie.Domain =
".batujajar.co.id";cookie.Path = "/";cookie.Name = "xyz";
cookie.Value = GetTicketID(results);
cookie.Expires = System.DateTime.Now.AddDays(+1);
Response.Cookies.Add(cookie);
}
private string GetTicketID(string str)
{
//get the ticket id
}
kode diatas akan melakukan HTTP Request pada authentication provider (yang kebetulan di develop dengan menggunakan java sehingga berakhiran .do). HTTP Response kemudian digunakan untuk membuat cookie. Agar cookie dikenali dan dapat diakses oleh domain tertentu saja, maka property Domain dari cookie diisi.
Proses Logout
Peristiwa yang terjadi pada proses logout adalah dengan cara menghancurkan cookie sehingga semua portal tidak dapat menemukan cookie dan kemudian portal akan logout. Cookie dihancurkan dengan cara meng-ekspire-kan cookie tersebut.
private void SSOLogout()
{
//...cookie.Expires = System.DateTime.Now.AddDays(-1);
//...
}
Menambahkan sebuah website baru via IIS 6 adalah mudah, tinggal klik sini dan klik sana maka semua beres. Namun berbeda kasusnya di IIS 5 karena IIS 5 tidak memiliki semua kemewahan yang dimiliki IIS 6 tersebut. yang termudah bisa dilakukan di IIS 5 adalah menambahkan virtual directory. Namun, jika virtual directory bukan merupakan tujuan yang hendak dicapai maka menambahkan sebuah website baru di IIS 5 ternyata dimungkinkan.
Beruntung saya menemukan blognya Mukul Agarwal dalam usaha peng-googlingan saya. Dalam blog tersebut dipaparkan bagaimana caranya untuk menambahkan sebuah website baru pada IIS 5. Ide yang digunakan adalah membuat sebuah website baru dengan menggunakan utilitas adsutil.vbs lalu kemudian menerapkan setingan2 "default website" terhadap si website baru tersebut dengan cara meng-copy "default website" dan mem-paste-kannya ke website baru. Website dikenali melalui service W3SVC. Identitas si website ditunjukan oleh angka yang mengiringi service W3SVC, sehingga sebagai contoh "default website" dapat dicirikan dengan W3SVC/1. angka satu muncul karena, "default website" adalah website kesatu yang ada di IIS. Untuk mencirikan website baru, bisa digunakan angka 2 (atau angka lainnya) sehingga dicirikan dengan W3SVC/2.
berikut adalah langkah-langkah yang dipaparkan di blognya Mukul Agarwal untuk menambahkan sebuah website baru di IIS 5:
1. buka IIS manager dan kemudian "stop" default website.
2. buka command prompt (cmd) dan masuk ke folder "c:\inetpub\adminscripts"
3. untuk melihat semua website yang telah ada di IIS, ketikan "adsutil.vbs enum w3svc/p" di cmd.
4. untuk membuat website baru di IIS, ketikan "adsutil.vbs create w3svc/2" di cmd. note: angka yang digunakan tidak harus angka 2, angka tersebut adalah index yang akan mencirikan website baru yang hendak dibuat.
5. copy-kan struktur dan setingan "default website" pada website baru dengan cara mengetikan "adsutil.vbs copy W3SVC/1 W3SVC/2" di cmd.
6. dengan menggunakan IIS manager, rename website yang baru terbuat dengan nama apapun yang diinginkan dan kemudian tembakan "Home Directory" ke folder yang digunakan untuk menampung file website.
Sering kali saya lupa dengan error yang satu ini yaitu: 'dbo.GetPortalAliasByPortalID' doesn't exist. Error ini selalu muncul ketika saya coba memindahkan sebuah portal DNN dari satu mesin ke mesin lainnya. Saya memindahkan dengan cara mem-backup Databasenya dan kemudian me-restore-nya di mesin yang baru. Karena panik, saya suka nanya solusinya ke mbah nya DNN di londo sono, dan dia selalu datang dengan jawaban yang mantap. Agar saya tidak terus2an nanya ke si mbah maka saya tulis aja, biar inget terus dan mungkin bisa jadi pengingat juga buat temen2 DNN developer yang lain.
Jika melihat Error ini: 'dbo.GetPortalAliasByPortalID' doesn't exist. make sure untuk melakukan hal2 di bawah ini:
1. Please make sure: user, password, nama server dan nama database yang ditulis di web.config adalah benar. harus benar-benar di make sure bahwa informasinya benar dan benar cara nulisnya. coba di test informasi user dan password nya dengan cara login ke MS SQL Management Studio dengan menggunakan user dan password yang bersesuaian.
2. Please make sure: si user sudah menjadi db_owner dari database yang bersangkutan. 'dbo.GetPortalAliasByPortalID' doesn't exist belum berarti stored procedurenya enggak ada, tetapi si user tidak dapat meng-akses stored procedure tersebut. Coba cek kembali properties si user dan kemudian lihat di User Mapping nya. Coba pastikan untuk Database yang bersesuaian si user sudah menjadi db_owner nya.
sudah saya tuliskan. mudah-mudahan saya tidak lupa-lupa lagi. amin. :-)
Hari minggu (21 Desember 2008) kemaren merupakan hari yang luar biasa buat saya. Saya bisa bertemu langsung "face to face" dengan seseorang yang memang dari dulu pengen saya temui. Saya bahkan, harus nelpon istri saya dulu untuk ijin tidak pulang ke bandung, agar bisa menghadiri sebuah event yang digelar oleh temen-temen dari MIFTA yang menghadirkan "sang pedjoeang" sebagai keynote speaker.
Adalah dia, Romi Satria Wahono, "sang pedjoeang" yang ingin saya temui secara langsung sudah sejak lama. Kenapa harus bung Romi ? yes, for me, he is a living legend. Bagaimana tidak ? melalui "perdjoeangannya" lah situs www.ilmukomputer.com yang fenomenal itu lahir. Sebagai solusi murah dan mudah dalam hal memperoleh pengetahuan yang mana, di negara kita yang tercinta ini, murah dan mudah adalah dua komponen yang sangat langka sekali. Saya jadi teringat ketika awal masa kuliah dulu, saat-saat ketika saya mulai memiliki sedikit ketertarikan ke dunia IT. Jalan-jalan ke salah satu toko buku paling terkenal di negeri ini, melihat-lihat koleksi buku komputer yang mereka miliki. Namun sayang, harga yang tertampang di buku tidak terlalu bersahabat dengan dompet dan segala isinya yang saya miliki. Beruntung, salah satu teman saya, memperkenalkan www.ilmukomputer.com pada saya dan alhamdulillah.. the magic starts to work :-)
Hari minggu itu (21 Desember 2008), Romi Satria Wahono "membeberkan" semua rahasia suksesnya dengan cara merangkumkan perjalanan "perdjoeangan" yang telah dilalui. Rangkuman cerita dimulai dari kedatangan "sang pedjoeang" ke tanah air dan diakhiri dengan cerita kondisi terakhir "sang pedjoeang" per desember 2008. Sungguh beruntung sekali saya bisa menghadiri dan mendengarkan paparan dari "sang pedjoeang" langsung yang dimulai dengan membahas bukunya Thomas L. Friedman yang terkenal itu The World is Flat. Pemaparan ditutup dengan sesi tanya jawab yang diakhiri dengan break dan lunch. Pada saat break ini lah, saya kemudian berdiri dan mendekati podium, kemudian mengajak jabat tangan sang pedjoeang sambil memperkenalkan diri. Saya bertanya pada beliau, "apakah Anda bener2 mengurangi tidur?" "Apakah Anda benar2 meluangkan hanya sedikit sekali waktu untuk tidur, sekitar tiga jam-an?" dan beliau menjawab dengan antusias sekali "Ya!!!". Sambil makan siang, kita berbincang dan beliau membagi tipsnya tentang "mengurangi waktu tidur". Man, body size saya dengan sang pedjoeang tidak beda jauh tipis, tapi bedanya, saya banyak sekali meluangkan waktu untuk tidur, sedangkan beliau tidak, hehehe. Makanya sangat tidak heran, prestasinya juga sangat jauh berbeda, seperti langit dan bumi. Andai prestasi bisa ditentukan oleh ukuran tubuh, secara berat badan saya adalah 9* kg, hahaha.
Terimakasih untuk Romi Satria Wahono, karena telah rela membagi rahasia suksesnya dan memberikan kesempatan berbincang-bincang yang sangat menarik sekali.
Terimakasih untuk MIFTA karena telah mengadakan sebuah acara yang sangat luar biasa sekali, acara yang sangat bermutu yang sangat menyenangkan dan penuh kekeluargaan dan kehangatan. Ditunggu undangan untuk next eventnya :-)
saya akhiri postingan OOT ini dengan sebuah kalimat yang saya dengar langsung dari sang pedjoeang yang saya copy paste dari friendster sang pedjoeang sendiri.
Aku akan tunjukkan jalan para legenda, jalan cinta yang abadi, dan inilah jalan cinta para pedjoeang :)
Seorang teman saya menanyakan ke saya tentang bagaimana caranya nge-host DotNetNuke website kesayangannya pada sebuah "Shared Hosting Server". Kemudian saya menjanjikan pada beliau untuk menjawabnya via blog geeks ini. And.. here it is.. special for you my dear friend at GAC (www.gacworld.com) 
Untuk memindahkan sebuah website DotNetNuke pada sebuah "Shared Hosting Server", ada dua hal yang mesti dilakukan:
1. Memindahkan file-file Website DotNetNuke
2. Memindahkan Database yang bersangkutan
note: thanks to rudy from www.erudeye.net for your guidance on this one 
Berikut adalah langkah-langkah yang pernah saya alami dalam memindahkan sebuah website DotNetNuke pada sebuah "Shared Hosting Server" yang mana menggunakan jasanya temen-temen dari erudeye.
note: untuk yang ingin mecobanya, pastikan Anda sudah memiliki account di "shared hosting server"
1. Login dengan menggunakan account yang Anda miliki

2. Melalui HELM, buatlah account FTP yang akan digunakan nanti untuk meng-upload file-file DotNetNuke Website.
saya menggunakan FileZilla untuk mengupload file-file DotNetNuke Website yang saya Zip menjadi sebuah file saja. Kemudian, file zip tersebut saya unzip ke folder wwwroot yang telah disediakan oleh si penyedia jasa hosting.

3. Buatlah Database dan User yang bersesuaian dengan Database tersebut via HELM

4. Script Database Lokal Anda
Script Database lokal Anda. Untuk melakukan hal ini saya menggunakan tools yang disebut "Database Publishing Wizard" dapat di download di: http://www.microsoft.com/downloads/details.aspx?familyid=56E5B1C5-BF17-42E0-A410-371A838E570A&displaylang=en
5. Running Script Database
Setelah langkah empat di lakukan. Buka SQL Server Management Studio Anda. Kemudian, dengan menggunakan SSMS Anda akseslah database yang telah di buat pada langkah tiga diatas. Dengan menggunakan script yang didapat pada langkah empat, jalankan script tersebut pada database yang telah dibuat pada langkah tiga.
selesai 
Pada artikel ini, saya akan mencoba untuk berbagi tips tentang membaca file resources (.resx) dengan menggunakan xPath. Kenapa bisa? yes, karena sesungguhnya file resources (.resx) adalah merupakan dokumen XML dan xPath adalah bahasa yang digunakan untuk mendapatkan informasi dari dokumen XML. Informasi tentang xPath dapat di baca lebih jauh di: http://www.w3schools.com/XPath/default.asp
Beruntung untuk fans nya .NET karena .NET sudah menyediakan kelas-kelas yang dapat di gunakan secara "out of the box" sehingga doing "XML thing" dan "xPath thing" menjadi lebih mudah. Kelas-kelas yang akan saya gunakan adalah:
1. kelas XPathDocument yang merupakan "representasi" dokumen XML. Dokumen XML yang di representasikan oleh kelas XPathDocument ini menggunakan model data XPath sehingga saya bisa menggunakan kelas dibawah ini untuk mencari informasi didalamnya. Untuk informasi lebih lanjut mengenai XPathDocument dapat di baca di: http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathdocument.aspx
2. kelas XPathNavigator merupakan sebuah kelas yang dapat digunakan untuk bernavigasi pada dokumen XML yang menggunakan model data XPath. Untuk informasi lebih lanjut mengenai XPathNavigator dapat dibaca di: http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathnavigator.aspx
Informasi lebih lengkap tentang cara memproses data XML dengan menggunakan model data XPath dapat dibaca di: http://msdn.microsoft.com/en-us/library/87274khy.aspx
action!!!
berikut adalah contoh file resources yang saya gunakan dalam POC:

Dan berikut adalah source code yang digunakan untuk membaca file resources diatas dengan menggunakan model data XPath
protected void Button3_Click(Object sender, EventArgs e)
{
string resourceFile = "~/App_LocalResources/ResourceTest.resx";
string resourceFilePhysical = Server.MapPath(resourceFile);System.Xml.XPath.XPathDocument xmlDoc = new System.Xml.XPath.XPathDocument(resourceFilePhysical);
System.Collections.
Hashtable hasil = new System.Collections.Hashtable();foreach (System.Xml.XPath.XPathNavigator nav in xmlDoc.CreateNavigator().Select("root/data"))
{
if (nav.NodeType != System.Xml.XPath.XPathNodeType.Comment)
{
hasil[nav.GetAttribute("name", string.Empty)] = nav.SelectSingleNode("value").Value;
}
}
}
dapat dilihat di source code diatas, bagaimana XPathDocument dan XPathNavigator beraksi. Informasi yang didapatkan kemudian saya simpan di hashtable.

Mengambil pelajaran dari seseorang yang sudah proven dan well known adalah hal yang menurut saya sangat penting. Dengan mencoba memahami rute yang telah di lalui oleh para pakar, akan menjadikan saya sebagai "new generation" menjadi sosok pribadi yang lebih berwawasan. Mempelajari, Memperbaiki dan Menyempurnakan. Hal yang sama terjadi pada teknologi yang sekarang ini sedang saya geluti yaitu web platform, web framework dan CMS. Dalam hal ini, saya mencoba untuk mengambil pelajaran dari salah satu CMS yang sudah sangat terkenal yang memiliki pengguna yang sangat banyak sekali. Yep, CMS yang saya maksud adalah Joomla yang beberapakali menjadi nominasi dan menjuarai best overall CMS. Saya merasa sangat penting untuk mencoba mencicipi Joomla dan mendapatkan "user experience". Tujuannya adalah demi memperbaiki, mengembangkan dan menyempurnakan "mainan" yang sedang saya oprek yaitu DotNetNuke.
Untuk dapat melakukan hal tersebut, saya harus bisa menginstall dan menjalankan Joomla di Windows XP saya. Beruntung saya bisa menemukan XAMPP (Apache) sehingga saya bisa dengan mudah menginstall dan mencoba-coba fitur2 Joomla.
Namun demikian, ada beberapa trik yang harus di lakukan agar XAMPP dan IIS dapat hidup berdampingan dengan damai dan harmonis. Sebelum saya menerapkan tips and trick tersebut, saya tidak dapat menjalankan XAMPP saya di Windows XP. Masalah utamanya adalah telah digunakannya port default oleh IIS. Tips and trick saya dapatkan dari Williamo's Blog. Adapun uraiannya adalah sebagai berikut: (saya menginstall XAMPP di folder C:\xampp\ )
1. Edit file httpd.conf yang dapat di temukan di C:\xampp\apache\conf:
- ganti "Listen 80" dengan "Listen 8080"
- ganti "ServerName localhost:80" dengan "ServerName localhost:8080"
2. Edit file httpd-ssl.conf yang dapat di temukan di C:\xampp\apache\conf\extra:
- ganti "Listen 443" dengan "Listen 4499"
- ganti "VirtualHost _default_:443" dengan "VirtualHost _default_:4499"
- ganti "ServerName localhost:443" dengan "ServerName localhost:4499"
setelah kedua file diatas di edit, maka XAMPP yang saya install di Windows XP kemudian dapat berjalan dengan baik:

dan berikut adalah Joomla in action:

Keamanan merupakan hal yang sangat penting dan tidak terbantahkan lagi. Pengiriman informasi penting dari client ke server dirasakan kurang aman jika menggunakan jalur HTTP. Munculah SSL yang berupaya menjadi solusi. Cerita selengkapnya mengenai SSL dapat di baca di: http://www.wisegeek.com/what-is-ssl.htm
Berangkat dari sana, maka saya akan mencoba untuk menerapkan SSL pada DotNetNuke dan coba tebak apa? yes, ternyata mudah sekali untuk menerapkan SSL di DotNetNuke :-) berikut adalah langkah-langkahnya:
1. Miliki certificate SSL dari vendor terpercaya
yep, sebelum dapat melangkah jauh, maka harus dimiliki terlebih dahulu SSL certificate untuk diinstallkan pada server production. Karena belum mampu beli, saya menggunakan SSL certificate trial yang dikeluarkan oleh vendor terkemuka yaitu verisign. Untuk memperoleh SSL certificate versi trial dapat mengunjungi http://www.verisign.com/ssl/buy-ssl-certificates/free-ssl-certificate-trial/index.html
setelah certificate SSL di dapatkan, maka installkan certificate tersebut pada web server. Untuk POC kali ini, saya menggunakan IIS 5.1 adapun langkah-langkah installasi certificate SSL pada IIS 5.1 bisa ditemukan di: http://www.petri.co.il/configure_ssl_on_your_website_with_iis.htm
2. Setup DotNetNuke agar SSL Enable
setelah web server ready maka tiba saatnya untuk setup di DotNetNuke, langkah-langkahnya:
- login sebagai Host, karena dengan user Host ini maka opsi SSL Settings dapat terlihat
- Masuk ke Admin > Site Settings > Advanced Settings > SSL Settings kemudian pilih SSL Enabled

- Masuk ke page yang hendak diamankan biasanya page-page untuk transaksi eCommerce. Di page tersebut masuk ke Page Settings > Advanced Settings > Other Settings dan kemudian pilih secure. And done!!! simple isn't it :-)

3. Setup Browser
karena POC kali ini pake Certificate SSL trial, maka si browser harus diinstal Test Root CA Certificate. Untuk certificate yang berbayar, hal ini tidak usah dilakukan di browser clients nanti repot ;-) . Silahkan visit http://www.verisign.com/server/trial/faq/index.html untuk informasi tentang how to install Test Root CA Certificate.
finish!!!
berikut adalah screenshot DNN SSL in action:

Seorang teman memberitahukan saya bahwa di codeplex ada sebuah projek Google API yang sangat bagus. Nama projek tersebut adalah Gapi.NET yang notabene merupakan .NET wrapper (C#) untuk Google API. See the full story at: http://www.codeplex.com/GAPIdotNET
Karena malam ini lagi ngoprek Custom Google Search Engine maka saya gunakan kemampuan si Gapi.NET untuk membuat google search. Berikut adalah skenario POC nya: Saya membuat google search dengan menggunakan Gapi.NET. Google search yang saya buat hanya akan menampilkan 80 item pertama. Hasil pencarian saya tampung dalam DataTable yang kemudian saya isikan pada GridView. Dengan GridView, kita bisa meng-cutomize hasil pencarian sehingga bisa lebih ok.
Dengan menggunakan Gapi.NET, yang harus dilakukan adalah membuat handler untuk button searchnya. berikut adalah potongan source code untuk handler button search:
protected void Zoeken_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable("Table");dt.Columns.Add("Title");
dt.Columns.Add(
"Content");dt.Columns.Add("URL");for (int j = 0; j < 10; j++)
{
Gapi.Search.
SearchResults srs = Gapi.Search.Searcher.Search(Gapi.Search.SearchType.Web, TextBox1.Text, j);Gapi.Search.SearchResult[] arrHasil = srs.Items;for (Int32 i = 0; i < arrHasil.Length; i++)
{
dt.Rows.Add(arrHasil
.Title, arrHasil
.Content, arrHasil
.Url);
}
}
GridView1.DataSource = dt.DefaultView;
GridView1.DataBind();
}
Gapi.NET in action:

Google memiliki layanan yang disebut Google Custom Search Engine. Dengan layanan ini maka dimungkinkan untuk memiliki “search engine” yang sesuai dengan kebutuhan, plus memiliki ketangguhan yang dimiliki oleh google. Untuk informasi lebih lengkap silahkan baca di http://www.google.com/coop/cse/
Pertanyaan yang muncul adalah, bagaimana implementasi Google Custom Search di halaman ASP.NET ? just stick with this article J
Ada banyak cara untuk menampilkan google custom search engine di halaman web site, bahkan google sendiri membuat langkah2 yang sudah sangat jelas. Namun demikian langkah berikut adalah langkah yang saya ambil dikarenakan pendekatan yang dilakukan cocok dengan kebutuhan saya saat ini yaitu membuat pluggable module. Ok, berikut adalah yang saya lakukan:
1. Membuat Account di Google Custom Search Engine
Sebagai langkah awal yang harus dilakukan adalah medaftar di google custom search engine dan kemudian dapatkan code untuk menampilkan search results. Ada beberapa opsi yang ditawarkan untuk menampilkan hasil pencarian. Saya memilih opsi untuk menampilkan search result di website saya sendiri alih-alih menampilkannya di halaman google.

2. Membuat Search Box dan Result Box
Tidak akan sempurna sebuah halaman search tanpa adanya search box dan result box J jadi langkah berikutnya adalah mempersiapkan keduanya. Saya menjadikan search box dan result box dalam satu halaman yang sama. Karena akan di tampilkan dalam satu halaman, search box dan result box saya simpan dalam dua buah tag <div> yang berbeda. Div “cse-search-box” digunakan untuk menampilkan kotak search dan tombolnya. Div “cse-search-results” saya gunakan untuk menampilkan search results.
<%
@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">
<
head runat="server"><title>Untitled Page</title> </head>
<
body>
<form id="form1" runat="server">
<div>
<div id="cse-search-box">
<asp:TextBox ID="txtSearch" runat="server" />
<asp:Button runat="server" Text="Search" OnClientClick="SearchSite(); return false;"
UseSubmitBehavior="false" />
</div>
<!-- untuk menampilkan search results -->
<div id="cse-search-results">
</div>
</div></form> </body>
</
html>
Note: div “cse-search-results” akan diisi secara dynamic oleh google.
3. Javascripts Untuk Menampilkan Search Results
Langkah terakhir adalah membuat javascript untuk menampilkan search results. Javascript tersebut akan dipanggil ketika button search di klik. Javascript akan memanggil halaman yang digunakan untuk menampung search result. URL pemanggilan dilengkapi dengan query string yang informasinya diperoleh dari google custom search engine. Query string cx, cof, ie dan sa isinya dapat diperoleh dari source code google custom search engine. Sedangkan query string q, isinya diperoleh dari kotak search.
<
script type="text/javascript">
// Function retrieved from: http://cass- hacks.com/articles/code/js_url_encode_decode/ function URLEncode (clearString)
{
var output = '';var x = 0;
clearString = clearString.toString();
var regex = /(^[a-zA-Z0-9_.]*)/;while (x < clearString.length)
{
var match = regex.exec(clearString.substr(x));if (match != null && match.length > 1 && match[1] != '')
{
output += match[1];
x += match[1].length;
}
else
{
if (clearString[x] == ' ') output += '+';
else
{
var charCode = clearString.charCodeAt(x);
var hexVal = charCode.toString(16);output += '%' + ( hexVal.length < 2 ? '0' : '' ) + hexVal.toUpperCase();
}
x++;
}
}
return (output);
}
function SearchSite()
{
document.location.href='http://localhost:2360/cse/Default.aspx?cx=002881578700962372446%3Asuquqtzdcas&cof=FORID%3A9&ie=UTF-8&q=' + URLEncode(document.getElementById('<%=txtSearch.ClientID%>').value) + '&sa=Search';
}
var googleSearchIframeName = "cse-search-results";
var googleSearchFormName = "cse-search-box";var googleSearchFrameWidth = 600; var googleSearchDomain = "www.google.com";
var googleSearchPath = "/cse";</script>
<
script type="text/javascript" src="http://www.google.com/afsonline/show_afs_search.js"></script>
Note: tanda titik dua pada value query string diganti dengan “%3A”.
That’s it. Dibawah adalah google custom search engine in action.

Memanggil stored procedure MS SQL dari DAL merupakan hal yang biasa dan banyak sekali dijumpai contoh-contohnya. Namun memanggil stored procedure Sybase cukup agak tricky, setidaknya untuk saya pribadi. Pada awalnya saya berfikir memanggil Stored Procedure pasti polanya sama aja untuk database manapun tapi ternyata tidak. Untuk lebih meresapi apa yang telah saya tulis diatas mari disimak potongan source code di bawah ini:
public void ADD(GAC_OFFICES_BO obj)
{
DbCommand cmd = DB.GetStoredProcCommand("{call SP_GAC_OFFICES_ADD(?, ?, ?, ?, ?, ?, ?, ?)}");
DB.AddInParameter(cmd,
"OFFICE_CODE", DbType.String, obj.OFFICE_CODE);DB.AddInParameter(cmd, "OFFICE_NAME", DbType.String, obj.OFFICE_NAME);
DB.AddInParameter(cmd,
"MODE", DbType.String, obj.MODE);DB.AddInParameter(cmd, "ACTIVE_FLAG", DbType.String, obj.ACTIVE_FLAG);
DB.AddInParameter(cmd,
"CREATED_BY", DbType.String, obj.CREATED_BY);DB.AddInParameter(cmd, "CREATED_DATE", DbType.DateTime, obj.CREATED_DATE);
DB.AddInParameter(cmd,
"UPDATED_BY", DbType.String, obj.UPDATED_BY);DB.AddInParameter(cmd, "UPDATED_DATE", DbType.DateTime, obj.UPDATED_DATE);
DB.ExecuteNonQuery(cmd);
}
Diatas adalah sebuah method yang berguna untuk menambahkan data ke database. Method tersebut memanggil sebuah stored procedure yang bernama SP_GAC_OFFICES_ADD dengan inputan parameter sebanyak delapan buah. Dapat dilihat, Stored Procedure dipanggil dengan cara menggunakan kurung kurawal, kata "call", nama Stored Procedure dan kemudian simbol tanda tanya. Banyak simbol tanda tanya yang digunakan adalah sejumlah parameter dari stored procedure yang bersangkutan.
Cara menambahkan parameter hanya memiliki sedikit perbedaan yaitu tidak digunakannya simbol "a keong (@)" didepan nama parameter.
buat saya, perbedaan ini telah membuat saya sedikit "headache" ketika membuat POC dan sebagai kenang-kenangan maka saya tuliskan di blog ini :-)
note:
Objek DB adalah objek dari kelas
Microsoft.Practices.EnterpriseLibrary.Data.Database
like the title said, "IGW816: Exceptional Experience"
different people from different country working together for one goal :-)
Stewart Herbert
Eva Navratil Freitag
Ilias Avramidis
Kanagarajan
Ashan B. Silva
thank you for everything
good bye "Spicy Spirit of 6" smile.... :-)
Meneruskan artikel sebelumnya tentang custom membership provider, maka kali ini saya akan coba tuliskan sekilas tentang custom role provider. Implementasi dari custom role provider kurang lebih sama dengan implementasi custom membership provider yaitu melalui tiga langkah mudah yaitu: membuat kelas turunan, meng-override method dan terakhir adalah konfigurasi web.config.
1. Membuat kelas turunan
untuk custom role provider ini, kelas yang akan dibuat diturunkan dari kelas RoleProvider.
namespace Provider
{
public class SybaseRoleProvider : RoleProvider
{
}
}
note: penamaan kelas turunan adalah bebas, saya menggunakan "Sybase" karena client menginginkan saya meng-custom role and membership dengan menggunakan Sybase sebagai beck-end. Awalan "Sybase" akan mengingatkan bahwa beck-end yang hendak digunakan adalah Sybase.
2. Meng-override method GetRolesForUser
Method GetRolesForUser akan mengambil roles dari seorang user dengan menggunakan informasi username yang diinputkan. Isi dari method ini adalah akses ke database yang akan mengembalikan nama-nama roles yang dimiliki oleh seorang user berdasarkan username nya.
public override string[] GetRolesForUser(string username)
{
}
keluaran dari method GetRolesForUser adalah array string yaitu nama-nama roles yang dimilki oleh user tertentu.
3. Konfigurasi web.config
langkah terakhir adalah konfigurasi web.config
<roleManager enabled="true" defaultProvider="Provider.SybaseRoleProvider">
<
providers><clear/>
<
add applicationName="/" connectionStringName="ConnectionString" name="Provider.SybaseRoleProvider" type="Provider.SybaseRoleProvider"/></providers>
</
roleManager>
and finish :-)
HTH
Custom MembershipProvider diperlukan ketika aplikasi yang dikembangkan akan tidak menggunakan default provider untuk membership. Default provider yang digunakan adalah SqlMembershipProvider. Adapun pembuatan custom MembershipProvider sangat sederhana yaitu cukup meng-override method ValidateUser dari kelas MembershipProvider. Berikut adalah tiga langkah mudah pembuatan custom MembershipProvider:
1. Membuat sebuah kelas yang diturunkan dari kelas MembershipProvider
Membuat custom MembershipProvider berarti membuat sebuah kelas baru yang diturunkan dari kelas MembershipProvider.
namespace Provider
{
public
class MyCustomMembershipProvider : MembershipProvider{ public override bool ValidateUser(string username, string password)
{
// code untuk validasi user goes here
}
}
}
2. Meng-override method ValidateUser
Setelah kerangka kelas dibuat, langkah berikutnya adalah mengisikan code untuk mengoverride method ValidateUser. note: method lainnya dapat dioverride sesuai kebutuhan sehingga tidak harus semua method dari kelas MembershipProvider di override.
public override bool ValidateUser(string username, string password)
{
USERS_BO user = new USERS_BO();
user =
USERS_MGR.GETUSERSBYNAME(username);if (user != null)
{
if (user.PASSWORD != null)
{
string dbPassword = user.PASSWORD;
bool status = dbPassword.Equals(password);return status;
}
else
{
return false;
}
}
else
{
return false;
}
}
isi code diatas sangat sederhana, yaitu membandingkan password yang dimasukan oleh user di login screen dengan password yang sudah disimpan didalam database untuk user tertentu (yang diindikasikan melalui username).
3. Konfigurasi di web.config
and the last step nya adalah melakukan sedikit konfigurasi di web.config. Konfigurasi dilakukan agar aplikasi kita mengenali dan kemudian menggunakan custom MembershipProvider yang telah dibuat. adapun konfigurasi yang dilakukan adalah cukup menambahkan code seperti berikut:
<membership defaultProvider="Provider.MyCustomMembershipProvider">
<
providers><clear/>
<
add name="Provider.MyCustomMembershipProvider" type="Provider.MyCustomMembershipProvider" applicationName="/" connectionStringName="ConnectionString"/></providers>
</
membership>
Dapat dilihat, konfigurasi yang dilakukan adalah "memperkenalkan" custom MembershipProvider pada aplikasi dengan cara menuliskan nama kelas si custom MembershipProvider yang diawali dengan nama namespacenya.
done :-)
More Posts
Next page »