Module 01 Halo Dunia dan Administrasi

Python

Python adalah bahasa pemrograman tingkat tinggi (high-level) yang ditujukan untuk pemrograman umum (general-purpose) dan menggunakan interpreter dalam eksekusinya. Bahasa ini memiliki filosofi yang menekankan pada kemudahan untuk membaca kode program dan memudahkan penggunanya penggunanya membuat kode program yang lebih singkat jika dibuat dengan menggunakan Java atau C++. Python mendukung paradigma pemrograman berorientasi objek, prosedural, dan fungsional. Selain itu, Python menggunakan sistem tipe dinamis, manajemen memori otomatis, dan memiliki pustaka standar yang relatif lengkap. Versi intepreter Python tersedia untuk berbagai platform sistem operasi.

Django

Django adalah kerangka kerja aplikasi web yang ditulis dengan menggunakan bahasa pemrograman Python. Django bersifat open source dan menggunakan pola arsitektural Model View Controller. Framework ini dikelola oleh Django Software Foundation (DSF), suatu organisasi independen nonprofit. Django sendiri dibuat dengan tujuan menyederhanakan pembuatan aplikasi web yang menggunakan database sebagai dasar pembangunannya (database-driven). Prinsip-prinsip yang ditekankan antara lain, reusability dan pluggability, rapid development, dan DRY (don’t repeat yourself). Selain itu, Django juga menyediakan fasilitas CRUD (Create, read, update, delete) yang dapat secara dinamis diperbaharui menggunakan introspection.

Hallo Dunia

Sebagai langkah awal untuk mempelajari Rekayasa Web, kita akan membuat aplikasi sederhana Hallo Dunia.

Prasyarat

  1. Pastikan Python 2.7 telah terpasang dan berjalan dengan baik.
  2. Koneksi internet.

Pasang Django

Lakukan langkah-langkah berikut untuk instalasi Django.

>> mkdir Module01    # membuat direktori Module01

>> cd Module01    # pindah ke dalam direktori Module01

>> virtualenv        

Perintah di atas bertujuan membuat virtual environment agar jika terjadi perubahan tidak mengganggu environtment secara keseluruhan.

Lakukan perintah berikut untuk mendownload dan menginstal Python dari internet.

>> pip install django

Perintah berikut akan mengunci versi agar tidak dapat berubah.

>> pip freeze

Membuat Project Django “Hello World”

Perintah berikut akan membuat project Django.

>> django-admin.pystart project helloworld

Kemudian pindah ke direktori helloworld

>> cd helloworld

Jalankan server agak project bisa diakses melalui web browser

>> python manage.py runserver

 

Gunakan web browser untuk mengakses http://127.0.0.1: 8000/.

Administrasi

Migrasi

Django memberikan fasilitas migrasi. Migrasi bertujuan mensinkronkan model yang terdapat dalam project/applikasi ke database.

>> python manage.py migrate

Membuat Superuser

Secara default, Django sudah memberikan fasilitas manajemen user. Untuk itu, perlu dibuat superuser untuk tujuan administrasi. Lakukan perintah berikut untuk membuat superuser.

>> python manage.py createsuperuser

>> Username:

>> Email:

>> Password:

Jalankan server agak project bisa diakses melalui web browser.

>> python manage.py runserver

 

Gunakan web browser untuk mengakses http://127.0.0.1: 8000/admin dan login dengan menggunakan user sesuai dengan username dan password yang baru saja Anda buat.

Aplikasi

Satu project dapat memiliki lebih dari satu aplikasi. Aplikasi dapat dibuat dengan menggunakan perintah berikut.

>> python manage.py startapp myapplication

 

 

 

 

 


 


T-SQL: Konversi Angka ke Terbilang

Berikut ini adalah fungsi query Microsoft SQL Server untuk mengubah angka menjadi terbilang. Misalnya, angka “999.95” akan dikonversi menjadi “Sembilan ratus sembilan puluh sembilan koma sembilan lima”. Cara penggunaannya sebagai berikut:

SELECT dbo.Terbilang(999.95)

Fungsi Terbilang tersebut menerima input NUMERIC(19,6) dan mengembalikan nilai bertipe NVARCHAR(MAX). Berikut adalah kode lengkapnya:

CREATE FUNCTION [dbo].[Terbilang](@number NUMERIC(19,6))

RETURNS NVARCHAR(MAX)

AS

BEGIN

    DECLARE 

    @position INT, 

    @length INT, 

    @words NVARCHAR(MAX), 

    @ends NVARCHAR(MAX), 

    @numStr NVARCHAR(MAX), 

    @foreStr NVARCHAR(MAX), 

    @backStr NVARCHAR(MAX), 

    @char NVARCHAR(1),

    @charafter NVARCHAR(1),

    @charprev NVARCHAR(1),

    @charprev2 NVARCHAR(1)

 

SELECT @numStr = STR(@number, 19, 2)

SELECT @numStr = LTRIM(RTRIM(@numStr))

SELECT @foreStr = SUBSTRING(@numStr, 0, (SELECT CHARINDEX('.', @numStr, 1)))

SELECT @backStr = SUBSTRING(@numStr, (SELECT CHARINDEX('.', @numStr, 1)+1), LEN(@numStr))

SELECT @length = LEN(@foreStr)

SELECT @position = @length

SELECT @words =''

 

    --Memproses "angka di depan koma" 

    WHILE(@position > 0)

    BEGIN    

            

            SELECT @char = SUBSTRING(@numStr, @length+1 - @position, 1)

            SELECT @charafter = SUBSTRING(@numStr, @length+2 - @position, 1)

            SELECT @charprev = SUBSTRING(@numStr, @length - @position, 1)

            SELECT @charprev2 = SUBSTRING(@numStr, @length - @position - 1, 1)

            

            IF ((@char = '1') AND ((SELECT(@position-1)/3.0) = 1) AND 

                (@charafter != '' ) AND ((SELECT CAST(@charprev as INT)) = 0)) 

                SELECT @words = @words + 'se' 

            ELSE

            IF ((@char = '1') AND ((SELECT @position % 3) = 1)) 

                SELECT @words = @words + 'satu ' 

            ELSE

            IF ((@char = '1') AND ((SELECT CAST(@charafter as INT)) > 1) AND 

                ((SELECT @position % 3) = 2))

                BEGIN

                    IF (@charafter = '1') SELECT @words = @words + 'se' ELSE

                    IF (@charafter = '2') SELECT @words = @words + 'dua ' ELSE

                    IF (@charafter = '3') SELECT @words = @words + 'tiga ' ELSE    

                    IF (@charafter = '4') SELECT @words = @words + 'empat ' ELSE    

                    IF (@charafter = '5') SELECT @words = @words + 'lima ' ELSE    

                    IF (@charafter = '6') SELECT @words = @words + 'enam ' ELSE    

                    IF (@charafter = '7') SELECT @words = @words + 'tujuh ' ELSE    

                    IF (@charafter = '8') SELECT @words = @words + 'delapan ' ELSE    

                    IF (@charafter = '9') SELECT @words = @words + 'sembilan '

                END

            ELSE

            IF (@char = '1') SELECT @words = @words + 'se' ELSE

            IF (@char = '2') SELECT @words = @words + 'dua ' ELSE

            IF (@char = '3') SELECT @words = @words + 'tiga ' ELSE    

            IF (@char = '4') SELECT @words = @words + 'empat ' ELSE    

            IF (@char = '5') SELECT @words = @words + 'lima ' ELSE    

            IF (@char = '6') SELECT @words = @words + 'enam ' ELSE    

            IF (@char = '7') SELECT @words = @words + 'tujuh ' ELSE    

            IF (@char = '8') SELECT @words = @words + 'delapan ' ELSE    

            IF (@char = '9') SELECT @words = @words + 'sembilan ' ELSE

            IF ((@char = '0') AND ((SELECT CAST(@charprev as INT)) > 1) AND ((SELECT @position % 3) = 1))

                SELECT @words = @words 

            ELSE

            IF ((@char = '0') AND ((SELECT @charprev) = '0') AND ((SELECT CAST(@charprev2 as INT)) > 0) AND ((SELECT @position % 3) = 1))

                SELECT @words = @words 

            ELSE

            IF (@char = '0') 

            BEGIN

                SELECT @position = @position - 1

                CONTINUE

            END     

            

            IF ((SELECT @position % 3) = 0) SELECT @words = @words + 'ratus ' ELSE    

            IF (((SELECT @position % 3) = 2) AND ((SELECT CAST(@char as INT)) > 1)) 

                SELECT @words = @words + 'puluh ' 

            ELSE    

            IF (((SELECT @position % 3) = 2) AND ((SELECT CAST(@char as INT)) = 1)

                AND ((SELECT CAST(@charafter as INT)) > 0))

            BEGIN 

                SELECT @words = @words + 'belas '

                SELECT @position = @position - 1

            END

            ELSE

            IF (((SELECT @position % 3) = 2) AND ((SELECT CAST(@char as INT)) = 1)

                AND ((SELECT CAST(@charafter as INT)) = 0))

            BEGIN 

                SELECT @words = @words + 'puluh '

                SELECT @position = @position - 1

            END

            

            IF ((SELECT (@position-1)/3.0) = 1) SELECT @words = @words +'ribu ' ELSE

            IF ((SELECT (@position-1)/3.0) = 2) SELECT @words = @words +'juta ' ELSE

            IF ((SELECT (@position-1)/3.0) = 3) SELECT @words = @words +'milyar ' ELSE

            IF ((SELECT (@position-1)/3.0) = 4) SELECT @words = @words +'triliun '

 

        SELECT @position = @position - 1

    END

    

    --Memproses "koma" dan "angka di belakang koma"

    IF((SELECT CAST(@backStr AS INT)) > 0)

    BEGIN

        --Menambahkan "koma" pada terbilang

        

        SELECT @words = @words + 'koma '

        

        --Menambahkan "Angka di belakang koma" pada terbilang

    

        SELECT @length = LEN(@backStr)

        SELECT @position = @length

        

        WHILE( @position > 0)

        BEGIN

        

            SELECT @char = SUBSTRING(@backStr, @length+1 - @position, 1)

            SELECT @words = @words +

            (CASE @char

                WHEN '0'THEN 'nol '

                WHEN '1'THEN 'satu '

                WHEN '2'THEN 'dua '

                WHEN '3'THEN 'tiga '

                WHEN '4'THEN 'empat '

                WHEN '5'THEN 'lima '

                WHEN '6'THEN 'enam '

                WHEN '7'THEN 'tujuh '

                WHEN '8'THEN 'delapan '

                WHEN '9'THEN 'sembilan '

                ELSE ''

             END

            )    

            SELECT @position = @position - 1

        END 

    END

    

    SELECT @words = LTRIM(RTRIM(@words))

    

    -- Huruf pertama huruf besar

    IF LEN(@words) > 0 

    BEGIN

        SET @words = UPPER(left(@words,1)) + RIGHT(@words, LEN(@words)-1)

    END

 

    /* FINAL RETURN */

