menu

Review - Custom server VS serverpilot


Hello everyone,

Kali ini codedoct akan mencoba sebuah experiment untuk membandingkan sebuah server yang dibuat dengan custom/manual konfigurasi dan server yang dibuat dan dimaintenance dengan menggunakan serverpilot.

Serverpilot merupakan sebuah aplikasi atau engine yang dibuat untuk mempermudah seorang developer dalam membuat, menjalankan, dan maintenance websitenya pada sebuah server.

Bagi anda yang tidak terlalu paham dengan OS server seperti Ubuntu, centOS dan sejenisnya, serverpilot tentu sangat membantu dalam hal mengkonfigurasi webserver anda, karena dengan serverpilot anda tidak perlu lagi mengkonfigurasi apapun seperti install php, enable site, konfigurasi HOST, dan lain-lain pada server, karena serverpilot sudah mengatur semuanya untuk anda.

Dengan konfigurasi yang serba otomatis lalu bagaimana dengan performa server yang diinstall dengan menggunakan serverpilot ini?

Berikut ringkasannya,





Dari data-data tersebut dapat kita lihat bahwa performa server yang dikonfigurasi dengan serverpilot cukup bagus dan tidak kalah dibandingkan dengan konfigurasi manual, tapi ada beberapa konfigurasi yang dapat kita lakukan dengan mudah pada server custom, tapi sangat sulit jika dikonfigurasikan pada serverpilot. Dan satu hal lagi, serverpilot ini tidak gratis hehehe..

===DONE!!!===

Visual Basic - Membuat sistem (CRUD) Update dan Delete


Melanjutkan tutorial sebelumnya, tutorial kali ini kita akan melengkapi project kita sebelumnya dengan sistem CRUD yang lebih sempurna,

Pada tutorial kali ini kita akan melengkapi project sebelumnya dengan navigasi yang digunakan untuk mengupdate dan mendelete field database.

Oke langsung saja kita praktekan tutorialnya,

Pertama, tambahkan beberapa button baru sehingga tampak seperti ini,


Selanjutnya klik 2x button Prev dan isikan code berikut,
DataUserBindingSource.MovePrevious()

Kemudian klik 2x button Next dan isikan code berikut,
DataUserBindingSource.MoveNext()

Setelah itu klik 2x button Delete dan isikan code berikut,
DataUserBindingSource.RemoveCurrent()

Terakhir klik 2x button Close dan isikan code berikut,
Me.Close()

Full codenya terlihat seperti ini,
Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the 'Project_CRUDDataSet1.DataUser' table. You can move, or remove it, as needed.
        Me.DataUserTableAdapter.Fill(Me.Project_CRUDDataSet1.DataUser)
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        DataUserBindingSource.AddNew()
    End Sub

    Private Sub save_Click(sender As Object, e As EventArgs) Handles save.Click
        On Error GoTo SaveErr
        DataUserBindingSource.EndEdit()
        DataUserTableAdapter.Update(Project_CRUDDataSet1.DataUser)
        MessageBox.Show("Data was saved")
SaveErr:
        Exit Sub
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        DataUserBindingSource.MovePrevious()
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        DataUserBindingSource.MoveNext()
    End Sub

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        DataUserBindingSource.RemoveCurrent()
    End Sub

    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
        Me.Close()
    End Sub
End Class

Saat di "Run" tampilannya akan tampak seperti ini,



===DONE!===

Syntax - Syntax ruby


Sebelum kita masuk ke tutorial ruby on rails ada baiknya kita mengenal terlebih dahulu beberapa syntax dari ruby,

Berikut beberapa syntax ruby yang sudah codedoct rangkum

Simple Ruby
====> comment one line
#content comment

====> comment many line
=begin
content comment
=end

====> input text
gets.chomp

====> write text
print

====> write text with new line
puts

====> aritmatika
i = 2
kuadrat: i ** 2
tambah: i + 1
kurang: i - 1
bagi: i / 2 # other way: i.fdiv(2)
hasil bagi: i % 2 # output is 0

====> write variabel
v = "test"
puts "value v : "+v

====> write variabel with on string
v = "test"
puts "value v : #{v}"

caption = "A giraffe surrounded by "
caption << "weezards!"
output:
"A giraffe surrounded by weezards!"

====> many way to code
age = 26
"I am " + age.to_s + " years old."
#==> "I am 26 years old."
"I am " << age.to_s << " years old."
#==> "I am 26 years old."
"I am #{age} years old."
#==> I am 26 years old.

Looping
====> each array
v = [1, 2, 3]
v.each {|x| puts x}

====> each array with other way
v = [1, 2, 3]
v.each do |x| 
  puts x
end

====> while
i = 0
while i<=20 do
 puts i
 i += 1
end

====> repeat until
i = 0
until i==20 do
 puts i
 i += 1
end

====> for
for i in 0..20
 puts i
end

====> times
i = 0
20.times do
 puts i
 i += 1 #it same about i = i+1
end

====> loop
i = 20
loop do
  i -= 1
  next if i>=19 
  puts "#{i}"
  break if i <= 0
end

Array
====> in ruby array can write with hash syntax
php: x = array();
 or just x = [];
ruby x = Hash.new() #remember Hash write with capitalize!
 or just x = Hash.new
 or just x = {}

====> array with key
x = {
 "red" => "merah"
 "green" => "hijau"
 "black" => "hitam"
}

====> array multidimensional
x = [[1, 2, 3], ["iam", "dark", "king"]]

====> write array multidimensional
x.each {|n,v| puts "number: "+n+" value: #{v}\n"}

====> write just one value array
x = ["red", "green", "black"]
puts x[1] #will display green

====> write just one key of array multidimensional
x = {
 "red" => "merah"
 "green" => "hijau"
 "black" => "hitam"
}
puts x[red]

====> write all value of array multidimensional
x = {
 "red" => "merah"
 "green" => "hijau"
 "black" => "hitam"
}
x.each do |eng,ina|
 puts ina
end

====> sort array integer
x = [1, 4, 5, 3, 2]
x.sort! # will display [1, 2, 3, 4, 5]

====> sort array string
x = ["a", "c", "b", "d", "e"]
x.sort! # will display ["a", "b", "c", "d", "e"]

====> sort with other way
books = ["Charlie and the Chocolate Factory", "War and Peace", "Utopia", "A Brief History of Time", "A Wrinkle in Time"]
books.sort! { |firstBook, secondBook| firstBook <=> secondBook }
books.sort! {|firstBook, secondBook| secondBook <=> firstBook}

====> sorting array with simple way
def alphabetize(arr, rev=false)
    arr.sort!
    if rev
        arr.reverse!
    end
    return arr
end
numbers = [5, 1, 3, 8]
puts alphabetize(numbers)

====> array with semi colon
menagerie = { :foxes => 2,
  :giraffe => 1,
  :weezards => 17,
  :elves => 1,
  :canaries => 4,
  :ham => 1
}
output: {:foxes=>2, :giraffe=>1, :weezards=>17, :elves=>1, :canaries=>4, :ham=>1}

====> push array with push
strings = ["HTML", "CSS", "JavaScript", "Python", "Ruby"]
symbols = []
strings.each do |s|
    s = s.to_sym
    symbols.push(s)
end
easy way with this:
alphabet = ["a", "b", "c"]
alphabet << "d"
output:
["a", "b", "c", "d"]

====> push array multidimensional
movies = {
    "warkop" => "4",
    "deadpool" => "4"
}
puts "what is movie title?"
title = gets.chomp
puts "how about the rating?"
rating = gets.chomp
movies[title] = rating
output:
{"warkop"=>"4", "deadpool"=>"4"}
what is movie title?
 jumanji
how about the rating?
 3
