Membuat WebApp dengan Microsoft Azure dan Github



Microsoft Azure adalah cloud service platform dari microsoft yang dapat digunakan untuk berbagai hal dalam bidang cloud computing seperti database, mobile backend, web apps, virtual machines, dan lain-lain.

Pada artikel kali ini kita akan membuat web app dan di-host ke azure. Ada dua cara untuk deploy web app ke azure, yaitu FTP dan Git. Artikel kali ini akan menunjukan bagaimana men-deploy-kan nya menggunakan Git.

Terlebih dahulu kita perlu membuat akun Github untuk menggunakan layanan Git dengan mengunjungi github.com. Klik sign up, isi data pada form yang tersedia lalu klik Create an account.


Pada langkah ini, pilih yang Free, lalu klik Finish sign up

Buka inbox email yang telah didaftarkan akun github, lalu verifikasi email tersebut
Langkah selanjutnya kita perlu menginstall Git Terminal pada laptop kita dengan mengunjungi link berikut git-scm.com lalu klik download.

Kembali ke web github tadi, buat repository baru dengan klik tombol New Repository. Kemudian masukkan nama repository yang kita inginkan, misalnya AzureWebApp lalu klik Create repository.

Selanjutnya kita akan menyimpan kode program yang kita buat ke github menggunakan git terminal. Buka git terminal(git bash) lalu ikuti langkah-langkah berikut ini:

Buat file index.php dengan isi sebagai berikut, lalu simpan pada folder anda

<?php 
   echo "Hello, Azure!";
?>

Buka lokasi code program disimpan pada CMD(misal disini saya simpan pada folder WebSaya), lalu ketik 

git config --global user.name “nickname”
git config --global user.email “email”

*nickname = username github anda
*email = email github anda

Selanjutnya lakukan inisialisasi pada repository

git init

Hubungkan dengan repository yang telah anda buat

git remote add origin https://github.com/azhary/AzureWebApp.git
git remote –v

*url repository bisa dilihat pada repository yang telah anda buat

Tambah semua file didalam folder dengan command

git add .

Commit dengan –m (message)

git commit –m “initial commit”

Selanjutnya push ke github

git push origin master

Setelah itu anda akan diminta untuk memasukkan username dan password.


Command Git 

git config
konfigurasi user pada saat pertama kali

git init
inisialisasi pertama kali pada folder project yang akan disimpan di github

git help
menampilkan command pada git

git status
menampilkan file yang telah diubah

git add
menambahkan file ke repository pada github

git commit
memberi tanda pada pada perubahan file

git branch
mengembangkan project pada masing-masing repository

git merge
menggabungkan semua project pada setiap contributor

git push
mengupdate perubahan code ke github

git pull
mengupdate code repositori local



Langkah selanjutnya kita akan membuat WebApp pada azure.

1. Terlebih dahulu login akun azure anda pada http://portal.azure.com/
2. Klik New, pilih Web + Mobile, masukkan nama Web App anda lalu klik Create
3. Tunggu hingga proses selesai
4. Setelah selesai, anda dapat membuka web anda dengan mengunjungi alamat namawebanda.azurewebsites.net

5. Kemudian kita akan menghubungkan Azure Web App dengan Github, caranya pada menu Web App pilih Setting -> Continuous Deployment -> Choose Source -> Github
6. Klik Authorization untuk menghubungkan ke akun Github anda
7. Setelah dihubungkan ke akun github, klik Choose Project lalu pilih repository anda, kemudian klik OK.

8. Setelah integrasi dengan akun github berhasil, lihat web anda
Setiap kita melakukan push otomatis Azure akan mengupdate project web kita.


Selanjutnya kita akan menghubungkan database MySQL dengan Azure.

1. Buka portal azure, lalu klik New -> Data + Storage -> MySQL Database. Isi nama database. Pada bagian Legal Terms klik OK untuk memberikan authorize pada Legal Terms. Kemudian klik Create
2. Setelah deployment database selesai, pada settings lalu lihat properties yang ada pada database tersebut.
Kita akan membutuhkan informasi mengenai HOSTNAME, DATABASE NAME, USERNAME, dan PASSWORD.

3. Kemudian kita akan membuat tabel pada database kita, buka http://www.phpmyadmin.co/ lalu login menggunakan hostname, username, dan password yang telah kita dapatkan tadi

4. Pada bagian kiri, klik pada database yang kita buat tadi. Lalu pilih SQL, kemudian ketik query berikut ini lalu klik Go
CREATE TABLE registration_tbl(id INT NOT NULL AUTO_INCREMENT, 
PRIMARY KEY(id), name VARCHAR(30), email VARCHAR(30), date DATE);

5. Pada folder kita, buat file baru dengan nama connect.php dengan isi sebagai berikut
<?php 
define("HOSTNAME", "hostname_database_anda");
define("USERNAME", "username_database_anda");
define("PASSWORD", "password_database_anda");
define("DBNAME", "nama_database_anda"); /* misalnya nama database saya db_azurems */

