Istikharah

Ya Allah, aku memohon petunjuk kebaikan kepada-Mu dengan ilmu-Mu. Aku memohon kekuatan dengan kekuatan-Mu. Ya Allah, seandainya Engkau tahu bahwa masalah ini baik untukku dalam agamaku, kehidupanku dan jalan hidupku, jadikanlah untukku dan mudahkanlah bagiku dan berkahilah aku di dalam masalah ini. Namun jika Engkau tahu bahwa masalah ini buruk untukku, agamaku dan jalan hidupku, jauhkan aku darinya dan jauhkan masalah itu dariku. Tetapkanlah bagiku kebaikan dimana pun kebaikan itu berada dan ridhailah aku dengan kebaikan itu. (HR Al Bukhari)

Comments Off on Istikharah Posted in Uncategorized

Install Tomcat in Centos Port 80 & 443

Step 1: Update your CentOS system

First things first, you need to update the system to the latest stable status:

sudo yum install epel-release
sudo yum update -y && sudo reboot

Use the same sudo user to log into the system after the reboot finishes.

Step 2: Install Java

You need to install Java SE 7.0 or later before Apache Tomcat can run properly. Here, I will install OpenJDK Runtime Environment 1.8.0 using YUM:

sudo yum install java-1.8.0-openjdk.x86_64

Now, you can confirm your installation with:

java -version

The output will resemble the following:

openjdk version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-b14)
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)

Step 3: Create a dedicated user for Apache Tomcat

For security purposes, you need to create a dedicated non-root user “tomcat” who belongs to the “tomcat” group:

sudo groupadd tomcat
sudo mkdir /opt/tomcat
sudo useradd -s /bin/nologin -g tomcat -d /opt/tomcat tomcat

In this fashion, you created a user “tomcat” who belongs to the group “tomcat”. You cannot use this user account to log into the system. The home directory is /opt/tomcat, which is where the Apache Tomcat program will reside.

Step 4: Download and install the latest Apache Tomcat

You can always find the latest stable version of Apache Tomcat 8 from its official download page, which is 8.5.40 as of writing.

Under the “Binary Distributions” section and then the “Core” list, use the link pointing to the “tar.gz” archive to compose a wget command:

cd ~
wget http://www-us.apache.org/dist/tomcat/tomcat-8/v8.5.40/bin/apache-tomcat-8.5.40.tar.gz
sudo tar -zxvf apache-tomcat-8.5.40.tar.gz -C /opt/tomcat --strip-components=1

Step 5: Setup proper permissions

Before you can run Apache Tomcat, you need to setup proper permissions for several directories:

cd /opt/tomcat
sudo chgrp -R tomcat conf
sudo chmod g+rwx conf
sudo chmod g+r conf/*
sudo chown -R tomcat logs/ temp/ webapps/ work/

sudo chgrp -R tomcat bin
sudo chgrp -R tomcat lib
sudo chmod g+rwx bin
sudo chmod g+r bin/*

Step 6: Setup a Systemd unit file for Apache Tomcat

As a matter of convenience, you should setup a Systemd unit file for Apache Tomcat:

sudo vi /etc/systemd/system/tomcat.service

Populate the file with:

[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target

[Service]
Type=forking

Environment=JAVA_HOME=/usr/lib/jvm/jre
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/bin/kill -15 $MAINPID

User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target

Save and quit:

:wq

For tomcat listens on port 80 and 443 (<1024):

sudo rpm -Uvh https://s3.amazonaws.com/aaronsilber/public/authbind-2.1.1-0.1.x86_64.rpm
sudo touch /etc/authbind/byport/80
sudo chmod 500 /etc/authbind/byport/80
sudo chown tomcat /etc/authbind/byport/80
sudo touch /etc/authbind/byport/443
sudo chmod 500 /etc/authbind/byport/443
sudo chown tomcat /etc/authbind/byport/443

sudo vi /opt/tomcat/bin/startup.sh on the last line add:
exec authbind --deep 

Step 8: edit server.xml

Open /opt/tomcat/conf/server.xml, change all port 8080 to 80 and 8443 to 443, save it.

sudo vi /opt/tomcat/conf/server.xml

Save and quit:

:wq

Step 9: Start and test Apache Tomcat

Now, start the Apache Tomcat service and set it run on system boot:

sudo systemctl start tomcat.service
sudo systemctl enable tomcat.service

In order to test Apache Tomcat in a web browser, you need to modify the firewall rules:

sudo firewall-cmd --zone=public --permanent --add-port=80/tcp
sudo firewall-cmd --zone=public --permanent --add-port=443/tcp
sudo firewall-cmd --reload

Then, you can test your installation of Apache Tomcat by visiting the following URL from a web browser:

https://[your-Vultr-server-IP]

If nothing goes wrong, you will see the default Apache Tomcat front page.

Step 10: Configure the Apache Tomcat web management interface

In order to use the “Manager App” and the “Host manager” in the Apache Tomcat web interface, you need to create an admin user for your Apache Tomcat server:

sudo vi /opt/tomcat/conf/tomcat-users.xml

Within the </tomcat-users ...>...</tomcat-users> segment, insert a line to define a admin user:

<user username="yourusername" password="yourpassword" roles="manager-gui,admin-gui"/>

Remember to replace “yourusername” and “yourpassword” with your own ones, the less common the better.

Save and quit:

:wq

Restart Apache Tomcat to put your modifications into effect:

sudo systemctl restart tomcat.service

Tulus – Gajah

Setidaknya punya tujuh puluh tahun
Tak bisa melompat kumahir berenang
Bahagia melihat kawanan betina
Berkumpul bersama sampai ajal

Besar dan berani berperang sendiri
Yang aku hindari hanya semut kecil
Otak ini cerdas kurakit berangka
Wajahmu tak akan pernah aku lupa

Waktu kecil dulu mereka menertawakan
Mereka panggilku gajah,( ku marah ) ku marah
Kini baru ku tahu puji di dalam olokan
Mereka ingat ku marah
Jabat tanganku panggil aku gajaaaaahhhhhh………..

Kau temanku kau doakan aku
Punya otak cerdas aku harus tangguh
Bila jatuh gajah lain membantu
Tubuhmu disitu masih rela jadi tamengku

hahahahahahahaha 2x

Kecil kita tak tahu apa-apa
Wajar bila terlalu cepat marah
Kecil kita tak tahu apa-apa
Yang terburuk kelak bisa jadi yang terbaik
Yang terburuk kelak bisa jadi yang terbaik

Kau temanku kau doakan aku
Punya otak cerdas aku harus tangguh
Bila jatuh gajah lain membantu
Tubuhmu disitu masih rela jadi tamengku

Kau temanku kau doakan aku
Punya otak cerdas aku harus tangguh
Bila jatuh gajah lain membantu
Tubuhmu disitu masih rela jadi tamengku

ps: didedikasikan untuk teman, sahabat terbaik saya. itu gajjjaaahhh….! 😀

Getter setter pada C#

Enkapsulasi adalah pembungkusan variabel dan method dalam sebuah object yang terlindungi serta menyediakan interface untuk mengakses variabel tersebut.

Lalu untuk apa enkapsulasi ini dilakukan?

Kegunaan enkapsulasi baru akan terasa berguna setelah kita memahami hak akses. Secara garis besar Hak akses dibagi menjadi tiga :

  • Public : Variabel atau method dapat diakses oleh semua kelas
  • Private : Variabel atau method hanya dapat diakses oleh kelas itu sendiri
  • Protected : Variabel atau method hanya dapat diakses oleh semua kelas turunan (Inheritance)

Enkapsulasi akan dipakai ketika kita menggunakan hak akses “Private”, seperti dalam pengertiannya “Variabel atau method hanya dapat diakses oleh kelas itu sendiri” kalau hanya bisa dipakai oleh class itu sendiri, lalu bagaimana class yang lain dapat mengaksesnya? maka disinilah enkapsulasi terjadi. dengan bantuan method getter atau setter kita dapat mengakses variabel atau method yang diberi hak akses private. perhatikan syntax berikut :


class Persegi
{
private int RusukPersegi;

public int rusukPersegi
{
set { RusukPersegi = value; }
get { return RusukPersegi; }
}

Syntax diatas menunjukan bahwa atribut RusukPersegi pada kelas Persegi memiliki hak akses private sehingga jika atribut tersebut diperlukan pada kelas lain, diperlukan enkapsulasi. Enkapsulasi dari RusukPersegi diatas adalah rusukPersegi (Pada C# berlaku case sensitive) yang membungkus method setter dan getter dari RusukPersegi. rusukPersgi inilah yang nantinya akan dipanggil sebagai pengganti antribut RusukPersegi di kelas lainnya.

Jika dalam sebuah class terdapat 3 atribut yang bersifat private, maka akan ada 3 enkapsulasi, dan begitu seterusnya.

sumber: https://kidzulla.wordpress.com/2012/04/24/getter-setter-pada-csharp/

Uploading a File in ASP.Net Web API

http://www.c-sharpcorner.com/UploadFile/2b481f/uploading-a-file-in-Asp-Net-web-api/

Introduction

This article shows an example of uploading a file in the ASP.NET Web API. Uploading the file from the client is a basic operation. The file can be upload to the web server. By default, the process of file uploading is asynchronous. The developers of ASP.NET use the HTML file input field.

Now I illustrate the process of uploading a file to the web server.

Step 1

Create a MVC4 Web API application “FileUpload”.

  • Start Visual Studio 2010 and select “New Project” from the Start Page.
  • In the Template window, select “Installed template” -> “Visual C#” -> “Web”.
  • Choose “ASP. NET MVC 4 Web Application” then change its name.
  • Click on the “OK” button.

file

  • MVC 4 Project window:

webApi

Select “Web API” and click on the “OK” button.

Step 2

Change the name of “ValuesController” to “DocFileController.cs”.

In the Solution Explorer.
Select “Controller Folder” -> “ValuesController.cs”.
Rename the “ValuesController” to “DocFileController”.

Write this code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web;
using System.IO;
namespace FileUpload.Controllers
{
public class DocFileController : ApiController
{
public HttpResponseMessage Post()
{
HttpResponseMessage result = null;
var httpRequest = HttpContext.Current.Request;
if (httpRequest.Files.Count > 0)
{
var docfiles = new List();
foreach (string file in httpRequest.Files)
{
var postedFile = httpRequest.Files[file];
var filePath = HttpContext.Current.Server.MapPath("~/" + postedFile.FileName);
postedFile.SaveAs(filePath);
docfiles.Add(filePath);
}
result = Request.CreateResponse(HttpStatusCode.Created, docfiles);
}
else
{
result = Request.CreateResponse(HttpStatusCode.BadRequest);
}
return result;
}
}
}

The code above uses the “POST” method. This method looks for the request object. If there is any posted file then it will generate on the server and it returns the full path of the file. If there is no posted file then it returns the 401 status and bad request.

Step 3

Open the “index.cshtml” file then:

      • In the “Solution Explorer”.
      • Select “Views folder” -> “Home folder” -> “index.cshtml”.

file2

And write this code in this file:

<header>
<div class="content-wrapper">
<div class="float-left">
<p class="site-title">
<a href="~/">ASP.NET Web API File Upload</a></p>
</div>
</div>
</header>
<div id="body">
<form name="form1" method="post" action="api/docfile" enctype="multipart/form-data">
<div>
<label>
Browse File</label>
<input name="myFile" type="file" />
</div>
<div>
<input type="submit" value="Upload" />
</div>
</form>

Step 4
Now execute the application; press F5.
fole3

Click on the “Browse” button.
file4

Select one image and click on the “Open” button. It now shows the path of the file.
file5

Now click on the “Upload” button.
file6

Now it shows the path where the selected file is saved.

REST-like APIs

Masih membahas CRUD (Create Read Update Delete) dengan HTTP Request. Kali ini menggunakan template web api yang mulai ada pada Visual Studio 2010 dan setelahnya. Berdasarkan pengalaman saya (yang masih minim) ada beberapa file dan folder yang banyak kita “mainkan” dalam pembuatan ASP.NET web api ini:
a. Folder Controllers
b. Folder Models
c. File WebApiConfig.cs pada folder App_Start
d. File Web.config pada root folder.

Membuat Project Baru
a. klik File > New Project…
b. pilih ASP.NET MVC 4 Web Application, beri nama ProductStore, klik OK
create_new_project_mvc_4
c. kemudian pilih Web API dengan View engine: Razor, klik OK
* apabila tidak ada pilihan ASP.NET MVC 4 Application, download dan install ini terlebih dahulu:
http://download.microsoft.com/download/2/F/6/2F63CCD8-9288-4CC8-B58C-81D109F8F5A3/AspNetMVC4Setup.exe

Settings
Pada file WebApiConfig.cs terdapat format request dari client, defaultnya:

config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);

perhatikan parameter yang ada;
name –> untuk membedakan setiap route template
routeTemplate –>
api : ini hard-coded, sehingga URI-nya yaitu http://localhost/api
{controller} : ini sebuah variable yang ditentukan dari nama controller pada folder Conroller
{id} : ini sebuah variable yang ditentukan dari field pada class di folder Models.

Membuat Model
Create class baru pada folder Models;
a. klik kanan folder Models > Add > Class…
b. beri nama Product.cs
c. kemudian tentukan field/kolom apa saja yang akan di-CRUD, contoh:

namespace ProductStore.Models
{
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Category { get; set; }
public decimal Price { get; set; }
}
}

Membuat Koneksi Database dan Modelnya
File Web.config, ini digunakan untuk connectionStrings ke database.

<connectionStrings>
<add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=aspnet-PHIMobileData-20150217115811;Integrated Security=SSPI" />
<add name="ProductContext" connectionString="Data Source=DBServer; Initial Catalog=DBName;User ID=DBUsrName;Password=DBPwd"
providerName="System.Data.SqlClient" />
</connectionStrings>

Buat file class baru pada folder model dan beri nama ProductContext.cs;

using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
namespace ProductStore.Models
{
public class ProductContext : DbContext
{
public ProductContext() : base("name=ProductContext")
{
Database.SetInitializer<Models.ProductContext>(null);
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<Product>().ToTable("Products");
base.OnModelCreating(modelBuilder);
}
public DbSet<Product> Products { get; set; }
}
}

*Perhatikan bahwa;
a. base(“name=ProductContext“) –> berasal dari connectionStrings di file Web.config.
b. modelBuilder.Entity().ToTable(“Products“); –> terdapat table dengan nama Products pada database SQL Server
c. public DbSet Products { get; set; } –> fields-nya berasal dari file Product.cs di folder Models.

Membuat Controller
Controller inilah yang menentukan URI lengkap untuk HTTP request-nya;
routeTemplate: "api/{controller}/{id}"

{controller} –> nama class dari contorller
{id} –> id yang sudah di-definisikan pada file Product.cs pada folder Models.

Ada 4 jenis request yang dapat dijadikan metode operasi nya: GET, POST, PUT, DELETE.
setiap metode operasi tersebut akan menjadi prefix untuk setiap nama method.
a. klik kanan pada folder Controllers > Add > Controller…
b. beri nama ProductController
c. Template: Empty API controller
d. klik Add

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using ProductStore.Models;
namespace ProductStore.Controllers
{
public class ProductController : ApiController
{
private ProductContext db = new ProductContext();
// GET api/Product
public IEnumerable<Product> GetAllProducts()
{
return db.Products.AsEnumerable();
}
// GET api/Product/Id
public IEnumerable<Product> GetProductById(int Id)
{
return db.Products.Where(p => p.Id == Id);
}
// POST api/Product
public HttpResponseMessage PostProduct(Product dataUpload)
{
if (ModelState.IsValid)
{
db.Product.Add(dataUpload);
db.SaveChanges();

HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, dataUpload);
response.Headers.Location = new Uri(Url.Link(“DefaultApi”, new { id = dataUpload.Id }));
return response;
}
else
{
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
}
// PUT api/Product/Id
public HttpResponseMessage PutProduct(int id, Product dataUpdate)
{
if (ModelState.IsValid && id == dataUpdate.Id)
{
db.Entry(dataUpdate).State = EntityState.Modified;
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}

return Request.CreateResponse(HttpStatusCode.OK);
}
else
{
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
}
// DELETE api/PHIDeleteData/5
public HttpResponseMessage DeleteProduct(int id)
{
Product dataDelete = db.Products.Find(id);
if (dataDelete == null)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}
db.PHIData.Remove(dataDelete);
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}
return Request.CreateResponse(HttpStatusCode.OK, dataDelete);
}
}
}

*Perhatikan bahwa:
a. nama class-nya adalah ProductController sehingga {controller} pada URI menjadi Product (api/Product).
b. p.Id merupakan field yang sudah di-definisikan di file Product.cs pada folder Models.
c. kedua method diawali (suffix) dengan Get, artinya ini menggunakan metode Get dan dapat ditest langsung dari web browser seperti firefox atau chrome.

TESTING
GetAllProducts –> http://localhost/api/product
GetProductById –> http://localhost/api/product/1
PostProduct tidak bisa di test melalui web browser, karena menggunakan metode POST. Gunakan Chrome Apps yang bernama Postman;
postman_json
*Perhatikan bahwa:
[POST]
URL –> http://localhost/api/product
Method –> POST
Header –> Content-Type: application/json
Data, raw –>
{
“Name” : “Produk Baru Lagi”,
“Category” : “Casual”,
“Price” : 300
}

[PUT]
URL –> http://localhost/api/product/1
Method –> PUT
Header –> Content-Type: application/json
Data, raw –>
{
“Id” : 1,
“Name” : “Produk Sangat Baru”,
“Category” : “Casual”,
“Price” : 500
}

[DELETE]
URL –> http://localhost/api/product/1
Method –> DELETE

Membuat Web Service dengan WCF C#

Windows Communication Foundation (WCF). Kita bisa mendefinisikan web service dan mengkofigurasinya dalam beberapa cara dan dapat digunakan via HTTP, TCP, IPC, dan bahkan Message Queues. Bahkan WCF Services dapat dikonfigurasi untuk membuat REST services.

REST kepanjangan dari Representational State Transfer. Ini merupakan sebuah protocol untuk bertukar data lintas environment. Ide dibalik REST adalah kita harus memperlakukan services sebagai suatu resource dan kita dapat menggunakannya sebagai protocol HTTP sederhana untuk melakukan suatu operasi pada resource tersebut.
CRUD (Create, Read, Update, Delete) yang biasa dilakukan di DB, dapat juga dilakukan melalui protocol HTTP;
GET -> Read
POST -> Create
PUT -> Update
DELETE -> Delete

Berikut steps untuk membuat REST web service dengan WCF:
1. Buka Visual Studio 2008 atau diatasnya
2. File > New > Project…
3. Pada pane sebelah kiri expand Visual C# lalu pilih Web, kemudian pilih WCF Service Application pada pane sebelah kanan
4. Beri nama dan tentukan lokasi untuk menyimpan project ini, lalu klik OK
5. Secara default akan ada dua file Service.cs dan Service.svc, delete keduanya.
6. Klik kanan pada solusi Add > New Item…
7. Pada pane sebelah kiri klik Visual C#, lalu pilih WCF Service pada pane sebelah kanan
8. Beri nama IRestServiceImpl, lalu klik Add
9. Code pada IRestServiceImpl.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace RestService
{
// NOTE: If you change the interface name “IRestServiceImpl” here, you must also update the reference to “IRestServiceImpl” in Web.config.
[ServiceContract]
public interface IRestServiceImpl
{
[OperationContract]
[WebInvoke(Method = “GET”,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = “getData/?id={id}”)]
Buku GetData(int id);
}

[DataContract]
public class Buku
{
[DataMember]
public int id { get; set; }
[DataMember]
public string nama { get; set; }
}
}

10. Code pada IRestServiceImpl.svc.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace RestService
{
// NOTE: If you change the class name “RestServiceImpl” here, you must also update the reference to “RestServiceImpl” in Web.config.
public class RestServiceImpl : IRestServiceImpl
{
public Buku GetData(int id)
{
Buku Data = new Buku();
Data.id = 1;
Data.nama = “Buku Bagus”;
return Data;
}
}
}

11. Code pada Web.config

<system.serviceModel>
<services>
<service behaviorConfiguration="RestService.Service1Behavior" name="RestService.Service1">
<endpoint address="" binding="wsHttpBinding" contract="RestService.IService1">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
<service behaviorConfiguration="ServiceBehaviour" name="RestService.RestServiceImpl">
<endpoint address="" binding="webHttpBinding" contract="RestService.IRestServiceImpl" behaviorConfiguration="web">
<!--<identity>
<dns value="localhost"/>
</identity>-->
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="RestService.Service1Behavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
<behavior name="ServiceBehaviour">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>

Sekian, code diatas hanya sample saja ya.. hehe..

Perhitungan Tile Cache Basemap

Sebelum aktif menggunakan ArcGIS untuk membuat tile cache basemap, saya menggunakan produk open source, MapGuide.
MapGuide Server memiliki software desktop bernama MapGuide Maestro yang didalamnya ada fitur MgCooker, yang fungsi nya untuk men-generate (cook) tile-cache basemap sebelum di publish.
Masalahnya MgCooker masih memiliki kekurangan/bugs yaitu dia akan meembentuk tile-cache seluruh dunia walaupun data dan parameter input nya hanya Indonesia misalnya. Oleh karena itu saya membuat simulasi perhitungan pada spreadsheet excel, algoritma-nya sederhana yaitu meng-konversi ukuran asli di lapangan (skala 1) ke dalam pixel.
So, here’s the thing:

Panjang Indonesia: 500000000 cm
Lebar Indonesia: 180000000 cm

tile-cache yang akan dibentuk:
300 x 300 pixel atau 256 x 256 pixel
300 pixel => 7.9375 cm
256 pixel => 6.7733 cm
1 derajat => 11131950 cm
1 pixel => 0.0264583 cm

skala yang dibuat untuk 300 x 300 pixel:
1000, 2500, 5000
row => ROUNDUP((500000000/skala)/7.9375, 0)
col => ROUNDUP((180000000/skala)/7.9375, 0)
jumlah tiles => row*col

+-------+-------+-------+--------------+
| skala |  row  |  col  | jumlah tiles |
+-------+-------+-------+--------------+
| 1000  | 62993 | 22678 | 1428555254   |
+-------+-------+-------+--------------+
| 2500  | 25197 | 9071  | 228561987    |
+-------+-------+-------+--------------+
| 5000  | 12599 | 4536  | 57149064     |
+-------+-------+-------+--------------+

Dari hasil perhitungan diatas, kita mendapatkan row dan col untuk setiap skala.
row dan column ini kemudian di masukan ke code MgCooker (karena input ke UI tidak berfungsi) lewat Visual Studio (hard-coded), lalu build dan run.
Ulangi untuk setiap skala, and run the job pada command prompt. Done! 🙂

CRUD with ArcGIS API for JavaScript

CRUD (Create Read Update Delete) merupakan elemen dasar dan sangat penting dalam men-develop aplikasi web. Khususnya untuk web GIS, CRUD dilakukan dengan melakukan query ke map service.
Tipe map service hanya bisa untuk query Read saja, sedangkan untuk CRUD harus menggunakan tipe feature service (FS), karena FS mendukung fitur editing.
Pada FS ada satu method yang disebut applyEdits (https://developers.arcgis.com/javascript/jsapi/featurelayer-amd.html#applyedits).

ArcGIS API for JavaScript

diagram-arcgisSebelum berbicara jauh tentang ArcGIS API for JavaScript, saya ingin sedikit menjelaskan peran ArcGIS Desktop dan ArcGIS Server dalam men-develop web GIS.

ArcGIS Desktop, pada dasarnya disini kita akan banyak berurusan dengan data, data management, analysis sampai data siap untuk dipublish ke publik atau ke beberapa orang tertentu.
Data yang di-publish akan berupa map service yang di-hosting di ArcGIS Server dengan data tetap tersimpan di database.
Kemudian map service tersebut di consume oleh aplikasi client salah satunya adalah aplikasi web dengan JavaScript.
JavaScript (JS) merupakan client-side code programming yang running di web browser, sehingga tidak memungkinkan bagi JS untuk melakukan koneksi langsung ke database, disinilah peran map service yaitu sebagai penghubung antara database dengan JS. JS dapat melakukan query ke map service untuk mendapatkan data yang kemudian data ini digambarkan di browser, logikanya semakin banyak data yang digambarkan di browser sebagai objek, performance browser akan turun, karena itu ditemukanlah teknologi map service (WMS), feature service (WFS), tile-cache basemap yang pada intinya untuk mengurangi jumlah objek yang digambar satu per satu menjadi grafik di browser.

ArcGIS API for JavaScript menggunakan framework Dojo, yang menurut saya framework ini sangat clean dan simple.
Sample dan API reference ArcGIS API for JavaScript bisa dilihat lebih jauh disini https://developers.arcgis.com/javascript/jssamples/ dan https://developers.arcgis.com/javascript/jsapi/
Untuk sample DOM Dojo bisa dilihat lebih jauh disini http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/themes/themeTester.html

Esri Developer Summit

Pengalaman baru untuk saya ketika mengikuti international events dua tahun lalu, hehe.. Esri Developer Summit 2013 di Palm Springs, California, Amerika Serikat.

Berangkat dari Bandara Soekarno-Hatta siang dan sampai di LAX jam 11 malam di hari yang sama, padahal waktu perjalanan hampir 24 jam (magic, isn’t it? hehe..), transit di Taiwan beberapa jam.
Perjalanan sekitar 2 jam dari LAX ke Palm Springs dengan mobil. Menurut orang-orang, Palm Springs merupakan kota yang banyak dihuni oleh para artis Hollywood untuk beristirahat sehingga tidak heran ada patung Forever Marilyn Monroe di kota ini. Selain patung juga ada bintang dengan nama artis Hollywood di sepanjang trotoar, mirip dengan Walk of Fame di LA.
Palm Springs aslinya adalah sebuah desert, sehingga udaranya terasa panas-kering tapi dengan angin yang sejuk. Di Palm Spring tidak banyak ditemukan angkutan umum, ada bus tapi frekuensi-nya sangat jarang, taksi pun harus pesan lewat telepon, orang lebih banyak menggunakan mobil pribadi, tapi anehnya tidak macet sama sekali, mungkin karena jalannya yang lebar dan jumlah penduduk nya yang tidak begitu banyak.
Menariknya lagi di Palm Springs ada banyak windmill persis di pinggir jalan raya (free-way), luar biasa angin besar tidak sekedar lewat, tapi dimanfaatkan menjadi energi listrik.

OK, kembali ke temanya, Developer Summit, sesuai dengan namanya ini adalah acara untuk para system developers bertemu, khususnya GIS Developers.
Acaranya sendiri berlangsung selama 5 hari, sejujurnya saya lebih tertarik dengan orang-orang yang datang ke acara ini daripada dengan konten acaranya, ngobrol dengan supir taksi dari India, bertemu dengan banyak orang Meksiko (saya heran kenapa banyak sekali orang Meksiko di California), ketemu dengan para developers, meeting dengan orang-orang internal Esri, et setra..
Setelah acara selesai, saya merasa tidak mendapatkan ilmu teknis baru apapun, tapi memang begitulah acara ini dibuat untuk mempertemukan para developers tidak hanya untuk hal teknis tapi juga untuk peluang bisnis, update teknologi ke depan, etc.. Di hari terkahir acara ada esri hackathon dan party di pinggir kolam renang.

https://developers.arcgis.com/en/
http://www.esri.com/events/devsummit

Perjalanan saya di Amerika berlanjut jalan-jalan ke kota Los Angeles tepatnya di Hollywood dan ngantor beberapa hari di Esri HQ di kota Redlands, California. Klik di-sini untuk lihat petanya.