RETURN (SELECT @words)

END


Connect Your Java Application to SAP B1 HANA and Post Journal Entry using JCO

After several hours looking for a solution of how to connect a java program to SAP Business One HANA, I finally found that SAP B1 HANA provides a wrapper for B1DI library, called JCO (Java Connector). This is an example of how do I connect our java program using JCO to SAP B1 HANA and then post a journal entry document. Hope, this several lines of codes can help you connect your java application to SAP B1 HANA.

/*

 * To change this template, choose Tools | Templates

 * and open the template in the editor.

 */

package hanapostingje;

 

import com.sap.smb.sbo.api.*;

 

/**

 *

 * @author Alfa

 */

public class Application {

// company interface

    public ICompany company;

 

    /**

     * @param args the command line arguments

     */

    public static void main(String[] args) {

// TODO code application logic here

        Application application = new Application();

        application.connect();

    }

 

    /**

     * Create connection and initialize company instance

     *     

* @return 0 if success, -1 if fail

     */

    public int connect() {

        int rc = 0;

        try {

            System.out.println("Connecting to SAP ...");

            company = SBOCOMUtil.newCompany();

            company.setServer("hanaserver:30015");

            company.setCompanyDB("SBODEMOAU");

            company.setUserName("manager");

            company.setPassword("1234");

            company.setDbServerType(SBOCOMConstants.BoDataServerTypes_dst_HANADB);

            company.setUseTrusted(false);

            company.setLanguage(SBOCOMConstants.BoSuppLangs_ln_English);

            company.setDbUserName("SYSTEM");

            company.setDbPassword("MyPassword");

            company.setLicenseServer("hanaserver:40000");

            rc = company.connect();

            if (rc == 0) {

                System.out.println("Connected!");

                this.postJournalEntry();

                this.freeConnection();

            } else {

                SBOErrorMessage errMsg = company.getLastError();

                System.out.println(

                        "Cannot connect to database server: "

                        + errMsg.getErrorMessage()

                        + " "

                        + errMsg.getErrorCode());

            }

        } catch (Exception e) {

            e.printStackTrace();

            return -1;

        }

        return rc;

    }

 

