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

MSDN Day Event | Continuous Integration with VSTS 2008

Seperti yang tertera dalam pengumuman Microsoft Indonesia tentang acara "MSDN Day | Application Lifecycle Management with VSTS 2008" di Balai Kartini. Saya menjadi pembicara dalam acara tersebut membawakan materi Continuous Integration with VSTS. Acara sangat meriah dengan audience mencapai 100 orang. Berikut beberapa foto yang diambil dari kamera Mbak Fitri.

IMG_1666 IMG_1668
IMG_1674 IMG_1683

Rankuman keseluruhan acara dapat dilihat di blog-nya Wely.

File presentasi saya dapat diambil di link bawah ini.

Contoh program (Game TicTacToe dengan Silverlight 2.0) yang saya demokan dapat diambil di


Categories: MSDN Day
Permalink | Comments (5) | Post RSSRSS comment feed

Menangkap MouseWheel Event dengan Silverlight 2

Pada Silverlight 1.0 saya pernah menulis bagaimana mendeteksi event mousewheel (scroll) di Hacking Mouse Scroll Event pada Silverlight 1.0. Setelah keluarnya Silverlight 2, pemprograman tidak lagi menggunakan JavaScript sehingga cara tersebut sudah tidak lagi bisa digunakan. Untungnya Silverlight 2 memiliki mekanisme untuk menangkap event yang terjadi di HTML object yaitu System.Windows.Browser.HtmlPage.Window.AttachEvent. Dengan method tersebut, kita bisa tangkap event untuk mousewheel.

Event mousewheel masing-masing browser yang didukung oleh Silverlight memiliki perbedaan yaitu:

  • Mozilla dan Safari menggunakan event "DOMMouseScroll" pada element window
  • IE menggunakan event "onmousewheel" pada element document
  • Opera menggunakan event "onmousewheel" pada element window.

Perbedaan ini mengharuskan untuk menangkap ketiga event tersebut dan menghandle di satu buah event handler.

HtmlPage.Window.AttachEvent("DOMMouseScroll", OnMouseWheel); HtmlPage.Window.AttachEvent("onmousewheel", OnMouseWheel); HtmlPage.Document.AttachEvent("onmousewheel", OnMouseWheel);

Setelah event diregister ke handler yang sama, ada lagi perbedaan masing-masing browser pada waktu menangkap nilai property mouse wheel.

  • Pada IE dan Opera, nilai diambil dari property "wheelDelta".
  • Pada Mozilla dan Safari, nilai diambil dari property "detail".

Selain property-nya berbeda nilai yang dihasilkan juga berbeda.

  • Pada IE dan Opera, setiap scroll akan menghasilkan nilai kelipatan +120 atau -120. Pada Opera terjadi perbedaan dengan IE mengenai tanda plus/minus. Opera menghasilkan nilai kebalikan dari IE. Oleh karena itu, untuk menyamakan nilai keluaran, pada Opera tandanya harus dibalik.
  • Pada Mozilla dan Safari, setiap scroll akan menghasilkan nilai kelipatan +3 atau -3

Perbedaan nilai antara masing-masing browser perlu disamakan. Untuk menyamakan, digunakan +1 atau -1 sehingga penanganan di aplikasi menjadi lebih mudah.

