Node.Js Giriş

Node.Js ile ilgili yazı serisi yazmaya başlıyorum. Uzun zamandır yazmayı düşündüğüm bir konu hakkında kendimi geliştirirken buradan paylaşmanın güzel olacağını düşündüm.

Kısaca tanımlayacak olursak; Javascript üzerinde server-side uygulamalar yazmamızı sağlayan bir framework’dür.

Kendi sitesinde kullandığı tanım;

Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js’ package ecosystem, npm, is the largest ecosystem of open source libraries in the world.

Sitesinde ve birçok kaynakta nasıl kurulduğu ve npm ile paket yönetimi nasıl yapılır detaylı anlatılmaktadır. Uzunca nasıl kurulduğu hakkında yazı yazmaktan ziyade Node.Js’nin sağladığı faydalardan başlayalım.

Chrome web browserlarının da üzerinde çalıştığı V8 engine yapısını kullanmaktadır. V8 kullanması hız ve performans artışı sağlamaktadır. Tanımda belirtildiği gibi I/O ve network işlemlerini non-blocking olarak çalıştırmaktadır. Yani herhangi bir işlemin bitmesini beklemeden diğer event ile ilgili işlem başlamaktadır. Örneğin veritabanı sorgusunun sonucu beklemeden başka bir işleme geçilmektedir. Böylece performans artışı önemli bir biçimde görmülmektedir. Real-time ( gerçek zamanlı ) uygulamalar yaparken tüm kullanıcılara aynı anda bilgi akışı sağlanmaktadır.

threading_node

Resimde görüldüğü gibi clientlar tarafından request yapılmaktadır. Event loop yapısı içerisinde istekleri değerlendirip işlemektedir. Non-blocking yapısı sayesinde herhangi bir bekleme olmamaktadır.

Başta Linkedin ve paypal olmak üzere önemli firmalar tarafından kullanılmaktadır.

1 – Asynchronous(Asenktron) ve Event-driven(Olay tabanlı): browser

Node server-side ve client side için event driven ve asenkron bir yapı sunmaktadır. I/O işlemleri yaparken non-blocking yapısı vardır.

Async I/O: Mevcut işlem bitmeden diğer yapılmak istenilen işlemlerin halledilmesine olanak sağlar.

Browser üzerinde non-blocking yapı aşağıda gösterilmiştir. Belirtilen json dosyasından verileri okuma işlemi devam ederken farklı bir request yapabilmekteyiz. I/O işlemi event loop dışında gerçekleşmektedir. Veri okuma işlemi bitince callback fonksiyonu çağrılıp console.log ile veriler ekrana basılıyor.

nonblockingbrowser

Browser daha esnek bir yapıya kavuşuyor. Pek çok istek aynı anda işlenebiliyor.

2 – Asynchronous(Asenktron) ve Event-driven(Olay tabanlı): server

var result = query(“SELECT * FROM table”) syntax’a dikkat etmden bir db sorgusunu temsilen yazalım. Bu işlemi normal şekilde tanımlarsak, tüm veriler okunmadan diğer işlemler dikkate alınmayacaktır. Blocking I/O yapısı vardır.

Bu sorunu çözmek için multithread yapı kullanırsak, bir süre sonra multihreadleri kontrol etmek zorlaşabilir. (örn Apache). Thread sayısı arttıkça context switch işlemi artacaktır. Dolayısıyla ciddi bir performans kaybı yaşanacaktır.

Farklı bir çözüm olarak non-blocking yapı kullanıp aynı anda birçok request talebi işlersek daha esnek bir yapı oluşacaktır. (örn NGINX) Tek thread kullanmasına rağmen apache’ye göre daha hızlı şekilde istekleri değerlendirir.

nginx-apache-reqs-sec

Node içerisinde, I/O işlemleri her zaman event loop dışında gerçekleşmektedir. Server’ın esnek ve kullanışlı olmasını sağlar. (örnek nginx (3x daha hızlı) )

3 – DIRTy uygulamalar ( data intensive real time ) 

Server tarafında gerçekleşen değişikliklerin client tarafında sayfa yenilemeden anlık olarak gösteren uygulamalardır. Birden fazla istek aynı anda gerçekleştirilebilir. Node DIRTy uygulamaları desteklemektedir. Browser ve server arasında tutarlılık sağlanır.