$conn = mysql_connect(HOSTNAME, USERNAME, PASSWORD)
  or die ("Error saat menghubungkan ke host database");
$db = mysql_select_db(DBNAME)
  or die ("Error saat menghubungkan ke database");
?>

6. Lalu ubah file index.php dengan isi sebagai berikut
<!DOCTYPE html>
<html>
<head>
 <title>Web App Sederhana</title>
</head>
<body>
 <form action="hello.php" method="POST">
  <div>
   <label for="nama">Nama</label>
   <input type="text" id="nama" name="nama"/>
  </div>
  <div>
   <label for="email">Email</label>
   <input type="email" id="email" name="email"/>
  </div>
  <div>
   <input type="submit" id="submit" name="submit"/>
  </div>
 </form>
</body>
</html>

7. Buat file baru dengan nama hello.php dengan isi sebagai berikut
<!DOCTYPE html>

<html>
<head>
    <title>Web App Sederhana</title>
</head>
<body>
    <?php
        include("connect.php");
        if (!empty($_POST)) {
            $nama = $_POST['nama'];
            $email = $_POST['email'];
            $date = date("Y-m-d");
            echo '<h1>Halo, ' . $nama . '!</h1>';
            echo 'Email : ' . $email;
            // Insert data
            $sql_insert = "INSERT INTO registration_tbl (name, email, date) VALUES ('$nama', '$email', '$date')";
            mysql_query($sql_insert) or die (mysql_error());
        }
        // Retrieve data
        $sql_select = "SELECT * FROM registration_tbl";
        $result = mysql_query($sql_select) or die (mysql_error());
        echo "<br><br>";
        echo "Data yang telah masuk :";
        echo "<br><br>";
        echo "<table border='1'>";
        echo "<tr><th>Nama</th>";
        echo "<th>Email</th>";
        echo "<th>Tanggal</th></tr>";
       
        while ($row = mysql_fetch_array($result)) {
            echo "<tr><td>".$row['name']."</td>";
            echo "<td>".$row['email']."</td>";
            echo "<td>".$row['date']."</td></tr>";
        }
        echo "</table>";
    ?>
</body>
</html>


8. Push lagi file-file tersebut lalu lihat perubahan yang terjadi pada web kita

Pointer dalam Bahasa Pemrograman C


Pointer merupakan salah satu fitur yang terdapat dalam bahasa pemrograman C. Fitur ini bisa dibilang powerful karena dapat membuat kita mengakses dan memanipulasi alamat memori(address) pada suatu variabel.

Dalam menggunakan pointer, kita menggunakan operator reference(& dan *).  Misalkan suatu variabel bernama x, maka &x adalah address dari variabel x.

#include <stdio.h>

int main()
{
    int x = 7;

    printf("Nilai x: %d\n", x);
    
    // gunakan %p agar address yang ditampilkan dalam angka heksadesimal
    printf("Alamat x: %p\n", &x); // lambang ampersand(&) sebelum variabel x
    return 0;
}

Output:
Nilai x: 7
Alamat x: 0029ff0c

*kamu mungkin menghasilkan alamat yang berbeda tergantung sistem operasi memakai alamat mana saat kode tersebut dieksekusi

Pada program tersebut, nilai 7 disimpan di lokasi memori 0029ff0c. x hanyalah sebuah nama yang diberikan ke lokasi memori tersebut.

 Variabel hanyalah lokasi memori yang diberi nama
Variabel pointer adalah suatu variabel yang dapat menyimpan address, sedangkan variabel biasa menyimpan nilai. Ketika suatu pointer sedang memegang suatu address variabel lain, kita juga dapat mengubah nilai yang ada pada variabel yang address-nya sedang dipegang oleh pointer tersebut.

Cara mendeklarasikan suatu variabel pointer menggunakan operator * , dan untuk mengambil address suatu variabel menggunakan operator & .

#include <stdio.h>

int main()
{
    int y;
    int *x = &y; // pointer x menyimpan alamat y
    printf("yang disimpan x = %p\n", x);
    printf("alamat y = %p\n", &y);
    return 0;
}

Output:
yang disimpan x: 0029ff08
alamat y: 0029ff08

*kamu mungkin menghasilkan alamat yang berbeda tergantung sistem operasi memakai alamat mana saat kode tersebut dieksekusi

Jika ingin menampilkan nilai dari address yang sedang dipegang oleh variabel pointer, kita menggunakan operator * pada saat menggunakan printf()

#include <stdio.h>

int main()
{
    int y = 5;
    int *x = &y; // pointer x menyimpan alamat y

    printf("nilai dari address yang dipegang oleh x = %d\n", *x);
    printf("nilai variabel y = %d\n", y);
    return 0;
}

Output:
nilai dari address yang dipegang oleh x = 5
nilai variabel y = 5

Cara untuk mengubah nilai dari address yang dipegang oleh variabel pointer

#include <stdio.h>

