6 Mart 2012 Salı

Orjinaller heryerde

Selam,

Son günlerde işlerin vermiş olduğu yoğunluk ve evdeki internet problemim nedeniyle pek aktif olamıyorum. Bu aktif olamayışımın getirdikleri bir takım şeyler var. Ne gibi mesela ? Kendime en yakın gördüğüm arkadaşlarımdan hadi isimde vereyim böyle kuru kuru yazmak olmaz NoSleep (rootarea) çıkarları için arkadaşlık kurduğunu anladım. Ne gibi çıkarlar? yok o siteyi heykırlamadın, yok bu sitede sql injection var neden bakmadın, xss buldum sniffer kursana gibi muhabbetlerine cevap veremediğimden dolayı hem telefon rehberinden, hemde rootarea'da ki forumdan siktir edilmiş üye rütbesine atılmışım. Telefondan silmesi, forumda öyle saçma sapan çocukça rütbeler vermesi zerre kadar önemli değil. Zaten bunları takıcak bir insanda değilim. Zoruma giden tek şey, sırf çalışıp dediği isteklere cevap veremediğimden dolayı bunu bana sormadan kendi kendine tripler atması, senaryolar üretmesi. Ulan, senle ne anılarımız oldu? aynı sofradan yemek yedik bunların alayını hiçe mi sayıyosun? Sene olmuş 2012, yaş ilerliyor sen hala yok o siteye index atalım, bu siteye index atalım kafasını nasıl yaşıyosun anlamış değilim. Yaşım senden oldukça ufak. Bu kafayı bulduğun madde nedir? bunuda söyle bizde kullanalım. Gerçekten zerre kadar heyecanlandırmıyor beni o olaylar. Onca senenin ardından, bu gerçek yüzünü gösterdiğin için kutluyorum seni.

Sırf forumda benim id'me yazmış olduğun Siktir edilmiş üye yazısından dolayı bu cümleleri yazma gereği duyuyorum; Tamam gerçekleri saklamayalım, konuşalım ve benden de bir iki kelam olsun; Birşey bilmeyip, bir iki hazır programla sql injection kastığını sanan ve kendini bulunmaz hint kumaşı gören arkadaşım, gerçekler her daim acıdır. Hazır trojan keyloggerlar ile log kasıp kendi egonu tatmin eden arkadaşım; senin forumunda takılmamayışımın iki sebebi var; 1 lame tayfadan uzak kalmak (bunu forumdaki konuları okuyunca çok iyi anlarsın), 2 işlerimden dolayı pek aktif olamamam. Umarım anlatabilmişimdir; İt ürür kervan yürür hesabı benimki..

Kal sağlıcakla..

20 Şubat 2012 Pazartesi

PHP'de CSRF'yi önlemek

Selamlar,

Csrf ataklarına karşı güvenlik kodu ekleyebilirsiniz. Captcha işlemi için bir makale yazmıştım. Buradan ulaşabilirsiniz. Bunun haricinde, captcha kullanmadan'da bir takım işlemler yapabilirsiniz csrf ataklarına karşı.

Aşağıda csrf'yi önlemek için ufak bir örnek paylaştım. PHP ile haşır neşir olan herkes anlayacaktır çalışma mantığını.

Örnek
Bir tane html form var. Ve bu form sayesinde girilen email adresine mail gönderiyoruz. Mail gönderme işlemi secure_csrf.php?success=true şeklinde gerçekleşmekte. Yani bu url'ye direkt olarak girildiğinde mail gönderme işlemi gerçekleşiyor. Biz saldırganların bu tarz url'lere izinsiz erişme olasılığını göz önünde bulundurarak bir güvenlik kontrolü yazacağız.

Mail gönderme işlemini secure_csrf.php?success=true&secure_id={güvenlik_kodu} secure_id parametresi üzerinden yapmamız gerekiyor. Bu secure_id'yi aşağıda bulunan secure_id_generate() fonksiyonu ile rasgele bir key üretip base_64 olarak session'da tutuyoruz.

Formu submit ettiğinizde, secure_csrf.php?success=true&secure_id={güvenlik_kodu} buraya gidiyor ve mail gönderme işleminin hemen üstünde secure_id_control() fonksiyonu ile gelen güvenlik kodunun doğruluğunu kontrol ediyoruz. Eğer gelen kod, session'da ki kodla eşleşirse mail gönderme işlemi gerçekleşiyor ve güvenlik session'u tekrar unset ediliyor. Bu url'ye direkt erişim olursa, sistem izin vermiyor.