    /**

     * Disconnect application from database and SAP

     */

    public void freeConnection() {

        company.disconnect();

        System.out.println("Application disconnected successfully");

    }

 

    /**

     * Post journal entry to SAP

     */

    public void postJournalEntry() {

        try {

            System.out.println("Posting journal entry ...");

            int retVal = 0;

            IJournalEntries je = SBOCOMUtil.newJournalEntries(company);

            IJournalEntries_Lines jeLines = je.getLines();

            jeLines.setAccountCode("110001");

            jeLines.setDebit(100.0);

            jeLines.add();

            jeLines.setAccountCode("110002");

            jeLines.setCredit(100.0);

            jeLines.add();

            retVal = je.add();

            if (retVal != 0) {

                System.out.println("Posting journal entry failed");

                throw new Exception(company.getLastErrorCode() + " " + company.getLastErrorDescription());

            } else {

                System.out.println("Journal entry posted successfully");

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

To utilize the wrapper, you need to include sboapi.jar and sborwrapper.jar into your project library—I was using Netbeans to manage my project. Both of them are located in “C:\Program Files (x86)\SAP\SAP Business One DI API\JCO\LIB” and were installed in your client PC when you installed SAP B1 HANA client.


SAP HANA: Get the First Date and the Last Date of Month from a Given Date

To get the first date of month from a given date, you can run this command. From the example, you can replace the ‘2013-02-28’ date by your own date, or you can use variable when you want to use it inside a procedure.

Code below is code that get the first date of month from a given date. It works by subtracting the given date by the day value of the given date—obtained by using function EXTRACT(DAY FROM [given date]). This will return last month’s last date. So, to get the first date of then month. You need to add 1 to the the day value of the given date.

--First date of month from a given date

SELECT ADD_DAYS('2013-02-28',-EXTRACT(DAY FROM '2013-02-28') + 1) FROM DUMMY; 

The next code is to get the last date of the month. Once you got the first date, you can add 1 month so the date will be the first date of next month and then subtract it by 1 to get the date one day before next month first date which is equal to the last date of given date’s month.

--Last date of month from a given date

SELECT ADD_DAYS(ADD_MONTHS(ADD_DAYS('2013-02-28',-EXTRACT(DAY FROM '2013-02-28') + 1),1),-1) FROM DUMMY; 

 


Meng-Query Data dari File Excel

 

SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=[lokasi dan nama file]', 'SELECT * FROM [Namasheet$]')

 

SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=C:\TEMP\FAS.xls', 'SELECT * FROM [Sheet1$]')


Mengirim dan Menerima SMS dengan Android

Android menyertakan kelas SMS Manager yang dapat digunakan untuk mengirim dan menerima SMS.

 

  1: package kalbis.mobile.communication;
  2:
  3: import android.os.Bundle;
  4: import android.app.Activity;
  5: import android.app.PendingIntent;
  6: import android.content.BroadcastReceiver;
  7: import android.content.Context;
  8: import android.content.Intent;
  9: import android.content.IntentFilter;
 10: import android.telephony.gsm.SmsManager;
 11: import android.view.Menu;
 12: import android.view.View;
 13: import android.view.View.OnClickListener;
 14: import android.widget.Button;
 15: import android.widget.EditText;
 16: import android.widget.TextView;
 17: import android.widget.Toast;
 18:
 19: public class MainActivity extends Activity {
 20:
 21: 	Button btnSendBySMSManager;
 22: 	Button btnSendByIntent;
 23: 	EditText edtPhoneNumber;
 24: 	EditText edtSendMessage;
 25: 	TextView txtReceivedMessage;
 26:
 27: 	IntentFilter intentFilter;
 28:
 29: 	private BroadcastReceiver intentReceiver = new BroadcastReceiver() {
 30: 		@Override
 31: 		public void onReceive(Context context, Intent intent) {
 32: 			// ---display the SMS received in the TextView---
 33: 			txtReceivedMessage = (TextView) findViewById(R.id.textView3);
 34: 			txtReceivedMessage.setText(intent.getExtras().getString("SMS"));
 35: 		}
 36: 	};
 37:
 38: 	@Override
 39: 	protected void onCreate(Bundle savedInstanceState) {
 40: 		super.onCreate(savedInstanceState);
 41: 		setContentView(R.layout.activity_main);
 42:
 43: 		// ---intent to filter for SMS messages received---
 44: 		intentFilter = new IntentFilter();
 45: 		intentFilter.addAction("SMS_RECEIVED_ACTION");
 46:
 47: 		// ---register the receiver---
 48: 		 registerReceiver(intentReceiver, intentFilter);
 49:
 50: 		btnSendBySMSManager = (Button) findViewById(R.id.button1);
 51: 		btnSendByIntent = (Button) findViewById(R.id.button2);
 52: 		edtPhoneNumber = (EditText) findViewById(R.id.editText1);
 53: 		edtSendMessage = (EditText) findViewById(R.id.editText2);
 54:
 55: 		btnSendBySMSManager.setOnClickListener(new OnClickListener() {
 56: 			@Override
 57: 			public void onClick(View arg0) {
 58: 				String phoneNumber = edtPhoneNumber.getText().toString();
 59: 				String message = edtSendMessage.getText().toString();
 60: 				sendSMS(phoneNumber, message);
 61: 			}
 62: 		});
 63:
 64: 		btnSendByIntent.setOnClickListener(new OnClickListener() {
 65:
 66: 			@Override
 67: 			public void onClick(View v) {
 68: 				Intent i = new Intent(android.content.Intent.ACTION_VIEW);
 69: 				i.putExtra("address", edtPhoneNumber.getText().toString());
 70: 				i.putExtra("sms_body", edtSendMessage.getText().toString());
 71: 				i.setType("vnd.android-dir/mms-sms");
 72: 				startActivity(i);
 73: 			}
 74: 		});
 75: 	}
 76:
 77: 	@Override
 78: 	protected void onResume() {
 79: 		// ---register the receiver---
 80: //		registerReceiver(intentReceiver, intentFilter);
 81: 		super.onResume();
 82: 	}
 83:
 84: 	@Override
 85: 	protected void onPause() {
 86: 		// ---unregister the receiver---
 87: 		// unregisterReceiver(intentReceiver);
 88: 		super.onPause();
 89: 	}
 90:
 91: 	@Override
 92: 	protected void onDestroy() {
 93: 		// ---unregister the receiver---
 94: 		unregisterReceiver(intentReceiver);
 95: 		super.onDestroy();
 96: 	}
 97:
 98: 	@SuppressWarnings("deprecation")
 99: 	// ---sends an SMS message to another device---
100: 	private void sendSMS(String phoneNumber, String message) {
101: 		String SENT = "SMS_SENT";
102: 		String DELIVERED = "SMS_DELIVERED";
103:
104: 		PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(
105: 				SENT), 0);
106:
107: 		PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
108: 				new Intent(DELIVERED), 0);
109:
110: 		// ---when the SMS has been sent---
111: 		registerReceiver(new BroadcastReceiver() {
112: 			@Override
113: 			public void onReceive(Context arg0, Intent arg1) {
114: 				switch (getResultCode()) {
115: 				case Activity.RESULT_OK:
116: 					Toast.makeText(getBaseContext(), "SMS sent",
117: 							Toast.LENGTH_SHORT).show();
118: 					break;
119: 				case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
120: 					Toast.makeText(getBaseContext(), "Generic failure",
121: 							Toast.LENGTH_SHORT).show();
122: 					break;
123: 				case SmsManager.RESULT_ERROR_NO_SERVICE:
124: 					Toast.makeText(getBaseContext(), "No service",
125: 							Toast.LENGTH_SHORT).show();
126: 					break;
127: 				case SmsManager.RESULT_ERROR_NULL_PDU:
128: 					Toast.makeText(getBaseContext(), "Null PDU",
129: 							Toast.LENGTH_SHORT).show();
130: 					break;
131: 				case SmsManager.RESULT_ERROR_RADIO_OFF:
132: 					Toast.makeText(getBaseContext(), "Radio off",
133: 							Toast.LENGTH_SHORT).show();
134: 					break;
135: 				}
136: 			}
137: 		}, new IntentFilter(SENT));
138:
139: 		// ---when the SMS has been delivered---
140: 		registerReceiver(new BroadcastReceiver() {
141: 			@Override
142: 			public void onReceive(Context arg0, Intent arg1) {
143: 				switch (getResultCode()) {
144: 				case Activity.RESULT_OK:
145: 					Toast.makeText(getBaseContext(), "SMS delivered",
146: 							Toast.LENGTH_SHORT).show();
147: 					break;
148: 				case Activity.RESULT_CANCELED:
149: 					Toast.makeText(getBaseContext(), "SMS not delivered",
150: 							Toast.LENGTH_SHORT).show();
151: 					break;
152: 				}
153: 			}
154: 		}, new IntentFilter(DELIVERED));
155:
156: 		SmsManager sms = SmsManager.getDefault();
157: 		sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
158: 	}
159:
160: 	@Override
161: 	public boolean onCreateOptionsMenu(Menu menu) {
162: 		// Inflate the menu; this adds items to the action bar if it is present.
163: 		getMenuInflater().inflate(R.menu.activity_main, menu);
164: 		return true;
165: 	}
166:
167: }
168:

Menuju Kerangka Kerja Green IT: Green IT dari Empat Perspektif

Draft Makalah SEMINAR NASIONAL TEKNOIN 2010 “Pengembangan Teknologi Berbasis Green Technology”, Sabtu, 11 Desember 2010. Versi pdf dapat diunduh di sini Draft Green IT Framework.

Alfa Ryano Yohannis
PT Sterling Tulus Cemerlang
http://www.sterling-team.com
alfa.ryano@gmail.com

Abstrak

Dilatarbelakangi oleh kebutuhan global akan pentingnya pemakaian teknologi yang ramah lingkungan, maka bidang teknologi informasi mempromosikan suatu bidang yang disebut Green IT. Melalui kajian literatur, makalah ini mengajukan suatu kerangka kerja (framework) Green IT yang memandang Green IT dari 4 perspektif, yaitu Dimensi Kerja, Tataran Area Kerja, Metode, dan Aktor. Setiap tindakan praktis Green IT dapat bekerja di berbagai tataran kerja dengan metode yang berbeda-beda untuk mempengaruhi nilai dari beragam dimensi kerja. Diharapkan kerangka kerja awal ini dapat digunakan sebagai panduan dalam mewujudkan Green IT yang utuh.

Kata Kunci: Green IT, kerangka kerja, metode, tataran area kerja, dimensi kerja, aktor, perspektif

Pendahuluan

Seiring dengan tumbuhnya tekanan untuk melakukan gerakan Hijau dan tuntutan bagi perusahaan untuk lebih menghijaukan bisnisnya, permintaan teknologi informasi dan komunisasi (ICT) yang ramah lingkungan dan mendukung gerakan Hijau juga semakin tinggi. ICT dianggap dapat memberikan kontribusi positif karena dapat meningkatkan efesiensi dan efektivitas kerja perusahaan, proses produksi, dan layanan masyarakat. Walaupun demikian, ICT juga berkontribusi besar pagi pengerusakan lingkungan. Limbah dari proses produksi produk ICT dan produk ICT yang tidak digunakan lagi menjadi racun dan sampah bagi lingkungan. Atas dasar ini, atas dasar ini Green IT lahir sebagai suatu bidang studi dan terapan yang mencoba mengurangi atau menghilangkan dampak negatif ICT terhadap lingkungan.Tidak terbatas pada lingkup sendiri, Green IT juga diharapkan dapat berkontribusi bagi penghijauan bidang-bidang lainnya.

Read the rest of this entry »