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

Penarikan Dana dari PayPal ke Bank Lokal

Kemaren saya mendapatkan email dari PayPal yang memberitakan bahwa sekarang penarikan dana dari PayPal dapat dilakukan melalui bank lokal Indonesia. Seperti diterangkan dalam halaman panduan http://pages.ebay.ph/bankwithdrawal/, bahwa kita diminta untuk memasukkan data bank dan rekening. Dari halaman tersebut sudah jelas bagaimana cara untuk memasukkan data bank dan rekening namun terdapat masalah yang mengenai salah satu field yang diminta yaitu bank code.

Kemaren saya coba menghubungi bank BCA dan sang operator dengan suara merdu menerangkan bahwa sekarang tidak ada bank code, sebagai gantinya adalah swift code. Setelah saya coba ternyata swift code memiliki panjang delapan digit sedangkan bank code sebanyak tujuh digit. Selanjutnya saya coba cari informasi lagi dan mendapatkan bahwa bank code terdiri dari tiga digit kode bank dan empat digit kode cabang. Berikut adalah daftar kode bank berdasarkan data dari Bank Indonesia.

No.
Nama Bank
Kode
1 BNI 009
2 Bank Mandiri 008
3 Bank BRI 002
4 Bank Danamon 011
5 Bank Niaga 022
6 Bank Permata 013
7 Bank Mega 426
8 Bank Bukopin 441
9 Bank Muamalat Indonesia 147
10 Bank NISP 028
11 Bank Mayapada 097
12 Bank Syariah Mandiri 451
13 Bank Syariah Mega Indonesia 506
14 Bank Arta Niaga Kencana 020
15 Bank Buana Indonesia 023
16 ABN AMRO Bank 052
17 Lippobank 026
18 Bank Ganesha 161
19 Bank Mayora 553
20 Bank International Indonesia 016
21 Bank Bumiputera 485
22 Bank Nusantara Parahyangan 145
23 Bank Mestika 151
24 Bank IFI 093
25 Bank Panin 019
26 Bank Commonwealth 950
27 Bank Agroniaga 494
28 Bank HS 1906 212
29 Bank Eksekutif 558
30 Bank Artos Indonesia 542
31 Bank Swadesi 146
32 Standard Chartered Bank 050
33 BPD Lampung 121
34 BPD DIY 112
35 Bank Sulut 127
36 Bank BPD Jambi 115
37 Bank Riau 119
38 BPD Bali 129
39 Bank BPD Kaltim 124
40 Bank Jatim 114
41 Bank Nagari 118
42 BPD Aceh 116
43 Bank Papua 132
44 BPD Kalsel 122
45 Bank DKI 111
46 Bank Ina Perdana 513
47 Bank Sumut 117
48 Bank Maluku 131
49 Bank BPD Sulsel 126
50 Bank NTT 130
51 Bank BPD NTB 128
52 Bank Jabar 110
53 BPD Kalteng 125
54 Bank BPD Sultra 135
55 Bank Bengkulu 133
56 Bank Central Asia 014
57 Bank Kesawan 167
58 Bank UIB 536
59 Bank Maspion 157
60 Bank Sumsel 120
61 Bank Artha Graha International 037
62 Bank Bumi Artha 076
63 Bank Haga 089
64 Bank Harda 567
65 Bank Jasa Jakarta 472


Empat digit kode cabang dapat ditanyakan ke bank yang bersangkutan. Untuk BCA kode cabang dapat dicari di http://www.klikbca.com/individual/silver/network.html. Daftar kode cabang BCA kota Semarang adalah sebagai berikut.

