Showing posts with label cloud. Show all posts
Showing posts with label cloud. Show all posts

Saturday, December 16, 2017

Google Cloud Vision API


Google Cloud Vision API merupakan sebuah service dari Google Cloud Platform (GCP) yang bisa memberikan analisis terhadap suatu gambar. API ini dirilis pada 18 Mei 2017 dengan teknologi Machine Learning dan Big Data yang menjadi engine dibelakangnya.  API ini tersedia gratis untuk 1000 hit/bulan, jika melebihi itu akan terkena biaya yang sudah di tentukan oleh google (link).

Fiture yang diberikan oleh API ini adalah sebagai berikut:
Label Detection
Mendeteksi konten apa saja yang terkandung dalam suatu gambar, misal nya seperti terdapat mobil, motor, hewan, dll.

Face Detection
Mendeteksi muka yang terdapat dalam gambar. Diberikan juga analisis mengenai expresi dan mood wajah tersebut.

Explicit Content Detection
Mendeteksi apakah terdapat konten dewasa didalam suatu gambar

Logo Detection
Mendeteksi logo yang terdapat pada gambar, dan mengenalinya secara langsung sepertu logo Toyota, Honda, BMW, HP, dll.

Landmark Detection
Mendeteksi sebuah bangunan landmark yang terdapat di dalam sebuah foto, seperti Monas, Eiffel, dll.

Optical Character Recognition (OCR)
Mendeteksi text yang ada dalam sebuah gambar. Jadi bisa kita gunakan untuk membaca data dari foto scan KTP, SIM, dll.

Image Attributes
Memberikan info mengenai warna dominan dari suatu gambar, crop hint, dll.

Web Detection
Memberikan info mengenai website yang memiliki atau menggunakan gambar yang sama dengan gambar ini.

Cara Kerja

Aplikasi kita akan mengupload atau mengirimkan gambar ke API ini, dan akan mendapatkan response yang dalam bentuk JSON nya seperti berikut:


How To

1. Yang diperlukan sebelum bisa menggunakan API ini adalah memiliki account GCP.

2. Selanjutnya adalah membuat sebuah project di GCP, dan me-enable API ini untuk project tersebut.








3. Aplikasi kita perlu GOOGLE_APPLICATION_CREDENTIALS Key untuk bisa menggunakan API ini. Jadi kita perlu menggenerate nya terlebih dahulu.



Pilih type JSON, dan saat kita klik Create maka browser akan mendownload sebuah file.


4. Setelah mendapatkan key, kita set environment variable.
Untuk MacOS dengan menggunakan:
 export GOOGLE_APPLICATION_CREDENTIALS=/PATH/TO/KEY/FILE

Untuk Windows bisa dengan mensetup Environment Variable, dengan Variable "GOOGLE_APPLICATION_CREDENTIALS" dan Value "C:\\PATH\TO\KEY\FILE"


Demo

Pada demo kali ini kita akan menggunakan java, kita bisa menggunakan Maven atau Gradle untuk menghandle dependensi library nya.
Maven:
 <dependency>
 <groupId>com.google.cloud</groupId>
 <artifactId>google-cloud-vision</artifactId>
 <version>1.14.0</version>
</dependency>
Gradle:
 compile 'com.google.cloud:google-cloud-vision:1.14.0'
SBT:
 libraryDependencies += "com.google.cloud" % "google-cloud-vision" % "1.14.0"


Berikut adalah sample source code dari sebuah method yang menggunakan Cloud Vision API yang sudah saya modifikasi untuk menggunakan fiture Label, OCR, dan Face.
Untuk contoh asli nya bisa di dapat dari dokumentasi google (https://cloud.google.com/vision/docs/reference/libraries)
 
public JSONObject test(DataVO dataVO) throws Exception {

    JSONObject jsonObject = new JSONObject();

    // Inisiasi
    try (ImageAnnotatorClient vision = ImageAnnotatorClient.create()) {

        // Memproses image file ke memory
        Path path = Paths.get(dataVO.getFilePath());
        byte[] data = Files.readAllBytes(path);
        ByteString imgBytes = ByteString.copyFrom(data);

        // List feature yang diinginkan
        Feature feat = Feature.newBuilder()
                .setType(Type.LABEL_DETECTION)
                .build();
        Feature feat2 = Feature.newBuilder()
                .setType(Type.FACE_DETECTION)
                .build();
        Feature feat3 = Feature.newBuilder()
                .setType(Type.TEXT_DETECTION)
                .build();
        List<Feature> featureList = new ArrayList<>();
        featureList.add(feat);
        featureList.add(feat2);
        featureList.add(feat3);

        // membuat request yang terdiri dari image dan list feature yang diinginkan
        Image img = Image.newBuilder().setContent(imgBytes).build();
        AnnotateImageRequest request = AnnotateImageRequest.newBuilder()
                .addAllFeatures(featureList)
                .setImage(img)
                .build();


        // Builds the image annotation request
        List<AnnotateImageRequest> requests = new ArrayList<>();
        requests.add(request);


        // Memproses image file
        BatchAnnotateImagesResponse response = vision.batchAnnotateImages(requests);
        List<AnnotateImageResponse> responses = response.getResponsesList();


        // Mengolah respon dari Vision API
        for (AnnotateImageResponse res : responses) {

            List<String> labelList = new ArrayList<>();
            for (EntityAnnotation annotation : res.getLabelAnnotationsList()) {
                Map<Descriptors.FieldDescriptor, Object> labelMap = annotation.getAllFields();
                Iterator it = labelMap.entrySet().iterator();
                while (it.hasNext()) {
                    Map.Entry pair = (Map.Entry)it.next();
                    if (pair.getKey().toString().equals("google.cloud.vision.v1.EntityAnnotation.description")){
                        labelList.add(pair.getValue().toString());
                    }
                }
            }

            jsonObject.put("Label", labelList);

            TextAnnotation text = res.getFullTextAnnotation();
            jsonObject.put("FullTextAnnotation", text.getText());

            jsonObject.put("FaceAnnotationsCount", res.getFaceAnnotationsCount());
        }
    }

    return jsonObject;
}

image yang akan di gunakan untuk test kali ini adalah gambar berikut:

dan hasil yang kita dapatkan adalah:
 
{
    "FaceAnnotationsCount": 0,
    "Label": [
        "text",
        "cartoon",
        "font",
        "line",
        "human behavior",
        "product",
        "product design",
        "area",
        "communication",
        "conversation"
    ],
    "FullTextAnnotation": "WE ARE\nLOOKING FOR\nBack-End DeviOS Dev\nOracle SOA & Webcenter Dev\nSend your CV to\njobs@nostratech.com\n"
}

Bisa dilihat bahwa text yang terdapat di gambar terdetect dengan baik meskipun ada character \n sebagai penjelasan bahwa di aberganti baris.

Sekian demo Google Cloud Vision API dari saya, silahkan berkreasi dengan fitur-fitur yang di sediakan oleh API ini.



Sunday, June 18, 2017

Update Konfigurasi Aplikasi ketika Runtimte dengan Spring Cloud

Halo kali ini Nostra akan sharing hal menarik lagi nih!

Kalian udah familiar kan dengan Spring? Seperti yang kita tau Spring punya banyak banget project, dan kesempatan kali ini Nostra mau sharing tentang Spring Cloud. Sebelum kita mulai membahas Spring Cloud, Nostra mau sharing dulu nih latar belakang dari topik ini.

Jadi begini, saat ini tren teknologi khususnya aplikasi adalah menggunakan arsitektur Microservices. Nah Spring Cloud adalah kumpulan projects dari Spring untuk memfasilitasi arsitektur tersebut. Secara spesifik sharing ini akan membahas tentang Spring Cloud Config.

Apasih benefits dari Spring Cloud Config?
Oke jadi kan Microservices adalah arsitektur dimana kita punya banyak services dengan fungsi masing-masing dan konfigurasi yang berbeda-beda. Spring Cloud Config memberikan kemudahan untuk maintain seluruh konfigurasi dari services tersebut dengan mengumpulkan seluruh konfigurasi pada "config server" atau sederhananya pada satu service tersendiri. Keuntungan lainnya adalah kita bisa mengubah konfigurasi tersebut pada config server dan kemudian services terkait cukup memanggil satu API dari Spring Actuator, yaitu dengan menggunakan method POST ke alamat http://{service-url}:{services-port}/refresh. API Call ke alamat tersebut akan memberikan balikan, apa saja yang berubah dari konfigurasi milik service tersebut.
Contoh Kembalian '/refresh'
Wow, jadi gimana cara implementasi Spring Cloud Config ini?
Spring Cloud Config memiliki tiga komponen utama, yaitu config server, client, dan file config yang disimpan dengan Git. Mekanisme yang digunakan Spring Cloud Config untuk mengetahui perubahan pada client config adalah dengan membaca commit pada Git untuk config file terkait. Melalui Git setiap commit akan mengubah versi dari file tersebut, dimana pada contoh '/refresh' tersebut kita bisa melihat bahwa terjadi perubahan pada 'config.client.version' dimana sebenarnya config file itu hanya memiliki config 'message' dan telah diubah.
Config File
Config Server
Service yang akan menjadi config server harus menggunakan anotasi '@EnableConfigServer' pada aplikasi, dimana untuk dapat menggunakan anotasi tersebut kita memasukkan dependensi terhadap Spring Cloud Config Server. Setelah kita menggunakan anotasi tersebut, selanjutnya kita perlu menyatakan pada config dari config server ini, yaitu mengenai port berapa yang akan digunakan dan dimana config dari services akan disimpan.
Contoh Penggunaan Anotasi '@EnableConfigServer'
Dependensi Terhadap Spring Cloud Config Server
Contoh Config Server Properties
Client
Lalu bagaimana cara konfigurasi client untuk mengambil konfigurasi pada config server? Hal ini dilakukan melalui properties yang ada pada client. Apabila kita telah berhasil menghubungkan client dengan config server maka kita dapat mengakses seluruh konfigurasi untuk client dengan menyimpannya pada config server. Bagaimana cara client bisa reload perubahan yang terjadi pada konfigurasi di config server? Well untuk melakukannya kita cukup menggunakan anotasi '@RefreshScope' pada bean yang mengakses konfigurasi pada config server.
Contoh Properties pada Client
Contoh Penggunaan Anotasi '@RefreshScope'
Oke, kalau kalian melihat kembali contoh-contoh di atas maka kalian akan menemukan ada sedikit trick disini, yaitu pada client terdapat property 'spring.application.name' dan itu isinya sama seperti nama file konfigurasi yang dimonitor pada configu server. Jadi Spring Cloud Config ini dapat menentukan config file mana yang diperuntukkan kepada suatu service, yaitu dengan membandingkan isi dari 'spring.application.name' dengan nama config file di Git yang dimonitor oleh config server.

et voila, cukup sederhana cara implementasinya akan tetapi perlu diperhatikan bahwa ketiga komponen tersebut harus terhubung agar dapat berjalan sebagaimana diinginkan.

That's all folks. Selamat mencoba dan berkarya!

Regards.


Sumber:





Sunday, December 15, 2013

Migrating a WebLogic Domain from VirtualBox to Cloud


Beberapa minggu yang lalu kami butuh untuk menampilkan showcase WebCenter Portal ke salah satu klien kami. Pada waktu itu development server Nostratech (Bima) saat itu sedang proses maintenance, sehingga tidak dapat digunakan. Setelah mempertimbangkan faktor effort, waktu, biaya, dan bandwidth, akhirnya kami memutuskan untuk memanfaatkan cloud service seperti DigitalOcean untuk showcase tersebut. Prosedurnya yang dilakukan adalah dengan mempersiapkan deployment-nya di lingkungan VirtualBox, dan meng-upload deployment tersebut ke DigitalOcean. 

Sayangnya DigitalOcean tidak mendukung untuk konversi dari VirtualBox, sehingga WebLogic Domain yang di-deploy di VirtualBox harus se-portable mungkin agar dapat dipindah-pindahkan dengan mudah ke lingkungan yang lain tanpa harus melakukan banyak perubahan. Deployment yang saya lakukan di VirtualBox tidak akan didetilkan pada artikel ini karena sudah mengikuti dokumentasi Oracle dikombinasikan dengan konfigurasi Node Manager pada artikel saya sebelumnya.

Namun ada beberapa catatan yang penting agar proses migrasi dapat berjalan dengan mulus:
  1. OS yang digunakan adalah CentOS 5.8 (64-bit), karena OS tersebut adalah image OS yang disediakan oleh DigitalOcean dan OS yang paling dekat relasinya dengan Oracle Enterprise Linux 5.8 yang sudah disertifikasi oleh Oracle.
  2. Install paket RPM oracle-validated melalui Oracle Public Yum Server untuk mempermudah proses instalasi produk-produk Oracle.
  3. Instalasi Oracle Database server dan Oracle WebCenter Portal domain dilakukan pada instance VirtualBox yang berbeda.
  4. Install Oracle Database jangan menggunakan filesystem Oracle ASM, karena akan mempersulit proses migrasinya nanti.
  5. Selalu menggunakan FQDN dalam mereferensi hostname, seperti database host, WebLogic listen address, dan lain-lainnya. Berhubung nantinya akan di-deploy ke DigitalOcean, saya sudah menggunakan penamaan hostname menggunakan domain nostratech.com agar tidak perlu mengubah lagi. Praktik ini juga sangat saya sarankan di manapun, agar deployment yang kita lakukan dapat lebih portable.
  6. Pisahkan lokasi ORACLE_BASE antara Oracle Database (/u03/app/oracle) dengan Oracle WebCenter Portal (/u01/app/oracle).
  7. Sesuaikan rule firewall dengan level keamanan yang Anda inginkan, pada artikel ini tidak akan membahas mengenai rule firewall yang diperlukan.
  8. Pastikan bandwidth uplink yang memadai untuk proses upload DigitalOcean. :)

