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" ] }; //

December 2007 - Posts

  • Hacking Mouse Scroll Event pada Silverlight 1.0

    Silverlight 1.0 hanya memiliki mouse yang terbatas yaitu MouseMove, MouseEnter, MouseLeave, MouseLeftButtonDown dan MouseLeftButtonUp. Dari kelima event yang dimiliki oleh Silverlight 1.0 tersebut tidak bisa untuk menangkap event yang terjadi pada waktu scroll mouse berputar. Mouse scroll dapat diakali (hack) dengan memanfaatkan elemen HTML <select> dengan event onchange. Saat fokus pada element <select> dan scroll mouse diputar, index pada element tersebut akan berubah. Perilaku ini dapat dimanfaatkan untuk menangkap event scroll pada mouse.

    Berukut langkah-langkah untuk melakukan hack terhadap event mouse scroll.

    Buat halaman HTML yang dijadikan sebagai host Silverlight dengan nama file zoom.html.

    <!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>

    <title>Zoom by Scroll Demo</title>

    <script type="text/javascript" src="Silverlight.js"></script>

    <script type="text/javascript" src="zoom.html.js"></script>

    <script type="text/javascript" src="zoom.xaml.js"></script>
    </head>

    <body>

    <div id="SilverlightPlugInHost" style="border: solid 1px #7f7f7f; display: inline;">

    </div>

    <script type="text/javascript">

    createSilverlight();

    </script>
    </
    body>

    </html>

    Buat file XAML untuk menampilkan sebuah foto dengan nama file zoom.xaml.

    <Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
      <Image x:Name="Photo" Source="images/Foto002.jpg">
        <Image.RenderTransform>
          <ScaleTransform x:Name="ZoomTransform"  ScaleX="0.8" ScaleY="0.8" />
        </Image.RenderTransform>
      </Image>
    </Canvas>

    Buat code-behind JavaScript untuk membuat object Silverlight dengan nama file zoom.html.js.

    function createSilverlight()
    {
        var zoom = new Masykur.Demo.Zoom();
        Silverlight.createObjectEx({
            source: 'zoom.xaml',
            parentElement: document.getElementById('SilverlightPlugInHost'),
            id: 'SilverlightPlugIn',
            properties: {
                width: '800',
                height: '600',
                background:'#ffffff',
                isWindowless: 'false',
                version: '1.0'
            },
            events: {
                onError: null,
                onLoad: Silverlight.createDelegate(zoom, zoom.handleLoad)
            },        
            context: null 
        });
    }
    
    if (!window.Silverlight) 
        window.Silverlight = {};
    
    Silverlight.createDelegate = function(instance, method) {
        return function() {
            return method.apply(instance, arguments);
        }
    }

    Nah terakhir adalah code-behind XAML untuk menangani event object Silverlight dengan nama file zoom.xaml.js. Code ini yang akan digunakan untuk melakukan hack terhadap event mouse scroll.

    if (!window.Masykur) {
        window.Masykur = {};
    }
    Masykur.registerNamespace = function (ns)
    {
        var nsParts = ns.split(".");
        var root = window;
    
        for(var i=0; i<nsParts.length; i++) {
            if(typeof root[nsParts[ i ]] == "undefined") {
                root[nsParts[ i ]] = new Object();
            }
            root = root[nsParts[ i ]];
        }
    }
    
    Masykur.registerNamespace("Masykur.Demo");
    
    Masykur.Demo.Zoom = function() 
    {
    }
    
    Masykur.Demo.Zoom.prototype =
    {
        handleLoad: function(plugIn, userContext, rootElement) 
        {
            this.plugIn = plugIn;
            this.userContext = userContext;
            this.rootElement = rootElement;
            this.photo = rootElement.findName('Photo');
            this.zoomTransform = rootElement.findName('ZoomTransform');
            this.photo.addEventListener("MouseMove", Silverlight.createDelegate(this, this.handleMouseMove));
            this.createZoomScroll();
        },
    
        handleMouseMove : function(sender, eventArgs) {
            this.selZoom.focus();
        },
        
        zoom : function(scale) {
            this.zoomTransform.scaleX = scale;
            this.zoomTransform.scaleY = scale;
        },
    
        createZoomScroll : function() {
            this.selZoom = document.createElement("select");
            for (var i = 0; i < 19; i++) {
                var opt = document.createElement("option");
                this.selZoom.appendChild(opt);
            }
            this.selZoom.selectedIndex = 16;
            var obj = this;
            this.selZoom.onchange = function() {
                var _zoom = 0.1 + (this.selectedIndex / 20);
                obj.zoom(_zoom); 
                };
            var bd = document.getElementsByTagName('body');
            bd[0].appendChild(this.selZoom);
            // hide scroll element
            this.selZoom.style.position = 'absolute';
            this.selZoom.style.top = -100;
        }
    
    }

    Inti dari hacking ini adalah memanfaatkan elemen HTML <select>. Pada waktu Silverlight di-load, akan menginisialisasi semua elemen yang ada dan diakhir inisialisasi dibuat sebuah elemen <select>. Pembuatan elemen <select> dilakukan pada fungsi createZoomScroll(). Buat elemen <select> secara runtime menggunakan method document.createElement("select") dan tambahkan option sebanyak yang diperlukan. Setelah elemen <select> dibuat, tempatkan pada halaman dan sembunyikan dengan meletakkan posisinya pada lokasi negatif. Untuk membuat agar elemen <select> selalu di-focus, pada event MouseMove, dipanggil fungsi focus(). Selanjutnya buat event handler untuk event onchange pada element <select> dan panggil fungsi zoom() untuk melakukan zooming.

    Demikian tips hacking Silverlight ini, semoga bermanfaat.

    Share this post: | | | |
  • Pembuatan Namespace pada JavaScript

    Namespace digunakan untuk mencegah adanya penamaan objek yang sama oleh vendor yang berlainan. Misalkan microsoft menggunakan objek dengan nama Ajax dan vendor lain juga menggunakan objek dengan nama Ajax, maka jika kedua library disatukan dalam satu aplikasi akan terjadi konflik antara kedua objek tersebut. Untuk mencegah kejadian ini diperlukan namespace antara produk satu dengan lainnya. Pada JavaScript tidak ada fitur khusus untuk menangani namespace namun kita dapat membuat objek bertingkat menggunakan JavaScript yang diperlakukan seperti namespace.

    Berikut adalah script yang digunakan untuk membuat namespace pada JavaScript.

    if (!window.Masykur) {
        window.Masykur = {};
    }
    Masykur.registerNamespace = function (ns)
    {
        var nsParts = ns.split(".");
        var root = window;
    
        for(var i=0; i<nsParts.length; i++) {
            if(typeof root[nsParts[ i ]] == "undefined") {
                root[nsParts[ i ]] = new Object();
            }
            root = root[nsParts[ i ]];
        }
    }

    Penggunaan fungsi tersebut di atas adalah.

    Masykur.registerNamespace("Masykur.Ajax.Utilities");
    
    Masykur.Ajax.Utilities.RegisterCallback = function(e, callback)
    {
    
        // ...
    }
    
    Masykur.Ajax.WebService = function(wsdl, async)
    {
        this.wsdl = wsdl;
        this.async = async;
    
        // ...
    }
    
    // contoh penggunaan
    
    var ws = new Masykur.Ajax.WebService(http://.../service1.asmx?WSDL, true);
    ws.onready = function(res)
    {
        alert(res.value);
    }
    ws.ServerAdd(21, 2);
    

     

    Dengan menggunakan namespace, masing-masing library dari vendor yang berlainan dapat menggunakan nama vendor sebagai root namespace mereka.

    Share this post: | | | |
    Posted Dec 27 2007, 09:12 AM by cahnom with 2 comment(s)
    Filed under:
  • ExtJS 2.0 Telah Final

    Wow... sudah beberapa waktu tidak mengunjungi situs ExtJS, ternyata sejak 4 Desember lalu telah dirilis versi final dari ExtJS 2.0. Beberapa fitur tambahan seperti Grouping dan Group Summary pada Grid, Scrolling Tabs, Anchor Layout, dan yang menarik ada contoh Web Desktop. Wow.. kereennn.

    Share this post: | | | |
    Posted Dec 27 2007, 08:37 AM by cahnom with 3 comment(s)
    Filed under:
  • Silverlight: Transparent pada Indexed PNG Tidak Bisa Transparan

    Saat ini saya sedang bikin aplikasi mirip dengan Google Map. Saya coba bikin navigasi untuk geser kiri, kanan, atas, bawah dan zoom-in serta zoom-out menggunakan image. Saya pilih image karena tetika saya gunakan Path dengan ketebalan Stroke sebesar 1, ternyata dirender oleh Silverlight menjadi dua, seperti ada efek antialiasing. Pertama saya bikin image PNG dengan mode indexed, dan ternyata hasilnya bagian transparan ditampilkan dalam warna solid (seperti gray, hijau, merah atau lainnya), seperti terlihat pada gambar berikut.

    image

    image

    Setelah saya ganti dengan mode RGB, bisa tampil dengan baik seperti pada gambar berikut

    image

    Ada yang tahu kenapa:

    1. Path, Line, dan PolyLine dengan ketebalan 1 dirender seperti ada efek antialiasing?

    2. Transparent PNG dengan mode indexed kenapa tidak ditampilkan dengan baik?

    Apakah ini bug dari Silverlight 1.0?

    Share this post: | | | |
  • Mendapatkan Versi Silverlight yang Terpasang

    Berikut adalah sedikit fungsi untuk mengetahui versi Silverlight yang terpasang pada komputer client. Dengan mengetahui versi silverlight dan menggabungkannya dengan Google Analytics, kita dapat mengumpulkan informasi seberapa banyak orang yang telah menginstall Silverlight dan versi berapa yang diinstall. Pada Google Analytics terdapat satu field yang dapat didefinisikan sendiri melalup API yang disediakan. Dokumentasi Google Analytics API dapat dilihat di sini.

    Fungsi javascript secara lengkap dapat dilihat seperti script berikut.

    function onLoad() {
        var version = getSilverlightVersion();
        if (version) { __utmSetVar(version); }
    }
    
    function getSilverlightVersion() {
        var version = '';
        var container = null;
        try {
            var control = null;
            if (window.navigator.userAgent.indexOf('MSIE') >= 0) {
                control = new ActiveXObject('AgControl.AgControl');
            }
            else {
                if (navigator.plugins['Silverlight Plug-In']) {
                    container = document.createElement('div');
                    document.body.appendChild(container);
                    container.innerHTML= '<embed type="application/x-silverlight" src="data:," />';
                    control = container.childNodes[0];
                }
            }
            if (control) {
                if (control.isVersionSupported('1.1')) { version = 'Silverlight/1.1'; }
                else if (control.isVersionSupported('1.0')) { version = 'Silverlight/1.0'; }
            }
        }
        catch (e) { }
        if (container) {
            document.body.removeChild(container);
        }
        return version;
    }
    

     

    Sumber: Tracking Silverlight-enabled Browsers via Analytics

    Share this post: | | | |
    Posted Dec 26 2007, 10:37 AM by cahnom with no comments
    Filed under:
  • Pasang Windows Live Writer 2008

    Alhamdulillah, dari minggu lalu saya coba untuk memasang Windows Live Writer 2008 di komputer kantor saya tapi terbentur dengan proxy. Paket installer yang disediakan oleh Microsoft ternyata hanya untuk mendownload softwarenya saja, belum termasuk Windows Live Writer di dalamnya. Pada waktu melakukan instalasi, software di download dari Microsoft secara langsung tanpa melalui proxy padahal sambungan Internet dari PC saya harus melalui proxy. Setelah otak-atik ternyata tidak berhasil juga.

    Senin sore saya melihat blog di http://maseko.com/2007/11/15/windows-live-writer-2008-final-version/ dan setelah didownload paket yang dia sertakan. Alhamdulillah saya kini dapat nge-blog lagi menggunakan Windows Live Writer.

    image

    Makasih Mas Eko.

    Share this post: | | | |