RonaldWidha

percaya sama occam razor
See also: Other Geeks@INDC
Kategori dan Tagging

time-warp

Kembali menanggapi tulisan Navinot yang terbaru: Shocking, Nobody Uses Category Anymore! yang membahas tentang bagaimana blog-blog besar seperti RWW dan GigaOm tidak lagi menggunakan kategori.

Old Media dan kategori

Media lama seperti koran dan majalah masih menggunakan kategori. Rubrik teknologi, surat pembaca, berital lokal, bisnis, infotainment dsb. Kenapa? Karena sebuah koran dituntut untuk menceritakan sebuah cerita apa adanya tanpa pengaruh opini atau analisa dari berbagai disiplin yang berbeda. Nanti malah dituduh distorsi dan propaganda.

Bentuk media juga menuntut sistem klasifikasi yang lebih sederhana. Kategori, folder, document set adalah sistem pengklasifikasian yang sarat keterbatasan dunia fisikal. Gimana caranya bikin klasifikasi many-to-many di koran kalo tidak ada hyperlink atau search engine?

Persimpangan dan tagging

Blog banyak mengandung opini dan lebih tepat untuk diklasifikasi sebagai materi editorial. Sebuah editorial yang menarik biasanya berada di persimipangan beberapa disiplin; mengandung pencermatan beberapa perspektif yang berbeda. Alhasil tagging terasa lebih relevan untuk mendukung tipe materi yang seperti ini.

Tagging tidak memaksa memasukkan sebuah blog post ke dalam 1 golongan, tapi justru sebaliknya menjelaskan secara singkat apa yang dikandung oleh sebuah post untuk memudahkan pencarian.

Single Responsibility Principle dan Web vNext

Kalo di dalam programming ada istilah yang namanya Single Responsibility Principle (SRP). Salah satu contoh pengaplikasiannya begini: sebuah method lebih baik tidak mengandung kata ‘And’, karena berarti memiliki lebih dari satu tujuan.

Di ekonomi baru, sebuah perusahaan cenderung konsentrasi kepada sebuah niche. Jangan rakus mau melahap semua, malah kalap kalah di setiap pertarungan. Blog yang baik *mungkin* juga lebih baik tidak mengandung kategori, karena menjadi smell pelanggaran SRP. Konsen satu aja, jangan rakus dan bikin bingung pembacanya.

Share this post: | | | |
5 hal yang dicari Enterprise
startrek

 

Setelah membaca Startup Goes to Enterprise Market, How. aku terpikirkan tentang apa yang sebenarnya dicari oleh pasar korporat.

Satu kata yang langsung tercetus di kepala aku adalah Governance. Definisi governance di sini adalah payung yang mencakup segala sesuatu yang cenderung non fungsional dan harus dipertanggung jawabkan, terutama di kala audit.

Berikut dimensi yang biasanya diperhatikan dalam sebuah proses governance.

Sekuriti

Data adalah segalanya di dunia korporat. Seberapa banyak investasi untuk mengumpulkan informasi, mempekerjakan information worker, dan menganalisa data. dan kalau dicuri, bisa menjadi petaka yang mungkin bisa menhancurkan (atau paling tidak merugikan) perusahaannya. Pertanyaan yang harus dijawab dari segi sekuriti adalah bagaimana komunikasi protokolnya, bagaimana data disimpan di disk, apa enkripsinya.

Retensi

Segi keamanan data yang lain adalah menjaganya dari kehilangan. pertanyaan yang harus dipikirkan seberapa lama data ini harus dijaga. di kala bencana seberapa besar kehilangan yang akan terjadi? seberapa lama of downtime yang bisnis sanggup untuk berjalan secara normal? setelah data melewati masa hidupnya bagaimana proses destruksinya? apakah destruksi mencakup log? apakah bisa direkonstruksi?

Availability

Korporat tentunya menjaga kelangsungan bisnis sebagai prioritas. Kita harus bisa menjawab persentasi up time dengan 99% ditambah berapa 9 dibelakang koma.

Compliance

ini yang sering menjadi pertanyaan besar. compliance dengan internal IT policy, industry standard, hukum lokal, hukum negara lain, dsb.

Sebagai contoh, ketika kita bermain di segmen korporat yang cenderung worldwide, kita harus ingat bahwa ada privacy law sepertu EU privacy law atau Safe Harbour agreement yang harus dipatuhkan melalui arsitektur yang tepat. Simpan data profil customer eropa di data center di Eropa. Data untuk analisis boleh diagregasi ke datacenter pusat, tapi tinggalkan semua informasi identifikasi.

Contoh lain, Jangan lupa compliance ini bukan cuma mengacu kepada arsitektur tapi jg proses internal. Apakah setiap karyawan punya akses yang terbatas pada rolenya, apa yang karyawan kamu bisa lihat pada setiap waktu? apakah bisa dikonstruksi? apakah mereka bebas rekor kriminal? akhirnya compliance ini mendikte bagaimana proses kita merekrut orang dan menjalani segala aspek dari bisnis kita.

Continuity

salah satu hal yang dicari dari korporat adalah kontinuitas. Kita harus siap menunjukkan bahwa despite the small size and limited portfolio that we have, kita perusahaan yang stabil dan akan ‘ada’ untuk waktu yang panjang. Ini biasanya yang menjadi tembok yang bikin startup kalah saing sama perusahaan besar. Apakah kamu debt free? gimana growth kamu setiap tahunnya? berapa besar income per tahunnya? apakah kamu sustainable dan akan tetap ada untuk terus memberikan layanan untuk korporat tsb.