Nama & Kode Cabang
Alamat
KCP Bangkong
7830
Jln. MT Haryono 337 Semarang
024-3565405, 3565406
KCP Banyumanik
8030
Ruko Srondol Square Blok 5 & 6, Jln. Setiabudi No. 147 Semarang
024-7473502
KCU GANG TENGAH
0182
Jln Gang Tengah 88 Semarang
024-3516854, 3516856
KCP Gatot Subroto
7960
Kawasan Industri Candi Kompleks Ruko, Jl. Gatot Subroto Blok E-37 F dan E-37 G Semarang
024-7611765, 7612364
KCP Industri
0353
Jln. Raya Kaligawe 204 A Semarang
024-6584320, 6581091
KCP Kanjengan
0017
Jln. Kanjengan Blok A 24-25 Semarang
024-3548535, 3544564
KCP Majapahit
0462
Jln. Majapahit 112 Semarang
024-6722048, 6722049
KCP MT Haryono
0252
Jln. MT Haryono 657 Semarang
KCU SEMARANG
0009
Jln. Pemuda 90-92 Semarang
024-3510575(hunting) 3548003(hunti
KCP Siliwangi
0246
Jln. Jend. Sudirman 39 Semarang
024-7601435, 7605611
KCP Suari
0409
Jln. Suari 18 Semarang
024-3556578, 3554773, 3554774
KCP Tanjung Mas
8035
Gedung Terminal Peti Kemas, Jln. Coaster Pelabuhan 10 A Semarang
...-...
KCP Telogorejo
0426
Jl. KH Ahmad Dahlan No. 25 Semarang
024-8412254, 8411907
 

Dari daftar cabang tersebut, bank code untuk BCA KCP Siliwangi adalah 0140246.

Penulisan nama bank diikuti dengan nama cabang, contoh: Bank Central Asia KCP Siliwangi.

Tambahan informasi bahwa penarikan dana dari PayPal dikenakan biaya Rp16.000,00 jika jumlah dana yang ditarik kurang dari Rp.1.500.000,00. Untuk penarikan minimal Rp1.500.000,00 tidak dikenakan biaya. Sedangkan biaya penarikan dikenakan oleh bank penerima yang besarnya sesuai dengan kebijakan masing-masing bank. BCA mengenakan biaya USD 5 pada tiap transaksi penerimaan dari luar negeri. Secara lengkap informasi biaya yang dibebankan oleh BCA dapat dilihat di http://www.klikbca.com/individual/silver/Ind/rates.html?s=12. Untuk bank lain dapat ditanyakan ke bank yang bersangkutan.

 

 


Tags:
Permalink | Comments (24) | Post RSSRSS comment feed

Ajax Upload dengan Hidden IFrame

Salah satu permasalahan pada ASP.NET AJAX Update Panel adalah tidak dapat melakukan asynchronous communication pada proses upload file. Hal ini disebabkan karena pada dasarnya object XMLHttpRequest (XHR) tidak dapat mengirimkan sebuah file dengan alasan keamanan. Pada beberapa situs seperti Google Mail dan Community Server tetap dapat melakukan upload file tanpa me-refresh seluruh halaman.

Solusi Alternatif

Saah satu alternatif cara untuk melakukan upload tanpa harus me-refresh seluruh halaman adalah menggunakan IFrame yang tersembunyi (hidden IFrame). Pada halaman utama disisipkan sebuah iframe yang berisi sebuah halaman kosong dan pada form target halamannya diarahkan ke halaman kosong yang ada di dalam iframe tersebut. Dengan cara ini hanya bagian IFrame saya yang akan melakukan komunikasi dengan server tanpa mempengaruhi keseluruhan halaman.

Langkah langkah trik ini adalah sebagai berikut.

  1. Tambahkan hidden IFrame pada halaman dan set sembunyikan dengan style="display:none".


    <iframe name="hiddenFrame" src="blank.htm" mce_src="blank.htm" style="display:none"></iframe>

  2. Buat file blank.htm pada sollution.
    File ini dibutuhkan untuk memastikan bahwa IFrame masih dalam lingkup domain yang sama dengan halaman utama. Jika file blank.htm berada di luar domain (misal default blank.htm yang ada di komputer lokal) maka akan ada penolakan hak akses terhadap eksekusi script di luar domain.
  3. Tambahkan kontrol FileUpload ke dalam form

    <asp:FileUpload ID="fileUpload1" runat="server" />
  4. Buat fungsi submitForm yang berfungsi melakukan submit terhadap hidden IFrame.

    // Fungsi memiliki dua parameter yang berisi referensi element IFrame
    // dan element ID control FileUpload
    function submitForm(frameName,upload){
         // Diasumsikan bahwa halaman utama adalah default.aspx
         document.forms[0].action="default.aspx"
         // Inti dari trik ini adalah mengeset target form ke hidden IFrame
         document.forms[0].target=frameName;
         // setTimeout digunakan untuk mengupdate dokumen dengan thread yang terpisah,
         // jika tidak maka dokumen tidak akan baru terupdate setelah download selesai.
         window.setTimeout(function(){
             var uploadE=document.getElementById(upload);
             uploadE.parentElement.appendChild(document.createTextNode(uploadE.value));
             uploadE.parentElement.replaceChild(uploadE.cloneNode(true),uploadE);
         },100);
         document.forms[0].submit();
    }
  5. Buat tombol dan tambahkan attribute onclick untuk memanggil fungsi submitForm yang telah dibuat sebelumnya.

    <button onclick="javascript:submitForm('hiddenFrame','<%= fileUpload1.ClientID %>')">Upload</button>
  6. Tambahkan web kontrol label yang akan diisi dengan jam pertama kali halaman dimuat,

    <asp:Label ID="lblTime" runat="server" />
  7. Pada code behind, saat Page_Load set label dengan jam berjalan dan cek jika ada file yang diupload, simpan ke dalam server.

    protected void Page_Load(object sender, EventArgs e)
    {
         lblTime.Text = DateTime.Now.ToLongTimeString();
         if (fileUpload1.HasFile)
        {
             fileUpload1.SaveAs(Server.MapPath("App_Data/") + fileUpload1.FileName);
         }
    }
  8. Selesai

Dari langkah-langkah tersebut di atas, secara lengkap kode dapat dilihat sebagai berikut.

File default.aspx


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="HiddenIFrameUpload._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>    <asp:Label ID="lblTime" runat="server" />    <iframe name="hiddenFrame" src="blank.htm" style="display:none"></iframe>    <form id="form1" runat="server" enctype="multipart/form-data" >         <div id="uploadContainer">              <asp:FileUpload ID="fileUpload1" runat="server" />              <button onclick="javascript:submitForm('hiddenFrame','<%= fileUpload1.ClientID %>')">Upload</button>         </div>     </form>    <script type="text/javascript">         function submitForm(frameName,upload){             document.forms[0].action="Default.aspx"             document.forms[0].target=frameName;             window.setTimeout(function(){                  var uploadE=document.getElementById(upload);                  uploadE.parentElement.appendChild(document.createTextNode(uploadE.value));                  uploadE.parentElement.replaceChild(uploadE.cloneNode(true),uploadE);             },100);             document.forms[0].submit();    }    </script></body></html>

File default.aspx.cs


using System;
using System.Web;

namespace HiddenIFrameUpload
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            lblTime.Text = DateTime.Now.ToLongTimeString();
            if (fileUpload1.HasFile)
            {
                fileUpload1.SaveAs(Server.MapPath("App_Data/") + fileUpload1.FileName);
            }

        }
    }
}

