16 Okt 2017

Melukis dengan jcanvas rails

Jquery Plugin: Jcanvas dengan Rails



Assalamualaikum

Untuk melukis di web, implementasi yang paling mudah dan cepat adalah dengan menggunakan tag "canvas" yang tersedia dalam html5. Tag "canvas" ini boleh digunapakai bersama-sama javascript dan mana-mana framerwork javascript.

Antara yang popular adalah jcanvas, satu plugin jquery yang digunapakai untuk membolehkan kita melukis di laman web / aplikasi javascript.


Sebagai pemudah-cara implementasi dengan projek Ruby on Rails, berikut adalah gem yang telah dibina supaya anda boleh terus install ke projek RoR anda.


https://github.com/yusdirman/jcanvas-rails


selamat mencuba..

21 Sep 2017

Ruby on Rails: Jana `Controller` dan `View` mengikut `Model` sedia ada

Assalamualaikum


Versi TLDR;

1. Dapatkan nama:jenis_data dari model dari rails console

2.3.1 :003 > User.type_caster => #<ActiveRecord::TypeCaster::Map:0x000000052b6f88 @types=User(id: integer, nostaf: string, name: string, pengguna_id: integer, is_admin: boolean, is_active: boolean, created_by: integer, created_at: datetime, updated_at: datetime)>
2. jana scaffold dengan --skip


$\> rails generate scaffold User nostaf name is_active:boolean --skip

Situasi

Untuk memudahkan dan mempercepatkan pembinaan struktur pangkalan data dan jadual-jadual fizikal, lebih mudah untuk kita jana `Model` terlebih dahulu kita betul-betul yakin dan berpuas hati barulah kita jana `Controller` dan `View` untuk model tersebut.

Kenapa tidak boleh terus jana dengan scaffold semasa pertama kali jana untuk setiap model?

 1. Sebabnya, biasanya,  kita perlu banyak ubah, tambah dan kemaskini setiap model untuk dapatkan atribut yang tepat.

2. Perlu tentukan hubungan antara jadual atau 'table relationship' dalam pangkalan data

3. Perlu uji dan buktikan  setiap konsep dalam hubungan jadual (perlu uji setiap belongs_to, has_many dan has_many: through:)

4. Semai data (seed data)

dan lain-lain sebab yang akan menyebabkan setiap kali perubahan, akan menjadikan controller dan view kita lapuk berbanding model.

Dan adalah sangat kritikal kita perlu tahu, sebagai programmer yang pemalas, kami malas nak menaip dan membaiki banyak kali.


Contohnya seperti di bawah:


Katakan kita ada dua entiti iaitu User dan Department

yang mana, User duduk di bawah satu Department

User dan  Department ada atribut masing-masing seperti berikut;

User: noic, name, address, department_id
Department: name

Dan, katakan kita telahpun bina model-model ini dalam rails
$\> rails g model Department name
Running via Spring preloader in process 20379
      invoke  active_record
      create    db/migrate/20170921050009_create_departments.rb
      create    app/models/department.rb
      invoke    test_unit
      create      test/models/department_test.rb
      create      test/fixtures/departments.yml

$\> rails g model User noic name address department:referencesRunning via Spring preloader in process 20403      invoke  active_record      create    db/migrate/20170921050023_create_users.rb      create    app/models/user.rb      invoke    test_unit      create      test/models/user_test.rb      create      test/fixtures/users.yml


Oleh itu, membina hanya view dan controller sahaja tanpa membina semula model adalah seperti berikut

$\> rails g scaffold Department name --skip
Running via Spring preloader in process 20456
      invoke  active_record
   identical    db/migrate/20170921050009_create_departments.rb
   identical    app/models/department.rb
      invoke    test_unit
   identical      test/models/department_test.rb
   identical      test/fixtures/departments.yml
      invoke  resource_route
       route    resources :departments
      invoke  scaffold_controller
      create    app/controllers/departments_controller.rb
      invoke    erb
      create      app/views/departments
      create      app/views/departments/index.html.erb
      create      app/views/departments/edit.html.erb
      create      app/views/departments/show.html.erb
      create      app/views/departments/new.html.erb
      create      app/views/departments/_form.html.erb
      invoke    test_unit
      create      test/controllers/departments_controller_test.rb
      invoke    helper
      create      app/helpers/departments_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/departments/index.json.jbuilder
      create      app/views/departments/show.json.jbuilder
      create      app/views/departments/_department.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/departments.coffee
      invoke    scss
      create      app/assets/stylesheets/departments.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss

$\> rails g scaffold User noic name address, department:references --skip


Perhatikan, dengan menambah pilihan --skip dalam arahan, rails tidak akan menulis semula fail yang telah sedia ada.


Jadual DB sedia ada 