int main()
{
    int y = 5;
    int *x = &y; // pointer x menyimpan alamat y

    printf("Nilai y sebelum diubah dari pointer x = %d\n", y);

    *x = 10; // mengubah nilai dari address yg dipegang pointer x

    printf("Nilai y setelah diubah dari pointer x = %d\n", y);

    return 0;
}

Output:
Nilai y sebelum diubah dari pointer x = 5
Nilai y setelah diubah dari pointer x =10

Namun, jika kita mengubah nilai dari address yang dipegang tanpa operator * , maka pointer tersebut berarti menyimpan alamat 10 atau dalam heksadesimal 0000000a

#include <stdio.h>

int main()
{
    int y = 5;
    int *x = &y; // pointer x menyimpan alamat y

    x = 10; // tanpa * , maka x menyimpan alamat 10
    // 10 dalam heksadesimal adalah 0000000a

    printf("address yang dipegang x = %p\n", x);

    return 0;
}

Output:
address yang dipegang x = 0000000a


 

Programming Simple Math Quiz Application with C# and Visual Studio

In this article, i will explain how to program Simple Math Quiz application. I used Visual Studio 2015 with C# and XAML programming language to make this program.

This app will show simple mathematical problem that must be solved by user, and then the user can generate another mathematical problem.


Steps:
First, click on New Project -> Visual C# -> Universal -> Blank App

There are several things we must pay attention to when we choose Blank App Template. Look at Solution Explorer, there is a file named MainPage.xaml and when we expand it, it will show another file named MainPage.xaml.cs(Choose Window -> Reset Window Layout, if Solution Explorer is not visible on Visual Studio interface).

MainPage.xaml is a file used to design the app's interface, and MainPage.xaml.cs is used to make functional and logical component of the app.
Double-click on MainPage.xaml to open the file, Visual Studio will divide it's main interface into three sections. The first section is called designer where we can look at the user interface of our app. The second section is XAML, the actual component that build the user interface. The third is Toolbox, this section provides common XAML component control that can be used into the app.

On the toolbox, click on Common XAML Controls, then choose a Button and drag it into designer. The button we dragged earlier will be showed in the designer. When we clicked on that button, look at Properties panel on the right-down corner(Choose Window -> Reset Window Layout, if Properties panel is not visible). There is name textbox used to name our  button, and content textbox to set the text that will show on the button.

Change the name on that button to answer_btn and the content to Answer.

Again on the toolbox, drag four Textblocks and one Textbox into designer and arrange it so that it looks like on this image below.

Change the name to operand1 for the left-most textblock and its text to ?, then change the name of the Textblock next to it to operator and its text to +, again change the name of the Textblock next to it to operand2 and its text to ?, then change the name of the fourth Textblock to equal and its text to =, give the name of the Textbox on the right-most to user_ans without text.

Add another two buttons and one textblock into designer. The first we name it generate_question with text Generate Question then put it on the top. The another we name it start_btn with text Start and put it below Answer button. Next, give the name of the textblock to message without text.

The next step we will build the Event Handler of the component we arranged earlier on the designer. On the Solution Explorer, open the MainPage.xaml.cs. Look at the constructor located at line 25 to 28.

The constructor will be executed when we open the MainPage file at the runtime(Visual Studio will set MainPage file to be the first page  when we created a new project). So, there are several things we focused on when the app is running. First, the user must not click the Answer button, Generate Question button, and insert the answer into the Textbox. User can only click the Start Quiz button. To make that not happen, we can disable that three controls. In C#(especially .NET Framework), we can set the IsEnabled property on that control to be false so that the control is disabled.

Add this code below the this.InitializeComponent();
// disabling user_ans, generate_question, and answer_btn control
user_ans.IsEnabled = false;
generate_question.IsEnabled = false;
answer_btn.IsEnabled = false;

Press Ctrl+F5 or click Local Machine to run the application and look at the result of our app.

The three controls cannot be used because our code that make the controls disabled is executed the second after the app is started running.

The next step is we build the Event Handler for Start button. Firstly, close the app we run earlier. Double click on Start button so that Visual Studio automatically generate method named start_btn_Click(button_name_Click) on MainPage.xaml.cs. This method will be executed when we click the Start button, the Answer button and the textbox we disabled before will be enabled, make a random mathematical problem, and hide the Start button.

To enable the Answer button and the textbox, we set the IsEnabled property to true. Then, we set Visibility property on the Start button to Visibility.Collapsed so that the Start button will be invisible. Next, we will generate two random numbers and display it to operand1 and operand2 textblock. To generate random number, first we instantiate an object with class Random. We can access the Next() method on that Random object that has two arguments. The first argument is the minimum number that will be generated, and the second is the maximum number. So, if we set Next(0, 30), then it will generate a random number between 0 and 30 inclusively. When the random number has been generated, the number must be converted to string with ToString() so that it can be assigned to Text property on operand1 and operand2.

Add this code in the start_btn_Click method
// enabling user_ans and answer_btn
user_ans.IsEnabled = true;
answer_btn.IsEnabled = true;