HiddenIFrameUpload.zip (5.88 kb)


Permalink | Comments (14) | Post RSSRSS comment feed

Invoke Web Service Menggunakan XMLHttpRequest

Banyak library Ajax yang sudah gede dan banyak fiturnya seperti ASP.NET AJAX, Anthem.NET, AjaxAnywhere, ajaxCFC, AJS, Dojo, Rico dan beberapa library lainnya. Dalam tulisan ini akan saya jelaskan konsep invoke Web Service langsung menggunakan objek XMLHttpRequest (XHR). Saya asumsikan bahwa pembaca sudah memahami konsep dasar XMLHttpRequest, jika belum silakan baca tulisan saya sebelumnya di Pengenalan AJAX.

Pertama buat root object dengan nama Masykur, root object ini bisa disamakan sebagai namespace pada OOP.

if (!window.Masykur) {
    window.Masykur = {};
}

Setelah root object dibuat kemudian buat member yang berisi DOM dan Ajax. DOM digunakan untuk mendapatkan informasi DOM dan browser sedangkan Ajax adalah object yang menangani komunikasi singkron dengan Web Service.

if (!Masykur.DOM) {
    Masykur.DOM = function() {}
}
if (!Masykur.Ajax) {
    Masykur.Ajax = function() {}
}