Apa yang menurut kamu harus ditambahkan di list ini?

Share this post: | | | |
Main-main dengan Windows Phone 7 SDK CTP April Refresh

imageSebelum kita nyiapin makan malam hari ini, aku sempet main-main dengan Windows Phone 7 SDK CTP April Refresh… Sesuai sama yang aku denger. Emulatornya berjalan di level hardware. Jadinya jalanin Windows Phone 7 (WP7) OS-nya secara penuh. Bahkan ada internet explorer.

The project template

Versi ini ada 3 Windows Mobile Silverlight project templates: WP App, WP List App and WP Class Library.

Aku iseng pake yang WP List App, di mana ada master detail screen dengan navigation hierarchy dan transition animation. 

image

Project template-nya keren banget. Ada folder buat ViewModels classes. Kayaknya MS mau nge-push Model-View-ViewModel (MVVM) lewat WP. View Modelnya di implementasi pake INotifyChangeProperty.

image

Silverlight Goodness

Aku pikir aku iseng2 ngeport samplenya silverlight Farseer physics engine supaya bisa jalan di WP7.

I seem to be able to get one of the Farseer Silverlight simple demo in less than an hour. I didn’t have to do anything much other than: correcting the casing of the keyboard enums (System.Windows.Input.Key.ENTER to System.Windows.Input.Key.Enter), changing System.Windows.Controls.UserControl to PhoneApplicationPage  and voila …

image

The mouse pick spring responded beautifully on the emulator (and it seem to react to multi touch too, at one point I saw multiple mouse pick springs ..or was it a glitch?).

Berikutnya kayaknya aku harus coba PhysicsHelper, seems like these guys have simplified a way to work with Farseer. It allows the translation from Silverlight objects directly into Farseer physics objects!

Share this post: | | | |
Das Hanselman wants a piece of this!

At Tech Ed Middle East I’ll be co-hosting an interactive session with few panelists, including Scott Hanselman. Very exciting!

teched-interactive

The topic is discussing something that is close to my heart; the role of an Architect, especially an Agile Architect. What’s the difference between a senior developer and an architect?

I’d love to hear your thoughts! Give Hanselman a piece of your mind on the day! ;)

interactive-session

Share this post: | | | |
I’ll be speaking about Domain Driven Approach with EF4 at TechEd 2010

TENA_blgr3_seeme

I’ve just noticed that the session details is already up on the TechEd Middle east website.

teched-ef 

I have to tell you that this is really exciting to be a part of the first Tech Ed in the middle east region. When you have a brand like Jumeirah, the umbrella company of the 7 star hotel, sponsoring the event, you know that you’re talking major business!

My talk (DEV303 – I’ll see you there!) will be talking about introducing Entity Framework 4 and Domain Driven approach. I’m expecting that most of the audience will be familiar with data access patterns, and new to Domain Driven Design.

We’ll look at the evolution of design from Rapid Application Development, Transaction Scripts to Domain Modelling with OR/M. Anton Delsink will introduce the concept using Linq to SQL, and will take it to the finish line using the upcoming Entity Framework 4.

image

Share this post: | | | |
Apa sih yang dianggap stateless?

Mo menanggapi diskusi apa yang dianggap stateless / stateful di milis dotnet yang berkaitan sama gimana ngebikin aplikasi di web bisa lebih nge-scale

Jadi kalo kita misah2in bahwa session-specific data mesti dilewatin ke HttpSession (ke memcache ato sql-server), sedangkan application-data mesti dilewatin ke repository dan ORM, ini adalah diskriminasi yg artificial.

Karna kedua2nya sebenernya sama2 data.

Keputusan kemana datanya mesti disimpen adalah case-per-case decision (e.g. temporary/persistent, size, write/read frequency, importance, recoverable) yang gak terikat dengan apakah itu session-data ato application-data.

Menurut aku, definisi state harus dikonstrain dari sudut pandang "hubungan client dan servernya" (konsep bukan hardware loh ya), siapa yang menyimpan konteks sebuah situasi.

  • Kalo servernya bisa mengenali konteks si client tanpa informasi dari client = servernya stateful
  • Sedangkan kalo sebaliknya, si server tidak bisa mengenali konteks si client, dan client harus ngasih tau ke server konteks dirinya = servernya stateless.

Coba liat contoh pseudo code di client untuk ngebayar sebuah transaksi:

di contoh ini, client-nya stateful, karena tau siapa user-nya.

var saya = Current.User

using ( var pelayan = new serverconnection) 

{

  var pesanan = pelayan.pesan(saya, "makanan")

  var bill = pelayan.mintaBill(saya)

  pelayan.bayar(bill)

}

sementara di server (class pelayan) itu stateless. Karena kita selalu harus ngasih tau konteks transaksi kita.

  • pas mesan, saya harus pas identitas current user...pesanan ini untuk siapa
  • pas minta bill, saya juga harus pas identitas current user...bill yang mana yang harus diambil
  • lalu pas bayar jg, saya harus ngasi tau bill mana yang mo di bayar.

contoh yang sama kalo servernya (class pelayan-nya) stateful

