Thursday, August 20, 2015

Menggantikan Recursive Call dengan Stack

Salah satu hal yang paling sering di-identikkan dengan recursive dalam dunia pemrograman adalah bagaimana membaca struktur dari directory. Secara umum struktur dari directory adalah pertama kita melakukan iterasi terhadap root directory. Dalam  root directory terebut kita kemudian membagi jenis item di dalamnya, apakah masuk ke dalam file atau directory. Jika masuk ke dalam kategori file, maka langsung set sebagai item pada Treeview. Jika masuk kategori folder, panggil kembali method-nya untuk melakukan  iterasi yang sama.

Masalahnya adalah teknik ini akan mengakibatkan akumulasi pemanggilan terhadap method pada memory stack. Dan akibatnya terjadi StackOverflow. Untuk mengatasinya kita menggunakan teknik lain yakni dengan menggunakan struktur data Stack. Dengan Stack ini pertama-tama kita iterasi semua folder pada root directory, masukkan ke dalam Stack. Item yang terakhir dimasukkan kemudian dikeluarkan dari stack (di-pop) untuk diperiksa isinya. Jika terdapat folder di dalamnya, maka masukkan folder tersebut ke dalam stack. Jika file yang ditemukan, langsung isi elemen dari TreeView dengan file tersebut.

Misalnya elemen stack tersebut adalah folder dengan urutan A|B|C|D. Jika kita sudah mem-pop folder A. Maka kita akan menggantikan posisinya dalam stack dengan sub-folder dari A dengan mem-push sub folder tersebut ke dalam stack. Sehingga urutan stack berubah  menjadi A3|A2|A1|B|C|D. Kemudian kita mem-pop A1 dan diperoleh sub-folder di dalamnya. Kita mem-push sub folder tersebut ke dalam stack dan struktur stack berubah menjadi A33|A32|A31|A2|A1|B|C|D. Karena A3 hanya terisi file, maka tinggal kita pop untuk dimasukkan sebagai item di Treeview,  demikian juga A32. Jadi Struktur stack berubah menjadi A31|A2|A1|B|C|D. Kita masuk pada A31, dan ternyata isinya ada sub folder lain, dan lantas kita push pada stack dan stack berubah menjadi A312|A311|A2|A1|B|C|D. Hal ini dilakukan seterusnya sehingga isi dari stack menjadi kosong dan semua folder dan sub folder beserta item di dalamnya masuk ke dalam Treeview.

Wednesday, August 19, 2015

Aplikasi 17 Agustus (Aplikasi pemutar musik 3D di javaFX)

Kebetulan kemarin tanggal 17 Agustus yang merupakan hari ulang tahun kemerdekaan Indonesia maka saya mencoba membuat sebuah aplikasi yang ada kaitannya dengan 17 Agustus. Dan kebetulan saya akhir-akhir ini lagi tertarik bermain-main dengan library JavaFX maka saya akhirnya membuat aplikasi ini dengan JavaFX.

Sebenarnya saya bukan fanatikus JavaFX. Aplikasi yang saya buat ini adalah aplikasi pemutar musik. Dan untuk membuat aplikasi pemutar musik, maka kita harus membuat codec. Sayangnya untuk membuat codec tersebut, kita harus paham digital signal processing, paham bahasa c++, belajar dikit format-format codec yang sudah ada, antara lain mp3, flac, dll. Dan di luar sana, sudah banyak aplikasi pemutar musik yang tersedia yang menggunakan codec-codec yang sudah umum di pasaran. JavaFX kemudian hanya merangkai codec-codec tersebut ke dalam library pemutar media buatan mereka. Jadi yang saya lakukan bisa dibilang hanya sebatas memanggil library tersebut atau sekedar "building a car" bukan me-"reinventing the wheel".

Pada program kali ini, saya hanya menunjukkan beberapa teknik baku dalam implementasi element UI, misalnya bagaimana drag n drop file ke listview. Atau bagaimana memodifikasi item-item yang terdapat pada listview.

Perhatikan video berikut:



Source code:
https://github.com/gunungloli666/3dEqualizer

Sekedar referensi:
https://en.wikipedia.org/wiki/Audio_coding_format
https://en.wikipedia.org/wiki/Codec

Tuesday, August 18, 2015

Tutorial Data Binding di JavaFX

Dalam tutorial kali ini saya akan memberikan  contoh bagaimana menggunakan konsep data binding di JavaFX. Sebenarnya ini terinspirasi dari sebuah kursus yang saya ikuti kemarin mengenai penggunaaan WPF (Windows Presentation Foundation) yang konsepnya juga hampir mirip dengan JavaFX.

Defenisi data binding sendiri adalah bagaimana perubahan yang dialami oleh sebuah element UI (misalnya button) langsung direfleksikan pada elemen UI yang lain (misalnya panel atau window). Jadi ketika kita merubah lebar button, maka lebar panel secara serta merta ikutan berubah. Dalam konsep  UI jadul, misalnya yang dijumpai pada Jawa Swing, hal ini amat rumit untuk diaplikasikan. Bisa sih, namun kode yang kita buat agak kotor. Kita mungkin bisa mendeteksi event click mouse yang dilakukan pada sebuah button atau event mouse drag. Namun bagaimana kalau sudah hal-hal semisal perubahan property lebar atau tinggi button tersebut, tentu cukup sulit untuk mendeteksinya. Salah satu cara kotor untuk menempuhnya antara lain dengan membuat sebuah thread yang secara periodik mengecek perubahan pada ukuran button tersebut untuk kemudian merefleksikannya pada panel.

Pada WPF, teknik data binding biasanya dilakukan secara langsung pada XAML. Namun kemudian saya menyadari bahwa cara ini kurang tepat. Hal ini karena  antara property-property yang di-binding biasanya tidak proporsional nilainya. Misalnya jika kita mem-binding lebar button dengan lebar panel (atau window), tentu itu kurang tepat karena secara umum lebar button jauh lebih kecil dari lebar panel. Jadi kita harus melakukan operasi aritmatika di situ. Misalnya dengan mengeset lebar button setengah atau seperempat dari lebar window.

Masalahnya adalah kita tidak bisa menyertakan operasi aritmatika ke dalam file XAML (atau sebut saja XML). Jadi mau tidak mau kita harus letakkan pengesetan tersebut pada code behind-nya. Dan ini sudah diantisipasi oleh JavaFX.

Jadi dalam JavaFX tersebut sebuah UI element (misalnya window) properti propertynya sudah mengantisipasi adanya event yang terjadi. Dalam Java Swing, sebuah window (atau dalam terminologinya disebut sebagai JFrame) hanya memiliki width atau height saja. Dalam JavaFX, sebuah window (atau dalam terminologinya disebut sebagai Stage) width dan height nya itu sudah berubah menjadi widthProperty dan heightProperty yang bisa diberikan listener jika terjadi sebuah event. Perhatikan video berikut.



Dalam video di atas, jelas bahwa lebar button tidak mungkin di binding secara langsung dengan lebar window, akan tetapi harus dikalikan sebuah rasio tertentu.

Video berikut ini sebuah contoh bagaimana di JavaFX terdapat objek khusus yakni objek text yang tidak dijumpai pada WPF.

package fjr.test.binding;

import javafx.application.Application;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TestBindingButton extends Application{

 Stage prStage; 
 
 Button testButton; 
 
 @Override
 public void start( Stage primaryStage) throws Exception {
  
  AnchorPane pane = new AnchorPane();
  
  Scene sc  = new Scene(pane, 500, 400) ; 
  
  primaryStage.setScene(sc); 
  
  primaryStage.show();
  
  this.prStage = primaryStage; 
  
  getChildren(pane);
  
  primaryStage.widthProperty().addListener(new InvalidationListener() {
   
   @Override
   public void invalidated(Observable arg0) {
    testButton.setPrefWidth(prStage.getWidth()/3.0) ;
    testButton.setPrefHeight(prStage.getHeight()/10.0);
   }
  });
   
 }
 
 
 private void getChildren(Pane p){
  
  VBox box1 = new VBox(); 
  box1.setSpacing(5);
  box1.setTranslateX(10);
  box1.setTranslateY(10);
  
  
  final Button b1 = new Button("COBA"); 
  b1.setPrefWidth(prStage.getWidth()/3.0) ;
  b1.setPrefHeight(prStage.getHeight()/10.0);  
  box1.getChildren().add(b1); 
  
  
  final Button b2 = new Button("ACUAN"); 
  b2.setPrefWidth(prStage.getWidth()/3.0) ;
  b2.setPrefHeight(prStage.getHeight()/10.0);  
  box1.getChildren().add(b2); 
  
  this.testButton = b1; 
  
  p.getChildren().addAll(box1); 
 }
 
 public static void main(String[] args){
  launch(args);
 }
}
package fjr.test.binding;

//import java.awt.Button;
import java.util.Random;

import javafx.animation.Interpolator;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Orientation;
import javafx.geometry.VPos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.scene.text.Font;
import javafx.scene.text.FontPosture;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration;


public class TestBindingFont extends Application{
 
    private static final Random RANDOM = new Random();
    private static final Interpolator INTERPOLATOR = Interpolator.SPLINE(0.295,0.800,0.305,1.000);
    Pane p; 
    
    Font font = new Font (Font.getDefault().getFamily(), 60 ) ; 

 @Override
 public void start(Stage primaryStage) throws Exception {
  // TODO Auto-generated method stub
  
  final AnchorPane pane = new AnchorPane(); 
  Scene sc = new Scene(pane, 500,500 ); 
  
  primaryStage.setScene(sc);
  primaryStage.show(); 
  
  pane.setFocusTraversable(true); 
  pane.setOnMousePressed(new EventHandler() {
   @Override
   public void handle(MouseEvent me) {
    pane.requestFocus();
    me.consume();
   }
  });
  
  pane.setOnKeyPressed(new EventHandler() {
   @Override
   public void handle(KeyEvent ke) {
    createLetter(ke.getText()); 
    ke.consume();
   }
  });
  
  p = pane; 
  
  final Slider s = new Slider(); 
  s.setTranslateX(10); 
  s.setTranslateY(10); 
  s.setPrefWidth(150); 
  s.setOrientation(Orientation.HORIZONTAL);
  s.setMin(1); 
  s.setMax(10); 
  s.valueProperty().addListener(new InvalidationListener() {   
   @Override
   public void invalidated(Observable arg0) {
    double m = s.getValue(); 
    Font f2  = new Font(Font.getDefault().getFamily(), 60 * m); 
    font = f2; 
    for( Node  t : p.getChildren()){
     if(t instanceof Text){
      Text tt = (Text) t; 
      tt.setFont(f2);
     }
     
    }
   }
  });
  
  VBox box = new VBox(); 
  box.setSpacing(5); 
  
  pane.getChildren().add(box);
  box.getChildren().add(s); 
  
  Text t  = new Text("Ketikan sesuatu di Keyboard!!"); 
  t.setTranslateX(10);
  t.setTranslateY(20); 
  Font f = Font.font(Font.getDefault().getFamily(), FontWeight.BOLD , FontPosture.ITALIC , 20); 
  
  t.setFont(f); 
  
  box.getChildren().add(t);  
  
  t.setFill( new LinearGradient(0f,1f,1f,0f,true, CycleMethod.NO_CYCLE, 
      new Stop(0,Color.web("#f8bd55")),
                        new Stop(0.14f,Color.web("#c0fe56")),
                        new Stop(0.28f,Color.web("#5dfbc1")),
                        new Stop(0.43f,Color.web("#64c2f8")),
                        new Stop(0.57f,Color.web("#be4af7")),
                        new Stop(0.71f,Color.web("#ed5fc2")),
                        new Stop(0.85f,Color.web("#ef504c")),
                        new Stop(1,Color.web("#f2660f"))));

 }
 
  private void createLetter(String c) {

         final Text letter = new Text(c);
         letter.setFill(Color.BLACK);
         letter.setFont(font);
         letter.setTextOrigin(VPos.TOP);
         letter.setTranslateX((p.getWidth() - letter.getBoundsInLocal().getWidth()) / 2);
         letter.setTranslateY((p.getHeight() - letter.getBoundsInLocal().getHeight()) / 2);

         p.getChildren().add(letter);

         final Timeline timeline = new Timeline();
         timeline.getKeyFrames().add(
                 new KeyFrame(Duration.seconds(6), new EventHandler() {
                     @Override public void handle(ActionEvent event) {
                         p.getChildren().remove(letter);
                     }
                 },
                 new KeyValue(letter.translateXProperty(), getRandom(0.0f, p.getWidth() - 
                   letter.getBoundsInLocal().getWidth()),INTERPOLATOR),
                 new KeyValue(letter.translateYProperty(), getRandom(0.0f, p.getHeight() - 
                   letter.getBoundsInLocal().getHeight()),INTERPOLATOR),
                 new KeyValue(letter.opacityProperty(), 0f)
         ));
         timeline.play();
     }
 
  private static float getRandom(double min, double max) {
         return (float)(RANDOM.nextFloat() * (max - min) + min);
     }
  
 public static void main(String[] args){
  launch(args);
 }

}

Tuesday, August 4, 2015

Hubungan Antara Allah dengan Nomor Atom Besi

Apakah benar alam semesta ini ciptaan Tuhan adalah perdebatan yang tidak ada habisnya. Namun kita hanya bisa melakukan analisa tanpa bisa melakukan  verifikasi lebih jauh. Dalam diskusi mengenai ada atau tidaknya Tuhan ini, saya pernah menjumpai sebuah perdebatan antara muslim dan atheis. Si muslim kemudian mengajukan fakta bahwa ternyata nomor atom besi  jumlahnya sama dengan jumlah kata Allah di dalam Al-Quran. Ini kemudian dijadikan bukti bahwa tidak mungkin seorang badui di padang pasir arab mengadakan bualan semacam ini. Pasti ada the man behind the scene.

Bahasan mengenai mukjizat saintifik dalam Al-Quran pada banyak kasus tidak lebih dari sekedar kajian yang absurd. Hal yang mendasarinya adalah Al-Quran itu bukan kitab sains. Untuk membahas Al-Quran terlebih dahulu kita harus tahu sejarah dibalik penurunan Al-Quran. Kita tidak bisa secara apriori mengatakan bahwa semua “hal-hal aneh” yang terjadi selama penurunan Al-Quran adalah omong kosong (misalnya dengan menganggapnya sebagai bualan Ibnu Ishaq, Ibnu Haytam, Al-Tabari dll) lantaran adanya fakta-fakta sains yang kita temukan. Para ahli sejarah Islam sudah melakukan pengkajian secara komprehensif mengenai kejadian-kejadian yang melatarbelakangi penurunan Al-Quran (beberapa dari mereka adalah orang yang hafal seluruh isi Al-Quran). Hal yang paling maksimal yang bisa kita lakukan hanya sebatas mempelajari peninggalan mereka tersebut dan berprasangka baik terhadap mereka. 