Proses Backup di VirtualBox


Setelah proses instalasi dan konfigurasi selesai, shutdown seluruh WebLogic Domain beserta proses Database instance-nya. Lakukan langkah-langkah berikut di instance Database:
  1. Catat semua hostname yang diperlukan.
  2. Backup ORACLE_BASE menggunakan user root.
    oracle@db-vbox:~ $ su -
    root@db-vbox:~ # cd /u03/app
    root@db-vbox:/u03/app # tar cvvzpf /home/oracle/MIGRATE/ORACLE_BASE.tar.gz oracle
    root@db-vbox:/u03/app # exit
  3. Backup ORACLE_INVENTORY.
    oracle@db-vbox:~ $ tar cvvzpf ~/MIGRATE/ORAINVENTORY.tar.gz oraIventory
  4. Backup ORADIAG.
    oracle@db-vbox:~ $ tar cvvzpf ~/MIGRATE/ORADIAG.tar.gz oradiag_oracle
  5. Backup oraInst.loc dan oratab.
    oracle@db-vbox:~ $ cp /etc/ora* ~/MIGRATE/

Sementara di instance WebLogic Domain, ikuti langkah-langkah berikut:
  1. Catat semua hostname yang diperlukan.
  2. Backup ORACLE_BASE.
    oracle@portal-vbox:~ $ cd /u01/app
    oracle@portal-vbox:/u01/app $ tar cvvzpf ~/MIGRATE/ORACLE_BASE.tar.gz oracle
    oracle@portal-vbox:/u01/app $ cd /u02/app
    oracle@portal-vbox:/u02/app $ tar cvvzpf ~/MIGRATE/ORACLE_BASE_PRIVATE.tar.gz oracle
  3. Backup ORAINVENTORY.
    oracle@portal-vbox:~ $ tar cvvzpf ~/MIGRATE/ORAINVENTORY.tar.gz oraInventory
  4. Backup ORADIAG.
    oracle@portal-vbox:~ $ tar cvvzpf ~/MIGRATE/ORADIAG.tar.gz oradiag_oracle
  5. Backup BEA_HOMES.
    oracle@portal-vbox:~ $ tar cvvzpf ~/MIGRATE/BEA_HOMES.tar.gz bea
  6. Backup oraInst.loc.
    oracle@portal-vbox:~ $ cp /etc/ora* ~/MIGRATE/