using ( var pelayan = new serverconnection) 
{
  pelayan.pesan("makanan")

  pelayan.mintaBill()

  pelayan.bayar()
}

di sini kita bisa liat bahwa untuk memesan makanan, si client tidak perlu mengidentifikasi dirinya.

  • Si pelayan mengingat identitas requestnya mungkin dari IP address, atau Identity Context call-nya.
  • begitu jg pas minta bill, kita bisa ngeliat bahwa si pelayan "ingat" pesanan sebelumnya
  • pas bayar, kita bisa tau bill mana yang terakhir di "aktif"kan.

informasi tentang user, pesanan dan bill tentunya disimpan di dalam "pelayan", tapi ini bukan faktor penentu apakah sebuah komponen itu statefull atau stateless, melainkan hubungan antara siapa yang mengerti konteks runtime di saat apapun.

UserRepository.FindCurrentActiveUser()

UserRepository.FindById(int id)

2-2nya repository, tapi kira2 yang mana yang stateful dan mana yang stateless?

Share this post: | | | |
Posted: Feb 02 2010, 11:11 AM by ronaldwidha | with 1 comment(s)
Filed under: ,
3 alasan kenapa requirement koq sering berubah

Aku baru saja ngebahas konsep dasar Agile di episode Teman macet ke-30. Dan aku mendapatkan tanggapan yang menarik dari Rizal Purnama di mailing list id-Php

Rizal mengatakan:

benar para user memang lebih suka yang dinamis, tapi buat developer pasti
merasakan..[kok ini req. ganti-ganti mulu …]

Rizal nge-raise point yang menarik tentang requirement yang berubah2. Menurut aku ini semakin mengkuatkan point kenapa agile dibutuhkan. Alasan kenapa requirement sering berubah (dan cara mengatasinya) adalah:

1. dapet requirement dari orang yang salah


mungkin orang yang ngasih requirement bukan orang yang tepat untuk ngasih requirement.

2. stakeholder-nya ga tau maunya apa


cuma dengan proses yang iteratif, stakeholdernya bisa belajar dari iterasi sebelumnya, dan akhirnya mendekatkan kepada apa yang sebenenrya dia mau/butuhkan.
tentunya perubahan ini butuh disiplin tinggi dari bisnis maupun engineering supaya bisa berguna.

Bisnis harus menyadari bahwa perubahan punya dampak terhadap kerjaan lain ( cuma ada 24 jam sehari kan?), dan engineering pun harus menyadari bhw kode harus dibuat sebaik mungkin, dan tes harus diautomasi sekuat mungkin biar tidak menimbulkan bug-bug baru melalui perubahan.

3. salah pengertian antara programmer dengan stakeholder


orang mungkin berpendapat dengan dokumen lengkap, salah pengertian akan dihindari. Aku malah berpendapat sebaliknya. Salah pengertian bisa dihindari melalui percakapan. Dokumen biasanya malah menghindari adanya percakapan. Dokumen adalah sebuah artifak, yang kadang malah misleading. User story yang singkat bisa menjadi bibit percakapan yang lebih berharga daripada dokumen selengkap apapun.

Gimana pendapat kamu?

Share this post: | | | |
Posted: Jan 26 2010, 10:27 AM by ronaldwidha | with 5 comment(s)
Filed under:
Tips untuk website publik: melihat Geeks Library

Baru aja ngebuka website Ronald dan Narenda yang baru: Geeks Library. Dan wow…kontennya lengkap (inventori dari netindonesia.net/geeks), designnya sangat modern (web 2.0-ish), pake istilah Indonesia dan juga dibuat dengan asp.net MVC!

image

Ada beberapa hal yang terpikirkan ketika aku browsing website ini

Urlnya koq susah?

imageNama domain yang rumit memiliki beberapa malasah. Selain sulit untuk diingat, nama domain yang rumit juga sering susah untuk dieja baik dalam percakapan verbal maupun dalam podcast. Pilih domain name yang sederhana, dan berusaha hindari url yang kepanjangan. Lebih penting lagi usahakan korelasi langsung antara judul website dengan url-nya.

Kalo tidak ada pilihan lain, karena legacy support atau benefit Search Engine Optimization, coba deh investasi ke domain lain sekedar untuk vanity url dan redirect ke website aslinya.

Ajak penggunanya untuk berpartisipasi

image

Website seperti blogger atau bahkan geocities membuka jalan demokratisasi informasi yang juga dikenal dengan era Web 2.0. Melalui website seperti friendster dan facebook kita juga bisa melihat bahwa partisipasi pengguna menjalin hubungan kepercayaan dan kesetiaan yang lebih kuat. Para early adopter ini lah yang bakal menjadi sneezer membangun kelompok pengguna yang lebih besar.

Oleh karena itu, kita tidak boleh menganggap remeh pentingnya untuk sebuah website menggelitik dan merangkul partisipasi penggunanya. Fitur komen, rating, share to twitter, pingback/trackback bisa menjadi 3 fitur sederhana yang mudah untuk diimplementasi.

Salah satu hal yang aku sayangkan untuk blog Geeks .Net Indonesia adalah commenting systemnya yang sangat buruk. Mengganti comment system dengan Disqus bakal go a long way. Fitur new comment notification buat empunya blogger dan juga commentor bakal nge-boost interaksi antar membernya.

Optimisasi untuk search engine

imageWebsite seperti Geeks Library yang memuat konten beragam jenis adalah website yang tepat untuk menarik pendatang baru dari search engine. Penggunaan Url, HTML tags untuk struktur dan judul harus dioptimisasikan untuk melakukan itu.

Ini adalah salah satu pitfall yang sering dihadapi oleh developer Asp.Net ketika beralih ke Asp.Net MVC. Di tipikal development Asp.Net, banyak tim tidak memperhatikan url. Url dianggap sebagai resource locator untuk sang programmer. Di Asp.Net MVC, Url menjadi first class citizen. Kita harus menggunakan fleksibilitas ini untuk mengoptimisasi search engine.

Kesimpulan

Ada jg beberapa hal-hal kecil lain yang ingin aku cermati; seperti logo utama kalo di klik tidak membawa pengguna ke halaman utama, mending pake subdomain daripada virtual folder (i.e library.netindonesia.net terlihat lebih cantik), tapi itu semua mungkin masalah yang menyangkut selera individu dan mungkin terlalu sepele untuk dikritik apalagi ini baru release pertama.

Aku punya banyak harapan untuk Geeks Library. Ebook sudah menjadi resource penting untuk para programmer Indonesia untuk belajar dengan membaca atau menulis ebook-ebook baru. Geeks Library tepat mengisi kekosongan di market ini apalagi dengan dukungan parent websitenya yang komunitasnya sudah besar.

Apakah kamu sudah visit Geeks Library?

Share this post: | | | |
Beda Sky Drive, Microsoft Office Live, Live Sync dan Live Mesh

Salah satu fitur yang dimiliki oleh Word di Office 2010 yang sepertinya memungkinkan kolaborasi adalah Save to SkyDrive. SkyDrive adalah pelayanan Windows Live yang memungkinkan penggunanya untuk menyimpan file di awan. Ini adalah strategi murah untuk Microsoft bersaing dengan fitur kolaborasi Google Docs.

SkyDrive bukanlah satu-satunya penawaran penyimpanan cloud based dari Microsoft. Microsoft Office Live, Live Sync dan Live Mesh memecahkan masalah yang serupa. Empat pelayanan tersebut memungkinkan penggunanya untuk mengakses file yang sudah disimpan di mana saja walaupun dengan teknik yang sedikit berbeda.

Apa sih bedanya ke-4 cloud based storage ini? Aku nge-post sepenuhnya di Navinot:
Kultur Microsoft terefleksi lewat produk yang dihasilkan.

image

Share this post: | | | |
Cara Memakai Visual Studio Database Edition GDR dalam situasi beneran

Di post sebelumnya: Visual Studio Database Edition GDR untuk bekerja dengan database dalam development team, aku menjelaskan konsep database development menggunakan Visual Stuio Database Edition GDR.

Di post ini aku ingin menjelaskan bagaimana cara memakai Visual Studio Database Edition GDR ini dalam kerjaan sehari-hari, bukan sekedar demo doank.

Setup – biasanya dilakukan oleh si Team Lead (atau senior dev)

Kembali seperti di post aku sebelumnya (kesempatan terakhir untuk ngeklik dan ngebaca artikelnya sebelum makin ga nyambung), aku menuntut untuk setiap developer bisa memiliki instalasi databasenya masing2 (isolated database environment).

Dalam cara kerja ini, kita harus memulai database project di Visual Studio Database Edition GDR seperti berikut:

  1. Create database baru untuk aplikasi di development box kamu (di mana visual studio berjalan). Atau kalo ini bukan green field project, make sure kamu punya database instancenya di development box lanjut langsung ke step 2. Kita akan nge-refer database instance ini sebagai development database mulai dari sekarang.
  2. Buka Visual Studio Database Edition GDR, klik new Project. Pilih Database Projects > SQL Server 200x (sesuai dengan database engine kamu) dan pilih SQL Server 200x Wizard.

    Wizard ini bakal nanyain kamu beberapa pertanyaan penting untuk memulai seperti: import existing schema dengan opsi-opsi tertentu, collation settings, deployment settings dsb.

    Kalo kamu nge-generate development database dari kode (dengan code smith atau subsonic misalnya), atau kalo kamu sudah punya aplikasi yang menggunakan database tersebut, rekomendasi aku adalah untuk add database project ini ke dalam solution aplikasi kamu. Tujuannya adalah nge-ikat versioning antara kode dengan databasenya.
  3. Di langkah kedua kamu akan ditanyakan “what type of project would you like to create?”. Karena aku ingin isolated database environment mari kita pilih “a database project to manage changes to a user-defined database
  4. Di langkah keempat, pilih import existing schema dan pilih database aplikasi kamu yang berjalan di dev box.
  5. Di langkah terakhir wizard, kamu set up target connection kamu ke database instance yang sama. Tick “always re-create database’”. Dengan pilihan itu kita bakal memastikan development database selalu sinkron dengan database project kita.

    Langkah yang terpenting di sini adalah untuk me-rename nama server kamu dari server instance name ke (local). Misalnya: karena aku pake SQL Express maka server instance aku (local)\SQLExpress. Ini dikarenakan connection string target database disimpan di project file (.dbproj) yang berarti memaksa seluruh team untuk memiliki connection strings yang sama. Dengan menggunakan (local) maka seluruh team bisa memakai 1 connection strings saja.
  6. Sekarang kita sudah punya database project di solution kita.
  7. Buka Solution Explorer > Schema Comparisons > Add new Schema Comparison.
    Namakan: FromDevToModel.scmp
    Set Source Schema ke Development Database (jangan lupa set nama server dengan nama local supaya bisa digunakan oleh semua team member yang lain).
    Set Target Schema ke Database Project

    Liat options comparenya, dan pilih object types yang kamu berharap para dev bakal nge-update seperti tables, functions, stored procs dsb. Ibaratnya ini ignore list di Subversion atau TFS.

    Ini akan dipakai untuk nge-sync perubahan yang developers lakukan ketika development dari Development database ke dalam Database Project.
  8. Bikin 1 Schema comparison lagi, Solution Explorer > Schema Comparisons > Add new Schema Comparison
    Namakan: FromModelToDev.scmp
    Set Source Schema ke Database Project
  9. Set Target Schema ke Development Database.

    Ini akan dipakai untuk nge-sync perubahan yang dilakukan oleh developer lain dari source control ke dalam Development Database.

  10. add Development database kita ke Server explorer. Ini akan memudahkan kita untuk menciptakan table tanpa menulis 1 line T-SQL pun.

