Archive

Archive for the ‘World Of ICT’ Category

Review Daihatsu Ayla X Elegant produksi 2014 akhir

December 16th, 2014 No comments

Akhir tahun ini berkesempatan meminang mobil LCGC besutan Daihats* type Ayla X Elegant tahun rakitan 2014 akhir , tipe ini adalah varian tertinggi yang diluncurkan Daihats* untuk seri LCGC, Interior Astra Daihatu Ayla X Elegant dilengkapi dengan Center Console Box dan Wood Interior Panel, untuk aksesoris mobil ini sudah dilengkapi  Elegant Front Aero Kit, ‘X Elegant’ Sticker, Chrome Back Door, Extension Rear Reflector,  Elegant Rear Aero Kit, Chrome Muffler Cutter, Side Skirt.

Menurut penjelasan sales Daihats*, untuk seri X Elegant tahun 2014 Daihatsu membuat 2 varian, seri awal diproduksi diawal tahun 2014 sedangkan seri akhir diproduksi akhir 2014,  untuk tipe akhir ini rencananya akan dipasarkan awal tahun 2015 sudah dilengkapi dengan wiper belakangan dan keranjang (jaring dibagasi belakang) selebihnya sama persis baik mesin dan interiornya dengan produksi awal 2014.

Kita bahas dikit masalah harga :-)  ya , kebetulan dealer Daihats* yang saya datangi berlokasi di Hajimena (samping auto 2000 Hajimena) dipilih karena jaraknya tidak terlalu jauh dengan tempat saya kerja. Di TKP sales langsung memberikan penjelasan lengkap tentang fitur dan keunggulan berbagai jenis mobil produksi Daihats*, untuk type X Elegant manual transmission harga On The Road (OTR) dibandrol  Rp. 113.750.000 (price list Desember 2014), dengan cash back sebesar Rp. 5.000.000 plus bonus sarung jok, promo cash back ini hanya berlaku untuk akhir tahun saja untuk bulan lain biasanya hanya dikasih maksimum Rp. 3.000.000 (info sales). Setelah diskusi dengan istri, jadilah meminang mobil ini untuk digunakan sebagai kendaraan operasional dengan pertimbangan konsumsi BBM-nya yang irit.

Berlanjut dengan pengalaman berkendara, selama hampir 2 Minggu berinteraksi dengan mobil ini so far so good lah, ruangan kabin cukup lega menampung keluarga kecil saya, untuk bagasi juga masih OK  menaruh barang belanjaan istri meskipun dengan dimensinya tidak terlalu luas, yang saya suka saat berkendara adalah adanya LAMPU  Eco Drive Indikator (EDI)  terintegrasi dengan dashboard tachometer, berfungsi membantu pengemudi mengatur cara dan gaya berkendara agar penggunaan BBM bisa optimal. Lampu indikator akan menyala pertanda bahwa pengemudi telah mengemudi sesuai kondisi eco driving dan lampu indikator mati menunjukkan bahwa pengemudi tidak mengemudi sesuai kondisi eco driving.

Terakhir kita bahas konsumsi BBM apakah betul sesuai dengan iklan selama ini ??? ,  ujicoba konsumsi bahan bakar saya lakukan dengan metode Full to Full, setelah tanki bensin full speedometer saya set dalam mode TRIP kemudian direset ke titik 0, jarak tempuh harian berkendara saya biasanya diangka 40-50 Km dengan rute;  Rumah – kantor istri (enggal) – Raden Intan – Labuhan Ratu – Gedong Meneng – Hajimena – Unila – Hajimena – Enggal – Rumah,  kondisi medan perjalanan berupa jalanan yang cukup datar ada beberapa lokasi menanjak dan beberapa persimpangan dan lampu merah. Seperti yang ditunjukkan pada gambar di bawah, jarak tempuh sudah diangka 186.1 Km, tanki saya full-kan kembali dan membayar Rp. 105.000 dibagi Rp 8.500 ketemu angka 12.35 liter,  sehingga konsumsi BBM per Km-nya adalah 186.1/12.35 = 15.06 per Km , ok berarti untuk jalan dalam kota Bandar Lampung Ayla ini hanya mampu membukukan prestasi 1 Km = 15.06 ltr (premium) dengan rata-rata kecepatan diangka 30-40 Km/jam, not to bad ditengah kondisi BBM yang semakin mahal.

???????????????????????????????

???????????????????????????????That’s it demikian review singkat saya dengan tunggangan yang baru ini.

Categories: Blogosphere, World Of ICT Tags:

Tugas Probabilitas Statistik kelas Teknik Informatika Universitas Lampung

December 10th, 2014 No comments

Terlampir  adalah tugas mata kuliah Probabilitas dan Statistik counting vehicle/object kelas Teknik Informatika 2014, pada beberapa lokasi di Bandar Lampung, aplikasi berbasis OpenCV, BGS library, Visual Studio C++ 2010.

Tingkat akurasi penghitungan bervariasi, ada yang 100% ada yang hanya 50% , ada hanya 40 %,  tugas kelompok dengan error yang tinggi biasanya diakibatkan posisi background video tidak stationer, serta kondisi hujan deras, selain itu dipengaruhi juga object/vehicle yang bergerak terlihat “dempet” , selebihnya silahkan lihat video dibawah

1. SPBU Polinela Lampung

2. Depan RS Imanuel Bandar Lampung


Read more…

Security System: OpenCV with early alarm system using Visual C++ 2010

December 9th, 2014 No comments

Idenya adalah untuk membuat program security yang bisa mendeteksi pergerakan object di screen, apabila ada sesuatu yang melewati area tertentu maka alarm akan berbunyi, cuplikan program untuk memunculkan suara alarm adalah sebagai berikut;

#include <Windows.h>
#include <mmsystem.h>

int suara() {
 PlaySound(TEXT("alarm.wav"), NULL, SND_ALIAS | SND_APPLICATION);
 return 1;
}

Pastikan anda menambahkan item  winmm.lib pada projectProperties->linker->input->additional dependencies

i fiyatları, kış lastiği”>Kış lastiği fiyatlarıBağcılar elektrik?iGiyim bayilikAdıyamanen yakın elektrik?ifilmi full izleerkek kemer modellerioto ekspertizeba, e okulGiyim BayilikKış lastiği fiyatlarıBağcılar elektrik?iGiyim bayilikAdıyamanen yakın elektrik?ifilmi full izleerkek kemer modellerioto ekspertizeba, e okulGiyim Bayilik