Upload backup tersebut ke masing-masing droplet di DigitalOcean. Kesabaran sangat dibutuhkan pada tahap ini, kemarin saya upload sekitar 4 jam baru selesai. :)

Proses Restore ke DigitalOcean


Selagi menunggu proses upload ke droplet, jangan lupa untuk menginstalasi paket RPM oracle-validated pada kedua droplet tersebut. Setelah proses upload selesai, lakukan langkah-langkah berikut untuk me-restore Database:
  1. Sesuaikan hostname dengan IP yang terkonfigurasi pada droplet.
  2. Restore ORACLE_BASE menggunakan user root.
    oracle@db-droplet:~ $ su -
    root@db-droplet:~ # mkdir -p /u03/app
    root@db-droplet:~ # chown -R oracle:oinstall /u03/app
    root@db-droplet:~ # cd /u03/app
    root@db-droplet:/u03/app # tar xvvzpf /home/oracle/MIGRATE/ORACLE_BASE.tar.gz
    root@db-droplet:/u03/app # exit
  3. Restore ORAINVENTORY.
    oracle@db-droplet:~ $ tar xvvzpf ~/MIGRATE/ORAINVENTORY.tar.gz
  4. Restore ORADIAG.
    oracle@db-droplet:~ $ tar xvvzpf ~/MIGRATE/ORADIAG.tar.gz
  5. Restore oraInst.loc dan oratab.
    oracle@db-droplet:~ $ su
    root@db-droplet:/home/oracle # cp ~/MIGRATE/ora* /etc/
    root@db-droplet:/home/oracle # exit
  6. Reinstall Oracle scripts.
    oracle@db-droplet:~ $ su -
    root@db-droplet:~ # /u03/app/oracle/product/11.2.0/dbhome_1/root.sh
    root@db-droplet:~ # exit
  7. Validasi instalasi dengan startup Database.
    oracle@db-droplet:~ $ . oraenv
    oracle@db-droplet:~ $ lsnrctl start
    oracle@db-droplet:~ $ sqlplus / as sysdba
    SQL> startup
    