movie was added!
{"warkop"=>"4", "deadpool"=>"4", "jumanji"=>"3"}

Symbol
====> symbol not use string
movies = {
    :warkop => "comedy",
    :jumanji => "advanture"
}

====> other way write symbol
movies = {
    warkop: "comedy",
    jumanji: "advanture"
}

====> how fast symbol
require 'benchmark'
string_AZ = Hash[("a".."z").to_a.zip((1..26).to_a)]
symbol_AZ = Hash[(:a..:z).to_a.zip((1..26).to_a)]

====> select the symbols
movie_ratings = {
  memento: 3,
  primer: 3.5,
  the_matrix: 5,
  truman_show: 4,
  red_dawn: 1.5,
  skyfall: 4,
  alex_cross: 2,
  uhf: 1,
  lion_king: 3.5
}
good_movies = movie_ratings.select{|m,r| r > 3}
puts good_movies

====> write just key other way
movie_ratings = {
  memento: 3,
  primer: 3.5,
  the_matrix: 3,
  truman_show: 4,
  red_dawn: 1.5,
  skyfall: 4,
  alex_cross: 2,
  uhf: 1,
  lion_king: 3.5
}
movie_ratings.each {|m,r| puts m}

Condition
====> use unless for false
ruby_is_ugly = false

unless ruby_is_ugly
 puts "Ruby's not ugly!"
end

====> this is ruby
ruby_is_eloquent = true
ruby_is_ugly = false
puts "Ruby is eloquent!" if ruby_is_eloquent
puts "Ruby's not ugly!" unless ruby_is_ugly

====> Ternary
puts 1>0 ? "benar":"salah" #this is same with php he..he..he..

====> Case
puts "Hello there!"
greeting = gets.chomp
case greeting
    when "english" then puts "Hello!"
    when "french" then puts "Bonjour!"
    when "german" then puts "Guten Tag!"   
    when "finnish" then puts "Haloo!"
    else puts "I don't know that language!"
end

====> Case another way
puts "Hello there!"
greeting = gets.chomp
case greeting
    when "english"
      puts "Hello!"
    when "french"
      puts "Bonjour!"
    when "german"
      puts "Guten Tag!"   
    when "finnish"
      puts "Haloo!"
    else puts "I don't know that language!"
end

====> set value that nill
favorite_book = nil
puts favorite_book
favorite_book ||= "Cat's Cradle"
puts favorite_book
favorite_book ||= "Why's (Poignant) Guide to Ruby"
puts favorite_book
favorite_book = "Why's (Poignant) Guide to Ruby"
puts favorite_book
output:
Cat's Cradle
Cat's Cradle
Why's (Poignant) Guide to Ruby'

====> write code that divisible of 2
my_array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
my_array.each {|x| puts x if x % 2 == 0  }
output: 2
4
6
8
10

====> use upto
"L".upto("P") {|x| puts x }
output:
L
M
N
O
P
test

====> Play with array(CRUD array)
movies = {
    "warkop" => "4",
    "deadpool" => "4"
}

puts "what do you want your movie"
choice = gets.chomp

case choice
    when "add"
        puts movies
        puts "what is movie title?"
        title = gets.chomp
        if movies[title].nil?
            puts "how about the rating?"
            rating = gets.chomp
            movies[title.to_sym] = rating.to_i
            puts "movie was added!"
            puts movies
        else
            puts "that the movie already exists"
        end
    when "update"
        puts movies
        puts "What movie that you want to update rating?"
        title = gets.chomp
        if movies[title].nil?
            puts "Your movie not found!"
        else
            puts "Set the rating movie"
            rating = gets.chomp
            movies[title] = rating.to_i
            puts "rating was update!"
            puts movies
        end
    when "display"
        movies.each do |m,r|
            puts "#{m}: #{r}"
        end
    when "delete"
        puts movies
        puts "Type movie that you want to delete?"
        title = gets.chomp
        if movies[title].nil?
            puts "Movie not found!"
        else
            movies.delete(title)
            puts "That movie was deleted"
            puts movies
        end
    else puts "Error!"