-------[secure_csrf.php source]-------
<?php
// coded by Gökhan Kaya
// artiktek.blogspot.com
session_start();

/**
 * Güvenlik keyi üretir
 */
function secure_id_generate(){
 $secure_id = base64_encode(uniqid());
 $_SESSION['secure_id'] = $secure_id;
 return $secure_id;
}

/**
 * Güvenlik keyini kontrol eder.
 */
function secure_id_control(){
 if (!isset($_GET['secure_id']) || $_GET['secure_id'] != @$_SESSION['secure_id']){
  echo 'error.';
  exit;
 }
 unset($_SESSION['secure_id']);
}

/* ----------------------------------------------------- */


switch($_GET['success']){
 
 /**
  * Controller tarafı
  */
 case 'true':
 
  secure_id_control();
  // mail gönderme işlemi (varsayıyoruz)
  echo @htmlspecialchars($_POST['email']) . ' success';

  break;
  
 
 /**
  * View tarafı
  */
 default:
  
  $form = '<form method="post" action="secure_csrf.php?success=true&secure_id='.secure_id_generate().'"><input type="text" name="email" /><input type="submit" value="Register" /></form>';
  echo $form;
  
  break;
 
}

?>

17 Şubat 2012 Cuma

Mark Zuckerberg gibiler neden Türkiye’de yaşayamaz?

Facebook halka açılmak üzere. Tahminler doğruysa, şirket 100 milyar dolarlık bir değere, Facebook’un kurucusu, Mark Zuckerberg de 27 yaşında 27 milyar dolarlık bir kişisel servete sahip olacak. Facebook, bizim topraklarımızın yaratabildiği en değerli şirket olan Tüpraş’tan nerdeyse on kat daha değerli, Mark da tek başına, ülkemizin en zengin ailesinin toplamından, tek başına üç kat daha zengin.
Mark Zuckerberg 1984’de New York’ta değil de, İstanbul’da doğmuş olsaydı ve bu topraklarda yaşasaydı bugün ne yapıyor olurdu? Aynı zekâ, aynı beden, tek farkı Türk olması, Türkiye’de yaşaması. Sizce sonuç ne olurdu? Bence en yüksek beş ihtimal şöyle:
  1. Facebook klonu (çakması) bir iş modelini Türkiye’de pazarlayıp, 10-15 milyon dolarlık bir servetle Türkiye’nin en parlak internet girişimcileri arasına girebilirdi.
  2. Eğer varlıklı bir aileden geliyor ve bağlantıları da kuvvetliyse, Fenerbahçe’ye yönetici olabilirdi.
  3. Üniversite okumak için ABD’ye gider, orada girişimcilik adına bir şeyler yapar, ama nihayetinde Milli Eğitim Bakanlığı tornasından çıktığı için bir noktaya kadar başarılı olabilirdi.
  4. Üniversite sınavına hazırlanıp, Türkiye’de üniversitelerden birinde bilgisayar mühendisliği okuyup, teknoparklardaki yazılım şirketlerinden birinin parlak çalışanlarından biri olabilirdi.
  5. ÖSS’ye hazırlanırken motorunu yakıp, vasat bir kariyer ve vasat bir hayat sahibi olabilirdi.
