Şimdi sizin kafanızda iki soru var: React Native nedir ve neden kullanılır?

React Native nedir? Bir Facebook ürünü. JavaScript ile native iOS uygulamaları geliştirebileceğiniz bir framework.

Aslında halihazırda çoğu developer PhoneGap sayesinde JavaScript ve HTML5 kullanarak iOS uygulamaları geliştirebiliyor. Peki React Native gerçekten bu kadar önemli mi?

Cevap: evetönemli ve insanların bu kadar heyecanlanmasının iki ana sebebi var:

  1. React Native ile uygulamanızın çalışma mantığı JavaScript ile yazılabiliyorken, arayüzü (UI) tamamen native kalabiliyor. Bu sebepten HTML5 UI kaynaklı herhangi bir sorun yaşamıyorsunuz.
  2. React Native kullanıcı arayüzü geliştirmede alışılmışın dışında, radikal ve yüksek fonksiyonlu bir yaklaşım sunuyor.

React Native’in çıkış noktası React programlama modelininin gücünü mobil uygulama geliştirmeye getirmek. React Native’in cross platform (her işletim sisteminde çalışabilme) olma gibi bir hedefi yok. Aşağıda React Native’i iOS ortamında nasıl kullanabileceğinize dair küçük bir örnek var. Konsepti yakalarsanız Android ve diğer platformlarda da rahatlıkla uygulayabilirsiniz.

Aşağıdaki örnekte React Native ile Sahibinden.com benzeri bir uygulama geliştireceğiz. Fakat daha basit ve yalın olacak tabii ki. Bir adet arama kutucuğu olacak ve buraya yazdığımız isme ya da lokasyona göre sonuçları listeleyeceğiz ve sonra bu sonuçlardan birine tıklandığında da detayı göstereceğiz. Ve bütün bunları React Native ile yapacağız!

react-native-ornek

Eğer daha önce JavaScript ile program yazmadıysanız korkmanıza gerek yok, bu örnekte adım adım yapmanız gerekenler anlatılacak. React stil için CSS kullanır ve genelde okuması ve anlaması kolaydır.

Hazırsanız, başlıyoruz. Bismm…

Başlarken

React Native framework’ünü GitHub üzerinden indirebilirsiniz. Framework’ü git komutunu kullanarak klonlayabilir ya da doğrudan zip dosyası olarak bilgisayarınıza indirebilirsiniz. Eğer kaynak kodlarla çok ilgilenmeyecekseniz CLI (komut satırı arayüzü) kullanarak da React Native projenizi yaratabilirsiniz. Bu örnekte biz de bu yöntemi kullanacağız.

React Native JavaScript kodları için Node.js kütüphanesini kullanır. Eğer makinanızda Node.js kurulu değilse ilk iş olarak onu kurmakla başlayalım.

Fakat.. Node.js’yi de kurabilmek için önce Homebrew‘i kuralım.

Aşağıdaki komutu terminalde çalıştırıp Homebrew’i kurabilirsiniz.

ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

homebrewHomebrew’i kurduktan sonra terminalde aşağıdaki komutu çalıştırarak Node.js’yi kurabilirsiniz.

brew install node

brew kurulum

Sonraki adım olarak watchman kuracağız. React Native watchman’i kullanarak kodunuzun ne zaman değiştiğini takip eder ve ona göre build eder. Otomatik olarak kodunuzu kaydeder.

brew install watchman

watchman kurulum

Şimdi npm kullanarak React Native CLI aracını kuralım:

npm install -g react-native-cli

react native cli

npm ya da uzun adıyla Node Package Manager (Node Paket Yöneticisi) ile CLI aracını indirip kurabilirsiniz. npm işlev olarak CocoaPods veya Carthage ile eşdeğerdir.

Şimdi React Native uygulamanızı geliştireceğiniz klasöre gidin ve CLI tool’unu kullanarak projenizi oluşturun. Bu örnekte projemizin adı PropertyFinder olacak.

react-native init PropertyFinder

init

Bu komut ile React Native uygulamanız için gerekli tüm proje dosyaları otomatik olarak yaratılmış olacak.

Oluşan proje klasörlerini incelediğinizde node_modules adında bir klasör göreceksiniz. Bu klasörün içinde React Native framework’ü bulunur. Ayrıca index.ios.js adında bir dosya göreceksiniz. Bu dosya CLI tarafından yaratılan ve uygulamanızın iskeletini oluşturan kısımdır. Son olarak Xcode proje dosyası ve iOS klasörü göreceksiniz. Bu klasörde uygulamanız için gerekli bootstrap kodları vardır.

Klasörün içindeki Xcode projesini açıp build ettikten sonra çalıştırın. Simülatör açılacak ve aşağıdaki ekran çıkacak:

ReactNative-Starter

Aynı zamanda yeni bir terminal ekranında aşağıdaki şekilde bir ekranın çıktığını göreceksiniz:

 ===============================================================
 |  Running packager on port 8081.       
 |  Keep this packager running while developing on any JS         
 |  projects. Feel free to close this tab and run your own      
 |  packager instance if you prefer.                              
 |                                                              
 |     https://github.com/facebook/react-native                 
 |                                                              
 ===============================================================
 
Looking for JS files in
   /Users/sensahin/Temp/TestProject
 
React packager ready.

Bu gördüğünüz aslında node altında çalışan React Native paket sistemi. Bu paketin ne yaptığını biraz sonra öğreneceksiniz. Bu noktada unutmamanız gereken şey yeni ekranda açılan terminal penceresini kapatmamanız gerektiği. Arka tarafta çalışıyor olması lazım yoksa kodunuzu derlerken hata alırsınız. Yanlışlıkla kapatırsanız projeyi Xcode üzerinden durdurup tekrar çalıştırmanoz yeterli.

Not: Daha derinlere inmeden önce küçük bir not düşeyim; bu örnekte çok fazla JavaScript kodu yazıyor olacaksınız ve Xcode bu iş için çok iyi olmayabilir. En azından benim için öyle. Ben Sublime Text kullanıyorum ve size de şiddetle öneriyorum.

Merhaba React Native

Emlak arama uygulamamıza geçmeden önce gelenek olduğu üzere çok basit bir Merhaba Dünya uygulaması yazacağız.

index.ios.js dosyasını text editör ile açın ve içeriğini silin. Aşağıdaki kodu başlangıç kısmına yazın:

'use strict';

Strict mod gelişmiş bir hata yönetimi (error handling) sunar.

Sonra, aşağıdaki kodu ekleyin:

var React = require('react-native');

Bu satırdaki kod react-native modülünü yükler ve onu React’e atar. React Native Node.js ile aynı modül yükleme teknolojisini kullanır.

require kodunu içeren satırdan sonra aşağıdakini ekleyin:

var styles = React.StyleSheet.create({
  text: {
    color: 'black',
    backgroundColor: 'white',
    fontSize: 30,
    margin: 80
  }
});

Bu kod basit bir stil ekler uygulamanıza. Daha önce CSS ile uğraştıysanız zaten bu ifadeler size yabancı gelmeyecektir.

Devam ediyoruz. Stil kodlarını yazdığımız satırların altına aşağıdaki kodu ekliyoruz:

class PropertyFinderApp extends React.Component {
  render() {
    return React.createElement(React.Text, 
{style: styles.text}, "Hello World!");
  }
}

Evet, yanlış görmediniz; bu bir JavaScript class’ı!

Son olarak aşağıdaki kısmı kodunuza ekleyin:

React.AppRegistry.registerComponent('PropertyFinder', function() { 
return PropertyFinderApp });

index.ios.js içinde yapmış olduğunuz değişiklikleri kaydedin ve Xcode’a geri dönün. PropertyFinder scheme seçili iken projenizi build edip çalıştırın. Birkaç saniye sonra “Merhaba Dünya” uygulamanızın çalıştığını göreceksiniz:

react-helloworld-281x500

Yukarıda gördüğünüz tarayıcıya ihtiyaç duymadan simülatörde çalışan, native UI render eden bir JavaScript uygulaması!

İnanmadınız mı 🙂 Kendiniz de bunu kontrol edebilirsiniz: Xcode içerisinde Debug/View Debugging/Capture View Hierarchy seçeneğine seçerek hiyerarşiye bakabilirsiniz. İncelediğinizde herhangi bir UIWebView instance’i olmadığını göreceksiniz.

Peki bu şekilde nasıl çalıştığını merak ediyor musunuz? Xcode içerisinde AppDelegate.m dosyasını açın ve application:didFinishLaunchingWithOptions kısmını bulun. Bu metot RCTRootView build eder ve bu View JavaScript uygulamasını yükleyip view içerisinde render eder.

Uygulama başladığında, RCTRootView uygulamayı aşağıdaki URL’den yükler:

http://localhost:8081/index.ios.bundle

Uygulamayı ilk çalıştırdığınızda açılan yeni terminal penceresini hatırladınız mı? İşte bu pencere sayesinde sunucu yukarıdaki request’leri kabul eder ve işler.

Bu URL’i Safari’de açarsanız uygulamanızın JavaScript kodlarını görürsünüz.

Uygulamanız başladığında bu kod yüklenir ve JavaScriptCore framework’ü tarafından çalıştırılır. Bu uygulama örneğinde PropertyFinderApp komponenti yüklenir ve native UIKit view’ı inşa edilir.

JSX Kullanımı

Yukarıda oluşturduğumuz Hello World uygulaması React.createElement elementini kullanır.

Uygulama çalışırken index.ios.js dosyasına dönün ve returnstatement kısmını aşağıdaki şekilde değiştirin:

return <React.Text style={styles.text}>Hello World (Again)</React.Text>;

İşte bu JSX. Bu JavaScript sintaks uzantısı sayesinde HTML-benzeri sintaksı direkt olarak JavaScript kodunuza gömebilirsiniz.

index.ios.js içindeki değişiklikleri kaydedin ve simülatöre geri dönün. Cmd+R basarak uygulamanızı refresh ettiğinizde ekranda “Hello World (Again)” yazısını göreceksiniz.

Gördüğünüz gibi React Native uygulamasını tekrar çalıştırmak tarayıcıda sayfayı resfresh etmek kadar kolay 🙂

Tamam, Hello World uygulaması ile olan işimiz bitti. Şimdi gerçek fonksiyonlu bir uygulama geliştirmeye geçiyoruz!

Navigasyon Ekleme

Property Finder uygulaması UIKit’in navigasyon kontrollerinden olan standart stack-based navigasyon deneyimini kullanacak. Şimdi bu seçeneği ekleyelim.

index.ios.js içerisinde HelloWorld sınıfını PropertyFinderApp olarak değiştirin:

class HelloWorld extends React.Component {

Hello World yazısını biraz daha ekranda tutacağız fakat bu uygulamamızın ana komponenti olmayacak.

Şimdi aşağıdaki class’ı HelloWorld komponentine ekleyin:

class PropertyFinderApp extends React.Component {
  render() {
    return (
      <React.NavigatorIOS
        style={styles.container}
        initialRoute={{
          title: 'Property Finder',
          component: HelloWorld,
        }}/>
    );
  }
}

Bu kod ile bir navigasyon kontroller’ı yaratmış ve bir stil uygulayarak ana rutu HelloWorld komponentine yönlendirmiş olursunuz.

Aynı dosya içerisinde stil deklarasyonunu aşağıdaki şekilde değiştirin:

var styles = React.StyleSheet.create({
  text: {
    color: 'black',
    backgroundColor: 'white',
    fontSize: 30,
    margin: 80
  },
  container: {
    flex: 1
  }
});

Biraz sonra flex: 1 ne demek onu da açıklayacağım. Şimdi simülatöre geri dönün ve cmd+R butonlarına basarak yeni arayüzünüzü inceleyin:

react-helloworldagain-281x500

Yukarıdaki örnekte root view ile birlikte bir navigasyın kontroller’ı var ve bu kontroller Hello World yazısını gösteriyor. Şimdi biraz gerçek UI ekleyelim!

Arama Sayfası

Şimdi arama sayfamızı hazırlayalım. Projenize SearchPage.js adında yeni bir dosya ekleyin ve index.ios.js ile aynı klasörde olmasına dikkat edin. Aşağıdaki kodu bu dosyanın içine ekleyin:

'use strict';
 
var React = require('react-native');
var {
  StyleSheet,
  Text,
  TextInput,
  View,
  TouchableHighlight,
  ActivityIndicatorIOS,
  Image,
  Component
} = React;

Daha sonra aşağıdaki kodu ekleyin:

var styles = StyleSheet.create({
  description: {
    marginBottom: 20,
    fontSize: 18,
    textAlign: 'center',
    color: '#656565'
  },
  container: {
    padding: 30,
    marginTop: 65,
    alignItems: 'center'
  }
});

Gördüğünüz gibi standart CSS kullandık.

Şimdi bu stilin altına aşağıdaki komponenti ekleyin:

class SearchPage extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.description}>
          Search for houses to buy!
        </Text>
        <Text style={styles.description}>
          Search by place-name, postcode or search near your location.
        </Text>
      </View>
    );
  }
}

render JSX kullanımı ile ilgili çok güzel bir örnek.

Son olarak aşağıdaki kodu ekleyin:

module.exports = SearchPage;

Bu modül SearchPage class’ının başka dosyalarda kullanılmasına izin vererek export eder.

Sonraki adımda uygulamanın rutunu güncellememiz gerekir.

index.ios.js dosyasını açın ve aşağıdaki kodu en tepedeki require satırından hemen sonraya ekleyin:

var SearchPage = require('./SearchPage');

render fonksiyonu içerisinde initialRoute kısmını yeni eklediğimiz SearchPage sayfasına referans verecek şekilde güncelleyin:

component: SearchPage

Bu noktada HelloWorld class’ını ve ona bağlı stili isterseniz kaldırabilirsiniz. Kodun bu kısmına ihtiyacınız olmayacak.

Şimdi simülatöre geri dönün ve cmd+R ile yeni arayüzü inceleyin:

react-searchstarter-281x500

Flexbox ile stil hazırlama

Şimdiye kadar temel CSS elementleriyle margin, padding ve renk ayarlama kısımlarını hallettik. Fakat flexbox diye bir şey var ki bunun sayesinde uygulama UI arayüzü hazırlamak çok kolay.

Uygulamanızda container’ın sütun şeklinde bir yönü var yani bu şu demek; ona bağlı elemanlar dikey olarak sıralanacak. Yani şu şekilde:

FlexStack

Şimdi arama yapılabilmesi için bir adet kutucuk ve butonlarımızı ekleyelim. SearchPage.js dosyasını açın ve aşağıdaki kodu ikinci Text elementinden hemen sonra ekleyin:

<View style={styles.flowRight}>
  <TextInput
    style={styles.searchInput}
    placeholder='Search via name or postcode'/>
  <TouchableHighlight style={styles.button}
      underlayColor='#99d9f4'>
    <Text style={styles.buttonText}>Go</Text>
  </TouchableHighlight>
</View>
<TouchableHighlight style={styles.button}
    underlayColor='#99d9f4'>
  <Text style={styles.buttonText}>Location</Text>
</TouchableHighlight>

Burada iki tane top-level view ekledik: biri text input diğeri ise buton.

Şimdi aşağıdaki stili style tanımlamasının olduğu yere ekleyin:

flowRight: {
  flexDirection: 'row',
  alignItems: 'center',
  alignSelf: 'stretch'
},
buttonText: {
  fontSize: 18,
  color: 'white',
  alignSelf: 'center'
},
button: {
  height: 36,
  flex: 1,
  flexDirection: 'row',
  backgroundColor: '#48BBEC',
  borderColor: '#48BBEC',
  borderWidth: 1,
  borderRadius: 8,
  marginBottom: 10,
  alignSelf: 'stretch',
  justifyContent: 'center'
},
searchInput: {
  height: 36,
  padding: 4,
  marginRight: 5,
  flex: 4,
  fontSize: 18,
  borderWidth: 1,
  borderColor: '#48BBEC',
  borderRadius: 8,
  color: '#48BBEC'
}

Buraya eklediğimiz stil hem buton hem de text input tarafından kullanılacak.

Şimdi simülatöre geri dönün ve cmd+R ile yeni arayüzü inceleyin:

react-searchpageinput-281x500

Sonraki adım olarak arama sayfasını tamamlamak için bir adet ev görseli ekleyelim. Görseli buradan indirebilirsiniz.

Xcode içerisinde Images.xcassets dosyasını açın ve artı butonuna tıklayarak yeni bir görsel seti ekleyin. Sonra ev görselini doğru slot içine sürükleyip bırakın:

AddingHouseImage-700x459

Uygulamanızı burada durdurup yeninden başlatmanız gerekiyor ki bu görseller React Native uygulamanızda görünür hale gelsin.

Aşağıdaki kodu TouchableHighlight komponentinin hemen altına ekleyin:

<Image source={require('image!house')} style={styles.image}/>

Şimdi görselin ilgili stilini style tanımlamasının en sonuna ekleyin:

image: {
  width: 217,
  height: 138
}

require(‘image!house’) ifadesi asset kataloğuna eklediğiniz görselin kullanılması gerektiğini bildirir.

Şimdi simülatöre geri dönün ve cmd+R ile yeni arayüzü inceleyin:

react-searchpagehouse-281x500

İlk React Native uygulamanız harika gözüküyor! Şimdi biraz fonksiyon ekleyelim.

Komponent State’i Ekleme

Her bir React komponentinin kendi state objesi vardır ve bu obje bir anahtar değer saklamak için kullanılır. Bir komponenti render etmeden önce state’ini belirtmeniz gerekir.

SearchPage.js içerisinde aşağıdaki kodu render() kısmından hemen önce SearchPage class’ına ekleyin:

constructor(props) {
  super(props);
  this.state = {
    searchString: 'london'
  };
}

Komponentinizin şimdi bir adet state değişkeni var.

Şimdi bu komponent state’ini kullanalım. render sayesinde TextInput elementini aşağıdaki şekilde değiştirelim:

<TextInput
  style={styles.searchInput}
  value={this.state.searchString}
  placeholder='Search via name or postcode'/>

Şimdi event handler olacak şekilde bir metot oluşturalım ki kullanıcılar bu arama kutucuğuna birşeyler yazdığında olabilecek sonuçları ayarlayalım. SearchPage class’ı içerisine aşağıdaki kodu ekleyin:

onSearchTextChanged(event) {
  console.log('onSearchTextChanged');
  this.setState({ searchString: event.nativeEvent.text });
  console.log(this.state.searchString);
}

Bu kod text elementindeki değeri alır ve komponentin durumunu güncellemede kullanır.

Aşağıdaki onChange property’sini kodunuza ekleyin:

<TextInput
  style={styles.searchInput}
  value={this.state.searchString}
  onChange={this.onSearchTextChanged.bind(this)}
  placeholder='Search via name or postcode'/>

Kullanıcı ne zaman yazıyı değiştirirse onChange tarafından sunulan fonksiyon çalıştırılacak.

Uygulamanızı refresh etmeden önce son adım olarak aşağıdaki logging ifadesini render()’in en tepesine return’den hemen önceki kısma ekleyin:

console.log('SearchPage.render');

Bu loglar sayesinde çok faydalı şeyler öğreneceksiniz 🙂

Simülatöre geri dönün ve cmd+r butonlarına basın. Şimdi arama kutucuğunda “london” değerini göreceksiniz ve bu text’i editlemeye başladığınızda Xcode konsol ekranında aşağıdaki logları göreceksiniz:

react-renderconsole

React ile uygulama arayüzünüzün hangi kısmının durum değişikliği geçirdiğini düşünmenize gerek yok, çünkü UI’nin tamamı uygulama state’inin bir fonksiyonu olarak ifade ediliyor.

Bu noktada çok radikal bir durumu kesin olarak gözlemlediğinizi düşünüyorum: performans!

Şimdi kodunuzu son kez gözden geçirin ve en son eklediğiniz loglama kısmını kaldırın çünkü buna çok ihtiyacınız yok şimdilik.

Arama Yapma

Şimdi text kutumuz tamam, arama yapabilmek için butonumuza bir fonksiyon tanımlamamız gerekiyor.

SearchPage.js içinde state’i aşağıdaki gibi güncelleyin:

this.state = {
  searchString: 'london',
  isLoading: false
};

isLoading sayesinde uygulamanız herhangi bir query var mı yok mu dinleyecek.

Aşağıdaki kodu render’in başlangıcına ekleyin:

var spinner = this.state.isLoading ?
  ( <ActivityIndicatorIOS
      hidden='true'
      size='large'/> ) :
  ( <View/>);

Aşağıdaki kodu Image’in hemen altına ekleyin:

{spinner}

Şimdi, TouchableHighlight etiketi içerisine aşağıdaki kodu ekleyin:

onPress={this.onSearchPressed.bind(this)}

SearchPage class’ına aşağıdaki metodu ekleyin:

_executeQuery(query) {
  console.log(query);
  this.setState({ isLoading: true });
}
 
onSearchPressed() {
  var query = urlForQueryAndPage('place_name', this.state.searchString, 1);
  this._executeQuery(query);
}

Son olarak aşağıdaki fonksiyonu SearchPage class deklarasyonunun en tepesine ekleyin:

function urlForQueryAndPage(key, value, pageNumber) {
  var data = {
      country: 'uk',
      pretty: '1',
      encoding: 'json',
      listing_type: 'buy',
      action: 'search_listings',
      page: pageNumber
  };
  data[key] = value;
 
  var querystring = Object.keys(data)
    .map(key => key + '=' + encodeURIComponent(data[key]))
    .join('&');
 
  return 'http://api.nestoria.co.uk/api?' + querystring;
};

Simülatöre geri dönün ve uygulamayı refresh edin. Go butonuna bastığınızda bir indikatörün döndüğünü göreceksiniz, Xcode log konsoluna baktığınızda şunu göreceksiniz:

SearchAcitivityIndicator-700x169

Not: Bu uygulama emlak arama için Nestoria sitesinin API’sini kullanıyor. API’den dönen JSON cevabı çok açık ve net fakat daha detaylı incelemek isterseniz sitenin API dökümantasyonuna bakabilirsiniz.

Şimdi sonraki adım olarak API requestinde bulunacağız ve dönen sonuçları ekrana yazdıracağız.

API Request

SearchPage.js içerisine message değişkenini ekleyin:

this.state = {
  searchString: 'london',
  isLoading: false,
  message: ''
};

Render içerisinde aşağıdaki kodu UI’nin en altına ekleyin:

<Text style={styles.description}>{this.state.message}</Text>

Kullanıcılara mesajlar göstermek için bunu kullanacağız.

SearchPage class’ı içerisinde aşağıdaki kodu_executeQuery() sonuna ekleyin:

fetch(query)
  .then(response => response.json())
  .then(json => this._handleResponse(json.response))
  .catch(error => 
     this.setState({
      isLoading: false,
      message: 'Something bad happened ' + error
   }));

Son adım olarak aşağıdaki fonksiyonu SearchPage’e ekleyin:

_handleResponse(response) {
  this.setState({ isLoading: false , message: '' });
  if (response.application_response_code.substr(0, 1) === '1') {
    console.log('Properties found: ' + response.listings.length);
  } else {
    this.setState({ message: 'Location not recognized; please try again.'});
  }
}
Çalışmanızı kaydedin ve simülatöre geri dönerek sayfayı refresh edin. Arama kutucuğuna london yazıp arayın. Log konsolunda 20 adet emlağın bulunduğunu söyleyen bir ifade göreceksiniz. Şimdi de olmayan bir lokasyon arayın, örneğin narnia yazıp arayın ve aşağıdaki mesajı görüyor olacaksınız:

react-narnia-281x500

Sonuçları Gösteriyoruz

SearchResult.js adında yeni bir dosya yaratın ve aşağıdaki kodu ekleyin:

'use strict';
 
var React = require('react-native');
var {
  StyleSheet,
  Image, 
  View,
  TouchableHighlight,
  ListView,
  Text,
  Component
} = React;

Evet, doğru gördünüz. require ifadesi kullandık ve react-native modülünü istedik.

Şimdi aşağıdaki komponenti ekleyin:

class SearchResults extends Component {
 
  constructor(props) {
    super(props);
    var dataSource = new ListView.DataSource(
      {rowHasChanged: (r1, r2) => r1.guid !== r2.guid});
    this.state = {
      dataSource: dataSource.cloneWithRows(this.props.listings)
    };
  }
 
  renderRow(rowData, sectionID, rowID) {
    return (
      <TouchableHighlight
          underlayColor='#dddddd'>
        <View>
          <Text>{rowData.title}</Text>
        </View>
      </TouchableHighlight>
    );
  }
 
  render() {
    return (
      <ListView
        dataSource={this.state.dataSource}
        renderRow={this.renderRow.bind(this)}/>
    );
  }
 
}

Şimdi de aşağıdaki export modülünü en sona ekleyin:

module.exports = SearchResults;

SearchPage.js içerisinde en tepeye require’ın hemen altına aşağıdaki kodu ekleyin:

var SearchResults = require('./SearchResults');

_handleResponse metodunu aşağıdaki şekilde değiştirin:

this.props.navigator.push({
  title: 'Results',
  component: SearchResults,
  passProps: {listings: response.listings}
});

Şimdi simülatöre geri dönün ve uygulamanızı refresh edin. Aşağıdaki şekilde sonuçların döndüğünü göreceksiniz:

react-searchresults1-281x500

Stil Ekleyelim

Evet sonuçları da döndürdük. Fakat biraz karışık gözüküyor. Şimdi biraz stil ekleyelim ve arayüzü güzelleştirelim.

SearchResults.js içine aşağıdaki stili ekleyin:

var styles = StyleSheet.create({
  thumb: {
    width: 80,
    height: 80,
    marginRight: 10
  },
  textContainer: {
    flex: 1
  },
  separator: {
    height: 1,
    backgroundColor: '#dddddd'
  },
  price: {
    fontSize: 25,
    fontWeight: 'bold',
    color: '#48BBEC'
  },
  title: {
    fontSize: 20,
    color: '#656565'
  },
  rowContainer: {
    flexDirection: 'row',
    padding: 10
  }
});

Sonra renderRow()’u aşağıdaki ile değiştirin:

renderRow(rowData, sectionID, rowID) {
  var price = rowData.price_formatted.split(' ')[0];
 
  return (
    <TouchableHighlight onPress={() => this.rowPressed(rowData.guid)}
        underlayColor='#dddddd'>
      <View>
        <View style={styles.rowContainer}>
          <Image style={styles.thumb} source={{ uri: rowData.img_url }} />
          <View  style={styles.textContainer}>
            <Text style={styles.price}>£{price}</Text>
            <Text style={styles.title} 
                  numberOfLines={1}>{rowData.title}</Text>
          </View>
        </View>
        <View style={styles.separator}/>
      </View>
    </TouchableHighlight>
  );
}

Son adım olarak aşağıdaki metodu ekleyin:

rowPressed(propertyGuid) {
  var property = this.props.listings.filter(prop => prop.guid === propertyGuid)[0];
}

Simülatöre geri dönün ve refresh edin. Şöyle bir ekran gelmesi lazım:

react-searchresults2-281x500

Şahane değil mi 🙂 En ufak bir Objective C veya Swift kodu kullanmadan sadece JavaScript ile native mobil uygulaması yazıyoruz, insan daha ne ister 🙂

Emlak Detay Görünümü

Şimdi gelen sonuçlardan birine tıkladığımızda bizi detay sayfasına götürsün ve bu detay sayfasında bizi o emlakla ilgili detaylı bilgi versin istiyoruz.

PropertyView.js adında yeni bir dosya oluşturun ve aşağıdaki kodu en tepeye ekleyin:

'use strict';
 
var React = require('react-native');
var {
  StyleSheet,
  Image, 
  View,
  Text,
  Component
} = React;

Şimdi de aşağıdaki stili ekleyin:

var styles = StyleSheet.create({
  container: {
    marginTop: 65
  },
  heading: {
    backgroundColor: '#F8F8F8',
  },
  separator: {
    height: 1,
    backgroundColor: '#DDDDDD'
  },
  image: {
    width: 400,
    height: 300
  },
  price: {
    fontSize: 25,
    fontWeight: 'bold',
    margin: 5,
    color: '#48BBEC'
  },
  title: {
    fontSize: 20,
    margin: 5,
    color: '#656565'
  },
  description: {
    fontSize: 18,
    margin: 5,
    color: '#656565'
  }
});

Şimdi de komponenti ekleyin:

class PropertyView extends Component {
 
  render() {
    var property = this.props.property;
    var stats = property.bedroom_number + ' bed ' + property.property_type;
    if (property.bathroom_number) {
      stats += ', ' + property.bathroom_number + ' ' + (property.bathroom_number > 1
        ? 'bathrooms' : 'bathroom');
    }
 
    var price = property.price_formatted.split(' ')[0];
 
    return (
      <View style={styles.container}>
        <Image style={styles.image} 
            source={{uri: property.img_url}} />
        <View style={styles.heading}>
          <Text style={styles.price}>£{price}</Text>
          <Text style={styles.title}>{property.title}</Text>
          <View style={styles.separator}/>
        </View>
        <Text style={styles.description}>{stats}</Text>
        <Text style={styles.description}>{property.summary}</Text>
      </View>
    );
  }
}

Son olarak da dosyanın sonuna aşağıdaki export modülünü ekleyin:

module.exports = PropertyView;

SearchResults.js dökümanına geri dönün ve require ifadesini ekleyin en tepeye:

var PropertyView = require('./PropertyView');

Şimdi rowPressed() kısmını güncelleyin:

rowPressed(propertyGuid) {
  var property = this.props.listings.filter(prop => prop.guid === propertyGuid)[0];
 
  this.props.navigator.push({
    title: "Property",
    component: PropertyView,
    passProps: {property: property}
  });
}

Simülatöre geri dönün ve uygulamanızı refresh edin. Detaya tıkladığınızda aşağıdaki ekran gelecek:

react-property-281x500

Geolocation Kullanımı

Uygulamamız kullanıcıların lokasyon bilgisini kullanacağından öncelikle kullanıcılardan bunun iznini almamız lazım.

Xcode içinde Info.plist dosyasını açın ve Add Row butonuna tıklayarak yeni bir anahtar ekleyin. NSLocationWhenInUseUsageDescription anahtar adı olarak girin ve aşağıdaki değeri yazın:

PropertyFinder would like to use your location to find nearby properties

plist dosyanızın şu şekilde gözükmesi lazım:

Screen-Shot-2015-03-20-at-21.49.06-480x162