// generate two random numbers and display it on operand1 and operand2 textblock
// the number will be displayed is a number ranged between 0 and 30 inclusively
Random rand = new Random();
operand1.Text = rand.Next(0, 30).ToString();
operand2.Text = rand.Next(0, 30).ToString();

// hide the start button
start_btn.Visibility = Visibility.Collapsed;

Next, we will make Event Handler for the Answer button. Double click on the Answer button so that Visual Studio automatically generate a method called answer_btn_Click on MainPage.xaml.cs. When the user click the Answer button, the program will check if the number the user has been input is equal to the result of operand1 plus operand2. If true, then the program will display "Your answer is correct!", and false otherwise. However, the number on the operand1 and operand2 still be considered as Text. So, we must convert it back to integer with int.Parse(). After the user answered the question, we must disable the Answer button and the textbox, and enable the Generate Question button. The Answer button and the textbox will be enabled again when the user click the Generate Question button. 

Add this code in the answer_btn_Click method
// check if the user's answer is equal to the result of operand1 and operand2
if (int.Parse(operand1.Text) + int.Parse(operand2.Text) == int.Parse(user_ans.Text))
{
   message.Text = "Your answer is correct!";
}
else
{
   message.Text = "Your answer is incorrect!";
}

// disabling the textbox and answer button
// enabling the generate question button
user_ans.IsEnabled = false;
generate_question.IsEnabled = true;
answer_btn.IsEnabled = false;

Then, we will make a Event Handler for Generate Question button. Double click on that button to generate its method. When the user click that button, the program will generate two random numbers that will be displayed on the operand1 and operand2. Next, we disable the Generate Question, and enable the Answer button. Finally, set the content of the textbox and the message to an empty string.

Add this code in generate_question_Click method
// generate two random numbers and display it on operand1 and operand2 textblock
// the number will be displayed is a number ranged between 0 and 30 inclusively
Random rand = new Random();
operand1.Text = rand.Next(0, 30).ToString();
operand2.Text = rand.Next(0, 30).ToString();

// enabling the textbox and answer button
// disabling the generate question button
user_ans.IsEnabled = true;
generate_question.IsEnabled = false;
answer_btn.IsEnabled = true;

// set the text of the textbox and the message to an empty string
user_ans.Text = "";
message.Text = "";

Membuat Aplikasi "Math Quiz" dengan Visual Studio

Pada tulisan kali ini akan menjelaskan cara membuat aplikasi Math Quiz sederhana. Tool yang digunakan adalah Visual Studio 2015. Bahasa pemrograman yang akan digunakan adalah C# dan XAML.

Aplikasi Math Quiz ini adalah aplikasi yang menampilkan kuis matematika sederhana dan user harus menjawabnya dengan benar. Setelah itu aplikasi ini akan generate soal lain dengan angka random.

Langkah-langkah:

Pertama, klik pada New Project -> Visual C# -> Universal -> Blank App.
  
Ada beberapa hal yang harus diperhatikan ketika memilih Blank App Template. Lihat pada bagian Solution Explorer, ada file yang bernama MainPage.xaml dan ketika di-expand akan ada file MainPage.xaml.cs.(Pilih Window -> Reset Window Layout jika Solution Explorer tidak kelihatan).

MainPage.xaml adalah file yang digunakan untuk mengatur dan mendesain tampilan aplikasi. Sedangkan MainPage.xaml.cs digunakan untuk membuat fungsional dan logika dari aplikasi.  

Double-click pada MainPage.xaml untuk membuka file tersebut, maka visual studio akan membuat tampilan dalam tiga bagian. Bagian pertama disebut designer dimana kita dapat melihat user interface dari aplikasi kita(tampilan masih kosong karena kita memilih blank app template). Bagian kedua adalah XAML, yaitu kode markup yang membangun user interface. Bagian ketiga adalah Toolbox, yaitu bagian yang terdapat kumpulan kontrol yang dapat kita gunakan dalam aplikasi.

