Q:
Kenapa kalau kita mendapatkan exception message, kita tidak mendapatkan exception pada code yang men-invoke exception pertama kali atau kita mendapatkan exception message yang berbeda atau generic message?

A:
Kadang kala exception yang kita dapat pada try-catch, merupakan exception yang terjadi di luar lingkup code kita.
Atau kata lain exception itu terjadi bukan pada code anda, tapi pada function atau library yang di pakai pada lingkup try-catch .
Dan itu bisa lebih dari 1 stack/kumpulan exception.
Untuk itu kalau kita ingin mendapatkan pesan pertama atau exception pertama yang terjadi dari kumpulan exception, kita bisa menggunakan Method GetBaseException yang ada dalam Exception class.


// C#
try{
	// Your code
}
catch (Exception exception){
	Console.WriteLine(exception.GetBaseException());
}


' VB.Net
Try
	' Your Code 
Catch ex As Exception
	Console.WriteLine(ex.GetBaseException())
End Try
Share this post: | | | |

Q:
Bagaimana men-jalankan aplikasi .net lewat network drive?

A:
Cara ini hanya berlaku untuk .net 3.5 ke atas dengan tambahan di *.exe.config .

Tentu bila dalam assembly(aplikasi) menggunakan COM, cara ini tidak dapat dilakukan. CAS policy yang berlaku untuk COM agak sedikit complex untuk di-adjust dan lebih condong untuk setting DCOM.

Dengan meng-enable-kan setting ini, maka .net runtime akan membuat assembly(aplikasi) yang di network drive ( \\SomeComputer\App\MyNetworkApp.exe ) akan di buatkan sandbox dan di apply CAS policy secara automatis.


<configuration>
<runtime>
<loadFromRemoteSources enabled="true"/>
</runtime>
</configuration>
Share this post: | | | |

Q:
Bagaimana melihat list dari Reference Assembly sebuah .Net Program?