SearchPage.js açın ve TouchableHighlight kısmını bulun ve aşağıdaki değeri ekleyin:

onPress={this.onLocationPressed.bind(this)}

SearchPage body kısmına aşağıdaki kodu ekleyin:

onLocationPressed() {
  navigator.geolocation.getCurrentPosition(
    location => {
      var search = location.coords.latitude + ',' + location.coords.longitude;
      this.setState({ searchString: search });
      var query = urlForQueryAndPage('centre_point', search, 1);
      this._executeQuery(query);
    },
    error => {
      this.setState({
        message: 'There was a problem with obtaining your location: ' + error
      });
    });
}

Tebrikler! Uygulamanız kullanıma hazır 🙂

Yukarıdaki örnek uygulamanın bütün proje dosyalarını ve kodlarını GitHub üzerinde bulabilirsiniz.

Umarım React Native nedir ne değildir biraz fikir edinmişsinizdir.

Hadi şimdi koşun ve kendi emlak arama uygulamanızı React Native ile geliştirin. Başarılar.

Not: Bu yazı http://www.raywenderlich.com/99473/introducing-react-native-building-apps-javascript adresinden Türkçe’ye çevrilmiştir.

Fermi Paradoksu

Fermi paradoksu evrendeki varlığımızla ilgili soruları araştıran ve neden dış dünyalı canlılar tarafından halen tespit edilmediğimizi sorgulayan bir paradokstur. Fermi paradoksunu anlayabilmek için uzayı, evreni, yıldızları ve galaksileri çok iyi anlamak gerekir. Gelin hep birlikte bakalım.

Çok mutlu hissettmemizi sağlayan yıldızlı bir gecede kafamızı kaldırıp yukarıya baktığımızda şunu görürüz:

gokyuzu_yıldızlar

Bu epik güzellik karşısında bazıları geleneksel takılır, bazısı bu muazzam tablo karşısında vurulur, bazısı ise evrenin bu muhteşem büyüklüğü karşısında hayran hayran gökyüzünü izler. Bazısı bu manzara karşısında varoluşunu sorgular. Neticede herkes birşeyler hisseder.

Fermi paradoksu’na adını veren fizikçi Enrico Fermi de birşeyler hissetmişti ve hissettikleri kafasında şu soruyu meydana getirmişti: “Herkes nerede?“.

Çok yıldızlı bir gökyüzü çok geniş ve muazzam gözükür. Fakat aslında gördüğümüz yerel galaktik komşularımızdır. En açık gecelerde 2500’e kadar yıldızı gözlerimizle görebiliriz (galaksimizde yüz milyonlarca yıldız vardır) ve bu gördüğümüz yıldızlar bizden 1000 ışık yılından daha az uzaklıkta bir mesafededir. Dolayısıyla aslında baktığımız manzara şudur:

samanyolu2

 

Yıldız ve galaksileri incelediğimiz zaman veya üzerinde düşündüğümüz zaman pek çoğumuzun aklına şu soru gelir, “Başka yıldızlarda akıllı canlılar var mı?”. Bu soruya cevap verebilmek için biraz rakamlara bakalım önce;

100 ile 400 milyar arasında yıldız barındıran bir galaksimiz ve en az bu kadar sayıda galaksi barındıran gözlemlenebilir bir evrenimiz var. Dolayısıyla Samanyolu Galaksisi’ndeki her bir yıldız için apayrı bir galaksi var oralarda bir yerde. Bu da şu demek; yeryüzündeki tüm kumsallardaki her kum tanesi için 10.000 yıldız var yukarıda.

Bilim dünyası bu yıldızların yüzde kaçının güneşimiz gibi (aynı boyut, sıcaklık ve ışık) olduğu noktasında tam bir fikir birliğine varmış değil. Güneşimize benzer yıldızların olma ihtimali %5 ile %20 arasında değişiyor. En düşük yüzdeyi (%5) ve en az yıldız sayısını baz alırsak (1022) bu bize 500 kentilyon veya diğer bir deyişle 500 milyar milyar güneş benzeri yıldız sayısı verir. Yani en ufak değerleri alıyor olsak bile elde ettiğimiz rakam devasa. Güneş benzeri yıldızların sayısı 500 kentilyon. Bunu bir kenara bırakalım.

Peki bu güneş benzeri yıldızların yüzde kaçının yörüngesinde dünyamıza benzer bir gezegen olabilir? Dünyamıza benzer derken boyut, sıcaklık gibi yaşamın oluşmasını sağlayacak unsurları kastediyoruz. Bazı bilim adamları bu oranın %50 olduğunu söylüyor bazıları ise %22. Biz yine en düşük oranı alalım: %22. Yani bu şu demek; 500 kentilyon güneş benzeri yıldız var ve dünyamıza benzer yaşanabilir başka bir gezegenin bu yıldızların yörüngesinde olma ihtimali %1 ise toplam 100 kentilyon (milyar milyar) dünya benzeri gezegen var!

Şimdi, bundan sonrasında biraz spekülatif olacağız. Elimizdeki verilerden yola çıkarak çıkarımlarda bulunacağız. Elimizde evrende toplam 100 milyar milyar dünya benzeri gezegen olduğu bilgisi var. Şunu bir hayal edelim; bu gezegenlerin %1’inde yaşam meydana gelsin. Ve bu %1 gezegenlerde yaşam dünyamızdaki insanlar gibi akıllı bir seviyeye gelmiş olsun. Yani bu %1 gezegende akıllı canlılar olsun. Bu şu demek; gözlemlenebilir evrende 10 katrilyon akıllı medeniyet bulunmakta.

Şimdi galaksimize geri dönelim ve en düşük rakamları ve ihtimalleri baz alarak bir hesap daha yapalım. Samanyolu galaksisinde 100 milyar yıldız olduğunu düşünürsek; galaksimizde 1 milyar dünya benzeri gezegen ve 100.000 akıllı medeniyet olduğu sonucuna varırız. Bakın başka galaksilerde değil, kendi galaksimizde 1 milyar dünya benzeri gezegen ve 100.000 akıllı medeniyet var.

SETI (Dünya Dışı Akıllı Yaşam Araştırması) diğer akıllı yaşam birimlerinden gelen sinyalleri dinlemek ve araştırmak için kurulmuş bir organizasyon. Bu sinyalleri dinleyebilmek için geliştirdikleri muazzam güçlü anten ve uyduları var. Eğer galaksimizde 100.000 akıllı medeniyet var ise ve bu medeniyetlerden sadece bir kısmı bile başkalarıyla iletişime geçmek için sinyal gönderdiyse, SETI’nin bu güçlü uydularının bu sinyalleri yakalaması gerekmez mi?

Fakat yakalanmış herhangi bir sinyal yok. Sıfır.

Peki o zaman soru şu;

Herkes nerede?

İş bu noktada biraz daha ilginç bir hal alıyor. Güneşimiz evrenin yaşam döngüsü içerisinde aslında oldukça genç sayılır. Güneşimizden ve dünyamızdan çok çok daha eski ve yaşlı güneş ve gezegenler var. Bu da şu demek; bu daha yaşlı dünya benzeri gezegenlerde medeniyet ve teknoloji bizimkinden çok çok daha ileri bir seviyede. Örnek olarak gelin 4.54 milyar yaşındaki dünyamızla 8 milyar yaşındaki X gezegenini karşılaştıralım.

fermi_paradoksu

Eğer X gezegeninin dünya gibi benzer bir yaşam hikayesi var ise, gelin oradaki medeniyetin bugün nerede olacağına bir bakalım.

fermi_paradoksu2

Bizden 1000 yıl ilerde bir medeniyetin teknolojisi ve bilgisi bile bizi şok etmeye yeter iken bizden 1 milyon yıl ilerde bir medeniyetin teknolojisi ve bilgisini tahmin bile edemeyiz. Ve bu örnekte X gezegeni bizden tam 3.4 milyar yıl ilerde. Milyon değil dikkat edin milyar…

Kardaşev skalası denilen bir şey var. Rus astronom Nikolai Kardashev’in galaktik uygarlıklar için oluşturduğu teorik sınıflandırma. Bu sınıflandırmaya göre galaktik akıllı medeniyetler kullandıkları enerji miktarına göre üç ana kategoriye ayrılır;

Tip 1 Medeniyet: Bu kategorideki medeniyetler enerjilerinin tamamını kendi gezegenleri üzerinde kullanır. Biz bu gruba girmiyoruz. Carl Sagan bunu hesaplamak için bir formül geliştirdi ve formüle göre biz 0.7 Tip medeniyet grubuna giriyoruz.

Tip 2 Medeniyet: Bu kategorideki medeniyleter bütün enerjilerini misafiri oldukları yıldızda kullanırlar. Bizim sınırlı ve güçsüz Tip 1 beyinlerimiz bunu algılamakta ve hayal etmekte zorlanır fakat Dyson Küresi gibi şeylerde şansımızı deniyoruz.

Dyson Küresi

Tip 3 Medeniyet: Diğer iki tip medeniyeti yok edecek güçte, tüm Samanyolu Galaksisi’nin gücüne erişebilecek kapasitede.

Eğer bu derece ileri bir seviyenin yakalanmasının mümkün olmadığını düşüyorsanız yukarıda örneğini verdiğimiz X gezegenini ve 3.4 milyar yıllık gelişim seviyesini düşünün. Eğer X gezegenindeki bize benzer bir medeniyet vardıysa ve bu medeniyet Tip 3 seviyesine kadar ilerlediyse, doğal olarak bu medeniyetin yıldızlar arası seyahatte çoktan uzman olduklarını ve hatta bütün bir galaksiyi kolonize edecek güce sahip olduklarını düşünebiliriz.

Bir hipoteze göre galaktik kolonizasyon şöyle gerçekleşecek; diğer gezegenlere seyahat edebilen makineler geliştirilecek, bu makineler vardıkları gezegende 500 yıla yakın bir zaman harcayarak oradaki materyalleri kullanarak kendi benzerlerini oluşturacak ve bu benzerlerini başka gezegenlere gönderecek ve bu şekilde devam edecek. Işık hızında değil de normal hızda seyahat edilse bile bütün bir galaksinin kolonizasyonu için 3.75 milyon yıl gerekli ki bu süre milyarlarca yıla kıyasla bir göz kırpması hızında gerçekleşir:

One hypothesis as to how galactic colonization could happen is by creating machinery that can travel to other planets, spend 500 years or so self-replicating using the raw materials on their new planet, and then send two replicas off to do the same thing. Even without traveling anywhere near the speed of light, this process would colonize the whole galaxy in 3.75 million years, a relative blink of an eye when talking in the scale of billions of years:

galaksi_kolonizasyonu

Speküle etmeye devam edelim, eğer akıllı medeniyetlerin sadece %1’i bile bütün galaksiyi kolonize edecek Tip 3 türü medeniyet seviyesine ulaşmayı başarabilirse, yukarıdaki hesaplamalarımıza göre sadece kendi galaksimiz içerisinde en az 1000 adet Tip 3 türü medeniyet olması gerekir. Ve bu şekilde muazzam güçte bir medeniyetin varlığı galaksi içerisinde kendisini muhakkak hissettirirdi. Fakat gelin görün ki; hiçbir şey görmüyoruz, hiçbir şey duymuyoruz ve hiç kimse tarafından ziyaret edilmiyoruz. O zaman akıllaran gelen soru şu:

Peki o zaman herkes nerede?

Fermi Paradoksu

Fermi paradoksuna hoş geldiniz.

Fermi paradoksuna verebileceğimiz bir cevabımız yok, sadece “muhtemel açıklamalarımız” var. Ve bu muhtemel açıklamaları 10 farklı bilim adamına sorarsanız, hepsinden 10 farklı cevap almanız da muhtemeldir. Eskiden nasıl insanlar dünyanın düz mü yuvarlak mı olduğu, güneş ışıklarının Zeus tarafından gönderildiği gibi konularda tartışırlardı, şimdi biz de Fermi paradoksunun soruları ile kafa yoruyoruz.

Şimdi Fermi paradoksuna cevap bulmaya çalışan açıklamaları geniş kategorilerde inceleyelim. Bu açıklamalar Tip 2 ve Tip 3 türü medeniyetlerin olmadığını varsayanlar ile bu medeniyetlerin var olduğunu varsayanlar ve bizim onları görmüyor ya da duymuyor oluşumuzu başka sebeplere bağlayanlar:

Grup 1 Açıklaması: Evrende Tip 2 ve Tip 3 türü ileri seviye medeniyetlerin var olduğuna dair herhangi bir iz ya da işaret yok çünkü bu şekilde ileri seviye medeniyetler yok.

Grup 1’in açıklamasını kabul edenler “Evrende çok ileri seviyede medeniyetler var fakat onlardan hiçbiri bizimle iletişime geçmedi çünkü __________” şeklindeki teorileri reddederler. Grup 1’deki insanlar  “yüz binlerce ya da milyonlarca ileri medeniyet olmalı ve bunlardan en az 1 tanesi bu kurala uymamalı” şeklindeki matematiksel hesaplamalara bakarlar.

Bu nedenle, Grup 1 açıklamalarına göre evrende hiçbir ileri seviye medeniyet olmaması lazım. Matematiksel hesaplamalar ise sadece bizim galaksimizde binlerce olduğunu gösterdiğine göre başka bazı ne olduğunu bilmediğimiz şeyler var.

İşte bu ne olduğunu bilmediğimiz şeyin adı The Great Filter yani Büyük Filtre.

Büyük Filtre teorisi şunu der; yaşam öncesi evre ile Tip 3 medeniyetleri arasında bir yerde duvar gibi bir şey var ve bu duvara yaşam gelip toslamakta ve ilerleyememekte. Bu duvarın olduğu noktada öyle bir uzun evrimsel gelişim evresi var ki, yaşam bu evreden öteye geçemiyor ve ilerleyemiyor. İşte bu evrenin adı Büyük Filtre.

büyük filtre

Eğer bu teori doğru ise, bu noktada sormamız gereken soru şu: zaman çizelgesi içerisinde Büyük Filtre tam olarak nerede meydana gelmekte?

İnsanlığın kaderi noktasından baktığımızda aslında bu soru çok önem arz ediyor. Büyük Filtre’nin nerede meydana geldiğine bağlı olarak, üç ihtimalimiz var: Çok nadir bir türüz, filtreyi geçen ilk türüz veya filtreyi aşamıyoruz ve yandık.. Şimdi bu 3 ihtimali inceleyelim.

1. Nadir bir türüz (Büyük Filtre gerimizde kaldı)

İlk ihtimal olarak umut edelim ki Büyük Filtre gerimizde kaldı ve biz bir şekilde onu aşmayı başardık ki bu da bizim yaşam seviyemizin oldukça nadir olduğunu gösterir. Aşağıdaki diagram sadece iki türün filtreyi aştığını gösteriyor ve bunlardan biri de biziz.

büyük filtre3

Bu senaryo neden herhangi bir Tip 3 medeniyetinin var olmadığını da açıklıyor.. fakat aynı zamanda bizim bu aşamaya kadar gelebilmiş nadir bir tür olduğumuzu da söylüyor. Yani umut var demektir. Bu teori bizim özel bir tür olduğumuzu da söylüyor. Çünkü bir şekilde filtreyi geride bırakmışız. Fakat bilim adamlarının “Gözlem seçimi etkisi” dedikleri bir şey var. Bu etkiye göre kendisinin nadir ve özel olduğunu varsayan türlerin ya gerçekten nadir ve özel ya da oldukça yaygın olduğu söylenebilir. Bu da bizim özel olma durumumuzun en düşük ihtimal olduğunu gösterir.