Pada objek Masykur.DOM, tambahkan property untuk pengecekan browser. Pengecekan browser ini digunakan untuk mengecek kemampuan dari masing-masing browser karena masing-masing browser menggunakan objek yang berbeda untuk menangani XHR maupun dokumen XML.

Masykur.DOM.isInternetExplorer = (navigator.userAgent.indexOf("MSIE") >= 0);
Masykur.DOM.isMozilla = (navigator.userAgent.indexOf("Gecko") >= 0);
Masykur.DOM.isOpera = (navigator.userAgent.indexOf("Opera") >= 0);

Pada objek Masykur.Ajax, buat variabel nameSpace yang digunakan sebagai namespace pada Envelope SOAP. Selain variabel juga tambahkan fungsi set dan get namespace.

Masykur.Ajax = function() {
    var nameSpace = "http://tempuri.org/";
    this.setNameSpace = function(ns){
        nameSpace = ns;
    }//end setNameSpace()
    
    this.getNameSpace = function(){
        return nameSpace;
    }//end getNameSpace()
}

Buat objek XHR lintas browser dengan mencoba semua metode dari create XMLHttpRequest dari JavaScript object, ActiveX dan SOAPCall object. Ini dimaksudkan supaya semua library tidak tergantung dengan browser yang digunakan, dapat berjalan baik IE, Firefox maupun Opera.

Masykur.Ajax = function(){
    // ...
    var ajaxObject = function(){
        try{return new XMLHttpRequest();}catch(ex){};
        try{return new ActiveXObject("Microsoft.XMLHTTP");}catch(ex){};
        try{return new SOAPCall();}catch(ex){};
    }//end ajaxObject()
}

Buat fungsi penanganan error yang kemudian dapat di-override dengan fungsi sendiri saat digunakan.

Masykur.Ajax = function(){
    // ...
    this.onError = function(error){
        alert(error);
    }//end onError()
}

Setelah semua persiapan objek XHR selesai, sekarang tinggal buat fungsi callService untuk invoke ke Web Service.

Masykur.Ajax = function(){
    // ...
    this.callService = function(serviceUrl, soapMethod, callbackFunction /*, unlimited params */){
        // code
    }
}

Pertama yang perlu disiapkan adalah URL web service. Tambahkan "?WSDL" dibelakang URL.

if(serviceUrl.indexOf("http://") < 0)
    serviceUrl = "http://" + serviceUrl;
serviceUrl += "?WSDL";

Hal penting yang harus disiapkan adalah envelope untuk membungkus data yang akan dikirimkan ke server. Envelope berisi semua parameter yang dibutuhkan oleh web service method. Parameter dibungkus dalam tag <soap:Body>, nama parameter merupakan sebuah elemen child <soap:Body> dan valuenya dimasukkan sebagai text element parameter.

var soapEnvelope = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
soapEnvelope += "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ";
soapEnvelope += "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" ";
soapEnvelope += "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
soapEnvelope += "<soap:Body>";
soapEnvelope += "<" + soapMethod + " xmlns=\"" + nameSpace + "\">";

if(arguments.length > 3){
    for (var i = 3; i < arguments.length; i++)
    {
        var params = [];
        var arg = arguments[i];
        var ieq = arg.indexOf('=');
        params[0] = arg.substr(0, ieq);
        params[1] = arg.substr(ieq + 1);
        soapEnvelope += "<" + params[0] + ">";
        soapEnvelope += params[1];
        soapEnvelope += "</" + params[0] + ">";
    }//end for
}//end if

soapEnvelope += "</" + soapMethod + ">";
soapEnvelope += "</soap:Body>";
soapEnvelope += "</soap:Envelope>";

Set event onreadystate pada objek XHR dan kembalikan hasil respon web service dalam format string setelah semua data lengkap diterima.

Terakhir buka sambungan dengan server menggunakan mode POST dan set header content-type menjadi "text/xml" dan tambahkan juga header "soapaction" dengan data namespace diikuti dengan soap method. Kirimkan soap envelope pada request body seperti pada kode berikut.