Nah, setelah melewati langkah-langkah tadi kita sekarang sudah memiliki solution yang berisi kode aplikasi kita, begitu jg database project yang mengontrol development database. Kita cukup melakukan ini sekali dalam 1 project.

Untuk para programmer yang lain

Tugas berat sudah diemban oleh si Team Lead (atau Senior Dev). Langkah terpenting untuk para team members sekarang adalah untuk memiliki sql server instance dengan nama yang sama supaya seluruh team bisa memakai project file yang sama.

Sekarang mari kita ngebahas gimana siklik developmentnya

Development

Step 1: Database Development pake Server explorer

Aku bukan a hardcore DBA. Jadi urusan alter-mengalter database aku biasanya mengandalkan tool seperti Visual Studio Server Exploerer atau SQL Management Studio Express untuk membantu aku. Dengan Visual Studio Database Edition GDR kita bisa tetap melakukan hal yang sama.

Bikin table, relationship, primary key, foreign key, stored procedure baru atau bahkan lakukan refactoring untuk menyelesaikan tugas kamu.

Step 2: Masukkan perubahan yang baru kamu bikin ke dalam Database Project kita

Setelah kita sudah menyelesaikan perubahan database kita, gunakan Compare Schema untuk memasukkan schema yang baru ke dalam database project.

Gunakan FromDevToModel schema comparison. Dan kita bisa akan melihat update yang baru saja kita lakukan seperti di bawah ini.

image

image

Sepertinya aku baru aja nambahin Schema, dan Table baru.

Klik Writes Updates dan lanjut step 3.

Step 3: persiapan Check in

Seperti team member yang baik, kita ga mau menggangu kerjaan team member yang lain dengan nge-break Continuous Integration build. Jadi setelah membuat perubahan kamu, get latest source code termasuk database project dari version control. Merge conflict yang kamu temuin, lalu lakukan Compare Schema database project yang baru dengan Development Database kamu FromModelToDev.scmp.

Kalo kamu nemuin perbedaan, klik Write Updates untuk nge-update Development Database kamu sesuai dengan Database Project.

Ini jg kesempatan untuk ngejalanin unit test dan Database unit test kita untuk memastikan ga ada unit test yang rusak.

Step 4: check in

Akhirnya kita bisa check in, dan berharap ga ada yang teriak2 “Woyy database-nya rusakk nihhhh gara-gara check in elooo!!”.

Di post berikut mungkin aku akan membahas soal deployment ke production, database unit test, ngegenerate test data dan juga gimana cara nambahin default lookup value ke table baru kita.

Semoga berguna.

Share this post: | | | |
Visual Studio Database Edition GDR untuk bekerja dengan database dalam development team

Aku merasa Visual Studio Database Edition GDR adalah salah satu tool yang paling berharga untuk bekerja dengan database. Sayangnya tidak banyak team yang memakai tool ini, padahal bisa bener-bener membantu dalam menghadapi software development yang menggunakan database.

Bekerja dengan database dalam team itu gampang-gampang susah. Setiap kali aku masuk team, pasti ada aja cara unik gimana mereka ngatur development database. Ada yang jalur resmi lewat DB Admin, ada yang 1 team nge-share 1 development database dan ada jg yang setiap developernya punya database yang terisolasi di komputer masing2.

Aku paling suka cara yang terakhir aku sebut: setiap developer punya database masing2. Dengan ngelakuin ini kita bisa nyoba-nyoba refactor database tanpa takut ngeganggu kerjaan orang lain. Begitu kita yakin apa yang kita mau ubah, kita bisa generate update scriptnya berupa migration script. Ini cara yang serupa seperti di Rails dengan konsep migration-nya. Program seperti DBDeploy.Net atau Subsonic Migrate Me sangat membantu untuk mengatur migration stepnya, tapi tetap masih mudah mengakibatkan error dan membutuhkan disiplin yang tinggi.image

fig. 1 biasanya kita konsen ke migration steps dari 1 versi database ke yang lainnya

Jeff Atwood Coding Horror menulis approach yang serupa di Get Your Database Under Version Control