Salah seorang muslim berkata bahwa Al-Quran memaparkan secara detail peristiwa Big Bang: bahwa bumi dan langit pada awalnya bersatu sebelum kemudian dipisahkan. Big Bang sendiri adalah salah satu model yang diajukan ilmuan untuk menjelaskan asal-usul alam semesta. Sementara model hanya bisa bekerja berdasarkan ada atau tidaknya data penunjang. Bisa jadi di kemudian hari diperoleh data-data lain (semisal bencana ultraviolet kedua) yang kemudian merontokkan atau mengkoreksi pemahaman fisis kita saat ini (termasuk model Big Bang tersebut). Sehingga alih-alih Big-Bang, dicari lah model baru dalam menjelaskan asal-usul alam semesta. Dan kemudian ayat Big-Bang itu direinterpretasi kembali dan menghasilkan makna lain dari yang kita imani saat ini.
Secara teologi kita sudah diajarkan, bahwa yang paling tahu tentang isi Al-Quran itu hanya Allah dan Nabi Muhammad. Dan berdasarkan Hadits yang diriwayatkan ke kita, tidak pernah sekalipun Al-Quran itu membahas persoalan Big Bang. Justru pada ayat yang lain, malah Al-Quran mengatakan bahwa antara langit dan bumi itu terdapat tiang-tiang penopang (mudah-mudahan ilmuan muslim masa depan bisa menjelaskan maksud ayat ini). Dan pada ayat yang lain dikatakan lagi bahwa  matahari berputar mengelilingi bumi yang kemudian diperkuat oleh penafsiran Nabi Muhammad mengenai alam semesta (bahwa matahari terbit di timur dan tenggelam di barat kemudian berjalan di bawah tanah untuk kembali lagi ke timur) yang dicatat oleh Shahih Bukhari dan diriwayatkan kepada kita. Nabi Muhammad sama sekali tidak pernah menyinggung soal Big Bang, namun anehnya  kita bisa berbicara sampai sejauh itu mengenai makna ayat-ayat tersebut.

Hal yang menjadi pertanyaan adalah kenapa angka 26 itu mesti dikaitkan dengan nomor atom besi? Nomor atom besi itu menandakan jumlah proton yang berada di dalam inti atom besi. Sementara proton (seperti halnya pada kasus Big Bang) merupakan satu dari sekian model yang diajukan para ilmuan untuk menjelaskan materi besi (dan kebetulan untuk saat ini itulah cara yang paling “benar”).  Pertanyaan selanjutnya adalah kenapa tidak atom besi sebagai sebuah kesatuan saja yang kita hubung-hubungkan dengan angka tersebut (bahwa materi besi tersusun oleh individu-individu atom besi)?

Kita tidak pernah melihat proton. Kita menyimpulkan bahwa besi disusun oleh proton lantaran ketika dilakukan sebuah eksperimen tertentu terhadap materi, terjadi sebuah fenomena tertentu yang teramati.  Fenomena ini kemudian ditafsirkan dengan membuat model yang mengatakan bahwa di dalam atom besi terdapat sebuah inti atom dan inti atom ini tersusun oleh partikel bermuatan positif bernama proton. Kita tidak pernah  melihat proton baik dengan mata fisis kita atau dengan mata batin kita. Karena ternyata mata kita juga disusun oleh proton (mana mungkin proton melihat proton…, bukannya itu sama saja dengan jeruk minum jeruk?).

Kemudian proton juga disusun oleh quark yakni dua top-quark dan satu down-quark, jadi total ada tiga. 3 x 26 = 78, lha… sudah ga sama dong dengan jumlah kata Allah di dalam surat tersebut. Kemudian besi sendiri memiliki beberapa isotop. Setahu saya ada 4 isotop besi di alam. Pertanyaanya adalah besi yang dimaksud di dalam Al-Quran ini isotop yang mana? Tolong pembaca yang paham bahasa arab bisa ga’ diterjemahkan bahwa “sebutan besi” di dalam Al-Quran itu merujuk pada isotop yang mana?

