Agusto Xaverius...'s profileAgusto Xaverius P SBlogNetwork Tools Help

Agusto Xaverius P S

Agusto Xaverius P Sipahutar

Occupation
Location
Interests
http://geeks.netindonesia.net/blogs/agusto

MCP ID# 3552391
This person's network is empty (or maybe they're keeping it private).
December 04

Turing Ke Anyar

Sabtu ini saya akan pergi ke Anyar bersama club motor saya yang mana baru pertama kalinya saya ikut klub motor.

Klub motor kami akan melakukan peresmian pembukaan Klub Motor Power (Pulsar Owner) untuk cabang Tangerang.

Kami juga mengundang sesepuh-sesepuh Power dari Jakarta dan tidak menutup kemungkinan Power dari cabang lain join di hari Sabtu ini.

Saya rasa juga seru nich rasanya bisa konvoi ama teman teman Power ke tempat tujuan dan juga di sana kami mengadakan barbekyu.

 

Nb: Ada Neter's di sini yang ikut Power, bisa dong copy darat setiap pertemuan antar Power nantinya

Ciaoooo

ViewState Compression with ICSharpCode.SharpZipLib

Saya lihat dari blog kita membicarakan mengenai menggunakan "Cache" yang juga tujuan nya untuk mengoptimalkan bandwidth, dan request ke server untuk melakukan job meload data yang biasa nya data itu pun ternyata dalam kurun waktu tertentu masih sama dengan data yang kita telah load sebelumnya.

Di bawah ini saya berikan contoh aplikasi mengkompres Viewstate di mana kita bisa juga menyimpan data di viewstate dan biasanya juga datagrid/gridview sangat besar menggunakan viewstate ini. Saya juga lihat pada saat penggunaan Crystal Report Viewer di Asp.Net saya lihat di aplikasi saya ViewState ini pun cukup besar penggunaan nya.

Oleh karena itu kita bisa melakukan optimasi dengan menggunakan zip compression bawan dari .Net 2.0 atau kita menggunakan library free dari ICSharpCode.SharpZipLib.

Code nya sbb :

1. Class  ZipUtil

using System;
using System.IO;
using System.Text;
using Zip = ICSharpCode.SharpZipLib.Zip.Compression;

namespace MyWeb
{
    public class ZipUtil
    {
        public static byte[] Compress(byte[] Bytes)
       {
           MemoryStream memory = new MemoryStream();
           ICSharpCode.SharpZipLib.Zip.Compression.Streams.DeflaterOutputStream stream =
               new ICSharpCode.SharpZipLib.Zip.Compression.Streams.DeflaterOutputStream(memory,new Zip.Deflater(Zip.Deflater.BEST_COMPRESSION),131072); 
           stream.Write(Bytes, 0, Bytes.Length);
           stream.Close();
           return memory.ToArray();
       }

        public static byte[] Decompress(byte[] Bytes)
        {
            ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputStream stream =
                new ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputStream(new MemoryStream(Bytes));
            MemoryStream memory = new MemoryStream();
            byte[] writeData = new byte[4096];
            int size;

            while (true)
            {
                size = stream.Read(writeData, 0, writeData.Length);
                if (size > 0)
                {
                    memory.Write(writeData, 0, size);
                }else break;
            }
            stream.Close();
            return memory.ToArray();
        }
    }  
}
 

2. Class PageViewStateZip

using System;
using System.IO;
using System.Web.UI;

/// <summary>
/// Summary description for PageViewStateZip
/// </summary>

namespace MyWeb

{
    public class PageViewStateZip : System.Web.UI.Page
    {
        protected override object LoadPageStateFromPersistenceMedium()
        {
            string vstate = this.Request.Form["__VSTATE"];
            byte[] bytes = System.Convert.FromBase64String(vstate);
            bytes = ZipUtil.Decompress(bytes);
            LosFormatter format = new LosFormatter();
            return format.Deserialize(System.Convert.ToBase64String(bytes));
        }

        protected override void SavePageStateToPersistenceMedium(object viewState)
        {
            LosFormatter format = new LosFormatter();
            StringWriter writer = new StringWriter();
            format.Serialize(writer, viewState);
            String viewStateStr = writer.ToString();
            byte[] bytes = System.Convert.FromBase64String(viewStateStr);
            bytes = ZipUtil.Compress(bytes);
            string vStateStr = System.Convert.ToBase64String(bytes);
            ClientScript.RegisterHiddenField("__VSTATE", vStateStr);
        }

    }
}

