15 Dis 2016

Load Balancing dengan Nginx dan Puma

Load Balancing dengan Nginx dan Puma


Tutorial ini adalah sangat ringkas hanya untuk menunjukkan kebolehan nginx sebagai load balancer yang dapat menjadi 'orang tengah' antara banyak server di belakangnya

Keperluan

1. Paling kurang 2 server aplikasi
2. Satu server diinstall nginx


Contoh Persekitaran yang sekarang


1. server1:
os: debian
application: ruby on rails
web server : puma
dns : myaplication1.yusdirman.com

2. server2: myaplication2.yusdirman.com
os:debian
application: ruby on rails
web server : puma
dns : myaplication1.yusdirman.com

3. nginx diinstall di server1


/ets/nginx/nginx.conf setup (default):

worker_processes  2;
worker_processes  auto;
worker_rlimit_nofile 65536;

error_log  logs/error.log  notice;
error_log  logs/error.log  info;

events {
  worker_connections  65536;
}

http {
  include       mime.types;
  default_type  application/octet-stream;
  sendfile        on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout  65;

  gzip on;
  gzip_min_length 1000;
  gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

  include /etc/nginx/sites-enabled/*;
}



/etx/nginx/sites-available/myapplication.yusdirman.com.conf


upstream myapplication {
  server myapplication1.yusdirman.com fail_timeout=0; #localhost
  server myapplication2.yusdirman.com fail_timeout=0; #remote1
#server myapplication3.yusdirman.com fail_timeout=0; #remote2
#server myapplication4.yusdirman.com fail_timeout=0; #remote3

}

server {
  listen myapplication.yusdirman.com:80;
  server_name myapplication.yusdirman.com;

  location /{
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://myapplication;

    # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
    proxy_http_version 1.1;

    proxy_set_header Connection "";
  }

  access_log /var/log/nginx/myapplication.access.log;
  error_log /var/log/nginx/myapplication.error.log debug;

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}


bina 'soft-link' antara /etc/nginx/sites-available ke /etc/nginx/sites-enabled/


ln -s /etc/nginx/sites-avaliable/myapplication.yusdirman.com.conf /etc/nginx/sites-enabled/


Larikan aplikasi di setiap server


server myapplication1.yusdirman.com


cd /home/diman/myapplication
#puma telah disetkan sebagai default webserver
rails server -e production -b myapplication1.yusdirman.com -d 


server myapplication2.yusdirman.com


cd /home/diman/myapplication
#puma telah disetkan sebagai default webserver
rails server -e production -b myapplication2.yusdirman.com -d 


Mulakan nginx di server1 (tempat diinstall)


sudo service nginx start 

atau

sudo service nginx restart 



Nginx Load Balancing

Teknik-teknik Load Balancing dengan nginx

default: round robin
keterangan: bergilir-gilir. Capaian pertama akan ke server pertama. Capaian kedua akan ke server seterusnya

1. least_conn
keterangan: capaian akan ke server yang paling kurang akses

upstream backend {
    least_conn;

    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com down; 
}

nota: tandakan 'down' untuk server yang tidak digunakan/dibaiki.

2. ip_hash
keterangan: ditentukan oleh alamat ip klien. Akses dari IP yang sama akan ke server dengan IP yang berdekatan.

upstream backend {
    ip_hash;

    server backend1.example.com;
    server backend2.example.com;
}

3. hash
keterangan: bergantung kepada kod kunci daripada klien

upstream backend {
    hash $request_uri consistent;

    server backend1.example.com;
    server backend2.example.com;
}

4. Pemberat
keterangan: tetapkan pemberat untuk server. Jika ada 7 akses, 5 akses akan ke server backend1 dan  1 ke backend2 dan 1 ke backend3.

upstream backend {
    server backend1.example.com weight=5;
    server backend2.example.com;
    server backend3.example.com;
}


Sekian dahulu.



17 Nov 2016

Git dan Projek Aplikasi

Assalamualaikum

Mari kita terus fokus kepada pembangunan aplikasi. Senario ini biasanya berlaku dalam sesebuah jabatan yang bertanggungjawab membina aplikasi untuk organisasi atau pelanggan.


Pasukan JuruProgram


Beberapa juruprogram yang membina aplikasi yang sama akan berkongsi-kongsi kodprogram mereka samada secara online menggunakan cloud ataupun bertukar-tukar peranti storan mudah alih (ada yang buat gitu lagi ke?). Namun secara idealnya, setiap juruprogram akan menulis kod untuk modul yang berbeza bagi satu-satu aplikasi. 

Jika seorang juruprogram yang ditugaskan untuk membina fungsi tertentu, maka dia akan memeras otaknya untuk mengeluarkan idea. Biasanya dengan meminum kopi pekat sikit. Selepas itu maka diapun berjaya mengeluarkan 3 kaedah atau idea bernas untuk membina fungsi tersebut. Maka, dia akan membuat 3 salinan dan menamakan setiap salinan itu dengan nama yang berbeza-beza. Koding ditulis dan diuji satu persatu. Ketiga-tiga salinan tersebut berjaya dibina dan selepas dinilai oleh bos beliau, salah satu salinan tadi akan disalin kedalam salinan asal dan dimuatnaik semula ke server cloud.

Sangat-sangat praktikal kan? Namun, banyak masalah yang mungkin timbul dengan cara ini jika sekiranya sesuatu yang tidak diingini berlaku selepas salinan utama telah ditambah dengan kod baru. Mungkin terdapat bug yang tidak terlihat sebelum ini. Maka kita terpaksa menyelesaikan dengan seberapa segera masalah tersebut sekiranya sistem telah sedia digunakan. Ataupun, untuk setiap versi (penambahan kod) salinan utama tadi, setiapnya disimpan salinan secara berasingan dan diberikan nama yang unik dan tarikh kemaskini dan dilakukan oleh siapa. Banyangkan kita bekerja dengan 10 orang juruprogram yang sedang membangunkan aplikasi yang sama. Dalam sehari, mungkin setiap juruprogram akan meminta untuk kodprogram mereka dinilai dan dimasukkan kedalam salinan utama. 

Situasi itu sangat-sangat(SANGAT) seram untuk digambarkan.

Untuk menyelesaikan masalah ini (memudahkan) kaedah pembangunan aplikasi secara berkumpulan inilah timbulnya Git.

Dengan git, setiap juruprogram dapat membuat salinan daripada repositori utama dengan arahan:

git clone [alamat repositori]

git clone akan menyalin bukan sahaja semua fail daripada repo, bahkan juga setiap perubahan yang telah dilakukan, tarikh dan masa perubahan itu dilakukan, nama dan emel orang yang melakukan perubahan itu dan apa yang diubah. Selepas kita clone suatu repo daripada server (konsep cloud juga), juruprogram akan mendapat salinan yang 100% sama dengan apa yang ada dalam repositori utama.

contoh dibawah adalah cara untuk kita clone salah satu repo daripada github:

$\> git clone https://github.com/mischa78/boxroom.git
Cloning into 'boxroom'...
remote: Counting objects: 2995, done.
remote: Total 2995 (delta 0), reused 0 (delta 0), pack-reused 2995
Receiving objects: 100% (2995/2995), 719.42 KiB | 207.00 KiB/s, done.
Resolving deltas: 100% (1529/1529), done.
Checking connectivity... done.

Selepas arahan ini dilaksanakan, kesemua fail daripada github itu akan berada dalam komputer kita. 
(jangan risau, repo dalam github ini kesemuanya adalah opensource)

Dengan memiliki kesemua fail yang sama dengan apa yang ada dalam repositori utama, dan ianya disalin menggunakan Git, salinan dalam komputer kita itu juga merupakan satu repositori.


Repositori di Server dipanggil Remote.
Remote Server yang pertama sekali kita clone dinamakan Origin

Arahan untuk melihat Remote Server:


$\> git remote -v
origin https://github.com/mischa78/boxroom.git (fetch)

origin https://github.com/mischa78/boxroom.git (push)
Jadi, bagaimana untuk mula menulis kod? Kena buat salinan asing ke?

Git didatangkan dengan fungsi Branching. Sama seperti kita membuat salinan kogprogram, namun dengan lebih tersusun. Kita boleh membuat beberapa branch serentak sekiranya kita ada banyak idea untuk menyelesaikan satu-satu tugas.


Arahan untuk mencipta branch baru 

$\> git checkout -b add_staff_module_yusdirman
        Switched to a new branch 'add_staff_module_yusdirman'

Biasanya, apabila kita membina aplikasi beramai-ramai, kita akan tandakan branch yang kita bina itu dengan nama sendiri supaya mudah dikenalpasti nanti. 

Dari sini, tulislah kodprogram anda. simpan dan uji.

Jika dah berjaya. Commit. ...?

Dalam pengurusan kodprogram menggunakan git, setiap perubahan yang telah dibuat perlu diisytiharkan dan kemudian disahkan pula dengan menggunankan arahan git add dan git commit

Pada ketika ini, bagi sesiapa yang belum pernah menggunakan mana-mana pengurusan kodprogram sebelum ini, termonologi ini adalah sangat asing.

Git mempunyai 3 peringkat dalam setiap perubahan kod aturcara.

1. bersih (clean)

2. ada perubahan, belum dipentaskan

3. telah dipentaskan, belum dicommit

selepas dicommit, ianya akan kembali semula ke peringkat 1: Bersih


Apakah maksud ketiga-tiga peringkat ini?

1. Bersih: tiada apa-apa perubahan berlaku pada kod program. 

2. Belum dipentaskan (unstage) : terdapat perubahan pada fail. namun belum diisytiharkan untuk dimasukkan kedalam repositori

3. Telah dipentaskan (staged) tapi belum dicommit  : fail-fail yang berubah telah dikenalpasti untuk dimasukkan kedalam repo. 

Setelah juruprogram pasti dengan perubahan tersebut, dia hanya perlu commit sahaja kodprogram. Maka satu bab atau titik perbatuan telah direkodkan dalam log pembangunan aplikasi ini dan segala perubahan yang dilakukan juga direkodkan.

Mari saya tunjukkan contoh:

 selepas membina branch baru, saya telah memasukkan fail dan kod baru ke dalam aplikasi ini.

saya boleh melihat status perubahan dengan :
$\> git status
On branch add_staff_module_yusdirman
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)
modified:   config/routes.rb
Untracked files:
  (use "git add ..." to include in what will be committed)
app/assets/javascripts/staffs.coffee
app/assets/stylesheets/scaffolds.scss
app/assets/stylesheets/staffs.scss
app/controllers/staffs_controller.rb
app/helpers/staffs_helper.rb
app/models/staff.rb
app/views/staffs/
db/migrate/20161116180542_create_staffs.rb
test/controllers/
test/fixtures/staffs.yml
test/models/
no changes added to commit (use "git add" and/or "git commit -a")
Apabila arahan git status dimasukkan, setiap perubahan akan tersenarai. 

Status "Changes not staged for commit" merujuk kepada perubahan yang telah kita lakukan (telah save) namun masih belum dipentaskan untuk dicommit.

Cara untuk pentaskan fail (staging)

$\> git add [nama fail] : untuk pilih fail mana yang akan dipentaskan (stage)
atau

$\> git add . : semua perubahan pada semua fail dipentaskan

selepas itu, status fail tadi akan berubah

$\> git status
On branch add_staff_module_yusdirman
Changes to be committed:
  (use "git reset HEAD ..." to unstage)
new file:   app/assets/javascripts/staffs.coffee
new file:   app/assets/stylesheets/scaffolds.scss
new file:   app/assets/stylesheets/staffs.scss
new file:   app/controllers/staffs_controller.rb
new file:   app/helpers/staffs_helper.rb
new file:   app/models/staff.rb
new file:   app/views/staffs/_form.html.erb
new file:   app/views/staffs/edit.html.erb
new file:   app/views/staffs/index.html.erb
new file:   app/views/staffs/new.html.erb
new file:   app/views/staffs/show.html.erb
modified:   config/routes.rb
new file:   db/migrate/20161116180542_create_staffs.rb
new file:   test/controllers/staffs_controller_test.rb
new file:   test/fixtures/staffs.yml
new file:   test/models/staff_test.rb

Status "Changes to be committed" menunjukkan kesemua fail yang tersenarai itu akan dimasukkan kedalam repositori.


langkah seterusnya adalah melarikan arahan git commit

$\> git commit -m "create scaffold for staff to integrate existing staff table with boxroom for user session"
[add_staff_module_yusdirman 5368f32] 
create scaffold for staff to integrate existing staff table with boxroom for user session
 16 files changed, 326 insertions(+)
 create mode 100644 app/assets/javascripts/staffs.coffee
 create mode 100644 app/assets/stylesheets/scaffolds.scss
 create mode 100644 app/assets/stylesheets/staffs.scss
 create mode 100644 app/controllers/staffs_controller.rb
 create mode 100644 app/helpers/staffs_helper.rb
 create mode 100644 app/models/staff.rb
 create mode 100644 app/views/staffs/_form.html.erb
 create mode 100644 app/views/staffs/edit.html.erb
 create mode 100644 app/views/staffs/index.html.erb
 create mode 100644 app/views/staffs/new.html.erb
 create mode 100644 app/views/staffs/show.html.erb
 create mode 100644 db/migrate/20161116180542_create_staffs.rb
 create mode 100644 test/controllers/staffs_controller_test.rb
 create mode 100644 test/fixtures/staffs.yml
 create mode 100644 test/models/staff_test.rb 

Untuk git commit, kita perlu masukkan komen (wajib)

komen ini bertujuan untuk memberitahu orang lain apa yang kita lakukan pada perubahan itu.


Saya rasa, sampai disini dulu kali ini. Nanti bersambung lagi..



Download git disini:

https://git-scm.com/

tutorial juga ada dilaman tersebut.
untuk tutorial interaktif, boleh cuba disini:

https://try.github.io/

Wassalamualaikum

Git dan Projek Aplikasi

Assalamualaikum

Mari kita terus fokus kepada pembangunan aplikasi. Senario ini biasanya berlaku dalam sesebuah jabatan yang bertanggungjawab membina aplikasi untuk organisasi atau pelanggan.


Pasukan JuruProgram


Beberapa juruprogram yang membina aplikasi yang sama akan berkongsi-kongsi kodprogram mereka samada secara online menggunakan cloud ataupun bertukar-tukar peranti storan mudah alih (ada yang buat gitu lagi ke?). Namun secara idealnya, setiap juruprogram akan menulis kod untuk modul yang berbeza bagi satu-satu aplikasi. 

Jika seorang juruprogram yang ditugaskan untuk membina fungsi tertentu, maka dia akan memeras otaknya untuk mengeluarkan idea. Biasanya dengan meminum kopi pekat sikit. Selepas itu maka diapun berjaya mengeluarkan 3 kaedah atau idea bernas untuk membina fungsi tersebut. Maka, dia akan membuat 3 salinan dan menamakan setiap salinan itu dengan nama yang berbeza-beza. Koding ditulis dan diuji satu persatu. Ketiga-tiga salinan tersebut berjaya dibina dan selepas dinilai oleh bos beliau, salah satu salinan tadi akan disalin kedalam salinan asal dan dimuatnaik semula ke server cloud.

Sangat-sangat praktikal kan? Namun, banyak masalah yang mungkin timbul dengan cara ini jika sekiranya sesuatu yang tidak diingini berlaku selepas salinan utama telah ditambah dengan kod baru. Mungkin terdapat bug yang tidak terlihat sebelum ini. Maka kita terpaksa menyelesaikan dengan seberapa segera masalah tersebut sekiranya sistem telah sedia digunakan. Ataupun, untuk setiap versi (penambahan kod) salinan utama tadi, setiapnya disimpan salinan secara berasingan dan diberikan nama yang unik dan tarikh kemaskini dan dilakukan oleh siapa. Banyangkan kita bekerja dengan 10 orang juruprogram yang sedang membangunkan aplikasi yang sama. Dalam sehari, mungkin setiap juruprogram akan meminta untuk kodprogram mereka dinilai dan dimasukkan kedalam salinan utama. 

Situasi itu sangat-sangat(SANGAT) seram untuk digambarkan.

Untuk menyelesaikan masalah ini (memudahkan) kaedah pembangunan aplikasi secara berkumpulan inilah timbulnya Git.

Dengan git, setiap juruprogram dapat membuat salinan daripada repositori utama dengan arahan:

git clone

git clone akan menyalin bukan sahaja semua fai daripada repo, bahkan juga setiap perubahan yang telah dilakukan, tarikh dan masa perubahan itu dilakukan, nama dan emel orang yang melakukan perubahan itu dan apa yang diubah. Selepas kita clone suatu repo daripada server (konsep cloud juga), juruprogram akan mendapat salinan yang 100% sama dengan apa yang ada dalam repositori utama.

contoh dibawah adalah cara untuk kita clone salah satu repo daripada github:

$\> git clone https://github.com/mischa78/boxroom.git
Cloning into 'boxroom'...
remote: Counting objects: 2995, done.
remote: Total 2995 (delta 0), reused 0 (delta 0), pack-reused 2995
Receiving objects: 100% (2995/2995), 719.42 KiB | 207.00 KiB/s, done.
Resolving deltas: 100% (1529/1529), done.
Checking connectivity... done.

Selepas arahan ini dilaksanakan, kesemua fail daripada github itu akan berada dalam komputer kita. 
(jangan risau, repo dalam github ini kesemuanya adalah opensource)

Dengan memiliki kesemua fail yang sama dengan apa yang ada dalam repositori utama, dan ianya disalin menggunakan Git, salinan dalam komputer kita itu juga merupakan satu repositori.


Repositori di Server dipanggil Remote.
Remote Server yang pertama sekali kita clone dinamakan Origin

Arahan untuk melihat Remote Server:


$\> git remote -v
origin https://github.com/mischa78/boxroom.git (fetch)

origin https://github.com/mischa78/boxroom.git (push)
Jadi, bagaimana untuk mula menulis kod? Kena buat salinan asing ke?

Git didatangkan dengan fungsi Branching. Sama seperti kita membuat salinan kogprogram, namun dengan lebih tersusun. Kita boleh membuat beberapa branch serentak sekiranya kita ada banyak idea untuk menyelesaikan satu-satu tugas.


Arahan untuk mencipta branch baru 

$\> git checkout -b add_staff_module_yusdirmanSwitched to a new branch 'add_staff_module_yusdirman'
Biasanya, apabila kita membina aplikasi beramai-ramai, kita akan tandakan branch yang kita bina itu dengan nama sendiri supaya mudah dikenalpasti nanti. 

Dari sini, tulislah kodprogram anda. simpan dan uji.

Jika dah berjaya. Commit. ...?

Dalam pengurusan kodprogram menggunakan git, setiap perubahan yang telah dibuat perlu diisytiharkan fail-failnya dan kemudian disahkan pula dengan menggunankan arahan git add dan git commit

Pada ketika ini, bagi sesiapa yang belum pernah menggunakan mana-mana pengurusan kodprogram sebelum ini, termonologi ini adalah sangat asing.

Git mempunyai 3 peringkat dalam setiap perubahan kod aturcara.

1. bersih (clean)

2. ada perubahan, belum dipentaskan

3. telah dipentaskan, belum dicommit

selepas dicommit, ianya akan kembali semula ke peringkat 1: Bersih


Apakah maksud ketiga-tiga peringkat ini?

1. Bersih: tiada apa-apa perubahan berlaku pada kod program. 

2. Belum dipentaskan (unstage) : terdapat perubahan pada fail. namun belum diisytiharkan untuk dimasukkan kedalam repositori

3. Telah dipentaskan (staged) tapi belum dicommit  : fail-fail yang berubah telah dikenalpasti untuk dimasukkan kedalam repo. 

Setelah juruprogram pasti dengan perubahan tersebut, dia hanya perlu commit sahaja kodprogram. Maka satu bab atau titik perbatuan telah direkodkan dalam log pembangunan aplikasi ini dan segala perubahan yang dilakukan juga direkodkan.

Mari saya tunjukkan contoh:

 selepas membina branch baru, saya telah memasukkan fail dan kod baru ke dalam aplikasi ini.

saya boleh melihat status perubahan dengan :
$\> git status
On branch add_staff_module_yusdirman
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)
modified:   config/routes.rb
Untracked files:
  (use "git add ..." to include in what will be committed)
app/assets/javascripts/staffs.coffee
app/assets/stylesheets/scaffolds.scss
app/assets/stylesheets/staffs.scss
app/controllers/staffs_controller.rb
app/helpers/staffs_helper.rb
app/models/staff.rb
app/views/staffs/
db/migrate/20161116180542_create_staffs.rb
test/controllers/
test/fixtures/staffs.yml
test/models/
no changes added to commit (use "git add" and/or "git commit -a")
Apabila arahan git status dimasukkan, setiap perubahan akan tersenarai. 

Status "Changes not staged for commit" merujuk kepada perubahan yang telah kita lakukan (telah save) namun masih belum dipentaskan untuk dicommit.

Cara untuk pentaskan fail (staging)

$\> git add [nama fail] : untuk pilih fail mana yang akan distage
atau

$\> git add . : tambah semua fail 

selepas itu, status fail tadi akan berubah

$\> git status
On branch add_staff_module_yusdirman
Changes to be committed:
  (use "git reset HEAD ..." to unstage)
new file:   app/assets/javascripts/staffs.coffee
new file:   app/assets/stylesheets/scaffolds.scss
new file:   app/assets/stylesheets/staffs.scss
new file:   app/controllers/staffs_controller.rb
new file:   app/helpers/staffs_helper.rb
new file:   app/models/staff.rb
new file:   app/views/staffs/_form.html.erb
new file:   app/views/staffs/edit.html.erb
new file:   app/views/staffs/index.html.erb
new file:   app/views/staffs/new.html.erb
new file:   app/views/staffs/show.html.erb
modified:   config/routes.rb
new file:   db/migrate/20161116180542_create_staffs.rb
new file:   test/controllers/staffs_controller_test.rb
new file:   test/fixtures/staffs.yml
new file:   test/models/staff_test.rb

Status "Changes to be committed" menunjukkan kesemua fail yang tersenarai itu akan dimasukkan kedalam repositori.


langkah seterusnya adalah melarikan arahan git commit

$\> git commit -m "added scaffold for staff. integrate existing staff table with boxroom"
[add_staff_module_yusdirman 5368f32] added scaffold for staff. integrate existing staff table with boxroom
 16 files changed, 326 insertions(+)
 create mode 100644 app/assets/javascripts/staffs.coffee
 create mode 100644 app/assets/stylesheets/scaffolds.scss
 create mode 100644 app/assets/stylesheets/staffs.scss
 create mode 100644 app/controllers/staffs_controller.rb
 create mode 100644 app/helpers/staffs_helper.rb
 create mode 100644 app/models/staff.rb
 create mode 100644 app/views/staffs/_form.html.erb
 create mode 100644 app/views/staffs/edit.html.erb
 create mode 100644 app/views/staffs/index.html.erb
 create mode 100644 app/views/staffs/new.html.erb
 create mode 100644 app/views/staffs/show.html.erb
 create mode 100644 db/migrate/20161116180542_create_staffs.rb
 create mode 100644 test/controllers/staffs_controller_test.rb
 create mode 100644 test/fixtures/staffs.yml
 create mode 100644 test/models/staff_test.rb 

Untuk git commit, kita perlu masukkan komen (wajib)

komen ini bertujuan untuk memberitahu orang lain apa yang kita lakukan pada perubahan itu.


Saya rasa, sampai disini dulu kali ini. Nanti bersambung lagi..



Download git disini:

https://git-scm.com/

tutorial juga ada dilaman tersebut.
untuk tutorial interaktif, boleh cuba disini:

https://try.github.io/

Wassalamualaikum

16 Nov 2016

Bersosial dengan Kod Program?

Assalamualaikum


Lama dah tak menulis pasal programming. Kerja pun makin sibuk dan tugas pun makin banyak. Tapi, bila lama dah tak menulis, kepala mula mengarang ayat-ayat dengan sendiri. Salah satu tanda kerinduan untuk menekan papan kekunci ini untuk selain kod program.

Dunia hari ini masih lagi dalam momentum ledakan media sosial yang memang amat berkuasa sehingga mampu mengalih sesebuah negara.

Namun, bagi seseorang dalam bidang kejuruteraan perisian, sosial media adalah salah satu aplikasi yang digunakan untuk bersosial.

Kita berkongsi gambar, teks, video, cerita, karangan, kisah lucu, kisah yang tak sepatutnya dikisahkan atau tak sepatutnya dikhabarkan pun dikongsi dalam media sosial. Namun, bagi juruaturcara, perkongsian kod aturcara adalah satu bentuk media sosial yang sangat 'trending' sekarang ini.

Bersosial dengan Kod Program

Penulisan kod program atau kod aturcara adalah periuk nasi bagi seseorang juruprogram, jurutera perisian, juruanalisa dan semua profesyen yang berkaitan dengan pembangunan perisian. Untuk aplikasi yang kecil dan ringkas, seorang juruprogram sudah memadai. Namun, untuk aplikasi yang besar dan mempunyai banyak modul yang merentasi pelbagai jabatan misalnya, seorang juruprogram akan mengambil masa yang lama untuk menyiapkannya.

Jadi, kita perlukan lebih dari seorang juruprogram. Namun, apabila kod program dibangunkan oleh 2 orang yang berbeza pada satu-satu masa, percanggahan dari segi cara penulisan, susun atur kod dan aliran kerja logik dalam program adalah amat ketara. 

Perlu diingat, penulisan kod program yang baik adalah yang paling mudah dibaca dan difahami oleh juruprogram yang lain.

Program dibangunkan untuk pengguna, Kod program ditulis untuk juruprogram yang lain
Oleh kerana itu, kita perlukan satu mekanisma yang memudahkan simpulan percanggahan ini dileraikan dan dimeterai satu persefahaman khusus tentang kod program yang paling mudah difahami dan paling efisyen digunakan.

Oleh itu, juruprogram perlu bersosial dengan berkongsi kod program mereka. (walaupun ramai yang kurang bersosial 'orang komputer' ni)


Bersosial dengan Github

Kebolehan berkongsi kod program dengan juruprogram yang lain merupakan suatu kemudahan yang sangat berguna. Apatah lagi cara perkongsian itu merupakan suatu kebiasaan pada hari ini iaitu menggunakan alatan yang seakan sama dengan media sosial. Laman web dan aplikasi telefon adalah platform yang sangat berkesan memandangkan kerja pembangunan program ini hampir 100% berada dalam komputer. 

Github merupakan laman web yang bermegah dengan motto "Social Coding". Ironinya, juruprogram serata dunia memang bersosial dengan berkongsi kod program mereka di github. Perisian Kernel Linux yang merupakan sistem pengoperasian terbesar di dunia juga dihoskan di Github. Dan seperti yang saya nyatakan tadi, kod Linux ini dikongsi, dibina bersama-sama, dibincangkan, dikongsi lagi, diubah, disalin, diagihkan, ditukar mengikut keperluan mana-mana individu di laman web github.com ini. 

Jika kita layari https://github.com/torvalds/linux/graphs/contributors, lebih 5000 juruprogram telah menyumbangkan kodprogram mereke kepada projek Linux ini secara atas talian. Dan kita dapat melihat perbincangan mereka secara lansung dalam laman web tersebut.


Bagaimana ini boleh berlaku? 

1. Git

Alatan yang digunakan untuk membolehkan perkongsian ini berlaku adalah Git. Ianya merupakan satu aplikasi yang digunakan untuk menguruskan versi aplikasi semasa pembangunan dijalankan. 

Git adalah Sistem kawalan Versi yang dibangunkan oleh Linus Torvald sendiri iaitu orang yang mula-mula membina Linux. Git adalah pengurusan versi aplikasi secara teragih dan terpusat. 

2. Branching
Dalam git, kod program yang disalin dari github boleh diubah tanpa menggangu kod asal iaitu dengan menggunakan fungsi branching.

Branching seolah-olah kita menyalin kodprogram itu untuk kita lakukan perubahan dan kemudian, dengan mudah kita boleh gabungkan atau 'merge' kembali dengan kodprogram asal. Sebarang konflik antara kod asal dan kod yang baru akan diuruskan oleh Git dan kita boleh menentukan kod mana yang perlu disimpan dan kod mana perlu dibuang semasa konflik berlaku.

3. Pull Request dan Code Review
Permohonan untuk gabungkan kod kita dengan kod utama di laman web github atau dipanggil Repositori Utama, dalah digelar Pull Request

Pull Request dilaksanakan oleh mana-mana juruprogram yang telah membuat perubahan terhadap kodprogram utama tersebut dalam branchnya sendiri, dan ingin memasukkan kodprogram tersebut ke dalam repositori utama. Pull Request dilaksanakan dalam laman web github.

Selepas permohonan dibuat, maka bermulalah Code Review. Kesemua juruprogram atau ahli-ahli yang dilantik dan diberi kepercayaan akan melihat, mencuba dan menilai kodprogram dalam Pull Request tadi. Interaksi dan komunikasi ini berlaku dalam laman web github. 

Jika kesemua berpuas hati dan Pull request tersebut adalah amat baik untuk aplikasi tersebut, pemilik repository atau ahlinya boleh menerima pull request tersebut. Maka, perubahan telah berlaku terhadap kodprogram aplikasi tersebut.

4. Fetch dan Pull
Oleh kerana aplikasi ini dibina oleh ramai juruprogram, sebarang perubahan dalam repositori utama perlu dikemaskini oleh kesemua juruprogram yang lain selepas mana-mana pull request telah diterima. Namun, tugas itu amat mudah sekiranya menggunakan Git. Hanya dengan menggunakan arahan git pull, kod program yang baru ditambah tadi akan dimuatturun ke komputer masing-masing. Git fetch adalah untuk melihat jika ada sebarang perubahan tanpa memuat turun kod.


Oleh kerana kesemua yang berlaku dalam git dan github ini adalah berkisar tentang kerja seorang juruprogram, adalah 'tidak manis' pula kesemuanya ditulis dalam post ini.  :-)

Nantikanlah! tutorial git dalam bahasa melayu dalam post yang akan datang (insya-Allah tak lama lagi)


Wassalamualaikum






30 Ogo 2016

Redis server timeout error apabila connection menjangkau 1.02K

Assalamualaikum

Sepanjang ditugaskan untuk menjada server sistem dokumen klinikal untuk klinik buah pinggang, ada banyak masalah yang dihadapi oleh server apabila sistem 'agak' berat digunakan. Namun pada relatifnya, penggunaannya adalah sangat rendah kerana jumlah pengguna atau doktor yang merawat pesakit pada waktu klinik tidak mencecah sehingga 30 orang.

Akan tetapi, aplikasi sistem klinikal renal telah beberapa kali memaparkan error dengan mesej-mesej dalam log yang agak kabur. Connection time out berlaku apabila redis membuat arahan "set" untuk menyimpan data dalam memori.

Redis::TimeoutError (Connection timed out):
  lib/husm/api.rb:46:in `save_key'
  lib/husm/api.rb:25:in `request'

Jumlah keseluruhan ram dalam server adalah 8GB dan pada ketika berlaku error ini, jumlah penggunaan ram oleh redis hanyalah 500MB.

Sumber yang sangat tinggi digunakan oleh redis adalah CPU pada ketika error ini berlaku.


Setelah membuat sedikit carian menerusi google, terjumpa satu alatan untuk membuat pemantauan terhadap operasi redis iaitu redis-stat. Redis stat akan memantau operasi redis setiap saat. Dengan melarikan arahan redis-stat --server, satu aplikasi laman web akan dijalankan dan boleh diakses menggunakan pelayar.

redis-stat --server



Setelah beberapa ketika, apabila pengunaan sistem agak tinggi iaitu pada hari klinik pakar nephro, sistem akan memaparkan error dan tidak dapat digunakan buat beberapa ketika. Didapati, jumlah 'cl' pada redis-stat mencapai 1.02k dan tidak pernah lebih daripada itu.

Oleh itu, aku jatuh syak pada had open-files dalam sistem linux yang biasanya disetkan kepada 1024 secara default. Sekali lagi carian dibuat dan mendapati cara untuk meningkatkan had open-files pada aplikasi redis adalah dengan memasukkannya dalam script service.

1. sudo nano /etc/default/redis-server

2. tambah / uncomment
   ULIMIT=65536


3. Restart redis-server
   sudo service redis-server restart



Apabila aplikasi berat, jumlah sambungan kepada redis menjadi tinggi namun tiada lagi mesej error Redis::TimeoutError dan jumlah cl pada redis stat menjadi lebih tinggi daripada 1.02k.

Setakat ini, sistem masih lagi bertahan namun masih lagi terdapat ralat pada nginx itu sendiri (upstream timeout error)


Satu lagi misteri untuk dirungkaikan.. 










4 Ogo 2015

Suasana Kedai Kopi Meningkatkan Kreativity

Assalamualaikum

Mengikut kajian daripada Journal of Consumer Research mendapati suasana dalam kedai kopi dengan pelbagai bunyi seperti mesin, orang berbual, orang berjalan, bunyi mesin tunai dan lain-lain dapat mengingkatkan kreativiti seseorang yang sedang fokus melakukan kerja di kedai tersebut.

Bunyi itu haruslah tidak kuat ~70dB dan ianya seolah-olah bunyi suasana yang rawak dan tidak mengganggu. Sebarang bunyi yang melebihi 80dB akan menimbulkan gangguan.

Oleh itu, jika anda perlu fokus untuk melakukan kerja atau menulis, bolehlah bawa laptop anda ke kedai kopi dan terus mula bekerja.

Jika tidak berkelapangan, ada satu laman web yang meyediakan bunyi suasana kedai kopi yang sangat menenangkan dan sesuai untuk anda dengan sambil buat kerja.

Pasangkan headphone anda dan layari https://coffitivity.com/

Selamat mencuba.. :-)

29 Jun 2015

CodeIgniter + curl + RestClient + Frapi + selfsigned ssl

Assalamualaikum

Hari ini dan semalam aku cuba gunakan API untuk projek CodeIgniter yang aku tengah buat ni. First time guna API dalam CI ni agak kalut sikit. Namun begitu, akhirnya berjaya jugak.. Berikut adalah target aku :


1. Aplikasi CI mintak data dengan API server.
2. API Server hantar data semula.


Simple je nampak mulanya. Tapi, oleh kerana aku baru je nak try guna CI dengan API ni agak kekok sikit. Berikut adalah kronologi aku jayakan benda ni..

1. Aku setkan API server aku (FRAPI) dengan user dan api-key yang baru.

2. Setkan satu test-function dalam API server untuk kembalikan apa-apa nilai.

Untuk aplikasi ini, aku hanya perlukan sambungan client kepada API server. CodeIgniter telah sedia ada satu library yang merupakan RESTclient. Berikut adalah yang aku gunakan :

https://github.com/philsturgeon/codeigniter-restclient 

CodeIgniter-restclient ini memerlukan :

  1. PHP 5.1+
  2. CodeIgniter 2.0.0+
  3. cURL
  4. CodeIgniter Curl library: http://getsparks.org/packages/curl/show
Install Curl untuk server anda terlebih dahulu sebelum install restclient.

Tapi yang menariknya di sini sebenarnya, ada satu library untuk php ini yang bertindak seolah2 Gem dalam ruby. Library Spark ini membolehkan kita download/install apa sahaja php classes (dipanggil spark packages)  untuk projek kita.

Jom tengok spark library nis..



Sekarang aku andaikan korang takde masalah untuk install RestClient tadi di CI. Berikut adalah kod yang aku gunakan.

config_berapi.php

//api server$config['berapi_api_server'] = 'https://api.berapi.com';//api auth$config['berapi_api_name'] = 'boboboy_api';$config['berapi_api_key'] = 'iniadalahkeyapiyangsepatutnyabase64tapiinicontohsahaja:)';


dalam controller

function test_api(){
   $rest_config = array('server' => $this->config->item('berapi_api_server'),
        'http_user' => $this->config->item('berapi_api_name'),
        'http_pass' => $this->config->item('berapi_api_key'),
        'http_auth' => 'digest',
        'ssl_verify_peer' => FALSE);
    $this->rest->initialize($rest_config);


    $uri = 'berapi/test'

    $this->rest->format('application/json');    
    $result = $this->rest->get($uri, $param);


    echo $result;

}

Penerangan

1. Oleh kerana server api (api.berapi.com) adalah server api sendiri yang tidak ada sijil SSL berbayar, maka kita perlu setkan pada koding supaya TIDAK PERLU SAHKAN sijil SSL. Jika tidak, mesej ralat akan keluar, dan tidak ada nilai dihantar oleh server API.


2. HTTP_AUTH adalah secara DIGEST disetkan pada server API. di atas tu adalah caranya.

3. Fail konfigurasi config_berapi.php diautoload dalam config.php.

4. library berkaitan yang diauto load adalah : curl, rest


semoga berjaya.




7 Mei 2015

Tambah medan id yang auto_increment dan primary key kepada table yang takde tapi perlu sama dengan table replicate.. aduhh

Kes dia macam ni

aku ada 2 DB yang mana satunya adalah DB master yang replicated daripada DB utama.

satu DB lagi adalah DB untuk development tetapi user exited untuk guna dan sekarang ni dah macam production. Secara positifnya, sistem flow dan structure kira dah ok la tu bila user tak komplen.


Masalahnya, dalam DB dev, aku masukkan auto_increment value dengan nama 'id' pada satu table yang agak anchor jugak. Tapi sebenarnya, kalau ikut table yang asal, field tu takde pun (legacy system).


Jadi, oleh kerana DB dev ini tidak update dan DB master tu adalah slave replication dengan server DB utama, maka bilangan row untuk table dah jadi lain.. Dan kalau aku tambah je auto_increment field dalam DB master tu, pasti sistem aku akan crush/bugged sebab sistem tu akan jadikan foreign key dalam table lain.


Objektif aku ialah:

1. Tambah kolum ID dalam table pada DB master
2. Selaraskan nilai ID dalam table dev dan table MASTER
3. bagi row yang takde dalam table di dev, nilai 0 akan digantikan dengan nilai yang unik (auto_increment)
4. setkan kolum ID dalam table DB master sebagai auto_increment, primary key.


Tapi ada satu step lagi kena tambah sebab dalam table master tu ada duplicate rows. Jadi aku kena delete dulu salah satu rows yang duplicate tadi sebelum aku setkan id sebagai primary_key.


OK,, ini yang aku buat...

katakan nama table : visits

1. tambah row ID pada table visits di master DB

SQL : 

     ALTER TABLE  `InPatient` ADD  `id` INT NOT NULL FIRST

2. selaraskan nilai 'id' pada table dev dengan table master berdasarkan params yang sama.

SQL :

         UPDATE master.visits mv
    LEFT JOIN dev.visits dv 
    ON dv.params1 = mv.params1 AND dv.params2 = mv.params2
    AND dv.params3=mv.params3
    SET mv.id = dv.id;

Dengan ini, nilai id dalam table dev akan ditiru kepada table master.

Oleh kerana table di master mengandungi lebih banyak row, maka nilai id = 0 akan wujud bagi row yang tak ada dalam table di dev.


Kita perlu update nilai id ini dengan nilai auto_increment berdasarkan nilai tertinggi id.

2.5 ini adalah khusus kepada table aku sendiri memandangkan ada duplicate row pada table di master.

paparkan semua row yang duplicate..

SQL :

                       SELECT * 
         FROM visits 
         WHERE id<>0 
         GROUP BY id 
         HAVING COUNT(id)>1;

aku ada total 48 row yang duplicate id ni. Dengan kata lain, ada 49 row yang sama. Jadi aku kena delete la satu row. Untuk ini, aku cuma gunakan phpmyadmin je, select semua row dan tekan drop.

tapi aku pastikan dulu bilangan row adalah betul sebelum dan selepas delete duplicate row tu.

total row aku ada - bil row yang duplicate = 555850-48 = 555802

jadi selepas aku delete row duplicate menggunakan phpmyadmin, bilangan total row sepatunya akan jadi seperti yang aku kira tu.

Secara selamatnya, bilangan row akan betul la. InsyaAllah.


3. Update nilai id mengikut nilai max(id) secara auto increment.

Sebelum aku update nilai id mengikut nilai max(id) yang sedia ada secara auto_increment, aku check dulu  berapa row yang aku kena update. Caranya ialah mengira berapa row dengan id = 0

SQL :

       SELECT *
       FROM visits

       WHERE id=0

Jadi aku ada 125312 row untuk diupdate.


SQL :

UPDATE master.visits mv, 
  (SELECT @n := (Select MAX(id) FROM master.visits)) n
   SET mv.id = @n := @n+1
   WHERE mv.id = 0

       *125312 rows affected

Nilai row yang dikemaskini sama dengan jumlah row dengan nilai idnya adalah 0.

Akhir sekali, pastikan tak de id yang duplicate..

SQL :

SELECT * FROM `visits`
GROUP BY id
HAVING COUNT(id)>1

* MySQL returned an empty result set

yeay!


4. Setkan id sebagai primary_key dan auto_increment.

Guna je phpmyadmin..

Setakat yang aku buat ni takde masalah. Harap dapat selesaikan masalah ni jugak..

Terima kasih..




     

       


16 Okt 2014

Apa Maksud RON dalam pengkelasan Petrol?

RON dan Petrol

Oleh yusdirman, Oktober 2014

RON adalah singkatan daripada Research Octane Number

Ianya kaedah penarafan bahan api.

Lebih tinggi nilai RON, lebih mahal harga PETROL.

Adakah minyak RON 97 lebih berkuasa berbanding RON 95?

RON merujuk kepada tahap bahan api menahan rintangan "ketukan" semasa proses pembakaran oleh palam pencucuh dalam enjin. Ianya merujuk kepada tahap ketahanan bahan api untuk tidak terbakar sebelum dinyalakan oleh palam pencucuh dalam enjin.

"ketukan" dalam konteks RON ini adalah apabila campuran bahan api dan udara dalam enjin terbakar lebih awal sebelum api dari palam pencucuh menbakarnya. Pembakaran awal ini mungkin disebabkan enjin terlalu panas. Haba dari silinder enjin itu sendiri mungkin telah menyalakan bahan api sebelum palam pencucuh menyala. Ini boleh menurunkan prestasi dan mungkin boleh memudaratkan enjin!

Jadi, RON bukannya bermaksud LEBIH KUASA! Ianya bermaksud bahan api itu dapat menahan tekanan daripada enjin yang lebih tinggi. Biasanya enjin berkuasa tinggi memerlukan RON yang tinggi.

AMARAN! jika enjin kereta anda hanya perlukan RON95 untuk beroperasi, JANGAN ISI DENGAN RON97 KERANA IANYA AKAN MEROSAKKAN DOMPET ANDA DENGAN TERUK!

Periksa manual kereta untuk tentukan RON yang sesuai dengan enjin.


Untuk Kefahaman kita Tentang RON Petrol :


  • Lebih tinggi RON, bahan api lebih susah terbakar (tahan dalam tekanan tinggi)
  • Lebih rendah RON, lebih mudah terbakar (tidak tahan tekanan)



Contohnya seperti minyak diesel, ianya mempunyai RON yang rendah. Sebab itulah enjin diesel tidak perlukan palam pencucuh dan bahan api diesel dinyalakan hanya dengan tekanan tinggi.




Manakala enjin petrol dinyalakan dengan palam pencucuh kerana mintak petrol lebih tinggi daya tahan "ketukan" atau tekanan dalam enjin dan hanya akan menyala apabila dicucuh oleh api dari palam pencucuh.



Apa akan jadi jika kita guna RON95 pada ENJIN RON97?

Berdasarkan pemahaman di atas, jika bahan api yang kurang tahan pada enjin yang tinggi tekanannya seperti enjin berkuasa tinggi, maka bahan api akan terbakar lebih awal sebelum dinyalakan oleh palam pencucuh.


Ini dapat kurangkan prestasi enjin dan mungkin rosakkan enjin.


Apa akan jadi jika kita guna RON97 pada ENJIN RON95?

Bahan api RON tinggi digunakan pada enjin RON rendah tidak memberikan apa-apa kesan negatif kerana bahan api akan terbakar ketika dicucuh oleh api palam pencucuh, sama seperti yang sepatutnya berlaku. Tapi RON97 LEBIH MAHAL, rugi pitis la boh!


MITOS DAN SALAH FAHAM TENTANG RON PETROL

1. "RON lebih tinggi POWER lebih"

2. "RON tinggi lebih bersih sebab pembakaran sempurna"

3. "RON97 maksudnya 97% pembakaran sempurna, RON95 maksudnya 95% pembakaran sempurna"

- Ada minyak yang RON110. Cemana tu? :-)

4. "RON95 di Malaysia tak ikut standard, Kualiti telah dikurangkan"
- RON bukan merujuk kepada kualiti minyak yang lebih baik pembakaran, merujuk kepada ketahanan minyak yang tinggi.

5. ...

6. ...




13 Okt 2014

Harga Minyak Petrol RON95 Antara Negara Pengeluar Dunia


ABCDEFGH
1
Negara
Pengeluar Minyak
Subsidi Minyak
# Pengeluar Dunia
Harga USD/L
Harga RM/L
Harga TempatanTarikh
2
VenezuelaYaSubsidi90.0150.0489
BsF. 0.097/L (95)
BsF. 0.070/L (91)
BsF. 0.048/L (diesel)
12/12/2010
3
Saudi Arabia (Riyadh, Jeddah)
YaSubsidi20.160.5216SAR 0.45/L (91 RON)
SAR 0.60/L (95 RON)
13/09/2011
4
LibyaYa270.170.5542
LD 0.2/L (95), LD 0.15/L (diesel)
Oct 2010: LD135 fuel tax at border for foreign vehicles
07/11/2010
5
TurkmenistanYa420.190.6194TMN 0.54 /LI -13/09/2011
6
Qatar (Doha)Ya180.220.7172QAR 1.00/L (97 Octane)
QAR 0.85/L (90 Octane)
22/01/2011
7
KuwaitYaSubsidi110.2240.73024
KWD 0.060/L (91)
KWD 0.065/L (95)
KWD 0.090/L (98)
30/06/2010
8
BahrainYaSubsidi630.270.8802
BHD 0.100/L (95 RON)
BHD 0.080/L (91 RON)
BHD 0.120/L (Diesel)
25/12/2013
9
OmanYa250.311.01060.12 Rials/L01/08/2010
10
IraqYa70.381.2388
ID 450/L (95 Octane)
ID 000/L (98 Octane)
ID 400/L (Diesel)
03/04/2013
11
BruneiYaSubsidi480.391.2714BR$0.53/L05/06/2008
12
IranYa
Subsidi 100L sebulan / kereta
2010-2015 Subsidi dihapuskan
40.391.2714
10000 Rials/L petrol (7000 rationed)
5000 Rials/L diesel (2500 rationed)
25/04/2014
13
AlgeriaYa150.411.3366
30DA/L 95 octane (rare down south)
regular 23DA/L
diesel DA14/L or US$0.2
07/11/2010
14
EcuadorYa300.441.4344US$1.68/US gallon (super)15/11/2011
15
UAEYa80.4981.62348
AED 1.72/L (95 Octane)
AED 1.83/L (98 Octane)
AED 2.60/L (Diesel)
31/12/2011
16
BoliviaYaSubsidi660.541.7604B3.74/L (super)
B3.72/L (diesel)
30/12/2010
17
AngolaYa160.622.021213/07/2011
18
GuatemalaYa780.642.0864
Q19.99/US gallon(regular)
Q16.79/US gallon(diesel)
14/04/2009
19
Trinidad and TobagoYaSubsidi450.642.0864TT$2.70/L (92)
TT$5.75/L (95)
TT$1.50/L (diesel)
01/12/2011
20
MalaysiaYaSubsidi (RON95)290.72.282
MYR 2.85/L (RON97)
MYR 2.30/L (RON95)
MYR 2.20/L (Diesel)
02/10/2014
21
YemenYa370.732.3798150 Rials/L (diesel)09/09/2009
22
PakistanYa590.752.445
PKR 107.97/L (Unleaded Premium)
PKR 131.26/L (Unleaded-Hi Octane)
PKR 109.34/L (Diesel)
PKR 105.48/L (E10 Gasoline)
PKR 71.50 to 76.35/KG (CNG)
01/05/2014
23
Mexico (Mexico City)YaSubsidi100.772.5102MX$10.09/L(Magna 87)
MX$10.78/L(Premium 92)
14/04/2012
24
North KoreaYa1100.772.5102KP? 111/L26/12/2009
25
SyriaYa320.83332.716558SY 50 pound/L (unleaded)
SY 15 pound/L (Diesel)
03/01/2012
26
Nigeria (Lagos)YaSubsidi130.872.8362N141/L01/01/2012
27
EgyptYaSubsidi280.92.934
LE 1.60/L <80 octane
LE 2.60/L <92 octane
LE 6.25/L <95 octane
LE 1.8/L diesel ('solar')
05/07/2014
28
Russia (Kaliningrad)Ya10.912.9666RUR 25.3/L (diesel)15/07/2011
29
ArgentinaYa260.922.9992
ARS $11.98/L (95)
ARS $12.98/L (98)
ARS $10.59/L (diesel)
27/08/2014
30
MauritaniaYa760.943.0644
UM265/L petrol
UM225/L diesel
Prices 10-20% more up north
07/11/2010
31
Russia (Moscow)Ya10.943.0644
RUR 30.29/L (RON 98)
RUR 27.29/L (RON 95)
RUR 25.89/L (RON 92)
RUR 23.49/L (RON 80)
RUR 25.29/L (Winter diesel)
24/02/2011
32
Puerto RicoYa1020.963.1296$0.957/L (95)
$0.987/L (98)
$0.997/L (Diesel)
08/04/2011
33
KazakhstanYa170.983.1948KZT145/L (unleaded 95)
KZT106/L (unleaded 92)
02/11/2011
34
TunisiaYa550.993.2274
TND 1.27/L (€0.67) (95 RON)
TND 0.91/L (€0.48) (Diesel)
24/09/2009
35
AzerbaijanYa2113.26
AZN 0.70/L (AI-80, AI-92)
AZN 0.80/L (AI-95)
AZN 1.50/L (AI-98)
AZN 0.60/L (L-62 Diesel)
02/12/2013
36
United StatesYaSubsidi31.0243.33824$3.49/US gallon
$4.01/US gallon (diesel)
05/11/2012
37
Sierra LeoneYa1131.053.423Le4500/L27/05/2011
38
BurmaYaSubsidi741.063.4556
K3100/imperial gallon (regular)
K3300/imperial gallon (diesel)
21/11/2008
39
ChinaYa51.063.4556RMB 6.46/L08/02/2012
40
BelarusYa691.073.4882Br3240/L (95)
Br2580/L (Diesel)
12/05/2010
41
UzbekistanYa551.073.4882UZ SUM 1755/L (95)01/01/2011
42
ColombiaYa201.093.5534
COL$8000/US gallon (81 Octanos)
COL$9595/US gallon (87 Octanos)
30/11/2010
43
ArubaYa1011.13.586Fl. 1.93/L12/12/2009
44
VietnamYaSubsidi (RON92)361.113.6186
VND 25,070/L (RON 95)
VND 24,570/L (RON 92)
VND 22,310/L (Diesel)
18/07/2013
45
PanamaYa1151.153.749
US$3.35/US gallon (95)
US$2.99/US gallon (diesel)
10/07/2014
46
CanadaYa61.183.8468C$1.16/L19/12/2012
47
TaiwanYa381.20343.923084
NT$34.0/L (92 unleaded)
NT$35.5/L (95 unleaded)
NT$37.5/L (98 unleaded)
02/04/2012
48
South AfricaYa431.213.9446R13.59/L04/02/2014
49
IndonesiaYaSubsidi (RON88)221.223.9772
Rp 6500/L (subsidized)(RON 88)
Rp 9200/L (RON 92)
Rp 9530/L (RON 95)
Rp 35000 (RON 100)
Rp 5500/L (subsidized)(Diesel)
21/06/2013
50
CubaYa641.244.0424CUC1.15/L (95)
CUC1.30/L (98)
CUC1.10/L (diesel)
02/03/2011
51
UkraineYa531.244.0424UAH 9.90/L (95 Octane)
UAH 9.50/L (diesel)
19/04/2011
52
Philippines (Manila)Ya791.2954.2217P 54.00/L25/09/2012
53
IndiaYa231.34.238
81.31/L (Petrol)
62.60/L (diesel)
414/14.2 kg (Domestic LPG)
06/01/2014
54
BrazilYa121.354.401R$2.98/L03/03/2013
55
AustraliaYa311.364.4336
A$1.517/L (RON 91)
A$1.601/L (diesel)
A$0.932/L (LPG)
24/01/2014
56
ChileYa841.364.4336CLP 592/L23/12/2010
57
BelizeYa971.44.564
BZ$10.18/US gallon (regular)
BZ$10.59/US gallon (premium)
BZ$10.24/US gallon (diesel)
21/12/2011
58
ThailandYa331.424.6292
฿37.38/L (Gasohol 95-E10)
฿43.75/L (RON 91), ฿35.38/L (Gasohol 91-E10)
฿32.19/L (Diesel)
24/11/2012
59
AlbaniaYa911.444.6944
ALL165/L (€1.18) (RON 95)
ALL160/L (€1.14) (Diesel)
13/08/2011
60
MoroccoYa961.54.89
MAD 12.65/L (€1.50) (95)
MAD 8.65/L (€1.02) (Diesel)
14/05/2013
61
Uruguay (Montevideo)Ya1031.524.9552U$ 29.7/L26/12/2009
62
SurinameYa581.555.053SR$5/L15/08/2011
63
BarbadosYa1061.595.1834Bd$3.17/L (reg)
Bd$2.79/L (diesel)
25/12/2013
64
ZambiaYa1091.615.2486ZK7639/L (Gasoline)24/09/2010
65
Peru (Lima)Ya461.625.2812
PEN S/.16.00/US gallon (95 Octane)
S/.8.46/US gallon (diesel)
26/12/2009
66
SingaporeYa831.675.4442
S$2.50/L (RON 98)
S$2.16/L (RON 95)
S$2.10/L (RON 92)
S$2.00/L (Diesel)
21/06/2011
67
BulgariaYa1001.725.6072
BGN 2.57/L (95)
BGN 2.73/L (98)
BGN 2.62/L (diesel)
07/03/2012
68
SpainYa701.785.8028€1.33/L (95 RON)
€1.29/L (Diesel)
06/04/2011
69
New ZealandYa571.815.9006
NZ$2.199/L (91 octane)
NZ$2.279/L (95 octane)
NZ$1.569/L (diesel)
13/08/2012
70
PolandYa681.815.9006PLN 5.59/L (95)
PLN 5.67/L (diesel)
03/02/2012
71
South KoreaYa651.815.9006KRW 2,043.61/L31/03/2012
72
EstoniaYa861.825.9332
€1.394/L (95 RON)
€1.434/L (98 RON)
€1.379/L (diesel)
15/08/2012
73
JapanYa491.845.9984¥152.7/L25/04/2011
74
Czech RepublicYa821.856.031
CZK 34.90/L (95)
CZK 35.90/L (98)
CZK 34.50/L (diesel)
06/03/2014
75
CroatiaYa711.876.0962
HRK 10.27/L (95)
HRK 10.59/L (98)
HRK 9.38/L (diesel)
13/06/2013
76
SloveniaYa1141.886.1288
€1.412/L (95 Octane)
€1.428/L (100 Octane)
€1.302/L (Diesel)
09/02/2012
77
LithuaniaYa891.926.2592LTL 4.60/L (95)
LTL 4.74/L (diesel)
06/04/2011
78
SerbiaYa801.926.2592
EuroPremium 95 RSD 166.7/L (€1.46/L)
Premium 95 RSD 157.9/L (€1.39/L)
EuroDiesel RSD 161.4/L (€1.42)
31/10/2012
79
Austria (Vienna)Ya721.956.357
€1.491/L (95)
€1.633/L (98)
€1.446/L (diesel)
€0.991/Kg (CNG-Methane)
06/04/2011
80
SlovakiaYa951.986.4548
€1.490/L (95 Natural)
€1.429/L (Diesel)
€0.695/L (LPG)
23/01/2012
81
Romania (Bucharest)Ya501.996.4874RON 6.33/L (95)
RON 6.36/L (diesel)
01/04/2014
82
PortugalYa942.086.7808
€1.597/L (95)
€1.759/L (98)
€1.429/L (Diesel)
€0.894 (Autogas)
07/01/2014
83
GermanyYa442.096.8134
€1.65/L (Super E5, 95 RON)
€1.69/L (SuperPlus E5, 98 RON)
€1.61/L (Super E10, 95 RON)
€1.47/L (Diesel)
08/05/2012
84
SwitzerlandYa992.096.8134
CHF 1.81/L (Bleifrei 95)
CHF 1.87/L (Super Plus 98)
CHF 1.94/L (diesel)
06/04/2011
85
SwedenYa932.16.846
SEK 14.53/L (95),
SEK 14.90/L (98),
SEK 14.24/L (diesel)
03/04/2013
86
HungaryYa732.146.9764
HUF 415/L (95),
HUF 440/L (diesel)
HUF 350/L (E85)
HUF 221/L (LPG)
14/01/2012
87
IsraelYa982.146.9764
ILS 7.54/L (95)
ILS 7.8/L (diesel)
ILS 4.21/L (LPG-autogas)
12/02/2014
88
IrelandYa1072.157.009€1.490/L (Unleaded 95)
€1.450/L (Diesel)
06/04/2011
89
GreeceYa882.27.172€1.599/L (unleaded)
€1.285/L (diesel)
06/03/2014
90
BelgiumYa812.237.2698
€1.719/L (Eurosuper 95)
€1.759/L (Super Plus 98)
€1.538/L (Diesel)
€0.713/L (LPG)
08/05/2012
91
FranceYa562.287.4328
€1.585/L (95)
€1.468/L (diesel)
€1.226/Kg (CNG-Methane)
06/04/2011
92
United KingdomYa192.287.4328
£1.41/L (Unleaded)
£1.49/L (Super)
£1.48/L (Diesel)
01/04/2012
93
ItalyYa472.317.5306
€1.748/L (Eurosuper)
€1.907/L (98 RON)
€1.660/L (Diesel)
€1.774/L (Special_Diesel)
€0.768/L (LPG-autogas)
€0.989/Kg (CNG-Methane)
National average, does not include self-service discounts.
07/10/2013
94
FinlandYa852.337.5958€1.601/L (98E RON)
€1.364/L (Diesel)
06/04/2011
95
DenmarkYa402.357.661
DKK 13.52/L (€1.81) (95)
DKK 12.04/L (€1.61) (diesel)
09/10/2012
96
TurkeyYa622.387.7588TL 5.01/L (95 RON)
TL 4.33/L (Diesel)
27/05/2014
97
NetherlandsYa612.478.0522
€1.887/L (Euro95)
€1.531/L (Diesel)
€1.949/L (Superplus)
05/09/2012
98
NorwayYa142.668.6716NOK 15.78/L (95)
NOK 14.44/L (Diesel)
06/05/2014