end

Library
====> collect 
my_nums = [1, 2, 3]
my_nums.collect { |num| num ** 2 }
output:
[1, 4, 9]
=begin
This is because .collect returns a copy of my_nums,
but doesn't change (or mutate) the original my_nums array. 
If we want to do that, we can use .collect!
=end
my_nums.collect! { |num| num ** 2 }
=begin
Recall that the ! in Ruby means "this method could do something dangerous or unexpected!"
In this case, it mutates the original array instead of creating a new one.
=end

====> example collect
fibs = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
print "#{fibs}\n"
doubled_fibs = fibs.collect {|x| x**2}
print "#{fibs}\n"
print doubled_fibs
output:
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
[1, 1, 4, 9, 25, 64, 169, 441, 1156, 3025]
print "#{fibs}\n"
doubled_fibs = fibs.collect! {|x| x**2}
print "#{fibs}\n"
print doubled_fibs
output:
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
[1, 1, 4, 9, 25, 64, 169, 441, 1156, 3025]
[1, 1, 4, 9, 25, 64, 169, 441, 1156, 3025]

====> yield
def double(param)
    puts "yeehhaaaa"
    yield(param)
    puts "end"
end

double(2) {|x|puts x*2}
output:
yeehhaaaa
4
end

====> Proc
multiples_of_3 = Proc.new do |n|
  n % 3 == 0
end
(1..100).to_a.select(&multiples_of_3)
output:
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99] 

====> Proc with call
hi = Proc.new do
    puts "Hello!"
end
hi.call
output:
Hello!

====> floor
floats = [1.2, 3.45, 0.91, 7.727, 11.42, 482.911]

round_down = Proc.new do |x|
    x.floor
end

ints = floats.collect(&round_down)
output:
[1, 3, 0, 7, 11, 482]

