This Blog

Syndication

News

Awards

Microsoft MVP Logo
Grab this badge here!

Certificates

Transcript ID#: 6724122
Brainbench ASP.NET Certificate
 
Brainbench ASP.NET 2.0 Certificate
 
Brainbench .NET Framework 2.0 Certificate

Ahmad Masykur

var myObject = { "languages" : [ "C#", "VB.NET", "ASP.NET", "Javascript", "SDCC", "Assembler" ] }; //

July 2008 - Posts

  • Busby SEO Challenge - Sehari Setelah Pendaftaran

    Setelah semalam mendaftar Busby SEO Challenge, hari ini coba query dengan keyword busby. Wow... situs saya telah berada di peringkat ke 9 dari daftar pencarian google.

    image

    Dengan bermodal 5788 external link yang merujuk ke www.masykur.web.id, semoga bisa terus naik hingga urutan pertama. Amin.

    Share this post: | | | |
  • Busby SEO Challenge

    Berdasarkan informasi di milis tetangga, ternyata sekarang sedang ada kompetisi SEO. Penilaian dilakukan dengan pencarian menggunakan keyphrase : Busby SEO Challenge. Peserta diwajibkan mendaftar dan menuliskan kalimat: Participant in the Busby Web Solutions Search Engine Optimisation Challenge untuk link back ke penyelenggara kompetisi.

    Iseng-iseng ikutan siapa tahu dapat masuk di top-rank, saya coba daftar dan memancing google untuk mengindex page saya di Busby SEO Challenge. Setelah googling ternyata peserta dari Indonesia banyak yang sudah menduduki peringkat 10 besar. Bermodal page-rank yang selama ini saya dapat, semoga saya bisa menyusul mereka yang telah mendaftar lebih dulu.

    Share this post: | | | |
  • Password User BlogEngine.NET 1.4 telah Terenkripsi

    Akhirnya password user BlogEngine.NET dienkripsi juga. Hampir dua tahun pake BlogEngine.NET sejak versi 0.8, password dalam file XML disimpan dalam plain text. Setelah versi terbaru (1.4) akhirnya password dienkrip dengan algoritma SHA256. Kita bisa intip kode enkripsi password yang digunakan BlogEngine.NET sebagai berikut.

    /// <summary> /// Encrypts a string using the SHA256 algorithm. /// </summary> public static string HashPassword(string plainMessage) { byte[] data = Encoding.UTF8.GetBytes(plainMessage); using (HashAlgorithm sha = new SHA256Managed()) { byte[] encryptedBytes = sha.TransformFinalBlock(data, 0, data.Length); return Convert.ToBase64String(sha.Hash); } }

    Pada file User.xml yang sebelumnya tidak dienkripsi sekarang sudah terenkripsi seperti terlihat pada kode berikut.

    <Users> <User> <UserName>Admin</UserName> <Password>jGl25bVBBBW96Qi9Te4V37Fnqchz/Eu4qB9vKrRIqRg=</Password> <Email>post@example.com</Email> <LastLoginTime>2007-12-05 20:46:40</LastLoginTime> </User> <User> <UserName>mads</UserName> <Password>JXMu9HdxF4mOBSAx4DrWOPAzJt58v+/sHfrxoko0m0M=</Password> <Email>mads@zyb.dk</Email> <LastLoginTime>2008-07-07 19:11:41</LastLoginTime> </User> </Users>

    Seperti terlihat pada kode di atas bahwa password telah terenkripsi. Teks password sebenarnya tidak dapat terbaca. Password standar BlogEngine.NET untuk user Admin adalah "admin" tanpa tanda kutip.
    Akhirnya bisa lebih tenang karena password saya tidak bisa diintip lagi oleh admin hosting. Sorry ya mas Rudy... Hehehe...

    Share this post: | | | |
    Posted Jul 16 2008, 08:50 AM by cahnom with no comments
    Filed under:
  • PayPal Verification: Akhirnya Verified Juga

    Alhamdulillah, setelah beberapa bulan semenjak account bank Indonesia dapat menerima pembayaran dari PayPal, saya coba untuk verify beberapa debit card yang saya miliki. Satupun tidak ada yang dapat di-verify baik BCA, BNI dan terakhir Bank Niaga.

    Karena semua debit card yang saya miliki tidak dapat digunakan akhirnya saya coba untuk apply kartu kredit Citibank. Setelah melalui proses verifikasi kartu kredit hampir satu bulan, akhirnya minggu kemaren kartu kredit diantar oleh kurir ke kantor. Dengan kartu kredit yang baru ini saya coba verify ke paypal. Setelah menunggu selama dua hari untuk mendapatkan empat digit PayPal code, akhirnya datang juga PayPal code di account detail citibank online saya.

    image

    Sekarang saatnya untuk berburu dollar di dunia maya. Merdeka!!!

    Share this post: | | | |
    Posted Jul 16 2008, 08:20 AM by cahnom with 5 comment(s)
    Filed under:
  • Membuat LivePath Effect dengan Inkscape

    LivePath effect merupakan sebuah effect dari paduan banyak path sehingga menghasilkan garis-garis halus yang berjajar. Salah satu contoh LivePath effect seperti pada gambar berikut

    image

    Kita dapat membuat effect tersebut dengan berbagai macam tools pembuat graphic vector seperti Corel Draw. Dalam hal ini saya akan gunakan tools gratis yaitu InkScape (www.inkscape.org). InkScape sebenarnya adalah sebuah tool untuk menggambar graphic vektor SVG. Selain SVG dokumen yang dibuat dengan tool ini juga dapat disimpan dalam format XAML (Silverlight), PostScript, Enhanced Metafile (EMF), OpenDocument Drawing (ODG), dll.

    Untuk membuat gambar seperti di atas, langkah pertama adalah membuat background. Background terdiri dari dua persegi empat dengan degradasi kuning keemasan. Kita buat kotak pertama dengan ukuran 620px x 70px. Isi kotak warna gradient dari atas ke bawah dengan gradient stop #fbf49eff (atas) dan #e0a71dff (bawah).

    image

    Kotak kedua dibuat dengan ukuran 620px x 15px yang diletakkan persis di bawah kotak pertama. Gradient untuk kotak kedua terdiri dari tiga gradient stop dari atas ke bawah #edcd5dff (posisi 0% / atas), #eddd5dff (posisi 20% / tengah) dan #fbf49eff (posisi 100% / bawah). Untuk membuat pemisah tipis antara kedua kotak, dibuat stroke thickness sebesar 0.5px dengan warna putih. Hasil dari kedua kotak tersebut seperti terlihat pada gambar berikut.

    image

    Langkah berikutnya adalah membuat livepath effect itu sendiri. Untuk pemisahkan antara background dengan livepath effect dibuat layer baru di atas background dengan nama LifePath. Selanjutnya buat dua garis sinus menggunakan freehand line tool dengan warna merah dan putih yang saling memotong satu sama lain. Buat tebal stroke untuk dua garis ini sebesar 0.5px dan opacity 0.5.

    image 

    Langkah terakhir membuat effect livepath dengan menggunakan efek interpolasi path. Pilih (select) kedua path, pada menu Effect, Generate from Path, pilih Interpolate.

    image

    Pada jendela Interpolate, isi Exponent = 0.0, Interpolation steps = 128, Interpolation method = 2, Duplicate endpaths = unchecked, Interpolate style = checked. Setelah semua nilai diisi, tekan tombol Apply.

    image

    Hasil akhir dari langkah-langkah di atas adalah seperti terlihat pada gambar berikut.

    image

    Anda bisa menggunakan metode ini untuk membuat header sebuah halaman web atau untuk pemanis di dalam halaman. Source file Inkscape SVG dari tutorial ini dapat didownload dalam attachment di bawah.

    Semoga bermanfaat.

    Share this post: | | | |
  • Deserialize JSON String ke Strong-Type Object.

    Tulisan ini merupakan kelanjutan dari post sebelumnya tentang Json Serializer dan Deserializer. Pada tulisan sebelumnya, string JSON dideserialize ke dalam Generic Dictionary. Kekurangan dari metode tersebut adalah kita tidak bisa menggunakan strong-type object untuk deserialize JSON. Metode tersebut juga sudah dianggap usang oleh .NET Framework 3.5 karena dalam framework tersebut sudah disediakan pengganti System.Web.Script.Serialization.JavaScriptSerializer yaitu System.Runtime.Serialization.Json.DataContractJsonSerializer.

    Untuk dapat menggunakan System.Runtime.Serialization.Json.DataContractJsonSerializer perlu menambahkan dua assembly reference ke dalam project yaitu: System.Runtime.Serialization (butuh .NET Framework 3.0) dan System.ServiceModel.Web (butuh .NET Framework 3.5). Setelah kedua assembly ini direferensikan, beberapa hal yang perlu disiapkan diantaranya.

    1. Tambahkan kedua namespace berikut

    using System.Runtime.Serialization.Json; using System.Runtime.Serialization;

    2. Buat class yang digunakan untuk men-deserialize JSON string.

    Dalam contoh ini dibuat class berdasarkan JSON yang sama seperti tulisan sebelumnya (Json Serializer dan Deserializer). Struktur string JSON tersebut adalah:

    var dateFormat = '<%= GlobalCallCenter.Common.CallCenterConfig.Get("SHORT_DATE_FORMAT") %>'; var filter = { instance: $get('<%= instanceList.ClientID %>').value, requestNo: $get('<%= requestNoTextBox.ClientID %>').value, category: $get('<%= categoryList.ClientID %>').value, itemCategory: $get('<%= itemAffectedList.ClientID %>').value, ticketGroup: $get('<%= ticketGroupList.ClientID %>').value, status: $get('<%= statusList.ClientID %>').value, requestType: $get('<%= typeList.ClientID %>').value, startDate: Date.parseLocale($get('<%= dateFromTextBox.ClientID %>').value, dateFormat), finishDate: Date.parseLocale($get('<%= dateToTextBox.ClientID %>').value, dateFormat), requestedFor: $get('requestedForEmployeeId').value, assigneeId: ($get('<%= assigneeForEmployeeId.ClientID %>') != null) ? $get('<%= assigneeForEmployeeId.ClientID %>').value : $get('<%= assigneeForEmployeeIdLabel.ClientID %>').innerHTML };


    Dari JSON tersebut di atas, dibuat class sebagai berikut:

    [DataContract(Name = "Filter", Namespace = "")] protected internal class Filter { [DataMember(Name = "instance", Order = 1)] public string Instance { get; set; } [DataMember(Name = "requestNo", Order = 2)] public string RequestNo { get; set; } [DataMember(Name = "category", Order = 3)] public string Category { get; set; } [DataMember(Name = "itemCategory", Order = 4)] public string ItemCategory { get; set; } [DataMember(Name = "ticketGroup", Order = 5)] public string TicketGroup { get; set; } [DataMember(Name = "status", Order = 6)] public string Status { get; set; } [DataMember(Name = "requestType", Order = 7)] public string RequestType { get; set; } [DataMember(Name = "startDate", Order = 9)] public DateTime StartDate { get; set; } [DataMember(Name = "finishDate", Order = 10)] public DateTime FinishDate { get; set; } [DataMember(Name = "requestedFor", Order = 10)] public string RequestedFor { get; set; } [DataMember(Name = "assigneeId", Order = 10)] public string AssigneeId { get; set; } }

    3. Buat implementasi deserialization.

    Seperti pada tulisan sebelumnya di Json Serializer dan Deserializer, saya gunakan contoh yang sama yaitu event callback pada Janus Grid sebagai berikut.

    protected void GridEX1_CustomCallBack(object sender, Janus.Web.Common.CustomCallBackEventArgs e) { var edata = System.Web.HttpUtility.UrlDecode(e.EventData.ToString()); System.IO.MemoryStream stream = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(edata.ToString())); DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Filter)); Filter filter = (Filter)serializer.ReadObject(stream); }

    Dengan menggunakan strong-type kita langsung dapat mengakses property dari class tersebut, seperti terlihat pada gambar berikut.

    image

    Berbeda dari tulisan sebelumnya, dengan menggunakan strong-type object, semua property dapat diakses sesuai dengan tipe yang sudah didefinisikan.

    Semoga bermanfaat.

    Share this post: | | | |
  • JSON Serializer & Deserializer

    Saya ingin berbagi sedikit tips mengenai JSON serializer dan deserializer yang ada di ASP.NET AJAX. Dengan menggunakan ASP.NET Ajax pertukaran data antara client (JavaScript) dengan server menjadi gampang banget. Kita tidak perlu lagi pake XMLyang rumit. Dengan JSON data mudah banget di-parse.

    Contoh code di client (JS):

    function getFilterData() { var dateFormat = '<%= HelpdeskSystem.DateFormat %>'; var filter = { instance: $get('<%= instanceList.ClientID %>').value, requestNo: $get('<%= requestNoTextBox.ClientID %>').value, category: $get('<%= categoryList.ClientID %>').value, itemCategory: $get('<%= itemAffectedList.ClientID %>').value, ticketGroup: $get('<%= ticketGroupList.ClientID %>').value, status: $get('<%= statusList.ClientID %>').value, requestType: $get('<%= typeList.ClientID %>').value, startDate: Date.parseLocale($get('<%= dateFromTextBox.ClientID %>').value, dateFormat), finishDate: Date.parseLocale($get('<%= dateToTextBox.ClientID %>').value, dateFormat), requestedFor: $get('requestedForEmployeeId').value, assigneeId: ($get('<%= assigneeForEmployeeId.ClientID %>') != null) ? $get('<%= assigneeForEmployeeId.ClientID %>').value : $get('<%= assigneeForEmployeeIdLabel.ClientID %>').innerHTML }; return Sys.Serialization.JavaScriptSerializer.serialize(filter); // Serialize object to JSON string }

    Di server side (C#), tinggal di-deserialize. Dalam hal ini saya pake data JSON tersebut pada event CallBack Janus Grid:

    protected void GridEX1_CustomCallBack(object sender, Janus.Web.Common.CustomCallBackEventArgs e) { System.Web.Script.Serialization.JavaScriptSerializer jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer(); var edata = System.Web.HttpUtility.UrlDecode(e.EventData.ToString()); var data = jsSerializer.DeserializeObject(edata); // data selanjutnya di prosess di sini }

    Simple banget.

    Hasil deserialize object ketika debugging tersebut dapat dilihat seperti gambar di bawah.

    image

    Dari gambar tersebut, string JSON telah di-deserialize menjadi object (string, Date, dll). Mudah bukan?

    Semoga bermanfaat.

    Share this post: | | | |
  • Mencegah Print Screen Halaman Web

    Hak Atas Kekayaan Intelektual (HAKI) dan Hak Cipta merupakan suatu hak yang harus ditegakkan. Susah-susah membuat tulisan berdasarkan hasil pemikiran sendiri, dengan mudah dalam sekejap dijiplak orang lain dan diaku sebagai hasil karya sendiri.
    Sering kali dijumpai beberapa situs tidak bisa disalin halaman web-nya. Orang yang memang punya niat mencuri dengan berbagai cara tetep bisa menyalin isinya dengan cara print-screen, baik dengan tombol yang ada di keyboard maupun dengan software. Dalam tulisan ini akan saya akan membagi trik untuk mencegah tindakan print-screen terhadap halaman web yang kita buat.
    Untuk mencegah tindakan print-scrint salah satunya adalah dengan cara menghilangkan isi clipboard secara berkala. Cara tersebut dapat dilakukan dengan script berikut.

    function clearImage() { r = window.clipboardData.clearData("Image"); } ci = setInterval("clearImage()", 10);

    Code tersebut akan menghapus data clipboard dengan type Image karena hasil print-screen akan disimpan di clipboard dalam bentuk image.
    Catatan: Script ini hanya berjalan di Internet Explorer.
    Untuk memastikan bahwa ini berjalan di IE dan tidak menimbulkan error di browser lain perlu adanya pengecekan terlebih dahulu. Script di atas dapat diubah menjadi.

    function clearImage() { if (window.clipboardData) { r = window.clipboardData.clearData("Image"); } } ci = setInterval("clearImage()", 10);

    Script di atas saya dapatkan dari dendy=at=ins.co.id di milis PHPUG.
    Semoga bermanfaat.
    Share this post: | | | |