A:
Cara paling simple dengan menggunakan Mono.Cecil (https://github.com/jbevain/cecil).


// C#
// using Mono.Cecil;
const String asmFile = @"DotNetAssembly.dll.OR.exe";
var path = Path.Combine(Directory.GetParent(String.Concat(Environment.CurrentDirectory, @"\..\..")).FullName, asmFile);
var asmDef = AssemblyDefinition.ReadAssembly(path);

foreach (var anrRef in asmDef.MainModule.AssemblyReferences)
	Console.WriteLine(anrRef.Name);

Console.ReadLine();


' VB.Net
' Imports Mono.Cecil
Const asmFile As String = "DotNetAssembly.dll.OR.exe"
Dim asmDef = AssemblyDefinition.ReadAssembly(Path.Combine(Directory.GetParent(String.Concat(Environment.CurrentDirectory, "\..\..")).FullName, asmFile))

For Each asmRef In asmDef.MainModule.AssemblyReferences
	Console.WriteLine(asmRef.Name)
Next

Console.ReadLine()


// F#
#light
open System
open System.IO
open Mono.Cecil

let asmFile = "DotNetAssembly.dll.OR.exe"
let asmDef = AssemblyDefinition.ReadAssembly(Path.Combine(Directory.GetParent(String.Concat(Environment.CurrentDirectory, "\..\..")).FullName, asmFile))

for asmRef in asmDef.MainModule.AssemblyReferences do
   printfn "%s" asmRef.Name

Console.ReadLine() |> ignore


# IronPython
import clr

from System import *
from System.IO import *
from System.Collections import *
from System.Reflection import *

clr.AddReferenceToFileAndPath(Path.Combine(Environment.CurrentDirectory, 'Mono.Cecil.dll'))
from Mono.Cecil import *

asmFile = "DotNetAssembly.dll.OR.exe"
asmDef = AssemblyDefinition.ReadAssembly(Path.Combine(Directory.GetParent(Environment.CurrentDirectory).FullName, asmFile))

for i in range(asmDef.MainModule.AssemblyReferences.Count):
    print asmDef.MainModule.AssemblyReferences[ i ].Name
Share this post: | | | |
Posted Sunday, April 24, 2011 1:00 AM by dede | with no comments
Filed under: , , , , ,

Q:
Bagaimana cara kita mengambil value dari Dictionary dengan index-nya?

A:
Dictionary sendiri tidak memiliki index, tapi kita bisa meng-index-kan KeyCollection-nya.


// C#
var dictOfCountrys =
	new Dictionary
		{
			{"Jakarta", "Indonesia"},
			{"Tokyo", "Japan"},
			{"London", "England"},
			{"Sidney", "Australia"},
			{"Roma", "Italy"}
		};

var keyIndexNo2 = dictOfCountrys.Keys.ElementAtOrDefault(2);
var keyIndexLast = dictOfCountrys.Keys.ElementAtOrDefault(dictOfCountrys.Count - 1);

var valueIndexNo2 = dictOfCountrys[keyIndexNo2];
var valueIndexLast = dictOfCountrys[keyIndexLast];

Console.WriteLine("index: 2, key: {0}, value: {1}", keyIndexNo2, valueIndexNo2);
Console.WriteLine("index: {0}, key: {1}, value: {2}", dictOfCountrys.Count - 1, keyIndexLast, valueIndexLast);
Console.WriteLine("-------------------------------------------");


for (var i = 0; i < dictOfCountrys.Count; i++)
{
	var key = dictOfCountrys.Keys.ElementAtOrDefault(i);
	Console.WriteLine("index: {0}, key: {1}, value: {2}", i, key, dictOfCountrys[key]);
}

Console.Read();


' VB.Net
Dim dictOfCountrys = New Dictionary(Of String, String)
dictOfCountrys.Add("Jakarta", "Indonesia")
dictOfCountrys.Add("Tokyo", "Japan")
dictOfCountrys.Add("London", "England")
dictOfCountrys.Add("Sidney", "Australia")
dictOfCountrys.Add("Roma", "Italy")

Dim keyIndexNo2 = dictOfCountrys.Keys.ElementAtOrDefault(2)
Dim keyIndexLast = dictOfCountrys.Keys.ElementAtOrDefault(dictOfCountrys.Count - 1)

Dim valueIndexNo2 = dictOfCountrys(keyIndexNo2)
Dim valueIndexLast = dictOfCountrys(keyIndexLast)

Console.WriteLine("index: 2, key: {0}, value: {1}", keyIndexNo2, valueIndexNo2)
Console.WriteLine("index: {0}, key: {1}, value: {2}", dictOfCountrys.Count - 1, keyIndexLast, valueIndexLast)
Console.WriteLine("-------------------------------------------")

For i As Int32 = 0 To dictOfCountrys.Count - 1 Step 1
	Dim key = dictOfCountrys.Keys.ElementAtOrDefault(i)
	Console.WriteLine("index: {0}, key: {1}, value: {2}", i, key, dictOfCountrys(key))
Next

Console.Read()


// F#
open System
open System.Collections.Generic
open System.Linq

let dictOfCountrys = new Dictionary()
dictOfCountrys.Add("Jakarta", "Indonesia")
dictOfCountrys.Add("Tokyo", "Japan")
dictOfCountrys.Add("London", "England")
dictOfCountrys.Add("Sidney", "Australia")
dictOfCountrys.Add("Roma", "Italy");;

let keyIndexNo2 = dictOfCountrys.Keys.ElementAtOrDefault(2)
let keyIndexLast = dictOfCountrys.Keys.ElementAtOrDefault(dictOfCountrys.Count - 1)

let valueIndexNo2 = dictOfCountrys.Item(keyIndexNo2)
let valueIndexLast = dictOfCountrys.Item(keyIndexLast)

printfn "index: 2, key: %s, value: %s" keyIndexNo2 valueIndexNo2
printfn "index: %i, key: %s, value: %s" (dictOfCountrys.Count - 1) keyIndexLast valueIndexLast
printfn "-------------------------------------------"

for i = 0 to (dictOfCountrys.Count - 1) do
    let key = dictOfCountrys.Keys.ElementAtOrDefault(i)
    printfn "index: %i, key: %s, value: %s" i key (dictOfCountrys.Item(key))

Console.ReadLine() |> ignore


# IronPython
import clr
clr.AddReference('System.Core')
from System import *
from System.Collections import *
from System.Collections.Generic import *

import System
clr.ImportExtensions(System.Linq)

dict = { 'Jakarta':'Indonesia', 'Tokyo':'Japan', 'London':'England', 'Sidney':'Australia', 'Roma':'Italy' } 
dictOfCountrys = Dictionary[String, String](dict)

keyIndexNo2 = dictOfCountrys.Keys.ElementAtOrDefault(2)
keyIndexLast = dictOfCountrys.Keys.ElementAtOrDefault(dictOfCountrys.Count - 1)

valueIndexNo2 = dictOfCountrys[keyIndexNo2]
valueIndexLast = dictOfCountrys[keyIndexLast]

print 'index: 2, key: {0}, value: {1}'.format(keyIndexNo2, valueIndexNo2)
print 'index: {0}, key: {1}, value: {2}'.format(dictOfCountrys.Count - 1, keyIndexLast, valueIndexLast)
print '---------------------------------'

for i in range(dictOfCountrys.Count):
    key = dictOfCountrys.Keys.ElementAtOrDefault(i)
    print 'index: {0}, key: {1}, value: {2}'.format(i, key, dictOfCountrys[key])
Share this post: | | | |
Posted Saturday, April 23, 2011 1:00 AM by dede | with no comments
Filed under: , , , , ,

Q:
Bagaimana mendapatkan range data dari sebuah xls file?

A:
Cara paling simple dengan menggunakan LINQ to EXCEL.
Untuk menggunakannya perlu di refence LinqToExcel dan Remotion.Data.Linq.
Dan untuk .Net 4, di perlukan target framework (Project Property > Application > Target framework) .NET Framework 4 dan bukan .NET Framework 4 Client Profile.
Karena ini library ini menggunakan OleDB provider, maka coba di set project-nya untuk x86. Kecuali OleDB provider-nya sudah ter-install untuk x64, maka bisa di gunakan Any CPU(Project Property > Build > Platform target)


// C#
var rows = new ExcelQueryFactory("YourXlsFile").
			WorksheetRangeNoHeader("C5", "Z22", "YourSheetName").
			Select(x => new { No = x[0], Class = x[1], Teacher = x[3], Student = x[12] });

foreach (var row in rows)
{
	Console.WriteLine("No:{0}, Class:{1}, Teacher:{2}, Student:{3}",
						row.No, row.Class, row.Teacher, row.Student);
}


' VB.Net
Dim rows = New ExcelQueryFactory("YourXlsFile").WorksheetRangeNoHeader("C5", "Z22", "YourSheetName").[Select](Function(x) New With { _
	Key .No = x(0), _
	Key .[Class] = x(1), _
	Key .Teacher = x(3), _
	Key .Student = x(12) _
})

For Each row As var In rows
	Console.WriteLine("No:{0}, Class:{1}, Teacher:{2}, Student:{3}", row.No, row.[Class], row.Teacher, row.Student)
Next
Share this post: | | | |
Posted Friday, April 1, 2011 1:00 AM by dede | with no comments
Filed under: , ,

Q:
Bagaimana menulis Generic class di xml documentation?

A:
Untuk menulis Generic class dalam documentasi kita perlu menggantinya dengan '1 sebagai pengganti <T>.
Sebagai contoh seperti comment di bawah:

/// <summary>
/// Method bind IList<<see cref="T:System.String">String</see>> to 
/// <see cref="T:System.Windows.Forms.ComboBox">ComboBox</see> which has 
/// <see cref="T:MyApp.MillSheet">MillSheet</see> enum in Tag property.
/// </summary>
/// <param name="listOfSheet"><see cref="T:System.Collections.Generic.IList`1">IList<T></see> interface.</param>
Share this post: | | | |

Q:
Bagaimana me-re-order property entity pada edmx designer?

A:
Secara visual, edmx visual studio belum mensupport-nya.
Tapi kita bisa merubahnya langsung di file edmx-nya yang memang menggunakan xml.
Pada dasarnya edmx file ini merupakan semacam tempat buat EF4 menampung configurasi-nya.

Singkat-nya ini step melakukan re-ordering edmx designer

  1. EDMX Designer
    EDMX Designer
  2. Open With...
    'Open Wit...' untuk membuka edmx file xml
  3. AES
    Pilih 'Automatic Editor Selector (XML)' dan klik OK
  4. Closing notify
    AES akan meminta EDMX Designer-nya di tutup.
  5. EDMX in XML
    EDMX file dalam bentuk XML
  6. CSDL
    Di section CSDL, dan dalam Node EntityType. Itu lah property yang di baca oleh EDMX Designer.
  7. Change Order Property
    Kita coba memindahkan 'DeptNo' ke Atas. Save dan tutup AES.
  8. EDMX Designer
    Re-Order Property di EDMX Designer.
Share this post: | | | |

Q:
Bagaimana merubah appSetting dalam .config?

A:
Sejak .Net 2.0, System.Configuration, sudah memiliki utility.
Secara default, tidak ter-include dalam refence project.
Dan cara mudah sekali.


// C#
var oConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
oConfig.AppSettings.Settings["YourKeyName"].Value = "YourValue";
oConfig.Save(ConfigurationSaveMode.Modified);
// force to re-read config section
ConfigurationManager.RefreshSection("appSettings");


' VB.Net
Dim oConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
oConfig.AppSettings.Settings("YourKeyName").Value = "YourValue"
oConfig.Save(ConfigurationSaveMode.Modified)
' force to re-read config section
ConfigurationManager.RefreshSection("appSettings")
Share this post: | | | |
Posted Tuesday, March 1, 2011 1:00 AM by dede | with no comments
Filed under: , ,

Q:
Bagaimana mencari Max dalam 2D Array?

A:
Max yang seperti apa? Ada Max dari seluruh data? Max per-Row? Max per-Coloum?
Apapun Max yang di maksud, cara umum pastinya di Loop dan compare.
Kali ini kita coba buat dengan menggunakan LINQ.

note: code ini hanya di test di .Net 4.0


// C#
var matrixData = new[,] {
{2.22, 1.98, 3.96, 4.98, 2.29},
{0.62, 1.22, 3.22, 4.92, 3.77},
{2.83, 0.97, 3.98, 4.92, 5.88}
};

matrixData.Print();
matrixData.Cast().Max().Print();
matrixData.MaxPerColoums().Print();
matrixData.MaxPerRows().Print();


// Extension

static class Ext
{
public static void Print(this Double i)
{
Console.WriteLine("Print: Double");
Console.WriteLine(i);
}

public static void Print(this IList arr)
{
Console.WriteLine("Print: Double Array");

for (var i = 0; i < arr.Count(); i++)
{
Console.WriteLine(arr [ i ] );
}
}

public static void Print(this Double[,] arr)
{
Console.WriteLine("Print: Double 2D Array");

for (var i = 0; i < arr.GetLength(0); i++)
{
for (var j = 0; j < arr.GetLength(1); j++)
{
Console.Write("{0}{1}", arr[i, j], j + 1 < arr.GetLength(1) ? ", " : Environment.NewLine);
}
}
}

public static Double[] MaxPerColoums(this Double[,] arr)
{
return (Enumerable.Range(0, arr.GetLength(1)).Select(
col => new { col, rows = Enumerable.Range(0, arr.GetLength(0)) }).Select(
@t => @t.rows.Max(row => arr[row, @t.col]))).ToArray();
}

public static Double[] MaxPerRows(this Double[,] arr)
{
return (Enumerable.Range(0, arr.GetLength(0)).Select(
row => new { row, cols = Enumerable.Range(0, arr.GetLength(1)) }).Select(
@t => @t.cols.Max(col => arr[@t.row, col]))).ToArray();
}
}


' VB.Net
Dim matrixData = New Double(,) {
{2.22, 1.98, 3.96, 4.98, 2.29},
{0.62, 1.22, 3.22, 4.92, 3.77},
{2.83, 0.97, 3.98, 4.92, 5.88}
}

matrixData.Print()
matrixData.Cast(Of Double).Max().Print()
matrixData.MaxPerRows().Print()
matrixData.MaxPerColoums().Print()

'Extension
'Imports System.Runtime.CompilerServices

Module Ext

<extension()> _
Public Function MaxPerColoums(ByVal arr As [Double](,)) As [Double]()
Return (Enumerable.Range(0, arr.GetLength(1)).[Select](Function(col) New With { _
col, _
Key .rows = Enumerable.Range(0, arr.GetLength(0)) _
}).[Select](Function(t) t.rows.Max(Function(row) arr(row, t.col)))).ToArray()
End Function

<extension()> _
Public Function MaxPerRows(ByVal arr As [Double](,)) As [Double]()
Return (Enumerable.Range(0, arr.GetLength(0)).[Select](Function(row) New With { _
row, _
Key .cols = Enumerable.Range(0, arr.GetLength(1)) _
}).[Select](Function(t) t.cols.Max(Function(col) arr(t.row, col)))).ToArray()
End Function

<extension()> _
Public Sub Print(ByVal i As [Double])
Console.WriteLine("Print: Double")
Console.WriteLine(i)
End Sub

<extension()> _
Public Sub Print(ByVal arr As IList(Of [Double]))
Console.WriteLine("Print: Double Array")
For i As Int32 = 0 To arr.Count() - 1
Console.WriteLine(arr(i))
Next
End Sub

<extension()> _
Public Sub Print(ByVal arr As [Double](,))
Console.WriteLine("Print: Double 2D Array")
For i As Int32 = 0 To arr.GetLength(0) - 1
For j As Int32 = 0 To arr.GetLength(1) - 1
Console.Write("{0}{1}", arr(i, j), If(j + 1 < arr.GetLength(1), ", ", Environment.NewLine))
Next
Next
End Sub

End Module
Share this post: | | | |
Posted Sunday, February 27, 2011 1:00 AM by dede | with no comments
Filed under: , ,

Q:
Bagaimana men-disable Sleep button di Windows7?

A:
Kalau di notebook, Tray Icon > More Power Options > Panel Kiri > Set Sleep button-nya menjadi 'Do nothing'.
Untuk desktop, Control Panel > All Control Panel Items > Power Options > System Settings atau Advanced Setting (kadang ada motherboard ACPI-nya tidak ber-compatible) > Set seperti diatas.

Share this post: | | | |

Q:
Buat apa Object.GetHashCode ?

A:
Method ini dapat membantu kita meng-indentifikasi sebuah object dengan id(Int32) dari hash object tersebut.MSDN (system.object.gethashcode)
Akan sangat berguna bila kita meng-compare satu object dengan object yang lainnya. cara implementasi yang banyak di pakai adalah dengan meng-override method ini.
Jadi class/struct yang kita buat dapat memiliki unik id dari method ini. Array/Collection dari class/struct yang kita buat itu dapat di compare satu dengan lainnya dalam object, boleh di bilang ia jadi key dari object dalam collection.

Share this post: | | | |

Q:
Adakah alternatif Reflector?

A:
Reflector adalah tool yang berguna bila kita ingin melihat implementasi dari sebuah assembly .net .
Aplikasi yang di buat oleh Lutz Roeder, yang akhirnya di beli oleh Red Gate. Merupakan aplikasi yang free.
Namun pada akhir Febuary 2011, aplikasi ini sudah tidak free lagi. Lebih lengkap baca Red Gate open letter.

Bagi yang biasa developer yang banyak melakukan deep-debug tentu akan memerlukannya.
Adakah alternatif-nya?
Tentu saja, bila anda biasa menggunakan Mono Develop tentu sudah tahu ada feature ini di dalam IDE ini. fitur yang tadinya untuk "flow analysis tool" di tahun 2005 ( Cecil.FlowAnalysis), menjelma di decompile tool di tahun 2008 (Cecil.Decompile). thank to Cecil library; library ini di buat oleh Jean-Baptiste Evain.
Berangkat dari situ, ada juga yang ber-inisiatif untuk membuat seperti reflector. seperti Monoflector, WPF base aplikasi yang kedepan memiliki kemampuan ter-intergrasi dengan VS. hope so ;)