Setelah kita mempunyai ke-2 Class ini  , ubahlah  "System.Web.UI.Page" pada web aplikasi kita di inherit ke

class kita yang baru yaitu : PageViewStateZip

Saya dapatkan info ini dari : http://www.hanselman.com/blog/ZippingCompressingViewStateInASPNET.aspx,

Sub Report di Crystal Report dengan Method Push

Ada user yang bertanya bagaimana cara membuat sub report dimana data telah terbentuk tersebut menggunakan datatable / dataset.

Yup,  Crystal report bisa melakukan hal tersebut dengan menggunakan Method Push dan untuk lebih jelasnya dapat di lihat pada contoh code sbb :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TestCrystalReport
{
    public partial class Form1 : Form
    {
        private DataTable dtMaster;
        private DataTable dtDetail;
        public Form1()
        {
            InitializeComponent();
        }

        private void LoadData()
        {
            dtMaster = new DataTable("DataTable1");
            DataRow dr;
            dtMaster.Columns.Add("STOCK_CODE", typeof(string));
            dtMaster.Columns.Add("STOCK_DESC", typeof(string));
            dtMaster.Columns.Add("STOCK_VAL", typeof(System.Int32));

            DataRow row = dtMaster.NewRow();
            row["STOCK_CODE"] = "A000001";
            row["STOCK_DESC"] = "STOCK A";
            row["STOCK_VAL"] = "100";
            dtMaster.Rows.Add(row);

            row = dtMaster.NewRow();
            row["STOCK_CODE"] = "A000002";
            row["STOCK_DESC"] = "STOCK B";
            row["STOCK_VAL"] = "200";
            dtMaster.Rows.Add(row);

            row = dtMaster.NewRow();
            row["STOCK_CODE"] = "A000003";
            row["STOCK_DESC"] = "STOCK C";
            row["STOCK_VAL"] = "300";
            dtMaster.Rows.Add(row);

            row = dtMaster.NewRow();
            row["STOCK_CODE"] = "A000004";
            row["STOCK_DESC"] = "STOCK D";
            row["STOCK_VAL"] = "400";
            dtMaster.Rows.Add(row);

            row = dtMaster.NewRow();
            row["STOCK_CODE"] = "A000005";
            row["STOCK_DESC"] = "STOCK E";
            row["STOCK_VAL"] = "500";
            dtMaster.Rows.Add(row);

            dtDetail = new DataTable("DataTable2");
            dtDetail.Columns.Add("STOCK_CODE", typeof(string));
            dtDetail.Columns.Add("STOCK_BOM", typeof(string));
            dtDetail.Columns.Add("QTY", typeof(System.Int32));

            dr = dtDetail.NewRow();
            dr["STOCK_CODE"] = "A000001";
            dr["STOCK_BOM"] = "BOM1-A000001";
            dr["QTY"] = 1;
            dtDetail.Rows.Add(dr);

            dr = dtDetail.NewRow();
            dr["STOCK_CODE"] = "A000001";
            dr["STOCK_BOM"] = "BOM1-A000001";
            dr["QTY"] = 2;
            dtDetail.Rows.Add(dr);

            dr = dtDetail.NewRow();
            dr["STOCK_CODE"] = "A000001";
            dr["STOCK_BOM"] = "BOM2-A000001";
            dr["QTY"] = 3;
            dtDetail.Rows.Add(dr);

            dr = dtDetail.NewRow();
            dr["STOCK_CODE"] = "A000002";
            dr["STOCK_BOM"] = "BOM1-A000002";
            dr["QTY"] = 1000;
            dtDetail.Rows.Add(dr);

            dr = dtDetail.NewRow();
            dr["STOCK_CODE"] = "A000002";
            dr["STOCK_BOM"] = "BOM2-A000002";
            dr["QTY"] = 2000;
            dtDetail.Rows.Add(dr);

            dr = dtDetail.NewRow();
            dr["STOCK_CODE"] = "A000002";
            dr["STOCK_BOM"] = "BOM3-A000002";
            dr["QTY"] = 3000;
            dtDetail.Rows.Add(dr);

            dr = dtDetail.NewRow();
            dr["STOCK_CODE"] = "A000002";
            dr["STOCK_BOM"] = "BOM4-A000002";
            dr["QTY"] = 4000;
            dtDetail.Rows.Add(dr);

        }

        private void BindReport()
        {
             CrystalReport1 report = new CrystalReport1();
             report.Database.Tables["DataTable1"].SetDataSource(dtMaster);
             report.Subreports[0].Database.Tables["DataTable2"].SetDataSource(dtDetail);
             crystalReportViewer1.ReportSource = report;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            LoadData();
            BindReport();

        }
    }
}