İlk node.js yazısını kısa bir hello world örneği ile bitirelim. server.js adında dosya oluşturup aşağıdaki kodları yazalım.

Cmd ekranında ilgili klasöre gelip. “node server.js” yazıp serverı çalıştırırız.

Ardından browser üzerinden localhost:3000 adresini açarsak ekranda hello world yazısı gözükecektir.

Node.Js’e kısaca tanıtmış olduk. Daha detaylı öğrenmek isteyenler kaynakçada bulunan linklere bakabilirler. Özellikle kitapları ücretsiz olarak pdf biçiminde bulabiliyoruz.

Kaynakça

Advertisements

AngularJS Pagination

AngularJS kullanarak gösterilen verilerin sayfalanması işlemini yapıyor olacağız. Verileri tablo olarak veya card gösterimi ile sayfada gösteririz. Bu uygulamada verileri bootstrap card gösterimi ile sayfada göstermekteyim. Listelediğimiz verileri angularjs kullanarak sayfalayacağız.

pagination

Kod kısmı

Controller kısmında sayfalama için gerekli parametreleri tanımlıyoruz. Her sayfada 12 tane veri gösterilmesini ve mevcut sayfanın ilk sayfa olmasını ayarladık. Sayfalama kısmında geçiş yaptığımız kısımda sadece 5 tane link gösterilmesi için maxSize parametresini ekledik.

init içersinde factory’den verileri alıp customers dizisine yükledik. $scope.watch ile ‘currentpage + numberpage’ değişimini izlemekteyiz. Bunun sayesinde her sayfa geçişinde yani mevcut sayfaya her sayfada göstereceğimiz veri sayısını eklediğimiz zaman yeni sayfaya geçmiş bulunuyoruz. Her yeni sayfaya geçişte updateFilteredItems fonksiyonunu işleme koyuyoruz.

Bu fonksiyon ile başlangıç ve bitiş değerleri belirtip her sayfa için gösterilecek verileri customers dizisinden slice kullanarak filtreliyoruz. Veriler artık filteredCustomers dizisi içinde bulunmaktadır.

controller

Tanımladığımız SimpleFactory içersinden verileri almaktayız. Gerçek uygulamalarda verileri veritabanından çekeriz. Bu uygulama için kullandığım 100 tane veriyi customers dizisi içerisinde obje formatında tanımladım. Getcustomers ile tüm verileri döndürmekteyiz. Contoller kısmında SimpleFactory.getCustomers() ile çağırmaktayız.

factorypagi

Bootstrap card block kullanmaktayız. Detaylı bilgi için

ng-repeat ile filtrelenmiş verileri listelemekteyiz.

htmlpagi2

Html kısmında; eğer customers dizisinde hiç veri yoksa veri bulunamadı kısmını göstermektedir. Dizide veri varsa sayfalama kısmını gösteriyor. uib-pagination, angular ui-bootstrap ile kullanılan özelliktir. Detaylı kullanım için

htmlpagi

Plunker

PDO (Php data objects)

Eskiden veritabanı işlemleri için kullandığımız mysql_connect vb fonksiyonların artık yavaş yavaş devri kapanıyor.Onun yerine kullanmamız için PDO veya MySQLi fonksiyonları tavsiye edilmektedir.Burada PDO hakkında kısa bilgi ve nasıl kullanıldığına dair bu makale yazıyorum.

PDO nedir ? 

Temelinde “object oriented programming” arayüzüne sahiptir.Birçok veritabanı türünü destekler örnek vermek gerekirse ;

  • PostgreSQL
  • MySQL
  • Oracle
  • SQLite

Nasıl aktif edilir ?

Öncelikle sürücü desteğini php.ini dosyasında bularak önlerinde ; işaretlerini kaldırmamız gerekiyor.Aşağıdaki dosyaları php.ini içerisinde aratıp önlerinde bulunan ; işaretini kaldırmalıyız.

  • extension=php_pdo.dll
  • extension=php_pdo_mysql.dll
  • extension=php_pdo_sqlite.dll

Nasıl veritabanı bağlantısı yapılır ?