Reflector ternyata membuat versi-versi free-nya dengan sebuah 'time-bomb'. Yang membuat-nya tidak bisa di gunakan setelah Febuary 2011.
Kalau masih berkeras menggunakan reflector freenya, ternyata ada workaround untuk meng-defuse bomb-nya. :D
Bisa ikuti instruksi yang ada di Dumpz atau hasil-nya saja di Deflector.
Tentu kalau ingin menggunakan feature baru di next versi Reflector ( 7 keatas ), tidak salah-nya men-support pembuatnya dengan membeli-nya. Atau anda bisa ber-alih ke Cecil dan membantu menggembangkannya lebih lanjut.
Apapun pilihannya, adalah baik ada tool-tool diatas untuk membantu men-develop aplikasi dalam .net .

Tambahan 2011.02.10 :
Tampaknya juga sudah di mulai develop ILSpy dari sharpdevelop community (mungkin jadi bagian juga dalam IDE sharpdevelop).

Share this post: | | | |

Kadang ada pertanyaan mengenai performa sebuah aplikasi.
Ada beberapa tips code yang di rekomendasi untuk optimize dan itu ada effect-nya. Hanya perfoma secara keseluruhan kita tida bisa melihat bagian code saja.
Oleh karena itu kita memerlukan tool untuk meng-analysis aplikasi kita.
Di microsoft sudah memiliki tool seperti ini dan ini free dan source-nya tersedia bilamana hendak membuat profiler sendiri. Tool yang di maksud adalah CLRProfiler.

Bicara CLRProfiler ini, belum lama ini sudah di release versi 4 yang sudah mendukung .Net 4.
CLRProfiler V4, ini bisa men-profile aplikasi yang di buat pada .Net sebelum-nya (2, 3, 3.5). Tapi di perlukan .Net 4 untuk menjalankan CLRProfiler ini.
Juga tidak ketinggalan dapat juga di gunakan pada Silverlight 4.
Salah satu fitur yang menarik adalah "attach to and detach from" aplikasi berjalan untuk men-collect data yang di gunakan untuk membuat buah 'heap graphs'.
Tidak ketinggalan fitur "in-process side-by-side CLR instances", yang membuat kita dapat memilih CLR dalam pem-profiler pada process aplikasi.

Tool ini akan setidaknya dapat membantu kita memahami yang terjadi pada aplikasi kita pada level OS.
Jadi coba download dan pergunakan tool ini.

Share this post: | | | |

Perangkat GPS(aGPS) pada smartphone, biasa di gunakan untuk macam-macam aplikasi. Seperti Maps, Camera (geo-tag), search (location base search).

Tentu WP7 juga men-support ini. Developer dapat menggunakannya ini dalam namespace System.Device.Location. Class GeoCoordinateWatcher akan mem-invoke lokasi (latitude dan longitude) koordinat.
Tapi kalau tidak ada input dari gps, kita akan kesulitan men-develop-nya. Tapi untuk sudah di sediakan sebuah GPS emulator, yang terdiri dari WPF app dan WP7 dll yang akan men-trigger API WP7 emulator seakan kita sedang dalam perjalanan.
Kalau sudah selesai, tinggal merubah gps device-nya ke real GPS-nya.

