Saturday, June 30, 2018

Jembatani Usaha SEO mu dengan Google Webmaster Tools

Setelah sebelumnya saya deprisikan mengenai definisi dan pengertian dasar mengenai SEO di artikel saya sebelumnya, di postingan saya kali ini saya ingin mengajak para peminat dari SEO untuk memulai apa sih yang harus di lakukan untuk memulai perjalanan pengoptimalan mesin pencarian yang seru tanpa henti.

Perlu di ingat, dalam melakukan perjalanan ini ketekunan, kesabaran, dan semangat serta ketelitian merupakan faktor penting dalam memaksimalkan SEO untuk situs web anda. Maka dari itu mari kita bikin terlebih dahulu jembatan untuk mengatur optimasi mesin pencarian google ( saya mengambil google karena sebagian besar pengguna internet default google sebagai mesin pencarian mereka ).


Kali ini saya ingin menjelaskan tentang fungsi serta penggunaan tools SEO gratis dari google yaitu 

Google Webmaster Tools sendiri sebuah produk GRATIS dari google web based untuk hal-hal seperti Verification Details, Website yang didaftarkan di mesin pencari google, Search Appearance, Search Traffik, Google Index, Crawl, Security Issues dan Other Resources.

Fungsi fungsi utama Google Webmaster Tools dibawah ini adalah :

  1. Trafik Pencarian ? Pada menu pertama ini trafik dalam pencarian ini terdapat beberapa subMenu yaitu : Search Queries, Links to Your Site, Internal Links, Manual Actions, International Targeting, Mobile Usability. Dari menu ini kita bisa mengetahui Traffik yang datang ke website kita melalui link yang mana. Kemudian Link mana saja yang mengarah ke website kita atau artikel kita, baik itu internal link ataupun dari luar. Selain itu kita juga bisa melihat performance website kita ketika dibuka dari Desktop atau Smartphone. Apakah ada bagian yang eror.
  2. Index Google ? Ya namanya juga index google dari produk google itu sendiri jadi sudah terlihat cukup jelas, pada menu google Index ini ada beberapa menu yaitu : Index Status, Content Keywords, Blocked Resources dan Remove URLs. Menu-menu ini sangat penting perananya untuk mengatur link yang ada di direktory google. Sehingga jika ada yang hendak kita delet atau kita hapus link nya dari google, kita menggunakan menu ini. Terdapat menu Remuve URLs.

    Perlu di ingat yang terpentik agar terindex dengan google dengan cepat dan tepat hindari Content Keywords yang berlebihan sehingga situs anda tidak terindikasi sebagai SPAM atau di flag sebagai SAMPAH.
  3. Crawl ? Ini juga sangat penting menu di dalamnya adalah : Crawl Errors, Crawl Stats, Fetch as Google, robots.txt, Tester, Sitemaps, URL Parameters. Dari Menu Crawl Erorr kita bisa menghapus link-link erorr yang sudah pernah kita masukkan di google. Patikan semua menu tersebut anda cek dan tidak ada erorr nya. Jika ada erorr, maka segeralah memperbaikinya agar web/blog anda mudah terindex google kembali. Pastikan juga bahwa anda men-Submit Sitemap.XML anda.
  4. Kemunculan Pencarian ? Point - point yang dapat kita gunakan melalui menu ini. Yang pertama Struktur Data. Struktur data ini terdiri dari : Hentry (author, entry-title, updated), Review, WebSite, Person,  AggregateRating, hcard. Untuk melihat lebih jelasnya silahkan masuk ke google webmaster tools. Jika ada kesalahan, cepat memperbaikinya agar web/blog anda tetap dalam keadaan sehat dan baik
Nah setelah anda memahami fungsi dasar dari tools SEO dari google yang gratis ini maka saatnya kita lompat ke prosedur penggunaan GWT.

Masuk ke halaman google webmaster tools dengan email anda dan masukan property URL website anda








Nah ketika anda sudah memasukkan property ke console dari google tersebut, sekarang google ingin
mengetahui apakah ownership dari website yang ingin anda proses menggunakan GWT. Google akan memberikan beberapa cara yang bisa anda pilih.

Apabila anda tidak merasa aman dan nyaman dalam mengUpload file HTML anda, ada metode alternatif lain yang dapat anda gunakan, seperti menambahkan meta tags ke halaman index.html milik anda. Akan lebih mudah lagi apabila anda menggunakan tools gratis dari google lainnya seperti Google Analytics serta Google Tag Manager..


 
Selanjutnya kita akan mulai memasuki ke dalam console preference, disini anda dapat mengatur apakah GWT akan mengirimkan notifikasi tentang perkembangan SEO kedalam email anda,baik itu error ataupun notifikasi lainnya, tentu anda dapat mengEnable atau menDisable fitur ini secara manual.

.

Anda menambahkan user dan property owner dimana anda dapat mengasosiasikan kerabat kerja yang bekerja dengan anda yang ingin membantu usaha SEO bersama sama sehingga beberapa fitur dari GWT dapat anda bagi dengan kerabat kerja anda, yang pasti penambahan user dan property owner ini membutuhkan email gmail yang utama.
 

Yang berikutnya adalah Verification Detail sekarang ini adalah sesuatu yang sudah kita lakukan. Ini hanya akan memberi tahu Anda ketika seseorang telah mencoba memverifikasi akun, apakah itu gagal atau berhasil dan bagaimana mereka melakukan verifikasi kepemilikan situs ini.

Yang terakhir adalah Associates. Ini karena jika Anda ingin menambahkan pengguna baru yang terkait. Ini sering digunakan jika Anda ingin tidur siang dalam kaitannya dengan situs web Anda dan katakanlah Anda ingin Google pada kesempatan tertentu mengirimkannya kepada pengguna langsung ke aplikasi web versus situs web Anda, ini akan membantu Anda menyiapkannya di sini .

Setelah melakukan langkah di atas seiring waktu anda dapat melihat dan memonitoring hasil dari usaha SEO anda yang di lakukan di luar GWT, seperti SEO onpage dan SEO Offpage yang menggunakan banyak metode seperti yang dapat anda lihat yaitu Struktural Data website anda.







yang dimana Struktral Data pada GWT ini menampilkan dan digunakan untuk membantu Google mencari tahu apa sebenarnya situs Anda dan membantunya menampilkan Cuplikan Kaya dan hasil pencarian. Jadi ini adalah ketika Anda ingin menambahkan markup data terstruktur ke situs web Anda dan Anda dapat mencari jenis konten yang Anda miliki dan dalam kode Anda.

dan yang terakhir dalam postingan saya kali ini yaitu mengenai Search Traffic dan Search Analytics, yang pasti hal ini dapat di pantau dan di monitoring menggunakan GWT.

Search Traffic  ini jelas terkait dengan semua informasi tentang lalu lintas pencarian yang Anda terima di situs web Anda, dan itu memberi anda banyak informasi berharga yang dapat Anda gunakan untuk benar-benar meningkatkan peringkat Anda, dan meningkatkan lalu lintas Anda dan segala sesuatu yang terjadi dengan situs web.

Sedangkan untuk Search Analytics dapat menampilkan informasi dari situs anda, anda akan diberi bagan dari semua analitik pencarian Anda yang berbeda yang akan dapat Anda sesuaikan. Jadi anda benar-benar dapat menelusuri halaman tertentu, Anda benar-benar dapat membandingkan halaman yang berbeda dan ini akan memberi tahu Anda bagaimana Anda dapat meningkatkan konten yang ada di situs anda.


Conclusion : Banyak Tools tools untuk diluar sana yang mempunyai fitur yang tidak ada di GWT seperti Moz, SEMrush, dll. yang Tools apapun yang anda gunakan di luar sana tidak luput dari monitoring dari user atau property owner karena SEO ini adalah proses yang konsisten dan memerlukan beberapa sentuhan improvisasi, intinya kembali lagi dari bagaimana usaha kita dalam menggunakan tools tools gratis demi mencapai tujuan untuk site kita.


Reference :
https://www.amazeemetrics.com/en/blog/seo-tutorial-google-webmaster-tools

https://neilpatel.com/blog/beginners-guide-to-google-webmaster-tools/

https://support.google.com/webmasters/?hl=en

Implementasi Ansible Playbook

Halo, kali ini saya akan melanjutkan pembahasan mengenai ansible yang sebelumnya dibuat rekan saya. Pada post sebelumnya sudah ada pengenalan ansible dan ansbile playbook. Sedikit mengulang kembali Ansible adalah sebuah provisioning tool yang dikembangkan oleh RedHat. Dimana kamu dapat mencatat setiap proses deployment ataupun konfigurasi yang biasa dilakukan berulang - ulang terhadap beberapa server. Saat ini saya akan membahas lebih dalam lagi mengenai ansible roles dimana task-task ini akan menjalankan modul-modul yang sudah dibuat. Beberapa contoh task yang akan saya berikan seperti task untuk user provisioning, set hostname, nginx, nodejs.


Directory Layout


Untuk memudahkan kita dalam menggunakan ansible kita perlu mengetahui susunan direktori dan file-file dari ansible. Berikut contoh susunan file-file script ansible

 production        # inventory file for production servers  
 staging          # inventory file for staging environment  
 group_vars/  
   group1.yml       # here we assign variables to particular groups  
   group2.yml  
 host_vars/  
   hostname1.yml     # here we assign variables to particular systems  
   hostname2.yml  
 library/         # if any custom modules, put them here (optional)  
 module_utils/       # if any custom module_utils to support modules, put them here (optional)  
 filter_plugins/      # if any custom filter plugins, put them here (optional)  
 site.yml         # master playbook  
 webservers.yml      # playbook for webserver tier  
 dbservers.yml       # playbook for dbserver tier  
 roles/  
   common/        # this hierarchy represents a "role"  
     tasks/      #  
       main.yml   # <-- tasks file can include smaller files if warranted  
     handlers/     #  
       main.yml   # <-- handlers file  
     templates/    # <-- files for use with the template resource  
       ntp.conf.j2  # <------- templates end in .j2  
     files/      #  
       bar.txt    # <-- files for use with the copy resource  
       foo.sh    # <-- script files for use with the script resource  
     vars/       #  
       main.yml   # <-- variables associated with this role  
     defaults/     #  
       main.yml   # <-- default lower priority variables for this role  
     meta/       #  
       main.yml   # <-- role dependencies  
     library/     # roles can also include custom modules  
     module_utils/   # roles can also include custom module_utils  
     lookup_plugins/  # or other types of plugins, like lookup in this case  
   webtier/       # same kind of structure as "common" was above, done for the webtier role  
   monitoring/      # ""  
   fooapp/  


Pada ansible ada beberapa istilah seperti inventories, tasks, playbook, roles, vars, files, templates, handlers, tags.

inventories:  berisi host-host dan variable host var atau grup var yang digunakan pada environment seperti production, staging, atau environtment lainnya

tasks: berisi perintah-perintah yang akan dijalakan dalam role secara berurutan yang dipanggil didalam ansible playbook

playbook: berisi kumpulan role-role ansible yang akan dijalankan untuk mengkonfigurasi sebuah server atau hal lainnya.

roles: berisi semua task-task, files, handlers, vars, atau templates

variables: variabel yang bisa berupa kata yang bisa kita set nilainya

files: berisi file-file yang akan di transfer ke server

templates:
handlers: berisikan langkah yang akan dieksekusi dalam tasks bila task tersebut sudah dilakukan. seperti start, stop, restart, dll.

tags: pemberian nama pengenal pada setiap task sehingga pada waktu menjalankan ansible playbook kita dapat memilih task-task apa saja yang akan digunakan dengan memilih tag-tag yang kita butuhkan.


Implementasi Ansible

Untuk memulainya saya sudah siapkan 3 buah vm yang sudah terpasang ansible di dalamnya.
  • 192.16.10.11 = ansible server
  • 192.16.10.12 = server target 1
  • 192.16.10.13 = server target 2
susunan file ansible kali ini seperti di bawah ini:
 ├── ansible.cfg  
 ├── files  
 │  └── install_node.sh  
 ├── inventories  
 │  └── production  
 │    ├── group_vars  
 │    │  └── ansible.yml  
 │    └── hosts  
 ├── playbook  
 │  ├── nodejs.yml  
 │  └── webserver.yml  
 ├── roles  
 │  ├── add-user  
 │  │  └── tasks  
 │  │    └── main.yml  
 │  ├── common  
 │  │  └── tasks  
 │  │    └── main.yml  
 │  ├── nginx  
 │  │  └── tasks  
 │  │    └── main.yml  
 │  └── nodejs  
 │    └── tasks  
 │      ├── install.yml  
 │      └── main.yml  
 ├── scripts  
 │  └── production  
 │    ├── nodejs.sh  
 │    └── webserver.sh  
 └── templates  
   ├── nginx.conf.j2  
   └── service1.conf  


Dari susunan di atas saya ingin memperlihatkan isi dari file-file tersebut:

file ./files/install_node.sh. adalah script untuk menginstall nodejs pada server. isi file tersebut seperti di bawah ini
 #!/bin/bash  
 curl -sL https://rpm.nodesource.com/setup_8.x | bash -  
 yum install -y nodejs  
 sudo npm install pm2 -g  

file inventories/production/group_vars/ansible.yml , file ini berisi variabel-variabel yang akan digunakan pada ansible. isi file tersebut seperti di bawah ini
 nginx_port: 80  
 server_name.default: horas.tk  

isi file inventories/production/group_vars/nginx.yml
 web_dir: /usr/share/nginx  

isi dari file inventories/production/hosts seperti di bawah ini
 [all]  
 server2          ansible_host=192.16.10.12  
 server3          ansible_host=192.16.10.13  

isi dari file ./playbook/nodejs.yml
 - hosts: all  
  remote_user: root  
  become: yes  
  roles:  
   - nodejs  

isi dari file ./playbook/webserver.yml
 - hosts: all  
  remote_user: root  
  become: yes  
  roles:  
   - add-user  
   - common  
   - nginx  

isi dari file ./roles/add-user/tasks/main.yml
 - name: Allow 'wheel' group to have passwordless sudo  
  lineinfile:  
   dest: /etc/sudoers  
   state: present  
   regexp: '^%wheel'  
   line: '%wheel ALL=(ALL) NOPASSWD: ALL'  
   validate: visudo -cf %s  
  when: ansible_os_family == "RedHat"  
  tags: sudoers  
 - name: Allow 'sudo' group to have passwordless sudo  
  lineinfile:  
   dest: /etc/sudoers  
   state: present  
   regexp: '^%sudo'  
   line: '%sudo ALL=(ALL) NOPASSWD: ALL'  
   validate: visudo -cf %s  
  when: ansible_os_family == "Debian"  
  tags: sudoers  
 - name: Ensure group "developer" exists  
  group:  
   name: developer  
   state: present  
  tags: add_group  
 - name: Create user  
  user: name="{{ item.name}}" comment="Create user with ansible" groups=developer append=yes shell=/bin/bash  
  with_items:  
   - { name: land }  
   - { name: regar }  
  tags: create_user  
 - name: Placing SSH Key to Authorized Key  
  authorized_key: user="{{item.name}}" key="{{ item.key}}"  
  with_items:  
   - {name: land, key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCm2wey+RyM81ZWgyEU7npsEUq0NQmtNjIMGPzxPQfxidHkzkMOp0xTyBFJFb95CwQMYxEQz5gzDv5TWZjT0u/1yxfck8pPgotNpPzGbgVTEDmuN/P5SgEhF1gpotYimRomMsMiAf6NEyV5VqUk+dS+F1xbwsdbwwfGle4eI1QeaLXSCnlb9xwDuDcFe+nz0X7m8dnzYtglEIkXPfbXlJUDtxQCBSgVDMnHukJABAwCNdbZgxnr/ZL7zjSOTkQxB2zSQR6+aY01oVj39A4kdw4x/xsoZ5zjeAC5/viYimfLppF1vCLlPLSCIQrsp0D6ym5Em6Xq1huHkLozfjutsdD7 land@latihan1}  
   - {name: regar, key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCm2wey+RyM81ZWgyEU7npsEUq0NQmtNjIMGPzxPQfxidHkzkMOp0xTyBFJFb95CwQMYxEQz5gzDv5TWZjT0u/1yxfck8pPgotNpPzGbgVTEDmuN/P5SgEhF1gpotYimRomMsMiAf6NEyV5VqUk+dS+F1xbwsdbwwfGle4eI1QeaLXSCnlb9xwDuDcFe+nz0X7m8dnzYtglEIkXPfbXlJUDtxQCBSgVDMnHukJABAwCNdbZgxnr/ZL7zjSOTkQxB2zSQR6+aY01oVj39A4kdw4x/xsoZ5zjeAC5/viYimfLppF1vCLlPLSCIQrsp0D6ym5Em6Xq1huHkLozfjutsdD7 regar@latihan1}  
  tags: create_user  
 - name: Add group user to sudo  
  user: name="{{ item.name}}" groups=wheel append=yes shell=/bin/bash  
  with_items:  
   - { name: land }  
   - { name: regar }  
  when: ansible_os_family == "RedHat"  
  tags: add_sudo  
 - name: Add group user to sudo  
  user: name="{{ item.name}}" groups=sudo append=yes shell=/bin/bash  
  with_items:  
   - { name: land }  
   - { name: regar }  
  when: ansible_os_family == "Debian"  
  tags: add_sudo  

isi dari file ./roles/common/tasks/main.yml
 - name: Change the hostname  
  hostname:  
   name: "{{ inventory_hostname }}"  
  tags: hostname  
 - name: Creates directory app data  
  file:  
   path: /opt/land  
   state: directory  
   owner: root  
   group: root  
   mode: 0775  
   recurse: yes  
  tags: folder_app  
 - name: Ensure hostname is in /etc/hosts  
  lineinfile:  
   dest: /etc/hosts  
   line: "{{ansible_host}}  {{ inventory_hostname }}"  
   state: present  
  tags: hosts  

isi dari file ./roles/nginx/tasks/main.yml
 - name: Install the nginx  
  yum:  
   name: nginx  
   state: present  
  when: ansible_os_family == "RedHat"  
  tags: install  
 - name: Install the nginx  
  apt:  
   name: nginx  
   state: present  
  when: ansible_os_family == "Debian"  
  tags: install  
 - name: Enable nginx default.conf  
  template:  
   src: ../templates/nginx.conf.j2  
   dest: /etc/nginx/nginx.conf  
   owner: root  
   group: root  
   mode: 0644  
  tags: default  
 - name: restart nginx  
  service:  
   name: nginx  
   state: restarted  
   enabled: yes  
  tags: restart  

isi dari file ./roles/nodejs/tasks/main.yml
 - name: copy script install node  
  copy:  
   src: /etc/ansible/files/install_node.sh  
   dest: /home/ci/install_node.sh  
   mode: 0755  
  when: ansible_os_family == "RedHat"  
  tags: copy script  
 - name: install repo nodejs  
  shell: /home/ci/install_node.sh  
  when: ansible_os_family == "RedHat"  
  tags: nodejs  
 - name: Install the epel packages for EL distributions  
  package: name=epel-release state=present  
  when: ansible_os_family == "RedHat"  
  tags: install  
 - name: install nodejs v 8.6.0  
  shell: export NVM_DIR=/opt/app/.nvm && curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash && . /root/.bashrc && nvm install 8.6.0  
  when: ansible_os_family == "Debian"  
  tags: nodejs  
 - name: Creates directory app pm2  
  file:  
   path: /pm2  
   state: directory  
   owner: root  
   group: root  
   mode: 0777  
   recurse: yes  
  tags: folder  
 - name: install pm2 global  
  shell: ln -sf /opt/app/.nvm/versions/node/v8.6.0/bin/node /usr/bin/node && /opt/app/.nvm/versions/node/v8.6.0/bin/npm install pm2 -g  
  become: yes  
  when: ansible_os_family == "Debian"  
  tags: pm2  
 - name: Export PM2 home  
  lineinfile:  
   dest: /etc/profile  
   line: "export PM2_HOME=/pm2"  
   state: present  
  tags: pm2_home  

isi dari file ./templates/nginx.conf.j2
 server {  
   listen {{ nginx_port }} ;  
   listen [::]:{{ nginx_port }} ;  
   server_name {{ server_name.default }};  
   root {{ web_dir }};  
   index index.html index.htm index.nginx-debian.html;  
   location / {  
     try_files $uri $uri/ =404;  
   }  
 }  

isi dari file ./scipts/production/nodejs.sh
 #!/bin/bash  
 cd /etc/ansible  
 ansible-playbook -i inventories/production nodejs.yml  

isi dari file ./scipts/production/webserver.sh
 #!/bin/bash  
 cd /etc/ansible  
 ansible-playbook -i inventories/production webserver.yml  

Setelah kita membuat semua file tersebut sekarang kita akan menjalankan command ansbile playbook dari server ansible. Untuk menginstall web server nginx kita dapat menjalankan script bash ./scipts/production/webserver.sh yang di dalam file tersebut terdapat command ansible playbook.
 ./scipts/production/webserver.sh  
setelah selesai di run, maka task-task yang ada pada playbook webserver seperti create folder, add-user, add user to sudo,  set hostname, install nginx, copy nginx, dan run nginx.

untuk menginstall nodejs kita dapat menjalankan perintah di bawah ini
 ./scipts/production/nodejs.sh  
playbook tersebut akan menjalankan semua task-task yang dibutuhkan untuk instalasi nodejs.


Masih banyak lagi penggunaaan dan contoh-contoh ansible playbook untuk yang dapat digunakan untuk mempermudah kita karena tidak perlu melakukan hal yang sama berulang-ulang. Untuk lebih lengkapnya bisa mengunjungi link ini https://docs.ansible.com/ansible/latest/index.html . Untuk contoh playbook yang lain bisa kita dapatkan dari github atau blog-blog lain.

Sekian tutorial kali ini semoga bermanfaat.





Konfigurasi Datasource di Wildfly


Salam,

Untuk kali ini saya akan sharing mengenai bagaimana cara konfigurasi datasource di application server Wildfly .

Langkah pertama kita masuk ke folder Wildfly => bin => lalu kita jalankan file standalone untuk windows bisa klik 2 kali untuk linux ./jboss-cli.sh


Kemudian akan tampil keterangan bahwa wildfly sudah running dan bisa kita akses dengan port 9990


Selanjutnya kita masuk ke console wildlfy, untuk create user admin wildfly bisa di lihat disini .


Lalu untuk selanjutnya kita pilih di tab configuration  => create datasource => pilih start , kemudian akan muncul seperti tab dibawah ini.



Setelah itu kita pilih add untuk menambahkan datasource baru , lalu akan muncul tab pilihan datasource yang akan kita buat . untuk contoh disini saya menggunakan database postgreSql kemudian pilih next 


Setelah itu kita beri nama untuk datasource yang akan dibuat lalu pilih next .


Kemudian akan tampil tab Jdbc Driver untuk datasource yang akan kita buat . Jika Jdbc Driver datasoruce yang akan kita buat belum ada, bisa kita tambahkan sendiri untuk caranya bisa dilihat disini . 


Selanjutnya kita setting koneksi ke database yang akan kita jadikan sebagai datasource lalu pilih Finish.


Setelah selesai bisa kita lihat di tab datasource yang telah kita buat . untuk mengetahui datasource yang telah kita buat berhasil atau tidak, kita bisa melakukan test koneksi dengan cara klik tab disamping view lalu pilih Test Connection.  


Jika berhasil maka akan muncul tampilan seperti gambar dibawah ini .


yups,

Mungkin itu saja yang bisa saya sharing untuk kesempatan kali ini .

Salam

Reference

- https://bgasparotto.com/add-user-wildfly
- https://tomylab.wordpress.com/2016/07/24/how-to-add-a-datasource-to-wildfly/





Rest API using Play Framework in Java

Halooo . . .
Kali ini saya membuat tulisan mengenai Rest API menggunakan Play Framework khususnya java pada play framework

Sebelumnya, apa itu play framework?
Play Framework adalah framework open souce aplikasi web yang ditulis dengan Scala dan juga pemrograman lainnya seperti Java.
Biasanya pemrograman yang menggunakan java membutuhkan waktu untuk proses build dan deploy. Nah, dengan menggunakan framework ini, hasil coding tersebut hanya cukup kita save dan refresh browser atau postman untuk melihat hasil coding yang kita kerjakan.
Terkadang ada juga pemrograman yang menggunakan java harus restart server terlebih dahulu, padahal yang di edit hanya sedikit line code.

Typesafe Activator merupakan platform yang bisa digunakan untuk membuat dan menjalankan project play framework. Untuk download typesafe activator dapat di download pada link berikut: http://typesafe.com/activator
atau jika anda menggunakan mac, cukup gunakan perintah berikut pada terminal anda :
brew install typesafe-activator

Tanpa basa-basi kita create new project dulu ya . .
  1.  Create new Project

    Pertama buka terminal terlebih dahulu, dan pergi ke direktori dimana kita akan create project baru kita
    Gambar 1

    Kemudian ketik perintah : activator new 

    Gambar 2
    Maka akan muncul beberapa pilihan seperti gambar di atas (Gambar 2). dan kita akan memilih nomor 5

    Gambar 3
    Pada gambar diatas (Gambar 3) project sudah berhasil di create dengan nama project (play-java) 

    Untuk menjalankannya : activator run
    Gambar 4
    untuk testing di postman atau di browser : //localhost:9000

    Gambar 5 Tampilan awal Play Framework
  2.  Konfigurasi database
    Tambahkan code-code berikut pada file:

    Pada file build.sbt :



  3. Pada file plugins.sbt : 

            

     Pada file application.conf :
  4. Models
    Selanjutnya kita akan membuat model
    package models;
    import com.avaje.ebean.Model;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    @Entity
    @Table(name = "anggota")
    public class Anggota extends Model {
        @Id    
        private Integer id_anggota;
        private String nama_anggota;
        private String alamat_anggota;
    
        public Integer getId_anggota() {
            return id_anggota;    }
        public void setId_anggota(Integer id_anggota) {
            this.id_anggota = id_anggota;    }
    
        public String getNama_anggota() {
            return nama_anggota;    }
    
        public void setNama_anggota(String nama_anggota) {
            this.nama_anggota = nama_anggota;    }
    
        public String getAlamat_anggota() {
            return alamat_anggota;    }
    
        public void setAlamat_anggota(String alamat_anggota) {
            this.alamat_anggota = alamat_anggota;    }
    }
    
  5. Controller
    Dan ini untuk controller
    package controllers;
    import repository.AnggotaRepository;
    import com.fasterxml.jackson.databind.JsonNode;
    import models.Anggota;
    import org.springframework.beans.factory.annotation.Autowired;
    import play.libs.Json;
    import play.mvc.Controller;
    import play.mvc.Result;
    
    import java.util.List;
    public class AnggotaController extends Controller {
    
        @Autowired    AnggotaRepository anggotaRepository;
        public Result viewAnggota(String nama){
            List<Anggota> anggotas = anggotaRepository.cocoTasks(nama);
    
    return ok(Json.toJson(anggotas));
    } public Result listAnggota(){ List<Anggota> anggotas = anggotaRepository.cocoList();
    return ok(Json.toJson(anggotas));
    } public Result createAnggota() { JsonNode json = request().body().asJson();
    Anggota anggota = new Anggota();   
    anggota = (Anggota)Json.fromJson(json,Anggota.class);  
    anggota.save();
    return ok(Json.toJson(anggota));
    } public Result updateAnggota(){
    JsonNode json = request().body().asJson();
    Anggota anggota = new Anggota(); anggota = (Anggota)Json.fromJson(json, Anggota.class); anggota.update(); return ok(Json.toJson(anggota));
    } public Result delete(Integer id_anggota){ Anggota anggota = anggotaRepository.findById(id_anggota); if(anggota==null){   return notFound(Json.toJson("Anggota not Found"));  } anggota.delete(); return ok(Json.toJson("Anggota "+id_anggota+"has been deleted")); } }
  6. Repository
    Dalam project sederhana ini, saya buat file repository. Dimana dalam file ini berisi query-query data yang saya gunakan
    package repository;
    import com.avaje.ebean.Model;import models.Anggota;
    import java.util.List;
    public class AnggotaRepository {
    
        public static Model.Finder<Integer, Anggota> find = 
            new Model.Finder<Integer, Anggota>(Integer.class, Anggota.class);
    
        public static   List<Anggota> cocoTasks(String nama){
            return  find                .query().where()
                    .ilike("nama_anggota","%"+nama+"%")
                    .orderBy("id_anggota").findList();
        }
        public static List<Anggota> cocoList(){
            return  find.orderBy("id_anggota").findList();
        }
    
        public static Anggota findById(Integer id_anggota){
            return find.byId(id_anggota);    }
    }
    
    
    
    
  7. Mapping
    Action-action yang sudah kita code dalam controller dapat kita mapping. Untuk mapping dapat di kita lakukan pada file play-java/conf/routes
    # Routes
    # This file defines all application routes (Higher priority routes first)
    # ~~~~
    
    # An example controller showing a sample home page
    GET     /                           controllers.HomeController.index
    
    GET  /anggota/nama_anggota=:nama_anggota  controllers.AnggotaController.viewAnggota(nama_anggota:String)
    GET   /list-anggota                       controllers.AnggotaController.listAnggota()
    POST  /create-anggota                     controllers.AnggotaController.createAnggota()
    POST  /update-anggota                     controllers.AnggotaController.updateAnggota()
    DELETE  /delete-anggota/:id_anggota       controllers.AnggotaController.delete(id_anggota:Integer)
    
    # An example controller showing how to use dependency injection
    GET     /count                      controllers.CountController.count
    # An example controller showing how to write asynchronous code
    GET     /message                    controllers.AsyncController.message
    
    # Map static resources from the /public folder to the /assets URL path
    GET     /assets/*file               controllers.Assets.versioned(path="/public", file: Asset)
  8. Demo
    - Action Create
    Gambar 6. Action Create

    - Action View
    Gambar 7. List Anggota

    Gambar 8. search by nama anggota

    - Action Update
    Gambar 9. Action Update

    - Action Delete
    Gambar 10. Action Delete


    Begitu lah sharing singkat mengenai Rest API using Play Framework
    Sekian dari saya dan semoga tulisan ini bermanfaat.
    Terima kasih,

    Salam

    Reference :
    https://www.playframework.com/documentation/
    http://www.baeldung.com/rest-api-with-play
    https://www.youtube.com/watch?v=qKxgtmuPjHQ

Spring Boot Application integrate with JBoss Drools

Halo sobat Nostra,
Postingan kali ini saya akan membahas tentang membuat aplikasi spring boot yang terintegrasi dengan JBoss Drools.

Drools merupakan Business Logic integration Platform (BLip) dimana cara kerja drools itu sendiri adalah memisahkan data dan logic
Didalam drools, session berfungsi untuk menyimpan semua fakta atau object. Kemudian fakta tersebut akan dicocokan terhadap semua rules yang ada


Gambar 1. Proses pembuatan knowledge session dalam drools
1. Proses pertama diawali dengan pembuatan object KnowledgeBuilder oleh KnowledgeBuilderFactory.
2. File yang berisikan rules (.drl) dibaca oleh KnowledgeBuilder.
3. Object KnowledgeBase membaca KnowledgePackage dari KnowledgeBuilder.
4. KnowledgeBase dapat digunakan untuk mebuat knowledge session.

Sekarang kita mulai ya . .
Untuk memulai project Spring boot, kita dapat clone project dari :
git clone https://github.com/spring-guides/gs-rest-service.git

Dalam file pom.xml tambahkan :
<dependency>   
 <groupId>org.kie</groupId>   
 <artifactId>kie-ci</artifactId>   
 <version></version>
</dependency>
- Create model class Java (Product.java)
package com.drools.model;
public class Product {

   private String type;   
   private int discount;
   public String getType() {
      return type;   }

   public void setType(String type) {
      this.type = type;   }

   public int getDiscount() {
      return discount;   }

   public void setDiscount(int discount) {
      this.discount = discount;   }

}
- Create .drl file (rules.drl). File ini berisi type dari product. Pada project ini, file .drl ini saya letakkan di src/main/resources/rules
package rules
 
import com.drools.model.Product
rule "Offer for Keripik"
   when 
      productObject: Product(type=="keripik")
   then
      productObject.setDiscount(20);
   end
rule "Offer for Roti"
   when 
      productObject: Product(type=="roti")
   then
      productObject.setDiscount(17);
   end
Project Drools 6.0 terdiri dari file meta data META-INF/kmodule.xml. File ini terletak di src/main/resources/META-INF . dengan file ini knowledge session akan terbentuk. 
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <kbase name="rules" packages="rules">
       <ksession name="rulesSession" />
    </kbase>
</kmodule>
Kemudian create file controller (CemilanController)
package com.drools.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.drools.model.Product;
import com.drools.service.CemilanService;

@RestController
public class CemilanController {

   private final CemilanService cemilanService;

   @Autowired
   public CemilanController(CemilanService cemilanService) {
      this.cemilanService = cemilanService;
   }

   @RequestMapping(value = "/getDiscount", method = RequestMethod.GET, 
                   produces = "application/json")
   public Product getQuestions(@RequestParam(required = true) String type) {

      Product product = new Product();
      product.setType(type);
      cemilanService.getProductDiscount(product);
      return product;   }

}
Kemudian create CemilanService untuk mendapatkan session dan execute rules
package com.drools.service;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.drools.model.Product;

@Service
public class CemilanService {

   private final KieContainer kieContainer;
   @Autowired   
   public CemilanService(KieContainer kieContainer) {
      this.kieContainer = kieContainer;   
   }

   public Product getProductDiscount(Product product) {
      KieSession kieSession = kieContainer.newKieSession("rulesSession");
      kieSession.insert(product);
      kieSession.fireAllRules();
      kieSession.dispose();
      return product;
   }
}
Dalam service di atas, kita membuat KieSession dengan menginstance KieContainer.
KieSession itu sendiri merupakan tempat dimana data yang di input di masukkan. Dimana KieSession berinteraksi dengan mesin untuk memproses logika bisnis berdasarkan data yang dimasukkan. Dalam code diatas, kita membuat variable kieSession "rulesSession" untuk menyimpan perhitungan produk.
Untuk memasukkan data product ke dalam session, maka perintahnya adalah kieSession.insert(product), kemudian kieSession akan meminta mesin untuk menjalankan logika bisnis dengan perintah fireAllRules(). Untuk menghindari memory penuh, maka perlu membersihkan session dengan dispose(). 


Dalam file Application.java, kita langsung memanggil service yang sudah kita code diatas dengan KieServices.Factory.get()
tambahkan code berikut:
@Beanpublic KieContainer kieContainer() {
   return KieServices.Factory.get().getKieClasspathContainer();
}

Testing
Untuk melihat hasilnya, dapat di akses dengan dan hasil
http://localhost:8080/getDiscount?type=roti
dan hasilnya akan menunjukan nilai diskon dari type yang kita input dalam url

dan sekian postingan saya kali ini, semoga postingan ini bermanfaat
Terima kasih

Salam,


Search Engine Optimization for life ? why not ?

Selamat malam, selamat berbahagia, semoga para pembaca setia Blog Nostra selalu di berikan karunia kesehatan jiwa dan raga, kali ini saya pengen membagikan informasi yang cukup bermanfaat mengenai SEO, apalagi tentang penting gak sih SEO itu buat kehidupan suatu produk yang baru di go-live kan apalagi memaintain sehingga bisa menyalip para pencari produk anda.

Nah sebelum saya ulas lebih dalam lagi. APA SIH SEO itu ?? hmmm...



Search Engine Optimization ?? bukaann itu singkatan, jadi secara definitif SEO itu adalah sesuatu existensi ( kalau saya menyebutnya ) ilmu dalam dunia digital yakni proses atau aktifitas yang di lakukan secara kontinus  terhadap situs web atau halaman web anda / produk digital anda yang berbasis web kebanyakan sehingga ketika para pengguna internet mencari sesuatu yang berhubungan dengan isi dari situs web atau halaman web / produk kita itu, situs web anda akan di tampilkan dalam halaman awal dari mesin pencarian. ( sebagai contoh GOOGLE ).


Illustrasi SEO ?



siapa sih yang gak pengen situsnya peringkat 1 dalam pencarian kata kunci tertentu, sebagai contoh anda mempunyai sebuah perusahaan, perusahaan anda bergerak dibidang jasa konsultan software atau mempunyai produk yang bisa di pasarkan ke konsumer atau Business to Business. Nostra misalnya, nostra mempunyai banyak tipe jasa yakni seperti Nostra Consultant, Nostra Labs, Nostra DevOps, dsb. Maka dengan melakukan SEO atau optimisasi mesin pencari yang baik dan benar, ketika ada yang mencari dengan kata kunci Software House terbaik jakarta atau konsultan IT terbaik ( dengan bantuan mesin pencari web sebagai contoh GOOGLE ), situs web perusahaan anda akan berada dihalaman pertama daftar hasil pencarian. Semakin baik peringkat di halaman pertama dari berbagai macam kata kunci maka semakin teroptimalisasikan juga web perusahaan anda.


Terus Bedanya SEO sama Non-SEO gimana ? ( serta kelebihan dan kekurangannya )



dan masing masing kekurangan dari SEO & Non-SEO .








 Definisi Definisi dari SEO
  1. Kata kunci (atau keyword atau KW) adalah satu kata yang diketikkan oleh pengguna internet di mesin pencari.
  2.  SEO adalah search engine optimization atau search engine optimizer.
    Frasa kunci (atau key phrase) adalah frase (beberapa kata) yang diketikkan oleh pengguna internet di mesin pencari. Walau berbeda arti, frase kunci sering disebut sebagai kata kunci.
  3.  SERP adalah search engine result page yaitu halaman hasil pencarian mesin pencari.

Berikut ini gambar visual dari definisi-definisi tersebut:



Apakah itu pencarian Organik dan pencarian non-Organik ?

Konsultan IT Indonesia yang diketikkan oleh pengguna internet di mesin pencari sebagaimana ilustrasi di atas disebut dengan “kata kunci” atau “keyword (disingkat KW)“  Ingat istilah penting bersinonim berikut ini:
  1.  Hasil pencarian SEO = hasil pencarian alami = hasil pencarian tak-berbayar = hasil pencarian non-iklan = hasil pencarian organik
  2.  Hasil pencarian non-SEO = hasil pencarian tidak alami = hasil pencarian berbayar = hasil pencarian iklan = hasil pencarian non-organik
  3.  Jadi SEO selalu alami/organik, tak berbayar, non-iklan.
  4.  Dan non-SEO selalu berbayar ( sebagai contoh kita menggunakan jasa Google Ads untuk menempatkan kita pada ranking teratas di beberapa Keyword / niche dalam kurun waktu tertentu ), dan yang pasti cara ini memang lebih cepat dalam mencari user yang mengklik menuju situs anda tetapi untuk anda yang ingin mengetahui lebih tentang SEO saya sarankan untuk menggunakan metode SEO secara alami ( alias Free ).
        
Tujuan SEO itu apa ?
Banyaaakkk, karena fokus SEO yakni meningkatkan Trafik, trafik berarti situs anda sering di kunjungi = situs anda lebih di kenal = situs anda banyak yang tahu ( jika situs anda mempunyai konten yang bermanfaat maka tidak luput pula kemungkinan untuk di share oleh pengguna internet juga besar ).

berikut ini saya jabarkan beberapa tujuan dari SEO.
  1.  Meningkatkan Kualitas Trafik Kunjungan Calon Konsumen Produk atau Jasa AndaSebanyak mungkin pengunjung tersebut adalah pengunjung yang ditargetkan sesuai kata kunci yang akan Anda pilih, sehingga lalu-lintas / trafik pengunjung / kunjungan yang datang memang membutuhkan dan sedang mencari apa-apa yang Anda tawarkan di situs Anda. Hal ini menciptakan trafik kunjungan yang berkualitas ke situs Anda).

  2. Meningkatkan Volume Trafik Kunjungan Pengguna InternetSupaya sebanyak-banyaknya pengunjung mendatangi situs kita dengan menjadi yang paling banyak diklik (berada di area berwarna merah pada click heatmap yaitu di bagian separuh halaman di atas/upper fold, lebih baik lagi menjadi nomor 1 – 3 di SERP).
  3. Mempertahankan Kedua Jenis Trafik di Atas Secara BerkesinambunganSebagaimana Anda dipahami, dengan riset kata kunci yang benar dan proses SEO yang baik, peringkat pencarian yang bagus tercapai, maka ketiga tujuan utama SEO di atas akan mudah segera dicapai. Jika tujuan SEO Anda tercapai, dari tujuan dasar dan tujuan utama ini, maka dapat dipastikan akan banyak trafik tertarget menuju situs web atau halaman web yang Anda optimisasi untuk mesin pencari. Semakin banyak trafik tertarget, maka potensi tercapainya objektif atau tujuan akhir dari situs Anda akan semakin tinggi.
Nah setelah saya jabarkan beberapa definisi diatas, masa saya gak menyimpulkan apa aja gitu keuntungan SEO bagi pencari trafik dan kostumer yang ada di Internet ? dibawah ini sebagian besar saya jabarkan keuntungan dari SEO.

  1. Biaya yang minimal. Namun masih perlu effort dan waktu yang adil. Oleh karena itu saya mengatakan bahwa SEO tidak gratis!
  2. Cepat terkenal. Semakin sering situs web Anda di bagian atas mesin pencari, semakin banyak orang yang tahu web Anda.
  3. Banyaknya traffic pengunjung. Jika situs web Anda berhasil berada di urutan pertama, atau setidaknya halaman pertama dari halaman mesin pencari, website Anda mempunyai kesempatan besar untuk mendapatkan banyak lalu lintas pengunjung.
  4. Tidak harus Anda sendiri. Untuk melakukan SEO, Anda sendiri tidak perlu melakukannya. Anda dapat mencari orang atau menggunakan jasa SEO untuk mengerjakannya pada web Anda.
  5. Berpeluang membuka jasa SEO. Jika Anda berhasil menerapkan SEO di situs web, Anda dapat membuka jasa pengerjaan SEO.

Reference :

https://medium.com/@georgekao/simple-guide-to-authentic-seo-1b9abb06eacf

https://www.searchenginejournal.com/a-day-in-the-life-of-an-seo/48159/ 

http://adiproject.com/jasa-seo/pengertian-fungsi-dan-tujuan-seo/