İhtimaller elbette sınırsız. Ama kesin olan şu: Mark Zuckerberg Türkiye’de yaşasaydı bu ölçekte bir girişimcilik ve yenilikçilik hikayesine imza atamazdı. Eğer buna katılmıyorsanız, bizim ülkemizde, tamamen kendi tırnaklarıyla, 20’li yaşlarında milyar dolarlık değer yaratan bir başarı hikayesi bulmaya çalışın.
Peki neden bizim topraklarımız bir Mark Zuckerberg çıkaramıyor? Bunun nedeni girişimcilik ve yenilikçilik eko-sistemimizin eksikleriyle açıklanabilir. Sorun insanlarımızda değil, insanlarımızın içinde yaşadıkları sistemde. Facebook’un hikayesine bakarak, bizde olmayanı veya defolu olanı üç başlık altında özetleyebiliriz:
  1. Yetenek ve beceriler. Mark Zuckerberg, bir yandan bilgisayar mühendisliği okurken, bir yandan da psikoloji alanında derinleşebilmesini sağlayan bir eğitim aldı. Facebook da aslında bu iki disiplinin kesişebilmesiyle çıktı. Dünyadaki birçok yenilik de farklı disiplinlerin bir araya gelmesiyle ortaya çıkıyor. Bizim sistemimiz ise farklı insanları ne kadar bir araya getirebiliyor, böyle yetenekleri ne kadar ortaya çıkarabiliyor emin değilim. Hadi çıkardı diyelim. Daha sonra, parlak bir fikir, şirketleşme aşamasına girdiği zaman, onu taşıyabilecek insan kaynağını, dünyadaki gelişmeleri takip eden, araştırma – geliştirme yapabilecek gençleri ne düzeyde yetiştiriyoruz? Bunları yapabilmek için en temel ön koşul olan İngilizce’yi ne kadar öğretebiliyoruz?
  2. Finansmana erişim ve lokasyon. Zuckerberg, Harvard’da fikri pişirdikten sonra, stratejik bir karar verip okulunu bıraktı ve şirketini büyütebileceği Silikon Vadisi’ne taşındı. Burada hem finansman kaynaklarına hem de şirketinin sağlıklı büyümesini sağlayacak stratejik ortaklara, bağlantılara ve de insan kaynağına ulaştı. Bizim topraklarımızda ise böyle bir mekân henüz oluşmadı. İstanbul, girişim sermayesi açısından son zamanlarda zenginleşse de, Silikon Vadisi’nin imkânlarına ve derinliğine ulaşabilir mi emin değilim. Belki İzmir coğrafi imkânları açısından bu gibi girişimlere daya uygun bir lokasyon olurdu ama maalesef Türkiye yıllardır İzmir’in yenilikçi kapasitesini arttırmak için hiçbir yatırım yapmadı. Ankara’nın teknokentleri fena değil ama kaldırımları olmadığı için parlak gençleri ne kadar çekebilir bilmiyorum.
  3. Kurumsal altyapı ve yasal çerçeve. Zuckerberg’in sahip olduğuna benzer bir kurumsal altyapının Türkiye’de olmaması da büyük eksiklik. Fikri mülkiyet haklarından, uyuşmazlık çözüm mekanizmalarına ve mahkemelerin kapasitesine/kalitesine kadar pek çok şeyin eksikliğinden bahsedilebilir. Örneğin, Facebook’un kuruluş aşamasında, Zuckerberg önemli bir ihtilaf ile karşı karşıya kaldı, hatta büyük ölçüde doğru olan, fikir hırsızlığı ile suçlandı. Ancak bu ihtilafı çözebilecek, karşı tarafla (Winklevoss Kardeşler) uzlaşabilmesini sağlayacak bir kurumsal altyapı içinde şirketini büyütebildi. Bizde ise böyle bir durumda akıbeti ne olurdu tam kestiremiyorum. En iyi ihtimalle yaşamına “Topal Mark” olarak devam ederdi.
Sonuç yerine ise, izninizle birkaç soruyla bitireyim, yoksa içimde kalacak. Ekosistemimizdeki çarpıklıkları anlamak için belki bu sorulardan başlayabiliriz: Neden bizim ülkemizde en başarılı internet girişimcilik hikâyelerinde, yeni bir fikir göremiyoruz da, sadece ve sadece yurtdışında başarılı olmuş iş modellerinin Türkiye’ye uyarlanmasını (klonlaştırılmasını veya lokalize edilmesini) görüyoruz? Bu sadece internet âlemine de mahsus değil. Neden Türkiye’nin en başarılı televizyon yapımcıları yeni bir fikir geliştirmek yerine,  sadece yurtdışında başarılı olan formatları Türkiye’ye getirerek para kazanıyorlar?  Neden Türkiye’nin en orijinal televizyon programları sadece Flash TV’de yayınlanıyor? Neden Fenerbahçe altyapısı yıllardır Alex gibi bir yıldız yetiştiremedi?
Kısacası, Ankara’nın ekolojik sisteminde nasıl kaplanlar ve zebralar yaşayamıyor ancak kediler ve keçiler yaşayabiliyorsa, ülkemizin girişimcilik ve yenilikçilik eko-sisteminde de Mark Zuckerberg, Steve Jobs, Bill Gates gibiler yaşayamıyor. Ekolojimizi değiştiremeyiz ama ekonomik yapımızı değiştirebiliriz.
Gelecekte bu topraklarda nasıl nesiller olacak bilemiyorum ama ekonomik hedeflerimize ulaşmak açısından biraz da yenilikçi nesiller yetiştirmeye çabalasak ve uygun ortamı yaratsak hiç fena olmazdı.