Di Sql Management Studio maupun DBDeploy.Net, setiap operasi yang kita lakukan ibaratnya seorang seniman tanah liat yang mengubah permukaan sebuah patung. Bedanya kalo pematung memakai tangan, sementara di dunia database kita memakai T-SQL.

Visual Studio Database Edition GDR dengan fitur2 database-nya berusaha memecahkan masalah yang sama dengan pendekatan yang jauh lebih elegan.

Model based development

Di Visual Studio Database Edition GDR, cara kerja kita sangat berubah walaupun terlihat serupa. Kita selalu bekerja berdasarkan model database itu sendiri.

image
fig.2 di Visual Studio Database Edition GDR kita konsen langsung ke model yang kita tuju

Bekerja dengan model memiliki dua keuntungan yang sangat besar:

Ga perlu mikirin Migration Step

Kita tidak perlu memikirkan bagaimana cara mengubah tabel dengan alter scripts. Kita langsung ngedefinisikan secara deklaratif apa yang mau kita tuju.

Mungkin kamu akan bertanya bagaimana cara mendeklarasi database kalo engga bikin migration step? Apakah kita perlu belajar bahasa baru? Ataukah melalui GUI seperti Access? Untungnya jawabannya tidak untuk keduanya. Microsoft memakai Domain Specific Language yang cocok untuk database dan kita semua sudah kenal yaitu…..drum roll…T-SQL!

Loh? barussan aku bilang ga usah mikirin migration step, tapi koq sekarang pake T-SQL lagi buat ngedeklarasi state sebuah table? Bedanya di sini adalah kita ga pernah bikin alter script lagi, melainkan selalu menggunakan statement Create. Sekelompok statement create kan cuma Data Definition language kan?

image

Lebih kerennya lagi, karena Create statements ini berupa text, kita bisa dengan mudah disimpan di source control untuk kolaborasi. Tampaknya Microsoft sudah belajar dari EF (Vote of no confidence salah satunya mengkritik bagaimana XML model edmx tidak gampang di merge dalam situasi bekerja dengan source control).

Design time validation

Karena semua yang kita bangun adalah model (again, don’t let the T-SQL appearance fool you), Visual Studio mampu melakukan manipulasi pintar untuk nge-validasi error kita saat design time.

Pencet ctrl + shift + b (Build) dan kita akan bisa melihat error dan warning list kita tanpa mengaplikasikan definisi database tersebut ke database instance kita

image fig. 3 Kita bisa melihat bhw Visual Studio mendeteksi 2 column dengan nama yang sama dan warning bhw sebuah stored procedure mereferensi column yang tidak eksis

Reference

Download Visual Studio Team System 2008 Database Edition GDR R2
Home of the Data Dude

Share this post: | | | |
Pattern apa yang sering dipake?

Kata 'design pattern' banyak dipakai di berbagai macam konteks. Gang of four konsen ke implementasi. Martin Fowler di PoEA konsen ke 'arsitektur'. Aku ga doyan kata arsitektur. Mungkin lebih tepatnya 'higher level stuff' aja (contohnya: Transaction Script - prosedural, MVC, Supervising COntroller, Presenter First, Model-View-ViewModel, Active Record, Table Gateway dsb).

Di level arsitektur untuk aplikasi web

kita cenderung memakai Model-View-Controller atau Supervising Controller (dikenal jg dengan nama Model View Presenter).

Di level data access layer (bagaimana kita menginstansiasi Model)

kita bisa memakai Active Record kalo untuk aplikasi kecil. Atau menggunakan Repository untuk yang lebih ribet.

Guide yang bagus untuk ngestruktur Model adalah buku dari Eric Evans, Domain Driven Design.

Intinya adalah ngebagi model jadi Entity dan Value Object. Pengaksesan Entity dilakukan melalui Repository. Semua objek2 ini diciptakan melalui komunikasi dengan business di konteks yang spesifik (Bounded Context) 

Di level implementasi

Aku ngerasa kita harus hati2 untuk terjebak dalam design pattern di level implementasi. Kent Beck memakai term 'Code Smell'. Ini adalah saat yang tepat untuk mencari pattern yang tepat untuk ngebersihin kode kamu.

 

Daripada mikirin pattern apa yang sering dipakai…

gimana kalo konsen ke prinsip OO seperti dari Robert Martin, SOLID

S = single responsibility principle

setiap kelas jelas responsibilitynya dan sesuai dengan namanya. alhasil class jadi pendek2, ga banyak properties, dan ga banyak method. jadi: fokus!

O = open closed principle

kode itu ideal nya open for extension tapi closed for modification. buat nambah fitur ga perlu ngubah kode yang ada, tapi tinggal diinjek dengan kode baru.

L = Liskov subtitution principle

ini menentukan gimana cara bikin hierarki parent / subclass berdasarkan return type dan parameter method2 yand di override. return type harus contravariant, dan parameter harus covariant. jujur, aku masi agak struggling mengaplikasikan prinsip ini.

I = Interface segregation principle

satu objek lebih baik punya banyak interface yang spesifik daripada 1 interface yang sangat besar dan generik. misalnya daripada IProfileProvider, mendingan IMemberDetailsProvider, IAuthorizationProfile, IAuthenticationProvider dsb.

D = dependcy injection principle