ao.open("POST", serviceUrl, true);
ao.setRequestHeader("Content-Type", "text/xml");
ao.setRequestHeader("soapaction", nameSpace + soapMethod);
ao.send(soapEnvelope);

Script lengkap dapat dilihat pada kode berikut.

if (!window.Masykur) {
    window.Masykur = {};
}
if (!Masykur.DOM) {
    Masykur.DOM = function() {}
}
if (!Masykur.Ajax) {
    Masykur.Ajax = function() {}
}
Masykur.DOM.isInternetExplorer = (navigator.userAgent.indexOf("MSIE") >= 0);
Masykur.DOM.isMozilla = (navigator.userAgent.indexOf("Gecko") >= 0);
Masykur.DOM.isOpera = (navigator.userAgent.indexOf("Opera") >= 0);

Masykur.Ajax = function(){

    var nameSpace = "http://tempuri.org/";
    
    //private method for returning an ajax enabled
    //object specific to a browser
    var ajaxObject = function(){
        try{return new XMLHttpRequest();}catch(ex){};
        try{return new ActiveXObject("Microsoft.XMLHTTP");}catch(ex){};
        try{return new SOAPCall();}catch(ex){};
    }//end ajaxObject()
    
    this.onError = function(error){
        alert(error);
    }//end onError()

    this.callService = function(serviceUrl, soapMethod, callbackFunction /*, unlimited params */){
        
        var callServiceError = this.onError;
        
        var ao = ajaxObject();
        
        if(!ao.encode){
            if(serviceUrl.indexOf("http://") < 0)
                serviceUrl = "http://" + serviceUrl;
            serviceUrl += "?WSDL";
            
            var soapEnvelope = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
            soapEnvelope += "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ";
            soapEnvelope += "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" ";
            soapEnvelope += "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
            soapEnvelope += "<soap:Body>";
            soapEnvelope += "<" + soapMethod + " xmlns=\"" + nameSpace + "\">";
            
            if(arguments.length > 3){
                for (var i = 3; i < arguments.length; i++)
                {
                    var params = [];
                    var arg = arguments[i];
                    var ieq = arg.indexOf('=');
                    params[0] = arg.substr(0, ieq);
                    params[1] = arg.substr(ieq + 1);
                    soapEnvelope += "<" + params[0] + ">";
                    soapEnvelope += params[1];
                    soapEnvelope += "</" + params[0] + ">";
                }//end for
            }//end if
            
            soapEnvelope += "</" + soapMethod + ">";
            soapEnvelope += "</soap:Body>";
            soapEnvelope += "</soap:Envelope>";
            
            ao.onreadystatechange = function(){
                
                if(ao.readyState == 4){
                    
                    if(Masykur.DOM.isOpera){
                        //opera
                        var response = ao.responseXML.getElementsByTagName(soapMethod + "Result")[0];
                        if(!response)
                            response = ao.responseXML.getElementsByTagName(soapMethod + "Response")[0];
                        if(!response){
                            callServiceError("WebService does not contain a Result/Response node");
                            return;
                        }//end if
                        
                        ao.callbackFunction(ao.responseXML.getElementsByTagName(soapMethod + "Result")[0].innerHTML);
                    }
                    else if(Masykur.DOM.isInternetExplorer){
                        //IE
                        var responseXml = new ActiveXObject('Microsoft.XMLDOM');
                        responseXml.loadXML(ao.responseText);
                            
                        var responseNode = responseXml.selectSingleNode("//" + soapMethod + "Result");
                        if(!responseNode)
                            responseNode = responseXml.selectSingleNode("//" + soapMethod + "Response");
                        if(!responseNode) {
                            callServiceError("Response/Result node not found.\n\nResponse:\n" + ao.responseText);
                            return;
                        }//end if
                        var resultNode = responseNode.firstChild;
                        if (resultNode != null){
                            try{
                                callbackFunction(resultNode.xml);
                            }
                            catch(ex){
                                callServiceError(ex);
                            }//end tc
                        }
                        else{
                            try{
                                callbackFunction();
                            }
                            catch(ex){
                                callServiceError(ex);
                            }//end tc
                        }//end if
                    }
                    else if(Masykur.DOM.isMozilla){
                        //Mozilla
                        var xmlDocument = new DOMParser().parseFromString(ao.responseText, "text/xml");
                        
                        var xr = xmlDocument.evaluate("//" + soapMethod + "Result", 
                                 xmlDocument.childNodes[xmlDocument.childNodes.length-1], 
                                 null, 
                                 XPathResult.ANY_TYPE, null);
                        var responseNode = xr.iterateNext();
                        
                        if(!responseNode)
                            callServiceError("Response/Result node not found.\n\nResponse:\n" + ao.responseText);
                        
                        var resultNode = responseNode.firstChild;
                        
                        if (resultNode != null){
                            try{
                                callbackFunction(resultNode.textContent);
                            }
                            catch(ex){
                                callServiceError(ex);
                            }//end tc
                        }
                        else{
                            try{
                                callbackFunction();
                            }
                            catch(ex){
                                callServiceError(ex);
                            }//end tc
                        }//end if
                    }//end if
                }//end if
            };
            
            ao.open("POST", serviceUrl, true);            
            ao.setRequestHeader("Content-Type", "text/xml");
            ao.setRequestHeader("soapaction", nameSpace + soapMethod);
            try{
                ao.send(soapEnvelope);
            }
            catch(ex){
                serviceCallError(ex);
            }//end tc
        }
        else{
            var soapParams = new Array();
            var headers = new Array();
            var soapVersion = 0;
            var object = nameSpace;
            
            if(serviceUrl.indexOf("http://") < 0)
                serviceUrl = document.location + serviceUrl;
            
            ao.transportURI = serviceUrl;
            ao.actionURI = nameSpace + soapMethod;
            
            for(var i=3; i<arguments.length; i++){
                var params = arguments[i].split("=");
                soapParams.push( new SOAPParameter(params[1],params[0]) );
            }//end for
            
            try{
                ao.encode(soapVersion, soapMethod, object, headers.length, headers, soapParams.length, soapParams);
            }
            catch(ex){
                serviceCallError(ex);
            }//end tc
        
            try{
                netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
            } 
            catch(ex){
                return false;
            }//end tc
            
            try{
                ao.asyncInvoke(
                    function(resp,call,status){

                    if(resp.fault)
                        return callServiceError(resp.fault);
                    if(!resp.body){
                        callServiceError("Service " + call.transportURI + " not found.");
                    }
                    else{
                        try{
                            callbackFunction(resp.body.firstChild.firstChild.firstChild.data);
                        }
                        catch(ex){
                            callServiceError(ex);
                        }//end tc
                    }//end if
                }
                );
            }
            catch(ex){
                serviceCallError(ex);
            }//end tc
                        
        }//end if
        
    }//end callService()
    
    this.setNameSpace = function(ns){
        nameSpace = ns;
    }//end setNameSpace()
    
    this.getNameSpace = function(){
        return ns;
    }//end getNameSpace()
    
}//end Masykur.Ajax()

