Breaking

Showing posts with label Tutorial. Show all posts
Showing posts with label Tutorial. Show all posts

Saturday, October 22, 2016

October 22, 2016

Membuat SlidingUpPanel Dengan HTML,CSS Dan Javascript Bagian 4





Setelah sebelumnya di postingan Membuat SlidingUpPanel Dengan HTML, CSS Dan Javascript Bagian 3 kita telah membuat pemutar musiknya, maka pada postingan terahir di dalam topik ini kita akan memperbaiki beberapa element serta sedikit memberi efek untuk mempercantik tampilan antarmuka.

Pertama-tama kita akan mengedit pada bagian panel header dimana content dari panel header akan kita bagi menjadi 2, yaitu panel header saat posisi SlidingUpPanel terbuka dan panel header saat posisi SlidingUpPanel tertutup atau berada dibagian dibawah layar.
Ubah bagian sliding-up-panel-header menjadi seperti berikut




SlidingUpPanel Music Player























Sekarang tambahkan css berikut kedalam file sliding-up-panel.css.
#sliding-up-panel-header.expanded .panel-header-content__expanded{
transition:opacity 300ms;
opacity:1;
}
#sliding-up-panel-header .panel-header-content__expanded{
position: absolute;
transition: opacity 300ms;
opacity:0;
text-align: left;
padding:20px;
pointer-events: none;
}
#sliding-up-panel-header .panel-header-content__collapsed{
pointer-events: none;
}
#sliding-up-panel-header.expanded .panel-header-content__collapsed{
display: none;
}

Sekarang kita akan memperbaiki beberapa bug yang mungkin telah Anda lihat saat kita mendrag panel header lebih dari tinggi layar maka panel header akan overflow dan tidak nampak dilayar, untuk mengatasinya kita perlu menambahkan statement if saat user mendrag header dengan mengecek apakah posisi sumbu y saat ini kurang dari ukuran saat SlidingUpPanel pada posisi terbuka dan apakah posisi sumbu y saat ini lebih dari 0. Tambahkan 2 baris statement if berikut pada fungsi update di file sliding-up-panel.js tepat sebelum this.slidingPanel.style.transform = `translateY(${to}px)`;

//prevent the header to overflow the screen height when dragging
if(to < this.expandedY) to = this.expandedY;
if(to > 0) to = 0;

Selanjutnya masih di file yang sama, ubah fungsi animateSlidingPanelIntoPosition menjadi seperti berikut.
animateSlidePanelIntoPosition (target) {
if(!target){
return;
}
// create new function variable to excecute when the transition has ended
const onAnimationComplete = evt => {
const panel = evt.target;
panel.removeEventListener('transitionend', onAnimationComplete);
panel.style.transition = '';
};
// create and set panel to current slidingPanel
const panel = target;
//check if current state is expanded
if(this.isExpanded){
//add event listener when the transition has ended.
panel.addEventListener('transitionend', onAnimationComplete);
//set the panel transition to transform with duration 200 miliseconds
panel.style.transition = `transform 200ms`;
//set the panel transform to position when it's in expanded state
panel.style.transform = `translateY(${this.expandedY}px)`;
//add class expanded to panel header
this.panelHeader.setAttribute('class','expanded');
}else{
//add event listener when the transition has ended.
panel.addEventListener('transitionend', onAnimationComplete);
//set the panel transition to transform with duration 200 miliseconds
panel.style.transition = `transform 200ms`;
//set the panel transform to position when it's not in expanded state
panel.style.transform = `translateY(0px)`;
//remove class attribute from panel header
this.panelHeader.removeAttribute('class')
}
// user has finish dragging the header, set target to null
if(!this.draggingHeader)
this.target = null;
}

Selanjutnya kita akan menampilkan preloader saat playlist masih kosong dan menyembunyikannya saat playlist telah terisi. Disini kita juga akan memberikan sedikit efek fade in dan slide.
Tambahkan tag div dengan nama class preloader tepat setelah tag audio.


Sekarang ubah css .playlist ul li serta tambahkan .playlist.loading ul li dan .preloader dalam file player.css menjadi seperti berikut.
.preloader{
position: absolute;
width:46px;
height:46px;
top:calc(50% - 23px);
left:calc(50% - 23px);
background-image: url(../assets/img/ajax-loader.gif);
}
.playlist ul li{
display: block;
border-bottom: 1px solid black;
transform: translate3d(0,0,0);
opacity:1;
}
.playlist.loading ul li{
transform: translate3d(100%,0,0);
opacity:0;
}
Selanjutnya buat variabel baru pada fungsi construct untuk menyimpan element preloader dan ubah fungsi loadPlaylistMetadata dan getPlaylist pada file player.js menjadi seperti berikut.
this.preloader = document.querySelector('.preloader');
getPlaylist(){
var self = this;
var xhr = new XMLHttpRequest();
xhr.onload = function(e){
e.preventDefault();
if(xhr.status == 200 || xhr.status == 409){
var data = JSON.parse(xhr.response.match(/\[.*\]/ig, "")[0]);
data.forEach(function(item,index){
self.loadPlaylistMetadata(item,index,data.length);
});
self.songs = Array.from(document.querySelectorAll('.song a'))
}else{
console.log('cant get playlist, error with status code ' + xhr.status);
}
}
xhr.open('get', '\songlist', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send();
}
loadPlaylistMetadata(path,index,length){
var self = this;
// create new li element for the playlist item and set the attribute
var li = document.createElement('li');
li.setAttribute('class','song');
li.setAttribute('data-index',index);

// create new link element and set the href attribute to the file path
var a = document.createElement('a');
a.setAttribute('href',path);

// create new image element
var img = document.createElement('img');
img.className = 'cover';
img.style.cssFloat = 'left';

//create new container for title and artist metadata
var meta = document.createElement('div');
meta.className = 'metatag playlist';

//create new span element to set title from the file metadata
var title = document.createElement('span');
title.className = 'title';
title.style.whiteSpace = 'nowrap';

//create new span element to set artist name from the file metadata
var artist = document.createElement('span');
artist.className = 'artist';
//insert link/anchor element to li element
li.appendChild(a);
//insert img element to link/anchor element
a.appendChild(img);
//insert meta container to the link/anchor element
a.appendChild(meta);
/* create new p element and insert title and artist to it then append it to meta container,
* this element is necessary if we want the title or artist to
* be marqueed if the width is more than container width.*/
var p = document.createElement('p').appendChild(title);
meta.appendChild(p);
p = document.createElement('p').appendChild(artist);
meta.appendChild(p);
// listen to link click event
a.onclick = function(e){
e.preventDefault();
self.player.setAttribute('src',path);
self.songChanged(self.currentSong,li.getAttribute('data-index'));
self.currentSong = parseInt(li.getAttribute('data-index'));
self.playPauseBtn[0].children[0].click();
};
//append li element to playlist
this.playlist.children[0].appendChild(li);
// read meta data from the file using jsmediatags
jsmediatags.read(path, {
onSuccess: function(tag) {
var url = path;
var filename = url.split('/');
filename = filename[filename.length-1];
if(tag.tags.picture != undefined){
var base64String = "";
for (var i = 0; i < tag.tags.picture.data.length; i++) {
base64String += String.fromCharCode(tag.tags.picture.data[i]);
}
img.setAttribute('src',"data:"+ tag.tags.picture.format +";base64," + window.btoa(base64String));
}else{
img.setAttribute('src',"assets/img/albumart_mp_unknown.png");
}
// if the artist name in metadata is undefined or null, set it to unknown.
artist.innerHTML = tag.tags.artist || 'unknown';
// if the title in metadata is undefined or null, use filename instead.
title.innerHTML = tag.tags.title || filename;

// setup marquee animation
self.setupMarqueeAnimation(titles[i],artists[i]);

if(index == length - 1){
//hide the preloader
self.preloader.style.display = 'none';
//get all li element in playlist
let list = self.playlist.querySelectorAll('li');
list.forEach(function(item,index){
//add transition with diffrent delay for each item in list depend on item index/position in the list
item.style.transition = `transform 300ms ease-in ${index*0.2}s, opacity 300ms ease-in ${index*0.2}s`;
});
//change playlist class name, this will remove loading class
self.playlist.setAttribute('class','playlist');
}
},
onError: function(error) {
console.log(error);
}
});
}
Terakhir tambahkan class loading pada playlist di dalam file index.html menjadi seperti berikut.



    Untuk file preloader Anda dapat menggunakan gambar berikut dan menyimpannya di folder assets > img.



    Mungkin sampai disini saja pada postingan terakhir dalam topik Membuat SlidingUpPanel Dengan HTML,CSS Dan Javscript ini, jika terdapat pertanyaan dapat menggunakan kotak komentar dibawah.

    Friday, October 7, 2016

    October 07, 2016

    Membuat SlidingUpPanel Dengan HTML,CSS Dan Javascript Bagian 2


    Pada postingan sebelumnya tentang Membuat SlidingUpPanel Dengan HTML, CSS Dan Javascript Bagian 1 kita telah selesai membuat desain awal aplikasi, di postingan kali ini kita akan bermain dengan javascript untuk membuat SlidingUpPanel yang kita buat sebelumnya dapat bekerja sesuai apa yang kita inginkan.

    Pertama buatlah file javascript baru beri nama sliding-up-panel.js kemudian tuliskan "use strict";. Mode use strict ini berguna untuk menempatkan program atau fungsi dalam operasi konteks yang strict (ketat). konteks yang ketat ini mencegah tindakan-tindakan tertentu dan melempar lebih banyak exception/pengecualian.

    Disini kita akan membuat kelas baru dengan nama SlidingUpPanel dan memuat kelas pada event window onload.
    "use strict";
    class SlidingUpPanel{
    constructor(){

    }
    }
    window.addEventListener('load',() => new SlidingUpPanel());

    Untuk mengetes apakah kelas yang kita buat bekerja kita akan menulis ke console, menjadi seperti berikut.
    "use strict";
    class SlidingUpPanel{
    constructor(){
    console.log('Hello World!')
    }
    }
    window.addEventListener('load',() => new SlidingUpPanel());


    Sekarang buka cmd/terminal di dalam folder proyek Anda kemudian ketikan perintah berikut dan buka browser ketikkan url http://locahost:3000.
    supervisor index.js
    Kemudian tekan CTRL + SHIFT + I untuk membuka panel alat pengembang dan melihat hasilnya di bagian console.


    Jika Anda melihat tulisan "Hello World!" di console seperti yang terlihat pada gambar diatas, artinya kelas SlidingUpPanel yang kita buat bekerja. Sekarang kita perlu menginisialisasikan variabel yang dibutuhkan didalam fungsi constructor() dan mengganti console.log yang kita buat sebelumnya.
    class SlidingUpPanel{
    constructor(){
    this.slidingPanel = document.querySelector('#sliding-up-panel');
    this.panelHeader = document.querySelector('#sliding-up-panel-header');
    this.panelBody = document.querySelector('#sliding-up-panel-body');
    this.mainContent = document.body.children[0];
    this.mainContent.style.marginBottom = `${this.panelHeader.offsetHeight}px`;
    this.slidingPanel.style.height = window.innerHeight;
    this.slidingPanel.style.top = window.innerHeight - this.panelHeader.offsetHeight;

    this.target = null;
    this.targetBCR = null;
    this.panelBCR = this.slidingPanel.getBoundingClientRect();

    this.startY = 0;
    this.currentY = 0;
    this.screenY = 0;
    this.targetY = 0;
    this.collapsedY = this.panelBCR.height - this.panelHeader.offsetHeight;
    this.expandedY = -this.panelBCR.height + this.panelHeader.offsetHeight;

    this.draggingHeader = false;
    this.isExpanded = false;
    }
    }

    Sekarang kita akan membuat beberapa fungsi baru untuk mendengarkan event yang kita butuhkan diantaranya adalah :
    • Event mousedown
    • Event mousemove
    • Event mouseup
    • Event touchstart
    • Event touchmove
    • Event touchend
    • Event Window Resize
    Event touch digunakan agar nantinya support untuk perangkat layar sentuh. Namun pada dasarnya isi dari fungsi touch dan mouse sama, sedangkan event Window resize digunakan untuk mengubah posisi top pada SlidingUpPanel saat jendela browser berubah ukuran.
    Sekarang buatlah fungsi baru seperti berikut di dalam class SlidingUpPanel.
    addEventListeners(){
    document.addEventListener('touchstart', this.onStart);
    document.addEventListener('touchmove', this.onMove);
    document.addEventListener('touchend', this.onEnd);

    const self = this;
    window.addEventListener('resize',function(e){
    self.slidingPanel.style.top = window.innerHeight - self.panelHeader.offsetHeight;
    self.expandedY = -window.innerHeight + self.panelHeader.offsetHeight;
    self.animateSlidePanelIntoPosition(self.slidingPanel);
    e.preventDefault();
    });

    document.addEventListener('mousedown', this.onStart);
    document.addEventListener('mousemove', this.onMove);
    document.addEventListener('mouseup', this.onEnd);
    }
    Sekarang kita buat 3 fungsi yang akan digunakaan yaitu onStart, onMove dan onEnd.
    onStart (evt) {
    if (this.target)
    return;

    //if current target id is not sliding-up-panel-header, don't execute the next code.
    if (evt.target.id != 'sliding-up-panel-header')
    return;
    //set target to current touched/clicked target
    this.target = evt.target;
    //set targetBCR to current touched/clicked target Bounding Client Rectangle
    this.targetBCR = this.target.getBoundingClientRect();
    //set startY to current touched/clicked Y position on page
    this.startY = evt.pageY || evt.touches[0].pageY;
    //set currentY equal to startY
    this.currentY = this.startY;

    //set draggingHeader to true
    this.draggingHeader = true;
    /* because we will change the panel position based on Y axis using translateY
    * set property will-change to transform */
    this.slidingPanel.style.willChange = 'transform';

    evt.preventDefault();
    }
    onMove(evt){
    if (!this.target)
    return;
    //set currentY to current touched/clicked Y position on page when we drag the header
    this.currentY = evt.pageY || evt.touches[0].pageY;
    }
    onEnd(evt){
    if (!this.target)
    return;

    this.targetY = 0;
    //create new variable screenY and set current header panel position to it.
    let screenY = this.currentY - this.startY;
    /* threshold variable is used to check if user has drag more then 1/4 of panel height size
    * you can change this to half or whatever you want the slider to be expanded or not
    * when user drag more then threshold */
    const threshold = this.panelBCR.height * 0.25;
    if (Math.abs(screenY) > threshold) {
    /* set targetY to panel bounding client rectangle height subtract by panel header height if screenY is
    * positive value and set to negative value of panel bounding client rectangle height add by
    * panel header height */
    this.targetY = (screenY > 0) ?
    (this.panelBCR.height - this.panelHeader.offsetHeight) :
    (-this.panelBCR.height + this.panelHeader.offsetHeight);
    }
    //set draggingHeader to false
    this.draggingHeader = false;
    }
    Setelah semua fungsi telah dibuat sekarang kita akan melakukan bind pada fungsi yang kita buat tadi ke variabel dalam konteks kelas SlidingUpPanel. Tambahkan script berikut ke dalam fungsi constructor.
    this.onStart = this.onStart.bind(this);
    this.onMove = this.onMove.bind(this);
    this.onEnd = this.onEnd.bind(this);
    this.addEventListeners();
    Sekarang kita akan masuk ke bagian animasi dimana kita menggerakan sliding panel berdasarkan sumbu y saat kita melakukan drag pada panel header.
    Untuk menganimasikan panel disini saya menggunakan requestAnimationFrame agar browser dapat megoptimasikan animasi sehingga animasi menjadi lebih halus saat objek bergerak. buatlah fungsi baru seperti berikut.
    update () {
    requestAnimationFrame(this.update);

    if (!this.target)
    return;

    if (this.draggingHeader) {
    this.screenY = this.currentY - this.startY;
    } else {
    this.screenY += (this.targetY - this.screenY) / 4;
    }
    /* create new variable to and set the value to where we want the sliding panel to move based on Y axis.
    * if current panel state is expanded then we move it to expandedY add by screenY
    * if not then use screenY instead */
    let to = (this.isExpanded) ? (this.expandedY + this.screenY) : this.screenY;
    this.slidingPanel.style.transform = `translateY(${to}px)`;

    // Check if user still dragging the header or not, if true don't execute the next code.
    if (this.draggingHeader)
    return;
    const panel = this.target.parentNode;
    const isNearlyAtStart = (!this.isExpanded)?(Math.abs(this.screenY) < Math.abs(panel.offsetHeight/4)):(Math.abs(this.screenY) > Math.abs(panel.offsetHeight/4));
    const isNearlyExpanded = (!this.isExpanded)?(Math.abs(this.screenY) > Math.abs(panel.offsetHeight/4)):(Math.abs(this.screenY) < Math.abs(panel.offsetHeight/4));
    // If the panel is nearly expanded and current state is not expanded.
    if (isNearlyExpanded && !this.isExpanded) {
    // Bail if there's no target or it's not attached to a parent anymore.
    if (!this.target || !this.target.parentNode)
    return;
    // set isExpanded to true
    this.isExpanded = true;
    } else if (isNearlyAtStart) {
    // set isExpanded to false
    this.isExpanded = false;
    }
    // animate the panel to the position where we want it based on its state expanded or not.
    this.animateSlidePanelIntoPosition(this.target.parentNode);
    }
    Selanjutnya tambahkan script berikut ke dalam fungsi construct.
    this.update = this.update.bind(this);
    requestAnimationFrame(this.update);
    Sekarang kita akan membuat fungsi baru untuk menggerakkan panel pada posisinya berdasarkan keadaan panel yang disimpan dalam variabel isExpanded.
    animateSlidePanelIntoPosition (target) {
    if(!target){
    return;
    }
    // create new function variable to excecute when the transition has ended
    const onAnimationComplete = evt => {
    const panel = evt.target;
    //remove current listener from the panel
    panel.removeEventListener('transitionend', onAnimationComplete);
    panel.style.transition = '';

    };
    // create and set panel to current slidingPanel
    const panel = this.slidingPanel;
    //check if current state is expanded
    if(this.isExpanded){
    //add event listener when the transition has ended.
    panel.addEventListener('transitionend', onAnimationComplete);
    //set the panel transition to transform with duration 200 miliseconds
    panel.style.transition = `transform 200ms`;
    //set the panel transform to position when it's in expanded state
    panel.style.transform = `translateY(${this.expandedY}px)`;
    }else{
    //add event listener when the transition has ended.
    panel.addEventListener('transitionend', onAnimationComplete);
    //set the panel transition to transform with duration 200 miliseconds
    panel.style.transition = `transform 200ms`;
    //set the panel transform to position when it's not in expanded state
    panel.style.transform = `translateY(0px)`;
    }
    // animation has ended, set target to null
    this.target = null;
    }
    Sekarang buka kembali browser Anda kemudian lihat hasilnya di http://localhost:3000, kurang lebih hasilnya akan seperti berikut. Sampai disini Anda telah berhasil membuat SlidingUpPanel Layout, untuk posting selanjutnya kita akan mulai membuat javascript untuk pemutar musiknya. So stay Tuned ;)!! Untuk gambar-gambar yang digunakan dalam tutorial ini dapat di download disini.

    Tuesday, October 4, 2016

    October 04, 2016

    Membuat SlidingUpPanel Dengan HTML,CSS Dan Javascript Bagian 1


    Pada kesempatan kali ini saya akan membahas tentang bagaimana Membuat SlidingUpPanel Dengan HTML, CSS dan javascript. Biasanya SlidingUpPanel ini banyak digunakan di aplikasi-aplikasi pemutar musik di Android. Namun disini kita akan mencoba membuatnya menggunakan HTML, CSS dan javascript. Kita akan membuat pemutar musik sederhana dengan SlidingUpPanel yang hampir mirip dengan Google Play Music.

    Sebelum memulai ada baiknya Anda menginstall Nodejs terlebih dahulu jika di Komputer/Laptop Anda belum terinstall Nodejs. Nodejs merupakan teknologi javascript sisi server. Anda dapat mendownload Nodejs di https://nodejs.org.
    Setelah mengistall nodejs Anda perlu menginisialisasikan folder proyek Anda terlebih dahulu, dan mengisi rincian tentang proyek Anda. Pada folder proyek Anda buka terminal/cmd kemudian ketikkan perintah berikut.
    npm init
    Setelah itu isi semua rincian yang ditanyakan.

    Selanjutnya Anda peru menginstall beberapa modul yang akan kita gunakan diantaranya adalah:
    1. express
    2. jsmediatags
    3. fs
    4. path
    5. supervisor
    Untuk menginstall modul-modul diatas Anda dapat menggunakan cmd/terminal dengan mengetikkan perintah sebagai berikut :


    Mac/Linux :

    sudo npm install -g [nama-module]


    Windows :
    npm install -g [nama-module]

    Ubah [nama-modul] menjadi nama modul yang ingin diinstall, contoh saya ingin menginstall modul express pada laptop yang memiliki sistem operasi Windows maka saya mengetikan perintah berikut :
    npm install -g express.

    Sebelum membuat file-file untuk sisi klien kita perlu membuat minimal 1 file javascript untuk digunakan di sisi server. Buatlah file baru dan beri nama index.js, kemudian tuliskan script berikut.
    'use strict';
    var fs = require('fs'),
    express = require('express'),
    app = express(),
    path = require('path');

    var data = [];
    readFiles('songs/', function(filename, content) {
    data.push('http://localhost:3000/songs/' +filename);
    }, function(err) {
    throw err;
    });

    function readFiles(dirname, onFileContent, onError) {
    fs.readdir(dirname, function(err, filenames) {
    if (err) {
    onError(err);
    return;
    }
    filenames.forEach(function(filename) {
    fs.readFile(dirname + filename, 'utf-8', function(err, content) {
    if (err) {
    onError(err);
    return;
    }
    onFileContent(filename, content);
    });
    });
    });
    }
    app.use(function (req, res, next) {
    var filename = req.url || "index.html";
    var ext = path.extname(filename);
    var localPath = __dirname;
    var validExtensions = {
    ".html" : "text/html",
    ".js": "application/javascript",
    ".json": "application/json",
    ".css": "text/css",
    ".txt": "text/plain",
    ".jpg": "image/jpeg",
    ".gif": "image/gif",
    ".png": "image/png",
    ".ico": "image/png",
    ".svg": "image/svg+xml",
    ".webm": "audio/webm",
    ".aac": "audio/aac",
    ".ogg": "audio/ogg",
    ".wav": "audio/wav",
    ".mp3": "audio/mpeg",
    ".mp4": "audio/mp4",
    ".m4a": "audio/mp4"
    };
    var isValidExt = validExtensions[ext];

    if (isValidExt) {
    localPath += filename;

    fs.exists(localPath, function(exists) {
    if(exists) {
    console.log("Serving file: " + localPath);
    getFile(localPath, res, validExtensions[ext]);
    } else {
    console.log("File not found: " + localPath);

    if(ext === 'text/html'){
    getFile(__dirname + '/404.html', res, validExtensions[ext]);
    }
    }
    });

    } else if(req.url == "/songlist"){
    res.setHeader("Content-Type", 'application/json');
    res.statusCode = 200;
    res.end(JSON.stringify(data));
    }else {
    console.log("Invalid file extension detected: " + ext);
    getFile(__dirname + '/index.html', res, 'text/html');
    }
    });
    app.listen(3000);
    function getFile(localPath, res, mimeType) {
    fs.readFile(localPath, function(err, contents) {
    if(!err) {
    res.setHeader("Content-Length", contents.length);
    res.setHeader("Content-Type", mimeType);
    res.statusCode = 200;
    res.end(contents);
    } else {
    res.writeHead(500);
    res.end();
    }
    });
    }


    Pada script diatas saya menggunakan express untuk membuat http server pada port 3000, kemudian terdapat fungsi app.use() yang digunakan untuk mengirim resource ke sisi klien berdasarkan url yang diminta, disana saya hanya melakukan pengecekan apakah file resource yg diminta valid atau tidak dan apakah file tersebut tersedia di sisi server.

    Sekarang kita akan mulai membuat desainnya, pertama-tama buatlah file html baru beri nama index.html kemudian buatlah template HTML seperti berikut.
    <html>
    <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="author" content="Muhammad Sayuti" />
    <meta name="viewport" content="width=device-width,minimum-scale=1">
    <meta name="theme-color" content="#EA2663">
    <title>Sliding Up Panel</title>
    </head>
    <body>
    <div class="playlist">
    <ul>
    </ul>
    </div>
    <div id="sliding-up-panel">
    <div id="sliding-up-panel-header">
    <img src="assets/img/albumart_mp_unknown.png" class="coverart header" />
    <div class="meta header">
    <span class="artist"></span>
    <span class="title"></span>
    </div>
    <div class="player-control header">
    <a href="#" id="prev-btn">Prev</a>
    <a href="#" id="play-btn" state="pause"><img src="icons/play-button.svg" style="width:25px;height:25px;"/></a>
    <a href="#" id="next-btn">Next</a>
    </div>
    </div>
    <div id="sliding-up-panel-body">
    <img src="assets/img/albumart_mp_unknown.png" class="coverart content" />
    <div class="meta content">
    <span class="artist"></span>
    <span class="title"></span>
    </div>
    <div class="player-control content">
    <a href="#" id="prev-btn">Prev</a>
    <a href="#" id="play-btn" state="pause"><img src="icons/play-button.svg" style="width:25px;height:25px;"/></a>
    <a href="#" id="next-btn">Next</a>
    </div>
    </div>
    </div>
    <audio id="player" src="" style="display:hidden;"></audio>

    </body>
    </html>
    Anda dapat menggunakan lagu yang Anda miliki dan menempatkannya di folder songs, pastikan nama file tidak ada spasi untuk menghindari error saat memainkan lagu, karena spasi akan di konversi secara otomatis menjadi karakter unicode sehingga nantinya akan muncul error bahwa file tidak ditemukan karena spasi pada nama file diubah ke karakter unicode.

    Pada template HTML diatas tag audio saya beri property style dimana value dari display adalah hidden karena nantinya kita tidak menggunakan kontrol default dari element audio,namun menggunakan beberapa link yang dapat Anda lihat pada element div dengan nama class player-control. Disini css saya bagi menjadi 2 file, 1 yang dibuat untuk mengatur tampilan SlidingUpPanel dan yang kedua untuk mengatur tampilan yang lain.
    Buat file baru dan beri nama sliding-up-panel.css kemudian isikan seperti berikut.
    #sliding-up-panel{
    display:block;
    position:fixed;
    top:0;
    left:0;
    right:0;
    bottom: 0;
    }
    #sliding-up-panel-header{
    background-color: #424242;
    box-sizing: border-box;
    position:relative;
    width: 100%;
    height: 64px;
    overflow: hidden;
    }
    #sliding-up-panel-body{
    background-color: #757575;
    overflow: auto;
    height: 100%;
    width: 100%;
    }

    Sekarang buat 1 file css lagi beri nama player.css, kemudian isikan seperti berikut.
    *{
    padding:0px;
    margin:0px;
    font-family:san-serif;
    font-size:24px;
    }
    html,body{
    background-color: #757575;
    }
    a{
    text-decoration: none;
    }
    .playlist{
    display: block;
    width:100%;
    }
    /* Playlist style */
    .playlist ul li{
    display: block;
    border-bottom: 1px solid black;

    }
    .playlist ul li a{
    height: 57px;
    display: block;
    color: white;
    }
    .playlist ul li a.active{
    background-color: rgba(0,0,0, 0.5);
    color: #42A5F5;
    }
    .playlist .metatag .title{
    font-size: 16px;
    white-space: nowrap;
    }
    .playlist .metatag.playlist{
    float:left;
    padding:10px;
    width: 87.3%;
    overflow: hidden;
    }
    .playlist .metatag .artist{
    font-size: 14px;
    white-space: nowrap;
    }
    .playlist .cover{
    height:100%;
    max-width:8%;
    }
    /* Player Control style */
    .player-control{
    display: flex;
    flex-basis: 33.3333333%;
    align-items: center;
    align-self: baseline;
    width:134px;
    }

    /* to prevent SidingUpPanel not moving when we drag the header
    * we need to set pointer-events to none.*/

    .player-control.header{
    pointer-events: none;
    height: 100%;
    padding: 0 0.5em;
    float: right;
    }

    .player-control.content{
    height: 64px;
    margin: 0 auto !important;
    pointer-events: none;
    }
    /* because it's a link with fake href set user-select to none and
    * retrieve all pointer-events */
    .player-control a{
    pointer-events: all;
    user-select: none;
    }
    .player-control img{
    margin: auto 0;
    width:100%;
    pointer-events: none;
    }
    .play-btn img{
    width: 50px;
    height: 50px;
    }
    .next-btn img{
    width: 40px;
    height: 40px;
    }
    .prev-btn img{
    width: 40px;
    height: 40px;
    }
    /* Meta style General*/
    .meta{
    pointer-events: none;
    color: #FFF;
    }
    .meta .title{
    font-size: 16px;
    white-space: nowrap;
    display: inline-block;
    position: relative;
    left:0px;
    }
    .meta .artist{
    font-size: 14px;
    white-space: nowrap;
    }
    .marquee-title{
    display: inline-block;
    transition: transform 20s linear infinite;
    animation: marquee2 20s linear infinite;
    }
    .marquee-artist{
    display: inline-block;
    transition: transform 20s linear infinite;
    animation: marquee 20s linear infinite;
    }
    /* Meta style for sliding-up-panel-header*/
    .meta.header{
    display: flex;
    flex-flow: row wrap;
    float:left;
    margin:15px;
    max-width: 200px;
    overflow: hidden;
    }

    /* Meta style for sliding-up-panel-body*/
    .meta.content{
    display: flex;
    flex-flow: row wrap;
    align-items: center;
    margin: 1.5em auto;
    max-width: 200px;
    overflow: hidden;
    text-align: center;
    }

    /* Coverart style*/
    img.coverart{
    display: hidden;
    }
    img.coverart.header[src]{
    float: left;
    pointer-events: none;
    height:100%;
    max-width: 70px;
    border: none;
    }
    img.coverart.content[src]{
    display: block;
    margin: 0.5em auto;
    height:50%;
    border: none;
    }



    /* Keyframes animation */
    @keyframes marquee {
    0% {
    transform:translateX(-25%);
    }
    25% {
    transform:translateX(-50%);
    }
    50% {
    transform:translateX(-25%);
    }
    75% {
    transform:translateX(0%);
    }
    100%{
    transform:translateX(-25%);
    }
    }
    @keyframes marquee2 {
    0% {
    transform:translateX(0%);
    }
    25% {
    transform:translateX(-25%);
    }
    50% {
    transform:translateX(-50%);
    }
    75% {
    transform:translateX(-25%);
    }
    100%{
    transform:translateX(0%);
    }
    }

    Sekarang desain awal sudah selesai, Anda dapat dapat menjalankan nodejs server dengan membuka cmd/terminal pada folder proyek Anda dan mengetikkan perintah supervisor index.js. Tampilan yang Anda lihat kurang lebih akan seperti berikut.


    Pada postingan selanjutnya kita akan mulai membuat file-file javascript sisi klien.

    Sunday, September 4, 2016

    September 04, 2016

    Membuat Efek Ripple Berbasis Material Design Menggunakan jQuery


    Pada kesempatan kali ini saya akan membahas tentang bagaimana cara membuat efek ripple seperti yang ada pada Google Material Design. Disini saya menggunakan jQuery untuk mempermudah dalam pembuatan efek ripple, versi yang saya gunakan adalah versi 1.9.1.

    Saya akan sedikit menjelaskan keseluruhan konsep yang akan digunakan dalam pembuatan efek ripple ini. Jadi ketika sebuah element HTML di klik kita akan menambahkan element baru dimana nantinya di dalam element baru ini terdapat element yang akan kita ingin beri efek. Element baru yang dibuat ini nantinya akan di berikan efek scale dengan warna background tertentu, dan ketika klik mouse selesai efek akan di fade-out(dipudarkan).

    Pertama-tama kita akan membuat element yang akan kita beri efek, buatlah file baru beri nama index.html.


    <html>
    <head>
    </head>
    <body>
    <h1>
    Ripple Click Effect</h1>
    <ul>
    <li><a class="ripple" href="#">Dashboard</a></li>
    <li><a class="ripple" href="#">My Account</a></li>
    <li><a class="ripple" href="#">Direct Messages</a></li>
    <li><a class="ripple" href="#">Chat Rooms</a></li>
    <li><a class="ripple" href="#">Settings</a></li>
    <li><a class="ripple" href="#">Logout</a></li>
    </ul>
    </body>
    </html>


    Sekarang kita akan membuat file CSS untuk mengubah tampilannya serta membuat keyframes untuk animasi ripple, buatlah file baru dan beri nama style.css.

    /*basic reset*/

    * {
    margin: 0;
    padding: 0;
    }

    body {
    background-size: cover;
    }

    h1 {
    font: normal 32px/32px Bitter;
    color: black;
    text-align: center;
    padding: 85px 100px;
    }


    /*nav styles*/

    ul {
    background: white;
    border-top: 6px solid hsl(180, 40%, 60%);
    width: 200px;
    margin: 0 auto;
    }

    ul li {
    list-style-type: none;
    /*relative positioning for list items along with overflow hidden to contain the overflowing ripple*/
    position: relative;
    overflow: hidden;
    }

    ul li a {
    font: normal 14px/28px Montserrat;
    color: hsl(180, 40%, 40%);
    display: block;
    padding: 10px 15px;
    text-decoration: none;
    cursor: pointer;
    /*since the links are dummy without href values*/
    /*prevent text selection*/
    user-select: none;
    /*static positioned elements appear behind absolutely positioned siblings(.ink in this case) hence we will make the links relatively positioned to bring them above .ink*/
    position: relative;
    }


    /*.ink styles - the elements which will create the ripple effect. The size and position of these elements will be set by the JS code. Initially these elements will be scaled down to 0% and later animated to large fading circles on user click.*/

    .ink {
    display: block;
    position: absolute;
    background: hsl(180, 40%, 80%);
    border-radius: 100%;
    transform: scale(0);
    -webkit-transform: scale(0);
    -moz-transform: scale(0);
    }

    .fade-out {
    transform: opacity(0);
    -webkit-transform: opacity(0);
    -moz-transform: opacity(0);
    }


    /* animation effect keyframes */

    .ink.animate {
    animation: ripple 0.65s forwards;
    -webkit-animation:ripple 0.65s forwards; /* For Chrome & Safari/Webkit based browser */
    -moz-animation:ripple 0.65s forwards; /* For Mozilla Firefox */
    }

    .ink.animate.end {
    transition: all 0.5s ease-in-out;
    background-color: rgba(255, 0, 0, 0.0);
    box-shadow: none;
    border-radius: 0px;
    }
    @-webkit-keyframes ripple{
    100% {
    -webkit-transform: scale(2.5);
    transform: scale(2.5);

    }
    }
    @-moz-keyframes ripple{
    100% {
    -moz-transform: scale(2.5);
    transform: scale(2.5);

    }
    }

    @keyframes ripple {
    /*scale the element to 250% to safely cover the entire link and fade it out*/
    100% {
    transform: scale(2.5);
    -webkit-transform: scale(2.5);
    -moz-transform: scale(2.5);
    }
    }


    Selanjutnya kita akan menggunakan javascript dan jquery untuk membuat animasi efek Ripple. Buatlah file javascript baru dan beri nama ripple.js, setea itu deklarasikan semua variabel yang dibutuhkan untuk membuat efe ripple.

    (function($){
    var parent,ink,d,x,y;
    }(jQuery);

    Berikut sedikit penjelasan tentang variabel yang akan digunakan
    variabelfungsi
    parent digunakan untuk menyimpan objek html parent dari objek yang di klik
    ink digunakan untuk menyimpan element html baru yang akan memberikan efek animasi ripple pada elemen yang diklik
    d digunakan untuk menyimpan lebar atau tinggi element parent untuk mendapatkan diameter lingkaran untuk efek ripple
    x digunakan untuk menyimpan posisi x dari parent element yang diklik
    y digunakan untuk menyimpan posisi y dari parent element yang diklik
    Sekarang kita akan membuat fungsi untuk melakukan animasi pada 2 event yaitu event mousedown dan mouseup, mousedown adalah event saat mousedown ditekan dan mouseup adalah event saat tombol mouse dilepas/selesai ditekan. Sebelumnya pada script html tiap element list saya beri nama class ripple sehingga kita akan menggunakan nama class untuk mengeksekusi animasi.
    Note:
    untuk mengeksekusi perintah yang melibatkan lebih dari satu element menggunakan javascript sebaiknya menggunakan class bukan id, karena id hanya akan mengambil 1 element pertama saja.

    (function($){
    var parent,ink,d,x,y;
    $('.ripple').mousedown(function(e){

    });
    $('.ripple').mouseup(function(e)){

    });
    }(jQuery);

    Selanjutnya kita akan mulai mengeksekusi perintah-perintah pada event mousedown terlebih dahulu. Didalam fungsi mousedown kita dapat mengakses objek yang sedang diklik dan menganimasikannya menggunakan css yang telah dibuat sebelumnya. Pertama kita perlu mendapatkan parent element dari element yang diklik.

    var parent = $(this).parent();

    Setelah mendapatkan element parent dari objek yang di klik kita perlu mengecek apakah element ink sudah ada pada element parent atau tidak, jika tidak ada maka buat element ink baru kemudian menyisipkannya kedalam parent element, kemudian simpan element ke variable ink.

    if (parent.find(".ink").length == 0){
    parent.prepend("
    ");
    }
    ink = parent.find(".ink");

    Agar efek ripple dapat selalu berjalan ketika mouse diklik kita perlu menghapus nama class animate dan end dari element ink jika memang pada element parent sudah terdapat element ink.

    ink.removeClass("animate");
    ink.removeClass("end");

    Selanjutnya kita perlu mengatur ukuran dari element ink menggunakan lebar atau tinggi element parent untuk membuat diameter lingkaran yang bisa untuk menutupi element.

    if (!ink.height() && !ink.width()) {
    d = Math.max(parent.outerWidth(), parent.outerHeight());
    ink.css({
    height: d,
    width: d
    });
    }

    Selanjutnya kita perlu mengatur posisi dari element ink namun kita harus mendapatkan kordinat x dan y saat mouse ditekan terlebih dahulu. Untuk mendapatkan kordinat x kita perlu mendapatkan kordinat x dari objek yang diklik relatif pada halaman kemudian dikurangi dengan posisi element parent relatif pada halaman dan dikurangi setengah dari lebar element ink, untuk kordinat y kita dapat menggunakan rumus yang sama yang berbeda hanya pada yang terakhir dimana untuk x kita menggunakan setengah dari lebar element ink sedangkan untuk y kita menggunakan setengah dari tinggi element ink.

    x = e.pageX - parent.offset().left - ink.width() / 2;
    y = e.pageY - parent.offset().top - ink.height() / 2;

    Sekarang atur posisi dari element ink dan tambahkan class animate

    ink.css({
    top: y + 'px',
    left: x + 'px'
    }).addClass("animate");

    Sekarang kita telah selesai membuat efek ripple pada event mousedown, sekarang kita perlu menambahkan 1 baris terahir di event mouseup untuk memberikan efek fade saat mouse selesai diklik dengan menambahkan nama class end pada element ink.

    ink.addClass("end");

    Sampai disini Anda telah selesai Membuat Efek Ripple Berbasis Material Design Menggunakan jQuery. Mungkin itu saja yang dapat saya berikan pada postingan kali ini.
    Semoga Bermanfaat ...!!!

    Full Code + Result

    Wednesday, July 20, 2016

    July 20, 2016

    Mengenal Polymer


    Pada potingan kali ini saya akan membahas tentang Polymer yang dikembangkan oleh google dan baru dirilis pada 27 mei 2015.

    Apa itu Polymer

    Polymer merupakan Javascript library open-source yang dapat Anda gunakan untuk membangun aplikasi web menggunakan komponen web. library ini sedang dikembangkan oleh Google dan kontributor di GitHub. prinsip desain yang modern diimplementasikan sebagai proyek terpisah menggunakan prinsip-prinsip desain dari Google Material Design.

    Polymer digunakan di sejumlah layanan dan situs web milik Google , termasuk YouTube Gaming dan website Google I/O.

    pengembangan dari Polymer dimulai pada 14 November 2013 dengan merilis sebuah Polyfill. Project ini terus berkembang menjadi sebuah perpustakaan desain web yang meliputi pedoman gaya visual (melalui Material Design), data binding, dan sejumlah komponen web "Core" dan "Paper". komponen Core awalnya direncanakan akan mencakup fungsi generik yang akan menjadi penting untuk sebagian besar situs, sementara komponen Paper dimaksudkan untuk menyediakan komponen yang lebih khusus dengan konsep Material Design yang membentuk bagian penting dari desain-desainnya. Sebuah tonggak utama dicapai dengan merilis versi 0.5, yang dianggap sebagai versi pertama dari proyek ini dan siap digunakan oleh pengadopsi awal.

    Google terus merevisi desain Polymer setelah merilis Polymer versi 0.5, dengan pertimbangan khusus diberikan kepada masalah kinerja yang ditemukan oleh sejumlah pengembang. Proyek ini memuncak dengan merilis Polymer 1,0 pada tahun 2015, yang merupakan versi pertama "siap produksi". Versi 1.0 secara signifikan meningkatkan kinerja Polymer, mengurangi beban hingga 7 kali lipat. Dengan versi 1.0 Google membagi elemen dari proyek Polymer dan membedakan katalog elemen dari Polymer polyfill & webcomponents-sugaring.

    Itu tadi sedikit penjelasan tentang proyek Polymer yang dikembangkan oleh Google. Sekarang saya akan memberikan petunjuk langkah demi langkah ntuk memulai membuat proyek menggunakan polymer.

    Menginstall Polymer Cli(Command Line Interface)


    Untuk mempermudah kita akan menggunakan polymer-cli yang dapat diinstall melalui npm, untuk dapat menggunakan npm Anda perlu menginstall Nodejs pada PC/Mac Anda yang dapat di download di nodejs.org.
    Setelah Anda menginstall Nodejs bukalah terminal/cmd kemudian gunakan perintah berikut untuk menginstall polymer-cli.

    Mac :
    sudo npm install -g polymer-cli

    Windows :
    npm install -g polymer-cli

    Tunggu hingga proses instalasi selesai. Jika telah selesai ada baiknya kita menginstall bower terlebih dahulu, bower digunakan untuk mendownload beberapa komponen dari proyek polymer termask beberapa library pihak ketiga yang dibutuhkan, Anda juga dapat mendownload library lain menggunakan bower.

    Untuk menginstall bower gunakan perintah berikut pada terminal/cmd.

    Mac :
    sudo npm install -g bower

    Windows :
    npm install -g bower

    Setelah Anda menginstall bower, buatlah folder baru untuk menempatkan proyek polymer lalu buka terminal/cmd pada folder tersebut. Gunakan perintah berikut untk menginisialisasikan proyek polymer.

    polymer init

    Saat Anda menjalankan perintah diatas tunggulah beberapa saat, nantinya akan ada 4 pilihan :
    element : template kosong untuk membat elemen.
    application : template aplikasi kosong.
    shop : template toko online.
    app-drawer-template : template dengan menu drawer dan 3 tampilan berbeda.

    Anda dapat memilih yang mana saja untuk memulai kemudian tekan Enter pada keyboard.  Setelah itu Anda akan diminta menentukan nama aplikasi, nama elemen utama dan penjelasan tentang project Anda. Tunggulah beberapa saat hinga proses inisialisasi selesai. Proses ini akan memakan waktu beberapa menit terlebih jika Anda memilih template shop. Disini polymer-cli akan otomatis mendownload beberapa library dan template yang akan digunakan pada proyek Anda.

    Mungkin itu saja yang dapat saya jelaskan pada postingan kali ini, untuk pembahasan lebih lanjut tentang penggunaan polymer mungkin akan saya teruskan pada posting-postingan selanjutnya.

    Semoga bermanfaat ...!! :)

    Wednesday, June 15, 2016

    June 15, 2016

    Kombinasi HTML, CSS3 Dan Javascript Bagian 2



    Setelah di postingan sebelumnya saya sudah sedikit menjelaskan tentang apa itu javascript, maka di postingan kali ini kita akan mencoba beberapa fitur yang ada di CSS3 sekaligus mengkombinasikannya dengan javascript.

    Rounded Corners (Sudut Tumpul)

    Pertama kita mulai dengan Sudut Tumpul atau yang sering disebut dengan Rounded Corners.
    Di CSS3 kita dapat membuat suatu objek memiliki sudut tumpul atau rounded corners dengan menambahkan properti border-radius. berikut contoh penggunaan border-radius pada tombol dengan css yang ditulis menggunakan cara penulisan Embadded Stylesheet.


    <html>
    <head>
    <style>
    .btn{
    border-radius: 5px;
    }
    </style>
    </head>
    <body>
    <button class="btn">button</button>
    </body>
    </html>

    Hasil Output :



    Color Gradient (Warna Gradien)

    Jika Anda sering bermain dengan software editing foto seperti Photoshop mungkin Anda sudah tidak asing dengan apa yang disebut dengan warna gradien. warna gradien(sering disebut dengan warna ramp atau warna deret) menentukan berbagai warna tergantung dari posisi, biasanya digunakan untuk mengisi suatu objek. Warna yang dihasilkan bervariasi terus-menerus dengan posisi, sehingga menghasilkan transisi warna yang halus. Terdapat beberapa variasi warna gradien yang dapat kita gunakan di CSS3 namun disini saya hanya menunjukkan cara penggunaan warna gradien yang biasa yaitu dari atas kebawah.


    berikut contoh cara penggunaan warna gradient di CSS3 :


    <html>
    <head>
    <style>
    .gradient{
    background: linear-gradient(cyan, whitesmoke);
    height: 50px;
    width: 100%;
    }
    </style>
    </head>
    <body>
    <div class="gradient"></div>
    </body>
    </html>
    Hasil output :






    Shadows(Bayangan)

    Pada CSS3 juga terdapat efek bayangan yang dapat kita gunakan untuk memberikan efek bayangan pada suatu objek atau teks Berkut contoh efek bayangan pada text




    <html>
    <head>
    <style>
    span{
    text-shadow: 2px 2px;
    }
    </style>
    </head>
    <body>
    <span></div>
    </body>
    </html>

    Hasil output :
    Teks Dengan efek bayangan

    kemudian untuk memberikan efek bayangan pada sebuah objek biasanya menggunakan properti box-shadow.


    <html>
    <head>
    <style>
    .shadow{
    height: 50px;
    width: 50px;
    box-shadow:10px 10px;
    }
    </style>
    </head>
    <body>
    <span></div>
    </body>
    </html>

    Hasil Output :


    Itu tadi beberapa fitur baru di CSS3, untuk postingan selanjutnya saya akan membahas tentang properti Transform,Animaton dan Transition serta menggabungkannya dengan javascript.


    Semoga bermanfaat !!!

    Friday, June 10, 2016

    June 10, 2016

    Kombinasi HTML, CSS3 Dan Javascript



    Setelah Sebelumnya saya telah membahas tentang CSS pada artikel CSS(Cascading Stylesheet) dimana disana saya menjelaskan beberapa dasar cara menggunakan CSS, maka pada postingan kali ini saya akan sedikit membahas tentang CSS3 dimana CSS3 merupakan pengembangan dari CSS, sehingga dalam dasar penggunaanya tidak berbeda dengan CSS.

    Di CSS3 terdapat beberapa penambahan fitur diantaranya adalah :

    • Box Model
    • Efek Teks
    • Transformasi 2D/3D 
    • Animasi
    • Layout multi kolom
    • dll.
    Disini saya menganggap Anda telah mengerti cara penggunaan CSS dan HTML, jika belum, Anda dapat membaca artikel CSS(Cascading Stylesheet) untuk mengetahui apa itu CSS dan bagaimana dasar penggunaannya, dan artikel Pengertian HTML, Dasar Penggunaan HTML untuk mengetahui apa itu HTML dan bagaimana Dasar penggunaan dari HTML.

    Sekarang saya akan sedikit membahas tentang Javascript.

    Apa itu Javascript ?


    Javascript adalah bahasa pemrograman tingkat tinggi yang banyak digunakan di internet dan dapat bekerja di beberapa web browser populer seperti Internet Explorer/Edge, Netscape, Opera, Mozilla Firefox dan Chrome.

    Kode javascript biasanya dituliskan dalam bentuk fungsi diantara tag
    <script type="text/javascript"> dan </script > atau ditulis didalam file yang berbeda.



    Sejarah Javascript

    JavaScript pertama kali dikembangkan oleh Brendan Eich dari Netscape di bawah nama Mocha, yang tadinya namanya diganti menjadi LiveScript, dan akhirnya menjadi JavaScript.


    Navigator sebelumnya telah mendukung Java untuk lebih bisa dimanfaatkan para programmer yang non-Java. Maka dikembangkanlah bahasa pemrograman bernama LiveScript untuk mengakomodasi hal tersebut. Bahasa pemrograman inilah yang akhirnya berkembang dan diberi nama JavaScript, walaupun tidak ada hubungan bahasa antara Java dengan JavaScript.


    JavaScript bisa digunakan untuk banyak tujuan, misalnya untuk membuat efek rollover baik di gambar maupun teks, dan yang penting juga adalah untuk membuat AJAX(Asynchronus Javascript XMLHTTP). JavaScript adalah bahasa yang digunakan untuk AJAX.


    Itu tadi sedikit penjelasan tentang Apa itu Javascript dan sejarah singkatnya, saya akan mulai menjelaskan bagaimana cara menggunakan Javascript bersama dengan HTML dan CSS3 pada postingan selanjutnya.

    Wednesday, June 1, 2016

    June 01, 2016

    CRUD Di PHP Menggunakan Database SQLite



    Pada kesempatan kali ini saya akan mencoba menunjukkan bagaimana cara menggunakan SQLite di PHP dan melakukan fungsi CRUD. Sebelum memulai pastikan Anda membaca terlebih dahulu artikel Mengenal SQLite dan pastikan juga Anda sudah memiliki Web Server terinstall pada PC/Laptop Anda dan support SQLite3. Saran saya install xampp versi terbaru di apachefriends.org

    Setelah Anda sudah yakin bahwa Web Server Anda support SQLite3 sekarang saatnya memulai.

    Buatlah file PHP baru menggunakan IDE atau Text Editor favorit Anda, disini saya tidak akan memaksa Anda menggunakan IDE yang saya gunakan :D. Beri nama file tersebut koneksi.php. Nantinya file ini yang akan kita gunakan untuk membuat database baru serta koneksi ke database SQLite dan melakukan fungsi-fungsi lain untuk berkomunikasi dengan database menggunakan query sql seperti membuat tabel baru dan lain sebagainya.

    Dalam pembuatan file ini kita menggunakan Class, jadi disini kita bermain dengan PHP OOP.
    Berikut isi dari file koneksi.php yang sudah saya buat untuk mempermudah Anda dalam melakukan proses CRUD.



    Selanjutnya buat file baru lagi beri nama index.php kemudian include file koneksi.php.
    require_once("koneksi.php");
    Sekarang kita akan mencoba membuat database baru, berikut codingnya
     
    $db = new SQLiteDatabase('test.sqlite'); //membuka file database sqlite sekaligus membuat file baru jika file tidak ditemukan
    Pada coding diatas dapat Anda lihat bahwa kita membuat variabel $db untuk merepresentasikan class dari SQLiteDatabase yang sebelumnya kita buat. Jika Anda melihat di class tersebut pada fungsi _construct dimana disitu kita membuka database sesuai dengan nama yang diberikan saat membuat objek SQLiteDatabase baru, secara otomatis jika file tidak ditemukan maka akan langsung dibuat file database baru sesuai dengan nama yang kita berikan. Sekarang kita akan coba mengecek apakah pada database memiliki tabel atau tidak dengan membaca data pada sqlite_master, tabel sqlite_master ini secara default sudah ada pada setiap database sqlite. berikut codingnya
    $count = $db->get_table_count(); //mendapatkan jumlah tabel pada database
    Dapat Anda liat bahwa saya menyimpan jumlah tabel pada variabel $count yang nantinya akan kita gunakan untuk melakukan pengecekan. Sekarang kita akan menulis kondisi menggunakan if statement. Disini saya akan mengecek apakah jumlah tabel kurang dari 1, jika ya maka buat tabel baru pada database. Disini saya membuat tabel dengan 2 kolom yaitu id dengan tipe data INTEGER dan nama dengan tipe dataVARCHAR, sedangkan yang ada di dalam kurung adalah maximal karakter atau angka yang dapat disimpan pada kolom tersebut.
    if($count < 1){ //jika jumlah tabel kurang dari 1
    //buat tabel baru dengan nama users dan membuat array baru untuk tiap kolom tabel
    $db->create_table("users",array('id' => 'INTEGER(10)',
    'nama' => 'VARCHAR(50)'
    ));
    }
    Setelah membuat tabel kita akan mencoba memasukkan data ke tabel tersebut.
    //Menambahan Data ke tabel users
    $db->add_data('users',array('id'=>'1','nama'=>'Muhammad Sayuti'));
    Sekarang kita akan menampilkan data dalam bentuk array dengan memanggil fungsi get_data.
    //Menampilkan Data dalam bentuk array
    print_r($db->get_data('users'));
    Sekarang kita akan mencoba mengupdate nama user dengan id 1 menjadi Sukirman kemudian menampilkan data dalam bentuk array.
    //Mengubah nama user dengan id 1
    if($db->update_data('users',array('nama'=>'Sukirman'),array('id'=>'1'))){
    echo "
    ";
    print_r($db->get_data('users'));
    }

    Yang terakhir kita akan mencoba untuk menghapus data yang ada pada tabel users.

    //menghapus semua data pada tabel users
    if($db->delete_data('users')){
    print_r('
    data berhasil dihapus');
    }


    Sampai disini kita sudah berhasil melakukan operasi CRUD. gimana mudah bukan ? dengan bantuan class yang sudah dibuat sebelumnya yaitu class SQLiteDatabase maka Anda tidak perlu menulis query sql lagi :D.

     Semoga bermanfaat !!!

    Full Code

    Sunday, April 17, 2016

    April 17, 2016

    Menghitung Jarak Menggunakan Rumus Haversine Di PHP


    Pada postingan kali ini saya akan mencoba memberikan contoh penggunaan rumus haversine untuk menghitung jarak antara 2 lokasi menggunakan bahasa pemrograman PHP. Untuk mengetahui apa itu haversine dapat Anda baca pada artikel Rumus Haversin atau baca selengkapnya di wikipedia

    Dalam fungsi penghitungan jarak berikut, saya menggunakan rumus haversine untuk menghitung jarak antara dua titik pada permukaan bumi yaitu garis lintang dan bujur dari kedua titik.


    gambaran umum dari fungsi:

    • Menggunakan rumus Haversine, kita menghitung jarak dalam derajat antara dua set koordinat
    • Nilai dalam derajat dikonversi menjadi kilometer (secara default), mil atau mil laut, tergantung pada kebutuhan Anda.
    • Jarak dikembalikan, dengan presisi yang dipilih (2 angka desimal secara default).
    Perlu diingat bahwa bumi tidak sepenuhnya bulat, jadi ada kemungkinan terdapat sedikit kesalahan terkait dengan rumus haversine.
    function hitungJarak($lokasi1_lat, $lokasi1_long, $lokasi2_lat, $lokasi2_long, $unit = 'km', $desimal = 2) {
    // Menghitung jarak dalam derajat
    $derajat = rad2deg(acos((sin(deg2rad($lokasi1_lat))*sin(deg2rad($lokasi2_lat))) + (cos(deg2rad($lokasi1_lat))*cos(deg2rad($lokasi2_lat))*cos(deg2rad($lokasi1_long-$lokasi2_long)))));

    // Mengkonversi derajat kedalam unit yang dipilih (kilometer, mil atau mil laut)
    switch($unit) {
    case 'km':
    $jarak = $derajat * 111.13384; // 1 derajat = 111.13384 km, berdasarkan diameter rata-rata bumi (12,735 km)
    break;
    case 'mi':
    $jarak = $derajat * 69.05482; // 1 derajat = 69.05482 miles(mil), berdasarkan diameter rata-rata bumi (7,913.1 miles)
    break;
    case 'nmi':
    $jarak = $derajat * 59.97662; // 1 derajat = 59.97662 nautic miles(mil laut), berdasarkan diameter rata-rata bumi (6,876.3 nautical miles)
    }
    return round($jarak, $desimal);
    }


    Berikut adalah contoh bagaimana cara menggunakan fungsi diatas :
    $currentLat = "-1.2380149"; //garis bujur lokasi 1
    $currentLon = "116.8381812"; //garis lintang lokasi 1
    $destLat = "-1.2301204"; //garis bujur lokasi 2
    $destLon = "116.8234827"; //garis lintang lokasi 2
    echo hitungJarak($currentLat,$currentLong, $destLat, $destLon);

    Full Code

    Friday, March 11, 2016

    March 11, 2016

    Menampilkan Gambar Pada PictureBox Di Visual Basic .Net

    Pada kesempatan kali ini saya akan menunjukkan bagaimana cara menampilkan gambar pada PictureBox di Visual Basic .NET.
    Terdapat beberapa cara untuk menampilkan gambar pada PictureBox dan disini saya akan memberikan beberapa cara yang saya ketahui serta kelebihan dan kekurangan dalam menggunakan cara tersebut.

    Pertama-tama buatlah sebuah project baru dengan memilih File > New > New Project. Kemudian Drag And Drop PictureBox dari jendela Toolbox ke form.




    1. Menampilkan Gambar Dengan Cara Standar
      Yang saya maksud dengan cara standar disini adalah cara yang biasa dilakukan oleh programmer atau developer dan yang dianjurkan oleh MSDN pada artikel
      How to: Set Pictures at Run Time dan How to: Load a Picture Using the Designer

      Kelebihan
      Mudah diimplementasikan terutama bagi programmer/developer pemula.

      Kekurangan
      Ada kemungkinan gambar yang diload/ditampilkan ke PictureBox akan dilock/dikunci untuk digunakan oleh user yang mengakses gambar tersebut, sehingga user lain tidak dapat mengakses  gambar tersebut.



      Menampilkan Gambar Saat Runtime
      - copy file gambar ke folder bin > Debug jika running configuration pada Visual Studio Any CPU, copy file gambar ke bin > x64 > Debug jika x64, copy file gambar ke bin > x86 > Debug jika running configuration x86.
      - Drag And Drop PictureBox dari Toolbox ke Form kemudian klik 2x pada form dan copy coding berikut :

      PictureBox1.Load("image.png")

      atau

      Dim image as Image = Image.FromFile("image.png")
      PictureBox1.Image = image

      Menampilkan Gambar Menggunakan Form Designer

    2. Menampilkan Gambar Dengan Menggunakan MemoryStream
      Cara ini merupakan cara yang paling efektif untuk menampilkan gambar dengan ukuran yang tidak terlalu besar. Selain itu dalam segi performance MemoryStream lebih cepat dibandingkan dengan cara standar. Namun untuk beberapa kondisi tertentu semua tergantung dari jumlah memory dari user. Masalah yang sering ditemui oleh programmer/developer dalam penggunaan cara ini yaitu OutOfMemoryException. Jika Anda ingin menggunakan MemoryStream untuk memuat gambar ke PictureBox sebaiknya Anda memastikan bahwa ukuran gambar tidak terlalu besar. Untuk menggunakan MemoryStream copykan coding berikut :

      Dim stream As IO.MemoryStream = New IO.MemoryStream()
      Dim bmp As Bitmap = New Bitmap("vbnet.jpg.")
      bmp.Save(stream, Imaging.ImageFormat.Jpeg)
      PictureBox1.Image = Image.FromStream(stream)
      stream.Close()

    Thursday, February 4, 2016

    February 04, 2016

    Mengisi Data Dari Mysql Ke DataGridView Di Visual Basic .Net


    Pada postingan kali ini kita akan mencoba untuk mengisi data dari database mysql ke DataGridView di Visual Basic .Net. Sebelum memulai pastikan Anda telah menginstall Mysql Connector untuk Visual Studio, jika belum Anda dapat mendownload dll library yang saya berikan pada akhir postingan ini.

    Nantinya hasil akhir dari program akan menjadi seperti berikut :




    Berikut langkah-langkahnya :

    1. Buatlah project baru dengan memilih File > New > Project

    2. Masukkan beberapa control dan ubah name serta text pada masing-masing control sesuai dengan tabel berikut
      NameTextType
      server-TextBox
      user-TextBox
      password-TextBox
      cmbDatabase-ComboBox
      Label1ServerLabel
      Label2UserLabel
      Label3PasswordLabel
      Label4DatabaseLabel
      DGV-DataGridView
      showDataShow DataButton
      getDatabaseGet DatabaseButton
    3. Sesuaikan letak setiap control sesuai dengan gambar hasil akhir program.
    4. Sekarang inisialisasikan variabel yang akan kita gunakan
      Dim conn As MySqlConnection
      Dim cmd As MySqlCommand
      Dim dr As MySqlDataReader
      Dim connStr As String
    5. Setelah itu klik 2x pada button Get Database kemudian masukan coding berikut
      If Not conn Is Nothing Then ' Jika ada koneksi terhubung
      conn.Close() 'tutup koneksi yang terhubung
      End If
      'Membuat ConnectionString berdasarkan data yang diisi pada textbox
      connStr = String.Format("server={0};user id={1}; password={2}; database={3};",
      server.Text, userid.Text, password.Text, cmbDatabase.Text)

      Try
      conn = New MySqlConnection(connStr) 'Membuat koneksi mysql baru
      conn.Open() 'Membuka koneksi mysql
      GetDatabases() 'sub untuk mengambil daftar database di mysql dan menambahkannya ke cmbDatabase
      conn.Close() 'menutup koneksi
      Catch ex As MySqlException
      MessageBox.Show("Error connecting to the server: " + ex.Message)
      End Try
    6. Buat sub baru & beri nama GetDatabase atau copy coding berikut
      Private Sub GetDatabases()
      Dim cmd As New MySqlCommand("SHOW DATABASES", conn)
      Try
      dr = cmd.ExecuteReader()
      ComboBox1.Items.Clear()

      While (dr.Read())
      ComboBox1.Items.Add(dr.GetString(0))
      End While
      Catch ex As MySqlException
      MessageBox.Show("Failed to populate database list: " + ex.Message)
      Finally
      If Not dr Is Nothing Then dr.Close()
      End Try

      End Sub
    7. Kembali ke desain tampilan form kemudian klik 2x pada tombol Show Database, masukkan coding berikut
      If conn Is Nothing Or Not conn.State = ConnectionState.Open Then 'jika tidak ada koneksi atau koneksi mysql tidak dibuka
      'Membuat ConnectionString berdasarkan data yang diisi pada textbox
      connStr = String.Format("server={0};user id={1}; password={2}; database={3};",
      server.Text, userid.Text, password.Text, ComboBox1.Text)
      'Membuat koneksi mysql baru
      conn = New MySqlConnection(connStr)
      'membuka koneksi mysql
      conn.Open()
      End If
      'mysqlcommand untuk memilih semua kolom pada tabel user
      cmd = New MySqlCommand("Select * from user", conn)
      dr = cmd.ExecuteReader
      'Membersihkan Semua Baris di DataGridView
      DGV.Rows.Clear()
      Do While dr.Read
      'Menambahkan baris baru pada DataGridView
      DGV.Rows.Add(dr.Item("id"), dr.Item("nama"), dr.Item("gender"), dr.Item("no_hp"))
      Loop
      conn.Close()
    8. Kembali ke tampilan desain form kemudian tambahkan 4 kolom pada DataGridView


    9. Untuk servernya Anda bisa menggunakan xampp yang bisa didownload disini, setelah itu buat database baru di mysql melalui phpmyadmin dan import sql yang dapat Anda download disini ke database yang Anda buat.

    Hasil Akhir



    Cara import Mysql Connector Dll file dapat Anda lihat tutorialnya melalui video berikut



    Semoga Bermanfaat :)