Besi itu unsur yang relatif reaktif yang sering dijumpai dalam bentuk Allotrof. Yang jadi pertanyaan besar untuk para sejarawan adalah apakah besi yang digunakan oleh masyarakat arab jaman Nabi Muhammad untuk membuat pedang, belanga dan berbagai macam keperluan  itu besi murni (dengan nama kimia Fe) atau jangan-jangan besi dengan sekian persen pengotor? Kalo dia mengandung pengotor (dan itu yang dicantumkan di dalam Al-Quran) tentu saja pekerjaan kita dalam menghubungkannya dengan angka 26 ini sangat absurd. Ketika terdapat pengotor, secara umum rumus kimianya sudah berbeda (jumlah proton penyusunnya sudah lebih dari 26).

Saya pernah melihat di internet beberapa pusaka peninggalan Nabi Muhammad, antara lain pedang beliau dan sampai saat ini masih bagus (belum berkarat). Jika demikian halnya maka itu sudah pasti bukan besi. Karena besi unsur yang reaktif. Bisa jadi besi yang dimaksud oleh Al-Quran ini adalah baja. Jika demikian tentu lain ceritanya. Karena baja  adalah gabungan antara besi yang ditambahkan karbon sekian persen untuk menambah kekuatannya. Dan  itu rumus kimianya berbeda dengan besi murni (demikian pula jumlah proton di dalamnya yang juga bukan 26). Itupun kita harus cari tahu apakah “sebutan besi” di dalam Al-Quran ini merujuk pada baja atau bukan.

Bahasa arab (juga bahasa Indonesia) sangat terbatas dalam mendeksripsikan materi yang ada di alam. Jika kita analogikan dengan air (H2O) yang tersusun oleh atom oksigen (O) dan atom hidrogen (H), apakah itu membuat kita mencocok-cocokan timbulnya kata air di dalam Al-Quran dengan jumlah nomor atom oksigen atau atau jumlah proton di dalam atom hidrogen? Bahkan sebutan kasar dalam bahasa Arab terhadap oksigen paling tinggi hanya sebatas udara (angin). Dan kita tahu udara merupakan campuran dari berbagai macam unsur selain oksigen: udara mengandung sekian persen oksigen, sekian persen hidrogen, dan sekian persen uap air.

Hal lain yang sering dikumandangkan oleh para pemikir muslim mengenai keajaiban Al-Quran adalah  jumlah kata laut (tentunya dalam bahasa arab) itu ada 32 dan kata tanah (juga dalam bahasa arab) itu ada 13. Jika dibandingkan kedua bilangan tersebut nilainya hampir sama dengan perbandingan daratan  dan lautan dewasa ini. Kata ‘tanah’ ini tentu perlu diperjelas apakah yang dimaksud adalah bumi (yang tersusun atas 7 lapis seperti yang disinggung oleh ayat yang lain) atau cuma daratan saja. Pembaca tentu lebih tahu struktur bahasa arab. Sebab jika kata tanah ini mengacu pada bumi maka rasionya sudah pasti tidak sama. Air itu hanya menyumbang sekian persen dari volume bumi. Jika yang dimaksud adalah daratan, itu pun perlu diperdebatkan lebih jauh.

Dalam geologi dikenal yang namanya gejala tektonik berupa pergeseran lempeng bumi. Akibat dari gejala ini maka  permukaan bumi mengalami perubahan sepanjang tahun. Akibatnya benua Australia dan Asia yang dulunya menyatu sekarang menjadi terpisah. Tentu rasio daratan dan lautan tidak tetap  sepanjang masa: daerah yang dulunya lautan berubah menjadi daratan demikian pula sebaliknya. Yang jadi pertanyaan adalah apakah rasio yang dimaksud oleh Al-Quran ini adalah rasionya ketika Al-Quran diturunkan, atau rasionya ketika ribuan tahun yang lalu saat sebagian besar permukaan bumi ditutupi oleh permukaan es pada zaman es. Pada zaman es tentu saja rasionya  tidak 30:70, akan tetapi ada sebagian besar daratan yang terbentuk lantaran adanya es. Dan bisa jadi ribuan tahun akan datang zaman es kembali terulang dan rasio daratan terhadap lautan menjadi lebih besar dari  30:70. Demikian pula dataran mengalami penaikan serta penurunan akibat gaya tektonik. Terbentuklah lembah, danau, gunung, palung, dll.