Ve eğer özel bir tür isek, tam olarak ne zaman özel bir tür olduk? Örneğin; herkesin sıkışıp kaldığı fakat bizim aşmayı başardığımız büyük filtre adımında mı?

Bir ihtimal: Büyük Filtre en başlangıçta olmuş olabilir ve yaşamın başlamasını engellemiş olabilir. Bu ihtimal bir aday. Çünkü dünyanın oluşması milyarlarca yıl aldı ve bu oluşma olayını laboratuvarlarda gerçekleştirmeyi denedik fakat başarısız olduk. Eğer bu nokta Büyük Filtre dediğimiz nokta ise o zaman evrende bizden başka canlıların olmamasının yanında hiç bir yaşamın da olmadığını söyleyebiliriz.

Diğer ihtimal: Büyük Filtre basit prokaryot hücreden kompleks ökaryot hücreye zıplama evresi olabilir. Prokaryotlar oluştuktan sonra neredeyse 2 milyar yıl hiç değişmeden ve evrim geçirmeden o şekilde kaldı. Daha sonra büyük bir evrimsel sıçrayış ile kompleks hale geldi ve çekirdeğe sahip oldular. Eğer Büyük Filtre bu aşama ise evren basit prokaryot hücrelerle kaynıyor ve bundan başka da bir şey yok.

Bu ihtimallerin dışında başka ihtimaller de var. Örneğin şu anki akli durumumuza erişimimiz ve beynimizi kullanmaya başlamamız en son geçirdiğimiz evrimsel sıçrayış noktası ve Büyük Filtre olmaya aday. Yarı-akıllı yaşamdan (şempanze) akıllı yaşama (insan) sıçrayış çok büyük mucizevi bir sıçrayış olarak görülmese de, Steven Pinker evrimin salt ileriye gidiş olmadığını ve bir adaptasyon ve hayatta kalma süreci olduğunu belirtir.

Pek çok evrimsel sıçrayış Büyük Filtre olmaya aday değildir. Büyük Filtre olmaya aday olayların milyarda bir tip olması ve tamamen manyak ve deli bir olayın vuku bulması ve yine deli bir istisnanın vuku bulması gerekir. Bu nedenle tek hücreden çok hücreye geçiş büyük filtreye aday değildir çünkü en az 46 defa gerçekleşmiş ve sadece bizim gezegenimizde meydana gelmiştir. Aynı sebepten ötürü, Mars yüzeyinde fosilize olmuş ökaryot bir hücre bulursak, yukarıda bahsettiğimiz “basit hücreden kompleks hücreye geçiş” sıçrayışı için Büyük Filtre olmaya aday olmazdı. Çünkü hem dünyada hem Mars’da meydana geldiği için ve milyarda bir meydana gelen deli manyak bir olay olmadığı için bu kategoriye girmiyor.

Eğer özel ve nadir bir tür isek, tesadüfi bir biyolojik olaydan dolayı olmuş olabilir. Bu durumu inceleyen Rare Earth Hypothesis adı verilen Nadir Dünya Hipotezi diye bir hipotez var. Bu hipotez dünya benzeri şartlara sahip olabilecek gezegenlerin çok az olduğu düşüncesini öne sürer.

2. Filtreyi geçen ilk türüz.

büyük filtre4

Grup 1’daki bilim adamları; eğer Büyük Filtre gerimizde kalmadıysa evrendeki koşullar Büyük Patlama’dan sonra ilk kez akıllı yaşamın gelişmesine izin verecek noktaya ulaştı demektir şeklinde düşünür. Bu durumda biz ve diğer pek çok tür süper-zeka ileri bir yaşama doğru yol alıyor olabiliriz ve bu sıçrayış henüz gerçekleşmedi. İlk süper-akıllı medeniyet olma noktasında doğru zamanda doğru yerde olmuş olabiliriz.

Bu teorinin gerçekleşmesine izin verecek fenomenlerden birisi de uzak galaksilerdeki devasa patlamalardan meydana gelen gama ışınlarının yaygınlığıdır. Nasıl milyonlarca yıl önce meteorlar ve yanardağlar dünya üzerinde yaşamı yok edip yeni bir yaşamın başlamasına sebep oldularsa, aynı şekilde gama ışınları da tekrar yaşamı yok edip yeni bir yaşamı başlatabilir.

3. Filtreyi aşamıyoruz ve yandık..

büyük filtre5

Grup 1’deki düşünürler eğer nadir veya erken bir tür isek Büyük Filtre gelecekte bir yerde bizi bekliyor şeklinde görüş belirtir. Bu şu demek, bulunduğumuz noktada yaşam evrim geçiriyor fakat bir şey bu yaşamın daha ileri gitmesini ve yüksek seviye bir medeniyete ulaşmasını engelliyor.

Gelecekteki muhtemel Büyük Filtre’lerden biri gama ışın yanması olabilir ve dünya üzerindeki yaşamın aniden son bulması göz açıp kapayıncaya kadar meydana gelebilir. Başka bir ihtimal ise bütün ileri seviye akıllı medeniyetlerin belirli bir teknolojik seviyeyi geçtikten sonra kendilerini yok etmeleri de olabilir.

Oxford Üniversitesi felsefecilerinden Nick Bostrom yukarıda sıraladığımız bütün bu ihtimallerin hiçbirinin bizim için iyi olmadığını söyler. Mars yüzeyinde basit bir yaşamın keşfi bile bizim açımızdan çok büyük bir gelişme olur çünkü böylelikle geride bıraktığımız potansiyel Büyük Filtre’lerden birkaçını elemiş oluruz. “Ve eğer Mars yüzerinde yaşama ait bir iz bulabilirsek bu insanlığın görmüş olacağı en kötü haber olur” der Bostrom, çünkü o zaman anlarız ki Büyük Filtre kesinlikle bizim önümüzde bir yerlerde ve aşılamadığından türlerin bir nevi kıyameti hükmünde. Bostrom Fermi paradoksu için ise “Geceleri gökyüzünün sessizliği altındır” der.

Grup 2 Açıklaması: Evrende Tip 2 ve Tip 3 türü ileri seviye medeniyetler var ve onları henüz duymamış ve görmemiş olmamızın mantıklı nedenleri de var.

Grup 2’deki düşünürler insan türünün nadir, özel ve ilk olduğuna dair tüm teorileri çöpe atar ve tam tersine Sıradanlık İlkesi‘ni savunurlar. Sıradanlık İlkesi şunu der; biz özel değiliz, sıradanız, milyarlarca yıldız içerisinde dünya gibi bir yaşamın oluşması gayet sıradan bir olaydır. Galaksimiz, evrenimiz, güneş sistemimiz, gezegenimiz ve ulaşmış olduğumuz medeniyet seviyesinin özel ve nadir olma gibi bir durumu aksi ispat edilinceye kadar yoktur. İleri seviye medeniyetlerin varlığını kabul ederler ve bunu aşağıdaki muhtemel açıklamalarla yaparlar;

İhtimal 1) Süper zeki üstün medeniyetler dünyamızı çoktan ziyaret etmiş olabilirler, fakat muhtemelen o zaman henüz biz yoktuk ya da onları kavrayacak akıl seviyesine ulaşmamıştık. İnsanlık dünya üzerinde yaklaşık 50.000 yıldır var. Dünyanın yaşının 4.5 milyar olduğunu düşündüğümüzde 50 bin yıl neredeyse saniye gibi gelir. İleri seviye yıldızlar arası medeniyetler bizi 50 bin yıldan önceki bir zaman diliminde ziyaret etmiş olabilirler.