Setelah Database sudah valid pada droplet, WebLogic Domain dapat di-restore dengan mengikuti langkah-langkah berikut:
  1. Sesuaikan hostname dengan IP yang terkonfigurasi pada droplet.
  2. Restore ORACLE_BASE.
    oracle@portal-droplet:~ $ su -
    root@portal-droplet:~ # mkdir -p /u01/app
    root@portal-droplet:~ # chown -R oracle:oinstall /u01/app
    root@portal-droplet:~ # mkdir -p /u02/app
    root@portal-droplet:~ # chown -R oracle:oinstall /u02/app
    root@portal-droplet:~ # exit
    oracle@portal-droplet:~ $ cd /u01/app
    oracle@portal-droplet:/u01/app $ tar xvvzpf ~/MIGRATE/ORACLE_BASE.tar.gz
    oracle@portal-droplet:~ $ cd /u02/app
    oracle@portal-droplet:/u02/app $ tar xvvzpf ~/MIGRATE/ORACLE_BASE_PRIVATE.tar.gz
  3. Restore ORAINVENTORY.
    oracle@portal-droplet:~ $ tar xvvzpf ~/MIGRATE/ORAINVENTORY.tar.gz
  4. Restore ORADIAG.
    oracle@portal-droplet:~ $ tar xvvzpf ~/MIGRATE/ORADIAG.tar.gz
  5. Restore BEA_HOMES.
    oracle@portal-droplet:~ $ tar xvvzpf ~/MIGRATE/BEA_HOMES.tar.gz
  6. Restore oraInst.loc menggunakan user root.
    oracle@portal-droplet:~ $ su -
    root@portal-droplet:~ # cp /home/oracle/MIGRATE/ora* /etc/
    root@portal-droplet:~ # exit
  7. Validasi deployment dengan startup WebLogic Domain.
    oracle@portal-droplet:~ $ cd /u02/app/oracle/admin/nodemanager
    oracle@portal-droplet:/u02/app/oracle/admin/nodemanager $ export JAVA_OPTIONS="-DDomainRegistrationEnabled=true"
    oracle@portal-droplet:/u02/app/oracle/admin/nodemanager $ java weblogic.WLST NodeManager.py
    oracle@portal-droplet:/u02/app/oracle/admin/nodemanager $ java weblogic.WLST AdminServer.py

Demikian langkah-langkah sederhana yang saya lakukan untuk berhasil memindahkan deployment WebLogic Domain beserta Database-nya dari lingkungan VirtualBox ke cloud service. Selamat mencoba!