====> symbols meet 
Procnumbers_array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
strings_array = numbers_array.map(&:to_s)
output:
["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]

====> lambda
def lambda_demo(a_lambda)
  puts "I'm the method!"
  a_lambda.call
end
lambda_demo(lambda { puts "I'm the lambda!" })
output:
I'm the method!
I'm the lambda!

====> wonderfull lambda
strings = ["leonardo", "donatello", "raphael", "michaelangelo"]
symbolize = lambda {|x| x.to_sym}
symbols = strings.collect(&symbolize)
output:
[:leonardo, :donatello, :raphael, :michaelangelo]

====> different proc and lambda?
def batman_ironman_proc
  darkking = Proc.new { return "Batman will win!" }
  darkking.call
  "Iron Man will win!"
end

puts batman_ironman_proc

def batman_ironman_lambda
  darkking = lambda { return "Batman will win!" }
  darkking.call
  "Iron Man will win!"
end

puts batman_ironman_lambda

output:
Batman will win! #this is pro
Iron Man will win! #this is lambda

====> filter with array
my_array = ["raindrops", :kettles, "whiskers", :mittens, :packages]
symbol_filter = lambda {|x| x.is_a? Symbol}
symbols = my_array.select(&symbol_filter)
output:
[:kettles, :mittens, :packages] 

Method
====> method
def name_method
  content_method
end

====> method with return boolean
def is_true?
  content_method
end

====> method with parameter
def welcome(name)
  return "Hello #{name}"
end
welcome("Dark King")

====> to string, float, integer, simbol
i = 2
i.to_s
i.to_f
i.to_i
i.to_sym

====> sorting array with method
def alphabetize(arr, rev=false)
  if rev
    arr.sort { |item1, item2| item2 <=> item1 }
  else
    arr.sort { |item1, item2| item1 <=> item2 }
  end
end
books = ["Heart of Darkness", "Code Complete", "The Lorax", "The Prophet", "Absalom, Absalom!"]
puts "A-Z: #{alphabetize(books)}"
puts "Z-A: #{alphabetize(books, true)}"

====> the function semicolon
puts "string".object_id
puts "string".object_id
puts :symbol.object_id
puts :symbol.object_id
output:
15100680
15100480
319848
319848

string_time = Benchmark.realtime do
  100_000.times { string_AZ["r"] }
end
symbol_time = Benchmark.realtime do
  100_000.times { symbol_AZ[:r] }
end
puts "String time: #{string_time} seconds."
puts "Symbol time: #{symbol_time} seconds."

====> class
class Computer
  $manufacturer = "Mango Computer, Inc."
  @@files = {hello: "Hello, world!"}
  def initialize(username, password)
    @username = username
    @password = password
  end
  def current_user
    @username
  end
  def self.display_files
    @@files
  end
end

# Make a new Computer instance:
hal = Computer.new("Dave", 12345)
puts "Current user: #{hal.current_user}"
# @username belongs to the hal instance.
puts "Manufacturer: #{$manufacturer}"
# $manufacturer is global! We can get it directly.
puts "Files: #{Computer.display_files}"
# @@files belongs to the Computer class.
output:
Current user: Dave
Manufacturer: Mango Computer, Inc.
Files: {:hello=>"Hello, world!"}

====> you can do thisclass ApplicationError
  def display_error
    puts "Error! Error!"
  end
end
class SuperBadError < ApplicationError
end
err = SuperBadError.new
err.display_error
output:
Error! Error!

====> Override class
class Creature
  def initialize(name)
    @name = name
  end
  def fight
    return "Punch to the chops!"
  end
end
class Dragon < Creature
   def fight
       return "Breathes fire!"
   end
end
show = Dragon.new
puts show.fight
output:
Breathes fire!

====> OOP
class Account
    attr_reader :name, :balance
    def initialize(name,balance=100)
        @name = name
        @balance = balance
    end
    private 
    def pin
        @pin = 1234
    end
    def pin_error
        return "Access denied: incorrect PIN."
    end
    public
    def display_balance(pin_number)
        if pin_number == pin
            puts "Balance: $#{@balance}."
        else
            pin_error
        end
    end
    def withdraw(pin_number,amount)
        if pin_number == pin
            puts "Withdrew #{amount}. New balance: $#{@balance}."
        else
            pin_error
        end
    end
end
checking_account = Account.new("Conteriano",10_000_000)
puts checking_account.display_balance(4321)
puts checking_account.display_balance(1234)
puts checking_account.withdraw(4321,10001)
puts checking_account.withdraw(1234,10001)
output:
Access denied: incorrect PIN.
Balance: $10000000.
Access denied: incorrect PIN.
Withdrew 10001. New balance: $10000000.

===DONE!!!===

Visual Basic - Membuat sistem (CRUD) Create dan Read


Pada tutorial sebelumnya kita sudah membuat sebuat koneksi database pada project visual studio kita, tutorial kali ini akan mempraktekkan cara membuat operation database untuk "create new data",

Oke langsung saja kita mulai,

Pertama, buka kembali file project kita sebelumnya, dengan tampilan seperti ini,


Klik dua kali button New dan ketikan code berikut,
DataUserBindingSource.AddNew()
Perhatikan pada code diatas code DataUserBindingSource merupakan nama database yang dibuat sehingga sesuaikan dengan nama database yang anda buat, kita bisa melihat nama bindingnya pada tanda kuning gambar diatas,,

Kemudian klik dua kali button Save dan ketikkan code berikut,
On Error GoTo SaveErr
        DataUserBindingSource.EndEdit()
        DataUserTableAdapter.Update(Project_CRUDDataSet.DataUser)
        MessageBox.Show("Data was saved")
SaveErr:
        Exit Sub
Sesuaikan Dataset, Binding, dan TableAdapter sesuai dengan yang anda miliki dapat dilihat pada tanda kuning pada gambar diatas,,

Sehingga tampilan keseluruhan code akan tampak seperti ini,
Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the 'Project_CRUDDataSet.DataUser' table. You can move, or remove it, as needed.
        Me.DataUserTableAdapter.Fill(Me.Project_CRUDDataSet.DataUser)

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        DataUserBindingSource.AddNew()
    End Sub

    Private Sub save_Click(sender As Object, e As EventArgs) Handles save.Click
        On Error GoTo SaveErr
        DataUserBindingSource.EndEdit()
        DataUserTableAdapter.Update(Project_CRUDDataSet.DataUser)
        MessageBox.Show("Data was saved")
SaveErr:
        Exit Sub
    End Sub
End Class

Dan tampilanya akan tampak seperti ini jika di "run"


===DONE!===

Visual Basic - Koneksi database


Hello everyone, senang bisa kembali coding visual basic,,

Kemarin kita sudah membuat sebuah operation file pada file txt, tutorial kali ini akan mempraktekkan cara membuat sebuah koneksi database pada Visual Studio 2013 dengan tipe database Microsoft Access.

Ada banyak tipe database yang bisa digunakan pada Visual Basic tapi untuk kali ini kita akan menggunakan Microsoft Access.

Oke, langsung saja kita mulai tutorialnya.

Pertama buat file Access terlebih dahulu seperti ini.
Pilih blank database dan create


Kemudian akan muncul halaman database anda yang baru dibuat, klik kanan pada table1 dan pilih Design View masukkan nama tabel dan ok.



Selanjutnya masukan nama kolom dan tipe seperti pada gambar berikut.


Dan terakhir save.
Kita sudah selesai membuat file database yang akan kita gunakan pada visual studio, Selanjutnya buat project visual studio baru dan masukkan file database yang baru dibuat tadi satu folder bersama folder project visual studio kita (jika tidak mengerti silahkan pelajari tutorial sebelumnya pada submenu visual studio).

Buat design form visual studio seperti ini.


Untuk membuat GroupBox2 gunakan tool DataGridView,


Dan tampilannya akan tampak seperti ini, jika database belum terkoneksi maka tampilannya akan blank seperti ini.


Klik tombol berwarna kuning dan pilih Add Project Data Source,


Kemudian akan muncul tampilan seperti ini,


Tinggal next saja kemudian pilih Dataset dan next lagi setelah itu akan muncul tampilan berikut,


Data source pilih microsoft access database, kemudian browse database yang baru kita buat tadi dan klik Test Connection, jika error karena database tidak support, maka buka kembali file database access dan save as sebagai file access 2002-2003, coba lagi test connection muncul tampilan berikut,


Klik ok dan klik next kemudian pilih no saja,


Klik next lagi, centang tables dan view dan klik finish. Sehingga tampilan DataGridView akan tampak seperti table yang sudah kita buat pada microsoft access,
Selanjutnya Sinkronisasikan tiap kolomnya dengan form yang ada, caranya klik salah satu text box misalkan text box address kemudian pada properties databindings masukan parameter text sesuai dengan nama kolomnya(misal form address maka databindingsnya adalah kolom address) seperti ini,



Sehingga akan seperti ini hasilnya,


Untuk mengedit tampilan pada DataGridView klik kembali tanda kuning berikut,


Dan klik Edit Columns seperti berikut, buat kolom ID tidak terlihat,


Sekarang "run" dan tampilanya akan tampak seperti ini,


===DONE!===

Laravel - Localization (Multilanguage Laravel)


Pada tutorial laravel sebelumnya kita sudah membahas tentang membuat sebuah pagination pada Laravel, Tutorial kali ini kita akan membuat translate pada website atau Localization.

Website multilanguage ini sangat berguna bagi website yang memiliki pengunjung website sampai keluar negeri, itulah sebabnya kita membutuhkan sebuah feature untuk mentranslate website kita.

Oke, langsung saja kita mulai tutorialnya..

Pertama, edit dulu halaman home yang akan menjadi contoh view translatenya, dalam hal ini codedoct menggunakan file dengan nama hello.blade yang terletak pada path protected/app/views/web/ isi dengan code berikut,
@extends('layouts/web/master')

<?php $title = "Welcome" ?>

@section('script')
@stop

@section('content')
<div class="isi">
 <h4>{{ trans('translate.welcome_to_codedoct'); }}</h4>
 <br>
 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sunt facilis, dolore similique maiores? Doloribus, asperiores. Iusto debitis tempora velit repellat sed autem, quaerat commodi, necessitatibus soluta quos libero voluptatibus eum.</p>
 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sunt facilis, dolore similique maiores? Doloribus, asperiores. Iusto debitis tempora velit repellat sed autem, quaerat commodi, necessitatibus soluta quos libero voluptatibus eum.</p>
 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sunt facilis, dolore similique maiores? Doloribus, asperiores. Iusto debitis tempora velit repellat sed autem, quaerat commodi, necessitatibus soluta quos libero voluptatibus eum.</p>
</div>
@stop

Selanjutnya, pastikan file view tersebut memiliki controller jika belum silahkan buat file controller baru dengan nama HomeController.php pada path protected/app/controllers/ isikan code berikut,
<?php

class HomeController extends BaseController {

 /*
 |--------------------------------------------------------------------------
 | Default Home Controller
 |--------------------------------------------------------------------------
 |
 | You may wish to use controllers instead of, or in addition to, Closure
 | based routes. That's great! Here is an example controller method to
 | get you started. To route to this controller, just add the route:
 |
 | Route::get('/', 'HomeController@showWelcome');
 |
 */

 public function showWelcome()
 {
  return View::make('web.hello');
 }

}

Kemudian edit file route yang bernama web.php pada path protected/app/routes/ edit dengan menambahkan code berikut,
.
.
.
//Localization
Route::get('lang/{lang}', function($lang)
{
    Session::put('lang', $lang);
    return Redirect::back();
});
.
.
.

Setelah itu, edit file global.php pada path protected/app/start/ dengan menambahkan code berikut,
.
.
.
//language
App::setLocale(Session::get('lang', 'en'));

Edit pula file Header.blade.php pada path protected/app/views/layouts/web/ menjadi seperti ini,
.
.
.
     <div class="dropdown-script">
      <button onclick="myFunction()" class="dropbtn btn btn-default">Translate</button>
      <div id="myDropdown" class="dropdown-content-script">
        <a href="{{ URL::to('lang/en') }}">English</a>
        <a href="{{ URL::to('lang/ina') }}">Indonesia</a>
      </div>
     </div>
.
.
.

Dan edit file constants.php pada path protected/app/ tambahkan code berikut,
.
.
.
// Localization
define('trans', 'Lang::get');

Terakhir, buat folder baru dengan nama ina pada path protected/app/lang/ dan buat file baru dengan nama translate.php pada folder ina dan folder en sehingga akan tampak seperti ini,


Isikan code berikut pada masing-masing file translate.php
translate.php (ina)
<?php

return array(
    'welcome_to_codedoct' => 'Selamat datang di Codedoct.com'
);

translate.php (en)
<?php

return array(
    'welcome_to_codedoct' => 'Welcome to Codedoct.com'
);

Dan hasil akhirnya akan tampak seperti ini.



===DONE!===

Engine PHP - Pagination


Setelah pada tutorial sebelumnya, kita sudah membuat Paginasi dengan menggunakan Laravel, Tutorial kali ini akan membahas tentang membuat Paginasi menggunakan jQuery, tentu saja Paginasi yang akan dihasilkan menggunakan jQuery ini akan jauh lebih bagus karena Paginasi menggunakan jQuery ini tidak membutuhkan reload URL.

Oke langsung saja kita buat enginenya,

Buat sebuah file PHP dan masukkan code berikut,
<style>
 li.content{
  list-style: none;
  border: 1px solid #ddd;
  padding: 8px;
  width: 100px;
  display: inline-block;
 }
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
 //paginate
 $(function(){
  showPage(1);
 });
 function prevPage(button)
 {
  var max_page = $('.list-content').find('input[name=max_page]').val();
  var pages = $('.list-content').find('.prev').data('pages');
  var page_show = pages - 1;
  $('.list-content').find('.prev').data('pages', page_show);
  $('.list-content').find('.next').data('pages', page_show);
  $('.list-content').find('span.current-page').html(page_show);
  if (page_show == 1) {
   $(button).prop('disabled', true);
  }
  if (page_show < max_page) {
   $('.list-content').find('.next').prop('disabled', false);
  }
  showPage(page_show);
 }
 function nextPage(button)
 {
  var max_page = $('.list-content').find('input[name=max_page]').val();
  var pages = $('.list-content').find('.next').data('pages');
  var page_show = pages + 1;
  $('.list-content').find('.next').data('pages', page_show);
  $('.list-content').find('.prev').prop('disabled', false);
  $('.list-content').find('.prev').data('pages', page_show);
  $('.list-content').find('span.current-page').html(page_show);
  if (page_show==max_page) {
   $(button).prop('disabled', true);
  }
  showPage(page_show);
 }
 function showPage(page)
 {
  var max_page = $('.list-content').find('input[name=max_page]').val();
  pageSize = 4;
  $(".list-content").find('.content').hide();
     $(".list-content").find('.content').each(function(n) {
         if (n >= pageSize * (page - 1) && n < pageSize * page)
             $(this).show();
     });
     if (max_page==1) {
   $('.list-content').find('.next').prop('disabled', true);
     };
 }
 //end paginate
</script>
<?php
 $buah = array(
  '0' => array(
   'name' => 'jeruk',
   'warna' => 'orange',
  ),
  '1' => array(
   'name' => 'apel',
   'warna' => 'merah',
  ),
  '2' => array(
   'name' => 'anggur',
   'warna' => 'ungu',
  ),
  '3' => array(
   'name' => 'durian',
   'warna' => 'kuning',
  ),
  '4' => array(
   'name' => 'jambu',
   'warna' => 'hijau',
  ),
  '5' => array(
   'name' => 'melon',
   'warna' => 'hijau',
  ),
  '6' => array(
   'name' => 'semangka',
   'warna' => 'hijau',
  ),
  '7' => array(
   'name' => 'nanas',
   'warna' => 'kuning',
  ),
  '8' => array(
   'name' => 'manggis',
   'warna' => 'ungu',
  ),
 );

 //paginate 4/page
 $total_buah = count($buah);
 $whole = $total_buah/4;
 if (is_integer($whole)) {
  $floor = floor($whole);
  $max_page = $floor;
 } else {
  $floor = floor($whole);
  $max_page = $floor + 1;
 }
?>

<div class="list-content">
 <input type="hidden" name="max_page" value="<?=$max_page;?>">
 <?php foreach ($buah as $info_buah) { ?>
  <li class="content">
   <?=$info_buah['name'].'<br>'.$info_buah['warna'];?>
  </li>
 <?php } ?>
 <br>
 <br>
 <br>
 <div class="paginate text-center">
  <button type="button" disabled onclick="prevPage(this)" data-pages="" class="prev">Prev</button> | <span class="current-page">1</span> of <?=$max_page;?> | <button type="button" onclick="nextPage(this)" data-pages="1" class="next">Next</button>
 </div>
</div>


Kemudian buka url file tersebut di localhost(untuk membuka url file diperlukan akses internet karena engine menggunakan script jQuery yang di load dari internet).

Sehingga hasilnya akan tampak seperti ini,


===DONE!!!===