Categories: AJAX | JavaScript
Permalink | Comments (17) | Post RSSRSS comment feed

Selamat Tahun Baru 1429

Hari ini merupakan hari terahir di tahun 1428, dan saat maghrib tiba bergantilah kita pada tahun baru 1429. Mari kita bersama-membaca doa akhir tahun dan awal tahun. Semoga Allah SWT. mengampuni segala dosa dan kesalahan kita.

Do'a akhir tahun.

image

Artinya:

"Dengan menyebut nama Allah Yang Maha Pemurah lagi Maha Penyayang.

Semoga Allah melimpahkan rahmat dan keselamatan kepada junjungan kami nabi Muhammad SAW,beserta para keluarga dan sahabatnya.

Ya Allah, segala yang telah ku kerjakan selama tahun ini dari apa yang menjadi larangan-Mu, sedang kami belum bertaubat,padahal Engkau tidak melupakannya dan Engkau bersabar (dengan kasih sayang-Mu), yang sesungguhnya Engkau berkuasa memberikan siksa untuk saya, dan Engkau telah mengajak saya untuk bertaubat sesudah melakukan maksiat.Karena itu ya Allah, saya mohon ampunan-Mu dan berilah ampunan kepada saya dengan kemurahan-Mu.

Segala apa yang telah saya kerjakan, selama tahun ini, berupa amal perbuatan yang Engkau ridhai dan Engkau janjikan akan membalasnya dengan pahala, saya mohon kepada-Mu, wahai Dzat YangMaha Pemurah, wahai Dzat Yang Mempunyai Kebesaran dan Kemuliaan,semoga berkenan menerima amal kami dan semoga Engkau tidak memutuskan harapan kami kepada-Mu, wahai Dzat Yang MahaPemurah.