Bagaimana untuk Jadual DB yang sudahpun dibina oleh sistem sebelum ini? Maksudnya kita menggunakan Ruby on Rails di atas sistem yang sudahpun siap dibina oleh orang lain?
Kita boleh lakukan seperti ini:

Mula-mula sekali, dapatkan nama-nama lajur berdasarkan jadual DB, janakan scaffold anda seperti di bawah dengan menambah pilihan "--migration=false"

$\> rails g scaffold Pengguna noic nama alamat emel notelefon --migration=false
Running via Spring preloader in process 21411
      invoke  active_record
      create    app/models/pengguna.rb
      invoke    test_unit
      create      test/models/pengguna_test.rb
      create      test/fixtures/penggunas.yml
      invoke  resource_route
       route    resources :penggunas
      invoke  scaffold_controller
      create    app/controllers/penggunas_controller.rb
      invoke    erb
      create      app/views/penggunas
      create      app/views/penggunas/index.html.erb
      create      app/views/penggunas/edit.html.erb
      create      app/views/penggunas/show.html.erb
      create      app/views/penggunas/new.html.erb
      create      app/views/penggunas/_form.html.erb
      invoke    test_unit
      create      test/controllers/penggunas_controller_test.rb
      invoke    helper
      create      app/helpers/penggunas_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/penggunas/index.json.jbuilder
      create      app/views/penggunas/show.json.jbuilder
      create      app/views/penggunas/_pengguna.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/penggunas.coffee
      invoke    scss
      create      app/assets/stylesheets/penggunas.scss
      invoke  scss
   identical    app/assets/stylesheets/scaffolds.scss


Rails akan membina semua fail yang diperlukan, dan, yang paling menarik adalah, borang yang dijana oleh rails akan mengikut atribut yang kita tulis semasa jana scaffold.

seperti dalam contoh di atas,  isikandungan fail app/views/penggunas/_form.html.erb adalah seperti berikut:


<%= form_for(@pengguna) do |f| %>

  <% if @pengguna.errors.any? %>
   
     