dependency sebuah kelas harus secara explisit distate dan implementasinya diberikan oleh penggunanya. intinya gini. Kalo sebuah Repository butuh Database class, Repository ga boleh nge-instansiasi Database objeknya sendiri. Biasanya teknik ini digabungin sama Inversion of Control Container atau Service Locator.

Semoga berguna.

Share this post: | | | |
ngintip dikit SQL Azure CTP

Pertama-tama aku pikir Windows Azure cuma buat high performance computing, storage-nya cuma terdiri dari blob, queue dan table. Aku ga sadar bahwa Microsoft juga punya SQL Azure.

I registered for SQL Azure CTP a little late (in early September 2009) and totally forgot about it until Hammad Rajjoub (MVP Connected Systems) Twittered about it.

Jadi kali ini aku main-main sedikit sama SQL Azure

[baca selanjutnya in English di-copy dari ronaldwidha.net]

Upon putting my invitation code and creating myself an administrator account, I get the following simple screen. There are only a few action here, generate a connection string, create and drop a database.

image

There is also a Firewall Settings tab to restrict access by IP address. By default, no access is given to anyone.

Note It takes a few minutes for the settings to take into effect, so don’t be surprised.

There’s also ‘Allow Microsoft Services access to this server’ tick box, which I assume need to be selected should you use this SQL Service with Windows Azure.

image 

What’s annoying is apparently you can’t use any of the SQL Server Management Studio Express 2005 versions nor the Visual Studio 2008 Server Explorer. Both displayed error dialog even though being able to connect to Azure SQL successfully.

image
Visual Studio 2008 showing an error dialog despite tested the connection successfully.

However, apparently it works on SQL Server Management Studio 2008, with a small workaround. Get the free version here: Mangement Studio Express 2008.

Also, you could use these tools (kudos to Bill Zack – Architect Evangelist team at Microsoft):

SQL Azure Migration Wizard. This wizard helps you to migrate an on-premise SQL Server 2005 or 2008 database to SQL Azure. It creates the necessary scripts required to do the migration.

SQL Azure Explorer This tool is an add-in for Visual Studio 2010 Beta 1 (only) that lets you create/drop databases, logins and users and perform other database related functions from within Visual Studio 2010 Beta 1.

SQL Azure Manager is a lightweight tool for managing SQL Azure databases. It is a community effort to quickly enable connecting to SQL Azure databases and performing basic tasks.

Share this post: | | | |
Nge-automate user testing pake WatiN di multiple browser: contoh fluent interfacing

Saya sudah memakai WatiN beberapa kali dan pernah ngeshare tips buat ngejalanin WatiN di firefox dengan Firefox plugin (which constantly crash even with the newer jssh-WINNT-3.x.xpi).

Kali ini aku pengen ngebagi code snippet buat make WatiN di semua browser tanpa perlu make browserFactory atau apalagi copy paste. Bagi yang ga tau WatiN apaan, mungkin bisa ngeliat contoh di bawah ini sebagai contoh Fluent Interfacing alias method yang dibikin supaya kalo nyambung-nyambung mudah dibaca

Ini targetnya:

[TestFixtureSetUp]
public void Context()
{
  CrossBrowserTestExecutor.Execute( Scenario )
    .WithAllBrowsers
    .Go();
}

public void Scenario(Browser browser)
{
  browser.GoTo( "http://www.google.com" );
  browser.Close()
}

Mayan bersih kan? Notice kalimatnya jadi mudah dibaca dibanding kalo ditaroh di baris yang berbeda.

So this is the code that enables you to do that:

public class CrossBrowserTestExecutor
{
  public static CrossBrowserTest Execute( Action<Browser> test )
  {
    return new CrossBrowserTest( test );
  }
}

public class CrossBrowserTest
{
  public CrossBrowserTest( Action<Browser> test )
  {
    TheTest = test;
    BrowserAgents = new List<Browser>();
  }

  public Action<Browser> TheTest { get; set; }

  public IList<Browser> BrowserAgents { get; set; }

  public CrossBrowserTest WithAllBrowsers
  {
    get
    {
      BrowserAgents.Add( new IE() );
      BrowserAgents.Add( new FireFox() );
      return this;
    }
  }

  public void Go()
  {
    foreach ( Browser agent in BrowserAgents )
    {
      TheTest( agent );
    }
  }
}

Feel free to use it in any of your project, but please drop a comment if you find it useful. Thanks

Share this post: | | | |
10 Fitur kenapa Asp.Net 4 cocok untuk website publik

Aku baru saja kelar membaca Asp.Net 4.0 Beta 2 Overview dan ga sabar untuk menanti framework ini keluar. Di post ini, aku ingin menyoroti sedikit peningkatan yang membuat asp.net 4 cocok untuk membuat website publik.

Kamu akan melihat bahwa sepertinya Microsoft berusaha untuk lebih ‘mempercayai’ komunitas programmernya. Kita bisa liat bagaimana Microsoft membuat bbrp fitur yang sudah ada bisa di extend lebih lanjut untuk kebutuhan kita masing-masing.

1. Accessibility: Bisa mengatur Url

image

Sebagian dari kita yang udah main-main sama Asp.Net MVC pasti ga bisa lepas sama fitur Routing. Tidak seperti Asp.Net yang secara default, sistem url-nya terikat sama file system, asp.net MVC punya kontrol lebih.