Pada toolbox, klik pada Common XAML Controls, lalu pilih sebuah Button, kemudian drag button tersebut ke designer sehingga akan muncul sebuah button pada designer. Ketika kita klik pada button tersebut, perhatikan pada bagian Properties di sudut kanan bawah((Pilih Window -> Reset Window Layout jika Properties tidak kelihatan). Ada kotak name yang berfungsi untuk memberi nama pada button, lalu kotak content untuk mengatur tampilan teks pada button.

Ubahlah name pada button tersebut menjadi answer_btn dan content-nya menjadi Answer

Kembali lagi pada toolbox, drag empat Textblock dan satu Textbox ke designer lalu susun seperti pada gambar di bawah ini.

Beri nama operand1 pada textblock paling kiri dan text-nya ?, lalu textblock di sebelahnya diberi nama operator dengan text +, di sebelahnya lagi diberi nama operand2 dengan text ?,  kemudian textblock keempat diberi nama equal dengan text =. Textbox yang berada paling kanan diberi nama user_ans dengan text kosong.

Tambah dua button lagi dan satu textblock ke designer. Yang pertama diberi nama generate_question dengan text  Generate Question lalu letakkan button tersebut pada bagian atas, yang satunya diberi nama start_btn dengan text Start dan letakkan di bawah button answer. Kemudian textblock diberi nama message dengan text kosong.

Langkah selanjutnya adalah kita akan membuat fungsi-fungsi dari kontrol yang telah kita letakkan pada designer tadi. Pada Solution Explorer, buka file MainPage.xaml.cs. Perhatikan konstruktor yang terdapat pada baris ke-25 sampai 28.

Konstruktor tersebut akan langsung dieksekusi ketika kita membuka halaman MainPage pada saat menjalankan aplikasi(saat ini secara default halaman yang terbuka pertama kali adalah MainPage). Jadi, ada beberapa hal yang harus dilakukan pada saat aplikasi baru dijalankan. Pertama, user tidak boleh menekan tombol Answer, Generate Question, maupun mengisi jawaban pada Textbox. User hanya dapat menekan tombol Start Quiz. Agar hal-hal tersebut tidak terjadi, kita dapat menonaktifkan ketiga kontrol tersebut. Pada kode C#, kita dapat menonaktifkan suatu kontrol tersebut dengan mengetik nama dari kontrol yang bersangkutan lalu membuat properti IsEnabled-nya menjadi false. Tambahkan kode berikut ini di bawah kode this.InitializeComponent();

// menonaktifkan kontrol user_ans, generate_question, dan answer_btn
user_ans.IsEnabled = false;
generate_question.IsEnabled = false;
answer_btn.IsEnabled = false;

Coba jalankan aplikasi tersebut dengan menekan Ctrl+F5 atau dengan klik tombol Local Machine lalu lihat hasilnya.

Ketiga kontrol tadi tidak bisa digunakan karena kode yang kita buat untuk menonaktifkan ketiga kontrol tersebut tereksekusi pada saat aplikasi baru dijalankan.

Langkah selanjutnya kita akan membuat fungsi pada tombol Start. Terlebih dahulu close aplikasi yang kita jalankan tadi. Klik dua kali pada tombol start maka Visual Studio secara otomatis membuat fungsi dengan nama start_btn_Click(nama_button_Click) pada MainPage.xaml.cs. Fungsi ini akan dieksekusi ketika kita klik pada tombol Start. Pada saat user mengklik tombol Start, tombol Answer dan textbox yang kita nonaktifkan sebelumnya akan diaktifkan, membuat soal secara random, lalu menghilangkan tombol Start tersebut.

Cara mengaktifkan tombol Answer dan textbox tadi ialah dengan membuat properti IsEnabled-nya menjadi true. Lalu membuat tombol Start hilang dengan membuat properti Visibility pada start_btn menjadi Visibility.Collapsed. Kemudian kita akan membuat dua bilangan acak yang akan ditampilkan pada textblock operand1 dan operand2. Agar dapat membuat bilangan acak, kita instantiate objek dengan class Random. Lalu pada objek random tersebut kita akses method Next() yang memiliki dua argumen. Argumen pertama adalah batas bawah jangkauan pengacakan nilai, argumen kedua adalah batas atas. Misal pada method Next(0, 30), berarti method tersebut akan membuat bilangan acak dari 0 sampai 30. Ketika bilangan acak tersebut telah dibuat, maka selanjutnya bilangan tersebut dikonversikan menjadi string dengan ToString() agar dapat disimpan pada properti Text dari operand1 dan operand2.

Tambahkan kode berikut ini di dalam fungsi start_btn_Click.
// mengaktifkan kontrol user_ans dan answer_btn
user_ans.IsEnabled = true;
answer_btn.IsEnabled = true;

// membuat dua bilangan acak lalu ditampilkan pada textblock operand1 dan operand2
// bilangan yang ditampilkan adalah acak dari 0 sampai 30
Random rand = new Random();
operand1.Text = rand.Next(0, 30).ToString();
operand2.Text = rand.Next(0, 30).ToString();

// menghilangkan tombol start_btn
start_btn.Visibility = Visibility.Collapsed;

Selanjutnya kita akan membuat fungsi pada tombol Answer. Klik dua kali pada tombol Answer agar Visual Studio secara otomatis membuat fungsi(dalam konteks ini event handler) bernama answer_btn_Click pada MainPage.xaml.cs. Ketika user menekan tombol Answer, maka program akan mengecek nilai yang dimasukkan oleh user pada textbox apakah benar atau salah. Jika nilai yang dimasukkan user sesuai dengan penjumlahan dari operand1 dan operand2, maka jawaban tersebut benar dan akan muncul pesan bahwa jawaban tersebut benar, dan sebaliknya jika salah. Namun, angka pada textblock operand1 dan operand2 serta angka pada textbox user_ans masih dianggap sebuah text. Untuk itu, kita perlu mengkonversikan kembali text tersebut menjadi angka menggunakan int.Parse(). Untuk mengecek jawaban dari user, terlebih dahulu kita membuat suatu perkondisian apakah nilai yang dimasukkan user pada textbox sama dengan nilai hasil penjumlahan operand1 dan operand2. Jika jawaban benar, maka textblock message akan menampilkan "Jawaban anda benar", dan sebaliknya. Setelah user mengklik tombol Answer, tombol tersebut dan textbox user_ans dinonaktifkan terlebih dahulu lalu kita aktifkan tombol Generate Question. Tombol Answer dan textbox user_ans akan aktif kembali jika user mengklik tombol Generate Question(agar membuat soal baru).

Tambahkan kode berikut ini di dalam fungsi answer_btn_Click.
// cek apakah jawaban user sama dengan hasil penjumlahan operand1 dan operand2
if (int.Parse(operand1.Text) + int.Parse(operand2.Text) == int.Parse(user_ans.Text))
{
   message.Text = "Jawaban anda benar!";
}
else
{
   message.Text = "Jawaban anda salah!";
}

// nonaktifkan textbox user_ans dan tombol answer_btn
// aktifkan tombol generate_question
user_ans.IsEnabled = false;
generate_question.IsEnabled = true;
answer_btn.IsEnabled = false;

Selanjutnya, agar tombol Generate Question dapat membuat soal baru lagi ketika diklik, terlebih dahulu kita klik dua kali tombol tersebut agar Visual Studio secara otomatis membuat fungsi generate_question_Click. Pada saat user mengklik tombol tersebut, program akan membuat dua bilangan acak yang ditampilkan pada textblock operand1 dan operand2. Lalu tombol Generate Question dinonaktifkan, textbox user_ans dan tombol Answer diaktifkan kembali. Kemudian isi dari textbox user_ans dan text pada textblock message dikosongkan.

Tambahkan kode berikut ini di dalam fungsi generate_question_Click
// membuat dua bilangan acak lalu ditampilkan pada textblock operand1 dan operand2
// bilangan yang ditampilkan adalah acak dari 0 sampai 30
Random rand = new Random();
operand1.Text = rand.Next(0, 30).ToString();
operand2.Text = rand.Next(0, 30).ToString();

// aktifkan textbox user_ans dan tombol answer_btn
// nonaktifkan tombol generate_question
user_ans.IsEnabled = true;
generate_question.IsEnabled = false;
answer_btn.IsEnabled = true;

// kosongkan isi dari textbos user_ans dan text dari textblock message
user_ans.Text = "";
message.Text = "";

C - Struktur Pembangun Algoritma

HTML/JavaScript Windows App Development - App Lifecycle dan Roaming Settings

Sebuah aplikasi dikatakan suspended(atau bisa dibilang paused) ketika aplikasi tersebut dialihkan atau ketika perangkat yang digunakan untuk menjalankan aplikasi tersebut tenaga baterainya hampir habis. Namun aplikasi tersebut masih berjalan di memory supaya pengguna dapat menyalakan aplikasinya lagi dengan cepat(atau di-resume).

Ketika aplikasi di-close, aplikasi tersebut akan ter-suspend selama 10 detik lalu kemudian terhenti(terminated). Data-data yang telah kita masukkan ke dalam variabel-variabel pada aplikasi tersebut akan hilang ketika aplikasi berhenti. Bagaimana membuat suatu aplikasi yang dapat menyimpan data yang kita masukkan seolah aplikasi tersebut tidak pernah berhenti? Disini kita akan menggunakan apa yang disebut dengan Roaming Settings. Roaming Settings memudahkan kita menyimpan data yang dapat diakses pada beberapa perangkat lain.

Percobaan menggunakan Roaming Settings
Pada percobaan ini kita menggunakan Visual Studio dengan Template Javascript Windows Store Apps Blank Template .

1. Pertama, buat New Project lalu pilih Template Javascript -> Store Apps -> Windows Apps, lalu pilih Blank App.
Ketika memilih Blank App, secara default akan tersedia file default.html dan default.js.

2. Buka file default.html. Lalu copy kode berikut ini di antara tag body
<div id="container">
  <h1>Demo menggunakan Roaming Settings - <a href="http://arliansyahazhary.blogspot.com">arliansyahazhary.blogspot.com</a></h1><br/>
  <h3><label for="InputNama">Masukkan namamu disini:</label></h3>
  <input type="text" id="InputNama" />
  <button id="TampilNama">Click</button><button id="Hapus">Hapus Nama</button><br/>
  <h2>Nama yang disimpan: <span id="SimpanNama"></span></h2><br/>
  <h2>Output: <span id="OutputNama"></span></h2><br/>
</div>

Agar kelihatan lebih rapi, kita atur margin pada #container dan display pada label dengan CSS. Copy kode berikut ini diantara tag head di bawah script default.js
<style>
  #container{
     margin32px;
  }
  label{
     displayblock;
  }