<%= pluralize(@pengguna.errors.count, "error") %> prohibited this pengguna from being saved:


     
          <% @pengguna.errors.full_messages.each do |message| %>
           


  • <%= message %>
  •       <% end %>
         
       
      <% end %>

     
        <%= f.label :noic %>
        <%= f.text_field :noic %>
     
     
        <%= f.label :nama %>
        <%= f.text_field :nama %>
     
     
        <%= f.label :alamat %>
        <%= f.text_field :alamat %>
     
     
        <%= f.label :emel %>
        <%= f.text_field :emel %>
     
     
        <%= f.label :notelefon %>
        <%= f.text_field :notelefon %>
     
     
        <%= f.submit %>
     
    <% end %>


    Perhatikan borang ini dijana mengikut apa yang kita setkan dan ianya dijana secara automatik. Ini akan menggembirakan orang yang malas menaip koding.

    Kesimpulan
    Oleh kerana kita malas, 

    Untuk mejimatkan masa kita dan mengelakkan kita daripada mengulangi kerja yang sama setiap kali perubahan pada model berlaku di awal pembangunan sistem, kita boleh bina dahulu model yang tepat dan menguji konsep tersebut tanpa perlu apa apa Controller dan View sehingga kita berpuas hati.

    Setelah itu, untuk mula membangunkan antaramuka pengguna dan aliran kerja sistem, barulah kita jana semua fail-fail tersebut secara automatik berdasarkan ciri-ciri model yang terkini.


    Selamat berkod


    Wassalamualaikum

    15 Jun 2017

    Kompil dan Install QJson dengan Windows10, Cmake, MinGW untuk qt4.8

    Assalamualaikum

    Untuk melancarkan penggunaan webservices yang banyak menggunakan json dalam kod program qt4.8, adalah perlu untuk kita kompil dan rujuk fail librari ini secara manual.

    Untuk lebih mudah, gunakan qt versi 5 keatas kerana sokongan untuk json ini telah sedia install.


    Keperluan

    1. Muat turun dan install

    2. Muat turun / git clone kod sumber qjson daripada github
    https://github.com/flavio/qjson
    - unzipkan fail ke dalam satu folder


    3. Setkan Environment Path dalam windows anda

      1. Select Start, select Control Panel. double click System, and select the Advanced tab.
      2. Click Environment Variables. ...
      3. In the Edit System Variable (or New System Variable) window, specify the value of the PATH environment variable. ...

    masukkan dalam path:

    1. C:\Qt\4.8.6\bin
    2. C:\MinGW\bin
    3. C:\Program Files\CMake\bin


    4. Buka Command Prompt sebagai administrator 
    -> klik kanan pada butang windows start, pilih command prompt (Admin)

    5. Selusur ke folder qjson yang telah di unzip
    • guna arahan cd untuk buka folder
    6. bina satu folder baru bernama build
    7. buka folder build 
    • cd build
    8. Masukkan arahan berikut: 

    cmake -G "MinGW Makefiles" ..
    C:\Users\user2\qjson-master\build>cmake -G "MinGW Makefiles" ..
    -- The C compiler identification is GNU 5.3.0
    -- The CXX compiler identification is GNU 5.3.0
    -- Check for working C compiler: C:/MinGW/bin/gcc.exe
    -- Check for working C compiler: C:/MinGW/bin/gcc.exe -- works
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Detecting C compile features
    -- Detecting C compile features - done
    -- Check for working CXX compiler: C:/MinGW/bin/g++.exe
    -- Check for working CXX compiler: C:/MinGW/bin/g++.exe -- works
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Detecting CXX compile features
    -- Detecting CXX compile features - done
    CMake Deprecation Warning at CMakeLists.txt:11 (cmake_policy):
      The OLD behavior for policy CMP0020 will be removed from a future version
      of CMake.

      The cmake-policies(7) manual explains that the OLD behaviors of all
      policies are deprecated and that a policy should be set to OLD only under
      specific short-term circumstances.  Projects should be ported to the NEW
      behavior and not rely on setting a policy to OLD.


    Qt5 not found, searching for Qt4
    -- Looking for Q_WS_X11
    -- Looking for Q_WS_X11 - not found
    -- Looking for Q_WS_WIN
    -- Looking for Q_WS_WIN - found
    -- Looking for Q_WS_QWS
    -- Looking for Q_WS_QWS - not found
    -- Looking for Q_WS_MAC
    -- Looking for Q_WS_MAC - not found
    -- Found Qt4: C:/Qt/4.8.6/bin/qmake.exe (found suitable version "4.8.6", minimum required is "4.5")
    Enable QStringBuilder
    -- Configuring done
    -- Generating done
    -- Build files have been written to: C:/Users/user2/qjson-master/build

    9. Setelah selesai, masukkan arahan berikut pula

    make
    C:\Users\user2\qjson-master\build>make
    [  8%] Generating moc_serializerrunnable.cxx
    [ 16%] Generating moc_parserrunnable.cxx
    Scanning dependencies of target qjson
    [ 25%] Building CXX object src/CMakeFiles/qjson.dir/parser.cpp.obj
    [ 33%] Building CXX object src/CMakeFiles/qjson.dir/qobjecthelper.cpp.obj
    [ 41%] Building CXX object src/CMakeFiles/qjson.dir/json_scanner.cpp.obj
    [ 50%] Building CXX object src/CMakeFiles/qjson.dir/json_parser.cc.obj
    [ 58%] Building CXX object src/CMakeFiles/qjson.dir/parserrunnable.cpp.obj
    [ 66%] Building CXX object src/CMakeFiles/qjson.dir/serializer.cpp.obj
    [ 75%] Building CXX object src/CMakeFiles/qjson.dir/serializerrunnable.cpp.obj
    [ 83%] Building CXX object src/CMakeFiles/qjson.dir/moc_parserrunnable.cxx.obj
    [ 91%] Building CXX object src/CMakeFiles/qjson.dir/moc_serializerrunnable.cxx.obj
    [100%] Linking CXX shared library libqjson.dll
    [100%] Built target qjson

    10. Akhir sekali, masukkan arahan ini

    make install
    C:\Users\user2\qjson-master\build>make install
    [100%] Built target qjson
    Install the project...
    -- Install configuration: ""
    -- Installing: C:/Program Files (x86)/qjson/lib/cmake/qjson/QJSONTargets.cmake
    -- Installing: C:/Program Files (x86)/qjson/lib/cmake/qjson/QJSONTargets-noconfig.cmake
    -- Installing: C:/Program Files (x86)/qjson/lib/cmake/qjson/QJSONConfig.cmake
    -- Installing: C:/Program Files (x86)/qjson/lib/cmake/qjson/QJSONConfigVersion.cmake
    -- Installing: C:/Program Files (x86)/qjson/lib/libqjson.dll.a
    -- Installing: C:/Program Files (x86)/qjson/bin/libqjson.dll
    -- Installing: C:/Program Files (x86)/qjson/include/qjson/parser.h
    -- Installing: C:/Program Files (x86)/qjson/include/qjson/parserrunnable.h
    -- Installing: C:/Program Files (x86)/qjson/include/qjson/qobjecthelper.h
    -- Installing: C:/Program Files (x86)/qjson/include/qjson/serializer.h
    -- Installing: C:/Program Files (x86)/qjson/include/qjson/serializerrunnable.h
    -- Installing: C:/Program Files (x86)/qjson/include/qjson/qjson_export.h


    kompil selesai.. selamat mencoba..


    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..