Dan semoga Allah memberikan rahmat dan kesejahteraan atas penghulu kami Muhammad,keluarga dan sahabatnya."

Amin yaa rabbal 'alamin.

Doa awal tahun.

image

Artinya:

"Dengan nama Allah Yang Maha Pengasih lagi Maha Penyayang. Semoga rahmat dan salam Allah tetap tercurahkan kepada junjungan kami Nabi Muhammad teriring keluarga serta sahabat beliau.
Wahai Tuhanku, Paduka adalah Dzat Yang Maha Kekal, dahulu dan Awal. Hanya denga anugrah dan kemurahan-Mu yang agung, telah datang tahun baru. Di tahun ini kami memohon pemeliharaan-Mu dari Syetan, kekasihnya dan balatentaranya, dan kami memohon pertolongan-Mu atas hawa nafsu yang mengajak kepada kejelekan, dan kami memohon kesibukan dengan perbuatan yang dapat mendekatkan diri kami kepada-Mu wahai Dzat yang memiliki kebesaran dan kemuliaan. Semoga rahmat dan salam Allah tetap tercurahkan kepada junjungan kami Nabi Muhammad teriring keluarga serta sahabat beliau."
Amiin ya robbal 'alamiin...


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

Extend Objek Date JavaScript untuk Parsing Format Tanggal ISO 8601

Perbedaan format tanggal memang menjadi permasalahan para programmer saat melakukan pertukaran data dengan tipe data Date antara satu sistem dengan sistem lainnya, antara format negara satu dengan negara lainnya. Dengan adanya perbedaan ini, dibuat standar ISO dalam merepresentasikan tanggal dalam string. Standar tersebut disebut sebagai ISO 8601. Pada standar ISO 8601, tanggal ditulis dalam format YYYY-MM-DDThh:mm:ss.sTZD. Standar ISO 8601 ini telah bayak digunakan dalam format pertukaran data seperti XML Web-Service.

Constructor Date JavaScript hanya memiliki empat bentuk sebagai berikut.

new Date()
new Date(milliseconds)
new Date(dateString)
new Date(yr_num, mo_num, day_num
        [, hr_num, min_num, sec_num, ms_num]) 

Keempat bentuk constructor tersebut tidak memiliki parameter input dalam format string ISO 8601. Pada parameter string hanya menerima tanggal dalam standar IETF seperti "Thu, 3 Jan 2008 18:30:00 GMT". Untuk melakukan parsing tanggal dalam format ISO 8601 dapat dilakukan dengan meng-extend object Date yang sudah ada (hal ini seperti penurunan/inheritance pada konsep Object Oriented Programming). Berikut kode untuk melakukan extend object Date.

 

Date.prototype.parseFromISO8601 = function (string) {
    var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
        "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
        "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
    var d = string.match(new RegExp(regexp));

    var offset = 0;
    var date = new Date(d[1], 0, 1);

    if (d[3]) { date.setMonth(d[3] - 1); }
    if (d[5]) { date.setDate(d[5]); }
    if (d[7]) { date.setHours(d[7]); }
    if (d[8]) { date.setMinutes(d[8]); }
    if (d[10]) { date.setSeconds(d[10]); }
    if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
    if (d[14]) {
        offset = (Number(d[16]) * 60) + Number(d[17]);
        offset *= ((d[15] == '-') ? 1 : -1);
    }

    offset -= date.getTimezoneOffset();
    time = (Number(date) + (offset * 60 * 1000));
    this.setTime(Number(time));
}