İhtimal 2) Galaksimiz zaten çoktan kolonize edildi fakat biz galaksinin çok ıssız ve tenha bir köşesinde yaşamaktayız. Bu da bir ihtimal. Belki de süper üstün medeniyetler galaksiyi çoktan kolonize ettik fakat bizler çok ıssız ve tenha ve ücra bir köşede yaşıyor olabiliriz. Nasıl ki Doğu’da kışın aşırı kardan dolayı yollar kapanır ve dış dünya ile iletişim yaz mevsimine kadar kesilir. Belki bizim dünyamız da galaksinin çok ücra ve uzak bir köyüdür.

İhtimal 3) Bir bölgeyi fiziksel olarak kolonize etmek ileri seviye medeniyetler için belki de çok çağ dışı ve saçma bir konseptir. Belki de Tip 2 kategorisindeki bir medeniyet için galaksinin diğer bölgelerindeki gezegenleri kolonize etmenin bir anlamı ve getirisi yoktur. Kendi enerjileri kendilerine yetiyordur. Başka gezegenlerdeki canlılarla iletişime geçmeye ihtiyaç duymuyorlardır.

Hatta biraz daha ileri gidip şunu söyleyebiliriz; çok ileri seviye medeniyetler belki de tüm fiziksel dünyayı çok ilkel bir yer olarak görüyorlardır, çok uzun zaman önce kendi biyolojilerini keşfetmiş ve beyinlerini sanal bir gerçekliğe yüklemişlerdir. Sanal bir dünyada yaşadıklarından fiziksel dünya onlara çok ilkel geliyor olabilir. Biyolojinin, ölümün, isteklerin, arzuların, hastalıkların ve ihtiyaçların olduğu fiziksel bir dünya onlara çok ilkel geliyor olabilir. Bu tür bir ortamda yaşayan canlılarla iletişime geçmeyi gereksiz buluyor olabilirler.

İhtimal 4) Evrende çok korkunç, yırtıcı medeniyetler var ve ileri seviye akıllı yaşama ulaşmış medeniyetler bu türden korkunç medeniyetlere yerlerini belli etmemek için sinyal göndermiyor ve kimseyle iletişime geçmiyor. Bu ihtimal de korkutucu bir ihtimal ve belki de SETI uydularının herhangi bir sinyal almamasının sebebi budur. Belki bizler de çok acemi bebek statüsündeki bir medeniyetiz ve çok naif bir şekilde içerisinde korkunç medeniyetlerin olduğu evrene sinyaller gönderip yerimizi belli ediyoruz. Hatta bununla ilgili süregelen tartışmalar da vardır. SETI kullanıp başka gezegenlerle iletişime geçmeli miyiz yoksa geçmemeli miyiz şeklinde. Stephen Hawking “uzaylılar bizi ziyaret ederse sonuç Kolombo’nun Amerika’yı keşfettiğinde yerlilere yaptıkları gibi sonuçlar doğurabilir” der. Carl Sagan ise ileri seviye medeniyetlerin iyi ve yardımsever olacaklarını, kötü ve korkunç olmayacaklarını öne sürer fakat buna rağmen yabancı ve belirsiz galaksideki acemi bebeğin yani bizlerin uzun bir zaman sadece dinlemesi gerektiğini ve bu bilinmez ormana doğru sinyaller göndererek bağırmaması gerektiğini söyler.

İhtimal 5) Evrende süper predator yani süper yırtıcı konumunda tek bir medeniyet var ve bu medeniyet diğerlerinin gelişimini engelliyor. Bu ihtimal doğruysa yandık. Kısıtlı kaynaklardan dolayı bir tür süper ileri bir seviyeye ulaştı fakat adeta bir virüs gibi diğer türleri engelliyor ya da yok ediyor. Bu yüzden ilk olarak hedefe varan kazanıyor. Tek kazanan var. Diğerlerinin şansı yok. Bizimle iletişime geçmemelerinin sebebi bu olabilir zira sadece bir tane tür ileri seviyeye ulaştı ve tek başına orada takılıyor.

İhtimal 6) Bizimle iletişime geçmeye çalışan çok fazla medeniyet var ve bize sürekli sinyaller gönderiyorlar fakat bizim teknolojimiz çok ilkel olduğundan onların sinyallerini alamıyoruz ya da yanlış yerleri dinliyoruz. Örneğin modern bir binaya girdiğinizi düşünün. Bu binadan binlerce ofis çalışanı var ve birbirleriyle email aracılığıyla mesajlaşıyorlar. Fakat biz bu binaya girince walkie-talkie kullanarak onlarla iletişime geçmeye çalışıyoruz. Hiçbiri walkie-talkie kullanmadığı için kimseyle iletişime geçemiyoruz.

İhtimal 7) Diğer uzay dışı canlılardan sinyaller alıyoruz fakat hükümetler bunu gizliyor. Bu komplo teorilerini sevenler için ideal. Düşük de olsa böyle bir ihtimal var olduğundan listeye almamız gerekli.

İhtimal 8) Dünya dışı ileri seviye medeniyetler bizim farkımızdalar ve bizi gözlüyorlar. (Hayvanat Bahçesi Teorisi) Bu teoriye göre dünya dışı varlıklar var ve bizi biliyorlar ve hatta bizi hayvanat bahçesini seyrediyor gibi seyrediyorlar. “Bak ama dokunma” kuralı ile bizi izliyorlar. Onları göremiyoruz ama onlar bizden haberdar. Çünkü bizden daha akıllı bir varlık bizi gözlemek isterse bizden habersiz bunu yapmanın da bir yolunu bulacaktır. Belki de onların seviyesine gelinceye kadar düşük seviyedeki varlıklara kendilerini göstermiyorlardır.

İhtimal 9) Dünya dışı ileri medeniyetler içimizde yaşıyorlar fakat biz çok ilkel olduğumuzdan onları göremiyoruz. Bu durum şöyle özetlenir; diyelim ki 100 katlı bir gökdelenin hemen dibinde bir karınca kolonisi yaşıyor. Bu karınca kolonisinin hemen yanı başında bir otoyol geçiyor. Karıncalar bu otoyolun ne olduğunu bilebilir mi? Yanıbaşlarındaki gökdelende ne olup bittiğini idrak edebilirler mi?

Dünya dışı varlıklar bizimle neden iletişime geçmiyor diye sormadan önce belki de şunu kendimize sormamız lazım; Peru’yu ziyarete gittiğinizde oradaki küçük bir karınca kolonisini de gidip ziyaret etme gereği duyuyor musunuz? Hayır. Neden? Çünkü karınca kolonisini ziyaret ederek elde edebileceğiniz hiç bir şey yok. Boşuna zaman kaybı olacaktır. Karınca kolonisi görmek isterseniz youtube açıp belgeselini de izleyebilirsiniz. Belki de bizim durumumuz da bu şekildedir. Koskoca kainattaki küçük bir karınca kolonisiyizdir.

İhtimal 10) Gerçekliğin ne olduğu hakkında tamamen yanılgılar içerisindeyiz. Gerçeklik ile ilgili düşüncelerimizde tamamen yanılıyor olabiliriz. Belki evren sadece bir hologramdır. Belki sadece bir simülasyondur. Belki de bizler buraya deney için yerleştirilmiş sanal varlıklarız.

Fermi paradoksu insanın düşünce sınırlarını zorlayan ilginç paradokslardan biridir. Pek çok bilim adamı bu paradoksa karşı anti-tezler de geliştirmiştir. Fermi paradoksu ile ilgili internet üzerinden çok çeşitli kaynaklara da ulaşabilir ve konu hakkında detaylı bilgi edinebilirsiniz.

Not: Fermi paradoksu ile ilgili bu yazı http://waitbutwhy.com/2014/05/fermi-paradox.html adresinden tercüme edilmiştir.