Ahmad Masykur

Share your knowledge although one function!

About the author

Ahmad Masykur is a Software Architecture Engineer at PT. Freeport Indonesia Jakarta Indonesia.
In this blog, I share things of interest to me. Most topics are likely to be related to software development, but don't hold me to it.

Certificates



Awards


Powered by

Widget Prayer Time not found.

There is an error in XML document (4, 16278).X

Page List

Validators


Ahmad Masykur

Test Telkomsel Flash Unlimited

Setelah kemaren melakukan registrasi Telkomsel Flash paket basic (256kbps), sore tadi saya coba untuk pake live update Windows Vista. Dari gadget network traffic terlihat bahwa kecepatan download lumayan kenceng (rata-rata 240kbps). Dalam tiga jam tercatat 1.42GB telah terdownload dan upload sebanyak 66.98MB.

image

Menurut saya ini lumayan bagus dengan biaya bulanan Rp125.000 bisa dapatkan akses Internet tak terbatas. Jika dibandingkan dengan akses Telkomsel Flash reguler (time based) atau Indosat memang kecepatan masih jauh dibawah reguler. Tapi jika dihitung lebih cermat, paket unlimited jauh lebih hemat dibandingkan paket Telkomsel Flash lainnya.


Permalink | Comments (193) | Post RSSRSS comment feed

Image List Widget for BlogEngine.NET 1.4

BlogEngine.NET now available for download. This version of BlogEngine.NET introduce new dynamic controls called widget. You can add new widget, delete and move existing widget anywhere in the widget zone (commonly on side bar).

image

To support new BlogEngine.NET widget model, I'm developed new widget for displaying images list. You can download this widget from following link.

The installation is very easy. Just extract the package to widgets folder and login as admin user to add this widget to widget zone.

I hope this helps,

 

Ahmad Masykur


Categories: BlogEngine
Permalink | Comments (20) | Post RSSRSS comment feed

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 di merdeka.zip (28.49 kb).

Semoga bermanfaat.


Permalink | Comments (5) | Post RSSRSS comment feed

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.


Categories: ASP.NET AJAX | JavaScript | JSON
Permalink | Comments (8) | Post RSSRSS comment feed

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.


Categories: ASP.NET AJAX | JavaScript | JSON | Tips
Permalink | Comments (4) | Post RSSRSS comment feed

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.


Categories: JavaScript | Tips
Permalink | Comments (27) | Post RSSRSS comment feed