</style>

Aplikasi ini akan tampil seperti ini

3. Lalu kita akan membuat sebuah Event Handler yang meng-handle nama yang dimasukkan lalu ditampilkan dan disimpan. Kita akan membuat fungsi dalam javascript untuk melakukan hal tersebut.
Buat tag <script></script> di bawah tag <style> tadi lalu copy kode berikut di antara tag script tersebut
function ShowAndSave()
{
   // ambil nama yang dimasukkan pada textbox
   var TextboxInput = document.getElementById("InputNama").value;
 
   // tampilkan nama tadi pada tag span yang memiliki id OutputNama
   var OutputNama = document.getElementById("OutputNama");
   OutputNama.innerText = "Hello " + TextboxInput + ". Apa kabar?";
 
   // mengakses roaming settings
   var AppData = Windows.Storage.ApplicationData.current;
   var RoamingSettings = AppData.roamingSettings;
 
   // simpan nama yang dimasukkan tadi pada roaming settings dengan kunci "Nama"
   RoamingSettings.values["Nama"] = TextboxInput;
 
   // load nama yang disimpan dengan kunci "Nama" tadi
   // lalu ditampilkan pada tag span yang memiliki id SimpanNama
   var LoadNama = document.getElementById("SimpanNama");
   LoadNama.innerText = RoamingSettings.values["Nama"];
}

Fungsi tersebut akan menampilkan nama yang kita masukkan tadi, lalu menyimpannya ke dalam Roaming Settings dengan kunci "Nama".

4. Agar dapat menggunakan fungsi tersebut, kita harus register terlebih dahulu fungsi tersebut dengan Event Listener. Buka file default.js, maka akan terdapat kode seperti ini
// For an introduction to the Blank template, see the following documentation:
// http://go.microsoft.com/fwlink/?LinkId=232509
(function () {
    "use strict";
 
    var app = WinJS.Application;
    var activation = Windows.ApplicationModel.Activation;
 
    app.onactivated = function (args) {
        if (args.detail.kind === activation.ActivationKind.launch) {
            if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
                // TODO: This application has been newly launched. Initialize
                // your application here.
            } else {
                // TODO: This application has been reactivated from suspension.
                // Restore application state here.
            }
            args.setPromise(WinJS.UI.processAll());
        }
    };
 
    app.oncheckpoint = function (args) {
        // TODO: This application is about to be suspended. Save any state
        // that needs to persist across suspensions here. You might use the
        // WinJS.Application.sessionState object, which is automatically
        // saved and restored across suspension. If you need to complete an
        // asynchronous operation before your application is suspended, call
        // args.setPromise().
    };
 
    app.start();
})();

Perhatikan kode yang di-highlight warna kuning, kode tersebut akan memproses semua yang diinisialisasi ketika aplikasi baru dijalankan. Edit baris kode tersebut menjadi seperti ini
args.setPromise(WinJS.UI.processAll().then(function completed() {
   // TODO       
}));

Setelah semuanya diproses, aplikasi akan mengeksekusi kode yang berada pada TODO. Copy kode berikut ini pada TODO
// register event click pada tombol dengan id TampilNama
// tombol click tersebut akan menjalankan fungsi ShowAndSave
var TombolTampil = document.getElementById("TampilNama");
TombolTampil.addEventListener("click", ShowAndSave, false);
 
// akses roaming settings
var AppData = Windows.Storage.ApplicationData.current;
var RoamingSettings = AppData.roamingSettings;
 
// load data yang disimpan dengan kunci "Nama" tadi
// lalu tampilkan pada tag span yg ber-id SimpanNama
var LoadNama = document.getElementById("SimpanNama");
if (RoamingSettings.values["Nama"])
   LoadNama.innerText = RoamingSettings.values["Nama"];
else // jika tidak ada nama yang disimpan, tampilkan kosong
   LoadNama.innerText = ""; 

5. Jalankan aplikasi tersebut dengan CTRL + F5. Masukkan nama kamu, lalu klik tombol Click untuk menampilkan dan menyimpan nama. Kemudian tutup aplikasinya, lalu jalankan lagi dengan CTRL + F5 dan lihat.. nama yang kamu masukkan tadi masih tersimpan.

Menghapus nama yang disimpan

6. Untuk menghapus nama yang disimpan, kita akan membuat suatu fungsi untuk menghapus nama yang disimpan tersebut lalu di-register pada tombol "Hapus Nama". Buka lagi default.html, lalu copy kode berikut di bawah function ShowAndSave() tadi
function HapusNama()
{
   // akses roaming settings
   var AppData = Windows.Storage.ApplicationData.current;
   var RoamingSettings = AppData.roamingSettings;
 
   // hapus nilai yang disimpan dengan kunci "Nama" tadi
   RoamingSettings.values.remove("Nama");
 
   // tampilkan kosong
   var LoadNama = document.getElementById("SimpanNama");
   LoadNama.innerText = "";
 }

Lalu buka default.js, pada WinJS.UI.processAll().then() tadi tambahkan kode berikut untuk register fungsi HapusNama pada tombol Hapus
// register event hapus pada tombol dengan id Hapus
// tombol hapus nama tersebut akan menjalankan fungsi HapusNama
var TombolHapus = document.getElementById("Hapus");
TombolHapus.addEventListener("click", HapusNama, false);