topografi antartika

Pada saat ini pun rasio 30:70 masih diperdebatkan. Pertama, sebagian besar daratan (‘tanah’ jika meminjam terminologi Al-Quran) benua Antartika itu berada di bawah permukaan laut. Ketebalan es di Antartika rata-rata mencapai 2 kilometer. Dengan mengingat bahwa es pada hakikatnya adalah air. Air tentu saja bukan daratan (pembaca bisa cari di google apa bahasa yang digunakan bangsa Arab pada zaman Nabi Muhammad untuk menyebut es). Jika terjadi pencairan besar-besaran es di Antartika (oleh satu dan lain faktor), maka rasio 30:70 ini bakal berkurang karena benua Antartika luasnya berkurang. Adapun benua-benua lainnya di permukaan bumi luasnya juga berkurang karena naiknya permukaan laut, sehingga rasio daratan terhadap lautan juga akan berkurang secara signifikan dari 30:70 tersebut. Akibatnya adalah “mukjizat” tersebut menjadi tidak valid lagi.

jumlah air di permukaan bumi

Ketika 5000 tahun dari sekarang di mana manusia sudah menciptakan peradaban baru. Mereka kemudian menemukan artifak-artifak kuno mengenai keajaiban Al-Quran. Bisa jadi luas daratan pada saat itu sudah jauh berkurang karena naiknya air laut. Mereka akan tahu bahwa mukjizat Al-quran itu hanya ‘cocoklogi’.


(Disadur dari berbagai sumber di internet)

Monday, August 3, 2015

Filsafat Observasi

Sebagai ilmuan tentunya kita punya preferensi dan orientasi dalam meninjau persoalan. Tapi saya percaya bahwa kebenaran itu tidaklah mutlak. Teori hanyalah hampiran terhadap realita yang sesungguhnya. Dahulu kala, sebelum manusia mendaratkan kakinya di bulan, deskripsi alam semesta digambarkan sebagai tinjauan geosentris, bahkan mungkin lebih jauh dari itu: bumi adalah dataran yang rata di mana-mana, dan matahari terbit di timur dan terbenam di barat, kemudian benda-benda langit lainnya berputar mengelilingi bumi. Dan memang benar bahwa jika kita melihat dengan mata fisis kita akan dijumpai hal seperti itu bahwa matahari terbit di timur dan tenggelam di barat. Manusia kemudian mengajukan kritik terhadap model ini. Mereka mempertanyakan lintasan planet-planet yang tidak beraturan. Waktu itu para ahli astronomi sudah mengetahui bahwa selain bintang-bintang terdapat benda langit lain yang bergantungan di atas yang pergerakannya berbeda dengan bintang-bintang secara umum. Mereka namakan ini sebagai “planet” yang secara literal diterjemahkan sebagai pengembara. Berbeda dengan bintang-bintang lainnya yang relatif tetap di tempat sepanjang tahun, ternyata planet-planet ini memiliki lintasan yang tidak regular. Dan ini yang menjadi masalah di kepala para ilmuan.

Soal asal-usul bagaimana manusia mulai mengajukan pertanyaan mengenai benda-benda langit, khususnya benda-benda yang memiliki peran langsung bagi kehidupan sehari-hari bisa dilihat pada bagaimana para petani saat ini mengatur jadwal menanam padi yang disesuaikan dengan pola musim hujan dan musim kemarau sepanjang tahun. Para petani mengamati pergantian musim tahun demi tahun dan mengamati terdapat sebuah aturan yang mendasari pergantian tersebut. Kemudian para petani mencoba mengambil keuntungan dengan adanya pola keteraturan tersebut yakni dengan mengatur waktu penanaman padi sesuai dengan waktu mulainya pergantian musim misalnya mulai menanam ketika mulai musim kemarau demi menghindari gagal panen ketika tiba musim hujan. 

