10 Mayıs 2014 Cumartesi

Android Uygulama Görsel Bileşenler ve Komponentler

Android uygulama tasarlamak için gerekli olan temel görsel öğeler Android SDK ile gelmaktedir. Layout dosyalarında kullanacağımız temel bileşenlere/komponentlere sırasıyla bakalım.

Android Görsel Bileşenler

TextView

Cihaz ekranında görsel ve metinsel öğeler yer alabilir. Metin değerlerini ekranda göstermek için kullanılır.

EditText

Kullanıcıdan alınacak metin ya da numara gibi girdileri kaynak kod tarafına iletmek için kullanılır. HTML’deki input benzeri bir davranış gösterir. Kullanıcı giriş yaparken gireceği değere göre klavye tipi seçilebilir.

ImageView

Resimleri ekranda göstermek için ImageView’dan faydalanırız. ImageView drawable klasöründe yer alan dosyaları ya da başka bir kaynaktan elde edilen resimleri görüntülemek için kullanılır.

Button

Düğme oluşturmak için Button öğesi kullanılabilir. Kullanıcı düğmeye bastığında kod içerisinde oluşturulan bir dinleyici (onClickListener) içindeki kod çalıştırılarak düğmeye bir eylem atanabilir.

CheckBox

Kullanıcının evet / hayır değeri verebileceği bir kutu oluşturur.

ListView

Tablo oluşturmak için kullanılır. Belirli bir kaynaktan (veritabanı ya da web servis) çekilen veriyi göstermek için uygundur. Uygulamalarda en sık kullanılan görsel öğelerin başında gelir. Özellikle, satır tasarımlarının özel layout dosyaları ile değiştirilebilmesi esnek bir kullanım sağlar.

Spinner

Kullanıcıya menü göstermek için kullanılır. select HTML etiketi gibidir. Kullanıcı Spinner öğesine bastığında karşısına geliştiricinin belirlediği bir menü açılır ve burada seçim yapması istenir. Yapılan seçimin cevabı kaynak kod içerisinde bir Listener yardımıyla alınır.

MapView

Uygulamalara kolaylıkla Google Maps entegrasyonu yapmak için kullanılır. Google’dan alınan bir API anahtarı yardımıyla uygulamada Google haritalarında yer alan bütün özellikleri MapView yardımıyla kullanabiliriz. Konum tabanlı uygulamaların vazgeçilmez parçasıdır.

ProgressBar

Kullanıcının karşısına bir durum çubuğu gelmesini sağlar. Yapılan uzun süreli bir işlemin (web servis çağırma) ne kadar süreceğine dair kullanıcı dostu bir mesaj vermek için kullanır.

SeekBar

Kullanıcının sağa ve sola çekebileceği bir çubuk oluşturur. Bu şekilde kullanıcı bir ses dosyasında ileri geri gidebileceği gibi bir renk cetvelinde özel renkler belirleyebilir. Kullanıcının yaptığı değişim bir Listener metodu uyarır ve kaynak kod içerisinde ilgili işlemlerin yapılmasını sağlar.

WebView

Uygulama içerisinde bir HTML tabanlı web sitesi göstermek için kullanılır. Bu web sitesi uzak bir sunucuda olabileceği gibi uygulamanın içinde saklanan HTML dosyaları da olabilir. Hibrid bir uygulama hazırlamak için uygun bir yapıdır.

Nesne Yönelimli Programlama Sarmalama (Encapsulation)

Sarmalamanın anlamı; sınıfı oluşturan metot ve özelliklerin gerçekleştirme biçiminin, bu sınıfı kullanacak olan kullanıcılardan gizlenmiş olmasıdır.

Nesne Yönelimli Programlama'nın temelinde nesne vardır ve nesne veri ile metotların bir araya gelmesi ile oluşur. Veri (özellikler) ve veri üzerinde işlem yapan kod (metotlar) bir arada bulunur ve nesneyi meydana getirir. Nesneyi tanımlayan sınıfın iç ayrıntıları, normal olarak programın arta kalan kısmı için görünür değildir.


Bir nesne sınıfının gerçekleştirimini değiştirirsek, yani aynı sınıfı metot ve özellikleri aynı kalmak koşuluyla farklı bir programlama tekniğiyle oluşturursak, o sınıfın dış dünyaya olan arayüzü değişmediği sürece (metot ve özellikler aynı kaldığı sürece) bu sınıfı kullanan program kodlarınızda bir değişiklik yapmamıza gerek kalmayacaktır.

Nesne Yönelimli Programlama Çok Biçimlilik (Polymorphism)

Çok biçimlilik, farklı nesnelerin, aynı mesaja (olaya ya da uyarıma) farklı şekillerde cevap verebilme yeteneğidir.