private void OnMouseWheel(object sender, HtmlEventArgs args) { double delta = 0; ScriptObject e = args.EventObject; if (e.GetProperty("detail") != null) { // Mozilla and Safari delta = ((double)e.GetProperty("detail")); } else if (e.GetProperty("wheelDelta") != null) { // IE and Opera delta = ((double)e.GetProperty("wheelDelta")); // In Opera 9, delta differs in sign as compared to IE. if (HtmlPage.BrowserInformation.UserAgent.IndexOf("opera") > -1) delta *= -1; } delta = Math.Sign(delta); if (MouseWheelScroll != null) MouseWheelScroll(new MouseWheelEventArgs(delta)); }

Nilai delta dalam method di atas yang kemudian diambil dalam aplikasi. Supaya method-method ini dapat dipakai di beberapa tempat (reusable). Perlu dibungkus dalam class dan nilai delta dilempar dalam event. Kode selengkapnya dapat dilihat di bawah.

using System; using System.Windows.Browser; /// <summary> /// Delegate for the MouseWheelScroll event. /// </summary> /// <param name="args">Event data for the MouseWheelScroll event.</param> public delegate void MouseWheelHandler(MouseWheelEventArgs args); /// <summary> /// Event data for the MouseWheelScroll event. /// </summary> public class MouseWheelEventArgs : EventArgs { private readonly double m_delta; public double Delta { get { return m_delta; } } public MouseWheelEventArgs(double delta) { m_delta = delta; } } /// <summary> /// Provides access to the browser-generated mouse wheel scrolling events. /// </summary> public class MouseWheelListener : IDisposable { public event MouseWheelHandler MouseWheelScroll; public MouseWheelListener() { HtmlPage.Window.AttachEvent("DOMMouseScroll", OnMouseWheel); HtmlPage.Window.AttachEvent("onmousewheel", OnMouseWheel); HtmlPage.Document.AttachEvent("onmousewheel", OnMouseWheel); } private void OnMouseWheel(object sender, HtmlEventArgs args) { double delta = 0; ScriptObject e = args.EventObject; if (e.GetProperty("detail") != null) { // Mozilla and Safari delta = ((double)e.GetProperty("detail")); } else if (e.GetProperty("wheelDelta") != null) { // IE and Opera delta = ((double)e.GetProperty("wheelDelta")); // In Opera 9, delta differs in sign as compared to IE. if (HtmlPage.BrowserInformation.UserAgent.IndexOf("opera") > -1) delta *= -1; } delta = Math.Sign(delta); if (MouseWheelScroll != null) MouseWheelScroll(new MouseWheelEventArgs(delta)); } /// <summary> /// Detaches from the browser-generated scroll events. /// </summary> public void Dispose() { HtmlPage.Window.DetachEvent("DOMMouseScroll", OnMouseWheel); HtmlPage.Window.DetachEvent("onmousewheel", OnMouseWheel); HtmlPage.Document.DetachEvent("onmousewheel", OnMouseWheel); } }

Semoga bermanfaat.


Categories: Silverlight
Permalink | Comments (13) | Post RSSRSS comment feed

Install Silverlight 2 Tool for Visual Studio 2008 SP1 (RC1)

Silvelight 2 Tools for Visual Studio 2008 SP1 (RC1) yang besarnya 72.1MB ternyata belum lengkap. Waktu installasi masih membutuhkan download lagi.

image

Kenapa Microsoft membuat installer segede gajah tapi masih juga membutuhkan tambahan download? Entah berapa gede lagi yang harus didownload untuk menginstall mahluk ini. Setelah selesai download terlihat counter bandwidth saya sebesar 7.2MB. Nilai itu tidak jauh meleset dari ukuran byte yang di download karena sebelum install counter hampir tidak bertambah dan waktu install counter terus naik dan saya tidak melakukan aktifitas lain yang menggunakan Internet.

image

Bagi yang tidak terhubung ke Internet, instalasi tidak bisa dilakukan. Di akhir instalasi akan ada pesen error. Ketika di buka log file-nya, disebutkan bahwa tidak dapat melakukan koneksi ke Internet.

WinHttpDetectAutoProxyConfigUrl failed with error: 12180
[10/15/2008, 6:13:16] (IronSpigot::WinHttpDownloader::GetProxySetting) Auto detection of proxy failed, try to retrieve proxy information via IE.
[10/15/2008, 6:13:16] (IronSpigot::WinHttpDownloader::GetProxySettingViaIE) Retrieving proxy information using WinHttpGetIEProxyConfigForCurrentUser
[10/15/2008, 6:13:16] (IronSpigot::WinHttpDownloader::GetProxySettingViaIE) Unable to retrieve Proxy information although WinHttpGetIEProxyConfigForCurrentUser called succeeded
[10/15/2008, 6:13:16] (IronSpigot::WinHttpDownloader::CreateSession) WINHTTP_ACCESS_TYPE_DEFAULT_PROXY
[10/15/2008, 6:13:16] (IronSpigot::WinHttpDownloader::StartDownload) Session Created
[10/15/2008, 6:13:16] (IronSpigot::WinHttpDownloader::StartDownload) Connection Created
[10/15/2008, 6:13:16] (IronSpigot::WinHttpDownloader::StartDownload) Request Created
[10/15/2008, 6:13:54] (IronSpigot::WinHttpDownloader::AsyncCallbackInternal) WINHTTP_CALLBACK_STATUS_REQUEST_ERROR error: error=12002, result= 2. Percentage downloaded=0
[10/15/2008, 6:13:55] (IronSpigot::RetryingDownloaderT<class IronSpigot::WinHttpDownloader,class IronSpigot::BitsDownloader,class IronSpigot::UrlMonDownloader,class IronSpigot::FileAuthenticity>::PerformAction) Download failed at attempt 2 of 4 for http://go.microsoft.com/fwlink/?LinkId=127693 using http:
[10/15/2008, 6:13:55] (IronSpigot::RetryingDownloaderT<class IronSpigot::WinHttpDownloader,class IronSpigot::BitsDownloader,class IronSpigot::UrlMonDownloader,class IronSpigot::FileAuthenticity>::UseHttp) Determine the protocol to use
[10/15/2008, 6:13:55] (IronSpigot::RetryingDownloaderT<class IronSpigot::WinHttpDownloader,class IronSpigot::BitsDownloader,class IronSpigot::UrlMonDownloader,class IronSpigot::FileAuthenticity>::PerformAction) Use BITS
[10/15/2008, 6:13:55] (IronSpigot::RetryingDownloaderT<class IronSpigot::WinHttpDownloader,class IronSpigot::BitsDownloader,class IronSpigot::UrlMonDownloader,class IronSpigot::FileAuthenticity>::PerformAction) Download attempt 3 of 4 for http://go.microsoft.com/fwlink/?LinkId=127693 using BITS
[10/15/2008, 6:21:8] (IronSpigot::BitsDownloader::JobError) Error from JobError Callback : hr= 0x80072ee2 Context=5 Description=The operation timed out . Percentage downloaded = 0
[10/15/2008, 6:21:8] (IronSpigot::RetryingDownloaderT<class IronSpigot::WinHttpDownloader,class IronSpigot::BitsDownloader,class IronSpigot::UrlMonDownloader,class IronSpigot::FileAuthenticity>::PerformAction) Download failed at attempt 3 of 4 for http://go.microsoft.com/fwlink/?LinkId=127693 using BITS
[10/15/2008, 6:21:8] (IronSpigot::RetryingDownloaderT<class IronSpigot::WinHttpDownloader,class IronSpigot::BitsDownloader,class IronSpigot::UrlMonDownloader,class IronSpigot::FileAuthenticity>::UseHttp) Determine the protocol to use
[10/15/2008, 6:21:8] (IronSpigot::RetryingDownloaderT<class IronSpigot::WinHttpDownloader,class IronSpigot::BitsDownloader,class IronSpigot::UrlMonDownloader,class IronSpigot::FileAuthenticity>::PerformAction) Use WinHttp
[10/15/2008, 6:21:8] (IronSpigot::RetryingDownloaderT<class IronSpigot::WinHttpDownloader,class IronSpigot::BitsDownloader,class IronSpigot::UrlMonDownloader,class IronSpigot::FileAuthenticity>::PerformAction) Download attempt 4 of 4 for http://go.microsoft.com/fwlink/?LinkId=127693 using http:
[10/15/2008, 6:21:14] (IronSpigot::WinHttpDownloader::GetProxySettingViaAutoDetect) Auto detecting proxy information
[10/15/2008, 6:21:28] (IronSpigot::WinHttpDownloader::GetProxySettingViaAutoDetect) WinHttpDetectAutoProxyConfigUrl failed with error: 12180
[10/15/2008, 6:21:28] (IronSpigot::WinHttpDownloader::GetProxySetting) Auto detection of proxy failed, try to retrieve proxy information via IE.
[10/15/2008, 6:21:28] (IronSpigot::WinHttpDownloader::GetProxySettingViaIE) Retrieving proxy information using WinHttpGetIEProxyConfigForCurrentUser
[10/15/2008, 6:21:28] (IronSpigot::WinHttpDownloader::GetProxySettingViaIE) Unable to retrieve Proxy information although WinHttpGetIEProxyConfigForCurrentUser called succeeded
[10/15/2008, 6:21:28] (IronSpigot::WinHttpDownloader::CreateSession) WINHTTP_ACCESS_TYPE_DEFAULT_PROXY
[10/15/2008, 6:21:28] (IronSpigot::WinHttpDownloader::StartDownload) Session Created
[10/15/2008, 6:21:28] (IronSpigot::WinHttpDownloader::StartDownload) Connection Created
[10/15/2008, 6:21:28] (IronSpigot::WinHttpDownloader::StartDownload) Request Created
[10/15/2008, 6:22:4] (IronSpigot::WinHttpDownloader::AsyncCallbackInternal) WINHTTP_CALLBACK_STATUS_REQUEST_ERROR error: error=12002, result= 2. Percentage downloaded=0
[10/15/2008, 6:22:4] (IronSpigot::RetryingDownloaderT<class IronSpigot::WinHttpDownloader,class IronSpigot::BitsDownloader,class IronSpigot::UrlMonDownloader,class IronSpigot::FileAuthenticity>::PerformAction) Download failed at attempt 4 of 4 for http://go.microsoft.com/fwlink/?LinkId=127693 using http:
[10/15/2008, 6:22:4] (IronSpigot::LogUtils::LogFinalResult) Final Result: Installation failed with error code: (0x80072EE2).

Setelah dianalisis, ternyata yang didownload adalah Silverlight 2 runtime. Saya coba di komputer lain dengan menginstall Silverlight 2 runtime terlebih dahulu sebelum menginstall Silverlight Tools, proses download dilewati.

Conclusion

Sebelum melakukan Install Silverlight 2 Tools for Visual Studio 2008 SP1 (RC1) pastikan.

  • Visual Studio 2008 SP1 sudah terinstall
  • Uninstall Silverlight 2 alpha / beta / RC0.
  • Silverlight 2 runtime sudah terinstall
  • Uninstall semua versi preview dan trial dari Expression Blend.

Semoga bermanfaat.


Categories: Silverlight
Permalink | Comments (15) | Post RSSRSS comment feed

Silverlight 2 Released

Beberapa jam yang lalu saya sudah menulis "Silverlight 2 Releases Today" tentang keluarnya Silverlight 2 pada hari ini. Malam ini Silverlight 2 sudah bisa diunduh di sini sebagai bagian dari Visual Studio 2008 dan Expression Blend 2 tool. Tulisan ini memang agak terlambat karena tadi beberapa saat sebelum meninggalkan kantor Microsoft Indonesia di BEJ Lantai 18 saya cek Silverlight 2 belum bisa diunduh. Pulang bersama Wely, di dalam busway Wely baru ngasih tahu kalo beberapa menit sebelum meninggalkan kantor, Scott Gu mengumumkan bahwa Silverlight 2 sudah rilis. Tak apa lah, informasi tetap perlu disebarluaskan.

Kini saatnya untuk download kembali Silverlight 2 setelah minggu lalu download Silverlight 2 RC0. Besok pagi siap untuk buat aplikasi dengan Silverlight 2.


Categories: Silverlight
Permalink | Comments (3) | Post RSSRSS comment feed

Silverlight 2 RTW (2.0.31005.0) Already Available

Silverlight 2.0 RTW (Release To Web) detik ini sudah siap diunduh dari http://www.microsoft.com/silverlight/resources/install.aspx.

 

image

Bagi yang sudah tidak sabar mencoba Silverlight 2, langsung saja menuju ke TKP.


Categories: Silverlight
Permalink | Comments (7) | Post RSSRSS comment feed

Silverlight 2 Releases Today

Berdasarkan blog Jesse Liberty di Silverlight 2 Releases Tomorrow menyebutkan bahwa besok (dari kemaren waktu Redmond, atau hari ini WIB) Silverlight 2 akan release. Berita resmi dari Microsoft (http://www.microsoft.com/presspass/press/2008/oct08/10-13Silverlight2PR.mspx) juga menuliskan bahwa Silverlight 2 akan segera dapat dinikmati. Setelah beberapa hari yang lalu install Silverlight 2 RC0, kini saatnya menunggu waktu peluncuran Silverlight 2 dan convert semua applikasi Silverlight lama ke Silverlight yang baru. Silverlight 2 dapat diunduh dari http://www.microsoft.com/silverlight

Dalam peluncuran Silverlight 2, Microsoft juga akan mengeluarkan programming template yang disebut sebagai Silverlight Control Pack di bawah lisensi Microsoft Permissive Licence. Dengan ini, programmer dapat menulis applikasi Silverlight dengan Visual Web Developer 2008 Express Edition.

Saatnya bermain dengan Silverlight 2.


Categories: Silverlight
Permalink | Comments (2) | Post RSSRSS comment feed

Gunakan jQuery untuk Mendapatkan Client ID ASP.NET Server Control

jQuery merupakan salah satu library JavaScript yang sangat handal. Berdasarkan informasi dari blog ScottGu di http://weblogs.asp.net/scottgu/archive/2008/09/28/jquery-and-microsoft.aspx, menyatakan bahwa jQuery akan diintegrasikan dengan ASP.NET Ajax. Kemampuan jQuery untuk melakukan query terhadap DOM sangat membantu dalam penulisan kode JavaScript. Dengan jQuery tidak perlu lagi hawatir terhadap perbedaan penulisan pada beberapa browser, cukup dengan satu syntax akan berjalan dengan baik di beberapa browser populer.

Dalam tulisan ini saya akan menunjukkan kemampuan jQuery dalam melakukan query DOM yang di-generate oleh ASP.NET Server Control. Permasalahan utama adalah server control akan membangkitkan client ID secara dynamic jika control tersebut berada di dalam control lain.

Contoh, jika kita membuat page di dalam Master Page, kode server control dalam page berada di dalam Content place holder di berikut:

<asp:Content ID="DefaultContainer" ContentPlaceHolderID="cpMain" runat="server"> <asp:TextBox ID="TextBox1" runat="server" Text="Test"></asp:TextBox> </asp:Content>

akan terender di browser menjadi

<input name="ctl00$cpMainTextBox1" type="text" value="Test" id="ctl00_cpMain_TextBox1" />

Untuk mendapatkan DOM dari input box di atas dari JavaScript tidak dapat dilakukan dengan menyebutkan ID control secara langsung dengan code berikut.

<script type="text/javascript"> <!-- var textBox1 = document.getElementById('TextBox1'); // --> </script>

Control ID akan secara otomatis berubah menjadi unique ID seperti terlihat pada hasil render code di atas sehingga kode getElementById tidak akan pernah menemukan DOM yang dimaksud. Untuk menangani masalah ini dapat dilakukan dengan menuliskan kode JavaScript dalam satu file dengan halaman (file .aspx). Contoh:

<script type="text/javascript"> <!-- var textBox1 = document.getElementById('<%= TextBox1.ClientID %>'); // --> </script>

Dengan cara tersebut memang bisa tapi halaman jadi tampak semrawut karena campur aduk antara tag HTML dan JavaScript. Proses debugging JavaScript dengan metode tersebut juga lebih sulit karena break point tidak bisa diset sebelum halaman dijalankan. Dengan menggunakan jQuery, untuk mendapatkan client ID dari server control dapat dilakukan dengan cara:

<script type="text/javascript"> <!-- var textBox1 = $("input[name$='TextBox1']"); // --> </script>

Kode di atas artinya melakukan query terhadap semua element INPUT yang memiliki attribute name dengan akhiran "TextBox1". Apapun prefix yang dirender oleh ASP.NET, TextBox1 akan selalu terender sebagai akhiran client ID. Dengan menggunakan jQuery, tidak perlu lagi kode JavaScript menjadi satu dalam halaman HTML. Hal ini mempermudah proses debugging dan meningkatkan performance karena kode JavaScript dapat di-cache oleh browser / server.


Tags:
Categories: ASP.NET | JavaScript
Permalink | Comments (12) | Post RSSRSS comment feed