Hal ini kemudian diperluas ke kasus-kasus yang lain. Bahwa selain pergantian musim hujan dan musim kemarau terdapat pula pergerakan planet-planet yang memiliki jadwal tertentu. Bahwa pergerakan ini dipercaya memiliki dampak bagi nasib umat manusia. Tahun demi tahun manusia mengajukan hasil penelitian, mengajukan berbagai macam hasil observasi (pengamatan) serta model-model yang menjelaskan data-data observasi tersebut. Untuk kasus pergerakan planet tadi memang sejak semula banyak para pemikir yang mencoba mencari tahu keteraturannya. Salah seorang pemikir terkenal yang bernama Apollonius kemudian merumuskan sebuah model yang dikenal sebagai  Epicycle dan Defferent demi menjelaskan pergerakan planet tersebut. Dalam model ini terdapat  sebuah lingkaran besar yang kosentris dengan bumi yang disebut dengan deferrent. Kemudian terdapat lingkaran kecil yang mengorbit melalui lingkaran besar ini yang disebut sebagai epicycle. Planet-planet kemudian dikatakan bergerak pada epicycle tersebut. Teori ini kemudian berhasil menjelaskan pergerakan 5 planet yang diketahui pada saat itu. Namun apa yang dilakukan oleh teori ini hanya sebatas penjelasan secara kinematis. Jika kita mencermati data-data pengamatan planet-planet di angkasa maka akan terdapat 3 variabel utama yang bisa diukur yakni posisi, kecepatan, dan percepatan. Kecepatan dan posisi merupakan variabel kinematis. Sementara percepatan sudah ada sangkut pautnya dengan gaya sehingga disebut variabel dinamika. Percepatan inilah yang sulit dijelaskan dengan konsep geocentris, khususnya dengan menggunakan model epicycle.

Model selanjutnya yang digagas oleh para saintis adalah model heliosentris. Model ini awalnya juga mendapat banyak tantangan. Salah satu hal yang dipertanyakan adalah jika memang model ini benar, maka seharusnya  dijumpai parallax bintang oleh pengamat yang berada di bumi seiring dengan perubahan posisi pengamatan pengamat di bumi. Namun karena tidak adanya parallax bintang yang teramati, maka dapat disimpulkan bahwa bumi stasioner atau tidak mengalami pergerakan. Pada akhirnya di abad ke-18 ilmuan dapat mengukur parallax bintang kendatipun sangat kecil yang konsekwensinya adalah jarak antara bumi dan bintang-bintang tersebut sangatlah jauh. Sehingga ini makin menguatkan konsep heliosentris. Aplikasi dari konsep heliosentris ini kemudian yang digunakan oleh para ilmuan dalam mendaratkan pesawat ruang angkasa di Mars dan di bulan yang sama sekali sulit dilakukan jika menggunakan tinjauan geosentris. 

Konsep heliosentris kemudian disempurnakan oleh Johannes Kepler  dengan mengganti lintasan planet yang semula diasumsikan berbentuk lingkaran menjadi berbentuk elips di mana matahari berada pada salah satu titik fokus dari elips tersebut. Salah satu Hukum Kepler menyatakan bahwa ketika planet bergerak maka luas area yang disapu oleh garis yang menghubungkan antara planet dengan matahari sama besarnya untuk kurun waktu yang sama. Oleh Newton kemudian dilakukan penjelasan bahwa ini disebabkan oleh gaya gravitasi yang diberikan oleh matahari terhadap planet-planet tersebut. Dan pergerakan planet ini merupakan konsekwensi logis dari gaya gravitasi.