$dsn = 'mysql:host=localhost;dbname=test';
$user = 'root';
$password = '123456';
 
try {
 $db = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
 echo 'Bağlantı hatası: ' . $e->getMessage();
}

Benim araştırırken gördüğüm ve kullanırken tercih ettiğim kullanım şu şekildedir.Bu tanımlama ile veritabanı bağlantısını yaparız.Try catch içinde kullanmak kullanışlıdır çünkü hata oluştuğunda catch ile hata mesajını döndürürüz.Eğer bağlantı için port adresi istenirse $dsn = ‘mysql:host=localhost;port=2302;dbname=test’ diye tanımlama yaparız.Varsayılan post adresi 3306’dır.

$db = new PDO($dsn, $user, $password,
 array(
 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8',
 PDO::ATTR_ERRMODE => PDO:ERRMODE_EXCEPTION
));

Sorgularda prepare() metodunun önemiBağlantı satırımda veritabanı ile ilgili özellikleri array tanımlaması yaparak böyle belirttim.Ayrıca başka yerde de set names utf8 tanımlaması yapılabilmektedir.Kodun geri kalan kısmı ilk gösterdiğim kullanım ile aynıdır.

PDO kullanırken prepare() metodu ile çalıştırılmak üzere bir SQL deyimi hazırlar.Metot bind_param(),execute(),bindColumn(),bindValue() metotları ile birlikte çalışır.Avantajları ;

  • SQL sorgusunu bir kez yorumlar ve birçok kez çalıştırma imkanı sağlar.
  • Yapısında temizleyici bulunur.Dolayısıyla SQL injection önlenir.
  • Daha hızlıdır.

prepare() kullanımı

PDO ile veritabanı bağlantısı yaptıktan sonra sorgu işlemlerine geçebiliriz.

$dsn = 'mysql:host=localhost;dbname=test';
$user = 'root';
$password = '123456';
 
try {
 $db = new PDO($dsn, $user, $password,array(
 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8',
 PDO:ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
 ));
 $sonuc = $db->prepare("INSERT INTO uye VALUES(?,?,?)");
 $sonuc->bindParam(1,$_POST['ad'],PDO::PARAM_STR);
 $sonuc->bindParam(1,$_POST['sifre'],PDO::PARAM_INT);
 $sonuc->bindParam(1,$_POST['email'],PDO::PARAM_STR);
 echo ($sonuc == TRUE) ? 'Kayıt Başarılı' : "Kayıtta hata oluştu.";
 $sonuc->execute();
 $db = null;
} catch (PDOException $e) {
 echo 'Hata oluştu: ' . $e->getMessage();
}


PDO ile sorguları geri alabiliyoruz nasıl mı ?
Şeklinde kayıt işlemini gerçekleştiririz.SQL ile yapılabilecek select,update,delete gibi fonksiyonlarıda bu şekilde yapabiliriz.

Öncelikle $db->beginTransaction(); metodunu çağırarak geri alma işlemi yapabileceğimiz sorguları yazmaya başlarız.Bu komuttan sonra yazacağımız select,insert,update,delete gibi komutlar normal şekilde çalışmaktadır.Eğer herhangi zamanda geri alma işlemi yapmak istiyorsak $db->rollback() metodunu çağırarak bu komuta kadar olan işlemleri geri almış oluruz.DELETE sorgusu ve UPDATE sorugusu ile yaptığımız işlemleri geri alabilmekteyiz.Bu işlemleri çalışması için en sonra $db->commit() metodunu çağırarak işlemlerimizi tamamlamış oluruz.

$db->beginTransaction();//başlatma metodu
$db->prepare('DELETE FROM uyeler WHERE uye_id = '52'');
$sonuc = $db->execute();
if($sonuc == FALSE){
   $db->rollBack();//işlemler geri alındı.
   echo "hata oluştu.işlemler geri alındı";
}else {
   $db->commit();
}

İlk yazımı burada noktalıyorum.Eğer yazıda herhangi bir hata görürseniz veya yazıya eklenmesi gereken bilgi varsa lütfen yorum atarak belirtiniz.PDO ile ilgili yeni güzel özellikler görürsem ekleme çıkarma yapmaya çalışacağım.

Yazıyı yazarken faydalandığım kaynaklar: