Dokumentasi vs Spesifikasi

Bagian paling menyebalkan dari LMGTFY itu adalah ketika kita kurang familiar dengan kata kunci yang harus dipakai (terutama jika bidangnya baru). Berikut list bacaan buat tahun baru (entah kapan dibacanya), supaya bisa bikin dokumentasi/mapping code, sehingga codenya lebih terorganisir.

  1. Apa beda Functional Specification dan Technical Specification?
    klik di sini
  2. Technical specification klik di sini
  3. 10 typical mistakes in specs klik di sini
  4. Example for software design specification klik di sini
  5. Example a good software design document (including link to joel) klik di sini
  6. Software documentation samples klik di sini
  7. NAH. EDU. Example software documentation klik di sini
  8. 14 examples of documentation mistakes you are making (including list of all possible actions) klik di sini
  9. 10 examples of great end user documentation klik di sini

Konsep penting .NET (secara praktek)

PENDAHULUAN

Contoh error yang ditemui pada C++/CLI:
C4368: cannot define ___ as a member of managed ___ : mixed types are not supported

Alasan:
Karena belum mengerti konsep .NET, jadi mencampuradukkan tipe managed dan unmanaged (dalam hal ini, array).
SO1SO2

PENJELASAN
disarikan dari sini

Dua jenis alokasi memori: stack & heap
Stack bertanggung jawab menelusuri -keeping track- running memory di aplikasi yang sedang berjalan. Alokasi memori dan dealokasi memori pada stack menggunakan logika LIFO (Last In First Out).

Ketika suatu obyek diciptakan (misal class1 cls1 = new class1();), suatu pointer diciptakan di stack namun obyek yang sebenarnya diletakkan pada tipe memory yang berbeda, yaitu heap. Heap tidak menelusuri (keeping track) running memory. Heap adalah tumpukan obyek yang bisa diakses pada saat kapanpun (tidak melalui LIFO). Heap digunakan untuk alokasi memori dinamis.

Penting

– reference pointer dialokasikan pada stack
– class1 cls –> mengalokasikan stack variable cls1 (di-set sebagai null)
– class1 cls –> tidak mengalokasikan memory untuk instance Class1
– keyword new –> mengalokasikan memory pada heap
– ketika keluar dari suatu method, memory variable pada stack di-dealokasi degan menggunakan (fashion) LIFO.
– ketika keluar dari suatu method, heap memory tidak di-dealokasi, hanya stack memory yang di-dealokasi
– heap memory nantinya akan di-dealokasi dengan menggonakan garbage collector

(visualisasi alokasi/dealokasi memori yang simpel dan deskriptif. Gambar diambil dari codeproject.com)

Review tipe data: primitif, obyek
– primitif:
–> tidak kompleks, hanya memiliki satu nilai (besaran)
–> tipe data primitif membutuhkan memori statik
–> jika suatu data membutuhkan memori statik, makan ia akan dialokasikan di stack
– obyek:
–> kompleks, merefer ke obyek lain dan atau tipe data primitif lain
–> tipe data obyek memegang referensi dari beberapa nilai (tidak hanya satu), dan setiap nilai tersebut harus disimpan di dalam memori
–> tipe data obyek membutuhkan memori dinamis
–> jika suatu data membutuhkan memori dinamis, makan ia akan dialokasikan di heap

Tipe nilai dan tipe referensi
– tipe nilai (value type)
–> memegang data dan memory, keduanya pada lokasi yang sama
–> ketike meng-assign suatu nilai integer ke nilai integer lainnya, maka kita akan memiliki dua kopi (yang jika salah satunya diubah, maka kopi yang lainnya tidak ikut mengalami perubahan)
–> selain tipe data string atau obyek
– tipe referensi
–> memiliki pointer yang menunjuk lokasi memori
–> ketika kita meng-assign suatu obyek ke obyek lainnya, mereka (kedua obyek tersebut) akan menunjuk ke lokasi memori yang sama. Jika satu obyek diubah, maka obyek lain juga akan terpengaruh.
–> string atau obyek

Boxing dan unboxing
– Boxing
–> data bergerak dari tipe nilai ke tipe referensi
–> data bergerak dari stack ke heap
–> contoh: int i=1; object O =i;
– Unboxing
–> data bergerak dari tipe refernsi ke tipe nilai
–> data bergerak dari heap ke stack
–> contoh: int j = (int) O

Boxing dan unboxing ini memperlambat waktu eksekusi. Jadi sebisa mungkin, sebaiknya dihindari.