Untuk sample code nya bisa di click ini :

http://cid-a57ff57d3f450af3.skydrive.live.com/self.aspx/Public/TestCrystalReport.zip

Project Monitoring System

Sebelum masuk company yang sekarang (Plasmedia) saya bekerja juga sebagai freelancer untuk merombak aplikasi PMS yang lama yang juga dulu saya kerjakan dengan company saya yang lama yaitu Inaweb (dengan sub division Sirius Teknologi).

Aplikasi ini tujuannya adalah mencatat semua track project ada ada versioning di setiap step penginputan yang ada. Aplikasi itu dulu di buat dengan menggunkan ASP Classic 3.0, dan business logic nya kami menggunkan VB component, karena itu standar di company kami.

Kini aplikasi tersebut sudah mengalamai banyak yang harus di ubah sehingga mereka memanggil saya untuk membantu mereka merombak aplikasi ini, dan akhirnya saya menggunakan ASP .Net dan telah di gunakan oleh mereka.

Tanggal 15 Februari 2007 ini user yang menggunakan aplikasi PMS ini mempresentasikan aplikasi ini ke Sekjen ASEAN kita yaitu Ong Keng Yong, dan  mereka mengirimkan email  kepada saya  bahwa  presentasi  mereka sukses dan  bulan juni  nanti akan  dipersentasikan  ke  member country.

Saya sebagai programmer di PMS ini merasa bangga sekali aplikasi saya bisa di presentasikan ke Sekjen ASEAN.

NB:

Terima kasih untuk:

Cena Maxfield and Shinta Manurung from Nathanic USA (http://www.nathaninc.com)  mempercayai kami untuk sebagai pendana
Bagus Rafiki, Agus Nugroho, Nalindra, Rini dari ASEAN
Irwan Julis, Patner saya dapat menyelesaikan aplikasi PMS ini

 

Teknologi:

ASP Net 2.0 C# language, Anthem 1.3.2, SQL Server 2000

Buat Department site di WSS v3

Deployment yang ke-3 adalah membuat department site di sharepoint.

Request dari client adalah menu department menampilkan list department yang user tersebut mempunyai hak akses ke department tersebut.

Hal yang di lakukan adalah :

1. Membuat satu sub site department dari site yang sekarang,  dan dari situ lah kita membuat subsite lagi

berdasarkan department yang ada.

Bila di hiraki menjadi Home > department > It Department

Dari sini kita akan lebih mudah list semua department yang ada, contoh coding nya sbb :

private void LoadDepartmentList()
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();  
        try
        {
            _spSite = new Microsoft.SharePoint.SPSite(UrlBase + "department");  // url base ini adalah site sharepoint wss.


            _spWeb = _spSite.OpenWeb();

           //Gunakan GetSubwebsForCurrentUser untuk menampilan semua site yang bisa di akses oleh user

            foreach (Microsoft.SharePoint.SPWeb web in _spWeb.GetSubwebsForCurrentUser())
            {
                 string urlsite = web.Url;

                 string title = web.Title.ToString();
                 sb.append(title + "\n");                 
                 counter++;
            }
            _listDepartment = sb.ToString().Trim();
        }
        catch
        {
            _listDepartment = string.Empty;
        }
    }      

dan hasilnya bisa di lihat pada gambar di bawah ini.

department list wss 

 

2. Membuat satu subsite di bawah site department, dan di simpan sebagai site template, sehingga

   setiap ada request untuk pembuat site department kita tinggal membuat dari site template yang

  telah kita buat.


Uiiiiiiih, semoga deployment fase 3 ini kelar.