7. Jalankan aplikasi dengan CTRL + F5, lalu klik tombol Hapus Nama. Kemudian tutup aplikasinya, lalu jalankan lagi dan lihat.. nama yang disimpan tadi telah terhapus.


Source Code percobaan Roaming Settings

default.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>WinControl</title>
 
    <!-- WinJS references -->
    <link href="//Microsoft.WinJS.2.0/css/ui-dark.css" rel="stylesheet" />
    <script src="//Microsoft.WinJS.2.0/js/base.js"></script>
    <script src="//Microsoft.WinJS.2.0/js/ui.js"></script>
 
    <!-- WinControl references -->
    <link href="/css/default.css" rel="stylesheet" />
    <script src="/js/default.js"></script>
    <style>
        #container{
            margin32px;
        }
        label{
            displayblock;
        }
    </style>
    <script>
        function ShowAndSave()
        {
            // ambil nama yang dimasukkan pada textbox
            var TextboxInput = document.getElementById("InputNama").value;
 
            // tampilkan nama tadi pada tag span yang memiliki id OutputNama
            var OutputNama = document.getElementById("OutputNama");
            OutputNama.innerText = "Hello " + TextboxInput + ". Apa kabar?";
 
            // mengakses roaming settings
            var AppData = Windows.Storage.ApplicationData.current;
            var RoamingSettings = AppData.roamingSettings;
 
            // simpan nama yang dimasukkan tadi pada roaming settings dengan kunci "Nama"
            RoamingSettings.values["Nama"] = TextboxInput;
 
            // load nama yang disimpan dengan kunci "Nama" tadi
            // lalu ditampilkan pada tag span yang memiliki id SimpanNama
            var LoadNama = document.getElementById("SimpanNama");
            LoadNama.innerText = RoamingSettings.values["Nama"];
        }
 
        function HapusNama()
        {
            // akses roaming settings
            var AppData = Windows.Storage.ApplicationData.current;
            var RoamingSettings = AppData.roamingSettings;
 
            // hapus nilai yang disimpan dengan kunci "Nama" tadi
            RoamingSettings.values.remove("Nama");
 
            // tampilkan kosong
            var LoadNama = document.getElementById("SimpanNama");
            LoadNama.innerText = "";
        }
    </script>
</head>
<body>
    <div id="container">
        <h1>Demo menggunakan Roaming Settings - <a href="http://arliansyahazhary.blogspot.com">arliansyahazhary.blogspot.com</a></h1><br/>
        <h3><label for="InputNama">Masukkan namamu disini:</label></h3>
        <input type="text" id="InputNama" />
        <button id="TampilNama">Click</button><button id="Hapus">Hapus Nama</button><br/>
        <h2>Nama yang disimpan: <span id="SimpanNama"></span></h2><br/>
        <h2>Output: <span id="OutputNama"></span></h2><br/>
    </div>
</body>
</html>

default.js
// For an introduction to the Blank template, see the following documentation:
// http://go.microsoft.com/fwlink/?LinkId=232509
(function () {
    "use strict";
 
    var app = WinJS.Application;
    var activation = Windows.ApplicationModel.Activation;
 
    app.onactivated = function (args) {
        if (args.detail.kind === activation.ActivationKind.launch) {
            if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
                // TODO: This application has been newly launched. Initialize
                // your application here.
            } else {
                // TODO: This application has been reactivated from suspension.
                // Restore application state here.
            }
            args.setPromise(WinJS.UI.processAll().then(function completed() {
                // register event click pada tombol dengan id TampilNama
                // tombol click tersebut akan menjalankan fungsi ShowAndSave
                var TombolTampil = document.getElementById("TampilNama");
                TombolTampil.addEventListener("click", ShowAndSave, false);
 
                // akses roaming settings
                var AppData = Windows.Storage.ApplicationData.current;
                var RoamingSettings = AppData.roamingSettings;
 
                // load data yang disimpan dengan kunci "Nama" tadi
                // lalu tampilkan pada tag span yg ber-id SimpanNama
                var LoadNama = document.getElementById("SimpanNama");
                if (RoamingSettings.values["Nama"])
                    LoadNama.innerText = RoamingSettings.values["Nama"];
                else // jika tidak ada nama yang disimpan, tampilkan kosong
                    LoadNama.innerText = "";
 
                // register event hapus pada tombol dengan id Hapus
                // tombol hapus nama tersebut akan menjalankan fungsi HapusNama
                var TombolHapus = document.getElementById("Hapus");
                TombolHapus.addEventListener("click", HapusNama, false);
            }));
        }
    };
 
    app.oncheckpoint = function (args) {
        // TODO: This application is about to be suspended. Save any state
        // that needs to persist across suspensions here. You might use the
        // WinJS.Application.sessionState object, which is automatically
        // saved and restored across suspension. If you need to complete an
        // asynchronous operation before your application is suspended, call
        // args.setPromise().
    };
 
    app.start();
})();

Reference: MSDN Manage App Lifecycle and State (HTML) - Windows App Development