Kaynak; http://www.tepav.org.tr/tr/kose-yazisi-tepav/s/3016

12 Şubat 2012 Pazar

Kişisel gelişim

Selamlar,

Son 1 haftadır blogumla ilgilenemiyordum. Ofiste yoğunluk var biraz. Ofis zamanlarımın dışında kişisel bir sosyal medya projesi geliştiriyorum. Amacım tamamen yeni birşeyler üretmek ve Türkiye'de pek kullanılmayan yeni nesil teknolojileri bu projemde olabildiğince kullanmak ve öğrenmek olabilir. Projemi biraz daha özetlemek gerekirse, site.com/kullaniciadi şeklinde profil sayfanızı oluşturuyorsunuz. Bu profilinize sizi takip eden kişiler paylaşım yapıyor. Tabi bu paylaşımlar, duvara yazı yazma resim gönderme gibi facebook, twitter yada friendfeed'de olduğu gibi değil. Duvar olayına bambaşka bir boyut katmayı planlıyorum. Aklımda sağlam bir fikir var. Eğer gerçekleştirebilirsem, projeyi İngilizce ve Türkçe olarak yayına açmayı planlıyorum.

Projemde, asenkron işler için Tornado (Python) kullanmaktayım. Localde yaptığım tornado testlerim oldukça başarılı. Python sayesinde, gerçek zamanlı güncelleme işlemleri ile projeye esneklik katacağım. Diğer işleri ise PHP ile çok rahat bir biçimde hallediyorum.. Şuanda projemin %10'luk bölümünü tamamladım. Birazcık HTML5 ve CSS3 kodları arayüzümde denemeye başladım. Logo ve kullanıcı resimleri dışında hiç görsel kullanmayacağım. Bu şekilde CSS3 ile basit bir görünüm elde etmeyi düşünüyorum. Site daha şık gözükecektir.

Projeyi %90 seviyesine çıkarınca önce private beta yayınına açacağım. Eşe dosta dağıttıktan sonra, algoritmamda bugların çıkmadığı sürece, public beta yayınına açmayı planlıyorum.

Projenin beta sürümünün çıkması, tahminim 8-9 ayı bulacaktır. Çünkü sistemle hergün ilgilenemiyorum. Sadece akşam ve haftasonları ilgileniyorum. Ana hedefim en geç 1 sene içerisinde marka olacak bir isim ürettikten sonra siteyi yayına açmak. Tüm işleri tek başıma yürüttüğüm için süre uzayadabilir.

%10'luk çalışmada neler yaptım diye soracak olursanız;
- PHP'de ufak bir framework hazırladım. Bu framework ile PHP ile HTML kodlarını birbirinden ayırdım. Ufak bir render kodladım.
- Resimleri kontrol edebilmem için static.php isminde bir kütüphane geliştirdim. Bu kütüphane sayesinde, kullanıcıların yüklediği profil resimleri olsun yada herhangi bir image dosyası olsun istediğim gibi boyutlar vererek orantılı yada orantısız resim boyutlandırma işlemi yapabiliyorum. Facebook'un burdan görebileceğiniz safe_image.php dosyasından etkilendim. Bire bir benzedi sayılır, tek eksiğim cache işlemi. Oda kolay biran önce halledebilirim. Ayrıca static.php dosyam ile, formlarda kullandığım captcha image'larını üretebiliyorum. Benim için faydalı bir kütüphane oldu. Yeni fonksiyonlar ekledikten sonra tüm işlerimde kullanabilirim diye düşünüyorum.
- Temel üyelik işlemlerini hallettim. Üye ol giriş yap, istediğin profil sayfasına bak vb.
- Gizlilik işlemleri için ayar sayfası yaptım. İsteyen kişi profilini tamamen takipçileri dışındaki insanlara kapatabilecek.
- .htaccess dosyasını hazırladım, sef url'li bir sistem olacak. site.com/kullaniciadi gibi profil sayfalarını görüntüleyecek, site.com/p/signup gibi sistem sayfalarına erişebileceksiniz.
- Olabildiğince heryerde ajax kullanıyorum. Json çıktıları parse edip içerikler üretiyorum. Facebook'un yaptığı gibi.
- Anasayfa sayfada, giriş ve üyelik formu birde online üyelerin ufak thumbnail görselleri var onları tamamladım. Bunun haricinde, duvara paylaşılan özel şeyin, canlı yayın akışı şeklinde sunmayı planlıyorum anasayfadan.

Araştırmakta olduğum konular;
- Follow olayları twitter'daki gibi. Fakat auto followlara karşı özel token'ler üretmem lazım. Güvenlik açısından bunun algoritmasını çıkarmak için uğraşıyorum. Csrf ataklarını önlediğimiz gibi değilde farklı bir algoritma düşünüyorum. Tamamen safe bir platform olmak zorunda. Bunun için baya bir efor sarfetmem gerekiyor.
- Api sistemi yapmayı düşünüyorum. İsteyen herkes, istediği yerde canlı yayın akışı hizmetimizi kullanabilecek. Soapları araştırıyorum bu yüzden. Siteyi yayına açtıktan sonra geliştirebilirim bunu. Şimdilik fazla detaylara inip kafamı bulandırmamam gerekiyor.
- Tornado'ya alternatif olarak node.js'de kullanabilirim. Bu yüzden node.js'i de öğrenmeye çalışıyorum.

Yapılacak ve öğrenilecek bir sürü yeni şey var. Bu yüzden heyecanlıyım. İnançlıyım ve projenin tutup tutmaması beni ilgilendirmiyor. Sadece, tecrübe ve deneyim..

4 Şubat 2012 Cumartesi

Comet ve Long-polling ile Gerçek Zamanlı İşlemler

Facebook yada friendfeed'in gerçek zamanlı güncellemeleri nasıl yaptığı hep merak konusu olmuştur. 2 hafta öncesine kadar bende hep merak ediyordum. Geceleri pek uyumadım, araştırdım araştırdım ve nihayet kafamda ki soru işaretleri ortadan kalkmaya başladı. Çok karmaşıktır, hiç girmeyelim vs. dediğimiz olaylar aslında mantıken çok basitmiş. Bu işin hakkını veren sevgili Ozan'ın katkılarıyla baya bi bilgi sahibi oldum.

Facebook'un gerçek zamanlı bildirimleri nasıl çalışıyor derseniz, altyapı olarak python ile yazılmış muazzam web server tornado'yu kullanıyor. Tornado'yu friendfeed'in geliştiricileri gerçek zamanlı güncellemeler için geliştirmişlerdi. Facebook'un friendfeed'i satın almasıyla bu web sunucusunu opensource dünyasına katmış oldular.

Konuyu bölmek istemiyorum fakat, bir bilgi vermek isterim. Python web konusunda oldukça başarılı değil. Yani php'ye nazaran. Bu yüzden php'yi tamamen bırakıp python'a geçme niyetini bir kenara bıraktım. Python ile, projenizde kullanacağınız ve php ile yapılmayacak işlemleri gerçekleştirebilirsiniz.

Şöyle bir örnek vereyim;
PHP ile hazırlamış olduğunuz bir web projeniz var. Gerçek zamanlı güncelleme (Comet, polling, long polling) işlemleri php'de biraz sıkıntılı. O yüzden tornado ile ufak bir uygulama yazıp servis olarak php projenizde kullanabilirsiniz. Peki php ile python birlikte nasıl çalışacak derseniz, bu konuda araya nginx web server giriyor. Apache'nizin portunu 8080 yapın ve php'leriniz bu port üzerinden çalışsın. Tornado web server'in portunu 8888 olarak ayarlayın, gerçi port numaralarına fazla takılmayın istediğiniz portu tanımlayabilirsiniz. Daha sonra Nginx web sunucusunun portunu 80 olarak ayarlayın. (default 80 geliyor ). Proxy_pass ile http://localhost'a gelen istekleri apache'nize yönlendirin, bir dizin belirleyin http://localhost/tornado gibi ve oraya gelen istekleride tornado portuna yönlendirin aynı şekilde proxy_pass ile. Projeniz php ile açılır ve long polling işlemlerini tornado'nun aktif olduğu url'ye ajax ile istek gönderebilirsiniz. İsteklere cevap olarak json çıktılar üretip php üzerinden parse edersiniz. Yada, iki sunucuyu (apache ve tornado) birbiriyle etkileşimli bir şekilde kullandırabilirsiniz. Sunucunun kasmaması bakımından. Tornado web sunucusu, en iyi nginx server'da çalışıyor (http://developers.facebook.com/blog/post/301/).