TENTANG Mixed Types

Library: native & .NET
CLR: memungkinkan language interop antara assembly

Traditional native heap memory managers
– traditional memory managers: data yang tersimpan di memori tidak pernah dipindahkan oleh sistem, melainkan hanya bisa dipindahkan oleh program (yang ditulis)
– suatu range memori berada pada kendali program, sampai ketika range memori tersebut tidak lagi di-referensi-kan
– pada titik ini garbage collector bisa membebaskan memori

Kasus run out of memory
– bukan (melulu) karena memory leak, tapi karena memory heap terfragmentasi
– fragmentasi memori: walaupun sebenarnya ada cukup memori yang tersisa untuk alokasi memori, namun space yang masih bebas (free space) pada blok yang bersebelahan (contiguous block) tidak cukup

 CLR garbage collector
– merupakan teknik manajemen memori yang sophisticated
– setiap garbage collection terjadi, obyek yang tersisa akan dipindah ke bagian awal heap
– ini berarti memory yang masih kosong selalu tersedia pada potongan memory yang bersebelahan pada range alamat heap yang lebih tinggi (bukan awal heap)
– hal ini membuat alokasi memori menjadi sangat cepat
– namun ini juga berarti, tidak seperti manajemn memori secara tradisional, pada .NET garbage collector, obyek pada GC heap dipindahkan oleh sistem (CLR).
– alamat memory yang mereferensi ke obyek akan diupdate oleh sistem

Masalah dengan unmanaged code
– Ketika alamat memori diupdate oleh sistem (CLR), sistem hanya mengetahui referensi memori yang berasal dari managed code.
– ini berarti, referensi apapun ke suatu obyek pada GC heap yang berasal dari unmanaged code tidak akan diupdate, dan program bisa berhenti setelah GC terjadi/bekerja

Apa itu mixed type
– adalah native class atau ref class yang memerlukan anggota obyek (baik melalui deklarasi atau penurunan/inheritance) untuk dialokasikan pada GC heap.

Terminology
ILDASM: Intermediate Language  Dis-assembler
Tool untuk melihat isi assembly dari setiap kelas atau method pada .NET application
ILDASM ada pada mesin/PC yang:
– sudah terinstal Visual Studio
– sudah mendownload .NET SDK

Review GUI Application (Windows Form) menggunakan VS2013

Identifikasi masalah

Saya ingin membangun suatu sistem berbasis windows form (GUI, bukan console/command line) untuk suatu aplikasi real time.

Keterbatasan

– Sistem tersebut diharapkan dibangun pada VS2013
– Pada VS2013, opsi “Windows Form Application” hanya tersedia pada VC#, tidak pada VC++

Mengapa menggunakan C++/CLI

– secara personal, bahasanya sudah lebih familiar dibanding C#
– aplikasi yang dibangun dengan C++/CLI diduga lebih cepat dari C# dan VB

Perlu diselidiki lebih lanjut

– apakah VC++ perform lebih baik pada aplikasi realtime ketimbang VC# dan VB?
– menurut link berikut, C++/CLI adalah memprogram .NET dalam bahasa C++, apakah ini berarti C++ sudah tidak sama dengan C++/CLI berkaitan dengan kecepatan untuk suatu aplikasi real time?

PRAKTEK
(dimodifikasi dari sini)
1. Membuat proyek baru
VC++ CLR, CLR Empty Project

2. Membuat form baru
Project, add new item, VC++ UI, Windows Form

PENTING (1):
– Pada C++/CLI VS2013 ini, entry point harus didefinisikan secara manual
– >> untuk bekerja dengan UI Controls, deklarasikan using namespace System, dan using namespace System::Windows::Forms
– >>eksekusi: enablevisualstyles(), inisiasi form dan jalankan
– >> atur konfigurasi proyek sehingga memiliki entry point fungsi Main
Implementasi:
pada ____.cpp (misalnya NamaForm.cpp pada proyek NamaProyek), edit menjadi seperti ini

#include "NamaForm.h"

using namespace System;
using namespace System::Windows::Forms;


[STAThread]
void Main(array<String^>^ args)
{
 Application::EnableVisualStyles();
 Application::SetCompatibleTextRenderingDefault(false);

 NamaProyek::NamaForm form;
 Application::Run(%form);
}

Edit properties: Click kanan pada nama project, properties, configuration properties, linker
– system, subsystem Windows,
– advanced, entry point: Main

3. Menambahkan form baru dan menghubungkannya dengan form lama

Project, add new item, VC++ UI, Windows Form

Misalnya untuk membuka NamaFormBaru dari suatu button pada NamaForm, double click button tersebut (pada visual editor), lalu ketikkan

NamaFormBaru ^ form = gcnew NamaFormBaru();
form->ShowDialog()

PENTING (2)
Tambahkan/include header NamaFormBaru pada bagian atas NamaForm (setelah #pragma once)

#include "NamaFormBaru.h"

 4. Melakukan sharing variable antar form (kasus 1: String)

Misalnya untuk mengirim string variabel InformasiText pada NamaForm (form lama) ke NamaFormBaru (form baru)

Ada 3 tahapan
a. Instansiasi variable string dengan tipe public pada NamaFormBaru
b. Buat konstruktor baru pada NamaFormBaru
c. Kirim data pada NamaForm dengan memanggil konstruktor baru NamaFormBaru

Secara detail
a. Instansiasi variabel string dengan tipe public pada NamaFormBaru
Tambahkan

public:
String ^InformasiText

b. Buat konstruktor baru pada NamaFormBaru
Kopi konstruktor NamaFormBaru yang sudah tersedia secara default

public:
NamaFormBaru(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
}

paste, lalu edit menjadi seperti ini

public:
Mainmenu(String ^text)
{
InitializeComponent();
InformasiText = text;
//TODO: Add the constructor code here
//
}

c. Kirim data pada NamaForm dengan memanggil konstruktor baru NamaFormBaru

Misalnya variable tersebut ingin dikirim/sharing ketika mengklik button pada NamaForm (form lama), maka event handler button click tersebut dimodifikasi (dari contoh sebelumnya, point 3) menjadi

String ^InformasiText = "yuhuu";
NamaFormBaru ^ form = gcnew NamaFormBaru(InformasiText);
form->ShowDialog()

 5. Melakukan sharing variable antar form (kasus 2: float)

Mirip dengan cara point 4, tapi ubah String ^namavariabel menjadi float namavariabel.

6. Launch/menjalankan program lain (.exe)
Lakukan

String ^FilePath = "C:\\somelink.exe";
Process::Start(FilePath);

Setelah mendeclare

using namespace System::Diagnostics;

7. Buka form dialog untuk membuka file

Lakukan

OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog;
openFileDialog1->ShowDialog();
String^ FilePath = openFileDialog1->FileName;

Hasil: file path
Bisa ditindaklanjuti dengan menjalankan/mengeksekusi file (point 6 di atas), misal: Process::Start(FilePath).

LAIN-LAIN
1. Apa yang terjadi ketika suatu button pada visual editor di-double click?
– penambahan event handler, misalnya gcnew System::EventHandler …
– penambahan fungsi kosong, misalnya System::Void button1_Click …

Singkatan

CLI: Common Language Infrastructure

Daftar error dan solusinya

Error Solusi
LNK1561: entry point must be defined Using namespace System::Windows::Form, edit konfigurasi agar entry point proyek dimulai dari fungsi Main.
Lihat “PENTING (1)”
 C2065: ‘NamaFormBaru’ undeclared identifier Include header NamaFormBaru pada bagian atas form pemanggil.
Lihat “PENTING (2)”
 C2653: ‘Process’ : is not a class or namespace name Deklarasi using namespace System::Diagnostics; (point 6)

.NET, C++/CLI, CLR (usaha kedua)

Ini adalah usaha kedua untuk mencoba mengerti framework .NET dan implementasinya dalam C++.

Disarikan dari wikipedia, code project, functionx

.NET adalah framework software yang dikembangkan oleh Microsoft.

CLI: Common Language Infrastructure
Tujuan CLI adalah menyediakan platform yang netral-bahasa (language-neutral) untuk pengembangan dan eksekusi suatu aplikasi, termasuk di dalamnya: exception handling, garbage collection,security, dan interoperability.

CLR: Common language runtime
– adalah implementasi dari CLI.
– adalah execution engine dari .NET framework. Semua program .NET dieksekusi dibawah CLR untuk menggaransi (memastikan) beberapa sifat (properties and behaviors) dalam area manajemen memori, keamanan, dan exception handling.
– CLR membebaskan programmer dari keharusan memanajemen memori (alokasi dan membebaskan memori ketika selesai) —> mari bahas pada kesempatan selanjutnya

Windows Form
– adalah teknik membuat aplikasi komputer berbasis CLR
– menawarkan suatu seri obyek yang disebut Windows Control. Kontrol ini sudah diciptakan dalam framework .NET melalui berbagai kelas.

Performa
Karena garbage collector terintegrasi dalam .NET Framework dan sifatnya non deterministik (tidak diketahui kapan bekerjanya dan programmer tidak memiliki kontrol langsung), GC ini bis.a menimbulkan delay pada saat eksekusi

Pointer dalam C++/CLI
Jika di dalam C++ kita menggunakan * untuk menotasikan pointer, maka dalam C++/CLI kita menggunakan ^ (caret) untuk menotasikan handle.
Untuk membuat referensi baru (suatu tipe kelas atau nilai tertentu), kita mengalokasikannya dengan keyword “gnew”
Jika pada C++ * berpasangan dengan &, maka pada C++/CLI ^ berpasangan dengan %.

Terminology

IDE: Integrated Devel0pment Environment,
– contains compiler, interpreter, or both
– may include programming window for writing source code, debugger, visual editor (to create/edit GUI)
– e.g., MSVisual Studio, NetBeans, Eclipse

SDK: Software Development Kit, or DevKit
– koleksi software yang digunakan untuk mengembangkan aplikasi untuk device tertentu (spesifik) atau OS tertentu
– SDK biasanya termasuk IDE

GC: Garbage collector
– adalah manajemen memori secara otomatis
– GC berusaha untuk me-reklaim garbage (memori yang diduduki oleh obyek yang tidak lagi digunakan oleh program)

C#: C-sharp
– adalah  bahasa yang didesain oleh Microsoft untuk .NET dan CLI (Common Language Infrastructure)
– adalah bahasa pemrograman OOP

Deploy Windows Program

Ini kali pertama saya ngedeploy program di PC yang berbeda dengan PC tempat saya mendevelope program (atau biasanya, saya compile ulang pake Visual Studio yang ada di PC yang bersangkutan). Berikut ulasannya ketika mendeploy program berbasis VS2013.

1. Error
Pada PC yg bersangkutan tidak terdapat MSVCR120D.dll
Perhatikan bahwa huruf D menandai debug process (saya baru uji coba running program dalam debug mode). Jika program di-release terlebih dahulu, library yg dibutuhkan adalah MSVCR120.dll (tanpa huruf D)

2. Alternatif solusi (tidak berhasil)
Saya coba meng-kopi-paste dll yg dibutuhkan dari dan ke System32, namun tidak berhasil.

3. Solusi yang baik (elegan)
Dengan menginstal Visual C++ Redistributable Packages for Visual Studio 2013 dari situs resmi microsoft pada PC yang bersangkutan (prototype PC).
Jangan lupa dll ‘paksaan’ yg sebelumnya dikopi, di-remove dulu sebelumnya.

Lebih lanjut tentang deployment (skala lebih kompleks) ada di sini

Komentar

Lagi berusaha memperbaiki teknik bekerja saya. Salah satunya mungkin teknik memberi komentar ya.. (Selanjutnya teknik documenting, klo ada waktu.)

Langsung aja.

Yang dibutuhkan:
1. JUDUL
Nama judul keseluruhan (aplikasi/modul)
Author, tanggal pembuatan

2. KETERANGAN FILE
Nama file
Tujuan (purpose)

3. Lain2
File inclusion (#include)
Global definitions and macros (#define)
Prototypes (function declaration)

4. KETERANGAN FUNGSI
Nama fungsi
Tujuan
Input
Output
Return value
Author

Mengukur waktu

Kebetulan lagi butuh menyusun suatu proses real time. Jadi penasaran juga ngitung time-lapse (execution time) dsb nya. Menurut stackoveflow bisa pakai

1. <time.h>

clock_t begin, end;
double time_spent;
begin = clock();
//
end = clock();
time_spent=(double)(end-begin) *1000.0/ CLOCKS_PER_SEC;

2. time ./a.out (at running time)

—-

Keterangan:

  • clock()
    clock_t clock(void)
    fungsi yang mengembalikan waktu prosesor (processor time) yang dikonsumsi oleh program
  • clock_t
    tipe yang termasuk fundamental arithmetic, merepresentasikan clock tick counts.
  • CLOCKS_PER_SEC
    macro yang merepresentasikan jumlah clock ticks per detik.
    Clock ticks: unit waktu dari suatu konstanta yang panjangnya spesifik terhadap sistem (PC)
    fungsi clock() di point teratas mengembalikan (return value) clock ticks ini.