Bisa di download di MSDN Microsoft di GpsEmulator.zip.

Share this post: | | | |
Posted Sunday, January 30, 2011 1:10 AM by dede | with no comments
Filed under: ,

Q:
Pertanyaannya gimana caranya saya route dengan parameter bertipe tanggal, misal : http://localhost:1830/HariLibur/Edit/01/01/2010

A:
kalau menggunakan DateTime pada controller, maka ia akan seperti ini url-nya http://localhost:1830/HariLibur/Edit/01-01-2010 dengan bantuan tambahan routing, seperti ini ( di global.asax.cs)

// C#

// Controller
public ActionResult Edit(DateTime tgl)

// Route
routes.MapRoute("HariLibur_Edit", "{controller}/{action}/{tgl}", new { controller = "HariLibur", action = "Edit" });

kalau anda mau merubah signature dari contoller anda menjadi seperti di bawah dan membuat route baru sesuai signature-nya.
Kita bisa mendapat hasil seperti ini: http://localhost:1830/HariLibur/Edit/01/01/2010

// C#

// Controller
public ActionResult Edit(Int32 day, Int32 month, Int32 year)

// Route
routes.MapRoute("HariLibur_Edit", "{controller}/{action}/{day}/{month}/{year}", new { controller = "HariLibur", action = "Edit" });
Share this post: | | | |
More Posts Next page »