Yukarıda ki örnekte olduğu gibi, php ile nasıl python'un yaptığı işleri yapamıyorsanız, php'ninde yaptığı işleri pythonla yapamazsınız. O yüzden ikilem arasında kalıp, bu dili tamamen bırakmalıyım demeyin. Bi ara bende tamamen python'a geçmeyi düşünüyordum. Programlama dilleri konusunda h4ckinger'in yazmış olduğu makalenin ilk 3 paragrafını okuyabilirsiniz.

Neden Comet?
Web sayfaları, ziyaretçi bir istekte bulunduğunda görüntülenir. Ziyaretçinin her bir isteğinde web tarayıcıları http bağlantı başlatır ve istekte bulunulan verinin görüntülenmesi sonucunda bu bağlantıyı sonlandırır. Bu işlemin tek dezavantajı, güncellenen içeriğin ziyaretçinin isteğine göre ekrana getirilmesidir. Yani içerik güncellendiyse, sayfa refresh edilmediği takdirde eski içerik görüntülenecektir sayfada.

Ajax teknolojisi ile bu dezavantajı, ajax kullanarak aşabiliyoruz. Her saniyede bir asenkronize arkaplan veri transferleri kullandığımızda, güncellenen içeriği sayfayı yenilemeden sayfamızda gösterebiliriz. İşte bu işleme polling deniliyor. Bu işlemde, her saniyede sunucuya arkaplanda bir istek gönderdiğimizden apache'nin kullandığı ram miktarı biranda fırlayabilir. Dahası, siteye 100 kişinin bağlanması durumunda  serverı elinize alabilirsiniz.