Vehicle Detection, Tracking and Counting, Speed Measurement Using OpenCV and Visual Studio

August 28th, 2014 No comments

Nowaday video image processing technology growing fast. Especially on traffic surveillance we need to identify, tracking, counting, and measuring estimated speed of vehicle. Background Substraction (BS) algorithm can used for vehicle detection that already developed by Andrews Sobral (https://www.behance.net/gallery/4057777/Vehicle-Detection-Tracking-and-Counting), another way to do this is by using Haar Cascades Algorithm (please see document of Vehicle Detection with Haar Cascades section). For vehicle tracking we can use cvBlob library to find out centroid, track and ID of moving objects. On this project i will show you how to find vehicle speed by background subtraction using BGSLibrary.

flowchartBGS

Some Of Video Demonstration of This Project;

 

  t; title=”filmi full izle”>filmi full izleerkek kemer modellerioto ekspertizeba, e okulGiyim BayilikKış lastiği fiyatlarıBağcılar elektrik?iGiyim bayilikAdıyamanen yakın elektrik?ifilmi full izleerkek kemer modellerioto ekspertizeba, e okulGiyim Bayilik

IPutil for Monitoring High Performance Computing system

July 22nd, 2014 No comments

Hari ini tanggal 22 Juli 2014, bertepatan dengan penetapan rekapitulisasi total perolehan suara Capres  oleh KPU.  Saya berharap kepada Presiden terpilih agar menjalankan amanah kepemimpinan ini dengan sebaik-baiknya, semoga rakyat Indonesia semakin sejahtera dibawah kepemimpinan beliau kelak.

Biarlah KPU menyelesaikan tugasnya sampai tuntas 😀 , kali ini kita akan mengupas bagaimana caranya memonitor salah satu system High Performace Computing yang kami kelola yaitu Sistem Informasi Akademik (SIAKAD) Unila. Mengapa dan untuk apa dimonitor ?? tentu pertanyaan ini akan muncul dibenak pembaca, baiklah saya coba ulas sedikit bagaimana konsep proyek rekayasa perangkat lunak yang umumnya diimplementasikan oleh kebanyakan developer sistem informasi, sebagian besar dari mereka mengadopsi konsep Sistem Development Life Cycle (SDLC).

SDLC terdiri dari 6 Fase Siklus yang berkelanjutan yaitu;  Fase Planning, Fase Analysis, Fase Design, Fase Implementation, Fase Support.  Secara spesifik proses  Monitor System Performance dilakukan pada fase ke 6 (Support) setelah seluruh sistem dipastikan telah berjalan dengan baik dan sesuai dengan requirement yang ada. Measuring Performance sangat penting dilakukan untuk mengukur tingkat kehandalan/endurance suatu sistem terutama ketika dihadapkan dengan serangkaian beban kerja/load besar, dari hasil analisis selanjutnya akan dijadikan pertimbangan apakah sistem existing sudah stable atau perlu dilakukan scalling out, scalling up  untuk meningkatkan kinerja. Saya kira cukup sekian penjelasannya, kesimpulannya proses monitoring ini penting… titik !!! 😀

Ok Lets move to another point, kita punya sistem dengan resource komputasi tinggi,  kira kira aplikasi apa yang cocok digunakan untuk memonitor ?? , karena platform virtualization berbasis VMWare Enterprise sebagai backend aplikasi maka sebetulnya VCentre yang reliable melakukan tugas ini, namun berhubung kita tidak punya lisensinya makanya beralih ke skenario alternatif lainnya. Ahaa  Ai Ce… there is Simple Network Management Protocol (SNMP) technology yang dapat digenerate dengan aplikasi third party semacam Solarwind, PRTG, MRTG  dan sebangsanya, tapi menurut saya itu terlalu Main Streaammm sodaraa sodaraa  hehehe. Kita coba dengan “hard way” yaitu build from the scrath menggunakan Python programming.  hmmm….   Whatttt ?? Python maniiing Python maniiing  kagak bosen lu Ndrooooo 😀 ,  ya kagak lah bro…. namanya  juga belajar, ibarat kate pepateh “Lifelong learning is the ongoing, voluntary, and self-motivated”  jadi akan terus berproses gak pake bosen :-) .

Yap kita siapkan dulu alat dan bahan yang dibutuhkan, gak perlu ke warung, mini market, apalagi indo maret, cukup siapkan Python dengan library Matplotlib, Numpy, Scipy, Python Psutil, Python MySQL Library, MySQL database, dan yang terpenting adalah “self motifated” tadi. Jika sudah kira kira ini source code hasil experiment saya, silahkan anda compile sendiri;

  • Listing program capturing memory utilization
#!/usr/bin/python
#By-Gigih-F, iseng-iseng aja : 17-07-2014 13:38 WIB)
import time
import datetime
now = datetime.datetime.now()
jam= now.strftime("%Y-%m-%d %H:%M")
import MySQLdb
import os
try:
 import psutil
except ImportError:
 print "Cannot import psutil module - this is needed for this application.";
 print "Exiting..."
 sys.exit();
try:
 import re # Needed for regex
except ImportError:
 print "Cannot import re module - this is needed for this application.";
 print "Exiting..."
 sys.exit();
#
# Routine to add commas to a float string
#
def commify3(amount):
 amount = str(amount)
 amount = amount[::-1]
 amount = re.sub(r"(ddd)(?=d)(?!d*.)", r"1,", amount)
 return amount[::-1]
# end def commify3(amount):
# ===================
# Main Python section
# ===================
if __name__ == '__main__':
# memory usage:
 mem = psutil.virtual_memory();
 used = mem.total - mem.available;
 a1 = str(int(used / 1024 / 1024)) + "M";
 a2 = str(int(mem.total / 1024 / 1024)) + "M";
 a3 = commify3(a1) + "/" + commify3(a2);
 memtot = int(mem.total / 1024 / 1024);
 memavailable = int(mem.available / 1024 / 1024);
 memuse= memtot - memavailable
 mempercent = (mem.percent);
 muse1bufcache = int(mem.used / 1024 / 1024);
 memfree = int(mem.free / 1024 / 1024);
 memactive = int(mem.active / 1024 / 1024);
 meminactive = int(mem.inactive/ 1024 / 1024);
 membuffers = int(mem.buffers / 1024 / 1024);
 memcache = int(mem.cached / 1024 / 1024);