Her nesne sınıfı, kendi metotlarını paketlediği için ve bu metotlar programın kalan kısmı için gizli olduğundan, farklı sınıflar aynı isimde bazı metotlara sahip olabilirler.


Örneğin ŞEKİL adlı bir süper sınıfımız (super class) olsun. Bu sınıftan, DAİRE, KARE ve ÜÇGEN adlı üç farklı alt sınıf türettiğimizi varsayalım. Bu alt sınıfların her biri kendi örneklerini çizmek için ÇİZ adlı bir metoda sahip olabilir. Fakat, her bir alt sınıf için bu metot aynı olmasına karşın, bu metodu devreye sokmak için gönderilecek mesajdan sonra her alt sınıfa ait nesne farklı bir şekil (yani kendini) yani bir üçgen, daire veya kare çizecektir.

Eclipse Android Projesi Klasör Yapısı

Eclipse ortamında Android projesi yarattığımızda klasörler ve xml dosyası oluşur. Gelin şimdi bir Android projesinin dosya yapısını detaylı bir şekilde inceleyelim.


  • src : Kaynak dosyaları burada yer alır. Bu klasörün içinde Java dosyaları yer alır. Tüm oluşturulan class'lar ve paketler bu klasör içine yerleştirilmelidir.


  • gen : Android tarafından otomatik oluşturulan dosyalar burada bulunur. Buradaki R.java dosyası projede kullandığınız her türlü tasarım, resim ve metin dosyasının tanımlayıcılarına (ID) referans içerir. Bu dosya otomatik olarak oluşturulur ve dışarıdan müdahale edilmemesi gerekir.


  • assets : Uygulamada kullanacağımız destekleyici dosyaları burada tutulur. Örneğin, sqlite veritabanı oluşturduysak ve uygulamayla beraber sqlite dosyasını da göndermek istiyorsak, dosyanın bu klasör içinde bulunması gerekir.


  • bin : Uygulamanın derlenmiş hali bu klasörde tutulur. Bu dosyaya da dışarıdan müdahele edilmemesi gerekir.


  • libs : Android SDK içinde yer almayan bir Java kütüphanesi (AdMob gib) kullanıyorsak, ilgili jar dosyalarını bu klasöre atmamız gerekir. Ancak bir jar dosyası ekledikten sonra dosyaya sağ tıklayıp Add To Build Path seçeneğini seçmeyi unutmamalıyız. Aksi takdirde derleyici jar dosyasını göremeyecektir.


  • AndroidManifest.xml : Bu dosya uygulamanın kalbidir. Uygulamayla ilgili her türlü özellik ve uygulamanın işletim sisteminden talep edeceği bütün izinler burada tanımlanır. Aynı zamanda uygulama içinde kullanılan her ekran burada kaydedilip tanımlanmak zorundadır.


  • res : Uygulama ile ilgili her türlü kaynak bu klasörde tutulur. Burada resim dosyaları, ekran tasarımları ve metin dosyaları olabilir. Bu klasör içinde birçok alt klasör yer alır.


  • drawable : Uygulamada kullanılan resim dosyalarını içerir. Bu dosyalar PNG ya da JPEG formatında olabilir. Klasörün yanındaki hdpi (high dpi), ldpi (low dpi), mdpi (medium dpi) ve xhpi (extra hight dpi) cihaza özel ekran çözünürlüklerine göre dosya çağırmamızı sağlar. Örneğin uygulamanın çalıştığı cihaz eski modelse ve ekranı düşük çözünürlük destekliyorsa ldpi klasörü içindeki resim dosyaları kullanılacaktır. Ama uygulama yeni nesil geniş ekran bir cihazda çalışıyorsa ona uygun olarak yüksek çözünürlüklü bir klasörde bulunan dosyalar kullanılır. Eğer uygulamanızda düzgün bir tasarım varsa ve geniş yelpazede cihazlar destekliyorsanız tasarımcınızdan uygun formatlarda dosyalar istemeniz gerekir.


  • layout : Ekranlara dair tasarım dosyaları bulunur. xml formatındaki bu dosyalar her ekrana ait tasarımları barındırır. Bir ekran Activity ile oluşturulduğunda onCreate metodu içinde ilgili layout çağırılır ve ekranda yer alacak öğeler oluşturulur.


  • menu : Bir ekranda cihazın Menü tuşuna basıldığında bir menü çıkmasını istiyorsak, menü elemanlarını bir xml dosyasında tanımlanır ve bu klasör içinde saklanır.


  • values : Uygulamada kullanılan sabit değişkenler burada saklanır. strings.xml dosyası uygulamada kullanılan ve ekranlarda kullanıcıya gösterilen her türlü metni saklar. Anahtar – değer mantığıyla saklanan bu değerler kod içinde ya da layout dosyalarında çağırılır. Aynı zamanda bu değerler R.java dosyasında işaretlenir. Bunun dışında colors.xml dosyası layout dosyalarında kullanılacak önceden tanımlanmış renkleri içerir. styles.xml dosyası ise ekranlarda kullanılan ve yine layout dosyalarından çağrılan stilleri içerir. values klasörünün bir başka özelliği de cihazın ayarlanmış ana diline göre yerelleşebilmesidir.