Dengan menggunakan regular expression, string tanggal dipecah ke dalam nilai tahun, bulan, tanggal, jam, menit, detik, milidetik dan offset zona waktu. Penggunaan parser ini sangat sederhana seperti pada contoh berikut.

var tgl = new Date();
tgl.parseFromISO8601('2008-01-03T18:30:00');

Sebaliknya, untuk merubah objek Date menjadi string ISO 8601 juga dapat dilakukan dengan menambahkan fungsi toISO8601String ke dalam objek Date.

Date.prototype.toISO8601String = function (format, offset) {
    /* accepted values for the format [1-6]:
     1 Year:
       YYYY (eg 1997)
     2 Year and month:
       YYYY-MM (eg 1997-07)
     3 Complete date:
       YYYY-MM-DD (eg 1997-07-16)
     4 Complete date plus hours and minutes:
       YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)
     5 Complete date plus hours, minutes and seconds:
       YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)
     6 Complete date plus hours, minutes, seconds and a decimal
       fraction of a second
       YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00)
    */
    if (!format) { var format = 6; }
    if (!offset) {
        var offset = 'Z';
        var date = this;
    } else {
        var d = offset.match(/([-+])([0-9]{2}):([0-9]{2})/);
        var offsetnum = (Number(d[2]) * 60) + Number(d[3]);
        offsetnum *= ((d[1] == '-') ? -1 : 1);
        var date = new Date(Number(Number(this) + (offsetnum * 60000)));
    }

    var zeropad = function (num) { return ((num < 10) ? '0' : '') + num; }

    var str = "";
    str += date.getUTCFullYear();
    if (format > 1) { str += "-" + zeropad(date.getUTCMonth() + 1); }
    if (format > 2) { str += "-" + zeropad(date.getUTCDate()); }
    if (format > 3) {
        str += "T" + zeropad(date.getUTCHours()) +
               ":" + zeropad(date.getUTCMinutes());
    }
    if (format > 5) {
        var secs = Number(date.getUTCSeconds() + "." +
                   ((date.getUTCMilliseconds() < 100) ? '0' : '') +
                   zeropad(date.getUTCMilliseconds()));
        str += ":" + zeropad(secs);
    } else if (format > 4) { str += ":" + zeropad(date.getUTCSeconds()); }

    if (format > 3) { str += offset; }
    return str;
}

Fungsi di atas memiliki dua parameter yang pertama adalah format yang disediakan dan kedua adalah offset zona waktu. Penggunaannya juga sangat sederhana seperti terlihat pada contoh berikut.

var strISO = tgl.toISO8601String(6);

Dengan menambahkan kedua fungsi tersebut di atas, maka data dalam format ISO 8601 seperti yang berasal dari call webservice dapat diparsing dengan mudah.


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

Upgrade BlogEngine.NET ke versi 1.3

Alhamdulillah situs www.masykur.web.id telah berhasil diupgrade ke BlogEngine.NET versi terbaru (v1.3). Walaupun masih repot dalam proses upgrade, Alhamdulillah setelah lebih dari satu jam upload semua file yang dibutuhkan melalui web2ftp.de (karena direct FTP dari PC kantor saya tidak bisa). Sekarang www.masykur.web.id telah memiliki tenaga baru.

Untuk melakukan upgrade dari versi lama ke baru berikut sedikit tips yang mungkin berguna.

  1. Pastikan tidak ada file versi lama di dalam direktori App_Code, karena biasanya tiap kenaikan versi minor, ada beberapa file yang dihapus.
  2. Selamatkan theme yang telah dikustomisasi supaya tidak tertimpa dengan yang baru.
  3. Jangan timpa file yang ada di direktori App_Data karena direktori ini digunakan untuk menyimpan semua data dari daftar user dan password serta seting blog ada dalam direktori tersebut.
  4. Tidak perlu upload file dalam direktori admin\tiny_mce dan pics\flags karena tidak berisi file yang sama dari versi awal hingga sekarang.

Demikian sedikit informasi yang mungkin berguna bagi para pengguna BlogEngine.NET dalam melakukan upgrade.


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