Ajax'ın gönderdiği istekleri karşılayan yerde push teknolojisini kullanarak isteklere hemen cevap vermeyebilirsiniz. Yani, isteklere uzun yoklamalar yaptırılacak. Daha açıklayıcı olması için, her saniyede bir istek göndermek yerine, sayfa load edildiğinde ajax ile arkaplanda tek bir istek gönderilecek ve içerik eğer güncellenmediyse ekrana hiç bir sonuç döndürmeyecek. php'de usleep(); push() fonksiyonları ile yapılabilir. Fakat önemli olan uygun bir algoritma yazmada. Eğer içerikte güncelleme olursa anlık olarak ekrana gelecek ve yeni bir istek oluşturulacak. Bu şekilde server'a durmadan istek gönderilmediği için serverın yükünü biraz hafifletmiş oluyoruz. Bu işlemede long-polling deniliyor. Long polling'e php de yapılmış en iyi ve en basit chat örneği. (http://www.zeitoun.net/articles/comet_and_php/start). Örneği çalıştırın ve data.txt dosyasını açın. Web sayfasıda ekranda olsun, txt dosyasının içine herhangi birşey yazın ve ekranı yenilemeden yazdığınız yazının geldiğini göreceksiniz. Daha sonra, 2-3 browser'da aynı sayfayı açın ve chat yapmaya başlayın. Sonuç muazzsam. Uzun yoklamaları, firebug'un takip bölümünden inceleyebilirsiniz. Her saniyede bir istekte bulunmuyor.

Bunlar bir yöntem. Comet'e profesyonel örnekler, facebook'un kullandığı tornado, veya nodejs, socket.io gibi serverlar örnek verilebilir. Bunların altyapısında da push teknolojisi vardır tahminim, fakat  soketlerle işlem yaptığı için çok hızlı çalışıyor. Özellikle, tüm istekleri mysql'de tutma gibi işlemler yapacaksanız bu yan sunucuları projelerinizde kullanmanız gerekiyor. Yoksa, serveri elinize alırsınız :)

Gerçek zamanlı güncellemeler bundan ibaret. Kendimi bu alanda biraz daha geliştirdikten sonra örnek uygulamalar paylaşmaya başlarım (inş.).

1 Şubat 2012 Çarşamba

Pardus projesi - Çok yazıkkk

Selamlar,

Pardus geliştiricilerinden, Semen Cirit'in geliştirici listesine gönderdiği yazıyı buruk bir şekilde paylaşıyorum. Çok kısa bir süre önce, pardus projesinde çalışan yazılımcıların bir çoğu işten ayrılmıştı. Tubitak yönetim kadrosundan kaynaklanıyor herşey. Eeee Tayyibin Bill Gates ile neden panpa olduğunu bir kez daha anladık. Emeğe, geleceğe, daha doğrusu herşeye çok yazık...

Not: 2011 paketleri silinmiş. 2012 sürümü çıkmayacak..

"Merhaba,
İlk kararlı sürümünü 21 Ocak 2011'de çıkaran, daha sonra 2011.1 ve 2011.2 ile yoluna devam eden 2011 sürümü ailesi sona eriyor. Bu tarihten sonra Pardus 2011 için herhangi bir yazılım güncellemesi yapılmayacak. Bu sürümü kullanan ve emeği geçen herkese çok teşekkürler,

Hello, 
Pardus 2011 family, that has made the first stable release on 21 January 2011, followed by 2011.1 and 2011.2 releases, has reached end of life. From now on, any future software updates won't be made for Pardus 2011. Many thanks to everyone who contributed to this version and use,"

Listeye gönderilen sorular...

"Günaydın!
Proje Yönetimi/Camia Koordinatörü dikkatine
Bu sabah geliştirici listesine Pardus 2011 serisinin sona ermesi ile ilgili
Semen Cirit tarafından bir mesaj gönderildi.(1) Bu ani karar ile ilgili
sorularımız şunlarıdır.
1- Bu karar kimin tarafından verildi?
TÜBİTAK'ta olan genel değişim ve son dönemde yaşanılan büyük iş gücü kaybı sonrasında Pardus Yönetimi tarafından verildi.
2- Uyulmayan sürüm takviminde böyle bir tarih öngörülüyor muydu?
Genel olarak Pardus sürümlerine bakıldığında .2 sürümlerinde yaklaşık 6 ay sonra sec-only ve takip eden 1-2 ay içerisinde de eol gerçekleşiyor. Bu genellemeye bakıldığında .2 sürümü kasım ayı başında çıkmış durumda. Yukarıdaki iki ana nedenden dolayı 4 ay kadar önce öldürülmüş oldu.
3- Bu karar bireysel sürümlere artık son verildiğini mi gösteriyor?
Hayır, bunun ile ilgili olumlu veya olumsuz kesin bir sonuç yok maalesef elimizde.
4- Böyle bir kararı camiaya nasıl açıklamamızı bekliyorsunuz?
Geliştirici ve duyuru listelerinden açıkladık.
5- Biz bu kadar kamuoyu yaratma çabasındayken, böyle bir karar vererekcamiayı yüz üstü bırakmaya, nasıl razı geldiniz!
Bu yaşanılan durum yüz üstü bırakmak olarak görülmemeli, bu yaşanılanların doğal bir sonucu, son 3-4 aydır commit listelerinden zaten 2011'in ölmek üzere olduğu neredeyse aşikar, sadece duyuru ile bunu resmileştirdik.
Anlayışınız için teşekkürler,"

http://lists.pardus.org.tr/gelistirici/2012-January/057195.html

31 Ocak 2012 Salı

Php ile Html kodlarını ayırma - Tema Motoru

Selam herkese..

Uzun bir aradan sonra hoşunuza gidecek bir makale ile karşınızdayım. Bu makalemde php'de ki extract fonksiyonunu kullanarak Codeigniter'daki tema motorunun nasıl çalıştığını ufak bir fonksiyon ile öğretmeye çalışacağım.

PHP kodluyorsunuz tamam, fakat bir framework kullanmıyorsanız bu işi profesyonel yapmıyorsunuz demektir. Spagetti kod yazıp kirletmeyin şu interneti. Bir php dosyasına; hem php, hem de html kodları yazmayın. 2012'de mvc kodlama yapmayan kişiye programcı demedikleri gibi birde kız vermiyorlarmış duyduğum kadarıyla. Ha illa hazır framework'ler kullanında demiyoruz. En azından kendi yapınızı oluşturun ve tüm kodlama standartlarınızı bu yapı üzerinde geliştirin. Bundan bir kaç sene önce, internette baya bir araştırma yapmıştım tema motorları hakkında. Kendime tema motoru yazıcam diye baya kastım felan. Bi süre smarty kullandım. Smarty bana göre çok abartı birşey. Kullanmaya gerçekten hiç gerek yok, gerçi cache sistemi için kullanıyorsanız bilemem ama aşağıda yazmış olduğum örnek bu tarz tema sınıflarına göre daha basit. Amaç php ile html kodlarının ayrılması ise, yani daha düzenli kod yazmak için bilmem kaç mb'lık class dosyalarına hiç gerek yok. PHP ile haşır neşir olan herkes haklısın diyodur. PHP ile HTML kodlarının birbirinden ayrılmasının basit bir yolu var. Yukarıda da bahsettiğim gibi tek sihrimiz extact fonksiyonu. Bunuda codeigniter'ın ilk sürümlerinde ki core dosyasını kurcalayarak öğrendim. Gerçekten süper bir framework yazmış adamlar. İşyerinde Codeigniter kullanıyoruz zaten. Fakat hobi olsun diye evimde kendi kendime ufak bir framework yazmaktayım. Bu şekilde daha çabuk ve daha kolay öğreniyorum back-end yapıyı. Herneyse.. MVC'de olmazsa olmaz bir kuraldır controller ile view dosyalarının ayrı tutulması. (İleride MVC hakkında detaylı bir yazı yazacağım.)

***

Temanın çağrılıp ilgili değişkenlerin atanacağı loadPage fonksiyonumuzun tutulduğu dosya. Biraz daha ileri seviyede işlem yapmanız için, fonksiyona 3. bir parametre ekleyebilir ve bu parametrenin true yada false olma durumuna göre header.php ve footer.php dosyalarını otomatik olarak yükletebilirsiniz. Bu anlattığım fonksiyonda, sadece düz php sayfası yüklüyoruz. Geliştirmesi size kalmış.
~ function.php source
<?php
/*
 * coded by Gökhan Kaya
 * artiktek@hotmail.com
 * artiktek.blogspot.com
 */
function loadPage($file, $data=array()){
 
 // view dosyasına bak
 $fileName = "html/$file.php";
 
 if (!file_exists($fileName)){
  die("Error: $fileName not found");
 }
 
 // controller dosyamızda tanımlanan değişkenleri htmlde göster
 if (is_array($data)){
  extract($data);
 }
 
 // view dosyasını getir
 require_once($fileName);
}
?>

Tüm programlama işlemlerinin gerçekleştiği controller dosyası. PHP ile ilgili tüm işlemlerinizi burada yapıp ilgili kod bloğunun sonuna loadPage() fonksiyonunu çalıştırarak view dosyasını yükleyebilirsiniz.
~ index.php source
<?php
/*
 * coded by Gökhan Kaya
 * artiktek@hotmail.com
 * artiktek.blogspot.com
 */

// fonksiyon dosyamızı çağıralım.
require_once 'function.php';


// view dosyasında basılacak veriler
$data['site_adi'] = 'http://artiktek.blogspot.com';
$data['dizi_ornegi'] = array(
 'isim' => 'Gokhan',
 'soyisim' => 'Kaya'
);

// view sayfasını yüklüyoruz ve data dizisini viewda gösterilmesi için fonksiyona ekliyoruz.
loadPage('index', $data);
?>

Ve view dosyası. Html içeriklerin olduğu sayfa. PHP'nin kısa taglarını kullanarak sadece if foreach ve echo işlemlerini kullanarak hızlı bir şekilde controller dosyasından gelen değişkenleri istediğiniz yerde yazdırabilirsiniz.
~ html/index.php source
<!-- artiktek.blogspot.com -->
<h1>View ornegi</h1>

<div>Site adi: <?=$site_adi?></div>

<div>
<?php foreach($dizi_ornegi as $key=>$value):?>
<div><?=$key?> : <?=$value?></div>
<?php endforeach;?>
</div>

Görüldüğü üzere kodları birbirinden ayırdık.

Saygılar.