conn = MySQLdb.connect(host= "192.168.xxx.yyy",
 user="username",
 passwd="xxxyyy",
 db="siakad_monitor")
x = conn.cursor()
try:
 x.execute("""INSERT INTO memory VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)""", (now,memtot,memavailable,memuse,muse1bufcache,mempercent,memfree,mema
ctive,meminactive,membuffers,memcache,swaptot,swapused,swapfree,swappercent,swapin,swapout ))
 conn.commit()
except:
 conn.rollback()
# end if
  • Listing program plotting from database
##By-Gigih-F, iseng-iseng aja : 16-07-2014 13:52 WIB)
import matplotlib
matplotlib.use('Agg')
import Image
import MySQLdb as mdb
import sys
import matplotlib.pyplot as plt
import datetime
import shutil


now = datetime.datetime.now()
print now
#Inisialisasi ke Database
conn = mdb.connect('192.168.xxx.yyy', 'usernamemysql', 'xyzxyz', 'siakad_monitor');

with conn:
 cursor = conn.cursor ()
 cursor.execute ("SELECT memory.date,memory.memtot,memory.memavailable,memory.memuse,memory.muse1bufcache,memory.mempercent,memory.memfree,memory.memactive,memory.mem
inactive,memory.membuffers,memory.memcache FROM memory WHERE DATE (date) = DATE(NOW()) ")
 row = cursor.fetchall()
 print "RESULT:", row[0]
 date,memtot,memavailable,memuse,muse1bufcache,mempercent,memfree,memactive,meminactive,membuffers,memcache=zip(*row) #Fetching setiap row

def plot1():
 fig = matplotlib.pyplot.gcf()
 fig.set_size_inches(18.5,10.5)
 ax = plt.subplot(111)
 plt.plot(date,memuse,marker='+',linestyle='-',color='c',label='Utilisasi Memory Usage')
 plt.legend(loc=10)
 plt.ylabel('Memory Usage (MByte) ') #Label pada sumbu Y
 plt.xlabel('Waktu') #Label pada sumbu X
 plt.grid()
 plt.title(' Memory Usage SIAKAD tgl : [%s] (Credit to Python+MySQL)'%(now)) #Judul Grafik
 plt.savefig('/var/xxx/yyy/SIAKAD/siakadmemuse.png', dpi=100) #Simpan file dengan judul xxx.png
 plt.close()
def plot2():
 fig = matplotlib.pyplot.gcf()
 fig.set_size_inches(18.5,10.5)
 ax = plt.subplot(111)
 plt.plot(date,memavailable,marker='+',linestyle='-',color='c',label='Available Memory (MByte)')
 plt.legend(loc=10)
 plt.ylabel('Available Memory (MByte) ') #Label pada sumbu Y
 plt.xlabel('Waktu') #Label pada sumbu X
 plt.grid()
 plt.title(' Available Memory Server SIAKAD tgl : [%s] (Credit to Python+MySQL)'%(now)) #Judul Grafik
 plt.savefig('/var/xxx/yyy/SIAKAD/siakadmemavailable.png', dpi=100) #Simpan file dengan judul xxx.png
 plt.close()

def plot3():
 fig = matplotlib.pyplot.gcf()
 fig.set_size_inches(18.5,10.5)
 ax = plt.subplot(111)
 plt.plot(date,memuse,marker='+',linestyle='-',color='c',label='Memory Usage (MByte)')
 plt.legend(loc=10)
 plt.ylabel('Memory Usage (MByte) ') #Label pada sumbu Y
 plt.xlabel('Waktu') #Label pada sumbu X
 plt.grid()
 plt.title(' Memory Usage Server SIAKAD tgl : [%s] (Credit to Python+MySQL)'%(now)) #Judul Grafik
 plt.savefig('/var/xxx/yyy/SIAKAD/siakadmemuse.png', dpi=100) #Simpan file dengan judul xxx.png
 plt.close()

def plot4():
 fig = matplotlib.pyplot.gcf()
 fig.set_size_inches(18.5,10.5)
 ax = plt.subplot(111)
 plt.plot(date,muse1bufcache,marker='+',linestyle='-',color='c',label='Memory + Cache Usage (MByte)')
 plt.legend(loc=10)
 plt.ylabel('Memory + Cache Usage (MByte) ') #Label pada sumbu Y
 plt.xlabel('Waktu') #Label pada sumbu X
 plt.grid()
 plt.title(' Memory + Cache Usage Server SIAKAD tgl : [%s] (Credit to Python+MySQL)'%(now)) #Judul Grafik
 plt.savefig('/var/xxx/yyy/SIAKAD/siakadmuse1bufcache.png', dpi=100) #Simpan file dengan judul xxx.png
 plt.close()

def plot5():
 fig = matplotlib.pyplot.gcf()
 fig.set_size_inches(18.5,10.5)
 ax = plt.subplot(111)
 plt.plot(date,mempercent,marker='+',linestyle='-',color='c',label='Persentage Memory Utilization')
 plt.legend(loc=10)
 plt.ylabel('Percentage Memory Utilization') #Label pada sumbu Y
 plt.xlabel('Waktu') #Label pada sumbu X
 plt.grid()
 plt.title(' Persentage Memory Utilization: tgl : [%s] (Credit to Python+MySQL)'%(now)) #Judul Grafik
 plt.savefig('/var/xxx/yyy/SIAKAD/siakadmempercent.png', dpi=100) #Simpan file dengan judul xxx.png
 plt.close()


def plot6():
 fig = matplotlib.pyplot.gcf()
 fig.set_size_inches(18.5,10.5)
 ax = plt.subplot(111)
 plt.plot(date,memfree,marker='+',linestyle='-',color='c',label='Free Memory SIAKAD')
 plt.legend(loc=10)
 plt.ylabel('Free Memory (MByte) ') #Label pada sumbu Y
 plt.xlabel('Waktu') #Label pada sumbu X
 plt.grid()
 plt.title(' Free Memory SIAKAD tgl : [%s] (Credit to Python+MySQL)'%(now)) #Judul Grafik
 plt.savefig('/var/xxx/yyy/SIAKAD/siakadmemfree.png', dpi=100) #Simpan file dengan judul xxx.png
 plt.close()
def plot7():
 fig = matplotlib.pyplot.gcf()
 fig.set_size_inches(18.5,10.5)
 ax = plt.subplot(111)
 plt.plot(date,memactive,marker='+',linestyle='-',color='c',label='Memory Active (Mbyte)')
 plt.legend(loc=10)
 plt.ylabel('Memory Active (Mbyte) ') #Label pada sumbu Y
 plt.xlabel('Waktu') #Label pada sumbu X
 plt.grid()
 plt.title(' Memory Active tgl : [%s] (Credit to Python+MySQL)'%(now)) #Judul Grafik
 plt.savefig('/var/xxx/yyy/SIAKAD/siakadmemactive.png', dpi=100) #Simpan file dengan judul xxx.png
 plt.close()


def plot8():
 fig = matplotlib.pyplot.gcf()
 fig.set_size_inches(18.5,10.5)
 ax = plt.subplot(111)
 plt.plot(date,meminactive,marker='+',linestyle='-',color='c',label='Memory Inactive (MByte)')
 plt.legend(loc=10)
 plt.ylabel('Memory Inactive (MByte) ') #Label pada sumbu Y
 plt.xlabel('Waktu') #Label pada sumbu X
 plt.grid()
 plt.title(' Memory Inactive tgl : [%s] (Credit to Python+MySQL)'%(now)) #Judul Grafik
 plt.savefig('/var/xxx/yyy/SIAKAD/siakadmeminactive.png', dpi=100) #Simpan file dengan judul xxx.png
 plt.close()

def plot9():
 fig = matplotlib.pyplot.gcf()
 fig.set_size_inches(18.5,10.5)
 ax = plt.subplot(111)
 plt.plot(date,membuffers,marker='+',linestyle='-',color='c',label='Memory Buffer (MByte)')
 plt.legend(loc=10)
 plt.ylabel('Memory Buffer (MByte) ') #Label pada sumbu Y
 plt.xlabel('Waktu') #Label pada sumbu X
 plt.grid()
 plt.title(' Memory Buffer tgl : [%s] (Credit to Python+MySQL)'%(now)) #Judul Grafik
 plt.savefig('/var/xxx/yyy/SIAKAD/siakadmembuffers.png', dpi=100) #Simpan file dengan judul xxx.png
 plt.close()


def plot10():
 fig = matplotlib.pyplot.gcf()
 fig.set_size_inches(18.5,10.5)
 ax = plt.subplot(111)
 plt.plot(date,memcache,marker='+',linestyle='-',color='c',label='Memory Cache (Mbyte)')
 plt.legend(loc=10)
 plt.ylabel('Memory Cache (Mbyte) ') #Label pada sumbu Y
 plt.xlabel('Waktu') #Label pada sumbu X
 plt.grid()
 plt.title(' Memory Cache tgl : [%s] (Credit to Python+MySQL)'%(now)) #Judul Grafik
 plt.savefig('/var/xxx/yyy/SIAKAD/siakadmemcache.png', dpi=100) #Simpan file dengan judul xxx.png
 plt.close()

def plot11():
 fig = matplotlib.pyplot.gcf()
 fig.set_size_inches(18.5,10.5)
 ax = plt.subplot(111)
 plt.plot(date,memtot,marker='+',linestyle='-',color='c',label='Total Memory (MByte) ')
 plt.legend(loc=10)
 plt.ylabel('Memory Usage (MByte) ') #Label pada sumbu Y
 plt.xlabel('Waktu') #Label pada sumbu X
 plt.grid()
 plt.title(' Total Memory SIAKAD tgl : [%s] (Credit to Python+MySQL)'%(now)) #Judul Grafik
 plt.savefig('/var/xxx/yyy/SIAKAD/siakadmemory.png', dpi=100) #Simpan file dengan judul xxx.png
 plt.close()

plot1()
plot2()
plot3()
plot4()
plot5()
plot6()
plot7()
plot8()
plot9()
plot10()
plot11()

Kira kira hasil akhir plotting grafik load memorynya seperti berikut.

siakad

Thanks to Google, Python and Friends.

 

WebGIS using Google Map Api , XML, Mysql, JavaScript, PHP, HTML

April 17th, 2014 No comments

Saya akan kembali berbagi pengalaman kepada para pembaca blog yang Budiman,  mengenai pengalaman coding/ngoprek WebGIS berbasis Google MAP, case yang saya miliki kira kira seperti ini;

  • Saya memiliki sekumpulan data tentang pusat layanan kesehatan di Kota Bandar Lampung.
  • Data terdiri dari NamaLayanan, Telp, Alamat, Koordinat Latitude/Longitude, Foto Profil, Video Profil.
  • Saya ingin data yang saya miliki disimpan dalam database MySQL.
  • Saya ingin agar data MySQL tadi dapat digunakan juga secara terbuka oleh aplikasi lain via WebService dengan teknologi XML.
  • Saya ingin agar semua informasi terpetakan dengan baik pada sebuah portal website informatif.
  • Saya ingin agar ada icon gambar pembeda antara layanan rumah sakit dan klinik.
  • Saya ingin agar posisi letak object layanan kesehatan dapat diketahui secara detail pada Peta Digital Online.
  • Peta yang disajikan juga dapat memunculkan Foto/Gambar profil, serta Video Profil yang dapat ditayangkan langsung pada aplikasi.
  • Saya gak pengen pakai model programming yang ribet

Dari sekian banyak requirement yang sudah ada kita coba cari solusinya dengan memanfaatkan teknologi  Google Map Api , XML, Mysql, JavaScript, HTML.  Langsung saja saya bahas step by step bagaimana penyelesaiannya.

Pastikan bahwa Web Server anda sudah terinstall dengan baik, lengkap dengan Database MySQL yg akan digunakan sebagai tempat menyimpan data.

  • Buat Database baru sesuai dengan requirement yang ada (misal database webgis)
  • Buat Table baru pada database webgis
  • DROP TABLE IF EXISTS `fasilitas`;
    CREATE TABLE `fasilitas` (
     `id` int(11) NOT NULL AUTO_INCREMENT,
     `name` varchar(60) NOT NULL,
     `address` varchar(80) NOT NULL,
     `lat` float(10,6) NOT NULL,
     `lng` float(10,6) NOT NULL,
     `type` varchar(30) NOT NULL,
     `image` varchar(40) DEFAULT NULL,
     `telp` varchar(20) DEFAULT NULL,
     `fasilitas` varchar(100) DEFAULT NULL,
     `video` varchar(300) DEFAULT NULL,
     `web` varchar(200) DEFAULT NULL,
     PRIMARY KEY (`id`)
     ) ENGINE=MyISAM AUTO_INCREMENT=53 DEFAULT CHARSET=latin1;
  • Insert data ke dalam tabel yang sudah dibuat, contoh dibawah adalah 3 data yang akan di entri;
  • INSERT INTO `fasilitas` VALUES ('1', 'Balai Pengobatan Lanal Lampung, Kota Bandar Lampung, Lampung', 'Bandar Lampung', '-5.480050', '105.324883', 'klinik', 'http://webgis.unila.ac.id/img/klinik.jpg', '0721-xxx-yy', 'Ruang Klinik', 'http://www.youtube.com/embed/YT01kPaOBSA?autoplay=1', null);
    INSERT INTO `fasilitas` VALUES ('2', 'Bidan Irmayani, Kota Bandar Lampung, Lampung, IDN', 'Bandar Lampung', '-5.382550', '105.233597', 'klinik', 'http://webgis.unila.ac.id/img/klinik.jpg', '0721-xxx-yy', 'Ruang Klinik', 'http://www.youtube.com/embed/YT01kPaOBSA?autoplay=1', null);
    INSERT INTO `fasilitas` VALUES ('51', 'Uptd Balai Laboraorium Kesehatan, Kota Bandar Lampung, Lampu', 'Bandar Lampung', '-5.400960', '105.257889', 'rumahsakit', 'http://webgis.unila.ac.id/img/rs1.jpg', '0721-xxx-yy', 'Ruang Operasi Terpadu', 'http://www.youtube.com/embed/PSbvtjciAxY?autoplay=1', null);
  • Buat Driver PHP agar membaca database yang sudah dibuat tadi, dengan source code phpsqlajax_dbinfo.php  sbb;
  • <?php
    $username="root";
    $password="sukasukagueaja";
    $database="webgis";
    ?>
  • Buat program PHP phpsqlajax_genxml2.php , membaca data dari MySQL lalu mengkonversinya dalam format XML
  • <?php
    require("phpsqlajax_dbinfo.php");
    function parseToXML($htmlStr)
    {
    $xmlStr=str_replace('<','<',$htmlStr); $xmlStr=str_replace('-->','>',$xmlStr);
    $xmlStr=str_replace('"','"',$xmlStr);
    $xmlStr=str_replace("'",''',$xmlStr);
    $xmlStr=str_replace("&",'&',$xmlStr);
    return $xmlStr;
    }
    // Buka Koneksi ke Database MySQL
    $connection=mysql_connect ('localhost', $username, $password);
    if (!$connection) {
      die('Not connected : ' . mysql_error());
    }
    // Set Active MySQL
    $db_selected = mysql_select_db($database, $connection);
    if (!$db_selected) {
      die ('Can't use db : ' . mysql_error());
    }
    // Query memilih Table Fasilitas
    $query = "SELECT * FROM fasilitas WHERE 1";
    $result = mysql_query($query);
    if (!$result) {
      die('Invalid query: ' . mysql_error());
    }
    header("Content-type: text/xml");
    // Memulai membuat XML File Marker
    echo '';
    // Iterasi dari semua row yang ada pada MySQL, dan mencetaknya line per line
    while ($row = @mysql_fetch_assoc($result)){
      // Cetak XML
      echo '<marker ';="" echo="" 'name="' . parseToXML($row['name']) . '" 'address="' . parseToXML($row['address']) . '" 'lat="' . $row['lat'] . '" 'lng="' . $row['lng'] . '" 'type="' . $row['type'] . '" 'image="' . $row['image'] . '" 'telp="' . $row['telp'] . '" 'fasilitas="' . $row['fasilitas'] . '" 'video="' . $row['video'] . '" '?="">';
    }
    // End XML 
    echo '';
    ?>
    
    
  • Terakhir buat file index.html ;
  • <!DOCTYPE html >
     <head>
     <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
     <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
     <title>PHP/MySQL & Google Maps Example</title>
     <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>
     <script type="text/javascript">
     //<![CDATA[
     var customIcons = {
     rumahsakit: {
          icon: 'http://webgis.unila.ac.id/img/mm_20_blue.png'
     },
     klinik: {
     icon: 'http://webgis.unila.ac.id/img/mm_20_green.png'
     }
     };
    
     function load() {
     var map = new google.maps.Map(document.getElementById("map"), {
     center: new google.maps.LatLng(-5.4057316,105.2805186),
     zoom: 13,
     mapTypeId: 'roadmap'
     });
     var infoWindow = new google.maps.InfoWindow;
     // Change this depending on the name of your PHP file
     downloadUrl("phpsqlajax_genxml2.php", function(data) {
     var xml = data.responseXML;
     var markers = xml.documentElement.getElementsByTagName("marker");
     for (var i = 0; i < markers.length; i++) {
     var name = markers[i].getAttribute("name");
     var address = markers[i].getAttribute("address");
     var type = markers[i].getAttribute("type");
     var telp = markers[i].getAttribute("telp");
     var fasilitas = markers[i].getAttribute("fasilitas");
     var image = '<img src="'+markers[i].getAttribute("image")+'" alt="FOTO"/>';
     var video = ''
     var point = new google.maps.LatLng(
     parseFloat(markers[i].getAttribute("lat")),
     parseFloat(markers[i].getAttribute("lng")));
     var html = "<b>" + name + "</b> <br/>" ;
     var html1 = "<b>Telp:</b> " + telp +"</b> <br/>" ;
     var html2 = "<b>Fasilitas:</b> " + fasilitas +"</b> <br/>" +"<b> Video Profil:</b><br>";
     var html3 = "<b>Alamat:</b> " + address +"</b> <br/>" ;
     var html4 = "<br></br> <b> Foto Object: </b>" + "<br/>";
     var icon = customIcons[type] || {};
     var marker = new google.maps.Marker({
     map: map,
     position: point,
     icon: icon.icon
     });
     bindInfoWindow(marker, map, infoWindow, html,html1,html2,html3,html4,image,fasilitas,video);
     }
     });
     }
     function bindInfoWindow(marker, map, infoWindow, html,html1,html2,html3,html4,image,fasilitas,video) {
     google.maps.event.addListener(marker, 'click', function() {
     infoWindow.setContent(html+html1+html3+html2+video+html4+image);
     infoWindow.open(map, marker,image,fasilitas);
     });
     }
     function downloadUrl(url, callback) {
     var request = window.ActiveXObject ?
     new ActiveXObject('Microsoft.XMLHTTP') :
     new XMLHttpRequest;
     request.onreadystatechange = function() {
     if (request.readyState == 4) {
     request.onreadystatechange = doNothing;
     callback(request, request.status);
     }
     };
     request.open('GET', url, true);
     request.send(null);
     }
     function doNothing() {}
     //]]>
     </script>
     </head>
     <body onload="load()">
     <div id="map" style="width: 850px; height: 550px"></div>
     </body>
    </html>

Finish, tinggal buka file index.html, kira kira tampilannnya akan seperti ini, Video dari url embed youtube akan muncul, berikut gambar profil fasilitas.

webgis

How to: Python Send SMS to Gammu Server

April 17th, 2014 No comments

Saat ini saya memiliki server sms gateway sendiri dengan platform Gammu-MySQL sebagai core enginenya, selain server sms gateway saya juga memiliki server monitoring berbasis Python, sekarang saya ingin agar server monitoring tadi dapat menggunakan layanan sms gateway ketika terjadi gangguan koneksi. Gimana caranya …  ??

Terlebih dahulu install library Python-Mysql agar python dapat mengenali menjalankan query  Mysql, lalu buat entry baru pada database gammu (table outbox)  dengan isian no tlp tujuan, info, owner ; kira-kira akan seperti ini.

import datetime
now = datetime.datetime.now()
jam= now.strftime("%Y-%m-%d %H:%M")
import MySQLdb as mdb
import sys
import os
hostname = "www.google.com" #example
response = os.system("ping -c 1 " + hostname)
b = int(float(response))
if b == 0 :
print '0'
 conn = mdb.connect("192.168.1.xxx", "root", "sukasukague", "gammu");
 with conn:
 cursor = conn.cursor ()
 cursor.execute ("SELECT * FROM outbox")
 cursor.close()
if b == 256 :
 print 'Nilai 256'
 conn = mdb.connect("localhost", "root", "sukasukague", "gammu");
 with conn:
 cursor = conn.cursor ()
 cursor.execute ("SELECT * FROM outbox")
 cursor.execute ("""INSERT INTO outbox(DestinationNumber, TextDecoded, CreatorID) VALUES('+6285289774152', 'REMINDER: Koneksi Internet Internasional : OFF !!!', 'Gammu')""")
 cursor.execute ("""INSERT INTO outbox(DestinationNumber, TextDecoded, CreatorID) VALUES('+6289631031009', 'REMINDER: Koneksi Internet Internasional : OFF !!!', 'Gam
mu')""")
 cursor.close()

Yaps beres, tinggal eksekusi script python tadi, sebetulnya tidak hanya python yang bisa melakukan send sms ini, bisa juga kita buat menggunakan program php, java, C, ruby, dll . Yang penting kita tahu secara konsep bahwa gammu akan selalu melakukan pengecekan pada table outbox, setiap ada entry tabel outbox akan di “paksa” oleh gammu untuk dikirimkan terserah sukses atau tidak, setelah daemon gammu mengirimkan sms maka table outbox akan kosong, entry akan pindah ke table sentitem.

Kira kira seperti itulah cara kerja si gammu ini, jadi clear yah. Mudah-mudahan ada gunanya. href=”http://www.pierrecassi.com” title=”Erkek giyim, giyim bayilik”>Giyim bayilikAdıyamanen yakın elektrik?ifilmi full izleerkek kemer modellerioto ekspertizeba, e okulGiyim Bayilik

WIFI@Unila Statistik

March 13th, 2014 No comments

Setelah infrastruktur Wireless baru di tuning (naikin power transmit, rubah algoritma di wireless controller), terlihat ada peningkatan user cukup signifikan ke WIFI@Unila. Dengan sistem yang baru enak liat laporannya, dari total current 500 client terotentikasi via SSO, android tetap merajai dengan statistik, Android : 20,6 % , Window7 17,2 % , iOS 3,8%, window8 3,8 %, , Blackberry 2%, , XP 1,5 %, tinggal buat paper nya hehe 

Setelah infrastruktur Wireless baru di tuning (naikin power transmit, rubah algoritma di wireless controller), terlihat ada peningkatan user cukup signifikan ke WIFI@Unila. Dengan sistem yang baru enak liat laporannya, dari total current 500 client terotentikasi via SSO, android tetap merajai dengan statistik, Android : 20,6 % , Window7 17,2 % , iOS 3,8%, window8 3,8 %, , Blackberry 2%, , XP 1,5 %,  tinggal buat paper nya hehe :-D
dari total 1800-an device yang tersambung, authenticate via cable total 600-an, dan ke WiFI 300-an.
Gigih Forda Nama's photo.

t;/a>Giyim BayilikKış lastiği fiyatlarıBağcılar elektrik?iGiyim bayilikAdıyamanen yakın elektrik?ifilmi full izleerkek kemer modellerioto ekspertizeba, e okulGiyim Bayilik

Aruba Wireless Controller OIDs

March 11th, 2014 No comments

Just make a note  Aruba wireless controller OIDs.

Orion Internal Name OID Name OID Value
Role wlsxSwitchRole 1.3.6.1.4.1.14823.2.2.1.1.1.4
HostName wlsxSysExtHostname 1.3.6.1.4.1.14823.2.2.1.2.1.2
ModelName wlsxSysExtModelName 1.3.6.1.4.1.14823.2.2.1.2.1.3
Client_Name staUserName 1.3.6.1.4.1.14823.2.2.1.1.2.2.1.3
Client_Role staUserRole 1.3.6.1.4.1.14823.2.2.1.1.2.2.1.4
Client_AssociationID staAssociationID 1.3.6.1.4.1.14823.2.2.1.1.2.2.1.5
Client_ESSID staAccessPointESSID 1.3.6.1.4.1.14823.2.2.1.1.2.2.1.6
Client_SNR staSignalToNoiseRatio 1.3.6.1.4.1.14823.2.2.1.1.2.2.1.7
Client_TxRate staTransmitRate 1.3.6.1.4.1.14823.2.2.1.1.2.2.1.8
Client_RxRate staReceiveRate 1.3.6.1.4.1.14823.2.2.1.1.2.2.1.9
Client_TotalPacketsTx staTxPackets 1.3.6.1.4.1.14823.2.2.1.1.2.3.1.1
Client_TotalBytesTx staTxBytes 1.3.6.1.4.1.14823.2.2.1.1.2.3.1.2
Client_TotalPacketsRx staRxPackets 1.3.6.1.4.1.14823.2.2.1.1.2.3.1.3
Client_TotalBytesRx staRxBytes 1.3.6.1.4.1.14823.2.2.1.1.2.3.1.4
SSID apESSID 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.2
IPAddress apIpAddress 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.5
RadioType apPhyType 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.6
Type apType 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.7
CurrentChannel apCurrentChannel 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.8
TotalTime apTotalTime 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.10
InactiveTime apInactiveTime 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.11
Noise apChannelNoise 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.13
SNR apSignalToNoiseRatio 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.14
TxRate apTransmitRate 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.15
RxRate apReceiveRate 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.16
TotalPacketsTx apBSSTxPackets 1.3.6.1.4.1.14823.2.2.1.1.3.5.1.8
TotalBytesTx apBSSTxBytes 1.3.6.1.4.1.14823.2.2.1.1.3.5.1.9
TotalPacketsRx apBSSRxPackets 1.3.6.1.4.1.14823.2.2.1.1.3.5.1.10
TotalBytesRx apBSSRxBytes 1.3.6.1.4.1.14823.2.2.1.1.3.5.1.11
Client_IPAddress nUserExtVPNAddress 1.3.6.1.4.1.14823.2.2.1.4.1.2.1.9
Clients wlanAPBssidNumAssociatedStations 1.3.6.1.4.1.14823.2.2.1.5.2.1.7.1.12
Rogue_PhyType monAPInfoPhyType 1.3.6.1.4.1.14823.2.2.1.6.7.1.1.1.1
Rogue_CurrentChannel monAPInfoCurrentChannel 1.3.6.1.4.1.14823.2.2.1.6.7.1.1.1.2
Rogue_Classification monAPInfoClassification 1.3.6.1.4.1.14823.2.2.1.6.7.1.1.1.3
Rogue_SSID monAPInfoESSID 1.3.6.1.4.1.14823.2.2.1.6.7.1.1.1.4
Rogue_SignalStrength monAPInfoRSSI 1.3.6.1.4.1.14823.2.2.1.6.7.1.1.1.5
Rogue_Status monAPInfoStatus 1.3.6.1.4.1.14823.2.2.1.6.7.1.1.1.10

Membaca MIB id SNMP menggunakan Python

March 10th, 2014 No comments

SNMP (Simple Network Management Protocol)  adalah protokol populer untuk menjalankan fungsi network manajemen. SNMP digunakan untuk mengumpulkan informasi dan mengkonfigurasi  peralatan jaringan, seperti router, server, printer, hub, switch, wireless controller pada jaringan berbasis Internet Protocol (IP). SNMP dapat mengumpulkan informasi kondisi CPU, temperatur, memory, traffic, chasis, etc.  Salah satu bagian penting dari SNMP adalah MIB (Management Information Base), merupakan satu set koleksi informasi yang diorganisasi dalam bentuk hirarki. Sebuah file MIB adalah sebuah teks file dalam format ASN.1 yang merepresentasikan struktur hirarki dari informasi yang dapat diperoleh dari sebuah aplikasi atau sistem.

Managed object atau MIB object adalah sebuah atau beberapa karakteristik pada suatu managed device misalnya beban CPU, besar memory yang digunakan. MIB pada dasarnya merupakan hirarki dari managed object. Object identifier atau Object ID (OID) digunakan sebagai indentifikasi yang unik untuk setiap managed object yang ada dalam hirarki MIB. OID dapat direprensentasikan dalam sebuah nama misalnya .iso.org.dod.internet.mgmt.mib-2.interfaces.ifnumber atau nomor yang disebut sebagai object descriptor, misalnya .1.3.6.1.2.1.2.1

Sebuah managed object sebagai contoh ifnumber (number of interface) adalah sebuah ide abstrak, sedangkan representasi real dari informasi itu disebut dengan “instance” yang memiliki nilai dari object tersebut. Misalnya instance dari ifnumber adalah ifnumber.0 yang memiliki nilai 3 yang berarti sistem memiliki 3 network interface. Untuk mendapatkan nilai instance tersebut, NMS harus meminta informasi dengan mendefinisikan OID yaitu .1.3.6.1.2.1.2.1.0 (OID dari object ifnumber dengan ditambahkan .0 dibelakangnya). http://ejlp.blogspot.com/2008/10/snmp-bagian-3.html

Python sebagai salah satu bahasa pemrograman yang handal telah menyediakan library untuk membaca nilai MIB dari suatu manage device, kita akan coba bereksperimen bagaimana python membaca nilai OID dari suatu interface device kemudian menyimpan data traffik interface tadi kedalam database lalu memunculkannya dalam bentuk grafis.

Langkah pertama pastikan library snmp sudah terinstall dengan baik pada server monitoring

root@radius:/home/gigih# apt-get install snmp*
Reading package lists... Done
Building dependency tree
Reading state information... Done
libsnmp-python is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 26 not upgraded.
root@radius:/home/gigih#

Langkah kedua identifikasi hirarki MIB yang ada pada sebuah device menggunakan query snmpwalk

root@radius:/home/gigih# /usr/bin/snmpwalk -v2c -c CommunityString 103.3.xxx.xxx | more
iso.3.6.1.2.1.1.1.0 = STRING: "XXX"
iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.14988.1
iso.3.6.1.2.1.1.3.0 = Timeticks: (19494100) 2 days, 6:09:01.00
iso.3.6.1.2.1.1.4.0 = STRING: "noc@unila.ac.id"
iso.3.6.1.2.1.1.5.0 = STRING: "ASXXX"
iso.3.6.1.2.1.1.6.0 = STRING: "BBS Unilanet"
iso.3.6.1.2.1.1.7.0 = INTEGER: 78
iso.3.6.1.2.1.2.1.0 = INTEGER: 4
iso.3.6.1.2.1.2.2.1.1.13 = INTEGER: 13
iso.3.6.1.2.1.2.2.1.1.14 = INTEGER: 14
iso.3.6.1.2.1.2.2.1.1.15 = INTEGER: 15
iso.3.6.1.2.1.2.2.1.1.16 = INTEGER: 16
iso.3.6.1.2.1.2.2.1.2.13 = STRING: "ether2"
iso.3.6.1.2.1.2.2.1.2.14 = STRING: "ASBR-254"
iso.3.6.1.2.1.2.2.1.2.15 = STRING: "p2p-Internasional"
iso.3.6.1.2.1.2.2.1.2.16 = STRING: "p2p-Domestik"
iso.3.6.1.2.1.2.2.1.4.13 = INTEGER: 1500

Setelah hierarki MIB dapat terbaca sempurna, sekarang coba ambil nilai ID dari Interface lalu baca nilai Inoctet yang akan kita monitor life traffik nya

root@radius:/home/gigih# /usr/bin/snmpwalk -v2c -c  CommunityString  103.3.xxx.xxx IF-MIB::ifInOctets.15
IF-MIB::ifInOctets.15 = Counter32: 1167579839
root@radius:/home/gigih#

Nilai InOctet yang didapat harus dikonversi untuk mendapatkan nilai utilisasi dalam bentuk bit, saya ambil referensi kalkulasi nilai snmp dari url berikut http://www.cisco.com/c/en/us/support/docs/ip/simple-network-management-protocol-snmp/8141-calculate-bandwidth-snmp.html

How you calculate use depends on how data is presented for what you want to measure. Interface use is the primary measure used for network use. Use this formulas, based on whether the connection you measure is half-duplex or full-duplex. Shared LAN connections tend to be half-duplex, mainly because contention detection requires that a device listen before it transmits. WAN connections are full-duplex because the connection is point-to-point; both devices can transmit and receive at the same time because they know there is only one other device that shares the connection. Because MIB-II variables are stored as counters, you must take two poll cycles and figure the difference between the two (hence, the delta used in the equation).

This explains the variables used in the formulas:

calculate_bandwidth_snmp.gif

Note: ifSpeed does not accurately reflect the speed of a WAN interface.

For half-duplex media, use this formula for interface use:

calculate_bandwidth_snmp1.gif

Langkah terakhir adalah membuat script python  untuk mendapatkan nilai InOctet dan OutOctet lalu mengkonversi ke dalam bit dan menyimpannya kedalam database.

#Script by Gigih Forda Nama, dibuat malam selasa tanggal 10-03-2014 pukul 23:50 WIB
import time
import datetime
now = datetime.datetime.now()
jam= now.strftime("%Y-%m-%d %H:%M")
import MySQLdb
import os
in1 = os.popen("/usr/bin/snmpget -Ov -OQ -v2c -c Community 103.3.xxx.xxx IF-MIB::ifInOctets.15").read()
out1 = os.popen("/usr/bin/snmpget -Ov -OQ -v2c -c Community 103.3.xxx.xxx IF-MIB::ifOutOctets.15").read()
hin=abs(int(in1))
hout = abs(int(out1))
time.sleep (1)
in2 = os.popen("/usr/bin/snmpget -Ov -OQ -v2c -c Community 103.3.xxx.xxx IF-MIB::ifInOctets.15").read()
out2 = os.popen("/usr/bin/snmpget -Ov -OQ -v2c -c Community 103.3.xxx.xxx IF-MIB::ifOutOctets.15").read()
hin2=int(in2) 
hout2=int(out2)
deltain = abs(hin2-hin) #Diset balikan nilai absolute, karena terkadang ada balikan nilai minus
deltaout = abs(hout2-hout) #Diset balikan nilai absolute, karena terkadang ada balikan nilai minus
bitout = deltaout * 8
mbout = bitout/1000000
bitin = deltain * 8
mbin = bitin/1000000
if mbout < 220:
     hmbout = mbout
if mbin < 220:
     hmbin = mbin
print hmbin, hmbout
conn = MySQLdb.connect(host= "localhost",
     user="root",
     passwd="SukaSukaSaja",
     db="snmp")
x = conn.cursor()
try:
x.execute("""INSERT INTO user_bwintl VALUES (%s,%s,%s)""",(now,hmbin,hmbout))
conn.commit()
except:
conn.rollback()
conn.close()

Setelah data berhasil direkam dan masuk database selanjutnya membuat script program plotting gambar dari database;

##By-Gigih-F
import matplotlib
matplotlib.use('Agg')
import Image
import MySQLdb as mdb
import sys
import matplotlib.pyplot as plt
import datetime
now = datetime.datetime.now()
print now
#Inisialisasi ke Database
conn = mdb.connect('localhost', 'root', 'SukaSukaSaja', 'snmp');
with conn: #Query ke Database MySQL
 cursor = conn.cursor ()
 cursor.execute ("SELECT user_bwintl.waktu, user_bwintl.in, user_bwintl.out FROM user_bwintl WHERE DATE (waktu) = DATE(NOW()) ")
 row = cursor.fetchall()
 print "RESULT:", row[0]
 waktu, ain, aout=zip(*row) #Fetching setiap row
fig = matplotlib.pyplot.gcf()
fig.set_size_inches(18.5,10.5)
ax = plt.subplot(111)
plt.plot(waktu, ain,marker='+',linestyle='-',color='c',label='Total Traffick In',lw=1) #Plotting Traf In
plt.plot(waktu, aout,marker='+',linestyle='-',color='g',label='Total Trafick Out',lw=1)#Plotting Traf Out
plt.fill_between(waktu, ain,color='c',alpha=.3)#Isi warna grafik
plt.fill_between(waktu, aout,color='y',alpha=.7)#Isi warna grafik
plt.legend(loc=10)
plt.ylabel('Total Bandwidth Usage Link Internasional dalam Mbps') #Label pada sumbu Y
plt.xlabel('Waktu') #Label pada sumbu X
plt.grid()
plt.title(' Bandwidth Usage Link Internasional tgl : [%s] (Credit to RaspberryPi+Python+MySQL)'%(now)) #Judul Grafik
plt.savefig('/home/gigih/python/belajar/bwintl.png', dpi=100) #Simpan file dengan judul xxx.png
Image.open('/home/gigih/python/belajar/bwintl.png').save('/home/gigih/python/belajar/bwintl.jpg','JPEG')

Dan hasilnya adalah sebagai berikut

bwintl

lebih lengkapnya dapat dilihat di url berikut, untuk pelaporan live http://noc.unila.ac.id/?page_id=2

Note:

Great Thanks to Bunda Rasya atas inspirasi pemilihan warna grafik

Great Thanks to my beloved son Ahmad Rasya Algifarda yang udah pinjemin meja mainannya 😀