Di Asp.net versi lama kita bisa bikin friendly url dengan membuat HttpModule khusus yang tugasnya meng-convert url internal dengan eksternal. Sejak Asp.Net 3.5 kita jg bisa memakai Routing class dari ASp.Ne MVC. Tapi di Asp.Net 4 lebih mudah lagi karena nanti akan ada:

  • Routing bisa nge-map ke physical file
  • Ngebaca informasi dari url bakal sama gampangya sama ngebaca dari query string

Page.RouteData.Values["blogtitle"] as string;

  • Bisa pakai Routing information supaya ga usah masukin url ke mark up. jadi ga ada yang di hard-code.

 NavigateUrl="<%$RouteUrl:Search=ronaldwidha%>"

2. Accessibility: Permanently Redirecting a Page

Seperti yang mungkin kamu sudah tau, ada beberapa macam http response. 301 adalah salah satunya untuk menyatakan bahwa halaman yang user mau liat sudah pindah lokasi.

Sebelum Asp.net 4.0 kita harus ngelakuin ini secara manual:

Response.Status = "301 Moved Permanently";
Response.AddHeader("Location","http://new-location");

Di Asp.net 4, sekarang kita bisa tinggal:

RedirectPermanent("http://new-location");

3. Accessibility: Extensible Browser Capabilities

Browser Definition adalah salah satu fitur asp.net yang bisa kita pakai untuk mengecek kemampuan dari browser. Fitur ini udah diperkenalkan sejak Asp.Net 3.5 SP1 tapi perlu konfigurasi xml dan manggil program di command prompt

Side Note: Scott Hanselman spoke to Chris Woods, a program manager at Microsoft on the Mobile Browse Platform Team about a database of mobile device capabilities which uses the same mechanism.

Di Asp.net 4, Microsoft sudah masukin browser definition  untuk iphone, chrome, safari and opera.

3g-iphone-earrings_2 
taken from http://www.geeky-gadgets.com

Fitur ini juga bisa di-extend menggunakan Provider.

4. Performance: Extensible Output and Object Caching

Ga ada website yang bakal survive tanpa a good caching strategy.

[lanjutannya dalam bahasa inggris: diambil dari http://www.ronaldwidha.net/2009/10/18/10-features-why-asp-net-4-is-better-for-public-website/]

Asp.Net does always have a caching mechanism built in, but it lacks native support to external distributed caching engines.

On Asp.Net 4, output and object caching are implemented using the Provider model, which means you can use the normal cache object to interact with your own custom cache engine!

Or even better, implement your own custom caching strategy based usage patterns, time of day, etc.

5. Performance: Control over Client ID

image

With the prior versions of Asp.net, we lost control over what Html ID gets generated to the clients. This introduce 2 problems: performance (size of download gets bigger) and it becomes so darn hard to write client side script without a reliable client ID.

Side Note: QA team also often finds it difficult to write consistent Automated UAT Script (using WatiN or Selenium) having the client ID automatically generated by Asp.Net.

Asp.Net 4 introduce ClientIDMode which lets you set AutoID, Static, Predictable and Inherit.

Static – specifies the ClientID to use the value as the ID of the web user control without the parent naming containers.

Predictable – specifies the Client ID with a specified row suffix. This is generally used for controls with repeating templates.

6. Performance: More Granular View State Control

In prior Asp.Net versions, ViewState is enabled by default and can’t be disabled sitewide. In Asp.Net 4 this is now possible. Possible values include Enabled, Disabled and Inherit.

Remember, View State aren’t evil but it has to be utilized carefully.

image

7. Performance: Session State Compression

Handling massive amount of session state can be quiet expensive on a large website. Asp.Net 4 introduce a simple switch to turn Gzip compression on out-of-process session state providers. Very cool!

8. Performance: Auto-Start Web Applications

Some sites have extensive Application_Start procedure, for e.g eager cache static content, or let the load balancer know that the server is ready to start serving requests. However in previous Asp.net versions, Application_Start happens upon the first user visit the site causing terrible experience for this unlucky person.

Side Note: hence often we have an automated ping to fake the first request to kick off the application

Asp.Net 4 with IIS 7.5 introduce an always on mode which start the web site automatically.

9. Security: Extensible HTML, URL and HTTP Header Encoding

Have you ever had problems of not being able to escape special characters by using HttpUtility.Encode ? In the previous Asp.Net versions the encoding technique doesn’t seem to be aggressive enough. In Asp.Net 4, Microsoft again introduce an extensibility point to built our own and have it configured from the web.config file.

<httpRuntime encoderType="Samples.MyCustomEncoder, Samples" /> 

10. Security : Extensible Http Request Validation

Asp.Net 4 introduce a few things that improves security when it comes to handling http requests:

  • Url character check configuration.
    afraid of script injection/XSS (cross side scripting) attacks from the url? fear no more, now we can specify a list of invalid chars. If it failed the test, http 400 will be returned back
  • Request Validation
    This is an attempt to validate all HTTP request data. We have to see how effective it really is.
  • As you might start to recognize a pattern from the previous points, guess what? Request Validation feature is also extensible, so if Microsoft isn’t doing a good enough job, you could implement it yourself.

The Bad news is there seem to be  not much improvement over the rendering of the web controls. Render=Flow still generate a bunch of span-s instead of div-s which I personally found limiting.

Share this post: | | | |
More Posts Next page »