9 Mayıs 2014 Cuma

Android Runtime (ART) İşletim Sistemi

Android işletim sistemi, Android uygulamalarını çalıştırmak için Dalvik sanal makinesini kullanır. Google Dalvik’ten vazgeçip yeni sanal makinesi Android Runtime'a (ART) geçiş yapıyor. Android sürümü Kitkat'a ART'ı da entegre etmiş durumda.

Android platformunda, Java ile yazdığımız Android uygulama kodları önce Java bytecode'larını içeren .class uzantılı dosyalara çevrilir. Bu kodlar Dalvik sanal makinesinin çalıştırabileceği Dalvik bytecode'unu içeren .dex uzantılı tek bir dosyaya dönüştürülür. 

Dalvik sanal makinesi, kısıtlı bellek ve işlemci gücü sağlayan mobil cihazlar için tasarlandığı için günümüzdeki çoğu modern bilgisayar programlama dilleri (Java, C#) gibi yığınlarla (stack) değil yazmaçlarla (register) çalışır. Bunun için daha hızlıdır. 

Dalvik sanal makinesiyle ilgili daha fazla detaya http://source.android.com/devices/tech/dalvik/ adresinden ulaşabilirsiniz.

Android Runtime. ART'ın çalışma şekli Dalvik'ten çok farklı. Dalvik, Android 2.2 sürümünden beri "Tam Zamanında" derleme (Just-In-Time – JIT compilation) kullanarak kodu derliyor. 

Uygulama yazılıp cihaza yüklendiğinde kod belli bir oranda derleniyor ve esas derleme ve optimizasyon uygulama çalışmaya başladığında yapılıyor. Bu işlem ise uygulama her çalıştırılğında yapılıyor. Bu ise fazladan yük getiriyor ve daha az verimli çalışılmasına sebep oluyor.

ART ise "Zamanın Ötesinde derleme" (Ahead-of-Time – AOT compilation) ile uygulama cihaza kurulurken  bytecode derlemesini yapıyor ve bytecode'u makine diline çeviriyor. Her uygulama açılışında yeni bir sanal makine başlatmak gerekmiyor.

ART tam anlamıyla standart olarak kullanıma hazır değil. Birçok optimizasyonu ve testi henüz yapılmamış durumda. ART ile Dalvik arasında fark olduğu kesin ama bunun ne kadar olduğunu ve gerçekte neler kazandıracağını kestirmek zor şimdilik. Test siteleri ve kullanıcılar tarafından yapılan testlerde işlem sürelerinin yarıya yakın azaldığı söyleniyor. ART’a geçiş yaptıktan sonra işletim sisteminin animasyonlarında ve bazı uygulamalarda fark edilir hızlanma gözlenebiliyor. 

Kullanıcılar için uygulamaların daha hızlı çalışması, arayüzdeki geçişlerin ve animasyonların daha yumuşak ve takılmadan görüntülenmesi son derece önemli. Her kullanıcının en önemli istekleri daha hızlı işleme, daha az işlemci gücü gereksinimi olduğu için cihazların pil ömürlerinde de ciddi artış bekleniyor.

Herşey böyle güllük gülistanlık değil. Bunların elbet bir de bedeli var. Uygulamalar cihaza kurulurken makine diline çevrileceği için ilk kurulum süreleri artıyor. Küçük uygulamalarda bu hissedilmeyecek bir fark iken, daha yüklü ve büyük uygulamalarda kurulum süresi fark edilir şekilde artabilir. 

Her bytecode'un makine dilindeki birkaç komuta denk geldiği için, makine diline çevrilmiş olarak saklanan uygulamalar cihazın belleğinde daha çok yer kaplayacaktır. Bu artış sadece çalıştırılabilir kodda olacağı için (resim, video, ses dosyası gibi uygulama kaynaklarında bir değişiklik söz konusu değil) çok da önemli değil. Google % 10 - 20 arasında bir artış olacağını söylüyor.

Uygulamaların ve işletim sisteminin daha hızlı çalışması ve cihazın pil ömrünün artması gibi çok kritik getirilerin yanında cihazdaki depolama alanında kaplanan miktarın artması veya ilk kurulumun daha uzun sürmesinin çok bir öneminin olmayacağını söyleyebiliriz.

Google, Android 4.4 sürümü ile birlikte artık cihazınızda çalışma zamanı olarak Dalvik veya ART'ı seçmenize olanak veriyor. Ancak ART henüz tam anlamıyla hazır değil. Yeni çalışma zamanını ve getirdiği farklılıkları test etmek istiyorsanız ve cihazınızda Android 4.4.x işletim sistemi bulunuyorsa, "Ayarlar" (Settings) > "Geliştirici Seçenekleri" (Developer Options) > "Çalışma zamanını seçin" (Select runtime) kısmından Dalvik seçeneğini değiştirerek ART'ı seçebilirsiniz.

Bu ayarı değiştirdiğinizde cihazınız libdvm.so kütüphanesinden libart.so kütüphanesine geçmek için yeniden başlatılacak ve kurulu bütün uygulamalarınız ART için tek tek derlenecek ve optimize edilecektir. Bu işlem 5 ile 15 dakika arasında sürecektir.

Her uygulama şimdilik ART'ye uyumlu değil. Bazı uygulamalar hatalı çalışabiliyor ve hatta hiç çalışmayabiliyor. Popüler bir mesajlaşma uygulaması olan WhatsApp, ART üzerinde çalışmıyor. Sürekli hata veriyor ve kaldırıp tekrar kurmak isterseniz kuramıyorsunuz şimdilik.

Nesne Yönelimli Programlama Miras Alma (Inheritance)

Nesneye yönelik programlamada, bir nesne, genellikle bir nesne sınıfına ait bir örnektir (instance). Örneğin, Albert Einstein, insan sınıfının bir örneğidir. Bir nesne sınıfından alt sınıflar (subclasses) oluşturulabiliyorsa, türetme özelliği (derivation) var demektir. Örneğin insan sınıfı, canlı sınıfının bir alt sınıfıdır.

Kendisinden alt sınıf üretilen sınıfa, temel sınıf (base class) veya süper sınıf (super class) veya ana sınıf (parent class) adı verilir.
Subclass yerine child class terimi de kullanılmaktadır.

Alt sınıfın nesneleri, türetildikleri temel sınıfa ait özellikleri alır, burada miras alma (inheritance) özelliği vardır denir. Bu anlamda, miras alma özellikli bir nesne yönelimli programlama dilinde, bir nesne sınıfından türetilen alt nesne sınıfına ait nesneler, üst sınıfın özelliklerini (properties) ve metodlarını (methods) aynen alırlar.

7 Mayıs 2014 Çarşamba

İşletim sisteminiz kaç bit?


Windows 7 kullanıcıları Denetim Masası > Sistem ve Güvenlik > Sistem yolunu takip ederek, aşağıdaki ekran görüntüsünde olduğu gibi işletim sisteminin kaç bit olduğunu öğrenebilir.


Windows 8 kullanıcıları Denetim Masası > Sistem ve Güvenlik > Sistem yolunu takip ederek, aşağıdaki ekran görüntüsünde olduğu gibi işletim sisteminin kaç bit olduğunu öğrenebilir.


Linux veya Mac OS X kullanıcıları aşağıdaki komutu terminalde çalıştırarak işletim sisteminin kaç bit olduğunu öğrenebilir.


getconf LONG_BIT


Apache Cassandra



Apache Cassandra Summit 2014

Apache Cassandra Nedir?

Apache Cassandra, NoSQL veritabanı mimarisini için geliştirilen açık kaynak kodlu bir veritabanıdır. Cassandra, Google’ın Bigtable ve Amazon’un Dynamo veri tabanlarının Facebook tarafından geliştirmesi ile oluşturulan yeni bir veritabanı sistemidir. Cassandra dağıtık mimaride, yüksek performanslı, yüksek ölçeklenebilirliğe sahiptir.
Cassandra Kullanan Şirketler
Cassandra günümüzde büyük veri ile başetmek için kullanılmaktadır. Cassandra Facebook, eBay, Twitter, Reddit gibi çok büyük veri saklayan ve yöneten firmalar tarafından kullanılmaktadır.

Neden Apache Cassandra?
RDBMS sistemleri veriler eklendikçe dikey olarak büyürken, NoSQL sistemlerinde veriler yatay olarak büyümektedir.  Master - slave yapısı yerine peer - to - peer modeli uygulanır. 
Cassandra ve Big Data
Master sistem kullanan yapılarda fazla sayıda istek geldiğinde server bunu karşılayamazsa sistemde sıkıntılar yaşanır. Fakat Cassandra ile böyle bir problem yaşanmaz. Data center içerisine istediğimiz kadar cluster (server) ekleyebiliriz.
  • Gigabyte, petabyte boyutlarında ölçeklenebilirlik
  • Yeni node’lar eklenerek lineer olarak performans artışı
  • Kolay replication
  • Dağıtık mimari
  • Çoklu data center ve bulut çözümü sağlaması
  • Sistemden ayrı caching layer’larına ihtiyaç olmaması
  • Esnek şema (schema) tasarımı
  • Veri sıkıştırma (Google’ın Snappy algoritaması kullanılır)
  • CQL ile sorgu gerçekleme
  • Dil ve platform desteği
  • Özel olarak tasarlanmış yazılım ve donanım ihtiyacının olmaması

25 Şubat 2014 Salı

Php ile Özel Karakterleri Düzeltme

Php ile bir yazı içerisinde bulunan özel karakterleri değiştirmek için bir fonksiyon yazalım. Bu fonksiyon parametre olarak yazıyı (text) almakta ve geriye düzeltilmiş yazıyı döndürmektedir.

/*
* @param string $text
*
* @return string $text
*/

public function ozelKarakterleriDuzelt($text) {

/*
* Özel karakterlerin karşılıkları
*
* bir dizide toplanır
*/
    $specialLetters = array(

        'a' => array('á', 'à', 'â', 'ä', 'ã'),

        'A' => array('Ã', 'Ä', 'Â', 'À', 'Á'),

        'e' => array('é', 'è', 'ê', 'ë'),

        'E' => array('Ë', 'É', 'È', 'Ê'),

        'i' => array('í', 'ì', 'î', 'ï', 'ı'),

        'I' => array('Î', 'Í', 'Ì', 'İ', 'Ï'),

        'o' => array('ó', 'ò', 'ô', 'ö', 'õ'),

        'O' => array('Õ', 'Ö', 'Ô', 'Ò', 'Ó'),

        'u' => array('ú', 'ù', 'û', 'ü'),

        'U' => array('Ú', 'Û', 'Ù', 'Ü'),

        'c' => array('ç'),

        'C' => array('Ç'),

        's' => array('ş'),

        'S' => array('Ş'),

        'n' => array('ñ'),

        'N' => array('Ñ'),

        'y' => array('ÿ'),

        'Y' => array('Ÿ'),

        'G' => array('Ğ'),

        'g' => array('ğ')

    );


/*
* İç içe döngü ilse yazı içindeki özel karakterler
*
* karşılıkları ile değiştirilir
*/
    foreach ($specialLetters as $letter => $specials) {

        foreach ($specials as $s) {

            $text = str_replace($s, $letter, $text);

        }

    }

    return $text;

}



22 Şubat 2014 Cumartesi

Php ile Web Sayfasının Yüklenme Süresini Ölçme

Bir web sayfasının yüklenmesi için geçen süre, sayfanın browser üzerinde html olarak görüntülenmesi için geçen süredir. Sayfanın yüklenme süresini hesaplamak için iki değişkene ihtiyacımız var. Bunlar sayfanın yüklenmeye başladığı an (startTime) ve sayfanın tamamen yüklendiği  an (stopTime) dır. startTime değişkeni sayfanın başına, stopTime değişkeni ise sayfanın sonuna yazılır. Bu ikisi arasındaki zaman farklı (time) bize yüklenme süresini verir.

   $startTime = microtime(true);

/*
* Sayfadaki kodlar
*
* bu araya yazılmalıdır
*/

   $stopTime = microtime(true);

   $time = $stopTime - $startTime;

/*
* İstatistik tutuyorsanız
* time değişkeni 
* veritbanına kaydedilebilir
*/


19 Şubat 2014 Çarşamba

Php ile Yazı İçindeki Rakamları Temizleme

Php ile bir yazı içinde geçen rakamları temizlemek için bir fonksiyon yazalım. Fonksiyon parametre olarak bir string alıyor ve rakamlardan temizlenmiş yazıyı geriye döndürüyor.

/*
* @param string $text
*
* @return string $text
*/

public function rakamTemizle($text) {

    $search = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");

    $text = str_replace($search, "", $text);

    return $text;

}


18 Şubat 2014 Salı

Php ile Facebook URL Decode Etme

Dünyanın en büyük sosyal ağı Facebook'ta her gün binlerce, milyonlarca resim ve video paylaşılıyor. Facebook'ta paylaşılan videoları çekmek için bir uygulama yazıyorsanız, videonun linkinin (URL) şifrelenmiş olduğunu göreceksiniz. Video linkinde geçen özel karakterleri çözümlemek için bir fonksiyon yazalım. Bu fonksiyona şifrelenmiş URL argüman olarak verildiğinde geriye dönen değer anlaşılır bir URL olacaktır.

/*
* @param string $url
*
* @return string $url
*/
public function facebook_encode_replace($url) {

    $source = array("\u00253A", "\u00252F", "\u00253F", "\u00253D", "\u002526", "\u00257B", "\u00257D", "\u002522", "\u00252C", "\u00255C", "\u00255D", "\u00255B");

    $replace = array(":","/","?","=","&","{","}","\"",",","\\","[","]");

    $url = str_replace($source, $replace, $url);

    return $url;

}

Php ile Sayı Basamaklarını Formatlı Şekilde Gösterme

Php ile bir sayıyı binler, milyonlar, milyarlar basamakları formatlı bir şekilde göstermek için bir fonksiyon yazalım. Yazacağımız bu fonksiyon, 1209045678 sayısını 1.209.045.678 şeklinde basamakları formatlanmış olarak geriye döndürecektir.

/*
* @param int $number
* @return string
*/
public function basamakFormatla($number) {

    $format = '';

    $i = 0;

    while ($number > 0) {

        $first = $number % 1000;

        $number = ($number - $first) / 1000;

        if ($i == 0) {

            if ($first < 10) {

                $format = '00' . $first;

            } else if ($first < 100) {

                $format = '0' . $first;

            } else {

                $format = $first;

            }

        } else {

            $format = $first . '.' . $format;

        }

        $i++;

    }

    return $format;

}

/*
* Sayımız 45069702 için fonksiyonu
* aşağıdaki gibi çağırıp sonucu
* ekranda görebiliriz
*/

echo basamakFormatla(45069702);

// Sonuç aşağıdaki gibi olacaktır

45.069.702

//


16 Şubat 2014 Pazar

Codeigniter ile Bir Tablodan Veri Çekme

Codeigniter ile veritabanındaki herhangi bir tablodan veri çekmek için bir fonksiyon yazalım. Bu fonksiyon parametre olarak çekilecek kayıt sayısını (limit) alsın. Ayrıca fonksiyon son eklenen kayıtları (order_by) getirsin. Bu durumda Model'imiz ve bu model içindeki fonksiyonumuz aşağıdaki gibi olacaktır.
/*
* Model ismi : Video
* Fonksiyon ismi : getVideos
*/

class Video extends CI_Model {

   public function getVideos($limit) {

        $this->db->select('*');

        $this->db->from('videos');

        $this->db->where('video_status', '1');

        $this->db->order_by('id', 'desc');

        $this->db->limit($limit);


        return $this->db->get()->result();
    }


}

Yazdığımız bu fonksiyon geriye dizi döndürecektir. Bu dizinin her bir elemanı bir Obje'dir. Controller içinde bu fonksiyonu çağırmak için öncelikle yazdığımız Model sınıfını yüklememiz gerekir. Fonksiyondan geriye dönen değeri bir dizi değişkenine atayıp, dönen veriyi göstermek istediğimiz View'e parametre olarak vermeliyiz.

class Show extends CI_Controller {


   public function videos(){

     $this->load->model('video');

     $limit = 100;

     $data['videos'] = $this->video->getVideos($limit);

     if( $data != NULL ) {

       $this->load->view('show_videos', $data);

     }

}

13 Şubat 2014 Perşembe

PHP ile Youtube Linkinden Video ID'si Bulma

Dünyanın en büyük video içerik sitesi olan Youtube'daki videoların ID'lerini herhangi bir youtube linkinden almak için bir fonksiyon tanımlayalım.

/*
*
* @param string $url
*
* @return string
*
*/
public function getVideoIdFromURL($url) {

        $url_string = parse_url($url, PHP_URL_QUERY);

        parse_str($url_string, $args);

        if ( isset($args['v']) ) {

              return $args['v'];

        } else {

             return '';
        }

}


Fonksiyon parametre olarak bir URL almakta ve bu URL Youtube'a ait ise videonun ID'sini, değil ise boş string döndürmektedir.

Codeigniter ile Otomatik Tweet Gönderme

Twitter REST API 1.1 i kullanarak tweet göndermek için https://dev.twitter.com adresine girerek bir uygulama oluşturduktan sonra verilen keyler ile tweet göndermek için Twitter adında bir Controller ve sentTweet adında bir metod tanımlıyoruz.

Tweet gönderebilmek için Github'da yer alan OAuth.php ve twitteroauth.php dosyalarını indirip application/libraries klasörüne kopyalıyoruz. Daha sonra twitteroauth.php dosyasını fonksiyon içinde projemize dahil ediyoruz.

class Twitter extends CI_Controller {

   private $consumerKey = 'Uygulama key';

   private $consumerSecret = 'Uygulama secret';

   private $oAuthToken = 'Uygulama token';

   private $oAuthSecret = 'Uygulama secret';


   public function sentTweet() {

        $data = array();

        $data["consumerKey"] = $this->consumerKey;

        $data["consumerSecret"] = $this->consumerSecret;

        $data["oAuthToken"] = $this->oAuthToken;

        $data["oAuthSecret"] = $this->oAuthSecret;


        $CI = & get_instance();

        $CI->load->library('twitteroauth', $data);

        $tweetText = "Bizimkini hiç denediniz mi? bizimki.com";    

        $status = array('status' => $tweetText);

        $this->twitteroauth->post('statuses/update', $status);

  }

}


Tweet atmak istediğimiz yazıyı ($tweetText) belirleyip post metodu ile gönderilmesini sağlıyoruz.

12 Şubat 2014 Çarşamba

Codeigniter Kullanıcı Kaydı


Codeigniter ile veritabanı işlemleri için model sınıfları oluşturmak gerekir. Yeni bir kullanıcının bilgilerini veritabanına kaydettiğimizi düşünelim. Öncelikle kullanıcı bilgilerini bir dizide toplamalıyız. Bu işlemi tabiki controller içinde yapmalıyız.

/*
* Profile adından controller oluşturalım
*/

class Profile extends CI_Controller {

    public function __construct() {

        parent::__construct();

    }


    public function signup($userData) {

/*
* Üyelik formundan gelen bilgileri 
* diziye aktaralım
*/

        $data["fullname"] = $this->input->post('fullname',TRUE);

        $data["username"] = $this->input->post('username',TRUE);

        $data["password"] = sha1 ( $this->input->post('password',TRUE) );

        $data["date"] = time();

        $data["status"] = '1;

/*
* Model sınıfını yükleyelim
*/

        $this->load->model('user');

/*
* Model sınıfının newUser metonu çağıralım
*/
        $this->user->newUser($userData);
    }

 }   


Bu durumda model sınıfı içinde bu işlemi yapacak bir metot tanımlamamız gerekir. Bu metot parametre olarak ise kullanıcı bilgilerinin olduğu diziyi almalıdır. Kullanıcıyı veri tabanına kaydeden metodumuzun içeriği aşağıdaki gibi olacaktır.
class User extends CI_Model {

    public function __construct() {

        parent::__construct();

    }

/*
*
* @param array $userData
*
* @return boolean
*
*/
    public function newUser($userData) {

        $this->db->insert('users', $userData);

        if ($this->db->insert_id() > 0) {

            return TRUE;

        } else {

            return FALSE;

        }

    }

}

10 Şubat 2014 Pazartesi

PHP ile Bir Yazıdaki Kelimeleri Hashtag'lemek

Php'de bir fonksiiyon ile bir yazıda geçen tüm kelimeleri hashtagli olarak geri döndürebiliriz. Bunun için öncelikle yazıda geçen tüm noktalama işaretlerini ve yazının başında, sonunda bulunan boşlukları temizlemek ve yazı içindeki boşlukları teke indirmek gerekir. Bunun için öncelikle bir fonksiyon yazalım.
function noktalamaTemizle($text) {

    $search = array("'", ".", ",", ";", "!", "?", ":", "(", ")", "[", "]", "{", "}");

    $text = str_replace($search, "", $text);

    return $text;
}

Yazıda geçen tüm boşlukları tek boşluğa çeviren fonksiyonu yazalım.
/*
*
* @param string $text
*
* @return string
*
*/
function boslukTemizle($text) {

    $text = trim($text);

    $text = str_replace("  ", " ", $text);

    return $text;
}

Şimdi yazıda geçen tüm kelimeleri hashtagli olarak geri döndüren fonksiyonu yazalım.

/*
*
* @param string $text
*
* @return string
*
*/
function hashtagle($text) {

    $text = "#" . $text;

    $text = str_replace(" ", " #", $text);

    return $text;
}

Yazdığımız bu fonksiyonu aşağıdaki gibi çağırabiliriz.
$text = "Bugün, güzel bir gün değil mi?";

$hashText = hashtagle(boslukTemizle(noktalamaTemizle($text)));

echo $hashText;

//Çıktı aşağıdaki gibi olacaktır

// #Bugün #güzel #bir #gün #değil #mi


9 Şubat 2014 Pazar

Codeigniter Hepler Oluşturma

Codeigniter içinde  bulunan veya bizim oluşturacağımız kendi helper'larımızı projenin herhangi bir yerinde, bu bir Model, bir Controller veya bir View olabilir, obje oluşturmadan doğrudan fonksiyonu çağırarak kullanabiliriz.

Codeigniter ile kendimize ait helper dosyaları oluşturabilmek için öncelikle application/helpers klasörü altında dosya_helper.php gibi bir PHP dosyası oluşturalım. Bu helper'ımızda dosya işlemleri ile ilgili fonksiyonlarımızı tutacağız. İlk fonksiyonumuz, bir dosyayı satır satır okuyan ve bu dosyadaki herhangi bir satırı random olarak geri döndüren bir fonksiyon olsun.

Fonksiyonumuz readRandomLineFromFile aşağıdaki gibi olacaktır.

function readRandomLineFromFile($filePath) {

    $handle = fopen($filePath, "r");

    $data = array();

    $lineCount = 0;

    if ($handle) {

        while (($line = fgets($handle)) !== false) {

            $data[] = $line;

            $lineCount++;

        }

    } else {

        return false;

    }

    return $data[rand(0, $lineCount)];

}


Artık dosya adında bir helper'ımız ve bunun içinde readRandomLineFromFile adında bir fonksiyonumuz var. Bu dosya helper'ımızı application/config/autoload.php dosyasında aşağıdaki gibi projemize dahil etmeliyiz.

//Heplerın ismi array içine yazılır

$autoload['helper'] = array('dosya');

//

Projemizin herhangi bir yerinde helper'ımızı aşağıdaki gibi çağırabiliriz.

//Dosyanın bulunduğu klasörü belirtiyoruz

$path = 'public/texts/videolar.txt';

$text = readRandomLineFromFile($path);

/*
* Fonksiyonun döndürdüğü satırı
* istediğimiz gibi kullanabiliriz
*/
echo $text;

//

8 Şubat 2014 Cumartesi

Codeigniter ile Kayıtlı Kullanıcı Bilgilerine Ulaşma

Codeigniter ile veritabanı işlemlerini gerçekleştirmek için $this->db objesi kullanılır. Bu obje ile application/config/database.php dosyasında tanımladığımız veritabanı içindeki tablolara ulaşabilir ve bu tablolar üzerinde insert - select - update - delete işlemleri yapabiliriz.

Örneğin , kullanıcı girişinin olduğu bir web sitemizde, kullanıcıdan kullanıcı adı (username) ve parola (password) bilgilerini alarak, veritabanındaki bir tablodan (users) bu kullanıcının tüm bilgilerini çektiğimizi düşünelim.

Bunun için öncelikle bir Controller'ımız olması gerekiyor. User olarak adlandıralım bunu. Controller'ımız içinde ise bu kullanıcının yapabileceği işlemler için fonksiyonlar - metotlar tanımlamamız gerekir. User Controller'ı içindeki metodumuz ise login() olsun.

Controller sınıfımız yapı olarak aşağıdaki gibi olacaktır.

if (!defined('BASEPATH')) {
    exit('No direct script access allowed');
}

class User extends CI_Controller {

    public function __construct() {
        parent::__construct();
    }

    public function index() {
        
    }

    public function login() {

    }
}

Şimdi login metodu içinde kullanıcının bir form ile girdiği bilgileri alıp, veritabanından kullanıcı bilgilerini çekelim. Öncelikle verileri çekeceğimiz bir Model sınıfı oluşturalım.

class User_model extends CI_Model{
    
    public function __construct() {
        parent::__construct();
    }

}

Sonra bu Model sınıfını Controller sınıfına dahil edelim ve kullanıcı bilgilerini alalım.
 
    public function login() {
        $this->load->model('user_model');

        /*
         * Formdan POST ile gelen kullanıcı adı ve şifre
         * değişkenlere aktarılıyor
         */

        $u_name = $this->input->post('username', TRUE);
        $u_pass = $this->input->post('password', TRUE);
    }

Şimdi Model sınıfında getUser( ) metodu tanımlayalım. Veritabanında kullanıcı şifresini sha1 algoritamasına göre sakladığımızı düşünelim. Bunun için kullanıcının girdiği şifreyi hemen sha1 algoritamasından geçirmeliyiz. Daha sonra SQL cümleleriyle kullanıcı bilgilerini users tablosundan çekiyoruz.

class User_model extends CI_Model{
    
    public function __construct() {
        parent::__construct();
    }
    
    public function getUser($userName, $password){
        
        $password = sha1($password);
        
        $this->db->select('*');
        $this->db->from('users');
        $this->db->where('user_username',$userName);
        $this->db->where('user_password',$password);
                
        return $this->db->get()->result();
    }

}

Tanımladığımız getUser( ) metodu bize dizi döndürecektir. Dönen bu değerleri Controller içindeki login( ) metodunda bir değişkene aktarıp, oluşturacağımız View sayfasına bu değişkendeki verileri göndereceğiz.
 
    public function login() {
        $this->load->model('user_model');
        $u_name = $this->input->post('username', TRUE);
        $u_pass = $this->input->post('password', TRUE);

        //Model sınıfının getUser metodu çağrılıyor

        $data['info'] = $this->user_model->getUser($u_name, $u_pass);
        $this->load->view('user_info_view', $data);
    }

Kullanıcı bilgilerini göstereceğimiz user_info_view dosyasında ise aşağıdaki gibi kullanıcı bilgilerine ulaşabiliriz.
/*
* Veritabanından gelen data dizi şeklinde
* olduğu için döngü ile kullanıcıya ulaşılır.
* Ayrıca kullanıcı bilgisi bir objedir.
*/

foreach ($info as $user) {
    $id = $user->id;
    $name = $user->name;
    $username = $user->username;
    $email = $user->email;
    $user_role = $user->role;
}       

Kullanıcı bilgilerini bir tabloya ya da div içine yazarak gösterebiliriz.