Sitemap'ın öneminden ve nasıl üreteceğinizden daha önce bahsetmiştim (Dinamik sitemap.xml oluşturmak).

Sitemap.xml dosyanızı oluşturdunuz peki sonra?

Tabiki arama motorları servislerinin botları sitenize geldiğinde ilk olarak sitemap.xml'inizi bulmaya çalışacak, bulduğu zaman da site indeksini hızlıca çıkaracaktır. Fakat botlar sık sık sayfalarınızı gezse de sitemap.xml'inizi her zaman anlık olarak kontrol etmezler.

Arama motorlarının ping servisleri vardır ve bu servisleri kullanarak sitemap.xml'inizin güncellendiğini, hemen kuyruğa alınmasını istediğinizi belirtebilirsiniz. Bu uygulamayı birçok büyük web servisi, wordpress, blogger gibi blog hizmeti veren servisler, hatta kendi sunucunuza kuracağınız wordpress de bunu yapmaktadır.

Yeni bir içerik girildiği zaman sitenize yeni sayfalar eklenmiş, bazı varolan sayfaların da güncellenmiş olması anlamına gelmektedir. Arama motorlarının bu değişiklikleri hemen tarafamasını isterseniz az sonra anlatacağım ufak teknikle bunu yapabilirsiniz.

Ping servisleri

Arama motorlarının birçoğu ping servisini bir URL üstünden sitemap.xml dosyanızın adresini alarak yapar. Aslında bir çeşit kayıt olma işlemidir ama çok daha basit hali. Örneğin google'ın ping servisi
http://www.google.com/webmasters/sitemaps/ping?sitemap=
şeklindedir. Tabiki bu url'in sonuna sitenizin sitemap.xml dosyasının url'ini vererek bu adresi çağırmanız gerekir.

Şimdi kod üzerinde bir dizide popüler arama motorlarının ping servisleri ve yapılarını göreceksiniz. Zaten kodun yaptığı işi hemen anlayabilirsiniz. Basitçe sitemap.xml dosyanızı belirten urlleri "file" fonksiyonu ile almaya çalışıyoruz. Zaten bu url'ler ziyaret edildiği ve cevapları geldiği için bu servisler pinglenmiş olacak.
$services = array(
	'http://www.google.com/webmasters/sitemaps/ping?sitemap=

',

'http://search.yahooapis.com/SiteExplorerService/V1/ping?sitemap=

',

'http://webmaster.live.com/ping.aspx?siteMap=

',

'http://www.bing.com/webmaster/ping.aspx?siteMap=

',

'http://submissions.ask.com/ping?sitemap=

'

); $mysitemapfile = 'http://mysite.com/sitemap.xml'; foreach($services as $service){ $url = str_replace('

', $mysitemapfile, $service);

@file($url); }
Hazırlayan : Mehmet Fatih YILDIZ
Her yerde ajax kullanımından geçilmez oldu. Ajax, hem kolaylıklarından hem de RIA'in (Rich Internet Applications) temeli olduğundan popülerliği gitgide artıyor. Karşımıza her yerde çıkıyor ve artık jquery gibi frameworkler sayesinde ajax çağrıları yapmak için tek satırda 5-10 karakterlik bir javascript kodu bile yeterli oluyor.

Bir php kodunda genelde çıktı verirken normal html etiketleri kullanıp tüm sayfayı tasarlıyoruz fakat genelde bu sayfalar bir verit yapısının görüntüleri (view) oluyor ve aynı çıktıyı javascript ile alıp basmak, hatta bazen ajax ile dışarıya bile vermek gerekebiliyor.

Artık az sonra bahsedeceğim method ile, dosyaları tasarlarken 2 türlü kullanımı için tasarlayacaksınız. Yani hem normal erişim ile hem de o sayfayı ajax ile kullanabilecek şekilde düşüneceksiniz. Burada ajax çağrısı olduğunu yakalamak için genel bir teknik olarak get methodu ile bir değişken gönderip onu izleyebilirsiniz. Mesela kayit.php?ajax=1

Bu, işin ilkel noktası. Ajax çağrısı olup olmadığını yakalamak için artık sunucu ortam değişkenleri arasında $_SERVER[HTTP_X_REQUESTED_WITH] değişkeni ile çağrı türünde değer xmlhttprequest ise yapan client'in kullandığı protokolu alabiliyorsunuz. Genellikle içindeki değer "xmlhttprequest" oluyor zaten. Yani bir çağrının ajax olup olmadığını bu şekilde kolayca kontrol edebilirsiniz.

Ufak şekilde örneklemek gerekirse :
$kisiler = array('Fatih', 'Ahmet', 'Mehmet', 'Zeynep');

// ekrana basalim
print "<ul>";
foreach( $kisiler as $kisi ){
    print "<li>$kisi</li>";
}
print "</ul>";
Bu kodda isimleri liste çıktısı alırsınız. Eğer javascript ile bu veriye erişmek istersek ajax çağrısı ile bu sayfayı çağırabiliriz ama işlenmiş html kodundan o isimleri almak zor olur. Ya da sadece belirli bir kısmını almak isteyebiliriz. Bunun için basitçe :
$kisiler = array('Fatih', 'Ahmet', 'Mehmet', 'Zeynep');

// ajax cagrisi ise json donelim
if( $_SERVER[HTTP_X_REQUESTED_WITH] ){
    die( json_encode($kisiler) );
}

// ekrana basalim
print "<ul>";
foreach( $kisiler as $kisi ){
    print "<li>$kisi</li>";
}
print "</ul>";
Bu kod eğer normal istek yapılırsa
<ul><li>Fatih</li><li>Ahmet</li><li>Mehmet</li><li>Zeynep</li></ul>
çıktısı; ajax ile istek yapıldığı zaman :
["Fatih","Ahmet","Mehmet","Zeynep"]
çıktısı verecektir.

Bu şekilde gelen çağrılardan ajax olanlarına sadece kisiler dizisini jsona çevirip sayfayı durduruyoruz. Javascript ile gelen json'u kolayca işleyebilirsiniz.

Burada json'a çevirip javascriptde işlemek zorunda değilsiniz. Ajax ile aldıktan sonra içeriği basmak istediğiniz yere uygun html kodu da üretebilirsiniz bu noktada.


Hazırlayan : Mehmet Fatih YILDIZ
6 Eylül Pazar ´09   —   9 Yorum

Lifestream da nesi?

Kelime açılımından anlyabileceğiniz birşey ama bilmeyenler için özetliyim. Şu an sağda solda bir sürü web servisinde, hayatınıza dair bilgisayarda yaptığınız herşeyi paylaştığınız servisler var ve bunları kullanıyorsunuzdur illaki. Örneğin :
- last.fm ile müziğinizi,
- delicious ile linklerinizi,
- tumblr, wordpress vs ile yazılarınızı,
- flickr ile fotograflarınızı
...

Bu servislerin neredeyse hepsi RSS ile içeriklerinizi paylaşıyorlar. Bu dökümanda bunun gibi çeşitli servislere ait içerikleri RSS aracılığı ile süzgeçleyip kronolojik bir sıraya sokup sosyal geçmişinizi listelemeye yönelik bir uygulama yazacağım. Nasıl birşey olduğunu merak ediyorsanızhttp://mfyz.org adresinden benim sosyal servislerdeki akışımı görüntüleyebilirsiniz.

Tamamiyle dinamik

Bu işin güzel yanı, hazırladığınız sayfa tamamen organik bir yapıda sürekli sizin farkında olmadan kaydettiğiniz sosyal verilerinizi derleyecektir. Mesela müzik dinlerken beğendiğim bir şarkı veya bookmarklarıma eklediğim bir link bu servislere herhangi bir çabama gerek kalmadan ekleniyor. Bu eklenen içerikler yine hiçbir müdahale olmadan benim lifestream sayfamda görüntüleniyor.

Simple pie

Bunu yapmak için bu sosyal medya servislerindeki rss kaynaklarınızı işleyerek yapacağız. Bunun için php'de simple pie kütüphanesini kullanacağız ve bu kütüphanenin kullanımı ve rss okumak için yardımcı fonksiyon açılımı için önce Simplepie ile rss işlemek (okumak) dökümanını inceleyin.

Simple pie ile rss okuma konusunda bilgi sahibi olduğunuzu varsayarak dökümana devam ediyorum (eğer yoksa öncelikle verdiğim dökümanı uygulayın).

Hazırlık ve Başlangıç

Öncelikle içerik kaynaklarınızı (rss) bir dosyada çıkartın. Bu kaynakları bir dizi şeklinde tanımları tutacağımız dosyaya yazalım. Bunun için config.php diye bir dosyada $feeds adında bir dizi içerisinde kaynak url'i ve adı olarak saklayacağım. Örnek kaynak dizisi şöyle olacaktır :
$feeds = array(
	'zamazing' => array(
		'name'    => 'Zamazing.org',
		'url'     => 'http://www.zamazing.org/rss.xml'
	),
	'sabah' => array(
		'name'    => 'Sabah Teknoloji Haberleri',
		'url'     => 'http://www.sabah.com.tr/rss/teknoloji.xml'
	)
);
Bu şekilde istediğiniz kadar rss kaynağı tanımlayabilirsiniz. Az sonra simplepie kullanarak bu kaynakları okuyacak, kronolojik sıralayıp çıktısı sayfalar halinde oluşturacağız.

Şimdi index.php dosyasında kaynakları okumaya başlayalım.
require_once('config.php');

// libs
require_once('lib/mypie.php');

// getting feed contents
foreach ($feeds as $feedKey => $feed){
	// getting contents
	$results = @readRSS($feed[url]);
	foreach ($results[items] as $item){
		// adding item array to feed type
		$itemArray = $item;
		$itemArray[type] = $feedKey;

		// adding all items
		$allItems[] = $itemArray;
	}
}
Yukarıda config ve mypie dosyalarını include ettik. Config'de rss kaynakları tanımları var, mypie'de ise simplepie kullanarak rss kaynağı okuyan fonksiyonumuz var. Bu fonksiyon hakkında daha detaylı bilgi almak için Simplepie ile rss işlemek (okumak) dökümanını inceleyin.

$feeds dizisini dönerek feed bilgilerini ve anahtar kelimesini alıyoruz. Döngü içinde ise feed url'deki kaynağı okuyoruz. Eğer hata olursa o feed ingore edilip bir sonrakine geçiliyor. Eğer okundu ise $allItems adlı bir diziye okunan veri ekleniyor. Tabi haber eklenirken tür olarak da o feed'in anahtar kelimesi ekleniyor. Bu sayede ekrana basarken, farklı haber kaynakları için farklı çıktı verebileceğiz.

Şimdi elimizde tüm kaynaklardaki tüm haberler $allItems adlı dizide tutulmakta. Bu dizideki veri yapısın daha iyi anlamanız için dizideki ilk elemanı verelim :
Array
(
    [title] => Mario geldi
    [date] => 2009-09-04 17:07:51
    [url] => http://mfyz.tumblr.com/post/179630132
    [description] => Mario geldi (HTML Content)
    [type] => tumblr
)
Gördüğünüz gibi tarih, başlık, url, kaynağı ve içerik olarak basit anahtarlarla ihtiyacımız olan tüm bilgiler mevcut. Şimdi bu diziyi tarihsel sıraya sokalım. Bunun için multi-dimmension dizilerde kolona göre sıralama yapan yardımcı bir fonksiyon kullanacağız.
// sorting all entries
$allItems = @arrayMultiSort($allItems, 'date');
Bu fonksiyonu çağıdrıktan sonra $allItems dizisindeki haberler artık kronolojik sıraya girmiş oldu. Tam istediğimiz kıvama geldi fakat elimizdeki dizide yüzlerce haber olabilir isterseniz bu diziyi belirli bir tarihe kadar kırpabilirsiniz. Mesela son 2 haftaki haberleri listelemek isterseniz $allItems'i dönerek date alanını timestamp'a çevirip 2 haftadan eski haberleri tespit edebilirsiniz. Doğal olarak onları temizleme şansınız da olur.

Ben herhangi bir kırpma işlemi yapmadan tüm haberleri sayfalayarak göstereceğim.
// pagination
$itemCount = count($allItems);
if( $itemCount > $limit ){

	// calculating page count
	$pageCount = ceil( $itemCount / $limit );

	// current page control
	$page = intVal($_GET[page]);
	if( $page < 1 or $page > $pageCount ) $page = 1;

	// paged item array
	$pagedItems = array_slice($allItems, ($page-1) * $limit, $limit);

}else{
	$page       = 1;
	$pageCount  = 1;
	$pagedItems = $allItems;
}
config.php dosyasında $limit adında bir değişkende her sayfada kaç girdi gösterileceğini belirleyin. Bunu bu sayfa içinde de yapabilirsiniz ama config.php'de tüm tanımların durması daha mantıklı olacaktır. Yukarıda bilinen sayfalama algoritması kullanarak sayfa sayısı ve şu anki sayfa hesabı yapılıyor. array_slice ile de o sayfada gösterilecek haberler $pagedItems dizisine parçalanıyor. Artık sayfada :
- $page,
- $pageCount,
- $pagedItems
değişkenlerini kullanarak sayfalamayı ve haber içeriklerini basabiliriz. Gerekli basit html yapısını da kullanarak haberleri ekrana basacak html kodu da şöyle olacak (yani index.php dosyasının devamı)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
	<title>Teknolojik Organizma</title>
	<link rel="stylesheet" type="text/css" media="screen" href="style.css" />
</head>
<body>
	<div class="container">
		<h1 class="head"><a href="./"><b>Teknolojik Organizma</b></a></h1>
		Kendi Kendine Yaşayan, Büyüyen Derlemasyon Blog-umsu
		<br><br>
		<div id="stream">
			<?php

			foreach ($pagedItems as $item){
				// item's feed-service info
				$feedinfo = $feeds[ $item[type] ];

				// content
				$content = $item[description];

				// adding to content
				print '
				<div class="item '. $display .' '. $item[type] .'">
					<h3 class="title"><a class="permalink" href="'. $item[url] .'" target="_blank">'. $item[title] .'</a> '. ($item[date] ? '<span class="time">('. substr($item[date], 0, 16) .')</span>':'') .'</h3>
					'. ($content ? '<div class="content-text">'. $content .'</div>':'') .'
				</div>
				';
			}

			?>
		</div>
		<div class="clear"></div>
		<div class="pagination">
			<br clear="all">
			<?php

			if( $pageCount > 1 ){
				print 'Sayfa : ';
				for ($i=1; $i <= $pageCount; $i++){ 
					print '<a href="?page='.$i.'"'. ($i==$page ? ' class="current"':'') .'>'.$i.'</a> ';
				}
			}

			?>
		</div>
	</div>
</body>
</html>
Bu dökümanda anlatılan kod, proje olarakhttp://projects.mfyz.com/lifestream/ adresinde Lifestream olarak bulunabilir. Buradaki kodun çıktısını merak ediyorsanız :http://projects.mfyz.com/lifestream/demo/ adresinde biraz şekillendirilmiş şekilde bulabilirsiniz.

Bu kodu biraz daha özelleştirerekhttp://mfyz.org'daki gibi bir lifestream elde edebilirsiniz.


Hazırlayan : Mehmet Fatih YILDIZ

Nerede kullanacağız?

Rss şu anda nerdeyse veri kaynağı oluşturma/kullanma konusunda standartlaşmaya başladı. Artık her sitede, başka sitelerden alınana içerikleri görebiliyorsunuz. Bunun en büyük nedeni, her sitenin (aslında hazır bloglardaki rss kaynakları sayesinde) bir rss kaynağı var ve verilen bilgileri bu kanallarla belirli standartlarda internette yayıyoruz. Bu kaynakları alıp/derleyip çeşitli alanlarda kullanabilirsiniz. Bu konuda hayal gücünüze ne geliyorsa uygulamak mümkün.

Bu dökümanda kısaca bir rss kaynağını php ile yazılmış simple pie kütüphanesi ile basitçe nasıl diziye çevirebileceğimizi, geçici olarak belleğe alabileceğinizi (cache) göstereceğim.

Bu konu ile ilgili Türkçe kaynak var aslında, bu yazıyı yazarak aynı şeylerden bahsetmek pek içimden gelmiyor fakat mfyz.com'daki diğer dökümanlarda sık sık rss işleme ile ilgili konulardan bahsedeceğim için bu dökümanı iç bir kaynak olarak özet de olsa yazmak zorundayım. Olabildiğince farklı bir açıdan ele almaya çalışacağım.

Simple Pie Nedir?

Php ile yazılmış bir xml parser sınıfıdır. Spesifik olarak da RSS tipi xml dosyalarını okumak için tasarlanmış, cache gibi güzellikleri bulunan bir sınıftır. Bu sınıfı kullanarak bir rss dosyasını nasıl parse edeceğimizi basitçe göstereceğim.

Öncelikle sitesinden simplepie kütüphanesini indirin.
http://simplepie.org/ adresinden download bölümünde son sürüme ait indirme bağlantısı bulabilirsiniz.

İndirdiğiniz paket içerisinde demo bir uygulama, dökümantasyon ve api test dosyaları bulacaksınız. Bizim burada kullanacağımız aslında tek dosya simplepie.inc dosyasıdır.
Bu dosyanın uzantısını .php olarak kullanmanızı tavsiye ederim (simplepie.inc.php).

Simplepie otomatik olarak okuduğu feedleri 1 saatlik belleklemektedir. Bunu kaldırabilirsiniz fakat 1 saatlik belleğe almak oldukça iyi bir performans kazandıracaktır. Bu noktada uygulama dizininizde "cache" adında bir dizin oluşturup yazma haklarını ayarlamanız gerekmektedir (755 veya 777).

Basitçe kullanımı

Bir örnek uygulama ile anlatacağım. İnidirdiğiniz simplepie paketi içindeki simplepie.inc dosyasını uygulamanızın içine koyun. index.php içerisinde include ederek kullanacağız. Cache dizinini de oluşturup izinlerini ayarlayın.

Örnek olarak bir uygulama yapsak da ben burada yardımcı bir fonksiyon kullanacağım. Bu fonksiyon ile basitçe url'sini verdiğimiz feed'i geniş bir dizi olarak döndürecek.
<?php

// simple pie
require_once('simplepie.inc');

// feed to array
function readRSS($params){
	if( !is_array($params) ) $url = $params;
	if( !$url ) return false;

	// getting feed
	$feed = new SimplePie($url);
	$feed->handle_content_type();

	// params
	if($params[expire]) $feed->set_cache_duration($params[expire]);

	// feed info
	$result[feed][title]       = $feed->get_title();
	$result[feed][url]         = $feed->get_permalink();
	$result[feed][description] = $feed->get_description();

	// items
	$i = 1;
	foreach ($feed->get_items() as $item){
		$items[] = array(
			'title'       => $item->get_title(),
			'date'        => $item->get_date('Y-m-d H:i:s'),
			'url'         => $item->get_permalink(),
			'description' => $item->get_description(),
		);
		$i++;
		if( $size and $i > $size ) break;
	}

	// adding items to result
	$result[items] = $items;

	// result
	return $result;
}

?>
Koddan simplepie kullanımını özetleyeceğim.

readRSS fonksiyonunun parametreleri :
- url
- expire

Bu parametreleri dizi olarak vermelisiniz. Ya da doğrudan tek parametre ile string verirseniz sadece url parametresi ayarlanacaktır.

expire, bellekte ne kadar sürede çürüyeceğini ifade eder. Oraya 300 saniye olarak belirtirseniz kullanıcılar sürekli sayfanızı derlese bile 5 dakikada (300sn) bir rss kaynağı okunacaktır. Bu süreyi belirtmezseniz 1 saat olarak ayarlanacaktır.

Neyse, şimdi sırayla simplepie kullanarak bir rss feed'i nasıl parse ettiğimi anlatayım :
$feed = new SimplePie($url);
ile yeni bir nesne oluşturup feed adresini ayarlıyoruz.
$feed->handle_content_type();
ile de rss kaynağını alıp okuma işlemini yapıyoruz.
$feed->set_cache_duration(3600); // 1 saat = 3600 saniye
ile de method adından anlayacağınız gibi bellek süresini belirtebiliyoruz. Belirtmezsek 1 saat olarak ayarlanacaktır.
Bu sayede bu rss kaynağı sürekli okunmak yerine internetten saate 1 kere alınıp işlenip belleklenecektir.

Ben her fonksiyonda genel olarak sonuç dizisi oluşturur ve onu dönerim. Burada bir feed için :
- feed'e ait meta data
- feed içindeki konulara ait bir multiarray
söz konusudur.

Bunun için sonuç dizimi "feed" ve "items" olarak 2 alt diziye ayırıyorum ve "feed" dizisine o rss kaynağı için xml içinde belirtilen feed adı, adresi, açıklamasını kaydediyorum. Bunu da sırayla :
$feed->get_title();       // feed başlığı/adı
$feed->get_permalink();   // feed ana içerik bağlantısı
$feed->get_description(); // kaynak açıklaması
methodları ile alabiliyoruz. Bu konuda daha derin açıklama yazmaya gerek yok.

feed içindeki konuları da $feed->get_items() methodu ile aslında dizi olarak alabiliyoruz.
Ben de bu diziyi foreach ile dönerek içindeki nesnelerin alt methodlarını kullanarak her konu için gerekli bilgileri alıp sonuç dizisine "items" alt dizisi içine ekliyorum.
Bu foreach içinde bazı methodlarla sıradaki konuya ait bilgileri alıyorum. Bu methodlar :
$item->get_title();              // konu başlığı

$item->get_date('Y-m-d H:i:s') ; // konunun tarihi, burada php'nin date
                                    // parametreleri ile istediğiniz
                                    // formatta alabilirsiniz.

$item->get_permalink();          // konuya ait bağlantı

$item->get_description();        // konu açıklaması
                                    // hatta bu kısım genelde html olarak
                                    // konu içeriğini ifade eder.
Bu methodlarla konu içeriklerini alıp sonuç dizisine yazıyorum.

Fonksiyon sonunda da sonuç dizisini dönüyorum.

Bu fonksiyonun kullanımı için bir örnek vermek gerekirse :
print_r( readRSS('http://mfyz.tumblr.com/rss') );
Çıktısı şöyle olacaktır :
Array
(
    [feed] => Array
        (
            [title] => mfyznin sosyal akışı
            [url] => http://mfyz.tumblr.com/
            [description] => Bu günlük özellikle, izlediğim filmler...
        )

    [items] => Array
        (
            [0] => Array
                (
                    [title] => Daha yavaşı varsa gelsin…
                    [date] => 2009-07-29 18:43:23
                    [url] => http://mfyz.tumblr.com/post/151632394
                    [description] => <img src="http://17.media.tumblr.com/3YGTMGQuLqhrtmy6gdzjebuNo1_500.png" /><br/><br/>Daha yavaşı varsa gelsin…
                )

            [1] => Array
                (
                    [title] => Photo
                    [date] => 2009-07-21 11:48:00
                    [url] => http://mfyz.tumblr.com/post/145949772
                    [description] => <img src="http://23.media.tumblr.com/3YGTMGQuLq5xgnk8LjdWyEcxo1_500.jpg" />
                )

            [2] => Array
                (
                    [title] => Photo
                    [date] => 2009-07-19 19:54:48
                    [url] => http://mfyz.tumblr.com/post/144797738
                    [description] => <img src="http://4.media.tumblr.com/3YGTMGQuLq3jz02mZYNk5E5Eo1_500.jpg" />
                )
        )
)
Bu noktadan sonra bu diziyi ekrana basma konusunda gerisi sizin hayal gücünüze kalmış.
Bununla ilgili örnek uygulama için benim sosyal medya akışımı (lifestream) inceleyebilirsiniz :http://mfyz.org

İşin görsel kısmını da başka bir dökümanda özetleyeceğim.

Hazırlayan : Mehmet Fatih YILDIZ

Popüler Etiketler

ui ux login css3 webkit form google search api ajax jquery iphone job apple ipad pear mdb2 db database mysql mssql pgsql laptop notebook doritos kampanya tytz wanda wordpress blog cms generator windows örnek kod htaccess url gimp howto nasıl regex php date sql diff sitemap seo cache pharma hack html html5 javascript input mobile open source lisans optimizasyon table facebook social media share meta xhtml css digital service iOS tool prepare execute twitter istatistik sosyal medya statistics insanlar graph startups web app app music js portfolio chart osx applications free cookie subdomain optimization grafik ipucu rss parse xml kontrol yapıları if while icon ikon download export macosx language injection ios development framework bootstrap ie browser calendar browsers auth lifestream mfyz proje ruffles oyun screen konsol terminal widget kitap design integration network app store store in-app purchase purchase verification storekit itunes connect itunes server player license apache route router mod_rewrite analyse procedure less code session style imza signature mail tebrik compile nedir textarea newsletter tarih zaman phpstorm jetbrains ide editor http mootools xmlhttprequest ubuntu workspace internet explorer firefox logo www redirect crossdomain link compiler linux on-the-fly dokuman ingilizce svn subversion git version control deployment spam plugin coding wireless assets radio support banner kurulum developer subscription fstab ntfs icons box query internet select button switch opengraph fql object connect